swop 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/rails_admin/application.js.erb +3 -2
  3. data/app/assets/javascripts/rails_admin/custom/abstract-select.js +30 -0
  4. data/app/assets/javascripts/rails_admin/custom/filter-box.js +363 -0
  5. data/app/assets/javascripts/rails_admin/custom/filtering-multiselect.js +387 -0
  6. data/app/assets/javascripts/rails_admin/custom/filtering-select.js +1 -1
  7. data/app/assets/stylesheets/rails_admin/application.scss.erb +19 -33
  8. data/app/assets/stylesheets/rails_admin/{custom → themes}/base/base.scss +4 -0
  9. data/app/assets/stylesheets/rails_admin/themes/base/bootstrap-variables.scss +252 -0
  10. data/app/assets/stylesheets/rails_admin/{custom → themes}/base/mixins.scss +0 -16
  11. data/app/assets/stylesheets/rails_admin/themes/base/theming.scss +22 -0
  12. data/app/assets/stylesheets/rails_admin/themes/base/variables.scss +71 -0
  13. data/app/assets/stylesheets/rails_admin/themes/simple/base/typography.scss +22 -0
  14. data/app/assets/stylesheets/rails_admin/themes/simple/base/variables-dark.scss +74 -0
  15. data/app/assets/stylesheets/rails_admin/themes/simple/base/variables-light.scss +77 -0
  16. data/app/assets/stylesheets/rails_admin/themes/simple/base/variables-navy.scss +74 -0
  17. data/app/assets/stylesheets/rails_admin/themes/simple/base/variables.scss +129 -0
  18. data/app/assets/stylesheets/rails_admin/themes/simple/components/alerts.scss +88 -0
  19. data/app/assets/stylesheets/rails_admin/themes/simple/components/breadcrumbs.scss +44 -0
  20. data/app/assets/stylesheets/rails_admin/themes/simple/components/buttons.scss +138 -0
  21. data/app/assets/stylesheets/rails_admin/themes/simple/components/containers.scss +15 -0
  22. data/app/assets/stylesheets/rails_admin/themes/simple/components/dropdowns.scss +12 -0
  23. data/app/assets/stylesheets/rails_admin/themes/simple/components/filter-box.scss +8 -0
  24. data/app/assets/stylesheets/rails_admin/themes/simple/components/filtering-multiselect.scss +40 -0
  25. data/app/assets/stylesheets/rails_admin/themes/simple/components/filtering-select.scss +42 -0
  26. data/app/assets/stylesheets/rails_admin/{custom → themes/simple}/components/forms.scss +4 -2
  27. data/app/assets/stylesheets/rails_admin/{custom → themes/simple}/components/images.scss +4 -6
  28. data/app/assets/stylesheets/rails_admin/themes/simple/components/links.scss +25 -0
  29. data/app/assets/stylesheets/rails_admin/themes/simple/components/navs.scss +73 -0
  30. data/app/assets/stylesheets/rails_admin/themes/simple/components/progress.scss +4 -0
  31. data/app/assets/stylesheets/rails_admin/themes/simple/components/sidebar.scss +84 -0
  32. data/app/assets/stylesheets/rails_admin/themes/simple/components/tables.scss +84 -0
  33. data/app/assets/stylesheets/rails_admin/themes/simple/layouts/rows.scss +34 -0
  34. data/app/assets/stylesheets/rails_admin/themes/simple/light/components/links.scss +15 -0
  35. data/app/assets/stylesheets/rails_admin/themes/simple/light/components/sidebar.scss +25 -0
  36. data/app/assets/stylesheets/rails_admin/themes/simple.scss.erb +37 -0
  37. data/app/helpers/rails_admin/application_helper.rb +34 -46
  38. data/app/helpers/rails_admin/form_builder.rb +166 -0
  39. data/app/views/layouts/rails_admin/_custom_navigation.html.erb +10 -0
  40. data/app/views/layouts/rails_admin/_head.html.erb +32 -0
  41. data/app/views/layouts/rails_admin/_header.html.erb +43 -0
  42. data/app/views/layouts/rails_admin/_sidebar_navigation.html.erb +3 -1
  43. data/app/views/layouts/rails_admin/application.html.erb +15 -12
  44. data/app/views/layouts/rails_admin/content.html.erb +6 -51
  45. data/app/views/rails_admin/main/_form_polymorphic_association.html.erb +15 -0
  46. data/app/views/rails_admin/main/_submit_buttons.html.erb +22 -18
  47. data/app/views/rails_admin/main/dashboard.html.erb +49 -55
  48. data/app/views/rails_admin/main/export.html.erb +23 -23
  49. data/app/views/rails_admin/main/history.html.erb +87 -0
  50. data/app/views/rails_admin/main/index.html.erb +60 -56
  51. data/app/views/rails_admin/main/show.html.erb +15 -23
  52. data/config/locales/rails_admin.en.yml +158 -0
  53. data/lib/swop/version.rb +1 -1
  54. data/lib/swop.rb +1 -0
  55. metadata +41 -28
  56. data/app/assets/javascripts/rails_admin/custom/sidescroll.js +0 -20
  57. data/app/assets/javascripts/rails_admin/custom/ui.js +0 -11
  58. data/app/assets/stylesheets/rails_admin/custom/base/bootstrap-variables.scss +0 -196
  59. data/app/assets/stylesheets/rails_admin/custom/base/typography.scss +0 -16
  60. data/app/assets/stylesheets/rails_admin/custom/base/variables.scss +0 -86
  61. data/app/assets/stylesheets/rails_admin/custom/components/breadcrumbs.scss +0 -18
  62. data/app/assets/stylesheets/rails_admin/custom/components/buttons.scss +0 -55
  63. data/app/assets/stylesheets/rails_admin/custom/components/dropdowns.scss +0 -40
  64. data/app/assets/stylesheets/rails_admin/custom/components/filtering-select.scss +0 -43
  65. data/app/assets/stylesheets/rails_admin/custom/components/navbar.scss +0 -18
  66. data/app/assets/stylesheets/rails_admin/custom/components/navs.scss +0 -28
  67. data/app/assets/stylesheets/rails_admin/custom/components/offcanvas.scss +0 -18
  68. data/app/assets/stylesheets/rails_admin/custom/components/progress.scss +0 -11
  69. data/app/assets/stylesheets/rails_admin/custom/components/sidebar.scss +0 -115
  70. data/app/assets/stylesheets/rails_admin/custom/components/table.scss +0 -59
  71. data/app/assets/stylesheets/rails_admin/custom/components/tiles.scss +0 -20
  72. data/app/assets/stylesheets/rails_admin/custom/layouts/body.scss +0 -10
  73. data/app/assets/stylesheets/rails_admin/custom/layouts/containers.scss +0 -31
  74. data/app/views/layouts/rails_admin/custom/_nav.html.erb +0 -10
  75. data/app/views/rails_admin/main/delete.html.erb +0 -19
  76. data/app/views/rails_admin/main/edit.html.erb +0 -5
  77. data/app/views/rails_admin/main/new.html.erb +0 -5
@@ -0,0 +1,84 @@
1
+ .sidebar {
2
+ -ms-overflow-style: none; /* Internet Explorer 10+ */
3
+ scrollbar-width: none; /* Firefox */
4
+
5
+ &::-webkit-scrollbar {
6
+ display: none; /* Safari and Chrome */
7
+ }
8
+
9
+ @include media-breakpoint-up(xl) {
10
+ height: rem(100px);
11
+ min-height: 100%;
12
+ overflow: scroll;
13
+ padding-right: $spacer-7;
14
+ width: rem(229px);
15
+ }
16
+
17
+ &-wrapper {
18
+
19
+ @include media-breakpoint-up(xl) {
20
+ position: relative;
21
+ }
22
+
23
+ &::after {
24
+
25
+ @include media-breakpoint-up(xl) {
26
+ background-color: rgba($border-color, 0.5);
27
+ content: "";
28
+ height: calc(100% - #{$spacer-10});
29
+ position: absolute;
30
+ right: 0;
31
+ top: $spacer-7;
32
+ width: $border-width;
33
+ }
34
+ }
35
+ }
36
+
37
+ .nav-link {
38
+ border-radius: 0.625em;
39
+ line-height: $line-height-lg;
40
+ padding: $spacer-1 $spacer-4;
41
+
42
+ &:hover {
43
+ background-color: $light;
44
+ color: $white;
45
+ }
46
+
47
+ &.active {
48
+ background-color: $primary;
49
+ color: $white;
50
+ font-weight: $font-weight-semibold;
51
+ }
52
+ }
53
+
54
+ .btn-toggle {
55
+ border-radius: 0;
56
+ border: 0;
57
+ color: $white;
58
+ display: flex;
59
+ font-weight: $font-weight-semibold;
60
+ line-height: $line-height-lg;
61
+ margin-top: $spacer-2;
62
+ padding: $spacer-1 $spacer-4;
63
+ transition: all $transition;
64
+ width: 100%;
65
+
66
+ *[class^="fa"] {
67
+ color: $white;
68
+ margin-left: auto;
69
+ transition: all $transition;
70
+ }
71
+
72
+ &:active {
73
+ color: $white;
74
+ }
75
+
76
+ &.collapsed *[class^="fa"] {
77
+ transform: rotate(180deg);
78
+ }
79
+
80
+ &-nav {
81
+ margin-bottom: 0 !important;
82
+ }
83
+ }
84
+ }
@@ -0,0 +1,84 @@
1
+ .table {
2
+ margin-bottom: 0;
3
+ border-collapse: unset;
4
+
5
+ td, th {
6
+ vertical-align: middle !important;
7
+ white-space: nowrap !important;
8
+ }
9
+
10
+ thead th,
11
+ thead tr {
12
+ color: $body-secondary-color !important;
13
+ padding-top: 0;
14
+ }
15
+
16
+ thead,
17
+ tbody {
18
+
19
+ th,
20
+ td {
21
+
22
+ &:first-child {
23
+ padding-left: 0;
24
+ }
25
+
26
+ &:last-child {
27
+ padding-right: 0;
28
+ }
29
+ }
30
+ }
31
+
32
+ .header {
33
+ position: relative;
34
+ cursor: pointer;
35
+
36
+ &:hover::after {
37
+ @extend .fa-solid;
38
+ @extend .fa-xs;
39
+ border: unset;
40
+ content: "\f077";
41
+ float: unset;
42
+ margin-top: unset;
43
+ position: absolute;
44
+ right: rem(5px);
45
+ top: 37.5%;
46
+ }
47
+ }
48
+
49
+ .headerSortUp::after {
50
+ @extend .fa-solid;
51
+ @extend .fa-xs;
52
+ content: "\f078";
53
+ position: absolute;
54
+ right: rem(5px);
55
+ top: 37.5%;
56
+ }
57
+
58
+ &-responsive {
59
+ -ms-overflow-style: none; // Internet Explorer 10+
60
+ margin-left: -$spacer-4;
61
+ margin-right: -$spacer-4;
62
+ padding-left: $spacer-4;
63
+ padding-right: $spacer-4;
64
+ scrollbar-width: none; // Firefox
65
+
66
+ @include media-breakpoint-up(md) {
67
+ margin-left: -$spacer-6;
68
+ margin-right: -$spacer-6;
69
+ padding-left: $spacer-6;
70
+ padding-right: $spacer-6;
71
+ }
72
+
73
+ @include media-breakpoint-up(lg) {
74
+ margin-left: -$spacer-7;
75
+ margin-right: -$spacer-7;
76
+ padding-left: $spacer-7;
77
+ padding-right: $spacer-7;
78
+ }
79
+
80
+ &::-webkit-scrollbar {
81
+ display: none; // Safari and Chrome
82
+ }
83
+ }
84
+ }
@@ -0,0 +1,34 @@
1
+ .row {
2
+
3
+ &-application-layout {
4
+
5
+ @include media-breakpoint-up(xl) {
6
+ height: 100% !important;
7
+ position: fixed !important;
8
+ width: 100% !important;
9
+ }
10
+
11
+ .col-content {
12
+ -ms-overflow-style: none; // Internet Explorer 10+
13
+ scrollbar-width: none; // Firefox
14
+
15
+ @include media-breakpoint-up(xl) {
16
+ height: 100% !important;
17
+ overflow: scroll !important;
18
+ padding-left: $spacer-7;
19
+ }
20
+
21
+ &::-webkit-scrollbar {
22
+ display: none; // Safari and Chrome
23
+ }
24
+
25
+ .container-fluid {
26
+
27
+ @include media-breakpoint-up(xl) {
28
+ height: 100% !important;
29
+ padding-left: 0;
30
+ }
31
+ }
32
+ }
33
+ }
34
+ }
@@ -0,0 +1,15 @@
1
+ .link {
2
+
3
+ &-white {
4
+
5
+ &,
6
+ *[class^="fa"] {
7
+ color: $dark;
8
+ }
9
+
10
+ &:hover,
11
+ &:hover *[class^="fa"] {
12
+ color: $dark;
13
+ }
14
+ }
15
+ }
@@ -0,0 +1,25 @@
1
+ .sidebar {
2
+
3
+ .nav-link {
4
+
5
+ &:hover {
6
+ color: $dark;
7
+ }
8
+
9
+ &.active:hover {
10
+ color: $white;
11
+ }
12
+ }
13
+
14
+ .btn-toggle {
15
+ color: $dark;
16
+
17
+ *[class^="fa"] {
18
+ color: $dark;
19
+ }
20
+
21
+ &:active {
22
+ color: $dark;
23
+ }
24
+ }
25
+ }
@@ -0,0 +1,37 @@
1
+ // Variables
2
+ @import "simple/base/variables";
3
+
4
+ @import "simple/base/variables-light";
5
+
6
+ // Shared - Bootstrap variables (Funnel)
7
+ @import "base/bootstrap-variables";
8
+
9
+ // Bootstrap
10
+ @import "rails_admin/bootstrap/bootstrap";
11
+
12
+ // Base
13
+ @import "simple/base/typography";
14
+
15
+ // Layouts
16
+ @import "simple/layouts/rows";
17
+
18
+ // Components
19
+ @import "simple/components/alerts";
20
+ @import "simple/components/breadcrumbs";
21
+ @import "simple/components/buttons";
22
+ @import "simple/components/containers";
23
+ @import "simple/components/dropdowns";
24
+ @import "simple/components/filter-box";
25
+ @import "simple/components/filtering-multiselect";
26
+ @import "simple/components/filtering-select";
27
+ @import "simple/components/forms";
28
+ @import "simple/components/images";
29
+ @import "simple/components/links";
30
+ @import "simple/components/navs";
31
+ @import "simple/components/progress";
32
+ @import "simple/components/sidebar";
33
+ @import "simple/components/tables";
34
+
35
+ // Light - Components
36
+ @import "simple/light/components/sidebar";
37
+ @import "simple/light/components/links";
@@ -41,9 +41,9 @@ module RailsAdmin
41
41
  id: _current_user.id,
42
42
  )
43
43
 
44
- link_to content, edit_url, class: 'nav-link'
44
+ link_to content, edit_url, class: 'dropdown-item'
45
45
  else
46
- content_tag :span, content, class: 'nav-link'
46
+ content_tag :span, content, class: 'dropdown-item'
47
47
  end
48
48
  end
49
49
 
@@ -89,7 +89,6 @@ module RailsAdmin
89
89
  li_stack = navigation parent_groups, nodes
90
90
 
91
91
  label = navigation_label || t('admin.misc.navigation')
92
-
93
92
  collapsible_stack(label, 'main', li_stack)
94
93
  end.join.html_safe
95
94
  end
@@ -127,7 +126,7 @@ module RailsAdmin
127
126
  css_classes = ['nav-link']
128
127
  css_classes.push("nav-level-#{level}") if level > 0
129
128
  css_classes.push('active') if @action && current_action?(@action, model_param)
130
- li = content_tag :li, data: {model: model_param} do
129
+ li = content_tag :li, class: "nav-item", data: {model: model_param} do
131
130
  link_to nav_icon + " " + node.label_plural, url, class: css_classes.join(' ')
132
131
  end
133
132
  child_nodes = parent_groups[abstract_model.model_name]
@@ -140,7 +139,7 @@ module RailsAdmin
140
139
  (parent_actions ||= []) << action
141
140
  end while action.breadcrumb_parent && (action = action(*action.breadcrumb_parent)) # rubocop:disable Lint/Loop
142
141
 
143
- content_tag(:ol, class: 'breadcrumb') do
142
+ content_tag(:ol, class: 'breadcrumb mb-0 mb-md-1') do
144
143
  parent_actions.collect do |a|
145
144
  am = a.send(:eval, 'bindings[:abstract_model]')
146
145
  o = a.send(:eval, 'bindings[:object]')
@@ -163,30 +162,23 @@ module RailsAdmin
163
162
  # perf matters here (no action view trickery)
164
163
  def menu_for(parent, abstract_model = nil, object = nil, only_icon = false)
165
164
  actions = actions(parent, abstract_model, object).select { |a| a.http_methods.include?(:get) && a.show_in_menu }
166
-
167
- # Filter out list action
168
- actions.reject! { |action| %i[index].include?(action.key) }
169
-
170
- # Sort actions
171
- actions.sort_by! { |action| action.key.to_s }
172
-
173
165
  actions.collect do |action|
174
166
  wording = wording_for(:menu, action)
175
- link_class = ["#{action.key}_#{parent}_link"].concat(action.enabled? ? [] : ['disabled'])
176
- label = content_tag(:i, '', {class: "fa-sm fa-fw #{action.link_icon}"}) + ' ' + content_tag(:span, wording, (only_icon ? {style: 'display:none'} : {}))
177
- if action.enabled? || !only_icon
178
- href =
179
- if action.enabled?
180
- rails_admin.url_for(action: action.action_name, controller: 'rails_admin/main', model_name: abstract_model.try(:to_param), id: (object.try(:persisted?) && object.try(:id) || nil))
181
- else
182
- 'javascript:void(0)'
183
- end
184
- button_class = action.key == :new ? 'btn btn-primary' : 'btn btn-white'
185
- content_tag(:div, class: "col-md-auto") do
186
- content_tag(:a, label, {href: href, target: action.link_target, class: [link_class, button_class, !action.enabled? && 'disabled'].compact}.merge(action.turbo? ? {} : {data: {turbo: 'false'}}))
167
+ li_class = ['nav-item', 'icon', "#{action.key}_#{parent}_link"].
168
+ concat(action.enabled? ? [] : ['disabled'])
169
+ content_tag(:li, {class: li_class}.merge(only_icon ? {title: wording, rel: 'tooltip'} : {})) do
170
+ label = content_tag(:i, '', {class: "fa-sm #{action.link_icon}"}) + ' ' + content_tag(:span, wording, (only_icon ? {style: 'display:none'} : {}))
171
+ if action.enabled? || !only_icon
172
+ href =
173
+ if action.enabled?
174
+ rails_admin.url_for(action: action.action_name, controller: 'rails_admin/main', model_name: abstract_model.try(:to_param), id: (object.try(:persisted?) && object.try(:id) || nil))
175
+ else
176
+ 'javascript:void(0)'
177
+ end
178
+ content_tag(:a, label, {href: href, target: action.link_target, class: ['nav-link', current_action?(action) && 'active', !action.enabled? && 'disabled'].compact}.merge(action.turbo? ? {} : {data: {turbo: 'false'}}))
179
+ else
180
+ content_tag(:span, label)
187
181
  end
188
- else
189
- content_tag(:span, label)
190
182
  end
191
183
  end.join(' ').html_safe
192
184
  end
@@ -194,16 +186,17 @@ module RailsAdmin
194
186
  def bulk_menu(abstract_model = @abstract_model)
195
187
  actions = actions(:bulkable, abstract_model)
196
188
  return '' if actions.empty?
197
- content_tag(:div, class: "dropdown") do
198
- content_tag(:button, class: 'btn btn-white dropdown-toggle', data: {'bs-toggle': 'dropdown'}) { t('admin.misc.bulk_menu_title').html_safe + ' ' + '<b class="caret"></b>'.html_safe } +
199
- content_tag(:ul, class: 'dropdown-menu', style: 'left:auto; right:0;') do
200
- actions.collect do |action|
201
- content_tag :li do
202
- link_to wording_for(:bulk_link, action, abstract_model), '#', class: 'dropdown-item bulk-link', data: {action: action.action_name}
203
- end
204
- end.join.html_safe
205
- end
206
- end
189
+
190
+ content_tag :li, class: 'nav-item dropdown dropdown-menu-end' do
191
+ content_tag(:a, class: 'nav-link dropdown-toggle', data: {'bs-toggle': 'dropdown'}, href: '#') { t('admin.misc.bulk_menu_title').html_safe + ' ' + '<b class="caret"></b>'.html_safe } +
192
+ content_tag(:ul, class: 'dropdown-menu', style: 'left:auto; right:0;') do
193
+ actions.collect do |action|
194
+ content_tag :li do
195
+ link_to wording_for(:bulk_link, action, abstract_model), '#', class: 'dropdown-item bulk-link', data: {action: action.action_name}
196
+ end
197
+ end.join.html_safe
198
+ end
199
+ end.html_safe
207
200
  end
208
201
 
209
202
  def flash_alert_class(flash_key)
@@ -239,12 +232,7 @@ module RailsAdmin
239
232
  private
240
233
 
241
234
  def edit_user_link_label
242
- [
243
- RailsAdmin::Config.show_gravatar &&
244
- image_tag(gravatar_url(_current_user.email), alt: ''),
245
-
246
- content_tag(:span, _current_user.email),
247
- ].filter(&:present?).join.html_safe
235
+ "#{icon('fa-solid', 'user', class: 'fa-sm fa-fw me-2')}Your account".html_safe
248
236
  end
249
237
 
250
238
  def gravatar_url(email)
@@ -255,12 +243,12 @@ module RailsAdmin
255
243
  return nil unless li_stack.present?
256
244
 
257
245
  collapse_classname = "#{class_prefix}-#{Digest::MD5.hexdigest(label)[0..7]}"
258
- content_tag(:li, class: 'mb-1') do
259
- content_tag(:button, 'aria-expanded': true, class: 'btn btn-toggle align-items-center rounded', data: {bs_toggle: "collapse", bs_target: ".sidebar .#{collapse_classname}"}) do
260
- content_tag(:i, '', class: 'fas fa-chevron-down') + html_escape(' ' + label)
246
+ content_tag(:li) do
247
+ content_tag(:button, 'aria-expanded': true, class: 'btn btn-toggle align-items-center', data: {bs_toggle: "collapse", bs_target: ".sidebar .#{collapse_classname}"}) do
248
+ html_escape(' ' + label) + content_tag(:i, '', class: 'fas fa-sm fa-angle-up')
261
249
  end +
262
250
  content_tag(:div, class: "collapse show #{collapse_classname}") do
263
- content_tag(:ul, class: 'btn-toggle-nav list-unstyled fw-normal pb-1') do
251
+ content_tag(:ul, class: 'btn-toggle-nav list-unstyled') do
264
252
  li_stack
265
253
  end
266
254
  end
@@ -0,0 +1,166 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'nested_form/builder_mixin'
4
+
5
+ module RailsAdmin
6
+ class FormBuilder < ::ActionView::Helpers::FormBuilder
7
+ include ::NestedForm::BuilderMixin
8
+ include ::RailsAdmin::ApplicationHelper
9
+
10
+ def generate(options = {})
11
+ without_field_error_proc_added_div do
12
+ options.reverse_merge!(
13
+ action: @template.controller.params[:action],
14
+ model_config: @template.instance_variable_get(:@model_config),
15
+ nested_in: false,
16
+ )
17
+
18
+ object_infos +
19
+ visible_groups(options[:model_config], generator_action(options[:action], options[:nested_in])).collect do |fieldset|
20
+ fieldset_for fieldset, options[:nested_in]
21
+ end.join.html_safe +
22
+ (options[:nested_in] ? '' : @template.render(partial: 'rails_admin/main/submit_buttons'))
23
+ end
24
+ end
25
+
26
+ def fieldset_for(fieldset, nested_in)
27
+ fields = fieldset.with(
28
+ form: self,
29
+ object: @object,
30
+ view: @template,
31
+ controller: @template.controller,
32
+ ).visible_fields
33
+ return if fields.empty?
34
+
35
+ @template.content_tag :fieldset do
36
+ contents = []
37
+ contents << @template.content_tag(:legend, %(<i class="fas fa-chevron-#{fieldset.active? ? 'down' : 'right'}"></i> #{fieldset.label}).html_safe, style: fieldset.name == :default ? 'display:none' : '')
38
+ contents << @template.content_tag(:p, fieldset.help) if fieldset.help.present?
39
+ contents << fields.collect { |field| field_wrapper_for(field, nested_in) }.join
40
+ contents.join.html_safe
41
+ end
42
+ end
43
+
44
+ def field_wrapper_for(field, nested_in)
45
+ # do not show nested field if the target is the origin
46
+ return if nested_field_association?(field, nested_in)
47
+
48
+ @template.content_tag(:div, class: "control-group row mb-3 #{field.type_css_class} #{field.css_class} #{'error' if field.errors.present?}", id: "#{dom_id(field)}_field") do
49
+ if field.label
50
+ label(field.method_name, field.label, class: 'form-label') +
51
+ (field.nested_form ? field_for(field) : input_for(field))
52
+ else
53
+ field.nested_form ? field_for(field) : input_for(field)
54
+ end
55
+ end
56
+ end
57
+
58
+ def input_for(field)
59
+ css = 'col'
60
+
61
+ case field.type
62
+ when :string
63
+ css += " col-md-10 col-xl-5"
64
+ when :serialized
65
+ css += " col-md-20 col-xl-10"
66
+ when :integer
67
+ css += " col-md-5 col-xl-3"
68
+ end
69
+ css += ' has-error' if field.errors.present?
70
+ @template.content_tag(:div, class: css) do
71
+ field_for(field) +
72
+ errors_for(field) +
73
+ help_for(field)
74
+ end
75
+ end
76
+
77
+ def errors_for(field)
78
+ field.errors.present? ? @template.content_tag(:span, field.errors.to_sentence, class: 'help-inline text-danger') : ''.html_safe
79
+ end
80
+
81
+ def help_for(field)
82
+ field.help.present? ? @template.content_tag(:div, field.help, class: 'form-text') : ''.html_safe
83
+ end
84
+
85
+ def field_for(field)
86
+ field.read_only? ? @template.content_tag(:div, field.pretty_value, class: 'form-control-static') : field.render
87
+ end
88
+
89
+ def object_infos
90
+ model_config = RailsAdmin.config(object)
91
+ model_label = model_config.label
92
+ object_label =
93
+ if object.new_record?
94
+ I18n.t('admin.form.new_model', name: model_label)
95
+ else
96
+ object.send(model_config.object_label_method).presence || "#{model_config.label} ##{object.id}"
97
+ end
98
+
99
+ %(<span style="display:none" class="object-infos" data-model-label="#{model_label}" data-object-label="#{CGI.escapeHTML(object_label.to_s)}"></span>).html_safe
100
+ end
101
+
102
+ def jquery_namespace(field)
103
+ %(#{'#modal ' if @template.controller.params[:modal]}##{dom_id(field)}_field)
104
+ end
105
+
106
+ def dom_id(field)
107
+ (@dom_id ||= {})[field.name] ||=
108
+ [
109
+ @object_name.to_s.gsub(/\]\[|[^-a-zA-Z0-9:.]/, '_').sub(/_$/, ''),
110
+ options[:index],
111
+ field.method_name,
112
+ ].reject(&:blank?).join('_')
113
+ end
114
+
115
+ def dom_name(field)
116
+ (@dom_name ||= {})[field.name] ||= %(#{@object_name}#{options[:index] && "[#{options[:index]}]"}[#{field.method_name}]#{field.is_a?(Config::Fields::Association) && field.multiple? ? '[]' : ''})
117
+ end
118
+
119
+ def hidden_field(method, options = {})
120
+ if method == :id && object.id.is_a?(Array)
121
+ super method, {value: RailsAdmin.config.composite_keys_serializer.serialize(object.id)}
122
+ else
123
+ super
124
+ end
125
+ end
126
+
127
+ protected
128
+
129
+ def generator_action(action, nested)
130
+ if nested
131
+ action = :nested
132
+ elsif @template.request.format == 'text/javascript'
133
+ action = :modal
134
+ end
135
+
136
+ action
137
+ end
138
+
139
+ def visible_groups(model_config, action)
140
+ model_config.send(action).with(
141
+ form: self,
142
+ object: @object,
143
+ view: @template,
144
+ controller: @template.controller,
145
+ ).visible_groups
146
+ end
147
+
148
+ def without_field_error_proc_added_div
149
+ default_field_error_proc = ::ActionView::Base.field_error_proc
150
+ begin
151
+ ::ActionView::Base.field_error_proc = proc { |html_tag, _instance| html_tag }
152
+ yield
153
+ ensure
154
+ ::ActionView::Base.field_error_proc = default_field_error_proc
155
+ end
156
+ end
157
+
158
+ private
159
+
160
+ def nested_field_association?(field, nested_in)
161
+ field.inverse_of.presence && nested_in.presence && field.inverse_of == nested_in.name &&
162
+ (@template.instance_variable_get(:@model_config).abstract_model == field.abstract_model ||
163
+ field.name == nested_in.inverse_of)
164
+ end
165
+ end
166
+ end
@@ -0,0 +1,10 @@
1
+ <% actions(:root).select(&:show_in_navigation).each do |action| %>
2
+ <% path = rails_admin.url_for(action: action.action_name, controller: "rails_admin/main") %>
3
+ <li class="nav-item <%= "#{action.action_name}_root_link" %>">
4
+ <%= link_to wording_for(:menu, action), path, class: "nav-link #{'active' if current_page?(path)}", data: (action.turbo? ? {} : { turbo: "false" }) %>
5
+ </li>
6
+ <% end %>
7
+
8
+ <%= main_navigation %>
9
+ <%= root_navigation %>
10
+ <%= static_navigation %>
@@ -0,0 +1,32 @@
1
+ <meta content="IE=edge" http-equiv="X-UA-Compatible">
2
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
3
+ <meta name="viewport" content="width=device-width, initial-scale=1">
4
+ <meta content="NONE,NOARCHIVE" name="robots">
5
+ <meta content="false" name="turbo-prefetch">
6
+ <%= csrf_meta_tag %>
7
+ <% case RailsAdmin::config.asset_source
8
+ when :webpacker %>
9
+ <%= stylesheet_pack_tag "rails_admin", data: {'turbo-track': 'reload'} %>
10
+ <%= javascript_pack_tag "rails_admin", defer: true, data: {'turbo-track': 'reload'} %>
11
+ <% when :sprockets %>
12
+ <% handle_asset_dependency_error do %>
13
+ <%= stylesheet_link_tag "rails_admin/application.css", media: :all, data: {'turbo-track': 'reload'} %>
14
+ <%= javascript_include_tag "rails_admin/application.js", defer: true, data: {'turbo-track': 'reload'} %>
15
+ <% end %>
16
+ <% when :vite %>
17
+ <%= vite_javascript_tag "rails_admin", defer: true, data: {'turbo-track': 'reload'} %>
18
+ <% when :webpack %>
19
+ <%= stylesheet_link_tag "rails_admin.css", media: :all, data: {'turbo-track': 'reload'} %>
20
+ <%= javascript_include_tag "rails_admin.js", defer: true, data: {'turbo-track': 'reload'} %>
21
+ <% when :importmap %>
22
+ <%= stylesheet_link_tag "rails_admin.css", media: :all, data: {'turbo-track': 'reload'} %>
23
+ <%= javascript_inline_importmap_tag(RailsAdmin::Engine.importmap.to_json(resolver: self)) %>
24
+ <%= javascript_importmap_module_preload_tags(RailsAdmin::Engine.importmap) %>
25
+ <%= javascript_importmap_shim_nonce_configuration_tag if respond_to? :javascript_importmap_shim_nonce_configuration_tag %>
26
+ <%= javascript_importmap_shim_tag if respond_to? :javascript_importmap_shim_tag %>
27
+ <%= # Preload jQuery and make it global, unless jQuery UI fails to initialize
28
+ tag.script "import jQuery from 'jquery'; window.jQuery = jQuery;".html_safe, type: "module" %>
29
+ <%= javascript_import_module_tag 'rails_admin' %>
30
+ <% else
31
+ raise "Unknown asset_source: #{RailsAdmin::config.asset_source}"
32
+ end %>
@@ -0,0 +1,43 @@
1
+ <title><%= "#{@abstract_model.try(:pretty_name) || @page_name} | #{[_get_plugin_name[0] || 'Rails', _get_plugin_name[1] || 'Admin'].join(' ')}" %></title>
2
+
3
+ <header class="row align-items-center gx-4 gy-0 gx-md-5 mb-6 mb-md-7" data-model="<%= @abstract_model.to_param %>">
4
+ <div class="col-15 col-md-17 col-lg-19 flex-grow-1 me-auto">
5
+ <nav aria-label="breadcrumb">
6
+ <%= breadcrumb %>
7
+ </nav>
8
+ <h1 class="text-truncate mb-0"><%= @page_name %></h1>
9
+ </div>
10
+ <!-- if md breakpoint -->
11
+ <div class="col-auto d-none d-md-flex">
12
+ <%= link_to (icon "fa-solid", "info-circle"), "https://www.swopthemes.com/", class: "fs-4 link link-scalable link-white", target: "_blank" %>
13
+ </div>
14
+ <!-- if md breakpoint -->
15
+ <div class="col-auto d-none d-md-flex">
16
+ <%= link_to (icon "fa-brands", "github"), "https://github.com/Kamz16/swop", class: "fs-4 link link-scalable link-white", target: "_blank" %>
17
+ </div>
18
+ <div class="col-auto gx-6 gx-md-7">
19
+ <div class="dropdown">
20
+ <button class="btn border-0 p-0" type="button" data-bs-toggle="dropdown" aria-expanded="false">
21
+ <div class="img-wrapper img-wrapper-avatar">
22
+ <%= [RailsAdmin::Config.show_gravatar && image_tag(gravatar_url(_current_user.email), alt: _current_user.name),].filter(&:present?).join.html_safe %>
23
+ </div>
24
+ </button>
25
+ <ul class="dropdown-menu dropdown-menu-end">
26
+ <li><%= edit_user_link %></li>
27
+ <li><%= link_to "#{icon "fa-solid", "right-from-bracket", class: "fa-sm fa-fw me-2"}Log out".html_safe, logout_path, method: logout_method, class: "dropdown-item", data: {turbo: 'false'} %></li>
28
+ </ul>
29
+ </div>
30
+ </div>
31
+ <!-- unless xl breakpoint -->
32
+ <div class="col-auto gx-6 gx-md-7 d-xl-none">
33
+ <button class="navbar-toggler" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasNavbar" aria-controls="offcanvasNavbar" aria-label="Toggle navigation">
34
+ <%= icon "fa-solid", "bars", class: "fs-3 text-white" %>
35
+ </button>
36
+ </div>
37
+ </header>
38
+
39
+ <div class="offcanvas offcanvas-start" tabindex="-1" id="offcanvasNavbar" aria-labelledby="offcanvasNavbarLabel">
40
+ <div class="offcanvas-body sidebar list-unstyled p-4 p-md-6 p-lg-7">
41
+ <%= render partial: "layouts/rails_admin/custom_navigation" %>
42
+ </div>
43
+ </div>