treewide: complete book management interface
Signed-off-by: NotAShelf <raf@notashelf.dev> Change-Id: If5a21f16221f3c56a8008e139f93edc46a6a6964
This commit is contained in:
parent
bda36ac152
commit
2f31242442
23 changed files with 1693 additions and 126 deletions
|
|
@ -122,10 +122,10 @@ pub fn App() -> Element {
|
|||
// Check system preference using JavaScript
|
||||
let result =
|
||||
document::eval(r#"window.matchMedia('(prefers-color-scheme: dark)').matches"#);
|
||||
if let Ok(val) = result.await {
|
||||
if let Some(prefers_dark) = val.as_bool() {
|
||||
system_prefers_dark.set(prefers_dark);
|
||||
}
|
||||
if let Ok(val) = result.await
|
||||
&& let Some(prefers_dark) = val.as_bool()
|
||||
{
|
||||
system_prefers_dark.set(prefers_dark);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
@ -581,7 +581,7 @@ pub fn App() -> Element {
|
|||
{
|
||||
let (completed, total) = *import_progress.read();
|
||||
let has_progress = total > 0;
|
||||
let pct = if total > 0 { (completed * 100) / total } else { 0 };
|
||||
let pct = (completed * 100).checked_div(total).unwrap_or(0);
|
||||
let current = import_current_file.read().clone();
|
||||
let queue_len = import_queue.read().len();
|
||||
rsx! {
|
||||
|
|
@ -1408,38 +1408,57 @@ pub fn App() -> Element {
|
|||
|
||||
// Check if already importing - if so, add to queue
|
||||
|
||||
// Extract directory name from path
|
||||
|
||||
// Check if already importing - if so, add to queue
|
||||
|
||||
|
||||
// Get preview files if available for per-file progress
|
||||
|
||||
// Use parallel import with per-batch progress
|
||||
|
||||
// Show first file in batch as current
|
||||
|
||||
// Process batch in parallel
|
||||
|
||||
// Update progress after batch
|
||||
|
||||
// Fallback: use server-side directory import (no per-file progress)
|
||||
// Check if already importing - if so, add to queue
|
||||
|
||||
// Update progress from scan status
|
||||
|
||||
// Check if already importing - if so, add to queue
|
||||
|
||||
// Process files in parallel batches for better performance
|
||||
|
||||
// Show first file in batch as current
|
||||
|
||||
// Process batch in parallel
|
||||
|
||||
// Update progress after batch
|
||||
|
||||
// Extended import state
|
||||
|
||||
|
||||
// Extract directory name from path
|
||||
|
||||
// Check if already importing - if so, add to queue
|
||||
if *import_in_progress.read() {
|
||||
|
||||
// Get preview files if available for per-file progress
|
||||
|
||||
// Use parallel import with per-batch progress
|
||||
|
||||
// Show first file in batch as current
|
||||
|
||||
// Process batch in parallel
|
||||
|
||||
// Update progress after batch
|
||||
|
||||
// Fallback: use server-side directory import (no per-file progress)
|
||||
// Check if already importing - if so, add to queue
|
||||
|
||||
// Update progress from scan status
|
||||
|
||||
// Check if already importing - if so, add to queue
|
||||
|
||||
// Process files in parallel batches for better performance
|
||||
|
||||
// Show first file in batch as current
|
||||
|
||||
// Process batch in parallel
|
||||
|
||||
// Update progress after batch
|
||||
|
||||
// Extended import state
|
||||
|
||||
|
||||
|
||||
import_queue.write().push(file_name);
|
||||
show_toast("Added to import queue".into(), false);
|
||||
return;
|
||||
|
|
@ -1547,8 +1566,6 @@ pub fn App() -> Element {
|
|||
if let Some(first_path) = chunk.first() {
|
||||
let file_name = first_path
|
||||
|
||||
|
||||
|
||||
.rsplit('/')
|
||||
.next()
|
||||
.unwrap_or(first_path);
|
||||
|
|
@ -1679,10 +1696,7 @@ pub fn App() -> Element {
|
|||
Ok(status) => {
|
||||
let done = !status.scanning;
|
||||
import_progress
|
||||
.set((
|
||||
status.files_processed as usize,
|
||||
status.files_found as usize,
|
||||
));
|
||||
.set((status.files_processed, status.files_found));
|
||||
if status.files_found > 0 {
|
||||
import_current_file
|
||||
.set(
|
||||
|
|
@ -1752,8 +1766,6 @@ pub fn App() -> Element {
|
|||
if let Some(first_path) = chunk.first() {
|
||||
let file_name = first_path
|
||||
|
||||
|
||||
|
||||
.rsplit('/')
|
||||
.next()
|
||||
.unwrap_or(first_path);
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ pub fn Import(
|
|||
{
|
||||
let (completed, total) = import_progress;
|
||||
let has_progress = total > 0;
|
||||
let pct = if total > 0 { (completed * 100) / total } else { 0 };
|
||||
let pct = (completed * 100).checked_div(total).unwrap_or(0);
|
||||
let queue_count = import_queue.len();
|
||||
rsx! {
|
||||
div { class: "import-status-panel",
|
||||
|
|
|
|||
|
|
@ -612,6 +612,9 @@ pub fn Library(
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
let card_click = {
|
||||
let id = item.id.clone();
|
||||
move |_| on_select.call(id.clone())
|
||||
|
|
|
|||
|
|
@ -79,6 +79,7 @@ pub fn Statistics(
|
|||
|
||||
|
||||
|
||||
|
||||
if !s.media_by_type.is_empty() {
|
||||
div { class: "card mt-16",
|
||||
h4 { class: "card-title", "Media by Type" }
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue