useTicketSignature.ts 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. // Copyright (C) 2012-2023 Zammad Foundation, https://zammad-foundation.org/
  2. import type { TicketById } from '@shared/entities/ticket/types'
  3. import type {
  4. FormHandler,
  5. FormHandlerFunction,
  6. FormValues,
  7. } from '@shared/components/Form'
  8. import { FormHandlerExecution } from '@shared/components/Form'
  9. import type { FieldEditorContext } from '@shared/components/Form/fields/FieldEditor/types'
  10. import type { ChangedField } from '@shared/components/Form/types'
  11. import { useTicketSignatureLazyQuery } from '@shared/graphql/queries/ticketSignature.api'
  12. import { convertToGraphQLId, getIdFromGraphQLId } from '@shared/graphql/utils'
  13. import { QueryHandler } from '@shared/server/apollo/handler'
  14. import type { Ref } from 'vue'
  15. import type {
  16. TicketSignatureQuery,
  17. TicketSignatureQueryVariables,
  18. } from '@shared/graphql/types'
  19. let signatureQuery: QueryHandler<
  20. TicketSignatureQuery,
  21. TicketSignatureQueryVariables
  22. >
  23. export const getTicketSignatureQuery = () => {
  24. if (signatureQuery) return signatureQuery
  25. signatureQuery = new QueryHandler(
  26. useTicketSignatureLazyQuery({ groupId: '' }),
  27. )
  28. return signatureQuery
  29. }
  30. // TODO: can maybe be moved inside ticket entity?
  31. export const useTicketSignature = (ticket?: Ref<TicketById | undefined>) => {
  32. const signatureQuery = getTicketSignatureQuery()
  33. const getValue = (
  34. values: FormValues,
  35. changedField: ChangedField,
  36. name: string,
  37. ) => {
  38. return changedField.name === name ? changedField.newValue : values[name]
  39. }
  40. const signatureHandling = (editorName: string): FormHandler => {
  41. const handleSignature: FormHandlerFunction = (
  42. execution,
  43. formNode,
  44. values,
  45. changeFields,
  46. updateSchemaDataField,
  47. schemaData,
  48. changedField,
  49. ) => {
  50. if (
  51. changedField?.name !== 'group_id' &&
  52. changedField?.name !== 'articleSenderType'
  53. )
  54. return
  55. const editorContext = formNode?.find(editorName, 'name')?.context as
  56. | FieldEditorContext
  57. | undefined
  58. if (!editorContext) return
  59. const groupId = getValue(values, changedField, 'group_id')
  60. if (!groupId) return
  61. const senderType = getValue(values, changedField, 'articleSenderType')
  62. if (senderType !== 'email-out') {
  63. editorContext.removeSignature?.()
  64. return
  65. }
  66. signatureQuery
  67. .query({
  68. groupId: convertToGraphQLId('Group', String(groupId)),
  69. ticketId: ticket?.value?.id,
  70. })
  71. .then(({ data: signature }) => {
  72. const body = signature?.ticketSignature?.renderedBody
  73. const id = signature?.ticketSignature?.id
  74. if (!body || !id) {
  75. editorContext.removeSignature()
  76. return
  77. }
  78. editorContext.addSignature({ body, id: getIdFromGraphQLId(id) })
  79. })
  80. }
  81. return {
  82. execution: [
  83. FormHandlerExecution.Initial,
  84. FormHandlerExecution.FieldChange,
  85. ],
  86. callback: handleSignature,
  87. }
  88. }
  89. return {
  90. signatureHandling,
  91. }
  92. }