godmin 0.10.3 → 0.11.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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG.md +8 -0
- data/README.md +146 -81
- data/app/assets/javascripts/godmin/batch-actions.js +18 -13
- data/app/assets/stylesheets/godmin/index.css.scss +15 -8
- data/app/views/godmin/resource/_batch_actions.html.erb +2 -4
- data/app/views/godmin/resource/_breadcrumb.html.erb +0 -3
- data/app/views/godmin/resource/_button_actions.html.erb +2 -2
- data/app/views/godmin/resource/_filters.html.erb +17 -18
- data/app/views/godmin/resource/_form.html.erb +1 -1
- data/app/views/godmin/resource/_pagination.html.erb +11 -11
- data/app/views/godmin/resource/_scopes.html.erb +4 -4
- data/app/views/godmin/resource/_table.html.erb +30 -30
- data/app/views/godmin/resource/index.html.erb +3 -10
- data/godmin.gemspec +4 -1
- data/lib/generators/godmin/authentication/templates/sessions_controller.rb +1 -1
- data/lib/generators/godmin/install/install_generator.rb +1 -1
- data/lib/generators/godmin/resource/resource_generator.rb +4 -0
- data/lib/generators/godmin/resource/templates/resource_controller.rb +1 -9
- data/lib/generators/godmin/resource/templates/resource_service.rb +8 -0
- data/lib/godmin.rb +4 -2
- data/lib/godmin/{application.rb → application_controller.rb} +1 -1
- data/lib/godmin/authentication.rb +1 -1
- data/lib/godmin/authentication/{sessions.rb → sessions_controller.rb} +1 -1
- data/lib/godmin/authorization.rb +1 -1
- data/lib/godmin/authorization/policy_finder.rb +3 -1
- data/lib/godmin/helpers/application.rb +10 -0
- data/lib/godmin/helpers/batch_actions.rb +7 -4
- data/lib/godmin/helpers/filters.rb +72 -73
- data/lib/godmin/helpers/tables.rb +1 -3
- data/lib/godmin/paginator.rb +47 -0
- data/lib/godmin/rails.rb +1 -6
- data/lib/godmin/resolver.rb +7 -2
- data/lib/godmin/resources/resource_controller.rb +170 -0
- data/lib/godmin/resources/resource_service.rb +82 -0
- data/lib/godmin/resources/resource_service/batch_actions.rb +38 -0
- data/lib/godmin/resources/resource_service/filters.rb +37 -0
- data/lib/godmin/resources/resource_service/ordering.rb +27 -0
- data/lib/godmin/resources/resource_service/pagination.rb +22 -0
- data/lib/godmin/resources/resource_service/scopes.rb +61 -0
- data/lib/godmin/version.rb +1 -1
- data/test/dummy/config/environments/production.rb +1 -1
- data/test/dummy/config/environments/test.rb +1 -1
- data/test/dummy/db/schema.rb +16 -0
- data/test/lib/godmin/helpers/filters_test.rb +26 -0
- data/test/lib/godmin/paginator_test.rb +84 -0
- data/test/lib/godmin/policy_finder_test.rb +35 -6
- data/test/lib/godmin/resolver_test.rb +6 -0
- data/test/lib/godmin/resources/resource_service/batch_actions_test.rb +45 -0
- data/test/lib/godmin/resources/resource_service/filters_test.rb +32 -0
- data/test/lib/godmin/resources/resource_service/ordering_test.rb +37 -0
- data/test/lib/godmin/resources/resource_service/pagination_test.rb +31 -0
- data/test/lib/godmin/resources/resource_service/scopes_test.rb +57 -0
- data/test/lib/godmin/resources/resource_service_test.rb +21 -0
- data/test/test_helper.rb +62 -0
- metadata +75 -17
- data/.hound.yml +0 -3
- data/lib/godmin/resource.rb +0 -177
- data/lib/godmin/resource/batch_actions.rb +0 -45
- data/lib/godmin/resource/filters.rb +0 -41
- data/lib/godmin/resource/ordering.rb +0 -25
- data/lib/godmin/resource/pagination.rb +0 -64
- data/lib/godmin/resource/scopes.rb +0 -54
- data/test/dummy/db/test.sqlite3 +0 -0
data/.hound.yml
DELETED
data/lib/godmin/resource.rb
DELETED
@@ -1,177 +0,0 @@
|
|
1
|
-
require "godmin/helpers/batch_actions"
|
2
|
-
require "godmin/helpers/filters"
|
3
|
-
require "godmin/helpers/tables"
|
4
|
-
require "godmin/resource/batch_actions"
|
5
|
-
require "godmin/resource/filters"
|
6
|
-
require "godmin/resource/ordering"
|
7
|
-
require "godmin/resource/pagination"
|
8
|
-
require "godmin/resource/scopes"
|
9
|
-
|
10
|
-
module Godmin
|
11
|
-
module Resource
|
12
|
-
extend ActiveSupport::Concern
|
13
|
-
|
14
|
-
included do
|
15
|
-
helper Godmin::Helpers::BatchActions
|
16
|
-
helper Godmin::Helpers::Filters
|
17
|
-
helper Godmin::Helpers::Tables
|
18
|
-
|
19
|
-
include Godmin::Resource::BatchActions
|
20
|
-
include Godmin::Resource::Filters
|
21
|
-
include Godmin::Resource::Scopes
|
22
|
-
include Godmin::Resource::Ordering
|
23
|
-
include Godmin::Resource::Pagination
|
24
|
-
|
25
|
-
before_action :set_resource_class
|
26
|
-
before_action :set_resources, only: :index
|
27
|
-
before_action :set_resource, only: [:show, :new, :edit, :create, :update, :destroy]
|
28
|
-
|
29
|
-
helper_method :attrs_for_index
|
30
|
-
helper_method :attrs_for_form
|
31
|
-
end
|
32
|
-
|
33
|
-
def index
|
34
|
-
respond_to do |format|
|
35
|
-
format.html
|
36
|
-
format.json { render json: @resources.to_json }
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def show
|
41
|
-
respond_to do |format|
|
42
|
-
format.html
|
43
|
-
format.json { render json: @resource.to_json }
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def new; end
|
48
|
-
|
49
|
-
def edit; end
|
50
|
-
|
51
|
-
def create
|
52
|
-
respond_to do |format|
|
53
|
-
if @resource.save
|
54
|
-
format.html { redirect_to redirect_after_create, notice: redirect_flash_message }
|
55
|
-
format.json { render :show, status: :created, location: @resource }
|
56
|
-
else
|
57
|
-
format.html { render :edit }
|
58
|
-
format.json { render json: @resource.errors, status: :unprocessable_entity }
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
def update
|
64
|
-
respond_to do |format|
|
65
|
-
if @resource.update(resource_params)
|
66
|
-
format.html { redirect_to redirect_after_update, notice: redirect_flash_message }
|
67
|
-
format.json { render :show, status: :ok, location: @resource }
|
68
|
-
else
|
69
|
-
format.html { render :edit }
|
70
|
-
format.json { render json: @resource.errors, status: :unprocessable_entity }
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
def destroy
|
76
|
-
@resource.destroy
|
77
|
-
|
78
|
-
respond_to do |format|
|
79
|
-
format.html { redirect_to redirect_after_destroy, notice: redirect_flash_message }
|
80
|
-
format.json { head :no_content }
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
# Gives the view access to the list of column names
|
85
|
-
# to be printed in the index view
|
86
|
-
def attrs_for_index
|
87
|
-
[]
|
88
|
-
end
|
89
|
-
|
90
|
-
# Gives the view access to the list of attributes
|
91
|
-
# to be included in the default form
|
92
|
-
def attrs_for_form
|
93
|
-
[]
|
94
|
-
end
|
95
|
-
|
96
|
-
protected
|
97
|
-
|
98
|
-
def set_resource_class
|
99
|
-
@resource_class ||= resource_class
|
100
|
-
end
|
101
|
-
|
102
|
-
def set_resources
|
103
|
-
@resources ||= resources
|
104
|
-
authorize(@resources) if authorization_enabled?
|
105
|
-
end
|
106
|
-
|
107
|
-
def set_resource
|
108
|
-
@resource ||= resource
|
109
|
-
authorize(@resource) if authorization_enabled?
|
110
|
-
end
|
111
|
-
|
112
|
-
def resource_class
|
113
|
-
controller_name.classify.constantize
|
114
|
-
end
|
115
|
-
|
116
|
-
def resources_relation
|
117
|
-
resource_class.all
|
118
|
-
end
|
119
|
-
|
120
|
-
def resources
|
121
|
-
apply_pagination(
|
122
|
-
apply_order(
|
123
|
-
apply_filters(
|
124
|
-
apply_scope(
|
125
|
-
resources_relation
|
126
|
-
)
|
127
|
-
)
|
128
|
-
)
|
129
|
-
)
|
130
|
-
end
|
131
|
-
|
132
|
-
def resource
|
133
|
-
if params[:id]
|
134
|
-
find_resource(params[:id])
|
135
|
-
else
|
136
|
-
case action_name
|
137
|
-
when "create"
|
138
|
-
build_resource(resource_params)
|
139
|
-
when "new"
|
140
|
-
build_resource(nil)
|
141
|
-
end
|
142
|
-
end
|
143
|
-
end
|
144
|
-
|
145
|
-
def build_resource(params)
|
146
|
-
resources_relation.new(params)
|
147
|
-
end
|
148
|
-
|
149
|
-
def find_resource(id)
|
150
|
-
resources_relation.find(id)
|
151
|
-
end
|
152
|
-
|
153
|
-
def resource_params
|
154
|
-
params.require(resource_class.name.underscore.parameterize("_").to_sym).permit(attrs_for_form)
|
155
|
-
end
|
156
|
-
|
157
|
-
def redirect_after_create
|
158
|
-
redirect_after_save
|
159
|
-
end
|
160
|
-
|
161
|
-
def redirect_after_update
|
162
|
-
redirect_after_save
|
163
|
-
end
|
164
|
-
|
165
|
-
def redirect_after_save
|
166
|
-
@resource
|
167
|
-
end
|
168
|
-
|
169
|
-
def redirect_after_destroy
|
170
|
-
resource_class.model_name.route_key.to_sym
|
171
|
-
end
|
172
|
-
|
173
|
-
def redirect_flash_message
|
174
|
-
translate_scoped("flash.#{action_name}", resource: @resource.class.model_name.human)
|
175
|
-
end
|
176
|
-
end
|
177
|
-
end
|
@@ -1,45 +0,0 @@
|
|
1
|
-
module Godmin
|
2
|
-
module Resource
|
3
|
-
module BatchActions
|
4
|
-
extend ActiveSupport::Concern
|
5
|
-
|
6
|
-
included do
|
7
|
-
helper_method :batch_action_map
|
8
|
-
end
|
9
|
-
|
10
|
-
def batch_action_map
|
11
|
-
self.class.batch_action_map
|
12
|
-
end
|
13
|
-
|
14
|
-
def batch_action
|
15
|
-
action = params[:batch_action][:action]
|
16
|
-
item_ids = params[:batch_action][:items].keys.map(&:to_i)
|
17
|
-
|
18
|
-
if batch_action_map.key?(action.to_sym)
|
19
|
-
# Store the batched item ids so they can be highlighted later
|
20
|
-
flash[:batch_actioned_ids] = item_ids
|
21
|
-
|
22
|
-
# If the batch action returns false, it is because it has implemented
|
23
|
-
# its own redirect. Therefore we return wihout redirecting.
|
24
|
-
return unless send("batch_action_#{action}", resource_class.find(item_ids))
|
25
|
-
end
|
26
|
-
|
27
|
-
redirect_to :back
|
28
|
-
end
|
29
|
-
|
30
|
-
module ClassMethods
|
31
|
-
def batch_action_map
|
32
|
-
@batch_action_map ||= {}
|
33
|
-
end
|
34
|
-
|
35
|
-
def batch_action(attr, options = {})
|
36
|
-
batch_action_map[attr] = {
|
37
|
-
only: nil,
|
38
|
-
except: nil,
|
39
|
-
confirm: false
|
40
|
-
}.merge(options)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
@@ -1,41 +0,0 @@
|
|
1
|
-
module Godmin
|
2
|
-
module Resource
|
3
|
-
module Filters
|
4
|
-
extend ActiveSupport::Concern
|
5
|
-
|
6
|
-
included do
|
7
|
-
helper_method :filter_map
|
8
|
-
end
|
9
|
-
|
10
|
-
def filter_map
|
11
|
-
self.class.filter_map
|
12
|
-
end
|
13
|
-
|
14
|
-
def apply_filters(resources)
|
15
|
-
if params[:filter].present?
|
16
|
-
params[:filter].each do |name, value|
|
17
|
-
if filter_map.key?(name.to_sym) && value.present?
|
18
|
-
resources = send("filter_#{name}", resources, value)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
resources
|
23
|
-
end
|
24
|
-
|
25
|
-
module ClassMethods
|
26
|
-
def filter_map
|
27
|
-
@filter_map ||= {}
|
28
|
-
end
|
29
|
-
|
30
|
-
def filter(attr, options = {})
|
31
|
-
filter_map[attr] = {
|
32
|
-
as: :string,
|
33
|
-
option_text: "to_s",
|
34
|
-
option_value: "id",
|
35
|
-
collection: nil
|
36
|
-
}.merge(options)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
module Godmin
|
2
|
-
module Resource
|
3
|
-
module Ordering
|
4
|
-
extend ActiveSupport::Concern
|
5
|
-
|
6
|
-
def apply_order(resources)
|
7
|
-
if params[:order].present?
|
8
|
-
resources.order("#{resource_class.table_name}.#{order_column} #{order_direction}")
|
9
|
-
else
|
10
|
-
resources
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
protected
|
15
|
-
|
16
|
-
def order_column
|
17
|
-
params[:order].rpartition("_").first
|
18
|
-
end
|
19
|
-
|
20
|
-
def order_direction
|
21
|
-
params[:order].rpartition("_").last
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
@@ -1,64 +0,0 @@
|
|
1
|
-
module Godmin
|
2
|
-
module Resource
|
3
|
-
module Pagination
|
4
|
-
extend ActiveSupport::Concern
|
5
|
-
|
6
|
-
WINDOW_SIZE = 7
|
7
|
-
|
8
|
-
included do
|
9
|
-
helper_method :current_page
|
10
|
-
helper_method :pages
|
11
|
-
helper_method :total_pages
|
12
|
-
helper_method :total_resources
|
13
|
-
end
|
14
|
-
|
15
|
-
def apply_pagination(resources)
|
16
|
-
resources.limit(pagination_limit).offset(pagination_offset)
|
17
|
-
end
|
18
|
-
|
19
|
-
private
|
20
|
-
|
21
|
-
def current_page
|
22
|
-
params[:page].present? ? params[:page].to_i : 1
|
23
|
-
end
|
24
|
-
|
25
|
-
def pagination_limit
|
26
|
-
self.class.per_page
|
27
|
-
end
|
28
|
-
|
29
|
-
def pagination_offset
|
30
|
-
(current_page * self.class.per_page) - self.class.per_page
|
31
|
-
end
|
32
|
-
|
33
|
-
def pages
|
34
|
-
@pages ||= begin
|
35
|
-
pages = (1..total_pages).to_a
|
36
|
-
|
37
|
-
return pages unless total_pages > WINDOW_SIZE
|
38
|
-
|
39
|
-
if current_page < WINDOW_SIZE
|
40
|
-
pages.slice(0, WINDOW_SIZE)
|
41
|
-
elsif current_page > (total_pages - WINDOW_SIZE)
|
42
|
-
pages.slice(-WINDOW_SIZE, WINDOW_SIZE)
|
43
|
-
else
|
44
|
-
pages.slice(pages.index(current_page) - (WINDOW_SIZE / 2), WINDOW_SIZE)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
def total_pages
|
50
|
-
@total_pages ||= (total_resources.to_f / self.class.per_page).ceil
|
51
|
-
end
|
52
|
-
|
53
|
-
def total_resources
|
54
|
-
@total_resource ||= resources.limit(nil).offset(nil).count
|
55
|
-
end
|
56
|
-
|
57
|
-
module ClassMethods
|
58
|
-
def per_page
|
59
|
-
25
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
@@ -1,54 +0,0 @@
|
|
1
|
-
module Godmin
|
2
|
-
module Resource
|
3
|
-
module Scopes
|
4
|
-
extend ActiveSupport::Concern
|
5
|
-
|
6
|
-
included do
|
7
|
-
helper_method :scope_map
|
8
|
-
helper_method :scope_count
|
9
|
-
end
|
10
|
-
|
11
|
-
def scope_map
|
12
|
-
self.class.scope_map
|
13
|
-
end
|
14
|
-
|
15
|
-
def scope_count(scope)
|
16
|
-
apply_filters(
|
17
|
-
send("scope_#{scope}", resources_relation)
|
18
|
-
).count
|
19
|
-
end
|
20
|
-
|
21
|
-
def apply_scope(resources)
|
22
|
-
params[:scope] = default_scope if params[:scope].blank?
|
23
|
-
|
24
|
-
if params[:scope] && scope_map.key?(params[:scope].to_sym)
|
25
|
-
send("scope_#{params[:scope]}", resources)
|
26
|
-
else
|
27
|
-
resources
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
protected
|
32
|
-
|
33
|
-
def default_scope
|
34
|
-
scope = scope_map.find -> { scope_map.first } do |_key, value|
|
35
|
-
value[:default] == true
|
36
|
-
end
|
37
|
-
|
38
|
-
scope ? scope[0].to_s : nil
|
39
|
-
end
|
40
|
-
|
41
|
-
module ClassMethods
|
42
|
-
def scope_map
|
43
|
-
@scope_map ||= {}
|
44
|
-
end
|
45
|
-
|
46
|
-
def scope(attr, options = {})
|
47
|
-
scope_map[attr] = {
|
48
|
-
default: false
|
49
|
-
}.merge(options)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
data/test/dummy/db/test.sqlite3
DELETED
File without changes
|