Files
nouri-App/nouri/templates/items/form.html
T

287 lines
14 KiB
HTML

{% extends "base.html" %}
{% block title %}{% if item %}Bearbeiten{% else %}Neu{% endif %} | Nouri{% endblock %}
{% block content %}
<section class="page-intro">
<div>
<p class="eyebrow">{{ item_kind_labels[kind] }}</p>
<h1>{% if item %}{{ item.name }} bearbeiten{% else %}Neue{% endif %} {{ item_kind_singular_labels[kind] }}</h1>
<p class="lead">
{% if kind == 'food' %}
Name, Sichtbarkeit und ein paar ruhige Hinweise dazu, wie ein Lebensmittel in Vorschlägen gut passt.
{% else %}
Name, Sichtbarkeit, Tageszeit und ein kurzer Charakter der Idee. So bleiben Mahlzeitenideen alltagsnah und leicht pflegbar.
{% endif %}
</p>
</div>
{% if item %}
<div class="intro-pills">
<span class="status-pill">{{ item.visibility_label }}</span>
<span class="status-pill status-soft">{{ item.owner_label }}</span>
<span class="status-pill">{{ item.for_label }}</span>
</div>
{% endif %}
</section>
<section class="panel form-panel">
<form method="post" enctype="multipart/form-data" class="stack-form">
{{ csrf_input() }}
<label>
Name
<input type="text" name="name" value="{{ form_data.name }}" required>
</label>
<div class="dual-grid">
<label>
Sichtbarkeit
<select name="visibility">
{% for value, label in visibility_options %}
<option value="{{ value }}" {% if form_data.visibility == value %}selected{% endif %}>{{ label }}</option>
{% endfor %}
</select>
<small class="helper-text">{{ visibility_descriptions[form_data.visibility] }}</small>
</label>
<label>
Für wen?
<select name="target_user_id">
{% for option in target_user_options %}
<option value="{{ option.value }}" {% if form_data.target_user_raw == option.value %}selected{% endif %}>{{ option.label }}</option>
{% endfor %}
</select>
</label>
</div>
{% if kind == 'food' %}
<label>
Baustein
<select name="base_type">
{% for value, label in builder_options %}
<option value="{{ value }}" {% if form_data.base_type == value %}selected{% endif %}>{{ label }}</option>
{% endfor %}
</select>
<small class="helper-text">{{ builder_descriptions[form_data.base_type] }}</small>
</label>
<div class="dual-grid">
<label>
Rolle in Vorschlägen
<select name="suggestion_role">
{% for value, label in food_role_options %}
<option value="{{ value }}" {% if form_data.suggestion_role == value %}selected{% endif %}>{{ label }}</option>
{% endfor %}
</select>
<small class="helper-text">{{ food_role_descriptions[form_data.suggestion_role] }}</small>
</label>
<label>
Wird eher vorgeschlagen
<select name="suggestion_priority">
{% for value, label in suggestion_priority_options %}
<option value="{{ value }}" {% if form_data.suggestion_priority == value %}selected{% endif %}>{{ label }}</option>
{% endfor %}
</select>
</label>
</div>
<label class="inline-check">
<input type="checkbox" name="can_be_meal_core" value="1" {% if form_data.can_be_meal_core %}checked{% endif %}>
<span>Kann gut eine Mahlzeit tragen</span>
</label>
<small class="helper-text">Praktisch für Dinge wie Tofu, Joghurt oder Müsli. Extras wie Proteinpulver, Tomatenmark oder Saaten bleiben so eher Ergänzungen.</small>
{% else %}
<div class="dual-grid">
<label>
Mahlzeittyp
<select name="meal_type">
{% for value, label in meal_type_options %}
<option value="{{ value }}" {% if form_data.meal_type == value %}selected{% endif %}>{{ label }}</option>
{% endfor %}
</select>
</label>
<label>
Energiedichte
<select name="energy_density">
{% for value, label in energy_density_options %}
<option value="{{ value }}" {% if form_data.energy_density == value %}selected{% endif %}>{{ label }}</option>
{% endfor %}
</select>
<small class="helper-text">Hilft Nouri dabei, passende Ideen etwas ruhiger und persönlicher zu sortieren.</small>
</label>
</div>
<fieldset>
<legend>Charakter der Mahlzeit</legend>
<div class="checkbox-grid meal-style-option-grid">
{% for value, label in meal_style_options %}
<label class="meal-style-option">
<input type="checkbox" name="meal_tags" value="{{ value }}" {% if value in form_data.meal_tags %}checked{% endif %}>
<span class="meal-style-option-card">
<span class="meal-style-option-icon">
<span class="ui-icon icon-meal-style-{{ value }}"></span>
</span>
<span class="meal-style-option-label">{{ label }}</span>
</span>
</label>
{% endfor %}
</div>
<small class="helper-text">Nur das auswählen, was wirklich hilft. Alles andere kann leer bleiben.</small>
</fieldset>
{% endif %}
{% if kind == 'food' %}
<label>
Energiedichte
<select name="energy_density">
{% for value, label in energy_density_options %}
<option value="{{ value }}" {% if form_data.energy_density == value %}selected{% endif %}>{{ label }}</option>
{% endfor %}
</select>
<small class="helper-text">Hilft Nouri dabei, passende Ideen etwas ruhiger und persönlicher zu sortieren.</small>
</label>
{% endif %}
<label>
Notiz
<textarea name="note" rows="4" placeholder="Optional, wenn eine kleine Erinnerung hilfreich ist.">{{ form_data.note }}</textarea>
</label>
<label>
Foto
<input type="file" name="photo" accept="image/png,image/jpeg,image/gif,image/webp">
</label>
{% if item and item.photo_filename %}
<div class="inline-photo">
<img
src="{{ image_url(item.photo_filename, 'lg') }}"
srcset="{{ image_srcset(item.photo_filename) }}"
sizes="{{ image_sizes('detail') }}"
alt="{{ item.name }}"
loading="lazy">
</div>
{% endif %}
<fieldset>
<legend>Passende Tageszeiten</legend>
<div class="checkbox-grid daypart-option-grid">
{% for daypart in dayparts %}
<label class="daypart-option">
<input type="checkbox" name="daypart_ids" value="{{ daypart.id }}" {% if daypart.id in form_data.daypart_ids %}checked{% endif %}>
<span class="daypart-option-card">
<span class="daypart-option-icon">
<span class="ui-icon {{ daypart_icon_class(daypart.slug) }}"></span>
</span>
<span class="daypart-option-label">{{ daypart.name }}</span>
</span>
</label>
{% endfor %}
</div>
</fieldset>
{% if kind == 'meal' %}
<fieldset>
<legend>Bestandteile der Mahlzeitenidee</legend>
<p class="muted">Du kannst eine Mahlzeitenidee frei benennen oder aus sichtbaren Lebensmitteln zusammensetzen. Nouri nutzt dabei später Grundtyp, Rolle und Tageszeit der Lebensmittel für ruhigere Vorschläge.</p>
<div class="inline-form">
<label class="wide">
Lebensmittel suchen
<input
type="text"
name="food_search"
value="{{ form_data.food_search }}"
placeholder="z. B. Reis, Banane, Joghurt"
data-filter-input
data-filter-target="#meal-components-list"
data-filter-limit="3"
>
</label>
<button class="secondary" type="submit" name="form_action" value="filter_foods">Suchen</button>
</div>
<p class="helper-text">Während der Suche zeigt Nouri nur die drei passendsten Lebensmittel, damit die Auswahl ruhig bleibt.</p>
{% if food_groups %}
<div class="stack-sections" id="meal-components-list">
{% for group in food_groups %}
<div class="component-group">
<div class="panel-head">
<h3>{{ group["title"] }}</h3>
<span>{{ group["items"]|length }} Einträge</span>
</div>
<div class="checkbox-grid filterable-checkbox-group" data-filter-group>
{% for food in group["items"] %}
<label class="check-option" data-filter-label="{{ food.name|lower }} {{ food.category|default('', true)|lower }} {{ food.base_type_label|lower }} {{ food.suggestion_role_label|lower }}">
<input type="checkbox" name="component_ids" value="{{ food.id }}" {% if food.id in form_data.component_ids %}checked{% endif %}>
<span>{{ food.name }} · {{ food.base_type_label }} · {{ food.visibility_label }}</span>
</label>
{% endfor %}
</div>
</div>
{% endfor %}
</div>
{% else %}
<p class="empty-state">Lege zuerst ein paar Lebensmittel an, damit du daraus Mahlzeitenideen bauen kannst.</p>
{% endif %}
<div class="quick-food-panel">
<div class="panel-head">
<h3>Neues Lebensmittel direkt anlegen</h3>
<span>ohne die Seite zu verlassen</span>
</div>
<div class="quick-food-grid">
<label>
Name
<input type="text" name="quick_food_name" value="{{ form_data.quick_food_name }}" placeholder="z. B. Hüttenkäse">
</label>
<label>
Baustein
<select name="quick_food_base_type">
{% for value, label in builder_options %}
<option value="{{ value }}" {% if form_data.quick_food_base_type == value %}selected{% endif %}>{{ label }}</option>
{% endfor %}
</select>
</label>
<label>
Rolle in Vorschlägen
<select name="quick_food_role">
{% for value, label in food_role_options %}
<option value="{{ value }}" {% if form_data.quick_food_role == value %}selected{% endif %}>{{ label }}</option>
{% endfor %}
</select>
</label>
<label>
Wird eher vorgeschlagen
<select name="quick_food_priority">
{% for value, label in suggestion_priority_options %}
<option value="{{ value }}" {% if form_data.quick_food_priority == value %}selected{% endif %}>{{ label }}</option>
{% endfor %}
</select>
</label>
<label>
Energiedichte
<select name="quick_food_energy_density">
{% for value, label in energy_density_options %}
<option value="{{ value }}" {% if form_data.quick_food_energy_density == value %}selected{% endif %}>{{ label }}</option>
{% endfor %}
</select>
</label>
<label class="inline-check">
<input type="checkbox" name="quick_food_can_be_meal_core" value="1" {% if form_data.quick_food_can_be_meal_core %}checked{% endif %}>
<span>Kann gut eine Mahlzeit tragen</span>
</label>
<label class="wide">
Notiz
<input type="text" name="quick_food_note" value="{{ form_data.quick_food_note }}" placeholder="Optional">
</label>
<button type="submit" name="form_action" value="quick_add_food" class="secondary">Lebensmittel anlegen und übernehmen</button>
</div>
</div>
</fieldset>
{% endif %}
<div class="form-actions">
<button type="submit" name="form_action" value="save_item">Speichern</button>
<a class="ghost-button" href="{{ url_for('main.item_list', kind=kind) }}">Zurück</a>
</div>
</form>
</section>
{% endblock %}