Skip to main content

metis_docs_tui/app/operations/
editor.rs

1use crate::app::App;
2use crate::error::AppError;
3use crate::models::{kanban::DocumentObject, AppState};
4use anyhow::Result;
5use metis_core::Document;
6
7impl App {
8    pub fn start_content_editing(&mut self) {
9        self.ui_state.set_app_state(AppState::EditingContent);
10
11        // Initialize text editor with current document content
12        if let Some(selected_item) = self.get_viewed_ticket() {
13            let content = match &selected_item.document {
14                DocumentObject::Strategy(strategy) => strategy.content().full_content(),
15                DocumentObject::Initiative(initiative) => initiative.content().full_content(),
16                DocumentObject::Task(task) => task.content().full_content(),
17                DocumentObject::Adr(adr) => adr.content().full_content(),
18            };
19
20            // Create and initialize textarea
21            let mut textarea = tui_textarea::TextArea::default();
22            textarea.set_block(
23                ratatui::widgets::Block::default()
24                    .borders(ratatui::widgets::Borders::ALL)
25                    .title("Content Editor"),
26            );
27
28            // Set the content
29            for line in content.lines() {
30                textarea.insert_str(line);
31                textarea.insert_newline();
32            }
33
34            self.ui_state.strategy_editor = Some(textarea);
35        }
36    }
37
38    pub fn cancel_content_editing(&mut self) {
39        self.ui_state.set_app_state(AppState::Normal);
40        self.ui_state.strategy_editor = None;
41        self.ui_state.viewing_ticket = None;
42        self.ui_state.editing_vision_path = None;
43    }
44
45    pub async fn save_content_edit(&mut self) -> Result<()> {
46        if let Some(ref textarea) = self.ui_state.strategy_editor {
47            // Get current content from textarea
48            let new_content = textarea.lines().join("\n");
49
50            // Check if we're editing a vision document
51            if let Some(ref vision_path) = self.ui_state.editing_vision_path {
52                // Save vision document directly
53                match tokio::fs::write(vision_path, &new_content).await {
54                    Ok(_) => {
55                        // Vision saved successfully
56                    }
57                    Err(e) => {
58                        self.error_handler.handle_error(AppError::IoError(format!(
59                            "Failed to save vision: {}",
60                            e
61                        )));
62                    }
63                }
64            } else if let Some(selected_item) = self.get_viewed_ticket() {
65                // Save regular document using document service
66                if let Some(document_service) = &self.document_service {
67                    match document_service
68                        .save_document_content(&selected_item.file_path, &new_content)
69                        .await
70                    {
71                        Ok(_) => {
72                            // Sync database and reload documents
73                            if let Some(sync_service) = &self.sync_service {
74                                let _ = sync_service.sync_database().await;
75                            }
76                            self.load_documents().await?;
77                        }
78                        Err(e) => {
79                            self.error_handler.handle_error(AppError::from(e));
80                        }
81                    }
82                }
83            }
84        }
85
86        Ok(())
87    }
88}