diff options
Diffstat (limited to 'server/src/routes/ui')
-rw-r--r-- | server/src/routes/ui/sort.rs | 64 |
1 files changed, 55 insertions, 9 deletions
diff --git a/server/src/routes/ui/sort.rs b/server/src/routes/ui/sort.rs index e1af9d5..10ba356 100644 --- a/server/src/routes/ui/sort.rs +++ b/server/src/routes/ui/sort.rs @@ -7,12 +7,27 @@ use rocket::{ #[derive(FromForm, UriDisplayQuery, Default, Clone)] pub struct NodeFilterSort { sort_by: Option<SortProperty>, - filter_kind: Option<Vec<NodeKind>>, + filter_kind: Option<Vec<FilterProperty>>, sort_order: Option<SortOrder>, } #[rustfmt::skip] #[derive(FromFormField, UriDisplayQuery, Clone, PartialEq, Eq)] +enum FilterProperty { + #[field(value = "fed_local")] FederationLocal, + #[field(value = "fed_remote")] FederationRemote, + #[field(value = "kind_movie")] KindMovie, + #[field(value = "kind_video")] KindVideo, + #[field(value = "kind_collection")] KindCollection, + #[field(value = "kind_channel")] KindChannel, + #[field(value = "kind_show")] KindShow, + #[field(value = "kind_series")] KindSeries, + #[field(value = "kind_season")] KindSeason, + #[field(value = "kind_episode")] KindEpisode, +} + +#[rustfmt::skip] +#[derive(FromFormField, UriDisplayQuery, Clone, PartialEq, Eq)] enum SortProperty { #[field(value = "release_date")] ReleaseDate, #[field(value = "title")] Title, @@ -39,6 +54,23 @@ impl SortProperty { ] }; } +impl FilterProperty { + const ALL: &'static [(FilterProperty, &'static str)] = { + use FilterProperty::*; + &[ + (FederationLocal, "Local"), + (FederationRemote, "Remote"), + (KindMovie, "Movie"), + (KindVideo, "Video"), + (KindCollection, "Collection"), + (KindChannel, "Channel"), + (KindShow, "Show"), + (KindSeries, "Series"), + (KindSeason, "Season"), + (KindEpisode, "Episode"), + ] + }; +} #[rustfmt::skip] #[derive(FromFormField, UriDisplayQuery, Clone, Copy, PartialEq, Eq)] @@ -50,8 +82,24 @@ enum SortOrder { pub fn filter_and_sort_nodes(f: &NodeFilterSort, nodes: &mut Vec<(String, NodePublic)>) { nodes.retain(|(_id, node)| { let mut o = true; - if let Some(kind) = &f.filter_kind { - o &= kind.contains(&node.kind) + if let Some(prop) = &f.filter_kind { + for (p, _) in FilterProperty::ALL { + if prop.contains(p) { + continue; + } + o &= !match p { + FilterProperty::FederationLocal => node.federated.is_none(), + FilterProperty::FederationRemote => node.federated.is_some(), + FilterProperty::KindMovie => node.kind == NodeKind::Movie, + FilterProperty::KindVideo => node.kind == NodeKind::Video, + FilterProperty::KindCollection => node.kind == NodeKind::Collection, + FilterProperty::KindChannel => node.kind == NodeKind::Channel, + FilterProperty::KindShow => node.kind == NodeKind::Show, + FilterProperty::KindSeries => node.kind == NodeKind::Series, + FilterProperty::KindSeason => node.kind == NodeKind::Season, + FilterProperty::KindEpisode => node.kind == NodeKind::Episode, + } + } } if let Some(SortProperty::ReleaseDate) = &f.sort_by { o &= node.release_date.is_some() @@ -97,9 +145,8 @@ markup::define! { form[method="GET", action=""] { fieldset.filter { legend { "Filter" } - @use NodeKind::*; - @for (value, label) in [(Movie, "Movie"), (Episode, "Episode"), (Video, "Video"), (Channel, "Channel"), (Series, "Series"), (Season, "Season"), (Collection, "Collection")] { - label { input[type="checkbox", name="filter_kind", value=A(value), checked=f.filter_kind.as_ref().map(|k|k.contains(&value)).unwrap_or(true)]; @label } br; + @for (value, label) in FilterProperty::ALL { + label { input[type="checkbox", name="filter_kind", value=value, checked=f.filter_kind.as_ref().map(|k|k.contains(&value)).unwrap_or(true)]; @label } br; } } fieldset.sortby { @@ -131,9 +178,8 @@ impl markup::Render for SortOrder { writer.write_fmt(format_args!("{}", self as &dyn UriDisplay<Query>)) } } -struct A(NodeKind); -impl markup::Render for A { +impl markup::Render for FilterProperty { fn render(&self, writer: &mut impl std::fmt::Write) -> std::fmt::Result { - writer.write_fmt(format_args!("{}", &self.0 as &dyn UriDisplay<Query>)) + writer.write_fmt(format_args!("{}", self as &dyn UriDisplay<Query>)) } } |