namespace WPForms\Forms\Fields\Traits;
* Add camera options to the field.
* @param array $field Field data and settings.
public function camera_options( array $field ): void {
$this->add_camera_enabled_toggle( $field );
$this->add_camera_format_options( $field );
$this->add_camera_aspect_ratio_options( $field );
$this->add_camera_custom_ratio_options( $field );
$this->add_camera_time_limit_options( $field );
* Add camera-enabled toggle.
* @param array $field Field data and settings.
private function add_camera_enabled_toggle( array $field ): void {
// Check if this is a Camera field (not FileUpload with camera options).
$is_camera_field = $this->type === 'camera';
$camera_enabled = $this->field_element(
'slug' => 'camera_enabled',
'value' => $this->is_camera_enabled_for_field( $field ) ? 1 : '',
'desc' => esc_html__( 'Enable Camera', 'wpforms-lite' ),
'tooltip' => esc_html__( 'Check this option to enable the camera field.', 'wpforms-lite' ),
'class' => 'wpforms-file-upload-camera-enabled-toggle',
// Hide the toggle for the Camera field, show for FileUpload field.
$row_class = [ 'wpforms-file-upload-camera-enabled-row' ];
if ( $is_camera_field ) {
$row_class[] = 'wpforms-hidden';
'content' => $camera_enabled,
* Add camera format options.
* @param array $field Field data and settings.
private function add_camera_format_options( array $field ): void {
$format_label = $this->field_element(
'slug' => 'camera_format',
'value' => esc_html__( 'Format', 'wpforms-lite' ),
'tooltip' => esc_html__( 'Select the camera format.', 'wpforms-lite' ),
'class' => 'wpforms-file-upload-camera-format-label',
$format_select = $this->field_element(
'slug' => 'camera_format',
'value' => ! empty( $field['camera_format'] ) ? $field['camera_format'] : 'photo',
'photo' => esc_html__( 'Photo', 'wpforms-lite' ),
'video' => esc_html__( 'Video', 'wpforms-lite' ),
'class' => 'wpforms-file-upload-camera-format-select',
// Check if the camera is enabled to determine visibility.
$hidden_class = $this->is_camera_enabled_for_field( $field ) ? [] : [ 'wpforms-hidden' ];
'slug' => 'camera_format',
'content' => $format_label . $format_select,
'class' => array_merge( [ 'wpforms-file-upload-camera-format' ], $hidden_class ),
* Add camera aspect ratio options.
* @param array $field Field data and settings.
private function add_camera_aspect_ratio_options( array $field ): void {
$aspect_ratio_label = $this->field_element(
'slug' => 'camera_aspect_ratio',
'value' => esc_html__( 'Aspect Ratio', 'wpforms-lite' ),
'tooltip' => esc_html__( 'Select the camera aspect ratio.', 'wpforms-lite' ),
'class' => 'wpforms-file-upload-camera-aspect-ratio-label',
// Build aspect ratio options - always include freeform.
$aspect_ratio_options = [
'original' => esc_html__( 'Original', 'wpforms-lite' ),
'custom' => esc_html__( 'Custom', 'wpforms-lite' ),
'freeform' => esc_html__( 'Freeform', 'wpforms-lite' ),
'optgroup' => esc_html__( 'Landscape orientation', 'wpforms-lite' ),
'16:9' => esc_html__( '16:9', 'wpforms-lite' ),
'5:4' => esc_html__( '5:4', 'wpforms-lite' ),
'3:2' => esc_html__( '3:2', 'wpforms-lite' ),
'optgroup' => esc_html__( 'Portrait orientation', 'wpforms-lite' ),
'9:16' => esc_html__( '9:16', 'wpforms-lite' ),
'4:5' => esc_html__( '4:5', 'wpforms-lite' ),
'2:3' => esc_html__( '2:3', 'wpforms-lite' ),
// Add class to hide freeform if a format is not a photo.
$camera_format = ! empty( $field['camera_format'] ) ? $field['camera_format'] : 'photo';
$aspect_ratio_class = [ 'wpforms-file-upload-camera-aspect-ratio-select' ];
if ( $camera_format !== 'photo' ) {
$aspect_ratio_class[] = 'wpforms-file-upload-camera-aspect-ratio-no-freeform';
$aspect_ratio_select = $this->field_element(
'slug' => 'camera_aspect_ratio',
'value' => ! empty( $field['camera_aspect_ratio'] ) ? $field['camera_aspect_ratio'] : 'original',
'options' => $aspect_ratio_options,
'class' => $aspect_ratio_class,
// Check if the camera is enabled to determine visibility.
$hidden_class = $this->is_camera_enabled_for_field( $field ) ? [] : [ 'wpforms-hidden' ];
'slug' => 'camera_aspect_ratio',
'content' => $aspect_ratio_label . $aspect_ratio_select,
'class' => array_merge( [ 'wpforms-file-upload-camera-aspect-ratio' ], $hidden_class ),
* Add camera custom ratio options.
* @param array $field Field data and settings.
private function add_camera_custom_ratio_options( array $field ): void {
// Check if an aspect ratio is custom to determine visibility.
$camera_aspect_ratio = ! empty( $field['camera_aspect_ratio'] ) ? $field['camera_aspect_ratio'] : 'original';
$custom_ratio_hidden_class = ( $this->is_camera_enabled_for_field( $field ) && $camera_aspect_ratio === 'custom' ) ? [] : [ 'wpforms-hidden' ];
$ratio_width_field = '<div class="wpforms-file-upload-camera-ratio-width">' . $this->field_element(
'slug' => 'camera_ratio_width',
'value' => ! empty( $field['camera_ratio_width'] ) && $field['camera_ratio_width'] >= 1 ? $field['camera_ratio_width'] : '4',
'after' => esc_html__( 'Ratio Width', 'wpforms-lite' ),
'class' => 'wpforms-file-upload-camera-ratio-width-input',
$ratio_height_field = '<div class="wpforms-file-upload-camera-ratio-height">' . $this->field_element(
'slug' => 'camera_ratio_height',
'value' => ! empty( $field['camera_ratio_height'] ) && $field['camera_ratio_height'] >= 1 ? $field['camera_ratio_height'] : '3',
'after' => esc_html__( 'Ratio Height', 'wpforms-lite' ),
'class' => 'wpforms-file-upload-camera-ratio-height-input',
'slug' => 'camera_custom_ratio',
'content' => '<div class="wpforms-field-option-row-columns wpforms-field-option-row-columns-2 wpforms-file-upload-camera-ratio-columns">' . $ratio_width_field . $ratio_height_field . '</div>',
'class' => array_merge( [ 'wpforms-file-upload-camera-custom-ratio' ], $custom_ratio_hidden_class ),
* Add camera time limit options.
* @param array $field Field data and settings.
private function add_camera_time_limit_options( array $field ): void {
$time_limit_label = $this->field_element(
'slug' => 'camera_time_limit',
'value' => esc_html__( 'Time Limit', 'wpforms-lite' ),
'tooltip' => esc_html__( 'Set the time limit for camera recording.', 'wpforms-lite' ),
'class' => 'wpforms-file-upload-camera-time-limit-label',
$minutes_field = '<div class="wpforms-file-upload-camera-time-limit-minutes">' . $this->field_element(
'slug' => 'camera_time_limit_minutes',
'value' => ! empty( $field['camera_time_limit_minutes'] ) && $field['camera_time_limit_minutes'] >= 0 ? $field['camera_time_limit_minutes'] : '1',
'after' => esc_html__( 'Minutes', 'wpforms-lite' ),
'class' => 'wpforms-file-upload-camera-time-limit-minutes-input',
$seconds_field = '<div class="wpforms-file-upload-camera-time-limit-seconds">' . $this->field_element(
'slug' => 'camera_time_limit_seconds',
'value' => ! empty( $field['camera_time_limit_seconds'] ) && $field['camera_time_limit_seconds'] >= 0 && $field['camera_time_limit_seconds'] <= 59 ? $field['camera_time_limit_seconds'] : '30',
'after' => esc_html__( 'Seconds', 'wpforms-lite' ),
'class' => 'wpforms-file-upload-camera-time-limit-seconds-input',
// Check if a format is video to determine time limit visibility.
$camera_format = ! empty( $field['camera_format'] ) ? $field['camera_format'] : 'photo';
$time_limit_hidden_class = ( $this->is_camera_enabled_for_field( $field ) && $camera_format === 'video' ) ? [] : [ 'wpforms-hidden' ];
'slug' => 'camera_time_limit',
'content' => $time_limit_label . '<div class="wpforms-field-option-row-columns wpforms-field-option-row-columns-2 wpforms-file-upload-camera-time-limit-columns">' . $minutes_field . $seconds_field . '</div>',
'class' => array_merge( [ 'wpforms-file-upload-camera-time-limit' ], $time_limit_hidden_class ),
* Whether the provided form has a camera field.
* @param array|mixed $form Form data.
protected function is_camera_enabled( $form ): bool {
if ( empty( $form['fields'] ) ) {
foreach ( $form['fields'] as $field ) {
if ( ! empty( $field['camera_enabled'] ) ) {
* Whether the field is a camera field or has camera enabled.
* @param array $field Field data and settings.
private function is_camera_enabled_for_field( array $field ): bool {
return $this->type === 'camera' || ! empty( $field['camera_enabled'] );
* Get the camera time limit in seconds.
* @param array $field Field data.
* @return int Camera time limit in seconds.
public function get_camera_time_limit( array $field ): int {
'camera_enabled' => false,
'camera_time_limit_minutes' => 0,
'camera_time_limit_seconds' => 0,
if ( empty( $field['camera_enabled'] ) || $field['camera_format'] !== 'video' ) {
return absint( $field['camera_time_limit_minutes'] ) * 60 + absint( $field['camera_time_limit_seconds'] );