TableAjax.php.createTableFiltersStateObject.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. var DBG = DBG || false;
  2. var DBG1 = true;
  3. if (!global.p5VendorJs) throw "Missing p5 Vendor js libs";
  4. if (!global.p5VendorJs.Redux) throw "Missing p5 Vendor js lib: Redux";
  5. var Redux = global.p5VendorJs.Redux;
  6. var ReduxThunk = global.p5VendorJs.ReduxThunk;
  7. var createStoreWithThunkMiddleware = Redux.applyMiddleware(ReduxThunk)(Redux.createStore); // TODO: to vendor.js
  8. function createFilterStoreWithInitialData(initialFilter) {
  9. DBG && console.log('INIT: initialFilter', { initialFilter });
  10. var initialState = {
  11. isLoading: false,
  12. isEmpty: true,
  13. filter: new Map(),
  14. specialFilter: new Map(),
  15. currSortCol: '',
  16. currSortFlip: false
  17. }
  18. Object.keys(initialFilter).forEach(function (key) {
  19. switch (key) {
  20. case 'currSortCol': initialState.currSortCol = initialFilter['currSortCol']; break;
  21. case 'currSortFlip': initialState.currSortFlip = _convertCurrSortFilp(initialFilter['currSortFlip']); break;
  22. default: {
  23. if ('f_' === key.substr(0, 2)) {
  24. initialState.filter.set(key.substr(2), initialFilter[key])
  25. } else if ('sf_' === key.substr(0, 3)) {
  26. initialState.specialFilter.set(key.substr(3), initialFilter[key])
  27. } else {
  28. DBG && console.log('TODO: unsupported filter "' + key + '"')
  29. }
  30. }
  31. }
  32. })
  33. return function filterStore(state, action) {
  34. var prevState = state || initialState;
  35. DBG && console.warn('DBG:filterStore:' + action.type, action);
  36. switch (action.type) {
  37. // case 'SET_FILTER': return fixFilterState(Object.assign({}, prevState, {
  38. // filter: Object.assign(prevState.filter, {
  39. // [action.fieldName]: action.value
  40. // })
  41. // }));
  42. case 'TOGGLE_SORT': {
  43. return Object.assign(prevState, {
  44. currSortCol: action.fieldName,
  45. currSortFlip: !prevState.currSortFlip
  46. })
  47. }
  48. case 'SET_FILTER': {
  49. if (action.value) {
  50. prevState.filter.set(action.fieldName, action.value);
  51. } else {
  52. prevState.filter.delete(action.fieldName);
  53. }
  54. return Object.assign(prevState, {
  55. isEmpty: (0 === prevState.specialFilter.size && 0 === prevState.filter.size)
  56. })
  57. }
  58. case 'SET_SPECIAL_FILTER': {
  59. if (action.value) {
  60. prevState.specialFilter.set(action.fieldName, action.value);
  61. } else {
  62. prevState.specialFilter.delete(action.fieldName);
  63. }
  64. return Object.assign(prevState, {
  65. isEmpty: (0 === prevState.specialFilter.size && 0 === prevState.filter.size)
  66. })
  67. }
  68. case 'CLEAR_ALL_FILTERS': {
  69. prevState.filter.clear();
  70. prevState.specialFilter.clear();
  71. return Object.assign(prevState, {
  72. isLoading: false, isEmpty: true,
  73. currSortCol: initialFilter.currSortCol ? initialFilter.currSortCol : '',
  74. currSortFlip: initialFilter.currSortFlip ? _convertCurrSortFilp(initialFilter.currSortFlip) : true,
  75. });
  76. }
  77. case 'SET_LOADING': return Object.assign(prevState, { // TODO: is loading for filter store or another store for rows?
  78. isLoading: true
  79. });
  80. case 'UNSET_LOADING': return Object.assign(prevState, {
  81. isLoading: false
  82. });
  83. default: return prevState;
  84. }
  85. }
  86. }
  87. function _convertCurrSortFilp(flip) {
  88. switch (flip) {
  89. case 'desc': return true;
  90. case 'asc': return false;
  91. default: return Boolean(flip)
  92. }
  93. }
  94. function filterActions() {
  95. var delay = 450;
  96. var _filterTimeout = {};
  97. var _clearTimer = function (fieldName) {
  98. if (_filterTimeout[fieldName]) {
  99. clearTimeout(_filterTimeout[fieldName]);
  100. }
  101. }
  102. var _clearAllTimers = function () {
  103. Object.keys(_filterTimeout).forEach(_clearTimer);
  104. }
  105. function clearAllFilters() {
  106. DBG && console.log('DBG:filterStore:clearAllFilters');
  107. _clearAllTimers();
  108. return { type: 'CLEAR_ALL_FILTERS' };
  109. }
  110. function toggleSort(fieldName) {
  111. DBG && console.log('DBG:filterStore:toggleSort', { fieldName });
  112. return { type: 'TOGGLE_SORT', fieldName: fieldName };
  113. }
  114. function setFilter(fieldName, value) {
  115. DBG && console.log('DBG:filterStore:setFilter', { fieldName, value });
  116. return { type: 'SET_FILTER', fieldName: fieldName, value: value };
  117. }
  118. function setSpecialFilter(fieldName, value) {
  119. DBG && console.log('DBG:filterStore:setSpecialFilter', { fieldName, value });
  120. return { type: 'SET_SPECIAL_FILTER', fieldName: fieldName, value: value };
  121. }
  122. function delayFilter(fieldName, value) {
  123. DBG && console.log('DBG:filterStore:delayFilter', { fieldName, value });
  124. return function(dispatch, getState) {
  125. // var state = getState();
  126. // dispatch(setLoading(primaryKey));
  127. return new Promise(function (resolve, reject) {
  128. DBG && console.log('DBG:filterStore:delayFilter::#1', { fieldName, value });
  129. _clearTimer(fieldName);
  130. _filterTimeout[fieldName] = setTimeout(function () {
  131. // reject("Error");
  132. resolve(value);
  133. }, delay);
  134. }).then(function (value) {
  135. DBG && console.log('DBG:filterStore:delayFilter::#3 resolve ', { fieldName, value });
  136. dispatch( { type: 'SET_FILTER', fieldName: fieldName, value: value } );
  137. }).catch(function (e) {
  138. p5UI__notifyAjaxCallback({type: 'error', msg: 'Wystąpił błąd #TA6: ' + e});
  139. })
  140. }
  141. }
  142. return {
  143. setFilter: setFilter,
  144. setSpecialFilter: setSpecialFilter,
  145. delayFilter: delayFilter,
  146. clearAllFilters: clearAllFilters,
  147. toggleSort: toggleSort,
  148. }
  149. }
  150. function createTableFiltersStateObject(initialData) {
  151. var _initialData = initialData || {};
  152. var store = createStoreWithThunkMiddleware( createFilterStoreWithInitialData( _initialData ) );
  153. return {
  154. store: store,
  155. actions: filterActions()
  156. }
  157. }
  158. global.createTableFiltersStateObject = createTableFiltersStateObject;