/* Парус 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: false }, isDataLoaded: false, isDataFound: 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, isDataFound: (state.dataGrid.pageNumber == 1 && dataGridData?.rows?.length > 0) || (state.dataGrid.pageNumber != 1 && state.dataGrid.rows.length > 0) }; }, //Установка фильтра таблицы [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); };