|
|
|
|
@ -68,6 +68,11 @@ function participantFieldHelp(help?: string): string {
|
|
|
|
|
return t
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** 管理端「标题补充」:展示在标题后,必填时位于 * 之后 */
|
|
|
|
|
function participantFieldTitleSupplement(field: SignupFormSchemaField): string {
|
|
|
|
|
return String(field.title_supplement ?? '').trim()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function apiBase() {
|
|
|
|
|
return getApiBase()
|
|
|
|
|
}
|
|
|
|
|
@ -1091,9 +1096,15 @@ onMounted(() => {
|
|
|
|
|
>
|
|
|
|
|
<template v-for="field in orderedSignupFields" :key="field.type === 'file' ? 'f-' + field.key : field.key">
|
|
|
|
|
<div v-if="field.key === 'track'" class="col-md-4">
|
|
|
|
|
<label class="form-label" id="trackFieldLabel"
|
|
|
|
|
>{{ field.label }} <span v-if="effectiveRequired(field)" class="text-danger">*</span></label
|
|
|
|
|
>
|
|
|
|
|
<label class="form-label" id="trackFieldLabel">
|
|
|
|
|
{{ field.label }}
|
|
|
|
|
<span v-if="effectiveRequired(field)" class="text-danger">*</span>
|
|
|
|
|
<span
|
|
|
|
|
v-if="participantFieldTitleSupplement(field)"
|
|
|
|
|
class="signup-field-title-supplement ms-1 fw-normal text-secondary"
|
|
|
|
|
>{{ participantFieldTitleSupplement(field) }}</span
|
|
|
|
|
>
|
|
|
|
|
</label>
|
|
|
|
|
<div class="track-custom-select w-100">
|
|
|
|
|
<select
|
|
|
|
|
id="track"
|
|
|
|
|
@ -1154,9 +1165,15 @@ onMounted(() => {
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div v-else-if="field.type === 'file' && field.key === 'plan'" class="col-12">
|
|
|
|
|
<label class="form-label"
|
|
|
|
|
>{{ field.label }} <span v-if="field.required" class="text-danger">*</span></label
|
|
|
|
|
>
|
|
|
|
|
<label class="form-label">
|
|
|
|
|
{{ field.label }}
|
|
|
|
|
<span v-if="effectiveRequired(field)" class="text-danger">*</span>
|
|
|
|
|
<span
|
|
|
|
|
v-if="participantFieldTitleSupplement(field)"
|
|
|
|
|
class="signup-field-title-supplement ms-1 fw-normal text-secondary"
|
|
|
|
|
>{{ participantFieldTitleSupplement(field) }}</span
|
|
|
|
|
>
|
|
|
|
|
</label>
|
|
|
|
|
<input
|
|
|
|
|
ref="planFileInput"
|
|
|
|
|
type="file"
|
|
|
|
|
@ -1211,7 +1228,15 @@ onMounted(() => {
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div v-else-if="field.type === 'file' && field.key === 'supporting'" class="col-12">
|
|
|
|
|
<label class="form-label">{{ field.label }}</label>
|
|
|
|
|
<label class="form-label">
|
|
|
|
|
{{ field.label }}
|
|
|
|
|
<span v-if="effectiveRequired(field)" class="text-danger">*</span>
|
|
|
|
|
<span
|
|
|
|
|
v-if="participantFieldTitleSupplement(field)"
|
|
|
|
|
class="signup-field-title-supplement ms-1 fw-normal text-secondary"
|
|
|
|
|
>{{ participantFieldTitleSupplement(field) }}</span
|
|
|
|
|
>
|
|
|
|
|
</label>
|
|
|
|
|
<input
|
|
|
|
|
ref="supportingFileInput"
|
|
|
|
|
type="file"
|
|
|
|
|
@ -1268,9 +1293,15 @@ onMounted(() => {
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div v-else-if="field.type === 'select' && !isCitySelectField(field)" :class="fieldColClass(field)">
|
|
|
|
|
<label class="form-label"
|
|
|
|
|
>{{ field.label }} <span v-if="effectiveRequired(field)" class="text-danger">*</span></label
|
|
|
|
|
>
|
|
|
|
|
<label class="form-label">
|
|
|
|
|
{{ field.label }}
|
|
|
|
|
<span v-if="effectiveRequired(field)" class="text-danger">*</span>
|
|
|
|
|
<span
|
|
|
|
|
v-if="participantFieldTitleSupplement(field)"
|
|
|
|
|
class="signup-field-title-supplement ms-1 fw-normal text-secondary"
|
|
|
|
|
>{{ participantFieldTitleSupplement(field) }}</span
|
|
|
|
|
>
|
|
|
|
|
</label>
|
|
|
|
|
<select
|
|
|
|
|
v-model="formModel[field.key]"
|
|
|
|
|
class="form-select editable"
|
|
|
|
|
@ -1290,9 +1321,15 @@ onMounted(() => {
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div v-else-if="isCitySelectField(field)" :class="fieldColClass(field)">
|
|
|
|
|
<label class="form-label"
|
|
|
|
|
>{{ field.label }} <span v-if="effectiveRequired(field)" class="text-danger">*</span></label
|
|
|
|
|
>
|
|
|
|
|
<label class="form-label">
|
|
|
|
|
{{ field.label }}
|
|
|
|
|
<span v-if="effectiveRequired(field)" class="text-danger">*</span>
|
|
|
|
|
<span
|
|
|
|
|
v-if="participantFieldTitleSupplement(field)"
|
|
|
|
|
class="signup-field-title-supplement ms-1 fw-normal text-secondary"
|
|
|
|
|
>{{ participantFieldTitleSupplement(field) }}</span
|
|
|
|
|
>
|
|
|
|
|
</label>
|
|
|
|
|
<select
|
|
|
|
|
v-model="formModel.location_city"
|
|
|
|
|
class="form-select editable"
|
|
|
|
|
@ -1315,9 +1352,15 @@ onMounted(() => {
|
|
|
|
|
v-else-if="field.type === 'checkbox' && field.key === 'commitment_accepted'"
|
|
|
|
|
:class="fieldColClass(field)"
|
|
|
|
|
>
|
|
|
|
|
<label class="form-label"
|
|
|
|
|
>{{ field.label }} <span v-if="effectiveRequired(field)" class="text-danger">*</span></label
|
|
|
|
|
>
|
|
|
|
|
<label class="form-label">
|
|
|
|
|
{{ field.label }}
|
|
|
|
|
<span v-if="effectiveRequired(field)" class="text-danger">*</span>
|
|
|
|
|
<span
|
|
|
|
|
v-if="participantFieldTitleSupplement(field)"
|
|
|
|
|
class="signup-field-title-supplement ms-1 fw-normal text-secondary"
|
|
|
|
|
>{{ participantFieldTitleSupplement(field) }}</span
|
|
|
|
|
>
|
|
|
|
|
</label>
|
|
|
|
|
<p class="small text-secondary mb-2">
|
|
|
|
|
请点击按钮打开承诺书全文,阅读后在文末手写签名并点击「确认签署」。
|
|
|
|
|
</p>
|
|
|
|
|
@ -1354,7 +1397,13 @@ onMounted(() => {
|
|
|
|
|
:disabled="formDisabled"
|
|
|
|
|
/>
|
|
|
|
|
<label class="form-check-label" :for="'signup-field-' + field.key">
|
|
|
|
|
{{ field.label }}<span v-if="effectiveRequired(field)" class="text-danger"> *</span>
|
|
|
|
|
{{ field.label }}
|
|
|
|
|
<span v-if="effectiveRequired(field)" class="text-danger ms-1">*</span>
|
|
|
|
|
<span
|
|
|
|
|
v-if="participantFieldTitleSupplement(field)"
|
|
|
|
|
class="signup-field-title-supplement ms-1 fw-normal text-secondary"
|
|
|
|
|
>{{ participantFieldTitleSupplement(field) }}</span
|
|
|
|
|
>
|
|
|
|
|
</label>
|
|
|
|
|
<div class="invalid-feedback">请勾选此项以继续</div>
|
|
|
|
|
</div>
|
|
|
|
|
@ -1366,9 +1415,15 @@ onMounted(() => {
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div v-else-if="field.type === 'textarea'" :class="fieldColClass(field)">
|
|
|
|
|
<label class="form-label"
|
|
|
|
|
>{{ field.label }} <span v-if="effectiveRequired(field)" class="text-danger">*</span></label
|
|
|
|
|
>
|
|
|
|
|
<label class="form-label">
|
|
|
|
|
{{ field.label }}
|
|
|
|
|
<span v-if="effectiveRequired(field)" class="text-danger">*</span>
|
|
|
|
|
<span
|
|
|
|
|
v-if="participantFieldTitleSupplement(field)"
|
|
|
|
|
class="signup-field-title-supplement ms-1 fw-normal text-secondary"
|
|
|
|
|
>{{ participantFieldTitleSupplement(field) }}</span
|
|
|
|
|
>
|
|
|
|
|
</label>
|
|
|
|
|
<textarea
|
|
|
|
|
v-model="formModel[field.key]"
|
|
|
|
|
class="form-control editable"
|
|
|
|
|
@ -1399,9 +1454,15 @@ onMounted(() => {
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div v-else :class="fieldColClass(field)">
|
|
|
|
|
<label class="form-label"
|
|
|
|
|
>{{ field.label }} <span v-if="effectiveRequired(field)" class="text-danger">*</span></label
|
|
|
|
|
>
|
|
|
|
|
<label class="form-label">
|
|
|
|
|
{{ field.label }}
|
|
|
|
|
<span v-if="effectiveRequired(field)" class="text-danger">*</span>
|
|
|
|
|
<span
|
|
|
|
|
v-if="participantFieldTitleSupplement(field)"
|
|
|
|
|
class="signup-field-title-supplement ms-1 fw-normal text-secondary"
|
|
|
|
|
>{{ participantFieldTitleSupplement(field) }}</span
|
|
|
|
|
>
|
|
|
|
|
</label>
|
|
|
|
|
<input
|
|
|
|
|
v-model="formModel[field.key]"
|
|
|
|
|
:type="
|
|
|
|
|
|