Kalender Updates

* Vorlagen können nun erstellt und editiert werden.
* neue Migration für CalendarTemplates
This commit is contained in:
Daniel Spitzer
2025-01-14 18:54:18 +01:00
parent 2099f28a58
commit 7c0c585b91
9 changed files with 790 additions and 134 deletions
+144 -131
View File
@@ -2,6 +2,7 @@ var hidesearch = [2, 3, 4, 8];
var columnfilter = [7];
var columnoptions = '<option value=""></option><option value="Offen">Offen</option><option value="Genehmigt">Genehmigt</option><option value="Abgelehnt">Abgelehnt</option>';
const fileTypeClasses = {
'image/png': 'fa-file-png',
'image/jpeg': 'fa-file-jpg',
@@ -28,8 +29,8 @@ const fileTypeClasses = {
// Weitere Typen und Klassen hinzufügen...
};
var calendar;
var calendarEl = document.getElementById('calendar');
let calendar;
let calendarEl = document.getElementById('calendar');
calendarRights = JSON.parse(calendarRights);
function formatFileSize(bytes) {
@@ -76,16 +77,16 @@ document.addEventListener('DOMContentLoaded', function () {
}, 'json').done(function (json) {
if (json.success == true) {
var userevents = [];
var otherevents = [];
var resources = [];
var category = "";
var rights = false;
var movable = false;
var resourceCounter = 0;
var rrule = null;
var duration = null;
var rruleflag = false;
let userevents = [];
let otherevents = [];
let resources = [];
let category = "";
let rights = false;
let movable = false;
let resourceCounter = 0;
let rrule = null;
let duration = null;
let rruleflag = false;
let allDAy;
let cursorclass = "";
$.each($('.calendar-check'), function (index, value) {
@@ -445,21 +446,20 @@ document.addEventListener('DOMContentLoaded', function () {
minute: '2-digit',
second: '2-digit',
});
var typeText;
let typeText;
if (obj.customer_info_type == 1) {
typeText = 'E-Mail';
} else if (obj.customer_info_type == 2) {
typeText = 'SMS';
}
var title = `<div class="text-center font-weight-500">Letzte gesendete Info (` + typeText + `):</div>
let title = `<div class="text-center font-weight-500">Letzte gesendete Info (` + typeText + `):</div>
<div class="text-left">` + obj.customer_info_text.replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1<br />$2') + `</div>
<div class="text-left"><span class="font-weight-500">gesendet an:</span> ` + obj.customer_info_type_text + `</div>
<div class="text-left"><span class="font-weight-500">gesendet von:</span> ` + obj.sendby + `</div>
<div class="text-left"><span class="font-weight-500">gesendet am:</span> ` + germanDateTime + `</div>
`;
console.log(title);
var tooltip = new Tooltip($('.customer-info-point'), {
let tooltip = new Tooltip($('.customer-info-point'), {
title: title,
placement: 'right',
trigger: 'hover',
@@ -505,7 +505,7 @@ document.addEventListener('DOMContentLoaded', function () {
let attendees = JSON.parse(data.data.attendees.attendees);
$.each(attendees, function (index, value) {
if (!Number.isInteger(value)) {
var valueExists = $("#calendar-attendees option").filter(function () {
let valueExists = $("#calendar-attendees option").filter(function () {
return $(this).val() === value;
}).length > 0;
if (!valueExists) {
@@ -599,10 +599,10 @@ document.addEventListener('DOMContentLoaded', function () {
}
},
eventDidMount: function (info) {
var eventstart = new Date(info.event.startStr);
var eventend = new Date(info.event.endStr);
let eventstart = new Date(info.event.startStr);
let eventend = new Date(info.event.endStr);
var title;
let title;
if (!info.event.allDay) {
eventstart = String(eventstart.getUTCHours()).padStart(2, '0') + ':' + String(eventstart.getUTCMinutes()).padStart(2, '0');
eventend = String(eventend.getUTCHours()).padStart(2, '0') + ':' + String(eventend.getUTCMinutes()).padStart(2, '0');
@@ -628,7 +628,7 @@ document.addEventListener('DOMContentLoaded', function () {
const obj = JSON.parse(info.event.extendedProps['attachments']);
let docs = "";
$.each(obj, function (index, value) {
var filename;
let filename;
if (fileTypeClasses[value.contentType]) {
filename = fileTypeClasses[value.contentType];
} else {
@@ -666,7 +666,7 @@ document.addEventListener('DOMContentLoaded', function () {
}
var tooltip = new Tooltip(info.el, {
let tooltip = new Tooltip(info.el, {
title: title,
placement: 'right',
delay: {hide: 50},
@@ -675,25 +675,25 @@ document.addEventListener('DOMContentLoaded', function () {
html: true,
});
var tooltips = info.event.extendedProps['tooltips'] || [];
let tooltips = info.event.extendedProps['tooltips'] || [];
tooltips.push(tooltip);
info.event.setExtendedProp('tooltips', tooltips);
},
eventWillUnmount: function (info) {
for (var tooltip of info.event.extendedProps['tooltips']) {
for (let tooltip of info.event.extendedProps['tooltips']) {
tooltip.dispose();
}
},
eventResize: function (info) {
var start = info.event.start.getTime();
let start = info.event.start.getTime();
const offsetstart = getOffset(start);
start = (start / 1000 + offsetstart) * 1000;
var end = info.event.end.getTime();
let end = info.event.end.getTime();
const offsetend = getOffset(end);
end = (end / 1000 + offsetend) * 1000;
var id = info.event.id;
let id = info.event.id;
$.post(requestUpdateUrl, {
start: start,
end: end,
@@ -701,14 +701,14 @@ document.addEventListener('DOMContentLoaded', function () {
}, function (data) {
}).done(function (data) {
var tooltip = new Tooltip(info.el, {
let tooltip = new Tooltip(info.el, {
title: info.event.extendedProps.description,
placement: 'right',
trigger: 'hover',
container: 'body'
});
var tooltips = info.event.extendedProps['tooltips'] || [];
let tooltips = info.event.extendedProps['tooltips'] || [];
tooltips.push(tooltip);
info.event.setExtendedProp('tooltips', tooltips);
});
@@ -716,13 +716,13 @@ document.addEventListener('DOMContentLoaded', function () {
},
eventDrop: function (info) {
// sleep(2000).then(() => {
var start = info.event.start.getTime();
let start = info.event.start.getTime();
const offsetstart = getOffset(start);
start = (start / 1000 + offsetstart) * 1000;
var end = info.event.end.getTime();
let end = info.event.end.getTime();
const offsetend = getOffset(end);
end = (end / 1000 + offsetend) * 1000;
var id = info.event.id;
let id = info.event.id;
$.post(requestUpdateUrl, {
start: start,
end: end,
@@ -797,7 +797,7 @@ document.addEventListener('DOMContentLoaded', function () {
if (typeof (EventSource) !== 'undefined') {
console.info('Starting connection...');
var source = new EventSourcePolyfill(requestUpdateEventsUrl, {
let source = new EventSourcePolyfill(requestUpdateEventsUrl, {
// Specifying custom request headers
headers: {
'X-API-KEY': 'wcdqEHXcXl5f1sZTEHKPTutqpFBbRf55'
@@ -809,7 +809,7 @@ if (typeof (EventSource) !== 'undefined') {
}, false);
let jsondata;
source.addEventListener('error', function (e) {
var txt;
let txt;
switch (Event.target.readyState) {
// if reconnecting
case EventSource.CONNECTING:
@@ -839,12 +839,12 @@ if (typeof (EventSource) !== 'undefined') {
if (!visibleCalendars.includes(event.calendar_id)) {
return;
}
var cevent = calendar.getEventById(event.cal_events_id);
var rights = false;
var movable = false;
var rrule = null;
var duration = null;
var rruleflag = false;
let cevent = calendar.getEventById(event.cal_events_id);
let rights = false;
let movable = false;
let rrule = null;
let duration = null;
let rruleflag = false;
let cursorclass = '';
if (event.rrule) {
rrule = event.rrule;
@@ -937,7 +937,7 @@ if (typeof (EventSource) !== 'undefined') {
} else if (event.change_type == '1' || !cevent) {
if (event.calendar_id == event.calendar_id) {
var info = calendar.addEvent({
let info = calendar.addEvent({
id: event.cal_events_id,
title: event.name,
start: event.start_time,
@@ -964,7 +964,7 @@ if (typeof (EventSource) !== 'undefined') {
});
} else {
var info = calendar.addEvent({
let info = calendar.addEvent({
id: event.cal_events_id,
title: event.name,
start: event.start_time,
@@ -992,7 +992,7 @@ if (typeof (EventSource) !== 'undefined') {
}
calendar.render();
} else if (event.change_type == '3') {
var cevent = calendar.getEventById(event.cal_events_id);
let cevent = calendar.getEventById(event.cal_events_id);
cevent.remove();
}
@@ -1010,6 +1010,24 @@ $(document).ready(function () {
calendar.render();
});
$(document).on('show.bs.dropdown', '.dropdown', function () {
let previewMenue='';
$.getJSON(requestgetpreviewtUrl, {
event_type: $('#type').val()
}, function (data) {
}).done(function (data) {
;
let counter =1;
$.each(data.data, function(index, item) {
previewMenue += '<li><a class="dropdown-item text-template" data-text="' + item.data.text + '">' + item.data.name + '</a></li>';
counter++;
});
$('.dropdown-menu').html(previewMenue);
});
});
$('body').on('click', '.fa-window-restore', function () {
$('.card').removeClass('card-fullscreen');
$('#card-size').removeClass('fa-window-restore').addClass('fa-window-maximize');
@@ -1084,7 +1102,7 @@ $(document).ready(function () {
});
$('body').on('click', '#add-event', function () {
var valid = true;
let valid = true;
$('#EventModal .is-require').each(function (index, value) {
if ($(this).val() == "") {
@@ -1098,35 +1116,35 @@ $(document).ready(function () {
if (!valid) {
return;
}
var attachments = [];
let attachments = [];
$('.doc-main-div').each(function (index, value) {
if ($(this).data('docid')) {
attachments.push($(this).data('docid'));
}
});
var start = $('#start-date').val() + ' ' + $('#start-time').val();
var end = $('#end-date').val() + ' ' + $('#end-time').val();
var title = $('#name').val();
var location = $('#location').val();
var description = $('#description').val();
var newkey = $('#attachments').data('newkey');
var allday = 0;
var reminder = $('#reminder').val();
var type = $('#type').val();
var busy = $('#busy').val();
var customer;
var customer_info_check = 0;
var customer_info_text;
var customer_info_type;
var customer_info_type_text;
var customer_info_reminder_check = 0;
var private = $('.privacy-click');
var privateflag = 0;
let start = $('#start-date').val() + ' ' + $('#start-time').val();
let end = $('#end-date').val() + ' ' + $('#end-time').val();
let title = $('#name').val();
let location = $('#location').val();
let description = $('#description').val();
let newkey = $('#attachments').data('newkey');
let allday = 0;
let reminder = $('#reminder').val();
let type = $('#type').val();
let busy = $('#busy').val();
let customer;
let customer_info_check = 0;
let customer_info_text;
let customer_info_type;
let customer_info_type_text;
let customer_info_reminder_check = 0;
let private = $('.privacy-click');
let privateflag = 0;
if (private.hasClass('fa-lock')) {
privateflag = 1;
}
var users = [];
let users = [];
if ($('#allday').is(':checked')) {
allday = 1;
@@ -1178,7 +1196,7 @@ $(document).ready(function () {
$('body').on('click', '#update-event', function () {
var valid = true;
let valid = true;
$('#EventModal .is-require').each(function (index, value) {
if ($(this).val() == "") {
@@ -1192,35 +1210,35 @@ $(document).ready(function () {
if (!valid) {
return;
}
var attachments = [];
let attachments = [];
$('.doc-main-div').each(function (index, value) {
if ($(this).data('docid')) {
attachments.push($(this).data('docid'));
}
});
var start = $('#start-date').val() + ' ' + $('#start-time').val();
var end = $('#end-date').val() + ' ' + $('#end-time').val();
var title = $('#name').val();
var location = $('#location').val();
var description = $('#description').val();
var newkey = $('#attachments').data('newkey');
var allday = 0;
var reminder = $('#reminder').val();
var type = $('#type').val();
var busy = $('#busy').val();
var customer;
var customer_info_check = 0;
var customer_info_text;
var customer_info_type;
var customer_info_type_text;
var customer_info_reminder_check = 0;
var private = $('.privacy-click');
var privateflag = 0;
let start = $('#start-date').val() + ' ' + $('#start-time').val();
let end = $('#end-date').val() + ' ' + $('#end-time').val();
let title = $('#name').val();
let location = $('#location').val();
let description = $('#description').val();
let newkey = $('#attachments').data('newkey');
let allday = 0;
let reminder = $('#reminder').val();
let type = $('#type').val();
let busy = $('#busy').val();
let customer;
let customer_info_check = 0;
let customer_info_text;
let customer_info_type;
let customer_info_type_text;
let customer_info_reminder_check = 0;
let private = $('.privacy-click');
let privateflag = 0;
if (private.hasClass('fa-lock')) {
privateflag = 1;
}
var users = [];
let users = [];
if ($('#allday').is(':checked')) {
allday = 1;
@@ -1240,7 +1258,7 @@ $(document).ready(function () {
}
var id = $(this).data('id');
let id = $(this).data('id');
$('#calendar-users > option:selected').each(function () {
users.push($(this).val());
@@ -1305,8 +1323,8 @@ $(document).ready(function () {
$('body').on('click', '#delete-event', function () {
var id = $(this).data('id');
var users = [];
let id = $(this).data('id');
let users = [];
$('#calendar-users > option:selected').each(function () {
users.push($(this).val());
});
@@ -1343,10 +1361,10 @@ $(document).ready(function () {
});
$('body').on('change', '.color-input,.color-text-input', function (event, init = 0) {
var bgcolors = [];
var txtcolors = [];
var calendar_id = [];
var thisis = $(this);
let bgcolors = [];
let txtcolors = [];
let calendar_id = [];
let thisis = $(this);
$.each($('.color-input'), function (index, value) {
if ($(this).data('calendar_id')) {
bgcolors.push($(this).closest('div').find('.color-input').val());
@@ -1358,7 +1376,7 @@ $(document).ready(function () {
});
var id = $('#calendar-id').data('id');
let id = $('#calendar-id').data('id');
let groups = getGroups();
$.post(requestUpdateColorUrl, {
id: id,
@@ -1381,11 +1399,11 @@ $(document).ready(function () {
} else {
refreshCalendarEvents()
}
var resources = calendar.getResources();
let resources = calendar.getResources();
$.each(resources, function (index, value) {
value.remove();
});
var resourceCounter = 0;
let resourceCounter = 0;
$.each($('.calendar-check'), function (index, value) {
if ($(this).prop('checked')) {
rights = true;
@@ -1405,8 +1423,8 @@ $(document).ready(function () {
;
function uploadajax(ttl, cl) {
var fileList = $('#files-input').prop("files");
var form_data = "";
let fileList = $('#files-input').prop("files");
let form_data = "";
form_data = new FormData();
form_data.append("upload_file", fileList[cl]);
@@ -1414,7 +1432,7 @@ $(document).ready(function () {
form_data.append("newkey", $('#attachments').data('newkey'));
var request = $.ajax({
let request = $.ajax({
url: requestEventAttachmentUploadUrl,
cache: false,
contentType: false,
@@ -1423,10 +1441,10 @@ $(document).ready(function () {
data: form_data,
type: 'POST',
xhr: function () {
var xhr = $.ajaxSettings.xhr();
let xhr = $.ajaxSettings.xhr();
if (xhr.upload) {
xhr.upload.addEventListener('progress', function (event) {
var percent = 0;
let percent = 0;
if (event.lengthComputable) {
percent = Math.ceil(event.loaded / event.total * 100);
}
@@ -1453,10 +1471,10 @@ $(document).ready(function () {
$('body').on('change', '#files-input', function () {
var fileList = $('#files-input').prop("files");
let fileList = $('#files-input').prop("files");
$('#uploadsts').html('');
var i;
let i;
for (i = 0; i < fileList.length; i++) {
let newkey = $('#attachments').data('newkey');
const filetype = fileList[i].type;
@@ -1521,6 +1539,7 @@ $(document).ready(function () {
}
});
$('body').on('change', '#jumpevent', function () {
$('.event-search-result').removeClass('event-search-result');
if ($(this).val() == "" || $(this).val() == null) {
@@ -1552,7 +1571,7 @@ $(document).ready(function () {
return {
q: params.term, // Der Suchbegriff
term: params.term, // Der Suchbegriff
calendars: visibleCalendars, // Die dynamische Variable, die du hinzufügen möchtest
calendars: visibleCalendars, // Die dynamische letiable, die du hinzufügen möchtest
cal_id: $('#calendar-id').data('calendarid')
};
},
@@ -1582,22 +1601,15 @@ $(document).ready(function () {
} else {
daytimetext = "nachmittags";
}
let textTemplate;
if ($(this).data('id') == 1) {
textTemplate = `Sehr geehrter Kunde,
Ihr Technikertermin findet am ` + formattedDate + ` ` + daytimetext + ` statt.
Mit Freundlichen Grüßen
Xinon GMbH`;
} else if ($(this).data('id') == 2) {
textTemplate = `Sehr geehrter Kunde,
wir möchten Sie daran erinnern, dass Ihr Technikertermin am ` + formattedDate + ` ` + daytimetext + ` stattfindet.
Mit Freundlichen Grüßen
Xinon GMbH`;
} else if ($(this).data('id') == 3) {
textTemplate = formattedDate + ` zwischen ` + starttime + ` und ` + endtime;
}
let text = $(this).data('text');
text = text.replace(/\[&&vmnm&&\]/g, daytimetext);
text = text.replace(/\[&&date&&\]/g, formattedDate);
text = text.replace(/\[&&start&&\]/g, starttime);
text = text.replace(/\[&&end&&\]/g, endtime);
$('#customer-info-text').val(textTemplate);
$('#customer-info-text').val(text);
});
@@ -1657,7 +1669,7 @@ Xinon GMbH`;
let groupname = $.trim($(this).text());
$(this).html('<input type="text" data-oldname="' + groupname + '" class="form-control cal-group-name-input" value="' + groupname + '">');
var strLength = $(this).find('.cal-group-name-input').val().length * 2;
let strLength = $(this).find('.cal-group-name-input').val().length * 2;
$(this).find('.cal-group-name-input')[0].setSelectionRange(strLength, strLength);
@@ -1676,11 +1688,11 @@ Xinon GMbH`;
$(this).closest('.calendar-side-borders-sub').find('.form-check-input').prop('checked', false);
refreshCalendarEvents()
}
var resources = calendar.getResources();
let resources = calendar.getResources();
$.each(resources, function (index, value) {
value.remove();
});
var resourceCounter = 0;
let resourceCounter = 0;
$.each($('.calendar-check'), function (index, value) {
if ($(this).prop('checked')) {
rights = true;
@@ -1814,6 +1826,7 @@ Xinon GMbH`;
return groupsJson;
}
function checkGroupCheckboxes() {
$('.group-checkbox').each(function (index, value) {
let checked = 0;
@@ -1907,16 +1920,16 @@ Xinon GMbH`;
}, 'json').done(function (json) {
if (json.success == true) {
var userevents = [];
var otherevents = [];
var resources = [];
var category = "";
var rights = false;
var movable = false;
var resourceCounter = 0;
var rrule = null;
var duration = null;
var rruleflag = false;
let userevents = [];
let otherevents = [];
let resources = [];
let category = "";
let rights = false;
let movable = false;
let resourceCounter = 0;
let rrule = null;
let duration = null;
let rruleflag = false;
let allDAy = false;
let cursorclass = "";
$.each($('.calendar-check'), function (index, value) {