Просмотр исходного кода

Follow up 8e6a6a48 - i-doit : Handle error cases

Benjamin Scharf 3 месяцев назад
Родитель
Сommit
12c405d4c1

+ 2 - 2
app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarExternalIssueTracker/IssueTrackerList.vue

@@ -41,7 +41,7 @@ interface Props {
 
 const props = defineProps<Props>()
 
-const { isLoadingIssues, issueList, skipNextLinkUpdate } =
+const { isLoadingIssues, issueList, skipNextLinkUpdate, error } =
   useTicketExternalIssueTracker(
     props.screenType,
     props.trackerType,
@@ -262,7 +262,7 @@ defineExpose({
 </script>
 
 <template>
-  <CommonLoader :loading="isLoadingIssues">
+  <CommonLoader :loading="isLoadingIssues" :error="error">
     <div class="space-y-6">
       <CommonButton
         v-if="showEmptyState"

+ 14 - 1
app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarExternalIssueTracker/useTicketExternalIssueTracker.ts

@@ -35,12 +35,25 @@ export const useTicketExternalIssueTracker = (
             : 'cache-and-network',
       }),
     ),
+    {
+      errorShowNotification: false,
+    },
   )
 
   const isLoading = issueTrackerQuery.loading()
 
   const queryResult = issueTrackerQuery.result()
 
+  const queryError = issueTrackerQuery.operationError()
+
+  const error = computed(() =>
+    queryError.value
+      ? __(
+          'Error fetching github information. Please contact your administrator.',
+        )
+      : null,
+  )
+
   const issueList = computed(
     () => queryResult.value?.ticketExternalReferencesIssueTrackerItemList,
   )
@@ -69,5 +82,5 @@ export const useTicketExternalIssueTracker = (
     })
   }
 
-  return { isLoadingIssues, issueList, skipNextLinkUpdate }
+  return { isLoadingIssues, issueList, skipNextLinkUpdate, error }
 }

+ 19 - 1
app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/IdoitFlyout.vue

@@ -8,6 +8,7 @@ import Form from '#shared/components/Form/Form.vue'
 import type { FormSchemaNode } from '#shared/components/Form/types.ts'
 import { useForm } from '#shared/components/Form/useForm.ts'
 import { useDebouncedLoading } from '#shared/composables/useDebouncedLoading.ts'
+import UserError from '#shared/errors/UserError.ts'
 import { QueryHandler } from '#shared/server/apollo/handler/index.ts'
 
 import CommonFlyout from '#desktop/components/CommonFlyout/CommonFlyout.vue'
@@ -28,7 +29,8 @@ interface Props {
 
 const props = defineProps<Props>()
 
-const { form, values, updateFieldValues, onChangedField } = useForm()
+const { form, values, updateFieldValues, onChangedField, formSetErrors } =
+  useForm()
 
 const FETCH_LIMIT = 10
 const FETCH_DEBOUNCE = 300
@@ -44,12 +46,28 @@ const objectSearchQuery = new QueryHandler(
       fetchPolicy: 'no-cache',
     },
   ),
+  {
+    errorShowNotification: false,
+  },
 )
 
 const result = objectSearchQuery.result()
 
 const isLoading = objectSearchQuery.loading()
 
+objectSearchQuery.onError(() => {
+  formSetErrors(
+    new UserError([
+      {
+        field: 'type',
+        message: __(
+          'Error fetching i-doit information. Please contact your administrator.',
+        ),
+      },
+    ]),
+  )
+})
+
 const { debouncedLoading, loading } = useDebouncedLoading()
 
 watchEffect(() => {

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

@@ -0,0 +1,127 @@
+<!-- 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>

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

@@ -12,17 +12,14 @@ 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 ExternalReferenceContent from '#desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/ExternalReferenceContent.vue'
-import ExternalReferenceLink from '#desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/ExternalReferenceLink.vue'
+import IdoitList from '#desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/IdoitList.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'
 
@@ -50,50 +47,32 @@ const objectListQuery = new QueryHandler(
       idoitObjectIds: props.ticketId ? undefined : props.objectIds,
     }),
     () => ({
-      enabled:
-        props.screenType === TicketSidebarScreenType.TicketCreate
-          ? props.objectIds?.length > 0
-          : !!props.ticketId,
+      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 error = objectListQuery.operationError()
 
 const objectList = computed(() => {
   return result.value?.ticketExternalReferencesIdoitObjectList || []
 })
 
-const { removeObjectListCacheUpdate, modifyObjectItemAddCache } =
-  useIdoitCacheHandlers(toRef(props, 'objectIds'), toRef(props, 'ticketId'))
-
-const { addObjectIdsToForm, removeObjectFromForm } = useIdoitFormHelpers(
-  toRef(props, 'form'),
+const { modifyObjectItemAddCache } = useIdoitCacheHandlers(
+  toRef(props, 'objectIds'),
+  toRef(props, 'ticketId'),
 )
 
-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 { addObjectIdsToForm } = useIdoitFormHelpers(toRef(props, 'form'))
 
 const addObjectMutation = new MutationHandler(
   useTicketExternalReferencesIdoitObjectAddMutation({
@@ -130,7 +109,7 @@ const openFlyout = () =>
   })
 
 const actions = computed((): MenuItem[] =>
-  props.objectIds?.length
+  props.objectIds?.length && !error.value
     ? [
         {
           key: 'link-idoit-object',
@@ -146,12 +125,13 @@ const actions = computed((): MenuItem[] =>
 if (props.ticketId) {
   watch(
     () => props.objectIds,
-    (newValue) => {
+    (newObjectListIds) => {
+      const fetchedObjectListIds = objectList.value.map(
+        (obj) => obj.idoitObjectId,
+      )
+
       if (
-        isEqual(
-          newValue,
-          objectList.value.map((obj) => obj.idoitObjectId),
-        ) ||
+        isEqual(newObjectListIds, fetchedObjectListIds) ||
         skipNextObjectUpdate.value
       ) {
         skipNextObjectUpdate.value = false
@@ -180,38 +160,6 @@ if (props.ticketId) {
       {{ $t('Link Objects') }}
     </CommonButton>
 
-    <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>
+    <IdoitList v-bind="$props" :object-ids="objectIds" />
   </TicketSidebarContent>
 </template>

+ 1 - 1
app/graphql/gql/queries/ticket/external_references/idoit_object_search.rb

@@ -16,7 +16,7 @@ module Gql::Queries
     end
 
     def resolve(query: '', limit: 10, idoit_type_id: nil)
-      Idoit.query('cmdb.objects', build_filter(idoit_type_id:, query:))['result'].first(limit)
+      Idoit.query('cmdb.objects', build_filter(idoit_type_id:, query:))['result']&.first(limit)
     end
 
     private

+ 49 - 17
i18n/zammad.pot

@@ -746,6 +746,7 @@ msgstr ""
 #: app/assets/javascripts/app/views/time_accounting/accounted_time.jst.eco:2
 #: app/frontend/apps/desktop/pages/ticket/components/TicketDetailView/TimeAccountingFlyout.vue:68
 #: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarInformation/TicketSidebarInformationContent.vue:104
+#: app/frontend/shared/entities/ticket/stores/objectAttributes.ts:18
 #: app/graphql/gql/types/overview_type.rb:69
 msgid "Accounted Time"
 msgstr ""
@@ -2961,6 +2962,7 @@ msgid "Closed Tickets"
 msgstr ""
 
 #: app/assets/javascripts/app/models/ticket.coffee:25
+#: app/frontend/shared/entities/ticket/stores/objectAttributes.ts:81
 #: app/graphql/gql/types/overview_type.rb:78
 msgid "Closing time"
 msgstr ""
@@ -3614,6 +3616,9 @@ msgstr ""
 #: app/frontend/apps/desktop/components/TwoFactor/TwoFactorConfiguration/TwoFactorConfigurationSecurityKeys.vue:105
 #: app/frontend/apps/desktop/pages/ticket/components/TicketDetailView/ArticleMeta/useArticleMeta.ts:56
 #: app/frontend/apps/desktop/pages/ticket/components/TicketDetailView/TicketSimpleTable/TicketSimpleTable.vue:41
+#: app/frontend/shared/entities/organization/stores/objectAttributes.ts:24
+#: app/frontend/shared/entities/ticket/stores/objectAttributes.ts:105
+#: app/frontend/shared/entities/user/stores/objectAttributes.ts:24
 #: app/graphql/gql/types/overview_type.rb:80
 msgid "Created at"
 msgstr ""
@@ -3637,6 +3642,9 @@ msgstr ""
 #: app/assets/javascripts/app/models/ticket.coffee:27
 #: app/assets/javascripts/app/models/ticket_article.coffee:15
 #: app/assets/javascripts/app/models/user.coffee:14
+#: app/frontend/shared/entities/organization/stores/objectAttributes.ts:14
+#: app/frontend/shared/entities/ticket/stores/objectAttributes.ts:95
+#: app/frontend/shared/entities/user/stores/objectAttributes.ts:14
 #: app/graphql/gql/types/overview_type.rb:79
 msgid "Created by"
 msgstr ""
@@ -5289,7 +5297,7 @@ msgstr ""
 
 #: app/assets/javascripts/app/controllers/agent_ticket_create/sidebar_organization.coffee:21
 #: app/assets/javascripts/app/controllers/ticket_zoom/sidebar_organization.coffee:11
-#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarOrganization/TicketSidebarOrganizationContent.vue:36
+#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarOrganization/TicketSidebarOrganizationContent.vue:33
 #: app/frontend/apps/mobile/pages/ticket/views/TicketInformation/TicketInformationOrganization.vue:80
 msgid "Edit Organization"
 msgstr ""
@@ -5902,6 +5910,15 @@ msgstr ""
 msgid "Error during execution of auto wizard."
 msgstr ""
 
+#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarExternalIssueTracker/useTicketExternalIssueTracker.ts:52
+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 ""
+
 #: app/frontend/apps/desktop/pages/personal-setting/views/PersonalSettingCalendar.vue:280
 #: db/seeds/overviews.rb:160
 msgid "Escalated Tickets"
@@ -5924,21 +5941,25 @@ msgid "Escalation Times"
 msgstr ""
 
 #: app/assets/javascripts/app/models/ticket.coffee:17
+#: app/frontend/shared/entities/ticket/stores/objectAttributes.ts:25
 #: app/graphql/gql/types/overview_type.rb:70
 msgid "Escalation at"
 msgstr ""
 
 #: app/assets/javascripts/app/models/ticket.coffee:20
+#: app/frontend/shared/entities/ticket/stores/objectAttributes.ts:46
 #: app/graphql/gql/types/overview_type.rb:73
 msgid "Escalation at (Close Time)"
 msgstr ""
 
 #: app/assets/javascripts/app/models/ticket.coffee:18
+#: app/frontend/shared/entities/ticket/stores/objectAttributes.ts:32
 #: app/graphql/gql/types/overview_type.rb:71
 msgid "Escalation at (First Response Time)"
 msgstr ""
 
 #: app/assets/javascripts/app/models/ticket.coffee:19
+#: app/frontend/shared/entities/ticket/stores/objectAttributes.ts:39
 #: app/graphql/gql/types/overview_type.rb:72
 msgid "Escalation at (Update Time)"
 msgstr ""
@@ -6268,7 +6289,7 @@ msgstr ""
 #: app/assets/javascripts/app/controllers/_channel/microsoft365.coffee:16
 #: app/assets/javascripts/app/models/report_profile.js.coffee:7
 #: app/assets/javascripts/app/views/sla/index.jst.eco:28
-#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/IdoitFlyout.vue:114
+#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/IdoitFlyout.vue:132
 msgid "Filter"
 msgstr ""
 
@@ -6339,6 +6360,7 @@ msgid "First name"
 msgstr ""
 
 #: app/assets/javascripts/app/models/ticket.coffee:24
+#: app/frontend/shared/entities/ticket/stores/objectAttributes.ts:74
 #: app/graphql/gql/types/overview_type.rb:77
 msgid "First response"
 msgstr ""
@@ -7212,7 +7234,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/TicketSidebarIdoitContent.vue:201
+#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/IdoitList.vue:115
 msgid "ID"
 msgstr ""
 
@@ -8183,23 +8205,27 @@ msgid "Last changed"
 msgstr ""
 
 #: app/assets/javascripts/app/models/ticket.coffee:26
+#: app/frontend/shared/entities/ticket/stores/objectAttributes.ts:88
 msgid "Last closing time"
 msgstr ""
 
 #: app/assets/javascripts/app/controllers/_ui_element/object_selector.coffee:232
 #: app/assets/javascripts/app/models/ticket.coffee:21
+#: app/frontend/shared/entities/ticket/stores/objectAttributes.ts:53
 #: app/graphql/gql/types/overview_type.rb:74
 msgid "Last contact"
 msgstr ""
 
 #: app/assets/javascripts/app/controllers/_ui_element/object_selector.coffee:236
 #: app/assets/javascripts/app/models/ticket.coffee:22
+#: app/frontend/shared/entities/ticket/stores/objectAttributes.ts:60
 #: app/graphql/gql/types/overview_type.rb:75
 msgid "Last contact (agent)"
 msgstr ""
 
 #: app/assets/javascripts/app/controllers/_ui_element/object_selector.coffee:240
 #: app/assets/javascripts/app/models/ticket.coffee:23
+#: app/frontend/shared/entities/ticket/stores/objectAttributes.ts:67
 #: app/graphql/gql/types/overview_type.rb:76
 msgid "Last contact (customer)"
 msgstr ""
@@ -8319,8 +8345,8 @@ msgstr ""
 msgid "Link Issue"
 msgstr ""
 
-#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/IdoitFlyout.vue:165
-#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/TicketSidebarIdoitContent.vue:180
+#: 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
 msgid "Link Objects"
 msgstr ""
 
@@ -8348,7 +8374,7 @@ msgstr ""
 msgid "Link issue"
 msgstr ""
 
-#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/TicketSidebarIdoitContent.vue:137
+#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/TicketSidebarIdoitContent.vue:116
 msgid "Link objects"
 msgstr ""
 
@@ -9013,7 +9039,7 @@ msgstr ""
 #: app/assets/javascripts/app/views/organization_profile/object.jst.eco:20
 #: app/assets/javascripts/app/views/popover/organization.jst.eco:6
 #: app/assets/javascripts/app/views/widget/organization.jst.eco:29
-#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarOrganization/TicketSidebarOrganizationContent.vue:76
+#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarOrganization/TicketSidebarOrganizationContent.vue:73
 #: app/frontend/apps/mobile/components/Organization/OrganizationMembersList.vue:29
 msgid "Members"
 msgstr ""
@@ -12453,13 +12479,13 @@ msgstr ""
 #: app/assets/javascripts/app/views/generic/icon_picker.jst.eco:9
 #: app/assets/javascripts/app/views/translation/form.jst.eco:7
 #: app/frontend/apps/desktop/components/CommonInputSearch/CommonInputSearch.vue:20
-#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/IdoitFlyout.vue:115
+#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/IdoitFlyout.vue:133
 #: app/frontend/apps/mobile/pages/home/views/Home.vue:63
 #: app/frontend/shared/components/CommonInputSearch/CommonInputSearch.vue:23
 msgid "Search…"
 msgstr ""
 
-#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarCustomer/TicketSidebarCustomerContent.vue:90
+#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarCustomer/TicketSidebarCustomerContent.vue:87
 #: app/frontend/apps/mobile/pages/ticket/views/TicketInformation/TicketInformationCustomer.vue:98
 #: app/frontend/apps/mobile/pages/user/views/UserDetailView.vue:133
 #: db/seeds/object_manager_attributes.rb:962
@@ -13501,7 +13527,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/TicketSidebarIdoitContent.vue:206
+#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/IdoitList.vue:120
 msgid "Status"
 msgstr ""
 
@@ -15913,7 +15939,7 @@ msgstr ""
 #: app/frontend/apps/desktop/pages/personal-setting/views/PersonalSetting/plugins/calendar.ts:8
 #: app/frontend/apps/desktop/pages/personal-setting/views/PersonalSetting/plugins/notifications.ts:8
 #: app/frontend/apps/desktop/pages/personal-setting/views/PersonalSetting/plugins/ticketOverviews.ts:8
-#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarCustomer/TicketSidebarCustomerContent.vue:95
+#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarCustomer/TicketSidebarCustomerContent.vue:92
 #: app/frontend/apps/mobile/pages/search/plugins/ticket.ts:9
 #: app/frontend/apps/mobile/pages/ticket/routes.ts:51
 #: app/frontend/apps/mobile/pages/ticket/views/TicketOverview.vue:173
@@ -16505,8 +16531,8 @@ msgstr ""
 #: app/assets/javascripts/app/views/integration/sipgate.jst.eco:11
 #: 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:101
-#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/TicketSidebarIdoitContent.vue:210
+#: 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
 #: db/seeds/object_manager_attributes.rb:124
 msgid "Type"
 msgstr ""
@@ -16576,7 +16602,7 @@ msgstr ""
 msgid "Unlink issue"
 msgstr ""
 
-#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/TicketSidebarIdoitContent.vue:196
+#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/IdoitList.vue:110
 msgid "Unlink object"
 msgstr ""
 
@@ -16749,6 +16775,9 @@ msgstr ""
 #: app/assets/javascripts/app/models/organization.coffee:11
 #: app/assets/javascripts/app/models/ticket.coffee:30
 #: app/assets/javascripts/app/models/user.coffee:17
+#: app/frontend/shared/entities/organization/stores/objectAttributes.ts:41
+#: app/frontend/shared/entities/ticket/stores/objectAttributes.ts:122
+#: app/frontend/shared/entities/user/stores/objectAttributes.ts:41
 #: app/graphql/gql/types/overview_type.rb:82
 msgid "Updated at"
 msgstr ""
@@ -16768,6 +16797,9 @@ msgstr ""
 #: app/assets/javascripts/app/models/ticket.coffee:29
 #: app/assets/javascripts/app/models/ticket_article.coffee:17
 #: app/assets/javascripts/app/models/user.coffee:16
+#: app/frontend/shared/entities/organization/stores/objectAttributes.ts:31
+#: app/frontend/shared/entities/ticket/stores/objectAttributes.ts:112
+#: app/frontend/shared/entities/user/stores/objectAttributes.ts:31
 #: app/graphql/gql/types/overview_type.rb:81
 msgid "Updated by"
 msgstr ""
@@ -18176,7 +18208,7 @@ msgstr ""
 msgid "closed"
 msgstr ""
 
-#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarCustomer/TicketSidebarCustomerContent.vue:108
+#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarCustomer/TicketSidebarCustomerContent.vue:105
 msgid "closed tickets"
 msgstr ""
 
@@ -18545,7 +18577,7 @@ msgstr ""
 msgid "i-doit integration"
 msgstr ""
 
-#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/IdoitFlyout.vue:161
+#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarExternalReferences/TicketSidebarIdoit/IdoitFlyout.vue:179
 msgid "i-doit: Link objects"
 msgstr ""
 
@@ -18982,7 +19014,7 @@ msgstr ""
 msgid "open"
 msgstr ""
 
-#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarCustomer/TicketSidebarCustomerContent.vue:101
+#: app/frontend/apps/desktop/pages/ticket/components/TicketSidebar/TicketSidebarCustomer/TicketSidebarCustomerContent.vue:98
 msgid "open tickets"
 msgstr ""
 

+ 1 - 0
lib/idoit.rb

@@ -124,6 +124,7 @@ or with filter:
     )
 
     raise "Can't fetch objects from #{url}: Unable to parse response from server. Invalid JSON response." if !result.success? && result.error =~ %r{JSON::ParserError:.+?\s+unexpected\s+token\s+at\s+'<!DOCTYPE\s+html}i
+    raise "Can't fetch object from #{url}: Unable to login using given credentials and apiKey." if result.data['error'].present?
     raise "Can't fetch objects from #{url}: #{result.error}" if !result.success?
 
     # add link to idoit