diff --git a/actors/amazon-actor/src/lib.rs b/actors/amazon-actor/src/lib.rs index ec7af72b..02f38524 100644 --- a/actors/amazon-actor/src/lib.rs +++ b/actors/amazon-actor/src/lib.rs @@ -1,7 +1,5 @@ -use { - actix, - rusoto_s3::{PutObjectRequest, S3Client, S3}, -}; +use actix; +use rusoto_s3::{PutObjectRequest, S3Client, S3}; #[derive(Debug)] pub enum AmazonError { diff --git a/actors/database-actor/src/authorize_user.rs b/actors/database-actor/src/authorize_user.rs index 6bfc35a3..3ef9cccd 100644 --- a/actors/database-actor/src/authorize_user.rs +++ b/actors/database-actor/src/authorize_user.rs @@ -1,8 +1,8 @@ -use { - crate::{db_find, tokens::FindAccessToken}, - diesel::prelude::*, - jirs_data::User, -}; +use diesel::prelude::*; +use jirs_data::User; + +use crate::db_find; +use crate::tokens::FindAccessToken; db_find! { AuthorizeUser, diff --git a/actors/database-actor/src/comments.rs b/actors/database-actor/src/comments.rs index 6d5b3350..1172e494 100644 --- a/actors/database-actor/src/comments.rs +++ b/actors/database-actor/src/comments.rs @@ -1,8 +1,7 @@ -use { - crate::{db_create, db_delete, db_load, db_update}, - diesel::prelude::*, - jirs_data::{Comment, CommentId, IssueId, UserId}, -}; +use diesel::prelude::*; +use jirs_data::{Comment, CommentId, IssueId, UserId}; + +use crate::{db_create, db_delete, db_load, db_update}; db_load! { LoadIssueComments, diff --git a/actors/database-actor/src/epics.rs b/actors/database-actor/src/epics.rs index 81eeb1a3..1c6c1c24 100644 --- a/actors/database-actor/src/epics.rs +++ b/actors/database-actor/src/epics.rs @@ -1,9 +1,8 @@ -use { - crate::{db_create, db_delete, db_load, db_update}, - derive_db_execute::Execute, - diesel::prelude::*, - jirs_data::{DescriptionString, Epic, EpicId, ProjectId}, -}; +use derive_db_execute::Execute; +use diesel::prelude::*; +use jirs_data::{DescriptionString, Epic, EpicId, ProjectId}; + +use crate::{db_create, db_delete, db_load, db_update}; #[derive(Execute)] #[db_exec(schema = "epics", result = "Epic", find = "epics.find(msg.epic_id)")] diff --git a/actors/database-actor/src/invitations.rs b/actors/database-actor/src/invitations.rs index cf5d6d94..8680c2d5 100644 --- a/actors/database-actor/src/invitations.rs +++ b/actors/database-actor/src/invitations.rs @@ -1,16 +1,15 @@ -use { - crate::{ - db_create, db_delete, db_find, db_load, db_pool, db_update, - tokens::CreateBindToken, - users::{LookupUser, Register}, - DbExecutor, DbPooledConn, InvitationError, - }, - actix::{Handler, Message}, - diesel::prelude::*, - jirs_data::{ - EmailString, Invitation, InvitationId, InvitationState, InvitationToken, ProjectId, Token, - User, UserId, UserRole, UsernameString, - }, +use actix::{Handler, Message}; +use diesel::prelude::*; +use jirs_data::{ + EmailString, Invitation, InvitationId, InvitationState, InvitationToken, ProjectId, Token, + User, UserId, UserRole, UsernameString, +}; + +use crate::tokens::CreateBindToken; +use crate::users::{LookupUser, Register}; +use crate::{ + db_create, db_delete, db_find, db_load, db_pool, db_update, DbExecutor, DbPooledConn, + InvitationError, }; db_find! { diff --git a/actors/database-actor/src/issue_assignees.rs b/actors/database-actor/src/issue_assignees.rs index 60048423..2d0cc5bd 100644 --- a/actors/database-actor/src/issue_assignees.rs +++ b/actors/database-actor/src/issue_assignees.rs @@ -1,8 +1,8 @@ -use { - crate::{db_create, db_delete, db_load, db_load_field}, - diesel::{expression::dsl::not, prelude::*}, - jirs_data::{IssueAssignee, IssueId, UserId}, -}; +use diesel::expression::dsl::not; +use diesel::prelude::*; +use jirs_data::{IssueAssignee, IssueId, UserId}; + +use crate::{db_create, db_delete, db_load, db_load_field}; db_create! { AsignMultiple, diff --git a/actors/database-actor/src/issue_statuses.rs b/actors/database-actor/src/issue_statuses.rs index ecf33a8b..60b60fd6 100644 --- a/actors/database-actor/src/issue_statuses.rs +++ b/actors/database-actor/src/issue_statuses.rs @@ -1,8 +1,7 @@ -use { - crate::{db_create, db_delete, db_load, db_update}, - diesel::prelude::*, - jirs_data::{IssueStatus, IssueStatusId, Position, ProjectId, TitleString}, -}; +use diesel::prelude::*; +use jirs_data::{IssueStatus, IssueStatusId, Position, ProjectId, TitleString}; + +use crate::{db_create, db_delete, db_load, db_update}; db_load! { LoadIssueStatuses, diff --git a/actors/database-actor/src/issues.rs b/actors/database-actor/src/issues.rs index b042e377..7b59c647 100644 --- a/actors/database-actor/src/issues.rs +++ b/actors/database-actor/src/issues.rs @@ -1,9 +1,9 @@ -use { - crate::models::Issue, - derive_db_execute::Execute, - diesel::{expression::sql_literal::sql, prelude::*}, - jirs_data::{IssueId, IssuePriority, IssueStatusId, IssueType, ProjectId, UserId}, -}; +use derive_db_execute::Execute; +use diesel::expression::sql_literal::sql; +use diesel::prelude::*; +use jirs_data::{IssueId, IssuePriority, IssueStatusId, IssueType, ProjectId, UserId}; + +use crate::models::Issue; #[derive(Default, Execute)] #[db_exec( @@ -112,12 +112,11 @@ pub struct DeleteIssue { } mod inner { - use { - crate::models::Issue, - derive_db_execute::Execute, - diesel::prelude::*, - jirs_data::{IssuePriority, IssueStatusId, IssueType}, - }; + use derive_db_execute::Execute; + use diesel::prelude::*; + use jirs_data::{IssuePriority, IssueStatusId, IssueType}; + + use crate::models::Issue; #[derive(Default, Execute)] #[db_exec( diff --git a/actors/database-actor/src/lib.rs b/actors/database-actor/src/lib.rs index f3ad7906..9b811151 100644 --- a/actors/database-actor/src/lib.rs +++ b/actors/database-actor/src/lib.rs @@ -3,12 +3,10 @@ #[macro_use] extern crate diesel; +use actix::{Actor, SyncContext}; +use diesel::pg::PgConnection; +use diesel::r2d2::{self, ConnectionManager}; pub use errors::*; -use { - actix::{Actor, SyncContext}, - diesel::pg::PgConnection, - diesel::r2d2::{self, ConnectionManager}, -}; pub mod authorize_user; pub mod comments; @@ -72,7 +70,8 @@ pub struct Guard<'l> { impl<'l> Guard<'l> { pub fn new(conn: &'l DbPooledConn) -> Result { - use diesel::{connection::TransactionManager, prelude::*}; + use diesel::connection::TransactionManager; + use diesel::prelude::*; let tm = conn.transaction_manager(); tm.begin_transaction(conn).map_err(|e| { log::error!("{:?}", e); diff --git a/actors/database-actor/src/messages.rs b/actors/database-actor/src/messages.rs index 222a7772..6ecece3c 100644 --- a/actors/database-actor/src/messages.rs +++ b/actors/database-actor/src/messages.rs @@ -1,11 +1,8 @@ -use { - crate::{ - db_create, db_delete, db_load, - users::{FindUser, LookupUser}, - }, - diesel::prelude::*, - jirs_data::{BindToken, Message, MessageId, MessageType, User, UserId}, -}; +use diesel::prelude::*; +use jirs_data::{BindToken, Message, MessageId, MessageType, User, UserId}; + +use crate::users::{FindUser, LookupUser}; +use crate::{db_create, db_delete, db_load}; db_load! { LoadMessages, diff --git a/actors/database-actor/src/models.rs b/actors/database-actor/src/models.rs index 5c98e02c..18333a17 100644 --- a/actors/database-actor/src/models.rs +++ b/actors/database-actor/src/models.rs @@ -1,13 +1,12 @@ -use { - crate::schema::*, - chrono::NaiveDateTime, - jirs_data::{ - EpicId, InvitationState, IssuePriority, IssueStatusId, IssueType, ProjectCategory, - ProjectId, TimeTracking, UserId, - }, - serde::{Deserialize, Serialize}, - uuid::Uuid, +use chrono::NaiveDateTime; +use jirs_data::{ + EpicId, InvitationState, IssuePriority, IssueStatusId, IssueType, ProjectCategory, ProjectId, + TimeTracking, UserId, }; +use serde::{Deserialize, Serialize}; +use uuid::Uuid; + +use crate::schema::*; #[derive(Serialize, Debug, Deserialize, Queryable)] pub struct Issue { diff --git a/actors/database-actor/src/projects.rs b/actors/database-actor/src/projects.rs index 8c6c617c..0d2aaac1 100644 --- a/actors/database-actor/src/projects.rs +++ b/actors/database-actor/src/projects.rs @@ -1,8 +1,7 @@ -use { - crate::{db_create, db_find, db_load, db_update}, - diesel::prelude::*, - jirs_data::{NameString, Project, ProjectCategory, ProjectId, TimeTracking, UserId}, -}; +use diesel::prelude::*; +use jirs_data::{NameString, Project, ProjectCategory, ProjectId, TimeTracking, UserId}; + +use crate::{db_create, db_find, db_load, db_update}; db_find! { LoadCurrentProject, @@ -12,11 +11,10 @@ db_find! { } mod inner { - use { - crate::db_create, - diesel::prelude::*, - jirs_data::{NameString, Project, ProjectCategory, TimeTracking}, - }; + use diesel::prelude::*; + use jirs_data::{NameString, Project, ProjectCategory, TimeTracking}; + + use crate::db_create; db_create! { CreateProject, diff --git a/actors/database-actor/src/tokens.rs b/actors/database-actor/src/tokens.rs index e4a9d92a..9cda69a4 100644 --- a/actors/database-actor/src/tokens.rs +++ b/actors/database-actor/src/tokens.rs @@ -1,8 +1,7 @@ -use { - crate::{db_create, db_find, db_update}, - diesel::prelude::*, - jirs_data::{Token, UserId}, -}; +use diesel::prelude::*; +use jirs_data::{Token, UserId}; + +use crate::{db_create, db_find, db_update}; db_find! { FindUserId, diff --git a/actors/database-actor/src/user_projects.rs b/actors/database-actor/src/user_projects.rs index d090d1f7..2f5324f7 100644 --- a/actors/database-actor/src/user_projects.rs +++ b/actors/database-actor/src/user_projects.rs @@ -1,8 +1,7 @@ -use { - crate::{db_create, db_delete, db_find, db_load, db_update}, - diesel::prelude::*, - jirs_data::{ProjectId, UserId, UserProject, UserProjectId, UserRole}, -}; +use diesel::prelude::*; +use jirs_data::{ProjectId, UserId, UserProject, UserProjectId, UserRole}; + +use crate::{db_create, db_delete, db_find, db_load, db_update}; db_find! { CurrentUserProject, @@ -27,11 +26,10 @@ db_load! { } mod inner { - use { - crate::db_update, - diesel::prelude::*, - jirs_data::{UserId, UserProject, UserProjectId}, - }; + use diesel::prelude::*; + use jirs_data::{UserId, UserProject, UserProjectId}; + + use crate::db_update; db_update! { ChangeProjectIsCurrent, diff --git a/actors/database-actor/src/users.rs b/actors/database-actor/src/users.rs index 6d59c897..119761dd 100644 --- a/actors/database-actor/src/users.rs +++ b/actors/database-actor/src/users.rs @@ -1,11 +1,9 @@ -use { - crate::{ - db_create, db_find, db_load, db_update, projects::CreateProject, q, - user_projects::CreateUserProject, DbPooledConn, - }, - diesel::prelude::*, - jirs_data::{EmailString, IssueId, ProjectId, User, UserId, UserRole, UsernameString}, -}; +use diesel::prelude::*; +use jirs_data::{EmailString, IssueId, ProjectId, User, UserId, UserRole, UsernameString}; + +use crate::projects::CreateProject; +use crate::user_projects::CreateUserProject; +use crate::{db_create, db_find, db_load, db_update, q, DbPooledConn}; db_find! { FindUser, @@ -156,12 +154,10 @@ db_update! { #[cfg(test)] mod tests { use diesel::connection::TransactionManager; - use jirs_data::{Project, ProjectCategory}; - use crate::build_pool; - use super::*; + use crate::build_pool; #[test] fn check_collision() { diff --git a/actors/filesystem-actor/src/lib.rs b/actors/filesystem-actor/src/lib.rs index 600ad8ad..47c2e657 100644 --- a/actors/filesystem-actor/src/lib.rs +++ b/actors/filesystem-actor/src/lib.rs @@ -1,9 +1,9 @@ -use { - actix::SyncContext, - actix_files::{self, Files}, - jirs_config::fs::Configuration, - std::{io::Write, path::PathBuf}, -}; +use std::io::Write; +use std::path::PathBuf; + +use actix::SyncContext; +use actix_files::{self, Files}; +use jirs_config::fs::Configuration; #[derive(Debug)] pub enum FsError { diff --git a/actors/highlight-actor/src/lib.rs b/actors/highlight-actor/src/lib.rs index 979d4755..393562cb 100644 --- a/actors/highlight-actor/src/lib.rs +++ b/actors/highlight-actor/src/lib.rs @@ -1,14 +1,11 @@ -use { - actix::{Actor, Handler, SyncContext}, - jirs_data::HighlightedCode, - simsearch::SimSearch, - std::sync::Arc, - syntect::{ - easy::HighlightLines, - highlighting::{Style, ThemeSet}, - parsing::SyntaxSet, - }, -}; +use std::sync::Arc; + +use actix::{Actor, Handler, SyncContext}; +use jirs_data::HighlightedCode; +use simsearch::SimSearch; +use syntect::easy::HighlightLines; +use syntect::highlighting::{Style, ThemeSet}; +use syntect::parsing::SyntaxSet; mod load; diff --git a/actors/highlight-actor/src/load.rs b/actors/highlight-actor/src/load.rs index 79c49778..dfdb0b28 100644 --- a/actors/highlight-actor/src/load.rs +++ b/actors/highlight-actor/src/load.rs @@ -1,9 +1,8 @@ -use { - bincode::{deserialize_from, Result}, - flate2::bufread::ZlibDecoder, - serde::de::DeserializeOwned, - std::io::BufRead, -}; +use std::io::BufRead; + +use bincode::{deserialize_from, Result}; +use flate2::bufread::ZlibDecoder; +use serde::de::DeserializeOwned; fn from_reader(input: R) -> Result { let mut decoder = ZlibDecoder::new(input); diff --git a/actors/mail-actor/src/invite.rs b/actors/mail-actor/src/invite.rs index 4ceae388..4fb043ba 100644 --- a/actors/mail-actor/src/invite.rs +++ b/actors/mail-actor/src/invite.rs @@ -1,8 +1,7 @@ -use { - crate::MailExecutor, - actix::{Handler, Message}, - uuid::Uuid, -}; +use actix::{Handler, Message}; +use uuid::Uuid; + +use crate::MailExecutor; #[derive(Debug)] pub struct Invite { diff --git a/actors/mail-actor/src/welcome.rs b/actors/mail-actor/src/welcome.rs index 5eb420f3..4ab8d3a6 100644 --- a/actors/mail-actor/src/welcome.rs +++ b/actors/mail-actor/src/welcome.rs @@ -1,8 +1,7 @@ -use { - crate::MailExecutor, - actix::{Handler, Message}, - uuid::Uuid, -}; +use actix::{Handler, Message}; +use uuid::Uuid; + +use crate::MailExecutor; #[derive(Debug)] pub struct Welcome { diff --git a/actors/web-actor/src/avatar.rs b/actors/web-actor/src/avatar.rs index 1097573a..5a7bdcd1 100644 --- a/actors/web-actor/src/avatar.rs +++ b/actors/web-actor/src/avatar.rs @@ -1,19 +1,21 @@ use std::io::Write; +use actix::Addr; +use actix_multipart::{Field, Multipart}; +use actix_web::http::header::ContentDisposition; +use actix_web::web::Data; +use actix_web::{post, web, Error, HttpResponse}; +use database_actor::authorize_user::AuthorizeUser; +use database_actor::user_projects::CurrentUserProject; +use database_actor::users::UpdateAvatarUrl; +use database_actor::DbExecutor; #[cfg(feature = "local-storage")] use filesystem_actor; -use { - actix::Addr, - actix_multipart::{Field, Multipart}, - actix_web::{http::header::ContentDisposition, post, web, web::Data, Error, HttpResponse}, - database_actor::{ - authorize_user::AuthorizeUser, user_projects::CurrentUserProject, users::UpdateAvatarUrl, - DbExecutor, - }, - futures::{executor::block_on, StreamExt, TryStreamExt}, - jirs_data::{User, UserId, WsMsg}, - websocket_actor::server::{InnerMsg::BroadcastToChannel, WsServer}, -}; +use futures::executor::block_on; +use futures::{StreamExt, TryStreamExt}; +use jirs_data::{User, UserId, WsMsg}; +use websocket_actor::server::InnerMsg::BroadcastToChannel; +use websocket_actor::server::WsServer; #[post("/")] pub async fn upload( diff --git a/actors/web-actor/src/errors.rs b/actors/web-actor/src/errors.rs index 7895b393..abd35b63 100644 --- a/actors/web-actor/src/errors.rs +++ b/actors/web-actor/src/errors.rs @@ -1,6 +1,6 @@ use actix_web::HttpResponse; - -use jirs_data::{msg::WsError, ErrorResponse}; +use jirs_data::msg::WsError; +use jirs_data::ErrorResponse; const TOKEN_NOT_FOUND: &str = "Token not found"; const DATABASE_CONNECTION_FAILED: &str = "Database connection failed"; diff --git a/actors/web-actor/src/handlers/upload_avatar_image.rs b/actors/web-actor/src/handlers/upload_avatar_image.rs index f4a083b2..f83c2217 100644 --- a/actors/web-actor/src/handlers/upload_avatar_image.rs +++ b/actors/web-actor/src/handlers/upload_avatar_image.rs @@ -1,11 +1,11 @@ -use { - actix::Addr, - actix_multipart::Field, - actix_web::{http::header::ContentDisposition, web::Data, Error}, - futures::StreamExt, - jirs_data::UserId, - tokio::sync::broadcast::{Receiver, Sender}, -}; +use actix::Addr; +use actix_multipart::Field; +use actix_web::http::header::ContentDisposition; +use actix_web::web::Data; +use actix_web::Error; +use futures::StreamExt; +use jirs_data::UserId; +use tokio::sync::broadcast::{Receiver, Sender}; #[cfg(all(feature = "local-storage", feature = "aws-s3"))] pub(crate) async fn handle_image( diff --git a/actors/web-actor/src/lib.rs b/actors/web-actor/src/lib.rs index cc3675fd..e954ea1e 100644 --- a/actors/web-actor/src/lib.rs +++ b/actors/web-actor/src/lib.rs @@ -1,14 +1,15 @@ #[macro_use] extern crate log; +use actix::Addr; +use actix_web::web::Data; +use actix_web::{HttpRequest, HttpResponse}; +use database_actor::authorize_user::AuthorizeUser; +use database_actor::DbExecutor; pub use errors::*; -use { - crate::middleware::authorize::token_from_headers, - actix::Addr, - actix_web::{web::Data, HttpRequest, HttpResponse}, - database_actor::{authorize_user::AuthorizeUser, DbExecutor}, - jirs_data::User, -}; +use jirs_data::User; + +use crate::middleware::authorize::token_from_headers; pub mod avatar; pub mod errors; diff --git a/actors/web-actor/src/middleware/authorize.rs b/actors/web-actor/src/middleware/authorize.rs index 0fb49ff4..7199df26 100644 --- a/actors/web-actor/src/middleware/authorize.rs +++ b/actors/web-actor/src/middleware/authorize.rs @@ -1,15 +1,12 @@ -use { - actix_service::{Service, Transform}, - actix_web::{ - dev::{ServiceRequest, ServiceResponse}, - http::header::{self}, - http::HeaderMap, - Error, - }, - futures::future::{ok, FutureExt, LocalBoxFuture, Ready}, - jirs_data::User, - std::task::{Context, Poll}, -}; +use std::task::{Context, Poll}; + +use actix_service::{Service, Transform}; +use actix_web::dev::{ServiceRequest, ServiceResponse}; +use actix_web::http::header::{self}; +use actix_web::http::HeaderMap; +use actix_web::Error; +use futures::future::{ok, FutureExt, LocalBoxFuture, Ready}; +use jirs_data::User; type Db = actix_web::web::Data; diff --git a/actors/websocket-actor/src/handlers/auth.rs b/actors/websocket-actor/src/handlers/auth.rs index 5daf138e..8c3aa658 100644 --- a/actors/websocket-actor/src/handlers/auth.rs +++ b/actors/websocket-actor/src/handlers/auth.rs @@ -1,16 +1,13 @@ -use { - crate::{ - db_or_debug_and_return, mail_or_debug_and_return, WebSocketActor, WsHandler, WsResult, - }, - actix::AsyncContext, - database_actor::{ - authorize_user::AuthorizeUser, - tokens::{CreateBindToken, FindBindToken}, - users::LookupUser, - }, - futures::executor::block_on, - jirs_data::{Token, WsMsg}, - mail_actor::welcome::Welcome, +use actix::AsyncContext; +use database_actor::authorize_user::AuthorizeUser; +use database_actor::tokens::{CreateBindToken, FindBindToken}; +use database_actor::users::LookupUser; +use futures::executor::block_on; +use jirs_data::{Token, WsMsg}; +use mail_actor::welcome::Welcome; + +use crate::{ + db_or_debug_and_return, mail_or_debug_and_return, WebSocketActor, WsHandler, WsResult, }; pub struct Authenticate { diff --git a/actors/websocket-actor/src/handlers/comments.rs b/actors/websocket-actor/src/handlers/comments.rs index 5a6cded5..5d05d87f 100644 --- a/actors/websocket-actor/src/handlers/comments.rs +++ b/actors/websocket-actor/src/handlers/comments.rs @@ -1,8 +1,7 @@ -use { - crate::{db_or_debug_and_return, WebSocketActor, WsHandler, WsResult}, - futures::executor::block_on, - jirs_data::{CommentId, CreateCommentPayload, IssueId, UpdateCommentPayload, WsMsg}, -}; +use futures::executor::block_on; +use jirs_data::{CommentId, CreateCommentPayload, IssueId, UpdateCommentPayload, WsMsg}; + +use crate::{db_or_debug_and_return, WebSocketActor, WsHandler, WsResult}; pub struct LoadIssueComments { pub issue_id: IssueId, diff --git a/actors/websocket-actor/src/handlers/epics.rs b/actors/websocket-actor/src/handlers/epics.rs index 69bb16d0..57f45fc0 100644 --- a/actors/websocket-actor/src/handlers/epics.rs +++ b/actors/websocket-actor/src/handlers/epics.rs @@ -1,9 +1,7 @@ -use jirs_data::IssueType; -use { - crate::{db_or_debug_and_return, WebSocketActor, WsHandler, WsResult}, - futures::executor::block_on, - jirs_data::{DescriptionString, EpicId, NameString, UserProject, WsMsg}, -}; +use futures::executor::block_on; +use jirs_data::{DescriptionString, EpicId, IssueType, NameString, UserProject, WsMsg}; + +use crate::{db_or_debug_and_return, WebSocketActor, WsHandler, WsResult}; pub struct LoadEpics; @@ -60,7 +58,7 @@ impl WsHandler for WebSocketActor { self, database_actor::epics::UpdateEpic { project_id: *project_id, - epic_id: epic_id, + epic_id, name: name.clone(), } ); @@ -80,7 +78,7 @@ impl WsHandler for WebSocketActor { self, database_actor::epics::DeleteEpic { user_id: *user_id, - epic_id: epic_id, + epic_id, } ); Ok(Some(WsMsg::EpicDeleted(epic_id, n))) diff --git a/actors/websocket-actor/src/handlers/hi.rs b/actors/websocket-actor/src/handlers/hi.rs index 1141cabe..ddd9c5ba 100644 --- a/actors/websocket-actor/src/handlers/hi.rs +++ b/actors/websocket-actor/src/handlers/hi.rs @@ -1,8 +1,7 @@ -use { - crate::{actor_or_debug_and_return, WebSocketActor, WsHandler, WsResult}, - futures::executor::block_on, - jirs_data::{Code, Lang, WsMsg}, -}; +use futures::executor::block_on; +use jirs_data::{Code, Lang, WsMsg}; + +use crate::{actor_or_debug_and_return, WebSocketActor, WsHandler, WsResult}; pub struct HighlightCode(pub Lang, pub Code); diff --git a/actors/websocket-actor/src/handlers/invitations.rs b/actors/websocket-actor/src/handlers/invitations.rs index 25878dd9..b5658bd8 100644 --- a/actors/websocket-actor/src/handlers/invitations.rs +++ b/actors/websocket-actor/src/handlers/invitations.rs @@ -1,13 +1,14 @@ -use { - crate::{ - db_or_debug_and_return, mail_or_debug_and_return, server::InnerMsg, WebSocketActor, - WsHandler, WsMessageSender, WsResult, - }, - database_actor::{invitations, messages::CreateMessageReceiver}, - futures::executor::block_on, - jirs_data::{ - EmailString, InvitationId, InvitationToken, MessageType, UserRole, UsernameString, WsMsg, - }, +use database_actor::invitations; +use database_actor::messages::CreateMessageReceiver; +use futures::executor::block_on; +use jirs_data::{ + EmailString, InvitationId, InvitationToken, MessageType, UserRole, UsernameString, WsMsg, +}; + +use crate::server::InnerMsg; +use crate::{ + db_or_debug_and_return, mail_or_debug_and_return, WebSocketActor, WsHandler, WsMessageSender, + WsResult, }; pub struct ListInvitation; diff --git a/actors/websocket-actor/src/handlers/issue_statuses.rs b/actors/websocket-actor/src/handlers/issue_statuses.rs index c3301ef3..deeadd10 100644 --- a/actors/websocket-actor/src/handlers/issue_statuses.rs +++ b/actors/websocket-actor/src/handlers/issue_statuses.rs @@ -1,9 +1,8 @@ -use { - crate::{db_or_debug_and_return, WebSocketActor, WsHandler, WsResult}, - database_actor::issue_statuses, - futures::executor::block_on, - jirs_data::{IssueStatusId, Position, TitleString, WsMsg}, -}; +use database_actor::issue_statuses; +use futures::executor::block_on; +use jirs_data::{IssueStatusId, Position, TitleString, WsMsg}; + +use crate::{db_or_debug_and_return, WebSocketActor, WsHandler, WsResult}; pub struct LoadIssueStatuses; diff --git a/actors/websocket-actor/src/handlers/issues.rs b/actors/websocket-actor/src/handlers/issues.rs index c316f2f0..c7baa685 100644 --- a/actors/websocket-actor/src/handlers/issues.rs +++ b/actors/websocket-actor/src/handlers/issues.rs @@ -1,17 +1,15 @@ -use { - crate::{db_or_debug_and_return, WebSocketActor, WsHandler, WsResult}, - database_actor::{ - issue_assignees::LoadAssignees, - issues::{LoadProjectIssues, UpdateIssue}, - }, - futures::executor::block_on, - jirs_data::{ - CreateIssuePayload, IssueAssignee, IssueFieldId, IssueId, IssueStatusId, ListPosition, - PayloadVariant, WsMsg, - }, - std::collections::HashMap, +use std::collections::HashMap; + +use database_actor::issue_assignees::LoadAssignees; +use database_actor::issues::{LoadProjectIssues, UpdateIssue}; +use futures::executor::block_on; +use jirs_data::{ + CreateIssuePayload, IssueAssignee, IssueFieldId, IssueId, IssueStatusId, ListPosition, + PayloadVariant, WsMsg, }; +use crate::{db_or_debug_and_return, WebSocketActor, WsHandler, WsResult}; + pub struct UpdateIssueHandler { pub id: i32, pub field_id: IssueFieldId, diff --git a/actors/websocket-actor/src/handlers/messages.rs b/actors/websocket-actor/src/handlers/messages.rs index 88b60c40..c8e8fb4a 100644 --- a/actors/websocket-actor/src/handlers/messages.rs +++ b/actors/websocket-actor/src/handlers/messages.rs @@ -1,9 +1,8 @@ -use { - crate::{db_or_debug_and_return, WebSocketActor, WsHandler, WsResult}, - database_actor::messages, - futures::executor::block_on, - jirs_data::{MessageId, WsMsg}, -}; +use database_actor::messages; +use futures::executor::block_on; +use jirs_data::{MessageId, WsMsg}; + +use crate::{db_or_debug_and_return, WebSocketActor, WsHandler, WsResult}; pub struct LoadMessages; diff --git a/actors/websocket-actor/src/handlers/mod.rs b/actors/websocket-actor/src/handlers/mod.rs index b5737e27..a433cb9f 100644 --- a/actors/websocket-actor/src/handlers/mod.rs +++ b/actors/websocket-actor/src/handlers/mod.rs @@ -1,7 +1,14 @@ -pub use { - auth::*, comments::*, epics::*, hi::*, invitations::*, issue_statuses::*, issues::*, - messages::*, projects::*, user_projects::*, users::*, -}; +pub use auth::*; +pub use comments::*; +pub use epics::*; +pub use hi::*; +pub use invitations::*; +pub use issue_statuses::*; +pub use issues::*; +pub use messages::*; +pub use projects::*; +pub use user_projects::*; +pub use users::*; pub mod auth; pub mod comments; diff --git a/actors/websocket-actor/src/handlers/projects.rs b/actors/websocket-actor/src/handlers/projects.rs index cec503e4..b0c778f7 100644 --- a/actors/websocket-actor/src/handlers/projects.rs +++ b/actors/websocket-actor/src/handlers/projects.rs @@ -1,9 +1,8 @@ -use { - crate::{db_or_debug_and_return, WebSocketActor, WsHandler, WsResult}, - database_actor as db, - futures::executor::block_on, - jirs_data::{UpdateProjectPayload, UserProject, WsMsg}, -}; +use database_actor as db; +use futures::executor::block_on; +use jirs_data::{UpdateProjectPayload, UserProject, WsMsg}; + +use crate::{db_or_debug_and_return, WebSocketActor, WsHandler, WsResult}; impl WsHandler for WebSocketActor { fn handle_msg(&mut self, msg: UpdateProjectPayload, _ctx: &mut Self::Context) -> WsResult { diff --git a/actors/websocket-actor/src/handlers/user_projects.rs b/actors/websocket-actor/src/handlers/user_projects.rs index ce149f79..3edda485 100644 --- a/actors/websocket-actor/src/handlers/user_projects.rs +++ b/actors/websocket-actor/src/handlers/user_projects.rs @@ -1,9 +1,8 @@ -use { - crate::{db_or_debug_and_return, WebSocketActor, WsHandler, WsResult}, - database_actor as db, - futures::executor::block_on, - jirs_data::{UserProjectId, WsMsg}, -}; +use database_actor as db; +use futures::executor::block_on; +use jirs_data::{UserProjectId, WsMsg}; + +use crate::{db_or_debug_and_return, WebSocketActor, WsHandler, WsResult}; pub struct LoadUserProjects; diff --git a/actors/websocket-actor/src/handlers/users.rs b/actors/websocket-actor/src/handlers/users.rs index 0ad7947d..54467797 100644 --- a/actors/websocket-actor/src/handlers/users.rs +++ b/actors/websocket-actor/src/handlers/users.rs @@ -1,11 +1,10 @@ -use { - crate::{ - db_or_debug_and_return, handlers::auth::Authenticate, WebSocketActor, WsHandler, WsResult, - }, - database_actor::{self, users::Register as DbRegister}, - futures::executor::block_on, - jirs_data::{UserId, UserProject, UserRole, WsMsg}, -}; +use database_actor::users::Register as DbRegister; +use database_actor::{self}; +use futures::executor::block_on; +use jirs_data::{UserId, UserProject, UserRole, WsMsg}; + +use crate::handlers::auth::Authenticate; +use crate::{db_or_debug_and_return, WebSocketActor, WsHandler, WsResult}; pub struct LoadProjectUsers; diff --git a/actors/websocket-actor/src/lib.rs b/actors/websocket-actor/src/lib.rs index 27edf2e6..587cf17c 100644 --- a/actors/websocket-actor/src/lib.rs +++ b/actors/websocket-actor/src/lib.rs @@ -1,24 +1,20 @@ #[macro_use] extern crate log; -use { - crate::{ - handlers::*, - server::{InnerMsg, WsServer}, - }, - actix::{Actor, ActorContext, Addr, AsyncContext, Handler, Recipient, StreamHandler}, - actix_web::{ - get, - web::{self, Data}, - Error, HttpRequest, HttpResponse, - }, - actix_web_actors::ws, - database_actor::{projects::LoadCurrentProject, user_projects::CurrentUserProject, DbExecutor}, - futures::executor::block_on, - jirs_data::{Project, User, UserProject, WsMsg}, - log::*, - mail_actor::MailExecutor, -}; +use actix::{Actor, ActorContext, Addr, AsyncContext, Handler, Recipient, StreamHandler}; +use actix_web::web::{self, Data}; +use actix_web::{get, Error, HttpRequest, HttpResponse}; +use actix_web_actors::ws; +use database_actor::projects::LoadCurrentProject; +use database_actor::user_projects::CurrentUserProject; +use database_actor::DbExecutor; +use futures::executor::block_on; +use jirs_data::{Project, User, UserProject, WsMsg}; +use log::*; +use mail_actor::MailExecutor; + +use crate::handlers::*; +use crate::server::{InnerMsg, WsServer}; pub mod handlers; pub mod prelude; diff --git a/actors/websocket-actor/src/server/mod.rs b/actors/websocket-actor/src/server/mod.rs index 36276258..b9f58fbd 100644 --- a/actors/websocket-actor/src/server/mod.rs +++ b/actors/websocket-actor/src/server/mod.rs @@ -1,8 +1,7 @@ -use { - actix::{Actor, Context, Recipient}, - jirs_data::{ProjectId, UserId, WsMsg}, - std::collections::HashMap, -}; +use std::collections::HashMap; + +use actix::{Actor, Context, Recipient}; +use jirs_data::{ProjectId, UserId, WsMsg}; #[derive(actix::Message, Debug)] #[rtype(result = "()")] diff --git a/derive/derive_db_execute/src/lib.rs b/derive/derive_db_execute/src/lib.rs index 117bb47f..d60692dc 100644 --- a/derive/derive_db_execute/src/lib.rs +++ b/derive/derive_db_execute/src/lib.rs @@ -3,11 +3,12 @@ mod utils; extern crate proc_macro; -use { - crate::parse_attr::Attributes, - proc_macro::{token_stream::IntoIter, TokenStream, TokenTree}, - std::iter::Peekable, -}; +use std::iter::Peekable; + +use proc_macro::token_stream::IntoIter; +use proc_macro::{TokenStream, TokenTree}; + +use crate::parse_attr::Attributes; fn parse_meta(mut it: Peekable) -> (Peekable, Option) { let mut attrs: Option = None; @@ -70,7 +71,6 @@ fn parse_meta(mut it: Peekable) -> (Peekable, Option TokenStream { let mut it = item.into_iter().peekable(); diff --git a/derive/derive_db_execute/src/parse_attr.rs b/derive/derive_db_execute/src/parse_attr.rs index f5ec5fce..de5f4b24 100644 --- a/derive/derive_db_execute/src/parse_attr.rs +++ b/derive/derive_db_execute/src/parse_attr.rs @@ -1,6 +1,8 @@ -use proc_macro::{token_stream::IntoIter, TokenTree}; use std::iter::Peekable; +use proc_macro::token_stream::IntoIter; +use proc_macro::TokenTree; + #[derive(Default, Debug)] pub struct Attributes { pub result: Option, diff --git a/derive/derive_db_execute/src/utils.rs b/derive/derive_db_execute/src/utils.rs index a8434674..7643a4bf 100644 --- a/derive/derive_db_execute/src/utils.rs +++ b/derive/derive_db_execute/src/utils.rs @@ -1,6 +1,8 @@ -use proc_macro::{token_stream::IntoIter, TokenTree}; use std::iter::Peekable; +use proc_macro::token_stream::IntoIter; +use proc_macro::TokenTree; + pub fn skip_pub(mut it: Peekable) -> Peekable { if let Some(TokenTree::Ident(ident)) = it.next() { if ident.to_string().as_str() != "pub" { diff --git a/derive/derive_enum_iter/src/lib.rs b/derive/derive_enum_iter/src/lib.rs index 8bb1270b..80e8d148 100644 --- a/derive/derive_enum_iter/src/lib.rs +++ b/derive/derive_enum_iter/src/lib.rs @@ -1,9 +1,9 @@ extern crate proc_macro; -use { - proc_macro::{token_stream::IntoIter, TokenStream, TokenTree}, - std::iter::Peekable, -}; +use std::iter::Peekable; + +use proc_macro::token_stream::IntoIter; +use proc_macro::{TokenStream, TokenTree}; fn skip_meta(mut it: Peekable) -> Peekable { while let Some(token) = it.peek() { diff --git a/jirs-cli/src/main.rs b/jirs-cli/src/main.rs index 31135814..4dbc4358 100644 --- a/jirs-cli/src/main.rs +++ b/jirs-cli/src/main.rs @@ -1,22 +1,18 @@ -use { - std::{ - error::Error, - io, - sync::{ - atomic::{AtomicBool, Ordering}, - mpsc, Arc, - }, - time::Duration, - }, - termion::{event::Key, input::MouseTerminal, raw::IntoRawMode, screen::AlternateScreen}, - tui::{ - backend::TermionBackend, - layout::{Constraint, Direction, Layout}, - style::{Color, Style}, - widgets::{Block, Borders, Tabs}, - Terminal, - }, -}; +use std::error::Error; +use std::io; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::{mpsc, Arc}; +use std::time::Duration; + +use termion::event::Key; +use termion::input::MouseTerminal; +use termion::raw::IntoRawMode; +use termion::screen::AlternateScreen; +use tui::backend::TermionBackend; +use tui::layout::{Constraint, Direction, Layout}; +use tui::style::{Color, Style}; +use tui::widgets::{Block, Borders, Tabs}; +use tui::Terminal; #[derive(Debug, Clone, Copy)] pub struct Config { @@ -68,8 +64,8 @@ impl Events { // eprintln!("{}", err); // return; // } - // if !ignore_exit_key.load(Ordering::Relaxed) && key == config.exit_key { - // return; + // if !ignore_exit_key.load(Ordering::Relaxed) && key == + // config.exit_key { return; // } // } // } @@ -84,8 +80,8 @@ impl Events { Events { rx, ignore_exit_key, - // input_handle, - // tick_handle, + /* input_handle, + * tick_handle, */ } } diff --git a/jirs-client/src/changes.rs b/jirs-client/src/changes.rs index 6678e109..d246fdcf 100644 --- a/jirs-client/src/changes.rs +++ b/jirs-client/src/changes.rs @@ -1,8 +1,8 @@ -use { - crate::{components::styled_editor::Mode as TabMode, FieldId}, - jirs_data::{EpicId, IssueStatusId, WsMsg}, - seed::prelude::WebSocketMessage, -}; +use jirs_data::{EpicId, IssueStatusId, WsMsg}; +use seed::prelude::WebSocketMessage; + +use crate::components::styled_editor::Mode as TabMode; +use crate::FieldId; #[derive(Clone, Debug, PartialEq)] pub enum FieldChange { diff --git a/jirs-client/src/components/styled_avatar.rs b/jirs-client/src/components/styled_avatar.rs index 3a45d3c1..b4840d98 100644 --- a/jirs-client/src/components/styled_avatar.rs +++ b/jirs-client/src/components/styled_avatar.rs @@ -1,7 +1,8 @@ -use { - crate::{shared::ToNode, Msg}, - seed::{prelude::*, *}, -}; +use seed::prelude::*; +use seed::*; + +use crate::shared::ToNode; +use crate::Msg; #[derive(Debug)] pub struct StyledAvatar<'l> { diff --git a/jirs-client/src/components/styled_button.rs b/jirs-client/src/components/styled_button.rs index 18b0f965..47904261 100644 --- a/jirs-client/src/components/styled_button.rs +++ b/jirs-client/src/components/styled_button.rs @@ -1,7 +1,8 @@ -use { - crate::{shared::ToNode, ButtonId, Msg}, - seed::{prelude::*, *}, -}; +use seed::prelude::*; +use seed::*; + +use crate::shared::ToNode; +use crate::{ButtonId, Msg}; #[allow(dead_code)] pub enum ButtonVariant { diff --git a/jirs-client/src/components/styled_checkbox.rs b/jirs-client/src/components/styled_checkbox.rs index 801c7f8e..1560e040 100644 --- a/jirs-client/src/components/styled_checkbox.rs +++ b/jirs-client/src/components/styled_checkbox.rs @@ -1,11 +1,8 @@ -use { - crate::{ - shared::{IntoChild, ToNode}, - FieldId, Msg, - }, - jirs_data::TimeTracking, - seed::{prelude::*, *}, -}; +use seed::prelude::*; +use seed::*; + +use crate::shared::ToNode; +use crate::{FieldId, Msg}; #[derive(Debug)] pub struct StyledCheckboxState { @@ -30,12 +27,12 @@ impl StyledCheckboxState { #[derive(Debug)] pub struct ChildBuilder<'l> { - field_id: Option, - name: &'l str, - label: &'l str, - value: u32, - selected: bool, - class_list: Vec, + pub field_id: Option, + pub name: &'l str, + pub label: &'l str, + pub value: u32, + pub selected: bool, + pub class_list: &'l str, } impl<'l> Default for ChildBuilder<'l> { @@ -46,7 +43,7 @@ impl<'l> Default for ChildBuilder<'l> { label: "", value: 0, selected: false, - class_list: vec![], + class_list: "", } } } @@ -77,11 +74,8 @@ impl<'l> ChildBuilder<'l> { self } - pub fn add_class(mut self, name: S) -> Self - where - S: Into, - { - self.class_list.push(name.into()); + pub fn class_list(mut self, name: &'l str) -> Self { + self.class_list = name; self } } @@ -94,7 +88,7 @@ impl<'l> ToNode for ChildBuilder<'l> { label, value, selected, - mut class_list, + class_list, } = self; let id = field_id.as_ref().map(|f| f.to_string()).unwrap_or_default(); @@ -103,9 +97,6 @@ impl<'l> ToNode for ChildBuilder<'l> { field_id_clone.map(|field_id| Msg::U32InputChanged(field_id, value)) }); - class_list.push("styledCheckboxChild".to_string()); - class_list.push(if selected { "selected" } else { "" }.to_string()); - let input_attrs = if selected { attrs![At::Type => "radio", At::Name => name, At::Checked => selected, At::Id => format!("{}-{}", id, name)] } else { @@ -113,7 +104,11 @@ impl<'l> ToNode for ChildBuilder<'l> { }; div![ - attrs![At::Class => class_list.join(" ")], + C![ + "styledCheckboxChild", + class_list, + IF![selected => "selected"] + ], handler, label![attrs![At::For => format!("{}-{}", id, name)], label], input![input_attrs], @@ -216,27 +211,3 @@ where opt, ] } - -impl<'l> IntoChild<'l> for TimeTracking { - type Builder = ChildBuilder<'l>; - - fn into_child(self) -> Self::Builder { - Self::Builder::default() - .label(match self { - TimeTracking::Untracked => "No tracking", - TimeTracking::Fibonacci => "Fibonacci (Bad mode)", - TimeTracking::Hourly => "Evil Mode (Hourly)", - }) - .name(match self { - TimeTracking::Untracked => "untracked", - TimeTracking::Fibonacci => "fibonacci", - TimeTracking::Hourly => "hourly", - }) - .add_class(match self { - TimeTracking::Untracked => "untracked", - TimeTracking::Fibonacci => "fibonacci", - TimeTracking::Hourly => "hourly", - }) - .value((self).into()) - } -} diff --git a/jirs-client/src/components/styled_confirm_modal.rs b/jirs-client/src/components/styled_confirm_modal.rs index 122d1db8..157fe931 100644 --- a/jirs-client/src/components/styled_confirm_modal.rs +++ b/jirs-client/src/components/styled_confirm_modal.rs @@ -1,13 +1,10 @@ -use { - crate::{ - components::{styled_button::StyledButton, styled_modal::StyledModal}, - shared::ToNode, - Msg, - }, - seed::{prelude::*, EventHandler, *}, -}; +use seed::prelude::*; +use seed::{EventHandler, *}; -use crate::components::styled_button::ButtonVariant; +use crate::components::styled_button::{ButtonVariant, StyledButton}; +use crate::components::styled_modal::StyledModal; +use crate::shared::ToNode; +use crate::Msg; const TITLE: &str = "Warning"; const MESSAGE: &str = "Are you sure you want to continue with this action?"; diff --git a/jirs-client/src/components/styled_date_time_input.rs b/jirs-client/src/components/styled_date_time_input.rs index 33584746..d6eda7e6 100644 --- a/jirs-client/src/components/styled_date_time_input.rs +++ b/jirs-client/src/components/styled_date_time_input.rs @@ -1,19 +1,15 @@ -use { - crate::{ - components::{ - styled_button::StyledButton, styled_icon::Icon, styled_tooltip::StyledTooltip, - }, - shared::ToNode, - FieldId, Msg, - }, - chrono::prelude::*, - chrono::Duration, - seed::{prelude::*, *}, - std::ops::RangeInclusive, -}; +use std::ops::RangeInclusive; -use crate::components::styled_button::ButtonVariant; -use crate::components::styled_tooltip::TooltipVariant; +use chrono::prelude::*; +use chrono::Duration; +use seed::prelude::*; +use seed::*; + +use crate::components::styled_button::{ButtonVariant, StyledButton}; +use crate::components::styled_icon::Icon; +use crate::components::styled_tooltip::{StyledTooltip, TooltipVariant}; +use crate::shared::ToNode; +use crate::{FieldId, Msg}; #[derive(Debug)] pub enum StyledDateTimeChanged { diff --git a/jirs-client/src/components/styled_editor.rs b/jirs-client/src/components/styled_editor.rs index 268b8c9f..3be6acaa 100644 --- a/jirs-client/src/components/styled_editor.rs +++ b/jirs-client/src/components/styled_editor.rs @@ -1,9 +1,9 @@ -use { - crate::{ - components::styled_textarea::StyledTextarea, shared::ToNode, FieldChange, FieldId, Msg, - }, - seed::{prelude::*, *}, -}; +use seed::prelude::*; +use seed::*; + +use crate::components::styled_textarea::StyledTextarea; +use crate::shared::ToNode; +use crate::{FieldChange, FieldId, Msg}; #[derive(Debug, Clone, PartialOrd, PartialEq, Hash)] pub enum Mode { diff --git a/jirs-client/src/components/styled_field.rs b/jirs-client/src/components/styled_field.rs index 3a22dd27..9935749e 100644 --- a/jirs-client/src/components/styled_field.rs +++ b/jirs-client/src/components/styled_field.rs @@ -1,7 +1,8 @@ -use { - crate::{shared::ToNode, Msg}, - seed::{prelude::*, *}, -}; +use seed::prelude::*; +use seed::*; + +use crate::shared::ToNode; +use crate::Msg; #[derive(Debug)] pub struct StyledField<'l> { @@ -22,57 +23,12 @@ impl<'l> Default for StyledField<'l> { } } -impl<'l> StyledField<'l> { - pub fn build() -> StyledFieldBuilder<'l> { - StyledFieldBuilder::default() - } -} - impl<'l> ToNode for StyledField<'l> { fn into_node(self) -> Node { render(self) } } -#[derive(Default, Debug)] -pub struct StyledFieldBuilder<'l> { - label: Option<&'l str>, - tip: Option<&'l str>, - input: Option>, - class_list: &'l str, -} - -impl<'l> StyledFieldBuilder<'l> { - pub fn label(mut self, label: &'l str) -> Self { - self.label = Some(label); - self - } - - pub fn tip(mut self, tip: &'l str) -> Self { - self.tip = Some(tip); - self - } - - pub fn input(mut self, input: Node) -> Self { - self.input = Some(input); - self - } - - pub fn class_list(mut self, name: &'l str) -> Self { - self.class_list = name; - self - } - - pub fn build(self) -> StyledField<'l> { - StyledField { - label: self.label.unwrap_or_default(), - tip: self.tip, - input: self.input.unwrap_or(empty![]), - class_list: self.class_list, - } - } -} - pub fn render(values: StyledField) -> Node { let StyledField { label, diff --git a/jirs-client/src/components/styled_form.rs b/jirs-client/src/components/styled_form.rs index fd367b00..1f99e507 100644 --- a/jirs-client/src/components/styled_form.rs +++ b/jirs-client/src/components/styled_form.rs @@ -1,7 +1,8 @@ -use { - crate::{shared::ToNode, Msg}, - seed::{prelude::*, *}, -}; +use seed::prelude::*; +use seed::*; + +use crate::shared::ToNode; +use crate::Msg; #[derive(Debug, Clone)] pub struct StyledForm<'l> { diff --git a/jirs-client/src/components/styled_icon.rs b/jirs-client/src/components/styled_icon.rs index f54d2459..59b1377a 100644 --- a/jirs-client/src/components/styled_icon.rs +++ b/jirs-client/src/components/styled_icon.rs @@ -1,9 +1,11 @@ -use { - crate::{shared::ToNode, Msg}, - jirs_data::{IssuePriority, IssueType}, - seed::{prelude::*, *}, - std::borrow::Cow, -}; +use std::borrow::Cow; + +use jirs_data::{IssuePriority, IssueType}; +use seed::prelude::*; +use seed::*; + +use crate::shared::ToNode; +use crate::Msg; #[allow(dead_code)] #[derive(Copy, Clone, Debug)] @@ -245,37 +247,6 @@ impl ToNode for Icon { } } -pub struct StyledIconBuilder<'l> { - pub icon: Icon, - pub size: Option, - pub class_list: &'l str, - pub style_list: Vec>, - pub color: Option>, - pub on_click: Option>, -} - -impl<'l> StyledIconBuilder<'l> { - pub fn size(mut self, size: i32) -> Self { - self.size = Some(size); - self - } - - pub fn class_list(mut self, name: &'l str) -> Self { - self.class_list = name; - self - } - - pub fn with_color(mut self, color: &'l str) -> Self { - self.color = Some(Cow::Borrowed(color)); - self - } - - pub fn on_click(mut self, on_click: EventHandler) -> Self { - self.on_click = Some(on_click); - self - } -} - pub struct StyledIcon<'l> { pub icon: Icon, pub size: Option, diff --git a/jirs-client/src/components/styled_image_input.rs b/jirs-client/src/components/styled_image_input.rs index be114ef7..1973e16b 100644 --- a/jirs-client/src/components/styled_image_input.rs +++ b/jirs-client/src/components/styled_image_input.rs @@ -1,8 +1,9 @@ -use { - crate::{shared::ToNode, FieldId, Msg}, - seed::{prelude::*, *}, - web_sys::File, -}; +use seed::prelude::*; +use seed::*; +use web_sys::File; + +use crate::shared::ToNode; +use crate::{FieldId, Msg}; #[derive(Debug, Clone)] pub struct StyledImageInputState { diff --git a/jirs-client/src/components/styled_input.rs b/jirs-client/src/components/styled_input.rs index 8083beb4..27323e3b 100644 --- a/jirs-client/src/components/styled_input.rs +++ b/jirs-client/src/components/styled_input.rs @@ -1,11 +1,9 @@ -use { - crate::{ - components::styled_icon::{Icon, StyledIcon}, - shared::ToNode, - FieldId, Msg, - }, - seed::{prelude::*, *}, -}; +use seed::prelude::*; +use seed::*; + +use crate::components::styled_icon::{Icon, StyledIcon}; +use crate::shared::ToNode; +use crate::{FieldId, Msg}; #[derive(Clone, Debug, PartialOrd, PartialEq)] pub enum InputVariant { diff --git a/jirs-client/src/components/styled_link.rs b/jirs-client/src/components/styled_link.rs index fd061255..c083d682 100644 --- a/jirs-client/src/components/styled_link.rs +++ b/jirs-client/src/components/styled_link.rs @@ -1,8 +1,10 @@ -use { - crate::{shared::ToNode, Msg}, - seed::{prelude::*, *}, - std::str::FromStr, -}; +use std::str::FromStr; + +use seed::prelude::*; +use seed::*; + +use crate::shared::ToNode; +use crate::Msg; pub struct StyledLink<'l> { pub children: Vec>, @@ -10,48 +12,6 @@ pub struct StyledLink<'l> { pub href: &'l str, } -impl<'l> StyledLink<'l> { - // pub fn build() -> StyledLinkBuilder<'l> { - // StyledLinkBuilder::default() - // } -} - -#[derive(Default)] -pub struct StyledLinkBuilder<'l> { - children: Vec>, - class_list: &'l str, - href: &'l str, -} - -impl<'l> StyledLinkBuilder<'l> { - pub fn add_child(mut self, child: Node) -> Self { - self.children.push(child); - self - } - - pub fn class_list(mut self, name: &'l str) -> Self { - self.class_list = name; - self - } - - pub fn href(mut self, href: &'l str) -> Self { - self.href = href; - self - } - - pub fn text(self, s: &'l str) -> Self { - self.add_child(span![s]) - } - - pub fn build(self) -> StyledLink<'l> { - StyledLink { - children: self.children, - class_list: self.class_list, - href: self.href, - } - } -} - impl<'l> ToNode for StyledLink<'l> { fn into_node(self) -> Node { render(self) diff --git a/jirs-client/src/components/styled_modal.rs b/jirs-client/src/components/styled_modal.rs index f28d93e2..ae338fa5 100644 --- a/jirs-client/src/components/styled_modal.rs +++ b/jirs-client/src/components/styled_modal.rs @@ -1,11 +1,9 @@ -use { - crate::{ - components::styled_icon::{Icon, StyledIcon}, - shared::ToNode, - Msg, - }, - seed::{prelude::*, *}, -}; +use seed::prelude::*; +use seed::*; + +use crate::components::styled_icon::{Icon, StyledIcon}; +use crate::shared::ToNode; +use crate::Msg; #[allow(dead_code)] #[derive(Debug, Copy, Clone, PartialOrd, PartialEq)] diff --git a/jirs-client/src/components/styled_select.rs b/jirs-client/src/components/styled_select.rs index 0d17f31a..23957fbc 100644 --- a/jirs-client/src/components/styled_select.rs +++ b/jirs-client/src/components/styled_select.rs @@ -1,14 +1,12 @@ -use { - crate::{ - components::{ - styled_icon::{Icon, StyledIcon}, - styled_select_child::*, - }, - shared::ToNode, - FieldId, Msg, - }, - seed::{prelude::*, *}, -}; +use std::collections::HashMap; + +use seed::prelude::*; +use seed::*; + +use crate::components::styled_icon::{Icon, StyledIcon}; +use crate::components::styled_select_child::*; +use crate::shared::ToNode; +use crate::{FieldId, Msg}; #[derive(Clone, Debug, PartialEq)] pub enum StyledSelectChanged { @@ -71,7 +69,7 @@ impl StyledSelectState { } } - pub fn update(&mut self, msg: &Msg, _orders: &mut impl Orders) { + pub fn update(&mut self, msg: &Msg, orders: &mut impl Orders) { let field_id = match msg { Msg::StyledSelectChanged(field_id, ..) => field_id, _ => return, @@ -87,6 +85,7 @@ impl StyledSelectState { } } Msg::StyledSelectChanged(_, StyledSelectChanged::Text(text)) => { + orders.skip(); self.text_filter = text.clone(); } Msg::StyledSelectChanged(_, StyledSelectChanged::Changed(Some(v))) => { @@ -112,7 +111,7 @@ impl StyledSelectState { pub struct StyledSelect<'l, Options> where - Options: Iterator>, + Options: Iterator>, { pub id: FieldId, pub variant: SelectVariant, @@ -121,7 +120,7 @@ where pub valid: bool, pub is_multi: bool, pub options: Option, - pub selected: Vec>, + pub selected: Vec>, pub text_filter: &'l str, pub opened: bool, pub clearable: bool, @@ -129,7 +128,7 @@ where impl<'l, Options> Default for StyledSelect<'l, Options> where - Options: Iterator>, + Options: Iterator>, { fn default() -> Self { Self { @@ -150,7 +149,7 @@ where impl<'l, Options> ToNode for StyledSelect<'l, Options> where - Options: Iterator>, + Options: Iterator>, { fn into_node(self) -> Node { render(self) @@ -159,7 +158,7 @@ where pub fn render<'l, Options>(values: StyledSelect<'l, Options>) -> Node where - Options: Iterator>, + Options: Iterator>, { let StyledSelect { id, @@ -221,13 +220,16 @@ where empty![] }; + let skip = selected.iter().fold(HashMap::new(), |mut h, o| { + h.insert(o.value, true); + h + }); let children: Vec> = if let Some(options) = options { options - .filter(|o| !selected.contains(&o) && o.match_text(text_filter)) + .filter(|o| !skip.contains_key(&o.value) && o.match_text(text_filter)) .map(|child| { - let child = child.build(DisplayType::SelectOption); let value = child.value(); - let node = child.into_node(); + let node = child.render_option(); let on_change = { let field_id = id.clone(); @@ -245,21 +247,6 @@ where vec![] }; - let text_input = if opened { - seed::input![ - C!["dropDownInput"], - attrs![ - At::Name => name, - At::Type => "text" - At::Placeholder => "Search" - At::AutoFocus => "true", - ], - on_text, - ] - } else { - empty![] - }; - let option_list = match (opened, children.is_empty()) { (false, _) => empty![], (_, true) => seed::div![C!["noOptions"], "No results"], @@ -281,10 +268,7 @@ where vec![div![C!["valueMulti"], children]] } else { - selected - .into_iter() - .map(|m| render_value(m.build(DisplayType::SelectValue).into_node())) - .collect() + selected.into_iter().map(|m| m.render_value()).collect() }; seed::div![ @@ -303,29 +287,25 @@ where div![ C!["dropDown"], attrs![At::Style => dropdown_style.as_str()], - text_input, + IF![opened => seed::input![ + C!["dropDownInput"], + attrs![ + At::Name => name, + At::Type => "text" + At::Placeholder => "Search" + At::AutoFocus => "true", + ], + on_text, + ]], option_list ] ] } -fn render_value(mut content: Node) -> Node { - content.add_class("value"); - content -} - -fn into_multi_value(opt: StyledSelectChildBuilder, id: FieldId) -> Node { - let close_icon = StyledIcon { - icon: Icon::Close, - size: Some(14), - ..Default::default() - } - .into_node(); - let child = opt.build(DisplayType::SelectValue); +fn into_multi_value(child: StyledSelectChild, id: FieldId) -> Node { let value = child.value(); - let mut opt = child.into_node(); - opt.add_class("value").add_child(close_icon); + let opt = child.render_multi_value(); let handler = { let field_id = id; diff --git a/jirs-client/src/components/styled_select_child.rs b/jirs-client/src/components/styled_select_child.rs index c62adc43..61f12454 100644 --- a/jirs-client/src/components/styled_select_child.rs +++ b/jirs-client/src/components/styled_select_child.rs @@ -1,25 +1,23 @@ -use { - crate::{ - components::styled_select::SelectVariant, - shared::{IntoChild, ToChild, ToNode}, - Msg, - }, - seed::{prelude::*, *}, -}; +use seed::prelude::*; +use seed::*; -use crate::components::styled_avatar::StyledAvatar; -use crate::components::styled_icon::StyledIcon; +use crate::components::styled_icon::{Icon, StyledIcon}; +use crate::components::styled_select::SelectVariant; +use crate::shared::ToNode; +use crate::Msg; +#[derive(Copy, Clone, PartialEq)] +#[repr(u8)] pub enum DisplayType { SelectOption, SelectValue, + SelectMultiValue, } pub struct StyledSelectChild<'l> { pub name: Option<&'l str>, pub icon: Option>, pub text: Option<&'l str>, - pub display_type: DisplayType, pub value: u32, pub class_list: &'l str, pub variant: SelectVariant, @@ -31,7 +29,6 @@ impl<'l> Default for StyledSelectChild<'l> { name: None, icon: None, text: None, - display_type: DisplayType::SelectOption, value: 0, class_list: "", variant: Default::default(), @@ -44,95 +41,37 @@ impl<'l> StyledSelectChild<'l> { pub fn value(&self) -> u32 { self.value } -} -impl<'l> ToNode for StyledSelectChild<'l> { - fn into_node(self) -> Node { - render(self) - } -} - -#[derive(Debug)] -pub struct StyledSelectChildBuilder<'l> { - pub icon: Option>, - pub text: Option<&'l str>, - pub name: Option<&'l str>, - pub value: u32, - pub class_list: &'l str, - pub variant: SelectVariant, -} - -impl<'l> Default for StyledSelectChildBuilder<'l> { - fn default() -> Self { - Self { - icon: None, - text: None, - name: None, - value: 0, - class_list: "", - variant: Default::default(), - } - } -} - -impl<'l> PartialEq for StyledSelectChildBuilder<'l> { - fn eq(&self, other: &Self) -> bool { - self.value == other.value - } -} - -impl<'l> StyledSelectChildBuilder<'l> { - pub fn icon(mut self, icon: Node) -> Self { - self.icon = Some(icon); - self + #[inline(always)] + pub fn render_value(self) -> Node { + render(DisplayType::SelectValue, self) } - pub fn text<'m: 'l>(mut self, text: &'m str) -> Self { - self.text = Some(text); - self + #[inline(always)] + pub fn render_multi_value(self) -> Node { + render(DisplayType::SelectMultiValue, self) } - pub fn name(mut self, name: &'l str) -> Self { - self.name = Some(name); - self - } - - pub fn value(mut self, value: u32) -> Self { - self.value = value; - self + #[inline(always)] + pub fn render_option(self) -> Node { + render(DisplayType::SelectOption, self) } + #[inline(always)] pub fn match_text(&self, text: &str) -> bool { self.text .as_ref() .map(|t| t.to_lowercase().contains(text.to_lowercase().as_str())) .unwrap_or(true) } - - pub fn class_list<'m: 'l>(mut self, name: &'m str) -> Self { - self.class_list = name; - self - } - - pub fn build(self, display_type: DisplayType) -> StyledSelectChild<'l> { - StyledSelectChild { - name: self.name, - icon: self.icon, - text: self.text, - display_type, - value: self.value, - class_list: self.class_list, - variant: self.variant, - } - } } -pub fn render(values: StyledSelectChild) -> Node { +#[inline(always)] +pub fn render(display_type: DisplayType, values: StyledSelectChild) -> Node { let StyledSelectChild { name, icon, text, - display_type, value: _, class_list, variant, @@ -152,7 +91,7 @@ pub fn render(values: StyledSelectChild) -> Node { .unwrap_or_default(), match display_type { DisplayType::SelectOption => "optionLabel", - DisplayType::SelectValue => "selectItemLabel", + DisplayType::SelectValue | DisplayType::SelectMultiValue => "selectItemLabel", }, class_list ], @@ -167,168 +106,22 @@ pub fn render(values: StyledSelectChild) -> Node { name.as_deref().unwrap_or_default(), match display_type { DisplayType::SelectOption => "optionItem", - DisplayType::SelectValue => "selectItem", + DisplayType::SelectValue | DisplayType::SelectMultiValue => "selectItem value", }, class_list ], icon_node, - label_node + label_node, + IF![display_type == DisplayType::SelectMultiValue => close_icon()] ] } -impl<'l> ToChild<'l> for jirs_data::User { - type Builder = StyledSelectChildBuilder<'l>; - - fn to_child<'m: 'l>(&'m self) -> Self::Builder { - let avatar = StyledAvatar { - size: 20, - name: &self.name, - avatar_url: self.avatar_url.as_deref(), - ..StyledAvatar::default() - } - .into_node(); - StyledSelectChildBuilder { - value: self.id as u32, - icon: Some(avatar), - text: Some(self.name.as_str()), - ..Default::default() - } - } -} - -impl<'l> IntoChild<'l> for jirs_data::IssuePriority { - type Builder = StyledSelectChildBuilder<'l>; - - fn into_child(self) -> Self::Builder { - let icon = StyledIcon { - icon: self.clone().into(), - class_list: self.to_str(), - ..Default::default() - } - .into_node(); - - StyledSelectChildBuilder { - icon: Some(icon), - text: Some(self.to_str()), - class_list: self.to_str(), - value: self.into(), - ..Default::default() - } - } -} - -impl<'l> ToChild<'l> for jirs_data::IssueStatus { - type Builder = StyledSelectChildBuilder<'l>; - - fn to_child<'m: 'l>(&'m self) -> Self::Builder { - StyledSelectChildBuilder { - value: self.id as u32, - class_list: self.name.as_str(), - text: Some(self.name.as_str()), - ..Default::default() - } - } -} - -impl<'l> IntoChild<'l> for jirs_data::IssueType { - type Builder = StyledSelectChildBuilder<'l>; - - fn into_child(self) -> Self::Builder { - let name = self.to_label(); - - let type_icon = StyledIcon { - icon: self.clone().into(), - class_list: name, - ..Default::default() - } - .into_node(); - - StyledSelectChildBuilder { - class_list: name, - text: Some(name), - icon: Some(type_icon), - value: self.into(), - ..Default::default() - } - } -} - -impl<'l> IntoChild<'l> for jirs_data::ProjectCategory { - type Builder = StyledSelectChildBuilder<'l>; - - fn into_child(self) -> Self::Builder { - StyledSelectChildBuilder { - class_list: self.to_str(), - text: Some(self.to_str()), - value: self.into(), - ..Default::default() - } - } -} - -impl<'l> IntoChild<'l> for jirs_data::UserRole { - type Builder = StyledSelectChildBuilder<'l>; - - fn into_child(self) -> Self::Builder { - let name = self.to_str(); - - StyledSelectChildBuilder { - text: Some(name), - value: self.into(), - class_list: name, - ..Default::default() - } - } -} - -macro_rules! id_name_builder { - () => { - fn to_child<'m: 'l>(&'m self) -> Self::Builder { - StyledSelectChildBuilder { - text: Some(self.name.as_str()), - value: self.id as u32, - ..Default::default() - } - } - }; -} - -impl<'l> ToChild<'l> for jirs_data::Project { - type Builder = StyledSelectChildBuilder<'l>; - id_name_builder!(); -} - -impl<'l> ToChild<'l> for jirs_data::Epic { - type Builder = StyledSelectChildBuilder<'l>; - id_name_builder!(); -} - -impl<'l> ToChild<'l> for u32 { - type Builder = StyledSelectChildBuilder<'l>; - - fn to_child<'m: 'l>(&'m self) -> Self::Builder { - let name = stringify!(self); - - StyledSelectChildBuilder { - class_list: name, - text: Some(name), - value: *self, - ..Default::default() - } - } -} - -pub type Label = String; -pub type Value = u32; - -impl<'l> ToChild<'l> for (Label, Value) { - type Builder = StyledSelectChildBuilder<'l>; - - fn to_child<'m: 'l>(&'m self) -> Self::Builder { - StyledSelectChildBuilder { - text: Some(self.0.as_str()), - value: self.1, - ..Default::default() - } +#[inline(always)] +fn close_icon() -> Node { + StyledIcon { + icon: Icon::Close, + size: Some(14), + ..Default::default() } + .into_node() } diff --git a/jirs-client/src/components/styled_textarea.rs b/jirs-client/src/components/styled_textarea.rs index f3c0b9ab..e0d8be51 100644 --- a/jirs-client/src/components/styled_textarea.rs +++ b/jirs-client/src/components/styled_textarea.rs @@ -1,7 +1,8 @@ -use { - crate::{shared::ToNode, FieldId, Msg}, - seed::{prelude::*, *}, -}; +use seed::prelude::*; +use seed::*; + +use crate::shared::ToNode; +use crate::{FieldId, Msg}; #[derive(Debug)] pub struct StyledTextarea<'l> { @@ -43,8 +44,8 @@ const PADDING_TOP_BOTTOM: f64 = 17f64; const BORDER_TOP_BOTTOM: f64 = 2f64; const ADDITIONAL_HEIGHT: f64 = PADDING_TOP_BOTTOM + BORDER_TOP_BOTTOM; -// height = `calc( (${$0.value.split("\n").length}px * ( 15 * 1.4285 )) + 17px + 2px)` -// where: +// height = `calc( (${$0.value.split("\n").length}px * ( 15 * 1.4285 )) + 17px + +// 2px)` where: // * 15 is font-size // * 1.4285 is line-height // * 17 is padding top + bottom diff --git a/jirs-client/src/components/styled_tooltip.rs b/jirs-client/src/components/styled_tooltip.rs index 9ba41b41..42adc858 100644 --- a/jirs-client/src/components/styled_tooltip.rs +++ b/jirs-client/src/components/styled_tooltip.rs @@ -1,7 +1,8 @@ -use { - crate::{shared::ToNode, Msg}, - seed::{prelude::*, *}, -}; +use seed::prelude::*; +use seed::*; + +use crate::shared::ToNode; +use crate::Msg; #[derive(Debug, Copy, Clone)] pub enum TooltipVariant { diff --git a/jirs-client/src/images/project_avatar.rs b/jirs-client/src/images/project_avatar.rs index 7753608c..4a9114a1 100644 --- a/jirs-client/src/images/project_avatar.rs +++ b/jirs-client/src/images/project_avatar.rs @@ -1,7 +1,7 @@ -use { - crate::Msg, - seed::{prelude::*, *}, -}; +use seed::prelude::*; +use seed::*; + +use crate::Msg; #[inline(always)] pub fn render() -> Node { diff --git a/jirs-client/src/lib.rs b/jirs-client/src/lib.rs index 07d7694a..5937fcda 100644 --- a/jirs-client/src/lib.rs +++ b/jirs-client/src/lib.rs @@ -1,22 +1,21 @@ #![feature(type_ascription, trait_alias, drain_filter)] -use { - crate::{ - components::{ - styled_date_time_input::StyledDateTimeChanged, - styled_select::StyledSelectChanged, - styled_tooltip, - styled_tooltip::{TooltipVariant as StyledTooltip, TooltipVariant}, - }, - model::{ModalType, Model, Page}, - shared::{go_to_board, go_to_login}, - ws::{flush_queue, open_socket, read_incoming, send_ws_msg}, - }, - jirs_data::*, - seed::{prelude::*, *}, - web_sys::File, -}; -pub use {changes::*, components::*, fields::*, images::*}; +pub use changes::*; +pub use components::*; +pub use fields::*; +pub use images::*; +use jirs_data::*; +use seed::prelude::*; +use seed::*; +use web_sys::File; + +use crate::components::styled_date_time_input::StyledDateTimeChanged; +use crate::components::styled_select::StyledSelectChanged; +use crate::components::styled_tooltip; +use crate::components::styled_tooltip::{TooltipVariant as StyledTooltip, TooltipVariant}; +use crate::model::{ModalType, Model, Page}; +use crate::shared::{go_to_board, go_to_login}; +use crate::ws::{flush_queue, open_socket, read_incoming, send_ws_msg}; // use crate::shared::styled_rte::RteMsg; diff --git a/jirs-client/src/modals/comments_delete/mod.rs b/jirs-client/src/modals/comments_delete/mod.rs index 1ee19316..17777a8f 100644 --- a/jirs-client/src/modals/comments_delete/mod.rs +++ b/jirs-client/src/modals/comments_delete/mod.rs @@ -1,4 +1,5 @@ -pub use {model::*, view::*}; +pub use model::*; +pub use view::*; mod model; mod view; diff --git a/jirs-client/src/modals/comments_delete/view.rs b/jirs-client/src/modals/comments_delete/view.rs index 90b2a17c..d4ba991d 100644 --- a/jirs-client/src/modals/comments_delete/view.rs +++ b/jirs-client/src/modals/comments_delete/view.rs @@ -1,8 +1,9 @@ -use { - crate::{model, shared::ToNode, styled_confirm_modal::StyledConfirmModal, Msg}, - jirs_data::CommentId, - seed::prelude::*, -}; +use jirs_data::CommentId; +use seed::prelude::*; + +use crate::shared::ToNode; +use crate::styled_confirm_modal::StyledConfirmModal; +use crate::{model, Msg}; pub fn view(_model: &model::Model, modal: &super::Model) -> Node { let comment_id: CommentId = modal.comment_id; diff --git a/jirs-client/src/modals/debug/mod.rs b/jirs-client/src/modals/debug/mod.rs index aecce944..bc6b2959 100644 --- a/jirs-client/src/modals/debug/mod.rs +++ b/jirs-client/src/modals/debug/mod.rs @@ -1,4 +1,6 @@ -pub use {model::*, update::*, view::*}; +pub use model::*; +pub use update::*; +pub use view::*; mod model; mod update; diff --git a/jirs-client/src/modals/debug/view.rs b/jirs-client/src/modals/debug/view.rs index 4ce850c7..580d1dea 100644 --- a/jirs-client/src/modals/debug/view.rs +++ b/jirs-client/src/modals/debug/view.rs @@ -1,7 +1,10 @@ -use { - crate::{components::styled_modal::StyledModal, model::Model, shared::ToNode, Msg}, - seed::{prelude::*, *}, -}; +use seed::prelude::*; +use seed::*; + +use crate::components::styled_modal::StyledModal; +use crate::model::Model; +use crate::shared::ToNode; +use crate::Msg; pub fn view(model: &Model) -> Node { let text = format!("{:#?}", model); diff --git a/jirs-client/src/modals/epic_field.rs b/jirs-client/src/modals/epic_field.rs index 314f8ddf..b7766115 100644 --- a/jirs-client/src/modals/epic_field.rs +++ b/jirs-client/src/modals/epic_field.rs @@ -1,15 +1,12 @@ -use { - crate::{ - components::{styled_field::StyledField, styled_select::StyledSelect}, - model::{IssueModal, Model}, - shared::{ToChild, ToNode}, - FieldId, Msg, - }, - jirs_data::EpicId, - seed::prelude::Node, -}; +use jirs_data::{Epic, EpicId}; +use seed::prelude::Node; -use crate::components::styled_select::SelectVariant; +use crate::components::styled_field::StyledField; +use crate::components::styled_select::{SelectVariant, StyledSelect}; +use crate::components::styled_select_child::StyledSelectChild; +use crate::model::{IssueModal, Model}; +use crate::shared::ToNode; +use crate::{FieldId, Msg}; pub fn epic_field(model: &Model, modal: &Modal, field_id: FieldId) -> Option> where @@ -18,16 +15,15 @@ where if model.epics.is_empty() { return None; } - let selected = modal - .epic_id_value() - .and_then(|id| model.epics.iter().find(|epic| epic.id == id as EpicId)) - .map(|epic| vec![epic.to_child()]) - .unwrap_or_default(); let input = StyledSelect { id: field_id, name: "epic", - selected, - options: Some(model.epics.iter().map(|epic| epic.to_child())), + selected: vec![modal + .epic_id_value() + .and_then(|id| model.epics.iter().find(|epic| epic.id == id as EpicId)) + .map(epic_select_option) + .unwrap_or_default()], + options: Some(model.epics.iter().map(epic_select_option)), variant: SelectVariant::Normal, clearable: true, text_filter: modal.epic_state().text_filter.as_str(), @@ -46,3 +42,11 @@ where .into_node(), ) } + +fn epic_select_option<'l>(epic: &'l Epic) -> StyledSelectChild<'l> { + StyledSelectChild { + value: epic.id as u32, + text: Some(epic.name.as_str()), + ..Default::default() + } +} diff --git a/jirs-client/src/modals/epics_delete/mod.rs b/jirs-client/src/modals/epics_delete/mod.rs index aecce944..bc6b2959 100644 --- a/jirs-client/src/modals/epics_delete/mod.rs +++ b/jirs-client/src/modals/epics_delete/mod.rs @@ -1,4 +1,6 @@ -pub use {model::*, update::*, view::*}; +pub use model::*; +pub use update::*; +pub use view::*; mod model; mod update; diff --git a/jirs-client/src/modals/epics_delete/model.rs b/jirs-client/src/modals/epics_delete/model.rs index 5cd19e36..c8a43aa2 100644 --- a/jirs-client/src/modals/epics_delete/model.rs +++ b/jirs-client/src/modals/epics_delete/model.rs @@ -1,7 +1,6 @@ -use { - crate::model, - jirs_data::{EpicId, IssueId}, -}; +use jirs_data::{EpicId, IssueId}; + +use crate::model; #[derive(Clone, Debug, PartialOrd, PartialEq)] pub struct Model { diff --git a/jirs-client/src/modals/epics_delete/update.rs b/jirs-client/src/modals/epics_delete/update.rs index ff15cd05..e16289b6 100644 --- a/jirs-client/src/modals/epics_delete/update.rs +++ b/jirs-client/src/modals/epics_delete/update.rs @@ -1,8 +1,8 @@ -use { - crate::{ws::send_ws_msg, Msg, OperationKind, ResourceKind}, - jirs_data::WsMsg, - seed::prelude::*, -}; +use jirs_data::WsMsg; +use seed::prelude::*; + +use crate::ws::send_ws_msg; +use crate::{Msg, OperationKind, ResourceKind}; pub fn update(msg: &Msg, model: &mut crate::model::Model, orders: &mut impl Orders) { let modal = match &mut model.modals_mut().delete_epic { diff --git a/jirs-client/src/modals/epics_delete/view.rs b/jirs-client/src/modals/epics_delete/view.rs index eaa78b49..70f3cc12 100644 --- a/jirs-client/src/modals/epics_delete/view.rs +++ b/jirs-client/src/modals/epics_delete/view.rs @@ -1,13 +1,13 @@ -use { - crate::{ - components::{styled_button::*, styled_confirm_modal::*, styled_icon::*, styled_modal::*}, - modals::epics_delete::Model, - model, - shared::ToNode, - Msg, - }, - seed::{prelude::*, *}, -}; +use seed::prelude::*; +use seed::*; + +use crate::components::styled_button::*; +use crate::components::styled_confirm_modal::*; +use crate::components::styled_icon::*; +use crate::components::styled_modal::*; +use crate::modals::epics_delete::Model; +use crate::shared::ToNode; +use crate::{model, Msg}; pub fn view(model: &model::Model, modal: &Model) -> Node { if modal.related_issues.is_empty() { diff --git a/jirs-client/src/modals/epics_edit/mod.rs b/jirs-client/src/modals/epics_edit/mod.rs index aecce944..bc6b2959 100644 --- a/jirs-client/src/modals/epics_edit/mod.rs +++ b/jirs-client/src/modals/epics_edit/mod.rs @@ -1,4 +1,6 @@ -pub use {model::*, update::*, view::*}; +pub use model::*; +pub use update::*; +pub use view::*; mod model; mod update; diff --git a/jirs-client/src/modals/epics_edit/model.rs b/jirs-client/src/modals/epics_edit/model.rs index e235181d..c73d5545 100644 --- a/jirs-client/src/modals/epics_edit/model.rs +++ b/jirs-client/src/modals/epics_edit/model.rs @@ -1,11 +1,9 @@ -use { - crate::{ - components::{styled_checkbox::StyledCheckboxState, styled_input::*}, - model, FieldId, Msg, - }, - jirs_data::*, - seed::prelude::Orders, -}; +use jirs_data::*; +use seed::prelude::Orders; + +use crate::components::styled_checkbox::StyledCheckboxState; +use crate::components::styled_input::*; +use crate::{model, FieldId, Msg}; #[derive(Debug)] pub struct Model { diff --git a/jirs-client/src/modals/epics_edit/update.rs b/jirs-client/src/modals/epics_edit/update.rs index b68d4ad1..2065e9f0 100644 --- a/jirs-client/src/modals/epics_edit/update.rs +++ b/jirs-client/src/modals/epics_edit/update.rs @@ -1,8 +1,7 @@ -use { - crate::{send_ws_msg, FieldId, Msg, OperationKind, ResourceKind}, - jirs_data::{EpicFieldId, IssueType, WsMsg}, - seed::prelude::*, -}; +use jirs_data::{EpicFieldId, IssueType, WsMsg}; +use seed::prelude::*; + +use crate::{send_ws_msg, FieldId, Msg, OperationKind, ResourceKind}; pub fn update(msg: &Msg, model: &mut crate::model::Model, orders: &mut impl Orders) { let modal = match &mut model.modals.edit_epic { diff --git a/jirs-client/src/modals/epics_edit/view.rs b/jirs-client/src/modals/epics_edit/view.rs index 3e964e4b..5fb2f32d 100644 --- a/jirs-client/src/modals/epics_edit/view.rs +++ b/jirs-client/src/modals/epics_edit/view.rs @@ -1,17 +1,15 @@ -use { - crate::{ - components::{ - styled_button::*, styled_checkbox::*, styled_icon::Icon, styled_input::*, - styled_modal::*, - }, - modals::epics_edit::Model, - model, - shared::{IntoChild, ToNode}, - FieldId, Msg, - }, - jirs_data::{EpicFieldId, IssueType}, - seed::{prelude::*, *}, -}; +use jirs_data::{EpicFieldId, IssueType}; +use seed::prelude::*; +use seed::*; + +use crate::components::styled_button::*; +use crate::components::styled_checkbox::*; +use crate::components::styled_icon::Icon; +use crate::components::styled_input::*; +use crate::components::styled_modal::*; +use crate::modals::epics_edit::Model; +use crate::shared::{IntoChild, ToNode}; +use crate::{model, FieldId, Msg}; pub struct IssueTypeWrapper(IssueType); @@ -23,7 +21,7 @@ impl<'l> IntoChild<'l> for IssueTypeWrapper { .label(self.0.to_label()) .name(self.0.to_str()) .value(self.0.into()) - .add_class(self.0.to_str()) + .class_list(self.0.to_str()) } } @@ -68,7 +66,7 @@ fn transform_into_available(modal: &super::Model) -> Node { .options( IssueType::default() .into_iter() - .map(|ty| IssueTypeWrapper(ty).into_child()), + .map(issue_type_select_option), ) .state(&modal.transform_into) .build(FieldId::EditEpic(EpicFieldId::TransformInto)) @@ -86,6 +84,17 @@ fn transform_into_available(modal: &super::Model) -> Node { div![C!["transform available"], div![types], div![execute]] } +#[inline(always)] +fn issue_type_select_option<'l>(ty: IssueType) -> ChildBuilder<'l> { + ChildBuilder { + name: ty.to_str(), + label: ty.to_label(), + value: ty.into(), + class_list: ty.to_str(), + ..Default::default() + } +} + fn transform_into_unavailable(modal: &super::Model) -> Node { let (n, s) = match modal.related_issues.len() { 1 => (1.to_string(), "issue"), diff --git a/jirs-client/src/modals/issue_statuses_delete/mod.rs b/jirs-client/src/modals/issue_statuses_delete/mod.rs index aecce944..bc6b2959 100644 --- a/jirs-client/src/modals/issue_statuses_delete/mod.rs +++ b/jirs-client/src/modals/issue_statuses_delete/mod.rs @@ -1,4 +1,6 @@ -pub use {model::*, update::*, view::*}; +pub use model::*; +pub use update::*; +pub use view::*; mod model; mod update; diff --git a/jirs-client/src/modals/issue_statuses_delete/update.rs b/jirs-client/src/modals/issue_statuses_delete/update.rs index 83f4aa88..167850ec 100644 --- a/jirs-client/src/modals/issue_statuses_delete/update.rs +++ b/jirs-client/src/modals/issue_statuses_delete/update.rs @@ -1,8 +1,8 @@ -use { - crate::{model::Model, Msg, OperationKind, ResourceKind}, - jirs_data::WsMsg, - seed::prelude::*, -}; +use jirs_data::WsMsg; +use seed::prelude::*; + +use crate::model::Model; +use crate::{Msg, OperationKind, ResourceKind}; pub fn update(msg: &Msg, model: &mut Model, orders: &mut impl Orders) { let _modal = match &mut model.modals_mut().delete_issue_status_modal { diff --git a/jirs-client/src/modals/issue_statuses_delete/view.rs b/jirs-client/src/modals/issue_statuses_delete/view.rs index 3c3e9369..610b1911 100644 --- a/jirs-client/src/modals/issue_statuses_delete/view.rs +++ b/jirs-client/src/modals/issue_statuses_delete/view.rs @@ -1,8 +1,9 @@ -use { - crate::{components::styled_confirm_modal::StyledConfirmModal, model, shared::ToNode, Msg}, - jirs_data::IssueStatusId, - seed::prelude::*, -}; +use jirs_data::IssueStatusId; +use seed::prelude::*; + +use crate::components::styled_confirm_modal::StyledConfirmModal; +use crate::shared::ToNode; +use crate::{model, Msg}; pub fn view(_model: &model::Model, issue_status_id: IssueStatusId) -> Node { StyledConfirmModal { diff --git a/jirs-client/src/modals/issues_create/mod.rs b/jirs-client/src/modals/issues_create/mod.rs index aecce944..bc6b2959 100644 --- a/jirs-client/src/modals/issues_create/mod.rs +++ b/jirs-client/src/modals/issues_create/mod.rs @@ -1,4 +1,6 @@ -pub use {model::*, update::*, view::*}; +pub use model::*; +pub use update::*; +pub use view::*; mod model; mod update; diff --git a/jirs-client/src/modals/issues_create/model.rs b/jirs-client/src/modals/issues_create/model.rs index 4292f83f..60de80f9 100644 --- a/jirs-client/src/modals/issues_create/model.rs +++ b/jirs-client/src/modals/issues_create/model.rs @@ -1,17 +1,13 @@ -use { - crate::{ - components::{ - styled_date_time_input::*, styled_input::*, styled_select::*, styled_select_child::*, - }, - model::IssueModal, - shared::{IntoChild, ToNode}, - FieldId, Msg, - }, - derive_enum_iter::EnumIter, - derive_enum_primitive::EnumPrimitive, - jirs_data::{IssueFieldId, IssuePriority}, - seed::prelude::*, -}; +use derive_enum_iter::EnumIter; +use derive_enum_primitive::EnumPrimitive; +use jirs_data::{IssueFieldId, IssuePriority}; +use seed::prelude::*; + +use crate::components::styled_date_time_input::*; +use crate::components::styled_input::*; +use crate::components::styled_select::*; +use crate::model::IssueModal; +use crate::{FieldId, Msg}; #[derive(Copy, Clone, EnumPrimitive, EnumIter)] pub enum Type { @@ -53,43 +49,6 @@ impl Type { } } -impl<'l> IntoChild<'l> for Type { - type Builder = StyledSelectChildBuilder<'l>; - - fn into_child(self) -> Self::Builder { - let name = match self { - Type::Task => "Task", - Type::Bug => "Bug", - Type::Story => "Story", - Type::Epic => "Epic", - }; - let value: u32 = self.into(); - - let type_icon = { - use crate::components::styled_icon::*; - StyledIcon { - icon: match self { - Type::Task => Icon::Task, - Type::Bug => Icon::Bug, - Type::Story => Icon::Story, - Type::Epic => Icon::Epic, - }, - class_list: name, - ..Default::default() - } - .into_node() - }; - - StyledSelectChildBuilder { - class_list: name, - text: Some(name), - icon: Some(type_icon), - value, - ..Default::default() - } - } -} - #[derive(Clone, Debug, PartialOrd, PartialEq)] pub struct Model { pub priority: IssuePriority, diff --git a/jirs-client/src/modals/issues_create/update.rs b/jirs-client/src/modals/issues_create/update.rs index ecb3b86a..41446b75 100644 --- a/jirs-client/src/modals/issues_create/update.rs +++ b/jirs-client/src/modals/issues_create/update.rs @@ -1,11 +1,10 @@ -use { - crate::{ - components::styled_select::StyledSelectChanged, model::IssueModal, ws::send_ws_msg, - FieldId, Msg, OperationKind, ResourceKind, - }, - jirs_data::{IssueFieldId, UserId, WsMsg}, - seed::prelude::*, -}; +use jirs_data::{IssueFieldId, UserId, WsMsg}; +use seed::prelude::*; + +use crate::components::styled_select::StyledSelectChanged; +use crate::model::IssueModal; +use crate::ws::send_ws_msg; +use crate::{FieldId, Msg, OperationKind, ResourceKind}; pub fn update(msg: &Msg, model: &mut crate::model::Model, orders: &mut impl Orders) { let user_id = model.user_id().unwrap_or_default(); diff --git a/jirs-client/src/modals/issues_create/view.rs b/jirs-client/src/modals/issues_create/view.rs index 7c7bebcc..fe41baad 100644 --- a/jirs-client/src/modals/issues_create/view.rs +++ b/jirs-client/src/modals/issues_create/view.rs @@ -1,25 +1,23 @@ -use { - crate::{ - components::{ - styled_button::StyledButton, styled_date_time_input::StyledDateTimeInput, - styled_field::StyledField, styled_form::StyledForm, styled_input::StyledInput, - styled_modal::StyledModal, styled_select::StyledSelect, - styled_textarea::StyledTextarea, - }, - modals::{ - epic_field, - issues_create::{Model as AddIssueModal, Type}, - }, - model::Model, - shared::{IntoChild, ToChild, ToNode}, - FieldId, Msg, - }, - jirs_data::{IssueFieldId, IssuePriority}, - seed::{prelude::*, *}, -}; +use jirs_data::{IssueFieldId, IssuePriority, User}; +use seed::prelude::*; +use seed::*; -use crate::components::styled_button::ButtonVariant; -use crate::components::styled_select::SelectVariant; +use crate::components::styled_avatar::StyledAvatar; +use crate::components::styled_button::{ButtonVariant, StyledButton}; +use crate::components::styled_date_time_input::StyledDateTimeInput; +use crate::components::styled_field::StyledField; +use crate::components::styled_form::StyledForm; +use crate::components::styled_icon::{Icon, StyledIcon}; +use crate::components::styled_input::StyledInput; +use crate::components::styled_modal::StyledModal; +use crate::components::styled_select::{SelectVariant, StyledSelect}; +use crate::components::styled_select_child::StyledSelectChild; +use crate::components::styled_textarea::StyledTextarea; +use crate::modals::epic_field; +use crate::modals::issues_create::{Model as AddIssueModal, Type}; +use crate::model::Model; +use crate::shared::ToNode; +use crate::{FieldId, Msg}; pub fn view(model: &Model, modal: &AddIssueModal) -> Node { let issue_type = modal @@ -40,27 +38,25 @@ pub fn view(model: &Model, modal: &AddIssueModal) -> Node { Type::Epic => { let name_field = name_field(modal); - let starts = StyledField::build() - .input( - StyledDateTimeInput::build() - .state(&modal.epic_starts_at_state) - .build(FieldId::AddIssueModal(IssueFieldId::EpicStartsAt)) - .into_node(), - ) - .label("Starts at") - .build() - .into_node(); + let starts = StyledField { + input: StyledDateTimeInput::build() + .state(&modal.epic_starts_at_state) + .build(FieldId::AddIssueModal(IssueFieldId::EpicStartsAt)) + .into_node(), + label: "Starts at", + ..Default::default() + } + .into_node(); - let end = StyledField::build() - .input( - StyledDateTimeInput::build() - .state(&modal.epic_ends_at_state) - .build(FieldId::AddIssueModal(IssueFieldId::EpicEndsAt)) - .into_node(), - ) - .label("Ends at") - .build() - .into_node(); + let end = StyledField { + input: StyledDateTimeInput::build() + .state(&modal.epic_ends_at_state) + .build(FieldId::AddIssueModal(IssueFieldId::EpicEndsAt)) + .into_node(), + label: "Ends at", + ..Default::default() + } + .into_node(); form.add_field(name_field).add_field(starts).add_field(end) } @@ -129,19 +125,16 @@ fn issue_type_field(modal: &AddIssueModal) -> Node { text_filter: modal.type_state.text_filter.as_str(), opened: modal.type_state.opened, valid: true, - options: Some(Type::Task.into_iter().map(|t| t.into_child().name("type"))), - selected: vec![{ - let v: Type = modal + options: Some(Type::Task.into_iter().map(type_select_option)), + selected: vec![type_select_option( + modal .type_state .values .get(0) .cloned() .unwrap_or_default() - .into(); - v - } - .into_child() - .name("type")], + .into(), + )], ..Default::default() } .into_node(); @@ -154,6 +147,37 @@ fn issue_type_field(modal: &AddIssueModal) -> Node { .into_node() } +#[inline(always)] +fn type_select_option<'l>(t: Type) -> StyledSelectChild<'l> { + let name = match t { + Type::Task => "Task", + Type::Bug => "Bug", + Type::Story => "Story", + Type::Epic => "Epic", + }; + + StyledSelectChild { + class_list: name, + text: Some(name), + icon: Some( + StyledIcon { + icon: match t { + Type::Task => Icon::Task, + Type::Bug => Icon::Bug, + Type::Story => Icon::Story, + Type::Epic => Icon::Epic, + }, + class_list: name, + ..Default::default() + } + .into_node(), + ), + name: Some("type"), + value: t.into(), + ..Default::default() + } +} + #[inline] fn short_summary_field(modal: &AddIssueModal) -> Node { let short_summary = StyledInput { @@ -199,13 +223,13 @@ fn reporter_field(model: &Model, modal: &AddIssueModal) -> Node { variant: SelectVariant::Normal, text_filter: modal.reporter_state.text_filter.as_str(), opened: modal.reporter_state.opened, - options: Some(model.users.iter().map(|u| u.to_child().name("reporter"))), + options: Some(model.users.iter().map(reporter_select_option)), selected: model .users .iter() .filter_map(|user| { if user.id == reporter_id { - Some(user.to_child().name("reporter")) + Some(reporter_select_option(user)) } else { None } @@ -224,6 +248,25 @@ fn reporter_field(model: &Model, modal: &AddIssueModal) -> Node { .into_node() } +#[inline(always)] +fn reporter_select_option(user: &User) -> StyledSelectChild { + StyledSelectChild { + value: user.id as u32, + icon: Some( + StyledAvatar { + size: 20, + name: &user.name, + avatar_url: user.avatar_url.as_deref(), + ..StyledAvatar::default() + } + .into_node(), + ), + text: Some(user.name.as_str()), + name: Some("reporter"), + ..Default::default() + } +} + fn assignees_field(model: &Model, modal: &AddIssueModal) -> Node { let assignees = StyledSelect { id: FieldId::AddIssueModal(IssueFieldId::Assignees), @@ -231,13 +274,13 @@ fn assignees_field(model: &Model, modal: &AddIssueModal) -> Node { is_multi: true, text_filter: modal.assignees_state.text_filter.as_str(), opened: modal.assignees_state.opened, - options: Some(model.users.iter().map(|u| u.to_child().name("assignees"))), + options: Some(model.users.iter().map(assignee_select_option)), selected: model .users .iter() .filter_map(|user| { if modal.user_ids.contains(&user.id) { - Some(user.to_child().name("assignees")) + Some(assignee_select_option(user)) } else { None } @@ -248,12 +291,32 @@ fn assignees_field(model: &Model, modal: &AddIssueModal) -> Node { ..Default::default() } .into_node(); - StyledField::build() - .input(assignees) - .label("Assignees") - .tip("") - .build() - .into_node() + StyledField { + input: assignees, + label: "Assignees", + tip: Some(""), + ..Default::default() + } + .into_node() +} + +#[inline(always)] +fn assignee_select_option(user: &User) -> StyledSelectChild { + StyledSelectChild { + value: user.id as u32, + icon: Some( + StyledAvatar { + size: 20, + name: &user.name, + avatar_url: user.avatar_url.as_deref(), + ..StyledAvatar::default() + } + .into_node(), + ), + text: Some(user.name.as_str()), + name: Some("assignees"), + ..Default::default() + } } fn issue_priority_field(modal: &AddIssueModal) -> Node { @@ -265,8 +328,8 @@ fn issue_priority_field(modal: &AddIssueModal) -> Node { text_filter: modal.priority_state.text_filter.as_str(), opened: modal.priority_state.opened, valid: true, - options: Some(priorities.map(|p| p.into_child().name("priority"))), - selected: vec![modal.priority.into_child().name("priority")], + options: Some(priorities.map(priority_select_option)), + selected: vec![priority_select_option(modal.priority)], ..Default::default() } .into_node(); @@ -279,6 +342,24 @@ fn issue_priority_field(modal: &AddIssueModal) -> Node { .into_node() } +fn priority_select_option<'l>(priority: IssuePriority) -> StyledSelectChild<'l> { + StyledSelectChild { + icon: Some( + StyledIcon { + icon: priority.clone().into(), + class_list: priority.to_str(), + ..Default::default() + } + .into_node(), + ), + text: Some(priority.to_str()), + class_list: priority.to_str(), + value: priority.into(), + name: Some("priority"), + ..Default::default() + } +} + fn name_field(modal: &AddIssueModal) -> Node { let name = StyledInput { value: modal.title_state.value.as_str(), diff --git a/jirs-client/src/modals/issues_delete/mod.rs b/jirs-client/src/modals/issues_delete/mod.rs index aecce944..bc6b2959 100644 --- a/jirs-client/src/modals/issues_delete/mod.rs +++ b/jirs-client/src/modals/issues_delete/mod.rs @@ -1,4 +1,6 @@ -pub use {model::*, update::*, view::*}; +pub use model::*; +pub use update::*; +pub use view::*; mod model; mod update; diff --git a/jirs-client/src/modals/issues_delete/view.rs b/jirs-client/src/modals/issues_delete/view.rs index d0f098a5..1cea9d1e 100644 --- a/jirs-client/src/modals/issues_delete/view.rs +++ b/jirs-client/src/modals/issues_delete/view.rs @@ -1,7 +1,8 @@ -use { - crate::{components::styled_confirm_modal::StyledConfirmModal, model, shared::ToNode, Msg}, - seed::prelude::*, -}; +use seed::prelude::*; + +use crate::components::styled_confirm_modal::StyledConfirmModal; +use crate::shared::ToNode; +use crate::{model, Msg}; pub fn view(model: &model::Model) -> Node { let issue_id = match &model.modals().delete_issue_confirm { diff --git a/jirs-client/src/modals/issues_edit/mod.rs b/jirs-client/src/modals/issues_edit/mod.rs index aecce944..bc6b2959 100644 --- a/jirs-client/src/modals/issues_edit/mod.rs +++ b/jirs-client/src/modals/issues_edit/mod.rs @@ -1,4 +1,6 @@ -pub use {model::*, update::*, view::*}; +pub use model::*; +pub use update::*; +pub use view::*; mod model; mod update; diff --git a/jirs-client/src/modals/issues_edit/model.rs b/jirs-client/src/modals/issues_edit/model.rs index 25789a30..d33294eb 100644 --- a/jirs-client/src/modals/issues_edit/model.rs +++ b/jirs-client/src/modals/issues_edit/model.rs @@ -1,17 +1,13 @@ -use { - crate::{ - components::{ - styled_date_time_input::StyledDateTimeInputState, styled_editor::Mode, - styled_editor::StyledEditorState, styled_input::StyledInputState, - styled_select::StyledSelectState, - }, - modals::time_tracking::value_for_time_tracking, - model::{CommentForm, IssueModal}, - EditIssueModalSection, FieldId, Msg, - }, - jirs_data::{Issue, IssueFieldId, IssueId, TimeTracking, UpdateIssuePayload}, - seed::prelude::*, -}; +use jirs_data::{Issue, IssueFieldId, IssueId, TimeTracking, UpdateIssuePayload}; +use seed::prelude::*; + +use crate::components::styled_date_time_input::StyledDateTimeInputState; +use crate::components::styled_editor::{Mode, StyledEditorState}; +use crate::components::styled_input::StyledInputState; +use crate::components::styled_select::StyledSelectState; +use crate::modals::time_tracking::value_for_time_tracking; +use crate::model::{CommentForm, IssueModal}; +use crate::{EditIssueModalSection, FieldId, Msg}; #[derive(Clone, Debug, PartialOrd, PartialEq)] pub struct Model { diff --git a/jirs-client/src/modals/issues_edit/update.rs b/jirs-client/src/modals/issues_edit/update.rs index 4c36246c..a91ed131 100644 --- a/jirs-client/src/modals/issues_edit/update.rs +++ b/jirs-client/src/modals/issues_edit/update.rs @@ -1,13 +1,10 @@ -use { - crate::{ - components::styled_select::StyledSelectChanged, - model::{IssueModal, Model}, - ws::send_ws_msg, - EditIssueModalSection, FieldChange, FieldId, Msg, OperationKind, ResourceKind, - }, - jirs_data::*, - seed::prelude::*, -}; +use jirs_data::*; +use seed::prelude::*; + +use crate::components::styled_select::StyledSelectChanged; +use crate::model::{IssueModal, Model}; +use crate::ws::send_ws_msg; +use crate::{EditIssueModalSection, FieldChange, FieldId, Msg, OperationKind, ResourceKind}; pub fn update(msg: &Msg, model: &mut Model, orders: &mut impl Orders) { let modal = match &mut model.modals.edit_issue { @@ -303,7 +300,6 @@ pub fn update(msg: &Msg, model: &mut Model, orders: &mut impl Orders) { } // // comments - // Msg::StrInputChanged( FieldId::EditIssueModal(EditIssueModalSection::Comment(CommentFieldId::Body)), text, diff --git a/jirs-client/src/modals/issues_edit/view.rs b/jirs-client/src/modals/issues_edit/view.rs index 9802dfc8..6a3e5535 100644 --- a/jirs-client/src/modals/issues_edit/view.rs +++ b/jirs-client/src/modals/issues_edit/view.rs @@ -1,26 +1,27 @@ -use { - crate::{ - components::{ - styled_avatar::StyledAvatar, styled_button::StyledButton, styled_editor::StyledEditor, - styled_field::StyledField, styled_icon::Icon, styled_input::StyledInput, - styled_modal::*, styled_select::StyledSelect, - }, - modals::{ - epic_field, issues_edit::Model as EditIssueModal, time_tracking::time_tracking_field, - }, - model::{ModalType, Model}, - shared::{tracking_widget::tracking_link, IntoChild, ToChild, ToNode}, - EditIssueModalSection, FieldChange, FieldId, Msg, - }, - comments::*, - jirs_data::{CommentFieldId, IssueFieldId, IssuePriority, IssueType, TimeTracking}, - seed::{prelude::*, *}, +use comments::*; +use jirs_data::{ + CommentFieldId, IssueFieldId, IssuePriority, IssueStatus, IssueType, TimeTracking, + UpdateIssuePayload, User, }; +use seed::prelude::*; +use seed::*; -use crate::components::styled_button::ButtonVariant; -use crate::components::styled_icon::StyledIcon; -use crate::components::styled_select::SelectVariant; -use crate::components::styled_select_child::StyledSelectChildBuilder; +use crate::components::styled_avatar::StyledAvatar; +use crate::components::styled_button::{ButtonVariant, StyledButton}; +use crate::components::styled_editor::StyledEditor; +use crate::components::styled_field::StyledField; +use crate::components::styled_icon::{Icon, StyledIcon}; +use crate::components::styled_input::StyledInput; +use crate::components::styled_modal::*; +use crate::components::styled_select::{SelectVariant, StyledSelect, StyledSelectState}; +use crate::components::styled_select_child::StyledSelectChild; +use crate::modals::epic_field; +use crate::modals::issues_edit::Model as EditIssueModal; +use crate::modals::time_tracking::time_tracking_field; +use crate::model::{ModalType, Model}; +use crate::shared::tracking_widget::tracking_link; +use crate::shared::ToNode; +use crate::{EditIssueModalSection, FieldChange, FieldId, Msg}; mod comments; @@ -149,27 +150,9 @@ fn modal_header(_model: &Model, modal: &EditIssueModal) -> Node { options: Some( IssueType::default() .into_iter() - .map(|t| t.into_child().name("type")), + .map(|t| type_select_option(t, &text)), ), - selected: vec![{ - let name = payload.issue_type.to_label(); - - let type_icon = StyledIcon { - icon: payload.issue_type.clone().into(), - class_list: name, - ..Default::default() - } - .into_node(); - - StyledSelectChildBuilder { - class_list: name, - text: Some(&text), - icon: Some(type_icon), - value: payload.issue_type.into(), - name: Some("type"), - ..Default::default() - } - }], + selected: vec![type_select_option(payload.issue_type, &text)], ..Default::default() } .into_node() @@ -187,6 +170,26 @@ fn modal_header(_model: &Model, modal: &EditIssueModal) -> Node { ] } +#[inline(always)] +fn type_select_option<'l>(t: IssueType, text: &'l str) -> StyledSelectChild<'l> { + let name = t.to_label(); + StyledSelectChild { + class_list: name, + text: Some(text), + icon: Some( + StyledIcon { + icon: t.clone().into(), + class_list: name, + ..Default::default() + } + .into_node(), + ), + value: t.into(), + name: Some("type"), + ..Default::default() + } +} + fn left_modal_column(model: &Model, modal: &EditIssueModal) -> Node { let EditIssueModal { payload, @@ -220,7 +223,11 @@ fn left_modal_column(model: &Model, modal: &EditIssueModal) -> Node { } .into_node() }; - let description_field = StyledField::build().input(description).build().into_node(); + let description_field = StyledField { + input: description, + ..Default::default() + } + .into_node(); let user_avatar = StyledAvatar { avatar_url: model.user.as_ref().and_then(|u| u.avatar_url.as_deref()), @@ -283,110 +290,13 @@ fn right_modal_column(model: &Model, modal: &EditIssueModal) -> Node { .. } = modal; - let status = StyledSelect { - id: FieldId::EditIssueModal(EditIssueModalSection::Issue(IssueFieldId::IssueStatusId)), - name: "status", - opened: status_state.opened, - variant: SelectVariant::Normal, - text_filter: status_state.text_filter.as_str(), - options: Some( - model - .issue_statuses - .iter() - .map(|opt| opt.to_child().name("status")), - ), - selected: model - .issue_statuses - .iter() - .filter(|is| is.id == payload.issue_status_id) - .map(|is| is.to_child().name("status")) - .collect(), + let status_field = status_select(model, payload, status_state); - valid: true, - ..Default::default() - } - .into_node(); - let status_field = StyledField::build() - .input(status) - .label("Status") - .build() - .into_node(); + let assignees_field = assignees_select(model, payload, assignees_state); - let assignees = StyledSelect { - id: FieldId::EditIssueModal(EditIssueModalSection::Issue(IssueFieldId::Assignees)), - name: "assignees", - variant: SelectVariant::Empty, - is_multi: true, - opened: assignees_state.opened, - text_filter: assignees_state.text_filter.as_str(), - options: Some( - model - .users - .iter() - .map(|user| user.to_child().name("assignees")), - ), - selected: model - .users - .iter() - .filter(|user| payload.user_ids.contains(&user.id)) - .map(|user| user.to_child().name("assignees")) - .collect(), - ..Default::default() - } - .into_node(); - let assignees_field = StyledField::build() - .input(assignees) - .label("Assignees") - .build() - .into_node(); + let reporter_field = reporters_select(model, payload, reporter_state); - let reporter = StyledSelect { - id: FieldId::EditIssueModal(EditIssueModalSection::Issue(IssueFieldId::Reporter)), - name: "reporter", - opened: reporter_state.opened, - variant: SelectVariant::Empty, - text_filter: reporter_state.text_filter.as_str(), - options: Some( - model - .users - .iter() - .map(|user| user.to_child().name("reporter")), - ), - selected: model - .users - .iter() - .filter(|user| payload.reporter_id == user.id) - .map(|user| user.to_child().name("reporter")) - .collect(), - ..Default::default() - } - .into_node(); - let reporter_field = StyledField::build() - .input(reporter) - .label("Reporter") - .build() - .into_node(); - - let priority = StyledSelect { - id: FieldId::EditIssueModal(EditIssueModalSection::Issue(IssueFieldId::Priority)), - name: "priority", - variant: SelectVariant::Empty, - opened: priority_state.opened, - text_filter: priority_state.text_filter.as_str(), - options: Some( - IssuePriority::default() - .into_iter() - .map(|p| p.into_child().name("priority")), - ), - selected: vec![payload.priority.into_child().name("priority")], - ..Default::default() - } - .into_node(); - let priority_field = StyledField::build() - .input(priority) - .label("Priority") - .build() - .into_node(); + let priority_field = priorities_select(payload, priority_state); let time_tracking_type = model .project @@ -404,12 +314,13 @@ fn right_modal_column(model: &Model, modal: &EditIssueModal) -> Node { ); let tracking = tracking_link(model, modal); - let tracking_field = StyledField::build() - .label("TIME TRACKING") - .tip("") - .input(tracking) - .build() - .into_node(); + let tracking_field = StyledField { + label: "TIME TRACKING", + tip: Some(""), + input: tracking, + ..Default::default() + } + .into_node(); (estimate_field, tracking_field) } else { (Node::Empty, Node::Empty) @@ -433,3 +344,192 @@ fn right_modal_column(model: &Model, modal: &EditIssueModal) -> Node { epic_field, ] } + +#[inline(always)] +fn priorities_select( + payload: &UpdateIssuePayload, + priority_state: &StyledSelectState, +) -> Node { + let priority = StyledSelect { + id: FieldId::EditIssueModal(EditIssueModalSection::Issue(IssueFieldId::Priority)), + name: "priority", + variant: SelectVariant::Empty, + opened: priority_state.opened, + text_filter: priority_state.text_filter.as_str(), + options: Some( + IssuePriority::default() + .into_iter() + .map(priority_select_option), + ), + selected: vec![priority_select_option(payload.priority)], + ..Default::default() + } + .into_node(); + StyledField { + label: "Priority", + input: priority, + ..Default::default() + } + .into_node() +} + +#[inline(always)] +fn priority_select_option<'l>(ip: IssuePriority) -> StyledSelectChild<'l> { + StyledSelectChild { + icon: Some( + StyledIcon { + icon: ip.clone().into(), + class_list: ip.to_str(), + ..Default::default() + } + .into_node(), + ), + text: Some(ip.to_str()), + class_list: ip.to_str(), + value: ip.into(), + name: Some("priority"), + ..Default::default() + } +} + +#[inline(always)] +fn status_select( + model: &Model, + payload: &UpdateIssuePayload, + status_state: &StyledSelectState, +) -> Node { + let status = StyledSelect { + id: FieldId::EditIssueModal(EditIssueModalSection::Issue(IssueFieldId::IssueStatusId)), + name: "status", + opened: status_state.opened, + variant: SelectVariant::Normal, + text_filter: status_state.text_filter.as_str(), + options: Some(model.issue_statuses.iter().map(issue_status_select_option)), + selected: model + .issue_statuses + .iter() + .filter(|is| is.id == payload.issue_status_id) + .map(issue_status_select_option) + .collect(), + + valid: true, + ..Default::default() + } + .into_node(); + StyledField { + label: "Status", + input: status, + ..Default::default() + } + .into_node() +} + +#[inline(always)] +fn issue_status_select_option<'l>(is: &'l IssueStatus) -> StyledSelectChild<'l> { + StyledSelectChild { + value: is.id as u32, + class_list: is.name.as_str(), + text: Some(is.name.as_str()), + name: Some("status"), + ..Default::default() + } +} + +#[inline(always)] +fn reporters_select( + model: &Model, + payload: &UpdateIssuePayload, + reporter_state: &StyledSelectState, +) -> Node { + let reporter = StyledSelect { + id: FieldId::EditIssueModal(EditIssueModalSection::Issue(IssueFieldId::Reporter)), + name: "reporter", + opened: reporter_state.opened, + variant: SelectVariant::Empty, + text_filter: reporter_state.text_filter.as_str(), + options: Some(model.users.iter().map(reporter_select_option)), + selected: model + .users + .iter() + .filter(|user| payload.reporter_id == user.id) + .map(reporter_select_option) + .collect(), + ..Default::default() + } + .into_node(); + StyledField { + label: "Reporter", + input: reporter, + ..Default::default() + } + .into_node() +} + +#[inline(always)] +fn reporter_select_option<'l>(user: &'l User) -> StyledSelectChild<'l> { + StyledSelectChild { + value: user.id as u32, + icon: Some( + StyledAvatar { + size: 20, + name: &user.name, + avatar_url: user.avatar_url.as_deref(), + ..StyledAvatar::default() + } + .into_node(), + ), + text: Some(user.name.as_str()), + name: Some("reporter"), + ..Default::default() + } +} + +#[inline(always)] +fn assignees_select( + model: &Model, + payload: &UpdateIssuePayload, + assignees_state: &StyledSelectState, +) -> Node { + let assignees = StyledSelect { + id: FieldId::EditIssueModal(EditIssueModalSection::Issue(IssueFieldId::Assignees)), + name: "assignees", + variant: SelectVariant::Empty, + is_multi: true, + opened: assignees_state.opened, + text_filter: assignees_state.text_filter.as_str(), + options: Some(model.users.iter().map(assignee_select_option)), + selected: model + .users + .iter() + .filter(|user| payload.user_ids.contains(&user.id)) + .map(assignee_select_option) + .collect(), + ..Default::default() + } + .into_node(); + StyledField { + input: assignees, + label: "Assignees", + ..Default::default() + } + .into_node() +} + +#[inline(always)] +fn assignee_select_option<'l>(user: &'l User) -> StyledSelectChild<'l> { + StyledSelectChild { + value: user.id as u32, + icon: Some( + StyledAvatar { + size: 20, + name: &user.name, + avatar_url: user.avatar_url.as_deref(), + ..StyledAvatar::default() + } + .into_node(), + ), + text: Some(user.name.as_str()), + name: Some("assignees"), + ..Default::default() + } +} diff --git a/jirs-client/src/modals/issues_edit/view/comments.rs b/jirs-client/src/modals/issues_edit/view/comments.rs index a95e1a2a..8e94c07f 100644 --- a/jirs-client/src/modals/issues_edit/view/comments.rs +++ b/jirs-client/src/modals/issues_edit/view/comments.rs @@ -1,19 +1,14 @@ -use { - crate::{ - components::{ - styled_avatar::StyledAvatar, styled_button::StyledButton, - styled_textarea::StyledTextarea, - }, - modals::issues_edit::Model as EditIssueModal, - model::{CommentForm, ModalType, Model}, - shared::ToNode, - EditIssueModalSection, FieldChange, FieldId, Msg, - }, - jirs_data::{Comment, CommentFieldId}, - seed::{prelude::*, *}, -}; +use jirs_data::{Comment, CommentFieldId}; +use seed::prelude::*; +use seed::*; -use crate::components::styled_button::ButtonVariant; +use crate::components::styled_avatar::StyledAvatar; +use crate::components::styled_button::{ButtonVariant, StyledButton}; +use crate::components::styled_textarea::StyledTextarea; +use crate::modals::issues_edit::Model as EditIssueModal; +use crate::model::{CommentForm, ModalType, Model}; +use crate::shared::ToNode; +use crate::{EditIssueModalSection, FieldChange, FieldId, Msg}; pub fn build_comment_form(form: &CommentForm) -> Vec> { let submit_comment_form = mouse_ev(Ev::Click, move |ev| { diff --git a/jirs-client/src/modals/mod.rs b/jirs-client/src/modals/mod.rs index 87392fd5..87788ea8 100644 --- a/jirs-client/src/modals/mod.rs +++ b/jirs-client/src/modals/mod.rs @@ -1,4 +1,6 @@ -pub use {epic_field::*, update::*, view::*}; +pub use epic_field::*; +pub use update::*; +pub use view::*; pub mod comments_delete; #[cfg(debug_assertions)] diff --git a/jirs-client/src/modals/time_tracking/mod.rs b/jirs-client/src/modals/time_tracking/mod.rs index aecce944..bc6b2959 100644 --- a/jirs-client/src/modals/time_tracking/mod.rs +++ b/jirs-client/src/modals/time_tracking/mod.rs @@ -1,4 +1,6 @@ -pub use {model::*, update::*, view::*}; +pub use model::*; +pub use update::*; +pub use view::*; mod model; mod update; diff --git a/jirs-client/src/modals/time_tracking/view.rs b/jirs-client/src/modals/time_tracking/view.rs index b5883657..8d1f0646 100644 --- a/jirs-client/src/modals/time_tracking/view.rs +++ b/jirs-client/src/modals/time_tracking/view.rs @@ -1,22 +1,17 @@ -use { - crate::{ - components::{ - styled_button::StyledButton, - styled_field::StyledField, - styled_input::{StyledInput, StyledInputState}, - styled_modal::StyledModal, - styled_select::{StyledSelect, StyledSelectState}, - }, - model::Model, - shared::{ - tracking_widget::{fibonacci_values, tracking_widget}, - ToChild, ToNode, - }, - EditIssueModalSection, FieldId, Msg, - }, - jirs_data::{IssueFieldId, IssueId, TimeTracking}, - seed::{prelude::*, *}, -}; +use jirs_data::{IssueFieldId, IssueId, TimeTracking}; +use seed::prelude::*; +use seed::*; + +use crate::components::styled_button::StyledButton; +use crate::components::styled_field::StyledField; +use crate::components::styled_input::{StyledInput, StyledInputState}; +use crate::components::styled_modal::StyledModal; +use crate::components::styled_select::{StyledSelect, StyledSelectState}; +use crate::components::styled_select_child::StyledSelectChild; +use crate::model::Model; +use crate::shared::tracking_widget::{fibonacci_value_name, fibonacci_values, tracking_widget}; +use crate::shared::ToNode; +use crate::{EditIssueModalSection, FieldId, Msg}; pub fn value_for_time_tracking(v: &Option, time_tracking_type: &TimeTracking) -> String { match (time_tracking_type, v.as_ref()) { @@ -85,7 +80,7 @@ pub fn view(model: &Model, modal: &super::Model) -> Node { .into_node() } -#[inline] +#[inline(always)] pub fn time_tracking_field( time_tracking_type: TimeTracking, field_id: FieldId, @@ -101,12 +96,18 @@ pub fn time_tracking_field( selected: select_state .values .iter() - .map(|n| (*n).to_child()) + .copied() + .map(fibonacci_value_select_option) .collect(), text_filter: select_state.text_filter.as_str(), opened: select_state.opened, - options: Some(fibonacci_values.iter().map(|v| v.to_child())), + options: Some( + fibonacci_values + .iter() + .copied() + .map(fibonacci_value_select_option), + ), ..Default::default() } .into_node(), @@ -125,3 +126,14 @@ pub fn time_tracking_field( } .into_node() } + +fn fibonacci_value_select_option<'l>(value: u32) -> StyledSelectChild<'l> { + let name = fibonacci_value_name(value); + + StyledSelectChild { + class_list: name, + text: Some(name), + value, + ..Default::default() + } +} diff --git a/jirs-client/src/modals/update.rs b/jirs-client/src/modals/update.rs index d20a0118..1f8b0416 100644 --- a/jirs-client/src/modals/update.rs +++ b/jirs-client/src/modals/update.rs @@ -1,14 +1,11 @@ -use jirs_data::{CommentId, IssueStatusId}; -use { - crate::{ - model::{ModalType, Model, Page}, - shared::go_to_board, - ws::send_ws_msg, - FieldChange, FieldId, Msg, OperationKind, ResourceKind, - }, - jirs_data::{EpicId, IssueId, TimeTracking, WsMsg}, - seed::{prelude::*, *}, -}; +use jirs_data::{CommentId, EpicId, IssueId, IssueStatusId, TimeTracking, WsMsg}; +use seed::prelude::*; +use seed::*; + +use crate::model::{ModalType, Model, Page}; +use crate::shared::go_to_board; +use crate::ws::send_ws_msg; +use crate::{FieldChange, FieldId, Msg, OperationKind, ResourceKind}; pub fn update(msg: &Msg, model: &mut Model, orders: &mut impl Orders) { match msg { diff --git a/jirs-client/src/modals/view.rs b/jirs-client/src/modals/view.rs index 02db71a7..6a0dc472 100644 --- a/jirs-client/src/modals/view.rs +++ b/jirs-client/src/modals/view.rs @@ -1,7 +1,8 @@ -use { - crate::{model::*, Msg}, - seed::{prelude::*, *}, -}; +use seed::prelude::*; +use seed::*; + +use crate::model::*; +use crate::Msg; pub fn view(model: &Model) -> Node { let nodes = model diff --git a/jirs-client/src/model.rs b/jirs-client/src/model.rs index 3c1b157c..a7696fbd 100644 --- a/jirs-client/src/model.rs +++ b/jirs-client/src/model.rs @@ -1,20 +1,21 @@ -use { - crate::{ - components::styled_select::StyledSelectState, - pages::{ - invite_page::InvitePage, profile_page::model::ProfilePage, - project_page::model::ProjectPage, project_settings_page::ProjectSettingsPage, - reports_page::model::ReportsPage, sign_in_page::model::SignInPage, - sign_up_page::model::SignUpPage, users_page::model::UsersPage, - }, - Msg, - }, - jirs_data::*, - seed::{app::Orders, browser::web_socket::WebSocket}, - serde::{Deserialize, Serialize}, - std::collections::hash_map::HashMap, - uuid::Uuid, -}; +use std::collections::hash_map::HashMap; + +use jirs_data::*; +use seed::app::Orders; +use seed::browser::web_socket::WebSocket; +use serde::{Deserialize, Serialize}; +use uuid::Uuid; + +use crate::components::styled_select::StyledSelectState; +use crate::pages::invite_page::InvitePage; +use crate::pages::profile_page::model::ProfilePage; +use crate::pages::project_page::model::ProjectPage; +use crate::pages::project_settings_page::ProjectSettingsPage; +use crate::pages::reports_page::model::ReportsPage; +use crate::pages::sign_in_page::model::SignInPage; +use crate::pages::sign_up_page::model::SignUpPage; +use crate::pages::users_page::model::UsersPage; +use crate::Msg; pub trait IssueModal { fn epic_id_value(&self) -> Option; diff --git a/jirs-client/src/pages/invite_page/mod.rs b/jirs-client/src/pages/invite_page/mod.rs index aecce944..bc6b2959 100644 --- a/jirs-client/src/pages/invite_page/mod.rs +++ b/jirs-client/src/pages/invite_page/mod.rs @@ -1,4 +1,6 @@ -pub use {model::*, update::*, view::*}; +pub use model::*; +pub use update::*; +pub use view::*; mod model; mod update; diff --git a/jirs-client/src/pages/invite_page/update.rs b/jirs-client/src/pages/invite_page/update.rs index 0c064120..98991df7 100644 --- a/jirs-client/src/pages/invite_page/update.rs +++ b/jirs-client/src/pages/invite_page/update.rs @@ -1,15 +1,15 @@ -use { - crate::{ - authorize_or_redirect, - model::{Model, Page, PageContent}, - pages::invite_page::InvitePage, - shared::write_auth_token, - ws::send_ws_msg, - FieldId, InvitationPageChange, Msg, PageChanged, WebSocketChanged, - }, - jirs_data::{fields::*, WsMsg}, - seed::prelude::*, - std::str::FromStr, +use std::str::FromStr; + +use jirs_data::fields::*; +use jirs_data::WsMsg; +use seed::prelude::*; + +use crate::model::{Model, Page, PageContent}; +use crate::pages::invite_page::InvitePage; +use crate::shared::write_auth_token; +use crate::ws::send_ws_msg; +use crate::{ + authorize_or_redirect, FieldId, InvitationPageChange, Msg, PageChanged, WebSocketChanged, }; pub fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders) { diff --git a/jirs-client/src/pages/invite_page/view.rs b/jirs-client/src/pages/invite_page/view.rs index 561501d9..19a11cb8 100644 --- a/jirs-client/src/pages/invite_page/view.rs +++ b/jirs-client/src/pages/invite_page/view.rs @@ -1,21 +1,16 @@ -use { - crate::{ - components::{ - styled_button::StyledButton, styled_field::StyledField, styled_form::StyledForm, - styled_input::StyledInput, - }, - match_page, - model::{Model, PageContent}, - pages::invite_page::InvitePage, - shared::{outer_layout, ToNode}, - validations::is_token, - FieldId, InvitationPageChange, Msg, PageChanged, - }, - jirs_data::fields::*, - seed::{prelude::*, *}, -}; +use jirs_data::fields::*; +use seed::prelude::*; +use seed::*; -use crate::components::styled_button::ButtonVariant; +use crate::components::styled_button::{ButtonVariant, StyledButton}; +use crate::components::styled_field::StyledField; +use crate::components::styled_form::StyledForm; +use crate::components::styled_input::StyledInput; +use crate::model::{Model, PageContent}; +use crate::pages::invite_page::InvitePage; +use crate::shared::{outer_layout, ToNode}; +use crate::validations::is_token; +use crate::{match_page, FieldId, InvitationPageChange, Msg, PageChanged}; pub fn view(model: &Model) -> Node { let page = match_page!(model, Invite; Empty); diff --git a/jirs-client/src/pages/profile_page/mod.rs b/jirs-client/src/pages/profile_page/mod.rs index 672d9947..c9c79f74 100644 --- a/jirs-client/src/pages/profile_page/mod.rs +++ b/jirs-client/src/pages/profile_page/mod.rs @@ -1,4 +1,6 @@ -pub use {model::*, update::*, view::*}; +pub use model::*; +pub use update::*; +pub use view::*; pub mod model; pub mod update; diff --git a/jirs-client/src/pages/profile_page/model.rs b/jirs-client/src/pages/profile_page/model.rs index 11509402..e693670f 100644 --- a/jirs-client/src/pages/profile_page/model.rs +++ b/jirs-client/src/pages/profile_page/model.rs @@ -1,13 +1,9 @@ -use { - crate::{ - components::{ - styled_image_input::StyledImageInputState, styled_input::StyledInputState, - styled_select::StyledSelectState, - }, - FieldId, - }, - jirs_data::{ProjectId, User, UsersFieldId}, -}; +use jirs_data::{ProjectId, User, UsersFieldId}; + +use crate::components::styled_image_input::StyledImageInputState; +use crate::components::styled_input::StyledInputState; +use crate::components::styled_select::StyledSelectState; +use crate::FieldId; #[derive(Debug)] pub struct ProfilePage { diff --git a/jirs-client/src/pages/profile_page/update.rs b/jirs-client/src/pages/profile_page/update.rs index 320f9647..10f7cf98 100644 --- a/jirs-client/src/pages/profile_page/update.rs +++ b/jirs-client/src/pages/profile_page/update.rs @@ -1,15 +1,13 @@ -use { - crate::{ - components::styled_select::StyledSelectChanged, - model::{Model, Page, PageContent}, - pages::profile_page::model::ProfilePage, - ws::{board_load, send_ws_msg}, - FieldId, Msg, OperationKind, PageChanged, ProfilePageChange, ResourceKind, - WebSocketChanged, - }, - jirs_data::{ProjectId, User, UsersFieldId, WsMsg}, - seed::prelude::{Method, Orders, Request}, - web_sys::FormData, +use jirs_data::{ProjectId, User, UsersFieldId, WsMsg}; +use seed::prelude::{Method, Orders, Request}; +use web_sys::FormData; + +use crate::components::styled_select::StyledSelectChanged; +use crate::model::{Model, Page, PageContent}; +use crate::pages::profile_page::model::ProfilePage; +use crate::ws::{board_load, send_ws_msg}; +use crate::{ + FieldId, Msg, OperationKind, PageChanged, ProfilePageChange, ResourceKind, WebSocketChanged, }; pub fn update(msg: Msg, model: &mut crate::model::Model, orders: &mut impl Orders) { diff --git a/jirs-client/src/pages/profile_page/view.rs b/jirs-client/src/pages/profile_page/view.rs index 2b471f5f..d768449f 100644 --- a/jirs-client/src/pages/profile_page/view.rs +++ b/jirs-client/src/pages/profile_page/view.rs @@ -1,23 +1,20 @@ -use { - crate::{ - components::{ - styled_button::StyledButton, styled_field::StyledField, styled_form::StyledForm, - styled_image_input::StyledImageInput, styled_input::StyledInput, - styled_select::StyledSelect, - }, - model::{Model, PageContent}, - pages::profile_page::model::ProfilePage, - shared::{inner_layout, ToChild, ToNode}, - FieldId, Msg, PageChanged, ProfilePageChange, - }, - jirs_data::*, - seed::{prelude::*, *}, - std::collections::HashMap, -}; +use std::collections::HashMap; -use crate::components::styled_button::ButtonVariant; -use crate::components::styled_input::InputVariant; -use crate::components::styled_select::SelectVariant; +use jirs_data::*; +use seed::prelude::*; +use seed::*; + +use crate::components::styled_button::{ButtonVariant, StyledButton}; +use crate::components::styled_field::StyledField; +use crate::components::styled_form::StyledForm; +use crate::components::styled_image_input::StyledImageInput; +use crate::components::styled_input::{InputVariant, StyledInput}; +use crate::components::styled_select::{SelectVariant, StyledSelect}; +use crate::components::styled_select_child::StyledSelectChild; +use crate::model::{Model, PageContent}; +use crate::pages::profile_page::model::ProfilePage; +use crate::shared::{inner_layout, ToNode}; +use crate::{FieldId, Msg, PageChanged, ProfilePageChange}; pub fn view(model: &Model) -> Node { let page = match &model.page_content { @@ -74,7 +71,11 @@ pub fn view(model: &Model) -> Node { ..Default::default() } .into_node(); - let submit_field = StyledField::build().input(submit).build().into_node(); + let submit_field = StyledField { + input: submit, + ..Default::default() + } + .into_node(); let content = StyledForm::build() .heading("Profile") @@ -118,13 +119,19 @@ fn build_current_project(model: &Model, page: &ProfilePage) -> Node { text_filter: page.current_project.text_filter.as_str(), variant: SelectVariant::Normal, options: Some(model.projects.iter().filter_map(|project| { - joined_projects.get(&project.id).map(|_| project.to_child()) + joined_projects + .get(&project.id) + .map(|_| project_select_option(project)) })), selected: page .current_project .values .iter() - .filter_map(|id| project_by_id.get(&((*id) as i32)).map(|p| p.to_child())) + .filter_map(|id| { + project_by_id + .remove(&((*id) as i32)) + .map(project_select_option) + }) .collect(), ..Default::default() } @@ -137,3 +144,11 @@ fn build_current_project(model: &Model, page: &ProfilePage) -> Node { } .into_node() } + +fn project_select_option<'l>(project: &'l Project) -> StyledSelectChild<'l> { + StyledSelectChild { + text: Some(project.name.as_str()), + value: project.id as u32, + ..Default::default() + } +} diff --git a/jirs-client/src/pages/project_page/mod.rs b/jirs-client/src/pages/project_page/mod.rs index 672d9947..c9c79f74 100644 --- a/jirs-client/src/pages/project_page/mod.rs +++ b/jirs-client/src/pages/project_page/mod.rs @@ -1,4 +1,6 @@ -pub use {model::*, update::*, view::*}; +pub use model::*; +pub use update::*; +pub use view::*; pub mod model; pub mod update; diff --git a/jirs-client/src/pages/project_page/model.rs b/jirs-client/src/pages/project_page/model.rs index 1792786f..70de1acc 100644 --- a/jirs-client/src/pages/project_page/model.rs +++ b/jirs-client/src/pages/project_page/model.rs @@ -1,5 +1,9 @@ +use std::collections::HashMap; + use chrono::NaiveDateTime; -use {crate::shared::drag::DragState, jirs_data::*, std::collections::HashMap}; +use jirs_data::*; + +use crate::shared::drag::DragState; #[derive(Default, Debug)] pub struct StatusIssueIds { diff --git a/jirs-client/src/pages/project_page/update.rs b/jirs-client/src/pages/project_page/update.rs index 60dd584b..80226a6c 100644 --- a/jirs-client/src/pages/project_page/update.rs +++ b/jirs-client/src/pages/project_page/update.rs @@ -1,14 +1,12 @@ -use { - crate::{ - components::styled_select::StyledSelectChanged, - model::{Model, Page, PageContent}, - pages::project_page::model::ProjectPage, - ws::{board_load, send_ws_msg}, - BoardPageChange, EditIssueModalSection, FieldId, Msg, OperationKind, PageChanged, - ResourceKind, - }, - jirs_data::*, - seed::prelude::Orders, +use jirs_data::*; +use seed::prelude::Orders; + +use crate::components::styled_select::StyledSelectChanged; +use crate::model::{Model, Page, PageContent}; +use crate::pages::project_page::model::ProjectPage; +use crate::ws::{board_load, send_ws_msg}; +use crate::{ + BoardPageChange, EditIssueModalSection, FieldId, Msg, OperationKind, PageChanged, ResourceKind, }; pub fn update(msg: Msg, model: &mut crate::model::Model, orders: &mut impl Orders) { diff --git a/jirs-client/src/pages/project_page/view.rs b/jirs-client/src/pages/project_page/view.rs index b8140ea3..d08abbf3 100644 --- a/jirs-client/src/pages/project_page/view.rs +++ b/jirs-client/src/pages/project_page/view.rs @@ -1,12 +1,11 @@ -use { - crate::{ - components::{styled_button::StyledButton, styled_icon::Icon}, - model::Model, - shared::{inner_layout, ToNode}, - Msg, - }, - seed::{prelude::*, *}, -}; +use seed::prelude::*; +use seed::*; + +use crate::components::styled_button::StyledButton; +use crate::components::styled_icon::Icon; +use crate::model::Model; +use crate::shared::{inner_layout, ToNode}; +use crate::Msg; mod board; mod filters; diff --git a/jirs-client/src/pages/project_page/view/board.rs b/jirs-client/src/pages/project_page/view/board.rs index f13f97e4..9abef93a 100644 --- a/jirs-client/src/pages/project_page/view/board.rs +++ b/jirs-client/src/pages/project_page/view/board.rs @@ -1,15 +1,13 @@ -use { - crate::{ - components::{styled_avatar::*, styled_button::StyledButton, styled_icon::*}, - model::PageContent, - shared::ToNode, - BoardPageChange, Model, Msg, Page, PageChanged, - }, - jirs_data::*, - seed::{prelude::*, *}, -}; +use jirs_data::*; +use seed::prelude::*; +use seed::*; -use crate::components::styled_button::ButtonVariant; +use crate::components::styled_avatar::*; +use crate::components::styled_button::{ButtonVariant, StyledButton}; +use crate::components::styled_icon::*; +use crate::model::PageContent; +use crate::shared::ToNode; +use crate::{BoardPageChange, Model, Msg, Page, PageChanged}; pub fn project_board_lists(model: &Model) -> Node { let project_page = match &model.page_content { diff --git a/jirs-client/src/pages/project_page/view/filters.rs b/jirs-client/src/pages/project_page/view/filters.rs index 1bc6ec63..43c2439e 100644 --- a/jirs-client/src/pages/project_page/view/filters.rs +++ b/jirs-client/src/pages/project_page/view/filters.rs @@ -1,12 +1,13 @@ -use { - crate::{ - components::{styled_avatar::*, styled_button::*, styled_icon::*, styled_input::*}, - model::PageContent, - shared::ToNode, - FieldId, Model, Msg, - }, - seed::{prelude::*, *}, -}; +use seed::prelude::*; +use seed::*; + +use crate::components::styled_avatar::*; +use crate::components::styled_button::*; +use crate::components::styled_icon::*; +use crate::components::styled_input::*; +use crate::model::PageContent; +use crate::shared::ToNode; +use crate::{FieldId, Model, Msg}; pub fn project_board_filters(model: &Model) -> Node { let project_page = match &model.page_content { diff --git a/jirs-client/src/pages/project_settings_page/mod.rs b/jirs-client/src/pages/project_settings_page/mod.rs index aecce944..bc6b2959 100644 --- a/jirs-client/src/pages/project_settings_page/mod.rs +++ b/jirs-client/src/pages/project_settings_page/mod.rs @@ -1,4 +1,6 @@ -pub use {model::*, update::*, view::*}; +pub use model::*; +pub use update::*; +pub use view::*; mod model; mod update; diff --git a/jirs-client/src/pages/project_settings_page/model.rs b/jirs-client/src/pages/project_settings_page/model.rs index ad5139f5..787e9d6a 100644 --- a/jirs-client/src/pages/project_settings_page/model.rs +++ b/jirs-client/src/pages/project_settings_page/model.rs @@ -1,14 +1,10 @@ -use { - crate::{ - components::{ - styled_checkbox::StyledCheckboxState, styled_input::StyledInputState, - styled_select::StyledSelectState, - }, - shared::drag::DragState, - FieldId, - }, - jirs_data::{IssueStatusId, Project, ProjectFieldId, UpdateProjectPayload}, -}; +use jirs_data::{IssueStatusId, Project, ProjectFieldId, UpdateProjectPayload}; + +use crate::components::styled_checkbox::StyledCheckboxState; +use crate::components::styled_input::StyledInputState; +use crate::components::styled_select::StyledSelectState; +use crate::shared::drag::DragState; +use crate::FieldId; #[derive(Debug)] pub struct ProjectSettingsPage { diff --git a/jirs-client/src/pages/project_settings_page/update.rs b/jirs-client/src/pages/project_settings_page/update.rs index 8ecb1cb7..fcaec507 100644 --- a/jirs-client/src/pages/project_settings_page/update.rs +++ b/jirs-client/src/pages/project_settings_page/update.rs @@ -1,16 +1,15 @@ -use { - crate::{ - components::styled_select::StyledSelectChanged, - model::{Model, Page, PageContent}, - pages::project_settings_page::ProjectSettingsPage, - ws::{board_load, send_ws_msg}, - FieldChange::TabChanged, - FieldId, Msg, PageChanged, ProjectPageChange, WebSocketChanged, - }, - jirs_data::{IssueStatus, IssueStatusId, ProjectFieldId, UpdateProjectPayload, WsMsg}, - seed::{error, prelude::Orders}, - std::collections::HashSet, -}; +use std::collections::HashSet; + +use jirs_data::{IssueStatus, IssueStatusId, ProjectFieldId, UpdateProjectPayload, WsMsg}; +use seed::error; +use seed::prelude::Orders; + +use crate::components::styled_select::StyledSelectChanged; +use crate::model::{Model, Page, PageContent}; +use crate::pages::project_settings_page::ProjectSettingsPage; +use crate::ws::{board_load, send_ws_msg}; +use crate::FieldChange::TabChanged; +use crate::{FieldId, Msg, PageChanged, ProjectPageChange, WebSocketChanged}; pub fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders) { if model.page != Page::ProjectSettings { diff --git a/jirs-client/src/pages/project_settings_page/view.rs b/jirs-client/src/pages/project_settings_page/view.rs index 6a037893..2aeb79b2 100644 --- a/jirs-client/src/pages/project_settings_page/view.rs +++ b/jirs-client/src/pages/project_settings_page/view.rs @@ -1,29 +1,23 @@ -use { - crate::{ - components::{ - styled_button::StyledButton, - styled_checkbox::StyledCheckbox, - styled_editor::StyledEditor, - styled_field::StyledField, - styled_form::StyledForm, - styled_icon::{Icon, StyledIcon}, - styled_input::StyledInput, - styled_select::StyledSelect, - styled_textarea::StyledTextarea, - }, - model::{self, ModalType, Model, PageContent}, - pages::project_settings_page::ProjectSettingsPage, - shared::{inner_layout, IntoChild, ToNode}, - FieldId, Msg, PageChanged, ProjectFieldId, ProjectPageChange, - }, - jirs_data::{IssueStatus, ProjectCategory, TimeTracking}, - seed::{prelude::*, *}, - std::collections::HashMap, -}; +use std::collections::HashMap; -use crate::components::styled_button::ButtonVariant; -use crate::components::styled_input::InputVariant; -use crate::components::styled_select::SelectVariant; +use jirs_data::{IssueStatus, ProjectCategory, TimeTracking}; +use seed::prelude::*; +use seed::*; + +use crate::components::styled_button::{ButtonVariant, StyledButton}; +use crate::components::styled_checkbox::{ChildBuilder, StyledCheckbox}; +use crate::components::styled_editor::StyledEditor; +use crate::components::styled_field::StyledField; +use crate::components::styled_form::StyledForm; +use crate::components::styled_icon::{Icon, StyledIcon}; +use crate::components::styled_input::{InputVariant, StyledInput}; +use crate::components::styled_select::{SelectVariant, StyledSelect}; +use crate::components::styled_select_child::StyledSelectChild; +use crate::components::styled_textarea::StyledTextarea; +use crate::model::{self, ModalType, Model, PageContent}; +use crate::pages::project_settings_page::ProjectSettingsPage; +use crate::shared::{inner_layout, ToNode}; +use crate::{FieldId, Msg, PageChanged, ProjectFieldId, ProjectPageChange}; // use crate::shared::styled_rte::StyledRte; @@ -43,8 +37,8 @@ pub fn view(model: &model::Model) -> Node { // let desc_rte = StyledField::build() // .input( - // StyledRte::build(FieldId::ProjectSettings(ProjectFieldId::Description)) - // .state(&page.description_rte) + // StyledRte::build(FieldId::ProjectSettings(ProjectFieldId:: + // Description)) .state(&page.description_rte) // .build() // .into_node(), // ) @@ -53,27 +47,7 @@ pub fn view(model: &model::Model) -> Node { let category_field = category_field(page); - let time_tracking = StyledCheckbox::build() - .options( - TimeTracking::default() - .into_iter() - .map(|tt| tt.into_child()), - ) - .state(&page.time_tracking) - .add_class("timeTracking") - .build(FieldId::ProjectSettings(ProjectFieldId::TimeTracking)) - .into_node(); - let time_tracking_type: TimeTracking = page.time_tracking.value.into(); - let time_tracking_field = StyledField { - input: time_tracking, - tip: Some(match time_tracking_type { - TimeTracking::Fibonacci => TIME_TRACKING_FIBONACCI, - TimeTracking::Hourly => TIME_TRACKING_HOURLY, - _ => "", - }), - ..Default::default() - } - .into_node(); + let time_tracking_field = time_tracking_select(&page); let columns_field = columns_section(model, page); @@ -114,6 +88,53 @@ pub fn view(model: &model::Model) -> Node { inner_layout(model, "projectSettings", &project_section) } +#[inline(always)] +fn time_tracking_select(page: &ProjectSettingsPage) -> Node { + let time_tracking = StyledCheckbox::build() + .options( + TimeTracking::default() + .into_iter() + .map(time_tracking_select_option), + ) + .state(&page.time_tracking) + .add_class("timeTracking") + .build(FieldId::ProjectSettings(ProjectFieldId::TimeTracking)) + .into_node(); + let time_tracking_type: TimeTracking = page.time_tracking.value.into(); + StyledField { + input: time_tracking, + tip: Some(match time_tracking_type { + TimeTracking::Fibonacci => TIME_TRACKING_FIBONACCI, + TimeTracking::Hourly => TIME_TRACKING_HOURLY, + _ => "", + }), + ..Default::default() + } + .into_node() +} + +fn time_tracking_select_option<'l>(t: TimeTracking) -> ChildBuilder<'l> { + ChildBuilder { + label: match t { + TimeTracking::Untracked => "No tracking", + TimeTracking::Fibonacci => "Fibonacci (Bad mode)", + TimeTracking::Hourly => "Evil Mode (Hourly)", + }, + name: match t { + TimeTracking::Untracked => "untracked", + TimeTracking::Fibonacci => "fibonacci", + TimeTracking::Hourly => "hourly", + }, + class_list: match t { + TimeTracking::Untracked => "untracked", + TimeTracking::Fibonacci => "fibonacci", + TimeTracking::Hourly => "hourly", + }, + value: t.into(), + ..Default::default() + } +} + /// Build project name input with styled field wrapper fn name_field(page: &ProjectSettingsPage) -> Node { let name = StyledTextarea { @@ -125,12 +146,13 @@ fn name_field(page: &ProjectSettingsPage) -> Node { ..Default::default() } .into_node(); - StyledField::build() - .label("Name") - .input(name) - .tip("") - .build() - .into_node() + StyledField { + label: "Name", + input: name, + tip: Some(""), + ..Default::default() + } + .into_node() } /// Build project url input with styled field wrapper @@ -144,12 +166,13 @@ fn url_field(page: &ProjectSettingsPage) -> Node { ..Default::default() } .into_node(); - StyledField::build() - .label("Url") - .input(url) - .tip("") - .build() - .into_node() + StyledField { + label: "Url", + input: url, + tip: Some(""), + ..Default::default() + } + .into_node() } /// Build project description text area with styled field wrapper @@ -183,15 +206,11 @@ fn category_field(page: &ProjectSettingsPage) -> Node { options: Some( ProjectCategory::default() .into_iter() - .map(|c| c.into_child()), + .map(category_select_option), ), - selected: vec![page - .payload - .category - .as_ref() - .cloned() - .unwrap_or_default() - .into_child()], + selected: vec![category_select_option( + page.payload.category.as_ref().cloned().unwrap_or_default(), + )], ..Default::default() } .into_node(); @@ -203,6 +222,16 @@ fn category_field(page: &ProjectSettingsPage) -> Node { .into_node() } +#[inline(always)] +fn category_select_option<'l>(pc: ProjectCategory) -> StyledSelectChild<'l> { + StyledSelectChild { + class_list: pc.to_str(), + text: Some(pc.to_str()), + value: pc.into(), + ..Default::default() + } +} + /// Build draggable columns preview with option to remove and add new columns fn columns_section(model: &Model, page: &ProjectSettingsPage) -> Node { let width = 100f64 / (model.issue_statuses.len() + 1) as f64; diff --git a/jirs-client/src/pages/reports_page/mod.rs b/jirs-client/src/pages/reports_page/mod.rs index 672d9947..c9c79f74 100644 --- a/jirs-client/src/pages/reports_page/mod.rs +++ b/jirs-client/src/pages/reports_page/mod.rs @@ -1,4 +1,6 @@ -pub use {model::*, update::*, view::*}; +pub use model::*; +pub use update::*; +pub use view::*; pub mod model; pub mod update; diff --git a/jirs-client/src/pages/reports_page/model.rs b/jirs-client/src/pages/reports_page/model.rs index 82055f3d..0c8a06c8 100644 --- a/jirs-client/src/pages/reports_page/model.rs +++ b/jirs-client/src/pages/reports_page/model.rs @@ -1,4 +1,5 @@ -use chrono::{prelude::*, NaiveDate}; +use chrono::prelude::*; +use chrono::NaiveDate; #[derive(Debug)] pub struct ReportsPage { diff --git a/jirs-client/src/pages/reports_page/update.rs b/jirs-client/src/pages/reports_page/update.rs index 69abede8..b88fe365 100644 --- a/jirs-client/src/pages/reports_page/update.rs +++ b/jirs-client/src/pages/reports_page/update.rs @@ -1,13 +1,10 @@ -use { - crate::{ - changes::{PageChanged, ReportsPageChange}, - model::{Model, Page, PageContent}, - pages::reports_page::model::ReportsPage, - ws::board_load, - Msg, OperationKind, ResourceKind, - }, - seed::prelude::*, -}; +use seed::prelude::*; + +use crate::changes::{PageChanged, ReportsPageChange}; +use crate::model::{Model, Page, PageContent}; +use crate::pages::reports_page::model::ReportsPage; +use crate::ws::board_load; +use crate::{Msg, OperationKind, ResourceKind}; pub fn update(msg: Msg, model: &mut crate::model::Model, orders: &mut impl Orders) { match msg { diff --git a/jirs-client/src/pages/reports_page/view.rs b/jirs-client/src/pages/reports_page/view.rs index b524c19a..7a5b1045 100644 --- a/jirs-client/src/pages/reports_page/view.rs +++ b/jirs-client/src/pages/reports_page/view.rs @@ -1,18 +1,16 @@ -use { - crate::{ - components::{styled_icon::StyledIcon, styled_link::*}, - model::{Model, PageContent}, - pages::reports_page::model::ReportsPage, - shared::{inner_layout, ToNode}, - Msg, PageChanged, ReportsPageChange, - }, - chrono::Datelike, - jirs_data::Issue, - seed::{prelude::*, *}, - std::collections::HashMap, -}; +use std::collections::HashMap; -use crate::components::styled_icon::Icon; +use chrono::Datelike; +use jirs_data::Issue; +use seed::prelude::*; +use seed::*; + +use crate::components::styled_icon::{Icon, StyledIcon}; +use crate::components::styled_link::*; +use crate::model::{Model, PageContent}; +use crate::pages::reports_page::model::ReportsPage; +use crate::shared::{inner_layout, ToNode}; +use crate::{Msg, PageChanged, ReportsPageChange}; const SVG_MARGIN_X: u32 = 10; const SVG_DRAWABLE_HEIGHT: u32 = 300; @@ -59,7 +57,8 @@ fn this_month_graph(page: &ReportsPage, this_month_updated: &[&Issue]) -> Node> = vec![]; - // each piece is part of column drawable view where number of parts depends on number of issues which have largest amount of issues + // each piece is part of column drawable view where number of parts depends on + // number of issues which have largest amount of issues let piece_height = SVG_DRAWABLE_HEIGHT as f64 / dominant as f64; // width reduces by legend divided by number of days let piece_width = (SVG_WIDTH as f64 diff --git a/jirs-client/src/pages/sign_in_page/mod.rs b/jirs-client/src/pages/sign_in_page/mod.rs index 672d9947..c9c79f74 100644 --- a/jirs-client/src/pages/sign_in_page/mod.rs +++ b/jirs-client/src/pages/sign_in_page/mod.rs @@ -1,4 +1,6 @@ -pub use {model::*, update::*, view::*}; +pub use model::*; +pub use update::*; +pub use view::*; pub mod model; pub mod update; diff --git a/jirs-client/src/pages/sign_in_page/update.rs b/jirs-client/src/pages/sign_in_page/update.rs index e4577de0..8971e5bc 100644 --- a/jirs-client/src/pages/sign_in_page/update.rs +++ b/jirs-client/src/pages/sign_in_page/update.rs @@ -1,16 +1,15 @@ -use { - crate::{ - model::{self, Model, Page, PageContent}, - pages::sign_in_page::model::SignInPage, - shared::write_auth_token, - ws::send_ws_msg, - FieldId, Msg, WebSocketChanged, - }, - jirs_data::{SignInFieldId, WsMsg}, - seed::{prelude::*, *}, - std::str::FromStr, - uuid::Uuid, -}; +use std::str::FromStr; + +use jirs_data::{SignInFieldId, WsMsg}; +use seed::prelude::*; +use seed::*; +use uuid::Uuid; + +use crate::model::{self, Model, Page, PageContent}; +use crate::pages::sign_in_page::model::SignInPage; +use crate::shared::write_auth_token; +use crate::ws::send_ws_msg; +use crate::{FieldId, Msg, WebSocketChanged}; pub fn update(msg: Msg, model: &mut model::Model, orders: &mut impl Orders) { if model.page != Page::SignIn { diff --git a/jirs-client/src/pages/sign_in_page/view.rs b/jirs-client/src/pages/sign_in_page/view.rs index 8a0d1b14..db86e15d 100644 --- a/jirs-client/src/pages/sign_in_page/view.rs +++ b/jirs-client/src/pages/sign_in_page/view.rs @@ -1,22 +1,16 @@ -use { - crate::{ - components::{ - styled_button::StyledButton, - styled_field::StyledField, - styled_form::StyledForm, - styled_icon::{Icon, StyledIcon}, - styled_input::StyledInput, - styled_link::StyledLink, - }, - model::{self, PageContent}, - shared::{outer_layout, ToNode}, - validations::{is_email, is_token}, - FieldId, Msg, SignInFieldId, - }, - seed::{prelude::*, *}, -}; +use seed::prelude::*; +use seed::*; -use crate::components::styled_button::ButtonVariant; +use crate::components::styled_button::{ButtonVariant, StyledButton}; +use crate::components::styled_field::StyledField; +use crate::components::styled_form::StyledForm; +use crate::components::styled_icon::{Icon, StyledIcon}; +use crate::components::styled_input::StyledInput; +use crate::components::styled_link::StyledLink; +use crate::model::{self, PageContent}; +use crate::shared::{outer_layout, ToNode}; +use crate::validations::{is_email, is_token}; +use crate::{FieldId, Msg, SignInFieldId}; pub fn view(model: &model::Model) -> Node { let page = match &model.page_content { @@ -31,11 +25,12 @@ pub fn view(model: &model::Model) -> Node { ..Default::default() } .into_node(); - let username_field = StyledField::build() - .label("Username") - .input(username) - .build() - .into_node(); + let username_field = StyledField { + label: "Username", + input: username, + ..Default::default() + } + .into_node(); let email = StyledInput { value: page.email.as_str(), @@ -44,11 +39,12 @@ pub fn view(model: &model::Model) -> Node { ..Default::default() } .into_node(); - let email_field = StyledField::build() - .label("E-Mail") - .input(email) - .build() - .into_node(); + let email_field = StyledField { + label: "E-Mail", + input: email, + ..Default::default() + } + .into_node(); let submit = if page.login_success { StyledButton { @@ -109,11 +105,12 @@ pub fn view(model: &model::Model) -> Node { is_valid_token(page.token_touched, page.token.as_str()), ) .into_node(); - let token_field = StyledField::build() - .label("Single use token") - .input(token) - .build() - .into_node(); + let token_field = StyledField { + label: "Single use token", + input: token, + ..Default::default() + } + .into_node(); let submit_token = StyledButton { variant: ButtonVariant::Primary, text: Some("Authorize"), @@ -121,7 +118,11 @@ pub fn view(model: &model::Model) -> Node { ..Default::default() } .into_node(); - let submit_token_field = StyledField::build().input(submit_token).build().into_node(); + let submit_token_field = StyledField { + input: submit_token, + ..Default::default() + } + .into_node(); let bind_token_form = StyledForm::build() .on_submit(ev(Ev::Submit, |ev| { diff --git a/jirs-client/src/pages/sign_up_page/mod.rs b/jirs-client/src/pages/sign_up_page/mod.rs index 672d9947..c9c79f74 100644 --- a/jirs-client/src/pages/sign_up_page/mod.rs +++ b/jirs-client/src/pages/sign_up_page/mod.rs @@ -1,4 +1,6 @@ -pub use {model::*, update::*, view::*}; +pub use model::*; +pub use update::*; +pub use view::*; pub mod model; pub mod update; diff --git a/jirs-client/src/pages/sign_up_page/update.rs b/jirs-client/src/pages/sign_up_page/update.rs index a27ea6c1..6f1a17be 100644 --- a/jirs-client/src/pages/sign_up_page/update.rs +++ b/jirs-client/src/pages/sign_up_page/update.rs @@ -1,13 +1,10 @@ -use { - crate::{ - model::{self, Model, Page, PageContent}, - pages::sign_up_page::model::SignUpPage, - ws::send_ws_msg, - FieldId, Msg, WebSocketChanged, - }, - jirs_data::{SignUpFieldId, WsMsg}, - seed::prelude::*, -}; +use jirs_data::{SignUpFieldId, WsMsg}; +use seed::prelude::*; + +use crate::model::{self, Model, Page, PageContent}; +use crate::pages::sign_up_page::model::SignUpPage; +use crate::ws::send_ws_msg; +use crate::{FieldId, Msg, WebSocketChanged}; pub fn update(msg: Msg, model: &mut model::Model, orders: &mut impl Orders) { if model.page != Page::SignUp { diff --git a/jirs-client/src/pages/sign_up_page/view.rs b/jirs-client/src/pages/sign_up_page/view.rs index 9fb122a0..d2ec359a 100644 --- a/jirs-client/src/pages/sign_up_page/view.rs +++ b/jirs-client/src/pages/sign_up_page/view.rs @@ -1,24 +1,17 @@ -use { - crate::{ - components::{ - styled_button::StyledButton, - styled_field::StyledField, - styled_form::StyledForm, - styled_icon::{Icon, StyledIcon}, - styled_input::StyledInput, - styled_link::StyledLink, - }, - match_page, - model::{self, PageContent}, - shared::{outer_layout, ToNode}, - validations::is_email, - FieldId, Msg, - }, - jirs_data::SignUpFieldId, - seed::{prelude::*, *}, -}; +use jirs_data::SignUpFieldId; +use seed::prelude::*; +use seed::*; -use crate::components::styled_button::ButtonVariant; +use crate::components::styled_button::{ButtonVariant, StyledButton}; +use crate::components::styled_field::StyledField; +use crate::components::styled_form::StyledForm; +use crate::components::styled_icon::{Icon, StyledIcon}; +use crate::components::styled_input::StyledInput; +use crate::components::styled_link::StyledLink; +use crate::model::{self, PageContent}; +use crate::shared::{outer_layout, ToNode}; +use crate::validations::is_email; +use crate::{match_page, FieldId, Msg}; pub fn view(model: &model::Model) -> Node { let page = match_page!(model, SignUp; Empty); diff --git a/jirs-client/src/pages/users_page/mod.rs b/jirs-client/src/pages/users_page/mod.rs index 672d9947..c9c79f74 100644 --- a/jirs-client/src/pages/users_page/mod.rs +++ b/jirs-client/src/pages/users_page/mod.rs @@ -1,4 +1,6 @@ -pub use {model::*, update::*, view::*}; +pub use model::*; +pub use update::*; +pub use view::*; pub mod model; pub mod update; diff --git a/jirs-client/src/pages/users_page/model.rs b/jirs-client/src/pages/users_page/model.rs index 85d85e66..1592d08b 100644 --- a/jirs-client/src/pages/users_page/model.rs +++ b/jirs-client/src/pages/users_page/model.rs @@ -1,7 +1,8 @@ -use { - crate::{components::styled_select::StyledSelectState, model::InvitationFormState, FieldId}, - jirs_data::{Invitation, User, UserRole, UsersFieldId}, -}; +use jirs_data::{Invitation, User, UserRole, UsersFieldId}; + +use crate::components::styled_select::StyledSelectState; +use crate::model::InvitationFormState; +use crate::FieldId; #[derive(Debug)] pub struct UsersPage { diff --git a/jirs-client/src/pages/users_page/update.rs b/jirs-client/src/pages/users_page/update.rs index 75d30c80..5a5610ac 100644 --- a/jirs-client/src/pages/users_page/update.rs +++ b/jirs-client/src/pages/users_page/update.rs @@ -1,14 +1,12 @@ -use { - crate::{ - components::styled_select::StyledSelectChanged, - model::{InvitationFormState, Model, Page, PageContent}, - pages::users_page::model::UsersPage, - ws::{invitation_load, send_ws_msg}, - FieldId, Msg, PageChanged, UsersPageChange, WebSocketChanged, - }, - jirs_data::{InvitationState, UserRole, UsersFieldId, WsMsg}, - seed::{log, prelude::Orders}, -}; +use jirs_data::{InvitationState, UserRole, UsersFieldId, WsMsg}; +use seed::log; +use seed::prelude::Orders; + +use crate::components::styled_select::StyledSelectChanged; +use crate::model::{InvitationFormState, Model, Page, PageContent}; +use crate::pages::users_page::model::UsersPage; +use crate::ws::{invitation_load, send_ws_msg}; +use crate::{FieldId, Msg, PageChanged, UsersPageChange, WebSocketChanged}; pub fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders) { log!(model); diff --git a/jirs-client/src/pages/users_page/view.rs b/jirs-client/src/pages/users_page/view.rs index c0588f70..206ab076 100644 --- a/jirs-client/src/pages/users_page/view.rs +++ b/jirs-client/src/pages/users_page/view.rs @@ -1,21 +1,18 @@ -use { - crate::{ - components::{ - styled_button::StyledButton, styled_field::StyledField, styled_form::StyledForm, - styled_input::StyledInput, styled_select::StyledSelect, - }, - model::{InvitationFormState, Model, PageContent}, - shared::{inner_layout, IntoChild, ToNode}, - validations::is_email, - FieldId, Msg, PageChanged, UsersPageChange, - }, - jirs_data::{InvitationState, UserRole, UsersFieldId}, - seed::{prelude::*, *}, -}; +use jirs_data::{InvitationState, UserRole, UsersFieldId}; +use seed::prelude::*; +use seed::*; -use crate::components::styled_button::ButtonVariant; -use crate::components::styled_input::InputVariant; -use crate::components::styled_select::SelectVariant; +use crate::components::styled_button::{ButtonVariant, StyledButton}; +use crate::components::styled_field::StyledField; +use crate::components::styled_form::StyledForm; +use crate::components::styled_input::{InputVariant, StyledInput}; +use crate::components::styled_select::{SelectVariant, StyledSelect}; +use crate::components::styled_select_child::StyledSelectChild; +use crate::model::{InvitationFormState, Model, PageContent}; +use crate::pages::users_page::UsersPage; +use crate::shared::{inner_layout, ToNode}; +use crate::validations::is_email; +use crate::{FieldId, Msg, PageChanged, UsersPageChange}; pub fn view(model: &Model) -> Node { let page = match &model.page_content { @@ -53,27 +50,7 @@ pub fn view(model: &Model) -> Node { } .into_node(); - let user_role = StyledSelect { - id: FieldId::Users(UsersFieldId::UserRole), - name: "user_role", - valid: true, - variant: SelectVariant::Normal, - text_filter: page.user_role_state.text_filter.as_str(), - opened: page.user_role_state.opened, - selected: vec![page.user_role.into_child()], - options: Some( - UserRole::default() - .into_iter() - .map(|role| role.into_child()), - ), - ..Default::default() - } - .into_node(); - let user_role_field = StyledField::build() - .input(user_role) - .label("Role") - .build() - .into_node(); + let user_role_field = user_role_select(page); let submit = StyledButton { text: Some("Invite user"), @@ -99,10 +76,11 @@ pub fn view(model: &Model) -> Node { InvitationFormState::Failed => div![C!["error"], "There was an error"], _ => empty![], }; - let submit_field = StyledField::build() - .input(div![C!["invitationActions"], submit, submit_supplement]) - .build() - .into_node(); + let submit_field = StyledField { + input: div![C!["invitationActions"], submit, submit_supplement], + ..Default::default() + } + .into_node(); let form = StyledForm::build() .heading("Invite new user") @@ -172,7 +150,7 @@ pub fn view(model: &Model) -> Node { // .build() // .into_node(); li![ - C!["invitation", format!("{}", invitation.state)], + C!["invitation", invitation.state.to_str()], span![invitation.name.as_str()], span![invitation.email.as_str()], span![format!("{}", invitation.state)], @@ -189,3 +167,36 @@ pub fn view(model: &Model) -> Node { inner_layout(model, "users", &[form, users_section, invitations_section]) } + +#[inline(always)] +fn user_role_select(page: &UsersPage) -> Node { + let user_role = StyledSelect { + id: FieldId::Users(UsersFieldId::UserRole), + name: "user_role", + valid: true, + variant: SelectVariant::Normal, + text_filter: page.user_role_state.text_filter.as_str(), + opened: page.user_role_state.opened, + selected: vec![user_role_select_option(page.user_role)], + options: Some(UserRole::default().into_iter().map(user_role_select_option)), + ..Default::default() + } + .into_node(); + StyledField { + input: user_role, + label: "Role", + ..Default::default() + } + .into_node() +} + +fn user_role_select_option<'l>(ur: UserRole) -> StyledSelectChild<'l> { + let name = ur.to_str(); + + StyledSelectChild { + text: Some(name), + value: ur.into(), + class_list: name, + ..Default::default() + } +} diff --git a/jirs-client/src/shared/aside.rs b/jirs-client/src/shared/aside.rs index 56169790..4f2043dc 100644 --- a/jirs-client/src/shared/aside.rs +++ b/jirs-client/src/shared/aside.rs @@ -1,14 +1,12 @@ -use { - crate::{ - components::styled_icon::{Icon, StyledIcon}, - model::{Model, Page}, - shared::{divider, ToNode}, - ws::enqueue_ws_msg, - Msg, OperationKind, ResourceKind, - }, - jirs_data::{UserRole, WsMsg}, - seed::{prelude::*, *}, -}; +use jirs_data::{UserRole, WsMsg}; +use seed::prelude::*; +use seed::*; + +use crate::components::styled_icon::{Icon, StyledIcon}; +use crate::model::{Model, Page}; +use crate::shared::{divider, ToNode}; +use crate::ws::enqueue_ws_msg; +use crate::{Msg, OperationKind, ResourceKind}; pub fn update(msg: &Msg, model: &mut Model, orders: &mut impl Orders) { if let Msg::ResourceChanged(ResourceKind::Auth, OperationKind::SingleLoaded, _) = msg { diff --git a/jirs-client/src/shared/mod.rs b/jirs-client/src/shared/mod.rs index 2d40b37c..bb02341e 100644 --- a/jirs-client/src/shared/mod.rs +++ b/jirs-client/src/shared/mod.rs @@ -1,10 +1,8 @@ -use { - crate::{ - model::{Model, Page}, - resolve_page, Msg, - }, - seed::{prelude::*, *}, -}; +use seed::prelude::*; +use seed::*; + +use crate::model::{Model, Page}; +use crate::{resolve_page, Msg}; pub mod aside; pub mod drag; diff --git a/jirs-client/src/shared/navbar_left.rs b/jirs-client/src/shared/navbar_left.rs index 72ae8f9b..af58e2d2 100644 --- a/jirs-client/src/shared/navbar_left.rs +++ b/jirs-client/src/shared/navbar_left.rs @@ -1,22 +1,16 @@ -use { - crate::{ - components::{ - styled_avatar::StyledAvatar, - styled_button::StyledButton, - styled_icon::{Icon, StyledIcon}, - styled_tooltip, - }, - model::Model, - shared::{divider, ToNode}, - ws::send_ws_msg, - Msg, Page, - }, - jirs_data::{InvitationToken, Message, MessageType, WsMsg}, - seed::{prelude::*, *}, -}; +use jirs_data::{InvitationToken, Message, MessageType, WsMsg}; +use seed::prelude::*; +use seed::*; -use crate::components::styled_button::ButtonVariant; +use crate::components::styled_avatar::StyledAvatar; +use crate::components::styled_button::{ButtonVariant, StyledButton}; +use crate::components::styled_icon::{Icon, StyledIcon}; +use crate::components::styled_tooltip; use crate::components::styled_tooltip::{StyledTooltip, TooltipVariant}; +use crate::model::Model; +use crate::shared::{divider, ToNode}; +use crate::ws::send_ws_msg; +use crate::{Msg, Page}; trait IntoNavItemIcon { fn into_nav_item_icon(self) -> Node; diff --git a/jirs-client/src/shared/tracking_widget.rs b/jirs-client/src/shared/tracking_widget.rs index 26d45ec6..2bfd7675 100644 --- a/jirs-client/src/shared/tracking_widget.rs +++ b/jirs-client/src/shared/tracking_widget.rs @@ -1,20 +1,36 @@ -use { - crate::{ - components::styled_icon::{Icon, StyledIcon}, - modals::{issues_edit::Model as EditIssueModal, time_tracking::value_for_time_tracking}, - model::{ModalType, Model}, - shared::ToNode, - Msg, - }, - jirs_data::{TimeTracking, UpdateIssuePayload}, - seed::{prelude::*, *}, -}; +use jirs_data::{TimeTracking, UpdateIssuePayload}; +use seed::prelude::*; +use seed::*; + +use crate::components::styled_icon::{Icon, StyledIcon}; +use crate::modals::issues_edit::Model as EditIssueModal; +use crate::modals::time_tracking::value_for_time_tracking; +use crate::model::{ModalType, Model}; +use crate::shared::ToNode; +use crate::Msg; #[inline] pub fn fibonacci_values() -> Vec { vec![0, 1, 2, 3, 5, 8, 13, 21, 34, 55] } +#[inline] +pub fn fibonacci_value_name<'l>(v: u32) -> &'l str { + match v { + 0 => "0", + 1 => "1", + 2 => "2", + 3 => "3", + 5 => "5", + 8 => "8", + 13 => "13", + 21 => "21", + 34 => "34", + 55 => "55", + _ => unreachable!(), + } +} + pub fn tracking_link(model: &Model, modal: &crate::modals::issues_edit::Model) -> Node { let crate::modals::issues_edit::Model { id, .. } = modal; diff --git a/jirs-client/src/ws/init_load_sets.rs b/jirs-client/src/ws/init_load_sets.rs index 3b87ce65..5910fffb 100644 --- a/jirs-client/src/ws/init_load_sets.rs +++ b/jirs-client/src/ws/init_load_sets.rs @@ -1,6 +1,5 @@ -use seed::app::Orders; - use jirs_data::WsMsg; +use seed::app::Orders; use crate::model::Model; use crate::ws::enqueue_ws_msg; diff --git a/jirs-client/src/ws/issue.rs b/jirs-client/src/ws/issue.rs index 52e81b8f..e466b952 100644 --- a/jirs-client/src/ws/issue.rs +++ b/jirs-client/src/ws/issue.rs @@ -1,13 +1,11 @@ -use { - crate::{ - model::{Model, PageContent}, - pages::project_page::ProjectPage, - ws::send_ws_msg, - Msg, - }, - jirs_data::*, - seed::{prelude::Orders, *}, -}; +use jirs_data::*; +use seed::prelude::Orders; +use seed::*; + +use crate::model::{Model, PageContent}; +use crate::pages::project_page::ProjectPage; +use crate::ws::send_ws_msg; +use crate::Msg; pub fn drag_started(issue_id: EpicId, model: &mut Model) { let project_page = match &mut model.page_content { diff --git a/jirs-client/src/ws/mod.rs b/jirs-client/src/ws/mod.rs index a0b1ac13..cadce7ec 100644 --- a/jirs-client/src/ws/mod.rs +++ b/jirs-client/src/ws/mod.rs @@ -1,13 +1,10 @@ -use seed::prelude::*; - pub use init_load_sets::*; use jirs_data::*; +use seed::prelude::*; -use crate::{ - model::*, - shared::{go_to_board, write_auth_token}, - Msg, OperationKind, ResourceKind, WebSocketChanged, -}; +use crate::model::*; +use crate::shared::{go_to_board, write_auth_token}; +use crate::{Msg, OperationKind, ResourceKind, WebSocketChanged}; mod init_load_sets; @@ -51,7 +48,8 @@ pub fn send_ws_msg(msg: WsMsg, ws: Option<&WebSocket>, orders: &mut impl Orders< pub fn open_socket(model: &mut Model, orders: &mut impl Orders) { use seed::browser::web_socket::State; - use seed::{prelude::*, *}; + use seed::prelude::*; + use seed::*; log!(model.ws.as_ref().map(|ws| ws.state())); match model.ws.as_ref() { diff --git a/jirs-client/tests/wasm.rs b/jirs-client/tests/wasm.rs index 728cc040..1656d9cd 100644 --- a/jirs-client/tests/wasm.rs +++ b/jirs-client/tests/wasm.rs @@ -1,8 +1,7 @@ extern crate wasm_bindgen_test; -use wasm_bindgen_test::*; - use jirs_client::validations::*; +use wasm_bindgen_test::*; #[wasm_bindgen_test] fn test_is_token() { diff --git a/jirs-server/src/errors.rs b/jirs-server/src/errors.rs index 806095c3..abd35b63 100644 --- a/jirs-server/src/errors.rs +++ b/jirs-server/src/errors.rs @@ -1,75 +1,74 @@ -use { - actix_web::HttpResponse, - jirs_data::{msg::WsError, ErrorResponse}, -}; - -const TOKEN_NOT_FOUND: &str = "Token not found"; -const DATABASE_CONNECTION_FAILED: &str = "Database connection failed"; - -#[derive(Debug)] -pub enum HighlightError { - UnknownLanguage, - UnknownTheme, - ResultUnserializable, -} - -#[derive(Debug)] -pub enum ServiceError { - Unauthorized, - DatabaseConnectionLost, - DatabaseQueryFailed(String), - RecordNotFound(String), - RegisterCollision, - Error(WsError), - Highlight(HighlightError), -} - -impl ServiceError { - pub fn into_http_response(self) -> HttpResponse { - self.into() - } -} - -impl Into for ServiceError { - fn into(self) -> HttpResponse { - match self { - ServiceError::Unauthorized => HttpResponse::Unauthorized().json(ErrorResponse { - errors: vec![TOKEN_NOT_FOUND.to_owned()], - }), - ServiceError::DatabaseConnectionLost => { - HttpResponse::InternalServerError().json(ErrorResponse { - errors: vec![DATABASE_CONNECTION_FAILED.to_owned()], - }) - } - ServiceError::DatabaseQueryFailed(error) => { - HttpResponse::BadRequest().json(ErrorResponse { - errors: vec![error], - }) - } - ServiceError::RecordNotFound(resource_name) => { - HttpResponse::BadRequest().json(ErrorResponse { - errors: vec![format!("Resource not found {}", resource_name)], - }) - } - ServiceError::RegisterCollision => HttpResponse::Unauthorized().json(ErrorResponse { - errors: vec!["Register collision".to_string()], - }), - ServiceError::Error(error) => HttpResponse::BadRequest().json(ErrorResponse { - errors: vec![error.to_str().to_string()], - }), - ServiceError::Highlight(HighlightError::UnknownTheme) => HttpResponse::BadRequest() - .json(ErrorResponse::single( - "Code highlight Failed. Unexpected theme", - )), - ServiceError::Highlight(HighlightError::UnknownLanguage) => HttpResponse::BadRequest() - .json(ErrorResponse::single( - "Can't highlight in given language. It's unknown", - )), - ServiceError::Highlight(HighlightError::ResultUnserializable) => { - HttpResponse::BadRequest().json(ErrorResponse::single( - "Highlight succeed but result can't be send", - )) - } - } - } -} +use actix_web::HttpResponse; +use jirs_data::msg::WsError; +use jirs_data::ErrorResponse; + +const TOKEN_NOT_FOUND: &str = "Token not found"; +const DATABASE_CONNECTION_FAILED: &str = "Database connection failed"; + +#[derive(Debug)] +pub enum HighlightError { + UnknownLanguage, + UnknownTheme, + ResultUnserializable, +} + +#[derive(Debug)] +pub enum ServiceError { + Unauthorized, + DatabaseConnectionLost, + DatabaseQueryFailed(String), + RecordNotFound(String), + RegisterCollision, + Error(WsError), + Highlight(HighlightError), +} + +impl ServiceError { + pub fn into_http_response(self) -> HttpResponse { + self.into() + } +} + +impl Into for ServiceError { + fn into(self) -> HttpResponse { + match self { + ServiceError::Unauthorized => HttpResponse::Unauthorized().json(ErrorResponse { + errors: vec![TOKEN_NOT_FOUND.to_owned()], + }), + ServiceError::DatabaseConnectionLost => { + HttpResponse::InternalServerError().json(ErrorResponse { + errors: vec![DATABASE_CONNECTION_FAILED.to_owned()], + }) + } + ServiceError::DatabaseQueryFailed(error) => { + HttpResponse::BadRequest().json(ErrorResponse { + errors: vec![error], + }) + } + ServiceError::RecordNotFound(resource_name) => { + HttpResponse::BadRequest().json(ErrorResponse { + errors: vec![format!("Resource not found {}", resource_name)], + }) + } + ServiceError::RegisterCollision => HttpResponse::Unauthorized().json(ErrorResponse { + errors: vec!["Register collision".to_string()], + }), + ServiceError::Error(error) => HttpResponse::BadRequest().json(ErrorResponse { + errors: vec![error.to_str().to_string()], + }), + ServiceError::Highlight(HighlightError::UnknownTheme) => HttpResponse::BadRequest() + .json(ErrorResponse::single( + "Code highlight Failed. Unexpected theme", + )), + ServiceError::Highlight(HighlightError::UnknownLanguage) => HttpResponse::BadRequest() + .json(ErrorResponse::single( + "Can't highlight in given language. It's unknown", + )), + ServiceError::Highlight(HighlightError::ResultUnserializable) => { + HttpResponse::BadRequest().json(ErrorResponse::single( + "Highlight succeed but result can't be send", + )) + } + } + } +} diff --git a/jirs-server/src/main.rs b/jirs-server/src/main.rs index e68b79e5..91c20a73 100644 --- a/jirs-server/src/main.rs +++ b/jirs-server/src/main.rs @@ -1,10 +1,8 @@ #![feature(async_closure)] #![recursion_limit = "256"] -use { - actix::Actor, - actix_web::{App, HttpServer}, -}; +use actix::Actor; +use actix_web::{App, HttpServer}; pub mod errors; diff --git a/rustfmt.toml b/rustfmt.toml new file mode 100644 index 00000000..3bc06030 --- /dev/null +++ b/rustfmt.toml @@ -0,0 +1,7 @@ +imports_granularity = "Module" +group_imports = "StdExternalCrate" +reorder_modules = true +reorder_imports = true +use_field_init_shorthand = true +wrap_comments = true + diff --git a/shared/jirs-config/src/amazon.rs b/shared/jirs-config/src/amazon.rs index 20cfd3e2..43ef6030 100644 --- a/shared/jirs-config/src/amazon.rs +++ b/shared/jirs-config/src/amazon.rs @@ -1,7 +1,5 @@ -use { - rusoto_signature::Region, - serde::{Deserialize, Serialize}, -}; +use rusoto_signature::Region; +use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, Debug)] pub struct Configuration { diff --git a/shared/jirs-config/src/utils.rs b/shared/jirs-config/src/utils.rs index 9120e3a9..5a2a70b8 100644 --- a/shared/jirs-config/src/utils.rs +++ b/shared/jirs-config/src/utils.rs @@ -1,10 +1,8 @@ -use { - serde::{de::DeserializeOwned, Serialize}, - std::{ - fs::{read_to_string, write}, - marker::PhantomData, - }, -}; +use std::fs::{read_to_string, write}; +use std::marker::PhantomData; + +use serde::de::DeserializeOwned; +use serde::Serialize; pub struct Reader { __phantom: PhantomData, diff --git a/shared/jirs-data/src/lib.rs b/shared/jirs-data/src/lib.rs index b01a090c..493de69e 100644 --- a/shared/jirs-data/src/lib.rs +++ b/shared/jirs-data/src/lib.rs @@ -1,18 +1,18 @@ -#[cfg(feature = "backend")] -use diesel::*; +use std::cmp::Ordering; +use std::str::FromStr; +use chrono::NaiveDateTime; +use derive_enum_iter::EnumIter; +use derive_enum_primitive::EnumPrimitive; #[cfg(feature = "backend")] use derive_enum_sql::EnumSql; -use { - chrono::NaiveDateTime, - derive_enum_iter::EnumIter, - derive_enum_primitive::EnumPrimitive, - serde::{Deserialize, Serialize}, - std::cmp::Ordering, - std::str::FromStr, - uuid::Uuid, -}; -pub use {fields::*, msg::WsMsg, payloads::*}; +#[cfg(feature = "backend")] +use diesel::*; +pub use fields::*; +pub use msg::WsMsg; +pub use payloads::*; +use serde::{Deserialize, Serialize}; +use uuid::Uuid; pub mod fields; pub mod msg; diff --git a/shared/jirs-data/src/msg.rs b/shared/jirs-data/src/msg.rs index 228c00bf..ca27282d 100644 --- a/shared/jirs-data/src/msg.rs +++ b/shared/jirs-data/src/msg.rs @@ -1,15 +1,13 @@ -use crate::DescriptionString; -use { - crate::{ - AvatarUrl, BindToken, Code, Comment, CommentId, CreateCommentPayload, CreateIssuePayload, - EmailString, Epic, EpicId, HighlightedCode, Invitation, InvitationId, InvitationToken, - Issue, IssueFieldId, IssueId, IssueStatus, IssueStatusId, IssueType, Lang, ListPosition, - Message, MessageId, NameString, NumberOfDeleted, PayloadVariant, Position, Project, - TitleString, UpdateCommentPayload, UpdateProjectPayload, User, UserId, UserProject, - UserProjectId, UserRole, UsernameString, - }, - serde::{Deserialize, Serialize}, - uuid::Uuid, +use serde::{Deserialize, Serialize}; +use uuid::Uuid; + +use crate::{ + AvatarUrl, BindToken, Code, Comment, CommentId, CreateCommentPayload, CreateIssuePayload, + DescriptionString, EmailString, Epic, EpicId, HighlightedCode, Invitation, InvitationId, + InvitationToken, Issue, IssueFieldId, IssueId, IssueStatus, IssueStatusId, IssueType, Lang, + ListPosition, Message, MessageId, NameString, NumberOfDeleted, PayloadVariant, Position, + Project, TitleString, UpdateCommentPayload, UpdateProjectPayload, User, UserId, UserProject, + UserProjectId, UserRole, UsernameString, }; #[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] diff --git a/shared/jirs-data/src/payloads.rs b/shared/jirs-data/src/payloads.rs index 5005147b..3c78cea1 100644 --- a/shared/jirs-data/src/payloads.rs +++ b/shared/jirs-data/src/payloads.rs @@ -1,9 +1,8 @@ -use { - crate::{ - CommentId, EpicId, Issue, IssueId, IssuePriority, IssueStatusId, IssueType, - ProjectCategory, ProjectId, TimeTracking, UserId, - }, - serde::{Deserialize, Serialize}, +use serde::{Deserialize, Serialize}; + +use crate::{ + CommentId, EpicId, Issue, IssueId, IssuePriority, IssueStatusId, IssueType, ProjectCategory, + ProjectId, TimeTracking, UserId, }; #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]