From f12b3905774cf220d1f8b201fd246f111c285cf9 Mon Sep 17 00:00:00 2001 From: Youssef Lourayad Date: Thu, 15 Jun 2023 13:02:44 +0100 Subject: [PATCH 01/12] Show green dot for uncompleted tasks assigned to current user --- src/components/LHNOptionsList/OptionRowLHN.js | 2 +- src/libs/ReportUtils.js | 11 +++++++++++ src/libs/SidebarUtils.js | 6 +++++- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/components/LHNOptionsList/OptionRowLHN.js b/src/components/LHNOptionsList/OptionRowLHN.js index 4d5e19299e5c..67dabd63f62a 100644 --- a/src/components/LHNOptionsList/OptionRowLHN.js +++ b/src/components/LHNOptionsList/OptionRowLHN.js @@ -83,7 +83,7 @@ function OptionRowLHN(props) { const focusedBackgroundColor = styles.sidebarLinkActive.backgroundColor; const hasBrickError = optionItem.brickRoadIndicator === CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR; - const shouldShowGreenDotIndicator = !hasBrickError && (optionItem.isUnreadWithMention || (optionItem.hasOutstandingIOU && !optionItem.isIOUReportOwner)); + const shouldShowGreenDotIndicator = !hasBrickError && (optionItem.isUnreadWithMention || (optionItem.hasOutstandingIOU && !optionItem.isIOUReportOwner) || (optionItem.isTaskReport && optionItem.isTaskAssignee && !optionItem.isTaskCompleted)); /** * Show the ReportActionContextMenu modal popover. diff --git a/src/libs/ReportUtils.js b/src/libs/ReportUtils.js index 498c519661f2..5f6fcddaa7d4 100644 --- a/src/libs/ReportUtils.js +++ b/src/libs/ReportUtils.js @@ -147,6 +147,15 @@ function isTaskReport(report) { return lodashGet(report, 'type') === CONST.REPORT.TYPE.TASK; } +function isTaskCompleted(report) { + return lodashGet(report, 'stateNum') === CONST.REPORT.STATE_NUM.SUBMITTED + && lodashGet(report, 'statusNum') === CONST.REPORT.STATUS.APPROVED;; +} + +function isTaskAssignee(report) { + return lodashGet(report, 'managerEmail') === currentUserEmail; +} + /** * Checks if a report is an IOU or expense report. * @@ -2255,6 +2264,8 @@ export { isExpenseReport, isIOUReport, isTaskReport, + isTaskCompleted, + isTaskAssignee, isMoneyRequestReport, chatIncludesChronos, getNewMarkerReportActionID, diff --git a/src/libs/SidebarUtils.js b/src/libs/SidebarUtils.js index eace44054613..d1a3f6be42ff 100644 --- a/src/libs/SidebarUtils.js +++ b/src/libs/SidebarUtils.js @@ -177,7 +177,7 @@ function getOrderedReportIDs(reportIDFromRoute) { return; } - if (ReportUtils.isTaskReport(report) && report.stateNum !== CONST.REPORT.STATE.OPEN && report.statusNum !== CONST.REPORT.STATUS.OPEN) { + if (ReportUtils.isTaskReport(report) && ReportUtils.isTaskCompleted(report)) { archivedReports.push(report); return; } @@ -258,6 +258,10 @@ function getOptionData(reportID) { result.isThread = ReportUtils.isThread(report); result.isChatRoom = ReportUtils.isChatRoom(report); result.isTaskReport = ReportUtils.isTaskReport(report); + if (result.isTaskReport) { + result.isTaskCompleted = ReportUtils.isTaskCompleted(report); + result.isTaskAssignee = ReportUtils.isTaskAssignee(report, currentUserLogin.email); + } result.isArchivedRoom = ReportUtils.isArchivedRoom(report); result.isPolicyExpenseChat = ReportUtils.isPolicyExpenseChat(report); result.isMoneyRequestReport = ReportUtils.isMoneyRequestReport(report); From 4f2229059bc2ad66b71a2355af0080fd2d53addb Mon Sep 17 00:00:00 2001 From: Youssef Lourayad Date: Thu, 15 Jun 2023 13:52:12 +0100 Subject: [PATCH 02/12] Apply suggestions from code review Co-authored-by: Georgia Monahan <38015950+grgia@users.noreply.github.com> --- src/libs/ReportUtils.js | 2 +- src/libs/SidebarUtils.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libs/ReportUtils.js b/src/libs/ReportUtils.js index 5f6fcddaa7d4..e4121a3f5b31 100644 --- a/src/libs/ReportUtils.js +++ b/src/libs/ReportUtils.js @@ -149,7 +149,7 @@ function isTaskReport(report) { function isTaskCompleted(report) { return lodashGet(report, 'stateNum') === CONST.REPORT.STATE_NUM.SUBMITTED - && lodashGet(report, 'statusNum') === CONST.REPORT.STATUS.APPROVED;; + && lodashGet(report, 'statusNum') === CONST.REPORT.STATUS.APPROVED; } function isTaskAssignee(report) { diff --git a/src/libs/SidebarUtils.js b/src/libs/SidebarUtils.js index d1a3f6be42ff..5fd0857b313a 100644 --- a/src/libs/SidebarUtils.js +++ b/src/libs/SidebarUtils.js @@ -260,7 +260,7 @@ function getOptionData(reportID) { result.isTaskReport = ReportUtils.isTaskReport(report); if (result.isTaskReport) { result.isTaskCompleted = ReportUtils.isTaskCompleted(report); - result.isTaskAssignee = ReportUtils.isTaskAssignee(report, currentUserLogin.email); + result.isTaskAssignee = ReportUtils.isTaskAssignee(report); } result.isArchivedRoom = ReportUtils.isArchivedRoom(report); result.isPolicyExpenseChat = ReportUtils.isPolicyExpenseChat(report); From 0421d53d322d4cc297649904b59275900a93aaa5 Mon Sep 17 00:00:00 2001 From: Youssef Lourayad Date: Thu, 15 Jun 2023 13:57:28 +0100 Subject: [PATCH 03/12] Add JSDocs --- src/libs/ReportUtils.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/libs/ReportUtils.js b/src/libs/ReportUtils.js index e4121a3f5b31..0cf086df7f6b 100644 --- a/src/libs/ReportUtils.js +++ b/src/libs/ReportUtils.js @@ -147,11 +147,23 @@ function isTaskReport(report) { return lodashGet(report, 'type') === CONST.REPORT.TYPE.TASK; } +/** + * Checks if a task is completed + * + * @param {Object} report + * @returns {Boolean} + */ function isTaskCompleted(report) { return lodashGet(report, 'stateNum') === CONST.REPORT.STATE_NUM.SUBMITTED && lodashGet(report, 'statusNum') === CONST.REPORT.STATUS.APPROVED; } +/** + * Checks if the current user is assigned to the task report + * + * @param {Object} report + * @returns {Boolean} + */ function isTaskAssignee(report) { return lodashGet(report, 'managerEmail') === currentUserEmail; } From 44db560910b57e7446f78643613da0a04539b8d4 Mon Sep 17 00:00:00 2001 From: Youssef Lourayad Date: Thu, 15 Jun 2023 14:26:17 +0100 Subject: [PATCH 04/12] Fix bug when assigning tasks --- 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 f60aa051035d..0b44fb660607 100644 --- a/src/libs/actions/Task.js +++ b/src/libs/actions/Task.js @@ -493,7 +493,7 @@ function setAssigneeValue(assignee, assigneeAccountID, shareDestination, isCurre } // This is only needed for creation of a new task and so it should only be stored locally - Onyx.merge(ONYXKEYS.TASK, {assignee, newAssigneeAccountID}); + Onyx.merge(ONYXKEYS.TASK, {assignee, assigneeAccountID: newAssigneeAccountID}); } /** From 7cef0a7711148f6e58dc5b556667336f9cce85fc Mon Sep 17 00:00:00 2001 From: Youssef Lourayad Date: Thu, 15 Jun 2023 14:28:23 +0100 Subject: [PATCH 05/12] Prettier --- src/components/LHNOptionsList/OptionRowLHN.js | 6 +++++- src/libs/ReportUtils.js | 3 +-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/components/LHNOptionsList/OptionRowLHN.js b/src/components/LHNOptionsList/OptionRowLHN.js index 67dabd63f62a..1a25e5bbf223 100644 --- a/src/components/LHNOptionsList/OptionRowLHN.js +++ b/src/components/LHNOptionsList/OptionRowLHN.js @@ -83,7 +83,11 @@ function OptionRowLHN(props) { const focusedBackgroundColor = styles.sidebarLinkActive.backgroundColor; const hasBrickError = optionItem.brickRoadIndicator === CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR; - const shouldShowGreenDotIndicator = !hasBrickError && (optionItem.isUnreadWithMention || (optionItem.hasOutstandingIOU && !optionItem.isIOUReportOwner) || (optionItem.isTaskReport && optionItem.isTaskAssignee && !optionItem.isTaskCompleted)); + const shouldShowGreenDotIndicator = + !hasBrickError && + (optionItem.isUnreadWithMention || + (optionItem.hasOutstandingIOU && !optionItem.isIOUReportOwner) || + (optionItem.isTaskReport && optionItem.isTaskAssignee && !optionItem.isTaskCompleted)); /** * Show the ReportActionContextMenu modal popover. diff --git a/src/libs/ReportUtils.js b/src/libs/ReportUtils.js index a3c40d085f10..02c3308898f8 100644 --- a/src/libs/ReportUtils.js +++ b/src/libs/ReportUtils.js @@ -150,8 +150,7 @@ function isTaskReport(report) { * @returns {Boolean} */ function isTaskCompleted(report) { - return lodashGet(report, 'stateNum') === CONST.REPORT.STATE_NUM.SUBMITTED - && lodashGet(report, 'statusNum') === CONST.REPORT.STATUS.APPROVED; + return lodashGet(report, 'stateNum') === CONST.REPORT.STATE_NUM.SUBMITTED && lodashGet(report, 'statusNum') === CONST.REPORT.STATUS.APPROVED; } /** From 90f06a0ae0e78f582edf6b54bc0dc21230869fec Mon Sep 17 00:00:00 2001 From: Youssef Lourayad Date: Thu, 15 Jun 2023 14:50:12 +0100 Subject: [PATCH 06/12] Use the new isTaskCompleted --- src/components/TaskHeader.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/TaskHeader.js b/src/components/TaskHeader.js index a44c841b87da..5bbc8205a60c 100644 --- a/src/components/TaskHeader.js +++ b/src/components/TaskHeader.js @@ -39,7 +39,7 @@ function TaskHeader(props) { const assigneeName = ReportUtils.getDisplayNameForParticipant(props.report.managerID); const assigneeAvatar = UserUtils.getAvatar(lodashGet(props.personalDetails, [props.report.managerID, 'avatar']), props.report.managerID); const isOpen = props.report.stateNum === CONST.REPORT.STATE_NUM.OPEN && props.report.statusNum === CONST.REPORT.STATUS.OPEN; - const isCompleted = props.report.stateNum === CONST.REPORT.STATE_NUM.SUBMITTED && props.report.statusNum === CONST.REPORT.STATUS.APPROVED; + const isCompleted = ReportUtils.isTaskCompleted(props.report); useEffect(() => { TaskUtils.setTaskReport(props.report); From 76de9346d05c0bd7038d2923d2c20acc1f840525 Mon Sep 17 00:00:00 2001 From: Youssef Lourayad Date: Thu, 15 Jun 2023 15:09:00 +0100 Subject: [PATCH 07/12] Fix assignee not displayed in task header --- src/components/TaskHeader.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/TaskHeader.js b/src/components/TaskHeader.js index 5bbc8205a60c..0ac866767d7c 100644 --- a/src/components/TaskHeader.js +++ b/src/components/TaskHeader.js @@ -35,8 +35,10 @@ const propTypes = { }; function TaskHeader(props) { + console.log(props.report); const title = ReportUtils.getReportName(props.report); const assigneeName = ReportUtils.getDisplayNameForParticipant(props.report.managerID); + console.log(props.report.managerID, assigneeName); const assigneeAvatar = UserUtils.getAvatar(lodashGet(props.personalDetails, [props.report.managerID, 'avatar']), props.report.managerID); const isOpen = props.report.stateNum === CONST.REPORT.STATE_NUM.OPEN && props.report.statusNum === CONST.REPORT.STATUS.OPEN; const isCompleted = ReportUtils.isTaskCompleted(props.report); @@ -60,7 +62,7 @@ function TaskHeader(props) { > - {!_.isEmpty(props.report.managerID) && ( + {props.report.managerID && ( <> Date: Thu, 15 Jun 2023 15:57:42 +0100 Subject: [PATCH 08/12] Cleanup --- src/components/TaskHeader.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/components/TaskHeader.js b/src/components/TaskHeader.js index 0ac866767d7c..03a823e6d567 100644 --- a/src/components/TaskHeader.js +++ b/src/components/TaskHeader.js @@ -2,7 +2,6 @@ import React, {useEffect} from 'react'; import {View} from 'react-native'; import PropTypes from 'prop-types'; import lodashGet from 'lodash/get'; -import _ from 'underscore'; import reportPropTypes from '../pages/reportPropTypes'; import withLocalize, {withLocalizePropTypes} from './withLocalize'; import * as ReportUtils from '../libs/ReportUtils'; @@ -35,10 +34,8 @@ const propTypes = { }; function TaskHeader(props) { - console.log(props.report); const title = ReportUtils.getReportName(props.report); const assigneeName = ReportUtils.getDisplayNameForParticipant(props.report.managerID); - console.log(props.report.managerID, assigneeName); const assigneeAvatar = UserUtils.getAvatar(lodashGet(props.personalDetails, [props.report.managerID, 'avatar']), props.report.managerID); const isOpen = props.report.stateNum === CONST.REPORT.STATE_NUM.OPEN && props.report.statusNum === CONST.REPORT.STATUS.OPEN; const isCompleted = ReportUtils.isTaskCompleted(props.report); From 31594b72e6930fbe29c0c91e393303a5db8575bd Mon Sep 17 00:00:00 2001 From: Youssef Lourayad Date: Thu, 15 Jun 2023 17:11:57 +0100 Subject: [PATCH 09/12] Make check more reliable --- src/components/TaskHeader.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/TaskHeader.js b/src/components/TaskHeader.js index 03a823e6d567..0140cf8d6540 100644 --- a/src/components/TaskHeader.js +++ b/src/components/TaskHeader.js @@ -59,7 +59,7 @@ function TaskHeader(props) { > - {props.report.managerID && ( + {props.report.managerID > 0 && ( <> Date: Thu, 15 Jun 2023 18:03:15 +0100 Subject: [PATCH 10/12] Fix bug when trying to edit a task and assign it to self --- src/libs/actions/Task.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/libs/actions/Task.js b/src/libs/actions/Task.js index 0b44fb660607..77a0d5d40bee 100644 --- a/src/libs/actions/Task.js +++ b/src/libs/actions/Task.js @@ -309,8 +309,11 @@ function editTaskAndNavigate(report, ownerEmail, ownerAccountID, {title, descrip let optimisticAssigneeAddComment; let assigneeChatReportID; if (assigneeAccountID && assigneeAccountID !== report.managerID) { - assigneeChatReportID = ReportUtils.getChatByParticipants([assigneeAccountID]).reportID; - if (assigneeChatReportID !== report.parentReportID.toString()) { + const assigneeChatReport = ReportUtils.getChatByParticipants([assigneeAccountID]); + + // assigneeChatReportID may not exist if we're assigning the task to ourselves and if it's not shared in a room + if (assigneeChatReport && assigneeChatReport.reportID !== report.parentReportID.toString()) { + assigneeChatReportID = assigneeChatReport.reportID; optimisticAssigneeAddComment = ReportUtils.buildOptimisticTaskCommentReportAction( report.reportID, reportName, From ccd79e828c8ff397912840941764469af0194005 Mon Sep 17 00:00:00 2001 From: Youssef Lourayad Date: Thu, 15 Jun 2023 18:49:50 +0100 Subject: [PATCH 11/12] Make check more reliable --- src/components/TaskHeader.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/TaskHeader.js b/src/components/TaskHeader.js index 0140cf8d6540..001ed2b10bdd 100644 --- a/src/components/TaskHeader.js +++ b/src/components/TaskHeader.js @@ -59,7 +59,7 @@ function TaskHeader(props) { > - {props.report.managerID > 0 && ( + {props.report.managerID && props.report.managerID > 0 && ( <> Date: Thu, 15 Jun 2023 18:59:25 +0100 Subject: [PATCH 12/12] Fix condition --- src/libs/actions/Task.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/libs/actions/Task.js b/src/libs/actions/Task.js index 77a0d5d40bee..4003ba8002f0 100644 --- a/src/libs/actions/Task.js +++ b/src/libs/actions/Task.js @@ -308,12 +308,10 @@ function editTaskAndNavigate(report, ownerEmail, ownerAccountID, {title, descrip // If we make a change to the assignee, we want to add a comment to the assignee's chat let optimisticAssigneeAddComment; let assigneeChatReportID; - if (assigneeAccountID && assigneeAccountID !== report.managerID) { - const assigneeChatReport = ReportUtils.getChatByParticipants([assigneeAccountID]); + if (assigneeAccountID && assigneeAccountID !== report.managerID && assigneeAccountID !== ownerAccountID) { + assigneeChatReportID = ReportUtils.getChatByParticipants([assigneeAccountID]).reportID; - // assigneeChatReportID may not exist if we're assigning the task to ourselves and if it's not shared in a room - if (assigneeChatReport && assigneeChatReport.reportID !== report.parentReportID.toString()) { - assigneeChatReportID = assigneeChatReport.reportID; + if (assigneeChatReportID !== report.parentReportID.toString()) { optimisticAssigneeAddComment = ReportUtils.buildOptimisticTaskCommentReportAction( report.reportID, reportName,