From 4495605ade71e622ddb9ffe1c99ccd16bc1299b8 Mon Sep 17 00:00:00 2001
From: Julian Leucker <leuckerj@gmail.com>
Date: Fri, 13 Jan 2023 23:23:11 +0100
Subject: [PATCH] Generic Button Menu component

---
 .../assets/components/generic/ButtonMenu.vue  |  35 ++++++
 .../components/person/PersonActions.vue       | 115 +++++++++---------
 2 files changed, 91 insertions(+), 59 deletions(-)
 create mode 100644 aleksis/core/assets/components/generic/ButtonMenu.vue

diff --git a/aleksis/core/assets/components/generic/ButtonMenu.vue b/aleksis/core/assets/components/generic/ButtonMenu.vue
new file mode 100644
index 000000000..84239da53
--- /dev/null
+++ b/aleksis/core/assets/components/generic/ButtonMenu.vue
@@ -0,0 +1,35 @@
+<template>
+  <v-menu
+      transition="slide-y-transition"
+      offset-y
+  >
+    <template #activator="{ on, attrs }">
+      <slot name="activator" v-bind="{ on, attrs }">
+        <v-btn outlined text v-bind="attrs" v-on="on">
+          <v-icon center>
+            {{ icon }}
+          </v-icon>
+        </v-btn>
+      </slot>
+    </template>
+
+    <v-list>
+      <slot/>
+    </v-list>
+  </v-menu>
+</template>
+
+<script>
+export default {
+  name: "ButtonMenu",
+  props: {
+    icon: {
+      type: String,
+      required: false,
+      default: "mdi-dots-horizontal",
+    }
+  }
+};
+</script>
+
+<style scoped></style>
diff --git a/aleksis/core/assets/components/person/PersonActions.vue b/aleksis/core/assets/components/person/PersonActions.vue
index 9e9518c9a..6332831c7 100644
--- a/aleksis/core/assets/components/person/PersonActions.vue
+++ b/aleksis/core/assets/components/person/PersonActions.vue
@@ -25,81 +25,78 @@
           {{ $t("preferences.person.change_preferences") }}
         </v-btn>
 
-        <v-menu
+        <button-menu
           v-if="
             data.person.canImpersonatePerson ||
             data.person.canInvitePerson ||
             data.person.canDeletePerson
           "
         >
-          <template #activator="{ on, attrs }">
-            <v-btn outlined text v-bind="attrs" v-on="on">
-              <v-icon center>mdi-dots-horizontal</v-icon>
-            </v-btn>
-          </template>
-          <v-list>
-            <v-list-item
-              v-if="data.person.canImpersonatePerson"
-              :to="{
-                name: 'impersonate.impersonateByUserPk',
-                params: { uid: data.person.userid },
-                query: { next: $route.path },
-              }"
-            >
-              <v-list-item-icon>
-                <v-icon>mdi-account-box-outline</v-icon>
-              </v-list-item-icon>
-              <v-list-item-content>
-                <v-list-item-title>
-                  {{ $t("person.impersonation.impersonate") }}
-                </v-list-item-title>
-              </v-list-item-content>
-            </v-list-item>
+          <v-list-item
+            v-if="data.person.canImpersonatePerson"
+            :to="{
+              name: 'impersonate.impersonateByUserPk',
+              params: { uid: data.person.userid },
+              query: { next: $route.path },
+            }"
+          >
+            <v-list-item-icon>
+              <v-icon>mdi-account-box-outline</v-icon>
+            </v-list-item-icon>
+            <v-list-item-content>
+              <v-list-item-title>
+                {{ $t("person.impersonation.impersonate") }}
+              </v-list-item-title>
+            </v-list-item-content>
+          </v-list-item>
 
-            <v-list-item
-              v-if="data.person.canInvitePerson"
-              :to="{
-                name: 'core.invitePerson',
-                params: { id: data.person.id },
-              }"
-            >
-              <v-list-item-icon>
-                <v-icon>mdi-account-plus-outline</v-icon>
-              </v-list-item-icon>
-              <v-list-item-content>
-                <v-list-item-title>
-                  {{ $t("person.invite") }}
-                </v-list-item-title>
-              </v-list-item-content>
-            </v-list-item>
+          <v-list-item
+            v-if="data.person.canInvitePerson"
+            :to="{
+              name: 'core.invitePerson',
+              params: { id: data.person.id },
+            }"
+          >
+            <v-list-item-icon>
+              <v-icon>mdi-account-plus-outline</v-icon>
+            </v-list-item-icon>
+            <v-list-item-content>
+              <v-list-item-title>
+                {{ $t("person.invite") }}
+              </v-list-item-title>
+            </v-list-item-content>
+          </v-list-item>
 
-            <v-list-item
-              v-if="data.person.canDeletePerson"
-              :to="{
-                name: 'core.deletePerson',
-                params: { id: data.person.id },
-              }"
-              class="error--text"
-            >
-              <v-list-item-icon>
-                <v-icon color="error">mdi-delete</v-icon>
-              </v-list-item-icon>
-              <v-list-item-content>
-                <v-list-item-title>
-                  {{ $t("person.delete") }}
-                </v-list-item-title>
-              </v-list-item-content>
-            </v-list-item>
-          </v-list>
-        </v-menu>
+          <v-list-item
+            v-if="data.person.canDeletePerson"
+            :to="{
+              name: 'core.deletePerson',
+              params: { id: data.person.id },
+            }"
+            class="error--text"
+          >
+            <v-list-item-icon>
+              <v-icon color="error">mdi-delete</v-icon>
+            </v-list-item-icon>
+            <v-list-item-content>
+              <v-list-item-title>
+                {{ $t("person.delete") }}
+              </v-list-item-title>
+            </v-list-item-content>
+          </v-list-item>
+        </button-menu>
       </template>
     </template>
   </ApolloQuery>
 </template>
 
 <script>
+import ButtonMenu from "../generic/ButtonMenu.vue";
 export default {
   name: "PersonActions",
+  components: {
+    ButtonMenu,
+  },
   props: {
     id: {
       type: String,
-- 
GitLab