Some checks failed
CI / Unit & Component Tests (pull_request) Failing after 2m50s
CI / OCR Service Tests (pull_request) Successful in 27s
CI / Backend Unit Tests (pull_request) Failing after 2m54s
CI / Unit & Component Tests (push) Failing after 2m49s
CI / OCR Service Tests (push) Successful in 30s
CI / Backend Unit Tests (push) Failing after 2m55s
Felix B1 (data-loss regression on /documents/[id]/edit) — DocumentEditLayout
still passes initialDateIso, initialLocation, initialDocumentLocation, but
my cycle-1 cleanup removed those props. Result: existing values rendered
empty and a save would have overwritten them with "". Restored the props
on WhoWhenSection and DescriptionSection; initialisation now lives in
onMount so it runs exactly once and never stomps a parent-driven update on
a later prop change.
Felix B2 — `DescriptionSection.svelte:36` still had the top-level
`currentTitle = untrack(() => initialTitle)` mutation that I cleaned up in
WhoWhenSection but missed here. Same onMount-once treatment.
Leonie B5 — `enrich/+page.svelte:105` referenced `<BulkSelectionBar>` but
the import was lost in a prettier pass; svelte-check errored out and the
bar never rendered, leaving an 8 rem dead zone from the pb-32 reservation.
One-line fix: add the import.
Leonie B6 — Esc handler in `BulkSelectionBar` was unscoped and stole
Escape from NotificationBell, ConfirmDialog, HelpPopover, etc. (e.g.
selecting docs → opening notification bell → Esc would close the bell
AND silently wipe the selection). Now bails when an open dialog,
expanded menu, or popover is detected.
Elicit C1 — `BulkDocumentEditLayout` topbar now branches on `mode`:
shows "Massenbearbeitung" + "{count} werden bearbeitet" in edit mode
instead of the upload-flavoured "Mehrere Dokumente hochladen" + "werden
erstellt" copy. New i18n keys `bulk_edit_topbar_title` and
`bulk_edit_count_pill` in DE/EN/ES.
Tests added:
- DocumentControllerTest.patchBulk_stripsCarriageReturnsAndNewlinesFromErrorMessages
(Sara C2 follow-up — pin sanitizeForLog as a regression test)
- BulkSelectionBar.spec — count=1 → "1 Dokument", count=2 → "2 Dokumente"
(Sara C6 follow-up — pin the new bulk_edit_n_selected_one/_other branch)
Refs #225, PR #331
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
107 lines
3.4 KiB
Svelte
107 lines
3.4 KiB
Svelte
<script lang="ts">
|
|
import { m } from '$lib/paraglide/messages.js';
|
|
import BackButton from '$lib/components/BackButton.svelte';
|
|
import BulkSelectionBar from '$lib/components/document/BulkSelectionBar.svelte';
|
|
import { bulkSelectionStore } from '$lib/stores/bulkSelection.svelte';
|
|
|
|
let { data } = $props();
|
|
|
|
const documents = $derived(data.documents);
|
|
const count = $derived(documents.length);
|
|
const canWrite = $derived(data.canWrite);
|
|
</script>
|
|
|
|
<!-- Reserve bottom padding when the bulk-selection bar is visible so the
|
|
sticky bar does not occlude the last document row (WCAG 1.4.10). -->
|
|
<div class="mx-auto max-w-4xl px-4 py-10" class:pb-32={bulkSelectionStore.size > 0 && canWrite}>
|
|
<!-- Back Link -->
|
|
<BackButton />
|
|
|
|
<!-- Page Header -->
|
|
<div class="mb-8 flex items-center justify-between border-b border-line pb-6">
|
|
<div>
|
|
<h1 class="font-serif text-3xl font-medium text-ink">
|
|
{m.enrich_list_heading()}
|
|
</h1>
|
|
{#if count > 0}
|
|
<p class="mt-2 font-sans text-sm text-ink-2">
|
|
{count}
|
|
{m.enrich_list_count()}
|
|
</p>
|
|
{/if}
|
|
</div>
|
|
|
|
{#if count > 0}
|
|
<a
|
|
href="/enrich/{documents[0].id}"
|
|
class="bg-primary px-5 py-2 font-sans text-xs font-bold tracking-widest text-primary-fg uppercase transition-colors hover:bg-primary/90"
|
|
>
|
|
{m.enrich_list_start()}
|
|
</a>
|
|
{/if}
|
|
</div>
|
|
|
|
<!-- Empty State -->
|
|
{#if count === 0}
|
|
<div
|
|
class="flex flex-col items-center justify-center rounded-sm border border-dashed border-line bg-surface py-20 text-center"
|
|
>
|
|
<div class="mb-4 flex h-14 w-14 items-center justify-center rounded-full bg-muted">
|
|
<img
|
|
src="/degruyter-icons/Simple/Medium-24px/SVG/Action/Check/Check-Circle-MD.svg"
|
|
alt=""
|
|
aria-hidden="true"
|
|
class="h-7 w-7 opacity-50"
|
|
/>
|
|
</div>
|
|
<p class="font-serif text-lg font-medium text-ink">
|
|
{m.enrich_list_empty_heading()}
|
|
</p>
|
|
<p class="mt-2 max-w-xs font-sans text-sm text-ink-2">
|
|
{m.enrich_list_empty_body()}
|
|
</p>
|
|
</div>
|
|
{:else}
|
|
<!-- Document Rows -->
|
|
<div class="border border-line bg-surface shadow-sm">
|
|
<ul class="divide-y divide-line-2">
|
|
{#each documents as doc (doc.id)}
|
|
<li class="group relative transition-colors duration-200 hover:bg-muted">
|
|
<a href="/enrich/{doc.id}" class="absolute inset-0 z-0 block" aria-label={doc.title}
|
|
></a>
|
|
<div class="pointer-events-none relative z-10 flex items-center justify-between p-6">
|
|
{#if canWrite}
|
|
<label
|
|
class="pointer-events-auto mr-4 flex min-h-[44px] min-w-[44px] flex-shrink-0 cursor-pointer items-center"
|
|
data-testid="bulk-select-checkbox"
|
|
>
|
|
<input
|
|
type="checkbox"
|
|
class="h-5 w-5 cursor-pointer accent-brand-navy"
|
|
checked={bulkSelectionStore.has(doc.id)}
|
|
onchange={() => bulkSelectionStore.toggle(doc.id)}
|
|
aria-label={m.bulk_edit_select_document({ title: doc.title })}
|
|
/>
|
|
</label>
|
|
{/if}
|
|
<div class="min-w-0 flex-1">
|
|
<p class="font-serif text-lg font-medium text-ink group-hover:underline">
|
|
{doc.title}
|
|
</p>
|
|
</div>
|
|
<img
|
|
src="/degruyter-icons/Simple/Medium-24px/SVG/Action/Arrow/Arrow-Right-MD.svg"
|
|
alt=""
|
|
aria-hidden="true"
|
|
class="ml-4 h-5 w-5 shrink-0 opacity-30 transition-opacity group-hover:opacity-70"
|
|
/>
|
|
</div>
|
|
</li>
|
|
{/each}
|
|
</ul>
|
|
</div>
|
|
{/if}
|
|
</div>
|
|
|
|
<BulkSelectionBar canWrite={canWrite} />
|