cm-admin 1.1.8 → 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 (153) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.vscode/settings.json +3 -0
  4. data/Gemfile.lock +1 -1
  5. data/app/assets/javascripts/cm_admin/scaffolds.js +6 -0
  6. data/app/assets/javascripts/cm_admin/shared_scaffolds.js +97 -81
  7. data/app/assets/stylesheets/cm_admin/base/form.scss +31 -225
  8. data/app/assets/stylesheets/cm_admin/base/navbar.scss +11 -38
  9. data/app/assets/stylesheets/cm_admin/base/quicksearch.scss +3 -4
  10. data/app/assets/stylesheets/cm_admin/base/scaffold.scss +8 -5
  11. data/app/assets/stylesheets/cm_admin/base/show.scss +17 -35
  12. data/app/assets/stylesheets/cm_admin/base/table.scss +8 -14
  13. data/app/assets/stylesheets/cm_admin/components/_buttons.scss +28 -140
  14. data/app/assets/stylesheets/cm_admin/components/_modal.scss +7 -30
  15. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_accordion.scss +158 -0
  16. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_alert.scss +68 -0
  17. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_badge.scss +38 -0
  18. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_breadcrumb.scss +40 -0
  19. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_button-group.scss +142 -0
  20. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_buttons.scss +207 -0
  21. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_card.scss +239 -0
  22. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_carousel.scss +244 -0
  23. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_close.scss +63 -0
  24. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_containers.scss +41 -0
  25. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_dropdown.scss +250 -0
  26. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_forms.scss +9 -0
  27. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_functions.scss +302 -0
  28. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_grid.scss +39 -0
  29. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_helpers.scss +12 -0
  30. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_images.scss +42 -0
  31. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_list-group.scss +197 -0
  32. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_maps.scss +174 -0
  33. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_mixins.scss +42 -0
  34. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_modal.scss +237 -0
  35. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_nav.scss +197 -0
  36. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_navbar.scss +289 -0
  37. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_offcanvas.scss +146 -0
  38. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_pagination.scss +109 -0
  39. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_placeholders.scss +51 -0
  40. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_popover.scss +196 -0
  41. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_progress.scss +68 -0
  42. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_reboot.scss +610 -0
  43. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_root.scss +184 -0
  44. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_spinners.scss +85 -0
  45. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_tables.scss +171 -0
  46. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_toasts.scss +73 -0
  47. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_tooltip.scss +119 -0
  48. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_transitions.scss +27 -0
  49. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_type.scss +106 -0
  50. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_utilities.scss +806 -0
  51. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_variables-dark.scss +85 -0
  52. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/_variables.scss +1745 -0
  53. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/bootstrap-grid.scss +62 -0
  54. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/bootstrap-reboot.scss +10 -0
  55. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/bootstrap-utilities.scss +19 -0
  56. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/bootstrap.scss +52 -0
  57. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/forms/_floating-labels.scss +95 -0
  58. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/forms/_form-check.scss +188 -0
  59. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/forms/_form-control.scss +214 -0
  60. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/forms/_form-range.scss +91 -0
  61. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/forms/_form-select.scss +80 -0
  62. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/forms/_form-text.scss +11 -0
  63. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/forms/_input-group.scss +132 -0
  64. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/forms/_labels.scss +36 -0
  65. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/forms/_validation.scss +12 -0
  66. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/helpers/_clearfix.scss +3 -0
  67. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/helpers/_color-bg.scss +7 -0
  68. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/helpers/_colored-links.scss +30 -0
  69. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/helpers/_focus-ring.scss +5 -0
  70. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/helpers/_icon-link.scss +25 -0
  71. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/helpers/_position.scss +36 -0
  72. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/helpers/_ratio.scss +26 -0
  73. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/helpers/_stacks.scss +15 -0
  74. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/helpers/_stretched-link.scss +15 -0
  75. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/helpers/_text-truncation.scss +7 -0
  76. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/helpers/_visually-hidden.scss +8 -0
  77. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/helpers/_vr.scss +8 -0
  78. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_alert.scss +18 -0
  79. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_backdrop.scss +14 -0
  80. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_banner.scss +7 -0
  81. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_border-radius.scss +78 -0
  82. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_box-shadow.scss +18 -0
  83. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_breakpoints.scss +127 -0
  84. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_buttons.scss +70 -0
  85. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_caret.scss +69 -0
  86. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_clearfix.scss +9 -0
  87. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_color-mode.scss +21 -0
  88. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_color-scheme.scss +7 -0
  89. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_container.scss +11 -0
  90. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_deprecate.scss +10 -0
  91. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_forms.scss +153 -0
  92. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_gradients.scss +47 -0
  93. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_grid.scss +151 -0
  94. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_image.scss +16 -0
  95. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_list-group.scss +26 -0
  96. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_lists.scss +7 -0
  97. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_pagination.scss +10 -0
  98. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_reset-text.scss +17 -0
  99. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_resize.scss +6 -0
  100. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_table-variants.scss +24 -0
  101. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_text-truncate.scss +8 -0
  102. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_transition.scss +26 -0
  103. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_utilities.scss +97 -0
  104. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/mixins/_visually-hidden.scss +33 -0
  105. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/tests/jasmine.js +16 -0
  106. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/tests/mixins/_color-modes.test.scss +69 -0
  107. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/tests/mixins/_media-query-color-mode-full.test.scss +8 -0
  108. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/tests/mixins/_utilities.test.scss +393 -0
  109. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/tests/sass-true/register.js +14 -0
  110. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/tests/sass-true/runner.js +17 -0
  111. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/tests/utilities/_api.test.scss +75 -0
  112. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/utilities/_api.scss +47 -0
  113. data/app/assets/stylesheets/cm_admin/dependency/bootstrap/scss/vendor/_rfs.scss +348 -0
  114. data/app/assets/stylesheets/cm_admin/dependency/bootstrap.min.css +4 -5
  115. data/app/assets/stylesheets/cm_admin/pages/import_page.scss +3 -10
  116. data/app/controllers/cm_admin/resource_controller.rb +22 -5
  117. data/app/helpers/cm_admin/application_helper.rb +4 -4
  118. data/app/views/cm_admin/main/_actions_dropdown.html.slim +3 -5
  119. data/app/views/cm_admin/main/_associated_table.html.slim +1 -1
  120. data/app/views/cm_admin/main/_custom_action_modal_form.html.slim +6 -0
  121. data/app/views/cm_admin/main/_nested_fields.html.slim +36 -16
  122. data/app/views/cm_admin/main/_nested_table_form.html.slim +17 -8
  123. data/app/views/cm_admin/main/_nested_table_section.html.slim +17 -0
  124. data/app/views/cm_admin/main/_show_section.html.slim +10 -0
  125. data/app/views/cm_admin/main/_tabs.html.slim +2 -2
  126. data/app/views/cm_admin/main/_top_navbar.html.slim +17 -17
  127. data/app/views/cm_admin/main/associated_show.html.slim +5 -4
  128. data/app/views/cm_admin/main/edit.html.slim +18 -18
  129. data/app/views/cm_admin/main/history.html.slim +5 -6
  130. data/app/views/cm_admin/main/import_form.html.slim +3 -3
  131. data/app/views/cm_admin/main/new.html.slim +17 -17
  132. data/app/views/cm_admin/main/show.html.slim +12 -13
  133. data/app/views/layouts/_custom_action_modal.html.slim +11 -0
  134. data/app/views/layouts/_custom_action_modals.html.slim +13 -9
  135. data/app/views/layouts/_destroy_action_modal.html.slim +16 -0
  136. data/app/views/layouts/_quick_links.html.slim +2 -2
  137. data/app/views/layouts/cm_admin.html.slim +13 -15
  138. data/config/routes.rb +1 -3
  139. data/lib/cm_admin/model.rb +1 -0
  140. data/lib/cm_admin/models/custom_action.rb +6 -0
  141. data/lib/cm_admin/models/dsl_method.rb +9 -4
  142. data/lib/cm_admin/models/field.rb +2 -1
  143. data/lib/cm_admin/models/form_field.rb +2 -1
  144. data/lib/cm_admin/models/row.rb +40 -0
  145. data/lib/cm_admin/models/section.rb +20 -3
  146. data/lib/cm_admin/version.rb +1 -1
  147. data/lib/cm_admin/view_helpers/field_display_helper.rb +3 -3
  148. data/lib/cm_admin/view_helpers/form_field_helper.rb +40 -14
  149. data/lib/cm_admin/view_helpers/form_helper.rb +60 -22
  150. data/lib/cm_admin/view_helpers/manage_column_popup_helper.rb +2 -2
  151. data/lib/cm_admin/view_helpers/page_info_helper.rb +4 -4
  152. data/lib/cm_admin/view_helpers.rb +3 -2
  153. metadata +108 -2
@@ -25,7 +25,7 @@
25
25
  line-height: 22px;
26
26
  margin-bottom: 0;
27
27
  }
28
- }
28
+ }
29
29
  &__body {
30
30
  padding: 16px 24px;
31
31
  .body-title {
@@ -63,9 +63,6 @@
63
63
 
64
64
  .actions-wrapper {
65
65
  margin-top: 32px;
66
- button {
67
- padding: 5px 10px;
68
- }
69
66
  }
70
67
 
71
68
  //form UI
@@ -90,7 +87,7 @@
90
87
  margin-bottom: 16px;
91
88
  text-transform: uppercase;
92
89
  }
93
- .steps-wrapper {
90
+ .steps-wrapper {
94
91
  .steps-title {
95
92
  @include font($size: size(16), $weight: bold);
96
93
  font-family: $primary-font;
@@ -116,10 +113,6 @@
116
113
  }
117
114
  }
118
115
  }
119
- .import-btn {
120
- padding: 5px 10px;
121
- }
122
116
  }
123
-
124
117
  }
125
- }
118
+ }
@@ -156,13 +156,25 @@ module CmAdmin
156
156
  end
157
157
  end
158
158
 
159
+ def get_nested_table_fields(fields)
160
+ nested_table_fields = []
161
+ fields.each do |field|
162
+ if field.class == CmAdmin::Models::Row
163
+ nested_table_fields += field.sections.map(&:nested_table_fields).map(&:keys).flatten
164
+ elsif field.class == CmAdmin::Models::Section
165
+ nested_table_fields += field.nested_table_fields.map(&:keys).flatten
166
+ end
167
+ end
168
+ nested_table_fields.flatten
169
+ end
170
+
159
171
  def resource_identifier
160
172
  @ar_object, @associated_model, @associated_ar_object = custom_controller_action(action_name, params.permit!) if !@ar_object.present? && params[:id].present?
161
173
  authorize controller_name.classify.constantize, policy_class: "CmAdmin::#{controller_name.classify}Policy".constantize if defined? "CmAdmin::#{controller_name.classify}Policy".constantize
162
174
  aar_model = request.url.split('/')[-2].classify.constantize if params[:aar_id]
163
175
  @associated_ar_object = aar_model.find(params[:aar_id]) if params[:aar_id]
164
- nested_tables = @model.available_fields[:new].map(&:nested_table_fields).map(&:keys).flatten
165
- nested_tables += @model.available_fields[:edit].map(&:nested_table_fields).map(&:keys).flatten
176
+ nested_tables = get_nested_table_fields(@model.available_fields[:new])
177
+ nested_tables += get_nested_table_fields(@model.available_fields[:edit])
166
178
  @reflections = @model.ar_model.reflect_on_all_associations
167
179
  nested_tables.each do |table_name|
168
180
  reflection = @reflections.select {|x| x if x.name == table_name}.first
@@ -182,6 +194,9 @@ module CmAdmin
182
194
  redirect_url = CmAdmin::Engine.mount_path + "/#{@model.name.underscore.pluralize}/#{@ar_object.id}"
183
195
  end
184
196
  if @ar_object.save
197
+ if params['attachment_destroy_ids'].present?
198
+ ActiveStorage::Attachment.where(id: params['attachment_destroy_ids']).destroy_all
199
+ end
185
200
  format.html { redirect_to redirect_url, notice: "#{action_name.titleize} #{@ar_object.class.name.downcase} is successful" }
186
201
  else
187
202
  format.html { render '/cm_admin/main/new', notice: "#{action_name.titleize} #{@ar_object.class.name.downcase} is unsuccessful" }
@@ -254,13 +269,15 @@ module CmAdmin
254
269
  Hash[x.name.to_s.gsub('_attachments', ''), []]
255
270
  end
256
271
  }.compact
257
- nested_tables = @model.available_fields[:new].map(&:nested_table_fields).map(&:keys).flatten
258
- nested_tables += @model.available_fields[:edit].map(&:nested_table_fields).map(&:keys).flatten
272
+ nested_tables = get_nested_table_fields(@model.available_fields[:new])
273
+ nested_tables += get_nested_table_fields(@model.available_fields[:edit])
259
274
  nested_fields = nested_tables.uniq.map {|assoc_name|
260
275
  table_name = @model.ar_model.reflections[assoc_name.to_s].klass.table_name
276
+ column_names = table_name.to_s.classify.constantize.column_names
277
+ column_names = column_names.map {|column_name| column_name.gsub('_cents', '') }
261
278
  Hash[
262
279
  "#{table_name}_attributes",
263
- table_name.to_s.classify.constantize.column_names.reject { |i| CmAdmin::REJECTABLE_FIELDS.include?(i) }.map(&:to_sym) + [:id, :_destroy]
280
+ column_names.reject { |column_name| CmAdmin::REJECTABLE_FIELDS.include?(column_name) }.map(&:to_sym) + [:id, :_destroy]
264
281
  ]
265
282
  }
266
283
  permittable_fields += nested_fields
@@ -33,8 +33,8 @@ module CmAdmin
33
33
  end
34
34
 
35
35
  def error_header
36
- content_tag :div, class: 'info-split' do
37
- concat content_tag(:div, "Row number", class: 'info-split__lhs')
36
+ content_tag :div, class: 'card-info' do
37
+ concat content_tag(:div, "Row number", class: 'card-info__label')
38
38
  concat content_tag(:div, "Error")
39
39
  end
40
40
  end
@@ -48,8 +48,8 @@ module CmAdmin
48
48
  end
49
49
 
50
50
  def format_error_item(row_item)
51
- content_tag :div, class: 'info-split' do
52
- concat content_tag(:div, row_item[0], class: 'info-split__lhs')
51
+ content_tag :div, class: 'info-point' do
52
+ concat content_tag(:div, row_item[0], class: 'card-info__label')
53
53
  concat format_error(row_item[2])
54
54
  end
55
55
  end
@@ -5,11 +5,9 @@
5
5
  - if custom_actions.any? || edit_action.present? || destroy_action.present?
6
6
  td.row-action-cell
7
7
  .row-action-tool
8
- button.secondary-btn.tool-btn
8
+ button.btn-ghost.dropdown-toggle
9
9
  span
10
10
  i.fa.fa-bars.bolder
11
- span
12
- i.fa.fa-angle-down
13
11
  .popup-card.table-export-popup.hidden
14
12
  - if edit_action.present?
15
13
  = link_to cm_admin.send("#{current_model.name.underscore}_edit_path", ar_object.id) do
@@ -24,8 +22,8 @@
24
22
  span
25
23
  i.fa.fa-trash
26
24
  | Destroy
27
- - else
28
- = button_to cm_admin.send("#{current_model.name.underscore}_destroy_path", ar_object.id), method: :delete, form: { data: { turbo_confirm: 'Are you sure?' } } do
25
+ - else
26
+ = link_to '', data: { bs_toggle: 'modal', bs_target: "##{@model.name.classify}DestroyModal-#{ar_object.id.to_s}" } do
29
27
  .popup-option
30
28
  span
31
29
  i.fa.fa-trash
@@ -8,7 +8,7 @@
8
8
  - association = @ar_object.class.reflect_on_all_associations.select{|x| x.name == @associated_model.name.tableize.to_sym }.first
9
9
  - polymorphic_name = (association && association.inverse_of && association.inverse_of.options[:polymorphic]) ? association.inverse_of.name : ''
10
10
  a href="#{CmAdmin::Engine.mount_path}/#{@associated_model.name.tableize}/new?associated_id=#{@ar_object.id}&associated_class=#{@ar_object.class.name.underscore}&polymorphic_name=#{polymorphic_name}&referrer=#{request.path}"
11
- button.secondary-btn.column-btn Add
11
+ button.btn-secondary Add
12
12
  / button.secondary-btn.column-btn data-target="#columnActionModal" data-toggle="modal" type="button"
13
13
  / span
14
14
  / i.fa.fa-columns.bolder
@@ -0,0 +1,6 @@
1
+ .custom-modal-body
2
+ .modal-info data-section="bulk-action"
3
+ = custom_action.modal_configuration[:description]
4
+ .modal-footer
5
+ = simple_form_for(ar_object, url: cm_admin.send("#{ar_object.class.name.underscore}_#{custom_action.name}_path", ar_object.id), method: custom_action.verb) do |f|
6
+ = f.button :submit, custom_action.modal_configuration[:confirmation_text] || 'Update', class: "btn btn-primary"
@@ -1,4 +1,3 @@
1
- - fields = section.nested_table_fields[assoc_name]
2
1
  - if fields.count == 1
3
2
  .nested-single-field.nested-fields
4
3
  - fields.each do |field|
@@ -9,18 +8,39 @@
9
8
  - if @reflections.select {|x| x if x.name == assoc_name}.first.macro == :has_many
10
9
  = link_to_remove_association "", f, class: 'fa fa-times'
11
10
  - else
12
- .accordion-item.nested-fields
13
- h2#headingOne.accordion-header
14
- button.accordion-button[type="button" data-bs-toggle="collapse" data-bs-target="##{assoc_name}-#{f.object.id}" aria-expanded="true" aria-controls="collapseOne"]
15
- | Chapter 1
16
- .field-remove-action
17
- - if @reflections.select {|x| x if x.name == assoc_name}.first.macro == :has_many
18
- = link_to_remove_association "", f, class: 'fa fa-trash ghost-btn accordion-delete-btn'
19
- div.accordion-collapse.collapse.show[aria-labelledby="headingOne" id="#{assoc_name}-#{f.object.id}"]
20
- .accordion-body
21
- - fields.each do |field|
22
- .form-field
23
- .field-label-wrapper
24
- label.field-label = field.field_name.to_s.titleize
25
- .field-input-wrapper
26
- = input_field_for_column(f, field)
11
+ tr
12
+ td.item-delete-cell
13
+ - if @reflections.select {|x| x if x.name == assoc_name}.first.macro == :has_many
14
+ = link_to_remove_association "", f, class: 'fa fa-trash btn-ghost'
15
+ - fields.each do |field|
16
+ td
17
+ = input_field_for_column(f, field)
18
+
19
+
20
+ / .field-remove-action
21
+ / - if @reflections.select {|x| x if x.name == assoc_name}.first.macro == :has_many
22
+ / .accordion-delete-btn
23
+ / = link_to_remove_association "", f, class: 'fa fa-trash btn-ghost'
24
+ / - fields.each do |field|
25
+ / .form-field
26
+ / .field-label-wrapper
27
+ / label.field-label = field.field_name.to_s.titleize
28
+ / .field-input-wrapper
29
+ / = input_field_for_column(f, field)
30
+
31
+ / .accordion-item.nested-fields
32
+ / h2#headingOne.accordion-header
33
+ / button.accordion-button[type="button" data-bs-toggle="collapse" data-bs-target="##{assoc_name}-#{f.object.id}" aria-expanded="true" aria-controls="collapseOne"]
34
+ / | Chapter 1
35
+ / .field-remove-action
36
+ / - if @reflections.select {|x| x if x.name == assoc_name}.first.macro == :has_many
37
+ / .accordion-delete-btn
38
+ / = link_to_remove_association "", f, class: 'fa fa-trash btn-ghost'
39
+ / div.accordion-collapse.collapse.show[aria-labelledby="headingOne" id="#{assoc_name}-#{f.object.id}"]
40
+ / .accordion-body
41
+ / - fields.each do |field|
42
+ / .form-field
43
+ / .field-label-wrapper
44
+ / label.field-label = field.field_name.to_s.titleize
45
+ / .field-input-wrapper
46
+ / = input_field_for_column(f, field)
@@ -1,10 +1,19 @@
1
1
  - table_name = @ar_object._reflections[assoc_name.to_s].klass.table_name.to_sym
2
2
  .nested-field-wrapper data-table-name=assoc_name data-model-name=assoc_name.to_s.classify
3
- label.nested-field-label = assoc_name.to_s.titleize
4
- .accordion.nested-form-accordion
5
- = f.fields_for table_name do |record|
6
- - if record.object.persisted?
7
- = render partial: '/cm_admin/main/nested_fields', locals: { f: record, assoc_name: assoc_name, section: section }
8
- - if @reflections.select {|x| x if x.name == assoc_name}.first.macro == :has_many
9
- .links
10
- = link_to_add_association "+ Add #{assoc_name.to_s.titleize}", f, table_name, partial: '/cm_admin/main/nested_fields', render_options: {locals: { assoc_name: assoc_name, section: section }}, class: 'd-inline-block secondary-btn mt-2'
3
+ label.field-label = assoc_name.to_s.titleize
4
+ - fields = section.nested_table_fields[assoc_name]
5
+ table.nested-form-table
6
+ thead
7
+ tr
8
+ th
9
+ |
10
+ - fields.each do |field|
11
+ th
12
+ = field.field_name.to_s.titleize
13
+ tbody.insert-cocoon-position
14
+ = f.fields_for table_name do |record|
15
+ - if record.object.persisted?
16
+ = render partial: '/cm_admin/main/nested_fields', locals: { f: record, assoc_name: assoc_name, section: section, fields: fields }
17
+ - if @reflections.select {|x| x if x.name == assoc_name}.first.macro == :has_many
18
+ .links
19
+ = link_to_add_association "+ Add #{assoc_name.to_s.titleize}", f, table_name, partial: '/cm_admin/main/nested_fields', render_options: {locals: { assoc_name: assoc_name, section: section, fields: fields }}, data: { association_insertion_node: '.insert-cocoon-position', association_insertion_method: 'append' }, class: 'btn-secondary'
@@ -0,0 +1,17 @@
1
+ .card-info
2
+ p.card-info__label = table_name.to_s.titleize
3
+ .card-info__description
4
+ - associated_records = @ar_object.send(table_name)
5
+ table.nested-table
6
+ thead
7
+ tr
8
+ - table_fields.each do |field|
9
+ th scope="col"
10
+ = field.label
11
+ tbody
12
+ - associated_records.each do |record|
13
+ tr
14
+ - table_fields.each do |field|
15
+ td
16
+ = record.send(field.field_name)
17
+
@@ -0,0 +1,10 @@
1
+ - if section.display_if.call(@ar_object)
2
+ div class="#{section.col_size ? 'col-' + section.col_size.to_s : 'col'}"
3
+ .section
4
+ p.section-heading = section.section_name
5
+ .card
6
+ .card-body
7
+ - section.section_fields.each do |field|
8
+ = show_field(@ar_object, field)
9
+ - section.nested_table_fields.each do |key, value|
10
+ = render partial: 'cm_admin/main/nested_table_section', locals: { table_name: key, table_fields: value }
@@ -1,4 +1,4 @@
1
- ul.nav.nav-pills
1
+ ul.tabs
2
2
  - @model.available_tabs.each do |nav_item|
3
3
  - if nav_item.display_if.call(@ar_object)
4
4
  - if nav_item.custom_action.empty? || (nav_item.custom_action.present? && policy([:cm_admin, @model.name.classify.constantize]).send(:"#{nav_item.custom_action}?"))
@@ -6,6 +6,6 @@ ul.nav.nav-pills
6
6
  - nav_item_action_name = nav_item.custom_action.present? ? nav_item.custom_action : 'show'
7
7
  = link_to tab_display_name(nav_item.nav_item_name), cm_admin.send("#{@ar_object.model_name.singular}_#{nav_item_action_name}_path", @ar_object.id), class: "nav-link #{ nav_item_action_name == action_name ? 'active' : ''}"
8
8
  // current_action_name is defined when action trail is added to that model
9
- - if defined?(@ar_object.current_action_name)
9
+ - if policy([:cm_admin, @model.name.classify.constantize]).send(:history?)
10
10
  li.nav-item
11
11
  = link_to 'History', cm_admin.send("#{@ar_object.model_name.singular}_history_path", @ar_object.id), class: "nav-link #{ action_name == 'history' ? 'active' : ''}"
@@ -1,33 +1,27 @@
1
- .cm-navbar
2
- .cm-navbar__lhs
1
+ .entity-header
2
+ .entity-header__info
3
3
  - if cm_admin.method_defined?(:"#{@model.name.underscore}_index_path") && (@model.current_action.name == 'show' || @model.current_action.layout_type.present?)
4
- .bread-crumb-area
5
- .breadcrumb-text
6
- = link_to "#{@model.name.titleize.pluralize} /", cm_admin.send(:"#{@model.name.underscore}_index_path")
7
- .nav-title-area
8
- p.title-text = action_title
9
- p.title-sub-text = action_description
10
- .cm-navbar__rhs
4
+ .breadcrumb
5
+ = link_to "#{@model.name.titleize.pluralize} /", cm_admin.send(:"#{@model.name.underscore}_index_path"), class: 'text-reset'
6
+ h4 = action_title
7
+ p.mb-0.text-body-secondary = action_description
8
+ .entity-header__actions
11
9
  - if @model.current_action.name == 'index'
12
10
  - if has_valid_policy(@model.name, :exportable)
13
11
  .export-container
14
12
  .dropdown
15
- button.secondary-btn data-bs-toggle='dropdown'
16
- span
13
+ button.btn-secondary.dropdown-toggle data-bs-toggle='dropdown'
17
14
  i.fa.fa-arrow-down
18
- span
19
15
  | Export
20
- span
21
- i.fa.fa-angle-down
22
16
  ul.dropdown-menu.export-popup
23
17
  li
24
18
  .popup-option.pointer data-bs-toggle='modal' data-bs-target='#exportmodal'
25
19
  span Export
26
20
  - if @model.importer && has_valid_policy(@model.name, :importable)
27
- = link_to 'Import', cm_admin.send(:"#{@model.name.underscore}_import_path"), class: 'primary-btn ml-2'
21
+ = link_to 'Import', cm_admin.send(:"#{@model.name.underscore}_import_path"), class: 'btn-primary ms-2'
28
22
  - new_action = @model.available_actions.select{|act| act if act.action_type.eql?(:default) && act.name.eql?('new')}
29
23
  - if new_action.any? && policy([:cm_admin, @model.name.classify.constantize]).new?
30
- = link_to 'Add', cm_admin.send(:"#{@model.name.underscore}_new_path"), class: 'primary-btn ml-2'
24
+ = link_to 'Add', cm_admin.send(:"#{@model.name.underscore}_new_path"), class: 'btn-primary ms-2'
31
25
  - @model.available_actions.select{|act| act if act.route_type == 'collection'}.each do |custom_action|
32
26
  = custom_action_items(custom_action, 'index')
33
27
  - elsif @model.current_action.name == 'show'
@@ -35,5 +29,11 @@
35
29
  = custom_action_items(custom_action, 'show')
36
30
 
37
31
  - edit_action = @model.available_actions.select{|act| act if act.action_type.eql?(:default) && act.name.eql?('edit')}
32
+ - destroy_action = available_actions(@model, 'destroy')
38
33
  - if edit_action.any? && policy([:cm_admin, @model.name.classify.constantize]).edit?
39
- = link_to "Edit #{@model.name.titleize.pluralize}", cm_admin.send(:"#{@model.name.underscore}_edit_path", @ar_object), class: 'primary-btn ml-2'
34
+ = link_to "Edit #{@model.name.titleize.pluralize}", cm_admin.send(:"#{@model.name.underscore}_edit_path", @ar_object), class: 'btn-primary ms-2'
35
+ - if destroy_action
36
+ = link_to '', data: { bs_toggle: 'modal', bs_target: "##{@model.name.classify}DestroyModal-#{@ar_object.id.to_s}" }, class: 'btn-primary ms-2' do
37
+ span
38
+ i.fa.fa-trash
39
+ | Destroy
@@ -1,6 +1,7 @@
1
1
  - @model.available_fields[@action.name.to_sym].each do |section|
2
- .info-section
2
+ .section
3
3
  p.section-heading = section.section_name
4
- .paper
5
- - section.section_fields.each do |field|
6
- = show_field(@associated_ar_object, field)
4
+ .card
5
+ .card-body
6
+ - section.section_fields.each do |field|
7
+ = show_field(@associated_ar_object, field)
@@ -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 heading
14
- p.body-info
15
- ul
16
- - @ar_object.errors.full_messages.each do |error_message|
17
- li = error_message
18
- .form-container
19
- = generate_form(@ar_object, @model)
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 heading
14
+ p.body-info
15
+ ul
16
+ - @ar_object.errors.full_messages.each do |error_message|
17
+ li = error_message
18
+ .form-container
19
+ = generate_form(@ar_object, @model)
@@ -1,9 +1,8 @@
1
- .show-page.cm-page-container
2
- .show-page__tabs.sticky-container.page-top-bar
3
- .cm-tabs-bar
4
- == render 'cm_admin/main/top_navbar'
5
- == render 'cm_admin/main/tabs'
6
- .show-page__inner.scrollable
1
+ .show-page
2
+ .show-page__header.page-top-bar
3
+ == render 'cm_admin/main/top_navbar'
4
+ == render 'cm_admin/main/tabs'
5
+ .show-page__inner
7
6
  .history-box
8
7
  - @ar_object.action_trails.each do |at|
9
8
  .history-item
@@ -12,8 +12,8 @@
12
12
  p.success-msg Your file has been uploaded and it will be processed soon.
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
- a.secondary-btn href="#{cm_admin.send(:"#{@model.name.underscore}_import_path")}" Import new data
16
- / button.cta-btn.ml-2 Back to Page_Name
15
+ a.btn-secondary href="#{cm_admin.send(:"#{@model.name.underscore}_import_path")}" Import new data
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
@@ -32,4 +32,4 @@
32
32
  li Add your data on the file without changing the format
33
33
  li Save the file as a csv
34
34
  li Upload the file in the field above
35
- = f.button :submit, class: "cta-btn import-btn", value: 'Import data'
35
+ = f.button :submit, class: "btn-cta", value: 'Import data'
@@ -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.class.name.constantize.new, @model)
19
+ = generate_form(@ar_object, @model)
@@ -1,16 +1,15 @@
1
- .show-page.cm-page-container
2
- .show-page__tabs.sticky-container.page-top-bar
3
- .cm-tabs-bar
4
- == render 'cm_admin/main/top_navbar'
5
- == render 'cm_admin/main/tabs'
6
- .show-page__inner.scrollable
1
+ .show-page
2
+ .show-page__header.page-top-bar
3
+ == render 'cm_admin/main/top_navbar'
4
+ == render 'cm_admin/main/tabs'
5
+ .show-page__inner
7
6
  - if @action.partial
8
7
  == render @action.partial
9
8
  - else
10
- - @model.available_fields[:show].each do |section|
11
- - if section.display_if.call(@ar_object)
12
- .info-section
13
- p.section-heading = section.section_name
14
- .paper
15
- - section.section_fields.each do |field|
16
- = 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
+
@@ -19,7 +19,7 @@
19
19
  span.move-arrow
20
20
  i.fa.fa-long-arrow-down
21
21
  span Select
22
- button.text-btn.enter-btn
22
+ p.enter-text
23
23
  | ENTER
24
- button.text-btn.open-btn
24
+ p.open-text
25
25
  | open
@@ -24,23 +24,21 @@ 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__tabs.sticky-container.page-top-bar
29
- .cm-tabs-bar
30
- == render 'cm_admin/main/top_navbar'
31
- == render 'cm_admin/main/tabs'
32
- .show-page__inner.scrollable
27
+ .show-page
28
+ .show-page__header.page-top-bar
29
+ == render 'cm_admin/main/top_navbar'
30
+ == render 'cm_admin/main/tabs'
31
+ .show-page__inner
33
32
  = yield
34
33
  - elsif defined?(@action) && (@action&.layout_type.to_s == 'cm_association_index' || @action.parent == "index")
35
- .show-page.cm-page-container
36
- .show-page__tabs.sticky-container.page-top-bar
37
- .cm-tabs-bar
38
- == render 'cm_admin/main/top_navbar'
39
- - if @ar_object.model_name
40
- == render 'cm_admin/main/tabs'
41
- - if @associated_model && @associated_model.filters.present?
42
- .filters-bar
43
- == render partial: 'cm_admin/main/filters', locals: { filters: @associated_model.filters }
34
+ .show-page
35
+ .show-page__header.page-top-bar
36
+ == render 'cm_admin/main/top_navbar'
37
+ - if @ar_object.model_name
38
+ == render 'cm_admin/main/tabs'
39
+ - if @associated_model && @associated_model.filters.present?
40
+ .filters-bar
41
+ == render partial: 'cm_admin/main/filters', locals: { filters: @associated_model.filters }
44
42
  = yield
45
43
  - else
46
44
  = yield
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