further frontend annoyances

This commit is contained in:
Simon Martens
2026-01-16 19:08:30 +01:00
parent 136cb5f757
commit 7db1e4390e
9 changed files with 1060 additions and 460 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -49,6 +49,12 @@
<i class="ri-loop-left-line"></i> Reset
</a>
</div>
&middot;
<div>
<a href="/almanach/{{- $model.result.Entry.MusenalmID -}}/edit" class="text-gray-700 no-underline hover:text-slate-950 block">
<i class="ri-edit-2-line"></i> Almanach
</a>
</div>
</div>
{{- end -}}
</div>
@@ -137,6 +143,9 @@
"content_types" $model.content_types
"musenalm_types" $model.musenalm_types
"pagination_values" $model.pagination_values
"agents" $model.result.Agents
"content_agents" (index $model.result.ContentsAgents $content.Id)
"agent_relations" $model.agent_relations
"open_edit" false
"is_new" false
) -}}

View File

@@ -14,6 +14,9 @@
"content_types" $contentTypes
"musenalm_types" $musenalmTypes
"pagination_values" $paginationValues
"agents" (index . "agents")
"content_agents" (index . "content_agents")
"agent_relations" (index . "agent_relations")
"open_edit" true
"is_new" true
) -}}

View File

@@ -17,6 +17,9 @@
"content_types" $contentTypes
"musenalm_types" $musenalmTypes
"pagination_values" $paginationValues
"agents" (index . "agents")
"content_agents" (index . "content_agents")
"agent_relations" (index . "agent_relations")
"open_edit" $openEdit
"is_new" $isNew
"error" $error

View File

@@ -2,6 +2,11 @@
{{- $entry := index . "entry" -}}
{{- $musenalmTypes := index . "musenalm_types" -}}
{{- $paginationValues := index . "pagination_values" -}}
{{- $agents := index . "agents" -}}
{{- $contentAgents := index . "content_agents" -}}
{{- $contentAgentsRender := index . "content_agents_render" -}}
{{- $contentAgentsNew := index . "content_agents_new" -}}
{{- $agentRelations := index . "agent_relations" -}}
{{- $overrideID := index . "content_id" -}}
{{- $contentID := $content.Id -}}
{{- if and $overrideID (ne $overrideID "") -}}
@@ -11,11 +16,14 @@
{{- $baseID := printf "content-%s" $contentID -}}
{{- $annotationID := printf "%sannotation" $prefix -}}
{{- $annotationToolbar := printf "%sannotation-toolbar" $prefix -}}
{{- $agentsPrefix := printf "content_%s_agents" $contentID -}}
{{- $agentsAddToggleID := printf "content-%s-agents-add-toggle" $contentID -}}
{{- $agentsSectionID := printf "content-%s-agents-section" $contentID -}}
<div class="border border-slate-200 bg-white rounded-xs" data-role="content-card" data-content-id="{{ $contentID }}" data-content-order="{{ $content.Numbering }}">
<input type="hidden" name="{{ $prefix }}numbering" class="content-numbering" value="{{- $content.Numbering -}}" />
<input type="hidden" name="{{ $prefix }}entries" value="{{ $entry.Id }}" />
<div class="border border-slate-200 bg-stone-100 rounded-xs">
<div class="border border-slate-200 border-b-0 bg-stone-100 rounded-xs rounded-b-none">
<div class="flex flex-wrap items-center justify-between gap-4 border-b border-slate-200 bg-stone-200 px-3 py-2">
<div class="flex items-center gap-3">
<button type="button" class="text-slate-600 cursor-grab text-sm" data-role="content-drag-handle" draggable="true" aria-label="Beitrag verschieben">
@@ -39,7 +47,7 @@
</multi-select-simple>
</div>
<div class="flex items-center gap-2">
<select name="{{ $prefix }}edit_state" id="{{ $baseID }}-edit-state" class="inputselect font-bold status-select px-2 py-1" data-status="{{ $content.EditState }}">
<select name="{{ $prefix }}edit_state" id="{{ $baseID }}-edit-state" class="inputselect font-bold status-select px-2 py-1 shadow-sm rounded-sm" data-status="{{ $content.EditState }}">
<option value="Unknown" {{ if eq $content.EditState "Unknown" }}selected{{ end }}>Unbekannt</option>
<option value="ToDo" {{ if eq $content.EditState "ToDo" }}selected{{ end }}>Zu erledigen</option>
<option value="Review" {{ if eq $content.EditState "Review" }}selected{{ end }}>Überprüfen</option>
@@ -59,7 +67,7 @@
</div>
<div id="{{ $baseID }}-edit-fields" class="mt-3 flex flex-col gap-3"></div>
<div-manager dm-target="{{ $baseID }}-edit-fields" class="flex items-center justify-end mt-3">
<div-manager dm-target="{{ $baseID }}-edit-fields" class="flex items-center justify-end mt-1">
<button class="dm-menu-button text-right cursor-pointer whitespace-nowrap"><i class="ri-add-line"></i>
Felder hinzufügen</button>
@@ -205,4 +213,240 @@
</div-manager>
</div>
</div>
<div class="mt-0">
<relations-editor data-prefix="{{ $agentsPrefix }}" data-link-base="/person/" data-new-label="(Neu)" data-add-toggle-id="{{ $agentsAddToggleID }}">
<div class="inputwrapper !border-none">
<div class="grid grid-cols-[8rem_1fr] gap-x-3 gap-y-2 items-start px-3 py-2">
<div class="flex flex-col gap-1 text-sm text-gray-700 font-bold">
<div class="flex items-center gap-1">
<span>Personen &amp; Körperschaften</span>
<tool-tip position="top" class="!inline">
<div class="data-tip">{{ helpOr "contents" "agents" "Beteiligte Personen oder Körperschaften." }}</div>
<i class="ri-question-line"></i>
</tool-tip>
</div>
</div>
<div>
<div id="{{ $agentsSectionID }}" class="rel-section-container px-0 mt-0">
{{- if and $contentAgentsRender (gt (len $contentAgentsRender) 0) -}}
{{- range $i, $r := $contentAgentsRender -}}
{{- $a := index $agents $r.Agent -}}
<div data-rel-row class="contents-agent-row rel-row">
<div class="rel-grid">
<div data-rel-strike class="relation-strike rel-name-col">
{{- if $a -}}
<a data-rel-link href="/person/{{ $a.Id }}" class="rel-link" target="_blank" rel="noreferrer">
<span data-rel-name>{{- $a.Name -}}</span>
</a>
{{- if $a.BiographicalData -}}
<div data-rel-detail-container class="rel-detail"><span data-rel-detail>{{- $a.BiographicalData -}}</span></div>
{{- end -}}
{{- else -}}
<div class="text-base text-gray-800">Unbekannte Person</div>
{{- end -}}
</div>
<div data-rel-strike class="relation-strike">
<select name="{{ $agentsPrefix }}_type[{{ $r.Id }}]" id="{{ $agentsPrefix }}_type_{{ $r.Id }}" autocomplete="off" class="inputselect font-bold w-full">
{{- range $t := $agentRelations -}}
<option value="{{- $t -}}" {{ if eq $r.Type $t }}selected{{ end }}>{{- $t -}}</option>
{{- end -}}
</select>
</div>
<div data-rel-strike class="relation-strike rel-uncertain-container">
<input
type="checkbox"
name="{{ $agentsPrefix }}_uncertain[{{ $r.Id }}]"
id="{{ $agentsPrefix }}_uncertain_{{ $r.Id }}"
{{ if $r.Uncertain }}checked{{ end }} />
<label for="{{ $agentsPrefix }}_uncertain_{{ $r.Id }}" class="rel-uncertain-label">Unsicher</label>
</div>
<div class="rel-button-container">
<button
type="button"
class="text-sm"
data-delete-toggle="{{ $agentsPrefix }}_delete_{{ $r.Id }}">
<i class="ri-delete-bin-line mr-1"></i>
<span class="no-underline" data-delete-label data-delete-default="Entfernen" data-delete-active="Wird entfernt" data-delete-hover="Rückgängig">Entfernen</span>
</button>
<input type="checkbox" class="hidden" name="{{ $agentsPrefix }}_delete[{{ $r.Id }}]" id="{{ $agentsPrefix }}_delete_{{ $r.Id }}" />
</div>
</div>
<input type="hidden" name="{{ $agentsPrefix }}_id[{{ $r.Id }}]" value="{{ $r.Id }}" />
<input type="hidden" name="{{ $agentsPrefix }}_agent[{{ $r.Id }}]" value="{{ $r.Agent }}" />
</div>
{{- end -}}
{{- else if $contentAgents -}}
{{- range $i, $r := $contentAgents -}}
{{- $a := index $agents $r.Agent -}}
<div data-rel-row class="contents-agent-row rel-row">
<div class="rel-grid">
<div data-rel-strike class="relation-strike rel-name-col">
{{- if $a -}}
<a data-rel-link href="/person/{{ $a.Id }}" class="rel-link" target="_blank" rel="noreferrer">
<span data-rel-name>{{- $a.Name -}}</span>
</a>
{{- if $a.BiographicalData -}}
<div data-rel-detail-container class="rel-detail"><span data-rel-detail>{{- $a.BiographicalData -}}</span></div>
{{- end -}}
{{- else -}}
<div class="text-base text-gray-800">Unbekannte Person</div>
{{- end -}}
</div>
<div data-rel-strike class="relation-strike">
<select name="{{ $agentsPrefix }}_type[{{ $r.Id }}]" id="{{ $agentsPrefix }}_type_{{ $r.Id }}" autocomplete="off" class="inputselect font-bold w-full">
{{- range $t := $agentRelations -}}
<option value="{{- $t -}}" {{ if eq $r.Type $t }}selected{{ end }}>{{- $t -}}</option>
{{- end -}}
</select>
</div>
<div data-rel-strike class="relation-strike rel-uncertain-container">
<input
type="checkbox"
name="{{ $agentsPrefix }}_uncertain[{{ $r.Id }}]"
id="{{ $agentsPrefix }}_uncertain_{{ $r.Id }}"
{{ if $r.Uncertain }}checked{{ end }} />
<label for="{{ $agentsPrefix }}_uncertain_{{ $r.Id }}" class="rel-uncertain-label">Unsicher</label>
</div>
<div class="rel-button-container">
<button
type="button"
class="text-sm"
data-delete-toggle="{{ $agentsPrefix }}_delete_{{ $r.Id }}">
<i class="ri-delete-bin-line mr-1"></i>
<span class="no-underline" data-delete-label data-delete-default="Entfernen" data-delete-active="Wird entfernt" data-delete-hover="Rückgängig">Entfernen</span>
</button>
<input type="checkbox" class="hidden" name="{{ $agentsPrefix }}_delete[{{ $r.Id }}]" id="{{ $agentsPrefix }}_delete_{{ $r.Id }}" />
</div>
</div>
<input type="hidden" name="{{ $agentsPrefix }}_id[{{ $r.Id }}]" value="{{ $r.Id }}" />
<input type="hidden" name="{{ $agentsPrefix }}_agent[{{ $r.Id }}]" value="{{ $r.Agent }}" />
</div>
{{- end -}}
{{- else -}}
<div class="rel-empty-text">Keine Personen verknüpft.</div>
{{- end -}}
</div>
<div data-role="relation-add-row" class="flex flex-col gap-2 mt-2 px-0">
{{- if and $contentAgentsNew (gt (len $contentAgentsNew) 0) -}}
{{- range $i, $r := $contentAgentsNew -}}
{{- $a := index $agents $r.Agent -}}
<div data-rel-row class="rel-row">
<div class="rel-grid">
<div data-rel-strike class="relation-strike rel-name-col">
<div class="text-base text-gray-800 truncate">
<a data-rel-link class="no-underline hover:text-slate-900" href="/person/{{ $r.Agent }}" target="_blank" rel="noreferrer">
<span data-rel-name>{{- if $a -}}{{ $a.Name }}{{- end -}}</span>
</a>
<em data-rel-new class="rel-new-badge">(Neu)</em>
</div>
{{- if $a -}}
{{- if $a.BiographicalData -}}
<div data-rel-detail-container class="rel-detail"><span data-rel-detail>{{- $a.BiographicalData -}}</span></div>
{{- end -}}
{{- end -}}
</div>
<div data-rel-strike class="relation-strike">
<select name="{{ $agentsPrefix }}_new_type" class="inputselect font-bold w-full">
{{- range $t := $agentRelations -}}
<option value="{{- $t -}}" {{ if eq $r.Type $t }}selected{{ end }}>{{- $t -}}</option>
{{- end -}}
</select>
</div>
<div data-rel-strike class="relation-strike rel-uncertain-container">
<input data-rel-input="uncertain" type="checkbox" name="{{ $agentsPrefix }}_new_uncertain" value="{{ $r.Agent }}" {{ if $r.Uncertain }}checked{{ end }} />
<label data-rel-uncertain-label class="rel-uncertain-label">Unsicher</label>
</div>
<div class="rel-button-container">
<button type="button" class="text-sm text-red-700 hover:text-red-900" data-role="relation-new-delete">
<i class="ri-delete-bin-line mr-1"></i> Entfernen
</button>
</div>
</div>
<input type="hidden" data-rel-input="id" name="{{ $agentsPrefix }}_new_id" value="{{ $r.Agent }}" />
</div>
{{- end -}}
{{- end -}}
</div>
<div data-role="relation-add-panel" class="mt-2 px-0 hidden">
<div class="rel-row">
<div class="rel-grid">
<div class="min-w-0">
<label for="{{ $agentsAddToggleID }}-select" class="sr-only">Akteur suchen</label>
<single-select-remote
id="{{ $agentsAddToggleID }}-select"
data-role="relation-add-select"
name="{{ $agentsPrefix }}_new_id"
placeholder="Akteur suchen..."
data-endpoint="/api/agents/search"
data-result-key="agents"
data-minchars="1"
data-limit="15">
</single-select-remote>
</div>
<div>
<label for="{{ $agentsPrefix }}_new_type" class="sr-only">Beziehung</label>
<select data-role="relation-type-select" name="{{ $agentsPrefix }}_new_type" id="{{ $agentsPrefix }}_new_type" autocomplete="off" class="inputselect font-bold w-full">
{{- range $t := $agentRelations -}}
<option value="{{- $t -}}">{{- $t -}}</option>
{{- end -}}
</select>
</div>
<div class="rel-uncertain-container">
<input data-role="relation-uncertain" type="checkbox" name="{{ $agentsPrefix }}_new_uncertain" id="{{ $agentsPrefix }}_new_uncertain" />
<label for="{{ $agentsPrefix }}_new_uncertain" class="rel-uncertain-label">Unsicher</label>
</div>
<div class="rel-button-container">
<div class="flex items-center gap-3 text-lg">
<button type="button" data-role="relation-add-apply" class="text-gray-700 hover:text-gray-900" aria-label="Person hinzufügen">
<i class="ri-check-line"></i>
</button>
<button type="button" data-role="relation-add-close" class="text-gray-700 hover:text-gray-900" aria-label="Ausblenden">
<i class="ri-close-line"></i>
</button>
</div>
</div>
</div>
<div data-role="relation-add-error" class="text-xs text-red-700 mt-2 hidden" data-error-empty="Bitte Akteur auswählen.">Bitte Akteur auswählen.</div>
</div>
</div>
<template data-role="relation-new-template">
<div data-rel-row class="rel-row">
<div class="rel-grid">
<div data-rel-strike class="relation-strike rel-name-col">
<div class="text-base text-gray-800 truncate">
<a data-rel-link class="no-underline hover:text-slate-900">
<span data-rel-name></span>
</a>
<em data-rel-new class="rel-new-badge"></em>
</div>
<div data-rel-detail-container class="rel-detail"><span data-rel-detail></span></div>
</div>
<div data-rel-strike class="relation-strike">
<select data-rel-input="type" class="inputselect font-bold w-full"></select>
</div>
<div data-rel-strike class="relation-strike rel-uncertain-container">
<input data-rel-input="uncertain" type="checkbox" />
<label data-rel-uncertain-label class="rel-uncertain-label">Unsicher</label>
</div>
<div class="rel-button-container">
<button type="button" class="text-sm text-red-700 hover:text-red-900" data-role="relation-new-delete">
<i class="ri-delete-bin-line mr-1"></i> Entfernen
</button>
</div>
</div>
<input type="hidden" data-rel-input="id" />
</div>
</template>
<div class="mt-2 pb-2 flex justify-end gap-4">
<a href="/personen/new/" class="text-gray-700 hover:text-slate-950 no-underline" target="_blank" rel="noreferrer">
<i class="ri-add-line"></i> Neue Person
</a>
<button type="button" id="{{ $agentsAddToggleID }}" class="text-gray-700 hover:text-slate-950 no-underline text-left">
<i class="ri-link"></i> Person verlinken
</button>
</div>
</div>
</div>
</relations-editor>
</div>
</div>

View File

@@ -4,6 +4,9 @@
{{- $contentTypes := index . "content_types" -}}
{{- $musenalmTypes := index . "musenalm_types" -}}
{{- $paginationValues := index . "pagination_values" -}}
{{- $agents := index . "agents" -}}
{{- $contentAgents := index . "content_agents" -}}
{{- $agentRelations := index . "agent_relations" -}}
{{- $overrideID := index . "content_id" -}}
{{- $openEdit := index . "open_edit" -}}
{{- $isNew := index . "is_new" -}}
@@ -49,7 +52,7 @@
</div>
</div>
<div class="flex items-center gap-2">
<span class="status-badge text-xs" data-status="{{ $content.EditState }}">
<span class="status-badge text-xs shadow-sm" data-status="{{ $content.EditState }}">
<i class="status-icon {{- if eq $content.EditState "Edited" }} ri-checkbox-circle-line{{- else if eq $content.EditState "Seen" }} ri-information-line{{- else if eq $content.EditState "Review" }} ri-search-line{{- else if eq $content.EditState "ToDo" }} ri-list-check{{- else }} ri-forbid-2-line{{- end }}"></i>
{{- if eq $content.EditState "Edited" -}}Erfasst{{- else if eq $content.EditState "Review" -}}Überprüfen{{- else if eq $content.EditState "ToDo" -}}Zu erledigen{{- else if eq $content.EditState "Seen" -}}Autopsiert{{- else -}}Unbekannt{{- end -}}
</span>
@@ -76,6 +79,26 @@
<div class="text-sm font-bold text-gray-700">Autorangabe</div>
<div class="text-base italic">{{- $content.ResponsibilityStmt -}}</div>
{{- end -}}
{{- if $contentAgents -}}
<div class="text-sm font-bold text-gray-700">Personen</div>
<div class="text-base">
<div class="flex flex-col">
{{- range $_, $rel := $contentAgents -}}
{{- $agent := index $agents $rel.Agent -}}
{{- if $agent -}}
<div class="font-sans w-max">
<a href="/person/{{- $agent.Id -}}" class="no-underline hover:text-slate-900">
{{- $agent.Name -}}
</a>
{{- if $agent.BiographicalData -}}
<span>({{ $agent.BiographicalData }})</span>
{{- end -}}
</div>
{{- end -}}
{{- end -}}
</div>
</div>
{{- end -}}
{{- if $content.Annotation -}}
{{- $link := printf "%s%s" "/almanach/" $entry.MusenalmIDString -}}
<div class="text-sm font-bold text-gray-700">Anmerkung</div>
@@ -109,6 +132,9 @@
"content_types" $contentTypes
"musenalm_types" $musenalmTypes
"pagination_values" $paginationValues
"agents" $agents
"content_agents" $contentAgents
"agent_relations" $agentRelations
) -}}
<div class="w-full flex items-center justify-end gap-3 mt-4 flex-wrap">
<button type="button" class="resetbutton w-40 flex items-center gap-2 justify-center" data-role="content-edit-cancel">

View File

@@ -28,6 +28,7 @@ export class RelationsEditor extends HTMLElement {
this._emptyText = this.querySelector(".rel-empty-text");
this._setupAddPanel();
this._setupDeleteToggles();
this._setupNewRowDeletes();
this._setupPreferredOptionHandling();
}
@@ -248,6 +249,7 @@ export class RelationsEditor extends HTMLElement {
if (uncertain && this._uncertain) {
uncertain.checked = this._uncertain.checked;
uncertain.name = `${this._prefix}_new_uncertain`;
uncertain.value = this._pendingItem.id;
const uncertainId = `${this._prefix}_new_uncertain_row`;
uncertain.id = uncertainId;
const uncertainLabel = fragment.querySelector("[data-rel-uncertain-label]");
@@ -389,6 +391,31 @@ export class RelationsEditor extends HTMLElement {
});
}
_setupNewRowDeletes() {
if (!this._addRow) {
return;
}
this._addRow.querySelectorAll(ROLE_NEW_DELETE).forEach((button) => {
if (button.dataset.relationNewBound === "true") {
return;
}
button.dataset.relationNewBound = "true";
button.addEventListener("click", () => {
const row = button.closest(ROLE_REL_ROW);
if (row) {
row.remove();
}
this._pendingItem = null;
this._clearAddPanel();
if (this._addPanel) {
this._addPanel.classList.add("hidden");
}
this._updateEmptyTextVisibility();
this._updatePreferredOptions();
});
});
}
_setupPreferredOptionHandling() {
if (this._prefix !== "entries_series" || !this._preferredLabel) {
return;