|
@@ -25,6 +25,20 @@
|
|
|
@input="labelChange"
|
|
|
></el-input>
|
|
|
</div>
|
|
|
+ <div class="user-types">
|
|
|
+ <div
|
|
|
+ :class="['user-type', { 'is-active': userType === 'org' }]"
|
|
|
+ @click="switchUserType('org')"
|
|
|
+ >
|
|
|
+ 组织架构
|
|
|
+ </div>
|
|
|
+ <div
|
|
|
+ :class="['user-type', { 'is-active': userType === 'course' }]"
|
|
|
+ @click="switchUserType('course')"
|
|
|
+ >
|
|
|
+ 课程
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
<div class="user-tree">
|
|
|
<el-tree
|
|
|
ref="UserTree"
|
|
@@ -38,7 +52,7 @@
|
|
|
<el-checkbox
|
|
|
v-if="data.isUser"
|
|
|
v-model="node.checked"
|
|
|
- @change="userChange"
|
|
|
+ @change="val => userChange(val, data)"
|
|
|
>
|
|
|
{{ node.label }}
|
|
|
</el-checkbox>
|
|
@@ -72,7 +86,7 @@
|
|
|
:disable-transitions="false"
|
|
|
@close="toDeleteUser(user)"
|
|
|
>
|
|
|
- {{ user.label }}
|
|
|
+ {{ user.name }}({{ user.orgName }})
|
|
|
</el-tag>
|
|
|
</el-form-item>
|
|
|
<el-form-item prop="questions" label="选择评卷题目:">
|
|
@@ -142,6 +156,10 @@ export default {
|
|
|
default() {
|
|
|
return [];
|
|
|
}
|
|
|
+ },
|
|
|
+ courseCode: {
|
|
|
+ type: String,
|
|
|
+ default: ""
|
|
|
}
|
|
|
},
|
|
|
data() {
|
|
@@ -163,6 +181,8 @@ export default {
|
|
|
return {
|
|
|
modalIsShow: false,
|
|
|
filterLabel: "",
|
|
|
+ userType: "course",
|
|
|
+ courseUsers: [],
|
|
|
orgUsers: [],
|
|
|
userTree: [],
|
|
|
userList: [],
|
|
@@ -200,10 +220,13 @@ export default {
|
|
|
visibleChange() {
|
|
|
this.parseStructs();
|
|
|
this.filterLabel = "";
|
|
|
+ this.userType = "course";
|
|
|
this.selectedQuestions = this.instance.questions;
|
|
|
this.selectedQuestionIds = this.selectedQuestions.map(item => item.id);
|
|
|
+ this.selectedUsers = this.instance.markerList.map(item => {
|
|
|
+ return { ...item };
|
|
|
+ });
|
|
|
this.selectedUserIds = this.instance.markerList.map(item => item.id);
|
|
|
- this.updateSelectedUsersFromUserIds();
|
|
|
this.labelChange();
|
|
|
},
|
|
|
cancel() {
|
|
@@ -213,8 +236,20 @@ export default {
|
|
|
this.modalIsShow = true;
|
|
|
},
|
|
|
// user
|
|
|
+ switchUserType(type) {
|
|
|
+ this.filterLabel = "";
|
|
|
+ this.userType = type;
|
|
|
+
|
|
|
+ this.userTree =
|
|
|
+ type === "org" ? deepCopy(this.orgUsers) : deepCopy(this.courseUsers);
|
|
|
+ this.$refs.UserTree.setCheckedKeys(this.selectedUserIds);
|
|
|
+ },
|
|
|
async getOrgData() {
|
|
|
- const data = await organizationList({ specialPrivilege: "MARKER" });
|
|
|
+ let params = {
|
|
|
+ specialPrivilege: "MARKER"
|
|
|
+ };
|
|
|
+ if (this.courseCode) params.courseCode = this.courseCode;
|
|
|
+ const data = await organizationList(params);
|
|
|
this.parseUserData(data);
|
|
|
this.getUserList();
|
|
|
},
|
|
@@ -251,11 +286,29 @@ export default {
|
|
|
});
|
|
|
nitem.children = [...nitem.children, ...users];
|
|
|
}
|
|
|
+
|
|
|
+ if (item["courseUserList"] && item["courseUserList"].length) {
|
|
|
+ nitem.courseUserList = item.courseUserList.map(user => {
|
|
|
+ return {
|
|
|
+ id: user.id,
|
|
|
+ userId: user.id,
|
|
|
+ label: user.realName,
|
|
|
+ name: user.realName,
|
|
|
+ orgName: user.orgName,
|
|
|
+ loginName: user.loginName,
|
|
|
+ selected: false,
|
|
|
+ isUser: true
|
|
|
+ };
|
|
|
+ });
|
|
|
+ }
|
|
|
return nitem;
|
|
|
});
|
|
|
};
|
|
|
this.orgUsers = parseUser(data);
|
|
|
this.userTree = deepCopy(this.orgUsers);
|
|
|
+ if (this.courseCode && this.orgUsers[0].courseUserList) {
|
|
|
+ this.courseUsers = deepCopy(this.orgUsers[0].courseUserList);
|
|
|
+ }
|
|
|
this.getUserList();
|
|
|
},
|
|
|
getUserList() {
|
|
@@ -279,45 +332,54 @@ export default {
|
|
|
},
|
|
|
labelChange() {
|
|
|
if (!this.filterLabel) {
|
|
|
- this.userTree = deepCopy(this.orgUsers);
|
|
|
+ this.switchUserType(this.userType);
|
|
|
} else {
|
|
|
const escapeRegexpString = (value = "") =>
|
|
|
String(value).replace(/[|\\{}()[\]^$+*?.]/g, "\\$&");
|
|
|
const reg = new RegExp(escapeRegexpString(this.filterLabel), "i");
|
|
|
|
|
|
- this.userTree = this.userList.filter(item => reg.test(item.name));
|
|
|
+ if (this.userType === "org") {
|
|
|
+ this.userTree = this.userList.filter(item => reg.test(item.name));
|
|
|
+ } else {
|
|
|
+ this.userTree = this.courseUsers.filter(item => reg.test(item.name));
|
|
|
+ }
|
|
|
}
|
|
|
this.$refs.UserTree.setCheckedKeys(this.selectedUserIds);
|
|
|
},
|
|
|
selectNodeAll(checked, data) {
|
|
|
- let userIds = [];
|
|
|
+ let users = [];
|
|
|
const getUserIds = list => {
|
|
|
list.forEach(item => {
|
|
|
item.selected = checked;
|
|
|
if (item.children && item.children.length) {
|
|
|
getUserIds(item.children);
|
|
|
} else {
|
|
|
- if (item.isUser) userIds.push(item.userId);
|
|
|
+ if (item.isUser) users.push(item);
|
|
|
}
|
|
|
});
|
|
|
};
|
|
|
getUserIds(data.children);
|
|
|
|
|
|
- userIds.forEach(userId => {
|
|
|
- const userPos = this.selectedUserIds.indexOf(userId);
|
|
|
+ const userIds = users.map(u => u.id);
|
|
|
+ const selectedUserIds = this.selectedUsers.map(item => item.id);
|
|
|
+
|
|
|
+ let deleteUserIds = [];
|
|
|
+ userIds.forEach((userId, uindex) => {
|
|
|
+ const userPos = selectedUserIds.indexOf(userId);
|
|
|
const includeUser = userPos !== -1;
|
|
|
if (checked) {
|
|
|
- if (!includeUser) this.selectedUserIds.push(userId);
|
|
|
+ if (!includeUser) this.selectedUsers.push(users[uindex]);
|
|
|
} else {
|
|
|
if (includeUser) {
|
|
|
- this.selectedUserIds.splice(userPos, 1);
|
|
|
+ deleteUserIds.push(userId);
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
-
|
|
|
+ this.selectedUsers = this.selectedUsers.filter(
|
|
|
+ u => !deleteUserIds.includes(u.id)
|
|
|
+ );
|
|
|
+ this.selectedUserIds = this.selectedUsers.map(item => item.id);
|
|
|
this.$refs.UserTree.setCheckedKeys(this.selectedUserIds);
|
|
|
- this.updateSelectedUsersFromUserIds();
|
|
|
-
|
|
|
this.$refs.modalFormRef.validateField("users");
|
|
|
},
|
|
|
updateSelectedUsersFromUserIds() {
|
|
@@ -325,45 +387,16 @@ export default {
|
|
|
this.selectedUserIds.includes(user.id)
|
|
|
);
|
|
|
},
|
|
|
- userChange() {
|
|
|
- if (this.filterLabel) {
|
|
|
- let prevSelectUserIds = this.selectedUsers.map(item => item.id);
|
|
|
- const prevUserListSelectUserIds = this.userTree
|
|
|
- .filter(user => prevSelectUserIds.includes(user.id))
|
|
|
- .map(user => user.id);
|
|
|
- const selectedUsers = this.$refs.UserTree.getCheckedNodes(true);
|
|
|
- const sIds = selectedUsers.map(user => user.id);
|
|
|
- const prevDeletedUserIds = prevUserListSelectUserIds.filter(
|
|
|
- uid => !sIds.includes(uid)
|
|
|
- );
|
|
|
+ userChange(checked, user) {
|
|
|
+ if (checked) {
|
|
|
+ this.selectedUsers.push(user);
|
|
|
+ } else {
|
|
|
this.selectedUsers = this.selectedUsers.filter(
|
|
|
- user => !prevDeletedUserIds.includes(user.id)
|
|
|
+ item => item.id !== user.id
|
|
|
);
|
|
|
- prevSelectUserIds = this.selectedUsers.map(item => item.id);
|
|
|
-
|
|
|
- selectedUsers.forEach(user => {
|
|
|
- if (prevSelectUserIds.includes(user.id)) return;
|
|
|
- const nuser = {
|
|
|
- id: user.id,
|
|
|
- name: user.name,
|
|
|
- label: `${user.name}(${user.orgName})`
|
|
|
- };
|
|
|
- this.selectedUsers.push(nuser);
|
|
|
- });
|
|
|
- this.selectedUserIds = this.selectedUsers.map(item => item.id);
|
|
|
- } else {
|
|
|
- const selectedUsers = this.$refs.UserTree.getCheckedNodes(true);
|
|
|
- this.selectedUsers = selectedUsers.map(user => {
|
|
|
- const nuser = {
|
|
|
- id: user.id,
|
|
|
- name: user.name,
|
|
|
- label: `${user.name}(${user.orgName})`
|
|
|
- };
|
|
|
- return nuser;
|
|
|
- });
|
|
|
- this.selectedUserIds = this.selectedUsers.map(item => item.id);
|
|
|
}
|
|
|
- this.updateSelectedUsersFromUserIds();
|
|
|
+ this.selectedUserIds = this.selectedUsers.map(item => item.id);
|
|
|
+ this.$refs.modalFormRef.validateField("users");
|
|
|
},
|
|
|
toDeleteUser(user) {
|
|
|
const pos = this.selectedUsers.findIndex(item => item.id === user.id);
|
|
@@ -432,7 +465,7 @@ export default {
|
|
|
id: item.id,
|
|
|
name: item.name,
|
|
|
loginName: item.loginName,
|
|
|
- label: item.label
|
|
|
+ orgName: item.orgName
|
|
|
};
|
|
|
});
|
|
|
datas.questions = this.selectedQuestions.map(item => {
|