pingshenduan

master
lion 2 months ago
parent afad17b1bc
commit 33863caeef

@ -136,6 +136,7 @@ export interface AdminApplicationListParams {
per_page?: number
status?: string
track?: string
entry_group?: string
keyword?: string
signup_channel_id?: number
public_source_channel_id?: number

@ -0,0 +1,6 @@
/** 与 config/contest.php entry_groups 对齐 */
export const ENTRY_GROUPS = ['创新组', '创业组'] as const
export type EntryGroup = (typeof ENTRY_GROUPS)[number]
export const DEFAULT_ENTRY_GROUP: EntryGroup = '创新组'

@ -26,6 +26,7 @@ import {
resolveListPageState,
saveListPageState,
} from '../../utils/listPageState'
import { DEFAULT_ENTRY_GROUP, ENTRY_GROUPS } from '../../utils/entryGroups'
const route = useRoute()
const router = useRouter()
@ -75,11 +76,14 @@ const publicSources = ref<PublicSourceChannelRow[]>([])
const filters = reactive({
keyword: '',
track: '',
entry_group: DEFAULT_ENTRY_GROUP as string,
review_result: '' as '' | 'passed' | 'rejected' | 'pending',
signup_channel_id: '' as number | '',
public_source_channel_id: '' as number | '',
})
const entryGroupOptions = ENTRY_GROUPS
const sortDir = ref<'asc' | 'desc'>('desc')
const selectionMode = ref<'audit' | 'export'>('audit')
const auditSelectedIds = ref<number[]>([])
@ -105,6 +109,7 @@ function buildListParams(page: number): AdminApplicationListParams {
const kw = filters.keyword.trim()
if (kw) params.keyword = kw
if (filters.track) params.track = filters.track
if (filters.entry_group) params.entry_group = filters.entry_group
if (filters.review_result === 'passed' || filters.review_result === 'rejected' || filters.review_result === 'pending') {
params.review_result = filters.review_result
}
@ -264,6 +269,7 @@ async function refresh(page = pager.page) {
function resetFilters() {
filters.keyword = ''
filters.track = ''
filters.entry_group = DEFAULT_ENTRY_GROUP
filters.review_result = ''
filters.signup_channel_id = ''
filters.public_source_channel_id = ''
@ -353,7 +359,26 @@ watch(competitionId, async (cid) => {
</div>
<div class="filter-panel mb-3">
<div class="row g-2">
<div class="row g-2 align-items-center">
<div class="col-12 d-flex flex-wrap align-items-center gap-3">
<span class="small text-secondary text-nowrap">参赛组别</span>
<div
v-for="g in entryGroupOptions"
:key="g"
class="form-check form-check-inline mb-0"
>
<input
:id="`manage-entry-group-${g}`"
v-model="filters.entry_group"
class="form-check-input"
type="radio"
name="manage-entry-group"
:value="g"
@change="refresh(1)"
/>
<label class="form-check-label" :for="`manage-entry-group-${g}`">{{ g }}</label>
</div>
</div>
<div class="col-md-3">
<input
v-model="filters.keyword"

@ -13,6 +13,7 @@ import {
resolveListPageState,
saveListPageState,
} from '../../utils/listPageState'
import { DEFAULT_ENTRY_GROUP, ENTRY_GROUPS } from '../../utils/entryGroups'
export interface ReviewApplicationRow {
id: number
@ -41,9 +42,12 @@ const resultHint = ref('')
const filters = reactive({
keyword: '',
entry_group: DEFAULT_ENTRY_GROUP as string,
review_status: '' as '' | 'pending' | 'reviewed',
})
const entryGroupOptions = ENTRY_GROUPS
const meta = ref({
current_page: 1,
last_page: 1,
@ -95,6 +99,7 @@ function buildListParams(): URLSearchParams {
qs.set('per_page', String(perPage.value))
const kw = filters.keyword.trim()
if (kw) qs.set('keyword', kw)
if (filters.entry_group) qs.set('entry_group', filters.entry_group)
if (filters.review_status === 'pending' || filters.review_status === 'reviewed') {
qs.set('review_status', filters.review_status)
}
@ -157,6 +162,7 @@ function updateResultHint() {
return
}
const parts: string[] = [`共 ${t} 条`]
if (filters.entry_group) parts.push(filters.entry_group)
const kw = filters.keyword.trim()
if (kw) parts.push(`关键词「${kw}」`)
if (filters.review_status === 'pending') parts.push('待评审')
@ -177,6 +183,7 @@ function refresh(p = page.value) {
function resetFilters() {
filters.keyword = ''
filters.entry_group = DEFAULT_ENTRY_GROUP
filters.review_status = ''
refresh(1)
}
@ -220,7 +227,26 @@ function actionLabel(row: ReviewApplicationRow): string {
</div>
<div class="filter-panel mb-3">
<div class="row g-2">
<div class="row g-2 align-items-center">
<div class="col-12 d-flex flex-wrap align-items-center gap-3">
<span class="small text-secondary text-nowrap">参赛组别</span>
<div
v-for="g in entryGroupOptions"
:key="g"
class="form-check form-check-inline mb-0"
>
<input
:id="`reviewer-entry-group-${g}`"
v-model="filters.entry_group"
class="form-check-input"
type="radio"
name="reviewer-entry-group"
:value="g"
@change="refresh(1)"
/>
<label class="form-check-label" :for="`reviewer-entry-group-${g}`">{{ g }}</label>
</div>
</div>
<div class="col-md-4">
<input
v-model="filters.keyword"

Loading…
Cancel
Save