const PlanningList = { template: `
`, i18n: { messages: { en: { comp: { countTitle: "{count} dates", maxWarning: "The maximum number of dates was loaded. Shorten the time period or refine the search for better results.", today: "Today", day: "Day", week: "Week", month: "Month", filter: "Filter", externalCalTitle: "External Calendars", externalCalAddUrl: "Add link to iCal calendar", }, }, de: { comp: { countTitle: "{count} Termine", maxWarning: "Es wurde die maximale Anzahl an Terminen geladen. Verkürze den Zeitraum oder verfeinere die Suche für bessere Ergebnisse.", today: "Heute", day: "Tag", week: "Woche", month: "Monat", filter: "Filter", externalCalTitle: "Externe Kalender", externalCalAddUrl: "Link zu iCal-Kalendar hinzufügen", }, }, }, }, data: () => ({ focus: '', type: 'month', title: "", countTitle: "", events: [], selectedEvent: null, selectedElement: null, selectedOpen: false, isLoading: false, maxDates: 200, warning: null, externalMenu: false, externalNewUrl: "", externalEvents: [], externalCals: [], }), computed: { allEvents() { return [...this.events,...this.externalEvents]; }, externalCalMenuVisible() { return this.externalCals.length > 0; }, }, mounted () { this.externalCals = this.$root.externalCals; this.$refs.calendar.checkChange(); }, methods: { parameterChanged() { if (this.$refs.calendar) { this.loadEvents(); } }, calendarChanged({ start, end }) { $('#date_from').val(start.date); $('#date_to').val(end.date); this.load(); }, load() { this.loadEvents(); this.loadExternalCalendars(); }, loadEvents(page = 1) { $('#page').val(page); this.title = this.$refs.calendar.title; if (page == 1) { this.events = []; this.warning = null; this.countTitle = ""; } const vm = this; axios .get(`/api/v1/event-dates/search?` + $("#filter_form").serialize(), { withCredentials: true, handleLoading: this.handleLoading, }) .then((response) => { for (const date of response.data.items) { vm.events.push({ name: date.event.name, start: moment(date.start).toDate(), end: date.end != null ? moment(date.end).toDate() : null, timed: !date.allday, date: date, color: vm.$root.event_has_status_info(date.event) ? '#17a2b8' : '#007bff' }); } const count = vm.events.length; vm.countTitle = vm.$t('comp.countTitle', { count: count }); vm.scrollToMinTime(); if (count >= vm.maxDates) { vm.warning = vm.$t('comp.maxWarning'); return; } if (response.data.has_next) { vm.loadEvents(response.data.next_num); } }); }, loadExternalCalendars() { this.externalEvents = []; this.externalCals.forEach(externalCal => { if (externalCal.active) { this.loadExternalCalendar(externalCal); } }); }, loadExternalCalendar(externalCal) { var bodyFormData = new FormData(); bodyFormData.append('date_from', $('#date_from').val()); bodyFormData.append('date_to', $('#date_to').val()); bodyFormData.append('url', externalCal.url); const vm = this; axios .post(`/js/icalevents`, bodyFormData, { withCredentials: true, }) .then((response) => { for (const item of response.data.items) { vm.externalEvents.push({ name: item.name, start: moment(item.start).toDate(), end: item.end != null ? moment(item.end).toDate() : null, timed: !item.allday, date: item, color: '#aa7bff' }); } }); }, viewDay ({ date }) { this.focus = date; this.type = 'day'; }, setToday () { this.focus = '' }, openFilter () { $('#filterFormModal').modal('show'); }, getEventColor (event) { return event.color; }, scrollToMinTime() { if (!this.$refs.calendar) { return; } if (this.$refs.calendar.type == 'month') { return; } if (this.events.length < 1) { return; } const min_event = this.events.reduce(function(prev, curr) { return prev.start.getHours() < curr.start.getHours() ? prev : curr; }); this.$refs.calendar.scrollToTime({ hour: min_event.start.getHours(), minute: 0 }); }, showEvent ({ nativeEvent, event }) { const open = () => { this.selectedEvent = event this.selectedElement = nativeEvent.target requestAnimationFrame(() => requestAnimationFrame(() => this.selectedOpen = true)) } if (this.selectedOpen) { this.selectedOpen = false requestAnimationFrame(() => requestAnimationFrame(() => open())) } else { open() } nativeEvent.stopPropagation() }, openEventDate(date) { const url = `${axios.defaults.baseURL}/eventdate/${date.id}`; window.open(url); }, handleLoading(isLoading) { this.isLoading = isLoading; }, addExternalUrl() { this.externalCals.push({ title: this.externalNewUrl, url: this.externalNewUrl, active: true, }); this.externalNewUrl = ""; }, closeExternalMenu() { this.externalMenu = false; this.loadExternalCalendars(); } }, };