diff --git a/website/client/src/components/tasks/approvalFooter.vue b/website/client/src/components/tasks/approvalFooter.vue index f31769205f..182d8bd36b 100644 --- a/website/client/src/components/tasks/approvalFooter.vue +++ b/website/client/src/components/tasks/approvalFooter.vue @@ -39,13 +39,13 @@ v-if="task.group.assignedUsers" > {{ completionsCount }}/{{ assignedUsersCount }} @@ -132,24 +132,27 @@ export default { }, 0); }, completionsList () { + if (this.assignedUsersCount === 1) return []; const completionsArray = []; for (const userId of this.assignedUsersKeys) { - const index = findIndex(this.group.members, member => member._id === userId); - const { completedDate } = this.task.group.assignedUsers[userId]; - let completedDateString; - if (completedDate && moment().diff(completedDate, 'days') > 0) { - completedDateString = `Last completed ${moment(completedDate).format('M/D/YY')}`; - } else { - completedDateString = `Completed today at ${moment(completedDate).format('h:mm A')}`; + if (userId !== this.user._id) { + const index = findIndex(this.group.members, member => member._id === userId); + const { completedDate } = this.task.group.assignedUsers[userId]; + let completedDateString; + if (completedDate && moment().diff(completedDate, 'days') > 0) { + completedDateString = `Last completed ${moment(completedDate).format('M/D/YY')}`; + } else { + completedDateString = `Completed today at ${moment(completedDate).format('h:mm A')}`; + } + completionsArray.push({ + userId, + userName: this.group.members[index].auth.local.username, + completed: this.task.group.assignedUsers[userId].completed, + completedDate, + completedDateString, + completedToday: moment().diff(completedDate, 'days') === 0, + }); } - completionsArray.push({ - userId, - userName: this.group.members[index].auth.local.username, - completed: this.task.group.assignedUsers[userId].completed, - completedDate, - completedDateString, - completedToday: moment().diff(completedDate, 'days') === 0, - }); } return completionsArray; }, diff --git a/website/client/src/components/tasks/task.vue b/website/client/src/components/tasks/task.vue index d25f5cb5cc..76eedd531b 100644 --- a/website/client/src/components/tasks/task.vue +++ b/website/client/src/components/tasks/task.vue @@ -869,6 +869,7 @@ import moment from 'moment'; import { v4 as uuid } from 'uuid'; import isEmpty from 'lodash/isEmpty'; +import keys from 'lodash/keys'; import { mapState, mapGetters, mapActions } from '@/libs/store'; import positiveIcon from '@/assets/svg/positive.svg'; @@ -1059,7 +1060,10 @@ export default { return false; } if (this.task.group.completedBy.userId === this.user._id) return false; - if (this.teamManagerAccess && !this.task.group.assignedUsers) return false; + if (this.teamManagerAccess) { + if (!this.task.group.assignedUsers) return false; + if (keys(this.task.group.assignedUsers).length === 1) return false; + } return true; } if (this.isOpenTask) return false; diff --git a/website/common/locales/en/groups.json b/website/common/locales/en/groups.json index ba18a89248..f0da5d399b 100644 --- a/website/common/locales/en/groups.json +++ b/website/common/locales/en/groups.json @@ -178,10 +178,10 @@ "assignedToUser": "Assigned to @<%- userName %>", "assignedToMembers": "Assigned to <%= userCount %> users", "assignedToYouAndMembers": "Assigned to you and <%= userCount %> users", - "youAreAssigned": "Assigned to you", + "youAreAssigned": "Assigned to you", "taskIsUnassigned": "This task is unassigned", "unassigned": "Unassigned", - "chooseTeamMember": "Choose a team member", + "chooseTeamMember": "Search for a team member", "confirmUnClaim": "Are you sure you want to unclaim this task?", "confirmNeedsWork": "Are you sure you want to mark this task as needing work?", "userRequestsApproval": "<%- userName %> requests approval", diff --git a/website/server/libs/tasks/index.js b/website/server/libs/tasks/index.js index ec4c51f8f6..e01a63e438 100644 --- a/website/server/libs/tasks/index.js +++ b/website/server/libs/tasks/index.js @@ -328,7 +328,7 @@ async function handleTeamTask (task, delta, direction) { */ async function scoreTask (user, task, direction, req, res) { if (task.type === 'daily' || task.type === 'todo') { - if (task.group.id && task.group.assignedUsers) { + if (task.group.id && task.group.assignedUsers && task.group.assignedUsers[user._id]) { if (task.group.assignedUsers[user._id].completed && direction === 'up') { throw new NotAuthorized(res.t('sessionOutdated')); } else if (!task.group.assignedUsers[user._id].completed && direction === 'down') { @@ -363,7 +363,12 @@ async function scoreTask (user, task, direction, req, res) { ) { throw new BadRequest('Cannot uncheck task you did not complete if not a manager.'); } - rollbackUser = await User.findOne({ _id: task.group.completedBy.userId }); + if (task.group.assignedUsers && _.keys(task.group.assignedUsers).length === 1) { + const rollbackUserId = _.keys(task.group.assignedUsers)[0]; + rollbackUser = await User.findOne({ _id: rollbackUserId }); + } else { + rollbackUser = await User.findOne({ _id: task.group.completedBy.userId }); + } task.group.completedBy = {}; }