effective_resources 0.8.1 → 0.8.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/concerns/effective/crud_controller.rb +52 -52
- data/app/helpers/effective_resources_helper.rb +9 -19
- data/app/models/effective/resources/actions.rb +13 -1
- data/app/models/effective/resources/forms.rb +5 -16
- data/lib/effective_resources/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8f976ed56d3a007b2b1946b8620fc24b8c73dddc
|
4
|
+
data.tar.gz: 21034761b686916da76ccb02fda5d02f3ba5ca89
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a1c6926084cfa8ed8b9e963f99b1b73601c26995b3ecf0f52f8887516902394c06bd362ce14f7bffa4ed3acad4d7fb899f737b289c4fb44404edf401405d4c99
|
7
|
+
data.tar.gz: 166df66e1f56b62ce979f53eeec17a81b9c736ab964019f4c2c832808806f47ddd91edba1f981bdbc795ebb33f24894acca310dc5dfa645a44110fb271fa8375
|
@@ -166,9 +166,22 @@ module Effective
|
|
166
166
|
self.resource ||= resource_scope.new
|
167
167
|
|
168
168
|
self.resource.assign_attributes(
|
169
|
-
params.to_unsafe_h.except(:controller, :action).select { |k, v| resource.respond_to?("#{k}=") }
|
169
|
+
params.to_unsafe_h.except(:controller, :action, :id).select { |k, v| resource.respond_to?("#{k}=") }
|
170
170
|
)
|
171
171
|
|
172
|
+
if params[:duplicate_id]
|
173
|
+
duplicate = resource_scope.find(params[:duplicate_id])
|
174
|
+
EffectiveResources.authorize!(self, :show, duplicate)
|
175
|
+
|
176
|
+
self.resource = duplicate_resource(duplicate)
|
177
|
+
raise "expected duplicate_resource to return an unsaved new #{resource_klass} resource" unless resource.kind_of?(resource_klass) && resource.new_record?
|
178
|
+
|
179
|
+
if (message = flash[:success].to_s).present?
|
180
|
+
flash.delete(:success)
|
181
|
+
flash.now[:success] = "#{message.chomp('.')}. Adding another #{resource_name.titleize} based on previous."
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
172
185
|
@page_title ||= "New #{resource_name.titleize}"
|
173
186
|
EffectiveResources.authorize!(self, :new, resource)
|
174
187
|
|
@@ -188,11 +201,6 @@ module Effective
|
|
188
201
|
resource.created_by ||= current_user if resource.respond_to?(:created_by=)
|
189
202
|
|
190
203
|
if save_resource(resource, action)
|
191
|
-
if add_new_resource_action?
|
192
|
-
render_add_new_resource! and return
|
193
|
-
end
|
194
|
-
|
195
|
-
# Normal redirect
|
196
204
|
flash[:success] ||= flash_success(resource, action)
|
197
205
|
redirect_to(resource_redirect_path)
|
198
206
|
else
|
@@ -231,11 +239,6 @@ module Effective
|
|
231
239
|
resource.assign_attributes(send(resource_params_method_name))
|
232
240
|
|
233
241
|
if save_resource(resource, action)
|
234
|
-
if add_new_resource_action?
|
235
|
-
render_add_new_resource! and return
|
236
|
-
end
|
237
|
-
|
238
|
-
# Normal save
|
239
242
|
flash[:success] ||= flash_success(resource, action)
|
240
243
|
redirect_to(resource_redirect_path)
|
241
244
|
else
|
@@ -308,7 +311,6 @@ module Effective
|
|
308
311
|
render json: { status: 200, message: "Successfully #{action_verb(action)} #{successes} / #{resources.length} selected #{resource_plural_name}" }
|
309
312
|
end
|
310
313
|
|
311
|
-
|
312
314
|
protected
|
313
315
|
|
314
316
|
# This calls the appropriate member action, probably save!, on the resource.
|
@@ -324,6 +326,8 @@ module Effective
|
|
324
326
|
run_callbacks(:resource_save)
|
325
327
|
return true
|
326
328
|
rescue => e
|
329
|
+
resource.restore_attributes(['status', 'state'])
|
330
|
+
|
327
331
|
flash.delete(:success)
|
328
332
|
flash.now[:danger] = flash_danger(resource, action, e: e)
|
329
333
|
raise ActiveRecord::Rollback
|
@@ -334,54 +338,51 @@ module Effective
|
|
334
338
|
false
|
335
339
|
end
|
336
340
|
|
341
|
+
# Should return a new resource based on the passed one
|
342
|
+
def duplicate_resource(resource)
|
343
|
+
resource.dup
|
344
|
+
end
|
345
|
+
|
337
346
|
def resource_redirect_path
|
338
|
-
|
339
|
-
|
340
|
-
commit_action_redirect = case
|
341
|
-
when :index
|
342
|
-
when :edit
|
343
|
-
when :show
|
344
|
-
when :new
|
345
|
-
when :
|
346
|
-
when
|
347
|
-
|
347
|
+
redirect = commit_action[:redirect].respond_to?(:call) ? instance_exec(&commit_action[:redirect]) : commit_action[:redirect]
|
348
|
+
|
349
|
+
commit_action_redirect = case redirect
|
350
|
+
when :index ; resource_index_path
|
351
|
+
when :edit ; resource_edit_path
|
352
|
+
when :show ; resource_show_path
|
353
|
+
when :new ; resource_new_path
|
354
|
+
when :duplicate ; resource_duplicate_path
|
355
|
+
when :back ; referer_redirect_path
|
356
|
+
when :save ; [resource_edit_path, resource_show_path].compact.first
|
357
|
+
when Symbol ; resource_action_path(commit_action[:action])
|
358
|
+
when String ; redirect
|
359
|
+
else ; nil
|
348
360
|
end
|
349
361
|
|
350
362
|
return commit_action_redirect if commit_action_redirect.present?
|
351
363
|
|
352
364
|
case params[:commit].to_s
|
353
365
|
when 'Save'
|
354
|
-
[resource_edit_path, resource_show_path, resource_index_path]
|
366
|
+
[resource_edit_path, resource_show_path, resource_index_path]
|
355
367
|
when 'Save and Add New', 'Add New'
|
356
|
-
[resource_new_path, resource_index_path]
|
368
|
+
[resource_new_path, resource_index_path]
|
369
|
+
when 'Duplicate'
|
370
|
+
[resource_duplicate_path, resource_index_path]
|
357
371
|
when 'Continue', 'Save and Continue'
|
358
|
-
resource_index_path
|
372
|
+
[resource_index_path]
|
359
373
|
else
|
360
|
-
[referer_redirect_path, resource_index_path]
|
361
|
-
end.presence || root_path
|
362
|
-
end
|
363
|
-
|
364
|
-
def add_new_resource_action?
|
365
|
-
(add_new_resource_params_method_name.present? && resource_redirect_path == resource_new_path)
|
366
|
-
end
|
367
|
-
|
368
|
-
def render_add_new_resource!
|
369
|
-
attributes = send(add_new_resource_params_method_name).except(:id, :created_at, :updated_at)
|
370
|
-
self.resource = resource_scope.new(attributes)
|
371
|
-
|
372
|
-
@page_title = "New #{resource_name.titleize}"
|
373
|
-
flash.now[:success] ||= flash_success(resource) + ". Adding another #{resource_name.titleize} based on previous."
|
374
|
-
|
375
|
-
render(:new)
|
376
|
-
true
|
374
|
+
[referer_redirect_path, resource_edit_path, resource_show_path, resource_index_path]
|
375
|
+
end.compact.first.presence || root_path
|
377
376
|
end
|
378
377
|
|
379
378
|
def referer_redirect_path
|
380
|
-
|
379
|
+
url = request.referer.to_s
|
381
380
|
|
382
|
-
if
|
383
|
-
|
384
|
-
|
381
|
+
return if (resource && resource.destroyed? && url.include?("/#{resource.to_param}"))
|
382
|
+
return if url.include?('duplicate_id=')
|
383
|
+
return unless (Rails.application.routes.recognize_path(URI(url).path) rescue false)
|
384
|
+
|
385
|
+
url
|
385
386
|
end
|
386
387
|
|
387
388
|
def resource_index_path
|
@@ -392,6 +393,10 @@ module Effective
|
|
392
393
|
effective_resource.action_path(:new)
|
393
394
|
end
|
394
395
|
|
396
|
+
def resource_duplicate_path
|
397
|
+
effective_resource.action_path(:new, duplicate_id: resource.id)
|
398
|
+
end
|
399
|
+
|
395
400
|
def resource_edit_path
|
396
401
|
effective_resource.action_path(:edit, resource)
|
397
402
|
end
|
@@ -404,7 +409,7 @@ module Effective
|
|
404
409
|
effective_resource.action_path(:destroy, resource)
|
405
410
|
end
|
406
411
|
|
407
|
-
def
|
412
|
+
def resource_action_path(action)
|
408
413
|
effective_resource.action_path(action.to_sym, resource)
|
409
414
|
end
|
410
415
|
|
@@ -490,10 +495,5 @@ module Effective
|
|
490
495
|
["#{resource_name}_params", "#{resource_plural_name}_params", 'permitted_params'].find { |name| respond_to?(name, true) } || 'params'
|
491
496
|
end
|
492
497
|
|
493
|
-
def add_new_resource_params_method_name
|
494
|
-
method_name = resource_params_method_name
|
495
|
-
"add_new_#{method_name}" if respond_to?("add_new_#{method_name}", true)
|
496
|
-
end
|
497
|
-
|
498
498
|
end
|
499
499
|
end
|
@@ -3,11 +3,7 @@ module EffectiveResourcesHelper
|
|
3
3
|
def effective_submit(form, options = {}, &block) # effective_bootstrap
|
4
4
|
resource = (controller.class.respond_to?(:effective_resource) ? controller.class.effective_resource : Effective::Resource.new(controller_path))
|
5
5
|
actions = resource.submits_for(form.object, controller: controller)
|
6
|
-
|
7
|
-
# Group by class and render
|
8
|
-
buttons = actions.group_by { |_, opts| opts[:class] }.flat_map do |_, btns|
|
9
|
-
btns.map { |name, opts| form.save(name, opts) }
|
10
|
-
end.join.html_safe
|
6
|
+
buttons = actions.map { |name, opts| form.save(name, opts) }.join.html_safe
|
11
7
|
|
12
8
|
form.submit('', options) do
|
13
9
|
(block_given? ? capture(&block) : ''.html_safe) + buttons
|
@@ -19,23 +15,17 @@ module EffectiveResourcesHelper
|
|
19
15
|
resource = (controller.class.respond_to?(:effective_resource) ? controller.class.effective_resource : Effective::Resource.new(controller_path))
|
20
16
|
actions = resource.submits_for(form.object, controller: controller)
|
21
17
|
|
22
|
-
|
23
|
-
|
24
|
-
content_tag(:div, wrapper_options) do
|
25
|
-
buttons = actions.group_by { |_, args| args[:class] }.flat_map do |_, action|
|
26
|
-
action.map { |action| form.button(:submit, *action) } + ['']
|
27
|
-
end
|
18
|
+
buttons = actions.map { |action| form.button(:submit, *action) }
|
28
19
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
20
|
+
# I think this is a bug. I can't override default button class when passing my own class: variable. it merges them.
|
21
|
+
if defined?(SimpleForm) && (btn_class = SimpleForm.button_class).present?
|
22
|
+
buttons = buttons.map { |button| button.sub(btn_class, '') }
|
23
|
+
end
|
33
24
|
|
34
|
-
|
35
|
-
buttons = [capture(&block), ''] + buttons
|
36
|
-
end
|
25
|
+
wrapper_options = { class: 'form-actions' }.merge(options.delete(:wrapper_html) || {})
|
37
26
|
|
38
|
-
|
27
|
+
content_tag(:div, wrapper_options) do
|
28
|
+
(block_given? ? capture(&block) : ''.html_safe) + buttons.join(' ').html_safe
|
39
29
|
end
|
40
30
|
end
|
41
31
|
|
@@ -38,6 +38,10 @@ module Effective
|
|
38
38
|
def action_path(action, resource = nil, opts = {})
|
39
39
|
return unless routes[action]
|
40
40
|
|
41
|
+
if resource.kind_of?(Hash)
|
42
|
+
opts = resource; resource = nil
|
43
|
+
end
|
44
|
+
|
41
45
|
# edge case: Effective::Resource.new('admin/comments').action_path(:new, @post)
|
42
46
|
if resource.present? && !resource.kind_of?(klass)
|
43
47
|
if (bt = belongs_to(resource)).present? && instance.respond_to?("#{bt.name}=")
|
@@ -45,7 +49,15 @@ module Effective
|
|
45
49
|
end
|
46
50
|
end
|
47
51
|
|
48
|
-
routes[action].format(resource || instance).presence
|
52
|
+
path = routes[action].format(resource || instance).presence
|
53
|
+
|
54
|
+
if path.present? && opts.present?
|
55
|
+
uri = URI.parse(path)
|
56
|
+
uri.query = URI.encode_www_form(opts)
|
57
|
+
path = uri.to_s
|
58
|
+
end
|
59
|
+
|
60
|
+
path
|
49
61
|
end
|
50
62
|
|
51
63
|
def actions
|
@@ -9,7 +9,7 @@ module Effective
|
|
9
9
|
def submits
|
10
10
|
@submits ||= {}.tap do |submits|
|
11
11
|
if (actions.find { |a| a == :create } || actions.find { |a| a == :update })
|
12
|
-
submits['Save'] = { action: :save, class: 'btn btn-primary' }
|
12
|
+
submits['Save'] = { action: :save, default: true, class: 'btn btn-primary' }
|
13
13
|
end
|
14
14
|
|
15
15
|
member_post_actions.each do |action| # default true means it will be overwritten by dsl methods
|
@@ -17,11 +17,11 @@ module Effective
|
|
17
17
|
end
|
18
18
|
|
19
19
|
if actions.find { |a| a == :index }
|
20
|
-
submits['Continue'] = { action: :save, redirect: :index }
|
20
|
+
submits['Continue'] = { action: :save, default: true, redirect: :index }
|
21
21
|
end
|
22
22
|
|
23
23
|
if actions.find { |a| a == :new }
|
24
|
-
submits['Add New'] = { action: :save, redirect: :new }
|
24
|
+
submits['Add New'] = { action: :save, default: true, redirect: :new }
|
25
25
|
end
|
26
26
|
end
|
27
27
|
end
|
@@ -38,21 +38,10 @@ module Effective
|
|
38
38
|
(args.key?(:if) ? obj.instance_exec(&args[:if]) : true) &&
|
39
39
|
(args.key?(:unless) ? !obj.instance_exec(&args[:unless]) : true) &&
|
40
40
|
EffectiveResources.authorized?(controller, action, obj)
|
41
|
-
end.sort do |(commit_x, x), (commit_y, y)|
|
42
|
-
# Sort to front
|
43
|
-
primary = (y[:class].include?('primary') ? 1 : 0) - (x[:class].include?('primary') ? 1 : 0)
|
44
|
-
primary = nil if primary == 0
|
45
|
-
|
46
|
-
# Sort to back
|
47
|
-
danger = (x[:class].include?('danger') ? 1 : 0) - (y[:class].include?('danger') ? 1 : 0)
|
48
|
-
danger = nil if danger == 0
|
49
|
-
|
50
|
-
primary || danger || submits.keys.index(commit_x) <=> submits.keys.index(commit_y)
|
51
|
-
end.inject({}) do |h, (commit, args)|
|
52
|
-
h[commit] = args.except(:action, :default, :if, :unless, :redirect); h
|
53
41
|
end.transform_values.with_index do |opts, index|
|
54
42
|
opts[:class] = "btn #{index == 0 ? 'btn-primary' : 'btn-secondary'}" if opts[:class].blank?
|
55
|
-
|
43
|
+
|
44
|
+
opts.except(:action, :default, :if, :unless, :redirect)
|
56
45
|
end
|
57
46
|
end
|
58
47
|
|