UNPKG

extpoint-yii2

Version:

JavaScript part for projects on ExtPoint Yii2 Boilerplate and yii2-core

136 lines (122 loc) 4.67 kB
import _filter from 'lodash-es/filter'; import _every from 'lodash-es/every'; import _extend from 'lodash-es/extend'; import {LIST_BEFORE_FETCH, LIST_AFTER_FETCH, LIST_ITEM_UPDATE, LIST_REMOVE, LIST_TOGGLE_ITEM, LIST_TOGGLE_ALL} from '../actions/list'; export default (state = {}, action) => { switch (action.type) { case LIST_BEFORE_FETCH: return { ...state, [action.id]: { meta: {}, checkedIds: {}, total: action.items ? action.items.length : 0, hasPagination: false, ...(state[action.id] || {}), ...action, items: action.items ? [].concat(action.items) : state[action.id] && state[action.id].items || null, isFetched: !!action.items || !!state[action.id], isLoading: !action.items, } }; case LIST_AFTER_FETCH: let items = []; const list = state[action.id]; if (list && list.items && list.loadMore && list.page > 1) { items = [].concat(list.items); action.items.forEach((entry, i) => { const index = ((list.page - 1) * list.pageSize) + i; items[index] = entry; }); } else { items = [].concat(action.items); } return { ...state, [action.id]: { ...list, ...action, items, isFetched: true, isLoading: false, } }; case LIST_ITEM_UPDATE: const list2 = state[action.id]; const items2 = list2 && list2.items || []; _filter(items2, action.where).forEach((item, index) => { // Update old object, fix saved it in comet collection (if used) _extend(item, action.item); items2[items2.indexOf(item)] = { ...item, ...action.item, }; }); return { ...state, [action.id]: { ...list2, items: [].concat(items2), } }; case LIST_REMOVE: delete state[action.id]; return { ...state }; case LIST_TOGGLE_ITEM: const list3 = state[action.id]; if (list3) { const checkedIds = list3.checkedIds || {}; return { ...state, [action.id]: { ...list3, checkedIds: { ...checkedIds, [action.itemId]: !checkedIds[action.itemId], }, }, }; } break; case LIST_TOGGLE_ALL: const list4 = state[action.id]; if (list4) { const ids = list4.items.map(item => item[list4.primaryKey]) || []; const isAll = _every(ids.map(id => list4.checkedIds[id])); return { ...state, [action.id]: { ...list4, checkedIds: ids.reduce((obj, id) => { obj[id] = !isAll; return obj; }, {}), }, }; } break; } return state; }; export const getList = (state, id) => state.list[id] || null; export const getEntry = (state, listId, itemId) => { const list = state.list[listId]; return list && list.items.find(item => item[list.primaryKey] === itemId) || null; }; export const getIds = (state, listId) => { const list = state.list[listId]; return list && list.items.map(item => item[list.primaryKey]) || []; }; export const getCheckedIds = (state, listId) => { const list = state.list[listId]; const checkedIds = list && list.checkedIds || {}; return Object.keys(checkedIds).filter(id => checkedIds[id]); }; export const isCheckedAll = (state, listId) => { const list = state.list[listId]; return _every(getIds(state, listId).map(id => list.checkedIds[id])); };