PageSourceSearch

https://orasconhu.org/core/misc/states.js?v=9.2.8

js orasconhu.org collected 2026-10-02 14:41:18 UTC 10,392 bytes, 380 lines download raw bytes

1/**
2* DO NOT EDIT THIS FILE.
3* See the following change record for more information,
4* https://www.drupal.org/node/2815083
5* @preserve
6**/
7
8(function ($, Drupal) {
9  var states = {
10    postponed: []
11  };
12  Drupal.states = states;
13
14  function invert(a, invertState) {
15    return invertState && typeof a !== 'undefined' ? !a : a;
16  }
17
18  function _compare2(a, b) {
19    if (a === b) {
20      return typeof a === 'undefined' ? a : true;
21    }
22
23    return typeof a === 'undefined' || typeof b === 'undefined';
24  }
25
26  function ternary(a, b) {
27    if (typeof a === 'undefined') {
28      return b;
29    }
30
31    if (typeof b === 'undefined') {
32      return a;
33    }
34
35    return a && b;
36  }
37
38  Drupal.behaviors.states = {
39    attach: function attach(context, settings) {
40      var $states = $(context).find('[data-drupal-states]');
41      var il = $states.length;
42
43      var _loop = function _loop(i) {
44        var config = JSON.parse($states[i].getAttribute('data-drupal-states'));
45        Object.keys(config || {}).forEach(function (state) {
46          new states.Dependent({
47            element: $($states[i]),
48            state: states.State.sanitize(state),
49            constraints: config[state]
50          });
51        });
52      };
53
54      for (var i = 0; i < il; i++) {
55        _loop(i);
56      }
57
58      while (states.postponed.length) {
59        states.postponed.shift()();
60      }
61    }
62  };
63
64  states.Dependent = function (args) {
65    var _this = this;
66
67    $.extend(this, {
68      values: {},
69      oldValue: null
70    }, args);
71    this.dependees = this.getDependees();
72    Object.keys(this.dependees || {}).forEach(function (selector) {
73      _this.initializeDependee(selector, _this.dependees[selector]);
74    });
75  };
76
77  states.Dependent.comparisons = {
78    RegExp: function RegExp(reference, value) {
79      return reference.test(value);
80    },
81    Function: function Function(reference, value) {
82      return reference(value);
83    },
84    Number: function Number(reference, value) {
85      return typeof value === 'string' ? _compare2(reference.toString(), value) : _compare2(reference, value);
86    }
87  };
88  states.Dependent.prototype = {
89    initializeDependee: function initializeDependee(selector, dependeeStates) {
90      var _this2 = this;
91
92      this.values[selector] = {};
93      Object.keys(dependeeStates).forEach(function (i) {
94        var state = dependeeStates[i];
95
96        if ($.inArray(state, dependeeStates) === -1) {
97          return;
98        }
99
100        state = states.State.sanitize(state);
101        _this2.values[selector][state.name] = null;
102        $(selector).on("state:".concat(state), {
103          selector: selector,
104          state: state
105        }, function (e) {
106          _this2.update(e.data.selector, e.data.state, e.value);
107        });
108        new states.Trigger({
109          selector: selector,
110          state: state
111        });
112      });
113    },
114    compare: function compare(reference, selector, state) {
115      var value = this.values[selector][state.name];
116
117      if (reference.constructor.name in states.Dependent.comparisons) {
118        return states.Dependent.comparisons[reference.constructor.name](reference, value);
119      }
120
121      return _compare2(reference, value);
122    },
123    update: function update(selector, state, value) {
124      if (value !== this.values[selector][state.name]) {
125        this.values[selector][state.name] = value;
126        this.reevaluate();
127      }
128    },
129    reevaluate: function reevaluate() {
130      var value = this.verifyConstraints(this.constraints);
131
132      if (value !== this.oldValue) {
133        this.oldValue = value;
134        value = invert(value, this.state.invert);
135        this.element.trigger({
136          type: "state:".concat(this.state),
137          value: value,
138          trigger: true
139        });
140      }
141    },
142    verifyConstraints: function verifyConstraints(constraints, selector) {
143      var result;
144
145      if ($.isArray(constraints)) {
146        var hasXor = $.inArray('xor', constraints) === -1;
147        var len = constraints.length;
148
149        for (var i = 0; i < len; i++) {
150          if (constraints[i] !== 'xor') {
151            var constraint = this.checkConstraints(constraints[i], selector, i);
152
153            if (constraint && (hasXor || result)) {
154              return hasXor;
155            }
156
157            result = result || constraint;
158          }
159        }
160      } else if ($.isPlainObject(constraints)) {
161          for (var n in constraints) {
162            if (constraints.hasOwnProperty(n)) {
163              result = ternary(result, this.checkConstraints(constraints[n], selector, n));
164
165              if (result === false) {
166                return false;
167              }
168            }
169          }
170        }
171
172      return result;
173    },
174    checkConstraints: function checkConstraints(value, selector, state) {
175      if (typeof state !== 'string' || /[0-9]/.test(state[0])) {
176        state = null;
177      } else if (typeof selector === 'undefined') {
178        selector = state;
179        state = null;
180      }
181
182      if (state !== null) {
183        state = states.State.sanitize(state);
184        return invert(this.compare(value, selector, state), state.invert);
185      }
186
187      return this.verifyConstraints(value, selector);
188    },
189    getDependees: function getDependees() {
190      var cache = {};
191      var _compare = this.compare;
192
193      this.compare = function (reference, selector, state) {
194        (cache[selector] || (cache[selector] = [])).push(state.name);
195      };
196
197      this.verifyConstraints(this.constraints);
198      this.compare = _compare;
199      return cache;
200    }
201  };
202
203  states.Trigger = function (args) {
204    $.extend(this, args);
205
206    if (this.state in states.Trigger.states) {
207      this.element = $(this.selector);
208
209      if (!this.element.data("trigger:".concat(this.state))) {
210        this.initialize();
211      }
212    }
213  };
214
215  states.Trigger.prototype = {
216    initialize: function initialize() {
217      var _this3 = this;
218
219      var trigger = states.Trigger.states[this.state];
220
221      if (typeof trigger === 'function') {
222        trigger.call(window, this.element);
223      } else {
224        Object.keys(trigger || {}).forEach(function (event) {
225          _this3.defaultTrigger(event, trigger[event]);
226        });
227      }
228
229      this.element.data("trigger:".concat(this.state), true);
230    },
231    defaultTrigger: function defaultTrigger(event, valueFn) {
232      var oldValue = valueFn.call(this.element);
233      this.element.on(event, $.proxy(function (e) {
234        var value = valueFn.call(this.element, e);
235
236        if (oldValue !== value) {
237          this.element.trigger({
238            type: "state:".concat(this.state),
239            value: value,
240            oldValue: oldValue
241          });
242          oldValue = value;
243        }
244      }, this));
245      states.postponed.push($.proxy(function () {
246        this.element.trigger({
247          type: "state:".concat(this.state),
248          value: oldValue,
249          oldValue: null
250        });
251      }, this));
252    }
253  };
254  states.Trigger.states = {
255    empty: {
256      keyup: function keyup() {
257        return this.val() === '';
258      }
259    },
260    checked: {
261      change: function change() {
262        var checked = false;
263        this.each(function () {
264          checked = $(this).prop('checked');
265          return !checked;
266        });
267        return checked;
268      }
269    },
270    value: {
271      keyup: function keyup() {
272        if (this.length > 1) {
273          return this.filter(':checked').val() || false;
274        }
275
276        return this.val();
277      },
278      change: function change() {
279        if (this.length > 1) {
280          return this.filter(':checked').val() || false;
281        }
282
283        return this.val();
284      }
285    },
286    collapsed: {
287      collapsed: function collapsed(e) {
288        return typeof e !== 'undefined' && 'value' in e ? e.value : !this.is('[open]');
289      }
290    }
291  };
292
293  states.State = function (state) {
294    this.pristine = state;
295    this.name = state;
296    var process = true;
297
298    do {
299      while (this.name.charAt(0) === '!') {
300        this.name = this.name.substring(1);
301        this.invert = !this.invert;
302      }
303
304      if (this.name in states.State.aliases) {
305        this.name = states.State.aliases[this.name];
306      } else {
307        process = false;
308      }
309    } while (process);
310  };
311
312  states.State.sanitize = function (state) {
313    if (state instanceof states.State) {
314      return state;
315    }
316
317    return new states.State(state);
318  };
319
320  states.State.aliases = {
321    enabled: '!disabled',
322    invisible: '!visible',
323    invalid: '!valid',
324    untouched: '!touched',
325    optional: '!required',
326    filled: '!empty',
327    unchecked: '!checked',
328    irrelevant: '!relevant',
329    expanded: '!collapsed',
330    open: '!collapsed',
331    closed: 'collapsed',
332    readwrite: '!readonly'
333  };
334  states.State.prototype = {
335    invert: false,
336    toString: function toString() {
337      return this.name;
338    }
339  };
340  var $document = $(document);
341  $document.on('state:disabled', function (e) {
342    if (e.trigger) {
343      $(e.target).prop('disabled', e.value).closest('.js-form-item, .js-form-submit, .js-form-wrapper').toggleClass('form-disabled', e.value).find('select, input, textarea').prop('disabled', e.value);
344    }
345  });
346  $document.on('state:required', function (e) {
347    if (e.trigger) {
348      if (e.value) {
349        var label = "label".concat(e.target.id ? "[for=".concat(e.target.id, "]") : '');
350        var $label = $(e.target).attr({
351          required: 'required',
352          'aria-required': 'true'
353        }).closest('.js-form-item, .js-form-wrapper').find(label);
354
355        if (!$label.hasClass('js-form-required').length) {
356          $label.addClass('js-form-required form-required');
357        }
358      } else {
359        $(e.target).removeAttr('required aria-required').closest('.js-form-item, .js-form-wrapper').find('label.js-form-required').removeClass('js-form-required form-required');
360      }
361    }
362  });
363  $document.on('state:visible', function (e) {
364    if (e.trigger) {
365      $(e.target).closest('.js-form-item, .js-form-submit, .js-form-wrapper').toggle(e.value);
366    }
367  });
368  $document.on('state:checked', function (e) {
369    if (e.trigger) {
370      $(e.target).prop('checked', e.value);
371    }
372  });
373  $document.on('state:collapsed', function (e) {
374    if (e.trigger) {
375      if ($(e.target).is('[open]') === e.value) {
376        $(e.target).find('> summary').trigger('click');
377      }
378    }
379  });
380})(jQuery, Drupal);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.