PluginProbe ʕ •ᴥ•ʔ
Everest Forms – Contact Form, Payment Form, Quiz, Survey & Custom Form Builder with AI / 1.9.9
Everest Forms – Contact Form, Payment Form, Quiz, Survey & Custom Form Builder with AI v1.9.9
3.5.2 3.5.1 3.5.0 3.4.8 3.4.7 3.4.6 1.1.0 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.5.1 1.1.6 1.1.7 1.1.8 1.1.9 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.9 1.5.0 1.5.1 1.5.10 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.6.1 1.6.7 1.7.0 1.7.0.1 1.7.0.2 1.7.0.3 1.7.1 1.7.2 1.7.2.1 1.7.2.2 1.7.3 1.7.4 1.7.5 1.7.5.1 1.7.5.2 1.7.6 1.7.7 1.7.7.1 1.7.7.2 1.7.8 1.7.9 1.8.0 1.8.0.1 1.8.1 1.8.2 1.8.2.1 1.8.2.2 1.8.2.3 1.8.3 1.8.4 1.8.5 1.8.6 1.8.7 1.8.8 1.8.9 1.9.0 1.9.0.1 1.9.1 1.9.2 1.9.3 1.9.4 1.9.4.1 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.0.1 2.0.1 2.0.2 2.0.3 2.0.3.1 2.0.4 2.0.4.1 2.0.5 2.0.6 2.0.7 2.0.8 2.0.8.1 2.0.9 3.0.0 3.0.0.1 3.0.1 3.0.2 3.0.3 3.0.3.1 3.0.4 3.0.4.1 3.0.4.2 3.0.5 3.0.5.1 3.0.5.2 3.0.6 3.0.6.1 3.0.7.1 3.0.8 3.0.8.1 3.0.9 3.0.9.1 3.0.9.2 3.0.9.3 3.0.9.4 3.0.9.5 3.1.0 3.1.1 3.1.2 3.2.0 3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6 3.3.0 3.4.0 3.4.1 3.4.2 3.4.2.1 3.4.3 3.4.4 3.4.5 trunk 1.0 1.0.1 1.0.2 1.0.3
everest-forms / includes / fields / class-evf-field-date-time.php
everest-forms / includes / fields Last commit date
class-evf-field-address.php 7 years ago class-evf-field-captcha.php 6 years ago class-evf-field-checkbox.php 3 years ago class-evf-field-color.php 3 years ago class-evf-field-country.php 7 years ago class-evf-field-credit-card.php 7 years ago class-evf-field-date-time.php 3 years ago class-evf-field-divider.php 4 years ago class-evf-field-email.php 3 years ago class-evf-field-file-upload.php 6 years ago class-evf-field-first-name.php 3 years ago class-evf-field-hidden.php 7 years ago class-evf-field-html.php 7 years ago class-evf-field-image-upload.php 7 years ago class-evf-field-last-name.php 3 years ago class-evf-field-likert.php 7 years ago class-evf-field-number.php 3 years ago class-evf-field-password.php 7 years ago class-evf-field-payment-checkbox.php 7 years ago class-evf-field-payment-coupon.php 4 years ago class-evf-field-payment-quantity.php 5 years ago class-evf-field-payment-radio.php 7 years ago class-evf-field-payment-single.php 7 years ago class-evf-field-payment-subtotal.php 3 years ago class-evf-field-payment-total.php 6 years ago class-evf-field-phone.php 7 years ago class-evf-field-privacy-policy.php 4 years ago class-evf-field-progress.php 3 years ago class-evf-field-radio.php 3 years ago class-evf-field-range-slider.php 6 years ago class-evf-field-rating.php 7 years ago class-evf-field-repeater.php 4 years ago class-evf-field-reset.php 3 years ago class-evf-field-scale-rating.php 7 years ago class-evf-field-select.php 3 years ago class-evf-field-signature.php 7 years ago class-evf-field-text.php 3 years ago class-evf-field-textarea.php 3 years ago class-evf-field-title.php 6 years ago class-evf-field-url.php 3 years ago class-evf-field-wysiwyg.php 4 years ago class-evf-field-yes-no.php 3 years ago
class-evf-field-date-time.php
950 lines
1 <?php
2 /**
3 * Date and Time field.
4 *
5 * @package EverestForms\Fields
6 * @since 1.0.0
7 */
8
9 defined( 'ABSPATH' ) || exit;
10
11 /**
12 * EVF_Field_Date_Time class.
13 */
14 class EVF_Field_Date_Time extends EVF_Form_Fields {
15
16 /**
17 * Constructor.
18 */
19 public function __construct() {
20 $this->name = esc_html__( 'Date / Time', 'everest-forms' );
21 $this->type = 'date-time';
22 $this->icon = 'evf-icon evf-icon-calendar';
23 $this->order = 20;
24 $this->group = 'advanced';
25 $this->settings = array(
26 'basic-options' => array(
27 'field_options' => array(
28 'label',
29 'meta',
30 'choose_format',
31 'choose_style',
32 'description',
33 'required',
34 'required_field_message_setting',
35 'required_field_message',
36 ),
37 ),
38 'advanced-options' => array(
39 'field_options' => array(
40 'placeholder',
41 'datetime_options',
42 'label_hide',
43 'css',
44 ),
45 ),
46 );
47
48 parent::__construct();
49 }
50
51 /**
52 * Hook in tabs.
53 */
54 public function init_hooks() {
55 add_action( 'everest_forms_shortcode_scripts', array( $this, 'load_assets' ) );
56 add_filter( 'everest_forms_field_properties_' . $this->type, array( $this, 'field_properties' ), 5, 3 );
57 }
58
59 /**
60 * Date field format option.
61 *
62 * @since 1.4.9
63 * @param array $field Field Data.
64 */
65 public function choose_format( $field ) {
66 $format = ! empty( $field['datetime_format'] ) ? esc_attr( $field['datetime_format'] ) : 'date';
67 $format_label = $this->field_element(
68 'label',
69 $field,
70 array(
71 'slug' => 'datetime_format',
72 'value' => esc_html__( 'Format', 'everest-forms' ),
73 'tooltip' => esc_html__( 'Select a format for the date field.', 'everest-forms' ),
74 ),
75 false
76 );
77 $format_select = $this->field_element(
78 'select',
79 $field,
80 array(
81 'slug' => 'datetime_format',
82 'value' => $format,
83 'options' => array(
84 'date' => esc_html__( 'Date', 'everest-forms' ),
85 'time' => esc_html__( 'Time', 'everest-forms' ),
86 'date-time' => esc_html__( 'Both', 'everest-forms' ),
87 ),
88 ),
89 false
90 );
91 $args = array(
92 'slug' => 'datetime_format',
93 'content' => $format_label . $format_select,
94 );
95 $this->field_element( 'row', $field, $args );
96 }
97
98 /**
99 * Date field style option.
100 *
101 * @since 1.7.5
102 * @param array $field Field Data.
103 */
104 public function choose_style( $field ) {
105 $style = ! empty( $field['datetime_style'] ) ? esc_attr( $field['datetime_style'] ) : 'picker';
106 $style_label = $this->field_element(
107 'label',
108 $field,
109 array(
110 'slug' => 'datetime_style',
111 'value' => esc_html__( 'Style', 'everest-forms' ),
112 'tooltip' => esc_html__( 'Select a style for the date field.', 'everest-forms' ),
113 ),
114 false
115 );
116 $style_select = $this->field_element(
117 'select',
118 $field,
119 array(
120 'slug' => 'datetime_style',
121 'value' => $style,
122 'options' => array(
123 'picker' => esc_html__( 'Picker', 'everest-forms' ),
124 'dropdown' => esc_html__( 'Dropdown', 'everest-forms' ),
125 ),
126 ),
127 false
128 );
129 $args = array(
130 'slug' => 'datetime_style',
131 'content' => $style_label . $style_select,
132 );
133 $this->field_element( 'row', $field, $args );
134 }
135
136 /**
137 * Date and time advanced field options.
138 *
139 * @since 1.4.9
140 * @param array $field Field Data.
141 */
142 public function datetime_options( $field ) {
143 $format = ! empty( $field['datetime_format'] ) ? esc_attr( $field['datetime_format'] ) : 'date';
144 $class_name = isset( $field['enable_min_max'] ) && '1' === $field['enable_min_max'] ? '' : 'everest-forms-hidden';
145 $field['date_mode'] = isset( $field['date_mode'] ) ? $field['date_mode'] : 'single';
146 $field['date_mode'] = isset( $field['date_range'] ) && '1' === $field['date_range'] ? 'range' : $field['date_mode'];
147
148 $this->field_element(
149 'label',
150 $field,
151 array(
152 'slug' => 'datetime_advanced',
153 'value' => esc_html__( 'Date & Time Format', 'everest-forms' ),
154 'tooltip' => esc_html__( 'Advanced date and time formatting options.', 'everest-forms' ),
155 ),
156 true
157 );
158
159 echo '<div class="format-selected-' . esc_attr( $format ) . ' format-selected">';
160 echo '<div class="everest-forms-border-container everest-forms-date">';
161 echo '<h4 class="everest-forms-border-container-title">' . esc_html__( 'Date', 'everest-forms' ) . '</h4>'; // phpcs:ignore WordPress.Security.NonceVerification
162
163 $date_format_label = $this->field_element(
164 'label',
165 $field,
166 array(
167 'slug' => 'date_format',
168 'value' => esc_html__( 'Date Format', 'everest-forms' ),
169 'tooltip' => esc_html__( 'Choose a desire date format to display.', 'everest-forms' ),
170 ),
171 false
172 );
173
174 $date_format_select = $this->field_element(
175 'select',
176 $field,
177 array(
178 'slug' => 'date_format',
179 'value' => isset( $field['date_format'] ) ? $field['date_format'] : 'Y-m-d',
180 'class' => 'evf-date-format',
181 'options' => array(
182 'Y-m-d' => date_i18n( 'Y-m-d' ) . ' (Y-m-d)',
183 'F j, Y' => date_i18n( 'F j, Y' ) . ' (F j, Y)',
184 'm/d/Y' => date_i18n( 'm/d/Y' ) . ' (m/d/Y)',
185 'd/m/Y' => date_i18n( 'd/m/Y' ) . ' (d/m/Y)',
186 ),
187 ),
188 false
189 );
190
191 // Disable certain dates option.
192 $clear_disabled_dates_button = sprintf( '<a href="#" class="evf-clear-disabled-dates after-label-description">%s</a>', esc_html__( 'Clear', 'everest-forms' ) );
193 $disable_dates_label = $this->field_element(
194 'label',
195 $field,
196 array(
197 'slug' => 'disable_dates',
198 'value' => esc_html__( 'Disable Dates', 'everest-forms' ),
199 'tooltip' => esc_html__( 'Select which dates you want to disable.', 'everest-forms' ),
200 'after_tooltip' => $clear_disabled_dates_button,
201 ),
202 false
203 );
204 $disable_dates = $this->field_element(
205 'text',
206 $field,
207 array(
208 'slug' => 'disable_dates',
209 'value' => isset( $field['disable_dates'] ) ? $field['disable_dates'] : '',
210 'class' => 'everest-forms-disable-dates',
211 'data' => array(
212 'date-format' => isset( $field['date_format'] ) ? $field['date_format'] : 'Y-m-d',
213 ),
214 ),
215 false
216 );
217
218 $current_date_mode = $this->field_element(
219 'radio',
220 $field,
221 array(
222 'slug' => 'date_mode',
223 'default' => isset( $field['date_mode'] ) ? $field['date_mode'] : 'single',
224 'desc' => esc_html__( 'Date Mode', 'everest-forms' ),
225 'tooltip' => esc_html__( 'Select your desire date mode.', 'everest-forms' ),
226 'options' => array(
227 'single' => 'Single',
228 'range' => 'Range',
229 'multiple' => 'Multiple',
230 ),
231 ),
232 false
233 );
234
235 $date_localization_label = $this->field_element(
236 'label',
237 $field,
238 array(
239 'slug' => 'date_localization',
240 'value' => esc_html__( 'Date Localization', 'everest-forms' ),
241 'tooltip' => esc_html__( 'Choose a desire date localization to display.', 'everest-forms' ),
242 ),
243 false
244 );
245
246 $date_localization_select = $this->field_element(
247 'select',
248 $field,
249 array(
250 'slug' => 'date_localization',
251 'value' => isset( $field['date_localization'] ) ? $field['date_localization'] : 'en',
252 'options' => array(
253 'en' => 'English',
254 'ar' => 'Arabic',
255 'at' => 'Austria',
256 'az' => 'Azerbaijan',
257 'be' => 'Belarusian',
258 'bg' => 'Bulgarian',
259 'bn' => 'Bangla',
260 'bs' => 'Bosnian',
261 'cat' => 'Catalan',
262 'cs' => 'Czech',
263 'cy' => 'Welsh',
264 'da' => 'Danish',
265 'de' => 'German',
266 'eo' => 'Esperanto',
267 'es' => 'Spanish',
268 'et' => 'Estonian',
269 'fa' => 'Persian',
270 'fi' => 'Finnish',
271 'fo' => 'Faroese',
272 'fr' => 'French',
273 'ga' => 'Irish',
274 'gr' => 'Greek',
275 'he' => 'Hebrew',
276 'hi' => 'Hindi',
277 'hr' => 'Croatian',
278 'hu' => 'Hungarian',
279 'id' => 'Indonesian',
280 'is' => 'Icelandic',
281 'it' => 'Italian',
282 'ja' => 'Japanese',
283 'ka' => 'Georgian',
284 'ko' => 'Korean',
285 'km' => 'Khmer',
286 'kz' => 'Kazakh',
287 'lt' => 'Lithuanian',
288 'lv' => 'Latvian',
289 'mk' => 'Macedonian',
290 'mn' => 'Mongolian',
291 'ms' => 'Malaysian',
292 'my' => 'Burmese',
293 'nl' => 'Dutch',
294 'no' => 'Norwegian',
295 'pa' => 'Punjabi',
296 'pl' => 'Polish',
297 'pt' => 'Portuguese',
298 'ro' => 'Romanian',
299 'ru' => 'Russian',
300 'si' => 'Sinhala',
301 'sk' => 'Slovak',
302 'sl' => 'Slovenian',
303 'sq' => 'Albanian',
304 'sr' => 'Serbian',
305 'sv' => 'Swedish',
306 'th' => 'Thai',
307 'tr' => 'Turkish',
308 'uk' => 'Ukrainian',
309 'vn' => 'Vietnamese',
310 'zh' => 'Mandarin',
311 'zh_tw' => 'MandarinTraditional',
312 ),
313 ),
314 false
315 );
316
317 $current_date_default = $this->field_element(
318 'checkbox',
319 $field,
320 array(
321 'slug' => 'date_default',
322 'value' => isset( $field['date_default'] ) ? $field['date_default'] : '',
323 'desc' => esc_html__( 'Default to current date.', 'everest-forms' ),
324 'tooltip' => esc_html__( 'Check this option to set current date as default.', 'everest-forms' ),
325 ),
326 false
327 );
328
329 $enable_past_date_disable = $this->field_element(
330 'checkbox',
331 $field,
332 array(
333 'slug' => 'past_date_disable',
334 'value' => isset( $field['past_date_disable'] ) ? $field['past_date_disable'] : '',
335 'desc' => esc_html__( 'Disable the past date', 'everest-forms' ),
336 'tooltip' => esc_html__( 'Check this option to disable the past date', 'everest-forms' ),
337 ),
338 false
339 );
340
341 $enable_min_max = $this->field_element(
342 'checkbox',
343 $field,
344 array(
345 'slug' => 'enable_min_max',
346 'value' => isset( $field['enable_min_max'] ) ? $field['enable_min_max'] : '',
347 'desc' => esc_html__( 'Enable Min Max date.', 'everest-forms' ),
348 'tooltip' => esc_html__( 'Check this option to set min max date.', 'everest-forms' ),
349 ),
350 false
351 );
352
353 $min_date_label = $this->field_element(
354 'label',
355 $field,
356 array(
357 'slug' => 'min_date',
358 'value' => esc_html__( 'Minimum Date', 'everest-forms' ),
359 'tooltip' => esc_html__( 'Select minium date.', 'everest-forms' ),
360 ),
361 false
362 );
363
364 $min_date = $this->field_element(
365 'text',
366 $field,
367 array(
368 'slug' => 'min_date',
369 'value' => isset( $field['min_date'] ) ? $field['min_date'] : '',
370 'class' => 'everest-forms-min-date',
371 ),
372 false
373 );
374
375 $max_date_label = $this->field_element(
376 'label',
377 $field,
378 array(
379 'slug' => 'max_date',
380 'value' => esc_html__( 'Maximum Date', 'everest-forms' ),
381 'tooltip' => esc_html__( 'Select maximum date.', 'everest-forms' ),
382 ),
383 false
384 );
385
386 $max_date = $this->field_element(
387 'text',
388 $field,
389 array(
390 'slug' => 'max_date',
391 'value' => isset( $field['max_date'] ) ? $field['max_date'] : '',
392 'class' => 'everest-forms-max-date',
393 ),
394 false
395 );
396
397 $set_date_range = $this->field_element(
398 'checkbox',
399 $field,
400 array(
401 'slug' => 'set_date_range',
402 'value' => isset( $field['set_date_range'] ) ? $field['set_date_range'] : '',
403 'desc' => esc_html__( 'Enable Custom Input', 'everest-forms' ),
404 'tooltip' => esc_html__( "Check this option to set date range 'x' days after today.", 'everest-forms' ),
405 ),
406 false
407 );
408
409 $min_date_range_level = $this->field_element(
410 'label',
411 $field,
412 array(
413 'slug' => 'min_date_range',
414 'value' => esc_html__( 'Minimum Date', 'everest-forms' ),
415 'tooltip' => esc_html__( 'Number of days after today or before for negative numbers. Example: today or +14 days or -5 days.', 'everest-forms' ),
416 ),
417 false
418 );
419
420 $min_date_range = $this->field_element(
421 'text',
422 $field,
423 array(
424 'slug' => 'min_date_range',
425 'value' => isset( $field['min_date_range'] ) ? $field['min_date_range'] : '',
426 'class' => 'everest-forms-min-date-range',
427 'placeholder' => 'e.g. today',
428 ),
429 false
430 );
431
432 $max_date_range_label = $this->field_element(
433 'label',
434 $field,
435 array(
436 'slug' => 'max_date_range',
437 'value' => esc_html__( 'Maximum Date', 'everest-forms' ),
438 'tooltip' => esc_html__( 'Number of days after today or before for negative numbers. Example: today or +14 days or -5 days.', 'everest-forms' ),
439 ),
440 false
441 );
442
443 $max_date_range = $this->field_element(
444 'text',
445 $field,
446 array(
447 'slug' => 'max_date_range',
448 'value' => isset( $field['max_date_range'] ) ? $field['max_date_range'] : '',
449 'class' => 'everest-forms-max-date-range',
450 'placeholder' => 'e.g. +14 days',
451 ),
452 false
453 );
454
455 $args = array(
456 'slug' => 'date_format',
457 'content' => $date_format_label . $date_format_select . $disable_dates_label . $disable_dates . $date_localization_label . $date_localization_select . '<div class="everest-forms-checklist everest-forms-checklist-inline">' . $current_date_mode . '</div><div class="everest-forms-current-date-format">' . $current_date_default . '</div><div class="everest-forms-past-date-disable-format">' . $enable_past_date_disable . '</div><div class="everest-forms-min-max-date-format">' . $enable_min_max . '</div><div class="everest-forms-min-max-date-range-format ' . $class_name . '">' . $set_date_range . '</div><div class="everest-forms-min-max-date-option ' . $class_name . '">' . $min_date_label . $min_date . $max_date_label . $max_date . '</div><div class="everest-forms-min-max-date-range-option ' . $class_name . '">' . $min_date_range_level . $min_date_range . $max_date_range_label . $max_date_range . '</div>',
458 );
459 $this->field_element( 'row', $field, $args );
460
461 echo '</div>';
462
463 echo '<div class="everest-forms-border-container everest-forms-time">';
464 echo '<h4 class="everest-forms-border-container-title">' . esc_html__( 'Time', 'everest-forms' ) . '</h4>'; // phpcs:ignore WordPress.Security.NonceVerification
465
466 $time_format_label = $this->field_element(
467 'label',
468 $field,
469 array(
470 'slug' => 'time_interval',
471 'value' => esc_html__( 'Time interval and format', 'everest-forms' ),
472 'tooltip' => esc_html__( 'Choose time interval and format to display.', 'everest-forms' ),
473 ),
474 false
475 );
476
477 $time_interval_select = '<div class="input-group-col-2">';
478 $time_interval_select .= $this->field_element(
479 'select',
480 $field,
481 array(
482 'slug' => 'time_interval',
483 'value' => isset( $field['time_interval'] ) ? $field['time_interval'] : '',
484 'class' => 'time_interval',
485 'options' => array(
486 '15' => esc_html__( '15 minutes', 'everest-forms' ),
487 '30' => esc_html__( '30 minutes', 'everest-forms' ),
488 ),
489 ),
490 false
491 );
492 $time_format_select = $this->field_element(
493 'select',
494 $field,
495 array(
496 'slug' => 'time_format',
497 'value' => isset( $field['time_format'] ) ? $field['time_format'] : '',
498 'class' => 'time_format',
499 'options' => array(
500 'g:i A' => esc_html__( '12 H', 'everest-forms' ),
501 'H:i' => esc_html__( '24 H', 'everest-forms' ),
502 ),
503 ),
504 false
505 );
506 $time_format_select .= '</div>';
507
508 $min_time_select = '<div class="input-group-col-2">';
509 $min_time_select .= $this->field_element(
510 'select',
511 $field,
512 array(
513 'slug' => 'min_time_hour',
514 'value' => isset( $field['min_time_hour'] ) ? $field['min_time_hour'] : 9,
515 'class' => 'min_time_hour',
516 'options' => $this->get_minute_hours( $field, 'hours' ),
517 ),
518 false
519 );
520 $min_time_select .= $this->field_element(
521 'select',
522 $field,
523 array(
524 'slug' => 'min_time_minute',
525 'value' => isset( $field['min_time_minute'] ) ? $field['min_time_minute'] : 30,
526 'class' => 'min_time_minute',
527 'options' => $this->get_minute_hours( $field, 'minutes' ),
528 ),
529 false
530 );
531 $min_time_select .= '</div>';
532
533 $max_time_select = '<div class="input-group-col-2">';
534 $max_time_select .= $this->field_element(
535 'select',
536 $field,
537 array(
538 'slug' => 'max_time_hour',
539 'value' => isset( $field['max_time_hour'] ) ? $field['max_time_hour'] : 18,
540 'class' => 'max_time_hour',
541 'options' => $this->get_minute_hours( $field, 'hours' ),
542 ),
543 false
544 );
545 $max_time_select .= $this->field_element(
546 'select',
547 $field,
548 array(
549 'slug' => 'max_time_minute',
550 'value' => isset( $field['max_time_minute'] ) ? $field['max_time_minute'] : 30,
551 'class' => 'max_time_minute',
552 'options' => $this->get_minute_hours( $field, 'minutes' ),
553 ),
554 false
555 );
556 $max_time_select .= '</div>';
557
558 $enable_min_max_time = '<div class="input-group-col-2">';
559
560 $enable_min_max_time .= $this->field_element(
561 'checkbox',
562 $field,
563 array(
564 'slug' => 'enable_min_max_time',
565 'value' => isset( $field['enable_min_max_time'] ) ? $field['enable_min_max_time'] : '',
566 'desc' => esc_html__( 'Enable Min Max Time.', 'everest-forms' ),
567 'tooltip' => esc_html__( 'Check this option to set min max time.', 'everest-forms' ),
568 ),
569 false
570 );
571 $enable_min_max_time .= '</div>';
572
573 $select_min_time = $this->field_element(
574 'label',
575 $field,
576 array(
577 'slug' => 'select_min_time',
578 'value' => esc_html__( 'Minimum Time', 'everest-forms' ),
579 'tooltip' => esc_html__( 'Select minium time.', 'everest-forms' ),
580 ),
581 false
582 );
583
584 $select_max_time = $this->field_element(
585 'label',
586 $field,
587 array(
588 'slug' => 'select_max_time',
589 'value' => esc_html__( 'Maximum Time', 'everest-forms' ),
590 'tooltip' => esc_html__( 'Select maximum time.', 'everest-forms' ),
591 ),
592 false
593 );
594
595 $args = array(
596 'slug' => 'time_interval_format',
597 'content' => $time_format_label . $time_interval_select . $time_format_select . $enable_min_max_time . $select_min_time . $min_time_select . $select_max_time . $max_time_select,
598 );
599 $this->field_element( 'row', $field, $args );
600
601 echo '</div>';
602 echo '</div>';
603 }
604
605 /**
606 * Time Hours/Minutes Provider.
607 *
608 * @since 1.7.5
609 * @param mixed $field field data.
610 * @param string $required required type.
611 */
612 public function get_minute_hours( $field, $required = 'hours' ) {
613 $required_array = array();
614 if ( 'hours' === $required ) {
615 // Hours Array.
616 $period = '';
617 for ( $i = 0; $i <= 23; $i++ ) {
618 if ( isset( $field['time_format'] ) && 'H:i' === $field['time_format'] ) {
619 $required_array [] = ( $i < 10 ? '0' . $i : $i ) . $period;
620 } else {
621 if ( $i < 12 ) {
622 $period = ' AM';
623 } else {
624 $period = ' PM';
625 }
626 $hour = $i;
627 if ( 0 === $i ) {
628 $hour = 12;
629 }
630 if ( $hour > 12 ) {
631 $hour = $i - 12;
632 }
633 $required_array [] = $hour . $period;
634 }
635 }
636 } else {
637 // Minutes Array.
638 for ( $i = 0; $i <= 59; $i++ ) {
639 $required_array [] = ( $i < 10 ) ? '0' . $i : $i;
640 }
641 }
642 return $required_array;
643 }
644
645 /**
646 * Define additional field properties.
647 *
648 * @since 1.0.0
649 *
650 * @param array $properties Field properties.
651 * @param array $field Field settings.
652 * @param array $form_data Form data and settings.
653 *
654 * @return array of additional field properties.
655 */
656 public function field_properties( $properties, $field, $form_data ) {
657 // Input primary: data-time-interval.
658 if ( ! empty( $field['time_interval'] ) ) {
659 $properties['inputs']['primary']['attr']['data-time-interval'] = esc_attr( $field['time_interval'] );
660 }
661
662 // Input primary: Disabled dates data.
663 if ( ! empty( $field['disable_dates'] ) ) {
664 $properties['inputs']['primary']['attr']['data-disable-dates'] = esc_attr( $field['disable_dates'] );
665 }
666
667 // Input primary: data-date-time.
668 if ( ! empty( $field['datetime_format'] ) ) {
669 $properties['inputs']['primary']['attr']['data-date-time'] = esc_attr( $field['datetime_format'] );
670
671 // Input primary: data-mode.
672 if ( 'time' !== $field['datetime_format'] ) {
673 if ( isset( $field['date_range'] ) && '1' === $field['date_range'] ) {
674 $properties['inputs']['primary']['attr']['data-mode'] = 'range';
675 } else {
676 $properties['inputs']['primary']['attr']['data-mode'] = isset( $field['date_mode'] ) ? $field['date_mode'] : 'single';
677 }
678 $properties['inputs']['primary']['attr']['data-locale'] = isset( $field['date_localization'] ) ? $field['date_localization'] : 'en';
679 $properties['inputs']['primary']['attr']['data-min-date'] = isset( $field['enable_min_max'], $field['min_date'] ) && ! isset( $field['set_date_range'] ) ? $field['min_date'] : '';
680 $properties['inputs']['primary']['attr']['data-max-date'] = isset( $field['enable_min_max'], $field['max_date'] ) && ! isset( $field['set_date_range'] ) ? $field['max_date'] : '';
681 $properties['inputs']['primary']['attr']['data-min-date-range'] = isset( $field['set_date_range'], $field['enable_min_max'], $field['min_date_range'] ) ? $field['min_date_range'] : '';
682 $properties['inputs']['primary']['attr']['data-max-date-range'] = isset( $field['set_date_range'], $field['enable_min_max'], $field['max_date_range'] ) ? $field['max_date_range'] : '';
683 }
684
685 if ( 'date' !== $field['datetime_format'] ) {
686 if ( isset( $field['enable_min_max_time'] ) ) {
687 $properties['inputs']['primary']['attr']['data-min-hour'] = isset( $field['min_time_hour'] ) ? $field['min_time_hour'] : '';
688 $properties['inputs']['primary']['attr']['data-min-minute'] = isset( $field['min_time_minute'] ) ? $field['min_time_minute'] : '';
689 $properties['inputs']['primary']['attr']['data-max-hour'] = isset( $field['max_time_hour'] ) ? $field['max_time_hour'] : '';
690 $properties['inputs']['primary']['attr']['data-max-minute'] = isset( $field['max_time_minute'] ) ? $field['max_time_minute'] : '';
691 }
692 }
693
694 // Input primary: data-date-format and value.
695 switch ( $field['datetime_format'] ) {
696 case 'date':
697 $properties['inputs']['primary']['attr']['value'] = isset( $field['date_default'] ) ? esc_attr( date_i18n( $field['date_format'] ) ) : '';
698 $properties['inputs']['primary']['attr']['data-date-format'] = ! empty( $field['date_format'] ) ? str_replace( 'g:i A', 'h:i K', esc_attr( $field['date_format'] ) ) : '';
699 $properties['inputs']['primary']['attr']['data-past-disable-date'] = isset( $field['past_date_disable'] ) ? esc_attr( date_i18n( 'Y-m-d' ) ) : '';
700 break;
701 case 'time':
702 $properties['inputs']['primary']['attr']['value'] = '';
703 $properties['inputs']['primary']['attr']['data-date-format'] = ! empty( $field['time_format'] ) ? str_replace( 'g:i A', 'h:i K', esc_attr( $field['time_format'] ) ) : 'g:i A';
704 break;
705 case 'date-time':
706 if ( ! empty( $field['time_format'] ) ) {
707 $date_format = esc_attr( $field['date_format'] ) . ' ' . esc_attr( $field['time_format'] );
708 $properties['inputs']['primary']['attr']['value'] = isset( $field['date_default'] ) ? esc_attr( date_i18n( $date_format ) ) : '';
709 $properties['inputs']['primary']['attr']['data-date-format'] = ! empty( $field['date_format'] ) ? str_replace( 'g:i A', 'h:i K', esc_attr( $date_format ) ) : '';
710 $properties['inputs']['primary']['attr']['data-past-disable-date'] = isset( $field['past_date_disable'] ) ? esc_attr( date_i18n( 'Y-m-d' ) ) : '';
711 } else {
712 $date_format = esc_attr( $field['date_format'] ) . ' g:i A';
713 $properties['inputs']['primary']['attr']['value'] = isset( $field['date_default'] ) ? esc_attr( date_i18n( $date_format ) ) : '';
714 $properties['inputs']['primary']['attr']['data-date-format'] = ! empty( $field['date_format'] ) ? str_replace( 'g:i A', 'h:i K', esc_attr( $date_format ) ) : '';
715 $properties['inputs']['primary']['attr']['data-past-disable-date'] = isset( $field['past_date_disable'] ) ? esc_attr( date_i18n( 'Y-m-d' ) ) : '';
716 }
717 break;
718 }
719 }
720 return $properties;
721 }
722
723 /**
724 * Field preview inside the builder.
725 *
726 * @since 1.0.0
727 *
728 * @param array $field Field data and settings.
729 */
730 public function field_preview( $field ) {
731 // Define data.
732 $placeholder = ! empty( $field['placeholder'] ) ? esc_attr( $field['placeholder'] ) : '';
733
734 // Label.
735 $this->field_preview_option( 'label', $field );
736
737 // Primary input.
738 echo '<input type="text" placeholder="' . esc_attr( $placeholder ) . '" class="widefat" disabled>';
739
740 // Description.
741 $this->field_preview_option( 'description', $field );
742 }
743
744 /**
745 * Field display on the form front-end.
746 *
747 * @since 1.0.0
748 *
749 * @param array $field Field Data.
750 * @param array $field_atts Field attributes.
751 * @param array $form_data All Form Data.
752 */
753 public function field_display( $field, $field_atts, $form_data ) {
754 // Define data.
755 $primary = $field['properties']['inputs']['primary'];
756
757 $class = array_merge( array( 'flatpickr-field' ), $primary['class'] );
758
759 if ( ! array_key_exists( 'datetime_style', $field ) || 'picker' === $field['datetime_style'] ) {
760 $class = array_merge( array( 'flatpickr-field' ), $primary['class'] );
761 // Primary field.
762 printf(
763 '<input type="text" %s %s >',
764 evf_html_attributes( $primary['id'], $class, $primary['data'], $primary['attr'] ),
765 esc_attr( $primary['required'] )
766 );
767 } else {
768 $class = array_merge( array( 'date-dropdown-field' ), $primary['class'] );
769 echo '<div class="date-time-container">';
770
771 printf(
772 '<input type="text" %s %s >',
773 evf_html_attributes( $primary['id'], $class, $primary['data'], $primary['attr'] ),
774 esc_attr( $primary['required'] )
775 );
776
777 if ( 'date-time' === $field['datetime_format'] || 'date' === $field['datetime_format'] ) {
778 $data_date_format = $primary['attr']['data-date-format'];
779
780 if ( 'F j, Y' === $data_date_format || 'm/d/Y' === $data_date_format || 'F j, Y H:i' === $data_date_format || 'F j, Y h:i K' === $data_date_format || 'm/d/Y H:i' === $data_date_format || 'm/d/Y h:i K' === $data_date_format ) {
781 $this->get_month_html( $primary );
782 $this->get_day_html( $primary );
783 $this->get_year_html( $primary );
784 } elseif ( 'd/m/Y' === $data_date_format || 'd/m/Y H:i' === $data_date_format || 'd/m/Y h:i K' === $data_date_format ) {
785 $this->get_day_html( $primary );
786 $this->get_month_html( $primary );
787 $this->get_year_html( $primary );
788 } else {
789 $this->get_year_html( $primary );
790 $this->get_month_html( $primary );
791 $this->get_day_html( $primary );
792 }
793 }
794
795 if ( 'date-time' === $field['datetime_format'] ) {
796 echo '<span class="date-time-space-filler"></span>';
797 }
798
799 if ( 'time' === $field['datetime_format'] || 'date-time' === $field['datetime_format'] ) {
800
801 $min_hour = isset( $field['min_time_hour'], $field['enable_min_max_time'] ) ? $field['min_time_hour'] : 0;
802 $max_hour = isset( $field['min_time_hour'], $field['enable_min_max_time'] ) ? $field['max_time_hour'] : 23;
803
804 // For Hours.
805 printf(
806 '<select value = "%s" %s>',
807 esc_attr( ( gmdate( 'H' ) >= $min_hour && ( gmdate( 'H' ) <= $max_hour ) ) ? gmdate( 'H' ) : $min_hour ),
808 evf_html_attributes( 'hour-select-' . esc_attr( $primary['id'] ) )
809 );
810
811 for ( $i = $min_hour; $i <= $max_hour; $i++ ) {
812 printf(
813 '<option value="%s" %s>%s</option>',
814 esc_attr( $i ),
815 (int) gmdate( 'H' ) === $i ? 'selected' : '',
816 esc_html( $this->get_minute_hours( $field, 'hours' )[ $i ] )
817 );
818 }
819
820 echo '</select>';
821
822 $time_interval = isset( $field['time_interval'] ) ? $field['time_interval'] : 1;
823
824 // For Minutes.
825 printf(
826 '<select %s>',
827 evf_html_attributes( 'minute-select-' . esc_attr( $primary['id'] ) )
828 );
829 echo '</select>';
830 }
831
832 echo '</div>';
833 }
834
835 }
836
837 /**
838 * Register/queue frontend scripts.
839 *
840 * @param array $atts Shortcode attributes.
841 */
842 public static function load_assets( $atts ) {
843 $form_id = isset( $atts['id'] ) ? wp_unslash( $atts['id'] ) : ''; // WPCS: CSRF ok, input var ok, sanitization ok.
844 $form_obj = evf()->form->get( $form_id );
845 $form_data = ! empty( $form_obj->post_content ) ? evf_decode( $form_obj->post_content ) : '';
846
847 if ( ! empty( $form_data['form_fields'] ) ) {
848 $data_i10ns = array();
849 foreach ( $form_data['form_fields'] as $form_field ) {
850 if ( 'date-time' === $form_field['type'] && isset( $form_field['datetime_style'] ) && 'picker' === $form_field['datetime_style'] ) {
851 $data_i10n = isset( $form_field['date_localization'] ) ? $form_field['date_localization'] : 'en';
852
853 if ( ! in_array( $data_i10n, $data_i10ns, true ) && 'en' !== $data_i10n ) {
854 $data_i10ns[] = $data_i10n;
855 }
856 }
857 }
858
859 if ( ! empty( $data_i10ns ) ) {
860 foreach ( $data_i10ns as $data_i10n ) {
861 if ( wp_script_is( 'flatpickr' ) ) {
862 wp_enqueue_script( 'flatpickr-localization-' . $data_i10n, evf()->plugin_url() . '/assets/js/flatpickr/dist/I10n/' . $data_i10n . '.js', array(), EVF_VERSION, true );
863 }
864 }
865 }
866 }
867
868 }
869
870 /**
871 * Print HTML for year.
872 *
873 * @param array $primary Primary.
874 * @return void
875 */
876 private function get_year_html( $primary ) {
877 // For Years.
878 printf(
879 '<select value="%s" %s >',
880 esc_attr( gmdate( 'Y' ) ),
881 evf_html_attributes( 'year-select-' . esc_attr( $primary['id'] ) )
882 );
883 // Build the select options.
884 $end_date = gmdate( 'Y' ) + 100;
885 $start_date = $end_date - 200;
886
887 for ( $i = $end_date; $i >= $start_date; $i-- ) {
888 printf(
889 '<option value="%s" %s>%s</option>',
890 esc_attr( $i ),
891 (int) gmdate( 'Y' ) === $i ? 'selected' : '',
892 esc_html( $i )
893 );
894 }
895 echo '</select>';
896 }
897
898 /**
899 * Print HTML for month.
900 *
901 * @param array $primary Primary.
902 * @return void
903 */
904 private function get_month_html( $primary ) {
905 // For Months.
906 printf(
907 '<select value="%s" %s >',
908 esc_attr( gmdate( 'm' ) ),
909 evf_html_attributes( 'month-select-' . esc_attr( $primary['id'] ) )
910 );
911 // Build the select options.
912 for ( $i = 1; $i <= 12; $i++ ) {
913 $month = ( $i < 10 ) ? '0' . $i : $i;
914 printf(
915 '<option value="%s" %s>%s</option>',
916 esc_attr( $i ),
917 (int) gmdate( 'm' ) === $i ? 'selected' : '',
918 esc_html( $month )
919 );
920 }
921 echo '</select>';
922 }
923
924 /**
925 * Print HTML for day.
926 *
927 * @param array $primary Primary.
928 * @return void
929 */
930 private function get_day_html( $primary ) {
931 // For Days.
932 printf(
933 '<select value="%s" %s >',
934 esc_attr( gmdate( 'd' ) ),
935 evf_html_attributes( 'day-select-' . esc_attr( $primary['id'] ) )
936 );
937 // Build the select options.
938 for ( $i = 1; $i <= 32; $i++ ) {
939 $day = $i < 10 ? '0' . $i : $i;
940 printf(
941 '<option value="%s" %s>%s</option>',
942 esc_attr( $i ),
943 (int) gmdate( 'd' ) === $i ? 'selected' : '',
944 esc_html( $day )
945 );
946 }
947 echo '</select>';
948 }
949 }
950