activeadmin 1.4.3 → 2.3.1
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 +170 -11
- data/CONTRIBUTING.md +14 -15
- data/README.md +41 -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 +59 -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/kaminari/active_admin_countless/_first_page.html.erb +11 -0
- data/app/views/kaminari/active_admin_countless/_gap.html.erb +8 -0
- data/app/views/kaminari/active_admin_countless/_next_page.html.erb +11 -0
- data/app/views/kaminari/active_admin_countless/_page.html.erb +12 -0
- data/app/views/kaminari/active_admin_countless/_paginator.html.erb +24 -0
- data/app/views/kaminari/active_admin_countless/_prev_page.html.erb +11 -0
- data/app/views/layouts/active_admin_logged_out.html.erb +1 -1
- data/config/locales/ar.yml +3 -2
- data/config/locales/bg.yml +1 -1
- data/config/locales/bs.yml +1 -0
- data/config/locales/ca.yml +1 -1
- data/config/locales/cs.yml +1 -0
- data/config/locales/da.yml +1 -0
- data/config/locales/de-CH.yml +1 -0
- data/config/locales/de.yml +1 -0
- data/config/locales/el.yml +1 -0
- data/config/locales/en-CA.yml +1 -0
- data/config/locales/en-GB.yml +1 -0
- data/config/locales/en.yml +1 -0
- data/config/locales/eo.yml +1 -0
- data/config/locales/es-MX.yml +1 -0
- data/config/locales/es.yml +1 -0
- data/config/locales/fa.yml +1 -0
- data/config/locales/fi.yml +1 -0
- data/config/locales/fr.yml +2 -1
- data/config/locales/he.yml +1 -1
- data/config/locales/hr.yml +1 -0
- data/config/locales/hu.yml +5 -0
- data/config/locales/id.yml +1 -0
- data/config/locales/it.yml +1 -0
- data/config/locales/ja.yml +1 -0
- data/config/locales/ko.yml +1 -0
- data/config/locales/lt.yml +3 -2
- data/config/locales/lv.yml +1 -0
- data/config/locales/mk.yml +134 -0
- data/config/locales/nb.yml +1 -0
- data/config/locales/nl.yml +1 -0
- data/config/locales/pl.yml +1 -0
- data/config/locales/pt-BR.yml +1 -0
- data/config/locales/pt-PT.yml +1 -0
- data/config/locales/ro.yml +1 -0
- data/config/locales/ru.yml +1 -0
- data/config/locales/sk.yml +1 -0
- data/config/locales/sv-SE.yml +1 -0
- data/config/locales/tr.yml +1 -0
- data/config/locales/uk.yml +3 -0
- data/config/locales/vi.yml +1 -0
- data/config/locales/zh-CN.yml +1 -0
- data/config/locales/zh-TW.yml +1 -0
- data/docs/0-installation.md +2 -2
- data/docs/12-arbre-components.md +13 -0
- data/docs/13-authorization-adapter.md +6 -6
- data/docs/2-resource-customization.md +1 -1
- data/docs/3-index-pages/index-as-table.md +7 -0
- data/docs/CNAME +1 -1
- data/docs/Gemfile +0 -1
- data/docs/Gemfile.lock +3 -4
- data/docs/_config.yml +2 -0
- data/docs/_includes/top-menu.html +2 -2
- data/docs/index.html +109 -8
- data/docs/stylesheets/main.css +29 -0
- data/lib/active_admin.rb +10 -4
- data/lib/active_admin/application.rb +11 -18
- data/lib/active_admin/application_settings.rb +3 -0
- data/lib/active_admin/asset_registration.rb +0 -8
- data/lib/active_admin/base_controller.rb +6 -6
- data/lib/active_admin/base_controller/authorization.rb +3 -4
- data/lib/active_admin/batch_actions/controller.rb +1 -1
- data/lib/active_admin/batch_actions/resource_extension.rb +9 -5
- data/lib/active_admin/callbacks.rb +1 -1
- data/lib/active_admin/controller_action.rb +2 -1
- data/lib/active_admin/csv_builder.rb +4 -3
- data/lib/active_admin/dependency.rb +3 -75
- data/lib/active_admin/dsl.rb +1 -8
- data/lib/active_admin/error.rb +4 -2
- data/lib/active_admin/filters/active_filter.rb +5 -4
- 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 +12 -4
- 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.rb +4 -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/page_dsl.rb +1 -1
- data/lib/active_admin/page_presenter.rb +2 -1
- data/lib/active_admin/pundit_adapter.rb +18 -5
- data/lib/active_admin/resource.rb +17 -3
- data/lib/active_admin/resource/action_items.rb +1 -1
- data/lib/active_admin/resource/attributes.rb +7 -4
- data/lib/active_admin/resource/belongs_to.rb +6 -1
- data/lib/active_admin/resource/menu.rb +3 -3
- data/lib/active_admin/resource/model.rb +15 -0
- data/lib/active_admin/resource/naming.rb +3 -3
- data/lib/active_admin/resource/routes.rb +20 -7
- data/lib/active_admin/resource/scopes.rb +3 -3
- data/lib/active_admin/resource/sidebars.rb +1 -1
- data/lib/active_admin/resource_collection.rb +2 -2
- data/lib/active_admin/resource_controller.rb +2 -0
- data/lib/active_admin/resource_controller/action_builder.rb +10 -0
- data/lib/active_admin/resource_controller/polymorphic_routes.rb +36 -0
- data/lib/active_admin/resource_controller/resource_class_methods.rb +2 -0
- data/lib/active_admin/resource_dsl.rb +6 -4
- data/lib/active_admin/router.rb +3 -2
- data/lib/active_admin/scope.rb +11 -7
- data/lib/active_admin/settings_node.rb +1 -1
- data/lib/active_admin/sidebar_section.rb +3 -1
- data/lib/active_admin/version.rb +1 -1
- data/lib/active_admin/view_helpers.rb +1 -1
- data/lib/active_admin/view_helpers/breadcrumb_helper.rb +2 -2
- data/lib/active_admin/view_helpers/display_helper.rb +13 -4
- 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/views.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 +2 -2
- data/lib/active_admin/views/components/sidebar_section.rb +0 -3
- data/lib/active_admin/views/components/status_tag.rb +6 -19
- 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 +12 -4
- data/lib/active_admin/views/pages/base.rb +3 -0
- 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 +24 -2
- 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/generators/active_admin/resource/templates/admin.rb.erb +40 -37
- 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 +117 -98
- 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/active_admin/reloader.rb +0 -25
- 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,23 @@
|
|
|
1
|
+
//= require jquery3
|
|
2
|
+
//= require jquery-ui/widgets/datepicker
|
|
3
|
+
//= require jquery-ui/widgets/dialog
|
|
4
|
+
//= require jquery-ui/widgets/sortable
|
|
5
|
+
//= require jquery-ui/widgets/tabs
|
|
6
|
+
//= require jquery-ui/widget
|
|
7
|
+
//= require jquery_ujs
|
|
8
|
+
//= require_self
|
|
9
|
+
//= require ./ext/jquery
|
|
10
|
+
//= require ./ext/jquery-ui
|
|
11
|
+
//= require ./lib/active_admin
|
|
12
|
+
//= require ./lib/batch_actions
|
|
13
|
+
//= require ./lib/dropdown-menu
|
|
14
|
+
//= require ./lib/has_many
|
|
15
|
+
//= require ./lib/modal_dialog
|
|
16
|
+
//= require ./lib/per_page
|
|
17
|
+
//= require ./lib/checkbox-toggler
|
|
18
|
+
//= require ./lib/table-checkbox-toggler
|
|
19
|
+
//= require ./initializers/datepicker
|
|
20
|
+
//= require ./initializers/filters
|
|
21
|
+
//= require ./initializers/tabs
|
|
22
|
+
|
|
23
|
+
window.ActiveAdmin = {}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Short-circuits `_focusTabbable` to focus on the modal itself instead of
|
|
2
|
+
// elements inside the modal. Without this, if a datepicker is the first input,
|
|
3
|
+
// it'll immediately pop up when the modal opens.
|
|
4
|
+
// See this ticket for more info: http://bugs.jqueryui.com/ticket/4731
|
|
5
|
+
$.ui.dialog.prototype._focusTabbable = function() {
|
|
6
|
+
this.uiDialog.focus();
|
|
7
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// `serializeArray` generates => [{ name: 'foo', value: 'bar' }]
|
|
2
|
+
// This function remaps it to => { foo: 'bar' }
|
|
3
|
+
$.fn.serializeObject = function() {
|
|
4
|
+
return this.serializeArray()
|
|
5
|
+
.reduce((obj, item) => {
|
|
6
|
+
obj[item.name] = item.value
|
|
7
|
+
return obj
|
|
8
|
+
}, {});
|
|
9
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
(($) => {
|
|
2
|
+
|
|
3
|
+
$(document)
|
|
4
|
+
.on('focus', 'input.datepicker:not(.hasDatepicker)', function() {
|
|
5
|
+
const input = $(this);
|
|
6
|
+
|
|
7
|
+
// Only create datepickers in compatible browsers
|
|
8
|
+
if (input[0].type === 'date') { return; }
|
|
9
|
+
|
|
10
|
+
const defaults = { dateFormat: 'yy-mm-dd' };
|
|
11
|
+
const options = input.data('datepicker-options');
|
|
12
|
+
|
|
13
|
+
input.datepicker($.extend(defaults, options));
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
})(jQuery);
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
(($, ActiveAdmin) => {
|
|
2
|
+
|
|
3
|
+
class Filters {
|
|
4
|
+
|
|
5
|
+
static _clearForm(event) {
|
|
6
|
+
const regex = /^(q\[|q%5B|q%5b|page|utf8|commit)/;
|
|
7
|
+
const params = ActiveAdmin
|
|
8
|
+
.queryStringToParams()
|
|
9
|
+
.filter(({name}) => !name.match(regex));
|
|
10
|
+
|
|
11
|
+
event.preventDefault();
|
|
12
|
+
|
|
13
|
+
if (ActiveAdmin.turbolinks) {
|
|
14
|
+
ActiveAdmin.turbolinksVisit(params);
|
|
15
|
+
} else {
|
|
16
|
+
window.location.search = ActiveAdmin.toQueryString(params);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
static _disableEmptyInputFields(event) {
|
|
21
|
+
const params = $(this)
|
|
22
|
+
.find(':input')
|
|
23
|
+
.filter((i, input) => input.value === '')
|
|
24
|
+
.prop({ disabled: true })
|
|
25
|
+
.end()
|
|
26
|
+
.serializeArray();
|
|
27
|
+
|
|
28
|
+
if (ActiveAdmin.turbolinks) {
|
|
29
|
+
event.preventDefault();
|
|
30
|
+
ActiveAdmin.turbolinksVisit(params);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
static _setSearchType() {
|
|
35
|
+
$(this).siblings('input').prop({name: `q[${this.value}]`});
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
$(document).
|
|
41
|
+
on('click', '.clear_filters_btn', Filters._clearForm).
|
|
42
|
+
on('submit', '.filter_form', Filters._disableEmptyInputFields).
|
|
43
|
+
on('change', '.filter_form_field.select_and_search select', Filters._setSearchType);
|
|
44
|
+
|
|
45
|
+
})(jQuery, window.activeadmin);
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
((window, $) => {
|
|
2
|
+
|
|
3
|
+
class ActiveAdmin {
|
|
4
|
+
|
|
5
|
+
static get turbolinks() {
|
|
6
|
+
return (typeof Turbolinks !== 'undefined' && Turbolinks.supported);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
static turbolinksVisit(params) {
|
|
10
|
+
const path = [window.location.pathname, '?', this.toQueryString(params)].join('')
|
|
11
|
+
Turbolinks.visit(path);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
static queryString() {
|
|
15
|
+
return (window.location.search || '').replace(/^\?/, '');
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
static queryStringToParams() {
|
|
19
|
+
const decode = (value) => decodeURIComponent((value || '').replace(/\+/g, '%20'));
|
|
20
|
+
|
|
21
|
+
return this.queryString()
|
|
22
|
+
.split("&")
|
|
23
|
+
.map(pair => pair.split("="))
|
|
24
|
+
.map(([key, value]) => {
|
|
25
|
+
return { name: decode(key), value: decode(value) }
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
static toQueryString(params) {
|
|
30
|
+
const encode = (value) => encodeURIComponent(value || '');
|
|
31
|
+
|
|
32
|
+
return params
|
|
33
|
+
.map(({name, value}) => [ encode(name), encode(value) ])
|
|
34
|
+
.map(pair => pair.join('='))
|
|
35
|
+
.join('&')
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
window.activeadmin = ActiveAdmin
|
|
40
|
+
|
|
41
|
+
})(window, jQuery);
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
const onDOMReady = function() {
|
|
2
|
+
// Detach any previously attached handlers before re-attaching them.
|
|
3
|
+
// This avoids double-registered handlers when Turbolinks is enabled
|
|
4
|
+
$('.batch_actions_selector li a').off('click confirm:complete');
|
|
5
|
+
|
|
6
|
+
//
|
|
7
|
+
// Use ActiveAdmin.modal_dialog to prompt user if
|
|
8
|
+
// confirmation is required for current Batch Action
|
|
9
|
+
//
|
|
10
|
+
$('.batch_actions_selector li a').on('click', function(event){
|
|
11
|
+
let message;
|
|
12
|
+
event.stopPropagation(); // prevent Rails UJS click event
|
|
13
|
+
event.preventDefault();
|
|
14
|
+
if ((message = $(this).data('confirm'))) {
|
|
15
|
+
ActiveAdmin.modal_dialog(message, $(this).data('inputs'), inputs => {
|
|
16
|
+
$(this).trigger('confirm:complete', inputs);
|
|
17
|
+
});
|
|
18
|
+
} else {
|
|
19
|
+
$(this).trigger('confirm:complete');
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
$('.batch_actions_selector li a').on('confirm:complete', function(event, inputs){
|
|
24
|
+
let val;
|
|
25
|
+
if ((val = JSON.stringify(inputs))) {
|
|
26
|
+
$('#batch_action_inputs').removeAttr('disabled').val(val);
|
|
27
|
+
} else {
|
|
28
|
+
$('#batch_action_inputs').attr('disabled', 'disabled');
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
$('#batch_action').val($(this).data('action'));
|
|
32
|
+
$('#collection_selection').submit();
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
//
|
|
36
|
+
// Add checkbox selection to resource tables and lists if batch actions are enabled
|
|
37
|
+
//
|
|
38
|
+
|
|
39
|
+
if ($(".batch_actions_selector").length && $(":checkbox.toggle_all").length) {
|
|
40
|
+
|
|
41
|
+
if ($(".paginated_collection table.index_table").length) {
|
|
42
|
+
$(".paginated_collection table.index_table").tableCheckboxToggler();
|
|
43
|
+
} else {
|
|
44
|
+
$(".paginated_collection").checkboxToggler();
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
$(document).on('change', '.paginated_collection :checkbox', function() {
|
|
48
|
+
if ($(".paginated_collection :checkbox:checked").length && $(".dropdown_menu_list").children().length) {
|
|
49
|
+
$(".batch_actions_selector").each(function() { $(this).aaDropdownMenu("enable"); });
|
|
50
|
+
} else {
|
|
51
|
+
$(".batch_actions_selector").each(function() { $(this).aaDropdownMenu("disable"); });
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
$(document).
|
|
58
|
+
ready(onDOMReady).
|
|
59
|
+
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
|
+
};
|