active_scaffold 3.3.3 → 3.4.0

Sign up to get free protection for your applications and to get access to all the features.
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)}');") %>