adminos 1.0.0.pre.rc.1

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 (288) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +14 -0
  3. data/.gitignore +25 -0
  4. data/.gitlab-ci.yml +18 -0
  5. data/.rspec +2 -0
  6. data/.rubocop.yml +120 -0
  7. data/.rubocop_todo.yml +58 -0
  8. data/Gemfile +25 -0
  9. data/Guardfile +70 -0
  10. data/LICENSE.txt +22 -0
  11. data/README.md +88 -0
  12. data/Rakefile +20 -0
  13. data/adminos.gemspec +37 -0
  14. data/adminos.png +0 -0
  15. data/app/assets/images/.keep +0 -0
  16. data/app/assets/images/apple-touch-icon.png +0 -0
  17. data/app/assets/images/favicon-16x16.png +0 -0
  18. data/app/assets/images/favicon-32x32.png +0 -0
  19. data/app/assets/images/favicon.ico +0 -0
  20. data/app/assets/images/safari-pinned-tab.svg +23 -0
  21. data/app/inputs/cropp_input.rb +45 -0
  22. data/bin/bundle +105 -0
  23. data/bin/gem +39 -0
  24. data/bin/rspec +29 -0
  25. data/exe/adminos +5 -0
  26. data/lib/adminos/cli.rb +71 -0
  27. data/lib/adminos/controllers/admin_extension.rb +34 -0
  28. data/lib/adminos/controllers/helpers.rb +24 -0
  29. data/lib/adminos/controllers/resource.rb +169 -0
  30. data/lib/adminos/extensions/globalize_actiontext.rb +28 -0
  31. data/lib/adminos/extensions/globalize_fields.rb +19 -0
  32. data/lib/adminos/extensions/nested_set.rb +27 -0
  33. data/lib/adminos/extensions/string.rb +5 -0
  34. data/lib/adminos/generators/gemfile_merge.rb +85 -0
  35. data/lib/adminos/generators/utilities.rb +87 -0
  36. data/lib/adminos/helpers/admin.rb +190 -0
  37. data/lib/adminos/helpers/bootstrap.rb +64 -0
  38. data/lib/adminos/helpers/models/apply_sortable_order.rb +10 -0
  39. data/lib/adminos/helpers/models/array_attrs.rb +17 -0
  40. data/lib/adminos/helpers/models/cropped.rb +20 -0
  41. data/lib/adminos/helpers/models/dom_id.rb +16 -0
  42. data/lib/adminos/helpers/models/flag_attrs.rb +43 -0
  43. data/lib/adminos/helpers/models/if_blank_set_to_nil_params.rb +19 -0
  44. data/lib/adminos/helpers/models/move_to.rb +17 -0
  45. data/lib/adminos/helpers/models/nested_set/duplication.rb +31 -0
  46. data/lib/adminos/helpers/models/nested_set/materialize_path.rb +50 -0
  47. data/lib/adminos/helpers/models/nested_set/place_to.rb +35 -0
  48. data/lib/adminos/helpers/models/nested_set/safe_destroy.rb +34 -0
  49. data/lib/adminos/helpers/models/recognizable.rb +28 -0
  50. data/lib/adminos/helpers/models/slugged.rb +20 -0
  51. data/lib/adminos/helpers/models/soft_destroy.rb +61 -0
  52. data/lib/adminos/helpers/models/wysiwyg.rb +105 -0
  53. data/lib/adminos/helpers/view.rb +137 -0
  54. data/lib/adminos/operations/check_environment.rb +18 -0
  55. data/lib/adminos/operations/extract_environment.rb +42 -0
  56. data/lib/adminos/operations/load_environment.rb +30 -0
  57. data/lib/adminos/stateful_link/action_any_of.rb +76 -0
  58. data/lib/adminos/stateful_link/helper.rb +31 -0
  59. data/lib/adminos.rb +42 -0
  60. data/lib/adminos_template.rb +15 -0
  61. data/lib/generators/adminos/adminos_generator.rb +164 -0
  62. data/lib/generators/adminos/ci_generator.rb +124 -0
  63. data/lib/generators/adminos/field_generator.rb +105 -0
  64. data/lib/generators/adminos/i18n_generator.rb +76 -0
  65. data/lib/generators/adminos/install_generator.rb +238 -0
  66. data/lib/generators/templates/adminos/adminos.ru.yml +15 -0
  67. data/lib/generators/templates/adminos/fields.slim +21 -0
  68. data/lib/generators/templates/adminos/locales/general_fields.slim +7 -0
  69. data/lib/generators/templates/adminos/locales/locale_fields.slim +10 -0
  70. data/lib/generators/templates/adminos/locales/migration.rb.erb +18 -0
  71. data/lib/generators/templates/adminos/locales/model.rb.erb +6 -0
  72. data/lib/generators/templates/adminos/sidebar.slim +2 -0
  73. data/lib/generators/templates/adminos/sorts/body.slim +3 -0
  74. data/lib/generators/templates/adminos/sorts/headers.slim +3 -0
  75. data/lib/generators/templates/adminos/types/default/controller.rb.erb +18 -0
  76. data/lib/generators/templates/adminos/types/default/migration.rb +5 -0
  77. data/lib/generators/templates/adminos/types/default/model.rb +20 -0
  78. data/lib/generators/templates/adminos/types/default/model_includes.rb +4 -0
  79. data/lib/generators/templates/adminos/types/default/views/index.slim +14 -0
  80. data/lib/generators/templates/adminos/types/section/controller.rb.erb +10 -0
  81. data/lib/generators/templates/adminos/types/section/migration.rb +12 -0
  82. data/lib/generators/templates/adminos/types/section/model.rb +62 -0
  83. data/lib/generators/templates/adminos/types/section/model_includes.rb +7 -0
  84. data/lib/generators/templates/adminos/types/section/views/_object.slim +24 -0
  85. data/lib/generators/templates/adminos/types/section/views/_objects.slim +6 -0
  86. data/lib/generators/templates/adminos/types/section/views/index.slim +7 -0
  87. data/lib/generators/templates/adminos/types/sortable/controller.rb.erb +10 -0
  88. data/lib/generators/templates/adminos/types/sortable/migration.rb +9 -0
  89. data/lib/generators/templates/adminos/types/sortable/model.rb +35 -0
  90. data/lib/generators/templates/adminos/types/sortable/model_includes.rb +6 -0
  91. data/lib/generators/templates/adminos/types/sortable/views/_object.slim +17 -0
  92. data/lib/generators/templates/adminos/types/sortable/views/_objects.slim +6 -0
  93. data/lib/generators/templates/adminos/types/sortable/views/index.slim +7 -0
  94. data/lib/generators/templates/adminos/types/table/controller.rb.erb +19 -0
  95. data/lib/generators/templates/adminos/types/table/views/index.slim +31 -0
  96. data/lib/generators/templates/ci/.gitlab-ci.yml +40 -0
  97. data/lib/generators/templates/ci/audit/Gemfile +3 -0
  98. data/lib/generators/templates/ci/lint/Gemfile +3 -0
  99. data/lib/generators/templates/ci/lint/rubocop.yml +116 -0
  100. data/lib/generators/templates/ci/rakelib/audit.rake +13 -0
  101. data/lib/generators/templates/ci/rakelib/lint.rake +13 -0
  102. data/lib/generators/templates/ci/spec/Gemfile +9 -0
  103. data/lib/generators/templates/field/locales/locale_fields.slim +4 -0
  104. data/lib/generators/templates/field/locales/migration.rb.erb +13 -0
  105. data/lib/generators/templates/field/locales/model.rb.erb +6 -0
  106. data/lib/generators/templates/i18n/Gemfile +1 -0
  107. data/lib/generators/templates/i18n/add_translation_table_to_page.rb +15 -0
  108. data/lib/generators/templates/i18n/auto/app/validators/locale_validator.rb +23 -0
  109. data/lib/generators/templates/i18n/auto/app/views/admin/base/_fields.slim +1 -0
  110. data/lib/generators/templates/i18n/auto/app/views/admin/base/_pills.slim +19 -0
  111. data/lib/generators/templates/i18n/auto/app/views/admin/pages/_general_fields.slim +8 -0
  112. data/lib/generators/templates/i18n/auto/app/views/admin/pages/_locale_fields.slim +13 -0
  113. data/lib/generators/templates/i18n/auto/config/initializers/globalize_fields.rb +1 -0
  114. data/lib/generators/templates/i18n/controller.rb +12 -0
  115. data/lib/generators/templates/i18n/devise/devise.ru.yml +60 -0
  116. data/lib/generators/templates/i18n/devise/views/_links.erb +25 -0
  117. data/lib/generators/templates/i18n/devise/views/confirmations/new.slim +8 -0
  118. data/lib/generators/templates/i18n/devise/views/mailer/confirmation_instructions.slim +4 -0
  119. data/lib/generators/templates/i18n/devise/views/mailer/reset_password_instructions.slim +5 -0
  120. data/lib/generators/templates/i18n/devise/views/mailer/unlock_instructions.slim +4 -0
  121. data/lib/generators/templates/i18n/devise/views/passwords/edit.slim +7 -0
  122. data/lib/generators/templates/i18n/devise/views/passwords/new.slim +5 -0
  123. data/lib/generators/templates/i18n/devise/views/registrations/edit.slim +25 -0
  124. data/lib/generators/templates/i18n/devise/views/registrations/new.slim +7 -0
  125. data/lib/generators/templates/i18n/devise/views/sessions/new.slim +22 -0
  126. data/lib/generators/templates/i18n/devise/views/unlocks/new.slim +11 -0
  127. data/lib/generators/templates/i18n/locales.slim +3 -0
  128. data/lib/generators/templates/i18n/page.rb +5 -0
  129. data/lib/generators/templates/install/.gitignore +11 -0
  130. data/lib/generators/templates/install/Gemfile +57 -0
  131. data/lib/generators/templates/install/Procfile +1 -0
  132. data/lib/generators/templates/install/_sidebar.slim.erb +44 -0
  133. data/lib/generators/templates/install/add_authentications/authentication.rb +7 -0
  134. data/lib/generators/templates/install/add_authentications/authentications_controller.rb +95 -0
  135. data/lib/generators/templates/install/add_authentications/authentications_migration.rb +12 -0
  136. data/lib/generators/templates/install/add_authentications/views/authentications/_form.slim +5 -0
  137. data/lib/generators/templates/install/add_authentications/views/authentications/_modal.slim +7 -0
  138. data/lib/generators/templates/install/add_pages/page.rb +116 -0
  139. data/lib/generators/templates/install/add_pages/pages_controller.rb +6 -0
  140. data/lib/generators/templates/install/add_pages/pages_migration.rb +25 -0
  141. data/lib/generators/templates/install/add_pages/views/pages/show.slim +4 -0
  142. data/lib/generators/templates/install/admin.slim +36 -0
  143. data/lib/generators/templates/install/admin_panel/pages/admin_pages_controller.rb +9 -0
  144. data/lib/generators/templates/install/admin_panel/pages/views/admin_pages/_fields.slim +26 -0
  145. data/lib/generators/templates/install/admin_panel/pages/views/admin_pages/_object.slim +25 -0
  146. data/lib/generators/templates/install/admin_panel/pages/views/admin_pages/_objects.slim +6 -0
  147. data/lib/generators/templates/install/admin_panel/pages/views/admin_pages/index.slim +7 -0
  148. data/lib/generators/templates/install/admin_panel/users/admin_users_controller.rb +29 -0
  149. data/lib/generators/templates/install/admin_panel/users/views/admin_users/_fields.slim +4 -0
  150. data/lib/generators/templates/install/admin_panel/users/views/admin_users/index.slim +33 -0
  151. data/lib/generators/templates/install/admin_panel/versions/admin_versions_controller.rb +29 -0
  152. data/lib/generators/templates/install/admin_panel/versions/views/admin_versions/index.slim +47 -0
  153. data/lib/generators/templates/install/admin_panel/versions/views/admin_versions/show.slim +18 -0
  154. data/lib/generators/templates/install/application.slim.erb +31 -0
  155. data/lib/generators/templates/install/auto/.editorconfig +14 -0
  156. data/lib/generators/templates/install/auto/.env.staging +2 -0
  157. data/lib/generators/templates/install/auto/Capfile +14 -0
  158. data/lib/generators/templates/install/auto/Guardfile +18 -0
  159. data/lib/generators/templates/install/auto/Procfile +1 -0
  160. data/lib/generators/templates/install/auto/Procfile.local +2 -0
  161. data/lib/generators/templates/install/auto/app/assets/javascripts/admin/application.js +3 -0
  162. data/lib/generators/templates/install/auto/app/assets/javascripts/admin/cocoon_fields.js +43 -0
  163. data/lib/generators/templates/install/auto/app/assets/javascripts/application.js +1 -0
  164. data/lib/generators/templates/install/auto/app/assets/stylesheets/admin/application.scss +1 -0
  165. data/lib/generators/templates/install/auto/app/controllers/admin/base_controller.rb +16 -0
  166. data/lib/generators/templates/install/auto/app/controllers/admin/helps_controller.rb +4 -0
  167. data/lib/generators/templates/install/auto/app/controllers/admin/settings_controller.rb +26 -0
  168. data/lib/generators/templates/install/auto/app/controllers/application_controller.rb +50 -0
  169. data/lib/generators/templates/install/auto/app/controllers/index_controller.rb +2 -0
  170. data/lib/generators/templates/install/auto/app/helpers/nested_helper.rb +75 -0
  171. data/lib/generators/templates/install/auto/app/helpers/versions_helper.rb +33 -0
  172. data/lib/generators/templates/install/auto/app/inputs/carrierwave_input.rb +52 -0
  173. data/lib/generators/templates/install/auto/app/inputs/checkbox_input.rb +13 -0
  174. data/lib/generators/templates/install/auto/app/inputs/rich_text_input.rb +9 -0
  175. data/lib/generators/templates/install/auto/app/mailers/notifier.rb +9 -0
  176. data/lib/generators/templates/install/auto/app/models/settings.rb +27 -0
  177. data/lib/generators/templates/install/auto/app/services/export_xlsx.rb +76 -0
  178. data/lib/generators/templates/install/auto/app/views/active_storage/blobs/_blob.html.erb +17 -0
  179. data/lib/generators/templates/install/auto/app/views/admin/base/_form.slim +33 -0
  180. data/lib/generators/templates/install/auto/app/views/admin/base/_object.slim +27 -0
  181. data/lib/generators/templates/install/auto/app/views/admin/base/_objects.slim +19 -0
  182. data/lib/generators/templates/install/auto/app/views/admin/base/drop.js.erb +1 -0
  183. data/lib/generators/templates/install/auto/app/views/admin/base/edit.slim +1 -0
  184. data/lib/generators/templates/install/auto/app/views/admin/base/index.slim +14 -0
  185. data/lib/generators/templates/install/auto/app/views/admin/base/new.slim +1 -0
  186. data/lib/generators/templates/install/auto/app/views/admin/helps/index.slim +29 -0
  187. data/lib/generators/templates/install/auto/app/views/admin/settings/edit.slim +27 -0
  188. data/lib/generators/templates/install/auto/app/views/kaminari/_first_page.slim +10 -0
  189. data/lib/generators/templates/install/auto/app/views/kaminari/_gap.slim +7 -0
  190. data/lib/generators/templates/install/auto/app/views/kaminari/_last_page.slim +10 -0
  191. data/lib/generators/templates/install/auto/app/views/kaminari/_next_page.slim +9 -0
  192. data/lib/generators/templates/install/auto/app/views/kaminari/_page.slim +10 -0
  193. data/lib/generators/templates/install/auto/app/views/kaminari/_paginator.slim +16 -0
  194. data/lib/generators/templates/install/auto/app/views/kaminari/_prev_page.slim +9 -0
  195. data/lib/generators/templates/install/auto/app/views/kaminari/admin/_first_page.slim +10 -0
  196. data/lib/generators/templates/install/auto/app/views/kaminari/admin/_gap.slim +8 -0
  197. data/lib/generators/templates/install/auto/app/views/kaminari/admin/_last_page.slim +10 -0
  198. data/lib/generators/templates/install/auto/app/views/kaminari/admin/_next_page.slim +10 -0
  199. data/lib/generators/templates/install/auto/app/views/kaminari/admin/_page.slim +10 -0
  200. data/lib/generators/templates/install/auto/app/views/kaminari/admin/_paginator.slim +16 -0
  201. data/lib/generators/templates/install/auto/app/views/kaminari/admin/_prev_page.slim +10 -0
  202. data/lib/generators/templates/install/auto/app/views/layouts/admin/base.slim +17 -0
  203. data/lib/generators/templates/install/auto/app/views/shared/admin/_back_button.slim +3 -0
  204. data/lib/generators/templates/install/auto/app/views/shared/admin/_footer.slim +3 -0
  205. data/lib/generators/templates/install/auto/app/views/shared/admin/_search_form.slim +6 -0
  206. data/lib/generators/templates/install/auto/app/views/shared/admin/_topbar.slim +11 -0
  207. data/lib/generators/templates/install/auto/app/views/shared/helpers/_alert_close.slim +1 -0
  208. data/lib/generators/templates/install/auto/app/views/shared/helpers/_contacts_page_link_tag.slim +1 -0
  209. data/lib/generators/templates/install/auto/app/views/shared/helpers/_link_button_to.slim +2 -0
  210. data/lib/generators/templates/install/auto/app/views/shared/helpers/_method_ajax_request_link_to.slim +2 -0
  211. data/lib/generators/templates/install/auto/app/views/shared/helpers/_method_link_to.slim +12 -0
  212. data/lib/generators/templates/install/auto/app/views/shared/helpers/_navigation_menu.html.slim +3 -0
  213. data/lib/generators/templates/install/auto/app/views/shared/helpers/_print_tag.slim +2 -0
  214. data/lib/generators/templates/install/auto/app/views/shared/helpers/_search_tag_for.slim +16 -0
  215. data/lib/generators/templates/install/auto/app/views/shared/helpers/_show_breadcrumbs.slim +7 -0
  216. data/lib/generators/templates/install/auto/app/views/shared/helpers/_show_flash_alert.slim +9 -0
  217. data/lib/generators/templates/install/auto/app/views/shared/helpers/_sortable_column.slim +3 -0
  218. data/lib/generators/templates/install/auto/app/views/shared/helpers/_span_link_to.slim +3 -0
  219. data/lib/generators/templates/install/auto/app/views/shared/helpers/_sub_navigation.slim +14 -0
  220. data/lib/generators/templates/install/auto/app/views/shared/helpers/admin/_batch_actions_tag.slim +16 -0
  221. data/lib/generators/templates/install/auto/app/views/shared/helpers/admin/_collection_button_new.slim +5 -0
  222. data/lib/generators/templates/install/auto/app/views/shared/helpers/admin/_collection_header.slim +4 -0
  223. data/lib/generators/templates/install/auto/app/views/shared/helpers/admin/_locked_sign.slim +3 -0
  224. data/lib/generators/templates/install/auto/app/views/shared/helpers/admin/_nav_published_sign.slim +1 -0
  225. data/lib/generators/templates/install/auto/app/views/shared/helpers/admin/_object_link_children.slim +2 -0
  226. data/lib/generators/templates/install/auto/app/views/shared/helpers/admin/_object_link_duplication.slim +1 -0
  227. data/lib/generators/templates/install/auto/app/views/shared/helpers/admin/_object_link_edit.slim +1 -0
  228. data/lib/generators/templates/install/auto/app/views/shared/helpers/admin/_object_link_new.slim +1 -0
  229. data/lib/generators/templates/install/auto/app/views/shared/helpers/admin/_page_header.slim +5 -0
  230. data/lib/generators/templates/install/auto/app/views/shared/helpers/admin/_published_sign.slim +1 -0
  231. data/lib/generators/templates/install/auto/app/views/shared/helpers/admin/_show_breadcrumbs.slim +6 -0
  232. data/lib/generators/templates/install/auto/app/views/shared/helpers/admin/_top_menu_item.slim +5 -0
  233. data/lib/generators/templates/install/auto/app/views/shared/helpers/admin/_unpublished_sign.slim +1 -0
  234. data/lib/generators/templates/install/auto/browserslist +3 -0
  235. data/lib/generators/templates/install/auto/config/deploy/shared/database.yml.erb +10 -0
  236. data/lib/generators/templates/install/auto/config/deploy/shared/nginx.conf.erb +28 -0
  237. data/lib/generators/templates/install/auto/config/deploy/shared/unicorn.rb.erb +35 -0
  238. data/lib/generators/templates/install/auto/config/deploy/staging.rb +12 -0
  239. data/lib/generators/templates/install/auto/config/environments/staging.rb +84 -0
  240. data/lib/generators/templates/install/auto/config/initializers/awesome_nested_set.rb +1 -0
  241. data/lib/generators/templates/install/auto/config/initializers/content_security_policy.rb +26 -0
  242. data/lib/generators/templates/install/auto/config/initializers/friendly_id.rb +1 -0
  243. data/lib/generators/templates/install/auto/config/initializers/kaminari_config.rb +15 -0
  244. data/lib/generators/templates/install/auto/config/initializers/simple_form.rb +238 -0
  245. data/lib/generators/templates/install/auto/config/initializers/slim.rb +2 -0
  246. data/lib/generators/templates/install/auto/config/locales/adminos.en.yml +164 -0
  247. data/lib/generators/templates/install/auto/config/locales/adminos.ru.yml +292 -0
  248. data/lib/generators/templates/install/auto/lib/capistrano/substitute_strings.rb +12 -0
  249. data/lib/generators/templates/install/auto/lib/capistrano/tasks/setup_config.cap +39 -0
  250. data/lib/generators/templates/install/auto/lib/capistrano/template.rb +33 -0
  251. data/lib/generators/templates/install/auto/public/404.html +26 -0
  252. data/lib/generators/templates/install/auto/public/500.html +25 -0
  253. data/lib/generators/templates/install/database.yml +19 -0
  254. data/lib/generators/templates/install/deploy.rb.erb +21 -0
  255. data/lib/generators/templates/install/install_devise/ability.rb +49 -0
  256. data/lib/generators/templates/install/install_devise/application.rb +7 -0
  257. data/lib/generators/templates/install/install_devise/prepare_users.rb +1 -0
  258. data/lib/generators/templates/install/install_devise/user.rb +21 -0
  259. data/lib/generators/templates/install/prepare_settings.rb +4 -0
  260. data/lib/generators/templates/install/routes/pages.rb +18 -0
  261. data/lib/generators/templates/install/routes.rb.erb +53 -0
  262. data/lib/generators/templates/install/settings_migration.rb +16 -0
  263. data/lib/generators/templates/install/webpack/custom.js +36 -0
  264. data/lib/generators/templates/install/webpack/environment.js +4 -0
  265. data/lib/generators/templates/install/webpack/javascript/admin/js/index.js +2 -0
  266. data/lib/generators/templates/install/webpack/javascript/admin/styles/admin.scss +2 -0
  267. data/lib/generators/templates/install/webpack/javascript/packs/admin.js +2 -0
  268. data/package-lock.json +3 -0
  269. data/spec/config/database.yml +2 -0
  270. data/spec/db/schema.rb +0 -0
  271. data/spec/lib/adminos/helpers/models/apply_sortable_order.rb +26 -0
  272. data/spec/lib/adminos/helpers/models/array_attrs_spec.rb +38 -0
  273. data/spec/lib/adminos/helpers/models/dom_id_spec.rb +41 -0
  274. data/spec/lib/adminos/helpers/models/flag_attrs_spec.rb +115 -0
  275. data/spec/lib/adminos/helpers/models/if_blank_set_to_nil_params_spec.rb +36 -0
  276. data/spec/lib/adminos/helpers/models/recognizable_spec.rb +40 -0
  277. data/spec/lib/adminos/helpers/models/slugged.rb +40 -0
  278. data/spec/lib/generators/adminos/adminos_generator_spec.rb +106 -0
  279. data/spec/lib/generators/adminos/ci_generator_spec.rb +88 -0
  280. data/spec/lib/generators/adminos/i18n_generator_spec.rb +31 -0
  281. data/spec/lib/generators/adminos/install_generator_rspec.rb +322 -0
  282. data/spec/spec_helper.rb +122 -0
  283. data/spec/support/ammeter.rb +14 -0
  284. data/spec/support/database.rb +29 -0
  285. data/spec/support/generators.rb +99 -0
  286. data/spec/support/post.rb +8 -0
  287. data/spec/support/shared/generator.rb +35 -0
  288. metadata +632 -0
@@ -0,0 +1,87 @@
1
+ require 'adminos/generators/gemfile_merge'
2
+ require 'bundler'
3
+ require 'shellwords'
4
+
5
+ module Adminos
6
+ module Generators
7
+ module Utilities
8
+ private
9
+
10
+ def indent_code(code, with: ' ')
11
+ code.split("\n").map { |line| line.present? ? "#{with}#{line}" : line }.join("\n")
12
+ end
13
+
14
+ def commit_changes(message)
15
+ git add: '.'
16
+ git commit: ['--message', message, '--author', 'Adminos Molinos <studio@molinos.ru>'].shelljoin
17
+ end
18
+
19
+ def run_in_root(command, with: nil, verbose: true, capture: nil, **options)
20
+ Bundler.with_clean_env do
21
+ ENV['DISABLE_SPRING'] = '1'
22
+ command << options_for_cli(options)
23
+ in_root { run(command, with: with, verbose: verbose, capture: capture) }
24
+ end
25
+ end
26
+
27
+ def options_for_cli(options)
28
+ options.inject('') do |command, (key, value)|
29
+ case value
30
+ when Array
31
+ command << " --#{key}=#{value.join(' ')}"
32
+ when TrueClass
33
+ command << " --#{key}"
34
+ when FalseClass
35
+ command << " --no-#{key}"
36
+ else
37
+ command << " --#{key}=#{value.to_s.shellescape}"
38
+ end
39
+ end
40
+ end
41
+
42
+ def replace_file(file_name, contents)
43
+ create_file(file_name, contents, force: true)
44
+ end
45
+
46
+ def merge_gemfile_with(source, target: Pathname.pwd.join('Gemfile'))
47
+ gemfile = IO.read(target || 'Gemfile')
48
+ addition = file_content(source)
49
+ gemfile = GemfileMerge.new(addition, gemfile).merge
50
+ replace_file target, gemfile if target
51
+ gemfile
52
+ end
53
+
54
+ def binstubs(*gem_names, **options)
55
+ run_in_root "bundle binstubs #{gem_names.shelljoin}", **options
56
+ end
57
+
58
+ #def generate(generator, *args, force: options.force?, quiet: options.quiet?)
59
+ # run_in_root "bin/rails generate #{generator} #{args.map(&Shellwords.method(:escape)).join(' ')}", force: force, quiet: quiet
60
+ #end
61
+
62
+ def file_content(file)
63
+ IO.read(find_in_source_paths(file))
64
+ end
65
+
66
+ def file_exists?(file)
67
+ File.exist?(file)
68
+ end
69
+
70
+ def rubocop_target_ruby_version
71
+ RUBY_VERSION.split('.')[0..1].join('.')
72
+ end
73
+
74
+ def install_dependencies(verbose: !options.quiet?)
75
+ run_in_root 'bundle install', verbose: verbose
76
+ binstubs 'bundler', force: true, verbose: verbose
77
+ end
78
+
79
+ def migration_version
80
+ major = ActiveRecord::VERSION::MAJOR
81
+ if major >= 5
82
+ "[#{major}.#{ActiveRecord::VERSION::MINOR}]"
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,190 @@
1
+ module Adminos::Helpers::Admin
2
+ def admin_index_path(resource_class)
3
+ url_parts = [:admin, resource_class.name.pluralize.underscore]
4
+ url_parts << :index if ActiveModel::Naming.uncountable?(resource_class)
5
+ polymorphic_path(url_parts)
6
+ end
7
+
8
+ def top_menu_item(*args, &block)
9
+ options = args.extract_options!
10
+ opts = { value: args.first, block: (capture(&block) if block_given?) }.
11
+ merge(options)
12
+
13
+ render partial: 'shared/helpers/admin/top_menu_item', locals: opts
14
+ end
15
+
16
+ def admin_published_sign(*args)
17
+ options = args.extract_options!
18
+ render(partial: 'shared/helpers/admin/published_sign',
19
+ locals: { options: options })
20
+ end
21
+
22
+ def admin_unpublished_sign(*args)
23
+ options = args.extract_options!
24
+ render(partial: 'shared/helpers/admin/unpublished_sign',
25
+ locals: { options: options })
26
+ end
27
+
28
+ def admin_locked_sign(*args)
29
+ options = args.extract_options!
30
+ render(partial: 'shared/helpers/admin/locked_sign',
31
+ locals: { options: options })
32
+ end
33
+
34
+ def admin_nav_published_sign(*args)
35
+ options = args.extract_options!
36
+ render(partial: 'shared/helpers/admin/nav_published_sign',
37
+ locals: { options: options })
38
+ end
39
+
40
+ def collection_name
41
+ I18n.t("admin.#{collection.klass.name.underscore.pluralize}.actions.index.title")
42
+ end
43
+
44
+ def collection_title(*args)
45
+ options = args.extract_options!
46
+ label = args.first || options.delete(:label) || collection_name
47
+ title(label)
48
+ end
49
+
50
+ def collection_header(*args)
51
+ options = args.extract_options!
52
+ label = options.delete(:label) || I18n.t("admin.#{collection.klass.name.underscore.pluralize}.actions.index.header")
53
+ with_button_new = options.delete(:button_new)
54
+ with_button_new = true if with_button_new.blank? && with_button_new != false
55
+
56
+ render(partial: 'shared/helpers/admin/collection_header',
57
+ locals: { label: label, with_button_new: with_button_new })
58
+ end
59
+
60
+ def collection_button_new
61
+ parent_object = parent_resource rescue nil
62
+ record_or_hash_or_array = [:admin, parent_object, collection.klass.new].compact
63
+ url = polymorphic_path(record_or_hash_or_array,
64
+ action: :new)
65
+
66
+ render(partial: 'shared/helpers/admin/collection_button_new',
67
+ locals: { url: url })
68
+ end
69
+
70
+ def object_link_new(object)
71
+ render(partial: 'shared/helpers/admin/object_link_new',
72
+ locals: { object: object })
73
+ end
74
+
75
+ def object_link_edit(object)
76
+ parent_object = parent_resource rescue nil
77
+ object = parent_object ? [:admin, parent_object, object] : [:admin, object]
78
+ render(partial: 'shared/helpers/admin/object_link_edit',
79
+ locals: { object: object })
80
+ end
81
+
82
+ def object_link_duplication(object)
83
+ parent_object = parent_resource rescue nil
84
+ object = parent_object ? [:admin, parent_object, object] : [:admin, object]
85
+ render(partial: 'shared/helpers/admin/object_link_duplication',
86
+ locals: { object: object })
87
+ end
88
+
89
+ def object_link_children(*args)
90
+ options = args.extract_options!
91
+ url = options.delete(:url)
92
+ render(partial: 'shared/helpers/admin/object_link_children',
93
+ locals: { url: url })
94
+ end
95
+
96
+ def resource_name(*args)
97
+ options = args.extract_options!
98
+ args << { primary_attribute: :name }.merge(options)
99
+ _resource_name(*args)
100
+ end
101
+
102
+ def resource_nav_name(*args)
103
+ options = args.extract_options!
104
+ args << { primary_attribute: :nav_name }.merge(options)
105
+ _resource_name(*args)
106
+ end
107
+
108
+ def _resource_name(*args)
109
+ options = args.extract_options!
110
+ primary_attribute = options.delete(:primary_attribute) || :name
111
+ name = (resource.respond_to?(primary_attribute) && resource.try(primary_attribute)) ||
112
+ (resource.respond_to?(:title) && resource.try(:title))
113
+ if name.present?
114
+ name
115
+ else
116
+ I18n.t("admin.#{resource.class.name.underscore.pluralize}.labels.actions.#{params[:action]}")
117
+ end
118
+ end
119
+
120
+ def resource_title
121
+ title(resource_name)
122
+ end
123
+
124
+ def resource_header(*args, &block)
125
+ options = args.extract_options!
126
+ text = args.first || options.delete(:text) || resource_name
127
+ admin_page_header(text, &block)
128
+ end
129
+
130
+ def resource_button_value_main
131
+ I18n.t("admin.#{resource.class.name.underscore.pluralize}.labels.actions.#{params[:action]}")
132
+ end
133
+
134
+ def resource_button_value_stay
135
+ I18n.t("admin.#{resource.class.name.underscore.pluralize}.labels.actions.#{params[:action]}_stay_in_place")
136
+ end
137
+
138
+ def resource_button_value_cancel
139
+ I18n.t('labels.admin.cancel')
140
+ end
141
+
142
+ def resource_form_object
143
+ parent_object = parent_resource rescue nil
144
+ if parent_object.present?
145
+ [:admin, parent_resource, resource]
146
+ else
147
+ [:admin, resource]
148
+ end
149
+ end
150
+
151
+ def admin_cb(object)
152
+ content_tag :label, class: 'f-check' do
153
+ concat(check_box_tag 'id_eq[]', object.id, false, id: "id_eq_#{object.id}")
154
+ concat(content_tag(:span, '', class: 'f-check__box'))
155
+ end
156
+ end
157
+
158
+ def batch_actions_tag(*args, &block)
159
+ options = args.extract_options!
160
+ with_destroy = options.delete(:with_destroy)
161
+ with_destroy = true if with_destroy.blank? && with_destroy != false
162
+ with_publication = options.delete(:publication)
163
+ with_nav_publication = options.delete(:nav_publication)
164
+
165
+ render(partial: 'shared/helpers/admin/batch_actions_tag',
166
+ locals: {
167
+ block: (capture(&block) if block_given?),
168
+ with_destroy: with_destroy,
169
+ with_publication: with_publication,
170
+ with_nav_publication: with_nav_publication
171
+ })
172
+ end
173
+
174
+ def admin_page_header(*args, &block)
175
+ options = args.extract_options!
176
+ opts = { value: args.first, block: (capture(&block) if block_given?) }.
177
+ merge(opts: options)
178
+ render partial: 'shared/helpers/admin/page_header', locals: opts
179
+ end
180
+
181
+ def admin_sortable_column(column, label)
182
+ the_col = params[:order_by] == column.to_s
183
+ current = params[:direction] == 'asc' ? :asc : :desc
184
+ direction = the_col && current == :asc ? :desc : :asc
185
+ opts = params.merge(page: params[:page], search: params[:search], order_by: column, direction: direction)
186
+ opts.permit!
187
+
188
+ link_to(label, opts) + (tag(:i, class: "icon-chevron-#{current == :desc ? 'down' : 'up'}") if the_col)
189
+ end
190
+ end
@@ -0,0 +1,64 @@
1
+ module Adminos::Helpers::Bootstrap
2
+ def bs_btn(*args)
3
+ (['btn'] + args.map { |arg| BS_BTN_CLS.include?(arg.to_s) ? "btn-#{arg}" : arg }).join(' ')
4
+ end
5
+
6
+ def h_bs_btn(*args)
7
+ { class: bs_btn(*args) }
8
+ end
9
+
10
+ def bs_label(type, *args, &block)
11
+ options = args.extract_options!
12
+ bs_append_cls(options, 'label', type, BS_LABEL_CLS)
13
+ content_tag :span, *args, options, &block
14
+ end
15
+
16
+ def bs_badge(type, *args, &block)
17
+ options = args.extract_options!
18
+ bs_append_cls(options, 'badge', type, BS_BADGE_CLS)
19
+ content_tag :span, *args, options, &block
20
+ end
21
+
22
+ def bs_alert(type, *args, &block)
23
+ options = args.extract_options!
24
+
25
+ fade = 'fade in' if options.delete(:fade)
26
+ bs_append_cls(options, 'alert', type, BS_ALERT_CLS, fade)
27
+
28
+ if options[:close] || options[:close].nil?
29
+ close = options.delete(:close) || 'x'
30
+ close = %{<a class="close" data-dismiss="alert">#{close}</a>}
31
+ end
32
+
33
+ content = args.shift || capture(&block)
34
+
35
+ content_tag :div, "#{close}#{content}".html_safe, options
36
+ end
37
+
38
+ def bs_icon(type, *args)
39
+ options = args.extract_options!
40
+ css_class = options.delete(:class)
41
+ args << { class: "icon-#{type} #{css_class}" }.merge(options)
42
+ content_tag(:i, nil, *args)
43
+ end
44
+
45
+ def bs_icon_white(type, content = nil)
46
+ %{<i class="icon-white icon-#{type}"></i>#{content}}.html_safe
47
+ end
48
+
49
+ private
50
+
51
+ def bs_append_cls(options, default, type, classes, *args)
52
+ cls = args
53
+ cls << default
54
+ cls << ("#{default}-#{type}" if classes.include?(type.to_s))
55
+ cls << options[:class]
56
+ cls = cls.compact.join(' ')
57
+ options[:class] = cls
58
+ end
59
+
60
+ BS_BTN_CLS = %w(small large mini disabled primary info success warning danger inverse)
61
+ BS_LABEL_CLS = %w(success warning important info inverse)
62
+ BS_ALERT_CLS = %w(error success info)
63
+ BS_BADGE_CLS = %w(error success warning important info inverse)
64
+ end
@@ -0,0 +1,10 @@
1
+ module Adminos::ApplySortableOrder
2
+ extend ActiveSupport::Concern
3
+
4
+ module ClassMethods
5
+ def apply_sortable_order(id, *args)
6
+ options = args.extract_options!
7
+ self.where(options.merge(id: id)).order(position: :asc).update_all('position = FIND_IN_SET(id, ?)', id.join(','))
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,17 @@
1
+ module Adminos::ArrayAttrs
2
+ extend ActiveSupport::Concern
3
+
4
+ module ClassMethods
5
+ def array_attrs(*args)
6
+ options = args.extract_options!
7
+
8
+ args.each do |name|
9
+ define_method :"#{name}_to_a" do
10
+ value = send(name)
11
+ split = value.split("\n") || []
12
+ values = split.map { |value| value.strip }
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,20 @@
1
+ module Adminos::Cropped
2
+ extend ActiveSupport::Concern
3
+
4
+ module ClassMethods
5
+ def cropped(as_attribute, coord_attribute = nil)
6
+
7
+ define_method "#{as_attribute}_cropped" do
8
+ public_send(as_attribute).variant(combine_options: { crop: public_send("#{as_attribute}_cropped_coord") })
9
+ end
10
+
11
+ define_method "#{as_attribute}_attr_coord" do
12
+ coord_attribute || "#{as_attribute}_coord"
13
+ end
14
+
15
+ define_method "#{as_attribute}_cropped_coord" do
16
+ public_send(public_send("#{as_attribute}_attr_coord"))
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,16 @@
1
+ # <http://stackoverflow.com/questions/1183506/make-blank-params-nil#1186265>.
2
+ module Adminos::DomId
3
+ extend ActiveSupport::Concern
4
+
5
+ module ClassMethods
6
+ def with_dom_id(*args)
7
+ options = args.extract_options!
8
+ identifier_method = options.delete(:identifier_method) || :id
9
+
10
+ define_method :dom_id do
11
+ @dom_id ||= [ self.class.name.pathalize,
12
+ self.send(identifier_method).to_s.gsub('-', '_') ].join('_')
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,43 @@
1
+ module Adminos::FlagAttrs
2
+ extend ActiveSupport::Concern
3
+
4
+ module ClassMethods
5
+ def flag_attrs(*args)
6
+ options = args.extract_options!
7
+
8
+ on = args.delete(:on) || true
9
+ off = args.delete(:off) || false
10
+
11
+ args.each do |name|
12
+ define_method :"set_#{name}_on" do
13
+ update_attribute(name, on)
14
+ end
15
+
16
+ define_method :"set_#{name}_off" do
17
+ update_attribute(name, off)
18
+ end
19
+
20
+ (class << self; self; end).class_eval do
21
+ define_method :"set_#{name}_on" do
22
+ update_all(name => on)
23
+ end
24
+
25
+ define_method :"set_each_#{name}_on" do
26
+ all.each { |object| object.update_attribute(name, on) }
27
+ end
28
+
29
+ define_method :"set_#{name}_off" do
30
+ update_all(name => off)
31
+ end
32
+
33
+ define_method :"set_each_#{name}_off" do
34
+ all.each { |object| object.update_attribute(name, off) }
35
+ end
36
+ end
37
+
38
+ scope :"#{name}", -> { where(name => true) }
39
+ scope :"not_#{name}", -> { where(name => false) }
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,19 @@
1
+ # <http://stackoverflow.com/questions/1183506/make-blank-params-nil#1186265>.
2
+ module Adminos::IfBlankSetToNilParams
3
+ extend ActiveSupport::Concern
4
+
5
+ module ClassMethods
6
+ def if_blank_set_to_nil_params(*args)
7
+ options = args.extract_options!
8
+ attrs = args.first
9
+ fail ArgumentError if attrs.blank?
10
+ attrs = [attrs] unless attrs.is_a?(Array)
11
+
12
+ before_validation do |object|
13
+ attrs.each do |attr_name|
14
+ object[attr_name] = nil if object[attr_name].blank?
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,17 @@
1
+ module Adminos::MoveTo
2
+ def self.included(base)
3
+ base.class_eval do
4
+ sortable
5
+ end
6
+ end
7
+
8
+ def move_to(id)
9
+ if id.blank?
10
+ self.move_to_top!
11
+ else
12
+ to_position = self.class.where(id: id).pluck(:position).first
13
+ to_position += 1 if to_position < self.position
14
+ self.insert_at!(to_position)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,31 @@
1
+ module Adminos::NestedSet::Duplication
2
+ extend ActiveSupport::Concern
3
+
4
+ # Метод клонирует объект. Добавляет в slug -сopy, т.к. он уникален
5
+ # Далее объект сохранятеся в базе. Если объект в корне, то он туда и помещается
6
+ # Иначе объект помещается в нужного родителя
7
+ # Переопредели generated_slug в модели если хочешь свою логику
8
+ def duplication
9
+ cloned = self.dup
10
+ cloned.slug = generated_slug if cloned.respond_to?('slug=')
11
+ cloned.published = false if cloned.respond_to?('published=')
12
+ cloned.translations = self.translations.map(&:dup) if cloned.respond_to?('translations')
13
+
14
+ cloned.save
15
+ self.parent.children << cloned unless self.root?
16
+ end
17
+
18
+ private
19
+
20
+ def generated_slug
21
+ prefix =
22
+ if self.respond_to?(:translations)
23
+ self.class.with_translated_attribute(:name, reasonable_name, I18n.available_locales).size
24
+ else
25
+ self.class.where(name: reasonable_name).size
26
+ end
27
+
28
+ base_slug = self.class.find_by(slug: reasonable_name.parameterize).try(:slug)
29
+ base_slug.present? ? base_slug + prefix.to_s : reasonable_name.parameterize
30
+ end
31
+ end
@@ -0,0 +1,50 @@
1
+ module Adminos::NestedSet::MaterializePath
2
+ extend ActiveSupport::Concern
3
+
4
+ module ClassMethods
5
+ def materialize_path(*args)
6
+ options = args.extract_options!
7
+
8
+ prefix = options.delete(:prefix) || nil
9
+ delimiter = options.delete(:delimiter) || '/'
10
+ path_column = options.delete(:path_column) || 'path'
11
+ segment_accessor = options.delete(:segment_accessor) || 'slug'
12
+
13
+ validates segment_accessor, presence: true
14
+ validate :path_column_uniqueness
15
+
16
+ define_method :path_column_uniqueness do
17
+ twins = self.class.where('id != ?', self.id).
18
+ where(path_column => self.ancestors.map do |ancestor|
19
+ ancestor[segment_accessor]
20
+ end.push(self[segment_accessor]).join(delimiter))
21
+
22
+ errors.add(segment_accessor, :taken) if twins.present?
23
+ end
24
+
25
+ after_save do |object|
26
+ # Some scope is being added when turning published on/off
27
+ path_segments = object.class.unscoped do
28
+ object.self_and_ancestors.map { |obj| obj.send(segment_accessor) }
29
+ end
30
+ path_segments.unshift prefix if prefix
31
+ ancestors_path = path_segments.join(delimiter)
32
+
33
+ updates = {
34
+ object.id => ancestors_path
35
+ }
36
+
37
+ object.descendants.each do |descendant|
38
+ descendant.depth += 1 if prefix
39
+ path_segments[descendant.depth] = descendant.send(segment_accessor)
40
+ updates[descendant.id] = path_segments[0..descendant.depth].join(delimiter)
41
+ end
42
+
43
+ # No callbacks for descendatns
44
+ updates.each do |id, path|
45
+ self.class.where(id: id).update_all(path_column => path)
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,35 @@
1
+ module Adminos::NestedSet::PlaceTo
2
+ extend ActiveSupport::Concern
3
+
4
+ def place_to(*args)
5
+ options = args.extract_options!
6
+ parent_id = args.first || options.delete(:parent_id)
7
+ prev_id = args.second || options.delete(:prev_id)
8
+ opts = { place_first: true }.merge(options)
9
+ if parent_id.present?
10
+ parent = self.class.find(parent_id)
11
+ self.move_to_child_of(parent)
12
+ else
13
+ self.move_to_root
14
+ end
15
+
16
+ if prev_id.present?
17
+ prev = self.class.find(prev_id)
18
+ self.move_to_right_of(prev)
19
+ else
20
+ current_first = self.parent.present? ? self.parent.children.first : self.class.order('lft ASC').first
21
+ if opts[:place_first] && ((self.parent.present? && self.parent.children.count > 1) || !self.parent.present?)
22
+ self.move_to_left_of(current_first)
23
+ end
24
+ end
25
+ self.reload
26
+ run_callbacks(:save)
27
+ end
28
+
29
+ def move_children_to_parent!
30
+ self.children.each do |child|
31
+ child.place_to(self.parent, nil)
32
+ child.set_published_off if child.respond_to?(:set_published_off)
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,34 @@
1
+ module Adminos::NestedSet::SafeDestroy
2
+ extend ActiveSupport::Concern
3
+
4
+ module ClassMethods
5
+ def safe_destroy
6
+ order('depth DESC').each { |page| page.destroy }
7
+ end
8
+ end
9
+
10
+ def safe_destroy
11
+ self.move_children_to_root!
12
+ self.destroy
13
+ end
14
+
15
+ def safe_destroy(*args)
16
+ options = args.extract_options!
17
+
18
+ case options[:children_to]
19
+ when :parent
20
+ self.move_children_to_parent!
21
+ else
22
+ self.move_children_to_root!
23
+ end
24
+
25
+ self.destroy unless options[:without_destroy]
26
+ end
27
+
28
+ def move_children_to_root!
29
+ self.children.each do |child|
30
+ child.move_to_root
31
+ child.set_published_off if child.respond_to?(:set_published_off)
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,28 @@
1
+ module Adminos::Recognizable
2
+ def self.included(base)
3
+ base.extend ClassMethods
4
+ # base.send(:include, InstanceMethods)
5
+ end
6
+
7
+ module ClassMethods
8
+ def acts_as_recognizable(*args)
9
+ extend FriendlyId
10
+
11
+ options = args.extract_options!
12
+ sluggable_column = args.first || options.delete(:sluggable_column) || :name
13
+ slug_column = options.delete(:slug_column) || :slug
14
+
15
+ friendly_id sluggable_column, slug_column: slug_column, use: :slugged
16
+ validates slug_column, uniqueness: true
17
+
18
+ define_method :slug_friendly do
19
+ friendly_id
20
+ end
21
+
22
+ # friendly_id slugs transliteration <https://github.com/norman/babosa>.
23
+ define_method :normalize_friendly_id do |input|
24
+ input.to_s.to_slug.normalize(transliterations: :russian).normalize.to_s
25
+ end
26
+ end
27
+ end
28
+ end