From 78a735f27794133be7d30c923b12d55e6c600097 Mon Sep 17 00:00:00 2001 From: chfhtw Date: Wed, 16 Jul 2025 13:52:45 +0200 Subject: [PATCH] Event popup inside calendar component --- public/js/components/Calendar/Base.js | 31 +++++++++++++++++-- public/js/components/Calendar/Mode/Day.js | 10 ++++-- .../js/components/Calendar/Mode/Day/View.js | 29 +++++++++++++++-- public/js/components/Calendar/Mode/Month.js | 7 +++-- public/js/components/Calendar/Mode/Week.js | 7 +++-- 5 files changed, 72 insertions(+), 12 deletions(-) diff --git a/public/js/components/Calendar/Base.js b/public/js/components/Calendar/Base.js index 816027ade..298b9857e 100644 --- a/public/js/components/Calendar/Base.js +++ b/public/js/components/Calendar/Base.js @@ -1,6 +1,7 @@ import BaseDraganddrop from './Base/DragAndDrop.js'; import BaseHeader from './Base/Header.js'; import BaseSlider from './Base/Slider.js'; +import BsModal from '../Bootstrap/Modal.js'; import CalClick from '../../directives/Calendar/Click.js'; @@ -16,7 +17,8 @@ export default { components: { BaseDraganddrop, BaseHeader, - BaseSlider + BaseSlider, + BsModal }, directives: { CalClick @@ -119,7 +121,8 @@ export default { data() { return { internalView: null, - internalDate: null + internalDate: null, + modalEvent: null }; }, computed: { @@ -231,6 +234,20 @@ export default { }, onDropItem(evt, start, end) { this.$emit('drop', evt, start, end); + }, + showEventModal(eventObj) { + this.modalEvent = eventObj; + this.$refs.modal.show(); + }, + hideEventModal() { + if (this.modalEvent) + this.modalEvent.closeFn = undefined; + this.$refs.modal.hide(); + this.modalEvent = null; + }, + onModalHidden() { + if (this.modalEvent.closeFn) + this.modalEvent.closeFn(); } }, template: /* html */` @@ -262,11 +279,21 @@ export default { ref="mode" v-model:current-date="cDate" @update:range="$emit('update:range', $event)" + @request-modal-open="showEventModal" + @request-modal-close="hideEventModal" v-bind="modeOptions ? modeOptions[cMode] : null || {}" > + + + + ` } diff --git a/public/js/components/Calendar/Mode/Day.js b/public/js/components/Calendar/Mode/Day.js index d954f7b51..bc0896888 100644 --- a/public/js/components/Calendar/Mode/Day.js +++ b/public/js/components/Calendar/Mode/Day.js @@ -16,7 +16,9 @@ export default { emits: [ "update:currentDate", "update:range", - "click" + "click", + "requestModalOpen", + "requestModalClose" ], data() { return { @@ -80,7 +82,11 @@ export default { class="fhc-calendar-mode-day flex-grow-1 position-relative" > - + diff --git a/public/js/components/Calendar/Mode/Day/View.js b/public/js/components/Calendar/Mode/Day/View.js index 72b0baa99..8371405d3 100644 --- a/public/js/components/Calendar/Mode/Day/View.js +++ b/public/js/components/Calendar/Mode/Day/View.js @@ -21,8 +21,13 @@ export default { required: true }, emptyMessage: String, - emptyMessageDetails: String + emptyMessageDetails: String, + compact: Boolean }, + emits: [ + "requestModalOpen", + "requestModalClose" + ], data() { return { chosenEvent: null, @@ -63,10 +68,30 @@ export default { return null; // null => loading } }, + watch: { + compact() { + if (this.compact) { + if (this.chosenEvent) { + this.$emit('requestModalOpen', { + event: this.chosenEvent, + closeFn: () => { this.chosenEvent = null; } + }); + } + } else { + this.$emit('requestModalClose'); + } + } + }, methods: { handleClickDefaults(evt) { if (evt.detail.source == 'event') { this.chosenEvent = evt.detail.value; + if (this.compact) { + this.$emit('requestModalOpen', { + event: this.chosenEvent, + closeFn: () => { this.chosenEvent = null; } + }); + } } } }, @@ -110,7 +135,7 @@ export default { {{ emptyMessage }} -
+