active_scaffold 3.1.20 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) hide show
  1. data/app/assets/javascripts/jquery/active_scaffold.js +4 -1
  2. data/app/assets/javascripts/prototype/active_scaffold.js +4 -1
  3. data/app/assets/stylesheets/{active_scaffold.scss~ → active_scaffold.css.scss} +5 -2
  4. data/app/assets/stylesheets/{active_scaffold_colors.scss → active_scaffold_colors.css.scss} +4 -0
  5. data/app/assets/stylesheets/active_scaffold_extensions.css.erb +2 -0
  6. data/app/assets/stylesheets/active_scaffold_images.css.scss +43 -0
  7. data/lib/active_scaffold/actions/core.rb +1 -0
  8. data/lib/active_scaffold/actions/nested.rb +0 -1
  9. data/lib/active_scaffold/extensions/action_view_rendering.rb +1 -1
  10. data/lib/active_scaffold/helpers/form_column_helpers.rb +1 -0
  11. data/lib/active_scaffold/version.rb +2 -2
  12. data/test/mock_app/.gitignore +2 -0
  13. metadata +86 -164
  14. data/app/assets/javascripts/active_scaffold.js.erb~ +0 -16
  15. data/app/assets/javascripts/jquery/active_scaffold.js~ +0 -1053
  16. data/app/assets/javascripts/jquery/draggable_lists.js~ +0 -27
  17. data/app/assets/javascripts/prototype/active_scaffold.js~ +0 -1037
  18. data/app/assets/stylesheets/active_scaffold.css.erb +0 -11
  19. data/app/assets/stylesheets/active_scaffold.css.erb~ +0 -11
  20. data/app/assets/stylesheets/active_scaffold.css.scss.erb~ +0 -1120
  21. data/app/assets/stylesheets/active_scaffold.css.scss~ +0 -11
  22. data/app/assets/stylesheets/active_scaffold.css~ +0 -11
  23. data/app/assets/stylesheets/active_scaffold_colors.css +0 -244
  24. data/app/assets/stylesheets/active_scaffold_colors.css.scss~ +0 -481
  25. data/app/assets/stylesheets/active_scaffold_default.css.erb +0 -47
  26. data/app/assets/stylesheets/active_scaffold_default.css.erb~ +0 -57
  27. data/app/assets/stylesheets/active_scaffold_default.css.scss~ +0 -1092
  28. data/app/assets/stylesheets/active_scaffold_default.css~ +0 -923
  29. data/app/assets/stylesheets/active_scaffold_layout.css~ +0 -922
  30. data/app/assets/stylesheets/blue-theme.css~ +0 -1150
  31. data/config/locales/es.yml~ +0 -120
  32. data/frontends/default/views/_action_group.html.erb~ +0 -24
  33. data/frontends/default/views/_base_form.html.erb~ +0 -42
  34. data/frontends/default/views/_form.html.erb~ +0 -26
  35. data/frontends/default/views/_form_association.html.erb~ +0 -19
  36. data/frontends/default/views/_form_association_footer.html.erb~ +0 -48
  37. data/frontends/default/views/_horizontal_subform.html.erb~ +0 -32
  38. data/frontends/default/views/_horizontal_subform_header.html.erb~ +0 -11
  39. data/frontends/default/views/_horizontal_subform_record.html.erb~ +0 -38
  40. data/frontends/default/views/_list_actions.html.erb~ +0 -15
  41. data/frontends/default/views/_list_inline_adapter.html.erb~ +0 -10
  42. data/frontends/default/views/_list_messages.html.erb~ +0 -30
  43. data/frontends/default/views/_list_pagination.html.erb~ +0 -11
  44. data/frontends/default/views/_list_pagination_links.html.erb~ +0 -0
  45. data/frontends/default/views/_list_with_header.html.erb~ +0 -36
  46. data/frontends/default/views/_render_field.js.erb~ +0 -23
  47. data/frontends/default/views/_row.html.erb~ +0 -6
  48. data/frontends/default/views/_show.html.erb~ +0 -8
  49. data/frontends/default/views/_update_form.html.erb~ +0 -6
  50. data/frontends/default/views/_vertical_subform.html.erb~ +0 -12
  51. data/frontends/default/views/add_existing.js.erb~ +0 -18
  52. data/frontends/default/views/add_existing_form.html.erb~ +0 -5
  53. data/frontends/default/views/create.html.erb~ +0 -5
  54. data/frontends/default/views/edit_associated.js.erb~ +0 -13
  55. data/frontends/default/views/on_create.js.erb~ +0 -45
  56. data/frontends/default/views/on_update.js.erb~ +0 -31
  57. data/frontends/default/views/render_field.js.erb~ +0 -1
  58. data/frontends/default/views/search.html.erb~ +0 -5
  59. data/frontends/default/views/show.html.erb~ +0 -5
  60. data/frontends/default/views/update.html.erb~ +0 -8
  61. data/frontends/default/views/update_column.js.erb~ +0 -16
  62. data/lib/active_scaffold.rb~ +0 -373
  63. data/lib/active_scaffold/actions/core.rb~ +0 -203
  64. data/lib/active_scaffold/actions/create.rb~ +0 -148
  65. data/lib/active_scaffold/actions/list.rb~ +0 -196
  66. data/lib/active_scaffold/actions/nested.rb~ +0 -247
  67. data/lib/active_scaffold/actions/search.rb~ +0 -49
  68. data/lib/active_scaffold/actions/subform.rb~ +0 -27
  69. data/lib/active_scaffold/actions/update.rb~ +0 -150
  70. data/lib/active_scaffold/attribute_params.rb~ +0 -203
  71. data/lib/active_scaffold/bridges/date_picker/helper.rb~ +0 -180
  72. data/lib/active_scaffold/bridges/record_select/helpers.rb~ +0 -86
  73. data/lib/active_scaffold/bridges/shared/date_bridge.rb~ +0 -209
  74. data/lib/active_scaffold/config/base.rb~ +0 -72
  75. data/lib/active_scaffold/config/list.rb~ +0 -195
  76. data/lib/active_scaffold/config/nested.rb~ +0 -41
  77. data/lib/active_scaffold/config/search.rb~ +0 -74
  78. data/lib/active_scaffold/constraints.rb~ +0 -186
  79. data/lib/active_scaffold/data_structures/action_columns.rb~ +0 -140
  80. data/lib/active_scaffold/data_structures/action_link.rb~ +0 -179
  81. data/lib/active_scaffold/data_structures/nested_info.rb~ +0 -147
  82. data/lib/active_scaffold/extensions/action_controller_rendering.rb~ +0 -22
  83. data/lib/active_scaffold/extensions/action_view_rendering.rb~ +0 -120
  84. data/lib/active_scaffold/extensions/active_association_reflection.rb~ +0 -22
  85. data/lib/active_scaffold/extensions/cache_association.rb~ +0 -12
  86. data/lib/active_scaffold/extensions/reverse_associations.rb~ +0 -64
  87. data/lib/active_scaffold/extensions/routing_mapper.rb~ +0 -48
  88. data/lib/active_scaffold/extensions/unsaved_associated.rb~ +0 -62
  89. data/lib/active_scaffold/finder.rb~ +0 -370
  90. data/lib/active_scaffold/helpers/controller_helpers.rb~ +0 -92
  91. data/lib/active_scaffold/helpers/form_column_helpers.rb~ +0 -320
  92. data/lib/active_scaffold/helpers/id_helpers.rb~ +0 -123
  93. data/lib/active_scaffold/helpers/list_column_helpers.rb~ +0 -370
  94. data/lib/active_scaffold/helpers/search_column_helpers.rb~ +0 -263
  95. data/lib/active_scaffold/helpers/view_helpers.rb~ +0 -350
@@ -1,27 +0,0 @@
1
- jQuery.fn.draggable_lists = function() {
2
- this.addClass('draggable-list');
3
- var list_selected = $(this.get(0).cloneNode(false)).addClass('selected');
4
- list_selected.attr('id', list_selected.attr('id') + '_selected').insertAfter(this);
5
- this.find('input:checkbox').each(function(index, item) {
6
- var li = $(item).closest('li').addClass('draggable-item');
7
- li.children('label').removeAttr('for');
8
- if ($(item).is(':checked')) li.appendTo(list_selected);
9
- li.draggable({appendTo: 'body', helper: 'clone'});
10
- });
11
- $([this, list_selected]).droppable({
12
- hoverClass: 'hover',
13
- accept: function(draggable) {
14
- var parent_id = draggable.parent().attr('id'), id = $(this).attr('id');
15
- var requested_id = $(this).hasClass('selected') ? id.replace('_selected', '') : id + '_selected';
16
- return parent.hasClass('draggable-list') && parent.get(0) != ;
17
- },
18
- drop: function(event, ui) {
19
- $(this).append(ui.draggable);
20
- var input = $('input:checkbox', ui.draggable);
21
- if ($(this).hasClass('selected')) input.attr('checked', 'checked');
22
- else input.removeAttr('checked');
23
- ui.draggable.css({left: '0px', top: '0px'});
24
- }
25
- });
26
- return this;
27
- };
@@ -1,1037 +0,0 @@
1
- if (typeof Prototype == 'undefined')
2
- {
3
- warning = "ActiveScaffold Error: Prototype could not be found. Please make sure that your application's layout includes prototype.js (e.g. <%= javascript_include_tag :defaults %>) *before* it includes active_scaffold.js (e.g. <%= active_scaffold_includes %>).";
4
- alert(warning);
5
- }
6
- if (Prototype.Version.substring(0, 3) < '1.6')
7
- {
8
- warning = "ActiveScaffold Error: Prototype version 1.6.x or higher is required. Please update prototype.js (rake rails:update:javascripts).";
9
- alert(warning);
10
- }
11
- if (!Element.Methods.highlight) Element.addMethods({highlight: Prototype.emptyFunction});
12
-
13
-
14
- document.observe("dom:loaded", function() {
15
- document.on('ajax:create', 'form.as_form', function(event) {
16
- var source = event.findElement();
17
- var as_form = event.findElement('form');
18
- if (source.nodeName.toUpperCase() == 'INPUT' && source.readAttribute('type') == 'button') {
19
- // Hack: Prototype or rails.js somehow screw up event handling if someone clicks
20
- // a button of type button such as Create Another <Association>
21
- // as a result form is disabled but never reenabled..
22
- } else {
23
- if (as_form && as_form.readAttribute('data-loading') == 'true') {
24
- ActiveScaffold.disable_form(as_form);
25
- }
26
- }
27
- return true;
28
- });
29
- document.on('ajax:complete', 'form.as_form', function(event) {
30
- var as_form = event.findElement('form');
31
- if (as_form && as_form.readAttribute('data-loading') == 'true') {
32
- ActiveScaffold.enable_form(as_form);
33
- event.stop();
34
- return false;
35
- }
36
- });
37
- document.on('ajax:failure', 'form.as_form', function(event) {
38
- var as_div = event.findElement('div.active-scaffold');
39
- if (as_div) {
40
- ActiveScaffold.report_500_response(as_div)
41
- event.stop();
42
- return false;
43
- }
44
- });
45
- document.on('submit', 'form.as_form.as_remote_upload', function(event) {
46
- var as_form = event.findElement('form');
47
- if (as_form && as_form.readAttribute('data-loading') == 'true') {
48
- setTimeout("ActiveScaffold.disable_form('" + as_form.readAttribute('id') + "')", 10);
49
- }
50
- return true;
51
- });
52
- document.on('ajax:before', 'a.as_action', function(event) {
53
- var action_link = ActiveScaffold.ActionLink.get(event.findElement());
54
- if (action_link) {
55
- if (action_link.is_disabled()) {
56
- event.stop();
57
- } else {
58
- if (action_link.loading_indicator) action_link.loading_indicator.style.visibility = 'visible';
59
- action_link.disable();
60
- }
61
- }
62
- return true;
63
- });
64
- document.on('ajax:success', 'a.as_action', function(event) {
65
- var action_link = ActiveScaffold.ActionLink.get(event.findElement());
66
- if (action_link && event.memo && event.memo.request) {
67
- if (action_link.position) {
68
- action_link.insert(event.memo.request.transport.responseText);
69
- if (action_link.hide_target) action_link.target.hide();
70
- } else {
71
- //event.memo.request.evalResponse(); // (clyfe) prototype evals the response by itself checking headers, this would eval twice
72
- action_link.enable();
73
- }
74
- event.stop();
75
- }
76
- return true;
77
- });
78
- document.on('ajax:complete', 'a.as_action', function(event) {
79
- var action_link = ActiveScaffold.ActionLink.get(event.findElement());
80
- if (action_link && action_link.loading_indicator) {
81
- action_link.loading_indicator.style.visibility = 'hidden';
82
- }
83
- return true;
84
- });
85
- document.on('ajax:failure', 'a.as_action', function(event) {
86
- var action_link = ActiveScaffold.ActionLink.get(event.findElement());
87
- if (action_link) {
88
- ActiveScaffold.report_500_response(action_link.scaffold_id());
89
- action_link.enable();
90
- }
91
- return true;
92
- });
93
- document.on('ajax:before', 'a.as_cancel', function(event) {
94
- var as_cancel = event.findElement();
95
- var action_link = ActiveScaffold.find_action_link(as_cancel);
96
-
97
- if (action_link) {
98
- var refresh_data = as_cancel.readAttribute('data-refresh');
99
- if (refresh_data === 'true' && action_link.refresh_url) {
100
- event.memo.url = action_link.refresh_url;
101
- } else if (refresh_data === 'false' || as_cancel.readAttribute('href').blank()) {
102
- action_link.close();
103
- event.stop();
104
- }
105
- }
106
- return true;
107
- });
108
- document.on('ajax:success', 'a.as_cancel', function(event) {
109
- var action_link = ActiveScaffold.find_action_link(event.findElement());
110
- if (action_link) {
111
- if (action_link.position) {
112
- action_link.close(event.memo.request.responseText);
113
- } else {
114
- event.memo.request.evalResponse();
115
- }
116
- }
117
- return true;
118
- });
119
- document.on('ajax:failure', 'a.as_cancel', function(event) {
120
- var action_link = ActiveScaffold.find_action_link(event.findElement());
121
- if (action_link) {
122
- ActiveScaffold.report_500_response(action_link.scaffold_id());
123
- }
124
- return true;
125
- });
126
- document.on('ajax:before', 'a.as_sort', function(event) {
127
- var as_sort = event.findElement();
128
- var history_controller_id = as_sort.readAttribute('data-page-history');
129
- if (history_controller_id) addActiveScaffoldPageToHistory(as_sort.readAttribute('href'), history_controller_id);
130
- as_sort.up('th').addClassName('loading');
131
- return true;
132
- });
133
- document.on('ajax:failure', 'a.as_sort', function(event) {
134
- var as_scaffold = event.findElement('.active-scaffold');
135
- ActiveScaffold.report_500_response(as_scaffold);
136
- return true;
137
- });
138
- document.on('mouseover', 'span.in_place_editor_field', function(event) {
139
- event.findElement().addClassName('hover');
140
- });
141
- document.on('mouseout', 'span.in_place_editor_field', function(event) {
142
- event.findElement().removeClassName('hover');
143
- });
144
- document.on('click', 'span.in_place_editor_field', function(event) {
145
- var span = event.findElement('span.in_place_editor_field');
146
-
147
- if (typeof(span.inplace_edit) === 'undefined') {
148
- var options = {htmlResponse: false,
149
- onEnterHover: null,
150
- onLeaveHover: null,
151
- onComplete: null,
152
- params: '',
153
- ajaxOptions: {method: 'post'}},
154
- csrf_param = $$('meta[name=csrf-param]')[0],
155
- csrf_token = $$('meta[name=csrf-token]')[0],
156
- my_parent = span.up(),
157
- column_heading = null;
158
-
159
- if(!(my_parent.nodeName.toLowerCase() === 'td' || my_parent.nodeName.toLowerCase() === 'th')){
160
- my_parent = span.up('td');
161
- }
162
-
163
- if (my_parent.nodeName.toLowerCase() === 'td') {
164
- var heading_selector = '.' + span.up().readAttribute('class').split(' ')[0] + '_heading';
165
- column_heading = span.up('.active-scaffold').down(heading_selector);
166
- } else if (my_parent.nodeName.toLowerCase() === 'th') {
167
- column_heading = my_parent;
168
- }
169
-
170
- var render_url = column_heading.readAttribute('data-ie_render_url'),
171
- mode = column_heading.readAttribute('data-ie_mode'),
172
- record_id = span.readAttribute('data-ie_id');
173
-
174
- ActiveScaffold.read_inplace_edit_heading_attributes(column_heading, options);
175
-
176
- if (span.readAttribute('data-ie_url')) {
177
- options.url = span.readAttribute('data-ie_url');
178
- } else {
179
- options.url = column_heading.readAttribute('data-ie_url');
180
- }
181
- if (record_id) options.url = options.url.sub('__id__', record_id);
182
-
183
- if (csrf_param) options['params'] = csrf_param.readAttribute('content') + '=' + csrf_token.readAttribute('content');
184
-
185
- if (span.up('div.active-scaffold').readAttribute('data-eid')) {
186
- if (options['params'].length > 0) {
187
- options['params'] += "&";
188
- }
189
- options['params'] += ("eid=" + span.up('div.active-scaffold').readAttribute('data-eid'));
190
- }
191
-
192
- if (mode === 'clone') {
193
- options.nodeIdSuffix = record_id;
194
- options.inplacePatternSelector = '#' + column_heading.readAttribute('id') + ' .as_inplace_pattern';
195
- options['onFormCustomization'] = new Function('element', 'form', 'element.clonePatternField();');
196
- }
197
-
198
- if (render_url) {
199
- var plural = false;
200
- if (column_heading.readAttribute('data-ie_plural')) plural = true;
201
- options['onFormCustomization'] = new Function('element', 'form', 'element.setFieldFromAjax(' + "'" + render_url.sub('__id__', record_id) + "', {plural: " + plural + '});');
202
- }
203
-
204
- if (mode === 'inline_checkbox') {
205
- ActiveScaffold.process_checkbox_inplace_edit(span.down('input[type="checkbox"]'), options);
206
- } else {
207
- ActiveScaffold.create_inplace_editor(span, options);
208
- }
209
- }
210
- return true;
211
- });
212
- document.on('ajax:before', 'a.as_paginate', function(event) {
213
- var as_paginate = event.findElement();
214
- var loading_indicator = as_paginate.up().down('img.loading-indicator');
215
- var history_controller_id = as_paginate.readAttribute('data-page-history');
216
-
217
- if (history_controller_id) addActiveScaffoldPageToHistory(as_paginate.readAttribute('href'), history_controller_id);
218
- if (loading_indicator) loading_indicator.style.visibility = 'visible';
219
- return true;
220
- });
221
- document.on('ajax:failure', 'a.as_paginate', function(event) {
222
- var as_scaffold = event.findElement('.active-scaffold');
223
- ActiveScaffold.report_500_response(as_scaffold);
224
- return true;
225
- });
226
- document.on('ajax:complete', 'a.as_paginate', function(event) {
227
- var as_paginate = event.findElement();
228
- var loading_indicator = as_paginate.up().down('img.loading-indicator');
229
-
230
- if(loading_indicator) loading_indicator.style.visibility = 'hidden';
231
- return true;
232
- });
233
- document.on('ajax:before', 'a.as_add_existing, a.as_replace_existing', function(event) {
234
- var button = event.findElement();
235
- var url = button.readAttribute('href').sub('--ID--', button.previous().getValue());
236
- event.memo.url = url;
237
- return true;
238
- });
239
- document.on('change', 'input.update_form, select.update_form', function(event) {
240
- var element = event.findElement();
241
- ActiveScaffold.update_column(element, element.readAttribute('data-update_url'), element.hasAttribute('data-update_send_form'), element.readAttribute('id'), element.getValue());
242
- return true;
243
- });
244
- document.on('change', 'select.as_search_range_option', function(event) {
245
- var element = event.findElement();
246
- Element[element.value == 'BETWEEN' ? 'show' : 'hide'](element.readAttribute('id').sub('_opt', '_between'));
247
- return true;
248
- });
249
- document.on('change', 'select.as_search_date_time_option', function(event) {
250
- var element = event.findElement();
251
- Element[!(element.value == 'PAST' || element.value == 'FUTURE' || element.value == 'RANGE') ? 'show' : 'hide'](element.readAttribute('id').sub('_opt', '_numeric'));
252
- Element[(element.value == 'PAST' || element.value == 'FUTURE') ? 'show' : 'hide'](element.readAttribute('id').sub('_opt', '_trend'));
253
- Element[element.value == 'RANGE' ? 'show' : 'hide'](element.readAttribute('id').sub('_opt', '_range'));
254
- return true;
255
- });
256
- document.on('change', 'select.as_update_date_operator', function(event) {
257
- var element = event.findElement();
258
- Element[element.value == 'REPLACE' ? 'show' : 'hide'](element.next());
259
- Element[element.value == 'REPLACE' ? 'show' : 'hide'](element.next().next());
260
- Element[element.value == 'REPLACE' ? 'hide' : 'show'](element.next('span'));
261
- return true;
262
- });
263
- document.on("click", "a[data-popup]", function(event, element) {
264
- if (event.stopped) return;
265
- window.open($(element).href);
266
- event.stop();
267
- });
268
- document.on("click", ".hover_click", function(event, element) {
269
- var ul_element = element.down('ul');
270
- if (ul_element.getStyle('display') === 'none') {
271
- ul_element.style.display = 'block';
272
- } else {
273
- ul_element.style.display = 'none';
274
- }
275
-
276
- return true;
277
- });
278
- document.on("click", ".hover_click a.as_action", function(event, element) {
279
- var element = element.up('.hover_click').down('ul');
280
- if (element) {
281
- element.style.display = 'none';
282
- }
283
- return true;
284
- });
285
- });
286
-
287
-
288
- /*
289
- * Simple utility methods
290
- */
291
-
292
- var ActiveScaffold = {
293
- records_for: function(tbody_id) {
294
- var rows = [];
295
- var child = $(tbody_id).down('.record');
296
- while (child) {
297
- rows.push(child);
298
- child = child.next('.record');
299
- }
300
- return rows;
301
- },
302
- stripe: function(tbody_id) {
303
- var even = false;
304
- var rows = this.records_for(tbody_id);
305
- for (var i = 0; i < rows.length; i++) {
306
- var child = rows[i];
307
- //Make sure to skip rows that are create or edit rows or messages
308
- if (child.tagName != 'SCRIPT'
309
- && !child.hasClassName("create")
310
- && !child.hasClassName("update")
311
- && !child.hasClassName("inline-adapter")
312
- && !child.hasClassName("active-scaffold-calculations")) {
313
-
314
- if (even) child.addClassName("even-record");
315
- else child.removeClassName("even-record");
316
-
317
- even = !even;
318
- }
319
- }
320
- },
321
- hide_empty_message: function(tbody) {
322
- if (this.records_for(tbody).length != 0) {
323
- var empty_message_nodes = $(tbody).up().select('tbody.messages p.empty-message')
324
- empty_message_nodes.invoke('hide');
325
- }
326
- },
327
- reload_if_empty: function(tbody, url) {
328
- if (this.records_for(tbody).length == 0) {
329
- new Ajax.Request(url, {
330
- method: 'get',
331
- asynchronous: true,
332
- evalScripts: true
333
- });
334
- }
335
- },
336
- removeSortClasses: function(scaffold) {
337
- scaffold = $(scaffold)
338
- scaffold.select('td.sorted').each(function(element) {
339
- element.removeClassName("sorted");
340
- });
341
- scaffold.select('th.sorted').each(function(element) {
342
- element.removeClassName("sorted");
343
- element.removeClassName("asc");
344
- element.removeClassName("desc");
345
- });
346
- },
347
- decrement_record_count: function(scaffold) {
348
- // decrement the last record count, firsts record count are in nested lists
349
- scaffold = $(scaffold)
350
- count = scaffold.select('span.active-scaffold-records').last();
351
- if (count) count.update(parseInt(count.innerHTML, 10) - 1);
352
- },
353
- increment_record_count: function(scaffold) {
354
- // increment the last record count, firsts record count are in nested lists
355
- scaffold = $(scaffold)
356
- count = scaffold.select('span.active-scaffold-records').last();
357
- if (count) count.update(parseInt(count.innerHTML, 10) + 1);
358
- },
359
- update_row: function(row, html) {
360
- row = $(row);
361
- var new_row = this.replace(row, html)
362
- if (row.hasClassName('even-record')) new_row.addClassName('even-record');
363
- new_row.highlight();
364
- },
365
-
366
- replace: function(element, html) {
367
- element = $(element)
368
- Element.replace(element, html);
369
- element = $(element.readAttribute('id'));
370
- return element;
371
- },
372
-
373
- replace_html: function(element, html) {
374
- element = $(element);
375
- element.update(html);
376
- return element;
377
- },
378
-
379
- remove: function(element) {
380
- $(element).remove();
381
- },
382
-
383
- hide: function(element) {
384
- $(element).hide();
385
- },
386
-
387
- show: function(element) {
388
- $(element).show();
389
- },
390
-
391
- reset_form: function(element) {
392
- $(element).reset();
393
- },
394
-
395
- disable_form: function(as_form) {
396
- as_form = $(as_form)
397
- var loading_indicator = $(as_form.readAttribute('id').sub('-form', '-loading-indicator'));
398
- if (loading_indicator) loading_indicator.style.visibility = 'visible';
399
- as_form.disable();
400
- },
401
-
402
- enable_form: function(as_form) {
403
- as_form = $(as_form)
404
- var loading_indicator = $(as_form.readAttribute('id').sub('-form', '-loading-indicator'));
405
- if (loading_indicator) loading_indicator.style.visibility = 'hidden';
406
- as_form.enable();
407
- },
408
-
409
- focus_first_element_of_form: function(form_element) {
410
- Form.focusFirstElement(form_element);
411
- },
412
-
413
- create_record_row: function(active_scaffold_id, html, options) {
414
- tbody = $(active_scaffold_id).down('tbody.records');
415
-
416
- var new_row = null;
417
-
418
- if (options.insert_at == 'top') {
419
- tbody.insert({top: html});
420
- new_row = tbody.firstDescendant();
421
- } else if (options.insert_at == 'bottom') {
422
- var last_row = tbody.childElements().reverse().detect(function(node) { return node.hasClassName('record') || node.hasClassName('inline-adapter')});
423
- if (last_row) {
424
- last_row.insert({after: html});
425
- } else {
426
- tbody.insert({bottom: html});
427
- }
428
- new_row = Selector.findChildElements(tbody, ['tr.record']).last();
429
- }
430
-
431
- this.stripe(tbody);
432
- this.hide_empty_message(tbody);
433
- this.increment_record_count(tbody.up('div.active-scaffold'));
434
- new_row.highlight();
435
- },
436
-
437
- delete_record_row: function(row, page_reload_url) {
438
- row = $(row);
439
- var tbody = row.up('tbody.records');
440
-
441
- var current_action_node = row.down('td.actions a.disabled');
442
-
443
- if (current_action_node) {
444
- var action_link = ActiveScaffold.ActionLink.get(current_action_node);
445
- if (action_link) {
446
- action_link.close_previous_adapter();
447
- }
448
- }
449
- row.remove();
450
- tbody = $(tbody);
451
- this.stripe(tbody);
452
- this.decrement_record_count(tbody.up('div.active-scaffold'));
453
- this.reload_if_empty(tbody, page_reload_url);
454
- },
455
-
456
- delete_subform_record: function(record) {
457
- var errors = $(record).previous();
458
- if (errors.hasClassName('association-record-errors')) {
459
- this.remove(errors);
460
- }
461
- this.remove(record);
462
- },
463
-
464
- report_500_response: function(active_scaffold_id) {
465
- server_error = $(active_scaffold_id).down('td.messages-container p.server-error');
466
- if (server_error.visible()) {
467
- server_error.highlight();
468
- } else {
469
- server_error.show();
470
- }
471
- },
472
-
473
- find_action_link: function(element) {
474
- return ActiveScaffold.ActionLink.get($(element).up('.as_adapter'));
475
- },
476
-
477
- scroll_to: function(element) {
478
- $(element).scrollTo();
479
- },
480
-
481
- process_checkbox_inplace_edit: function(checkbox, options) {
482
- var checked = checkbox.readAttribute('checked');
483
- // checked attribute is nt updated
484
- if (checked !== 'checked') options['params'] += '&value=1';
485
- new Ajax.Request(options.url, {
486
- method: 'post',
487
- parameters: options['params'],
488
- onCreate: function(response) {
489
- checkbox.disable();
490
- },
491
- onComplete: function(response) {
492
- checkbox.enable();
493
- }
494
- });
495
- },
496
-
497
- read_inplace_edit_heading_attributes: function(column_heading, options) {
498
- if (column_heading.readAttribute('data-ie_cancel_text')) options.cancelText = column_heading.readAttribute('data-ie_cancel_text');
499
- if (column_heading.readAttribute('data-ie_loading_text')) options.loadingText = column_heading.readAttribute('data-ie_loading_text');
500
- if (column_heading.readAttribute('data-ie_saving_text')) options.savingText = column_heading.readAttribute('data-ie_saving_text');
501
- if (column_heading.readAttribute('data-ie_save_text')) options.okText = column_heading.readAttribute('data-ie_save_text');
502
- if (column_heading.readAttribute('data-ie_rows')) options.rows = column_heading.readAttribute('data-ie_rows');
503
- if (column_heading.readAttribute('data-ie_cols')) options.cols = column_heading.readAttribute('data-ie_cols');
504
- if (column_heading.readAttribute('data-ie_size')) options.size = column_heading.readAttribute('data-ie_size');
505
- },
506
-
507
- create_inplace_editor: function(span, options) {
508
- if (options['params'].length > 0) {
509
- options['callback'] = new Function('form', 'return Form.serialize(form) + ' + "'&" + options['params'] + "';");
510
- }
511
- span.removeClassName('hover');
512
- span.inplace_edit = new ActiveScaffold.InPlaceEditor(span.readAttribute('id'), options.url, options)
513
- span.inplace_edit.enterEditMode();
514
- },
515
-
516
- create_visibility_toggle: function(element, options) {
517
- var toggable = $(element);
518
- var toggler = toggable.previous();
519
- var initial_label = (options.default_visible === true) ? options.hide_label : options.show_label;
520
-
521
- toggler.insert(' (<a class="visibility-toggle" href="#">' + initial_label + '</a>)');
522
- toggler.firstDescendant().observe('click', function(event) {
523
- var element = event.element();
524
- toggable.toggle();
525
- element.innerHTML = (toggable.style.display == 'none') ? options.show_label : options.hide_label;
526
- return false;
527
- });
528
- },
529
-
530
- create_associated_record_form: function(element, content, options) {
531
- var element = $(element);
532
- if (options.singular == false) {
533
- if (!(options.id && $(options.id))) {
534
- element.insert(content);
535
- }
536
- } else {
537
- var current = $$('#' + element.readAttribute('id') + ' .association-record');
538
- if (current[0]) {
539
- this.replace(current[0], content);
540
- } else {
541
- element.insert({top: content});
542
- }
543
- }
544
- },
545
-
546
- render_form_field: function(source, content, options) {
547
- var source = $(source);
548
- var element = source.up('.association-record');
549
- if (typeof(element) === 'undefined') {
550
- element = source.up('ol.form');
551
- }
552
- element = element.down('.' + options.field_class);
553
-
554
- if (element) {
555
- if (options.is_subform == false) {
556
- this.replace(element.up('dl'), content);
557
- } else {
558
- this.replace_html(element, content);
559
- }
560
- }
561
- },
562
-
563
- record_select_onselect: function(edit_associated_url, active_scaffold_id, id){
564
- new Ajax.Request(
565
- edit_associated_url.sub('--ID--', id), {
566
- asynchronous: true,
567
- evalScripts: true,
568
- onFailure: function(){
569
- ActiveScaffold.report_500_response(active_scaffold_id.to_json)
570
- }
571
- }
572
- );
573
- },
574
-
575
- // element is tbody id
576
- mark_records: function(element, options) {
577
- var element = $(element);
578
- var mark_checkboxes = $$('#' + element.readAttribute('id') + ' > tr.record td.marked-column input[type="checkbox"]');
579
- mark_checkboxes.each(function(item) {
580
- if(options.checked === true) {
581
- item.writeAttribute({ checked: 'checked' });
582
- } else {
583
- item.removeAttribute('checked');
584
- }
585
- item.writeAttribute('value', ('' + !options.checked));
586
- });
587
- if(options.include_mark_all === true) {
588
- var mark_all_checkbox = element.previous('thead').down('th.marked-column_heading span input[type="checkbox"]');
589
- if(options.checked === true) {
590
- mark_all_checkbox.writeAttribute({ checked: 'checked' });
591
- } else {
592
- mark_all_checkbox.removeAttribute('checked');
593
- }
594
- mark_all_checkbox.writeAttribute('value', ('' + !options.checked));
595
- }
596
- },
597
-
598
- update_column: function(element, url, send_form, source_id, val) {
599
- if (!element) element = $(source_id);
600
-
601
- var as_form = element.up('form.as_form');
602
- var params = null;
603
-
604
- if (send_form) {
605
- params = as_form.serialize(true);
606
- } else {
607
- params = {value: val};
608
- }
609
- params.source_id = source_id;
610
-
611
- new Ajax.Request(url, {
612
- method: 'get',
613
- parameters: params,
614
- onLoading: function(response) {
615
- element.next('img.loading-indicator').style.visibility = 'visible';
616
- as_form.disable();
617
- },
618
- onComplete: function(response) {
619
- element.next('img.loading-indicator').style.visibility = 'hidden';
620
- as_form.enable();
621
- },
622
- onFailure: function(request) {
623
- var as_div = event.findElement('div.active-scaffold');
624
- if (as_div) {
625
- ActiveScaffold.report_500_response(as_div)
626
- }
627
- }
628
- });
629
- },
630
-
631
- draggable_lists: function(element) {
632
- new DraggableLists(element);
633
- }
634
- }
635
-
636
- /*
637
- * DHTML history tie-in
638
- */
639
- function addActiveScaffoldPageToHistory(url, active_scaffold_id) {
640
- if (typeof dhtmlHistory == 'undefined') return; // it may not be loaded
641
-
642
- var array = url.split('?');
643
- var qs = new Querystring(array[1]);
644
- var sort = qs.get('sort')
645
- var dir = qs.get('sort_direction')
646
- var page = qs.get('page')
647
- if (sort || dir || page) dhtmlHistory.add(active_scaffold_id+":"+page+":"+sort+":"+dir, url);
648
- }
649
-
650
- /*
651
- * Add-ons/Patches to Prototype
652
- */
653
-
654
- /* patch to support replacing TR/TD/TBODY in Internet Explorer, courtesy of http://dev.rubyonrails.org/ticket/4273 */
655
- Element.replace = function(element, html) {
656
- element = $(element);
657
- if (element.outerHTML) {
658
- try {
659
- element.outerHTML = html.stripScripts();
660
- } catch (e) {
661
- var tn = element.tagName;
662
- if(tn=='TBODY' || tn=='TR' || tn=='TD')
663
- {
664
- var tempDiv = document.createElement("div");
665
- tempDiv.innerHTML = '<table id="tempTable" style="display: none">' + html.stripScripts() + '</table>';
666
- element.parentNode.replaceChild(tempDiv.getElementsByTagName(tn).item(0), element);
667
- }
668
- else throw e;
669
- }
670
- } else {
671
- var range = element.ownerDocument.createRange();
672
- /* patch to fix <form> replaces in Firefox. see http://dev.rubyonrails.org/ticket/8010 */
673
- range.selectNodeContents(element.parentNode);
674
- element.parentNode.replaceChild(range.createContextualFragment(html.stripScripts()), element);
675
- }
676
- setTimeout(function() {html.evalScripts()}, 10);
677
- return element;
678
- };
679
-
680
- /*
681
- * URL modification support. Incomplete functionality.
682
- */
683
- Object.extend(String.prototype, {
684
- append_params: function(params) {
685
- url = this;
686
- if (url.indexOf('?') == -1) url += '?';
687
- else if (url.lastIndexOf('&') != url.length) url += '&';
688
-
689
- url += $H(params).collect(function(item) {
690
- return item.key + '=' + item.value;
691
- }).join('&');
692
-
693
- return url;
694
- }
695
- });
696
-
697
- /*
698
- * Prototype's implementation was throwing an error instead of false
699
- */
700
- Element.Methods.Simulated = {
701
- hasAttribute: function(element, attribute) {
702
- var t = Element._attributeTranslations;
703
- attribute = (t.names && t.names[attribute]) || attribute;
704
- // Return false if we get an error here
705
- try {
706
- return $(element).getAttributeNode(attribute).specified;
707
- } catch (e) {
708
- return false;
709
- }
710
- }
711
- };
712
-
713
- /**
714
- * A set of links. As a set, they can be controlled such that only one is "open" at a time, etc.
715
- */
716
- ActiveScaffold.Actions = new Object();
717
- ActiveScaffold.Actions.Abstract = Class.create({
718
- initialize: function(links, target, loading_indicator, options) {
719
- this.target = $(target);
720
- this.loading_indicator = $(loading_indicator);
721
- this.options = options;
722
- this.links = links.collect(function(link) {
723
- return this.instantiate_link(link);
724
- }.bind(this));
725
- },
726
-
727
- instantiate_link: function(link) {
728
- throw 'unimplemented'
729
- }
730
- });
731
-
732
- /**
733
- * A DataStructures::ActionLink, represented in JavaScript.
734
- * Concerned with AJAX-enabling a link and adapting the result for insertion into the table.
735
- */
736
- ActiveScaffold.ActionLink = {
737
- get: function(element) {
738
- var element = $(element);
739
- if (typeof(element.retrieve('action_link')) === 'undefined' && !element.hasClassName('as_adapter')) {
740
- var parent = element.up('.actions');
741
- if (typeof(parent) === 'undefined') {
742
- // maybe an column action_link
743
- parent = element.up();
744
- }
745
- if (parent && parent.nodeName.toUpperCase() == 'TD') {
746
- // record action
747
- parent = parent.up('tr.record')
748
- new ActiveScaffold.Actions.Record(parent.select('a.as_action'), parent, parent.down('td.actions .loading-indicator'));
749
- } else if (parent && parent.nodeName.toUpperCase() == 'DIV') {
750
- //table action
751
- new ActiveScaffold.Actions.Table(parent.select('a.as_action'), parent.up('div.active-scaffold').down('tbody.before-header'), parent.down('.loading-indicator'));
752
- }
753
- element = $(element);
754
- }
755
- return element.retrieve('action_link');
756
- }
757
- };
758
-
759
- ActiveScaffold.ActionLink.Abstract = Class.create({
760
- initialize: function(a, target, loading_indicator) {
761
- this.tag = $(a);
762
- this.url = this.tag.href;
763
- this.method = this.tag.readAttribute('data-method') || 'get';
764
- this.target = target;
765
- this.loading_indicator = loading_indicator;
766
- this.hide_target = false;
767
- this.position = this.tag.readAttribute('data-position');
768
-
769
- this.tag.store('action_link', this);
770
- },
771
-
772
- open: function(event) {
773
- },
774
-
775
- insert: function(content) {
776
- throw 'unimplemented'
777
- },
778
-
779
- close: function() {
780
- this.enable();
781
- this.adapter.remove();
782
- if (this.hide_target) this.target.show();
783
- },
784
-
785
- reload: function() {
786
- this.close();
787
- this.open();
788
- },
789
-
790
- get_new_adapter_id: function() {
791
- var id = 'adapter_';
792
- var i = 0;
793
- while ($(id + i)) i++;
794
- return id + i;
795
- },
796
-
797
- enable: function() {
798
- return this.tag.removeClassName('disabled');
799
- },
800
-
801
- disable: function() {
802
- return this.tag.addClassName('disabled');
803
- },
804
-
805
- is_disabled: function() {
806
- return this.tag.hasClassName('disabled');
807
- },
808
-
809
- scaffold_id: function() {
810
- return this.tag.up('div.active-scaffold').readAttribute('id');
811
- },
812
-
813
- scaffold: function() {
814
- return this.tag.up('div.active-scaffold');
815
- },
816
-
817
- update_flash_messages: function(messages) {
818
- message_node = $(this.scaffold_id().sub('-active-scaffold', '-messages'));
819
- if (message_node) message_node.update(messages);
820
- },
821
-
822
- set_adapter: function(element) {
823
- this.adapter = element;
824
- this.adapter.addClassName('as_adapter');
825
- this.adapter.store('action_link', this);
826
- }
827
- });
828
-
829
- /**
830
- * Concrete classes for record actions
831
- */
832
- ActiveScaffold.Actions.Record = Class.create(ActiveScaffold.Actions.Abstract, {
833
- instantiate_link: function(link) {
834
- var l = new ActiveScaffold.ActionLink.Record(link, this.target, this.loading_indicator);
835
- if (this.target.hasAttribute('data-refresh') && !this.target.readAttribute('data-refresh').blank()) l.refresh_url = this.target.readAttribute('data-refresh');
836
-
837
- if (l.position) {
838
- l.url = l.url.append_params({adapter: '_list_inline_adapter'});
839
- l.tag.href = l.url;
840
- }
841
- l.set = this;
842
- return l;
843
- }
844
- });
845
-
846
- ActiveScaffold.ActionLink.Record = Class.create(ActiveScaffold.ActionLink.Abstract, {
847
- close_previous_adapter: function() {
848
- this.set.links.each(function(item) {
849
- if (item.url != this.url && item.is_disabled() && item.adapter) {
850
- item.enable();
851
- item.adapter.remove();
852
- }
853
- }.bind(this));
854
- },
855
-
856
- insert: function(content) {
857
- this.close_previous_adapter();
858
-
859
- if (this.position == 'replace') {
860
- this.position = 'after';
861
- this.hide_target = true;
862
- }
863
-
864
- if (this.position == 'after') {
865
- this.target.insert({after:content});
866
- this.set_adapter(this.target.next());
867
- }
868
- else if (this.position == 'before') {
869
- this.target.insert({before:content});
870
- this.set_adapter(this.target.previous());
871
- }
872
- else {
873
- return false;
874
- }
875
- this.adapter.down('td').down().highlight();
876
- },
877
-
878
- close: function($super, refreshed_content) {
879
- if (refreshed_content) {
880
- ActiveScaffold.update_row(this.target, refreshed_content);
881
- }
882
- $super();
883
- },
884
-
885
- enable: function() {
886
- this.set.links.each(function(item) {
887
- if (item.url != this.url) return;
888
- item.tag.removeClassName('disabled');
889
- }.bind(this));
890
- },
891
-
892
- disable: function() {
893
- this.set.links.each(function(item) {
894
- if (item.url != this.url) return;
895
- item.tag.addClassName('disabled');
896
- }.bind(this));
897
- },
898
-
899
- set_opened: function() {
900
- if (this.position == 'after') {
901
- this.set_adapter(this.target.next());
902
- }
903
- else if (this.position == 'before') {
904
- this.set_adapter(this.target.previous());
905
- }
906
- this.disable();
907
- }
908
- });
909
-
910
- /**
911
- * Concrete classes for table actions
912
- */
913
- ActiveScaffold.Actions.Table = Class.create(ActiveScaffold.Actions.Abstract, {
914
- instantiate_link: function(link) {
915
- var l = new ActiveScaffold.ActionLink.Table(link, this.target, this.loading_indicator);
916
- if (l.position) {
917
- l.url = l.url.append_params({adapter: '_list_inline_adapter'});
918
- l.tag.href = l.url;
919
- }
920
- return l;
921
- }
922
- });
923
-
924
- ActiveScaffold.ActionLink.Table = Class.create(ActiveScaffold.ActionLink.Abstract, {
925
- insert: function(content) {
926
- if (this.position == 'top') {
927
- this.target.insert({top:content});
928
- this.set_adapter(this.target.immediateDescendants().first());
929
- }
930
- else {
931
- throw 'Unknown position "' + this.position + '"'
932
- }
933
- this.adapter.down('td').down().highlight();
934
- }
935
- });
936
-
937
- if (Ajax.InPlaceEditor) {
938
- ActiveScaffold.InPlaceEditor = Class.create(Ajax.InPlaceEditor, {
939
- initialize: function($super, element, url, options) {
940
- $super(element, url, options);
941
- if (this._originalBackground == 'transparent') {
942
- this._originalBackground = null;
943
- }
944
- },
945
-
946
- setFieldFromAjax: function(url, options) {
947
- var ipe = this;
948
- $(ipe._controls.editor).remove();
949
- new Ajax.Request(url, {
950
- method: 'get',
951
- onComplete: function(response) {
952
- ipe._form.insert({top: response.responseText});
953
- if (options.plural) {
954
- ipe._form.getElements().each(function(el) {
955
- if (el.type != "submit" && el.type != "image") {
956
- el.name = ipe.options.paramName + '[]';
957
- el.className = 'editor_field';
958
- }
959
- });
960
- } else {
961
- var fld = ipe._form.findFirstElement();
962
- fld.name = ipe.options.paramName;
963
- fld.className = 'editor_field';
964
- if (ipe.options.submitOnBlur)
965
- fld.onblur = ipe._boundSubmitHandler;
966
- ipe._controls.editor = fld;
967
- }
968
- }
969
- });
970
- },
971
-
972
- clonePatternField: function() {
973
- var patternNodes = this.getPatternNodes(this.options.inplacePatternSelector);
974
- if (patternNodes.editNode == null) {
975
- alert('did not find any matching node for ' + this.options.editFieldSelector);
976
- return;
977
- }
978
-
979
- var fld = patternNodes.editNode.cloneNode(true);
980
- if (fld.id.length > 0) fld.id += this.options.nodeIdSuffix;
981
- fld.name = this.options.paramName;
982
- fld.className = 'editor_field';
983
- this.setValue(fld, this._controls.editor.value);
984
- if (this.options.submitOnBlur)
985
- fld.onblur = this._boundSubmitHandler;
986
- $(this._controls.editor).remove();
987
- this._controls.editor = fld;
988
- this._form.appendChild(this._controls.editor);
989
-
990
- $A(patternNodes.additionalNodes).each(function(node) {
991
- var patternNode = node.cloneNode(true);
992
- if (patternNode.id.length > 0) {
993
- patternNode.id = patternNode.id + this.options.nodeIdSuffix;
994
- }
995
- this._form.appendChild(patternNode);
996
- }.bind(this));
997
- },
998
-
999
- getPatternNodes: function(inplacePatternSelector) {
1000
- var nodes = {editNode: null, additionalNodes: []};
1001
- var selectedNodes = $$(inplacePatternSelector);
1002
- var firstNode = selectedNodes.first();
1003
-
1004
- if (typeof(firstNode) !== 'undefined') {
1005
- // AS inplace_edit_control_container -> we have to select all child nodes
1006
- // Workaround for ie which does not support css > selector
1007
- if (firstNode.className.indexOf('as_inplace_pattern') !== -1) {
1008
- selectedNodes = firstNode.childElements();
1009
- }
1010
- nodes.editNode = selectedNodes.first();
1011
- selectedNodes.shift();
1012
- nodes.additionalNodes = selectedNodes;
1013
- }
1014
- return nodes;
1015
- },
1016
-
1017
- setValue: function(editField, textValue) {
1018
- var function_name = 'setValueFor' + editField.nodeName.toLowerCase();
1019
- if (typeof(this[function_name]) == 'function') {
1020
- this[function_name](editField, textValue);
1021
- } else {
1022
- editField.value = textValue;
1023
- }
1024
- },
1025
-
1026
- setValueForselect: function(editField, textValue) {
1027
- var len = editField.options.length;
1028
- var i = 0;
1029
- while (i < len && editField.options[i].text != textValue) {
1030
- i++;
1031
- }
1032
- if (i < len) {
1033
- editField.value = editField.options[i].value
1034
- }
1035
- }
1036
- });
1037
- }