TableAjax.php.createTableFiltersStateObject.js 4.8 KB

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