at the end of the day, it was inevitable
This commit is contained in:
@@ -0,0 +1,220 @@
|
||||
/** ----------------CONSTANTS---------------- **/
|
||||
import {createAction, handleActions} from 'redux-actions'
|
||||
import {fromJS, Map} from 'immutable'
|
||||
|
||||
import {getSavedAnalysesApi, deleteSavedAnalysesApi} from '../../../api/analyticApi'
|
||||
import {thunkAction, tokenInject} from '../../utils/common'
|
||||
|
||||
const GET_RECENT_ANALYSIS = 'GET_RECENT_ANALYSIS'
|
||||
|
||||
const CONFIRM_DELETE_ANALYSES = 'CONFIRM_DELETE_ANALYSES'
|
||||
const CANCEL_DELETE_ANALYSES = 'CANCEL_DELETE_ANALYSES'
|
||||
const DELETE_ANALYSES = 'DELETE_ANALYSES'
|
||||
|
||||
const SELECT_TABLE_ROW = 'SELECT_ANALYSES_TABLE_ROW'
|
||||
const SELECT_ALL_ROWS = 'SELECT_ANALYSES_TABLE_ALL_ROWS'
|
||||
const SET_TABLE_PARAMS = 'SET_ANALYSES_TABLE_PARAMS'
|
||||
const RELOAD_TABLE = 'RELOAD_ANALYSES_TABLE'
|
||||
|
||||
const TOGGLE_SIDEBAR = 'TOGGLE_SIDEBAR'
|
||||
|
||||
/** -------------ACTIONS------------------------ **/
|
||||
|
||||
const getRecentAnalysis = thunkAction(GET_RECENT_ANALYSIS, ({token, fulfilled}) => {
|
||||
return getSavedAnalysesApi(token, {sort: 'id'}).then(fulfilled)
|
||||
})
|
||||
|
||||
const confirmDeleteAnalyses = createAction(CONFIRM_DELETE_ANALYSES, (idsArray) => idsArray)
|
||||
const cancelDeleteAnalyses = createAction(CANCEL_DELETE_ANALYSES)
|
||||
const deleteSavedAnalysesPending = () => {
|
||||
return {type: DELETE_ANALYSES + '_PENDING'}
|
||||
}
|
||||
|
||||
const deleteSavedAnalysesFulfilled = (payload) => {
|
||||
return {type: DELETE_ANALYSES + '_FULFILLED', payload}
|
||||
}
|
||||
|
||||
const deleteSavedAnalyses = () => {
|
||||
return tokenInject((dispatch, getState, token) => {
|
||||
dispatch(deleteSavedAnalysesPending())
|
||||
const tableState = getState().getIn(['appState', 'analyzeTab', 'tableState']).toJS()
|
||||
deleteSavedAnalysesApi(
|
||||
token, tableState.idsToDelete
|
||||
).then(() => {
|
||||
return getSavedAnalysesApi(token, {
|
||||
page: tableState.currentPage,
|
||||
limit: tableState.limitByPage,
|
||||
sort: tableState.sortByField,
|
||||
direction: tableState.sortDirection
|
||||
})
|
||||
}).then((data) => {
|
||||
dispatch(deleteSavedAnalysesFulfilled(data))
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
Change table page or sort state
|
||||
params = {currentPage, limitByPage, sortField, sortDirection}
|
||||
*/
|
||||
const setAnalysesTableParams = createAction(SET_TABLE_PARAMS, (params) => params)
|
||||
const selectAnalysesTableRow = createAction(SELECT_TABLE_ROW, (itemId) => itemId)
|
||||
const selectAnalysesTableAllRows = createAction(SELECT_ALL_ROWS)
|
||||
|
||||
const reloadAnalysesTablePending = () => {
|
||||
return {type: RELOAD_TABLE + '_PENDING'}
|
||||
}
|
||||
|
||||
const reloadAnalysesTableFulfilled = (payload) => {
|
||||
return {type: RELOAD_TABLE + '_FULFILLED', payload}
|
||||
}
|
||||
|
||||
const reloadAnalysesTable = (params) => {
|
||||
return tokenInject((dispatch, getState, token) => {
|
||||
dispatch(reloadAnalysesTablePending())
|
||||
dispatch(setAnalysesTableParams(params))
|
||||
const state = getState().getIn(['appState', 'analyzeTab', 'tableState']).toJS()
|
||||
getSavedAnalysesApi(token, {
|
||||
page: state.currentPage,
|
||||
limit: state.limitByPage,
|
||||
sort: state.sortByField,
|
||||
direction: state.sortDirection
|
||||
}).then((data) => {
|
||||
dispatch(reloadAnalysesTableFulfilled(data))
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
export const actions = {
|
||||
getRecentAnalysis,
|
||||
confirmDeleteAnalyses,
|
||||
cancelDeleteAnalyses,
|
||||
deleteSavedAnalyses,
|
||||
setAnalysesTableParams,
|
||||
selectAnalysesTableAllRows,
|
||||
selectAnalysesTableRow,
|
||||
reloadAnalysesTable
|
||||
}
|
||||
|
||||
/** -----------STATE--------- **/
|
||||
|
||||
export const initialState = fromJS({
|
||||
//for welcome tab
|
||||
recentAnalysis: [],
|
||||
isRecentAnalysisPending: false,
|
||||
//for saved tab
|
||||
isSidebarVisible: true,
|
||||
sidebarState: {
|
||||
isRecentlyViewedPending: true,
|
||||
recentlyViewed: []
|
||||
},
|
||||
tableState: {
|
||||
currentPage: 1,
|
||||
limitByPage: 10,
|
||||
sortByField: 'id',
|
||||
sortDirection: 'asc',
|
||||
data: [],
|
||||
count: 0,
|
||||
totalCount: 0,
|
||||
isLoading: true,
|
||||
isDeletePopupVisible: false,
|
||||
idsToDelete: [],
|
||||
selectedIds: {}, //map of ids of items that selected in table
|
||||
isAllSelected: false
|
||||
}
|
||||
})
|
||||
|
||||
/** -----------HANDLERS--------------- **/
|
||||
|
||||
export default handleActions({
|
||||
[`${GET_RECENT_ANALYSIS}_PENDING`]: (state) => {
|
||||
return state.merge({
|
||||
recentAnalysis: [],
|
||||
isRecentAnalysisPending: true
|
||||
})
|
||||
},
|
||||
|
||||
[`${GET_RECENT_ANALYSIS}_FULFILLED`]: (state, {payload}) => {
|
||||
return state.merge({
|
||||
recentAnalysis: payload.data,
|
||||
isRecentAnalysisPending: false
|
||||
})
|
||||
},
|
||||
|
||||
[CONFIRM_DELETE_ANALYSES]: (state, {payload: idsArray}) => {
|
||||
return state.mergeIn(['tableState'], {
|
||||
isDeletePopupVisible: true,
|
||||
idsToDelete: idsArray
|
||||
})
|
||||
},
|
||||
|
||||
[CANCEL_DELETE_ANALYSES]: (state) => {
|
||||
return state.mergeIn(['tableState'], {
|
||||
isDeletePopupVisible: false,
|
||||
idsToDelete: []
|
||||
})
|
||||
},
|
||||
|
||||
[`${DELETE_ANALYSES}_PENDING`]: (state) => {
|
||||
return state.mergeIn(['tableState'], {
|
||||
isDeletePopupVisible: false,
|
||||
isLoading: true
|
||||
})
|
||||
},
|
||||
|
||||
[`${DELETE_ANALYSES}_FULFILLED`]: (state, {payload}) => {
|
||||
return state.mergeIn(['tableState'], {
|
||||
data: payload.data,
|
||||
count: payload.count,
|
||||
totalCount: payload.totalCount,
|
||||
isLoading: false
|
||||
})
|
||||
},
|
||||
|
||||
[SET_TABLE_PARAMS]: (state, {payload: tableState}) => {
|
||||
return state.mergeIn(['tableState'], tableState)
|
||||
},
|
||||
|
||||
[SELECT_TABLE_ROW]: (state, {payload: {itemId, select}}) => {
|
||||
const path = ['tableState', 'selectedIds', itemId.toString()]
|
||||
return select ? state.setIn(path, 1) : state.deleteIn(path)
|
||||
},
|
||||
|
||||
[SELECT_ALL_ROWS]: (state) => {
|
||||
const isAllSelected = state.getIn(['tableState', 'isAllSelected'])
|
||||
|
||||
if (isAllSelected) { //then deselect all
|
||||
return state.mergeIn(['tableState'], {
|
||||
isAllSelected: false,
|
||||
selectedIds: {}
|
||||
})
|
||||
} else { //select all currently loaded data
|
||||
let selectedIds = {}
|
||||
const data = state.getIn(['tableState', 'data']).toJS()
|
||||
data.forEach((item) => { selectedIds[item.id.toString()] = 1 })
|
||||
return state.mergeIn(['tableState'], {
|
||||
isAllSelected: true,
|
||||
selectedIds: selectedIds
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
[`${RELOAD_TABLE}_PENDING`]: (state, {payload: params}) => {
|
||||
return state.setIn(['tableState', 'selectedIds'], Map({})).setIn(['tableState', 'isLoading'], true)
|
||||
},
|
||||
|
||||
[`${RELOAD_TABLE}_FULFILLED`]: (state, {payload}) => {
|
||||
return state.mergeIn(['tableState'], {
|
||||
data: payload.data,
|
||||
count: payload.count,
|
||||
totalCount: payload.totalCount,
|
||||
isLoading: false
|
||||
})
|
||||
},
|
||||
|
||||
[TOGGLE_SIDEBAR]: (state, {payload}) => {
|
||||
const isVisible = !state.get('isSidebarVisible')
|
||||
return state.set('isSidebarVisible', isVisible)
|
||||
}
|
||||
|
||||
}, initialState)
|
||||
Reference in New Issue
Block a user