FieldCheckbox.ts 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. // Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
  2. import { cloneDeep } from '@apollo/client/utilities'
  3. import initializeFieldDefinition from '@common/form/core/initializeFieldDefinition'
  4. import CheckboxVariant from '@common/types/form/fields'
  5. import { FormKitExtendableSchemaRoot, FormKitNode } from '@formkit/core'
  6. import { checkbox as checkboxDefinition } from '@formkit/inputs'
  7. import { has } from '@formkit/utils'
  8. const addOptionCheckedDataAttribute = (node: FormKitNode) => {
  9. const { props } = node
  10. if (!props.definition) return
  11. const definition = cloneDeep(props.definition)
  12. const originalSchema = definition.schema as FormKitExtendableSchemaRoot
  13. definition.schema = (extensions) => {
  14. const localExtensions = {
  15. ...extensions,
  16. wrapper: {
  17. attrs: {
  18. 'data-is-checked': {
  19. if: '$options.length',
  20. then: {
  21. if: '$fns.isChecked($option.value)',
  22. then: 'true',
  23. else: undefined,
  24. },
  25. else: {
  26. if: '$_value',
  27. then: 'true',
  28. else: undefined,
  29. },
  30. },
  31. },
  32. },
  33. }
  34. return originalSchema(localExtensions)
  35. }
  36. props.definition = definition
  37. }
  38. const handleVariant = (node: FormKitNode) => {
  39. const { props } = node
  40. const setVariantClasses = (variant: CheckboxVariant) => {
  41. if (CheckboxVariant.switch === variant) {
  42. props.innerClass =
  43. 'bg-gray-300 relative inline-flex flex-shrink-0 h-6 w-10 border border-transparent rounded-full cursor-pointer transition-colors ease-in-out duration-200 focus:outline-none focus-within:ring-1 focus-within:ring-white focus-within:ring-opacity-75 formkit-is-checked:bg-blue formkit-invalid:border-red formkit-invalid:border-solid'
  44. props.decoratorClass =
  45. 'translate-x-0 pointer-events-none inline-block h-[22px] w-[22px] rounded-full bg-white shadow-lg transform ring-0 transition ease-in-out duration-200 peer-checked:translate-x-4'
  46. props.inputClass = '$reset peer sr-only'
  47. } else {
  48. props.inputClass =
  49. 'h-4 w-4 border-[1.5px] border-white rounded-sm bg-transparent checked:focus:color-blue checked:bg-blue checked:border-blue checked:focus:bg-blue checked:hover:bg-blue'
  50. }
  51. }
  52. node.on('created', () => {
  53. if (!has(props, 'variant')) {
  54. props.variant = CheckboxVariant.default
  55. }
  56. setVariantClasses(props.variant)
  57. node.on('prop:variant', ({ payload }) => {
  58. setVariantClasses(payload)
  59. })
  60. })
  61. }
  62. initializeFieldDefinition(checkboxDefinition, {
  63. props: ['variant'],
  64. features: [addOptionCheckedDataAttribute, handleVariant],
  65. })
  66. export default {
  67. fieldType: 'checkbox',
  68. definition: checkboxDefinition,
  69. }