|
|
@ -1,19 +1,30 @@ |
|
|
<div class="mb-4"> |
|
|
|
|
|
<label for="minute-inputs" class="form-label">Minuteneinträge (z. B. 45, 60, 30):</label> |
|
|
|
|
|
<textarea id="minute-inputs" class="form-control" rows="3"></textarea> |
|
|
|
|
|
<button id="sum-button" class="btn btn-primary mt-2">Summieren</button> |
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
<!-- Zeiteingabe-Karte --> |
|
|
|
|
|
<div class="card mb-4 shadow-sm"> |
|
|
|
|
|
<div class="card-body"> |
|
|
|
|
|
<h5 class="card-title">⏱️ Zeitberechnung</h5> |
|
|
|
|
|
|
|
|
<div class="mb-4"> |
|
|
|
|
|
<p>Gesamtsumme: <strong><span id="total-time">0h 0min</span></strong> (<span id="total-minutes">0min</span>)</p> |
|
|
|
|
|
|
|
|
<div class="mb-3"> |
|
|
|
|
|
<label for="minute-inputs" class="form-label">Minuteneinträge (z. B. 45, 60, 30):</label> |
|
|
|
|
|
<textarea id="minute-inputs" class="form-control" rows="2" placeholder="Trenne mit Komma, Leertaste oder Zeilenumbruch"></textarea> |
|
|
|
|
|
</div> |
|
|
|
|
|
<div class="d-flex justify-content-between align-items-center flex-wrap"> |
|
|
|
|
|
<button id="sum-button" class="btn btn-outline-primary">➕ Summieren</button> |
|
|
|
|
|
<p class="mb-0 mt-2 mt-md-0"> |
|
|
|
|
|
<strong>Gesamt:</strong> <span id="total-time">0h 0min</span> (<span id="total-minutes">0min</span>) |
|
|
|
|
|
</p> |
|
|
|
|
|
</div> |
|
|
|
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
|
|
|
<!-- Rails-Formular als Karte --> |
|
|
|
|
|
<div class="card shadow-sm"> |
|
|
|
|
|
<div class="card-body"> |
|
|
|
|
|
<h5 class="card-title">📋 Eintrag erstellen</h5> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<%= form_with(model: entry, local: true) do |form| %> |
|
|
|
|
|
|
|
|
<%= form_with(model: entry, local: true) do |form| %> |
|
|
<% if entry.errors.any? %> |
|
|
<% if entry.errors.any? %> |
|
|
<div class="alert alert-danger"> |
|
|
<div class="alert alert-danger"> |
|
|
<h4><%= pluralize(entry.errors.count, "Fehler") %> verhinderten das Speichern:</h4> |
|
|
|
|
|
|
|
|
<h5><%= pluralize(entry.errors.count, "Fehler") %> verhinderten das Speichern:</h5> |
|
|
<ul> |
|
|
<ul> |
|
|
<% entry.errors.full_messages.each do |msg| %> |
|
|
<% entry.errors.full_messages.each do |msg| %> |
|
|
<li><%= msg %></li> |
|
|
<li><%= msg %></li> |
|
|
@ -22,125 +33,99 @@ |
|
|
</div> |
|
|
</div> |
|
|
<% end %> |
|
|
<% end %> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- Erste Zeile: Datum, Stunden, Minuten --> |
|
|
|
|
|
<div class="row g-3 mt-1"> |
|
|
|
|
|
<div class="col-12 col-md-4"> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<%= form.label :date, 'Datum', class: 'form-label' %> |
|
|
|
|
|
<%= form.date_field :date, |
|
|
|
|
|
class: 'form-control flatpickr', |
|
|
|
|
|
data: { |
|
|
|
|
|
enable_time: false, |
|
|
|
|
|
altInput: true, |
|
|
|
|
|
altFormat: 'd.m.Y', |
|
|
|
|
|
dateFormat: 'Y-m-d' # Wichtig: Flatpickr braucht `dateFormat` |
|
|
|
|
|
}, |
|
|
|
|
|
value: (form.object.date) %> |
|
|
|
|
|
|
|
|
<div class="row g-3"> |
|
|
|
|
|
<div class="col-md-4"> |
|
|
|
|
|
<%= form.label :date, '📅 Datum', class: 'form-label' %> |
|
|
|
|
|
<%= form.date_field :date, class: 'form-control flatpickr', data: { |
|
|
|
|
|
enable_time: false, altInput: true, |
|
|
|
|
|
altFormat: 'd.m.Y', dateFormat: 'Y-m-d' |
|
|
|
|
|
}, value: form.object.date %> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="col-12 col-md-4"> |
|
|
|
|
|
<%= form.label :start_time, 'Beginn (Uhrzeit)', class: 'form-label' %> |
|
|
|
|
|
<%= form.time_field :start_time, class: 'form-control', step: 60 , discard_month: true, discard_day: true, discard_seconds: true, value: @entry.start_time&.strftime("%H:%M") %> |
|
|
|
|
|
|
|
|
<div class="col-md-4"> |
|
|
|
|
|
<%= form.label :start_time, '🕒 Beginn', class: 'form-label' %> |
|
|
|
|
|
<%= form.time_field :start_time, class: 'form-control', step: 60, |
|
|
|
|
|
value: @entry.start_time&.strftime("%H:%M") %> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="col-12 col-md-4"> |
|
|
|
|
|
<%= form.label :end_time, 'Ende (Uhrzeit)', class: 'form-label' %> |
|
|
|
|
|
<%= form.time_field :end_time, class: 'form-control', step: 60 , discard_month: true, discard_day: true, discard_seconds: true, value: @entry.end_time&.strftime("%H:%M") %> |
|
|
|
|
|
|
|
|
<div class="col-md-4"> |
|
|
|
|
|
<%= form.label :end_time, '🕓 Ende', class: 'form-label' %> |
|
|
|
|
|
<%= form.time_field :end_time, class: 'form-control', step: 60, |
|
|
|
|
|
value: @entry.end_time&.strftime("%H:%M") %> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="col-12 col-md-4"> |
|
|
|
|
|
<%= form.label :hours, 'Stunden', class: 'form-label' %> |
|
|
|
|
|
<%= form.number_field :hours, |
|
|
|
|
|
class: 'form-control', |
|
|
|
|
|
min: 0, |
|
|
|
|
|
|
|
|
<div class="col-md-4"> |
|
|
|
|
|
<%= form.label :hours, '⏳ Stunden', class: 'form-label' %> |
|
|
|
|
|
<%= form.number_field :hours, class: 'form-control', min: 0, |
|
|
value: form.object.hours || 0 %> |
|
|
value: form.object.hours || 0 %> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="col-12 col-md-4"> |
|
|
|
|
|
<%= form.label :minutes, 'Minuten', class: 'form-label' %> |
|
|
|
|
|
<%= form.number_field :minutes, |
|
|
|
|
|
class: 'form-control', |
|
|
|
|
|
min: 0, max: 59, |
|
|
|
|
|
|
|
|
<div class="col-md-4"> |
|
|
|
|
|
<%= form.label :minutes, '⏱ Minuten', class: 'form-label' %> |
|
|
|
|
|
<%= form.number_field :minutes, class: 'form-control', min: 0, max: 59, |
|
|
value: form.object.minutes || 0 %> |
|
|
value: form.object.minutes || 0 %> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="col-12 col-md-4"> |
|
|
|
|
|
<div class="col-12 mt-2 d-flex justify-content-center"> |
|
|
|
|
|
<div class="form-check mt-4"> |
|
|
|
|
|
|
|
|
<div class="col-md-4 d-flex align-items-end"> |
|
|
|
|
|
<div class="form-check"> |
|
|
<%= form.check_box :has_break, { class: 'form-check-input', id: 'entry_has_break' }, true, false %> |
|
|
<%= form.check_box :has_break, { class: 'form-check-input', id: 'entry_has_break' }, true, false %> |
|
|
<%= form.label :has_break, '30 Min. Mittagspause abziehen', class: 'form-check-label ms-2' %> |
|
|
|
|
|
|
|
|
<%= form.label :has_break, '🧘 30 Min. Mittagspause abziehen', class: 'form-check-label ms-2' %> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
|
|
|
<div class="mt-3"> |
|
|
|
|
|
<p><strong>🧮 Berechnet:</strong> <span id="calculated-total-minutes">0 min</span></p> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
|
|
|
<hr> |
|
|
|
|
|
|
|
|
<div class="col-12 col-md-4 d-flex align-items-end"> |
|
|
|
|
|
<p class="mb-0"><strong>Gesamt:</strong> <span id="calculated-total-minutes">0 min</span></p> |
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
|
|
<!-- Weitere Felder: Typ, Art, Entfernung --> |
|
|
|
|
|
<div class="row g-3 mt-1"> |
|
|
|
|
|
<div class="col-12"> |
|
|
|
|
|
<%= form.label :praktikums_typ, 'Praktikumstyp', class: 'form-label' %> |
|
|
|
|
|
|
|
|
<div class="row g-3 mt-2"> |
|
|
|
|
|
<div class="col-md-6"> |
|
|
|
|
|
<%= form.label :praktikums_typ, '🔧 Praktikumstyp', class: 'form-label' %> |
|
|
<%= form.select :praktikums_typ, |
|
|
<%= form.select :praktikums_typ, |
|
|
current_user.praepedeutikum_abgeschlossen? ? |
|
|
current_user.praepedeutikum_abgeschlossen? ? |
|
|
Entry::PRAKTIKUMSTYPEN.reject { |typ| typ == 'propädeutikum' } : |
|
|
Entry::PRAKTIKUMSTYPEN.reject { |typ| typ == 'propädeutikum' } : |
|
|
Entry::PRAKTIKUMSTYPEN, |
|
|
Entry::PRAKTIKUMSTYPEN, |
|
|
{}, |
|
|
|
|
|
class: 'form-select' %> |
|
|
|
|
|
|
|
|
{}, class: 'form-select' %> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="col-12"> |
|
|
|
|
|
<%= form.label :entry_art, 'Art', class: 'form-label' %> |
|
|
|
|
|
|
|
|
<div class="col-md-6"> |
|
|
|
|
|
<%= form.label :entry_art, '📚 Art', class: 'form-label' %> |
|
|
<%= form.select :entry_art, Entry::ENTRY_ARTEN, {}, class: 'form-select', id: 'entry_art_select' %> |
|
|
<%= form.select :entry_art, Entry::ENTRY_ARTEN, {}, class: 'form-select', id: 'entry_art_select' %> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="col-12"> |
|
|
|
|
|
<%= form.label :distance_km, 'Entfernung (km) Gesamt', class: 'form-label' %> |
|
|
|
|
|
<%= form.number_field :distance_km, |
|
|
|
|
|
class: 'form-control', |
|
|
|
|
|
min: 0, |
|
|
|
|
|
value: form.object.distance_km || 0 %> |
|
|
|
|
|
|
|
|
<div class="col-md-6"> |
|
|
|
|
|
<%= form.label :distance_km, '🚗 Entfernung (km)', class: 'form-label' %> |
|
|
|
|
|
<%= form.number_field :distance_km, class: 'form-control', min: 0, value: form.object.distance_km || 0 %> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="col-12 col-md-4"> |
|
|
|
|
|
<%= form.label :beschreibung, 'Beschreibung', class: 'form-label' %> |
|
|
|
|
|
|
|
|
<div class="col-md-6"> |
|
|
|
|
|
<%= form.label :beschreibung, '📝 Beschreibung', class: 'form-label' %> |
|
|
<%= form.text_field :beschreibung, class: 'form-control' %> |
|
|
<%= form.text_field :beschreibung, class: 'form-control' %> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="col-12 col-md-4"> |
|
|
|
|
|
<%= form.label :kosten, 'Kosten (z. B. Teilnahmegebühr)', class: 'form-label' %> |
|
|
|
|
|
|
|
|
<div class="col-md-6"> |
|
|
|
|
|
<%= form.label :kosten, '💸 Kosten', class: 'form-label' %> |
|
|
<%= form.number_field :kosten, class: 'form-control', min: 0, step: 0.01 %> |
|
|
<%= form.number_field :kosten, class: 'form-control', min: 0, step: 0.01 %> |
|
|
</div> |
|
|
</div> |
|
|
<div class="col-12 col-md-4"> |
|
|
|
|
|
<div class="col-12 mt-2 d-flex justify-content-center"> |
|
|
|
|
|
<div class="form-check mt-4"> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="col-md-6 d-flex align-items-end"> |
|
|
|
|
|
<div class="form-check"> |
|
|
<%= form.check_box :zaehlt_als_fortbildung, class: "form-check-input" %> |
|
|
<%= form.check_box :zaehlt_als_fortbildung, class: "form-check-input" %> |
|
|
<%= form.label :zaehlt_als_fortbildung, "Zählt als Fortbildung", class: "form-check-label" %> |
|
|
|
|
|
|
|
|
<%= form.label :zaehlt_als_fortbildung, "🎓 Zählt als Fortbildung", class: "form-check-label" %> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="mt-4 text-end"> |
|
|
|
|
|
<%= form.submit '💾 Speichern', class: 'btn btn-success' %> |
|
|
|
|
|
<%= link_to '🔙 Zurück', entries_path, class: 'btn btn-outline-secondary ms-2' %> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<!-- Buttons --> |
|
|
|
|
|
<div class="mt-4"> |
|
|
|
|
|
<%= form.submit 'Speichern', class: 'btn btn-primary' %> |
|
|
|
|
|
<%= link_to 'Zurück', entries_path, class: 'btn btn-secondary ms-2' %> |
|
|
|
|
|
|
|
|
<% end %> |
|
|
</div> |
|
|
</div> |
|
|
<% end %> |
|
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
<script> |
|
|
<script> |
|
|
document.addEventListener("DOMContentLoaded", function () { |
|
|
document.addEventListener("DOMContentLoaded", function () { |
|
|
const entryArtSelect = document.getElementById("entry_art_select"); |
|
|
const entryArtSelect = document.getElementById("entry_art_select"); |
|
|
|