cm-admin 0.4.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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