directory entries show created at date

This commit is contained in:
2025-07-16 04:14:26 +02:00
parent ee6a1bc25c
commit a683f44ecb
5 changed files with 41 additions and 11 deletions

View File

@@ -9,14 +9,21 @@ pub struct File {
name: FileName, name: FileName,
file_type: FileType, file_type: FileType,
mime_type: Option<FileMimeType>, mime_type: Option<FileMimeType>,
created_at: u64,
} }
impl File { impl File {
pub fn new(name: FileName, file_type: FileType, mime_type: Option<FileMimeType>) -> Self { pub fn new(
name: FileName,
file_type: FileType,
mime_type: Option<FileMimeType>,
created_at: u64,
) -> Self {
Self { Self {
name, name,
file_type, file_type,
mime_type, mime_type,
created_at,
} }
} }
@@ -31,6 +38,10 @@ impl File {
pub fn mime_type(&self) -> Option<&FileMimeType> { pub fn mime_type(&self) -> Option<&FileMimeType> {
self.mime_type.as_ref() self.mime_type.as_ref()
} }
pub fn created_at(&self) -> u64 {
self.created_at
}
} }
/// A valid file name /// A valid file name

View File

@@ -68,6 +68,7 @@ pub struct WarrenFileElement {
name: String, name: String,
file_type: FileType, file_type: FileType,
mime_type: Option<String>, mime_type: Option<String>,
created_at: u64,
} }
#[derive(Debug, Clone, PartialEq, Eq, Serialize)] #[derive(Debug, Clone, PartialEq, Eq, Serialize)]
@@ -82,6 +83,7 @@ impl From<File> for WarrenFileElement {
name: value.name().to_string(), name: value.name().to_string(),
file_type: value.file_type().to_owned(), file_type: value.file_type().to_owned(),
mime_type: value.mime_type().map(FileMimeType::to_string), mime_type: value.mime_type().map(FileMimeType::to_string),
created_at: value.created_at(),
} }
} }
} }

View File

@@ -1,3 +1,5 @@
use std::time::UNIX_EPOCH;
use anyhow::{Context, anyhow}; use anyhow::{Context, anyhow};
use tokio::{fs, io::AsyncWriteExt as _}; use tokio::{fs, io::AsyncWriteExt as _};
@@ -67,13 +69,20 @@ impl FileSystem {
continue; continue;
} }
}; };
let metadata = entry.metadata().await?;
let created_at = metadata.created()?.duration_since(UNIX_EPOCH)?.as_secs();
let mime_type = match file_type { let mime_type = match file_type {
FileType::File => FileMimeType::from_name(&name), FileType::File => FileMimeType::from_name(&name),
_ => None, _ => None,
}; };
files.push(File::new(FileName::new(&name)?, file_type, mime_type)); files.push(File::new(
FileName::new(&name)?,
file_type,
mime_type,
created_at,
));
} }
Ok(files) Ok(files)

View File

@@ -7,6 +7,7 @@ import {
} from '@/components/ui/context-menu'; } from '@/components/ui/context-menu';
import { deleteWarrenDirectory, deleteWarrenFile } from '~/lib/api/warrens'; import { deleteWarrenDirectory, deleteWarrenFile } from '~/lib/api/warrens';
import type { DirectoryEntry } from '~/types'; import type { DirectoryEntry } from '~/types';
import { buttonVariants } from '@/components/ui/button';
const route = useRoute(); const route = useRoute();
const warrenRoute = useWarrenRoute(); const warrenRoute = useWarrenRoute();
@@ -37,22 +38,27 @@ async function submitDelete(force: boolean = false) {
<NuxtLink <NuxtLink
:to="joinPaths(route.path, entry.name)" :to="joinPaths(route.path, entry.name)"
:class="[ :class="[
'select-none', 'flex flex-row gap-4 bg-accent/30 border-1 border-border px-4 py-2 rounded-md select-none w-52',
{ {
'pointer-events-none': 'pointer-events-none':
disabled || entry.fileType === 'file', disabled || entry.fileType === 'file',
}, },
]" ]"
> >
<Button <div class="flex flex-row items-center">
class="w-44 h-12" <Icon class="size-6" :name="getFileIcon(entry.mimeType)" />
variant="outline" </div>
size="lg"
:disabled="disabled" <div
class="flex flex-col gap-0 leading-6 overflow-hidden truncate"
> >
<Icon :name="getFileIcon(entry.mimeType)" /> <span>{{ entry.name }}</span>
<span class="truncate">{{ entry.name }}</span> <NuxtTime
</Button> :datetime="entry.createdAt * 1000"
class="text-muted-foreground text-sm"
relative
></NuxtTime>
</div>
</NuxtLink> </NuxtLink>
</ContextMenuTrigger> </ContextMenuTrigger>
<ContextMenuContent> <ContextMenuContent>

View File

@@ -9,6 +9,8 @@ export type DirectoryEntry = {
name: string; name: string;
fileType: FileType; fileType: FileType;
mimeType: string | null; mimeType: string | null;
/// Timestamp in seconds
createdAt: number;
}; };
export type UploadStatus = export type UploadStatus =