cm-admin 0.3.0 → 0.4.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (87) hide show
  1. checksums.yaml +4 -4
  2. data/CODE_OF_CONDUCT.md +74 -0
  3. data/Gemfile +2 -1
  4. data/Gemfile.lock +25 -24
  5. data/README.md +5 -3
  6. data/app/assets/stylesheets/cm_admin/base/auth.scss +0 -12
  7. data/app/assets/stylesheets/cm_admin/base/common.scss +1 -1
  8. data/app/assets/stylesheets/cm_admin/base/filters.scss +8 -7
  9. data/app/assets/stylesheets/cm_admin/base/form.scss +7 -73
  10. data/app/assets/stylesheets/cm_admin/base/navbar.scss +1 -3
  11. data/app/assets/stylesheets/cm_admin/base/quicksearch.scss +7 -0
  12. data/app/assets/stylesheets/cm_admin/base/scaffold.scss +39 -2
  13. data/app/assets/stylesheets/cm_admin/base/show.scss +24 -2
  14. data/app/assets/stylesheets/cm_admin/base/table.scss +270 -253
  15. data/app/assets/stylesheets/cm_admin/cm_admin.css.scss +1 -0
  16. data/app/assets/stylesheets/cm_admin/components/_dropdown-popup.scss +22 -10
  17. data/app/assets/stylesheets/cm_admin/components/_range.scss +13 -2
  18. data/app/assets/stylesheets/cm_admin/components/_status-tag.scss +7 -6
  19. data/app/assets/stylesheets/cm_admin/helpers/_variable.scss +1 -0
  20. data/app/assets/stylesheets/cm_admin/scaffold.scss +14 -0
  21. data/app/controllers/cm_admin/application_controller.rb +5 -0
  22. data/app/controllers/cm_admin/exports_controller.rb +1 -1
  23. data/app/controllers/cm_admin/static_controller.rb +12 -0
  24. data/app/helpers/cm_admin/custom_helper.rb +4 -0
  25. data/app/javascript/packs/cm_admin/application.js +15 -1
  26. data/app/javascript/packs/cm_admin/filters.js +331 -16
  27. data/app/javascript/packs/cm_admin/quick_search.js +67 -0
  28. data/app/javascript/packs/cm_admin/scaffolds.js +30 -1
  29. data/app/javascript/stylesheets/cm_admin/application.scss +4 -0
  30. data/app/views/cm_admin/main/_associated_table.html.slim +60 -0
  31. data/app/views/cm_admin/main/_cm_pagy_nav.html.slim +6 -6
  32. data/app/views/cm_admin/main/_filters.html.slim +1 -10
  33. data/app/views/cm_admin/main/_nested_fields.html.slim +7 -0
  34. data/app/views/cm_admin/main/_nested_table_form.html.slim +6 -0
  35. data/app/views/cm_admin/main/_table.html.slim +9 -20
  36. data/app/views/cm_admin/main/_tabs.html.slim +5 -0
  37. data/app/views/cm_admin/main/_top_navbar.html.slim +12 -6
  38. data/app/views/cm_admin/main/associated_index.html.slim +6 -0
  39. data/app/views/cm_admin/main/associated_show.html.slim +6 -0
  40. data/app/views/cm_admin/main/edit.html.slim +10 -7
  41. data/app/views/cm_admin/main/index.html.slim +11 -8
  42. data/app/views/cm_admin/main/show.html.slim +12 -13
  43. data/app/views/cm_admin/static/error_401.html.slim +4 -0
  44. data/app/views/layouts/_flash_message.html.slim +9 -0
  45. data/app/views/layouts/_left_sidebar_nav.html.slim +7 -3
  46. data/app/views/layouts/_quick_links.html.slim +25 -0
  47. data/app/views/layouts/cm_admin.html.slim +25 -1
  48. data/app/views/layouts/static.html.slim +18 -0
  49. data/bin/console +0 -1
  50. data/cm_admin.gemspec +2 -1
  51. data/config/routes.rb +2 -1
  52. data/config/webpack/environment.js +3 -2
  53. data/lib/.DS_Store +0 -0
  54. data/lib/cm_admin/constants.rb +3 -0
  55. data/lib/cm_admin/model.rb +66 -167
  56. data/lib/cm_admin/models/action.rb +18 -2
  57. data/lib/cm_admin/models/cm_show_section.rb +20 -0
  58. data/lib/cm_admin/models/column.rb +49 -4
  59. data/lib/cm_admin/models/controller_method.rb +76 -0
  60. data/lib/cm_admin/models/custom_action.rb +13 -0
  61. data/lib/cm_admin/models/dsl_method.rb +122 -0
  62. data/lib/cm_admin/models/export.rb +16 -5
  63. data/lib/cm_admin/models/field.rb +2 -1
  64. data/lib/cm_admin/models/filter.rb +67 -2
  65. data/lib/cm_admin/models/form_field.rb +21 -0
  66. data/lib/cm_admin/models/tab.rb +13 -0
  67. data/lib/cm_admin/version.rb +1 -1
  68. data/lib/cm_admin/view_helpers/column_field_helper.rb +29 -0
  69. data/lib/cm_admin/view_helpers/field_display_helper.rb +71 -0
  70. data/lib/cm_admin/view_helpers/filter_helper.rb +190 -0
  71. data/lib/cm_admin/view_helpers/form_field_helper.rb +21 -4
  72. data/lib/cm_admin/view_helpers/form_helper.rb +22 -12
  73. data/lib/cm_admin/view_helpers/manage_column_popup_helper.rb +75 -0
  74. data/lib/cm_admin/view_helpers/navigation_helper.rb +22 -6
  75. data/lib/cm_admin/view_helpers/page_info_helper.rb +36 -0
  76. data/lib/cm_admin/view_helpers.rb +3 -1
  77. data/lib/cm_admin.rb +3 -1
  78. data/lib/generators/cm_admin/install_generator.rb +20 -8
  79. data/package.json +7 -1
  80. data/tmp/cache/webpacker/last-compilation-digest-development +1 -0
  81. data/yarn.lock +52 -17
  82. metadata +46 -9
  83. data/app/controllers/cm_admin/main_controller.rb +0 -8
  84. data/lib/c.png +0 -0
  85. data/lib/cm_admin/view_helpers/field_column_helper.rb +0 -23
  86. data/lib/generators/cm_admin/templates/cm_admin_initializer.rb +0 -4
  87. data/yarn-error.log +0 -44
@@ -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} text-ellipsis" = 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.text-ellipsis
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"
@@ -36,22 +37,10 @@
36
37
  .popup-option
37
38
  a href="#{page_url('edit', ar_object)}"
38
39
  | Edit
39
- / .cm-pagination
40
- / .cm-pagination__lhs Showing 1 to 15 out of 104
41
- / .cm-pagination__rhs
42
- / span.page-move-btn.disabled
43
- / i.fa.fa-angle-double-left.bolder.f14
44
- / span.page-move-btn.disabled
45
- / i.fa.fa-chevron-left.bolder
46
- / span.page-num-btn.active 1
47
- / span.page-num-btn 2
48
- / span.page-num-btn 3
49
- / span.page-num-btn 4
50
- / span.page-num-btn 5
51
- / span.page-move-btn
52
- / i.fa.fa-chevron-right.bolder
53
- / span.page-move-btn
54
- / i.fa.fa-angle-double-right.bolder.f14
40
+ - @model.available_actions.select{|act| act if act.route_type == 'member'}.each do |custom_action|
41
+ - if custom_action.display_if.call(ar_object)
42
+ .popup-option
43
+ = link_to custom_action.name, custom_action.path.gsub(':id', ar_object.id.to_s), method: custom_action.verb
55
44
 
56
45
  .cm-pagination
57
46
  .cm-pagination__lhs Showing #{@ar_object.pagy.from} to #{@ar_object.pagy.to} out of #{@ar_object.pagy.count}
@@ -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
8
- - if @model.current_action.name == 'index'
9
- .cm-navbar__rhs
6
+ p.title-text = action_title
7
+ p.title-sub-text = action_description
8
+ .cm-navbar__rhs
9
+ - if @model.current_action.name == 'index'
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,8 +18,14 @@
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')}"
25
25
  | Add
26
+ - @model.available_actions.select{|act| act if act.route_type == 'collection'}.each do |custom_action|
27
+ = link_to custom_action.name, @model.ar_model.table_name + '/' + custom_action.path, class: 'primary-btn ml-2', method: custom_action.verb
28
+ - elsif @model.current_action.name == 'show'
29
+ - @model.available_actions.select{|act| act if act.route_type == 'member'}.each do |custom_action|
30
+ - if custom_action.display_if.call(@ar_object)
31
+ = link_to custom_action.name, custom_action.path.gsub(':id', params[:id]), class: 'primary-btn ml-2', method: custom_action.verb
@@ -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)
@@ -2,16 +2,19 @@
2
2
  .form-page
3
3
  .form-page__inner
4
4
  .form-wrapper
5
- .flag-alert.mb-4
6
- p.alert-header
5
+ - if @ar_object.errors.present?
6
+ .flag-alert.mb-4
7
+ p.alert-header
7
8
  span
8
9
  i.fa.fa-exclamation-triangle
9
10
  | Attention
10
- .alert-body
11
- p.body-title
12
- | Error heading
13
- p.body-info
14
- | The details of the error would be explained in this line. It could also be listed out as points on below the other if there are multiple reasons.
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
15
18
  .form-container
16
19
  p.form-title
17
20
  | Section heading
@@ -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.
@@ -0,0 +1,9 @@
1
+ - if flash[:notice].present?
2
+ javascript:
3
+ $.jGrowl("#{flash[:notice]}", {theme: 'notice'})
4
+ - elsif flash[:success].present?
5
+ javascript:
6
+ $.jGrowl("#{flash[:success]}", {theme: 'success'})
7
+ - elsif flash[:alert].present?
8
+ javascript:
9
+ $.jGrowl("#{flash[:alert]}", {theme: 'error'})
@@ -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,24 @@ 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
42
+ = render 'layouts/flash_message'
@@ -0,0 +1,18 @@
1
+ doctype html
2
+ html
3
+ head
4
+ title
5
+ | Admin
6
+ meta[name="viewport" content="width=device-width,initial-scale=1"]
7
+ = csrf_meta_tags
8
+ = csp_meta_tag
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
+ = javascript_pack_tag 'cm_admin/application', 'data-turbolinks-track': 'reload'
12
+ body
13
+ - flash.each do |type, msg|
14
+ .alert class="alert-#{type}"
15
+ = msg
16
+ .cm-admin-static
17
+ .d-flex.flex-column.h-100
18
+ = yield
data/bin/console CHANGED
@@ -1,7 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require "bundler/setup"
4
- require "cm_admin"
5
4
 
6
5
  # You can add fixtures and/or initialization code here to make experimenting
7
6
  # with your gem easier. You can also use a different console, if you like.
data/cm_admin.gemspec CHANGED
@@ -26,8 +26,9 @@ Gem::Specification.new do |spec|
26
26
  spec.bindir = "exe"
27
27
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
28
  spec.require_paths = ["lib"]
29
- spec.add_runtime_dependency 'pagy', '~> 3.13'
29
+ spec.add_runtime_dependency 'pagy', '~> 4.11.0'
30
30
  spec.add_runtime_dependency 'slim', '~> 4.1.0'
31
31
  spec.add_runtime_dependency 'webpacker', '~> 5.2.1'
32
32
  spec.add_runtime_dependency 'axlsx_rails', '~> 0.6.1'
33
+ spec.add_runtime_dependency 'cocoon', '~> 1.2.15'
33
34
  end
data/config/routes.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  CmAdmin::Engine.routes.draw do
2
- controller 'main' do
2
+ controller 'static' do
3
3
  get '/', action: 'dashboard'
4
+ get '/access-denied', action: 'error_403'
4
5
  end
5
6
 
6
7
  controller 'exports' do
@@ -3,8 +3,9 @@ const { environment } = require('@rails/webpacker')
3
3
  const webpack = require('webpack')
4
4
  environment.plugins.prepend('Provide',
5
5
  new webpack.ProvidePlugin({
6
- $: 'jquery/src/jquery',
7
- jQuery: 'jquery/src/jquery',
6
+ $: 'jquery',
7
+ jQuery: 'jquery',
8
+ moment: 'moment',
8
9
  Popper: ['popper.js', 'default']
9
10
  })
10
11
  )
data/lib/.DS_Store ADDED
Binary file
@@ -27,6 +27,9 @@ module CmAdmin
27
27
  destroy: {
28
28
  verb: :delete,
29
29
  path: ':id'
30
+ },
31
+ custom_action: {
32
+ verb: :post
30
33
  }
31
34
  }
32
35
  REJECTABLE_FIELDS = %w(id created_at updated_at)