metis_docs_tui/app/operations/
editor.rs1use 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 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 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 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 let new_content = textarea.lines().join("\n");
49
50 if let Some(ref vision_path) = self.ui_state.editing_vision_path {
52 match tokio::fs::write(vision_path, &new_content).await {
54 Ok(_) => {
55 }
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 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 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}