cm-admin 1.1.9 → 1.2.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 (145) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/app/assets/javascripts/cm_admin/scaffolds.js +6 -0
  4. data/app/assets/javascripts/cm_admin/shared_scaffolds.js +97 -81
  5. data/app/assets/stylesheets/cm_admin/base/form.scss +31 -225
  6. data/app/assets/stylesheets/cm_admin/base/navbar.scss +1 -1
  7. data/app/assets/stylesheets/cm_admin/base/scaffold.scss +8 -5
  8. data/app/assets/stylesheets/cm_admin/base/show.scss +15 -22
  9. data/app/assets/stylesheets/cm_admin/base/table.scss +6 -0
  10. data/app/assets/stylesheets/cm_admin/components/_buttons.scss +1 -1
  11. data/app/assets/stylesheets/cm_admin/components/_modal.scss +7 -30
  12. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_accordion.scss +158 -0
  13. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_alert.scss +68 -0
  14. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_badge.scss +38 -0
  15. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_breadcrumb.scss +40 -0
  16. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_button-group.scss +142 -0
  17. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_buttons.scss +207 -0
  18. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_card.scss +239 -0
  19. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_carousel.scss +244 -0
  20. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_close.scss +63 -0
  21. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_containers.scss +41 -0
  22. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_dropdown.scss +250 -0
  23. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_forms.scss +9 -0
  24. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_functions.scss +302 -0
  25. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_grid.scss +39 -0
  26. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_helpers.scss +12 -0
  27. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_images.scss +42 -0
  28. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_list-group.scss +197 -0
  29. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_maps.scss +174 -0
  30. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_mixins.scss +42 -0
  31. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_modal.scss +237 -0
  32. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_nav.scss +197 -0
  33. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_navbar.scss +289 -0
  34. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_offcanvas.scss +146 -0
  35. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_pagination.scss +109 -0
  36. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_placeholders.scss +51 -0
  37. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_popover.scss +196 -0
  38. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_progress.scss +68 -0
  39. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_reboot.scss +610 -0
  40. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_root.scss +184 -0
  41. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_spinners.scss +85 -0
  42. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_tables.scss +171 -0
  43. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_toasts.scss +73 -0
  44. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_tooltip.scss +119 -0
  45. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_transitions.scss +27 -0
  46. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_type.scss +106 -0
  47. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_utilities.scss +806 -0
  48. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_variables-dark.scss +85 -0
  49. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_variables.scss +1745 -0
  50. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/bootstrap-grid.scss +62 -0
  51. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/bootstrap-reboot.scss +10 -0
  52. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/bootstrap-utilities.scss +19 -0
  53. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/bootstrap.scss +52 -0
  54. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/forms/_floating-labels.scss +95 -0
  55. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/forms/_form-check.scss +188 -0
  56. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/forms/_form-control.scss +214 -0
  57. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/forms/_form-range.scss +91 -0
  58. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/forms/_form-select.scss +80 -0
  59. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/forms/_form-text.scss +11 -0
  60. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/forms/_input-group.scss +132 -0
  61. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/forms/_labels.scss +36 -0
  62. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/forms/_validation.scss +12 -0
  63. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/helpers/_clearfix.scss +3 -0
  64. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/helpers/_color-bg.scss +7 -0
  65. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/helpers/_colored-links.scss +30 -0
  66. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/helpers/_focus-ring.scss +5 -0
  67. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/helpers/_icon-link.scss +25 -0
  68. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/helpers/_position.scss +36 -0
  69. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/helpers/_ratio.scss +26 -0
  70. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/helpers/_stacks.scss +15 -0
  71. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/helpers/_stretched-link.scss +15 -0
  72. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/helpers/_text-truncation.scss +7 -0
  73. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/helpers/_visually-hidden.scss +8 -0
  74. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/helpers/_vr.scss +8 -0
  75. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_alert.scss +18 -0
  76. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_backdrop.scss +14 -0
  77. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_banner.scss +7 -0
  78. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_border-radius.scss +78 -0
  79. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_box-shadow.scss +18 -0
  80. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_breakpoints.scss +127 -0
  81. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_buttons.scss +70 -0
  82. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_caret.scss +69 -0
  83. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_clearfix.scss +9 -0
  84. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_color-mode.scss +21 -0
  85. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_color-scheme.scss +7 -0
  86. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_container.scss +11 -0
  87. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_deprecate.scss +10 -0
  88. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_forms.scss +153 -0
  89. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_gradients.scss +47 -0
  90. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_grid.scss +151 -0
  91. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_image.scss +16 -0
  92. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_list-group.scss +26 -0
  93. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_lists.scss +7 -0
  94. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_pagination.scss +10 -0
  95. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_reset-text.scss +17 -0
  96. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_resize.scss +6 -0
  97. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_table-variants.scss +24 -0
  98. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_text-truncate.scss +8 -0
  99. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_transition.scss +26 -0
  100. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_utilities.scss +97 -0
  101. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_visually-hidden.scss +33 -0
  102. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/tests/jasmine.js +16 -0
  103. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/tests/mixins/_color-modes.test.scss +69 -0
  104. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/tests/mixins/_media-query-color-mode-full.test.scss +8 -0
  105. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/tests/mixins/_utilities.test.scss +393 -0
  106. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/tests/sass-true/register.js +14 -0
  107. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/tests/sass-true/runner.js +17 -0
  108. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/tests/utilities/_api.test.scss +75 -0
  109. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/utilities/_api.scss +47 -0
  110. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/vendor/_rfs.scss +348 -0
  111. data/app/controllers/cm_admin/resource_controller.rb +22 -5
  112. data/app/helpers/cm_admin/application_helper.rb +4 -4
  113. data/app/views/cm_admin/main/_actions_dropdown.html.slim +2 -2
  114. data/app/views/cm_admin/main/_custom_action_modal_form.html.slim +6 -0
  115. data/app/views/cm_admin/main/_nested_fields.html.slim +36 -17
  116. data/app/views/cm_admin/main/_nested_table_form.html.slim +17 -8
  117. data/app/views/cm_admin/main/_nested_table_section.html.slim +17 -0
  118. data/app/views/cm_admin/main/_show_section.html.slim +10 -0
  119. data/app/views/cm_admin/main/_tabs.html.slim +1 -1
  120. data/app/views/cm_admin/main/_top_navbar.html.slim +9 -3
  121. data/app/views/cm_admin/main/associated_show.html.slim +5 -4
  122. data/app/views/cm_admin/main/edit.html.slim +18 -18
  123. data/app/views/cm_admin/main/history.html.slim +3 -3
  124. data/app/views/cm_admin/main/import_form.html.slim +1 -1
  125. data/app/views/cm_admin/main/new.html.slim +17 -17
  126. data/app/views/cm_admin/main/show.html.slim +10 -10
  127. data/app/views/layouts/_custom_action_modal.html.slim +11 -0
  128. data/app/views/layouts/_custom_action_modals.html.slim +13 -9
  129. data/app/views/layouts/_destroy_action_modal.html.slim +16 -0
  130. data/app/views/layouts/cm_admin.html.slim +5 -5
  131. data/config/routes.rb +1 -3
  132. data/lib/cm_admin/model.rb +1 -0
  133. data/lib/cm_admin/models/custom_action.rb +6 -0
  134. data/lib/cm_admin/models/dsl_method.rb +9 -4
  135. data/lib/cm_admin/models/field.rb +2 -1
  136. data/lib/cm_admin/models/form_field.rb +2 -1
  137. data/lib/cm_admin/models/row.rb +40 -0
  138. data/lib/cm_admin/models/section.rb +20 -3
  139. data/lib/cm_admin/version.rb +1 -1
  140. data/lib/cm_admin/view_helpers/field_display_helper.rb +3 -3
  141. data/lib/cm_admin/view_helpers/form_field_helper.rb +40 -14
  142. data/lib/cm_admin/view_helpers/form_helper.rb +59 -22
  143. data/lib/cm_admin/view_helpers/page_info_helper.rb +4 -4
  144. data/lib/cm_admin/view_helpers.rb +1 -1
  145. metadata +107 -2
@@ -13,7 +13,7 @@
13
13
  / p.success-msg-info An email will be sent once the process is completed. If there are any problems with the import, we'll let you know through an email.
14
14
  .actions-wrapper
15
15
  a.btn-secondary href="#{cm_admin.send(:"#{@model.name.underscore}_import_path")}" Import new data
16
- / button.cta-btn.ml-2 Back to Page_Name
16
+ / button.cta-btn.ms-2 Back to Page_Name
17
17
  - else
18
18
  = simple_form_for(FileImport.new, url: "/admin/#{@model.ar_model.table_name}/import", method: :post, html: { class: "csv-import-form" }) do |f|
19
19
  .form-card
@@ -1,19 +1,19 @@
1
- == render 'cm_admin/main/top_navbar'
2
1
  .form-page
3
- .form-page__inner
4
- .form-wrapper
5
- - if @ar_object.errors.present?
6
- .flag-alert.mb-4
7
- p.alert-header
8
- span
9
- i.fa.fa-exclamation-triangle
10
- | Attention
11
- .alert-body
12
- p.body-title
13
- | Error saving #{@ar_object.class}
14
- p.body-info
15
- ul
16
- - @ar_object.errors.full_messages.each do |error_message|
17
- li = error_message
2
+ .form-page__header
3
+ == render 'cm_admin/main/top_navbar'
4
+ .form-page__body
5
+ - if @ar_object.errors.present?
6
+ .flag-alert.mb-4
7
+ p.alert-header
8
+ span
9
+ i.fa.fa-exclamation-triangle
10
+ | Attention
11
+ .alert-body
12
+ p.body-title
13
+ | Error saving #{@ar_object.class}
14
+ p.body-info
15
+ ul
16
+ - @ar_object.errors.full_messages.each do |error_message|
17
+ li = error_message
18
18
 
19
- = generate_form(@ar_object, @model)
19
+ = generate_form(@ar_object, @model)
@@ -1,15 +1,15 @@
1
- .show-page.cm-page-container
2
- .show-page__header.sticky-container.page-top-bar
1
+ .show-page
2
+ .show-page__header.page-top-bar
3
3
  == render 'cm_admin/main/top_navbar'
4
4
  == render 'cm_admin/main/tabs'
5
- .show-page__inner.scrollable
5
+ .show-page__inner
6
6
  - if @action.partial
7
7
  == render @action.partial
8
8
  - else
9
- - @model.available_fields[:show].each do |section|
10
- - if section.display_if.call(@ar_object)
11
- .info-section
12
- p.section-heading = section.section_name
13
- .paper
14
- - section.section_fields.each do |field|
15
- = show_field(@ar_object, field)
9
+ - @model.available_fields[:show].each do |entity|
10
+ .row
11
+ - if entity.class == CmAdmin::Models::Row
12
+ - entity.sections.each do |section|
13
+ = render partial: 'cm_admin/main/show_section', locals: { section: section }
14
+ - elsif entity.class == CmAdmin::Models::Section
15
+ = render partial: 'cm_admin/main/show_section', locals: { section: entity }
@@ -0,0 +1,11 @@
1
+ .modal.fade id="#{custom_action.name.classify}Modal-#{ar_object.id}" aria-hidden="true" aria-labelledby="#{custom_action.name.classify}ModalLabel" tabindex="1"
2
+ .modal-dialog
3
+ .modal-content
4
+ .modal-header
5
+ h5.modal-title id="#{custom_action.name.classify}ModalLabel" = custom_action.modal_configuration[:title] || custom_action.name.classify
6
+ button.btn-close aria-label="Close" data-bs-dismiss="modal" type="button"
7
+ .modal-body
8
+ - if custom_action.partial
9
+ = render partial: custom_action.partial
10
+ - else
11
+ = render partial: 'cm_admin/main/custom_action_modal_form', locals: { custom_action: custom_action, ar_object: ar_object }
@@ -1,12 +1,16 @@
1
1
  - custom_action_with_modals = @model.available_actions.select{ |act| act if act.display_type == :modal }
2
+ - destroy_action = available_actions(@model, 'destroy')
2
3
  - if @associated_model
3
4
  - custom_action_with_modals += @associated_model.available_actions.select{ |act| act if act.display_type == :modal }
4
- - custom_action_with_modals.each do |custom_action|
5
- .modal.fade id="#{custom_action.name.classify}Modal" aria-hidden="true" aria-labelledby="#{custom_action.name.classify}ModalLabel" tabindex="1"
6
- .modal-dialog
7
- .modal-content
8
- .modal-header
9
- h5.modal-title id="#{custom_action.name.classify}ModalLabel" = custom_action.name.classify
10
- button.btn-close aria-label="Close" data-bs-dismiss="modal" type="button"
11
- .modal-body
12
- = render partial: custom_action.partial
5
+
6
+ - if @current_action&.name == 'index'
7
+ - @ar_object.data.each do |ar_object|
8
+ - custom_action_with_modals.each do |custom_action|
9
+ = render partial: '/layouts/custom_action_modal', locals: { custom_action: custom_action, ar_object: ar_object }
10
+ - if destroy_action
11
+ = render partial: '/layouts/destroy_action_modal', locals: { ar_object: ar_object }
12
+ - elsif @current_action&.name == 'show'
13
+ - custom_action_with_modals.each do |custom_action|
14
+ = render partial: '/layouts/custom_action_modal', locals: { custom_action: custom_action, ar_object: @ar_object }
15
+ - if destroy_action
16
+ = render partial: '/layouts/destroy_action_modal', locals: { ar_object: @ar_object }
@@ -0,0 +1,16 @@
1
+ .modal.fade id="#{@model.name.classify}DestroyModal-#{ar_object.id}" aria-hidden="true" aria-labelledby="#{@model.name.classify}DestroyModalLabel" tabindex="1"
2
+ .modal-dialog
3
+ .modal-content
4
+ .modal-header
5
+ h5.modal-title id="#{@model.name.classify}DestroyModalLabel" = "#{@model.name.classify} Destroy"
6
+ button.btn-close aria-label="Close" data-bs-dismiss="modal" type="button"
7
+ .modal-body
8
+ .custom-modal-body
9
+ .modal-info data-section="bulk-action"
10
+ | Are you sure you want to delete this #{@model.name.classify}
11
+ .modal-footer
12
+ = button_to cm_admin.send("#{@model.name.underscore}_destroy_path", ar_object.id), method: :delete, class: "btn btn-primary" do
13
+ span
14
+ i.fa.fa-trash
15
+ | Destroy
16
+
@@ -24,15 +24,15 @@ html
24
24
  = render 'layouts/left_sidebar_nav'
25
25
  .panel-area
26
26
  - if defined?(@action) && (@action&.layout_type.to_s == 'cm_association_show' || @action.parent == "show")
27
- .show-page.cm-page-container
28
- .show-page__header.sticky-container.page-top-bar
27
+ .show-page
28
+ .show-page__header.page-top-bar
29
29
  == render 'cm_admin/main/top_navbar'
30
30
  == render 'cm_admin/main/tabs'
31
- .show-page__inner.scrollable
31
+ .show-page__inner
32
32
  = yield
33
33
  - elsif defined?(@action) && (@action&.layout_type.to_s == 'cm_association_index' || @action.parent == "index")
34
- .show-page.cm-page-container
35
- .show-page__header.sticky-container.page-top-bar
34
+ .show-page
35
+ .show-page__header.page-top-bar
36
36
  == render 'cm_admin/main/top_navbar'
37
37
  - if @ar_object.model_name
38
38
  == render 'cm_admin/main/tabs'
data/config/routes.rb CHANGED
@@ -21,9 +21,7 @@ CmAdmin::Engine.routes.draw do
21
21
  scope model.name.tableize do
22
22
  # Define route only when action trail related field is present
23
23
  if act.name == 'history'
24
- if defined?(model.ar_model.new.current_action_name)
25
- send(:get, ':id/history', to: "#{model.name.underscore}#history", as: "#{model.name.underscore}_history")
26
- end
24
+ send(:get, ':id/history', to: "#{model.name.underscore}#history", as: "#{model.name.underscore}_history")
27
25
  else
28
26
  send(act.verb, act.path.present? ? act.path : act.name, to: "#{model.name.underscore}##{act.name}", as: "#{model.name.underscore}_#{act.name}")
29
27
  end
@@ -10,6 +10,7 @@ require_relative 'models/column'
10
10
  require_relative 'models/filter'
11
11
  require_relative 'models/export'
12
12
  require_relative 'models/section'
13
+ require_relative 'models/row'
13
14
  require_relative 'models/tab'
14
15
  require_relative 'models/dsl_method'
15
16
  require 'pagy'
@@ -3,6 +3,12 @@ require_relative 'actions/blocks'
3
3
  module CmAdmin
4
4
  module Models
5
5
  class CustomAction < Action
6
+ attr_accessor :modal_configuration
7
+
8
+ def initialize(attributes = {}, &block)
9
+ super
10
+ end
11
+
6
12
  class << self
7
13
  def find_by(model, search_hash)
8
14
  model.available_actions.find { |i| i.name == search_hash[:name] }
@@ -60,9 +60,14 @@ module CmAdmin
60
60
  yield if block
61
61
  end
62
62
 
63
- def cm_section(section_name, display_if: nil, &block)
63
+ def row(display_if: nil, &block)
64
64
  @available_fields[@current_action.name.to_sym] ||= []
65
- @available_fields[@current_action.name.to_sym] << CmAdmin::Models::Section.new(section_name, @current_action, @model, display_if, &block)
65
+ @available_fields[@current_action.name.to_sym] << CmAdmin::Models::Row.new(@current_action, @model, display_if, &block)
66
+ end
67
+
68
+ def cm_section(section_name, display_if: nil, col_size: nil, &block)
69
+ @available_fields[@current_action.name.to_sym] ||= []
70
+ @available_fields[@current_action.name.to_sym] << CmAdmin::Models::Section.new(section_name, @current_action, @model, display_if, col_size, &block)
66
71
  end
67
72
 
68
73
  # This method is deprecated. Use cm_section instead.
@@ -116,13 +121,13 @@ module CmAdmin
116
121
  # end
117
122
  # end
118
123
  # end
119
- def custom_action(name: nil, page_title: nil, page_description: nil, display_name: nil, verb: nil, layout: nil, layout_type: nil, partial: nil, path: nil, display_type: nil, display_if: lambda { |arg| return true }, route_type: nil, icon_name: 'fa fa-th-large', &block)
124
+ def custom_action(name: nil, page_title: nil, page_description: nil, display_name: nil, verb: nil, layout: nil, layout_type: nil, partial: nil, path: nil, display_type: nil, modal_configuration: {}, display_if: lambda { |arg| return true }, route_type: nil, icon_name: 'fa fa-th-large', &block)
120
125
  action = CmAdmin::Models::CustomAction.new(
121
126
  page_title: page_title, page_description: page_description,
122
127
  name: name, display_name: display_name, verb: verb, layout: layout,
123
128
  layout_type: layout_type, partial: partial, path: path,
124
129
  parent: self.current_action.name, display_type: display_type, display_if: display_if,
125
- action_type: :custom, route_type: route_type, icon_name: icon_name, &block)
130
+ action_type: :custom, route_type: route_type, icon_name: icon_name, modal_configuration: modal_configuration, &block)
126
131
  @available_actions << action
127
132
  # self.class.class_eval(&block)
128
133
  end
@@ -7,7 +7,7 @@ module CmAdmin
7
7
 
8
8
  attr_accessor :field_name, :label, :header, :field_type, :format, :precision, :height,
9
9
  :width, :helper_method, :preview, :custom_link, :prefix, :suffix, :tag_class,
10
- :display_if, :association_name, :association_type
10
+ :display_if, :association_name, :association_type, :col_size
11
11
 
12
12
  def initialize(field_name, attributes = {})
13
13
  @field_name = field_name
@@ -24,6 +24,7 @@ module CmAdmin
24
24
 
25
25
  def set_default_values
26
26
  self.tag_class = {}
27
+ self.col_size = nil
27
28
  end
28
29
  end
29
30
  end
@@ -6,7 +6,7 @@ module CmAdmin
6
6
  include Utils::Helpers
7
7
 
8
8
  attr_accessor :field_name, :label, :header, :input_type, :collection, :disabled, :helper_method,
9
- :placeholder, :display_if, :html_attr, :target
9
+ :placeholder, :display_if, :html_attr, :target, :col_size
10
10
 
11
11
  VALID_INPUT_TYPES = %i[
12
12
  integer decimal string single_select multi_select date date_time text
@@ -30,6 +30,7 @@ module CmAdmin
30
30
  self.input_type = :string
31
31
  self.html_attr = {}
32
32
  self.target = {}
33
+ self.col_size = nil
33
34
  end
34
35
 
35
36
  def set_default_placeholder
@@ -0,0 +1,40 @@
1
+ module CmAdmin
2
+ module Models
3
+ class Row
4
+
5
+ # Description
6
+ # A row is like a container which holds a list of form_field or section.
7
+ # These list of fields or section are iterated and displayed on new/edit page.
8
+ # A row is like a wrapper on the HTML, which adds a div element 'row' class from bootstrap.
9
+
10
+ attr_accessor :sections, :display_if, :row_fields
11
+
12
+ def initialize(current_action, cm_model, display_if, &block)
13
+ @sections = []
14
+ @row_fields = []
15
+ @display_if = display_if || lambda { |arg| return true }
16
+ @current_action = current_action
17
+ @cm_model = cm_model
18
+ instance_eval(&block)
19
+ end
20
+
21
+ def form_field(field_name, options={}, arg=nil)
22
+ if @current_action.is_nested_field
23
+ @nested_table_fields[@current_action.nested_table_name] ||= []
24
+ @nested_table_fields[@current_action.nested_table_name] << CmAdmin::Models::FormField.new(field_name, options[:input_type], options)
25
+ else
26
+ @row_fields << CmAdmin::Models::FormField.new(field_name, options[:input_type], options)
27
+ end
28
+ end
29
+
30
+ def cm_section(section_name, col_size: nil, display_if: nil, &block)
31
+ @sections << CmAdmin::Models::Section.new(section_name, @current_action, @model, display_if, col_size, &block)
32
+ end
33
+
34
+ # This method is deprecated. Use cm_section instead.
35
+ def cm_show_section(section_name, col_size: nil, display_if: nil, &block)
36
+ cm_section(section_name, col_size: col_size, display_if: display_if, &block)
37
+ end
38
+ end
39
+ end
40
+ end
@@ -2,11 +2,18 @@ module CmAdmin
2
2
  module Models
3
3
  class Section
4
4
 
5
- attr_accessor :section_name, :section_fields, :display_if, :current_action, :cm_model, :nested_table_fields
5
+ # Description
6
+ # A section is like a container which holds a list of fields or form fields
7
+ # These list of fields are iterated and displayed on show/new/edit page.
8
+ # It also contains rows, which contains sections and fields.
6
9
 
7
- def initialize(section_name, current_action, cm_model, display_if, &block)
10
+ attr_accessor :section_name, :section_fields, :display_if, :current_action, :cm_model, :nested_table_fields, :rows, :col_size
11
+
12
+ def initialize(section_name, current_action, cm_model, display_if, col_size, &block)
8
13
  @section_fields = []
14
+ @rows = []
9
15
  @nested_table_fields = {}
16
+ @col_size = col_size
10
17
  @section_name = section_name
11
18
  @current_action = current_action
12
19
  @cm_model = cm_model
@@ -15,7 +22,12 @@ module CmAdmin
15
22
  end
16
23
 
17
24
  def field(field_name, options={})
18
- @section_fields << CmAdmin::Models::Field.new(field_name, options)
25
+ if @current_action.is_nested_field
26
+ @nested_table_fields[@current_action.nested_table_name] ||= []
27
+ @nested_table_fields[@current_action.nested_table_name] << CmAdmin::Models::Field.new(field_name, options)
28
+ else
29
+ @section_fields << CmAdmin::Models::Field.new(field_name, options)
30
+ end
19
31
  end
20
32
 
21
33
  def form_field(field_name, options={}, arg=nil)
@@ -33,6 +45,11 @@ module CmAdmin
33
45
  yield
34
46
  end
35
47
 
48
+ def row(display_if: nil, &block)
49
+ @rows ||= []
50
+ @rows << CmAdmin::Models::Row.new(@current_action, @model, display_if, &block)
51
+ end
52
+
36
53
  end
37
54
  end
38
55
  end
@@ -1,3 +1,3 @@
1
1
  module CmAdmin
2
- VERSION = '1.1.9'
2
+ VERSION = '1.2.0'
3
3
  end
@@ -3,14 +3,14 @@ module CmAdmin
3
3
  module FieldDisplayHelper
4
4
  def show_field(ar_object, field)
5
5
  return unless field.display_if.call(ar_object)
6
- content_tag(:div, class: "info-split") do
6
+ content_tag(:div, class: "card-info") do
7
7
  concat show_field_label(ar_object, field)
8
8
  concat value_with_prefix_and_suffix(ar_object, field)
9
9
  end
10
10
  end
11
11
 
12
12
  def show_field_label(ar_object, field)
13
- content_tag(:div, class: "info-split__lhs") do
13
+ content_tag(:div, class: "card-info__label") do
14
14
  field_label = if field.label.present?
15
15
  field.label.to_s
16
16
  elsif field.association_type.to_s == "polymorphic"
@@ -24,7 +24,7 @@ module CmAdmin
24
24
 
25
25
  def value_with_prefix_and_suffix(ar_object, field)
26
26
  value = show_field_value(ar_object, field)
27
- content_tag(:div, class: "info-split__rhs") do
27
+ content_tag(:div, class: "card-info__description") do
28
28
  concat field.prefix
29
29
  concat value
30
30
  concat field.suffix
@@ -13,7 +13,7 @@ module CmAdmin
13
13
 
14
14
  def cm_integer_field(form_obj, cm_field, value, required_class, _target_action)
15
15
  form_obj.text_field cm_field.field_name,
16
- class: "normal-input #{required_class}",
16
+ class: "field-control #{required_class}",
17
17
  disabled: cm_field.disabled,
18
18
  value: value,
19
19
  placeholder: cm_field.placeholder,
@@ -22,7 +22,7 @@ module CmAdmin
22
22
 
23
23
  def cm_decimal_field(form_obj, cm_field, value, required_class, _target_action)
24
24
  form_obj.number_field cm_field.field_name,
25
- class: "normal-input #{required_class}",
25
+ class: "field-control #{required_class}",
26
26
  disabled: cm_field.disabled,
27
27
  value: value,
28
28
  placeholder: cm_field.placeholder,
@@ -31,7 +31,7 @@ module CmAdmin
31
31
 
32
32
  def cm_string_field(form_obj, cm_field, value, required_class, _target_action)
33
33
  form_obj.text_field cm_field.field_name,
34
- class: "normal-input #{required_class}",
34
+ class: "field-control #{required_class}",
35
35
  disabled: cm_field.disabled,
36
36
  value: value,
37
37
  placeholder: cm_field.placeholder
@@ -40,7 +40,7 @@ module CmAdmin
40
40
  def cm_single_select_field(form_obj, cm_field, value, required_class, target_action)
41
41
  form_obj.select cm_field.field_name, options_for_select(select_collection_value(form_obj.object, cm_field), form_obj.object.send(cm_field.field_name)),
42
42
  { include_blank: cm_field.placeholder },
43
- class: "normal-input #{required_class} select-2",
43
+ class: "field-control #{required_class} select-2",
44
44
  disabled: cm_field.disabled,
45
45
  data: {
46
46
  field_name: cm_field.field_name,
@@ -54,13 +54,13 @@ module CmAdmin
54
54
  form_obj.select cm_field.field_name,
55
55
  options_for_select(select_collection_value(form_obj.object, cm_field), form_obj.object.send(cm_field.field_name)),
56
56
  { include_blank: cm_field.placeholder },
57
- class: "normal-input #{required_class} select-2",
57
+ class: "field-control #{required_class} select-2",
58
58
  disabled: cm_field.disabled, multiple: true
59
59
  end
60
60
 
61
61
  def cm_date_field(form_obj, cm_field, value, required_class, _target_action)
62
62
  form_obj.text_field cm_field.field_name,
63
- class: "normal-input #{required_class}",
63
+ class: "field-control #{required_class}",
64
64
  disabled: cm_field.disabled,
65
65
  value: value&.strftime('%d-%m-%Y'),
66
66
  placeholder: cm_field.placeholder,
@@ -69,7 +69,7 @@ module CmAdmin
69
69
 
70
70
  def cm_date_time_field(form_obj, cm_field, value, required_class, _target_action)
71
71
  form_obj.text_field cm_field.field_name,
72
- class: "normal-input #{required_class}",
72
+ class: "field-control #{required_class}",
73
73
  disabled: cm_field.disabled,
74
74
  value: value,
75
75
  placeholder: cm_field.placeholder,
@@ -78,22 +78,48 @@ module CmAdmin
78
78
 
79
79
  def cm_text_field(form_obj, cm_field, value, required_class, _target_action)
80
80
  form_obj.text_area cm_field.field_name,
81
- class: "normal-input #{required_class}",
81
+ class: "field-control #{required_class}",
82
82
  placeholder: cm_field.placeholder
83
83
  end
84
84
 
85
85
  def cm_rich_text_field(form_obj, cm_field, value, required_class, _target_action)
86
86
  form_obj.rich_text_area cm_field.field_name,
87
- class: "normal-input #{required_class}",
87
+ class: "field-control #{required_class}",
88
88
  placeholder: cm_field.placeholder
89
89
  end
90
90
 
91
91
  def cm_single_file_upload_field(form_obj, cm_field, _value, required_class, _target_action)
92
- form_obj.file_field cm_field.field_name, class: "normal-input #{required_class}"
92
+ content_tag(:div) do
93
+ concat form_obj.file_field cm_field.field_name, class: "normal-input #{required_class}"
94
+ concat attachment_list(form_obj, cm_field, _value, required_class, _target_action)
95
+ end
93
96
  end
94
97
 
95
98
  def cm_multi_file_upload_field(form_obj, cm_field, _value, required_class, _target_action)
96
- form_obj.file_field cm_field.field_name, multiple: true, class: "normal-input #{required_class}"
99
+ content_tag(:div) do
100
+ concat form_obj.file_field cm_field.field_name, multiple: true, class: "normal-input #{required_class}"
101
+ concat attachment_list(form_obj, cm_field, _value, required_class, _target_action)
102
+ end
103
+ end
104
+
105
+ def attachment_list(form_obj, cm_field, _value, required_class, _target_action)
106
+ attached = form_obj.object.send(cm_field.field_name)
107
+ content_tag(:div) do
108
+ if attached.class == ActiveStorage::Attached::Many
109
+ attached.each do |attachment|
110
+ concat attachment_with_icon(attachment)
111
+ end
112
+ else
113
+ concat attachment_with_icon(attached)
114
+ end
115
+ end
116
+ end
117
+
118
+ def attachment_with_icon(attachment)
119
+ content_tag(:div, class: 'destroy-attachment', data: { ar_id: attachment.id}) do
120
+ concat content_tag(:i, '', class: 'fa-solid fa-trash-can')
121
+ concat content_tag(:span, attachment.filename.to_s)
122
+ end
97
123
  end
98
124
 
99
125
  def cm_check_box_field(form_obj, cm_field, value, required_class, target_action)
@@ -128,7 +154,7 @@ module CmAdmin
128
154
  else
129
155
  form_obj.check_box cm_field.field_name,
130
156
  {
131
- class: "normal-input cm-checkbox #{required_class} #{target_action.present? ? 'linked-field-request' : ''}",
157
+ class: "field-control cm-checkbox #{required_class} #{target_action.present? ? 'linked-field-request' : ''}",
132
158
  disabled: cm_field.disabled,
133
159
  data: {
134
160
  field_name: cm_field.field_name,
@@ -158,7 +184,7 @@ module CmAdmin
158
184
  content_tag :div, class: 'cm-radio-tag' do
159
185
  concat form_obj.check_box cm_field.field_name,
160
186
  {
161
- class: "normal-input cm-checkbox #{required_class} #{target_action.present? ? 'linked-field-request' : ''}",
187
+ class: "field-control cm-checkbox #{required_class} #{target_action.present? ? 'linked-field-request' : ''}",
162
188
  disabled: cm_field.disabled,
163
189
  name: "#{@model.name.underscore}[#{cm_field.field_name}][]",
164
190
  data: {
@@ -186,7 +212,7 @@ module CmAdmin
186
212
 
187
213
  def format_radio_button(val, form_obj)
188
214
  content_tag :div, class: 'cm-radio-tag' do
189
- concat form_obj.radio_button :level, val, class: 'normal-input cm-radio'
215
+ concat form_obj.radio_button :level, val, class: 'field-control cm-radio'
190
216
  end
191
217
  end
192
218
  end
@@ -28,48 +28,85 @@ module CmAdmin
28
28
  set_form_for_fields(resource, columns, url, method)
29
29
  end
30
30
 
31
- def form_with_mentioned_fields(resource, sections_array, method)
31
+ def form_with_mentioned_fields(resource, entities, method)
32
32
  # columns = resource.class.columns.select { |i| available_fields.map(&:field_name).include?(i.name.to_sym) }
33
33
  table_name = resource.model_name.collection
34
34
  # columns.reject! { |i| REJECTABLE.include?(i.name) }
35
35
  url = CmAdmin::Engine.mount_path + "/#{table_name}/#{resource.id}"
36
- set_form_with_sections(resource, sections_array, url, method)
36
+ set_form_with_sections(resource, entities, url, method)
37
37
  end
38
38
 
39
- def split_form_into_section(resource, form_obj, sections_array)
39
+ def split_form_into_section(resource, form_obj, entities)
40
40
  content_tag :div do
41
- sections_array.each do |section|
41
+ entities.each do |entity|
42
+ if entity.class == CmAdmin::Models::Row
43
+ concat create_rows(resource, form_obj, entity)
44
+ elsif entity.class == CmAdmin::Models::Section
45
+ concat(content_tag(:div, class: 'row') do
46
+ concat create_sections(resource, form_obj, entity)
47
+ end)
48
+ end
49
+ end
50
+ end
51
+ end
52
+
53
+ def create_rows(resource, form_obj, row)
54
+ content_tag :div, class: 'row' do
55
+ row.sections.each do |section|
42
56
  concat create_sections(resource, form_obj, section)
43
57
  end
44
58
  end
45
59
  end
46
60
 
47
61
  def create_sections(resource, form_obj, section)
48
- content_tag :div, class: 'form-container' do
62
+ content_tag :div, class: 'col form-container' do
49
63
  concat content_tag(:p, section.section_name, class: 'form-title')
50
64
  concat set_form_for_fields(resource, form_obj, section)
51
65
  end
52
66
  end
53
67
 
68
+ def create_row_inside_section(resource, form_obj, rows)
69
+ rows.each do |row|
70
+ concat(content_tag(:div, class: 'row') do
71
+ row.row_fields.each do |field|
72
+ concat set_form_field(resource, form_obj, field)
73
+ end
74
+ end)
75
+ end
76
+ return
77
+ end
78
+
54
79
  def set_form_for_fields(resource, form_obj, section)
55
80
  content_tag(:div, class: 'form-container__inner') do
56
- section.section_fields.each do |field|
57
- next unless field.display_if.call(form_obj.object)
81
+ concat create_row_inside_section(resource, form_obj, section.rows) if section.rows.present?
82
+ concat set_form_fields(resource, form_obj, section.section_fields)
83
+ concat set_nested_form_fields(form_obj, section)
84
+ end
85
+ end
86
+
87
+ def set_form_fields(resource, form_obj, fields)
88
+ fields.each do |field|
89
+ concat(content_tag(:div, class: 'row') do
90
+ concat set_form_field(resource, form_obj, field)
91
+ end)
92
+ end
93
+ return
94
+ end
95
+
96
+ def set_form_field(resource, form_obj, field)
97
+ content_tag(:div, class: field.col_size ? "col-#{field.col_size}" : 'col') do
98
+ next unless field.display_if.call(form_obj.object)
58
99
 
59
- if field.input_type.eql?(:hidden)
100
+ if field.input_type.eql?(:hidden)
101
+ concat input_field_for_column(form_obj, field)
102
+ else
103
+ concat(content_tag(:div, class: "form-field #{field.disabled ? 'disabled' : ''}") do
104
+ concat form_obj.label field.label, field.label, class: 'field-label'
105
+ concat tag.br
60
106
  concat input_field_for_column(form_obj, field)
61
- else
62
- concat(content_tag(:div, class: "input-wrapper #{field.disabled ? 'disabled' : ''}") do
63
- concat form_obj.label field.label, field.label, class: 'field-label'
64
- concat tag.br
65
- concat(content_tag(:div, class: 'datetime-wrapper') do
66
- concat input_field_for_column(form_obj, field)
67
- end)
68
- concat tag.p resource.errors[field.field_name].first if resource.errors[field.field_name].present?
69
- end)
70
- end
107
+ concat tag.p resource.errors[field.field_name].first if resource.errors[field.field_name].present?
108
+ end)
71
109
  end
72
- concat set_nested_form_fields(form_obj, section)
73
110
  end
74
111
  end
75
112
 
@@ -81,7 +118,7 @@ module CmAdmin
81
118
  end
82
119
  end
83
120
 
84
- def set_form_with_sections(resource, sections_array, url, method)
121
+ def set_form_with_sections(resource, entities, url, method)
85
122
  form_for(resource, url: url, method: method, html: { class: "cm_#{resource.class.name.downcase}_form" } ) do |form_obj|
86
123
  if params[:referrer]
87
124
  concat form_obj.text_field "referrer", class: "normal-input", hidden: true, value: params[:referrer], name: 'referrer'
@@ -92,10 +129,10 @@ module CmAdmin
92
129
  elsif params[:associated_class] && params[:associated_id]
93
130
  concat form_obj.text_field params[:associated_class] + '_id', class: "normal-input", hidden: true, value: params[:associated_id]
94
131
  end
95
- concat split_form_into_section(resource, form_obj, sections_array)
132
+ concat split_form_into_section(resource, form_obj, entities)
96
133
  concat tag.br
97
134
  # TODO: form_submit class is used for JS functionality, Have to remove
98
- concat form_obj.submit 'Save', class: 'btn-cta mt-3 form_submit', data: {form_class: "cm_#{form_obj.object.class.name.downcase}_form"}
135
+ concat form_obj.submit 'Save', class: 'btn-cta form_submit', data: {form_class: "cm_#{form_obj.object.class.name.downcase}_form"}
99
136
  end
100
137
  end
101
138
  end