plutonium 0.10.2 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (228) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -0
  3. data/Rakefile +1 -2
  4. data/app/assets/application.js.bk +31419 -0
  5. data/app/assets/plutonium-logo-original.png +0 -0
  6. data/app/assets/plutonium-logo-white.png +0 -0
  7. data/app/assets/plutonium-logo.png +0 -0
  8. data/app/assets/plutonium.css +1 -0
  9. data/app/assets/plutonium.ico +0 -0
  10. data/app/assets/plutonium.js +12416 -0
  11. data/app/assets/plutonium.js.map +7 -0
  12. data/app/assets/plutonium.min.js +39 -0
  13. data/app/assets/plutonium.min.js.map +7 -0
  14. data/app/views/application/_flash_alerts.html.erb +5 -2
  15. data/app/views/application/_flash_toasts.html.erb +2 -0
  16. data/app/views/application/_resource_header.html.erb +263 -697
  17. data/app/views/application/_resource_sidebar.html.erb +14 -12
  18. data/app/views/components/action_button/action_button_component.rb +3 -3
  19. data/app/views/components/attributes.rb +184 -0
  20. data/app/views/components/base.rb +19 -40
  21. data/app/views/components/block/block_component.html.erb +1 -1
  22. data/app/views/components/block/block_component.rb +11 -7
  23. data/app/views/components/breadcrumbs/breadcrumbs_component.rb +3 -3
  24. data/app/views/components/button/button_component.html.erb +2 -2
  25. data/app/views/components/button/button_component.rb +10 -5
  26. data/app/views/components/dyna_frame_content/dyna_frame_content_component.html.erb +1 -0
  27. data/app/views/components/dyna_frame_content/dyna_frame_content_component.rb +3 -3
  28. data/app/views/components/dyna_frame_host/dyna_frame_host_component.html.erb +1 -2
  29. data/app/views/components/dyna_frame_host/dyna_frame_host_component.rb +12 -5
  30. data/app/views/components/empty_card/empty_card_component.rb +3 -3
  31. data/app/views/components/form/form_builder.rb +1 -1
  32. data/app/views/components/form/form_component.rb +3 -3
  33. data/app/views/components/has_many_panel/has_many_panel_component.html.erb +25 -0
  34. data/app/views/components/has_many_panel/has_many_panel_component.rb +16 -0
  35. data/app/views/components/header/header_component.rb +3 -3
  36. data/app/views/components/interactive_action_form/interactive_action_form_component.rb +3 -3
  37. data/app/views/components/nav_grid_menu/nav_grid_menu_component.html.erb +24 -0
  38. data/app/views/components/nav_grid_menu/nav_grid_menu_component.rb +23 -0
  39. data/app/views/components/nav_grid_menu_item/nav_grid_menu_item_component.html.erb +4 -0
  40. data/app/views/components/nav_grid_menu_item/nav_grid_menu_item_component.rb +20 -0
  41. data/app/views/components/nav_user/nav_user_component.html.erb +50 -0
  42. data/app/views/components/nav_user/nav_user_component.rb +32 -0
  43. data/app/views/components/nav_user_link/nav_user_link_component.html.erb +7 -0
  44. data/app/views/components/nav_user_link/nav_user_link_component.rb +23 -0
  45. data/app/views/components/nav_user_section/nav_user_section_component.html.erb +7 -0
  46. data/app/views/components/nav_user_section/nav_user_section_component.rb +18 -0
  47. data/app/views/components/nested_resource_form_fields/nested_resource_form_fields_component.html.erb +1 -3
  48. data/app/views/components/nested_resource_form_fields/nested_resource_form_fields_component.rb +11 -5
  49. data/app/views/components/pagination/pagination_component.html.erb +1 -1
  50. data/app/views/components/pagination/pagination_component.rb +10 -7
  51. data/app/views/components/panel/panel_component.html.erb +13 -6
  52. data/app/views/components/panel/panel_component.rb +11 -5
  53. data/app/views/components/resource_header/resource_header_component.html.erb +81 -0
  54. data/app/views/components/resource_header/resource_header_component.rb +20 -0
  55. data/app/views/components/resource_layout/resource_layout_component.html.erb +32 -0
  56. data/app/views/components/resource_layout/resource_layout_component.rb +39 -0
  57. data/app/views/components/sidebar/sidebar_component.html.erb +3 -33
  58. data/app/views/components/sidebar/sidebar_component.rb +3 -3
  59. data/app/views/components/sidebar_menu/sidebar_menu_component.html.erb +4 -2
  60. data/app/views/components/sidebar_menu/sidebar_menu_component.rb +10 -6
  61. data/app/views/components/sidebar_menu_item/sidebar_menu_item_component.html.erb +63 -71
  62. data/app/views/components/sidebar_menu_item/sidebar_menu_item_component.rb +27 -8
  63. data/app/views/components/skeleton/table/table_component.html.erb +1 -1
  64. data/app/views/components/skeleton/table/table_component.rb +3 -3
  65. data/app/views/components/table/table_component.html.erb +40 -89
  66. data/app/views/components/table/table_component.rb +124 -28
  67. data/app/views/components/table_search_input/table_search_input_component.html.erb +1 -1
  68. data/app/views/components/table_search_input/table_search_input_component.rb +11 -6
  69. data/app/views/components/table_toolbar/table_toolbar_component.html.erb +1 -1
  70. data/app/views/components/table_toolbar/table_toolbar_component.rb +11 -3
  71. data/app/views/components/toolbar/toolbar_component.html.erb +2 -2
  72. data/app/views/components/toolbar/toolbar_component.rb +16 -8
  73. data/app/views/layouts/resource.html copy.erb +2 -2
  74. data/app/views/layouts/resource.html.erb +21 -37
  75. data/app/views/layouts/rodauth.html.erb +32 -25
  76. data/app/views/resource/_interactive_resource_action_form.html.erb +1 -1
  77. data/app/views/resource/_resource_details.html.erb +8 -5
  78. data/app/views/resource/_resource_table.html.erb +70 -1
  79. data/app/views/resource/interactive_resource_collection_action.html.erb +1 -0
  80. data/app/views/resource/interactive_resource_record_action.html.erb +1 -0
  81. data/app/views/resource/interactive_resource_recordless_action.html.erb +1 -0
  82. data/app/views/resource/new.html.erb +1 -0
  83. data/app/views/rodauth/add_recovery_codes.html.erb +8 -7
  84. data/app/views/rodauth/otp_auth.html.erb +1 -1
  85. data/app/views/rodauth/otp_setup.html.erb +10 -8
  86. data/config/initializers/simple_form.rb +22 -2
  87. data/esbuild.config.js +35 -31
  88. data/lib/generators/pu/core/assets/assets_generator.rb +41 -0
  89. data/lib/generators/pu/core/assets/templates/tailwind.config.js +18 -0
  90. data/lib/generators/pu/core/install/templates/config/initializers/plutonium.rb +3 -0
  91. data/lib/generators/pu/core/ruby/ruby_generator.rb +30 -0
  92. data/lib/generators/pu/core/ruby/templates/.keep +0 -0
  93. data/lib/generators/pu/docker/install/install_generator.rb +35 -0
  94. data/lib/generators/pu/docker/install/templates/.keep +0 -0
  95. data/lib/generators/pu/docker/install/templates/Dockerfile.dev.tt +30 -0
  96. data/lib/generators/pu/docker/install/templates/Dockerfile.tt +75 -0
  97. data/lib/generators/pu/docker/install/templates/bin/console +3 -0
  98. data/lib/generators/pu/docker/install/templates/bin/restart +3 -0
  99. data/lib/generators/pu/docker/install/templates/bin/shell +3 -0
  100. data/lib/generators/pu/docker/install/templates/docker-compose.yml +29 -0
  101. data/lib/generators/pu/gem/dotenv/dotenv_generator.rb +32 -0
  102. data/lib/generators/pu/gem/dotenv/templates/.env +6 -0
  103. data/lib/generators/pu/gem/dotenv/templates/.env.local +5 -0
  104. data/lib/generators/pu/gem/dotenv/templates/.env.local.template +5 -0
  105. data/lib/generators/pu/gem/dotenv/templates/.env.template +6 -0
  106. data/lib/generators/pu/gem/dotenv/templates/.keep +0 -0
  107. data/lib/generators/pu/gem/dotenv/templates/config/initializers/001_ensure_required_env.rb +21 -0
  108. data/lib/generators/pu/gem/redis/redis_generator.rb +22 -0
  109. data/lib/generators/pu/gem/redis/templates/.keep +0 -0
  110. data/lib/generators/pu/gen/component/component_generator.rb +13 -10
  111. data/lib/generators/pu/gen/component/templates/component.html.erb.tt +1 -1
  112. data/lib/generators/pu/gen/component/templates/component.rb.tt +10 -4
  113. data/lib/generators/pu/lib/plutonium_generators/concerns/actions.rb +154 -32
  114. data/lib/generators/pu/lib/plutonium_generators/generator.rb +6 -6
  115. data/lib/generators/pu/lib/plutonium_generators/installer.rb +1 -1
  116. data/lib/generators/pu/pkg/app/app_generator.rb +4 -4
  117. data/lib/generators/pu/pkg/app/templates/app/controllers/concerns/controller.rb.tt +28 -0
  118. data/lib/generators/pu/pkg/app/templates/app/controllers/controller.rb.tt +5 -0
  119. data/lib/generators/pu/pkg/app/templates/app/controllers/dashboard_controller.rb.tt +1 -1
  120. data/lib/generators/pu/res/conn/conn_generator.rb +4 -4
  121. data/lib/generators/pu/res/conn/templates/app/controllers/resource_controller.rb.tt +1 -1
  122. data/lib/generators/pu/res/model/model_generator.rb +3 -3
  123. data/lib/generators/pu/res/scaffold/templates/policy.rb.tt +6 -0
  124. data/lib/generators/pu/rodauth/account_generator.rb +10 -10
  125. data/lib/generators/pu/rodauth/install_generator.rb +9 -2
  126. data/lib/generators/pu/rodauth/migration/sequel/audit_logging.erb +2 -2
  127. data/lib/generators/pu/rodauth/migration_generator.rb +1 -1
  128. data/lib/generators/pu/rodauth/templates/app/{misc → rodauth}/account_rodauth_plugin.rb.tt +2 -2
  129. data/lib/generators/pu/rodauth/templates/app/{misc → rodauth}/rodauth_plugin.rb.tt +0 -3
  130. data/lib/generators/pu/rodauth/templates/db/migrate/install_rodauth.rb.tt +5 -0
  131. data/lib/generators/pu/service/postgres/postgres_generator.rb +61 -0
  132. data/lib/generators/pu/service/postgres/templates/.keep +0 -0
  133. data/lib/generators/pu/service/postgres/templates/bin/initdb.d/create-multiple-postgresql-databases.sh +22 -0
  134. data/lib/generators/pu/service/postgres/templates/database.yml.tt +93 -0
  135. data/lib/generators/pu/service/sidekiq/sidekiq_generator.rb +57 -0
  136. data/lib/generators/pu/service/sidekiq/templates/.keep +0 -0
  137. data/lib/generators/pu/service/sidekiq/templates/app/sidekiq/sidekiq_job.rb +3 -0
  138. data/lib/generators/pu/service/sidekiq/templates/config/initializers/sidekiq.rb +53 -0
  139. data/lib/generators/pu/service/sidekiq/templates/config/sidekiq.yml +6 -0
  140. data/lib/plutonium/config.rb +2 -9
  141. data/lib/plutonium/core/associations/renderers/basic_renderer.rb +28 -0
  142. data/lib/plutonium/core/associations/renderers/factory.rb +36 -0
  143. data/lib/plutonium/core/associations/renderers/has_many_renderer.rb +16 -0
  144. data/lib/plutonium/core/autodiscovery/association_renderer_discoverer.rb +31 -0
  145. data/lib/plutonium/core/controllers/authorizable.rb +13 -17
  146. data/lib/plutonium/core/controllers/base.rb +3 -7
  147. data/lib/plutonium/core/controllers/entity_scoping.rb +3 -3
  148. data/lib/plutonium/core/controllers/presentable.rb +6 -1
  149. data/lib/plutonium/core/definers/association_renderer_definer.rb +33 -0
  150. data/lib/plutonium/core/fields/inputs/checkbox_input.rb +13 -0
  151. data/lib/plutonium/core/fields/inputs/factory.rb +1 -0
  152. data/lib/plutonium/core/fields/inputs/polymorphic_belongs_to_association_input.rb +1 -1
  153. data/lib/plutonium/core/ui/detail.rb +1 -0
  154. data/lib/plutonium/helpers/application_helper.rb +8 -9
  155. data/lib/plutonium/helpers/assets_helper.rb +33 -0
  156. data/lib/plutonium/helpers/display_helper.rb +13 -0
  157. data/lib/plutonium/helpers/form_helper.rb +1 -1
  158. data/lib/plutonium/helpers.rb +1 -0
  159. data/lib/plutonium/icons.rb +12 -5
  160. data/lib/plutonium/pkg/app.rb +10 -0
  161. data/lib/plutonium/pundit/context.rb +18 -0
  162. data/lib/plutonium/pundit/policy_finder.rb +25 -0
  163. data/lib/plutonium/railtie.rb +24 -8
  164. data/lib/plutonium/reloader.rb +18 -7
  165. data/lib/plutonium/resource/controller.rb +5 -0
  166. data/lib/plutonium/resource/policy.rb +69 -47
  167. data/lib/plutonium/resource/presenter.rb +1 -0
  168. data/lib/plutonium/resource/query_object.rb +139 -130
  169. data/lib/plutonium/rodauth/controller_methods.rb +7 -3
  170. data/lib/plutonium/version.rb +1 -1
  171. data/lib/plutonium.rb +10 -54
  172. data/lib/tasks/create_rodauth_admin.rake +16 -0
  173. data/package-lock.json +782 -17
  174. data/package.json +31 -8
  175. data/postcss.config.js +17 -7
  176. data/src/.npmignore +2 -0
  177. data/src/js/controllers/color_mode_controller.js +41 -0
  178. data/src/js/controllers/frame_navigator_controller.js +99 -0
  179. data/src/js/controllers/has_many_panel_controller.js +8 -0
  180. data/src/js/controllers/nav_grid_menu_controller.js +8 -0
  181. data/src/js/controllers/nav_grid_menu_item_controller.js +8 -0
  182. data/{app/views/components/tab_bar/tab_bar_controller.js → src/js/controllers/nav_user_controller.js} +2 -2
  183. data/src/js/controllers/nav_user_link_controller.js +8 -0
  184. data/src/js/controllers/nav_user_section_controller.js +8 -0
  185. data/src/js/controllers/register_controllers.js +45 -0
  186. data/{app/assets/javascripts → src/js}/controllers/resource_dismiss_controller.js +2 -0
  187. data/{app/assets/javascripts → src/js}/controllers/resource_drop_down_controller.js +2 -0
  188. data/src/js/controllers/resource_header_controller.js +8 -0
  189. data/src/js/controllers/resource_layout_controller.js +8 -0
  190. data/src/js/controllers/sidebar_menu_controller.js +8 -0
  191. data/src/js/controllers/sidebar_menu_item_controller.js +8 -0
  192. data/src/js/core.js +4 -0
  193. data/{app/assets/javascripts/plutonium-app.js → src/js/plutonium.js} +1 -1
  194. data/{app/assets/javascripts → src/js}/turbo/turbo_debug.js +2 -4
  195. data/tailwind.config.js +85 -84
  196. metadata +106 -41
  197. data/app/assets/build/plutonium.js +0 -5122
  198. data/app/assets/javascripts/controllers/index.js +0 -34
  199. data/app/assets/javascripts/plutonium.js +0 -1
  200. data/app/views/application/_color_modes.html.erb +0 -57
  201. data/app/views/components/tab_bar/tab_bar_component.html.erb +0 -11
  202. data/app/views/components/tab_bar/tab_bar_component.rb +0 -9
  203. data/app/views/resource/_nav_user.html.erb +0 -4
  204. data/app/views/resource/_tab_menu.html.erb +0 -13
  205. data/css.manifest +0 -3
  206. data/js.manifest +0 -4
  207. data/lib/generators/pu/pkg/app/templates/app/controllers/app_controller.rb.tt +0 -5
  208. data/lib/generators/pu/pkg/app/templates/app/controllers/package_controller.rb.tt +0 -26
  209. data/public/plutonium-assets/application.css +0 -25086
  210. data/public/plutonium-assets/plutonium-app-36KN5FVJ.js +0 -6
  211. data/public/plutonium-assets/plutonium-app-36KN5FVJ.js.map +0 -7
  212. data/public/plutonium-assets/plutonium-app-6WILQCTT.js +0 -39
  213. data/public/plutonium-assets/plutonium-app-6WILQCTT.js.map +0 -7
  214. data/public/plutonium-assets/plutonium.2d4f0c333cd000051d3b.css +0 -3424
  215. data/public/plutonium-assets/plutonium.50232e35b5495f5ad90d.css +0 -3415
  216. /data/{app/assets/build → lib/generators/pu/core/assets/templates}/.keep +0 -0
  217. /data/lib/generators/pu/rodauth/templates/app/{misc → rodauth}/rodauth_app.rb.tt +0 -0
  218. /data/{app/assets/stylesheets → src/css}/plutonium.css +0 -0
  219. /data/{app/views/components/form → src/js/controllers}/form_controller.js +0 -0
  220. /data/{app/views/components/interactive_action_form → src/js/controllers}/interactive_action_form_controller.js +0 -0
  221. /data/{app/views/components/nested_resource_form_fields → src/js/controllers}/nested_resource_form_fields_controller.js +0 -0
  222. /data/{app/views/components/table → src/js/controllers}/table_controller.js +0 -0
  223. /data/{app/views/components/table_search_input → src/js/controllers}/table_search_input_controller.js +0 -0
  224. /data/{app/views/components/table_toolbar → src/js/controllers}/table_toolbar_controller.js +0 -0
  225. /data/{app/views/components/toolbar → src/js/controllers}/toolbar_controller.js +0 -0
  226. /data/{app/assets/javascripts → src/js}/turbo/index.js +0 -0
  227. /data/{app/assets/javascripts → src/js}/turbo/turbo_actions.js +0 -0
  228. /data/{app/assets/javascripts → src/js}/turbo/turbo_frame_monkey_patch.js +0 -0
@@ -17,7 +17,7 @@ module Pu
17
17
  source_feature = select_feature
18
18
  source_module = (source_feature == "main_app") ? "ResourceRecord" : "#{source_feature.classify}::ResourceRecord"
19
19
 
20
- Rails.application.eager_load!
20
+ Plutonium.eager_load_rails!
21
21
  available_resources = source_module.constantize.descendants.map(&:to_s)
22
22
  selected_resources = prompt.multi_select("Select resources", available_resources)
23
23
 
@@ -27,9 +27,9 @@ module Pu
27
27
  @resource_class = resource
28
28
 
29
29
  template "app/controllers/resource_controller.rb", "packages/#{package_namespace}/app/controllers/#{package_namespace}/#{resource.pluralize.underscore}_controller.rb"
30
- template "app/policies/resource_policy.rb", "packages/#{package_namespace}/app/policies/#{package_namespace}/#{resource.underscore}_policy.rb"
31
- template "app/presenters/resource_presenter.rb", "packages/#{package_namespace}/app/presenters/#{package_namespace}/#{resource.underscore}_presenter.rb"
32
- template "app/query_objects/resource_query_object.rb", "packages/#{package_namespace}/app/query_objects/#{package_namespace}/#{resource.underscore}_query_object.rb"
30
+ # template "app/policies/resource_policy.rb", "packages/#{package_namespace}/app/policies/#{package_namespace}/#{resource.underscore}_policy.rb"
31
+ # template "app/presenters/resource_presenter.rb", "packages/#{package_namespace}/app/presenters/#{package_namespace}/#{resource.underscore}_presenter.rb"
32
+ # template "app/query_objects/resource_query_object.rb", "packages/#{package_namespace}/app/query_objects/#{package_namespace}/#{resource.underscore}_query_object.rb"
33
33
 
34
34
  insert_into_file "packages/#{package_namespace}/lib/engine.rb",
35
35
  indent("register_resource ::#{resource}\n", 6),
@@ -1,3 +1,3 @@
1
1
  class <%= app_namespace %>::<%= resource_class.pluralize %>Controller < ::<%= resource_class.pluralize %>Controller
2
- include <%= app_namespace %>::<%= app_namespace %>Controller
2
+ include <%= app_namespace %>::Concerns::Controller
3
3
  end
@@ -14,9 +14,9 @@ module Pu
14
14
  def run_create_model
15
15
  model_class = class_name.safe_constantize
16
16
  if model_class.present? && !model_class.include?(Plutonium::Resource::Record)
17
- insert_into_file File.join("app/models", class_path, "#{file_name}.rb"),
18
- indent("include Plutonium::Resource::Record\n", 2),
19
- after: /.*class .*\n/
17
+ gsub_file File.join("app/models", class_path, "#{file_name}.rb"),
18
+ "< ApplicationRecord",
19
+ "< ResourceRecord"
20
20
  end
21
21
 
22
22
  create_model_file if create_files?
@@ -19,5 +19,11 @@ class <%= class_name %>Policy < <%= [feature_package_name, "ResourcePolicy"].joi
19
19
  def permitted_attributes_for_read
20
20
  <%= attributes.select{ |a| !a.rich_text? && !a.password_digest? && !a.token? }.map(&:name).map(&:to_sym).inspect %>
21
21
  end
22
+
23
+ # Associations
24
+
25
+ def permitted_associations
26
+ %i[]
27
+ end
22
28
  end
23
29
  <% end -%>
@@ -28,7 +28,7 @@ module Pu
28
28
  end
29
29
 
30
30
  def create_rodauth_app
31
- template "app/misc/account_rodauth_plugin.rb", "app/misc/#{account_path}_rodauth_plugin.rb"
31
+ template "app/rodauth/account_rodauth_plugin.rb", "app/rodauth/#{account_path}_rodauth_plugin.rb"
32
32
  end
33
33
 
34
34
  def configure_rodauth_plugin
@@ -36,16 +36,16 @@ module Pu
36
36
  plugin_name = indent(
37
37
  "configure ::#{account_path.classify}RodauthPlugin#{", :#{table_prefix}" unless primary?}\n", 2
38
38
  )
39
- gsub_file "app/misc/rodauth_app.rb", /.*# configure RodauthMain\n/, ""
40
- insert_into_file "app/misc/rodauth_app.rb", plugin_name, after: "# auth configuration\n"
39
+ gsub_file "app/rodauth/rodauth_app.rb", /.*# configure RodauthMain\n/, ""
40
+ insert_into_file "app/rodauth/rodauth_app.rb", plugin_name, after: "# auth configuration\n"
41
41
  end
42
42
  end
43
43
 
44
44
  def configure_rodauth_plugin_load_route
45
45
  in_root do
46
46
  route_config = indent("r.rodauth#{"(:#{table_prefix})" unless primary?}\n", 4)
47
- gsub_file "app/misc/rodauth_app.rb", /.*# r\.rodauth\n/, ""
48
- insert_into_file "app/misc/rodauth_app.rb", route_config, after: "# auth route configuration\n"
47
+ gsub_file "app/rodauth/rodauth_app.rb", /.*# r\.rodauth\n/, ""
48
+ insert_into_file "app/rodauth/rodauth_app.rb", route_config, after: "# auth route configuration\n"
49
49
  end
50
50
  end
51
51
 
@@ -54,15 +54,15 @@ module Pu
54
54
  plugin_config = indent(
55
55
  "rodauth#{"(:#{table_prefix})" unless primary?}.load_memory # autologin remembered #{table}\n", 4
56
56
  )
57
- gsub_file "app/misc/rodauth_app.rb", /.*# rodauth\.load_memory.*\n/, ""
57
+ gsub_file "app/rodauth/rodauth_app.rb", /.*# rodauth\.load_memory.*\n/, ""
58
58
 
59
59
  if remember?
60
- insert_into_file "app/misc/rodauth_app.rb", plugin_config, after: "# plugin route configuration\n"
60
+ insert_into_file "app/rodauth/rodauth_app.rb", plugin_config, after: "# plugin route configuration\n"
61
61
  else
62
- gsub_file "app/misc/rodauth_app.rb", plugin_config, ""
62
+ gsub_file "app/rodauth/rodauth_app.rb", plugin_config, ""
63
63
  in_root do
64
- unless File.read("app/misc/rodauth_app.rb").match?(/.*\.load_memory # autologin/)
65
- insert_into_file "app/misc/rodauth_app.rb", indent("# rodauth.load_memory # autologin remembered users\n", 4),
64
+ unless File.read("app/rodauth/rodauth_app.rb").match?(/.*\.load_memory # autologin/)
65
+ insert_into_file "app/rodauth/rodauth_app.rb", indent("# rodauth.load_memory # autologin remembered users\n", 4),
66
66
  after: "# plugin route configuration\n"
67
67
  end
68
68
  end
@@ -1,9 +1,12 @@
1
1
  require "rails/generators/base"
2
+ require "rails/generators/active_record/migration"
2
3
  require "securerandom"
3
4
 
4
5
  module Pu
5
6
  module Rodauth
6
7
  class InstallGenerator < ::Rails::Generators::Base
8
+ include ::ActiveRecord::Generators::Migration
9
+
7
10
  SEQUEL_ADAPTERS = {
8
11
  "postgresql" => (RUBY_ENGINE == "jruby") ? "postgresql" : "postgres",
9
12
  "mysql2" => (RUBY_ENGINE == "jruby") ? "mysql" : "mysql2",
@@ -31,8 +34,8 @@ module Pu
31
34
  end
32
35
 
33
36
  def create_rodauth_app
34
- template "app/misc/rodauth_app.rb"
35
- template "app/misc/rodauth_plugin.rb"
37
+ template "app/rodauth/rodauth_app.rb"
38
+ template "app/rodauth/rodauth_plugin.rb"
36
39
  end
37
40
 
38
41
  def add_dev_config
@@ -41,6 +44,10 @@ module Pu
41
44
  before: /^end/
42
45
  end
43
46
 
47
+ def create_install_migration
48
+ migration_template "db/migrate/install_rodauth.rb", "db/migrate/install_rodauth.rb" # , File.join(db_migrate_path, "#{migration_name}.rb")
49
+ end
50
+
44
51
  def show_instructions
45
52
  readme "INSTRUCTIONS" if behavior == :invoke
46
53
  end
@@ -12,6 +12,6 @@ create_table :<%= table_prefix %>_authentication_audit_logs do
12
12
  <% else -%>
13
13
  String :metadata
14
14
  <% end -%>
15
- index [:<%= table_prefix %>_id, :at], name: :audit_<%= table_prefix %>_at_idx
16
- index :at, name: :audit_at_idx
15
+ index [:<%= table_prefix %>_id, :at], name: :<%= table_prefix %>_audit_<%= table_prefix %>_at_idx
16
+ index :at, name: :<%= table_prefix %>_audit_at_idx
17
17
  end
@@ -69,7 +69,7 @@ module Pu
69
69
  private
70
70
 
71
71
  def plugin_filename
72
- "app/misc/#{account_path}_rodauth_plugin.rb"
72
+ "app/rodauth/#{account_path}_rodauth_plugin.rb"
73
73
  end
74
74
 
75
75
  def migration_name
@@ -38,8 +38,8 @@ class <%= account_path.classify %>RodauthPlugin < RodauthPlugin
38
38
  rails_account_model { <%= account_path.classify %> }
39
39
  <% if verify_account? -%>
40
40
 
41
- # Set password when verifying account.
42
- verify_account_set_password? false
41
+ # Set password password during create account.
42
+ # verify_account_set_password? false
43
43
  <% end -%>
44
44
 
45
45
  # Change some default param keys.
@@ -50,9 +50,6 @@ class RodauthPlugin < Rodauth::Rails::Auth
50
50
  # Store account status in an integer column without foreign key constraint.
51
51
  account_status_column :status
52
52
 
53
- # Set password when verifying account.
54
- # verify_account_set_password? false
55
-
56
53
  # Change some default param keys/labels.
57
54
  login_label "Email"
58
55
  login_param "email"
@@ -0,0 +1,5 @@
1
+ class InstallRodauth < ActiveRecord::Migration[<%= ActiveRecord::Migration.current_version %>]
2
+ def change
3
+ enable_extension "citext"
4
+ end
5
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../../lib/plutonium_generators"
4
+
5
+ module Pu
6
+ module Service
7
+ class PostgresGenerator < Rails::Generators::Base
8
+ include PlutoniumGenerators::Generator
9
+
10
+ source_root File.expand_path("templates", __dir__)
11
+
12
+ desc "Set up postgres for project"
13
+
14
+ def start
15
+ bundle "goldiloader"
16
+ template "database.yml", "config/database.yml", force: true
17
+ bin_directory
18
+ add_compose_env :POSTGRES_HOST, service
19
+ add_compose_dependency service
20
+ add_compose_service service, compose_config
21
+ add_docker_dependency docker_deps
22
+ rescue => e
23
+ exception "#{self.class} failed:", e
24
+ end
25
+
26
+ private
27
+
28
+ def service
29
+ :postgres
30
+ end
31
+
32
+ def compose_config
33
+ <<~COMPOSE
34
+ postgres:
35
+ image: postgres:15 # postgres
36
+ # postgres properties
37
+ environment: # postgres
38
+ POSTGRES_MULTIPLE_DATABASES: #{db_prefix}_development,#{db_prefix}_test # postgres
39
+ POSTGRES_USER: postgres # postgres
40
+ POSTGRES_PASSWORD: postgres # postgres
41
+ volumes: # postgres
42
+ - "./.volumes/postgres/data:/var/lib/postgresql/data" # postgres
43
+ - "./bin/initdb.d:/docker-entrypoint-initdb.d" # postgres
44
+ COMPOSE
45
+ end
46
+
47
+ def docker_deps
48
+ <<~DEPS
49
+ # Install packages needed for postgres
50
+ RUN apt-get update -qq && \\
51
+ apt-get install --no-install-recommends -y curl postgresql-client && \\
52
+ rm -rf /var/lib/apt/lists /var/cache/apt/archives
53
+ DEPS
54
+ end
55
+
56
+ def db_prefix
57
+ Plutonium.application_name.underscore
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,22 @@
1
+ #!/bin/bash
2
+
3
+ set -e
4
+ set -u
5
+
6
+ function create_user_and_database() {
7
+ local database=$1
8
+ echo " Creating user and database '$database'"
9
+ psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" <<-EOSQL
10
+ CREATE USER $database;
11
+ CREATE DATABASE $database;
12
+ GRANT ALL PRIVILEGES ON DATABASE $database TO $database;
13
+ EOSQL
14
+ }
15
+
16
+ if [ -n "$POSTGRES_MULTIPLE_DATABASES" ]; then
17
+ echo "Multiple database creation requested: $POSTGRES_MULTIPLE_DATABASES"
18
+ for db in $(echo $POSTGRES_MULTIPLE_DATABASES | tr ',' ' '); do
19
+ create_user_and_database $db
20
+ done
21
+ echo "Multiple databases created"
22
+ fi
@@ -0,0 +1,93 @@
1
+ # PostgreSQL. Versions 9.3 and up are supported.
2
+ #
3
+ # Install the pg driver:
4
+ # gem install pg
5
+ # On macOS with Homebrew:
6
+ # gem install pg -- --with-pg-config=/usr/local/bin/pg_config
7
+ # On Windows:
8
+ # gem install pg
9
+ # Choose the win32 build.
10
+ # Install PostgreSQL and put its /bin directory on your path.
11
+ #
12
+ # Configure Using Gemfile
13
+ # gem "pg"
14
+ #
15
+ default: &default
16
+ adapter: postgresql
17
+ encoding: unicode
18
+ # For details on connection pooling, see Rails configuration guide
19
+ # https://guides.rubyonrails.org/configuring.html#database-pooling
20
+ pool: <%%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
21
+ # Timeouts
22
+ connect_timeout: 1
23
+ checkout_timeout: 1
24
+ variables:
25
+ statement_timeout: <%%= ENV["STATEMENT_TIMEOUT"] || "15s" %> # or ms, min, etc
26
+
27
+ local: &local
28
+ host: <%%= ENV["POSTGRES_HOST"] %>
29
+ port: 5432
30
+ username: postgres
31
+ password: postgres
32
+
33
+ development:
34
+ <<: [*default, *local]
35
+ database: <%= db_prefix %>_development
36
+
37
+ # The specified database role being used to connect to PostgreSQL.
38
+ # To create additional roles in PostgreSQL see `$ createuser --help`.
39
+ # When left blank, PostgreSQL will use the default role. This is
40
+ # the same name as the operating system user running Rails.
41
+ #username: <%= db_prefix %>
42
+
43
+ # The password associated with the PostgreSQL role (username).
44
+ #password:
45
+
46
+ # Connect on a TCP socket. Omitted by default since the client uses a
47
+ # domain socket that doesn't need configuration. Windows does not have
48
+ # domain sockets, so uncomment these lines.
49
+ #host: localhost
50
+
51
+ # The TCP port the server listens on. Defaults to 5432.
52
+ # If your server runs on a different port number, change accordingly.
53
+ #port: 5432
54
+
55
+ # Schema search path. The server defaults to $user,public
56
+ #schema_search_path: myapp,sharedapp,public
57
+
58
+ # Minimum log levels, in increasing order:
59
+ # debug5, debug4, debug3, debug2, debug1,
60
+ # log, notice, warning, error, fatal, and panic
61
+ # Defaults to warning.
62
+ #min_messages: notice
63
+
64
+ # Warning: The database defined as "test" will be erased and
65
+ # re-generated from your development database when you run "rake".
66
+ # Do not set this db to the same as development or production.
67
+ test:
68
+ <<: [*default, *local]
69
+ database: <%= db_prefix %>_test
70
+
71
+ # As with config/credentials.yml, you never want to store sensitive information,
72
+ # like your database password, in your source code. If your source code is
73
+ # ever seen by anyone, they now have access to your database.
74
+ #
75
+ # Instead, provide the password or a full connection URL as an environment
76
+ # variable when you boot the app. For example:
77
+ #
78
+ # DATABASE_URL="postgres://myuser:mypass@localhost/somedatabase"
79
+ #
80
+ # If the connection URL is provided in the special DATABASE_URL environment
81
+ # variable, Rails will automatically merge its configuration values on top of
82
+ # the values provided in this file. Alternatively, you can specify a connection
83
+ # URL environment variable explicitly:
84
+ #
85
+ # production:
86
+ # url: <%%= ENV["MY_APP_DATABASE_URL"] %>
87
+ #
88
+ # Read https://guides.rubyonrails.org/configuring.html#configuring-a-database
89
+ # for a full overview on how database connection configuration can be specified.
90
+ #
91
+ production:
92
+ <<: *default
93
+ database: <%= db_prefix %>_production
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../../lib/plutonium_generators"
4
+
5
+ module Pu
6
+ module Service
7
+ class SidekiqGenerator < Rails::Generators::Base
8
+ include PlutoniumGenerators::Generator
9
+
10
+ source_root File.expand_path("templates", __dir__)
11
+
12
+ desc "Set up sidekiq for project"
13
+
14
+ def start
15
+ bundle "sidekiq"
16
+ directory "app"
17
+ directory "config"
18
+
19
+ add_compose_env :REDIS_QUEUE_URL, "redis://redis-queue/0"
20
+ add_required_env_vars :REDIS_QUEUE_URL
21
+ add_compose_dependency redis_service
22
+ add_compose_service service, sidekiq_compose_config
23
+ add_compose_service redis_service, redis_compose_config
24
+ rescue => e
25
+ exception "#{self.class} failed:", e
26
+ end
27
+
28
+ private
29
+
30
+ def service
31
+ :sidekiq
32
+ end
33
+
34
+ def redis_service
35
+ :"redis-queue"
36
+ end
37
+
38
+ def sidekiq_compose_config
39
+ <<~COMPOSE
40
+ sidekiq:
41
+ <<: *app # sidekiq
42
+ command: /bin/sh -c "bundle && sidekiq" # sidekiq
43
+ # sidekiq properties
44
+ COMPOSE
45
+ end
46
+
47
+ def redis_compose_config
48
+ <<~COMPOSE
49
+ redis-queue:
50
+ image: redis # redis-queue
51
+ command: bash -c "redis-server --maxmemory-policy noeviction" # redis-queue
52
+ # redis-queue properties
53
+ COMPOSE
54
+ end
55
+ end
56
+ end
57
+ end
File without changes
@@ -0,0 +1,3 @@
1
+ class SidekiqJob
2
+ include Sidekiq::Job
3
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ redis_config = {
4
+ url: ENV.fetch("REDIS_QUEUE_URL", ""),
5
+ connect_timeout: 1, # Defaults to 1 second
6
+ read_timeout: 0.2, # Defaults to 1 second
7
+ write_timeout: 0.2, # Defaults to 1 second
8
+ # https://github.com/redis/redis-rb#reconnections
9
+ reconnect_attempts: [ # Defaults to 1
10
+ 0, # retry immediately
11
+ 0.25, # retry a second time after 250ms
12
+ 1, # retry a third time after another 1s
13
+ 5, # retry a fourth time after another 5s
14
+ 10 # retry a fifth and final time after another 15s
15
+ ]
16
+ }
17
+
18
+ Sidekiq.configure_client do |config|
19
+ config.redis = redis_config
20
+
21
+ # Configure sidekiq client here
22
+ end
23
+
24
+ Sidekiq.configure_server do |config|
25
+ config.redis = redis_config
26
+ config.logger = Rails.logger = Sidekiq::Logger.new($stdout)
27
+ config.death_handlers << lambda { |job, exception|
28
+ worker = job["wrapped"].safe_constantize
29
+ worker&.sidekiq_retries_exhausted_block&.call(job, exception)
30
+ }
31
+
32
+ if defined?(Prosopite)
33
+ # configure prosopite
34
+ config.server_middleware do |chain|
35
+ require "prosopite/middleware/sidekiq"
36
+ chain.add(Prosopite::Middleware::Sidekiq)
37
+ end
38
+ end
39
+
40
+ # Configure sidekiq server here
41
+ end
42
+
43
+ # Use sidekiq
44
+ Rails.application.config.active_job.queue_adapter = :sidekiq
45
+
46
+ # nil will use the "default" queue
47
+ # some of these options will not work with your Rails version. add/remove as necessary
48
+ Rails.application.config.action_mailer.deliver_later_queue_name = nil if Rails.application.config.respond_to?(:action_mailbox) # defaults to "mailers"
49
+ Rails.application.config.action_mailbox.queues.routing = nil if Rails.application.config.respond_to?(:action_mailbox) # defaults to "action_mailbox_routing"
50
+ Rails.application.config.active_storage.queues.analysis = nil if Rails.application.config.respond_to?(:active_storage) # defaults to "active_storage_analysis"
51
+ Rails.application.config.active_storage.queues.purge = nil if Rails.application.config.respond_to?(:active_storage) # defaults to "active_storage_purge"
52
+ Rails.application.config.active_storage.queues.mirror = nil if Rails.application.config.respond_to?(:active_storage) # defaults to "active_storage_mirror"
53
+ Rails.application.config.active_storage.queues.purge = :low if Rails.application.config.respond_to?(:active_storage) # put purge jobs in the `low` queue
@@ -0,0 +1,6 @@
1
+ ---
2
+ :queues:
3
+ - [critical, 5]
4
+ - [high, 3]
5
+ - [default, 2]
6
+ - [low, 1]
@@ -3,14 +3,7 @@ require "active_model"
3
3
 
4
4
  module Plutonium
5
5
  module Config
6
- mattr_accessor :stylesheet_tag
7
- @@stylesheet_tag = ->(view_context) {
8
- "<link rel=\"stylesheet\" href=\"#{Plutonium.stylesheet_link}\" />"
9
- }
10
-
11
- mattr_accessor :script_tag
12
- @@script_tag = ->(view_context) {
13
- "<script src=\"#{Plutonium.script_link}\"></script>"
14
- }
6
+ mattr_accessor :logo
7
+ @@logo = "plutonium-logo.png"
15
8
  end
16
9
  end
@@ -0,0 +1,28 @@
1
+ module Plutonium
2
+ module Core
3
+ module Associations
4
+ module Renderers
5
+ class BasicRenderer
6
+ attr_reader :name, :label, :reflection, :user_options
7
+
8
+ def initialize(name, label:, reflection:, **user_options)
9
+ @name = name
10
+ @label = label
11
+ @reflection = reflection
12
+ @user_options = user_options
13
+ end
14
+
15
+ def render(view_context, record)
16
+ raise NotImplementedError
17
+ end
18
+
19
+ def options = @options ||= renderer_options.deep_merge(@user_options)
20
+
21
+ private
22
+
23
+ def renderer_options = {}
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,36 @@
1
+ require "simple_form/map_type"
2
+
3
+ module Plutonium
4
+ module Core
5
+ module Associations
6
+ module Renderers
7
+ class Factory
8
+ extend ::SimpleForm::MapType
9
+
10
+ map_type :has_many, to: Plutonium::Core::Associations::Renderers::HasManyRenderer
11
+
12
+ def self.build(name, type:, **)
13
+ mapping = mappings[type]
14
+ raise ArgumentError, "Unknown association renderer type #{type}" unless mapping.present?
15
+
16
+ mapping.new(name, **)
17
+ end
18
+
19
+ def self.for_resource_association(resource_class, attr_name, **options)
20
+ options[:label] ||= resource_class.human_attribute_name(attr_name)
21
+
22
+ association = resource_class.try(:reflect_on_association, attr_name)
23
+ raise ArgumentError, "#{attr_name} is not a valid association of #{resource_class}" unless association.present?
24
+ raise ArgumentError, "#{association.klass} does is not a resource record" unless association.klass.include?(Plutonium::Resource::Record)
25
+
26
+ type = association.macro
27
+ raise NotImplementedError, "#{macro} associations are currently not supported." unless type == :has_many
28
+
29
+ options[:reflection] = association
30
+ build(attr_name, type:, **options)
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,16 @@
1
+ module Plutonium
2
+ module Core
3
+ module Associations
4
+ module Renderers
5
+ class HasManyRenderer < BasicRenderer
6
+ def render(view_context, record)
7
+ view_context.render_component :has_many_panel,
8
+ title: label,
9
+ src: view_context.resource_url_for(reflection.klass, parent: record),
10
+ **options
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,31 @@
1
+ module Plutonium
2
+ module Core
3
+ module Autodiscovery
4
+ module AssociationRendererDiscoverer
5
+ extend ActiveSupport::Concern
6
+ include Discoverer
7
+
8
+ class_methods do
9
+ def autodiscovery_association_renderer_cache = @autodiscovery_association_renderer_cache ||= {}
10
+ end
11
+
12
+ private
13
+
14
+ # If cache_discovery is enabled, use the class level cache that persists
15
+ # between requests, otherwise use the instance one.
16
+ def autodiscovery_association_renderer_cache
17
+ if Rails.application.config.plutonium.cache_discovery
18
+ self.class.autodiscovery_association_renderer_cache
19
+ else
20
+ @autodiscovery_association_renderer_cache ||= {}
21
+ end
22
+ end
23
+
24
+ def autodiscover_association_renderer(name)
25
+ autodiscovery_association_renderer_cache[name] ||=
26
+ Plutonium::Core::Associations::Renderers::Factory.for_resource_association(resource_class, name)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end