Browse Source

Follow up 12c405d4 - i-doit: Cache update on ticket detail

Ben 3 months ago
parent
commit
0feedabeac

+ 0 - 127
app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/IdoitList.vue

@@ -1,127 +0,0 @@
-<!-- Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/ -->
-
-<script setup lang="ts">
-import { computed, toRef } from 'vue'
-
-import type { FormRef } from '#shared/components/Form/types.ts'
-import {
-  MutationHandler,
-  QueryHandler,
-} from '#shared/server/apollo/handler/index.ts'
-
-import CommonLoader from '#desktop/components/CommonLoader/CommonLoader.vue'
-import type { TicketSidebarPlugin } from '#desktop/pages/ticket/components/TicketSidebar/plugins/types.ts'
-import ExternalReferenceContent from '#desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/ExternalReferenceContent.vue'
-import ExternalReferenceLink from '#desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/ExternalReferenceLink.vue'
-import { useIdoitCacheHandlers } from '#desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/useIdoitCacheHandlers.ts'
-import { useIdoitFormHelpers } from '#desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/useIdoitFormHelpers.ts'
-import { useTicketExternalReferencesIdoitObjectRemoveMutation } from '#desktop/pages/ticket/graphql/mutations/ticketExternalReferencesIdoitObjectRemove.api.ts'
-import { useTicketExternalReferencesIdoitObjectListQuery } from '#desktop/pages/ticket/graphql/queries/ticketExternalReferencesIdoitObjectList.api.ts'
-import { TicketSidebarScreenType } from '#desktop/pages/ticket/types/sidebar.ts'
-
-interface Props {
-  sidebarPlugin: TicketSidebarPlugin
-  objectIds: number[]
-  screenType: TicketSidebarScreenType
-  isTicketEditable: boolean
-  ticketId?: string
-  form?: FormRef
-}
-
-const props = defineProps<Props>()
-
-const objectListQuery = new QueryHandler(
-  useTicketExternalReferencesIdoitObjectListQuery(
-    () => ({
-      ticketId: props.ticketId,
-      idoitObjectIds: props.ticketId ? undefined : props.objectIds,
-    }),
-    () => ({
-      enabled: props.objectIds?.length > 0,
-      fetchPolicy:
-        props.screenType === TicketSidebarScreenType.TicketCreate
-          ? 'cache-first'
-          : 'cache-and-network',
-    }),
-  ),
-  {
-    errorShowNotification: false,
-  },
-)
-
-const result = objectListQuery.result()
-
-const isLoading = objectListQuery.loading()
-
-const queryError = objectListQuery.operationError()
-
-const error = computed(() =>
-  queryError.value
-    ? __(
-        'Error fetching i-doit information. Please contact your administrator.',
-      )
-    : null,
-)
-
-const objectList = computed(() => {
-  return result.value?.ticketExternalReferencesIdoitObjectList || []
-})
-
-const removeObjectMutation = new MutationHandler(
-  useTicketExternalReferencesIdoitObjectRemoveMutation(),
-)
-
-const { removeObjectListCacheUpdate } = useIdoitCacheHandlers(
-  toRef(props, 'objectIds'),
-  toRef(props, 'ticketId'),
-)
-
-const { removeObjectFromForm } = useIdoitFormHelpers(toRef(props, 'form'))
-
-const removeObject = async ({ id }: { id: number }) => {
-  const revertCacheUpdate = removeObjectListCacheUpdate(id)
-
-  if (props.screenType === TicketSidebarScreenType.TicketCreate)
-    return removeObjectFromForm(id)
-
-  return removeObjectMutation
-    .send({
-      idoitObjectId: id,
-      ticketId: props.ticketId!,
-    })
-    .catch(() => revertCacheUpdate)
-}
-</script>
-
-<template>
-  <CommonLoader v-if="objectIds?.length" :error="error" :loading="isLoading">
-    <div class="space-y-6" tabindex="-1">
-      <div
-        v-for="object in objectList"
-        :key="object.idoitObjectId"
-        class="group space-y-2"
-        role="group"
-      >
-        <ExternalReferenceLink
-          :id="object.idoitObjectId"
-          :title="object.title"
-          :link="object.link!"
-          :is-editable="isTicketEditable"
-          :tooltip="$t('Unlink object')"
-          @remove="removeObject"
-        />
-
-        <ExternalReferenceContent
-          :label="$t('ID')"
-          :values="[object.idoitObjectId.toString()]"
-        />
-
-        <ExternalReferenceContent
-          :label="$t('Status')"
-          :values="[object.status]"
-        />
-        <ExternalReferenceContent :label="$t('Type')" :values="[object.type]" />
-      </div>
-    </div>
-  </CommonLoader>
-</template>

+ 70 - 18
app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/TicketSidebarIdoitContent.vue

@@ -12,14 +12,17 @@ import {
 
 import CommonButton from '#desktop/components/CommonButton/CommonButton.vue'
 import { useFlyout } from '#desktop/components/CommonFlyout/useFlyout.ts'
+import CommonLoader from '#desktop/components/CommonLoader/CommonLoader.vue'
 import type { MenuItem } from '#desktop/components/CommonPopoverMenu/types.ts'
 import type { TicketSidebarPlugin } from '#desktop/pages/ticket/components/TicketSidebar/plugins/types.ts'
 import TicketSidebarContent from '#desktop/pages/ticket/components/TicketSidebar/TicketSidebarContent.vue'
-import IdoitList from '#desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/IdoitList.vue'
+import ExternalReferenceContent from '#desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/ExternalReferenceContent.vue'
+import ExternalReferenceLink from '#desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/ExternalReferenceLink.vue'
 import type { FormDataRecords } from '#desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/types.ts'
 import { useIdoitCacheHandlers } from '#desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/useIdoitCacheHandlers.ts'
 import { useIdoitFormHelpers } from '#desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/useIdoitFormHelpers.ts'
 import { useTicketExternalReferencesIdoitObjectAddMutation } from '#desktop/pages/ticket/graphql/mutations/ticketExternalReferencesIdoitObjectAdd.api.ts'
+import { useTicketExternalReferencesIdoitObjectRemoveMutation } from '#desktop/pages/ticket/graphql/mutations/ticketExternalReferencesIdoitObjectRemove.api.ts'
 import { useTicketExternalReferencesIdoitObjectListQuery } from '#desktop/pages/ticket/graphql/queries/ticketExternalReferencesIdoitObjectList.api.ts'
 import { TicketSidebarScreenType } from '#desktop/pages/ticket/types/sidebar.ts'
 
@@ -47,32 +50,50 @@ const objectListQuery = new QueryHandler(
       idoitObjectIds: props.ticketId ? undefined : props.objectIds,
     }),
     () => ({
-      enabled: props.objectIds?.length > 0,
+      enabled:
+        props.screenType === TicketSidebarScreenType.TicketCreate
+          ? props.objectIds?.length > 0
+          : !!props.ticketId,
       fetchPolicy:
         props.screenType === TicketSidebarScreenType.TicketCreate
           ? 'cache-first'
           : 'cache-and-network',
     }),
   ),
-  {
-    errorShowNotification: false,
-  },
 )
 
 const result = objectListQuery.result()
 
-const error = objectListQuery.operationError()
+const isLoading = objectListQuery.loading()
 
 const objectList = computed(() => {
   return result.value?.ticketExternalReferencesIdoitObjectList || []
 })
 
-const { modifyObjectItemAddCache } = useIdoitCacheHandlers(
-  toRef(props, 'objectIds'),
-  toRef(props, 'ticketId'),
+const { removeObjectListCacheUpdate, modifyObjectItemAddCache } =
+  useIdoitCacheHandlers(toRef(props, 'objectIds'), toRef(props, 'ticketId'))
+
+const { addObjectIdsToForm, removeObjectFromForm } = useIdoitFormHelpers(
+  toRef(props, 'form'),
 )
 
-const { addObjectIdsToForm } = useIdoitFormHelpers(toRef(props, 'form'))
+const removeObjectMutation = new MutationHandler(
+  useTicketExternalReferencesIdoitObjectRemoveMutation(),
+)
+
+const removeObject = async ({ id }: { id: number }) => {
+  const revertCacheUpdate = removeObjectListCacheUpdate(id)
+
+  if (props.screenType === TicketSidebarScreenType.TicketCreate)
+    return removeObjectFromForm(id)
+
+  return removeObjectMutation
+    .send({
+      idoitObjectId: id,
+      ticketId: props.ticketId!,
+    })
+    .catch(() => revertCacheUpdate)
+}
 
 const addObjectMutation = new MutationHandler(
   useTicketExternalReferencesIdoitObjectAddMutation({
@@ -109,7 +130,7 @@ const openFlyout = () =>
   })
 
 const actions = computed((): MenuItem[] =>
-  props.objectIds?.length && !error.value
+  props.objectIds?.length
     ? [
         {
           key: 'link-idoit-object',
@@ -125,13 +146,12 @@ const actions = computed((): MenuItem[] =>
 if (props.ticketId) {
   watch(
     () => props.objectIds,
-    (newObjectListIds) => {
-      const fetchedObjectListIds = objectList.value.map(
-        (obj) => obj.idoitObjectId,
-      )
-
+    (newValue) => {
       if (
-        isEqual(newObjectListIds, fetchedObjectListIds) ||
+        isEqual(
+          newValue,
+          objectList.value.map((obj) => obj.idoitObjectId),
+        ) ||
         skipNextObjectUpdate.value
       ) {
         skipNextObjectUpdate.value = false
@@ -160,6 +180,38 @@ if (props.ticketId) {
       {{ $t('Link Objects') }}
     </CommonButton>
 
-    <IdoitList v-bind="$props" :object-ids="objectIds" />
+    <CommonLoader v-if="objectIds?.length" :loading="isLoading">
+      <div class="space-y-6" tabindex="-1">
+        <div
+          v-for="object in objectList"
+          :key="object.idoitObjectId"
+          class="group space-y-2"
+          role="group"
+        >
+          <ExternalReferenceLink
+            :id="object.idoitObjectId"
+            :title="object.title"
+            :link="object.link!"
+            :is-editable="isTicketEditable"
+            :tooltip="$t('Unlink object')"
+            @remove="removeObject"
+          />
+
+          <ExternalReferenceContent
+            :label="$t('ID')"
+            :values="[object.idoitObjectId.toString()]"
+          />
+
+          <ExternalReferenceContent
+            :label="$t('Status')"
+            :values="[object.status]"
+          />
+          <ExternalReferenceContent
+            :label="$t('Type')"
+            :values="[object.type]"
+          />
+        </div>
+      </div>
+    </CommonLoader>
   </TicketSidebarContent>
 </template>

+ 6 - 7
i18n/zammad.pot

@@ -5915,7 +5915,6 @@ msgid "Error fetching github information. Please contact your administrator."
 msgstr ""
 
 #: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/IdoitFlyout.vue:64
-#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/IdoitList.vue:61
 msgid "Error fetching i-doit information. Please contact your administrator."
 msgstr ""
 
@@ -7234,7 +7233,7 @@ msgid "How to use it"
 msgstr ""
 
 #: app/assets/javascripts/app/views/integration/idoit_object_result.jst.eco:8
-#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/IdoitList.vue:115
+#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/TicketSidebarIdoitContent.vue:201
 msgid "ID"
 msgstr ""
 
@@ -8346,7 +8345,7 @@ msgid "Link Issue"
 msgstr ""
 
 #: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/IdoitFlyout.vue:183
-#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/TicketSidebarIdoitContent.vue:160
+#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/TicketSidebarIdoitContent.vue:180
 msgid "Link Objects"
 msgstr ""
 
@@ -8374,7 +8373,7 @@ msgstr ""
 msgid "Link issue"
 msgstr ""
 
-#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/TicketSidebarIdoitContent.vue:116
+#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/TicketSidebarIdoitContent.vue:137
 msgid "Link objects"
 msgstr ""
 
@@ -13527,7 +13526,7 @@ msgstr ""
 #: app/assets/javascripts/app/views/integration/idoit_object_result.jst.eco:10
 #: app/assets/javascripts/app/views/widget/http_log_show.jst.eco:14
 #: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/IdoitFlyout/IdoitObjectList.vue:24
-#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/IdoitList.vue:120
+#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/TicketSidebarIdoitContent.vue:206
 msgid "Status"
 msgstr ""
 
@@ -16532,7 +16531,7 @@ msgstr ""
 #: app/assets/javascripts/app/views/object_manager/index.jst.eco:57
 #: app/frontend/apps/desktop/entities/channel-email/composables/useEmailInboundForm.ts:105
 #: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/IdoitFlyout.vue:119
-#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/IdoitList.vue:123
+#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/TicketSidebarIdoitContent.vue:210
 #: db/seeds/object_manager_attributes.rb:124
 msgid "Type"
 msgstr ""
@@ -16602,7 +16601,7 @@ msgstr ""
 msgid "Unlink issue"
 msgstr ""
 
-#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/IdoitList.vue:110
+#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/TicketSidebarIdoitContent.vue:196
 msgid "Unlink object"
 msgstr ""