administration-one 1.0.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 +7 -0
- data/.dockerignore +51 -0
- data/.gitattributes +9 -0
- data/.gitignore +37 -0
- data/.rubocop.yml +8 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +2 -0
- data/Gemfile +8 -0
- data/Gemfile.lock +21 -0
- data/LICENSE.txt +21 -0
- data/README.md +52 -0
- data/Rakefile +4 -0
- data/administration_one.gemspec +22 -0
- data/lib/administration-one.rb +1 -0
- data/lib/administration_one/version.rb +3 -0
- data/lib/administration_one.rb +4 -0
- data/lib/generators/admin/install/USAGE +5 -0
- data/lib/generators/admin/install/install_generator.rb +142 -0
- data/lib/generators/admin/install/templates/controllers/admin/base_controller.rb +20 -0
- data/lib/generators/admin/install/templates/controllers/admin/home_controller.rb +4 -0
- data/lib/generators/admin/install/templates/controllers/admin/passwords_controller.rb +35 -0
- data/lib/generators/admin/install/templates/controllers/admin/profile_controller.rb +23 -0
- data/lib/generators/admin/install/templates/controllers/admin/sessions_controller.rb +24 -0
- data/lib/generators/admin/install/templates/controllers/admin/users_controller.rb +54 -0
- data/lib/generators/admin/install/templates/css/custom.css +85 -0
- data/lib/generators/admin/install/templates/erb/admin/base/_ejs_tags.html.erb +8 -0
- data/lib/generators/admin/install/templates/erb/admin/base/_flash_messages.html.erb +9 -0
- data/lib/generators/admin/install/templates/erb/admin/base/_footer.html.erb +34 -0
- data/lib/generators/admin/install/templates/erb/admin/base/_form_errors_messages.html.erb +10 -0
- data/lib/generators/admin/install/templates/erb/admin/base/_javascript_tags.html.erb +5 -0
- data/lib/generators/admin/install/templates/erb/admin/base/_page_header.html.erb +7 -0
- data/lib/generators/admin/install/templates/erb/admin/base/_page_header_actions.html.erb +5 -0
- data/lib/generators/admin/install/templates/erb/admin/base/_page_header_breadcrumb.html.erb +12 -0
- data/lib/generators/admin/install/templates/erb/admin/base/_primary_navbar.html.erb +63 -0
- data/lib/generators/admin/install/templates/erb/admin/base/_secondary_navbar.html.erb +12 -0
- data/lib/generators/admin/install/templates/erb/admin/base/_secondary_navbar_links.html.erb +20 -0
- data/lib/generators/admin/install/templates/erb/admin/base/_stylesheet_link_tags.html.erb +5 -0
- data/lib/generators/admin/install/templates/erb/admin/home/index.html.erb +8 -0
- data/lib/generators/admin/install/templates/erb/admin/passwords/edit.html.erb +16 -0
- data/lib/generators/admin/install/templates/erb/admin/passwords/new.html.erb +11 -0
- data/lib/generators/admin/install/templates/erb/admin/profile/edit.html.erb +48 -0
- data/lib/generators/admin/install/templates/erb/admin/profile/show.html.erb +22 -0
- data/lib/generators/admin/install/templates/erb/admin/sessions/new.html.erb +21 -0
- data/lib/generators/admin/install/templates/erb/admin/users/_form.html.erb +48 -0
- data/lib/generators/admin/install/templates/erb/admin/users/edit.html.erb +17 -0
- data/lib/generators/admin/install/templates/erb/admin/users/index.html.erb +78 -0
- data/lib/generators/admin/install/templates/erb/admin/users/new.html.erb +16 -0
- data/lib/generators/admin/install/templates/erb/admin/users/show.html.erb +33 -0
- data/lib/generators/admin/install/templates/erb/layouts/admin/authentication.html.erb +32 -0
- data/lib/generators/admin/install/templates/erb/layouts/admin/base.html.erb +31 -0
- data/lib/generators/admin/install/templates/helpers/admin/application_helper.rb +25 -0
- data/lib/generators/admin/install/templates/images/admin/default_avatar.png +0 -0
- data/lib/generators/admin/install/templates/images/admin/logo.svg +4 -0
- data/lib/generators/admin/install/templates/jobs/attach_avatar_to_user_job.rb +21 -0
- data/lib/generators/admin/install/templates/js/editor.js +101 -0
- data/lib/generators/admin/install/templates/js/flash_message.js +5 -0
- data/lib/generators/admin/install/templates/js/stimulus.js +3 -0
- data/lib/generators/admin/install/templates/js/theme_switcher.js +93 -0
- data/lib/generators/admin/install/templates/js/time_zone.js +3 -0
- data/lib/generators/admin/install/templates/migrations/create_users.rb.tt +15 -0
- data/lib/generators/admin/install/templates/models/admin/application_record.rb +3 -0
- data/lib/generators/admin/install/templates/models/application_record.rb +3 -0
- data/lib/generators/admin/install/templates/models/user.rb +34 -0
- data/lib/generators/admin/install/templates/modules/ejs_parser.rb +119 -0
- data/lib/generators/admin/install/templates/passwords_mailer/reset_admin.html.erb +4 -0
- data/lib/generators/admin/install/templates/passwords_mailer/reset_admin.text.erb +2 -0
- data/lib/generators/admin/install/templates/seeds.rb +12 -0
- data/lib/generators/admin/install/templates/test_unit/controllers/admin/home_controller_test.rb +12 -0
- data/lib/generators/admin/install/templates/test_unit/controllers/admin/profile_controller_test.rb +26 -0
- data/lib/generators/admin/install/templates/test_unit/controllers/admin/sessions_controller_test.rb +36 -0
- data/lib/generators/admin/install/templates/test_unit/controllers/admin/users_controller_test.rb +55 -0
- data/lib/generators/admin/install/templates/test_unit/models/user_test.rb +34 -0
- data/lib/generators/admin/install/templates/test_unit/test_helper.rb +25 -0
- data/lib/generators/admin/install/templates/test_unit/users.yml +13 -0
- data/lib/generators/admin/scaffold/USAGE +5 -0
- data/lib/generators/admin/scaffold/scaffold_generator.rb +132 -0
- data/lib/generators/admin/scaffold/templates/controller.rb.tt +58 -0
- data/lib/generators/admin/scaffold/templates/erb/_form.html.erb.tt +48 -0
- data/lib/generators/admin/scaffold/templates/erb/edit.html.erb.tt +17 -0
- data/lib/generators/admin/scaffold/templates/erb/index.html.erb.tt +76 -0
- data/lib/generators/admin/scaffold/templates/erb/new.html.erb.tt +16 -0
- data/lib/generators/admin/scaffold/templates/erb/show.html.erb.tt +39 -0
- data/lib/generators/admin/scaffold/templates/functional_test.rb.tt +53 -0
- metadata +124 -0
@@ -0,0 +1,13 @@
|
|
1
|
+
<% password_digest = BCrypt::Password.create("Password1234") %>
|
2
|
+
|
3
|
+
admin:
|
4
|
+
username: John Doe
|
5
|
+
email_address: admin@example.com
|
6
|
+
password_digest: <%= password_digest %>
|
7
|
+
is_admin: true
|
8
|
+
|
9
|
+
guest:
|
10
|
+
username: Jane Doe
|
11
|
+
email_address: guest@example.com
|
12
|
+
password_digest: <%= password_digest %>
|
13
|
+
is_admin: false
|
@@ -0,0 +1,132 @@
|
|
1
|
+
require "rails/generators/resource_helpers"
|
2
|
+
|
3
|
+
module Admin
|
4
|
+
module Generators
|
5
|
+
class ScaffoldGenerator < Rails::Generators::NamedBase
|
6
|
+
include Rails::Generators::ResourceHelpers
|
7
|
+
|
8
|
+
remove_class_option :actions
|
9
|
+
|
10
|
+
class_option :orm, banner: "NAME", type: :string, required: true, desc: "ORM to generate the controller for"
|
11
|
+
|
12
|
+
argument :attributes, type: :array, default: [], banner: "field:type field:type"
|
13
|
+
|
14
|
+
source_root File.expand_path("templates", __dir__)
|
15
|
+
|
16
|
+
def ask_about_wysiwyg
|
17
|
+
return if behavior == :revoke
|
18
|
+
if attributes_names.include?('content')
|
19
|
+
puts "\n" * 2
|
20
|
+
puts "There was attribute named \"content\" passed to generator's options. Do you want to use EditorJS for it?"
|
21
|
+
answer = ask "Type \"Y\" or \"Yes\ to use EditorJS. Or anything else not to use it."
|
22
|
+
["y", "yes"].include?(answer.downcase) ? @use_editor_js = true : @use_editor_js = false
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def copy_files
|
27
|
+
directory "erb", "app/views/admin/#{file_name.pluralize}"
|
28
|
+
|
29
|
+
template "controller.rb", "app/controllers/admin/#{controller_file_name}_controller.rb"
|
30
|
+
|
31
|
+
template "functional_test.rb", "test/controllers/admin/#{controller_file_name}_controller_test.rb"
|
32
|
+
end
|
33
|
+
|
34
|
+
def create_routes
|
35
|
+
route "resources :#{file_name.pluralize}", namespace: :admin
|
36
|
+
end
|
37
|
+
|
38
|
+
def navigation_link
|
39
|
+
insert_into_file "app/views/admin/base/_secondary_navbar_links.html.erb", "\n" + <<-EOF
|
40
|
+
<!-- Link for #{file_name.pluralize.capitalize} -->
|
41
|
+
<li class="nav-item <%= active_nav_item("admin/#{file_name.pluralize}") %>">
|
42
|
+
<%= link_to admin_#{file_name.pluralize}_path, class: "nav-link" do %>
|
43
|
+
<span class="nav-link-icon d-md-none d-lg-inline-block">
|
44
|
+
<!-- Replace this icon with icon from https://tabler.io/icons -->
|
45
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-info-hexagon"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M19.875 6.27c.7 .398 1.13 1.143 1.125 1.948v7.284c0 .809 -.443 1.555 -1.158 1.948l-6.75 4.27a2.269 2.269 0 0 1 -2.184 0l-6.75 -4.27a2.225 2.225 0 0 1 -1.158 -1.948v-7.285c0 -.809 .443 -1.554 1.158 -1.947l6.75 -3.98a2.33 2.33 0 0 1 2.25 0l6.75 3.98h-.033z" /><path d="M12 9h.01" /><path d="M11 12h1v4h1" /></svg>
|
46
|
+
</span>
|
47
|
+
<span class="nav-link-title">
|
48
|
+
#{file_name.pluralize.capitalize}
|
49
|
+
</span>
|
50
|
+
<% end %>
|
51
|
+
</li>
|
52
|
+
EOF
|
53
|
+
|
54
|
+
if behavior == :revoke
|
55
|
+
regexp = /<!-- Link for #{file_name.pluralize.capitalize}(?:\s*>|\s+(?:(?:[^=\s]*?(?:=(?:(?:"[^"]*?")|(?:'[^']*?')))?)\s*)*>).*?<\/\s*li>/mi
|
56
|
+
gsub_file "app/views/admin/base/_secondary_navbar_links.html.erb", regexp, "", force: true
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def add_ransackable_attributes_to_model
|
61
|
+
file = "app/models/#{singular_table_name}.rb"
|
62
|
+
insertion = " def self.ransackable_attributes(auth_object = nil)\n #{attributes_to_array_string}\n end\n"
|
63
|
+
if File.exist?(file)
|
64
|
+
inject_into_class file, "#{singular_table_name.capitalize}", insertion
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
def controller_class_path
|
70
|
+
[ "admin" ]
|
71
|
+
end
|
72
|
+
|
73
|
+
def singular_route_name
|
74
|
+
"#{controller_class_path.join('_')}_#{singular_table_name}"
|
75
|
+
end
|
76
|
+
|
77
|
+
def plural_route_name
|
78
|
+
"#{controller_class_path.join('_')}_#{plural_table_name}"
|
79
|
+
end
|
80
|
+
|
81
|
+
def model_resource_name(base_name = singular_table_name, prefix: "")
|
82
|
+
"[#{controller_class_path.map { |name| ":" + name }.join(", ")}, #{prefix}#{base_name}]"
|
83
|
+
end
|
84
|
+
|
85
|
+
def permitted_params
|
86
|
+
attachments, others = attributes_names.partition { |name| attachments?(name) }
|
87
|
+
params = others.map { |name| ":#{name}" }
|
88
|
+
params += attachments.map { |name| "#{name}: []" }
|
89
|
+
params.join(", ")
|
90
|
+
end
|
91
|
+
|
92
|
+
def attachments?(name)
|
93
|
+
attribute = attributes.find { |attr| attr.name == name }
|
94
|
+
attribute&.attachments?
|
95
|
+
end
|
96
|
+
|
97
|
+
def fixture_name
|
98
|
+
table_name
|
99
|
+
end
|
100
|
+
|
101
|
+
def attributes_string
|
102
|
+
attributes_hash.map { |k, v| "#{k}: #{v}" }.join(", ")
|
103
|
+
end
|
104
|
+
|
105
|
+
def attributes_to_array_string
|
106
|
+
'%w[' + attributes_hash.map { |k, _| "#{k}" }.join(" ") + ']'
|
107
|
+
end
|
108
|
+
|
109
|
+
def attributes_hash
|
110
|
+
return {} if attributes_names.empty?
|
111
|
+
|
112
|
+
attributes_names.filter_map do |name|
|
113
|
+
if %w(password password_confirmation).include?(name) && attributes.any?(&:password_digest?)
|
114
|
+
["#{name}", '"secret"']
|
115
|
+
elsif !virtual?(name)
|
116
|
+
["#{name}", "@#{singular_table_name}.#{name}"]
|
117
|
+
end
|
118
|
+
end.sort.to_h
|
119
|
+
end
|
120
|
+
|
121
|
+
def boolean?(name)
|
122
|
+
attribute = attributes.find { |attr| attr.name == name }
|
123
|
+
attribute&.type == :boolean
|
124
|
+
end
|
125
|
+
|
126
|
+
def virtual?(name)
|
127
|
+
attribute = attributes.find { |attr| attr.name == name }
|
128
|
+
attribute&.virtual?
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
class <%= controller_class_name %>Controller < Admin::BaseController
|
2
|
+
before_action :set_<%= singular_table_name %>, only: %i[ show edit update destroy ]
|
3
|
+
|
4
|
+
def index
|
5
|
+
@search = <%= orm_class.all(class_name) %>.ransack(params[:q])
|
6
|
+
|
7
|
+
respond_to do |format|
|
8
|
+
format.html { @pagy, @<%= plural_table_name %> = pagy(@search.result) }
|
9
|
+
format.csv { render csv: @search.result }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def show
|
14
|
+
end
|
15
|
+
|
16
|
+
def new
|
17
|
+
@<%= singular_table_name %> = <%= orm_class.build(class_name) %>
|
18
|
+
end
|
19
|
+
|
20
|
+
def edit
|
21
|
+
end
|
22
|
+
|
23
|
+
def create
|
24
|
+
@<%= singular_table_name %> = <%= orm_class.build(class_name, "#{singular_table_name}_params") %>
|
25
|
+
|
26
|
+
if @<%= orm_instance.save %>
|
27
|
+
redirect_to <%= redirect_resource_name %>, notice: <%= %("#{human_name} was successfully created.") %>
|
28
|
+
else
|
29
|
+
render :new, status: :unprocessable_entity
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def update
|
34
|
+
if @<%= orm_instance.update("#{singular_table_name}_params") %>
|
35
|
+
redirect_to <%= redirect_resource_name %>, notice: <%= %("#{human_name} was successfully updated.") %>
|
36
|
+
else
|
37
|
+
render :edit, status: :unprocessable_entity
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def destroy
|
42
|
+
@<%= orm_instance.destroy %>
|
43
|
+
redirect_to <%= index_helper %>_url, notice: <%= %("#{human_name} was successfully destroyed.") %>, status: :see_other
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
def set_<%= singular_table_name %>
|
48
|
+
@<%= singular_table_name %> = <%= orm_class.find(class_name, "params[:id]") %>
|
49
|
+
end
|
50
|
+
|
51
|
+
def <%= "#{singular_table_name}_params" %>
|
52
|
+
<%- if attributes_names.empty? -%>
|
53
|
+
params.fetch(:<%= singular_table_name %>, {})
|
54
|
+
<%- else -%>
|
55
|
+
params.require(:<%= singular_table_name %>).permit(<%= permitted_params %>)
|
56
|
+
<%- end -%>
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
<% if @use_editor_js == true %>
|
2
|
+
<%%= form_with(model: <%= model_resource_name %>, data: { controller: "editorjs" }, :html => {:novalidate => true}) do |form| %>
|
3
|
+
<% else %>
|
4
|
+
<%%= form_with(model: <%= model_resource_name %>) do |form| %>
|
5
|
+
<% end %>
|
6
|
+
|
7
|
+
<%%= render "admin/base/form_errors_messages", resource: <%= singular_table_name %> %>
|
8
|
+
|
9
|
+
<% attributes.each do |attribute| -%>
|
10
|
+
<div class="form-group row mb-2">
|
11
|
+
<% if attribute.name == "content" && @use_editor_js == true %>
|
12
|
+
<%%= form.label :content, class: "form-label col-md-3 col-form-label" %>
|
13
|
+
<%%= form.hidden_field :content, id: "editorjs_content_hidden" %>
|
14
|
+
<div class="col-md px-0 py-3" id="editorjs_content" data-editor-target="editorjs_content">
|
15
|
+
</div>
|
16
|
+
<% elsif attribute.password_digest? -%>
|
17
|
+
<%%= form.label :password, class: "form-label col-md-3 col-form-label" %>
|
18
|
+
<div class="col-md px-0">
|
19
|
+
<%%= form.password_field :password, required: true, autocomplete: "new-password", class: "form-control" %>
|
20
|
+
</div>
|
21
|
+
</div>
|
22
|
+
|
23
|
+
<div class="col-md px-0">
|
24
|
+
<%%= form.password_field :password_confirmation, required: true, autocomplete: "new-password", class: "form-control" %>
|
25
|
+
<% elsif attribute.attachments? -%>
|
26
|
+
<%%= form.label :<%= attribute.column_name %>, class: "form-label col-md-3 col-form-label" %>
|
27
|
+
<div class="col-md px-0">
|
28
|
+
<%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, multiple: true, class: "form-control" %>
|
29
|
+
</div>
|
30
|
+
<% elsif attribute.field_type == :checkbox -%>
|
31
|
+
<%%= form.label :<%= attribute.column_name %>, class: "form-check-label col-md-3 col-form-label" %>
|
32
|
+
<div class="col-md px-0">
|
33
|
+
<%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, class: "form-check-input" %>
|
34
|
+
</div>
|
35
|
+
<% else -%>
|
36
|
+
<%%= form.label :<%= attribute.column_name %>, class: "form-label col-md-3 col-form-label" %>
|
37
|
+
<div class="col-md px-0">
|
38
|
+
<%%= form.<%= attribute.field_type %> :<%= attribute.column_name %>, class: "form-control" %>
|
39
|
+
</div>
|
40
|
+
<% end -%>
|
41
|
+
</div>
|
42
|
+
|
43
|
+
<% end -%>
|
44
|
+
<div class="form-footer">
|
45
|
+
<%%= form.submit class: "btn btn-primary" %>
|
46
|
+
<%%= link_to "Cancel", <%= index_helper(type: :path) %>, class: "btn btn-white" %>
|
47
|
+
</div>
|
48
|
+
<%% end %>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<%%= render "page_header" do %>
|
2
|
+
<%%= render "page_header_breadcrumb", title: "Editing <%= human_name.downcase %>" do %>
|
3
|
+
<li class="breadcrumb-item"><%%= link_to "Admin", admin_root_path %></li>
|
4
|
+
<li class="breadcrumb-item"><%%= link_to "<%= human_name.pluralize %>", <%= index_helper(type: :path) %> %></li>
|
5
|
+
<li class="breadcrumb-item"><%%= link_to "Show this <%= human_name.downcase %>", <%= model_resource_name(prefix: "@") %> %></li>
|
6
|
+
<%% end %>
|
7
|
+
<%% end %>
|
8
|
+
|
9
|
+
<div class="page-body">
|
10
|
+
<div class="container-xl">
|
11
|
+
<div class="card">
|
12
|
+
<div class="card-body">
|
13
|
+
<%%= render "form", <%= singular_table_name %>: @<%= singular_table_name %> %>
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
</div>
|
17
|
+
</div>
|
@@ -0,0 +1,76 @@
|
|
1
|
+
<%%= render "page_header" do %>
|
2
|
+
<%%= render "page_header_breadcrumb", title: "<%= human_name.pluralize %>" do %>
|
3
|
+
<li class="breadcrumb-item"><%%= link_to "Admin", admin_root_path %></li>
|
4
|
+
<%% end %>
|
5
|
+
|
6
|
+
<%%= render "page_header_actions" do %>
|
7
|
+
<%%= link_to "Filters", "#offcanvas_filters", "data-bs-toggle": "offcanvas", class: "btn btn-white" %>
|
8
|
+
<%%= link_to "New <%= human_name.downcase %>", <%= new_helper(type: :path) %>, class: "btn btn-primary" %>
|
9
|
+
<%% end %>
|
10
|
+
<%% end %>
|
11
|
+
|
12
|
+
<div class="page-body">
|
13
|
+
<div class="container-xl">
|
14
|
+
<div class="card">
|
15
|
+
<div class="table-responsive">
|
16
|
+
<table class="table table-vcenter table-nowrap card-table table-striped">
|
17
|
+
<thead>
|
18
|
+
<tr>
|
19
|
+
<% attributes.each do |attribute| -%>
|
20
|
+
<th><%%= sort_link @search, :<%= attribute.column_name %> %></th>
|
21
|
+
<% end -%>
|
22
|
+
<th class="w-1"></th>
|
23
|
+
</tr>
|
24
|
+
</thead>
|
25
|
+
<tbody>
|
26
|
+
<%% @<%= plural_table_name %>.each do |<%= singular_table_name %>| %>
|
27
|
+
<tr>
|
28
|
+
<% attributes.reject(&:password_digest?).each do |attribute| -%>
|
29
|
+
<% if attribute.attachment? -%>
|
30
|
+
<td><%%= link_to <%= singular_name %>.<%= attribute.column_name %>.filename, <%= singular_name %>.<%= attribute.column_name %> if <%= singular_name %>.<%= attribute.column_name %>.attached? %></td>
|
31
|
+
<% elsif attribute.attachments? -%>
|
32
|
+
<%% <%= singular_name %>.<%= attribute.column_name %>.each do |<%= attribute.singular_name %>| %>
|
33
|
+
<td><%%= link_to <%= attribute.singular_name %>.filename, <%= attribute.singular_name %> %></td>
|
34
|
+
<%% end %>
|
35
|
+
<% elsif attribute.name == "content" && @use_editor_js == true %>
|
36
|
+
<td class="col-md-9"><%%= EJSParser::summary_for_ejs_content(content: <%= singular_name %>.content, truncate: 400)%></td>
|
37
|
+
<% else -%>
|
38
|
+
<td><%%= <%= singular_name %>.<%= attribute.column_name %> %></td>
|
39
|
+
<% end -%>
|
40
|
+
<% end -%>
|
41
|
+
<td>
|
42
|
+
<%%= link_to "View", <%= model_resource_name %>, class: "btn btn-white btn-sm" %>
|
43
|
+
<%%= link_to "Edit", <%= edit_helper(singular_table_name, type: :path) %>, class: "btn btn-white btn-sm" %>
|
44
|
+
<%%= link_to "Delete", <%= model_resource_name %>, class: "btn btn-white btn-sm", data: { turbo_method: :delete, turbo_confirm: "Are you sure?" } %>
|
45
|
+
</td>
|
46
|
+
</tr>
|
47
|
+
<%% end %>
|
48
|
+
</tbody>
|
49
|
+
</table>
|
50
|
+
</div>
|
51
|
+
<div class="card-footer d-flex align-items-center fs-5">
|
52
|
+
<div class="d-none d-md-block">
|
53
|
+
<div>Download: <%%= link_to "CSV", url_for(format: :csv, q: request.params[:q]) %></div>
|
54
|
+
<%%== pagy_info(@pagy) %>
|
55
|
+
</div>
|
56
|
+
<div class="ms-auto">
|
57
|
+
<%%== pagy_bootstrap_nav(@pagy) %>
|
58
|
+
</div>
|
59
|
+
</div>
|
60
|
+
</div>
|
61
|
+
</div>
|
62
|
+
</div>
|
63
|
+
|
64
|
+
<div id="offcanvas_filters" tabindex="-1" class="offcanvas offcanvas-end">
|
65
|
+
<div class="offcanvas-header">
|
66
|
+
<h2 class="offcanvas-title">Filters</h2>
|
67
|
+
<button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas"></button>
|
68
|
+
</div>
|
69
|
+
<%%= search_form_for [:admin, @search], class: "offcanvas-body" do |f| %>
|
70
|
+
<%%# f.label :name_cont, class: "form-label" %>
|
71
|
+
<%%# f.text_field :name_cont, class: "form-control mb-3" %>
|
72
|
+
|
73
|
+
<%%= f.submit "Filter", class: "btn btn-primary" %>
|
74
|
+
<%%= link_to "Clear Filter", <%= index_helper(type: :path) %>, class: "btn btn-white" %>
|
75
|
+
<%% end %>
|
76
|
+
</div>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<%%= render "page_header" do %>
|
2
|
+
<%%= render "page_header_breadcrumb", title: "New <%= human_name.downcase %>" do %>
|
3
|
+
<li class="breadcrumb-item"><%%= link_to "Admin", admin_root_path %></li>
|
4
|
+
<li class="breadcrumb-item"><%%= link_to "<%= human_name.pluralize %>", <%= index_helper(type: :path) %> %></li>
|
5
|
+
<%% end %>
|
6
|
+
<%% end %>
|
7
|
+
|
8
|
+
<div class="page-body">
|
9
|
+
<div class="container-xl">
|
10
|
+
<div class="card">
|
11
|
+
<div class="card-body">
|
12
|
+
<%%= render "form", <%= singular_table_name %>: @<%= singular_table_name %> %>
|
13
|
+
</div>
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
</div>
|
@@ -0,0 +1,39 @@
|
|
1
|
+
<%%= render "page_header" do %>
|
2
|
+
<%%= render "page_header_breadcrumb", title: "Showing <%= human_name.downcase %>" do %>
|
3
|
+
<li class="breadcrumb-item"><%%= link_to "Admin", admin_root_path %></li>
|
4
|
+
<li class="breadcrumb-item"><%%= link_to "<%= human_name.pluralize %>", <%= index_helper(type: :path) %> %></li>
|
5
|
+
<%% end %>
|
6
|
+
|
7
|
+
<%%= render "page_header_actions" do %>
|
8
|
+
<%%= link_to "Edit <%= human_name.downcase %>", <%= edit_helper(type: :path) %>, class: "btn btn-primary" %>
|
9
|
+
<%%= link_to "Delete <%= human_name.downcase %>", <%= model_resource_name(prefix: "@") %>, class: "btn btn-white", data: { turbo_method: :delete, turbo_confirm: "Are you sure?" } %>
|
10
|
+
<%% end %>
|
11
|
+
<%% end %>
|
12
|
+
|
13
|
+
<div class="page-body">
|
14
|
+
<div class="container-xl">
|
15
|
+
<div class="card">
|
16
|
+
<div class="card-header">
|
17
|
+
<h3 class="card-title"><%= human_name %> details</h3>
|
18
|
+
</div>
|
19
|
+
<div class="card-body">
|
20
|
+
<dl class="row">
|
21
|
+
<% attributes.reject(&:password_digest?).each do |attribute| -%>
|
22
|
+
<dt class="col-md-3"><%= attribute.human_name %></dt>
|
23
|
+
<% if attribute.attachment? -%>
|
24
|
+
<dd class="col-md-9"><%%= link_to <%= singular_name %>.<%= attribute.column_name %>.filename, <%= singular_name %>.<%= attribute.column_name %> if <%= singular_name %>.<%= attribute.column_name %>.attached? %></dd>
|
25
|
+
<% elsif attribute.attachments? -%>
|
26
|
+
<%% <%= singular_name %>.<%= attribute.column_name %>.each do |<%= attribute.singular_name %>| %>
|
27
|
+
<dd class="col-md-9"><%%= link_to <%= attribute.singular_name %>.filename, <%= attribute.singular_name %> %></dd>
|
28
|
+
<%% end %>
|
29
|
+
<% elsif attribute.name == "content" && @use_editor_js == true %>
|
30
|
+
<dd class="col-md-9"><%%= EJSParser::build_html_from_ejs_content(content: @<%= singular_name %>.content)%></dd>
|
31
|
+
<% else -%>
|
32
|
+
<dd class="col-md-9"><%%= @<%= singular_name %>.<%= attribute.column_name %>%></dd>
|
33
|
+
<% end -%>
|
34
|
+
<% end -%>
|
35
|
+
</dl>
|
36
|
+
</div>
|
37
|
+
</div>
|
38
|
+
</div>
|
39
|
+
</div>
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class <%= controller_class_name %>ControllerTest < ActionDispatch::IntegrationTest
|
4
|
+
<%- if mountable_engine? -%>
|
5
|
+
include Engine.routes.url_helpers
|
6
|
+
|
7
|
+
<%- end -%>
|
8
|
+
setup do
|
9
|
+
@admin_user = sign_in_as_admin_user users(:admin)
|
10
|
+
@<%= singular_table_name %> = <%= fixture_name %>(:one)
|
11
|
+
end
|
12
|
+
|
13
|
+
test "should get index" do
|
14
|
+
get <%= index_helper(type: :url) %>
|
15
|
+
assert_response :success
|
16
|
+
end
|
17
|
+
|
18
|
+
test "should get new" do
|
19
|
+
get <%= new_helper %>
|
20
|
+
assert_response :success
|
21
|
+
end
|
22
|
+
|
23
|
+
test "should create <%= singular_table_name %>" do
|
24
|
+
assert_difference("<%= class_name %>.count") do
|
25
|
+
post <%= index_helper(type: :url) %>, params: { <%= "#{singular_table_name}: { #{attributes_string} }" %> }
|
26
|
+
end
|
27
|
+
|
28
|
+
assert_redirected_to <%= show_helper("#{class_name}.last") %>
|
29
|
+
end
|
30
|
+
|
31
|
+
test "should show <%= singular_table_name %>" do
|
32
|
+
get <%= show_helper %>
|
33
|
+
assert_response :success
|
34
|
+
end
|
35
|
+
|
36
|
+
test "should get edit" do
|
37
|
+
get <%= edit_helper %>
|
38
|
+
assert_response :success
|
39
|
+
end
|
40
|
+
|
41
|
+
test "should update <%= singular_table_name %>" do
|
42
|
+
patch <%= show_helper %>, params: { <%= "#{singular_table_name}: { #{attributes_string} }" %> }
|
43
|
+
assert_redirected_to <%= show_helper %>
|
44
|
+
end
|
45
|
+
|
46
|
+
test "should destroy <%= singular_table_name %>" do
|
47
|
+
assert_difference("<%= class_name %>.count", -1) do
|
48
|
+
delete <%= show_helper %>
|
49
|
+
end
|
50
|
+
|
51
|
+
assert_redirected_to <%= index_helper(type: :url) %>
|
52
|
+
end
|
53
|
+
end
|
metadata
ADDED
@@ -0,0 +1,124 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: administration-one
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Alexey Beregovoy
|
8
|
+
bindir: bin
|
9
|
+
cert_chain: []
|
10
|
+
date: 2025-05-15 00:00:00.000000000 Z
|
11
|
+
dependencies: []
|
12
|
+
email:
|
13
|
+
- thismailis4spam@icloud.com
|
14
|
+
executables: []
|
15
|
+
extensions: []
|
16
|
+
extra_rdoc_files: []
|
17
|
+
files:
|
18
|
+
- ".dockerignore"
|
19
|
+
- ".gitattributes"
|
20
|
+
- ".gitignore"
|
21
|
+
- ".rubocop.yml"
|
22
|
+
- ".ruby-version"
|
23
|
+
- CHANGELOG.md
|
24
|
+
- Gemfile
|
25
|
+
- Gemfile.lock
|
26
|
+
- LICENSE.txt
|
27
|
+
- README.md
|
28
|
+
- Rakefile
|
29
|
+
- administration_one.gemspec
|
30
|
+
- lib/administration-one.rb
|
31
|
+
- lib/administration_one.rb
|
32
|
+
- lib/administration_one/version.rb
|
33
|
+
- lib/generators/admin/install/USAGE
|
34
|
+
- lib/generators/admin/install/install_generator.rb
|
35
|
+
- lib/generators/admin/install/templates/controllers/admin/base_controller.rb
|
36
|
+
- lib/generators/admin/install/templates/controllers/admin/home_controller.rb
|
37
|
+
- lib/generators/admin/install/templates/controllers/admin/passwords_controller.rb
|
38
|
+
- lib/generators/admin/install/templates/controllers/admin/profile_controller.rb
|
39
|
+
- lib/generators/admin/install/templates/controllers/admin/sessions_controller.rb
|
40
|
+
- lib/generators/admin/install/templates/controllers/admin/users_controller.rb
|
41
|
+
- lib/generators/admin/install/templates/css/custom.css
|
42
|
+
- lib/generators/admin/install/templates/erb/admin/base/_ejs_tags.html.erb
|
43
|
+
- lib/generators/admin/install/templates/erb/admin/base/_flash_messages.html.erb
|
44
|
+
- lib/generators/admin/install/templates/erb/admin/base/_footer.html.erb
|
45
|
+
- lib/generators/admin/install/templates/erb/admin/base/_form_errors_messages.html.erb
|
46
|
+
- lib/generators/admin/install/templates/erb/admin/base/_javascript_tags.html.erb
|
47
|
+
- lib/generators/admin/install/templates/erb/admin/base/_page_header.html.erb
|
48
|
+
- lib/generators/admin/install/templates/erb/admin/base/_page_header_actions.html.erb
|
49
|
+
- lib/generators/admin/install/templates/erb/admin/base/_page_header_breadcrumb.html.erb
|
50
|
+
- lib/generators/admin/install/templates/erb/admin/base/_primary_navbar.html.erb
|
51
|
+
- lib/generators/admin/install/templates/erb/admin/base/_secondary_navbar.html.erb
|
52
|
+
- lib/generators/admin/install/templates/erb/admin/base/_secondary_navbar_links.html.erb
|
53
|
+
- lib/generators/admin/install/templates/erb/admin/base/_stylesheet_link_tags.html.erb
|
54
|
+
- lib/generators/admin/install/templates/erb/admin/home/index.html.erb
|
55
|
+
- lib/generators/admin/install/templates/erb/admin/passwords/edit.html.erb
|
56
|
+
- lib/generators/admin/install/templates/erb/admin/passwords/new.html.erb
|
57
|
+
- lib/generators/admin/install/templates/erb/admin/profile/edit.html.erb
|
58
|
+
- lib/generators/admin/install/templates/erb/admin/profile/show.html.erb
|
59
|
+
- lib/generators/admin/install/templates/erb/admin/sessions/new.html.erb
|
60
|
+
- lib/generators/admin/install/templates/erb/admin/users/_form.html.erb
|
61
|
+
- lib/generators/admin/install/templates/erb/admin/users/edit.html.erb
|
62
|
+
- lib/generators/admin/install/templates/erb/admin/users/index.html.erb
|
63
|
+
- lib/generators/admin/install/templates/erb/admin/users/new.html.erb
|
64
|
+
- lib/generators/admin/install/templates/erb/admin/users/show.html.erb
|
65
|
+
- lib/generators/admin/install/templates/erb/layouts/admin/authentication.html.erb
|
66
|
+
- lib/generators/admin/install/templates/erb/layouts/admin/base.html.erb
|
67
|
+
- lib/generators/admin/install/templates/helpers/admin/application_helper.rb
|
68
|
+
- lib/generators/admin/install/templates/images/admin/default_avatar.png
|
69
|
+
- lib/generators/admin/install/templates/images/admin/logo.svg
|
70
|
+
- lib/generators/admin/install/templates/jobs/attach_avatar_to_user_job.rb
|
71
|
+
- lib/generators/admin/install/templates/js/editor.js
|
72
|
+
- lib/generators/admin/install/templates/js/flash_message.js
|
73
|
+
- lib/generators/admin/install/templates/js/stimulus.js
|
74
|
+
- lib/generators/admin/install/templates/js/theme_switcher.js
|
75
|
+
- lib/generators/admin/install/templates/js/time_zone.js
|
76
|
+
- lib/generators/admin/install/templates/migrations/create_users.rb.tt
|
77
|
+
- lib/generators/admin/install/templates/models/admin/application_record.rb
|
78
|
+
- lib/generators/admin/install/templates/models/application_record.rb
|
79
|
+
- lib/generators/admin/install/templates/models/user.rb
|
80
|
+
- lib/generators/admin/install/templates/modules/ejs_parser.rb
|
81
|
+
- lib/generators/admin/install/templates/passwords_mailer/reset_admin.html.erb
|
82
|
+
- lib/generators/admin/install/templates/passwords_mailer/reset_admin.text.erb
|
83
|
+
- lib/generators/admin/install/templates/seeds.rb
|
84
|
+
- lib/generators/admin/install/templates/test_unit/controllers/admin/home_controller_test.rb
|
85
|
+
- lib/generators/admin/install/templates/test_unit/controllers/admin/profile_controller_test.rb
|
86
|
+
- lib/generators/admin/install/templates/test_unit/controllers/admin/sessions_controller_test.rb
|
87
|
+
- lib/generators/admin/install/templates/test_unit/controllers/admin/users_controller_test.rb
|
88
|
+
- lib/generators/admin/install/templates/test_unit/models/user_test.rb
|
89
|
+
- lib/generators/admin/install/templates/test_unit/test_helper.rb
|
90
|
+
- lib/generators/admin/install/templates/test_unit/users.yml
|
91
|
+
- lib/generators/admin/scaffold/USAGE
|
92
|
+
- lib/generators/admin/scaffold/scaffold_generator.rb
|
93
|
+
- lib/generators/admin/scaffold/templates/controller.rb.tt
|
94
|
+
- lib/generators/admin/scaffold/templates/erb/_form.html.erb.tt
|
95
|
+
- lib/generators/admin/scaffold/templates/erb/edit.html.erb.tt
|
96
|
+
- lib/generators/admin/scaffold/templates/erb/index.html.erb.tt
|
97
|
+
- lib/generators/admin/scaffold/templates/erb/new.html.erb.tt
|
98
|
+
- lib/generators/admin/scaffold/templates/erb/show.html.erb.tt
|
99
|
+
- lib/generators/admin/scaffold/templates/functional_test.rb.tt
|
100
|
+
homepage: https://github.com/LawfulEvilRaccoon/administration-one
|
101
|
+
licenses:
|
102
|
+
- MIT
|
103
|
+
metadata:
|
104
|
+
homepage_uri: https://github.com/LawfulEvilRaccoon/administration-one
|
105
|
+
source_code_uri: https://github.com/LawfulEvilRaccoon/administration-one
|
106
|
+
changelog_uri: https://github.com/LawfulEvilRaccoon/administration-one/blob/main/CHANGELOG.md
|
107
|
+
rdoc_options: []
|
108
|
+
require_paths:
|
109
|
+
- lib
|
110
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
111
|
+
requirements:
|
112
|
+
- - ">="
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: '0'
|
115
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
116
|
+
requirements:
|
117
|
+
- - ">="
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '0'
|
120
|
+
requirements: []
|
121
|
+
rubygems_version: 3.6.2
|
122
|
+
specification_version: 4
|
123
|
+
summary: An administration system generator for Rails applications
|
124
|
+
test_files: []
|