Event.vue 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. <template>
  2. <LayoutCommonSection>
  3. <v-row>
  4. <v-col cols="12" sm="12">
  5. <h4 class="mb-8">{{ $t('general_informations') }}</h4>
  6. <UiInputText
  7. v-model="entity.name"
  8. field="name"
  9. :rules="getAsserts('name')"
  10. />
  11. <span class="label">{{$t('datetimeStart')}}</span>
  12. <UiInputDateTimePicker
  13. v-model="entity.datetimeStart"
  14. field="datetimeStart"
  15. label="datetimeStart"
  16. :withTimePicker="true"
  17. class="my-2"
  18. :rules="getAsserts('datetimeStart')"
  19. validate-on-blur
  20. @update:model-value="onUpdateDateTimeStart(entity, $event)"
  21. />
  22. <span class="label">{{$t('datetimeEnd')}}</span>
  23. <UiInputDateTimePicker
  24. v-model="entity.datetimeEnd"
  25. field="datetimeEnd"
  26. label="datetimeEnd"
  27. :withTimePicker="true"
  28. class="my-2"
  29. :rules="getAsserts('datetimeEnd')"
  30. @update:model-value="onUpdateDateTimeEnd(entity, $event)"
  31. />
  32. <span class="label">{{$t('description')}}</span>
  33. <UiInputTextArea
  34. class="mt-3"
  35. v-model="entity.description"
  36. />
  37. <UiInputTreeSelectEventCategories
  38. v-model="entity.categories"
  39. label="event_categories_choices"
  40. />
  41. <UiInputImage
  42. v-model="entity.image"
  43. field="image"
  44. :width="240"
  45. :cropping-enabled="true"
  46. />
  47. </v-col>
  48. </v-row>
  49. </LayoutCommonSection>
  50. <LayoutCommonSection>
  51. <v-row>
  52. <v-col cols="12">
  53. <h4 class="mb-8">{{ $t('place_event') }}</h4>
  54. <UiInputAutocompleteApiResources
  55. v-model="entity.place"
  56. field="place"
  57. :model="PlaceSearchItem"
  58. listValue="id"
  59. listLabel="name"
  60. v-if="!newPlace"
  61. @update:model-value="getPlace(entity)"
  62. />
  63. <div class="d-flex justify-center"
  64. v-if="!newPlace"
  65. >
  66. <v-btn
  67. prepend-icon="fa-solid fa-plus"
  68. class="mb-6"
  69. @click="onAddPlaceClick(entity)"
  70. >
  71. {{ $t('add_place') }}
  72. </v-btn>
  73. <v-btn
  74. v-if="entity.place && !editPlace"
  75. prepend-icon="fa-solid fa-plus"
  76. class="mb-6 ml-6"
  77. @click="onEditPlaceClick(entity)"
  78. >
  79. {{ $t('edit_place') }}
  80. </v-btn>
  81. </div>
  82. <UiInputText :readonly="!newPlace && !editPlace" v-model="entity.placeName" field="placeName" />
  83. <UiInputText :readonly="!newPlace && !editPlace" v-model="entity.streetAddress" field="streetAddress" />
  84. <UiInputText :readonly="!newPlace && !editPlace" v-model="entity.streetAddressSecond" field="streetAddressSecond" />
  85. <UiInputText :readonly="!newPlace && !editPlace" v-model="entity.streetAddressThird" field="streetAddressThird" />
  86. <UiInputText :readonly="!newPlace && !editPlace" v-model="entity.postalCode" field="postalCode" />
  87. <UiInputText :readonly="!newPlace && !editPlace" v-model="entity.addressCity" field="addressCity" />
  88. <UiInputAutocompleteApiResources
  89. :readonly="!newPlace && !editPlace"
  90. v-model="entity.addressCountry"
  91. field="addressCountry"
  92. :model="Country"
  93. listValue="id"
  94. listLabel="name"
  95. />
  96. <client-only>
  97. <UiMapLeaflet
  98. :readonly="!newPlace && !editPlace"
  99. v-model:latitude="entity.latitude"
  100. v-model:longitude="entity.longitude"
  101. :streetAddress="entity.streetAddress"
  102. :streetAddressSecond="entity.streetAddressSecond"
  103. :streetAddressThird="entity.streetAddressThird"
  104. :postalCode="entity.postalCode"
  105. :addressCity="entity.addressCity"
  106. :addressCountryId="entity.addressCountry"
  107. :searchButton="true"
  108. ></UiMapLeaflet>
  109. </client-only>
  110. </v-col>
  111. </v-row>
  112. </LayoutCommonSection>
  113. <LayoutCommonSection>
  114. <v-row>
  115. <v-col cols="12">
  116. <h4 class="mb-8">{{ $t('communication_params') }}</h4>
  117. <UiInputText v-model="entity.url" field="url" />
  118. <UiInputAutocompleteEnum
  119. v-model="entity.pricing"
  120. enum-name="pricing_event"
  121. field="pricing"
  122. />
  123. <UiInputText v-if="entity.pricing==='PAID'" v-model="entity.urlTicket" field="urlTicket" />
  124. <UiInputNumber v-if="entity.pricing==='PAID'" v-model="entity.priceMini" field="priceMini" />
  125. <UiInputNumber v-if="entity.pricing==='PAID'" v-model="entity.priceMaxi" field="priceMaxi" />
  126. </v-col>
  127. </v-row>
  128. </LayoutCommonSection>
  129. <LazyLayoutDialog :show="showAlert" theme="warning">
  130. <template #dialogType>{{ $t('important') }}</template>
  131. <template #dialogTitle>{{ $t('place_change_everywhere') }}</template>
  132. <template #dialogText>
  133. <v-card-text class="text">
  134. <p>
  135. Si vous modifiez les informations de ce lieu et que ce lieu est lié à d'autre événements,
  136. alors les changements seront répercutés dans tous vos événements liés.
  137. </p>
  138. </v-card-text>
  139. </template>
  140. <template #dialogBtn>
  141. <v-btn class="mr-4 submitBtn theme-neutral-strong" @click="closeDialog">
  142. {{ $t('cancel') }}
  143. </v-btn>
  144. <v-btn class="mr-4 submitBtn theme-warning" @click="onEditPlaceConfirm">
  145. {{ $t('i_understand') }}
  146. </v-btn>
  147. </template>
  148. </LazyLayoutDialog>
  149. </template>
  150. <script setup lang="ts">
  151. import Event from "~/models/Freemium/Event";
  152. import Place from "~/models/Freemium/Place";
  153. import {getAssertUtils} from "~/services/asserts/getAssertUtils";
  154. import DateUtils from "~/services/utils/dateUtils";
  155. import Country from "~/models/Core/Country";
  156. import PlaceSearchItem from "~/models/Custom/Search/PlaceSearchItem";
  157. import {useEntityManager} from "~/composables/data/useEntityManager";
  158. const props = defineProps<{
  159. entity: Event
  160. }>()
  161. const {em} = useEntityManager()
  162. const getAsserts = (key) => getAssertUtils(Event.getAsserts(), key)
  163. /**
  164. * Si la date de début est mise à jour, on s'assure que la date de fin est
  165. * après elle, sinon elle devient égale
  166. * @param entity
  167. * @param dateTime
  168. */
  169. const onUpdateDateTimeStart = (entity, dateTime) =>{
  170. if(DateUtils.isBefore(props.entity.datetimeEnd, dateTime, false)){
  171. entity.datetimeEnd = dateTime
  172. }
  173. }
  174. /**
  175. * Si la date de fin est mise à jour, on s'assure que la date de début est
  176. * avant elle, sinon elle devient égale
  177. * @param entity
  178. * @param dateTime
  179. */
  180. const onUpdateDateTimeEnd = (entity, dateTime) =>{
  181. if(DateUtils.isBefore(dateTime, props.entity.datetimeStart, false)){
  182. entity.datetimeStart = dateTime
  183. }
  184. }
  185. const showAlert: Ref<boolean> = ref(false)
  186. const newPlace: Ref<boolean> = ref(false)
  187. const editPlace: Ref<boolean> = ref(false)
  188. /**
  189. * Si on clic sur le bouton "Ajouter un lieu", le choix dans la liste déroulante
  190. * est mise à nulle, et les champs input de l'adresse sont vidées
  191. * @param entity
  192. */
  193. const onAddPlaceClick = function(entity: Event){
  194. newPlace.value = true
  195. entity.place = null
  196. resetPlace(entity)
  197. }
  198. /**
  199. * Quand on clic sur le bouton "Editer le lieu", une alerte s'affiche
  200. */
  201. const onEditPlaceClick = function(){
  202. showAlert.value = true
  203. }
  204. /**
  205. * Quand on ferme la boite de dialogue
  206. */
  207. const closeDialog = function(){
  208. showAlert.value = false
  209. }
  210. /**
  211. * Si on décide d'éditer le lieu
  212. */
  213. const onEditPlaceConfirm = function(){
  214. showAlert.value = false
  215. editPlace.value = true
  216. }
  217. /**
  218. * Lorsque l'on choisit un lieu dans la liste déroulante, on mets a jour les champs
  219. * input de l'adresse
  220. * @param entity
  221. */
  222. const getPlace = async (entity: Event)=>{
  223. if(entity.place){
  224. const placeInstance = await em.fetch(Place, entity.place as number)
  225. entity.placeName = placeInstance.name
  226. entity.streetAddress = placeInstance.streetAddress
  227. entity.streetAddressSecond = placeInstance.streetAddressSecond
  228. entity.streetAddressThird = placeInstance.streetAddressThird
  229. entity.addressCity = placeInstance.addressCity
  230. entity.postalCode = placeInstance.postalCode
  231. entity.addressCountry = placeInstance.addressCountry
  232. entity.latitude = placeInstance.latitude
  233. entity.longitude = placeInstance.longitude
  234. editPlace.value = false
  235. }else{
  236. //Dans le cas où l'on ne récupère aucune place on remet a null le formulaire de l'adresse
  237. resetPlace(entity)
  238. }
  239. }
  240. /**
  241. * fonction permettant de remettre à vide tous les champs input de l'adresse
  242. * @param entity
  243. */
  244. const resetPlace = (entity: Event)=>{
  245. entity.placeName = null
  246. entity.streetAddress = null
  247. entity.streetAddressSecond = null
  248. entity.streetAddressThird = null
  249. entity.addressCity = null
  250. entity.postalCode = null
  251. entity.addressCountry = null
  252. entity.latitude = null
  253. entity.longitude = null
  254. }
  255. // Nettoyer les données lors du démontage du composant
  256. onBeforeUnmount(() => {
  257. // Nettoyer les références du store si nécessaire
  258. if (process.client) {
  259. clearNuxtData('/^' + Place.entity + '_/')
  260. useRepo(Place).flush()
  261. }
  262. })
  263. </script>
  264. <style scoped lang="scss">
  265. .label{
  266. font-size: 16px;
  267. color: rgb(var(--v-theme-on-primary-alt));
  268. }
  269. </style>