Form.vue 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. <template>
  2. <main>
  3. <v-form
  4. ref="form"
  5. v-model="properties.valid"
  6. lazy-validation
  7. :readonly="readOnly"
  8. >
  9. <v-container fluid class="container btnActions">
  10. <v-row>
  11. <v-col cols="12" sm="12">
  12. <slot name="form.button"></slot>
  13. <v-btn v-if="!readOnly" class="mr-4 ot_green ot_white--text" @click="submit">
  14. Enregistrer
  15. </v-btn>
  16. </v-col>
  17. </v-row>
  18. </v-container>
  19. <slot name="form.input" v-bind="{entry,updateRepository}"></slot>
  20. <v-container fluid class="container btnActions">
  21. <v-row>
  22. <v-col cols="12" sm="12">
  23. <slot name="form.button"></slot>
  24. <v-btn v-if="!readOnly" class="mr-4 ot_green ot_white--text" @click="submit">
  25. Enregistrer
  26. </v-btn>
  27. </v-col>
  28. </v-row>
  29. </v-container>
  30. </v-form>
  31. <div class="text-center">
  32. <v-dialog
  33. v-model="dialog"
  34. width="500"
  35. >
  36. <v-card>
  37. <v-card-title class="text-h5 grey lighten-2">
  38. Attention
  39. </v-card-title>
  40. <v-card-text>
  41. <br>
  42. <p>Vous souhaitez quitter ce formulaire sans avoir enregistré</p>
  43. </v-card-text>
  44. <v-divider></v-divider>
  45. <v-card-actions>
  46. <v-spacer></v-spacer>
  47. <v-btn class="mr-4 submitBtn ot_danger ot_white--text" @click="closeDialogs">
  48. Retour
  49. </v-btn>
  50. <v-btn class="mr-4 submitBtn ot_green ot_white--text" @click="goEvenUnsavedData">
  51. Continuer
  52. </v-btn>
  53. </v-card-actions>
  54. </v-card>
  55. </v-dialog>
  56. </div>
  57. </main>
  58. </template>
  59. <script lang="ts">
  60. import {defineComponent, reactive, useContext, computed, toRefs, onBeforeUnmount, onBeforeMount} from '@nuxtjs/composition-api'
  61. import {useRepositoryHelper} from "~/use/store/useRepository";
  62. import {useQueryHelper} from "~/use/store/useQuery";
  63. import {Query} from "@vuex-orm/core";
  64. import {QUERY_TYPE} from "~/types/enums";
  65. export default defineComponent({
  66. props: {
  67. model: {
  68. type: Function,
  69. required: true
  70. },
  71. id: {
  72. type: Number,
  73. required: true
  74. },
  75. query: {
  76. type: Object as () => Query,
  77. required: true
  78. },
  79. },
  80. setup: function (props) {
  81. const {$dataPersister, store, app} = useContext()
  82. const {id, query} = toRefs(props)
  83. const repository = useRepositoryHelper.getRepository(props.model)
  84. const properties = reactive({
  85. valid: false,
  86. saveOk: false,
  87. saveKo: false
  88. })
  89. const readOnly = computed(() => {
  90. return false
  91. })
  92. const entry = computed(() => {
  93. return useQueryHelper.getFlattenEntry(query.value, id.value)
  94. })
  95. const handler = getEventHandler()
  96. const updateRepository = (newValue: string, field: string) => {
  97. addEventListener(handler)
  98. store.commit('form/setDirty', true)
  99. useRepositoryHelper.updateStoreFromField(repository, entry.value, newValue, field)
  100. }
  101. const dialog = computed(() => {
  102. return store.state.form.showConfirmToLeave
  103. })
  104. const closeDialogs = () => {
  105. store.commit('form/setShowConfirmToLeave', false)
  106. }
  107. const goEvenUnsavedData = () => {
  108. store.commit('form/setDirty', false)
  109. store.commit('form/setShowConfirmToLeave', false)
  110. const entryCopy = query.value.first()
  111. if (entryCopy && entryCopy.$getAttributes()['originalState']) {
  112. useRepositoryHelper.updateStore(repository, entryCopy.$getAttributes()['originalState'])
  113. }
  114. if (app.router) {
  115. app.router.push(store.state.form.goAfterLeave)
  116. }
  117. }
  118. onBeforeMount(() => {
  119. clearEventListener(handler)
  120. })
  121. onBeforeUnmount(() => {
  122. clearEventListener(handler)
  123. })
  124. const submit = async () => {
  125. try {
  126. store.commit('form/setDirty', false)
  127. clearEventListener(handler)
  128. await $dataPersister.invoke({
  129. type: QUERY_TYPE.MODEL,
  130. model: props.model,
  131. id: id.value
  132. })
  133. } catch (error) {
  134. console.log('aie aie aie')
  135. }
  136. }
  137. return {
  138. submit,
  139. updateRepository,
  140. properties,
  141. readOnly,
  142. dialog,
  143. entry,
  144. goEvenUnsavedData,
  145. closeDialogs,
  146. }
  147. },
  148. methods: {
  149. // async submit(){
  150. //
  151. // console.log()
  152. //
  153. //
  154. // const form:VForm = this.$refs.form;
  155. // if(form.validate()){
  156. // const model = await this.repository.find(parseInt(this.$route.params.id));
  157. // if(model){
  158. // const playload = model.$toJson();
  159. //
  160. // this.$http.$put(`https://local.new.api.opentalent.fr/api/${model.$entity}/${this.$route.params.id}`, playload)
  161. // .then(()=>{
  162. // this.saveOk=true
  163. // }, () =>{
  164. // this.saveKo=true
  165. // })
  166. //
  167. // setTimeout(()=>{
  168. // this.saveOk=false
  169. // this.saveKo=false
  170. // },2000)
  171. // }
  172. // }
  173. // }
  174. }
  175. })
  176. function getEventHandler() {
  177. return function (e: any) {
  178. // Cancel the event
  179. e.preventDefault();
  180. // Chrome requires returnValue to be set
  181. e.returnValue = '';
  182. };
  183. }
  184. function addEventListener(handler: any) {
  185. if (process.browser) {
  186. window.addEventListener('beforeunload', handler);
  187. }
  188. }
  189. function clearEventListener(handler: any) {
  190. if (process.browser) {
  191. window.removeEventListener('beforeunload', handler);
  192. }
  193. }
  194. </script>
  195. <style scoped>
  196. .btnActions {
  197. text-align: right;
  198. }
  199. </style>