fix: 优化面试时间前后台显示与设置
This commit is contained in:
@@ -115,6 +115,45 @@ function itstudio_join_sanitize_date_value($value) {
|
|||||||
return $value;
|
return $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function itstudio_join_sanitize_time_value($value) {
|
||||||
|
$value = trim((string) $value);
|
||||||
|
if (!preg_match('/^(?:[01]\d|2[0-3]):[0-5]\d$/', $value)) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
function itstudio_join_sanitize_interview_schedule($input, $prefix) {
|
||||||
|
$input = is_array($input) ? $input : array();
|
||||||
|
$prefix = trim((string) $prefix);
|
||||||
|
$day_key = $prefix . '_day';
|
||||||
|
$start_time_key = $prefix . '_start_time';
|
||||||
|
$end_time_key = $prefix . '_end_time';
|
||||||
|
|
||||||
|
if (!array_key_exists($day_key, $input)
|
||||||
|
&& !array_key_exists($start_time_key, $input)
|
||||||
|
&& !array_key_exists($end_time_key, $input)) {
|
||||||
|
return array(
|
||||||
|
'start' => itstudio_join_sanitize_datetime_local_value($input[$prefix . '_date'] ?? ''),
|
||||||
|
'end' => itstudio_join_sanitize_datetime_local_value($input[$prefix . '_end'] ?? ''),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$day = itstudio_join_sanitize_date_value($input[$day_key] ?? '');
|
||||||
|
if ($day === '') {
|
||||||
|
return array('start' => '', 'end' => '');
|
||||||
|
}
|
||||||
|
|
||||||
|
$start_time = itstudio_join_sanitize_time_value($input[$start_time_key] ?? '');
|
||||||
|
$end_time = itstudio_join_sanitize_time_value($input[$end_time_key] ?? '');
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'start' => $start_time !== '' ? $day . 'T' . $start_time : $day,
|
||||||
|
'end' => $end_time !== '' ? $day . 'T' . $end_time : '',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
function itstudio_join_sanitize_shortcode_value($value) {
|
function itstudio_join_sanitize_shortcode_value($value) {
|
||||||
if (!is_string($value)) {
|
if (!is_string($value)) {
|
||||||
return '';
|
return '';
|
||||||
@@ -146,16 +185,18 @@ function itstudio_join_sanitize_records_value($value) {
|
|||||||
function itstudio_join_sanitize_settings($input) {
|
function itstudio_join_sanitize_settings($input) {
|
||||||
$defaults = itstudio_join_get_default_settings();
|
$defaults = itstudio_join_get_default_settings();
|
||||||
$input = is_array($input) ? $input : array();
|
$input = is_array($input) ? $input : array();
|
||||||
|
$first_interview_schedule = itstudio_join_sanitize_interview_schedule($input, 'first_interview');
|
||||||
|
$second_interview_schedule = itstudio_join_sanitize_interview_schedule($input, 'second_interview');
|
||||||
|
|
||||||
$sanitized = array(
|
$sanitized = array(
|
||||||
'registration_start' => itstudio_join_sanitize_datetime_local_value($input['registration_start'] ?? ''),
|
'registration_start' => itstudio_join_sanitize_datetime_local_value($input['registration_start'] ?? ''),
|
||||||
'registration_end' => itstudio_join_sanitize_datetime_local_value($input['registration_end'] ?? ''),
|
'registration_end' => itstudio_join_sanitize_datetime_local_value($input['registration_end'] ?? ''),
|
||||||
'first_interview_date' => itstudio_join_sanitize_datetime_local_value($input['first_interview_date'] ?? ''),
|
'first_interview_date' => $first_interview_schedule['start'],
|
||||||
'first_interview_end' => itstudio_join_sanitize_datetime_local_value($input['first_interview_end'] ?? ''),
|
'first_interview_end' => $first_interview_schedule['end'],
|
||||||
'first_interview_location_cn' => itstudio_join_sanitize_shortcode_value($input['first_interview_location_cn'] ?? ''),
|
'first_interview_location_cn' => itstudio_join_sanitize_shortcode_value($input['first_interview_location_cn'] ?? ''),
|
||||||
'first_interview_location_en' => itstudio_join_sanitize_shortcode_value($input['first_interview_location_en'] ?? ''),
|
'first_interview_location_en' => itstudio_join_sanitize_shortcode_value($input['first_interview_location_en'] ?? ''),
|
||||||
'second_interview_date' => itstudio_join_sanitize_datetime_local_value($input['second_interview_date'] ?? ''),
|
'second_interview_date' => $second_interview_schedule['start'],
|
||||||
'second_interview_end' => itstudio_join_sanitize_datetime_local_value($input['second_interview_end'] ?? ''),
|
'second_interview_end' => $second_interview_schedule['end'],
|
||||||
'second_interview_location_cn' => itstudio_join_sanitize_shortcode_value($input['second_interview_location_cn'] ?? ''),
|
'second_interview_location_cn' => itstudio_join_sanitize_shortcode_value($input['second_interview_location_cn'] ?? ''),
|
||||||
'second_interview_location_en' => itstudio_join_sanitize_shortcode_value($input['second_interview_location_en'] ?? ''),
|
'second_interview_location_en' => itstudio_join_sanitize_shortcode_value($input['second_interview_location_en'] ?? ''),
|
||||||
'assessment_start_date' => itstudio_join_sanitize_date_value($input['assessment_start_date'] ?? ''),
|
'assessment_start_date' => itstudio_join_sanitize_date_value($input['assessment_start_date'] ?? ''),
|
||||||
@@ -281,6 +322,11 @@ function itstudio_join_to_date_input_value($value) {
|
|||||||
return $parsed instanceof DateTimeImmutable ? $parsed->format('Y-m-d') : '';
|
return $parsed instanceof DateTimeImmutable ? $parsed->format('Y-m-d') : '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function itstudio_join_to_time_input_value($value, $date_only_as_end_of_day = false) {
|
||||||
|
$parsed = itstudio_join_parse_datetime_local($value, $date_only_as_end_of_day);
|
||||||
|
return $parsed instanceof DateTimeImmutable ? $parsed->format('H:i') : '';
|
||||||
|
}
|
||||||
|
|
||||||
function itstudio_join_get_result_field_map() {
|
function itstudio_join_get_result_field_map() {
|
||||||
return array(
|
return array(
|
||||||
'registration' => 'result_registration_records',
|
'registration' => 'result_registration_records',
|
||||||
@@ -1483,6 +1529,20 @@ function itstudio_join_format_stage_range($start, $end, $all_day = false) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!$all_day && $start->format('Y-m-d') === $end->format('Y-m-d')) {
|
||||||
|
$date = $start->format($format_cn_day);
|
||||||
|
$start_time = $start->format('H:i');
|
||||||
|
$end_time = $end->format('H:i');
|
||||||
|
$range = $date . ' ' . $start_time;
|
||||||
|
if ($start_time !== $end_time) {
|
||||||
|
$range .= '-' . $end_time;
|
||||||
|
}
|
||||||
|
return array(
|
||||||
|
'cn' => $range,
|
||||||
|
'en' => $range,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
$start_cn = $all_day ? $start->format($format_cn_day) : $start->format($format_cn_full);
|
$start_cn = $all_day ? $start->format($format_cn_day) : $start->format($format_cn_full);
|
||||||
$end_cn = $all_day ? $end->format($format_cn_day) : $end->format($format_cn_full);
|
$end_cn = $all_day ? $end->format($format_cn_day) : $end->format($format_cn_full);
|
||||||
$start_en = $all_day ? $start->format($format_en_day) : $start->format($format_en_full);
|
$start_en = $all_day ? $start->format($format_en_day) : $start->format($format_en_full);
|
||||||
@@ -1501,6 +1561,24 @@ function itstudio_join_format_stage_range($start, $end, $all_day = false) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function itstudio_join_format_stage_overlay_range($start, $end, $all_day = false) {
|
||||||
|
if (!$all_day) {
|
||||||
|
$date = $start instanceof DateTimeImmutable ? $start : $end;
|
||||||
|
$is_same_day = !($start instanceof DateTimeImmutable)
|
||||||
|
|| !($end instanceof DateTimeImmutable)
|
||||||
|
|| $start->format('Y-m-d') === $end->format('Y-m-d');
|
||||||
|
if ($date instanceof DateTimeImmutable && $is_same_day) {
|
||||||
|
$formatted = $date->format('Y.m.d');
|
||||||
|
return array(
|
||||||
|
'cn' => $formatted,
|
||||||
|
'en' => $formatted,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return itstudio_join_format_stage_range($start, $end, $all_day);
|
||||||
|
}
|
||||||
|
|
||||||
function itstudio_join_get_stage_photo_url($settings, $stage_key) {
|
function itstudio_join_get_stage_photo_url($settings, $stage_key) {
|
||||||
$settings = is_array($settings) ? $settings : array();
|
$settings = is_array($settings) ? $settings : array();
|
||||||
$field_map = itstudio_join_get_photo_field_map();
|
$field_map = itstudio_join_get_photo_field_map();
|
||||||
@@ -1693,6 +1771,7 @@ function itstudio_join_get_runtime_data() {
|
|||||||
$stages = array();
|
$stages = array();
|
||||||
foreach ($stage_seed as $stage) {
|
foreach ($stage_seed as $stage) {
|
||||||
$range = itstudio_join_format_stage_range($stage['start'], $stage['end'], !empty($stage['all_day']));
|
$range = itstudio_join_format_stage_range($stage['start'], $stage['end'], !empty($stage['all_day']));
|
||||||
|
$overlay_range = itstudio_join_format_stage_overlay_range($stage['start'], $stage['end'], !empty($stage['all_day']));
|
||||||
$status = itstudio_join_resolve_stage_status($now, $stage['start'], $stage['end']);
|
$status = itstudio_join_resolve_stage_status($now, $stage['start'], $stage['end']);
|
||||||
$stages[] = array(
|
$stages[] = array(
|
||||||
'key' => $stage['key'],
|
'key' => $stage['key'],
|
||||||
@@ -1703,6 +1782,8 @@ function itstudio_join_get_runtime_data() {
|
|||||||
'status' => $status,
|
'status' => $status,
|
||||||
'range_cn' => $range['cn'],
|
'range_cn' => $range['cn'],
|
||||||
'range_en' => $range['en'],
|
'range_en' => $range['en'],
|
||||||
|
'overlay_range_cn' => $overlay_range['cn'],
|
||||||
|
'overlay_range_en' => $overlay_range['en'],
|
||||||
'location_cn' => isset($stage['location_cn']) ? (string) $stage['location_cn'] : '',
|
'location_cn' => isset($stage['location_cn']) ? (string) $stage['location_cn'] : '',
|
||||||
'location_en' => isset($stage['location_en']) ? (string) $stage['location_en'] : '',
|
'location_en' => isset($stage['location_en']) ? (string) $stage['location_en'] : '',
|
||||||
'result_uploaded' => !empty($stage['result_uploaded']),
|
'result_uploaded' => !empty($stage['result_uploaded']),
|
||||||
@@ -2424,15 +2505,14 @@ function itstudio_join_render_settings_page() {
|
|||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="row"><label for="itstudio_join_first_interview_date">第一次面试开始时间</label></th>
|
<th scope="row"><label for="itstudio_join_first_interview_day">第一次面试日期与时间</label></th>
|
||||||
<td>
|
<td>
|
||||||
<input type="datetime-local" id="itstudio_join_first_interview_date" name="itstudio_join_settings[first_interview_date]" value="<?php echo esc_attr(itstudio_join_to_datetime_local_input_value((string) $settings['first_interview_date'], false)); ?>" class="regular-text">
|
<fieldset style="display:flex;gap:12px;flex-wrap:wrap;align-items:flex-end;">
|
||||||
</td>
|
<label>日期<br><input type="date" id="itstudio_join_first_interview_day" name="itstudio_join_settings[first_interview_day]" value="<?php echo esc_attr(itstudio_join_to_date_input_value((string) $settings['first_interview_date'])); ?>"></label>
|
||||||
</tr>
|
<label>开始时间<br><input type="time" name="itstudio_join_settings[first_interview_start_time]" value="<?php echo esc_attr(itstudio_join_to_time_input_value((string) $settings['first_interview_date'], false)); ?>"></label>
|
||||||
<tr>
|
<label>结束时间<br><input type="time" name="itstudio_join_settings[first_interview_end_time]" value="<?php echo esc_attr(itstudio_join_to_time_input_value((string) $settings['first_interview_end'], true)); ?>"></label>
|
||||||
<th scope="row"><label for="itstudio_join_first_interview_end">第一次面试结束时间</label></th>
|
</fieldset>
|
||||||
<td>
|
<p class="description">面试按同一天计算,请依次设置日期、开始时间和结束时间。</p>
|
||||||
<input type="datetime-local" id="itstudio_join_first_interview_end" name="itstudio_join_settings[first_interview_end]" value="<?php echo esc_attr(itstudio_join_to_datetime_local_input_value((string) $settings['first_interview_end'], true)); ?>" class="regular-text">
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -2448,15 +2528,14 @@ function itstudio_join_render_settings_page() {
|
|||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="row"><label for="itstudio_join_second_interview_date">第二次面试开始时间</label></th>
|
<th scope="row"><label for="itstudio_join_second_interview_day">第二次面试日期与时间</label></th>
|
||||||
<td>
|
<td>
|
||||||
<input type="datetime-local" id="itstudio_join_second_interview_date" name="itstudio_join_settings[second_interview_date]" value="<?php echo esc_attr(itstudio_join_to_datetime_local_input_value((string) $settings['second_interview_date'], false)); ?>" class="regular-text">
|
<fieldset style="display:flex;gap:12px;flex-wrap:wrap;align-items:flex-end;">
|
||||||
</td>
|
<label>日期<br><input type="date" id="itstudio_join_second_interview_day" name="itstudio_join_settings[second_interview_day]" value="<?php echo esc_attr(itstudio_join_to_date_input_value((string) $settings['second_interview_date'])); ?>"></label>
|
||||||
</tr>
|
<label>开始时间<br><input type="time" name="itstudio_join_settings[second_interview_start_time]" value="<?php echo esc_attr(itstudio_join_to_time_input_value((string) $settings['second_interview_date'], false)); ?>"></label>
|
||||||
<tr>
|
<label>结束时间<br><input type="time" name="itstudio_join_settings[second_interview_end_time]" value="<?php echo esc_attr(itstudio_join_to_time_input_value((string) $settings['second_interview_end'], true)); ?>"></label>
|
||||||
<th scope="row"><label for="itstudio_join_second_interview_end">第二次面试结束时间</label></th>
|
</fieldset>
|
||||||
<td>
|
<p class="description">面试按同一天计算,请依次设置日期、开始时间和结束时间。</p>
|
||||||
<input type="datetime-local" id="itstudio_join_second_interview_end" name="itstudio_join_settings[second_interview_end]" value="<?php echo esc_attr(itstudio_join_to_datetime_local_input_value((string) $settings['second_interview_end'], true)); ?>" class="regular-text">
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
|
|||||||
@@ -25,8 +25,12 @@ $is_progress_query_open = !empty($join_runtime['is_query_open']);
|
|||||||
|
|
||||||
$current_label_cn = isset($current_stage['label_cn']) ? (string) $current_stage['label_cn'] : '当前未在招新时段';
|
$current_label_cn = isset($current_stage['label_cn']) ? (string) $current_stage['label_cn'] : '当前未在招新时段';
|
||||||
$current_label_en = isset($current_stage['label_en']) ? (string) $current_stage['label_en'] : 'Recruitment is currently closed';
|
$current_label_en = isset($current_stage['label_en']) ? (string) $current_stage['label_en'] : 'Recruitment is currently closed';
|
||||||
$current_range_cn = isset($current_stage['range_cn']) ? (string) $current_stage['range_cn'] : '请关注后续通知';
|
$current_range_cn = isset($current_stage['overlay_range_cn'])
|
||||||
$current_range_en = isset($current_stage['range_en']) ? (string) $current_stage['range_en'] : 'Please check later updates';
|
? (string) $current_stage['overlay_range_cn']
|
||||||
|
: (isset($current_stage['range_cn']) ? (string) $current_stage['range_cn'] : '请关注后续通知');
|
||||||
|
$current_range_en = isset($current_stage['overlay_range_en'])
|
||||||
|
? (string) $current_stage['overlay_range_en']
|
||||||
|
: (isset($current_stage['range_en']) ? (string) $current_stage['range_en'] : 'Please check later updates');
|
||||||
$current_location_cn = trim((string) ($current_stage['location_cn'] ?? ''));
|
$current_location_cn = trim((string) ($current_stage['location_cn'] ?? ''));
|
||||||
$current_location_en = trim((string) ($current_stage['location_en'] ?? ''));
|
$current_location_en = trim((string) ($current_stage['location_en'] ?? ''));
|
||||||
if ($current_location_en === '') {
|
if ($current_location_en === '') {
|
||||||
|
|||||||
Reference in New Issue
Block a user