First release
This commit is contained in:
parent
10f416cef5
commit
711a21f2b6
23
README.md
23
README.md
@ -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
|
||||||
|
@ -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 {
|
||||||
|
@ -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> {
|
||||||
|
@ -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,
|
||||||
],
|
],
|
||||||
]
|
]
|
||||||
|
Loading…
Reference in New Issue
Block a user