superuser 0.2.3 → 0.3.3
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/lib/generators/superuser/USAGE +16 -16
- data/lib/generators/superuser/init_generator.rb +127 -0
- data/lib/generators/superuser/superuser_generator.rb +86 -155
- data/lib/generators/superuser/templates/base_controller.rb +32 -30
- data/lib/generators/superuser/templates/controller_template.rb +53 -85
- data/lib/generators/superuser/templates/dashboard_controller.rb +3 -5
- data/lib/generators/superuser/templates/superuser_base.scss +215 -246
- data/lib/generators/superuser/templates/views/_form.html.erb +1 -3
- data/lib/generators/superuser/templates/views/_search.html.erb +25 -28
- data/lib/generators/superuser/templates/views/dashboard_index.html.erb +1 -1
- data/lib/generators/superuser/templates/views/edit.html.erb +1 -2
- data/lib/generators/superuser/templates/views/index.html.erb +28 -37
- data/lib/generators/superuser/templates/views/layouts/application.html.erb +52 -51
- data/lib/generators/superuser/templates/views/new.html.erb +1 -2
- data/lib/generators/superuser/templates/views/show.html.erb +1 -2
- data/lib/generators/superuser/templates/webpack_native_base.js +3 -0
- data/lib/superuser.rb +1 -0
- data/lib/superuser/version.rb +1 -1
- metadata +22 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 487d1ecfa49de1fdbe1f4b6de87d465f163087f78f2b6f938c36a290eeb1f457
|
4
|
+
data.tar.gz: 2ccb0b6c9deadff8e05068a0fab17eb650a0cc7e9969b44bd0870d2b0e8d12c9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 904adf9db5e4eef4b417f2fb66ff449ba44acb2b3d3449aca0785adfb4f4a2b2973a15cf2c2a68a9012f0bac35b5df1214c137879ac576e90b5dbebb14dc97a8
|
7
|
+
data.tar.gz: 0a0d7d7dcc1ff3d145c4e2e12a3eb2a40e7f9621ab4625570ca4b95012ae1b4c04b8ce91b61d079e3eab3ac9e6fb973e5b9c1b3036640d9a8e80380834ed74ad
|
@@ -1,21 +1,21 @@
|
|
1
1
|
Description:
|
2
|
-
|
2
|
+
Generate scaffolding for you rails admin area using the command "rails g superuser name_of_your_resource"
|
3
3
|
|
4
4
|
Example:
|
5
|
-
|
5
|
+
rails generate superuser users
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
7
|
+
This will create:
|
8
|
+
controllers/superuser/users_controller.rb
|
9
|
+
views/superuser/index.html.erb
|
10
|
+
views/superuser/new.html.erb
|
11
|
+
views/superuser/show.html.erb
|
12
|
+
views/superuser/edit.html.erb
|
13
|
+
views/superuser/_form.html.erb
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
15
|
+
+ will create some base/shared files if they don't exists:
|
16
|
+
assets/javascripts/superuser/application.js
|
17
|
+
assets/stylesheets/superuser/application.scss
|
18
|
+
controllers/superuser/base_controller.rb
|
19
|
+
controllers/superuser/dashboard_controller.rb
|
20
|
+
views/layouts/superuser/application.html.erb
|
21
|
+
views/shared/_search.html.erb
|
@@ -0,0 +1,127 @@
|
|
1
|
+
class Superuser::InitGenerator < Rails::Generators::Base
|
2
|
+
|
3
|
+
source_root File.expand_path('../templates', __FILE__)
|
4
|
+
argument :frontend, type: :string, default: 'webpacker'
|
5
|
+
|
6
|
+
def generate_css_file
|
7
|
+
superuser_css_file = "#{stylesheets_folder()}/superuser.scss"
|
8
|
+
if !File.exist?(superuser_css_file)
|
9
|
+
copy_file "superuser_base.scss", superuser_css_file
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def generate_js_file
|
14
|
+
superuser_js_file = "#{javascripts_folder()}/superuser.js"
|
15
|
+
if !File.exist?(superuser_js_file)
|
16
|
+
if for_webpack_native
|
17
|
+
copy_file "webpack_native_base.js", superuser_js_file
|
18
|
+
else
|
19
|
+
copy_file "superuser_base.js", superuser_js_file
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def generate_layout
|
25
|
+
superuser_layout_file = "app/views/layouts/superuser/application.html.erb"
|
26
|
+
if !File.exist?(superuser_layout_file)
|
27
|
+
template "views/layouts/application.html.erb", superuser_layout_file
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def generate_base_controller
|
32
|
+
superuser_base_controller = "app/controllers/superuser/base_controller.rb"
|
33
|
+
if !File.exist?(superuser_base_controller)
|
34
|
+
copy_file "base_controller.rb", superuser_base_controller
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def generate_dashboard_controller
|
39
|
+
superuser_dashboard_controller = "app/controllers/superuser/dashboard_controller.rb"
|
40
|
+
if !File.exist?(superuser_dashboard_controller)
|
41
|
+
copy_file "dashboard_controller.rb", superuser_dashboard_controller
|
42
|
+
|
43
|
+
copy_file "views/dashboard_index.html.erb", "app/views/superuser/dashboard/index.html.erb"
|
44
|
+
|
45
|
+
add_layout_links 'app/views/layouts/superuser/application.html.erb', search = '<div class="sidebar_dashboard_link">', "<%= link_to 'dashboard', [:superuser, :root] %>"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def add_base_route
|
50
|
+
path = File.join(destination_root, 'config/routes.rb')
|
51
|
+
file_content = File.read(path)
|
52
|
+
# if namespace for :superuser don't exists then create it
|
53
|
+
unless file_content.include? 'namespace :superuser do'
|
54
|
+
route "\tnamespace :superuser do\n\t\troot to: 'dashboard#index'\n\tend\n"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def generate_search_form
|
59
|
+
template "views/_search.html.erb", "app/views/shared/superuser/_search.html.erb"
|
60
|
+
end
|
61
|
+
|
62
|
+
# in case of user is using webpack_native gem then add an entry pointing to superuser "application" javascript file
|
63
|
+
def add_entry_to_webpack_native_config
|
64
|
+
if for_webpack_native
|
65
|
+
|
66
|
+
webpack_config_file = "#{Rails.root}/app/webpack_native/webpack.config.js"
|
67
|
+
|
68
|
+
entry_line = "\n\t\t\tsuperuser: './src/javascripts/superuser.js',"
|
69
|
+
|
70
|
+
path = File.join(destination_root, 'app/webpack_native/webpack.config.js')
|
71
|
+
file_content = File.read(path)
|
72
|
+
|
73
|
+
if file_content.include? 'entry: {'
|
74
|
+
inject_into_file webpack_config_file, entry_line, :after => 'entry: {'
|
75
|
+
puts separator_line
|
76
|
+
note = "Restart rails server (in case it's running) for updates to take place in webpack.config.js"
|
77
|
+
puts "\e[33m#{note}\e[0m"
|
78
|
+
puts separator_line
|
79
|
+
else
|
80
|
+
puts separator_line
|
81
|
+
puts "You need to add the following entry to your webpack.config.js, i.e:\n\n"
|
82
|
+
entry = "entry: { \n superuser: './src/javascripts/superuser/application.js',\n // ...\n}"
|
83
|
+
puts "\e[32m#{entry}\e[0m"
|
84
|
+
note = "\nNote: do not forget to restart your server after that!"
|
85
|
+
puts "\e[33m#{note}\e[0m"
|
86
|
+
puts separator_line
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
private
|
92
|
+
|
93
|
+
def separator_line
|
94
|
+
"\n"+ ("~" * 60) +"\n\n"
|
95
|
+
end
|
96
|
+
|
97
|
+
def for_webpack_native
|
98
|
+
frontend.include?('webpack_native') || frontend.include?('webpackNative')
|
99
|
+
end
|
100
|
+
|
101
|
+
def stylesheets_folder
|
102
|
+
if for_webpack_native
|
103
|
+
'app/webpack_native/src/stylesheets'
|
104
|
+
else
|
105
|
+
'app/assets/stylesheets'
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def javascripts_folder
|
110
|
+
if for_webpack_native
|
111
|
+
'app/webpack_native/src/javascripts'
|
112
|
+
else
|
113
|
+
'app/javascript/packs'
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def add_layout_links(relative_file, search_text, replace_text)
|
118
|
+
path = File.join(destination_root, relative_file)
|
119
|
+
file_content = File.read(path)
|
120
|
+
|
121
|
+
unless file_content.include? replace_text
|
122
|
+
content = file_content.sub(/(#{Regexp.escape(search_text)})/mi, "#{search_text}\n\t\t\t\t#{replace_text}")
|
123
|
+
File.open(path, 'wb') { |file| file.write(content) }
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
@@ -1,205 +1,136 @@
|
|
1
1
|
class SuperuserGenerator < Rails::Generators::Base
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
end
|
32
|
-
|
33
|
-
def generate_controller
|
34
|
-
|
35
|
-
if !File.exist?("app/controllers/superuser/base_controller.rb")
|
36
|
-
copy_file "base_controller.rb", "app/controllers/superuser/base_controller.rb"
|
37
|
-
end
|
38
|
-
if !File.exist?("app/controllers/superuser/dashboard_controller.rb")
|
39
|
-
copy_file "dashboard_controller.rb", "app/controllers/superuser/dashboard_controller.rb"
|
40
|
-
copy_file "views/dashboard_index.html.erb", "app/views/superuser/dashboard/index.html.erb"
|
41
|
-
route "\tnamespace :superuser do\n\t\troot to: 'dashboard#index'\n\tend"
|
42
|
-
add_layout_links 'app/views/layouts/superuser/application.html.erb', search = '<div class="sidebar_dashboard_link">', "<%= link_to 'dashboard', [:superuser, :root] %>"
|
43
|
-
end
|
44
|
-
template "controller_template.rb", "app/controllers/superuser/#{naming(:resources)}_controller.rb"
|
45
|
-
|
46
|
-
end
|
47
|
-
|
48
|
-
def generate_route_and_link
|
49
|
-
|
50
|
-
# add resources to route if not exists
|
51
|
-
route_replacement = "resources :#{resources}"
|
52
|
-
r = add_resources_route 'config/routes.rb', search = 'namespace :superuser do', route_replacement
|
53
|
-
|
54
|
-
# add link to resources in the layout if not exists
|
55
|
-
link = "<%= link_to '#{resources}', [:superuser, :#{resources}] %>"
|
56
|
-
add_layout_links 'app/views/layouts/superuser/application.html.erb', search = '<div class="sidebar_item">', link
|
57
|
-
|
58
|
-
end
|
59
|
-
|
60
|
-
def generate_views
|
61
|
-
|
62
|
-
template "views/_form.html.erb", "app/views/superuser/#{naming(:resources)}/_form.html.erb"
|
63
|
-
template "views/index.html.erb", "app/views/superuser/#{naming(:resources)}/index.html.erb"
|
64
|
-
template "views/show.html.erb", "app/views/superuser/#{naming(:resources)}/show.html.erb"
|
65
|
-
template "views/new.html.erb", "app/views/superuser/#{naming(:resources)}/new.html.erb"
|
66
|
-
template "views/edit.html.erb", "app/views/superuser/#{naming(:resources)}/edit.html.erb"
|
67
|
-
|
68
|
-
end
|
69
|
-
|
70
|
-
def generate_search_form
|
71
|
-
|
72
|
-
template "views/_search.html.erb", "app/views/shared/superuser/_search.html.erb"
|
73
|
-
|
74
|
-
end
|
3
|
+
source_root File.expand_path('../templates', __FILE__)
|
4
|
+
argument :resources_name, type: :string
|
5
|
+
attr_accessor :attributes
|
6
|
+
|
7
|
+
# NOTE: the order of the following methods is important!
|
8
|
+
|
9
|
+
def generate_controller
|
10
|
+
template "controller_template.rb", "app/controllers/superuser/#{naming(:resources)}_controller.rb"
|
11
|
+
end
|
12
|
+
|
13
|
+
def generate_route_and_link
|
14
|
+
# add resources to route if not exists
|
15
|
+
route_replacement = "resources :#{resources}"
|
16
|
+
r = add_resources_route 'config/routes.rb', search = 'namespace :superuser do', route_replacement
|
17
|
+
|
18
|
+
# add link to resources in the layout if not exists
|
19
|
+
link = "<%= link_to '#{resources}', [:superuser, :#{resources}] %>"
|
20
|
+
add_layout_links 'app/views/layouts/superuser/application.html.erb', search = '<div class="sidebar_item">', link
|
21
|
+
end
|
22
|
+
|
23
|
+
def generate_views
|
24
|
+
template "views/_form.html.erb", "app/views/superuser/#{naming(:resources)}/_form.html.erb"
|
25
|
+
template "views/index.html.erb", "app/views/superuser/#{naming(:resources)}/index.html.erb"
|
26
|
+
template "views/show.html.erb", "app/views/superuser/#{naming(:resources)}/show.html.erb"
|
27
|
+
template "views/new.html.erb", "app/views/superuser/#{naming(:resources)}/new.html.erb"
|
28
|
+
template "views/edit.html.erb", "app/views/superuser/#{naming(:resources)}/edit.html.erb"
|
29
|
+
end
|
75
30
|
|
76
31
|
private
|
77
32
|
|
78
33
|
def replace(file_path)
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
gsub_file file_path, 'ModelName', "#{naming(:model_name)}"
|
84
|
-
|
34
|
+
gsub_file file_path, 'resources', "#{naming(:resources)}"
|
35
|
+
gsub_file file_path, 'resource', "#{naming(:resource)}"
|
36
|
+
gsub_file file_path, 'ControllerName', "#{naming(:controller_name)}"
|
37
|
+
gsub_file file_path, 'ModelName', "#{naming(:model_name)}"
|
85
38
|
end
|
86
39
|
|
87
40
|
def resources
|
88
|
-
|
89
|
-
resources_name.underscore
|
90
|
-
|
41
|
+
resources_name.underscore
|
91
42
|
end
|
92
43
|
|
93
44
|
def resource
|
94
|
-
|
95
|
-
resources_name.singularize.underscore
|
96
|
-
|
45
|
+
resources_name.singularize.underscore
|
97
46
|
end
|
98
47
|
|
99
48
|
def get_controller_name
|
100
|
-
|
101
|
-
resources_name.camelize
|
102
|
-
|
49
|
+
resources_name.camelize
|
103
50
|
end
|
104
51
|
|
105
52
|
def naming(key)
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
return map[key]
|
114
|
-
|
53
|
+
map = {
|
54
|
+
resources: resources_name.underscore,
|
55
|
+
resource: resources_name.singularize.underscore,
|
56
|
+
controller_name: resources_name.camelize,
|
57
|
+
model_name: resources_name.classify
|
58
|
+
}
|
59
|
+
return map[key]
|
115
60
|
end
|
116
61
|
|
117
62
|
def model_columns_for_attributes
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
end
|
122
|
-
|
63
|
+
resources_name.classify.constantize.columns.reject do |column|
|
64
|
+
column.name.to_s =~ /^(id|user_id|created_at|updated_at)$/
|
65
|
+
end
|
123
66
|
end
|
124
67
|
|
125
68
|
def editable_attributes
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
end
|
130
|
-
|
69
|
+
attributes ||= model_columns_for_attributes.map do |column|
|
70
|
+
{name: column.name.to_s, type: column.type.to_s}
|
71
|
+
end
|
131
72
|
end
|
132
73
|
|
133
74
|
def get_model
|
134
|
-
|
135
|
-
resources_name.classify.constantize
|
136
|
-
|
75
|
+
resources_name.classify.constantize
|
137
76
|
end
|
138
77
|
|
139
78
|
def get_resource_attributes
|
140
|
-
|
141
|
-
|
142
|
-
|
79
|
+
editable_attributes.map {
|
80
|
+
|a| a.name.prepend(':')
|
81
|
+
}.join(', ')
|
143
82
|
end
|
144
83
|
|
145
84
|
def field_type(db_type)
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
matching_type[db_type.to_sym] || "text_field"
|
158
|
-
|
85
|
+
matching_type = {
|
86
|
+
decimal: "text_field",
|
87
|
+
float: "text_field",
|
88
|
+
datetime: "text_field",
|
89
|
+
string: "text_field",
|
90
|
+
integer: "text_field",
|
91
|
+
text: "text_area",
|
92
|
+
json: "text_area",
|
93
|
+
jsonb: "text_area"
|
94
|
+
}
|
95
|
+
matching_type[db_type.to_sym] || "text_field"
|
159
96
|
end
|
160
97
|
|
161
98
|
def destination_path(path)
|
162
|
-
|
163
|
-
File.join(destination_root, path)
|
164
|
-
|
99
|
+
File.join(destination_root, path)
|
165
100
|
end
|
166
101
|
|
167
102
|
# sub_file modified
|
168
103
|
def add_resources_route(relative_file, search_text, replace_text)
|
104
|
+
path = destination_path(relative_file)
|
105
|
+
file_content = File.read(path)
|
169
106
|
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
route "\tnamespace :superuser do\n\t\tresources :#{resources}\n\tend"
|
176
|
-
return
|
177
|
-
end
|
107
|
+
# if namespace for :superuser don't exists then create it
|
108
|
+
unless file_content.include? 'namespace :superuser do'
|
109
|
+
route "\tnamespace :superuser do\n\t\tresources :#{resources}\n\tend"
|
110
|
+
return
|
111
|
+
end
|
178
112
|
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
#unless file_content.include? replace_text
|
186
|
-
unless regex.match file_content
|
187
|
-
content = file_content.sub(/(#{Regexp.escape(search_text)})/mi, "#{search_text}\n\t\t#{replace_text}")
|
188
|
-
File.open(path, 'wb') { |file| file.write(content) }
|
189
|
-
end
|
113
|
+
# the regular expression string should be between single quotes not double quotes
|
114
|
+
# the regular expression string should not include delimiters
|
115
|
+
# the matching will stop when find the first occurence of 'end'
|
116
|
+
regex_string = 'namespace \:superuser do[^end]*' + replace_text
|
117
|
+
regex = Regexp.new(regex_string)
|
190
118
|
|
119
|
+
#unless file_content.include? replace_text
|
120
|
+
unless regex.match file_content
|
121
|
+
content = file_content.sub(/(#{Regexp.escape(search_text)})/mi, "#{search_text}\n\t\t#{replace_text}")
|
122
|
+
File.open(path, 'wb') { |file| file.write(content) }
|
123
|
+
end
|
191
124
|
end
|
192
125
|
|
193
126
|
def add_layout_links(relative_file, search_text, replace_text)
|
127
|
+
path = destination_path(relative_file)
|
128
|
+
file_content = File.read(path)
|
194
129
|
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
content = file_content.sub(/(#{Regexp.escape(search_text)})/mi, "#{search_text}\n\t\t\t\t#{replace_text}")
|
200
|
-
File.open(path, 'wb') { |file| file.write(content) }
|
201
|
-
end
|
202
|
-
|
130
|
+
unless file_content.include? replace_text
|
131
|
+
content = file_content.sub(/(#{Regexp.escape(search_text)})/mi, "#{search_text}\n\t\t\t\t#{replace_text}")
|
132
|
+
File.open(path, 'wb') { |file| file.write(content) }
|
133
|
+
end
|
203
134
|
end
|
204
135
|
|
205
136
|
end
|