use rust_i18n::t;
use super::ResourceTab;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct InputField {
pub label: String,
pub value: String,
pub required: bool
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct CreateForm {
pub tab: ResourceTab,
pub title: String,
pub fields: Vec<InputField>,
pub active: usize
}
impl super::App {
#[must_use]
pub const fn create_form_open(&self) -> bool {
self.create_form.is_some()
}
pub fn open_create_form(&mut self) {
let form = match self.active_tab {
ResourceTab::Projects => Some(CreateForm {
tab: ResourceTab::Projects,
title: "Create project".to_string(),
fields: vec![
InputField {
label: "Name".to_string(),
value: String::new(),
required: true
},
InputField {
label: "Description".to_string(),
value: String::new(),
required: false
},
],
active: 0
}),
_ => None
};
if let Some(form) = form {
self.create_form = Some(form);
} else {
self.status_message = Some(t!("app.create_not_supported").to_string());
}
}
pub fn close_create_form(&mut self) {
self.create_form = None;
}
pub const fn form_next_field(&mut self) {
if let Some(form) = &mut self.create_form
&& !form.fields.is_empty()
{
form.active = (form.active + 1) % form.fields.len();
}
}
pub const fn form_prev_field(&mut self) {
if let Some(form) = &mut self.create_form
&& !form.fields.is_empty()
{
let len = form.fields.len();
form.active = (form.active + len - 1) % len;
}
}
pub fn form_input(&mut self, c: char) {
if let Some(form) = &mut self.create_form
&& let Some(field) = form.fields.get_mut(form.active)
{
field.value.push(c);
}
}
pub fn form_backspace(&mut self) {
if let Some(form) = &mut self.create_form
&& let Some(field) = form.fields.get_mut(form.active)
{
field.value.pop();
}
}
pub fn form_submit(&mut self) -> bool {
let Some(form) = &self.create_form else {
return false;
};
if form
.fields
.iter()
.any(|f| f.required && f.value.trim().is_empty())
{
return false;
}
self.create_request = self.create_form.take();
true
}
pub fn take_create_request(&mut self) -> Option<CreateForm> {
self.create_request.take()
}
}