WEBAPP: Флаг "isDataFound" для хуков высокоуровневых компонентов (Гант, Циклограмма, Индикатор, Таблица, График)

This commit is contained in:
Mim 2026-04-09 19:04:25 +03:00
parent 5483e5c39f
commit 4bf3bfb3fa
7 changed files with 53 additions and 9 deletions

View File

@ -1541,6 +1541,7 @@ const MyPanel = () => {
**Результат:** объект для работы с компонентом `P8PDataGrid`. Возвращаемый объект имеет следующие свойства:\ **Результат:** объект для работы с компонентом `P8PDataGrid`. Возвращаемый объект имеет следующие свойства:\
`dataGrid` - объект, хранит информацию о таблице, загруженной с помощью хранимой процедуры\ `dataGrid` - объект, хранит информацию о таблице, загруженной с помощью хранимой процедуры\
`isDataLoaded` - логический, признак успешной загрузки и обработки данных из хранимой процедуры\ `isDataLoaded` - логический, признак успешной загрузки и обработки данных из хранимой процедуры\
`isDataFound` - логический, признак наличия значимых сведений (бизнес-даных) в данных, полученных из хранимой процедуры\
`isLoading` - логический, признак выполнения загрузки данных из хранимой процедуры\ `isLoading` - логический, признак выполнения загрузки данных из хранимой процедуры\
`handleFilterChanged` - функция, изменение состояния фильтров таблицы. Сигнатура функции `f({filters})`, результат функции не интерпретируется\ `handleFilterChanged` - функция, изменение состояния фильтров таблицы. Сигнатура функции `f({filters})`, результат функции не интерпретируется\
`handleOrderChanged` - функция, изменение состояния сортировок таблицы. Сигнатура функции `f({orders})`, результат функции не интерпретируется\ `handleOrderChanged` - функция, изменение состояния сортировок таблицы. Сигнатура функции `f({orders})`, результат функции не интерпретируется\
@ -2005,6 +2006,7 @@ const MyPanel = () => {
**Результат:** объект для работы с компонентом `P8PChart`. Возвращаемый объект имеет следующие свойства:\ **Результат:** объект для работы с компонентом `P8PChart`. Возвращаемый объект имеет следующие свойства:\
`chart` - объект, хранит информацию о графике, загруженном с помощью хранимой процедуры\ `chart` - объект, хранит информацию о графике, загруженном с помощью хранимой процедуры\
`isDataLoaded` - логический, признак успешной загрузки и обработки данных из хранимой процедуры\ `isDataLoaded` - логический, признак успешной загрузки и обработки данных из хранимой процедуры\
`isDataFound` - логический, признак наличия значимых сведений (бизнес-даных) в данных, полученных из хранимой процедуры\
`isLoading` - логический, признак выполнения загрузки данных из хранимой процедуры\ `isLoading` - логический, признак выполнения загрузки данных из хранимой процедуры\
`doReload` - функция, принудительное обновление данных графика, сигнатура функции `f()`, результат функции не интерпретируется `doReload` - функция, принудительное обновление данных графика, сигнатура функции `f()`, результат функции не интерпретируется
@ -2240,6 +2242,7 @@ const MyPanel = () => {
**Результат:** объект для работы с компонентом `P8PGantt`. Возвращаемый объект имеет следующие свойства:\ **Результат:** объект для работы с компонентом `P8PGantt`. Возвращаемый объект имеет следующие свойства:\
`gantt` - объект, хранит информацию о диаграмме Ганта, загруженной с помощью хранимой процедуры\ `gantt` - объект, хранит информацию о диаграмме Ганта, загруженной с помощью хранимой процедуры\
`isDataLoaded` - логический, признак успешной загрузки и обработки данных из хранимой процедуры\ `isDataLoaded` - логический, признак успешной загрузки и обработки данных из хранимой процедуры\
`isDataFound` - логический, признак наличия значимых сведений (бизнес-даных) в данных, полученных из хранимой процедуры\
`isLoading` - логический, признак выполнения загрузки данных из хранимой процедуры\ `isLoading` - логический, признак выполнения загрузки данных из хранимой процедуры\
`doReload` - функция, принудительное обновление данных диаграммы Ганта, сигнатура функции `f()`, результат функции не интерпретируется `doReload` - функция, принудительное обновление данных диаграммы Ганта, сигнатура функции `f()`, результат функции не интерпретируется
@ -2731,6 +2734,7 @@ const MyPanel = () => {
**Результат:** объект для работы с компонентом `P8PCyclogram`. Возвращаемый объект имеет следующие свойства:\ **Результат:** объект для работы с компонентом `P8PCyclogram`. Возвращаемый объект имеет следующие свойства:\
`cyclogram` - объект, хранит информацию о циклограмме, загруженной с помощью хранимой процедуры\ `cyclogram` - объект, хранит информацию о циклограмме, загруженной с помощью хранимой процедуры\
`isDataLoaded` - логический, признак успешной загрузки и обработки данных из хранимой процедуры\ `isDataLoaded` - логический, признак успешной загрузки и обработки данных из хранимой процедуры\
`isDataFound` - логический, признак наличия значимых сведений (бизнес-даных) в данных, полученных из хранимой процедуры\
`isLoading` - логический, признак выполнения загрузки данных из хранимой процедуры\ `isLoading` - логический, признак выполнения загрузки данных из хранимой процедуры\
`doReload` - функция, принудительное обновление данных циклограммы, сигнатура функции `f()`, результат функции не интерпретируется `doReload` - функция, принудительное обновление данных циклограммы, сигнатура функции `f()`, результат функции не интерпретируется
@ -3204,6 +3208,7 @@ const MyPanel = () => {
**Результат:** объект для работы с компонентом `P8PIndicator`. Возвращаемый объект имеет следующие свойства:\ **Результат:** объект для работы с компонентом `P8PIndicator`. Возвращаемый объект имеет следующие свойства:\
`indicator` - объект, хранит информацию об индикаторе, загруженном с помощью хранимой процедуры\ `indicator` - объект, хранит информацию об индикаторе, загруженном с помощью хранимой процедуры\
`isDataLoaded` - логический, признак успешной загрузки и обработки данных из хранимой процедуры\ `isDataLoaded` - логический, признак успешной загрузки и обработки данных из хранимой процедуры\
`isDataFound` - логический, признак наличия значимых сведений (бизнес-даных) в данных, полученных из хранимой процедуры\
`isLoading` - логический, признак выполнения загрузки данных из хранимой процедуры\ `isLoading` - логический, признак выполнения загрузки данных из хранимой процедуры\
`doReload` - функция, принудительное обновление данных индикатора, сигнатура функции `f()`, результат функции не интерпретируется `doReload` - функция, принудительное обновление данных индикатора, сигнатура функции `f()`, результат функции не интерпретируется

View File

@ -43,6 +43,9 @@ const useP8PChart = ({
//Собственное состояние - признак загрузки данных //Собственное состояние - признак загрузки данных
const [isDataLoaded, setIsDataLoaded] = useState(false); const [isDataLoaded, setIsDataLoaded] = useState(false);
//Собственное состояние - признак наличия бизнес-данных в загруженных
const [isDataFound, setIsDataFound] = useState(false);
//Собственное состояние - флаг загрузки //Собственное состояние - флаг загрузки
const [isLoading, setLoading] = useState(false); const [isLoading, setLoading] = useState(false);
@ -66,8 +69,13 @@ const useP8PChart = ({
//Загрузка данных графика с сервера //Загрузка данных графика с сервера
const loadData = useCallback(async () => { const loadData = useCallback(async () => {
try { try {
//Поднимаем флаг начала загрузки данных
setLoading(true); setLoading(true);
//Получаем данные с сервера БД
const data = await executeStored({ stored, respArg, args: { ...refStoredArgs.current }, ...refExecuteStoredArgs.current }); const data = await executeStored({ stored, respArg, args: { ...refStoredArgs.current }, ...refExecuteStoredArgs.current });
//Устанавливаем флаг наличия бизнес-данных
setIsDataFound(data[contentNodeName]?.datasets?.[0]?.data?.length > 0);
//Устанавливаем бизнес-данные
setChart(pv => ({ ...pv, ...data[contentNodeName] })); setChart(pv => ({ ...pv, ...data[contentNodeName] }));
//Устанавливаем признак загрузки данных с учетом возможных ошибок //Устанавливаем признак загрузки данных с учетом возможных ошибок
setIsDataLoaded(!isRespErr(data)); setIsDataLoaded(!isRespErr(data));
@ -126,7 +134,7 @@ const useP8PChart = ({
}, [isAllowDataLoad, reload, loadData]); }, [isAllowDataLoad, reload, loadData]);
//Возвращаем данные графика //Возвращаем данные графика
return { chart, isDataLoaded, isLoading, doReload }; return { chart, isDataLoaded, isDataFound, isLoading, doReload };
}; };
//---------------- //----------------

View File

@ -47,6 +47,9 @@ const useP8PCyclogram = ({
//Собственное состояние - признак загрузки данных //Собственное состояние - признак загрузки данных
const [isDataLoaded, setIsDataLoaded] = useState(false); const [isDataLoaded, setIsDataLoaded] = useState(false);
//Собственное состояние - признак наличия бизнес-данных в загруженных
const [isDataFound, setIsDataFound] = useState(false);
//Собственное состояние - флаг загрузки //Собственное состояние - флаг загрузки
const [isLoading, setLoading] = useState(false); const [isLoading, setLoading] = useState(false);
@ -70,7 +73,9 @@ const useP8PCyclogram = ({
//Загрузка данных циклограммы с сервера //Загрузка данных циклограммы с сервера
const loadData = useCallback(async () => { const loadData = useCallback(async () => {
try { try {
//Поднимаем флаг начала загрузки данных
setLoading(true); setLoading(true);
//Получаем данные с сервера БД
const data = await executeStored({ const data = await executeStored({
stored, stored,
args: { ...refStoredArgs.current }, args: { ...refStoredArgs.current },
@ -78,6 +83,9 @@ const useP8PCyclogram = ({
respArg, respArg,
...refExecuteStoredArgs.current ...refExecuteStoredArgs.current
}); });
//Устанавливаем флаг наличия бизнес-данных
setIsDataFound(data[contentNodeName]?.tasks?.length > 0);
//Устанавливаем бизнес-данные
setCyclogram(pv => ({ ...pv, ...data[contentNodeName] })); setCyclogram(pv => ({ ...pv, ...data[contentNodeName] }));
//Устанавливаем признак загрузки данных с учетом возможных ошибок //Устанавливаем признак загрузки данных с учетом возможных ошибок
setIsDataLoaded(!isRespErr(data)); setIsDataLoaded(!isRespErr(data));
@ -135,7 +143,7 @@ const useP8PCyclogram = ({
}, [isAllowDataLoad, reload, loadData]); }, [isAllowDataLoad, reload, loadData]);
//Возвращаем данные циклограммы //Возвращаем данные циклограммы
return { cyclogram, isDataLoaded, isLoading, doReload }; return { cyclogram, isDataLoaded, isDataFound, isLoading, doReload };
}; };
//---------------- //----------------

View File

@ -10,6 +10,7 @@
import { useReducer, useCallback, useEffect, useContext, useRef, useMemo } from "react"; //Классы React import { useReducer, useCallback, useEffect, useContext, useRef, useMemo } from "react"; //Классы React
import { BackEndCtx } from "../context/backend"; //Контекст взаимодействия с сервером import { BackEndCtx } from "../context/backend"; //Контекст взаимодействия с сервером
import { object2Base64XML } from "../core/utils"; //Вспомогательные функции import { object2Base64XML } from "../core/utils"; //Вспомогательные функции
import config from "../../app.config"; //Настройки приложения
import { DG_AT, INITIAL_STATE, dataGridReducer } from "./p8p_data_grid_reducer"; //Редьюсер состояния import { DG_AT, INITIAL_STATE, dataGridReducer } from "./p8p_data_grid_reducer"; //Редьюсер состояния
//--------- //---------
@ -17,7 +18,7 @@ import { DG_AT, INITIAL_STATE, dataGridReducer } from "./p8p_data_grid_reducer";
//--------- //---------
//Константы - значения по умолчанию //Константы - значения по умолчанию
const DG_PAGE_SIZE_DEF = 10; //Размер страницы const DG_PAGE_SIZE_DEF = config.SYSTEM.PAGE_SIZE; //Размер страницы
const DG_NODE_NAME_DEF = "XDATA_GRID"; //Наименование узла, содержащего информацию о таблице const DG_NODE_NAME_DEF = "XDATA_GRID"; //Наименование узла, содержащего информацию о таблице
const FILTERS_NODE_NAME_DEF = "filters"; //Наименование узла отборов const FILTERS_NODE_NAME_DEF = "filters"; //Наименование узла отборов
const ORDERS_NODE_NAME_DEF = "orders"; //Наименование узла сортировок const ORDERS_NODE_NAME_DEF = "orders"; //Наименование узла сортировок
@ -85,8 +86,9 @@ const useP8PDataGrid = ({
//Загрузка данных таблицы с сервера //Загрузка данных таблицы с сервера
const loadData = useCallback(async () => { const loadData = useCallback(async () => {
try { try {
//Начинаем загрузку //Поднимаем флаг начала загрузки данных
setIsLoading(true); setIsLoading(true);
//Получаем данные с сервера БД
const data = await executeStored({ const data = await executeStored({
stored, stored,
args: { args: {
@ -103,7 +105,7 @@ const useP8PDataGrid = ({
respArg, respArg,
...refExecuteStoredArgs.current ...refExecuteStoredArgs.current
}); });
//Устанавливаем полученные данные и признак загрузки данных с учетом возможных ошибок //Устанавливаем полученные бизнес-данные, признак загрузки данных с учетом возможных ошибок, признак наличия бизнес-данных
setDataGrid(data[contentNodeName], pageSize, isRespErr(data)); setDataGrid(data[contentNodeName], pageSize, isRespErr(data));
} catch (e) { } catch (e) {
//Если произошла ошибка - данные не загружены //Если произошла ошибка - данные не загружены
@ -189,6 +191,7 @@ const useP8PDataGrid = ({
return { return {
dataGrid: state.dataGrid, dataGrid: state.dataGrid,
isDataLoaded: state.isDataLoaded, isDataLoaded: state.isDataLoaded,
isDataFound: state.isDataFound,
isLoading: state.isLoading, isLoading: state.isLoading,
handleFilterChanged, handleFilterChanged,
handleOrderChanged, handleOrderChanged,

View File

@ -32,9 +32,10 @@ const INITIAL_STATE = ({ initFilters, initOrders }) => ({
pagesCount: 0, pagesCount: 0,
fixedColumns: 0, fixedColumns: 0,
fixedHeader: false, fixedHeader: false,
morePages: true morePages: false
}, },
isDataLoaded: false, isDataLoaded: false,
isDataFound: false,
isLoading: false, isLoading: false,
reload: true reload: true
}); });
@ -65,7 +66,10 @@ const handlers = {
: [...(state.dataGrid.groups || [])], : [...(state.dataGrid.groups || [])],
morePages: dataGridData.morePages && (dataGridData.rows || []).length >= pageSize morePages: dataGridData.morePages && (dataGridData.rows || []).length >= pageSize
}, },
isDataLoaded: isError === true ? false : true isDataLoaded: isError === true ? false : true,
isDataFound:
(state.dataGrid.pageNumber == 1 && dataGridData?.rows?.length > 0) ||
(state.dataGrid.pageNumber != 1 && state.dataGrid.rows.length > 0)
}; };
}, },
//Установка фильтра таблицы //Установка фильтра таблицы

View File

@ -48,6 +48,9 @@ const useP8PGantt = ({
//Собственное состояние - признак загрузки данных //Собственное состояние - признак загрузки данных
const [isDataLoaded, setIsDataLoaded] = useState(false); const [isDataLoaded, setIsDataLoaded] = useState(false);
//Собственное состояние - признак наличия бизнес-данных в загруженных
const [isDataFound, setIsDataFound] = useState(false);
//Собственное состояние - флаг загрузки //Собственное состояние - флаг загрузки
const [isLoading, setLoading] = useState(false); const [isLoading, setLoading] = useState(false);
@ -71,7 +74,9 @@ const useP8PGantt = ({
//Загрузка данных диаграммы ганта с сервера //Загрузка данных диаграммы ганта с сервера
const loadData = useCallback(async () => { const loadData = useCallback(async () => {
try { try {
//Поднимаем флаг начала загрузки данных
setLoading(true); setLoading(true);
//Получаем данные с сервера БД
const data = await executeStored({ const data = await executeStored({
stored, stored,
args: { ...refStoredArgs.current }, args: { ...refStoredArgs.current },
@ -80,6 +85,9 @@ const useP8PGantt = ({
respArg, respArg,
...refExecuteStoredArgs.current ...refExecuteStoredArgs.current
}); });
//Устанавливаем флаг наличия бизнес-данных
setIsDataFound(data[contentNodeName]?.tasks?.length > 0);
//Устанавливаем бизнес-данные
setGantt(pv => ({ ...pv, ...data[contentNodeName] })); setGantt(pv => ({ ...pv, ...data[contentNodeName] }));
//Устанавливаем признак загрузки данных с учетом возможных ошибок //Устанавливаем признак загрузки данных с учетом возможных ошибок
setIsDataLoaded(!isRespErr(data)); setIsDataLoaded(!isRespErr(data));
@ -138,7 +146,7 @@ const useP8PGantt = ({
}, [isAllowDataLoad, reload, loadData]); }, [isAllowDataLoad, reload, loadData]);
//Возвращаем данные диаграммы ганта //Возвращаем данные диаграммы ганта
return { gantt, isDataLoaded, isLoading, doReload }; return { gantt, isDataLoaded, isDataFound, isLoading, doReload };
}; };
//---------------- //----------------

View File

@ -50,6 +50,9 @@ const useP8PIndicator = ({
//Собственное состояние - признак загрузки данных //Собственное состояние - признак загрузки данных
const [isDataLoaded, setIsDataLoaded] = useState(false); const [isDataLoaded, setIsDataLoaded] = useState(false);
//Собственное состояние - признак наличия бизнес-данных в загруженных
const [isDataFound, setIsDataFound] = useState(false);
//Собственное состояние - флаг загрузки //Собственное состояние - флаг загрузки
const [isLoading, setLoading] = useState(false); const [isLoading, setLoading] = useState(false);
@ -73,8 +76,13 @@ const useP8PIndicator = ({
//Загрузка данных индикатора с сервера //Загрузка данных индикатора с сервера
const loadData = useCallback(async () => { const loadData = useCallback(async () => {
try { try {
//Поднимаем флаг начала загрузки данных
setLoading(true); setLoading(true);
//Получаем данные с сервера БД
const data = await executeStored({ stored, respArg, args: { ...refStoredArgs.current }, ...refExecuteStoredArgs.current }); const data = await executeStored({ stored, respArg, args: { ...refStoredArgs.current }, ...refExecuteStoredArgs.current });
//Устанавливаем флаг наличия бизнес-данных
setIsDataFound(data[contentNodeName]?.caption && data[contentNodeName]?.value != undefined);
//Устанавливаем бизнес-данные
setIndicator(pv => ({ ...pv, ...data[contentNodeName] })); setIndicator(pv => ({ ...pv, ...data[contentNodeName] }));
//Устанавливаем признак загрузки данных с учетом возможных ошибок //Устанавливаем признак загрузки данных с учетом возможных ошибок
setIsDataLoaded(!isRespErr(data)); setIsDataLoaded(!isRespErr(data));
@ -133,7 +141,7 @@ const useP8PIndicator = ({
}, [isAllowDataLoad, reload, loadData]); }, [isAllowDataLoad, reload, loadData]);
//Возвращаем данные индикатора //Возвращаем данные индикатора
return { indicator, isDataLoaded, isLoading, doReload }; return { indicator, isDataLoaded, isDataFound, isLoading, doReload };
}; };
//---------------- //----------------