active_scaffold 3.2.20 → 3.3.0.rc

Sign up to get free protection for your applications and to get access to all the features.
Files changed (152) hide show
  1. data/CHANGELOG +19 -13
  2. data/README +66 -0
  3. data/app/assets/javascripts/jquery/active_scaffold.js +156 -113
  4. data/app/assets/javascripts/jquery/active_scaffold_chosen.js +11 -0
  5. data/app/assets/javascripts/jquery/date_picker_bridge.js.erb +0 -1
  6. data/app/assets/javascripts/jquery/jquery.editinplace.js +132 -128
  7. data/app/assets/javascripts/prototype/active_scaffold.js +68 -25
  8. data/{frontends/default/views/_horizontal_subform_footer.html.erb → app/assets/javascripts/prototype/active_scaffold_chosen.js} +0 -0
  9. data/app/assets/stylesheets/active_scaffold_colors.css.scss +8 -1
  10. data/app/assets/stylesheets/active_scaffold_layout.css +14 -8
  11. data/{frontends/default/views → app/views/active_scaffold_overrides}/_add_existing_form.html.erb +0 -0
  12. data/{frontends/default/views → app/views/active_scaffold_overrides}/_base_form.html.erb +0 -0
  13. data/{frontends/default/views → app/views/active_scaffold_overrides}/_create_form.html.erb +0 -0
  14. data/{frontends/default/views → app/views/active_scaffold_overrides}/_create_form_on_list.html.erb +0 -0
  15. data/{frontends/default/views → app/views/active_scaffold_overrides}/_field_search.html.erb +0 -0
  16. data/{frontends/default/views → app/views/active_scaffold_overrides}/_form.html.erb +0 -0
  17. data/{frontends/default/views → app/views/active_scaffold_overrides}/_form_association.html.erb +8 -3
  18. data/{frontends/default/views → app/views/active_scaffold_overrides}/_form_association_footer.html.erb +5 -4
  19. data/app/views/active_scaffold_overrides/_form_association_record.html.erb +85 -0
  20. data/app/views/active_scaffold_overrides/_form_attribute.html.erb +23 -0
  21. data/{frontends/default/views → app/views/active_scaffold_overrides}/_form_hidden_attribute.html.erb +0 -0
  22. data/{frontends/default/views → app/views/active_scaffold_overrides}/_form_messages.html.erb +0 -0
  23. data/app/views/active_scaffold_overrides/_horizontal_subform.html.erb +12 -0
  24. data/app/views/active_scaffold_overrides/_horizontal_subform_footer.html.erb +0 -0
  25. data/{frontends/default/views → app/views/active_scaffold_overrides}/_horizontal_subform_header.html.erb +3 -2
  26. data/{frontends/default/views → app/views/active_scaffold_overrides}/_human_conditions.html.erb +0 -0
  27. data/app/views/active_scaffold_overrides/_list.html.erb +35 -0
  28. data/{frontends/default/views → app/views/active_scaffold_overrides}/_list_calculations.html.erb +0 -0
  29. data/{frontends/default/views → app/views/active_scaffold_overrides}/_list_column_headings.html.erb +0 -0
  30. data/app/views/active_scaffold_overrides/_list_header.html.erb +8 -0
  31. data/{frontends/default/views → app/views/active_scaffold_overrides}/_list_inline_adapter.html.erb +0 -0
  32. data/{frontends/default/views → app/views/active_scaffold_overrides}/_list_messages.html.erb +4 -4
  33. data/{frontends/default/views → app/views/active_scaffold_overrides}/_list_pagination.html.erb +0 -0
  34. data/{frontends/default/views → app/views/active_scaffold_overrides}/_list_pagination_links.html.erb +0 -0
  35. data/app/views/active_scaffold_overrides/_list_record.html.erb +30 -0
  36. data/{frontends/default/views → app/views/active_scaffold_overrides}/_list_with_header.html.erb +0 -0
  37. data/{frontends/default/views → app/views/active_scaffold_overrides}/_messages.html.erb +0 -0
  38. data/app/views/active_scaffold_overrides/_refresh_list.js.erb +1 -0
  39. data/{frontends/default/views → app/views/active_scaffold_overrides}/_render_field.js.erb +9 -1
  40. data/{frontends/default/views → app/views/active_scaffold_overrides}/_row.html.erb +0 -0
  41. data/{frontends/default/views → app/views/active_scaffold_overrides}/_search.html.erb +0 -0
  42. data/{frontends/default/views → app/views/active_scaffold_overrides}/_search_attribute.html.erb +0 -0
  43. data/{frontends/default/views → app/views/active_scaffold_overrides}/_show.html.erb +0 -0
  44. data/{frontends/default/views → app/views/active_scaffold_overrides}/_show_columns.html.erb +0 -0
  45. data/app/views/active_scaffold_overrides/_update_actions.html.erb +9 -0
  46. data/{frontends/default/views → app/views/active_scaffold_overrides}/_update_calculations.js.erb +0 -0
  47. data/app/views/active_scaffold_overrides/_update_column.js.erb +16 -0
  48. data/{frontends/default/views → app/views/active_scaffold_overrides}/_update_form.html.erb +0 -0
  49. data/{frontends/default/views → app/views/active_scaffold_overrides}/_update_messages.js.erb +0 -0
  50. data/app/views/active_scaffold_overrides/_vertical_subform.html.erb +8 -0
  51. data/{frontends/default/views → app/views/active_scaffold_overrides}/action_confirmation.html.erb +0 -0
  52. data/{frontends/default/views → app/views/active_scaffold_overrides}/add_existing.js.erb +0 -0
  53. data/{frontends/default/views → app/views/active_scaffold_overrides}/add_existing_form.html.erb +0 -0
  54. data/{frontends/default/views → app/views/active_scaffold_overrides}/create.html.erb +0 -0
  55. data/{frontends/default/views → app/views/active_scaffold_overrides}/delete.html.erb +0 -0
  56. data/{frontends/default/views → app/views/active_scaffold_overrides}/destroy.js.erb +0 -0
  57. data/{frontends/default/views → app/views/active_scaffold_overrides}/edit_associated.js.erb +1 -1
  58. data/{frontends/default/views → app/views/active_scaffold_overrides}/field_search.html.erb +0 -0
  59. data/{frontends/default/views → app/views/active_scaffold_overrides}/form_messages.js.erb +0 -0
  60. data/{frontends/default/views → app/views/active_scaffold_overrides}/list.html.erb +0 -0
  61. data/{frontends/default/views → app/views/active_scaffold_overrides}/on_action_update.js.erb +3 -3
  62. data/{frontends/default/views → app/views/active_scaffold_overrides}/on_create.js.erb +1 -1
  63. data/{frontends/default/views → app/views/active_scaffold_overrides}/on_mark.js.erb +0 -0
  64. data/{frontends/default/views → app/views/active_scaffold_overrides}/on_update.js.erb +4 -4
  65. data/{frontends/default/views → app/views/active_scaffold_overrides}/render_field.js.erb +0 -0
  66. data/{frontends/default/views → app/views/active_scaffold_overrides}/row.js.erb +1 -1
  67. data/{frontends/default/views → app/views/active_scaffold_overrides}/search.html.erb +0 -0
  68. data/{frontends/default/views → app/views/active_scaffold_overrides}/show.html.erb +0 -0
  69. data/{frontends/default/views → app/views/active_scaffold_overrides}/update.html.erb +1 -1
  70. data/app/views/active_scaffold_overrides/update_column.js.erb +26 -0
  71. data/{frontends/default/views → app/views/active_scaffold_overrides}/update_row.js.erb +0 -0
  72. data/config/locales/de.yml +1 -0
  73. data/config/locales/en.yml +1 -0
  74. data/config/locales/es.yml +1 -0
  75. data/config/locales/fr.yml +1 -0
  76. data/config/locales/hu.yml +1 -0
  77. data/config/locales/ja.yml +1 -0
  78. data/config/locales/ru.yml +1 -0
  79. data/lib/active_scaffold.rb +14 -26
  80. data/lib/active_scaffold/actions/core.rb +14 -11
  81. data/lib/active_scaffold/actions/create.rb +3 -3
  82. data/lib/active_scaffold/actions/delete.rb +3 -0
  83. data/lib/active_scaffold/actions/list.rb +9 -6
  84. data/lib/active_scaffold/actions/mark.rb +1 -1
  85. data/lib/active_scaffold/actions/nested.rb +8 -6
  86. data/lib/active_scaffold/actions/show.rb +6 -1
  87. data/lib/active_scaffold/actions/update.rb +39 -19
  88. data/lib/active_scaffold/active_record_permissions.rb +29 -12
  89. data/lib/active_scaffold/attribute_params.rb +14 -7
  90. data/lib/active_scaffold/bridges/calendar_date_select.rb +1 -1
  91. data/lib/active_scaffold/bridges/cancan/cancan_bridge.rb +1 -2
  92. data/lib/active_scaffold/bridges/carrierwave/list_ui.rb +1 -1
  93. data/lib/active_scaffold/bridges/chosen.rb +14 -0
  94. data/lib/active_scaffold/bridges/chosen/helpers.rb +48 -0
  95. data/lib/active_scaffold/bridges/date_picker/helper.rb +7 -6
  96. data/lib/active_scaffold/bridges/dragonfly/form_ui.rb +1 -1
  97. data/lib/active_scaffold/bridges/dragonfly/list_ui.rb +1 -1
  98. data/lib/active_scaffold/bridges/file_column.rb +1 -1
  99. data/lib/active_scaffold/bridges/file_column/as_file_column_bridge.rb +1 -1
  100. data/lib/active_scaffold/bridges/file_column/file_column_helpers.rb +2 -2
  101. data/lib/active_scaffold/bridges/file_column/list_ui.rb +4 -4
  102. data/lib/active_scaffold/bridges/paperclip.rb +1 -1
  103. data/lib/active_scaffold/bridges/paperclip/form_ui.rb +1 -1
  104. data/lib/active_scaffold/bridges/paperclip/list_ui.rb +1 -1
  105. data/lib/active_scaffold/bridges/paperclip/paperclip_bridge_helpers.rb +1 -1
  106. data/lib/active_scaffold/bridges/shared/date_bridge.rb +1 -1
  107. data/lib/active_scaffold/bridges/tiny_mce/helpers.rb +1 -1
  108. data/lib/active_scaffold/config/core.rb +9 -2
  109. data/lib/active_scaffold/config/list.rb +9 -13
  110. data/lib/active_scaffold/config/nested.rb +11 -2
  111. data/lib/active_scaffold/data_structures/action_columns.rb +19 -5
  112. data/lib/active_scaffold/data_structures/action_link.rb +9 -2
  113. data/lib/active_scaffold/data_structures/action_links.rb +5 -36
  114. data/lib/active_scaffold/data_structures/column.rb +21 -21
  115. data/lib/active_scaffold/data_structures/nested_info.rb +31 -44
  116. data/lib/active_scaffold/extensions/action_controller_rescueing.rb +1 -0
  117. data/lib/active_scaffold/extensions/action_view_rendering.rb +30 -36
  118. data/lib/active_scaffold/extensions/reverse_associations.rb +10 -6
  119. data/lib/active_scaffold/extensions/routing_mapper.rb +6 -5
  120. data/lib/active_scaffold/extensions/unsaved_associated.rb +1 -1
  121. data/lib/active_scaffold/finder.rb +18 -10
  122. data/lib/active_scaffold/helpers/association_helpers.rb +21 -2
  123. data/lib/active_scaffold/helpers/controller_helpers.rb +14 -16
  124. data/lib/active_scaffold/helpers/form_column_helpers.rb +161 -21
  125. data/lib/active_scaffold/helpers/id_helpers.rb +7 -7
  126. data/lib/active_scaffold/helpers/list_column_helpers.rb +42 -92
  127. data/lib/active_scaffold/helpers/search_column_helpers.rb +10 -3
  128. data/lib/active_scaffold/helpers/show_column_helpers.rb +4 -9
  129. data/lib/active_scaffold/helpers/view_helpers.rb +278 -78
  130. data/lib/active_scaffold/version.rb +2 -2
  131. data/lib/generators/active_scaffold_controller/templates/controller.rb +1 -1
  132. data/test/bridges/paperclip_test.rb +2 -2
  133. data/vendor/assets/javascripts/jquery-ui-timepicker-addon.js +1882 -1276
  134. metadata +79 -80
  135. data/README.md +0 -67
  136. data/frontends/default/views/_action_group.html.erb +0 -24
  137. data/frontends/default/views/_form_attribute.html.erb +0 -23
  138. data/frontends/default/views/_horizontal_subform.html.erb +0 -22
  139. data/frontends/default/views/_horizontal_subform_record.html.erb +0 -43
  140. data/frontends/default/views/_list.html.erb +0 -18
  141. data/frontends/default/views/_list_actions.html.erb +0 -15
  142. data/frontends/default/views/_list_header.html.erb +0 -10
  143. data/frontends/default/views/_list_record.html.erb +0 -13
  144. data/frontends/default/views/_list_record_columns.html.erb +0 -8
  145. data/frontends/default/views/_refresh_list.js.erb +0 -1
  146. data/frontends/default/views/_update_actions.html.erb +0 -9
  147. data/frontends/default/views/_vertical_subform.html.erb +0 -12
  148. data/frontends/default/views/_vertical_subform_record.html.erb +0 -43
  149. data/frontends/default/views/refresh_list.js.erb +0 -2
  150. data/frontends/default/views/update_column.js.erb +0 -15
  151. data/lib/active_scaffold/extensions/active_record_offset.rb +0 -12
  152. data/lib/active_scaffold/extensions/nil_id_in_url_params.rb +0 -7
data/CHANGELOG CHANGED
@@ -1,16 +1,22 @@
1
- = 3.2.20
2
- - Some fixes for ruby 1.9
3
- - Some fixes for rails 3.1
4
- - Fix detection of empty for has_and_belongs_to_many on subforms
5
-
6
- = 3.2.19
7
- - Avoid crashing when between is chosen and from or to is not filled
8
-
9
- = 3.2.18
10
- - Fix add existing record with record_select
11
- - Disable link for polymorphic associations in 3.2.x, it doesn't work
12
-
13
- = 3.2.17
1
+ = master
2
+ - Unify field overrides and list_ui method signatures
3
+ - Improve performance removing some partials and adding some caching for helper overrides and UIs, and caching url generation for lists (optional)
4
+ - Drop support for rails 3.1
5
+ - Add HTML5 form fields
6
+ - Add :chosen form_ui, and :chosen and :multi_chosen search_ui
7
+ - Fix nested with has_one associations, and belongs_to associations with :list action
8
+ - Support optgroup in :select and :chosen form_ui
9
+ - Support render_form_field with multiple rows (rows with associated-record class)
10
+ - Support for updating columns, row or table after updating a column with inplace_edit
11
+ - Keep order for records in plural subforms, so new records are saved in same order as form order
12
+ - Support add_subgroup in horizontal subforms
13
+ - Improve support in helpers for using :select form_ui with polymorphic associations (needs to use a select to choose the class)
14
+ - Allow to create in nested has_many :through associations, when source association is a belongs_to
15
+ - Fix calculations using field_search with has_many includes
16
+ - Add support to ActiveScaffold.create_record_row to insert after or before of an element
17
+ - Add support for dynamic action group
18
+
19
+ = 3.2.17 (not released yet)
14
20
  - fix constraints for columns with multiple columns in search_sql
15
21
  - remove unauthorized collection links
16
22
  - copy parameters and html_options on cloning action link
data/README ADDED
@@ -0,0 +1,66 @@
1
+ ActiveScaffold Gem/Plugin by Scott Rutherford (scott@caronsoftware.com), Richard White (rrwhite@gmail.com), Lance Ivy (lance@cainlevy.net), Ed Moss, Tim Harper and Sergio Cambra (sergio@entrecables.com)
2
+
3
+ Uses DhtmlHistory by Brad Neuberg (bkn3@columbia.edu)
4
+ http://codinginparadise.org
5
+
6
+ Uses Querystring by Adam Vandenberg
7
+ http://adamv.com/dev/javascript/querystring
8
+
9
+ Uses Paginator by Bruce Williams
10
+ http://paginator.rubyforge.org/
11
+
12
+ Supports RecordSelect by Lance Ivy
13
+ http://code.google.com/p/recordselect/
14
+
15
+ == Version Information
16
+
17
+ If you want to use the gem, add to your Gemfile:
18
+ gem "active_scaffold"
19
+
20
+ In case you would like to use most recent commit:
21
+ gem 'active_scaffold', :git => 'git://github.com/activescaffold/active_scaffold.git'
22
+
23
+ 3.1.* and 3.2.* versions works with rails 3.1 and 3.2, 3.0.* versions with rails 3.0.
24
+ To use previous rails versions you will have to install the right branch as a plugin.
25
+
26
+ Active Scaffold master currently supports rails 3.1 and rails 3.2, you can use following branches for previous rails versions:
27
+ Rails 3.0.*: Active Scaffold rails-3.0
28
+ Rails 2.3.*: Active Scaffold rails-2.3 and v2.4
29
+ Rails 2.2.*: Active Scaffold rails-2.2
30
+ Rails 2.1.*: Active Scaffold rails-2.1
31
+ Rails < 2.1: Active Scaffold 1-1-stable (no guarantees)
32
+
33
+ Since Rails 2.3, render_component plugin is needed for nested and embedded scaffolds. It works with rails-2.3 branch from ewildgoose repository:
34
+ script/plugin install git://github.com/ewildgoose/render_component.git -r rails-2.3
35
+
36
+ Since Rails 3.0 render_component is not used for nesting, but is optional for embedded scaffolds.
37
+ For Rails 3.0, https://github.com/rails/verification.git is also needed, not in rails 3.1 or higher.
38
+
39
+ If you want to install as plugins under vendor/plugins, install these versions:
40
+ rails plugin install git://github.com/vhochstein/render_component.git
41
+ rails plugin install git://github.com/rails/verification.git
42
+ rails plugin install git://github.com/activescaffold/active_scaffold.git -r 'rails-3.0'
43
+
44
+ == Pick your own javascript framework
45
+
46
+ The Rails 3.0 version uses unobtrusive Javascript, so you are free to pick your javascript framework.
47
+ Out of the box Prototype or JQuery are supported for rails 3.1 and later. For rails 3.0 pick a JS file:
48
+
49
+ Prototype 1.7 (default js framework)
50
+ rails.js in git://github.com/vhochstein/prototype-ujs.git
51
+
52
+ JQuery 1.4.1, 1.4.2
53
+ https://github.com/vhochstein/jquery-ujs/raw/jquery1_4_2/src/rails.js
54
+
55
+ JQuery > 1.4.2
56
+ https://github.com/vhochstein/jquery-ujs/raw/master/src/rails.js
57
+
58
+ To configure the javascript framework when installed under vendor/plugins/
59
+ uncomment last line in config/initializers/active_scaffold.rb in order to use jquery instead of prototype.
60
+ That file is created when you install ActiveScaffold as a plugin.
61
+
62
+ To configure the javascript framework when installed as a gem:
63
+ Add a config/initializers/active_scaffold.rb containing:
64
+ ActiveScaffold.js_framework = :jquery # :prototype is the default
65
+
66
+ Released under the MIT license (included)
@@ -1,32 +1,40 @@
1
- jQuery(document).ready(function() {
2
- jQuery('form.as_form').live('ajax:beforeSend', function(event) {
1
+ jQuery(document).ready(function($) {
2
+ jQuery(document).click(function(event) {
3
+ jQuery('.action_group.dyn ul').remove();
4
+ });
5
+ jQuery(document).on('ajax:complete', '.action_group.dyn ul a', function(event) {
6
+ var action_link = ActiveScaffold.find_action_link(event.target);
7
+ if (action_link.loading_indicator) action_link.loading_indicator.css('visibility','hidden');
8
+ jQuery(event.target).closest('.action_group.dyn ul').remove();
9
+ });
10
+ jQuery(document).on('ajax:beforeSend', 'form.as_form', function(event) {
3
11
  var as_form = jQuery(this).closest("form");
4
- if (as_form.attr('data-loading') == 'true') {
12
+ if (as_form.data('loading') == true) {
5
13
  ActiveScaffold.disable_form(as_form);
6
14
  }
7
15
  return true;
8
16
  });
9
17
 
10
- jQuery('form.as_form').live('ajax:complete', function(event) {
18
+ jQuery(document).on('ajax:complete', 'form.as_form', function(event) {
11
19
  var as_form = jQuery(this).closest("form");
12
- if (as_form.attr('data-loading') == 'true') {
20
+ if (as_form.data('loading') == true) {
13
21
  ActiveScaffold.enable_form(as_form);
14
22
  }
15
23
  });
16
- jQuery('form.as_form').live('ajax:error', function(event, xhr, status, error) {
24
+ jQuery(document).on('ajax:error', 'form.as_form', function(event, xhr, status, error) {
17
25
  var as_div = jQuery(this).closest("div.active-scaffold");
18
26
  if (as_div.length) {
19
27
  ActiveScaffold.report_500_response(as_div);
20
28
  }
21
29
  });
22
- jQuery('form.as_form.as_remote_upload').live('submit', function(event) {
30
+ jQuery(document).on('submit', 'form.as_form:not([data-remote])', function(event) {
23
31
  var as_form = jQuery(this).closest("form");
24
- if (as_form.attr('data-loading') == 'true') {
32
+ if (as_form.data('loading') == true) {
25
33
  setTimeout("ActiveScaffold.disable_form('" + as_form.attr('id') + "')", 10);
26
34
  }
27
35
  return true;
28
36
  });
29
- jQuery('a.as_action').live('ajax:before', function(event) {
37
+ jQuery(document).on('ajax:before', 'a.as_action', function(event) {
30
38
  var action_link = ActiveScaffold.ActionLink.get(jQuery(this));
31
39
  if (action_link) {
32
40
  if (action_link.is_disabled()) {
@@ -38,7 +46,7 @@ jQuery(document).ready(function() {
38
46
  }
39
47
  return true;
40
48
  });
41
- jQuery('a.as_action').live('ajax:success', function(event, response) {
49
+ jQuery(document).on('ajax:success', 'a.as_action', function(event, response) {
42
50
  var action_link = ActiveScaffold.ActionLink.get(jQuery(this));
43
51
  if (action_link) {
44
52
  if (action_link.position) {
@@ -51,14 +59,14 @@ jQuery(document).ready(function() {
51
59
  }
52
60
  return true;
53
61
  });
54
- jQuery('a.as_action').live('ajax:complete', function(event) {
62
+ jQuery(document).on('ajax:complete', 'a.as_action', function(event) {
55
63
  var action_link = ActiveScaffold.ActionLink.get(jQuery(this));
56
64
  if (action_link) {
57
65
  if (action_link.loading_indicator) action_link.loading_indicator.css('visibility','hidden');
58
66
  }
59
67
  return true;
60
68
  });
61
- jQuery('a.as_action').live('ajax:error', function(event, xhr, status, error) {
69
+ jQuery(document).on('ajax:error', 'a.as_action', function(event, xhr, status, error) {
62
70
  var action_link = ActiveScaffold.ActionLink.get(jQuery(this));
63
71
  if (action_link) {
64
72
  ActiveScaffold.report_500_response(action_link.scaffold_id());
@@ -66,7 +74,7 @@ jQuery(document).ready(function() {
66
74
  }
67
75
  return true;
68
76
  });
69
- jQuery('a.as_cancel').live('ajax:before', function(event) {
77
+ jQuery(document).on('ajax:before', 'a.as_cancel', function(event) {
70
78
  var as_cancel = jQuery(this);
71
79
  var action_link = ActiveScaffold.find_action_link(as_cancel);
72
80
 
@@ -80,7 +88,7 @@ jQuery(document).ready(function() {
80
88
  }
81
89
  return true;
82
90
  });
83
- jQuery('a.as_cancel').live('ajax:success', function(event, response) {
91
+ jQuery(document).on('ajax:success', 'a.as_cancel', function(event, response) {
84
92
  var action_link = ActiveScaffold.find_action_link(jQuery(this));
85
93
 
86
94
  if (action_link) {
@@ -92,28 +100,27 @@ jQuery(document).ready(function() {
92
100
  }
93
101
  return true;
94
102
  });
95
- jQuery('a.as_cancel').live('ajax:error', function(event, xhr, status, error) {
103
+ jQuery(document).on('ajax:error', 'a.as_cancel', function(event, xhr, status, error) {
96
104
  var action_link = ActiveScaffold.find_action_link(jQuery(this));
97
105
  if (action_link) {
98
106
  ActiveScaffold.report_500_response(action_link.scaffold_id());
99
107
  }
100
108
  return true;
101
109
  });
102
- jQuery('a.as_sort').live('ajax:before', function(event) {
110
+ jQuery(document).on('ajax:before', 'a.as_sort', function(event) {
103
111
  var as_sort = jQuery(this);
104
- var history_controller_id = as_sort.attr('data-page-history');
112
+ var history_controller_id = as_sort.data('page-history');
105
113
  if (history_controller_id) addActiveScaffoldPageToHistory(as_sort.attr('href'), history_controller_id);
106
114
  as_sort.closest('th').addClass('loading');
107
115
  return true;
108
116
  });
109
- jQuery('a.as_sort').live('ajax:error', function(event, xhr, status, error) {
117
+ jQuery(document).on('ajax:error', 'a.as_sort', function(event, xhr, status, error) {
110
118
  var as_scaffold = jQuery(this).closest('.active-scaffold');
111
119
  ActiveScaffold.report_500_response(as_scaffold);
112
120
  return true;
113
121
  });
114
- jQuery('td.in_place_editor_field').live('hover', function(event) {
122
+ jQuery(document).on('hover', 'td.in_place_editor_field', function(event) {
115
123
  var td = jQuery(this), span = td.find('span.in_place_editor_field');
116
- span.data(); // $ 1.4.2 workaround
117
124
  if (event.type == 'mouseenter') {
118
125
  if (td.hasClass('empty') || typeof(span.data('editInPlace')) === 'undefined') td.find('span').addClass("hover");
119
126
  }
@@ -122,30 +129,30 @@ jQuery(document).ready(function() {
122
129
  }
123
130
  return true;
124
131
  });
125
- jQuery('td.in_place_editor_field, th.as_marked-column_heading').live('click', function(event) {
132
+ jQuery(document).on('click', 'td.in_place_editor_field, th.as_marked-column_heading', function(event) {
126
133
  var span = jQuery(this).find('span.in_place_editor_field');
127
134
  span.data('addEmptyOnCancel', jQuery(this).hasClass('empty'));
128
135
  jQuery(this).removeClass('empty');
129
136
  if (span.data('editInPlace')) span.trigger('click.editInPlace');
130
137
  else ActiveScaffold.in_place_editor_field_clicked(span);
131
138
  });
132
- jQuery('a.as_paginate').live('ajax:before',function(event) {
139
+ jQuery(document).on('ajax:before', 'a.as_paginate',function(event) {
133
140
  var as_paginate = jQuery(this);
134
- var history_controller_id = as_paginate.attr('data-page-history');
141
+ var history_controller_id = as_paginate.data('page-history');
135
142
  if (history_controller_id) addActiveScaffoldPageToHistory(as_paginate.attr('href'), history_controller_id);
136
143
  as_paginate.prevAll('img.loading-indicator').css('visibility','visible');
137
144
  return true;
138
145
  });
139
- jQuery('a.as_paginate').live('ajax:error', function(event, xhr, status, error) {
146
+ jQuery(document).on('ajax:error', 'a.as_paginate', function(event, xhr, status, error) {
140
147
  var as_scaffold = jQuery(this).closest('.active-scaffold');
141
148
  ActiveScaffold.report_500_response(as_scaffold);
142
149
  return true;
143
150
  });
144
- jQuery('a.as_paginate').live('ajax:complete', function(event) {
151
+ jQuery(document).on('ajax:complete', 'a.as_paginate', function(event) {
145
152
  jQuery(this).prevAll('img.loading-indicator').css('visibility','hidden');
146
153
  return true;
147
154
  });
148
- jQuery('a.as_add_existing, a.as_replace_existing').live('ajax:before', function(event) {
155
+ jQuery(document).on('ajax:before', 'a.as_add_existing, a.as_replace_existing', function(event) {
149
156
  var id = jQuery(this).prev().val();
150
157
  if (id) {
151
158
  if (!jQuery(this).data('href')) jQuery(this).data('href', jQuery(this).attr('href'));
@@ -153,26 +160,26 @@ jQuery(document).ready(function() {
153
160
  return true;
154
161
  } else return false;
155
162
  });
156
- jQuery('input.update_form:not(.recordselect), textarea.update_form, select.update_form').live('change', function(event) {
163
+ jQuery(document).on('change', 'input.update_form:not(.recordselect), textarea.update_form, select.update_form', function(event) {
157
164
  var element = jQuery(this);
158
165
  var value = element.is("input:checkbox:not(:checked)") ? null : element.val();
159
- ActiveScaffold.update_column(element, element.attr('data-update_url'), element.attr('data-update_send_form'), element.attr('id'), value);
166
+ ActiveScaffold.update_column(element, element.data('update_url'), element.data('update_send_form'), element.attr('id'), value);
160
167
  return true;
161
168
  });
162
- jQuery('input.recordselect.update_form').live('recordselect:change', function(event, id, label) {
169
+ jQuery(document).on('recordselect:change', 'input.recordselect.update_form', function(event, id, label) {
163
170
  var element = jQuery(this);
164
- ActiveScaffold.update_column(element, element.attr('data-update_url'), element.attr('data-update_send_form'), element.attr('id'), id);
171
+ ActiveScaffold.update_column(element, element.data('update_url'), element.data('update_send_form'), element.attr('id'), id);
165
172
  return true;
166
173
  });
167
174
 
168
- jQuery('select.as_search_range_option').live('change', function(event) {
175
+ jQuery(document).on('change', 'select.as_search_range_option', function(event) {
169
176
  var element = jQuery(this);
170
177
  ActiveScaffold[element.val() == 'BETWEEN' ? 'show' : 'hide'](element.closest('dd').find('.as_search_range_between'));
171
178
  ActiveScaffold[(element.val() == 'null' || element.val() == 'not_null') ? 'hide' : 'show'](element.attr('id').replace(/_opt/, '_numeric'));
172
179
  return true;
173
180
  });
174
181
 
175
- jQuery('select.as_search_date_time_option').live('change', function(event) {
182
+ jQuery(document).on('change', 'select.as_search_date_time_option', function(event) {
176
183
  var element = jQuery(this);
177
184
  ActiveScaffold[!(element.val() == 'PAST' || element.val() == 'FUTURE' || element.val() == 'RANGE') ? 'show' : 'hide'](element.attr('id').replace(/_opt/, '_numeric'));
178
185
  ActiveScaffold[(element.val() == 'PAST' || element.val() == 'FUTURE') ? 'show' : 'hide'](element.attr('id').replace(/_opt/, '_trend'));
@@ -180,18 +187,18 @@ jQuery(document).ready(function() {
180
187
  return true;
181
188
  });
182
189
 
183
- jQuery('select.as_update_date_operator').live('change', function(event) {
190
+ jQuery(document).on('change', 'select.as_update_date_operator', function(event) {
184
191
  ActiveScaffold[jQuery(this).val() == 'REPLACE' ? 'show' : 'hide'](jQuery(this).next());
185
192
  ActiveScaffold[jQuery(this).val() == 'REPLACE' ? 'hide' : 'show'](jQuery(this).next().next());
186
193
  return true;
187
194
  });
188
195
 
189
- jQuery('a[data-popup]').live('click', function(e) {
196
+ jQuery(document).on('click', 'a[data-popup]', function(e) {
190
197
  window.open(jQuery(this).attr('href'));
191
198
  e.preventDefault();
192
199
  });
193
200
 
194
- jQuery('.hover_click').live("click", function(event) {
201
+ jQuery(document).on("click", '.hover_click', function(event) {
195
202
  var element = jQuery(this);
196
203
  var ul_element = element.children('ul').first();
197
204
  if (ul_element.is(':visible')) {
@@ -201,7 +208,7 @@ jQuery(document).ready(function() {
201
208
  }
202
209
  return false;
203
210
  });
204
- jQuery('.hover_click a.as_action').live('click', function(event) {
211
+ jQuery(document).on('click', '.hover_click a.as_action', function(event) {
205
212
  var element = jQuery(this).closest('.hover_click');
206
213
  if (element) {
207
214
  element.find('ul').hide();
@@ -209,10 +216,11 @@ jQuery(document).ready(function() {
209
216
  return true;
210
217
  });
211
218
 
212
- jQuery('.message a.close').live('click', function(e) {
219
+ jQuery(document).on('click', '.message a.close', function(e) {
213
220
  ActiveScaffold.hide(jQuery(this).closest('.message'));
214
221
  e.preventDefault();
215
222
  });
223
+
216
224
  });
217
225
 
218
226
  /* Simple Inheritance
@@ -288,7 +296,7 @@ jQuery(document).ready(function() {
288
296
  */
289
297
 
290
298
  if (typeof(jQuery.fn.delayedObserver) === 'undefined') {
291
- (function() {
299
+ (function($) {
292
300
  var delayedObserverStack = [];
293
301
  var observed;
294
302
 
@@ -334,7 +342,7 @@ if (typeof(jQuery.fn.delayedObserver) === 'undefined') {
334
342
  });
335
343
  }
336
344
  });
337
- })();
345
+ })(jQuery);
338
346
  };
339
347
 
340
348
 
@@ -434,9 +442,10 @@ var ActiveScaffold = {
434
442
  return element;
435
443
  },
436
444
 
437
- remove: function(element) {
445
+ remove: function(element, callback) {
438
446
  if (typeof(element) == 'string') element = '#' + element;
439
447
  jQuery(element).remove();
448
+ if (callback) callback();
440
449
  },
441
450
 
442
451
  update_inplace_edit: function(element, value, empty) {
@@ -460,22 +469,23 @@ var ActiveScaffold = {
460
469
  jQuery(element).get(0).reset();
461
470
  },
462
471
 
463
- disable_form: function(as_form) {
472
+ disable_form: function(as_form, skip_loading_indicator) {
464
473
  if (typeof(as_form) == 'string') as_form = '#' + as_form;
465
474
  as_form = jQuery(as_form)
466
475
  var loading_indicator = jQuery('#' + as_form.attr('id').replace(/-form$/, '-loading-indicator'));
467
- if (loading_indicator) loading_indicator.css('visibility','visible');
476
+ if (!skip_loading_indicator && loading_indicator) loading_indicator.css('visibility','visible');
468
477
  jQuery('input[type=submit]', as_form).attr('disabled', 'disabled');
469
- as_form[0].disabled_fields = jQuery("input:enabled,select:enabled,textarea:enabled", as_form).attr('disabled', 'disabled');
478
+ // data-remote-disabled attr instead of set data because is used to in selector later
479
+ jQuery("input:enabled,select:enabled,textarea:enabled", as_form).attr('disabled', 'disabled').attr('data-remove-disabled', true);
470
480
  },
471
481
 
472
- enable_form: function(as_form) {
482
+ enable_form: function(as_form, skip_loading_indicator) {
473
483
  if (typeof(as_form) == 'string') as_form = '#' + as_form;
474
484
  as_form = jQuery(as_form)
475
485
  var loading_indicator = jQuery('#' + as_form.attr('id').replace(/-form$/, '-loading-indicator'));
476
- if (loading_indicator) loading_indicator.css('visibility','hidden');
486
+ if (!skip_loading_indicator && loading_indicator) loading_indicator.css('visibility','hidden');
477
487
  jQuery('input[type=submit]', as_form).removeAttr('disabled');
478
- as_form[0].disabled_fields.removeAttr('disabled');
488
+ jQuery("input[data-remove-disabled],select[data-remove-disabled],textarea[data-remove-disabled]", as_form).removeAttr('disabled data-remove-disabled');
479
489
  },
480
490
 
481
491
  focus_first_element_of_form: function(form_element) {
@@ -498,11 +508,24 @@ var ActiveScaffold = {
498
508
  } else {
499
509
  new_row = tbody.append(html).children().last();
500
510
  }
511
+ } else if (typeof options.insert_at == 'object') {
512
+ var insert_method, get_method, row, id;
513
+ if (options.insert_at.after) {
514
+ insert_method = 'after';
515
+ get_method = 'next';
516
+ } else {
517
+ insert_method = 'before';
518
+ get_method = 'prev';
519
+ }
520
+ if (id = options.insert_at[insert_method]) row = tbody.children('#' + id);
521
+ if (row && row.length) {
522
+ new_row = row[insert_method](html)[get_method]();
523
+ }
501
524
  }
502
525
  this.stripe(tbody);
503
526
  this.hide_empty_message(tbody);
504
527
  this.increment_record_count(tbody.closest('div.active-scaffold'));
505
- ActiveScaffold.highlight(new_row);
528
+ this.highlight(new_row);
506
529
  },
507
530
 
508
531
  create_record_row_from_url: function(active_scaffold_id, url, options) {
@@ -525,26 +548,17 @@ var ActiveScaffold = {
525
548
  }
526
549
  }
527
550
 
528
- row.remove();
529
- this.stripe(tbody);
530
- this.decrement_record_count(tbody.closest('div.active-scaffold'));
531
- this.reload_if_empty(tbody, page_reload_url);
551
+ ActiveScaffold.remove(row, function() {
552
+ ActiveScaffold.stripe(tbody);
553
+ ActiveScaffold.decrement_record_count(tbody.closest('div.active-scaffold'));
554
+ ActiveScaffold.reload_if_empty(tbody, page_reload_url);
555
+ });
532
556
  },
533
557
 
534
558
  delete_subform_record: function(record) {
535
559
  if (typeof(record) == 'string') record = '#' + record;
536
- record = jQuery(record);
537
- var errors = record.prev();
538
- if (errors.hasClass('association-record-errors')) {
539
- this.remove(errors);
540
- }
541
- var associated = jQuery(record).next();
560
+ record = jQuery(record).closest('.sub-form-record');
542
561
  this.remove(record);
543
- while (associated.hasClass('associated-record')) {
544
- record = associated;
545
- associated = jQuery(record).next();
546
- this.remove(record);
547
- }
548
562
  },
549
563
 
550
564
  report_500_response: function(active_scaffold_id) {
@@ -562,6 +576,13 @@ var ActiveScaffold = {
562
576
  element = jQuery(element);
563
577
  return ActiveScaffold.ActionLink.get(element.is('.actions a') ? element : element.closest('.as_adapter'));
564
578
  },
579
+
580
+ display_dynamic_action_group: function(link, html) {
581
+ if (typeof(link) == 'string') link = jQuery('#' + link);
582
+ link.next('ul').remove();
583
+ link.closest('td').addClass('action_group dyn');
584
+ link.after(html);
585
+ },
565
586
 
566
587
  scroll_to: function(element, checkInViewport) {
567
588
  if (typeof checkInViewport == 'undefined') checkInViewport = true;
@@ -578,18 +599,23 @@ var ActiveScaffold = {
578
599
  },
579
600
 
580
601
  process_checkbox_inplace_edit: function(checkbox, options) {
581
- var checked = checkbox.is(':checked');
602
+ var checked = checkbox.is(':checked'), td = checkbox.closest('td');
582
603
  if (checked === true) options['params'] += '&value=1';
583
604
  jQuery.ajax({
584
605
  url: options.url,
585
606
  type: "POST",
586
607
  data: options['params'],
587
608
  dataType: options.ajax_data_type,
588
- after: function(request){
609
+ beforeSend: function(request, settings) {
610
+ if (options.beforeSend) options.beforeSend.call(checkbox, request, settings);
589
611
  checkbox.attr('disabled', 'disabled');
612
+ td.closest('tr').find('td.actions .loading-indicator').css('visibility','visible');
590
613
  },
591
614
  complete: function(request){
592
615
  checkbox.removeAttr('disabled');
616
+ },
617
+ success: function(request){
618
+ td.closest('tr').find('td.actions .loading-indicator').css('visibility','hidden');
593
619
  }
594
620
  });
595
621
  },
@@ -637,16 +663,18 @@ var ActiveScaffold = {
637
663
  content = jQuery(content);
638
664
  if (options.singular == false) {
639
665
  if (!(options.id && jQuery('#' + options.id).size() > 0)) {
640
- var new_element = element.append(content);
641
- content.trigger('as:element_updated');
666
+ var tfoot = element.find('tfoot');
667
+ if (tfoot.length) tfoot.before(content);
668
+ else element.append(content);
669
+ content.trigger('as:element_created');
642
670
  }
643
671
  } else {
644
- var current = jQuery('#' + element.attr('id') + ' .association-record')
672
+ var current = jQuery('#' + element.attr('id') + ' .sub-form-record')
645
673
  if (current[0]) {
646
674
  this.replace(current[0], content);
647
675
  } else {
648
676
  element.prepend(content);
649
- content.trigger('as:element_updated');
677
+ content.trigger('as:element_created');
650
678
  }
651
679
  }
652
680
  },
@@ -654,7 +682,7 @@ var ActiveScaffold = {
654
682
  render_form_field: function(source, content, options) {
655
683
  if (typeof(source) == 'string') source = '#' + source;
656
684
  var source = jQuery(source);
657
- var element = source.closest('.association-record');
685
+ var element = source.closest('.association-record').nextUntil('.association-record').andSelf();
658
686
  if (element.length == 0) {
659
687
  element = source.closest('form > ol.form');
660
688
  }
@@ -669,21 +697,6 @@ var ActiveScaffold = {
669
697
  }
670
698
  },
671
699
 
672
- sortable: function(element, controller, options, url_params) {
673
- if (typeof(element) == 'string') element = '#' + element;
674
- var element = jQuery(element);
675
- var sortable_options = jQuery.extend({}, options);
676
- if (options.update === true) {
677
- url_params.authenticity_token = jQuery('meta[name=csrf-param]').attr('content');
678
- sortable_options.update = function(event, ui) {
679
- var url = controller + '/' + options.action + '?'
680
- url += jQuery(this).sortable('serialize',{key: encodeURIComponent(jQuery(this).attr('id') + '[]'), expression:/^[^_-](?:[A-Za-z0-9_-]*)-(.*)-row$/});
681
- jQuery.post(url.append_params(url_params));
682
- }
683
- }
684
- element.sortable(sortable_options);
685
- },
686
-
687
700
  record_select_onselect: function(edit_associated_url, active_scaffold_id, id){
688
701
  jQuery.ajax({
689
702
  url: edit_associated_url.split('--ID--').join(id),
@@ -721,7 +734,6 @@ var ActiveScaffold = {
721
734
  },
722
735
 
723
736
  in_place_editor_field_clicked: function(span) {
724
- span.data(); // $ 1.4.2 workaround
725
737
  // test editor is open
726
738
  if (typeof(span.data('editInPlace')) === 'undefined') {
727
739
  var options = {show_buttons: true,
@@ -729,8 +741,12 @@ var ActiveScaffold = {
729
741
  element_id: 'editor_id',
730
742
  ajax_data_type: "script",
731
743
  delegate: {
732
- willCloseEditInPlace: function(span, options, enteredText) {
744
+ willCloseEditInPlace: function(span, options) {
733
745
  if (span.data('addEmptyOnCancel')) span.closest('td').addClass('empty');
746
+ span.closest('tr').find('td.actions .loading-indicator').css('visibility','visible');
747
+ },
748
+ didCloseEditInPlace: function(span, options) {
749
+ span.closest('tr').find('td.actions .loading-indicator').css('visibility','hidden');
734
750
  }
735
751
  },
736
752
  update_value: 'value'},
@@ -764,11 +780,11 @@ var ActiveScaffold = {
764
780
 
765
781
  if (csrf_param) options['params'] = csrf_param.attr('content') + '=' + csrf_token.attr('content');
766
782
 
767
- if (span.closest('div.active-scaffold').attr('data-eid')) {
783
+ if (span.closest('div.active-scaffold').data('eid')) {
768
784
  if (options['params'].length > 0) {
769
785
  options['params'] += "&";
770
786
  }
771
- options['params'] += ("eid=" + span.closest('div.active-scaffold').attr('data-eid'));
787
+ options['params'] += ("eid=" + span.closest('div.active-scaffold').data('eid'));
772
788
  }
773
789
 
774
790
  if (mode === 'clone') {
@@ -782,6 +798,26 @@ var ActiveScaffold = {
782
798
  if (column_heading.data('ie-plural')) plural = true;
783
799
  options.field_type = 'remote';
784
800
  options.editor_url = render_url.replace(/__id__/, record_id)
801
+ if (!options.delegate) options.delegate = {}
802
+ options.delegate.didOpenEditInPlace = function(dom) { dom.trigger('as:element_updated'); }
803
+ }
804
+ var actions, forms;
805
+ options.beforeSend = function(xhr, settings) {
806
+ switch (span.data('ie-update')) {
807
+ case 'update_row':
808
+ actions = span.closest('tr').find('.actions a:not(.disabled)').addClass('disabled');
809
+ break;
810
+ case 'update_table':
811
+ var table = span.closest('.as_content');
812
+ actions = table.find('.actions a:not(.disabled)').addClass('disabled');
813
+ forms = table.find('.as_form');
814
+ ActiveScaffold.disable_form(forms);
815
+ break;
816
+ }
817
+ }
818
+ options.error = options.success = function() {
819
+ if (actions) actions.removeClass('disabled');
820
+ if (forms) ActiveScaffold.enable_form(forms);
785
821
  }
786
822
  if (mode === 'inline_checkbox') {
787
823
  ActiveScaffold.process_checkbox_inplace_edit(span.find('input:checkbox'), options);
@@ -797,11 +833,13 @@ var ActiveScaffold = {
797
833
  var params = null;
798
834
 
799
835
  if (send_form) {
800
- var selector;
836
+ var selector, base = as_form;
837
+ if (send_form == 'row') base = element.closest('.association-record, form');
801
838
  if (selector = element.data('update_send_form_selector'))
802
- params = as_form.find(selector).serialize();
803
- else params = as_form.serialize();
804
- params += '&' + jQuery.param({"source_id": source_id});
839
+ params = base.find(selector).serialize();
840
+ else if (send_form != as_form) params = base.find(':input').serialize();
841
+ else base.serialize();
842
+ params += '&_method=&' + jQuery.param({"source_id": source_id});
805
843
  } else {
806
844
  params = {value: val};
807
845
  params.source_id = source_id;
@@ -810,6 +848,7 @@ var ActiveScaffold = {
810
848
  jQuery.ajax({
811
849
  url: url,
812
850
  data: params,
851
+ type: 'post',
813
852
  beforeSend: function(event) {
814
853
  element.nextAll('img.loading-indicator').css('visibility','visible');
815
854
  ActiveScaffold.disable_form(as_form);
@@ -828,7 +867,7 @@ var ActiveScaffold = {
828
867
  },
829
868
 
830
869
  draggable_lists: function(element) {
831
- jQuery('#' + element).draggable_lists();
870
+ jQuery('ul#' + element).draggable_lists();
832
871
  }
833
872
  }
834
873
 
@@ -897,15 +936,15 @@ ActiveScaffold.ActionLink = {
897
936
  element.data(); // $ 1.4.2 workaround
898
937
  if (typeof(element.data('action_link')) === 'undefined' && !element.hasClass('as_adapter')) {
899
938
  var parent = element.closest('.actions');
900
- if (parent.length === 0) {
939
+ if (parent.length === 0 || parent.is('td')) {
901
940
  // maybe an column action_link
902
- parent = element.parent();
941
+ parent = element.closest('tr.record');
903
942
  }
904
- if (parent && parent.is('td')) {
943
+ if (parent.is('tr')) {
905
944
  // record action
906
- parent = parent.closest('tr.record');
907
945
  var target = parent.find('a.as_action');
908
946
  var loading_indicator = parent.find('td.actions .loading-indicator');
947
+ if (!loading_indicator.length) loading_indicator = element.parent().find('.loading-indicator');
909
948
  new ActiveScaffold.Actions.Record(target, parent, loading_indicator);
910
949
  } else if (parent && parent.is('div')) {
911
950
  //table action
@@ -923,12 +962,12 @@ ActiveScaffold.ActionLink.Abstract = Class.extend({
923
962
  init: function(a, target, loading_indicator) {
924
963
  this.tag = jQuery(a);
925
964
  this.url = this.tag.attr('href');
926
- this.method = this.tag.attr('data-method') || 'get';
965
+ this.method = this.tag.data('method') || 'get';
927
966
  this.target = target;
928
967
  this.loading_indicator = loading_indicator;
929
968
  this.hide_target = false;
930
- this.position = this.tag.attr('data-position');
931
- this.action = this.tag.attr('data-action');
969
+ this.position = this.tag.data('position');
970
+ this.action = this.tag.data('action');
932
971
 
933
972
  this.tag.data('action_link', this);
934
973
  return this;
@@ -943,10 +982,17 @@ ActiveScaffold.ActionLink.Abstract = Class.extend({
943
982
  },
944
983
 
945
984
  close: function() {
946
- this.enable();
947
- this.adapter.remove();
948
- if (this.hide_target) this.target.show();
949
- if (ActiveScaffold.config.scroll_on_close) ActiveScaffold.scroll_to(this.target.attr('id'), ActiveScaffold.config.scroll_on_close == 'checkInViewport');
985
+ var link = this;
986
+ ActiveScaffold.remove(this.adapter, function() {
987
+ link.enable();
988
+ if (link.hide_target) link.target.show();
989
+ if (ActiveScaffold.config.scroll_on_close) ActiveScaffold.scroll_to(link.target.attr('id'), ActiveScaffold.config.scroll_on_close == 'checkInViewport');
990
+ });
991
+ },
992
+
993
+ reload: function() {
994
+ this.close();
995
+ this.open();
950
996
  },
951
997
 
952
998
  get_new_adapter_id: function() {
@@ -985,6 +1031,9 @@ ActiveScaffold.ActionLink.Abstract = Class.extend({
985
1031
  this.adapter.addClass('as_adapter');
986
1032
  this.adapter.data('action_link', this);
987
1033
  if (this.refresh_url) jQuery('.as_cancel', this.adapter).attr('href', this.refresh_url);
1034
+ },
1035
+ keep_open: function() {
1036
+ return this.tag.data('keep-open');
988
1037
  }
989
1038
  });
990
1039
 
@@ -994,7 +1043,7 @@ ActiveScaffold.ActionLink.Abstract = Class.extend({
994
1043
  ActiveScaffold.Actions.Record = ActiveScaffold.Actions.Abstract.extend({
995
1044
  instantiate_link: function(link) {
996
1045
  var l = new ActiveScaffold.ActionLink.Record(link, this.target, this.loading_indicator);
997
- var refresh = this.target.attr('data-refresh');
1046
+ var refresh = this.target.data('refresh');
998
1047
  if (refresh) l.refresh_url = refresh;
999
1048
 
1000
1049
  if (l.position) {
@@ -1010,9 +1059,8 @@ ActiveScaffold.ActionLink.Record = ActiveScaffold.ActionLink.Abstract.extend({
1010
1059
  close_previous_adapter: function() {
1011
1060
  var _this = this;
1012
1061
  jQuery.each(this.set.links, function(index, item) {
1013
- if (item.url != _this.url && item.is_disabled() && item.adapter) {
1014
- item.enable();
1015
- item.adapter.remove();
1062
+ if (item.url != _this.url && item.is_disabled() && !item.keep_open() && item.adapter) {
1063
+ ActiveScaffold.remove(item.adapter, function () { item.enable(); });
1016
1064
  }
1017
1065
  });
1018
1066
  },
@@ -1105,9 +1153,4 @@ ActiveScaffold.ActionLink.Table = ActiveScaffold.ActionLink.Abstract.extend({
1105
1153
  }
1106
1154
  ActiveScaffold.highlight(this.adapter.find('td').first().children());
1107
1155
  },
1108
-
1109
- reload: function() {
1110
- this.close();
1111
- this.open();
1112
- },
1113
1156
  });