diff --git a/frontend/src/views/manager/edit-course.vue b/frontend/src/views/manager/edit-course.vue index 4dee6ed..264c3e3 100644 --- a/frontend/src/views/manager/edit-course.vue +++ b/frontend/src/views/manager/edit-course.vue @@ -552,6 +552,13 @@ + + {{ isAllSelected ? '取消全选' : '全选' }} +
@@ -719,6 +726,30 @@ const filteredAvailablePositions = computed(() => { return filtered }) +// 是否全选 +const isAllSelected = computed(() => { + if (filteredAvailablePositions.value.length === 0) return false + return filteredAvailablePositions.value.every( + (p: any) => selectedPositions.value.includes(p.id) + ) +}) + +// 全选/取消全选 +const toggleSelectAll = () => { + if (isAllSelected.value) { + // 取消全选:移除当前筛选结果中的所有岗位 + const filteredIds = filteredAvailablePositions.value.map((p: any) => p.id) + selectedPositions.value = selectedPositions.value.filter( + id => !filteredIds.includes(id) + ) + } else { + // 全选:添加当前筛选结果中的所有岗位 + const filteredIds = filteredAvailablePositions.value.map((p: any) => p.id) + const newSelection = new Set([...selectedPositions.value, ...filteredIds]) + selectedPositions.value = Array.from(newSelection) + } +} + // 考试设置相关 const examSettingsLoading = ref(false) const examSettings = reactive({ @@ -2920,6 +2951,9 @@ const loadAvailablePositions = async () => { // 岗位选择器样式 .position-selector-content { .selector-header { + display: flex; + align-items: center; + gap: 12px; margin-bottom: 20px; }