mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-17 14:47:53 +01:00
WIP(assignment): change to object style
to do--let assignment API accept an array
This commit is contained in:
@@ -38,6 +38,7 @@
|
||||
|
||||
<script>
|
||||
import findIndex from 'lodash/findIndex';
|
||||
import keys from 'lodash/keys';
|
||||
import { mapState } from '@/libs/store';
|
||||
import approvalModal from './approvalModal';
|
||||
import sync from '@/mixins/sync';
|
||||
@@ -52,16 +53,17 @@ export default {
|
||||
...mapState({ user: 'user.data' }),
|
||||
userIsAssigned () {
|
||||
return this.task.group.assignedUsers
|
||||
&& this.task.group.assignedUsers.indexOf(this.user._id) !== -1;
|
||||
&& Boolean(this.task.group.assignedUsers[this.user._id]);
|
||||
},
|
||||
message () {
|
||||
const { assignedUsers } = this.task.group;
|
||||
const assignedUsersKeys = keys(assignedUsers);
|
||||
const assignedUsersNames = [];
|
||||
const assignedUsersLength = assignedUsers.length;
|
||||
const assignedUsersLength = assignedUsersKeys.length;
|
||||
|
||||
// @TODO: Eh, I think we only ever display one user name
|
||||
if (this.group && this.group.members) {
|
||||
assignedUsers.forEach(userId => {
|
||||
assignedUsersKeys.forEach(userId => {
|
||||
const index = findIndex(this.group.members, member => member._id === userId);
|
||||
const assignedMember = this.group.members[index];
|
||||
assignedUsersNames.push(`@${assignedMember.auth.local.username}`);
|
||||
|
||||
@@ -71,7 +71,7 @@
|
||||
v-else
|
||||
class="svg-icon check"
|
||||
:class="{
|
||||
'display-check-icon': task.completed || task.group.approval.requested,
|
||||
'display-check-icon': task.completed,
|
||||
[controlClass.checkbox]: true,
|
||||
}"
|
||||
v-html="icons.check"
|
||||
@@ -1040,7 +1040,7 @@ export default {
|
||||
},
|
||||
isOpenTask () {
|
||||
if (!this.isGroupTask) return false;
|
||||
if (this.task.group.assignedUsers.length > 0) return false;
|
||||
if (this.task.group.assignedUsers) return false;
|
||||
return true;
|
||||
},
|
||||
showTaskLockIcon () {
|
||||
@@ -1052,7 +1052,9 @@ export default {
|
||||
return true;
|
||||
}
|
||||
if (this.isOpenTask) return false;
|
||||
if (this.task.group.assignedUsers.indexOf(this.user._id) !== -1) return false;
|
||||
if (this.task.group.assignedUsers && this.task.group.assignedUsers[this.user._id]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
},
|
||||
|
||||
@@ -1283,8 +1283,8 @@ export default {
|
||||
this.memberNamesById[member._id] = member.profile.name;
|
||||
});
|
||||
this.assignedMembers = [];
|
||||
if (this.task.group?.assignedUsers?.length > 0) {
|
||||
this.assignedMembers = this.task.group.assignedUsers;
|
||||
if (this.task.group?.assignedUsers) {
|
||||
this.assignedMembers = keys(this.task.group.assignedUsers);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1474,7 +1474,14 @@ export default {
|
||||
userId: memberId,
|
||||
}));
|
||||
Promise.all(promises);
|
||||
this.task.group.assignedUsers = this.assignedMembers;
|
||||
this.assignedMembers.forEach(memberId => {
|
||||
if (!this.task.assignedUsers) this.task.assignedUsers = {};
|
||||
this.task.assignedUsers[memberId] = {
|
||||
assignedDate: new Date(),
|
||||
assigningUsername: this.user.auth.local.username,
|
||||
completed: false,
|
||||
};
|
||||
});
|
||||
this.$emit('taskCreated', this.task);
|
||||
} else {
|
||||
this.createTask(this.task);
|
||||
|
||||
@@ -1502,9 +1502,18 @@ schema.methods.updateTask = async function updateTask (taskToSync, options = {})
|
||||
schema.methods.syncTask = async function groupSyncTask (taskToSync, user, assigningUser) {
|
||||
const group = this;
|
||||
const toSave = [];
|
||||
const assignmentData = {
|
||||
assignedDate: new Date(),
|
||||
assigningUsername: assigningUser && assigningUser._id !== user._id
|
||||
? assigningUser.auth.local.username : null,
|
||||
completed: false,
|
||||
};
|
||||
|
||||
if (taskToSync.group.assignedUsers.indexOf(user._id) === -1) {
|
||||
taskToSync.group.assignedUsers.push(user._id);
|
||||
if (!taskToSync.group.assignedUsers) {
|
||||
taskToSync.group.assignedUsers = {};
|
||||
}
|
||||
if (!taskToSync.group.assignedUsers[user._id]) {
|
||||
taskToSync.group.assignedUsers[user._id] = assignmentData;
|
||||
}
|
||||
|
||||
// Sync tags
|
||||
@@ -1538,7 +1547,6 @@ schema.methods.syncTask = async function groupSyncTask (taskToSync, user, assign
|
||||
matchingTask.group.id = taskToSync.group.id;
|
||||
matchingTask.userId = user._id;
|
||||
matchingTask.group.taskId = taskToSync._id;
|
||||
matchingTask.group.assignedDate = new Date();
|
||||
user.tasksOrder[`${taskToSync.type}s`].unshift(matchingTask._id);
|
||||
} else {
|
||||
_.merge(matchingTask, syncableAttrs(taskToSync));
|
||||
@@ -1547,13 +1555,9 @@ schema.methods.syncTask = async function groupSyncTask (taskToSync, user, assign
|
||||
if (orderList.indexOf(matchingTask._id) === -1 && (matchingTask.type !== 'todo' || !matchingTask.completed)) orderList.push(matchingTask._id);
|
||||
}
|
||||
|
||||
matchingTask.group.approval.required = taskToSync.group.approval.required;
|
||||
matchingTask.group.assignedUsers = taskToSync.group.assignedUsers;
|
||||
matchingTask.group.sharedCompletion = taskToSync.group.sharedCompletion;
|
||||
matchingTask.group.managerNotes = taskToSync.group.managerNotes;
|
||||
if (assigningUser && user._id !== assigningUser._id) {
|
||||
matchingTask.group.assigningUsername = assigningUser.auth.local.username;
|
||||
}
|
||||
|
||||
// sync checklist
|
||||
if (taskToSync.checklist) {
|
||||
|
||||
@@ -128,20 +128,16 @@ export const TaskSchema = new Schema({
|
||||
group: {
|
||||
id: { $type: String, ref: 'Group', validate: [v => validator.isUUID(v), 'Invalid uuid for group task.'] },
|
||||
broken: { $type: String, enum: ['GROUP_DELETED', 'TASK_DELETED', 'UNSUBSCRIBED'] },
|
||||
assignedUsers: [{ $type: String, ref: 'User', validate: [v => validator.isUUID(v), 'Invalid uuid for group assigned user.'] }],
|
||||
assignedDate: { $type: Date },
|
||||
assigningUsername: { $type: String },
|
||||
taskId: { $type: String, ref: 'Task', validate: [v => validator.isUUID(v), 'Invalid uuid for group task.'] },
|
||||
approval: {
|
||||
required: { $type: Boolean, default: false },
|
||||
approved: { $type: Boolean, default: false },
|
||||
dateApproved: { $type: Date },
|
||||
approvingUser: { $type: String, ref: 'User', validate: [v => validator.isUUID(v), 'Invalid uuid for group approving user.'] },
|
||||
requested: { $type: Boolean, default: false },
|
||||
requestedDate: { $type: Date },
|
||||
assignedUsers: {
|
||||
$type: Schema.Types.Mixed,
|
||||
// key is assigned UUID, with
|
||||
// { assignedDate: Date,
|
||||
// assigningUsername: '@username',
|
||||
// completed: Boolean }
|
||||
},
|
||||
taskId: { $type: String, ref: 'Task', validate: [v => validator.isUUID(v), 'Invalid uuid for group task.'] },
|
||||
sharedCompletion: {
|
||||
$type: String, // legacy data
|
||||
$type: String, default: 'singleCompletion', // legacy data
|
||||
},
|
||||
managerNotes: { $type: String },
|
||||
completedBy: { $type: String, ref: 'User', validate: [v => validator.isUUID(v), 'Invalid uuid for group completing user.'] },
|
||||
|
||||
Reference in New Issue
Block a user