cm-admin 0.3.0 → 0.4.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 (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