use crate::core::entity::{CustomView, TeamId};
use crate::core::store::Store;
#[derive(Debug, Clone, PartialEq)]
pub enum Request {
Views,
}
pub fn ensure_views(store: &Store) -> Option<Request> {
(!store.views_loaded).then_some(Request::Views)
}
pub fn reload_views(store: &mut Store) -> Request {
store.views_loaded = false;
Request::Views
}
pub fn take_views(store: &mut Store, views: Vec<CustomView>) {
store.set_custom_views(views);
}
pub fn listed(views: &[CustomView], team: Option<&TeamId>, issue_views: bool) -> Vec<usize> {
views
.iter()
.enumerate()
.filter(|(_, v)| v.team.as_ref().map(|t| &t.id) == team)
.filter(|(_, v)| v.lists_issues() == issue_views)
.map(|(i, _)| i)
.collect()
}
#[cfg(test)]
mod tests {
use super::*;
fn view(id: &str, name: &str, shared: bool, team: Option<&str>, model: &str) -> CustomView {
let team = team.map_or("null".to_string(), |t| {
format!(r#"{{"id":"{t}","name":"{t}","key":"{t}"}}"#)
});
serde_json::from_str(&format!(
r#"{{"id":"{id}","name":"{name}","shared":{shared},"team":{team},"modelName":"{model}"}}"#
))
.unwrap()
}
#[test]
fn views_are_fetched_until_known_and_on_refresh() {
let mut store = Store::default();
assert_eq!(ensure_views(&store), Some(Request::Views));
take_views(&mut store, Vec::new());
assert_eq!(ensure_views(&store), None);
assert_eq!(reload_views(&mut store), Request::Views);
assert_eq!(ensure_views(&store), Some(Request::Views));
}
#[test]
fn personal_views_come_first_then_by_name() {
let mut store = Store::default();
take_views(
&mut store,
vec![
view("1", "b shared", true, None, "Issue"),
view("2", "Zeta", false, None, "Issue"),
view("3", "alpha", false, None, "Issue"),
],
);
let names: Vec<&str> = store.custom_views.iter().map(|v| v.name.as_str()).collect();
assert_eq!(names, ["alpha", "Zeta", "b shared"]);
}
#[test]
fn a_views_page_lists_its_scope_and_kind() {
let views = vec![
view("1", "mine", false, None, "Issue"),
view("2", "team", false, Some("t"), "Issue"),
view("3", "roadmap", false, None, "Project"),
];
assert_eq!(listed(&views, None, true), [0]);
assert_eq!(listed(&views, Some(&TeamId::from("t")), true), [1]);
assert_eq!(listed(&views, None, false), [2]);
}
}