|
|
|
|
@ -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"
|
|
|
|
|
|