All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.vertigo.ui.static.planning.js.vertigo-planning.js Maven / Gradle / Ivy

The newest version!
VUiExtensions.methods.fromCalendarTime = function(date) {
    //return date.day+'/'+date.month+'/'+date.year+' '+date.hour+':'+date.minute;
    //2022-01-23T22:22:39.124Z
    ;
    return date.date + 'T' + date.time + ':00.000Z';
}

//var PARSE_REGEX = /^(\d{1,2})\/(\d{1,2})\/(\d{4})?([^\d]+(\d{1,2}))?(:(\d{1,2}))?(:(\d{1,2}))?(.(\d{1,3}))?$/;
//var PARSE_REGEX = /^(\d{1,4})-(\d{1,2})-(\d{2})?([^\d]+(\d{1,2}))?(:(\d{1,2}))?(:(\d{1,2}))?(.(\d{1,3}))Z?$/;
var PARSE_REGEX_ISO = /^(\d{1,4})-(\d{1,2})-(\d{2})$/;
var PARSE_REGEX_FMT = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/;
VUiExtensions.methods.toCalendarDate = function(vDate, minutesOfDay) {
    if(!vDate) return null;
    if(vDate.includes('-')) {
        return this.toCalendarDateIso(vDate, minutesOfDay);
    }
    return this.toCalendarDateFmt(vDate, minutesOfDay);
}
VUiExtensions.methods.toCalendarDateIso = function(vDate, minutesOfDay) {
    
    // YYYY-MM-DD hh:mm
    var parts = PARSE_REGEX_ISO.exec(vDate);
    if (!parts) { return null }

    return {
        date: parts[1] + '-' + parts[2] + '-' + parts[3],
        time: Math.floor(minutesOfDay/60) + ':' + minutesOfDay%60,
        year: parseInt(parts[1], 10),
        month: parseInt(parts[2], 10),
        day: parseInt(parts[3], 10) || 1,
        hour: Math.floor(minutesOfDay/60) || 0,
        minute: minutesOfDay%60 || 0,
        weekday: 0,
        doy: 0,
        workweek: 0,
        hasDay: true,
        hasTime: !!(minutesOfDay),
        past: false,
        current: false,
        future: false,
        disabled: false
    }
}

VUiExtensions.methods.toCalendarDateFmt= function(vDate, minutesOfDay) {
    // DD/MM/YYYY hh:mm
    var parts = PARSE_REGEX_FMT.exec(vDate);
    if (!parts) { return null }

    return {
        date: parts[3] + '-' + parts[2] + '-' + parts[1],
        time: Math.floor(minutesOfDay/60) + ':' + minutesOfDay%60,
        year: parseInt(parts[3], 10),
        month: parseInt(parts[2], 10),
        day: parseInt(parts[1], 10) || 1,
        hour: Math.floor(minutesOfDay/60) || 0,
        minute: minutesOfDay%60 || 0,
        weekday: 0,
        doy: 0,
        workweek: 0,
        hasDay: true,
        hasTime: !!(minutesOfDay),
        past: false,
        current: false,
        future: false,
        disabled: false
    }
}

VUiExtensions.methods.isCssColor = function(color) {
    return !!color && !!color.match(/^(#|(rgb|hsl)a?\()/)
};

VUiExtensions.methods.plageStateColor = function(event) {
   return (event.nbNonPublie>0?{class:"trh-nonPublie", label:"Non publié", miniLabel:"NP"} 
    : event.nbPlanifie>0?{class:"trh-planifie", label:"Planifie", miniLabel:"Pl"}
    : event.nbPublie>0 ? {class:"trh-publie", label:"Publié", miniLabel:"Pu"} 
	: {class:"trh-none", label:"none", miniLabel:"No"});
};

VUiExtensions.methods.badgeClasses = function(event, type) {
    const cssColor = this.isCssColor(event.bgcolor);
    const plageState = this.plageStateColor(event);
    const isHeader = type === 'header'
    return {
        [`bg-${plageState.class}`]: !cssColor,
        'full-width': !isHeader && (!event.side || event.side === 'full'),
        'left-side': !isHeader && event.side === 'left',
        'right-side': !isHeader && event.side === 'right'
    }
};

VUiExtensions.methods.badgeStyles = function(event, type, timeStartPos, timeDurationHeight) {
    const s = {}
    if (this.isCssColor(event.bgcolor)) {
        s['background-color'] = event.bgcolor
        s.color = luminosity(event.bgcolor) > 0.5 ? 'black' : 'white'
    }
    if (timeStartPos) {
        s.top = timeStartPos(event.eventCalendar.time,false) + 'px'
    }
    if (timeDurationHeight) {
        let endMinuteOfDay = event.eventEndCalendar.hour*60+event.eventEndCalendar.minute;
        let startMinuteOfDay = event.eventCalendar.hour*60+event.eventCalendar.minute;
        s.height = (timeDurationHeight(endMinuteOfDay - startMinuteOfDay) - 3) + 'px'
    }
    //s['align-items'] = 'flex-start'
    return s
};

VUiExtensions.methods.intervalStart = function(allEvents) {
    var minTime = (7*60+30); //7h30
    for (let i = 0; i < allEvents.length; ++i) {
        minTime = Math.min(minTime, allEvents[i].minutesDebut);
    }
    return minTime/30; //30min per interval 
}

VUiExtensions.methods.intervalCount = function(allEvents) {
    var maxTime = (18*60+30); //18h30
    for (let i = 0; i < allEvents.length; ++i) {
        maxTime = Math.max(maxTime, allEvents[i].minutesFin);
    }
    var maxInterval = maxTime/30; //30min per interval 
    var minInterval = this.intervalStart(allEvents); 
    return maxInterval-minInterval; //18h30 - 7h30
}

VUiExtensions.methods.getEvents = function(dt, allEvents) {
    const currentDate = QCalendarDay.parsed(dt);
    const selectedEvents = [];

    allEvents.forEach(event => {
        let added = false;
        const eventCalendar = this.toCalendarDate(event.dateLocale, event.minutesDebut);
        const eventEndCalendar = this.toCalendarDate(event.dateLocale, event.minutesFin);
		// Création d'une copie propre de l'événement sans modifier l'objet original
        const eventCopy = { ...event, eventCalendar, eventEndCalendar };

	    if (eventCalendar.date === dt) {
            if (eventCalendar.time) {
				const start1 = QCalendarDay.parsed(eventCalendar.date + ' ' + eventCalendar.time);
				const end1 = QCalendarDay.parsed(eventEndCalendar.date + ' ' + eventEndCalendar.time);				                        
				const overlappingEvents = selectedEvents.filter(selectedEvent => {
                    if (selectedEvent.eventCalendar.time) {
                        const start2 = QCalendarDay.parsed(selectedEvent.eventCalendar.date + ' ' + selectedEvent.eventCalendar.time);
                        const end2 = QCalendarDay.parsed(selectedEvent.eventEndCalendar.date + ' ' + selectedEvent.eventEndCalendar.time);

                        return start1.date != end2.date && start2.date != end1.date && (
                            QCalendarDay.isBetweenDates(start1, start2, end2, true) ||
                            QCalendarDay.isBetweenDates(end1, start2, end2, true)
                        );
                    }
                    return false;
                });
										
				if (overlappingEvents.length > 0) {
											              
						// Fusionner les événements chevauchants
						const minEvent = [eventCopy, ...overlappingEvents].reduce((minEvt, evt) => 
							evt.minutesDebut < minEvt.minutesDebut ? evt : minEvt);
						const maxEvent = [eventCopy, ...overlappingEvents].reduce((maxEvt, evt) => 
							evt.minutesFin > maxEvt.minutesFin ? evt : maxEvt);
						
						// Agréger les valeurs numériques 
		                const nbNonPublieSum = overlappingEvents.reduce((sum, evt) => sum + evt.nbNonPublie, event.nbNonPublie);
		                const nbPlanifieSum = overlappingEvents.reduce((sum, evt) => sum + evt.nbPlanifie, event.nbPlanifie);
		                const nbPublieSum = overlappingEvents.reduce((sum, evt) => sum + evt.nbPublie, event.nbPublie);
		                const nbReserveSum = overlappingEvents.reduce((sum, evt) => sum + evt.nbReserve, event.nbReserve);
		                const nbReserveNonPublieSum = overlappingEvents.reduce((sum, evt) => sum + evt.nbReserveNonPublie, event.nbReserveNonPublie);
		                const nbTotalSum = overlappingEvents.reduce((sum, evt) => sum + evt.nbTotal, event.nbTotal);
						
						// Créer la liste des événements fusionnés (contenant tous les événements individuels)
						const eventList = [eventCopy, ...overlappingEvents].map(evt => evt.eventList || [evt]).flat();
						// Fusionner les listes d'événements sans doublons
	                    const uniqueEventList = eventList.filter((value, index, array) => array.indexOf(value) === index);
															
		                // Ajouter l'événement fusionné
		                selectedEvents.push({
		                    ...eventCopy,
							eventCalendar: minEvent.eventCalendar,
		                    eventEndCalendar: maxEvent.eventEndCalendar,
		                    minutesDebut: minEvent.minutesDebut,  // Conserver minutesDebut du premier
							minutesDebut_fmt: minEvent.minutesDebut_fmt,  // Conserver minutesDebut_fmt du plus petit
							minutesFin: maxEvent.minutesFin,  // Conserver minutesFin du dernier
							minutesFin_fmt: maxEvent.minutesFin_fmt,  // Conserver minutesFin_fmt du dernier
		                    nbNonPublie: nbNonPublieSum,
		                    nbPlanifie: nbPlanifieSum,
		                    nbPublie: nbPublieSum,
		                    nbReserve: nbReserveSum,
		                    nbReserveNonPublie: nbReserveNonPublieSum,
		                    nbTotal: nbTotalSum,
		                    ageId: minEvent.ageId,
		                    plhId: minEvent.plhId,
		                    eventList: uniqueEventList
		                });

		                // Retirer les événements individuels fusionnés
		                overlappingEvents.forEach(overlappingEvent => {
		                    const index = selectedEvents.indexOf(overlappingEvent);
		                    if (index !== -1) {
		                        selectedEvents.splice(index, 1);
		                    }
		                });
		            } else {
		                selectedEvents.push({ ...eventCopy, eventCalendar, eventEndCalendar });
		            }
				}
        } else if (eventCalendar.days) {
            const startDate = QCalendarDay.parsed(eventCalendar.date);
            const endDate = QCalendarDay.addToDate(startDate, { day: eventCalendar.days });
            if (QCalendarDay.isBetweenDates(currentDate, startDate, endDate)) {
                selectedEvents.push({ ...eventCopy, eventCalendar, eventEndCalendar });
            }
        }
    });

    return selectedEvents;
};

// Week-Agenda
VUiExtensions.methods.getNameAsTwoLetters = function (name) {
  if (!name || typeof name !== 'string') return ''; // Si le nom est invalide, retourner une chaîne vide
  // Nettoyage du nom : supprime les mots entre parenthèses, normalise les espaces autour des tirets,
    // et retire tout ce qui n'est pas une lettre ou un chiffre.
    name = name
      .replace(/\(.*\)/g, ' ') // Supprime les mots entre parenthèses
      .replace(/\s*-\s*/g, '-') // Normalise les espaces autour des tirets
      .replace(/[^a-zA-Z0-9\s-]+/g, '') // Retire tout ce qui n'est pas lettre, chiffre, espace ou tiret
      .trim(); // Supprime les espaces en début et fin de chaîne
  
  if (!name) return ''; // Si le nom est vide après nettoyage
  // Nettoyer et séparer le nom par le séparateur principal
  const parts = name.split(/\s+/);
  if (parts.length > 1) {
      // Si le nom est composé de plusieurs mots, on prend les initiales du premier et du dernier mot
      return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();
  }
  if (name.includes('-')) { // Si le nom est unique, on vérifie s'il contient un tiret
	// Si le nom contient un tiret, séparer par les tirets
	const subParts = name.split('-');
    return (subParts[0][0] + subParts[subParts.length - 1][0]).toUpperCase();
  }
  // Si c'est un seul mot, prendre les deux premières lettres, la deuxième en minuscule
  return name.slice(0, 1).toUpperCase() + name.slice(1, 2).toLowerCase();   
}

VUiExtensions.methods.formatMinutes= function(minutes) {
            let min = '' + minutes % 60;
            let heure = '' + (minutes - min) / 60
            return heure.padStart(2, '0') + ':' + min.padStart(2, '0')
        }
VUiExtensions.methods.searchDefaultPlageHoraireForm = function(dateLocale, weekday, minutesOfDay) {            
            for (var defaultPlageIdx in this.$data.vueData.defaultPlageHoraire) {
               let defaultPlage = this.$data.vueData.defaultPlageHoraire[defaultPlageIdx];
               if(defaultPlage.jourDeSemaine === weekday 
                    && defaultPlage.minutesDebut <= minutesOfDay 
                    && defaultPlage.minutesFin >= minutesOfDay) {
                    return { 
                            'dateLocale' : dateLocale,
                            'minutesDebut' : this.formatMinutes(defaultPlage.minutesDebut),
                            'minutesFin' : this.formatMinutes(defaultPlage.minutesFin),
                            'nbGuichet' : defaultPlage.nbGuichet,
                            };
               }
            }
            return;
        }    
VUiExtensions.methods.onCreatePlageHoraireDefault = function() {
            var plageHoraireForm = this.$data.vueData.creationPlageHoraireForm;
            let dateTime = this.toCalendarDate(this.$data.vueData.agendaRange.firstDate,0);
            let day = '' + dateTime.day;
            let month = '' + dateTime.month;
            plageHoraireForm.dateLocale = day.padStart(2, '0')+'/'+month.padStart(2, '0')+'/'+dateTime.year
            
            var defaultPlage = this.$data.vueData.defaultPlageHoraire[0];
            plageHoraireForm.minutesDebut = this.formatMinutes(defaultPlage.minutesDebut);
            plageHoraireForm.minutesFin = this.formatMinutes(defaultPlage.minutesFin);
            plageHoraireForm.nbGuichet = defaultPlage.nbGuichet;
            this.$data.componentStates.createItemModal.opened = true;
        }
VUiExtensions.methods.onCreatePlageHoraireDateTime = function(data) {
                let dateTime = data.scope.timestamp;
                let day = '' + dateTime.day;
                let month = '' + dateTime.month;
                let minutesOfDay = dateTime.hour*60+dateTime.minute;
                
                var plageHoraireForm = this.$data.vueData.creationPlageHoraireForm;
                plageHoraireForm.dateLocale = day.padStart(2, '0')+'/'+month.padStart(2, '0')+'/'+dateTime.year
                if(plageHoraireForm.ageId < 0) {
                    plageHoraireForm.ageId = null;
                }
                let dureeCreneau = plageHoraireForm.dureeCreneau;
                dureeCreneau = dureeCreneau?dureeCreneau:5; //if not set default to 5
                var mod = minutesOfDay % dureeCreneau;
                minutesOfDay += mod < (dureeCreneau+1)/2 ? -mod : (dureeCreneau-mod);
                
                var defaultPlage = this.searchDefaultPlageHoraireForm(plageHoraireForm.dateLocale, dateTime.weekday, minutesOfDay);
                if(defaultPlage) {
                    plageHoraireForm.minutesDebut = defaultPlage.minutesDebut;
                    plageHoraireForm.minutesFin = defaultPlage.minutesFin;
                    plageHoraireForm.nbGuichet = defaultPlage.nbGuichet;
                } else {
                    plageHoraireForm.minutesDebut = this.formatMinutes(minutesOfDay)
                    plageHoraireForm.minutesFin = this.formatMinutes(minutesOfDay+240)
                    plageHoraireForm.nbGuichet = 1;            
                }
                this.$data.componentStates.createItemModal.opened = true;
        } 
VUiExtensions.methods.onPublishPlageHoraires = function() {
                this.$data.vueData.publicationTrancheHoraireForm.publicationMinutesDebut = this.$data.vueData.publicationTrancheHoraireForm.publicationMinutesDebut_fmt;
                this.$data.componentStates.publishItemModal.opened = true;
        }
VUiExtensions.methods.doPublishPlageHoraires = function() {
            let formFull = this.$data.vueData.publicationTrancheHoraireForm;
            let formData = {
                'vContext[publicationTrancheHoraireForm][publishNow]': this.$data.componentStates.publishItemModal.selectedTab==='publie',
                'vContext[publicationTrancheHoraireForm][dateLocaleDebut]': formFull.dateLocaleDebut,
                'vContext[publicationTrancheHoraireForm][dateLocaleFin]': formFull.dateLocaleFin,
                'vContext[publicationTrancheHoraireForm][publicationDateLocale]': formFull.publicationDateLocale,
                'vContext[publicationTrancheHoraireForm][publicationMinutesDebut]': formFull.publicationMinutesDebut,
            };
            this.httpPostAjax('_publishPlage', formData, {
                 onSuccess: function() {
                    this.$q.notify({message: 'Publication effectuée', type :'positive'});
                    this.$data.componentStates.publishItemModal.opened = false
                }.bind(this)
            });
        } 
VUiExtensions.methods.onDuplicateWeek= function() {
                this.httpPostAjax('_prepareDuplicateSemaine', {}, {
                 onSuccess: function() {
                    this.$data.componentStates.duplicateWeekModal.opened = true;
                }.bind(this)
            })
        }
VUiExtensions.methods.doDuplicateWeek = function() {
            let formData = this.vueDataParams(['duplicationSemaineForm']);
            this.httpPostAjax('_duplicateSemaine', formData, {
                 onSuccess: function() {
                    this.$q.notify({message: 'Duplication effectuée', type :'positive'});
                    this.$data.componentStates.duplicateWeekModal.opened = false
                }.bind(this)
            });
        } 
VUiExtensions.methods.createPlageHoraire = function(modeGuichet) {
            let formData = this.vueDataParams(['creationPlageHoraireForm']);
            if(modeGuichet) {
                formData.delete('vContext[creationPlageHoraireForm][nbGuichet]');
            }
            formData.delete('vContext[creationPlageHoraireForm][dureeCreneau]');
            this.httpPostAjax('_createPlage', formData, {
                 onSuccess: function() {
                    this.$q.notify({message: 'Plage horaire créée', type :'positive'});
                    this.$data.componentStates.createItemModal.opened = false
                }.bind(this)
            });
        }
VUiExtensions.methods.createPlageHoraireGuichet = function() {
            createPlageHoraire(true);
        }
VUiExtensions.methods.confirmDeletePlageHoraire = function(event) {
            this.$data.componentStates.editedPlageHoraire = event;
            this.$data.componentStates.confirmDeleteItemModal.opened = true;
        }
VUiExtensions.methods.deletePlageHoraire = function(plhId) {
            this.httpPostAjax('_deletePlage', {plhId: plhId}, {
                 onSuccess: function() {
                    this.$q.notify({message: 'Plage horaire supprimée', type :'positive'});
                    this.$data.componentStates.confirmDeleteItemModal.opened = false;
                }.bind(this)
            });
        }
VUiExtensions.methods.onSelectPlageHoraire = function(event) {
            this.$data.componentStates.editedPlageHoraire = event;
            this.httpPostAjax('_loadPlageHoraireDetail', {plhId: event.plhId}, {
                 onSuccess: function() {
                     this.$data.componentStates.trancheHorairesList.pagination.rowsNumber = this.$data.vueData.trancheHoraires.length;
                     this.$data.componentStates.viewItemDrawer.opened = true;
                }.bind(this)
            })
        }
        
window.addEventListener('vui-before-plugins', function(event) {
		event.detail.vuiAppInstance.component("QCalendarDay", QCalendarDay.QCalendarDay);
	}
)




© 2015 - 2025 Weber Informatics LLC | Privacy Policy