useObjectAttributeFormData.ts 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. // Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
  2. import type {
  3. FormFieldValue,
  4. FormValues,
  5. } from '#shared/components/Form/types.ts'
  6. import type {
  7. ObjectAttributeValueInput,
  8. ObjectManagerFrontendAttribute,
  9. } from '#shared/graphql/types.ts'
  10. import { convertToGraphQLId, isGraphQLId } from '#shared/graphql/utils.ts'
  11. import { camelize, toClassName } from '#shared/utils/formatter.ts'
  12. import type { Primitive } from 'type-fest'
  13. export const useObjectAttributeFormData = (
  14. objectAttributes: Map<string, ObjectManagerFrontendAttribute>,
  15. values: FormValues,
  16. ) => {
  17. const internalObjectAttributeValues: Record<string, FormFieldValue> = {}
  18. const additionalObjectAttributeValues: ObjectAttributeValueInput[] = []
  19. const fullRelationId = (relation: string, value: number | string) => {
  20. return convertToGraphQLId(toClassName(relation), value)
  21. }
  22. const ensureRelationId = (
  23. attribute: ObjectManagerFrontendAttribute,
  24. value: FormFieldValue,
  25. ) => {
  26. const { relation } = attribute.dataOption
  27. const isInternalID =
  28. typeof value === 'number' ||
  29. (typeof value === 'string' && !isGraphQLId(value))
  30. if (relation && isInternalID) {
  31. return fullRelationId(relation, value)
  32. }
  33. return value
  34. }
  35. Object.keys(values).forEach((fieldName) => {
  36. const objectAttribute = objectAttributes.get(fieldName)
  37. const value = values[fieldName]
  38. if (!objectAttribute || value === undefined) return
  39. if (objectAttribute.isInternal) {
  40. const name = camelize(fieldName)
  41. let newValue: FormFieldValue
  42. if (Array.isArray(value)) {
  43. newValue = value.map((elem) => {
  44. return ensureRelationId(objectAttribute, elem) as Primitive
  45. })
  46. } else {
  47. newValue = ensureRelationId(objectAttribute, value)
  48. }
  49. internalObjectAttributeValues[name] = newValue
  50. } else {
  51. additionalObjectAttributeValues.push({
  52. name: objectAttribute.name,
  53. value,
  54. })
  55. }
  56. })
  57. return {
  58. internalObjectAttributeValues,
  59. additionalObjectAttributeValues,
  60. }
  61. }