UNPKG

@talend/react-containers

Version:

Provide connected components aka containers for @talend/react-cmf based on @talend/react-components.

156 lines (152 loc) 6.29 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; exports.deleteResourceCancel = deleteResourceCancel; exports.deleteResourceValidate = deleteResourceValidate; exports.getResourceLocator = getResourceLocator; exports.redirect = redirect; var _effects = require("redux-saga/effects"); var _reactCmf = _interopRequireDefault(require("@talend/react-cmf")); var _constants = _interopRequireDefault(require("./constants")); var _lodash = require("lodash"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } /** * from a resourceType and an optional resourcePath, return a resource locator * if resourcePath is provided resourceType is prepend to resourcePath * @param {String} resourceType * @param {Array<String>} [resourcePath] * @return {String || Array<String>} */ function getResourceLocator(resourceType, resourcePath) { if (resourcePath) { if (Array.isArray(resourcePath)) { return [resourceType, ...resourcePath]; } throw Error(`Optional parameter resourcePath must be an array of string, got ${resourcePath}`); } return resourceType; } function* redirect(url) { if (!(0, _lodash.isString)(url)) { throw new Error('redirect url can not be empty'); } yield (0, _effects.put)({ type: _constants.default.DIALOG_BOX_DELETE_RESOURCE_CLOSE, cmf: { routerReplace: url } }); } /** * Waiting for confirmation event. * Resolve the resource to delete. * Call the requested uri. * Redirect the user. * @param {string} uri * @param {string} resourceType * @param {string} itemId * @param {Array<String>} [resourcePath] * @param {string} collectionId - collection which stores resources * @param {string} resourceUri - uri to delete resource on backend */ function* deleteResourceValidate(uri, resourceType, itemId, resourcePath, collectionId, resourceUri) { const action = yield (0, _effects.take)(_constants.default.DIALOG_BOX_DELETE_RESOURCE_OK); const safeURI = (0, _lodash.get)(action, 'data.model.uri', uri); const safeType = (0, _lodash.get)(action, 'data.model.resourceType', resourceType); const safeId = (0, _lodash.get)(action, 'data.model.id', itemId); const safePath = (0, _lodash.get)(action, 'data.model.resourcePath', resourcePath); const resourceCollectionId = (0, _lodash.get)(action, 'data.model.collectionId', collectionId); const resourceLocator = getResourceLocator(resourceCollectionId || safeType, safePath); let resource; if ((0, _lodash.get)(action, 'data.model.resource')) { resource = (0, _lodash.get)(action, 'data.model.resource'); } else { resource = yield (0, _effects.select)(_reactCmf.default.selectors.collections.findListItem, resourceLocator, safeId); } const safeResourceUri = (0, _lodash.get)(action, 'data.model.resourceUri', resourceUri || `${safeURI}/${safeType}/${safeId}`); if (resource && safeResourceUri) { const result = yield (0, _effects.call)(_reactCmf.default.sagas.http.delete, safeResourceUri); if (result.response.ok) { yield (0, _effects.put)({ type: _constants.default.DIALOG_BOX_DELETE_RESOURCE_SUCCESS, model: { ...(0, _lodash.get)(action, 'data.model', {}), id: safeId, labelResource: resource.get('label') || resource.get('name', '') } }); yield (0, _effects.call)(redirect, (0, _lodash.get)(action, 'data.model.redirectUrl')); } else { yield (0, _effects.put)({ type: _constants.default.DIALOG_BOX_DELETE_RESOURCE_ERROR, error: result.data }); } } } function* deleteResourceCancel() { const action = yield (0, _effects.take)(_constants.default.DIALOG_BOX_DELETE_RESOURCE_CANCEL); const url = (0, _lodash.get)(action, 'data.model.onCancelRedirectUrl', (0, _lodash.get)(action, 'data.model.redirectUrl')); yield (0, _effects.call)(redirect, url); } /** * For Backward compatibility * Return a saga for delete resource confirmation dialog box. * Race between cancel and confirm deleting the resource. * To be used with the sagaRouter * @param {object} sagaParams the params to setup the saga * @param {string} sagaParams.uri the uri of the endpoint to make the calls * @param {string} sagaParams.resourceType the resource type to call delete endpoint ( at least ) * @param {string} sagaParams.redirectUrl url to redirect after delete action is done or cancel * @param {Array<String>} sagaParams.resourcePath optional * @param {string} sagaParams.routerParamsAttribute optional param in route to get the resource id * @param {string} sagaParams.collectionId optional param to specify collection which stores * resources,if not provided, will use resourceType as collectionId * @param {string} sagaParams.resourceUri optionsal param, specify the uri to delete resource. * if not provided, will use ':uri/:resourceType/:resourceId' */ function getDeleteResourceSagaRouter({ uri, resourceType, redirectUrl, resourcePath, routerParamsAttribute = 'id', collectionId, resourceUri } = {}) { // eslint-disable-next-line no-console console.warn(`DEPRECATED: please move the following sagaRouter config as props of DeleteResource container: { uri: ${uri}, resourceType: ${resourceType}, redirectUrl: ${redirectUrl}, resourcePath: ${resourcePath}, }`); return function* deleteResourceSaga(routerParams) { try { yield (0, _effects.race)({ deleteConfirmationValidate: (0, _effects.call)(deleteResourceValidate, uri, resourceType, routerParams[routerParamsAttribute], resourcePath, collectionId, resourceUri), deleteConfirmationCancel: (0, _effects.call)(deleteResourceCancel) }); } catch (error) { throw new Error(`DeleteResource failed :${error}`); } }; } function* handle() { try { yield (0, _effects.race)({ deleteConfirmationValidate: (0, _effects.call)(deleteResourceValidate), deleteConfirmationCancel: (0, _effects.call)(deleteResourceCancel) }); } catch (error) { throw new Error(`DeleteResource failed: ${error}`); } } // Backward compatibility getDeleteResourceSagaRouter['DeleteResource#handle'] = handle; var _default = exports.default = getDeleteResourceSagaRouter; //# sourceMappingURL=sagas.js.map