going directly into adminstate from appstate for the admin page. DESTROYED

This commit is contained in:
filipriec
2025-04-14 11:24:56 +02:00
parent 1927d1fa4d
commit 2d724876eb
10 changed files with 100 additions and 33 deletions

View File

@@ -2,7 +2,8 @@
pub mod read_only; pub mod read_only;
pub mod edit; pub mod edit;
pub mod navigation;
pub use read_only::*; pub use read_only::*;
pub use edit::*; pub use edit::*;
pub use navigation::*;

View File

@@ -0,0 +1,3 @@
// src/functions/modes/navigation.rs
pub mod admin_nav;

View File

@@ -0,0 +1,36 @@
// src/functions/modes/navigation/admin_nav.rs
use crate::state::app::state::AppState;
use crate::state::pages::admin::AdminState;
/// Handles moving the selection up in the admin profile list.
pub fn move_admin_list_up(app_state: &AppState, admin_state: &mut AdminState) {
// Read profile count directly from app_state where the source data lives
let profile_count = app_state.profile_tree.profiles.len();
if profile_count == 0 {
admin_state.list_state.select(None); // Ensure nothing selected if empty
return;
}
let current_index = admin_state.get_selected_index().unwrap_or(0);
let new_index = if current_index == 0 {
profile_count - 1 // Wrap to end
} else {
current_index.saturating_sub(1) // Move up
};
admin_state.list_state.select(Some(new_index));
}
/// Handles moving the selection down in the admin profile list.
pub fn move_admin_list_down(app_state: &AppState, admin_state: &mut AdminState) {
// Read profile count directly from app_state
let profile_count = app_state.profile_tree.profiles.len();
if profile_count == 0 {
admin_state.list_state.select(None); // Ensure nothing selected if empty
return;
}
let current_index = admin_state.get_selected_index().unwrap_or(0);
let new_index = (current_index + 1) % profile_count; // Wrap around
admin_state.list_state.select(Some(new_index));
}

View File

@@ -6,9 +6,11 @@ use crate::state::app::state::AppState;
use crate::state::pages::form::FormState; use crate::state::pages::form::FormState;
use crate::state::pages::auth::LoginState; use crate::state::pages::auth::LoginState;
use crate::state::pages::auth::RegisterState; use crate::state::pages::auth::RegisterState;
use crate::state::pages::admin::AdminState;
use crate::state::pages::canvas_state::CanvasState; use crate::state::pages::canvas_state::CanvasState;
use crate::ui::handlers::context::UiContext; use crate::ui::handlers::context::UiContext;
use crate::modes::handlers::event::EventOutcome; use crate::modes::handlers::event::EventOutcome;
use crate::functions::modes::navigation::admin_nav;
pub async fn handle_navigation_event( pub async fn handle_navigation_event(
key: KeyEvent, key: KeyEvent,
@@ -17,6 +19,7 @@ pub async fn handle_navigation_event(
app_state: &mut AppState, app_state: &mut AppState,
login_state: &mut LoginState, login_state: &mut LoginState,
register_state: &mut RegisterState, register_state: &mut RegisterState,
admin_state: &mut AdminState,
command_mode: &mut bool, command_mode: &mut bool,
command_input: &mut String, command_input: &mut String,
command_message: &mut String, command_message: &mut String,
@@ -24,11 +27,11 @@ pub async fn handle_navigation_event(
if let Some(action) = config.get_general_action(key.code, key.modifiers) { if let Some(action) = config.get_general_action(key.code, key.modifiers) {
match action { match action {
"move_up" => { "move_up" => {
move_up(app_state, login_state, register_state); move_up(app_state, login_state, register_state, admin_state);
return Ok(EventOutcome::Ok(String::new())); return Ok(EventOutcome::Ok(String::new()));
} }
"move_down" => { "move_down" => {
move_down(app_state); move_down(app_state, admin_state);
return Ok(EventOutcome::Ok(String::new())); return Ok(EventOutcome::Ok(String::new()));
} }
"next_option" => { "next_option" => {
@@ -80,7 +83,7 @@ pub async fn handle_navigation_event(
Ok(EventOutcome::Ok(String::new())) Ok(EventOutcome::Ok(String::new()))
} }
pub fn move_up(app_state: &mut AppState, login_state: &mut LoginState, register_state: &mut RegisterState) { pub fn move_up(app_state: &mut AppState, login_state: &mut LoginState, register_state: &mut RegisterState, admin_state: &mut AdminState) {
if app_state.ui.focus_outside_canvas && app_state.ui.show_login || app_state.ui.show_register{ if app_state.ui.focus_outside_canvas && app_state.ui.show_login || app_state.ui.show_register{
if app_state.general.selected_item == 0 { if app_state.general.selected_item == 0 {
app_state.ui.focus_outside_canvas = false; app_state.ui.focus_outside_canvas = false;
@@ -97,22 +100,11 @@ pub fn move_up(app_state: &mut AppState, login_state: &mut LoginState, register_
} else if app_state.ui.show_intro { } else if app_state.ui.show_intro {
app_state.ui.intro_state.previous_option(); app_state.ui.intro_state.previous_option();
} else if app_state.ui.show_admin { } else if app_state.ui.show_admin {
// Assuming profile_tree.profiles is the list we're navigating admin_nav::move_admin_list_up(app_state, admin_state);
let profile_count = app_state.profile_tree.profiles.len();
if profile_count == 0 {
return;
}
// Use general state for tracking selection in admin panel
if app_state.general.selected_item == 0 {
app_state.general.selected_item = profile_count - 1;
} else {
app_state.general.selected_item = app_state.general.selected_item.saturating_sub(1);
}
} }
} }
pub fn move_down(app_state: &mut AppState) { pub fn move_down(app_state: &mut AppState, admin_state: &mut AdminState) {
if app_state.ui.focus_outside_canvas && app_state.ui.show_login || app_state.ui.show_register { if app_state.ui.focus_outside_canvas && app_state.ui.show_login || app_state.ui.show_register {
let num_general_elements = 2; let num_general_elements = 2;
if app_state.general.selected_item < num_general_elements - 1 { if app_state.general.selected_item < num_general_elements - 1 {
@@ -127,7 +119,7 @@ pub fn move_down(app_state: &mut AppState) {
return; return;
} }
app_state.general.selected_item = (app_state.general.selected_item + 1) % profile_count; admin_nav::move_admin_list_down(app_state, admin_state);
} }
} }

View File

@@ -10,6 +10,7 @@ use crate::state::pages::form::FormState;
use crate::state::pages::auth::AuthState; use crate::state::pages::auth::AuthState;
use crate::state::pages::auth::LoginState; use crate::state::pages::auth::LoginState;
use crate::state::pages::auth::RegisterState; use crate::state::pages::auth::RegisterState;
use crate::state::pages::admin::AdminState;
use crate::state::app::state::AppState; use crate::state::app::state::AppState;
use crate::state::pages::canvas_state::CanvasState; use crate::state::pages::canvas_state::CanvasState;
use crate::ui::handlers::rat_state::UiStateHandler; use crate::ui::handlers::rat_state::UiStateHandler;
@@ -69,6 +70,7 @@ impl EventHandler {
auth_state: &mut AuthState, auth_state: &mut AuthState,
login_state: &mut LoginState, login_state: &mut LoginState,
register_state: &mut RegisterState, register_state: &mut RegisterState,
admin_state: &mut AdminState,
app_state: &mut AppState, app_state: &mut AppState,
total_count: u64, total_count: u64,
current_position: &mut u64, current_position: &mut u64,
@@ -107,6 +109,7 @@ impl EventHandler {
app_state, app_state,
login_state, login_state,
register_state, register_state,
admin_state,
&mut self.command_mode, &mut self.command_mode,
&mut self.command_input, &mut self.command_input,
&mut self.command_message, &mut self.command_message,
@@ -134,8 +137,8 @@ impl EventHandler {
}; };
} }
UiContext::Admin => { UiContext::Admin => {
// Assuming handle_admin_selection uses app_state.general.selected_item
admin::handle_admin_selection(app_state); admin::handle_admin_selection(app_state);
message = format!("Admin Option {} selected", index); message = format!("Admin Option {} selected", index);
} }
UiContext::Dialog => { UiContext::Dialog => {

View File

@@ -27,11 +27,6 @@ pub struct UiState {
pub dialog: DialogState, pub dialog: DialogState,
} }
pub struct GeneralState {
pub selected_item: usize,
pub current_option: usize,
}
pub struct AppState { pub struct AppState {
// Core editor state // Core editor state
pub current_dir: String, pub current_dir: String,
@@ -43,7 +38,6 @@ pub struct AppState {
// UI preferences // UI preferences
pub ui: UiState, pub ui: UiState,
pub general: GeneralState,
} }
impl AppState { impl AppState {
@@ -59,10 +53,6 @@ impl AppState {
selected_profile: None, selected_profile: None,
current_mode: AppMode::General, current_mode: AppMode::General,
ui: UiState::default(), ui: UiState::default(),
general: GeneralState {
selected_item: 0,
current_option: 0,
},
}) })
} }

View File

@@ -2,4 +2,5 @@
pub mod form; pub mod form;
pub mod auth; pub mod auth;
pub mod admin;
pub mod canvas_state; pub mod canvas_state;

View File

@@ -0,0 +1,38 @@
// src/state/pages/admin.rs
use ratatui::widgets::ListState;
#[derive(Default, Clone, Debug)]
pub struct AdminState {
pub profiles: Vec<String>,
pub list_state: ListState,
}
impl AdminState {
/// Gets the index of the currently selected item.
pub fn get_selected_index(&self) -> Option<usize> {
self.list_state.selected()
}
/// Gets the name of the currently selected profile.
pub fn get_selected_profile_name(&self) -> Option<&String> {
self.list_state.selected().and_then(|i| self.profiles.get(i))
}
/// Populates the profile list and updates/resets the selection.
pub fn set_profiles(&mut self, new_profiles: Vec<String>) {
let current_selection_index = self.list_state.selected();
self.profiles = new_profiles;
if self.profiles.is_empty() {
self.list_state.select(None);
} else {
let new_selection = match current_selection_index {
Some(index) => Some(index.min(self.profiles.len() - 1)),
None => Some(0),
};
self.list_state.select(new_selection);
}
}
}

View File

@@ -17,6 +17,7 @@ use crate::state::pages::auth::AuthState;
use crate::state::pages::auth::LoginState; use crate::state::pages::auth::LoginState;
use crate::state::pages::auth::RegisterState; use crate::state::pages::auth::RegisterState;
use crate::state::app::state::AppState; use crate::state::app::state::AppState;
use crate::state::pages::admin::AdminState;
pub fn render_ui( pub fn render_ui(
f: &mut Frame, f: &mut Frame,
@@ -77,10 +78,9 @@ pub fn render_ui(
// Set the selected item - FIXED // Set the selected item - FIXED
if !admin_state.profiles.is_empty() { if !admin_state.profiles.is_empty() {
let selected_index = std::cmp::min( let selected_index = admin_state.get_selected_index()
app_state.general.selected_item, .unwrap_or(0)
admin_state.profiles.len() - 1 .min(admin_state.profiles.len() - 1);
);
admin_state.list_state.select(Some(selected_index)); admin_state.list_state.select(Some(selected_index));
} }

View File

@@ -12,6 +12,7 @@ use crate::state::pages::form::FormState;
use crate::state::pages::auth::AuthState; use crate::state::pages::auth::AuthState;
use crate::state::pages::auth::LoginState; use crate::state::pages::auth::LoginState;
use crate::state::pages::auth::RegisterState; use crate::state::pages::auth::RegisterState;
use crate::state::pages::admin::AdminState;
use crate::state::app::state::AppState; use crate::state::app::state::AppState;
// Import SaveOutcome // Import SaveOutcome
use crate::tui::terminal::{EventReader, TerminalCore}; use crate::tui::terminal::{EventReader, TerminalCore};
@@ -27,6 +28,7 @@ pub async fn run_ui() -> Result<(), Box<dyn std::error::Error>> {
let mut auth_state = AuthState::default(); let mut auth_state = AuthState::default();
let mut register_state = RegisterState::default(); let mut register_state = RegisterState::default();
let mut login_state = LoginState::default(); let mut login_state = LoginState::default();
let mut admin_state = AdminState::default();
// Initialize app_state first // Initialize app_state first
let mut app_state = AppState::new()?; let mut app_state = AppState::new()?;
@@ -118,6 +120,7 @@ pub async fn run_ui() -> Result<(), Box<dyn std::error::Error>> {
&mut auth_state, &mut auth_state,
&mut login_state, &mut login_state,
&mut register_state, &mut register_state,
&mut admin_state,
&mut app_state, &mut app_state,
total_count, total_count,
&mut current_position, &mut current_position,