var DBG = DBG || false; var DBG1 = true; if (!global.p5VendorJs) throw "Missing p5 Vendor js libs"; if (!global.p5VendorJs.Redux) throw "Missing p5 Vendor js lib: Redux"; var Redux = global.p5VendorJs.Redux; var ReduxThunk = global.p5VendorJs.ReduxThunk; var createStoreWithThunkMiddleware = Redux.applyMiddleware(ReduxThunk)(Redux.createStore); // TODO: to vendor.js function createFilterStoreWithInitialData(initialFilter) { DBG && console.log('INIT: initialFilter', { initialFilter }); var initialState = { isLoading: false, isEmpty: true, filter: new Map(), specialFilter: new Map(), currSortCol: '', currSortFlip: false } Object.keys(initialFilter).forEach(function (key) { switch (key) { case 'currSortCol': initialState.currSortCol = initialFilter['currSortCol']; break; case 'currSortFlip': initialState.currSortFlip = _convertCurrSortFilp(initialFilter['currSortFlip']); break; default: { if ('f_' === key.substr(0, 2)) { initialState.filter.set(key.substr(2), initialFilter[key]) } else if ('sf_' === key.substr(0, 3)) { initialState.specialFilter.set(key.substr(3), initialFilter[key]) } else { DBG && console.log('TODO: unsupported filter "' + key + '"') } } } }) return function filterStore(state, action) { var prevState = state || initialState; DBG && console.warn('DBG:filterStore:' + action.type, action); switch (action.type) { // case 'SET_FILTER': return fixFilterState(Object.assign({}, prevState, { // filter: Object.assign(prevState.filter, { // [action.fieldName]: action.value // }) // })); case 'TOGGLE_SORT': { return Object.assign(prevState, { currSortCol: action.fieldName, currSortFlip: !prevState.currSortFlip }) } case 'SET_FILTER': { if (action.value) { prevState.filter.set(action.fieldName, action.value); } else { prevState.filter.delete(action.fieldName); } return Object.assign(prevState, { isEmpty: (0 === prevState.specialFilter.size && 0 === prevState.filter.size) }) } case 'SET_SPECIAL_FILTER': { if (action.value) { prevState.specialFilter.set(action.fieldName, action.value); } else { prevState.specialFilter.delete(action.fieldName); } return Object.assign(prevState, { isEmpty: (0 === prevState.specialFilter.size && 0 === prevState.filter.size) }) } case 'CLEAR_ALL_FILTERS': { prevState.filter.clear(); prevState.specialFilter.clear(); return Object.assign(prevState, { isLoading: false, isEmpty: true, currSortCol: initialFilter.currSortCol ? initialFilter.currSortCol : '', currSortFlip: initialFilter.currSortFlip ? _convertCurrSortFilp(initialFilter.currSortFlip) : true, }); } case 'SET_LOADING': return Object.assign(prevState, { // TODO: is loading for filter store or another store for rows? isLoading: true }); case 'UNSET_LOADING': return Object.assign(prevState, { isLoading: false }); default: return prevState; } } } function _convertCurrSortFilp(flip) { switch (flip) { case 'desc': return true; case 'asc': return false; default: return Boolean(flip) } } function filterActions() { var delay = 450; var _filterTimeout = {}; var _clearTimer = function (fieldName) { if (_filterTimeout[fieldName]) { clearTimeout(_filterTimeout[fieldName]); } } var _clearAllTimers = function () { Object.keys(_filterTimeout).forEach(_clearTimer); } function clearAllFilters() { DBG && console.log('DBG:filterStore:clearAllFilters'); _clearAllTimers(); return { type: 'CLEAR_ALL_FILTERS' }; } function toggleSort(fieldName) { DBG && console.log('DBG:filterStore:toggleSort', { fieldName }); return { type: 'TOGGLE_SORT', fieldName: fieldName }; } function setFilter(fieldName, value) { DBG && console.log('DBG:filterStore:setFilter', { fieldName, value }); return { type: 'SET_FILTER', fieldName: fieldName, value: value }; } function setSpecialFilter(fieldName, value) { DBG && console.log('DBG:filterStore:setSpecialFilter', { fieldName, value }); return { type: 'SET_SPECIAL_FILTER', fieldName: fieldName, value: value }; } function delayFilter(fieldName, value) { DBG && console.log('DBG:filterStore:delayFilter', { fieldName, value }); return function(dispatch, getState) { // var state = getState(); // dispatch(setLoading(primaryKey)); return new Promise(function (resolve, reject) { DBG && console.log('DBG:filterStore:delayFilter::#1', { fieldName, value }); _clearTimer(fieldName); _filterTimeout[fieldName] = setTimeout(function () { // reject("Error"); resolve(value); }, delay); }).then(function (value) { DBG && console.log('DBG:filterStore:delayFilter::#3 resolve ', { fieldName, value }); dispatch( { type: 'SET_FILTER', fieldName: fieldName, value: value } ); }).catch(function (e) { p5UI__notifyAjaxCallback({type: 'error', msg: 'Wystąpił błąd #TA6: ' + e}); }) } } return { setFilter: setFilter, setSpecialFilter: setSpecialFilter, delayFilter: delayFilter, clearAllFilters: clearAllFilters, toggleSort: toggleSort, } } function createTableFiltersStateObject(initialData) { var _initialData = initialData || {}; var store = createStoreWithThunkMiddleware( createFilterStoreWithInitialData( _initialData ) ); return { store: store, actions: filterActions() } } global.createTableFiltersStateObject = createTableFiltersStateObject;