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