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

View File

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

View File

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

View File

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

View File

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