diff --git a/frontend/src/components/badge.tsx b/frontend/src/components/badge.tsx index d756ec1..4ca285c 100644 --- a/frontend/src/components/badge.tsx +++ b/frontend/src/components/badge.tsx @@ -2,4 +2,8 @@ import {ReactNode} from "react"; export default function Badge({children, className, onClick }: { children: ReactNode, className?: string, onClick?: () => void }) { return {children} +} + +export function BadgeAccent({children, className, onClick }: { children: ReactNode, className?: string, onClick?: () => void }) { + return {children} } \ No newline at end of file diff --git a/frontend/src/network/models.ts b/frontend/src/network/models.ts index 85b6451..a26c057 100644 --- a/frontend/src/network/models.ts +++ b/frontend/src/network/models.ts @@ -82,6 +82,9 @@ export interface RFile { id: string; filename: string; description: string; + size: number; + is_redirect: boolean; + user_id: number; } export interface UploadingFile { diff --git a/frontend/src/pages/resource_details_page.tsx b/frontend/src/pages/resource_details_page.tsx index 95b7c5c..b9b27dd 100644 --- a/frontend/src/pages/resource_details_page.tsx +++ b/frontend/src/pages/resource_details_page.tsx @@ -22,7 +22,7 @@ import Pagination from "../components/pagination.tsx"; import showPopup, {useClosePopup} from "../components/popup.tsx"; import {Turnstile} from "@marsidev/react-turnstile"; import Button from "../components/button.tsx"; -import Badge from "../components/badge.tsx"; +import Badge, {BadgeAccent} from "../components/badge.tsx"; export default function ResourcePage() { const params = useParams() @@ -226,16 +226,33 @@ function Article({article}: { article: string }) { } +function fileSizeToString(size: number) { + if (size < 1024) { + return size + "B" + } else if (size < 1024 * 1024) { + return (size / 1024).toFixed(2) + "KB" + } else if (size < 1024 * 1024 * 1024) { + return (size / 1024 / 1024).toFixed(2) + "MB" + } else { + return (size / 1024 / 1024 / 1024).toFixed(2) + "GB" + } +} + function FileTile({file}: { file: RFile }) { const buttonRef = createRef() + const {t} = useTranslation() + return

{file.filename}

{file.description}

+

+ {file.is_redirect ? t("Redirect") : fileSizeToString(file.size)} +

-
+
- +
@@ -591,7 +608,7 @@ function CommentTile({comment}: { comment: Comment }) {
} -function DeleteFileDialog({fileId}: { fileId: string }) { +function DeleteFileDialog({fileId, uploaderId}: { fileId: string, uploaderId: number }) { const [isLoading, setLoading] = useState(false) const id = `delete_file_dialog_${fileId}` @@ -617,7 +634,7 @@ function DeleteFileDialog({fileId}: { fileId: string }) { setLoading(false) } - if (!app.isAdmin()) { + if (!app.isAdmin() && app.user?.id !== uploaderId) { return <> } diff --git a/server/model/file.go b/server/model/file.go index 94691ce..f8d2def 100644 --- a/server/model/file.go +++ b/server/model/file.go @@ -24,6 +24,9 @@ type FileView struct { ID string `json:"id"` Filename string `json:"filename"` Description string `json:"description"` + Size int64 `json:"size"` + IsRedirect bool `json:"is_redirect"` + UserID uint `json:"user_id"` } func (f *File) ToView() *FileView { @@ -31,5 +34,8 @@ func (f *File) ToView() *FileView { ID: f.UUID, Filename: f.Filename, Description: f.Description, + Size: f.Size, + IsRedirect: f.RedirectUrl != "", + UserID: f.UserID, } }