diff --git a/apps/mana/apps/web/src/lib/modules/articles/components/AddUrlForm.svelte b/apps/mana/apps/web/src/lib/modules/articles/components/AddUrlForm.svelte index 959454e0f..d46cce29b 100644 --- a/apps/mana/apps/web/src/lib/modules/articles/components/AddUrlForm.svelte +++ b/apps/mana/apps/web/src/lib/modules/articles/components/AddUrlForm.svelte @@ -257,6 +257,10 @@ + + {#if (loading || saving) && !error && !preview && !duplicate}
@@ -354,7 +358,19 @@ .input-row { display: flex; gap: 0.55rem; - margin-bottom: 0.9rem; + margin-bottom: 0.45rem; + } + .bulk-link { + margin: 0 0 0.9rem 0; + font-size: 0.85rem; + color: var(--color-text-muted, #64748b); + } + .bulk-link a { + color: #ea580c; + text-decoration: none; + } + .bulk-link a:hover { + text-decoration: underline; } .url-input { flex: 1; diff --git a/apps/mana/apps/web/src/lib/modules/articles/components/BulkImportForm.svelte b/apps/mana/apps/web/src/lib/modules/articles/components/BulkImportForm.svelte new file mode 100644 index 000000000..ea7c72065 --- /dev/null +++ b/apps/mana/apps/web/src/lib/modules/articles/components/BulkImportForm.svelte @@ -0,0 +1,206 @@ + + + +
+
+

Mehrere Artikel importieren

+

+ Eine URL pro Zeile (oder durch Leerzeichen / Komma getrennt). Mana extrahiert sie nacheinander + im Hintergrund. +

+
+ + + +
+ {parsed.valid.length} gültig + {#if parsed.duplicates.length > 0} + {parsed.duplicates.length} doppelt (übersprungen) + {/if} + {#if parsed.invalid.length > 0} + {parsed.invalid.length} ungültig + {/if} +
+ + {#if parsed.invalid.length > 0} +
+ Ungültige Zeilen anzeigen ({parsed.invalid.length}) +
    + {#each parsed.invalid as bad (bad)} +
  • {bad}
  • + {/each} +
+
+ {/if} + + {#if error} + + {/if} + +
+ +
+ +

+ Im Hintergrund — du kannst den Tab schließen und später zurückkommen. Bei 50 URLs dauert es grob + 5–10 Minuten. Den Fortschritt siehst du auf der Detailseite. +

+
+ + diff --git a/apps/mana/apps/web/src/lib/modules/articles/components/JobDetailView.svelte b/apps/mana/apps/web/src/lib/modules/articles/components/JobDetailView.svelte new file mode 100644 index 000000000..2123e091d --- /dev/null +++ b/apps/mana/apps/web/src/lib/modules/articles/components/JobDetailView.svelte @@ -0,0 +1,376 @@ + + + +
+ {#if !job} +

Job nicht gefunden.

+ {:else} + {@const j = job} +
+
+

Import-Job

+ {j.status} +
+
+
+
+
+ + {totalDone} / {j.totalUrls} verarbeitet + + {#if j.savedCount > 0}{j.savedCount} gespeichert{/if} + {#if j.duplicateCount > 0} + {j.duplicateCount} Duplikate + {/if} + {#if j.warningCount > 0} + {j.warningCount} mit Cookie-Wand + {/if} + {#if j.errorCount > 0}{j.errorCount} Fehler{/if} +
+ +
+ {#if j.status === 'running' || j.status === 'queued'} + + {/if} + {#if j.status === 'paused'} + + {/if} + {#if j.status === 'running' || j.status === 'queued' || j.status === 'paused'} + + {/if} + {#if j.errorCount > 0} + + {/if} + {#if j.status === 'done' || j.status === 'cancelled'} + + {/if} +
+
+ + + {/if} +
+ + diff --git a/apps/mana/apps/web/src/lib/modules/articles/components/JobsList.svelte b/apps/mana/apps/web/src/lib/modules/articles/components/JobsList.svelte new file mode 100644 index 000000000..8d456bcc6 --- /dev/null +++ b/apps/mana/apps/web/src/lib/modules/articles/components/JobsList.svelte @@ -0,0 +1,143 @@ + + + +{#if jobs.length > 0} +
+

Bisherige Imports

+ +
+{/if} + + diff --git a/apps/mana/apps/web/src/routes/(app)/articles/import/+page.svelte b/apps/mana/apps/web/src/routes/(app)/articles/import/+page.svelte new file mode 100644 index 000000000..1130390b5 --- /dev/null +++ b/apps/mana/apps/web/src/routes/(app)/articles/import/+page.svelte @@ -0,0 +1,14 @@ + + + + Artikel-Import — Mana + + + + + + diff --git a/apps/mana/apps/web/src/routes/(app)/articles/import/[jobId]/+page.svelte b/apps/mana/apps/web/src/routes/(app)/articles/import/[jobId]/+page.svelte new file mode 100644 index 000000000..9dbbad9cf --- /dev/null +++ b/apps/mana/apps/web/src/routes/(app)/articles/import/[jobId]/+page.svelte @@ -0,0 +1,17 @@ + + + + Artikel-Import — Mana + + + + {#if jobId} + + {/if} +