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