cm-admin 1.1.9 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
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