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.
Files changed (84) hide show
  1. checksums.yaml +7 -0
  2. data/.dockerignore +51 -0
  3. data/.gitattributes +9 -0
  4. data/.gitignore +37 -0
  5. data/.rubocop.yml +8 -0
  6. data/.ruby-version +1 -0
  7. data/CHANGELOG.md +2 -0
  8. data/Gemfile +8 -0
  9. data/Gemfile.lock +21 -0
  10. data/LICENSE.txt +21 -0
  11. data/README.md +52 -0
  12. data/Rakefile +4 -0
  13. data/administration_one.gemspec +22 -0
  14. data/lib/administration-one.rb +1 -0
  15. data/lib/administration_one/version.rb +3 -0
  16. data/lib/administration_one.rb +4 -0
  17. data/lib/generators/admin/install/USAGE +5 -0
  18. data/lib/generators/admin/install/install_generator.rb +142 -0
  19. data/lib/generators/admin/install/templates/controllers/admin/base_controller.rb +20 -0
  20. data/lib/generators/admin/install/templates/controllers/admin/home_controller.rb +4 -0
  21. data/lib/generators/admin/install/templates/controllers/admin/passwords_controller.rb +35 -0
  22. data/lib/generators/admin/install/templates/controllers/admin/profile_controller.rb +23 -0
  23. data/lib/generators/admin/install/templates/controllers/admin/sessions_controller.rb +24 -0
  24. data/lib/generators/admin/install/templates/controllers/admin/users_controller.rb +54 -0
  25. data/lib/generators/admin/install/templates/css/custom.css +85 -0
  26. data/lib/generators/admin/install/templates/erb/admin/base/_ejs_tags.html.erb +8 -0
  27. data/lib/generators/admin/install/templates/erb/admin/base/_flash_messages.html.erb +9 -0
  28. data/lib/generators/admin/install/templates/erb/admin/base/_footer.html.erb +34 -0
  29. data/lib/generators/admin/install/templates/erb/admin/base/_form_errors_messages.html.erb +10 -0
  30. data/lib/generators/admin/install/templates/erb/admin/base/_javascript_tags.html.erb +5 -0
  31. data/lib/generators/admin/install/templates/erb/admin/base/_page_header.html.erb +7 -0
  32. data/lib/generators/admin/install/templates/erb/admin/base/_page_header_actions.html.erb +5 -0
  33. data/lib/generators/admin/install/templates/erb/admin/base/_page_header_breadcrumb.html.erb +12 -0
  34. data/lib/generators/admin/install/templates/erb/admin/base/_primary_navbar.html.erb +63 -0
  35. data/lib/generators/admin/install/templates/erb/admin/base/_secondary_navbar.html.erb +12 -0
  36. data/lib/generators/admin/install/templates/erb/admin/base/_secondary_navbar_links.html.erb +20 -0
  37. data/lib/generators/admin/install/templates/erb/admin/base/_stylesheet_link_tags.html.erb +5 -0
  38. data/lib/generators/admin/install/templates/erb/admin/home/index.html.erb +8 -0
  39. data/lib/generators/admin/install/templates/erb/admin/passwords/edit.html.erb +16 -0
  40. data/lib/generators/admin/install/templates/erb/admin/passwords/new.html.erb +11 -0
  41. data/lib/generators/admin/install/templates/erb/admin/profile/edit.html.erb +48 -0
  42. data/lib/generators/admin/install/templates/erb/admin/profile/show.html.erb +22 -0
  43. data/lib/generators/admin/install/templates/erb/admin/sessions/new.html.erb +21 -0
  44. data/lib/generators/admin/install/templates/erb/admin/users/_form.html.erb +48 -0
  45. data/lib/generators/admin/install/templates/erb/admin/users/edit.html.erb +17 -0
  46. data/lib/generators/admin/install/templates/erb/admin/users/index.html.erb +78 -0
  47. data/lib/generators/admin/install/templates/erb/admin/users/new.html.erb +16 -0
  48. data/lib/generators/admin/install/templates/erb/admin/users/show.html.erb +33 -0
  49. data/lib/generators/admin/install/templates/erb/layouts/admin/authentication.html.erb +32 -0
  50. data/lib/generators/admin/install/templates/erb/layouts/admin/base.html.erb +31 -0
  51. data/lib/generators/admin/install/templates/helpers/admin/application_helper.rb +25 -0
  52. data/lib/generators/admin/install/templates/images/admin/default_avatar.png +0 -0
  53. data/lib/generators/admin/install/templates/images/admin/logo.svg +4 -0
  54. data/lib/generators/admin/install/templates/jobs/attach_avatar_to_user_job.rb +21 -0
  55. data/lib/generators/admin/install/templates/js/editor.js +101 -0
  56. data/lib/generators/admin/install/templates/js/flash_message.js +5 -0
  57. data/lib/generators/admin/install/templates/js/stimulus.js +3 -0
  58. data/lib/generators/admin/install/templates/js/theme_switcher.js +93 -0
  59. data/lib/generators/admin/install/templates/js/time_zone.js +3 -0
  60. data/lib/generators/admin/install/templates/migrations/create_users.rb.tt +15 -0
  61. data/lib/generators/admin/install/templates/models/admin/application_record.rb +3 -0
  62. data/lib/generators/admin/install/templates/models/application_record.rb +3 -0
  63. data/lib/generators/admin/install/templates/models/user.rb +34 -0
  64. data/lib/generators/admin/install/templates/modules/ejs_parser.rb +119 -0
  65. data/lib/generators/admin/install/templates/passwords_mailer/reset_admin.html.erb +4 -0
  66. data/lib/generators/admin/install/templates/passwords_mailer/reset_admin.text.erb +2 -0
  67. data/lib/generators/admin/install/templates/seeds.rb +12 -0
  68. data/lib/generators/admin/install/templates/test_unit/controllers/admin/home_controller_test.rb +12 -0
  69. data/lib/generators/admin/install/templates/test_unit/controllers/admin/profile_controller_test.rb +26 -0
  70. data/lib/generators/admin/install/templates/test_unit/controllers/admin/sessions_controller_test.rb +36 -0
  71. data/lib/generators/admin/install/templates/test_unit/controllers/admin/users_controller_test.rb +55 -0
  72. data/lib/generators/admin/install/templates/test_unit/models/user_test.rb +34 -0
  73. data/lib/generators/admin/install/templates/test_unit/test_helper.rb +25 -0
  74. data/lib/generators/admin/install/templates/test_unit/users.yml +13 -0
  75. data/lib/generators/admin/scaffold/USAGE +5 -0
  76. data/lib/generators/admin/scaffold/scaffold_generator.rb +132 -0
  77. data/lib/generators/admin/scaffold/templates/controller.rb.tt +58 -0
  78. data/lib/generators/admin/scaffold/templates/erb/_form.html.erb.tt +48 -0
  79. data/lib/generators/admin/scaffold/templates/erb/edit.html.erb.tt +17 -0
  80. data/lib/generators/admin/scaffold/templates/erb/index.html.erb.tt +76 -0
  81. data/lib/generators/admin/scaffold/templates/erb/new.html.erb.tt +16 -0
  82. data/lib/generators/admin/scaffold/templates/erb/show.html.erb.tt +39 -0
  83. data/lib/generators/admin/scaffold/templates/functional_test.rb.tt +53 -0
  84. 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,5 @@
1
+ Description:
2
+ Explain the generator
3
+
4
+ Example:
5
+ bin/rails generate admin:scaffold model field:type field:type
@@ -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: []