Merge branch 'spidev' into 'master'
Kalenderupdate See merge request fronk/thetool!1813
This commit is contained in:
@@ -31,6 +31,9 @@ foreach ($rights as $key => $right) :
|
||||
} elseif ($CalendarAll[$key]->calendar_name) {
|
||||
$calendarName = $CalendarAll[$key]->calendar_name;
|
||||
}
|
||||
if (!($CalendarAll[$key]->microsoft_id)) {
|
||||
$calendarName .= ' 📅';
|
||||
}
|
||||
}
|
||||
|
||||
if ($calendarName) {
|
||||
@@ -131,7 +134,7 @@ endforeach;
|
||||
class="fa-duotone fa-solid fa-phone-volume fa-calendar-call fa-calendar-call-search"></i>
|
||||
</button>
|
||||
<button title="Abgesagte Termine" data-eventcancelled="1"
|
||||
class="btn btn-light btn-light-search"><i
|
||||
class="btn btn-light btn-light-search top-search-filter"><i
|
||||
class="fa-duotone fa-solid fa-calendar-symbol fa-calendar-circle-exclamation"></i>
|
||||
</button>
|
||||
|
||||
@@ -629,11 +632,25 @@ endforeach;
|
||||
name="calendar-users">
|
||||
<?php foreach ($CalArray as $key => $value) :
|
||||
if ($rights[$value] != "all") continue;
|
||||
$hasMicrosoftId = $CalendarAll[$value]->microsoft_id ?: 0;
|
||||
$optionClass = $hasMicrosoftId ? '' : 'no-microsoft-id';
|
||||
$optionStyle = $hasMicrosoftId ? '' : '';
|
||||
|
||||
if ($value != $Calendar[0]->go_calendar_id) : ?>
|
||||
<option value="<?= $value ?>"><?= $key ?></option>
|
||||
<option value="<?= $value ?>"
|
||||
class="<?= $optionClass ?>"
|
||||
style="<?= $optionStyle ?>"
|
||||
data-has-microsoft-id="<?= $hasMicrosoftId ? '1' : '0' ?>">
|
||||
<?= $key ?>
|
||||
</option>
|
||||
<?php else : ?>
|
||||
<option data-mainuser="1" selected="selected"
|
||||
value="<?= $value ?>"><?= $key ?></option>
|
||||
value="<?= $value ?>"
|
||||
class="<?= $optionClass ?>"
|
||||
style="<?= $optionStyle ?>"
|
||||
data-has-microsoft-id="<?= $hasMicrosoftId ? '1' : '0' ?>">
|
||||
<?= $key ?>
|
||||
</option>
|
||||
<?php endif;
|
||||
endforeach; ?>
|
||||
</select>
|
||||
@@ -665,11 +682,18 @@ endforeach;
|
||||
class="fa-solid fa-arrow-right-from-bracket"></i></span></label>
|
||||
</div>
|
||||
<div class="col-8">
|
||||
<select class="form-control form-select select2-multiple-tag" id="calendar-attendees"
|
||||
<select class="form-control form-select select2-multiple" id="calendar-attendees"
|
||||
name="calendar-users[]"
|
||||
multiple="multiple">
|
||||
<?php foreach ($CalArray as $key => $value) : ?>
|
||||
<option value="<?= $value ?>"><?= $key ?></option>
|
||||
<?php foreach ($CalArray as $key => $value) :
|
||||
$hasMicrosoftId = $CalendarAll[$value]->microsoft_id ?: 0;
|
||||
$optionStyle = $hasMicrosoftId ? '' : '';
|
||||
?>
|
||||
<option value="<?= $value ?>"
|
||||
style="<?= $optionStyle ?>"
|
||||
data-has-microsoft-id="<?= $hasMicrosoftId ? '1' : '0' ?>">
|
||||
<?= $key ?>
|
||||
</option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
@@ -81,11 +81,8 @@ class CalendarModel
|
||||
|
||||
public static function convertToSummertime($timestamp)
|
||||
{
|
||||
// Create a DateTime object from the Unix timestamp
|
||||
$date = new DateTime();
|
||||
$date->setTimestamp($timestamp);
|
||||
|
||||
// Set the timezone to Europe/Berlin
|
||||
$date->setTimezone(new DateTimeZone('Europe/Berlin'));
|
||||
if ($date->format('I') == 1) {
|
||||
$cest = 7200;
|
||||
@@ -93,7 +90,6 @@ class CalendarModel
|
||||
$cest = 3600;
|
||||
}
|
||||
$unixtimestamp = $date->getTimestamp() + $cest;
|
||||
// Format the date and time
|
||||
return date('Y-m-d H:i:s', $unixtimestamp);
|
||||
}
|
||||
|
||||
@@ -111,7 +107,6 @@ class CalendarModel
|
||||
'\u00e9' => 'é',
|
||||
'\u00e0' => 'à',
|
||||
'\u00f3' => 'ó',
|
||||
// Weitere Unicode-Zuordnungen können hier hinzugefügt werden
|
||||
];
|
||||
|
||||
foreach ($unicode_map as $unicode => $char) {
|
||||
@@ -682,6 +677,10 @@ WHERE `TimerecordingCategory`.`hourday`!='1' AND `TimerecordingCategory`.`hourda
|
||||
$busy = ($r->busy);
|
||||
$users = ($r->users);
|
||||
$attendees = ($r->attendees);
|
||||
$attendeesOriginal = $attendees;
|
||||
if (is_string($attendees)) {
|
||||
$attendees = json_decode($attendees, true);
|
||||
}
|
||||
$privateflag = ($r->privateflag);
|
||||
foreach ($users as $key => $value) {
|
||||
$user_id = $value;
|
||||
@@ -816,26 +815,339 @@ WHERE `TimerecordingCategory`.`hourday`!='1' AND `TimerecordingCategory`.`hourda
|
||||
$db->insert("cal_events_attachments", $data);
|
||||
$db->delete("tmp_cal_events_attachments", "id = '" . $tmpid . "'");
|
||||
}
|
||||
|
||||
}
|
||||
$currentBg = $db->select("cal_events", "background", "id = '" . $id . "' LIMIT 1");
|
||||
if ($db->num_rows($currentBg)) {
|
||||
$bgData = $db->fetch_array($currentBg);
|
||||
|
||||
if ($bgData['background']=='EBF1E2')
|
||||
{
|
||||
$pupdateArray['background'] = "EBF1E3";
|
||||
} else
|
||||
{
|
||||
$pupdateArray['background'] = "EBF1E2";
|
||||
}
|
||||
|
||||
$db->update("cal_events", $pupdateArray , "id = '" . $id . "'");
|
||||
}
|
||||
$updateArray['attachments'] = $attachments;
|
||||
$updateArray['end_time'] = $originalend;
|
||||
}
|
||||
if ($attendees)
|
||||
$updateArray['attendees'] = $attendees;
|
||||
$updateArray['attendees'] = $attendeesOriginal;
|
||||
$json_data = json_encode($updateArray);
|
||||
$data = [];
|
||||
$data['ms_user_id'] = $microsoft_user_id;
|
||||
$data['ms_event_id'] = $microsoft_id;
|
||||
$data['data'] = $json_data;
|
||||
$data['type'] = 'u';
|
||||
$data['status'] = 'p';
|
||||
$data['edit'] = time();
|
||||
$data['create'] = time();
|
||||
$data['edit_by'] = 89;
|
||||
$data['create_by'] = 89;
|
||||
if (!empty($microsoft_id) && !empty($microsoft_user_id)) {
|
||||
$data = [];
|
||||
$data['ms_user_id'] = $microsoft_user_id;
|
||||
$data['ms_event_id'] = $microsoft_id;
|
||||
$data['data'] = $json_data;
|
||||
$data['type'] = 'u';
|
||||
$data['status'] = 'p';
|
||||
$data['edit'] = time();
|
||||
$data['create'] = time();
|
||||
$data['edit_by'] = 89;
|
||||
$data['create_by'] = 89;
|
||||
|
||||
$db->insert("TheTool_CalendarQueue", $data);
|
||||
$db->insert("TheTool_CalendarQueue", $data);
|
||||
}
|
||||
$resMain = $db->select("cal_events", 'linked_event_uid,is_organizer', "id = '" . $id . "' LIMIT 1");
|
||||
if ($db->num_rows($resMain)) {
|
||||
$mainEvent = $db->fetch_object($resMain);
|
||||
|
||||
if ($mainEvent->is_organizer == 1 && !empty($mainEvent->linked_event_uid)) {
|
||||
$sqlLinked = "SELECT ce.id, ce.calendar_id, cc.ms_user_id microsoft_id
|
||||
FROM cal_events ce
|
||||
LEFT JOIN cal_calendars cc ON ce.calendar_id = cc.id
|
||||
WHERE ce.linked_event_uid = '" . $mainEvent->linked_event_uid . "'
|
||||
AND ce.id != '" . $id . "'
|
||||
AND ce.is_organizer = 0";
|
||||
$resLinked = $db->query($sqlLinked);
|
||||
|
||||
while ($linkedEvent = $db->fetch_object($resLinked)) {
|
||||
if (empty($linkedEvent->microsoft_id)) {
|
||||
$linkedUpdateArray = array();
|
||||
|
||||
if (isset($updateArray['start_time']))
|
||||
$linkedUpdateArray['start_time'] = $updateArray['start_time'];
|
||||
if (isset($updateArray['end_time']))
|
||||
$linkedUpdateArray['end_time'] = $updateArray['end_time'];
|
||||
if (isset($updateArray['name']))
|
||||
$linkedUpdateArray['name'] = $updateArray['name'];
|
||||
if (isset($updateArray['description']))
|
||||
$linkedUpdateArray['description'] = $updateArray['description'];
|
||||
if (isset($updateArray['location']))
|
||||
$linkedUpdateArray['location'] = $updateArray['location'];
|
||||
if (isset($updateArray['all_day_event']))
|
||||
$linkedUpdateArray['all_day_event'] = $updateArray['all_day_event'];
|
||||
if (isset($updateArray['private']))
|
||||
$linkedUpdateArray['private'] = $updateArray['private'];
|
||||
if (isset($updateArray['reminder']))
|
||||
$linkedUpdateArray['reminder'] = $updateArray['reminder'];
|
||||
if (isset($updateArray['busy']))
|
||||
$linkedUpdateArray['busy'] = 2;
|
||||
if (isset($updateArray['event_type']))
|
||||
$linkedUpdateArray['event_type'] = $updateArray['event_type'];
|
||||
if (isset($updateArray['categories']))
|
||||
$linkedUpdateArray['categories'] = $updateArray['categories'];
|
||||
if (isset($updateArray['customer']))
|
||||
$linkedUpdateArray['customer'] = $updateArray['customer'];
|
||||
if (isset($updateArray['customer_info']))
|
||||
$linkedUpdateArray['customer_info'] = $updateArray['customer_info'];
|
||||
if (isset($updateArray['customer_info_send']))
|
||||
$linkedUpdateArray['customer_info_send'] = $updateArray['customer_info_send'];
|
||||
if (isset($updateArray['customer_info_reminder']))
|
||||
$linkedUpdateArray['customer_info_reminder'] = $updateArray['customer_info_reminder'];
|
||||
|
||||
if ($attendees) {
|
||||
$attendeesForLinkedEvent = array();
|
||||
$attendeesForLinkedEvent['required'] = array();
|
||||
|
||||
$organizerCalendar = self::search(array("go_calendar_id" => $user_id));
|
||||
if ($organizerCalendar && count($organizerCalendar) > 0) {
|
||||
$orgName = '';
|
||||
$orgEmail = '';
|
||||
if ($organizerCalendar[0]->user_id) {
|
||||
$orgName = $organizerCalendar[0]->user->name;
|
||||
$orgEmail = $organizerCalendar[0]->user->email;
|
||||
} elseif ($organizerCalendar[0]->calendar_name) {
|
||||
$orgName = $organizerCalendar[0]->calendar_name;
|
||||
$orgEmail = $organizerCalendar[0]->calendar_email ?: '';
|
||||
}
|
||||
|
||||
$attendeesForLinkedEvent['required'][] = array(
|
||||
'name' => $orgName,
|
||||
'email' => $orgEmail,
|
||||
'response' => 'none',
|
||||
'time' => '0001-01-01 00:00:00.000000'
|
||||
);
|
||||
}
|
||||
|
||||
foreach ($attendees as $att) {
|
||||
if (is_numeric($att) && intval($att) != $linkedEvent->calendar_id) {
|
||||
$attCal = self::search(array("go_calendar_id" => intval($att)));
|
||||
if ($attCal && count($attCal) > 0) {
|
||||
$attName = '';
|
||||
$attEmail = '';
|
||||
if ($attCal[0]->user_id) {
|
||||
$attName = $attCal[0]->user->name;
|
||||
$attEmail = $attCal[0]->user->email;
|
||||
} elseif ($attCal[0]->calendar_name) {
|
||||
$attName = $attCal[0]->calendar_name;
|
||||
$attEmail = $attCal[0]->calendar_email ?: '';
|
||||
}
|
||||
$attendeesForLinkedEvent['required'][] = array(
|
||||
'name' => $attName,
|
||||
'email' => $attEmail,
|
||||
'response' => 'none',
|
||||
'time' => '0001-01-01 00:00:00.000000'
|
||||
);
|
||||
}
|
||||
} elseif (!is_numeric($att)) {
|
||||
$attendeesForLinkedEvent['required'][] = array(
|
||||
'name' => $att,
|
||||
'email' => $att,
|
||||
'response' => 'none',
|
||||
'time' => '0001-01-01 00:00:00.000000'
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
$linkedUpdateArray['attendees'] = json_encode($attendeesForLinkedEvent);
|
||||
}
|
||||
|
||||
$linkedUpdateArray['mtime'] = time();
|
||||
$linkedUpdateArray['mname'] = $me->name;
|
||||
|
||||
if (!empty($linkedUpdateArray)) {
|
||||
usleep(200000);
|
||||
$db->update("cal_events", $linkedUpdateArray, "id = '" . $linkedEvent->id . "'");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
if ($attendees) {
|
||||
$currentAttendeeCalendarIds = array();
|
||||
|
||||
$sqlLinkedForAttendees = "SELECT ce.id, ce.calendar_id, cc.ms_user_id microsoft_id
|
||||
FROM cal_events ce
|
||||
LEFT JOIN cal_calendars cc ON ce.calendar_id = cc.id
|
||||
WHERE ce.linked_event_uid = '" . $mainEvent->linked_event_uid . "'
|
||||
AND ce.id != '" . $id . "'
|
||||
AND ce.is_organizer = 0";
|
||||
$resCurrentAttendeesQuery = $db->query($sqlLinkedForAttendees);
|
||||
|
||||
while ($currAtt = $db->fetch_object($resCurrentAttendeesQuery)) {
|
||||
if (empty($currAtt->microsoft_id)) {
|
||||
$currentAttendeeCalendarIds[] = $currAtt->calendar_id;
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($attendees as $newAttendee) {
|
||||
$newAttendeeCalId = null;
|
||||
if (is_numeric($newAttendee) && !filter_var($newAttendee, FILTER_VALIDATE_EMAIL)) {
|
||||
$newAttendeeCalId = intval($newAttendee);
|
||||
} else {
|
||||
$dbCheckEmail = FronkDB::singleton();
|
||||
$resCheckEmail = $dbCheckEmail->query("SELECT go_calendar_id FROM Calendar WHERE calendar_email = '" . $newAttendee . "' LIMIT 1");
|
||||
if ($dbCheckEmail->num_rows($resCheckEmail)) {
|
||||
$emailCalData = $dbCheckEmail->fetch_object($resCheckEmail);
|
||||
$newAttendeeCalId = intval($emailCalData->go_calendar_id);
|
||||
}
|
||||
}
|
||||
if ($newAttendeeCalId) {
|
||||
if (!in_array($newAttendeeCalId, $currentAttendeeCalendarIds)) {
|
||||
$newAttCal = self::search(array("go_calendar_id" => $newAttendeeCalId));
|
||||
if (count($newAttCal) > 0) {
|
||||
$resCheckNewAttMs = $db->select("cal_calendars", "ms_user_id", "id = '" . $newAttendeeCalId . "' LIMIT 1");
|
||||
$hasMsId = false;
|
||||
if ($db->num_rows($resCheckNewAttMs)) {
|
||||
$newAttMsData = $db->fetch_object($resCheckNewAttMs);
|
||||
$hasMsId = !empty($newAttMsData->ms_user_id);
|
||||
}
|
||||
}
|
||||
|
||||
if ($newAttCal && count($newAttCal) > 0 && !$hasMsId) {
|
||||
$organizerCalendar = self::search(array("go_calendar_id" => $user_id));
|
||||
$organizerName = '';
|
||||
$organizerEmail = '';
|
||||
if ($organizerCalendar && count($organizerCalendar) > 0) {
|
||||
if ($organizerCalendar[0]->user_id) {
|
||||
$organizerName = $organizerCalendar[0]->user->name;
|
||||
$organizerEmail = $organizerCalendar[0]->user->email;
|
||||
} elseif ($organizerCalendar[0]->calendar_name) {
|
||||
$organizerName = $organizerCalendar[0]->calendar_name;
|
||||
$organizerEmail = $organizerCalendar[0]->calendar_email ?: '';
|
||||
}
|
||||
}
|
||||
|
||||
$newOrganizerJson = json_encode(array(
|
||||
'name' => $organizerName,
|
||||
'email' => $organizerEmail
|
||||
));
|
||||
|
||||
$newAttendeesForEvent = array();
|
||||
$newAttendeesForEvent['required'] = array();
|
||||
|
||||
$newAttendeesForEvent['required'][] = array(
|
||||
'name' => $organizerName,
|
||||
'email' => $organizerEmail,
|
||||
'response' => 'none',
|
||||
'time' => '0001-01-01 00:00:00.000000'
|
||||
);
|
||||
|
||||
foreach ($attendees as $otherAtt) {
|
||||
if ($otherAtt != $newAttendee) {
|
||||
if (is_numeric($otherAtt) && !filter_var($otherAtt, FILTER_VALIDATE_EMAIL)) {
|
||||
$otherCal = self::search(array("go_calendar_id" => intval($otherAtt)));
|
||||
if ($otherCal && count($otherCal) > 0) {
|
||||
$otherName = '';
|
||||
$otherEmail = '';
|
||||
if ($otherCal[0]->user_id) {
|
||||
$otherName = $otherCal[0]->user->name;
|
||||
$otherEmail = $otherCal[0]->user->email;
|
||||
} elseif ($otherCal[0]->calendar_name) {
|
||||
$otherName = $otherCal[0]->calendar_name;
|
||||
$otherEmail = $otherCal[0]->calendar_email ?: '';
|
||||
}
|
||||
$newAttendeesForEvent['required'][] = array(
|
||||
'name' => $otherName,
|
||||
'email' => $otherEmail,
|
||||
'response' => 'none',
|
||||
'time' => '0001-01-01 00:00:00.000000'
|
||||
);
|
||||
}
|
||||
} else {
|
||||
$newAttendeesForEvent['required'][] = array(
|
||||
'name' => $otherAtt,
|
||||
'email' => $otherAtt,
|
||||
'response' => 'none',
|
||||
'time' => '0001-01-01 00:00:00.000000'
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$newAttendeesJson = json_encode($newAttendeesForEvent);
|
||||
$newAttendeeDataarray = array(
|
||||
"start_time" => $updateArray['start_time'],
|
||||
'end_time' => $updateArray['end_time'],
|
||||
'name' => $updateArray['name'],
|
||||
'description' => $updateArray['description'] ?? '',
|
||||
'location' => $updateArray['location'] ?? '',
|
||||
'calendar_id' => $newAttendeeCalId,
|
||||
'uuid' => "a5eb79b3-fca7-5378-a09e-" . rand(100000000000, 999999999999),
|
||||
'user_id' => 1,
|
||||
'timezone' => 'Europe/Amsterdam',
|
||||
'all_day_event' => $updateArray['all_day_event'] ?? 0,
|
||||
'repeat_end_time' => 0,
|
||||
'reminder' => $updateArray['reminder'] ?? NULL,
|
||||
'ctime' => time(),
|
||||
'cname' => $me->name,
|
||||
'mtime' => time(),
|
||||
'mname' => $me->name,
|
||||
'busy' => 2,
|
||||
'status' => 'CONFIRMED',
|
||||
'resource_event_id' => 0,
|
||||
'private' => $updateArray['private'] ?? 0,
|
||||
'rrule' => '',
|
||||
'background' => 'EBF1E2',
|
||||
'files_folder_id' => 0,
|
||||
'read_only' => 0,
|
||||
'categories' => $updateArray['categories'] ?? NULL,
|
||||
'exception_for_event_id' => 0,
|
||||
'recurrence_id' => 0,
|
||||
'is_organizer' => 0,
|
||||
'organizer' => $newOrganizerJson,
|
||||
'attendees' => $newAttendeesJson,
|
||||
'linked_event_uid' => $mainEvent->linked_event_uid,
|
||||
'event_type' => $updateArray['event_type'] ?? 1,
|
||||
'customer' => $updateArray['customer'] ?? NULL,
|
||||
'customer_info' => $updateArray['customer_info'] ?? NULL,
|
||||
'customer_info_send' => $updateArray['customer_info_send'] ?? NULL,
|
||||
'customer_info_reminder' => $updateArray['customer_info_reminder'] ?? 0
|
||||
);
|
||||
usleep(200000);
|
||||
$db->insert("cal_events", $newAttendeeDataarray);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
$newAttendeeCalendarIds = array();
|
||||
foreach ($attendees as $att) {
|
||||
if (is_numeric($att)) {
|
||||
$newAttendeeCalendarIds[] = intval($att);
|
||||
} else {
|
||||
$dbCheck = FronkDB::singleton();
|
||||
$resEmailCheck = $dbCheck->query("SELECT go_calendar_id FROM Calendar WHERE calendar_email = '" . $att . "' LIMIT 1");
|
||||
if ($dbCheck->num_rows($resEmailCheck)) {
|
||||
$emailData = $dbCheck->fetch_object($resEmailCheck);
|
||||
$resCheckMs = $db->select("cal_calendars", "ms_user_id", "id = '" . $emailData->go_calendar_id . "' LIMIT 1");
|
||||
if ($db->num_rows($resCheckMs)) {
|
||||
$msData = $db->fetch_object($resCheckMs);
|
||||
$emailHasMsId = !empty($msData->ms_user_id);
|
||||
if (!$emailHasMsId) {
|
||||
$newAttendeeCalendarIds[] = intval($emailData->go_calendar_id);
|
||||
}
|
||||
} else {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
error_log("DEBUG: newAttendeeCalendarIds nach Email-Check: " . print_r($newAttendeeCalendarIds, true));
|
||||
|
||||
foreach ($currentAttendeeCalendarIds as $oldCalId) {
|
||||
if (!in_array($oldCalId, $newAttendeeCalendarIds)) {
|
||||
$db->delete("cal_events", "linked_event_uid = '" . $mainEvent->linked_event_uid . "' AND calendar_id = '" . $oldCalId . "' AND is_organizer = 0");
|
||||
} else {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static function updateCalendarEventState($r, $me)
|
||||
@@ -875,18 +1187,35 @@ WHERE `TimerecordingCategory`.`hourday`!='1' AND `TimerecordingCategory`.`hourda
|
||||
$db->update("cal_events", $updateArray, "id = '" . $id . "'");
|
||||
|
||||
$json_data = json_encode($updateArray);
|
||||
$data = [];
|
||||
$data['ms_user_id'] = $microsoft_user_id;
|
||||
$data['ms_event_id'] = $microsoft_id;
|
||||
$data['data'] = $json_data;
|
||||
$data['type'] = $process;
|
||||
$data['status'] = 'p';
|
||||
$data['edit'] = time();
|
||||
$data['create'] = time();
|
||||
$data['edit_by'] = 89;
|
||||
$data['create_by'] = 89;
|
||||
if (!empty($microsoft_id) && !empty($microsoft_user_id)) {
|
||||
$data = [];
|
||||
$data['ms_user_id'] = $microsoft_user_id;
|
||||
$data['ms_event_id'] = $microsoft_id;
|
||||
$data['data'] = $json_data;
|
||||
$data['type'] = $process;
|
||||
$data['status'] = 'p';
|
||||
$data['edit'] = time();
|
||||
$data['create'] = time();
|
||||
$data['edit_by'] = 89;
|
||||
$data['create_by'] = 89;
|
||||
|
||||
$db->insert("TheTool_CalendarQueue", $data);
|
||||
$db->insert("TheTool_CalendarQueue", $data);
|
||||
}
|
||||
if ($eventAction == "decline") {
|
||||
$resCheckDecline = $db->select("cal_events", "linked_event_uid, calendar_id", "id = '" . $id . "' LIMIT 1");
|
||||
if ($db->num_rows($resCheckDecline)) {
|
||||
$declineEvent = $db->fetch_object($resCheckDecline);
|
||||
$resCheckDeclineMs = $db->select("cal_calendars", "ms_user_id", "id = '" . $declineEvent->calendar_id . "' LIMIT 1");
|
||||
if ($db->num_rows($resCheckDeclineMs)) {
|
||||
$declineMsData = $db->fetch_object($resCheckDeclineMs);
|
||||
$declineHasMsId = !empty($declineMsData->ms_user_id);
|
||||
if (!$declineHasMsId && !empty($declineEvent->linked_event_uid)) {
|
||||
error_log("DEBUG: Teilnehmer ohne MS-ID lehnt ab - Lösche Event ID: " . $id);
|
||||
$db->delete("cal_events", "id = '" . $id . "' AND linked_event_uid = '" . $declineEvent->linked_event_uid . "' AND is_organizer = 0");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static function insertCalendarEvent($r, $me, $rrules = "")
|
||||
@@ -963,6 +1292,9 @@ WHERE `TimerecordingCategory`.`hourday`!='1' AND `TimerecordingCategory`.`hourda
|
||||
|
||||
$db->insert("cal_events", $dataarray);
|
||||
$event_id = $dataarray['uuid'];
|
||||
$shared_linked_uid = 'LINKED-' . strtoupper(uniqid()) . '-' . time();
|
||||
$db->update("cal_events", array('linked_event_uid' => $shared_linked_uid), "uuid = '" . $event_id . "'");
|
||||
|
||||
if ($newkey) {
|
||||
$res = $db->select("tmp_cal_events_attachments", "id,name,contentType,content,size,create_timestamp,edit_timestamp", "1=1 AND newkey='" . $newkey . "' ORDER BY id");
|
||||
if ($db->num_rows($res)) {
|
||||
@@ -986,17 +1318,149 @@ WHERE `TimerecordingCategory`.`hourday`!='1' AND `TimerecordingCategory`.`hourda
|
||||
$dataarray['end_time'] = $originalend;
|
||||
$json_data = json_encode($dataarray);
|
||||
|
||||
$data = [];
|
||||
$data['ms_user_id'] = $microsoft_user_id;
|
||||
$data['event_id'] = $event_id;
|
||||
$data['data'] = $json_data;
|
||||
$data['type'] = 'c';
|
||||
$data['status'] = 'p';
|
||||
$data['edit'] = time();
|
||||
$data['create'] = time();
|
||||
$data['edit_by'] = 89;
|
||||
$data['create_by'] = 89;
|
||||
$db->insert("TheTool_CalendarQueue", $data);
|
||||
if (!empty($microsoft_user_id)) {
|
||||
$data = [];
|
||||
$data['ms_user_id'] = $microsoft_user_id;
|
||||
$data['event_id'] = $event_id;
|
||||
$data['data'] = $json_data;
|
||||
$data['type'] = 'c';
|
||||
$data['status'] = 'p';
|
||||
$data['edit'] = time();
|
||||
$data['create'] = time();
|
||||
$data['edit_by'] = 89;
|
||||
$data['create_by'] = 89;
|
||||
$db->insert("TheTool_CalendarQueue", $data);
|
||||
}
|
||||
if ($attendees) {
|
||||
$organizerCalendar = self::search(array("go_calendar_id" => $user_id));
|
||||
$organizerName = '';
|
||||
$organizerEmail = '';
|
||||
|
||||
if ($organizerCalendar && count($organizerCalendar) > 0) {
|
||||
if ($organizerCalendar[0]->user_id) {
|
||||
$organizerName = $organizerCalendar[0]->user->name;
|
||||
$organizerEmail = $organizerCalendar[0]->user->email;
|
||||
} elseif ($organizerCalendar[0]->calendar_name) {
|
||||
$organizerName = $organizerCalendar[0]->calendar_name;
|
||||
$organizerEmail = $organizerCalendar[0]->calendar_email ?: '';
|
||||
}
|
||||
}
|
||||
|
||||
$organizerJson = json_encode(array(
|
||||
'name' => $organizerName,
|
||||
'email' => $organizerEmail
|
||||
));
|
||||
|
||||
foreach ($attendees as $attendeeValue) {
|
||||
if (is_numeric($attendeeValue) && !filter_var($attendeeValue, FILTER_VALIDATE_EMAIL)) {
|
||||
$attendeeCalendarId = intval($attendeeValue);
|
||||
$attendeeCalendar = self::search(array("go_calendar_id" => $attendeeCalendarId));
|
||||
|
||||
if ($attendeeCalendar && count($attendeeCalendar) > 0) {
|
||||
$resCheckAttMs = $db->select("cal_calendars", "ms_user_id", "id = '" . $attendeeCalendarId . "' LIMIT 1");
|
||||
$attendeeHasMicrosoftId = false;
|
||||
if ($db->num_rows($resCheckAttMs)) {
|
||||
$attMsData = $db->fetch_object($resCheckAttMs);
|
||||
$attendeeHasMicrosoftId = !empty($attMsData->ms_user_id);
|
||||
}
|
||||
|
||||
if (!$attendeeHasMicrosoftId) {
|
||||
$attendeeName = '';
|
||||
$attendeeEmail = '';
|
||||
|
||||
if ($attendeeCalendar[0]->user_id) {
|
||||
$attendeeName = $attendeeCalendar[0]->user->name;
|
||||
$attendeeEmail = $attendeeCalendar[0]->user->email;
|
||||
} elseif ($attendeeCalendar[0]->calendar_name) {
|
||||
$attendeeName = $attendeeCalendar[0]->calendar_name;
|
||||
$attendeeEmail = $attendeeCalendar[0]->calendar_email ?: '';
|
||||
}
|
||||
$attendeesForEvent = array();
|
||||
$attendeesForEvent['required'] = array();
|
||||
$attendeesForEvent['required'][] = array(
|
||||
'name' => $organizerName,
|
||||
'email' => $organizerEmail,
|
||||
'response' => 'none',
|
||||
'time' => '0001-01-01 00:00:00.000000'
|
||||
);
|
||||
foreach ($attendees as $otherAttendee) {
|
||||
if ($otherAttendee != $attendeeValue) {
|
||||
if (is_numeric($otherAttendee) && !filter_var($otherAttendee, FILTER_VALIDATE_EMAIL)) {
|
||||
$otherCalendar = self::search(array("go_calendar_id" => intval($otherAttendee)));
|
||||
if ($otherCalendar && count($otherCalendar) > 0) {
|
||||
$otherName = '';
|
||||
$otherEmail = '';
|
||||
if ($otherCalendar[0]->user_id) {
|
||||
$otherName = $otherCalendar[0]->user->name;
|
||||
$otherEmail = $otherCalendar[0]->user->email;
|
||||
} elseif ($otherCalendar[0]->calendar_name) {
|
||||
$otherName = $otherCalendar[0]->calendar_name;
|
||||
$otherEmail = $otherCalendar[0]->calendar_email ?: '';
|
||||
}
|
||||
$attendeesForEvent['required'][] = array(
|
||||
'name' => $otherName,
|
||||
'email' => $otherEmail,
|
||||
'response' => 'none',
|
||||
'time' => '0001-01-01 00:00:00.000000'
|
||||
);
|
||||
}
|
||||
} else {
|
||||
$attendeesForEvent['required'][] = array(
|
||||
'name' => $otherAttendee,
|
||||
'email' => $otherAttendee,
|
||||
'response' => 'none',
|
||||
'time' => '0001-01-01 00:00:00.000000'
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$attendeesJson = json_encode($attendeesForEvent);
|
||||
$attendeeDataarray = array(
|
||||
"start_time" => $start,
|
||||
'end_time' => $end,
|
||||
'name' => $title,
|
||||
'description' => $description,
|
||||
'location' => $location,
|
||||
'calendar_id' => $attendeeCalendarId,
|
||||
'uuid' => "a5eb79b3-fca7-5378-a09e-" . rand(100000000000, 999999999999),
|
||||
'user_id' => 1,
|
||||
'timezone' => 'Europe/Amsterdam',
|
||||
'all_day_event' => $allday,
|
||||
'repeat_end_time' => 0,
|
||||
'reminder' => $reminder,
|
||||
'ctime' => time(),
|
||||
'cname' => $me->name,
|
||||
'mtime' => time(),
|
||||
'mname' => $me->name,
|
||||
'busy' => 2,
|
||||
'status' => 'CONFIRMED',
|
||||
'resource_event_id' => 0,
|
||||
'private' => $privateflag,
|
||||
'rrule' => '',
|
||||
'background' => 'EBF1E2',
|
||||
'files_folder_id' => 0,
|
||||
'read_only' => 0,
|
||||
'categories' => $categories,
|
||||
'exception_for_event_id' => 0,
|
||||
'recurrence_id' => 0,
|
||||
'is_organizer' => 0,
|
||||
'organizer' => $organizerJson,
|
||||
'attendees' => $attendeesJson,
|
||||
'linked_event_uid' => $shared_linked_uid,
|
||||
'event_type' => $type,
|
||||
'customer' => $customer,
|
||||
'customer_info' => $customer_info,
|
||||
'customer_info_send' => $customer_info_send,
|
||||
'customer_info_reminder' => $customer_info_reminder_check
|
||||
);
|
||||
|
||||
$db->insert("cal_events", $attendeeDataarray);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($r->delete_old_entry) {
|
||||
CalendarModel::deleteCalendarOldEvent($r->delete_old_entry);
|
||||
die();
|
||||
@@ -1046,16 +1510,18 @@ WHERE `TimerecordingCategory`.`hourday`!='1' AND `TimerecordingCategory`.`hourda
|
||||
if ($db->num_rows($res)) {
|
||||
$result = $db->fetch_object($res);
|
||||
|
||||
$data = [];
|
||||
$data['ms_user_id'] = $microsoft_user_id;
|
||||
$data['ms_event_id'] = $result->microsoft_id;
|
||||
$data['type'] = 'd';
|
||||
$data['status'] = 'p';
|
||||
$data['edit'] = time();
|
||||
$data['create'] = time();
|
||||
$data['edit_by'] = 89;
|
||||
$data['create_by'] = 89;
|
||||
$db->insert("TheTool_CalendarQueue", $data);
|
||||
if (!empty($result->microsoft_id) && !empty($microsoft_user_id)) {
|
||||
$data = [];
|
||||
$data['ms_user_id'] = $microsoft_user_id;
|
||||
$data['ms_event_id'] = $result->microsoft_id;
|
||||
$data['type'] = 'd';
|
||||
$data['status'] = 'p';
|
||||
$data['edit'] = time();
|
||||
$data['create'] = time();
|
||||
$data['edit_by'] = 89;
|
||||
$data['create_by'] = 89;
|
||||
$db->insert("TheTool_CalendarQueue", $data);
|
||||
}
|
||||
}
|
||||
$db->delete("cal_events", "id = '" . $id . "'");
|
||||
die();
|
||||
@@ -1077,16 +1543,18 @@ WHERE `TimerecordingCategory`.`hourday`!='1' AND `TimerecordingCategory`.`hourda
|
||||
$resultcal = $db->fetch_object($rescal);
|
||||
$microsoft_user_id = $resultcal->ms_user_id;
|
||||
}
|
||||
$data = [];
|
||||
$data['ms_user_id'] = $microsoft_user_id;
|
||||
$data['ms_event_id'] = $resultical->microsoft_id;
|
||||
$data['type'] = 'd';
|
||||
$data['status'] = 'p';
|
||||
$data['edit'] = time();
|
||||
$data['create'] = time();
|
||||
$data['edit_by'] = 89;
|
||||
$data['create_by'] = 89;
|
||||
$db->insert("TheTool_CalendarQueue", $data);
|
||||
if (!empty($microsoft_user_id)) {
|
||||
$data = [];
|
||||
$data['ms_user_id'] = $microsoft_user_id;
|
||||
$data['ms_event_id'] = $resultical->microsoft_id;
|
||||
$data['type'] = 'd';
|
||||
$data['status'] = 'p';
|
||||
$data['edit'] = time();
|
||||
$data['create'] = time();
|
||||
$data['edit_by'] = 89;
|
||||
$data['create_by'] = 89;
|
||||
$db->insert("TheTool_CalendarQueue", $data);
|
||||
}
|
||||
$db->delete("cal_events", "id = '" . $resical->id . "'");
|
||||
}
|
||||
}
|
||||
@@ -1142,17 +1610,20 @@ WHERE `TimerecordingCategory`.`hourday`!='1' AND `TimerecordingCategory`.`hourda
|
||||
$updateArray['canceld'] = 1;
|
||||
$db->update("cal_events", $updateArray, "id = '" . $id . "'");
|
||||
$json_data = json_encode($updateArray);
|
||||
$data = [];
|
||||
$data['ms_user_id'] = $microsoft_user_id;
|
||||
$data['ms_event_id'] = $microsoft_id;
|
||||
$data['data'] = $json_data;
|
||||
$data['type'] = 'u';
|
||||
$data['status'] = 'p';
|
||||
$data['edit'] = time();
|
||||
$data['create'] = time();
|
||||
$data['edit_by'] = 89;
|
||||
$data['create_by'] = 89;
|
||||
$db->insert("TheTool_CalendarQueue", $data);
|
||||
if (!empty($microsoft_id) && !empty($microsoft_user_id)) {
|
||||
$data = [];
|
||||
$data['ms_user_id'] = $microsoft_user_id;
|
||||
$data['ms_event_id'] = $microsoft_id;
|
||||
$data['data'] = $json_data;
|
||||
$data['type'] = 'u';
|
||||
$data['status'] = 'p';
|
||||
$data['edit'] = time();
|
||||
$data['create'] = time();
|
||||
$data['edit_by'] = 89;
|
||||
$data['create_by'] = 89;
|
||||
$db->insert("TheTool_CalendarQueue", $data);
|
||||
}
|
||||
|
||||
$res = $db->select("cal_events", 'id,microsoft_id,name,microsoft_ical_uid,start_time,end_time,calendar_id', "id != '" . $id . "' AND microsoft_ical_uid = '" . $result->microsoft_ical_uid . "' ");
|
||||
while ($row = $db->fetch_object($res)) {
|
||||
$updateArray = [];
|
||||
@@ -1173,17 +1644,19 @@ WHERE `TimerecordingCategory`.`hourday`!='1' AND `TimerecordingCategory`.`hourda
|
||||
$rescal = $db->select("cal_calendars", "id,ms_user_id", "id = '" . $row->calendar_id . "' LIMIT 1");
|
||||
$resultcal = $db->fetch_object($rescal);
|
||||
|
||||
$data = [];
|
||||
$data['ms_user_id'] = $resultcal->ms_user_id;
|
||||
$data['ms_event_id'] = $row->microsoft_id;
|
||||
$data['data'] = $json_data;
|
||||
$data['type'] = 'u';
|
||||
$data['status'] = 'p';
|
||||
$data['edit'] = time();
|
||||
$data['create'] = time();
|
||||
$data['edit_by'] = 89;
|
||||
$data['create_by'] = 89;
|
||||
$db->insert("TheTool_CalendarQueue", $data);
|
||||
if (!empty($row->microsoft_id) && !empty($resultcal->ms_user_id)) {
|
||||
$data = [];
|
||||
$data['ms_user_id'] = $resultcal->ms_user_id;
|
||||
$data['ms_event_id'] = $row->microsoft_id;
|
||||
$data['data'] = $json_data;
|
||||
$data['type'] = 'u';
|
||||
$data['status'] = 'p';
|
||||
$data['edit'] = time();
|
||||
$data['create'] = time();
|
||||
$data['edit_by'] = 89;
|
||||
$data['create_by'] = 89;
|
||||
$db->insert("TheTool_CalendarQueue", $data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1234,12 +1707,10 @@ WHERE `TimerecordingCategory`.`hourday`!='1' AND `TimerecordingCategory`.`hourda
|
||||
$data['rrule_frequency'] = 'DAILY';
|
||||
}
|
||||
|
||||
// Falls benötigt, kann der Start-Datum-Wert übernommen werden.
|
||||
if (!empty($graph['range']['startDate'])) {
|
||||
$data['startDate'] = $graph['range']['startDate'];
|
||||
}
|
||||
|
||||
// Wiederherstellen des Endbereichs
|
||||
if (!empty($graph['range']['type'])) {
|
||||
switch ($graph['range']['type']) {
|
||||
case 'endDate':
|
||||
|
||||
@@ -29,21 +29,129 @@ const fileTypeClasses = {
|
||||
let calendar;
|
||||
let calendarEl = document.getElementById('calendar');
|
||||
calendarRights = JSON.parse(calendarRights);
|
||||
/*function reinitializeAttendeesSelect() {
|
||||
var selectedCalendarId = $('#calendar-users').val();
|
||||
var selectedOption = $('#calendar-users option:selected');
|
||||
var hasMicrosoftId = selectedOption.data('has-microsoft-id');
|
||||
if ($('#calendar-attendees').hasClass('select2-hidden-accessible')) {
|
||||
$('#calendar-attendees').select2('destroy');
|
||||
}
|
||||
if (hasMicrosoftId == '1') {
|
||||
$('#calendar-attendees').select2({
|
||||
tags: true,
|
||||
tokenSeparators: [',', ' '],
|
||||
dropdownParent: jQuery('#relContainer'),
|
||||
placeholder: "Teilnehmer auswählen oder eingeben",
|
||||
templateResult: function(data) {
|
||||
if (!data.id) return data.text;
|
||||
var $option = $(data.element);
|
||||
var hasMs = $option.data('has-microsoft-id');
|
||||
|
||||
if (hasMs == '0') {
|
||||
return $('<span style="color: #dc3545; font-weight: bold;">' + data.text + '</span>');
|
||||
}
|
||||
return data.text;
|
||||
},
|
||||
templateSelection: function(data) {
|
||||
if (!data.id) return data.text;
|
||||
var $option = $(data.element);
|
||||
var hasMs = $option.data('has-microsoft-id');
|
||||
|
||||
if (hasMs == '0') {
|
||||
return $('<span style="color: #dc3545; font-weight: bold;">' + data.text + '</span>');
|
||||
}
|
||||
return data.text;
|
||||
}
|
||||
});
|
||||
} else {
|
||||
$('#calendar-attendees').select2({
|
||||
dropdownParent: jQuery('#relContainer'),
|
||||
placeholder: "Teilnehmer auswählen (Freitext nicht verfügbar)",
|
||||
closeOnSelect: false,
|
||||
templateResult: function(data) {
|
||||
if (!data.id) return data.text;
|
||||
var $option = $(data.element);
|
||||
var hasMs = $option.data('has-microsoft-id');
|
||||
|
||||
if (hasMs == '0') {
|
||||
return $('<span style="color: #dc3545; font-weight: bold;">' + data.text + '</span>');
|
||||
}
|
||||
return data.text;
|
||||
},
|
||||
templateSelection: function(data) {
|
||||
if (!data.id) return data.text;
|
||||
var $option = $(data.element);
|
||||
var hasMs = $option.data('has-microsoft-id');
|
||||
|
||||
if (hasMs == '0') {
|
||||
return $('<span style="color: #dc3545; font-weight: bold;">' + data.text + '</span>');
|
||||
}
|
||||
return data.text;
|
||||
}
|
||||
});
|
||||
}
|
||||
}*/
|
||||
function reinitializeAttendeesSelect() {
|
||||
var selectedCalendarId = $('#calendar-users').val();
|
||||
var selectedOption = $('#calendar-users option:selected');
|
||||
var hasMicrosoftId = selectedOption.data('has-microsoft-id');
|
||||
|
||||
// ÄNDERUNG: Verstecke/Deaktiviere Teilnehmer-Zeile wenn keine Microsoft-ID
|
||||
if (hasMicrosoftId == '0' || hasMicrosoftId === 0 || !hasMicrosoftId) {
|
||||
// Verstecke die gesamte Teilnehmer-Zeile
|
||||
$('#calendar-attendees').closest('.row').hide();
|
||||
// Optional: Leere auch die Auswahl
|
||||
$('#calendar-attendees').val(null).trigger('change');
|
||||
return; // Beende Funktion früh
|
||||
} else {
|
||||
// Zeige die Teilnehmer-Zeile wieder an
|
||||
$('#calendar-attendees').closest('.row').show();
|
||||
}
|
||||
// Zerstöre bestehende Select2 Instanz
|
||||
if ($('#calendar-attendees').hasClass('select2-hidden-accessible')) {
|
||||
$('#calendar-attendees').select2('destroy');
|
||||
}
|
||||
|
||||
|
||||
// ÄNDERUNG: Initialisiere mit tags (Freitext erlaubt)
|
||||
$('#calendar-attendees').select2({
|
||||
tags: true,
|
||||
tokenSeparators: [',', ' '],
|
||||
dropdownParent: jQuery('#relContainer'),
|
||||
placeholder: "Teilnehmer auswählen oder eingeben",
|
||||
templateResult: function(data) {
|
||||
if (!data.id) return data.text;
|
||||
var $option = $(data.element);
|
||||
var hasMs = $option.data('has-microsoft-id');
|
||||
|
||||
if (hasMs == '0') {
|
||||
return $('<span style="">' + data.text + '</span>');
|
||||
}
|
||||
return data.text;
|
||||
},
|
||||
templateSelection: function(data) {
|
||||
if (!data.id) return data.text;
|
||||
var $option = $(data.element);
|
||||
var hasMs = $option.data('has-microsoft-id');
|
||||
|
||||
if (hasMs == '0') {
|
||||
return $('<span style="">' + data.text + '</span>');
|
||||
}
|
||||
return data.text;
|
||||
}
|
||||
});
|
||||
}
|
||||
function formatFileSize(bytes) {
|
||||
// Wenn die Dateigröße größer als 1 MB ist
|
||||
if (bytes >= 1024 * 1024) {
|
||||
const megabytes = bytes / (1024 * 1024);
|
||||
return megabytes.toFixed(2) + ' MB';
|
||||
}
|
||||
// Wenn die Dateigröße größer als 1 KB ist
|
||||
else if (bytes >= 1024) {
|
||||
const kilobytes = bytes / 1024;
|
||||
return kilobytes.toFixed(2) + ' KB';
|
||||
}
|
||||
// Wenn die Dateigröße kleiner als 1 KB ist (also in Bytes)
|
||||
else {
|
||||
return Math.round(bytes) + ' Bytes'; // Keine Nachkommastellen
|
||||
return Math.round(bytes) + ' Bytes';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -70,7 +178,7 @@ document.addEventListener('DOMContentLoaded', function () {
|
||||
});
|
||||
|
||||
|
||||
$.post(requestUrl, {visibleCalendars: visibleCalendars, visibleCancellation: 1}, function (data) {
|
||||
$.post(requestUrl, {visibleCalendars: visibleCalendars, visibleCancellation: 0}, function (data) {
|
||||
|
||||
}, 'json').done(function (json) {
|
||||
if (json.success == true) {
|
||||
@@ -2594,15 +2702,6 @@ $(document).ready(function () {
|
||||
}
|
||||
);
|
||||
|
||||
$('.select2-multiple-tag').select2(
|
||||
{
|
||||
tags: true,
|
||||
tokenSeparators: [',', ' '],
|
||||
dropdownParent: jQuery('#relContainer')
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
// $(document).on("select2:opening", (e) => {
|
||||
// $('.modal-body').css('overflow', 'visible');
|
||||
// });
|
||||
@@ -2637,7 +2736,6 @@ $(document).ready(function () {
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
$.post(requestUrl, {
|
||||
visibleCalendars: visibleCalendars,
|
||||
visibleCalendarTypes: visibleCalendarTypes,
|
||||
@@ -2902,5 +3000,8 @@ $(document).ready(function () {
|
||||
localsorageEvent = JSON.parse(create_event);
|
||||
$('#EventModal').modal('show');
|
||||
}
|
||||
|
||||
$('body').on('change', '#calendar-users', function() {
|
||||
reinitializeAttendeesSelect();
|
||||
});
|
||||
reinitializeAttendeesSelect();
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user