adminterface 0.0.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE.md +1 -1
- data/README.md +61 -0
- data/Rakefile +43 -0
- data/app/assets/config/adminterface_manifest.js +1 -0
- data/app/assets/stylesheets/adminterface/_base.scss +20 -0
- data/app/assets/stylesheets/adminterface/_print.scss +56 -0
- data/app/assets/stylesheets/adminterface/components/_active_admin_comment.scss +19 -0
- data/app/assets/stylesheets/adminterface/components/_all.scss +24 -0
- data/app/assets/stylesheets/adminterface/components/_aside.scss +28 -0
- data/app/assets/stylesheets/adminterface/components/_attributes_table.scss +19 -0
- data/app/assets/stylesheets/adminterface/components/_comments.scss +7 -0
- data/app/assets/stylesheets/adminterface/components/_divider.scss +28 -0
- data/app/assets/stylesheets/adminterface/components/_filters.scss +27 -0
- data/app/assets/stylesheets/adminterface/components/_flash.scss +4 -0
- data/app/assets/stylesheets/adminterface/components/_footer.scss +4 -0
- data/app/assets/stylesheets/adminterface/components/_form.scss +219 -0
- data/app/assets/stylesheets/adminterface/components/_header.scss +30 -0
- data/app/assets/stylesheets/adminterface/components/_index.scss +1 -0
- data/app/assets/stylesheets/adminterface/components/_index_as_grid.scss +5 -0
- data/app/assets/stylesheets/adminterface/components/_index_as_table.scss +1 -0
- data/app/assets/stylesheets/adminterface/components/_index_footer.scss +19 -0
- data/app/assets/stylesheets/adminterface/components/_modal_dialog.scss +4 -0
- data/app/assets/stylesheets/adminterface/components/_pagination.scss +3 -0
- data/app/assets/stylesheets/adminterface/components/_panel.scss +21 -0
- data/app/assets/stylesheets/adminterface/components/_sidebar.scss +13 -0
- data/app/assets/stylesheets/adminterface/components/_site_title.scss +17 -0
- data/app/assets/stylesheets/adminterface/components/_table_for.scss +37 -0
- data/app/assets/stylesheets/adminterface/components/_table_tools.scss +19 -0
- data/app/assets/stylesheets/adminterface/components/_thumbnail.scss +29 -0
- data/app/assets/stylesheets/adminterface/components/_title_bar.scss +36 -0
- data/app/assets/stylesheets/adminterface/components/inputs/_all.scss +2 -0
- data/app/assets/stylesheets/adminterface/components/inputs/_password.scss +28 -0
- data/app/assets/stylesheets/adminterface/components/inputs/_text.scss +30 -0
- data/app/assets/stylesheets/adminterface/helpers/_aa_icon.scss +1 -0
- data/app/assets/stylesheets/adminterface/helpers/_all.scss +2 -0
- data/app/assets/stylesheets/adminterface/helpers/_pointer.scss +1 -0
- data/app/assets/stylesheets/adminterface/layouts/_all.scss +4 -0
- data/app/assets/stylesheets/adminterface/layouts/_base.scss +5 -0
- data/app/assets/stylesheets/adminterface/layouts/_logged_in.scss +30 -0
- data/app/assets/stylesheets/adminterface/layouts/_logged_out.scss +14 -0
- data/app/assets/stylesheets/adminterface/layouts/types/_all.scss +4 -0
- data/app/assets/stylesheets/adminterface/layouts/types/_mixins.scss +195 -0
- data/app/assets/stylesheets/adminterface/layouts/types/_navigation_aside.scss +33 -0
- data/app/assets/stylesheets/adminterface/layouts/types/_navigation_sidebar.scss +15 -0
- data/app/assets/stylesheets/adminterface/layouts/types/_navigation_top.scss +33 -0
- data/app/assets/stylesheets/adminterface/mixins/_all.scss +3 -0
- data/app/assets/stylesheets/adminterface/mixins/_layouts.scss +38 -0
- data/app/assets/stylesheets/adminterface/mixins/_utilities.scss +39 -0
- data/app/assets/stylesheets/adminterface/mixins/_variables.scss +100 -0
- data/app/assets/stylesheets/adminterface/placeholders/_aa_icon.scss +10 -0
- data/app/assets/stylesheets/adminterface/placeholders/_all.scss +3 -0
- data/app/assets/stylesheets/adminterface/placeholders/_background.scss +5 -0
- data/app/assets/stylesheets/adminterface/placeholders/_typography.scss +11 -0
- data/app/assets/stylesheets/adminterface/vendors/_all.scss +4 -0
- data/app/assets/stylesheets/adminterface/vendors/bootstrap/_all.scss +6 -0
- data/app/assets/stylesheets/adminterface/vendors/bootstrap/_variables.scss +51 -0
- data/app/assets/stylesheets/adminterface/vendors/bootstrap/components/_buttons.scss +5 -0
- data/app/assets/stylesheets/adminterface/vendors/bootstrap/components/_dropdowns.scss +28 -0
- data/app/assets/stylesheets/adminterface/vendors/bootstrap/components/_navs.scss +25 -0
- data/app/assets/stylesheets/adminterface/vendors/bootstrap/components/form/_labels.scss +5 -0
- data/app/assets/stylesheets/adminterface/vendors/bootstrap/content/_tables.scss +2 -0
- data/app/assets/stylesheets/adminterface/vendors/bootstrap/content/_typography.scss +2 -0
- data/app/assets/stylesheets/adminterface/vendors/flatpickr/_all.scss +2 -0
- data/app/assets/stylesheets/adminterface/vendors/flatpickr/_variables.scss +7 -0
- data/app/assets/stylesheets/adminterface/vendors/flatpickr/main.scss +50 -0
- data/app/assets/stylesheets/adminterface/vendors/tom_select/_all.scss +1 -0
- data/app/assets/stylesheets/adminterface/vendors/tom_select/_main.scss +6 -0
- data/app/assets/stylesheets/adminterface/vendors/trix/_actiontext.scss +36 -0
- data/app/assets/stylesheets/adminterface/vendors/trix/_all.scss +3 -0
- data/app/assets/stylesheets/adminterface/vendors/trix/_trix_editor.scss +86 -0
- data/app/assets/stylesheets/adminterface/vendors/trix/_variables.scss +31 -0
- data/app/javascript/adminterface/base.js +14 -0
- data/app/javascript/adminterface/config.js +129 -0
- data/app/javascript/adminterface/initializers/batch_actions.js +9 -0
- data/app/javascript/adminterface/initializers/bootstrap.js +29 -0
- data/app/javascript/adminterface/initializers/confirm_dialog.js +23 -0
- data/app/javascript/adminterface/initializers/detached_dropdown.js +16 -0
- data/app/javascript/adminterface/initializers/drawer_menu_item_toggler.js +15 -0
- data/app/javascript/adminterface/initializers/filters.js +23 -0
- data/app/javascript/adminterface/initializers/has_many.js +7 -0
- data/app/javascript/adminterface/initializers/header_toggler.js +10 -0
- data/app/javascript/adminterface/initializers/index.js +2 -0
- data/app/javascript/adminterface/initializers/per_page.js +12 -0
- data/app/javascript/adminterface/initializers/plugins/flatpickr.js +24 -0
- data/app/javascript/adminterface/initializers/plugins/input_counter.js +21 -0
- data/app/javascript/adminterface/initializers/plugins/password_visibility.js +23 -0
- data/app/javascript/adminterface/initializers/plugins/tom_select.js +24 -0
- data/app/javascript/adminterface/lib/__tests__/detached_dropdown.spec.js +70 -0
- data/app/javascript/adminterface/lib/__tests__/filters.spec.js +151 -0
- data/app/javascript/adminterface/lib/__tests__/utils.spec.js +281 -0
- data/app/javascript/adminterface/lib/batch_actions.js +106 -0
- data/app/javascript/adminterface/lib/checkbox_toggler.js +55 -0
- data/app/javascript/adminterface/lib/confirm_dialog.js +113 -0
- data/app/javascript/adminterface/lib/detached_dropdown.js +34 -0
- data/app/javascript/adminterface/lib/filters.js +34 -0
- data/app/javascript/adminterface/lib/has_many.js +122 -0
- data/app/javascript/adminterface/lib/header_toggler.js +54 -0
- data/app/javascript/adminterface/lib/input.js +108 -0
- data/app/javascript/adminterface/lib/inputs/base/groupish.js +55 -0
- data/app/javascript/adminterface/lib/inputs/base/pluginish.js +63 -0
- data/app/javascript/adminterface/lib/inputs/base_input.js +87 -0
- data/app/javascript/adminterface/lib/inputs/boolean_input.js +30 -0
- data/app/javascript/adminterface/lib/inputs/check_boxes_input.js +14 -0
- data/app/javascript/adminterface/lib/inputs/choices_input.js +96 -0
- data/app/javascript/adminterface/lib/inputs/color_input.js +14 -0
- data/app/javascript/adminterface/lib/inputs/country_input.js +90 -0
- data/app/javascript/adminterface/lib/inputs/datalist_input.js +41 -0
- data/app/javascript/adminterface/lib/inputs/date_picker_input.js +11 -0
- data/app/javascript/adminterface/lib/inputs/datetime_picker_input.js +11 -0
- data/app/javascript/adminterface/lib/inputs/hidden_input.js +21 -0
- data/app/javascript/adminterface/lib/inputs/password_input.js +13 -0
- data/app/javascript/adminterface/lib/inputs/radio_input.js +13 -0
- data/app/javascript/adminterface/lib/inputs/select_input.js +68 -0
- data/app/javascript/adminterface/lib/inputs/string_input.js +13 -0
- data/app/javascript/adminterface/lib/inputs/switch_input.js +9 -0
- data/app/javascript/adminterface/lib/inputs/text_input.js +12 -0
- data/app/javascript/adminterface/lib/inputs/time_picker_input.js +13 -0
- data/app/javascript/adminterface/lib/inputs/time_zone_input.js +66 -0
- data/app/javascript/adminterface/lib/per_page.js +18 -0
- data/app/javascript/adminterface/lib/plugins/input_counter.js +94 -0
- data/app/javascript/adminterface/lib/plugins/password_visibility.js +70 -0
- data/app/javascript/adminterface/lib/table_checkbox_toggler.js +47 -0
- data/app/javascript/adminterface/lib/utils.js +148 -0
- data/app/views/active_admin/devise/confirmations/new.html.erb +19 -0
- data/app/views/active_admin/devise/passwords/edit.html.erb +21 -0
- data/app/views/active_admin/devise/passwords/new.html.erb +19 -0
- data/app/views/active_admin/devise/registrations/new.html.erb +24 -0
- data/app/views/active_admin/devise/sessions/new.html.erb +23 -0
- data/app/views/active_admin/devise/shared/_links.html.erb +25 -0
- data/app/views/active_admin/devise/shared/_omniauth.html.erb +10 -0
- data/app/views/active_admin/devise/unlocks/new.html.erb +19 -0
- data/app/views/kaminari/active_admin/_first_page.html.erb +11 -0
- data/app/views/kaminari/active_admin/_gap.html.erb +12 -0
- data/app/views/kaminari/active_admin/_last_page.html.erb +11 -0
- data/app/views/kaminari/active_admin/_next_page.html.erb +11 -0
- data/app/views/kaminari/active_admin/_page.html.erb +12 -0
- data/app/views/kaminari/active_admin/_paginator.html.erb +27 -0
- data/app/views/kaminari/active_admin/_prev_page.html.erb +11 -0
- data/app/views/layouts/active_admin_logged_out.html.erb +56 -0
- data/config/locales/active_admin.en.yml +25 -0
- data/lib/adminterface/callable.rb +7 -0
- data/lib/adminterface/configs.rb +76 -0
- data/lib/adminterface/data/base.rb +11 -0
- data/lib/adminterface/data/countries.rb +44 -0
- data/lib/adminterface/data/time_zones.rb +31 -0
- data/lib/adminterface/data.rb +6 -0
- data/lib/adminterface/encryption/encryptor.rb +26 -0
- data/lib/adminterface/engine.rb +22 -0
- data/lib/adminterface/extensions/base_controller.rb +55 -0
- data/lib/adminterface/extensions/batch_actions/resource_extension.rb +64 -0
- data/lib/adminterface/extensions/batch_actions/views/batch_action_selector.rb +48 -0
- data/lib/adminterface/extensions/batch_actions/views/selection_cells.rb +39 -0
- data/lib/adminterface/extensions/dsl.rb +13 -0
- data/lib/adminterface/extensions/dynamic_settings_node.rb +26 -0
- data/lib/adminterface/extensions/filters/forms.rb +76 -0
- data/lib/adminterface/extensions/form_builder.rb +165 -0
- data/lib/adminterface/extensions/inputs/base/active_admin_config.rb +21 -0
- data/lib/adminterface/extensions/inputs/base/choices.rb +33 -0
- data/lib/adminterface/extensions/inputs/base/groupish.rb +50 -0
- data/lib/adminterface/extensions/inputs/base/html.rb +15 -0
- data/lib/adminterface/extensions/inputs/base/labelling.rb +15 -0
- data/lib/adminterface/extensions/inputs/base/pluginish.rb +56 -0
- data/lib/adminterface/extensions/inputs/base/stringish.rb +19 -0
- data/lib/adminterface/extensions/inputs/base/wrapping.rb +25 -0
- data/lib/adminterface/extensions/inputs/base.rb +19 -0
- data/lib/adminterface/extensions/inputs/boolean_input.rb +42 -0
- data/lib/adminterface/extensions/inputs/check_boxes_input.rb +34 -0
- data/lib/adminterface/extensions/inputs/color_input.rb +29 -0
- data/lib/adminterface/extensions/inputs/country_input.rb +33 -0
- data/lib/adminterface/extensions/inputs/datalist_input.rb +26 -0
- data/lib/adminterface/extensions/inputs/date_picker_input.rb +30 -0
- data/lib/adminterface/extensions/inputs/date_select_input.rb +7 -0
- data/lib/adminterface/extensions/inputs/datetime_picker_input.rb +19 -0
- data/lib/adminterface/extensions/inputs/datetime_select_input.rb +7 -0
- data/lib/adminterface/extensions/inputs/email_input.rb +23 -0
- data/lib/adminterface/extensions/inputs/file_input.rb +19 -0
- data/lib/adminterface/extensions/inputs/filters/base/search_method_select.rb +37 -0
- data/lib/adminterface/extensions/inputs/filters/base.rb +3 -0
- data/lib/adminterface/extensions/inputs/filters/boolean_input.rb +4 -0
- data/lib/adminterface/extensions/inputs/filters/check_boxes_input.rb +12 -0
- data/lib/adminterface/extensions/inputs/filters/date_picker_input.rb +4 -0
- data/lib/adminterface/extensions/inputs/filters/date_range_input.rb +50 -0
- data/lib/adminterface/extensions/inputs/filters/select_input.rb +4 -0
- data/lib/adminterface/extensions/inputs/number_input.rb +23 -0
- data/lib/adminterface/extensions/inputs/password_input.rb +23 -0
- data/lib/adminterface/extensions/inputs/phone_input.rb +23 -0
- data/lib/adminterface/extensions/inputs/radio_input.rb +41 -0
- data/lib/adminterface/extensions/inputs/range_input.rb +22 -0
- data/lib/adminterface/extensions/inputs/rich_text_area_input.rb +21 -0
- data/lib/adminterface/extensions/inputs/search_input.rb +23 -0
- data/lib/adminterface/extensions/inputs/select_input.rb +33 -0
- data/lib/adminterface/extensions/inputs/string_input.rb +19 -0
- data/lib/adminterface/extensions/inputs/switch_input.rb +11 -0
- data/lib/adminterface/extensions/inputs/text_input.rb +27 -0
- data/lib/adminterface/extensions/inputs/time_picker_input.rb +19 -0
- data/lib/adminterface/extensions/inputs/time_select_input.rb +7 -0
- data/lib/adminterface/extensions/inputs/time_zone_input.rb +33 -0
- data/lib/adminterface/extensions/inputs/url_input.rb +23 -0
- data/lib/adminterface/extensions/menu_item.rb +16 -0
- data/lib/adminterface/extensions/namespace_settings.rb +30 -0
- data/lib/adminterface/extensions/orm/active_record/comments/views/active_admin_comments.rb +122 -0
- data/lib/adminterface/extensions/resource/action_items.rb +117 -0
- data/lib/adminterface/extensions/sidebar_section.rb +35 -0
- data/lib/adminterface/extensions/view_helpers/alert_helper.rb +36 -0
- data/lib/adminterface/extensions/view_helpers/component_helper.rb +23 -0
- data/lib/adminterface/extensions/views/action_items.rb +39 -0
- data/lib/adminterface/extensions/views/columns.rb +59 -0
- data/lib/adminterface/extensions/views/components/active_admin_form.rb +47 -0
- data/lib/adminterface/extensions/views/components/attributes_table.rb +28 -0
- data/lib/adminterface/extensions/views/components/blank_slate.rb +19 -0
- data/lib/adminterface/extensions/views/components/dropdown_menu.rb +55 -0
- data/lib/adminterface/extensions/views/components/icon.rb +26 -0
- data/lib/adminterface/extensions/views/components/index_list.rb +43 -0
- data/lib/adminterface/extensions/views/components/menu.rb +18 -0
- data/lib/adminterface/extensions/views/components/menu_item.rb +64 -0
- data/lib/adminterface/extensions/views/components/paginated_collection.rb +52 -0
- data/lib/adminterface/extensions/views/components/panel.rb +71 -0
- data/lib/adminterface/extensions/views/components/scopes.rb +53 -0
- data/lib/adminterface/extensions/views/components/sidebar_section.rb +39 -0
- data/lib/adminterface/extensions/views/components/site_title.rb +36 -0
- data/lib/adminterface/extensions/views/components/status_tag.rb +26 -0
- data/lib/adminterface/extensions/views/components/table_for.rb +23 -0
- data/lib/adminterface/extensions/views/components/tabs.rb +76 -0
- data/lib/adminterface/extensions/views/footer.rb +27 -0
- data/lib/adminterface/extensions/views/header.rb +59 -0
- data/lib/adminterface/extensions/views/index_as_grid.rb +53 -0
- data/lib/adminterface/extensions/views/index_as_table.rb +77 -0
- data/lib/adminterface/extensions/views/pages/base.rb +164 -0
- data/lib/adminterface/extensions/views/pages/form.rb +27 -0
- data/lib/adminterface/extensions/views/pages/index.rb +136 -0
- data/lib/adminterface/extensions/views/pages/page.rb +18 -0
- data/lib/adminterface/extensions/views/title_bar.rb +74 -0
- data/lib/adminterface/fixtures/components.yml +73 -0
- data/lib/adminterface/fixtures/css_classes.yml +107 -0
- data/lib/adminterface/initializers/batch_actions.rb +15 -0
- data/lib/adminterface/initializers/comments.rb +13 -0
- data/lib/adminterface/initializers/configurations.rb +38 -0
- data/lib/adminterface/initializers/formtastic.rb +58 -0
- data/lib/adminterface/initializers/resource.rb +20 -0
- data/lib/adminterface/initializers/view_helpers.rb +14 -0
- data/lib/adminterface/initializers/views.rb +39 -0
- data/lib/adminterface/license.rb +18 -0
- data/lib/adminterface/licensing/base.rb +99 -0
- data/lib/adminterface/licensing/commercial.rb +7 -0
- data/lib/adminterface/licensing/notice.rb +54 -0
- data/lib/adminterface/licensing/personal.rb +13 -0
- data/lib/adminterface/public.pem +9 -0
- data/lib/adminterface/version.rb +3 -0
- data/lib/adminterface.rb +55 -0
- data/lib/generators/adminterface/comments/comments_generator.rb +29 -0
- data/lib/generators/adminterface/comments/templates/README +13 -0
- data/lib/generators/adminterface/comments/templates/active_admin_comment_action_text.rb +18 -0
- data/lib/generators/adminterface/comments/templates/migrations/drop_body_for_active_admin_comments.rb.erb +28 -0
- data/lib/generators/adminterface/configs/configs_generator.rb +19 -0
- data/lib/generators/adminterface/configs/templates/README +33 -0
- data/lib/generators/adminterface/install/install_generator.rb +41 -0
- data/lib/generators/adminterface/install/templates/dashboard.rb +32 -0
- data/lib/generators/adminterface/views/views_generator.rb +15 -0
- data/lib/generators/adminterface/webpacker/templates/README +27 -0
- data/lib/generators/adminterface/webpacker/templates/active_admin.js +12 -0
- data/lib/generators/adminterface/webpacker/templates/active_admin.scss +8 -0
- data/lib/generators/adminterface/webpacker/templates/print.scss +3 -0
- data/lib/generators/adminterface/webpacker/webpacker_generator.rb +55 -0
- data/lib/tasks/adminterface_tasks.rake +4 -0
- metadata +285 -9
- data/lib/name.rb +0 -1
@@ -0,0 +1,122 @@
|
|
1
|
+
/* global Event, adminterface */
|
2
|
+
import Sortable from 'sortablejs'
|
3
|
+
|
4
|
+
class HasMany {
|
5
|
+
constructor (element) {
|
6
|
+
this.element = element
|
7
|
+
this.events = {
|
8
|
+
removeBefore: new Event('has_many_remove:before'),
|
9
|
+
removeAfter: new Event('has_many_remove:after'),
|
10
|
+
addBefore: new Event('has_many_add:before'),
|
11
|
+
addAfter: new Event('has_many_add:after')
|
12
|
+
}
|
13
|
+
this.options = {
|
14
|
+
list: '.has-many-list',
|
15
|
+
item: 'fieldset.has_many_fields',
|
16
|
+
addLink: 'a.button.has_many_add',
|
17
|
+
removeLink: 'a.button.has_many_remove',
|
18
|
+
destroyInput: 'input[name$="[_destroy]"]'
|
19
|
+
}
|
20
|
+
|
21
|
+
this._bind()
|
22
|
+
}
|
23
|
+
|
24
|
+
_initSortable () {
|
25
|
+
this.sortable = new Sortable(document.querySelector(this.options.list), {
|
26
|
+
handle: '.handle',
|
27
|
+
animation: 150,
|
28
|
+
ghostClass: 'sortable-placeholder',
|
29
|
+
dragClass: 'sortable-drag',
|
30
|
+
onUpdate: () => { this._recomputePosition() }
|
31
|
+
})
|
32
|
+
}
|
33
|
+
|
34
|
+
_recomputePosition () {
|
35
|
+
const inputName = this.element.dataset.sortable
|
36
|
+
const $items = this.element.querySelectorAll(this.options.item)
|
37
|
+
let position = parseInt(this.element.dataset.sortableStart || 0, 10)
|
38
|
+
|
39
|
+
$items.forEach((el) => {
|
40
|
+
const destroyInput = el.querySelector(this.options.destroyInput) || {}
|
41
|
+
const sortableInput = el.querySelector(`input[name$='[${inputName}]']`) || {}
|
42
|
+
|
43
|
+
if (sortableInput) {
|
44
|
+
sortableInput.value = destroyInput.checked ? '' : position++
|
45
|
+
}
|
46
|
+
})
|
47
|
+
}
|
48
|
+
|
49
|
+
_bindDestroyEvent (el) {
|
50
|
+
el.addEventListener('change', (e) => this._recomputePosition())
|
51
|
+
}
|
52
|
+
|
53
|
+
_bindAddEvent (el) {
|
54
|
+
el.addEventListener('click', (e) => {
|
55
|
+
let beforeAdd
|
56
|
+
const el = e.target
|
57
|
+
const parent = this.element
|
58
|
+
|
59
|
+
e.preventDefault()
|
60
|
+
parent.dispatchEvent(beforeAdd = this.events.addBefore, [parent])
|
61
|
+
|
62
|
+
if (!beforeAdd.defaultPrevented) {
|
63
|
+
let index = parent.dataset.hasManyIndex || parent.querySelectorAll(this.options.item).length - 1
|
64
|
+
parent.setAttribute('data-has-many-index', ++index)
|
65
|
+
|
66
|
+
const regex = new RegExp(el.dataset.placeholder, 'g')
|
67
|
+
const html = el.dataset.html.replaceAll(regex, index)
|
68
|
+
const newNode = document.createElement('div')
|
69
|
+
newNode.innerHTML = html
|
70
|
+
|
71
|
+
const fieldset = newNode.firstElementChild
|
72
|
+
const $list = this.element.querySelector(this.options.list)
|
73
|
+
|
74
|
+
$list.appendChild(fieldset)
|
75
|
+
this._bindEvents(fieldset)
|
76
|
+
this._recomputePosition()
|
77
|
+
|
78
|
+
const addAfterEvent = this.events.addAfter
|
79
|
+
addAfterEvent.detail = { fieldset, parent }
|
80
|
+
return parent.dispatchEvent(this.events.addAfter)
|
81
|
+
}
|
82
|
+
})
|
83
|
+
}
|
84
|
+
|
85
|
+
_bindRemoveEvent (el) {
|
86
|
+
el.addEventListener('click', (e) => {
|
87
|
+
const el = e.target
|
88
|
+
const parent = this.element
|
89
|
+
const fieldset = el.closest(this.options.item)
|
90
|
+
const removeBeforeEvent = this.events.removeBefore
|
91
|
+
const removeAfterEvent = this.events.removeAfter
|
92
|
+
|
93
|
+
e.preventDefault()
|
94
|
+
this._recomputePosition()
|
95
|
+
|
96
|
+
removeBeforeEvent.detail = { fieldset, parent }
|
97
|
+
removeAfterEvent.detail = { fieldset, parent }
|
98
|
+
parent.dispatchEvent(removeBeforeEvent)
|
99
|
+
fieldset.remove()
|
100
|
+
return parent.dispatchEvent(removeAfterEvent)
|
101
|
+
})
|
102
|
+
}
|
103
|
+
|
104
|
+
_bindEvents (el) {
|
105
|
+
const $addLinks = el.querySelectorAll(this.options.addLink)
|
106
|
+
const $removeLinks = el.querySelectorAll(this.options.removeLink)
|
107
|
+
const $destroyInputs = el.querySelectorAll(this.options.destroyInput)
|
108
|
+
|
109
|
+
$addLinks.forEach((el) => this._bindAddEvent(el))
|
110
|
+
$removeLinks.forEach((el) => this._bindRemoveEvent(el))
|
111
|
+
$destroyInputs.forEach((el) => this._bindDestroyEvent(el))
|
112
|
+
}
|
113
|
+
|
114
|
+
_bind () {
|
115
|
+
this._bindEvents(this.element)
|
116
|
+
this._initSortable()
|
117
|
+
|
118
|
+
adminterface.addObserver(this.element, this, this.constructor.name, [])
|
119
|
+
}
|
120
|
+
}
|
121
|
+
|
122
|
+
export default HasMany
|
@@ -0,0 +1,54 @@
|
|
1
|
+
/* global adminterface */
|
2
|
+
import { cookieSet, cookieGet } from './utils'
|
3
|
+
|
4
|
+
class HeaderToggler {
|
5
|
+
constructor (element, options) {
|
6
|
+
const defaults = {
|
7
|
+
container: 'body',
|
8
|
+
activeClass: 'header-active',
|
9
|
+
cookieName: 'header-state',
|
10
|
+
cookieExpireSec: 30 * 24 * 60 * 60
|
11
|
+
}
|
12
|
+
|
13
|
+
this.element = element
|
14
|
+
this.options = { ...defaults, ...options }
|
15
|
+
|
16
|
+
this._bind()
|
17
|
+
}
|
18
|
+
|
19
|
+
_add () {
|
20
|
+
const $container = document.querySelector(this.options.container)
|
21
|
+
$container.classList.add(this.options.activeClass)
|
22
|
+
cookieSet(this.options.cookieName, this.options.activeClass, this.options.cookieExpireSec)
|
23
|
+
}
|
24
|
+
|
25
|
+
_remove () {
|
26
|
+
const $container = document.querySelector(this.options.container)
|
27
|
+
$container.classList.remove(this.options.activeClass)
|
28
|
+
cookieSet(this.options.cookieName, null, 0)
|
29
|
+
}
|
30
|
+
|
31
|
+
_bind () {
|
32
|
+
const cookie = cookieGet(this.options.cookieName)
|
33
|
+
const $breakpointHelper = document.querySelector('.breakpoint-up-helper')
|
34
|
+
const $container = document.querySelector(this.options.container)
|
35
|
+
const _self = this
|
36
|
+
|
37
|
+
if (cookie === this.options.activeClass && window.getComputedStyle($breakpointHelper).visibility === 'visible') {
|
38
|
+
this._add()
|
39
|
+
}
|
40
|
+
|
41
|
+
this.element.addEventListener('click', function (e) {
|
42
|
+
e.preventDefault()
|
43
|
+
if ($container.classList.contains(_self.options.activeClass)) {
|
44
|
+
_self._remove()
|
45
|
+
} else {
|
46
|
+
_self._add()
|
47
|
+
}
|
48
|
+
})
|
49
|
+
|
50
|
+
adminterface.addObserver(this.element, this, this.constructor.name)
|
51
|
+
}
|
52
|
+
}
|
53
|
+
|
54
|
+
export default HeaderToggler
|
@@ -0,0 +1,108 @@
|
|
1
|
+
/* global adminterface */
|
2
|
+
import BaseInput from './inputs/base_input'
|
3
|
+
import BooleanInput from './inputs/boolean_input'
|
4
|
+
import CheckBoxesInput from './inputs/check_boxes_input'
|
5
|
+
import ColorInput from './inputs/color_input'
|
6
|
+
import CountryInput from './inputs/country_input'
|
7
|
+
import DatalistInput from './inputs/datalist_input'
|
8
|
+
import DatePickerInput from './inputs/date_picker_input'
|
9
|
+
import DateTimePickerInput from './inputs/datetime_picker_input'
|
10
|
+
import HiddenInput from './inputs/hidden_input'
|
11
|
+
import RadioInput from './inputs/radio_input'
|
12
|
+
import SelectInput from './inputs/select_input'
|
13
|
+
import StringInput from './inputs/string_input'
|
14
|
+
import SwitchInput from './inputs/switch_input'
|
15
|
+
import TextInput from './inputs/text_input'
|
16
|
+
import TimePickerInput from './inputs/time_picker_input'
|
17
|
+
import TimeZoneInput from './inputs/time_zone_input'
|
18
|
+
import PasswordInput from './inputs/password_input'
|
19
|
+
|
20
|
+
const inputMapping = {
|
21
|
+
boolean: BooleanInput,
|
22
|
+
check_boxes: CheckBoxesInput,
|
23
|
+
color: ColorInput,
|
24
|
+
country: CountryInput,
|
25
|
+
datalist: DatalistInput,
|
26
|
+
date_picker: DatePickerInput,
|
27
|
+
datepicker: DatePickerInput,
|
28
|
+
datetime_picker: DateTimePickerInput,
|
29
|
+
hidden: HiddenInput,
|
30
|
+
number: StringInput,
|
31
|
+
password: PasswordInput,
|
32
|
+
phone: StringInput,
|
33
|
+
radio: RadioInput,
|
34
|
+
select: SelectInput,
|
35
|
+
string: StringInput,
|
36
|
+
switch: SwitchInput,
|
37
|
+
text: TextInput,
|
38
|
+
time_picker: TimePickerInput,
|
39
|
+
time_zone: TimeZoneInput,
|
40
|
+
url: StringInput
|
41
|
+
}
|
42
|
+
|
43
|
+
class Input {
|
44
|
+
constructor (name, options) {
|
45
|
+
this.name = name
|
46
|
+
this.options = options
|
47
|
+
this.mapping = adminterface.meta.inputs
|
48
|
+
}
|
49
|
+
|
50
|
+
_configs () {
|
51
|
+
if (this._isExplicity()) {
|
52
|
+
return {
|
53
|
+
as: this.options.as,
|
54
|
+
options: this.options
|
55
|
+
}
|
56
|
+
} else if (Array.isArray(this.options)) {
|
57
|
+
return {
|
58
|
+
as: 'select',
|
59
|
+
options: { collection: this.options }
|
60
|
+
}
|
61
|
+
} else {
|
62
|
+
return {
|
63
|
+
as: this.options,
|
64
|
+
options: {}
|
65
|
+
}
|
66
|
+
}
|
67
|
+
}
|
68
|
+
|
69
|
+
_isExplicity () {
|
70
|
+
return (typeof (this.options) === 'object') && this.options.as
|
71
|
+
}
|
72
|
+
|
73
|
+
render () {
|
74
|
+
const configs = this._configs()
|
75
|
+
const as = configs.as
|
76
|
+
const options = configs.options
|
77
|
+
const InputClass = this.mapping[as]
|
78
|
+
|
79
|
+
if (!InputClass) {
|
80
|
+
throw new Error(`Unsupported input type: {${this.name}: ${as}}`)
|
81
|
+
}
|
82
|
+
|
83
|
+
const input = new InputClass(this.name, { ...options, as: as })
|
84
|
+
return input.render()
|
85
|
+
}
|
86
|
+
}
|
87
|
+
|
88
|
+
export {
|
89
|
+
inputMapping,
|
90
|
+
Input,
|
91
|
+
BaseInput,
|
92
|
+
BooleanInput,
|
93
|
+
CheckBoxesInput,
|
94
|
+
ColorInput,
|
95
|
+
CountryInput,
|
96
|
+
DatalistInput,
|
97
|
+
DatePickerInput,
|
98
|
+
DateTimePickerInput,
|
99
|
+
HiddenInput,
|
100
|
+
RadioInput,
|
101
|
+
SelectInput,
|
102
|
+
StringInput,
|
103
|
+
SwitchInput,
|
104
|
+
TextInput,
|
105
|
+
TimePickerInput,
|
106
|
+
TimeZoneInput,
|
107
|
+
PasswordInput
|
108
|
+
}
|
@@ -0,0 +1,55 @@
|
|
1
|
+
class Groupish {
|
2
|
+
constructor (options) {
|
3
|
+
this.type = options.as
|
4
|
+
this.options = options
|
5
|
+
this.prepend = options.prepend
|
6
|
+
this.append = options.append
|
7
|
+
this.isGroupable = this._isGroupable()
|
8
|
+
this.isGrouped = this._isGrouped()
|
9
|
+
}
|
10
|
+
|
11
|
+
groupWrapping (html) {
|
12
|
+
const prependHTML = this.prepend || ''
|
13
|
+
const appendHTML = this.append || ''
|
14
|
+
|
15
|
+
if (this.isGrouped) {
|
16
|
+
return `
|
17
|
+
<div class="input-group">
|
18
|
+
${prependHTML}
|
19
|
+
${html}
|
20
|
+
${appendHTML}
|
21
|
+
</div>
|
22
|
+
`
|
23
|
+
} else {
|
24
|
+
return html
|
25
|
+
}
|
26
|
+
}
|
27
|
+
|
28
|
+
_groupableTypes () {
|
29
|
+
return [
|
30
|
+
'string',
|
31
|
+
'number',
|
32
|
+
'url',
|
33
|
+
'phone',
|
34
|
+
'password',
|
35
|
+
'color',
|
36
|
+
'datalist',
|
37
|
+
'select',
|
38
|
+
'country',
|
39
|
+
'time_zone',
|
40
|
+
'date_picker',
|
41
|
+
'datepicker',
|
42
|
+
'datetime_picker'
|
43
|
+
]
|
44
|
+
}
|
45
|
+
|
46
|
+
_isGrouped () {
|
47
|
+
return !!this.prepend || !!this.append
|
48
|
+
}
|
49
|
+
|
50
|
+
_isGroupable () {
|
51
|
+
return this._groupableTypes().includes(this.type)
|
52
|
+
}
|
53
|
+
}
|
54
|
+
|
55
|
+
export default Groupish
|
@@ -0,0 +1,63 @@
|
|
1
|
+
/* global adminterface */
|
2
|
+
import { toSnakeCase, getObjectValue } from '../../utils'
|
3
|
+
|
4
|
+
class Config {
|
5
|
+
constructor (configs, options) {
|
6
|
+
this.name = configs.name
|
7
|
+
this.configs = configs
|
8
|
+
this.options = options[toSnakeCase(this.name)]
|
9
|
+
}
|
10
|
+
|
11
|
+
attributes () {
|
12
|
+
if (!this._enabled()) return {}
|
13
|
+
|
14
|
+
let results
|
15
|
+
|
16
|
+
if (typeof (this.options) === 'object') {
|
17
|
+
results = this.options
|
18
|
+
} else {
|
19
|
+
results = this._defaults()
|
20
|
+
}
|
21
|
+
|
22
|
+
return { [`data-aa-${this.name}`]: results }
|
23
|
+
}
|
24
|
+
|
25
|
+
_defaults () {
|
26
|
+
return this.configs.options || {}
|
27
|
+
}
|
28
|
+
|
29
|
+
_enabled () {
|
30
|
+
return (
|
31
|
+
(!(this.options === false) && this.configs.default === true) ||
|
32
|
+
(this.options && this.options === true)
|
33
|
+
)
|
34
|
+
}
|
35
|
+
}
|
36
|
+
|
37
|
+
class Pluginish {
|
38
|
+
constructor (options) {
|
39
|
+
this.options = options
|
40
|
+
this.as = options.as
|
41
|
+
this.plugins = this._plugins()
|
42
|
+
}
|
43
|
+
|
44
|
+
enabled (name) {
|
45
|
+
return getObjectValue(this.plugins, `data-aa-${name}`)
|
46
|
+
}
|
47
|
+
|
48
|
+
_plugins () {
|
49
|
+
return Object.assign({}, ...this._configs())
|
50
|
+
}
|
51
|
+
|
52
|
+
_configs () {
|
53
|
+
const plugins = getObjectValue(adminterface, `meta.components.inputs.${this.as}.js`)
|
54
|
+
|
55
|
+
if (plugins) {
|
56
|
+
return plugins.map((plugin) => (new Config(plugin, this.options)).attributes())
|
57
|
+
} else {
|
58
|
+
return []
|
59
|
+
}
|
60
|
+
}
|
61
|
+
}
|
62
|
+
|
63
|
+
export default Pluginish
|
@@ -0,0 +1,87 @@
|
|
1
|
+
/* global adminterface */
|
2
|
+
import { toHTMLAttrString, toSnakeCase } from '../utils'
|
3
|
+
import Pluginish from './base/pluginish'
|
4
|
+
import Groupish from './base/groupish'
|
5
|
+
|
6
|
+
class BaseInput {
|
7
|
+
constructor (name, options) {
|
8
|
+
this.name = name
|
9
|
+
this.options = options
|
10
|
+
this.wrapper_html_options = this.options.wrapper_html || {}
|
11
|
+
this.label_html_options = this.options.label_html || {}
|
12
|
+
this.input_html_options = this.options.input_html || {}
|
13
|
+
this.label = options.label || name.charAt(0).toUpperCase() + name.slice(1)
|
14
|
+
this.type = toSnakeCase(this.constructor.name.replace(/(Input$)/, ''))
|
15
|
+
this.pluginish = new Pluginish(this.options)
|
16
|
+
this.groupish = new Groupish(this.options)
|
17
|
+
}
|
18
|
+
|
19
|
+
_defaultWrapperHTMLOptions () {
|
20
|
+
const uuid = adminterface.addObserver(null, this, `Input.${this.constructor.name}`)
|
21
|
+
const configs = { class: `mb-3 input ${this.type}` }
|
22
|
+
|
23
|
+
if (uuid) configs['data-observer-id'] = uuid
|
24
|
+
return configs
|
25
|
+
}
|
26
|
+
|
27
|
+
_wrapperHTMLOptions () {
|
28
|
+
return { ...this._defaultWrapperHTMLOptions(), ...this.wrapper_html_options }
|
29
|
+
}
|
30
|
+
|
31
|
+
_defaultLabelHTMLOptions () {
|
32
|
+
return {
|
33
|
+
class: 'form-label',
|
34
|
+
for: `batch-form-${this.name}`
|
35
|
+
}
|
36
|
+
}
|
37
|
+
|
38
|
+
_labelHTMLOptions () {
|
39
|
+
return { ...this._defaultLabelHTMLOptions(), ...this.label_html_options }
|
40
|
+
}
|
41
|
+
|
42
|
+
_defaultInputHTMLOptions () {
|
43
|
+
const options = {
|
44
|
+
class: `form-control ${this.options.as}`,
|
45
|
+
name: this.name,
|
46
|
+
id: `batch-form-${this.name}`
|
47
|
+
}
|
48
|
+
|
49
|
+
return { ...options, ...this.pluginish.plugins }
|
50
|
+
}
|
51
|
+
|
52
|
+
_inputHTMLOptions () {
|
53
|
+
return { ...this._defaultInputHTMLOptions(), ...this.input_html_options }
|
54
|
+
}
|
55
|
+
|
56
|
+
_labelHTML () {
|
57
|
+
return `<label ${toHTMLAttrString(this._labelHTMLOptions())}>${this.label}</label>`
|
58
|
+
}
|
59
|
+
|
60
|
+
_inputHTML () {
|
61
|
+
return `<input ${toHTMLAttrString(this._inputHTMLOptions())}>`
|
62
|
+
}
|
63
|
+
|
64
|
+
_inputWrapping (html) {
|
65
|
+
return `
|
66
|
+
<div ${toHTMLAttrString(this._wrapperHTMLOptions())}>${html}</div>
|
67
|
+
`
|
68
|
+
}
|
69
|
+
|
70
|
+
render () {
|
71
|
+
const input = this._inputHTML()
|
72
|
+
let inputHTML
|
73
|
+
|
74
|
+
if (this.groupish.isGroupable) {
|
75
|
+
inputHTML = this.groupish.groupWrapping(input)
|
76
|
+
} else {
|
77
|
+
inputHTML = input
|
78
|
+
}
|
79
|
+
|
80
|
+
return this._inputWrapping(`
|
81
|
+
${this._labelHTML()}
|
82
|
+
${inputHTML}
|
83
|
+
`)
|
84
|
+
}
|
85
|
+
}
|
86
|
+
|
87
|
+
export default BaseInput
|
@@ -0,0 +1,30 @@
|
|
1
|
+
import BaseInput from './base_input'
|
2
|
+
|
3
|
+
class BooleanInput extends BaseInput {
|
4
|
+
_defaultLabelHTMLOptions () {
|
5
|
+
const options = {
|
6
|
+
class: 'form-check-label'
|
7
|
+
}
|
8
|
+
|
9
|
+
return { ...super._defaultLabelHTMLOptions(), ...options }
|
10
|
+
}
|
11
|
+
|
12
|
+
_defaultInputHTMLOptions () {
|
13
|
+
const options = {
|
14
|
+
class: `form-check-input ${this.options.as}`,
|
15
|
+
type: 'checkbox'
|
16
|
+
}
|
17
|
+
|
18
|
+
return { ...super._defaultInputHTMLOptions(), ...options }
|
19
|
+
}
|
20
|
+
|
21
|
+
_inputGroup (html) {
|
22
|
+
return `<div class="form-check">${html}</div>`
|
23
|
+
}
|
24
|
+
|
25
|
+
_inputWrapping (html) {
|
26
|
+
return super._inputWrapping(this._inputGroup(html))
|
27
|
+
}
|
28
|
+
}
|
29
|
+
|
30
|
+
export default BooleanInput
|
@@ -0,0 +1,14 @@
|
|
1
|
+
import ChoicesInput from './choices_input'
|
2
|
+
|
3
|
+
class CheckBoxesInput extends ChoicesInput {
|
4
|
+
_defaultInputHTMLOptions () {
|
5
|
+
const options = {
|
6
|
+
name: `${this.name}[]`,
|
7
|
+
type: 'checkbox'
|
8
|
+
}
|
9
|
+
|
10
|
+
return { ...super._defaultInputHTMLOptions(), ...options }
|
11
|
+
}
|
12
|
+
}
|
13
|
+
|
14
|
+
export default CheckBoxesInput
|
@@ -0,0 +1,96 @@
|
|
1
|
+
import BaseInput from './base_input'
|
2
|
+
import { toHTMLAttrString } from '../utils'
|
3
|
+
|
4
|
+
class ChoicesInput extends BaseInput {
|
5
|
+
_defaultLegendHTMLOptions () {
|
6
|
+
return {
|
7
|
+
class: 'form-label'
|
8
|
+
}
|
9
|
+
}
|
10
|
+
|
11
|
+
_legendHTMLOptions () {
|
12
|
+
return { ...this._defaultLegendHTMLOptions(), ...this.legend_html_options }
|
13
|
+
}
|
14
|
+
|
15
|
+
_defaultLabelHTMLOptions () {
|
16
|
+
const options = {
|
17
|
+
class: 'form-check-label'
|
18
|
+
}
|
19
|
+
|
20
|
+
return { ...super._defaultLabelHTMLOptions(), ...options }
|
21
|
+
}
|
22
|
+
|
23
|
+
_defaultInputHTMLOptions () {
|
24
|
+
const options = {
|
25
|
+
class: `form-check-input ${this.options.as}`
|
26
|
+
}
|
27
|
+
|
28
|
+
return { ...super._defaultInputHTMLOptions(), ...options }
|
29
|
+
}
|
30
|
+
|
31
|
+
_inputHTMLOptions (value) {
|
32
|
+
return { ...super._inputHTMLOptions(), ...{ value: value, id: `batch-form-${this.name}-${value}` } }
|
33
|
+
}
|
34
|
+
|
35
|
+
_labelHTMLOptions (value) {
|
36
|
+
return { ...super._labelHTMLOptions(), ...{ for: `batch-form-${this.name}-${value}` } }
|
37
|
+
}
|
38
|
+
|
39
|
+
_wrapWith (html) {
|
40
|
+
return `
|
41
|
+
<div class="form-check">${html}</div>
|
42
|
+
`
|
43
|
+
}
|
44
|
+
|
45
|
+
_choices (collection) {
|
46
|
+
return ((() => {
|
47
|
+
const result = []
|
48
|
+
|
49
|
+
collection.forEach(v => {
|
50
|
+
let option
|
51
|
+
if (Array.isArray(v)) {
|
52
|
+
option =
|
53
|
+
this._wrapWith(`
|
54
|
+
${this._inputHTML(v[1])}
|
55
|
+
${this._labelHTML(v[0])}
|
56
|
+
`)
|
57
|
+
} else {
|
58
|
+
option =
|
59
|
+
this._wrapWith(`
|
60
|
+
${this._inputHTML(v)}
|
61
|
+
${this._labelHTML(v)}
|
62
|
+
`)
|
63
|
+
}
|
64
|
+
result.push(option)
|
65
|
+
})
|
66
|
+
|
67
|
+
return result
|
68
|
+
})()).join('')
|
69
|
+
}
|
70
|
+
|
71
|
+
_inputHTML (value) {
|
72
|
+
return `<input ${toHTMLAttrString(this._inputHTMLOptions(value))}>`
|
73
|
+
}
|
74
|
+
|
75
|
+
_labelHTML (value) {
|
76
|
+
return `<label ${toHTMLAttrString(this._labelHTMLOptions(value))}>${value}</label>`
|
77
|
+
}
|
78
|
+
|
79
|
+
_legendHTML () {
|
80
|
+
return `<label ${toHTMLAttrString(this._legendHTMLOptions())}>${this.label}</label>`
|
81
|
+
}
|
82
|
+
|
83
|
+
_choicesHTML () {
|
84
|
+
const collection = this.options.collection || []
|
85
|
+
return collection.length ? this._choices(collection) : ''
|
86
|
+
}
|
87
|
+
|
88
|
+
render () {
|
89
|
+
return this._inputWrapping(`
|
90
|
+
${this._legendHTML()}
|
91
|
+
<div class="choices">${this._choicesHTML()}</div>
|
92
|
+
`)
|
93
|
+
}
|
94
|
+
}
|
95
|
+
|
96
|
+
export default ChoicesInput
|
@@ -0,0 +1,14 @@
|
|
1
|
+
import BaseInput from './base_input'
|
2
|
+
|
3
|
+
class ColorInput extends BaseInput {
|
4
|
+
_defaultInputHTMLOptions () {
|
5
|
+
const options = {
|
6
|
+
class: `form-control form-control-color ${this.options.as}`,
|
7
|
+
type: 'color'
|
8
|
+
}
|
9
|
+
|
10
|
+
return { ...super._defaultInputHTMLOptions(), ...options }
|
11
|
+
}
|
12
|
+
}
|
13
|
+
|
14
|
+
export default ColorInput
|