ticketOverviews.ts 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. // Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
  2. import { keyBy } from 'lodash-es'
  3. import { defineStore } from 'pinia'
  4. import { computed, ref } from 'vue'
  5. import { useTicketOverviewTicketCountQuery } from '#shared/entities/ticket/graphql/queries/ticket/overviewTicketCount.api.ts'
  6. import type {
  7. UserCurrentOverviewOrderingUpdatesSubscription,
  8. UserCurrentOverviewOrderingUpdatesSubscriptionVariables,
  9. UserCurrentTicketOverviewsQuery,
  10. UserCurrentTicketOverviewUpdatesSubscription,
  11. UserCurrentTicketOverviewUpdatesSubscriptionVariables,
  12. } from '#shared/graphql/types.ts'
  13. import { QueryHandler } from '#shared/server/apollo/handler/index.ts'
  14. import { useUserCurrentTicketOverviewsQuery } from '#desktop/entities/ticket/graphql/queries/userCurrentTicketOverviews.api.ts'
  15. import { UserCurrentOverviewOrderingFullAttributesUpdatesDocument } from '#desktop/entities/ticket/graphql/subscriptions/useCurrentOverviewOrderingFullAttributesUpdates.api.ts'
  16. import { UserCurrentTicketOverviewFullAttributesUpdatesDocument } from '#desktop/entities/ticket/graphql/subscriptions/userCurrentTicketOverviewFullAttributesUpdates.api.ts'
  17. export const useTicketOverviewsStore = defineStore('ticketOverviews', () => {
  18. const ticketOverviewHandler = new QueryHandler(
  19. useUserCurrentTicketOverviewsQuery({
  20. withTicketCount: false,
  21. ignoreUserConditions: false,
  22. }),
  23. )
  24. ticketOverviewHandler.subscribeToMore<
  25. UserCurrentTicketOverviewUpdatesSubscriptionVariables,
  26. UserCurrentTicketOverviewUpdatesSubscription
  27. >({
  28. document: UserCurrentTicketOverviewFullAttributesUpdatesDocument,
  29. variables: { ignoreUserConditions: false },
  30. updateQuery(_, { subscriptionData }) {
  31. const ticketOverviews =
  32. subscriptionData.data.userCurrentTicketOverviewUpdates?.ticketOverviews
  33. // if we return empty array here, the actual query will be aborted, because we have fetchPolicy "cache-and-network"
  34. // if we return existing value, it will throw an error, because "overviews" doesn't exist yet on the query result
  35. if (!ticketOverviews)
  36. return null as unknown as UserCurrentTicketOverviewsQuery
  37. return {
  38. userCurrentTicketOverviews: ticketOverviews,
  39. } as unknown as UserCurrentTicketOverviewsQuery
  40. },
  41. })
  42. // Subscription for overview ordering updates
  43. ticketOverviewHandler.subscribeToMore<
  44. UserCurrentOverviewOrderingUpdatesSubscriptionVariables,
  45. UserCurrentOverviewOrderingUpdatesSubscription
  46. >({
  47. document: UserCurrentOverviewOrderingFullAttributesUpdatesDocument,
  48. variables: { ignoreUserConditions: false },
  49. updateQuery(_, { subscriptionData }) {
  50. const overviews =
  51. subscriptionData.data.userCurrentOverviewOrderingUpdates?.overviews
  52. if (!overviews) return null as unknown as UserCurrentTicketOverviewsQuery
  53. return {
  54. userCurrentTicketOverviews: overviews,
  55. } as UserCurrentTicketOverviewsQuery
  56. },
  57. })
  58. const overviewsRaw = ticketOverviewHandler.result()
  59. const overviewsLoading = ticketOverviewHandler.loading()
  60. const overviews = computed(
  61. () => overviewsRaw.value?.userCurrentTicketOverviews || [],
  62. )
  63. const ticketOverviewTicketCountHandler = new QueryHandler(
  64. useTicketOverviewTicketCountQuery(
  65. { ignoreUserConditions: false },
  66. {
  67. context: {
  68. batch: {
  69. active: false,
  70. },
  71. },
  72. },
  73. ),
  74. )
  75. const overviewsTicketCount = ticketOverviewTicketCountHandler.result()
  76. const overviewsTicketCountById = computed(() => {
  77. const overviewsWithCount = overviewsTicketCount.value?.ticketOverviews || []
  78. return Object.fromEntries(
  79. overviewsWithCount.map((overview) => [overview.id, overview.ticketCount]),
  80. )
  81. })
  82. const overviewsByLink = computed(() => keyBy(overviews.value, 'link'))
  83. const hasOverviews = computed(() => overviews.value.length > 0)
  84. const previousTicketOverviewLink = ref('')
  85. const setPreviousTicketOverviewLink = (link: string) => {
  86. previousTicketOverviewLink.value = link
  87. }
  88. return {
  89. overviews,
  90. overviewsTicketCountById,
  91. overviewsByLink,
  92. overviewsTicketCount,
  93. overviewsLoading,
  94. hasOverviews,
  95. previousTicketOverviewLink,
  96. setPreviousTicketOverviewLink,
  97. }
  98. })