activeadmin 1.4.3 → 2.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of activeadmin might be problematic. Click here for more details.

Files changed (164) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +70 -10
  3. data/CONTRIBUTING.md +12 -11
  4. data/README.md +34 -8
  5. data/app/assets/javascripts/active_admin/base.es6 +23 -0
  6. data/app/assets/javascripts/active_admin/ext/jquery-ui.es6 +7 -0
  7. data/app/assets/javascripts/active_admin/ext/jquery.es6 +9 -0
  8. data/app/assets/javascripts/active_admin/initializers/datepicker.es6 +16 -0
  9. data/app/assets/javascripts/active_admin/initializers/filters.es6 +45 -0
  10. data/app/assets/javascripts/active_admin/initializers/tabs.es6 +6 -0
  11. data/app/assets/javascripts/active_admin/lib/active_admin.es6 +41 -0
  12. data/app/assets/javascripts/active_admin/lib/batch_actions.es6 +55 -0
  13. data/app/assets/javascripts/active_admin/lib/checkbox-toggler.es6 +49 -0
  14. data/app/assets/javascripts/active_admin/lib/dropdown-menu.es6 +123 -0
  15. data/app/assets/javascripts/active_admin/lib/has_many.es6 +95 -0
  16. data/app/assets/javascripts/active_admin/lib/modal_dialog.es6 +61 -0
  17. data/app/assets/javascripts/active_admin/lib/per_page.es6 +47 -0
  18. data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.es6 +36 -0
  19. data/app/assets/stylesheets/active_admin/_forms.scss +2 -14
  20. data/app/assets/stylesheets/active_admin/components/_status_tags.scss +0 -5
  21. data/app/assets/stylesheets/active_admin/components/_tabs.scss +1 -1
  22. data/app/assets/stylesheets/active_admin/mixins/_gradients.scss +1 -1
  23. data/app/views/active_admin/devise/confirmations/new.html.erb +1 -1
  24. data/app/views/active_admin/devise/passwords/edit.html.erb +1 -1
  25. data/app/views/active_admin/devise/passwords/new.html.erb +1 -1
  26. data/app/views/active_admin/devise/registrations/new.html.erb +1 -2
  27. data/app/views/active_admin/devise/shared/_error_messages.html.erb +15 -0
  28. data/app/views/active_admin/devise/unlocks/new.html.erb +1 -1
  29. data/app/views/layouts/active_admin_logged_out.html.erb +1 -1
  30. data/config/locales/bg.yml +0 -1
  31. data/config/locales/he.yml +0 -1
  32. data/config/locales/hu.yml +4 -0
  33. data/config/locales/lt.yml +2 -2
  34. data/config/locales/uk.yml +2 -0
  35. data/docs/0-installation.md +2 -2
  36. data/docs/13-authorization-adapter.md +4 -4
  37. data/docs/CNAME +1 -1
  38. data/docs/index.html +2 -2
  39. data/lib/active_admin.rb +9 -4
  40. data/lib/active_admin/application.rb +8 -14
  41. data/lib/active_admin/application_settings.rb +3 -0
  42. data/lib/active_admin/asset_registration.rb +0 -8
  43. data/lib/active_admin/base_controller.rb +6 -6
  44. data/lib/active_admin/base_controller/authorization.rb +2 -4
  45. data/lib/active_admin/batch_actions/controller.rb +1 -1
  46. data/lib/active_admin/batch_actions/resource_extension.rb +4 -4
  47. data/lib/active_admin/callbacks.rb +1 -1
  48. data/lib/active_admin/csv_builder.rb +1 -1
  49. data/lib/active_admin/dependency.rb +1 -77
  50. data/lib/active_admin/dsl.rb +1 -8
  51. data/lib/active_admin/error.rb +1 -1
  52. data/lib/active_admin/filters/active_filter.rb +3 -1
  53. data/lib/active_admin/filters/active_sidebar.rb +5 -1
  54. data/lib/active_admin/filters/forms.rb +2 -2
  55. data/lib/active_admin/filters/formtastic_addons.rb +1 -1
  56. data/lib/active_admin/filters/resource_extension.rb +3 -3
  57. data/lib/active_admin/form_builder.rb +3 -3
  58. data/lib/active_admin/generators/boilerplate.rb +1 -1
  59. data/lib/active_admin/helpers/scope_chain.rb +1 -0
  60. data/lib/active_admin/inputs/datepicker_input.rb +1 -1
  61. data/lib/active_admin/inputs/filters/base/search_method_select.rb +2 -2
  62. data/lib/active_admin/menu_item.rb +1 -1
  63. data/lib/active_admin/namespace.rb +2 -2
  64. data/lib/active_admin/namespace_settings.rb +7 -4
  65. data/lib/active_admin/orm/active_record/comments.rb +4 -4
  66. data/lib/active_admin/orm/active_record/comments/comment.rb +2 -2
  67. data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +10 -5
  68. data/lib/active_admin/page_dsl.rb +1 -1
  69. data/lib/active_admin/pundit_adapter.rb +13 -4
  70. data/lib/active_admin/resource.rb +2 -2
  71. data/lib/active_admin/resource/action_items.rb +1 -1
  72. data/lib/active_admin/resource/attributes.rb +7 -4
  73. data/lib/active_admin/resource/menu.rb +3 -3
  74. data/lib/active_admin/resource/naming.rb +3 -3
  75. data/lib/active_admin/resource/routes.rb +9 -4
  76. data/lib/active_admin/resource/scopes.rb +3 -3
  77. data/lib/active_admin/resource/sidebars.rb +1 -1
  78. data/lib/active_admin/resource_collection.rb +2 -2
  79. data/lib/active_admin/resource_controller/action_builder.rb +10 -0
  80. data/lib/active_admin/resource_controller/resource_class_methods.rb +2 -0
  81. data/lib/active_admin/resource_dsl.rb +5 -3
  82. data/lib/active_admin/router.rb +1 -1
  83. data/lib/active_admin/scope.rb +4 -4
  84. data/lib/active_admin/settings_node.rb +1 -1
  85. data/lib/active_admin/version.rb +1 -1
  86. data/lib/active_admin/view_helpers.rb +1 -1
  87. data/lib/active_admin/view_helpers/display_helper.rb +10 -2
  88. data/lib/active_admin/view_helpers/download_format_links_helper.rb +1 -0
  89. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +2 -0
  90. data/lib/active_admin/views.rb +1 -1
  91. data/lib/active_admin/views/components/active_admin_form.rb +7 -1
  92. data/lib/active_admin/views/components/attributes_table.rb +3 -3
  93. data/lib/active_admin/views/components/paginated_collection.rb +1 -1
  94. data/lib/active_admin/views/components/sidebar_section.rb +0 -3
  95. data/lib/active_admin/views/components/status_tag.rb +1 -18
  96. data/lib/active_admin/views/components/table_for.rb +2 -2
  97. data/lib/active_admin/views/components/tabs.rb +11 -2
  98. data/lib/active_admin/views/footer.rb +1 -1
  99. data/lib/active_admin/views/index_as_table.rb +5 -4
  100. data/lib/active_admin/views/pages/base.rb +3 -0
  101. data/lib/generators/active_admin/assets/assets_generator.rb +2 -2
  102. data/lib/generators/active_admin/assets/templates/active_admin.js +1 -0
  103. data/lib/generators/active_admin/install/install_generator.rb +6 -2
  104. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +20 -1
  105. data/lib/generators/active_admin/install/templates/dashboard.rb +2 -3
  106. data/lib/generators/active_admin/install/templates/migrations/create_active_admin_comments.rb.erb +1 -15
  107. data/lib/generators/active_admin/page/page_generator.rb +1 -1
  108. data/lib/generators/active_admin/resource/resource_generator.rb +1 -1
  109. data/lib/ransack_ext.rb +3 -3
  110. data/vendor/assets/javascripts/jquery-ui/form-reset-mixin.js +80 -0
  111. data/vendor/assets/javascripts/jquery-ui/form.js +22 -0
  112. data/vendor/assets/javascripts/jquery-ui/labels.js +65 -0
  113. data/vendor/assets/javascripts/jquery-ui/widgets/checkboxradio.js +274 -283
  114. metadata +107 -96
  115. data/.circleci/config.yml +0 -572
  116. data/.github/ISSUE_TEMPLATE.md +0 -20
  117. data/.gitignore +0 -16
  118. data/.mdlrc +0 -1
  119. data/.rspec +0 -1
  120. data/.rspec_parallel +0 -2
  121. data/.rubocop.yml +0 -99
  122. data/.simplecov +0 -9
  123. data/.yardopts +0 -7
  124. data/Gemfile +0 -30
  125. data/Gemfile.common +0 -26
  126. data/Gemfile.lock +0 -433
  127. data/Rakefile +0 -24
  128. data/activeadmin.gemspec +0 -32
  129. data/app/assets/javascripts/active_admin/base.js.coffee +0 -13
  130. data/app/assets/javascripts/active_admin/ext/jquery-ui.js.coffee +0 -6
  131. data/app/assets/javascripts/active_admin/ext/jquery.js.coffee +0 -7
  132. data/app/assets/javascripts/active_admin/initializers/batch_actions.js.coffee +0 -11
  133. data/app/assets/javascripts/active_admin/initializers/datepicker.js.coffee +0 -14
  134. data/app/assets/javascripts/active_admin/initializers/filters.js.coffee +0 -26
  135. data/app/assets/javascripts/active_admin/initializers/tabs.js.coffee +0 -7
  136. data/app/assets/javascripts/active_admin/lib/batch_actions.js.coffee +0 -42
  137. data/app/assets/javascripts/active_admin/lib/checkbox-toggler.js.coffee +0 -46
  138. data/app/assets/javascripts/active_admin/lib/dropdown-menu.js.coffee +0 -104
  139. data/app/assets/javascripts/active_admin/lib/flash.js.coffee +0 -19
  140. data/app/assets/javascripts/active_admin/lib/has_many.js.coffee +0 -79
  141. data/app/assets/javascripts/active_admin/lib/modal_dialog.js.coffee +0 -45
  142. data/app/assets/javascripts/active_admin/lib/per_page.js.coffee +0 -46
  143. data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.js.coffee +0 -22
  144. data/bin/install_chromedriver.sh +0 -17
  145. data/config/i18n-tasks.yml +0 -26
  146. data/config/mdl_style.rb +0 -11
  147. data/cucumber.yml +0 -7
  148. data/gemfiles/rails_42.gemfile +0 -10
  149. data/gemfiles/rails_42.gemfile.lock +0 -339
  150. data/gemfiles/rails_50.gemfile +0 -10
  151. data/gemfiles/rails_50.gemfile.lock +0 -353
  152. data/gemfiles/rails_51.gemfile +0 -10
  153. data/gemfiles/rails_51.gemfile.lock +0 -353
  154. data/lib/active_admin/event.rb +0 -24
  155. data/lib/active_admin/helpers/output_safety_helper.rb +0 -35
  156. data/lib/bug_report_templates/active_admin_master.rb +0 -111
  157. data/lib/generators/active_admin/assets/templates/active_admin.js.coffee +0 -1
  158. data/tasks/application_generator.rb +0 -50
  159. data/tasks/docs.rake +0 -64
  160. data/tasks/gemfiles.rake +0 -8
  161. data/tasks/lint.rake +0 -110
  162. data/tasks/local.rake +0 -27
  163. data/tasks/release.rake +0 -6
  164. data/tasks/test.rake +0 -42
@@ -0,0 +1,55 @@
1
+ const onDOMReady = function() {
2
+ //
3
+ // Use ActiveAdmin.modal_dialog to prompt user if
4
+ // confirmation is required for current Batch Action
5
+ //
6
+ $('.batch_actions_selector li a').click(function(event){
7
+ let message;
8
+ event.stopPropagation(); // prevent Rails UJS click event
9
+ event.preventDefault();
10
+ if ((message = $(this).data('confirm'))) {
11
+ ActiveAdmin.modal_dialog(message, $(this).data('inputs'), inputs => {
12
+ $(this).trigger('confirm:complete', inputs);
13
+ });
14
+ } else {
15
+ $(this).trigger('confirm:complete');
16
+ }
17
+ });
18
+
19
+ $('.batch_actions_selector li a').on('confirm:complete', function(event, inputs){
20
+ let val;
21
+ if ((val = JSON.stringify(inputs))) {
22
+ $('#batch_action_inputs').removeAttr('disabled').val(val);
23
+ } else {
24
+ $('#batch_action_inputs').attr('disabled', 'disabled');
25
+ }
26
+
27
+ $('#batch_action').val($(this).data('action'));
28
+ $('#collection_selection').submit();
29
+ });
30
+
31
+ //
32
+ // Add checkbox selection to resource tables and lists if batch actions are enabled
33
+ //
34
+
35
+ if ($(".batch_actions_selector").length && $(":checkbox.toggle_all").length) {
36
+
37
+ if ($(".paginated_collection table.index_table").length) {
38
+ $(".paginated_collection table.index_table").tableCheckboxToggler();
39
+ } else {
40
+ $(".paginated_collection").checkboxToggler();
41
+ }
42
+
43
+ $(document).on('change', '.paginated_collection :checkbox', function() {
44
+ if ($(".paginated_collection :checkbox:checked").length && $(".dropdown_menu_list").children().length) {
45
+ $(".batch_actions_selector").each(function() { $(this).aaDropdownMenu("enable"); });
46
+ } else {
47
+ $(".batch_actions_selector").each(function() { $(this).aaDropdownMenu("disable"); });
48
+ }
49
+ });
50
+ }
51
+ };
52
+
53
+ $(document).
54
+ ready(onDOMReady).
55
+ on('page:load turbolinks:load', onDOMReady);
@@ -0,0 +1,49 @@
1
+ ActiveAdmin.CheckboxToggler = class CheckboxToggler {
2
+ constructor(options, container){
3
+ this.options = options;
4
+ this.container = container;
5
+ this._init();
6
+ this._bind();
7
+ }
8
+
9
+ option(key, value) {
10
+ }
11
+
12
+ _init() {
13
+ if (!this.container) {
14
+ throw new Error('Container element not found');
15
+ } else {
16
+ this.$container = $(this.container);
17
+ }
18
+
19
+ if (!this.$container.find('.toggle_all').length) {
20
+ throw new Error('"toggle all" checkbox not found');
21
+ } else {
22
+ this.toggle_all_checkbox = this.$container.find('.toggle_all');
23
+ }
24
+
25
+ this.checkboxes = this.$container.find(':checkbox').not(this.toggle_all_checkbox);
26
+ }
27
+
28
+ _bind() {
29
+ this.checkboxes.change(event => this._didChangeCheckbox(event.target));
30
+ this.toggle_all_checkbox.change(() => this._didChangeToggleAllCheckbox());
31
+ }
32
+
33
+ _didChangeCheckbox(checkbox){
34
+ const numChecked = this.checkboxes.filter(':checked').length;
35
+
36
+ const allChecked = numChecked === this.checkboxes.length;
37
+ const someChecked = (numChecked > 0) && (numChecked < this.checkboxes.length);
38
+
39
+ this.toggle_all_checkbox.prop({ checked: allChecked, indeterminate: someChecked });
40
+ }
41
+
42
+ _didChangeToggleAllCheckbox() {
43
+ const setting = this.toggle_all_checkbox.prop('checked');
44
+ this.checkboxes.prop({ checked: setting });
45
+ return setting;
46
+ }
47
+ };
48
+
49
+ $.widget.bridge('checkboxToggler', ActiveAdmin.CheckboxToggler);
@@ -0,0 +1,123 @@
1
+ ActiveAdmin.DropdownMenu = class DropdownMenu {
2
+
3
+ constructor(options, element) {
4
+ this.options = options;
5
+ this.element = element;
6
+ this.$element = $(this.element);
7
+
8
+ const defaults = {
9
+ fadeInDuration: 20,
10
+ fadeOutDuration: 100,
11
+ onClickActionItemCallback: null
12
+ };
13
+
14
+ this.options = $.extend(defaults, this.options);
15
+ this.isOpen = false;
16
+
17
+ this.$menuButton = this.$element.find('.dropdown_menu_button');
18
+ this.$menuList = this.$element.find('.dropdown_menu_list_wrapper');
19
+
20
+ this._buildMenuList();
21
+ this._bind();
22
+ }
23
+
24
+ open() {
25
+ this.isOpen = true;
26
+ this.$menuList.fadeIn(this.options.fadeInDuration);
27
+
28
+ this._position();
29
+ return this;
30
+ }
31
+
32
+ close() {
33
+ this.isOpen = false;
34
+ this.$menuList.fadeOut(this.options.fadeOutDuration);
35
+ return this;
36
+ }
37
+
38
+ destroy() {
39
+ this.$element = null;
40
+ return this;
41
+ }
42
+
43
+ isDisabled() {
44
+ return this.$menuButton.hasClass('disabled');
45
+ }
46
+
47
+ disable() {
48
+ this.$menuButton.addClass('disabled');
49
+ }
50
+
51
+ enable() {
52
+ this.$menuButton.removeClass('disabled');
53
+ }
54
+
55
+ option(key, value) {
56
+ if ($.isPlainObject(key)) {
57
+ return this.options = $.extend(true, this.options, key);
58
+ } else if (key != null) {
59
+ return this.options[key];
60
+ } else {
61
+ return this.options[key] = value;
62
+ }
63
+ }
64
+
65
+ _buildMenuList() {
66
+ this.$nipple = $('<div class="dropdown_menu_nipple"></div>');
67
+ this.$menuList.prepend(this.$nipple);
68
+ this.$menuList.hide();
69
+ }
70
+
71
+ _bind() {
72
+ $('body').click(() => {
73
+ if (this.isOpen) { this.close(); }
74
+ });
75
+
76
+ this.$menuButton.click(() => {
77
+ if (!this.isDisabled()) {
78
+ if (this.isOpen) {
79
+ this.close();
80
+ } else {
81
+ this.open();
82
+ }
83
+ }
84
+ return false;
85
+ });
86
+ }
87
+
88
+ _position() {
89
+ this.$menuList.css('top', this.$menuButton.position().top + this.$menuButton.outerHeight() + 10);
90
+
91
+ const button_left = this.$menuButton.position().left;
92
+ const button_center = this.$menuButton.outerWidth() / 2;
93
+ const button_right = button_left + (button_center * 2);
94
+ const menu_center = this.$menuList.outerWidth() / 2;
95
+ const nipple_center = this.$nipple.outerWidth() / 2;
96
+ const window_right = $(window).width();
97
+
98
+ const centered_menu_left = (button_left + button_center) - menu_center;
99
+ const centered_menu_right = button_left + button_center + menu_center;
100
+
101
+ if (centered_menu_left < 0) {
102
+ // Left align with button
103
+ this.$menuList.css('left', button_left);
104
+ this.$nipple.css('left', button_center - nipple_center);
105
+ } else if (centered_menu_right > window_right) {
106
+ // Right align with button
107
+ this.$menuList.css('right', window_right - button_right);
108
+ this.$nipple.css('right', button_center - nipple_center);
109
+ } else {
110
+ // Center align under button
111
+ this.$menuList.css('left', centered_menu_left);
112
+ this.$nipple.css('left', menu_center - nipple_center);
113
+ }
114
+ }
115
+ };
116
+
117
+ $.widget.bridge('aaDropdownMenu', ActiveAdmin.DropdownMenu);
118
+
119
+ const onDOMReady = () => $('.dropdown_menu').aaDropdownMenu();
120
+
121
+ $(document).
122
+ ready(onDOMReady).
123
+ on('page:load turbolinks:load', onDOMReady);
@@ -0,0 +1,95 @@
1
+ $(function() {
2
+ // Provides a before-removal hook:
3
+ // $ ->
4
+ // # This is a good place to tear down JS plugins to prevent memory leaks.
5
+ // $(document).on 'has_many_remove:before', '.has_many_container', (e, fieldset, container)->
6
+ // fieldset.find('.select2').select2 'destroy'
7
+ //
8
+ // # If you need to do anything after removing the items you can use the
9
+ // has_many_remove:after hook
10
+ // $(document).on 'has_many_remove:after', '.has_many_container', (e, fieldset, container)->
11
+ // list_item_count = container.find('.has_many_fields').length
12
+ // alert("There are now #{list_item_count} items in the list")
13
+ //
14
+ $(document).on('click', 'a.button.has_many_remove', function(event){
15
+ event.preventDefault();
16
+ const parent = $(this).closest('.has_many_container');
17
+ const to_remove = $(this).closest('fieldset');
18
+ recompute_positions(parent);
19
+
20
+ parent.trigger('has_many_remove:before', [to_remove, parent]);
21
+ to_remove.remove();
22
+ return parent.trigger('has_many_remove:after', [to_remove, parent]);
23
+ });
24
+
25
+ // Provides before and after creation hooks:
26
+ // $ ->
27
+ // # The before hook allows you to prevent the creation of new records.
28
+ // $(document).on 'has_many_add:before', '.has_many_container', (e, container)->
29
+ // if $(@).children('fieldset').length >= 3
30
+ // alert "you've reached the maximum number of items"
31
+ // e.preventDefault()
32
+ //
33
+ // # The after hook is a good place to initialize JS plugins and the like.
34
+ // $(document).on 'has_many_add:after', '.has_many_container', (e, fieldset, container)->
35
+ // fieldset.find('select').chosen()
36
+ //
37
+ $(document).on('click', 'a.button.has_many_add', function(event){
38
+ let before_add;
39
+ event.preventDefault();
40
+ const parent = $(this).closest('.has_many_container');
41
+ parent.trigger((before_add = $.Event('has_many_add:before')), [parent]);
42
+
43
+ if (!before_add.isDefaultPrevented()) {
44
+ let index = parent.data('has_many_index') || (parent.children('fieldset').length - 1);
45
+ parent.data({has_many_index: ++index});
46
+
47
+ const regex = new RegExp($(this).data('placeholder'), 'g');
48
+ const html = $(this).data('html').replace(regex, index);
49
+
50
+ const fieldset = $(html).insertBefore(this);
51
+ recompute_positions(parent);
52
+ return parent.trigger('has_many_add:after', [fieldset, parent]);
53
+ }
54
+ });
55
+
56
+ $(document).on('change', '.has_many_container[data-sortable] :input[name$="[_destroy]"]', function() {
57
+ recompute_positions($(this).closest('.has_many'));
58
+ });
59
+
60
+ init_sortable();
61
+ $(document).on('has_many_add:after', '.has_many_container', init_sortable);
62
+ });
63
+
64
+ var init_sortable = function() {
65
+ const elems = $('.has_many_container[data-sortable]:not(.ui-sortable)');
66
+ elems.sortable({
67
+ items: '> fieldset',
68
+ handle: '> ol > .handle',
69
+ start: (ev, ui) => {
70
+ ui.item.css({opacity: 0.3});
71
+ },
72
+ stop: function (ev, ui) {
73
+ ui.item.css({opacity: 1.0});
74
+ recompute_positions($(this));
75
+ }
76
+ });
77
+ elems.each(recompute_positions);
78
+ };
79
+
80
+ var recompute_positions = function(parent){
81
+ parent = parent instanceof jQuery ? parent : $(this);
82
+ const input_name = parent.data('sortable');
83
+ let position = parseInt(parent.data('sortable-start') || 0, 10);
84
+
85
+ parent.children('fieldset').each(function() {
86
+ // We ignore nested inputs, so when defining your has_many, be sure to keep
87
+ // your sortable input at the root of the has_many block.
88
+ const destroy_input = $(this).find("> ol > .input > :input[name$='[_destroy]']");
89
+ const sortable_input = $(this).find(`> ol > .input > :input[name$='[${input_name}]']`);
90
+
91
+ if (sortable_input.length) {
92
+ sortable_input.val(destroy_input.is(':checked') ? '' : position++);
93
+ }
94
+ });
95
+ };
@@ -0,0 +1,61 @@
1
+ ActiveAdmin.modal_dialog = function(message, inputs, callback){
2
+ let html = `<form id="dialog_confirm" title="${message}"><ul>`;
3
+ for (let name in inputs) {
4
+ var elem, opts, wrapper;
5
+ let type = inputs[name];
6
+ if (/^(datepicker|checkbox|text|number)$/.test(type)) {
7
+ wrapper = 'input';
8
+ } else if (type === 'textarea') {
9
+ wrapper = 'textarea';
10
+ } else if ($.isArray(type)) {
11
+ [wrapper, elem, opts, type] = ['select', 'option', type, ''];
12
+ } else {
13
+ throw new Error(`Unsupported input type: {${name}: ${type}}`);
14
+ }
15
+
16
+ let klass = type === 'datepicker' ? type : '';
17
+ html += `<li>
18
+ <label>${name.charAt(0).toUpperCase() + name.slice(1)}</label>
19
+ <${wrapper} name="${name}" class="${klass}" type="${type}">` +
20
+ (opts ? ((() => {
21
+ const result = [];
22
+
23
+ opts.forEach(v => {
24
+ const $elem = $(`<${elem}/>`);
25
+ if ($.isArray(v)) {
26
+ $elem.text(v[0]).val(v[1]);
27
+ } else {
28
+ $elem.text(v);
29
+ }
30
+ result.push($elem.wrap('<div>').parent().html());
31
+ });
32
+
33
+ return result;
34
+ })()).join('') : '') +
35
+ `</${wrapper}>` +
36
+ "</li>";
37
+ [wrapper, elem, opts, type, klass] = []; // unset any temporary variables
38
+ }
39
+
40
+ html += "</ul></form>";
41
+
42
+ const form = $(html).appendTo('body');
43
+ $('body').trigger('modal_dialog:before_open', [form]);
44
+
45
+ form.dialog({
46
+ modal: true,
47
+ open(event, ui) {
48
+ $('body').trigger('modal_dialog:after_open', [form]);
49
+ },
50
+ dialogClass: 'active_admin_dialog',
51
+ buttons: {
52
+ OK() {
53
+ callback($(this).serializeObject());
54
+ $(this).dialog('close');
55
+ },
56
+ Cancel() {
57
+ $(this).dialog('close').remove();
58
+ }
59
+ }
60
+ });
61
+ };
@@ -0,0 +1,47 @@
1
+ (($, ActiveAdmin) => {
2
+
3
+ class PerPage {
4
+ constructor(element) {
5
+ this.element = element;
6
+ }
7
+
8
+ update() {
9
+ const params = ActiveAdmin
10
+ .queryStringToParams()
11
+ .filter(({name}) => name != 'per_page' || name != 'page')
12
+
13
+ params.push({ name: 'per_page', value: this.element.value });
14
+
15
+ if (ActiveAdmin.turbolinks) {
16
+ ActiveAdmin.turbolinksVisit(params);
17
+ } else {
18
+ window.location.search = ActiveAdmin.toQueryString(params);
19
+ }
20
+ }
21
+
22
+ static _jQueryInterface(config) {
23
+ return this.each(function () {
24
+ const $this = $(this)
25
+ let data = $this.data('perPage')
26
+
27
+ if (!data) {
28
+ data = new PerPage(this)
29
+ $this.data('perPage', data)
30
+ }
31
+
32
+ if (config === 'update') {
33
+ data[config]()
34
+ }
35
+ })
36
+ }
37
+ };
38
+
39
+ $(document).
40
+ on('change', '.pagination_per_page > select', function(event) {
41
+ PerPage._jQueryInterface.call($(this), 'update')
42
+ });
43
+
44
+ $.fn['perPage'] = PerPage._jQueryInterface
45
+ $.fn['perPage'].Constructor = PerPage
46
+
47
+ })(jQuery, window.activeadmin);
@@ -0,0 +1,36 @@
1
+ ActiveAdmin.TableCheckboxToggler = class TableCheckboxToggler extends ActiveAdmin.CheckboxToggler {
2
+ _bind() {
3
+ super._bind(...arguments);
4
+
5
+ this.$container
6
+ .find('tbody td')
7
+ .click(event => {
8
+ if (event.target.type !== 'checkbox') {
9
+ this._didClickCell(event.target);
10
+ }
11
+ });
12
+ }
13
+
14
+ _didChangeCheckbox(checkbox) {
15
+ super._didChangeCheckbox(...arguments);
16
+
17
+ $(checkbox)
18
+ .parents('tr')
19
+ .toggleClass('selected', checkbox.checked);
20
+ }
21
+
22
+ _didChangeToggleAllCheckbox() {
23
+ this.$container
24
+ .find('tbody tr')
25
+ .toggleClass('selected', super._didChangeToggleAllCheckbox(...arguments));
26
+ }
27
+
28
+ _didClickCell(cell) {
29
+ $(cell)
30
+ .parent('tr')
31
+ .find(':checkbox')
32
+ .click();
33
+ }
34
+ };
35
+
36
+ $.widget.bridge('tableCheckboxToggler', ActiveAdmin.TableCheckboxToggler);