useForm.ts 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import {AnyJson, AnyStore} from '~/types/interfaces'
  2. import {computed, ComputedRef} from "@nuxtjs/composition-api";
  3. import {Route} from "vue-router";
  4. import {FORM_STATUS, SUBMIT_TYPE} from "~/types/enums";
  5. /**
  6. * @category composables/form
  7. * @param store
  8. * Composable pour gérer l'apparition de message si le formulaire est dirty
  9. */
  10. export function useForm(store: AnyStore){
  11. const handler: any = getEventHandler()
  12. const readonly: ComputedRef<boolean> = computed(() => {
  13. return store.state.form.readonly
  14. })
  15. /**
  16. * définit le formulaire comme Dirty (modifié)
  17. */
  18. function markAsDirty () {
  19. store.commit('form/setDirty', true)
  20. if (process.browser) {
  21. window.addEventListener('beforeunload', handler)
  22. }
  23. }
  24. /**
  25. * Définit le formulaire comme non dirty (non modifié)
  26. */
  27. function markAsNotDirty () {
  28. store.commit('form/setDirty', false)
  29. if (process.browser) {
  30. window.removeEventListener('beforeunload', handler)
  31. }
  32. }
  33. /**
  34. * Action Sauvegarder qui redirige vers la page d'edit si on est en mode create
  35. * @param route
  36. * @param id
  37. * @param router
  38. */
  39. function save(route: Route, id: number, router: any){
  40. if(store.state.form.formStatus === FORM_STATUS.CREATE){
  41. route.path += id
  42. router.push(route)
  43. }
  44. }
  45. /**
  46. * Action sauvegarder et route suivante qui redirige vers une route
  47. * @param route
  48. * @param router
  49. */
  50. function saveAndGoTo(route: Route, router: any){
  51. router.push(route)
  52. }
  53. /**
  54. * Factory des fonction permettant d'assurer l'étape suivant à la soumission d'un formulaire
  55. * @param args
  56. * @param response
  57. * @param router
  58. */
  59. function nextStepFactory(args: any, response: AnyJson, router: any){
  60. const factory: AnyJson = {}
  61. factory[SUBMIT_TYPE.SAVE] = () => save(args, response.id, router)
  62. factory[SUBMIT_TYPE.SAVE_AND_BACK] = () => saveAndGoTo(args, router)
  63. return factory
  64. }
  65. return {
  66. markAsDirty,
  67. markAsNotDirty,
  68. nextStepFactory,
  69. readonly
  70. }
  71. }
  72. function getEventHandler () {
  73. return function (e: any) {
  74. // Cancel the event
  75. e.preventDefault()
  76. // Chrome requires returnValue to be set
  77. e.returnValue = ''
  78. }
  79. }