mirror of
https://github.com/philomena-dev/philomena.git
synced 2025-02-01 03:46:44 +01:00
add filter selection
This commit is contained in:
parent
27a443bd2a
commit
a8fef6d03c
8 changed files with 125 additions and 2 deletions
|
@ -116,4 +116,30 @@ defmodule Philomena.Filters do
|
||||||
def change_filter(%Filter{} = filter) do
|
def change_filter(%Filter{} = filter) do
|
||||||
Filter.changeset(filter, %{})
|
Filter.changeset(filter, %{})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def recent_and_user_filters(user) do
|
||||||
|
user_filters =
|
||||||
|
Filter
|
||||||
|
|> select([f], %{id: f.id, name: f.name, recent: ^"f"})
|
||||||
|
|> where(user_id: ^user.id)
|
||||||
|
|> limit(10)
|
||||||
|
|
||||||
|
recent_filters =
|
||||||
|
Filter
|
||||||
|
|> select([f], %{id: f.id, name: f.name, recent: ^"t"})
|
||||||
|
|> where([f], f.id in ^user.recent_filter_ids)
|
||||||
|
|> limit(10)
|
||||||
|
|
||||||
|
union(recent_filters, ^user_filters)
|
||||||
|
|> Repo.all()
|
||||||
|
|> Enum.group_by(
|
||||||
|
fn
|
||||||
|
%{recent: "t"} -> "Recent Filters"
|
||||||
|
_user -> "Your Filters"
|
||||||
|
end,
|
||||||
|
fn %{id: id, name: name} ->
|
||||||
|
[key: name, value: id]
|
||||||
|
end
|
||||||
|
)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -77,6 +77,12 @@ defmodule Philomena.Users do
|
||||||
|> Repo.update()
|
|> Repo.update()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def update_spoiler_type(%User{} = user, attrs) do
|
||||||
|
user
|
||||||
|
|> User.spoiler_type_changeset(attrs)
|
||||||
|
|> Repo.update()
|
||||||
|
end
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
Returns an `%Ecto.Changeset{}` for tracking user changes.
|
Returns an `%Ecto.Changeset{}` for tracking user changes.
|
||||||
|
|
||||||
|
|
|
@ -143,8 +143,19 @@ defmodule Philomena.Users.User do
|
||||||
end
|
end
|
||||||
|
|
||||||
def filter_changeset(user, filter) do
|
def filter_changeset(user, filter) do
|
||||||
change(user)
|
changeset = change(user)
|
||||||
|
user = changeset.data
|
||||||
|
|
||||||
|
changeset
|
||||||
|> put_change(:current_filter_id, filter.id)
|
|> put_change(:current_filter_id, filter.id)
|
||||||
|
|> put_change(:recent_filter_ids, Enum.take([filter.id | user.recent_filter_ids], 10))
|
||||||
|
end
|
||||||
|
|
||||||
|
def spoiler_type_changeset(user, attrs) do
|
||||||
|
user
|
||||||
|
|> cast(attrs, [:spoiler_type])
|
||||||
|
|> validate_required([:spoiler_type])
|
||||||
|
|> validate_inclusion(:spoiler_type, ~W(static click hover off))
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_totp_secret_changeset(user) do
|
def create_totp_secret_changeset(user) do
|
||||||
|
|
|
@ -20,7 +20,7 @@ defmodule PhilomenaWeb.Filter.CurrentController do
|
||||||
conn
|
conn
|
||||||
|> update_filter(user, filter)
|
|> update_filter(user, filter)
|
||||||
|> put_flash(:info, "Switched to filter #{filter.name}")
|
|> put_flash(:info, "Switched to filter #{filter.name}")
|
||||||
|> redirect(to: Routes.filter_path(conn, :index))
|
|> redirect(external: conn.assigns.referrer)
|
||||||
end
|
end
|
||||||
|
|
||||||
defp update_filter(conn, nil, filter) do
|
defp update_filter(conn, nil, filter) do
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
defmodule PhilomenaWeb.Filter.SpoilerTypeController do
|
||||||
|
use PhilomenaWeb, :controller
|
||||||
|
|
||||||
|
alias Philomena.Users
|
||||||
|
|
||||||
|
plug PhilomenaWeb.RequireUserPlug
|
||||||
|
|
||||||
|
def update(conn, %{"user" => user_params}) do
|
||||||
|
case Users.update_spoiler_type(conn.assigns.current_user, user_params) do
|
||||||
|
{:ok, user} ->
|
||||||
|
conn
|
||||||
|
|> put_flash(:info, "Changed spoiler type to #{user.spoiler_type}")
|
||||||
|
|> redirect(external: conn.assigns.referrer)
|
||||||
|
|
||||||
|
{:error, _changeset} ->
|
||||||
|
conn
|
||||||
|
|> put_flash(:error, "Failed to set spoiler type")
|
||||||
|
|> redirect(external: conn.assigns.referrer)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
47
lib/philomena_web/plugs/filter_select_plug.ex
Normal file
47
lib/philomena_web/plugs/filter_select_plug.ex
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
defmodule PhilomenaWeb.FilterSelectPlug do
|
||||||
|
@moduledoc """
|
||||||
|
This plug sets up the filter menu for the layout if there is a
|
||||||
|
user currently signed in.
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
plug PhilomenaWeb.FilterSelectPlug
|
||||||
|
"""
|
||||||
|
|
||||||
|
alias Philomena.Filters
|
||||||
|
alias Philomena.Users
|
||||||
|
alias Plug.Conn
|
||||||
|
|
||||||
|
@spoiler_types %{
|
||||||
|
"Spoilers" => [
|
||||||
|
static: "static",
|
||||||
|
click: "click",
|
||||||
|
hover: "hover",
|
||||||
|
off: "off"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
@doc false
|
||||||
|
@spec init(any()) :: any()
|
||||||
|
def init(opts), do: opts
|
||||||
|
|
||||||
|
@doc false
|
||||||
|
@spec call(Conn.t(), any()) :: Conn.t()
|
||||||
|
def call(conn, _opts) do
|
||||||
|
user = Pow.Plug.current_user(conn)
|
||||||
|
|
||||||
|
conn
|
||||||
|
|> maybe_assign_filters(user)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp maybe_assign_filters(conn, nil), do: conn
|
||||||
|
defp maybe_assign_filters(conn, user) do
|
||||||
|
filters = Filters.recent_and_user_filters(user)
|
||||||
|
user = Users.change_user(user)
|
||||||
|
|
||||||
|
conn
|
||||||
|
|> Conn.assign(:user_changeset, user)
|
||||||
|
|> Conn.assign(:available_filters, filters)
|
||||||
|
|> Conn.assign(:spoiler_types, @spoiler_types)
|
||||||
|
end
|
||||||
|
end
|
|
@ -15,6 +15,7 @@ defmodule PhilomenaWeb.Router do
|
||||||
plug PhilomenaWeb.EnsureUserEnabledPlug
|
plug PhilomenaWeb.EnsureUserEnabledPlug
|
||||||
plug PhilomenaWeb.CurrentBanPlug
|
plug PhilomenaWeb.CurrentBanPlug
|
||||||
plug PhilomenaWeb.NotificationCountPlug
|
plug PhilomenaWeb.NotificationCountPlug
|
||||||
|
plug PhilomenaWeb.FilterSelectPlug
|
||||||
end
|
end
|
||||||
|
|
||||||
pipeline :api do
|
pipeline :api do
|
||||||
|
@ -67,6 +68,10 @@ defmodule PhilomenaWeb.Router do
|
||||||
resources "/subscription", Topic.SubscriptionController, only: [:create, :delete], singleton: true
|
resources "/subscription", Topic.SubscriptionController, only: [:create, :delete], singleton: true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
scope "/filters", Filter, as: :filter do
|
||||||
|
resources "/spoiler_type", SpoilerTypeController, only: [:update], singleton: true
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
scope "/", PhilomenaWeb do
|
scope "/", PhilomenaWeb do
|
||||||
|
|
|
@ -43,6 +43,13 @@ header.header
|
||||||
a.header__link.hide-mobile href="/filters" title="Filters"
|
a.header__link.hide-mobile href="/filters" title="Filters"
|
||||||
i.fa.fa-filter
|
i.fa.fa-filter
|
||||||
span.hide-limited-desktop< Filters
|
span.hide-limited-desktop< Filters
|
||||||
|
|
||||||
|
= form_for @conn.assigns.user_changeset, Routes.filter_current_path(@conn, :update), [class: "header__filter-form", id: "filter-quick-form"], fn f ->
|
||||||
|
= select f, :current_filter_id, @conn.assigns.available_filters, name: "id", id: "filter-quick-menu", class: "input header__input", data: [change_submit: "#filter-quick-form"], autocomplete: "off"
|
||||||
|
|
||||||
|
= form_for @conn.assigns.user_changeset, Routes.filter_spoiler_type_path(@conn, :update), [class: "header__filter-form hide-mobile hide-limited-desktop", id: "spoiler-quick-form"], fn f ->
|
||||||
|
= select f, :spoiler_type, @conn.assigns.spoiler_types, id: "spoiler-quick-menu", class: "input header__input", data: [change_submit: "#spoiler-quick-form"], autocomplete: "off"
|
||||||
|
|
||||||
.dropdown.header__dropdown
|
.dropdown.header__dropdown
|
||||||
a.header__link.header__link-user href="/"
|
a.header__link.header__link-user href="/"
|
||||||
= render PhilomenaWeb.UserAttributionView, "_user_avatar.html", object: %{user: @current_user}, class: "avatar--28px"
|
= render PhilomenaWeb.UserAttributionView, "_user_avatar.html", object: %{user: @current_user}, class: "avatar--28px"
|
||||||
|
|
Loading…
Reference in a new issue