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"
|
||||
>
|
||||
<textarea
|
||||
v-if="isUser"
|
||||
v-if="isUser || canCreateTasks()"
|
||||
ref="quickAdd"
|
||||
v-model="quickAddText"
|
||||
class="quick-add"
|
||||
@@ -350,6 +350,7 @@ import draggable from 'vuedraggable';
|
||||
import Task from './task';
|
||||
import ClearCompletedTodos from './clearCompletedTodos';
|
||||
import buyMixin from '@/mixins/buy';
|
||||
import sync from '@/mixins/sync';
|
||||
import { mapState, mapActions, mapGetters } from '@/libs/store';
|
||||
import shopItem from '../shops/shopItem';
|
||||
import BuyQuestModal from '@/components/shops/quests/buyQuestModal.vue';
|
||||
@@ -382,7 +383,7 @@ export default {
|
||||
shopItem,
|
||||
draggable,
|
||||
},
|
||||
mixins: [buyMixin, notifications],
|
||||
mixins: [buyMixin, notifications, sync],
|
||||
// @TODO Set default values for props
|
||||
// allows for better control of props values
|
||||
// allows for better control of where this component is called
|
||||
@@ -542,6 +543,7 @@ export default {
|
||||
...mapActions({
|
||||
loadCompletedTodos: 'tasks:fetchCompletedTodos',
|
||||
createTask: 'tasks:create',
|
||||
createGroupTasks: 'tasks:createGroupTasks',
|
||||
}),
|
||||
async taskSorted (data) {
|
||||
const filteredList = this.taskList;
|
||||
@@ -606,7 +608,12 @@ export default {
|
||||
this.showPopovers = true;
|
||||
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
|
||||
if (ev.shiftKey) {
|
||||
this.quickAddRows += 1;
|
||||
@@ -620,13 +627,18 @@ export default {
|
||||
|
||||
const tasks = text.split('\n').reverse().filter(taskText => (!!taskText)).map(taskText => {
|
||||
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;
|
||||
});
|
||||
|
||||
this.quickAddText = '';
|
||||
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();
|
||||
return true;
|
||||
},
|
||||
@@ -687,7 +699,7 @@ export default {
|
||||
filterByLabel (taskList, type, filter) {
|
||||
if (!taskList) return [];
|
||||
const selectedFilter = getActiveFilter(type, filter, this.challenge);
|
||||
return sortAndFilterTasks(taskList, selectedFilter);
|
||||
return sortAndFilterTasks(taskList, selectedFilter, Boolean(this.group));
|
||||
},
|
||||
filterByTagList (taskList, tagList = []) {
|
||||
let filteredTaskList = taskList;
|
||||
|
||||
@@ -105,8 +105,11 @@ export function getActiveFilter (type, filterType, isChallenge) {
|
||||
return activeFilter(taskFilters)(type, filterType);
|
||||
}
|
||||
|
||||
export function sortAndFilterTasks (tasks, selectedFilter) {
|
||||
export function sortAndFilterTasks (tasks, selectedFilter, group = false) {
|
||||
let sortedTasks = tasks.filter(selectedFilter.filterFn);
|
||||
if (!group) {
|
||||
sortedTasks = tasks.filter(task => !task.group.id);
|
||||
}
|
||||
if (selectedFilter.sort) {
|
||||
sortedTasks = sortBy(sortedTasks, selectedFilter.sort);
|
||||
}
|
||||
|
||||
@@ -118,7 +118,7 @@ function _nonInteractive (task, userId) {
|
||||
if (task.userId) return false;
|
||||
if (task.challenge && task.challenge.id) return true;
|
||||
if (
|
||||
task.group
|
||||
task.group && task.group.assignedUsers
|
||||
&& task.group.assignedUsers.length > 0
|
||||
&& task.group.assignedUsers.indexOf(userId) === -1
|
||||
) return true;
|
||||
|
||||
@@ -303,6 +303,7 @@ export default function scoreTask (options = {}, req = {}, analytics) {
|
||||
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;
|
||||
|
||||
// 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;
|
||||
}
|
||||
task.streak -= 1;
|
||||
if (task.group && task.group.completedBy) task.group.completedBy = undefined;
|
||||
task.completed = false;
|
||||
|
||||
// Delete history entry when daily unchecked
|
||||
@@ -335,9 +337,11 @@ export default function scoreTask (options = {}, req = {}, analytics) {
|
||||
if (direction === 'up') {
|
||||
task.dateCompleted = new Date();
|
||||
task.completed = true;
|
||||
if (task.group) task.group.completedBy = user._id;
|
||||
} else if (direction === 'down') {
|
||||
task.completed = false;
|
||||
task.dateCompleted = undefined;
|
||||
if (task.group && task.group.completedBy) task.group.completedBy = undefined;
|
||||
}
|
||||
|
||||
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.');
|
||||
}
|
||||
rollbackUser = await User.findOne({ _id: task.group.completedBy });
|
||||
task.group.completedBy = undefined;
|
||||
}
|
||||
|
||||
if (rollbackUser) {
|
||||
|
||||
Reference in New Issue
Block a user