activeadmin 3.4.0 → 4.0.0.beta18

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 (357) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -102
  3. data/CONTRIBUTING.md +32 -117
  4. data/README.md +17 -30
  5. data/UPGRADING.md +241 -0
  6. data/app/assets/config/active_admin_manifest.js +2 -0
  7. data/{lib → app/controllers}/active_admin/base_controller/authorization.rb +1 -1
  8. data/app/controllers/active_admin/base_controller/menu.rb +39 -0
  9. data/{lib → app/controllers}/active_admin/base_controller.rb +46 -18
  10. data/{lib → app/controllers}/active_admin/page_controller.rb +0 -4
  11. data/{lib → app/controllers}/active_admin/resource_controller/action_builder.rb +1 -1
  12. data/{lib → app/controllers}/active_admin/resource_controller/data_access.rb +11 -6
  13. data/{lib → app/controllers}/active_admin/resource_controller/scoping.rb +1 -1
  14. data/{lib → app/controllers}/active_admin/resource_controller/streaming.rb +4 -4
  15. data/app/controllers/active_admin/resource_controller.rb +102 -0
  16. data/app/helpers/active_admin/auto_link_helper.rb +66 -0
  17. data/app/helpers/active_admin/breadcrumb_helper.rb +41 -0
  18. data/app/helpers/active_admin/display_helper.rb +117 -0
  19. data/app/helpers/active_admin/form_helper.rb +95 -0
  20. data/app/helpers/active_admin/index_helper.rb +40 -0
  21. data/app/helpers/active_admin/layout_helper.rb +63 -0
  22. data/app/javascript/active_admin/features/batch_actions.js +95 -0
  23. data/app/javascript/active_admin/features/dark_mode_toggle.js +37 -0
  24. data/app/javascript/active_admin/features/filters.js +34 -0
  25. data/app/javascript/active_admin/features/has_many.js +28 -0
  26. data/app/javascript/active_admin/features/main_menu.js +12 -0
  27. data/app/javascript/active_admin/features/per_page.js +9 -0
  28. data/app/javascript/active_admin/utils/dom.js +17 -0
  29. data/app/javascript/active_admin.js +10 -0
  30. data/app/views/active_admin/_flash_messages.html.erb +22 -0
  31. data/app/views/active_admin/_html_head.html.erb +13 -0
  32. data/app/views/active_admin/_main_navigation.html.erb +28 -0
  33. data/app/views/active_admin/_page_header.html.erb +27 -0
  34. data/app/views/active_admin/_sidebar.html.erb +5 -0
  35. data/app/views/active_admin/_site_footer.html.erb +7 -0
  36. data/app/views/active_admin/_site_header.html.erb +30 -0
  37. data/app/views/active_admin/devise/confirmations/new.html.erb +5 -3
  38. data/app/views/active_admin/devise/passwords/edit.html.erb +5 -3
  39. data/app/views/active_admin/devise/passwords/new.html.erb +5 -4
  40. data/app/views/active_admin/devise/registrations/new.html.erb +6 -4
  41. data/app/views/active_admin/devise/sessions/new.html.erb +6 -4
  42. data/app/views/active_admin/devise/shared/_links.erb +3 -1
  43. data/app/views/active_admin/devise/unlocks/new.html.erb +6 -4
  44. data/app/views/{kaminari/active_admin_countless → active_admin/kaminari}/_gap.html.erb +3 -1
  45. data/app/views/active_admin/kaminari/_next_page.html.erb +16 -0
  46. data/app/views/active_admin/kaminari/_page.html.erb +14 -0
  47. data/app/views/{kaminari/active_admin_countless → active_admin/kaminari}/_paginator.html.erb +1 -2
  48. data/app/views/active_admin/kaminari/_prev_page.html.erb +16 -0
  49. data/app/views/active_admin/page/index.html.arb +5 -2
  50. data/app/views/active_admin/resource/_active_filters.html.erb +32 -0
  51. data/app/views/active_admin/resource/_batch_actions_dropdown.html.erb +19 -0
  52. data/app/views/active_admin/resource/_form.html.arb +15 -0
  53. data/app/views/active_admin/resource/_form_default.html.arb +11 -0
  54. data/app/views/active_admin/resource/_index_as_table_default.html.arb +8 -0
  55. data/app/views/active_admin/resource/_index_blank_slate.html.erb +14 -0
  56. data/app/views/active_admin/resource/_index_empty_results.html.erb +5 -0
  57. data/app/views/active_admin/resource/_index_table_actions_default.html.erb +9 -0
  58. data/app/views/active_admin/resource/_show_default.html.arb +2 -0
  59. data/app/views/active_admin/resource/edit.html.arb +1 -2
  60. data/app/views/active_admin/resource/index.html.arb +94 -2
  61. data/app/views/active_admin/resource/new.html.arb +1 -2
  62. data/app/views/active_admin/resource/show.html.arb +12 -2
  63. data/app/views/active_admin/shared/_action_items.html.erb +3 -0
  64. data/app/views/active_admin/shared/_download_format_links.html.erb +7 -0
  65. data/app/views/active_admin/shared/_resource_comments.html.erb +51 -0
  66. data/app/views/active_admin/shared/_sidebar_section.html.arb +6 -0
  67. data/app/views/active_admin/shared/_sidebar_sections.html.erb +5 -0
  68. data/app/views/layouts/active_admin.html.erb +20 -0
  69. data/app/views/layouts/active_admin_logged_out.html.erb +8 -45
  70. data/config/importmap.rb +5 -0
  71. data/config/locales/ar.yml +136 -116
  72. data/config/locales/az.yml +103 -118
  73. data/config/locales/bg.yml +91 -99
  74. data/config/locales/bs.yml +95 -101
  75. data/config/locales/ca.yml +131 -86
  76. data/config/locales/cs.yml +82 -90
  77. data/config/locales/da.yml +102 -117
  78. data/config/locales/de.yml +130 -141
  79. data/config/locales/el.yml +94 -106
  80. data/config/locales/en-CA.yml +104 -119
  81. data/config/locales/en-GB.yml +104 -119
  82. data/config/locales/en.yml +134 -140
  83. data/config/locales/eo.yml +107 -123
  84. data/config/locales/es-MX.yml +70 -78
  85. data/config/locales/es.yml +129 -138
  86. data/config/locales/fa.yml +91 -99
  87. data/config/locales/fi.yml +84 -92
  88. data/config/locales/fr.yml +135 -120
  89. data/config/locales/he.yml +103 -118
  90. data/config/locales/hr.yml +95 -103
  91. data/config/locales/hu.yml +76 -81
  92. data/config/locales/id.yml +97 -112
  93. data/config/locales/it.yml +134 -140
  94. data/config/locales/ja.yml +109 -120
  95. data/config/locales/ko.yml +136 -101
  96. data/config/locales/lt.yml +106 -121
  97. data/config/locales/lv.yml +70 -75
  98. data/config/locales/mk.yml +100 -114
  99. data/config/locales/nb.yml +98 -109
  100. data/config/locales/nl.yml +113 -122
  101. data/config/locales/pl.yml +137 -146
  102. data/config/locales/pt-BR.yml +134 -121
  103. data/config/locales/pt-PT.yml +71 -76
  104. data/config/locales/ro.yml +74 -79
  105. data/config/locales/ru.yml +142 -122
  106. data/config/locales/sk.yml +131 -146
  107. data/config/locales/sv-SE.yml +126 -141
  108. data/config/locales/tr.yml +105 -120
  109. data/config/locales/uk.yml +140 -119
  110. data/config/locales/vi.yml +125 -140
  111. data/config/locales/zh-CN.yml +135 -141
  112. data/config/locales/zh-TW.yml +136 -116
  113. data/lib/active_admin/application.rb +6 -14
  114. data/lib/active_admin/application_settings.rb +1 -1
  115. data/lib/active_admin/async_count.rb +23 -0
  116. data/lib/active_admin/batch_actions/controller.rb +1 -4
  117. data/lib/active_admin/batch_actions/resource_extension.rb +8 -15
  118. data/lib/active_admin/batch_actions/views/batch_action_form.rb +1 -7
  119. data/lib/active_admin/batch_actions/views/selection_cells.rb +3 -3
  120. data/lib/active_admin/batch_actions.rb +4 -9
  121. data/lib/active_admin/callbacks.rb +6 -4
  122. data/lib/active_admin/collection_decorator.rb +1 -1
  123. data/lib/active_admin/component.rb +0 -1
  124. data/lib/active_admin/csv_builder.rb +2 -2
  125. data/lib/active_admin/devise.rb +3 -3
  126. data/lib/active_admin/dsl.rb +3 -3
  127. data/lib/active_admin/dynamic_settings_node.rb +6 -6
  128. data/lib/active_admin/engine.rb +23 -7
  129. data/lib/active_admin/filters/active.rb +8 -6
  130. data/lib/active_admin/filters/active_filter.rb +2 -10
  131. data/lib/active_admin/filters/forms.rb +1 -45
  132. data/lib/active_admin/filters/resource_extension.rb +18 -10
  133. data/lib/active_admin/filters.rb +5 -7
  134. data/lib/active_admin/form_builder.rb +14 -17
  135. data/lib/active_admin/helpers/optional_display.rb +1 -1
  136. data/lib/active_admin/inputs/filters/base/search_method_select.rb +10 -12
  137. data/lib/active_admin/inputs/filters/base.rb +1 -1
  138. data/lib/active_admin/inputs/filters/check_boxes_input.rb +1 -6
  139. data/lib/active_admin/inputs/filters/date_range_input.rb +4 -2
  140. data/lib/active_admin/inputs.rb +0 -3
  141. data/lib/active_admin/localizers.rb +1 -1
  142. data/lib/active_admin/menu.rb +10 -7
  143. data/lib/active_admin/menu_collection.rb +1 -1
  144. data/lib/active_admin/menu_item.rb +24 -3
  145. data/lib/active_admin/namespace.rb +3 -45
  146. data/lib/active_admin/namespace_settings.rb +3 -36
  147. data/lib/active_admin/order_clause.rb +4 -1
  148. data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +4 -76
  149. data/lib/active_admin/orm/active_record/comments/views.rb +2 -2
  150. data/lib/active_admin/orm/active_record/comments.rb +13 -8
  151. data/lib/active_admin/orm/active_record.rb +1 -1
  152. data/lib/active_admin/pundit_adapter.rb +3 -3
  153. data/lib/active_admin/resource/action_items.rb +18 -23
  154. data/lib/active_admin/resource/naming.rb +2 -3
  155. data/lib/active_admin/resource/page_presenters.rb +2 -2
  156. data/lib/active_admin/resource/sidebars.rb +1 -1
  157. data/lib/active_admin/resource.rb +17 -16
  158. data/lib/active_admin/resource_collection.rb +1 -1
  159. data/lib/active_admin/resource_dsl.rb +3 -3
  160. data/lib/active_admin/scope.rb +11 -1
  161. data/lib/active_admin/settings_node.rb +1 -1
  162. data/lib/active_admin/sidebar_section.rb +0 -5
  163. data/lib/active_admin/version.rb +1 -1
  164. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +1 -1
  165. data/lib/active_admin/view_helpers.rb +0 -12
  166. data/lib/active_admin/views/components/active_admin_form.rb +21 -29
  167. data/lib/active_admin/views/components/attributes_table.rb +14 -16
  168. data/lib/active_admin/views/components/index_list.rb +10 -23
  169. data/lib/active_admin/views/components/paginated_collection.rb +34 -39
  170. data/lib/active_admin/views/components/panel.rb +3 -11
  171. data/lib/active_admin/views/components/scopes.rb +39 -26
  172. data/lib/active_admin/views/components/status_tag.rb +22 -19
  173. data/lib/active_admin/views/components/table_for.rb +25 -25
  174. data/lib/active_admin/views/index_as_table.rb +39 -101
  175. data/lib/active_admin.rb +16 -15
  176. data/lib/activeadmin.rb +1 -1
  177. data/lib/generators/active_admin/assets/assets_generator.rb +4 -4
  178. data/lib/generators/active_admin/assets/templates/active_admin.css +3 -0
  179. data/lib/generators/active_admin/assets/templates/tailwind.config.js +21 -0
  180. data/lib/generators/active_admin/devise/devise_generator.rb +2 -2
  181. data/lib/generators/active_admin/install/install_generator.rb +2 -8
  182. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +10 -87
  183. data/lib/generators/active_admin/install/templates/dashboard.rb +8 -25
  184. data/lib/generators/active_admin/page/page_generator.rb +0 -1
  185. data/lib/generators/active_admin/resource/resource_generator.rb +50 -7
  186. data/lib/generators/active_admin/resource/templates/resource.rb.erb +42 -0
  187. data/lib/generators/active_admin/views_generator.rb +18 -0
  188. data/plugin.js +414 -0
  189. data/vendor/bundle/offense.rb +1 -0
  190. data/vendor/javascript/flowbite.js +1 -0
  191. data/vendor/javascript/rails_ujs_esm.js +1 -0
  192. metadata +80 -207
  193. data/app/assets/javascripts/active_admin/base.js +0 -517
  194. data/app/assets/stylesheets/active_admin/_base.scss +0 -57
  195. data/app/assets/stylesheets/active_admin/_forms.scss +0 -315
  196. data/app/assets/stylesheets/active_admin/_header.scss +0 -188
  197. data/app/assets/stylesheets/active_admin/_mixins.scss +0 -1
  198. data/app/assets/stylesheets/active_admin/_normalize.scss +0 -349
  199. data/app/assets/stylesheets/active_admin/_print.scss +0 -287
  200. data/app/assets/stylesheets/active_admin/_typography.scss +0 -100
  201. data/app/assets/stylesheets/active_admin/components/_batch_actions.scss +0 -6
  202. data/app/assets/stylesheets/active_admin/components/_blank_slates.scss +0 -30
  203. data/app/assets/stylesheets/active_admin/components/_breadcrumbs.scss +0 -20
  204. data/app/assets/stylesheets/active_admin/components/_buttons.scss +0 -6
  205. data/app/assets/stylesheets/active_admin/components/_columns.scss +0 -3
  206. data/app/assets/stylesheets/active_admin/components/_comments.scss +0 -41
  207. data/app/assets/stylesheets/active_admin/components/_date_picker.scss +0 -148
  208. data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +0 -154
  209. data/app/assets/stylesheets/active_admin/components/_flash_messages.scss +0 -37
  210. data/app/assets/stylesheets/active_admin/components/_grid.scss +0 -9
  211. data/app/assets/stylesheets/active_admin/components/_index_list.scss +0 -12
  212. data/app/assets/stylesheets/active_admin/components/_links.scss +0 -5
  213. data/app/assets/stylesheets/active_admin/components/_modal_dialog.scss +0 -34
  214. data/app/assets/stylesheets/active_admin/components/_pagination.scss +0 -58
  215. data/app/assets/stylesheets/active_admin/components/_panels.scss +0 -6
  216. data/app/assets/stylesheets/active_admin/components/_scopes.scss +0 -13
  217. data/app/assets/stylesheets/active_admin/components/_status_tags.scss +0 -12
  218. data/app/assets/stylesheets/active_admin/components/_table_tools.scss +0 -70
  219. data/app/assets/stylesheets/active_admin/components/_tables.scss +0 -112
  220. data/app/assets/stylesheets/active_admin/components/_tabs.scss +0 -68
  221. data/app/assets/stylesheets/active_admin/components/_unsupported_browser.scss +0 -16
  222. data/app/assets/stylesheets/active_admin/mixins/_all.scss +0 -8
  223. data/app/assets/stylesheets/active_admin/mixins/_buttons.scss +0 -65
  224. data/app/assets/stylesheets/active_admin/mixins/_gradients.scss +0 -28
  225. data/app/assets/stylesheets/active_admin/mixins/_rounded.scss +0 -22
  226. data/app/assets/stylesheets/active_admin/mixins/_sections.scss +0 -41
  227. data/app/assets/stylesheets/active_admin/mixins/_shadows.scss +0 -15
  228. data/app/assets/stylesheets/active_admin/mixins/_typography.scss +0 -3
  229. data/app/assets/stylesheets/active_admin/mixins/_utilities.scss +0 -17
  230. data/app/assets/stylesheets/active_admin/mixins/_variables.scss +0 -51
  231. data/app/assets/stylesheets/active_admin/pages/_logged_out.scss +0 -44
  232. data/app/assets/stylesheets/active_admin/structure/_footer.scss +0 -19
  233. data/app/assets/stylesheets/active_admin/structure/_main_structure.scss +0 -29
  234. data/app/assets/stylesheets/active_admin/structure/_title_bar.scss +0 -43
  235. data/app/javascript/active_admin/base.js +0 -28
  236. data/app/javascript/active_admin/ext/jquery-ui.js +0 -7
  237. data/app/javascript/active_admin/ext/jquery.js +0 -9
  238. data/app/javascript/active_admin/initializers/batch-actions.js +0 -61
  239. data/app/javascript/active_admin/initializers/checkbox-toggler.js +0 -3
  240. data/app/javascript/active_admin/initializers/datepicker.js +0 -16
  241. data/app/javascript/active_admin/initializers/dropdown-menu.js +0 -9
  242. data/app/javascript/active_admin/initializers/filters.js +0 -10
  243. data/app/javascript/active_admin/initializers/has-many.js +0 -98
  244. data/app/javascript/active_admin/initializers/per-page.js +0 -13
  245. data/app/javascript/active_admin/initializers/table-checkbox-toggler.js +0 -3
  246. data/app/javascript/active_admin/initializers/tabs.js +0 -6
  247. data/app/javascript/active_admin/lib/checkbox-toggler.js +0 -49
  248. data/app/javascript/active_admin/lib/dropdown-menu.js +0 -116
  249. data/app/javascript/active_admin/lib/filters.js +0 -39
  250. data/app/javascript/active_admin/lib/modal-dialog.js +0 -63
  251. data/app/javascript/active_admin/lib/per-page.js +0 -38
  252. data/app/javascript/active_admin/lib/table-checkbox-toggler.js +0 -38
  253. data/app/javascript/active_admin/lib/utils.js +0 -40
  254. data/app/views/kaminari/active_admin/_first_page.html.erb +0 -11
  255. data/app/views/kaminari/active_admin/_gap.html.erb +0 -8
  256. data/app/views/kaminari/active_admin/_last_page.html.erb +0 -11
  257. data/app/views/kaminari/active_admin/_next_page.html.erb +0 -11
  258. data/app/views/kaminari/active_admin/_page.html.erb +0 -12
  259. data/app/views/kaminari/active_admin/_paginator.html.erb +0 -25
  260. data/app/views/kaminari/active_admin/_prev_page.html.erb +0 -11
  261. data/app/views/kaminari/active_admin_countless/_first_page.html.erb +0 -11
  262. data/app/views/kaminari/active_admin_countless/_next_page.html.erb +0 -11
  263. data/app/views/kaminari/active_admin_countless/_page.html.erb +0 -12
  264. data/app/views/kaminari/active_admin_countless/_prev_page.html.erb +0 -11
  265. data/app/views/layouts/active_admin.html.arb +0 -2
  266. data/config/locales/de-CH.yml +0 -94
  267. data/lib/active_admin/abstract_view_factory.rb +0 -48
  268. data/lib/active_admin/asset_registration.rb +0 -30
  269. data/lib/active_admin/base_controller/menu.rb +0 -35
  270. data/lib/active_admin/batch_actions/views/batch_action_selector.rb +0 -59
  271. data/lib/active_admin/filters/active_sidebar.rb +0 -28
  272. data/lib/active_admin/generators/boilerplate.rb +0 -54
  273. data/lib/active_admin/helpers/collection.rb +0 -21
  274. data/lib/active_admin/helpers/i18n.rb +0 -8
  275. data/lib/active_admin/inputs/datepicker_input.rb +0 -28
  276. data/lib/active_admin/inputs/filters/date_picker_input.rb +0 -14
  277. data/lib/active_admin/orm/active_record/comments/show_page_helper.rb +0 -24
  278. data/lib/active_admin/orm/mongoid.rb +0 -2
  279. data/lib/active_admin/resource_controller/sidebars.rb +0 -19
  280. data/lib/active_admin/resource_controller.rb +0 -68
  281. data/lib/active_admin/view_factory.rb +0 -28
  282. data/lib/active_admin/view_helpers/active_admin_application_helper.rb +0 -13
  283. data/lib/active_admin/view_helpers/auto_link_helper.rb +0 -46
  284. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +0 -34
  285. data/lib/active_admin/view_helpers/display_helper.rb +0 -119
  286. data/lib/active_admin/view_helpers/download_format_links_helper.rb +0 -60
  287. data/lib/active_admin/view_helpers/fields_for.rb +0 -51
  288. data/lib/active_admin/view_helpers/flash_helper.rb +0 -15
  289. data/lib/active_admin/view_helpers/form_helper.rb +0 -21
  290. data/lib/active_admin/view_helpers/scope_name_helper.rb +0 -17
  291. data/lib/active_admin/view_helpers/sidebar_helper.rb +0 -16
  292. data/lib/active_admin/view_helpers/title_helper.rb +0 -12
  293. data/lib/active_admin/view_helpers/view_factory_helper.rb +0 -12
  294. data/lib/active_admin/views/action_items.rb +0 -18
  295. data/lib/active_admin/views/components/active_filters_sidebar_content.rb +0 -59
  296. data/lib/active_admin/views/components/blank_slate.rb +0 -18
  297. data/lib/active_admin/views/components/columns.rb +0 -162
  298. data/lib/active_admin/views/components/dropdown_menu.rb +0 -69
  299. data/lib/active_admin/views/components/menu.rb +0 -33
  300. data/lib/active_admin/views/components/menu_item.rb +0 -59
  301. data/lib/active_admin/views/components/sidebar.rb +0 -14
  302. data/lib/active_admin/views/components/sidebar_section.rb +0 -35
  303. data/lib/active_admin/views/components/site_title.rb +0 -55
  304. data/lib/active_admin/views/components/tabs.rb +0 -41
  305. data/lib/active_admin/views/components/unsupported_browser.rb +0 -12
  306. data/lib/active_admin/views/footer.rb +0 -32
  307. data/lib/active_admin/views/header.rb +0 -20
  308. data/lib/active_admin/views/index_as_block.rb +0 -37
  309. data/lib/active_admin/views/index_as_blog.rb +0 -156
  310. data/lib/active_admin/views/index_as_grid.rb +0 -81
  311. data/lib/active_admin/views/pages/base.rb +0 -134
  312. data/lib/active_admin/views/pages/form.rb +0 -65
  313. data/lib/active_admin/views/pages/index.rb +0 -166
  314. data/lib/active_admin/views/pages/layout.rb +0 -27
  315. data/lib/active_admin/views/pages/page.rb +0 -31
  316. data/lib/active_admin/views/pages/show.rb +0 -60
  317. data/lib/active_admin/views/tabbed_navigation.rb +0 -12
  318. data/lib/active_admin/views/title_bar.rb +0 -56
  319. data/lib/generators/active_admin/assets/templates/active_admin.js +0 -1
  320. data/lib/generators/active_admin/assets/templates/active_admin.scss +0 -17
  321. data/lib/generators/active_admin/resource/templates/admin.rb.erb +0 -46
  322. data/lib/generators/active_admin/webpacker/plugins/jquery.js +0 -7
  323. data/lib/generators/active_admin/webpacker/templates/active_admin.js +0 -5
  324. data/lib/generators/active_admin/webpacker/templates/active_admin.scss +0 -17
  325. data/lib/generators/active_admin/webpacker/templates/print.scss +0 -2
  326. data/lib/generators/active_admin/webpacker/webpacker_generator.rb +0 -27
  327. data/vendor/assets/javascripts/jquery-ui/data.js +0 -45
  328. data/vendor/assets/javascripts/jquery-ui/disable-selection.js +0 -51
  329. data/vendor/assets/javascripts/jquery-ui/focusable.js +0 -89
  330. data/vendor/assets/javascripts/jquery-ui/form-reset-mixin.js +0 -83
  331. data/vendor/assets/javascripts/jquery-ui/form.js +0 -25
  332. data/vendor/assets/javascripts/jquery-ui/ie.js +0 -20
  333. data/vendor/assets/javascripts/jquery-ui/keycode.js +0 -51
  334. data/vendor/assets/javascripts/jquery-ui/labels.js +0 -71
  335. data/vendor/assets/javascripts/jquery-ui/plugin.js +0 -49
  336. data/vendor/assets/javascripts/jquery-ui/position.js +0 -513
  337. data/vendor/assets/javascripts/jquery-ui/safe-active-element.js +0 -46
  338. data/vendor/assets/javascripts/jquery-ui/safe-blur.js +0 -27
  339. data/vendor/assets/javascripts/jquery-ui/scroll-parent.js +0 -50
  340. data/vendor/assets/javascripts/jquery-ui/tabbable.js +0 -41
  341. data/vendor/assets/javascripts/jquery-ui/unique-id.js +0 -54
  342. data/vendor/assets/javascripts/jquery-ui/version.js +0 -20
  343. data/vendor/assets/javascripts/jquery-ui/widget.js +0 -758
  344. data/vendor/assets/javascripts/jquery-ui/widgets/button.js +0 -454
  345. data/vendor/assets/javascripts/jquery-ui/widgets/checkboxradio.js +0 -294
  346. data/vendor/assets/javascripts/jquery-ui/widgets/controlgroup.js +0 -304
  347. data/vendor/assets/javascripts/jquery-ui/widgets/datepicker.js +0 -2243
  348. data/vendor/assets/javascripts/jquery-ui/widgets/dialog.js +0 -971
  349. data/vendor/assets/javascripts/jquery-ui/widgets/draggable.js +0 -1268
  350. data/vendor/assets/javascripts/jquery-ui/widgets/mouse.js +0 -241
  351. data/vendor/assets/javascripts/jquery-ui/widgets/resizable.js +0 -1228
  352. data/vendor/assets/javascripts/jquery-ui/widgets/sortable.js +0 -1622
  353. data/vendor/assets/javascripts/jquery-ui/widgets/tabs.js +0 -931
  354. /data/{lib → app/controllers}/active_admin/resource_controller/decorators.rb +0 -0
  355. /data/{lib → app/controllers}/active_admin/resource_controller/polymorphic_routes.rb +0 -0
  356. /data/{lib → app/controllers}/active_admin/resource_controller/resource_class_methods.rb +0 -0
  357. /data/lib/{active_admin/orm/mongoid/.gitkeep → generators/active_admin/assets/templates/builds/.keep} +0 -0
@@ -1,61 +0,0 @@
1
- import ModalDialog from "../lib/modal-dialog";
2
-
3
- const onDOMReady = function() {
4
- // Detach any previously attached handlers before re-attaching them.
5
- // This avoids double-registered handlers when Turbolinks is enabled
6
- $('.batch_actions_selector li a').off('click confirm:complete');
7
-
8
- //
9
- // Use ModalDialog to prompt user if
10
- // confirmation is required for current Batch Action
11
- //
12
- $('.batch_actions_selector li a').on('click', function(event){
13
- let message;
14
- event.stopPropagation(); // prevent Rails UJS click event
15
- event.preventDefault();
16
- if ((message = $(this).data('confirm'))) {
17
- ModalDialog(message, $(this).data('inputs'), inputs => {
18
- $(this).trigger('confirm:complete', inputs);
19
- });
20
- } else {
21
- $(this).trigger('confirm:complete');
22
- }
23
- });
24
-
25
- $('.batch_actions_selector li a').on('confirm:complete', function(event, inputs){
26
- let val;
27
- if ((val = JSON.stringify(inputs))) {
28
- $('#batch_action_inputs').removeAttr('disabled').val(val);
29
- } else {
30
- $('#batch_action_inputs').attr('disabled', 'disabled');
31
- }
32
-
33
- $('#batch_action').val($(this).data('action'));
34
- $('#collection_selection').submit();
35
- });
36
-
37
- //
38
- // Add checkbox selection to resource tables and lists if batch actions are enabled
39
- //
40
-
41
- if ($(".batch_actions_selector").length && $(":checkbox.toggle_all").length) {
42
-
43
- if ($(".paginated_collection table.index_table").length) {
44
- $(".paginated_collection table.index_table").tableCheckboxToggler();
45
- } else {
46
- $(".paginated_collection").checkboxToggler();
47
- }
48
-
49
- $(document).on('change', '.paginated_collection :checkbox', function() {
50
- if ($(".paginated_collection :checkbox:checked").length && $(".dropdown_menu_list").children().length) {
51
- $(".batch_actions_selector").each(function() { $(this).aaDropdownMenu("enable"); });
52
- } else {
53
- $(".batch_actions_selector").each(function() { $(this).aaDropdownMenu("disable"); });
54
- }
55
- });
56
- }
57
- };
58
-
59
- $(document).
60
- ready(onDOMReady).
61
- on('page:load turbolinks:load', onDOMReady);
@@ -1,3 +0,0 @@
1
- import CheckboxToggler from "../lib/checkbox-toggler";
2
-
3
- $.widget.bridge('checkboxToggler', CheckboxToggler);
@@ -1,16 +0,0 @@
1
- (($) => {
2
-
3
- $(document)
4
- .on('focus', 'input.datepicker:not(.hasDatepicker)', function() {
5
- const input = $(this);
6
-
7
- // Only create datepickers in compatible browsers
8
- if (input[0].type === 'date') { return; }
9
-
10
- const defaults = { dateFormat: 'yy-mm-dd' };
11
- const options = input.data('datepicker-options');
12
-
13
- input.datepicker($.extend(defaults, options));
14
- });
15
-
16
- })(jQuery);
@@ -1,9 +0,0 @@
1
- import DropdownMenu from "../lib/dropdown-menu";
2
-
3
- $.widget.bridge('aaDropdownMenu', DropdownMenu);
4
-
5
- const onDOMReady = () => $('.dropdown_menu').aaDropdownMenu();
6
-
7
- $(document).
8
- ready(onDOMReady).
9
- on('page:load turbolinks:load', onDOMReady);
@@ -1,10 +0,0 @@
1
- import Filters from '../lib/filters';
2
-
3
- (($) => {
4
-
5
- $(document).
6
- on('click', '.clear_filters_btn', Filters._clearForm).
7
- on('submit', '.filter_form', Filters._disableEmptyInputFields).
8
- on('change', '.filter_form_field.select_and_search select', Filters._setSearchType);
9
-
10
- })(jQuery);
@@ -1,98 +0,0 @@
1
- $(function() {
2
- // Provides a before-removal hook:
3
- // $ ->
4
- // # This is a good place to tear down JS plugins to prevent memory leaks.
5
- // $(document).on 'has_many_remove:before', '.has_many_container', (e, fieldset, container)->
6
- // fieldset.find('.select2').select2 'destroy'
7
- //
8
- // # If you need to do anything after removing the items you can use the
9
- // has_many_remove:after hook
10
- // $(document).on 'has_many_remove:after', '.has_many_container', (e, fieldset, container)->
11
- // list_item_count = container.find('.has_many_fields').length
12
- // alert("There are now #{list_item_count} items in the list")
13
- //
14
- $(document).on('click', 'a.button.has_many_remove', function(event){
15
- event.preventDefault();
16
- const parent = $(this).closest('.has_many_container');
17
- const to_remove = $(this).closest('fieldset');
18
- recompute_positions(parent);
19
-
20
- parent.trigger('has_many_remove:before', [to_remove, parent]);
21
- to_remove.remove();
22
- return parent.trigger('has_many_remove:after', [to_remove, parent]);
23
- });
24
-
25
- // Provides before and after creation hooks:
26
- // $ ->
27
- // # The before hook allows you to prevent the creation of new records.
28
- // $(document).on 'has_many_add:before', '.has_many_container', (e, container)->
29
- // if $(@).children('fieldset').length >= 3
30
- // alert "you've reached the maximum number of items"
31
- // e.preventDefault()
32
- //
33
- // # The after hook is a good place to initialize JS plugins and the like.
34
- // $(document).on 'has_many_add:after', '.has_many_container', (e, fieldset, container)->
35
- // fieldset.find('select').chosen()
36
- //
37
- $(document).on('click', 'a.button.has_many_add', function(event){
38
- let before_add;
39
- event.preventDefault();
40
- const parent = $(this).closest('.has_many_container');
41
- parent.trigger((before_add = $.Event('has_many_add:before')), [parent]);
42
-
43
- if (!before_add.isDefaultPrevented()) {
44
- let index = parent.data('has_many_index') || (parent.children('fieldset').length - 1);
45
- parent.data({has_many_index: ++index});
46
-
47
- const regex = new RegExp($(this).data('placeholder'), 'g');
48
- const html = $(this).data('html').replace(regex, index);
49
-
50
- const fieldset = $(html).insertBefore(this);
51
- recompute_positions(parent);
52
- return parent.trigger('has_many_add:after', [fieldset, parent]);
53
- }
54
- });
55
-
56
- $(document).on('change', '.has_many_container[data-sortable] :input[name$="[_destroy]"]', function() {
57
- recompute_positions($(this).closest('.has_many'));
58
- });
59
-
60
- $(document).on('has_many_add:after', '.has_many_container', init_sortable);
61
- });
62
-
63
- var init_sortable = function() {
64
- const elems = $('.has_many_container[data-sortable]:not(.ui-sortable)');
65
- elems.sortable({
66
- items: '> fieldset',
67
- handle: '> ol > .handle',
68
- start: (ev, ui) => {
69
- ui.item.css({opacity: 0.3});
70
- },
71
- stop: function (ev, ui) {
72
- ui.item.css({opacity: 1.0});
73
- recompute_positions($(this));
74
- }
75
- });
76
- elems.each(recompute_positions);
77
- };
78
-
79
- var recompute_positions = function(parent){
80
- parent = parent instanceof jQuery ? parent : $(this);
81
- const input_name = parent.data('sortable');
82
- let position = parseInt(parent.data('sortable-start') || 0, 10);
83
-
84
- parent.children('fieldset').each(function() {
85
- // We ignore nested inputs, so when defining your has_many, be sure to keep
86
- // your sortable input at the root of the has_many block.
87
- const destroy_input = $(this).find("> ol > .input > :input[name$='[_destroy]']");
88
- const sortable_input = $(this).find(`> ol > .input > :input[name$='[${input_name}]']`);
89
-
90
- if (sortable_input.length) {
91
- sortable_input.val(destroy_input.is(':checked') ? '' : position++);
92
- }
93
- });
94
- };
95
-
96
- $(document).
97
- ready(init_sortable).
98
- on('page:load turbolinks:load', init_sortable);
@@ -1,13 +0,0 @@
1
- import PerPage from "../lib/per-page";
2
-
3
- (($) => {
4
-
5
- $(document).
6
- on('change', '.pagination_per_page > select', function(_event) {
7
- PerPage._jQueryInterface.call($(this), 'update')
8
- });
9
-
10
- $.fn['perPage'] = PerPage._jQueryInterface
11
- $.fn['perPage'].Constructor = PerPage
12
-
13
- })(jQuery);
@@ -1,3 +0,0 @@
1
- import TableCheckboxToggler from "../lib/table-checkbox-toggler";
2
-
3
- $.widget.bridge('tableCheckboxToggler', TableCheckboxToggler);
@@ -1,6 +0,0 @@
1
- let onDOMReady = () =>
2
- $('#active_admin_content .tabs').tabs()
3
-
4
- $(document).
5
- ready(onDOMReady).
6
- on('page:load turbolinks:load', onDOMReady)
@@ -1,49 +0,0 @@
1
- class CheckboxToggler {
2
- constructor(options, container){
3
- this.options = options;
4
- this.container = container;
5
- this._init();
6
- this._bind();
7
- }
8
-
9
- option(_key, _value) {
10
- }
11
-
12
- _init() {
13
- if (!this.container) {
14
- throw new Error('Container element not found');
15
- } else {
16
- this.$container = $(this.container);
17
- }
18
-
19
- if (!this.$container.find('.toggle_all').length) {
20
- throw new Error('"toggle all" checkbox not found');
21
- } else {
22
- this.toggle_all_checkbox = this.$container.find('.toggle_all');
23
- }
24
-
25
- this.checkboxes = this.$container.find(':checkbox').not(this.toggle_all_checkbox);
26
- }
27
-
28
- _bind() {
29
- this.checkboxes.change(event => this._didChangeCheckbox(event.target));
30
- this.toggle_all_checkbox.change(() => this._didChangeToggleAllCheckbox());
31
- }
32
-
33
- _didChangeCheckbox(_checkbox){
34
- const numChecked = this.checkboxes.filter(':checked').length;
35
-
36
- const allChecked = numChecked === this.checkboxes.length;
37
- const someChecked = (numChecked > 0) && (numChecked < this.checkboxes.length);
38
-
39
- this.toggle_all_checkbox.prop({ checked: allChecked, indeterminate: someChecked });
40
- }
41
-
42
- _didChangeToggleAllCheckbox() {
43
- const setting = this.toggle_all_checkbox.prop('checked');
44
- this.checkboxes.prop({ checked: setting });
45
- return setting;
46
- }
47
- }
48
-
49
- export default CheckboxToggler;
@@ -1,116 +0,0 @@
1
- class DropdownMenu {
2
- constructor(options, element) {
3
- this.options = options;
4
- this.element = element;
5
- this.$element = $(this.element);
6
-
7
- const defaults = {
8
- fadeInDuration: 20,
9
- fadeOutDuration: 100,
10
- onClickActionItemCallback: null
11
- };
12
-
13
- this.options = $.extend(defaults, this.options);
14
- this.isOpen = false;
15
-
16
- this.$menuButton = this.$element.find('.dropdown_menu_button');
17
- this.$menuList = this.$element.find('.dropdown_menu_list_wrapper');
18
-
19
- this._buildMenuList();
20
- this._bind();
21
- }
22
-
23
- open() {
24
- this.isOpen = true;
25
- this.$menuList.fadeIn(this.options.fadeInDuration);
26
-
27
- this._position();
28
- return this;
29
- }
30
-
31
- close() {
32
- this.isOpen = false;
33
- this.$menuList.fadeOut(this.options.fadeOutDuration);
34
- return this;
35
- }
36
-
37
- destroy() {
38
- this.$element = null;
39
- return this;
40
- }
41
-
42
- isDisabled() {
43
- return this.$menuButton.hasClass('disabled');
44
- }
45
-
46
- disable() {
47
- this.$menuButton.addClass('disabled');
48
- }
49
-
50
- enable() {
51
- this.$menuButton.removeClass('disabled');
52
- }
53
-
54
- option(key, value) {
55
- if ($.isPlainObject(key)) {
56
- return this.options = $.extend(true, this.options, key);
57
- } else if (key != null) {
58
- return this.options[key];
59
- } else {
60
- return this.options[key] = value;
61
- }
62
- }
63
-
64
- _buildMenuList() {
65
- this.$nipple = $('<div class="dropdown_menu_nipple"></div>');
66
- this.$menuList.prepend(this.$nipple);
67
- this.$menuList.hide();
68
- }
69
-
70
- _bind() {
71
- $('body').click(() => {
72
- if (this.isOpen) { this.close(); }
73
- });
74
-
75
- this.$menuButton.click(() => {
76
- if (!this.isDisabled()) {
77
- if (this.isOpen) {
78
- this.close();
79
- } else {
80
- this.open();
81
- }
82
- }
83
- return false;
84
- });
85
- }
86
-
87
- _position() {
88
- this.$menuList.css('top', this.$menuButton.position().top + this.$menuButton.outerHeight() + 10);
89
-
90
- const button_left = this.$menuButton.position().left;
91
- const button_center = this.$menuButton.outerWidth() / 2;
92
- const button_right = button_left + (button_center * 2);
93
- const menu_center = this.$menuList.outerWidth() / 2;
94
- const nipple_center = this.$nipple.outerWidth() / 2;
95
- const window_right = $(window).width();
96
-
97
- const centered_menu_left = (button_left + button_center) - menu_center;
98
- const centered_menu_right = button_left + button_center + menu_center;
99
-
100
- if (centered_menu_left < 0) {
101
- // Left align with button
102
- this.$menuList.css('left', button_left);
103
- this.$nipple.css('left', button_center - nipple_center);
104
- } else if (centered_menu_right > window_right) {
105
- // Right align with button
106
- this.$menuList.css('right', window_right - button_right);
107
- this.$nipple.css('right', button_center - nipple_center);
108
- } else {
109
- // Center align under button
110
- this.$menuList.css('left', centered_menu_left);
111
- this.$nipple.css('left', menu_center - nipple_center);
112
- }
113
- }
114
- }
115
-
116
- export default DropdownMenu;
@@ -1,39 +0,0 @@
1
- import { queryStringToParams, hasTurbolinks, turbolinksVisit, toQueryString } from '../lib/utils';
2
-
3
- class Filters {
4
-
5
- static _clearForm(event) {
6
- const regex = /^(q\[|q%5B|q%5b|page|utf8|commit)/;
7
- const params = queryStringToParams()
8
- .filter(({name}) => !name.match(regex));
9
-
10
- event.preventDefault();
11
-
12
- if (hasTurbolinks()) {
13
- turbolinksVisit(params);
14
- } else {
15
- window.location.search = toQueryString(params);
16
- }
17
- }
18
-
19
- static _disableEmptyInputFields(event) {
20
- const params = $(this)
21
- .find(':input')
22
- .filter((i, input) => input.value === '')
23
- .prop({ disabled: true })
24
- .end()
25
- .serializeArray();
26
-
27
- if (hasTurbolinks()) {
28
- event.preventDefault();
29
- turbolinksVisit(params);
30
- }
31
- }
32
-
33
- static _setSearchType() {
34
- $(this).siblings('input').prop({name: `q[${this.value}]`});
35
- }
36
-
37
- }
38
-
39
- export default Filters;
@@ -1,63 +0,0 @@
1
- function ModalDialog(message, inputs, callback){
2
- let html = `<form id="dialog_confirm" title="${message}"><ul>`;
3
- for (let name in inputs) {
4
- var opts, wrapper;
5
- let type = inputs[name];
6
- if (/^(datepicker|checkbox|text|number)$/.test(type)) {
7
- wrapper = 'input';
8
- } else if (type === 'textarea') {
9
- wrapper = 'textarea';
10
- } else if ($.isArray(type)) {
11
- [wrapper, opts, type] = ['select', type, ''];
12
- } else {
13
- throw new Error(`Unsupported input type: {${name}: ${type}}`);
14
- }
15
-
16
- let klass = type === 'datepicker' ? type : '';
17
- html += `<li>
18
- <label>${name.charAt(0).toUpperCase() + name.slice(1)}</label>
19
- <${wrapper} name="${name}" class="${klass}" type="${type}">` +
20
- (opts ? ((() => {
21
- const result = [];
22
-
23
- opts.forEach(v => {
24
- const $elem = $('<option></option>');
25
- if ($.isArray(v)) {
26
- $elem.text(v[0]).val(v[1]);
27
- } else {
28
- $elem.text(v);
29
- }
30
- result.push($elem.wrap('<div></div>').parent().html());
31
- });
32
-
33
- return result;
34
- })()).join('') : '') +
35
- `</${wrapper}>` +
36
- "</li>";
37
- [wrapper, opts, type, klass] = []; // unset any temporary variables
38
- }
39
-
40
- html += "</ul></form>";
41
-
42
- const form = $(html).appendTo('body');
43
- $('body').trigger('modal_dialog:before_open', [form]);
44
-
45
- form.dialog({
46
- modal: true,
47
- open(_event, _ui) {
48
- $('body').trigger('modal_dialog:after_open', [form]);
49
- },
50
- dialogClass: 'active_admin_dialog',
51
- buttons: {
52
- OK() {
53
- callback($(this).serializeObject());
54
- $(this).dialog('close');
55
- },
56
- Cancel() {
57
- $(this).dialog('close').remove();
58
- }
59
- }
60
- });
61
- }
62
-
63
- export default ModalDialog;
@@ -1,38 +0,0 @@
1
- import { queryStringToParams, hasTurbolinks, turbolinksVisit, toQueryString } from './utils';
2
-
3
- class PerPage {
4
- constructor(element) {
5
- this.element = element;
6
- }
7
-
8
- update() {
9
- const params = queryStringToParams()
10
- .filter(({name}) => name != 'per_page' || name != 'page')
11
-
12
- params.push({ name: 'per_page', value: this.element.value });
13
-
14
- if (hasTurbolinks()) {
15
- turbolinksVisit(params);
16
- } else {
17
- window.location.search = toQueryString(params);
18
- }
19
- }
20
-
21
- static _jQueryInterface(config) {
22
- return this.each(function () {
23
- const $this = $(this)
24
- let data = $this.data('perPage')
25
-
26
- if (!data) {
27
- data = new PerPage(this)
28
- $this.data('perPage', data)
29
- }
30
-
31
- if (config === 'update') {
32
- data[config]()
33
- }
34
- })
35
- }
36
- }
37
-
38
- export default PerPage;
@@ -1,38 +0,0 @@
1
- import CheckboxToggler from "./checkbox-toggler";
2
-
3
- class TableCheckboxToggler extends CheckboxToggler {
4
- _bind() {
5
- super._bind(...arguments);
6
-
7
- this.$container
8
- .find('tbody td')
9
- .click(event => {
10
- if (event.target.type !== 'checkbox') {
11
- this._didClickCell(event.target);
12
- }
13
- });
14
- }
15
-
16
- _didChangeCheckbox(checkbox) {
17
- super._didChangeCheckbox(...arguments);
18
-
19
- $(checkbox)
20
- .parents('tr')
21
- .toggleClass('selected', checkbox.checked);
22
- }
23
-
24
- _didChangeToggleAllCheckbox() {
25
- this.$container
26
- .find('tbody tr')
27
- .toggleClass('selected', super._didChangeToggleAllCheckbox(...arguments));
28
- }
29
-
30
- _didClickCell(cell) {
31
- $(cell)
32
- .parent('tr')
33
- .find(':checkbox')
34
- .click();
35
- }
36
- }
37
-
38
- export default TableCheckboxToggler;
@@ -1,40 +0,0 @@
1
- function hasTurbolinks() {
2
- return (typeof Turbolinks !== 'undefined' && Turbolinks.supported);
3
- }
4
-
5
- function turbolinksVisit(params) {
6
- const path = [window.location.pathname, '?', toQueryString(params)].join('')
7
- Turbolinks.visit(path);
8
- }
9
-
10
- function queryString() {
11
- return (window.location.search || '').replace(/^\?/, '');
12
- }
13
-
14
- function queryStringToParams() {
15
- const decode = (value) => decodeURIComponent((value || '').replace(/\+/g, '%20'));
16
-
17
- return queryString()
18
- .split("&")
19
- .map(pair => pair.split("="))
20
- .map(([key, value]) => {
21
- return { name: decode(key), value: decode(value) }
22
- });
23
- }
24
-
25
- function toQueryString(params) {
26
- const encode = (value) => encodeURIComponent(value || '');
27
-
28
- return params
29
- .map(({name, value}) => [ encode(name), encode(value) ])
30
- .map(pair => pair.join('='))
31
- .join('&')
32
- }
33
-
34
- export {
35
- hasTurbolinks,
36
- turbolinksVisit,
37
- queryString,
38
- queryStringToParams,
39
- toQueryString
40
- };
@@ -1,11 +0,0 @@
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
- <span class="first">
10
- <%= link_to_unless current_page.first?, t('views.pagination.first').html_safe, url, remote: remote %>
11
- </span>
@@ -1,8 +0,0 @@
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
- <span class="page gap"><%= t('views.pagination.truncate').html_safe %></span>
@@ -1,11 +0,0 @@
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
- <span class="last">
10
- <%= link_to_unless current_page.last?, t('views.pagination.last').html_safe, url, remote: remote %>
11
- </span>
@@ -1,11 +0,0 @@
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
- <span class="next">
10
- <%= link_to_unless current_page.last?, t('views.pagination.next').html_safe, url, rel: 'next', remote: remote %>
11
- </span>
@@ -1,12 +0,0 @@
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
- <span class="page<%= ' current' if page.current? %>">
11
- <%= link_to_unless page.current?, page, url, {remote: remote, rel: page.rel} %>
12
- </span>