_id.vue 9.6 KB

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