activeadmin 2.4.0 → 2.5.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +43 -28
- data/CONTRIBUTING.md +47 -21
- data/app/assets/javascripts/active_admin/base.js +509 -0
- data/app/assets/stylesheets/active_admin/_base.scss +29 -29
- data/app/assets/stylesheets/active_admin/_header.scss +3 -5
- data/app/assets/stylesheets/active_admin/_mixins.scss +1 -1
- data/{vendor → app}/assets/stylesheets/active_admin/_normalize.scss +0 -0
- data/app/assets/stylesheets/active_admin/components/_tables.scss +1 -2
- data/app/assets/stylesheets/active_admin/mixins/_all.scss +8 -8
- data/app/assets/stylesheets/active_admin/mixins/_variables.scss +5 -0
- data/app/assets/stylesheets/active_admin/print.scss +2 -2
- data/app/assets/stylesheets/active_admin/structure/_main_structure.scss +1 -1
- data/app/javascript/active_admin/base.js +19 -0
- data/app/{assets/javascripts/active_admin/ext/jquery-ui.es6 → javascript/active_admin/ext/jquery-ui.js} +0 -0
- data/app/{assets/javascripts/active_admin/ext/jquery.es6 → javascript/active_admin/ext/jquery.js} +0 -0
- data/app/{assets/javascripts/active_admin/lib/batch_actions.es6 → javascript/active_admin/initializers/batch-actions.js} +4 -2
- data/app/javascript/active_admin/initializers/checkbox-toggler.js +3 -0
- data/app/{assets/javascripts/active_admin/initializers/datepicker.es6 → javascript/active_admin/initializers/datepicker.js} +0 -0
- data/app/javascript/active_admin/initializers/dropdown-menu.js +9 -0
- data/app/javascript/active_admin/initializers/filters.js +10 -0
- data/app/{assets/javascripts/active_admin/lib/has_many.es6 → javascript/active_admin/initializers/has-many.js} +0 -0
- data/app/javascript/active_admin/initializers/per-page.js +13 -0
- data/app/javascript/active_admin/initializers/table-checkbox-toggler.js +3 -0
- data/app/{assets/javascripts/active_admin/initializers/tabs.es6 → javascript/active_admin/initializers/tabs.js} +0 -0
- data/app/{assets/javascripts/active_admin/lib/checkbox-toggler.es6 → javascript/active_admin/lib/checkbox-toggler.js} +2 -2
- data/app/{assets/javascripts/active_admin/lib/dropdown-menu.es6 → javascript/active_admin/lib/dropdown-menu.js} +2 -9
- data/app/javascript/active_admin/lib/filters.js +39 -0
- data/app/{assets/javascripts/active_admin/lib/modal_dialog.es6 → javascript/active_admin/lib/modal-dialog.js} +3 -1
- data/app/javascript/active_admin/lib/per-page.js +38 -0
- data/app/{assets/javascripts/active_admin/lib/table-checkbox-toggler.es6 → javascript/active_admin/lib/table-checkbox-toggler.js} +4 -2
- data/app/javascript/active_admin/lib/utils.js +40 -0
- data/config/locales/az.yml +138 -0
- data/docs/1-general-configuration.md +20 -0
- data/docs/Gemfile.lock +55 -54
- data/lib/active_admin.rb +0 -1
- data/lib/active_admin/application.rb +1 -1
- data/lib/active_admin/filters/active_filter.rb +1 -1
- data/lib/active_admin/inputs/filters/date_range_input.rb +4 -4
- data/lib/active_admin/resource.rb +1 -1
- data/lib/active_admin/resource_controller/polymorphic_routes.rb +3 -2
- data/lib/active_admin/version.rb +1 -1
- data/lib/active_admin/views/components/paginated_collection.rb +1 -0
- data/lib/active_admin/views/components/table_for.rb +1 -0
- data/lib/active_admin/views/pages/base.rb +1 -1
- data/lib/active_admin/views/pages/index.rb +1 -0
- metadata +27 -43
- data/app/assets/images/active_admin/nested_menu_arrow.gif +0 -0
- data/app/assets/images/active_admin/nested_menu_arrow_dark.gif +0 -0
- data/app/assets/images/active_admin/orderable.png +0 -0
- data/app/assets/javascripts/active_admin/base.es6 +0 -23
- data/app/assets/javascripts/active_admin/initializers/filters.es6 +0 -45
- data/app/assets/javascripts/active_admin/lib/active_admin.es6 +0 -41
- data/app/assets/javascripts/active_admin/lib/per_page.es6 +0 -47
@@ -1,36 +1,36 @@
|
|
1
1
|
/* Active Admin CSS */
|
2
2
|
// Normalize
|
3
|
-
@import "
|
3
|
+
@import "./normalize";
|
4
4
|
|
5
5
|
// Partials
|
6
|
-
@import "
|
7
|
-
@import "
|
8
|
-
@import "
|
9
|
-
@import "
|
10
|
-
@import "
|
11
|
-
@import "
|
12
|
-
@import "
|
13
|
-
@import "
|
14
|
-
@import "
|
15
|
-
@import "
|
16
|
-
@import "
|
17
|
-
@import "
|
18
|
-
@import "
|
19
|
-
@import "
|
20
|
-
@import "
|
21
|
-
@import "
|
22
|
-
@import "
|
23
|
-
@import "
|
24
|
-
@import "
|
25
|
-
@import "
|
26
|
-
@import "
|
27
|
-
@import "
|
28
|
-
@import "
|
29
|
-
@import "
|
30
|
-
@import "
|
31
|
-
@import "
|
32
|
-
@import "
|
33
|
-
@import "
|
6
|
+
@import "./typography";
|
7
|
+
@import "./header";
|
8
|
+
@import "./forms";
|
9
|
+
@import "./components/comments";
|
10
|
+
@import "./components/flash_messages";
|
11
|
+
@import "./components/date_picker";
|
12
|
+
@import "./components/tables";
|
13
|
+
@import "./components/batch_actions";
|
14
|
+
@import "./components/modal_dialog";
|
15
|
+
@import "./components/blank_slates";
|
16
|
+
@import "./components/breadcrumbs";
|
17
|
+
@import "./components/dropdown_menu";
|
18
|
+
@import "./components/buttons";
|
19
|
+
@import "./components/grid";
|
20
|
+
@import "./components/links";
|
21
|
+
@import "./components/pagination";
|
22
|
+
@import "./components/panels";
|
23
|
+
@import "./components/columns";
|
24
|
+
@import "./components/scopes";
|
25
|
+
@import "./components/status_tags";
|
26
|
+
@import "./components/table_tools";
|
27
|
+
@import "./components/index_list";
|
28
|
+
@import "./components/unsupported_browser";
|
29
|
+
@import "./components/tabs";
|
30
|
+
@import "./pages/logged_out";
|
31
|
+
@import "./structure/footer";
|
32
|
+
@import "./structure/main_structure";
|
33
|
+
@import "./structure/title_bar";
|
34
34
|
|
35
35
|
body {
|
36
36
|
@include sans-family;
|
@@ -1,5 +1,3 @@
|
|
1
|
-
//= depend_on_asset "active_admin/nested_menu_arrow.gif"
|
2
|
-
//= depend_on_asset "active_admin/nested_menu_arrow_dark.gif"
|
3
1
|
// ----------------------------------- Header
|
4
2
|
#header {
|
5
3
|
@include primary-gradient;
|
@@ -75,12 +73,12 @@
|
|
75
73
|
}
|
76
74
|
|
77
75
|
&.has_nested > a {
|
78
|
-
background:
|
76
|
+
background: url($menu-arrow-light-icon-url) no-repeat calc(100% - 7px) 50%;
|
79
77
|
padding-right: 20px;
|
80
78
|
}
|
81
79
|
|
82
80
|
&.has_nested.current > a {
|
83
|
-
background: $current-menu-item-background
|
81
|
+
background: $current-menu-item-background url($menu-arrow-dark-icon-url) no-repeat calc(100% - 7px) 50%;
|
84
82
|
padding-right: 20px;
|
85
83
|
}
|
86
84
|
|
@@ -92,7 +90,7 @@
|
|
92
90
|
&.has_nested:hover > a {
|
93
91
|
@include rounded-top(10px);
|
94
92
|
border-bottom: 5px solid $hover-menu-item-background;
|
95
|
-
background: $hover-menu-item-background
|
93
|
+
background: $hover-menu-item-background url($menu-arrow-dark-icon-url) no-repeat calc(100% - 7px) 50%;
|
96
94
|
z-index: 1020;
|
97
95
|
}
|
98
96
|
|
@@ -1 +1 @@
|
|
1
|
-
@import "
|
1
|
+
@import "./mixins/all";
|
File without changes
|
@@ -1,4 +1,3 @@
|
|
1
|
-
//= depend_on_asset "active_admin/orderable.png"
|
2
1
|
// ----------------------------------- Tables
|
3
2
|
|
4
3
|
table tr {
|
@@ -33,7 +32,7 @@ table.index_table {
|
|
33
32
|
}
|
34
33
|
|
35
34
|
&.sortable a {
|
36
|
-
background:
|
35
|
+
background: url($orderable-icon-url) no-repeat 0 4px; padding-left: 13px;
|
37
36
|
}
|
38
37
|
|
39
38
|
&.sorted-asc a { background-position: 0 -27px; }
|
@@ -1,8 +1,8 @@
|
|
1
|
-
@import "
|
2
|
-
@import "
|
3
|
-
@import "
|
4
|
-
@import "
|
5
|
-
@import "
|
6
|
-
@import "
|
7
|
-
@import "
|
8
|
-
@import "
|
1
|
+
@import "./variables";
|
2
|
+
@import "./gradients";
|
3
|
+
@import "./shadows";
|
4
|
+
@import "./rounded";
|
5
|
+
@import "./buttons";
|
6
|
+
@import "./sections";
|
7
|
+
@import "./utilities";
|
8
|
+
@import "./typography";
|
@@ -2,6 +2,11 @@
|
|
2
2
|
// They can be overridden by prepending your own
|
3
3
|
// to 'app/assets/stylesheets/active_admin.scss'.
|
4
4
|
|
5
|
+
// Images
|
6
|
+
$menu-arrow-light-icon-url: 'data:image/png;base64,R0lGODlhBwAEAKIAAL6+vry8vIiIiJWVlf///3t7ewAAAAAAACH5BAEAAAUALAAAAAAHAAQAAAMLWLol80MoF5mQKgEAOw==' !default;
|
7
|
+
$menu-arrow-dark-icon-url: 'data:image/png;base64,R0lGODlhBwAEAKIAAG1tbWxsbElJSVBQUP///0JCQgAAAAAAACH5BAEAAAUALAAAAAAHAAQAAAMLWLol80MoF5mQKgEAOw==' !default;
|
8
|
+
$orderable-icon-url: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAABGCAYAAAAAVo4aAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAH5JREFUeNpi3LhlOwMU1AExGxDXwARYoHQLEFdD2cxAXAliMKFJgEAFEHfBJEHGMKLhMpgkTsAEdch/NNwCk2xCdiEQtML4LEgCf6EubUX3Cgh0oNvJ+P//f7wOGpUclRwYSZb41CyidNbB8giNM+9oXhmVHHm5bJjUSAABBgDKKiwMMUxPwgAAAABJRU5ErkJggg==' !default;
|
9
|
+
|
5
10
|
// Colors
|
6
11
|
$body-background-color: #FFF !default;
|
7
12
|
$primary-color: #5E6469 !default;
|
@@ -5,10 +5,10 @@ $primary-color: black;
|
|
5
5
|
$text-color: black;
|
6
6
|
|
7
7
|
// Normalize
|
8
|
-
@import "
|
8
|
+
@import "./normalize";
|
9
9
|
|
10
10
|
// Partials
|
11
|
-
@import "
|
11
|
+
@import "./typography";
|
12
12
|
|
13
13
|
body {
|
14
14
|
font-family: Helvetica, Arial, sans-serif;
|
@@ -0,0 +1,19 @@
|
|
1
|
+
import "jquery"
|
2
|
+
import "jquery-ui/ui/widgets/datepicker"
|
3
|
+
import "jquery-ui/ui/widgets/dialog"
|
4
|
+
import "jquery-ui/ui/widgets/sortable"
|
5
|
+
import "jquery-ui/ui/widgets/tabs"
|
6
|
+
import "jquery-ui/ui/widget"
|
7
|
+
import "jquery-ujs"
|
8
|
+
|
9
|
+
import "./ext/jquery"
|
10
|
+
import "./ext/jquery-ui"
|
11
|
+
import "./initializers/batch-actions"
|
12
|
+
import "./initializers/checkbox-toggler"
|
13
|
+
import "./initializers/datepicker"
|
14
|
+
import "./initializers/dropdown-menu"
|
15
|
+
import "./initializers/filters"
|
16
|
+
import "./initializers/has-many"
|
17
|
+
import "./initializers/per-page"
|
18
|
+
import "./initializers/table-checkbox-toggler"
|
19
|
+
import "./initializers/tabs"
|
File without changes
|
data/app/{assets/javascripts/active_admin/ext/jquery.es6 → javascript/active_admin/ext/jquery.js}
RENAMED
File without changes
|
@@ -1,10 +1,12 @@
|
|
1
|
+
import ModalDialog from "../lib/modal-dialog";
|
2
|
+
|
1
3
|
const onDOMReady = function() {
|
2
4
|
// Detach any previously attached handlers before re-attaching them.
|
3
5
|
// This avoids double-registered handlers when Turbolinks is enabled
|
4
6
|
$('.batch_actions_selector li a').off('click confirm:complete');
|
5
7
|
|
6
8
|
//
|
7
|
-
// Use
|
9
|
+
// Use ModalDialog to prompt user if
|
8
10
|
// confirmation is required for current Batch Action
|
9
11
|
//
|
10
12
|
$('.batch_actions_selector li a').on('click', function(event){
|
@@ -12,7 +14,7 @@ const onDOMReady = function() {
|
|
12
14
|
event.stopPropagation(); // prevent Rails UJS click event
|
13
15
|
event.preventDefault();
|
14
16
|
if ((message = $(this).data('confirm'))) {
|
15
|
-
|
17
|
+
ModalDialog(message, $(this).data('inputs'), inputs => {
|
16
18
|
$(this).trigger('confirm:complete', inputs);
|
17
19
|
});
|
18
20
|
} else {
|
File without changes
|
@@ -0,0 +1,10 @@
|
|
1
|
+
import Filters from '../lib/filters';
|
2
|
+
|
3
|
+
(($) => {
|
4
|
+
|
5
|
+
$(document).
|
6
|
+
on('click', '.clear_filters_btn', Filters._clearForm).
|
7
|
+
on('submit', '.filter_form', Filters._disableEmptyInputFields).
|
8
|
+
on('change', '.filter_form_field.select_and_search select', Filters._setSearchType);
|
9
|
+
|
10
|
+
})(jQuery);
|
File without changes
|
@@ -0,0 +1,13 @@
|
|
1
|
+
import PerPage from "../lib/per-page";
|
2
|
+
|
3
|
+
(($) => {
|
4
|
+
|
5
|
+
$(document).
|
6
|
+
on('change', '.pagination_per_page > select', function(event) {
|
7
|
+
PerPage._jQueryInterface.call($(this), 'update')
|
8
|
+
});
|
9
|
+
|
10
|
+
$.fn['perPage'] = PerPage._jQueryInterface
|
11
|
+
$.fn['perPage'].Constructor = PerPage
|
12
|
+
|
13
|
+
})(jQuery);
|
File without changes
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
class CheckboxToggler {
|
2
2
|
constructor(options, container){
|
3
3
|
this.options = options;
|
4
4
|
this.container = container;
|
@@ -46,4 +46,4 @@ ActiveAdmin.CheckboxToggler = class CheckboxToggler {
|
|
46
46
|
}
|
47
47
|
};
|
48
48
|
|
49
|
-
|
49
|
+
export default CheckboxToggler;
|
@@ -1,5 +1,4 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
class DropdownMenu {
|
3
2
|
constructor(options, element) {
|
4
3
|
this.options = options;
|
5
4
|
this.element = element;
|
@@ -114,10 +113,4 @@ ActiveAdmin.DropdownMenu = class DropdownMenu {
|
|
114
113
|
}
|
115
114
|
};
|
116
115
|
|
117
|
-
|
118
|
-
|
119
|
-
const onDOMReady = () => $('.dropdown_menu').aaDropdownMenu();
|
120
|
-
|
121
|
-
$(document).
|
122
|
-
ready(onDOMReady).
|
123
|
-
on('page:load turbolinks:load', onDOMReady);
|
116
|
+
export default DropdownMenu;
|
@@ -0,0 +1,39 @@
|
|
1
|
+
import { queryStringToParams, hasTurbolinks, turbolinksVisit, toQueryString } from '../lib/utils';
|
2
|
+
|
3
|
+
class Filters {
|
4
|
+
|
5
|
+
static _clearForm(event) {
|
6
|
+
const regex = /^(q\[|q%5B|q%5b|page|utf8|commit)/;
|
7
|
+
const params = queryStringToParams()
|
8
|
+
.filter(({name}) => !name.match(regex));
|
9
|
+
|
10
|
+
event.preventDefault();
|
11
|
+
|
12
|
+
if (hasTurbolinks()) {
|
13
|
+
turbolinksVisit(params);
|
14
|
+
} else {
|
15
|
+
window.location.search = toQueryString(params);
|
16
|
+
}
|
17
|
+
}
|
18
|
+
|
19
|
+
static _disableEmptyInputFields(event) {
|
20
|
+
const params = $(this)
|
21
|
+
.find(':input')
|
22
|
+
.filter((i, input) => input.value === '')
|
23
|
+
.prop({ disabled: true })
|
24
|
+
.end()
|
25
|
+
.serializeArray();
|
26
|
+
|
27
|
+
if (hasTurbolinks()) {
|
28
|
+
event.preventDefault();
|
29
|
+
turbolinksVisit(params);
|
30
|
+
}
|
31
|
+
}
|
32
|
+
|
33
|
+
static _setSearchType() {
|
34
|
+
$(this).siblings('input').prop({name: `q[${this.value}]`});
|
35
|
+
}
|
36
|
+
|
37
|
+
}
|
38
|
+
|
39
|
+
export default Filters;
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
function ModalDialog(message, inputs, callback){
|
2
2
|
let html = `<form id="dialog_confirm" title="${message}"><ul>`;
|
3
3
|
for (let name in inputs) {
|
4
4
|
var elem, opts, wrapper;
|
@@ -59,3 +59,5 @@ ActiveAdmin.modal_dialog = function(message, inputs, callback){
|
|
59
59
|
}
|
60
60
|
});
|
61
61
|
};
|
62
|
+
|
63
|
+
export default ModalDialog;
|
@@ -0,0 +1,38 @@
|
|
1
|
+
import { queryStringToParams, hasTurbolinks, turbolinksVisit, toQueryString } from './utils';
|
2
|
+
|
3
|
+
class PerPage {
|
4
|
+
constructor(element) {
|
5
|
+
this.element = element;
|
6
|
+
}
|
7
|
+
|
8
|
+
update() {
|
9
|
+
const params = queryStringToParams()
|
10
|
+
.filter(({name}) => name != 'per_page' || name != 'page')
|
11
|
+
|
12
|
+
params.push({ name: 'per_page', value: this.element.value });
|
13
|
+
|
14
|
+
if (hasTurbolinks()) {
|
15
|
+
turbolinksVisit(params);
|
16
|
+
} else {
|
17
|
+
window.location.search = toQueryString(params);
|
18
|
+
}
|
19
|
+
}
|
20
|
+
|
21
|
+
static _jQueryInterface(config) {
|
22
|
+
return this.each(function () {
|
23
|
+
const $this = $(this)
|
24
|
+
let data = $this.data('perPage')
|
25
|
+
|
26
|
+
if (!data) {
|
27
|
+
data = new PerPage(this)
|
28
|
+
$this.data('perPage', data)
|
29
|
+
}
|
30
|
+
|
31
|
+
if (config === 'update') {
|
32
|
+
data[config]()
|
33
|
+
}
|
34
|
+
})
|
35
|
+
}
|
36
|
+
};
|
37
|
+
|
38
|
+
export default PerPage;
|
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
import CheckboxToggler from "./checkbox-toggler";
|
2
|
+
|
3
|
+
class TableCheckboxToggler extends CheckboxToggler {
|
2
4
|
_bind() {
|
3
5
|
super._bind(...arguments);
|
4
6
|
|
@@ -33,4 +35,4 @@ ActiveAdmin.TableCheckboxToggler = class TableCheckboxToggler extends ActiveAdmi
|
|
33
35
|
}
|
34
36
|
};
|
35
37
|
|
36
|
-
|
38
|
+
export default TableCheckboxToggler;
|
@@ -0,0 +1,40 @@
|
|
1
|
+
function hasTurbolinks() {
|
2
|
+
return (typeof Turbolinks !== 'undefined' && Turbolinks.supported);
|
3
|
+
}
|
4
|
+
|
5
|
+
function turbolinksVisit(params) {
|
6
|
+
const path = [window.location.pathname, '?', toQueryString(params)].join('')
|
7
|
+
Turbolinks.visit(path);
|
8
|
+
}
|
9
|
+
|
10
|
+
function queryString() {
|
11
|
+
return (window.location.search || '').replace(/^\?/, '');
|
12
|
+
}
|
13
|
+
|
14
|
+
function queryStringToParams() {
|
15
|
+
const decode = (value) => decodeURIComponent((value || '').replace(/\+/g, '%20'));
|
16
|
+
|
17
|
+
return queryString()
|
18
|
+
.split("&")
|
19
|
+
.map(pair => pair.split("="))
|
20
|
+
.map(([key, value]) => {
|
21
|
+
return { name: decode(key), value: decode(value) }
|
22
|
+
});
|
23
|
+
}
|
24
|
+
|
25
|
+
function toQueryString(params) {
|
26
|
+
const encode = (value) => encodeURIComponent(value || '');
|
27
|
+
|
28
|
+
return params
|
29
|
+
.map(({name, value}) => [ encode(name), encode(value) ])
|
30
|
+
.map(pair => pair.join('='))
|
31
|
+
.join('&')
|
32
|
+
}
|
33
|
+
|
34
|
+
export {
|
35
|
+
hasTurbolinks,
|
36
|
+
turbolinksVisit,
|
37
|
+
queryString,
|
38
|
+
queryStringToParams,
|
39
|
+
toQueryString
|
40
|
+
};
|