plutonium 0.64.0 → 0.65.0

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 (278) hide show
  1. checksums.yaml +4 -4
  2. data/.claude/skills/plutonium/SKILL.md +4 -1
  3. data/.claude/skills/plutonium-app/SKILL.md +14 -0
  4. data/.claude/skills/plutonium-dashboard/SKILL.md +161 -0
  5. data/.claude/skills/plutonium-resource/SKILL.md +94 -14
  6. data/.claude/skills/plutonium-ui/SKILL.md +22 -1
  7. data/CHANGELOG.md +59 -0
  8. data/CLAUDE.md +282 -210
  9. data/SECURITY.md +1 -1
  10. data/app/assets/plutonium-charts.js +20604 -0
  11. data/app/assets/plutonium-charts.js.map +7 -0
  12. data/app/assets/plutonium-charts.min.js +41 -0
  13. data/app/assets/plutonium-charts.min.js.map +7 -0
  14. data/app/assets/plutonium.css +1 -1
  15. data/app/assets/plutonium.js +794 -629
  16. data/app/assets/plutonium.js.map +4 -4
  17. data/app/assets/plutonium.min.js +48 -48
  18. data/app/assets/plutonium.min.js.map +4 -4
  19. data/app/views/plutonium/_flash_alerts.html.erb +2 -2
  20. data/app/views/plutonium/_resource_header.html.erb +2 -2
  21. data/app/views/plutonium/_resource_sidebar.html.erb +11 -2
  22. data/app/views/plutonium/_toast.html.erb +2 -2
  23. data/app/views/rodauth/_login_form.html.erb +1 -1
  24. data/app/views/rodauth/_password_visibility.html.erb +1 -1
  25. data/app/views/rodauth/add_recovery_codes.html.erb +2 -2
  26. data/app/views/rodauth/change_login.html.erb +2 -2
  27. data/app/views/rodauth/create_account.html.erb +4 -4
  28. data/app/views/rodauth/reset_password_request.html.erb +1 -1
  29. data/app/views/rodauth/verify_account_resend.html.erb +1 -1
  30. data/app/views/rodauth/webauthn_remove.html.erb +1 -1
  31. data/config/brakeman.ignore +4 -4
  32. data/config/initializers/rabl.rb +0 -40
  33. data/config/locales/en/api_client.yml +22 -0
  34. data/config/locales/en/async.yml +34 -0
  35. data/config/locales/en/dashboard.yml +25 -0
  36. data/config/locales/en/invites.yml +37 -0
  37. data/config/locales/en/js.yml +40 -0
  38. data/config/locales/en/kanban.yml +28 -0
  39. data/config/locales/en/plutonium.yml +26 -0
  40. data/config/locales/en/positioning.yml +14 -0
  41. data/config/locales/en/profile.yml +29 -0
  42. data/config/locales/en/resource.yml +60 -0
  43. data/config/locales/en/ui.yml +93 -0
  44. data/config/locales/en/wizard.yml +46 -0
  45. data/docs/.vitepress/config.ts +34 -1
  46. data/docs/.vitepress/theme/components/HomeHero.vue +1 -1
  47. data/docs/.vitepress/theme/components/HomeInTheBox.vue +14 -0
  48. data/docs/.vitepress/theme/custom.css +34 -377
  49. data/docs/blog/introducing-plutonium-dashboards.md +175 -0
  50. data/docs/blog/introducing-plutonium-i18n.md +91 -0
  51. data/docs/blog/introducing-plutonium.md +4 -5
  52. data/docs/blog/whats-new-async-kanban-wizards.md +1 -1
  53. data/docs/guides/dashboards.md +300 -0
  54. data/docs/guides/index.md +1 -0
  55. data/docs/guides/kanban.md +2 -2
  56. data/docs/public/images/blog/dashboards-card-error.png +0 -0
  57. data/docs/public/images/blog/dashboards-loading.png +0 -0
  58. data/docs/public/images/blog/dashboards-overview.png +0 -0
  59. data/docs/public/images/blog/dashboards-sidebar.png +0 -0
  60. data/docs/public/images/blog/i18n-es-admin.png +0 -0
  61. data/docs/public/images/guides/dashboard-card-error.png +0 -0
  62. data/docs/public/images/guides/dashboard-loading.png +0 -0
  63. data/docs/public/images/guides/dashboard-overview.png +0 -0
  64. data/docs/public/images/guides/dashboard-sidebar.png +0 -0
  65. data/docs/reference/app/generators.md +2 -2
  66. data/docs/reference/app/portals.md +2 -0
  67. data/docs/reference/configuration.md +84 -27
  68. data/docs/reference/dashboard/dsl.md +123 -0
  69. data/docs/reference/dashboard/index.md +35 -0
  70. data/docs/reference/dashboard/registration.md +76 -0
  71. data/docs/reference/i18n.md +239 -0
  72. data/docs/reference/index.md +10 -1
  73. data/docs/reference/kanban/dsl.md +1 -1
  74. data/docs/reference/kanban/positioning.md +2 -2
  75. data/docs/reference/resource/actions.md +1 -1
  76. data/docs/reference/resource/definition.md +96 -18
  77. data/docs/reference/resource/export.md +5 -1
  78. data/docs/reference/resource/index.md +2 -0
  79. data/docs/reference/{positioning.md → resource/positioning.md} +2 -1
  80. data/docs/reference/resource/query.md +2 -0
  81. data/docs/reference/ui/assets.md +8 -0
  82. data/docs/reference/ui/displays.md +5 -8
  83. data/docs/reference/ui/index.md +1 -1
  84. data/docs/reference/wizard/dsl.md +2 -2
  85. data/esbuild.config.js +5 -2
  86. data/gemfiles/rails_7.gemfile.lock +2 -2
  87. data/gemfiles/rails_8.1.gemfile.lock +1 -1
  88. data/lib/active_model/validations/array_validator.rb +1 -1
  89. data/lib/active_model/validations/attached_validator.rb +1 -1
  90. data/lib/active_model/validations/url_validator.rb +2 -2
  91. data/lib/generators/pu/core/assets/assets_generator.rb +36 -21
  92. data/lib/generators/pu/core/assets/templates/postcss.config.js +1 -1
  93. data/lib/generators/pu/core/update/update_generator.rb +3 -2
  94. data/lib/generators/pu/dashboard/dashboard_generator.rb +96 -0
  95. data/lib/generators/pu/dashboard/templates/dashboard.rb.tt +25 -0
  96. data/lib/generators/pu/docker/install/install_generator.rb +58 -0
  97. data/lib/generators/pu/docker/install/templates/Dockerfile.dev.tt +18 -3
  98. data/lib/generators/pu/docker/install/templates/Dockerfile.tt +20 -5
  99. data/lib/generators/pu/docker/install/templates/{docker-compose.yml → docker-compose.yml.tt} +1 -1
  100. data/lib/generators/pu/gem/dotenv/dotenv_generator.rb +1 -1
  101. data/lib/generators/pu/invites/invitable_generator.rb +18 -1
  102. data/lib/generators/pu/lib/plutonium_generators/concerns/actions.rb +0 -95
  103. data/lib/generators/pu/lib/plutonium_generators/concerns/js_package_manager.rb +146 -0
  104. data/lib/generators/pu/lib/plutonium_generators/generator.rb +1 -17
  105. data/lib/generators/pu/pkg/package/package_generator.rb +1 -0
  106. data/lib/generators/pu/pkg/package/templates/config/locales/en.yml.tt +28 -0
  107. data/lib/generators/pu/pkg/portal/portal_generator.rb +1 -0
  108. data/lib/generators/pu/pkg/portal/templates/config/locales/en.yml.tt +30 -0
  109. data/lib/generators/pu/res/scaffold/scaffold_generator.rb +0 -8
  110. data/lib/generators/pu/rodauth/concerns/feature_selector.rb +0 -18
  111. data/lib/plutonium/action/base.rb +27 -3
  112. data/lib/plutonium/action/interactive.rb +17 -4
  113. data/lib/plutonium/api_client/concerns/create_api_client.rb +12 -11
  114. data/lib/plutonium/api_client/concerns/disable_api_client.rb +3 -3
  115. data/lib/plutonium/auth/sequel_adapter.rb +1 -1
  116. data/lib/plutonium/configuration.rb +5 -0
  117. data/lib/plutonium/core/controller.rb +25 -1
  118. data/lib/plutonium/core/controllers/authorizable.rb +1 -1
  119. data/lib/plutonium/dashboard/base.rb +114 -0
  120. data/lib/plutonium/dashboard/card.rb +200 -0
  121. data/lib/plutonium/dashboard/controller.rb +101 -0
  122. data/lib/plutonium/dashboard/dsl.rb +104 -0
  123. data/lib/plutonium/dashboard/register.rb +40 -0
  124. data/lib/plutonium/dashboard/route_resolution.rb +30 -0
  125. data/lib/plutonium/dashboard.rb +42 -0
  126. data/lib/plutonium/definition/actions.rb +6 -1
  127. data/lib/plutonium/definition/base.rb +41 -3
  128. data/lib/plutonium/definition/index_views.rb +1 -1
  129. data/lib/plutonium/definition/positioning.rb +1 -1
  130. data/lib/plutonium/definition/presentable.rb +2 -2
  131. data/lib/plutonium/helpers/assets_helper.rb +15 -2
  132. data/lib/plutonium/helpers/display_helper.rb +10 -2
  133. data/lib/plutonium/interaction/async/context.rb +6 -8
  134. data/lib/plutonium/interaction/async/executor.rb +6 -7
  135. data/lib/plutonium/interaction/async/run.rb +2 -2
  136. data/lib/plutonium/interaction/async/run_definition.rb +1 -1
  137. data/lib/plutonium/interaction/base.rb +2 -0
  138. data/lib/plutonium/interaction/concerns/dispatchable.rb +15 -3
  139. data/lib/plutonium/invites/concerns/cancel_invite.rb +3 -3
  140. data/lib/plutonium/invites/concerns/invite_token.rb +25 -7
  141. data/lib/plutonium/invites/concerns/invite_user.rb +10 -5
  142. data/lib/plutonium/invites/concerns/resend_invite.rb +4 -4
  143. data/lib/plutonium/invites/controller.rb +11 -11
  144. data/lib/plutonium/kanban/column.rb +13 -3
  145. data/lib/plutonium/kanban/dsl.rb +7 -4
  146. data/lib/plutonium/models/has_cents.rb +1 -1
  147. data/lib/plutonium/profile/security_section.rb +10 -18
  148. data/lib/plutonium/query/filter.rb +10 -1
  149. data/lib/plutonium/query/filters/association.rb +27 -2
  150. data/lib/plutonium/query/filters/boolean.rb +4 -4
  151. data/lib/plutonium/query/filters/date.rb +4 -17
  152. data/lib/plutonium/query/filters/date_range.rb +2 -2
  153. data/lib/plutonium/query/filters/select.rb +10 -1
  154. data/lib/plutonium/query/filters/text.rb +9 -12
  155. data/lib/plutonium/railtie.rb +17 -0
  156. data/lib/plutonium/resource/controller.rb +10 -5
  157. data/lib/plutonium/resource/controllers/crud_actions.rb +17 -20
  158. data/lib/plutonium/resource/controllers/export_csv.rb +19 -9
  159. data/lib/plutonium/resource/controllers/kanban_actions.rb +16 -16
  160. data/lib/plutonium/resource/controllers/position_actions.rb +5 -5
  161. data/lib/plutonium/resource/controllers/typeahead.rb +24 -1
  162. data/lib/plutonium/resource/query_object.rb +30 -3
  163. data/lib/plutonium/routing/dashboard_registration.rb +137 -0
  164. data/lib/plutonium/routing/resource_registration.rb +5 -0
  165. data/lib/plutonium/routing/route_set_extensions.rb +2 -1
  166. data/lib/plutonium/translation.rb +227 -0
  167. data/lib/plutonium/ui/actions_dropdown.rb +2 -2
  168. data/lib/plutonium/ui/breadcrumbs.rb +3 -3
  169. data/lib/plutonium/ui/color_mode_selector.rb +1 -1
  170. data/lib/plutonium/ui/component/behaviour.rb +46 -0
  171. data/lib/plutonium/ui/component/methods.rb +4 -0
  172. data/lib/plutonium/ui/dashboard/board.rb +80 -0
  173. data/lib/plutonium/ui/dashboard/card.rb +127 -0
  174. data/lib/plutonium/ui/dashboard/chart.rb +43 -0
  175. data/lib/plutonium/ui/dashboard/custom.rb +32 -0
  176. data/lib/plutonium/ui/dashboard/frame.rb +25 -0
  177. data/lib/plutonium/ui/dashboard/metric.rb +137 -0
  178. data/lib/plutonium/ui/dashboard/skeleton.rb +40 -0
  179. data/lib/plutonium/ui/display/components/attachment.rb +1 -1
  180. data/lib/plutonium/ui/display/components/badge.rb +7 -1
  181. data/lib/plutonium/ui/display/components/boolean.rb +2 -2
  182. data/lib/plutonium/ui/display/resource.rb +23 -16
  183. data/lib/plutonium/ui/export_button.rb +3 -3
  184. data/lib/plutonium/ui/form/components/key_value_store.rb +5 -5
  185. data/lib/plutonium/ui/form/components/password.rb +2 -2
  186. data/lib/plutonium/ui/form/components/resource_select.rb +27 -0
  187. data/lib/plutonium/ui/form/components/secure_association.rb +2 -0
  188. data/lib/plutonium/ui/form/components/uppy.rb +11 -3
  189. data/lib/plutonium/ui/form/concerns/renders_nested_resource_fields.rb +1 -1
  190. data/lib/plutonium/ui/form/concerns/renders_repeater_row_controls.rb +5 -4
  191. data/lib/plutonium/ui/form/concerns/renders_structured_inputs.rb +1 -1
  192. data/lib/plutonium/ui/form/query.rb +8 -8
  193. data/lib/plutonium/ui/form/resource.rb +54 -26
  194. data/lib/plutonium/ui/frame_navigator_panel.rb +4 -4
  195. data/lib/plutonium/ui/grid/card.rb +3 -3
  196. data/lib/plutonium/ui/grid/resource.rb +3 -3
  197. data/lib/plutonium/ui/interaction/async/run_progress.rb +6 -6
  198. data/lib/plutonium/ui/interaction/async/running_banner.rb +2 -2
  199. data/lib/plutonium/ui/kanban/column.rb +6 -6
  200. data/lib/plutonium/ui/layout/base.rb +19 -1
  201. data/lib/plutonium/ui/layout/header.rb +1 -1
  202. data/lib/plutonium/ui/layout/icon_rail.rb +4 -4
  203. data/lib/plutonium/ui/layout/rodauth_layout.rb +1 -1
  204. data/lib/plutonium/ui/layout/sidebar.rb +1 -1
  205. data/lib/plutonium/ui/layout/topbar.rb +2 -2
  206. data/lib/plutonium/ui/modal/base.rb +4 -4
  207. data/lib/plutonium/ui/nav_grid_menu.rb +1 -1
  208. data/lib/plutonium/ui/nav_user.rb +2 -2
  209. data/lib/plutonium/ui/page/base.rb +10 -2
  210. data/lib/plutonium/ui/page/dashboard.rb +54 -0
  211. data/lib/plutonium/ui/page/edit.rb +3 -3
  212. data/lib/plutonium/ui/page/interactive_action.rb +2 -2
  213. data/lib/plutonium/ui/page/new.rb +3 -3
  214. data/lib/plutonium/ui/page/show.rb +2 -2
  215. data/lib/plutonium/ui/page/wizard.rb +22 -16
  216. data/lib/plutonium/ui/page/wizard_chooser.rb +10 -10
  217. data/lib/plutonium/ui/page/wizard_completed.rb +2 -2
  218. data/lib/plutonium/ui/skeleton_table.rb +1 -1
  219. data/lib/plutonium/ui/table/base.rb +2 -2
  220. data/lib/plutonium/ui/table/components/attachment.rb +1 -1
  221. data/lib/plutonium/ui/table/components/bulk_actions_toolbar.rb +19 -3
  222. data/lib/plutonium/ui/table/components/drag_handle.rb +3 -3
  223. data/lib/plutonium/ui/table/components/filter_form.rb +11 -10
  224. data/lib/plutonium/ui/table/components/filter_pills.rb +4 -4
  225. data/lib/plutonium/ui/table/components/pagy_info.rb +61 -17
  226. data/lib/plutonium/ui/table/components/pagy_pagination.rb +9 -5
  227. data/lib/plutonium/ui/table/components/row_actions_dropdown.rb +1 -1
  228. data/lib/plutonium/ui/table/components/scopes_bar.rb +6 -2
  229. data/lib/plutonium/ui/table/components/scopes_pills.rb +3 -3
  230. data/lib/plutonium/ui/table/components/selection_column.rb +1 -1
  231. data/lib/plutonium/ui/table/components/toolbar.rb +2 -2
  232. data/lib/plutonium/ui/table/components/view_switcher.rb +12 -8
  233. data/lib/plutonium/ui/table/resource.rb +53 -17
  234. data/lib/plutonium/ui/wizard/review.rb +7 -7
  235. data/lib/plutonium/ui/wizard/stepper.rb +1 -1
  236. data/lib/plutonium/ui/wizard/summary_display.rb +6 -0
  237. data/lib/plutonium/version.rb +1 -1
  238. data/lib/plutonium/wizard/base.rb +2 -0
  239. data/lib/plutonium/wizard/driving.rb +8 -2
  240. data/lib/plutonium/wizard/dsl.rb +4 -2
  241. data/lib/plutonium/wizard/field_importer.rb +1 -8
  242. data/lib/plutonium/wizard/review_step.rb +8 -1
  243. data/lib/plutonium/wizard/step.rb +14 -3
  244. data/package.json +4 -2
  245. data/plutonium.gemspec +4 -1
  246. data/postcss-gem-import.cjs +34 -0
  247. data/postcss-gem-import.js +3 -28
  248. data/src/css/components.css +91 -0
  249. data/src/css/slim_select.css +0 -38
  250. data/src/css/tokens.css +24 -0
  251. data/src/js/controllers/attachment_input_controller.js +15 -6
  252. data/src/js/controllers/chart_controller.js +162 -0
  253. data/src/js/controllers/clipboard_controller.js +3 -2
  254. data/src/js/controllers/dirty_form_guard_controller.js +4 -3
  255. data/src/js/controllers/easymde_controller.js +3 -0
  256. data/src/js/controllers/filter_panel_controller.js +15 -6
  257. data/src/js/controllers/flatpickr_controller.js +8 -0
  258. data/src/js/controllers/frame_refresh_controller.js +59 -0
  259. data/src/js/controllers/intl_tel_input_controller.js +5 -0
  260. data/src/js/controllers/register_controllers.js +4 -0
  261. data/src/js/controllers/slim_select_controller.js +79 -176
  262. data/src/js/core.js +9 -1
  263. data/src/js/i18n.js +69 -0
  264. data/src/js/plutonium-charts.js +15 -0
  265. data/src/js/turbo/turbo_confirm.js +5 -3
  266. metadata +64 -16
  267. data/.yarnrc.yml +0 -8
  268. data/config/initializers/hotwire_turbo_monkey_patches.rb +0 -12
  269. data/lib/generators/pu/field/input/input_generator.rb +0 -32
  270. data/lib/generators/pu/field/input/templates/input.rb.tt +0 -15
  271. data/lib/generators/pu/lib/plutonium_generators/concerns/config.rb +0 -39
  272. data/lib/generators/pu/lib/plutonium_generators/concerns/serializer.rb +0 -39
  273. data/lib/generators/pu/lib/plutonium_generators/installer.rb +0 -205
  274. data/lib/generators/pu/res/scaffold/templates/presenter.rb.tt +0 -13
  275. data/lib/generators/pu/res/scaffold/templates/query_object.rb.tt +0 -17
  276. data/public/plutonium-assets/application.js +0 -31419
  277. data/public/plutonium-assets/plutonium.ico +0 -0
  278. data/yarn.lock +0 -6858
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: plutonium
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.64.0
4
+ version: 0.65.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stefan Froelich
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2026-08-22 00:00:00.000000000 Z
10
+ date: 2026-10-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: zeitwerk
@@ -465,6 +465,7 @@ files:
465
465
  - ".claude/skills/plutonium-async-interactions/SKILL.md"
466
466
  - ".claude/skills/plutonium-auth/SKILL.md"
467
467
  - ".claude/skills/plutonium-behavior/SKILL.md"
468
+ - ".claude/skills/plutonium-dashboard/SKILL.md"
468
469
  - ".claude/skills/plutonium-kanban/SKILL.md"
469
470
  - ".claude/skills/plutonium-resource/SKILL.md"
470
471
  - ".claude/skills/plutonium-tenancy/SKILL.md"
@@ -480,7 +481,6 @@ files:
480
481
  - ".vscode/extensions.json"
481
482
  - ".vscode/launch.json"
482
483
  - ".vscode/settings.json"
483
- - ".yarnrc.yml"
484
484
  - Appraisals
485
485
  - CHANGELOG.md
486
486
  - CLAUDE.md
@@ -489,6 +489,10 @@ files:
489
489
  - README.md
490
490
  - Rakefile
491
491
  - SECURITY.md
492
+ - app/assets/plutonium-charts.js
493
+ - app/assets/plutonium-charts.js.map
494
+ - app/assets/plutonium-charts.min.js
495
+ - app/assets/plutonium-charts.min.js.map
492
496
  - app/assets/plutonium.css
493
497
  - app/assets/plutonium.ico
494
498
  - app/assets/plutonium.js
@@ -570,10 +574,21 @@ files:
570
574
  - config.ru
571
575
  - config/brakeman.ignore
572
576
  - config/initializers/action_policy.rb
573
- - config/initializers/hotwire_turbo_monkey_patches.rb
574
577
  - config/initializers/pagy.rb
575
578
  - config/initializers/rabl.rb
576
579
  - config/initializers/sqlite_alias.rb
580
+ - config/locales/en/api_client.yml
581
+ - config/locales/en/async.yml
582
+ - config/locales/en/dashboard.yml
583
+ - config/locales/en/invites.yml
584
+ - config/locales/en/js.yml
585
+ - config/locales/en/kanban.yml
586
+ - config/locales/en/plutonium.yml
587
+ - config/locales/en/positioning.yml
588
+ - config/locales/en/profile.yml
589
+ - config/locales/en/resource.yml
590
+ - config/locales/en/ui.yml
591
+ - config/locales/en/wizard.yml
577
592
  - db/migrate/async_interactions/20260817000001_create_plutonium_async_runs.rb
578
593
  - db/migrate/wizard/20260615000001_create_plutonium_wizard_sessions.rb
579
594
  - docs/.vitepress/config.ts
@@ -598,6 +613,8 @@ files:
598
613
  - docs/blog/half-finished-forms-are-pii.md
599
614
  - docs/blog/index.md
600
615
  - docs/blog/interactions-are-presentation-objects.md
616
+ - docs/blog/introducing-plutonium-dashboards.md
617
+ - docs/blog/introducing-plutonium-i18n.md
601
618
  - docs/blog/introducing-plutonium.md
602
619
  - docs/blog/jobs-are-not-permission-snapshots.md
603
620
  - docs/blog/plutonium-and-ai-agents.md
@@ -621,6 +638,7 @@ files:
621
638
  - docs/guides/creating-packages.md
622
639
  - docs/guides/custom-actions.md
623
640
  - docs/guides/customizing-ui.md
641
+ - docs/guides/dashboards.md
624
642
  - docs/guides/index.md
625
643
  - docs/guides/kanban.md
626
644
  - docs/guides/multi-tenancy.md
@@ -642,8 +660,17 @@ files:
642
660
  - docs/public/favicon-16x16.png
643
661
  - docs/public/favicon-32x32.png
644
662
  - docs/public/favicon.ico
663
+ - docs/public/images/blog/dashboards-card-error.png
664
+ - docs/public/images/blog/dashboards-loading.png
665
+ - docs/public/images/blog/dashboards-overview.png
666
+ - docs/public/images/blog/dashboards-sidebar.png
667
+ - docs/public/images/blog/i18n-es-admin.png
645
668
  - docs/public/images/components/avatar.png
646
669
  - docs/public/images/guides/custom-actions-bulk.png
670
+ - docs/public/images/guides/dashboard-card-error.png
671
+ - docs/public/images/guides/dashboard-loading.png
672
+ - docs/public/images/guides/dashboard-overview.png
673
+ - docs/public/images/guides/dashboard-sidebar.png
647
674
  - docs/public/images/guides/kanban-after-move.png
648
675
  - docs/public/images/guides/kanban-board-light.png
649
676
  - docs/public/images/guides/kanban-board.png
@@ -722,18 +749,22 @@ files:
722
749
  - docs/reference/behavior/interactions.md
723
750
  - docs/reference/behavior/policies.md
724
751
  - docs/reference/configuration.md
752
+ - docs/reference/dashboard/dsl.md
753
+ - docs/reference/dashboard/index.md
754
+ - docs/reference/dashboard/registration.md
725
755
  - docs/reference/generators/lite.md
756
+ - docs/reference/i18n.md
726
757
  - docs/reference/index.md
727
758
  - docs/reference/kanban/authorization.md
728
759
  - docs/reference/kanban/dsl.md
729
760
  - docs/reference/kanban/index.md
730
761
  - docs/reference/kanban/positioning.md
731
- - docs/reference/positioning.md
732
762
  - docs/reference/resource/actions.md
733
763
  - docs/reference/resource/definition.md
734
764
  - docs/reference/resource/export.md
735
765
  - docs/reference/resource/index.md
736
766
  - docs/reference/resource/model.md
767
+ - docs/reference/resource/positioning.md
737
768
  - docs/reference/resource/query.md
738
769
  - docs/reference/tenancy/entity-scoping.md
739
770
  - docs/reference/tenancy/index.md
@@ -844,6 +875,8 @@ files:
844
875
  - lib/generators/pu/core/typespec/templates/model.tsp.tt
845
876
  - lib/generators/pu/core/typespec/typespec_generator.rb
846
877
  - lib/generators/pu/core/update/update_generator.rb
878
+ - lib/generators/pu/dashboard/dashboard_generator.rb
879
+ - lib/generators/pu/dashboard/templates/dashboard.rb.tt
847
880
  - lib/generators/pu/docker/install/install_generator.rb
848
881
  - lib/generators/pu/docker/install/templates/.keep
849
882
  - lib/generators/pu/docker/install/templates/Dockerfile.dev.tt
@@ -851,14 +884,12 @@ files:
851
884
  - lib/generators/pu/docker/install/templates/bin/console
852
885
  - lib/generators/pu/docker/install/templates/bin/restart
853
886
  - lib/generators/pu/docker/install/templates/bin/shell
854
- - lib/generators/pu/docker/install/templates/docker-compose.yml
887
+ - lib/generators/pu/docker/install/templates/docker-compose.yml.tt
855
888
  - lib/generators/pu/eject/layout/layout_generator.rb
856
889
  - lib/generators/pu/eject/shell/shell_generator.rb
857
890
  - lib/generators/pu/extra/colorized_logger/colorized_logger_generator.rb
858
891
  - lib/generators/pu/extra/colorized_logger/templates/config/initializers/colorized_logger.rb
859
- - lib/generators/pu/field/input/input_generator.rb
860
892
  - lib/generators/pu/field/input/templates/.keep
861
- - lib/generators/pu/field/input/templates/input.rb.tt
862
893
  - lib/generators/pu/field/renderer/renderer_generator.rb
863
894
  - lib/generators/pu/field/renderer/templates/.keep
864
895
  - lib/generators/pu/field/renderer/templates/renderer.rb.tt
@@ -912,18 +943,16 @@ files:
912
943
  - lib/generators/pu/lib/plutonium_generators.rb
913
944
  - lib/generators/pu/lib/plutonium_generators/cli.rb
914
945
  - lib/generators/pu/lib/plutonium_generators/concerns/actions.rb
915
- - lib/generators/pu/lib/plutonium_generators/concerns/config.rb
916
946
  - lib/generators/pu/lib/plutonium_generators/concerns/configures_recurring.rb
917
947
  - lib/generators/pu/lib/plutonium_generators/concerns/configures_sqlite.rb
948
+ - lib/generators/pu/lib/plutonium_generators/concerns/js_package_manager.rb
918
949
  - lib/generators/pu/lib/plutonium_generators/concerns/logger.rb
919
950
  - lib/generators/pu/lib/plutonium_generators/concerns/mounts_engines.rb
920
951
  - lib/generators/pu/lib/plutonium_generators/concerns/package_selector.rb
921
952
  - lib/generators/pu/lib/plutonium_generators/concerns/resource_registration.rb
922
953
  - lib/generators/pu/lib/plutonium_generators/concerns/resource_selector.rb
923
954
  - lib/generators/pu/lib/plutonium_generators/concerns/rodauth_redirects.rb
924
- - lib/generators/pu/lib/plutonium_generators/concerns/serializer.rb
925
955
  - lib/generators/pu/lib/plutonium_generators/generator.rb
926
- - lib/generators/pu/lib/plutonium_generators/installer.rb
927
956
  - lib/generators/pu/lib/plutonium_generators/model_generator_base.rb
928
957
  - lib/generators/pu/lib/plutonium_generators/non_interactive_prompt.rb
929
958
  - lib/generators/pu/lite/litestream/litestream_generator.rb
@@ -946,6 +975,7 @@ files:
946
975
  - lib/generators/pu/pkg/package/templates/app/policies/resource_policy.rb.tt
947
976
  - lib/generators/pu/pkg/package/templates/app/presenters/resource_presenter.rb.tt
948
977
  - lib/generators/pu/pkg/package/templates/app/query_objects/resource_query_object.rb.tt
978
+ - lib/generators/pu/pkg/package/templates/config/locales/en.yml.tt
949
979
  - lib/generators/pu/pkg/package/templates/lib/engine.rb.tt
950
980
  - lib/generators/pu/pkg/portal/USAGE
951
981
  - lib/generators/pu/pkg/portal/portal_generator.rb
@@ -959,6 +989,7 @@ files:
959
989
  - lib/generators/pu/pkg/portal/templates/app/query_objects/resource_query_object.rb.tt
960
990
  - lib/generators/pu/pkg/portal/templates/app/views/package/.keep
961
991
  - lib/generators/pu/pkg/portal/templates/app/views/package/dashboard/index.html.erb
992
+ - lib/generators/pu/pkg/portal/templates/config/locales/en.yml.tt
962
993
  - lib/generators/pu/pkg/portal/templates/config/routes.rb.tt
963
994
  - lib/generators/pu/pkg/portal/templates/lib/engine.rb.tt
964
995
  - lib/generators/pu/profile/USAGE
@@ -987,8 +1018,6 @@ files:
987
1018
  - lib/generators/pu/res/scaffold/templates/controller.rb.tt
988
1019
  - lib/generators/pu/res/scaffold/templates/definition.rb.tt
989
1020
  - lib/generators/pu/res/scaffold/templates/policy.rb.tt
990
- - lib/generators/pu/res/scaffold/templates/presenter.rb.tt
991
- - lib/generators/pu/res/scaffold/templates/query_object.rb.tt
992
1021
  - lib/generators/pu/rodauth/account_generator.rb
993
1022
  - lib/generators/pu/rodauth/admin_generator.rb
994
1023
  - lib/generators/pu/rodauth/concerns/account_selector.rb
@@ -1110,6 +1139,13 @@ files:
1110
1139
  - lib/plutonium/core/controllers/authorizable.rb
1111
1140
  - lib/plutonium/core/controllers/bootable.rb
1112
1141
  - lib/plutonium/core/controllers/entity_scoping.rb
1142
+ - lib/plutonium/dashboard.rb
1143
+ - lib/plutonium/dashboard/base.rb
1144
+ - lib/plutonium/dashboard/card.rb
1145
+ - lib/plutonium/dashboard/controller.rb
1146
+ - lib/plutonium/dashboard/dsl.rb
1147
+ - lib/plutonium/dashboard/register.rb
1148
+ - lib/plutonium/dashboard/route_resolution.rb
1113
1149
  - lib/plutonium/definition/actions.rb
1114
1150
  - lib/plutonium/definition/base.rb
1115
1151
  - lib/plutonium/definition/config_attr.rb
@@ -1229,6 +1265,7 @@ files:
1229
1265
  - lib/plutonium/resource/record/routes.rb
1230
1266
  - lib/plutonium/resource/register.rb
1231
1267
  - lib/plutonium/rodauth/controller_methods.rb
1268
+ - lib/plutonium/routing/dashboard_registration.rb
1232
1269
  - lib/plutonium/routing/mapper_extensions.rb
1233
1270
  - lib/plutonium/routing/resource_registration.rb
1234
1271
  - lib/plutonium/routing/route_set_extensions.rb
@@ -1246,6 +1283,7 @@ files:
1246
1283
  - lib/plutonium/testing/resource_interaction.rb
1247
1284
  - lib/plutonium/testing/resource_model.rb
1248
1285
  - lib/plutonium/testing/resource_policy.rb
1286
+ - lib/plutonium/translation.rb
1249
1287
  - lib/plutonium/ui.rb
1250
1288
  - lib/plutonium/ui/action_button.rb
1251
1289
  - lib/plutonium/ui/actions_dropdown.rb
@@ -1262,6 +1300,13 @@ files:
1262
1300
  - lib/plutonium/ui/component/section.rb
1263
1301
  - lib/plutonium/ui/component/tokens.rb
1264
1302
  - lib/plutonium/ui/component_classes.rb
1303
+ - lib/plutonium/ui/dashboard/board.rb
1304
+ - lib/plutonium/ui/dashboard/card.rb
1305
+ - lib/plutonium/ui/dashboard/chart.rb
1306
+ - lib/plutonium/ui/dashboard/custom.rb
1307
+ - lib/plutonium/ui/dashboard/frame.rb
1308
+ - lib/plutonium/ui/dashboard/metric.rb
1309
+ - lib/plutonium/ui/dashboard/skeleton.rb
1265
1310
  - lib/plutonium/ui/display/base.rb
1266
1311
  - lib/plutonium/ui/display/components/association.rb
1267
1312
  - lib/plutonium/ui/display/components/attachment.rb
@@ -1332,6 +1377,7 @@ files:
1332
1377
  - lib/plutonium/ui/nav_user.rb
1333
1378
  - lib/plutonium/ui/options/has_cents_field.rb
1334
1379
  - lib/plutonium/ui/page/base.rb
1380
+ - lib/plutonium/ui/page/dashboard.rb
1335
1381
  - lib/plutonium/ui/page/edit.rb
1336
1382
  - lib/plutonium/ui/page/index.rb
1337
1383
  - lib/plutonium/ui/page/interactive_action.rb
@@ -1407,11 +1453,10 @@ files:
1407
1453
  - package.json
1408
1454
  - plutonium-blog-post.md
1409
1455
  - plutonium.gemspec
1456
+ - postcss-gem-import.cjs
1410
1457
  - postcss-gem-import.js
1411
1458
  - postcss.config.js
1412
1459
  - public/.keep
1413
- - public/plutonium-assets/application.js
1414
- - public/plutonium-assets/plutonium.ico
1415
1460
  - sig/.keep
1416
1461
  - src/.npmignore
1417
1462
  - src/css/components.css
@@ -1430,6 +1475,7 @@ files:
1430
1475
  - src/js/controllers/breadcrumbs_controller.js
1431
1476
  - src/js/controllers/bulk_actions_controller.js
1432
1477
  - src/js/controllers/capture_url_controller.js
1478
+ - src/js/controllers/chart_controller.js
1433
1479
  - src/js/controllers/clipboard_controller.js
1434
1480
  - src/js/controllers/color_mode_controller.js
1435
1481
  - src/js/controllers/currency_input_controller.js
@@ -1439,6 +1485,7 @@ files:
1439
1485
  - src/js/controllers/flatpickr_controller.js
1440
1486
  - src/js/controllers/form_controller.js
1441
1487
  - src/js/controllers/frame_navigator_controller.js
1488
+ - src/js/controllers/frame_refresh_controller.js
1442
1489
  - src/js/controllers/icon_rail_controller.js
1443
1490
  - src/js/controllers/icon_rail_flyout_controller.js
1444
1491
  - src/js/controllers/intl_tel_input_controller.js
@@ -1468,6 +1515,8 @@ files:
1468
1515
  - src/js/controllers/wizard_controller.js
1469
1516
  - src/js/core.js
1470
1517
  - src/js/drag/sortable.js
1518
+ - src/js/i18n.js
1519
+ - src/js/plutonium-charts.js
1471
1520
  - src/js/plutonium.js
1472
1521
  - src/js/support/dom_element.js
1473
1522
  - src/js/support/mime_icon.js
@@ -1478,7 +1527,6 @@ files:
1478
1527
  - src/js/turbo/turbo_frame_monkey_patch.js
1479
1528
  - tailwind.config.js
1480
1529
  - tailwind.options.js
1481
- - yarn.lock
1482
1530
  homepage: https://radioactive-labs.github.io/plutonium-core/
1483
1531
  licenses:
1484
1532
  - MIT
data/.yarnrc.yml DELETED
@@ -1,8 +0,0 @@
1
- approvedGitRepositories:
2
- - "**"
3
-
4
- enableScripts: true
5
-
6
- nodeLinker: node-modules
7
-
8
- npmMinimalAgeGate: 0
@@ -1,12 +0,0 @@
1
- # Work around for https://github.com/hotwired/turbo-rails/issues/512
2
- # When ActionCable is not loaded, Turbo breaks boot
3
- Rails.autoloaders.once.do_not_eager_load("#{Turbo::Engine.root}/app/channels") unless defined?(ActionCable)
4
-
5
- # Work around for https://github.com/hotwired/turbo-rails/issues/535
6
- Rails.application.config.after_initialize do
7
- Turbo::Streams::BroadcastStreamJob.class_eval do
8
- def self.perform_later(stream, content:)
9
- super(stream, content: content.to_str)
10
- end
11
- end
12
- end
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "../../lib/plutonium_generators"
4
-
5
- module Pu
6
- module Field
7
- class InputGenerator < Rails::Generators::Base
8
- include PlutoniumGenerators::Generator
9
-
10
- source_root File.expand_path("templates", __dir__)
11
-
12
- desc "Generates a field input"
13
-
14
- argument :name
15
-
16
- def start
17
- in_root do
18
- template "input.rb", "app/plutonium/fields/inputs/#{name.underscore}_input.rb"
19
- insert_into_file "config/initializers/plutonium.rb", registration_statement, after: /.*# Register components here.*\n/
20
- end
21
- rescue => e
22
- exception "#{self.class} failed:", e
23
- end
24
-
25
- private
26
-
27
- def registration_statement
28
- indent "Plutonium::Core::Fields::Inputs::Factory.map_type :#{name.underscore}, to: Fields::Inputs::#{name.camelize}Input\n", 2
29
- end
30
- end
31
- end
32
- end
@@ -1,15 +0,0 @@
1
- module Fields
2
- module Inputs
3
- class <%= name.camelize %>Input < Plutonium::Core::Fields::Inputs::Base
4
- def render
5
- form.input name, **options
6
- end
7
-
8
- private
9
-
10
- def input_options
11
- {}
12
- end
13
- end
14
- end
15
- end
@@ -1,39 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "yaml"
4
-
5
- module PlutoniumGenerators
6
- module Concerns
7
- module Config
8
- def write_config(scope, **kwargs)
9
- write_config! config.deep_merge({scope => kwargs})
10
- end
11
-
12
- def read_config(scope, key, default: nil)
13
- config.dig(scope, key) || default
14
- end
15
-
16
- private
17
-
18
- def config
19
- in_root do
20
- if File.exist? config_filename
21
- YAML.load_file(config_filename, permitted_classes: [Regexp, Symbol]) || {}
22
- else
23
- {}
24
- end
25
- end
26
- end
27
-
28
- def write_config!(config)
29
- in_root do
30
- File.write(config_filename, YAML.dump(config))
31
- end
32
- end
33
-
34
- def config_filename
35
- ".pu"
36
- end
37
- end
38
- end
39
- end
@@ -1,39 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module PlutoniumGenerators
4
- module Concerns
5
- module Serializer
6
- private
7
-
8
- def serialize_value(value)
9
- case value
10
- when Symbol
11
- ":#{value}"
12
- when String
13
- serialize_string value
14
- when Integer, Float, BigDecimal
15
- serialize_number value
16
- when Enumerable
17
- serialize_enumerable value
18
- when nil
19
- "nil"
20
- else
21
- # debug "Unable to serialize a value '#{value}:#{value.class}'"
22
- value
23
- end
24
- end
25
-
26
- def serialize_string(value)
27
- "'#{value.gsub("'", "\\\\'")}'"
28
- end
29
-
30
- def serialize_number(num)
31
- num.to_s.gsub(/(\d)(?=(\d\d\d)+(?!\d))/, '\\1_')
32
- end
33
-
34
- def serialize_enumerable(enum)
35
- "[#{enum.entries.map { |val| serialize_value val }.join ", "}]"
36
- end
37
- end
38
- end
39
- end
@@ -1,205 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "semantic_range"
4
- require "yaml"
5
-
6
- module PlutoniumGenerators
7
- module Installer
8
- def self.included(base)
9
- base.send :source_root, File.expand_path("lib/generators/pu/setup/_templates", PlutoniumGenerators::ROOT_DIR)
10
-
11
- base.send :class_option, :interactive, type: :boolean, desc: "Show prompts. Default: true"
12
- base.send :class_option, :bundle, type: :boolean, desc: "Run bundle after setup. Default: true"
13
- base.send :class_option, :lint, type: :boolean, desc: "Run linter after generation. Default: false"
14
- base.send :class_option, :pug_id, type: :numeric, default: 0,
15
- desc: "Used internally by plutonium generators. " \
16
- "Do not set this value as it might lead to unspecified behaviour."
17
- base.send :class_option, :force, type: :boolean, default: false,
18
- desc: "Force installation even if it have been previously installed."
19
- end
20
-
21
- protected
22
-
23
- def install!(feature)
24
- # set_ruby_version! if root_pug?
25
-
26
- from_version = read_config(:installed, feature, default: "0.0.0")
27
- versions = methods.map do |m|
28
- m.to_s.match(/install_v([\d_]+)/)&.[](1)&.tr("_", ".")
29
- end
30
- versions = versions.select do |version|
31
- force? || SemanticRange.satisfies?(version, ">#{from_version}")
32
- end.compact.sort
33
-
34
- if versions.any?
35
- versions.each do |version|
36
- log :install!, "#{feature} v#{version}"
37
- send :"install_v#{version.tr(".", "_")}!"
38
- end
39
-
40
- installed_version = versions.last
41
- write_config :installed, feature => installed_version
42
-
43
- if root_pug?
44
- if bundle?
45
- bundle!
46
- # run last minute bundle changes
47
- bundle! false
48
- end
49
-
50
- begin
51
- log :rubocop, "autocorrect"
52
- run_eval "bundle exec standardrb --fix"
53
- rescue
54
- # Do nothing
55
- end
56
-
57
- success "Successfully installed #{feature} v#{installed_version}"
58
- end
59
- else
60
- debug "Skipping installation of #{feature}. No new versions since v#{from_version}."
61
- end
62
- rescue => e
63
- exception "#{self.class.desc} failed:", e
64
- end
65
-
66
- def add_gem(name, **)
67
- log :add_gem, name
68
- before_bundle(:gem, name, **)
69
- end
70
-
71
- def rubocop(library = nil)
72
- log :rubocop, "install #{library}"
73
-
74
- add_gem "rubocop", group: :development, require: false
75
-
76
- in_root do
77
- rubocop_file = ".rubocop.yml"
78
- if File.exist?(rubocop_file)
79
- rubocop_def = YAML.load_file(rubocop_file)
80
- rubocop_def["require"] ||= []
81
- else
82
- rubocop_def = {
83
- "require" => [],
84
- "Style/FrozenStringLiteralComment" => {"SafeAutoCorrect" => true},
85
- "Style/ClassAndModuleChildren" => {"SafeAutoCorrect" => true}
86
- }
87
- end
88
-
89
- if library.present?
90
- library = "rubocop-#{library}"
91
- add_gem library, group: :development, require: false
92
- rubocop_def["require"] << library
93
- end
94
-
95
- rubocop_def["require"].uniq!
96
- create_file rubocop_file, YAML.dump(rubocop_def), force: true, verbose: false
97
- end
98
- end
99
-
100
- def after_bundle(command, *args, **kwargs)
101
- add_task_after(:bundle, [command, args, kwargs])
102
- end
103
-
104
- def before_bundle(command, *args, **kwargs)
105
- add_task_before(:bundle, [command, args, kwargs])
106
- end
107
-
108
- def yes?(statement, color = nil)
109
- !interactive? || super
110
- end
111
-
112
- def interactive?
113
- options[:interactive] != false
114
- end
115
-
116
- def bundle?
117
- options[:bundle] != false
118
- end
119
-
120
- def lint?
121
- options[:lint] == true
122
- end
123
-
124
- def pug(command)
125
- args = options.slice("lint", "interactive").map { |k, v| "--#{k} #{v}" }.join " "
126
- generate "pu:#{command} --pug-id=#{depth + 1} --force=#{force?} #{args}"
127
- end
128
-
129
- private
130
-
131
- def bundle!(run_tasks = true)
132
- log :bundle, "install"
133
-
134
- execute_tasks_before! :bundle if run_tasks
135
- Bundler.with_unbundled_env do
136
- run "bundle install", verbose: false
137
- end
138
- execute_tasks_after! :bundle if run_tasks
139
- end
140
-
141
- def add_task(event, action, task)
142
- log :add_task, "#{event} #{action}: #{task}"
143
-
144
- key = :"tasks_#{event}"
145
- tasks = read_config(key, action, default: [])
146
- tasks << task
147
- write_config(key, action => tasks)
148
- end
149
-
150
- def execute_tasks!(event, action)
151
- log :execute_tasks!, "#{event} #{action}"
152
-
153
- key = :"tasks_#{event}"
154
- tasks = read_config(key, action, default: [])
155
- tasks.each do |a|
156
- task = a[0]
157
- args = a[1] || []
158
- kwargs = a[2] || {}
159
-
160
- log :execute_task, "#{event} #{action}: #{task}"
161
- send task, *args, **kwargs
162
- end
163
-
164
- write_config(key, action => [])
165
- end
166
-
167
- def add_task_before(action, task)
168
- add_task :before, action, task
169
- end
170
-
171
- def add_task_after(action, task)
172
- add_task :after, action, task
173
- end
174
-
175
- def execute_tasks_before!(action)
176
- execute_tasks! :before, action
177
- end
178
-
179
- def execute_tasks_after!(action)
180
- execute_tasks! :after, action
181
- end
182
-
183
- def depth
184
- options[:pug_id]
185
- end
186
-
187
- def force?
188
- options[:force]
189
- end
190
-
191
- def root_pug?
192
- depth == 0
193
- end
194
-
195
- # def process(cmd)
196
- # stdout, stderr, status = Open3.capture3(cmd + ";")
197
- # case status.exitstatus
198
- # when 0
199
- # stdout
200
- # else
201
- # raise stderr
202
- # end
203
- # end
204
- end
205
- end
@@ -1,13 +0,0 @@
1
- <% module_namespacing do -%>
2
- class <%= class_name %>Presenter < <%= [feature_package_name, "ResourcePresenter"].join "::" %>
3
- private
4
-
5
- def define_fields
6
- # custom field definitions
7
- end
8
-
9
- def define_actions
10
- # custom action definitions
11
- end
12
- end
13
- <% end -%>
@@ -1,17 +0,0 @@
1
- <% module_namespacing do -%>
2
- class <%= class_name %>QueryObject < <%= [feature_package_name, "ResourceQueryObject"].join "::" %>
3
- private
4
-
5
- def define_filters
6
- # define custom filters
7
- end
8
-
9
- def define_scopes
10
- # define custom scopes
11
- end
12
-
13
- def define_sorters
14
- # define custom sorters
15
- end
16
- end
17
- <% end -%>