83 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			83 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @file
							 | 
						||
| 
								 | 
							
								 * System behaviors.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(function ($, Drupal, drupalSettings) {
							 | 
						||
| 
								 | 
							
								  // Cache IDs in an array for ease of use.
							 | 
						||
| 
								 | 
							
								  const ids = [];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * Attaches field copy behavior from input fields to other input fields.
							 | 
						||
| 
								 | 
							
								   *
							 | 
						||
| 
								 | 
							
								   * When a field is filled out, apply its value to other fields that will
							 | 
						||
| 
								 | 
							
								   * likely use the same value. In the installer this is used to populate the
							 | 
						||
| 
								 | 
							
								   * administrator email address with the same value as the site email address.
							 | 
						||
| 
								 | 
							
								   *
							 | 
						||
| 
								 | 
							
								   * @type {Drupal~behavior}
							 | 
						||
| 
								 | 
							
								   *
							 | 
						||
| 
								 | 
							
								   * @prop {Drupal~behaviorAttach} attach
							 | 
						||
| 
								 | 
							
								   *   Attaches the field copy behavior to an input field.
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  Drupal.behaviors.copyFieldValue = {
							 | 
						||
| 
								 | 
							
								    attach(context) {
							 | 
						||
| 
								 | 
							
								      // List of fields IDs on which to bind the event listener.
							 | 
						||
| 
								 | 
							
								      // Create an array of IDs to use with jQuery.
							 | 
						||
| 
								 | 
							
								      Object.keys(drupalSettings.copyFieldValue || {}).forEach((element) => {
							 | 
						||
| 
								 | 
							
								        ids.push(element);
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (ids.length) {
							 | 
						||
| 
								 | 
							
								        // Listen to value:copy events on all dependent fields.
							 | 
						||
| 
								 | 
							
								        // We have to use body and not document because of the way jQuery events
							 | 
						||
| 
								 | 
							
								        // bubble up the DOM tree.
							 | 
						||
| 
								 | 
							
								        $(once('copy-field-values', 'body')).on(
							 | 
						||
| 
								 | 
							
								          'value:copy',
							 | 
						||
| 
								 | 
							
								          this.valueTargetCopyHandler,
							 | 
						||
| 
								 | 
							
								        );
							 | 
						||
| 
								 | 
							
								        // Listen on all source elements.
							 | 
						||
| 
								 | 
							
								        $(once('copy-field-values', `#${ids.join(', #')}`)).on(
							 | 
						||
| 
								 | 
							
								          'blur',
							 | 
						||
| 
								 | 
							
								          this.valueSourceBlurHandler,
							 | 
						||
| 
								 | 
							
								        );
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    detach(context, settings, trigger) {
							 | 
						||
| 
								 | 
							
								      if (trigger === 'unload' && ids.length) {
							 | 
						||
| 
								 | 
							
								        $(once.remove('copy-field-values', 'body')).off('value:copy');
							 | 
						||
| 
								 | 
							
								        $(once.remove('copy-field-values', `#${ids.join(', #')}`)).off('blur');
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Event handler that fill the target element with the specified value.
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @param {jQuery.Event} e
							 | 
						||
| 
								 | 
							
								     *   Event object.
							 | 
						||
| 
								 | 
							
								     * @param {string} value
							 | 
						||
| 
								 | 
							
								     *   Custom value from jQuery trigger.
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    valueTargetCopyHandler(e, value) {
							 | 
						||
| 
								 | 
							
								      const { target } = e;
							 | 
						||
| 
								 | 
							
								      if (target.value === '') {
							 | 
						||
| 
								 | 
							
								        target.value = value;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Handler for a Blur event on a source field.
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * This event handler will trigger a 'value:copy' event on all dependent
							 | 
						||
| 
								 | 
							
								     * fields.
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @param {jQuery.Event} e
							 | 
						||
| 
								 | 
							
								     *   The event triggered.
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    valueSourceBlurHandler(e) {
							 | 
						||
| 
								 | 
							
								      const { value } = e.target;
							 | 
						||
| 
								 | 
							
								      const targetIds = drupalSettings.copyFieldValue[e.target.id];
							 | 
						||
| 
								 | 
							
								      $(`#${targetIds.join(', #')}`).trigger('value:copy', value);
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								})(jQuery, Drupal, drupalSettings);
							 |