Enhance UploadToShowDialog: add 'apply to all' functionality for batch show assignment, improve UI layout for better user experience, and update translations for new options.
This commit is contained in:
@@ -46,6 +46,10 @@ export function UploadToShowDialog({ files, onClose }: { files: File[]; onClose:
|
|||||||
const assignment = (name: string): string =>
|
const assignment = (name: string): string =>
|
||||||
name in overrides ? overrides[name] : (matchedByName.get(name) ?? '')
|
name in overrides ? overrides[name] : (matchedByName.get(name) ?? '')
|
||||||
|
|
||||||
|
/** Проставить одно шоу (или «в библиотеку») всем файлам разом. */
|
||||||
|
const applyToAll = (showId: string) =>
|
||||||
|
setOverrides(Object.fromEntries(files.map((f) => [f.name, showId])))
|
||||||
|
|
||||||
// Предпросмотр: что распарсим для каждого файла при текущих настройках, в порядке добавления.
|
// Предпросмотр: что распарсим для каждого файла при текущих настройках, в порядке добавления.
|
||||||
const previews = useMemo(() => {
|
const previews = useMemo(() => {
|
||||||
const opts = {
|
const opts = {
|
||||||
@@ -104,11 +108,26 @@ export function UploadToShowDialog({ files, onClose }: { files: File[]; onClose:
|
|||||||
)}
|
)}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div className="flex items-center justify-between text-sm">
|
<div className="flex flex-wrap items-center justify-between gap-2 text-sm">
|
||||||
<span className="font-medium">{t('admin.media.toShowPreview')}</span>
|
<span className="font-medium">{t('admin.media.toShowPreview')}</span>
|
||||||
|
<div className="flex items-center gap-2">
|
||||||
<span className="text-muted-foreground">
|
<span className="text-muted-foreground">
|
||||||
{t('admin.media.toShowMatched', { matched: matchedCount, total: files.length })}
|
{t('admin.media.toShowMatched', { matched: matchedCount, total: files.length })}
|
||||||
</span>
|
</span>
|
||||||
|
<Select value="" onValueChange={(v) => applyToAll(v === LIBRARY_VALUE ? '' : v)}>
|
||||||
|
<SelectTrigger className="h-8 w-52">
|
||||||
|
<SelectValue placeholder={t('admin.media.applyToAll')} />
|
||||||
|
</SelectTrigger>
|
||||||
|
<SelectContent>
|
||||||
|
<SelectItem value={LIBRARY_VALUE}>{t('admin.media.toShowLibrary')}</SelectItem>
|
||||||
|
{shows?.map((s) => (
|
||||||
|
<SelectItem key={s.id} value={s.id}>
|
||||||
|
{s.name}
|
||||||
|
</SelectItem>
|
||||||
|
))}
|
||||||
|
</SelectContent>
|
||||||
|
</Select>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<ul className="crt-panel max-h-72 divide-y divide-border overflow-y-auto rounded-md text-sm">
|
<ul className="crt-panel max-h-72 divide-y divide-border overflow-y-auto rounded-md text-sm">
|
||||||
{previews.map((p) => {
|
{previews.map((p) => {
|
||||||
|
|||||||
@@ -134,6 +134,7 @@ const resources = {
|
|||||||
toShowPreview: 'Что распознаем',
|
toShowPreview: 'Что распознаем',
|
||||||
toShowRecognized: 'распознано {{recognized}} из {{total}}',
|
toShowRecognized: 'распознано {{recognized}} из {{total}}',
|
||||||
toShowMatched: 'шоу распознано у {{matched}} из {{total}}',
|
toShowMatched: 'шоу распознано у {{matched}} из {{total}}',
|
||||||
|
applyToAll: 'Задать всем…',
|
||||||
toShowUnknown: '—',
|
toShowUnknown: '—',
|
||||||
toShowConfirm: 'Загрузить и добавить',
|
toShowConfirm: 'Загрузить и добавить',
|
||||||
uploaded: 'Файл загружен, идёт обработка',
|
uploaded: 'Файл загружен, идёт обработка',
|
||||||
@@ -474,6 +475,7 @@ const resources = {
|
|||||||
toShowPreview: 'What we detect',
|
toShowPreview: 'What we detect',
|
||||||
toShowRecognized: '{{recognized}} of {{total}} recognized',
|
toShowRecognized: '{{recognized}} of {{total}} recognized',
|
||||||
toShowMatched: 'show detected for {{matched}} of {{total}}',
|
toShowMatched: 'show detected for {{matched}} of {{total}}',
|
||||||
|
applyToAll: 'Set for all…',
|
||||||
toShowUnknown: '—',
|
toShowUnknown: '—',
|
||||||
toShowConfirm: 'Upload and add',
|
toShowConfirm: 'Upload and add',
|
||||||
uploaded: 'File uploaded, processing started',
|
uploaded: 'File uploaded, processing started',
|
||||||
|
|||||||
Reference in New Issue
Block a user