activeadmin 1.4.3 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +92 -11
- data/CONTRIBUTING.md +12 -11
- data/README.md +34 -8
- data/app/assets/javascripts/active_admin/base.es6 +23 -0
- data/app/assets/javascripts/active_admin/ext/jquery-ui.es6 +7 -0
- data/app/assets/javascripts/active_admin/ext/jquery.es6 +9 -0
- data/app/assets/javascripts/active_admin/initializers/datepicker.es6 +16 -0
- data/app/assets/javascripts/active_admin/initializers/filters.es6 +45 -0
- data/app/assets/javascripts/active_admin/initializers/tabs.es6 +6 -0
- data/app/assets/javascripts/active_admin/lib/active_admin.es6 +41 -0
- data/app/assets/javascripts/active_admin/lib/batch_actions.es6 +55 -0
- data/app/assets/javascripts/active_admin/lib/checkbox-toggler.es6 +49 -0
- data/app/assets/javascripts/active_admin/lib/dropdown-menu.es6 +123 -0
- data/app/assets/javascripts/active_admin/lib/has_many.es6 +95 -0
- data/app/assets/javascripts/active_admin/lib/modal_dialog.es6 +61 -0
- data/app/assets/javascripts/active_admin/lib/per_page.es6 +47 -0
- data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.es6 +36 -0
- data/app/assets/stylesheets/active_admin/_forms.scss +2 -14
- data/app/assets/stylesheets/active_admin/components/_status_tags.scss +0 -5
- data/app/assets/stylesheets/active_admin/components/_tabs.scss +1 -1
- data/app/assets/stylesheets/active_admin/mixins/_gradients.scss +1 -1
- data/app/views/active_admin/devise/confirmations/new.html.erb +1 -1
- data/app/views/active_admin/devise/passwords/edit.html.erb +1 -1
- data/app/views/active_admin/devise/passwords/new.html.erb +1 -1
- data/app/views/active_admin/devise/registrations/new.html.erb +1 -2
- data/app/views/active_admin/devise/shared/_error_messages.html.erb +15 -0
- data/app/views/active_admin/devise/unlocks/new.html.erb +1 -1
- data/app/views/layouts/active_admin_logged_out.html.erb +1 -1
- data/config/locales/bg.yml +0 -1
- data/config/locales/he.yml +0 -1
- data/config/locales/hu.yml +4 -0
- data/config/locales/lt.yml +2 -2
- data/config/locales/uk.yml +2 -0
- data/docs/0-installation.md +2 -2
- data/docs/13-authorization-adapter.md +4 -4
- data/docs/CNAME +1 -1
- data/docs/index.html +2 -2
- data/lib/active_admin/application.rb +8 -14
- data/lib/active_admin/application_settings.rb +3 -0
- data/lib/active_admin/asset_registration.rb +0 -8
- data/lib/active_admin/base_controller/authorization.rb +2 -4
- data/lib/active_admin/base_controller.rb +6 -6
- data/lib/active_admin/batch_actions/controller.rb +1 -1
- data/lib/active_admin/batch_actions/resource_extension.rb +4 -4
- data/lib/active_admin/callbacks.rb +1 -1
- data/lib/active_admin/csv_builder.rb +1 -1
- data/lib/active_admin/dependency.rb +7 -75
- data/lib/active_admin/dsl.rb +1 -8
- data/lib/active_admin/error.rb +1 -1
- data/lib/active_admin/filters/active_filter.rb +3 -1
- data/lib/active_admin/filters/active_sidebar.rb +5 -1
- data/lib/active_admin/filters/forms.rb +2 -2
- data/lib/active_admin/filters/formtastic_addons.rb +1 -1
- data/lib/active_admin/filters/resource_extension.rb +3 -3
- data/lib/active_admin/form_builder.rb +3 -3
- data/lib/active_admin/generators/boilerplate.rb +1 -1
- data/lib/active_admin/helpers/scope_chain.rb +1 -0
- data/lib/active_admin/inputs/datepicker_input.rb +1 -1
- data/lib/active_admin/inputs/filters/base/search_method_select.rb +2 -2
- data/lib/active_admin/menu_item.rb +1 -1
- data/lib/active_admin/namespace.rb +2 -2
- data/lib/active_admin/namespace_settings.rb +7 -4
- data/lib/active_admin/orm/active_record/comments/comment.rb +2 -2
- data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +10 -5
- data/lib/active_admin/orm/active_record/comments.rb +4 -4
- data/lib/active_admin/page_dsl.rb +1 -1
- data/lib/active_admin/pundit_adapter.rb +13 -4
- data/lib/active_admin/resource/action_items.rb +1 -1
- data/lib/active_admin/resource/attributes.rb +7 -4
- data/lib/active_admin/resource/menu.rb +3 -3
- data/lib/active_admin/resource/naming.rb +3 -3
- data/lib/active_admin/resource/routes.rb +9 -4
- data/lib/active_admin/resource/scopes.rb +3 -3
- data/lib/active_admin/resource/sidebars.rb +1 -1
- data/lib/active_admin/resource.rb +2 -2
- data/lib/active_admin/resource_collection.rb +2 -2
- data/lib/active_admin/resource_controller/action_builder.rb +10 -0
- data/lib/active_admin/resource_controller/resource_class_methods.rb +2 -0
- data/lib/active_admin/resource_dsl.rb +5 -3
- data/lib/active_admin/router.rb +1 -1
- data/lib/active_admin/scope.rb +4 -4
- data/lib/active_admin/settings_node.rb +1 -1
- data/lib/active_admin/version.rb +1 -1
- data/lib/active_admin/view_helpers/display_helper.rb +10 -2
- data/lib/active_admin/view_helpers/download_format_links_helper.rb +1 -0
- data/lib/active_admin/view_helpers/method_or_proc_helper.rb +2 -0
- data/lib/active_admin/view_helpers.rb +1 -1
- data/lib/active_admin/views/components/active_admin_form.rb +7 -1
- data/lib/active_admin/views/components/attributes_table.rb +3 -3
- data/lib/active_admin/views/components/paginated_collection.rb +1 -1
- data/lib/active_admin/views/components/sidebar_section.rb +0 -3
- data/lib/active_admin/views/components/status_tag.rb +1 -18
- data/lib/active_admin/views/components/table_for.rb +2 -2
- data/lib/active_admin/views/components/tabs.rb +11 -2
- data/lib/active_admin/views/footer.rb +1 -1
- data/lib/active_admin/views/index_as_table.rb +5 -4
- data/lib/active_admin/views/pages/base.rb +3 -0
- data/lib/active_admin/views.rb +1 -1
- data/lib/active_admin.rb +9 -4
- data/lib/generators/active_admin/assets/assets_generator.rb +2 -2
- data/lib/generators/active_admin/assets/templates/active_admin.js +1 -0
- data/lib/generators/active_admin/install/install_generator.rb +6 -2
- data/lib/generators/active_admin/install/templates/active_admin.rb.erb +20 -1
- data/lib/generators/active_admin/install/templates/dashboard.rb +2 -3
- data/lib/generators/active_admin/install/templates/migrations/create_active_admin_comments.rb.erb +1 -15
- data/lib/generators/active_admin/page/page_generator.rb +1 -1
- data/lib/generators/active_admin/resource/resource_generator.rb +1 -1
- data/lib/ransack_ext.rb +3 -3
- data/vendor/assets/javascripts/jquery-ui/form-reset-mixin.js +80 -0
- data/vendor/assets/javascripts/jquery-ui/form.js +22 -0
- data/vendor/assets/javascripts/jquery-ui/labels.js +65 -0
- data/vendor/assets/javascripts/jquery-ui/widgets/checkboxradio.js +274 -283
- metadata +106 -95
- data/.circleci/config.yml +0 -572
- data/.github/ISSUE_TEMPLATE.md +0 -20
- data/.gitignore +0 -16
- data/.mdlrc +0 -1
- data/.rspec +0 -1
- data/.rspec_parallel +0 -2
- data/.rubocop.yml +0 -99
- data/.simplecov +0 -9
- data/.yardopts +0 -7
- data/Gemfile +0 -30
- data/Gemfile.common +0 -26
- data/Gemfile.lock +0 -433
- data/Rakefile +0 -24
- data/activeadmin.gemspec +0 -32
- data/app/assets/javascripts/active_admin/base.js.coffee +0 -13
- data/app/assets/javascripts/active_admin/ext/jquery-ui.js.coffee +0 -6
- data/app/assets/javascripts/active_admin/ext/jquery.js.coffee +0 -7
- data/app/assets/javascripts/active_admin/initializers/batch_actions.js.coffee +0 -11
- data/app/assets/javascripts/active_admin/initializers/datepicker.js.coffee +0 -14
- data/app/assets/javascripts/active_admin/initializers/filters.js.coffee +0 -26
- data/app/assets/javascripts/active_admin/initializers/tabs.js.coffee +0 -7
- data/app/assets/javascripts/active_admin/lib/batch_actions.js.coffee +0 -42
- data/app/assets/javascripts/active_admin/lib/checkbox-toggler.js.coffee +0 -46
- data/app/assets/javascripts/active_admin/lib/dropdown-menu.js.coffee +0 -104
- data/app/assets/javascripts/active_admin/lib/flash.js.coffee +0 -19
- data/app/assets/javascripts/active_admin/lib/has_many.js.coffee +0 -79
- data/app/assets/javascripts/active_admin/lib/modal_dialog.js.coffee +0 -45
- data/app/assets/javascripts/active_admin/lib/per_page.js.coffee +0 -46
- data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.js.coffee +0 -22
- data/bin/install_chromedriver.sh +0 -17
- data/config/i18n-tasks.yml +0 -26
- data/config/mdl_style.rb +0 -11
- data/cucumber.yml +0 -7
- data/gemfiles/rails_42.gemfile +0 -10
- data/gemfiles/rails_42.gemfile.lock +0 -339
- data/gemfiles/rails_50.gemfile +0 -10
- data/gemfiles/rails_50.gemfile.lock +0 -353
- data/gemfiles/rails_51.gemfile +0 -10
- data/gemfiles/rails_51.gemfile.lock +0 -353
- data/lib/active_admin/event.rb +0 -24
- data/lib/active_admin/helpers/output_safety_helper.rb +0 -35
- data/lib/bug_report_templates/active_admin_master.rb +0 -111
- data/lib/generators/active_admin/assets/templates/active_admin.js.coffee +0 -1
- data/tasks/application_generator.rb +0 -50
- data/tasks/docs.rake +0 -64
- data/tasks/gemfiles.rake +0 -8
- data/tasks/lint.rake +0 -110
- data/tasks/local.rake +0 -27
- data/tasks/release.rake +0 -6
- data/tasks/test.rake +0 -42
|
@@ -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);
|
|
@@ -85,18 +85,7 @@ form {
|
|
|
85
85
|
padding: 0;
|
|
86
86
|
margin-bottom: 0;
|
|
87
87
|
|
|
88
|
-
|
|
89
|
-
position:absolute;
|
|
90
|
-
width:95%;
|
|
91
|
-
padding-top:0.1em;
|
|
92
|
-
left: 0px;
|
|
93
|
-
font-size: 100%;
|
|
94
|
-
font-weight: normal;
|
|
95
|
-
span { position:absolute; }
|
|
96
|
-
&.label label { position:absolute; }
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
&:not(.has_many_fields) ol {
|
|
88
|
+
&:not(.inputs) ol {
|
|
100
89
|
float: left;
|
|
101
90
|
width: 74%;
|
|
102
91
|
margin: 0;
|
|
@@ -108,7 +97,7 @@ form {
|
|
|
108
97
|
}
|
|
109
98
|
}
|
|
110
99
|
|
|
111
|
-
&.
|
|
100
|
+
&.inputs ol {
|
|
112
101
|
float: left;
|
|
113
102
|
width: 100%;
|
|
114
103
|
margin: 0;
|
|
@@ -335,4 +324,3 @@ form.filter_form {
|
|
|
335
324
|
}
|
|
336
325
|
a.clear_filters_btn { @include light-button; }
|
|
337
326
|
}
|
|
338
|
-
|
|
@@ -6,11 +6,6 @@
|
|
|
6
6
|
padding: 3px 5px 2px 5px;
|
|
7
7
|
font-size: 0.8em;
|
|
8
8
|
|
|
9
|
-
// TODO: deprecated, remove in a v2 release
|
|
10
|
-
&.ok, &.published, &.complete, &.completed, &.green { background: #8daa92; }
|
|
11
|
-
&.warn, &.warning, &.orange { background: #e29b20; }
|
|
12
|
-
&.error, &.errored, &.red { background: #d45f53; }
|
|
13
|
-
|
|
14
9
|
&.yes { background: #6090DB }
|
|
15
10
|
&.no { background: grey }
|
|
16
11
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<div id="login">
|
|
2
2
|
<h2><%= active_admin_application.site_title(self) %> <%= title t('active_admin.devise.resend_confirmation_instructions.title') %></h2>
|
|
3
3
|
|
|
4
|
-
<%=
|
|
4
|
+
<%= render partial: "active_admin/devise/shared/error_messages", resource: resource %>
|
|
5
5
|
<%= active_admin_form_for(resource, as: resource_name, url: confirmation_path(resource_name), html: { method: :post }) do |f|
|
|
6
6
|
f.inputs do
|
|
7
7
|
f.input :email
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<div id="login">
|
|
2
2
|
<h2><%= active_admin_application.site_title(self) %> <%= title t('active_admin.devise.change_password.title') %></h2>
|
|
3
3
|
|
|
4
|
-
<%=
|
|
4
|
+
<%= render partial: "active_admin/devise/shared/error_messages", resource: resource %>
|
|
5
5
|
<%= active_admin_form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :put }) do |f|
|
|
6
6
|
f.inputs do
|
|
7
7
|
f.input :password
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<div id="login">
|
|
2
2
|
<h2><%= active_admin_application.site_title(self) %> <%= title t('active_admin.devise.reset_password.title') %></h2>
|
|
3
3
|
|
|
4
|
-
<%=
|
|
4
|
+
<%= render partial: "active_admin/devise/shared/error_messages", resource: resource %>
|
|
5
5
|
<%= active_admin_form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :post }) do |f|
|
|
6
6
|
f.inputs do
|
|
7
7
|
f.input :email
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
<h2><%= active_admin_application.site_title(self) %> <%= title t('active_admin.devise.sign_up.title') %></h2>
|
|
3
3
|
|
|
4
4
|
<% scope = Devise::Mapping.find_scope!(resource_name) %>
|
|
5
|
-
<%=
|
|
5
|
+
<%= render partial: "active_admin/devise/shared/error_messages", resource: resource %>
|
|
6
6
|
<%= active_admin_form_for(resource, as: resource_name, url: send(:"#{scope}_registration_path"), html: { id: "registration_new" }) do |f|
|
|
7
7
|
f.inputs do
|
|
8
8
|
resource.class.authentication_keys.each_with_index { |key, index|
|
|
@@ -19,4 +19,3 @@
|
|
|
19
19
|
|
|
20
20
|
<%= render partial: "active_admin/devise/shared/links" %>
|
|
21
21
|
</div>
|
|
22
|
-
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<% if resource.errors.any? %>
|
|
2
|
+
<div id="error_explanation">
|
|
3
|
+
<h2>
|
|
4
|
+
<%= I18n.t("errors.messages.not_saved",
|
|
5
|
+
count: resource.errors.count,
|
|
6
|
+
resource: resource.class.model_name.human.downcase)
|
|
7
|
+
%>
|
|
8
|
+
</h2>
|
|
9
|
+
<ul>
|
|
10
|
+
<% resource.errors.full_messages.each do |message| %>
|
|
11
|
+
<li><%= message %></li>
|
|
12
|
+
<% end %>
|
|
13
|
+
</ul>
|
|
14
|
+
</div>
|
|
15
|
+
<% end %>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<div id="login">
|
|
2
2
|
<h2><%= active_admin_application.site_title(self) %> <%= title t('active_admin.devise.unlock.title') %></h2>
|
|
3
3
|
|
|
4
|
-
<%=
|
|
4
|
+
<%= render partial: "active_admin/devise/shared/error_messages", resource: resource %>
|
|
5
5
|
<%= active_admin_form_for(resource, as: resource_name, url: unlock_path(resource_name), html: { method: :post }) do |f|
|
|
6
6
|
f.inputs do
|
|
7
7
|
f.input :email
|
data/config/locales/bg.yml
CHANGED
data/config/locales/he.yml
CHANGED
data/config/locales/hu.yml
CHANGED
|
@@ -31,6 +31,10 @@ hu:
|
|
|
31
31
|
ends_with: "végződik"
|
|
32
32
|
greater_than: "Nagyobb, mint"
|
|
33
33
|
less_than: "Kisebb, mint"
|
|
34
|
+
gteq_datetime: "Nagyobb vagy egyenlő, mint"
|
|
35
|
+
lteq_datetime: "Kisebb vagy egyenlő, mint"
|
|
36
|
+
from: "-tól"
|
|
37
|
+
to: "-ig"
|
|
34
38
|
status_tag:
|
|
35
39
|
"yes": "Igen"
|
|
36
40
|
"no": "Nem"
|
data/config/locales/lt.yml
CHANGED
|
@@ -53,8 +53,8 @@ lt:
|
|
|
53
53
|
empty: '%{model} nerastas'
|
|
54
54
|
one: 'Rodoma <B> 1 </ b> %{model}'
|
|
55
55
|
one_page: 'Rodoma <b>visi %{n} </ b> %{model}'
|
|
56
|
-
multiple: 'Rodomi %{model} <b>%{
|
|
57
|
-
multiple_without_total: 'Rodomi %{model} <b>%{
|
|
56
|
+
multiple: 'Rodomi %{model} <b>%{from} - %{to} </ b> iš<b>%{total} </ b> iš viso'
|
|
57
|
+
multiple_without_total: 'Rodomi %{model} <b>%{from} - %{to} </ b> '
|
|
58
58
|
per_page: "Puslapyje: "
|
|
59
59
|
entry:
|
|
60
60
|
one: 'įrašas'
|
data/config/locales/uk.yml
CHANGED
data/docs/0-installation.md
CHANGED
|
@@ -11,7 +11,7 @@ gem 'activeadmin'
|
|
|
11
11
|
|
|
12
12
|
# Plus integrations with:
|
|
13
13
|
gem 'devise'
|
|
14
|
-
gem '
|
|
14
|
+
gem 'cancancan'
|
|
15
15
|
gem 'draper'
|
|
16
16
|
gem 'pundit'
|
|
17
17
|
```
|
|
@@ -44,7 +44,7 @@ After installing the gem, you need to run the generator. Here are your options:
|
|
|
44
44
|
The generator adds these core files, among others:
|
|
45
45
|
|
|
46
46
|
* `app/admin/dashboard.rb`
|
|
47
|
-
* `app/assets/javascripts/active_admin.js
|
|
47
|
+
* `app/assets/javascripts/active_admin.js`
|
|
48
48
|
* `app/assets/stylesheets/active_admin.scss`
|
|
49
49
|
* `config/initializers/active_admin.rb`
|
|
50
50
|
|
|
@@ -180,8 +180,7 @@ end
|
|
|
180
180
|
|
|
181
181
|
Sub-classing `ActiveAdmin::AuthorizationAdapter` is fairly low level. Many times
|
|
182
182
|
it's nicer to have a simpler DSL for managing authorization. Active Admin
|
|
183
|
-
provides an adapter out of the box for [
|
|
184
|
-
and [CanCanCan](https://github.com/CanCanCommunity/cancancan).
|
|
183
|
+
provides an adapter out of the box for [CanCanCan](https://github.com/CanCanCommunity/cancancan).
|
|
185
184
|
|
|
186
185
|
To use the CanCan adapter, update the configuration in the Active Admin
|
|
187
186
|
initializer:
|
|
@@ -221,7 +220,7 @@ changed from the initializer:
|
|
|
221
220
|
config.cancan_ability_class = "MyCustomAbility"
|
|
222
221
|
```
|
|
223
222
|
|
|
224
|
-
Now you can simply use
|
|
223
|
+
Now you can simply use CanCanCan the way that you would expect and
|
|
225
224
|
Active Admin will use it for authorization:
|
|
226
225
|
|
|
227
226
|
```ruby
|
|
@@ -240,7 +239,6 @@ end
|
|
|
240
239
|
```
|
|
241
240
|
|
|
242
241
|
To view more details about the API's, visit project pages of
|
|
243
|
-
[CanCan](https://github.com/ryanb/cancan) and
|
|
244
242
|
[CanCanCan](https://github.com/CanCanCommunity/cancancan).
|
|
245
243
|
|
|
246
244
|
## Using the Pundit Adapter
|
|
@@ -283,3 +281,5 @@ policy](https://github.com/activeadmin/activeadmin/blob/master/spec/support/temp
|
|
|
283
281
|
in your application instead of default one generated by Pundit's
|
|
284
282
|
`rails g pundit:install` command.
|
|
285
283
|
|
|
284
|
+
In addition, there are [example policies](https://github.com/activeadmin/activeadmin/tree/master/spec/support/templates/policies/active_admin)
|
|
285
|
+
for restricting access to ActiveAdmin's pages and comments.
|
data/docs/CNAME
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
activeadmin.info
|
data/docs/index.html
CHANGED
|
@@ -102,12 +102,12 @@
|
|
|
102
102
|
<span class="n">column</span> <span class="s2">"Price"</span><span class="p">,</span> <span class="ss">sortable:</span> <span class="ss">:price</span> <span class="k">do</span> <span class="o">|</span><span class="n">product</span><span class="o">|</span>
|
|
103
103
|
<span class="n">number_to_currency</span> <span class="n">product</span><span class="o">.</span><span class="n">price</span>
|
|
104
104
|
<span class="k">end</span>
|
|
105
|
-
<span class="n">
|
|
105
|
+
<span class="n">actions</span>
|
|
106
106
|
<span class="k">end</span>
|
|
107
107
|
|
|
108
108
|
<span class="k">end</span>
|
|
109
109
|
</code>
|
|
110
|
-
</pre>
|
|
110
|
+
</pre>
|
|
111
111
|
</div>
|
|
112
112
|
</div>
|
|
113
113
|
<h2 class="getting-started-heading">
|