bitque/jirs-client/src/model.rs

236 lines
7.2 KiB
Rust
Raw Normal View History

2020-03-30 08:16:26 +02:00
use std::collections::hash_map::HashMap;
use serde::{Deserialize, Serialize};
use uuid::Uuid;
use jirs_data::*;
2020-04-10 08:09:40 +02:00
use crate::shared::styled_editor::Mode;
2020-04-08 16:14:59 +02:00
use crate::shared::styled_select::StyledSelectState;
use crate::{AddIssueModalFieldId, EditIssueModalFieldId, FieldId, HOST_URL};
2020-03-30 08:16:26 +02:00
2020-04-08 16:14:59 +02:00
#[derive(Clone, Debug, PartialOrd, PartialEq, Hash)]
2020-04-01 18:30:01 +02:00
pub enum ModalType {
2020-04-04 17:42:02 +02:00
AddIssue(AddIssueModal),
2020-04-02 08:45:43 +02:00
EditIssue(IssueId, EditIssueModal),
2020-04-02 23:51:29 +02:00
DeleteIssueConfirm(IssueId),
2020-04-02 08:45:43 +02:00
}
2020-04-08 16:14:59 +02:00
#[derive(Clone, Debug, PartialOrd, PartialEq, Hash)]
2020-04-02 08:45:43 +02:00
pub struct EditIssueModal {
pub id: i32,
2020-04-02 16:14:07 +02:00
pub link_copied: bool,
2020-04-10 08:09:40 +02:00
pub payload: UpdateIssuePayload,
2020-04-09 16:03:11 +02:00
pub top_type_state: StyledSelectState,
pub status_state: StyledSelectState,
pub reporter_state: StyledSelectState,
pub assignees_state: StyledSelectState,
pub priority_state: StyledSelectState,
2020-04-10 08:09:40 +02:00
pub description_editor_mode: Mode,
pub creating_comment: bool,
}
impl EditIssueModal {
pub fn new(issue: &Issue) -> Self {
Self {
id: issue.id,
link_copied: false,
payload: UpdateIssuePayload {
title: issue.title.clone(),
issue_type: issue.issue_type.clone(),
status: issue.status.clone(),
priority: issue.priority.clone(),
list_position: issue.list_position.clone(),
description: issue.description.clone(),
description_text: issue.description_text.clone(),
estimate: issue.estimate.clone(),
time_spent: issue.time_spent.clone(),
time_remaining: issue.time_remaining.clone(),
project_id: issue.project_id.clone(),
reporter_id: issue.reporter_id.clone(),
user_ids: issue.user_ids.clone(),
},
top_type_state: StyledSelectState::new(FieldId::EditIssueModal(
EditIssueModalFieldId::IssueType,
)),
status_state: StyledSelectState::new(FieldId::EditIssueModal(
EditIssueModalFieldId::Status,
)),
reporter_state: StyledSelectState::new(FieldId::EditIssueModal(
EditIssueModalFieldId::Reporter,
)),
assignees_state: StyledSelectState::new(FieldId::EditIssueModal(
EditIssueModalFieldId::Assignees,
)),
priority_state: StyledSelectState::new(FieldId::EditIssueModal(
EditIssueModalFieldId::Priority,
)),
description_editor_mode: Mode::Editor,
creating_comment: false,
}
}
2020-04-01 18:30:01 +02:00
}
2020-04-08 16:14:59 +02:00
#[derive(Clone, Debug, PartialOrd, PartialEq, Hash)]
2020-04-04 17:42:02 +02:00
pub struct AddIssueModal {
pub title: String,
pub issue_type: IssueType,
pub status: IssueStatus,
pub priority: IssuePriority,
pub description: Option<String>,
pub description_text: Option<String>,
pub estimate: Option<i32>,
pub time_spent: Option<i32>,
pub time_remaining: Option<i32>,
2020-04-08 20:26:28 +02:00
pub project_id: Option<i32>,
2020-04-04 17:42:02 +02:00
pub user_ids: Vec<i32>,
2020-04-08 08:58:02 +02:00
pub reporter_id: Option<i32>,
2020-04-04 17:42:02 +02:00
// modal fields
2020-04-08 16:14:59 +02:00
pub type_state: StyledSelectState,
pub reporter_state: StyledSelectState,
pub assignees_state: StyledSelectState,
pub priority_state: StyledSelectState,
}
2020-04-08 08:58:02 +02:00
2020-04-08 16:14:59 +02:00
impl Default for AddIssueModal {
fn default() -> Self {
Self {
title: Default::default(),
issue_type: Default::default(),
status: Default::default(),
priority: Default::default(),
description: Default::default(),
description_text: Default::default(),
estimate: Default::default(),
time_spent: Default::default(),
time_remaining: Default::default(),
project_id: Default::default(),
user_ids: Default::default(),
reporter_id: Default::default(),
type_state: StyledSelectState::new(FieldId::AddIssueModal(
AddIssueModalFieldId::IssueType,
)),
reporter_state: StyledSelectState::new(FieldId::AddIssueModal(
AddIssueModalFieldId::Reporter,
)),
assignees_state: StyledSelectState::new(FieldId::AddIssueModal(
AddIssueModalFieldId::Assignees,
)),
priority_state: StyledSelectState::new(FieldId::AddIssueModal(
AddIssueModalFieldId::Priority,
)),
2020-04-08 16:14:59 +02:00
}
}
2020-04-04 17:42:02 +02:00
}
2020-04-08 16:14:59 +02:00
#[derive(Copy, Clone, Debug, PartialOrd, PartialEq)]
2020-03-30 14:26:25 +02:00
pub enum Page {
Project,
2020-04-01 10:36:05 +02:00
EditIssue(IssueId),
2020-04-04 17:42:02 +02:00
AddIssue,
2020-03-30 14:26:25 +02:00
ProjectSettings,
Login,
Register,
}
2020-03-30 14:56:22 +02:00
impl Page {
pub fn to_path(&self) -> String {
match self {
2020-04-01 10:36:05 +02:00
Page::Project => "/board".to_string(),
Page::EditIssue(id) => format!("/issues/{id}", id = id),
2020-04-04 17:42:02 +02:00
Page::AddIssue => format!("/add-issues"),
2020-04-01 10:36:05 +02:00
Page::ProjectSettings => "/project-settings".to_string(),
Page::Login => "/login".to_string(),
Page::Register => "/register".to_string(),
2020-03-30 14:56:22 +02:00
}
}
}
2020-03-30 14:26:25 +02:00
#[derive(Serialize, Deserialize, Debug)]
2020-03-30 08:16:26 +02:00
pub struct CreateCommentForm {
2020-03-30 14:26:25 +02:00
pub fields: CreateCommentPayload,
2020-03-30 08:16:26 +02:00
}
2020-03-30 14:26:25 +02:00
#[derive(Serialize, Deserialize, Debug)]
2020-03-30 08:16:26 +02:00
pub struct CreateIssueForm {
2020-03-30 14:26:25 +02:00
pub fields: CreateIssuePayload,
2020-03-30 08:16:26 +02:00
}
2020-03-30 14:26:25 +02:00
#[derive(Serialize, Deserialize, Debug)]
2020-03-30 08:16:26 +02:00
pub struct UpdateProjectForm {
2020-03-30 14:26:25 +02:00
pub id: ProjectId,
pub fields: UpdateProjectPayload,
2020-03-30 08:16:26 +02:00
}
#[derive(Serialize, Deserialize, Debug)]
pub struct ProjectPage {
pub about_tooltip_visible: bool,
pub text_filter: String,
2020-03-31 22:05:18 +02:00
pub active_avatar_filters: Vec<UserId>,
2020-03-31 11:11:06 +02:00
pub only_my_filter: bool,
2020-03-31 22:05:18 +02:00
pub recently_updated_filter: bool,
pub dragged_issue_id: Option<IssueId>,
pub last_drag_exchange_id: Option<IssueId>,
pub dirty_issues: Vec<IssueId>,
}
2020-04-05 15:15:09 +02:00
#[derive(Debug)]
2020-03-30 08:16:26 +02:00
pub struct Model {
2020-04-07 16:02:13 +02:00
pub host_url: String,
2020-03-30 14:26:25 +02:00
pub access_token: Option<Uuid>,
2020-04-07 16:02:13 +02:00
// mapped
pub comments_by_project_id: HashMap<ProjectId, Vec<Comment>>,
// forms
2020-03-30 14:26:25 +02:00
pub project_form: Option<UpdateProjectForm>,
pub issue_form: Option<CreateIssueForm>,
pub comment_form: Option<CreateCommentForm>,
2020-04-06 22:59:33 +02:00
2020-04-07 16:02:13 +02:00
// modals
pub modals: Vec<ModalType>,
// pages
2020-03-30 14:26:25 +02:00
pub page: Page,
pub project_page: ProjectPage,
2020-04-06 08:38:08 +02:00
2020-04-06 22:59:33 +02:00
pub project: Option<Project>,
pub user: Option<User>,
pub issues: Vec<Issue>,
pub users: Vec<User>,
2020-04-11 11:18:41 +02:00
pub comments: Vec<Comment>,
2020-03-30 08:16:26 +02:00
}
impl Default for Model {
fn default() -> Self {
2020-03-30 14:26:25 +02:00
let host_url = unsafe { HOST_URL.clone() };
2020-03-30 08:16:26 +02:00
Self {
access_token: None,
user: None,
issue_form: None,
project_form: None,
comment_form: None,
issues: vec![],
2020-04-06 22:59:33 +02:00
users: vec![],
2020-03-30 08:16:26 +02:00
comments_by_project_id: Default::default(),
2020-03-30 14:26:25 +02:00
page: Page::Project,
host_url,
project_page: ProjectPage {
about_tooltip_visible: false,
text_filter: "".to_string(),
2020-03-31 11:11:06 +02:00
active_avatar_filters: vec![],
only_my_filter: false,
2020-03-31 22:05:18 +02:00
recently_updated_filter: false,
dragged_issue_id: None,
last_drag_exchange_id: None,
dirty_issues: vec![],
},
modals: vec![],
2020-04-06 22:59:33 +02:00
project: None,
2020-04-11 11:18:41 +02:00
comments: vec![],
2020-03-30 08:16:26 +02:00
}
}
}