adminterface 0.0.0 → 0.2.3
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 +69 -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__/checkbox_toggler.html +5 -0
- data/app/javascript/adminterface/lib/__tests__/checkbox_toggler.spec.js +110 -0
- data/app/javascript/adminterface/lib/__tests__/detached_dropdown.spec.js +69 -0
- data/app/javascript/adminterface/lib/__tests__/filters.spec.js +150 -0
- data/app/javascript/adminterface/lib/__tests__/has_many.html +14 -0
- data/app/javascript/adminterface/lib/__tests__/has_many.spec.js +224 -0
- data/app/javascript/adminterface/lib/__tests__/utils.spec.js +280 -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 +125 -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 +59 -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 +38 -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 +58 -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 +69 -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 +101 -0
- data/lib/adminterface/extensions/views/footer.rb +27 -0
- data/lib/adminterface/extensions/views/header.rb +60 -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 +165 -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 +33 -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 +39 -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 +69 -0
- data/lib/tasks/adminterface_tasks.rake +4 -0
- metadata +291 -10
- data/lib/name.rb +0 -1
@@ -0,0 +1,113 @@
|
|
1
|
+
/* global Event, DOMParser, adminterface */
|
2
|
+
|
3
|
+
import { Modal } from 'bootstrap'
|
4
|
+
import { serializeObject, deepMergeObject, getObjectValue } from './utils'
|
5
|
+
import { Input } from './input'
|
6
|
+
|
7
|
+
class ConfirmDialog {
|
8
|
+
constructor (message, inputs, options, callback) {
|
9
|
+
const cssClasses = getObjectValue(adminterface, 'meta.cssClasses.confirm_dialog')
|
10
|
+
const translations = getObjectValue(adminterface, 'meta.translations.confirm_dialog')
|
11
|
+
const defaults = {
|
12
|
+
buttons: {
|
13
|
+
confirm: {
|
14
|
+
text: translations.confirm,
|
15
|
+
class: cssClasses.confirm
|
16
|
+
},
|
17
|
+
cancel: {
|
18
|
+
text: translations.cancel,
|
19
|
+
class: cssClasses.cancel
|
20
|
+
}
|
21
|
+
}
|
22
|
+
}
|
23
|
+
|
24
|
+
this.message = message
|
25
|
+
this.inputs = inputs
|
26
|
+
this.callback = callback
|
27
|
+
this.events = {
|
28
|
+
beforeOpen: new Event('confirm_dialog:before_open'),
|
29
|
+
afterOpen: new Event('confirm_dialog:after_open'),
|
30
|
+
confirm: new Event('confirm_dialog:confirm'),
|
31
|
+
cancel: new Event('confirm_dialog:cancel')
|
32
|
+
}
|
33
|
+
|
34
|
+
this.options = deepMergeObject(defaults, options)
|
35
|
+
this._bind()
|
36
|
+
}
|
37
|
+
|
38
|
+
_template () {
|
39
|
+
const buttons = this.options.buttons || {}
|
40
|
+
const message = this.message ? `<p id="dialog-message">${this.message}</p>` : ''
|
41
|
+
|
42
|
+
return `
|
43
|
+
<div id="modal-dialog-confirm" class='modal fade' tabindex='-1'>
|
44
|
+
<div class='modal-dialog modal-dialog-centered modal-dialog-scrollable'>
|
45
|
+
<div class='modal-content'>
|
46
|
+
<div class='modal-body'>
|
47
|
+
${message}
|
48
|
+
${this._form()}
|
49
|
+
</div>
|
50
|
+
<div class='modal-footer'>
|
51
|
+
<button type='button' class='${(buttons.cancel || {}).class}' data-bs-dismiss='modal'>${(buttons.cancel || {}).text}</button>
|
52
|
+
<button id="modal-dialog-confirm-button" type='button' class='${(buttons.confirm || {}).class}'>${(buttons.confirm || {}).text}</button>
|
53
|
+
</div>
|
54
|
+
</div>
|
55
|
+
</div>
|
56
|
+
</div>`
|
57
|
+
}
|
58
|
+
|
59
|
+
_form () {
|
60
|
+
let html = `<form id="modal-dialog-confirm-form" title="${this.message}">`
|
61
|
+
for (const name in this.inputs) {
|
62
|
+
const options = this.inputs[name]
|
63
|
+
html += (new Input(name, options)).render()
|
64
|
+
}
|
65
|
+
|
66
|
+
html += '</form>'
|
67
|
+
return html
|
68
|
+
}
|
69
|
+
|
70
|
+
_create () {
|
71
|
+
const dialogNode = new DOMParser().parseFromString(this._template(), 'text/html').body.childNodes[0]
|
72
|
+
return document.body.appendChild(dialogNode)
|
73
|
+
}
|
74
|
+
|
75
|
+
_bind () {
|
76
|
+
const _self = this
|
77
|
+
const dialogEl = this._create()
|
78
|
+
const dialogForm = dialogEl.querySelector('#modal-dialog-confirm-form') || {}
|
79
|
+
const confirmButton = dialogEl.querySelector('#modal-dialog-confirm-button') || {}
|
80
|
+
const beforeOpenEvent = this.events.beforeOpen
|
81
|
+
const afterOpenEvent = this.events.afterOpen
|
82
|
+
const confirmEvent = this.events.confirm
|
83
|
+
const cancelEvent = this.events.cancel
|
84
|
+
const serializeForm = serializeObject
|
85
|
+
const dialogConfirm = new Modal(dialogEl, {
|
86
|
+
keyboard: true,
|
87
|
+
backdrop: 'static'
|
88
|
+
})
|
89
|
+
|
90
|
+
confirmButton.addEventListener('click', function (_e) {
|
91
|
+
_self.callback(serializeForm(dialogForm))
|
92
|
+
dialogConfirm.hide()
|
93
|
+
confirmEvent.detail = { dialogForm }
|
94
|
+
document.dispatchEvent(confirmEvent)
|
95
|
+
})
|
96
|
+
|
97
|
+
dialogEl.addEventListener('hidden.bs.modal', function (_e) {
|
98
|
+
dialogEl.remove()
|
99
|
+
cancelEvent.detail = { dialogForm }
|
100
|
+
document.dispatchEvent(cancelEvent)
|
101
|
+
})
|
102
|
+
|
103
|
+
beforeOpenEvent.detail = { dialogForm }
|
104
|
+
afterOpenEvent.detail = { dialogForm }
|
105
|
+
document.dispatchEvent(beforeOpenEvent)
|
106
|
+
dialogConfirm.show()
|
107
|
+
document.dispatchEvent(afterOpenEvent)
|
108
|
+
|
109
|
+
adminterface.addObserver(dialogEl, this, this.constructor.name)
|
110
|
+
}
|
111
|
+
}
|
112
|
+
|
113
|
+
export default ConfirmDialog
|
@@ -0,0 +1,34 @@
|
|
1
|
+
/* global adminterface */
|
2
|
+
class DetachedDropdown {
|
3
|
+
constructor (element, options) {
|
4
|
+
const defaults = {
|
5
|
+
menu: '.dropdown-menu'
|
6
|
+
}
|
7
|
+
|
8
|
+
this.element = element
|
9
|
+
this.options = { ...defaults, ...options }
|
10
|
+
|
11
|
+
this._bind()
|
12
|
+
}
|
13
|
+
|
14
|
+
_append (target, node) {
|
15
|
+
target.append(node.parentElement.removeChild(node))
|
16
|
+
}
|
17
|
+
|
18
|
+
_bind () {
|
19
|
+
const $menu = this.element.querySelector(this.options.menu)
|
20
|
+
const _self = this
|
21
|
+
|
22
|
+
this.element.addEventListener('show.bs.dropdown', function (_e) {
|
23
|
+
_self._append(document.body, $menu)
|
24
|
+
})
|
25
|
+
|
26
|
+
this.element.addEventListener('hidden.bs.dropdown', function (_e) {
|
27
|
+
_self._append(_self.element, $menu)
|
28
|
+
})
|
29
|
+
|
30
|
+
adminterface.addObserver(this.element, this, this.constructor.name)
|
31
|
+
}
|
32
|
+
}
|
33
|
+
|
34
|
+
export default DetachedDropdown
|
@@ -0,0 +1,34 @@
|
|
1
|
+
import { queryStringToParams, hasTurbolinks, turbolinksVisit, toQueryString, serializeArray } from './utils'
|
2
|
+
|
3
|
+
class Filters {
|
4
|
+
static _clearForm (event) {
|
5
|
+
const regex = /^(q\[|q%5B|q%5b|page|utf8|commit)/
|
6
|
+
const params = queryStringToParams().filter(({ name }) => !name.match(regex))
|
7
|
+
|
8
|
+
event.preventDefault()
|
9
|
+
|
10
|
+
if (hasTurbolinks()) {
|
11
|
+
turbolinksVisit(params)
|
12
|
+
} else {
|
13
|
+
window.location.search = toQueryString(params)
|
14
|
+
}
|
15
|
+
}
|
16
|
+
|
17
|
+
static _disableEmptyInputFields (event) {
|
18
|
+
const elements = [...this.querySelectorAll('input, textarea, select, button')].filter((input) => input.value === '')
|
19
|
+
const params = serializeArray(this)
|
20
|
+
elements.forEach((el) => { el.disabled = true })
|
21
|
+
|
22
|
+
if (hasTurbolinks()) {
|
23
|
+
event.preventDefault()
|
24
|
+
turbolinksVisit(params)
|
25
|
+
}
|
26
|
+
}
|
27
|
+
|
28
|
+
static _setSearchType () {
|
29
|
+
const $element = this.closest('.filter_form_field').querySelector('input')
|
30
|
+
$element.name = `q[${this.value}]`
|
31
|
+
}
|
32
|
+
}
|
33
|
+
|
34
|
+
export default Filters
|
@@ -0,0 +1,125 @@
|
|
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) => this._bindAddEventCallBack(e))
|
55
|
+
}
|
56
|
+
|
57
|
+
_bindAddEventCallBack (e) {
|
58
|
+
let beforeAdd
|
59
|
+
const el = e.target
|
60
|
+
const parent = this.element
|
61
|
+
e.preventDefault()
|
62
|
+
parent.dispatchEvent(beforeAdd = this.events.addBefore, [parent])
|
63
|
+
|
64
|
+
if (!beforeAdd.defaultPrevented) {
|
65
|
+
let index = parent.dataset.hasManyIndex || parent.querySelectorAll(this.options.item).length - 1
|
66
|
+
parent.setAttribute('data-has-many-index', ++index)
|
67
|
+
|
68
|
+
const regex = new RegExp(el.dataset.placeholder, 'g')
|
69
|
+
const html = el.dataset.html.replace(regex, index)
|
70
|
+
const newNode = document.createElement('div')
|
71
|
+
newNode.innerHTML = html
|
72
|
+
|
73
|
+
const fieldset = newNode.firstElementChild
|
74
|
+
const $list = this.element.querySelector(this.options.list)
|
75
|
+
|
76
|
+
$list.appendChild(fieldset)
|
77
|
+
this._bindEvents(fieldset)
|
78
|
+
this._recomputePosition()
|
79
|
+
|
80
|
+
const addAfterEvent = this.events.addAfter
|
81
|
+
addAfterEvent.detail = { fieldset, parent }
|
82
|
+
return parent.dispatchEvent(this.events.addAfter)
|
83
|
+
}
|
84
|
+
}
|
85
|
+
|
86
|
+
_bindRemoveEvent (el) {
|
87
|
+
el.addEventListener('click', (e) => this._bindRemoveEventCallBack(e))
|
88
|
+
}
|
89
|
+
|
90
|
+
_bindRemoveEventCallBack (e) {
|
91
|
+
const el = e.target
|
92
|
+
const parent = this.element
|
93
|
+
const fieldset = el.closest(this.options.item)
|
94
|
+
const removeBeforeEvent = this.events.removeBefore
|
95
|
+
const removeAfterEvent = this.events.removeAfter
|
96
|
+
|
97
|
+
e.preventDefault()
|
98
|
+
this._recomputePosition()
|
99
|
+
|
100
|
+
removeBeforeEvent.detail = { fieldset, parent }
|
101
|
+
removeAfterEvent.detail = { fieldset, parent }
|
102
|
+
parent.dispatchEvent(removeBeforeEvent)
|
103
|
+
fieldset.remove()
|
104
|
+
return parent.dispatchEvent(removeAfterEvent)
|
105
|
+
}
|
106
|
+
|
107
|
+
_bindEvents (el) {
|
108
|
+
const $addLinks = el.querySelectorAll(this.options.addLink)
|
109
|
+
const $removeLinks = el.querySelectorAll(this.options.removeLink)
|
110
|
+
const $destroyInputs = el.querySelectorAll(this.options.destroyInput)
|
111
|
+
|
112
|
+
$addLinks.forEach((el) => this._bindAddEvent(el))
|
113
|
+
$removeLinks.forEach((el) => this._bindRemoveEvent(el))
|
114
|
+
$destroyInputs.forEach((el) => this._bindDestroyEvent(el))
|
115
|
+
}
|
116
|
+
|
117
|
+
_bind () {
|
118
|
+
this._bindEvents(this.element)
|
119
|
+
this._initSortable()
|
120
|
+
|
121
|
+
adminterface.addObserver(this.element, this, this.constructor.name, [])
|
122
|
+
}
|
123
|
+
}
|
124
|
+
|
125
|
+
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
|