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