wordpress-fieldmanager icon indicating copy to clipboard operation
wordpress-fieldmanager copied to clipboard

display_if incorrectly hide siblings when matching their `display-src` values

Open renatonascalves opened this issue 7 months ago • 0 comments

Description of the bug

When trying to trigger the show and/or hide fields, display_if matches the partial field name of a sibling field instead of performing an exact match.

If you happen to have a display_if logic that share a field name, fields with a partial match ends up getting hidden.

The source of the issue seems to be the use of .match here, since it is not an exact name match but a partial one (it matches a string based of the field name instead of matching the string with the field name):

https://github.com/alleyinteractive/wordpress-fieldmanager/blob/584979f3e59b2173fa71633a07c39c0050b11347/js/fieldmanager.js#L299

Steps To Reproduce

Here is an example you can use to replicate this issue:

function add_custom_meta_boxes() {
	$custom_meta_group = new Fieldmanager_Group(
		array(
			'name'           => 'custom_meta_group', // <--- display_if will match 'meta' in this field name too, even though it should not.
			'serialize_data' => false,
			'children'       => array(
				'meta'   => new Fieldmanager_Checkbox(					[
						'save_empty'    => false,
						'checked_value' => 'meta',
						'label'         => 'Checkbox',
					]
				),
				'text_field' => new Fieldmanager_Textfield(
					array(
						'label'      => 'Text Field',
						'display_if'  => [
							'src'   => 'meta',
							'value' => 'meta',
						],
					)
				),
				'textarea'   => new Fieldmanager_TextArea(
					array(
						'label' => 'Text Area',
						'display_if'  => [
							'src'   => 'meta',
							'value' => 'meta',
						],
						'attributes' => array(
							'rows' => 5,
							'cols' => 50,
						),
					)
				),
				'subject_prefix'        => new Fieldmanager_Select(
					[
						'name'          => 'subject_prefix',
						'label'         => 'Subject prefix',
						'options'       => [
							'none'   => 'None',
							'custom' => 'Custom',
						],
						'default_value' => 'none',
						'display_if'  => [
							'src'   => 'meta',
							'value' => 'meta',
						],
					]
				),
				'subject_prefix_custom' => new Fieldmanager_Textfield(
					[
						'label'       => 'Custom subject prefix',
						'display_if'  => [
							'src'   => 'subject_prefix',
							'value' => 'custom',
						],
					]
				),
			),
		)
	);

	$custom_meta_group->add_meta_box( 'Custom Meta', 'your-post-type', 'normal', 'high' );
}
add_action( 'admin_init', 'add_custom_meta_boxes' );

https://github.com/user-attachments/assets/329717ec-d39c-48ba-b747-9d2c0c394531

Additional Information

I'm working on the assumption that .match should match the field name provided in display-src, but it is possible there is feature that relies on a loose match.

So this change might require a bit more testing to avoid regressions.

renatonascalves avatar Jul 24 '24 02:07 renatonascalves