cm-admin 0.4.1 → 0.5.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 (35) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/Gemfile.lock +8 -10
  4. data/README.md +2 -23
  5. data/app/assets/stylesheets/cm_admin/base/common.scss +1 -1
  6. data/app/assets/stylesheets/cm_admin/base/form.scss +0 -1
  7. data/app/assets/stylesheets/cm_admin/base/scaffold.scss +2 -0
  8. data/app/assets/stylesheets/cm_admin/cm_admin.css.scss +1 -0
  9. data/app/assets/stylesheets/cm_admin/components/_status-tag.scss +5 -5
  10. data/app/assets/stylesheets/cm_admin/scaffold.scss +14 -0
  11. data/app/javascript/packs/cm_admin/application.js +1 -0
  12. data/app/javascript/stylesheets/cm_admin/application.scss +2 -1
  13. data/app/views/cm_admin/main/_associated_table.html.slim +2 -2
  14. data/app/views/cm_admin/main/_table.html.slim +17 -26
  15. data/app/views/cm_admin/main/_top_navbar.html.slim +13 -2
  16. data/app/views/cm_admin/main/associated_index.html.slim +2 -2
  17. data/app/views/cm_admin/main/edit.html.slim +10 -7
  18. data/app/views/layouts/_custom_action_modals.html.slim +9 -0
  19. data/app/views/layouts/_flash_message.html.slim +9 -0
  20. data/app/views/layouts/cm_admin.html.slim +6 -3
  21. data/cm_admin.gemspec +1 -1
  22. data/config/routes.rb +1 -1
  23. data/lib/cm_admin/constants.rb +3 -0
  24. data/lib/cm_admin/model.rb +18 -2
  25. data/lib/cm_admin/models/action.rb +8 -2
  26. data/lib/cm_admin/models/controller_method.rb +3 -2
  27. data/lib/cm_admin/models/custom_action.rb +13 -0
  28. data/lib/cm_admin/models/dsl_method.rb +17 -4
  29. data/lib/cm_admin/version.rb +1 -1
  30. data/lib/cm_admin/view_helpers/field_display_helper.rb +7 -1
  31. data/lib/cm_admin/view_helpers/page_info_helper.rb +7 -2
  32. data/package.json +1 -0
  33. data/tmp/cache/webpacker/last-compilation-digest-development +1 -1
  34. data/yarn.lock +17 -12
  35. metadata +8 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b468292084cb503cdffd0306b66b2d30eabe67f59f3b05037418eba24ed5cc21
4
- data.tar.gz: 876b6dc6bf6a003cc4a792cdaf9071737b90b29abe6ba175401f0d63af58fe9b
3
+ metadata.gz: 2047ac958ebd117645f7089227af0177f495f1cf640791c3e2f9fb2920fc1f04
4
+ data.tar.gz: 3f81a0d55a072ec52cb51b54e04cfd77edc87e562275539045ec39ca98e5b6ca
5
5
  SHA512:
6
- metadata.gz: d526d75a25af290a0564fb45beb2c4d59fe31990a8fde29396b2ffbc01d9b46753ea0484e36364bb43a84f7c05d4c8d79de633a875df2fdb2e8888a1f098091d
7
- data.tar.gz: d966acb8de4162bdf5dd7cf5e2022d3ce7f0b0451e3c50f73a5dfa6ef8d56804f8f5d0df724895068926dd567322c0d2ebc66eabeb6227f6a69d8df3506876d4
6
+ metadata.gz: b7f8ac87cb03febd769e5f11a8e4819eff5cb978727c1bc55d73680970147b1e28c15293d1d819dbec11c290fc090126a32bdc3db1f30d7202013bbf4a43c25b
7
+ data.tar.gz: 370da992ee711a9e2d15d665e4ee2e595ab4767e3761c58d603ad3a6abef95b1f09412e8d92e7ea0dea3763f1ce1332a735f42a9d5b27e7e35f05800fcc6d863
data/Gemfile CHANGED
@@ -1,6 +1,6 @@
1
1
  source "https://rubygems.org"
2
2
 
3
- gem 'pagy'
3
+ gem 'pagy', '~> 4.11.0'
4
4
  gem 'slim'
5
5
  gem "rake", "~> 12.0"
6
6
  gem "rspec", "~> 3.0"
data/Gemfile.lock CHANGED
@@ -1,10 +1,10 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- cm-admin (0.3.0)
4
+ cm-admin (0.4.2)
5
5
  axlsx_rails (~> 0.6.1)
6
6
  cocoon (~> 1.2.15)
7
- pagy (~> 3.13)
7
+ pagy (~> 4.11.0)
8
8
  slim (~> 4.1.0)
9
9
  webpacker (~> 5.2.1)
10
10
 
@@ -34,7 +34,7 @@ GEM
34
34
  actionpack (>= 3.1)
35
35
  caxlsx (>= 3.0)
36
36
  builder (3.2.4)
37
- caxlsx (3.1.0)
37
+ caxlsx (3.1.1)
38
38
  htmlentities (~> 4.3, >= 4.3.4)
39
39
  marcel (~> 1.0)
40
40
  nokogiri (~> 1.10, >= 1.10.4)
@@ -50,14 +50,12 @@ GEM
50
50
  loofah (2.12.0)
51
51
  crass (~> 1.0.2)
52
52
  nokogiri (>= 1.5.9)
53
- marcel (1.0.1)
53
+ marcel (1.0.2)
54
54
  method_source (1.0.0)
55
- mini_portile2 (2.6.1)
56
55
  minitest (5.14.4)
57
- nokogiri (1.12.4)
58
- mini_portile2 (~> 2.6.1)
56
+ nokogiri (1.12.5-x86_64-darwin)
59
57
  racc (~> 1.4)
60
- pagy (3.14.0)
58
+ pagy (4.11.0)
61
59
  racc (1.5.2)
62
60
  rack (2.2.3)
63
61
  rack-proxy (0.7.0)
@@ -112,10 +110,10 @@ PLATFORMS
112
110
  DEPENDENCIES
113
111
  cm-admin!
114
112
  cocoon
115
- pagy
113
+ pagy (~> 4.11.0)
116
114
  rake (~> 12.0)
117
115
  rspec (~> 3.0)
118
116
  slim
119
117
 
120
118
  BUNDLED WITH
121
- 2.2.17
119
+ 2.0.2
data/README.md CHANGED
@@ -7,7 +7,7 @@ New CmAdmin gem
7
7
  Add this line to your application's Gemfile:
8
8
 
9
9
  ```ruby
10
- gem 'cm_admin'
10
+ gem 'cm-admin'
11
11
  ```
12
12
 
13
13
  And then execute:
@@ -16,7 +16,7 @@ And then execute:
16
16
 
17
17
  Or install it yourself as:
18
18
 
19
- $ gem install cm_admin
19
+ $ gem install cm-admin
20
20
 
21
21
  ## Usage
22
22
 
@@ -24,27 +24,6 @@ Install the gem
24
24
 
25
25
  $ rails g cm_admin:install
26
26
 
27
- For generating the index page views
28
-
29
- $ rails g cm_admin:view products index title description
30
-
31
- For generating the show page views
32
-
33
- $ rails g cm_admin:view products show title description
34
-
35
- For generating the form page views
36
- $ rails g cm_admin:view products form column_name:field_type
37
- $ rails g cm_admin:view products form title:string description:string
38
-
39
- Following field types are acceted
40
-
41
- * input-integer
42
- * input-string
43
- * single-select
44
- * multi-select
45
- * checkbox
46
- * radio
47
-
48
27
  ## Usage
49
28
 
50
29
  For demo check [here](http://cm-admin.labs.commutatus.com/admin/users/)
@@ -199,7 +199,7 @@
199
199
  margin-left: 2px;
200
200
  }
201
201
 
202
- .text-ellipsis {
202
+ .text-ellipsis div {
203
203
  overflow: hidden;
204
204
  text-overflow: ellipsis;
205
205
  }
@@ -9,7 +9,6 @@
9
9
  }
10
10
 
11
11
  .form-page {
12
- margin-top: 140px;
13
12
  padding: 24px;
14
13
  background-color: $white;
15
14
  &__inner {
@@ -22,6 +22,8 @@ body {
22
22
  .panel-area {
23
23
  width: calc(100% - 225px);
24
24
  margin-left: 225px;
25
+ height: 100vh;
26
+ overflow-y: auto;
25
27
  }
26
28
 
27
29
  .components {
@@ -22,5 +22,6 @@
22
22
  *= require 'cm_admin/base/common'
23
23
  *= require 'cm_admin/components/index'
24
24
  *= require 'cm_admin/dependency/bootstrap.min'
25
+ *= require 'cm_admin/scaffold'
25
26
  *= require_self
26
27
  */
@@ -4,23 +4,23 @@
4
4
  font-size: $t4-text;
5
5
  line-height: 22px;
6
6
  padding: 4px;
7
- &.default-tag {
7
+ &.default-0 {
8
8
  color: $primary-text-clr;
9
9
  background: $grey-lighter-clr;
10
10
  }
11
- &.green-tag {
11
+ &.default-1 {
12
12
  color: $green-regular-clr;
13
13
  background: $green-lightest-clr;
14
14
  }
15
- &.yellow-tag {
15
+ &.default-2 {
16
16
  color: $yellow-regular-clr;
17
17
  background: $yellow-lightest-clr;
18
18
  }
19
- &.red-tag {
19
+ &.default-3 {
20
20
  color: $red-regular-clr;
21
21
  background: $red-lightest-clr;
22
22
  }
23
- &.blue-tag {
23
+ &.default-4 {
24
24
  color: $blue-regular-clr;
25
25
  background: $blue-lightest-clr;
26
26
  }
@@ -0,0 +1,14 @@
1
+ .jGrowl {
2
+ color: #1D2129 !important;
3
+ font-size: 14px !important;
4
+ .success{
5
+ background-color: #C1EDE2 !important;
6
+ }
7
+ .notice {
8
+ background-color: #CDE1FB !important;
9
+ }
10
+ .error {
11
+ background-color: #FDCFCF !important;
12
+ }
13
+
14
+ }
@@ -6,6 +6,7 @@ require("jquery")
6
6
  require("moment")
7
7
  require("bootstrap")
8
8
  require('flatpickr')
9
+ require("jgrowl")
9
10
  require('./scaffolds.js')
10
11
  require('./quick_search.js')
11
12
  require('./filters.js')
@@ -1,3 +1,4 @@
1
1
  @import "bootstrap/scss/bootstrap";
2
2
  @import "flatpickr/dist/flatpickr";
3
- @import "../../../../node_modules/daterangepicker/daterangepicker.css";
3
+ @import "../../../../node_modules/daterangepicker/daterangepicker.css";
4
+ @import "jgrowl/jquery.jgrowl"
@@ -1,6 +1,6 @@
1
1
  .admin-table-index
2
2
  .table-top
3
- p.table-top__total-count = "#{@associated_ar_object.pagy.count} #{@associated_model.ar_model.table_name} found"
3
+ p.table-top__total-count = "#{@associated_ar_object.pagy.count} #{@associated_model&.ar_model&.table_name} found"
4
4
  .table-top__column-action
5
5
  button.secondary-btn.column-btn data-target="#columnActionModal" data-toggle="modal" type="button"
6
6
  span
@@ -25,7 +25,7 @@
25
25
  input.cm-checkbox type="checkbox"
26
26
  - @model.available_fields[@action.name.to_sym].each do |column|
27
27
  td
28
- span class="#{column.cm_css_class}" = show_field_value(ar_object, column)
28
+ span class="#{column.cm_css_class} text-ellipsis" = show_field_value(ar_object, column)
29
29
  td.row-action-cell
30
30
  .row-action-tool
31
31
  button.secondary-btn.tool-btn type="button"
@@ -1,13 +1,12 @@
1
1
  .admin-table-index
2
2
  .table-top
3
3
  p.table-top__total-count = "#{@ar_object.pagy.count} #{@model.ar_model.table_name} found"
4
- .table-top__column-action
5
- button.secondary-btn.column-btn data-bs-target="#columnActionModal" data-bs-toggle="modal"
6
- span
7
- i.fa.fa-columns.bolder
8
- span
9
- i.fa.fa-angle-down
10
-
4
+ // .table-top__column-action
5
+ // button.secondary-btn.column-btn data-bs-target="#columnActionModal" data-bs-toggle="modal"
6
+ // span
7
+ // i.fa.fa-columns.bolder
8
+ // span
9
+ // i.fa.fa-angle-down
11
10
  .new-admin-table.scrollable
12
11
  table.cm-table
13
12
  thead.cm-table__header
@@ -23,9 +22,13 @@
23
22
  td.check-box-space
24
23
  span
25
24
  input.cm-checkbox type="checkbox"
26
- - @model.available_fields[:index].each do |column|
27
- td
28
- span class="#{column.cm_css_class}" = show_field_value(ar_object, column)
25
+ - @model.available_fields[:index].each_with_index do |column, index|
26
+ td.text-ellipsis
27
+ span class="#{column.cm_css_class}"
28
+ - if index == 0
29
+ = link_to ar_object.send(column.field_name), "/cm_admin/#{@model.ar_model.table_name}/#{ar_object.id}"
30
+ - else
31
+ = show_field_value(ar_object, column)
29
32
  td.row-action-cell
30
33
  .row-action-tool
31
34
  button.secondary-btn.tool-btn type="button"
@@ -37,22 +40,10 @@
37
40
  .popup-option
38
41
  a href="#{page_url('edit', ar_object)}"
39
42
  | 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
43
+ - @model.available_actions.select{|act| act if act.route_type == 'member'}.each do |custom_action|
44
+ - if custom_action.display_if.call(ar_object)
45
+ .popup-option
46
+ = link_to custom_action.name, custom_action.path.gsub(':id', ar_object.id.to_s), method: custom_action.verb
56
47
 
57
48
  .cm-pagination
58
49
  .cm-pagination__lhs Showing #{@ar_object.pagy.from} to #{@ar_object.pagy.to} out of #{@ar_object.pagy.count}
@@ -5,8 +5,8 @@
5
5
  .nav-title-area
6
6
  p.title-text = action_title
7
7
  p.title-sub-text = action_description
8
- - if @model.current_action.name == 'index'
9
- .cm-navbar__rhs
8
+ .cm-navbar__rhs
9
+ - if @model.current_action.name == 'index'
10
10
  .export-container
11
11
  .dropdown
12
12
  button.secondary-btn data-bs-toggle='dropdown'
@@ -23,3 +23,14 @@
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
+ - if custom_action.display_type == :button
28
+ = link_to custom_action.name.titleize, @model.ar_model.table_name + '/' + custom_action.path, class: 'primary-btn ml-2', method: custom_action.verb
29
+ - elsif custom_action.display_type == :modal
30
+ = link_to custom_action.name.titleize, '', class: 'primary-btn ml-2', data: { bs_toggle: "modal", bs_target: "##{custom_action.name.classify}Modal" }
31
+ - elsif @model.current_action.name == 'show'
32
+ - @model.available_actions.select{|act| act if act.route_type == 'member'}.each do |custom_action|
33
+ - if custom_action.display_type == :button && custom_action.display_if.call(@ar_object)
34
+ = link_to custom_action.name.titleize, custom_action.path.gsub(':id', params[:id]), class: 'primary-btn ml-2', method: custom_action.verb
35
+ - elsif custom_action.display_type == :modal && custom_action.display_if.call(@ar_object)
36
+ = link_to custom_action.name.titleize, '', class: 'primary-btn ml-2', data: { bs_toggle: "modal", bs_target: "##{custom_action.name.classify}Modal" }
@@ -1,6 +1,6 @@
1
1
  .cm-index-page
2
2
  .index-page
3
3
  .index-page__table-container.pt-0
4
- == render 'cm_admin/main/associated_table'
4
+ == render partial: 'cm_admin/main/associated_table'
5
5
 
6
- = column_pop_up(@associated_model)
6
+ // = column_pop_up(@associated_model)
@@ -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
@@ -0,0 +1,9 @@
1
+ - @model.available_actions.select{|act| act if act.route_type == 'collection' && act.display_type == :modal}.each do |custom_action|
2
+ .modal.fade id="#{custom_action.name.classify}Modal" aria-hidden="true" aria-labelledby="exampleModalLabel" tabindex="1"
3
+ .modal-dialog
4
+ .modal-content
5
+ .modal-header
6
+ h5#exampleModalLabel.modal-title = custom_action.name.classify
7
+ button.btn-close aria-label="Close" data-bs-dismiss="modal" type="button"
8
+ .modal-body
9
+ = render partial: custom_action.partial
@@ -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'})
@@ -19,7 +19,7 @@ html
19
19
  .cm-admin
20
20
  = render 'layouts/left_sidebar_nav'
21
21
  .panel-area
22
- - if defined?(@action) && @action&.layout_type.to_s == 'cm_association_show'
22
+ - if defined?(@action) && (@action&.layout_type.to_s == 'cm_association_show' || @action.parent == "show")
23
23
  .show-page.page-container
24
24
  .show-page__tabs.sticky-container
25
25
  .cm-tabs-bar
@@ -27,15 +27,18 @@ html
27
27
  == render 'cm_admin/main/tabs'
28
28
  .show-page__inner.scrollable
29
29
  = yield
30
- - elsif defined?(@action) && @action&.layout_type.to_s == 'cm_association_index'
30
+ - elsif defined?(@action) && (@action&.layout_type.to_s == 'cm_association_index' || @action.parent == "index")
31
31
  .show-page.page-container
32
32
  .show-page__tabs.sticky-container
33
33
  .cm-tabs-bar
34
34
  == render 'cm_admin/main/top_navbar'
35
35
  == render 'cm_admin/main/tabs'
36
- - if @associated_model.filters.present?
36
+ - if @associated_model && @associated_model.filters.present?
37
37
  .index-page__filters
38
38
  == render partial: 'cm_admin/main/filters', locals: { filters: @associated_model.filters }
39
39
  = yield
40
40
  - else
41
41
  = yield
42
+ = render 'layouts/flash_message'
43
+ = render 'layouts/custom_action_modals'
44
+
data/cm_admin.gemspec CHANGED
@@ -26,7 +26,7 @@ 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'
data/config/routes.rb CHANGED
@@ -10,7 +10,7 @@ CmAdmin::Engine.routes.draw do
10
10
 
11
11
  # Defining action routes for each model
12
12
  CmAdmin.cm_admin_models.each do |model|
13
- model.available_actions.each do |act|
13
+ model.available_actions.sort_by {|act| act.class}.each do |act|
14
14
  scope model.name.tableize do
15
15
  send(act.verb, act.path.present? ? act.path : act.name, to: "#{model.name.underscore}##{act.name}")
16
16
  end
@@ -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)
@@ -1,5 +1,6 @@
1
1
  require_relative 'constants'
2
2
  require_relative 'models/action'
3
+ require_relative 'models/custom_action'
3
4
  require_relative 'models/field'
4
5
  require_relative 'models/form_field'
5
6
  require_relative 'models/blocks'
@@ -91,7 +92,6 @@ module CmAdmin
91
92
  # If model is User, controller will be UsersController
92
93
  def define_controller
93
94
  klass = Class.new(CmAdmin::ApplicationController) do
94
-
95
95
  $available_actions.each do |action|
96
96
  define_method action.name.to_sym do
97
97
 
@@ -99,8 +99,10 @@ module CmAdmin
99
99
  @model = CmAdmin::Model.find_by(name: controller_name.classify)
100
100
  @model.params = params
101
101
  @action = CmAdmin::Models::Action.find_by(@model, name: action_name)
102
- @ar_object = @model.try(action_name, params)
102
+ @ar_object = @model.try(@action.parent || action_name, params)
103
103
  @ar_object, @associated_model, @associated_ar_object = @model.custom_controller_action(action_name, params.permit!) if !@ar_object.present? && params[:id].present?
104
+ aar_model = request.url.split('/')[-2].classify.constantize if params[:aar_id]
105
+ @associated_ar_object = aar_model.find(params[:aar_id]) if params[:aar_id]
104
106
  nested_tables = @model.available_fields[:new].except(:fields).keys
105
107
  nested_tables += @model.available_fields[:edit].except(:fields).keys
106
108
  @reflections = @model.ar_model.reflect_on_all_associations
@@ -125,6 +127,20 @@ module CmAdmin
125
127
  else
126
128
  format.html { render '/cm_admin/main/new' }
127
129
  end
130
+ elsif action.action_type == :custom
131
+ if action.child_records
132
+ format.html { render action.layout }
133
+ elsif action.display_type == :page
134
+ data = @action.parent == "index" ? @ar_object.data : @ar_object
135
+ format.html { render action.partial }
136
+ else
137
+ redirect_url = request.referrer || "/cm_admin/#{@model.ar_model.table_name}/#{@ar_object.id}"
138
+ if @action.code_block.call(@ar_object)
139
+ format.html { redirect_to redirect_url }
140
+ else
141
+ format.html { redirect_to redirect_url }
142
+ end
143
+ end
128
144
  elsif action.layout.present?
129
145
  if request.xhr? && action.partial.present?
130
146
  format.html { render partial: action.partial }
@@ -4,9 +4,11 @@ module CmAdmin
4
4
  module Models
5
5
  class Action
6
6
  include Actions::Blocks
7
- attr_accessor :name, :verb, :layout_type, :layout, :partial, :path, :page_title, :page_description, :child_records, :is_nested_field, :nested_table_name
7
+ attr_accessor :name, :verb, :layout_type, :layout, :partial, :path, :page_title, :page_description,
8
+ :child_records, :is_nested_field, :nested_table_name, :parent, :display_if, :route_type, :code_block,
9
+ :display_type, :action_type
8
10
 
9
- def initialize(attributes = {})
11
+ def initialize(attributes = {}, &block)
10
12
  if attributes[:layout_type].present? && attributes[:layout].nil? && attributes[:partial].nil?
11
13
  case attributes[:layout_type]
12
14
  when 'cm_association_index'
@@ -20,10 +22,14 @@ module CmAdmin
20
22
  attributes.each do |key, value|
21
23
  self.send("#{key.to_s}=", value)
22
24
  end
25
+ self.send("code_block=", block) if block_given?
23
26
  end
24
27
 
25
28
  def set_default_values
26
29
  self.is_nested_field = false
30
+ self.display_if = lambda { |arg| return true }
31
+ self.display_type = :button
32
+ self.action_type = :default
27
33
  end
28
34
 
29
35
  class << self
@@ -29,7 +29,8 @@ module CmAdmin
29
29
  @ar_object.assign_attributes(resource_params(params))
30
30
  @ar_object
31
31
  end
32
-
32
+
33
+
33
34
  def create(params)
34
35
  @ar_object = @ar_model.new(resource_params(params))
35
36
  end
@@ -64,7 +65,7 @@ module CmAdmin
64
65
  nested_fields = nested_tables.map {|table|
65
66
  Hash[
66
67
  table.to_s + '_attributes',
67
- table.to_s.singularize.titleize.constantize.columns.map(&:name).reject { |i| CmAdmin::REJECTABLE_FIELDS.include?(i) }.map(&:to_sym) + [:id, :_destroy]
68
+ table.to_s.classify.constantize.columns.map(&:name).reject { |i| CmAdmin::REJECTABLE_FIELDS.include?(i) }.map(&:to_sym) + [:id, :_destroy]
68
69
  ]
69
70
  }
70
71
  permittable_fields += nested_fields
@@ -0,0 +1,13 @@
1
+ require_relative 'actions/blocks'
2
+
3
+ module CmAdmin
4
+ module Models
5
+ class CustomAction < Action
6
+ class << self
7
+ def find_by(model, search_hash)
8
+ model.available_actions.find { |i| i.name == search_hash[:name] }
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -3,6 +3,13 @@ module CmAdmin
3
3
  module DslMethod
4
4
  extend ActiveSupport::Concern
5
5
 
6
+ def cm_page(name: nil, partial: nil, path: nil, route_type: nil, page_title: nil, display_type: :button, &block)
7
+ action = CmAdmin::Models::CustomAction.new(name: name, verb: :get, partial: partial, path: path, route_type: route_type, display_type: display_type, &block)
8
+ @available_actions << action
9
+ # @available_actions << CmAdmin::Models::CustomAction.new(name: name, verb: 'get', layout: 'cm_admin', partial: partial, path: path, parent: self.current_action.name, route_type: route_type, page_title: page_title, display_type: display_type, &block)
10
+ # @current_action = CmAdmin::Models::CustomAction.find_by(self, name: name)
11
+ end
12
+
6
13
  def cm_index(page_title: nil ,page_description: nil, &block)
7
14
  @current_action = CmAdmin::Models::Action.find_by(self, name: 'index')
8
15
  @current_action.page_title = page_title
@@ -49,7 +56,9 @@ module CmAdmin
49
56
  @current_action = CmAdmin::Models::Action.find_by(self, name: 'show')
50
57
  @available_tabs << CmAdmin::Models::Tab.new(tab_name, '', &block)
51
58
  else
52
- action = CmAdmin::Models::Action.new(name: custom_action.to_s, verb: :get, path: ':id/'+custom_action, layout_type: layout_type, layout: layout, partial: partial, child_records: associated_model)
59
+ action = CmAdmin::Models::Action.new(name: custom_action.to_s, verb: :get, path: ':id/'+custom_action,
60
+ layout_type: layout_type, layout: layout, partial: partial, child_records: associated_model,
61
+ action_type: :custom, display_type: :page)
53
62
  @available_actions << action
54
63
  @current_action = action
55
64
  @available_tabs << CmAdmin::Models::Tab.new(tab_name, custom_action, &block)
@@ -109,9 +118,13 @@ module CmAdmin
109
118
  # end
110
119
  # end
111
120
  # end
112
- def custom_action(name: nil, verb: nil, layout: nil, partial: nil, path: nil, &block)
113
- @available_actions << CmAdmin::Models::Action.new(name: name, verb: verb, layout: layout, partial: partial, path: path)
114
- self.class.class_eval(&block)
121
+ def custom_action(name: nil, verb: nil, layout: nil, layout_type: nil, partial: nil, path: nil, display_type: nil, display_if: lambda { |arg| return true }, route_type: nil, &block)
122
+ action = CmAdmin::Models::CustomAction.new(
123
+ name: name, verb: verb, layout: layout, layout_type: layout_type, partial: partial, path: path,
124
+ parent: self.current_action.name, display_type: display_type, display_if: display_if,
125
+ action_type: :custom, route_type: route_type, &block)
126
+ @available_actions << action
127
+ # self.class.class_eval(&block)
115
128
  end
116
129
 
117
130
  def filter(db_column_name, filter_type, options={})
@@ -1,3 +1,3 @@
1
1
  module CmAdmin
2
- VERSION = "0.4.1"
2
+ VERSION = "0.5.0"
3
3
  end
@@ -38,7 +38,13 @@ module CmAdmin
38
38
  end
39
39
  content_tag :a, href: link do
40
40
  ar_object.send(field.field_name).to_s
41
- end
41
+ end
42
+ when :enum
43
+ ar_object.send(field.field_name).to_s.titleize
44
+ when :tag
45
+ content_tag :span, class: "status-tag default-#{ar_object.send(field.field_name.to_s + '_before_type_cast')}" do
46
+ ar_object.send(field.field_name).to_s.titleize
47
+ end
42
48
  when :attachment
43
49
  concat show_attachment_value(ar_object, field)
44
50
  end
@@ -6,8 +6,10 @@ module CmAdmin
6
6
  end
7
7
 
8
8
  def action_title
9
- if @model.current_action.page_title
10
- title = @model.current_action.page_title
9
+ show_action = CmAdmin::Models::Action.find_by(@model, name: 'show')
10
+ title = @model.current_action.page_title || show_action.page_title
11
+ if title
12
+ title = (title.class == Symbol) ? @ar_object.send(title) : title
11
13
  else
12
14
  title = "#{@model.name}"
13
15
  case action_name
@@ -24,8 +26,11 @@ module CmAdmin
24
26
  end
25
27
 
26
28
  def action_description
29
+ show_action = CmAdmin::Models::Action.find_by(@model, name: 'show')
27
30
  if @model.current_action.page_description
28
31
  title = @model.current_action.page_description
32
+ elsif show_action.page_description
33
+ title = show_action.page_description
29
34
  else
30
35
  title = "#{@model.name}"
31
36
  case action_name
data/package.json CHANGED
@@ -11,6 +11,7 @@
11
11
  "bootstrap": "^5.0.1",
12
12
  "daterangepicker": "^3.1.0",
13
13
  "flatpickr": "^4.6.9",
14
+ "jgrowl": "^1.4.8",
14
15
  "jquery": "^3.6.0",
15
16
  "moment": "^2.29.1",
16
17
  "popper.js": "^1.16.1",
@@ -1 +1 @@
1
- cf780b7d855af05066bcc442a307ca3eecf28623
1
+ b50f217278de15248bddb0b6f2e6be58edbffa7c
data/yarn.lock CHANGED
@@ -3763,6 +3763,11 @@ jest-worker@^26.5.0:
3763
3763
  merge-stream "^2.0.0"
3764
3764
  supports-color "^7.0.0"
3765
3765
 
3766
+ jgrowl@^1.4.8:
3767
+ version "1.4.8"
3768
+ resolved "https://registry.yarnpkg.com/jgrowl/-/jgrowl-1.4.8.tgz#4ba40ffb93757a7e1d9b262d916be299d03df3a4"
3769
+ integrity sha512-JFi609DhWhD4wbnt1/NvYqt702SncgBk2SFssUi6GEUfnxM5TQ9YAKHP/kODwch7Q6QVhOWYvk1QCxLtujwRog==
3770
+
3766
3771
  jquery@>=1.10, jquery@^3.3.1, jquery@^3.6.0:
3767
3772
  version "3.6.0"
3768
3773
  resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.0.tgz#c72a09f15c1bdce142f49dbf1170bdf8adac2470"
@@ -5384,9 +5389,9 @@ postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1:
5384
5389
  uniq "^1.0.1"
5385
5390
 
5386
5391
  postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6:
5387
- version "7.0.35"
5388
- resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24"
5389
- integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==
5392
+ version "7.0.36"
5393
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.36.tgz#056f8cffa939662a8f5905950c07d5285644dfcb"
5394
+ integrity sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==
5390
5395
  dependencies:
5391
5396
  chalk "^2.4.2"
5392
5397
  source-map "^0.6.1"
@@ -6322,9 +6327,9 @@ tapable@^1.0.0, tapable@^1.1.3:
6322
6327
  integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
6323
6328
 
6324
6329
  tar@^6.0.2:
6325
- version "6.1.0"
6326
- resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.0.tgz#d1724e9bcc04b977b18d5c573b333a2207229a83"
6327
- integrity sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==
6330
+ version "6.1.11"
6331
+ resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621"
6332
+ integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==
6328
6333
  dependencies:
6329
6334
  chownr "^2.0.0"
6330
6335
  fs-minipass "^2.0.0"
@@ -6584,9 +6589,9 @@ urix@^0.1.0:
6584
6589
  integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
6585
6590
 
6586
6591
  url-parse@^1.4.3, url-parse@^1.5.1:
6587
- version "1.5.1"
6588
- resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.1.tgz#d5fa9890af8a5e1f274a2c98376510f6425f6e3b"
6589
- integrity sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==
6592
+ version "1.5.3"
6593
+ resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.3.tgz#71c1303d38fb6639ade183c2992c8cc0686df862"
6594
+ integrity sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==
6590
6595
  dependencies:
6591
6596
  querystringify "^2.1.1"
6592
6597
  requires-port "^1.0.0"
@@ -6872,9 +6877,9 @@ wrappy@1:
6872
6877
  integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
6873
6878
 
6874
6879
  ws@^6.2.1:
6875
- version "6.2.1"
6876
- resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb"
6877
- integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==
6880
+ version "6.2.2"
6881
+ resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e"
6882
+ integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==
6878
6883
  dependencies:
6879
6884
  async-limiter "~1.0.0"
6880
6885
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cm-admin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - sajinmp
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2021-09-29 00:00:00.000000000 Z
13
+ date: 2022-01-20 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: pagy
@@ -18,14 +18,14 @@ dependencies:
18
18
  requirements:
19
19
  - - "~>"
20
20
  - !ruby/object:Gem::Version
21
- version: '3.13'
21
+ version: 4.11.0
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
26
  - - "~>"
27
27
  - !ruby/object:Gem::Version
28
- version: '3.13'
28
+ version: 4.11.0
29
29
  - !ruby/object:Gem::Dependency
30
30
  name: slim
31
31
  requirement: !ruby/object:Gem::Requirement
@@ -125,6 +125,7 @@ files:
125
125
  - app/assets/stylesheets/cm_admin/helpers/_mixins.scss
126
126
  - app/assets/stylesheets/cm_admin/helpers/_variable.scss
127
127
  - app/assets/stylesheets/cm_admin/helpers/index.scss
128
+ - app/assets/stylesheets/cm_admin/scaffold.scss
128
129
  - app/controllers/cm_admin/application_controller.rb
129
130
  - app/controllers/cm_admin/exports_controller.rb
130
131
  - app/controllers/cm_admin/static_controller.rb
@@ -151,6 +152,8 @@ files:
151
152
  - app/views/cm_admin/main/new.html.slim
152
153
  - app/views/cm_admin/main/show.html.slim
153
154
  - app/views/cm_admin/static/error_401.html.slim
155
+ - app/views/layouts/_custom_action_modals.html.slim
156
+ - app/views/layouts/_flash_message.html.slim
154
157
  - app/views/layouts/_left_sidebar_nav.html.slim
155
158
  - app/views/layouts/_quick_links.html.slim
156
159
  - app/views/layouts/cm_admin.html.slim
@@ -179,6 +182,7 @@ files:
179
182
  - lib/cm_admin/models/cm_show_section.rb
180
183
  - lib/cm_admin/models/column.rb
181
184
  - lib/cm_admin/models/controller_method.rb
185
+ - lib/cm_admin/models/custom_action.rb
182
186
  - lib/cm_admin/models/dsl_method.rb
183
187
  - lib/cm_admin/models/export.rb
184
188
  - lib/cm_admin/models/field.rb