| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321 |
- <template>
- <LayoutCommonSection>
- <v-row>
- <v-col cols="12" sm="12">
- <h4 class="mb-8">{{ $t('general_informations') }}</h4>
- <UiInputText
- v-model="entity.name"
- field="name"
- :rules="getAsserts('name')"
- />
- <span class="label">{{$t('datetimeStart')}}</span>
- <UiInputDateTimePicker
- v-model="entity.datetimeStart"
- field="datetimeStart"
- label="datetimeStart"
- :withTimePicker="true"
- class="my-2"
- :rules="getAsserts('datetimeStart')"
- validate-on-blur
- @update:model-value="onUpdateDateTimeStart(entity, $event)"
- />
- <span class="label">{{$t('datetimeEnd')}}</span>
- <UiInputDateTimePicker
- v-model="entity.datetimeEnd"
- field="datetimeEnd"
- label="datetimeEnd"
- :withTimePicker="true"
- class="my-2"
- :rules="getAsserts('datetimeEnd')"
- @update:model-value="onUpdateDateTimeEnd(entity, $event)"
- />
- <span class="label">{{$t('description')}}</span>
- <UiInputTextArea
- class="mt-3"
- v-model="entity.description"
- />
- <UiInputTreeSelectEventCategories
- v-model="entity.categories"
- label="event_categories_choices"
- />
- <UiInputImage
- v-model="entity.image"
- field="image"
- :width="240"
- :cropping-enabled="true"
- />
- </v-col>
- </v-row>
- </LayoutCommonSection>
- <LayoutCommonSection>
- <v-row>
- <v-col cols="12">
- <h4 class="mb-8">{{ $t('place_event') }}</h4>
- <UiInputAutocompleteApiResources
- v-model="entity.place"
- field="place"
- :model="PlaceSearchItem"
- listValue="id"
- listLabel="name"
- v-if="!newPlace"
- @update:model-value="getPlace(entity)"
- />
- <v-row v-if="!newPlace" class="mb-6 justify-center">
- <v-col
- v-if="entity.place && !editPlace"
- cols="12"
- sm="6"
- class="d-flex justify-center mb-2"
- >
- <v-btn
- prepend-icon="fa-solid fa-pencil"
- @click="onEditPlaceClick(entity)"
- >
- {{ $t('edit_place') }}
- </v-btn>
- </v-col>
- <v-col
- cols="12"
- sm="6"
- class="d-flex justify-center mb-2"
- >
- <v-btn
- prepend-icon="fa-solid fa-plus"
- @click="onAddPlaceClick(entity)"
- >
- {{ $t('add_place') }}
- </v-btn>
- </v-col>
- </v-row>
- <UiInputText :readonly="!newPlace && !editPlace" v-model="entity.placeName" field="placeName" />
- <UiInputText :readonly="!newPlace && !editPlace" v-model="entity.streetAddress" field="streetAddress" />
- <UiInputText :readonly="!newPlace && !editPlace" v-model="entity.streetAddressSecond" field="streetAddressSecond" />
- <UiInputText :readonly="!newPlace && !editPlace" v-model="entity.streetAddressThird" field="streetAddressThird" />
- <UiInputText :readonly="!newPlace && !editPlace" v-model="entity.postalCode" field="postalCode" />
- <UiInputText :readonly="!newPlace && !editPlace" v-model="entity.addressCity" field="addressCity" />
- <UiInputAutocompleteApiResources
- :readonly="!newPlace && !editPlace"
- v-model="entity.addressCountry"
- field="addressCountry"
- :model="Country"
- listValue="id"
- listLabel="name"
- />
- <client-only>
- <UiMapLeaflet
- :readonly="!newPlace && !editPlace"
- v-model:latitude="entity.latitude"
- v-model:longitude="entity.longitude"
- :streetAddress="entity.streetAddress"
- :streetAddressSecond="entity.streetAddressSecond"
- :streetAddressThird="entity.streetAddressThird"
- :postalCode="entity.postalCode"
- :addressCity="entity.addressCity"
- :addressCountryId="entity.addressCountry"
- :searchButton="true"
- ></UiMapLeaflet>
- </client-only>
- </v-col>
- </v-row>
- </LayoutCommonSection>
- <LayoutCommonSection>
- <v-row>
- <v-col cols="12">
- <h4 class="mb-8">{{ $t('communication_params') }}</h4>
- <UiInputText v-model="entity.url" field="url" />
- <UiInputAutocompleteEnum
- v-model="entity.pricing"
- enum-name="pricing_event"
- field="pricing"
- />
- <UiInputText v-if="entity.pricing==='PAID'" v-model="entity.urlTicket" field="urlTicket" />
- <UiInputNumber v-if="entity.pricing==='PAID'" v-model="entity.priceMini" field="priceMini" />
- <UiInputNumber v-if="entity.pricing==='PAID'" v-model="entity.priceMaxi" field="priceMaxi" />
- </v-col>
- </v-row>
- </LayoutCommonSection>
- <LazyLayoutDialog :show="showAlert" theme="warning">
- <template #dialogType>{{ $t('important') }}</template>
- <template #dialogTitle>{{ $t('place_change_everywhere') }}</template>
- <template #dialogText>
- <v-card-text class="text">
- <p>
- {{$t('warning_edit_place')}}
- </p>
- </v-card-text>
- </template>
- <template #dialogBtn>
- <v-btn class="mr-4 submitBtn theme-neutral-strong" @click="closeDialog">
- {{ $t('cancel') }}
- </v-btn>
- <v-btn class="mr-4 submitBtn theme-warning" @click="onEditPlaceConfirm">
- {{ $t('i_understand') }}
- </v-btn>
- </template>
- </LazyLayoutDialog>
- </template>
- <script setup lang="ts">
- import Event from "~/models/Freemium/Event";
- import Place from "~/models/Freemium/Place";
- import {getAssertUtils} from "~/services/asserts/getAssertUtils";
- import DateUtils from "~/services/utils/dateUtils";
- import Country from "~/models/Core/Country";
- import PlaceSearchItem from "~/models/Custom/Search/PlaceSearchItem";
- import {useEntityManager} from "~/composables/data/useEntityManager";
- const props = defineProps<{
- entity: Event
- }>()
- const {em} = useEntityManager()
- const getAsserts = (key) => getAssertUtils(Event.getAsserts(), key)
- /**
- * Si la date de début est mise à jour, on s'assure que la date de fin est
- * après elle, sinon elle devient égale
- * @param entity
- * @param dateTime
- */
- const onUpdateDateTimeStart = (entity, dateTime) =>{
- if(DateUtils.isBefore(props.entity.datetimeEnd, dateTime, false)){
- entity.datetimeEnd = dateTime
- }
- }
- /**
- * Si la date de fin est mise à jour, on s'assure que la date de début est
- * avant elle, sinon elle devient égale
- * @param entity
- * @param dateTime
- */
- const onUpdateDateTimeEnd = (entity, dateTime) =>{
- if(DateUtils.isBefore(dateTime, props.entity.datetimeStart, false)){
- entity.datetimeStart = dateTime
- }
- }
- const showAlert: Ref<boolean> = ref(false)
- const newPlace: Ref<boolean> = ref(false)
- const editPlace: Ref<boolean> = ref(false)
- /**
- * Si on clic sur le bouton "Ajouter un lieu", le choix dans la liste déroulante
- * est mise à nulle, et les champs input de l'adresse sont vidées
- * @param entity
- */
- const onAddPlaceClick = function(entity: Event){
- newPlace.value = true
- entity.place = null
- resetPlace(entity)
- }
- /**
- * Quand on clic sur le bouton "Editer le lieu", une alerte s'affiche
- */
- const onEditPlaceClick = function(){
- showAlert.value = true
- }
- /**
- * Quand on ferme la boite de dialogue
- */
- const closeDialog = function(){
- showAlert.value = false
- }
- /**
- * Si on décide d'éditer le lieu
- */
- const onEditPlaceConfirm = function(){
- showAlert.value = false
- editPlace.value = true
- }
- /**
- * Lorsque l'on choisit un lieu dans la liste déroulante, on mets a jour les champs
- * input de l'adresse
- * @param entity
- */
- const getPlace = async (entity: Event)=>{
- if(entity.place){
- const placeInstance = await em.fetch(Place, entity.place as number)
- entity.placeName = placeInstance.name
- entity.streetAddress = placeInstance.streetAddress
- entity.streetAddressSecond = placeInstance.streetAddressSecond
- entity.streetAddressThird = placeInstance.streetAddressThird
- entity.addressCity = placeInstance.addressCity
- entity.postalCode = placeInstance.postalCode
- entity.addressCountry = placeInstance.addressCountry
- entity.latitude = placeInstance.latitude
- entity.longitude = placeInstance.longitude
- editPlace.value = false
- }else{
- //Dans le cas où l'on ne récupère aucune place on remet a null le formulaire de l'adresse
- resetPlace(entity)
- }
- }
- /**
- * fonction permettant de remettre à vide tous les champs input de l'adresse
- * @param entity
- */
- const resetPlace = (entity: Event)=>{
- entity.placeName = null
- entity.streetAddress = null
- entity.streetAddressSecond = null
- entity.streetAddressThird = null
- entity.addressCity = null
- entity.postalCode = null
- entity.addressCountry = null
- entity.latitude = null
- entity.longitude = null
- }
- // Nettoyer les données lors du démontage du composant
- onBeforeUnmount(() => {
- // Nettoyer les références du store si nécessaire
- if (process.client) {
- clearNuxtData('/^' + Place.entity + '_/')
- useRepo(Place).flush()
- }
- })
- </script>
- <style scoped lang="scss">
- .label{
- font-size: 16px;
- color: rgb(var(--v-theme-on-primary-alt));
- }
- </style>
|