Revert "Refactoring & Feature: edit/delete controls of tasks (#11357)"

This reverts commit 70b6501135.
This commit is contained in:
Sabe Jones
2019-09-26 17:32:26 -05:00
parent 2843484f44
commit ebfced4a2e
7 changed files with 24 additions and 109 deletions

View File

@@ -6,7 +6,7 @@ describe('canDelete getter', () => {
const task = {userId: 1, challenge: {id: 2}}; 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', () => { it('can delete broken challenge task', () => {
@@ -14,6 +14,6 @@ describe('canDelete getter', () => {
const task = {userId: 1, challenge: {id: 2, broken: true}}; 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);
}); });
}); });

View File

@@ -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);
});
});

View File

@@ -57,7 +57,7 @@
:type="column", :type="column",
:key="column", :key="column",
:taskListOverride='tasksByType[column]', :taskListOverride='tasksByType[column]',
:challenge="challenge" :showOptions="showOptions",
@editTask="editTask", @editTask="editTask",
@taskDestroyed="taskDestroyed", @taskDestroyed="taskDestroyed",
v-if='tasksByType[column].length > 0') v-if='tasksByType[column].length > 0')
@@ -252,6 +252,9 @@ export default {
canJoin () { canJoin () {
return !this.isMember; return !this.isMember;
}, },
showOptions () {
return this.isLeader;
},
}, },
mounted () { mounted () {
if (!this.searchId) this.searchId = this.challengeId; if (!this.searchId) this.searchId = this.challengeId;

View File

@@ -41,6 +41,7 @@
:type="column", :type="column",
:key="column", :key="column",
:taskListOverride='tasksByType[column]', :taskListOverride='tasksByType[column]',
:showOptions="showOptions"
v-on:editTask="editTask", v-on:editTask="editTask",
v-on:loadGroupCompletedTodos="loadGroupCompletedTodos", v-on:loadGroupCompletedTodos="loadGroupCompletedTodos",
v-on:taskDestroyed="taskDestroyed", v-on:taskDestroyed="taskDestroyed",
@@ -176,6 +177,9 @@ export default {
if (!this.group) return false; 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]); 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: { methods: {
async load () { async load () {

View File

@@ -45,10 +45,10 @@
v-for="task in taskList", v-for="task in taskList",
:key="task.id", :task="task", :key="task.id", :task="task",
:isUser="isUser", :isUser="isUser",
:showOptions="showOptions"
@editTask="editTask", @editTask="editTask",
@moveTo="moveTo", @moveTo="moveTo",
:group='group', :group='group',
:challenge="challenge"
v-on:taskDestroyed='taskDestroyed' v-on:taskDestroyed='taskDestroyed'
) )
template(v-if="hasRewardsList") template(v-if="hasRewardsList")
@@ -311,7 +311,10 @@ export default {
selectedTags: {}, selectedTags: {},
taskListOverride: {}, taskListOverride: {},
group: {}, group: {},
challenge: {}, showOptions: {
type: Boolean,
default: true,
},
}, // @TODO: maybe we should store the group on state? }, // @TODO: maybe we should store the group on state?
data () { data () {
const icons = Object.freeze({ const icons = Object.freeze({

View File

@@ -27,7 +27,7 @@
div(slot="dropdown-toggle", draggable=false) div(slot="dropdown-toggle", draggable=false)
.svg-icon.dropdown-icon(v-html="icons.menu") .svg-icon.dropdown-icon(v-html="icons.menu")
div(slot="dropdown-content", draggable=false) 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.dropdown-icon-item
span.svg-icon.inline.edit-icon(v-html="icons.edit") span.svg-icon.inline.edit-icon(v-html="icons.edit")
span.text {{ $t('edit') }} span.text {{ $t('edit') }}
@@ -39,7 +39,7 @@
span.dropdown-icon-item span.dropdown-icon-item
span.svg-icon.inline.push-to-bottom(v-html="icons.bottom") span.svg-icon.inline.push-to-bottom(v-html="icons.bottom")
span.text {{ $t('taskToBottom') }} 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.dropdown-icon-item.delete-task-item
span.svg-icon.inline.delete(v-html="icons.delete") span.svg-icon.inline.delete(v-html="icons.delete")
span.text {{ $t('delete') }} span.text {{ $t('delete') }}
@@ -553,7 +553,6 @@ import axios from 'axios';
import scoreTask from 'common/script/ops/scoreTask'; import scoreTask from 'common/script/ops/scoreTask';
import Vue from 'vue'; import Vue from 'vue';
import * as Analytics from 'client/libs/analytics'; import * as Analytics from 'client/libs/analytics';
import isEmpty from 'lodash/isEmpty';
import positiveIcon from 'assets/svg/positive.svg'; import positiveIcon from 'assets/svg/positive.svg';
import negativeIcon from 'assets/svg/negative.svg'; import negativeIcon from 'assets/svg/negative.svg';
@@ -588,7 +587,7 @@ export default {
directives: { directives: {
markdown: markdownDirective, 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 () { data () {
return { return {
random: uuid.v4(), // used to avoid conflicts between checkboxes ids random: uuid.v4(), // used to avoid conflicts between checkboxes ids
@@ -622,7 +621,6 @@ export default {
getTagsFor: 'tasks:getTagsFor', getTagsFor: 'tasks:getTagsFor',
getTaskClasses: 'tasks:getTaskClasses', getTaskClasses: 'tasks:getTaskClasses',
canDelete: 'tasks:canDelete', canDelete: 'tasks:canDelete',
canEdit: 'tasks:canEdit',
}), }),
hasChecklist () { hasChecklist () {
return this.task.checklist && this.task.checklist.length > 0; 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() : ''; 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: { methods: {
...mapActions({ ...mapActions({
@@ -736,7 +713,7 @@ export default {
this.scoreChecklistItem({taskId: this.task._id, itemId: item.id}); this.scoreChecklistItem({taskId: this.task._id, itemId: item.id});
}, },
edit (e, task) { edit (e, task) {
if (this.isRunningYesterdailies || !this.showEdit) return; if (this.isRunningYesterdailies) return;
// Prevent clicking on a link from opening the edit modal // Prevent clicking on a link from opening the edit modal
const target = e.target || e.srcElement; const target = e.target || e.srcElement;

View File

@@ -37,64 +37,11 @@ function getTaskColor (task) {
} }
} }
export function canDelete (store) { export function canDelete () {
return (task, taskCategory, isTaskFromUserDashboard, group, challenge) => { return (task) => {
let isUserCanDeleteTask = isTaskFromUserDashboard; let isUserChallenge = Boolean(task.userId);
const user = store.state.user.data; let activeChallenge = isUserChallenge && task.challenge && task.challenge.id && !task.challenge.broken;
return !activeChallenge;
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);
}; };
} }