Fix syntax errors in torrent table component (missing function and closing tags)
All checks were successful
Build MIPS Binary / build (push) Successful in 4m23s
All checks were successful
Build MIPS Binary / build (push) Successful in 4m23s
This commit is contained in:
@@ -24,6 +24,27 @@ fn format_speed(bytes_per_sec: i64) -> String {
|
|||||||
format!("{}/s", format_bytes(bytes_per_sec))
|
format!("{}/s", format_bytes(bytes_per_sec))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn format_duration(seconds: i64) -> String {
|
||||||
|
if seconds <= 0 {
|
||||||
|
return "∞".to_string();
|
||||||
|
}
|
||||||
|
|
||||||
|
let days = seconds / 86400;
|
||||||
|
let hours = (seconds % 86400) / 3600;
|
||||||
|
let minutes = (seconds % 3600) / 60;
|
||||||
|
let secs = seconds % 60;
|
||||||
|
|
||||||
|
if days > 0 {
|
||||||
|
format!("{}d {}h", days, hours)
|
||||||
|
} else if hours > 0 {
|
||||||
|
format!("{}h {}m", hours, minutes)
|
||||||
|
} else if minutes > 0 {
|
||||||
|
format!("{}m {}s", minutes, secs)
|
||||||
|
} else {
|
||||||
|
format!("{}s", secs)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn format_date(timestamp: i64) -> String {
|
fn format_date(timestamp: i64) -> String {
|
||||||
if timestamp <= 0 {
|
if timestamp <= 0 {
|
||||||
return "-".to_string();
|
return "-".to_string();
|
||||||
@@ -325,82 +346,85 @@ pub fn TorrentTable() -> impl IntoView {
|
|||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="md:hidden flex flex-col h-full bg-base-200 relative">
|
<div class="md:hidden flex flex-col h-full bg-base-200 relative">
|
||||||
// Transparent overlay to close sort dropdown
|
// Transparent overlay to close sort dropdown
|
||||||
<Show when=move || sort_open.get()>
|
<Show when=move || sort_open.get()>
|
||||||
<div
|
<div
|
||||||
class="fixed inset-0 z-[98] cursor-default"
|
class="fixed inset-0 z-[98] cursor-default"
|
||||||
on:pointerdown=move |_| set_sort_open.set(false)
|
on:pointerdown=move |_| set_sort_open.set(false)
|
||||||
></div>
|
></div>
|
||||||
</Show>
|
</Show>
|
||||||
|
|
||||||
<div class="px-3 py-2 border-b border-base-200 flex justify-between items-center bg-base-100/95 backdrop-blur z-10 shrink-0">
|
<div class="px-3 py-2 border-b border-base-200 flex justify-between items-center bg-base-100/95 backdrop-blur z-10 shrink-0">
|
||||||
<span class="text-xs font-bold opacity-50 uppercase tracking-wider">"Torrents"</span>
|
<span class="text-xs font-bold opacity-50 uppercase tracking-wider">"Torrents"</span>
|
||||||
|
|
||||||
<div class="relative">
|
<div class="relative">
|
||||||
<div
|
<div
|
||||||
role="button"
|
role="button"
|
||||||
class="btn btn-ghost btn-xs gap-1 opacity-70 font-normal"
|
class="btn btn-ghost btn-xs gap-1 opacity-70 font-normal"
|
||||||
on:pointerdown=move |e| {
|
on:pointerdown=move |e| {
|
||||||
e.stop_propagation();
|
e.stop_propagation();
|
||||||
let cur = sort_open.get_untracked();
|
let cur = sort_open.get_untracked();
|
||||||
set_sort_open.set(!cur);
|
set_sort_open.set(!cur);
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-4 h-4">
|
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-4 h-4">
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" d="M3 7.5L7.5 3m0 0L12 7.5M7.5 3v13.5m13.5 0L16.5 21m0 0L12 16.5m4.5 4.5V7.5" />
|
<path stroke-linecap="round" stroke-linejoin="round" d="M3 7.5L7.5 3m0 0L12 7.5M7.5 3v13.5m13.5 0L16.5 21m0 0L12 16.5m4.5 4.5V7.5" />
|
||||||
</svg>
|
</svg>
|
||||||
"Sort"
|
"Sort"
|
||||||
</div>
|
</div>
|
||||||
<ul
|
<ul
|
||||||
class="absolute top-full right-0 z-[100] menu p-2 shadow bg-base-100 rounded-box w-48 mt-1 border border-base-200 text-xs"
|
class="absolute top-full right-0 z-[100] menu p-2 shadow bg-base-100 rounded-box w-48 mt-1 border border-base-200 text-xs"
|
||||||
style=move || if sort_open.get() { "display: block" } else { "display: none" }
|
style=move || if sort_open.get() { "display: block" } else { "display: none" }
|
||||||
on:pointerdown=move |e| e.stop_propagation()
|
on:pointerdown=move |e| e.stop_propagation()
|
||||||
>
|
>
|
||||||
<li class="menu-title px-2 py-1 opacity-50 text-[10px] uppercase font-bold">"Sort By"</li>
|
<li class="menu-title px-2 py-1 opacity-50 text-[10px] uppercase font-bold">"Sort By"</li>
|
||||||
{
|
{
|
||||||
let columns = vec![
|
let columns = vec![
|
||||||
(SortColumn::Added, "Date Added"),
|
(SortColumn::Added, "Date Added"),
|
||||||
(SortColumn::Name, "Name"),
|
(SortColumn::Name, "Name"),
|
||||||
(SortColumn::Size, "Size"),
|
(SortColumn::Size, "Size"),
|
||||||
(SortColumn::Progress, "Progress"),
|
(SortColumn::Progress, "Progress"),
|
||||||
(SortColumn::Status, "Status"),
|
(SortColumn::Status, "Status"),
|
||||||
(SortColumn::DownSpeed, "Down Speed"),
|
(SortColumn::DownSpeed, "Down Speed"),
|
||||||
(SortColumn::UpSpeed, "Up Speed"),
|
(SortColumn::UpSpeed, "Up Speed"),
|
||||||
(SortColumn::ETA, "ETA"),
|
(SortColumn::ETA, "ETA"),
|
||||||
];
|
];
|
||||||
|
|
||||||
columns.into_iter().map(|(col, label)| {
|
columns.into_iter().map(|(col, label)| {
|
||||||
let is_active = move || sort_col.get() == col;
|
let is_active = move || sort_col.get() == col;
|
||||||
let current_dir = move || sort_dir.get();
|
let current_dir = move || sort_dir.get();
|
||||||
|
|
||||||
view! {
|
view! {
|
||||||
<li>
|
<li>
|
||||||
<button
|
<button
|
||||||
class=move || if is_active() { "bg-primary/10 text-primary font-bold flex justify-between" } else { "flex justify-between" }
|
class=move || if is_active() { "bg-primary/10 text-primary font-bold flex justify-between" } else { "flex justify-between" }
|
||||||
on:pointerdown=move |e| {
|
on:pointerdown=move |e| {
|
||||||
e.stop_propagation();
|
e.stop_propagation();
|
||||||
handle_sort(col);
|
handle_sort(col);
|
||||||
set_sort_open.set(false);
|
set_sort_open.set(false);
|
||||||
}
|
|
||||||
>
|
|
||||||
{label}
|
|
||||||
<Show when=is_active fallback=|| ()>
|
|
||||||
<span class="opacity-70 text-[10px]">
|
|
||||||
{move || match current_dir() {
|
|
||||||
SortDirection::Ascending => "▲",
|
|
||||||
SortDirection::Descending => "▼",
|
|
||||||
}}
|
|
||||||
</span>
|
|
||||||
</Show>
|
|
||||||
</button>
|
|
||||||
</li>
|
|
||||||
}
|
}
|
||||||
}).collect::<Vec<_>>()
|
>
|
||||||
}
|
{label}
|
||||||
</ul>
|
<Show when=is_active fallback=|| ()>
|
||||||
</div>
|
<span class="opacity-70 text-[10px]">
|
||||||
</div> {move || filtered_torrents().into_iter().map(|t| {
|
{move || match current_dir() {
|
||||||
|
SortDirection::Ascending => "▲",
|
||||||
|
SortDirection::Descending => "▼",
|
||||||
|
}}
|
||||||
|
</span>
|
||||||
|
</Show>
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
}
|
||||||
|
}).collect::<Vec<_>>()
|
||||||
|
}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="overflow-y-auto p-3 pb-20 flex-1 grid grid-cols-1 content-start gap-3">
|
||||||
|
{move || filtered_torrents().into_iter().map(|t| {
|
||||||
let progress_class = if t.percent_complete >= 100.0 { "progress-success" } else { "progress-primary" };
|
let progress_class = if t.percent_complete >= 100.0 { "progress-success" } else { "progress-primary" };
|
||||||
let status_str = format!("{:?}", t.status);
|
let status_str = format!("{:?}", t.status);
|
||||||
let status_badge_class = match t.status {
|
let status_badge_class = match t.status {
|
||||||
|
|||||||
Reference in New Issue
Block a user