import update from 'immutability-helper'; import { IReducerAction } from 'model/common.model'; import { ADMIN_APPEND_EXEC_RUNS, ADMIN_RECEIVE_DIM, ADMIN_RECEIVE_DIMS, ADMIN_RECEIVE_EXEC, ADMIN_RECEIVE_EXEC_CHANGES, ADMIN_RECEIVE_EXEC_DET, ADMIN_RECEIVE_EXEC_LASTRUN, ADMIN_RECEIVE_EXEC_RUNS, ADMIN_RECEIVE_EXECS, ADMIN_RECEIVE_PARAM, ADMIN_RECEIVE_PARAMS, ADMIN_REMOVE_DIM, ADMIN_REMOVE_EXEC, ADMIN_REMOVE_PARAM, ADMIN_TOGGLE_PARAM_MODAL, ADMIN_TOGGLE_DIM_MODAL, ADMIN_TOGGLE_EXEC_MODAL, } from 'kpi/constants'; import Execution from 'model/kpi/Execution'; import Page from 'model/Page'; import Dimension from 'model/kpi/Dimension'; import KPIParameter from 'model/kpi/KPIParameter'; import ApiCall from 'model/ApiCall'; import ExecutionDetails from 'model/kpi/ExecutionDetails'; import FilteredPage from 'model/FilteredPage'; import {ensureDimensionType} from 'utilities'; const INITIAL_STATE: { exec: { page: ApiCall>, details: ApiCall, changes: ApiCall, modalIsOpen: boolean, }, dim: { page: ApiCall>>, details: ApiCall>, modalIsOpen: boolean, }, param: { page: ApiCall>, details: ApiCall, modalIsOpen: boolean, }, } = { exec: { page: null, details: null, changes: null, modalIsOpen: false, }, dim: { page: null, details: null, modalIsOpen: false, }, param: { page: null, details: null, modalIsOpen: false, }, }; export default function admin(state = INITIAL_STATE, action: IReducerAction) { switch (action.type) { case ADMIN_RECEIVE_EXECS: { const {apiCall} = action.payload; return update(state, { exec: { page: { $set: apiCall } }, }); } case ADMIN_RECEIVE_EXEC: { const {apiCall} = action.payload; console.log(`ADMIN_RECEIVE_EXEC`, apiCall); const updates: any = { exec: {} }; if (state.exec.details) { if (apiCall.data) { if (state.exec.details.data && apiCall.data.id === state.exec.details.data.execution.id) { updates.exec.details = { data: { execution: { $set: apiCall.data } }, }; } else { updates.exec.details = { data: { execution: { $set: apiCall.data }, runs: { $set: null }, lastRun: { $set: null }, }, }; } } } if (apiCall.data && state.exec.page && state.exec.page.data) { // update page if exists const receivedIndex = apiCall.data ? state.exec.page.data.content.findIndex((item) => item.id === apiCall.data.id) : -1; if (receivedIndex !== -1) { updates.exec.page = { data: { content: { [receivedIndex]: { $set: apiCall.data } }, }, }; } else { updates.exec.page = { data: { content: {$push: [apiCall.data]}, }, }; } } return update(state, updates); } case ADMIN_REMOVE_EXEC: { const {apiCall} = action.payload; const toDeleteIndex = state.exec && state.exec.page && apiCall.data && state.exec.page.data.content ? state.exec.page.data.content.findIndex((item) => apiCall.data.name === item.name) : -1; return toDeleteIndex === -1 ? state : update(state, { exec: { page: { data: { content: {$splice: [[toDeleteIndex, 1]]}, }, }, details: {$set: null}, }, }); } case ADMIN_RECEIVE_EXEC_DET: { const {apiCall} = action.payload; return update(state, { exec: { details: { $set: apiCall }, changes: { $set: null } }, }); } case ADMIN_RECEIVE_EXEC_LASTRUN: { // only update lastRun const {apiCall} = action.payload; return update(state, { exec: { details: { lastRun: { $set: apiCall.data } } as any }, }); } case ADMIN_RECEIVE_EXEC_RUNS: { const { apiCall } = action.payload; return update(state, { exec: { details: { data: { runs: {$set: apiCall.data}, }, }, }, }); } case ADMIN_APPEND_EXEC_RUNS: { const { apiCall } = action.payload; return update(state, { exec: { details: { data: { runs: {$set: FilteredPage.merge(state.exec.details.data && state.exec.details.data.runs, apiCall.data)}, }, }, }, }); } case ADMIN_TOGGLE_EXEC_MODAL: { return update(state, { exec: { modalIsOpen: {$set: action.payload}, }, }); } case ADMIN_RECEIVE_DIMS: { const {apiCall} = action.payload; apiCall.data = apiCall.data && ensureDimensionType(apiCall.data) || apiCall.data; return update(state, { dim: { page: { $set: apiCall } }, }); } case ADMIN_RECEIVE_DIM: { const {apiCall} = action.payload; const updates: any = { dim: { details: {$set: apiCall}, }, }; if (apiCall.data && state.dim.page && state.dim.page.data) { const receivedIndex = apiCall.data ? state.dim.page.data.content.findIndex((item) => item.id === apiCall.data.id) : -1; if (receivedIndex !== -1) { updates.dim.page = { data: { content: { [receivedIndex]: { $set: apiCall.data } }, }, }; } else { updates.dim.page = { data: { content: {$push: [apiCall.data]}, }, }; } } return update(state, updates); } case ADMIN_REMOVE_DIM: { const {apiCall} = action.payload; const toDeleteIndex = state.dim && state.dim.page && state.dim.page.data && apiCall.data && state.dim.page.data.content ? state.dim.page.data.content.findIndex((item) => apiCall.data.name === item.name) : -1; return toDeleteIndex === -1 ? state : update(state, { dim: { page: { data: { content: {$splice: [[toDeleteIndex, 1]]}, }, }, details: {$set: null}, }, }); } case ADMIN_TOGGLE_DIM_MODAL: { return update(state, { dim: { modalIsOpen: {$set: action.payload}, }, }); } case ADMIN_RECEIVE_PARAMS: { const {apiCall} = action.payload; return update(state, { param: { page: { $set: apiCall } }, }); } case ADMIN_RECEIVE_PARAM: { const {apiCall} = action.payload; const updates: any = { param: { details: {$set: apiCall}, }, }; // console.log(`Received param update`, apiCall); if (apiCall.data && state.param.page && state.param.page.data) { const receivedIndex = apiCall.data ? state.param.page.data.content.findIndex((item) => item.id === apiCall.data.id) : -1; if (receivedIndex !== -1) { updates.param.page = { data: { content: { [receivedIndex]: { $set: apiCall.data } }, }, }; } else { updates.param.page = { data: { content: {$push: [apiCall.data]}, }, }; } } return update(state, updates); } case ADMIN_REMOVE_PARAM: { const {apiCall} = action.payload; const toDeleteIndex = state.param && state.param.page && state.param.page.data && state.param.page.data.content && apiCall.data ? state.param.page.data.content.findIndex((item) => apiCall.data.name === item.name) : -1; return toDeleteIndex === -1 ? state : update(state, { param: { page: { data: { content: {$splice: [[toDeleteIndex, 1]]}, }, }, details: {$set: null}, }, }); } case ADMIN_RECEIVE_EXEC_CHANGES: { const {apiCall} = action.payload; return update(state, { exec: { changes: {$set: apiCall}, }, }); } case ADMIN_TOGGLE_PARAM_MODAL: { return update(state, { param: { modalIsOpen: {$set: action.payload}, }, }); } default: return state; } }