cm-admin 0.6.2 → 0.6.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cb9d2bfcdbec704c6259f45f51e317e32ad05d5ca4990a52fca17af831f62566
4
- data.tar.gz: 6a357cfe4458e4da3409c8e95e51cda3e36d6d8ebbd00c4518a6928f1815926e
3
+ metadata.gz: 07c642182c72b7087759f3fbd91c0659a35a18215750100364bbdd9ebafa30c5
4
+ data.tar.gz: 7ee59e35a1aa9b219a7648cd9d6c90d716a0aadec1119e4fe8bee2cc367997aa
5
5
  SHA512:
6
- metadata.gz: 242b5d01155399a9c9038b1a0811db95c82824ace0c9e4b592c98d9dae5a51b23cf28a80cb89db771f0d647685b5b5b9c83e0ac6774269eb0c88d4c90c792c83
7
- data.tar.gz: 17cd6516e61f6e3ff3aa6fc7515807c3a5fb423d0fa016992aba51bbe2b2f40b885aa6e200c8aefa71b713dd2477fcb3bbb7f63e0ba7de96ca6e2351ae058356
6
+ metadata.gz: 54be244142003c74f63b7e8ef269749628cd96722d86f604e7687d171f25a98f1e07646e14a6369e10e7023fe12aaf8ffc56f9bd2115408fb891dccfe404357f
7
+ data.tar.gz: e937f8ed679eae29efabb5fdaf76f85a6ffe949476c36d6edf8cdd101e0ef603f7c2e22e253df56d5ddfdd5fc1f6e120c8748988886355a82ba27380cb9b982f
data/Gemfile.lock CHANGED
@@ -54,7 +54,7 @@ GEM
54
54
  method_source (1.0.0)
55
55
  mini_portile2 (2.8.0)
56
56
  minitest (5.15.0)
57
- nokogiri (1.13.3)
57
+ nokogiri (1.13.4)
58
58
  mini_portile2 (~> 2.8.0)
59
59
  racc (~> 1.4)
60
60
  pagy (4.11.0)
@@ -18,7 +18,6 @@
18
18
 
19
19
  &__table-container {
20
20
  padding: 20px;
21
- height: 100%;
22
21
  }
23
22
 
24
23
  .admin-table {
@@ -77,13 +76,14 @@
77
76
  overflow: auto;
78
77
  margin-top: 40px;
79
78
  margin-bottom: 50px;
80
- height: 280px;
79
+ height: calc(100vh - 365px);
81
80
  .cm-table {
82
81
  table-layout: fixed;
83
82
  position: relative;
84
83
  min-width: fit-content;
85
84
  border-collapse: collapse;
86
85
  border: 1px solid $grey-lighter-clr;
86
+ border-top-width: 0;
87
87
  border-radius: $radius-8;
88
88
  &__header {
89
89
  .header-row {
@@ -91,6 +91,7 @@
91
91
  width: 100%;
92
92
  position: relative;
93
93
  box-shadow: inset 0px -1px 0px rgba(148, 151, 155, 0.15);
94
+ border-top: 1px solid $grey-lighter-clr;
94
95
  th {
95
96
  @include font($size: $t6-text, $color: $ink-lighter-clr, $weight: bold);
96
97
  text-transform: uppercase;
@@ -129,7 +130,7 @@
129
130
  // height: 335px;
130
131
  display: block;
131
132
  position: relative;
132
- width: 100%;
133
+ width: 100%;
133
134
  .body-row {
134
135
  border-bottom: 1.21px solid rgb(240, 239, 239);
135
136
  td:nth-child(2){
@@ -138,7 +139,7 @@
138
139
  z-index: 2;
139
140
  background-color: #fff;
140
141
  }
141
-
142
+
142
143
  &:nth-last-child(1) {
143
144
  box-shadow: none;
144
145
  }
@@ -190,7 +191,6 @@
190
191
  justify-content: center;
191
192
  height: 100%;
192
193
  .popup-card {
193
- width:fit-content;
194
194
  .popup-option {
195
195
  a {
196
196
  font-weight: 500;
@@ -210,8 +210,8 @@
210
210
  }
211
211
  }
212
212
  .cm-table > thead {
213
- position:sticky;
214
- top:0;
213
+ position: sticky;
214
+ top: 0;
215
215
  background-color: #fff;
216
216
  z-index: 3;
217
217
  }
@@ -4,26 +4,12 @@
4
4
  font-size: $t4-text;
5
5
  line-height: 22px;
6
6
  padding: 4px;
7
- &.default-0 {
8
- color: $primary-text-clr;
9
- background: $grey-lighter-clr;
10
- }
11
- &.default-1 {
7
+ color: $primary-text-clr;
8
+ background: $grey-lighter-clr;
9
+ &.success {
12
10
  color: $green-regular-clr;
13
11
  background: $green-lightest-clr;
14
12
  }
15
- &.default-2 {
16
- color: $yellow-regular-clr;
17
- background: $yellow-lightest-clr;
18
- }
19
- &.default-3 {
20
- color: $red-regular-clr;
21
- background: $red-lightest-clr;
22
- }
23
- &.default-4 {
24
- color: $blue-regular-clr;
25
- background: $blue-lightest-clr;
26
- }
27
13
  }
28
14
 
29
15
  .filter-chip {
@@ -12,38 +12,43 @@
12
12
  table.cm-table
13
13
  thead.cm-table__header
14
14
  tr.header-row
15
- th.check-box-space
16
- span
17
- input.cm-checkbox type="checkbox"
15
+ // To be added once bulk-select is finalized
16
+ / th.check-box-space
17
+ / span
18
+ / input.cm-checkbox type="checkbox"
18
19
  - @model.available_fields[@action.name.to_sym].each do |column|
19
20
  th = column.header
20
21
  tbody.cm-table__body
21
22
  - @associated_ar_object.data.each do |ar_object|
22
23
  tr.body-row
23
- td.check-box-space
24
- span
25
- input.cm-checkbox type="checkbox"
24
+ // To be added once bulk-select is finalized
25
+ / td.check-box-space
26
+ / span
27
+ / input.cm-checkbox type="checkbox"
26
28
  - @model.available_fields[@action.name.to_sym].each do |column|
27
29
  td
28
30
  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
- - @associated_model && @associated_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
- - if custom_action.display_type == :button
44
- = link_to custom_action.name.titleize, custom_action.path.gsub(':id', ar_object.id.to_s), method: custom_action.verb
45
- - elsif custom_action.display_type == :modal
46
- = link_to custom_action.name.titleize, '', data: { bs_toggle: "modal", bs_target: "##{custom_action.name.classify}Modal-#{ar_object.id.to_s}" }
31
+ - associated_model_actions = @associated_model && @associated_model.available_actions.select{|act| act if act.route_type == 'member'}
32
+ - if associated_model_actions.present?
33
+ td.row-action-cell
34
+ .row-action-tool
35
+ button.secondary-btn.tool-btn type="button"
36
+ span
37
+ i.fa.fa-bars.bolder
38
+ span
39
+ i.fa.fa-angle-down
40
+ .popup-card.table-export-popup.hidden
41
+ // To be added once the associated model has edit actions
42
+ / .popup-option
43
+ / a href="#{page_url('edit', ar_object)}"
44
+ / | Edit
45
+ - associated_model_actions.each do |custom_action|
46
+ - if custom_action.display_if.call(ar_object)
47
+ .popup-option
48
+ - if custom_action.display_type == :button
49
+ = link_to custom_action.name.titleize, custom_action.path.gsub(':id', ar_object.id.to_s), method: custom_action.verb
50
+ - elsif custom_action.display_type == :modal
51
+ = link_to custom_action.name.titleize, '', data: { bs_toggle: "modal", bs_target: "##{custom_action.name.classify}Modal-#{ar_object.id.to_s}" }
47
52
 
48
53
  .cm-pagination
49
54
  .cm-pagination__lhs Showing #{@associated_ar_object.pagy.from} to #{@associated_ar_object.pagy.to} out of #{@associated_ar_object.pagy.count}
@@ -11,17 +11,18 @@
11
11
  table.cm-table
12
12
  thead.cm-table__header
13
13
  tr.header-row
14
- th.check-box-space
15
- span
16
- input.cm-checkbox type="checkbox"
14
+ // Select all checkbox feature to be added later
15
+ / th.check-box-space
16
+ / span
17
+ / input.cm-checkbox type="checkbox"
17
18
  - @model.available_fields[:index].each do |column|
18
19
  th = column.header
19
20
  tbody.cm-table__body
20
21
  - @ar_object.data.each do |ar_object|
21
22
  tr.body-row
22
- td.check-box-space
23
- span
24
- input.cm-checkbox type="checkbox"
23
+ / td.check-box-space
24
+ / span
25
+ / input.cm-checkbox type="checkbox"
25
26
  - @model.available_fields[:index].each_with_index do |column, index|
26
27
  td.text-ellipsis
27
28
  span class="#{column.field_type.to_s} #{column.cm_css_class} "
@@ -45,12 +46,18 @@
45
46
  .popup-card.table-export-popup.hidden
46
47
  - if edit_action.any? && policy([:cm_admin, @model.name.classify.constantize]).edit?
47
48
  = link_to "#{page_url('edit', ar_object)}" do
48
- .popup-option Edit
49
+ .popup-option
50
+ span
51
+ i.fa.fa-edit
52
+ | Edit
49
53
  - custom_actions.each do |custom_action|
50
54
  - if custom_action.name.present? && has_valid_policy(@model.name, custom_action.name)
51
55
  - if custom_action.display_if.call(ar_object)
52
- = link_to custom_action.path.gsub(':id', ar_object.id.to_s), method: custom_action.verb do
53
- .popup-option = custom_action.name.titleize
56
+ = link_to cm_admin.send("#{@model.name.downcase}_index_path") + '/' + custom_action.path.gsub(':id', ar_object.id.to_s), method: custom_action.verb do
57
+ .popup-option
58
+ span
59
+ i class="#{custom_action.icon_name}"
60
+ = custom_action.name.titleize
54
61
 
55
62
  .cm-pagination
56
63
  .cm-pagination__lhs Showing #{@ar_object.pagy.from} to #{@ar_object.pagy.to} out of #{@ar_object.pagy.count}
@@ -1,6 +1,6 @@
1
1
  ul.nav.nav-pills
2
2
  - @model.available_tabs.each do |nav_item|
3
- - if nav_item.custom_action.present? && policy([:cm_admin, @model.name.classify.constantize]).send(:"#{nav_item.custom_action}?")
3
+ - if nav_item.custom_action.empty? || (nav_item.custom_action.present? && policy([:cm_admin, @model.name.classify.constantize]).send(:"#{nav_item.custom_action}?"))
4
4
  li.nav-item
5
5
  - nav_item_action_name = nav_item.custom_action.present? ? nav_item.custom_action : 'show'
6
6
  = 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' : ''}"
@@ -1,7 +1,9 @@
1
1
  .cm-navbar
2
2
  .cm-navbar__lhs
3
- .bread-crumb-area
4
- = yield :bread_crumb
3
+ - if cm_admin.method_defined?(:"#{@model.name.downcase}_index_path") && (@model.current_action.name == 'show' || @model.current_action.layout_type.present?)
4
+ .bread-crumb-area
5
+ .breadcrumb-text
6
+ = link_to @model.name + ' /', cm_admin.send(:"#{@model.name.downcase}_index_path")
5
7
  .nav-title-area
6
8
  p.title-text = action_title
7
9
  p.title-sub-text = action_description
@@ -24,18 +26,10 @@
24
26
  - if new_action.any? && policy([:cm_admin, @model.name.classify.constantize]).new?
25
27
  = link_to 'Add', "#{page_url('new')}", class: 'primary-btn ml-2'
26
28
  - @model.available_actions.select{|act| act if act.route_type == 'collection'}.each do |custom_action|
27
- - if custom_action.name.present? && has_valid_policy(@model.name, custom_action.name)
28
- - if custom_action.display_type == :button
29
- = link_to custom_action.name.titleize, @model.ar_model.table_name + '/' + custom_action.path, class: 'primary-btn ml-2', method: custom_action.verb
30
- - elsif custom_action.display_type == :modal
31
- = link_to custom_action.name.titleize, '', class: 'primary-btn ml-2', data: { bs_toggle: "modal", bs_target: "##{custom_action.name.classify}Modal" }
29
+ = custom_action_items(custom_action, 'index')
32
30
  - elsif @model.current_action.name == 'show'
33
31
  - @model.available_actions.select{|act| act if act.route_type == 'member'}.each do |custom_action|
34
- - if custom_action.name.present? && has_valid_policy(@model.name, custom_action.name)
35
- - if custom_action.display_type == :button && custom_action.display_if.call(@ar_object)
36
- = link_to custom_action.name.titleize, custom_action.path.gsub(':id', params[:id]), class: 'primary-btn ml-2', method: custom_action.verb
37
- - elsif custom_action.display_type == :modal && custom_action.display_if.call(@ar_object)
38
- = link_to custom_action.name.titleize, '', class: 'primary-btn ml-2', data: { bs_toggle: "modal", bs_target: "##{custom_action.name.classify}Modal" }
32
+ = custom_action_items(custom_action, 'show')
39
33
 
40
34
  - edit_action = @model.available_actions.select{|act| act if act.action_type.eql?(:default) && act.name.eql?('edit')}
41
35
  - if edit_action.any? && policy([:cm_admin, @model.name.classify.constantize]).edit?
@@ -6,4 +6,4 @@
6
6
  $.jGrowl("#{flash[:success]}", {theme: 'success'})
7
7
  - elsif flash[:alert].present?
8
8
  javascript:
9
- $.jGrowl("#{flash[:alert]}", {theme: 'error'})
9
+ $.jGrowl("#{flash[:alert].html_safe}", {theme: 'error'})
@@ -15,9 +15,6 @@ html
15
15
  script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"
16
16
  script src="https://raw.githack.com/SortableJS/Sortable/master/Sortable.js"
17
17
  body
18
- - flash.each do |type, msg|
19
- .alert class="alert-#{type}"
20
- = msg
21
18
  .cm-admin
22
19
  = render 'layouts/left_sidebar_nav'
23
20
  .panel-area
@@ -41,6 +38,6 @@ html
41
38
  = yield
42
39
  - else
43
40
  = yield
44
- = render 'layouts/flash_message'
41
+ = render 'layouts/cm_flash_message'
45
42
  = render 'layouts/custom_action_modals'
46
43
 
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.config.cm_admin_models.each do |model|
13
- model.available_actions.sort_by {|act| act.class}.each do |act|
13
+ model.available_actions.sort_by {|act| act.name}.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}", as: "#{model.name.underscore}_#{act.name}")
16
16
  end
@@ -139,10 +139,15 @@ module CmAdmin
139
139
  format.html { render '/cm_admin/main/'+action_name }
140
140
  end
141
141
  elsif %w(create update destroy).include?(action_name)
142
+ if %w(create update).include?(action_name)
143
+ redirect_url = CmAdmin::Engine.mount_path + "/#{@model.name.underscore.pluralize}/#{@ar_object.id}"
144
+ else
145
+ redirect_url = CmAdmin::Engine.mount_path + "/#{@model.name.underscore.pluralize}"
146
+ end
142
147
  if @ar_object.save
143
- format.html { redirect_to CmAdmin::Engine.mount_path + "/#{@model.name.underscore.pluralize}" }
148
+ format.html { redirect_to redirect_url, notice: "#{action_name.titleize} #{@ar_object.class.name.downcase} is successful" }
144
149
  else
145
- format.html { render '/cm_admin/main/new' }
150
+ format.html { render '/cm_admin/main/new', notice: "#{action_name.titleize} #{@ar_object.class.name.downcase} is unsuccessful" }
146
151
  end
147
152
  elsif action.action_type == :custom
148
153
  if action.child_records
@@ -151,11 +156,13 @@ module CmAdmin
151
156
  data = @action.parent == "index" ? @ar_object.data : @ar_object
152
157
  format.html { render action.partial }
153
158
  else
154
- if @action.code_block.call(@ar_object)
159
+ ar_object = @action.code_block.call(@ar_object)
160
+ if ar_object.errors.empty?
155
161
  redirect_url = @model.current_action.redirection_url || @action.redirection_url || request.referrer || "/cm_admin/#{@model.ar_model.table_name}/#{@ar_object.id}"
156
- format.html { redirect_to redirect_url }
162
+ format.html { redirect_to redirect_url, notice: "#{@action.name.titleize} is successful" }
157
163
  else
158
- format.html { redirect_to request.referrer }
164
+ error_messages = @ar_object.errors.full_messages.map{|error_message| "<li>#{error_message}</li>"}.join
165
+ format.html { redirect_to request.referrer, alert: "<b>#{@action.name.titleize} is unsuccessful</b><br /><ul>#{error_messages}</ul>" }
159
166
  end
160
167
  end
161
168
  elsif action.layout.present?
@@ -6,7 +6,7 @@ module CmAdmin
6
6
  include Actions::Blocks
7
7
  attr_accessor :name, :verb, :layout_type, :layout, :partial, :path, :page_title, :page_description,
8
8
  :child_records, :is_nested_field, :nested_table_name, :parent, :display_if, :route_type, :code_block,
9
- :display_type, :action_type, :redirection_url, :sort_direction, :sort_column
9
+ :display_type, :action_type, :redirection_url, :sort_direction, :sort_column, :icon_name
10
10
 
11
11
  VALID_SORT_DIRECTION = Set[:asc, :desc].freeze
12
12
 
@@ -34,6 +34,7 @@ module CmAdmin
34
34
  self.action_type = :default
35
35
  self.sort_column = :created_at
36
36
  self.sort_direction = :desc
37
+ self.icon_name = 'fa fa-th-large'
37
38
  end
38
39
 
39
40
  def set_values(page_title, page_description, partial)
@@ -2,7 +2,7 @@ module CmAdmin
2
2
  module Models
3
3
  class Column
4
4
  attr_accessor :field_name, :field_type, :header, :format, :prefix, :suffix, :exportable, :round,
5
- :cm_css_class, :link, :url, :custom_method, :helper_method, :managable, :lockable, :drawer_partial
5
+ :cm_css_class, :link, :url, :custom_method, :helper_method, :managable, :lockable, :drawer_partial, :tag_class
6
6
 
7
7
  def initialize(field_name, attributes = {})
8
8
  @field_name = field_name
@@ -24,6 +24,7 @@ module CmAdmin
24
24
  self.exportable = true
25
25
  self.managable = true
26
26
  self.lockable = false
27
+ self.tag_class = {}
27
28
  end
28
29
 
29
30
  #formatting value for different data types
@@ -115,11 +115,11 @@ module CmAdmin
115
115
  # end
116
116
  # end
117
117
  # end
118
- 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)
118
+ 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, icon_name: 'fa fa-th-large', &block)
119
119
  action = CmAdmin::Models::CustomAction.new(
120
120
  name: name, verb: verb, layout: layout, layout_type: layout_type, partial: partial, path: path,
121
121
  parent: self.current_action.name, display_type: display_type, display_if: display_if,
122
- action_type: :custom, route_type: route_type, &block)
122
+ action_type: :custom, route_type: route_type, icon_name: icon_name, &block)
123
123
  @available_actions << action
124
124
  # self.class.class_eval(&block)
125
125
  end
@@ -3,14 +3,19 @@ module CmAdmin
3
3
  class Field
4
4
 
5
5
  attr_accessor :field_name, :label, :header, :field_type, :format, :precision,
6
- :helper_method, :preview, :custom_link, :precision, :prefix, :suffix
6
+ :helper_method, :preview, :custom_link, :precision, :prefix, :suffix, :tag_class
7
7
 
8
8
  def initialize(field_name, attributes = {})
9
9
  @field_name = field_name
10
+ set_default_values
10
11
  attributes.each do |key, value|
11
12
  self.send("#{key.to_s}=", value)
12
13
  end
13
14
  end
15
+
16
+ def set_default_values
17
+ self.tag_class = {}
18
+ end
14
19
  end
15
20
  end
16
21
  end
@@ -1,3 +1,3 @@
1
1
  module CmAdmin
2
- VERSION = "0.6.2"
2
+ VERSION = "0.6.5"
3
3
  end
@@ -51,7 +51,8 @@ module CmAdmin
51
51
  when :enum
52
52
  ar_object.send(field.field_name).to_s.titleize
53
53
  when :tag
54
- content_tag :span, class: "status-tag default-#{ar_object.send(field.field_name.to_s + '_before_type_cast')}" do
54
+ tag_class = field.tag_class.dig("#{ar_object.send(field.field_name.to_s)}".to_sym).to_s
55
+ content_tag :span, class: "status-tag #{tag_class}" do
55
56
  ar_object.send(field.field_name).to_s.upcase
56
57
  end
57
58
  when :attachment
@@ -5,21 +5,21 @@ module CmAdmin
5
5
  value = field.custom_value || f.object.send(field.field_name)
6
6
  case field.input_type
7
7
  when :integer
8
- return f.text_field field.field_name, class: 'normal-input', disabled: field.disabled, value: value, data: {behaviour: 'integer-only'}
8
+ return f.text_field field.field_name, class: 'normal-input', disabled: field.disabled, value: value, placeholder: "Enter #{field.field_name.to_s.humanize.downcase}", data: { behaviour: 'integer-only' }
9
9
  when :decimal
10
- return f.number_field field.field_name, class: 'normal-input', disabled: field.disabled, value: value, data: {behaviour: 'decimal-only'}
10
+ return f.number_field field.field_name, class: 'normal-input', disabled: field.disabled, value: value, placeholder: "Enter #{field.field_name.to_s.downcase.gsub('_', ' ')}", data: { behaviour: 'decimal-only' }
11
11
  when :string
12
- return f.text_field field.field_name, class: 'normal-input', disabled: field.disabled, value: value
12
+ return f.text_field field.field_name, class: 'normal-input', disabled: field.disabled, value: value, placeholder: "Enter #{field.field_name.to_s.downcase.gsub('_', ' ')}"
13
13
  when :single_select
14
- return f.select field.field_name, options_for_select(field.collection || []), {}, class: 'normal-input select-2', disabled: field.disabled
14
+ return f.select field.field_name, options_for_select((field.collection || []), value), {include_blank: "Select #{field.field_name.to_s.downcase.gsub('_', ' ')}"}, class: 'normal-input select-2', disabled: field.disabled
15
15
  when :multi_select
16
- return f.select field.field_name, options_for_select(field.collection || []), {}, class: 'normal-input select-2', disabled: field.disabled, multiple: true
16
+ return f.select field.field_name, options_for_select((field.collection || []), value), {include_blank: "Select #{field.field_name.to_s.downcase.gsub('_', ' ')}"}, class: 'normal-input select-2', disabled: field.disabled, multiple: true
17
17
  when :date
18
- return f.text_field field.field_name, class: 'normal-input', disabled: field.disabled, value: value, data: {behaviour: 'date-only'}
18
+ return f.text_field field.field_name, class: 'normal-input', disabled: field.disabled, value: value, placeholder: "Enter #{field.field_name.to_s.downcase.gsub('_', ' ')}", data: { behaviour: 'date-only' }
19
19
  when :date_time
20
- return f.text_field field.field_name, class: 'normal-input', disabled: field.disabled, value: value, data: {behaviour: 'date-time'}
20
+ return f.text_field field.field_name, class: 'normal-input', disabled: field.disabled, value: value, placeholder: "Enter #{field.field_name.to_s.downcase.gsub('_', ' ')}", data: { behaviour: 'date-time' }
21
21
  when :text
22
- return f.text_area field.field_name, class: 'normal-input'
22
+ return f.text_area field.field_name, class: 'normal-input', placeholder: "Enter #{field.field_name.to_s.downcase.gsub('_', ' ')}"
23
23
  when :single_file_upload
24
24
  return f.file_field field.field_name, class: 'normal-input'
25
25
  when :multi_file_upload
@@ -53,6 +53,31 @@ module CmAdmin
53
53
  base_path + "/#{ar_object.id}" + '/edit'
54
54
  end
55
55
  end
56
+
57
+ def custom_action_items(custom_action, current_action_name)
58
+ if custom_action.name.present? && policy([:cm_admin, @model.name.classify.constantize]).send(:"#{custom_action.name}?")
59
+ if custom_action.display_if.call(@ar_object)
60
+ case custom_action.display_type
61
+ when :button
62
+ custom_action_button(custom_action, current_action_name)
63
+ when :modal
64
+ custom_modal_button(custom_action)
65
+ end
66
+ end
67
+ end
68
+ end
69
+
70
+ def custom_action_button(custom_action, current_action_name)
71
+ if current_action_name == "index"
72
+ link_to custom_action.name.titleize, @model.ar_model.table_name + '/' + custom_action.path, class: 'secondary-btn ml-2', method: custom_action.verb
73
+ elsif current_action_name == "show"
74
+ link_to custom_action.name.titleize, custom_action.path.gsub(':id', params[:id]), class: 'secondary-btn ml-2', method: custom_action.verb
75
+ end
76
+ end
77
+
78
+ def custom_modal_button(custom_action)
79
+ link_to custom_action.name.titleize, '', class: 'secondary-btn ml-2', data: { bs_toggle: "modal", bs_target: "##{custom_action.name.classify}Modal" }
80
+ end
56
81
  end
57
82
  end
58
83
  end
@@ -7,8 +7,8 @@ module CmAdmin
7
7
 
8
8
  def copy_initializer
9
9
  copy_file 'cm_admin_initializer.rb', 'config/initializers/cm_admin.rb'
10
- copy_file 'custom.js', 'app/assets/javascripts/custom.js'
11
- copy_file 'custom.css', 'app/assets/stylesheets/custom.css'
10
+ copy_file 'custom.js', 'app/assets/javascripts/cm_admin/custom.js'
11
+ copy_file 'custom.css', 'app/assets/stylesheets/cm_admin/custom.css'
12
12
  copy_file 'application_policy.rb', 'app/policies/application_policy.rb'
13
13
  route 'mount CmAdmin::Engine => "/admin"'
14
14
  end
data/package.json CHANGED
@@ -13,7 +13,7 @@
13
13
  "flatpickr": "^4.6.9",
14
14
  "jgrowl": "^1.4.8",
15
15
  "jquery": "^3.6.0",
16
- "moment": "^2.29.1",
16
+ "moment": "^2.29.2",
17
17
  "popper.js": "^1.16.1",
18
18
  "turbolinks": "^5.2.0"
19
19
  },
@@ -1 +1 @@
1
- 07d558738c316293586496817b2bccbf6430b5bd
1
+ d5850cd60f91abe79ff8a84a45a9e24c75cb0e4b
data/yarn.lock CHANGED
@@ -4123,9 +4123,9 @@ minimatch@^3.0.4:
4123
4123
  brace-expansion "^1.1.7"
4124
4124
 
4125
4125
  minimist@^1.2.0, minimist@^1.2.5:
4126
- version "1.2.5"
4127
- resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
4128
- integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
4126
+ version "1.2.6"
4127
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
4128
+ integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
4129
4129
 
4130
4130
  minipass-collect@^1.0.2:
4131
4131
  version "1.0.2"
@@ -4199,10 +4199,10 @@ mkdirp@^1.0.3, mkdirp@^1.0.4:
4199
4199
  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
4200
4200
  integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
4201
4201
 
4202
- moment@^2.29.1, moment@^2.9.0:
4203
- version "2.29.1"
4204
- resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3"
4205
- integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==
4202
+ moment@^2.29.2, moment@^2.9.0:
4203
+ version "2.29.2"
4204
+ resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.2.tgz#00910c60b20843bcba52d37d58c628b47b1f20e4"
4205
+ integrity sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg==
4206
4206
 
4207
4207
  move-concurrently@^1.0.1:
4208
4208
  version "1.0.1"
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.6.2
4
+ version: 0.6.5
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: 2022-04-01 00:00:00.000000000 Z
13
+ date: 2022-04-13 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: pagy
@@ -171,8 +171,8 @@ files:
171
171
  - app/views/cm_admin/static/dashboard.html.slim
172
172
  - app/views/cm_admin/static/error_401.html.slim
173
173
  - app/views/cm_admin/static/error_403.html.slim
174
+ - app/views/layouts/_cm_flash_message.html.slim
174
175
  - app/views/layouts/_custom_action_modals.html.slim
175
- - app/views/layouts/_flash_message.html.slim
176
176
  - app/views/layouts/_left_sidebar_nav.html.slim
177
177
  - app/views/layouts/_quick_links.html.slim
178
178
  - app/views/layouts/cm_admin.html.slim