adminterface 0.0.0 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (271) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.md +1 -1
  3. data/README.md +69 -0
  4. data/Rakefile +43 -0
  5. data/app/assets/config/adminterface_manifest.js +1 -0
  6. data/app/assets/stylesheets/adminterface/_base.scss +20 -0
  7. data/app/assets/stylesheets/adminterface/_print.scss +56 -0
  8. data/app/assets/stylesheets/adminterface/components/_active_admin_comment.scss +19 -0
  9. data/app/assets/stylesheets/adminterface/components/_all.scss +24 -0
  10. data/app/assets/stylesheets/adminterface/components/_aside.scss +28 -0
  11. data/app/assets/stylesheets/adminterface/components/_attributes_table.scss +19 -0
  12. data/app/assets/stylesheets/adminterface/components/_comments.scss +7 -0
  13. data/app/assets/stylesheets/adminterface/components/_divider.scss +28 -0
  14. data/app/assets/stylesheets/adminterface/components/_filters.scss +27 -0
  15. data/app/assets/stylesheets/adminterface/components/_flash.scss +4 -0
  16. data/app/assets/stylesheets/adminterface/components/_footer.scss +4 -0
  17. data/app/assets/stylesheets/adminterface/components/_form.scss +219 -0
  18. data/app/assets/stylesheets/adminterface/components/_header.scss +30 -0
  19. data/app/assets/stylesheets/adminterface/components/_index.scss +1 -0
  20. data/app/assets/stylesheets/adminterface/components/_index_as_grid.scss +5 -0
  21. data/app/assets/stylesheets/adminterface/components/_index_as_table.scss +1 -0
  22. data/app/assets/stylesheets/adminterface/components/_index_footer.scss +19 -0
  23. data/app/assets/stylesheets/adminterface/components/_modal_dialog.scss +4 -0
  24. data/app/assets/stylesheets/adminterface/components/_pagination.scss +3 -0
  25. data/app/assets/stylesheets/adminterface/components/_panel.scss +21 -0
  26. data/app/assets/stylesheets/adminterface/components/_sidebar.scss +13 -0
  27. data/app/assets/stylesheets/adminterface/components/_site_title.scss +17 -0
  28. data/app/assets/stylesheets/adminterface/components/_table_for.scss +37 -0
  29. data/app/assets/stylesheets/adminterface/components/_table_tools.scss +19 -0
  30. data/app/assets/stylesheets/adminterface/components/_thumbnail.scss +29 -0
  31. data/app/assets/stylesheets/adminterface/components/_title_bar.scss +36 -0
  32. data/app/assets/stylesheets/adminterface/components/inputs/_all.scss +2 -0
  33. data/app/assets/stylesheets/adminterface/components/inputs/_password.scss +28 -0
  34. data/app/assets/stylesheets/adminterface/components/inputs/_text.scss +30 -0
  35. data/app/assets/stylesheets/adminterface/helpers/_aa_icon.scss +1 -0
  36. data/app/assets/stylesheets/adminterface/helpers/_all.scss +2 -0
  37. data/app/assets/stylesheets/adminterface/helpers/_pointer.scss +1 -0
  38. data/app/assets/stylesheets/adminterface/layouts/_all.scss +4 -0
  39. data/app/assets/stylesheets/adminterface/layouts/_base.scss +5 -0
  40. data/app/assets/stylesheets/adminterface/layouts/_logged_in.scss +30 -0
  41. data/app/assets/stylesheets/adminterface/layouts/_logged_out.scss +14 -0
  42. data/app/assets/stylesheets/adminterface/layouts/types/_all.scss +4 -0
  43. data/app/assets/stylesheets/adminterface/layouts/types/_mixins.scss +195 -0
  44. data/app/assets/stylesheets/adminterface/layouts/types/_navigation_aside.scss +33 -0
  45. data/app/assets/stylesheets/adminterface/layouts/types/_navigation_sidebar.scss +15 -0
  46. data/app/assets/stylesheets/adminterface/layouts/types/_navigation_top.scss +33 -0
  47. data/app/assets/stylesheets/adminterface/mixins/_all.scss +3 -0
  48. data/app/assets/stylesheets/adminterface/mixins/_layouts.scss +38 -0
  49. data/app/assets/stylesheets/adminterface/mixins/_utilities.scss +39 -0
  50. data/app/assets/stylesheets/adminterface/mixins/_variables.scss +100 -0
  51. data/app/assets/stylesheets/adminterface/placeholders/_aa_icon.scss +10 -0
  52. data/app/assets/stylesheets/adminterface/placeholders/_all.scss +3 -0
  53. data/app/assets/stylesheets/adminterface/placeholders/_background.scss +5 -0
  54. data/app/assets/stylesheets/adminterface/placeholders/_typography.scss +11 -0
  55. data/app/assets/stylesheets/adminterface/vendors/_all.scss +4 -0
  56. data/app/assets/stylesheets/adminterface/vendors/bootstrap/_all.scss +6 -0
  57. data/app/assets/stylesheets/adminterface/vendors/bootstrap/_variables.scss +51 -0
  58. data/app/assets/stylesheets/adminterface/vendors/bootstrap/components/_buttons.scss +5 -0
  59. data/app/assets/stylesheets/adminterface/vendors/bootstrap/components/_dropdowns.scss +28 -0
  60. data/app/assets/stylesheets/adminterface/vendors/bootstrap/components/_navs.scss +25 -0
  61. data/app/assets/stylesheets/adminterface/vendors/bootstrap/components/form/_labels.scss +5 -0
  62. data/app/assets/stylesheets/adminterface/vendors/bootstrap/content/_tables.scss +2 -0
  63. data/app/assets/stylesheets/adminterface/vendors/bootstrap/content/_typography.scss +2 -0
  64. data/app/assets/stylesheets/adminterface/vendors/flatpickr/_all.scss +2 -0
  65. data/app/assets/stylesheets/adminterface/vendors/flatpickr/_variables.scss +7 -0
  66. data/app/assets/stylesheets/adminterface/vendors/flatpickr/main.scss +50 -0
  67. data/app/assets/stylesheets/adminterface/vendors/tom_select/_all.scss +1 -0
  68. data/app/assets/stylesheets/adminterface/vendors/tom_select/_main.scss +6 -0
  69. data/app/assets/stylesheets/adminterface/vendors/trix/_actiontext.scss +36 -0
  70. data/app/assets/stylesheets/adminterface/vendors/trix/_all.scss +3 -0
  71. data/app/assets/stylesheets/adminterface/vendors/trix/_trix_editor.scss +86 -0
  72. data/app/assets/stylesheets/adminterface/vendors/trix/_variables.scss +31 -0
  73. data/app/javascript/adminterface/base.js +14 -0
  74. data/app/javascript/adminterface/config.js +129 -0
  75. data/app/javascript/adminterface/initializers/batch_actions.js +9 -0
  76. data/app/javascript/adminterface/initializers/bootstrap.js +29 -0
  77. data/app/javascript/adminterface/initializers/confirm_dialog.js +23 -0
  78. data/app/javascript/adminterface/initializers/detached_dropdown.js +16 -0
  79. data/app/javascript/adminterface/initializers/drawer_menu_item_toggler.js +15 -0
  80. data/app/javascript/adminterface/initializers/filters.js +23 -0
  81. data/app/javascript/adminterface/initializers/has_many.js +7 -0
  82. data/app/javascript/adminterface/initializers/header_toggler.js +10 -0
  83. data/app/javascript/adminterface/initializers/index.js +2 -0
  84. data/app/javascript/adminterface/initializers/per_page.js +12 -0
  85. data/app/javascript/adminterface/initializers/plugins/flatpickr.js +24 -0
  86. data/app/javascript/adminterface/initializers/plugins/input_counter.js +21 -0
  87. data/app/javascript/adminterface/initializers/plugins/password_visibility.js +23 -0
  88. data/app/javascript/adminterface/initializers/plugins/tom_select.js +24 -0
  89. data/app/javascript/adminterface/lib/__tests__/checkbox_toggler.html +5 -0
  90. data/app/javascript/adminterface/lib/__tests__/checkbox_toggler.spec.js +110 -0
  91. data/app/javascript/adminterface/lib/__tests__/detached_dropdown.spec.js +69 -0
  92. data/app/javascript/adminterface/lib/__tests__/filters.spec.js +150 -0
  93. data/app/javascript/adminterface/lib/__tests__/has_many.html +14 -0
  94. data/app/javascript/adminterface/lib/__tests__/has_many.spec.js +224 -0
  95. data/app/javascript/adminterface/lib/__tests__/utils.spec.js +280 -0
  96. data/app/javascript/adminterface/lib/batch_actions.js +106 -0
  97. data/app/javascript/adminterface/lib/checkbox_toggler.js +55 -0
  98. data/app/javascript/adminterface/lib/confirm_dialog.js +113 -0
  99. data/app/javascript/adminterface/lib/detached_dropdown.js +34 -0
  100. data/app/javascript/adminterface/lib/filters.js +34 -0
  101. data/app/javascript/adminterface/lib/has_many.js +125 -0
  102. data/app/javascript/adminterface/lib/header_toggler.js +54 -0
  103. data/app/javascript/adminterface/lib/input.js +108 -0
  104. data/app/javascript/adminterface/lib/inputs/base/groupish.js +55 -0
  105. data/app/javascript/adminterface/lib/inputs/base/pluginish.js +63 -0
  106. data/app/javascript/adminterface/lib/inputs/base_input.js +87 -0
  107. data/app/javascript/adminterface/lib/inputs/boolean_input.js +30 -0
  108. data/app/javascript/adminterface/lib/inputs/check_boxes_input.js +14 -0
  109. data/app/javascript/adminterface/lib/inputs/choices_input.js +96 -0
  110. data/app/javascript/adminterface/lib/inputs/color_input.js +14 -0
  111. data/app/javascript/adminterface/lib/inputs/country_input.js +90 -0
  112. data/app/javascript/adminterface/lib/inputs/datalist_input.js +41 -0
  113. data/app/javascript/adminterface/lib/inputs/date_picker_input.js +11 -0
  114. data/app/javascript/adminterface/lib/inputs/datetime_picker_input.js +11 -0
  115. data/app/javascript/adminterface/lib/inputs/hidden_input.js +21 -0
  116. data/app/javascript/adminterface/lib/inputs/password_input.js +13 -0
  117. data/app/javascript/adminterface/lib/inputs/radio_input.js +13 -0
  118. data/app/javascript/adminterface/lib/inputs/select_input.js +68 -0
  119. data/app/javascript/adminterface/lib/inputs/string_input.js +13 -0
  120. data/app/javascript/adminterface/lib/inputs/switch_input.js +9 -0
  121. data/app/javascript/adminterface/lib/inputs/text_input.js +12 -0
  122. data/app/javascript/adminterface/lib/inputs/time_picker_input.js +13 -0
  123. data/app/javascript/adminterface/lib/inputs/time_zone_input.js +66 -0
  124. data/app/javascript/adminterface/lib/per_page.js +18 -0
  125. data/app/javascript/adminterface/lib/plugins/input_counter.js +94 -0
  126. data/app/javascript/adminterface/lib/plugins/password_visibility.js +70 -0
  127. data/app/javascript/adminterface/lib/table_checkbox_toggler.js +47 -0
  128. data/app/javascript/adminterface/lib/utils.js +148 -0
  129. data/app/views/active_admin/devise/confirmations/new.html.erb +19 -0
  130. data/app/views/active_admin/devise/passwords/edit.html.erb +21 -0
  131. data/app/views/active_admin/devise/passwords/new.html.erb +19 -0
  132. data/app/views/active_admin/devise/registrations/new.html.erb +24 -0
  133. data/app/views/active_admin/devise/sessions/new.html.erb +23 -0
  134. data/app/views/active_admin/devise/shared/_links.html.erb +25 -0
  135. data/app/views/active_admin/devise/shared/_omniauth.html.erb +10 -0
  136. data/app/views/active_admin/devise/unlocks/new.html.erb +19 -0
  137. data/app/views/kaminari/active_admin/_first_page.html.erb +11 -0
  138. data/app/views/kaminari/active_admin/_gap.html.erb +12 -0
  139. data/app/views/kaminari/active_admin/_last_page.html.erb +11 -0
  140. data/app/views/kaminari/active_admin/_next_page.html.erb +11 -0
  141. data/app/views/kaminari/active_admin/_page.html.erb +12 -0
  142. data/app/views/kaminari/active_admin/_paginator.html.erb +27 -0
  143. data/app/views/kaminari/active_admin/_prev_page.html.erb +11 -0
  144. data/app/views/layouts/active_admin_logged_out.html.erb +56 -0
  145. data/config/locales/active_admin.en.yml +25 -0
  146. data/lib/adminterface/callable.rb +7 -0
  147. data/lib/adminterface/configs.rb +76 -0
  148. data/lib/adminterface/data/base.rb +11 -0
  149. data/lib/adminterface/data/countries.rb +44 -0
  150. data/lib/adminterface/data/time_zones.rb +31 -0
  151. data/lib/adminterface/data.rb +6 -0
  152. data/lib/adminterface/encryption/encryptor.rb +26 -0
  153. data/lib/adminterface/engine.rb +22 -0
  154. data/lib/adminterface/extensions/base_controller.rb +59 -0
  155. data/lib/adminterface/extensions/batch_actions/resource_extension.rb +64 -0
  156. data/lib/adminterface/extensions/batch_actions/views/batch_action_selector.rb +48 -0
  157. data/lib/adminterface/extensions/batch_actions/views/selection_cells.rb +39 -0
  158. data/lib/adminterface/extensions/dsl.rb +13 -0
  159. data/lib/adminterface/extensions/dynamic_settings_node.rb +26 -0
  160. data/lib/adminterface/extensions/filters/forms.rb +76 -0
  161. data/lib/adminterface/extensions/form_builder.rb +165 -0
  162. data/lib/adminterface/extensions/inputs/base/active_admin_config.rb +21 -0
  163. data/lib/adminterface/extensions/inputs/base/choices.rb +33 -0
  164. data/lib/adminterface/extensions/inputs/base/groupish.rb +50 -0
  165. data/lib/adminterface/extensions/inputs/base/html.rb +15 -0
  166. data/lib/adminterface/extensions/inputs/base/labelling.rb +15 -0
  167. data/lib/adminterface/extensions/inputs/base/pluginish.rb +56 -0
  168. data/lib/adminterface/extensions/inputs/base/stringish.rb +19 -0
  169. data/lib/adminterface/extensions/inputs/base/wrapping.rb +25 -0
  170. data/lib/adminterface/extensions/inputs/base.rb +19 -0
  171. data/lib/adminterface/extensions/inputs/boolean_input.rb +42 -0
  172. data/lib/adminterface/extensions/inputs/check_boxes_input.rb +34 -0
  173. data/lib/adminterface/extensions/inputs/color_input.rb +29 -0
  174. data/lib/adminterface/extensions/inputs/country_input.rb +33 -0
  175. data/lib/adminterface/extensions/inputs/datalist_input.rb +26 -0
  176. data/lib/adminterface/extensions/inputs/date_picker_input.rb +30 -0
  177. data/lib/adminterface/extensions/inputs/date_select_input.rb +7 -0
  178. data/lib/adminterface/extensions/inputs/datetime_picker_input.rb +19 -0
  179. data/lib/adminterface/extensions/inputs/datetime_select_input.rb +7 -0
  180. data/lib/adminterface/extensions/inputs/email_input.rb +23 -0
  181. data/lib/adminterface/extensions/inputs/file_input.rb +19 -0
  182. data/lib/adminterface/extensions/inputs/filters/base/search_method_select.rb +37 -0
  183. data/lib/adminterface/extensions/inputs/filters/base.rb +3 -0
  184. data/lib/adminterface/extensions/inputs/filters/boolean_input.rb +4 -0
  185. data/lib/adminterface/extensions/inputs/filters/check_boxes_input.rb +12 -0
  186. data/lib/adminterface/extensions/inputs/filters/date_picker_input.rb +4 -0
  187. data/lib/adminterface/extensions/inputs/filters/date_range_input.rb +50 -0
  188. data/lib/adminterface/extensions/inputs/filters/select_input.rb +4 -0
  189. data/lib/adminterface/extensions/inputs/number_input.rb +23 -0
  190. data/lib/adminterface/extensions/inputs/password_input.rb +23 -0
  191. data/lib/adminterface/extensions/inputs/phone_input.rb +23 -0
  192. data/lib/adminterface/extensions/inputs/radio_input.rb +41 -0
  193. data/lib/adminterface/extensions/inputs/range_input.rb +22 -0
  194. data/lib/adminterface/extensions/inputs/rich_text_area_input.rb +21 -0
  195. data/lib/adminterface/extensions/inputs/search_input.rb +23 -0
  196. data/lib/adminterface/extensions/inputs/select_input.rb +33 -0
  197. data/lib/adminterface/extensions/inputs/string_input.rb +19 -0
  198. data/lib/adminterface/extensions/inputs/switch_input.rb +11 -0
  199. data/lib/adminterface/extensions/inputs/text_input.rb +27 -0
  200. data/lib/adminterface/extensions/inputs/time_picker_input.rb +19 -0
  201. data/lib/adminterface/extensions/inputs/time_select_input.rb +7 -0
  202. data/lib/adminterface/extensions/inputs/time_zone_input.rb +33 -0
  203. data/lib/adminterface/extensions/inputs/url_input.rb +23 -0
  204. data/lib/adminterface/extensions/menu_item.rb +16 -0
  205. data/lib/adminterface/extensions/namespace_settings.rb +30 -0
  206. data/lib/adminterface/extensions/orm/active_record/comments/views/active_admin_comments.rb +122 -0
  207. data/lib/adminterface/extensions/resource/action_items.rb +117 -0
  208. data/lib/adminterface/extensions/sidebar_section.rb +35 -0
  209. data/lib/adminterface/extensions/view_helpers/alert_helper.rb +38 -0
  210. data/lib/adminterface/extensions/view_helpers/component_helper.rb +23 -0
  211. data/lib/adminterface/extensions/views/action_items.rb +39 -0
  212. data/lib/adminterface/extensions/views/columns.rb +59 -0
  213. data/lib/adminterface/extensions/views/components/active_admin_form.rb +47 -0
  214. data/lib/adminterface/extensions/views/components/attributes_table.rb +28 -0
  215. data/lib/adminterface/extensions/views/components/blank_slate.rb +19 -0
  216. data/lib/adminterface/extensions/views/components/dropdown_menu.rb +58 -0
  217. data/lib/adminterface/extensions/views/components/icon.rb +26 -0
  218. data/lib/adminterface/extensions/views/components/index_list.rb +43 -0
  219. data/lib/adminterface/extensions/views/components/menu.rb +18 -0
  220. data/lib/adminterface/extensions/views/components/menu_item.rb +69 -0
  221. data/lib/adminterface/extensions/views/components/paginated_collection.rb +52 -0
  222. data/lib/adminterface/extensions/views/components/panel.rb +71 -0
  223. data/lib/adminterface/extensions/views/components/scopes.rb +53 -0
  224. data/lib/adminterface/extensions/views/components/sidebar_section.rb +39 -0
  225. data/lib/adminterface/extensions/views/components/site_title.rb +36 -0
  226. data/lib/adminterface/extensions/views/components/status_tag.rb +26 -0
  227. data/lib/adminterface/extensions/views/components/table_for.rb +23 -0
  228. data/lib/adminterface/extensions/views/components/tabs.rb +101 -0
  229. data/lib/adminterface/extensions/views/footer.rb +27 -0
  230. data/lib/adminterface/extensions/views/header.rb +60 -0
  231. data/lib/adminterface/extensions/views/index_as_grid.rb +53 -0
  232. data/lib/adminterface/extensions/views/index_as_table.rb +77 -0
  233. data/lib/adminterface/extensions/views/pages/base.rb +165 -0
  234. data/lib/adminterface/extensions/views/pages/form.rb +27 -0
  235. data/lib/adminterface/extensions/views/pages/index.rb +136 -0
  236. data/lib/adminterface/extensions/views/pages/page.rb +18 -0
  237. data/lib/adminterface/extensions/views/title_bar.rb +74 -0
  238. data/lib/adminterface/fixtures/components.yml +73 -0
  239. data/lib/adminterface/fixtures/css_classes.yml +107 -0
  240. data/lib/adminterface/initializers/batch_actions.rb +15 -0
  241. data/lib/adminterface/initializers/comments.rb +13 -0
  242. data/lib/adminterface/initializers/configurations.rb +38 -0
  243. data/lib/adminterface/initializers/formtastic.rb +58 -0
  244. data/lib/adminterface/initializers/resource.rb +20 -0
  245. data/lib/adminterface/initializers/view_helpers.rb +14 -0
  246. data/lib/adminterface/initializers/views.rb +39 -0
  247. data/lib/adminterface/license.rb +18 -0
  248. data/lib/adminterface/licensing/base.rb +99 -0
  249. data/lib/adminterface/licensing/commercial.rb +7 -0
  250. data/lib/adminterface/licensing/notice.rb +54 -0
  251. data/lib/adminterface/licensing/personal.rb +13 -0
  252. data/lib/adminterface/public.pem +9 -0
  253. data/lib/adminterface/version.rb +3 -0
  254. data/lib/adminterface.rb +55 -0
  255. data/lib/generators/adminterface/comments/comments_generator.rb +33 -0
  256. data/lib/generators/adminterface/comments/templates/README +13 -0
  257. data/lib/generators/adminterface/comments/templates/active_admin_comment_action_text.rb +18 -0
  258. data/lib/generators/adminterface/comments/templates/migrations/drop_body_for_active_admin_comments.rb.erb +28 -0
  259. data/lib/generators/adminterface/configs/configs_generator.rb +19 -0
  260. data/lib/generators/adminterface/configs/templates/README +33 -0
  261. data/lib/generators/adminterface/install/install_generator.rb +39 -0
  262. data/lib/generators/adminterface/install/templates/dashboard.rb +32 -0
  263. data/lib/generators/adminterface/views/views_generator.rb +15 -0
  264. data/lib/generators/adminterface/webpacker/templates/README +27 -0
  265. data/lib/generators/adminterface/webpacker/templates/active_admin.js +12 -0
  266. data/lib/generators/adminterface/webpacker/templates/active_admin.scss +8 -0
  267. data/lib/generators/adminterface/webpacker/templates/print.scss +3 -0
  268. data/lib/generators/adminterface/webpacker/webpacker_generator.rb +69 -0
  269. data/lib/tasks/adminterface_tasks.rake +4 -0
  270. metadata +291 -10
  271. data/lib/name.rb +0 -1
@@ -0,0 +1,70 @@
1
+ /* global DOMParser, adminterface */
2
+ import { getObjectValue, toHTMLCssString } from '../utils'
3
+
4
+ class PasswordVisibility {
5
+ constructor (element, options) {
6
+ const translations = adminterface.meta.translations
7
+ const defaults = {
8
+ activeClass: 'show',
9
+ wrapperClass: '.input-group'
10
+ }
11
+
12
+ this.element = element
13
+ this.options = { ...defaults, ...options }
14
+ this.translations = (getObjectValue(translations, 'inputs.password') || {})
15
+
16
+ this._bind()
17
+ }
18
+
19
+ _template () {
20
+ return `
21
+ <div class="input-group-text password-visibility-toggler">
22
+ <i data-mode="show" data-bs-toggle="tooltip" title="${getObjectValue(this.translations, 'visibility.show')}"></i>
23
+ <i data-mode="hide" data-bs-toggle="tooltip" title="${getObjectValue(this.translations, 'visibility.hide')}"></i>
24
+ </div>
25
+ `
26
+ }
27
+
28
+ _isWrapped () {
29
+ return this.element.parentNode.classList.contains(toHTMLCssString(this.options.wrapperClass))
30
+ }
31
+
32
+ _insert () {
33
+ const el = this.element
34
+ const toggler = new DOMParser().parseFromString(this._template(), 'text/html').body.childNodes[0]
35
+
36
+ if (!this._isWrapped()) {
37
+ const wrapper = document.createElement('div')
38
+ el.parentNode.insertBefore(wrapper, el)
39
+ wrapper.classList.add(toHTMLCssString(this.options.wrapperClass))
40
+ wrapper.appendChild(el)
41
+ }
42
+
43
+ el.parentNode.insertBefore(toggler, el.nextSibling)
44
+ }
45
+
46
+ _bind () {
47
+ this._insert()
48
+ const group = this.element.closest('.password.input')
49
+ const trigger = group.querySelector('.password-visibility-toggler')
50
+ const input = group.querySelector('input')
51
+ const activeClass = this.options.activeClass
52
+
53
+ trigger.addEventListener('click', function (e) {
54
+ e.preventDefault()
55
+
56
+ if (trigger.classList.contains(activeClass)) {
57
+ trigger.classList.remove(activeClass)
58
+ input.type = 'password'
59
+ } else {
60
+ trigger.classList.add(activeClass)
61
+ input.type = 'text'
62
+ }
63
+ })
64
+
65
+ this.eventTarget = group
66
+ adminterface.addObserver(this.element, this, this.constructor.name)
67
+ }
68
+ }
69
+
70
+ export default PasswordVisibility
@@ -0,0 +1,47 @@
1
+ import CheckboxToggler from '../lib/checkbox_toggler'
2
+
3
+ class TableCheckboxToggler extends CheckboxToggler {
4
+ _bind () {
5
+ super._bind(...arguments)
6
+
7
+ const $cells = this.$container.querySelectorAll('tbody td')
8
+
9
+ $cells.forEach((el) => {
10
+ el.addEventListener('click', (e) => {
11
+ if (e.target.type !== 'checkbox') {
12
+ this._didClickCell(e.target)
13
+ }
14
+ })
15
+ })
16
+ }
17
+
18
+ _didChangeCheckbox (checkbox) {
19
+ super._didChangeCheckbox(...arguments)
20
+
21
+ if (checkbox.checked) {
22
+ checkbox.closest('tr').classList.add('selected')
23
+ } else {
24
+ checkbox.closest('tr').classList.remove('selected')
25
+ }
26
+ }
27
+
28
+ _didChangeToggleAllCheckbox () {
29
+ const rows = this.$container.querySelectorAll('tbody tr')
30
+ const checked = super._didChangeToggleAllCheckbox(...arguments)
31
+
32
+ rows.forEach((row) => {
33
+ if (checked) {
34
+ row.classList.add('selected')
35
+ } else {
36
+ row.classList.remove('selected')
37
+ }
38
+ })
39
+ }
40
+
41
+ _didClickCell (cell) {
42
+ const $checkbox = cell.parentNode.querySelector('input[type="checkbox"]')
43
+ if ($checkbox) $checkbox.click()
44
+ }
45
+ }
46
+
47
+ export default TableCheckboxToggler
@@ -0,0 +1,148 @@
1
+ /* global Turbolinks */
2
+ export function hasTurbolinks () {
3
+ return (typeof Turbolinks !== 'undefined' && Turbolinks.supported)
4
+ }
5
+
6
+ export function turbolinksVisit (params) {
7
+ const path = [window.location.pathname, '?', toQueryString(params)].join('')
8
+ Turbolinks.visit(path)
9
+ }
10
+
11
+ export function queryString () {
12
+ return (window.location.search || '').replace(/^\?/, '')
13
+ }
14
+
15
+ export function queryStringToParams () {
16
+ const decode = (value) => decodeURIComponent((value || '').replace(/\+/g, '%20'))
17
+
18
+ return queryString()
19
+ .split('&')
20
+ .map(pair => pair.split('='))
21
+ .map(([key, value]) => {
22
+ return { name: decode(key), value: decode(value) }
23
+ })
24
+ }
25
+
26
+ export function toHTMLAttrString (obj) {
27
+ const object = obj || {}
28
+ const arr = []
29
+ Object.keys(object).forEach((key) => {
30
+ let value = object[key]
31
+
32
+ if (typeof (value) === 'object') {
33
+ value = JSON.stringify(value)
34
+ }
35
+
36
+ arr.push(`${key}='${value}'`)
37
+ })
38
+
39
+ return arr.join(' ')
40
+ }
41
+
42
+ export function toQueryString (params) {
43
+ const encode = (value) => encodeURIComponent(value || '')
44
+
45
+ return params
46
+ .map(({ name, value }) => [encode(name), encode(value)])
47
+ .map(pair => pair.join('='))
48
+ .join('&')
49
+ }
50
+
51
+ export function serializeArray (form) {
52
+ const arr = []
53
+
54
+ Array.prototype.slice.call(form.elements).forEach((field) => {
55
+ if (!field.name || field.disabled || ['file', 'reset', 'submit', 'button'].indexOf(field.type) > -1) return
56
+ if (field.type === 'select-multiple') {
57
+ Array.prototype.slice.call(field.options).forEach((option) => {
58
+ if (!option.selected) return
59
+ arr.push({
60
+ name: field.name,
61
+ value: option.value
62
+ })
63
+ })
64
+ return
65
+ }
66
+ if (['checkbox', 'radio'].indexOf(field.type) > -1 && !field.checked) return
67
+ arr.push({
68
+ name: field.name,
69
+ value: field.value
70
+ })
71
+ })
72
+
73
+ return arr
74
+ }
75
+
76
+ export function serializeObject (form) {
77
+ return serializeArray(form).reduce((obj, item) => {
78
+ obj[item.name] = item.value
79
+ return obj
80
+ }, {})
81
+ }
82
+
83
+ export function cookieSet (name, value, expireInSec) {
84
+ const expireAt = new Date()
85
+ expireAt.setTime(expireAt.getTime() + expireInSec * 1000)
86
+
87
+ document.cookie = `${name}=${value};expires=${expireAt.toGMTString()};path=/`
88
+ }
89
+
90
+ export function cookieGet (name) {
91
+ const cookieName = `${name}=`
92
+ const ca = document.cookie.split(';')
93
+ for (let i = 0; i < ca.length; i++) {
94
+ let c = ca[i]
95
+ while (c.charAt(0) === ' ') c = c.substring(1, c.length)
96
+ if (c.indexOf(cookieName) === 0) return c.substring(cookieName.length, c.length)
97
+ }
98
+ return null
99
+ }
100
+
101
+ export function getObjectValue (data, path) {
102
+ const arr = path.split('.')
103
+
104
+ for (let i = 0; typeof data === 'object' && i < arr.length; i++) {
105
+ data = data[arr[i]]
106
+ }
107
+
108
+ return data
109
+ }
110
+
111
+ export function deepMergeObject (target, source) {
112
+ for (const key of Object.keys(source)) {
113
+ if (source[key] instanceof Object) Object.assign(source[key], deepMergeObject(target[key], source[key]))
114
+ }
115
+
116
+ Object.assign(target || {}, source)
117
+ return target
118
+ }
119
+
120
+ export function toSnakeCase (string) {
121
+ return (
122
+ string
123
+ .match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g)
124
+ .map(x => x.toLowerCase())
125
+ .join('_')
126
+ )
127
+ }
128
+
129
+ export function toHTMLCssString (string) {
130
+ return string.replace(/[.#]/, '')
131
+ }
132
+
133
+ export function setObjectValue (obj, path, value) {
134
+ const pList = path.split('.')
135
+ const len = pList.length
136
+
137
+ for (let i = 0; i < len - 1; i++) {
138
+ const elem = pList[i]
139
+ if (!obj[elem]) obj[elem] = {}
140
+ obj = obj[elem]
141
+ }
142
+
143
+ obj[pList[len - 1]] = value
144
+ }
145
+
146
+ export function camalize (str) {
147
+ return str.toLowerCase().replace(/[^a-zA-Z0-9]+(.)/g, (m, chr) => chr.toUpperCase())
148
+ }
@@ -0,0 +1,19 @@
1
+ <% content_for :title do %>
2
+ <%= title t("active_admin.devise.resend_confirmation_instructions.title") %>
3
+ <% end %>
4
+
5
+ <%= devise_error_messages! %>
6
+ <%= active_admin_form_for(resource, as: resource_name, url: confirmation_path(resource_name), html: { method: :post }) do |f|
7
+ f.inputs do
8
+ f.input :email
9
+ end
10
+ f.actions do
11
+ f.action :submit,
12
+ label: t("active_admin.devise.resend_confirmation_instructions.submit"),
13
+ wrapper_html: {class: "d-block w-100"},
14
+ button_html: {
15
+ value: t("active_admin.devise.resend_confirmation_instructions.submit"),
16
+ class: "btn btn-primary w-100"
17
+ }
18
+ end
19
+ end %>
@@ -0,0 +1,21 @@
1
+ <% content_for :title do %>
2
+ <%= title t("active_admin.devise.change_password.title") %>
3
+ <% end %>
4
+
5
+ <%= devise_error_messages! %>
6
+ <%= active_admin_form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :put }) do |f|
7
+ f.inputs do
8
+ f.input :password, visibility: true
9
+ f.input :password_confirmation, visibility: true
10
+ f.input :reset_password_token, as: :hidden, input_html: { value: resource.reset_password_token }
11
+ end
12
+ f.actions do
13
+ f.action :submit,
14
+ label: t("active_admin.devise.change_password.submit"),
15
+ wrapper_html: {class: "d-block w-100"},
16
+ button_html: {
17
+ value: t("active_admin.devise.change_password.submit"),
18
+ class: "btn btn-primary w-100"
19
+ }
20
+ end
21
+ end %>
@@ -0,0 +1,19 @@
1
+ <% content_for :title do %>
2
+ <%= title t("active_admin.devise.reset_password.title") %>
3
+ <% end %>
4
+
5
+ <%= devise_error_messages! %>
6
+ <%= active_admin_form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :post }) do |f|
7
+ f.inputs do
8
+ f.input :email
9
+ end
10
+ f.actions do
11
+ f.action :submit,
12
+ label: t("active_admin.devise.reset_password.submit"),
13
+ wrapper_html: {class: "d-block w-100"},
14
+ button_html: {
15
+ value: t("active_admin.devise.reset_password.submit"),
16
+ class: "btn btn-primary w-100"
17
+ }
18
+ end
19
+ end %>
@@ -0,0 +1,24 @@
1
+ <% content_for :title do %>
2
+ <%= title t("active_admin.devise.sign_up.title") %>
3
+ <% end %>
4
+
5
+ <% scope = Devise::Mapping.find_scope!(resource_name) %>
6
+ <%= devise_error_messages! %>
7
+ <%= active_admin_form_for(resource, as: resource_name, url: send(:"#{scope}_registration_path"), html: { id: "registration_new" }) do |f|
8
+ f.inputs do
9
+ resource.class.authentication_keys.each_with_index { |key, index|
10
+ f.input key, label: t("active_admin.devise."+key.to_s+".title"), input_html: { autofocus: index.zero? }
11
+ }
12
+ f.input :password, label: t("active_admin.devise.password.title")
13
+ f.input :password_confirmation, label: t("active_admin.devise.password_confirmation.title")
14
+ end
15
+ f.actions do
16
+ f.action :submit,
17
+ label: t("active_admin.devise.login.submit"),
18
+ wrapper_html: {class: "d-block w-100"},
19
+ button_html: {
20
+ value: t("active_admin.devise.sign_up.submit"),
21
+ class: "btn btn-primary w-100"
22
+ }
23
+ end
24
+ end %>
@@ -0,0 +1,23 @@
1
+ <% content_for :title do %>
2
+ <%= title t("active_admin.devise.login.title") %>
3
+ <% end %>
4
+
5
+ <% scope = Devise::Mapping.find_scope!(resource_name) %>
6
+ <%= active_admin_form_for(resource, as: resource_name, url: send(:"#{scope}_session_path"), html: { id: "session_new" }) do |f|
7
+ f.inputs do
8
+ resource.class.authentication_keys.each_with_index { |key, index|
9
+ f.input key, label: t("active_admin.devise.#{key}.title"), input_html: { autofocus: index.zero? }
10
+ }
11
+ f.input :password, label: t("active_admin.devise.password.title")
12
+ f.input :remember_me, label: t("active_admin.devise.login.remember_me"), as: :boolean if devise_mapping.rememberable?
13
+ end
14
+ f.actions do
15
+ f.action :submit,
16
+ label: t("active_admin.devise.login.submit"),
17
+ wrapper_html: {class: "d-block w-100"},
18
+ button_html: {
19
+ value: t("active_admin.devise.login.submit"),
20
+ class: "btn btn-primary w-100"
21
+ }
22
+ end
23
+ end %>
@@ -0,0 +1,25 @@
1
+ <%- if controller_name != 'sessions' %>
2
+ <% scope = Devise::Mapping.find_scope!(resource_name) %>
3
+ <%= link_to t('active_admin.devise.links.sign_in'), send(:"new_#{scope}_session_path") %>
4
+ <br>
5
+ <% end -%>
6
+
7
+ <%- if devise_mapping.registerable? && controller_name != 'registrations' %>
8
+ <%= link_to t('active_admin.devise.links.sign_up'), new_registration_path(resource_name) %>
9
+ <br>
10
+ <% end -%>
11
+
12
+ <%- if devise_mapping.recoverable? && controller_name != 'passwords' %>
13
+ <%= link_to t('active_admin.devise.links.forgot_your_password'), new_password_path(resource_name) %>
14
+ <br>
15
+ <% end -%>
16
+
17
+ <%- if devise_mapping.confirmable? && controller_name != 'confirmations' %>
18
+ <%= link_to t('active_admin.devise.links.resend_confirmation_instructions'), new_confirmation_path(resource_name) %>
19
+ <br>
20
+ <% end -%>
21
+
22
+ <%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %>
23
+ <%= link_to t('active_admin.devise.links.resend_unlock_instructions'), new_unlock_path(resource_name) %>
24
+ <br>
25
+ <% end -%>
@@ -0,0 +1,10 @@
1
+ <%- if devise_mapping.omniauthable? %>
2
+ <div class="d-grid gap-2">
3
+ <%- resource_class.omniauth_providers.each do |provider| %>
4
+ <%= link_to t('active_admin.devise.links.sign_in_with_omniauth_provider', provider: provider.to_s.titleize),
5
+ omniauth_authorize_path(resource_name, provider), class: "btn btn-light" %>
6
+ <% end -%>
7
+ </div>
8
+
9
+ <div class="divider my-4"><%= I18n.t(:divider, scope: "active_admin.devise.omniauth") %></div>
10
+ <% end -%>
@@ -0,0 +1,19 @@
1
+ <% content_for :title do %>
2
+ <%= title t("active_admin.devise.unlock.title") %>
3
+ <% end %>
4
+
5
+ <%= devise_error_messages! %>
6
+ <%= active_admin_form_for(resource, as: resource_name, url: unlock_path(resource_name), html: { method: :post }) do |f|
7
+ f.inputs do
8
+ f.input :email
9
+ end
10
+ f.actions do
11
+ f.action :submit,
12
+ label: t("active_admin.devise.unlock.submit"),
13
+ wrapper_html: {class: "d-block w-100"},
14
+ button_html: {
15
+ value: t("active_admin.devise.unlock.submit"),
16
+ class: "btn btn-primary w-100"
17
+ }
18
+ end
19
+ end %>
@@ -0,0 +1,11 @@
1
+ <%# Link to the "First" page
2
+ - available local variables
3
+ url: url to the first page
4
+ current_page: a page object for the currently displayed page
5
+ total_pages: total number of pages
6
+ per_page: number of items to fetch per page
7
+ remote: data-remote
8
+ -%>
9
+ <li class="first page-item">
10
+ <%= link_to_unless current_page.first?, t('views.pagination.first').html_safe, url, remote: remote, class: 'page-link' %>
11
+ </li>
@@ -0,0 +1,12 @@
1
+ <%# Non-link tag that stands for skipped pages...
2
+ - available local variables
3
+ current_page: a page object for the currently displayed page
4
+ total_pages: total number of pages
5
+ per_page: number of items to fetch per page
6
+ remote: data-remote
7
+ -%>
8
+ <li class="page gap page-item disabled">
9
+ <a href="#" onclick="return false;" class="page-link">
10
+ <%= t('views.pagination.truncate').html_safe %>
11
+ </a>
12
+ </li>
@@ -0,0 +1,11 @@
1
+ <%# Link to the "Last" page
2
+ - available local variables
3
+ url: url to the last page
4
+ current_page: a page object for the currently displayed page
5
+ total_pages: total number of pages
6
+ per_page: number of items to fetch per page
7
+ remote: data-remote
8
+ -%>
9
+ <li class="last page-item">
10
+ <%= link_to_unless current_page.last?, t('views.pagination.last').html_safe, url, remote: remote, class: 'page-link' %>
11
+ </li>
@@ -0,0 +1,11 @@
1
+ <%# Link to the "Next" page
2
+ - available local variables
3
+ url: url to the next page
4
+ current_page: a page object for the currently displayed page
5
+ total_pages: total number of pages
6
+ per_page: number of items to fetch per page
7
+ remote: data-remote
8
+ -%>
9
+ <li class="next page-item">
10
+ <%= link_to_unless current_page.last?, t('views.pagination.next').html_safe, url, rel: 'next', remote: remote, class: 'page-link' %>
11
+ </li>
@@ -0,0 +1,12 @@
1
+ <%# Link showing page number
2
+ - available local variables
3
+ page: a page object for "this" page
4
+ url: url to this page
5
+ current_page: a page object for the currently displayed page
6
+ total_pages: total number of pages
7
+ per_page: number of items to fetch per page
8
+ remote: data-remote
9
+ -%>
10
+ <li class="page<%= ' current active' if page.current? %> page-item">
11
+ <%= link_to page, url, remote: remote, rel: page.rel, class: 'page-link' %>
12
+ </li>
@@ -0,0 +1,27 @@
1
+ <%# The container tag
2
+ - available local variables
3
+ current_page: a page object for the currently displayed page
4
+ total_pages: total number of pages
5
+ per_page: number of items to fetch per page
6
+ remote: data-remote
7
+ paginator: the paginator that renders the pagination tags inside
8
+ -%>
9
+ <%= paginator.render do -%>
10
+ <nav class='paginator'>
11
+ <ul class="pagination">
12
+ <%= first_page_tag unless current_page.first? %>
13
+ <%= prev_page_tag unless current_page.first? %>
14
+ <% each_page do |page| -%>
15
+ <% if page.display_tag? -%>
16
+ <%= page_tag page %>
17
+ <% elsif !page.was_truncated? -%>
18
+ <%= gap_tag %>
19
+ <% end -%>
20
+ <% end -%>
21
+ <% unless current_page.out_of_range? %>
22
+ <%= next_page_tag unless current_page.last? %>
23
+ <%= last_page_tag unless current_page.last? %>
24
+ <% end %>
25
+ </ul>
26
+ </nav>
27
+ <% end -%>
@@ -0,0 +1,11 @@
1
+ <%# Link to the "Previous" page
2
+ - available local variables
3
+ url: url to the previous page
4
+ current_page: a page object for the currently displayed page
5
+ total_pages: total number of pages
6
+ per_page: number of items to fetch per page
7
+ remote: data-remote
8
+ -%>
9
+ <li class="prev page-item">
10
+ <%= link_to_unless current_page.first?, t('views.pagination.previous').html_safe, url, rel: 'prev', remote: remote, class: 'page-link' %>
11
+ </li>
@@ -0,0 +1,56 @@
1
+ <!DOCTYPE html>
2
+ <html lang="<%=I18n.locale%>">
3
+ <head>
4
+ <meta http-equiv="Content-type" content="text/html; charset=utf-8">
5
+ <title><%= [@page_title, ActiveAdmin.application.site_title(self)].compact.join(" | ") %></title>
6
+
7
+ <% ActiveAdmin.application.stylesheets.each do |style, options| %>
8
+ <% if ActiveAdmin.application.use_webpacker %>
9
+ <%= stylesheet_pack_tag style, **options %>
10
+ <% else %>
11
+ <%= stylesheet_link_tag style, **options %>
12
+ <% end %>
13
+ <% end %>
14
+ <% ActiveAdmin.application.javascripts.each do |path| %>
15
+ <% if ActiveAdmin.application.use_webpacker %>
16
+ <%= javascript_pack_tag path %>
17
+ <% else %>
18
+ <%= javascript_include_tag path %>
19
+ <% end %>
20
+ <% end %>
21
+
22
+ <%= favicon_link_tag ActiveAdmin.application.favicon if ActiveAdmin.application.favicon %>
23
+
24
+ <% ActiveAdmin.application.meta_tags_for_logged_out_pages.each do |name, content| %>
25
+ <%= tag(:meta, name: name, content: content) %>
26
+ <% end %>
27
+
28
+ <%= csrf_meta_tag %>
29
+ </head>
30
+ <body class="d-flex flex-column justify-content-center min-vh-100 py-4 active_admin logged_out <%= controller.action_name %>">
31
+ <div class="container-fluid">
32
+ <div class="row" id="content_wrapper">
33
+ <div class="col-md-6 col-lg-5 col-xl-4 mx-auto">
34
+ <div id="active_admin_content">
35
+ <div class="site-title-wrap mb-3">
36
+ <%= site_title ActiveAdmin.application %>
37
+ </div>
38
+ <div class="card panel">
39
+ <h5 class="card-header"><%= yield :title %></h5>
40
+ <div class="card-body">
41
+ <%= flashes_html %>
42
+ <%= render "active_admin/devise/shared/omniauth" %>
43
+ <%= yield %>
44
+ </div>
45
+ <div class="card-footer">
46
+ <%= render "active_admin/devise/shared/links" %>
47
+ </div>
48
+ </div>
49
+ </div>
50
+ </div>
51
+ </div>
52
+
53
+ <%= footer ActiveAdmin.application %>
54
+ </div>
55
+ </body>
56
+ </html>
@@ -0,0 +1,25 @@
1
+ ---
2
+ en:
3
+ active_admin:
4
+ batch_actions:
5
+ confirm_dialog:
6
+ cancel: Cancel
7
+ confirm: Confirm
8
+ confirm_dialog:
9
+ cancel: Cancel
10
+ confirm: Confirm
11
+ dashboard_welcome:
12
+ call_to_action: To add dashboard sections, checkout <code>app/admin/dashboard.rb</code>
13
+ footnote: |
14
+ Check our <a href="https://adminterface.io/" target="_blank" rel="noopener noreferrer">website</a>
15
+ to find in-depth documentation for everything that Adminterface offers.
16
+ welcome: Welcome to Adminterface. This is the default dashboard page.
17
+ devise:
18
+ omniauth:
19
+ divider: Or
20
+ filter_model: Find %{model}
21
+ inputs:
22
+ password:
23
+ visibility:
24
+ hide: Hide
25
+ show: Show
@@ -0,0 +1,7 @@
1
+ module Adminterface
2
+ module Callable
3
+ def call(*args, **kwargs, &block)
4
+ new(*args, **kwargs).call(&block)
5
+ end
6
+ end
7
+ end