| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394 |
- <template>
- <LayoutCommonSection>
- <v-row>
- <v-col cols="12" sm="12">
- <h4 class="mb-8">{{ $t('general_informations') }}</h4>
- <UiInputText
- v-model="proxyEntity.name"
- field="name"
- :rules="getAsserts('name')"
- />
- <span class="label">{{ $t('datetimeStart') }}</span>
- <UiInputDateTimePicker
- :model-value="proxyEntity.datetimeStart"
- field="datetimeStart"
- label="datetimeStart"
- :with-time-picker="true"
- class="my-2"
- :rules="getAsserts('datetimeStart')"
- validate-on-blur
- @update:model-value="onUpdateDateTimeStart(proxyEntity, $event)"
- />
- <span class="label">{{ $t('datetimeEnd') }}</span>
- <UiInputDateTimePicker
- :model-value="proxyEntity.datetimeEnd"
- field="datetimeEnd"
- label="datetimeEnd"
- :with-time-picker="true"
- class="my-2"
- :rules="getAsserts('datetimeEnd')"
- @update:model-value="onUpdateDateTimeEnd(proxyEntity, $event)"
- />
- <span class="label">{{ $t('description') }}</span>
- <UiInputTextArea v-model="proxyEntity.description" class="mt-3" />
- <UiInputTreeSelectEventCategories
- v-model="proxyEntity.categories"
- label="event_categories_choices"
- />
- <UiInputImage
- v-model="proxyEntity.image"
- field="image"
- label="event_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-if="!newPlace"
- v-model="proxyEntity.place"
- field="place"
- :model="PlaceSearchItem"
- list-value="id"
- list-label="name"
- @update:model-value="getPlace(proxyEntity)"
- />
- <v-row class="mb-6 justify-center">
- <v-col
- v-if="newPlace"
- cols="12"
- sm="6"
- class="d-flex justify-center mb-2"
- >
- <v-btn
- prepend-icon="fa-solid fa-cancel"
- @click="onCancelPlaceClick(proxyEntity)"
- >
- {{ $t('cancel') }}
- </v-btn>
- </v-col>
- <v-col
- v-if="proxyEntity.place && !editPlace"
- cols="12"
- sm="6"
- class="d-flex justify-center mb-2"
- >
- <v-btn
- prepend-icon="fa-solid fa-pencil"
- @click="onEditPlaceClick(proxyEntity)"
- >
- {{ $t('edit_place') }}
- </v-btn>
- </v-col>
- <v-col
- v-if="!newPlace"
- cols="12" sm="6" class="d-flex justify-center mb-2">
- <v-btn
- prepend-icon="fa-solid fa-plus"
- @click="onAddPlaceClick(proxyEntity)"
- >
- {{ $t('add_place') }}
- </v-btn>
- </v-col>
- </v-row>
- <UiInputText
- v-model="proxyEntity.placeName"
- :readonly="!newPlace && !editPlace"
- field="placeName"
- />
- <UiInputText
- v-model="proxyEntity.streetAddress"
- :readonly="!newPlace && !editPlace"
- field="streetAddress"
- />
- <UiInputText
- v-model="proxyEntity.streetAddressSecond"
- :readonly="!newPlace && !editPlace"
- field="streetAddressSecond"
- />
- <UiInputText
- v-model="proxyEntity.streetAddressThird"
- :readonly="!newPlace && !editPlace"
- field="streetAddressThird"
- />
- <UiInputText
- v-model="proxyEntity.postalCode"
- :readonly="!newPlace && !editPlace"
- field="postalCode"
- />
- <UiInputText
- v-model="proxyEntity.addressCity"
- :readonly="!newPlace && !editPlace"
- field="addressCity"
- />
- <UiInputAutocompleteApiResources
- v-model="proxyEntity.addressCountry"
- :readonly="!newPlace && !editPlace"
- field="addressCountry"
- :model="Country"
- list-value="id"
- list-label="name"
- />
- <client-only>
- <UiMapLeaflet
- v-model:latitude="proxyEntity.latitude"
- v-model:longitude="proxyEntity.longitude"
- :readonly="!newPlace && !editPlace"
- :street-address="proxyEntity.streetAddress"
- :street-address-second="proxyEntity.streetAddressSecond"
- :street-address-third="proxyEntity.streetAddressThird"
- :postal-code="proxyEntity.postalCode"
- :address-city="proxyEntity.addressCity"
- :address-country-id="proxyEntity.addressCountry"
- :search-button="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="proxyEntity.url" field="url" :rules="getAsserts('url')" />
- <UiInputAutocompleteEnum
- v-model="proxyEntity.pricing"
- enum-name="pricing_event"
- field="pricing"
- />
- <UiInputText
- v-if="proxyEntity.pricing === 'PAID'"
- v-model="proxyEntity.urlTicket"
- :rules="getAsserts('urlTicket')"
- field="urlTicket"
- />
- <UiInputNumber
- v-if="proxyEntity.pricing === 'PAID'"
- v-model="proxyEntity.priceMini"
- field="priceMini"
- :rules="getAsserts('priceMini')"
- />
- <UiInputNumber
- v-if="proxyEntity.pricing === 'PAID'"
- v-model="proxyEntity.priceMaxi"
- field="priceMaxi"
- :rules="getAsserts('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>
- <br />
- <p>
- {{ $t('are_you_sure_to_process') }}
- </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)
- const emit = defineEmits(['update:entity'])
- // Pour éviter l'erreur eslint "Unexpected mutation of "modelValue" prop"
- const proxyEntity = computed({
- get: () => props.entity,
- set: (value) => emit('update:entity', value),
- })
- /**
- * 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)) {
- const dateTimeEnd = new Date(dateTime);
- // Ajouter 1h
- dateTimeEnd.setHours(dateTimeEnd.getHours() + 1);
- entity.datetimeEnd = DateUtils.toIsoUtcOffset(dateTimeEnd)
- }
- entity.datetimeStart = dateTime
- emit('update:entity', entity)
- }
- /**
- * 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)) {
- const dateTimeStart = new Date(dateTime);
- // Retirer 1h
- dateTimeStart.setHours(dateTimeStart.getHours() - 1);
- entity.datetimeStart = DateUtils.toIsoUtcOffset(dateTimeStart)
- }
- entity.datetimeEnd = dateTime
- emit('update:entity', entity)
- }
- const showAlert: Ref<boolean> = ref(false)
- const newPlace: Ref<boolean> = ref(false)
- const editPlace: Ref<boolean> = ref(false)
- /**
- * Si on clique 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)
- }
- const onCancelPlaceClick = function (entity: Event) {
- newPlace.value = false
- entity.place = null
- resetPlace(entity)
- }
- /**
- * Quand on clique 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 met à 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 à null le formulaire de l'adresse
- resetPlace(entity)
- }
- emit('update:entity', 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 (import.meta.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>
|