fix: 优化面试时间前后台显示与设置
This commit is contained in:
@@ -115,6 +115,45 @@ function itstudio_join_sanitize_date_value($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) {
|
||||
if (!is_string($value)) {
|
||||
return '';
|
||||
@@ -146,16 +185,18 @@ function itstudio_join_sanitize_records_value($value) {
|
||||
function itstudio_join_sanitize_settings($input) {
|
||||
$defaults = itstudio_join_get_default_settings();
|
||||
$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(
|
||||
'registration_start' => itstudio_join_sanitize_datetime_local_value($input['registration_start'] ?? ''),
|
||||
'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_end' => itstudio_join_sanitize_datetime_local_value($input['first_interview_end'] ?? ''),
|
||||
'first_interview_date' => $first_interview_schedule['start'],
|
||||
'first_interview_end' => $first_interview_schedule['end'],
|
||||
'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'] ?? ''),
|
||||
'second_interview_date' => itstudio_join_sanitize_datetime_local_value($input['second_interview_date'] ?? ''),
|
||||
'second_interview_end' => itstudio_join_sanitize_datetime_local_value($input['second_interview_end'] ?? ''),
|
||||
'second_interview_date' => $second_interview_schedule['start'],
|
||||
'second_interview_end' => $second_interview_schedule['end'],
|
||||
'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'] ?? ''),
|
||||
'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') : '';
|
||||
}
|
||||
|
||||
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() {
|
||||
return array(
|
||||
'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);
|
||||
$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);
|
||||
@@ -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) {
|
||||
$settings = is_array($settings) ? $settings : array();
|
||||
$field_map = itstudio_join_get_photo_field_map();
|
||||
@@ -1693,6 +1771,7 @@ function itstudio_join_get_runtime_data() {
|
||||
$stages = array();
|
||||
foreach ($stage_seed as $stage) {
|
||||
$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']);
|
||||
$stages[] = array(
|
||||
'key' => $stage['key'],
|
||||
@@ -1703,6 +1782,8 @@ function itstudio_join_get_runtime_data() {
|
||||
'status' => $status,
|
||||
'range_cn' => $range['cn'],
|
||||
'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_en' => isset($stage['location_en']) ? (string) $stage['location_en'] : '',
|
||||
'result_uploaded' => !empty($stage['result_uploaded']),
|
||||
@@ -2424,15 +2505,14 @@ function itstudio_join_render_settings_page() {
|
||||
</td>
|
||||
</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>
|
||||
<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">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row"><label for="itstudio_join_first_interview_end">第一次面试结束时间</label></th>
|
||||
<td>
|
||||
<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">
|
||||
<fieldset style="display:flex;gap:12px;flex-wrap:wrap;align-items:flex-end;">
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
</fieldset>
|
||||
<p class="description">面试按同一天计算,请依次设置日期、开始时间和结束时间。</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@@ -2448,15 +2528,14 @@ function itstudio_join_render_settings_page() {
|
||||
</td>
|
||||
</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>
|
||||
<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">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row"><label for="itstudio_join_second_interview_end">第二次面试结束时间</label></th>
|
||||
<td>
|
||||
<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">
|
||||
<fieldset style="display:flex;gap:12px;flex-wrap:wrap;align-items:flex-end;">
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
</fieldset>
|
||||
<p class="description">面试按同一天计算,请依次设置日期、开始时间和结束时间。</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
||||
Reference in New Issue
Block a user