diff --git a/src/actions.js b/src/actions.js index 19eb1a5..a8d980e 100644 --- a/src/actions.js +++ b/src/actions.js @@ -1,11 +1,13 @@ import { graphql, formatQuery, + formatMutation, } from '@openimis/fe-core'; import { ACTION_TYPE } from './reducer'; +import { ERROR, REQUEST, SUCCESS } from './util/action-type'; const DEDUPLICATION_SUMMARY_FULL_PROJECTION = () => [ - 'rows {count, columnValues}', + 'rows {count, ids, columnValues}', ]; // eslint-disable-next-line import/prefer-default-export @@ -13,3 +15,37 @@ export function fetchDeduplicationSummary(params) { const payload = formatQuery('beneficiaryDeduplicationSummary', params, DEDUPLICATION_SUMMARY_FULL_PROJECTION()); return graphql(payload, ACTION_TYPE.GET_DEDUPLICATION_SUMMARY); } + +function formatDeduplicationTasksMutation(summary) { + if (!summary || !Array.isArray(summary)) { + return ''; + } + + const formattedSummary = summary.map((item) => { + const keyValuePairs = Object.entries(item) + .map(([key, value]) => `${key}: ${JSON.stringify(value)}`) + .join(', '); + + return `{ ${keyValuePairs} }`; + }); + + return `summary: [${formattedSummary.join(', ')}]`; +} +export function createDeduplicationTasks(summary, clientMutationLabel) { + const mutation = formatMutation( + 'createDeduplicationTasks', + formatDeduplicationTasksMutation(summary), + clientMutationLabel, + ); + const requestedDateTime = new Date(); + return graphql( + mutation.payload, + [REQUEST(ACTION_TYPE.MUTATION), SUCCESS(ACTION_TYPE.CREATE_DEDUPLICATION_TASKS), ERROR(ACTION_TYPE.MUTATION)], + { + actionType: ACTION_TYPE.CREATE_DEDUPLICATION_TASKS, + clientMutationId: mutation.clientMutationId, + clientMutationLabel, + requestedDateTime, + }, + ); +} diff --git a/src/components/dialogs/DeduplicationFieldSelectionDialog.js b/src/components/dialogs/DeduplicationFieldSelectionDialog.js index aedf531..e349f42 100644 --- a/src/components/dialogs/DeduplicationFieldSelectionDialog.js +++ b/src/components/dialogs/DeduplicationFieldSelectionDialog.js @@ -136,6 +136,7 @@ function DeduplicationFieldSelectionDialog({ benefitPlan={benefitPlan} handleClose={handleSummaryDialogClose} showSummaryDialog={showSummaryDialog} + setShowSummaryDialog={setShowSummaryDialog} selectedValues={selectedValues} setSelectedValues={setSelectedValues} /> diff --git a/src/components/dialogs/DeduplicationSummaryDialog.js b/src/components/dialogs/DeduplicationSummaryDialog.js index 2f60f52..8f2ab60 100644 --- a/src/components/dialogs/DeduplicationSummaryDialog.js +++ b/src/components/dialogs/DeduplicationSummaryDialog.js @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useState } from 'react'; import { injectIntl } from 'react-intl'; import Button from '@material-ui/core/Button'; import Dialog from '@material-ui/core/Dialog'; @@ -10,7 +10,7 @@ import { withTheme, withStyles } from '@material-ui/core/styles'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import DeduplicationSummaryTable from '../tables/DeduplicationSummaryTable'; -import { fetchDeduplicationSummary } from '../../actions'; +import { createDeduplicationTasks, fetchDeduplicationSummary } from '../../actions'; const styles = (theme) => ({ item: theme.paper.item, @@ -21,13 +21,23 @@ function DeduplicationSummaryDialog({ benefitPlan, handleClose, showSummaryDialog, + setShowSummaryDialog, selectedValues, + createDeduplicationTasks, }) { + const [summary, setSummary] = useState(); if (!benefitPlan) return null; const columns = selectedValues.map((value) => value.id); const columnParam = `columns: ${JSON.stringify(columns)}`; + const onDeduplicationTasksClick = () => { + if (summary) { + createDeduplicationTasks(summary, formatMessage(intl, 'deduplication', 'deduplicate.mutation.createTasks')); + } + setShowSummaryDialog(false); + }; + return ( []} + onClick={() => onDeduplicationTasksClick()} variant="outlined" autoFocus + disabled={!summary} style={{ margin: '0 16px' }} > {formatMessage(intl, 'deduplication', 'deduplicate.button.createDeduplicationReviewTask')} @@ -98,6 +110,7 @@ const mapStateToProps = (state) => ({ }); const mapDispatchToProps = (dispatch) => bindActionCreators({ + createDeduplicationTasks, }, dispatch); export default injectIntl( diff --git a/src/components/tables/DeduplicationSummaryTable.js b/src/components/tables/DeduplicationSummaryTable.js index 458ebeb..452c7d7 100644 --- a/src/components/tables/DeduplicationSummaryTable.js +++ b/src/components/tables/DeduplicationSummaryTable.js @@ -27,7 +27,7 @@ const DEDUPLICATION_SUMMARY_HEADERS = [ ]; function DeduplicationSummaryTable({ - columnParam, benefitPlan, fetchDeduplicationSummary, + columnParam, benefitPlan, fetchDeduplicationSummary, setSummary, }) { const dispatch = useDispatch(); const modulesManager = useModulesManager(); @@ -42,6 +42,10 @@ function DeduplicationSummaryTable({ dispatch(fetchDeduplicationSummary(params)); }, []); + useEffect(() => { + setSummary(summary); + }, [summary]); + function reshapeColumnValues(inputString) { const columnValues = JSON.parse(inputString); const formattedValues = Object.entries(columnValues).map(([key, value]) => { diff --git a/src/reducer.js b/src/reducer.js index 5b5b602..6419049 100644 --- a/src/reducer.js +++ b/src/reducer.js @@ -3,13 +3,16 @@ import { formatServerError, + dispatchMutationResp, } from '@openimis/fe-core'; import { ERROR, REQUEST, SUCCESS, } from './util/action-type'; export const ACTION_TYPE = { + MUTATION: 'MUTATION', GET_DEDUPLICATION_SUMMARY: 'DEDUPLICATION_GET_DEDUPLICATION_SUMMARY', + CREATE_DEDUPLICATION_TASKS: 'CREATE_DEDUPLICATION_TASKS', }; function reducer( @@ -47,6 +50,8 @@ function reducer( fetchingSummary: false, errorSummary: formatServerError(action.payload), }; + case SUCCESS(ACTION_TYPE.CREATE_DEDUPLICATION_TASKS): + return dispatchMutationResp(state, 'createDeduplicationTasks', action); default: return state; } diff --git a/src/translations/en.json b/src/translations/en.json index ceb3e4e..d1d4fbb 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -8,5 +8,6 @@ "deduplication.deduplicate.summary.title": "Deduplication Summary", "deduplication.deduplicate.button.createDeduplicationReviewTask": "Create Deduplication Review Tasks", "deduplication.deduplicationSummaryTable.group": "Group", - "deduplication.deduplicationSummaryTable.duplicates": "Duplicates" + "deduplication.deduplicationSummaryTable.duplicates": "Duplicates", + "deduplication.deduplicate.mutation.createTasks": "Deduplication tasks have been created." } \ No newline at end of file