From ebfced4a2e1b28bff5c04981dee3bdb8d175d815 Mon Sep 17 00:00:00 2001 From: Sabe Jones Date: Thu, 26 Sep 2019 17:32:26 -0500 Subject: [PATCH] Revert "Refactoring & Feature: edit/delete controls of tasks (#11357)" This reverts commit 70b65011351f25e8d10e4479e27f180729a5bb7e. --- .../specs/store/getters/tasks/canDelete.js | 4 +- .../unit/specs/store/getters/tasks/canEdit.js | 19 ------ .../components/challenges/challengeDetail.vue | 5 +- .../group-plans/taskInformation.vue | 4 ++ website/client/components/tasks/column.vue | 7 ++- website/client/components/tasks/task.vue | 31 ++------- website/client/store/getters/tasks.js | 63 ++----------------- 7 files changed, 24 insertions(+), 109 deletions(-) delete mode 100644 test/client/unit/specs/store/getters/tasks/canEdit.js diff --git a/test/client/unit/specs/store/getters/tasks/canDelete.js b/test/client/unit/specs/store/getters/tasks/canDelete.js index e07d8714ad..d40036697b 100644 --- a/test/client/unit/specs/store/getters/tasks/canDelete.js +++ b/test/client/unit/specs/store/getters/tasks/canDelete.js @@ -6,7 +6,7 @@ describe('canDelete getter', () => { const task = {userId: 1, challenge: {id: 2}}; - expect(store.getters['tasks:canDelete'](task, 'challenge', true, null, null)).to.equal(false); + expect(store.getters['tasks:canDelete'](task)).to.equal(false); }); it('can delete broken challenge task', () => { @@ -14,6 +14,6 @@ describe('canDelete getter', () => { const task = {userId: 1, challenge: {id: 2, broken: true}}; - expect(store.getters['tasks:canDelete'](task, 'challenge', true, null, null)).to.equal(true); + expect(store.getters['tasks:canDelete'](task)).to.equal(true); }); }); diff --git a/test/client/unit/specs/store/getters/tasks/canEdit.js b/test/client/unit/specs/store/getters/tasks/canEdit.js deleted file mode 100644 index 55ba314913..0000000000 --- a/test/client/unit/specs/store/getters/tasks/canEdit.js +++ /dev/null @@ -1,19 +0,0 @@ -import generateStore from 'client/store'; - -describe('canEdit getter', () => { - it('cannot Edit active challenge task', () => { - const store = generateStore(); - - - const task = {userId: 1, challenge: {id: 2}}; - expect(store.getters['tasks:canEdit'](task, 'challenge', true, null, null)).to.equal(false); - }); - - it('can Edit broken challenge task', () => { - const store = generateStore(); - - - const task = {userId: 1, challenge: {id: 2, broken: true}}; - expect(store.getters['tasks:canEdit'](task, 'challenge', true, null, null)).to.equal(true); - }); -}); diff --git a/website/client/components/challenges/challengeDetail.vue b/website/client/components/challenges/challengeDetail.vue index 4e9477bb66..d243af8053 100644 --- a/website/client/components/challenges/challengeDetail.vue +++ b/website/client/components/challenges/challengeDetail.vue @@ -57,7 +57,7 @@ :type="column", :key="column", :taskListOverride='tasksByType[column]', - :challenge="challenge" + :showOptions="showOptions", @editTask="editTask", @taskDestroyed="taskDestroyed", v-if='tasksByType[column].length > 0') @@ -252,6 +252,9 @@ export default { canJoin () { return !this.isMember; }, + showOptions () { + return this.isLeader; + }, }, mounted () { if (!this.searchId) this.searchId = this.challengeId; diff --git a/website/client/components/group-plans/taskInformation.vue b/website/client/components/group-plans/taskInformation.vue index 86f29dc5b7..a30df3683b 100644 --- a/website/client/components/group-plans/taskInformation.vue +++ b/website/client/components/group-plans/taskInformation.vue @@ -41,6 +41,7 @@ :type="column", :key="column", :taskListOverride='tasksByType[column]', + :showOptions="showOptions" v-on:editTask="editTask", v-on:loadGroupCompletedTodos="loadGroupCompletedTodos", v-on:taskDestroyed="taskDestroyed", @@ -176,6 +177,9 @@ export default { if (!this.group) return false; return this.group.leader && this.group.leader._id === this.user._id || this.group.managers && Boolean(this.group.managers[this.user._id]); }, + showOptions () { + return this.canCreateTasks; + }, }, methods: { async load () { diff --git a/website/client/components/tasks/column.vue b/website/client/components/tasks/column.vue index 1d73d8d5ed..ef5faa49de 100644 --- a/website/client/components/tasks/column.vue +++ b/website/client/components/tasks/column.vue @@ -45,10 +45,10 @@ v-for="task in taskList", :key="task.id", :task="task", :isUser="isUser", + :showOptions="showOptions" @editTask="editTask", @moveTo="moveTo", :group='group', - :challenge="challenge" v-on:taskDestroyed='taskDestroyed' ) template(v-if="hasRewardsList") @@ -311,7 +311,10 @@ export default { selectedTags: {}, taskListOverride: {}, group: {}, - challenge: {}, + showOptions: { + type: Boolean, + default: true, + }, }, // @TODO: maybe we should store the group on state? data () { const icons = Object.freeze({ diff --git a/website/client/components/tasks/task.vue b/website/client/components/tasks/task.vue index ae70ae73b6..0a1b15ddf9 100644 --- a/website/client/components/tasks/task.vue +++ b/website/client/components/tasks/task.vue @@ -27,7 +27,7 @@ div(slot="dropdown-toggle", draggable=false) .svg-icon.dropdown-icon(v-html="icons.menu") div(slot="dropdown-content", draggable=false) - .dropdown-item.edit-task-item(ref="editTaskItem" v-if="showEdit") + .dropdown-item.edit-task-item(ref="editTaskItem") span.dropdown-icon-item span.svg-icon.inline.edit-icon(v-html="icons.edit") span.text {{ $t('edit') }} @@ -39,7 +39,7 @@ span.dropdown-icon-item span.svg-icon.inline.push-to-bottom(v-html="icons.bottom") span.text {{ $t('taskToBottom') }} - .dropdown-item(@click="destroy", v-if="showDelete") + .dropdown-item(@click="destroy", v-if="canDelete(task)") span.dropdown-icon-item.delete-task-item span.svg-icon.inline.delete(v-html="icons.delete") span.text {{ $t('delete') }} @@ -553,7 +553,6 @@ import axios from 'axios'; import scoreTask from 'common/script/ops/scoreTask'; import Vue from 'vue'; import * as Analytics from 'client/libs/analytics'; -import isEmpty from 'lodash/isEmpty'; import positiveIcon from 'assets/svg/positive.svg'; import negativeIcon from 'assets/svg/negative.svg'; @@ -588,7 +587,7 @@ export default { directives: { markdown: markdownDirective, }, - props: ['task', 'isUser', 'group', 'challenge', 'dueDate'], // @TODO: maybe we should store the group on state? + props: ['task', 'isUser', 'group', 'dueDate', 'showOptions'], // @TODO: maybe we should store the group on state? data () { return { random: uuid.v4(), // used to avoid conflicts between checkboxes ids @@ -622,7 +621,6 @@ export default { getTagsFor: 'tasks:getTagsFor', getTaskClasses: 'tasks:getTaskClasses', canDelete: 'tasks:canDelete', - canEdit: 'tasks:canEdit', }), hasChecklist () { return this.task.checklist && this.task.checklist.length > 0; @@ -702,27 +700,6 @@ export default { return this.task.challenge.shortName ? this.task.challenge.shortName.toString() : ''; }, - isChallangeTask () { - return !isEmpty(this.task.challenge); - }, - isGroupTask () { - return !isEmpty(this.task.group) && (this.task.group.taskId || this.task.group.id); - }, - taskCategory () { - let taskCategory = 'default'; - if (this.isGroupTask) taskCategory = 'group'; - else if (this.isChallangeTask) taskCategory = 'challenge'; - return taskCategory; - }, - showDelete () { - return this.canDelete(this.task, this.taskCategory, this.isUser, this.group, this.challenge); - }, - showEdit () { - return this.canEdit(this.task, this.taskCategory, this.isUser, this.group, this.challenge); - }, - showOptions () { - return this.showEdit || this.showDelete || this.isUser; - }, }, methods: { ...mapActions({ @@ -736,7 +713,7 @@ export default { this.scoreChecklistItem({taskId: this.task._id, itemId: item.id}); }, edit (e, task) { - if (this.isRunningYesterdailies || !this.showEdit) return; + if (this.isRunningYesterdailies) return; // Prevent clicking on a link from opening the edit modal const target = e.target || e.srcElement; diff --git a/website/client/store/getters/tasks.js b/website/client/store/getters/tasks.js index 20c6e6ef4c..c8d398cc27 100644 --- a/website/client/store/getters/tasks.js +++ b/website/client/store/getters/tasks.js @@ -37,64 +37,11 @@ function getTaskColor (task) { } } -export function canDelete (store) { - return (task, taskCategory, isTaskFromUserDashboard, group, challenge) => { - let isUserCanDeleteTask = isTaskFromUserDashboard; - const user = store.state.user.data; - - switch (taskCategory) { - case 'challenge': - if (challenge && !isTaskFromUserDashboard) { - let isUserChallenge = user.id === challenge.leader.id; - isUserCanDeleteTask = isUserChallenge || task.challenge.broken; - } else { - isUserCanDeleteTask = task.challenge.broken; - } - break; - case 'group': - if (group && !isTaskFromUserDashboard) { - isUserCanDeleteTask = - group.leader && - group.leader._id === user._id || group.managers && - Boolean(group.managers[user._id]); - } else { - isUserCanDeleteTask = false; - } - break; - default: - break; - } - return Boolean(isUserCanDeleteTask); - }; -} - -export function canEdit (store) { - return (task, taskCategory, isTaskFromUserDashboard, group, challenge) => { - let isUserCanEditTask = isTaskFromUserDashboard; - const user = store.state.user.data; - switch (taskCategory) { - case 'challenge': - if (challenge && !isTaskFromUserDashboard) { - let isUserChallenge = user.id === challenge.leader.id; - isUserCanEditTask = isUserChallenge || task.challenge.broken; - } else { - isUserCanEditTask = task.challenge.broken; - } - break; - case 'group': - if (group && !isTaskFromUserDashboard) { - isUserCanEditTask = - group.leader && - group.leader._id === user._id || group.managers && - Boolean(group.managers[user._id]); - } else { - isUserCanEditTask = false; - } - break; - default: - break; - } - return Boolean(isUserCanEditTask); +export function canDelete () { + return (task) => { + let isUserChallenge = Boolean(task.userId); + let activeChallenge = isUserChallenge && task.challenge && task.challenge.id && !task.challenge.broken; + return !activeChallenge; }; }