|
|
@@ -1,68 +1,81 @@
|
|
|
-import { AnyJson, AnyStore } from '~/types/interfaces'
|
|
|
-import {computed, ComputedRef, useContext} from "@nuxtjs/composition-api";
|
|
|
+import {AnyJson, AnyStore} from '~/types/interfaces'
|
|
|
+import {computed, ComputedRef} from "@nuxtjs/composition-api";
|
|
|
+import {Route} from "vue-router";
|
|
|
+import {FORM_STATUS, SUBMIT_TYPE} from "~/types/enums";
|
|
|
|
|
|
/**
|
|
|
* @category composables/form
|
|
|
- * @class UseDirtyForm
|
|
|
- * Use Classe pour gérer l'apparition de message si le formulaire est dirty
|
|
|
+ * @param store
|
|
|
+ * Composable pour gérer l'apparition de message si le formulaire est dirty
|
|
|
*/
|
|
|
-export class UseForm {
|
|
|
- private store: AnyStore
|
|
|
- private readonly handler: any
|
|
|
+export function useForm(store: AnyStore){
|
|
|
|
|
|
- constructor () {
|
|
|
- const {store} = useContext()
|
|
|
- this.store = store
|
|
|
- this.handler = getEventHandler()
|
|
|
- }
|
|
|
+ const handler: any = getEventHandler()
|
|
|
+
|
|
|
+ const readonly: ComputedRef<boolean> = computed(() => {
|
|
|
+ return store.state.form.readonly
|
|
|
+ })
|
|
|
|
|
|
/**
|
|
|
- * Composition function
|
|
|
+ * définit le formulaire comme Dirty (modifié)
|
|
|
*/
|
|
|
- public invoke (): AnyJson {
|
|
|
- const readonly: ComputedRef<boolean> = computed(() => {
|
|
|
- return this.store.state.form.readonly
|
|
|
- })
|
|
|
-
|
|
|
- return {
|
|
|
- markFormAsDirty: () => this.markAsDirty(),
|
|
|
- markFormAsNotDirty: () => this.markAsNotDirty(),
|
|
|
- readonly
|
|
|
+ function markAsDirty () {
|
|
|
+ store.commit('form/setDirty', true)
|
|
|
+ if (process.browser) {
|
|
|
+ window.addEventListener('beforeunload', handler)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * définit le formulaire comme Dirty (modifié)
|
|
|
+ * Définit le formulaire comme non dirty (non modifié)
|
|
|
*/
|
|
|
- private markAsDirty () {
|
|
|
- this.store.commit('form/setDirty', true)
|
|
|
- this.addEventListener()
|
|
|
+ function markAsNotDirty () {
|
|
|
+ store.commit('form/setDirty', false)
|
|
|
+ if (process.browser) {
|
|
|
+ window.removeEventListener('beforeunload', handler)
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * Définit le formulaire comme non dirty (non modifié)
|
|
|
+ * Action Sauvegarder qui redirige vers la page d'edit si on est en mode create
|
|
|
+ * @param route
|
|
|
+ * @param id
|
|
|
+ * @param router
|
|
|
*/
|
|
|
- private markAsNotDirty () {
|
|
|
- this.store.commit('form/setDirty', false)
|
|
|
- this.clearEventListener()
|
|
|
+ function save(route: Route, id: number, router: any){
|
|
|
+ if(store.state.form.formStatus === FORM_STATUS.CREATE){
|
|
|
+ route.path += id
|
|
|
+ router.push(route)
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * Ajoute un Event avant le départ de la page
|
|
|
+ * Action sauvegarder et route suivante qui redirige vers une route
|
|
|
+ * @param route
|
|
|
+ * @param router
|
|
|
*/
|
|
|
- private addEventListener () {
|
|
|
- if (process.browser) {
|
|
|
- window.addEventListener('beforeunload', this.handler)
|
|
|
- }
|
|
|
+ function saveAndGoTo(route: Route, router: any){
|
|
|
+ router.push(route)
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * Supprime l'Event avant le départ de la page
|
|
|
+ * Factory des fonction permettant d'assurer l'étape suivant à la soumission d'un formulaire
|
|
|
+ * @param args
|
|
|
+ * @param response
|
|
|
+ * @param router
|
|
|
*/
|
|
|
- private clearEventListener () {
|
|
|
- if (process.browser) {
|
|
|
- window.removeEventListener('beforeunload', this.handler)
|
|
|
- }
|
|
|
+ function nextStepFactory(args: any, response: AnyJson, router: any){
|
|
|
+ const factory: AnyJson = {}
|
|
|
+ factory[SUBMIT_TYPE.SAVE] = () => save(args, response.id, router)
|
|
|
+ factory[SUBMIT_TYPE.SAVE_AND_BACK] = () => saveAndGoTo(args, router)
|
|
|
+ return factory
|
|
|
+ }
|
|
|
+
|
|
|
+ return {
|
|
|
+ markAsDirty,
|
|
|
+ markAsNotDirty,
|
|
|
+ nextStepFactory,
|
|
|
+ readonly
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -74,4 +87,3 @@ function getEventHandler () {
|
|
|
e.returnValue = ''
|
|
|
}
|
|
|
}
|
|
|
-export const $useForm = () => new UseForm().invoke()
|