cm-admin 1.1.5 → 1.1.7

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 (32) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop-https---raw-githubusercontent-com-commutatus-cm-linters-main-rubocop-yml +20 -0
  3. data/Gemfile.lock +60 -60
  4. data/app/assets/config/cm_admin_manifest.js +2 -1
  5. data/app/assets/fonts/fa-brands-400.ttf +0 -0
  6. data/app/assets/fonts/fa-brands-400.woff2 +0 -0
  7. data/app/assets/fonts/fa-regular-400.ttf +0 -0
  8. data/app/assets/fonts/fa-regular-400.woff2 +0 -0
  9. data/app/assets/fonts/fa-solid-900.ttf +0 -0
  10. data/app/assets/fonts/fa-solid-900.woff2 +0 -0
  11. data/app/assets/fonts/fa-v4compatibility.ttf +0 -0
  12. data/app/assets/fonts/fa-v4compatibility.woff2 +0 -0
  13. data/app/assets/javascripts/cm_admin/application.js +8 -3
  14. data/app/assets/javascripts/cm_admin/bulk_actions.js +36 -0
  15. data/app/assets/javascripts/cm_admin/custom.js +0 -0
  16. data/app/assets/stylesheets/cm_admin/cm_admin.css.scss +2 -2
  17. data/app/assets/stylesheets/cm_admin/dependency/fontawesome.all.css +7831 -0
  18. data/app/controllers/cm_admin/resource_controller.rb +16 -1
  19. data/app/helpers/cm_admin/application_helper.rb +4 -0
  20. data/app/javascript/packs/cm_admin/application.js +1 -0
  21. data/app/models/concerns/cm_admin/bulk_action_processor.rb +29 -0
  22. data/app/views/cm_admin/main/_associated_table.html.slim +19 -9
  23. data/app/views/cm_admin/main/_table.html.slim +27 -14
  24. data/app/views/cm_admin/main/index.html.slim +1 -1
  25. data/app/views/layouts/_custom_action_modals.html.slim +4 -1
  26. data/lib/cm_admin/model.rb +3 -1
  27. data/lib/cm_admin/models/action.rb +10 -4
  28. data/lib/cm_admin/models/bulk_action.rb +18 -0
  29. data/lib/cm_admin/models/dsl_method.rb +9 -0
  30. data/lib/cm_admin/version.rb +1 -1
  31. data/lib/cm_admin/view_helpers/page_info_helper.rb +10 -0
  32. metadata +16 -2
@@ -93,7 +93,22 @@ module CmAdmin
93
93
  end
94
94
  end
95
95
 
96
- def cm_history(params)
96
+ def cm_bulk_action(params)
97
+ @model = Model.find_by({ name: controller_name.classify })
98
+ @bulk_action_processor = CmAdmin::BulkActionProcessor.new(@action, @model, params).perform_bulk_action
99
+ respond_to do |format|
100
+ if @bulk_action_processor.invalid_records.empty?
101
+ format.html { redirect_to request.referrer, notice: "#{@action.name.humanize} is successful" }
102
+ else
103
+ error_messages = @bulk_action_processor.invalid_records.map { |invalid_record|
104
+ "<li>#{invalid_record.error_message}</li>"
105
+ }.join
106
+ format.html { redirect_to request.referrer, alert: "<b>#{@action.name.humanize} is unsuccessful</b><br /><ul>#{error_messages}</ul>" }
107
+ end
108
+ end
109
+ end
110
+
111
+ def cm_history(_params)
97
112
  @current_action = CmAdmin::Models::Action.find_by(@model, name: 'history')
98
113
  resource_identifier
99
114
  respond_to do |format|
@@ -68,5 +68,9 @@ module CmAdmin
68
68
  model.available_actions.map(&:name).include?('show') &&
69
69
  has_valid_policy(model.name, 'show')
70
70
  end
71
+
72
+ def actions_filter(model, action_type)
73
+ model.available_actions.select { |action| action.action_type == action_type && has_valid_policy(model.name, action.name) }
74
+ end
71
75
  end
72
76
  end
@@ -14,6 +14,7 @@ require('/app/assets/javascripts/cm_admin/form_validation.js')
14
14
  require('/app/assets/javascripts/cm_admin/quick_search.js')
15
15
  require('/app/assets/javascripts/cm_admin/filters.js')
16
16
  require('/app/assets/javascripts/cm_admin/exports.js')
17
+ require('/app/assets/javascripts/cm_admin/bulk_actions.js')
17
18
 
18
19
  import jQuery from 'jquery'
19
20
  import LocalTime from "local-time"
@@ -0,0 +1,29 @@
1
+ class CmAdmin::BulkActionProcessor
2
+ extend ActiveSupport::Concern
3
+ attr_accessor :invalid_records
4
+
5
+ def initialize(current_action, model, params)
6
+ @invalid_records = []
7
+ @current_action = current_action
8
+ @model = model
9
+ @params = params
10
+ end
11
+
12
+ def perform_bulk_action
13
+ @params[:selected_ids].split(',').each do |id|
14
+ ar_object = @model.ar_model.find(id)
15
+ column_name = @model.available_fields[:index].first.field_name
16
+ begin
17
+ @current_action.code_block.call(id)
18
+ rescue NoMethodError, NameError => e
19
+ @error_message = "#{e.message.slice(0..(e.message.index(' for')))} at #{ar_object.send(column_name)}"
20
+ rescue ActiveRecord::RecordInvalid => e
21
+ @error_message = "#{e.message} at #{ar_object.send(column_name)}"
22
+ rescue StandardError => e
23
+ @error_message = e.message
24
+ end
25
+ @invalid_records << OpenStruct.new({ row_identifier: ar_object.send(column_name), error_message: @error_message }) if @error_message
26
+ end
27
+ self
28
+ end
29
+ end
@@ -14,25 +14,35 @@
14
14
  / i.fa.fa-columns.bolder
15
15
  / span
16
16
  / i.fa.fa-angle-down
17
-
17
+ - if flash[:alert].present?
18
+ .alert.alert-danger role="alert"
19
+ = flash[:alert].html_safe
20
+ - elsif flash[:notice].present?
21
+ .alert.alert-success
22
+ = flash[:notice].html_safe
23
+ - bulk_actions = actions_filter(@associated_model, :bulk_action)
24
+ - if bulk_actions.present?
25
+ .table-top.hidden data-section="bulk-action"
26
+ - bulk_actions.each do |action|
27
+ = custom_action_items(action, 'index')
18
28
  .new-admin-table.scrollable
19
29
  table.cm-table
20
30
  thead.cm-table__header
21
31
  tr.header-row
22
- // To be added once bulk-select is finalized
23
- / th.check-box-space
24
- / span
25
- / input.cm-checkbox type="checkbox"
32
+ - if bulk_actions.present?
33
+ th.check-box-space
34
+ span
35
+ input.cm-checkbox type="checkbox" data-behaviour="bulk-action-select-all"
26
36
  - @model.available_fields[@action.name.to_sym].each do |column|
27
37
  - if column.display_if.call(Current.user) && column.viewable
28
38
  th = column.header
29
39
  tbody.cm-table__body
30
40
  - @associated_ar_object.data.each do |ar_object|
31
41
  tr.body-row
32
- // To be added once bulk-select is finalized
33
- / td.check-box-space
34
- / span
35
- / input.cm-checkbox type="checkbox"
42
+ - if bulk_actions.present?
43
+ td.check-box-space
44
+ span
45
+ input.cm-checkbox type="checkbox" data-behaviour="bulk-action-checkbox" data-ar-object-id="#{ar_object.id}"
36
46
  - @model.available_fields[@action.name.to_sym].each_with_index do |column, index|
37
47
  - if column.display_if.call(Current.user) && column.viewable
38
48
  td class="text-ellipsis"
@@ -1,28 +1,41 @@
1
1
  .table-top
2
2
  p.table-top__total-count = "#{humanized_ar_collection_count(@ar_object.pagy.count, @model.ar_model.table_name)}"
3
- // .table-top__column-action
4
- // button.secondary-btn.column-btn data-bs-target="#columnActionModal" data-bs-toggle="modal"
5
- // span
6
- // i.fa.fa-columns.bolder
7
- // span
8
- // i.fa.fa-angle-down
3
+ / .table-top__column-action
4
+ / button.secondary-btn.column-btn data-bs-target="#columnActionModal" data-bs-toggle="modal"
5
+ / span
6
+ / i.fa.fa-columns.bolder
7
+ / span
8
+ / i.fa.fa-angle-down
9
+ - if flash[:alert].present?
10
+ .alert.alert-danger role="alert"
11
+ = flash[:alert].html_safe
12
+ - elsif flash[:notice].present?
13
+ .alert.alert-success
14
+ = flash[:notice].html_safe
15
+
16
+ - bulk_actions = actions_filter(@model, :bulk_action)
17
+ - if bulk_actions.present?
18
+ .table-top.hidden data-section="bulk-action"
19
+ - bulk_actions.each do |action|
20
+ = custom_action_items(action, 'index')
9
21
  .new-admin-table
10
22
  table.cm-table
11
23
  thead.cm-table__header
12
24
  tr.header-row
13
- // Select all checkbox feature to be added later
14
- / th.check-box-space
15
- / span
16
- / input.cm-checkbox type="checkbox"
25
+ - if bulk_actions.present?
26
+ th.check-box-space
27
+ span
28
+ input.cm-checkbox type="checkbox" data-behaviour="bulk-action-select-all"
17
29
  - @model.available_fields[:index].each do |column|
18
30
  - if column.display_if.call(Current.user) && column.viewable
19
31
  th = column.header
20
32
  tbody.cm-table__body
21
33
  - @ar_object.data.each do |ar_object|
22
34
  tr.body-row
23
- / td.check-box-space
24
- / span
25
- / input.cm-checkbox type="checkbox"
35
+ - if bulk_actions.present?
36
+ td.check-box-space
37
+ span
38
+ input.cm-checkbox type="checkbox" data-behaviour="bulk-action-checkbox" data-ar-object-id="#{ar_object.id}"
26
39
  - @model.available_fields[:index].each_with_index do |column, index|
27
40
  - if column.display_if.call(Current.user) && column.viewable
28
41
  td.text-ellipsis
@@ -41,4 +54,4 @@
41
54
  .cm-pagination__rhs
42
55
  == render partial: 'cm_admin/main/cm_pagy_nav', locals: { pagy: @ar_object.pagy }
43
56
 
44
- = render partial: 'cm_admin/main/member_custom_action_modal', locals: { cm_model: @model, ar_collection: @ar_object }
57
+ / = render partial: 'cm_admin/main/member_custom_action_modal', locals: { cm_model: @model, ar_collection: @ar_object }
@@ -1,3 +1,4 @@
1
+
1
2
  .cm-index-page.cm-page-container
2
3
  .sticky-container.page-top-bar
3
4
  == render 'cm_admin/main/top_navbar'
@@ -9,7 +10,6 @@
9
10
  == render @action.partial
10
11
  - else
11
12
  == render 'cm_admin/main/table'
12
-
13
13
  = column_pop_up(@model)
14
14
  = manage_column_pop_up(@model)
15
15
 
@@ -1,4 +1,7 @@
1
- - @model.available_actions.select{|act| act if act.display_type == :modal}.each do |custom_action|
1
+ - custom_action_with_modals = @model.available_actions.select{ |act| act if act.display_type == :modal }
2
+ - if @associated_model
3
+ - custom_action_with_modals += @associated_model.available_actions.select{ |act| act if act.display_type == :modal }
4
+ - custom_action_with_modals.each do |custom_action|
2
5
  .modal.fade id="#{custom_action.name.classify}Modal" aria-hidden="true" aria-labelledby="#{custom_action.name.classify}ModalLabel" tabindex="1"
3
6
  .modal-dialog
4
7
  .modal-content
@@ -2,6 +2,7 @@ require_relative 'constants'
2
2
  require_relative 'models/action'
3
3
  require_relative 'models/importer'
4
4
  require_relative 'models/custom_action'
5
+ require_relative 'models/bulk_action'
5
6
  require_relative 'models/field'
6
7
  require_relative 'models/form_field'
7
8
  require_relative 'models/blocks'
@@ -24,7 +25,7 @@ module CmAdmin
24
25
  include Models::Blocks
25
26
  include Models::DslMethod
26
27
  attr_accessor :available_actions, :actions_set, :available_fields, :additional_permitted_fields,
27
- :current_action, :params, :filters, :available_tabs, :icon_name
28
+ :current_action, :params, :filters, :available_tabs, :icon_name, :bulk_actions
28
29
  attr_reader :name, :ar_model, :is_visible_on_sidebar, :importer
29
30
 
30
31
  def initialize(entity, &block)
@@ -33,6 +34,7 @@ module CmAdmin
33
34
  @is_visible_on_sidebar = true
34
35
  @icon_name = 'fa fa-th-large'
35
36
  @available_actions ||= []
37
+ @bulk_actions ||= []
36
38
  @additional_permitted_fields ||= []
37
39
  @current_action = nil
38
40
  @available_tabs ||= []
@@ -36,6 +36,10 @@ module CmAdmin
36
36
  self.sort_direction = :desc
37
37
  self.scopes ||= []
38
38
  self.icon_name = 'fa fa-th-large'
39
+ self.verb = :get
40
+ self.route_type = nil
41
+ self.display_type = nil
42
+
39
43
  end
40
44
 
41
45
  def set_values(page_title, page_description, partial)
@@ -45,12 +49,14 @@ module CmAdmin
45
49
  end
46
50
 
47
51
  def controller_action_name
48
- if self.action_type == :custom
52
+ if action_type == :custom
49
53
  'cm_custom_method'
50
- elsif self.parent
51
- 'cm_' + self.parent
54
+ elsif action_type == :bulk_action
55
+ 'cm_bulk_action'
56
+ elsif parent
57
+ "cm_#{parent}"
52
58
  else
53
- 'cm_' + name
59
+ "cm_#{name}"
54
60
  end
55
61
  end
56
62
 
@@ -0,0 +1,18 @@
1
+ require_relative 'actions/blocks'
2
+
3
+ module CmAdmin
4
+ module Models
5
+ class BulkAction < Action
6
+
7
+ def initialize(attributes = {}, &block)
8
+ super
9
+ override_default_values
10
+ end
11
+
12
+ def override_default_values
13
+ self.icon_name = 'fa fa-layer-group'
14
+ self.verb = :post
15
+ end
16
+ end
17
+ end
18
+ end
@@ -127,6 +127,15 @@ module CmAdmin
127
127
  # self.class.class_eval(&block)
128
128
  end
129
129
 
130
+ def bulk_action(name: nil, display_name: nil, display_if: lambda { |arg| return true }, redirection_url: nil, icon_name: nil, verb: nil, display_type: nil, route_type: nil, partial: nil, &block)
131
+ bulk_action = CmAdmin::Models::BulkAction.new(
132
+ name: name, display_name: display_name, display_if: display_if,
133
+ redirection_url: redirection_url, icon_name: icon_name, action_type: :bulk_action,
134
+ verb: verb, display_type: display_type, route_type: route_type, partial: partial, &block
135
+ )
136
+ @available_actions << bulk_action
137
+ end
138
+
130
139
  def filter(db_column_name, filter_type, options={})
131
140
  @filters << CmAdmin::Models::Filter.new(db_column_name: db_column_name, filter_type: filter_type, options: options)
132
141
  end
@@ -1,3 +1,3 @@
1
1
  module CmAdmin
2
- VERSION = '1.1.5'
2
+ VERSION = '1.1.7'
3
3
  end
@@ -60,6 +60,8 @@ module CmAdmin
60
60
  if custom_action.name.present? && policy([:cm_admin, @model.name.classify.constantize]).send(:"#{custom_action.name}?")
61
61
  if custom_action.display_if.call(@ar_object)
62
62
  case custom_action.display_type
63
+ when :icon_only
64
+ custom_action_icon(custom_action, current_action_name)
63
65
  when :button
64
66
  custom_action_button(custom_action, current_action_name)
65
67
  when :modal
@@ -71,6 +73,14 @@ module CmAdmin
71
73
  end
72
74
  end
73
75
 
76
+ def custom_action_icon(custom_action, current_action_name)
77
+ button_to cm_admin.send("#{@model.name.underscore}_#{custom_action.name}_path"), method: :post, params: {selected_ids: ''} do
78
+ content_tag(:span) do
79
+ content_tag(:i, '', class: custom_action.icon_name)
80
+ end
81
+ end
82
+ end
83
+
74
84
  def custom_action_button(custom_action, current_action_name)
75
85
  if current_action_name == "index"
76
86
  button_to custom_action_title(custom_action), @model.ar_model.table_name + '/' + custom_action.path, class: 'secondary-btn ml-2', method: custom_action.verb
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: 1.1.5
4
+ version: 1.1.7
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: 2023-07-26 00:00:00.000000000 Z
13
+ date: 2023-08-04 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rails
@@ -168,6 +168,7 @@ files:
168
168
  - ".gitignore"
169
169
  - ".reek.yml"
170
170
  - ".rspec"
171
+ - ".rubocop-https---raw-githubusercontent-com-commutatus-cm-linters-main-rubocop-yml"
171
172
  - ".rubocop.yml"
172
173
  - ".stylelintrc.json"
173
174
  - ".travis.yml"
@@ -178,10 +179,20 @@ files:
178
179
  - README.md
179
180
  - Rakefile
180
181
  - app/assets/config/cm_admin_manifest.js
182
+ - app/assets/fonts/fa-brands-400.ttf
183
+ - app/assets/fonts/fa-brands-400.woff2
184
+ - app/assets/fonts/fa-regular-400.ttf
185
+ - app/assets/fonts/fa-regular-400.woff2
186
+ - app/assets/fonts/fa-solid-900.ttf
187
+ - app/assets/fonts/fa-solid-900.woff2
188
+ - app/assets/fonts/fa-v4compatibility.ttf
189
+ - app/assets/fonts/fa-v4compatibility.woff2
181
190
  - app/assets/images/image_not_available.png
182
191
  - app/assets/images/logo.png
183
192
  - app/assets/javascripts/cm_admin/application.js
193
+ - app/assets/javascripts/cm_admin/bulk_actions.js
184
194
  - app/assets/javascripts/cm_admin/cocoon.js
195
+ - app/assets/javascripts/cm_admin/custom.js
185
196
  - app/assets/javascripts/cm_admin/exports.js
186
197
  - app/assets/javascripts/cm_admin/filters.js
187
198
  - app/assets/javascripts/cm_admin/form_validation.js
@@ -212,6 +223,7 @@ files:
212
223
  - app/assets/stylesheets/cm_admin/components/index.scss
213
224
  - app/assets/stylesheets/cm_admin/dependency/bootstrap.min.css
214
225
  - app/assets/stylesheets/cm_admin/dependency/flatpickr.min.css
226
+ - app/assets/stylesheets/cm_admin/dependency/fontawesome.all.css
215
227
  - app/assets/stylesheets/cm_admin/helpers/_mixins.scss
216
228
  - app/assets/stylesheets/cm_admin/helpers/_variable.scss
217
229
  - app/assets/stylesheets/cm_admin/helpers/index.scss
@@ -228,6 +240,7 @@ files:
228
240
  - app/javascript/packs/cm_admin/scaffolds.js
229
241
  - app/javascript/stylesheets/cm_admin/application.scss
230
242
  - app/jobs/file_import_processor_job.rb
243
+ - app/models/concerns/cm_admin/bulk_action_processor.rb
231
244
  - app/models/concerns/cm_admin/file_import.rb
232
245
  - app/models/file_import.rb
233
246
  - app/policies/cm_admin/file_import_policy.rb
@@ -285,6 +298,7 @@ files:
285
298
  - lib/cm_admin/models/action.rb
286
299
  - lib/cm_admin/models/actions/blocks.rb
287
300
  - lib/cm_admin/models/blocks.rb
301
+ - lib/cm_admin/models/bulk_action.rb
288
302
  - lib/cm_admin/models/column.rb
289
303
  - lib/cm_admin/models/custom_action.rb
290
304
  - lib/cm_admin/models/dsl_method.rb