Improve admin candidate modal UX and add clip menu visibility toggle

- Widen AdminCandidateEditorModal to size lg for better readability
- Rename "Clip-Compilation" section to "Clip / Compilation", update copy to reflect single clips too, drop upload hint and Clip-Plattform field, rename label to "Link"
- Fix NativeSelect dropdown clipping inside overflow-y-auto modals by teleporting the menu to body with fixed positioning, flip-up logic, and dynamic maxHeight capped to viewport
- Add ClipAdminMenuVisible setting (backend domain, contracts, endpoint, migration) with matching frontend types, defaults, form wiring, and toggle in the Clip-Workflow modal — hides the Clips nav item from the admin sidebar when disabled

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
AzuTear
2026-06-27 18:39:35 +02:00
parent 494eba5edd
commit 18b61bed52
119 changed files with 15638 additions and 367 deletions
@@ -19,12 +19,17 @@ const {
adminError,
search,
categoryFilter,
readinessFilter,
page,
categoryOptions,
categoryFilterOptions,
categoryLabelMap,
duplicateCandidateKeys,
candidateWorkflowNotices,
duplicateCandidateCount,
acceptedCandidateCount,
clipReadyCount,
actionNeededCount,
filteredCandidates,
pagedCandidates,
totalPages,
@@ -36,6 +41,9 @@ const {
canSave,
candidatePlatformOptions,
selectedPlatformValue,
acceptanceStatusOptions,
clipEmbedStatusOptions,
readinessFilterOptions,
candidateToDelete,
clearFilters,
openCreate,
@@ -76,6 +84,24 @@ watchAdminToast(adminMessage, adminError)
<UserPlus class="h-6 w-6 text-violet-500" />
</div>
</Card>
<Card class="p-5">
<div class="flex items-start justify-between gap-4">
<div>
<p class="text-xs font-semibold uppercase tracking-[0.18em] text-emerald-600">Angenommen</p>
<strong class="mt-3 block text-3xl text-emerald-800">{{ acceptedCandidateCount }}</strong>
</div>
<UserPlus class="h-6 w-6 text-emerald-500" />
</div>
</Card>
<Card class="p-5">
<div class="flex items-start justify-between gap-4">
<div>
<p class="text-xs font-semibold uppercase tracking-[0.18em] text-sky-600">Clip bereit</p>
<strong class="mt-3 block text-3xl text-sky-800">{{ clipReadyCount }}</strong>
</div>
<Layers3 class="h-6 w-6 text-sky-500" />
</div>
</Card>
<Card class="p-5" :class="duplicateCandidateCount > 0 ? 'border-amber-200 bg-amber-50/60' : ''">
<div class="flex items-start justify-between gap-4">
<div>
@@ -85,15 +111,27 @@ watchAdminToast(adminMessage, adminError)
<Layers3 class="h-6 w-6" :class="duplicateCandidateCount > 0 ? 'text-amber-500' : 'text-violet-500'" />
</div>
</Card>
<Card class="p-5" :class="actionNeededCount > 0 ? 'border-rose-200 bg-rose-50/60' : ''">
<div class="flex items-start justify-between gap-4">
<div>
<p class="text-xs font-semibold uppercase tracking-[0.18em]" :class="actionNeededCount > 0 ? 'text-rose-600' : 'text-violet-500'">Handlungsbedarf</p>
<strong class="mt-3 block text-3xl" :class="actionNeededCount > 0 ? 'text-rose-700' : 'text-violet-900'">{{ actionNeededCount }}</strong>
</div>
<UserPlus class="h-6 w-6" :class="actionNeededCount > 0 ? 'text-rose-500' : 'text-violet-500'" />
</div>
</Card>
</section>
<Card class="overflow-hidden">
<AdminCandidatesFiltersBar
:search="search"
:category-filter="categoryFilter"
:readiness-filter="readinessFilter"
:category-filter-options="categoryFilterOptions"
:readiness-filter-options="readinessFilterOptions"
@update:search="search = $event"
@update:category-filter="categoryFilter = $event"
@update:readiness-filter="readinessFilter = $event"
@clear-filters="clearFilters"
@open-create="openCreate"
/>
@@ -108,6 +146,8 @@ watchAdminToast(adminMessage, adminError)
:range-end="rangeEnd"
:category-label-map="categoryLabelMap"
:duplicate-candidate-keys="duplicateCandidateKeys"
:candidate-workflow-notices="candidateWorkflowNotices"
:acceptance-status-options="acceptanceStatusOptions"
@edit="openEdit"
@delete="candidateToDelete = $event"
@update:page="page = $event"
@@ -122,6 +162,8 @@ watchAdminToast(adminMessage, adminError)
:category-options="categoryOptions"
:candidate-platform-options="candidatePlatformOptions"
:selected-platform-value="selectedPlatformValue"
:acceptance-status-options="acceptanceStatusOptions"
:clip-embed-status-options="clipEmbedStatusOptions"
:can-save="canSave"
:saving="saving"
@close="modalOpen = false"
@@ -130,6 +172,12 @@ watchAdminToast(adminMessage, adminError)
@update:display-name="form.displayName = $event"
@update:channel-slug="form.channelSlug = $event"
@update:platform="form.platform = $event"
@update:acceptance-status="form.acceptanceStatus = $event"
@update:acceptance-note="form.acceptanceNote = $event"
@update:clip-compilation-url="form.clipCompilationUrl = $event"
@update:clip-compilation-title="form.clipCompilationTitle = $event"
@update:clip-compilation-platform="form.clipCompilationPlatform = $event"
@update:clip-embed-status="form.clipEmbedStatus = $event"
@platform-selection="handlePlatformSelection"
/>