From 2a338d86c724717641207b885310ad4f6179b8d3 Mon Sep 17 00:00:00 2001 From: "byte[]" Date: Thu, 5 Dec 2019 19:36:45 -0500 Subject: [PATCH] allow users to edit their profile description --- lib/philomena/users.ex | 6 +++ lib/philomena/users/ability.ex | 4 ++ lib/philomena/users/user.ex | 8 ++++ .../profile/description_controller.ex | 29 ++++++++++++++ lib/philomena_web/router.ex | 1 + .../profile/description/edit.html.slime | 38 +++++++++++++++++++ .../templates/profile/show.html.slime | 14 ++++++- .../views/profile/description_view.ex | 3 ++ 8 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 lib/philomena_web/controllers/profile/description_controller.ex create mode 100644 lib/philomena_web/templates/profile/description/edit.html.slime create mode 100644 lib/philomena_web/views/profile/description_view.ex diff --git a/lib/philomena/users.ex b/lib/philomena/users.ex index f4b2cdbb..64e065f8 100644 --- a/lib/philomena/users.ex +++ b/lib/philomena/users.ex @@ -89,6 +89,12 @@ defmodule Philomena.Users do |> Repo.update() end + def update_description(%User{} = user, attrs) do + user + |> User.description_changeset(attrs) + |> Repo.update() + end + @doc """ Returns an `%Ecto.Changeset{}` for tracking user changes. diff --git a/lib/philomena/users/ability.ex b/lib/philomena/users/ability.ex index b7e4b389..50e7c4a9 100644 --- a/lib/philomena/users/ability.ex +++ b/lib/philomena/users/ability.ex @@ -52,6 +52,10 @@ defimpl Canada.Can, for: [Atom, Philomena.Users.User] do # Users and anonymous users can... # + # Edit their description and personal title + def can?(%User{id: id}, :edit_description, %User{id: id}), do: true + def can?(%User{id: id}, :edit_title, %User{id: id}), do: true + # View conversations they are involved in def can?(%User{id: id}, :show, %Conversation{to_id: id}), do: true def can?(%User{id: id}, :show, %Conversation{from_id: id}), do: true diff --git a/lib/philomena/users/user.ex b/lib/philomena/users/user.ex index 129225df..a2b82a07 100644 --- a/lib/philomena/users/user.ex +++ b/lib/philomena/users/user.ex @@ -185,6 +185,14 @@ defmodule Philomena.Users.User do |> validate_search(:watched_images_exclude_str, user, true) end + def description_changeset(user, attrs) do + user + |> cast(attrs, [:description, :personal_title]) + |> validate_length(:description, max: 10_000, count: :bytes) + |> validate_length(:personal_title, max: 24, count: :bytes) + |> validate_format(:personal_title, ~r/\A((?!site|admin|moderator|assistant|developer|\p{C}).)*\z/iu) + end + def create_totp_secret_changeset(user) do secret = :crypto.strong_rand_bytes(15) |> Base.encode32() data = Philomena.Users.Encryptor.encrypt_model(secret) diff --git a/lib/philomena_web/controllers/profile/description_controller.ex b/lib/philomena_web/controllers/profile/description_controller.ex new file mode 100644 index 00000000..0d8f4068 --- /dev/null +++ b/lib/philomena_web/controllers/profile/description_controller.ex @@ -0,0 +1,29 @@ +defmodule PhilomenaWeb.Profile.DescriptionController do + use PhilomenaWeb, :controller + + alias Philomena.Users.User + alias Philomena.Users + + plug PhilomenaWeb.FilterBannedUsersPlug + plug PhilomenaWeb.CanaryMapPlug, edit: :edit_description, update: :edit_description + plug :load_resource, model: User, id_name: "profile_id", id_field: "slug", persisted: true + + def edit(conn, _params) do + changeset = Users.change_user(conn.assigns.user) + render(conn, "edit.html", changeset: changeset, user: conn.assigns.user) + end + + def update(conn, %{"user" => user_params}) do + user = conn.assigns.user + + case Users.update_description(user, user_params) do + {:ok, _user} -> + conn + |> put_flash(:info, "Description successfully updated.") + |> redirect(to: Routes.profile_path(conn, :show, user)) + + {:error, changeset} -> + render(conn, "edit.html", changeset: changeset) + end + end +end \ No newline at end of file diff --git a/lib/philomena_web/router.ex b/lib/philomena_web/router.ex index dfdf0dcf..257904ed 100644 --- a/lib/philomena_web/router.ex +++ b/lib/philomena_web/router.ex @@ -117,6 +117,7 @@ defmodule PhilomenaWeb.Router do resources "/items", Profile.Commission.ItemController, only: [:new, :create, :edit, :update, :delete] resources "/reports", Profile.Commission.ReportController, only: [:new, :create] end + resources "/description", Profile.DescriptionController, only: [:edit, :update], singleton: true end scope "/filters", Filter, as: :filter do diff --git a/lib/philomena_web/templates/profile/description/edit.html.slime b/lib/philomena_web/templates/profile/description/edit.html.slime new file mode 100644 index 00000000..e5af04e2 --- /dev/null +++ b/lib/philomena_web/templates/profile/description/edit.html.slime @@ -0,0 +1,38 @@ +h1 Updating Profile Description + += form_for @changeset, Routes.profile_description_path(@conn, :update, @user), [method: "put"], fn f -> + = if @changeset.action do + .alert.alert-danger + p Oops, something went wrong! Please check the errors below. + + .block + .block__header + span.block__header__title Personal Title + .block__content + .field + = text_input f, :personal_title, class: "input input--short", placeholder: "Title" + = error_tag f, :personal_title + + .block + .block__header.block__header--js-tabbed + a.selected href="#" data-click-tab="write" + i.fa.fa-pencil> + ' About Me + + a href="#" data-click-tab="preview" + i.fa.fa-eye> + ' Preview + + .block__tab.communication-edit__tab.selected data-tab="write" + = render PhilomenaWeb.TextileView, "_help.html", conn: @conn + = render PhilomenaWeb.TextileView, "_toolbar.html", conn: @conn + + .field + = textarea f, :description, class: "input input--wide input--text js-preview-input js-toolbar-input", placeholder: "Description (up to 10000 characters)" + = error_tag f, :description + + .block__tab.communication-edit__tab.hidden data-tab="preview" + ' [Loading preview...] + + .block__content.communication-edit__actions + => submit "Update", class: "button" \ No newline at end of file diff --git a/lib/philomena_web/templates/profile/show.html.slime b/lib/philomena_web/templates/profile/show.html.slime index 0752003e..56cf5d05 100644 --- a/lib/philomena_web/templates/profile/show.html.slime +++ b/lib/philomena_web/templates/profile/show.html.slime @@ -6,7 +6,13 @@ h1.profile-top__name-header = @user.name | 's profile - p = render PhilomenaWeb.UserAttributionView, "_user_title.html", object: %{user: @user}, large: true + = render PhilomenaWeb.UserAttributionView, "_user_title.html", object: %{user: @user}, large: true + br + + = if can?(@conn, :edit_description, @user) do + = link "Edit Personal Title", to: Routes.profile_description_path(@conn, :edit, @user) + br + span ' Member since = pretty_time(@user.created_at) @@ -60,7 +66,11 @@ .block .block__header - span.block__header__title About Me + = if can?(@conn, :edit_description, @user) do + a.block__header--single-item href=Routes.profile_description_path(@conn, :edit, @user) About Me + - else + span.block__header__title About Me + = render PhilomenaWeb.ProfileView, "_about_me.html", user: @user, about_me: @about_me, conn: @conn .column-layout__main diff --git a/lib/philomena_web/views/profile/description_view.ex b/lib/philomena_web/views/profile/description_view.ex new file mode 100644 index 00000000..98bfe639 --- /dev/null +++ b/lib/philomena_web/views/profile/description_view.ex @@ -0,0 +1,3 @@ +defmodule PhilomenaWeb.Profile.DescriptionView do + use PhilomenaWeb, :view +end