Allow user to change email settings from settings page

This commit is contained in:
Uku Taht 2019-09-07 15:01:37 +01:00
parent 5d2b7de30f
commit cc75974821
5 changed files with 79 additions and 1 deletions

View File

@ -0,0 +1,17 @@
defmodule Plausible.Site.EmailSettings do
use Ecto.Schema
import Ecto.Changeset
schema "email_settings" do
belongs_to :site, Plausible.Site
timestamps()
end
def changeset(settings, attrs \\ %{}) do
settings
|> cast(attrs, [:site_id])
|> validate_required([:site_id])
|> unique_constraint(:site)
end
end

View File

@ -40,10 +40,17 @@ defmodule PlausibleWeb.SiteController do
!google_site["error"]
end
weekly_report_enabled = Repo.exists?(from es in "email_settings", where: es.site_id == ^site.id)
changeset = Plausible.Site.changeset(site, %{})
conn
|> assign(:skip_plausible_tracking, true)
|> render("settings.html", site: site, google_search_console_verified: google_search_console_verified, changeset: changeset)
|> render("settings.html",
site: site,
weekly_report_enabled: weekly_report_enabled,
google_search_console_verified: google_search_console_verified,
changeset: changeset
)
end
def update_settings(conn, %{"website" => website, "site" => site_params}) do
@ -99,6 +106,26 @@ defmodule PlausibleWeb.SiteController do
|> redirect(to: "/" <> site.domain <> "/settings")
end
def enable_email_report(conn, %{"website" => website}) do
site = Sites.get_for_user!(conn.assigns[:current_user].id, website)
Plausible.Site.EmailSettings.changeset(%Plausible.Site.EmailSettings{}, %{site_id: site.id})
|> Repo.insert!
conn
|> put_flash(:success, "Success! You will receive an email report every Monday going forward")
|> redirect(to: "/" <> site.domain <> "/settings")
end
def disable_email_report(conn, %{"website" => website}) do
site = Sites.get_for_user!(conn.assigns[:current_user].id, website)
Repo.delete_all(from es in Plausible.Site.EmailSettings, where: es.site_id == ^site.id)
conn
|> put_flash(:success, "Success! You will not receive weekly email reports going forward")
|> redirect(to: "/" <> site.domain <> "/settings")
end
defp insert_site(user_id, params) do
site_changeset = Plausible.Site.changeset(%Plausible.Site{}, params)

View File

@ -85,6 +85,8 @@ defmodule PlausibleWeb.Router do
post "/sites", SiteController, :create_site
post "/sites/:website/make-public", SiteController, :make_public
post "/sites/:website/make-private", SiteController, :make_private
post "/sites/:website/email-report/enable", SiteController, :enable_email_report
post "/sites/:website/email-report/disable", SiteController, :disable_email_report
get "/:website/snippet", SiteController, :add_snippet
get "/:website/settings", SiteController, :settings
put "/:website/settings", SiteController, :update_settings

View File

@ -94,6 +94,31 @@
<% end %>
</div>
<div class="max-w-md mx-auto bg-white shadow-md rounded rounded-t-none border-t-2 border-indigo-lightest px-8 pt-6 pb-8 mt-10" id="google-auth">
<div class="flex items-center justify-between">
<h2>Email reports</h2>
</div>
<div class="my-4 border-b border-grey-light"></div>
<div class="my-4 flex items-center">
<%= if @weekly_report_enabled do %>
<%= button(to: "/sites/#{@site.domain}/email-report/disable", method: :post, class: "border rounded-full border-grey flex items-center cursor-pointer w-8 bg-green justify-end") do %>
<span class="rounded-full border w-4 h-4 border-grey shadow-inner bg-white shadow"></span>
<% end %>
<span class="ml-2">Receive a weekly email report every Monday</span>
<% else %>
<%= button(to: "/sites/#{@site.domain}/email-report/enable", method: :post, class: "border rounded-full border-grey flex items-center cursor-pointer w-8 justify-start") do %>
<span class="rounded-full border w-4 h-4 border-grey shadow-inner bg-white shadow"></span>
<% end %>
<span class="ml-2">Receive a weekly email report every Monday</span>
<% end %>
</div>
<div class="text-sm text-grey-darker mt-6">
Configured email: <%= @conn.assigns[:current_user].email %>
</div>
</div>
<%= form_for @conn, "/", [class: "bg-white max-w-md mx-auto shadow-md rounded rounded-t-none border-t-2 border-indigo-lightest px-8 pt-6 pb-8 mb-4 mt-16"], fn f -> %>
<div class="flex items-center justify-between">
<h2>Javascript snippet</h2>

View File

@ -0,0 +1,7 @@
defmodule Plausible.Repo.Migrations.AddUniqueIndexToEmailSettings do
use Ecto.Migration
def change do
create unique_index(:email_settings, :site_id)
end
end