Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
121 commits
Select commit Hold shift + click to select a range
419db81
Add option to limit field choices selection
AbdiTolesa Sep 18, 2025
131c38a
Refactor function
AbdiTolesa Sep 19, 2025
795be68
Add disable attribute to radio fields based on choice limit setting
AbdiTolesa Sep 19, 2025
bd9f947
Do not check disabled checkbox
AbdiTolesa Sep 25, 2025
191299f
Cover dropdown field for choice limit checks
AbdiTolesa Sep 25, 2025
e4fd076
Do not disable choices in builder
AbdiTolesa Sep 29, 2025
ea2ea27
Try reusing frm_field_input_html to output disabled html att
AbdiTolesa Sep 30, 2025
055c1b7
Hide/Disable field choices that hit max entry based off the form sett…
AbdiTolesa Sep 30, 2025
de943ef
Committing progress
AbdiTolesa Sep 30, 2025
06102a9
Fix some style errors
AbdiTolesa Oct 1, 2025
c6872b7
Revert some changes
AbdiTolesa Oct 3, 2025
fcf9770
Hide/Disable choices based off the new setting
AbdiTolesa Oct 8, 2025
5613edd
Remove extra function param passed to FrmFieldsController::maybe_disa…
AbdiTolesa Oct 8, 2025
4e097eb
Add latest field choice output updates to dropdown field
AbdiTolesa Oct 8, 2025
acb7bd1
Make function and variables more descriptive for choice limit check l…
AbdiTolesa Oct 8, 2025
9a3ff48
Fix merge conflicts
AbdiTolesa Oct 8, 2025
55c4931
Sync js files with master
AbdiTolesa Oct 8, 2025
53f1676
Sync js files with master
AbdiTolesa Oct 8, 2025
5931cad
Sync js files with master
AbdiTolesa Oct 8, 2025
9ac0c74
Move function from Pro to Lite
AbdiTolesa Oct 8, 2025
8bef115
Resolve dependency on Pro
AbdiTolesa Oct 8, 2025
b376cda
Fix workflow errors
AbdiTolesa Oct 14, 2025
da17e00
Reduce PHP logic in view files
AbdiTolesa Oct 14, 2025
b7b357a
Move function that fetches form option into Pro
AbdiTolesa Oct 14, 2025
ad7e2c2
Avoid outputting <select> tag if all choices have hit their limit for…
AbdiTolesa Oct 22, 2025
e367bcf
Move code that should be in Pro to there
AbdiTolesa Oct 22, 2025
3b8a3df
Add choice limit reached validation message to helper function
AbdiTolesa Oct 22, 2025
6d48545
Cover other field types for showing new message
AbdiTolesa Oct 22, 2025
e8aac0c
Change default message for choice limit reached
AbdiTolesa Oct 22, 2025
c497327
Change array_filter calls to foreach
AbdiTolesa Oct 22, 2025
78ad919
Use current() to simplify complicated code
AbdiTolesa Oct 22, 2025
c7709ea
Fix merge conflict
AbdiTolesa Oct 22, 2025
574fd74
Merge branch 'master' into limit_choices_selection_lite_part
AbdiTolesa Oct 22, 2025
05f367a
Fix potential bugs
AbdiTolesa Oct 22, 2025
6020eaf
Fix missing variable warning
AbdiTolesa Oct 22, 2025
6ec1d1c
Fix potential bug
AbdiTolesa Nov 11, 2025
9986575
Add comment to new action
AbdiTolesa Nov 11, 2025
f11b7ac
Merge master
AbdiTolesa Nov 12, 2025
5050456
Add a couple of enhancements
AbdiTolesa Nov 12, 2025
1d7d8e4
Fix limit input element getting selected when it shouldn't
AbdiTolesa Nov 13, 2025
2ad0655
Make sure maxed out options are not reset on entry submit
AbdiTolesa Nov 13, 2025
20976b9
Add a new hook frm_should_echo_disabled_attribute
AbdiTolesa Nov 14, 2025
bf4e6a3
Merge branch 'master' into limit_choices_selection_lite_part
Crabcyborg Nov 17, 2025
3fe4eeb
Tweak label query
Crabcyborg Nov 17, 2025
799de54
Fix issue with other options not getting added
Crabcyborg Nov 17, 2025
8c5c69f
Do some code refactoring
AbdiTolesa Nov 17, 2025
645aada
Merge branch 'limit_choices_selection_lite_part' of https://github.co…
AbdiTolesa Nov 17, 2025
e1e3244
Do some code refactoring
AbdiTolesa Nov 17, 2025
cda61bb
Add filter that allows updating field default validation messages
AbdiTolesa Nov 17, 2025
7c62ffe
Update new filter param comment
AbdiTolesa Nov 17, 2025
0946032
Fix potential condition check bug
AbdiTolesa Nov 17, 2025
db23bfc
Align array arrows
AbdiTolesa Nov 17, 2025
e953057
Add missing function descriptions
AbdiTolesa Nov 18, 2025
471f39b
Move should_hide_field_choice method to FrmFieldsHelper
AbdiTolesa Nov 26, 2025
01de971
Move FrmFieldsController::should_echo_disabled_attribute to FrmFields…
AbdiTolesa Nov 26, 2025
52d85eb
Move more functions and shorten a function param
AbdiTolesa Nov 26, 2025
15b47f6
Fix a potential bug
AbdiTolesa Nov 26, 2025
db58a4e
Delete return type declaration for a filter
AbdiTolesa Nov 26, 2025
c6d5edd
Fix merge conflict
AbdiTolesa Nov 26, 2025
4a385b3
Build files
AbdiTolesa Nov 26, 2025
ae6be8a
Address potential bugs and improve code related to choice limit feature
AbdiTolesa Nov 26, 2025
06418cb
Move more choices limit feature related code to Pro
AbdiTolesa Nov 26, 2025
2ed2690
Move more code from Lite to Pro
AbdiTolesa Nov 26, 2025
50f3d5f
Refactor code to simplify logics in view files
AbdiTolesa Nov 27, 2025
242c12a
Delete code not needed in Lite
AbdiTolesa Nov 27, 2025
c8f792d
Merge branch 'master' into limit_choices_selection_lite_part
AbdiTolesa Nov 28, 2025
d74ef56
Merge branch 'master' into limit_choices_selection_lite_part
AbdiTolesa Nov 28, 2025
bce1dc3
Clean up stubs.php
AbdiTolesa Nov 28, 2025
7b49acb
Add a missing ?? check
AbdiTolesa Nov 28, 2025
994471e
Fix a PHP doc separation check error
AbdiTolesa Nov 28, 2025
dc09bc3
Merge branch 'master' into limit_choices_selection_lite_part
Crabcyborg Dec 3, 2025
9057e3d
Merge branch 'master' into limit_choices_selection_lite_part
Crabcyborg Dec 3, 2025
87f0ec0
Cast to bool
AbdiTolesa Dec 4, 2025
c2786f5
Fix merge conflicts
AbdiTolesa Dec 4, 2025
cc787a3
Cast to bool
AbdiTolesa Dec 4, 2025
e347397
Merge branch 'master' into limit_choices_selection_lite_part
AbdiTolesa Dec 4, 2025
efc359a
Fixed code style with PHP CS Fixer
AbdiTolesa Dec 4, 2025
338cd21
Fixed code style with PHP CS Fixer
AbdiTolesa Dec 4, 2025
fcbca46
Reduce opacity for disabled inputs
AbdiTolesa Dec 4, 2025
7d783ee
Support showing remaining choice entries
AbdiTolesa Dec 22, 2025
cba9039
Support showing remaining choices for image formatted choices
AbdiTolesa Dec 22, 2025
03c62b2
Pass extra param to frm_choice_field_option_label filter
AbdiTolesa Dec 22, 2025
2e899fb
Merge master
AbdiTolesa Dec 22, 2025
6472959
Add missing param needed for showing remaining choice entries
AbdiTolesa Dec 22, 2025
eca4902
Fix code style errors
AbdiTolesa Dec 23, 2025
43b7e71
Simplify and refactor functions
AbdiTolesa Dec 23, 2025
32b0c04
Avoid inline comment
AbdiTolesa Dec 23, 2025
638848b
Add a field setting that allows controlling whether remaining options…
AbdiTolesa Dec 30, 2025
1200b96
Add field settings to customize choice limit messages
AbdiTolesa Dec 31, 2025
b35fe1a
Merge master and rebuild files
AbdiTolesa Dec 31, 2025
21c1222
Merge master and rebuild files
AbdiTolesa Dec 31, 2025
038f926
Fix merge conflicts and merge master
AbdiTolesa Jan 21, 2026
77e0861
Fix remaining merge conflict
AbdiTolesa Jan 21, 2026
4b86627
Fix codestyle issues
AbdiTolesa Jan 21, 2026
5667907
Merge branch 'master' into limit_choices_selection_lite_part
Crabcyborg Jan 21, 2026
b86c871
Drop map files
Crabcyborg Jan 21, 2026
626562e
Reduce repeated code and delete Pro related style
AbdiTolesa Jan 22, 2026
580a932
Merge branch 'limit_choices_selection_lite_part' of https://github.co…
AbdiTolesa Jan 22, 2026
32c41c5
Fix broken PHPCS rule
AbdiTolesa Jan 22, 2026
a240155
Make filter name more generic
AbdiTolesa Jan 23, 2026
c86c146
Move more Pro related to Pro
AbdiTolesa Jan 26, 2026
cd6b75f
Change variable names and fix function description comments
AbdiTolesa Jan 27, 2026
b1361c0
Add missing $ symbol
AbdiTolesa Jan 27, 2026
1fd31a8
Group functions together
AbdiTolesa Jan 27, 2026
a39eb33
Fix merge conflict with master and merge master
AbdiTolesa Jan 27, 2026
6341144
Merge branch 'master' into limit_choices_selection_lite_part
Crabcyborg Jan 27, 2026
a5f8d0b
Use kses echo (merge conflict error)
Crabcyborg Jan 27, 2026
39946a5
Update param type in filter description
AbdiTolesa Jan 27, 2026
14e0f06
Fix static analysis error
AbdiTolesa Jan 27, 2026
75eb854
Try alternative way to reuse echo_dropdown_option
AbdiTolesa Jan 27, 2026
23f215c
Align function params spacing
AbdiTolesa Jan 27, 2026
5ba0a83
Merge branch 'master' into limit_choices_selection_lite_part
Crabcyborg Jan 27, 2026
699093d
Address some comments
AbdiTolesa Jan 27, 2026
1e011ec
Merge branch 'limit_choices_selection_lite_part' of https://github.co…
AbdiTolesa Jan 27, 2026
00c8bed
Add missing variable name from filter params description comment
AbdiTolesa Jan 27, 2026
d382ac5
Merge branch 'master' into limit_choices_selection_lite_part
Crabcyborg Jan 27, 2026
6c64a19
Change function name
AbdiTolesa Jan 27, 2026
d11b8af
Merge branch 'limit_choices_selection_lite_part' of https://github.co…
AbdiTolesa Jan 27, 2026
9537362
Change function name to make it more descriptive
AbdiTolesa Jan 27, 2026
507066a
Update function comment
AbdiTolesa Jan 27, 2026
59e3bc7
Change function name for consistency
AbdiTolesa Jan 28, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
89 changes: 89 additions & 0 deletions classes/helpers/FrmFieldsHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -474,6 +474,14 @@ public static function get_error_msg( $field, $error ) {
),
);

/**
* @since x.x
*
* @param array $defaults
* @param array|object $field
*/
$defaults = apply_filters( 'frm_default_field_validation_messages', $defaults, $field );

$msg = FrmField::get_option( $field, $error );
$msg = $msg ? $msg : $defaults[ $error ]['part'];
$msg = do_shortcode( $msg );
Expand Down Expand Up @@ -2798,4 +2806,85 @@ private static function get_ai_generate_options_button_class() {
)
);
}

/**
* Checks if the field choice should be hidden due to choice limit being reached.
*
* @since x.x
*
* @param string $choice_key
* @param array $field
*
* @return bool
*/
public static function should_hide_field_choice( $choice_key, $field ) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@AbdiTolesa I'm thinking option might make sense here as well for consistency?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Crabcyborg Actually, I was in favor of field_choice instead of field_option as we use field_option to refer to any variable in $field->field_options across our plugins and choice makes it less vague, I used choice in all of the functions related to the this project in Pro too. If we should change this here, I think we need to make so many similar changes in Pro but I'll leave the decision to you after sharing my thoughts on this.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @AbdiTolesa.

I mostly want consistency.

I think choice is fine, as long as we aren't using option too in the new code.

/**
* @since x.x
*
* @param bool $hide_field_choice
* @param string $choice_key
* @param array $field
*/
return (bool) apply_filters( 'frm_hide_field_choice', false, $choice_key, $field );
}

/**
* @since x.x
*
* @param array $field
*
* @return bool
*/
public static function should_skip_rendering_options_for_field( $field ) {
/**
* @since x.x
*
* @param bool $skip_rendering_options_for_field
* @param array $field
*/
return (bool) apply_filters( 'frm_should_skip_rendering_options_for_field', false, $field );
}

/**
* Determine if 'disabled' attribute should be echoed in a field choice's HTML.
*
* @since x.x
*
* @param string $choice_key
* @param bool $is_selected_choice
* @param array $field
*
* @return bool
*/
public static function should_disable_option( $choice_key, $is_selected_choice, $field ) {
/**
* @since x.x
*
* @param bool $echo_disabled_attribute
* @param string $choice_key
* @param bool $is_selected_choice
* @param array $field
*/
return (bool) apply_filters( 'frm_disable_option', false, $choice_key, $is_selected_choice, $field );
}

/**
* @since x.x
*
* @param array $field
* @param string $choice_key
*
* @return void
*/
public static function after_option_input( $field, $choice_key ) {
/**
* Allows adding content after checkbox, radio button, or dropdown fields.
*
* @since x.x
*
* @param array $field The field data.
* @param string $opt_key The option key.
*/
do_action( 'frm_after_option_input', $field, $choice_key );
}
}
4 changes: 2 additions & 2 deletions classes/views/frm-fields/back-end/field-options.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@

$field_option_count = is_array( $args['field']['options'] ) ? count( $args['field']['options'] ) : 0;
?>
<span class="frm-hr frm-mb-sm"></span>

<span class="frm-bulk-edit-link <?php echo $should_hide_bulk_edit ? 'frm_hidden' : ''; ?>">
<a href="#" title="<?php echo esc_attr( $option_title ); ?>" class="frm-h-stack frm-justify-end frm-bulk-edit-link">
<span>
Expand All @@ -24,8 +26,6 @@

<?php do_action( 'frm_add_multiple_opts_labels', $args['field'] ); ?>

<span class="frm-hr frm-mb-sm"></span>

<ul id="frm_field_<?php echo esc_attr( $args['field']['id'] ); ?>_opts" class="frm_sortable_field_opts frm_clear<?php echo $field_option_count > 10 ? ' frm_field_opts_list' : ''; ?> frm_add_remove" data-key="<?php echo esc_attr( $args['field']['field_key'] ); ?>">
<?php $this->show_single_option( $args ); ?>
</ul>
Expand Down
8 changes: 8 additions & 0 deletions classes/views/frm-fields/back-end/settings.php
Original file line number Diff line number Diff line change
Expand Up @@ -529,6 +529,14 @@
</p>
<?php
}

/**
* @since x.x
*
* @param array $display
* @param array $field
*/
do_action( 'frm_field_validation_messages', $display, $field );
?>
</div>
</div>
Expand Down
29 changes: 23 additions & 6 deletions classes/views/frm-fields/front-end/checkbox-field.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,21 @@
$type = $field['type'];
do_action( 'frm_after_checkbox', compact( 'field', 'field_name', 'type' ) );
} elseif ( $field['options'] ) {
if ( FrmFieldsHelper::should_skip_rendering_options_for_field( $field ) ) {
return;
}

$option_index = 0;

foreach ( $field['options'] as $opt_key => $opt ) {
if ( isset( $shortcode_atts ) && isset( $shortcode_atts['opt'] ) && $shortcode_atts['opt'] !== $opt_key ) {
continue;
}

if ( FrmFieldsHelper::should_hide_field_choice( $opt_key, $field ) ) {
continue;
}

$field_val = FrmFieldsHelper::get_value_from_array( $opt, $opt_key, $field );
$opt = FrmFieldsHelper::get_label_from_array( $opt, $opt_key, $field );

Expand All @@ -31,9 +39,9 @@
* @since 5.0.04
*
* @param string $label Label HTML.
* @param array $args The arguments. Contains `field`.
* @param array $args The arguments. Contains `field` and `field_val`.
*/
$label = apply_filters( 'frm_choice_field_option_label', $opt, compact( 'field' ) );
$label = apply_filters( 'frm_choice_field_option_label', $opt, compact( 'field', 'field_val' ) );

// init.
$checked = '';
Expand All @@ -49,36 +57,45 @@
$other_opt = false;
$other_args = FrmFieldsHelper::prepare_other_input( compact( 'field', 'field_name', 'opt_key', 'field_val' ), $other_opt, $checked );

$should_echo_disabled_att = FrmFieldsHelper::should_disable_option( $opt_key, $checked, $field );
?>
<div class="<?php echo esc_attr( apply_filters( 'frm_checkbox_class', 'frm_checkbox', $field, $field_val ) ); ?>" id="<?php echo esc_attr( FrmFieldsHelper::get_checkbox_id( $field, $opt_key ) ); ?>"><?php

if ( ! isset( $shortcode_atts ) || ! isset( $shortcode_atts['label'] ) || $shortcode_atts['label'] ) {
$include_label = ! isset( $shortcode_atts ) || ! isset( $shortcode_atts['label'] ) || $shortcode_atts['label'];

if ( $include_label ) {
$label_attributes = array(
'for' => $html_id . '-' . $opt_key,
);

if ( $read_only ) {
if ( $read_only || $should_echo_disabled_att ) {
$label_attributes['class'] = 'frm-label-disabled';
}

?>
<label <?php FrmAppHelper::array_to_html_params( $label_attributes, true ); ?>>
<?php
}

?><input type="checkbox" name="<?php echo esc_attr( $field_name ); ?>[<?php echo esc_attr( $other_opt ? $opt_key : '' ); ?>]" id="<?php echo esc_attr( $html_id ); ?>-<?php echo esc_attr( $opt_key ); ?>" value="<?php echo esc_attr( $field_val ); ?>"<?php
echo $checked . ' '; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped

do_action( 'frm_field_input_html', $field );
echo $checked . ' '; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped

if ( $should_echo_disabled_att ) {
echo 'disabled="disabled" data-max-reached="1" ';
}

if ( 0 === $option_index && FrmField::is_required( $field ) ) {
echo ' aria-required="true" ';
}

?> /><?php

if ( ! isset( $shortcode_atts ) || ! isset( $shortcode_atts['label'] ) || $shortcode_atts['label'] ) {
if ( $include_label ) {
echo ' ';
FrmAppHelper::kses_echo( $label, 'all' );
FrmFieldsHelper::after_option_input( $field, $opt_key );
echo '</label>';
}

Expand Down
22 changes: 21 additions & 1 deletion classes/views/frm-fields/front-end/dropdown-field.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@
)
);
} else {
if ( FrmFieldsHelper::should_skip_rendering_options_for_field( $field ) ) {
return;
}

if ( $read_only ) {
?>
<select <?php do_action( 'frm_field_input_html', $field ); ?>>
Expand Down Expand Up @@ -46,6 +50,10 @@
}

foreach ( $field['options'] as $opt_key => $opt ) {
if ( FrmFieldsHelper::should_hide_field_choice( $opt_key, $field ) ) {
continue;
}

$field_val = FrmFieldsHelper::get_value_from_array( $opt, $opt_key, $field );
$opt = FrmFieldsHelper::get_label_from_array( $opt, $opt_key, $field );
$selected = FrmAppHelper::check_selected( $field['value'], $field_val );
Expand All @@ -72,7 +80,19 @@
$option_params['class'] = 'frm_other_trigger';
}

FrmHtmlHelper::echo_dropdown_option( $opt, (bool) $selected, $option_params );
if ( FrmFieldsHelper::should_disable_option( $opt_key, $selected, $field ) ) {
$option_params['disabled'] = 'disabled';
}

echo '<option ';
FrmAppHelper::array_to_html_params( $option_params, true );
selected( $selected );
echo '>';
echo esc_html( $opt === '' ? ' ' : $opt );
FrmFieldsHelper::after_option_input( $field, $opt_key );

echo '</option>';

unset( $option_params );
}//end foreach
?>
Expand Down
29 changes: 23 additions & 6 deletions classes/views/frm-fields/front-end/radio-field.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,20 @@
$type = $field['type'];
do_action( 'frm_after_checkbox', compact( 'field', 'field_name', 'type' ) );
} elseif ( is_array( $field['options'] ) ) {
if ( FrmFieldsHelper::should_skip_rendering_options_for_field( $field ) ) {
return;
}
$include_label = ! isset( $shortcode_atts ) || ! isset( $shortcode_atts['label'] ) || $shortcode_atts['label'];

foreach ( $field['options'] as $opt_key => $opt ) {
if ( isset( $shortcode_atts ) && isset( $shortcode_atts['opt'] ) && $shortcode_atts['opt'] !== $opt_key ) {
continue;
}

if ( FrmFieldsHelper::should_hide_field_choice( $opt_key, $field ) ) {
continue;
}

$field_val = FrmFieldsHelper::get_value_from_array( $opt, $opt_key, $field );
$opt = FrmFieldsHelper::get_label_from_array( $opt, $opt_key, $field );

Expand All @@ -29,18 +38,21 @@
* @since 5.0.04
*
* @param string $label Label HTML.
* @param array $args The arguments. Contains `field`.
* @param array $args The arguments. Contains `field` and `field_val`.
*/
$label = apply_filters( 'frm_choice_field_option_label', $opt, compact( 'field' ) );
$label = apply_filters( 'frm_choice_field_option_label', $opt, compact( 'field', 'field_val' ) );
?>
<div class="<?php echo esc_attr( apply_filters( 'frm_radio_class', 'frm_radio', $field, $field_val ) ); ?>" id="<?php echo esc_attr( FrmFieldsHelper::get_checkbox_id( $field, $opt_key, 'radio' ) ); ?>"><?php

if ( ! isset( $shortcode_atts ) || ! isset( $shortcode_atts['label'] ) || $shortcode_atts['label'] ) {
$checked = FrmAppHelper::check_selected( $field['value'], $field_val ) ? 'checked="checked" ' : ' ';
$should_echo_disabled_att = FrmFieldsHelper::should_disable_option( $opt_key, trim( $checked ) !== '', $field );

if ( $include_label ) {
$label_attributes = array(
'for' => $html_id . '-' . $opt_key,
);

if ( $read_only ) {
if ( $read_only || $should_echo_disabled_att ) {
$label_attributes['class'] = 'frm-label-disabled';
}
?>
Expand All @@ -54,13 +66,18 @@
?>
<input type="radio" name="<?php echo esc_attr( $field_name ); ?>" id="<?php echo esc_attr( $html_id . '-' . $opt_key ); ?>" value="<?php echo esc_attr( $field_val ); ?>"
<?php
echo $checked . ' '; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
do_action( 'frm_field_input_html', $field );
echo $checked; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped

if ( $should_echo_disabled_att ) {
echo 'disabled="disabled" ';
}
?>/><?php

if ( ! isset( $shortcode_atts ) || ! isset( $shortcode_atts['label'] ) || $shortcode_atts['label'] ) {
if ( $include_label ) {
echo ' ';
FrmAppHelper::kses_echo( $label, 'all' );
FrmFieldsHelper::after_option_input( $field, $opt_key );
echo '</label>';
}

Expand Down
Loading