mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-17 06:37:23 +01:00
feat(teams): quick add
Also fixes issue with lock icons Also hides task copies from personal task board
This commit is contained in:
@@ -43,7 +43,7 @@
|
|||||||
class="tasks-list"
|
class="tasks-list"
|
||||||
>
|
>
|
||||||
<textarea
|
<textarea
|
||||||
v-if="isUser"
|
v-if="isUser || canCreateTasks()"
|
||||||
ref="quickAdd"
|
ref="quickAdd"
|
||||||
v-model="quickAddText"
|
v-model="quickAddText"
|
||||||
class="quick-add"
|
class="quick-add"
|
||||||
@@ -350,6 +350,7 @@ import draggable from 'vuedraggable';
|
|||||||
import Task from './task';
|
import Task from './task';
|
||||||
import ClearCompletedTodos from './clearCompletedTodos';
|
import ClearCompletedTodos from './clearCompletedTodos';
|
||||||
import buyMixin from '@/mixins/buy';
|
import buyMixin from '@/mixins/buy';
|
||||||
|
import sync from '@/mixins/sync';
|
||||||
import { mapState, mapActions, mapGetters } from '@/libs/store';
|
import { mapState, mapActions, mapGetters } from '@/libs/store';
|
||||||
import shopItem from '../shops/shopItem';
|
import shopItem from '../shops/shopItem';
|
||||||
import BuyQuestModal from '@/components/shops/quests/buyQuestModal.vue';
|
import BuyQuestModal from '@/components/shops/quests/buyQuestModal.vue';
|
||||||
@@ -382,7 +383,7 @@ export default {
|
|||||||
shopItem,
|
shopItem,
|
||||||
draggable,
|
draggable,
|
||||||
},
|
},
|
||||||
mixins: [buyMixin, notifications],
|
mixins: [buyMixin, notifications, sync],
|
||||||
// @TODO Set default values for props
|
// @TODO Set default values for props
|
||||||
// allows for better control of props values
|
// allows for better control of props values
|
||||||
// allows for better control of where this component is called
|
// allows for better control of where this component is called
|
||||||
@@ -542,6 +543,7 @@ export default {
|
|||||||
...mapActions({
|
...mapActions({
|
||||||
loadCompletedTodos: 'tasks:fetchCompletedTodos',
|
loadCompletedTodos: 'tasks:fetchCompletedTodos',
|
||||||
createTask: 'tasks:create',
|
createTask: 'tasks:create',
|
||||||
|
createGroupTasks: 'tasks:createGroupTasks',
|
||||||
}),
|
}),
|
||||||
async taskSorted (data) {
|
async taskSorted (data) {
|
||||||
const filteredList = this.taskList;
|
const filteredList = this.taskList;
|
||||||
@@ -606,7 +608,12 @@ export default {
|
|||||||
this.showPopovers = true;
|
this.showPopovers = true;
|
||||||
this.isDragging(false);
|
this.isDragging(false);
|
||||||
},
|
},
|
||||||
quickAdd (ev) {
|
canCreateTasks () {
|
||||||
|
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]));
|
||||||
|
},
|
||||||
|
async quickAdd (ev) {
|
||||||
// Add a new line if Shift+Enter Pressed
|
// Add a new line if Shift+Enter Pressed
|
||||||
if (ev.shiftKey) {
|
if (ev.shiftKey) {
|
||||||
this.quickAddRows += 1;
|
this.quickAddRows += 1;
|
||||||
@@ -620,13 +627,18 @@ export default {
|
|||||||
|
|
||||||
const tasks = text.split('\n').reverse().filter(taskText => (!!taskText)).map(taskText => {
|
const tasks = text.split('\n').reverse().filter(taskText => (!!taskText)).map(taskText => {
|
||||||
const task = taskDefaults({ type: this.type, text: taskText }, this.user);
|
const task = taskDefaults({ type: this.type, text: taskText }, this.user);
|
||||||
task.tags = this.selectedTags.slice();
|
if (this.isUser) task.tags = this.selectedTags.slice();
|
||||||
return task;
|
return task;
|
||||||
});
|
});
|
||||||
|
|
||||||
this.quickAddText = '';
|
this.quickAddText = '';
|
||||||
this.quickAddRows = 1;
|
this.quickAddRows = 1;
|
||||||
this.createTask(tasks);
|
if (this.group) {
|
||||||
|
await this.createGroupTasks({ groupId: this.group.id, tasks });
|
||||||
|
this.sync();
|
||||||
|
} else {
|
||||||
|
this.createTask(tasks);
|
||||||
|
}
|
||||||
this.$refs.quickAdd.blur();
|
this.$refs.quickAdd.blur();
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
@@ -687,7 +699,7 @@ export default {
|
|||||||
filterByLabel (taskList, type, filter) {
|
filterByLabel (taskList, type, filter) {
|
||||||
if (!taskList) return [];
|
if (!taskList) return [];
|
||||||
const selectedFilter = getActiveFilter(type, filter, this.challenge);
|
const selectedFilter = getActiveFilter(type, filter, this.challenge);
|
||||||
return sortAndFilterTasks(taskList, selectedFilter);
|
return sortAndFilterTasks(taskList, selectedFilter, Boolean(this.group));
|
||||||
},
|
},
|
||||||
filterByTagList (taskList, tagList = []) {
|
filterByTagList (taskList, tagList = []) {
|
||||||
let filteredTaskList = taskList;
|
let filteredTaskList = taskList;
|
||||||
|
|||||||
@@ -105,8 +105,11 @@ export function getActiveFilter (type, filterType, isChallenge) {
|
|||||||
return activeFilter(taskFilters)(type, filterType);
|
return activeFilter(taskFilters)(type, filterType);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function sortAndFilterTasks (tasks, selectedFilter) {
|
export function sortAndFilterTasks (tasks, selectedFilter, group = false) {
|
||||||
let sortedTasks = tasks.filter(selectedFilter.filterFn);
|
let sortedTasks = tasks.filter(selectedFilter.filterFn);
|
||||||
|
if (!group) {
|
||||||
|
sortedTasks = tasks.filter(task => !task.group.id);
|
||||||
|
}
|
||||||
if (selectedFilter.sort) {
|
if (selectedFilter.sort) {
|
||||||
sortedTasks = sortBy(sortedTasks, selectedFilter.sort);
|
sortedTasks = sortBy(sortedTasks, selectedFilter.sort);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -118,7 +118,7 @@ function _nonInteractive (task, userId) {
|
|||||||
if (task.userId) return false;
|
if (task.userId) return false;
|
||||||
if (task.challenge && task.challenge.id) return true;
|
if (task.challenge && task.challenge.id) return true;
|
||||||
if (
|
if (
|
||||||
task.group
|
task.group && task.group.assignedUsers
|
||||||
&& task.group.assignedUsers.length > 0
|
&& task.group.assignedUsers.length > 0
|
||||||
&& task.group.assignedUsers.indexOf(userId) === -1
|
&& task.group.assignedUsers.indexOf(userId) === -1
|
||||||
) return true;
|
) return true;
|
||||||
|
|||||||
@@ -303,6 +303,7 @@ export default function scoreTask (options = {}, req = {}, analytics) {
|
|||||||
user.achievements.streak = user.achievements.streak ? user.achievements.streak + 1 : 1;
|
user.achievements.streak = user.achievements.streak ? user.achievements.streak + 1 : 1;
|
||||||
if (user.addNotification) user.addNotification('STREAK_ACHIEVEMENT');
|
if (user.addNotification) user.addNotification('STREAK_ACHIEVEMENT');
|
||||||
}
|
}
|
||||||
|
if (task.group) task.group.completedBy = user._id;
|
||||||
task.completed = true;
|
task.completed = true;
|
||||||
|
|
||||||
// Save history entry for daily
|
// Save history entry for daily
|
||||||
@@ -320,6 +321,7 @@ export default function scoreTask (options = {}, req = {}, analytics) {
|
|||||||
user.achievements.streak = user.achievements.streak ? user.achievements.streak - 1 : 0;
|
user.achievements.streak = user.achievements.streak ? user.achievements.streak - 1 : 0;
|
||||||
}
|
}
|
||||||
task.streak -= 1;
|
task.streak -= 1;
|
||||||
|
if (task.group && task.group.completedBy) task.group.completedBy = undefined;
|
||||||
task.completed = false;
|
task.completed = false;
|
||||||
|
|
||||||
// Delete history entry when daily unchecked
|
// Delete history entry when daily unchecked
|
||||||
@@ -335,9 +337,11 @@ export default function scoreTask (options = {}, req = {}, analytics) {
|
|||||||
if (direction === 'up') {
|
if (direction === 'up') {
|
||||||
task.dateCompleted = new Date();
|
task.dateCompleted = new Date();
|
||||||
task.completed = true;
|
task.completed = true;
|
||||||
|
if (task.group) task.group.completedBy = user._id;
|
||||||
} else if (direction === 'down') {
|
} else if (direction === 'down') {
|
||||||
task.completed = false;
|
task.completed = false;
|
||||||
task.dateCompleted = undefined;
|
task.dateCompleted = undefined;
|
||||||
|
if (task.group && task.group.completedBy) task.group.completedBy = undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
delta += _changeTaskValue(user, task, direction, times, cron);
|
delta += _changeTaskValue(user, task, direction, times, cron);
|
||||||
|
|||||||
@@ -371,6 +371,7 @@ async function scoreTask (user, task, direction, req, res) {
|
|||||||
throw new BadRequest('Cannot uncheck task you did not complete if not a manager.');
|
throw new BadRequest('Cannot uncheck task you did not complete if not a manager.');
|
||||||
}
|
}
|
||||||
rollbackUser = await User.findOne({ _id: task.group.completedBy });
|
rollbackUser = await User.findOne({ _id: task.group.completedBy });
|
||||||
|
task.group.completedBy = undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rollbackUser) {
|
if (rollbackUser) {
|
||||||
|
|||||||
Reference in New Issue
Block a user