diff --git a/website/client/src/components/group-plans/taskInformation.vue b/website/client/src/components/group-plans/taskInformation.vue
index f69f5abb93..1d80e354d2 100644
--- a/website/client/src/components/group-plans/taskInformation.vue
+++ b/website/client/src/components/group-plans/taskInformation.vue
@@ -10,8 +10,8 @@
:purpose="taskFormPurpose"
:group-id="groupId"
@cancel="cancelTaskModal()"
- @taskCreated="taskCreated"
- @taskEdited="taskEdited"
+ @taskCreated="loadTasks"
+ @taskEdited="loadTasks"
@taskDestroyed="taskDestroyed"
/>
@@ -327,15 +327,6 @@ export default {
this.$root.$emit('bv::show::modal', 'task-modal');
});
},
- taskCreated (task) {
- task.group.id = this.group._id;
- this.tasksByType[task.type].unshift(task);
- },
- taskEdited (task) {
- const index = findIndex(this.tasksByType[task.type], taskItem => taskItem._id === task._id);
- this.tasksByType[task.type].splice(index, 1, task);
- this.loadTasks();
- },
taskDestroyed (task) {
const index = findIndex(this.tasksByType[task.type], taskItem => taskItem._id === task._id);
this.tasksByType[task.type].splice(index, 1);
diff --git a/website/common/script/ops/scoreTask.js b/website/common/script/ops/scoreTask.js
index fb2e3c9abb..fde25eb441 100644
--- a/website/common/script/ops/scoreTask.js
+++ b/website/common/script/ops/scoreTask.js
@@ -293,36 +293,69 @@ export default function scoreTask (options = {}, req = {}, analytics) {
_gainMP(user, max([1, 0.01 * statsComputed(user).maxMP]) * (direction === 'down' ? -1 : 1));
if (direction === 'up') {
- task.streak += 1;
- // Give a streak achievement when the streak is a multiple of 21
- if (task.streak !== 0 && task.streak % 21 === 0) {
- user.achievements.streak = user.achievements.streak ? user.achievements.streak + 1 : 1;
- if (user.addNotification) user.addNotification('STREAK_ACHIEVEMENT');
- }
- if (task.group) task.group.completedBy = user._id;
- task.completed = true;
+ if (task.group.id) {
+ if (!task.group.assignedUsers) {
+ task.group.completedBy = {
+ userId: user._id,
+ date: new Date(),
+ };
+ task.completed = true;
+ task.streak += 1;
+ } else {
+ task.group.assignedUsers[user._id].completed = true;
+ task.group.assignedUsers[user._id].completedDate = new Date();
+ if (!find(task.group.assignedUsers, assignedUser => !assignedUser.completed)) {
+ task.dateCompleted = new Date();
+ task.completed = true;
+ task.streak += 1;
+ }
+ }
+ if (task.markModified) task.markModified('group');
+ } else {
+ task.streak += 1;
+ // Give a streak achievement when the streak is a multiple of 21
+ if (task.streak !== 0 && task.streak % 21 === 0) {
+ user.achievements.streak = user.achievements.streak ? user.achievements.streak + 1 : 1;
+ if (user.addNotification) user.addNotification('STREAK_ACHIEVEMENT');
+ }
+ task.completed = true;
- // Save history entry for daily
- task.history = task.history || [];
- const historyEntry = {
- date: Number(new Date()),
- value: task.value,
- isDue: task.isDue,
- completed: true,
- };
- task.history.push(historyEntry);
+ // Save history entry for daily
+ task.history = task.history || [];
+ const historyEntry = {
+ date: Number(new Date()),
+ value: task.value,
+ isDue: task.isDue,
+ completed: true,
+ };
+ task.history.push(historyEntry);
+ }
} else if (direction === 'down') {
- // Remove a streak achievement if streak was a multiple of 21 and the daily was undone
- if (task.streak !== 0 && task.streak % 21 === 0) {
- user.achievements.streak = user.achievements.streak ? user.achievements.streak - 1 : 0;
- }
- task.streak -= 1;
- if (task.group && task.group.completedBy) task.group.completedBy = undefined;
- task.completed = false;
+ if (task.group.id) {
+ if (!task.group.assignedUsers
+ || !find(task.group.assignedUsers, assignedUser => !assignedUser.completed)
+ ) {
+ task.streak -= 1;
+ task.completed = false;
+ }
+ if (task.group.completedBy) task.group.completedBy = {};
+ if (task.group.assignedUsers && task.group.assignedUsers[user._id]) {
+ task.group.assignedUsers[user._id].completed = false;
+ task.group.assignedUsers[user._id].completedDate = undefined;
+ }
+ if (task.markModified) task.markModified('group');
+ } else {
+ // Remove a streak achievement if streak was a multiple of 21 and the daily was undone
+ if (task.streak !== 0 && task.streak % 21 === 0) {
+ user.achievements.streak = user.achievements.streak ? user.achievements.streak - 1 : 0;
+ }
+ task.streak -= 1;
+ task.completed = false;
- // Delete history entry when daily unchecked
- if (task.history || task.history.length > 0) {
- task.history.splice(-1, 1);
+ // Delete history entry when daily unchecked
+ if (task.history || task.history.length > 0) {
+ task.history.splice(-1, 1);
+ }
}
}
}