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.
- checksums.yaml +4 -4
- data/.claude/skills/plutonium/SKILL.md +4 -1
- data/.claude/skills/plutonium-app/SKILL.md +14 -0
- data/.claude/skills/plutonium-dashboard/SKILL.md +161 -0
- data/.claude/skills/plutonium-resource/SKILL.md +94 -14
- data/.claude/skills/plutonium-ui/SKILL.md +22 -1
- data/CHANGELOG.md +59 -0
- data/CLAUDE.md +282 -210
- data/SECURITY.md +1 -1
- data/app/assets/plutonium-charts.js +20604 -0
- data/app/assets/plutonium-charts.js.map +7 -0
- data/app/assets/plutonium-charts.min.js +41 -0
- data/app/assets/plutonium-charts.min.js.map +7 -0
- data/app/assets/plutonium.css +1 -1
- data/app/assets/plutonium.js +794 -629
- data/app/assets/plutonium.js.map +4 -4
- data/app/assets/plutonium.min.js +48 -48
- data/app/assets/plutonium.min.js.map +4 -4
- data/app/views/plutonium/_flash_alerts.html.erb +2 -2
- data/app/views/plutonium/_resource_header.html.erb +2 -2
- data/app/views/plutonium/_resource_sidebar.html.erb +11 -2
- data/app/views/plutonium/_toast.html.erb +2 -2
- data/app/views/rodauth/_login_form.html.erb +1 -1
- data/app/views/rodauth/_password_visibility.html.erb +1 -1
- data/app/views/rodauth/add_recovery_codes.html.erb +2 -2
- data/app/views/rodauth/change_login.html.erb +2 -2
- data/app/views/rodauth/create_account.html.erb +4 -4
- data/app/views/rodauth/reset_password_request.html.erb +1 -1
- data/app/views/rodauth/verify_account_resend.html.erb +1 -1
- data/app/views/rodauth/webauthn_remove.html.erb +1 -1
- data/config/brakeman.ignore +4 -4
- data/config/initializers/rabl.rb +0 -40
- data/config/locales/en/api_client.yml +22 -0
- data/config/locales/en/async.yml +34 -0
- data/config/locales/en/dashboard.yml +25 -0
- data/config/locales/en/invites.yml +37 -0
- data/config/locales/en/js.yml +40 -0
- data/config/locales/en/kanban.yml +28 -0
- data/config/locales/en/plutonium.yml +26 -0
- data/config/locales/en/positioning.yml +14 -0
- data/config/locales/en/profile.yml +29 -0
- data/config/locales/en/resource.yml +60 -0
- data/config/locales/en/ui.yml +93 -0
- data/config/locales/en/wizard.yml +46 -0
- data/docs/.vitepress/config.ts +34 -1
- data/docs/.vitepress/theme/components/HomeHero.vue +1 -1
- data/docs/.vitepress/theme/components/HomeInTheBox.vue +14 -0
- data/docs/.vitepress/theme/custom.css +34 -377
- data/docs/blog/introducing-plutonium-dashboards.md +175 -0
- data/docs/blog/introducing-plutonium-i18n.md +91 -0
- data/docs/blog/introducing-plutonium.md +4 -5
- data/docs/blog/whats-new-async-kanban-wizards.md +1 -1
- data/docs/guides/dashboards.md +300 -0
- data/docs/guides/index.md +1 -0
- data/docs/guides/kanban.md +2 -2
- data/docs/public/images/blog/dashboards-card-error.png +0 -0
- data/docs/public/images/blog/dashboards-loading.png +0 -0
- data/docs/public/images/blog/dashboards-overview.png +0 -0
- data/docs/public/images/blog/dashboards-sidebar.png +0 -0
- data/docs/public/images/blog/i18n-es-admin.png +0 -0
- data/docs/public/images/guides/dashboard-card-error.png +0 -0
- data/docs/public/images/guides/dashboard-loading.png +0 -0
- data/docs/public/images/guides/dashboard-overview.png +0 -0
- data/docs/public/images/guides/dashboard-sidebar.png +0 -0
- data/docs/reference/app/generators.md +2 -2
- data/docs/reference/app/portals.md +2 -0
- data/docs/reference/configuration.md +84 -27
- data/docs/reference/dashboard/dsl.md +123 -0
- data/docs/reference/dashboard/index.md +35 -0
- data/docs/reference/dashboard/registration.md +76 -0
- data/docs/reference/i18n.md +239 -0
- data/docs/reference/index.md +10 -1
- data/docs/reference/kanban/dsl.md +1 -1
- data/docs/reference/kanban/positioning.md +2 -2
- data/docs/reference/resource/actions.md +1 -1
- data/docs/reference/resource/definition.md +96 -18
- data/docs/reference/resource/export.md +5 -1
- data/docs/reference/resource/index.md +2 -0
- data/docs/reference/{positioning.md → resource/positioning.md} +2 -1
- data/docs/reference/resource/query.md +2 -0
- data/docs/reference/ui/assets.md +8 -0
- data/docs/reference/ui/displays.md +5 -8
- data/docs/reference/ui/index.md +1 -1
- data/docs/reference/wizard/dsl.md +2 -2
- data/esbuild.config.js +5 -2
- data/gemfiles/rails_7.gemfile.lock +2 -2
- data/gemfiles/rails_8.1.gemfile.lock +1 -1
- data/lib/active_model/validations/array_validator.rb +1 -1
- data/lib/active_model/validations/attached_validator.rb +1 -1
- data/lib/active_model/validations/url_validator.rb +2 -2
- data/lib/generators/pu/core/assets/assets_generator.rb +36 -21
- data/lib/generators/pu/core/assets/templates/postcss.config.js +1 -1
- data/lib/generators/pu/core/update/update_generator.rb +3 -2
- data/lib/generators/pu/dashboard/dashboard_generator.rb +96 -0
- data/lib/generators/pu/dashboard/templates/dashboard.rb.tt +25 -0
- data/lib/generators/pu/docker/install/install_generator.rb +58 -0
- data/lib/generators/pu/docker/install/templates/Dockerfile.dev.tt +18 -3
- data/lib/generators/pu/docker/install/templates/Dockerfile.tt +20 -5
- data/lib/generators/pu/docker/install/templates/{docker-compose.yml → docker-compose.yml.tt} +1 -1
- data/lib/generators/pu/gem/dotenv/dotenv_generator.rb +1 -1
- data/lib/generators/pu/invites/invitable_generator.rb +18 -1
- data/lib/generators/pu/lib/plutonium_generators/concerns/actions.rb +0 -95
- data/lib/generators/pu/lib/plutonium_generators/concerns/js_package_manager.rb +146 -0
- data/lib/generators/pu/lib/plutonium_generators/generator.rb +1 -17
- data/lib/generators/pu/pkg/package/package_generator.rb +1 -0
- data/lib/generators/pu/pkg/package/templates/config/locales/en.yml.tt +28 -0
- data/lib/generators/pu/pkg/portal/portal_generator.rb +1 -0
- data/lib/generators/pu/pkg/portal/templates/config/locales/en.yml.tt +30 -0
- data/lib/generators/pu/res/scaffold/scaffold_generator.rb +0 -8
- data/lib/generators/pu/rodauth/concerns/feature_selector.rb +0 -18
- data/lib/plutonium/action/base.rb +27 -3
- data/lib/plutonium/action/interactive.rb +17 -4
- data/lib/plutonium/api_client/concerns/create_api_client.rb +12 -11
- data/lib/plutonium/api_client/concerns/disable_api_client.rb +3 -3
- data/lib/plutonium/auth/sequel_adapter.rb +1 -1
- data/lib/plutonium/configuration.rb +5 -0
- data/lib/plutonium/core/controller.rb +25 -1
- data/lib/plutonium/core/controllers/authorizable.rb +1 -1
- data/lib/plutonium/dashboard/base.rb +114 -0
- data/lib/plutonium/dashboard/card.rb +200 -0
- data/lib/plutonium/dashboard/controller.rb +101 -0
- data/lib/plutonium/dashboard/dsl.rb +104 -0
- data/lib/plutonium/dashboard/register.rb +40 -0
- data/lib/plutonium/dashboard/route_resolution.rb +30 -0
- data/lib/plutonium/dashboard.rb +42 -0
- data/lib/plutonium/definition/actions.rb +6 -1
- data/lib/plutonium/definition/base.rb +41 -3
- data/lib/plutonium/definition/index_views.rb +1 -1
- data/lib/plutonium/definition/positioning.rb +1 -1
- data/lib/plutonium/definition/presentable.rb +2 -2
- data/lib/plutonium/helpers/assets_helper.rb +15 -2
- data/lib/plutonium/helpers/display_helper.rb +10 -2
- data/lib/plutonium/interaction/async/context.rb +6 -8
- data/lib/plutonium/interaction/async/executor.rb +6 -7
- data/lib/plutonium/interaction/async/run.rb +2 -2
- data/lib/plutonium/interaction/async/run_definition.rb +1 -1
- data/lib/plutonium/interaction/base.rb +2 -0
- data/lib/plutonium/interaction/concerns/dispatchable.rb +15 -3
- data/lib/plutonium/invites/concerns/cancel_invite.rb +3 -3
- data/lib/plutonium/invites/concerns/invite_token.rb +25 -7
- data/lib/plutonium/invites/concerns/invite_user.rb +10 -5
- data/lib/plutonium/invites/concerns/resend_invite.rb +4 -4
- data/lib/plutonium/invites/controller.rb +11 -11
- data/lib/plutonium/kanban/column.rb +13 -3
- data/lib/plutonium/kanban/dsl.rb +7 -4
- data/lib/plutonium/models/has_cents.rb +1 -1
- data/lib/plutonium/profile/security_section.rb +10 -18
- data/lib/plutonium/query/filter.rb +10 -1
- data/lib/plutonium/query/filters/association.rb +27 -2
- data/lib/plutonium/query/filters/boolean.rb +4 -4
- data/lib/plutonium/query/filters/date.rb +4 -17
- data/lib/plutonium/query/filters/date_range.rb +2 -2
- data/lib/plutonium/query/filters/select.rb +10 -1
- data/lib/plutonium/query/filters/text.rb +9 -12
- data/lib/plutonium/railtie.rb +17 -0
- data/lib/plutonium/resource/controller.rb +10 -5
- data/lib/plutonium/resource/controllers/crud_actions.rb +17 -20
- data/lib/plutonium/resource/controllers/export_csv.rb +19 -9
- data/lib/plutonium/resource/controllers/kanban_actions.rb +16 -16
- data/lib/plutonium/resource/controllers/position_actions.rb +5 -5
- data/lib/plutonium/resource/controllers/typeahead.rb +24 -1
- data/lib/plutonium/resource/query_object.rb +30 -3
- data/lib/plutonium/routing/dashboard_registration.rb +137 -0
- data/lib/plutonium/routing/resource_registration.rb +5 -0
- data/lib/plutonium/routing/route_set_extensions.rb +2 -1
- data/lib/plutonium/translation.rb +227 -0
- data/lib/plutonium/ui/actions_dropdown.rb +2 -2
- data/lib/plutonium/ui/breadcrumbs.rb +3 -3
- data/lib/plutonium/ui/color_mode_selector.rb +1 -1
- data/lib/plutonium/ui/component/behaviour.rb +46 -0
- data/lib/plutonium/ui/component/methods.rb +4 -0
- data/lib/plutonium/ui/dashboard/board.rb +80 -0
- data/lib/plutonium/ui/dashboard/card.rb +127 -0
- data/lib/plutonium/ui/dashboard/chart.rb +43 -0
- data/lib/plutonium/ui/dashboard/custom.rb +32 -0
- data/lib/plutonium/ui/dashboard/frame.rb +25 -0
- data/lib/plutonium/ui/dashboard/metric.rb +137 -0
- data/lib/plutonium/ui/dashboard/skeleton.rb +40 -0
- data/lib/plutonium/ui/display/components/attachment.rb +1 -1
- data/lib/plutonium/ui/display/components/badge.rb +7 -1
- data/lib/plutonium/ui/display/components/boolean.rb +2 -2
- data/lib/plutonium/ui/display/resource.rb +23 -16
- data/lib/plutonium/ui/export_button.rb +3 -3
- data/lib/plutonium/ui/form/components/key_value_store.rb +5 -5
- data/lib/plutonium/ui/form/components/password.rb +2 -2
- data/lib/plutonium/ui/form/components/resource_select.rb +27 -0
- data/lib/plutonium/ui/form/components/secure_association.rb +2 -0
- data/lib/plutonium/ui/form/components/uppy.rb +11 -3
- data/lib/plutonium/ui/form/concerns/renders_nested_resource_fields.rb +1 -1
- data/lib/plutonium/ui/form/concerns/renders_repeater_row_controls.rb +5 -4
- data/lib/plutonium/ui/form/concerns/renders_structured_inputs.rb +1 -1
- data/lib/plutonium/ui/form/query.rb +8 -8
- data/lib/plutonium/ui/form/resource.rb +54 -26
- data/lib/plutonium/ui/frame_navigator_panel.rb +4 -4
- data/lib/plutonium/ui/grid/card.rb +3 -3
- data/lib/plutonium/ui/grid/resource.rb +3 -3
- data/lib/plutonium/ui/interaction/async/run_progress.rb +6 -6
- data/lib/plutonium/ui/interaction/async/running_banner.rb +2 -2
- data/lib/plutonium/ui/kanban/column.rb +6 -6
- data/lib/plutonium/ui/layout/base.rb +19 -1
- data/lib/plutonium/ui/layout/header.rb +1 -1
- data/lib/plutonium/ui/layout/icon_rail.rb +4 -4
- data/lib/plutonium/ui/layout/rodauth_layout.rb +1 -1
- data/lib/plutonium/ui/layout/sidebar.rb +1 -1
- data/lib/plutonium/ui/layout/topbar.rb +2 -2
- data/lib/plutonium/ui/modal/base.rb +4 -4
- data/lib/plutonium/ui/nav_grid_menu.rb +1 -1
- data/lib/plutonium/ui/nav_user.rb +2 -2
- data/lib/plutonium/ui/page/base.rb +10 -2
- data/lib/plutonium/ui/page/dashboard.rb +54 -0
- data/lib/plutonium/ui/page/edit.rb +3 -3
- data/lib/plutonium/ui/page/interactive_action.rb +2 -2
- data/lib/plutonium/ui/page/new.rb +3 -3
- data/lib/plutonium/ui/page/show.rb +2 -2
- data/lib/plutonium/ui/page/wizard.rb +22 -16
- data/lib/plutonium/ui/page/wizard_chooser.rb +10 -10
- data/lib/plutonium/ui/page/wizard_completed.rb +2 -2
- data/lib/plutonium/ui/skeleton_table.rb +1 -1
- data/lib/plutonium/ui/table/base.rb +2 -2
- data/lib/plutonium/ui/table/components/attachment.rb +1 -1
- data/lib/plutonium/ui/table/components/bulk_actions_toolbar.rb +19 -3
- data/lib/plutonium/ui/table/components/drag_handle.rb +3 -3
- data/lib/plutonium/ui/table/components/filter_form.rb +11 -10
- data/lib/plutonium/ui/table/components/filter_pills.rb +4 -4
- data/lib/plutonium/ui/table/components/pagy_info.rb +61 -17
- data/lib/plutonium/ui/table/components/pagy_pagination.rb +9 -5
- data/lib/plutonium/ui/table/components/row_actions_dropdown.rb +1 -1
- data/lib/plutonium/ui/table/components/scopes_bar.rb +6 -2
- data/lib/plutonium/ui/table/components/scopes_pills.rb +3 -3
- data/lib/plutonium/ui/table/components/selection_column.rb +1 -1
- data/lib/plutonium/ui/table/components/toolbar.rb +2 -2
- data/lib/plutonium/ui/table/components/view_switcher.rb +12 -8
- data/lib/plutonium/ui/table/resource.rb +53 -17
- data/lib/plutonium/ui/wizard/review.rb +7 -7
- data/lib/plutonium/ui/wizard/stepper.rb +1 -1
- data/lib/plutonium/ui/wizard/summary_display.rb +6 -0
- data/lib/plutonium/version.rb +1 -1
- data/lib/plutonium/wizard/base.rb +2 -0
- data/lib/plutonium/wizard/driving.rb +8 -2
- data/lib/plutonium/wizard/dsl.rb +4 -2
- data/lib/plutonium/wizard/field_importer.rb +1 -8
- data/lib/plutonium/wizard/review_step.rb +8 -1
- data/lib/plutonium/wizard/step.rb +14 -3
- data/package.json +4 -2
- data/plutonium.gemspec +4 -1
- data/postcss-gem-import.cjs +34 -0
- data/postcss-gem-import.js +3 -28
- data/src/css/components.css +91 -0
- data/src/css/slim_select.css +0 -38
- data/src/css/tokens.css +24 -0
- data/src/js/controllers/attachment_input_controller.js +15 -6
- data/src/js/controllers/chart_controller.js +162 -0
- data/src/js/controllers/clipboard_controller.js +3 -2
- data/src/js/controllers/dirty_form_guard_controller.js +4 -3
- data/src/js/controllers/easymde_controller.js +3 -0
- data/src/js/controllers/filter_panel_controller.js +15 -6
- data/src/js/controllers/flatpickr_controller.js +8 -0
- data/src/js/controllers/frame_refresh_controller.js +59 -0
- data/src/js/controllers/intl_tel_input_controller.js +5 -0
- data/src/js/controllers/register_controllers.js +4 -0
- data/src/js/controllers/slim_select_controller.js +79 -176
- data/src/js/core.js +9 -1
- data/src/js/i18n.js +69 -0
- data/src/js/plutonium-charts.js +15 -0
- data/src/js/turbo/turbo_confirm.js +5 -3
- metadata +64 -16
- data/.yarnrc.yml +0 -8
- data/config/initializers/hotwire_turbo_monkey_patches.rb +0 -12
- data/lib/generators/pu/field/input/input_generator.rb +0 -32
- data/lib/generators/pu/field/input/templates/input.rb.tt +0 -15
- data/lib/generators/pu/lib/plutonium_generators/concerns/config.rb +0 -39
- data/lib/generators/pu/lib/plutonium_generators/concerns/serializer.rb +0 -39
- data/lib/generators/pu/lib/plutonium_generators/installer.rb +0 -205
- data/lib/generators/pu/res/scaffold/templates/presenter.rb.tt +0 -13
- data/lib/generators/pu/res/scaffold/templates/query_object.rb.tt +0 -17
- data/public/plutonium-assets/application.js +0 -31419
- data/public/plutonium-assets/plutonium.ico +0 -0
- data/yarn.lock +0 -6858
|
@@ -36,8 +36,8 @@
|
|
|
36
36
|
<button type="button"
|
|
37
37
|
class="pu-alert-close"
|
|
38
38
|
data-action="click->resource-dismiss#dismiss"
|
|
39
|
-
aria-label="
|
|
40
|
-
<span class="sr-only"
|
|
39
|
+
aria-label="<%= t("plutonium.resource.flash.close") %>">
|
|
40
|
+
<span class="sr-only"><%= t("plutonium.resource.flash.close") %></span>
|
|
41
41
|
<svg class="w-3 h-3" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 14 14">
|
|
42
42
|
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 6 6m0 0 6 6M7 7l6-6M7 7l-6 6"/>
|
|
43
43
|
</svg>
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
) do |nav|
|
|
13
13
|
if try(:profile_url)
|
|
14
14
|
nav.with_section do |section|
|
|
15
|
-
section.with_link(label: "
|
|
15
|
+
section.with_link(label: t("plutonium.resource.nav.profile"), href: profile_url) do |link|
|
|
16
16
|
link.with_leading do
|
|
17
17
|
render Phlex::TablerIcons::User.new(class: "mr-2 text-gray-400 w-4 h-4")
|
|
18
18
|
end
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
end
|
|
22
22
|
|
|
23
23
|
nav.with_section do |section|
|
|
24
|
-
section.with_link(label: "
|
|
24
|
+
section.with_link(label: t("plutonium.resource.nav.sign_out"), href: try(:logout_url) || "#", class: "rounded-b-lg", data: {turbo: false})
|
|
25
25
|
end
|
|
26
26
|
end
|
|
27
27
|
%>
|
|
@@ -1,8 +1,17 @@
|
|
|
1
1
|
<%= render Plutonium::UI::Layout::IconRail.new(
|
|
2
2
|
menu: Phlexi::Menu::Builder.new do |m|
|
|
3
|
-
m.item "
|
|
3
|
+
m.item t("plutonium.resource.nav.home"), url: root_path, icon: Phlex::TablerIcons::Home
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
dashboards = registered_dashboards.reject { |dashboard| dashboard_path_for(dashboard) == root_path }
|
|
6
|
+
if dashboards.any?
|
|
7
|
+
m.item t("plutonium.resource.nav.dashboards"), icon: Phlex::TablerIcons::LayoutDashboard do |n|
|
|
8
|
+
dashboards.each do |dashboard|
|
|
9
|
+
n.item dashboard.label, url: dashboard_path_for(dashboard), icon: dashboard.icon
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
m.item t("plutonium.resource.nav.resources"), icon: Phlex::TablerIcons::GridDots do |n|
|
|
6
15
|
registered_resources.each do |resource|
|
|
7
16
|
n.item resource_label(resource), url: resource_url_for(resource, parent: nil)
|
|
8
17
|
end
|
|
@@ -43,8 +43,8 @@
|
|
|
43
43
|
<button type="button"
|
|
44
44
|
class="pu-toast-close"
|
|
45
45
|
data-action="click->resource-dismiss#dismiss"
|
|
46
|
-
aria-label="
|
|
47
|
-
<span class="sr-only"
|
|
46
|
+
aria-label="<%= t("plutonium.resource.flash.close") %>">
|
|
47
|
+
<span class="sr-only"><%= t("plutonium.resource.flash.close") %></span>
|
|
48
48
|
<svg class="w-3 h-3" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 14 14">
|
|
49
49
|
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 6 6m0 0 6 6M7 7l6-6M7 7l-6 6"/>
|
|
50
50
|
</svg>
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
id: "login",
|
|
10
10
|
autocomplete: rodauth.login_field_autocomplete_value,
|
|
11
11
|
required: true,
|
|
12
|
-
placeholder: "
|
|
12
|
+
placeholder: t("plutonium.resource.auth.login_placeholder"),
|
|
13
13
|
class: "pu-input #{rodauth.field_error(rodauth.login_param) ? 'pu-input-invalid' : ''}",
|
|
14
14
|
aria: (rodauth.field_error(rodauth.login_param) ? { invalid: true, describedby: "login_error_message" } : nil) %>
|
|
15
15
|
<% unless rodauth.skip_login_field_on_login? %>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<div>
|
|
2
|
-
<h4 class="text-2xl font-bold text-[var(--pu-text)] mb-4"
|
|
2
|
+
<h4 class="text-2xl font-bold text-[var(--pu-text)] mb-4"><%= t("plutonium.resource.auth.recovery_codes") %></h4>
|
|
3
3
|
|
|
4
4
|
<div class="mb-4 text-sm grid grid-cols-1 gap-y-2 gap-x-4 text-[var(--pu-text-muted)]">
|
|
5
5
|
<% if rodauth.recovery_codes.any? %>
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
<div class="font-mono"><%= code %></div>
|
|
8
8
|
<% end %>
|
|
9
9
|
<% else %>
|
|
10
|
-
<div class="font-mono"
|
|
10
|
+
<div class="font-mono"><%= t("plutonium.resource.auth.no_recovery_codes") %></div>
|
|
11
11
|
<% end %>
|
|
12
12
|
</div>
|
|
13
13
|
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
id: "login",
|
|
7
7
|
autocomplete: "email",
|
|
8
8
|
required: true,
|
|
9
|
-
placeholder: "
|
|
9
|
+
placeholder: t("plutonium.resource.auth.login_placeholder"),
|
|
10
10
|
class: "pu-input #{rodauth.field_error(rodauth.login_param) ? 'pu-input-invalid' : ''}",
|
|
11
11
|
aria: (rodauth.field_error(rodauth.login_param) ? { invalid: true, describedby: "login_error_message" } : nil) %>
|
|
12
12
|
<% if rodauth.field_error(rodauth.login_param) %>
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
id: "login-confirm",
|
|
23
23
|
autocomplete: "email",
|
|
24
24
|
required: true,
|
|
25
|
-
placeholder: "
|
|
25
|
+
placeholder: t("plutonium.resource.auth.login_placeholder"),
|
|
26
26
|
class: "pu-input #{rodauth.field_error(rodauth.login_confirm_param) ? 'pu-input-invalid' : ''}",
|
|
27
27
|
aria: (rodauth.field_error(rodauth.login_confirm_param) ? { invalid: true, describedby: "login-confirm_error_message" } : nil) %>
|
|
28
28
|
<% if rodauth.field_error(rodauth.login_confirm_param) %>
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
id: "login",
|
|
7
7
|
autocomplete: "email",
|
|
8
8
|
required: true,
|
|
9
|
-
placeholder: "
|
|
9
|
+
placeholder: t("plutonium.resource.auth.login_placeholder"),
|
|
10
10
|
class: "pu-input #{rodauth.field_error(rodauth.login_param) ? 'pu-input-invalid' : ''}",
|
|
11
11
|
aria: (rodauth.field_error(rodauth.login_param) ? { invalid: true, describedby: "login_error_message" } : nil) %>
|
|
12
12
|
<% if rodauth.field_error(rodauth.login_param) %>
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
id: "login-confirm",
|
|
23
23
|
autocomplete: "email",
|
|
24
24
|
required: true,
|
|
25
|
-
placeholder: "
|
|
25
|
+
placeholder: t("plutonium.resource.auth.login_placeholder"),
|
|
26
26
|
class: "pu-input #{rodauth.field_error(rodauth.login_confirm_param) ? 'pu-input-invalid' : ''}",
|
|
27
27
|
aria: (rodauth.field_error(rodauth.login_confirm_param) ? { invalid: true, describedby: "login-confirm_error_message" } : nil) %>
|
|
28
28
|
<% if rodauth.field_error(rodauth.login_confirm_param) %>
|
|
@@ -70,6 +70,6 @@
|
|
|
70
70
|
<% end %>
|
|
71
71
|
|
|
72
72
|
<p class="text-sm font-medium text-[var(--pu-text-muted)]">
|
|
73
|
-
|
|
74
|
-
<%= link_to "
|
|
73
|
+
<%= t("plutonium.resource.auth.already_have_account") %>
|
|
74
|
+
<%= link_to t("plutonium.resource.auth.login"), rodauth.login_path, class: "font-medium text-secondary-600 dark:text-secondary-400 hover:underline transition-colors" %>
|
|
75
75
|
</p>
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
id: "login",
|
|
13
13
|
autocomplete: "email",
|
|
14
14
|
required: true,
|
|
15
|
-
placeholder: "
|
|
15
|
+
placeholder: t("plutonium.resource.auth.login_placeholder"),
|
|
16
16
|
class: "pu-input #{rodauth.field_error(rodauth.login_param) ? 'pu-input-invalid' : ''}",
|
|
17
17
|
aria: (rodauth.field_error(rodauth.login_param) ? { invalid: true, describedby: "login_error_message" } : nil) %>
|
|
18
18
|
<% if rodauth.field_error(rodauth.login_param) %>
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
id: "login",
|
|
13
13
|
autocomplete: "email",
|
|
14
14
|
required: true,
|
|
15
|
-
placeholder: "
|
|
15
|
+
placeholder: t("plutonium.resource.auth.login_placeholder"),
|
|
16
16
|
class: "pu-input #{rodauth.field_error(rodauth.login_param) ? 'pu-input-invalid' : ''}",
|
|
17
17
|
aria: (rodauth.field_error(rodauth.login_param) ? { invalid: true, describedby: "login_error_message" } : nil) %>
|
|
18
18
|
<% if rodauth.field_error(rodauth.login_param) %>
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
<div class="flex items-center space-x-2">
|
|
21
21
|
<% last_use = last_use.strftime(rodauth.strftime_format) if last_use.is_a?(Time) %>
|
|
22
22
|
<%= form.radio_button rodauth.webauthn_remove_param, id, id: "webauthn-remove-#{id}", class: "pu-checkbox" %>
|
|
23
|
-
<%= form.label "webauthn-remove-#{id}", "
|
|
23
|
+
<%= form.label "webauthn-remove-#{id}", t("plutonium.resource.auth.last_use", time: last_use), class: "text-sm text-[var(--pu-text)]" %>
|
|
24
24
|
</div>
|
|
25
25
|
<% end %>
|
|
26
26
|
<% if rodauth.field_error(rodauth.webauthn_remove_param) %>
|
data/config/brakeman.ignore
CHANGED
|
@@ -144,13 +144,13 @@
|
|
|
144
144
|
{
|
|
145
145
|
"warning_type": "Dangerous Eval",
|
|
146
146
|
"warning_code": 13,
|
|
147
|
-
"fingerprint": "
|
|
147
|
+
"fingerprint": "026d28515125c36a64a867a16e51695ea57d865cb52b361f69eeeb1c460b4849",
|
|
148
148
|
"check_name": "Evaluation",
|
|
149
149
|
"message": "Dynamic string evaluated as code",
|
|
150
150
|
"file": "lib/plutonium/models/has_cents.rb",
|
|
151
151
|
"line": 162,
|
|
152
152
|
"link": "https://brakemanscanner.org/docs/warning_types/dangerous_eval/",
|
|
153
|
-
"code": "class_eval(\" # Getter method for the decimal representation of the cents value.\\n #\\n # @return [BigDecimal, nil] The decimal value or nil if cents_name is not present.\\n def #{(:\"#{cents_name.to_sym}_#{suffix}\" or cents_name.to_sym.to_s.gsub(/_cents$/, \"\").to_sym)}\\n #{cents_name.to_sym}.to_d / #{rate} if #{cents_name.to_sym}.present?\\n end\\n\\n # Setter method for the decimal representation of the cents value.\\n #\\n # @param value [Numeric, nil] The decimal value to be set.\\n def #{(:\"#{cents_name.to_sym}_#{suffix}\" or cents_name.to_sym.to_s.gsub(/_cents$/, \"\").to_sym)}=(value)\\n self.#{cents_name.to_sym} = begin\\n (BigDecimal(value.to_s) * #{rate}).to_i if value.present?\\n rescue ArgumentError\\n nil\\n end\\n end\\n\\n # Mark decimal field as invalid if cents field is not valid\\n after_validation do\\n next unless errors[#{cents_name.to_sym.inspect}].present?\\n\\n errors.add(#{(:\"#{cents_name.to_sym}_#{suffix}\" or cents_name.to_sym.to_s.gsub(/_cents$/, \"\").to_sym).inspect}, :invalid)\\n end\\n\", \"lib/plutonium/models/has_cents.rb\",
|
|
153
|
+
"code": "class_eval(\" # Getter method for the decimal representation of the cents value.\\n #\\n # @return [BigDecimal, nil] The decimal value or nil if cents_name is not present.\\n def #{(:\"#{cents_name.to_sym}_#{suffix}\" or cents_name.to_sym.to_s.gsub(/_cents$/, \"\").to_sym)}\\n #{cents_name.to_sym}.to_d / #{rate} if #{cents_name.to_sym}.present?\\n end\\n\\n # Setter method for the decimal representation of the cents value.\\n #\\n # @param value [Numeric, nil] The decimal value to be set.\\n def #{(:\"#{cents_name.to_sym}_#{suffix}\" or cents_name.to_sym.to_s.gsub(/_cents$/, \"\").to_sym)}=(value)\\n self.#{cents_name.to_sym} = begin\\n (BigDecimal(value.to_s) * #{rate}).to_i if value.present?\\n rescue ArgumentError, FloatDomainError\\n nil\\n end\\n end\\n\\n # Mark decimal field as invalid if cents field is not valid\\n after_validation do\\n next unless errors[#{cents_name.to_sym.inspect}].present?\\n\\n errors.add(#{(:\"#{cents_name.to_sym}_#{suffix}\" or cents_name.to_sym.to_s.gsub(/_cents$/, \"\").to_sym).inspect}, :invalid)\\n end\\n\", \"lib/plutonium/models/has_cents.rb\", 163)",
|
|
154
154
|
"render_path": null,
|
|
155
155
|
"location": {
|
|
156
156
|
"type": "method",
|
|
@@ -237,13 +237,13 @@
|
|
|
237
237
|
{
|
|
238
238
|
"warning_type": "Redirect",
|
|
239
239
|
"warning_code": 18,
|
|
240
|
-
"fingerprint": "
|
|
240
|
+
"fingerprint": "4ea59ff297ad43eec0ad1ba3ed7c4fa459eb627312a017f3fcf58cdb3fd59104",
|
|
241
241
|
"check_name": "Redirect",
|
|
242
242
|
"message": "Possible unprotected redirect",
|
|
243
243
|
"file": "lib/plutonium/invites/controller.rb",
|
|
244
244
|
"line": 76,
|
|
245
245
|
"link": "https://brakemanscanner.org/docs/warning_types/redirect/",
|
|
246
|
-
"code": "redirect_to(invitation_path_for(params[:token]), :alert => \"
|
|
246
|
+
"code": "redirect_to(invitation_path_for(params[:token]), :alert => t(\"plutonium.invites.controller.sign_in_to_accept\"))",
|
|
247
247
|
"render_path": null,
|
|
248
248
|
"location": {
|
|
249
249
|
"type": "method",
|
data/config/initializers/rabl.rb
CHANGED
|
@@ -21,29 +21,6 @@ Rabl.configure do |config|
|
|
|
21
21
|
config.cache_sources = !Rails.env.development? # Defaults to false
|
|
22
22
|
config.raise_on_missing_attribute = !Rails.env.production? # Defaults to false
|
|
23
23
|
config.json_engine = Plutonium::RablJsonEngine
|
|
24
|
-
|
|
25
|
-
# config.cache_all_output = false
|
|
26
|
-
# config.cache_engine = Rabl::CacheEngine.new # Defaults to Rails cache
|
|
27
|
-
# config.perform_caching = false
|
|
28
|
-
# config.escape_all_output = false
|
|
29
|
-
# config.json_engine = nil # Class with #dump class method (defaults JSON)
|
|
30
|
-
# config.msgpack_engine = nil # Defaults to ::MessagePack
|
|
31
|
-
# config.bson_engine = nil # Defaults to ::BSON
|
|
32
|
-
# config.plist_engine = nil # Defaults to ::Plist::Emit
|
|
33
|
-
# config.include_json_root = true
|
|
34
|
-
# config.include_msgpack_root = true
|
|
35
|
-
# config.include_bson_root = true
|
|
36
|
-
# config.include_plist_root = true
|
|
37
|
-
# config.include_xml_root = false
|
|
38
|
-
# config.include_child_root = true
|
|
39
|
-
# config.enable_json_callbacks = false
|
|
40
|
-
# config.xml_options = { :dasherize => true, :skip_types => false }
|
|
41
|
-
# config.view_paths = []
|
|
42
|
-
# config.replace_nil_values_with_empty_strings = true # Defaults to false
|
|
43
|
-
# config.replace_empty_string_values_with_nil_values = true # Defaults to false
|
|
44
|
-
# config.exclude_nil_values = true # Defaults to false
|
|
45
|
-
# config.exclude_empty_values_in_collections = true # Defaults to false
|
|
46
|
-
# config.camelize_keys = :upper # Defaults to false
|
|
47
24
|
end
|
|
48
25
|
|
|
49
26
|
# Extend Rabl source lookup to make it compatible with Rails view lookup
|
|
@@ -82,21 +59,4 @@ module Rabl
|
|
|
82
59
|
end
|
|
83
60
|
end
|
|
84
61
|
|
|
85
|
-
# Rails 8 compatible template handler registration
|
|
86
|
-
Rails.application.config.to_prepare do
|
|
87
|
-
unless ActionView::Template::Handlers.extensions.include?(:rabl)
|
|
88
|
-
# Create a proper callable handler for Rails 8
|
|
89
|
-
rabl_handler = lambda do |template, source|
|
|
90
|
-
# Rails 8 expects the handler to return Ruby code that will be evaluated
|
|
91
|
-
# The code should return the rendered content
|
|
92
|
-
%{
|
|
93
|
-
rabl_engine = Rabl::Engine.new(#{source.inspect})
|
|
94
|
-
rabl_engine.render(self, assigns.merge(local_assigns))
|
|
95
|
-
}
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
ActionView::Template.register_template_handler(:rabl, rabl_handler)
|
|
99
|
-
end
|
|
100
|
-
end
|
|
101
|
-
|
|
102
62
|
Rabl.register!
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Strings rendered by Plutonium::ApiClient (the create / disable interactions
|
|
2
|
+
# and the credentials page shown once after an API client is created).
|
|
3
|
+
en:
|
|
4
|
+
plutonium:
|
|
5
|
+
api_client:
|
|
6
|
+
create:
|
|
7
|
+
label: "Create API Client"
|
|
8
|
+
failed: "Failed to create account: %{error}"
|
|
9
|
+
credentials:
|
|
10
|
+
success_title: "API Client Created Successfully"
|
|
11
|
+
important_label: "Important:"
|
|
12
|
+
important_text: "Save these credentials now. The password cannot be retrieved later."
|
|
13
|
+
login: "Login"
|
|
14
|
+
password: "Password"
|
|
15
|
+
copy: "Copy"
|
|
16
|
+
copy_all: "Copy All"
|
|
17
|
+
done: "Done"
|
|
18
|
+
credentials_text: "Login: %{login}\nPassword: %{password}"
|
|
19
|
+
disable:
|
|
20
|
+
label: "Disable"
|
|
21
|
+
description: "Disable this API client (cannot be undone)"
|
|
22
|
+
disabled: "API client '%{login}' has been disabled"
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Async interaction runs: the progress page, the running banner, and the
|
|
2
|
+
# messages an executor writes into a run's errors_log. Run state / outcome
|
|
3
|
+
# VALUES ("Completed with errors") are enum-like and resolve by convention
|
|
4
|
+
# (plutonium.values.*), not here.
|
|
5
|
+
en:
|
|
6
|
+
plutonium:
|
|
7
|
+
async:
|
|
8
|
+
run:
|
|
9
|
+
label: "%{name} #%{id}"
|
|
10
|
+
target_type: "Target type"
|
|
11
|
+
enqueue_failed: "could not be enqueued for execution"
|
|
12
|
+
executor:
|
|
13
|
+
target_missing: "Target %{id} is no longer available"
|
|
14
|
+
target_unauthorized: "Target %{id} is no longer permitted by %{action}"
|
|
15
|
+
batch_aborted: "target %{id} failed (%{error}); no targets were applied"
|
|
16
|
+
halted:
|
|
17
|
+
one: "stopped at the first target failure (%{policy} policy); %{count} target was not attempted"
|
|
18
|
+
other: "stopped at the first target failure (%{policy} policy); %{count} targets were not attempted"
|
|
19
|
+
partial_batch_refused: "%{unresolved} of %{total} targets could not be resolved; a %{policy} run does not apply a partial batch"
|
|
20
|
+
context:
|
|
21
|
+
initiator_missing: "run %{run} has no initiator (%{type}#%{id} no longer exists)"
|
|
22
|
+
tenant_missing: "run %{run} was scoped to %{type}#%{id}, which no longer exists; refusing to resolve targets without a tenant"
|
|
23
|
+
parent_missing: "run %{run} was nested under %{type}#%{id}, which no longer exists; refusing to resolve targets without its parent"
|
|
24
|
+
progress:
|
|
25
|
+
targets: "%{done} of %{total} targets (%{percent}%)"
|
|
26
|
+
working: "Working…"
|
|
27
|
+
no_total: "No progress total was recorded"
|
|
28
|
+
failures: "Failures"
|
|
29
|
+
error_count:
|
|
30
|
+
one: "%{count} error"
|
|
31
|
+
other: "%{count} errors"
|
|
32
|
+
target_failure: "#%{target_id}: %{message}"
|
|
33
|
+
banner:
|
|
34
|
+
view_progress: "View progress"
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Fixed strings rendered by dashboards (lib/plutonium/dashboard,
|
|
2
|
+
# lib/plutonium/ui/dashboard). Dashboard and card titles resolve by convention
|
|
3
|
+
# instead, layered per portal like every other derived label:
|
|
4
|
+
#
|
|
5
|
+
# plutonium.dashboards.<dashboard>.label
|
|
6
|
+
# plutonium.dashboards.<dashboard>.description
|
|
7
|
+
# plutonium.dashboards.<dashboard>.cards.<card>.label
|
|
8
|
+
# plutonium.dashboards.<dashboard>.cards.<card>.description
|
|
9
|
+
# plutonium.portals.<portal>.dashboards.<dashboard>...
|
|
10
|
+
#
|
|
11
|
+
# `<dashboard>` is the class name underscored without the "Dashboard" suffix
|
|
12
|
+
# (`AdminPortal::SalesDashboard` → `admin_portal/sales`).
|
|
13
|
+
en:
|
|
14
|
+
plutonium:
|
|
15
|
+
dashboard:
|
|
16
|
+
authorization_denied: "You are not allowed to view this dashboard."
|
|
17
|
+
no_cards: "There is nothing to show on this dashboard yet."
|
|
18
|
+
card_error: "This card could not be loaded."
|
|
19
|
+
loading_card: "Loading %{card}..."
|
|
20
|
+
open: "Open"
|
|
21
|
+
metric:
|
|
22
|
+
empty: "—"
|
|
23
|
+
increase: "Up %{change}"
|
|
24
|
+
decrease: "Down %{change}"
|
|
25
|
+
unchanged: "No change"
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Strings rendered by Plutonium::Invites (invitation acceptance controller and
|
|
2
|
+
# the invite / resend / cancel interactions). Validation messages the invite
|
|
3
|
+
# model adds by symbol live under errors.messages so ActiveModel resolves them.
|
|
4
|
+
en:
|
|
5
|
+
plutonium:
|
|
6
|
+
invites:
|
|
7
|
+
controller:
|
|
8
|
+
email_validation_error: "Email Validation Error"
|
|
9
|
+
sign_in_to_accept: "Please sign in to accept this invitation"
|
|
10
|
+
accepted: "Invitation accepted! Welcome to %{entity}!"
|
|
11
|
+
acceptance_error: "Acceptance Error"
|
|
12
|
+
invalid_or_expired: "Invalid or Expired Invitation"
|
|
13
|
+
no_longer_valid: "This invitation link is no longer valid. It may have expired or already been used."
|
|
14
|
+
passwords_dont_match: "Passwords don't match"
|
|
15
|
+
account_exists: "An account with this email already exists. Please sign in instead."
|
|
16
|
+
create_account_failed: "Failed to create account"
|
|
17
|
+
create_account_failed_with_error: "Failed to create account: %{error}"
|
|
18
|
+
invite_user:
|
|
19
|
+
sent: "Invitation sent to %{email}"
|
|
20
|
+
resend_invite:
|
|
21
|
+
label: "Resend Invitation"
|
|
22
|
+
not_pending: "Can only resend pending invitations"
|
|
23
|
+
failed: "Failed to resend: %{error}"
|
|
24
|
+
resent: "Invitation resent to %{email}"
|
|
25
|
+
cancel_invite:
|
|
26
|
+
label: "Cancel Invitation"
|
|
27
|
+
not_pending: "Can only cancel pending invitations"
|
|
28
|
+
cancelled: "Invitation cancelled"
|
|
29
|
+
errors:
|
|
30
|
+
messages:
|
|
31
|
+
invite_email_mismatch: "This invitation is for %{email}. You must use an account with that email address."
|
|
32
|
+
invite_domain_mismatch: "This invitation requires an email from the %{domain} domain."
|
|
33
|
+
invite_already_accepted: "This invitation has already been accepted"
|
|
34
|
+
invite_cancelled: "This invitation has been cancelled"
|
|
35
|
+
invite_expired: "This invitation has expired"
|
|
36
|
+
already_a_member: "is already a member"
|
|
37
|
+
already_has_pending_invitation: "already has a pending invitation"
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Strings used by Plutonium's bundled JavaScript (src/js). The whole
|
|
2
|
+
# `plutonium.js` subtree is serialised into `<script id="pu-i18n">` on every
|
|
3
|
+
# page by Plutonium::UI::Layout::Base and read by `t()` in src/js/i18n.js, so
|
|
4
|
+
# any key here can be overridden from the host app's config/locales.
|
|
5
|
+
#
|
|
6
|
+
# `libraries.*` are optional passthroughs to the third-party widgets' own
|
|
7
|
+
# locale options; an absent entry leaves the library at its built-in default.
|
|
8
|
+
en:
|
|
9
|
+
plutonium:
|
|
10
|
+
js:
|
|
11
|
+
are_you_sure: "Are you sure?"
|
|
12
|
+
clipboard:
|
|
13
|
+
copied: "Copied!"
|
|
14
|
+
slim_select:
|
|
15
|
+
search_failed: "Search failed"
|
|
16
|
+
dirty_form_guard:
|
|
17
|
+
unsaved_changes: "You have unsaved changes that will be lost. Continue?"
|
|
18
|
+
discard_changes: "Discard your changes?"
|
|
19
|
+
attachment_input:
|
|
20
|
+
choose_file:
|
|
21
|
+
one: "Choose file"
|
|
22
|
+
other: "Choose files"
|
|
23
|
+
delete_all: "Delete %{count}"
|
|
24
|
+
turbo_confirm:
|
|
25
|
+
cancel: "Cancel"
|
|
26
|
+
confirm: "Confirm"
|
|
27
|
+
charts:
|
|
28
|
+
empty: "No data"
|
|
29
|
+
loading: "Loading..."
|
|
30
|
+
failed: "The chart could not be loaded."
|
|
31
|
+
libraries:
|
|
32
|
+
# SlimSelect `settings` (https://slimselectjs.com/settings)
|
|
33
|
+
slim_select:
|
|
34
|
+
placeholderText: "Select Value"
|
|
35
|
+
searchText: "No Results"
|
|
36
|
+
searchPlaceholder: "Search"
|
|
37
|
+
searchingText: "Searching..."
|
|
38
|
+
# flatpickr: `locale: "de"` (the host must load the matching l10n bundle)
|
|
39
|
+
# uppy: `strings: {...}` (Uppy locale strings, merged over the English defaults)
|
|
40
|
+
# intl_tel_input: `{...}` (intl-tel-input `i18n` option)
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Kanban board strings. Column LABELS are not here: they resolve by convention
|
|
2
|
+
# (plutonium.kanban_columns.<model>.<column>, see config/locales/en/plutonium.yml).
|
|
3
|
+
en:
|
|
4
|
+
plutonium:
|
|
5
|
+
kanban:
|
|
6
|
+
column:
|
|
7
|
+
expand: "Expand %{column}"
|
|
8
|
+
collapse: "Collapse %{column}"
|
|
9
|
+
wip_limit_exceeded: "WIP limit exceeded"
|
|
10
|
+
wip_limit: "WIP limit: %{limit}"
|
|
11
|
+
more:
|
|
12
|
+
one: "+%{count} more"
|
|
13
|
+
other: "+%{count} more"
|
|
14
|
+
add_to: "Add to %{column}"
|
|
15
|
+
add: "+ Add"
|
|
16
|
+
move:
|
|
17
|
+
not_in_column: "This card is no longer in “%{column}”."
|
|
18
|
+
locked_source: "Cards can't be moved out of “%{column}”."
|
|
19
|
+
not_accepted: "Cards can't be moved into “%{column}”."
|
|
20
|
+
not_allowed: "This card can't be moved there."
|
|
21
|
+
wip_limit_reached: "“%{column}” is at its WIP limit (%{wip})."
|
|
22
|
+
drop_incomplete: "This drop can’t be completed."
|
|
23
|
+
enter_interaction_failed: "“%{column}” could not be applied."
|
|
24
|
+
unauthorized: "You are not authorized to move this card there."
|
|
25
|
+
record_missing: "This card no longer exists."
|
|
26
|
+
record_invalid: "This card could not be moved."
|
|
27
|
+
quick_add:
|
|
28
|
+
default_column_fallback: "Couldn’t place it in “%{column}” — it stayed in its default column."
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Plutonium's own strings. Loaded at the lowest precedence: a package or
|
|
2
|
+
# portal engine's config/locales and the host app's config/locales both win.
|
|
3
|
+
#
|
|
4
|
+
# Convention keys the framework resolves on its own (never declared here):
|
|
5
|
+
#
|
|
6
|
+
# plutonium.fields.<model>.<attr>.{placeholder,hint,description}
|
|
7
|
+
# plutonium.actions.<model>.<action>
|
|
8
|
+
# plutonium.scopes.<model>.<scope>
|
|
9
|
+
# plutonium.filters.<model>.<filter>
|
|
10
|
+
# plutonium.kanban_columns.<model>.<column>
|
|
11
|
+
# plutonium.wizard_steps.<wizard>.<step>
|
|
12
|
+
# plutonium.dashboards.<dashboard>.{label,description}
|
|
13
|
+
# plutonium.dashboards.<dashboard>.cards.<card>.{label,description}
|
|
14
|
+
# plutonium.values.<model>.<attr>.<value>
|
|
15
|
+
#
|
|
16
|
+
# each also under plutonium.portals.<portal>.* for a portal-specific override.
|
|
17
|
+
en:
|
|
18
|
+
plutonium:
|
|
19
|
+
boolean:
|
|
20
|
+
"true": "Yes"
|
|
21
|
+
"false": "No"
|
|
22
|
+
actions:
|
|
23
|
+
# Confirmation prompt for an immediate action that declares none.
|
|
24
|
+
confirm_default: "%{label}?"
|
|
25
|
+
# Confirmation prompt on the standard destroy action.
|
|
26
|
+
confirm_destroy: "Are you sure?"
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Drag-to-reorder: the reposition endpoint's refusal toasts and the row grip.
|
|
2
|
+
en:
|
|
3
|
+
plutonium:
|
|
4
|
+
positioning:
|
|
5
|
+
reposition:
|
|
6
|
+
foreign_sort: "Reordering is only available while the list is sorted by %{attribute}."
|
|
7
|
+
foreign_group: "Reordering only works within the same %{group}."
|
|
8
|
+
unauthorized: "You are not authorized to reorder this."
|
|
9
|
+
record_missing: "This record no longer exists."
|
|
10
|
+
record_invalid: "This record could not be moved."
|
|
11
|
+
drag_handle:
|
|
12
|
+
title: "Drag to reorder"
|
|
13
|
+
aria_label: "Drag to reorder. Use the up and down arrow keys to move this row."
|
|
14
|
+
disabled_title: "Sort by position to reorder"
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Strings rendered by Plutonium::Profile (the account security section).
|
|
2
|
+
en:
|
|
3
|
+
plutonium:
|
|
4
|
+
profile:
|
|
5
|
+
security_section:
|
|
6
|
+
title: "Security Settings"
|
|
7
|
+
description: "Manage your account security"
|
|
8
|
+
features:
|
|
9
|
+
change_password:
|
|
10
|
+
label: "Change Password"
|
|
11
|
+
description: "Update your account password"
|
|
12
|
+
change_login:
|
|
13
|
+
label: "Change Email"
|
|
14
|
+
description: "Update your email address"
|
|
15
|
+
otp:
|
|
16
|
+
label: "Two-Factor Authentication"
|
|
17
|
+
description: "Add an extra layer of security"
|
|
18
|
+
recovery_codes:
|
|
19
|
+
label: "Recovery Codes"
|
|
20
|
+
description: "View or regenerate backup codes"
|
|
21
|
+
webauthn:
|
|
22
|
+
label: "Security Keys"
|
|
23
|
+
description: "Manage passkeys and security keys"
|
|
24
|
+
active_sessions:
|
|
25
|
+
label: "Active Sessions"
|
|
26
|
+
description: "View and manage your sessions"
|
|
27
|
+
close_account:
|
|
28
|
+
label: "Close Account"
|
|
29
|
+
description: "Permanently delete your account"
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Resource CRUD, query/filter and authentication-view strings.
|
|
2
|
+
# Loaded at the lowest precedence: a package, portal or host app locale
|
|
3
|
+
# with the same key wins (see config/locales/en/plutonium.yml).
|
|
4
|
+
en:
|
|
5
|
+
plutonium:
|
|
6
|
+
resource:
|
|
7
|
+
created: "%{resource} was successfully created."
|
|
8
|
+
updated: "%{resource} was successfully updated."
|
|
9
|
+
deleted: "%{resource} was successfully deleted."
|
|
10
|
+
referenced: "%{resource} is referenced by other records."
|
|
11
|
+
titles:
|
|
12
|
+
new: "Create %{resource}"
|
|
13
|
+
edit: "Update %{record}"
|
|
14
|
+
record_label: "%{resource} #%{id}"
|
|
15
|
+
export_csv:
|
|
16
|
+
invalid_column: "<<invalid column>>"
|
|
17
|
+
nav:
|
|
18
|
+
home: "Home"
|
|
19
|
+
dashboards: "Dashboards"
|
|
20
|
+
resources: "Resources"
|
|
21
|
+
profile: "Profile"
|
|
22
|
+
sign_out: "Sign out"
|
|
23
|
+
flash:
|
|
24
|
+
close: "Close"
|
|
25
|
+
auth:
|
|
26
|
+
login_placeholder: "jane@acme.inc"
|
|
27
|
+
show_password: "Show Password"
|
|
28
|
+
recovery_codes: "Recovery Codes"
|
|
29
|
+
no_recovery_codes: "You have no recovery codes"
|
|
30
|
+
already_have_account: "Already have an account?"
|
|
31
|
+
login: "Login"
|
|
32
|
+
last_use: "Last use: %{time}"
|
|
33
|
+
query:
|
|
34
|
+
# One input of a multi-input filter, e.g. "Created at (from)".
|
|
35
|
+
filter_input_label: "%{label} (%{input})"
|
|
36
|
+
all: "All"
|
|
37
|
+
active_filter:
|
|
38
|
+
input_value: "%{input} %{value}"
|
|
39
|
+
filters:
|
|
40
|
+
text:
|
|
41
|
+
matches: "%{label} (use * as wildcard)"
|
|
42
|
+
starts_with: "%{label} starts with..."
|
|
43
|
+
ends_with: "%{label} ends with..."
|
|
44
|
+
contains: "%{label} contains..."
|
|
45
|
+
date:
|
|
46
|
+
not_eq: "%{label} not on..."
|
|
47
|
+
lt: "%{label} before..."
|
|
48
|
+
lteq: "%{label} on or before..."
|
|
49
|
+
gt: "%{label} after..."
|
|
50
|
+
gteq: "%{label} on or after..."
|
|
51
|
+
date_range:
|
|
52
|
+
from: "%{label} from..."
|
|
53
|
+
to: "%{label} to..."
|
|
54
|
+
errors:
|
|
55
|
+
messages:
|
|
56
|
+
existing_references: "is referenced by other records"
|
|
57
|
+
invalid_url: "is not a valid URL"
|
|
58
|
+
invalid_image_url: "is not a valid image URL"
|
|
59
|
+
not_attached: "must be attached"
|
|
60
|
+
array_item: "item %{index} %{message}"
|