@@ -4,10 +4,10 @@ defmodule Mobilizon.GraphQL.Resolvers.Activity do
|
||||
"""
|
||||
|
||||
import Mobilizon.Users.Guards
|
||||
alias Mobilizon.{Activities, Actors, Discussions, Events, Posts, Resources, Users}
|
||||
alias Mobilizon.{Activities, Actors, Users}
|
||||
alias Mobilizon.Activities.Activity
|
||||
alias Mobilizon.Actors.Actor
|
||||
alias Mobilizon.Events.Event
|
||||
alias Mobilizon.Service.Activity, as: ActivityService
|
||||
alias Mobilizon.Storage.Page
|
||||
alias Mobilizon.Users.User
|
||||
|
||||
@@ -31,7 +31,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Activity do
|
||||
Enum.map(elements, fn %Activity{} = activity ->
|
||||
activity
|
||||
|> Map.update(:subject_params, %{}, &transform_params/1)
|
||||
|> Map.put(:object, get_object(activity))
|
||||
|> Map.put(:object, ActivityService.object(activity))
|
||||
end)
|
||||
|
||||
{:ok, %Page{total: total, elements: elements}}
|
||||
@@ -45,43 +45,6 @@ defmodule Mobilizon.GraphQL.Resolvers.Activity do
|
||||
{:error, :unauthenticated}
|
||||
end
|
||||
|
||||
defp get_object(%Activity{object_type: object_type, object_id: object_id}) do
|
||||
get_object(object_type, object_id)
|
||||
end
|
||||
|
||||
defp get_object(_, nil), do: nil
|
||||
|
||||
defp get_object(:event, event_id) do
|
||||
case Events.get_event(event_id) do
|
||||
{:ok, %Event{} = event} -> event
|
||||
_ -> nil
|
||||
end
|
||||
end
|
||||
|
||||
defp get_object(:post, post_id) do
|
||||
Posts.get_post(post_id)
|
||||
end
|
||||
|
||||
defp get_object(:member, member_id) do
|
||||
Actors.get_member(member_id)
|
||||
end
|
||||
|
||||
defp get_object(:resource, resource_id) do
|
||||
Resources.get_resource(resource_id)
|
||||
end
|
||||
|
||||
defp get_object(:discussion, discussion_id) do
|
||||
Discussions.get_discussion(discussion_id)
|
||||
end
|
||||
|
||||
defp get_object(:group, group_id) do
|
||||
Actors.get_actor(group_id)
|
||||
end
|
||||
|
||||
defp get_object(:comment, comment_id) do
|
||||
Discussions.get_comment(comment_id)
|
||||
end
|
||||
|
||||
@spec transform_params(map()) :: list()
|
||||
defp transform_params(params) do
|
||||
Enum.map(params, fn {key, value} -> %{key: key, value: transform_value(value)} end)
|
||||
|
||||
@@ -59,6 +59,8 @@ defmodule Mobilizon.Activities do
|
||||
defenum(Subject, @subjects)
|
||||
defenum(ObjectType, @object_type)
|
||||
|
||||
@activity_preloads [:author, :group]
|
||||
|
||||
@doc """
|
||||
Returns the list of activities.
|
||||
|
||||
@@ -153,6 +155,11 @@ defmodule Mobilizon.Activities do
|
||||
|> Repo.insert()
|
||||
end
|
||||
|
||||
@spec preload_activity(Activity.t()) :: Activity.t()
|
||||
def preload_activity(%Activity{} = activity) do
|
||||
Repo.preload(activity, @activity_preloads)
|
||||
end
|
||||
|
||||
def object_types, do: @object_type
|
||||
|
||||
def subjects, do: @subjects
|
||||
|
||||
@@ -3,5 +3,50 @@ defmodule Mobilizon.Service.Activity do
|
||||
Behavior for Activity creators
|
||||
"""
|
||||
|
||||
alias Mobilizon.Activities.Activity
|
||||
alias Mobilizon.Service.Activity.{Comment, Discussion, Event, Group, Member, Post, Resource}
|
||||
|
||||
@callback insert_activity(entity :: struct(), options :: map()) :: {:ok, Oban.Job.t()}
|
||||
|
||||
@callback get_object(object_id :: String.t() | integer()) :: struct()
|
||||
|
||||
@spec object(Activity.t()) :: struct() | nil
|
||||
def object(%Activity{object_type: object_type, object_id: object_id}) do
|
||||
do_get_object(object_type, object_id)
|
||||
end
|
||||
|
||||
@spec has_object?(Activity.t()) :: boolean()
|
||||
def has_object?(%Activity{} = activity) do
|
||||
!is_nil(object(activity))
|
||||
end
|
||||
|
||||
defp do_get_object(_, nil), do: nil
|
||||
|
||||
defp do_get_object(:event, event_id) do
|
||||
Event.get_object(event_id)
|
||||
end
|
||||
|
||||
defp do_get_object(:post, post_id) do
|
||||
Post.get_object(post_id)
|
||||
end
|
||||
|
||||
defp do_get_object(:member, member_id) do
|
||||
Member.get_object(member_id)
|
||||
end
|
||||
|
||||
defp do_get_object(:resource, resource_id) do
|
||||
Resource.get_object(resource_id)
|
||||
end
|
||||
|
||||
defp do_get_object(:discussion, discussion_id) do
|
||||
Discussion.get_object(discussion_id)
|
||||
end
|
||||
|
||||
defp do_get_object(:group, group_id) do
|
||||
Group.get_object(group_id)
|
||||
end
|
||||
|
||||
defp do_get_object(:comment, comment_id) do
|
||||
Comment.get_object(comment_id)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -2,7 +2,7 @@ defmodule Mobilizon.Service.Activity.Comment do
|
||||
@moduledoc """
|
||||
Insert a comment activity
|
||||
"""
|
||||
alias Mobilizon.{Actors, Events}
|
||||
alias Mobilizon.{Actors, Discussions, Events}
|
||||
alias Mobilizon.Actors.Actor
|
||||
alias Mobilizon.Discussions.Comment
|
||||
alias Mobilizon.Events.Event
|
||||
@@ -48,4 +48,9 @@ defmodule Mobilizon.Service.Activity.Comment do
|
||||
end
|
||||
|
||||
def insert_activity(_, _), do: {:ok, nil}
|
||||
|
||||
@impl Activity
|
||||
def get_object(comment_id) do
|
||||
Discussions.get_comment(comment_id)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -2,7 +2,7 @@ defmodule Mobilizon.Service.Activity.Discussion do
|
||||
@moduledoc """
|
||||
Insert a discussion activity
|
||||
"""
|
||||
alias Mobilizon.Actors
|
||||
alias Mobilizon.{Actors, Discussions}
|
||||
alias Mobilizon.Discussions.Discussion
|
||||
alias Mobilizon.Service.Activity
|
||||
alias Mobilizon.Service.Workers.ActivityBuilder
|
||||
@@ -38,6 +38,11 @@ defmodule Mobilizon.Service.Activity.Discussion do
|
||||
|
||||
def insert_activity(_, _), do: {:ok, nil}
|
||||
|
||||
@impl Activity
|
||||
def get_object(discussion_id) do
|
||||
Discussions.get_discussion(discussion_id)
|
||||
end
|
||||
|
||||
@spec subject_params(Discussion.t(), String.t() | nil, Discussion.t() | nil) :: map()
|
||||
defp subject_params(%Discussion{} = discussion, "discussion_renamed", old_discussion) do
|
||||
discussion
|
||||
|
||||
@@ -2,7 +2,7 @@ defmodule Mobilizon.Service.Activity.Event do
|
||||
@moduledoc """
|
||||
Insert an event activity
|
||||
"""
|
||||
alias Mobilizon.Actors
|
||||
alias Mobilizon.{Actors, Events}
|
||||
alias Mobilizon.Events.Event
|
||||
alias Mobilizon.Service.Activity
|
||||
alias Mobilizon.Service.Workers.ActivityBuilder
|
||||
@@ -36,4 +36,12 @@ defmodule Mobilizon.Service.Activity.Event do
|
||||
|
||||
@impl Activity
|
||||
def insert_activity(_, _), do: {:ok, nil}
|
||||
|
||||
@impl Activity
|
||||
def get_object(event_id) do
|
||||
case Events.get_event(event_id) do
|
||||
{:ok, %Event{} = event} -> event
|
||||
_ -> nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -40,6 +40,11 @@ defmodule Mobilizon.Service.Activity.Group do
|
||||
|
||||
def insert_activity(_, _), do: {:ok, nil}
|
||||
|
||||
@impl Activity
|
||||
def get_object(group_id) do
|
||||
Actors.get_actor(group_id)
|
||||
end
|
||||
|
||||
@spec subject_params(Actor.t(), String.t() | nil, Actor.t() | nil) :: map()
|
||||
defp subject_params(%Actor{} = group, "group_updated", %Actor{} = old_group) do
|
||||
group
|
||||
@@ -67,7 +72,7 @@ defmodule Mobilizon.Service.Activity.Group do
|
||||
end
|
||||
|
||||
defp subject_params(
|
||||
%Actor{preferred_username: preferred_username, domain: domain, name: name},
|
||||
%Actor{preferred_username: preferred_username, domain: domain, name: name} = actor,
|
||||
_,
|
||||
_
|
||||
) do
|
||||
@@ -75,6 +80,7 @@ defmodule Mobilizon.Service.Activity.Group do
|
||||
group_preferred_username: preferred_username,
|
||||
group_name: name,
|
||||
group_domain: domain,
|
||||
group_federated_username: Actor.preferred_username_and_domain(actor),
|
||||
group_changes: []
|
||||
}
|
||||
end
|
||||
|
||||
@@ -35,6 +35,11 @@ defmodule Mobilizon.Service.Activity.Member do
|
||||
|
||||
def insert_activity(_, _), do: {:ok, nil}
|
||||
|
||||
@impl Activity
|
||||
def get_object(member_id) do
|
||||
Actors.get_member(member_id)
|
||||
end
|
||||
|
||||
@spec get_author(Member.t(), Member.t() | nil) :: String.t() | integer()
|
||||
defp get_author(%Member{actor_id: actor_id}, options) do
|
||||
moderator = Keyword.get(options, :moderator)
|
||||
@@ -72,11 +77,12 @@ defmodule Mobilizon.Service.Activity.Member do
|
||||
if(is_nil(actor),
|
||||
do: subject_params,
|
||||
else:
|
||||
Map.put(
|
||||
subject_params,
|
||||
:member_preferred_username,
|
||||
subject_params
|
||||
|> Map.put(
|
||||
:member_actor_federated_username,
|
||||
Actor.preferred_username_and_domain(actor)
|
||||
)
|
||||
|> Map.put(:member_actor_name, actor.name)
|
||||
)
|
||||
|
||||
subject_params =
|
||||
|
||||
@@ -2,7 +2,7 @@ defmodule Mobilizon.Service.Activity.Post do
|
||||
@moduledoc """
|
||||
Insert an post activity
|
||||
"""
|
||||
alias Mobilizon.Actors
|
||||
alias Mobilizon.{Actors, Posts}
|
||||
alias Mobilizon.Posts.Post
|
||||
alias Mobilizon.Service.Activity
|
||||
alias Mobilizon.Service.Workers.ActivityBuilder
|
||||
@@ -34,4 +34,9 @@ defmodule Mobilizon.Service.Activity.Post do
|
||||
end
|
||||
|
||||
def insert_activity(_, _), do: {:ok, nil}
|
||||
|
||||
@impl Activity
|
||||
def get_object(post_id) do
|
||||
Posts.get_post(post_id)
|
||||
end
|
||||
end
|
||||
@@ -2,7 +2,7 @@ defmodule Mobilizon.Service.Activity.Resource do
|
||||
@moduledoc """
|
||||
Insert an resource activity
|
||||
"""
|
||||
alias Mobilizon.Actors
|
||||
alias Mobilizon.{Actors, Resources}
|
||||
alias Mobilizon.Resources.Resource
|
||||
alias Mobilizon.Service.Activity
|
||||
alias Mobilizon.Service.Workers.ActivityBuilder
|
||||
@@ -37,6 +37,11 @@ defmodule Mobilizon.Service.Activity.Resource do
|
||||
@impl Activity
|
||||
def insert_activity(_, _), do: {:ok, nil}
|
||||
|
||||
@impl Activity
|
||||
def get_object(resource_id) do
|
||||
Resources.get_resource(resource_id)
|
||||
end
|
||||
|
||||
@spec subject_params(Resource.t(), String.t() | nil, Resource.t() | nil) :: map()
|
||||
defp subject_params(%Resource{} = resource, "resource_renamed", old_resource) do
|
||||
resource
|
||||
@@ -44,7 +49,7 @@ defmodule Mobilizon.Service.Activity.Resource do
|
||||
|> Map.put(:old_resource_title, old_resource.title)
|
||||
end
|
||||
|
||||
defp subject_params(%Resource{path: path, title: title}, _, _) do
|
||||
%{resource_path: path, resource_title: title}
|
||||
defp subject_params(%Resource{path: path, title: title, type: type, id: id}, _, _) do
|
||||
%{resource_path: path, resource_title: title, is_folder: type == :folder, resource_uuid: id}
|
||||
end
|
||||
end
|
||||
|
||||
31
lib/service/notifier/email.ex
Normal file
31
lib/service/notifier/email.ex
Normal file
@@ -0,0 +1,31 @@
|
||||
defmodule Mobilizon.Service.Notifier.Email do
|
||||
@moduledoc """
|
||||
Email notifier
|
||||
"""
|
||||
alias Mobilizon.Activities.Activity
|
||||
alias Mobilizon.Config
|
||||
alias Mobilizon.Service.Notifier
|
||||
alias Mobilizon.Service.Notifier.Email
|
||||
alias Mobilizon.Users.User
|
||||
alias Mobilizon.Web.Email.Activity, as: EmailActivity
|
||||
alias Mobilizon.Web.Email.Mailer
|
||||
|
||||
@behaviour Notifier
|
||||
|
||||
@impl Notifier
|
||||
def ready? do
|
||||
Config.get(__MODULE__, :enabled)
|
||||
end
|
||||
|
||||
@impl Notifier
|
||||
def send(%User{} = user, %Activity{} = activity) do
|
||||
Email.send(user, [activity])
|
||||
end
|
||||
|
||||
@impl Notifier
|
||||
def send(%User{email: email, locale: locale}, activities) when is_list(activities) do
|
||||
email
|
||||
|> EmailActivity.direct_activity(activities, locale)
|
||||
|> Mailer.send_email()
|
||||
end
|
||||
end
|
||||
31
lib/service/notifier/notifier.ex
Normal file
31
lib/service/notifier/notifier.ex
Normal file
@@ -0,0 +1,31 @@
|
||||
defmodule Mobilizon.Service.Notifier do
|
||||
@moduledoc """
|
||||
Behaviour for notifiers
|
||||
"""
|
||||
alias Mobilizon.Activities.Activity
|
||||
alias Mobilizon.Config
|
||||
alias Mobilizon.Users.User
|
||||
|
||||
@doc """
|
||||
Whether the notifier is enabled and configured
|
||||
"""
|
||||
@callback ready?() :: boolean()
|
||||
|
||||
@doc """
|
||||
Sends one or multiple notifications from an activity
|
||||
"""
|
||||
@callback send(User.t(), Activity.t()) :: {:ok, any()} | {:error, String.t()}
|
||||
|
||||
@callback send(User.t(), list(Activity.t())) :: {:ok, any()} | {:error, String.t()}
|
||||
|
||||
def notify(%User{} = user, %Activity{} = activity, opts \\ []) do
|
||||
Enum.each(providers(opts), & &1.send(user, activity))
|
||||
end
|
||||
|
||||
@spec providers(Keyword.t()) :: list()
|
||||
defp providers(opts) do
|
||||
opts
|
||||
|> Keyword.get(:notifiers, Config.get([__MODULE__, :notifiers]))
|
||||
|> Enum.filter(& &1.ready?())
|
||||
end
|
||||
end
|
||||
38
lib/service/notifier/push.ex
Normal file
38
lib/service/notifier/push.ex
Normal file
@@ -0,0 +1,38 @@
|
||||
defmodule Mobilizon.Service.Notifier.Push do
|
||||
@moduledoc """
|
||||
WebPush notifier
|
||||
"""
|
||||
alias Mobilizon.Activities.Activity
|
||||
alias Mobilizon.Config
|
||||
alias Mobilizon.Service.Notifier
|
||||
alias Mobilizon.Service.Notifier.Push
|
||||
alias Mobilizon.Users.User
|
||||
|
||||
@behaviour Notifier
|
||||
|
||||
@impl Notifier
|
||||
def ready? do
|
||||
Config.get(__MODULE__, :enabled)
|
||||
end
|
||||
|
||||
@impl Notifier
|
||||
def send(%User{} = _user, %Activity{} = activity) do
|
||||
# Get user's subscriptions
|
||||
activity
|
||||
|> payload()
|
||||
|
||||
# |> WebPushEncryption.send_web_push()
|
||||
end
|
||||
|
||||
@impl Notifier
|
||||
def send(%User{} = user, activities) when is_list(activities) do
|
||||
Enum.each(activities, &Push.send(user, &1))
|
||||
end
|
||||
|
||||
defp payload(%Activity{subject: subject}) do
|
||||
%{
|
||||
title: subject
|
||||
}
|
||||
|> Jason.encode!()
|
||||
end
|
||||
end
|
||||
@@ -7,8 +7,12 @@ defmodule Mobilizon.Service.RichMedia.Parsers.Fallback do
|
||||
@moduledoc """
|
||||
Module to parse fallback data in HTML pages (plain old title and meta description)
|
||||
"""
|
||||
require Logger
|
||||
|
||||
@spec parse(String.t(), map()) :: {:ok, map()} | {:error, String.t()}
|
||||
def parse(html, data) do
|
||||
Logger.debug("Running Fallback parser")
|
||||
|
||||
data =
|
||||
data
|
||||
|> maybe_put(html, :title)
|
||||
|
||||
@@ -3,15 +3,20 @@ defmodule Mobilizon.Service.Workers.ActivityBuilder do
|
||||
Worker to insert activity items in users feeds
|
||||
"""
|
||||
|
||||
alias Mobilizon.Activities
|
||||
alias Mobilizon.{Activities, Actors, Users}
|
||||
alias Mobilizon.Activities.Activity
|
||||
alias Mobilizon.Actors.Actor
|
||||
alias Mobilizon.Service.Notifier
|
||||
alias Mobilizon.Users.User
|
||||
|
||||
use Mobilizon.Service.Workers.Helper, queue: "activity"
|
||||
|
||||
@impl Oban.Worker
|
||||
def perform(%Job{args: args}) do
|
||||
with {"build_activity", args} <- Map.pop(args, "op") do
|
||||
build_activity(args)
|
||||
with {"build_activity", args} <- Map.pop(args, "op"),
|
||||
{:ok, %Activity{} = activity} <- build_activity(args),
|
||||
preloaded_activity <- Activities.preload_activity(activity) do
|
||||
notify_activity(preloaded_activity)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -19,4 +24,27 @@ defmodule Mobilizon.Service.Workers.ActivityBuilder do
|
||||
def build_activity(args) do
|
||||
Activities.create_activity(args)
|
||||
end
|
||||
|
||||
@spec notify_activity(Activity.t()) :: :ok
|
||||
def notify_activity(%Activity{} = activity) do
|
||||
activity
|
||||
|> users_to_notify()
|
||||
|> Enum.each(&Notifier.notify(&1, activity))
|
||||
end
|
||||
|
||||
@spec users_to_notify(Activity.t()) :: list(User.t())
|
||||
defp users_to_notify(%Activity{group: %Actor{} = group, author_id: author_id}) do
|
||||
group
|
||||
|> Actors.list_internal_actors_members_for_group([
|
||||
:creator,
|
||||
:administrator,
|
||||
:moderator,
|
||||
:member
|
||||
])
|
||||
|> Enum.filter(&(&1.id != author_id))
|
||||
|> Enum.map(& &1.user_id)
|
||||
|> Enum.filter(& &1)
|
||||
|> Enum.uniq()
|
||||
|> Enum.map(&Users.get_user!/1)
|
||||
end
|
||||
end
|
||||
|
||||
14
lib/service/workers/digest_notifier_worker.ex
Normal file
14
lib/service/workers/digest_notifier_worker.ex
Normal file
@@ -0,0 +1,14 @@
|
||||
defmodule Mobilizon.Service.Workers.DigestNotifierWorker do
|
||||
@moduledoc """
|
||||
Worker to send notifications
|
||||
"""
|
||||
|
||||
use Mobilizon.Service.Workers.Helper, queue: "notifications"
|
||||
|
||||
@impl Oban.Worker
|
||||
def perform(%Job{}) do
|
||||
# Get last time activities were send
|
||||
# List activities to send
|
||||
# Send activites
|
||||
end
|
||||
end
|
||||
73
lib/web/email/activity.ex
Normal file
73
lib/web/email/activity.ex
Normal file
@@ -0,0 +1,73 @@
|
||||
defmodule Mobilizon.Web.Email.Activity do
|
||||
@moduledoc """
|
||||
Handles emails sent about activity notifications.
|
||||
"""
|
||||
use Bamboo.Phoenix, view: Mobilizon.Web.EmailView
|
||||
|
||||
import Bamboo.Phoenix
|
||||
import Mobilizon.Web.Gettext
|
||||
|
||||
alias Mobilizon.Activities.Activity
|
||||
alias Mobilizon.Actors.Actor
|
||||
alias Mobilizon.Config
|
||||
alias Mobilizon.Web.{Email, Gettext}
|
||||
|
||||
@spec direct_activity(String.t(), list(), String.t()) ::
|
||||
Bamboo.Email.t()
|
||||
def direct_activity(
|
||||
email,
|
||||
activities,
|
||||
locale \\ "en"
|
||||
) do
|
||||
Gettext.put_locale(locale)
|
||||
|
||||
subject =
|
||||
gettext(
|
||||
"Activity notification for %{instance}",
|
||||
instance: Config.instance_name()
|
||||
)
|
||||
|
||||
chunked_activities = chunk_activities(activities)
|
||||
|
||||
Email.base_email(to: email, subject: subject)
|
||||
|> assign(:locale, locale)
|
||||
|> assign(:subject, subject)
|
||||
|> assign(:activities, chunked_activities)
|
||||
|> assign(:total_number_activities, length(activities))
|
||||
|> render(:email_direct_activity)
|
||||
end
|
||||
|
||||
@spec chunk_activities(list()) :: map()
|
||||
defp chunk_activities(activities) do
|
||||
activities
|
||||
|> Enum.reduce(%{}, fn %Activity{group: %Actor{id: group_id}} = activity, acc ->
|
||||
Map.update(acc, group_id, [activity], fn activities -> activities ++ [activity] end)
|
||||
end)
|
||||
|> Enum.map(fn {key, value} ->
|
||||
{key, Enum.sort(value, &(&1.inserted_at <= &2.inserted_at))}
|
||||
end)
|
||||
|> Enum.map(fn {key, value} -> {key, filter_duplicates(value)} end)
|
||||
|> Enum.into(%{})
|
||||
end
|
||||
|
||||
# We filter duplicates when subject_params are being the same
|
||||
# so it will probably not catch much things
|
||||
@spec filter_duplicates(list()) :: list()
|
||||
defp filter_duplicates(activities) do
|
||||
Enum.uniq_by(activities, fn %Activity{
|
||||
author: %Actor{id: author_id},
|
||||
group: %Actor{id: group_id},
|
||||
type: type,
|
||||
subject: subject,
|
||||
subject_params: subject_params
|
||||
} ->
|
||||
%{
|
||||
author_id: author_id,
|
||||
group_id: group_id,
|
||||
type: type,
|
||||
subject: subject,
|
||||
subject_params: subject_params
|
||||
}
|
||||
end)
|
||||
end
|
||||
end
|
||||
@@ -30,6 +30,7 @@ defmodule Mobilizon.Web do
|
||||
quote do
|
||||
use Phoenix.View,
|
||||
root: "lib/web/templates",
|
||||
pattern: "**/*",
|
||||
namespace: Mobilizon.Web
|
||||
|
||||
# Import convenience functions from controllers
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
<%= case @activity.subject do %>
|
||||
<% :discussion_created -> %>
|
||||
<%=
|
||||
dgettext("activity", "%{profile} created the discussion %{discussion}.",
|
||||
%{
|
||||
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
|
||||
discussion: "<a href=\"#{
|
||||
page_url(
|
||||
Mobilizon.Web.Endpoint,
|
||||
:discussion,
|
||||
Mobilizon.Actors.Actor.preferred_username_and_domain(@activity.group), @activity.subject_params["discussion_slug"]
|
||||
) |> URI.decode()}\">
|
||||
#{@activity.subject_params["discussion_title"]}
|
||||
</a>"
|
||||
}
|
||||
) |> raw %>
|
||||
<% :discussion_replied -> %>
|
||||
<%=
|
||||
dgettext("activity", "%{profile} replied to the discussion %{discussion}.",
|
||||
%{
|
||||
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
|
||||
discussion: "<a href=\"#{
|
||||
page_url(
|
||||
Mobilizon.Web.Endpoint,
|
||||
:discussion,
|
||||
Mobilizon.Actors.Actor.preferred_username_and_domain(@activity.group), @activity.subject_params["discussion_slug"]
|
||||
) |> URI.decode()}\">
|
||||
#{@activity.subject_params["discussion_title"]}
|
||||
</a>"
|
||||
}
|
||||
) |> raw %>
|
||||
<% :discussion_renamed -> %>
|
||||
<%=
|
||||
dgettext("activity", "%{profile} renamed the discussion %{discussion}.",
|
||||
%{
|
||||
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
|
||||
discussion: "<a href=\"#{
|
||||
page_url(
|
||||
Mobilizon.Web.Endpoint,
|
||||
:discussion,
|
||||
Mobilizon.Actors.Actor.preferred_username_and_domain(@activity.group), @activity.subject_params["discussion_slug"]
|
||||
) |> URI.decode()}\">
|
||||
#{@activity.subject_params["discussion_title"]}
|
||||
</a>"
|
||||
}
|
||||
) |> raw %>
|
||||
<% :discussion_archived -> %>
|
||||
<%=
|
||||
dgettext("activity", "%{profile} archived the discussion %{discussion}.",
|
||||
%{
|
||||
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
|
||||
discussion: "<a href=\"#{
|
||||
page_url(
|
||||
Mobilizon.Web.Endpoint,
|
||||
:discussion,
|
||||
Mobilizon.Actors.Actor.preferred_username_and_domain(@activity.group), @activity.subject_params["discussion_slug"]
|
||||
) |> URI.decode()}\">
|
||||
#{@activity.subject_params["discussion_title"]}
|
||||
</a>"
|
||||
}
|
||||
) |> raw %>
|
||||
<% :discussion_deleted -> %>
|
||||
<%=
|
||||
dgettext("activity", "%{profile} deleted the discussion %{discussion}.",
|
||||
%{
|
||||
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
|
||||
discussion: "<b>#{@activity.subject_params["discussion_title"]}</b>"
|
||||
}
|
||||
) |> raw %>
|
||||
<% end %>
|
||||
@@ -0,0 +1,30 @@
|
||||
<%= case @activity.subject do %><% :discussion_created -> %><%= dgettext("activity", "%{profile} created the discussion %{discussion}.",
|
||||
%{
|
||||
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
|
||||
discussion: @activity.subject_params["discussion_title"]
|
||||
}
|
||||
) %>
|
||||
<%= page_url(Mobilizon.Web.Endpoint, :discussion, Mobilizon.Actors.Actor.preferred_username_and_domain(@activity.group), @activity.subject_params["discussion_slug"]) |> URI.decode() %><% :discussion_replied -> %><%= dgettext("activity", "%{profile} replied to the discussion %{discussion}.",
|
||||
%{
|
||||
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
|
||||
discussion: @activity.subject_params["discussion_title"]
|
||||
}
|
||||
) %>
|
||||
<%= page_url(Mobilizon.Web.Endpoint, :discussion, Mobilizon.Actors.Actor.preferred_username_and_domain(@activity.group), @activity.subject_params["discussion_slug"]) |> URI.decode() %><% :discussion_renamed -> %><%= dgettext("activity", "%{profile} renamed the discussion %{discussion}.",
|
||||
%{
|
||||
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
|
||||
discussion: @activity.subject_params["discussion_title"]
|
||||
}
|
||||
) %>
|
||||
<%= page_url(Mobilizon.Web.Endpoint, :discussion, Mobilizon.Actors.Actor.preferred_username_and_domain(@activity.group), @activity.subject_params["discussion_slug"]) |> URI.decode() %><% :discussion_archived -> %><%= dgettext("activity", "%{profile} archived the discussion %{discussion}.",
|
||||
%{
|
||||
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
|
||||
discussion: @activity.subject_params["discussion_title"]
|
||||
}
|
||||
) %>
|
||||
<%= page_url(Mobilizon.Web.Endpoint, :discussion, Mobilizon.Actors.Actor.preferred_username_and_domain(@activity.group), @activity.subject_params["discussion_slug"]) |> URI.decode() %><% :discussion_deleted -> %><%= dgettext("activity", "%{profile} deleted the discussion %{discussion}.",
|
||||
%{
|
||||
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
|
||||
discussion: @activity.subject_params["discussion_title"]
|
||||
}
|
||||
) %><% end %>
|
||||
@@ -0,0 +1,66 @@
|
||||
<%= case @activity.subject do %>
|
||||
<% :discussion_created -> %>
|
||||
<%=
|
||||
dgettext("activity", "%{profile} created the discussion %{discussion}.",
|
||||
%{
|
||||
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
|
||||
discussion: "<a href=\"#{
|
||||
page_url(
|
||||
Mobilizon.Web.Endpoint,
|
||||
:discussion,
|
||||
Mobilizon.Actors.Actor.preferred_username_and_domain(@activity.group), @activity.subject_params["discussion_slug"]
|
||||
) |> URI.decode()}\">
|
||||
#{@activity.subject_params["discussion_title"]}</a>"
|
||||
}
|
||||
) |> raw %>
|
||||
<% :discussion_replied -> %>
|
||||
<%=
|
||||
dgettext("activity", "%{profile} replied to the discussion %{discussion}.",
|
||||
%{
|
||||
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
|
||||
discussion: "<a href=\"#{
|
||||
page_url(
|
||||
Mobilizon.Web.Endpoint,
|
||||
:discussion,
|
||||
Mobilizon.Actors.Actor.preferred_username_and_domain(@activity.group), @activity.subject_params["discussion_slug"]
|
||||
) |> URI.decode()}\">
|
||||
#{@activity.subject_params["discussion_title"]}</a>"
|
||||
}
|
||||
) |> raw %>
|
||||
<% :discussion_renamed -> %>
|
||||
<%=
|
||||
dgettext("activity", "%{profile} renamed the discussion %{discussion}.",
|
||||
%{
|
||||
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
|
||||
discussion: "<a href=\"#{
|
||||
page_url(
|
||||
Mobilizon.Web.Endpoint,
|
||||
:discussion,
|
||||
Mobilizon.Actors.Actor.preferred_username_and_domain(@activity.group), @activity.subject_params["discussion_slug"]
|
||||
) |> URI.decode()}\">
|
||||
#{@activity.subject_params["discussion_title"]}</a>"
|
||||
}
|
||||
) |> raw %>
|
||||
<% :discussion_archived -> %>
|
||||
<%=
|
||||
dgettext("activity", "%{profile} archived the discussion %{discussion}.",
|
||||
%{
|
||||
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
|
||||
discussion: "<a href=\"#{
|
||||
page_url(
|
||||
Mobilizon.Web.Endpoint,
|
||||
:discussion,
|
||||
Mobilizon.Actors.Actor.preferred_username_and_domain(@activity.group), @activity.subject_params["discussion_slug"]
|
||||
) |> URI.decode()}\">
|
||||
#{@activity.subject_params["discussion_title"]}</a>"
|
||||
}
|
||||
) |> raw %>
|
||||
<% :discussion_deleted -> %>
|
||||
<%=
|
||||
dgettext("activity", "%{profile} deleted the discussion %{discussion}.",
|
||||
%{
|
||||
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
|
||||
discussion: "<b>#{@activity.subject_params["discussion_title"]}</b>"
|
||||
}
|
||||
) |> raw %>
|
||||
<% end %>
|
||||
@@ -0,0 +1,30 @@
|
||||
<%= case @activity.subject do %><% :discussion_created -> %><%= dgettext("activity", "%{profile} created the discussion %{discussion}.",
|
||||
%{
|
||||
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
|
||||
discussion: @activity.subject_params["discussion_title"]
|
||||
}
|
||||
) %>
|
||||
<%= page_url(Mobilizon.Web.Endpoint, :discussion, Mobilizon.Actors.Actor.preferred_username_and_domain(@activity.group), @activity.subject_params["discussion_slug"]) |> URI.decode() %><% :discussion_replied -> %><%= dgettext("activity", "%{profile} replied to the discussion %{discussion}.",
|
||||
%{
|
||||
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
|
||||
discussion: @activity.subject_params["discussion_title"]
|
||||
}
|
||||
) %>
|
||||
<%= page_url(Mobilizon.Web.Endpoint, :discussion, Mobilizon.Actors.Actor.preferred_username_and_domain(@activity.group), @activity.subject_params["discussion_slug"]) |> URI.decode() %><% :discussion_renamed -> %><%= dgettext("activity", "%{profile} renamed the discussion %{discussion}.",
|
||||
%{
|
||||
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
|
||||
discussion: @activity.subject_params["discussion_title"]
|
||||
}
|
||||
) %>
|
||||
<%= page_url(Mobilizon.Web.Endpoint, :discussion, Mobilizon.Actors.Actor.preferred_username_and_domain(@activity.group), @activity.subject_params["discussion_slug"]) |> URI.decode() %><% :discussion_archived -> %><%= dgettext("activity", "%{profile} archived the discussion %{discussion}.",
|
||||
%{
|
||||
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
|
||||
discussion: @activity.subject_params["discussion_title"]
|
||||
}
|
||||
) %>
|
||||
<%= page_url(Mobilizon.Web.Endpoint, :discussion, Mobilizon.Actors.Actor.preferred_username_and_domain(@activity.group), @activity.subject_params["discussion_slug"]) |> URI.decode() %><% :discussion_deleted -> %><%= dgettext("activity", "%{profile} deleted the discussion %{discussion}.",
|
||||
%{
|
||||
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
|
||||
discussion: @activity.subject_params["discussion_title"]
|
||||
}
|
||||
) %><% end %>
|
||||
@@ -0,0 +1,72 @@
|
||||
<%= case @activity.subject do %>
|
||||
<% :event_created -> %>
|
||||
<%=
|
||||
dgettext("activity", "The event %{event} was created by %{profile}.",
|
||||
%{
|
||||
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
|
||||
event: "<a href=\"#{
|
||||
page_url(
|
||||
Mobilizon.Web.Endpoint,
|
||||
:event,
|
||||
@activity.subject_params["event_uuid"]
|
||||
) |> URI.decode()}\">
|
||||
#{@activity.subject_params["event_title"]}
|
||||
</a>"
|
||||
}
|
||||
) |> raw %>
|
||||
<% :event_updated -> %>
|
||||
<%=
|
||||
dgettext("activity", "The event %{event} was updated by %{profile}.",
|
||||
%{
|
||||
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
|
||||
event: "<a href=\"#{
|
||||
page_url(
|
||||
Mobilizon.Web.Endpoint,
|
||||
:event,
|
||||
@activity.subject_params["event_uuid"]
|
||||
) |> URI.decode()}\">
|
||||
#{@activity.subject_params["event_title"]}
|
||||
</a>"
|
||||
}
|
||||
) |> raw %>
|
||||
<% :event_deleted -> %>
|
||||
<%=
|
||||
dgettext("activity", "The event %{event} was deleted by %{profile}.",
|
||||
%{
|
||||
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
|
||||
event: "<b>#{@activity.subject_params["event_title"]}</b>"
|
||||
}
|
||||
) |> raw %>
|
||||
<% :comment_posted -> %>
|
||||
<%= if @activity.subject_params["comment_reply_to"] do %>
|
||||
<%=
|
||||
dgettext("activity", "%{profile} replied to a comment on the event %{event}.",
|
||||
%{
|
||||
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
|
||||
event: "<a href=\"#{
|
||||
page_url(
|
||||
Mobilizon.Web.Endpoint,
|
||||
:event,
|
||||
@activity.subject_params["event_uuid"]
|
||||
) |> URI.decode()}\">
|
||||
#{@activity.subject_params["event_title"]}
|
||||
</a>"
|
||||
}
|
||||
) |> raw %>
|
||||
<% else %>
|
||||
<%=
|
||||
dgettext("activity", "%{profile} posted a comment on the event %{event}.",
|
||||
%{
|
||||
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
|
||||
event: "<a href=\"#{
|
||||
page_url(
|
||||
Mobilizon.Web.Endpoint,
|
||||
:event,
|
||||
@activity.subject_params["event_uuid"]
|
||||
) |> URI.decode()}\">
|
||||
#{@activity.subject_params["event_title"]}
|
||||
</a>"
|
||||
}
|
||||
) |> raw %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
@@ -0,0 +1,31 @@
|
||||
<%= case @activity.subject do %><% :event_created -> %><%= dgettext("activity", "The event %{event} was created by %{profile}.",
|
||||
%{
|
||||
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
|
||||
event: @activity.subject_params["event_title"]
|
||||
}
|
||||
) %>
|
||||
<%= page_url(Mobilizon.Web.Endpoint, :event, @activity.subject_params["event_uuid"]) |> URI.decode() %><% :event_updated -> %><%= dgettext("activity", "The event %{event} was updated by %{profile}.",
|
||||
%{
|
||||
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
|
||||
event: @activity.subject_params["event_title"]
|
||||
}
|
||||
) %>
|
||||
<%= page_url(Mobilizon.Web.Endpoint, :event, @activity.subject_params["event_uuid"]) |> URI.decode() %><% :event_deleted -> %><%= dgettext("activity", "The event %{event} was deleted by %{profile}.",
|
||||
%{
|
||||
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
|
||||
event: @activity.subject_params["event_title"]
|
||||
}
|
||||
) %>
|
||||
<% :comment_posted -> %><%= if @activity.subject_params["comment_reply_to"] do %><%= dgettext("activity", "%{profile} replied to a comment on the event %{event}.",
|
||||
%{
|
||||
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
|
||||
event: @activity.subject_params["event_title"]
|
||||
}
|
||||
) %>
|
||||
<%= page_url(Mobilizon.Web.Endpoint, :event, @activity.subject_params["event_uuid"]) |> URI.decode() %><% else %><%= dgettext("activity", "%{profile} posted a comment on the event %{event}.",
|
||||
%{
|
||||
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
|
||||
event: @activity.subject_params["event_title"]
|
||||
}
|
||||
) %>
|
||||
<%= page_url(Mobilizon.Web.Endpoint, :event, @activity.subject_params["event_uuid"]) |> URI.decode() %><% end %><% end %>
|
||||
@@ -0,0 +1,32 @@
|
||||
<%= case @activity.subject do %>
|
||||
<% :group_created -> %>
|
||||
<%=
|
||||
dgettext("activity", "%{profile} created the group %{group}.",
|
||||
%{
|
||||
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
|
||||
group: "<a href=\"#{
|
||||
page_url(
|
||||
Mobilizon.Web.Endpoint,
|
||||
:actor,
|
||||
@activity.subject_params["group_federated_username"]
|
||||
) |> URI.decode()}\">
|
||||
#{@activity.subject_params["group_name"]}
|
||||
</a>"
|
||||
}
|
||||
) |> raw %>
|
||||
<% :group_updated -> %>
|
||||
<%=
|
||||
dgettext("activity", "%{profile} updated the group %{group}.",
|
||||
%{
|
||||
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
|
||||
group: "<a href=\"#{
|
||||
page_url(
|
||||
Mobilizon.Web.Endpoint,
|
||||
:actor,
|
||||
@activity.subject_params["group_federated_username"]
|
||||
) |> URI.decode()}\">
|
||||
#{@activity.subject_params["group_name"]}
|
||||
</a>"
|
||||
}
|
||||
) |> raw %>
|
||||
<% end %>
|
||||
@@ -0,0 +1,13 @@
|
||||
<%= case @activity.subject do %><% :group_created -> %><%= dgettext("activity", "%{profile} created the group %{group}.",
|
||||
%{
|
||||
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
|
||||
group: @activity.subject_params["group_name"]
|
||||
}
|
||||
) %>
|
||||
<%= page_url(Mobilizon.Web.Endpoint, :actor, @activity.subject_params["group_federated_username"]) |> URI.decode() %><% :group_updated -> %><%= dgettext("activity", "%{profile} updated the group %{group}.",
|
||||
%{
|
||||
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
|
||||
group: @activity.subject_params["group_name"]
|
||||
}
|
||||
) %>
|
||||
<%= page_url(Mobilizon.Web.Endpoint, :actor, @activity.subject_params["group_federated_username"]) |> URI.decode() %><% end %>
|
||||
@@ -0,0 +1,69 @@
|
||||
<%= case @activity.subject do %>
|
||||
<% :member_request -> %>
|
||||
<%=
|
||||
dgettext("activity", "%{member} requested to join the group.",
|
||||
%{
|
||||
member: "<b>#{@activity.subject_params["member_actor_name"]}</b>",
|
||||
}
|
||||
) |> raw %>
|
||||
<% :member_invited -> %>
|
||||
<%=
|
||||
dgettext("activity", "%{member} was invited by %{profile}.",
|
||||
%{
|
||||
member: "<b>#{@activity.subject_params["member_actor_name"]}</b>",
|
||||
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
|
||||
}
|
||||
) |> raw %>
|
||||
<% :member_accepted_invitation -> %>
|
||||
<%=
|
||||
dgettext("activity", "%{member} accepted the invitation to join the group.",
|
||||
%{
|
||||
member: "<b>#{@activity.subject_params["member_actor_name"]}</b>",
|
||||
}
|
||||
) |> raw %>
|
||||
<% :member_rejected_invitation -> %>
|
||||
<%=
|
||||
dgettext("activity", "%{member} rejected the invitation to join the group.",
|
||||
%{
|
||||
member: "<b>#{@activity.subject_params["member_actor_name"]}</b>",
|
||||
}
|
||||
) |> raw %>
|
||||
<% :member_joined -> %>
|
||||
<%=
|
||||
dgettext("activity", "%{member} joined the group.",
|
||||
%{
|
||||
member: "<b title=\"#{@activity.subject_params["member_actor_federated_username"]}\">#{@activity.subject_params["member_actor_name"]}</b>",
|
||||
}
|
||||
) |> raw %>
|
||||
<% :member_added -> %>
|
||||
<%=
|
||||
dgettext("activity", "%{profile} added the member %{member}.",
|
||||
%{
|
||||
member: "<b>#{@activity.subject_params["member_actor_name"]}</b>",
|
||||
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
|
||||
}
|
||||
) |> raw %>
|
||||
<% :member_updated -> %>
|
||||
<%=
|
||||
dgettext("activity", "%{profile} updated the member %{member}.",
|
||||
%{
|
||||
member: "<b>#{@activity.subject_params["member_actor_name"]}</b>",
|
||||
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
|
||||
}
|
||||
) |> raw %>
|
||||
<% :member_removed -> %>
|
||||
<%=
|
||||
dgettext("activity", "%{profile} excluded member %{member}.",
|
||||
%{
|
||||
member: "<b>#{@activity.subject_params["member_actor_name"]}</b>",
|
||||
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
|
||||
}
|
||||
) |> raw %>
|
||||
<% :member_quit -> %>
|
||||
<%=
|
||||
dgettext("activity", "%{profile} quit the group.",
|
||||
%{
|
||||
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
|
||||
}
|
||||
) |> raw %>
|
||||
<% end %>
|
||||
@@ -0,0 +1,49 @@
|
||||
<%= case @activity.subject do %><% :member_request -> %><%= dgettext("activity", "%{member} requested to join the group.",
|
||||
%{
|
||||
member: @activity.subject_params["member_actor_name"],
|
||||
}
|
||||
) %>
|
||||
<% :member_invited -> %><%= dgettext("activity", "%{member} was invited by %{profile}.",
|
||||
%{
|
||||
member: @activity.subject_params["member_actor_name"],
|
||||
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
|
||||
}
|
||||
) %>
|
||||
<% :member_accepted_invitation -> %><%= dgettext("activity", "%{member} accepted the invitation to join the group.",
|
||||
%{
|
||||
member: @activity.subject_params["member_actor_name"],
|
||||
}
|
||||
) %>
|
||||
<% :member_rejected_invitation -> %><%= dgettext("activity", "%{member} rejected the invitation to join the group.",
|
||||
%{
|
||||
member: @activity.subject_params["member_actor_name"],
|
||||
}
|
||||
) %>
|
||||
<% :member_joined -> %><%= dgettext("activity", "%{member} joined the group.",
|
||||
%{
|
||||
member: @activity.subject_params["member_actor_name"],
|
||||
}
|
||||
) %>
|
||||
<% :member_added -> %><%= dgettext("activity", "%{profile} added the member %{member}.",
|
||||
%{
|
||||
member: @activity.subject_params["member_actor_name"],
|
||||
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
|
||||
}
|
||||
) %>
|
||||
<% :member_updated -> %><%= dgettext("activity", "%{profile} updated the member %{member}.",
|
||||
%{
|
||||
member: @activity.subject_params["member_actor_name"],
|
||||
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
|
||||
}
|
||||
) %>
|
||||
<% :member_removed -> %><%= dgettext("activity", "%{profile} excluded member %{member}.",
|
||||
%{
|
||||
member: @activity.subject_params["member_actor_name"],
|
||||
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
|
||||
}
|
||||
) %>
|
||||
<% :member_quit -> %><%= dgettext("activity", "%{profile} quit the group.",
|
||||
%{
|
||||
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
|
||||
}
|
||||
) %><% end %>
|
||||
@@ -0,0 +1,40 @@
|
||||
<%= case @activity.subject do %>
|
||||
<% :post_created -> %>
|
||||
<%=
|
||||
dgettext("activity", "The post %{post} was created by %{profile}.",
|
||||
%{
|
||||
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
|
||||
post: "<a href=\"#{
|
||||
page_url(
|
||||
Mobilizon.Web.Endpoint,
|
||||
:post,
|
||||
@activity.subject_params["post_slug"]
|
||||
) |> URI.decode()}\">
|
||||
#{@activity.subject_params["post_title"]}
|
||||
</a>"
|
||||
}
|
||||
) |> raw %>
|
||||
<% :post_updated -> %>
|
||||
<%=
|
||||
dgettext("activity", "The post %{post} was updated by %{profile}.",
|
||||
%{
|
||||
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
|
||||
post: "<a href=\"#{
|
||||
page_url(
|
||||
Mobilizon.Web.Endpoint,
|
||||
:post,
|
||||
@activity.subject_params["post_slug"]
|
||||
) |> URI.decode()}\">
|
||||
#{@activity.subject_params["post_title"]}
|
||||
</a>"
|
||||
}
|
||||
) |> raw %>
|
||||
<% :post_deleted -> %>
|
||||
<%=
|
||||
dgettext("activity", "The post %{post} was deleted by %{profile}.",
|
||||
%{
|
||||
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
|
||||
post: "<b>#{@activity.subject_params["post_title"]}</b>"
|
||||
}
|
||||
) |> raw %>
|
||||
<% end %>
|
||||
@@ -0,0 +1,18 @@
|
||||
<%= case @activity.subject do %><% :post_created -> %><%= dgettext("activity", "The post %{post} was created by %{profile}.",
|
||||
%{
|
||||
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
|
||||
post: @activity.subject_params["post_title"]
|
||||
}
|
||||
) %>
|
||||
<%= page_url(Mobilizon.Web.Endpoint, :post, @activity.subject_params["post_slug"]) |> URI.decode() %><% :post_updated -> %><%= dgettext("activity", "The post %{post} was updated by %{profile}.",
|
||||
%{
|
||||
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
|
||||
post: @activity.subject_params["post_title"]
|
||||
}
|
||||
) %>
|
||||
<%= page_url(Mobilizon.Web.Endpoint, :post, @activity.subject_params["post_slug"]) |> URI.decode() %><% :post_deleted -> %><%= dgettext("activity", "The post %{post} was deleted by %{profile}.",
|
||||
%{
|
||||
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
|
||||
post: @activity.subject_params["post_title"]
|
||||
}
|
||||
) %><% end %>
|
||||
@@ -0,0 +1,118 @@
|
||||
<%= case @activity.subject do %>
|
||||
<% :resource_created -> %>
|
||||
<%= if @activity.subject_params["is_folder"] do %>
|
||||
<%=
|
||||
dgettext("activity", "%{profile} created the folder %{resource}.",
|
||||
%{
|
||||
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
|
||||
resource: "<a href=\"#{
|
||||
page_url(
|
||||
Mobilizon.Web.Endpoint,
|
||||
:resource,
|
||||
@activity.subject_params["resource_uuid"]
|
||||
) |> URI.decode()}\">
|
||||
#{@activity.subject_params["resource_title"]}
|
||||
</a>"
|
||||
}
|
||||
) |> raw %>
|
||||
<% else %>
|
||||
<%=
|
||||
dgettext("activity", "%{profile} created the resource %{resource}.",
|
||||
%{
|
||||
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
|
||||
resource: "<a href=\"#{
|
||||
page_url(
|
||||
Mobilizon.Web.Endpoint,
|
||||
:resource,
|
||||
@activity.subject_params["resource_uuid"]
|
||||
) |> URI.decode()}\">
|
||||
#{@activity.subject_params["resource_title"]}
|
||||
</a>"
|
||||
}
|
||||
) |> raw %>
|
||||
<% end %>
|
||||
<% :resource_renamed -> %>
|
||||
<%= if @activity.subject_params["is_folder"] do %>
|
||||
<%=
|
||||
dgettext("activity", "%{profile} renamed the folder from %{old_resource_title} to %{resource}.",
|
||||
%{
|
||||
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
|
||||
resource: "<a href=\"#{
|
||||
page_url(
|
||||
Mobilizon.Web.Endpoint,
|
||||
:resource,
|
||||
@activity.subject_params["resource_uuid"]
|
||||
) |> URI.decode()}\">
|
||||
#{@activity.subject_params["resource_title"]}
|
||||
</a>",
|
||||
old_resource_title: "<b>#{@activity.subject_params["old_resource_title"]}</b>"
|
||||
}
|
||||
) |> raw %>
|
||||
<% else %>
|
||||
<%=
|
||||
dgettext("activity", "%{profile} renamed the resource from %{old_resource_title} to %{resource}.",
|
||||
%{
|
||||
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
|
||||
resource: "<a href=\"#{
|
||||
page_url(
|
||||
Mobilizon.Web.Endpoint,
|
||||
:resource,
|
||||
@activity.subject_params["resource_uuid"]
|
||||
) |> URI.decode()}\">
|
||||
#{@activity.subject_params["resource_title"]}
|
||||
</a>",
|
||||
old_resource_title: "<b>#{@activity.subject_params["old_resource_title"]}</b>"
|
||||
}
|
||||
) |> raw %>
|
||||
<% end %>
|
||||
<% :resource_moved -> %>
|
||||
<%= if @activity.subject_params["is_folder"] do %>
|
||||
<%=
|
||||
dgettext("activity", "%{profile} moved the folder %{resource}.",
|
||||
%{
|
||||
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
|
||||
resource: "<a href=\"#{
|
||||
page_url(
|
||||
Mobilizon.Web.Endpoint,
|
||||
:resource,
|
||||
@activity.subject_params["resource_uuid"]
|
||||
) |> URI.decode()}\">
|
||||
#{@activity.subject_params["resource_title"]}
|
||||
</a>"
|
||||
}
|
||||
) |> raw %>
|
||||
<% else %>
|
||||
<%=
|
||||
dgettext("activity", "%{profile} moved the resource %{resource}.",
|
||||
%{
|
||||
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
|
||||
resource: "<a href=\"#{
|
||||
page_url(
|
||||
Mobilizon.Web.Endpoint,
|
||||
:resource,
|
||||
@activity.subject_params["resource_uuid"]
|
||||
) |> URI.decode()}\">
|
||||
#{@activity.subject_params["resource_title"]}
|
||||
</a>"
|
||||
}
|
||||
) |> raw %>
|
||||
<% end %>
|
||||
<% :resource_deleted -> %>
|
||||
<%= if @activity.subject_params["is_folder"] do %>
|
||||
<%=
|
||||
dgettext("activity", "%{profile} deleted the folder %{resource}.",
|
||||
%{
|
||||
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
|
||||
resource: "<b>#{@activity.subject_params["resource_title"]}</b>"
|
||||
}
|
||||
) |> raw %>
|
||||
<% else %>
|
||||
<%=
|
||||
dgettext("activity", "%{profile} deleted the resource %{resource}.",
|
||||
%{
|
||||
profile: "<b>#{Mobilizon.Actors.Actor.display_name_and_username(@activity.author)}</b>",
|
||||
resource: "<b>#{@activity.subject_params["resource_title"]}</b>"
|
||||
}
|
||||
) |> raw %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
@@ -0,0 +1,50 @@
|
||||
<%= case @activity.subject do %>
|
||||
<% :resource_created -> %><%= if @activity.subject_params["is_folder"] do %><%= dgettext("activity", "%{profile} created the folder %{resource}.",
|
||||
%{
|
||||
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
|
||||
resource: @activity.subject_params["resource_title"]
|
||||
}
|
||||
) %>
|
||||
<%= page_url(Mobilizon.Web.Endpoint, :resource, @activity.subject_params["resource_uuid"]) |> URI.decode() %><% else %><%= dgettext("activity", "%{profile} created the resource %{resource}.",
|
||||
%{
|
||||
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
|
||||
resource: @activity.subject_params["resource_title"]
|
||||
}
|
||||
) %>
|
||||
<%= page_url(Mobilizon.Web.Endpoint, :resource, @activity.subject_params["resource_uuid"]) |> URI.decode() %><% end %><% :resource_renamed -> %><%= if @activity.subject_params["is_folder"] do %><%= dgettext("activity", "%{profile} renamed the folder from %{old_resource_title} to %{resource}.",
|
||||
%{
|
||||
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
|
||||
resource: @activity.subject_params["resource_title"],
|
||||
old_resource_title: @activity.subject_params["old_resource_title"]
|
||||
}
|
||||
) %>
|
||||
<%= page_url(Mobilizon.Web.Endpoint, :resource, @activity.subject_params["resource_uuid"]) |> URI.decode() %><% else %><%= dgettext("activity", "%{profile} renamed the resource from %{old_resource_title} to %{resource}.",
|
||||
%{
|
||||
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
|
||||
resource: @activity.subject_params["resource_title"],
|
||||
old_resource_title: @activity.subject_params["old_resource_title"]
|
||||
}
|
||||
) %>
|
||||
<%= page_url(Mobilizon.Web.Endpoint, :resource, @activity.subject_params["resource_uuid"]) |> URI.decode() %><% end %><% :resource_moved -> %><%= if @activity.subject_params["is_folder"] do %><%= dgettext("activity", "%{profile} moved the folder %{resource}.",
|
||||
%{
|
||||
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
|
||||
resource: @activity.subject_params["resource_title"]
|
||||
}
|
||||
) %>
|
||||
<%= page_url(Mobilizon.Web.Endpoint, :resource, @activity.subject_params["resource_uuid"]) |> URI.decode() %><% else %><%= dgettext("activity", "%{profile} moved the resource %{resource}.",
|
||||
%{
|
||||
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
|
||||
resource: @activity.subject_params["resource_title"]
|
||||
}
|
||||
) %>
|
||||
<%= page_url(Mobilizon.Web.Endpoint, :resource, @activity.subject_params["resource_uuid"]) |> URI.decode() %><% end %><% :resource_deleted -> %><%= if @activity.subject_params["is_folder"] do %><%= dgettext("activity", "%{profile} deleted the folder %{resource}.",
|
||||
%{
|
||||
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
|
||||
resource: @activity.subject_params["resource_title"]
|
||||
}
|
||||
) %><% else %><%= dgettext("activity", "%{profile} deleted the resource %{resource}.",
|
||||
%{
|
||||
profile: Mobilizon.Actors.Actor.display_name_and_username(@activity.author),
|
||||
resource: @activity.subject_params["resource_title"]
|
||||
}
|
||||
) %><% end %><% end %>
|
||||
@@ -10,14 +10,15 @@
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<style type="text/css">
|
||||
/* CLIENT-SPECIFIC STYLES */
|
||||
body, table, td, a { -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; }
|
||||
table, td { mso-table-lspace: 0pt; mso-table-rspace: 0pt; }
|
||||
* { -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; }
|
||||
table, td { mso-table-lspace: 0pt !important; mso-table-rspace: 0pt !important; }
|
||||
img { -ms-interpolation-mode: bicubic; }
|
||||
|
||||
/* RESET STYLES */
|
||||
img { border: 0; height: auto; line-height: 100%; outline: none; text-decoration: none; }
|
||||
table { border-collapse: collapse !important; }
|
||||
body { height: 100% !important; margin: 0 !important; padding: 0 !important; width: 100% !important; }
|
||||
table { border-spacing: 0 !important; border-collapse: collapse !important; table-layout: fixed !important; margin: 0 auto !important; }
|
||||
table table table { table-layout: auto; }
|
||||
html, body { height: 100% !important; margin: 0 !important; padding: 0 !important; width: 100% !important; }
|
||||
|
||||
/* iOS BLUE LINKS */
|
||||
a[x-apple-data-detectors] {
|
||||
@@ -41,7 +42,7 @@
|
||||
div[style*="margin: 16px 0;"] { margin: 0 !important; }
|
||||
</style>
|
||||
</head>
|
||||
<body style="background-color: #ECEBF2; margin: 0 !important; padding: 0 !important;">
|
||||
<body style="background-color: #ECEBF2; margin: 0 !important; padding: 0 !important;mso-line-height-rule: exactly;">
|
||||
<table border="0" cellpadding="0" cellspacing="0" width="100%">
|
||||
<!-- LOGO -->
|
||||
<tr>
|
||||
|
||||
151
lib/web/templates/email/email_direct_activity.html.eex
Normal file
151
lib/web/templates/email/email_direct_activity.html.eex
Normal file
@@ -0,0 +1,151 @@
|
||||
<!-- HERO -->
|
||||
<tr>
|
||||
<td bgcolor="#474467" align="center" style="padding: 0px 10px 0px 10px;">
|
||||
<!--[if (gte mso 9)|(IE)]>
|
||||
<table align="center" border="0" cellspacing="0" cellpadding="0" width="600">
|
||||
<tr>
|
||||
<td align="center" valign="top" width="600">
|
||||
<![endif]-->
|
||||
<table border="0" cellpadding="0" cellspacing="0" width="100%" style="max-width: 600px;" >
|
||||
<tr>
|
||||
<td bgcolor="#ffffff" align="center" valign="top" style="padding: 40px 20px 20px 20px; border-radius: 4px 4px 0px 0px; color: #3A384C; font-family: 'Roboto', Helvetica, Arial, sans-serif; font-size: 48px; font-weight: 400; line-height: 48px;">
|
||||
<h1 style="font-size: 48px; font-weight: 400; margin: 0;">
|
||||
<%= @subject %>
|
||||
</h1>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<!--[if (gte mso 9)|(IE)]>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<![endif]-->
|
||||
</td>
|
||||
</tr>
|
||||
<!-- COPY BLOCK -->
|
||||
<tr>
|
||||
<td bgcolor="#E6E4F4" align="center" style="padding: 0px 10px 0px 10px;">
|
||||
<!--[if (gte mso 9)|(IE)]>
|
||||
<table align="center" border="0" cellspacing="0" cellpadding="0" width="600">
|
||||
<tr>
|
||||
<td align="center" valign="top" width="600">
|
||||
<![endif]-->
|
||||
<table border="0" cellpadding="0" cellspacing="0" width="100%" style="max-width: 600px;" >
|
||||
<!-- COPY -->
|
||||
<tr>
|
||||
<td bgcolor="#ffffff" align="left" style="padding: 20px 5% 0px; color: #474467; font-family: 'Roboto', Helvetica, Arial, sans-serif; font-size: 18px; font-weight: 400; line-height: 25px;" >
|
||||
<p style="margin: 0;">
|
||||
<%= dngettext("activity", "There has been an activity!", "There has been some activity!", @total_number_activities) %>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td bgcolor="#ffffff" align="left">
|
||||
<table width="100%" border="0" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td align="center" style="border-radius: 3px; text-align: left; padding: 10px 5% 0px 30px; color: #474467; font-family: 'Roboto', Helvetica, Arial, sans-serif; font-size: 16px; font-weight: 400;line-height: 25px;" >
|
||||
<ul style="margin: 0 auto; padding-left: 15px;">
|
||||
<%= for {_, group_activities} <- @activities do %>
|
||||
<li style="list-style: none;border-bottom: solid 2px #d7d6de;padding: 10px 0;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td align="left">
|
||||
<table align="left">
|
||||
<tr>
|
||||
<%= if hd(group_activities).group.avatar do %>
|
||||
<td width="85">
|
||||
<a href="<%= page_url(Mobilizon.Web.Endpoint, :actor, Mobilizon.Actors.Actor.preferred_username_and_domain(hd(group_activities).group)) |> URI.decode() %>" target="_blank" style="text-decoration: none;">
|
||||
<img width="80" src="<%= hd(group_activities).group.avatar.url %>" style="width: 80px;max-height: 100px;" style="margin:0; padding:0; border:none; display:block;" border="0" alt="" />
|
||||
</a>
|
||||
</td>
|
||||
<% end %>
|
||||
<td width="400">
|
||||
<table width="" cellpadding="0" cellspacing="0" border="0" style="max-width: 400px;width: 100%;" align="left">
|
||||
<tr>
|
||||
<td align="left">
|
||||
<a href="<%= page_url(Mobilizon.Web.Endpoint, :actor, Mobilizon.Actors.Actor.preferred_username_and_domain(hd(group_activities).group)) |> URI.decode() %>" target="_blank" style="text-decoration: none;color: #474467;font-family: 'Roboto', Helvetica, Arial, sans-serif;font-size: 18px;font-weight: bold;line-height: 25px;">
|
||||
<%= hd(group_activities).group.name || "@#{Mobilizon.Actors.Actor.preferred_username_and_domain(hd(group_activities).group)}" %>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<%= if hd(group_activities).group.name do %>
|
||||
<tr>
|
||||
<td align="left">
|
||||
<a href="<%= page_url(Mobilizon.Web.Endpoint, :actor, Mobilizon.Actors.Actor.preferred_username_and_domain(hd(group_activities).group)) |> URI.decode() %>" target="_blank" style="text-decoration: none;display: block;color: #7a7a7a;font-family: 'Roboto', Helvetica, Arial, sans-serif;font-size: 16px;font-weight: 400;line-height: 25px;">
|
||||
@<%= Mobilizon.Actors.Actor.preferred_username_and_domain(hd(group_activities).group) %>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<% end %>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<ul style="padding-left: 25px;margin-top: 10px;">
|
||||
<%= for activity <- Enum.take(group_activities, 5) do %>
|
||||
<li style="margin-bottom: 7px;">
|
||||
<p style="margin: 0;">
|
||||
<%= case activity.type do %>
|
||||
<% :discussion -> %>
|
||||
<%= render("activity/_discussion_activity_item.html", activity: activity) %>
|
||||
<% :event -> %>
|
||||
<%= render("activity/_event_activity_item.html", activity: activity) %>
|
||||
<% :group -> %>
|
||||
<%= render("activity/_group_activity_item.html", activity: activity) %>
|
||||
<% :member -> %>
|
||||
<%= render("activity/_member_activity_item.html", activity: activity) %>
|
||||
<% :post -> %>
|
||||
<%= render("activity/_post_activity_item.html", activity: activity) %>
|
||||
<% :resource -> %>
|
||||
<%= render("activity/_resource_activity_item.html", activity: activity) %>
|
||||
<% :comment -> %>
|
||||
<%= render("activity/_comment_activity_item.html", activity: activity) %>
|
||||
<% end %>
|
||||
</p>
|
||||
<em><%= datetime_relative(activity.inserted_at, @locale) %></em>
|
||||
</li>
|
||||
<% end %>
|
||||
</ul>
|
||||
<%= if length(group_activities) > 5 do %>
|
||||
<table width="100%" border="0" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td bgcolor="#ffffff" align="center" style="padding: 20px 30px;">
|
||||
<table border="0" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td align="center" style="border-radius: 3px;" bgcolor="#3C376E">
|
||||
<a href="<%= page_url(Mobilizon.Web.Endpoint, :actor, Mobilizon.Actors.Actor.preferred_username_and_domain(hd(group_activities).group)) |> URI.decode() %>/timeline" target="_blank" style="font-size: 20px; font-family: Helvetica, Arial, sans-serif; color: #ffffff; text-decoration: none; padding: 15px 25px; border-radius: 2px; border: 1px solid #3C376E; display: inline-block;">
|
||||
<%= dngettext "activity", "View one more activity", "View %{count} more activities", length(group_activities) - 5, %{count: length(group_activities) - 5} %>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<% end %>
|
||||
</li>
|
||||
<% end %>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td bgcolor="#ffffff" align="left" style="padding: 20px 30px 40px 30px; color: #474467; font-family: 'Roboto', Helvetica, Arial, sans-serif; font-size: 14px; font-weight: 400; line-height: 20px;" >
|
||||
<p style="margin: 0">
|
||||
<%= dgettext "activity", "Don't want to receive activity notifications? You may change frequency or disable them in your settings." %>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<!--[if (gte mso 9)|(IE)]>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<![endif]-->
|
||||
</td>
|
||||
</tr>
|
||||
21
lib/web/templates/email/email_direct_activity.text.eex
Normal file
21
lib/web/templates/email/email_direct_activity.text.eex
Normal file
@@ -0,0 +1,21 @@
|
||||
<%= @subject %>
|
||||
|
||||
==
|
||||
<%= dngettext("activity", "There has been an activity!", "There has been some activity!", @total_number_activities) %>
|
||||
|
||||
<%= for {_, group_activities} <- @activities do %>
|
||||
|
||||
==
|
||||
<%= hd(group_activities).group.name || "@#{Mobilizon.Actors.Actor.preferred_username_and_domain(hd(group_activities).group)}" %>
|
||||
|
||||
<%= for activity <- Enum.take(group_activities, 5) do %>
|
||||
* <%= case activity.type do %><% :discussion -> %><%= render("activity/_discussion_activity_item.text", activity: activity) %><% :event -> %><%= render("activity/_event_activity_item.text", activity: activity) %><% :group -> %><%= render("activity/_group_activity_item.text", activity: activity) %>
|
||||
<% :member -> %><%= render("activity/_member_activity_item.text", activity: activity) %><% :post -> %><%= render("activity/_post_activity_item.text", activity: activity) %><% :resource -> %><%= render("activity/_resource_activity_item.text", activity: activity) %><% :comment -> %><%= render("activity/_comment_activity_item.text", activity: activity) %><% end %>
|
||||
<%= datetime_relative(activity.inserted_at, @locale) %>
|
||||
<% end %>
|
||||
<%= if length(group_activities) > 5 do %>
|
||||
<%= dngettext "activity", "View one more activity", "View %{count} more activities", length(group_activities) - 5, %{count: length(group_activities) - 5} %>
|
||||
<%= page_url(Mobilizon.Web.Endpoint, :actor, Mobilizon.Actors.Actor.preferred_username_and_domain(hd(group_activities).group)) |> URI.decode() %>/timeline
|
||||
<% end %>
|
||||
<% end %>
|
||||
<%= dgettext("activity", "Don't want to receive activity notifications? You may change frequency or disable them in your settings.") %>
|
||||
@@ -1,6 +1,7 @@
|
||||
defmodule Mobilizon.Web.EmailView do
|
||||
use Mobilizon.Web, :view
|
||||
|
||||
alias Cldr.DateTime.Relative
|
||||
import Mobilizon.Web.Gettext
|
||||
|
||||
def datetime_to_string(%DateTime{} = datetime, locale \\ "en", format \\ :medium) do
|
||||
@@ -27,4 +28,12 @@ defmodule Mobilizon.Web.EmailView do
|
||||
datetime
|
||||
end
|
||||
end
|
||||
|
||||
@spec datetime_relative(DateTime.t(), String.t()) :: String.t()
|
||||
def datetime_relative(%DateTime{} = datetime, locale \\ "en") do
|
||||
Relative.to_string!(datetime, Mobilizon.Cldr,
|
||||
relative_to: DateTime.utc_now(),
|
||||
locale: locale
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user