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;