active_scaffold 3.3.3 → 3.4.0

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.
Files changed (198) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +39 -0
  3. data/README.md +5 -3
  4. data/app/assets/images/active_scaffold/refresh.png +0 -0
  5. data/app/assets/javascripts/jquery/active_scaffold.js +182 -91
  6. data/app/assets/javascripts/jquery/date_picker_bridge.js.erb +14 -16
  7. data/app/assets/javascripts/jquery/draggable_lists.js +33 -26
  8. data/app/assets/javascripts/jquery/jquery.editinplace.js +3 -3
  9. data/app/assets/javascripts/prototype/active_scaffold.js +61 -19
  10. data/app/assets/stylesheets/active_scaffold_colors.css.scss +4 -0
  11. data/app/assets/stylesheets/active_scaffold_images.css.scss +3 -0
  12. data/app/assets/stylesheets/active_scaffold_layout.css +23 -2
  13. data/app/views/active_scaffold_overrides/_add_existing_form.html.erb +1 -3
  14. data/app/views/active_scaffold_overrides/_base_form.html.erb +7 -5
  15. data/app/views/active_scaffold_overrides/_field_search.html.erb +1 -2
  16. data/app/views/active_scaffold_overrides/_form.html.erb +6 -4
  17. data/app/views/active_scaffold_overrides/_form_association.html.erb +4 -3
  18. data/app/views/active_scaffold_overrides/_form_association_footer.html.erb +5 -5
  19. data/app/views/active_scaffold_overrides/_form_association_record.html.erb +8 -6
  20. data/app/views/active_scaffold_overrides/_horizontal_subform_header.html.erb +3 -2
  21. data/app/views/active_scaffold_overrides/_list.html.erb +8 -6
  22. data/app/views/active_scaffold_overrides/_list_column_headings.html.erb +1 -4
  23. data/app/views/active_scaffold_overrides/_list_pagination.html.erb +4 -4
  24. data/app/views/active_scaffold_overrides/_list_pagination_links.html.erb +1 -1
  25. data/app/views/active_scaffold_overrides/_list_record.html.erb +3 -3
  26. data/app/views/active_scaffold_overrides/_refresh_list.js.erb +8 -1
  27. data/app/views/active_scaffold_overrides/_search.html.erb +7 -13
  28. data/app/views/active_scaffold_overrides/_show_columns.html.erb +1 -1
  29. data/app/views/active_scaffold_overrides/on_create.js.erb +4 -4
  30. data/app/views/active_scaffold_overrides/render_field_inplace.html.erb +1 -1
  31. data/app/views/active_scaffold_overrides/row.js.erb +1 -1
  32. data/config/locales/de.yml +106 -95
  33. data/config/locales/en.yml +108 -97
  34. data/config/locales/es.yml +109 -98
  35. data/config/locales/fr.yml +108 -97
  36. data/config/locales/hu.yml +109 -98
  37. data/config/locales/ja.yml +100 -89
  38. data/config/locales/ru.yml +115 -104
  39. data/lib/active_scaffold.rb +18 -294
  40. data/lib/active_scaffold/actions/common_search.rb +50 -17
  41. data/lib/active_scaffold/actions/core.rb +93 -22
  42. data/lib/active_scaffold/actions/create.rb +15 -6
  43. data/lib/active_scaffold/actions/field_search.rb +68 -60
  44. data/lib/active_scaffold/actions/list.rb +49 -28
  45. data/lib/active_scaffold/actions/nested.rb +14 -6
  46. data/lib/active_scaffold/actions/search.rb +36 -35
  47. data/lib/active_scaffold/actions/show.rb +9 -4
  48. data/lib/active_scaffold/actions/subform.rb +1 -1
  49. data/lib/active_scaffold/actions/update.rb +22 -7
  50. data/lib/active_scaffold/active_record_permissions.rb +125 -118
  51. data/lib/active_scaffold/attribute_params.rb +84 -66
  52. data/lib/active_scaffold/bridges.rb +3 -3
  53. data/lib/active_scaffold/bridges/ancestry/ancestry_bridge.rb +10 -5
  54. data/lib/active_scaffold/bridges/cancan.rb +2 -1
  55. data/lib/active_scaffold/bridges/cancan/cancan_bridge.rb +13 -2
  56. data/lib/active_scaffold/bridges/carrierwave/form_ui.rb +11 -6
  57. data/lib/active_scaffold/bridges/chosen/helpers.rb +2 -2
  58. data/lib/active_scaffold/bridges/country_helper/country_helper_bridge.rb +45 -29
  59. data/lib/active_scaffold/bridges/date_picker/ext.rb +11 -6
  60. data/lib/active_scaffold/bridges/date_picker/helper.rb +5 -1
  61. data/lib/active_scaffold/bridges/dragonfly/form_ui.rb +10 -5
  62. data/lib/active_scaffold/bridges/dragonfly/list_ui.rb +6 -1
  63. data/lib/active_scaffold/bridges/file_column/form_ui.rb +12 -11
  64. data/lib/active_scaffold/bridges/paperclip/form_ui.rb +14 -6
  65. data/lib/active_scaffold/bridges/paperclip/list_ui.rb +1 -1
  66. data/lib/active_scaffold/bridges/record_select/helpers.rb +15 -12
  67. data/lib/active_scaffold/bridges/shared/date_bridge.rb +7 -8
  68. data/lib/active_scaffold/bridges/tiny_mce.rb +5 -3
  69. data/lib/active_scaffold/bridges/tiny_mce/helpers.rb +4 -5
  70. data/lib/active_scaffold/config/base.rb +4 -0
  71. data/lib/active_scaffold/config/core.rb +12 -5
  72. data/lib/active_scaffold/config/delete.rb +0 -2
  73. data/lib/active_scaffold/config/field_search.rb +1 -4
  74. data/lib/active_scaffold/config/form.rb +0 -2
  75. data/lib/active_scaffold/config/list.rb +31 -1
  76. data/lib/active_scaffold/config/search.rb +0 -3
  77. data/lib/active_scaffold/config/show.rb +0 -6
  78. data/lib/active_scaffold/config/subform.rb +1 -0
  79. data/lib/active_scaffold/configurable.rb +2 -2
  80. data/lib/active_scaffold/constraints.rb +11 -14
  81. data/lib/active_scaffold/core.rb +277 -0
  82. data/lib/active_scaffold/data_structures/action_columns.rb +18 -2
  83. data/lib/active_scaffold/data_structures/action_link.rb +25 -6
  84. data/lib/active_scaffold/data_structures/action_links.rb +9 -4
  85. data/lib/active_scaffold/data_structures/actions.rb +1 -1
  86. data/lib/active_scaffold/data_structures/column.rb +6 -6
  87. data/lib/active_scaffold/data_structures/columns.rb +2 -2
  88. data/lib/active_scaffold/data_structures/nested_info.rb +5 -1
  89. data/lib/active_scaffold/data_structures/sorting.rb +15 -5
  90. data/lib/active_scaffold/delayed_setup.rb +30 -0
  91. data/lib/active_scaffold/engine.rb +25 -0
  92. data/lib/active_scaffold/extensions/action_view_rendering.rb +1 -1
  93. data/lib/active_scaffold/extensions/left_outer_joins.rb +61 -21
  94. data/lib/active_scaffold/extensions/localize.rb +1 -1
  95. data/lib/active_scaffold/extensions/name_option_for_datetime.rb +13 -8
  96. data/lib/active_scaffold/extensions/paginator_extensions.rb +5 -1
  97. data/lib/active_scaffold/extensions/reverse_associations.rb +1 -0
  98. data/lib/active_scaffold/extensions/routing_mapper.rb +1 -1
  99. data/lib/active_scaffold/extensions/unsaved_record.rb +4 -6
  100. data/lib/active_scaffold/finder.rb +79 -27
  101. data/lib/active_scaffold/helpers/association_helpers.rb +48 -18
  102. data/lib/active_scaffold/helpers/controller_helpers.rb +19 -10
  103. data/lib/active_scaffold/helpers/form_column_helpers.rb +185 -87
  104. data/lib/active_scaffold/helpers/human_condition_helpers.rb +2 -1
  105. data/lib/active_scaffold/helpers/id_helpers.rb +14 -8
  106. data/lib/active_scaffold/helpers/list_column_helpers.rb +65 -56
  107. data/lib/active_scaffold/helpers/pagination_helpers.rb +5 -1
  108. data/lib/active_scaffold/helpers/search_column_helpers.rb +21 -18
  109. data/lib/active_scaffold/helpers/view_helpers.rb +102 -64
  110. data/lib/active_scaffold/responds_to_parent.rb +39 -64
  111. data/lib/active_scaffold/tableless.rb +129 -10
  112. data/lib/active_scaffold/version.rb +2 -2
  113. data/test/bridges/bridge_test.rb +1 -1
  114. data/test/bridges/date_picker_test.rb +2 -2
  115. data/test/bridges/paperclip_test.rb +10 -8
  116. data/test/bridges/tiny_mce_test.rb +2 -2
  117. data/test/company.rb +22 -10
  118. data/test/config/base_test.rb +1 -1
  119. data/test/config/core_test.rb +8 -6
  120. data/test/config/create_test.rb +6 -6
  121. data/test/config/delete_test.rb +4 -4
  122. data/test/config/field_search_test.rb +6 -6
  123. data/test/config/list_test.rb +7 -7
  124. data/test/config/nested_test.rb +8 -7
  125. data/test/config/search_test.rb +7 -7
  126. data/test/config/show_test.rb +5 -5
  127. data/test/config/subform_test.rb +1 -1
  128. data/test/config/update_test.rb +5 -4
  129. data/test/data_structures/action_columns_test.rb +15 -16
  130. data/test/data_structures/action_link_test.rb +10 -10
  131. data/test/data_structures/action_links_test.rb +6 -6
  132. data/test/data_structures/actions_test.rb +4 -4
  133. data/test/data_structures/association_column_test.rb +4 -4
  134. data/test/data_structures/column_test.rb +9 -9
  135. data/test/data_structures/columns_test.rb +7 -7
  136. data/test/data_structures/error_message_test.rb +2 -4
  137. data/test/data_structures/set_test.rb +13 -13
  138. data/test/data_structures/sorting_test.rb +8 -8
  139. data/test/data_structures/standard_column_test.rb +2 -2
  140. data/test/data_structures/validation_reflection_test.rb +8 -8
  141. data/test/data_structures/virtual_column_test.rb +5 -5
  142. data/test/extensions/active_record_test.rb +1 -1
  143. data/test/helpers/form_column_helpers_test.rb +5 -5
  144. data/test/helpers/list_column_helpers_test.rb +2 -1
  145. data/test/helpers/pagination_helpers_test.rb +1 -1
  146. data/test/misc/active_record_permissions_test.rb +23 -4
  147. data/test/misc/attribute_params_test.rb +304 -136
  148. data/test/misc/calculation_test.rb +55 -0
  149. data/test/misc/configurable_test.rb +22 -21
  150. data/test/misc/constraints_test.rb +10 -7
  151. data/test/misc/convert_numbers_format_test.rb +149 -0
  152. data/test/misc/finder_test.rb +17 -13
  153. data/test/misc/lang_test.rb +1 -1
  154. data/test/misc/tableless_test.rb +18 -0
  155. data/test/mock_app/app/controllers/addresses_controller.rb +4 -0
  156. data/test/mock_app/app/controllers/buildings_controller.rb +4 -0
  157. data/test/mock_app/app/controllers/cars_controller.rb +4 -0
  158. data/test/mock_app/app/controllers/contacts_controller.rb +4 -0
  159. data/test/mock_app/app/controllers/floors_controller.rb +6 -0
  160. data/test/mock_app/app/controllers/people_controller.rb +4 -0
  161. data/test/mock_app/app/models/address.rb +3 -0
  162. data/test/mock_app/app/models/building.rb +8 -0
  163. data/test/mock_app/app/models/car.rb +3 -0
  164. data/test/mock_app/app/models/contact.rb +3 -0
  165. data/test/mock_app/app/models/file_model.rb +19 -0
  166. data/test/mock_app/app/models/floor.rb +8 -0
  167. data/test/mock_app/app/models/person.rb +11 -0
  168. data/test/mock_app/config/application.rb +2 -0
  169. data/test/mock_app/config/environments/test.rb +1 -1
  170. data/test/mock_app/config/initializers/secret_token.rb +5 -1
  171. data/test/mock_app/config/routes.rb +1 -1
  172. data/test/mock_app/db/schema.rb +51 -0
  173. data/test/model_stub.rb +3 -3
  174. data/test/test_helper.rb +15 -12
  175. metadata +51 -50
  176. data/lib/active_scaffold/extensions/array.rb +0 -7
  177. data/lib/active_scaffold/extensions/cache_association.rb +0 -16
  178. data/lib/active_scaffold/extensions/usa_state.rb +0 -46
  179. data/lib/active_scaffold_env.rb +0 -13
  180. data/test/extensions/array_test.rb +0 -12
  181. data/test/mock_app/public/blank.html +0 -33
  182. data/test/mock_app/public/images/active_scaffold/DO_NOT_EDIT +0 -2
  183. data/test/mock_app/public/images/active_scaffold/default/add.gif +0 -0
  184. data/test/mock_app/public/images/active_scaffold/default/arrow_down.gif +0 -0
  185. data/test/mock_app/public/images/active_scaffold/default/arrow_up.gif +0 -0
  186. data/test/mock_app/public/images/active_scaffold/default/close.gif +0 -0
  187. data/test/mock_app/public/images/active_scaffold/default/cross.png +0 -0
  188. data/test/mock_app/public/images/active_scaffold/default/indicator-small.gif +0 -0
  189. data/test/mock_app/public/images/active_scaffold/default/indicator.gif +0 -0
  190. data/test/mock_app/public/images/active_scaffold/default/magnifier.png +0 -0
  191. data/test/mock_app/public/javascripts/active_scaffold/DO_NOT_EDIT +0 -2
  192. data/test/mock_app/public/javascripts/active_scaffold/default/active_scaffold.js +0 -532
  193. data/test/mock_app/public/javascripts/active_scaffold/default/dhtml_history.js +0 -867
  194. data/test/mock_app/public/javascripts/active_scaffold/default/form_enhancements.js +0 -117
  195. data/test/mock_app/public/javascripts/active_scaffold/default/rico_corner.js +0 -370
  196. data/test/mock_app/public/stylesheets/active_scaffold/DO_NOT_EDIT +0 -2
  197. data/test/mock_app/public/stylesheets/active_scaffold/default/stylesheet-ie.css +0 -35
  198. data/test/mock_app/public/stylesheets/active_scaffold/default/stylesheet.css +0 -848
@@ -1,25 +1,23 @@
1
1
  <%# encoding: utf-8 %>
2
2
  <%= ActiveScaffold::Bridges[:date_picker].localization %>
3
- jQuery(function($) {
4
- Object.getPrototypeOf($.datepicker)._attachDatepicker_without_inlineSettings = Object.getPrototypeOf($.datepicker)._attachDatepicker;
5
- $.extend(Object.getPrototypeOf($.datepicker), {
6
- _attachDatepicker: function(target, settings) {
7
- var inlineSettings = {}, $target = $(target);
8
- for (var attrName in this._defaults) {
9
- if(this._defaults.hasOwnProperty(attrName)){
10
- var attrValue = $target.data(attrName.toLowerCase());
11
- if (attrValue) {
12
- try {
13
- inlineSettings[attrName] = eval(attrValue);
14
- } catch (err) {
15
- inlineSettings[attrName] = attrValue;
16
- }
3
+ Object.getPrototypeOf(jQuery.datepicker)._attachDatepicker_without_inlineSettings = Object.getPrototypeOf(jQuery.datepicker)._attachDatepicker;
4
+ jQuery.extend(Object.getPrototypeOf(jQuery.datepicker), {
5
+ _attachDatepicker: function(target, settings) {
6
+ var inlineSettings = {}, $target = jQuery(target);
7
+ for (var attrName in this._defaults) {
8
+ if(this._defaults.hasOwnProperty(attrName)){
9
+ var attrValue = $target.data(attrName.toLowerCase());
10
+ if (attrValue) {
11
+ try {
12
+ inlineSettings[attrName] = eval(attrValue);
13
+ } catch (err) {
14
+ inlineSettings[attrName] = attrValue;
17
15
  }
18
16
  }
19
17
  }
20
- this._attachDatepicker_without_inlineSettings(target, $.extend({}, settings || {}, inlineSettings));
21
18
  }
22
- });
19
+ this._attachDatepicker_without_inlineSettings(target, jQuery.extend({}, settings || {}, inlineSettings));
20
+ }
23
21
  });
24
22
  jQuery(document).on("focus", "input.date_picker", function(){
25
23
  var date_picker = jQuery(this);
@@ -1,26 +1,33 @@
1
- jQuery.fn.draggable_lists = function() {
2
- this.addClass('draggable-list');
3
- var list_selected = jQuery(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 = jQuery(item).closest('li').addClass('draggable-item');
7
- li.children('label').removeAttr('for');
8
- if (jQuery(item).is(':checked')) li.appendTo(list_selected);
9
- li.draggable({appendTo: 'body', helper: 'clone'});
10
- });
11
- jQuery([this, list_selected]).droppable({
12
- hoverClass: 'hover',
13
- accept: function(draggable) {
14
- var parent_id = draggable.parent().attr('id'), id = jQuery(this).attr('id'),
15
- requested_id = jQuery(this).hasClass('selected') ? id.replace('_selected', '') : id + '_selected';
16
- return parent_id == requested_id;
17
- },
18
- drop: function(event, ui) {
19
- jQuery(this).append(ui.draggable);
20
- var input = jQuery('input:checkbox', ui.draggable);
21
- input.prop('checked', jQuery(this).hasClass('selected'));
22
- ui.draggable.css({left: '0px', top: '0px'});
23
- }
24
- });
25
- return this;
26
- };
1
+ (function() {
2
+ function enableDraggableLists(element) {
3
+ if (element.hasClass('draggable-list')) return;
4
+ element.addClass('draggable-list');
5
+ var list_selected = jQuery(element.get(0).cloneNode(false)).addClass('selected');
6
+ list_selected.attr('id', list_selected.attr('id') + '_selected').insertAfter(element);
7
+ element.find('input:checkbox').each(function(index, item) {
8
+ var li = jQuery(item).closest('li').addClass('draggable-item');
9
+ li.children('label').removeAttr('for');
10
+ if (jQuery(item).is(':checked')) li.appendTo(list_selected);
11
+ li.draggable({appendTo: 'body', helper: 'clone'});
12
+ });
13
+ jQuery([element, list_selected]).droppable({
14
+ hoverClass: 'hover',
15
+ accept: function(draggable) {
16
+ var parent_id = draggable.parent().attr('id'), id = jQuery(this).attr('id'),
17
+ requested_id = jQuery(this).hasClass('selected') ? id.replace('_selected', '') : id + '_selected';
18
+ return parent_id == requested_id;
19
+ },
20
+ drop: function(event, ui) {
21
+ jQuery(this).append(ui.draggable);
22
+ var input = jQuery('input:checkbox', ui.draggable);
23
+ input.prop('checked', jQuery(this).hasClass('selected'));
24
+ input.trigger('change');
25
+ ui.draggable.css({left: '0px', top: '0px'});
26
+ }
27
+ });
28
+ return element;
29
+ };
30
+ jQuery.fn.draggableLists = function() {
31
+ this.each(function() { enableDraggableLists(jQuery(this)); });
32
+ };
33
+ })();
@@ -314,7 +314,7 @@ $.extend(InlineEditor.prototype, {
314
314
 
315
315
  var editorNode = patternNodes.editNode.clone();
316
316
  var clonedNodes = null;
317
- if (editorNode.attr('id')) editorNode.attr('id', editorNode.attr('id') + this.settings.clone_id_suffix);
317
+ if (editorNode.data('id')) editorNode.attr('id', editorNode.data('id') + this.settings.clone_id_suffix);
318
318
  editorNode.attr('name', 'inplace_value');
319
319
  editorNode.addClass('editor_field');
320
320
  this.setValue(editorNode, this.originalValue);
@@ -323,8 +323,8 @@ $.extend(InlineEditor.prototype, {
323
323
  if (patternNodes.additionalNodes) {
324
324
  patternNodes.additionalNodes.each(function (index, node) {
325
325
  var patternNode = $(node).clone();
326
- if (patternNode.attr('id')) {
327
- patternNode.attr('id', patternNode.attr('id') + this.settings.clone_id_suffix);
326
+ if (patternNode.data('id')) {
327
+ patternNode.attr('id', patternNode.data('id') + this.settings.clone_id_suffix);
328
328
  }
329
329
  clonedNodes = clonedNodes.after(patternNode);
330
330
  });
@@ -43,6 +43,9 @@ document.observe("dom:loaded", function() {
43
43
  return false;
44
44
  }
45
45
  });
46
+ document.on('ajax:complete', 'form.live', function(event) {
47
+ ActiveScaffold.focus_first_element_of_form(event.findElement('form'));
48
+ });
46
49
  document.on('ajax:failure', 'form.as_form', function(event) {
47
50
  var as_div = event.findElement('div.active-scaffold');
48
51
  if (as_div) {
@@ -77,7 +80,10 @@ document.observe("dom:loaded", function() {
77
80
  action_link.insert(event.memo.request.transport.responseText);
78
81
  if (action_link.hide_target) action_link.target.hide();
79
82
  } else {
80
- //event.memo.request.evalResponse(); // (clyfe) prototype evals the response by itself checking headers, this would eval twice
83
+ if (action_link.tag.hasClassName('toggle')) {
84
+ action_link.tag.up('.action_group,.actions').select('.toggle.active').invoke('removeClassName', 'active');
85
+ action_link.tag.addClassName('active');
86
+ }
81
87
  action_link.enable();
82
88
  }
83
89
  event.stop();
@@ -115,7 +121,7 @@ document.observe("dom:loaded", function() {
115
121
  return true;
116
122
  });
117
123
  document.on('ajax:success', 'a.as_cancel', function(event) {
118
- var action_link = ActiveScaffold.find_action_link(event.findElement());
124
+ var link = event.findElement(), action_link = ActiveScaffold.find_action_link(link);
119
125
  if (action_link) {
120
126
  if (action_link.position) {
121
127
  action_link.close();
@@ -123,6 +129,7 @@ document.observe("dom:loaded", function() {
123
129
  event.memo.request.evalResponse();
124
130
  }
125
131
  }
132
+ if (link.hasClassName('reset')) link.up('form').reset();
126
133
  return true;
127
134
  });
128
135
  document.on('ajax:failure', 'a.as_cancel', function(event) {
@@ -252,11 +259,31 @@ document.observe("dom:loaded", function() {
252
259
  return true;
253
260
  } else return false;
254
261
  });
255
- document.on('change', 'input.update_form, textarea.update_form, select.update_form', function(event) {
262
+ document.on('change', 'input.update_form, textarea.update_form, select.update_form, .checkbox-list.update_form input:checkbox', function(event) {
256
263
  var element = event.findElement();
257
- ActiveScaffold.update_column(element, element.readAttribute('data-update_url'), element.hasAttribute('data-update_send_form'), element.readAttribute('id'), element.getValue());
264
+ var form_element = element.up('.checkbox-list');
265
+ var value, additional_params;
266
+ if (form_element.match(".checkbox-list")) {
267
+ value = Form.Element.getValue(form_element.up());
268
+ additional_params = element.readAttribute('checked') ? {'_added': element.readAttribute('value')} : {'_removed': element.readAttribute('value')};
269
+ } else {
270
+ value = element.getValue();
271
+ form_element = element;
272
+ }
273
+ ActiveScaffold.update_column(element, form_element.readAttribute('data-update_url'), form_element.hasAttribute('data-update_send_form'), element.readAttribute('id'), value);
258
274
  return true;
259
275
  });
276
+ document.on('click', 'a.refresh-link', function(event) {
277
+ event.stop();
278
+ var element = event.findElement();
279
+ var form_element = element.previous();
280
+ var value;
281
+ if (form_element.match(".checkbox-list")) {
282
+ value = Form.Element.getValue(form_element);
283
+ form_element = form_element.up().select("input:checkbox"); // parent is needed for draggable-list, checked list may be empty
284
+ } else value = form_element.getValue();
285
+ ActiveScaffold.update_column(form_element, element.readAttribute('href'), element.hasAttribute('data-update_send_form'), form_element.readAttribute('id'), value);
286
+ });
260
287
  document.on('recordselect:change', 'input.recordselect.update_form', function(event) {
261
288
  var element = event.findElement();
262
289
  ActiveScaffold.update_column(element, element.readAttribute('data-update_url'), element.hasAttribute('data-update_send_form'), element.readAttribute('id'), element.memo.id);
@@ -383,20 +410,24 @@ var ActiveScaffold = {
383
410
  update_row: function(row, html) {
384
411
  row = $(row);
385
412
  var new_row = this.replace(row, html)
386
- if (row.hasClassName('even-record')) new_row.addClassName('even-record');
387
- ActiveScaffold.highlight(new_row);
413
+ if (new_row) {
414
+ if (row.hasClassName('even-record')) new_row.addClassName('even-record');
415
+ ActiveScaffold.highlight(new_row);
416
+ }
388
417
  },
389
418
 
390
419
  replace: function(element, html) {
391
420
  element = $(element)
392
- Element.replace(element, html);
393
- element = $(element.readAttribute('id'));
421
+ if (element) {
422
+ Element.replace(element, html);
423
+ element = $(element.readAttribute('id'));
424
+ }
394
425
  return element;
395
426
  },
396
427
 
397
428
  replace_html: function(element, html) {
398
429
  element = $(element);
399
- element.update(html);
430
+ if (element) element.update(html);
400
431
  return element;
401
432
  },
402
433
 
@@ -540,6 +571,11 @@ var ActiveScaffold = {
540
571
  link = $(link);
541
572
  link.next('ul').remove();
542
573
  link.up('td').addClassName('action_group dyn');
574
+ if (link.up('td.actions')) link.up('td').addClassName('action_group dyn');
575
+ else {
576
+ if (link.up().hasClassName('actions')) link.wrap('div');
577
+ link.up().addClassName('action_group dyn');
578
+ }
543
579
  link.insert({after: html});
544
580
  },
545
581
 
@@ -595,7 +631,7 @@ var ActiveScaffold = {
595
631
  var toggler = toggable.previous();
596
632
  var initial_label = (options.default_visible === true) ? options.hide_label : options.show_label;
597
633
 
598
- toggler.insert(' (<a class="visibility-toggle" href="#">' + initial_label + '</a>)');
634
+ toggler.insert(' <a class="visibility-toggle" href="#">' + initial_label + '</a>');
599
635
  toggler.firstDescendant().observe('click', function(event) {
600
636
  var element = event.element();
601
637
  event.stop();
@@ -623,11 +659,14 @@ var ActiveScaffold = {
623
659
 
624
660
  render_form_field: function(source, content, options) {
625
661
  var source = $(source);
626
- var element = source.up('.association-record');
662
+ var element = source.up('.association-record'), selector = '';
627
663
  if (typeof(element) === 'undefined') {
628
664
  element = source.up('ol.form');
665
+ selector = 'li';
629
666
  }
630
- element = element.down('.' + options.field_class);
667
+ // find without entering new subforms
668
+ selector = options.is_subform ? '' : selector + ':not(.sub-form) ';
669
+ element = element.down(selector + '.' + options.field_class);
631
670
 
632
671
  if (element) {
633
672
  if (options.is_subform == false) {
@@ -675,7 +714,7 @@ var ActiveScaffold = {
675
714
  }
676
715
  },
677
716
 
678
- update_column: function(element, url, send_form, source_id, val) {
717
+ update_column: function(element, url, send_form, source_id, val, additional_params) {
679
718
  if (!element) element = $(source_id);
680
719
 
681
720
  var as_form = element.up('form.as_form');
@@ -690,6 +729,7 @@ var ActiveScaffold = {
690
729
  params = Form.serializeElements(base.getElementsBySelector('input, textarea, select'), true);
691
730
  else params = as_form.serialize(true);
692
731
  params['_method'] = '';
732
+ if (additional_params) params = Object.extend(params, additional_params);
693
733
  } else {
694
734
  params = {value: val};
695
735
  }
@@ -936,7 +976,7 @@ ActiveScaffold.ActionLink.Abstract = Class.create({
936
976
  ActiveScaffold.Actions.Record = Class.create(ActiveScaffold.Actions.Abstract, {
937
977
  instantiate_link: function(link) {
938
978
  var l = new ActiveScaffold.ActionLink.Record(link, this.target, this.loading_indicator);
939
- if (this.target.hasAttribute('data-refresh') && !this.target.readAttribute('data-refresh').blank()) l.refresh_url = this.target.readAttribute('data-refresh');
979
+ if (this.target.hasAttribute('data-refresh') && !this.target.readAttribute('data-refresh').blank()) l.refresh_url = this.target.up('.records').readAttribute('data-refresh-record').replace('--ID--', this.target.readAttribute('data-refresh'));
940
980
 
941
981
  if (l.position) {
942
982
  l.url = l.url.append_params({adapter: '_list_inline_adapter'});
@@ -977,6 +1017,7 @@ ActiveScaffold.ActionLink.Record = Class.create(ActiveScaffold.ActionLink.Abstra
977
1017
  return false;
978
1018
  }
979
1019
  this.adapter.down('.inline-adapter-cell').writeAttribute('colspan', colspan);
1020
+ ActiveScaffold.focus_first_element_of_form(this.adapter);
980
1021
  ActiveScaffold.highlight(this.adapter.down('td').down());
981
1022
  },
982
1023
 
@@ -1045,8 +1086,9 @@ ActiveScaffold.ActionLink.Table = Class.create(ActiveScaffold.ActionLink.Abstrac
1045
1086
  else {
1046
1087
  throw 'Unknown position "' + this.position + '"'
1047
1088
  }
1089
+ ActiveScaffold.focus_first_element_of_form(this.adapter);
1048
1090
  ActiveScaffold.highlight(this.adapter.down('td').down());
1049
- },
1091
+ }
1050
1092
  });
1051
1093
 
1052
1094
  if (Ajax.InPlaceEditor) {
@@ -1091,8 +1133,8 @@ ActiveScaffold.InPlaceEditor = Class.create(Ajax.InPlaceEditor, {
1091
1133
  return;
1092
1134
  }
1093
1135
 
1094
- var fld = patternNodes.editNode.cloneNode(true);
1095
- if (fld.id.length > 0) fld.id += this.options.nodeIdSuffix;
1136
+ var fld = $(patternNodes.editNode.cloneNode(true));
1137
+ if (fld.readAttribute("data-id").length > 0) fld.id = fld.readAttribute("data-id") + this.options.nodeIdSuffix;
1096
1138
  fld.name = this.options.paramName;
1097
1139
  fld.className = 'editor_field';
1098
1140
  this.setValue(fld, this._controls.editor.value);
@@ -1103,9 +1145,9 @@ ActiveScaffold.InPlaceEditor = Class.create(Ajax.InPlaceEditor, {
1103
1145
  this._form.appendChild(this._controls.editor);
1104
1146
 
1105
1147
  $A(patternNodes.additionalNodes).each(function(node) {
1106
- var patternNode = node.cloneNode(true);
1148
+ var patternNode = $(node.cloneNode(true));
1107
1149
  if (patternNode.id.length > 0) {
1108
- patternNode.id = patternNode.id + this.options.nodeIdSuffix;
1150
+ patternNode.id = patternNode.readAttribute("data-id") + this.options.nodeIdSuffix;
1109
1151
  }
1110
1152
  this._form.appendChild(patternNode);
1111
1153
  }.bind(this));
@@ -78,6 +78,7 @@ $input_focus_bg: #ffc !default;
78
78
 
79
79
  $draggable_list_bg: #FFFF88 !default;
80
80
  $draggable_list_selected_bg: #7FCF00 !default;
81
+ $draggable_list_disabled_bg: $disabled_color !default;
81
82
  $checkbox_list_bg: #fff !default;
82
83
 
83
84
  $subform_color: #999 !default;
@@ -371,6 +372,9 @@ background-color: $draggable_list_bg;
371
372
  .active-scaffold .draggable-list.selected {
372
373
  background-color: $draggable_list_selected_bg;
373
374
  }
375
+ .active-scaffold .ui-droppable-disabled, .active-scaffold .ui-droppable-disabled.selected {
376
+ background-color: $draggable_list_disabled_bg;
377
+ }
374
378
 
375
379
 
376
380
  /* Form :: Association Sub-Forms
@@ -38,3 +38,6 @@ background-image: image-url('active_scaffold/cross.png');
38
38
  .as_touch a.inline-adapter-close {
39
39
  background-image: image-url('active_scaffold/close_touch.png');
40
40
  }
41
+ .active-scaffold .refresh-link {
42
+ background-image: image-url('active_scaffold/refresh.png');
43
+ }
@@ -79,6 +79,7 @@ padding: 5px 5px;
79
79
  margin-left: 0px;
80
80
  }
81
81
 
82
+ .active-scaffold .active-scaffold .active-scaffold-header div.actions .action_group > a,
82
83
  .active-scaffold .active-scaffold .active-scaffold-header div.actions > a {
83
84
  padding: 1px 5px;
84
85
  }
@@ -256,7 +257,7 @@ padding: 0;
256
257
  position: absolute;
257
258
  line-height: 200%;
258
259
  display: none;
259
- width: 150px;
260
+ min-width: 150px;
260
261
  right: 0px;
261
262
  z-index: 2;
262
263
  }
@@ -715,6 +716,15 @@ padding: 1px;
715
716
  border: solid 1px;
716
717
  }
717
718
 
719
+ .active-scaffold .refresh-link {
720
+ display: inline-block;
721
+ width: 25px;
722
+ text-indent: 26px;
723
+ overflow: hidden;
724
+ background-position: 5px 50%;
725
+ background-repeat: no-repeat;
726
+ }
727
+
718
728
  .active-scaffold .checkbox-list {
719
729
  padding-left: 0px;
720
730
  }
@@ -727,6 +737,11 @@ display: inline;
727
737
  .active-scaffold .checkbox-list li label {
728
738
  padding: 0 0 0 2px;
729
739
  }
740
+ .active-scaffold .checkbox-list + .refresh-link {
741
+ float: left;
742
+ }
743
+
744
+ .active-scaffold .draggable-lists + .loading-indicator { float: left; }
730
745
 
731
746
  .active-scaffold .draggable-list {
732
747
  float: left;
@@ -749,6 +764,12 @@ display: block;
749
764
  li.draggable-item {
750
765
  list-style: none;
751
766
  }
767
+ li.draggable-item, li.draggable-item label {
768
+ cursor: move;
769
+ }
770
+ li.ui-draggable-disabled, li.ui-draggable-disabled label {
771
+ cursor: default;
772
+ }
752
773
  li.draggable-item input,
753
774
  .active-scaffold .draggable-list input {
754
775
  display: none;
@@ -788,7 +809,7 @@ padding: 0 5px 0 1px;
788
809
  background: none;
789
810
  }
790
811
 
791
- .active-scaffold .horizontal-sub-form td dt label {
812
+ .active-scaffold .horizontal-sub-form td > dl > dt label {
792
813
  display: none;
793
814
  }
794
815
 
@@ -17,7 +17,7 @@ options = {:id => element_form_id(:action => :add_existing),
17
17
  <% end -%>
18
18
 
19
19
  <label for="<%= "record_#{active_scaffold_config.model}" %>"><%= active_scaffold_add_existing_label %></label>
20
- <%= active_scaffold_add_existing_input(:name => 'associated_id', :url_options => url_options) %>
20
+ <%= active_scaffold_add_existing_input(:name => 'associated_id', :url_options => url_options, :object => @record) %>
21
21
 
22
22
  <p class="form-footer">
23
23
  <%= submit_tag as_(:add), :class => "submit" %>
@@ -26,5 +26,3 @@ options = {:id => element_form_id(:action => :add_existing),
26
26
  </p>
27
27
 
28
28
  </form>
29
- <%= javascript_tag("ActiveScaffold.focus_first_element_of_form('#{element_form_id(:action => :add_existing)}');") %>
30
-
@@ -14,10 +14,13 @@
14
14
  method ||= :post
15
15
  cancel_link = true if cancel_link.nil?
16
16
  submit_text ||= form_action
17
- body_partial ||= 'form' %>
17
+ apply_text ||= :"#{form_action}_apply"
18
+ body_partial ||= 'form'
19
+ form_id = element_form_id(:action => form_action, :id => @record.try(:id))
20
+ %>
18
21
  <%=
19
22
  options = {:onsubmit => onsubmit,
20
- :id => element_form_id(:action => form_action),
23
+ :id => form_id,
21
24
  :multipart => multipart,
22
25
  :class => "as_form #{form_action.to_s}",
23
26
  :method => method,
@@ -43,11 +46,10 @@ end
43
46
 
44
47
  <p class="form-footer">
45
48
  <%= submit_tag as_(submit_text), :class => "submit" if !persistent || persistent == :optional %>
46
- <%= submit_tag as_(:apply), :class => "submit", :name => 'dont_close' if persistent %>
49
+ <%= submit_tag as_(apply_text), :class => "submit", :name => 'dont_close' if persistent %>
47
50
  <%= link_to(as_(:cancel), main_path_to_return, cancel_options) if cancel_link %>
48
- <%= loading_indicator_tag(:action => form_action, :id => params[:id]) %>
51
+ <%= loading_indicator_tag(:action => form_action, :id => @record.try(:id)) %>
49
52
  <%= render :partial => footer_extension, :locals => { :form_action => form_action } if footer_extension %>
50
53
  </p>
51
54
 
52
55
  </form>
53
- <%= javascript_tag("ActiveScaffold.focus_first_element_of_form('#{element_form_id(:action => form_action)}');") %>