diff options
Diffstat (limited to 'server/src/routes')
| -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>))      }  } | 
