dynamic_scaffold 0.6.1 → 0.7.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 +61 -41
- data/app/assets/javascripts/dynamic_scaffold/common.js +6 -6
- data/app/assets/javascripts/dynamic_scaffold/delete.js +5 -5
- data/app/assets/javascripts/dynamic_scaffold/image.js +5 -5
- data/app/assets/javascripts/dynamic_scaffold/pagination.js +2 -2
- data/app/assets/javascripts/dynamic_scaffold/sorter.js +8 -8
- data/app/assets/stylesheets/dynamic_scaffold/bootstrap4.scss +4 -0
- data/app/assets/stylesheets/dynamic_scaffold/common.scss +11 -11
- data/app/assets/stylesheets/dynamic_scaffold/resplist.scss +43 -43
- data/app/views/dynamic_scaffold/bootstrap/_form.html.erb +6 -6
- data/app/views/dynamic_scaffold/bootstrap/_list.html.erb +24 -19
- data/app/views/dynamic_scaffold/bootstrap/_pagination.html.erb +1 -1
- data/app/views/dynamic_scaffold/bootstrap/kaminari/_gap.html.erb +1 -1
- data/app/views/dynamic_scaffold/bootstrap/kaminari/_page.html.erb +2 -2
- data/app/views/dynamic_scaffold/bootstrap/kaminari/_paginator.html.erb +1 -1
- data/lib/dynamic_scaffold/config.rb +39 -4
- data/lib/dynamic_scaffold/controller.rb +20 -14
- data/lib/dynamic_scaffold/controller_utilities.rb +29 -2
- data/lib/dynamic_scaffold/form/item/base.rb +2 -5
- data/lib/dynamic_scaffold/icons/fontawesome.rb +1 -1
- data/lib/dynamic_scaffold/version.rb +1 -1
- data/lib/dynamic_scaffold.rb +1 -1
- data/lib/generators/dynamic_scaffold/templates/controller.erb +19 -9
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8a67e9172b0cdb76fbc08a94a0adca5d3d93066bc0437b856001a28dbadf14a5
|
4
|
+
data.tar.gz: ed1bca36c4b1035652f84cedc6c4f06fa5312d7d9adb3804dd51e439253980bb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8ed6ef3d6e8e3170a9ed951318eef17dbdfaecd4e3c4a12da788b5e83f27f5b4bf70b978a6cfa9d37111c38a82c725e50387a771211db74496a1be9d82c1c118
|
7
|
+
data.tar.gz: 0f4304a394f9c44e248e4d60a3a1be090d4fd95c47c7c287921e7904cf11a3346d3b6190fe8c3ce36a4e6e6e56b9491b1411b113e5c2b46d84309d2e135bffac
|
data/README.md
CHANGED
@@ -153,9 +153,15 @@ You can customize the list through the `DynamicScaffold::Config#list` property.
|
|
153
153
|
class ShopController < ApplicationController
|
154
154
|
include DynamicScaffold::Controller
|
155
155
|
dynamic_scaffold Shop do |config|
|
156
|
-
#
|
156
|
+
# If you want filtering that can not be handled by `config.scope`, you can use the filter method.
|
157
|
+
# Please note that returning nil will be ignored.
|
158
|
+
config.list.filter do |query|
|
159
|
+
query.where(parent_id: nil)
|
160
|
+
end
|
161
|
+
|
162
|
+
# You can set each title in the list header through title method.
|
157
163
|
# Pass the attribute name,
|
158
|
-
|
164
|
+
config.list.title(:name)
|
159
165
|
# or
|
160
166
|
# config.list.title do |record|
|
161
167
|
# record.name
|
@@ -179,7 +185,7 @@ class ShopController < ApplicationController
|
|
179
185
|
|
180
186
|
# The first argument can also be omitted, to display item that is not model attribute.
|
181
187
|
# The block is executed in the context of view, so you can call the method of view.
|
182
|
-
config.list.item do |rec
|
188
|
+
config.list.item do |rec|
|
183
189
|
link_to "Show #{rec.name}", controls_master_shops_path
|
184
190
|
end
|
185
191
|
end
|
@@ -202,7 +208,7 @@ class ShopController < ApplicationController
|
|
202
208
|
# You can use form helper methods for type,
|
203
209
|
# text_field, check_box, radio_button, password_field, hidden_field, file_field, text_area, color_field,
|
204
210
|
# collection_check_boxes, collection_radio_buttons, collection_select, grouped_collection_select,
|
205
|
-
# time_select, date_select, datetime_select
|
211
|
+
# time_select, date_select, datetime_select, number_field, telephone_field
|
206
212
|
|
207
213
|
|
208
214
|
# Default label is I18n model attribute name.
|
@@ -388,6 +394,57 @@ class UsersController < ApplicationController
|
|
388
394
|
...
|
389
395
|
```
|
390
396
|
|
397
|
+
The scope can fix value also.
|
398
|
+
|
399
|
+
```rb
|
400
|
+
# app/controllers/users_controller.rb
|
401
|
+
class UsersController < ApplicationController
|
402
|
+
include DynamicScaffold::Controller
|
403
|
+
dynamic_scaffold User do |c|
|
404
|
+
c.scope [{role: :admin}]
|
405
|
+
# or if you use only fixed values, you can use Hash
|
406
|
+
c.scope role: :admin
|
407
|
+
...
|
408
|
+
```
|
409
|
+
|
410
|
+
#### Limit count
|
411
|
+
|
412
|
+
You can specify the maximum count of registrations.
|
413
|
+
|
414
|
+
```rb
|
415
|
+
# app/controllers/users_controller.rb
|
416
|
+
class UsersController < ApplicationController
|
417
|
+
include DynamicScaffold::Controller
|
418
|
+
dynamic_scaffold User do |c|
|
419
|
+
c.max_count 10
|
420
|
+
...
|
421
|
+
```
|
422
|
+
|
423
|
+
If database support lock, you can lock the table before count.
|
424
|
+
|
425
|
+
```rb
|
426
|
+
# app/controllers/users_controller.rb
|
427
|
+
class UsersController < ApplicationController
|
428
|
+
include DynamicScaffold::Controller
|
429
|
+
dynamic_scaffold User do |c|
|
430
|
+
c.max_count 10, lock: true
|
431
|
+
...
|
432
|
+
```
|
433
|
+
|
434
|
+
If you want a finer lock control, you can use the block.
|
435
|
+
|
436
|
+
```rb
|
437
|
+
# app/controllers/users_controller.rb
|
438
|
+
class UsersController < ApplicationController
|
439
|
+
include DynamicScaffold::Controller
|
440
|
+
dynamic_scaffold User do |c|
|
441
|
+
c.max_count 10 do |record|
|
442
|
+
ActiveRecord::Base.connection.execute("...")
|
443
|
+
end
|
444
|
+
...
|
445
|
+
```
|
446
|
+
|
447
|
+
Please note that the count of records is affected by scope and list.filter.
|
391
448
|
|
392
449
|
### View helper
|
393
450
|
|
@@ -476,43 +533,6 @@ class ShopController < ApplicationController
|
|
476
533
|
<%= dynamic_scaffold.vars.shop_type.name %>
|
477
534
|
```
|
478
535
|
|
479
|
-
### Password Handling Tips
|
480
|
-
|
481
|
-
Passwords are not displayed on the editing screen and should be skipped validation when sent with empty.
|
482
|
-
|
483
|
-
You can do it by preparing virtual attributes for the edit action, and switching between edit and new action.
|
484
|
-
|
485
|
-
```rb
|
486
|
-
class User < ApplicationRecord
|
487
|
-
validates :password, presence: true
|
488
|
-
|
489
|
-
attr_reader :password_edit
|
490
|
-
|
491
|
-
def password_edit=(value)
|
492
|
-
@password_edit = value
|
493
|
-
self.password = value if value.present?
|
494
|
-
end
|
495
|
-
end
|
496
|
-
```
|
497
|
-
|
498
|
-
```rb
|
499
|
-
class UsersController < ScaffoldController
|
500
|
-
include DynamicScaffold::Controller
|
501
|
-
dynamic_scaffold User do |config|
|
502
|
-
|
503
|
-
# If the block given to the `if` method returns false, the element is ignored.
|
504
|
-
# The block argument is `params` in controller.
|
505
|
-
config.form.item(:password_field, :password)
|
506
|
-
.if {|p| %w[new create].include? p[:action] }
|
507
|
-
|
508
|
-
# When you call the `proxy` method, the element's error messages and label will be used for the specified attribute.
|
509
|
-
config.form.item(:password_field, :password_edit)
|
510
|
-
.proxy(:password)
|
511
|
-
.if {|p| %w[edit update].include? p[:action] }
|
512
|
-
end
|
513
|
-
end
|
514
|
-
```
|
515
|
-
|
516
536
|
|
517
537
|
## Contributing
|
518
538
|
|
@@ -60,23 +60,23 @@ window.DynamicScaffold.createElement = function(tagName, attributes, style, inne
|
|
60
60
|
//confirm
|
61
61
|
;(function(){
|
62
62
|
window.DynamicScaffold.confirm = function(options){
|
63
|
-
const exists = document.querySelector('.
|
63
|
+
const exists = document.querySelector('.ds-overlay')
|
64
64
|
if(exists){
|
65
65
|
return
|
66
66
|
}
|
67
67
|
|
68
|
-
const overlay = DynamicScaffold.createElement('div', {class: '
|
69
|
-
const confirm = DynamicScaffold.createElement('div', {class: '
|
70
|
-
const inner = DynamicScaffold.createElement('div', {class: '
|
68
|
+
const overlay = DynamicScaffold.createElement('div', {class: 'ds-overlay'})
|
69
|
+
const confirm = DynamicScaffold.createElement('div', {class: 'ds-confirm'})
|
70
|
+
const inner = DynamicScaffold.createElement('div', {class: 'ds-confirm-inner'})
|
71
71
|
overlay.appendChild(confirm)
|
72
72
|
confirm.appendChild(inner)
|
73
73
|
|
74
|
-
const message = DynamicScaffold.createElement('div', {class: '
|
74
|
+
const message = DynamicScaffold.createElement('div', {class: 'ds-confirm-message'}, null, options.message)
|
75
75
|
inner.appendChild(message)
|
76
76
|
|
77
77
|
const ok = DynamicScaffold.createElement('button', {class: options.ok.class}, {}, options.ok.text)
|
78
78
|
const cancel = DynamicScaffold.createElement('button', {class: options.cancel.class}, {}, options.cancel.text)
|
79
|
-
const buttons = DynamicScaffold.createElement('div', {class: '
|
79
|
+
const buttons = DynamicScaffold.createElement('div', {class: 'ds-confirm-buttons'})
|
80
80
|
buttons.appendChild(cancel)
|
81
81
|
buttons.appendChild(ok)
|
82
82
|
inner.appendChild(buttons)
|
@@ -26,15 +26,15 @@ document.addEventListener('dynamic_scaffold:load', function (){
|
|
26
26
|
form.submit()
|
27
27
|
}
|
28
28
|
|
29
|
-
const buttons = document.querySelectorAll('.
|
29
|
+
const buttons = document.querySelectorAll('.js-ds-destory')
|
30
30
|
if(buttons.length === 0) return
|
31
31
|
|
32
|
-
const wrapper = buttons[0].closest('.
|
32
|
+
const wrapper = buttons[0].closest('.js-ds-item-wrapper')
|
33
33
|
Array.prototype.forEach.call(buttons, function(button){
|
34
|
-
const row = button.closest('.
|
34
|
+
const row = button.closest('.js-ds-list-row')
|
35
35
|
button.addEventListener('click', function(e){
|
36
36
|
e.preventDefault()
|
37
|
-
row.classList.add('
|
37
|
+
row.classList.add('ds-destorying')
|
38
38
|
DynamicScaffold.confirm({
|
39
39
|
message: button.getAttribute('data-confirm-message'),
|
40
40
|
ok: {
|
@@ -48,7 +48,7 @@ document.addEventListener('dynamic_scaffold:load', function (){
|
|
48
48
|
text: wrapper.getAttribute('data-confirm-cancel'),
|
49
49
|
class: wrapper.getAttribute('data-confirm-cancel-class'),
|
50
50
|
action: function(){
|
51
|
-
row.classList.remove("
|
51
|
+
row.classList.remove("ds-destorying")
|
52
52
|
}
|
53
53
|
}
|
54
54
|
})
|
@@ -1,9 +1,9 @@
|
|
1
1
|
document.addEventListener('dynamic_scaffold:load', function (){
|
2
|
-
const inputs = document.querySelectorAll('.
|
2
|
+
const inputs = document.querySelectorAll('.js-ds-image')
|
3
3
|
Array.prototype.forEach.call(inputs, function(input){
|
4
4
|
// initialize
|
5
|
-
const wrapper = input.closest('.
|
6
|
-
const preview = wrapper.querySelector('.
|
5
|
+
const wrapper = input.closest('.js-ds-image-wrapper')
|
6
|
+
const preview = wrapper.querySelector('.js-ds-image-preview')
|
7
7
|
const img = preview.querySelector('img')
|
8
8
|
|
9
9
|
// init preview display
|
@@ -15,11 +15,11 @@ document.addEventListener('dynamic_scaffold:load', function (){
|
|
15
15
|
}
|
16
16
|
|
17
17
|
// delete event
|
18
|
-
const button = preview.querySelector('.
|
18
|
+
const button = preview.querySelector('.js-ds-image-remove')
|
19
19
|
let flag
|
20
20
|
if(button)
|
21
21
|
{
|
22
|
-
flag = wrapper.querySelector('.
|
22
|
+
flag = wrapper.querySelector('.js-ds-image-remove-flag')
|
23
23
|
button.addEventListener('click', function(e){
|
24
24
|
preview.style.display = 'none'
|
25
25
|
flag.disabled = false
|
@@ -2,7 +2,7 @@ document.addEventListener('dynamic_scaffold:load', function(){
|
|
2
2
|
function handlePagination(pagination){
|
3
3
|
const itemCount = pagination.children.lenth
|
4
4
|
const items = Array.prototype.filter.call(pagination.children, function(li){
|
5
|
-
return li.classList.contains('
|
5
|
+
return li.classList.contains('js-ds-page-item')
|
6
6
|
})
|
7
7
|
|
8
8
|
const currentIndex = items.findIndex(function(li){
|
@@ -20,7 +20,7 @@ document.addEventListener('dynamic_scaffold:load', function(){
|
|
20
20
|
})
|
21
21
|
}
|
22
22
|
|
23
|
-
Array.prototype.forEach.call(document.querySelectorAll('.
|
23
|
+
Array.prototype.forEach.call(document.querySelectorAll('.js-ds-pagination'), function(pagination){
|
24
24
|
handlePagination(pagination)
|
25
25
|
})
|
26
26
|
})
|
@@ -41,7 +41,7 @@ document.addEventListener('dynamic_scaffold:load', function(){
|
|
41
41
|
// Ignore while animating
|
42
42
|
if(promises.length) return
|
43
43
|
|
44
|
-
const source = button.closest('.
|
44
|
+
const source = button.closest('.js-ds-list-row')
|
45
45
|
source.style.position = 'relative'
|
46
46
|
source.style.zIndex = 1000
|
47
47
|
|
@@ -93,33 +93,33 @@ document.addEventListener('dynamic_scaffold:load', function(){
|
|
93
93
|
}
|
94
94
|
|
95
95
|
// Register `transitionend` event in all the rows.
|
96
|
-
Array.prototype.forEach.call(document.querySelectorAll('.
|
96
|
+
Array.prototype.forEach.call(document.querySelectorAll('.js-ds-list-row'), function(row){
|
97
97
|
row.addEventListener('transitionend', function(e){
|
98
98
|
if(e.target == row) row.dynamicScaffoldSortingResolver(row)
|
99
99
|
})
|
100
100
|
})
|
101
101
|
|
102
102
|
// Register events on each button.
|
103
|
-
addClickEvent(document.querySelectorAll('.
|
104
|
-
return document.querySelector('.
|
103
|
+
addClickEvent(document.querySelectorAll('.js-ds-sorter-top'), function(source){
|
104
|
+
return document.querySelector('.js-ds-list-row:first-child')
|
105
105
|
}, otherSideAnimationForUp, function(source, target){
|
106
106
|
source.parentNode.insertBefore(source, target)
|
107
107
|
})
|
108
108
|
|
109
|
-
addClickEvent(document.querySelectorAll('.
|
109
|
+
addClickEvent(document.querySelectorAll('.js-ds-sorter-up'), function(source){
|
110
110
|
return source.previousElementSibling
|
111
111
|
}, otherSideAnimationForUp, function(source, target){
|
112
112
|
source.parentNode.insertBefore(source, target)
|
113
113
|
})
|
114
114
|
|
115
|
-
addClickEvent(document.querySelectorAll('.
|
115
|
+
addClickEvent(document.querySelectorAll('.js-ds-sorter-down'), function(source){
|
116
116
|
return source.nextElementSibling
|
117
117
|
}, otherSideAnimationForDown, function(source, target){
|
118
118
|
source.parentNode.insertBefore(target, source)
|
119
119
|
})
|
120
120
|
|
121
|
-
addClickEvent(document.querySelectorAll('.
|
122
|
-
return document.querySelector('.
|
121
|
+
addClickEvent(document.querySelectorAll('.js-ds-sorter-bottom'), function(source){
|
122
|
+
return document.querySelector('.js-ds-list-row:last-child')
|
123
123
|
}, otherSideAnimationForDown, function(source, target){
|
124
124
|
source.parentNode.insertBefore(source, null)
|
125
125
|
})
|
@@ -1,22 +1,22 @@
|
|
1
|
-
.
|
1
|
+
.ds-row{
|
2
2
|
margin-bottom: 10px
|
3
3
|
}
|
4
4
|
|
5
|
-
.
|
5
|
+
.ds-error-message{
|
6
6
|
color: #dc3545;
|
7
7
|
|
8
8
|
}
|
9
9
|
|
10
|
-
.
|
10
|
+
.ds-error-message path{
|
11
11
|
fill: #dc3545;
|
12
12
|
}
|
13
13
|
|
14
|
-
.
|
14
|
+
.ds-destorying{
|
15
15
|
background-color: #fdd8df !important;
|
16
16
|
opacity: 0.6;
|
17
17
|
}
|
18
18
|
|
19
|
-
.
|
19
|
+
.ds-svg-icon{
|
20
20
|
width: 15px;
|
21
21
|
height: 15px;
|
22
22
|
vertical-align: baseline;
|
@@ -88,7 +88,7 @@
|
|
88
88
|
fill: #fff;
|
89
89
|
}
|
90
90
|
|
91
|
-
.
|
91
|
+
.ds-overlay{
|
92
92
|
position: fixed;
|
93
93
|
top: 0;
|
94
94
|
left: 0;
|
@@ -98,13 +98,13 @@
|
|
98
98
|
background-color: rgba(0,0,0,0.2);
|
99
99
|
}
|
100
100
|
|
101
|
-
.
|
101
|
+
.ds-confirm{
|
102
102
|
position: fixed;
|
103
103
|
top: 40px;
|
104
104
|
width: 100%;
|
105
105
|
}
|
106
106
|
|
107
|
-
.
|
107
|
+
.ds-confirm-inner{
|
108
108
|
background-color: #fff;
|
109
109
|
border-radius: 10px;
|
110
110
|
box-shadow: 3px 3px 3px rgba(0,0,0,0.3);
|
@@ -116,16 +116,16 @@
|
|
116
116
|
margin: 0 auto;
|
117
117
|
}
|
118
118
|
|
119
|
-
.
|
119
|
+
.ds-confirm-message{
|
120
120
|
height: 68px;
|
121
121
|
font-size: 16px;
|
122
122
|
}
|
123
123
|
|
124
|
-
.
|
124
|
+
.ds-confirm-buttons{
|
125
125
|
text-align: right;
|
126
126
|
}
|
127
127
|
|
128
|
-
.
|
128
|
+
.ds-confirm-buttons .btn{
|
129
129
|
margin-left: 10px;
|
130
130
|
}
|
131
131
|
|
@@ -1,30 +1,30 @@
|
|
1
1
|
@charset "UTF-8";
|
2
|
-
/*<ul id="access-list" class="
|
3
|
-
<li class="
|
4
|
-
<div class="
|
5
|
-
<div class="
|
6
|
-
<div class="
|
7
|
-
<div class="
|
8
|
-
<div class="
|
2
|
+
/*<ul id="access-list" class="ds-list ds-list-striped">
|
3
|
+
<li class="ds-list-row">
|
4
|
+
<div class="ds-list-heading">Some Title</div>
|
5
|
+
<div class="ds-list-items">
|
6
|
+
<div class="ds-list-item ds-list-item-xs">
|
7
|
+
<div class="ds-list-label">ID</div>
|
8
|
+
<div class="ds-list-value">1</div>
|
9
9
|
</div>
|
10
|
-
<div class="
|
11
|
-
<div class="
|
12
|
-
<div class="
|
10
|
+
<div class="ds-list-item ds-list-item-md">
|
11
|
+
<div class="ds-list-label">Name</div>
|
12
|
+
<div class="ds-list-value">Micheal Jackson</div>
|
13
13
|
</div>
|
14
|
-
<div class="
|
15
|
-
<div class="
|
16
|
-
<div class="
|
14
|
+
<div class="ds-list-item ds-list-item-md">
|
15
|
+
<div class="ds-list-label">Born</div>
|
16
|
+
<div class="ds-list-value">1958/8/29</div>
|
17
17
|
</div>
|
18
|
-
<div class="
|
19
|
-
<div class="
|
20
|
-
<div class="
|
18
|
+
<div class="ds-list-item ds-list-item-md">
|
19
|
+
<div class="ds-list-label">Died</div>
|
20
|
+
<div class="ds-list-value">2009/6/25</div>
|
21
21
|
</div>
|
22
|
-
<div class="
|
23
|
-
<div class="
|
24
|
-
<div class="
|
22
|
+
<div class="ds-list-item ds-list-item-md">
|
23
|
+
<div class="ds-list-label">Occupations</div>
|
24
|
+
<div class="ds-list-value">Musician, singer-songwriter, arranger, dancer, entertainer, choreographer, actor, businessman, philanthropist</div>
|
25
25
|
</div>
|
26
|
-
<div class="
|
27
|
-
<div class="
|
26
|
+
<div class="ds-list-item pull-right">
|
27
|
+
<div class="ds-list-value">
|
28
28
|
<div class="btn-group">
|
29
29
|
<a href="#" class="btn btn-primary">編集</a>
|
30
30
|
</div>
|
@@ -38,18 +38,18 @@
|
|
38
38
|
</div>
|
39
39
|
</div>
|
40
40
|
</div>
|
41
|
-
<div class="
|
41
|
+
<div class="ds-list-footer">Some Footer</div>
|
42
42
|
</li>
|
43
43
|
</ul>*/
|
44
|
-
.
|
44
|
+
.ds-list-items:before, .ds-list-item:before, .ds-list-row:before, .ds-list-items:after, .ds-list-item:after, .ds-list-row:after {
|
45
45
|
content: " ";
|
46
46
|
display: table;
|
47
47
|
}
|
48
|
-
.
|
48
|
+
.ds-list-items:after, .ds-list-item:after, .ds-list-row:after {
|
49
49
|
clear: both;
|
50
50
|
}
|
51
51
|
|
52
|
-
.
|
52
|
+
.ds-list {
|
53
53
|
list-style: none;
|
54
54
|
padding: 0;
|
55
55
|
border-collapse: separate;
|
@@ -57,11 +57,11 @@
|
|
57
57
|
flex-wrap: wrap;
|
58
58
|
}
|
59
59
|
|
60
|
-
.
|
60
|
+
.ds-list-striped .ds-list-row:nth-child(odd) {
|
61
61
|
background-color: #f9f9f9;
|
62
62
|
}
|
63
63
|
|
64
|
-
.
|
64
|
+
.ds-list-heading {
|
65
65
|
font-weight: bold;
|
66
66
|
padding: 8px 20px;
|
67
67
|
overflow: hidden;
|
@@ -70,11 +70,11 @@
|
|
70
70
|
max-width: 100%;
|
71
71
|
}
|
72
72
|
|
73
|
-
.
|
73
|
+
.ds-list-footer {
|
74
74
|
padding: 8px 20px;
|
75
75
|
}
|
76
76
|
|
77
|
-
.
|
77
|
+
.ds-list-label {
|
78
78
|
overflow: hidden;
|
79
79
|
white-space: nowrap;
|
80
80
|
font-size: 11px;
|
@@ -85,11 +85,11 @@
|
|
85
85
|
line-height: 15px;
|
86
86
|
}
|
87
87
|
|
88
|
-
.
|
88
|
+
.ds-list-label-hidden {
|
89
89
|
background-color: transparent;
|
90
90
|
}
|
91
91
|
|
92
|
-
.
|
92
|
+
.ds-list-value {
|
93
93
|
overflow: hidden;
|
94
94
|
white-space: nowrap;
|
95
95
|
font-size: 14px;
|
@@ -99,12 +99,12 @@
|
|
99
99
|
vertical-align: middle;
|
100
100
|
}
|
101
101
|
|
102
|
-
.
|
102
|
+
.ds-list-label + .ds-list-value {
|
103
103
|
height: 22px;
|
104
104
|
line-height: 22px;
|
105
105
|
}
|
106
106
|
|
107
|
-
.
|
107
|
+
.ds-list-item {
|
108
108
|
float: left;
|
109
109
|
max-width: 100%;
|
110
110
|
margin: 8px 0;
|
@@ -112,47 +112,47 @@
|
|
112
112
|
overflow: hidden;
|
113
113
|
}
|
114
114
|
|
115
|
-
.
|
115
|
+
.ds-list-row {
|
116
116
|
background-color: #fff;
|
117
117
|
border-top: 1px solid #dddddd;
|
118
118
|
padding: 0;
|
119
119
|
width: 100%;
|
120
120
|
}
|
121
121
|
|
122
|
-
.
|
122
|
+
.ds-list-item-xs {
|
123
123
|
width: 60px;
|
124
124
|
}
|
125
125
|
|
126
|
-
.
|
126
|
+
.ds-list-item-sm {
|
127
127
|
width: 120px;
|
128
128
|
}
|
129
129
|
|
130
|
-
.
|
130
|
+
.ds-list-item-md {
|
131
131
|
width: 180px;
|
132
132
|
}
|
133
133
|
|
134
|
-
.
|
134
|
+
.ds-list-item-lg {
|
135
135
|
width: 240px;
|
136
136
|
}
|
137
137
|
|
138
138
|
@media (max-width: 768px) {
|
139
|
-
.
|
139
|
+
.ds-list-heading {
|
140
140
|
padding: 8px 12px;
|
141
141
|
}
|
142
142
|
|
143
|
-
.
|
143
|
+
.ds-list-footer {
|
144
144
|
padding: 8px 12px;
|
145
145
|
}
|
146
146
|
|
147
|
-
.
|
147
|
+
.ds-list-item {
|
148
148
|
margin: 4px 0;
|
149
149
|
}
|
150
150
|
|
151
|
-
.
|
151
|
+
.ds-list-label {
|
152
152
|
padding: 0 12px;
|
153
153
|
}
|
154
154
|
|
155
|
-
.
|
155
|
+
.ds-list-value {
|
156
156
|
padding: 0 12px;
|
157
157
|
}
|
158
158
|
}
|
@@ -29,11 +29,11 @@
|
|
29
29
|
<%end%>
|
30
30
|
<% elsif elem.type? :carrierwave_image %>
|
31
31
|
<%- image = form.object.public_send(elem.name) -%>
|
32
|
-
<div class="
|
33
|
-
<div class="
|
32
|
+
<div class="js-ds-image-wrapper">
|
33
|
+
<div class="js-ds-image-preview panel panel-default card mb-1">
|
34
34
|
<% if elem.options[:removable] %>
|
35
35
|
<div class="text-right panel-heading card-header">
|
36
|
-
<button type="button" class="btn btn-outline-danger btn-danger btn-sm
|
36
|
+
<button type="button" class="btn btn-outline-danger btn-danger btn-sm js-ds-image-remove">
|
37
37
|
<%= dynamic_scaffold_icon :times %>
|
38
38
|
</button>
|
39
39
|
</div>
|
@@ -44,8 +44,8 @@
|
|
44
44
|
</div>
|
45
45
|
</div>
|
46
46
|
</div>
|
47
|
-
<%= form.hidden_field "remove_#{elem.name}", value: "1", disabled:"disabled", class: '
|
48
|
-
<%= elem.render(self, form, 'form-control-file
|
47
|
+
<%= form.hidden_field "remove_#{elem.name}", value: "1", disabled:"disabled", class: 'js-ds-image-remove-flag' if elem.options[:removable]%>
|
48
|
+
<%= elem.render(self, form, 'form-control-file js-ds-image') do |attr|%>
|
49
49
|
<%= form.file_field(elem.name, attr) %>
|
50
50
|
<%end%>
|
51
51
|
<%= form.hidden_field "#{elem.name}_cache" %>
|
@@ -58,7 +58,7 @@
|
|
58
58
|
<%-end-%>
|
59
59
|
</div>
|
60
60
|
<%- if errors.present? -%>
|
61
|
-
<ul class="list-unstyled
|
61
|
+
<ul class="list-unstyled ds-error-message">
|
62
62
|
<% errors.each do |err|%>
|
63
63
|
<li><%= dynamic_scaffold_icon :error %> <%= err %></li>
|
64
64
|
<%end%>
|
@@ -5,43 +5,48 @@
|
|
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
|
-
<div class="
|
9
|
-
<%= link_to dynamic_scaffold_path(:new, request_queries), class: 'btn btn-outline-primary btn-primary btn-sm' do%>
|
8
|
+
<div class="ds-row">
|
9
|
+
<%= 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%>
|
10
10
|
<%= dynamic_scaffold_icon(:add) %> <%= t('dynamic_scaffold.button.add') %>
|
11
|
+
<%- unless dynamic_scaffold.max_count.nil? -%>
|
12
|
+
<span class="badge badge-light">
|
13
|
+
<%= @count %> / <%= dynamic_scaffold.max_count%>
|
14
|
+
</span>
|
15
|
+
<% end %>
|
11
16
|
<%end%>
|
12
17
|
</div>
|
13
18
|
<%= render 'dynamic_scaffold/bootstrap/pagination' %>
|
14
|
-
<div class="
|
19
|
+
<div class="ds-row">
|
15
20
|
<%= render 'dynamic_scaffold/bootstrap/save_order'%>
|
16
21
|
</div>
|
17
|
-
<div class="
|
22
|
+
<div class="ds-row">
|
18
23
|
<% if @records.empty? %>
|
19
24
|
<p class="lead"><%= t('dynamic_scaffold.message.no_records', model: dynamic_scaffold.title.name) %></p>
|
20
25
|
<% else %>
|
21
26
|
<ul
|
22
|
-
class="
|
27
|
+
class="ds-list ds-list-striped js-ds-item-wrapper"
|
23
28
|
data-confirm-ok="<%= t('dynamic_scaffold.message.confirm_ok') %>"
|
24
29
|
data-confirm-ok-class="btn btn-danger btn-sm"
|
25
30
|
data-confirm-cancel="<%= t('dynamic_scaffold.message.confirm_cancel') %>"
|
26
31
|
data-confirm-cancel-class="btn btn-outline-secondary btn-default btn-sm"
|
27
32
|
>
|
28
33
|
<%@records.each do |record|%>
|
29
|
-
<li class="
|
34
|
+
<li class="ds-list-row js-ds-list-row">
|
30
35
|
<% if dynamic_scaffold.list.title? %>
|
31
|
-
<div class="
|
36
|
+
<div class="ds-list-heading"><%= dynamic_scaffold.list.title(record) %></div>
|
32
37
|
<% end %>
|
33
|
-
<div class="
|
38
|
+
<div class="ds-list-items">
|
34
39
|
<%dynamic_scaffold.list.items.each do |disp|%>
|
35
|
-
<%= content_tag :div, class: class_names('
|
36
|
-
<div class="
|
37
|
-
<div class="
|
40
|
+
<%= content_tag :div, class: class_names('ds-list-item', disp.classnames), **disp.html_attributes do%>
|
41
|
+
<div class="ds-list-label"><%= disp.label %></div>
|
42
|
+
<div class="ds-list-value"><%= disp.value self, record %></div>
|
38
43
|
<%end%>
|
39
44
|
<%end%>
|
40
45
|
</div>
|
41
|
-
<div class="
|
46
|
+
<div class="ds-list-footer clearfix">
|
42
47
|
<div class="float-right pull-right">
|
43
48
|
<div class="btn-group">
|
44
|
-
<%= link_to dynamic_scaffold_path(:edit, request_queries.merge(id: record[record.class.primary_key])), class: 'btn btn-primary btn-outline-primary btn-sm edit' do %>
|
49
|
+
<%= 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 %>
|
45
50
|
<%= dynamic_scaffold_icon(:edit) %> <%= t('dynamic_scaffold.button.edit') %>
|
46
51
|
<%end%>
|
47
52
|
</div>
|
@@ -50,16 +55,16 @@
|
|
50
55
|
<input type="hidden" name="pkeys[][<%=pkey%>]" value="<%= record[pkey] %>">
|
51
56
|
<%end%>
|
52
57
|
<div class="btn-group">
|
53
|
-
<button class="btn btn-outline-secondary btn-default btn-sm
|
58
|
+
<button class="btn btn-outline-secondary btn-default btn-sm js-ds-sorter-top">
|
54
59
|
<%= dynamic_scaffold_icon(:top) %>
|
55
60
|
</button>
|
56
|
-
<button class="btn btn-outline-secondary btn-default btn-sm
|
61
|
+
<button class="btn btn-outline-secondary btn-default btn-sm js-ds-sorter-up">
|
57
62
|
<%= dynamic_scaffold_icon(:up) %>
|
58
63
|
</button>
|
59
|
-
<button class="btn btn-outline-secondary btn-default btn-sm
|
64
|
+
<button class="btn btn-outline-secondary btn-default btn-sm js-ds-sorter-down">
|
60
65
|
<%= dynamic_scaffold_icon(:down) %>
|
61
66
|
</button>
|
62
|
-
<button class="btn btn-outline-secondary btn-default btn-sm
|
67
|
+
<button class="btn btn-outline-secondary btn-default btn-sm js-ds-sorter-bottom">
|
63
68
|
<%= dynamic_scaffold_icon(:bottom) %>
|
64
69
|
</button>
|
65
70
|
</div>
|
@@ -68,7 +73,7 @@
|
|
68
73
|
<button
|
69
74
|
data-action="<%= dynamic_scaffold_path(:update, request_queries(dynamic_scaffold.list.page_param_name).merge(id: record[record.class.primary_key])) %>"
|
70
75
|
data-confirm-message="<%= t('dynamic_scaffold.message.destroy_confirm') %>"
|
71
|
-
class="btn btn-danger btn-sm
|
76
|
+
class="btn btn-danger btn-sm js-ds-destory"
|
72
77
|
>
|
73
78
|
<%= dynamic_scaffold_icon(:delete) %>
|
74
79
|
</button>
|
@@ -80,7 +85,7 @@
|
|
80
85
|
</ul>
|
81
86
|
<% end %>
|
82
87
|
</div>
|
83
|
-
<div class="
|
88
|
+
<div class="ds-row">
|
84
89
|
<%= render 'dynamic_scaffold/bootstrap/save_order'%>
|
85
90
|
</div>
|
86
91
|
<%= render 'dynamic_scaffold/bootstrap/pagination' %>
|
@@ -1,9 +1,9 @@
|
|
1
1
|
<% if page.current? %>
|
2
|
-
<li class="<%= class_names 'page-item current
|
2
|
+
<li class="<%= class_names 'page-item current js-ds-page-item', {'active': dynamic_scaffold.list.pagination.highlight_current} %>">
|
3
3
|
<%= content_tag :a, dynamic_scaffold.list.pagination.page_number(page, @records), remote: remote, rel: (page.next? ? 'next' : (page.prev? ? 'prev' : nil)), class: 'page-link' %>
|
4
4
|
</li>
|
5
5
|
<% else %>
|
6
|
-
<li class="<%= class_names('page-item
|
6
|
+
<li class="<%= class_names('page-item js-ds-page-item', dynamic_scaffold.list.pagination.page_class(page, @records)) %>">
|
7
7
|
<%= link_to page, url, remote: remote, rel: (page.next? ? 'next' : (page.prev? ? 'prev' : nil)), class: 'page-link' %>
|
8
8
|
</li>
|
9
9
|
<% end %>
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<%= paginator.render do %>
|
2
2
|
<nav class="text-center text-xs-center">
|
3
|
-
<ul class="pagination justify-content-center
|
3
|
+
<ul class="pagination justify-content-center js-ds-pagination">
|
4
4
|
<%= first_page_tag if dynamic_scaffold.list.pagination.end_buttons %>
|
5
5
|
<%= prev_page_tag if dynamic_scaffold.list.pagination.neighbor_buttons %>
|
6
6
|
<% each_page do |page| %>
|
@@ -119,7 +119,7 @@ module DynamicScaffold
|
|
119
119
|
end
|
120
120
|
|
121
121
|
class Config
|
122
|
-
attr_reader :model, :form, :list, :title, :controller
|
122
|
+
attr_reader :model, :form, :list, :title, :controller, :lock_before_count, :max_count_options
|
123
123
|
def initialize(model, controller)
|
124
124
|
@model = model
|
125
125
|
@controller = controller
|
@@ -127,6 +127,7 @@ module DynamicScaffold
|
|
127
127
|
@list = ListBuilder.new(self)
|
128
128
|
@title = Title.new(self)
|
129
129
|
@vars = Vars.new(self)
|
130
|
+
@max_count_options = {}
|
130
131
|
end
|
131
132
|
|
132
133
|
def vars(name = nil, &block)
|
@@ -138,10 +139,22 @@ module DynamicScaffold
|
|
138
139
|
end
|
139
140
|
end
|
140
141
|
|
141
|
-
def scope(
|
142
|
-
@scope =
|
142
|
+
def scope(scopes = nil)
|
143
|
+
@scope = scopes unless scopes.nil?
|
143
144
|
@scope
|
144
145
|
end
|
146
|
+
|
147
|
+
def max_count(count = nil, options = nil, &block)
|
148
|
+
@max_count = count unless count.nil?
|
149
|
+
@max_count_options = options unless options.nil?
|
150
|
+
@lock_before_count = block if block_given?
|
151
|
+
@max_count
|
152
|
+
end
|
153
|
+
|
154
|
+
def max_count?(count)
|
155
|
+
return false if max_count.nil?
|
156
|
+
count >= max_count
|
157
|
+
end
|
145
158
|
end
|
146
159
|
|
147
160
|
class ListBuilder
|
@@ -151,6 +164,7 @@ module DynamicScaffold
|
|
151
164
|
@sorter = nil
|
152
165
|
@order = []
|
153
166
|
@title = nil
|
167
|
+
@filter = nil
|
154
168
|
end
|
155
169
|
|
156
170
|
def pagination(options = nil)
|
@@ -212,6 +226,25 @@ module DynamicScaffold
|
|
212
226
|
def title?
|
213
227
|
@title.present?
|
214
228
|
end
|
229
|
+
|
230
|
+
def build_sql(scope_params)
|
231
|
+
sql = @config.model.all
|
232
|
+
sql = sql.where scope_params
|
233
|
+
ret = @config.controller.instance_exec(sql, &@filter) unless @filter.nil?
|
234
|
+
sql = ret unless ret.nil?
|
235
|
+
unless sql.is_a? ::ActiveRecord::Relation
|
236
|
+
raise(
|
237
|
+
Error::InvalidOperation,
|
238
|
+
'You must return ActiveRecord::Relation from filter block'
|
239
|
+
)
|
240
|
+
end
|
241
|
+
sql
|
242
|
+
end
|
243
|
+
|
244
|
+
def filter(&block)
|
245
|
+
@filter = block if block_given?
|
246
|
+
@filter
|
247
|
+
end
|
215
248
|
end
|
216
249
|
|
217
250
|
class FormBuilder
|
@@ -251,7 +284,9 @@ module DynamicScaffold
|
|
251
284
|
:password_field,
|
252
285
|
:hidden_field,
|
253
286
|
:file_field,
|
254
|
-
:color_field
|
287
|
+
:color_field,
|
288
|
+
:number_field,
|
289
|
+
:telephone_field then
|
255
290
|
item = Form::Item::SingleOption.new(@config, type, *args)
|
256
291
|
when
|
257
292
|
:time_select,
|
@@ -24,25 +24,30 @@ module DynamicScaffold
|
|
24
24
|
# Actions
|
25
25
|
|
26
26
|
def index # rubocop:disable Metrics/AbcSize
|
27
|
-
@records = dynamic_scaffold.
|
28
|
-
|
29
|
-
|
30
|
-
if dynamic_scaffold.list.pagination
|
31
|
-
@records = @records
|
32
|
-
.page(params[dynamic_scaffold.list.pagination.param_name])
|
33
|
-
.per(dynamic_scaffold.list.pagination.per_page)
|
34
|
-
end
|
35
|
-
|
36
|
-
@records = @records.where scope_params
|
27
|
+
@records = dynamic_scaffold.list.build_sql(scope_params)
|
28
|
+
@count = @records.count unless dynamic_scaffold.max_count.nil?
|
29
|
+
@records = handle_pagination(@records)
|
37
30
|
@records = @records.order dynamic_scaffold.list.sorter if dynamic_scaffold.list.sorter
|
38
31
|
@records = @records.order(*dynamic_scaffold.list.order) unless dynamic_scaffold.list.order.empty?
|
39
32
|
|
40
|
-
|
41
|
-
|
33
|
+
ret = yield(@records) if block_given?
|
34
|
+
@records = ret unless ret.nil?
|
35
|
+
unless @records.is_a? ::ActiveRecord::Relation
|
36
|
+
raise(
|
37
|
+
Error::InvalidOperation,
|
38
|
+
'You must return ActiveRecord::Relation from super block'
|
39
|
+
)
|
40
|
+
end
|
41
|
+
|
42
42
|
@records
|
43
43
|
end
|
44
44
|
|
45
|
-
def new
|
45
|
+
def new # rubocop:disable Metrics/AbcSize
|
46
|
+
unless dynamic_scaffold.max_count.nil?
|
47
|
+
count = dynamic_scaffold.list.build_sql(scope_params).count
|
48
|
+
raise Error::InvalidOperation, 'You can not add any more.' if dynamic_scaffold.max_count?(count)
|
49
|
+
end
|
50
|
+
|
46
51
|
@record = dynamic_scaffold.model.new
|
47
52
|
|
48
53
|
defaults = dynamic_scaffold.form.items.each_with_object({}) do |item, memo|
|
@@ -61,6 +66,7 @@ module DynamicScaffold
|
|
61
66
|
@record.attributes = update_values
|
62
67
|
bind_sorter_value(@record) if dynamic_scaffold.list.sorter
|
63
68
|
dynamic_scaffold.model.transaction do
|
69
|
+
check_max_count!
|
64
70
|
yield(@record) if block_given?
|
65
71
|
if @record.save
|
66
72
|
redirect_to dynamic_scaffold_path(:index, request_queries)
|
@@ -94,7 +100,7 @@ module DynamicScaffold
|
|
94
100
|
end
|
95
101
|
rescue ::ActiveRecord::InvalidForeignKey => _error
|
96
102
|
flash[:dynamic_scaffold_danger] = I18n.t('dynamic_scaffold.alert.destroy.invalid_foreign_key')
|
97
|
-
rescue => error
|
103
|
+
rescue StandardError => error
|
98
104
|
flash[:dynamic_scaffold_danger] = I18n.t('dynamic_scaffold.alert.destroy.failed')
|
99
105
|
logger.error(error)
|
100
106
|
end
|
@@ -5,7 +5,18 @@ module DynamicScaffold
|
|
5
5
|
# Get the hash of the key and value specified for the scope.
|
6
6
|
def scope_params
|
7
7
|
return {} if dynamic_scaffold.scope.nil?
|
8
|
-
dynamic_scaffold.scope
|
8
|
+
case dynamic_scaffold.scope
|
9
|
+
when Array then
|
10
|
+
dynamic_scaffold.scope.each_with_object({}) do |val, res|
|
11
|
+
if val.is_a? Hash
|
12
|
+
val.each {|k, v| res[k] = v }
|
13
|
+
else
|
14
|
+
res[val] = params[val]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
when Hash then
|
18
|
+
dynamic_scaffold.scope
|
19
|
+
end
|
9
20
|
end
|
10
21
|
|
11
22
|
# Convert pkey_string value to hash.
|
@@ -112,7 +123,23 @@ module DynamicScaffold
|
|
112
123
|
end
|
113
124
|
|
114
125
|
def request_queries(*except)
|
115
|
-
request.query_parameters.to_hash.delete_if{|k,
|
126
|
+
request.query_parameters.to_hash.delete_if {|k, _v| except.select(&:present?).include?(k.to_sym) }
|
127
|
+
end
|
128
|
+
|
129
|
+
def check_max_count!
|
130
|
+
return if dynamic_scaffold.max_count.nil?
|
131
|
+
instance_exec(@record, &dynamic_scaffold.lock_before_count) if dynamic_scaffold.lock_before_count
|
132
|
+
count_query = dynamic_scaffold.list.build_sql(scope_params)
|
133
|
+
count_query = count_query.lock if dynamic_scaffold.max_count_options[:lock]
|
134
|
+
count = count_query.count
|
135
|
+
raise Error::InvalidOperation, 'You can not add any more.' if dynamic_scaffold.max_count?(count)
|
136
|
+
end
|
137
|
+
|
138
|
+
def handle_pagination(query)
|
139
|
+
return query unless dynamic_scaffold.list.pagination
|
140
|
+
query
|
141
|
+
.page(params[dynamic_scaffold.list.pagination.param_name])
|
142
|
+
.per(dynamic_scaffold.list.pagination.per_page)
|
116
143
|
end
|
117
144
|
end
|
118
145
|
end
|
@@ -13,10 +13,7 @@ module DynamicScaffold
|
|
13
13
|
@classnames_list.push(classnames) if classnames
|
14
14
|
@notes = []
|
15
15
|
@multiple = type == :collection_check_boxes || html_attributes[:multiple]
|
16
|
-
@inserts = {
|
17
|
-
before: [],
|
18
|
-
after: []
|
19
|
-
}
|
16
|
+
@inserts = { before: [], after: [] }
|
20
17
|
end
|
21
18
|
|
22
19
|
def notes?
|
@@ -106,7 +103,7 @@ module DynamicScaffold
|
|
106
103
|
|
107
104
|
def errors(record)
|
108
105
|
msg = record.errors.full_messages_for(proxy_field.name)
|
109
|
-
rel = @config.model.reflect_on_all_associations.find{|r| r.foreign_key.to_s == name.to_s}
|
106
|
+
rel = @config.model.reflect_on_all_associations.find {|r| r.foreign_key.to_s == name.to_s }
|
110
107
|
msg.concat(record.errors.full_messages_for(rel.name)) if rel.present?
|
111
108
|
msg
|
112
109
|
end
|
@@ -4,7 +4,7 @@ module DynamicScaffold
|
|
4
4
|
Rails.cache.fetch "dynamic_scaffold/fontawesome/icons/#{path}" do
|
5
5
|
full_path = DynamicScaffold::Engine.root.join('app', 'assets', 'images', 'dynamic_scaffold', 'fontawesome', path)
|
6
6
|
file = File.open(full_path)
|
7
|
-
file.read.gsub!('<svg ', '<svg class="
|
7
|
+
file.read.gsub!('<svg ', '<svg class="ds-svg-icon" ').html_safe # rubocop:disable Rails/OutputSafety
|
8
8
|
end
|
9
9
|
end
|
10
10
|
end
|
data/lib/dynamic_scaffold.rb
CHANGED
@@ -16,6 +16,14 @@ class <%= @class_scope.present? ? "#{@class_scope}::" : '' %><%= @plural_model_n
|
|
16
16
|
# Please see https://github.com/gomo/dynamic_scaffold#view-helper for details.
|
17
17
|
# config.title.name = 'Model'
|
18
18
|
|
19
|
+
# To enable scoping, call scope with parameter names you want.
|
20
|
+
# Please see https://github.com/gomo/dynamic_scaffold#scoping for details.
|
21
|
+
# config.scope([role])
|
22
|
+
|
23
|
+
# You can specify the maximum count of registrations.
|
24
|
+
# Please see https://github.com/gomo/dynamic_scaffold#limit-count for details.
|
25
|
+
# config.max_count 10
|
26
|
+
|
19
27
|
# When you want a simple sort on the column of record, please call order.
|
20
28
|
# config.list.order created_at: :desc
|
21
29
|
|
@@ -37,14 +45,12 @@ class <%= @class_scope.present? ? "#{@class_scope}::" : '' %><%= @plural_model_n
|
|
37
45
|
# highlight_current: false, # Whether to highlight the current page.
|
38
46
|
# )
|
39
47
|
|
40
|
-
#
|
41
|
-
#
|
42
|
-
#
|
43
|
-
|
44
|
-
# You can change the items displayed in the list through the `config.list.item`.
|
45
|
-
# Please see https://github.com/gomo/dynamic_scaffold#customize-list for details.
|
48
|
+
# If you want filtering that can not be handled by `config.scope`, you can use the filter method.
|
49
|
+
# config.list.filter do |query|
|
50
|
+
# query.where(parent_id: nil)
|
51
|
+
# end
|
46
52
|
|
47
|
-
# You can set each title in the list through title method.
|
53
|
+
# You can set each title in the list header through title method.
|
48
54
|
# Pass the attribute name,
|
49
55
|
# config.list.title(:name)
|
50
56
|
# or
|
@@ -52,6 +58,9 @@ class <%= @class_scope.present? ? "#{@class_scope}::" : '' %><%= @plural_model_n
|
|
52
58
|
# record.name
|
53
59
|
# end
|
54
60
|
|
61
|
+
# You can change the items displayed in the list through the `config.list.item`.
|
62
|
+
# Please see https://github.com/gomo/dynamic_scaffold#customize-list for details.
|
63
|
+
|
55
64
|
<%- @model.column_names.each do |column| -%>
|
56
65
|
config.list.item(:<%= column %>, style: 'width: 120px;')
|
57
66
|
<%- end -%>
|
@@ -65,8 +74,9 @@ class <%= @class_scope.present? ? "#{@class_scope}::" : '' %><%= @plural_model_n
|
|
65
74
|
|
66
75
|
# def index
|
67
76
|
# super do |query|
|
68
|
-
# # If you want
|
69
|
-
# #
|
77
|
+
# # If you want to add a search to the page, please add it to the query here.
|
78
|
+
# # The condition added here does not affect max_count.
|
79
|
+
# # Please note that returning nil will be ignored.
|
70
80
|
# end
|
71
81
|
# end
|
72
82
|
|
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: 0.
|
4
|
+
version: 0.7.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: 2018-06-
|
11
|
+
date: 2018-06-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: classnames-rails-view
|
@@ -295,7 +295,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
295
295
|
version: '0'
|
296
296
|
requirements: []
|
297
297
|
rubyforge_project:
|
298
|
-
rubygems_version: 2.7.
|
298
|
+
rubygems_version: 2.7.7
|
299
299
|
signing_key:
|
300
300
|
specification_version: 4
|
301
301
|
summary: The Scaffold system which dynamically generates CRUD and sort functions.
|