pinakes-ui: streamline sidebar design
Signed-off-by: NotAShelf <raf@notashelf.dev> Change-Id: I0176fa480e5ba40eea5a39685a4f97896a6a6964
This commit is contained in:
parent
3e14bbe607
commit
278bcaa4b0
25 changed files with 1805 additions and 1686 deletions
|
|
@ -1028,18 +1028,19 @@ async fn handle_action(
|
|||
}
|
||||
Action::Edit => {
|
||||
if state.current_view == View::Detail
|
||||
&& let Some(ref media) = state.selected_media {
|
||||
// Populate edit fields from selected media
|
||||
state.edit_title = media.title.clone().unwrap_or_default();
|
||||
state.edit_artist = media.artist.clone().unwrap_or_default();
|
||||
state.edit_album = media.album.clone().unwrap_or_default();
|
||||
state.edit_genre = media.genre.clone().unwrap_or_default();
|
||||
state.edit_year = media.year.map(|y| y.to_string()).unwrap_or_default();
|
||||
state.edit_description = media.description.clone().unwrap_or_default();
|
||||
state.edit_field_index = Some(0);
|
||||
state.input_mode = true;
|
||||
state.current_view = View::MetadataEdit;
|
||||
}
|
||||
&& let Some(ref media) = state.selected_media
|
||||
{
|
||||
// Populate edit fields from selected media
|
||||
state.edit_title = media.title.clone().unwrap_or_default();
|
||||
state.edit_artist = media.artist.clone().unwrap_or_default();
|
||||
state.edit_album = media.album.clone().unwrap_or_default();
|
||||
state.edit_genre = media.genre.clone().unwrap_or_default();
|
||||
state.edit_year = media.year.map(|y| y.to_string()).unwrap_or_default();
|
||||
state.edit_description = media.description.clone().unwrap_or_default();
|
||||
state.edit_field_index = Some(0);
|
||||
state.input_mode = true;
|
||||
state.current_view = View::MetadataEdit;
|
||||
}
|
||||
}
|
||||
Action::Vacuum => {
|
||||
if state.current_view == View::Database {
|
||||
|
|
@ -1069,90 +1070,91 @@ async fn handle_action(
|
|||
Action::Toggle => {
|
||||
if state.current_view == View::Tasks
|
||||
&& let Some(idx) = state.scheduled_tasks_selected
|
||||
&& let Some(task) = state.scheduled_tasks.get(idx) {
|
||||
let task_id = task.id.clone();
|
||||
let client = client.clone();
|
||||
let tx = event_sender.clone();
|
||||
tokio::spawn(async move {
|
||||
match client.toggle_scheduled_task(&task_id).await {
|
||||
Ok(()) => {
|
||||
// Refresh tasks list
|
||||
if let Ok(tasks) = client.list_scheduled_tasks().await {
|
||||
let _ = tx.send(AppEvent::ApiResult(
|
||||
ApiResult::ScheduledTasks(tasks),
|
||||
));
|
||||
}
|
||||
}
|
||||
Err(e) => {
|
||||
tracing::error!("Failed to toggle task: {}", e);
|
||||
let _ = tx.send(AppEvent::ApiResult(ApiResult::Error(
|
||||
format!("Toggle task failed: {e}"),
|
||||
)));
|
||||
}
|
||||
&& let Some(task) = state.scheduled_tasks.get(idx)
|
||||
{
|
||||
let task_id = task.id.clone();
|
||||
let client = client.clone();
|
||||
let tx = event_sender.clone();
|
||||
tokio::spawn(async move {
|
||||
match client.toggle_scheduled_task(&task_id).await {
|
||||
Ok(()) => {
|
||||
// Refresh tasks list
|
||||
if let Ok(tasks) = client.list_scheduled_tasks().await {
|
||||
let _ =
|
||||
tx.send(AppEvent::ApiResult(ApiResult::ScheduledTasks(tasks)));
|
||||
}
|
||||
});
|
||||
}
|
||||
Err(e) => {
|
||||
tracing::error!("Failed to toggle task: {}", e);
|
||||
let _ = tx.send(AppEvent::ApiResult(ApiResult::Error(format!(
|
||||
"Toggle task failed: {e}"
|
||||
))));
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
Action::RunNow => {
|
||||
if state.current_view == View::Tasks
|
||||
&& let Some(idx) = state.scheduled_tasks_selected
|
||||
&& let Some(task) = state.scheduled_tasks.get(idx) {
|
||||
let task_id = task.id.clone();
|
||||
let task_name = task.name.clone();
|
||||
state.status_message = Some(format!("Running task: {task_name}..."));
|
||||
let client = client.clone();
|
||||
let tx = event_sender.clone();
|
||||
tokio::spawn(async move {
|
||||
match client.run_task_now(&task_id).await {
|
||||
Ok(()) => {
|
||||
// Refresh tasks list
|
||||
if let Ok(tasks) = client.list_scheduled_tasks().await {
|
||||
let _ = tx.send(AppEvent::ApiResult(
|
||||
ApiResult::ScheduledTasks(tasks),
|
||||
));
|
||||
}
|
||||
}
|
||||
Err(e) => {
|
||||
tracing::error!("Failed to run task: {}", e);
|
||||
let _ = tx.send(AppEvent::ApiResult(ApiResult::Error(
|
||||
format!("Run task failed: {e}"),
|
||||
)));
|
||||
}
|
||||
&& let Some(task) = state.scheduled_tasks.get(idx)
|
||||
{
|
||||
let task_id = task.id.clone();
|
||||
let task_name = task.name.clone();
|
||||
state.status_message = Some(format!("Running task: {task_name}..."));
|
||||
let client = client.clone();
|
||||
let tx = event_sender.clone();
|
||||
tokio::spawn(async move {
|
||||
match client.run_task_now(&task_id).await {
|
||||
Ok(()) => {
|
||||
// Refresh tasks list
|
||||
if let Ok(tasks) = client.list_scheduled_tasks().await {
|
||||
let _ =
|
||||
tx.send(AppEvent::ApiResult(ApiResult::ScheduledTasks(tasks)));
|
||||
}
|
||||
});
|
||||
}
|
||||
Err(e) => {
|
||||
tracing::error!("Failed to run task: {}", e);
|
||||
let _ = tx.send(AppEvent::ApiResult(ApiResult::Error(format!(
|
||||
"Run task failed: {e}"
|
||||
))));
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
Action::Save => {
|
||||
if state.current_view == View::MetadataEdit
|
||||
&& let Some(ref media) = state.selected_media {
|
||||
let updates = serde_json::json!({
|
||||
"title": if state.edit_title.is_empty() { serde_json::Value::Null } else { serde_json::Value::String(state.edit_title.clone()) },
|
||||
"artist": if state.edit_artist.is_empty() { serde_json::Value::Null } else { serde_json::Value::String(state.edit_artist.clone()) },
|
||||
"album": if state.edit_album.is_empty() { serde_json::Value::Null } else { serde_json::Value::String(state.edit_album.clone()) },
|
||||
"genre": if state.edit_genre.is_empty() { serde_json::Value::Null } else { serde_json::Value::String(state.edit_genre.clone()) },
|
||||
"year": state.edit_year.parse::<i32>().ok(),
|
||||
"description": if state.edit_description.is_empty() { serde_json::Value::Null } else { serde_json::Value::String(state.edit_description.clone()) },
|
||||
});
|
||||
let media_id = media.id.clone();
|
||||
let client = client.clone();
|
||||
let tx = event_sender.clone();
|
||||
state.status_message = Some("Saving...".to_string());
|
||||
tokio::spawn(async move {
|
||||
match client.update_media(&media_id, updates).await {
|
||||
Ok(_) => {
|
||||
let _ = tx.send(AppEvent::ApiResult(ApiResult::MediaUpdated));
|
||||
}
|
||||
Err(e) => {
|
||||
tracing::error!("Failed to update media: {}", e);
|
||||
let _ = tx.send(AppEvent::ApiResult(ApiResult::Error(format!(
|
||||
"Update failed: {e}"
|
||||
))));
|
||||
}
|
||||
&& let Some(ref media) = state.selected_media
|
||||
{
|
||||
let updates = serde_json::json!({
|
||||
"title": if state.edit_title.is_empty() { serde_json::Value::Null } else { serde_json::Value::String(state.edit_title.clone()) },
|
||||
"artist": if state.edit_artist.is_empty() { serde_json::Value::Null } else { serde_json::Value::String(state.edit_artist.clone()) },
|
||||
"album": if state.edit_album.is_empty() { serde_json::Value::Null } else { serde_json::Value::String(state.edit_album.clone()) },
|
||||
"genre": if state.edit_genre.is_empty() { serde_json::Value::Null } else { serde_json::Value::String(state.edit_genre.clone()) },
|
||||
"year": state.edit_year.parse::<i32>().ok(),
|
||||
"description": if state.edit_description.is_empty() { serde_json::Value::Null } else { serde_json::Value::String(state.edit_description.clone()) },
|
||||
});
|
||||
let media_id = media.id.clone();
|
||||
let client = client.clone();
|
||||
let tx = event_sender.clone();
|
||||
state.status_message = Some("Saving...".to_string());
|
||||
tokio::spawn(async move {
|
||||
match client.update_media(&media_id, updates).await {
|
||||
Ok(_) => {
|
||||
let _ = tx.send(AppEvent::ApiResult(ApiResult::MediaUpdated));
|
||||
}
|
||||
});
|
||||
state.input_mode = false;
|
||||
state.current_view = View::Detail;
|
||||
}
|
||||
Err(e) => {
|
||||
tracing::error!("Failed to update media: {}", e);
|
||||
let _ = tx.send(AppEvent::ApiResult(ApiResult::Error(format!(
|
||||
"Update failed: {e}"
|
||||
))));
|
||||
}
|
||||
}
|
||||
});
|
||||
state.input_mode = false;
|
||||
state.current_view = View::Detail;
|
||||
}
|
||||
}
|
||||
Action::NavigateLeft | Action::NavigateRight | Action::None => {}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue