forked from CITKParus/P8-Panels
113 lines
4.7 KiB
JavaScript
113 lines
4.7 KiB
JavaScript
/*
|
||
Парус 8 - Панели мониторинга
|
||
Таблица данных - редьюсер состояния
|
||
*/
|
||
|
||
//---------
|
||
//Константы
|
||
//---------
|
||
|
||
//Типы действий
|
||
const DG_AT = {
|
||
SET_DATA_GRID: "SET_DATA_GRID", //Установка даных таблицы
|
||
SET_DATA_GRID_FILTER: "SET_DATA_GRID_FILTER", //Установка фильтра таблицы
|
||
SET_DATA_GRID_ORDER: "SET_DATA_GRID_ORDER", //Установка сортировок таблицы
|
||
SET_DATA_GRID_PAGE_NUMBER: "SET_DATA_GRID_PAGE_NUMBER", //Установка страницы таблицы
|
||
SET_IS_DATA_LOADED: "SET_IS_DATA_LOADED", //Установка флага загруженности данных
|
||
SET_IS_LOADING: "SET_IS_LOADING", //Установка флага активности процесса загрузки данных
|
||
SET_RELOAD: "SET_RELOAD" //Установка флага необходимости обновления данных
|
||
};
|
||
|
||
//Состояние приложения по умолчанию
|
||
const INITIAL_STATE = ({ initFilters, initOrders }) => ({
|
||
dataGrid: {
|
||
columnsDef: [],
|
||
groups: [],
|
||
rows: [],
|
||
filters: Array.isArray(initFilters) ? [...initFilters] : [],
|
||
orders: Array.isArray(initOrders) ? [...initOrders] : [],
|
||
pageNumber: 1,
|
||
pagesAlign: null,
|
||
pagesPosition: null,
|
||
pagesCount: 0,
|
||
fixedColumns: 0,
|
||
fixedHeader: false,
|
||
morePages: true
|
||
},
|
||
isDataLoaded: false,
|
||
isLoading: false,
|
||
reload: true
|
||
});
|
||
|
||
//-----------
|
||
//Тело модуля
|
||
//-----------
|
||
|
||
//Обработчики действий
|
||
const handlers = {
|
||
//Установка даных таблицы
|
||
[DG_AT.SET_DATA_GRID]: (state, { payload }) => {
|
||
const { dataGridData, pageSize, isError } = payload;
|
||
return {
|
||
...state,
|
||
dataGrid: {
|
||
...state.dataGrid,
|
||
...dataGridData,
|
||
columnsDef: dataGridData.columnsDef ? [...dataGridData.columnsDef] : state.dataGrid.columnsDef || [],
|
||
rows:
|
||
dataGridData.pagesCount > 0 || state.dataGrid.pageNumber == 1
|
||
? [...(dataGridData.rows || [])]
|
||
: [...(state.dataGrid.rows || []), ...(dataGridData.rows || [])],
|
||
groups: dataGridData.groups
|
||
? dataGridData.pagesCount > 0 || state.dataGrid.pageNumber == 1
|
||
? [...(dataGridData.groups || [])]
|
||
: [...(state.dataGrid.groups || []), ...dataGridData.groups.filter(g => !state.dataGrid.groups.find(pg => pg.name == g.name))]
|
||
: [...(state.dataGrid.groups || [])],
|
||
morePages: dataGridData.morePages && (dataGridData.rows || []).length >= pageSize
|
||
},
|
||
isDataLoaded: isError === true ? false : true
|
||
};
|
||
},
|
||
//Установка фильтра таблицы
|
||
[DG_AT.SET_DATA_GRID_FILTER]: (state, { payload }) => ({
|
||
...state,
|
||
dataGrid: { ...state.dataGrid, filters: [...payload], pageNumber: 1 },
|
||
reload: true
|
||
}),
|
||
//Установка сортировок таблицы
|
||
[DG_AT.SET_DATA_GRID_ORDER]: (state, { payload }) => ({
|
||
...state,
|
||
dataGrid: { ...state.dataGrid, orders: [...payload], pageNumber: 1 },
|
||
reload: true
|
||
}),
|
||
//Установка страницы таблицы
|
||
[DG_AT.SET_DATA_GRID_PAGE_NUMBER]: (state, { payload }) => ({ ...state, dataGrid: { ...state.dataGrid, pageNumber: payload }, reload: true }),
|
||
//Установка флага загруженности данных
|
||
[DG_AT.SET_IS_DATA_LOADED]: (state, { payload }) => ({ ...state, isDataLoaded: payload }),
|
||
//Установка флага активности процесса загрузки данных
|
||
[DG_AT.SET_IS_LOADING]: (state, { payload }) => ({ ...state, isLoading: payload, reload: payload === false ? false : state.reload }),
|
||
//Установка флага необходимости обновления данных
|
||
[DG_AT.SET_RELOAD]: (state, { payload }) => ({
|
||
...state,
|
||
reload: payload.reload,
|
||
...(payload.resetPageNumber ? { dataGrid: { ...state.dataGrid, pageNumber: 1 } } : {})
|
||
}),
|
||
//Обработчик по умолчанию
|
||
DEFAULT: state => state
|
||
};
|
||
|
||
//----------------
|
||
//Интерфейс модуля
|
||
//----------------
|
||
|
||
//Константы
|
||
export { DG_AT, INITIAL_STATE };
|
||
|
||
//Редьюсер состояния
|
||
export const dataGridReducer = (state, action) => {
|
||
//Подберём обработчик
|
||
const handle = handlers[action.type] || handlers.DEFAULT;
|
||
//Исполним его
|
||
return handle(state, action);
|
||
};
|