Address.vue 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. <!-- Component d'un formulaire d'une adresse postale d'organization -->
  2. <template>
  3. <main>
  4. <LayoutContainer>
  5. <v-card class="mb-5">
  6. <FormToolbar title="address_postal" icon="fa-globe-europe"/>
  7. <UiForm
  8. :id="id"
  9. :model="model"
  10. :query="query()"
  11. :submitActions="submitActions">
  12. <template #form.input="{entry, updateRepository}">
  13. <v-container fluid class="container">
  14. <v-row>
  15. <v-col cols="12" sm="12">
  16. <UiInputAutocompleteWithAPI
  17. field="owner"
  18. label="importAddress"
  19. :item-text="['person.givenName', 'person.name']"
  20. :searchFunction="accessSearch"
  21. @update="updateAccessAddress"
  22. />
  23. </v-col>
  24. <v-col cols="12" sm="6">
  25. <UiInputEnum field="type" label="addresstype" :data="entry['type']" enum-type="address_postal_organization" @update="updateRepository" />
  26. </v-col>
  27. <v-col cols="12" sm="6">
  28. <UiInputText field="addressPostal.addressOwner" label="addressOwner" :data="entry['addressPostal.addressOwner']" @update="updateRepository" />
  29. </v-col>
  30. <v-col cols="12" sm="6">
  31. <UiInputText field="addressPostal.streetAddress" label="streetAddress" :data="entry['addressPostal.streetAddress']" @update="updateRepository" />
  32. </v-col>
  33. <v-col cols="12" sm="6">
  34. <UiInputText field="addressPostal.streetAddressSecond" label="streetAddressSecond" :data="entry['addressPostal.streetAddressSecond']" @update="updateRepository" />
  35. </v-col>
  36. <v-col cols="12" sm="6">
  37. <UiInputText field="addressPostal.streetAddressThird" label="streetAddressThird" :data="entry['addressPostal.streetAddressThird']" @update="updateRepository" />
  38. </v-col>
  39. <v-col cols="12" sm="6">
  40. <UiInputAutocompleteWithAPI
  41. field="addressPostal.postalCode"
  42. label="postalCode"
  43. :data="getAutoCompleteAddressItem"
  44. :item-text="['postcode']"
  45. :slotText="['postcode', 'city']"
  46. :searchFunction="addressSearch"
  47. :returnObject="true"
  48. @update="updateCpAddress($event, updateRepository)"
  49. />
  50. </v-col>
  51. <v-col cols="12" sm="6">
  52. <UiInputAutocompleteWithAPI
  53. field="addressPostal.addressCity"
  54. label="addressCity"
  55. :data="getAutoCompleteAddressItem"
  56. :item-text="['city']"
  57. :slotText="['postcode', 'city']"
  58. :searchFunction="addressSearch"
  59. :returnObject="true"
  60. @update="updateCpAddress($event, updateRepository)"
  61. />
  62. </v-col>
  63. <v-col cols="12" sm="6">
  64. <UiInputAutocomplete
  65. field="addressPostal.addressCountry"
  66. label="addressCountry"
  67. :data="getIdFromUri(entry['addressPostal.addressCountry'])"
  68. :items="countries"
  69. :isLoading="countriesFetchingState.pending"
  70. :item-text="['name']"
  71. @update="updateRepository(`/api/countries/${$event}`, 'addressPostal.addressCountry')"
  72. />
  73. </v-col>
  74. </v-row>
  75. </v-container>
  76. <UiMap :zoom="12" :address="addressPostalItem()" @updateAddress="updateAddressFromMap" />
  77. </template>
  78. <template #form.button>
  79. <NuxtLink :to="{ path: '/organization', query: { accordion: 'address_postal' }}" class="no-decoration">
  80. <v-btn class="mr-4 ot_light_grey ot_grey--text">
  81. {{ $t('back') }}
  82. </v-btn>
  83. </NuxtLink>
  84. </template>
  85. </UiForm>
  86. </v-card>
  87. </LayoutContainer>
  88. </main>
  89. </template>
  90. <script lang="ts">
  91. import { defineComponent, useContext, computed, ComputedRef, Ref, ref } from '@nuxtjs/composition-api'
  92. import { Repository as VuexRepository } from '@vuex-orm/core/dist/src/repository/Repository'
  93. import { Query, Model } from '@vuex-orm/core'
  94. import { OrganizationAddressPostal } from '~/models/Organization/OrganizationAddressPostal'
  95. import {Country} from "~/models/Core/Country";
  96. import {QUERY_TYPE, SUBMIT_TYPE} from '~/types/enums'
  97. import { repositoryHelper } from '~/services/store/repository'
  98. import { queryHelper } from '~/services/store/query'
  99. import { AddressPostal } from '~/models/Core/AddressPostal'
  100. import {UseCountry} from "~/composables/data/useCountry";
  101. import ModelsUtils from "~/services/utils/modelsUtils";
  102. import {UseAddressPostal} from "~/composables/data/useAddresspostal";
  103. import {AnyJson} from "~/types/interfaces";
  104. import DataProvider from "~/services/data/dataProvider";
  105. import {UseAccess} from "~/composables/data/useAccess";
  106. export default defineComponent({
  107. props: {
  108. id:{
  109. type: [Number, String],
  110. required: true
  111. }
  112. },
  113. setup (props) {
  114. const { $dataProvider } = useContext()
  115. const repository: VuexRepository<Model> = repositoryHelper.getRepository(OrganizationAddressPostal)
  116. const query: Query = repository.with('addressPostal')
  117. const organizationAddressPostalItem: ComputedRef<OrganizationAddressPostal> = computed(() => {
  118. return queryHelper.getItem(query, props.id) as OrganizationAddressPostal
  119. })
  120. const addressPostalItem: ComputedRef<AddressPostal|null> = computed(() => {
  121. return organizationAddressPostalItem.value?.addressPostal || null
  122. })
  123. const updateAddressFromMap = (addressPostal: AddressPostal) => {
  124. repositoryHelper.persist(AddressPostal, addressPostal)
  125. }
  126. const getAutoCompleteAddressItem = computed(() => {
  127. if(addressPostalItem.value?.addressCity || addressPostalItem.value?.postalCode)
  128. return {id:0, city: addressPostalItem.value?.addressCity, postcode: addressPostalItem.value?.postalCode}
  129. return {}
  130. })
  131. const {countries, fetchState: countriesFetchingState} = new UseCountry().getAll()
  132. const {searchFunction: addressSearch, updateCpAddress} = new UseAddressPostal().invoke()
  133. const {getPhysicalByFullName: accessSearch} = new UseAccess().invoke()
  134. const {updateAccessAddress} = accessOwnerResearch($dataProvider, organizationAddressPostalItem, addressPostalItem)
  135. const getIdFromUri = (uri: string) => {
  136. return ModelsUtils.extractIdFromUri(uri)
  137. }
  138. const submitActions = computed(() => {
  139. let actions:AnyJson = {}
  140. actions[SUBMIT_TYPE.SAVE_AND_BACK] = { path: `/organization`, query: { accordion: 'address_postal' } }
  141. actions[SUBMIT_TYPE.SAVE] = { path: `/organization/address/` }
  142. return actions
  143. })
  144. /** Computed properties needs to be returned as functions until nuxt3 : https://github.com/nuxt-community/composition-api/issues/207 **/
  145. return {
  146. model: OrganizationAddressPostal,
  147. query: () => query,
  148. panel: 0,
  149. addressPostalItem: () => addressPostalItem,
  150. countries,
  151. countriesFetchingState,
  152. addressSearch,
  153. getIdFromUri,
  154. getAutoCompleteAddressItem,
  155. accessSearch,
  156. updateAccessAddress,
  157. updateAddressFromMap,
  158. updateCpAddress,
  159. submitActions
  160. }
  161. },
  162. beforeDestroy() {
  163. repositoryHelper.cleanRepository(OrganizationAddressPostal)
  164. repositoryHelper.cleanRepository(Country)
  165. repositoryHelper.cleanRepository(AddressPostal)
  166. }
  167. })
  168. /**
  169. * Fonction permettant la mise à jour des champs de l'adresse suivant une adresse d'un Access
  170. * @param $dataProvider
  171. * @param organizationAddressPostalItem
  172. * @param addressItem
  173. */
  174. function accessOwnerResearch($dataProvider:DataProvider, organizationAddressPostalItem:ComputedRef<OrganizationAddressPostal>, addressItem:ComputedRef<AddressPostal|null>){
  175. const updateAccessAddress = async (accessId: number) =>{
  176. const response = await $dataProvider.invoke({
  177. type: QUERY_TYPE.DEFAULT,
  178. url: `api/access_addresses`,
  179. id:accessId
  180. })
  181. //On ne conserve que l'adresse principale
  182. const principalPersonalAddress = response.data.person.personAddressPostal.filter((personAddress: AnyJson) => {
  183. return personAddress.type === 'ADDRESS_PRINCIPAL'
  184. })
  185. if(principalPersonalAddress.length > 0){
  186. const personalAddress = principalPersonalAddress.pop()
  187. //On créer la nouvelle adresse et on initialise les champs restants...
  188. const addressPostal:AddressPostal = new AddressPostal(personalAddress.addressPostal)
  189. addressPostal.addressOwner = `${response.data.person.name} ${response.data.person.givenName}`
  190. addressPostal['@id'] = ''
  191. if(addressItem.value)
  192. addressPostal.id = addressItem.value.id
  193. //On l'associe à l'OrganizationAddressPostal qui est éditée, et on persist
  194. organizationAddressPostalItem.value.addressPostal = addressPostal
  195. repositoryHelper.persist(OrganizationAddressPostal, organizationAddressPostalItem.value)
  196. }
  197. }
  198. return {
  199. updateAccessAddress
  200. }
  201. }
  202. </script>