Bladeren bron

exported selected store from TableAjax

Piotr Labudda 7 jaren geleden
bovenliggende
commit
04e1e46eb7
3 gewijzigde bestanden met toevoegingen van 314 en 287 verwijderingen
  1. 4 0
      SE/se-lib/TableAjax.php
  2. 4 287
      SE/se-lib/TableAjax.php.TableAjax.js
  3. 306 0
      SE/se-lib/TableAjax.php.createTableSelectedStateObject.js

+ 4 - 0
SE/se-lib/TableAjax.php

@@ -425,6 +425,10 @@ class TableAjax extends ViewAjax {
 		UI::inlineJS(__FILE__ . '.createTableFiltersStateObject.js', [
 			'DBG' => ('1' === V::get('DBG_JS', '', $_GET)),
 		]);
+		UI::inlineJS(__FILE__ . '.createTableSelectedStateObject.js', [
+			'URI_WPS' => Request::getPathUri() . 'wps.php',
+			'DBG' => ('1' === V::get('DBG_JS', '', $_GET)),
+		]);
 		UI::inlineJS(__FILE__ . '.p5UI__TableAjax.js', [
 			'DBG' => ('1' === V::get('DBG_JS', '', $_GET)),
 		]);

+ 4 - 287
SE/se-lib/TableAjax.php.TableAjax.js

@@ -9,6 +9,7 @@ var DBG1 = true;
 if (!global.p5VendorJs) throw "Missing p5 Vendor js libs";
 if (!global.p5VendorJs.Redux) throw "Missing p5 Vendor js lib: Redux";
 if (!global.createTableFiltersStateObject) throw "Missing createTableFiltersStateObject";
+if (!global.createTableSelectedStateObject) throw "Missing createTableSelectedStateObject";
 
 var createReactClass = global.p5VendorJs.createReactClass;
 var h = global.p5VendorJs.React.createElement;
@@ -34,89 +35,8 @@ p5WfsRefFilter = (function () { // convert GET param key ogc filter for ref
 		}
 	};
 })();
-var p5WPSUtils__createConvertToWpsDataInputFunction = function (identifier) {
-	return function (value) {
-		if (!value) return null; // WPS function require value, but for eg. featureQuery mey be empty
-		return { // "wps:Input"
-			identifier: identifier, // "ows:Identifier"
-			// title: "...", // "ows:Title"
-			data: { literalData: { value: value } }, // "wps:Data"
-			// reference: "???", // "wps:Reference"
-			// boundingBoxData: "???", // "wps:BoundingBoxData"
-		};
-	}
-};
-var p5WPSHelper_generateProcessSelectFeatureWithArgs = function (identifier, args) {
-	var dataInputs = Object.keys(args).reduce(function (ret, argName) {
-		var value = args[argName];
-		var convertValueToWpsDataInput = p5WPSUtils__createConvertToWpsDataInputFunction(argName);
-		return (p5Utils__isArray(value))
-			? ret.concat( value.map( convertValueToWpsDataInput ) )
-			: ret.concat([ convertValueToWpsDataInput(value) ])
-		;
-	}, []).filter(function (wpsTag) {
-		return !! wpsTag;
-	})
-	return {
-		identifier: identifier, // "ows:Identifier"
-		dataInputs: dataInputs,
-		responseForm: { // "wps:ResponseForm"
-			// rawDataOutput: "???", // "wps:RawDataOutput"
-			// responseDocument: "???", // "wps:ResponseDocument"
-		}
-	}
-}
-var p5WPS_executeFeatureProcess = function(identifier) {
-	return function (wpsArgs) { // TODO: ns, listPrimaryKeys
-		return new Promise(function (resolve, reject) {
-			var process = p5WPSHelper_generateProcessSelectFeatureWithArgs(identifier, wpsArgs);
-			OpenLayers.Request.POST({
-				url: URI_WPS,
-				data: new OpenLayers.Format.WPSExecute().write(process),
-				callback: function (response) {
-					try {
-						var txt = response.responseText || ''
-						if (!txt) throw "Empty response";
-						var responseJson = JSON.parse(txt)
-						if ('success' != responseJson.type) throw "Error response type '" + responseJson.type + "'";
-						if (!responseJson.body || !responseJson.body.selected) throw "Brak danych";
-						var listSelectedPks = Object.keys(responseJson.body.selected).filter(function (pk) {
-							return responseJson.body.selected[pk];
-						})
-						var totalSelected = responseJson.body.totalSelected;
-						DBG && console.log('wps('+identifier+') response', {response, responseJson, selected: responseJson.body.selected, resolve: listSelectedPks});
-
-						resolve({
-							selected: listSelectedPks,
-							totalSelected: totalSelected,
-						})
-					} catch (e) {
-						reject('' + e)
-						return;
-					}
-				},
-				// success: function (response) {
-				// },
-				// failure: function (response) {
-				// }
-			});
-		});
-	}
-};
-var p5WPS__selecFeature = p5WPS_executeFeatureProcess('p5:selectFeature');
-var p5WPS__unselectFeature = p5WPS_executeFeatureProcess('p5:unselectFeature');
-var p5WPS__unselecAllFeatures = p5WPS_executeFeatureProcess('p5:unselectAllFeatures');
-var p5WPS__getSelectedFeatures = p5WPS_executeFeatureProcess('p5:getSelectedFeatures');
-var p5WPS__selectAllFeaturesMatchingFilter = p5WPS_executeFeatureProcess('p5:selectAllFeaturesMatchingFilter');
 
 
-
-function p5Utils__arrayRemove(array, toRemoveItem) {
-	return array.filter(function (item) {
-		return ( item !== toRemoveItem );
-	});
-}
-
 function p5Utils__mapToQuery(map, callback) {
 	var mapCallback = ('function' === typeof callback) ? callback : function (key) {
 		return '' + key + '=' + encodeURIComponent(map.get(key));
@@ -141,210 +61,6 @@ function p5Utils__objectToQueryWithKeyPrefix(obj, prefix, callback) {
 		.join('&')
 }
 
-function fixSelectAllInSelectedState(state) {
-	var len = state.listPrimaryKeys.length;
-	var selLen = state.selected.length;
-	var isAllSelected = ( len > 0 && selLen >= len ); // selected array may contain 'select-all'
-	for (var i = 0, pk = ''; i < len; i++) {
-		pk = state.listPrimaryKeys[i];
-		if (-1 === state.selected.indexOf(pk)) {
-			isAllSelected = false;
-			break;
-		}
-	}
-	// DBG && console.log('fixSelectAllInSelectedState', { isAllSelected, state });
-	var isSelectedSelectAll = ( -1 !== state.selected.indexOf('select-all') );
-	if (isAllSelected && !isSelectedSelectAll) return Object.assign(state, {
-		selected: ['select-all'].concat(state.selected)
-	});
-	if (!isAllSelected && isSelectedSelectAll) return Object.assign(state, {
-		selected: p5Utils__arrayRemove(state.selected, 'select-all'),
-	});
-	return state;
-}
-function selectedStore(state, action) {
-	var prevState = state || { isLoading: false, selected: [], loading: [], listPrimaryKeys: [], totalSelected: 0 };
-	DBG && console.log('DBG::selectedStore', { prevState, action });
-	switch (action.type) {
-		case 'SET_CHECKED': return fixSelectAllInSelectedState(Object.assign({}, prevState, {
-			loading: p5Utils__arrayRemove(prevState.loading, action.primaryKey),
-			selected: prevState.selected.concat(action.primaryKey),
-			totalSelected: action.totalSelected,
-		}));
-		case 'SET_UNCHECKED': return fixSelectAllInSelectedState(Object.assign({}, prevState, {
-			loading: p5Utils__arrayRemove(prevState.loading, action.primaryKey),
-			selected: p5Utils__arrayRemove(prevState.selected, action.primaryKey),
-			totalSelected: action.totalSelected,
-		}));
-		case 'SET_LIST_CHECKED': return fixSelectAllInSelectedState(Object.assign({}, prevState, {
-			loading: [], // TODO: p5Utils__arrayExcept(prevState.loading, action.listPrimaryKeys),
-			selected: [].concat(action.listPrimaryKeys), // TODO: p5Utils__arrayUniqueUnion(prevState.selected, action.listPrimaryKeys)
-			totalSelected: action.totalSelected,
-		}));
-		case 'SET_LIST_UNCHECKED': return fixSelectAllInSelectedState(Object.assign({}, prevState, {
-			loading: [], // TODO: p5Utils__arrayExcept(prevState.loading, action.listPrimaryKeys),
-			selected: [], // TODO: p5Utils__arrayUniqueUnion(prevState.selected, action.listPrimaryKeys)
-			totalSelected: action.totalSelected,
-		}));
-		case 'SET_LOADING': return Object.assign(prevState, {
-			loading: prevState.loading.concat(action.primaryKey)
-		});
-		case 'SET_LIST_LOADING': return Object.assign(prevState, {
-			loading: [].concat(action.listPrimaryKeys)
-		});
-		case 'SET_PRIMARY_KEYS': return fixSelectAllInSelectedState(Object.assign({}, prevState, {
-			listPrimaryKeys: [].concat(action.listPrimaryKeys),
-			loading: [].concat(action.listPrimaryKeys)
-		}));
-		// case 'SET_ERROR_MSG': return Object.assign(prevState, {
-		// 	errorMsg: action.errorMsg
-		// });
-		default: return prevState;
-	}
-}
-function selectedActions(idContext) {
-	var idContext = idContext || null;
-	function setChecked(primaryKey, totalSelected) {
-		return { type: 'SET_CHECKED', primaryKey: primaryKey, totalSelected: totalSelected }
-	}
-	function setUnchecked(primaryKey, totalSelected) {
-		return { type: 'SET_UNCHECKED', primaryKey: primaryKey, totalSelected: totalSelected }
-	}
-	function setLoading(primaryKey) {
-		return { type: 'SET_LOADING', primaryKey: primaryKey }
-	}
-	function setListChecked(listPrimaryKeys, totalSelected) {
-		return { type: 'SET_LIST_CHECKED', listPrimaryKeys: listPrimaryKeys, totalSelected: totalSelected }
-	}
-	function setListUnchecked(listPrimaryKeys, totalSelected) {
-		return { type: 'SET_LIST_UNCHECKED', listPrimaryKeys: listPrimaryKeys, totalSelected: totalSelected }
-	}
-	function setListLoading(listPrimaryKeys) {
-		return { type: 'SET_LIST_LOADING', listPrimaryKeys: listPrimaryKeys }
-	}
-	function setErrorMsg(errorMsg) {
-		return { type: 'SET_ERROR_MSG', errorMsg: errorMsg }
-	}
-	function toggle(namespace, primaryKey, checked) {
-		DBG && console.log('DBG::toggle action: (pks:['+primaryKey+'])...');
-		if ('select-all' === primaryKey) return toggleAll(namespace, checked);
-
-		return function(dispatch, getState) {
-			// var state = getState();
-			dispatch(setLoading(primaryKey));
-
-			var reqArgs = { typeName: namespace, primaryKey: [ primaryKey ] };
-			if (idContext) reqArgs.idContext = idContext;
-			var reqPromise = checked ? p5WPS__selecFeature(reqArgs) : p5WPS__unselectFeature(reqArgs);
-			return reqPromise.then(function (response) {
-				DBG && console.log('DBG::async toggle action: (pk:'+primaryKey+') dispatch...');
-				dispatch( checked ? setChecked(primaryKey, response.totalSelected) : setUnchecked(primaryKey, response.totalSelected) );
-			}).catch(function (e) {
-				p5UI__notifyAjaxCallback({type: 'error', msg: 'Wystąpił błąd #TA1: ' + e});
-				DBG && console.warn('DBG::async toggle action: (pk:'+primaryKey+') ERROR', e);
-				// dispatch( checked ? setUnchecked(primaryKey) : setChecked(primaryKey) );
-				// dispatch( setErrorMsg(e) ); // TODO: show error with msg and refresh button
-				dispatch( setListLoading([]) );
-			});
-		}
-	}
-	function setPrimaryKeys(namespace, listPrimaryKeys) { // TODO: should set list primaryKeys, change checkboxes to loading and fetch its state, then update gui
-		DBG && console.log('DBG::setPrimaryKeys action: (pks:['+listPrimaryKeys.join(',')+'])...');
-		return function(dispatch, getState) {
-			dispatch({ type: 'SET_PRIMARY_KEYS', listPrimaryKeys: listPrimaryKeys });
-			// dispatch( setListLoading(listPrimaryKeys) );
-			if (!listPrimaryKeys.length) return;
-
-			var reqArgs = { typeName: namespace, primaryKey: listPrimaryKeys };
-			if (idContext) reqArgs.idContext = idContext;
-			return p5WPS__getSelectedFeatures(reqArgs).then(function (listSelected) {
-				DBG && console.log('DBG::setPrimaryKeys action: (pks:['+listPrimaryKeys.join(',')+']) dispatch success');
-				dispatch( setListChecked(listSelected.selected, listSelected.totalSelected) );
-			}).catch(function (e) {
-				p5UI__notifyAjaxCallback({type: 'error', msg: 'Wystąpił błąd #TA2: ' + e});
-				DBG && console.warn('DBG::setPrimaryKeys action: (pks:['+listPrimaryKeys.join(',')+']) ERROR dispatch error');
-				// var fullListPks = ['select-all'].concat(listPrimaryKeys);
-				// dispatch( setListUnchecked(fullListPks) );
-				// dispatch( setErrorMsg(e) ); // TODO: show error with msg and refresh button
-				dispatch( setListLoading([]) );
-			});
-		}
-	}
-	function toggleAll(namespace, checked) {
-		var primaryKey = 'select-all';
-		return function(dispatch, getState) {
-			// var state = getState();
-			dispatch(setLoading(primaryKey));
-			var state = getState();
-			var listPrimaryKeys = state.listPrimaryKeys;
-
-			var reqArgs = { typeName: namespace, primaryKey: listPrimaryKeys };
-			if (idContext) reqArgs.idContext = idContext;
-			var reqPromise = checked ? p5WPS__selecFeature(reqArgs) : p5WPS__unselectFeature(reqArgs);
-			return reqPromise.then(function (response) {
-				DBG && console.log('DBG::setPrimaryKeys action: (pks:['+listPrimaryKeys.join(',')+']) dispatch success');
-				dispatch( checked ? setListChecked(response.selected, response.totalSelected) : setListUnchecked(response.selected, response.totalSelected) );
-			}).catch(function (e) {
-				p5UI__notifyAjaxCallback({type: 'error', msg: 'Wystąpił błąd #TA3: ' + e});
-				DBG && console.warn('DBG::setPrimaryKeys action: (pks:['+listPrimaryKeys.join(',')+']) ERROR dispatch error');
-				// var fullListPks = ['select-all'].concat(listPrimaryKeys)
-				// dispatch( checked ? setListUnchecked(fullListPks) : setListChecked(fullListPks) );
-				// dispatch( setErrorMsg(e) ); // TODO: show error with msg and refresh button
-				dispatch( setListLoading([]) );
-			});
-		}
-	}
-	function unselectAll(namespace) {
-		// dispatch(setLoading());
-		return function(dispatch, getState) {
-			var reqArgs = { typeName: namespace };
-			if (idContext) reqArgs.idContext = idContext;
-			var reqPromise = p5WPS__unselecAllFeatures(reqArgs);
-			return reqPromise.then(function (response) {
-				DBG && console.log('DBG::setPrimaryKeys action: (pks:['+listPrimaryKeys.join(',')+']) dispatch success');
-				// dispatch( setListChecked(response.selected, response.totalSelected) );
-				dispatch( setListChecked([], 0) );
-			}).catch(function (e) {
-				p5UI__notifyAjaxCallback({type: 'error', msg: 'Wystąpił błąd #TA4: ' + e});
-				DBG && console.warn('DBG::setPrimaryKeys action: (pks:['+listPrimaryKeys.join(',')+']) ERROR dispatch error');
-				// var fullListPks = ['select-all'].concat(listPrimaryKeys)
-				// dispatch( checked ? setListUnchecked(fullListPks) : setListChecked(fullListPks) );
-				// dispatch( setErrorMsg(e) ); // TODO: show error with msg and refresh button
-				// dispatch( setListLoading([]) );
-			});
-		};
-	}
-	function selectAllMatchingFilter(namespace, filterQuery) {
-		DBG && console.log('DBG::selectAllMatchingFilter', { filterQuery });
-		return function(dispatch, getState) {
-			DBG && console.log('DBG::selectAllMatchingFilter state', state);
-			var state = getState();
-			var listPrimaryKeys = state.listPrimaryKeys;
-
-			var reqArgs = { typeName: namespace, primaryKey: listPrimaryKeys, filterQuery: filterQuery };
-			if (idContext) reqArgs.idContext = idContext;
-			return p5WPS__selectAllFeaturesMatchingFilter(reqArgs).then(function (listSelected) {
-				DBG && console.log('DBG::selectAllMatchingFilter dispatch success');
-				dispatch( setListChecked(listSelected.selected, listSelected.totalSelected) );
-			}).catch(function (e) {
-				p5UI__notifyAjaxCallback({type: 'error', msg: 'Wystąpił błąd #TA5: ' + e});
-				DBG && console.warn('DBG::selectAllMatchingFilter ERROR dispatch error');
-				// var fullListPks = ['select-all'].concat(listPrimaryKeys);
-				// dispatch( setListUnchecked(fullListPks) );
-				// dispatch( setErrorMsg(e) ); // TODO: show error with msg and refresh button
-				dispatch( setListLoading([]) );
-			});
-		}
-	}
-	return {
-		setPrimaryKeys: setPrimaryKeys,
-		setChecked: setChecked,
-		setUnchecked: setUnchecked,
-		toggle: toggle,
-		unselectAll: unselectAll,
-		selectAllMatchingFilter: selectAllMatchingFilter,
-	}
-}
 
 global['P5UI__TableAjaxRowCheckbox'] = createReactClass({
 	// props.namespace: PropTypes.string.isRequired
@@ -1243,8 +959,9 @@ var TableAjax = function() {
 		})
 
 		if (priv.options.checkboxes) {
-			priv.options.selectedStore = createStoreWithThunkMiddleware(selectedStore)
-			priv.options.selectedActions = selectedActions(idContext = priv.options.checkboxIdContext)
+			var stateObjectSelected = createTableSelectedStateObject(priv.options.checkboxIdContext);
+			priv.options.selectedStore = stateObjectSelected.store;
+			priv.options.selectedActions = stateObjectSelected.actions;
 			if (_uiNodeSelectedInfo) { // must run after priv.initialRender(); - _uiNodeSelectedInfo must exists
 				ReactDOM.render(
 					h(P5UI__TableAjaxSelectedInfo, {

+ 306 - 0
SE/se-lib/TableAjax.php.createTableSelectedStateObject.js

@@ -0,0 +1,306 @@
+var DBG = DBG || false;
+if (!URI_WPS) throw "Missing URI_WPS";
+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 selectedStore(state, action) {
+	var prevState = state || { isLoading: false, selected: [], loading: [], listPrimaryKeys: [], totalSelected: 0 };
+	DBG && console.log('DBG::selectedStore', { prevState, action });
+	switch (action.type) {
+		case 'SET_CHECKED': return fixSelectAllInSelectedState(Object.assign({}, prevState, {
+			loading: p5Utils__arrayRemove(prevState.loading, action.primaryKey),
+			selected: prevState.selected.concat(action.primaryKey),
+			totalSelected: action.totalSelected,
+		}));
+		case 'SET_UNCHECKED': return fixSelectAllInSelectedState(Object.assign({}, prevState, {
+			loading: p5Utils__arrayRemove(prevState.loading, action.primaryKey),
+			selected: p5Utils__arrayRemove(prevState.selected, action.primaryKey),
+			totalSelected: action.totalSelected,
+		}));
+		case 'SET_LIST_CHECKED': return fixSelectAllInSelectedState(Object.assign({}, prevState, {
+			loading: [], // TODO: p5Utils__arrayExcept(prevState.loading, action.listPrimaryKeys),
+			selected: [].concat(action.listPrimaryKeys), // TODO: p5Utils__arrayUniqueUnion(prevState.selected, action.listPrimaryKeys)
+			totalSelected: action.totalSelected,
+		}));
+		case 'SET_LIST_UNCHECKED': return fixSelectAllInSelectedState(Object.assign({}, prevState, {
+			loading: [], // TODO: p5Utils__arrayExcept(prevState.loading, action.listPrimaryKeys),
+			selected: [], // TODO: p5Utils__arrayUniqueUnion(prevState.selected, action.listPrimaryKeys)
+			totalSelected: action.totalSelected,
+		}));
+		case 'SET_LOADING': return Object.assign(prevState, {
+			loading: prevState.loading.concat(action.primaryKey)
+		});
+		case 'SET_LIST_LOADING': return Object.assign(prevState, {
+			loading: [].concat(action.listPrimaryKeys)
+		});
+		case 'SET_PRIMARY_KEYS': return fixSelectAllInSelectedState(Object.assign({}, prevState, {
+			listPrimaryKeys: [].concat(action.listPrimaryKeys),
+			loading: [].concat(action.listPrimaryKeys)
+		}));
+		// case 'SET_ERROR_MSG': return Object.assign(prevState, {
+		// 	errorMsg: action.errorMsg
+		// });
+		default: return prevState;
+	}
+}
+function fixSelectAllInSelectedState(state) {
+	var len = state.listPrimaryKeys.length;
+	var selLen = state.selected.length;
+	var isAllSelected = ( len > 0 && selLen >= len ); // selected array may contain 'select-all'
+	for (var i = 0, pk = ''; i < len; i++) {
+		pk = state.listPrimaryKeys[i];
+		if (-1 === state.selected.indexOf(pk)) {
+			isAllSelected = false;
+			break;
+		}
+	}
+	// DBG && console.log('fixSelectAllInSelectedState', { isAllSelected, state });
+	var isSelectedSelectAll = ( -1 !== state.selected.indexOf('select-all') );
+	if (isAllSelected && !isSelectedSelectAll) return Object.assign(state, {
+		selected: ['select-all'].concat(state.selected)
+	});
+	if (!isAllSelected && isSelectedSelectAll) return Object.assign(state, {
+		selected: p5Utils__arrayRemove(state.selected, 'select-all'),
+	});
+	return state;
+}
+function p5Utils__arrayRemove(array, toRemoveItem) {
+	return array.filter(function (item) {
+		return ( item !== toRemoveItem );
+	});
+}
+
+var p5WPSUtils__createConvertToWpsDataInputFunction = function (identifier) {
+	return function (value) {
+		if (!value) return null; // WPS function require value, but for eg. featureQuery mey be empty
+		return { // "wps:Input"
+			identifier: identifier, // "ows:Identifier"
+			// title: "...", // "ows:Title"
+			data: { literalData: { value: value } }, // "wps:Data"
+			// reference: "???", // "wps:Reference"
+			// boundingBoxData: "???", // "wps:BoundingBoxData"
+		};
+	}
+};
+var p5WPSHelper_generateProcessSelectFeatureWithArgs = function (identifier, args) {
+	var dataInputs = Object.keys(args).reduce(function (ret, argName) {
+		var value = args[argName];
+		var convertValueToWpsDataInput = p5WPSUtils__createConvertToWpsDataInputFunction(argName);
+		return (p5Utils__isArray(value))
+			? ret.concat( value.map( convertValueToWpsDataInput ) )
+			: ret.concat([ convertValueToWpsDataInput(value) ])
+		;
+	}, []).filter(function (wpsTag) {
+		return !! wpsTag;
+	})
+	return {
+		identifier: identifier, // "ows:Identifier"
+		dataInputs: dataInputs,
+		responseForm: { // "wps:ResponseForm"
+			// rawDataOutput: "???", // "wps:RawDataOutput"
+			// responseDocument: "???", // "wps:ResponseDocument"
+		}
+	}
+}
+var p5WPS_executeFeatureProcess = function(identifier) {
+	return function (wpsArgs) { // TODO: ns, listPrimaryKeys
+		return new Promise(function (resolve, reject) {
+			var process = p5WPSHelper_generateProcessSelectFeatureWithArgs(identifier, wpsArgs);
+			OpenLayers.Request.POST({
+				url: URI_WPS,
+				data: new OpenLayers.Format.WPSExecute().write(process),
+				callback: function (response) {
+					try {
+						var txt = response.responseText || ''
+						if (!txt) throw "Empty response";
+						var responseJson = JSON.parse(txt)
+						if ('success' != responseJson.type) throw "Error response type '" + responseJson.type + "'";
+						if (!responseJson.body || !responseJson.body.selected) throw "Brak danych";
+						var listSelectedPks = Object.keys(responseJson.body.selected).filter(function (pk) {
+							return responseJson.body.selected[pk];
+						})
+						var totalSelected = responseJson.body.totalSelected;
+						DBG && console.log('wps('+identifier+') response', {response, responseJson, selected: responseJson.body.selected, resolve: listSelectedPks});
+
+						resolve({
+							selected: listSelectedPks,
+							totalSelected: totalSelected,
+						})
+					} catch (e) {
+						reject('' + e)
+						return;
+					}
+				},
+				// success: function (response) {
+				// },
+				// failure: function (response) {
+				// }
+			});
+		});
+	}
+};
+var p5WPS__selecFeature = p5WPS_executeFeatureProcess('p5:selectFeature');
+var p5WPS__unselectFeature = p5WPS_executeFeatureProcess('p5:unselectFeature');
+var p5WPS__unselecAllFeatures = p5WPS_executeFeatureProcess('p5:unselectAllFeatures');
+var p5WPS__getSelectedFeatures = p5WPS_executeFeatureProcess('p5:getSelectedFeatures');
+var p5WPS__selectAllFeaturesMatchingFilter = p5WPS_executeFeatureProcess('p5:selectAllFeaturesMatchingFilter');
+
+
+function selectedActions(idContext) {
+	var idContext = idContext || null;
+	function setChecked(primaryKey, totalSelected) {
+		return { type: 'SET_CHECKED', primaryKey: primaryKey, totalSelected: totalSelected }
+	}
+	function setUnchecked(primaryKey, totalSelected) {
+		return { type: 'SET_UNCHECKED', primaryKey: primaryKey, totalSelected: totalSelected }
+	}
+	function setLoading(primaryKey) {
+		return { type: 'SET_LOADING', primaryKey: primaryKey }
+	}
+	function setListChecked(listPrimaryKeys, totalSelected) {
+		return { type: 'SET_LIST_CHECKED', listPrimaryKeys: listPrimaryKeys, totalSelected: totalSelected }
+	}
+	function setListUnchecked(listPrimaryKeys, totalSelected) {
+		return { type: 'SET_LIST_UNCHECKED', listPrimaryKeys: listPrimaryKeys, totalSelected: totalSelected }
+	}
+	function setListLoading(listPrimaryKeys) {
+		return { type: 'SET_LIST_LOADING', listPrimaryKeys: listPrimaryKeys }
+	}
+	function setErrorMsg(errorMsg) {
+		return { type: 'SET_ERROR_MSG', errorMsg: errorMsg }
+	}
+	function toggle(namespace, primaryKey, checked) {
+		DBG && console.log('DBG::toggle action: (pks:['+primaryKey+'])...');
+		if ('select-all' === primaryKey) return toggleAll(namespace, checked);
+
+		return function(dispatch, getState) {
+			// var state = getState();
+			dispatch(setLoading(primaryKey));
+
+			var reqArgs = { typeName: namespace, primaryKey: [ primaryKey ] };
+			if (idContext) reqArgs.idContext = idContext;
+			var reqPromise = checked ? p5WPS__selecFeature(reqArgs) : p5WPS__unselectFeature(reqArgs);
+			return reqPromise.then(function (response) {
+				DBG && console.log('DBG::async toggle action: (pk:'+primaryKey+') dispatch...');
+				dispatch( checked ? setChecked(primaryKey, response.totalSelected) : setUnchecked(primaryKey, response.totalSelected) );
+			}).catch(function (e) {
+				p5UI__notifyAjaxCallback({type: 'error', msg: 'Wystąpił błąd #TA1: ' + e});
+				DBG && console.warn('DBG::async toggle action: (pk:'+primaryKey+') ERROR', e);
+				// dispatch( checked ? setUnchecked(primaryKey) : setChecked(primaryKey) );
+				// dispatch( setErrorMsg(e) ); // TODO: show error with msg and refresh button
+				dispatch( setListLoading([]) );
+			});
+		}
+	}
+	function setPrimaryKeys(namespace, listPrimaryKeys) { // TODO: should set list primaryKeys, change checkboxes to loading and fetch its state, then update gui
+		DBG && console.log('DBG::setPrimaryKeys action: (pks:['+listPrimaryKeys.join(',')+'])...');
+		return function(dispatch, getState) {
+			dispatch({ type: 'SET_PRIMARY_KEYS', listPrimaryKeys: listPrimaryKeys });
+			// dispatch( setListLoading(listPrimaryKeys) );
+			if (!listPrimaryKeys.length) return;
+
+			var reqArgs = { typeName: namespace, primaryKey: listPrimaryKeys };
+			if (idContext) reqArgs.idContext = idContext;
+			return p5WPS__getSelectedFeatures(reqArgs).then(function (listSelected) {
+				DBG && console.log('DBG::setPrimaryKeys action: (pks:['+listPrimaryKeys.join(',')+']) dispatch success');
+				dispatch( setListChecked(listSelected.selected, listSelected.totalSelected) );
+			}).catch(function (e) {
+				p5UI__notifyAjaxCallback({type: 'error', msg: 'Wystąpił błąd #TA2: ' + e});
+				DBG && console.warn('DBG::setPrimaryKeys action: (pks:['+listPrimaryKeys.join(',')+']) ERROR dispatch error');
+				// var fullListPks = ['select-all'].concat(listPrimaryKeys);
+				// dispatch( setListUnchecked(fullListPks) );
+				// dispatch( setErrorMsg(e) ); // TODO: show error with msg and refresh button
+				dispatch( setListLoading([]) );
+			});
+		}
+	}
+	function toggleAll(namespace, checked) {
+		var primaryKey = 'select-all';
+		return function(dispatch, getState) {
+			// var state = getState();
+			dispatch(setLoading(primaryKey));
+			var state = getState();
+			var listPrimaryKeys = state.listPrimaryKeys;
+
+			var reqArgs = { typeName: namespace, primaryKey: listPrimaryKeys };
+			if (idContext) reqArgs.idContext = idContext;
+			var reqPromise = checked ? p5WPS__selecFeature(reqArgs) : p5WPS__unselectFeature(reqArgs);
+			return reqPromise.then(function (response) {
+				DBG && console.log('DBG::setPrimaryKeys action: (pks:['+listPrimaryKeys.join(',')+']) dispatch success');
+				dispatch( checked ? setListChecked(response.selected, response.totalSelected) : setListUnchecked(response.selected, response.totalSelected) );
+			}).catch(function (e) {
+				p5UI__notifyAjaxCallback({type: 'error', msg: 'Wystąpił błąd #TA3: ' + e});
+				DBG && console.warn('DBG::setPrimaryKeys action: (pks:['+listPrimaryKeys.join(',')+']) ERROR dispatch error');
+				// var fullListPks = ['select-all'].concat(listPrimaryKeys)
+				// dispatch( checked ? setListUnchecked(fullListPks) : setListChecked(fullListPks) );
+				// dispatch( setErrorMsg(e) ); // TODO: show error with msg and refresh button
+				dispatch( setListLoading([]) );
+			});
+		}
+	}
+	function unselectAll(namespace) {
+		// dispatch(setLoading());
+		return function(dispatch, getState) {
+			var reqArgs = { typeName: namespace };
+			if (idContext) reqArgs.idContext = idContext;
+			var reqPromise = p5WPS__unselecAllFeatures(reqArgs);
+			return reqPromise.then(function (response) {
+				DBG && console.log('DBG::setPrimaryKeys action: (pks:['+listPrimaryKeys.join(',')+']) dispatch success');
+				// dispatch( setListChecked(response.selected, response.totalSelected) );
+				dispatch( setListChecked([], 0) );
+			}).catch(function (e) {
+				p5UI__notifyAjaxCallback({type: 'error', msg: 'Wystąpił błąd #TA4: ' + e});
+				DBG && console.warn('DBG::setPrimaryKeys action: (pks:['+listPrimaryKeys.join(',')+']) ERROR dispatch error');
+				// var fullListPks = ['select-all'].concat(listPrimaryKeys)
+				// dispatch( checked ? setListUnchecked(fullListPks) : setListChecked(fullListPks) );
+				// dispatch( setErrorMsg(e) ); // TODO: show error with msg and refresh button
+				// dispatch( setListLoading([]) );
+			});
+		};
+	}
+	function selectAllMatchingFilter(namespace, filterQuery) {
+		DBG && console.log('DBG::selectAllMatchingFilter', { filterQuery });
+		return function(dispatch, getState) {
+			DBG && console.log('DBG::selectAllMatchingFilter state', state);
+			var state = getState();
+			var listPrimaryKeys = state.listPrimaryKeys;
+
+			var reqArgs = { typeName: namespace, primaryKey: listPrimaryKeys, filterQuery: filterQuery };
+			if (idContext) reqArgs.idContext = idContext;
+			return p5WPS__selectAllFeaturesMatchingFilter(reqArgs).then(function (listSelected) {
+				DBG && console.log('DBG::selectAllMatchingFilter dispatch success');
+				dispatch( setListChecked(listSelected.selected, listSelected.totalSelected) );
+			}).catch(function (e) {
+				p5UI__notifyAjaxCallback({type: 'error', msg: 'Wystąpił błąd #TA5: ' + e});
+				DBG && console.warn('DBG::selectAllMatchingFilter ERROR dispatch error');
+				// var fullListPks = ['select-all'].concat(listPrimaryKeys);
+				// dispatch( setListUnchecked(fullListPks) );
+				// dispatch( setErrorMsg(e) ); // TODO: show error with msg and refresh button
+				dispatch( setListLoading([]) );
+			});
+		}
+	}
+	return {
+		setPrimaryKeys: setPrimaryKeys,
+		setChecked: setChecked,
+		setUnchecked: setUnchecked,
+		toggle: toggle,
+		unselectAll: unselectAll,
+		selectAllMatchingFilter: selectAllMatchingFilter,
+	}
+}
+
+function createTableSelectedStateObject(idContext) {
+	var _idContext = idContext || {};
+	return {
+		store: createStoreWithThunkMiddleware(selectedStore),
+		actions: selectedActions(_idContext)
+
+	}
+}
+
+global.createTableSelectedStateObject = createTableSelectedStateObject;