Swap Values in Drop Down & Multiselect Fields

This snippet will add a swap button for any two Drop Down or Multiselect fields. When clicked the value(s) from each field will be swapped with the value(s) in the other. Both fields must be of the same type and have the same choices available. You may need to tweak the styling/position of the swap button depending on your theme.

Instructions

  1. Install this snippet with our free Custom JavaScript plugin. https://gravitywiz.com/gravity-forms-custom-javascript/

  2. Following the inline instructions to configure for your form.

Code

Filename: gw-swap-button.js

/**
 * Gravity Wiz // Gravity Forms // Swap Values in Drop Down & Multiselect Fields
 * https://gravitywiz.com/
 *
 * This snippet will add a swap button for any two Drop Down or Multiselect fields. When clicked the value(s)
 * from each field will be swapped with the value(s) in the other. Both fields must be of the same type and have
 * the same choices available. You may need to tweak the styling/position of the swap button depending on your theme.
 *
 * Instructions:
 *
 * 1. Install this snippet with our free Custom JavaScript plugin.
 *    https://gravitywiz.com/gravity-forms-custom-javascript/
 *
 * 2. Following the inline instructions to configure for your form.
 */
// Replace "4" and "5" with field IDs for any two Drop Down or Multiselect fields. Field types must match. DUplicate 
gwCreateSwapButton( GFFORMID, 4, 5 );

function gwCreateSwapButton( formId, fieldIdA, fieldIdB ) {

	const swapButton = document.createElement('button');
	swapButton.innerText = '⇄';
	swapButton.type = 'button';
	swapButton.style.position = 'absolute';
	swapButton.style.padding = '0';
	swapButton.style.background = 'transparent';
	swapButton.style.color = '#000';
	swapButton.style.boxShadow = 'none';
	swapButton.style.top = '0';
	swapButton.style.right = '-15px';
	swapButton.style.border = '0';

	// Insert the button between the two dropdowns
	const dropdownA = document.getElementById(`input_${formId}_${fieldIdA}`);
	const dropdownB = document.getElementById(`input_${formId}_${fieldIdB}`);

	dropdownA.parentNode.style.position = 'relative';
	dropdownA.parentNode.appendChild(swapButton);

	// Add event listener to handle the swap functionality
	swapButton.addEventListener('click', function() {
		
		let selectedA;
		let selectedB;
		
		if ( dropdownA.multiple ) {
			
			selectedA = Array.from(dropdownA.selectedOptions).map(option => option.value);
			selectedB = Array.from(dropdownB.selectedOptions).map(option => option.value);
			
			Array.from(dropdownA.options).forEach(option => {
			  option.selected = selectedB.includes(option.value);
			});
			
			Array.from(dropdownB.options).forEach(option => {
			  option.selected = selectedA.includes(option.value);
			});
			
		} else {
			
			selectedA = dropdownA.value;
			selectedB = dropdownB.value;
			
			dropdownA.value = selectedB;
			dropdownB.value = selectedA;
			
		}
			
		dropdownA.dispatchEvent(new Event('change'));
		dropdownB.dispatchEvent(new Event('change'));

	});
}

Leave a Reply

Your email address will not be published. Required fields are marked *

  • Trouble installing this snippet? See our troubleshooting tips.
  • Need to include code? Create a gist and link to it in your comment.
  • Reporting a bug? Provide a URL where this issue can be recreated.

By commenting, I understand that I may receive emails related to Gravity Wiz and can unsubscribe at any time.