14 changed files with 184 additions and 58 deletions
@ -0,0 +1,20 @@ |
|||||
|
<div class="container mt-5"> |
||||
|
<h2 class="mb-4">Bestätigungs‑Link erneut senden</h2> |
||||
|
|
||||
|
<%= form_with(scope: resource_name, url: password_path(resource_name), local: true) do |f| %> |
||||
|
|
||||
|
|
||||
|
<div class="mb-3"> |
||||
|
<%= f.label :email, 'E‑Mail Adresse', class: 'form-label' %> |
||||
|
<%= f.email_field :email, autofocus: true, class: 'form-control', placeholder: 'Ihre E‑Mail' %> |
||||
|
</div> |
||||
|
|
||||
|
<div class="mt-4"> |
||||
|
<%= f.submit 'Link senden', class: 'btn btn-primary w-100' %> |
||||
|
</div> |
||||
|
<% end %> |
||||
|
|
||||
|
<div class="mt-3 text-center"> |
||||
|
<%= link_to 'Zurück zur Anmeldung', new_session_path(resource_name), class: 'btn btn-link' %> |
||||
|
</div> |
||||
|
</div> |
||||
@ -0,0 +1,32 @@ |
|||||
|
<div class="container mt-5"> |
||||
|
<h2 class="mb-4">🔐 Passwort zurücksetzen</h2> |
||||
|
|
||||
|
<%= devise_error_messages! %> |
||||
|
|
||||
|
<%= form_with(scope: resource_name, url: password_path(resource_name), method: :put, local: true) do |f| %> |
||||
|
<%= f.hidden_field :reset_password_token, value: params[:reset_password_token] %> |
||||
|
|
||||
|
<div class="mb-3"> |
||||
|
<%= f.label :email, 'E‑Mail Adresse', class: 'form-label' %> |
||||
|
<%= f.email_field :email, autofocus: true, class: 'form-control', placeholder: 'Ihre E‑Mail' %> |
||||
|
</div> |
||||
|
|
||||
|
<div class="mb-3"> |
||||
|
<%= f.label :password, 'Neues Passwort', class: 'form-label' %> |
||||
|
<%= f.password_field :password, autocomplete: "new-password", class: 'form-control' %> |
||||
|
</div> |
||||
|
|
||||
|
<div class="mb-3"> |
||||
|
<%= f.label :password_confirmation, 'Passwort bestätigen', class: 'form-label' %> |
||||
|
<%= f.password_field :password_confirmation, autocomplete: "new-password", class: 'form-control' %> |
||||
|
</div> |
||||
|
|
||||
|
<div class="mt-4"> |
||||
|
<%= f.submit 'Passwort aktualisieren', class: 'btn btn-primary w-100' %> |
||||
|
</div> |
||||
|
<% end %> |
||||
|
|
||||
|
<div class="mt-3 text-center"> |
||||
|
<%= link_to 'Zurück zur Anmeldung', new_session_path(resource_name), class: 'btn btn-link' %> |
||||
|
</div> |
||||
|
</div> |
||||
@ -0,0 +1,20 @@ |
|||||
|
<div class="container mt-5"> |
||||
|
<h2 class="mb-4">Passwort vergessen?</h2> |
||||
|
|
||||
|
<%= form_with(scope: resource_name, url: password_path(resource_name), local: true) do |f| %> |
||||
|
|
||||
|
|
||||
|
<div class="mb-3"> |
||||
|
<%= f.label :email, 'E‑Mail Adresse', class: 'form-label' %> |
||||
|
<%= f.email_field :email, autofocus: true, class: 'form-control', placeholder: 'Ihre E‑Mail' %> |
||||
|
</div> |
||||
|
|
||||
|
<div class="mt-4"> |
||||
|
<%= f.submit 'Zugangsdaten senden', class: 'btn btn-primary w-100' %> |
||||
|
</div> |
||||
|
<% end %> |
||||
|
|
||||
|
<div class="mt-3 text-center"> |
||||
|
<%= link_to 'Zurück zur Anmeldung', new_session_path(resource_name), class: 'btn btn-link' %> |
||||
|
</div> |
||||
|
</div> |
||||
@ -1,53 +1,63 @@ |
|||||
|
<!DOCTYPE html> |
||||
|
<html> |
||||
<head> |
<head> |
||||
<meta charset="utf-8"> |
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1"> |
|
||||
<title>Praktikumsuhr</title> |
<title>Praktikumsuhr</title> |
||||
|
<meta name="viewport" content="width=device-width, initial-scale=1"> |
||||
|
|
||||
<!-- Bootstrap CSS --> |
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"> |
|
||||
|
<%= csrf_meta_tags %> |
||||
|
<%= csp_meta_tag %> |
||||
|
|
||||
<!-- Flatpickr Theme --> |
|
||||
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css"> |
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/themes/material_blue.css"> |
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/themes/material_blue.css"> |
||||
|
|
||||
<!-- Custom Styles (optional) --> |
|
||||
<%= stylesheet_link_tag "application", "data-turbo-track": "reload" %> |
<%= stylesheet_link_tag "application", "data-turbo-track": "reload" %> |
||||
|
|
||||
<!-- JS: Bootstrap Bundle (inkl. Popper) --> |
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js" defer></script> |
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js" defer></script> |
||||
|
|
||||
|
|
||||
<!-- Flatpickr JS --> |
|
||||
<script src="https://cdn.jsdelivr.net/npm/flatpickr"></script> |
|
||||
|
|
||||
<!-- JS: Flatpickr Init --> |
|
||||
<script defer> |
|
||||
document.addEventListener("DOMContentLoaded", function () { |
|
||||
flatpickr(".flatpickr", { |
|
||||
|
|
||||
dateFormat: "d.m.Y", |
|
||||
allowInput: true |
|
||||
}); |
|
||||
}); |
|
||||
</script> |
|
||||
|
|
||||
<!-- JavaScript from Rails --> |
|
||||
<%= javascript_include_tag "application", "data-turbo-track": "reload", defer: true %> |
<%= javascript_include_tag "application", "data-turbo-track": "reload", defer: true %> |
||||
</head> |
</head> |
||||
|
|
||||
|
<body> |
||||
|
<nav class="navbar navbar-expand-lg navbar-light bg-light mb-4"> |
||||
|
<div class="container"> |
||||
|
<%= link_to "Praktikumsuhr", root_path, class: "navbar-brand" %> |
||||
|
|
||||
|
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent"> |
||||
|
<span class="navbar-toggler-icon"></span> |
||||
|
</button> |
||||
|
|
||||
<body class="container mt-4"> |
|
||||
<% if notice %><div class="alert alert-success"><%= notice %></div><% end %> |
|
||||
<% if alert %><div class="alert alert-danger"><%= alert %></div><% end %> |
|
||||
|
|
||||
|
<div class="collapse navbar-collapse" id="navbarSupportedContent"> |
||||
|
<ul class="navbar-nav ms-auto mb-2 mb-lg-0"> |
||||
<% if user_signed_in? %> |
<% if user_signed_in? %> |
||||
<p class="text-end"> |
|
||||
Eingeloggt als <%= current_user.email %> | |
|
||||
<%= link_to "Profil", edit_user_registration_path %> | |
|
||||
<%= link_to "Admin", admin_root_path %> | |
|
||||
<%= link_to "Logout", destroy_user_session_path, method: :delete, data: { turbo: false } %> |
|
||||
</p> |
|
||||
|
<li class="nav-item"> |
||||
|
<%= link_to "Einträge", entries_path, class: "nav-link" %> |
||||
|
</li> |
||||
|
<li class="nav-item"> |
||||
|
<%= link_to "Profil", edit_user_registration_path, class: "nav-link" %> |
||||
|
</li> |
||||
|
<li class="nav-item"> |
||||
|
<%= link_to "Abmelden", destroy_user_session_path, method: :delete, data: { turbo: false }, class: "nav-link" %> |
||||
|
</li> |
||||
|
<% else %> |
||||
|
<li class="nav-item"> |
||||
|
<%= link_to "Anmelden", new_user_session_path, class: "nav-link" %> |
||||
|
</li> |
||||
|
<li class="nav-item"> |
||||
|
<%= link_to "Registrieren", new_user_registration_path, class: "nav-link" %> |
||||
|
</li> |
||||
|
<% end %> |
||||
|
</ul> |
||||
|
</div> |
||||
|
</div> |
||||
|
</nav> |
||||
|
|
||||
|
<div class="container"> |
||||
|
<% if notice %> |
||||
|
<div class="alert alert-success"><%= notice %></div> |
||||
|
<% end %> |
||||
|
<% if alert %> |
||||
|
<div class="alert alert-danger"><%= alert %></div> |
||||
<% end %> |
<% end %> |
||||
|
|
||||
<%= yield %> |
<%= yield %> |
||||
|
</div> |
||||
</body> |
</body> |
||||
|
</html> |
||||
@ -0,0 +1,9 @@ |
|||||
|
class AddConfirmableToUsers < ActiveRecord::Migration[7.1] |
||||
|
def change |
||||
|
add_column :users, :confirmation_token, :string |
||||
|
add_index :users, :confirmation_token |
||||
|
add_column :users, :confirmed_at, :datetime |
||||
|
add_column :users, :confirmation_sent_at, :datetime |
||||
|
add_column :users, :unconfirmed_email, :string |
||||
|
end |
||||
|
end |
||||
@ -0,0 +1,9 @@ |
|||||
|
class ConfirmAllExistingUsers < ActiveRecord::Migration[7.1] |
||||
|
def up |
||||
|
User.update_all(confirmed_at: Time.current) |
||||
|
end |
||||
|
|
||||
|
def down |
||||
|
User.update_all(confirmed_at: nil) |
||||
|
end |
||||
|
end |
||||
Loading…
Reference in new issue