cm-admin 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/CODE_OF_CONDUCT.md +74 -0
  3. data/Gemfile +1 -0
  4. data/Gemfile.lock +21 -20
  5. data/README.md +24 -1
  6. data/app/assets/stylesheets/cm_admin/base/auth.scss +0 -12
  7. data/app/assets/stylesheets/cm_admin/base/filters.scss +8 -7
  8. data/app/assets/stylesheets/cm_admin/base/form.scss +7 -72
  9. data/app/assets/stylesheets/cm_admin/base/navbar.scss +1 -3
  10. data/app/assets/stylesheets/cm_admin/base/quicksearch.scss +7 -0
  11. data/app/assets/stylesheets/cm_admin/base/scaffold.scss +38 -3
  12. data/app/assets/stylesheets/cm_admin/base/show.scss +24 -2
  13. data/app/assets/stylesheets/cm_admin/base/table.scss +270 -253
  14. data/app/assets/stylesheets/cm_admin/components/_dropdown-popup.scss +22 -10
  15. data/app/assets/stylesheets/cm_admin/components/_range.scss +13 -2
  16. data/app/assets/stylesheets/cm_admin/components/_status-tag.scss +2 -1
  17. data/app/assets/stylesheets/cm_admin/helpers/_variable.scss +1 -0
  18. data/app/controllers/cm_admin/application_controller.rb +5 -0
  19. data/app/controllers/cm_admin/exports_controller.rb +1 -1
  20. data/app/controllers/cm_admin/static_controller.rb +12 -0
  21. data/app/helpers/cm_admin/custom_helper.rb +4 -0
  22. data/app/javascript/packs/cm_admin/application.js +14 -1
  23. data/app/javascript/packs/cm_admin/filters.js +331 -16
  24. data/app/javascript/packs/cm_admin/quick_search.js +67 -0
  25. data/app/javascript/packs/cm_admin/scaffolds.js +30 -1
  26. data/app/javascript/stylesheets/cm_admin/application.scss +3 -0
  27. data/app/views/cm_admin/main/_associated_table.html.slim +60 -0
  28. data/app/views/cm_admin/main/_cm_pagy_nav.html.slim +6 -6
  29. data/app/views/cm_admin/main/_filters.html.slim +1 -10
  30. data/app/views/cm_admin/main/_nested_fields.html.slim +7 -0
  31. data/app/views/cm_admin/main/_nested_table_form.html.slim +6 -0
  32. data/app/views/cm_admin/main/_table.html.slim +5 -4
  33. data/app/views/cm_admin/main/_tabs.html.slim +5 -0
  34. data/app/views/cm_admin/main/_top_navbar.html.slim +4 -4
  35. data/app/views/cm_admin/main/associated_index.html.slim +6 -0
  36. data/app/views/cm_admin/main/associated_show.html.slim +6 -0
  37. data/app/views/cm_admin/main/index.html.slim +11 -8
  38. data/app/views/cm_admin/main/show.html.slim +12 -13
  39. data/app/views/cm_admin/static/error_401.html.slim +4 -0
  40. data/app/views/layouts/_left_sidebar_nav.html.slim +7 -3
  41. data/app/views/layouts/_quick_links.html.slim +25 -0
  42. data/app/views/layouts/cm_admin.html.slim +24 -1
  43. data/app/views/layouts/static.html.slim +18 -0
  44. data/bin/console +0 -1
  45. data/cm_admin.gemspec +1 -0
  46. data/config/routes.rb +2 -1
  47. data/config/webpack/environment.js +3 -2
  48. data/lib/.DS_Store +0 -0
  49. data/lib/cm_admin/model.rb +57 -167
  50. data/lib/cm_admin/models/action.rb +15 -1
  51. data/lib/cm_admin/models/cm_show_section.rb +20 -0
  52. data/lib/cm_admin/models/column.rb +49 -4
  53. data/lib/cm_admin/models/controller_method.rb +75 -0
  54. data/lib/cm_admin/models/dsl_method.rb +122 -0
  55. data/lib/cm_admin/models/export.rb +16 -5
  56. data/lib/cm_admin/models/field.rb +2 -1
  57. data/lib/cm_admin/models/filter.rb +67 -2
  58. data/lib/cm_admin/models/form_field.rb +21 -0
  59. data/lib/cm_admin/models/tab.rb +13 -0
  60. data/lib/cm_admin/version.rb +1 -1
  61. data/lib/cm_admin/view_helpers/column_field_helper.rb +29 -0
  62. data/lib/cm_admin/view_helpers/field_display_helper.rb +65 -0
  63. data/lib/cm_admin/view_helpers/filter_helper.rb +190 -0
  64. data/lib/cm_admin/view_helpers/form_field_helper.rb +21 -4
  65. data/lib/cm_admin/view_helpers/form_helper.rb +22 -12
  66. data/lib/cm_admin/view_helpers/manage_column_popup_helper.rb +75 -0
  67. data/lib/cm_admin/view_helpers/navigation_helper.rb +22 -6
  68. data/lib/cm_admin/view_helpers/page_info_helper.rb +36 -0
  69. data/lib/cm_admin/view_helpers.rb +3 -1
  70. data/lib/cm_admin.rb +3 -1
  71. data/lib/generators/cm_admin/install_generator.rb +20 -8
  72. data/package.json +6 -1
  73. data/tmp/cache/webpacker/last-compilation-digest-development +1 -0
  74. data/yarn.lock +35 -5
  75. metadata +41 -7
  76. data/app/controllers/cm_admin/main_controller.rb +0 -8
  77. data/lib/c.png +0 -0
  78. data/lib/cm_admin/view_helpers/field_column_helper.rb +0 -23
  79. data/lib/generators/cm_admin/templates/cm_admin_initializer.rb +0 -4
  80. data/yarn-error.log +0 -44
@@ -0,0 +1,67 @@
1
+ $(document).on("keydown", function(e) {
2
+ if (e.keyCode == 75 && e.metaKey) {
3
+ $('#quickSearchModal').modal('show')
4
+ }
5
+ });
6
+
7
+ var liSelected;
8
+ $(document).on('keydown', function(e){
9
+ var sel_item = $('.search-results-container > a.visible');
10
+ if ($('#quickSearchModal').hasClass('show')) {
11
+ var selected;
12
+ if(e.which === 40){
13
+ if(liSelected){
14
+ liSelected.removeClass('active-item');
15
+ next = liSelected.next();
16
+ if(next.length > 0){
17
+ liSelected = next.addClass('active-item');
18
+ selected = next.text();
19
+
20
+ }else{
21
+ liSelected = sel_item.eq(0).addClass('active-item');
22
+ selected = sel_item.eq(0).text();
23
+ }
24
+ }else{
25
+ liSelected = sel_item.eq(0).addClass('active-item');
26
+ selected = sel_item.eq(0).text();
27
+ }
28
+ }else if(e.which === 38){
29
+ if(liSelected){
30
+ liSelected.removeClass('active-item');
31
+ next = liSelected.prev();
32
+ if(next.length > 0){
33
+ liSelected = next.addClass('active-item');
34
+ selected = next.text();
35
+
36
+ }else{
37
+
38
+ liSelected = sel_item.last().addClass('active-item');
39
+ selected = sel_item.last().text()
40
+ }
41
+ }else{
42
+ liSelected = sel_item.last().addClass('active-item');
43
+ selected = sel_item.last().text()
44
+ }
45
+ }
46
+ if(liSelected && e.which === 13) {
47
+ console.log("Selected item id ", liSelected)
48
+ href = liSelected.attr('href')
49
+ window.location = href
50
+ }
51
+ }
52
+ });
53
+
54
+ $(document).on('keyup', '[data-behaviour="quick-input-search"]', function(e) {
55
+ if ($(this).val().length > 0) {
56
+ $('.clear-search').removeClass('hidden')
57
+ } else {
58
+ $('.clear-search').addClass('hidden')
59
+ }
60
+ CmFilter.quick_input_search($(this))
61
+ });
62
+
63
+ $(document).on('click', '.clear-search', function(){
64
+ $('#quick-search-input').val('')
65
+ $('.clear-search').addClass('hidden')
66
+ CmFilter.quick_input_search($('#quick-search-input'))
67
+ });
@@ -1,3 +1,32 @@
1
+ $(document).ready(function(e) {
2
+ $('.select-2').select2();
3
+ flatpickr("[data-behaviour='date-only']", {})
4
+ flatpickr("[data-behaviour='date-time']", {
5
+ enableTime: true
6
+ })
7
+ flatpickr("[data-behaviour='filter'][data-filter-type='date']", {
8
+ mode: 'range'
9
+ })
10
+ Sortable.create($('.columns-list')[0],{
11
+ handle: '.dragger',
12
+ animation: 150
13
+ });
14
+ });
15
+
16
+ $(document).on("keypress keyup blur", "[data-behaviour='decimal-only'], [data-behaviour='filter'][data-filter-type='range']", function (e) {
17
+ var charCode = (e.which) ? e.which : e.keyCode
18
+ if (charCode > 31 && (charCode != 46 &&(charCode < 48 || charCode > 57)))
19
+ return false;
20
+ return true;
21
+ });
22
+
23
+ $(document).on("keypress keyup blur", "[data-behaviour='integer-only']", function (event) {
24
+ $(this).val($(this).val().replace(/[^\d].+/, ""));
25
+ if ((event.which < 48 || event.which > 57)) {
26
+ event.preventDefault();
27
+ }
28
+ });
29
+
1
30
  $(document).on('click', '.row-action-cell', function(e) {
2
31
  e.stopPropagation();
3
32
  if ($(this).hasClass('opacity-1')) {
@@ -11,4 +40,4 @@ $(document).on('click', '.row-action-cell', function(e) {
11
40
  } else {
12
41
  return $(this).find('.table-export-popup').addClass('hidden');
13
42
  }
14
- });
43
+ });
@@ -0,0 +1,3 @@
1
+ @import "bootstrap/scss/bootstrap";
2
+ @import "flatpickr/dist/flatpickr";
3
+ @import "../../../../node_modules/daterangepicker/daterangepicker.css";
@@ -0,0 +1,60 @@
1
+ .admin-table-index
2
+ .table-top
3
+ p.table-top__total-count = "#{@associated_ar_object.pagy.count} #{@associated_model.ar_model.table_name} found"
4
+ .table-top__column-action
5
+ button.secondary-btn.column-btn data-target="#columnActionModal" data-toggle="modal" type="button"
6
+ span
7
+ i.fa.fa-columns.bolder
8
+ span
9
+ i.fa.fa-angle-down
10
+
11
+ .new-admin-table.scrollable
12
+ table.cm-table
13
+ thead.cm-table__header
14
+ tr.header-row
15
+ th.check-box-space
16
+ span
17
+ input.cm-checkbox type="checkbox"
18
+ - @model.available_fields[@action.name.to_sym].each do |column|
19
+ th = column.header
20
+ tbody.cm-table__body
21
+ - @associated_ar_object.data.each do |ar_object|
22
+ tr.body-row
23
+ td.check-box-space
24
+ span
25
+ input.cm-checkbox type="checkbox"
26
+ - @model.available_fields[@action.name.to_sym].each do |column|
27
+ td
28
+ span class="#{column.cm_css_class}" = show_field_value(ar_object, column)
29
+ td.row-action-cell
30
+ .row-action-tool
31
+ button.secondary-btn.tool-btn type="button"
32
+ span
33
+ i.fa.fa-bars.bolder
34
+ span
35
+ i.fa.fa-angle-down
36
+ .popup-card.table-export-popup.hidden
37
+ .popup-option
38
+ a href="#{page_url('edit', ar_object)}"
39
+ | Edit
40
+ / .cm-pagination
41
+ / .cm-pagination__lhs Showing 1 to 15 out of 104
42
+ / .cm-pagination__rhs
43
+ / span.page-move-btn.disabled
44
+ / i.fa.fa-angle-double-left.bolder.f14
45
+ / span.page-move-btn.disabled
46
+ / i.fa.fa-chevron-left.bolder
47
+ / span.page-num-btn.active 1
48
+ / span.page-num-btn 2
49
+ / span.page-num-btn 3
50
+ / span.page-num-btn 4
51
+ / span.page-num-btn 5
52
+ / span.page-move-btn
53
+ / i.fa.fa-chevron-right.bolder
54
+ / span.page-move-btn
55
+ / i.fa.fa-angle-double-right.bolder.f14
56
+
57
+ .cm-pagination
58
+ .cm-pagination__lhs Showing #{@associated_ar_object.pagy.from} to #{@associated_ar_object.pagy.to} out of #{@associated_ar_object.pagy.count}
59
+ .cm-pagination__rhs
60
+ == render partial: 'cm_admin/main/cm_pagy_nav', locals: { pagy: @associated_ar_object.pagy }
@@ -3,21 +3,21 @@
3
3
  nav.pagy_nav.pagination role="navigation" aria-label="pager"
4
4
 
5
5
  - if pagy.prev
6
- span.page-move-btn ==> link.call(pagy.prev, '<', 'aria-label="previous"')
6
+ span ==> link.call(pagy.prev, '<', 'aria-label="previous" class="page-move-btn"')
7
7
  - else
8
- span.page-move-btn.disabled ==> '<'
8
+ span ==> link.call('#', '<', 'class="page-move-btn disabled"')
9
9
 
10
10
  - pagy.series.each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
11
11
  - if item.is_a?(Integer) # page link
12
- span.page-num-btn ==> link.call(item)
12
+ span ==> link.call(item, item, 'class="page-num-btn"')
13
13
 
14
14
  - elsif item.is_a?(String) # current page
15
- span.page-num-btn.active ==> item
15
+ span ==> link.call(item, item, 'class="page-num-btn active"')
16
16
 
17
17
  - elsif item == :gap # page gap
18
18
  span.page.gap ==> pagy_t('pagy.nav.gap')
19
19
 
20
20
  - if pagy.next
21
- span.page-move-btn == link.call(pagy.next, '>', 'aria-label="next"')
21
+ span == link.call(pagy.next, '>', 'aria-label="next" class="page-move-btn"')
22
22
  - else
23
- span.page-move-btn.disabled == '>'
23
+ span ==> link.call('#', '>', 'class="page-move-btn disabled"')
@@ -1,10 +1 @@
1
- .cm-filters-v2
2
- .cm-filters-v2__inner
3
- .filter-search
4
- .form-field
5
- .field-input-wrapper
6
- - filters.each do |filter|
7
- - if filter.filter_type.eql?(:search)
8
- input.search-input value="#{params.dig(:filters, :search)}" placeholder="#{filter.placeholder}"
9
- span.search-input-icon
10
- i.fa.fa-search
1
+ = generate_filters(filters)
@@ -0,0 +1,7 @@
1
+ .nested-fields
2
+ - @model.available_fields[action_name.to_sym][assoc_name].each do |field|
3
+ = f.label field.field_name, class: 'field-label'
4
+ br
5
+ = input_field_for_column(f, field)
6
+ - if @reflections.select {|x| x if x.name == assoc_name}.first.macro == :has_many
7
+ = link_to_remove_association "remove #{assoc_name}", f
@@ -0,0 +1,6 @@
1
+ #tasks
2
+ = f.fields_for table_name do |record|
3
+ = render partial: '/cm_admin/main/nested_fields', locals: { f: record, assoc_name: table_name }
4
+ - if @reflections.select {|x| x if x.name == table_name}.first.macro == :has_many
5
+ .links
6
+ = link_to_add_association "add #{table_name}", f, table_name, partial: '/cm_admin/main/nested_fields', render_options: {locals: { assoc_name: table_name }}
@@ -2,13 +2,13 @@
2
2
  .table-top
3
3
  p.table-top__total-count = "#{@ar_object.pagy.count} #{@model.ar_model.table_name} found"
4
4
  .table-top__column-action
5
- button.secondary-btn.column-btn data-target="#columnActionModal" data-toggle="modal" type="button"
5
+ button.secondary-btn.column-btn data-bs-target="#columnActionModal" data-bs-toggle="modal"
6
6
  span
7
7
  i.fa.fa-columns.bolder
8
8
  span
9
9
  i.fa.fa-angle-down
10
10
 
11
- .new-admin-table
11
+ .new-admin-table.scrollable
12
12
  table.cm-table
13
13
  thead.cm-table__header
14
14
  tr.header-row
@@ -16,7 +16,7 @@
16
16
  span
17
17
  input.cm-checkbox type="checkbox"
18
18
  - @model.available_fields[:index].each do |column|
19
- th = column.header.present? ? column.header.to_s.titleize : column.db_column_name.to_s.titleize
19
+ th = column.header
20
20
  tbody.cm-table__body
21
21
  - @ar_object.data.each do |ar_object|
22
22
  tr.body-row
@@ -24,7 +24,8 @@
24
24
  span
25
25
  input.cm-checkbox type="checkbox"
26
26
  - @model.available_fields[:index].each do |column|
27
- td = column_for_field_helper(ar_object, column)
27
+ td
28
+ span class="#{column.cm_css_class}" = show_field_value(ar_object, column)
28
29
  td.row-action-cell
29
30
  .row-action-tool
30
31
  button.secondary-btn.tool-btn type="button"
@@ -0,0 +1,5 @@
1
+ ul.nav.nav-pills
2
+ - @model.available_tabs.each do |nav_item|
3
+ li.nav-item
4
+ - nav_item_action_name = nav_item.custom_action.present? ? nav_item.custom_action : 'show'
5
+ = link_to nav_item.nav_item_name.to_s.titleize, "/cm_admin/#{@model.name.underscore.pluralize}/#{@ar_object.id}/#{nav_item.custom_action}", class: "nav-link #{ nav_item_action_name == action_name ? 'active' : ''}"
@@ -3,13 +3,13 @@
3
3
  .bread-crumb-area
4
4
  = yield :bread_crumb
5
5
  .nav-title-area
6
- p.title-text = @model.current_action.page_title
7
- p.title-sub-text = @model.current_action.page_description
6
+ p.title-text = action_title
7
+ p.title-sub-text = action_description
8
8
  - if @model.current_action.name == 'index'
9
9
  .cm-navbar__rhs
10
10
  .export-container
11
11
  .dropdown
12
- button.secondary-btn type="button" data-toggle="dropdown"
12
+ button.secondary-btn data-bs-toggle='dropdown'
13
13
  span
14
14
  i.fa.fa-arrow-down
15
15
  span
@@ -18,7 +18,7 @@
18
18
  i.fa.fa-angle-down
19
19
  ul.dropdown-menu.export-popup
20
20
  li
21
- .popup-option.pointer data-toggle="modal" data-target="#exportmodal"
21
+ .popup-option.pointer data-bs-toggle='modal' data-bs-target='#exportmodal'
22
22
  span Export
23
23
 
24
24
  a.primary-btn.ml-2 href="#{page_url('new')}"
@@ -0,0 +1,6 @@
1
+ .cm-index-page
2
+ .index-page
3
+ .index-page__table-container.pt-0
4
+ == render 'cm_admin/main/associated_table'
5
+
6
+ = column_pop_up(@associated_model)
@@ -0,0 +1,6 @@
1
+ - @model.available_fields[@action.name.to_sym].each do |section|
2
+ .info-section
3
+ p.section-heading = section.section_name
4
+ .paper
5
+ - section.available_section_fields.each do |field|
6
+ = show_field(@associated_ar_object, field)
@@ -1,9 +1,12 @@
1
- == render 'cm_admin/main/top_navbar'
2
- .index-page
3
- - if @model.filters.present?
4
- .index-page__filters
5
- == render partial: 'cm_admin/main/filters', locals: { filters: @model.filters }
6
- .index-page__table-container
7
- == render 'cm_admin/main/table'
1
+ .cm-index-page
2
+ .index-page.page-container
3
+ .sticky-container
4
+ == render 'cm_admin/main/top_navbar'
5
+ - if @model.filters.present?
6
+ .index-page__filters
7
+ == render partial: 'cm_admin/main/filters', locals: { filters: @model.filters }
8
+ .index-page__table-container
9
+ == render 'cm_admin/main/table'
8
10
 
9
- = column_pop_up(@model)
11
+ = column_pop_up(@model)
12
+ = manage_column_pop_up(@model)
@@ -1,13 +1,12 @@
1
- == render 'cm_admin/main/top_navbar'
2
- .show-page
3
- .show-page__inner
4
- .info-section
5
- p.section-heading
6
- | Section heading
7
- .paper
8
- - @model.available_fields[:show].each do |field|
9
- .info-split
10
- .info-split__lhs
11
- p = field.label.present? ? field.label.to_s : field.field_name.to_s.titleize
12
- .info-split__rhs
13
- p = @ar_object.send(field.field_name)
1
+ .show-page.page-container
2
+ .show-page__tabs.sticky-container
3
+ .cm-tabs-bar
4
+ == render 'cm_admin/main/top_navbar'
5
+ == render 'cm_admin/main/tabs'
6
+ .show-page__inner.scrollable
7
+ - @model.available_fields[:show].each do |section|
8
+ .info-section
9
+ p.section-heading = section.section_name
10
+ .paper
11
+ - section.available_section_fields.each do |field|
12
+ = show_field(@ar_object, field)
@@ -0,0 +1,4 @@
1
+ main.flex-shrink-0
2
+ .container
3
+ h1.mt-5 401
4
+ p.lead You do not authorized to access this page.
@@ -5,12 +5,15 @@
5
5
  .cm-sidebar__quick-search
6
6
  span
7
7
  i.fa.fa-search
8
- input type="text" placeholder="Quick Links"
8
+ input data-bs-target="#quickSearchModal" data-bs-toggle="modal" type="text" placeholder="Quick Links"
9
9
 
10
10
  .cm-sidebar__menu-wrapper
11
- = sidebar_navigation
11
+ = navigation_links('sidebar')
12
12
 
13
- .cm-sidebar__footer
13
+ .sidebar-menu__tabs-wrapper
14
+
15
+
16
+ .sidebar__footer
14
17
  .profile-name
15
18
  span.profile-avatar J
16
19
  | John Doe
@@ -28,3 +31,4 @@
28
31
  .auth-option
29
32
  = link_to '/sign-out', method: :delete, class: 'auth-link'
30
33
  | Logout
34
+ = render 'layouts/quick_links'
@@ -0,0 +1,25 @@
1
+ #quickSearchModal.modal.fade.quick-search-modal aria-hidden="true" aria-labelledby="exampleModalLabel" role="dialog" tabindex="-1"
2
+ .modal-dialog role="document"
3
+ .modal-content
4
+ .modal-body
5
+ .quick-search-field
6
+ .form-field
7
+ .field-input-wrapper
8
+ input#quick-search-input.search-input placeholder="Search" data-behaviour="quick-input-search" autocomplete="off"
9
+ span.search-input-icon
10
+ i.fa.fa-search
11
+ span.clear-search.hidden
12
+ i.fa.fa-times
13
+ .search-results-container.list-area
14
+ = navigation_links('quick_links')
15
+ .results-action
16
+ .select
17
+ span.move-arrow
18
+ i.fa.fa-long-arrow-up
19
+ span.move-arrow
20
+ i.fa.fa-long-arrow-down
21
+ span Select
22
+ button.text-btn.enter-btn
23
+ | ENTER
24
+ button.text-btn.open-btn
25
+ | open
@@ -7,7 +7,11 @@ html
7
7
  = csrf_meta_tags
8
8
  = csp_meta_tag
9
9
  = stylesheet_link_tag 'cm_admin/cm_admin', media: 'all', 'data-turbolinks-track': 'reload'
10
+ = stylesheet_pack_tag 'cm_admin/application', 'data-turbolinks-track': 'reload'
11
+ link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" /
10
12
  = javascript_pack_tag 'cm_admin/application', 'data-turbolinks-track': 'reload'
13
+ script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"
14
+ script src="https://raw.githack.com/SortableJS/Sortable/master/Sortable.js"
11
15
  body
12
16
  - flash.each do |type, msg|
13
17
  .alert class="alert-#{type}"
@@ -15,4 +19,23 @@ html
15
19
  .cm-admin
16
20
  = render 'layouts/left_sidebar_nav'
17
21
  .panel-area
18
- = yield
22
+ - if defined?(@action) && @action&.layout_type.to_s == 'cm_association_show'
23
+ .show-page.page-container
24
+ .show-page__tabs.sticky-container
25
+ .cm-tabs-bar
26
+ == render 'cm_admin/main/top_navbar'
27
+ == render 'cm_admin/main/tabs'
28
+ .show-page__inner.scrollable
29
+ = yield
30
+ - elsif defined?(@action) && @action&.layout_type.to_s == 'cm_association_index'
31
+ .show-page.page-container
32
+ .show-page__tabs.sticky-container
33
+ .cm-tabs-bar
34
+ == render 'cm_admin/main/top_navbar'
35
+ == render 'cm_admin/main/tabs'
36
+ - if @associated_model.filters.present?
37
+ .index-page__filters
38
+ == render partial: 'cm_admin/main/filters', locals: { filters: @associated_model.filters }
39
+ = yield
40
+ - else
41
+ = yield