ЦИТК-791 - Выполнение работ по ТОиР #7
@ -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 = () => {
|
const EqsPrfrm = () => {
|
||||||
|
//Собственное состояние - таблица данных
|
||||||
|
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 <div>Выполнение работ ТОиР</div>;
|
return (
|
||||||
|
<div>
|
||||||
|
{getYearArray()}
|
||||||
|
<Dialog open={filterOpen} onClose={closeFilter}>
|
||||||
|
<DialogTitle>Фильтр отбора</DialogTitle>
|
||||||
|
<IconButton
|
||||||
|
aria-label="close"
|
||||||
|
onClick={closeFilter}
|
||||||
|
sx={{
|
||||||
|
position: 'absolute',
|
||||||
|
right: 8,
|
||||||
|
top: 8,
|
||||||
|
color: (theme) => theme.palette.grey[500],
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Icon>close</Icon>
|
||||||
|
</IconButton>
|
||||||
|
<DialogContent>
|
||||||
|
<Paper>
|
||||||
|
<Box component="section" sx = {{p: 1 }}>
|
||||||
|
<FormControl readOnly fullWidth variant="outlined">
|
||||||
|
<InputLabel htmlFor="belong-outlined">Принадлежность</InputLabel>
|
||||||
|
<OutlinedInput
|
||||||
|
error={filter.belong ? false : true}
|
||||||
|
id="belong-outlined"
|
||||||
|
value={filter.belong}
|
||||||
|
endAdornment={
|
||||||
|
<InputAdornment position="end">
|
||||||
|
<IconButton
|
||||||
|
aria-label="belong select"
|
||||||
|
onClick={() => {
|
||||||
|
pOnlineShowDictionary({
|
||||||
|
unitCode: "JuridicalPersons",
|
||||||
|
callBack: res => (res.success === true ? setFilter(pv => ({...pv, belong: res.outParameters.out_CODE})) : null)
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
edge="end"
|
||||||
|
>
|
||||||
|
<Icon>list</Icon>
|
||||||
|
</IconButton>
|
||||||
|
</InputAdornment>
|
||||||
|
}
|
||||||
|
aria-describedby="belong-outlined-helper-text"
|
||||||
|
label="Принадлежность"
|
||||||
|
/>
|
||||||
|
<Grid container>
|
||||||
|
<Grid item xs={6}>
|
||||||
|
{filter.belong ? null : <FormHelperText id="belong-outlined-helper-text" sx={{color: "red"}}>*Обязательное поле</FormHelperText>}
|
||||||
|
</Grid>
|
||||||
|
<Grid item xs={6} sx={{textAlign: "end"}}>
|
||||||
|
<Link component="button"
|
||||||
|
variant="body2"
|
||||||
|
id="belong-outlined-link-btn"
|
||||||
|
sx={{fontSize: "0.75rem", marginRight: "35px"}}
|
||||||
|
onClick={getJurPers}
|
||||||
|
>
|
||||||
|
Значение по умолчанию
|
||||||
|
</Link>
|
||||||
|
</Grid>
|
||||||
|
</Grid>
|
||||||
|
</FormControl>
|
||||||
|
</Box>
|
||||||
|
<Box component="section" sx = {{p: 1 }}>
|
||||||
|
<FormControl readOnly fullWidth>
|
||||||
|
<InputLabel htmlFor="prodObj-outlined">Производственный объект</InputLabel>
|
||||||
|
<OutlinedInput
|
||||||
|
error={filter.prodObj ? false : true}
|
||||||
|
id="prodObj-outlined"
|
||||||
|
value={filter.prodObj}
|
||||||
|
endAdornment={
|
||||||
|
<InputAdornment position="end">
|
||||||
|
<IconButton
|
||||||
|
aria-label="prodObj select"
|
||||||
|
onClick={() => {
|
||||||
|
pOnlineShowDictionary({
|
||||||
|
unitCode: "EquipConfiguration",
|
||||||
|
callBack: res =>
|
||||||
|
res.success === true ? setFilter(pv => ({...pv, prodObj: res.outParameters.out_CODE})) : null
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
edge="end"
|
||||||
|
>
|
||||||
|
<Icon>list</Icon>
|
||||||
|
</IconButton>
|
||||||
|
</InputAdornment>
|
||||||
|
}
|
||||||
|
aria-describedby="prodObj-outlined-helper-text"
|
||||||
|
label="Производственный объект"
|
||||||
|
/>
|
||||||
|
{filter.prodObj ? null : <FormHelperText id="prodObj-outlined-helper-text" sx={{color: "red"}}>*Обязательное поле</FormHelperText>}
|
||||||
|
</FormControl>
|
||||||
|
</Box>
|
||||||
|
<Box component="section" sx = {{p: 1 }}>
|
||||||
|
<FormControl readOnly fullWidth>
|
||||||
|
<InputLabel htmlFor="techServ-outlined">Техническая служба</InputLabel>
|
||||||
|
<OutlinedInput
|
||||||
|
id="techServ-outlined"
|
||||||
|
value={filter.techServ}
|
||||||
|
endAdornment={
|
||||||
|
<InputAdornment position="end">
|
||||||
|
<IconButton
|
||||||
|
aria-label="techServ select"
|
||||||
|
onClick={() => {
|
||||||
|
pOnlineShowDictionary({
|
||||||
|
unitCode: "INS_DEPARTMENT",
|
||||||
|
callBack: res =>
|
||||||
|
res.success === true ? setFilter(pv => ({...pv, techServ: res.outParameters.out_CODE})) : null
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
edge="end"
|
||||||
|
>
|
||||||
|
<Icon>list</Icon>
|
||||||
|
</IconButton>
|
||||||
|
</InputAdornment>
|
||||||
|
}
|
||||||
|
label="Техническая служба"
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
</Box>
|
||||||
|
<Box component="section" sx = {{p: 1 }}>
|
||||||
|
<FormControl readOnly fullWidth>
|
||||||
|
<InputLabel htmlFor="respDep-outlined">Ответственное подразделение</InputLabel>
|
||||||
|
<OutlinedInput
|
||||||
|
id="respDep-outlined"
|
||||||
|
value={filter.respDep}
|
||||||
|
endAdornment={
|
||||||
|
<InputAdornment position="end">
|
||||||
|
<IconButton
|
||||||
|
aria-label="respDep select"
|
||||||
|
onClick={() => {
|
||||||
|
pOnlineShowDictionary({
|
||||||
|
unitCode: "INS_DEPARTMENT",
|
||||||
|
callBack: res =>
|
||||||
|
res.success === true ? setFilter(pv => ({...pv, respDep: res.outParameters.out_CODE})) : null
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
edge="end"
|
||||||
|
>
|
||||||
|
<Icon>list</Icon>
|
||||||
|
</IconButton>
|
||||||
|
</InputAdornment>
|
||||||
|
}
|
||||||
|
label="Ответственное подразделение"
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
</Box>
|
||||||
|
<Box component="section" sx = {{p: 1 }}>
|
||||||
|
<Grid container spacing={2}>
|
||||||
|
<Grid textAlign={"center"} item xs={4}>
|
||||||
|
Начало периода:
|
||||||
|
</Grid>
|
||||||
|
<Grid item xs={4}>
|
||||||
|
<FormControl fullWidth>
|
||||||
|
<InputLabel id="from-month-select-label">Месяц</InputLabel>
|
||||||
|
<Select
|
||||||
|
error={filter.fromMonth ? false : true}
|
||||||
|
labelId="from-month-select-label"
|
||||||
|
id="from-month-select"
|
||||||
|
value={filter.fromMonth}
|
||||||
|
aria-describedby="from-month-select-helper-text"
|
||||||
|
label="Месяц"
|
||||||
|
onChange={e => setFilter(pv => ({ ...pv, fromMonth: e.target.value }))}
|
||||||
|
>
|
||||||
|
{monthArray.map((item, i) => (
|
||||||
|
<MenuItem key={i + 1} value={i + 1}>
|
||||||
|
{item}
|
||||||
|
</MenuItem>
|
||||||
|
))}
|
||||||
|
</Select>
|
||||||
|
{filter.fromMonth ? null : <FormHelperText id="from-month-select-helper-text" sx={{color: "red"}}>*Обязательное поле</FormHelperText>}
|
||||||
|
</FormControl>
|
||||||
|
</Grid>
|
||||||
|
<Grid item xs={4}>
|
||||||
|
<FormControl fullWidth>
|
||||||
|
<InputLabel id="from-year-select-label">Год</InputLabel>
|
||||||
|
<Select
|
||||||
|
error={filter.fromYear ? false : true}
|
||||||
|
labelId="from-year-select-label"
|
||||||
|
id="from-year-select"
|
||||||
|
value={filter.fromYear}
|
||||||
|
aria-describedby="from-year-select-helper-text"
|
||||||
|
label="Год"
|
||||||
|
onChange={e => setFilter(pv => ({ ...pv, fromYear: e.target.value }))}
|
||||||
|
>
|
||||||
|
{yearArray.map((item, i) => (
|
||||||
|
<MenuItem key={i} value={item}>
|
||||||
|
{item}
|
||||||
|
</MenuItem>
|
||||||
|
))}
|
||||||
|
</Select>
|
||||||
|
{filter.fromYear ? null : <FormHelperText id="from-year-select-helper-text" sx={{color: "red"}}>*Обязательное поле</FormHelperText>}
|
||||||
|
</FormControl>
|
||||||
|
</Grid>
|
||||||
|
</Grid>
|
||||||
|
</Box>
|
||||||
|
<Box component="section" sx = {{p: 1 }}>
|
||||||
|
<Grid container spacing={2}>
|
||||||
|
<Grid textAlign={"center"} item xs={4}>
|
||||||
|
Конец периода:
|
||||||
|
</Grid>
|
||||||
|
<Grid item xs={4}>
|
||||||
|
<FormControl fullWidth>
|
||||||
|
<InputLabel id="to-month-select-label">Месяц</InputLabel>
|
||||||
|
<Select
|
||||||
|
error={filter.toMonth ? false : true}
|
||||||
|
labelId="to-month-select-label"
|
||||||
|
id="to-month-select"
|
||||||
|
value={filter.toMonth}
|
||||||
|
aria-describedby="to-month-select-helper-text"
|
||||||
|
label="Месяц"
|
||||||
|
onChange={e => setFilter(pv => ({ ...pv, toMonth: e.target.value }))}
|
||||||
|
>
|
||||||
|
{monthArray.map((item, i) => (
|
||||||
|
<MenuItem key={i + 1} value={i + 1}>
|
||||||
|
{item}
|
||||||
|
</MenuItem>
|
||||||
|
))}
|
||||||
|
</Select>
|
||||||
|
{filter.toMonth ? null : <FormHelperText id="to-month-select-helper-text" sx={{color: "red"}}>*Обязательное поле</FormHelperText>}
|
||||||
|
</FormControl>
|
||||||
|
</Grid>
|
||||||
|
<Grid item xs={4}>
|
||||||
|
<FormControl fullWidth>
|
||||||
|
<InputLabel id="to-year-select-label">Год</InputLabel>
|
||||||
|
<Select
|
||||||
|
error={filter.toYear ? false : true}
|
||||||
|
labelId="to-year-select-label"
|
||||||
|
id="to-year-select"
|
||||||
|
value={filter.toYear}
|
||||||
|
aria-describedby="to-year-select-helper-text"
|
||||||
|
label="Год"
|
||||||
|
onChange={e => setFilter(pv => ({ ...pv, toYear: e.target.value }))}
|
||||||
|
>
|
||||||
|
{yearArray.map((item, i) => (
|
||||||
|
<MenuItem key={i} value={item}>
|
||||||
|
{item}
|
||||||
|
</MenuItem>
|
||||||
|
))}
|
||||||
|
</Select>
|
||||||
|
{filter.toYear ? null : <FormHelperText id="to-year-select-helper-text" sx={{color: "red"}}>*Обязательное поле</FormHelperText>}
|
||||||
|
</FormControl>
|
||||||
|
</Grid>
|
||||||
|
</Grid>
|
||||||
|
</Box>
|
||||||
|
</Paper>
|
||||||
|
</DialogContent>
|
||||||
|
<DialogActions>
|
||||||
|
<Button variant="contained" disabled={filter.belong && filter.prodObj && filter.fromMonth && filter.fromYear
|
||||||
|
&& filter.toMonth && filter.toYear ? false : true} onClick={() => { setFilterLock(true); setDataGrid({reload: true}); closeFilter(); }}>Сформировать отчёт</Button>
|
||||||
|
<Button variant="contained" onClick={clearFilter}>Очистить фильтр</Button>
|
||||||
|
<Button variant="contained" onClick={() => {setFilter(filterCopy)}}>Отменить изменения</Button>
|
||||||
|
</DialogActions>
|
||||||
|
</Dialog>
|
||||||
|
<Link component="button" variant="body2" textAlign={"left"} onClick={openFilter}>
|
||||||
|
Фильтр отбора: {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}` : ""}
|
||||||
|
</Link>
|
||||||
|
{dataGrid.dataLoaded ? (
|
||||||
|
<Paper variant="outlined">
|
||||||
|
<Grid container spacing={1}>
|
||||||
|
<Grid item xs={12}>
|
||||||
|
<Box p={1}>
|
||||||
|
<P8PDataGrid
|
||||||
|
{...P8P_DATA_GRID_CONFIG_PROPS}
|
||||||
|
columnsDef={dataGrid.columnsDef}
|
||||||
|
groups={dataGrid.groups}
|
||||||
|
rows={dataGrid.rows}
|
||||||
|
size={P8P_DATA_GRID_SIZE.LARGE}
|
||||||
|
reloading={dataGrid.reload}
|
||||||
|
headCellRender={prms => headCellRender({ ...prms },
|
||||||
|
filter.techServ,
|
||||||
|
info.cntP,
|
||||||
|
info.sumP,
|
||||||
|
info.cntF,
|
||||||
|
info.sumF)}
|
||||||
|
dataCellRender={prms => dataCellRender({ ...prms })}
|
||||||
|
groupCellRender={prms => groupCellRender({ ...prms })}
|
||||||
|
showCellRightBorder={true}
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
</Grid>
|
||||||
|
</Grid>
|
||||||
|
</Paper>
|
||||||
|
) : null}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
//----------------
|
//----------------
|
||||||
|
173
app/panels/eqs_prfrm/layouts.js
Normal file
173
app/panels/eqs_prfrm/layouts.js
Normal file
@ -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 = <Stack sx={{ justifyContent: "center" }} direction="row" width={300}>
|
||||||
|
<Grid container>
|
||||||
|
<Grid item xs={4}>
|
||||||
|
Подразделение:
|
||||||
|
</Grid>
|
||||||
|
<Grid item xs={8}>
|
||||||
|
{podr}
|
||||||
|
</Grid>
|
||||||
|
<Grid item xs={4}>
|
||||||
|
Кол-во ремонтов, план:
|
||||||
|
</Grid>
|
||||||
|
<Grid item xs={2}>
|
||||||
|
{cntP}
|
||||||
|
</Grid>
|
||||||
|
<Grid item xs={4}>
|
||||||
|
Трудоемкость, час. план:
|
||||||
|
</Grid>
|
||||||
|
<Grid item xs={2}>
|
||||||
|
{sumP}
|
||||||
|
</Grid>
|
||||||
|
<Grid item xs={4}>
|
||||||
|
Кол-во ремонтов, факт:
|
||||||
|
</Grid>
|
||||||
|
<Grid item xs={2}>
|
||||||
|
{cntF}
|
||||||
|
</Grid>
|
||||||
|
<Grid item xs={4}>
|
||||||
|
Трудоемкость, час. факт:
|
||||||
|
</Grid>
|
||||||
|
<Grid item xs={2}>
|
||||||
|
{sumF}
|
||||||
|
</Grid>
|
||||||
|
</Grid>
|
||||||
|
</Stack>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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 =
|
||||||
|
<Stack sx={{ justifyContent: "center" }} direction="row">
|
||||||
|
<Grid container maxHeight="100%">
|
||||||
|
<Grid item xs={6} sx={{backgroundColor: "lawngreen"}}>
|
||||||
|
<p style={{display: "none"}}>g</p>
|
||||||
|
</Grid>
|
||||||
|
<Grid item xs={6} sx={{backgroundColor: "crimson"}}>
|
||||||
|
<p style={{display: "none"}}>r</p>
|
||||||
|
</Grid>
|
||||||
|
</Grid>
|
||||||
|
</Stack>
|
||||||
|
}
|
||||||
|
return { cellStyle, cellProps };
|
||||||
|
};
|
||||||
|
|
||||||
|
export const groupCellRender = () => {
|
||||||
|
let cellStyle = { display: "none" };
|
||||||
|
return { cellStyle };
|
||||||
|
};
|
602
db/PKG_P8PANELS_EQUIPSRV.pck
Normal file
602
db/PKG_P8PANELS_EQUIPSRV.pck
Normal file
@ -0,0 +1,602 @@
|
|||||||
|
create or replace package PKG_P8PANELS_EQUIPSRV as
|
||||||
|
|
||||||
|
/* Получение значения системного параметра "JuridicalPerson" */
|
||||||
|
procedure GET_JUR_PERS_PRM
|
||||||
|
(
|
||||||
|
CRES out clob -- Значение параметра "JuridicalPerson" (null - если не нашли)
|
||||||
|
);
|
||||||
|
|
||||||
|
function HOURS_STR
|
||||||
|
(
|
||||||
|
NHOURS in number -- Кол-во часов
|
||||||
|
) return varchar2;
|
||||||
|
|
||||||
|
/* Выполнение работ по ТОиР */
|
||||||
|
procedure EQUIPSRV_GRID
|
||||||
|
(
|
||||||
|
SBELONG in varchar2, -- Принадлежность к Юр. лицу
|
||||||
|
SPRODOBJ in varchar2, -- Производственный объект
|
||||||
|
STECHSERV in varchar2, -- Техническая служба
|
||||||
|
SRESPDEP in varchar2, -- Ответственное подразделение
|
||||||
|
NFROMMONTH in number, -- Месяц начала периода
|
||||||
|
NFROMYEAR in number, -- Год начала периода
|
||||||
|
NTOMONTH in number, -- Месяц окончания периода
|
||||||
|
NTOYEAR in number, -- Год окончания периода
|
||||||
|
COUT out clob -- График проектов
|
||||||
|
);
|
||||||
|
end PKG_P8PANELS_EQUIPSRV;
|
||||||
|
/
|
||||||
|
create or replace package body PKG_P8PANELS_EQUIPSRV as
|
||||||
|
|
||||||
|
/* Получение значения системного параметра "JuridicalPerson" */
|
||||||
|
procedure GET_JUR_PERS_PRM
|
||||||
|
(
|
||||||
|
CRES out clob -- Значение параметра "JuridicalPerson" (null - если не нашли)
|
||||||
|
)
|
||||||
|
is
|
||||||
|
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
|
||||||
|
SPARAMCODE PKG_STD.TSTRING := 'JuridicalPerson'; -- Код параметра
|
||||||
|
begin
|
||||||
|
CRES := GET_OPTIONS_STR(SCODE => SPARAMCODE,
|
||||||
|
NCOMP_VERS => NCOMPANY);
|
||||||
|
if (CRES is null) then
|
||||||
|
P_EXCEPTION(0, 'Пользовательский параметр не указан.');
|
||||||
|
end if;
|
||||||
|
end GET_JUR_PERS_PRM;
|
||||||
|
|
||||||
|
/* Формирование строки с кол-вом часов */
|
||||||
|
function HOURS_STR
|
||||||
|
(
|
||||||
|
NHOURS in number -- Кол-во часов
|
||||||
|
) return varchar2 -- Строка с кол-вом часов
|
||||||
|
is
|
||||||
|
SRESULT PKG_STD.tSTRING; -- Строка результат
|
||||||
|
begin
|
||||||
|
if (MOD(NHOURS, 10) = 1 and MOD(NHOURS, 100) != 11) then
|
||||||
|
SRESULT := NHOURS || ' час';
|
||||||
|
elsif ((MOD(NHOURS, 10) = 2 and MOD(NHOURS, 100) != 12)
|
||||||
|
or (MOD(NHOURS, 10) = 3 and MOD(NHOURS, 100) != 13)
|
||||||
|
or (MOD(NHOURS, 10) = 4 and MOD(NHOURS, 100) != 14)) then
|
||||||
|
SRESULT := NHOURS || ' часа';
|
||||||
|
else
|
||||||
|
SRESULT := NHOURS || ' часов';
|
||||||
|
end if;
|
||||||
|
/* Возвращаем результат */
|
||||||
|
return SRESULT;
|
||||||
|
end HOURS_STR;
|
||||||
|
|
||||||
|
/* Выполнение работ по ТОиР */
|
||||||
|
procedure EQUIPSRV_GRID
|
||||||
|
(
|
||||||
|
SBELONG in varchar2, -- Принадлежность к Юр. лицу
|
||||||
|
SPRODOBJ in varchar2, -- Производственный объект
|
||||||
|
STECHSERV in varchar2, -- Техническая служба
|
||||||
|
SRESPDEP in varchar2, -- Ответственное подразделение
|
||||||
|
NFROMMONTH in number, -- Месяц начала периода
|
||||||
|
NFROMYEAR in number, -- Год начала периода
|
||||||
|
NTOMONTH in number, -- Месяц окончания периода
|
||||||
|
NTOYEAR in number, -- Год окончания периода
|
||||||
|
COUT out clob -- График проектов
|
||||||
|
)
|
||||||
|
is
|
||||||
|
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
|
||||||
|
SPRJ_GROUP_NAME PKG_STD.TSTRING; -- Наименование группы для проекта
|
||||||
|
BEXPANDED boolean; -- Флаг раскрытости уровня
|
||||||
|
RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
|
||||||
|
RDG_ROW0 PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы0
|
||||||
|
RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
|
||||||
|
RDG_ROW2 PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы2
|
||||||
|
NCURYEAR PKG_STD.tNUMBER; -- Текущий год
|
||||||
|
NCURMONTH PKG_STD.tNUMBER; -- Текущий месяц
|
||||||
|
NTOTALDAYS PKG_STD.tNUMBER; -- Дней в текущем месяце
|
||||||
|
SCURTECHOBJ PKG_STD.TSTRING := null; -- Текущий технический объект
|
||||||
|
SCURTSKCODE PKG_STD.TSTRING := null; -- Текущий вид ремонта
|
||||||
|
NFROMDATE date := TO_DATE('01.'
|
||||||
|
|| LPAD(TO_CHAR(NFROMMONTH), 2, '0')
|
||||||
|
|| '.' || TO_CHAR(NFROMYEAR),
|
||||||
|
'dd.mm.yyyy'); -- Дата начала периода
|
||||||
|
NTODATE date := LAST_DAY(TO_DATE('01.'
|
||||||
|
|| LPAD(TO_CHAR(NTOMONTH), 2, '0')
|
||||||
|
|| '.' || TO_CHAR(NTOYEAR),
|
||||||
|
'dd.mm.yyyy')); -- Дата конца периода
|
||||||
|
NMS PKG_STD.tNUMBER; -- Месяц начала в цикле года
|
||||||
|
NME PKG_STD.tNUMBER; -- Месяц окончания в цикле года
|
||||||
|
NYEAR_PLAN PKG_STD.tNUMBER; -- Год план
|
||||||
|
NMONTH_PLAN PKG_STD.tNUMBER; -- Месяц план
|
||||||
|
NDAY_PLAN PKG_STD.tNUMBER; -- День план
|
||||||
|
NYEAR_FACT PKG_STD.tNUMBER; -- Год факт
|
||||||
|
NMONTH_FACT PKG_STD.tNUMBER; -- Месяц факт
|
||||||
|
NDAY_FACT PKG_STD.tNUMBER; -- День факт
|
||||||
|
SPERIODNAME PKG_STD.TSTRING; -- Имя периода
|
||||||
|
SFACT_CLR PKG_STD.TSTRING; -- Цвет закрашивания фактических дат
|
||||||
|
NROWS PKG_STD.tNUMBER := 0; -- Кол-во строк в курсоре
|
||||||
|
NWORKPERDAY PKG_STD.tNUMBER(17,2) := null; -- Работы в день
|
||||||
|
CR PKG_STD.TSTRING;
|
||||||
|
SGROUP_FILLED PKG_STD.tLSTRING; -- Группы, заполненные строками план/факт
|
||||||
|
SCOLS PKG_STD.tLSTRING; -- Заполнение периодов работ
|
||||||
|
YM PKG_CONTVALLOC1S.tCONTAINER; -- Коллекция для подсчёта работ за месяц
|
||||||
|
MCLR PKG_CONTVALLOC1S.tCONTAINER; -- Коллекция для закрашивания месяцев
|
||||||
|
|
||||||
|
cursor C1 is
|
||||||
|
select TT.NEQV_RN,
|
||||||
|
TT.NEQS_RN,
|
||||||
|
TT.NWRK_RN NRN,
|
||||||
|
TT.COMPANY NCOMPANY,
|
||||||
|
TT.NAME_WORK SWORKNAME,
|
||||||
|
EC2.CODE STECHOBJCODE,
|
||||||
|
EC2.NAME STECHOBJNAME,
|
||||||
|
JP.CODE SBELONG,
|
||||||
|
EC1.CODE SPRODOBJ,
|
||||||
|
DS.CODE STECHSERV,
|
||||||
|
DR.CODE SRESPDEP,
|
||||||
|
TT.DATEPRD_BEG DDATEPLANBEG,
|
||||||
|
TT.DATEPRD_END DDATEPLANEND,
|
||||||
|
EQJ.DATEFACT_BEG DDATEFACTBEG,
|
||||||
|
EQJ.DATEFACT_END DDATEFACTEND,
|
||||||
|
EK.CODE STECSRVKINDCODE,
|
||||||
|
EK.NAME STECSRVKINDNAME,
|
||||||
|
coalesce(EW.NSUM,
|
||||||
|
(TT.DATEPRD_END - TT.DATEPRD_BEG) * 24) NSUMWORKPLAN,
|
||||||
|
coalesce(EWJ.NSUMF,
|
||||||
|
(EQJ.DATEFACT_END - EQJ.DATEFACT_BEG) * 24) NSUMWORKFACT
|
||||||
|
from
|
||||||
|
(select B.*,
|
||||||
|
C.RN nWRK_RN,
|
||||||
|
C.PRN nWRK_PRN,
|
||||||
|
C.NAME_WORK,
|
||||||
|
C.DATEPLAN_BEG,
|
||||||
|
C.DATEPLAN_END,
|
||||||
|
C.TECSRVKIND,
|
||||||
|
C.EQCONFIG,
|
||||||
|
C.DEPTPERF,
|
||||||
|
C.DEPTTCSRV,
|
||||||
|
C.RESP_AGN
|
||||||
|
from (select EQV.RN nEQV_RN,
|
||||||
|
EQV.COMPANY,
|
||||||
|
EQV.JUR_PERS,
|
||||||
|
EQV.STATE,
|
||||||
|
EQV.DATEPRD_BEG,
|
||||||
|
EQV.DATEPRD_END,
|
||||||
|
EQS.RN nEQS_RN
|
||||||
|
from EQTCHSRV EQV, -- Графики ТОиР
|
||||||
|
DOCLINKS DL,
|
||||||
|
EQRPSHEETS EQS -- Ремонтные ведомости
|
||||||
|
where EQV.RN = DL.IN_DOCUMENT (+)
|
||||||
|
and DL.OUT_UNITCODE (+) = 'EquipRepairSheets'
|
||||||
|
and DL.OUT_DOCUMENT = EQS.RN (+)) B,
|
||||||
|
EQTCHSRWRK C
|
||||||
|
where B.nEQV_RN = C.PRN (+)
|
||||||
|
union all
|
||||||
|
select B.*,
|
||||||
|
C.RN nWRK_RN,
|
||||||
|
C.PRN nWRK_PRN,
|
||||||
|
C.NAME_WORK,
|
||||||
|
C.DATEPLAN_BEG,
|
||||||
|
C.DATEPLAN_END,
|
||||||
|
C.TECSRVKIND,
|
||||||
|
C.EQCONFIG,
|
||||||
|
C.DEPTPERF,
|
||||||
|
null DEPTTCSRV,
|
||||||
|
C.RESP_AGN
|
||||||
|
from (select null nEQV_RN,
|
||||||
|
EQS.COMPANY,
|
||||||
|
EQS.JURPERSONS JUR_PERS,
|
||||||
|
EQS.STATE,
|
||||||
|
EQS.DATEPLAN_BEG,
|
||||||
|
EQS.DATEPLAN_END,
|
||||||
|
EQS.RN nEQS_RN
|
||||||
|
from EQRPSHEETS EQS -- Ремонтные ведомости
|
||||||
|
where not exists (select 1
|
||||||
|
from DOCLINKS DL
|
||||||
|
where DL.OUT_DOCUMENT = EQS.RN
|
||||||
|
and DL.IN_UNITCODE = 'EquipTechServices')) B,
|
||||||
|
EQRPSHWRK C
|
||||||
|
where B.nEQS_RN = C.PRN (+)) TT,
|
||||||
|
EQTECSRVKIND EK,
|
||||||
|
JURPERSONS JP,
|
||||||
|
EQCONFIG EC1,
|
||||||
|
EQCONFIG EC2,
|
||||||
|
INS_DEPARTMENT DS,
|
||||||
|
INS_DEPARTMENT DR,
|
||||||
|
DOCLINKS DL,
|
||||||
|
EQTECSRVJRNL EQJ,
|
||||||
|
(select t.prn,
|
||||||
|
sum(t.Worktimeplan * t.perform_quant) NSUM
|
||||||
|
from EQTCHSRWRC t
|
||||||
|
group by t.prn) EW,
|
||||||
|
(select t.prn,
|
||||||
|
sum(t.worktimefact * t.quantfact) NSUMF
|
||||||
|
from EQTCHSRJRNLWRC t
|
||||||
|
group by t.prn) EWJ
|
||||||
|
where TT.COMPANY = NCOMPANY
|
||||||
|
and ((TT.state in (1,2) and nEQV_RN is not null) or (TT.state in (0,2,3) and nEQV_RN is null))
|
||||||
|
and TT.DATEPRD_BEG >= NFROMDATE
|
||||||
|
and TT.DATEPRD_END <= NTODATE
|
||||||
|
and JP.CODE = SBELONG
|
||||||
|
and EC1.CODE = SPRODOBJ
|
||||||
|
and (DS.CODE = STECHSERV or STECHSERV is null)
|
||||||
|
and (DR.CODE = SRESPDEP or SRESPDEP is null)
|
||||||
|
and TT.EQCONFIG = EC2.RN (+)
|
||||||
|
and TT.DEPTPERF = DR.RN (+)
|
||||||
|
and TT.DEPTTCSRV = DS.RN (+)
|
||||||
|
and TT.NWRK_RN = EW.PRN (+)
|
||||||
|
and EQJ.RN = EWJ.PRN (+)
|
||||||
|
and TT.TECSRVKIND = EK.RN (+)
|
||||||
|
and TT.NWRK_RN = DL.IN_DOCUMENT (+)
|
||||||
|
and ((DL.OUT_UNITCODE = 'EquipTechServiceJournal' and DL.RN is not null) or (DL.OUT_UNITCODE is null and DL.RN is null))
|
||||||
|
and DL.OUT_DOCUMENT = EQJ.RN (+)
|
||||||
|
order by EC2.NAME, EK.CODE;
|
||||||
|
begin
|
||||||
|
/* Инициализируем таблицу данных */
|
||||||
|
RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
|
||||||
|
/* Формируем структуру заголовка */
|
||||||
|
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
|
||||||
|
SNAME => 'STEST',
|
||||||
|
SCAPTION => 'ТЕСТ',
|
||||||
|
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR);
|
||||||
|
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
|
||||||
|
SNAME => 'SINFO',
|
||||||
|
SCAPTION => 'Информация',
|
||||||
|
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR);
|
||||||
|
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
|
||||||
|
SNAME => 'SINFO2',
|
||||||
|
SCAPTION => 'Объект ремонта',
|
||||||
|
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
|
||||||
|
SPARENT => 'SINFO');
|
||||||
|
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_CONTVALLOC1S.PURGE(YM);
|
||||||
|
PKG_CONTVALLOC1S.PURGE(MCLR);
|
||||||
|
|
||||||
|
NCURYEAR := EXTRACT(year from sysdate);
|
||||||
|
NCURMONTH := EXTRACT(month from sysdate);
|
||||||
|
|
||||||
|
/* Цикл по годам периода */
|
||||||
|
for Y in NFROMYEAR .. NTOYEAR
|
||||||
|
loop
|
||||||
|
if (NFROMYEAR = NTOYEAR) then
|
||||||
|
NMS := NFROMMONTH;
|
||||||
|
NME := NTOMONTH;
|
||||||
|
else
|
||||||
|
if (Y = NFROMYEAR) then
|
||||||
|
NMS := NFROMMONTH;
|
||||||
|
NME := 12;
|
||||||
|
elsif (NFROMYEAR < Y and Y < NTOYEAR) then
|
||||||
|
NMS := 1;
|
||||||
|
NME := 12;
|
||||||
|
elsif (Y = NTOYEAR) then
|
||||||
|
NMS := 1;
|
||||||
|
NME := NTOMONTH;
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
/* Цикл по месяцам года */
|
||||||
|
for M in NMS .. NME
|
||||||
|
loop
|
||||||
|
|
||||||
|
PKG_CONTVALLOC1S.PUTN(YM, '_' || TO_CHAR(Y) || '_' || TO_CHAR(M) || '_P', 0);
|
||||||
|
PKG_CONTVALLOC1S.PUTN(YM, '_' || TO_CHAR(Y) || '_' || TO_CHAR(M) || '_F', 0);
|
||||||
|
|
||||||
|
if (Y = NCURYEAR and M = NCURMONTH) then
|
||||||
|
BEXPANDED := true;
|
||||||
|
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);
|
||||||
|
NTOTALDAYS := to_number(to_char(LAST_DAY(TO_DATE('01.' || LPAD(TO_CHAR(M), 2, '0') || '.' || TO_CHAR(Y), 'dd.mm.yyyy')),'dd'), '99');
|
||||||
|
/* Цикл по дням месяца */
|
||||||
|
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));
|
||||||
|
end loop;
|
||||||
|
end loop;
|
||||||
|
end loop;
|
||||||
|
|
||||||
|
/* Подсчёт кол-ва записей в курсоре */
|
||||||
|
for Q1 in C1
|
||||||
|
loop
|
||||||
|
NROWS := NROWS + 1;
|
||||||
|
end loop;
|
||||||
|
|
||||||
|
/* Цикл по курсору */
|
||||||
|
for QQ in C1
|
||||||
|
loop
|
||||||
|
NROWS := NROWS - 1;
|
||||||
|
if (SCURTECHOBJ != QQ.STECHOBJNAME or SCURTECHOBJ is null) then
|
||||||
|
if (RDG_ROW0.RCOLS is not null) then
|
||||||
|
/* Цикл по годам периода */
|
||||||
|
for Y in NFROMYEAR .. NTOYEAR
|
||||||
|
loop
|
||||||
|
if (NFROMYEAR = NTOYEAR) then
|
||||||
|
NMS := NFROMMONTH;
|
||||||
|
NME := NTOMONTH;
|
||||||
|
else
|
||||||
|
if (Y = NFROMYEAR) then
|
||||||
|
NMS := NFROMMONTH;
|
||||||
|
NME := 12;
|
||||||
|
elsif (NFROMYEAR < Y and Y < NTOYEAR) then
|
||||||
|
NMS := 1;
|
||||||
|
NME := 12;
|
||||||
|
elsif (Y = NTOYEAR) then
|
||||||
|
NMS := 1;
|
||||||
|
NME := NTOMONTH;
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
/* Цикл по месяцам года */
|
||||||
|
for M in NMS .. NME
|
||||||
|
loop
|
||||||
|
SPERIODNAME := '_' || TO_CHAR(Y) || '_' || TO_CHAR(M);
|
||||||
|
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW0,
|
||||||
|
SNAME => SPERIODNAME,
|
||||||
|
SVALUE => 'план: ' || HOURS_STR(PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_P')) || ' факт: ' || HOURS_STR(PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_F')));
|
||||||
|
PKG_CONTVALLOC1S.PUTN(YM, SPERIODNAME || '_P', 0);
|
||||||
|
PKG_CONTVALLOC1S.PUTN(YM, SPERIODNAME || '_F', 0);
|
||||||
|
end loop;
|
||||||
|
end loop;
|
||||||
|
|
||||||
|
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW0);
|
||||||
|
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_ROW0 := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME);
|
||||||
|
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW0, SNAME => 'STEST', SVALUE => SCURTECHOBJ);
|
||||||
|
end if;
|
||||||
|
/* Формируем имя группы для вида ремонта */
|
||||||
|
SCURTSKCODE := SCURTECHOBJ || '_' || QQ.STECSRVKINDCODE;
|
||||||
|
/* Если по данной группе еще нет строк плана и факта */
|
||||||
|
if (STRIN(sSUBSTR => SCURTSKCODE, sSOURCE => SGROUP_FILLED, sDELIM => ';') = 0) then
|
||||||
|
/* Добавляем строку плана */
|
||||||
|
if (RDG_ROW.RCOLS is not null) then
|
||||||
|
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
|
||||||
|
end if;
|
||||||
|
/* Добавляем строку факта */
|
||||||
|
if (RDG_ROW2.RCOLS is not null) then
|
||||||
|
CR := PKG_CONTVALLOC1S.FIRST_(MCLR);
|
||||||
|
/* Цикл по коллекции для закрашивания месяцев */
|
||||||
|
for Z in 1 .. PKG_CONTVALLOC1S.COUNT_(MCLR)
|
||||||
|
loop
|
||||||
|
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW2, SNAME => CR, SVALUE => PKG_CONTVALLOC1S.GETS(MCLR, CR));
|
||||||
|
CR := PKG_CONTVALLOC1S.NEXT_(MCLR, CR);
|
||||||
|
end loop;
|
||||||
|
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW2);
|
||||||
|
end if;
|
||||||
|
PKG_CONTVALLOC1S.PURGE(MCLR);
|
||||||
|
/* Добвим группу для вида ремонта */
|
||||||
|
SPRJ_GROUP_NAME := SCURTSKCODE;
|
||||||
|
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_GROUP(RDATA_GRID => RDG,
|
||||||
|
SNAME => SPRJ_GROUP_NAME,
|
||||||
|
SCAPTION => QQ.STECSRVKINDCODE,
|
||||||
|
BEXPANDABLE => false);
|
||||||
|
RDG_ROW := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME);
|
||||||
|
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'STEST', SVALUE => QQ.STECSRVKINDCODE);
|
||||||
|
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SINFO2', SVALUE => 'План');
|
||||||
|
RDG_ROW2 := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME);
|
||||||
|
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW2, SNAME => 'SINFO2', SVALUE => 'Факт');
|
||||||
|
/* Добавляем в заполненные группы */
|
||||||
|
SGROUP_FILLED := SGROUP_FILLED || SPRJ_GROUP_NAME || ';';
|
||||||
|
|
||||||
|
end if;
|
||||||
|
/* Плановые работы */
|
||||||
|
if (QQ.NEQV_RN is not null) then
|
||||||
|
for x in 0 .. trunc(QQ.DDATEPLANEND) - trunc(QQ.DDATEPLANBEG)
|
||||||
|
loop
|
||||||
|
NYEAR_PLAN := EXTRACT(year from QQ.DDATEPLANBEG + x);
|
||||||
|
NMONTH_PLAN := EXTRACT(month from QQ.DDATEPLANBEG + x);
|
||||||
|
NDAY_PLAN := EXTRACT(day from QQ.DDATEPLANBEG + x);
|
||||||
|
|
||||||
|
if (x = 0) then
|
||||||
|
SPERIODNAME := '_' || TO_CHAR(NYEAR_PLAN) || '_' || NMONTH_PLAN;
|
||||||
|
|
||||||
|
if (QQ.NSUMWORKPLAN is not null) then
|
||||||
|
PKG_CONTVALLOC1S.PUTN(YM, SPERIODNAME || '_P', PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_P') + QQ.NSUMWORKPLAN);
|
||||||
|
end if;
|
||||||
|
|
||||||
|
if (STRIN(sSUBSTR => SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN', sSOURCE => SCOLS, sDELIM => ';') = 0) then
|
||||||
|
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => SPERIODNAME, SVALUE => 'blue');
|
||||||
|
SCOLS := SCOLS || SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN;';
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
SPERIODNAME := '_' || TO_CHAR(NYEAR_PLAN) || '_' || TO_CHAR(NMONTH_PLAN) || '_' || TO_CHAR(NDAY_PLAN);
|
||||||
|
if (STRIN(sSUBSTR => SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN', sSOURCE => SCOLS, sDELIM => ';') = 0) then
|
||||||
|
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => SPERIODNAME, SVALUE => 'blue');
|
||||||
|
SCOLS := SCOLS || SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN;';
|
||||||
|
end if;
|
||||||
|
end loop;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
/* Фактические и внеплановые работы */
|
||||||
|
if (QQ.DDATEFACTEND is not null and QQ.DDATEFACTBEG is not null) then
|
||||||
|
if (QQ.nEQV_RN is not null) then
|
||||||
|
SFACT_CLR := 'green';
|
||||||
|
else
|
||||||
|
SFACT_CLR := 'red';
|
||||||
|
end if;
|
||||||
|
|
||||||
|
NWORKPERDAY := null;
|
||||||
|
if (EXTRACT(month from QQ.DDATEFACTBEG) != EXTRACT(month from QQ.DDATEFACTEND)) then
|
||||||
|
NWORKPERDAY := QQ.NSUMWORKFACT/(round(QQ.DDATEFACTEND - QQ.DDATEFACTBEG) + 1);
|
||||||
|
NCURMONTH := EXTRACT(month from QQ.DDATEFACTBEG);
|
||||||
|
end if;
|
||||||
|
|
||||||
|
for x in 0 .. trunc(QQ.DDATEFACTEND) - trunc(QQ.DDATEFACTBEG)
|
||||||
|
loop
|
||||||
|
NYEAR_FACT := EXTRACT(year from QQ.DDATEFACTBEG + x);
|
||||||
|
NMONTH_FACT := EXTRACT(month from QQ.DDATEFACTBEG + x);
|
||||||
|
NDAY_FACT := EXTRACT(day from QQ.DDATEFACTBEG + x);
|
||||||
|
|
||||||
|
if (x = 0 or NCURMONTH != NMONTH_FACT) then
|
||||||
|
if (NCURMONTH != NMONTH_FACT) then
|
||||||
|
NCURMONTH := NMONTH_FACT;
|
||||||
|
end if;
|
||||||
|
SPERIODNAME := '_' || TO_CHAR(NYEAR_FACT) || '_' || NMONTH_FACT;
|
||||||
|
|
||||||
|
if (QQ.NSUMWORKFACT is not null and NWORKPERDAY is null) then
|
||||||
|
PKG_CONTVALLOC1S.PUTN(YM, SPERIODNAME || '_F', PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_F') + QQ.NSUMWORKFACT);
|
||||||
|
end if;
|
||||||
|
|
||||||
|
/* Добавление в коллекцию окрашивания месяца */
|
||||||
|
if (PKG_CONTVALLOC1S.EXISTS_(rCONTAINER => MCLR, sROWID => SPERIODNAME) = false) then
|
||||||
|
PKG_CONTVALLOC1S.PUTS(MCLR, SPERIODNAME, SFACT_CLR);
|
||||||
|
else
|
||||||
|
if (STRIN(trim(SFACT_CLR), trim(PKG_CONTVALLOC1S.GETS(MCLR, SPERIODNAME))) = 0) then
|
||||||
|
PKG_CONTVALLOC1S.PUTS(MCLR, SPERIODNAME, PKG_CONTVALLOC1S.GETS(MCLR, SPERIODNAME) || ' ' || SFACT_CLR);
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
if (NWORKPERDAY is not null) then
|
||||||
|
PKG_CONTVALLOC1S.PUTN(YM, SPERIODNAME || '_F', PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_F') + NWORKPERDAY);
|
||||||
|
end if;
|
||||||
|
SPERIODNAME := '_' || TO_CHAR(NYEAR_FACT) || '_' || TO_CHAR(NMONTH_FACT) || '_' || TO_CHAR(NDAY_FACT);
|
||||||
|
/* Добавление окрашивания дней факта */
|
||||||
|
if (PKG_CONTVALLOC1S.EXISTS_(rCONTAINER => MCLR, sROWID => SPERIODNAME) = false) then
|
||||||
|
PKG_CONTVALLOC1S.PUTS(MCLR, SPERIODNAME, SFACT_CLR);
|
||||||
|
else
|
||||||
|
if (trim(PKG_CONTVALLOC1S.GETS(MCLR, SPERIODNAME)) = 'green' and trim(SFACT_CLR) = 'red') then
|
||||||
|
PKG_CONTVALLOC1S.PUTS(MCLR, SPERIODNAME, SFACT_CLR);
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
end loop;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
if (RDG_ROW0.RCOLS is not null and NROWS = 0) then
|
||||||
|
/* Цикл по годам периода */
|
||||||
|
for Y in NFROMYEAR .. NTOYEAR
|
||||||
|
loop
|
||||||
|
if (NFROMYEAR = NTOYEAR) then
|
||||||
|
NMS := NFROMMONTH;
|
||||||
|
NME := NTOMONTH;
|
||||||
|
else
|
||||||
|
if (Y = NFROMYEAR) then
|
||||||
|
NMS := NFROMMONTH;
|
||||||
|
NME := 12;
|
||||||
|
elsif (NFROMYEAR < Y and Y < NTOYEAR) then
|
||||||
|
NMS := 1;
|
||||||
|
NME := 12;
|
||||||
|
elsif (Y = NTOYEAR) then
|
||||||
|
NMS := 1;
|
||||||
|
NME := NTOMONTH;
|
||||||
|
end if;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
/* Цикл по месяцам года */
|
||||||
|
for M in NMS .. NME
|
||||||
|
loop
|
||||||
|
SPERIODNAME := '_' || TO_CHAR(Y) || '_' || TO_CHAR(M);
|
||||||
|
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW0,
|
||||||
|
SNAME => SPERIODNAME,
|
||||||
|
SVALUE => 'план: ' || HOURS_STR(PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_P')) || ' факт: ' || HOURS_STR(PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_F')));
|
||||||
|
end loop;
|
||||||
|
end loop;
|
||||||
|
|
||||||
|
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW0);
|
||||||
|
end if;
|
||||||
|
/* План для последней записи */
|
||||||
|
if (RDG_ROW.RCOLS is not null and NROWS = 0) then
|
||||||
|
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
|
||||||
|
end if;
|
||||||
|
/* Факт для последней записи */
|
||||||
|
if (RDG_ROW2.RCOLS is not null and NROWS = 0) then
|
||||||
|
CR := PKG_CONTVALLOC1S.FIRST_(MCLR);
|
||||||
|
for Z in 1 .. PKG_CONTVALLOC1S.COUNT_(MCLR)
|
||||||
|
loop
|
||||||
|
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW2, SNAME => CR, SVALUE => PKG_CONTVALLOC1S.GETS(MCLR, CR));
|
||||||
|
CR := PKG_CONTVALLOC1S.NEXT_(MCLR, cr);
|
||||||
|
end loop;
|
||||||
|
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW2);
|
||||||
|
end if;
|
||||||
|
end loop;
|
||||||
|
/* Сериализуем описание */
|
||||||
|
COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => 1);
|
||||||
|
PKG_CONTVALLOC1S.PURGE(YM);
|
||||||
|
end EQUIPSRV_GRID;
|
||||||
|
end PKG_P8PANELS_EQUIPSRV;
|
||||||
|
/
|
@ -1,3 +1,5 @@
|
|||||||
grant execute on PKG_P8PANELS to public;
|
grant execute on PKG_P8PANELS to public;
|
||||||
grant execute on PKG_P8PANELS_PROJECTS to public;
|
grant execute on PKG_P8PANELS_PROJECTS to public;
|
||||||
grant execute on PKG_P8PANELS_SAMPLES to public;
|
grant execute on PKG_P8PANELS_SAMPLES to public;
|
||||||
|
|
||||||
|
grant execute on PKG_P8PANELS_EQUIPSRV to public;
|
||||||
|
723
dist/p8-panels.js
vendored
723
dist/p8-panels.js
vendored
File diff suppressed because one or more lines are too long
300
package-lock.json
generated
300
package-lock.json
generated
@ -13,7 +13,7 @@
|
|||||||
"@babel/preset-react": "^7.22.5",
|
"@babel/preset-react": "^7.22.5",
|
||||||
"@emotion/react": "^11.11.1",
|
"@emotion/react": "^11.11.1",
|
||||||
"@emotion/styled": "^11.11.0",
|
"@emotion/styled": "^11.11.0",
|
||||||
"@mui/material": "^5.14.4",
|
"@mui/material": "^5.15.7",
|
||||||
"babel-loader": "^9.1.3",
|
"babel-loader": "^9.1.3",
|
||||||
"chart.js": "^4.4.0",
|
"chart.js": "^4.4.0",
|
||||||
"dayjs": "^1.11.9",
|
"dayjs": "^1.11.9",
|
||||||
@ -25,8 +25,9 @@
|
|||||||
"query-string": "^8.1.0",
|
"query-string": "^8.1.0",
|
||||||
"react": "^18.2.0",
|
"react": "^18.2.0",
|
||||||
"react-dom": "^18.2.0",
|
"react-dom": "^18.2.0",
|
||||||
|
"react-router": "^6.22.0",
|
||||||
"react-router-dom": "^6.15.0",
|
"react-router-dom": "^6.15.0",
|
||||||
"webpack": "^5.88.2",
|
"webpack": "^5.90.1",
|
||||||
"webpack-cli": "^5.1.4"
|
"webpack-cli": "^5.1.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -385,9 +386,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/runtime": {
|
"node_modules/@babel/runtime": {
|
||||||
"version": "7.22.10",
|
"version": "7.23.9",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.10.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz",
|
||||||
"integrity": "sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==",
|
"integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"regenerator-runtime": "^0.14.0"
|
"regenerator-runtime": "^0.14.0"
|
||||||
},
|
},
|
||||||
@ -667,6 +668,40 @@
|
|||||||
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@floating-ui/core": {
|
||||||
|
"version": "1.6.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz",
|
||||||
|
"integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==",
|
||||||
|
"dependencies": {
|
||||||
|
"@floating-ui/utils": "^0.2.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@floating-ui/dom": {
|
||||||
|
"version": "1.6.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.1.tgz",
|
||||||
|
"integrity": "sha512-iA8qE43/H5iGozC3W0YSnVSW42Vh522yyM1gj+BqRwVsTNOyr231PsXDaV04yT39PsO0QL2QpbI/M0ZaLUQgRQ==",
|
||||||
|
"dependencies": {
|
||||||
|
"@floating-ui/core": "^1.6.0",
|
||||||
|
"@floating-ui/utils": "^0.2.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@floating-ui/react-dom": {
|
||||||
|
"version": "2.0.8",
|
||||||
|
"resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz",
|
||||||
|
"integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==",
|
||||||
|
"dependencies": {
|
||||||
|
"@floating-ui/dom": "^1.6.1"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"react": ">=16.8.0",
|
||||||
|
"react-dom": ">=16.8.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@floating-ui/utils": {
|
||||||
|
"version": "0.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz",
|
||||||
|
"integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q=="
|
||||||
|
},
|
||||||
"node_modules/@humanwhocodes/config-array": {
|
"node_modules/@humanwhocodes/config-array": {
|
||||||
"version": "0.11.10",
|
"version": "0.11.10",
|
||||||
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz",
|
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz",
|
||||||
@ -741,9 +776,9 @@
|
|||||||
"integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
|
"integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
|
||||||
},
|
},
|
||||||
"node_modules/@jridgewell/trace-mapping": {
|
"node_modules/@jridgewell/trace-mapping": {
|
||||||
"version": "0.3.19",
|
"version": "0.3.22",
|
||||||
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz",
|
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz",
|
||||||
"integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==",
|
"integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@jridgewell/resolve-uri": "^3.1.0",
|
"@jridgewell/resolve-uri": "^3.1.0",
|
||||||
"@jridgewell/sourcemap-codec": "^1.4.14"
|
"@jridgewell/sourcemap-codec": "^1.4.14"
|
||||||
@ -755,25 +790,24 @@
|
|||||||
"integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw=="
|
"integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw=="
|
||||||
},
|
},
|
||||||
"node_modules/@mui/base": {
|
"node_modules/@mui/base": {
|
||||||
"version": "5.0.0-beta.10",
|
"version": "5.0.0-beta.34",
|
||||||
"resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.10.tgz",
|
"resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.34.tgz",
|
||||||
"integrity": "sha512-moTAhGwFfQffj7hsu61FnqcGqVcd53A1CrOhnskM9TF0Uh2rnLDMCuar4JRUWWpaJofAfQEbQBBFPadFQLI4PA==",
|
"integrity": "sha512-e2mbTGTtReD/y5RFwnhkl1Tgl3XwgJhY040IlfkTVaU9f5LWrVhEnpRsYXu3B1CtLrwiWs4cu7aMHV9yRd4jpw==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "^7.22.6",
|
"@babel/runtime": "^7.23.9",
|
||||||
"@emotion/is-prop-valid": "^1.2.1",
|
"@floating-ui/react-dom": "^2.0.8",
|
||||||
"@mui/types": "^7.2.4",
|
"@mui/types": "^7.2.13",
|
||||||
"@mui/utils": "^5.14.4",
|
"@mui/utils": "^5.15.7",
|
||||||
"@popperjs/core": "^2.11.8",
|
"@popperjs/core": "^2.11.8",
|
||||||
"clsx": "^2.0.0",
|
"clsx": "^2.1.0",
|
||||||
"prop-types": "^15.8.1",
|
"prop-types": "^15.8.1"
|
||||||
"react-is": "^18.2.0"
|
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=12.0.0"
|
"node": ">=12.0.0"
|
||||||
},
|
},
|
||||||
"funding": {
|
"funding": {
|
||||||
"type": "opencollective",
|
"type": "opencollective",
|
||||||
"url": "https://opencollective.com/mui"
|
"url": "https://opencollective.com/mui-org"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@types/react": "^17.0.0 || ^18.0.0",
|
"@types/react": "^17.0.0 || ^18.0.0",
|
||||||
@ -786,33 +820,28 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@mui/base/node_modules/react-is": {
|
|
||||||
"version": "18.2.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
|
|
||||||
"integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="
|
|
||||||
},
|
|
||||||
"node_modules/@mui/core-downloads-tracker": {
|
"node_modules/@mui/core-downloads-tracker": {
|
||||||
"version": "5.14.4",
|
"version": "5.15.7",
|
||||||
"resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.4.tgz",
|
"resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.7.tgz",
|
||||||
"integrity": "sha512-pW2XghSi3hpYKX57Wu0SCWMTSpzvXZmmucj3TcOJWaCiFt4xr05w2gcwBZi36dAp9uvd9//9N51qbblmnD+GPg==",
|
"integrity": "sha512-AuF+Wo2Mp/edaO6vJnWjg+gj4tzEz5ChMZnAQpc22DXpSvM8ddgGcZvM7D7F99pIBoSv8ub+Iz0viL+yuGVmhg==",
|
||||||
"funding": {
|
"funding": {
|
||||||
"type": "opencollective",
|
"type": "opencollective",
|
||||||
"url": "https://opencollective.com/mui"
|
"url": "https://opencollective.com/mui-org"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@mui/material": {
|
"node_modules/@mui/material": {
|
||||||
"version": "5.14.4",
|
"version": "5.15.7",
|
||||||
"resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.4.tgz",
|
"resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.7.tgz",
|
||||||
"integrity": "sha512-2XUV3KyRC07BQPPzEgd+ss3x/ezXtHeKtOGCMCNmx3MauZojPYUpSwFkE0fYgYCD9dMQMVG4DY/VF38P0KShsg==",
|
"integrity": "sha512-l6+AiKZH3iOJmZCnlpel8ghYQe9Lq0BEuKP8fGj3g5xz4arO9GydqYAtLPMvuHKtArj8lJGNuT2yHYxmejincA==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "^7.22.6",
|
"@babel/runtime": "^7.23.9",
|
||||||
"@mui/base": "5.0.0-beta.10",
|
"@mui/base": "5.0.0-beta.34",
|
||||||
"@mui/core-downloads-tracker": "^5.14.4",
|
"@mui/core-downloads-tracker": "^5.15.7",
|
||||||
"@mui/system": "^5.14.4",
|
"@mui/system": "^5.15.7",
|
||||||
"@mui/types": "^7.2.4",
|
"@mui/types": "^7.2.13",
|
||||||
"@mui/utils": "^5.14.4",
|
"@mui/utils": "^5.15.7",
|
||||||
"@types/react-transition-group": "^4.4.6",
|
"@types/react-transition-group": "^4.4.10",
|
||||||
"clsx": "^2.0.0",
|
"clsx": "^2.1.0",
|
||||||
"csstype": "^3.1.2",
|
"csstype": "^3.1.2",
|
||||||
"prop-types": "^15.8.1",
|
"prop-types": "^15.8.1",
|
||||||
"react-is": "^18.2.0",
|
"react-is": "^18.2.0",
|
||||||
@ -823,7 +852,7 @@
|
|||||||
},
|
},
|
||||||
"funding": {
|
"funding": {
|
||||||
"type": "opencollective",
|
"type": "opencollective",
|
||||||
"url": "https://opencollective.com/mui"
|
"url": "https://opencollective.com/mui-org"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@emotion/react": "^11.5.0",
|
"@emotion/react": "^11.5.0",
|
||||||
@ -850,12 +879,12 @@
|
|||||||
"integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="
|
"integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="
|
||||||
},
|
},
|
||||||
"node_modules/@mui/private-theming": {
|
"node_modules/@mui/private-theming": {
|
||||||
"version": "5.14.4",
|
"version": "5.15.7",
|
||||||
"resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.4.tgz",
|
"resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.7.tgz",
|
||||||
"integrity": "sha512-ISXsHDiQ3z1XA4IuKn+iXDWvDjcz/UcQBiFZqtdoIsEBt8CB7wgdQf3LwcwqO81dl5ofg/vNQBEnXuKfZHrnYA==",
|
"integrity": "sha512-bcEeeXm7GyQCQvN9dwo8htGv8/6tP05p0i02Z7GXm5EoDPlBcqTNGugsjNLoGq6B0SsdyanjJGw0Jw00o1yAOA==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "^7.22.6",
|
"@babel/runtime": "^7.23.9",
|
||||||
"@mui/utils": "^5.14.4",
|
"@mui/utils": "^5.15.7",
|
||||||
"prop-types": "^15.8.1"
|
"prop-types": "^15.8.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
@ -863,7 +892,7 @@
|
|||||||
},
|
},
|
||||||
"funding": {
|
"funding": {
|
||||||
"type": "opencollective",
|
"type": "opencollective",
|
||||||
"url": "https://opencollective.com/mui"
|
"url": "https://opencollective.com/mui-org"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@types/react": "^17.0.0 || ^18.0.0",
|
"@types/react": "^17.0.0 || ^18.0.0",
|
||||||
@ -876,11 +905,11 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@mui/styled-engine": {
|
"node_modules/@mui/styled-engine": {
|
||||||
"version": "5.13.2",
|
"version": "5.15.7",
|
||||||
"resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.13.2.tgz",
|
"resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.7.tgz",
|
||||||
"integrity": "sha512-VCYCU6xVtXOrIN8lcbuPmoG+u7FYuOERG++fpY74hPpEWkyFQG97F+/XfTQVYzlR2m7nPjnwVUgATcTCMEaMvw==",
|
"integrity": "sha512-ixSdslOjK1kzdGcxqj7O3d14By/LPQ7EWknsViQ8RaeT863EAQemS+zvUJDTcOpkfJh6q6gPnYMIb2TJCs9eWA==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "^7.21.0",
|
"@babel/runtime": "^7.23.9",
|
||||||
"@emotion/cache": "^11.11.0",
|
"@emotion/cache": "^11.11.0",
|
||||||
"csstype": "^3.1.2",
|
"csstype": "^3.1.2",
|
||||||
"prop-types": "^15.8.1"
|
"prop-types": "^15.8.1"
|
||||||
@ -890,7 +919,7 @@
|
|||||||
},
|
},
|
||||||
"funding": {
|
"funding": {
|
||||||
"type": "opencollective",
|
"type": "opencollective",
|
||||||
"url": "https://opencollective.com/mui"
|
"url": "https://opencollective.com/mui-org"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@emotion/react": "^11.4.1",
|
"@emotion/react": "^11.4.1",
|
||||||
@ -907,16 +936,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@mui/system": {
|
"node_modules/@mui/system": {
|
||||||
"version": "5.14.4",
|
"version": "5.15.7",
|
||||||
"resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.4.tgz",
|
"resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.7.tgz",
|
||||||
"integrity": "sha512-oPgfWS97QNfHcDBapdkZIs4G5i85BJt69Hp6wbXF6s7vi3Evcmhdk8AbCRW6n0sX4vTj8oe0mh0RIm1G2A1KDA==",
|
"integrity": "sha512-9alZ4/dLxsTwUOdqakgzxiL5YW6ntqj0CfzWImgWnBMTZhgGcPsbYpBLniNkkk7/jptma4/bykWXHwju/ls/pg==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "^7.22.6",
|
"@babel/runtime": "^7.23.9",
|
||||||
"@mui/private-theming": "^5.14.4",
|
"@mui/private-theming": "^5.15.7",
|
||||||
"@mui/styled-engine": "^5.13.2",
|
"@mui/styled-engine": "^5.15.7",
|
||||||
"@mui/types": "^7.2.4",
|
"@mui/types": "^7.2.13",
|
||||||
"@mui/utils": "^5.14.4",
|
"@mui/utils": "^5.15.7",
|
||||||
"clsx": "^2.0.0",
|
"clsx": "^2.1.0",
|
||||||
"csstype": "^3.1.2",
|
"csstype": "^3.1.2",
|
||||||
"prop-types": "^15.8.1"
|
"prop-types": "^15.8.1"
|
||||||
},
|
},
|
||||||
@ -925,7 +954,7 @@
|
|||||||
},
|
},
|
||||||
"funding": {
|
"funding": {
|
||||||
"type": "opencollective",
|
"type": "opencollective",
|
||||||
"url": "https://opencollective.com/mui"
|
"url": "https://opencollective.com/mui-org"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@emotion/react": "^11.5.0",
|
"@emotion/react": "^11.5.0",
|
||||||
@ -946,11 +975,11 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@mui/types": {
|
"node_modules/@mui/types": {
|
||||||
"version": "7.2.4",
|
"version": "7.2.13",
|
||||||
"resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.4.tgz",
|
"resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.13.tgz",
|
||||||
"integrity": "sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA==",
|
"integrity": "sha512-qP9OgacN62s+l8rdDhSFRe05HWtLLJ5TGclC9I1+tQngbssu0m2dmFZs+Px53AcOs9fD7TbYd4gc9AXzVqO/+g==",
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@types/react": "*"
|
"@types/react": "^17.0.0 || ^18.0.0"
|
||||||
},
|
},
|
||||||
"peerDependenciesMeta": {
|
"peerDependenciesMeta": {
|
||||||
"@types/react": {
|
"@types/react": {
|
||||||
@ -959,13 +988,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@mui/utils": {
|
"node_modules/@mui/utils": {
|
||||||
"version": "5.14.4",
|
"version": "5.15.7",
|
||||||
"resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.4.tgz",
|
"resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.7.tgz",
|
||||||
"integrity": "sha512-4ANV0txPD3x0IcTCSEHKDWnsutg1K3m6Vz5IckkbLXVYu17oOZCVUdOKsb/txUmaCd0v0PmSRe5PW+Mlvns5dQ==",
|
"integrity": "sha512-8qhsxQRNV6aEOjjSk6YQIYJxkF5klhj8oG1FEEU4z6HV78TjNqRxMP08QGcdsibEbez+nihAaz6vu83b4XqbAg==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "^7.22.6",
|
"@babel/runtime": "^7.23.9",
|
||||||
"@types/prop-types": "^15.7.5",
|
"@types/prop-types": "^15.7.11",
|
||||||
"@types/react-is": "^18.2.1",
|
|
||||||
"prop-types": "^15.8.1",
|
"prop-types": "^15.8.1",
|
||||||
"react-is": "^18.2.0"
|
"react-is": "^18.2.0"
|
||||||
},
|
},
|
||||||
@ -974,10 +1002,16 @@
|
|||||||
},
|
},
|
||||||
"funding": {
|
"funding": {
|
||||||
"type": "opencollective",
|
"type": "opencollective",
|
||||||
"url": "https://opencollective.com/mui"
|
"url": "https://opencollective.com/mui-org"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
|
"@types/react": "^17.0.0 || ^18.0.0",
|
||||||
"react": "^17.0.0 || ^18.0.0"
|
"react": "^17.0.0 || ^18.0.0"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"@types/react": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@mui/utils/node_modules/react-is": {
|
"node_modules/@mui/utils/node_modules/react-is": {
|
||||||
@ -1053,9 +1087,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@types/estree": {
|
"node_modules/@types/estree": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.5",
|
||||||
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
|
||||||
"integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA=="
|
"integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw=="
|
||||||
},
|
},
|
||||||
"node_modules/@types/json-schema": {
|
"node_modules/@types/json-schema": {
|
||||||
"version": "7.0.12",
|
"version": "7.0.12",
|
||||||
@ -1063,9 +1097,12 @@
|
|||||||
"integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA=="
|
"integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA=="
|
||||||
},
|
},
|
||||||
"node_modules/@types/node": {
|
"node_modules/@types/node": {
|
||||||
"version": "20.4.9",
|
"version": "20.11.16",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.9.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.16.tgz",
|
||||||
"integrity": "sha512-8e2HYcg7ohnTUbHk8focoklEQYvemQmu9M/f43DZVx43kHn0tE3BY/6gSDxS7k0SprtS0NHvj+L80cGLnoOUcQ=="
|
"integrity": "sha512-gKb0enTmRCzXSSUJDq6/sPcqrfCv2mkkG6Jt/clpn5eiCbKTY+SgZUxo+p8ZKMof5dCp9vHQUAB7wOUTod22wQ==",
|
||||||
|
"dependencies": {
|
||||||
|
"undici-types": "~5.26.4"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@types/parse-json": {
|
"node_modules/@types/parse-json": {
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
@ -1073,40 +1110,32 @@
|
|||||||
"integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
|
"integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
|
||||||
},
|
},
|
||||||
"node_modules/@types/prop-types": {
|
"node_modules/@types/prop-types": {
|
||||||
"version": "15.7.5",
|
"version": "15.7.11",
|
||||||
"resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz",
|
"resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz",
|
||||||
"integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w=="
|
"integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng=="
|
||||||
},
|
},
|
||||||
"node_modules/@types/react": {
|
"node_modules/@types/react": {
|
||||||
"version": "18.2.20",
|
"version": "18.2.55",
|
||||||
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.20.tgz",
|
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.55.tgz",
|
||||||
"integrity": "sha512-WKNtmsLWJM/3D5mG4U84cysVY31ivmyw85dE84fOCk5Hx78wezB/XEjVPWl2JTZ5FkEeaTJf+VgUAUn3PE7Isw==",
|
"integrity": "sha512-Y2Tz5P4yz23brwm2d7jNon39qoAtMMmalOQv6+fEFt1mT+FcM3D841wDpoUvFXhaYenuROCy3FZYqdTjM7qVyA==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/prop-types": "*",
|
"@types/prop-types": "*",
|
||||||
"@types/scheduler": "*",
|
"@types/scheduler": "*",
|
||||||
"csstype": "^3.0.2"
|
"csstype": "^3.0.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@types/react-is": {
|
|
||||||
"version": "18.2.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-18.2.1.tgz",
|
|
||||||
"integrity": "sha512-wyUkmaaSZEzFZivD8F2ftSyAfk6L+DfFliVj/mYdOXbVjRcS87fQJLTnhk6dRZPuJjI+9g6RZJO4PNCngUrmyw==",
|
|
||||||
"dependencies": {
|
|
||||||
"@types/react": "*"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@types/react-transition-group": {
|
"node_modules/@types/react-transition-group": {
|
||||||
"version": "4.4.6",
|
"version": "4.4.10",
|
||||||
"resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.6.tgz",
|
"resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz",
|
||||||
"integrity": "sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew==",
|
"integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/react": "*"
|
"@types/react": "*"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@types/scheduler": {
|
"node_modules/@types/scheduler": {
|
||||||
"version": "0.16.3",
|
"version": "0.16.8",
|
||||||
"resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz",
|
"resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz",
|
||||||
"integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ=="
|
"integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A=="
|
||||||
},
|
},
|
||||||
"node_modules/@webassemblyjs/ast": {
|
"node_modules/@webassemblyjs/ast": {
|
||||||
"version": "1.11.6",
|
"version": "1.11.6",
|
||||||
@ -1728,9 +1757,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/clsx": {
|
"node_modules/clsx": {
|
||||||
"version": "2.0.0",
|
"version": "2.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz",
|
||||||
"integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==",
|
"integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6"
|
"node": ">=6"
|
||||||
}
|
}
|
||||||
@ -3802,11 +3831,11 @@
|
|||||||
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
|
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
|
||||||
},
|
},
|
||||||
"node_modules/react-router": {
|
"node_modules/react-router": {
|
||||||
"version": "6.15.0",
|
"version": "6.22.0",
|
||||||
"resolved": "https://registry.npmjs.org/react-router/-/react-router-6.15.0.tgz",
|
"resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.0.tgz",
|
||||||
"integrity": "sha512-NIytlzvzLwJkCQj2HLefmeakxxWHWAP+02EGqWEZy+DgfHHKQMUoBBjUQLOtFInBMhWtb3hiUy6MfFgwLjXhqg==",
|
"integrity": "sha512-q2yemJeg6gw/YixRlRnVx6IRJWZD6fonnfZhN1JIOhV2iJCPeRNSH3V1ISwHf+JWcESzLC3BOLD1T07tmO5dmg==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@remix-run/router": "1.8.0"
|
"@remix-run/router": "1.15.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=14.0.0"
|
"node": ">=14.0.0"
|
||||||
@ -3831,6 +3860,28 @@
|
|||||||
"react-dom": ">=16.8"
|
"react-dom": ">=16.8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/react-router-dom/node_modules/react-router": {
|
||||||
|
"version": "6.15.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/react-router/-/react-router-6.15.0.tgz",
|
||||||
|
"integrity": "sha512-NIytlzvzLwJkCQj2HLefmeakxxWHWAP+02EGqWEZy+DgfHHKQMUoBBjUQLOtFInBMhWtb3hiUy6MfFgwLjXhqg==",
|
||||||
|
"dependencies": {
|
||||||
|
"@remix-run/router": "1.8.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=14.0.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"react": ">=16.8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/react-router/node_modules/@remix-run/router": {
|
||||||
|
"version": "1.15.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.0.tgz",
|
||||||
|
"integrity": "sha512-HOil5aFtme37dVQTB6M34G95kPM3MMuqSmIRVCC52eKV+Y/tGSqw9P3rWhlAx6A+mz+MoX+XxsGsNJbaI5qCgQ==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=14.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/react-transition-group": {
|
"node_modules/react-transition-group": {
|
||||||
"version": "4.4.5",
|
"version": "4.4.5",
|
||||||
"resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
|
"resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
|
||||||
@ -4049,9 +4100,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/serialize-javascript": {
|
"node_modules/serialize-javascript": {
|
||||||
"version": "6.0.1",
|
"version": "6.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
|
||||||
"integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==",
|
"integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"randombytes": "^2.1.0"
|
"randombytes": "^2.1.0"
|
||||||
}
|
}
|
||||||
@ -4250,9 +4301,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/terser": {
|
"node_modules/terser": {
|
||||||
"version": "5.19.2",
|
"version": "5.27.0",
|
||||||
"resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz",
|
"resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz",
|
||||||
"integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==",
|
"integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@jridgewell/source-map": "^0.3.3",
|
"@jridgewell/source-map": "^0.3.3",
|
||||||
"acorn": "^8.8.2",
|
"acorn": "^8.8.2",
|
||||||
@ -4267,15 +4318,15 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/terser-webpack-plugin": {
|
"node_modules/terser-webpack-plugin": {
|
||||||
"version": "5.3.9",
|
"version": "5.3.10",
|
||||||
"resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz",
|
"resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz",
|
||||||
"integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==",
|
"integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@jridgewell/trace-mapping": "^0.3.17",
|
"@jridgewell/trace-mapping": "^0.3.20",
|
||||||
"jest-worker": "^27.4.5",
|
"jest-worker": "^27.4.5",
|
||||||
"schema-utils": "^3.1.1",
|
"schema-utils": "^3.1.1",
|
||||||
"serialize-javascript": "^6.0.1",
|
"serialize-javascript": "^6.0.1",
|
||||||
"terser": "^5.16.8"
|
"terser": "^5.26.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 10.13.0"
|
"node": ">= 10.13.0"
|
||||||
@ -4409,6 +4460,11 @@
|
|||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/undici-types": {
|
||||||
|
"version": "5.26.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
|
||||||
|
"integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
|
||||||
|
},
|
||||||
"node_modules/update-browserslist-db": {
|
"node_modules/update-browserslist-db": {
|
||||||
"version": "1.0.11",
|
"version": "1.0.11",
|
||||||
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz",
|
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz",
|
||||||
@ -4459,18 +4515,18 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/webpack": {
|
"node_modules/webpack": {
|
||||||
"version": "5.88.2",
|
"version": "5.90.1",
|
||||||
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz",
|
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.1.tgz",
|
||||||
"integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==",
|
"integrity": "sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/eslint-scope": "^3.7.3",
|
"@types/eslint-scope": "^3.7.3",
|
||||||
"@types/estree": "^1.0.0",
|
"@types/estree": "^1.0.5",
|
||||||
"@webassemblyjs/ast": "^1.11.5",
|
"@webassemblyjs/ast": "^1.11.5",
|
||||||
"@webassemblyjs/wasm-edit": "^1.11.5",
|
"@webassemblyjs/wasm-edit": "^1.11.5",
|
||||||
"@webassemblyjs/wasm-parser": "^1.11.5",
|
"@webassemblyjs/wasm-parser": "^1.11.5",
|
||||||
"acorn": "^8.7.1",
|
"acorn": "^8.7.1",
|
||||||
"acorn-import-assertions": "^1.9.0",
|
"acorn-import-assertions": "^1.9.0",
|
||||||
"browserslist": "^4.14.5",
|
"browserslist": "^4.21.10",
|
||||||
"chrome-trace-event": "^1.0.2",
|
"chrome-trace-event": "^1.0.2",
|
||||||
"enhanced-resolve": "^5.15.0",
|
"enhanced-resolve": "^5.15.0",
|
||||||
"es-module-lexer": "^1.2.1",
|
"es-module-lexer": "^1.2.1",
|
||||||
@ -4484,7 +4540,7 @@
|
|||||||
"neo-async": "^2.6.2",
|
"neo-async": "^2.6.2",
|
||||||
"schema-utils": "^3.2.0",
|
"schema-utils": "^3.2.0",
|
||||||
"tapable": "^2.1.1",
|
"tapable": "^2.1.1",
|
||||||
"terser-webpack-plugin": "^5.3.7",
|
"terser-webpack-plugin": "^5.3.10",
|
||||||
"watchpack": "^2.4.0",
|
"watchpack": "^2.4.0",
|
||||||
"webpack-sources": "^3.2.3"
|
"webpack-sources": "^3.2.3"
|
||||||
},
|
},
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
"@babel/preset-react": "^7.22.5",
|
"@babel/preset-react": "^7.22.5",
|
||||||
"@emotion/react": "^11.11.1",
|
"@emotion/react": "^11.11.1",
|
||||||
"@emotion/styled": "^11.11.0",
|
"@emotion/styled": "^11.11.0",
|
||||||
"@mui/material": "^5.14.4",
|
"@mui/material": "^5.15.7",
|
||||||
"babel-loader": "^9.1.3",
|
"babel-loader": "^9.1.3",
|
||||||
"chart.js": "^4.4.0",
|
"chart.js": "^4.4.0",
|
||||||
"dayjs": "^1.11.9",
|
"dayjs": "^1.11.9",
|
||||||
@ -35,8 +35,9 @@
|
|||||||
"query-string": "^8.1.0",
|
"query-string": "^8.1.0",
|
||||||
"react": "^18.2.0",
|
"react": "^18.2.0",
|
||||||
"react-dom": "^18.2.0",
|
"react-dom": "^18.2.0",
|
||||||
|
"react-router": "^6.22.0",
|
||||||
"react-router-dom": "^6.15.0",
|
"react-router-dom": "^6.15.0",
|
||||||
"webpack": "^5.88.2",
|
"webpack": "^5.90.1",
|
||||||
"webpack-cli": "^5.1.4"
|
"webpack-cli": "^5.1.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user