From 2dd8bf97247cbdce14366bc1e083491257d8c3d6 Mon Sep 17 00:00:00 2001 From: Leonid Pershin Date: Sat, 25 Jul 2026 08:16:05 +0300 Subject: [PATCH] Add upload to show functionality in MediaPanel: introduce file selection for uploading media files directly to a show, enhancing the upload store to support show associations. Update translations for new upload options and UI elements. --- .../src/features/admin/media/MediaPanel.tsx | 25 ++- .../admin/media/UploadToShowDialog.tsx | 145 ++++++++++++++++++ .../src/features/admin/media/episode-parse.ts | 88 +++++++++++ .../src/features/admin/media/upload-store.ts | 29 +++- frontend/src/shared/lib/i18n.ts | 30 ++++ 5 files changed, 311 insertions(+), 6 deletions(-) create mode 100644 frontend/src/features/admin/media/UploadToShowDialog.tsx create mode 100644 frontend/src/features/admin/media/episode-parse.ts diff --git a/frontend/src/features/admin/media/MediaPanel.tsx b/frontend/src/features/admin/media/MediaPanel.tsx index 073a97a..3e7c90d 100644 --- a/frontend/src/features/admin/media/MediaPanel.tsx +++ b/frontend/src/features/admin/media/MediaPanel.tsx @@ -1,7 +1,7 @@ import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import { useRef, useState } from 'react' import { useTranslation } from 'react-i18next' -import { Upload } from 'lucide-react' +import { ListPlus, Upload } from 'lucide-react' import { HttpError } from '@/shared/api/client' import type { MediaAssetDto, MediaAssetStatus } from '@/shared/api/types' import { Badge, type BadgeProps } from '@/shared/ui/badge' @@ -9,6 +9,7 @@ import { Button } from '@/shared/ui/button' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/shared/ui/select' import { toast } from '@/shared/ui/toast-store' import { deleteMedia, listMedia } from './api' +import { UploadToShowDialog } from './UploadToShowDialog' import { useUploadStore } from './upload-store' const PAGE_SIZE = 20 @@ -43,7 +44,9 @@ export function MediaPanel() { const { t } = useTranslation() const queryClient = useQueryClient() const fileInput = useRef(null) + const fileInputShow = useRef(null) const [filter, setFilter] = useState('active') + const [filesForShow, setFilesForShow] = useState(null) const enqueue = useUploadStore((s) => s.enqueue) const { data, isLoading } = useQuery({ @@ -92,6 +95,22 @@ export function MediaPanel() { e.target.value = '' }} /> + { + const files = e.target.files + if (files && files.length > 0) setFilesForShow(Array.from(files)) + e.target.value = '' + }} + /> +