102 lines
3.8 KiB
HTML
102 lines
3.8 KiB
HTML
{% extends "admin/base.html" %}
|
|
{% block title %}{{ 'Edit topic' if topic else 'New topic' }}{% endblock %}
|
|
|
|
{% macro val(field, default='') -%}
|
|
{%- if form is not none -%}{{ form.get(field, default) }}
|
|
{%- elif topic is not none -%}{{ topic[field] if topic[field] is not none else default }}
|
|
{%- else -%}{{ default }}{%- endif -%}
|
|
{%- endmacro %}
|
|
|
|
{% block content %}
|
|
{% set current_section = (form.get('section_id') if form else (topic.section_id if topic else request.args.get('section'))) %}
|
|
{% set current_media = (form.get('media_type') if form else (topic.media_type if topic else 'none')) %}
|
|
|
|
<header class="page-head">
|
|
<div>
|
|
<h1>{{ 'Edit topic' if topic else 'New topic' }}</h1>
|
|
<p class="muted">{{ topic.title if topic else 'Add a new topic to a section.' }}</p>
|
|
</div>
|
|
<a class="btn btn--ghost" href="{{ url_for('admin.dashboard') }}">← Back</a>
|
|
</header>
|
|
|
|
<form method="post" class="form-card stack"
|
|
action="{{ url_for('admin.topic_form', topic_id=topic.id) if topic else url_for('admin.topic_form') }}">
|
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
|
|
|
<div class="grid-2">
|
|
<label class="field">
|
|
<span>Section *</span>
|
|
<select name="section_id" required>
|
|
{% for s in sections %}
|
|
<option value="{{ s.id }}" {{ 'selected' if current_section and s.id|string == current_section|string }}>
|
|
§{{ '%02d' % s.num }} — {{ s.title }}
|
|
</option>
|
|
{% endfor %}
|
|
</select>
|
|
</label>
|
|
<label class="field">
|
|
<span>Sort order</span>
|
|
<input type="number" name="sort_order" value="{{ val('sort_order', '10') }}">
|
|
</label>
|
|
</div>
|
|
|
|
<label class="field">
|
|
<span>Title *</span>
|
|
<input type="text" name="title" value="{{ val('title') }}" required>
|
|
</label>
|
|
|
|
<label class="field">
|
|
<span>Slug <small class="muted">(optional — auto-generated from the title, must be unique)</small></span>
|
|
<input type="text" name="slug" value="{{ val('slug') }}" placeholder="auto">
|
|
</label>
|
|
|
|
<label class="field">
|
|
<span>Body <small class="muted">(HTML — use <p>, <strong>, <ul><li>)</small></span>
|
|
<textarea name="body_html" rows="7">{{ val('body_html') }}</textarea>
|
|
</label>
|
|
|
|
<fieldset class="fieldset">
|
|
<legend>Media</legend>
|
|
<div class="grid-2">
|
|
<label class="field">
|
|
<span>Type</span>
|
|
<select name="media_type">
|
|
{% for mt in media_types %}
|
|
<option value="{{ mt }}" {{ 'selected' if mt == current_media }}>{{ mt }}</option>
|
|
{% endfor %}
|
|
</select>
|
|
</label>
|
|
<label class="field">
|
|
<span>Caption</span>
|
|
<input type="text" name="media_caption" value="{{ val('media_caption') }}">
|
|
</label>
|
|
</div>
|
|
<label class="field">
|
|
<span>Media URL</span>
|
|
<input type="text" name="media_url" value="{{ val('media_url') }}"
|
|
placeholder="/static/img/photo.jpg · /static/vid/demo.mp4 · https://www.youtube.com/embed/ID">
|
|
</label>
|
|
<p class="hint muted">image → <img> · video → <video> · embed → <iframe> (use a YouTube <code>/embed/</code> URL)</p>
|
|
</fieldset>
|
|
|
|
<fieldset class="fieldset">
|
|
<legend>Link button (optional)</legend>
|
|
<div class="grid-2">
|
|
<label class="field">
|
|
<span>Link URL</span>
|
|
<input type="text" name="link_url" value="{{ val('link_url') }}" placeholder="https://…">
|
|
</label>
|
|
<label class="field">
|
|
<span>Link label</span>
|
|
<input type="text" name="link_label" value="{{ val('link_label') }}" placeholder="Learn more">
|
|
</label>
|
|
</div>
|
|
</fieldset>
|
|
|
|
<div class="form-actions">
|
|
<a class="btn btn--ghost" href="{{ url_for('admin.dashboard') }}">Cancel</a>
|
|
<button class="btn btn--primary" type="submit">Save topic</button>
|
|
</div>
|
|
</form>
|
|
{% endblock %}
|