Files
dmtools/templates/npc/edit.html.twig
T
FrankandClaude Sonnet 5 71b5cb6633 Show the NPC portrait on the detail page
Npc::getPortraitPath() maps the name to image/npc-pictures/<NameNoSpaces>.png;
the edit page renders it beside the heading (with family · occupation), and
drops the <img> via onerror when a portrait is missing.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-06 16:10:00 +02:00

63 lines
2.5 KiB
Twig

{% extends 'base.html.twig' %}
{% block title %}{{ npc.name }} · NPC's · dmtools{% endblock %}
{% block body %}
<div class="d-flex justify-content-between align-items-start mb-3 gap-3">
<div class="d-flex gap-3">
<img src="{{ asset(npc.portraitPath) }}" alt="Portrait of {{ npc.name }}"
width="96" height="120"
class="rounded border object-fit-cover flex-shrink-0"
onerror="this.remove()">
<div>
<a href="{{ path('app_npcs') }}" class="text-decoration-none small">&larr; All NPC's</a>
<h1 class="h3 mb-0">{{ npc.name }}</h1>
<span class="text-body-secondary">{{ npc.family }}{% if npc.occupation %} · {{ npc.occupation }}{% endif %}</span>
</div>
</div>
{% if npc.updatedAt %}
<span class="text-body-secondary small">Updated {{ npc.updatedAt|date('Y-m-d H:i') }}</span>
{% endif %}
</div>
{{ form_start(form) }}
<div class="row g-4">
<div class="col-lg-5">
<div class="card shadow-sm">
<div class="card-header">Details</div>
<div class="card-body">
<div class="row">
<div class="col-8">{{ form_row(form.name) }}</div>
<div class="col-4">{{ form_row(form.age) }}</div>
</div>
{{ form_row(form.family) }}
{{ form_row(form.race) }}
{{ form_row(form.occupation) }}
{{ form_row(form.villageStatus) }}
{{ form_row(form.bloodCartInvolvement) }}
{{ form_row(form.mysteryImportance) }}
<div class="row">
<div class="col-6">{{ form_row(form.father) }}</div>
<div class="col-6">{{ form_row(form.mother) }}</div>
</div>
{{ form_row(form.relationships) }}
</div>
</div>
</div>
<div class="col-lg-7">
<div class="card shadow-sm">
<div class="card-header">Game notes</div>
<div class="card-body">
{{ form_row(form.gameNotes, {label: false}) }}
</div>
</div>
</div>
</div>
<div class="mt-3 d-flex gap-2">
<button class="btn btn-primary">Save</button>
<a href="{{ path('app_npcs') }}" class="btn btn-outline-secondary">Cancel</a>
</div>
{{ form_end(form) }}
{% endblock %}