Radish alpha
r
Radicle terminal user interface
Radicle
Git (anonymous pull)
Log in to clone via SSH
Bubble up input values from new issue form
Erik Kundt committed 2 years ago
commit e6cc2235f2491812814f40dc765e6da05abdaefc
parent 33eaa4e8e0e57529d95cf199242e2bf8761508e4
3 files changed +79 -7
modified src/app.rs
@@ -72,6 +72,7 @@ pub enum IssueMessage {
    Focus(IssueCid),
    OpenPopup(IssueCid),
    ClosePopup(IssueCid),
+
    New(String, String, String, String),
    Leave,
}

@@ -192,6 +193,7 @@ impl App {
                    _ => Ok(Some(Message::Batch(results))),
                }
            }
+
            Message::Issue(IssueMessage::New(_title, _tags, _assignees, _description)) => Ok(None),
            Message::Issue(IssueMessage::Show(id)) => {
                self.view_issue(app, id, &theme)?;
                Ok(None)
modified src/app/event.rs
@@ -9,6 +9,7 @@ use radicle_tui::ui::widget::common::context::{ContextBar, Shortcuts};
use radicle_tui::ui::widget::common::form::TextInput;
use radicle_tui::ui::widget::common::list::PropertyList;
use radicle_tui::ui::widget::home::{Dashboard, IssueBrowser, PatchBrowser};
+
use radicle_tui::ui::widget::issue::NewForm;
use radicle_tui::ui::widget::{issue, patch};

use radicle_tui::ui::widget::Widget;
@@ -158,8 +159,53 @@ impl tuirealm::Component<Message, NoUserEvent> for Widget<issue::NewForm> {
                code: Key::Char('s'),
                modifiers: KeyModifiers::ALT,
            }) => {
-
                self.perform(Cmd::Submit);
-
                None
+
                match self.perform(Cmd::Submit) {
+
                    CmdResult::Submit(State::Map(inputs)) => {
+
                        let mut missing_values = vec![];
+

+
                        let title = match inputs.get(NewForm::INPUT_TITLE) {
+
                            Some(StateValue::String(title)) if !title.is_empty() => {
+
                                Some(title.clone())
+
                            }
+
                            _ => None,
+
                        };
+
                        let tags = match inputs.get(NewForm::INPUT_TAGS) {
+
                            Some(StateValue::String(tags)) => Some(tags.clone()),
+
                            _ => Some(String::from("[]")),
+
                        };
+
                        let assignees = match inputs.get(NewForm::INPUT_ASSIGNESS) {
+
                            Some(StateValue::String(assignees)) => Some(assignees.clone()),
+
                            _ => Some(String::from("[]")),
+
                        };
+
                        let description = match inputs.get(NewForm::INPUT_DESCRIPTION) {
+
                            Some(StateValue::String(description)) if !description.is_empty() => {
+
                                Some(description.clone())
+
                            }
+
                            _ => None,
+
                        };
+

+
                        if title.is_none() {
+
                            missing_values.push(NewForm::INPUT_TITLE);
+
                        }
+
                        if description.is_none() {
+
                            missing_values.push(NewForm::INPUT_DESCRIPTION);
+
                        }
+

+
                        // show error popup if missing.
+
                        if !missing_values.is_empty() {
+
                            let error = format!("Missing fields: {:?}", missing_values);
+
                            Some(Message::Popup(PopupMessage::Error(error)))
+
                        } else {
+
                            Some(Message::Issue(IssueMessage::New(
+
                                title.unwrap(),
+
                                tags.unwrap(),
+
                                assignees.unwrap(),
+
                                description.unwrap(),
+
                            )))
+
                        }
+
                    }
+
                    _ => None,
+
                }
            }
            Event::Keyboard(KeyEvent { code: Key::Esc, .. }) => {
                Some(Message::Issue(IssueMessage::ClosePopup(IssueCid::NewForm)))
modified src/ui/widget/issue.rs
@@ -1,11 +1,13 @@
+
use std::collections::HashMap;
+

use radicle::cob::thread::Comment;
use radicle::cob::thread::CommentId;

use radicle::cob::issue::Issue;
use radicle::cob::issue::IssueId;
-
use tuirealm::tui::layout::Constraint;
-
use tuirealm::tui::layout::Direction;
-
use tuirealm::tui::layout::Layout;
+
use tuirealm::tui::layout::{Constraint, Direction, Layout};
+
use tuirealm::StateValue;
+


use super::common::container::{Container, LabeledContainer};
use super::common::context::{ContextBar, Progress};
@@ -252,6 +254,11 @@ pub struct NewForm {
}

impl NewForm {
+
    pub const INPUT_TITLE: &str = "title";
+
    pub const INPUT_TAGS: &str = "tags";
+
    pub const INPUT_ASSIGNESS: &str = "assignees";
+
    pub const INPUT_DESCRIPTION: &str = "description";
+

    pub fn new(theme: &Theme) -> Self {
        use tuirealm::props::Layout;

@@ -300,8 +307,25 @@ impl WidgetComponent for NewForm {
    fn perform(&mut self, _properties: &Props, cmd: Cmd) -> CmdResult {
        match self.form.perform(cmd) {
            CmdResult::Submit(State::Vec(values)) => {
-
                println!("{:?}", values);
-
                CmdResult::None
+
                let inputs = HashMap::from([
+
                    (
+
                        Self::INPUT_TITLE.to_owned(),
+
                        values.get(0).unwrap_or(&StateValue::None).clone(),
+
                    ),
+
                    (
+
                        Self::INPUT_TAGS.to_owned(),
+
                        values.get(1).unwrap_or(&StateValue::None).clone(),
+
                    ),
+
                    (
+
                        Self::INPUT_ASSIGNESS.to_owned(),
+
                        values.get(2).unwrap_or(&StateValue::None).clone(),
+
                    ),
+
                    (
+
                        Self::INPUT_DESCRIPTION.to_owned(),
+
                        values.get(3).unwrap_or(&StateValue::None).clone(),
+
                    ),
+
                ]);
+
                CmdResult::Submit(State::Map(inputs))
            }
            _ => CmdResult::None,
        }