PageSourceSearch

https://tides.gc.ca/core/misc/states.js?v=8.6.15

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