rows_controller 3.0.5 → 3.1.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/MIT-LICENSE +1 -1
- data/README.md +54 -51
- data/app/controllers/rows_controller.rb +51 -49
- data/app/controllers/{rows_ext_controller.rb → rows_ext_controller.rb.bak} +4 -5
- data/app/views/rows/_list.slim +1 -1
- data/app/views/rows/_list_footer.slim +1 -1
- data/app/views/rows/_list_footer.slim.bak +5 -0
- data/app/views/rows/_row_buttons.slim +7 -5
- data/app/views/rows/_submit.slim +1 -1
- data/app/views/rows/_submit.slim.bak +20 -0
- data/app/views/rows/destroy.turbo_stream.erb +1 -0
- data/app/views/rows/edit.slim +3 -5
- data/app/views/rows/edit.slim.bak +18 -0
- data/app/views/rows/index.slim +2 -1
- data/app/views/rows/index.slim.bak +11 -0
- data/app/views/rows/new.slim +3 -4
- data/app/views/rows/new.slim.bak +16 -0
- data/app/views/rows/show.slim +6 -6
- data/app/views/rows/show.slim.bak +19 -0
- data/app/views/shared/_show_flash.slim +9 -4
- data/lib/rows/locales/de.yml +10 -15
- data/lib/rows/locales/de.yml.bak +21 -0
- data/lib/rows/locales/en.yml +9 -13
- data/lib/rows/locales/en.yml.bak +21 -0
- data/lib/rows/model.rb +2 -2
- data/lib/rows/resources.rb +17 -55
- data/lib/rows/version.rb +10 -11
- data/lib/rows/version.rb.bak +10 -11
- metadata +15 -7
- data/app/views/rows/destroy.js.erb +0 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 840152ce4423af0a90562cc0594b9a5f05d8b39767f42dad0cfa9944da884868
|
|
4
|
+
data.tar.gz: 65146a898776b18679c0523451a8d1e0bad90f7217d8ec812323d2f314fbe8ca
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f89d5202e843191e42e619dca4541eb45b8cbda77cb14a3e554df4d58e7c399c96abcf4ad68df0fd714d97ba5829a463fbc9bd1518353c5f069ac1dcbcc05053
|
|
7
|
+
data.tar.gz: 856c0c3afa6f6dc00285e08ebac7eff104f9076ce974737b025134f36f90917790d36971821687701dba1dc6c2ef2ab3b40ed49386bc8cf337d70e27514bc7cb
|
data/MIT-LICENSE
CHANGED
data/README.md
CHANGED
|
@@ -1,27 +1,30 @@
|
|
|
1
|
-
RowsController
|
|
2
|
-
==============
|
|
1
|
+
# RowsController
|
|
3
2
|
[](https://badge.fury.io/rb/rows_controller)
|
|
4
3
|
|
|
5
4
|
DRYs Rails controllers. Imagine replacing that @order by 'resource' in the
|
|
6
5
|
controllers/views and, imho, an area for DRYing appears.
|
|
7
6
|
Instead of:
|
|
8
7
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
8
|
+
~~~ruby
|
|
9
|
+
class OrdersController < ApplicationController
|
|
10
|
+
.....
|
|
11
|
+
private
|
|
12
|
+
def order_params
|
|
13
|
+
params.require(:order).permit(:name)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
~~~
|
|
16
17
|
|
|
17
18
|
use:
|
|
18
19
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
~~~ruby
|
|
21
|
+
class OrdersController < RowsController # < ApplicationController
|
|
22
|
+
private
|
|
23
|
+
def resource_whitelist
|
|
24
|
+
%i{ name }
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
~~~
|
|
25
28
|
|
|
26
29
|
I.e. RowsController defines all the usual methods (index, show, edit,...).
|
|
27
30
|
|
|
@@ -31,16 +34,17 @@ The methods may be redefined in OrdersController
|
|
|
31
34
|
Low level methods like 'resources' may be redefined as well.
|
|
32
35
|
An example:
|
|
33
36
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
+
~~~ruby
|
|
38
|
+
def resources
|
|
39
|
+
@_resources ||= model_class.paginate(page: params[:page])
|
|
40
|
+
end
|
|
41
|
+
~~~
|
|
37
42
|
|
|
38
43
|
RowsController inherites from ApplicationController, i.e. all the helpers
|
|
39
44
|
defined there will be available.
|
|
40
45
|
|
|
41
46
|
|
|
42
|
-
Customizing of views
|
|
43
|
-
--------------------
|
|
47
|
+
## Customizing of views
|
|
44
48
|
|
|
45
49
|
RowsController initializes some instance variables used in the views
|
|
46
50
|
(e.g. @order, @orders; legacy @row & @rows are still supported).
|
|
@@ -56,33 +60,44 @@ Similarly, partials '\_row\_buttons' and '\_list\_footer' may be overwritten
|
|
|
56
60
|
as well.
|
|
57
61
|
|
|
58
62
|
|
|
59
|
-
model_class
|
|
60
|
-
-----------
|
|
63
|
+
## model_class
|
|
61
64
|
|
|
62
65
|
RowsController guesses the model from params[:controller]. This can
|
|
63
|
-
be changed by
|
|
66
|
+
be changed by:
|
|
64
67
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
+
~~~ruby
|
|
69
|
+
class OrdersController < RowsController
|
|
70
|
+
model_class Booking
|
|
71
|
+
...
|
|
72
|
+
~~~
|
|
68
73
|
|
|
69
74
|
The model class can be retrieved with the helper model_class.
|
|
70
75
|
|
|
71
76
|
|
|
72
|
-
Rails
|
|
73
|
-
|
|
77
|
+
## Rails 7
|
|
78
|
+
|
|
79
|
+
RowsController 3.1.0 is intended for Rails 7.
|
|
80
|
+
In particular Hotwire caused some quirks
|
|
81
|
+
which are handled by this version.
|
|
82
|
+
Compatibility with older Rails versions are not intended
|
|
83
|
+
and has not been checked.
|
|
84
|
+
|
|
85
|
+
Older Rails versions may use "gem 'rows_controller', '= 3.0.5'".
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
## Rails 6
|
|
74
89
|
|
|
75
90
|
This gem is intended for Rails 6.
|
|
76
91
|
Older Rails versions may use "gem 'rows_controller', '= 2.2.2'".
|
|
77
92
|
|
|
78
|
-
|
|
79
|
-
|
|
93
|
+
|
|
94
|
+
## Rails 5
|
|
80
95
|
|
|
81
96
|
This gem is intended for Rails 5.
|
|
82
97
|
Older Rails versions may use "gem 'rows_controller', '= 2.0.8'".
|
|
83
98
|
|
|
84
|
-
|
|
85
|
-
|
|
99
|
+
|
|
100
|
+
## Rails 4
|
|
86
101
|
|
|
87
102
|
This gem is intended for Rails 4.
|
|
88
103
|
Older Rails versions may use "gem 'rows_controller', '= 1.1.9'".
|
|
@@ -93,22 +108,8 @@ in the controllers.
|
|
|
93
108
|
Alternatively you may define the private method 'resource_params'
|
|
94
109
|
in the controller to filter params.
|
|
95
110
|
|
|
96
|
-
|
|
97
111
|
## Enhancements
|
|
98
112
|
|
|
99
|
-
### copy
|
|
100
|
-
|
|
101
|
-
The method "copy" was added to the RowsExtController.
|
|
102
|
-
"copy" is like "new", however its attributes are initialized
|
|
103
|
-
from an existing resource.
|
|
104
|
-
The "id" of the cloned resource is set to nil.
|
|
105
|
-
|
|
106
|
-
Usage of "copy" requires a defining in config/routes.rb. An example:
|
|
107
|
-
|
|
108
|
-
resources :orders
|
|
109
|
-
get 'copy', on: :member
|
|
110
|
-
end
|
|
111
|
-
|
|
112
113
|
### columns
|
|
113
114
|
|
|
114
115
|
Add a class method 'column_headers' to the model
|
|
@@ -121,10 +122,12 @@ a class method which returns the columns defined by the ActiveRecord model.
|
|
|
121
122
|
|
|
122
123
|
As usual:
|
|
123
124
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
125
|
+
~~~ruby
|
|
126
|
+
gem 'rows_controller' # in Gemfile
|
|
127
|
+
bundle
|
|
128
|
+
( cd spec/dummy; rake db:create db:migrate ) # not required for Rails 6
|
|
129
|
+
rake
|
|
130
|
+
~~~
|
|
128
131
|
|
|
129
132
|
|
|
130
133
|
## Credits
|
|
@@ -136,4 +139,4 @@ Look for:
|
|
|
136
139
|
- inherited_resources
|
|
137
140
|
- decent_exposure
|
|
138
141
|
|
|
139
|
-
Copyright (c) 2009-
|
|
142
|
+
Copyright (c) 2009-2022 [Dittmar Krall], released under the MIT license.
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require
|
|
4
|
-
require
|
|
5
|
-
require
|
|
3
|
+
require "rows/resources"
|
|
4
|
+
require "rows/model"
|
|
5
|
+
require "rows/utils"
|
|
6
6
|
|
|
7
7
|
class RowsController < ApplicationController
|
|
8
|
-
|
|
8
|
+
before_action :set_resource, only: %i[show edit update destroy]
|
|
9
|
+
|
|
10
|
+
helper_method :resource, :resources, :set_resource, :set_resources
|
|
9
11
|
helper_method :resource_columns, :resource_format
|
|
10
12
|
helper_method :model_class, :model_name
|
|
11
13
|
helper_method :model_symbol, :model_symbol_plural
|
|
@@ -15,80 +17,80 @@ class RowsController < ApplicationController
|
|
|
15
17
|
include Rows::Utils
|
|
16
18
|
|
|
17
19
|
def self.model_class(model_class = nil)
|
|
18
|
-
@_model_class
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
end
|
|
23
|
-
@_model_class
|
|
20
|
+
return @_model_class if model_class.nil?
|
|
21
|
+
|
|
22
|
+
@_model_class = model_class
|
|
23
|
+
@_model_class = model_class.constantize if model_class.is_a?(String)
|
|
24
24
|
end
|
|
25
25
|
|
|
26
|
-
# GET /:resources[.json]
|
|
27
26
|
def index
|
|
28
|
-
set_resources
|
|
27
|
+
set_resources model_class.all
|
|
29
28
|
end
|
|
30
29
|
|
|
31
|
-
# GET /:resource/:id[.json]
|
|
32
30
|
def show
|
|
33
|
-
set_resource
|
|
34
31
|
end
|
|
35
32
|
|
|
36
|
-
# GET /:resource/new
|
|
37
33
|
def new
|
|
38
|
-
|
|
34
|
+
set_resource model_class.new
|
|
39
35
|
end
|
|
40
36
|
|
|
41
|
-
# GET /:resource/:id/edit
|
|
42
37
|
def edit
|
|
43
|
-
set_resource
|
|
44
38
|
end
|
|
45
39
|
|
|
46
|
-
# POST /:resources[.json]
|
|
47
40
|
def create
|
|
48
|
-
|
|
41
|
+
set_resource model_class.new(resource_params)
|
|
42
|
+
msg = t("ui.created", model: model_name)
|
|
43
|
+
if resource.save
|
|
44
|
+
succeded msg, :create
|
|
45
|
+
else
|
|
46
|
+
failed :edit
|
|
47
|
+
end
|
|
49
48
|
end
|
|
50
49
|
|
|
51
|
-
# PATCH/PUT /:resources/:id[.json]
|
|
52
50
|
def update
|
|
53
|
-
|
|
54
|
-
|
|
51
|
+
msg = t("ui.updated", model: model_name)
|
|
52
|
+
if resource.update(resource_params)
|
|
53
|
+
succeded msg, :ok
|
|
54
|
+
else
|
|
55
|
+
failed :edit
|
|
56
|
+
end
|
|
55
57
|
end
|
|
56
58
|
|
|
57
|
-
# DELETE /:resources/:id[.json]
|
|
58
59
|
def destroy
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
flash[:notice] = msg unless request.xhr?
|
|
60
|
+
resource.destroy
|
|
61
|
+
msg = t("ui.destroyed", model: model_name)
|
|
62
|
+
flash[:notice] = msg unless request.xhr?
|
|
63
63
|
respond_to do |format|
|
|
64
64
|
format.html { redirect_to action: :index }
|
|
65
|
-
format.js { render template: 'rows/destroy', layout: false }
|
|
66
65
|
format.json { head :no_content }
|
|
66
|
+
format.turbo_stream {}
|
|
67
67
|
end
|
|
68
68
|
end
|
|
69
69
|
|
|
70
|
-
|
|
71
|
-
|
|
70
|
+
private
|
|
71
|
+
|
|
72
|
+
def succeded(msg, next_status)
|
|
72
73
|
respond_to do |format|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
status: msg == 'created' ? :created : :ok,
|
|
85
|
-
location: resource }
|
|
86
|
-
else ## failed
|
|
87
|
-
format.html { render action: msg == 'created' ? :new : :edit }
|
|
88
|
-
format.json { render json: resource.errors,
|
|
89
|
-
status: :unprocessable_entity }
|
|
90
|
-
end
|
|
74
|
+
format.html {
|
|
75
|
+
flash[:notice] = msg
|
|
76
|
+
if params[:commit] == "OK"
|
|
77
|
+
redirect_to action: :index
|
|
78
|
+
else
|
|
79
|
+
redirect_to action: :edit, id: resource.id
|
|
80
|
+
end
|
|
81
|
+
}
|
|
82
|
+
format.json {
|
|
83
|
+
render action: :show, status: next_status, location: resource
|
|
84
|
+
}
|
|
91
85
|
end
|
|
92
86
|
end
|
|
93
87
|
|
|
88
|
+
def failed(next_action)
|
|
89
|
+
respond_to do |format|
|
|
90
|
+
format.html { render action: next_action }
|
|
91
|
+
format.json {
|
|
92
|
+
render json: resource.errors, status: :unprocessable_entity
|
|
93
|
+
}
|
|
94
|
+
end
|
|
95
|
+
end
|
|
94
96
|
end
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
# Extensions
|
|
4
4
|
class RowsExtController < RowsController
|
|
5
|
-
|
|
6
5
|
def copy
|
|
7
|
-
set_resource
|
|
6
|
+
set_resource
|
|
7
|
+
@_resource = resource.dup
|
|
8
8
|
resource.id = nil
|
|
9
9
|
respond_to do |format|
|
|
10
10
|
format.html { render action: :new }
|
|
@@ -13,9 +13,8 @@ class RowsExtController < RowsController
|
|
|
13
13
|
|
|
14
14
|
def multi_deletion
|
|
15
15
|
items = params[:multi_tick] || []
|
|
16
|
-
items -= [
|
|
17
|
-
items.map { |id|
|
|
16
|
+
items -= [""]
|
|
17
|
+
items.map { |id| model_class.find_by_id(id.to_i).destroy }
|
|
18
18
|
redirect_to action: :index
|
|
19
19
|
end
|
|
20
|
-
|
|
21
20
|
end
|
data/app/views/rows/_list.slim
CHANGED
|
@@ -13,7 +13,7 @@ table.rows-list
|
|
|
13
13
|
tbody
|
|
14
14
|
- resources.each do |resource|
|
|
15
15
|
- cnt += 1
|
|
16
|
-
tr id=
|
|
16
|
+
tr id=dom_id(resource) class="#{odd_even.at(cnt % 2)}"
|
|
17
17
|
= render 'list_row', resource: resource, columns: columns
|
|
18
18
|
td
|
|
19
19
|
= render 'row_buttons', row: resource
|
|
@@ -6,9 +6,11 @@ ruby:
|
|
|
6
6
|
else
|
|
7
7
|
url_for row
|
|
8
8
|
end
|
|
9
|
+
show = t('button.show')
|
|
10
|
+
edit = t('button.edit')
|
|
11
|
+
delete = t('button.delete')
|
|
9
12
|
|
|
10
|
-
= link_to
|
|
11
|
-
= link_to
|
|
12
|
-
= link_to
|
|
13
|
-
|
|
14
|
-
data: {confirm: 'Are you sure?'}, method: :delete
|
|
13
|
+
= link_to image_tag('show.gif', alt: show, title: show), url
|
|
14
|
+
= link_to image_tag('plus.png', alt: edit, title: edit), "#{url}/edit"
|
|
15
|
+
= link_to image_tag('minus.png', alt: delete, title: delete), url,
|
|
16
|
+
data: { turbo_method: :delete, turbo_confirm: 'Are you sure?' }
|
data/app/views/rows/_submit.slim
CHANGED
|
@@ -10,7 +10,7 @@ ruby:
|
|
|
10
10
|
left ||= nil
|
|
11
11
|
right ||= nil
|
|
12
12
|
|
|
13
|
-
.rows-submit style="width:100%"
|
|
13
|
+
.rows-submit style="width:100%" data= { turbo: 'false' }
|
|
14
14
|
input style="display:none" type="submit" name="commit" value="OK"
|
|
15
15
|
p style="float:left"
|
|
16
16
|
= render '/rows/submit_part', content: :submit_left, names: left
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
ruby:
|
|
2
|
+
# submit links and/or buttons
|
|
3
|
+
# Requires
|
|
4
|
+
# content_for(:submit_<left|right>)
|
|
5
|
+
# left|right (links names)
|
|
6
|
+
|
|
7
|
+
# left|right must be used inside a form.
|
|
8
|
+
# The clean content_for variant may be used unbounded.
|
|
9
|
+
|
|
10
|
+
left ||= nil
|
|
11
|
+
right ||= nil
|
|
12
|
+
|
|
13
|
+
/.rows-submit style="width:100%" data= { turbo: 'false' }
|
|
14
|
+
.rows-submit style="width:100%"
|
|
15
|
+
input style="display:none" type="submit" name="commit" value="OK"
|
|
16
|
+
p style="float:left"
|
|
17
|
+
= render '/rows/submit_part', content: :submit_left, names: left
|
|
18
|
+
p style="float:right"
|
|
19
|
+
= render '/rows/submit_part', content: :submit_right, names: right
|
|
20
|
+
div style="clear:both"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<%= turbo_stream.remove(dom_id(resource)) %>
|
data/app/views/rows/edit.slim
CHANGED
|
@@ -3,16 +3,14 @@ ruby:
|
|
|
3
3
|
# Requires resource model_name model_symbol
|
|
4
4
|
# partial 'form' template
|
|
5
5
|
|
|
6
|
-
content_for(:submit_left)
|
|
6
|
+
content_for(:submit_left) do
|
|
7
7
|
link_to t('button.back').html_safe, "/#{controller_name}", class: 'button'
|
|
8
|
-
|
|
8
|
+
end
|
|
9
9
|
|
|
10
10
|
fieldset class="wide mask" id=model_symbol
|
|
11
11
|
legend = t('ui.editing', model: model_name).html_safe
|
|
12
12
|
= render '/shared/error_explanation'
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
/"/#{controller_name}/update/#{@row.id}"
|
|
16
|
-
= form_for resource, url: "/#{controller_name}/#{@row.id}", html: {multipart: @multipart} do |f|
|
|
14
|
+
= form_with model: resource do |f|
|
|
17
15
|
= render 'form', f: f
|
|
18
16
|
= render '/rows/submit', right: %w[update OK]
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
ruby:
|
|
2
|
+
# Template for RowsController (edit)
|
|
3
|
+
# Requires resource model_name model_symbol
|
|
4
|
+
# partial 'form' template
|
|
5
|
+
|
|
6
|
+
content_for(:submit_left) do
|
|
7
|
+
link_to t('button.back').html_safe, "/#{controller_name}", class: 'button'
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
fieldset class="wide mask" id=model_symbol
|
|
11
|
+
legend = t('ui.editing', model: model_name).html_safe
|
|
12
|
+
= render '/shared/error_explanation'
|
|
13
|
+
|
|
14
|
+
/"/#{controller_name}/update/#{@row.id}"
|
|
15
|
+
= form_with resource,
|
|
16
|
+
url: "/#{controller_name}/#{@row.id}" do |f|
|
|
17
|
+
= render 'form', f: f
|
|
18
|
+
= render '/rows/submit', right: %w[update OK]
|
data/app/views/rows/index.slim
CHANGED
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
/ Requires resources model_name resource_columns
|
|
3
3
|
|
|
4
4
|
- if resources.length.positive?
|
|
5
|
-
h1 =
|
|
5
|
+
h1 = model_symbol_plural.capitalize
|
|
6
6
|
= render '/rows/list', resources: resources, columns: resource_columns
|
|
7
|
+
/= render '/rows/list', resources:, columns: resource_columns
|
|
7
8
|
- else
|
|
8
9
|
h1 = t('ui.empty_list', model: model_name).html_safe
|
|
9
10
|
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/ Template for RowsController (index)
|
|
2
|
+
/ Requires resources model_name resource_columns
|
|
3
|
+
|
|
4
|
+
- if resources.length.positive?
|
|
5
|
+
h1 = model_symbol_plural.capitalize
|
|
6
|
+
/= render '/rows/list', resources: resources, columns: resource_columns
|
|
7
|
+
= render '/rows/list', resources:, columns: resource_columns
|
|
8
|
+
- else
|
|
9
|
+
h1 = t('ui.empty_list', model: model_name).html_safe
|
|
10
|
+
|
|
11
|
+
= render 'list_footer'
|
data/app/views/rows/new.slim
CHANGED
|
@@ -3,15 +3,14 @@ ruby:
|
|
|
3
3
|
# Requires resource model_name model_symbol
|
|
4
4
|
# partial 'form' template
|
|
5
5
|
|
|
6
|
-
content_for(:submit_left)
|
|
6
|
+
content_for(:submit_left) do
|
|
7
7
|
link_to t('button.back').html_safe, "/#{controller_name}", class: 'button'
|
|
8
|
-
|
|
8
|
+
end
|
|
9
9
|
|
|
10
10
|
fieldset.wide class="mask" id=model_symbol
|
|
11
11
|
legend = t('ui.new', model: model_name).html_safe
|
|
12
12
|
= render '/shared/error_explanation'
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
= form_for resource, html: {multipart: @multipart} do |f|
|
|
14
|
+
= form_with model: resource do |f|
|
|
16
15
|
= render 'form', f: f
|
|
17
16
|
= render '/rows/submit', right: %w[create OK]
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
ruby:
|
|
2
|
+
# Template for RowsController (new)
|
|
3
|
+
# Requires resource model_name model_symbol
|
|
4
|
+
# partial 'form' template
|
|
5
|
+
|
|
6
|
+
content_for(:submit_left) do
|
|
7
|
+
link_to t('button.back').html_safe, "/#{controller_name}", class: 'button'
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
fieldset.wide class="mask" id=model_symbol
|
|
11
|
+
legend = t('ui.new', model: model_name).html_safe
|
|
12
|
+
= render '/shared/error_explanation'
|
|
13
|
+
|
|
14
|
+
= form_with resource do |f|
|
|
15
|
+
= render 'form', f: f
|
|
16
|
+
= render '/rows/submit', right: %w[create OK]
|
data/app/views/rows/show.slim
CHANGED
|
@@ -3,17 +3,17 @@ ruby:
|
|
|
3
3
|
# Requires resource model_name model_symbol
|
|
4
4
|
# partial 'form' template
|
|
5
5
|
|
|
6
|
-
content_for(:submit_left)
|
|
6
|
+
content_for(:submit_left) do
|
|
7
7
|
link_to t('button.back').html_safe, url_for(action: :index), class: 'button'
|
|
8
|
-
|
|
9
|
-
content_for(:submit_right)
|
|
8
|
+
end
|
|
9
|
+
content_for(:submit_right) do
|
|
10
10
|
link_to t('button.edit').html_safe, url_for(action: :edit), class: 'button'
|
|
11
|
-
|
|
11
|
+
end
|
|
12
12
|
|
|
13
13
|
fieldset.show class="wide mask" id=model_symbol
|
|
14
|
-
legend =
|
|
14
|
+
legend = model_name
|
|
15
15
|
= render '/shared/error_explanation'
|
|
16
16
|
|
|
17
|
-
=
|
|
17
|
+
= form_with model: resource do |f|
|
|
18
18
|
= render 'form', f: f
|
|
19
19
|
= render '/rows/submit'
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
ruby:
|
|
2
|
+
# Template for RowsController (show)
|
|
3
|
+
# Requires resource model_name model_symbol
|
|
4
|
+
# partial 'form' template
|
|
5
|
+
|
|
6
|
+
content_for(:submit_left) do
|
|
7
|
+
link_to t('button.back').html_safe, url_for(action: :index), class: 'button'
|
|
8
|
+
end
|
|
9
|
+
content_for(:submit_right) do
|
|
10
|
+
link_to t('button.edit').html_safe, url_for(action: :edit), class: 'button'
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
fieldset.show class="wide mask" id=model_symbol
|
|
14
|
+
legend = t('ui.showing', model: model_name).html_safe
|
|
15
|
+
= render '/shared/error_explanation'
|
|
16
|
+
|
|
17
|
+
= form_with model: resource do |f|
|
|
18
|
+
= render 'form', f: f
|
|
19
|
+
= render '/rows/submit'
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
/ # Show complete flash
|
|
2
2
|
/ # flash[:notice] are faded out after 5 seconds
|
|
3
|
-
|
|
3
|
+
|
|
4
|
+
css:
|
|
5
|
+
.flash_notice {
|
|
6
|
+
animation: animate_notice 5s linear 2s forwards;
|
|
7
|
+
}
|
|
8
|
+
@keyframes animate_notice {
|
|
9
|
+
from { opacity: 1; }
|
|
10
|
+
to { opacity: 0; }
|
|
11
|
+
}
|
|
4
12
|
|
|
5
13
|
- (flash || {}).each do |key, value|
|
|
6
14
|
p class="flash_#{key}" = sanitize(value)
|
|
7
|
-
- if key == :notice
|
|
8
|
-
javascript:
|
|
9
|
-
$('.flash_notice').fadeOut(5000, function() { $(this).remove(); });
|
data/lib/rows/locales/de.yml
CHANGED
|
@@ -1,25 +1,20 @@
|
|
|
1
|
-
# under construction; see english version
|
|
2
1
|
de:
|
|
3
2
|
|
|
4
3
|
ui:
|
|
5
|
-
created:
|
|
6
|
-
destroyed:
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
new: 'Neue(r/s) %{model}'
|
|
12
|
-
showing: 'Zeige %{model}'
|
|
13
|
-
|
|
14
|
-
empty_list: 'Liste %{model} ist leer.'
|
|
4
|
+
created: "%{model} erstellt."
|
|
5
|
+
destroyed: "%{model} gelöscht."
|
|
6
|
+
editing: "Editiere %{model}"
|
|
7
|
+
empty_list: "Liste %{model} ist leer."
|
|
8
|
+
new: "Neue(r/s) %{model}"
|
|
9
|
+
updated: "%{model} geändert."
|
|
15
10
|
|
|
16
11
|
button:
|
|
17
|
-
ok: OK
|
|
18
12
|
back: "Zurück"
|
|
19
13
|
cancel: Abbrechen
|
|
14
|
+
clone: Klonen
|
|
20
15
|
create: Erstelle
|
|
21
|
-
|
|
22
|
-
delete: 'Lösche'
|
|
16
|
+
delete: "Lösche"
|
|
23
17
|
edit: Editieren
|
|
18
|
+
ok: OK
|
|
24
19
|
show: Zeige
|
|
25
|
-
|
|
20
|
+
update: Speichern
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
de:
|
|
2
|
+
|
|
3
|
+
ui:
|
|
4
|
+
created: "%{model} erstellt."
|
|
5
|
+
destroyed: "%{model} gelöscht."
|
|
6
|
+
editing: "Editiere %{model}"
|
|
7
|
+
empty_list: "Liste %{model} ist leer."
|
|
8
|
+
new: "Neue(r/s) %{model}"
|
|
9
|
+
showing: "Zeige %{model}"
|
|
10
|
+
updated: "%{model} geändert."
|
|
11
|
+
|
|
12
|
+
button:
|
|
13
|
+
back: "Zurück"
|
|
14
|
+
cancel: Abbrechen
|
|
15
|
+
clone: Klonen
|
|
16
|
+
create: Erstelle
|
|
17
|
+
delete: "Lösche"
|
|
18
|
+
edit: Editieren
|
|
19
|
+
ok: OK
|
|
20
|
+
show: Zeige
|
|
21
|
+
update: Speichern
|
data/lib/rows/locales/en.yml
CHANGED
|
@@ -1,24 +1,20 @@
|
|
|
1
1
|
en:
|
|
2
2
|
|
|
3
3
|
ui:
|
|
4
|
-
created:
|
|
5
|
-
destroyed:
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
new: 'New %{model}'
|
|
11
|
-
showing: 'Showing %{model}'
|
|
12
|
-
|
|
13
|
-
empty_list: 'List %{model} is empty'
|
|
4
|
+
created: "%{model} created."
|
|
5
|
+
destroyed: "%{model} deleted."
|
|
6
|
+
editing: "Editing %{model}"
|
|
7
|
+
empty_list: "List %{model} is empty"
|
|
8
|
+
new: "New %{model}"
|
|
9
|
+
updated: "%{model} updated."
|
|
14
10
|
|
|
15
11
|
button:
|
|
16
|
-
ok: OK
|
|
17
12
|
back: Back
|
|
18
13
|
cancel: Cancel
|
|
14
|
+
clone: Clone
|
|
19
15
|
create: Create
|
|
20
|
-
update: Update
|
|
21
16
|
delete: Delete
|
|
22
17
|
edit: Edit
|
|
18
|
+
ok: OK
|
|
23
19
|
show: Show
|
|
24
|
-
|
|
20
|
+
update: Update
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
en:
|
|
2
|
+
|
|
3
|
+
ui:
|
|
4
|
+
created: "%{model} created."
|
|
5
|
+
destroyed: "%{model} deleted."
|
|
6
|
+
editing: "Editing %{model}"
|
|
7
|
+
empty_list: "List %{model} is empty"
|
|
8
|
+
new: "New %{model}"
|
|
9
|
+
showing: "Showing %{model}"
|
|
10
|
+
updated: "%{model} updated."
|
|
11
|
+
|
|
12
|
+
button:
|
|
13
|
+
back: Back
|
|
14
|
+
cancel: Cancel
|
|
15
|
+
clone: Clone
|
|
16
|
+
create: Create
|
|
17
|
+
delete: Delete
|
|
18
|
+
edit: Edit
|
|
19
|
+
ok: OK
|
|
20
|
+
show: Show
|
|
21
|
+
update: Update
|
data/lib/rows/model.rb
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
module Rows::Model
|
|
4
4
|
def model_class
|
|
5
5
|
@_model_class ||= self.class.model_class ||
|
|
6
|
-
|
|
6
|
+
Kernel.const_get(params[:controller].classify)
|
|
7
7
|
end
|
|
8
8
|
|
|
9
9
|
if Rails::VERSION::MAJOR > 3
|
|
@@ -20,7 +20,7 @@ module Rows::Model
|
|
|
20
20
|
end
|
|
21
21
|
|
|
22
22
|
def model_symbol
|
|
23
|
-
@_model_symbol ||= model_name.underscore.tr(
|
|
23
|
+
@_model_symbol ||= model_name.underscore.tr("/", "_")
|
|
24
24
|
end
|
|
25
25
|
end
|
|
26
26
|
|
data/lib/rows/resources.rb
CHANGED
|
@@ -1,83 +1,45 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
module Rows::Resources
|
|
4
|
-
def
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
def resource
|
|
5
|
+
@_resource
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def resources
|
|
9
|
+
@_resources
|
|
8
10
|
end
|
|
9
11
|
|
|
10
12
|
def set_resource(row = nil)
|
|
11
13
|
row ||= model_class.find_by_id(params[:id].to_i)
|
|
12
14
|
instance_variable_set("@#{model_symbol}", row)
|
|
15
|
+
@_resource = row
|
|
13
16
|
@row = row
|
|
14
17
|
end
|
|
15
18
|
|
|
16
|
-
def
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
@row ||= set_resource
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
private
|
|
25
|
-
# low level resource methods
|
|
26
|
-
# can be monkey patched
|
|
27
|
-
def resource_new
|
|
28
|
-
if params[model_symbol]
|
|
29
|
-
set_resource model_class.new(resource_params)
|
|
30
|
-
else
|
|
31
|
-
set_resource model_class.new
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
def resource_create
|
|
36
|
-
resource_new
|
|
37
|
-
resource.save
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def resource_update
|
|
41
|
-
if Rails::VERSION::MAJOR >= 4
|
|
42
|
-
# return true unless params[model_symbol]
|
|
43
|
-
resource.update(resource_params)
|
|
44
|
-
else
|
|
45
|
-
resource.update_attributes(resource_params)
|
|
46
|
-
end
|
|
19
|
+
def set_resources(rows = nil)
|
|
20
|
+
rows ||= model_class.all
|
|
21
|
+
instance_variable_set("@#{model_symbol_plural}", rows)
|
|
22
|
+
@_resources = rows
|
|
23
|
+
@rows = rows
|
|
47
24
|
end
|
|
48
25
|
|
|
49
|
-
|
|
50
|
-
resource.destroy
|
|
51
|
-
end
|
|
26
|
+
private
|
|
52
27
|
|
|
53
28
|
def resource_columns
|
|
54
29
|
return model_class.column_headers if model_class.respond_to?(:column_headers)
|
|
55
|
-
return [
|
|
30
|
+
return ["to_s"] unless model_class.respond_to?(:content_columns)
|
|
56
31
|
|
|
57
|
-
[
|
|
32
|
+
["id"] + model_class.content_columns.collect(&:name)
|
|
58
33
|
end
|
|
59
34
|
|
|
60
35
|
def resource_whitelist
|
|
61
|
-
raise "
|
|
36
|
+
raise "TurbocController requires private method 'resource_whitelist' in controller <#{params[:controller]}>"
|
|
62
37
|
end
|
|
63
38
|
|
|
64
39
|
# Never trust parameters from the scary internet, only allow the
|
|
65
40
|
# white list through.
|
|
66
41
|
def resource_params
|
|
67
42
|
permits = resource_whitelist
|
|
68
|
-
|
|
69
|
-
params.require(model_symbol).permit(permits)
|
|
70
|
-
else
|
|
71
|
-
pars = params[model_symbol] || {}
|
|
72
|
-
# pars.keys.each { |x|
|
|
73
|
-
pars.each_key { |x|
|
|
74
|
-
x = x.to_sym
|
|
75
|
-
unless permits.include?(x) || permits.include?({x => []})
|
|
76
|
-
pars.delete(x)
|
|
77
|
-
p "** WARNING: model <#{model_name}> dropping params <#{x}>"
|
|
78
|
-
end
|
|
79
|
-
}
|
|
80
|
-
pars
|
|
81
|
-
end
|
|
43
|
+
params.require(model_symbol).permit(permits)
|
|
82
44
|
end
|
|
83
45
|
end
|
data/lib/rows/version.rb
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
# rubocop: disable all
|
|
2
|
-
|
|
3
1
|
module Rows
|
|
4
|
-
VERSION =
|
|
5
|
-
# VERSION = '3.0.
|
|
6
|
-
# VERSION = '3.0.
|
|
7
|
-
# VERSION = '3.0.
|
|
8
|
-
# VERSION = '3.0.
|
|
9
|
-
# VERSION = '
|
|
10
|
-
# VERSION = '2.2.
|
|
11
|
-
# VERSION = '2.2.
|
|
12
|
-
# VERSION = '2.2.
|
|
2
|
+
VERSION = "3.1.0" # 2022-09-18
|
|
3
|
+
# VERSION = '3.0.5' # 2021-06-24
|
|
4
|
+
# VERSION = '3.0.3' # 2020-07-14
|
|
5
|
+
# VERSION = '3.0.2' # 2020-04-27
|
|
6
|
+
# VERSION = '3.0.1' # 2020-03-01
|
|
7
|
+
# VERSION = '3.0.0' # 2019-10-03
|
|
8
|
+
# VERSION = '2.2.3' # 2019-10-03
|
|
9
|
+
# VERSION = '2.2.2' # 2019-05-06
|
|
10
|
+
# VERSION = '2.2.1' # 2019-02-18
|
|
11
|
+
# VERSION = '2.2.0'
|
|
13
12
|
end
|
data/lib/rows/version.rb.bak
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
# rubocop: disable all
|
|
2
|
-
|
|
3
1
|
module Rows
|
|
4
|
-
|
|
5
|
-
# VERSION = '3.0.
|
|
6
|
-
# VERSION = '3.0.
|
|
7
|
-
# VERSION = '3.0.
|
|
8
|
-
# VERSION = '3.0.
|
|
9
|
-
# VERSION = '
|
|
10
|
-
# VERSION = '2.2.
|
|
11
|
-
# VERSION = '2.2.
|
|
12
|
-
# VERSION = '2.2.
|
|
2
|
+
VERSION = "3.1.0" # 2022-09-18
|
|
3
|
+
# VERSION = '3.0.5' # 2021-06-24
|
|
4
|
+
# VERSION = '3.0.3' # 2020-07-14
|
|
5
|
+
# VERSION = '3.0.2' # 2020-04-27
|
|
6
|
+
# VERSION = '3.0.1' # 2020-03-01
|
|
7
|
+
# VERSION = '3.0.0' # 2019-10-03
|
|
8
|
+
# VERSION = '2.2.3' # 2019-10-03
|
|
9
|
+
# VERSION = '2.2.2' # 2019-05-06
|
|
10
|
+
# VERSION = '2.2.1' # 2019-02-18
|
|
11
|
+
# VERSION = '2.2.0'
|
|
13
12
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rows_controller
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 3.0
|
|
4
|
+
version: 3.1.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Dittmar Krall
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2022-09-29 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -96,7 +96,7 @@ dependencies:
|
|
|
96
96
|
version: '0'
|
|
97
97
|
description: YourController < RowsController ( < ApplicationController).
|
|
98
98
|
email:
|
|
99
|
-
- dittmar.krall@
|
|
99
|
+
- dittmar.krall@matiq.com
|
|
100
100
|
executables: []
|
|
101
101
|
extensions: []
|
|
102
102
|
extra_rdoc_files: []
|
|
@@ -104,32 +104,40 @@ files:
|
|
|
104
104
|
- MIT-LICENSE
|
|
105
105
|
- README.md
|
|
106
106
|
- app/controllers/rows_controller.rb
|
|
107
|
-
- app/controllers/rows_ext_controller.rb
|
|
107
|
+
- app/controllers/rows_ext_controller.rb.bak
|
|
108
108
|
- app/views/rows/_form.slim
|
|
109
109
|
- app/views/rows/_list.slim
|
|
110
110
|
- app/views/rows/_list_footer.slim
|
|
111
|
+
- app/views/rows/_list_footer.slim.bak
|
|
111
112
|
- app/views/rows/_list_header.slim
|
|
112
113
|
- app/views/rows/_list_row.slim
|
|
113
114
|
- app/views/rows/_row_buttons.slim
|
|
114
115
|
- app/views/rows/_submit.slim
|
|
116
|
+
- app/views/rows/_submit.slim.bak
|
|
115
117
|
- app/views/rows/_submit_part.slim
|
|
116
|
-
- app/views/rows/destroy.
|
|
118
|
+
- app/views/rows/destroy.turbo_stream.erb
|
|
117
119
|
- app/views/rows/edit.slim
|
|
120
|
+
- app/views/rows/edit.slim.bak
|
|
118
121
|
- app/views/rows/index.slim
|
|
122
|
+
- app/views/rows/index.slim.bak
|
|
119
123
|
- app/views/rows/new.slim
|
|
124
|
+
- app/views/rows/new.slim.bak
|
|
120
125
|
- app/views/rows/show.slim
|
|
126
|
+
- app/views/rows/show.slim.bak
|
|
121
127
|
- app/views/shared/_error_explanation.slim
|
|
122
128
|
- app/views/shared/_show_flash.slim
|
|
123
129
|
- lib/rows/engine.rb
|
|
124
130
|
- lib/rows/locales/de.yml
|
|
131
|
+
- lib/rows/locales/de.yml.bak
|
|
125
132
|
- lib/rows/locales/en.yml
|
|
133
|
+
- lib/rows/locales/en.yml.bak
|
|
126
134
|
- lib/rows/model.rb
|
|
127
135
|
- lib/rows/resources.rb
|
|
128
136
|
- lib/rows/utils.rb
|
|
129
137
|
- lib/rows/version.rb
|
|
130
138
|
- lib/rows/version.rb.bak
|
|
131
139
|
- lib/rows_controller.rb
|
|
132
|
-
homepage: http://
|
|
140
|
+
homepage: http://matiq.com
|
|
133
141
|
licenses:
|
|
134
142
|
- MIT
|
|
135
143
|
metadata:
|
|
@@ -149,7 +157,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
149
157
|
- !ruby/object:Gem::Version
|
|
150
158
|
version: '0'
|
|
151
159
|
requirements: []
|
|
152
|
-
rubygems_version: 3.
|
|
160
|
+
rubygems_version: 3.3.7
|
|
153
161
|
signing_key:
|
|
154
162
|
specification_version: 4
|
|
155
163
|
summary: RowsController DRYs your controllers.
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
$('#row_<%= resource.id %>').fadeOut(500, function() { $(this).remove(); });
|