Update default sort to Date Added (Descending) and display Added column
Some checks failed
Build MIPS Binary / build (push) Failing after 1m18s
Some checks failed
Build MIPS Binary / build (push) Failing after 1m18s
This commit is contained in:
@@ -24,25 +24,20 @@ 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 {
|
fn format_date(timestamp: i64) -> String {
|
||||||
if seconds <= 0 {
|
if timestamp <= 0 {
|
||||||
return "∞".to_string();
|
return "-".to_string();
|
||||||
}
|
}
|
||||||
|
let date = js_sys::Date::new(&wasm_bindgen::JsValue::from_f64((timestamp * 1000) as f64));
|
||||||
|
|
||||||
let days = seconds / 86400;
|
// Simple formatting: YYYY-MM-DD HH:mm
|
||||||
let hours = (seconds % 86400) / 3600;
|
let year = date.get_full_year();
|
||||||
let minutes = (seconds % 3600) / 60;
|
let month = date.get_month() + 1; // 0-based
|
||||||
let secs = seconds % 60;
|
let day = date.get_date();
|
||||||
|
let hours = date.get_hours();
|
||||||
|
let minutes = date.get_minutes();
|
||||||
|
|
||||||
if days > 0 {
|
format!("{:04}-{:02}-{:02} {:02}:{:02}", year, month, day, hours, minutes)
|
||||||
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)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||||
@@ -54,6 +49,7 @@ enum SortColumn {
|
|||||||
DownSpeed,
|
DownSpeed,
|
||||||
UpSpeed,
|
UpSpeed,
|
||||||
ETA,
|
ETA,
|
||||||
|
Added,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||||
@@ -66,8 +62,8 @@ enum SortDirection {
|
|||||||
pub fn TorrentTable() -> impl IntoView {
|
pub fn TorrentTable() -> impl IntoView {
|
||||||
let store = use_context::<crate::store::TorrentStore>().expect("store not provided");
|
let store = use_context::<crate::store::TorrentStore>().expect("store not provided");
|
||||||
|
|
||||||
let sort_col = create_rw_signal(SortColumn::Name);
|
let sort_col = create_rw_signal(SortColumn::Added);
|
||||||
let sort_dir = create_rw_signal(SortDirection::Ascending);
|
let sort_dir = create_rw_signal(SortDirection::Descending);
|
||||||
|
|
||||||
let filtered_torrents = move || {
|
let filtered_torrents = move || {
|
||||||
let mut torrents = store
|
let mut torrents = store
|
||||||
@@ -127,6 +123,7 @@ pub fn TorrentTable() -> impl IntoView {
|
|||||||
let b_eta = if b.eta <= 0 { i64::MAX } else { b.eta };
|
let b_eta = if b.eta <= 0 { i64::MAX } else { b.eta };
|
||||||
a_eta.cmp(&b_eta)
|
a_eta.cmp(&b_eta)
|
||||||
}
|
}
|
||||||
|
SortColumn::Added => a.added_date.cmp(&b.added_date),
|
||||||
};
|
};
|
||||||
if dir == SortDirection::Descending {
|
if dir == SortDirection::Descending {
|
||||||
cmp.reverse()
|
cmp.reverse()
|
||||||
@@ -264,6 +261,9 @@ pub fn TorrentTable() -> impl IntoView {
|
|||||||
<th class="w-24 cursor-pointer hover:bg-base-300 group select-none" on:click=move |_| handle_sort(SortColumn::ETA)>
|
<th class="w-24 cursor-pointer hover:bg-base-300 group select-none" on:click=move |_| handle_sort(SortColumn::ETA)>
|
||||||
<div class="flex items-center">"ETA" {move || sort_arrow(SortColumn::ETA)}</div>
|
<div class="flex items-center">"ETA" {move || sort_arrow(SortColumn::ETA)}</div>
|
||||||
</th>
|
</th>
|
||||||
|
<th class="w-32 cursor-pointer hover:bg-base-300 group select-none" on:click=move |_| handle_sort(SortColumn::Added)>
|
||||||
|
<div class="flex items-center">"Added" {move || sort_arrow(SortColumn::Added)}</div>
|
||||||
|
</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
@@ -317,6 +317,7 @@ pub fn TorrentTable() -> impl IntoView {
|
|||||||
<td class="text-right font-mono text-[11px] opacity-80 text-success">{format_speed(t.down_rate)}</td>
|
<td class="text-right font-mono text-[11px] opacity-80 text-success">{format_speed(t.down_rate)}</td>
|
||||||
<td class="text-right font-mono text-[11px] opacity-80 text-primary">{format_speed(t.up_rate)}</td>
|
<td class="text-right font-mono text-[11px] opacity-80 text-primary">{format_speed(t.up_rate)}</td>
|
||||||
<td class="text-right font-mono text-[11px] opacity-80">{format_duration(t.eta)}</td>
|
<td class="text-right font-mono text-[11px] opacity-80">{format_duration(t.eta)}</td>
|
||||||
|
<td class="text-right font-mono text-[11px] opacity-60 whitespace-nowrap">{format_date(t.added_date)}</td>
|
||||||
</tr>
|
</tr>
|
||||||
}
|
}
|
||||||
}).collect::<Vec<_>>()}
|
}).collect::<Vec<_>>()}
|
||||||
@@ -359,6 +360,7 @@ pub fn TorrentTable() -> impl IntoView {
|
|||||||
<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::Name, "Name"),
|
(SortColumn::Name, "Name"),
|
||||||
(SortColumn::Size, "Size"),
|
(SortColumn::Size, "Size"),
|
||||||
(SortColumn::Progress, "Progress"),
|
(SortColumn::Progress, "Progress"),
|
||||||
@@ -398,9 +400,7 @@ pub fn TorrentTable() -> impl IntoView {
|
|||||||
}
|
}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div> {move || filtered_torrents().into_iter().map(|t| {
|
||||||
|
|
||||||
<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