111 lines
No EOL
3.1 KiB
JavaScript
111 lines
No EOL
3.1 KiB
JavaScript
import { List, Map } from 'immutable';
|
|
import { fetchType, editType } from './funcTools/crud';
|
|
import { createRequestReducer } from './funcTools/request';
|
|
import { mergeReducers } from './funcTools/tools';
|
|
import Filter from 'Types/filter';
|
|
import { fetchList as fetchSessionList } from './sessions';
|
|
import { liveFiltersMap } from 'Types/filter/newFilter';
|
|
import { filterMap, checkFilterValue, hasFilterApplied } from './search';
|
|
|
|
const name = "liveSearch";
|
|
const idKey = "searchId";
|
|
|
|
const FETCH = fetchType(name);
|
|
const EDIT = editType(name);
|
|
const CLEAR_SEARCH = `${name}/CLEAR_SEARCH`;
|
|
const APPLY = `${name}/APPLY`;
|
|
const UPDATE_CURRENT_PAGE = `${name}/UPDATE_CURRENT_PAGE`;
|
|
const TOGGLE_SORT_ORDER = `${name}/TOGGLE_SORT_ORDER`;
|
|
|
|
const initialState = Map({
|
|
list: List(),
|
|
instance: new Filter({ filters: [] }),
|
|
filterSearchList: {},
|
|
currentPage: 1,
|
|
sortOrder: 'asc',
|
|
});
|
|
|
|
function reducer(state = initialState, action = {}) {
|
|
switch (action.type) {
|
|
case EDIT:
|
|
return state.mergeIn(['instance'], action.instance);
|
|
case UPDATE_CURRENT_PAGE:
|
|
return state.set('currentPage', action.page);
|
|
case TOGGLE_SORT_ORDER:
|
|
return state.set('sortOrder', action.order);
|
|
}
|
|
return state;
|
|
}
|
|
|
|
export default mergeReducers(
|
|
reducer,
|
|
createRequestReducer({
|
|
fetch: FETCH,
|
|
}),
|
|
);
|
|
|
|
const reduceThenFetchResource = actionCreator => (...args) => (dispatch, getState) => {
|
|
dispatch(actionCreator(...args));
|
|
const filter = getState().getIn([ 'search', 'instance']).toData();
|
|
filter.filters = filter.filters.map(filterMap);
|
|
|
|
return dispatch(fetchSessionList(filter));
|
|
};
|
|
|
|
export const edit = (instance) => ({
|
|
type: EDIT,
|
|
instance,
|
|
});
|
|
|
|
export const applyFilter = reduceThenFetchResource((filter, fromUrl=false) => ({
|
|
type: APPLY,
|
|
filter,
|
|
fromUrl,
|
|
}));
|
|
|
|
export const fetchSessions = (filter) => (dispatch, getState) => {
|
|
const _filter = filter ? filter : getState().getIn([ 'search', 'instance']);
|
|
return dispatch(applyFilter(_filter));
|
|
};
|
|
|
|
export const clearSearch = () => (dispatch, getState) => {
|
|
dispatch(edit(new Filter({ filters: [] })));
|
|
return dispatch({
|
|
type: CLEAR_SEARCH,
|
|
});
|
|
}
|
|
|
|
export const addFilter = (filter) => (dispatch, getState) => {
|
|
filter.value = checkFilterValue(filter.value);
|
|
const instance = getState().getIn([ 'liveSearch', 'instance']);
|
|
|
|
if (hasFilterApplied(instance.filters, filter)) {
|
|
// const index = instance.filters.findIndex(f => f.key === filter.key);
|
|
// const oldFilter = instance.filters.get(index);
|
|
// oldFilter.value = oldFilter.value.concat(filter.value);
|
|
// return dispatch(edit(instance.setIn(['filters', index], oldFilter)));
|
|
} else {
|
|
const filters = instance.filters.push(filter);
|
|
return dispatch(edit(instance.set('filters', filters)));
|
|
}
|
|
}
|
|
|
|
export const addFilterByKeyAndValue = (key, value) => (dispatch, getState) => {
|
|
let defaultFilter = liveFiltersMap[key];
|
|
defaultFilter.value = value;
|
|
dispatch(addFilter(defaultFilter));
|
|
}
|
|
|
|
export function updateCurrentPage(page) {
|
|
return {
|
|
type: UPDATE_CURRENT_PAGE,
|
|
page,
|
|
};
|
|
}
|
|
|
|
export function toggleSortOrder (order) {
|
|
return {
|
|
type: TOGGLE_SORT_ORDER,
|
|
order,
|
|
};
|
|
} |