diff --git a/plugins/itstudio-recruitment/includes/join-system.php b/plugins/itstudio-recruitment/includes/join-system.php index e8d14eb..be32289 100644 --- a/plugins/itstudio-recruitment/includes/join-system.php +++ b/plugins/itstudio-recruitment/includes/join-system.php @@ -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() {
面试按同一天计算,请依次设置日期、开始时间和结束时间。
面试按同一天计算,请依次设置日期、开始时间和结束时间。