index.ts 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. // Copyright (C) 2012-2023 Zammad Foundation, https://zammad-foundation.org/
  2. import { cloneDeep } from 'lodash-es'
  3. import type { FormKitNode } from '@formkit/core'
  4. import { password as passwordDefinition } from '@formkit/inputs'
  5. import initializeFieldDefinition from '@shared/form/core/initializeFieldDefinition'
  6. import extendSchemaDefinition from '@shared/form/utils/extendSchemaDefinition'
  7. import formUpdaterTrigger from '@shared/form/features/formUpdaterTrigger'
  8. const localPasswordDefinition = cloneDeep(passwordDefinition)
  9. const switchPasswordVisibility = (node: FormKitNode) => {
  10. const { props } = node
  11. node.addProps(['passwordVisibilityIcon'])
  12. props.passwordVisibilityIcon = 'mobile-show'
  13. extendSchemaDefinition(node, 'suffix', {
  14. $el: 'span',
  15. children: [
  16. {
  17. $cmp: 'CommonIcon',
  18. props: {
  19. name: '$passwordVisibilityIcon',
  20. key: node.name,
  21. class: 'absolute top-1/2 transform -translate-y-1/2 right-3',
  22. size: 'small',
  23. onClick: () => {
  24. props.type = props.type === 'password' ? 'text' : 'password'
  25. },
  26. },
  27. },
  28. ],
  29. })
  30. node.on('prop:type', ({ payload, origin }) => {
  31. const { props } = origin
  32. props.passwordVisibilityIcon =
  33. payload === 'password' ? 'mobile-show' : 'mobile-hide'
  34. })
  35. }
  36. initializeFieldDefinition(localPasswordDefinition, {
  37. features: [switchPasswordVisibility, formUpdaterTrigger('blur')],
  38. })
  39. export default {
  40. fieldType: 'password',
  41. definition: localPasswordDefinition,
  42. }