From 4bf3bfb3fa2218bcb939e1cbc8013d2bfe03d585 Mon Sep 17 00:00:00 2001 From: Mim Date: Thu, 9 Apr 2026 19:04:25 +0300 Subject: [PATCH] =?UTF-8?q?WEBAPP:=20=D0=A4=D0=BB=D0=B0=D0=B3=20"isDataFou?= =?UTF-8?q?nd"=20=D0=B4=D0=BB=D1=8F=20=D1=85=D1=83=D0=BA=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=B2=D1=8B=D1=81=D0=BE=D0=BA=D0=BE=D1=83=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=BD=D0=B5=D0=B2=D1=8B=D1=85=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=D1=82=D0=BE=D0=B2=20(=D0=93=D0=B0=D0=BD?= =?UTF-8?q?=D1=82,=20=D0=A6=D0=B8=D0=BA=D0=BB=D0=BE=D0=B3=D1=80=D0=B0?= =?UTF-8?q?=D0=BC=D0=BC=D0=B0,=20=D0=98=D0=BD=D0=B4=D0=B8=D0=BA=D0=B0?= =?UTF-8?q?=D1=82=D0=BE=D1=80,=20=D0=A2=D0=B0=D0=B1=D0=BB=D0=B8=D1=86?= =?UTF-8?q?=D0=B0,=20=D0=93=D1=80=D0=B0=D1=84=D0=B8=D0=BA)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 +++++ app/components/p8p_chart_hooks.js | 10 +++++++++- app/components/p8p_cyclogram_hooks.js | 10 +++++++++- app/components/p8p_data_grid_hooks.js | 9 ++++++--- app/components/p8p_data_grid_reducer.js | 8 ++++++-- app/components/p8p_gantt_hooks.js | 10 +++++++++- app/components/p8p_indicator_hooks.js | 10 +++++++++- 7 files changed, 53 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 1f2ba3d..f8e18bd 100644 --- a/README.md +++ b/README.md @@ -1541,6 +1541,7 @@ const MyPanel = () => { **Результат:** объект для работы с компонентом `P8PDataGrid`. Возвращаемый объект имеет следующие свойства:\ `dataGrid` - объект, хранит информацию о таблице, загруженной с помощью хранимой процедуры\ `isDataLoaded` - логический, признак успешной загрузки и обработки данных из хранимой процедуры\ +`isDataFound` - логический, признак наличия значимых сведений (бизнес-даных) в данных, полученных из хранимой процедуры\ `isLoading` - логический, признак выполнения загрузки данных из хранимой процедуры\ `handleFilterChanged` - функция, изменение состояния фильтров таблицы. Сигнатура функции `f({filters})`, результат функции не интерпретируется\ `handleOrderChanged` - функция, изменение состояния сортировок таблицы. Сигнатура функции `f({orders})`, результат функции не интерпретируется\ @@ -2005,6 +2006,7 @@ const MyPanel = () => { **Результат:** объект для работы с компонентом `P8PChart`. Возвращаемый объект имеет следующие свойства:\ `chart` - объект, хранит информацию о графике, загруженном с помощью хранимой процедуры\ `isDataLoaded` - логический, признак успешной загрузки и обработки данных из хранимой процедуры\ +`isDataFound` - логический, признак наличия значимых сведений (бизнес-даных) в данных, полученных из хранимой процедуры\ `isLoading` - логический, признак выполнения загрузки данных из хранимой процедуры\ `doReload` - функция, принудительное обновление данных графика, сигнатура функции `f()`, результат функции не интерпретируется @@ -2240,6 +2242,7 @@ const MyPanel = () => { **Результат:** объект для работы с компонентом `P8PGantt`. Возвращаемый объект имеет следующие свойства:\ `gantt` - объект, хранит информацию о диаграмме Ганта, загруженной с помощью хранимой процедуры\ `isDataLoaded` - логический, признак успешной загрузки и обработки данных из хранимой процедуры\ +`isDataFound` - логический, признак наличия значимых сведений (бизнес-даных) в данных, полученных из хранимой процедуры\ `isLoading` - логический, признак выполнения загрузки данных из хранимой процедуры\ `doReload` - функция, принудительное обновление данных диаграммы Ганта, сигнатура функции `f()`, результат функции не интерпретируется @@ -2731,6 +2734,7 @@ const MyPanel = () => { **Результат:** объект для работы с компонентом `P8PCyclogram`. Возвращаемый объект имеет следующие свойства:\ `cyclogram` - объект, хранит информацию о циклограмме, загруженной с помощью хранимой процедуры\ `isDataLoaded` - логический, признак успешной загрузки и обработки данных из хранимой процедуры\ +`isDataFound` - логический, признак наличия значимых сведений (бизнес-даных) в данных, полученных из хранимой процедуры\ `isLoading` - логический, признак выполнения загрузки данных из хранимой процедуры\ `doReload` - функция, принудительное обновление данных циклограммы, сигнатура функции `f()`, результат функции не интерпретируется @@ -3204,6 +3208,7 @@ const MyPanel = () => { **Результат:** объект для работы с компонентом `P8PIndicator`. Возвращаемый объект имеет следующие свойства:\ `indicator` - объект, хранит информацию об индикаторе, загруженном с помощью хранимой процедуры\ `isDataLoaded` - логический, признак успешной загрузки и обработки данных из хранимой процедуры\ +`isDataFound` - логический, признак наличия значимых сведений (бизнес-даных) в данных, полученных из хранимой процедуры\ `isLoading` - логический, признак выполнения загрузки данных из хранимой процедуры\ `doReload` - функция, принудительное обновление данных индикатора, сигнатура функции `f()`, результат функции не интерпретируется diff --git a/app/components/p8p_chart_hooks.js b/app/components/p8p_chart_hooks.js index 81226da..eeb5fd8 100644 --- a/app/components/p8p_chart_hooks.js +++ b/app/components/p8p_chart_hooks.js @@ -43,6 +43,9 @@ const useP8PChart = ({ //Собственное состояние - признак загрузки данных const [isDataLoaded, setIsDataLoaded] = useState(false); + //Собственное состояние - признак наличия бизнес-данных в загруженных + const [isDataFound, setIsDataFound] = useState(false); + //Собственное состояние - флаг загрузки const [isLoading, setLoading] = useState(false); @@ -66,8 +69,13 @@ const useP8PChart = ({ //Загрузка данных графика с сервера const loadData = useCallback(async () => { try { + //Поднимаем флаг начала загрузки данных setLoading(true); + //Получаем данные с сервера БД const data = await executeStored({ stored, respArg, args: { ...refStoredArgs.current }, ...refExecuteStoredArgs.current }); + //Устанавливаем флаг наличия бизнес-данных + setIsDataFound(data[contentNodeName]?.datasets?.[0]?.data?.length > 0); + //Устанавливаем бизнес-данные setChart(pv => ({ ...pv, ...data[contentNodeName] })); //Устанавливаем признак загрузки данных с учетом возможных ошибок setIsDataLoaded(!isRespErr(data)); @@ -126,7 +134,7 @@ const useP8PChart = ({ }, [isAllowDataLoad, reload, loadData]); //Возвращаем данные графика - return { chart, isDataLoaded, isLoading, doReload }; + return { chart, isDataLoaded, isDataFound, isLoading, doReload }; }; //---------------- diff --git a/app/components/p8p_cyclogram_hooks.js b/app/components/p8p_cyclogram_hooks.js index 70c56c3..3e49753 100644 --- a/app/components/p8p_cyclogram_hooks.js +++ b/app/components/p8p_cyclogram_hooks.js @@ -47,6 +47,9 @@ const useP8PCyclogram = ({ //Собственное состояние - признак загрузки данных const [isDataLoaded, setIsDataLoaded] = useState(false); + //Собственное состояние - признак наличия бизнес-данных в загруженных + const [isDataFound, setIsDataFound] = useState(false); + //Собственное состояние - флаг загрузки const [isLoading, setLoading] = useState(false); @@ -70,7 +73,9 @@ const useP8PCyclogram = ({ //Загрузка данных циклограммы с сервера const loadData = useCallback(async () => { try { + //Поднимаем флаг начала загрузки данных setLoading(true); + //Получаем данные с сервера БД const data = await executeStored({ stored, args: { ...refStoredArgs.current }, @@ -78,6 +83,9 @@ const useP8PCyclogram = ({ respArg, ...refExecuteStoredArgs.current }); + //Устанавливаем флаг наличия бизнес-данных + setIsDataFound(data[contentNodeName]?.tasks?.length > 0); + //Устанавливаем бизнес-данные setCyclogram(pv => ({ ...pv, ...data[contentNodeName] })); //Устанавливаем признак загрузки данных с учетом возможных ошибок setIsDataLoaded(!isRespErr(data)); @@ -135,7 +143,7 @@ const useP8PCyclogram = ({ }, [isAllowDataLoad, reload, loadData]); //Возвращаем данные циклограммы - return { cyclogram, isDataLoaded, isLoading, doReload }; + return { cyclogram, isDataLoaded, isDataFound, isLoading, doReload }; }; //---------------- diff --git a/app/components/p8p_data_grid_hooks.js b/app/components/p8p_data_grid_hooks.js index c7d5ad7..101eabc 100644 --- a/app/components/p8p_data_grid_hooks.js +++ b/app/components/p8p_data_grid_hooks.js @@ -10,6 +10,7 @@ import { useReducer, useCallback, useEffect, useContext, useRef, useMemo } from "react"; //Классы React import { BackEndCtx } from "../context/backend"; //Контекст взаимодействия с сервером import { object2Base64XML } from "../core/utils"; //Вспомогательные функции +import config from "../../app.config"; //Настройки приложения 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 FILTERS_NODE_NAME_DEF = "filters"; //Наименование узла отборов const ORDERS_NODE_NAME_DEF = "orders"; //Наименование узла сортировок @@ -85,8 +86,9 @@ const useP8PDataGrid = ({ //Загрузка данных таблицы с сервера const loadData = useCallback(async () => { try { - //Начинаем загрузку + //Поднимаем флаг начала загрузки данных setIsLoading(true); + //Получаем данные с сервера БД const data = await executeStored({ stored, args: { @@ -103,7 +105,7 @@ const useP8PDataGrid = ({ respArg, ...refExecuteStoredArgs.current }); - //Устанавливаем полученные данные и признак загрузки данных с учетом возможных ошибок + //Устанавливаем полученные бизнес-данные, признак загрузки данных с учетом возможных ошибок, признак наличия бизнес-данных setDataGrid(data[contentNodeName], pageSize, isRespErr(data)); } catch (e) { //Если произошла ошибка - данные не загружены @@ -189,6 +191,7 @@ const useP8PDataGrid = ({ return { dataGrid: state.dataGrid, isDataLoaded: state.isDataLoaded, + isDataFound: state.isDataFound, isLoading: state.isLoading, handleFilterChanged, handleOrderChanged, diff --git a/app/components/p8p_data_grid_reducer.js b/app/components/p8p_data_grid_reducer.js index 3ac9182..8069087 100644 --- a/app/components/p8p_data_grid_reducer.js +++ b/app/components/p8p_data_grid_reducer.js @@ -32,9 +32,10 @@ const INITIAL_STATE = ({ initFilters, initOrders }) => ({ pagesCount: 0, fixedColumns: 0, fixedHeader: false, - morePages: true + morePages: false }, isDataLoaded: false, + isDataFound: false, isLoading: false, reload: true }); @@ -65,7 +66,10 @@ const handlers = { : [...(state.dataGrid.groups || [])], 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) }; }, //Установка фильтра таблицы diff --git a/app/components/p8p_gantt_hooks.js b/app/components/p8p_gantt_hooks.js index 036b413..cc560ab 100644 --- a/app/components/p8p_gantt_hooks.js +++ b/app/components/p8p_gantt_hooks.js @@ -48,6 +48,9 @@ const useP8PGantt = ({ //Собственное состояние - признак загрузки данных const [isDataLoaded, setIsDataLoaded] = useState(false); + //Собственное состояние - признак наличия бизнес-данных в загруженных + const [isDataFound, setIsDataFound] = useState(false); + //Собственное состояние - флаг загрузки const [isLoading, setLoading] = useState(false); @@ -71,7 +74,9 @@ const useP8PGantt = ({ //Загрузка данных диаграммы ганта с сервера const loadData = useCallback(async () => { try { + //Поднимаем флаг начала загрузки данных setLoading(true); + //Получаем данные с сервера БД const data = await executeStored({ stored, args: { ...refStoredArgs.current }, @@ -80,6 +85,9 @@ const useP8PGantt = ({ respArg, ...refExecuteStoredArgs.current }); + //Устанавливаем флаг наличия бизнес-данных + setIsDataFound(data[contentNodeName]?.tasks?.length > 0); + //Устанавливаем бизнес-данные setGantt(pv => ({ ...pv, ...data[contentNodeName] })); //Устанавливаем признак загрузки данных с учетом возможных ошибок setIsDataLoaded(!isRespErr(data)); @@ -138,7 +146,7 @@ const useP8PGantt = ({ }, [isAllowDataLoad, reload, loadData]); //Возвращаем данные диаграммы ганта - return { gantt, isDataLoaded, isLoading, doReload }; + return { gantt, isDataLoaded, isDataFound, isLoading, doReload }; }; //---------------- diff --git a/app/components/p8p_indicator_hooks.js b/app/components/p8p_indicator_hooks.js index f208394..e495872 100644 --- a/app/components/p8p_indicator_hooks.js +++ b/app/components/p8p_indicator_hooks.js @@ -50,6 +50,9 @@ const useP8PIndicator = ({ //Собственное состояние - признак загрузки данных const [isDataLoaded, setIsDataLoaded] = useState(false); + //Собственное состояние - признак наличия бизнес-данных в загруженных + const [isDataFound, setIsDataFound] = useState(false); + //Собственное состояние - флаг загрузки const [isLoading, setLoading] = useState(false); @@ -73,8 +76,13 @@ const useP8PIndicator = ({ //Загрузка данных индикатора с сервера const loadData = useCallback(async () => { try { + //Поднимаем флаг начала загрузки данных setLoading(true); + //Получаем данные с сервера БД const data = await executeStored({ stored, respArg, args: { ...refStoredArgs.current }, ...refExecuteStoredArgs.current }); + //Устанавливаем флаг наличия бизнес-данных + setIsDataFound(data[contentNodeName]?.caption && data[contentNodeName]?.value != undefined); + //Устанавливаем бизнес-данные setIndicator(pv => ({ ...pv, ...data[contentNodeName] })); //Устанавливаем признак загрузки данных с учетом возможных ошибок setIsDataLoaded(!isRespErr(data)); @@ -133,7 +141,7 @@ const useP8PIndicator = ({ }, [isAllowDataLoad, reload, loadData]); //Возвращаем данные индикатора - return { indicator, isDataLoaded, isLoading, doReload }; + return { indicator, isDataLoaded, isDataFound, isLoading, doReload }; }; //----------------