active_scaffold 3.7.2 → 3.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,1468 +1,1493 @@
1
- jQuery(document).ready(function($) {
2
- /* It should not be needed, latest chrome is caching by itself
3
- if (ActiveScaffold.config.conditional_get) jQuery.ajaxSettings.ifModified = true;
4
- jQuery(document).on('ajax:beforeSend', function(event, xhr, settings){
5
- xhr.cacheUrl = settings.url;
6
- });
7
- jQuery(document).on('ajax:success', function(event, data, status, xhr){
8
- var etag=xhr.getResponseHeader("etag");
9
- if (etag && xhr.status==304) {
10
- var key = etag + xhr.cacheUrl;
11
- xhr.responseText=jQuery(document).data(key);
12
- var conv = jQuery(document).data('type-'+key);
13
- if (conv) conv(xhr.responseText);
14
- }
15
- });
16
- jQuery(document).ajaxComplete(function(event, xhr, settings){
17
- var etag=xhr.getResponseHeader("etag");
18
- if (etag && settings.ifModified && xhr.responseText) {
19
- var key = etag + xhr.cacheUrl;
20
- jQuery(document).data(key, xhr.responseText);
21
- var contentType = xhr.getResponseHeader('Content-Type');
22
- for(s in settings.contents) {
23
- if (settings.contents[s].test(contentType)) {
24
- var conv = settings.converters['text '+s];
25
- if (typeof conv == 'function') jQuery(document).data('type-'+key, conv);
26
- break;
1
+ (function() {
2
+ var activeScaffoldInit = function($, undefined) {
3
+ jQuery(document).ready(function($) {
4
+ /* It should not be needed, latest chrome is caching by itself
5
+ if (ActiveScaffold.config.conditional_get) jQuery.ajaxSettings.ifModified = true;
6
+ jQuery(document).on('ajax:beforeSend', function(event, xhr, settings){
7
+ xhr.cacheUrl = settings.url;
8
+ });
9
+ jQuery(document).on('ajax:success', function(event, data, status, xhr){
10
+ var etag=xhr.getResponseHeader("etag");
11
+ if (etag && xhr.status==304) {
12
+ var key = etag + xhr.cacheUrl;
13
+ xhr.responseText=jQuery(document).data(key);
14
+ var conv = jQuery(document).data('type-'+key);
15
+ if (conv) conv(xhr.responseText);
27
16
  }
28
- }
17
+ });
18
+ jQuery(document).ajaxComplete(function(event, xhr, settings){
19
+ var etag=xhr.getResponseHeader("etag");
20
+ if (etag && settings.ifModified && xhr.responseText) {
21
+ var key = etag + xhr.cacheUrl;
22
+ jQuery(document).data(key, xhr.responseText);
23
+ var contentType = xhr.getResponseHeader('Content-Type');
24
+ for(var s in settings.contents) {
25
+ if (settings.contents[s].test(contentType)) {
26
+ var conv = settings.converters['text '+s];
27
+ if (typeof conv == 'function') jQuery(document).data('type-'+key, conv);
28
+ break;
29
+ }
30
+ }
31
+ }
32
+ });
33
+ */
34
+ if (/1\.[2-7]\..*/.test(jQuery().jquery)) {
35
+ var error = 'ActiveScaffold requires jquery 1.8.0 or greater, please use jquery-rails 2.1.x gem or greater';
36
+ if (typeof console != 'undefined') console.error(error);
37
+ else alert(error);
29
38
  }
30
- });
31
- */
32
- if (/1\.[2-7]\..*/.test(jQuery().jquery)) {
33
- var error = 'ActiveScaffold requires jquery 1.8.0 or greater, please use jquery-rails 2.1.x gem or greater';
34
- if (typeof console != 'undefined') console.error(error);
35
- else alert(error);
36
- }
37
39
 
38
- jQuery(document).on('focus', ':input', function() { ActiveScaffold.last_focus = this; });
39
- jQuery(document).on('blur', ':input', function(e) { ActiveScaffold.last_focus = e.relatedTarget; });
40
- jQuery(document).click(function(event) {
41
- jQuery('.action_group.dyn > ul').hide(); // only hide so action links loading still work
42
- });
43
- jQuery(document).on('ajax:beforeSend', 'form.as_form', function(event) {
44
- var as_form = jQuery(this).closest("form");
45
- if (as_form.data('loading') == true) {
46
- ActiveScaffold.disable_form(as_form);
47
- }
48
- return true;
49
- });
40
+ jQuery(document).on('focus', ':input', function() { ActiveScaffold.last_focus = this; });
41
+ jQuery(document).on('blur', ':input', function(e) { ActiveScaffold.last_focus = e.relatedTarget; });
42
+ jQuery(document).click(function(event) {
43
+ jQuery('.action_group.dyn > ul').hide(); // only hide so action links loading still work
44
+ });
45
+ jQuery(document).on('ajax:beforeSend', 'form.as_form', function(event) {
46
+ var as_form = jQuery(this).closest("form");
47
+ if (as_form.data('loading') == true) {
48
+ ActiveScaffold.disable_form(as_form);
49
+ }
50
+ return true;
51
+ });
50
52
 
51
- jQuery(document).on('ajax:complete', 'form.as_form', function(event) {
52
- var as_form = jQuery(this).closest("form");
53
- if (as_form.data('loading') == true) {
54
- ActiveScaffold.enable_form(as_form);
55
- }
56
- });
57
- jQuery(document).on('ajax:complete', 'form.live', function(event) {
58
- ActiveScaffold.focus_first_element_of_form(jQuery(this).closest("form"));
59
- });
60
- jQuery(document).on('keyup keypress', 'form.search.live input', function(e) {
61
- if (e.keyCode == 13) e.preventDefault();
62
- });
63
- jQuery(document).on('ajax:error', 'form.as_form', function(event, xhr, status, error) {
64
- if (event.detail && !xhr) {
65
- error = event.detail[0];
66
- status = event.detail[1];
67
- xhr = event.detail[2];
68
- }
69
- var as_div = jQuery(this).closest("div.active-scaffold");
70
- if (as_div.length) {
71
- ActiveScaffold.report_500_response(as_div, xhr);
72
- }
73
- });
74
- jQuery(document).on('submit', 'form.as_form:not([data-remote])', function(event) {
75
- var as_form = jQuery(this).closest("form"), form_id = as_form.attr('id'), iframe, interval, doc, cookie;
76
- if (as_form.data('loading') == true) {
77
- setTimeout(function() { ActiveScaffold.disable_form(form_id); }, 10);
78
- if (as_form.attr('target')) {
79
- cookie = 'as_dl_' + new Date().getTime();
80
- as_form.append($('<input>', {type: 'hidden', name: '_dl_cookie', value: cookie}));
81
- iframe = jQuery('iframe[name="' + jQuery(this).attr('target') + '"]')[0];
82
- interval = setInterval(function() {
83
- doc = iframe.contentDocument || (iframe.contentWindow && iframe.contentWindow.document);
84
- if (doc && doc.readyState !== 'loading' && (doc.location.href !== 'about:blank' || document.cookie.split(cookie+'=').length == 2)) {
85
- ActiveScaffold.enable_form(form_id);
86
- clearInterval(interval);
87
- doc.location.replace('about:blank');
88
- document.cookie = cookie + '=; path=/; expires=' + new Date().toUTCString();
89
- } else if (!doc) {
90
- clearInterval(interval);
91
- document.cookie = cookie + '=; path=/; expires=' + new Date().toUTCString();
53
+ jQuery(document).on('ajax:complete', 'form.as_form', function(event) {
54
+ var as_form = jQuery(this).closest("form");
55
+ if (as_form.data('loading') == true) {
56
+ ActiveScaffold.enable_form(as_form);
57
+ }
58
+ });
59
+ jQuery(document).on('ajax:complete', 'form.live', function(event) {
60
+ ActiveScaffold.focus_first_element_of_form(jQuery(this).closest("form"));
61
+ });
62
+ jQuery(document).on('keyup keypress', 'form.search.live input', function(e) {
63
+ if (e.keyCode == 13) e.preventDefault();
64
+ });
65
+ jQuery(document).on('ajax:error', 'form.as_form', function(event, xhr, status, error) {
66
+ if (event.detail && !xhr) {
67
+ error = event.detail[0];
68
+ status = event.detail[1];
69
+ xhr = event.detail[2];
70
+ }
71
+ var as_div = jQuery(this).closest("div.active-scaffold");
72
+ if (as_div.length) {
73
+ ActiveScaffold.report_500_response(as_div, xhr);
74
+ }
75
+ });
76
+ jQuery(document).on('submit', 'form.as_form:not([data-remote])', function(event) {
77
+ var as_form = jQuery(this).closest("form"), form_id = as_form.attr('id'), iframe, interval, doc, cookie;
78
+ if (as_form.data('loading') == true) {
79
+ setTimeout(function() { ActiveScaffold.disable_form(form_id); }, 10);
80
+ if (as_form.attr('target')) {
81
+ cookie = 'as_dl_' + new Date().getTime();
82
+ as_form.append($('<input>', {type: 'hidden', name: '_dl_cookie', value: cookie}));
83
+ iframe = jQuery('iframe[name="' + jQuery(this).attr('target') + '"]')[0];
84
+ interval = setInterval(function() {
85
+ doc = iframe.contentDocument || (iframe.contentWindow && iframe.contentWindow.document);
86
+ if (doc && doc.readyState !== 'loading' && (doc.location.href !== 'about:blank' || document.cookie.split(cookie+'=').length == 2)) {
87
+ ActiveScaffold.enable_form(form_id);
88
+ clearInterval(interval);
89
+ doc.location.replace('about:blank');
90
+ document.cookie = cookie + '=; path=/; expires=' + new Date().toUTCString();
91
+ } else if (!doc) {
92
+ clearInterval(interval);
93
+ document.cookie = cookie + '=; path=/; expires=' + new Date().toUTCString();
94
+ }
95
+ }, 1000);
92
96
  }
93
- }, 1000);
94
- }
95
- }
96
- return true;
97
- });
98
- jQuery(document).on('ajax:before', 'a.as_action', function(event) {
99
- var action_link = ActiveScaffold.ActionLink.get(jQuery(this));
100
- if (action_link) {
101
- if (action_link.is_disabled()) {
102
- return false;
103
- } else {
104
- if (action_link.loading_indicator) action_link.loading_indicator.css('visibility','visible');
105
- action_link.disable();
106
- }
107
- }
108
- return true;
109
- });
110
- jQuery(document).on('ajax:success', 'a.as_action', function(event, response) {
111
- if (event.detail && !response) response = event.detail[0];
112
- var action_link = ActiveScaffold.ActionLink.get(jQuery(this));
113
- if (action_link) {
114
- if (action_link.position) {
115
- action_link.insert(response);
116
- if (action_link.hide_target) action_link.target.hide();
117
- if (action_link.hide_content) action_link.content.hide();
118
- } else {
119
- if (action_link.tag.hasClass('toggle')) {
120
- action_link.tag.closest('.action_group,.actions').find('.toggle.active').removeClass('active');
121
- action_link.tag.addClass('active');
122
97
  }
123
- action_link.enable();
124
- }
125
- jQuery(this).trigger('as:action_success', action_link);
126
- if (action_link.loading_indicator) action_link.loading_indicator.css('visibility','hidden');
127
- }
128
- return true;
129
- });
130
- jQuery(document).on('ajax:error', 'a.as_action', function(event, xhr, status, error) {
131
- if (event.detail && !xhr) {
132
- error = event.detail[0];
133
- status = event.detail[1];
134
- xhr = event.detail[2];
135
- }
136
- var action_link = ActiveScaffold.ActionLink.get(jQuery(this));
137
- if (action_link) {
138
- ActiveScaffold.report_500_response(action_link.scaffold_id(), xhr);
139
- action_link.enable();
140
- }
141
- return true;
142
- });
143
- jQuery(document).on('ajax:before', 'a.as_cancel', function(event) {
144
- var as_cancel = jQuery(this);
145
- var action_link = ActiveScaffold.find_action_link(as_cancel);
146
-
147
- if (action_link) {
148
- var cancel_url = as_cancel.attr('href');
149
- var refresh_data = action_link.tag.data('cancel-refresh') || as_cancel.data('refresh');
150
- if (!refresh_data || !cancel_url) {
151
- action_link.close();
152
- return false;
153
- }
154
- }
155
- return true;
156
- });
157
- jQuery(document).on('ajax:success', 'a.as_cancel', function(event) {
158
- var link = jQuery(this), action_link = ActiveScaffold.find_action_link(link);
159
-
160
- if (action_link && action_link.position) {
161
- action_link.close();
162
- } else if (link.hasClass('reset')) {
163
- var form = link.closest('form');
164
- if (form.is('.search')) form.find(':input:visible:not([type=submit])').val('');
165
- else form.trigger('reset');
166
- }
167
- return true;
168
- });
169
- jQuery(document).on('ajax:error', 'a.as_cancel', function(event, xhr, status, error) {
170
- if (event.detail && !xhr) {
171
- error = event.detail[0];
172
- status = event.detail[1];
173
- xhr = event.detail[2];
174
- }
175
- var action_link = ActiveScaffold.find_action_link(jQuery(this));
176
- if (action_link) {
177
- ActiveScaffold.report_500_response(action_link.scaffold_id(), xhr);
178
- }
179
- return true;
180
- });
181
- jQuery(document).on('ajax:before', 'a.as_sort', function(event) {
182
- var as_sort = jQuery(this);
183
- as_sort.closest('th').addClass('loading');
184
- return true;
185
- });
186
- jQuery(document).on('ajax:error', 'a.as_sort', function(event, xhr, status, error) {
187
- if (event.detail && !xhr) {
188
- error = event.detail[0];
189
- status = event.detail[1];
190
- xhr = event.detail[2];
191
- }
192
- var as_scaffold = jQuery(this).closest('.active-scaffold');
193
- ActiveScaffold.report_500_response(as_scaffold, xhr);
194
- jQuery(this).closest('th').removeClass('loading');
195
- return true;
196
- });
197
- jQuery(document).on('mouseenter mouseleave', 'td.in_place_editor_field', function(event) {
198
- var td = jQuery(this), span = td.find('span.in_place_editor_field');
199
- if (event.type == 'mouseenter') {
200
- if (td.hasClass('empty') || typeof(span.data('editInPlace')) === 'undefined') td.find('span').addClass("hover");
201
- }
202
- if (event.type == 'mouseleave') {
203
- if (td.hasClass('empty') || typeof(span.data('editInPlace')) === 'undefined') td.find('span').removeClass("hover");
204
- }
205
- return true;
206
- });
207
- jQuery(document).on('click', 'td.in_place_editor_field, th.as_marked-column_heading', function(event) {
208
- var span = jQuery(this).find('span.in_place_editor_field');
209
- span.data('addEmptyOnCancel', jQuery(this).hasClass('empty'));
210
- jQuery(this).removeClass('empty');
211
- if (span.data('editInPlace')) span.trigger('click.editInPlace');
212
- else ActiveScaffold.in_place_editor_field_clicked(span);
213
- });
214
- jQuery(document).on('ajax:before', 'a.as_paginate',function(event) {
215
- var as_paginate = jQuery(this);
216
- as_paginate.prevAll('img.loading-indicator').css('visibility','visible');
217
- return true;
218
- });
219
- jQuery(document).on('ajax:error', 'a.as_paginate', function(event, xhr, status, error) {
220
- if (event.detail && !xhr) {
221
- error = event.detail[0];
222
- status = event.detail[1];
223
- xhr = event.detail[2];
224
- }
225
- var as_scaffold = jQuery(this).closest('.active-scaffold');
226
- ActiveScaffold.report_500_response(as_scaffold, xhr);
227
- return true;
228
- });
229
- jQuery(document).on('ajax:complete', 'a.as_paginate', function(event) {
230
- jQuery(this).prevAll('img.loading-indicator').css('visibility','hidden');
231
- return true;
232
- });
233
- jQuery(document).on('ajax:before', 'a.as_add_existing, a.as_replace_existing', function(event) {
234
- var prev = jQuery(this).prev();
235
- if (!prev.is(':input')) prev = prev.find(':input');
236
- var id = prev.val();
237
- if (id) {
238
- if (!jQuery(this).data('href')) jQuery(this).data('href', jQuery(this).attr('href'));
239
- jQuery(this).attr('href', jQuery(this).data('href').replace('--ID--', id));
240
- return true;
241
- } else return false;
242
- });
243
- jQuery(document).on('ajax:complete', '.action_group.dyn > ul a', function(event) {
244
- var action_link = ActiveScaffold.find_action_link(event.target);
245
- if (action_link && action_link.loading_indicator) action_link.loading_indicator.css('visibility','hidden');
246
- jQuery(event.target).closest('.action_group.dyn > ul').remove();
247
- });
248
-
249
- jQuery(document).on('change', 'input.update_form:not(.recordselect), textarea.update_form, select.update_form, .checkbox-list.update_form input:checkbox', function(event) {
250
- var element = jQuery(this);
251
- var form_element;
252
- var value, additional_params;
253
- if (element.is(".checkbox-list input:checkbox")) {
254
- form_element = element.closest('.checkbox-list')
255
- value = form_element.find(':checked').map(function(item){return $(this).val();}).toArray();
256
- additional_params = (element.is(':checked') ? '_added=' : '_removed=') + element.val();
257
- } else {
258
- value = element.is("input:checkbox:not(:checked)") ? null : element.val();
259
- form_element = element;
260
- }
261
- ActiveScaffold.update_column(form_element, form_element.data('update_url'), form_element.data('update_send_form'), element.attr('id'), value, additional_params);
262
- return true;
263
- });
264
- jQuery(document).on('click', 'a.refresh-link', function(event) {
265
- event.preventDefault();
266
- var element = jQuery(this);
267
- var form_element = element.prev();
268
- var value;
269
- if (form_element.is(".field_with_errors")) form_element = form_element.children().last();
270
- if (form_element.is(".checkbox-list")) {
271
- value = form_element.find(':checked').map(function(item){return $(this).val();}).toArray();
272
- form_element = form_element.parent().find("input:checkbox"); // parent is needed for draggable-list, checked list may be empty
273
- } else value = form_element.is("input:checkbox:not(:checked)") ? null : form_element.val();
274
- ActiveScaffold.update_column(form_element, element.attr('href'), element.data('update_send_form'), form_element.attr('id'), value);
275
- });
276
- jQuery(document).on('click', 'a.visibility-toggle', function(e) {
277
- var link = jQuery(this), toggable = jQuery('#' + link.data('toggable'));
278
- e.preventDefault();
279
- toggable.toggle();
280
- link.html((toggable.is(':hidden')) ? link.data('show') : link.data('hide'));
281
- return false;
282
- });
283
- jQuery(document).on('recordselect:change', 'input.recordselect.update_form', function(event, id, label) {
284
- var element = jQuery(this);
285
- ActiveScaffold.update_column(element, element.data('update_url'), element.data('update_send_form'), element.attr('id'), id);
286
- return true;
287
- });
288
-
289
- jQuery(document).on('change', 'select.as_search_range_option', function(event) {
290
- var element = jQuery(this);
291
- ActiveScaffold[element.val() == 'BETWEEN' ? 'show' : 'hide'](element.closest('dd').find('.as_search_range_between'));
292
- ActiveScaffold[(element.val() == 'null' || element.val() == 'not_null') ? 'hide' : 'show'](element.attr('id').replace(/_opt/, '_numeric'));
293
- return true;
294
- });
295
-
296
- jQuery(document).on('change', 'select.as_search_date_time_option', function(event) {
297
- var element = jQuery(this);
298
- ActiveScaffold[!(element.val() == 'PAST' || element.val() == 'FUTURE' || element.val() == 'RANGE') ? 'show' : 'hide'](element.attr('id').replace(/_opt/, '_numeric'));
299
- ActiveScaffold[(element.val() == 'PAST' || element.val() == 'FUTURE') ? 'show' : 'hide'](element.attr('id').replace(/_opt/, '_trend'));
300
- ActiveScaffold[(element.val() == 'RANGE') ? 'show' : 'hide'](element.attr('id').replace(/_opt/, '_range'));
301
- return true;
302
- });
303
-
304
- jQuery(document).on('change', 'select.as_update_date_operator', function(event) {
305
- ActiveScaffold[jQuery(this).val() == 'REPLACE' ? 'show' : 'hide'](jQuery(this).next());
306
- ActiveScaffold[jQuery(this).val() == 'REPLACE' ? 'hide' : 'show'](jQuery(this).next().next());
307
- return true;
308
- });
309
-
310
- jQuery(document).on('click', '.active-scaffold .sub-form a.destroy', function(event) {
311
- event.preventDefault();
312
- ActiveScaffold.delete_subform_record($(this).data('delete-id'));
313
- });
314
-
315
- jQuery(document).on("click", '.hover_click', function(event) {
316
- var element = jQuery(this);
317
- var ul_element = element.children('ul').first();
318
- if (ul_element.is(':visible')) {
319
- element.find('ul').hide();
320
- } else {
321
- ul_element.show();
322
- }
323
- return false;
324
- });
325
- jQuery(document).on('click', '.hover_click a.as_action', function(event) {
326
- var element = jQuery(this).closest('.hover_click');
327
- if (element.length) {
328
- element.find('ul').hide();
329
- }
330
- return true;
331
- });
332
-
333
- jQuery(document).on('click', '.message a.close', function(e) {
334
- ActiveScaffold.hide(jQuery(this).closest('.message'));
335
- e.preventDefault();
336
- });
337
-
338
- jQuery(document).on('click', 'form.as_form .no-color', function() {
339
- var color_field = jQuery(this).parent().next(':input');
340
- color_field.attr('type', jQuery(this).prop('checked') ? 'hidden' : 'color');
341
- if (jQuery(this).prop('checked')) color_field.val('');
342
- });
343
-
344
- jQuery(document).on('click', '.hide-new-subform, .show-new-subform', function(e) {
345
- var $this = jQuery(this), line = $this.closest('.form-element'),
346
- subform = line.find('#' + $this.data('subform-id')), radio = false, hide, select;
347
- if ($this.is('[type=radio]')) {
348
- radio = true;
349
- hide = $this.is('.hide-new-subform');
350
- } else {
351
- e.preventDefault();
352
- hide = subform.is(':visible');
353
- }
354
- if ($this.data('select-id')) {
355
- select = line.find('#' + $this.data('select-id'));
356
- if (select.hasClass('recordselect') || select.is('.no-options')) select = select.next(':hidden').andSelf();
357
- }
358
- if (hide) {
359
- subform.hide().find("input:enabled,select:enabled,textarea:enabled").prop('disabled', true);
360
- if (select) select.show().prop('disabled', false);
361
- if (radio) {
362
- $this.closest('.form-element').find('[name="' + $this.attr('name') + '"].show-new-subform').prop('disabled', false);
363
- } else $this.html($this.data('select-text'));
364
- } else {
365
- if (select) select.hide().prop('disabled', true);
366
- subform.show().find("input:disabled,select:disabled,textarea:disabled").prop('disabled', false);
367
- if (radio) $this.prop('disabled', true);
368
- else {
369
- $this.data('select-text', $this.html());
370
- $this.html($this.data('subform-text'));
371
- }
372
- }
373
- });
98
+ return true;
99
+ });
100
+ jQuery(document).on('ajax:before', 'a.as_action', function(event) {
101
+ var action_link = ActiveScaffold.ActionLink.get(jQuery(this));
102
+ if (action_link) {
103
+ if (action_link.is_disabled()) {
104
+ return false;
105
+ } else {
106
+ if (action_link.loading_indicator) action_link.loading_indicator.css('visibility','visible');
107
+ action_link.disable();
108
+ }
109
+ }
110
+ return true;
111
+ });
112
+ jQuery(document).on('ajax:success', 'a.as_action', function(event, response) {
113
+ if (event.detail && !response) response = event.detail[0];
114
+ var action_link = ActiveScaffold.ActionLink.get(jQuery(this));
115
+ if (action_link) {
116
+ if (action_link.position) {
117
+ action_link.insert(response);
118
+ if (action_link.hide_target) action_link.target.hide();
119
+ if (action_link.hide_content) action_link.content.hide();
120
+ } else {
121
+ if (action_link.tag.hasClass('toggle')) {
122
+ action_link.tag.closest('.action_group,.actions').find('.toggle.active').removeClass('active');
123
+ action_link.tag.addClass('active');
124
+ }
125
+ action_link.enable();
126
+ }
127
+ jQuery(this).trigger('as:action_success', action_link);
128
+ if (action_link.loading_indicator) action_link.loading_indicator.css('visibility','hidden');
129
+ }
130
+ return true;
131
+ });
132
+ jQuery(document).on('ajax:error', 'a.as_action', function(event, xhr, status, error) {
133
+ if (event.detail && !xhr) {
134
+ error = event.detail[0];
135
+ status = event.detail[1];
136
+ xhr = event.detail[2];
137
+ }
138
+ var action_link = ActiveScaffold.ActionLink.get(jQuery(this));
139
+ if (action_link) {
140
+ ActiveScaffold.report_500_response(action_link.scaffold_id(), xhr);
141
+ action_link.enable();
142
+ }
143
+ return true;
144
+ });
145
+ jQuery(document).on('ajax:before', 'a.as_cancel', function(event) {
146
+ var as_cancel = jQuery(this);
147
+ var action_link = ActiveScaffold.find_action_link(as_cancel);
148
+
149
+ if (action_link) {
150
+ var cancel_url = as_cancel.attr('href');
151
+ var refresh_data = action_link.tag.data('cancel-refresh') || as_cancel.data('refresh');
152
+ if (!refresh_data || !cancel_url) {
153
+ action_link.close();
154
+ return false;
155
+ }
156
+ }
157
+ return true;
158
+ });
159
+ jQuery(document).on('ajax:success', 'a.as_cancel', function(event) {
160
+ var link = jQuery(this), action_link = ActiveScaffold.find_action_link(link);
161
+
162
+ if (action_link && action_link.position) {
163
+ action_link.close();
164
+ } else if (link.hasClass('reset')) {
165
+ var form = link.closest('form');
166
+ if (form.is('.search')) form.find(':input:visible:not([type=submit])').val('');
167
+ else form.trigger('reset');
168
+ }
169
+ return true;
170
+ });
171
+ jQuery(document).on('ajax:error', 'a.as_cancel', function(event, xhr, status, error) {
172
+ if (event.detail && !xhr) {
173
+ error = event.detail[0];
174
+ status = event.detail[1];
175
+ xhr = event.detail[2];
176
+ }
177
+ var action_link = ActiveScaffold.find_action_link(jQuery(this));
178
+ if (action_link) {
179
+ ActiveScaffold.report_500_response(action_link.scaffold_id(), xhr);
180
+ }
181
+ return true;
182
+ });
183
+ jQuery(document).on('ajax:before', 'a.as_sort', function(event) {
184
+ var as_sort = jQuery(this);
185
+ as_sort.closest('th').addClass('loading');
186
+ return true;
187
+ });
188
+ jQuery(document).on('ajax:error', 'a.as_sort', function(event, xhr, status, error) {
189
+ if (event.detail && !xhr) {
190
+ error = event.detail[0];
191
+ status = event.detail[1];
192
+ xhr = event.detail[2];
193
+ }
194
+ var as_scaffold = jQuery(this).closest('.active-scaffold');
195
+ ActiveScaffold.report_500_response(as_scaffold, xhr);
196
+ jQuery(this).closest('th').removeClass('loading');
197
+ return true;
198
+ });
199
+ jQuery(document).on('mouseenter mouseleave', 'td.in_place_editor_field', function(event) {
200
+ var td = jQuery(this), span = td.find('span.in_place_editor_field');
201
+ if (event.type == 'mouseenter') {
202
+ if (td.hasClass('empty') || typeof(span.data('editInPlace')) === 'undefined') td.find('span').addClass("hover");
203
+ }
204
+ if (event.type == 'mouseleave') {
205
+ if (td.hasClass('empty') || typeof(span.data('editInPlace')) === 'undefined') td.find('span').removeClass("hover");
206
+ }
207
+ return true;
208
+ });
209
+ jQuery(document).on('click', 'td.in_place_editor_field, th.as_marked-column_heading', function(event) {
210
+ var span = jQuery(this).find('span.in_place_editor_field');
211
+ span.data('addEmptyOnCancel', jQuery(this).hasClass('empty'));
212
+ jQuery(this).removeClass('empty');
213
+ if (span.data('editInPlace')) span.trigger('click.editInPlace');
214
+ else ActiveScaffold.in_place_editor_field_clicked(span);
215
+ });
216
+ jQuery(document).on('ajax:before', 'a.as_paginate',function(event) {
217
+ var as_paginate = jQuery(this);
218
+ as_paginate.prevAll('img.loading-indicator').css('visibility','visible');
219
+ return true;
220
+ });
221
+ jQuery(document).on('ajax:error', 'a.as_paginate', function(event, xhr, status, error) {
222
+ if (event.detail && !xhr) {
223
+ error = event.detail[0];
224
+ status = event.detail[1];
225
+ xhr = event.detail[2];
226
+ }
227
+ var as_scaffold = jQuery(this).closest('.active-scaffold');
228
+ ActiveScaffold.report_500_response(as_scaffold, xhr);
229
+ return true;
230
+ });
231
+ jQuery(document).on('ajax:complete', 'a.as_paginate', function(event) {
232
+ jQuery(this).prevAll('img.loading-indicator').css('visibility','hidden');
233
+ return true;
234
+ });
235
+ jQuery(document).on('ajax:before', 'a.as_add_existing, a.as_replace_existing', function(event) {
236
+ var prev = jQuery(this).prev();
237
+ if (!prev.is(':input')) prev = prev.find(':input');
238
+ var id = prev.val();
239
+ if (id) {
240
+ if (!jQuery(this).data('href')) jQuery(this).data('href', jQuery(this).attr('href'));
241
+ jQuery(this).attr('href', jQuery(this).data('href').replace('--ID--', id));
242
+ return true;
243
+ } else return false;
244
+ });
245
+ jQuery(document).on('ajax:complete', '.action_group.dyn > ul a', function(event) {
246
+ var action_link = ActiveScaffold.find_action_link(event.target);
247
+ if (action_link && action_link.loading_indicator) action_link.loading_indicator.css('visibility','hidden');
248
+ jQuery(event.target).closest('.action_group.dyn > ul').remove();
249
+ });
374
250
 
375
- jQuery(document).on('input paste', 'form.search.live input[type=search]', $.debounce((ActiveScaffold.config.live_search_delay || 0.5) * 1000, function() {
376
- jQuery(this).parent().find('[type=submit]').click();
377
- }));
251
+ jQuery(document).on('change', 'input.update_form:not(.recordselect), textarea.update_form, select.update_form, .checkbox-list.update_form input:checkbox', function(event) {
252
+ var element = jQuery(this);
253
+ var form_element;
254
+ var value, additional_params;
255
+ if (element.is(".checkbox-list input:checkbox")) {
256
+ form_element = element.closest('.checkbox-list')
257
+ value = form_element.find(':checked').map(function(item){return $(this).val();}).toArray();
258
+ additional_params = (element.is(':checked') ? '_added=' : '_removed=') + element.val();
259
+ } else {
260
+ value = element.is("input:checkbox:not(:checked)") ? null : element.val();
261
+ form_element = element;
262
+ }
263
+ ActiveScaffold.update_column(form_element, form_element.data('update_url'), form_element.data('update_send_form'), element.attr('id'), value, additional_params);
264
+ return true;
265
+ });
266
+ jQuery(document).on('click', 'a.refresh-link', function(event) {
267
+ event.preventDefault();
268
+ var element = jQuery(this);
269
+ var form_element = element.prev();
270
+ var value;
271
+ if (form_element.is(".field_with_errors")) form_element = form_element.children().last();
272
+ if (form_element.is(".checkbox-list")) {
273
+ value = form_element.find(':checked').map(function(item){return $(this).val();}).toArray();
274
+ form_element = form_element.parent().find("input:checkbox"); // parent is needed for draggable-list, checked list may be empty
275
+ } else value = form_element.is("input:checkbox:not(:checked)") ? null : form_element.val();
276
+ ActiveScaffold.update_column(form_element, element.attr('href'), element.data('update_send_form'), form_element.attr('id'), value);
277
+ });
278
+ jQuery(document).on('click', 'a.visibility-toggle', function(e) {
279
+ var link = jQuery(this), toggable = jQuery('#' + link.data('toggable'));
280
+ e.preventDefault();
281
+ toggable.toggle();
282
+ link.html((toggable.is(':hidden')) ? link.data('show') : link.data('hide'));
283
+ return false;
284
+ });
285
+ jQuery(document).on('recordselect:change', 'input.recordselect.update_form', function(event, id, label) {
286
+ var element = jQuery(this);
287
+ ActiveScaffold.update_column(element, element.data('update_url'), element.data('update_send_form'), element.attr('id'), id);
288
+ return true;
289
+ });
378
290
 
379
- jQuery(document).on('turbolinks:before-visit turbo:before-visit', function() {
380
- if (history.state.active_scaffold) {
381
- history.replaceState({turbolinks: true, url: document.location.href}, '', document.location.href);
382
- }
383
- });
384
-
385
- jQuery(window).on('popstate', function(e) {
386
- var state = e.originalEvent.state;
387
- if (!state || !state.active_scaffold) return;
388
- jQuery.ajax({
389
- url: document.location.href,
390
- data: jQuery.extend({'_popstate': true}, state.active_scaffold),
391
- dataType: 'script',
392
- cache: true
393
- });
394
- jQuery('.active-scaffold:first th .as_sort:first').closest('th').addClass('loading');
395
- });
291
+ jQuery(document).on('change', 'select.as_search_range_option', function(event) {
292
+ var element = jQuery(this);
293
+ ActiveScaffold[element.val() == 'BETWEEN' ? 'show' : 'hide'](element.closest('dd').find('.as_search_range_between'));
294
+ ActiveScaffold[(element.val() == 'null' || element.val() == 'not_null') ? 'hide' : 'show'](element.attr('id').replace(/_opt/, '_numeric'));
295
+ return true;
296
+ });
396
297
 
397
- // call setup on document.ready if Turbolinks not enabled
398
- if ((typeof(Turbolinks) == 'undefined' || !Turbolinks.supported) && typeof(Turbo) == 'undefined') {
399
- ActiveScaffold.setup_history_state();
400
- ActiveScaffold.setup(document);
401
- }
402
- if (ActiveScaffold.config.warn_changes) ActiveScaffold.setup_warn_changes();
403
- jQuery(document).on('as:element_updated as:element_created', function(e, action_link) {
404
- ActiveScaffold.setup(e.target);
405
- });
406
- jQuery(document).on('as:element_removed', function(e, action_link) {
407
- setTimeout(ActiveScaffold.update_floating_form_footer); // delay so form is already removed
408
- });
409
- jQuery(document).on('as:action_success', 'a.as_action', function(e, action_link) {
410
- ActiveScaffold.setup(action_link.adapter);
411
- });
412
- jQuery(document).on('as:element_updated', '.active-scaffold', function(e) {
413
- if (e.target != this) return;
414
- var search = $(this).find('form.search');
415
- if (search.length) ActiveScaffold.focus_first_element_of_form(search);
416
- });
417
- });
418
-
419
- jQuery(document).on('turbolinks:load turbo:load', function($) {
420
- ActiveScaffold.setup(document);
421
- });
422
-
423
-
424
- /* Simple Inheritance
425
- http://ejohn.org/blog/simple-javascript-inheritance/
426
- */
427
- (function(){
428
- var initializing = false, fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;
429
-
430
- // The base Class implementation (does nothing)
431
- this.Class = function(){};
432
-
433
- // Create a new Class that inherits from this class
434
- Class.extend = function(prop) {
435
- var _super = this.prototype;
436
-
437
- // Instantiate a base class (but only create the instance,
438
- // don't run the init constructor)
439
- initializing = true;
440
- var prototype = new this();
441
- initializing = false;
442
-
443
- // Copy the properties over onto the new prototype
444
- for (var name in prop) {
445
- // Check if we're overwriting an existing function
446
- prototype[name] = typeof prop[name] == "function" &&
447
- typeof _super[name] == "function" && fnTest.test(prop[name]) ?
448
- (function(name, fn){
449
- return function() {
450
- var tmp = this._super;
451
-
452
- // Add a new ._super() method that is the same method
453
- // but on the super-class
454
- this._super = _super[name];
455
-
456
- // The method only need to be bound temporarily, so we
457
- // remove it when we're done executing
458
- var ret = fn.apply(this, arguments);
459
- this._super = tmp;
460
-
461
- return ret;
462
- };
463
- })(name, prop[name]) :
464
- prop[name];
465
- }
298
+ jQuery(document).on('change', 'select.as_search_date_time_option', function(event) {
299
+ var element = jQuery(this);
300
+ ActiveScaffold[!(element.val() == 'PAST' || element.val() == 'FUTURE' || element.val() == 'RANGE') ? 'show' : 'hide'](element.attr('id').replace(/_opt/, '_numeric'));
301
+ ActiveScaffold[(element.val() == 'PAST' || element.val() == 'FUTURE') ? 'show' : 'hide'](element.attr('id').replace(/_opt/, '_trend'));
302
+ ActiveScaffold[(element.val() == 'RANGE') ? 'show' : 'hide'](element.attr('id').replace(/_opt/, '_range'));
303
+ return true;
304
+ });
466
305
 
467
- // The dummy class constructor
468
- function Class() {
469
- // All construction is actually done in the init method
470
- if ( !initializing && this.init )
471
- this.init.apply(this, arguments);
472
- }
306
+ jQuery(document).on('change', 'select.as_update_date_operator', function(event) {
307
+ ActiveScaffold[jQuery(this).val() == 'REPLACE' ? 'show' : 'hide'](jQuery(this).next());
308
+ ActiveScaffold[jQuery(this).val() == 'REPLACE' ? 'hide' : 'show'](jQuery(this).next().next());
309
+ return true;
310
+ });
473
311
 
474
- // Populate our constructed prototype object
475
- Class.prototype = prototype;
312
+ jQuery(document).on('click', '.active-scaffold .sub-form a.destroy', function(event) {
313
+ event.preventDefault();
314
+ ActiveScaffold.delete_subform_record($(this).data('delete-id'));
315
+ });
476
316
 
477
- // Enforce the constructor to be what we expect
478
- Class.constructor = Class;
317
+ jQuery(document).on("click", '.hover_click', function(event) {
318
+ var element = jQuery(this);
319
+ var ul_element = element.children('ul').first();
320
+ if (ul_element.is(':visible')) {
321
+ element.find('ul').hide();
322
+ } else {
323
+ ul_element.show();
324
+ }
325
+ return false;
326
+ });
327
+ jQuery(document).on('click', '.hover_click a.as_action', function(event) {
328
+ var element = jQuery(this).closest('.hover_click');
329
+ if (element.length) {
330
+ element.find('ul').hide();
331
+ }
332
+ return true;
333
+ });
479
334
 
480
- // And make this class extendable
481
- Class.extend = arguments.callee;
335
+ jQuery(document).on('click', '.message a.close', function(e) {
336
+ ActiveScaffold.hide(jQuery(this).closest('.message'));
337
+ e.preventDefault();
338
+ });
482
339
 
483
- return Class;
484
- };
485
- })();
340
+ jQuery(document).on('click', 'form.as_form .no-color', function() {
341
+ var color_field = jQuery(this).parent().next(':input');
342
+ color_field.attr('type', jQuery(this).prop('checked') ? 'hidden' : 'color');
343
+ if (jQuery(this).prop('checked')) color_field.val('');
344
+ });
486
345
 
487
- /*
488
- * Simple utility methods
489
- */
490
-
491
- var ActiveScaffold = {
492
- last_focus: null,
493
- setup: function(container) {
494
- /* setup some elements on page/form load */
495
- ActiveScaffold.load_embedded(container);
496
- ActiveScaffold.enable_js_form_buttons(container);
497
- ActiveScaffold.auto_paginate(container);
498
- ActiveScaffold.draggable_lists('.draggable-lists', container);
499
- ActiveScaffold.sliders(container);
500
- ActiveScaffold.disable_optional_subforms(container);
501
- ActiveScaffold.update_floating_form_footer(); // check other forms too, state may change
502
- },
503
- setup_history_state: function() {
504
- if (!jQuery('.active-scaffold').length) return;
505
- var data = {}, current_search_item = jQuery('.active-scaffold .filtered-message[data-search]');
506
- if (current_search_item.length) {
507
- // store user settings enabled, update state with current page, search and sorting
508
- var sorted_columns = jQuery('th.sorted');
509
- data.page = jQuery('.active-scaffold-pagination .current').text();
510
- data.search = current_search_item.data('search');
511
- if (sorted_columns.length == 1) {
512
- data.sort = sorted_columns.attr('class').match(/(.+)-column/)[1];
513
- data.sort_direction = sorted_columns.hasClass('asc') ? 'asc' : 'desc';
514
- } else { // default search
515
- jQuery.extend(data, {sort: '', sort_direction: ''});
516
- }
517
- }
518
- ActiveScaffold.add_to_history(document.location.href, data, true);
519
- },
520
- auto_paginate: function(element) {
521
- var paginate_link = jQuery('.active-scaffold-pagination.auto-paginate a:first', element);
522
- if (paginate_link.length) {
523
- var pagination = paginate_link.closest('.auto-paginate');
524
- pagination.find('.as_paginate').hide();
525
- pagination.find('.loading-indicator').css({visibility: 'visible'});
526
- ActiveScaffold.auto_load_page(paginate_link.attr('href'), {auto_pagination: true});
527
- }
528
- },
529
- auto_load_page: function(href, params) {
530
- jQuery.get(href, params, null, 'script');
531
- },
532
- enable_js_form_buttons: function(element) {
533
- jQuery('.as-js-button', element).show();
534
- },
535
- disable_optional_subforms: function(element) {
536
- jQuery('.sub-form.optional', element).each(function () {
537
- var $this = jQuery(this), toggle = $this.find('>.visibility-toggle');
538
- if (toggle.length) {
539
- var hide = toggle.text() == toggle.data('show');
540
- $this.find('> [id] > .sub-form-record > .associated-record dl:first').each(function (i) {
541
- var parent = jQuery(this).parent(), div_id = toggle.data('toggable') + i;
542
- parent.children().wrapAll('<div id="' + div_id + '">');
543
- if (hide) parent.find('> div').hide();
544
- parent.prepend(toggle.clone().data('toggable', div_id));
545
- });
546
- toggle.remove();
547
- }
548
- if ($this.is(':visible')) {
549
- var line = $this.closest('.form-element'), toggle = line.find('.show-new-subform[data-subform-id="' + $this.attr('id') + '"]').first();
550
- if (toggle.is('[type=radio]')) toggle.prop('disabled', true);
551
- else if (toggle.data('select-id')) {
552
- select = line.find('#' + toggle.data('select-id'));
346
+ jQuery(document).on('click', '.hide-new-subform, .show-new-subform', function(e) {
347
+ var $this = jQuery(this), line = $this.closest('.form-element'),
348
+ subform = line.find('#' + $this.data('subform-id')), radio = false, hide, select;
349
+ if ($this.is('[type=radio]')) {
350
+ radio = true;
351
+ hide = $this.is('.hide-new-subform');
352
+ } else {
353
+ e.preventDefault();
354
+ hide = subform.is(':visible');
355
+ }
356
+ if ($this.data('select-id')) {
357
+ select = line.find('#' + $this.data('select-id'));
553
358
  if (select.hasClass('recordselect') || select.is('.no-options')) select = select.next(':hidden').andSelf();
554
- select.hide().prop('disabled', true);
555
359
  }
556
- } else $this.find("input:enabled,select:enabled,textarea:enabled").prop('disabled', true);
557
- });
558
- },
559
- sliders: function(element) {
560
- jQuery('.as-slider', element).each(function() {
561
- var opts = $(this).data('slider');
562
- jQuery(this).slider(opts);
563
- if (opts.disabled) jQuery(this).find('.ui-slider-handle').hide();
564
- });
565
- },
566
- load_embedded: function(element) {
567
- jQuery('.active-scaffold-component .load-embedded', element).each(function(index, item) {
568
- item = jQuery(item);
569
- var indicator = item.closest('.active-scaffold-component').find('.loading-indicator');
570
- indicator.css({visibility: 'visible'});
571
- item.closest('.active-scaffold-component').load(item.attr('href'), function(response, status, xhr) {
572
- if (status == 'error') {
573
- indicator.css({visibility: 'hidden'});
574
- indicator.after($('<p>').html(item.data('error-msg')).addClass("error-message message server-error"));
575
- } else jQuery(this).trigger('as:element_updated');
360
+ if (hide) {
361
+ subform.hide().find("input:enabled,select:enabled,textarea:enabled").prop('disabled', true);
362
+ if (select) select.show().prop('disabled', false);
363
+ if (radio) {
364
+ $this.closest('.form-element').find('[name="' + $this.attr('name') + '"].show-new-subform').prop('disabled', false);
365
+ } else $this.html($this.data('select-text'));
366
+ } else {
367
+ if (select) select.hide().prop('disabled', true);
368
+ subform.show().find("input:disabled,select:disabled,textarea:disabled").prop('disabled', false);
369
+ if (radio) $this.prop('disabled', true);
370
+ else {
371
+ $this.data('select-text', $this.html());
372
+ $this.html($this.data('subform-text'));
373
+ }
374
+ }
576
375
  });
577
- });
578
- },
579
- reload_embedded: function(element_or_selector) {
580
- var item = jQuery(element_or_selector);
581
- item.load(item.data('refresh'), function() {
582
- jQuery(this).trigger('as:element_updated');
583
- });
584
- },
585
-
586
- records_for: function(tbody_id) {
587
- if (typeof(tbody_id) == 'string') tbody_id = '#' + tbody_id;
588
- return jQuery(tbody_id).children('.record');
589
- },
590
- stripe: function(tbody_id) {
591
- var even = false;
592
- var rows = this.records_for(tbody_id);
593
-
594
- rows.each(function (index, row_node) {
595
- row = jQuery(row_node);
596
- if (row_node.tagName != 'SCRIPT'
597
- && !row.hasClass("create")
598
- && !row.hasClass("update")
599
- && !row.hasClass("inline-adapter")
600
- && !row.hasClass("active-scaffold-calculations")) {
601
-
602
- if (even) row.addClass("even-record");
603
- else row.removeClass("even-record");
604
-
605
- even = !even;
606
- }
607
- });
608
- },
609
- hide_empty_message: function(tbody) {
610
- if (this.records_for(tbody).length != 0) {
611
- jQuery(tbody).parent().find('tbody.messages p.empty-message').hide();
612
- }
613
- },
614
- reload_if_empty: function(tbody, url) {
615
- if (this.records_for(tbody).length == 0) {
616
- this.reload(url);
617
- }
618
- },
619
- reload: function(url) {
620
- jQuery.getScript(url);
621
- },
622
- removeSortClasses: function(scaffold) {
623
- if (typeof(scaffold) == 'string') scaffold = '#' + scaffold;
624
- scaffold = jQuery(scaffold)
625
- scaffold.find('td.sorted').each(function(index, element) {
626
- jQuery(element).removeClass("sorted");
627
- });
628
- scaffold.find('th.sorted').each(function(index, element) {
629
- element = jQuery(element);
630
- element.removeClass("sorted");
631
- element.removeClass("asc");
632
- element.removeClass("desc");
633
- });
634
- },
635
- add_to_history: function(url, data, replace) {
636
- if (!history || !history.pushState) return;
637
- data = {active_scaffold: data};
638
- if (replace) history.replaceState(data, null, url);
639
- else history.pushState(data, null, url);
640
- },
641
- decrement_record_count: function(scaffold) {
642
- // decrement the last record count, firsts record count are in nested lists
643
- if (typeof(scaffold) == 'string') scaffold = '#' + scaffold;
644
- scaffold = jQuery(scaffold);
645
- count = scaffold.find('span.active-scaffold-records').last();
646
- if (count) count.html(parseInt(count.html(), 10) - 1);
647
- },
648
- increment_record_count: function(scaffold) {
649
- // increment the last record count, firsts record count are in nested lists
650
- if (typeof(scaffold) == 'string') scaffold = '#' + scaffold;
651
- scaffold = jQuery(scaffold);
652
- count = scaffold.find('span.active-scaffold-records').last();
653
- if (count) count.html(parseInt(count.html(), 10) + 1);
654
- },
655
- update_row: function(row, html) {
656
- var even_row = false;
657
- var replaced = null;
658
- if (typeof(row) == 'string') row = '#' + row;
659
- row = jQuery(row);
660
- if (row.hasClass('even-record')) even_row = true;
661
-
662
- replaced = this.replace(row, html);
663
- if (replaced) {
664
- if (even_row === true) replaced.addClass('even-record');
665
- ActiveScaffold.highlight(replaced);
666
- }
667
- },
668
-
669
- replace: function(element, html) {
670
- if (typeof(element) == 'string') element = '#' + element;
671
- element = jQuery(element);
672
- var new_element = typeof(html) == 'string' ? jQuery.parseHTML(jQuery.trim(html), true) : html;
673
- new_element = jQuery(new_element);
674
- if (element.length) {
675
- element.replaceWith(new_element);
676
- new_element.trigger('as:element_updated');
677
- return new_element;
678
- } else return null;
679
- },
680
-
681
- replace_html: function(element, html) {
682
- if (typeof(element) == 'string') element = '#' + element;
683
- element = jQuery(element);
684
- if (element.length) {
685
- element.html(html);
686
- element.trigger('as:element_updated');
687
- }
688
- return element;
689
- },
690
-
691
- append: function(element, html) {
692
- if (typeof(element) == 'string') element = '#' + element;
693
- element = jQuery(element);
694
- element.append(html);
695
- element.trigger('as:element_updated');
696
- return element;
697
- },
698
-
699
- remove: function(element, callback) {
700
- if (typeof(element) == 'string') element = '#' + element;
701
- jQuery(element).trigger('as:element_removed').remove();
702
- if (callback) callback();
703
- },
704
-
705
- update_inplace_edit: function(element, value, empty) {
706
- if (typeof(element) == 'string') element = '#' + element;
707
- this.replace_html(jQuery(element), value);
708
- jQuery(element).closest('td')[empty ? 'addClass' : 'removeClass']('empty');
709
- },
710
-
711
- hide: function(element) {
712
- if (typeof(element) == 'string') element = '#' + element;
713
- jQuery(element).hide();
714
- },
715
-
716
- show: function(element) {
717
- if (typeof(element) == 'string') element = '#' + element;
718
- jQuery(element).show();
719
- },
720
-
721
- reset_form: function(element) {
722
- if (typeof(element) == 'string') element = '#' + element;
723
- jQuery(element).get(0).reset();
724
- },
725
-
726
- disable_form: function(as_form, skip_loading_indicator) {
727
- if (typeof(as_form) == 'string') as_form = '#' + as_form;
728
- as_form = jQuery(as_form);
729
- var loading_indicator = jQuery('#' + as_form.attr('id').replace(/-form$/, '-loading-indicator'));
730
- if (!skip_loading_indicator && loading_indicator) loading_indicator.css('visibility','visible');
731
- jQuery('input[type=submit]', as_form).attr('disabled', 'disabled');
732
- jQuery('.sub-form a.destroy', as_form).addClass('disabled');
733
- if (jQuery.fn.droppable) jQuery('.draggable-list', as_form).sortable('disable');
734
- // data-remote-disabled attr instead of set data because is used to in selector later
735
- jQuery("input:enabled,select:enabled,textarea:enabled", as_form).attr('disabled', 'disabled').attr('data-remove-disabled', true);
736
- },
737
-
738
- enable_form: function(as_form, skip_loading_indicator) {
739
- if (typeof(as_form) == 'string') as_form = '#' + as_form;
740
- as_form = jQuery(as_form)
741
- var loading_indicator = jQuery('#' + as_form.attr('id').replace(/-form$/, '-loading-indicator'));
742
- if (!skip_loading_indicator && loading_indicator) loading_indicator.css('visibility','hidden');
743
- jQuery('input[type=submit]', as_form).removeAttr('disabled');
744
- jQuery('.sub-form a.destroy.disabled', as_form).removeClass('disabled');
745
- if (jQuery.fn.droppable) jQuery('.draggable-list', as_form).sortable('enable');
746
- jQuery("input[data-remove-disabled],select[data-remove-disabled],textarea[data-remove-disabled]", as_form).removeAttr('disabled data-remove-disabled');
747
- },
748
-
749
- focus_first_element_of_form: function(form_element, form_selector) {
750
- if (typeof(form_element) == 'string') form_element = '#' + form_element;
751
- if (typeof(form_selector) == 'undefined') form_selector = jQuery(form_element).is('form') ? '' : 'form ';
752
- var input = jQuery(form_selector + ":input:visible:first", jQuery(form_element));
753
- if (input.is('.no-autofocus :input')) return;
754
- input.focus();
755
- try { if (input[0] && input[0].value) input[0].selectionStart = input[0].selectionEnd = input[0].value.length; } catch(e) {}
756
- },
757
-
758
- create_record_row: function(active_scaffold_id, html, options) {
759
- if (typeof(active_scaffold_id) == 'string') active_scaffold_id = '#' + active_scaffold_id;
760
- tbody = jQuery(active_scaffold_id).find('tbody.records').first();
761
- var new_row;
762
-
763
- if (options.insert_at == 'top') {
764
- tbody.prepend(html);
765
- new_row = tbody.children('tr.record:first-child');
766
- } else if (options.insert_at == 'bottom') {
767
- var rows = tbody.children('tr.record, tr.inline-adapter');
768
- if (rows.length > 0) {
769
- new_row = rows.last().after(html).next();
770
- } else {
771
- new_row = tbody.append(html).children().last();
772
- }
773
- } else if (typeof options.insert_at == 'object') {
774
- var insert_method, get_method, row, id;
775
- if (options.insert_at.after) {
776
- insert_method = 'after';
777
- get_method = 'next';
778
- } else {
779
- insert_method = 'before';
780
- get_method = 'prev';
781
- }
782
- if (id = options.insert_at[insert_method]) row = tbody.children('#' + id);
783
- if (row && row.length) {
784
- new_row = row[insert_method](html)[get_method]();
785
- }
786
- }
787
- this.stripe(tbody);
788
- this.hide_empty_message(tbody);
789
- this.increment_record_count(tbody.closest('div.active-scaffold'));
790
- this.highlight(new_row);
791
- new_row.trigger('as:element_created');
792
- },
793
-
794
- create_record_row_from_url: function(action_link, url, options) {
795
- jQuery.get(url, function(row) {
796
- ActiveScaffold.create_record_row(action_link.scaffold(), row, options);
797
- action_link.close();
798
- });
799
- },
800
376
 
801
- delete_record_row: function(row, page_reload_url) {
802
- if (typeof(row) == 'string') row = '#' + row;
803
- row = jQuery(row);
804
- var tbody = row.closest('tbody.records');
377
+ jQuery(document).on('input paste', 'form.search.live input[type=search]', $.debounce((ActiveScaffold.config.live_search_delay || 0.5) * 1000, function() {
378
+ jQuery(this).parent().find('[type=submit]').click();
379
+ }));
380
+
381
+ jQuery(document).on('click', 'form.search .reset[data-reset]', function(e){
382
+ e.preventDefault();
383
+ var form = jQuery(this).closest('form.search');
384
+ form.find(
385
+ 'input:not([type=button]):not([type=submit]):not([type=reset]):not([type=hidden]),' +
386
+ 'textarea, select:has(option[value=""])'
387
+ ).val('');
388
+ form.find('select.as_search_range_option').each(function() { $(this).val($(this).find('option:first').val()) });
389
+ form.find('select.as_search_date_time_option').val('BETWEEN');
390
+ });
805
391
 
806
- row.find('a.disabled').each(function() {;
807
- var action_link = ActiveScaffold.ActionLink.get(this);
808
- if (action_link) action_link.close();
809
- });
392
+ jQuery(document).on('turbolinks:before-visit turbo:before-visit', function() {
393
+ if (history.state.active_scaffold) {
394
+ history.replaceState({turbolinks: true, url: document.location.href}, '', document.location.href);
395
+ }
396
+ });
810
397
 
811
- ActiveScaffold.remove(row, function() {
812
- ActiveScaffold.stripe(tbody);
813
- ActiveScaffold.decrement_record_count(tbody.closest('div.active-scaffold'));
814
- if (page_reload_url) ActiveScaffold.reload_if_empty(tbody, page_reload_url);
815
- });
816
- },
817
-
818
- delete_subform_record: function(record) {
819
- if (typeof(record) == 'string') record = '#' + record;
820
- record = jQuery(record).closest('.sub-form-record');
821
- this.remove(record);
822
- },
823
-
824
- report_500_response: function(active_scaffold_id, xhr) {
825
- var server_error = jQuery(active_scaffold_id).find('.messages-container p.server-error').first();
826
- if (server_error.is(':visible')) {
827
- ActiveScaffold.highlight(server_error);
828
- } else {
829
- server_error.show();
830
- }
831
- if (xhr) server_error.find('.error-500')[xhr.status < 500 ? 'hide' : 'show']();
832
- ActiveScaffold.scroll_to(server_error, ActiveScaffold.config.scroll_on_close == 'checkInViewport');
833
- },
834
-
835
- find_action_link: function(element) {
836
- if (typeof(element) == 'string') element = '#' + element;
837
- element = jQuery(element);
838
- return ActiveScaffold.ActionLink.get(element.is('.actions a') ? element : element.closest('.as_adapter'));
839
- },
840
-
841
- display_dynamic_action_group: function(link, html) {
842
- var container;
843
- if (typeof(link) == 'string') link = jQuery('#' + link);
844
- if (link.closest('td.actions').length) {
845
- container = link.closest('td').addClass('action_group dyn');
846
- } else {
847
- if (link.parent('div.actions').length) link.wrap(jQuery('<div>'));
848
- container = link.parent().addClass('action_group dyn');
849
- }
850
- container.find('> ul').remove();
851
- container.append(html);
852
- },
853
-
854
- scroll_to: function(element, checkInViewport) {
855
- if (typeof checkInViewport == 'undefined') checkInViewport = true;
856
- if (typeof(element) == 'string') element = '#' + element;
857
- element = jQuery(element);
858
- if (!element.length) return;
859
- if (checkInViewport && element.visible()) return;
860
- jQuery(document).scrollTop(element.offset().top);
861
- },
862
-
863
- process_checkbox_inplace_edit: function(checkbox, options) {
864
- var checked = checkbox.is(':checked'), td = checkbox.closest('td');
865
- if (checked === true) options['params'] += '&value=1';
866
- jQuery.ajax({
867
- url: options.url,
868
- type: "POST",
869
- data: options['params'],
870
- dataType: options.ajax_data_type,
871
- beforeSend: function(request, settings) {
872
- if (options.beforeSend) options.beforeSend.call(checkbox, request, settings);
873
- checkbox.attr('disabled', 'disabled');
874
- td.closest('tr').find('td.actions .loading-indicator').css('visibility','visible');
875
- },
876
- complete: function(request){
877
- checkbox.removeAttr('disabled');
878
- },
879
- success: function(request){
880
- td.closest('tr').find('td.actions .loading-indicator').css('visibility','hidden');
398
+ jQuery(window).on('popstate', function(e) {
399
+ var state = e.originalEvent.state;
400
+ if (!state || !state.active_scaffold) return;
401
+ jQuery.ajax({
402
+ url: document.location.href,
403
+ data: jQuery.extend({'_popstate': true}, state.active_scaffold),
404
+ dataType: 'script',
405
+ cache: true
406
+ });
407
+ jQuery('.active-scaffold:first th .as_sort:first').closest('th').addClass('loading');
408
+ });
409
+
410
+ // call setup on document.ready if Turbolinks not enabled
411
+ if ((typeof(Turbolinks) == 'undefined' || !Turbolinks.supported) && typeof(Turbo) == 'undefined') {
412
+ ActiveScaffold.setup_history_state();
413
+ ActiveScaffold.setup(document);
881
414
  }
415
+ if (ActiveScaffold.config.warn_changes) ActiveScaffold.setup_warn_changes();
416
+ jQuery(document).on('as:element_updated as:element_created', function(e, action_link) {
417
+ ActiveScaffold.setup(e.target);
418
+ });
419
+ jQuery(document).on('as:element_removed', function(e, action_link) {
420
+ setTimeout(ActiveScaffold.update_floating_form_footer); // delay so form is already removed
421
+ });
422
+ jQuery(document).on('as:action_success', 'a.as_action', function(e, action_link) {
423
+ ActiveScaffold.setup(action_link.adapter);
424
+ });
425
+ jQuery(document).on('as:element_updated', '.active-scaffold', function(e) {
426
+ if (e.target != this) return;
427
+ var search = $(this).find('form.search');
428
+ if (search.length) ActiveScaffold.focus_first_element_of_form(search);
429
+ });
882
430
  });
883
- },
884
-
885
- read_inplace_edit_heading_attributes: function(column_heading, options) {
886
- if (column_heading.data('ie-cancel-text')) options.cancel_button = '<button class="inplace_cancel">' + column_heading.data('ie-cancel-text') + "</button>";
887
- if (column_heading.data('ie-loading-text')) options.loading_text = column_heading.data('ie-loading-text');
888
- if (column_heading.data('ie-saving-text')) options.saving_text = column_heading.data('ie-saving-text');
889
- if (column_heading.data('ie-save-text')) options.save_button = '<button class="inplace_save">' + column_heading.data('ie-save-text') + "</button>";
890
- if (column_heading.data('ie-rows')) options.textarea_rows = column_heading.data('ie-rows');
891
- if (column_heading.data('ie-cols')) options.textarea_cols = column_heading.data('ie-cols');
892
- if (column_heading.data('ie-size')) options.text_size = column_heading.data('ie-size');
893
- if (column_heading.data('ie-use-html')) options.use_html = column_heading.data('ie-use-html');
894
- },
895
-
896
- create_inplace_editor: function(span, options) {
897
- span.removeClass('hover');
898
- span.editInPlace(options);
899
- span.trigger('click.editInPlace');
900
- },
901
-
902
- highlight: function(element) {
903
- if (typeof(element) == 'string') element = jQuery('#' + element);
904
- if (typeof(element.effect) == 'function') {
905
- element.effect("highlight", jQuery.extend({}, ActiveScaffold.config.highlight), 3000);
906
- }
907
- },
908
-
909
- create_associated_record_form: function(element, content, options) {
910
- if (typeof(element) == 'string') element = '#' + element;
911
- var element = jQuery(element);
912
- content = jQuery(content);
913
- if (options.singular == false) {
914
- if (!(options.id && jQuery('#' + options.id).size() > 0)) {
915
- var tfoot = element.children('tfoot');
916
- if (tfoot.length) tfoot.before(content);
917
- else element.append(content);
918
- }
919
- } else {
920
- var current = jQuery('#' + element.attr('id') + ' .sub-form-record')
921
- if (current[0]) {
922
- this.replace(current[0], content);
923
- } else {
924
- element.prepend(content);
925
- }
926
- }
927
- content.trigger('as:element_created');
928
- ActiveScaffold.focus_first_element_of_form(content, '');
929
- },
930
-
931
- render_form_field: function(source, content, options) {
932
- if (typeof(source) == 'string') source = '#' + source;
933
- var source = jQuery(source);
934
- var element, container = source.closest('.sub-form-record'), selector = '';
935
- if (container.length == 0) {
936
- container = source.closest('form > ol.form');
937
- selector = 'li';
938
- }
939
- // find without entering new subforms
940
- element = container.find(selector + ':not(.sub-form) .' + options.field_class).first();
941
- if (element.length)
942
- element = element.closest('dl');
943
- else if (options.subform_class)
944
- element = container.find(selector + '.' + options.subform_class).first();
945
-
946
- if (element.length) {
947
- var parent = element.is('li, td') ? element : element.parent('li, td');
948
- if (element.is('li'))
949
- this.replace_html(element, content);
950
- else
951
- this.replace(element, content);
952
- if (parent.is('li')) {
953
- for (var attr in options.attrs)
954
- parent.attr(attr, options.attrs[attr]);
955
- }
956
- if (typeof(options.hidden) != 'undefined')
957
- parent[options.hidden ? 'addClass' : 'removeClass'].call(parent, 'hidden')
958
- }
959
- },
960
431
 
961
- record_select_onselect: function(edit_associated_url, active_scaffold_id, id){
962
- jQuery.ajax({
963
- url: edit_associated_url.replace('--ID--', id),
964
- error: function(xhr, textStatus, errorThrown){
965
- ActiveScaffold.report_500_response(active_scaffold_id, xhr)
966
- }
432
+ jQuery(document).on('turbolinks:load turbo:load', function($) {
433
+ ActiveScaffold.setup(document);
967
434
  });
968
- },
969
-
970
- // element is tbody id
971
- mark_records: function(element, options) {
972
- if (typeof(element) == 'string') element = '#' + element;
973
- var element = jQuery(element);
974
- if (options.include_checkboxes) {
975
- var mark_checkboxes = jQuery('#' + element.attr('id') + ' > tr.record td.as_marked-column input[type="checkbox"]');
976
- mark_checkboxes.prop('checked', !!options.checked);
977
- mark_checkboxes.val('' + !options.checked);
978
- }
979
- if(options.include_mark_all) {
980
- var mark_all_checkbox = element.prevAll('thead').find('th.as_marked-column_heading span input[type="checkbox"]');
981
- mark_all_checkbox.prop('checked', !!options.checked);
982
- mark_all_checkbox.val('' + !options.checked);
983
- }
984
- },
985
-
986
- in_place_editor_field_clicked: function(span) {
987
- // test editor is open
988
- if (typeof(span.data('editInPlace')) === 'undefined') {
989
- var options = {show_buttons: true,
990
- hover_class: 'hover',
991
- element_id: 'editor_id',
992
- ajax_data_type: "script",
993
- delegate: {
994
- willCloseEditInPlace: function(span, options) {
995
- if (span.data('addEmptyOnCancel')) span.closest('td').addClass('empty');
996
- span.closest('tr').find('td.actions .loading-indicator').css('visibility','visible');
997
- },
998
- didCloseEditInPlace: function(span, options) {
999
- span.closest('tr').find('td.actions .loading-indicator').css('visibility','hidden');
435
+
436
+
437
+ /* Simple JavaScript Inheritance for ES 5.1
438
+ * based on http://ejohn.org/blog/simple-javascript-inheritance/
439
+ * (inspired by base2 and Prototype)
440
+ * MIT Licensed.
441
+ */
442
+ (function(global) {
443
+ "use strict";
444
+ var fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;
445
+
446
+ // The base Class implementation (does nothing)
447
+ function BaseClass(){}
448
+
449
+ // Create a new Class that inherits from this class
450
+ BaseClass.extend = function(props) {
451
+ var _super = this.prototype;
452
+
453
+ // Set up the prototype to inherit from the base class
454
+ // (but without running the init constructor)
455
+ var proto = Object.create(_super);
456
+
457
+ // Copy the properties over onto the new prototype
458
+ for (var name in props) {
459
+ // Check if we're overwriting an existing function
460
+ proto[name] = typeof props[name] === "function" &&
461
+ typeof _super[name] == "function" && fnTest.test(props[name])
462
+ ? (function(name, fn){
463
+ return function() {
464
+ var tmp = this._super;
465
+
466
+ // Add a new ._super() method that is the same method
467
+ // but on the super-class
468
+ this._super = _super[name];
469
+
470
+ // The method only need to be bound temporarily, so we
471
+ // remove it when we're done executing
472
+ var ret = fn.apply(this, arguments);
473
+ this._super = tmp;
474
+
475
+ return ret;
476
+ };
477
+ })(name, props[name])
478
+ : props[name];
479
+ }
480
+
481
+ // The new constructor
482
+ var newClass = typeof proto.init === "function"
483
+ ? proto.hasOwnProperty("init")
484
+ ? proto.init // All construction is actually done in the init method
485
+ : function SubClass(){ _super.init.apply(this, arguments); }
486
+ : function EmptyClass(){};
487
+
488
+ // Populate our constructed prototype object
489
+ newClass.prototype = proto;
490
+
491
+ // Enforce the constructor to be what we expect
492
+ proto.constructor = newClass;
493
+
494
+ // And make this class extendable
495
+ newClass.extend = BaseClass.extend;
496
+
497
+ return newClass;
498
+ };
499
+
500
+ // export
501
+ global.Class = BaseClass;
502
+ })(window);
503
+
504
+ /*
505
+ * Simple utility methods
506
+ */
507
+
508
+ window.ActiveScaffold = {
509
+ last_focus: null,
510
+ setup: function(container) {
511
+ /* setup some elements on page/form load */
512
+ ActiveScaffold.load_embedded(container);
513
+ ActiveScaffold.enable_js_form_buttons(container);
514
+ ActiveScaffold.auto_paginate(container);
515
+ ActiveScaffold.draggable_lists('.draggable-lists', container);
516
+ ActiveScaffold.sliders(container);
517
+ ActiveScaffold.disable_optional_subforms(container);
518
+ ActiveScaffold.update_floating_form_footer(); // check other forms too, state may change
519
+ },
520
+ setup_history_state: function() {
521
+ if (!jQuery('.active-scaffold').length) return;
522
+ var data = {}, current_search_item = jQuery('.active-scaffold .filtered-message[data-search]');
523
+ if (current_search_item.length) {
524
+ // store user settings enabled, update state with current page, search and sorting
525
+ var sorted_columns = jQuery('th.sorted');
526
+ data.page = jQuery('.active-scaffold-pagination .current').text();
527
+ data.search = current_search_item.data('search');
528
+ if (sorted_columns.length == 1) {
529
+ data.sort = sorted_columns.attr('class').match(/(.+)-column/)[1];
530
+ data.sort_direction = sorted_columns.hasClass('asc') ? 'asc' : 'desc';
531
+ } else { // default search
532
+ jQuery.extend(data, {sort: '', sort_direction: ''});
533
+ }
534
+ }
535
+ ActiveScaffold.add_to_history(document.location.href, data, true);
536
+ },
537
+ auto_paginate: function(element) {
538
+ var paginate_link = jQuery('.active-scaffold-pagination.auto-paginate a:first', element);
539
+ if (paginate_link.length) {
540
+ var pagination = paginate_link.closest('.auto-paginate');
541
+ pagination.find('.as_paginate').hide();
542
+ pagination.find('.loading-indicator').css({visibility: 'visible'});
543
+ ActiveScaffold.auto_load_page(paginate_link.attr('href'), {auto_pagination: true});
544
+ }
545
+ },
546
+ auto_load_page: function(href, params) {
547
+ jQuery.get(href, params, null, 'script');
548
+ },
549
+ enable_js_form_buttons: function(element) {
550
+ jQuery('.as-js-button', element).show();
551
+ },
552
+ disable_optional_subforms: function(element) {
553
+ jQuery('.sub-form.optional', element).each(function () {
554
+ var $this = jQuery(this), toggle = $this.find('>.visibility-toggle');
555
+ if (toggle.length) {
556
+ var hide = toggle.text() == toggle.data('show');
557
+ $this.find('> [id] > .sub-form-record > .associated-record dl:first').each(function (i) {
558
+ var parent = jQuery(this).parent(), div_id = toggle.data('toggable') + i;
559
+ parent.children().wrapAll('<div id="' + div_id + '">');
560
+ if (hide) parent.find('> div').hide();
561
+ parent.prepend(toggle.clone().data('toggable', div_id));
562
+ });
563
+ toggle.remove();
564
+ }
565
+ if ($this.is(':visible')) {
566
+ var line = $this.closest('.form-element'), toggle = line.find('.show-new-subform[data-subform-id="' + $this.attr('id') + '"]').first();
567
+ if (toggle.is('[type=radio]')) toggle.prop('disabled', true);
568
+ else if (toggle.data('select-id')) {
569
+ var select = line.find('#' + toggle.data('select-id'));
570
+ if (select.hasClass('recordselect') || select.is('.no-options')) select = select.next(':hidden').andSelf();
571
+ select.hide().prop('disabled', true);
1000
572
  }
1001
- },
1002
- update_value: 'value'},
1003
- csrf_param = jQuery('meta[name=csrf-param]').first(),
1004
- csrf_token = jQuery('meta[name=csrf-token]').first(),
1005
- my_parent = span.parent(),
1006
- column_heading = null;
1007
-
1008
- if(!(my_parent.is('td') || my_parent.is('th'))){
1009
- my_parent = span.parents('td').eq(0);
1010
- }
573
+ } else $this.find("input:enabled,select:enabled,textarea:enabled").prop('disabled', true);
574
+ });
575
+ },
576
+ sliders: function(element) {
577
+ jQuery('.as-slider', element).each(function() {
578
+ var opts = $(this).data('slider');
579
+ jQuery(this).slider(opts);
580
+ if (opts.disabled) jQuery(this).find('.ui-slider-handle').hide();
581
+ });
582
+ },
583
+ load_embedded: function(element) {
584
+ jQuery('.active-scaffold-component .load-embedded', element).each(function(index, item) {
585
+ item = jQuery(item);
586
+ var indicator = item.closest('.active-scaffold-component').find('.loading-indicator');
587
+ indicator.css({visibility: 'visible'});
588
+ item.closest('.active-scaffold-component').load(item.attr('href'), function(response, status, xhr) {
589
+ if (status == 'error') {
590
+ indicator.css({visibility: 'hidden'});
591
+ indicator.after($('<p>').html(item.data('error-msg')).addClass("error-message message server-error"));
592
+ } else jQuery(this).trigger('as:element_updated');
593
+ });
594
+ });
595
+ },
596
+ reload_embedded: function(element_or_selector) {
597
+ var item = jQuery(element_or_selector);
598
+ item.load(item.data('refresh'), function() {
599
+ jQuery(this).trigger('as:element_updated');
600
+ });
601
+ },
1011
602
 
1012
- if (my_parent.is('td')) {
1013
- var column_no = my_parent.prevAll('td').length;
1014
- column_heading = my_parent.closest('table').find('th:eq(' + column_no + ')');
1015
- } else if (my_parent.is('th')) {
1016
- column_heading = my_parent;
1017
- }
603
+ records_for: function(tbody_id) {
604
+ if (typeof(tbody_id) == 'string') tbody_id = '#' + tbody_id;
605
+ return jQuery(tbody_id).children('.record');
606
+ },
607
+ stripe: function(tbody_id) {
608
+ var even = false;
609
+ var rows = this.records_for(tbody_id);
610
+
611
+ rows.each(function (index, row_node) {
612
+ var row = jQuery(row_node);
613
+ if (row_node.tagName != 'SCRIPT'
614
+ && !row.hasClass("create")
615
+ && !row.hasClass("update")
616
+ && !row.hasClass("inline-adapter")
617
+ && !row.hasClass("active-scaffold-calculations")) {
618
+
619
+ if (even) row.addClass("even-record");
620
+ else row.removeClass("even-record");
621
+
622
+ even = !even;
623
+ }
624
+ });
625
+ },
626
+ hide_empty_message: function(tbody) {
627
+ if (this.records_for(tbody).length != 0) {
628
+ jQuery(tbody).parent().find('tbody.messages p.empty-message').hide();
629
+ }
630
+ },
631
+ reload_if_empty: function(tbody, url) {
632
+ if (this.records_for(tbody).length == 0) {
633
+ this.reload(url);
634
+ }
635
+ },
636
+ reload: function(url) {
637
+ jQuery.getScript(url);
638
+ },
639
+ removeSortClasses: function(scaffold) {
640
+ if (typeof(scaffold) == 'string') scaffold = '#' + scaffold;
641
+ scaffold = jQuery(scaffold)
642
+ scaffold.find('td.sorted').each(function(index, element) {
643
+ jQuery(element).removeClass("sorted");
644
+ });
645
+ scaffold.find('th.sorted').each(function(index, element) {
646
+ element = jQuery(element);
647
+ element.removeClass("sorted");
648
+ element.removeClass("asc");
649
+ element.removeClass("desc");
650
+ });
651
+ },
652
+ add_to_history: function(url, data, replace) {
653
+ if (!history || !history.pushState) return;
654
+ data = {active_scaffold: data};
655
+ if (replace) history.replaceState(data, null, url);
656
+ else history.pushState(data, null, url);
657
+ },
658
+ decrement_record_count: function(scaffold) {
659
+ // decrement the last record count, firsts record count are in nested lists
660
+ if (typeof(scaffold) == 'string') scaffold = '#' + scaffold;
661
+ scaffold = jQuery(scaffold);
662
+ var count = scaffold.find('span.active-scaffold-records').last();
663
+ if (count) count.html(parseInt(count.html(), 10) - 1);
664
+ },
665
+ increment_record_count: function(scaffold) {
666
+ // increment the last record count, firsts record count are in nested lists
667
+ if (typeof(scaffold) == 'string') scaffold = '#' + scaffold;
668
+ scaffold = jQuery(scaffold);
669
+ var count = scaffold.find('span.active-scaffold-records').last();
670
+ if (count) count.html(parseInt(count.html(), 10) + 1);
671
+ },
672
+ update_row: function(row, html) {
673
+ var even_row = false;
674
+ var replaced = null;
675
+ if (typeof(row) == 'string') row = '#' + row;
676
+ row = jQuery(row);
677
+ if (row.hasClass('even-record')) even_row = true;
678
+
679
+ replaced = this.replace(row, html);
680
+ if (replaced) {
681
+ if (even_row === true) replaced.addClass('even-record');
682
+ ActiveScaffold.highlight(replaced);
683
+ }
684
+ },
1018
685
 
1019
- var render_url = column_heading.data('ie-render-url'),
1020
- mode = column_heading.data('ie-mode'),
1021
- record_id = span.data('ie-id') || '';
686
+ replace: function(element, html) {
687
+ if (typeof(element) == 'string') element = '#' + element;
688
+ element = jQuery(element);
689
+ var new_element = typeof(html) == 'string' ? jQuery.parseHTML(jQuery.trim(html), true) : html;
690
+ new_element = jQuery(new_element);
691
+ if (element.length) {
692
+ element.replaceWith(new_element);
693
+ new_element.trigger('as:element_updated');
694
+ return new_element;
695
+ } else return null;
696
+ },
1022
697
 
1023
- ActiveScaffold.read_inplace_edit_heading_attributes(column_heading, options);
698
+ replace_html: function(element, html) {
699
+ if (typeof(element) == 'string') element = '#' + element;
700
+ element = jQuery(element);
701
+ if (element.length) {
702
+ element.html(html);
703
+ element.trigger('as:element_updated');
704
+ }
705
+ return element;
706
+ },
1024
707
 
1025
- if (span.data('ie-url')) {
1026
- options.url = span.data('ie-url').replace(/__id__/, record_id);
1027
- } else {
1028
- options.url = column_heading.data('ie-url').replace(/__id__/, record_id);
1029
- }
708
+ append: function(element, html) {
709
+ if (typeof(element) == 'string') element = '#' + element;
710
+ element = jQuery(element);
711
+ element.append(html);
712
+ element.trigger('as:element_updated');
713
+ return element;
714
+ },
715
+
716
+ remove: function(element, callback) {
717
+ if (typeof(element) == 'string') element = '#' + element;
718
+ jQuery(element).trigger('as:element_removed').remove();
719
+ if (callback) callback();
720
+ },
721
+
722
+ update_inplace_edit: function(element, value, empty) {
723
+ if (typeof(element) == 'string') element = '#' + element;
724
+ this.replace_html(jQuery(element), value);
725
+ jQuery(element).closest('td')[empty ? 'addClass' : 'removeClass']('empty');
726
+ },
727
+
728
+ hide: function(element) {
729
+ if (typeof(element) == 'string') element = '#' + element;
730
+ jQuery(element).hide();
731
+ },
732
+
733
+ show: function(element) {
734
+ if (typeof(element) == 'string') element = '#' + element;
735
+ jQuery(element).show();
736
+ },
1030
737
 
1031
- if (csrf_param) options['params'] = csrf_param.attr('content') + '=' + csrf_token.attr('content');
738
+ reset_form: function(element) {
739
+ if (typeof(element) == 'string') element = '#' + element;
740
+ jQuery(element).get(0).reset();
741
+ },
742
+
743
+ disable_form: function(as_form, skip_loading_indicator) {
744
+ if (typeof(as_form) == 'string') as_form = '#' + as_form;
745
+ as_form = jQuery(as_form);
746
+ var loading_indicator = jQuery('#' + as_form.attr('id').replace(/-form$/, '-loading-indicator'));
747
+ if (!skip_loading_indicator && loading_indicator) loading_indicator.css('visibility','visible');
748
+ jQuery('input[type=submit]', as_form).attr('disabled', 'disabled');
749
+ jQuery('.sub-form a.destroy', as_form).addClass('disabled');
750
+ if (jQuery.fn.droppable) jQuery('.draggable-list', as_form).sortable('disable');
751
+ // data-remote-disabled attr instead of set data because is used to in selector later
752
+ jQuery("input:enabled,select:enabled,textarea:enabled", as_form).attr('disabled', 'disabled').attr('data-remove-disabled', true);
753
+ },
754
+
755
+ enable_form: function(as_form, skip_loading_indicator) {
756
+ if (typeof(as_form) == 'string') as_form = '#' + as_form;
757
+ as_form = jQuery(as_form)
758
+ var loading_indicator = jQuery('#' + as_form.attr('id').replace(/-form$/, '-loading-indicator'));
759
+ if (!skip_loading_indicator && loading_indicator) loading_indicator.css('visibility','hidden');
760
+ jQuery('input[type=submit]', as_form).removeAttr('disabled');
761
+ jQuery('.sub-form a.destroy.disabled', as_form).removeClass('disabled');
762
+ if (jQuery.fn.droppable) jQuery('.draggable-list', as_form).sortable('enable');
763
+ jQuery("input[data-remove-disabled],select[data-remove-disabled],textarea[data-remove-disabled]", as_form).removeAttr('disabled data-remove-disabled');
764
+ },
765
+
766
+ focus_first_element_of_form: function(form_element, form_selector) {
767
+ if (typeof(form_element) == 'string') form_element = '#' + form_element;
768
+ if (typeof(form_selector) == 'undefined') form_selector = jQuery(form_element).is('form') ? '' : 'form ';
769
+ var input = jQuery(form_selector + ":input:visible:first", jQuery(form_element));
770
+ if (input.is('.no-autofocus :input')) return;
771
+ input.focus();
772
+ try {
773
+ if (input[0] && input[0].value) input[0].selectionStart = input[0].selectionEnd = input[0].value.length;
774
+ } catch(e) {}
775
+ },
1032
776
 
1033
- if (span.closest('div.active-scaffold').data('eid')) {
1034
- if (options['params'].length > 0) {
1035
- options['params'] += "&";
777
+ create_record_row: function(active_scaffold_id, html, options) {
778
+ if (typeof(active_scaffold_id) == 'string') active_scaffold_id = '#' + active_scaffold_id;
779
+ var tbody = jQuery(active_scaffold_id).find('tbody.records').first(), new_row;
780
+
781
+ if (options.insert_at == 'top') {
782
+ tbody.prepend(html);
783
+ new_row = tbody.children('tr.record:first-child');
784
+ } else if (options.insert_at == 'bottom') {
785
+ var rows = tbody.children('tr.record, tr.inline-adapter');
786
+ if (rows.length > 0) {
787
+ new_row = rows.last().after(html).next();
788
+ } else {
789
+ new_row = tbody.append(html).children().last();
790
+ }
791
+ } else if (typeof options.insert_at == 'object') {
792
+ var insert_method, get_method, row, id;
793
+ if (options.insert_at.after) {
794
+ insert_method = 'after';
795
+ get_method = 'next';
796
+ } else {
797
+ insert_method = 'before';
798
+ get_method = 'prev';
799
+ }
800
+ if (id = options.insert_at[insert_method]) row = tbody.children('#' + id);
801
+ if (row && row.length) {
802
+ new_row = row[insert_method](html)[get_method]();
803
+ }
1036
804
  }
1037
- options['params'] += ("eid=" + span.closest('div.active-scaffold').data('eid'));
1038
- }
805
+ this.stripe(tbody);
806
+ this.hide_empty_message(tbody);
807
+ this.increment_record_count(tbody.closest('div.active-scaffold'));
808
+ this.highlight(new_row);
809
+ new_row.trigger('as:element_created');
810
+ },
1039
811
 
1040
- if (mode === 'clone') {
1041
- options.clone_id_suffix = record_id;
1042
- options.clone_selector = '#' + column_heading.attr('id') + ' .as_inplace_pattern';
1043
- options.field_type = 'clone';
1044
- }
812
+ create_record_row_from_url: function(action_link, url, options) {
813
+ jQuery.get(url, function(row) {
814
+ ActiveScaffold.create_record_row(action_link.scaffold(), row, options);
815
+ action_link.close();
816
+ });
817
+ },
1045
818
 
1046
- if (render_url) {
1047
- var plural = false;
1048
- if (column_heading.data('ie-plural')) plural = true;
1049
- options.field_type = 'remote';
1050
- options.editor_url = render_url.replace(/__id__/, record_id)
1051
- if (!options.delegate) options.delegate = {}
1052
- options.delegate.didOpenEditInPlace = function(dom) { dom.trigger('as:element_updated'); }
1053
- }
1054
- var actions, forms;
1055
- options.beforeSend = function(xhr, settings) {
1056
- switch (span.data('ie-update')) {
1057
- case 'update_row':
1058
- actions = span.closest('tr').find('.actions a:not(.disabled)').addClass('disabled');
1059
- break;
1060
- case 'update_table':
1061
- var table = span.closest('.as_content');
1062
- actions = table.find('.actions a:not(.disabled)').addClass('disabled');
1063
- forms = table.find('.as_form');
1064
- ActiveScaffold.disable_form(forms);
1065
- break;
819
+ delete_record_row: function(row, page_reload_url) {
820
+ if (typeof(row) == 'string') row = '#' + row;
821
+ row = jQuery(row);
822
+ var tbody = row.closest('tbody.records');
823
+
824
+ row.find('a.disabled').each(function() {;
825
+ var action_link = ActiveScaffold.ActionLink.get(this);
826
+ if (action_link) action_link.close();
827
+ });
828
+
829
+ ActiveScaffold.remove(row, function() {
830
+ ActiveScaffold.stripe(tbody);
831
+ ActiveScaffold.decrement_record_count(tbody.closest('div.active-scaffold'));
832
+ if (page_reload_url) ActiveScaffold.reload_if_empty(tbody, page_reload_url);
833
+ });
834
+ },
835
+
836
+ delete_subform_record: function(record) {
837
+ if (typeof(record) == 'string') record = '#' + record;
838
+ record = jQuery(record).closest('.sub-form-record');
839
+ this.remove(record);
840
+ },
841
+
842
+ report_500_response: function(active_scaffold_id, xhr) {
843
+ var server_error = jQuery(active_scaffold_id).find('.messages-container p.server-error').first();
844
+ if (server_error.is(':visible')) {
845
+ ActiveScaffold.highlight(server_error);
846
+ } else {
847
+ server_error.show();
1066
848
  }
1067
- }
1068
- options.error = options.success = function() {
1069
- if (actions) actions.removeClass('disabled');
1070
- if (forms) ActiveScaffold.enable_form(forms);
1071
- }
1072
- if (mode === 'inline_checkbox') {
1073
- ActiveScaffold.process_checkbox_inplace_edit(span.find('input:checkbox'), options);
1074
- } else {
1075
- ActiveScaffold.create_inplace_editor(span, options);
1076
- }
1077
- }
1078
- },
1079
-
1080
- update_column: function(element, url, send_form, source_id, val, additional_params) {
1081
- if (!element) element = jQuery('#' + source_id);
1082
- var as_form = element.closest('form.as_form');
1083
- var params = null;
1084
-
1085
- if (send_form) {
1086
- var selector, base = as_form;
1087
- if (send_form == 'row') base = element.closest('.association-record, form');
1088
- if (selector = element.data('update_send_form_selector'))
1089
- params = base.find(selector).serialize();
1090
- else if (base != as_form) params = base.find(':input').serialize();
1091
- else params = base.serialize();
1092
- params += '&_method=&' + jQuery.param({"source_id": source_id});
1093
- if (additional_params) params += '&' + additional_params;
1094
- } else {
1095
- params = {value: val};
1096
- params.source_id = source_id;
1097
- }
849
+ if (xhr) server_error.find('.error-500')[xhr.status < 500 ? 'hide' : 'show']();
850
+ ActiveScaffold.scroll_to(server_error, ActiveScaffold.config.scroll_on_close == 'checkInViewport');
851
+ },
1098
852
 
1099
- jQuery.ajax({
1100
- url: url,
1101
- data: params,
1102
- type: 'post',
1103
- dataType: 'script',
1104
- beforeSend: function(xhr, settings) {
1105
- element.nextAll('img.loading-indicator').css('visibility','visible');
1106
- /* force to blur and save previous last_focus, because disable_form will trigger
1107
- * blur on focused element and we will not be able to restore focus later
1108
- */
1109
- var last_focus = ActiveScaffold.last_focus;
1110
- if (last_focus) {
1111
- jQuery(last_focus).blur();
1112
- ActiveScaffold.last_focus = last_focus;
853
+ find_action_link: function(element) {
854
+ if (typeof(element) == 'string') element = '#' + element;
855
+ element = jQuery(element);
856
+ return ActiveScaffold.ActionLink.get(element.is('.actions a') ? element : element.closest('.as_adapter'));
857
+ },
858
+
859
+ display_dynamic_action_group: function(link, html) {
860
+ var container;
861
+ if (typeof(link) == 'string') link = jQuery('#' + link);
862
+ if (link.closest('td.actions').length) {
863
+ container = link.closest('td').addClass('action_group dyn');
864
+ } else {
865
+ if (link.parent('div.actions').length) link.wrap(jQuery('<div>'));
866
+ container = link.parent().addClass('action_group dyn');
1113
867
  }
1114
- //ActiveScaffold.disable_form(as_form); // not needed: called from on('ajax:beforeSend', 'form.as_form')
868
+ container.find('> ul').remove();
869
+ container.append(html);
870
+ },
871
+
872
+ scroll_to: function(element, checkInViewport) {
873
+ if (typeof checkInViewport == 'undefined') checkInViewport = true;
874
+ if (typeof(element) == 'string') element = '#' + element;
875
+ element = jQuery(element);
876
+ if (!element.length) return;
877
+ if (checkInViewport && element.visible()) return;
878
+ jQuery(document).scrollTop(element.offset().top);
879
+ },
1115
880
 
1116
- if (jQuery.rails.fire(element, 'ajax:beforeSend', [xhr, settings])) {
1117
- element.trigger('ajax:send', xhr);
881
+ process_checkbox_inplace_edit: function(checkbox, options) {
882
+ var checked = checkbox.is(':checked'), td = checkbox.closest('td');
883
+ if (checked === true) options['params'] += '&value=1';
884
+ jQuery.ajax({
885
+ url: options.url,
886
+ type: "POST",
887
+ data: options['params'],
888
+ dataType: options.ajax_data_type,
889
+ beforeSend: function(request, settings) {
890
+ if (options.beforeSend) options.beforeSend.call(checkbox, request, settings);
891
+ checkbox.attr('disabled', 'disabled');
892
+ td.closest('tr').find('td.actions .loading-indicator').css('visibility','visible');
893
+ },
894
+ complete: function(request){
895
+ checkbox.removeAttr('disabled');
896
+ },
897
+ success: function(request){
898
+ td.closest('tr').find('td.actions .loading-indicator').css('visibility','hidden');
899
+ }
900
+ });
901
+ },
902
+
903
+ read_inplace_edit_heading_attributes: function(column_heading, options) {
904
+ if (column_heading.data('ie-cancel-text')) options.cancel_button = '<button class="inplace_cancel">' + column_heading.data('ie-cancel-text') + "</button>";
905
+ if (column_heading.data('ie-loading-text')) options.loading_text = column_heading.data('ie-loading-text');
906
+ if (column_heading.data('ie-saving-text')) options.saving_text = column_heading.data('ie-saving-text');
907
+ if (column_heading.data('ie-save-text')) options.save_button = '<button class="inplace_save">' + column_heading.data('ie-save-text') + "</button>";
908
+ if (column_heading.data('ie-rows')) options.textarea_rows = column_heading.data('ie-rows');
909
+ if (column_heading.data('ie-cols')) options.textarea_cols = column_heading.data('ie-cols');
910
+ if (column_heading.data('ie-size')) options.text_size = column_heading.data('ie-size');
911
+ if (column_heading.data('ie-use-html')) options.use_html = column_heading.data('ie-use-html');
912
+ },
913
+
914
+ create_inplace_editor: function(span, options) {
915
+ span.removeClass('hover');
916
+ span.editInPlace(options);
917
+ span.trigger('click.editInPlace');
918
+ },
919
+
920
+ highlight: function(element) {
921
+ if (typeof(element) == 'string') element = jQuery('#' + element);
922
+ if (typeof(element.effect) == 'function') {
923
+ element.effect("highlight", jQuery.extend({}, ActiveScaffold.config.highlight), 3000);
924
+ }
925
+ },
926
+
927
+ create_associated_record_form: function(element, content, options) {
928
+ if (typeof(element) == 'string') element = '#' + element;
929
+ var element = jQuery(element);
930
+ content = jQuery(content);
931
+ if (options.singular == false) {
932
+ if (!(options.id && jQuery('#' + options.id).size() > 0)) {
933
+ var tfoot = element.children('tfoot');
934
+ if (tfoot.length) tfoot.before(content);
935
+ else element.append(content);
936
+ }
1118
937
  } else {
1119
- jQuery(ActiveScaffold.last_focus).focus();
1120
- return false;
938
+ var current = jQuery('#' + element.attr('id') + ' .sub-form-record')
939
+ if (current[0]) {
940
+ this.replace(current[0], content);
941
+ } else {
942
+ element.prepend(content);
943
+ }
1121
944
  }
945
+ content.trigger('as:element_created');
946
+ ActiveScaffold.focus_first_element_of_form(content, '');
1122
947
  },
1123
- success: function(data, status, xhr) {
1124
- as_form.find('#'+element.attr('id')).trigger('ajax:success', [data, status, xhr]);
1125
- },
1126
- complete: function(xhr, status) {
1127
- element = as_form.find('#'+element.attr('id'));
1128
- element.nextAll('img.loading-indicator').css('visibility','hidden');
1129
- var complete_element = element.length ? element : as_form;
1130
- complete_element.trigger('ajax:complete', [xhr, status]);
1131
- if (ActiveScaffold.last_focus) {
1132
- var item = jQuery(ActiveScaffold.last_focus);
1133
- if (item.closest('body').length == 0 && item.attr('id')) item = jQuery('#' + item.attr('id'));
1134
- if (status != 'error') item.focus().select();
948
+
949
+ render_form_field: function(source, content, options) {
950
+ if (typeof(source) == 'string') source = '#' + source;
951
+ var source = jQuery(source);
952
+ var element, container = source.closest('.sub-form-record'), selector = '';
953
+ if (container.length == 0) {
954
+ container = source.closest('form > ol.form');
955
+ selector = 'li';
956
+ }
957
+ // find without entering new subforms
958
+ element = container.find(selector + ':not(.sub-form) .' + options.field_class).first();
959
+ if (element.length)
960
+ element = element.closest('dl');
961
+ else if (options.subform_class)
962
+ element = container.find(selector + '.' + options.subform_class).first();
963
+
964
+ if (element.length) {
965
+ var parent = element.is('li, td') ? element : element.parent('li, td');
966
+ if (element.is('li'))
967
+ this.replace_html(element, content);
968
+ else
969
+ this.replace(element, content);
970
+ if (parent.is('li')) {
971
+ for (var attr in options.attrs)
972
+ parent.attr(attr, options.attrs[attr]);
973
+ }
974
+ if (typeof(options.hidden) != 'undefined')
975
+ parent[options.hidden ? 'addClass' : 'removeClass'].call(parent, 'hidden')
976
+ }
977
+ },
978
+
979
+ record_select_onselect: function(edit_associated_url, active_scaffold_id, id){
980
+ jQuery.ajax({
981
+ url: edit_associated_url.replace('--ID--', id),
982
+ error: function(xhr, textStatus, errorThrown){
983
+ ActiveScaffold.report_500_response(active_scaffold_id, xhr)
984
+ }
985
+ });
986
+ },
987
+
988
+ // element is tbody id
989
+ mark_records: function(element, options) {
990
+ if (typeof(element) == 'string') element = '#' + element;
991
+ var element = jQuery(element);
992
+ if (options.include_checkboxes) {
993
+ var mark_checkboxes = jQuery('#' + element.attr('id') + ' > tr.record td.as_marked-column input[type="checkbox"]');
994
+ mark_checkboxes.prop('checked', !!options.checked);
995
+ mark_checkboxes.val('' + !options.checked);
996
+ }
997
+ if(options.include_mark_all) {
998
+ var mark_all_checkbox = element.prevAll('thead').find('th.as_marked-column_heading span input[type="checkbox"]');
999
+ mark_all_checkbox.prop('checked', !!options.checked);
1000
+ mark_all_checkbox.val('' + !options.checked);
1001
+ }
1002
+ },
1003
+
1004
+ in_place_editor_field_clicked: function(span) {
1005
+ // test editor is open
1006
+ if (typeof(span.data('editInPlace')) === 'undefined') {
1007
+ var options = {show_buttons: true,
1008
+ hover_class: 'hover',
1009
+ element_id: 'editor_id',
1010
+ ajax_data_type: "script",
1011
+ delegate: {
1012
+ willCloseEditInPlace: function(span, options) {
1013
+ if (span.data('addEmptyOnCancel')) span.closest('td').addClass('empty');
1014
+ span.closest('tr').find('td.actions .loading-indicator').css('visibility','visible');
1015
+ },
1016
+ didCloseEditInPlace: function(span, options) {
1017
+ span.closest('tr').find('td.actions .loading-indicator').css('visibility','hidden');
1018
+ }
1019
+ },
1020
+ update_value: 'value'},
1021
+ csrf_param = jQuery('meta[name=csrf-param]').first(),
1022
+ csrf_token = jQuery('meta[name=csrf-token]').first(),
1023
+ my_parent = span.parent(),
1024
+ column_heading = null;
1025
+
1026
+ if(!(my_parent.is('td') || my_parent.is('th'))){
1027
+ my_parent = span.parents('td').eq(0);
1028
+ }
1029
+
1030
+ if (my_parent.is('td')) {
1031
+ var column_no = my_parent.prevAll('td').length;
1032
+ column_heading = my_parent.closest('table').find('th:eq(' + column_no + ')');
1033
+ } else if (my_parent.is('th')) {
1034
+ column_heading = my_parent;
1035
+ }
1036
+
1037
+ var render_url = column_heading.data('ie-render-url'),
1038
+ mode = column_heading.data('ie-mode'),
1039
+ record_id = span.data('ie-id') || '';
1040
+
1041
+ ActiveScaffold.read_inplace_edit_heading_attributes(column_heading, options);
1042
+
1043
+ if (span.data('ie-url')) {
1044
+ options.url = span.data('ie-url').replace(/__id__/, record_id);
1045
+ } else {
1046
+ options.url = column_heading.data('ie-url').replace(/__id__/, record_id);
1047
+ }
1048
+
1049
+ if (csrf_param) options['params'] = csrf_param.attr('content') + '=' + csrf_token.attr('content');
1050
+
1051
+ if (span.closest('div.active-scaffold').data('eid')) {
1052
+ if (options['params'].length > 0) {
1053
+ options['params'] += "&";
1054
+ }
1055
+ options['params'] += ("eid=" + span.closest('div.active-scaffold').data('eid'));
1056
+ }
1057
+
1058
+ if (mode === 'clone') {
1059
+ options.clone_id_suffix = record_id;
1060
+ options.clone_selector = '#' + column_heading.attr('id') + ' .as_inplace_pattern';
1061
+ options.field_type = 'clone';
1062
+ }
1063
+
1064
+ if (render_url) {
1065
+ var plural = false;
1066
+ if (column_heading.data('ie-plural')) plural = true;
1067
+ options.field_type = 'remote';
1068
+ options.editor_url = render_url.replace(/__id__/, record_id)
1069
+ if (!options.delegate) options.delegate = {}
1070
+ options.delegate.didOpenEditInPlace = function(dom) { dom.trigger('as:element_updated'); }
1071
+ }
1072
+ var actions, forms;
1073
+ options.beforeSend = function(xhr, settings) {
1074
+ switch (span.data('ie-update')) {
1075
+ case 'update_row':
1076
+ actions = span.closest('tr').find('.actions a:not(.disabled)').addClass('disabled');
1077
+ break;
1078
+ case 'update_table':
1079
+ var table = span.closest('.as_content');
1080
+ actions = table.find('.actions a:not(.disabled)').addClass('disabled');
1081
+ forms = table.find('.as_form');
1082
+ ActiveScaffold.disable_form(forms);
1083
+ break;
1084
+ }
1085
+ }
1086
+ options.error = options.success = function() {
1087
+ if (actions) actions.removeClass('disabled');
1088
+ if (forms) ActiveScaffold.enable_form(forms);
1089
+ }
1090
+ if (mode === 'inline_checkbox') {
1091
+ ActiveScaffold.process_checkbox_inplace_edit(span.find('input:checkbox'), options);
1092
+ } else {
1093
+ ActiveScaffold.create_inplace_editor(span, options);
1094
+ }
1135
1095
  }
1136
1096
  },
1137
- error: function (xhr, status, error) {
1138
- element = as_form.find('#'+element.attr('id'));
1139
- element.trigger('ajax:error', [xhr, status, error]);
1097
+
1098
+ update_column: function(element, url, send_form, source_id, val, additional_params) {
1099
+ if (!element) element = jQuery('#' + source_id);
1100
+ var as_form = element.closest('form.as_form');
1101
+ var params = null;
1102
+
1103
+ if (send_form) {
1104
+ var selector, base = as_form;
1105
+ if (send_form == 'row') base = element.closest('.association-record, form');
1106
+ if (selector = element.data('update_send_form_selector'))
1107
+ params = base.find(selector).serialize();
1108
+ else if (base != as_form) params = base.find(':input').serialize();
1109
+ else params = base.serialize();
1110
+ params += '&_method=&' + jQuery.param({"source_id": source_id});
1111
+ if (additional_params) params += '&' + additional_params;
1112
+ } else {
1113
+ params = {value: val};
1114
+ params.source_id = source_id;
1115
+ }
1116
+
1117
+ jQuery.ajax({
1118
+ url: url,
1119
+ data: params,
1120
+ type: 'post',
1121
+ dataType: 'script',
1122
+ beforeSend: function(xhr, settings) {
1123
+ element.nextAll('img.loading-indicator').css('visibility','visible');
1124
+ /* force to blur and save previous last_focus, because disable_form will trigger
1125
+ * blur on focused element and we will not be able to restore focus later
1126
+ */
1127
+ var last_focus = ActiveScaffold.last_focus;
1128
+ if (last_focus) {
1129
+ jQuery(last_focus).blur();
1130
+ ActiveScaffold.last_focus = last_focus;
1131
+ }
1132
+ //ActiveScaffold.disable_form(as_form); // not needed: called from on('ajax:beforeSend', 'form.as_form')
1133
+
1134
+ if (jQuery.rails.fire(element, 'ajax:beforeSend', [xhr, settings])) {
1135
+ element.trigger('ajax:send', xhr);
1136
+ } else {
1137
+ jQuery(ActiveScaffold.last_focus).focus();
1138
+ return false;
1139
+ }
1140
+ },
1141
+ success: function(data, status, xhr) {
1142
+ as_form.find('#'+element.attr('id')).trigger('ajax:success', [data, status, xhr]);
1143
+ },
1144
+ complete: function(xhr, status) {
1145
+ element = as_form.find('#'+element.attr('id'));
1146
+ element.nextAll('img.loading-indicator').css('visibility','hidden');
1147
+ var complete_element = element.length ? element : as_form;
1148
+ complete_element.trigger('ajax:complete', [xhr, status]);
1149
+ if (ActiveScaffold.last_focus) {
1150
+ var item = jQuery(ActiveScaffold.last_focus);
1151
+ if (item.closest('body').length == 0 && item.attr('id')) item = jQuery('#' + item.attr('id'));
1152
+ if (status != 'error') item.focus().select();
1153
+ }
1154
+ },
1155
+ error: function (xhr, status, error) {
1156
+ element = as_form.find('#'+element.attr('id'));
1157
+ element.trigger('ajax:error', [xhr, status, error]);
1158
+ }
1159
+ });
1160
+ },
1161
+
1162
+ draggable_lists: function(selector_or_elements, parent) {
1163
+ var elements;
1164
+ if (!jQuery.fn.draggableLists) return;
1165
+ if (typeof(selector_or_elements) == 'string') elements = jQuery(selector_or_elements, parent);
1166
+ else elements = jQuery(selector_or_elements);
1167
+ elements.draggableLists();
1168
+ },
1169
+
1170
+ setup_warn_changes: function() {
1171
+ var need_confirm = false;
1172
+ var unload_message = jQuery('meta[name=unload-message]').attr('content') || ActiveScaffold.config.unload_message || "This page contains unsaved data that will be lost if you leave this page.";
1173
+ jQuery(document).on('change input', '.active-scaffold form:not(.search) input, .active-scaffold form:not(.search) textarea, .active-scaffold form:not(.search) select', function() {
1174
+ jQuery(this).closest('form').addClass('need-confirm');
1175
+ });
1176
+ jQuery(document).on('click', '.active-scaffold .as_cancel:not([data-remote]), .active-scaffold input[type=submit]', function() {
1177
+ jQuery(this).closest('form').removeClass('need-confirm');
1178
+ });
1179
+ window.onbeforeunload = function() {
1180
+ if (jQuery('form.need-confirm').length) return unload_message;
1181
+ };
1182
+ jQuery(document).on('turbolinks:before-visit turbolinks:before-visit', function(e) {
1183
+ if (jQuery('form.need-confirm').length) {
1184
+ if (!window.confirm(unload_message)) e.preventDefault();
1185
+ }
1186
+ });
1187
+ },
1188
+
1189
+ update_floating_form_footer: function() {
1190
+ jQuery('.active-scaffold form.floating-footer .form-footer').each(function () {
1191
+ var $footer = jQuery(this), $form = $footer.closest('form.floating-footer');
1192
+ $footer.removeClass('floating');
1193
+ if ($form.visible(true) && !$footer.visible(true)) $footer.addClass('floating');
1194
+ });
1140
1195
  }
1141
- });
1142
- },
1143
-
1144
- draggable_lists: function(selector_or_elements, parent) {
1145
- var elements;
1146
- if (!jQuery.fn.draggableLists) return;
1147
- if (typeof(selector_or_elements) == 'string') elements = jQuery(selector_or_elements, parent);
1148
- else elements = jQuery(selector_or_elements);
1149
- elements.draggableLists();
1150
- },
1151
-
1152
- setup_warn_changes: function() {
1153
- var need_confirm = false;
1154
- var unload_message = jQuery('meta[name=unload-message]').attr('content') || ActiveScaffold.config.unload_message || "This page contains unsaved data that will be lost if you leave this page.";
1155
- jQuery(document).on('change input', '.active-scaffold form:not(.search) input, .active-scaffold form:not(.search) textarea, .active-scaffold form:not(.search) select', function() {
1156
- jQuery(this).closest('form').addClass('need-confirm');
1157
- });
1158
- jQuery(document).on('click', '.active-scaffold .as_cancel:not([data-remote]), .active-scaffold input[type=submit]', function() {
1159
- jQuery(this).closest('form').removeClass('need-confirm');
1160
- });
1161
- window.onbeforeunload = function() {
1162
- if (jQuery('form.need-confirm').length) return unload_message;
1196
+
1197
+ }
1198
+
1199
+
1200
+ jQuery(window).on('scroll resize', ActiveScaffold.update_floating_form_footer);
1201
+
1202
+ /*
1203
+ * URL modification support. Incomplete functionality.
1204
+ */
1205
+ String.prototype.append_params = function(params) {
1206
+ var url = this;
1207
+ if (url.indexOf('?') == -1) url += '?';
1208
+ else if (url.lastIndexOf('&') != url.length) url += '&';
1209
+
1210
+ for(var key in params) {
1211
+ if (key) url += (key + '=' + params[key] + '&');
1212
+ }
1213
+
1214
+ // the loop leaves a comma dangling at the end of string, chop it off
1215
+ url = url.substring(0, url.length-1);
1216
+ return url;
1163
1217
  };
1164
- jQuery(document).on('turbolinks:before-visit turbolinks:before-visit', function(e) {
1165
- if (jQuery('form.need-confirm').length) {
1166
- if (!window.confirm(unload_message)) e.preventDefault();
1218
+
1219
+
1220
+ /**
1221
+ * A set of links. As a set, they can be controlled such that only one is "open" at a time, etc.
1222
+ */
1223
+ ActiveScaffold.Actions = new Object();
1224
+ ActiveScaffold.Actions.Abstract = Class.extend({
1225
+ init: function(links, target, loading_indicator, options) {
1226
+ this.target = jQuery(target);
1227
+ this.loading_indicator = jQuery(loading_indicator);
1228
+ this.options = options;
1229
+ var _this = this;
1230
+ this.links = jQuery.map(links, function(link) {
1231
+ return _this.instantiate_link(link);
1232
+ });
1233
+ },
1234
+
1235
+ instantiate_link: function(link) {
1236
+ throw 'unimplemented'
1167
1237
  }
1168
1238
  });
1169
- },
1170
1239
 
1171
- update_floating_form_footer: function() {
1172
- jQuery('.active-scaffold form.floating-footer .form-footer').each(function () {
1173
- var $footer = jQuery(this), $form = $footer.closest('form.floating-footer');
1174
- $footer.removeClass('floating');
1175
- if ($form.visible(true) && !$footer.visible(true)) $footer.addClass('floating');
1176
- });
1177
- }
1240
+ /**
1241
+ * A DataStructures::ActionLink, represented in JavaScript.
1242
+ * Concerned with AJAX-enabling a link and adapting the result for insertion into the table.
1243
+ */
1244
+ ActiveScaffold.ActionLink = {
1245
+ get: function(element) {
1246
+ if (typeof(element) == 'string') element = '#' + element;
1247
+ element = jQuery(element);
1248
+ if (element.length > 0) {
1249
+ element.data(); // $ 1.4.2 workaround
1250
+ if (typeof(element.data('action_link')) === 'undefined' && !element.hasClass('as_adapter')) {
1251
+ var parent = element.closest('.actions');
1252
+ if (parent.length === 0 || parent.is('td')) {
1253
+ // maybe an column action_link
1254
+ parent = element.closest('tr.record');
1255
+ }
1256
+ if (parent.is('tr')) {
1257
+ // record action
1258
+ var target = parent.find('a.as_action');
1259
+ var loading_indicator = parent.find('td.actions .loading-indicator');
1260
+ if (!loading_indicator.length) loading_indicator = element.parent().find('.loading-indicator');
1261
+ new ActiveScaffold.Actions.Record(target, parent, loading_indicator);
1262
+ } else if (parent && parent.is('div')) {
1263
+ //table action
1264
+ new ActiveScaffold.Actions.Table(parent.find('a.as_action'), parent.closest('div.active-scaffold').find('tbody.before-header').first(), parent.find('.loading-indicator').first());
1265
+ }
1266
+ element = jQuery(element);
1267
+ }
1268
+ return element.data('action_link');
1269
+ } else {
1270
+ return null;
1271
+ }
1272
+ }
1273
+ };
1274
+ ActiveScaffold.ActionLink.Abstract = Class.extend({
1275
+ init: function(a, target, loading_indicator) {
1276
+ this.tag = jQuery(a);
1277
+ this.url = this.tag.attr('href');
1278
+ this.method = this.tag.data('method') || 'get';
1279
+ this.target = target;
1280
+ this.content = target.closest('.active-scaffold').find('.as_content:first');
1281
+ this.loading_indicator = loading_indicator;
1282
+ this.hide_target = false;
1283
+ this.position = this.tag.data('position');
1284
+ this.action = this.tag.data('action');
1285
+
1286
+ this.tag.data('action_link', this);
1287
+ return this;
1288
+ },
1289
+
1290
+ open: function(event) {
1291
+ this.tag.click();
1292
+ },
1293
+
1294
+ insert: function(content) {
1295
+ throw 'unimplemented'
1296
+ },
1178
1297
 
1179
- }
1298
+ close: function() {
1299
+ if (this.adapter) {
1300
+ var link = this;
1301
+ ActiveScaffold.remove(this.adapter, function() {
1302
+ link.enable();
1303
+ if (link.hide_target) link.target.show();
1304
+ if (link.hide_content) link.content.show();
1305
+ if (ActiveScaffold.config.scroll_on_close) ActiveScaffold.scroll_to(link.target.attr('id'), ActiveScaffold.config.scroll_on_close == 'checkInViewport');
1306
+ });
1307
+ }
1308
+ },
1180
1309
 
1310
+ reload: function() {
1311
+ this.close();
1312
+ this.open();
1313
+ },
1181
1314
 
1182
- jQuery(window).on('scroll resize', ActiveScaffold.update_floating_form_footer);
1315
+ get_new_adapter_id: function() {
1316
+ var id = 'adapter_';
1317
+ var i = 0;
1318
+ while (jQuery(id + i)) i++;
1319
+ return id + i;
1320
+ },
1183
1321
 
1184
- /*
1185
- * URL modification support. Incomplete functionality.
1186
- */
1187
- String.prototype.append_params = function(params) {
1188
- var url = this;
1189
- if (url.indexOf('?') == -1) url += '?';
1190
- else if (url.lastIndexOf('&') != url.length) url += '&';
1322
+ enable: function() {
1323
+ return this.tag.removeClass('disabled');
1324
+ },
1191
1325
 
1192
- for(var key in params) {
1193
- if (key) url += (key + '=' + params[key] + '&');
1194
- }
1326
+ disable: function() {
1327
+ return this.tag.addClass('disabled');
1328
+ },
1195
1329
 
1196
- // the loop leaves a comma dangling at the end of string, chop it off
1197
- url = url.substring(0, url.length-1);
1198
- return url;
1199
- };
1200
-
1201
-
1202
- /**
1203
- * A set of links. As a set, they can be controlled such that only one is "open" at a time, etc.
1204
- */
1205
- ActiveScaffold.Actions = new Object();
1206
- ActiveScaffold.Actions.Abstract = Class.extend({
1207
- init: function(links, target, loading_indicator, options) {
1208
- this.target = jQuery(target);
1209
- this.loading_indicator = jQuery(loading_indicator);
1210
- this.options = options;
1211
- var _this = this;
1212
- this.links = jQuery.map(links, function(link) {
1213
- var my_link = _this.instantiate_link(link);
1214
- return my_link;
1330
+ is_disabled: function() {
1331
+ return this.tag.hasClass('disabled');
1332
+ },
1333
+
1334
+ scaffold_id: function() {
1335
+ return '#' + this.tag.closest('div.active-scaffold').attr('id');
1336
+ },
1337
+
1338
+ scaffold: function() {
1339
+ return this.tag.closest('div.active-scaffold');
1340
+ },
1341
+
1342
+ update_flash_messages: function(messages) {
1343
+ var message_node = jQuery(this.scaffold_id().replace(/-active-scaffold/, '-messages'));
1344
+ if (message_node) message_node.html(messages);
1345
+ },
1346
+ set_adapter: function(element) {
1347
+ this.adapter = element;
1348
+ this.adapter.addClass('as_adapter');
1349
+ this.adapter.data('action_link', this);
1350
+ if (this.refresh_url) jQuery('.as_cancel', this.adapter).attr('href', this.refresh_url);
1351
+ },
1352
+ keep_open: function() {
1353
+ return this.tag.data('keep-open');
1354
+ }
1215
1355
  });
1216
- },
1217
1356
 
1218
- instantiate_link: function(link) {
1219
- throw 'unimplemented'
1220
- }
1221
- });
1222
-
1223
- /**
1224
- * A DataStructures::ActionLink, represented in JavaScript.
1225
- * Concerned with AJAX-enabling a link and adapting the result for insertion into the table.
1226
- */
1227
- ActiveScaffold.ActionLink = {
1228
- get: function(element) {
1229
- if (typeof(element) == 'string') element = '#' + element;
1230
- var element = jQuery(element);
1231
- if (element.length > 0) {
1232
- element.data(); // $ 1.4.2 workaround
1233
- if (typeof(element.data('action_link')) === 'undefined' && !element.hasClass('as_adapter')) {
1234
- var parent = element.closest('.actions');
1235
- if (parent.length === 0 || parent.is('td')) {
1236
- // maybe an column action_link
1237
- parent = element.closest('tr.record');
1357
+ /**
1358
+ * Concrete classes for record actions
1359
+ */
1360
+ ActiveScaffold.Actions.Record = ActiveScaffold.Actions.Abstract.extend({
1361
+ instantiate_link: function(link) {
1362
+ var l = new ActiveScaffold.ActionLink.Record(link, this.target, this.loading_indicator);
1363
+ var refresh = this.target.data('refresh');
1364
+ if (refresh) l.refresh_url = this.target.closest('.records').data('refresh-record').replace('--ID--', refresh);
1365
+
1366
+ if (l.position) {
1367
+ l.url = l.url.append_params({adapter: '_list_inline_adapter'});
1368
+ l.tag.attr('href', l.url);
1238
1369
  }
1239
- if (parent.is('tr')) {
1240
- // record action
1241
- var target = parent.find('a.as_action');
1242
- var loading_indicator = parent.find('td.actions .loading-indicator');
1243
- if (!loading_indicator.length) loading_indicator = element.parent().find('.loading-indicator');
1244
- new ActiveScaffold.Actions.Record(target, parent, loading_indicator);
1245
- } else if (parent && parent.is('div')) {
1246
- //table action
1247
- new ActiveScaffold.Actions.Table(parent.find('a.as_action'), parent.closest('div.active-scaffold').find('tbody.before-header').first(), parent.find('.loading-indicator').first());
1248
- }
1249
- element = jQuery(element);
1250
- }
1251
- return element.data('action_link');
1252
- } else {
1253
- return null;
1254
- }
1255
- }
1256
- };
1257
- ActiveScaffold.ActionLink.Abstract = Class.extend({
1258
- init: function(a, target, loading_indicator) {
1259
- this.tag = jQuery(a);
1260
- this.url = this.tag.attr('href');
1261
- this.method = this.tag.data('method') || 'get';
1262
- this.target = target;
1263
- this.content = target.closest('.active-scaffold').find('.as_content:first');
1264
- this.loading_indicator = loading_indicator;
1265
- this.hide_target = false;
1266
- this.position = this.tag.data('position');
1267
- this.action = this.tag.data('action');
1268
-
1269
- this.tag.data('action_link', this);
1270
- return this;
1271
- },
1272
-
1273
- open: function(event) {
1274
- this.tag.click();
1275
- },
1276
-
1277
- insert: function(content) {
1278
- throw 'unimplemented'
1279
- },
1280
-
1281
- close: function() {
1282
- if (this.adapter) {
1283
- var link = this;
1284
- ActiveScaffold.remove(this.adapter, function() {
1285
- link.enable();
1286
- if (link.hide_target) link.target.show();
1287
- if (link.hide_content) link.content.show();
1288
- if (ActiveScaffold.config.scroll_on_close) ActiveScaffold.scroll_to(link.target.attr('id'), ActiveScaffold.config.scroll_on_close == 'checkInViewport');
1289
- });
1290
- }
1291
- },
1292
-
1293
- reload: function() {
1294
- this.close();
1295
- this.open();
1296
- },
1297
-
1298
- get_new_adapter_id: function() {
1299
- var id = 'adapter_';
1300
- var i = 0;
1301
- while (jQuery(id + i)) i++;
1302
- return id + i;
1303
- },
1304
-
1305
- enable: function() {
1306
- return this.tag.removeClass('disabled');
1307
- },
1308
-
1309
- disable: function() {
1310
- return this.tag.addClass('disabled');
1311
- },
1312
-
1313
- is_disabled: function() {
1314
- return this.tag.hasClass('disabled');
1315
- },
1316
-
1317
- scaffold_id: function() {
1318
- return '#' + this.tag.closest('div.active-scaffold').attr('id');
1319
- },
1320
-
1321
- scaffold: function() {
1322
- return this.tag.closest('div.active-scaffold');
1323
- },
1324
-
1325
- update_flash_messages: function(messages) {
1326
- message_node = jQuery(this.scaffold_id().replace(/-active-scaffold/, '-messages'));
1327
- if (message_node) message_node.html(messages);
1328
- },
1329
- set_adapter: function(element) {
1330
- this.adapter = element;
1331
- this.adapter.addClass('as_adapter');
1332
- this.adapter.data('action_link', this);
1333
- if (this.refresh_url) jQuery('.as_cancel', this.adapter).attr('href', this.refresh_url);
1334
- },
1335
- keep_open: function() {
1336
- return this.tag.data('keep-open');
1337
- }
1338
- });
1339
-
1340
- /**
1341
- * Concrete classes for record actions
1342
- */
1343
- ActiveScaffold.Actions.Record = ActiveScaffold.Actions.Abstract.extend({
1344
- instantiate_link: function(link) {
1345
- var l = new ActiveScaffold.ActionLink.Record(link, this.target, this.loading_indicator);
1346
- var refresh = this.target.data('refresh');
1347
- if (refresh) l.refresh_url = this.target.closest('.records').data('refresh-record').replace('--ID--', refresh);
1348
-
1349
- if (l.position) {
1350
- l.url = l.url.append_params({adapter: '_list_inline_adapter'});
1351
- l.tag.attr('href', l.url);
1352
- }
1353
- l.set = this;
1354
- return l;
1355
- }
1356
- });
1357
-
1358
- ActiveScaffold.ActionLink.Record = ActiveScaffold.ActionLink.Abstract.extend({
1359
- close_previous_adapter: function() {
1360
- var _this = this;
1361
- jQuery.each(this.set.links, function(index, item) {
1362
- if (item.url != _this.url && item.is_disabled() && !item.keep_open() && item.adapter) {
1363
- ActiveScaffold.remove(item.adapter, function () { item.enable(); });
1370
+ l.set = this;
1371
+ return l;
1364
1372
  }
1365
1373
  });
1366
- },
1367
1374
 
1368
- insert: function(content) {
1369
- this.close_previous_adapter();
1375
+ ActiveScaffold.ActionLink.Record = ActiveScaffold.ActionLink.Abstract.extend({
1376
+ close_previous_adapter: function() {
1377
+ var _this = this;
1378
+ jQuery.each(this.set.links, function(index, item) {
1379
+ if (item.url != _this.url && item.is_disabled() && !item.keep_open() && item.adapter) {
1380
+ ActiveScaffold.remove(item.adapter, function () { item.enable(); });
1381
+ }
1382
+ });
1383
+ },
1370
1384
 
1371
- if (this.position == 'replace') {
1372
- this.position = 'after';
1373
- this.hide_target = true;
1374
- }
1385
+ insert: function(content) {
1386
+ this.close_previous_adapter();
1375
1387
 
1376
- var colspan = this.target.children().length;
1377
- if (content && this.position) {
1378
- content = jQuery(content);
1379
- content.find('.inline-adapter-cell:first').attr('colspan', colspan);
1380
- }
1381
- if (this.position == 'after') {
1382
- this.target.after(content);
1383
- this.set_adapter(this.target.next());
1384
- }
1385
- else if (this.position == 'before') {
1386
- this.target.before(content);
1387
- this.set_adapter(this.target.prev());
1388
- }
1389
- else {
1390
- return false;
1391
- }
1392
- ActiveScaffold.highlight(this.adapter.find('td'));
1393
- ActiveScaffold.focus_first_element_of_form(this.adapter);
1394
- },
1395
-
1396
- close: function(refreshed_content_or_reload) {
1397
- this._super();
1398
- if (refreshed_content_or_reload) {
1399
- if (typeof refreshed_content_or_reload == 'string') {
1400
- ActiveScaffold.update_row(this.target, refreshed_content_or_reload);
1401
- } else if (this.refresh_url) {
1402
- var target = this.target;
1403
- jQuery.get(this.refresh_url, function(e, status, xhr) {
1404
- ActiveScaffold.update_row(target, xhr.responseText);
1388
+ if (this.position == 'replace') {
1389
+ this.position = 'after';
1390
+ this.hide_target = true;
1391
+ }
1392
+
1393
+ var colspan = this.target.children().length;
1394
+ if (content && this.position) {
1395
+ content = jQuery(content);
1396
+ content.find('.inline-adapter-cell:first').attr('colspan', colspan);
1397
+ }
1398
+ if (this.position == 'after') {
1399
+ this.target.after(content);
1400
+ this.set_adapter(this.target.next());
1401
+ }
1402
+ else if (this.position == 'before') {
1403
+ this.target.before(content);
1404
+ this.set_adapter(this.target.prev());
1405
+ }
1406
+ else {
1407
+ return false;
1408
+ }
1409
+ ActiveScaffold.highlight(this.adapter.find('td'));
1410
+ ActiveScaffold.focus_first_element_of_form(this.adapter);
1411
+ },
1412
+
1413
+ close: function(refreshed_content_or_reload) {
1414
+ this._super();
1415
+ if (refreshed_content_or_reload) {
1416
+ if (typeof refreshed_content_or_reload == 'string') {
1417
+ ActiveScaffold.update_row(this.target, refreshed_content_or_reload);
1418
+ } else if (this.refresh_url) {
1419
+ var target = this.target;
1420
+ jQuery.get(this.refresh_url, function(e, status, xhr) {
1421
+ ActiveScaffold.update_row(target, xhr.responseText);
1422
+ });
1423
+ }
1424
+ }
1425
+ },
1426
+
1427
+ enable: function() {
1428
+ var _this = this;
1429
+ jQuery.each(this.set.links, function(index, item) {
1430
+ if (item.url != _this.url) return;
1431
+ item.tag.removeClass('disabled');
1405
1432
  });
1406
- }
1407
- }
1408
- },
1433
+ },
1434
+
1435
+ disable: function() {
1436
+ var _this = this;
1437
+ jQuery.each(this.set.links, function(index, item) {
1438
+ if (item.url != _this.url) return;
1439
+ item.tag.addClass('disabled');
1440
+ });
1441
+ },
1409
1442
 
1410
- enable: function() {
1411
- var _this = this;
1412
- jQuery.each(this.set.links, function(index, item) {
1413
- if (item.url != _this.url) return;
1414
- item.tag.removeClass('disabled');
1443
+ set_opened: function() {
1444
+ if (this.position == 'after') {
1445
+ this.set_adapter(this.target.next());
1446
+ }
1447
+ else if (this.position == 'before') {
1448
+ this.set_adapter(this.target.prev());
1449
+ }
1450
+ this.disable();
1451
+ }
1415
1452
  });
1416
- },
1417
1453
 
1418
- disable: function() {
1419
- var _this = this;
1420
- jQuery.each(this.set.links, function(index, item) {
1421
- if (item.url != _this.url) return;
1422
- item.tag.addClass('disabled');
1454
+ /**
1455
+ * Concrete classes for table actions
1456
+ */
1457
+ ActiveScaffold.Actions.Table = ActiveScaffold.Actions.Abstract.extend({
1458
+ instantiate_link: function(link) {
1459
+ var l = new ActiveScaffold.ActionLink.Table(link, this.target, this.loading_indicator);
1460
+ if (l.position) {
1461
+ l.url = l.url.append_params({adapter: '_list_inline_adapter'});
1462
+ l.tag.attr('href', l.url);
1463
+ }
1464
+ return l;
1465
+ }
1423
1466
  });
1424
- },
1425
1467
 
1426
- set_opened: function() {
1427
- if (this.position == 'after') {
1428
- this.set_adapter(this.target.next());
1429
- }
1430
- else if (this.position == 'before') {
1431
- this.set_adapter(this.target.prev());
1432
- }
1433
- this.disable();
1434
- }
1435
- });
1436
-
1437
- /**
1438
- * Concrete classes for table actions
1439
- */
1440
- ActiveScaffold.Actions.Table = ActiveScaffold.Actions.Abstract.extend({
1441
- instantiate_link: function(link) {
1442
- var l = new ActiveScaffold.ActionLink.Table(link, this.target, this.loading_indicator);
1443
- if (l.position) {
1444
- l.url = l.url.append_params({adapter: '_list_inline_adapter'});
1445
- l.tag.attr('href', l.url);
1446
- }
1447
- return l;
1448
- }
1449
- });
1468
+ ActiveScaffold.ActionLink.Table = ActiveScaffold.ActionLink.Abstract.extend({
1469
+ insert: function(content) {
1470
+ if (this.position == 'replace') {
1471
+ this.position = 'top';
1472
+ this.hide_content = true;
1473
+ }
1450
1474
 
1451
- ActiveScaffold.ActionLink.Table = ActiveScaffold.ActionLink.Abstract.extend({
1452
- insert: function(content) {
1453
- if (this.position == 'replace') {
1454
- this.position = 'top';
1455
- this.hide_content = true;
1456
- }
1475
+ if (this.position == 'top') {
1476
+ this.target.prepend(content);
1477
+ this.set_adapter(this.target.children().first());
1478
+ }
1479
+ else {
1480
+ throw 'Unknown position "' + this.position + '"'
1481
+ }
1482
+ ActiveScaffold.highlight(this.adapter.find('td').first().children().not('script'));
1483
+ ActiveScaffold.focus_first_element_of_form(this.adapter);
1484
+ }
1485
+ });
1486
+ };
1457
1487
 
1458
- if (this.position == 'top') {
1459
- this.target.prepend(content);
1460
- this.set_adapter(this.target.children().first());
1461
- }
1462
- else {
1463
- throw 'Unknown position "' + this.position + '"'
1464
- }
1465
- ActiveScaffold.highlight(this.adapter.find('td').first().children().not('script'));
1466
- ActiveScaffold.focus_first_element_of_form(this.adapter);
1488
+ if (window.jQuery) {
1489
+ activeScaffoldInit(jQuery);
1490
+ } else if (typeof exports === 'object' && typeof module === 'object') {
1491
+ module.exports = activeScaffoldInit;
1467
1492
  }
1468
- });
1493
+ })();