TableAjax.php.createTableSelectedStateObject.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. var DBG = DBG || false;
  2. if (!URI_WPS) throw "Missing URI_WPS";
  3. var DBG1 = true;
  4. if (!global.p5VendorJs) throw "Missing p5 Vendor js libs";
  5. if (!global.p5VendorJs.Redux) throw "Missing p5 Vendor js lib: Redux";
  6. var Redux = global.p5VendorJs.Redux;
  7. var ReduxThunk = global.p5VendorJs.ReduxThunk;
  8. var createStoreWithThunkMiddleware = Redux.applyMiddleware(ReduxThunk)(Redux.createStore); // TODO: to vendor.js
  9. function selectedStore(state, action) {
  10. var prevState = state || { isLoading: false, selected: [], loading: [], listPrimaryKeys: [], totalSelected: 0 };
  11. DBG && console.log('DBG::selectedStore', { prevState, action });
  12. switch (action.type) {
  13. case 'SET_CHECKED': return fixSelectAllInSelectedState(Object.assign({}, prevState, {
  14. loading: p5Utils__arrayRemove(prevState.loading, action.primaryKey),
  15. selected: prevState.selected.concat(action.primaryKey),
  16. totalSelected: action.totalSelected,
  17. }));
  18. case 'SET_UNCHECKED': return fixSelectAllInSelectedState(Object.assign({}, prevState, {
  19. loading: p5Utils__arrayRemove(prevState.loading, action.primaryKey),
  20. selected: p5Utils__arrayRemove(prevState.selected, action.primaryKey),
  21. totalSelected: action.totalSelected,
  22. }));
  23. case 'SET_LIST_CHECKED': return fixSelectAllInSelectedState(Object.assign({}, prevState, {
  24. loading: [], // TODO: p5Utils__arrayExcept(prevState.loading, action.listPrimaryKeys),
  25. selected: [].concat(action.listPrimaryKeys), // TODO: p5Utils__arrayUniqueUnion(prevState.selected, action.listPrimaryKeys)
  26. totalSelected: action.totalSelected,
  27. }));
  28. case 'SET_LIST_UNCHECKED': return fixSelectAllInSelectedState(Object.assign({}, prevState, {
  29. loading: [], // TODO: p5Utils__arrayExcept(prevState.loading, action.listPrimaryKeys),
  30. selected: [], // TODO: p5Utils__arrayUniqueUnion(prevState.selected, action.listPrimaryKeys)
  31. totalSelected: action.totalSelected,
  32. }));
  33. case 'SET_LOADING': return Object.assign(prevState, {
  34. loading: prevState.loading.concat(action.primaryKey)
  35. });
  36. case 'SET_LIST_LOADING': return Object.assign(prevState, {
  37. loading: [].concat(action.listPrimaryKeys)
  38. });
  39. case 'SET_PRIMARY_KEYS': return fixSelectAllInSelectedState(Object.assign({}, prevState, {
  40. listPrimaryKeys: [].concat(action.listPrimaryKeys),
  41. loading: [].concat(action.listPrimaryKeys)
  42. }));
  43. // case 'SET_ERROR_MSG': return Object.assign(prevState, {
  44. // errorMsg: action.errorMsg
  45. // });
  46. default: return prevState;
  47. }
  48. }
  49. function fixSelectAllInSelectedState(state) {
  50. var len = state.listPrimaryKeys.length;
  51. var selLen = state.selected.length;
  52. var isAllSelected = ( len > 0 && selLen >= len ); // selected array may contain 'select-all'
  53. for (var i = 0, pk = ''; i < len; i++) {
  54. pk = state.listPrimaryKeys[i];
  55. if (-1 === state.selected.indexOf(pk)) {
  56. isAllSelected = false;
  57. break;
  58. }
  59. }
  60. // DBG && console.log('fixSelectAllInSelectedState', { isAllSelected, state });
  61. var isSelectedSelectAll = ( -1 !== state.selected.indexOf('select-all') );
  62. if (isAllSelected && !isSelectedSelectAll) return Object.assign(state, {
  63. selected: ['select-all'].concat(state.selected)
  64. });
  65. if (!isAllSelected && isSelectedSelectAll) return Object.assign(state, {
  66. selected: p5Utils__arrayRemove(state.selected, 'select-all'),
  67. });
  68. return state;
  69. }
  70. function p5Utils__arrayRemove(array, toRemoveItem) {
  71. return array.filter(function (item) {
  72. return ( item !== toRemoveItem );
  73. });
  74. }
  75. var p5WPSUtils__createConvertToWpsDataInputFunction = function (identifier) {
  76. return function (value) {
  77. if (!value) return null; // WPS function require value, but for eg. featureQuery mey be empty
  78. return { // "wps:Input"
  79. identifier: identifier, // "ows:Identifier"
  80. // title: "...", // "ows:Title"
  81. data: { literalData: { value: value } }, // "wps:Data"
  82. // reference: "???", // "wps:Reference"
  83. // boundingBoxData: "???", // "wps:BoundingBoxData"
  84. };
  85. }
  86. };
  87. var p5WPSHelper_generateProcessSelectFeatureWithArgs = function (identifier, args) {
  88. var dataInputs = Object.keys(args).reduce(function (ret, argName) {
  89. var value = args[argName];
  90. var convertValueToWpsDataInput = p5WPSUtils__createConvertToWpsDataInputFunction(argName);
  91. return (p5Utils__isArray(value))
  92. ? ret.concat( value.map( convertValueToWpsDataInput ) )
  93. : ret.concat([ convertValueToWpsDataInput(value) ])
  94. ;
  95. }, []).filter(function (wpsTag) {
  96. return !! wpsTag;
  97. })
  98. return {
  99. identifier: identifier, // "ows:Identifier"
  100. dataInputs: dataInputs,
  101. responseForm: { // "wps:ResponseForm"
  102. // rawDataOutput: "???", // "wps:RawDataOutput"
  103. // responseDocument: "???", // "wps:ResponseDocument"
  104. }
  105. }
  106. }
  107. var p5WPS_executeFeatureProcess = function(identifier) {
  108. return function (wpsArgs) { // TODO: ns, listPrimaryKeys
  109. return new Promise(function (resolve, reject) {
  110. var process = p5WPSHelper_generateProcessSelectFeatureWithArgs(identifier, wpsArgs);
  111. OpenLayers.Request.POST({
  112. url: URI_WPS,
  113. data: new OpenLayers.Format.WPSExecute().write(process),
  114. callback: function (response) {
  115. try {
  116. var txt = response.responseText || ''
  117. if (!txt) throw "Empty response";
  118. var responseJson = JSON.parse(txt)
  119. if ('success' != responseJson.type) throw "Error response type '" + responseJson.type + "'";
  120. if (!responseJson.body || !responseJson.body.selected) throw "Brak danych";
  121. var listSelectedPks = Object.keys(responseJson.body.selected).filter(function (pk) {
  122. return responseJson.body.selected[pk];
  123. })
  124. var totalSelected = responseJson.body.totalSelected;
  125. DBG && console.log('wps('+identifier+') response', {response, responseJson, selected: responseJson.body.selected, resolve: listSelectedPks});
  126. resolve({
  127. selected: listSelectedPks,
  128. totalSelected: totalSelected,
  129. })
  130. } catch (e) {
  131. reject('' + e)
  132. return;
  133. }
  134. },
  135. // success: function (response) {
  136. // },
  137. // failure: function (response) {
  138. // }
  139. });
  140. });
  141. }
  142. };
  143. var p5WPS__selecFeature = p5WPS_executeFeatureProcess('p5:selectFeature');
  144. var p5WPS__unselectFeature = p5WPS_executeFeatureProcess('p5:unselectFeature');
  145. var p5WPS__unselecAllFeatures = p5WPS_executeFeatureProcess('p5:unselectAllFeatures');
  146. var p5WPS__getSelectedFeatures = p5WPS_executeFeatureProcess('p5:getSelectedFeatures');
  147. var p5WPS__selectAllFeaturesMatchingFilter = p5WPS_executeFeatureProcess('p5:selectAllFeaturesMatchingFilter');
  148. function selectedActions(idContext) {
  149. var idContext = idContext || null;
  150. function setChecked(primaryKey, totalSelected) {
  151. return { type: 'SET_CHECKED', primaryKey: primaryKey, totalSelected: totalSelected }
  152. }
  153. function setUnchecked(primaryKey, totalSelected) {
  154. return { type: 'SET_UNCHECKED', primaryKey: primaryKey, totalSelected: totalSelected }
  155. }
  156. function setLoading(primaryKey) {
  157. return { type: 'SET_LOADING', primaryKey: primaryKey }
  158. }
  159. function setListChecked(listPrimaryKeys, totalSelected) {
  160. return { type: 'SET_LIST_CHECKED', listPrimaryKeys: listPrimaryKeys, totalSelected: totalSelected }
  161. }
  162. function setListUnchecked(listPrimaryKeys, totalSelected) {
  163. return { type: 'SET_LIST_UNCHECKED', listPrimaryKeys: listPrimaryKeys, totalSelected: totalSelected }
  164. }
  165. function setListLoading(listPrimaryKeys) {
  166. return { type: 'SET_LIST_LOADING', listPrimaryKeys: listPrimaryKeys }
  167. }
  168. function setErrorMsg(errorMsg) {
  169. return { type: 'SET_ERROR_MSG', errorMsg: errorMsg }
  170. }
  171. function toggle(namespace, primaryKey, checked) {
  172. DBG && console.log('DBG::toggle action: (pks:['+primaryKey+'])...');
  173. if ('select-all' === primaryKey) return toggleAll(namespace, checked);
  174. return function(dispatch, getState) {
  175. // var state = getState();
  176. dispatch(setLoading(primaryKey));
  177. var reqArgs = { typeName: namespace, primaryKey: [ primaryKey ] };
  178. if (idContext) reqArgs.idContext = idContext;
  179. var reqPromise = checked ? p5WPS__selecFeature(reqArgs) : p5WPS__unselectFeature(reqArgs);
  180. return reqPromise.then(function (response) {
  181. DBG && console.log('DBG::async toggle action: (pk:'+primaryKey+') dispatch...');
  182. dispatch( checked ? setChecked(primaryKey, response.totalSelected) : setUnchecked(primaryKey, response.totalSelected) );
  183. }).catch(function (e) {
  184. p5UI__notifyAjaxCallback({type: 'error', msg: 'Wystąpił błąd #TA1: ' + e});
  185. DBG && console.warn('DBG::async toggle action: (pk:'+primaryKey+') ERROR', e);
  186. // dispatch( checked ? setUnchecked(primaryKey) : setChecked(primaryKey) );
  187. // dispatch( setErrorMsg(e) ); // TODO: show error with msg and refresh button
  188. dispatch( setListLoading([]) );
  189. });
  190. }
  191. }
  192. function setPrimaryKeys(namespace, listPrimaryKeys) { // TODO: should set list primaryKeys, change checkboxes to loading and fetch its state, then update gui
  193. DBG && console.log('DBG::setPrimaryKeys action: (pks:['+listPrimaryKeys.join(',')+'])...');
  194. return function(dispatch, getState) {
  195. dispatch({ type: 'SET_PRIMARY_KEYS', listPrimaryKeys: listPrimaryKeys });
  196. // dispatch( setListLoading(listPrimaryKeys) );
  197. if (!listPrimaryKeys.length) return;
  198. var reqArgs = { typeName: namespace, primaryKey: listPrimaryKeys };
  199. if (idContext) reqArgs.idContext = idContext;
  200. return p5WPS__getSelectedFeatures(reqArgs).then(function (listSelected) {
  201. DBG && console.log('DBG::setPrimaryKeys action: (pks:['+listPrimaryKeys.join(',')+']) dispatch success');
  202. dispatch( setListChecked(listSelected.selected, listSelected.totalSelected) );
  203. }).catch(function (e) {
  204. p5UI__notifyAjaxCallback({type: 'error', msg: 'Wystąpił błąd #TA2: ' + e});
  205. DBG && console.warn('DBG::setPrimaryKeys action: (pks:['+listPrimaryKeys.join(',')+']) ERROR dispatch error');
  206. // var fullListPks = ['select-all'].concat(listPrimaryKeys);
  207. // dispatch( setListUnchecked(fullListPks) );
  208. // dispatch( setErrorMsg(e) ); // TODO: show error with msg and refresh button
  209. dispatch( setListLoading([]) );
  210. });
  211. }
  212. }
  213. function toggleAll(namespace, checked) {
  214. var primaryKey = 'select-all';
  215. return function(dispatch, getState) {
  216. // var state = getState();
  217. dispatch(setLoading(primaryKey));
  218. var state = getState();
  219. var listPrimaryKeys = state.listPrimaryKeys;
  220. var reqArgs = { typeName: namespace, primaryKey: listPrimaryKeys };
  221. if (idContext) reqArgs.idContext = idContext;
  222. var reqPromise = checked ? p5WPS__selecFeature(reqArgs) : p5WPS__unselectFeature(reqArgs);
  223. return reqPromise.then(function (response) {
  224. DBG && console.log('DBG::setPrimaryKeys action: (pks:['+listPrimaryKeys.join(',')+']) dispatch success');
  225. dispatch( checked ? setListChecked(response.selected, response.totalSelected) : setListUnchecked(response.selected, response.totalSelected) );
  226. }).catch(function (e) {
  227. p5UI__notifyAjaxCallback({type: 'error', msg: 'Wystąpił błąd #TA3: ' + e});
  228. DBG && console.warn('DBG::setPrimaryKeys action: (pks:['+listPrimaryKeys.join(',')+']) ERROR dispatch error');
  229. // var fullListPks = ['select-all'].concat(listPrimaryKeys)
  230. // dispatch( checked ? setListUnchecked(fullListPks) : setListChecked(fullListPks) );
  231. // dispatch( setErrorMsg(e) ); // TODO: show error with msg and refresh button
  232. dispatch( setListLoading([]) );
  233. });
  234. }
  235. }
  236. function unselectAll(namespace) {
  237. // dispatch(setLoading());
  238. return function(dispatch, getState) {
  239. var reqArgs = { typeName: namespace };
  240. if (idContext) reqArgs.idContext = idContext;
  241. var reqPromise = p5WPS__unselecAllFeatures(reqArgs);
  242. return reqPromise.then(function (response) {
  243. DBG && console.log('DBG::setPrimaryKeys action: (pks:['+listPrimaryKeys.join(',')+']) dispatch success');
  244. // dispatch( setListChecked(response.selected, response.totalSelected) );
  245. dispatch( setListChecked([], 0) );
  246. }).catch(function (e) {
  247. p5UI__notifyAjaxCallback({type: 'error', msg: 'Wystąpił błąd #TA4: ' + e});
  248. DBG && console.warn('DBG::setPrimaryKeys action: (pks:['+listPrimaryKeys.join(',')+']) ERROR dispatch error');
  249. // var fullListPks = ['select-all'].concat(listPrimaryKeys)
  250. // dispatch( checked ? setListUnchecked(fullListPks) : setListChecked(fullListPks) );
  251. // dispatch( setErrorMsg(e) ); // TODO: show error with msg and refresh button
  252. // dispatch( setListLoading([]) );
  253. });
  254. };
  255. }
  256. function selectAllMatchingFilter(namespace, filterQuery) {
  257. DBG && console.log('DBG::selectAllMatchingFilter', { filterQuery });
  258. return function(dispatch, getState) {
  259. DBG && console.log('DBG::selectAllMatchingFilter state', state);
  260. var state = getState();
  261. var listPrimaryKeys = state.listPrimaryKeys;
  262. var reqArgs = { typeName: namespace, primaryKey: listPrimaryKeys, filterQuery: filterQuery };
  263. if (idContext) reqArgs.idContext = idContext;
  264. return p5WPS__selectAllFeaturesMatchingFilter(reqArgs).then(function (listSelected) {
  265. DBG && console.log('DBG::selectAllMatchingFilter dispatch success');
  266. dispatch( setListChecked(listSelected.selected, listSelected.totalSelected) );
  267. }).catch(function (e) {
  268. p5UI__notifyAjaxCallback({type: 'error', msg: 'Wystąpił błąd #TA5: ' + e});
  269. DBG && console.warn('DBG::selectAllMatchingFilter ERROR dispatch error');
  270. // var fullListPks = ['select-all'].concat(listPrimaryKeys);
  271. // dispatch( setListUnchecked(fullListPks) );
  272. // dispatch( setErrorMsg(e) ); // TODO: show error with msg and refresh button
  273. dispatch( setListLoading([]) );
  274. });
  275. }
  276. }
  277. return {
  278. setPrimaryKeys: setPrimaryKeys,
  279. setChecked: setChecked,
  280. setUnchecked: setUnchecked,
  281. toggle: toggle,
  282. unselectAll: unselectAll,
  283. selectAllMatchingFilter: selectAllMatchingFilter,
  284. }
  285. }
  286. function createTableSelectedStateObject(idContext) {
  287. var _idContext = idContext || {};
  288. return {
  289. store: createStoreWithThunkMiddleware(selectedStore),
  290. actions: selectedActions(_idContext)
  291. }
  292. }
  293. global.createTableSelectedStateObject = createTableSelectedStateObject;