From 068ed9f5659dfe81bd883c5645ea47d6e553e142 Mon Sep 17 00:00:00 2001
From: mdashlw <mdashlw@gmail.com>
Date: Thu, 2 May 2024 09:32:44 +0300
Subject: [PATCH] feat: add "retained" column to tag changes table

---
 .../templates/tag_change/index.html.slime      |  5 +++++
 lib/philomena_web/views/tag_change_view.ex     | 18 ++++++++++++++++++
 2 files changed, 23 insertions(+)

diff --git a/lib/philomena_web/templates/tag_change/index.html.slime b/lib/philomena_web/templates/tag_change/index.html.slime
index 36f0630e..a5f6b64b 100644
--- a/lib/philomena_web/templates/tag_change/index.html.slime
+++ b/lib/philomena_web/templates/tag_change/index.html.slime
@@ -19,6 +19,7 @@
           th Action
           th Timestamp
           th User
+          th Retained?
           = if reverts_tag_changes?(@conn) do
             th Moderation
 
@@ -62,6 +63,10 @@
                   ' This user is a staff member.
                   br
                   ' Ask them before reverting their changes.
+            = if tag_change_retained(tag_change) do
+              td.success Yes
+            - else
+              td.danger No
             = if reverts_tag_changes?(@conn) do
               td
                 a href=Routes.image_tag_change_path(@conn, :delete, tag_change.image, tag_change) data-method="delete" data-confirm="Are you really, really sure?"
diff --git a/lib/philomena_web/views/tag_change_view.ex b/lib/philomena_web/views/tag_change_view.ex
index e821ca93..b464eb60 100644
--- a/lib/philomena_web/views/tag_change_view.ex
+++ b/lib/philomena_web/views/tag_change_view.ex
@@ -15,4 +15,22 @@ defmodule PhilomenaWeb.TagChangeView do
 
   def reverts_tag_changes?(conn),
     do: can?(conn, :revert, Philomena.TagChanges.TagChange)
+
+  def tag_change_retained(%{image: image, added: true, tag: %{id: tag_id}}) do
+    Enum.any?(image.tags, &(&1.id == tag_id))
+  end
+
+  def tag_change_retained(%{image: image, added: true, tag_name_cache: tag_name}) do
+    Enum.any?(image.tags, &(&1.name == tag_name))
+  end
+
+  def tag_change_retained(%{image: image, added: false, tag: %{id: tag_id}}) do
+    not Enum.any?(image.tags, &(&1.id == tag_id))
+  end
+
+  def tag_change_retained(%{image: image, added: false, tag_name_cache: tag_name}) do
+    not Enum.any?(image.tags, &(&1.name == tag_name))
+  end
+
+  def tag_change_retained(_), do: false
 end