WIP(assignment): change to object style

to do--let assignment API accept an array
This commit is contained in:
SabreCat
2021-11-30 16:32:01 -06:00
parent fa99458ca4
commit a495db8480
5 changed files with 39 additions and 28 deletions

View File

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

View File

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

View File

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

View File

@@ -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) {

View File

@@ -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.'] },