dynamic_scaffold 1.8.0 → 1.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/README.md +31 -0
- data/app/views/dynamic_scaffold/bootstrap/_list.html.erb +30 -24
- data/app/views/dynamic_scaffold/bootstrap/form/_row.html.erb +1 -1
- data/lib/dynamic_scaffold/controller.rb +4 -0
- data/lib/dynamic_scaffold/form/item/base.rb +12 -4
- data/lib/dynamic_scaffold/form/item/block.rb +2 -2
- data/lib/dynamic_scaffold/form/item/single_option.rb +2 -2
- data/lib/dynamic_scaffold/form/item/two_options.rb +2 -2
- data/lib/dynamic_scaffold/form/item/two_options_with_block.rb +2 -2
- data/lib/dynamic_scaffold/list_builder.rb +35 -0
- data/lib/dynamic_scaffold/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fa5ec9c069fde80c1ee44d34bafe454d67c1b8e9ad291175b65f2174d4fedd73
|
4
|
+
data.tar.gz: d23f8d2d63c3657288a1c1ac1b76fd81c68720b60e8d22d0ba986d52b1f4b610
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cdc7b66a1db5b926895223a02a37fe69db8a4d1dd0f765f80419fe2b185956d9b8f519180baaa4f7fce692840ac754d03557c58853f8333d374adc582cc71115
|
7
|
+
data.tar.gz: a915af903ec7fa690bb03922146306f30664547e2644ad806b846107008495b20f0b6a2142fcd5fa413f28a3678e39f4a90b3c94a83c2da92aaa9c8cede871c6
|
data/README.md
CHANGED
@@ -157,6 +157,34 @@ You can customize the list through the `DynamicScaffold::Config#list` property.
|
|
157
157
|
class ShopController < ApplicationController
|
158
158
|
include DynamicScaffold::Controller
|
159
159
|
dynamic_scaffold Shop do |config|
|
160
|
+
# Add button and new action to disabled, You can still post to create action.
|
161
|
+
config.list.add_button = false
|
162
|
+
# or
|
163
|
+
config.list.add_button do
|
164
|
+
# This block is called in view scope
|
165
|
+
false if params[:foo] == 1
|
166
|
+
end
|
167
|
+
|
168
|
+
# Edit button and edit action to disabled, You can still post to update action.
|
169
|
+
config.list.edit_buttons = false
|
170
|
+
# or
|
171
|
+
config.list.edit_buttons do |record|
|
172
|
+
# This block is called in view scope
|
173
|
+
# You can disable only specific record's button.
|
174
|
+
false if record.id != 1
|
175
|
+
end
|
176
|
+
|
177
|
+
# Destroy button to disabled, You can still post to destroy action.
|
178
|
+
config.list.destroy_buttons = false
|
179
|
+
# or
|
180
|
+
config.list.destroy_buttons do |record|
|
181
|
+
# This block is called in view scope
|
182
|
+
# You can disable only specific record's button.
|
183
|
+
false if record.id != 1
|
184
|
+
end
|
185
|
+
|
186
|
+
|
187
|
+
|
160
188
|
# If you want filtering that can not be handled by `config.scope`, you can use the filter method.
|
161
189
|
# Please note that returning nil will be ignored.
|
162
190
|
config.list.filter do |query|
|
@@ -253,6 +281,9 @@ class ShopController < ApplicationController
|
|
253
281
|
config.form.item(:collection_check_boxes, :state_ids, State.all, :id, :name)
|
254
282
|
config.form.item(:collection_radio_buttons, :status, Shop.statuses.map{|k, _v| [k, k.titleize]}, :first, :last)
|
255
283
|
|
284
|
+
# If you want to use parameters to get list, Pass Proc or Lambda to argument. It will be called in view scope.
|
285
|
+
config.form.item(:collection_select, :status, -> { Shop.where(area_id: params[:area_id]) }, :first, :last)
|
286
|
+
|
256
287
|
# If you want to display more free form field, use block.
|
257
288
|
# The block is executed in the context of view, so you can call the method of view.
|
258
289
|
config.form.item :block, :free do |form, field|
|
@@ -5,16 +5,18 @@
|
|
5
5
|
<%end%>
|
6
6
|
<input type="hidden" class="authenticity_param_name" value="<%= request_forgery_protection_token %>">
|
7
7
|
<%= form_with method: :patch, url: dynamic_scaffold_path(:sort, request_queries(dynamic_scaffold.list.page_param_name)), local: true do%>
|
8
|
-
|
9
|
-
|
10
|
-
<%=
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
8
|
+
<%- if dynamic_scaffold.list.add_button -%>
|
9
|
+
<div class="ds-row">
|
10
|
+
<%= link_to dynamic_scaffold_path(:new, request_queries), class: class_names('btn btn-outline-primary btn-primary btn-sm spec-ds-add', 'disabled': dynamic_scaffold.max_count?(@count)) do%>
|
11
|
+
<%= dynamic_scaffold_icon(:add) %> <%= t('dynamic_scaffold.button.add') %>
|
12
|
+
<%- unless dynamic_scaffold.max_count.nil? -%>
|
13
|
+
<span class="badge badge-light">
|
14
|
+
<%= @count %> / <%= dynamic_scaffold.max_count%>
|
15
|
+
</span>
|
16
|
+
<% end %>
|
17
|
+
<%end%>
|
18
|
+
</div>
|
19
|
+
<%- end -%>
|
18
20
|
<%= render 'dynamic_scaffold/bootstrap/pagination' %>
|
19
21
|
<div class="ds-row">
|
20
22
|
<%= render 'dynamic_scaffold/bootstrap/save_order'%>
|
@@ -47,11 +49,13 @@
|
|
47
49
|
</div>
|
48
50
|
<div class="ds-list-footer clearfix">
|
49
51
|
<div class="float-right pull-right">
|
50
|
-
|
51
|
-
|
52
|
-
<%=
|
53
|
-
|
54
|
-
|
52
|
+
<%- if dynamic_scaffold.list.edit_buttons(record) -%>
|
53
|
+
<div class="btn-group">
|
54
|
+
<%= link_to dynamic_scaffold_path(:edit, request_queries.merge(id: record[record.class.primary_key])), class: 'btn btn-primary btn-outline-primary btn-sm spec-ds-edit' do %>
|
55
|
+
<%= dynamic_scaffold_icon(:edit) %> <%= t('dynamic_scaffold.button.edit') %>
|
56
|
+
<%end%>
|
57
|
+
</div>
|
58
|
+
<%- end -%>
|
55
59
|
<% if dynamic_scaffold.list.sorter %>
|
56
60
|
<%[*dynamic_scaffold.model.primary_key].each do |pkey|%>
|
57
61
|
<input type="hidden" name="pkeys[][<%=pkey%>]" value="<%= record[pkey] %>">
|
@@ -71,15 +75,17 @@
|
|
71
75
|
</button>
|
72
76
|
</div>
|
73
77
|
<% end %>
|
74
|
-
|
75
|
-
<
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
78
|
+
<%- if dynamic_scaffold.list.destroy_buttons(record) -%>
|
79
|
+
<div class="btn-group">
|
80
|
+
<button
|
81
|
+
data-action="<%= dynamic_scaffold_path(:update, request_queries(dynamic_scaffold.list.page_param_name).merge(id: record[record.class.primary_key])) %>"
|
82
|
+
data-confirm-message="<%= t('dynamic_scaffold.message.destroy_confirm') %>"
|
83
|
+
class="btn btn-danger btn-sm js-ds-destory spec-ds-destroy"
|
84
|
+
>
|
85
|
+
<%= dynamic_scaffold_icon(:delete) %>
|
86
|
+
</button>
|
87
|
+
</div>
|
88
|
+
<%- end -%>
|
83
89
|
</div>
|
84
90
|
</div>
|
85
91
|
</li>
|
@@ -44,6 +44,8 @@ module DynamicScaffold
|
|
44
44
|
end
|
45
45
|
|
46
46
|
def new # rubocop:disable Metrics/AbcSize
|
47
|
+
raise ActionController::RoutingError, '`Add Button` is disabled.' unless dynamic_scaffold.list.add_button
|
48
|
+
|
47
49
|
unless dynamic_scaffold.max_count.nil?
|
48
50
|
count = dynamic_scaffold.list.build_sql(scope_params).count
|
49
51
|
raise Error::InvalidOperation, 'You can not add any more.' if dynamic_scaffold.max_count?(count)
|
@@ -60,6 +62,8 @@ module DynamicScaffold
|
|
60
62
|
|
61
63
|
def edit
|
62
64
|
@record = find_record(edit_params)
|
65
|
+
|
66
|
+
raise ActionController::RoutingError, '`Edit Button` is disabled.' unless dynamic_scaffold.list.edit_buttons(@record)
|
63
67
|
end
|
64
68
|
|
65
69
|
def create
|
@@ -16,7 +16,7 @@ module DynamicScaffold
|
|
16
16
|
end
|
17
17
|
|
18
18
|
attr_accessor :parent_item
|
19
|
-
attr_reader :name
|
19
|
+
attr_reader :name, :multiple
|
20
20
|
def initialize(config, type, name, html_attributes = {})
|
21
21
|
@config = config
|
22
22
|
@name = name
|
@@ -124,10 +124,10 @@ module DynamicScaffold
|
|
124
124
|
self
|
125
125
|
end
|
126
126
|
|
127
|
-
def needs_rendering?(view)
|
127
|
+
def needs_rendering?(view, record)
|
128
128
|
return true unless @if_block || @unless_block
|
129
|
-
return view.instance_exec(view.controller.params, &@if_block) if @if_block
|
130
|
-
return !view.instance_exec(view.controller.params, &@unless_block) if @unless_block
|
129
|
+
return view.instance_exec(view.controller.params, record, &@if_block) if @if_block
|
130
|
+
return !view.instance_exec(view.controller.params, record, &@unless_block) if @unless_block
|
131
131
|
end
|
132
132
|
|
133
133
|
def proxy(attribute_name)
|
@@ -184,6 +184,14 @@ module DynamicScaffold
|
|
184
184
|
options[:class] = classnames_list.join(' ') unless classnames_list.empty?
|
185
185
|
options
|
186
186
|
end
|
187
|
+
|
188
|
+
def build_args(view, args)
|
189
|
+
args.map do |arg|
|
190
|
+
next arg unless arg.is_a? Proc
|
191
|
+
|
192
|
+
view.instance_exec(&arg)
|
193
|
+
end
|
194
|
+
end
|
187
195
|
end
|
188
196
|
end
|
189
197
|
end
|
@@ -2,8 +2,8 @@ module DynamicScaffold
|
|
2
2
|
module Form
|
3
3
|
module Item
|
4
4
|
class Block < Base
|
5
|
-
def initialize(config, type, name, &block)
|
6
|
-
super(config, type, name,
|
5
|
+
def initialize(config, type, name, options = {}, &block)
|
6
|
+
super(config, type, name, options)
|
7
7
|
@block = block
|
8
8
|
end
|
9
9
|
|
@@ -9,11 +9,11 @@ module DynamicScaffold
|
|
9
9
|
super(config, type, name, html_attributes)
|
10
10
|
end
|
11
11
|
|
12
|
-
def render(
|
12
|
+
def render(view, form, classnames = nil)
|
13
13
|
html_attributes = build_html_attributes(classnames)
|
14
14
|
# Retain the value of the password field on error.
|
15
15
|
html_attributes[:value] = form.object.public_send(@name) if @type == :password_field
|
16
|
-
form.public_send(@type, @name,
|
16
|
+
form.public_send(@type, @name, *build_args(view, @args), html_attributes)
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
@@ -18,9 +18,9 @@ module DynamicScaffold
|
|
18
18
|
super(config, type, name, html_attributes)
|
19
19
|
end
|
20
20
|
|
21
|
-
def render(
|
21
|
+
def render(view, form, classnames = nil)
|
22
22
|
html_attributes = build_html_attributes(classnames)
|
23
|
-
form.public_send(@type, @name,
|
23
|
+
form.public_send(@type, @name, *build_args(view, @args), @options, html_attributes)
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
@@ -2,11 +2,11 @@ module DynamicScaffold
|
|
2
2
|
module Form
|
3
3
|
module Item
|
4
4
|
class TwoOptionsWithBlock < TwoOptions
|
5
|
-
def render(
|
5
|
+
def render(view, form, classnames = nil)
|
6
6
|
form.public_send(
|
7
7
|
@type,
|
8
8
|
@name,
|
9
|
-
|
9
|
+
*build_args(view, @args),
|
10
10
|
@options,
|
11
11
|
build_html_attributes(classnames)
|
12
12
|
) do |builder|
|
@@ -1,5 +1,7 @@
|
|
1
1
|
module DynamicScaffold
|
2
2
|
class ListBuilder
|
3
|
+
attr_writer :add_button, :edit_buttons, :destroy_buttons
|
4
|
+
|
3
5
|
def initialize(config)
|
4
6
|
@config = config
|
5
7
|
@items = []
|
@@ -8,6 +10,9 @@ module DynamicScaffold
|
|
8
10
|
@title = nil
|
9
11
|
@filter = nil
|
10
12
|
@row_class_block = nil
|
13
|
+
@add_button = true
|
14
|
+
@edit_buttons = true
|
15
|
+
@destroy_buttons = true
|
11
16
|
end
|
12
17
|
|
13
18
|
def pagination(options = nil)
|
@@ -97,5 +102,35 @@ module DynamicScaffold
|
|
97
102
|
@config.controller.view_context.instance_exec(record, &@row_class_block)
|
98
103
|
end
|
99
104
|
end
|
105
|
+
|
106
|
+
def add_button(&block)
|
107
|
+
if block_given?
|
108
|
+
@add_button_block = block
|
109
|
+
elsif @add_button_block
|
110
|
+
@config.controller.view_context.instance_exec(&@add_button_block)
|
111
|
+
else
|
112
|
+
@add_button
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def edit_buttons(record = nil, &block)
|
117
|
+
if block_given?
|
118
|
+
@edit_buttons_block = block
|
119
|
+
elsif record.present? && @edit_buttons_block
|
120
|
+
@config.controller.view_context.instance_exec(record, &@edit_buttons_block)
|
121
|
+
else
|
122
|
+
@edit_buttons
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def destroy_buttons(record = nil, &block)
|
127
|
+
if block_given?
|
128
|
+
@destroy_buttons_block = block
|
129
|
+
elsif record.present? && @destroy_buttons_block
|
130
|
+
@config.controller.view_context.instance_exec(record, &@destroy_buttons_block)
|
131
|
+
else
|
132
|
+
@destroy_buttons
|
133
|
+
end
|
134
|
+
end
|
100
135
|
end
|
101
136
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dynamic_scaffold
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Masamoto Miyata
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-07-
|
11
|
+
date: 2021-07-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: classnames-rails-view
|