12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- /**
- * @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.
- $('body').once('copy-field-values').on('value:copy', this.valueTargetCopyHandler);
- // Listen on all source elements.
- $(`#${ids.join(', #')}`).once('copy-field-values').on('blur', this.valueSourceBlurHandler);
- }
- },
- detach(context, settings, trigger) {
- if (trigger === 'unload' && ids.length) {
- $('body').removeOnce('copy-field-values').off('value:copy');
- $(`#${ids.join(', #')}`).removeOnce('copy-field-values').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.target);
- if ($target.val() === '') {
- $target.val(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).val();
- const targetIds = drupalSettings.copyFieldValue[e.target.id];
- $(`#${targetIds.join(', #')}`).trigger('value:copy', value);
- },
- };
- }(jQuery, Drupal, drupalSettings));
|