221 lines
6.3 KiB
JavaScript
221 lines
6.3 KiB
JavaScript
/** ----------------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)
|