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,8 @@
1
+ <script src="https://cdn.jsdelivr.net/npm/@editorjs/editorjs/dist/editorjs.umd.min.js"></script>
2
+ <script src="https://cdn.jsdelivr.net/npm/@editorjs/image/dist/image.umd.min.js"></script>
3
+ <script src="https://cdn.jsdelivr.net/npm/@editorjs/code/dist/code.umd.min.js"></script>
4
+ <script src="https://cdn.jsdelivr.net/npm/@editorjs/header/dist/header.umd.min.js"></script>
5
+ <script src="https://cdn.jsdelivr.net/npm/@editorjs/list/dist/editorjs-list.umd.min.js"></script>
6
+ <script src="https://cdn.jsdelivr.net/npm/@editorjs/paragraph/dist/paragraph.umd.min.js"></script>
7
+ <script src="https://cdn.jsdelivr.net/npm/@editorjs/quote/dist/quote.umd.min.js"></script>
8
+ <script src="https://cdn.jsdelivr.net/npm/@editorjs/delimiter@1.4.2/dist/delimiter.umd.min.js"></script>
@@ -0,0 +1,9 @@
1
+ <div class="flash-messages-wrapper">
2
+ <% flash.each do |message_type, message| %>
3
+ <div class="toast show text-center text-white bg-dark border-0" data-controller="flash-message" data-action="animationend->flash-message#remove">
4
+ <div class="toast-body message-<%= message_type %>">
5
+ <%= message %>
6
+ </div>
7
+ </div>
8
+ <% end %>
9
+ </div>
@@ -0,0 +1,34 @@
1
+ <footer class="footer footer-transparent d-print-none">
2
+ <div class="container-xl">
3
+ <div class="row text-center align-items-center flex-row-reverse">
4
+ <div class="col-lg-auto ms-lg-auto">
5
+ <ul class="list-inline list-inline-dots mb-0">
6
+ <li class="list-inline-item"><a href="./docs/index.html" class="link-secondary">Documentation</a></li>
7
+ <li class="list-inline-item"><a href="./license.html" class="link-secondary">License</a></li>
8
+ <li class="list-inline-item"><a href="https://github.com/tabler/tabler" target="_blank" class="link-secondary" rel="noopener">Source code</a></li>
9
+ <li class="list-inline-item">
10
+ <a href="https://github.com/sponsors/codecalm" target="_blank" class="link-secondary" rel="noopener">
11
+ <!-- Download SVG icon from http://tabler-icons.io/i/heart -->
12
+ <svg xmlns="http://www.w3.org/2000/svg" class="icon text-pink icon-filled icon-inline" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M19.5 13.572l-7.5 7.428l-7.5 -7.428m0 0a5 5 0 1 1 7.5 -6.566a5 5 0 1 1 7.5 6.572" /></svg>
13
+ Sponsor
14
+ </a>
15
+ </li>
16
+ </ul>
17
+ </div>
18
+ <div class="col-12 col-lg-auto mt-3 mt-lg-0">
19
+ <ul class="list-inline list-inline-dots mb-0">
20
+ <li class="list-inline-item">
21
+ Copyright &copy; 2022
22
+ <a href="." class="link-secondary">Tabler</a>.
23
+ All rights reserved.
24
+ </li>
25
+ <li class="list-inline-item">
26
+ <a href="./changelog.html" class="link-secondary" rel="noopener">
27
+ v1.0.0-beta6
28
+ </a>
29
+ </li>
30
+ </ul>
31
+ </div>
32
+ </div>
33
+ </div>
34
+ </footer>
@@ -0,0 +1,10 @@
1
+ <% if resource.errors.any? %>
2
+ <div class="text-red pb-1">
3
+ <h3>The submitted form contains following errors:</h3>
4
+ <ul>
5
+ <% resource.errors.full_messages.each do |message| %>
6
+ <li class="pb-1"><%= message %></li>
7
+ <% end %>
8
+ </ul>
9
+ </div>
10
+ <% end %>
@@ -0,0 +1,5 @@
1
+ <%= javascript_include_tag "admin/stimulus.js", type: :module %>
2
+ <%= javascript_include_tag "admin/theme_switcher.js", type: :module %>
3
+ <%= javascript_include_tag "admin/flash_message.js", type: :module %>
4
+ <%= javascript_include_tag "admin/editor.js", type: :module %>
5
+ <%= javascript_include_tag "admin/time_zone.js", type: :module %>
@@ -0,0 +1,7 @@
1
+ <div class="container-xl">
2
+ <div class="page-header">
3
+ <div class="row align-items-center">
4
+ <%= yield %>
5
+ </div>
6
+ </div>
7
+ </div>
@@ -0,0 +1,5 @@
1
+ <div class="col-auto">
2
+ <div class="btn-list">
3
+ <%= yield %>
4
+ </div>
5
+ </div>
@@ -0,0 +1,12 @@
1
+ <%= content_for :title, title %>
2
+
3
+ <div class="col">
4
+ <div class="mb-1">
5
+ <ol class="breadcrumb" aria-label="breadcrumbs">
6
+ <%= yield %>
7
+ </ol>
8
+ </div>
9
+ <h1 class="page-title">
10
+ <span class="text-truncate"><%= title %></span>
11
+ </h1>
12
+ </div>
@@ -0,0 +1,63 @@
1
+ <header class="navbar navbar-expand-md navbar-light d-print-none">
2
+ <div class="container-xl">
3
+ <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbar-menu">
4
+ <span class="navbar-toggler-icon"></span>
5
+ </button>
6
+ <h1 class="navbar-brand navbar-brand-autodark d-none-navbar-horizontal pe-0 pe-md-3">
7
+ <%= link_to admin_root_path do %>
8
+ <%= image_tag "admin/logo.svg", width: 110, height: 32, alt: "Tabler", class: "navbar-brand-image" %>
9
+ <% end %>
10
+ </h1>
11
+ <div class="navbar-nav flex-row order-md-last">
12
+ <div class="nav-item d-none d-md-flex me-3">
13
+ <div class="btn-list">
14
+ <a href="https://github.com/tabler/tabler" class="btn" target="_blank" rel="noreferrer">
15
+ <!-- Download SVG icon from http://tabler-icons.io/i/brand-github -->
16
+ <svg xmlns="http://www.w3.org/2000/svg" class="icon" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M9 19c-4.3 1.4 -4.3 -2.5 -6 -3m12 5v-3.5c0 -1 .1 -1.4 -.5 -2c2.8 -.3 5.5 -1.4 5.5 -6a4.6 4.6 0 0 0 -1.3 -3.2a4.2 4.2 0 0 0 -.1 -3.2s-1.1 -.3 -3.5 1.3a12.3 12.3 0 0 0 -6.2 0c-2.4 -1.6 -3.5 -1.3 -3.5 -1.3a4.2 4.2 0 0 0 -.1 3.2a4.6 4.6 0 0 0 -1.3 3.2c0 4.6 2.7 5.7 5.5 6c-.6 .6 -.6 1.2 -.5 2v3.5" /></svg>
17
+ Source code
18
+ </a>
19
+ <a href="https://github.com/sponsors/codecalm" class="btn" target="_blank" rel="noreferrer">
20
+ <!-- Download SVG icon from http://tabler-icons.io/i/heart -->
21
+ <svg xmlns="http://www.w3.org/2000/svg" class="icon text-pink" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M19.5 13.572l-7.5 7.428l-7.5 -7.428m0 0a5 5 0 1 1 7.5 -6.566a5 5 0 1 1 7.5 6.572" /></svg>
22
+ Sponsor
23
+ </a>
24
+ </div>
25
+ </div>
26
+
27
+ <div class="nav-link px-4 theme-switcher" title="Switch color theme" data-bs-toggle="tooltip" data-bs-placement="bottom" data-controller="theme-switcher">
28
+ <i class="switcher icon-desktop"></i>
29
+ </div>
30
+
31
+ <!-- NOTIFICATIONS BELL + DROPDOWN
32
+ <div class="nav-item dropdown d-none d-md-flex me-3">
33
+ <a href="#" class="nav-link px-0" data-bs-toggle="dropdown" tabindex="-1" aria-label="Show notifications">
34
+ <svg xmlns="http://www.w3.org/2000/svg" class="icon" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 5a2 2 0 0 1 4 0a7 7 0 0 1 4 6v3a4 4 0 0 0 2 3h-16a4 4 0 0 0 2 -3v-3a7 7 0 0 1 4 -6" /><path d="M9 17v1a3 3 0 0 0 6 0v-1" /></svg>
35
+ <span class="badge bg-red"></span>
36
+ </a>
37
+ <div class="dropdown-menu dropdown-menu-end dropdown-menu-card">
38
+ <div class="card">
39
+ <div class="card-body">
40
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus ad amet consectetur exercitationem fugiat in ipsa ipsum, natus odio quidem quod repudiandae sapiente. Amet debitis et magni maxime necessitatibus ullam.
41
+ </div>
42
+ </div>
43
+ </div>
44
+ </div>
45
+ -->
46
+
47
+ <div class="nav-item dropdown">
48
+ <a href="#" class="nav-link d-flex lh-1 text-reset p-0" data-bs-toggle="dropdown" aria-label="Open user menu">
49
+ <span class="avatar avatar-sm" style="background-image: url(<%= asset_path path_to_avatar(Current.user) %>)"></span>
50
+ <div class="d-none d-xl-block ps-2">
51
+ <div><%= Current.user.username%></div>
52
+ <div class="mt-1 small text-muted"></div>
53
+ </div>
54
+ </a>
55
+ <div class="dropdown-menu dropdown-menu-end dropdown-menu-arrow">
56
+ <%= link_to "Profile", admin_profile_path, class: "dropdown-item" %>
57
+ <div class="dropdown-divider"></div>
58
+ <%= button_to "Logout", admin_sign_out_path, method: :post, class: "dropdown-item" %>
59
+ </div>
60
+ </div>
61
+ </div>
62
+ </div>
63
+ </header>
@@ -0,0 +1,12 @@
1
+ <div class="navbar-expand-md">
2
+ <div class="collapse navbar-collapse" id="navbar-menu">
3
+ <div class="navbar navbar-light">
4
+ <div class="container-xl">
5
+ <ul class="navbar-nav">
6
+ <%= render "admin/base/secondary_navbar_links" %>
7
+ </ul>
8
+ <div class="my-2 my-md-0 flex-grow-1 flex-md-grow-0 order-first order-md-last"></div>
9
+ </div>
10
+ </div>
11
+ </div>
12
+ </div>
@@ -0,0 +1,20 @@
1
+ <li class="nav-item <%= active_nav_item("admin/home") %>">
2
+ <%= link_to admin_root_path, class: "nav-link" do %>
3
+ <span class="nav-link-icon d-md-none d-lg-inline-block"><!-- Download SVG icon from http://tabler-icons.io/i/home -->
4
+ <svg xmlns="http://www.w3.org/2000/svg" class="icon" width="24" height="24" viewBox="0 0 24 24" stroke-width="1" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><polyline points="5 12 3 12 12 3 21 12 19 12" /><path d="M5 12v7a2 2 0 0 0 2 2h10a2 2 0 0 0 2 -2v-7" /><path d="M9 21v-6a2 2 0 0 1 2 -2h2a2 2 0 0 1 2 2v6" /></svg>
5
+ </span>
6
+ <span class="nav-link-title">
7
+ Dashboard
8
+ </span>
9
+ <% end %>
10
+ </li>
11
+ <li class="nav-item <%= active_nav_item("admin/users") %>">
12
+ <%= link_to admin_users_path, class: "nav-link" do %>
13
+ <span class="nav-link-icon d-md-none d-lg-inline-block">
14
+ <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-users"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M9 7m-4 0a4 4 0 1 0 8 0a4 4 0 1 0 -8 0" /><path d="M3 21v-2a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4v2" /><path d="M16 3.13a4 4 0 0 1 0 7.75" /><path d="M21 21v-2a4 4 0 0 0 -3 -3.85" /></svg>
15
+ </span>
16
+ <span class="nav-link-title">
17
+ Users
18
+ </span>
19
+ <% end %>
20
+ </li>
@@ -0,0 +1,5 @@
1
+ <!-- Tabler Core -->
2
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@tabler/core@1.0.0-beta24/dist/css/tabler.min.css">
3
+
4
+ <!-- Custom css -->
5
+ <%= stylesheet_link_tag "admin/custom.css" %>
@@ -0,0 +1,8 @@
1
+ <%= content_for :title, "Dashboard" %>
2
+
3
+ <div class="page-body">
4
+ <div class="container-xl">
5
+ <h1>Admin::Home#index</h1>
6
+ <p>Find me in app/views/admin/home/index.html.erb</p>
7
+ </div>
8
+ </div>
@@ -0,0 +1,16 @@
1
+ <%= form_with(url: admin_password_path(params[:token]), method: :put) do |form| %>
2
+ <div class="card-body card card-md">
3
+ <h1 class="card-title text-center mb-4">Reset your password</h1>
4
+ <div class="mb-3">
5
+ <%= form.label :password, class: "form-label" %>
6
+ <%= form.password_field :password, placeholder: "********", autofocus: true, required: true, class:"form-control" %>
7
+ </div>
8
+ <div class="mb-3">
9
+ <%= form.label :password_confirmation, class: "form-label" %>
10
+ <%= form.password_field :password_confirmation, placeholder: "********", autofocus: true, required: true, class:"form-control" %>
11
+ </div>
12
+ <div class="form-footer">
13
+ <%= form.submit "Save", class: "btn btn-primary w-100" %>
14
+ </div>
15
+ </div>
16
+ <% end %>
@@ -0,0 +1,11 @@
1
+ <%= form_with(url: admin_passwords_path) do |form| %>
2
+ <div class="card-body card card-md">
3
+ <h1 class="card-title text-center mb-4">Reset your password</h1>
4
+ <div class="mb-3">
5
+ <%= form.email_field :email_address, placeholder: "Enter your email address", autofocus: true, required: true, class:"form-control" %>
6
+ </div>
7
+ <div class="form-footer">
8
+ <%= form.submit "Email reset instructions", class: "btn btn-primary w-100" %>
9
+ </div>
10
+ </div>
11
+ <% end %>
@@ -0,0 +1,48 @@
1
+ <div class="page-body">
2
+ <div class="container-xl">
3
+ <div class="col-md-10 offset-md-1 col-lg-8 offset-lg-2">
4
+ <div class="card">
5
+ <div class="card-body">
6
+ <h1>Editing profile</h1>
7
+
8
+ <%= form_with model: @user, url: admin_profile_path, method: :patch do |f| %>
9
+ <div class="form-group mb-2">
10
+ <%= f.label :username, class: "form-label col-md-3 col-form-label" %>
11
+ <div class="col-md px-0">
12
+ <%= f.text_field :username, class: "form-control" %>
13
+ <%= tag.div @user.errors[:username].first.try(:capitalize), class: "invalid-feedback" %>
14
+ </div>
15
+ </div>
16
+
17
+ <div class="form-group mb-2">
18
+ <%= f.label :email_address, class: "form-label col-md-3 col-form-label" %>
19
+ <div class="col-md px-0">
20
+ <%= f.email_field :email_address, class: "form-control" %>
21
+ <%= tag.div @user.errors[:email_address].first.try(:capitalize), class: "invalid-feedback" %>
22
+ </div>
23
+ </div>
24
+
25
+ <div class="form-group mb-2">
26
+ <%= f.label :password, class: "form-label col-md-3 col-form-label" %>
27
+ <div class="col-md px-0">
28
+ <%= f.password_field :password, class: "form-control" %>
29
+ <%= tag.div @user.errors[:password].first.try(:capitalize), class: "invalid-feedback" %>
30
+ </div>
31
+ </div>
32
+
33
+ <div class="form-group mb-2">
34
+ <%= f.label :password_confirmation, class: "form-label col-md-3 col-form-label" %>
35
+ <div class="col-md px-0">
36
+ <%= f.password_field :password_confirmation, class: "form-control" %>
37
+ <%= tag.div @user.errors[:password_confirmation].first.try(:capitalize), class: "invalid-feedback" %>
38
+ </div>
39
+ </div>
40
+
41
+ <div class="form-footer">
42
+ <%= f.submit "Save", class: "btn btn-primary" %>
43
+ </div>
44
+ <% end%>
45
+ </div>
46
+ </div>
47
+ </div>
48
+ </div>
@@ -0,0 +1,22 @@
1
+ <div class="page-body">
2
+ <div class="container-xl">
3
+ <div class="col-md-10 offset-md-1 col-lg-8 offset-lg-2">
4
+ <div class="card">
5
+ <div class="ribbon ribbon-top bg-secondary"><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-user"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M8 7a4 4 0 1 0 8 0a4 4 0 0 0 -8 0" /><path d="M6 21v-2a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4v2" /></svg></div>
6
+ <div class="card-body">
7
+ <h1>Profile</h1>
8
+ <%= image_tag path_to_avatar(Current.user), class: "rounded-circle mx-auto d-block", style: "width: 10rem;" %>
9
+ <h2 class="text-center pt-3 pb-4 text-secondary"><%= "@" + @user.username %></h2>
10
+ <div class="profile-field pb-2" style="font-size: 1.25rem; line-height: 1.5rem;">
11
+ <span class="font-weight-bold">Username: </span><span class="text-secondary"><%= @user.username %></span>
12
+ </div>
13
+ <div class="profile-field pb-2" style="font-size: 1.25rem; line-height: 1.5rem;">
14
+ <span class="font-weight-bold">Email: </span><span class="text-secondary"><%= @user.email_address %></span>
15
+ </div>
16
+ <div class="form-footer">
17
+ <%= link_to "Edit profile", admin_edit_profile_path, class: "btn btn-primary w-100" %>
18
+ </div>
19
+ </div>
20
+ </div>
21
+ </div>
22
+ </div>
@@ -0,0 +1,21 @@
1
+ <%= form_with(url: admin_sign_in_path, class: "card card-md") do |form| %>
2
+ <div class="card-body">
3
+ <h1 class="card-title text-center mb-4">Login to your account</h1>
4
+ <div class="mb-3">
5
+ <%= form.label :email_address, class: "form-label" %>
6
+ <%= form.email_field :email_address, value: params[:email_hint], placeholder: "Enter email", autofocus: true, required: true, autocomplete: "email", class:"form-control" %>
7
+ </div>
8
+ <div class="mb-2">
9
+ <div class="d-flex justify-content-between">
10
+ <%= form.label :password, class: "form-label" %>
11
+ <span class="form-label-description">
12
+ <%= link_to "I forgot password", new_admin_password_path %>
13
+ </span>
14
+ </div>
15
+ <%= form.password_field :password, placeholder: "Password", required: true, autocomplete: "current-password", class:"form-control" %>
16
+ </div>
17
+ <div class="form-footer">
18
+ <%= form.submit "Sign in", class: "btn btn-primary w-100" %>
19
+ </div>
20
+ </div>
21
+ <% end %>
@@ -0,0 +1,48 @@
1
+ <%= form_with(model: [:admin, user]) do |form| %>
2
+
3
+ <%= render "admin/base/form_errors_messages", resource: user %>
4
+
5
+ <div class="form-group row mb-2">
6
+ <%= form.label :username, class: "form-label col-md-3 col-form-label" %>
7
+ <div class="col-md px-0">
8
+ <%= form.text_field :username, class: "form-control" %>
9
+ </div>
10
+ </div>
11
+
12
+ <div class="form-group row mb-2">
13
+ <%= form.label :email_address, class: "form-label col-md-3 col-form-label" %>
14
+ <div class="col-md px-0">
15
+ <%= form.email_field :email_address, autocomplete: "email", class: "form-control" %>
16
+ </div>
17
+ </div>
18
+
19
+ <div class="form-group row mb-2">
20
+ <%= form.label :password, class: "form-label col-md-3 col-form-label" %>
21
+ <div class="col-md px-0">
22
+ <%= form.password_field :password, autocomplete: "new-password", class: "form-control" %>
23
+ </div>
24
+ </div>
25
+
26
+ <div class="form-group row">
27
+ <%= form.label :password_confirmation, class: "form-label col-md-3 col-form-label" %>
28
+ <div class="col-md px-0">
29
+ <%= form.password_field :password_confirmation, autocomplete: "new-password", class: "form-control" %>
30
+ </div>
31
+ </div>
32
+
33
+ <div class="form-group row mb-2">
34
+ <%= form.label :is_admin, class: "form-check-label col-md-3 col-form-label" %>
35
+ <div class="col-md px-0">
36
+ <% if user.is_admin? && action_name != "new" %>
37
+ <%= form.check_box :is_admin, checked: true, class: "form-check-input" %>
38
+ <%else%>
39
+ <%= form.check_box :is_admin, checked: false, class: "form-check-input" %>
40
+ <%end%>
41
+ </div>
42
+ </div>
43
+
44
+ <div class="form-footer">
45
+ <%= form.submit class: "btn btn-primary" %>
46
+ <%= link_to "Cancel", admin_users_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 user" do %>
3
+ <li class="breadcrumb-item"><%= link_to "Admin", admin_root_path %></li>
4
+ <li class="breadcrumb-item"><%= link_to "Users", admin_users_path %></li>
5
+ <li class="breadcrumb-item"><%= link_to @user.email_address, admin_users_path(@user) %></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", user: @user %>
14
+ </div>
15
+ </div>
16
+ </div>
17
+ </div>
@@ -0,0 +1,78 @@
1
+ <%= render "page_header" do %>
2
+ <%= render "page_header_breadcrumb", title: "Users" 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 user", new_admin_user_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
+ <th><%= sort_link @search, :id %></th>
20
+ <th><%= sort_link @search, :email_address %></th>
21
+ <th><%= sort_link @search, :created_at %></th>
22
+ <th>Admin?</th>
23
+ <th>Actions</th>
24
+ </tr>
25
+ </thead>
26
+ <tbody>
27
+ <% @users.each do |user| %>
28
+ <tr>
29
+ <td><%= link_to user.id, admin_user_path(user) %></td>
30
+ <td><%= link_to user.email_address, admin_user_path(user) %></td>
31
+ <td><%= link_to user.created_at, admin_user_path(user) %></td>
32
+ <td><%= true_or_false_icon(user.is_admin?)%></td>
33
+ <td>
34
+ <%= link_to "View", admin_user_path(user), class: "btn btn-white btn-sm" %>
35
+ <%= link_to "Edit", edit_admin_user_path(user), class: "btn btn-white btn-sm" %>
36
+ <%= link_to "Delete", admin_user_path(user), class: "btn btn-white btn-sm", data: { turbo_method: :delete, turbo_confirm: "Are you sure?" } %>
37
+ </td>
38
+ </tr>
39
+ <% end %>
40
+ </tbody>
41
+ </table>
42
+
43
+ </div>
44
+ <div class="card-footer d-flex align-items-center fs-5">
45
+ <div class="d-none d-md-block">
46
+ <div>Download: <%= link_to "CSV", admin_users_path(format: :csv, q: request.params[:q]) %></div>
47
+ <%== pagy_info(@pagy) %>
48
+ </div>
49
+ <div class="ms-auto">
50
+ <%== pagy_bootstrap_nav(@pagy) %>
51
+ </div>
52
+ </div>
53
+ </div>
54
+ </div>
55
+ </div>
56
+
57
+ <div id="offcanvas_filters" tabindex="-1" class="offcanvas offcanvas-end">
58
+ <div class="offcanvas-header">
59
+ <h2 class="offcanvas-title">Filters</h2>
60
+ <button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas"></button>
61
+ </div>
62
+ <%= search_form_for [:admin, @search], class: "offcanvas-body" do |f| %>
63
+ <%= f.label :email_address_cont, class: "form-label" %>
64
+ <%= f.text_field :email_address_cont, class: "form-control mb-3" %>
65
+
66
+ <%= f.label :created_at, class: "form-label" %>
67
+ <div class="d-flex gap-1 mb-3">
68
+ <%= f.date_field :created_at_gteq, class: "form-control" %>
69
+ <%= f.date_field :created_at_lteq, class: "form-control" %>
70
+ </div>
71
+
72
+ <%= f.label :is_admin, class: "form-label" %>
73
+ <%= f.select :is_admin_eq, ([["All", ""],["Admin", "1"],["Not admin", "0"]]), {}, class: "form-select mb-3" %>
74
+
75
+ <%= f.submit "Filter", class: "btn btn-primary" %>
76
+ <%= link_to "Clear Filter", admin_users_path, class: "btn btn-white" %>
77
+ <% end %>
78
+ </div>
@@ -0,0 +1,16 @@
1
+ <%= render "page_header" do %>
2
+ <%= render "page_header_breadcrumb", title: "New user" do %>
3
+ <li class="breadcrumb-item"><%= link_to "Admin", admin_root_path %></li>
4
+ <li class="breadcrumb-item"><%= link_to "Users", admin_users_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", user: @user %>
13
+ </div>
14
+ </div>
15
+ </div>
16
+ </div>
@@ -0,0 +1,33 @@
1
+ <%= render "page_header" do %>
2
+ <%= render "page_header_breadcrumb", title: @user.email_address do %>
3
+ <li class="breadcrumb-item"><%= link_to "Admin", admin_root_path %></li>
4
+ <li class="breadcrumb-item"><%= link_to "Users", admin_users_path %></li>
5
+ <% end %>
6
+
7
+ <%= render "page_header_actions" do %>
8
+ <%= link_to "Edit user", edit_admin_user_path(@user), class: "btn btn-primary" %>
9
+ <%= link_to "Delete user", [:admin, @user], 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">User details</h3>
18
+ </div>
19
+ <div class="card-body">
20
+ <dl class="row">
21
+ <dt class="col-md-3">Email</dt>
22
+ <dd class="col-md-9"><%= @user.email_address %></dd>
23
+
24
+ <dt class="col-md-3">Created at</dt>
25
+ <dd class="col-md-9"><%= l(@user.created_at, format: :long) %></dd>
26
+
27
+ <dt class="col-md-3">Updated at</dt>
28
+ <dd class="col-md-9"><%= l(@user.updated_at, format: :long) %></dd>
29
+ </dl>
30
+ </div>
31
+ </div>
32
+ </div>
33
+ </div>
@@ -0,0 +1,32 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head lang="en">
4
+ <meta charset="utf-8"/>
5
+ <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"/>
6
+ <meta http-equiv="X-UA-Compatible" content="ie=edge"/>
7
+ <title>Authentication Zero</title>
8
+
9
+ <%= csrf_meta_tags %>
10
+ <%= csp_meta_tag %>
11
+
12
+ <%= render "stylesheet_link_tags" %>
13
+ <%= render "javascript_tags" %>
14
+ </head>
15
+
16
+ <body class="border-top-wide border-primary d-flex flex-column">
17
+ <div class="page page-center">
18
+ <div class="page page-center">
19
+ <div class="container-tight py-4">
20
+ <div class="text-center mb-4">
21
+ <%= link_to admin_sign_in_path, class: "navbar-brand navbar-brand-autodark" do %>
22
+ <%= image_tag "admin/logo.svg", height: 36 %>
23
+ <% end %>
24
+ </div>
25
+ <%= yield %>
26
+ </div>
27
+ </div>
28
+ </div>
29
+
30
+ <%= render "flash_messages" %>
31
+ </body>
32
+ </html>
@@ -0,0 +1,31 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head lang="en">
4
+ <meta charset="utf-8"/>
5
+ <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"/>
6
+ <meta http-equiv="X-UA-Compatible" content="ie=edge"/>
7
+ <title><%= title %></title>
8
+
9
+ <%= csrf_meta_tags %>
10
+ <%= csp_meta_tag %>
11
+ <script src="https://cdn.jsdelivr.net/npm/@tabler/core@1.0.0-beta24/dist/js/tabler.min.js"></script>
12
+ <script src=" https://cdn.jsdelivr.net/npm/@hotwired/turbo@8.0.12/dist/turbo.es2017-umd.min.js "></script>
13
+ <%= render "stylesheet_link_tags" %>
14
+ <%= render "javascript_tags" %>
15
+ <%= render "ejs_tags" %>
16
+ </head>
17
+
18
+ <body>
19
+ <%= render "primary_navbar" %>
20
+ <%= render "secondary_navbar" %>
21
+
22
+ <div class="page">
23
+ <div class="page-wrapper">
24
+ <%= yield %>
25
+ <%= render "footer" %>
26
+ </div>
27
+ </div>
28
+
29
+ <%= render "flash_messages" %>
30
+ </body>
31
+ </html>