cm-admin 0.6.0 → 0.6.3

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: 79781db6dbcc1960715b78d50655f618144a805150a64072be3267cc1c79f110
4
- data.tar.gz: 3cfa1956fe446d22cc275b5b0bf2b883a42b5c86136ebb4c0361058b3f73b96e
3
+ metadata.gz: dcd2e766f902e8045d4eba1ae60067d6636477625f6a51a7ce896c0e446ad8bc
4
+ data.tar.gz: d1ef041f20245116d4dafc04629b75768245a77b0f042e038675516e60692206
5
5
  SHA512:
6
- metadata.gz: 209bd560223da704b275c9473ccf7b59f0ac074b39f3cfc6b01e37c56c1599209a551de4668c8614a7f98d6e9cbeef0043a51a3108b2d85a462289ae7e0f48c0
7
- data.tar.gz: 46f11879d4b8fcb8fe0033c79397e4922a4714c18ae496c96962d949e344dd512af4250d4f4641e697f89465d7ad2a00bc36485a4de8b0291c6a812eb5d8e7b3
6
+ metadata.gz: 1e152f94b559e7f12d9d0d6cb82688d293c6a799fe0ade4b503c0dc2e8edc0337864741b7a7ae50e8ddcd7e175cc1813125f0409b5f62880fac3c386cae30638
7
+ data.tar.gz: d7b610b2ff1f329a09d3a31564f7f0d35bd5799803bcbdd31f15faad311803e516b6b828037524161993d139fabed9b08ef508cb2214a7dae6f2b74cb834dd32
@@ -7,5 +7,11 @@ module CmAdmin
7
7
  def current_webpacker_instance
8
8
  CmAdmin.webpacker
9
9
  end
10
+
11
+ # Allow if policy is not defined.
12
+ def has_valid_policy(model_name, action_name)
13
+ return true unless policy([:cm_admin, model_name.classify.constantize]).methods.include?(:"#{action_name}?")
14
+ policy([:cm_admin, model_name.classify.constantize]).send(:"#{action_name}?")
15
+ end
10
16
  end
11
17
  end
@@ -47,9 +47,9 @@
47
47
  = link_to "#{page_url('edit', ar_object)}" do
48
48
  .popup-option Edit
49
49
  - custom_actions.each do |custom_action|
50
- - if custom_action.name.present? && policy([:cm_admin, @model.name.classify.constantize]).send(:"#{custom_action.name}?")
50
+ - if custom_action.name.present? && has_valid_policy(@model.name, custom_action.name)
51
51
  - 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
52
+ = 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
53
53
  .popup-option = custom_action.name.titleize
54
54
 
55
55
  .cm-pagination
@@ -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? && policy([:cm_admin, @model.name.classify.constantize]).send(:"#{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? && policy([:cm_admin, @model.name.classify.constantize]).send(:"#{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?
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
@@ -45,7 +45,6 @@ module CmAdmin
45
45
  actions unless @actions_set
46
46
  $available_actions = @available_actions.dup
47
47
  self.class.all_actions.push(@available_actions)
48
- define_policy
49
48
  define_controller
50
49
  end
51
50
 
@@ -101,23 +100,6 @@ module CmAdmin
101
100
 
102
101
  private
103
102
 
104
- def define_policy
105
- klass = Class.new(ApplicationPolicy) do
106
- def initialize(user, record)
107
- @user = user
108
- @record = record
109
- end
110
-
111
- $available_actions.each do |action|
112
- define_method :"#{action.name}?" do
113
- accessible_by = action.accessible_by.map { |role| "user.#{role}" }.join(' || ')
114
- eval(accessible_by)
115
- end
116
- end
117
- end
118
- CmAdmin.const_set "#{@name}Policy", klass
119
- end
120
-
121
103
  # Controller defined for each model
122
104
  # If model is User, controller will be UsersController
123
105
  def define_controller
@@ -135,7 +117,7 @@ module CmAdmin
135
117
  @model.current_action = @action
136
118
  @ar_object = @model.try(@action.parent || action_name, params)
137
119
  @ar_object, @associated_model, @associated_ar_object = @model.custom_controller_action(action_name, params.permit!) if !@ar_object.present? && params[:id].present?
138
- authorize controller_name.classify.constantize, policy_class: "CmAdmin::#{controller_name.classify}Policy".constantize
120
+ authorize controller_name.classify.constantize, policy_class: "CmAdmin::#{controller_name.classify}Policy".constantize if defined? "CmAdmin::#{controller_name.classify}Policy".constantize
139
121
  aar_model = request.url.split('/')[-2].classify.constantize if params[:aar_id]
140
122
  @associated_ar_object = aar_model.find(params[:aar_id]) if params[:aar_id]
141
123
  nested_tables = @model.available_fields[:new].except(:fields).keys
@@ -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, :accessible_by
9
+ :display_type, :action_type, :redirection_url, :sort_direction, :sort_column
10
10
 
11
11
  VALID_SORT_DIRECTION = Set[:asc, :desc].freeze
12
12
 
@@ -34,14 +34,12 @@ module CmAdmin
34
34
  self.action_type = :default
35
35
  self.sort_column = :created_at
36
36
  self.sort_direction = :desc
37
- self.accessible_by = CmAdmin.authorized_roles
38
37
  end
39
38
 
40
- def set_values(page_title, page_description, partial, accessible_by)
39
+ def set_values(page_title, page_description, partial)
41
40
  self.page_title = page_title
42
41
  self.page_description = page_description
43
42
  self.partial = partial
44
- self.accessible_by = (CmAdmin.authorized_roles.dup << accessible_by).flatten.compact.uniq if accessible_by
45
43
  end
46
44
 
47
45
  class << self
@@ -5,7 +5,8 @@ module CmAdmin
5
5
 
6
6
  def show(params)
7
7
  @current_action = CmAdmin::Models::Action.find_by(self, name: 'show')
8
- @ar_object = @ar_model.name.classify.constantize.find(params[:id])
8
+ scoped_model = "CmAdmin::#{self.name}Policy::Scope".constantize.new(Current.user, self.name.constantize).resolve
9
+ @ar_object = scoped_model.find(params[:id])
9
10
  end
10
11
 
11
12
  def index(params)
@@ -40,7 +41,8 @@ module CmAdmin
40
41
  sort_column = "created_at"
41
42
  sort_direction = %w[asc desc].include?(sort_params[:sort_direction]) ? sort_params[:sort_direction] : "asc"
42
43
  sort_params = {sort_column: sort_column, sort_direction: sort_direction}
43
- records = self.name.constantize.where(nil) if records.nil?
44
+
45
+ records = "CmAdmin::#{self.name}Policy::Scope".constantize.new(Current.user, self.name.constantize).resolve if records.nil?
44
46
  records = records.order("#{current_action.sort_column} #{current_action.sort_direction}")
45
47
 
46
48
  final_data = CmAdmin::Models::Filter.filtered_data(filter_params, records, @filters)
@@ -10,28 +10,28 @@ module CmAdmin
10
10
  # @current_action = CmAdmin::Models::CustomAction.find_by(self, name: name)
11
11
  end
12
12
 
13
- def cm_index(page_title: nil, page_description: nil, partial: nil, accessible_by: nil, &block)
13
+ def cm_index(page_title: nil, page_description: nil, partial: nil, &block)
14
14
  @current_action = CmAdmin::Models::Action.find_by(self, name: 'index')
15
- @current_action.set_values(page_title, page_description, partial, accessible_by)
15
+ @current_action.set_values(page_title, page_description, partial)
16
16
  yield
17
17
  # action.instance_eval(&block)
18
18
  end
19
19
 
20
- def cm_show(page_title: nil, page_description: nil, partial: nil, accessible_by: nil, &block)
20
+ def cm_show(page_title: nil, page_description: nil, partial: nil, &block)
21
21
  @current_action = CmAdmin::Models::Action.find_by(self, name: 'show')
22
- @current_action.set_values(page_title, page_description, partial, accessible_by)
22
+ @current_action.set_values(page_title, page_description, partial)
23
23
  yield
24
24
  end
25
25
 
26
- def cm_edit(page_title: nil,page_description: nil, partial: nil, accessible_by: nil, &block)
26
+ def cm_edit(page_title: nil,page_description: nil, partial: nil, &block)
27
27
  @current_action = CmAdmin::Models::Action.find_by(self, name: 'edit')
28
- @current_action.set_values(page_title, page_description, partial, accessible_by)
28
+ @current_action.set_values(page_title, page_description, partial)
29
29
  yield
30
30
  end
31
31
 
32
- def cm_new(page_title: nil,page_description: nil, partial: nil, accessible_by: nil, &block)
32
+ def cm_new(page_title: nil,page_description: nil, partial: nil, &block)
33
33
  @current_action = CmAdmin::Models::Action.find_by(self, name: 'new')
34
- @current_action.set_values(page_title, page_description, partial, accessible_by)
34
+ @current_action.set_values(page_title, page_description, partial)
35
35
  yield
36
36
  end
37
37
 
@@ -47,16 +47,14 @@ module CmAdmin
47
47
  end
48
48
  end
49
49
 
50
- def tab(tab_name, custom_action, associated_model: nil, layout_type: nil, layout: nil, partial: nil, accessible_by: nil, &block)
50
+ def tab(tab_name, custom_action, associated_model: nil, layout_type: nil, layout: nil, partial: nil, &block)
51
51
  if custom_action.to_s == ''
52
52
  @current_action = CmAdmin::Models::Action.find_by(self, name: 'show')
53
- @current_action.accessible_by = (CmAdmin.authorized_roles.dup << accessible_by).flatten.compact.uniq if accessible_by
54
53
  @available_tabs << CmAdmin::Models::Tab.new(tab_name, '', &block)
55
54
  else
56
55
  action = CmAdmin::Models::Action.new(name: custom_action.to_s, verb: :get, path: ':id/'+custom_action,
57
56
  layout_type: layout_type, layout: layout, partial: partial, child_records: associated_model,
58
57
  action_type: :custom, display_type: :page)
59
- action.accessible_by = (CmAdmin.authorized_roles.dup << accessible_by).flatten.compact.uniq if accessible_by
60
58
  @available_actions << action
61
59
  @current_action = action
62
60
  @available_tabs << CmAdmin::Models::Tab.new(tab_name, custom_action, &block)
@@ -117,12 +115,11 @@ module CmAdmin
117
115
  # end
118
116
  # end
119
117
  # end
120
- 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, accessible_by: 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, &block)
121
119
  action = CmAdmin::Models::CustomAction.new(
122
120
  name: name, verb: verb, layout: layout, layout_type: layout_type, partial: partial, path: path,
123
121
  parent: self.current_action.name, display_type: display_type, display_if: display_if,
124
122
  action_type: :custom, route_type: route_type, &block)
125
- action.accessible_by = (CmAdmin.authorized_roles.dup << accessible_by).flatten.compact.uniq if accessible_by
126
123
  @available_actions << action
127
124
  # self.class.class_eval(&block)
128
125
  end
@@ -1,3 +1,3 @@
1
1
  module CmAdmin
2
- VERSION = "0.6.0"
2
+ VERSION = "0.6.3"
3
3
  end
@@ -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,9 @@ 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
+ copy_file 'application_policy.rb', 'app/policies/application_policy.rb'
12
13
  route 'mount CmAdmin::Engine => "/admin"'
13
14
  end
14
15
  end
@@ -0,0 +1,13 @@
1
+ require 'rails/generators'
2
+
3
+ module CmAdmin
4
+ module Generators
5
+ class PolicyGenerator < Rails::Generators::NamedBase
6
+ source_root File.expand_path('templates', __dir__)
7
+
8
+ def copy_policy_files
9
+ template "policy.rb", "app/policies/cm_admin/#{file_name}_policy.rb"
10
+ end
11
+ end
12
+ end
13
+ end
@@ -17,7 +17,7 @@ class ApplicationPolicy
17
17
  end
18
18
 
19
19
  def create?
20
- false
20
+ true
21
21
  end
22
22
 
23
23
  def new?
@@ -43,7 +43,7 @@ class ApplicationPolicy
43
43
  end
44
44
 
45
45
  def resolve
46
- raise NotImplementedError, "You must define #resolve in #{self.class}"
46
+ scope.all
47
47
  end
48
48
 
49
49
  private
@@ -0,0 +1,8 @@
1
+ class CmAdmin::<%= class_name %>Policy < ApplicationPolicy
2
+ <%- available_action_names = (CmAdmin::Model.find_by({name: class_name}).available_actions.map{|action| action.name}.uniq - ['custom_action', 'new', 'edit']) %>
3
+ <%- available_action_names.each do |action_name| %>
4
+ def <%= action_name %>?
5
+ <%= CmAdmin.authorized_roles.map {|role| "@user.#{role}" }.join(' && ') %>
6
+ end
7
+ <% end %>
8
+ end
@@ -1 +1 @@
1
- d5850cd60f91abe79ff8a84a45a9e24c75cb0e4b
1
+ 07d558738c316293586496817b2bccbf6430b5bd
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"
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.0
4
+ version: 0.6.3
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-03-25 00:00:00.000000000 Z
13
+ date: 2022-04-07 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: pagy
@@ -152,7 +152,6 @@ files:
152
152
  - app/javascript/packs/cm_admin/quick_search.js
153
153
  - app/javascript/packs/cm_admin/scaffolds.js
154
154
  - app/javascript/stylesheets/cm_admin/application.scss
155
- - app/policies/application_policy.rb
156
155
  - app/views/cm_admin/main/_associated_table.html.slim
157
156
  - app/views/cm_admin/main/_cm_pagy_nav.html.slim
158
157
  - app/views/cm_admin/main/_drawer.html.slim
@@ -222,9 +221,12 @@ files:
222
221
  - lib/cm_admin/view_helpers/navigation_helper.rb
223
222
  - lib/cm_admin/view_helpers/page_info_helper.rb
224
223
  - lib/generators/cm_admin/install_generator.rb
224
+ - lib/generators/cm_admin/policy_generator.rb
225
+ - lib/generators/cm_admin/templates/application_policy.rb
225
226
  - lib/generators/cm_admin/templates/cm_admin_initializer.rb
226
227
  - lib/generators/cm_admin/templates/custom.css
227
228
  - lib/generators/cm_admin/templates/custom.js
229
+ - lib/generators/cm_admin/templates/policy.rb
228
230
  - lib/tasks/webpack_install.rake
229
231
  - package.json
230
232
  - postcss.config.js