/* Парус 8 - Панели мониторинга - ТОиР - Аналитика по ремонтам АТС Панель мониторинга: Корневая панель аналитики по ремонтам АТС */ //--------------------- //Подключение библиотек //--------------------- import React, { useState, useEffect, useMemo } from "react"; //Классы React import { Box, Grid, Paper, Fab, Icon } from "@mui/material"; //Интерфейсные компоненты import { APP_BAR_HEIGHT } from "../../components/p8p_app_workspace"; //Заголовок страницы import { P8PChart } from "../../components/p8p_chart"; //График import { APP_STYLES } from "../../../app.styles"; //Типовые стили import { P8PDataGrid, P8P_DATA_GRID_SIZE, P8P_DATA_GRID_MORE_HEIGHT, P8P_DATA_GRID_FILTERS_HEIGHT } from "../../components/p8p_data_grid"; //Таблица данных import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения import { FilterDialog } from "./filter_dialog"; //Диалог фильтра import { Filter } from "./filter"; //Фильтры import { useFilters } from "./hooks/filter_hooks"; //Хуки фильтров import { useChartStatuses, useChartSpendings, useTableRepairs } from "./hooks/hooks"; import { useDictionary } from "./hooks/dict_hooks"; import { dataCellRender, valueFormatter, formatFilterValues } from "./layouts"; import { ChartFilter } from "./chart_filter"; import { hasValue } from "../../core/utils"; //--------- //Константы //--------- //Высота графиков const CHART_HEIGHT = "300px"; //Стили const STYLES = { TABLE_PROJECTS: (showCharts, morePages, filters, isChartsFiltered) => ({ height: `calc(100vh - ${APP_BAR_HEIGHT} - ${showCharts ? CHART_HEIGHT : "0px"} - ${morePages ? P8P_DATA_GRID_MORE_HEIGHT : "0px"} - ${ filters ? P8P_DATA_GRID_FILTERS_HEIGHT : "0px" } - ${showCharts && isChartsFiltered ? "53px" : "0px"} - 90px)`, maxWidth: `calc(100vw - 16px)`, ...APP_STYLES.SCROLL }), CHART: { maxHeight: CHART_HEIGHT, display: "flex", justifyContent: "center" }, CHART_PAPER: { height: "100%", paddingBottom: "5px" }, CHART_FAB: { position: "absolute", top: 80, left: 16 } }; //Графики страницы const CHART_NAMES = { repairs: "REPAIRS", spendings: "SPENDINGS" }; //----------- //Тело модуля //----------- //Корневая панель аналитики по ремонтам АТС const RepairAnlATC = () => { //Собственное состояние - признак отображения фильтров const [isFilterOpen, setIsFilterOpen] = useState(true); //Состояния графиков const [showCharts, setShowCharts] = useState(true); //Собственное состояние - общие фильтры const [filterValues, isFiltersLoaded, filtersInit, handleFilterChange] = useFilters(); //Собственное состояние - фильтры ремонтов const [filterRepairs, setFilterRepairs] = useState({ nState: null }); //Собственное состояние - фильтры затрат const [filterSpendings, setFilterSpendings] = useState({ nType: null }); //Общие фильтры панели const allFilters = useMemo(() => { return { ...filterValues, nState: filterRepairs.nState, nType: filterSpendings.nType }; }, [filterRepairs.nState, filterSpendings.nType, filterValues]); //Состояние графика статусов const { chartStatuses, handleReload: handleChartStatusesReload } = useChartStatuses({ storedArgs: allFilters }); //Состояние графика трудовых затрат const { chartSpendings, handleReload: handleChartSpendingsReload } = useChartSpendings({ storedArgs: allFilters }); //Состояние таблицы ремонтных ведомостей const { dataGrid, handleReload: handleTableRepairsReload, handleFilterChanged, handleOrderChanged, handlePagesCountChanged } = useTableRepairs({ storedArgs: formatFilterValues(allFilters) }); //Вспомогательные функции открытия раздела const { handleEquipRepairSheetsOpen } = useDictionary(); //При изменении фильтра в диалоге const handleFilterOk = filter => { //Обновляем фильтры handleFilterChange({ filter }); //Закрываем диалог фильтра setIsFilterOpen(false); }; //При закрытии диалога фильтра const handleFilterCancel = () => setIsFilterOpen(false); //При открытии диалога фильтра const handleFilterDialogOpen = () => setIsFilterOpen(true); //При нажатии на элемент графика "Ремонты" const handleChartStatusesClick = ({ item }) => { setFilterRepairs({ nState: item.NSTATE }); }; //При нажатии на элемент графика "Трудовые затраты" const handleChartSpendingsClick = ({ item }) => { //Если тип не соответствует текущему if (item.NTYPE !== filterSpendings.nType) setFilterSpendings({ nType: item.NTYPE }); }; //При изменении фильтра графика const handleChartFilterChange = ({ chartName, filter }) => { //При изменении фильтров графика "Ремонты" if (chartName === CHART_NAMES.repairs) { setFilterRepairs({ ...filter }); } //При изменении фильтров графика "Трудовые затраты" if (chartName === CHART_NAMES.spendings) setFilterSpendings({ ...filter }); }; //При изменении фильтра useEffect(() => { //Если фильтр установлен if (!filtersInit) { handleChartStatusesReload(); handleChartSpendingsReload(); handleTableRepairsReload(); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [allFilters, filtersInit]); //Генерация содержимого return ( {!filtersInit ? : null} {showCharts ? ( <> {hasValue(filterRepairs.nState) ? ( ) : null} {chartStatuses.loaded ? ( ) : null} {hasValue(filterSpendings.nType) ? ( ) : null} {chartSpendings.loaded ? ( ) : null} ) : null} {dataGrid.dataLoaded ? ( 0, hasValue(filterRepairs.nState) || hasValue(filterSpendings.nType) ) }} filtersInitial={dataGrid.filters} onOrderChanged={handleOrderChanged} onFilterChanged={handleFilterChanged} onPagesCountChanged={handlePagesCountChanged} dataCellRender={prms => dataCellRender({ ...prms, showEquipRepairSheets: handleEquipRepairSheetsOpen })} valueFormatter={valueFormatter} /> ) : null} {chartStatuses.loaded && chartSpendings.loaded ? ( setShowCharts(!showCharts)}> {showCharts ? "expand_less" : "expand_more"} ) : null} {isFilterOpen && isFiltersLoaded ? ( ) : null} ); }; //---------------- //Интерфейс модуля //---------------- export { RepairAnlATC };