proxes 0.7.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +1 -1
  4. data/.travis.yml +0 -3
  5. data/Gemfile.ci +5 -2
  6. data/README.md +12 -9
  7. data/Rakefile +10 -5
  8. data/Vagrantfile +1 -4
  9. data/config.ru +32 -24
  10. data/lib/{proxes → ditty/components}/proxes.rb +26 -33
  11. data/lib/proxes/controllers/permissions.rb +4 -3
  12. data/lib/proxes/models/permission.rb +7 -5
  13. data/lib/proxes/policies/permission_policy.rb +4 -4
  14. data/lib/proxes/policies/request/index_policy.rb +1 -1
  15. data/lib/proxes/policies/request_policy.rb +3 -4
  16. data/lib/proxes/policies/token_policy.rb +1 -1
  17. data/lib/proxes/request/cat.rb +2 -2
  18. data/lib/proxes/request/index.rb +2 -2
  19. data/lib/proxes/request.rb +1 -1
  20. data/lib/proxes/security.rb +10 -12
  21. data/lib/proxes/version.rb +1 -1
  22. data/lib/proxes.rb +1 -3
  23. data/migrate/20170207_base_tables.rb +2 -1
  24. data/migrate/20170208_audit_log.rb +1 -0
  25. data/proxes.gemspec +15 -14
  26. data/public/js/bundle.js +44683 -23940
  27. data/public/js/vendors.js +1 -0
  28. data/views/permissions/form.haml +2 -2
  29. data/views/permissions/index.haml +14 -9
  30. metadata +69 -108
  31. data/lib/proxes/container.rb +0 -135
  32. data/lib/proxes/controllers/app.rb +0 -80
  33. data/lib/proxes/controllers/application.rb +0 -80
  34. data/lib/proxes/controllers/audit_logs.rb +0 -44
  35. data/lib/proxes/controllers/component.rb +0 -167
  36. data/lib/proxes/controllers/roles.rb +0 -16
  37. data/lib/proxes/controllers/users.rb +0 -183
  38. data/lib/proxes/db.rb +0 -18
  39. data/lib/proxes/helpers/authentication.rb +0 -58
  40. data/lib/proxes/helpers/component.rb +0 -49
  41. data/lib/proxes/helpers/pundit.rb +0 -40
  42. data/lib/proxes/helpers/views.rb +0 -42
  43. data/lib/proxes/helpers/wisper.rb +0 -15
  44. data/lib/proxes/listener.rb +0 -23
  45. data/lib/proxes/models/audit_log.rb +0 -14
  46. data/lib/proxes/models/base.rb +0 -9
  47. data/lib/proxes/models/identity.rb +0 -70
  48. data/lib/proxes/models/role.rb +0 -17
  49. data/lib/proxes/models/user.rb +0 -64
  50. data/lib/proxes/omniauth.rb +0 -4
  51. data/lib/proxes/policies/application_policy.rb +0 -21
  52. data/lib/proxes/policies/audit_log_policy.rb +0 -41
  53. data/lib/proxes/policies/identity_policy.rb +0 -25
  54. data/lib/proxes/policies/role_policy.rb +0 -37
  55. data/lib/proxes/policies/user_policy.rb +0 -43
  56. data/lib/proxes/rake_tasks.rb +0 -219
  57. data/lib/proxes/seed.rb +0 -5
  58. data/lib/proxes/services/logger.rb +0 -51
  59. data/views/404.haml +0 -1
  60. data/views/audit_logs/index.haml +0 -26
  61. data/views/error.haml +0 -4
  62. data/views/getting_started.haml +0 -16
  63. data/views/identity/login.haml +0 -19
  64. data/views/identity/register.haml +0 -14
  65. data/views/index.haml +0 -3
  66. data/views/layout.haml +0 -58
  67. data/views/partials/delete_form.haml +0 -4
  68. data/views/partials/form_control.haml +0 -20
  69. data/views/partials/navbar.haml +0 -25
  70. data/views/partials/notifications.haml +0 -24
  71. data/views/partials/pager.haml +0 -12
  72. data/views/partials/sidebar.haml +0 -54
  73. data/views/roles/display.haml +0 -38
  74. data/views/roles/edit.haml +0 -11
  75. data/views/roles/form.haml +0 -1
  76. data/views/roles/index.haml +0 -20
  77. data/views/roles/new.haml +0 -10
  78. data/views/users/display.haml +0 -69
  79. data/views/users/edit.haml +0 -11
  80. data/views/users/identity.haml +0 -3
  81. data/views/users/index.haml +0 -23
  82. data/views/users/new.haml +0 -11
  83. data/views/users/profile.haml +0 -39
  84. data/views/users/user.haml +0 -3
@@ -1,80 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'wisper'
4
- require 'sinatra/base'
5
- require 'sinatra/flash'
6
- require 'sinatra/respond_with'
7
- require 'proxes/helpers/views'
8
- require 'proxes/helpers/pundit'
9
- require 'proxes/helpers/wisper'
10
- require 'proxes/helpers/authentication'
11
- require 'proxes/services/logger'
12
- require 'rack/contrib'
13
- require 'elasticsearch'
14
-
15
- module ProxES
16
- class Application < Sinatra::Base
17
- set :root, ENV['APP_ROOT'] || ::File.expand_path(::File.dirname(__FILE__) + '/../../../')
18
- set :view_location, nil
19
- set :model_class, nil
20
- # The order here is important, since Wisper has a deprecated method respond_with method
21
- helpers Wisper::Publisher, Helpers::Wisper
22
- helpers Helpers::Pundit, Helpers::Views, Helpers::Authentication
23
-
24
- helpers do
25
- def cluster_health
26
- @health ||= begin
27
- client = ::Elasticsearch::Client.new host: ENV['ELASTICSEARCH_URL']
28
- client.cluster.health
29
- end
30
- rescue => e
31
- ::ProxES::Services::Logger.instance.warn "Could not connect to ES Cluster: #{e.message}"
32
- nil
33
- end
34
- end
35
-
36
- register Sinatra::Flash, Sinatra::RespondWith
37
-
38
- use Rack::PostBodyContentTypeParser
39
- use Rack::MethodOverride
40
-
41
- configure :production do
42
- disable :show_exceptions
43
- end
44
-
45
- configure :development do
46
- set :show_exceptions, :after_handler
47
- end
48
-
49
- configure :production, :development do
50
- enable :logging
51
- end
52
-
53
- not_found do
54
- haml :'404', locals: { title: '4 oh 4' }
55
- end
56
-
57
- error do
58
- error = env['sinatra.error']
59
- haml :error, locals: { title: 'Something went wrong', message: error }
60
- end
61
-
62
- error Helpers::NotAuthenticated do
63
- flash[:warning] = 'Please log in first.'
64
- redirect '/_proxes/auth/identity'
65
- end
66
-
67
- error ::Pundit::NotAuthorizedError do
68
- flash[:warning] = 'Please log in first.'
69
- redirect '/_proxes/auth/identity'
70
- end
71
-
72
- before(/.*/) do
73
- ::ProxES::Services::Logger.instance.debug "Running with #{self.class}"
74
- if request.url =~ /.json/
75
- request.accept.unshift('application/json')
76
- request.path_info = request.path_info.gsub(/.json/, '')
77
- end
78
- end
79
- end
80
- end
@@ -1,44 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'proxes/controllers/component'
4
- require 'proxes/models/audit_log'
5
- require 'proxes/policies/audit_log_policy'
6
-
7
- module ProxES
8
- class AuditLogs < Component
9
- set model_class: AuditLog
10
-
11
- def find_template(views, name, engine, &block)
12
- super(views, name, engine, &block) # Root
13
- super(::ProxES::ProxES.view_folder, name, engine, &block) # Basic Plugin
14
- end
15
-
16
- def list
17
- super.order(:created_at).reverse
18
- end
19
-
20
- get '/new' do
21
- halt 404
22
- end
23
-
24
- post '/' do
25
- halt 404
26
- end
27
-
28
- get '/:id' do
29
- halt 404
30
- end
31
-
32
- get '/:id/edit' do
33
- halt 404
34
- end
35
-
36
- put '/:id' do
37
- halt 404
38
- end
39
-
40
- delete '/:id' do
41
- halt 404
42
- end
43
- end
44
- end
@@ -1,167 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'proxes/controllers/application'
4
- require 'proxes/helpers/component'
5
- require 'sinatra/json'
6
-
7
- module ProxES
8
- class Component < Application
9
- helpers Helpers::Component
10
-
11
- set base_path: nil
12
- set dehumanized: nil
13
- set view_location: nil
14
- set track_actions: false
15
-
16
- def find_template(views, name, engine, &block)
17
- super(views, name, engine, &block) # Root
18
- super(::ProxES::ProxES.view_folder, name, engine, &block) # Basic Plugin
19
- end
20
-
21
- # List
22
- get '/', provides: [:html, :json] do
23
- authorize settings.model_class, :list
24
-
25
- actions = {}
26
- actions["#{base_path}/new"] = "New #{heading}" if policy(settings.model_class).create?
27
-
28
- log_action("#{dehumanized}_list".to_sym) if settings.track_actions
29
- respond_to do |format|
30
- format.html do
31
- haml :"#{view_location}/index",
32
- locals: { list: list, title: heading(:list), actions: actions }
33
- end
34
- format.json do
35
- # TODO: Add links defined by actions (New #{heading})
36
- json(
37
- 'items' => list.map(&:for_json),
38
- 'page' => params[:page],
39
- 'count' => list.count,
40
- 'total' => dataset.count
41
- )
42
- end
43
- end
44
- end
45
-
46
- # Create Form
47
- get '/new' do
48
- authorize settings.model_class, :create
49
-
50
- entity = settings.model_class.new(permitted_attributes(settings.model_class, :create))
51
- haml :"#{view_location}/new", locals: { entity: entity, title: heading(:new) }
52
- end
53
-
54
- # Create
55
- post '/' do
56
- authorize settings.model_class, :create
57
-
58
- entity = settings.model_class.new(permitted_attributes(settings.model_class, :create))
59
- success = entity.valid? && entity.save
60
-
61
- log_action("#{dehumanized}_create".to_sym) if success && settings.track_actions
62
- respond_to do |format|
63
- format.html do
64
- if success
65
- flash[:success] = "#{heading} Created"
66
- redirect "#{base_path}/#{entity.id}"
67
- else
68
- haml :"#{view_location}/new", locals: { entity: entity, title: heading(:new) }
69
- end
70
- end
71
- format.json do
72
- headers 'Content-Type' => 'application/json'
73
- if success
74
- redirect "#{base_path}/#{entity.id}", 201
75
- else
76
- 400
77
- end
78
- end
79
- end
80
- end
81
-
82
- # Read
83
- get '/:id' do |id|
84
- entity = dataset[id.to_i]
85
- halt 404 unless entity
86
- authorize entity, :read
87
-
88
- actions = {}
89
- actions["#{base_path}/#{entity.id}/edit"] = "Edit #{heading}" if policy(entity).update?
90
-
91
- log_action("#{dehumanized}_read".to_sym) if settings.track_actions
92
- respond_to do |format|
93
- format.html do
94
- haml :"#{view_location}/display",
95
- locals: { entity: entity, title: heading, actions: actions }
96
- end
97
- format.json do
98
- # TODO: Add links defined by actions (Edit #{heading})
99
- json entity.for_json
100
- end
101
- end
102
- end
103
-
104
- # Update Form
105
- get '/:id/edit' do |id|
106
- entity = dataset[id.to_i]
107
- halt 404 unless entity
108
- authorize entity, :update
109
-
110
- haml :"#{view_location}/edit", locals: { entity: entity, title: heading(:edit) }
111
- end
112
-
113
- # Update
114
- put '/:id' do |id|
115
- entity = dataset[id.to_i]
116
- halt 404 unless entity
117
- authorize entity, :update
118
-
119
- entity.set(permitted_attributes(settings.model_class, :update))
120
-
121
- success = entity.valid? && entity.save
122
- log_action("#{dehumanized}_update".to_sym) if success && settings.track_actions
123
- if success
124
- respond_to do |format|
125
- format.html do
126
- flash[:success] = "#{heading} Updated"
127
- redirect "#{base_path}/#{entity.id}"
128
- end
129
- format.json do
130
- headers 'Location' => "#{base_path}/#{entity.id}"
131
- json body entity.for_json
132
- end
133
- end
134
- else
135
- respond_to do |format|
136
- format.html do
137
- haml :"#{view_location}/edit", locals: { entity: entity, title: heading(:edit) }
138
- end
139
- format.json do
140
- 400
141
- end
142
- end
143
- end
144
- end
145
-
146
- delete '/:id' do |id|
147
- entity = dataset[id.to_i]
148
- halt 404 unless entity
149
- authorize entity, :delete
150
-
151
- entity.destroy
152
-
153
- log_action("#{dehumanized}_delete".to_sym) if settings.track_actions
154
- respond_to do |format|
155
- format.html do
156
- flash[:success] = "#{heading} Deleted"
157
- redirect base_path.to_s
158
- end
159
- format.json do
160
- content_type 'application/json'
161
- headers 'Location' => '/_proxes/users'
162
- status 204
163
- end
164
- end
165
- end
166
- end
167
- end
@@ -1,16 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'proxes/controllers/component'
4
- require 'proxes/models/role'
5
- require 'proxes/policies/role_policy'
6
-
7
- module ProxES
8
- class Roles < Component
9
- set model_class: Role
10
-
11
- def find_template(views, name, engine, &block)
12
- super(views, name, engine, &block) # Root
13
- super(::ProxES::ProxES.view_folder, name, engine, &block) # Basic Plugin
14
- end
15
- end
16
- end
@@ -1,183 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'proxes/controllers/component'
4
- require 'proxes/models/user'
5
- require 'proxes/policies/user_policy'
6
- require 'proxes/models/identity'
7
- require 'proxes/policies/identity_policy'
8
-
9
- module ProxES
10
- class Users < Component
11
- set model_class: User
12
- set track_actions: true
13
-
14
- def find_template(views, name, engine, &block)
15
- super(views, name, engine, &block) # Root
16
- super(::ProxES::ProxES.view_folder, name, engine, &block) # Basic Plugin
17
- end
18
-
19
- # New
20
- get '/new' do
21
- authorize settings.model_class, :create
22
-
23
- locals = {
24
- title: heading(:new),
25
- entity: User.new,
26
- identity: Identity.new
27
- }
28
- haml :"#{view_location}/new", locals: locals, layout_opts: { locals: locals }
29
- end
30
-
31
- # Create
32
- post '/' do
33
- authorize settings.model_class, :create
34
-
35
- locals = { title: heading(:new) }
36
-
37
- user_params = permitted_attributes(User, :create)
38
- identity_params = permitted_attributes(Identity, :create)
39
- user_params['email'] = identity_params['username']
40
- roles = user_params.delete('role_id')
41
-
42
- user = locals[:user] = User.new(user_params)
43
- identity = locals[:identity] = Identity.new(identity_params)
44
-
45
- if identity.valid? && user.valid?
46
- DB.transaction(isolation: :serializable) do
47
- identity.save
48
- user.save
49
- user.add_identity identity
50
- if roles
51
- roles.each do |role_id|
52
- user.add_role(role_id) unless user.roles.map(&:id).include? role_id.to_i
53
- end
54
- end
55
- user.check_roles
56
- end
57
-
58
- log_action("#{dehumanized}_create".to_sym) if settings.track_actions
59
- respond_to do |format|
60
- format.html do
61
- flash[:success] = 'User created'
62
- redirect "/_proxes/users/#{user.id}"
63
- end
64
- format.json do
65
- headers 'Content-Type' => 'application/json'
66
- redirect "/_proxes/users/#{user.id}", 201
67
- end
68
- end
69
- else
70
- respond_to do |format|
71
- format.html do
72
- flash.now[:danger] = 'Could not create the user'
73
- locals[:entity] = user
74
- locals[:identity] = identity
75
- haml :"#{view_location}/new", locals: locals
76
- end
77
- format.json do
78
- headers \
79
- 'Content-Type' => 'application/json',
80
- 'Content-Location' => "#{view_location}/new"
81
- body ''
82
- status 402
83
- end
84
- end
85
- end
86
- end
87
-
88
- # Update
89
- put '/:id' do |id|
90
- entity = dataset[id.to_i]
91
- halt 404 unless entity
92
- authorize entity, :update
93
-
94
- values = permitted_attributes(settings.model_class, :update)
95
- roles = values.delete('role_id')
96
- entity.set values
97
- if entity.valid? && entity.save
98
- entity.remove_all_roles
99
- roles.each { |role_id| entity.add_role(role_id) } if roles
100
- entity.check_roles
101
- log_action("#{dehumanized}_update".to_sym) if settings.track_actions
102
- respond_to do |format|
103
- format.html do
104
- flash[:success] = "#{heading} Updated"
105
- redirect "/_proxes/users/#{entity.id}"
106
- end
107
- format.json do
108
- content_type 'application/json'
109
- headers 'Location' => "/_proxes/users/#{entity.id}"
110
- body entity.to_hash.to_json
111
- status 200
112
- end
113
- end
114
- else
115
- haml :"#{view_location}/edit", locals: { entity: entity, title: heading(:edit) }
116
- end
117
- end
118
-
119
- put '/:id/identity' do |id|
120
- entity = dataset[id.to_i]
121
- halt 404 unless entity
122
- authorize entity, :update
123
-
124
- identity = entity.identity.first
125
- identity_params = params['identity']
126
-
127
- unless identity_params['password'] == identity_params['password_confirmation']
128
- flash[:warning] = 'Password didn\'t match'
129
- return redirect back
130
- end
131
-
132
- unless current_user.super_admin? || identity.authenticate(identity_params['old_password'])
133
- log_action("#{dehumanized}_update_password_failed".to_sym) if settings.track_actions
134
- flash[:danger] = 'Old Password didn\'t match'
135
- return redirect back
136
- end
137
-
138
- values = permitted_attributes(Identity, :create)
139
- identity.set values
140
- if identity.valid? && identity.save
141
- log_action("#{dehumanized}_update_password".to_sym) if settings.track_actions
142
- flash[:success] = 'Password Updated'
143
- redirect "#{base_path}/#{entity.id}"
144
- elsif current_user.super_admin?
145
- haml :"#{view_location}/display", locals: { entity: entity, identity: identity, title: heading }
146
- else
147
- haml :"#{view_location}/profile", locals: { entity: entity, identity: identity, title: heading }
148
- end
149
- end
150
-
151
- # Delete
152
- delete '/:id', provides: [:html, :json] do |id|
153
- entity = dataset[id.to_i]
154
- halt 404 unless entity
155
- authorize entity, :delete
156
-
157
- entity.remove_all_identity
158
- entity.remove_all_roles
159
- entity.destroy
160
-
161
- log_action("#{dehumanized}_delete".to_sym) if settings.track_actions
162
- respond_to do |format|
163
- format.html do
164
- flash[:success] = "#{heading} Deleted"
165
- redirect '/_proxes/users'
166
- end
167
- format.json do
168
- content_type 'application/json'
169
- headers 'Location' => '/_proxes/users'
170
- status 204
171
- end
172
- end
173
- end
174
-
175
- # Profile
176
- get '/profile' do
177
- entity = current_user
178
- authorize entity, :read
179
-
180
- haml :"#{view_location}/profile", locals: { entity: entity, identity: entity.identity.first, title: 'My Account' }
181
- end
182
- end
183
- end
data/lib/proxes/db.rb DELETED
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'sequel'
4
- require 'proxes/services/logger'
5
-
6
- # Delete DATABASE_URL from the environment, so it isn't accidently
7
- # passed to subprocesses. DATABASE_URL may contain passwords.
8
- DB = Sequel.connect(ENV['RACK_ENV'] == 'production' ? ENV.delete('DATABASE_URL') : ENV['DATABASE_URL'])
9
-
10
- log_level = (ENV['SEQUEL_LOGGING_LEVEL'] || :debug).to_sym
11
- DB.sql_log_level = log_level
12
- DB.loggers << ProxES::Services::Logger.instance
13
-
14
- DB.extension(:pagination)
15
-
16
- Sequel::Model.plugin :auto_validations
17
- Sequel::Model.plugin :update_or_create
18
- Sequel::Model.plugin :timestamps, update_on_create: true
@@ -1,58 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ProxES
4
- module Helpers
5
- module Authentication
6
- def current_user
7
- if env['rack.session'].nil? || env['rack.session']['user_id'].nil?
8
- self.current_user = anonymous_user
9
- end
10
- @users ||= Hash.new { |h, k| h[k] = User[k] }
11
- @users[env['rack.session']['user_id']]
12
- end
13
-
14
- def current_user=(user)
15
- env['rack.session'] = {} if env['rack.session'].nil?
16
- env['rack.session']['user_id'] = user.id if user
17
- end
18
-
19
- def authenticate
20
- authenticated?
21
- end
22
-
23
- def authenticated?
24
- current_user && !current_user.role?('anonymous')
25
- end
26
-
27
- def authenticate!
28
- raise NotAuthenticated unless authenticated?
29
- true
30
- end
31
-
32
- def logout
33
- env['rack.session'].delete('user_id')
34
- end
35
-
36
- def check_basic(request)
37
- auth = Rack::Auth::Basic::Request.new(request.env)
38
- return false unless auth.provided? && auth.basic?
39
-
40
- identity = ::ProxES::Identity.find(username: auth.credentials[0])
41
- identity = ::ProxES::Identity.find(username: URI.unescape(auth.credentials[0])) unless identity
42
- return false unless identity
43
- self.current_user = identity.user if identity.authenticate(auth.credentials[1])
44
- end
45
-
46
- def anonymous_user
47
- return @anonymous_user if defined? @anonymous_user
48
- @anonymous_user ||= begin
49
- role = ::ProxES::Role.where(name: 'anonymous').first
50
- ::ProxES::User.where(roles: role).first unless role.nil?
51
- end
52
- end
53
- end
54
-
55
- class NotAuthenticated < StandardError
56
- end
57
- end
58
- end
@@ -1,49 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'active_support'
4
- require 'active_support/inflector'
5
-
6
- module ProxES
7
- module Helpers
8
- module Component
9
- include ActiveSupport::Inflector
10
-
11
- def dataset
12
- policy_scope(settings.model_class)
13
- end
14
-
15
- def list
16
- params['count'] ||= 10
17
- params['page'] ||= 1
18
-
19
- dataset.select.paginate(params['page'].to_i, params['count'].to_i)
20
- end
21
-
22
- def heading(action = nil)
23
- @headings ||= begin
24
- heading = titleize(demodulize(settings.model_class))
25
- h = Hash.new(heading)
26
- h[:new] = "New #{heading}"
27
- h[:list] = pluralize heading
28
- h[:edit] = "Edit #{heading}"
29
- h
30
- end
31
- @headings[action]
32
- end
33
-
34
- def dehumanized
35
- settings.dehumanized || underscore(heading)
36
- end
37
-
38
- def base_path
39
- settings.base_path || "/_proxes/#{dasherize(view_location)}"
40
- end
41
-
42
- def view_location
43
- return settings.view_location if settings.view_location
44
- return underscore(pluralize(demodulize(settings.model_class))) if settings.model_class
45
- underscore(demodulize(self.class))
46
- end
47
- end
48
- end
49
- end
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'pundit'
4
- require 'proxes/request'
5
-
6
- module ProxES
7
- module Helpers
8
- module Pundit
9
- include ::Pundit
10
-
11
- def authorize(record, query = nil)
12
- if record.is_a?(Request)
13
- query = record.request_method.downcase
14
- elsif query.nil?
15
- raise ArgumentError, 'Pundit cannot determine the query'
16
- end
17
- query = :"#{query}?" unless query[-1] == '?'
18
- super
19
- end
20
-
21
- def permitted_attributes(record, action)
22
- param_key = PolicyFinder.new(record).param_key
23
- policy = policy(record)
24
- method_name = if policy.respond_to?("permitted_attributes_for_#{action}")
25
- "permitted_attributes_for_#{action}"
26
- else
27
- 'permitted_attributes'
28
- end
29
-
30
- request.params.fetch(param_key, {}).select do |key, _value|
31
- policy.public_send(method_name).include? key.to_sym
32
- end
33
- end
34
-
35
- def pundit_user
36
- current_user
37
- end
38
- end
39
- end
40
- end
@@ -1,42 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ProxES
4
- module Helpers
5
- module Views
6
- def form_control(name, model, opts = {})
7
- label = opts.delete(:label) || name.to_s.titlecase
8
- klass = opts.delete(:class) || 'form-control' unless opts[:type] == 'file'
9
- group = opts.delete(:group) || model.class.to_s.demodulize.underscore
10
- field = opts.delete(:field) || name
11
-
12
- attributes = { type: 'text', id: name, name: "#{group}[#{name}]", class: klass }.merge(opts)
13
- locals = { model: model, label: label, attributes: attributes, name: name, group: group, field: field }
14
- haml :'partials/form_control', locals: locals
15
- end
16
-
17
- def flash_messages(key = :flash)
18
- return '' if flash(key).empty?
19
- id = (key == :flash ? 'flash' : "flash_#{key}")
20
- messages = flash(key).collect do |message|
21
- " <div class='alert alert-#{message[0]} alert-dismissable' role='alert'>#{message[1]}</div>\n"
22
- end
23
- "<div id='#{id}'>\n" + messages.join + '</div>'
24
- end
25
-
26
- def delete_form(entity, label = 'Delete')
27
- locals = { delete_label: label, entity: entity }
28
- haml :'partials/delete_form', locals: locals
29
- end
30
-
31
- def pagination(list, base_path)
32
- locals = {
33
- next_link: list.last_page? ? '#' : "#{base_path}?page=#{list.next_page}&count=#{list.page_size}",
34
- prev_link: list.first_page? ? '#' : "#{base_path}?page=#{list.prev_page}&count=#{list.page_size}",
35
- base_path: base_path,
36
- list: list
37
- }
38
- haml :'partials/pager', locals: locals
39
- end
40
- end
41
- end
42
- end