ticketOverviews.ts 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. // Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
  2. import { defineStore } from 'pinia'
  3. import { QueryHandler } from '@shared/server/apollo/handler'
  4. import { useTicketOverviewsQuery } from '@shared/entities/ticket/graphql/queries/ticket/overviews.api'
  5. import { TicketOverviewsQuery } from '@shared/graphql/types'
  6. import { ref, computed } from 'vue'
  7. import { keyBy } from 'lodash-es'
  8. import { watchOnce } from '@vueuse/core'
  9. import { ConfidentTake } from '@shared/types/utils'
  10. import { getTicketOverviewStorage } from '../helpers/ticketOverviewStorage'
  11. export type TicketOverview = ConfidentTake<
  12. TicketOverviewsQuery,
  13. 'ticketOverviews.edges.node'
  14. >
  15. let overviewHandler: QueryHandler<
  16. TicketOverviewsQuery,
  17. { withTicketCount: boolean }
  18. >
  19. const getOverviewHandler = () => {
  20. if (!overviewHandler) {
  21. overviewHandler = new QueryHandler(
  22. useTicketOverviewsQuery({ withTicketCount: true }),
  23. )
  24. }
  25. return overviewHandler
  26. }
  27. export const useTicketsOverviews = defineStore('tickets-overview', () => {
  28. const handler = getOverviewHandler()
  29. const overviewsRaw = handler.result()
  30. const overviewsLoading = handler.loading()
  31. const overviews = computed(() => {
  32. if (!overviewsRaw.value?.ticketOverviews.edges) return []
  33. return (
  34. overviewsRaw.value.ticketOverviews.edges
  35. .filter((overview) => overview?.node?.id)
  36. // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
  37. .map((edge) => edge!.node!)
  38. )
  39. })
  40. const overviewsByKey = computed(() => keyBy(overviews.value, 'id'))
  41. const storage = getTicketOverviewStorage()
  42. const includedIds = ref(new Set<string>(storage.getOverviews()))
  43. const includedOverviews = computed(() => {
  44. return [...includedIds.value]
  45. .map((id) => overviewsByKey.value[id])
  46. .filter(Boolean)
  47. })
  48. const saveOverviews = (overviews: TicketOverview[]) => {
  49. const ids = overviews.map(({ id }) => id)
  50. storage.saveOverviews(ids)
  51. includedIds.value = new Set(ids)
  52. }
  53. const populateIncludeIds = (overviews: TicketOverview[]) => {
  54. overviews.forEach((overview) => {
  55. includedIds.value.add(overview.id)
  56. })
  57. saveOverviews(overviews)
  58. }
  59. // store overviews in local storage when loaded
  60. // force it to have something
  61. if (!includedIds.value.size) {
  62. if (!overviews.value.length) {
  63. watchOnce(overviews, populateIncludeIds)
  64. } else {
  65. populateIncludeIds(overviews.value)
  66. }
  67. }
  68. return {
  69. overviews,
  70. loading: overviewsLoading,
  71. includedOverviews,
  72. includedIds,
  73. overviewsByKey,
  74. saveOverviews,
  75. }
  76. })