--- /dev/null
+/**
+ * @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.
+ for (const sourceId in drupalSettings.copyFieldValue) {
+ if (drupalSettings.copyFieldValue.hasOwnProperty(sourceId)) {
+ ids.push(sourceId);
+ }
+ }
+ 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));