First release

This commit is contained in:
Adrian Woźniak 2020-06-08 21:13:16 +02:00
parent 10f416cef5
commit 711a21f2b6
4 changed files with 69 additions and 15 deletions

View File

@ -19,6 +19,29 @@ https://git.sr.ht/~tsumanu/jirs
* Comment issue * Comment issue
* Add people to project * Add people to project
## Known bugs
* Bad sorting when dragging up and down
## Roadmap
##### Version 1.0
* Basic issue management
* Basic columns management
* Basic user management
##### Version 1.1
* Add Epic
* Add grouping by Epic
* Add backend maximal per seconds request or die
* Add fibonacci tracked issue reports
* Add hourly tracked issue reports
* Add Rich Text Editor
* Add personal settings to choose MDE (Markdown Editor) or RTE
* Add issues and filters
## How to run it ## How to run it
### Config files ### Config files

View File

@ -11,16 +11,16 @@
#reports > .top > .issueList { #reports > .top > .issueList {
display: block; display: block;
margin-top: 15px;
}
#reports > .top > .issueList > .issueListHeader {
margin-bottom: 15px;
} }
#reports > .top > .issueList > .issue { #reports > .top > .issueList > .issue {
display: flex; display: grid;
justify-content: space-between; grid-template-columns: 32px 32px 240px auto 120px;
justify-items: flex-start;
}
#reports > .top > .issueList > .issue > * {
width: 25%;
} }
#reports > .top > .issueList > .issue.selected { #reports > .top > .issueList > .issue.selected {

View File

@ -6,7 +6,8 @@ use seed::{prelude::*, *};
use jirs_data::Issue; use jirs_data::Issue;
use crate::model::{Model, PageContent, ReportsPage}; use crate::model::{Model, PageContent, ReportsPage};
use crate::shared::inner_layout; use crate::shared::styled_icon::StyledIcon;
use crate::shared::{inner_layout, ToNode};
use crate::{Msg, PageChanged, ReportsPageChange}; use crate::{Msg, PageChanged, ReportsPageChange};
const SVG_MARGIN_X: u32 = 10; const SVG_MARGIN_X: u32 = 10;
@ -100,11 +101,22 @@ fn this_month_graph(page: &Box<ReportsPage>, this_month_updated: &Vec<&Issue>) -
ReportsPageChange::DayHovered(None), ReportsPageChange::DayHovered(None),
))) )))
}); });
let selected = page.selected_day.clone();
let current_date = day.clone();
let on_click: EventHandler<Msg> = mouse_ev(Ev::MouseLeave, move |_| {
Some(Msg::PageChanged(PageChanged::Reports(
ReportsPageChange::DaySelected(match selected {
Some(_) => None,
None => Some(current_date),
}),
)))
});
svg_parts.push(seed::g![ svg_parts.push(seed::g![
seed::rect![ seed::rect![
on_hover, on_hover,
on_blur, on_blur,
on_click,
attrs![ attrs![
At::X => x, At::X => x,
At::Y => SVG_DRAWABLE_HEIGHT as f64 - height, // reverse draw origin At::Y => SVG_DRAWABLE_HEIGHT as f64 - height, // reverse draw origin
@ -150,20 +162,34 @@ fn issue_list(page: &Box<ReportsPage>, this_month_updated: &Vec<&Issue>) -> Node
title, title,
issue_type, issue_type,
priority, priority,
description: _, description,
issue_status_id: _, issue_status_id: _,
.. ..
} = issue; } = issue;
let type_icon = StyledIcon::build(issue_type.clone().into())
.build()
.into_node();
let priority_icon = StyledIcon::build(priority.clone().into())
.build()
.into_node();
children.push(li![ children.push(li![
class!["issue"], class!["issue"],
class![active_class], class![active_class],
span![title.as_str()], span![class!["priority"], priority_icon],
span![format!("{}", issue_type)], span![class!["type"], type_icon],
span![format!("{}", priority)], span![class!["name"], title.as_str()],
span![day.as_str()] span![
class!["desc"],
description.as_ref().cloned().unwrap_or_default()
],
span![class!["updatedAt"], day.as_str()],
]); ]);
} }
div![class!["issueList"], children] div![
class!["issueList"],
h5![class!["issueListHeader"], "Issues this month"],
children
]
} }
fn this_month_updated<'a>(model: &'a Model, page: &Box<ReportsPage>) -> Vec<&'a Issue> { fn this_month_updated<'a>(model: &'a Model, page: &Box<ReportsPage>) -> Vec<&'a Issue> {

View File

@ -242,8 +242,13 @@ pub fn render(values: StyledInput) -> Node<Msg> {
At::Class => input_class_list.join(" "), At::Class => input_class_list.join(" "),
At::Value => value.unwrap_or_default(), At::Value => value.unwrap_or_default(),
At::Type => input_type.unwrap_or_else(|| "text".to_string()), At::Type => input_type.unwrap_or_else(|| "text".to_string()),
At::AutoFocus => auto_focus,
], ],
if auto_focus {
vec![attrs![At::AutoFocus => true]]
} else {
vec![]
},
input_handlers, input_handlers,
], ],
] ]