aboutsummaryrefslogtreecommitdiff
path: root/server/src
diff options
context:
space:
mode:
Diffstat (limited to 'server/src')
-rw-r--r--server/src/routes/ui/sort.rs64
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>))
}
}