From d48e59de56cb569ac89b3c6c0d738b17ab9f7b6e Mon Sep 17 00:00:00 2001 From: Jack Nam Date: Mon, 15 May 2023 15:46:14 -0700 Subject: [PATCH 1/9] add new constant --- src/CONST.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/CONST.js b/src/CONST.js index 72ca7712d962..8b380ae2beef 100755 --- a/src/CONST.js +++ b/src/CONST.js @@ -412,6 +412,7 @@ const CONST = { RENAMED: 'RENAMED', CHRONOSOOOLIST: 'CHRONOSOOOLIST', TASKCOMPLETED: 'TASKCOMPLETED', + TASKREOPENED: 'TASKREOPENED', POLICYCHANGELOG: { ADD_APPROVER_RULE: 'POLICYCHANGELOG_ADD_APPROVER_RULE', ADD_CATEGORY: 'POLICYCHANGELOG_ADD_CATEGORY', From 798431d1d81c3a5a48382923c04bc38fa138953d Mon Sep 17 00:00:00 2001 From: Jack Nam Date: Mon, 15 May 2023 15:46:22 -0700 Subject: [PATCH 2/9] create new method to reopenTask --- src/libs/actions/Task.js | 59 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/src/libs/actions/Task.js b/src/libs/actions/Task.js index 00c2fa4766a0..290743ea0196 100644 --- a/src/libs/actions/Task.js +++ b/src/libs/actions/Task.js @@ -154,7 +154,7 @@ function createTaskAndNavigate(currentUserEmail, parentReportID, title, descript function completeTask(taskReportID, parentReportID, taskTitle) { const message = `Completed task: ${taskTitle}`; - const completedTaskReportAction = ReportUtils.buildOptimisticTaskReportAction(taskReportID, CONST.REPORT.ACTIONS.TYPE.TASKCOMPLETED, message); + const completedTaskReportAction = ReportUtils.buildOptimisticTaskReportAction(taskReportID, CONST.REPORT.ACTIONS.TYPE.TASKREOPENED, message); const optimisticData = [ { @@ -208,6 +208,62 @@ function completeTask(taskReportID, parentReportID, taskTitle) { ); } +function reopenTask(taskReportID, parentReportID, taskTitle) { + const message = `Reopened task: ${taskTitle}`; + const reopenedTaskReportAction = ReportUtils.buildOptimisticTaskReportAction(taskReportID, CONST.REPORT.ACTIONS.TYPE.TASKCOMPLETED, message); + + const optimisticData = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${taskReportID}`, + value: { + stateNum: CONST.REPORT.STATE_NUM.OPEN, + statusNum: CONST.REPORT.STATUS.OPEN, + }, + }, + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${parentReportID}`, + value: { + lastVisibleActionCreated: reopenedTaskReportAction.created, + lastMessageText: message, + lastActorEmail: reopenedTaskReportAction.actorEmail, + }, + }, + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${parentReportID}`, + value: {[reopenedTaskReportAction.reportActionID]: reopenedTaskReportAction}, + }, + ]; + + const successData = []; + const failureData = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT}${taskReportID}`, + value: { + stateNum: CONST.REPORT.STATE_NUM.SUBMITTED, + statusNum: CONST.REPORT.STATUS.APPROVED, + }, + }, + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${parentReportID}`, + value: {[reopenedTaskReportAction.reportActionID]: {pendingAction: null}}, + }, + ]; + + API.write( + 'ReopenTask', + { + taskReportID, + reopenedTaskReportActionID: reopenedTaskReportAction.reportActionID, + }, + {optimisticData, successData, failureData}, + ); +} + /** * @function editTask * @param {object} report @@ -450,6 +506,7 @@ export { setAssigneeValue, setShareDestinationValue, clearOutTaskInfo, + reopenTask, completeTask, clearOutTaskInfoAndNavigate, getAssignee, From ebcfb396c3df087a7195c1c0d02de96b8a1b1e2a Mon Sep 17 00:00:00 2001 From: Jack Nam Date: Mon, 15 May 2023 15:46:29 -0700 Subject: [PATCH 3/9] call this method --- src/components/ReportActionItem/TaskPreview.js | 5 +++-- src/pages/home/HeaderView.js | 4 +--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/components/ReportActionItem/TaskPreview.js b/src/components/ReportActionItem/TaskPreview.js index 3059be499f91..394ca5d9e366 100644 --- a/src/components/ReportActionItem/TaskPreview.js +++ b/src/components/ReportActionItem/TaskPreview.js @@ -71,9 +71,10 @@ const TaskPreview = (props) => { isChecked={isTaskCompleted} onPress={() => { if (isTaskCompleted) { - return; + TaskUtils.reopenTask(props.taskReportID, parentReportID, taskTitle); + } else { + TaskUtils.completeTask(props.taskReportID, parentReportID, taskTitle); } - TaskUtils.completeTask(props.taskReportID, parentReportID, taskTitle); }} /> {taskTitle} diff --git a/src/pages/home/HeaderView.js b/src/pages/home/HeaderView.js index 3cb61eda625f..5d493e46eb8f 100644 --- a/src/pages/home/HeaderView.js +++ b/src/pages/home/HeaderView.js @@ -103,9 +103,7 @@ const HeaderView = (props) => { threeDotMenuItems.push({ icon: Expensicons.Checkmark, text: props.translate('newTaskPage.markAsIncomplete'), - - // Implementing in https://github.com/Expensify/App/issues/16858 - onSelected: () => {}, + onSelected: () => TaskUtils.reopenTask(props.report.reportID, props.report.parentReportID, title), }); } From e022226dc2544c41a7a740efe6ef3ef42b153da0 Mon Sep 17 00:00:00 2001 From: Jack Nam Date: Mon, 15 May 2023 17:36:25 -0700 Subject: [PATCH 4/9] add reopen message --- src/components/ReportActionItem/TaskAction.js | 13 ++++++++++++- src/languages/en.js | 1 + src/languages/es.js | 3 ++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/components/ReportActionItem/TaskAction.js b/src/components/ReportActionItem/TaskAction.js index 265b92c92512..f1e94b0b5ed9 100644 --- a/src/components/ReportActionItem/TaskAction.js +++ b/src/components/ReportActionItem/TaskAction.js @@ -49,7 +49,18 @@ const TaskAction = (props) => { const taskReportID = props.taskReportID; const taskReportName = props.taskReport.reportName || ''; - const messageLinkText = props.actionName === CONST.REPORT.ACTIONS.TYPE.TASKCOMPLETED ? props.translate('task.messages.completed') : props.translate('newTaskPage.task'); + let messageLinkText = ''; + switch (props.actionName) { + case CONST.REPORT.ACTIONS.TYPE.TASKCOMPLETED: + messageLinkText = props.translate('task.messages.completed'); + break; + case CONST.REPORT.ACTIONS.TYPE.TASKREOPENED: + messageLinkText = props.translate('task.messages.reopened'); + break; + default: + messageLinkText = props.translate('newTaskPage.task'); + } + return ( Navigation.navigate(ROUTES.getReportRoute(taskReportID))} diff --git a/src/languages/en.js b/src/languages/en.js index 5726a5a9089f..ddad4a64e532 100755 --- a/src/languages/en.js +++ b/src/languages/en.js @@ -1197,6 +1197,7 @@ export default { completed: 'Completed', messages: { completed: 'Completed task', + reopened: 'Reopened task', }, }, statementPage: { diff --git a/src/languages/es.js b/src/languages/es.js index 0d04dea828a5..ed3ca1ba0e04 100644 --- a/src/languages/es.js +++ b/src/languages/es.js @@ -1201,7 +1201,8 @@ export default { task: { completed: 'Completada', messages: { - completed: 'tarea completada', + completed: 'Tarea completada', + reopened: 'Tarea reabrir', }, }, statementPage: { From 91b639a7537cbe4aad2fe41d9219369aadea3fe4 Mon Sep 17 00:00:00 2001 From: Jack Nam Date: Mon, 15 May 2023 17:43:25 -0700 Subject: [PATCH 5/9] add the right reportAction --- src/libs/actions/Task.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/actions/Task.js b/src/libs/actions/Task.js index 290743ea0196..1ffe814638fd 100644 --- a/src/libs/actions/Task.js +++ b/src/libs/actions/Task.js @@ -210,7 +210,7 @@ function completeTask(taskReportID, parentReportID, taskTitle) { function reopenTask(taskReportID, parentReportID, taskTitle) { const message = `Reopened task: ${taskTitle}`; - const reopenedTaskReportAction = ReportUtils.buildOptimisticTaskReportAction(taskReportID, CONST.REPORT.ACTIONS.TYPE.TASKCOMPLETED, message); + const reopenedTaskReportAction = ReportUtils.buildOptimisticTaskReportAction(taskReportID, CONST.REPORT.ACTIONS.TYPE.TASKREOPENED, message); const optimisticData = [ { From 7e504777973e3b255b3a5b569b91cd228b24a1bf Mon Sep 17 00:00:00 2001 From: Jack Nam Date: Mon, 15 May 2023 17:46:17 -0700 Subject: [PATCH 6/9] change back complete --- src/libs/actions/Task.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/actions/Task.js b/src/libs/actions/Task.js index 1ffe814638fd..bce05d64f0b3 100644 --- a/src/libs/actions/Task.js +++ b/src/libs/actions/Task.js @@ -154,7 +154,7 @@ function createTaskAndNavigate(currentUserEmail, parentReportID, title, descript function completeTask(taskReportID, parentReportID, taskTitle) { const message = `Completed task: ${taskTitle}`; - const completedTaskReportAction = ReportUtils.buildOptimisticTaskReportAction(taskReportID, CONST.REPORT.ACTIONS.TYPE.TASKREOPENED, message); + const completedTaskReportAction = ReportUtils.buildOptimisticTaskReportAction(taskReportID, CONST.REPORT.ACTIONS.TYPE.TASKCOMPLETED, message); const optimisticData = [ { From 8317e2f731b1aad6fd3f2e2056dfa54f51963baa Mon Sep 17 00:00:00 2001 From: Jack Nam Date: Mon, 15 May 2023 18:24:21 -0700 Subject: [PATCH 7/9] add jsdoc --- src/libs/actions/Task.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/libs/actions/Task.js b/src/libs/actions/Task.js index bce05d64f0b3..33d4d918973c 100644 --- a/src/libs/actions/Task.js +++ b/src/libs/actions/Task.js @@ -208,6 +208,12 @@ function completeTask(taskReportID, parentReportID, taskTitle) { ); } +/** + * Reopens a closed task + * @param {*} taskReportID ReportID of the task + * @param {*} parentReportID ReportID of the linked parent report of the task so we can add the action + * @param {*} taskTitle Title of the task + */ function reopenTask(taskReportID, parentReportID, taskTitle) { const message = `Reopened task: ${taskTitle}`; const reopenedTaskReportAction = ReportUtils.buildOptimisticTaskReportAction(taskReportID, CONST.REPORT.ACTIONS.TYPE.TASKREOPENED, message); From dcfafe727d35fb6389de9ae7eed8bf31e63afd33 Mon Sep 17 00:00:00 2001 From: Jack Nam Date: Mon, 15 May 2023 18:37:03 -0700 Subject: [PATCH 8/9] make all strings --- src/libs/actions/Task.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/libs/actions/Task.js b/src/libs/actions/Task.js index 33d4d918973c..1dfa8cfc7393 100644 --- a/src/libs/actions/Task.js +++ b/src/libs/actions/Task.js @@ -210,9 +210,9 @@ function completeTask(taskReportID, parentReportID, taskTitle) { /** * Reopens a closed task - * @param {*} taskReportID ReportID of the task - * @param {*} parentReportID ReportID of the linked parent report of the task so we can add the action - * @param {*} taskTitle Title of the task + * @param {string} taskReportID ReportID of the task + * @param {string} parentReportID ReportID of the linked parent report of the task so we can add the action + * @param {string} taskTitle Title of the task */ function reopenTask(taskReportID, parentReportID, taskTitle) { const message = `Reopened task: ${taskTitle}`; From 5704c4deb343b2721f3b6fa9746010414c78c2e3 Mon Sep 17 00:00:00 2001 From: Jack Nam Date: Mon, 15 May 2023 18:40:05 -0700 Subject: [PATCH 9/9] Update IOUPreview.js --- src/components/ReportActionItem/IOUPreview.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ReportActionItem/IOUPreview.js b/src/components/ReportActionItem/IOUPreview.js index ec74e82a22d8..a63aaca4ff88 100644 --- a/src/components/ReportActionItem/IOUPreview.js +++ b/src/components/ReportActionItem/IOUPreview.js @@ -148,7 +148,7 @@ const IOUPreview = (props) => { // If props.action is undefined then we are displaying within IOUDetailsModal and should use the full report amount const requestAmount = props.isIOUAction ? moneyRequestAction.total : ReportUtils.getMoneyRequestTotal(props.iouReport); const requestCurrency = props.isIOUAction ? moneyRequestAction.currency : props.iouReport.currency; - const requestComment = Str.htmlDecode(moneyRequestAction.comment).trim() + const requestComment = Str.htmlDecode(moneyRequestAction.comment).trim(); const getSettledMessage = () => { switch (lodashGet(props.action, 'originalMessage.paymentType', '')) {