TableAjax.php.createTableFiltersStateObject.js 5.1 KB

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