diff --git a/application/config/abgabe.php b/application/config/abgabe.php index 82782b043..90aedbd8b 100644 --- a/application/config/abgabe.php +++ b/application/config/abgabe.php @@ -41,3 +41,5 @@ $config['STG_MOODLE_LINK'] = 'https://moodle.technikum-wien.at/course/view.php?i $config['ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT'] = true; $config['ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER'] = true; + +$config['BETREUER_SAMMELMAIL_BUTTON_STUDENT'] = true; diff --git a/application/controllers/api/frontend/v1/Abgabe.php b/application/controllers/api/frontend/v1/Abgabe.php index b37c64713..af598a345 100644 --- a/application/controllers/api/frontend/v1/Abgabe.php +++ b/application/controllers/api/frontend/v1/Abgabe.php @@ -89,13 +89,15 @@ class Abgabe extends FHCAPI_Controller $abgabetypenBetreuer = $this->config->item('ALLOWED_ABGABETYPEN_BETREUER'); $ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT = $this->config->item('ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT'); $ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER = $this->config->item('ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER'); + $BETREUER_SAMMELMAIL_BUTTON_STUDENT = $this->config->item('BETREUER_SAMMELMAIL_BUTTON_STUDENT'); $ret = array( 'old_abgabe_beurteilung_link' => $old_abgabe_beurteilung_link, 'turnitin_link' => $turnitin_link, 'abgabetypenBetreuer' => $abgabetypenBetreuer, 'ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT' => $ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT, - 'ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER' => $ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER + 'ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER' => $ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER, + 'BETREUER_SAMMELMAIL_BUTTON_STUDENT' => $BETREUER_SAMMELMAIL_BUTTON_STUDENT, ); $this->terminateWithSuccess($ret); @@ -373,6 +375,8 @@ class Abgabe extends FHCAPI_Controller $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); } + $this->checkPaabgabeDeadline($paabgabe_id); + $this->checkProjektarbeitForFinishedStatus($projektarbeit_id); $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID()); @@ -444,6 +448,36 @@ class Abgabe extends FHCAPI_Controller } } + + // validate paabgabe deadline against servertime just in case a student spoofs their local clock and thus + // unlocks the upload ui + private function checkPaabgabeDeadline($paabgabe_id) { + $this->load->model('education/Paabgabe_model', 'PaabgabeModel'); + + $result = $this->PaabgabeModel->load($paabgabe_id); + $paabgabeArr = $this->getDataOrTerminateWithError($result, 'general'); + + if (count($paabgabeArr) > 0) { + $paabgabe = $paabgabeArr[0]; + } else { + $this->terminateWithError($this->p->t('abgabetool', 'c4projektabgabeNichtGefunden'), 'general'); + } + + // in that case any submission date is fine + if($paabgabe->fixtermin === false) return; + + $tz = new DateTimeZone('Europe/Berlin'); + $now = new DateTimeImmutable('now', $tz); + $deadline = DateTimeImmutable::createFromFormat( + 'Y-m-d H:i:s', + $paabgabe->datum . ' 23:59:59', + $tz + ); + + if($now >= $deadline) { + $this->terminateWithError($this->p->t('abgabetool', 'c4deadlineExceeded')); + } + } /** * tabulator tabledata fetch for abgabetool/mitarbeiter @@ -473,6 +507,15 @@ class Abgabe extends FHCAPI_Controller $projektarbeiten = $this->ProjektarbeitModel->getMitarbeiterProjektarbeiten(getAuthUID(), $showAllBool); + $mapFunc = function($projektarbeit) { + return $projektarbeit->projektarbeit_id; + }; + $projektarbeiten_ids = array_map($mapFunc, $projektarbeiten->retval); + + $ret = $this->ProjektarbeitModel->getProjektarbeitenAbgabetermine($projektarbeiten_ids); + $projektabgaben = $this->getDataOrTerminateWithError($ret, 'general'); + + forEach($projektarbeiten->retval as $pa) { $result = $this->ProjektarbeitModel->getProjektbetreuerAnrede($pa->betreuer_person_id); @@ -489,6 +532,20 @@ class Abgabe extends FHCAPI_Controller Events::trigger('projektbeurteilung_formular_link', $pa->betreuerart_kurzbz, APP_ROOT, $pa->projektarbeit_id, $pa->student_uid, $returnFunc); $pa->beurteilungLinkNew = $newLink; $pa->beurteilungLinkOld = $oldLink; + + // has previously been retrieved via getStudentProjektabgaben but is fetched in advance to avoid having to reload abgaben + $projektarbeitIsCurrent = false; + $returnFunc = function ($result) use (&$projektarbeitIsCurrent) { + $projektarbeitIsCurrent = $result; + }; + Events::trigger('projektarbeit_is_current', $pa->projektarbeit_id, $returnFunc); + $pa->isCurrent = $projektarbeitIsCurrent; + + $filterFunc = function($projektabgabe) use ($pa) { + return $projektabgabe->projektarbeit_id == $pa->projektarbeit_id; + }; + + $pa->abgabetermine = array_values(array_filter($projektabgaben, $filterFunc)); } @@ -544,7 +601,18 @@ class Abgabe extends FHCAPI_Controller 'insertamum' => date('Y-m-d H:i:s') ) ); - $this->logLib->logInfoDB(array('paabgabe created',$result, getAuthUID(), getAuthPersonId())); + $this->logLib->logInfoDB(array('paabgabe created',array( + 'projektarbeit_id' => $projektarbeit_id, + 'paabgabetyp_kurzbz' => $paabgabetyp_kurzbz, + 'fixtermin' => $fixtermin, + 'datum' => $datum, + 'kurzbz' => $kurzbz, + 'note' => $note, + 'beurteilungsnotiz' => $beurteilungsnotiz, + 'upload_allowed' => $upload_allowed, + 'insertvon' => getAuthUID(), + 'insertamum' => date('Y-m-d H:i:s') + ), getAuthUID(), getAuthPersonId())); } else { // load existing entry of paabgabe and check if note has changed to negativ, to avoid sending when // only notiz has changed. @@ -718,7 +786,16 @@ class Abgabe extends FHCAPI_Controller $abgaben[]= getData($this->PaabgabeModel->load($dataAbgabe))[0]; } - $this->logLib->logInfoDB(array('serientermin angelegt',$res, getAuthUID(), getAuthPersonId())); + $this->logLib->logInfoDB(array('serientermin angelegt',array( + 'projektarbeit_id' => $projektarbeit_id, + 'paabgabetyp_kurzbz' => $paabgabetyp_kurzbz, + 'fixtermin' => $fixtermin, + 'datum' => $datum, + 'kurzbz' => $kurzbz, + 'upload_allowed' => $upload_allowed, + 'insertvon' => getAuthUID(), + 'insertamum' => date('Y-m-d H:i:s') + ), getAuthUID(), getAuthPersonId())); $this->terminateWithSuccess($abgaben); } @@ -1167,7 +1244,7 @@ class Abgabe extends FHCAPI_Controller $email = $this->getProjektbetreuerEmailByProjektarbeitID($projektarbeit_id); - if(!$email) $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachter'), 'general'); + if(!$email) $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachterv2'), 'general'); $mailres = sendSanchoMail( 'ParbeitsbeurteilungEndupload', @@ -1180,7 +1257,7 @@ class Abgabe extends FHCAPI_Controller if(!$mailres) { - $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachter'), 'general'); + $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachterv2'), 'general'); } // 2. Begutachter mail, wenn Endabgabe, mit Token wenn extern @@ -1200,14 +1277,14 @@ class Abgabe extends FHCAPI_Controller if (!$tokenGenRes) { - $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailZweitBegutachter'), 'general'); + $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailZweitBegutachterv2'), 'general'); } $begutachterMitTokenRetval = getData($this->ProjektbetreuerModel->getZweitbegutachterWithToken($bperson_id, $projektarbeit_id, $studentUser->uid, $begutachter->person_id)); if (!$begutachterMitTokenRetval && count($begutachterMitTokenRetval) <= 0) { - $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailZweitBegutachter'), 'general'); + $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailZweitBegutachterv2'), 'general'); } $begutachterMitToken = $begutachterMitTokenRetval[0]; @@ -1241,7 +1318,7 @@ class Abgabe extends FHCAPI_Controller if (!$mailres) { - $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachter'), 'general'); + $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachterv2'), 'general'); } } diff --git a/application/controllers/api/frontend/v1/studstatus/Unterbrechung.php b/application/controllers/api/frontend/v1/studstatus/Unterbrechung.php index abf58cf4f..72d5dbccc 100644 --- a/application/controllers/api/frontend/v1/studstatus/Unterbrechung.php +++ b/application/controllers/api/frontend/v1/studstatus/Unterbrechung.php @@ -127,9 +127,9 @@ class Unterbrechung extends FHCAPI_Controller $this->form_validation->set_rules( 'datum_wiedereinstieg', 'Datum Wiedereinstieg', - 'required|callback_isValidDate|callback_isDateInFuture', + 'required|is_valid_date|callback_isDateInFuture', [ - 'isValidDate' => $this->p->t('ui', 'error_invalid_date'), + 'is_valid_date' => $this->p->t('ui', 'error_invalid_date'), 'isDateInFuture' => $this->p->t('ui', 'error_invalid_date') ] ); @@ -209,18 +209,9 @@ class Unterbrechung extends FHCAPI_Controller $this->terminateWithSuccess(getData($result)); } - public function isValidDate($date) - { - try { - new DateTime($date); - } catch (Exception $e) { - return false; - } - return true; - } - public function isDateInFuture($date) { return new DateTime() < new DateTime($date); } } + diff --git a/application/controllers/api/frontend/v1/stv/Student.php b/application/controllers/api/frontend/v1/stv/Student.php index 2721bbd6f..2fb354f0c 100644 --- a/application/controllers/api/frontend/v1/stv/Student.php +++ b/application/controllers/api/frontend/v1/stv/Student.php @@ -542,6 +542,7 @@ class Student extends FHCAPI_Controller $this->_validate(); + // TODO(chris): This should be in a library $this->load->model('crm/Student_model', 'StudentModel'); $this->load->model('crm/Prestudent_model', 'PrestudentModel'); $this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel'); @@ -793,8 +794,8 @@ class Student extends FHCAPI_Controller $this->form_validation->set_rules('geschlecht', 'Geschlecht', 'callback_requiredIfNotPersonId', [ 'requiredIfNotPersonId' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'geschlecht')]) ]); - $this->form_validation->set_rules('gebdatum', 'Geburtsdatum', ['isValidDate', function($value) { return isValidDate($value); }], [ - 'isValidDate' => $this->p->t('ui', 'error_invalid_date') + $this->form_validation->set_rules('gebdatum', 'Geburtsdatum', 'is_valid_date', [ + 'is_valid_date' => $this->p->t('ui', 'error_invalid_date') ]); //$this->form_validation->set_rules('address[checked]', 'Address', 'required'); $this->form_validation->set_rules('address[plz]', 'PLZ', 'callback_requiredIfAddressFunc', [ diff --git a/application/controllers/jobs/AbgabetoolJob.php b/application/controllers/jobs/AbgabetoolJob.php index 51b2b4920..9b59a72e7 100644 --- a/application/controllers/jobs/AbgabetoolJob.php +++ b/application/controllers/jobs/AbgabetoolJob.php @@ -22,11 +22,272 @@ class AbgabetoolJob extends JOB_Controller $this->_ci->load->model('crm/Student_model', 'StudentModel'); $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel'); $this->_ci->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel'); - + + $this->_ci->load->library('SignatureLib'); + $this->_ci->load->config('abgabe'); $this->loadPhrases([ 'abgabetool' ]); + + + } + + // basically the notifyBetreuerMail function but email goes to assistenz + // and new abgaben are further evaluated for missing signature status + public function notifyAssistenzAboutMissingSignatureUploads() { + $this->_ci->logInfo('Start job FHC-Core->notifyAssistenzAboutMissingSignatureUploads'); + + $interval = $this->_ci->config->item('PAABGABE_EMAIL_JOB_INTERVAL'); + $relevantTypes = $this->_ci->config->item('RELEVANT_PAABGABETYPEN_SAMMELMAIL_ASSISTENZ'); + + $result = $this->_ci->PaabgabeModel->findAbgabenNewOrUpdatedSinceByAbgabedatum($interval, $relevantTypes); + $retval = getData($result); + + // retval are paabgaben joined with projektarbeit and betreuer + if(count($retval) == 0) { + $this->logInfo("Keine Emails über neue Paabgaben an Assistenzen versandt"); + return; + } + + // group changed/new abgaben for projektarbeiten + $projektarbeiten = []; + foreach($retval as $abgabeWithNewUpload) { + // Check if the current item has a 'projektarbeit_id' field. + // Replace 'projektarbeit_id' with the actual key name if it's different. + if (isset($abgabeWithNewUpload->projektarbeit_id)) { + $projektarbeitId = $abgabeWithNewUpload->projektarbeit_id; + + // If the 'projektarbeit_id' is not yet a key in $projektarbeiten, + // initialize it as an empty array. + if (!isset($projektarbeiten[$projektarbeitId])) { + $projektarbeiten[$projektarbeitId] = []; + } + + // check signature for that abgabe, main point of this job + $this->checkAbgabeSignatur($abgabeWithNewUpload, $abgabeWithNewUpload->student_uid); + + // Add the current row to the array associated with its 'projektarbeit_id'. + $projektarbeiten[$projektarbeitId][] = $abgabeWithNewUpload; + } + } + + // for each projektarbeit fetch their assistenz and same them in their own dictionary to avoid too many mails + $assistenzMap = []; + // for each projektarbeit fetch their betreuer and save them in their own dictionary to avoid too many mails + $projektarbeitBetreuerMap = []; + forEach($projektarbeiten as $projektarbeit_id => $abgaben) { + + $assistenzResult = $this->_ci->OrganisationseinheitModel->getAssistenzForOE($abgaben[0]->stg_oe_kurzbz); + + forEach($assistenzResult->retval as $assistenzRow) { + if (!isset($assistenzMap[$assistenzRow->person_id])) { + $assistenzMap[$assistenzRow->person_id] = []; + } + + // Add the current $assistenzRow to the $assistenzMap as an array associated with its projektarbeit_id. + $assistenzMap[$assistenzRow->person_id][] = [$projektarbeit_id, $assistenzRow]; + } + + $betreuerResult = $this->_ci->ProjektbetreuerModel->getAllBetreuerOfProjektarbeit($projektarbeit_id); + + forEach($betreuerResult->retval as $betreuerRow) { + if (!isset($projektarbeitBetreuerMap[$projektarbeit_id])) { + $projektarbeitBetreuerMap[$projektarbeit_id] = []; + } + + // Add the current betreuerRow to the betreuerMap as an array associated with its projektarbeit_id. + $projektarbeitBetreuerMap[$projektarbeit_id][] = $betreuerRow; + } + + } + + $count = 0; + foreach($assistenzMap as $assistenz_person_id => $tupelArr) { + + $abgabenString = '
'; + $hasIssues = false; // Track if this assistant actually needs an email + + foreach($tupelArr as $tupel) { + $projektarbeit_id = $tupel[0]; + $assistenzRow = $tupel[1]; + + $betreuerArray = $projektarbeitBetreuerMap[$projektarbeit_id] ?? []; + $allAbgaben = $projektarbeiten[$projektarbeit_id]; + + // only keep abgaben that are not correctly signed + $issueAbgaben = array_filter($allAbgaben, function($abgabe) { + // We only care about cases where it's explicitly NOT true (false, error, or null) + return $abgabe->signatur !== true; + }); + + // if this specific project has no signature issues, skip to the next project + if(empty($issueAbgaben)) { + continue; + } + + // If we reached here, we have at least one issue to report + $hasIssues = true; + + // Format the Student Name (using the first available abgabe object) + $s = reset($issueAbgaben); + $nameParts = array_filter([$s->titelpre, $s->vorname, $s->nachname, $s->titelpost]); + $studentFullName = implode(' ', $nameParts); + + // Format the Supervisors string + $betreuerStrings = []; + foreach($betreuerArray as $b) { + $bNameParts = array_filter([$b->titelpre, $b->vorname, $b->nachname, $b->titelpost]); + $bFullName = implode(' ', $bNameParts); + $betreuerStrings[] = "{$bFullName} ({$b->betreuerart_kurzbz})"; + } + $allBetreuerFormatted = implode(', ', $betreuerStrings); + + $projektarbeit_titel = $s->titel ?? 'Kein Titel vergeben'; + + // Project Header Section + $abgabenString .= " +
+ Projekt: {$projektarbeit_titel}
+
+ Studierende/r: {$studentFullName} +
+
+ Betreuer: {$allBetreuerFormatted} +
+ + ID: {$projektarbeit_id} | Stg: {$s->stgtyp}{$s->stgkz} ({$s->studiensemester_kurzbz}) + +
"; + + // Start Table + $abgabenString .= ' + + + + + + + + + '; + + $printed = []; // lazy hack to avoid duplicate rows + foreach ($issueAbgaben as $abgabe) { + // if we had this paabgabe already (erstbetreuer/zweitbetreuer fetch achieves duplicates + if(in_array($abgabe->paabgabe_id, $printed)) { + continue; // skip this forEach iteration + } + + $printed[] = $abgabe->paabgabe_id; + + $abgabedatumFormatted = (new DateTime($abgabe->abgabedatum))->format('d.m.Y'); + + // label and color + if ($abgabe->signatur === false) { + $sigLabel = "FEHLENDE SIGNATUR"; + $sigBg = "#dc3545"; + } elseif ($abgabe->signatur === 'error') { + $sigLabel = "PRÜFUNG FEHLGESCHLAGEN"; + $sigBg = "#fd7e14"; + } else { + $sigLabel = "DATEI NICHT GEFUNDEN"; + $sigBg = "#6c757d"; + } + + $abgabenString .= " + + + + + "; + } + + $abgabenString .= '
DatumAbgabe/BezeichnungStatus
{$abgabedatumFormatted} + {$abgabe->bezeichnung} + + + {$sigLabel} + +
'; + } + + $abgabenString .= '
'; + + // only send the email if at least one project had an issue + if ($hasIssues) { + $assistenzRow = $tupelArr[0][1]; + $anrede = $assistenzRow->anrede; + $anredeFillString = $assistenzRow->anrede == "Herr" ? "r" : ""; + $fullFormattedNameString = $assistenzRow->first; + + $path = $this->_ci->config->item('URL_ASSISTENZ'); + $url = CIS_ROOT . $path; + + $body_fields = array( + 'anrede' => $anrede, + 'anredeFillString' => $anredeFillString, + 'fullFormattedNameString' => $fullFormattedNameString, + 'abgabenString' => $abgabenString, + 'linkAbgabetool' => $url + ); + + $email = $assistenzRow->uid . "@" . DOMAIN; + + sendSanchoMail( + 'PAANoSigAssSM', + $body_fields, + $email, + $this->p->t('abgabetool', 'c4missingSignatureNotification') + ); + + $count++; + } + } + + $this->_ci->logInfo($count . " Emails bezüglich fehlender Signaturen erfolgreich versandt"); + $this->_ci->logInfo('End job FHC-Core->notifyAssistenzAboutMissingSignatureUploads'); + } + + /** + * helper function to check the signature status of uploaded files for zwischenabgabe & endupload + */ + private function checkAbgabeSignatur($abgabe, $student_uid) { + $paabgabetypenToCheck = $this->config->item('SIGNATUR_CHECK_PAABGABETYPEN'); + + if(!in_array($abgabe->paabgabetyp_kurzbz, $paabgabetypenToCheck)) { + return; + } + + if (!defined('SIGNATUR_URL')) { + $abgabe->signatur = 'error'; + return; + } + + $path = PAABGABE_PATH.$abgabe->paabgabe_id.'_'.$student_uid.'.pdf'; + + $signaturVorhanden = null; // if frontend receives null -> indicates no file found at path + if(file_exists($path)) { + + // Check if the document is signed + $signList = SignatureLib::list($path); + if (is_array($signList) && count($signList) > 0) + { + // The document is signed + $signaturVorhanden = true; + } + elseif ($signList === null) + { + // frontend knows to handle it this way for signatures + $signaturVorhanden = 'error'; + } + else + { + $signaturVorhanden = false; + } + + $abgabe->signatur = $signaturVorhanden; + } } public function notifyAssistenzAboutChangedAbgaben() { @@ -234,11 +495,6 @@ class AbgabetoolJob extends JOB_Controller // get all new or changed termine in interval $result = $this->_ci->PaabgabeModel->findAbgabenNewOrUpdatedSince($interval, $relevantTypes); $retval = getData($result); - - if(count($retval) == 0) { - $this->_ci->logInfo("Keine Emails an Betreuer über neue oder veränderte Termine versandt"); - return; - } // group changed/new abgaben for projektarbeiten $projektarbeiten = []; @@ -248,17 +504,29 @@ class AbgabetoolJob extends JOB_Controller if (isset($newOrChangedAbgabe->projektarbeit_id)) { $projektarbeitId = $newOrChangedAbgabe->projektarbeit_id; + // check if the updatevon field is NOT the same as the student the projektarbeit is assigned to + // since uploading a file to a paabgabe is also putting updateamum & updatevon + // we have our own "student has uploaded a file" emailjob anyways + if($newOrChangedAbgabe->student_uid === $newOrChangedAbgabe->updatevon) { + continue; + } + // If the 'projektarbeit_id' is not yet a key in $projektarbeiten, // initialize it as an empty array. if (!isset($projektarbeiten[$projektarbeitId])) { $projektarbeiten[$projektarbeitId] = []; } - + // Add the current row to the array associated with its 'projektarbeit_id'. $projektarbeiten[$projektarbeitId][] = $newOrChangedAbgabe; } } + if(count($projektarbeiten) == 0) { + $this->_ci->logInfo("Keine Emails an Betreuer über neue oder veränderte Termine versandt"); + return; + } + // for each projektarbeit fetch their betreuer and save them in their own dictionary to avoid too many mails $betreuerMap = []; forEach($projektarbeiten as $projektarbeit_id => $abgaben) { @@ -377,6 +645,11 @@ class AbgabetoolJob extends JOB_Controller ); $email = $betreuerRow->uid ? $betreuerRow->uid."@".DOMAIN : $betreuerRow->private_email; + + if(!$email) { + $this->_ci->logInfo('Could not send Email for Betreuer PersonID: "'.$data->person_id.'".'); + continue; + } // send email with bundled info sendSanchoMail( @@ -500,6 +773,12 @@ class AbgabetoolJob extends JOB_Controller $email = $data->uid ? $data->uid."@".DOMAIN : $data->private_email; + // in rare cases there are betreuer (often zweitbetreuer) without uid and without private email + if(!$email) { + $this->_ci->logInfo('Could not send Email for Betreuer PersonID: "'.$data->person_id.'".'); + continue; + } + // send email with bundled info sendSanchoMail( 'PaabgabeUpdatesBetSM', diff --git a/application/helpers/hlp_common_helper.php b/application/helpers/hlp_common_helper.php index b13d9d44d..06cfa1cfd 100644 --- a/application/helpers/hlp_common_helper.php +++ b/application/helpers/hlp_common_helper.php @@ -91,7 +91,7 @@ function var_dump_to_error_log($parameter) var_dump($parameter); // KEEP IT!!! $ob_get_contents = ob_get_contents(); ob_end_clean(); - error_log(str_replace("\n", '', $ob_get_contents)); // KEEP IT!!! + error_log(str_replace("\n", '', $ob_get_contents) . ', referer: ' . "http".(!empty($_SERVER['HTTPS'])?"s":"")."://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']); // KEEP IT!!! } /** @@ -408,22 +408,6 @@ function findResource($path, $resource, $subdir = false, $extraDir = null) return null; } -/** - * check if String can be converted to a date - */ -function isValidDate($dateString) -{ - try - { - return (new DateTime($dateString)) !== false; - } - catch(Exception $e) - { - return false; - } -} - - // ------------------------------------------------------------------------ // PHP functions that don't exist in older versions // ------------------------------------------------------------------------ @@ -446,7 +430,8 @@ if (!function_exists('array_is_list')) { // ------------------------------------------------------------------------ /** - * check if string can be converted to a date + * Check if the provided parameter is a string containing a valid date + * NOTE: the name is in the "snake case" format because othewise the CI form validation _cannot_ use it */ function is_valid_date($dateString) { diff --git a/application/models/education/Paabgabe_model.php b/application/models/education/Paabgabe_model.php index a883043d3..be42b7660 100644 --- a/application/models/education/Paabgabe_model.php +++ b/application/models/education/Paabgabe_model.php @@ -86,27 +86,38 @@ class Paabgabe_model extends DB_Model return $this->execQuery($query, [$interval, $interval, $relevantTypes]); } - public function findAbgabenNewOrUpdatedSinceByAbgabedatum($interval) { - - $query = "SELECT projektarbeit_id, paabgabe_id, paabgabetyp_kurzbz, fixtermin, datum, kurzbz, campus.tbl_paabgabetyp.bezeichnung, campus.tbl_paabgabe.abgabedatum, - campus.tbl_paabgabe.insertvon, campus.tbl_paabgabe.insertamum, campus.tbl_paabgabe.updatevon, campus.tbl_paabgabe.updateamum, - campus.tbl_paabgabe.note, upload_allowed, beurteilungsnotiz, student_uid, tbl_projektarbeit.note, lehre.tbl_projektarbeit.titel, - lehre.tbl_projektbetreuer.betreuerart_kurzbz, lehre.tbl_projektbetreuer.person_id, - public.tbl_person.anrede, public.tbl_person.titelpre, public.tbl_person.vorname, public.tbl_person.nachname, public.tbl_person.titelpost + public function findAbgabenNewOrUpdatedSinceByAbgabedatum($interval, $relevantTypes = null) { + + $queryParams = [$interval]; + $query = "SELECT projektarbeit_id, paabgabe_id, paabgabetyp_kurzbz, fixtermin, datum, campus.tbl_paabgabe.kurzbz, campus.tbl_paabgabetyp.bezeichnung, campus.tbl_paabgabe.abgabedatum, + campus.tbl_paabgabe.insertvon, campus.tbl_paabgabe.insertamum, campus.tbl_paabgabe.updatevon, campus.tbl_paabgabe.updateamum, + campus.tbl_paabgabe.note, upload_allowed, beurteilungsnotiz, student_uid, tbl_projektarbeit.note, lehre.tbl_projektarbeit.titel, + UPPER(tbl_studiengang.typ) as stgtyp, UPPER(tbl_studiengang.kurzbz) as stgkz, public.tbl_studiengang.studiengang_kz, + public.tbl_studiengang.oe_kurzbz as stg_oe_kurzbz, tbl_lehreinheit.studiensemester_kurzbz, + lehre.tbl_projektbetreuer.betreuerart_kurzbz, lehre.tbl_projektbetreuer.person_id, + public.tbl_person.anrede, public.tbl_person.titelpre, public.tbl_person.vorname, public.tbl_person.nachname, public.tbl_person.titelpost - FROM campus.tbl_paabgabe - JOIN campus.tbl_paabgabetyp USING (paabgabetyp_kurzbz) - JOIN lehre.tbl_projektarbeit USING (projektarbeit_id) - JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id) - JOIN public.tbl_benutzer ON (public.tbl_benutzer.uid = student_uid) - JOIN public.tbl_person ON (public.tbl_benutzer.person_id = public.tbl_person.person_id) + FROM campus.tbl_paabgabe + JOIN campus.tbl_paabgabetyp USING (paabgabetyp_kurzbz) + JOIN lehre.tbl_projektarbeit USING (projektarbeit_id) + JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id) + JOIN lehre.tbl_lehreinheit using(lehreinheit_id) + JOIN lehre.tbl_lehrveranstaltung using(lehrveranstaltung_id) + JOIN public.tbl_studiengang on(lehre.tbl_lehrveranstaltung.studiengang_kz = public.tbl_studiengang.studiengang_kz) + JOIN public.tbl_benutzer ON (public.tbl_benutzer.uid = student_uid) + JOIN public.tbl_person ON (public.tbl_benutzer.person_id = public.tbl_person.person_id) WHERE campus.tbl_paabgabe.abgabedatum IS NOT NULL - AND campus.tbl_paabgabe.abgabedatum >= NOW() - INTERVAL ? - ORDER BY abgabedatum DESC - "; + AND campus.tbl_paabgabe.abgabedatum >= NOW() - INTERVAL ?"; + + if($relevantTypes !== null) { + $query .= " AND campus.tbl_paabgabe.paabgabetyp_kurzbz IN ?"; + $queryParams[]= $relevantTypes; + } - return $this->execQuery($query, [$interval]); + $query .= " ORDER BY abgabedatum DESC"; + + return $this->execQuery($query, $queryParams); } public function loadByIDs($paabgabe_ids) { diff --git a/application/models/education/Projektarbeit_model.php b/application/models/education/Projektarbeit_model.php index 5e453056d..3b1ea55e5 100644 --- a/application/models/education/Projektarbeit_model.php +++ b/application/models/education/Projektarbeit_model.php @@ -354,8 +354,10 @@ class Projektarbeit_model extends DB_Model student_person.nachname as student_nachname, tbl_student.matrikelnr, tbl_lehreinheit.studiensemester_kurzbz, betreuer_benutzer.uid as betreuer_benutzer_uid, + betreuer_person.titelpre as betreuer_titelpre, betreuer_person.vorname as betreuer_vorname, betreuer_person.nachname as betreuer_nachname, + betreuer_person.titelpost as betreuer_titelpost, lehre.tbl_projektbetreuer.betreuerart_kurzbz as betreuerart, lehre.tbl_projektbetreuer.person_id as betreuer_person_id, lehre.tbl_projektarbeit.sprache as sprache, @@ -415,6 +417,50 @@ class Projektarbeit_model extends DB_Model LIMIT 1 ) as zweitbetreuer_full_name, + ( + SELECT titelpre + FROM public.tbl_person + JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id) + LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id) + LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid) + WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id + AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied') + LIMIT 1 + ) + as zweitbetreuer_titelpre, + ( + SELECT vorname + FROM public.tbl_person + JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id) + LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id) + LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid) + WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id + AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied') + LIMIT 1 + ) + as zweitbetreuer_vorname, + ( + SELECT nachname + FROM public.tbl_person + JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id) + LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id) + LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid) + WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id + AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied') + LIMIT 1 + ) + as zweitbetreuer_nachname, + ( + SELECT titelpost + FROM public.tbl_person + JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id) + LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id) + LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid) + WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id + AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied') + LIMIT 1 + ) + as zweitbetreuer_titelpost, ( SELECT COALESCE(tbl_studienplan.orgform_kurzbz, diff --git a/cis/public/coodle.php b/cis/public/coodle.php index 2b8421db0..05eaa41df 100644 --- a/cis/public/coodle.php +++ b/cis/public/coodle.php @@ -1041,7 +1041,7 @@ function sendEmail($coodle_id) ."END:STANDARD\r\n" ."END:VTIMEZONE\r\n" ."BEGIN:VEVENT\r\n" - .$coodle->foldContentLine("ORGANIZER:MAILTO:".$erstellername." <".$coodle->ersteller_uid."@".DOMAIN)."\r\n" + .$coodle->foldContentLine("ORGANIZER:MAILTO:".$erstellername." <".$coodle->ersteller_uid."@".DOMAIN).">\r\n" .rtrim($teilnehmer)."\r\n" ."DTSTART;TZID=Europe/Vienna:".$dtstart."\r\n" ."DTEND;TZID=Europe/Vienna:".$dtend."\r\n" diff --git a/public/dist/js/apps/Abgabetool/Abgabetool.js b/public/dist/js/apps/Abgabetool/Abgabetool.js index 04569cef0..35cec7fde 100644 --- a/public/dist/js/apps/Abgabetool/Abgabetool.js +++ b/public/dist/js/apps/Abgabetool/Abgabetool.js @@ -1,4 +1,4 @@ import t from"../../../../../index.ci.php/public/js/components/primevue/config/config.esm.min.js";import e from"../../../../../index.ci.php/public/js/components/primevue/toast/toast.esm.min.js";import a from"../../../../../index.ci.php/public/js/components/primevue/confirmdialog/confirmdialog.esm.min.js";import i from"../../../../../index.ci.php/public/js/components/primevue/confirmationservice/confirmationservice.esm.min.js";import n from"../../../../js/components/vueDatepicker.js.php";var r={search(t,e){return this.$fhcApi.post("/api/frontend/v1/searchbar/search",t,e)},searchAdvanced(t,e){return this.$fhcApi.post("/api/frontend/v1/searchbar/searchAdvanced",t,e)},searchdummy(t){return this.$fhcApi.post("public/js/apps/api/dummyapi.php/Search",t)}},s={loadCategory(t){return this.$fhcApi.get("/api/frontend/v1/phrasen/loadModule/"+t)},setLanguage(t,e){const a={categories:t,language:e};return this.$fhcApi.post("/api/frontend/v1/phrasen/setLanguage",a)},getLanguage(){return this.$fhcApi.get("/api/frontend/v1/phrasen/getLanguage",{})},getActiveDbLanguages(){return this.$fhcApi.get("/api/frontend/v1/phrasen/getAllLanguages",{})}},o={getHeader(t){return this.$fhcApi.get("/api/frontend/v1/navigation/header",{navigation_page:t})},getMenu:function(t){return this.$fhcApi.get("/api/frontend/v1/navigation/menu",{navigation_page:t})}},l={saveCustomFilter(t){return this.$fhcApi.post("/api/frontend/v1/filter/saveCustomFilter",{filterUniqueId:t.filterUniqueId,filterType:t.filterType,customFilterName:t.customFilterName})},removeCustomFilter(t){return this.$fhcApi.post("/api/frontend/v1/filter/removeCustomFilter",{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterId:t.filterId})},applyFilterFields(t){return this.$fhcApi.post("/api/frontend/v1/filter/applyFilterFields",{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterFields:t.filterFields})},addFilterField(t){return this.$fhcApi.post("/api/frontend/v1/filter/addFilterField",{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterField:t.filterField})},removeFilterField(t){return this.$fhcApi.post("/api/frontend/v1/filter/removeFilterField",{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterField:t.filterField})},getFilterById(t){return this.$fhcApi.get("/api/frontend/v1/filter/getFilter",{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterId:t.filterId})},getFilter(t){return this.$fhcApi.get("/api/frontend/v1/filter/getFilter",{filterUniqueId:t.filterUniqueId,filterType:t.filterType})}},d={abmeldung:{getDetails(t,e){const a="/api/frontend/v1/studstatus/abmeldung/"+(void 0!==t?"getDetailsForAntrag/"+t:"getDetailsForNewAntrag/"+e);return this.$fhcApi.get(a)},create(t,e,a){return this.$fhcApi.post("/api/frontend/v1/studstatus/abmeldung/createAntrag",{studiensemester:t,prestudent_id:e,grund:a},{errorHandling:"strict"})},cancel(t){return Array.isArray(t)?Promise.allSettled(t.map(t=>this.$fhcApi.post("/api/frontend/v1/studstatus/abmeldung/cancelAntrag",{antrag_id:t.studierendenantrag_id},{errorHeader:"#"+t.studierendenantrag_id}))):this.$fhcApi.post("/api/frontend/v1/studstatus/abmeldung/cancelAntrag",{antrag_id:t})}},unterbrechung:{getDetails(t,e){const a="/api/frontend/v1/studstatus/unterbrechung/"+(void 0!==t?"getDetailsForAntrag/"+t:"getDetailsForNewAntrag/"+e);return this.$fhcApi.get(a)},create(t,e,a,i,n){return this.$fhcApi.post("/api/frontend/v1/studstatus/unterbrechung/createAntrag",{studiensemester:t,prestudent_id:e,grund:a,datum_wiedereinstieg:i,attachment:n},{errorHandling:"strict"})},cancel(t){return this.$fhcApi.post("/api/frontend/v1/studstatus/unterbrechung/cancelAntrag",{antrag_id:t},{errorHandling:"strict"})}},wiederholung:{getDetails(t){const e="/api/frontend/v1/studstatus/wiederholung/getDetailsForNewAntrag/"+t;return this.$fhcApi.get(e)},getLvs(t){const e="/api/frontend/v1/studstatus/wiederholung/getLvs/"+t;return this.$fhcApi.get(e)},create(t,e){return this.$fhcApi.post("/api/frontend/v1/studstatus/wiederholung/createAntrag",{prestudent_id:t,studiensemester:e},{errorHandling:"strict"})},cancel(t,e){return this.$fhcApi.post("/api/frontend/v1/studstatus/wiederholung/cancelAntrag",{prestudent_id:t,studiensemester:e},{errorHandling:"strict"})},saveLvs(t,e){return this.$fhcApi.post("/api/frontend/v1/studstatus/wiederholung/saveLvs",{forbiddenLvs:t,mandatoryLvs:e})}},leitung:{getStgs(){return this.$fhcApi.get("/api/frontend/v1/studstatus/leitung/getActiveStgs")},getAntraege(t,e,a){return this.$fhcApi.get("/api/frontend/v1/studstatus/leitung/getAntraege/"+t).then(t=>t.data)},getHistory(t){return this.$fhcApi.get("/api/frontend/v1/studstatus/leitung/getHistory/"+t)},getPrestudents(t,e){return this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/getPrestudents",{query:t},{signal:e,timeout:3e4})},approve(t){return Array.isArray(t)?Promise.allSettled(t.map(t=>this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/approveAntrag",t,{errorHeader:"#"+t.studierendenantrag_id}))):this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/approveAntrag",t)},reject(t){return Array.isArray(t)?Promise.allSettled(t.map(t=>this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/rejectAntrag",t,{errorHeader:"#"+t.studierendenantrag_id}))):this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/rejectAntrag",t)},reopen(t){return Array.isArray(t)?Promise.allSettled(t.map(t=>this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/reopenAntrag",t,{errorHeader:"#"+t.studierendenantrag_id}))):this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/reopenAntrag",t)},pause(t){return Array.isArray(t)?Promise.allSettled(t.map(t=>this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/pauseAntrag",t,{errorHeader:"#"+t.studierendenantrag_id}))):this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/pauseAntrag",t)},unpause(t){return Array.isArray(t)?Promise.allSettled(t.map(t=>this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/unpauseAntrag",t,{errorHeader:"#"+t.studierendenantrag_id}))):this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/unpauseAntrag",t)},object(t){return Array.isArray(t)?Promise.allSettled(t.map(t=>this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/objectAntrag",t,{errorHeader:"#"+t.studierendenantrag_id}))):this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/objectAntrag",t)},approveObjection(t){return Array.isArray(t)?Promise.allSettled(t.map(t=>this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/approveObjection",t,{errorHeader:"#"+t.studierendenantrag_id}))):this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/approveObjection",t)},denyObjection(t){return Array.isArray(t)?Promise.allSettled(t.map(t=>this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/denyObjection",t,{errorHeader:"#"+t.studierendenantrag_id}))):this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/denyObjection",t)}}},c={getView:function(t){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+`/api/frontend/v1/Profil/getView/${t}`,{})},fotoSperre:function(t){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+`/api/frontend/v1/Profil/fotoSperre/${t}`,{})},isStudent:function(t){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/Profil/isStudent",{uid:t})},isMitarbeiter:function(t){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+`/api/frontend/v1/Profil/isMitarbeiter/${t}`,{})},getZustellAdresse:function(){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/Profil/getZustellAdresse",{})},getZustellKontakt:function(){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/Profil/getZustellKontakt",{})},getGemeinden:function(t,e){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+`/api/frontend/v1/Profil/getGemeinden/${t}/${e}`,{})},getAllNationen:function(){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/Profil/getAllNationen",{})}},p={ //! API calls for profil update requests -getStatus:function(){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/getStatus",{})},getTopic:function(){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/getTopic",{})},acceptProfilRequest:function({profil_update_id:t,uid:e,status_message:a,topic:i,requested_change:n}){return this.$fhcApi.post(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/acceptProfilRequest",{profil_update_id:t,uid:e,status_message:a,topic:i,requested_change:n})},denyProfilRequest:function({profil_update_id:t,uid:e,topic:a,status_message:i}){return this.$fhcApi.post(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/denyProfilRequest",{profil_update_id:t,uid:e,topic:a,status_message:i})},insertFile:function(t,e=null){return this.$fhcApi.post(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+`/api/frontend/v1/ProfilUpdate/insertFile/${e}`,t)},getProfilRequestFiles:function(t){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+`/api/frontend/v1/ProfilUpdate/getProfilRequestFiles/${t}`,{})},selectProfilRequest:function(t=null,e=null){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/selectProfilRequest",{...t?{uid:t}:{},...e?{id:e}:{}})},insertProfilRequest:function(t,e,a=null){return this.$fhcApi.post(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/insertProfilRequest",{topic:t,payload:e,...a?{fileID:a}:{}})},updateProfilRequest:function(t,e,a,i=null){return this.$fhcApi.post(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/updateProfilRequest",{topic:t,payload:e,ID:a,...i?{fileID:i}:{}})},deleteProfilRequest:function(t){return this.$fhcApi.post(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/deleteProfilRequest",{requestID:t})}},u={getRoomInfo(t,e,a){return this.$fhcApi.post("/api/frontend/v1/LvPlan/getRoomplan",{ort_kurzbz:t,start_date:e,end_date:a})},getStunden(){return this.$fhcApi.get("/api/frontend/v1/LvPlan/Stunden",{})},getOrtReservierungen(t,e,a){return this.$fhcApi.post(`/api/frontend/v1/LvPlan/getReservierungen/${t}`,{start_date:e,end_date:a})},getLvPlanReservierungen(t,e){return this.$fhcApi.post("/api/frontend/v1/LvPlan/getReservierungen",{start_date:t,end_date:e})},getLehreinheitStudiensemester(t){return this.$fhcApi.get(`/api/frontend/v1/LvPlan/getLehreinheitStudiensemester/${t}`,{})},studiensemesterDateInterval(t){return this.$fhcApi.get(`/api/frontend/v1/LvPlan/studiensemesterDateInterval/${t}`,{})},LvPlanEvents(t,e,a){return this.$fhcApi.get("/api/frontend/v1/LvPlan/LvPlanEvents",{start_date:t,end_date:e,lv_id:a})}},g={verband:{get(){return this.$fhcApi.get("api/frontend/v1/stv/verband")},favorites:{get(){return this.$fhcApi.get("api/frontend/v1/stv/favorites")},set(t){return this.$fhcApi.post("api/frontend/v1/stv/favorites/set",{favorites:t})}}},students:{uid(t,e){let a="api/frontend/v1/stv/students/"+encodeURIComponent(e)+"/uid/"+encodeURIComponent(t);return this.$fhcApi.getUri(a)},prestudent(t,e){let a="api/frontend/v1/stv/students/"+encodeURIComponent(e)+"/prestudent/"+encodeURIComponent(t);return this.$fhcApi.getUri(a)},person(t,e){let a="api/frontend/v1/stv/students/"+encodeURIComponent(e)+"/person/"+encodeURIComponent(t);return this.$fhcApi.getUri(a)},verband(t){return this.$fhcApi.getUri("api/frontend/v1/stv/students/"+t)}},filter:{getStg(){return this.$fhcApi.get("api/frontend/v1/stv/filter/getStg")},setStg(t){return this.$fhcApi.post("api/frontend/v1/stv/filter/setStg",{studiengang_kz:t})}},konto:{tabulatorConfig(t,e){return t.ajaxURL="api/frontend/v1/stv/konto/get",t.ajaxParams=()=>({person_id:e.modelValue.person_id||e.modelValue.map(t=>t.person_id),only_open:e.filter,studiengang_kz:e.studiengang_kz_intern?e.stg_kz:""}),t.ajaxRequestFunc=(t,e,a)=>this.$fhcApi.post(t,a,e),t.ajaxResponse=(t,e,a)=>a.data,t},checkDoubles(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/konto/checkDoubles",e,{confirmErrorHandler:t=>!0})},insert(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/konto/insert",e)},counter(t){return this.$fhcApi.post("api/frontend/v1/stv/konto/counter",t)},edit(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/konto/update",e)},delete(t){return this.$fhcApi.post("api/frontend/v1/stv/konto/delete",{buchungsnr:t})},getBuchungstypen(){return this.$fhcApi.get("api/frontend/v1/stv/konto/getBuchungstypen")}},group:{getGruppen(t,e,a){return this.$fhcApi.get("api/frontend/v1/stv/Gruppen/getGruppen/"+a.id)},deleteGroup(t){return this.$fhcApi.post("api/frontend/v1/stv/Gruppen/deleteGruppe/",t)}},kontakt:{getAdressen(t,e,a){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getAdressen/"+a.id)},addNewAddress(t,e,a){return this.$fhcApi.post(t,"api/frontend/v1/stv/kontakt/addNewAddress/"+e,a)},loadAddress(t){return this.$fhcApi.post("api/frontend/v1/stv/kontakt/loadAddress/",{address_id:t})},updateAddress(t,e,a){return this.$fhcApi.post(t,"api/frontend/v1/stv/kontakt/updateAddress/"+e,a)},deleteAddress(t){return this.$fhcApi.post("api/frontend/v1/stv/kontakt/deleteAddress/",{address_id:t})},getPlaces(t){return this.$fhcApi.get("api/frontend/v1/stv/address/getPlaces/"+t)},getFirmen(t){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getFirmen/"+t)},getNations(){return this.$fhcApi.get("api/frontend/v1/stv/address/getNations/")},getAdressentypen(){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getAdressentypen/")},getBankverbindung(t,e,a){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getBankverbindung/"+a.id)},addNewBankverbindung(t,e,a){return this.$fhcApi.post(t,"api/frontend/v1/stv/kontakt/addNewBankverbindung/"+e,a)},loadBankverbindung(t){return this.$fhcApi.post("api/frontend/v1/stv/kontakt/loadBankverbindung/",{bankverbindung_id:t})},updateBankverbindung(t,e,a){return this.$fhcApi.post(t,"api/frontend/v1/stv/kontakt/updateBankverbindung/"+e,a)},deleteBankverbindung(t){return this.$fhcApi.post("api/frontend/v1/stv/kontakt/deleteBankverbindung/",{bankverbindung_id:t})},getKontakte(t,e,a){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getKontakte/"+a.id)},addNewContact(t,e,a){return this.$fhcApi.post(t,"api/frontend/v1/stv/kontakt/addNewContact/"+e,a)},loadContact(t){return this.$fhcApi.post("api/frontend/v1/stv/kontakt/loadContact/",{kontakt_id:t})},updateContact(t,e,a){return this.$fhcApi.post(t,"api/frontend/v1/stv/kontakt/updateContact/"+e,a)},deleteContact(t){return this.$fhcApi.post("api/frontend/v1/stv/kontakt/deleteContact/",{kontakt_id:t})},getStandorteByFirma(t){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getStandorteByFirma/"+t)},getKontakttypen(){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getKontakttypen/")}},prestudent:{get(t,e){return this.$fhcApi.post("api/frontend/v1/stv/prestudent/get/"+encodeURIComponent(t)+"/"+encodeURIComponent(e))},updatePrestudent(t,e,a){return this.$fhcApi.post(t,"api/frontend/v1/stv/prestudent/updatePrestudent/"+e,a)},getBezeichnungZGV(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getBezeichnungZGV/")},getBezeichnungMZgv(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getBezeichnungMZgv/")},getBezeichnungDZgv(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getBezeichnungDZgv/")},getStgs(){return this.$fhcApi.get("api/frontend/v1/stv/lists/getStgs/")},getAusbildung(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getAusbildung/")},getAufmerksamdurch(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getAufmerksamdurch/")},getBerufstaetigkeit(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getBerufstaetigkeit/")},getTypenStg(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getTypenStg/")},getBisstandort(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getBisstandort/")},getHistoryPrestudent(t,e,a){return this.$fhcApi.get("api/frontend/v1/stv/status/getHistoryPrestudent/"+a.id)},getMaxSem(t){return this.$fhcApi.post("api/frontend/v1/stv/status/getMaxSemester/",{studiengang_kzs:t})},advanceStatus({prestudent_id:t,status_kurzbz:e,studiensemester_kurzbz:a,ausbildungssemester:i}){return this.$fhcApi.post("api/frontend/v1/stv/status/advanceStatus/"+t+"/"+e+"/"+a+"/"+i)},confirmStatus({prestudent_id:t,status_kurzbz:e,studiensemester_kurzbz:a,ausbildungssemester:i}){return this.$fhcApi.post("api/frontend/v1/stv/status/confirmStatus/"+t+"/"+e+"/"+a+"/"+i)},isLastStatus(t){return this.$fhcApi.get("api/frontend/v1/stv/status/isLastStatus/"+t)},deleteStatus({prestudent_id:t,status_kurzbz:e,studiensemester_kurzbz:a,ausbildungssemester:i}){return this.$fhcApi.post("api/frontend/v1/stv/status/deleteStatus/"+t+"/"+e+"/"+a+"/"+i)},getLastBismeldestichtag(){return this.$fhcApi.get("api/frontend/v1/stv/status/getLastBismeldestichtag/")},getHistoryPrestudents(t,e,a){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getHistoryPrestudents/"+a.id)}},status:{insertStatus(t,e,a){return this.$fhcApi.post(t,"api/frontend/v1/stv/status/insertStatus/"+e,a)},loadStatus({prestudent_id:t,status_kurzbz:e,studiensemester_kurzbz:a,ausbildungssemester:i}){return this.$fhcApi.post("api/frontend/v1/stv/status/loadStatus/"+t+"/"+e+"/"+a+"/"+i)},updateStatus(t,{prestudent_id:e,status_kurzbz:a,studiensemester_kurzbz:i,ausbildungssemester:n},r){return this.$fhcApi.post(t,"api/frontend/v1/stv/status/updateStatus/"+e+"/"+a+"/"+i+"/"+n,r)},getStudienplaene(t){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getStudienplaene/"+t)},getStudiengang(t){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getStudiengang/"+t)},getStatusgruende(){return this.$fhcApi.get("api/frontend/v1/stv/status/getStatusgruende/")},getStati(){return this.$fhcApi.get("api/frontend/v1/stv/lists/getStati/")},addStudent(t,e){return this.$fhcApi.post("api/frontend/v1/stv/status/addStudent/"+t,e,{errorHeader:t})},changeStatus(t,e){return this.$fhcApi.post("api/frontend/v1/stv/status/changeStatus/"+t,e,{errorHeader:t})},getStatusarray(){return this.$fhcApi.get("api/frontend/v1/stv/status/getStatusarray/")}},details:{get(t,e){let a="api/frontend/v1/stv/student/get/"+encodeURIComponent(t)+"/"+encodeURIComponent(e);return this.$fhcApi.post(a)},save(t,e,a,i){let n="api/frontend/v1/stv/student/save/"+encodeURIComponent(e)+"/"+encodeURIComponent(a);return this.$fhcApi.post(t,n,i)}},exam:{getPruefungen(t,e,a){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/getPruefungen/"+a.id)},loadPruefung(t){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/loadPruefung/"+t)},getTypenPruefungen(){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/getTypenPruefungen")},getAllLehreinheiten(t){return this.$fhcApi.post("api/frontend/v1/stv/pruefung/getAllLehreinheiten/",t)},getLvsByStudent(t){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/getLvsByStudent/"+t)},getLvsandLesByStudent(t,e){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/getLvsandLesByStudent/"+t+"/"+e)},getLvsAndMas(t){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/getLvsAndMas/"+t)},getMitarbeiterLv(t){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/getMitarbeiterLv/"+t)},getNoten(){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/getNoten")},checkZeugnisnoteLv(t){return this.$fhcApi.post("api/frontend/v1/stv/pruefung/checkZeugnisnoteLv/",t)},addPruefung(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/pruefung/insertPruefung/",e)},updatePruefung(t,e,a){return this.$fhcApi.post(t,"api/frontend/v1/stv/pruefung/updatePruefung/"+e,a)},deletePruefung(t){return this.$fhcApi.post("api/frontend/v1/stv/pruefung/deletePruefung/"+t)}},abschlusspruefung:{getAbschlusspruefung(t,e,a){return this.$fhcApi.get("api/frontend/v1/stv/abschlusspruefung/getAbschlusspruefung/"+a.id)},addNewAbschlusspruefung(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/abschlusspruefung/insertAbschlusspruefung/",e)},loadAbschlusspruefung(t){return this.$fhcApi.post("api/frontend/v1/stv/abschlusspruefung/loadAbschlusspruefung/",{id:t})},updateAbschlusspruefung(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/abschlusspruefung/updateAbschlusspruefung/",e)},deleteAbschlusspruefung(t){return this.$fhcApi.post("api/frontend/v1/stv/abschlusspruefung/deleteAbschlusspruefung/",{id:t})},getTypenAbschlusspruefung(){return this.$fhcApi.get("api/frontend/v1/stv/abschlusspruefung/getTypenAbschlusspruefung/")},getTypenAntritte(){return this.$fhcApi.get("api/frontend/v1/stv/abschlusspruefung/getTypenAntritte/")},getBeurteilungen(){return this.$fhcApi.get("api/frontend/v1/stv/abschlusspruefung/getBeurteilungen/")},getAkadGrade(t){return this.$fhcApi.post("api/frontend/v1/stv/abschlusspruefung/getAkadGrade/",{studiengang_kz:t})},getTypStudiengang(t){return this.$fhcApi.post("api/frontend/v1/stv/abschlusspruefung/getTypStudiengang/",{studiengang_kz:t})},getMitarbeiter(t){return this.$fhcApi.get("api/frontend/v1/stv/abschlusspruefung/getMitarbeiter/"+t)},getPruefer(t){return this.$fhcApi.get("api/frontend/v1/stv/abschlusspruefung/getPruefer/"+t)},getNoten(){return this.$fhcApi.get("api/frontend/v1/stv/abschlusspruefung/getNoten/")},checkForExistingExams(t){return this.$fhcApi.post("api/frontend/v1/stv/abschlusspruefung/checkForExistingExams/",{uids:t})}},grades:{list(){return this.$fhcApi.get("api/frontend/v1/stv/grades/list")},getCertificate(t,e){let a="api/frontend/v1/stv/grades/getCertificate/"+encodeURIComponent(t);return e&&(a=a+"/"+encodeURIComponent(e)),this.$fhcApi.get(a)},getTeacherProposal(t,e){let a="api/frontend/v1/stv/grades/getTeacherProposal/"+encodeURIComponent(t);return e&&(a=a+"/"+encodeURIComponent(e)),this.$fhcApi.get(a)},getRepeaterGrades(t,e){let a="api/frontend/v1/stv/grades/getRepeaterGrades/"+encodeURIComponent(t);return e&&(a=a+"/"+encodeURIComponent(e)),this.$fhcApi.get(a)},updateCertificate({lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:a,note:i,lehrveranstaltung_bezeichnung:n}){return this.$fhcApi.post("api/frontend/v1/stv/grades/updateCertificate",{lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:a,note:i},{errorHeader:n})},deleteCertificate({lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:a,lehrveranstaltung_bezeichnung:i}){return this.$fhcApi.post("api/frontend/v1/stv/grades/deleteCertificate",{lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:a},{errorHeader:i})},copyTeacherProposalToCertificate({lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:a,lehrveranstaltung_bezeichnung:i}){return this.$fhcApi.post("api/frontend/v1/stv/grades/copyTeacherProposalToCertificate",{lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:a},{errorHeader:i})},copyRepeaterGradeToCertificate({studierendenantrag_lehrveranstaltung_id:t,lv_bezeichnung:e}){return this.$fhcApi.post("api/frontend/v1/stv/grades/copyRepeaterGradeToCertificate",{studierendenantrag_lehrveranstaltung_id:t},{errorHeader:e})},getGradeFromPoints(t,e,a,i){const n=i?{errorHandling:!1}:{};return this.$fhcApi.post("api/frontend/v1/stv/grades/getGradeFromPoints",{points:t,lehrveranstaltung_id:e,studiensemester_kurzbz:a},n)}},mobility:{getMobilitaeten(t,e,a){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getMobilitaeten/"+a.id)},getProgramsMobility(){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getProgramsMobility/")},addNewMobility(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/mobility/insertMobility/",e)},loadMobility(t){return this.$fhcApi.get("api/frontend/v1/stv/mobility/loadMobility/"+t)},updateMobility(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/mobility/updateMobility/",e)},deleteMobility(t){return this.$fhcApi.post("api/frontend/v1/stv/mobility/deleteMobility/"+t)},getLVList(t){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getLVList/"+t)},getAllLehreinheiten(t){return this.$fhcApi.post("api/frontend/v1/stv/mobility/getAllLehreinheiten/",t)},getLvsandLesByStudent(t){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getLvsandLesByStudent/"+t)},getPurposes(t,e,a){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getPurposes/"+a.id)},getSupports(t,e,a){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getSupports/"+a.id)},getListPurposes(){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getListPurposes/")},getListSupports(){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getListSupports/")},deleteMobilityPurpose(t){return this.$fhcApi.post("api/frontend/v1/stv/mobility/deleteMobilityPurpose/"+t.bisio_id,t)},addMobilityPurpose(t){return this.$fhcApi.post("api/frontend/v1/stv/mobility/addMobilityPurpose/"+t.bisio_id,t)},deleteMobilitySupport(t){return this.$fhcApi.post("api/frontend/v1/stv/mobility/deleteMobilitySupport/"+t.bisio_id,t)},addMobilitySupport(t){return this.$fhcApi.post("api/frontend/v1/stv/mobility/addMobilitySupport/"+t.bisio_id,t)}},archiv:{tabulatorConfig(t,e){return t.ajaxURL="api/frontend/v1/stv/archiv/get",t.ajaxParams=()=>({person_id:e.modelValue.person_id||e.modelValue.map(t=>t.person_id)}),t.ajaxRequestFunc=(t,e,a)=>this.$fhcApi.post(t,a,e),t.ajaxResponse=(t,e,a)=>a.data,t},getArchivVorlagen(){return this.$fhcApi.post("api/frontend/v1/stv/archiv/getArchivVorlagen")},archive(t){return this.$fhcApi.post("api/frontend/v1/documents/archive",t)},archiveSigned(t){return this.$fhcApi.post("api/frontend/v1/documents/archiveSigned",t)},update(t){return this.$fhcApi.post("api/frontend/v1/stv/archiv/update",t)},delete({akte_id:t,studiengang_kz:e}){return this.$fhcApi.post("api/frontend/v1/stv/archiv/delete",{akte_id:t,studiengang_kz:e})}},documents:{getDocumentsUnaccepted(t,e,a){return this.$fhcApi.get("api/frontend/v1/stv/dokumente/getDocumentsUnaccepted/"+a.id+"/"+a.studiengang_kz)},getDocumentsAccepted(t,e,a){return this.$fhcApi.get("api/frontend/v1/stv/dokumente/getDocumentsAccepted/"+a.id+"/"+a.studiengang_kz)},deleteZuordnung(t){return this.$fhcApi.post("api/frontend/v1/stv/dokumente/deleteZuordnung/"+t.prestudent_id+"/"+t.dokument_kurzbz)},createZuordnung(t){return this.$fhcApi.post("api/frontend/v1/stv/dokumente/createZuordnung/"+t.prestudent_id+"/"+t.dokument_kurzbz)},loadAkte(t){return this.$fhcApi.get("api/frontend/v1/stv/dokumente/loadAkte/"+t)},getDoktypen(){return this.$fhcApi.get("api/frontend/v1/stv/dokumente/getDoktypen/")},updateFile(t,e){return this.$fhcApi.post("api/frontend/v1/stv/dokumente/updateAkte/"+t,e)},deleteFile(t){return this.$fhcApi.post("api/frontend/v1/stv/dokumente/deleteAkte/"+t)},uploadFile(t,e){return this.$fhcApi.post("api/frontend/v1/stv/dokumente/uploadDokument/"+t,e)}},exemptions:{getAnrechnungen(t,e,a){return this.$fhcApi.get("api/frontend/v1/stv/anrechnungen/getAnrechnungen/"+a.id)},getLehrveranstaltungen(t){return this.$fhcApi.get("api/frontend/v1/stv/anrechnungen/getLehrveranstaltungen/"+t)},getBegruendungen(){return this.$fhcApi.get("api/frontend/v1/stv/anrechnungen/getBegruendungen/")},getLvsKompatibel(t){return this.$fhcApi.get("api/frontend/v1/stv/anrechnungen/getLvsKompatibel/"+t)},getLektoren(t){return this.$fhcApi.get("api/frontend/v1/stv/anrechnungen/getLektoren/"+t)},addNewAnrechnung(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/anrechnungen/insertAnrechnung/",e)},loadAnrechnung(t){return this.$fhcApi.get("api/frontend/v1/stv/anrechnungen/loadAnrechnung/"+t)},editAnrechnung(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/anrechnungen/updateAnrechnung/",e)},deleteAnrechnung(t){return this.$fhcApi.post("api/frontend/v1/stv/anrechnungen/deleteAnrechnung/"+t)}},jointstudies:{getStudies(t,e,a){return this.$fhcApi.get("api/frontend/v1/stv/GemeinsameStudien/getStudien/"+a.id)},getTypenMobility(){return this.$fhcApi.get("api/frontend/v1/stv/GemeinsameStudien/getTypenMobility/")},getStudiensemester(){return this.$fhcApi.get("api/frontend/v1/stv/GemeinsameStudien/getStudiensemester/")},getStudyprograms(){return this.$fhcApi.get("api/frontend/v1/stv/GemeinsameStudien/getStudienprogramme/")},getListPartner(){return this.$fhcApi.get("api/frontend/v1/stv/GemeinsameStudien/getPartnerfirmen/")},getStatiPrestudent(){return this.$fhcApi.get("api/frontend/v1/stv/GemeinsameStudien/getStatiPrestudent/")},loadStudy(t){return this.$fhcApi.get("api/frontend/v1/stv/GemeinsameStudien/loadStudie/"+t)},insertStudy(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/GemeinsameStudien/insertStudie/",e)},updateStudy(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/GemeinsameStudien/updateStudie/",e)},deleteStudy(t){return this.$fhcApi.post("api/frontend/v1/stv/GemeinsameStudien/deleteStudie/"+t)}},courselist:{getCourselist(t,e,a){return this.$fhcApi.get("api/frontend/v1/stv/LvTermine/getStundenplan/"+a.student_uid+"/"+a.start_date+"/"+a.end_date+"/"+a.group_consecutiveHours+"/"+a.dbStundenplanTable)},getStudiensemester(){return this.$fhcApi.get("api/frontend/v1/stv/LvTermine/getStudiensemester/")}},configStudent(){return this.$fhcApi.get("api/frontend/v1/stv/config/student")},configStudents(){return this.$fhcApi.get("api/frontend/v1/stv/config/students")}},b={person:{getNotizen(t,e,a){return this.$fhcApi.get("api/frontend/v1/notiz/notizPerson/getNotizen/"+a.id+"/"+a.type)},getUid(){return this.$fhcApi.get("api/frontend/v1/notiz/notizPerson/getUid/")},addNewNotiz(t,e,a){return this.$fhcApi.post(t,"api/frontend/v1/notiz/notizPerson/addNewNotiz/"+e,a)},loadNotiz(t){return this.$fhcApi.post("api/frontend/v1/notiz/notizPerson/loadNotiz/",{notiz_id:t})},loadDokumente(t){return this.$fhcApi.post("api/frontend/v1/notiz/notizPerson/loadDokumente/",{notiz_id:t})},deleteNotiz(t,e,a){return this.$fhcApi.post("api/frontend/v1/notiz/notizPerson/deleteNotiz/",{notiz_id:t,type_id:e,id:a})},updateNotiz(t,e,a){return this.$fhcApi.post(t,"api/frontend/v1/notiz/notizPerson/updateNotiz/"+e,a)},getMitarbeiter(t){return this.$fhcApi.get("api/frontend/v1/notiz/notizPerson/getMitarbeiter/"+t)},isBerechtigt(t,e){return this.$fhcApi.get("api/frontend/v1/notiz/notizPerson/isBerechtigt/")}}},h={person:{getAllBetriebsmittel(t,e,a){return this.$fhcApi.get("api/frontend/v1/betriebsmittel/betriebsmittelP/getAllBetriebsmittel/"+a.type+"/"+a.id)},addNewBetriebsmittel(t,e,a){return this.$fhcApi.post(t,"api/frontend/v1/betriebsmittel/betriebsmittelP/addNewBetriebsmittel/"+e,a)},loadBetriebsmittel(t){return this.$fhcApi.post("api/frontend/v1/betriebsmittel/betriebsmittelP/loadBetriebsmittel/"+t)},updateBetriebsmittel(t,e,a){return this.$fhcApi.post(t,"api/frontend/v1/betriebsmittel/betriebsmittelP/updateBetriebsmittel/"+e,a)},deleteBetriebsmittel(t){return this.$fhcApi.post("api/frontend/v1/betriebsmittel/betriebsmittelP/deleteBetriebsmittel/"+t)},getTypenBetriebsmittel(){return this.$fhcApi.get("api/frontend/v1/betriebsmittel/betriebsmittelP/getTypenBetriebsmittel/")},loadInventarliste(t){return this.$fhcApi.get("api/frontend/v1/betriebsmittel/betriebsmittelP/loadInventarliste/"+t)}}},f={updatePersonUnrulyStatus(t,e){try{const a={person_id:t,unruly:e},i="/api/frontend/v1/checkperson/CheckPerson/updatePersonUnrulyStatus";return this.$fhcApi.post(i,a,null)}catch(t){throw t}},filterPerson(t,e=""){try{const a=e+"/api/frontend/v1/checkperson/CheckPerson/filterPerson";return axios.post(a,t)}catch(t){throw t}}},m={getContentID(t){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/Ort/ContentID",{ort_kurzbz:t})},getRooms(t,e,a,i,n=0){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/Ort/getRooms",{datum:t,von:e,bis:a,typ:i,personenanzahl:n})},getRoomTypes(){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/Ort/getTypes")}},v={content(t,e=null,a=null,i=null){return this.$fhcApi.get("/api/frontend/v1/Cms/content",{content_id:t,...e?{version:e}:{},...a?{sprache:a}:{},...i?{sichtbar:i}:{}})},getNews(t=1,e=10,a){return this.$fhcApi.get("/api/frontend/v1/Cms/getNews",{page:t,page_size:e,sprache:a})},news(t){return this.$fhcApi.get("/api/frontend/v1/Cms/news",{limit:t})},getNewsRowCount:function(){return this.$fhcApi.get("/api/frontend/v1/Cms/getNewsRowCount",{})},getNewsExtra:function(){return this.$fhcApi.get("/api/frontend/v1/Cms/getStudiengangInfoForNews",{})}},y={getStudentenMail(t){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/Lehre/lvStudentenMail",{lehreinheit_id:t})},getLvInfo(t,e){return this.$fhcApi.get(`/api/frontend/v1/Lehre/LV/${t}/${e}`,{})},getStudentPruefungen(t){return this.$fhcApi.get(`/api/frontend/v1/Lehre/Pruefungen/${t}`,{})}},A={getLvMenu(t,e){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+`/api/frontend/v1/LvMenu/getLvMenu/${t}/${e}`,{})}},w={person:{getMessages(t,e,a){return this.$fhcApi.get("api/frontend/v1/messages/messages/getMessages/"+a.id+"/"+a.type+"/"+a.size+"/"+a.page)},getVorlagen(){return this.$fhcApi.get("api/frontend/v1/messages/messages/getVorlagen/")},getMsgVarsLoggedInUser(){return this.$fhcApi.get("api/frontend/v1/messages/messages/getMsgVarsLoggedInUser/")},getMessageVarsPerson(t){return this.$fhcApi.get("api/frontend/v1/messages/messages/getMessageVarsPerson/"+t.id+"/"+t.type_id)},getMsgVarsPrestudent(t){return this.$fhcApi.get("api/frontend/v1/messages/messages/getMsgVarsPrestudent/"+t.id+"/"+t.type_id)},getPersonId(t){return this.$fhcApi.get("api/frontend/v1/messages/messages/getPersonId/"+t.id+"/"+t.type_id)},getUid(t){return this.$fhcApi.get("api/frontend/v1/messages/messages/getUid/"+t.id+"/"+t.type_id)},getDataVorlage(t){return this.$fhcApi.get("api/frontend/v1/messages/messages/getDataVorlage/"+t)},getNameOfDefaultRecipient(t){return this.$fhcApi.get("api/frontend/v1/messages/messages/getNameOfDefaultRecipient/"+t.id+"/"+t.type_id)},getPreviewText(t,e){return this.$fhcApi.post("api/frontend/v1/messages/messages/getPreviewText/"+t.id+"/"+t.type_id,e)},getReplyData(t){return this.$fhcApi.get("api/frontend/v1/messages/messages/getReplyData/"+t)},sendMessageFromModalContext(t,e,a){return this.$fhcApi.post(t,"api/frontend/v1/messages/messages/sendMessage/"+e,a)},sendMessage(t,e){return this.$fhcApi.post("api/frontend/v1/messages/messages/sendMessage/"+t,e)},deleteMessage(t){return this.$fhcApi.post("api/frontend/v1/messages/messages/deleteMessage/"+t)}}},_={getVorlagen(){return this.$fhcApi.get("api/frontend/v1/vorlagen/vorlagen/getVorlagen/")},getVorlagenByLoggedInUser(){return this.$fhcApi.get("api/frontend/v1/vorlagen/vorlagen/getVorlagenByLoggedInUser/")}},$={getStudiensemester:function(){return this.$fhcApi.get("/components/Cis/Mylv/Studiensemester",{})},getAllStudienSemester:function(t=void 0,e=void 0,a=void 0,i=void 0){return this.$fhcApi.get("/api/frontend/v1/Studium/getStudienAllSemester",{studiensemester:t,studiengang:e,semester:a,studienplan:i})},getStudiengaengeForStudienSemester:function(t){return this.$fhcApi.get(`/api/frontend/v1/Studium/getStudiengaengeForStudienSemester/${t}`,{})},getStudienplaeneBySemester:function(t,e){return this.$fhcApi.get("/api/frontend/v1/Studium/getStudienplaeneBySemester",{studiengang:t,studiensemester:e})},getLvPlanForStudiensemester:function(t,e){return this.$fhcApi.get(`/api/frontend/v1/LvPlan/getLvPlanForStudiensemester/${t}/${e}`,{})},getLvEvaluierungInfo:function(t,e){return this.$fhcApi.get(`/api/frontend/v1/Studium/getLvEvaluierungInfo/${t}/${e}`,{})}},k={search:r,phrasen:s,navigation:o,dashboard:{async getViewData(){return this.$fhcApi.get("/api/frontend/v1/Cis4FhcApi/getViewData",null,null)}},filter:l,studstatus:d,profil:c,profilUpdate:p,lvPlan:u,bookmark:{getBookmarks:function(){return this.$fhcApi.get("/api/frontend/v1/Bookmark/getBookmarks",{})},delete:function(t){return this.$fhcApi.get(`/api/frontend/v1/Bookmark/delete/${t}`,{})},update:function({bookmark_id:t,url:e,title:a,tag:i=null}){return this.$fhcApi.post(`/api/frontend/v1/Bookmark/update/${t}`,{url:e,title:a})},insert:function({url:t,title:e,tag:a}){return this.$fhcApi.post("/api/frontend/v1/Bookmark/insert",{url:t,title:e,tag:a})}},stv:g,notiz:b,betriebsmittel:h,checkperson:f,ampeln:{open:function(){return this.$fhcApi.get("/api/frontend/v1/Ampeln/open",{})},all:function(){return this.$fhcApi.get("/api/frontend/v1/Ampeln/all",{})},confirm:function(t){return this.$fhcApi.get(`/api/frontend/v1/Ampeln/confirm/${t}`,{})}},ort:m,cms:v,lehre:y,addons:A,messages:w,vorlagen:_,addons:A,studiengang:{studiengangInformation:function(){return this.$fhcApi.get("/api/frontend/v1/Studgang/getStudiengangInfo",{})},getStudiengangByKz:function(t){return this.$fhcApi.get("/api/frontend/v1/organisation/StudiengangEP/getStudiengangByKz",{studiengang_kz:t})}},menu:{getMenu:function(){return this.$fhcApi.get("/api/frontend/v1/CisMenu/getMenu",{})}},authinfo:{getAuthUID(){return this.$fhcApi.get("/api/frontend/v1/AuthInfo/getAuthUID",{})},getAuthInfo(){return this.$fhcApi.get("/api/frontend/v1/AuthInfo/getAuthInfo",{})}},studium:$,language:{getAll(){return this.$fhcApi.get("/api/frontend/v1/language/get")}}},z={install:(t,e)=>{if(t.config.globalProperties.$fhcApi)return void(e?.factory&&(console.warn("$fhcApi is DEPRECATED!"),t.config.globalProperties.$fhcApi.factory.addEndpoints(e.factory)));function a(t,e,a,i){if("string"==typeof t&&void 0===i)[e,a,i]=[t,e,a],t=void 0;else if(t){if("object"!=typeof t)throw new TypeError("Parameter 1 of _get_config must be an object or a string");void 0===e&&void 0===a&&void 0===i&&(i=t,t=void 0)}if(t){if(!t.clearValidation||!t.setFeedback)throw new TypeError("'form' is not a Form Component");t={clearValidation:t.clearValidation,setFeedback:t.setFeedback},i?i.form=t:i={form:t}}return[e,a,i]}function i(t){const e=t.data;return delete t.data,e.meta?e.meta.response=t:e.meta={response:t},e}FHC_JS_DATA_STORAGE_OBJECT.app_root,FHC_JS_DATA_STORAGE_OBJECT.ci_router;const n=axios.create({timeout:5e5,baseURL:FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/"});n.interceptors.request.use(t=>{if("post"!=t.method||!t.data)return t;if(t.data instanceof FormData)return t;if(!Object.values(t.data).every(t=>!(t instanceof FileList)&&(!Array.isArray(t)||t.every(t=>!(t instanceof File))))){const e=Object.entries(t.data).reduce((t,[e,a])=>{if(a instanceof FileList)for(const i of a)t.FormData.append(e+(a.length>1?"[]":""),i);else Array.isArray(a)?a.every(t=>!(t instanceof File))?t.jsondata[e]=a:a.forEach(i=>t.FormData.append(e+(a.length>1?"[]":""),i)):t.jsondata[e]=a;return t},{FormData:new FormData,jsondata:{}});e.FormData.append("_jsondata",JSON.stringify(e.jsondata)),t.data=e.FormData}return t}),n.interceptors.response.use(e=>("off"==e.config?.errorHandling||!1===e.config?.errorHandling||"fail"==e.config?.errorHandling||e.data.errors&&(e.data.errors=e.data.errors.filter(a=>(e.config[a.type+"ErrorHandler"]||t.config.globalProperties.$fhcApi._defaultErrorHandlers[a.type])(a,e.config))),i(e)),e=>"ERR_CANCELED"==e.code?Promise.reject({handled:!0,...e}):"off"==e.config?.errorHandling||!1===e.config?.errorHandling||"success"==e.config?.errorHandling?Promise.reject(e):e.response?404==e.response.status?(t.config.globalProperties.$fhcAlert.alertDefault("error",e.message,e.request.responseURL,!0),Promise.reject({handled:!0,...e})):(e.response.data.errors=e.response.data.errors.filter(a=>(e.config[a.type+"ErrorHandler"]||t.config.globalProperties.$fhcApi._defaultErrorHandlers[a.type])(a,e.config)),e.response.data.errors.length?Promise.reject(e):Promise.reject({handled:!0,...e})):e.request?(t.config.globalProperties.$fhcAlert.alertDefault("error",e.message,e.request.responseURL),Promise.reject({handled:!0,...e})):(t.config.globalProperties.$fhcAlert.alertError(e.message),Promise.reject({handled:!0,...e}))),t.config.globalProperties.$fhcApi={getUri:t=>(console.warn("$fhcApi.getUri is DEPRECATED! Use $api.getUri instead."),n.getUri({url:t})),get:(t,e,i,r)=>(console.warn("$fhcApi.get is DEPRECATED! Use $api.get instead."),[e,i,r]=a(t,e,i,r),i&&(r?r.params=i:r={params:i}),n.get(e,r)),post:(t,e,i,r)=>(console.warn("$fhcApi.post is DEPRECATED! Use $api.post instead."),[e,i,r]=a(t,e,i,r),n.post(e,i,r)),_defaultErrorHandlers:{validation(e,a){const i=t.config.globalProperties.$fhcAlert;return a?.form?(a.form.clearValidation(),a.form.setFeedback(!1,e.messages),!1):Array.isArray(e.messages)?(e.messages.forEach(i.alertError),!1):"object"!=typeof e.messages||(a?.errorHeader?Object.values(e.messages).forEach(e=>i.alertDefault("error",Array.isArray(a.errorHeader)?t.config.globalProperties.$p.t.apply(null,a.errorHeader):a.errorHeader,e,!0)):Object.entries(e.messages).forEach(([t,e])=>i.alertDefault("error",t,e,!0)),!1)},general(e,a){const i=t.config.globalProperties.$fhcAlert;a?.form?a.form.setFeedback(!1,e.message):a?.errorHeader?i.alertDefault("error",Array.isArray(a.errorHeader)?t.config.globalProperties.$p.t.apply(null,a.errorHeader):a.errorHeader,e.message,!0):i.alertError(e.message)},php(e){const a=t.config.globalProperties.$fhcAlert;var i="";switch(i+="Message: "+e.message+"\n\n",i+="Filename: "+e.filename+"\n",i+="Line Number: "+e.line+"\n",e.backtrace&&e.backtrace.length&&(i+="\nBacktrace: ",e.backtrace.forEach(t=>{i+="\n\tFile: "+t.file+"\n",i+="\tLine: "+t.line+"\n",i+="\tFunction: "+t.function+"\n"})),e.severity){case"Warning":case"Core Warning":case"Compile Warning":case"User Warning":a.alertDefault("warn","PHP "+e.severity,i,!0);break;case"Notice":case"User Notice":case"Runtime Notice":a.alertDefault("info","PHP "+e.severity,i,!0);break;default:i="Type: PHP "+e.severity+"\n\n"+i,a.alertSystemError(i)}},exception(e){const a=t.config.globalProperties.$fhcAlert;var i="";i+="Type: "+e.class+"\n\n",i+="Message: "+e.message+"\n\n",i+="Filename: "+e.filename+"\n",i+="Line Number: "+e.line+"\n",e.backtrace&&e.backtrace.length&&(i+="\nBacktrace: ",e.backtrace.forEach(t=>{i+="\n\tFile: "+t.file+"\n",i+="\tLine: "+t.line+"\n",i+="\tFunction: "+t.function+"\n"})),a.alertSystemError(i)},db(e){const a=t.config.globalProperties.$fhcAlert;var i="";void 0!==e.heading&&(i+=e.heading+"\n\n"),void 0!==e.code&&(i+="Code: "+e.code+"\n\n"),void 0!==e.sql&&(i+="SQL: "+e.sql+"\n\n"),void 0!==e.message?i+="Message: "+e.message+"\n\n":void 0!==e.messages&&(i+="Messages: "+e.messages.join("\n\t")+"\n\n"),void 0!==e.filename&&(i+="Filename: "+e.filename+"\n"),void 0!==e.line&&(i+="Line Number: "+e.line+"\n"),a.alertSystemError(i)},auth(e,a){const i=t.config.globalProperties.$fhcAlert;var n="";n+="Controller name: "+e.controller+"\n",n+="Method name: "+e.method+"\n",n+="Required permissions: "+e.required_permissions,a?.errorHeader?i.alertDefault("error",Array.isArray(a.errorHeader)?t.config.globalProperties.$p.t.apply(null,a.errorHeader):a.errorHeader,e.message,!0):i.alertDefault("error",e.message,n)}}};class r{constructor(e,a){void 0===a?(this.$fhcApi={getUri:e=>(console.warn("$fhcApi.factory is DEPRECATED!"),t.config.globalProperties.$fhcApi.getUri(e)),get:(e,a,i,n)=>(console.warn("$fhcApi.factory is DEPRECATED!"),t.config.globalProperties.$fhcApi.get(e,a,i,n)),post:(e,a,i,n)=>(console.warn("$fhcApi.factory is DEPRECATED!"),t.config.globalProperties.$fhcApi.post(e,a,i,n))},Object.defineProperty(this.$fhcApi,"factory",{get:()=>(console.warn("$fhcApi.factory is DEPRECATED!"),t.config.globalProperties.$fhcApi.factory)}),t.config.globalProperties.$fhcApi.factory=this):Object.defineProperty(this,"$fhcApi",{get(){return(a||this).$fhcApi}}),this.addEndpoints(e,!0)}addEndpoints(t,e){Object.keys(t).forEach(e=>{Object.defineProperty(this,e,{get(){return"function"==typeof t[e]?t[e].bind(this):new r(t[e],this.$fhcApi.factory)}})}),e||console.warn("$fhcApi.factory.addEndpoints() is DEPRECATED!")}}const s=new r(k);e?.factory&&(console.warn("$fhcApi is DEPRECATED!"),s.addEndpoints(e.factory)),t.config.globalProperties.$fhcApi.factory=s,t.provide("$fhcApi",t.config.globalProperties.$fhcApi)}};const T="error",S="retval",F={get:function(t,e,a=null){return F._axiosCall(t,e,"get",a)},post:function(t,e,a=null){return F._axiosCall(t,e,"post",a)},isSuccess:function(t){return!("object"!=typeof t||!t.hasOwnProperty(T)||!t.hasOwnProperty(S)||0!=t.error)},isError:function(t){return!F.isSuccess(t)},hasData:function(t){return!(!F.isSuccess(t)||!("object"==typeof t[S]&&Object.keys(t[S]).length>0||"array"==typeof t[S]&&t[S].length>0||"string"==typeof t[S]&&""!=t[S].trim()||"number"==typeof t[S]))},getData:function(t){return F.hasData(t)?t[S]:null},getError:function(t){return"object"==typeof t&&Object.keys(t).length>0&&t.hasOwnProperty(S)?t[S]:"Generic error"},getErrorCode:function(t){return"object"==typeof t&&t.hasOwnProperty(T)?t[T]:1},_generateRouterURI:function(t){var e=null;return"undefined"!=typeof FHC_JS_DATA_STORAGE_OBJECT&&(e=FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/"+t),e},_printDebug:function(t,e,a){},_axiosCall:function(t,e,a,i){let n={method:a,url:F._generateRouterURI(t),timeout:5e3};if("get"==a?n.params=e:n.data=e,"object"==typeof i)for(var r in i)n[r]=i[r];return axios(n)}},x=document.createElement("div"),C=Vue.createApp({name:"FhcAlertApp",components:{PvToast:e,PvConfirm:a},methods:{mailToUrl:t=>"mailto:"+FHC_JS_DATA_STORAGE_OBJECT.systemerror_mailto+"?subject=Meldung%20Systemfehler&body="+("\n\t\t\t\tDanke, dass Sie uns den Fehler melden. %0D%0A %0D%0A\n\t\t\t\tBitte beschreiben Sie uns ausführlich das Problem.%0D%0A\n\t\t\t\tBsp: Ich habe X ausgewählt und Y angelegt. Beim Speichern erhielt ich die Fehlermeldung. [Optional: Ich habe den Browser Z verwendet.]%0D%0A\n\t\t\t\t-----------------------------------------------------------------------------------------------------------------------------------%0D%0A\n\t\t\t\tPROBLEM: ... %0D%0A %0D%0A %0D%0A\n\n\t\t\t\t-----------------------------------------------------------------------------------------------------------------------------------%0D%0A\n\t\t\t\tFehler URL: "+FHC_JS_DATA_STORAGE_OBJECT.called_path+"/"+FHC_JS_DATA_STORAGE_OBJECT.called_method+"%0D%0A\n\t\t\t\tFehler Meldung: "+t.message.detail+"%0D%0A\n\t\t\t\t-----------------------------------------------------------------------------------------------------------------------------------%0D%0A %0D%0A\n\t\t\t\tWir kümmern uns um eine rasche Behebung des Problems!"),openMessagecard(t){bootstrap.Collapse.getOrCreateInstance(t.target.getAttribute("href")).toggle()}},unmounted(){x.parentElement.removeChild(x)},computed:{showmaillink:function(){return""!==FHC_JS_DATA_STORAGE_OBJECT.systemerror_mailto}},template:'\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t'});C.use(t),C.use(i);const D=C.mount(x);document.body.appendChild(x);var O={install:(t,e)=>{t.config.globalProperties.$p||t.use(N);const a={alertSuccess(t){if(Array.isArray(t))return t.forEach(this.alertSuccess);D.$refs.toast.add({severity:"success",summary:"Info",detail:t,life:1e3})},alertInfo(t){if(Array.isArray(t))return t.forEach(this.alertInfo);D.$refs.toast.add({severity:"info",summary:"Info",detail:t,life:3e3})},alertWarning(t){if(Array.isArray(t))return t.forEach(this.alertWarning);D.$refs.toast.add({severity:"warn",summary:"Achtung",detail:t})},alertError(t){if(Array.isArray(t))return t.forEach(this.alertError);D.$refs.toast.add({severity:"error",summary:"Achtung",detail:t})},alertSystemError(e){if(Array.isArray(e))return e.forEach(this.alertSystemError);D.$refs.alert.add({severity:"error",summary:Vue.computed(()=>t.config.globalProperties.$p.t("alert/systemerror")),detail:e})},confirmDelete:()=>new Promise((e,a)=>{D.$confirm.require({group:"fhcAlertConfirm",header:Vue.computed(()=>t.config.globalProperties.$p.t("alert/attention")),message:Vue.computed(()=>t.config.globalProperties.$p.t("alert/confirm_delete")),acceptLabel:Vue.computed(()=>t.config.globalProperties.$p.t("ui/loeschen")),acceptClass:"p-button-danger",rejectLabel:Vue.computed(()=>t.config.globalProperties.$p.t("ui/abbrechen")),rejectClass:"p-button-secondary",accept(){e(!0)},reject(){e(!1)}})}),confirm:e=>new Promise((a,i)=>{D.$confirm.require({group:e?.group??"fhcAlertConfirm",header:e?.header??Vue.computed(()=>t.config.globalProperties.$p.t("alert/attention")),message:e?.message??"",acceptLabel:e?.acceptLabel??"Ok",acceptClass:e?.acceptClass??"btn btn-primary",rejectLabel:e?.rejectLabel??Vue.computed(()=>t.config.globalProperties.$p.t("ui/abbrechen")),rejectClass:e?.rejectClass??"btn btn-outline-secondary",accept(){a(!0)},reject(){a(!1)}})}),alertDefault(t,e,a,i=!1,n=!1){let r={severity:t,summary:e,detail:a,html:n};i||(r.life=3e3),D.$refs.toast.add(r)},alertMultiple(t,e="info",a="Info",i=!1,n=!1){return!!t.every(t=>"string"==typeof t)&&(t.forEach(t=>this.alertDefault(e,a,t,i,n)),!0)},handleSystemError(t){if(!t.hasOwnProperty("name")||t.name.toLowerCase()!=="AbortError".toLowerCase()){if("string"==typeof t)return a.alertSystemError(t);if(Array.isArray(t)&&t.every(t=>"string"==typeof t))return t.every(a.alertSystemError);if(!t.hasOwnProperty("handled")||!t.handled){if("object"==typeof t&&null!==t){let e="";return t.hasOwnProperty("response")&&t.response?.data?.retval?e+="Error Message: "+(t.response.data.retval.message||t.response.data.retval)+"\r\n":t.hasOwnProperty("message")&&(e+="Error Message: "+t.message.toUpperCase()+"\r\n"),t.hasOwnProperty("config")&&t.config.hasOwnProperty("url")&&(e+="Error ConfigURL: "+t.config.url+"\r\n"),t.hasOwnProperty("stack")&&(e+="Error Stack: "+t.stack+"\r\n"),""==e&&(e="Error Message: "+JSON.stringify(t)+"\r\n"),e+="Error Controller Path: "+FHC_JS_DATA_STORAGE_OBJECT.called_path+"/"+FHC_JS_DATA_STORAGE_OBJECT.called_method,a.alertSystemError(e)}a.alertSystemError("alertSystemError throws Generic Error\r\nError Controller Path: "+FHC_JS_DATA_STORAGE_OBJECT.called_path+"/"+FHC_JS_DATA_STORAGE_OBJECT.called_method)}}},handleSystemMessage(t){if("string"==typeof t)return a.alertWarning(t);if(Array.isArray(t)){if(t.every(t=>"string"==typeof t))return t.every(a.alertWarning);if(t.every(t=>"object"==typeof t)&&null!==msg)return t.every(t=>{t.hasOwnProperty("data")&&t.data.hasOwnProperty("retval")?a.alertWarning(JSON.stringify(t.data.retval)):a.alertSystemError(JSON.stringify(t))})}"object"!=typeof t||null===t?a.alertSystemError("alertSystemError throws Generic Error\r\nError Controller Path: "+FHC_JS_DATA_STORAGE_OBJECT.called_path+"/"+FHC_JS_DATA_STORAGE_OBJECT.called_method):t.hasOwnProperty("data")&&t.data.hasOwnProperty("retval")?a.alertWarning(JSON.stringify(t.data.retval)):a.alertSystemError(JSON.stringify(t))},resetFormValidation(t){const e=new Event("fhc-form-reset");t.querySelectorAll(["[data-fhc-form-validate],[data-fhc-form-error]"]).forEach(t=>t.dispatchEvent(e))},handleFormValidation(t,e){if(void 0===e){if(t&&t.nodeType===Node.ELEMENT_NODE)return e=>a.handleFormValidation(e,t)}else if(400==t?.response?.status){let i=F.getError(t.response.data);"object"!=typeof i&&(i=t.response.data),a.resetFormValidation(e);const n=Object.entries(i).filter(([t,a])=>{const i=e.querySelector('[data-fhc-form-validate="'+t+'"]');return!i||(i.dispatchEvent(new CustomEvent("fhc-form-invalidate",{detail:a})),!1)}).map(t=>t[1]),r=e.querySelector("[data-fhc-form-error]");return void(r&&n.length?r.dispatchEvent(new CustomEvent("fhc-form-error",{detail:n})):n.forEach(a.alertError))}if(400==t?.response?.status){let e=F.getError(t.response.data);a.alertError("object"==typeof e?Object.values(e):e)}else a.handleSystemError(t)}};t.config.globalProperties.$fhcAlert=a,t.provide("$fhcAlert",t.config.globalProperties.$fhcAlert)}},P={install:(t,e)=>{if(t.config.globalProperties.$api)return;function a(t,e){Array.isArray(t)?t.forEach(e):Object.entries(t).forEach(([t,a])=>a.forEach(a=>e(a,t)))}t.config.globalProperties.$fhcAlert||t.use(O);let i={success:!0,fail:!0,combine:{form:["validation","general"],toast:["validation","general","not_found","site_failed"]},handler:{form(t,e){t.clearValidation(),e.forEach(e=>t.setFeedback(!1,e.messages||e.message))},async toast(e){const a=t.config.globalProperties.$p;if(!a)return Promise.reject("Phrasen plugin not loaded!");async function i(t){t=t.reduce((t,e)=>{switch(e.type){case"not_found":case"site_failed":e.message?t[e.message]=[e.url]:t._default=[e.url];break;case"general":t._default||(t._default=[]),t._default.push(e.message);break;case"validation":Object.entries(e.messages).forEach(([e,a])=>{t[e]||(t[e]=[]),Array.isArray(a)?t[e].push(...a):t[e].push(a)})}return t},{});let e=0;const i=await Promise.all(Object.entries(t).sort((t,e)=>["_default"].indexOf(e[0])-["_default"].indexOf(t[0])).map(async([t,i])=>{if("_default"==t){await a.loadCategory("dashboard");t='
'+a.t("dashboard/general")+"
"}else t="
"+t+"
";return e+=i.length,t+"
"+i.join("
")+"
"}));return{counter:e,msgs:i}}let n,r;Array.isArray(e)?({counter:n,msgs:r}=await i(e)):({counter:n,msgs:r}=await Object.entries(e).reduce(async(t,[e,a])=>{const n=await t,{counter:r,msgs:s}=await i(a);return n.counter+=r,n.msgs.push("
"+e+"
"+s.join("")+"
"),n},Promise.resolve({counter:0,msgs:[]}))),await a.loadCategory("ui");const s=a.t("ui/n_errors",{n:n});t.config.globalProperties.$fhcAlert.alertDefault("error",s,"
"+r.join("")+"
",!0,!0)},php(e){a(e,(e,a)=>{var i="";switch(i+="Message: "+e.message+"\n\n",i+="Filename: "+e.filename+"\n",i+="Line Number: "+e.line+"\n",e.backtrace&&e.backtrace.length&&(i+="\nBacktrace: ",e.backtrace.forEach(t=>{i+="\n\tFile: "+t.file+"\n",i+="\tLine: "+t.line+"\n",i+="\tFunction: "+t.function+"\n"})),e.severity){case"Warning":case"Core Warning":case"Compile Warning":case"User Warning":a?a+=": PHP "+e.severity:a="PHP "+e.severity,t.config.globalProperties.$fhcAlert.alertDefault("warn",a,i,!0);break;case"Notice":case"User Notice":case"Runtime Notice":a?a+=": PHP "+e.severity:a="PHP "+e.severity,t.config.globalProperties.$fhcAlert.alertDefault("info",a,i,!0);break;default:i="Type: PHP "+e.severity+"\n\n"+i,a&&(i=a+"\n\n"+i),t.config.globalProperties.$fhcAlert.alertSystemError(i)}})},exception(e){a(e,(e,a)=>{var i="";a&&(i+=a+"\n\n"),i+="Type: "+e.class+"\n\n",i+="Message: "+e.message+"\n\n",i+="Filename: "+e.filename+"\n",i+="Line Number: "+e.line+"\n",e.backtrace&&e.backtrace.length&&(i+="\nBacktrace: ",e.backtrace.forEach(t=>{i+="\n\tFile: "+t.file+"\n",i+="\tLine: "+t.line+"\n",i+="\tFunction: "+t.function+"\n"})),t.config.globalProperties.$fhcAlert.alertSystemError(i)})},db(e){a(e,(e,a)=>{var i="";a&&(i+=a+"\n\n"),void 0!==e.heading&&(i+=e.heading+"\n\n"),void 0!==e.code&&(i+="Code: "+e.code+"\n\n"),void 0!==e.sql&&(i+="SQL: "+e.sql+"\n\n"),void 0!==e.message?i+="Message: "+e.message+"\n\n":void 0!==e.messages&&(i+="Messages: "+e.messages.join("\n\t")+"\n\n"),void 0!==e.filename&&(i+="Filename: "+e.filename+"\n"),void 0!==e.line&&(i+="Line Number: "+e.line+"\n"),t.config.globalProperties.$fhcAlert.alertSystemError(i)})},auth(e){a(e,(e,a)=>{a?a+=": "+e.message:a=e.message;var i="";i+="Controller name: "+e.controller+"\n",i+="Method name: "+e.method+"\n",i+="Required permissions: "+e.required_permissions,t.config.globalProperties.$fhcAlert.alertDefault("error",a,i,!0)})}}};function n(t,e,a,i){if("string"==typeof t&&void 0===i)[e,a,i]=[t,e,a],t=void 0;else if(t){if("object"!=typeof t)throw new TypeError("Parameter 1 of _get_config must be an object or a string");void 0===e&&void 0===a&&void 0===i&&(i=t,t=void 0)}if(t){if(!t.clearValidation||!t.setFeedback)throw new TypeError("'form' is not a Form Component");t={clearValidation:t.clearValidation,setFeedback:t.setFeedback},i?i.form=t:i={form:t}}return[e,a,i]}function r(t){if("string"==typeof t.data||t.data instanceof String)return r({data:t});const e=t.data;return delete t.data,e?(e.meta?e.meta.response=t:e.meta={response:t},e):{meta:{response:t},data:null}}function s(t){if(!1===t||"off"===t)return{...i,success:!1,fail:!1};if(!t||!0===t)return{...i};if("success"===t)return{...i,fail:!1};if("fail"===t)return{...i,success:!1};const{success:e,fail:a,handler:n,combine:r}=t;return t={...i},Object.entries({fail:a,success:e}).forEach(([e,a])=>{void 0!==a&&(t[e]=a)}),Object.entries({handler:n,combine:r}).forEach(([e,a])=>{void 0!==a&&(t[e]={...t[e],...a})}),t}function o(t){const e=s(t?.errorHandling);if(t?.form){const a=e.handler.form;e.handler={...e.handler,form:e=>a(t.form,e)}}else e.combine={...e.combine,form:[]};return e}function l(t){return t.response?404==t.response.status?[{type:"not_found",message:t.message,url:t.request.responseURL}]:null==t.response.data.errors?[]:t.response.data.errors:t.request?[{type:"site_failed",message:t.message,url:t.request.responseURL}]:[{type:"script",message:t.message}]}function d(t,e){const a={},i=[];if(null==e)return{};for(;e.length;)i.push(e.pop());for(var n of i){let i=n.type,s=null;for(var r in t.combine){let e=t.combine[r].includes(i),a=t.handler[r];if(e&&a&&(s=r,"form"==s))break}s&&(i=s);t.handler[i]?(a[i]||(a[i]=[]),Array.isArray(n)?a[i].push(...n):a[i].push(n)):e.push(n)}return a}void 0!==e?.errorHandling&&(i=s(e.errorHandling));const c=axios.create({timeout:5e5,baseURL:FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/"});c.interceptors.request.use(t=>{if("post"!=t.method||!t.data)return t;if(t.data instanceof FormData)return t;if(!Object.values(t.data).every(t=>!(t instanceof FileList)&&(!Array.isArray(t)||t.every(t=>!(t instanceof File))))){const e=Object.entries(t.data).reduce((t,[e,a])=>{if(a instanceof FileList)for(const i of a)t.FormData.append(e+(a.length>1?"[]":""),i);else Array.isArray(a)?a.every(t=>!(t instanceof File))?t.jsondata[e]=a:a.forEach(i=>t.FormData.append(e+(a.length>1?"[]":""),i)):t.jsondata[e]=a;return t},{FormData:new FormData,jsondata:{}});e.FormData.append("_jsondata",JSON.stringify(e.jsondata)),t.data=e.FormData}return t}),c.interceptors.response.use(e=>("off"==e.config?.errorHandling||!1===e.config?.errorHandling||"fail"==e.config?.errorHandling||e.data.errors&&(e.data.errors=e.data.errors.filter(a=>(e.config[a.type+"ErrorHandler"]||t.config.globalProperties.$api._defaultErrorHandlers[a.type])(a,e.config))),r(e)),t=>{if("ERR_CANCELED"==t.code)return Promise.reject({handled:!0,...t});const e=o(t.config);if(!e.fail)return Promise.reject(t);const a=l(t),i=d(e,a);for(var n in i)e.handler[n](i[n]);return a.length?Promise.reject(t):Promise.reject({handled:!0,...t})}),t.config.globalProperties.$api={getUri:t=>c.getUri({url:t}),get:(t,e,a,i)=>([e,a,i]=n(t,e,a,i),a&&(i?i.params=a:i={params:a}),c.get(e,i)),post:(t,e,a,i)=>([e,a,i]=n(t,e,a,i),c.post(e,a,i)),call(e,a,i){if(Array.isArray(e)){const r=t.config.globalProperties.$api;return Promise.allSettled(e.map((t,e)=>(Array.isArray(t)||(t=["#"+e,t]),r.call(t[1],{errorHeader:t[0],errorHandling:!1})))).then(t=>{const[,,e]=n(i,void 0,void 0,a||{}),r=o(e);if(!r.success&&!r.fail)return t;const s={};for(var c of t){const[t,e]="fulfilled"===c.status?[r.success,c.value]:[r.fail,c.reason];if(!t)return;const a=d(r,l(e));for(var p in a)s[p]?s[p][e.config.errorHeader]=a[p]:s[p]={[e.config.errorHeader]:a[p]}}for(var u in s)r.handler[u](s[u]);return t})}let{method:r,url:s,params:c,config:p}=e;return void 0!==a&&(p=a),r||(r="get"),r.toLowerCase&&(r=r.toLowerCase()),"get"==r?this.get(i,s,c,p):"post"==r?this.post(i,s,c,p):void console.error("FhcApi: method not allowed:",r)},getErrorHandler:t=>o(t)},t.provide("$api",t.config.globalProperties.$api)}},E={loadCategory:t=>({method:"get",url:"/api/frontend/v1/phrasen/loadModule/"+t}),setLanguage:(t,e)=>({method:"post",url:"/api/frontend/v1/phrasen/setLanguage",params:{categories:t,language:e}}),getLanguage:()=>({method:"get",url:"/api/frontend/v1/phrasen/getLanguage"}),getActiveDbLanguages:()=>({method:"get",url:"/api/frontend/v1/phrasen/getAllLanguages"})};const j=Vue.reactive({}),B={};let M=Vue.ref(FHC_JS_DATA_STORAGE_OBJECT.user_language),R=Vue.computed(()=>M.value?FHC_JS_DATA_STORAGE_OBJECT.server_languages.find(t=>t.sprache==M.value).LC_Time:null);const L={user_language:M,user_locale:R,setLanguage(t){const e=Object.keys(j);return this.config.globalProperties.$api.call(E.setLanguage(e,t)).then(e=>(e.data.forEach(t=>{j[t.category][t.phrase]=t.text}),M.value=t,e))},loadCategory(t){return Array.isArray(t)?Promise.all(t.map(this.config.globalProperties.$p.loadCategory)):(B[t]||(B[t]=this.config.globalProperties.$api.call(E.loadCategory(t)).then(e=>e?.data?function(t,e){return t.filter(t=>t.category==e).reduce((t,e)=>(t[e.phrase]||(t[e.phrase]=e.text),t),{})}(e.data,t):{}).then(e=>{j[t]=e})),B[t])},t_ref(t,e,a){return console.warn("deprecated"),Vue.computed(()=>this.t(t,e,a))},t(t,e,a){if(void 0===a&&(Array.isArray(t)&&2==t.length||t.split&&2==t.split("/").length)&&(a=e,[t,e]=t.split?t.split("/"):t),void 0===e)return console.error("invalid input",t,e,a),"";let i=Vue.computed(()=>j[t]?function(t,e,a){let i=j[t][e];return i?(a&&(i=i.replace(/\{([^}]*)\}/g,(t,e)=>void 0===a[e]?t:a[e])),i):"<< PHRASE "+e+">>"}(t,e,a):"");return j[t]||this.loadCategory(t),i.value}};var N={install(t,e){t.config.globalProperties.$fhcApi||t.use(z),t.config.globalProperties.$api||t.use(P),t.config.globalProperties.$p={t:L.t,loadCategory:e=>L.loadCategory.call(t,e),setLanguage:e=>L.setLanguage.call(t,e),user_language:M,user_locale:R,t_ref:L.t_ref},t.provide("$p",t.config.globalProperties.$p)}},I=Object.freeze({__proto__:null,default:N,user_locale:R}),H={components:{DmsItem:{emits:["delete"],props:{modelValue:{type:[File,Object],required:!0}},data:()=>({preview:""}),watch:{modelValue(t){"application/x.fhc-dms+json"==t.type&&t.text().then(t=>{const e=JSON.parse(t);this.preview=e.preview||""})}},template:'\n\t
  • \n\t\t\n\t\t{{ modelValue.name }}\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t
  • '}},emits:["update:modelValue"],props:{modelValue:{type:[FileList,Array],required:!0},multiple:Boolean,id:String,name:String,inputClass:[String,Array,Object],noList:Boolean,accept:{type:String,default:""},disabled:{type:Boolean,default:!1}},methods:{stringifyFile:t=>JSON.stringify({lastModified:t.lastModified,lastModifiedDate:t.lastModifiedDate,name:t.name,size:t.size,type:t.type}),addFiles(t){if(!this.multiple)return this.$emit("update:modelValue",t.target.files);const e=new DataTransfer,a=[];for(var i of this.modelValue)e.items.add(i),a.push(this.stringifyFile(i));for(var i of t.target.files)a.indexOf(this.stringifyFile(i))<0&&e.items.add(i);this.$emit("update:modelValue",e.files)},removeFile(t){const e=Array.from(this.modelValue)[t],a=new DataTransfer;for(var i of this.modelValue)i!==e&&a.items.add(i);this.$emit("update:modelValue",a.files)}},watch:{modelValue(t){if(!t)return;if(t instanceof FileList){if(!this.$refs.upload)return;return this.$refs.upload.files=t}const e=new DataTransfer;for(var a of t)if(a instanceof File)e.items.add(a);else{const t=new File([JSON.stringify(a)],a.name,{type:"application/x.fhc-dms+json"});e.items.add(t)}this.$emit("update:modelValue",e.files)}},template:'\n\t
    \n\t\t\n\t\t\n\t
    '},V={name:"BootstrapModal",data:()=>({modal:null,fullscreen:!1}),props:{backdrop:{type:[Boolean,String],default:!0,validator:t=>["static",!0,!1].includes(t)},focus:{type:Boolean,default:!0},keyboard:{type:Boolean,default:!0},noCloseBtn:Boolean,dialogClass:[String,Array,Object],headerClass:{type:[String,Array,Object],default:""},bodyClass:{type:[String,Array,Object],default:"px-4 py-5"},footerClass:{type:[String,Array,Object],default:""},allowFullscreenExpand:{type:Boolean,default:!1}},emits:["hideBsModal","hiddenBsModal","hidePreventedBsModal","showBsModal","shownBsModal","toggleFullscreen"],methods:{dispose(){return this.modal.dispose()},handleUpdate(){return this.modal.handleUpdate()},hide(){return this.modal.hide()},show(t){return this.modal.show(t)},toggle(){return this.modal.toggle()},toggleFullscreen(){this.fullscreen=!this.fullscreen,this.$emit("toggleFullscreen")}},mounted(){this.$refs.modal&&(this.modal=new bootstrap.Modal(this.$refs.modal,{backdrop:this.backdrop,focus:this.focus,keyboard:this.keyboard}))},popup(t,e,a,i){const n=this,r={};void 0!==t&&(r.default=()=>t),void 0!==a&&(r.title=()=>a),void 0!==i&&(r.footer=()=>i);let s=!1;return"undefined"!=typeof primevue&&(s=!0),new Promise((t,a)=>{const i=Vue.createApp({name:"ModalTmpApp",setup:()=>()=>Vue.h(n,{class:"fade",...e,ref:"modal","onHidden.bs.modal":i.unmount},r),mounted(){this.$refs.modal.show()},beforeUnmount(){this.$refs.modal&&(!1!==this.$refs.modal.result?t(this.$refs.modal.result):a())},unmounted(){o.parentElement.removeChild(o)}}),o=document.createElement("div");s&&i.use(primevue.config.default,{zIndex:{overlay:9999}}),Promise.resolve().then(function(){return I}).then(t=>{i.use(t.default),i.mount(o),document.body.appendChild(o)})})},template:''},J={getConfig:()=>({method:"get",url:"/api/frontend/v1/Abgabe/getConfig"}),getConfigStudent:()=>({method:"get",url:"/api/frontend/v1/Abgabe/getConfigStudent"}),getStudentProjektarbeiten:t=>({method:"get",url:"/api/frontend/v1/Abgabe/getStudentProjektarbeiten",params:{uid:t}}),getStudentProjektabgaben:t=>({method:"get",url:"/api/frontend/v1/Abgabe/getStudentProjektabgaben",params:{projektarbeit_id:t.projektarbeit_id,student_uid:t.student_uid}}),postStudentProjektarbeitEndupload:t=>({method:"post",url:"/api/frontend/v1/Abgabe/postStudentProjektarbeitEndupload",params:t,config:{Headers:{"Content-Type":"multipart/form-data"}}}),postStudentProjektarbeitZwischenabgabe:t=>({method:"post",url:"/api/frontend/v1/Abgabe/postStudentProjektarbeitZwischenabgabe",params:t,config:{Headers:{"Content-Type":"multipart/form-data"}}}),getMitarbeiterProjektarbeiten:t=>({method:"get",url:"/api/frontend/v1/Abgabe/getMitarbeiterProjektarbeiten",params:{showall:t}}),postProjektarbeitAbgabe(t){let e=t.datum;if(t.datum instanceof Date){e=`${t.datum.getFullYear()}-${String(t.datum.getMonth()+1).padStart(2,"0")}-${String(t.datum.getDate()).padStart(2,"0")}`}return{method:"post",url:"/api/frontend/v1/Abgabe/postProjektarbeitAbgabe",params:{paabgabe_id:t.paabgabe_id,paabgabetyp_kurzbz:t.bezeichnung.paabgabetyp_kurzbz,datum:e,note:t.note_pk,upload_allowed:!!t.upload_allowed,beurteilungsnotiz:t.beurteilungsnotiz??"",fixtermin:t.fixtermin,insertvon:t.insertvon,kurzbz:t.kurzbz,projektarbeit_id:t.projektarbeit_id,betreuer_person_id:t.betreuer_person_id}}},deleteProjektarbeitAbgabe:t=>({method:"post",url:"/api/frontend/v1/Abgabe/deleteProjektarbeitAbgabe",params:{paabgabe_id:t}}),postSerientermin:(t,e,a,i,n,r,s)=>({method:"post",url:"/api/frontend/v1/Abgabe/postSerientermin",params:{datum:t,paabgabetyp_kurzbz:e,bezeichnung:a,kurzbz:i,upload_allowed:n,projektarbeit_ids:r,fixtermin:s}}),fetchDeadlines:t=>({method:"post",url:"/api/frontend/v1/Abgabe/fetchDeadlines",params:{person_id:t}}),getPaAbgabetypen:()=>({method:"get",url:"/api/frontend/v1/Abgabe/getPaAbgabetypen"}),getNoten:()=>({method:"get",url:"/api/frontend/v1/Abgabe/getNoten"}),getProjektarbeitenForStudiengang:(t,e=0)=>({method:"get",url:"/api/frontend/v1/Abgabe/getProjektarbeitenForStudiengang",params:{studiengang_kz:t,benotet:e}}),getStudiengaenge:()=>({method:"get",url:"/api/frontend/v1/Abgabe/getStudiengaenge"}),postStudentProjektarbeitZusatzdaten:t=>({method:"post",url:"/api/frontend/v1/Abgabe/postStudentProjektarbeitZusatzdaten",params:t,config:{Headers:{"Content-Type":"multipart/form-data"}}}),getSignaturStatusForProjektarbeitAbgaben:(t,e)=>({method:"post",url:"/api/frontend/v1/Abgabe/getSignaturStatusForProjektarbeitAbgaben",params:{paabgabe_ids:t,student_uid:e}})};const G={name:"FhcOverlay",props:{active:{type:Boolean,default:!1}},template:'\t\n\t\t
    \n\t\t\t\n\t\t
    \n\t'},U={name:"AbgabeStudentDetail",components:{Upload:H,BsModal:V,InputNumber:primevue.inputnumber,Checkbox:primevue.checkbox,Dropdown:primevue.dropdown,Textarea:primevue.textarea,Accordion:primevue.accordion,AccordionTab:primevue.accordiontab,Message:primevue.message,Inplace:primevue.inplace,VueDatePicker:n,FhcOverlay:G},inject:["notenOptions","isMobile","isViewMode","moodle_link"],props:{projektarbeit:{type:Object,default:null},viewMode:{type:Boolean,default:!1}},data:()=>({loading:!1,eidAkzeptiert:!1,enduploadTermin:null,allActiveLanguages:FHC_JS_DATA_STORAGE_OBJECT.server_languages,form:Vue.reactive({sprache:"",abstract:"",abstract_en:"",schlagwoerter:"",schlagwoerter_en:"",kontrollschlagwoerter:"",seitenanzahl:1})}),methods:{getNoteBezeichnung(t){const e=this.notenOptions.find(e=>e.note==t.note);return e?.bezeichnung?e?.positiv?this.$capitalize(this.$p.t("abgabetool/c4positivBenotet"))+" ✅":this.$capitalize(this.$p.t("abgabetool/c4negativBenotet"))+" ❌":!0!==e?.benotbar||t.note?"":this.$capitalize(this.$p.t("abgabetool/c4notYetGraded"))},async validate(t,e=!1){return t.file.length?!e||!1!==await this.$fhcAlert.confirm({message:this.$p.t("abgabetool/confirmEnduploadSpeichern"),acceptLabel:this.$capitalize(this.$p.t("abgabetool/c4AcceptAndProceed")),acceptClass:"p-button-primary",rejectLabel:this.$capitalize(this.$p.t("abgabetool/c4Cancel")),rejectClass:"p-button-secondary"}):(this.$fhcAlert.alertWarning(this.$capitalize(this.$p.t("global/warningChooseFile"))),!1)},async triggerEndupload(){if(!await this.validate(this.enduploadTermin,!0))return!1;const t=new FormData;t.append("paabgabetyp_kurzbz",this.enduploadTermin.paabgabetyp_kurzbz),t.append("projektarbeit_id",this.enduploadTermin.projektarbeit_id),t.append("paabgabe_id",this.enduploadTermin.paabgabe_id),t.append("student_uid",this.projektarbeit.student_uid),t.append("bperson_id",this.projektarbeit.bperson_id),t.append("sprache",this.form.sprache.sprache),t.append("abstract",this.form.abstract),t.append("abstract_en",this.form.abstract_en),t.append("schlagwoerter",this.form.schlagwoerter),t.append("schlagwoerter_en",this.form.schlagwoerter_en),t.append("seitenanzahl",this.form.seitenanzahl);for(let e=0;e{this.handleUploadRes(t,this.enduploadTermin)}).finally(()=>{this.loading=!1}),this.$refs.modalContainerEnduploadZusatzdaten.hide()},downloadAbgabe(t){const e=`/api/frontend/v1/Abgabe/getStudentProjektarbeitAbgabeFile?paabgabe_id=${t.paabgabe_id}&student_uid=${this.projektarbeit.student_uid}&projektarbeit_id=${this.projektarbeit.projektarbeit_id}`;window.open(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+e)},formatDate(t){const e=new Date(t),a=t=>String(t).padStart(2,"0"),i=a(e.getMonth()+1);return`${a(e.getDate())}.${i}.${e.getFullYear()}`},async upload(t){if(!await this.validate(t))return!1;if("end"===t.bezeichnung?.paabgabetyp_kurzbz)this.enduploadTermin=t,this.$refs.modalContainerEnduploadZusatzdaten.show();else{const e=new FormData;e.append("paabgabetyp_kurzbz",t.paabgabetyp_kurzbz),e.append("projektarbeit_id",this.projektarbeit.projektarbeit_id),e.append("paabgabe_id",t.paabgabe_id),e.append("student_uid",this.projektarbeit.student_uid),e.append("bperson_id",this.projektarbeit.bperson_id);for(let a=0;a{this.handleUploadRes(e,t)}).finally(()=>{this.loading=!1})}},handleUploadRes(t,e){"success"==t.meta.status?(this.$fhcAlert.alertSuccess(this.$capitalize(this.$p.t("abgabetool/c4fileUploadSuccessv3"))),e.abgabedatum=(new Date).toISOString().split("T")[0],void 0!==t?.data?.signatur&&(e.signatur=t.data.signatur)):this.$fhcAlert.alertError(this.$capitalize(this.$p.t("abgabetool/c4fileUploadErrorv3"))),t.meta.signaturInfo&&this.$fhcAlert.alertInfo(t.meta.signaturInfo)},getOptionLabel:t=>t.sprache,getTerminNoteBezeichnung(t){const e=this.notenOptions.find(e=>e.note==t.note);return e?e.bezeichnung:""}},watch:{projektarbeit(t){this.form.sprache=t.sprache?this.allActiveLanguages.find(e=>e.sprache==t.sprache):this.allActiveLanguages.find(t=>"German"==t.sprache),this.form.abstract=t.abstract??"",this.form.abstract_en=t.abstract_en??"",this.form.schlagwoerter=t.schlagwoerter??"",this.form.schlagwoerter_en=t.schlagwoerter_en??"",this.form.kontrollschlagwoerter=t.kontrollschlagwoerter??"",this.form.seitenanzahl=t.seitenanzahl??1}},computed:{getMoodleLink(){return this.moodle_link+this.projektarbeit.studiengang_kz},getMessagePtStyle:()=>({root:{style:{margin:"0px"}},wrapper:{style:{padding:"6px"}}}),getEid(){return this.$capitalize(this.$p.t("abgabetool/c4eidesstattlicheErklaerung"))},allowedToSaveZusatzdaten(){return this.form.schlagwoerter.length>0&&this.form.schlagwoerter_en.length>0&&this.form.abstract.length>0&&this.form.abstract_en.length>0&&this.form.seitenanzahl>0},getAllowedToSendEndupload(){return this.eidAkzeptiert&&this.allowedToSaveZusatzdaten},qualityGateTerminAvailable(){let t=!1;return this.projektarbeit?.abgabetermine.forEach(e=>{"qualgate1"!=e.paabgabetyp_kurzbz&&"qualgate2"!=e.paabgabetyp_kurzbz||(t=!0)}),t},getTooltipVerspaetet(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipVerspaetet")),class:"custom-tooltip"}},getTooltipVerpasst(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipVerpasst")),class:"custom-tooltip"}},getTooltipAbzugeben(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipAbzugeben")),class:"custom-tooltip"}},getTooltipStandard(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipStandardv2")),class:"custom-tooltip"}},getTooltipAbgegeben(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipAbgegeben")),class:"custom-tooltip"}},getTooltipFixtermin(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipFixtermin")),class:"custom-tooltip"}},getTooltipAbgabeDetected(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipAbgabeDetected")),class:"custom-tooltip"}},getTooltipNotAllowedToUpload(){return this.isViewMode?{value:this.$capitalize(this.$p.t("abgabetool/c4studentAbgabeNotAllowedInViewMode")),class:"custom-tooltip"}:{value:this.$capitalize(this.$p.t("abgabetool/c4studentAbgabeNotAllowedRegular")),class:"custom-tooltip"}},getTooltipBeurteilungerforderlich(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipBeurteilungerforderlich")),class:"custom-tooltip"}},getTooltipBestanden(){return{value:this.$p.t("abgabetool/c4tooltipBestanden"),class:"custom-tooltip"}},getTooltipNichtBestanden(){return{value:this.$p.t("abgabetool/c4tooltipNichtBestanden"),class:"custom-tooltip"}}},created(){},mounted(){},template:'\n\t\t\n\n\t\t
    \n\t\t\n\t\t\t
    {{$capitalize( $p.t(\'abgabetool/c4abgabeStudentenbereich\') )}}
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t

    {{$capitalize( $p.t(\'person/student\') ) }}: {{projektarbeit?.student}}

    \n\t\t\t\t\t

    {{$capitalize( $p.t(\'abgabetool/c4titel\') ) }}: {{projektarbeit?.titel}}

    \n\t\t\t\t\t

    {{$capitalize( $p.t(\'abgabetool/c4betreuer\') ) }}: {{projektarbeit ? $p.t(\'abgabetool/c4betrart\' + projektarbeit.betreuerart_kurzbz) + \' \' + projektarbeit.betreuer : \'\'}}

    \n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t

    {{ $p.t(\'abgabetool/c4checkoutStgMoodleInfos\') }} \n\t\t\t\t\t\tMoodle\n\t\t\t\t\t

    \n\t\t\t\t
    \n\t\t\t
    \n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t
    \n\t\t\t\t
    {{ $capitalize( $p.t(\'abgabetool/c4keineAbgabetermineGefunden\') )}}
    \n\t\t\t
    \n\t\t\t\n\t\t
    \n\t \t\n\t \t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t \t\n '},q=new Date,Z={name:"AbgabetoolStudent",components:{Accordion:primevue.accordion,AccordionTab:primevue.accordiontab,BsModal:V,AbgabeDetail:U,FhcOverlay:G},provide(){return{notenOptions:Vue.computed(()=>this.notenOptions),isViewMode:Vue.computed(()=>this.isViewMode),moodle_link:Vue.computed(()=>this.moodle_link)}},props:{student_uid_prop:{default:null},viewData:{type:Object,required:!0,default:()=>({uid:""}),validator:t=>t&&t.uid}},data:()=>({activeTabIndex:[0],abgabeTypeOptions:null,phrasenPromise:null,phrasenResolved:!1,loading:!1,notenOptions:null,detail:null,projektarbeiten:null,selectedProjektarbeit:null,moodle_link:null}),methods:{dateDiffInDays(t){let e=t;if(t instanceof Date&&!isNaN(e.getTime())){const a=t.getFullYear(),i=t.getMonth()+1,n=t.getDate(),r=t=>String(t).padStart(2,"0");e=`${a}-${r(i)}-${r(n)}`}const a=luxon.DateTime.now().startOf("day");return luxon.DateTime.fromISO(e).startOf("day").diff(a,"days").values.days},getDateStyleClass(t){const e=new Date(t.datum),a=new Date(t.abgabedatum);t.diffindays=this.dateDiffInDays(t.datum);const i=t.abgabedatum&&a>e;if(t.note){if(Number.isInteger(t.note)){if(this.notenOptions.find(e=>e.note==t.note).positiv)return"bestanden"}return t.note.positiv?"bestanden":"nichtbestanden"}return t.bezeichnung?.benotbar&&e{const i=this.notenOptions?.find(e=>e.note==t.note);i&&i.positiv&&("qualgate1"==t.paabgabetyp_kurzbz?e=!0:"qualgate2"==t.paabgabetyp_kurzbz&&(a=!0))}),e&&a},checkQualityGatesOptional(t){const e=t.find(t=>"qualgate1"==t.paabgabetyp_kurzbz),a=t.find(t=>"qualgate2"==t.paabgabetyp_kurzbz);let i=!0;e&&(i=!1,t.forEach(t=>{const e=this.notenOptions?.find(e=>e.note==t.note);e&&e.positiv&&"qualgate1"==t.paabgabetyp_kurzbz&&(i=!0)}));let n=!0;return a&&(n=!1,t.forEach(t=>{const e=this.notenOptions?.find(e=>e.note==t.note);e&&e.positiv&&"qualgate2"==t.paabgabetyp_kurzbz&&(n=!0)})),i&&n},isPastDate:t=>new Date(t){const a=this.projektarbeiten?.find(e=>e.projektarbeit_id==t.projektarbeit_id);a.abgabetermine=e.data[0].retval;const i=null!==a.note;a.abgabetermine.forEach(t=>{t.file=[],t.allowedToUpload=!1,"end"==t.paabgabetyp_kurzbz?t.allowedToUpload=!this.isPastDate(t.datum)&&this.checkQualityGatesOptional(a.abgabetermine):t.fixtermin?t.allowedToUpload=!this.isPastDate(t.datum):t.allowedToUpload=t.upload_allowed,i&&(t.allowedToUpload=!1),t.bezeichnung=this.abgabeTypeOptions.find(e=>e.paabgabetyp_kurzbz===t.paabgabetyp_kurzbz),t.dateStyle=this.getDateStyleClass(t)}),a.betreuer=this.buildBetreuer(a),a.student_uid=this.student_uid,this.selectedProjektarbeit=a,this.$refs.modalContainerAbgabeDetail.show()}).finally(()=>{this.loading=!1})},centeredTextFormatter:t=>'

    '+t.getValue()+"

    ",detailFormatter(t){const e=t.getValue();return"detailTermine"===e.mode?'
    ':"beurteilungDownload"===e.mode?'
    ':void 0},mailFormatter:t=>'
    ',beurteilungFormatter:t=>t.getValue()?'
    ':"-",buildMailToLink:t=>"mailto:"+t.email,buildBetreuer:t=>(t.btitelpre?t.btitelpre+" ":"")+t.bvorname+" "+t.bnachname+(t.btitelpost?" "+t.btitelpost:""),async setupData(t){const e=t[0]??null;e&&(this.projektarbeiten=e.map(t=>({...t,details:{student_uid:this.student_uid,projektarbeit_id:t.projektarbeit_id,betreuer_person_id:t.bperson_id,betreuerart_kurzbz:t.betreuerart_kurzbz,mode:"detailTermine"},beurteilung1:t.downloadLink1??null,beurteilung2:t.downloadLink2??null,sem:t.studiensemester_kurzbz,stg:t.kurzbzlang,mail:this.buildMailToLink(t),betreuer:this.buildBetreuer(t),typ:t.projekttypbezeichnung,titel:t.titel})))},loadProjektarbeiten(){this.$api.call(J.getStudentProjektarbeiten(this.student_uid)).then(t=>{t?.data&&this.setupData(t.data)})},loadAbgaben(t){return new Promise(e=>{this.$api.call(J.getStudentProjektabgaben(t)).then(t=>{e(t)})})},async setupMounted(){this.loadProjektarbeiten()},getAccTabHeaderForProjektarbeit(t){let e="";return e+=t.titel??this.$p.t("abgabetool/keinTitel"),e},getMailLink:t=>t.email?"mailto:"+t.email:"",getNoteBezeichnung(t){if(t.note&&this.notenOptions){const e=this.notenOptions.find(e=>e.note==t.note);return e?.bezeichnung}return""},handleDownloadBeurteilung1(t){window.open(t.beurteilung1)},handleDownloadBeurteilung2(t){window.open(t.beurteilung2)}},watch:{},computed:{isViewMode(){return this.student_uid!==this.viewData.uid},student_uid(){return this.student_uid_prop||this.viewData?.uid||null}},async created(){this.phrasenPromise=this.$p.loadCategory(["abgabetool","global"]),this.phrasenPromise.then(()=>{this.phrasenResolved=!0}),this.loading=!0,await this.$api.call(J.getNoten()).then(t=>{"success"==t.meta.status&&(this.notenOptions=t.data[0],this.allowedNotenOptions=this.notenOptions.filter(e=>t.data[1].includes(e.note)))}).finally(()=>{this.loading=!1}),this.$api.call(J.getPaAbgabetypen()).then(t=>{this.abgabeTypeOptions=t.data}).catch(t=>{this.loading=!1}),this.$api.call(J.getConfigStudent()).then(t=>{this.moodle_link=t.data?.moodle_link}).catch(t=>{this.loading=!1})},mounted(){this.setupMounted()},template:'\n\n '},W={emits:["dataFetched"],props:{refresh:{type:Boolean},apiFunction:{required:!0,type:Function},apiFunctionParameters:{}},watch:{refresh:function(t,e){this.fetchData()}},data:function(){return{loading:!1,error:!1,errorMessage:null}},created:function(){this.fetchData()},methods:{fetchData:function(){if(this.loading=!0,this.error=!1,this.errorMessage=null,"function"==typeof this.apiFunction){let t=this.apiFunction(this.apiFunctionParameters);t instanceof Promise?t.then(this.successHandler).catch(this.errorHandler).finally(this.finallyHandler):this.setError("The called apiFunction does not return a Promise")}else this.setError("Property apiFunction is not a function")},setError:function(t){this.loading=!1,this.error=!0,this.errorMessage=t},successHandler:function(t){this.$emit("dataFetched",t?t.data:void 0)},errorHandler:function(t){t.response?.data?.retval?this.setError(t.response.data.retval):t.data?.message?this.setError(t.data.message):this.setError(t.message)},finallyHandler:function(){this.loading=!1}},template:'\n\t\t\n\t\t\t
    Loading...
    \n\t\t
    \n\t\t\n\t\t\t
    {{ errorMessage }}
    \n\t\t
    \n\t\t\n\t'},K="Filter Component New Filter";var Y={props:{filters:{type:Array,default:[]},columns:{type:Array,default:[]},fields:{type:Array,default:[]}},emits:{switchFilter:["filterId"],applyFilterConfig:["filterFields"],saveCustomFilter:["customFilterName"]},data:function(){return{currentFields:[]}},computed:{types(){return this.columns.reduce((t,e)=>{let a=e.type.toLowerCase();return a.indexOf("int")>=0?t[e.name]="Numeric":a.indexOf("varchar")>=0||a.indexOf("text")>=0||a.indexOf("bpchar")>=0?t[e.name]="Text":a.indexOf("timestamp")>=0||a.indexOf("date")>=0?t[e.name]="Date":t[e.name]="",t},{})}},watch:{fields(t){this.currentFields=t}},methods:{switchFilter(t){this.$emit("switchFilter",t.currentTarget.value)},applyFilterConfig(){const t=this.currentFields.filter(t=>t.name!=K);t.filter(t=>""==t.condition).length?alert("Please fill all the filter options"):this.$emit("applyFilterConfig",t)},addField(t){this.currentFields.push({name:K})},removeField(t){this.currentFields.splice(t,1)}},template:'\n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t
    \n\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\tFilter {{ index + 1 }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\n\t\t\t\t\t\t\x3c!-- Numeric --\x3e\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t\x3c!-- Text --\x3e\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t\x3c!-- Timestamp and date --\x3e\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\n\t\t\t\t\x3c!-- Filter save options --\x3e\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n\t'},Q={props:{fields:Array,selected:{type:Array,default:[]},names:{type:Object,default:{}}},emits:{hide:["fieldName"],show:["fieldName"]},data:function(){return{selectedFields:[]}},watch:{selected(t){this.selectedFields=t}},methods:{toggle(t){-1!=this.selectedFields.indexOf(t)?(this.selectedFields.splice(this.selectedFields.indexOf(t),1),this.$emit("hide",t)):(this.selectedFields.push(t),this.$emit("show",t))}},template:'\n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\t{{ names[fieldToDisplay] || fieldToDisplay }}\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t\n\t'};const X={jsonLines:"fa-file-lines",xlsx:"fa-file-excel",pdf:"fa-file-pdf",html:"fa-file-code",json:"fa-file",csv:"fa-file-csv"},tt={jsonLines:"Download as JSONLINES",xlsx:"Download as XLSX",pdf:"Download as PDF",html:"Download as HTML",json:"Download as JSON",csv:"Download as CSV "};var et={props:{tabulator:Object,config:{type:[Boolean,String,Function,Array,Object],default:!1},iconClass:[String,Array,Object]},computed:{currentConfig(){if(!this.config)return!1;let t=this.config;if(t instanceof Function)return[t];if(null===t)return[];if(!0===this.config&&(t=["csv"]),"[object String]"===Object.prototype.toString.call(t)&&(t=t.split(",")),"object"==typeof t&&!Array.isArray(t)){let n=[];for(var e in t){var a,i=t[e];i&&("[object String]"===Object.prototype.toString.call(i)?null!==(a=this.stringToFileFormatter(i))?n.push({icon:"fa-solid "+X[a],label:i===e?tt[a]:e,formatter:a}):null!==(a=this.stringToFileFormatter(e))?n.push({icon:"fa-solid "+X[a],label:i,formatter:a}):alert("neither "+e+" nor "+i+" are supported download file types"):"object"!=typeof i||Array.isArray(i)?null!==(a=this.stringToFileFormatter(e))?n.push({icon:"fa-solid "+X[a],label:tt[a],formatter:a}):alert(e+" is not a supported download file type"):null!==(a=this.stringToFileFormatter(e))?(void 0===i.formatter&&(i.formatter=a),void 0===i.label&&(i.label=tt[a]),void 0===i.icon&&(i.icon=X[a]),n.push(i)):(void 0===i.label&&(i.label=e),n.push(i)))}t=n}if(Array.isArray(t)){if(t=t.map(t=>{if("[object String]"===Object.prototype.toString.call(t)){let e=this.stringToFileFormatter(t);return null===e?null:{icon:"fa-solid "+X[e],label:tt[e],formatter:e}}if(t instanceof Function)return{formatter:t};if("object"==typeof t&&!Array.isArray(t)&&null!==t){if(t.formatter instanceof Function)return t;if(this.validateFileFormatter(t.formatter))return t}return null}).filter(t=>null!==t),t.length<2)return t;if(t.filter(t=>t.label||t.icon).length==t.length)return t;alert("Config not valid")}return[]}},methods:{stringToFileFormatter(t){let e=t.toLowerCase();return"jsonlines"==e?"jsonLines":["xlsx","pdf","html","json","csv"].includes(e)?e:null},validateFileFormatter(t){let e=this.stringToFileFormatter(t);if(!e)return alert(t+" is not a supported file formatter"),!1;if("xlsx"==e&&!window.XLSX)return alert("XLSX Library not loaded"),!1;if("pdf"==e){if(!window.jspdf)return alert("jsPDF Library not loaded"),!1;if(!new jspdf.jsPDF({}).autoTable)return alert("jsPDF-AutoTable Plugin not loaded"),!1}return!0},download(t){this.tabulator.download(t.formatter,t.file,t.options)}},template:'\n\t\n\t'};const at=new WeakMap;var it={mounted(t,e){let a=!1;at.set(t,e=>{if(!a)return;if(t.contains(e.target))return;const i=bootstrap.Collapse.getInstance(t);i&&i.hide()}),t.addEventListener("shown.bs.collapse",()=>{a=!0}),t.addEventListener("hide.bs.collapse",()=>{a=!1}),document.addEventListener("click",at.get(t),!0)},beforeUnmount(t,e){document.removeEventListener("click",at.get(t)),delete t.collapsibleAutoHideFunc}};window.Tabulator?.extendModule("layout","modes",{fitDataStretchFrozen(t,e){var a=0,i=this.table.rowManager.element.clientWidth,n=0,r=!1;t.forEach((t,e)=>{t.widthFixed||t.reinitializeWidth(),(this.table.options.responsiveLayout?t.modules.responsive.visible:t.visible&&!t.definition.frozen)&&(r=t),t.visible&&(a+=t.getWidth())}),r?(n=i-a+r.getWidth(),this.table.options.responsiveLayout&&this.table.modExists("responsiveLayout",!0)&&(r.setWidth(0),this.table.modules.responsiveLayout.update()),n>0?r.setWidth(n):r.reinitializeWidth()):this.table.options.responsiveLayout&&this.table.modExists("responsiveLayout",!0)&&this.table.modules.responsiveLayout.update()}});var nt={saveCustomFilter:t=>({method:"post",url:"/api/frontend/v1/filter/saveCustomFilter",params:{filterUniqueId:t.filterUniqueId,filterType:t.filterType,customFilterName:t.customFilterName}}),removeCustomFilter:t=>({method:"post",url:"/api/frontend/v1/filter/removeCustomFilter",params:{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterId:t.filterId}}),applyFilterFields:t=>({method:"post",url:"/api/frontend/v1/filter/applyFilterFields",params:{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterFields:t.filterFields}}),addFilterField:t=>({method:"post",url:"/api/frontend/v1/filter/addFilterField",params:{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterField:t.filterField}}),removeFilterField:t=>({method:"post",url:"/api/frontend/v1/filter/removeFilterField",params:{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterField:t.filterField}}),getFilterById:t=>({method:"get",url:"/api/frontend/v1/filter/getFilter",params:{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterId:t.filterId}}),getFilter:t=>({method:"get",url:"/api/frontend/v1/filter/getFilter",params:{filterUniqueId:t.filterUniqueId,filterType:t.filterType}})},rt=0;const st={components:{CoreFetchCmpt:W,FilterConfig:Y,FilterColumns:Q,TableDownload:et},directives:{collapseAutoClose:it},emits:["nwNewEntry","click:new","tableBuilt","uuidDefined"],props:{onNwNewEntry:Function,title:String,description:String,sideMenu:{type:Boolean,default:!0},filterType:{type:String},tabulatorOptions:Object,tabulatorEvents:Array,tableOnly:Boolean,noColumnFilter:Boolean,reload:Boolean,reloadBtnInfotext:String,download:{type:[Boolean,String,Function,Array,Object],default:!1},newBtnShow:Boolean,newBtnClass:[String,Array,Object],newBtnDisabled:Boolean,newBtnLabel:String,uniqueId:String,idField:String,parentIdField:String,countOnly:Boolean,useSelectionSpan:{type:Boolean,default:!0}},data:function(){return{uuid:0,filterName:null,filterActive:!1,fields:null,dataset:null,datasetMetadata:null,selectedFields:null,filterFields:null,availableFilters:null,selectedFilter:null,fetchCmptRefresh:!1,fetchCmptApiFunction:null,fetchCmptApiFunctionParams:null,fetchCmptDataFetched:null,fetchResult:null,tabulator:null,tableBuilt:!1,tabulatorHasSelector:!1,selectedData:[],persistence:{sort:!0,columns:!0,filter:!1,headerFilter:!1,group:!1,page:!1}}},computed:{notSelectedFields(){return this.fields&&this.selectedFields?this.fields.filter(t=>-1===this.selectedFields.indexOf(t)):null},filteredData(){return this.dataset?JSON.parse(JSON.stringify(this.dataset)):[]},filteredColumns(){let t=JSON.parse(JSON.stringify(this.fields))||[],e=JSON.parse(JSON.stringify(this.selectedFields))||[],a=null;if(this.tabulatorOptions&&this.tabulatorOptions.hasOwnProperty("columns")&&(a=this.tabulatorOptions.columns),!Array.isArray(a)||Array.isArray(a)&&a.length=0,a.push(t)}}else for(let i of a)i.visible=e.indexOf(i.field)>=0||-1==t.indexOf(i.field),i.hasOwnProperty("resizable")&&(i.resizable=i.visible);return a},fieldIdsForVisibilty(){return this.tableBuilt?this.tabulator.getColumns().filter(t=>{let e=t.getDefinition();return!e.frozen&&e.title&&"responsiveCollapse"!=e.formatter}).map(t=>t.getField()):[]},fieldNames(){return this.tableBuilt?this.tabulator.getColumns().reduce((t,e)=>(t[e.getField()]=e.getDefinition().title,t),{}):{}},idExtra(){return this.uuid?"-"+this.uuid:""},columnsForFilter(){if(!this.filteredColumns||!this.datasetMetadata)return[];const t=this.filteredColumns.reduce((t,e)=>(t[e.field]=e.title,t),{});return this.datasetMetadata.map(e=>({...e,title:t[e.name]}))}},methods:{reloadTable(){this.tableOnly?this.tabulator.setData():this.getFilter()},async initTabulator(){let t="< Phrasen Plugin not loaded! >";this.$p&&(await this.$p.loadCategory("ui"),t=this.$p.t("ui/keineDatenVorhanden")),this.tableOnly||await new Promise(t=>{const e=window.location.hash?window.location.hash.slice(1):null,a=e=>{this.setRenderData(e),t()};null===e?this.startFetchCmpt(t=>this.$api.call(nt.getFilter(t)),null,a):this.startFetchCmpt(t=>this.$api.call(nt.getFilterById(t)),{filterId:e},a)});let e={layout:"fitDataStretchFrozen",movableColumns:!0,columnDefaults:{tooltip:!0},placeholder:t,persistence:this.persistence,...this.tabulatorOptions||{}};if(void 0===e.height&&void 0===e.minHeight&&void 0===e.maxHeight&&(e.height=500),this.tableOnly?e.columns.forEach(t=>{void 0===t.visible&&(t.visible=!0)}):(e.data=this.filteredData,e.columns=this.filteredColumns),(e.selectable||e.columns&&e.columns.filter(t=>"rowSelection"==t.formatter).length)&&(this.tabulatorHasSelector=!0),this.idField&&(this.parentIdField&&(e.dataTree=!0),e.index=this.idField),this.tabulator=new Tabulator(this.$refs.table,e),Array.isArray(this.tabulatorEvents)&&this.tabulatorEvents.length>0)for(let t of this.tabulatorEvents)this.tabulator.on(t.event,t.handler);this.tabulator.on("tableBuilt",()=>{this.tableBuilt=!0,this.$emit("tableBuilt")}),this.tabulator.on("rowSelectionChanged",t=>{this.selectedData=t}),this.parentIdField&&this.idField&&this.tabulator.on("dataLoading",t=>{let e=[];for(let a=0;a{const t=this.tabulator.getColumns();this.fields=t.map(t=>t.getField()),this.selectedFields=t.filter(t=>t.isVisible()).map(t=>t.getField()),this.tabulator.options.persistence.headerFilter&&this._setHeaderFilter()}),this.tabulator.on("dataFiltered",t=>{this.filterActive=t.length>0})},updateTabulator(){this.tabulator&&(this.tableBuilt?this._updateTabulator():this.tabulator.on("tableBuilt",this._updateTabulator))},_updateTabulator(){this.tabulatorHasSelector=this.tabulatorOptions.selectable||this.filteredColumns.filter(t=>"rowSelection"==t.formatter).length,this.tabulator.setColumns(this.filteredColumns),this.tabulator.setData(this.filteredData),this._setHeaderFilter()},clearFilters(){this.tabulator.getHeaderFilters().forEach(t=>{this.tabulator.setHeaderFilterValue(t.field,"")}),this.tabulator.clearFilter(),this.filterActive=!1},_setHeaderFilter(){this.tabulator.getHeaderFilters().forEach(t=>{this.tabulator.setHeaderFilterValue(t.field,t.value)})},getFilter(){null===this.selectedFilter?this.startFetchCmpt(t=>this.$api.call(nt.getFilter(t)),null,this.render):this.startFetchCmpt(t=>this.$api.call(nt.getFilterById(t)),{filterId:this.selectedFilter},this.render)},setRenderData(t){this.fetchResult=t,this.filterName=t.filterName,this.dataset=t.dataset,this.datasetMetadata=t.datasetMetadata,this.fields=t.fields,this.selectedFields=t.selectedFields,this.filterFields=[];for(let e=0;ethis.$api.call(nt.saveCustomFilter(t)),{customFilterName:t},this.getFilter)},handlerRemoveCustomFilter(t){let e=t.currentTarget.getAttribute("href").substring(1);e===this.selectedFilter&&(this.selectedFilter=null),this.startFetchCmpt(t=>this.$api.call(nt.removeCustomFilter(t)),{filterId:e},this.getFilter)},handlerGetFilterById:function(t){let e=null,a=t.currentTarget.getAttribute("href");e=null==a?t.currentTarget.value:a.substring(1),this.switchFilter(e)},switchFilter(t){this.selectedFilter=t,this.getFilter()},applyFilterConfig(t){this.selectedFilter=null,this.startFetchCmpt(t=>this.$api.call(nt.applyFilterFields(t)),{filterFields:t},this.getFilter)},appendChild(t,e){let a=e[this.parentIdField];for(let i=0;i{this.tableOnly||(this.selectedFilter=window.location.hash?window.location.hash.slice(1):null,this.render(this.fetchResult))})},template:'\n\t\t\x3c!-- Load filter data --\x3e\n\t\t\n\t\t\n\n\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\t\t
    \n\t\t
    \n\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t{{ selectedData.length }} ausgewählt\n\t\t\t\t\t\t Mit {{ selectedData.length }} ausgewählten:\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t[ {{ filterName }} ]\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\n\t\t\t\n\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t\n\n\t\t\x3c!-- Tabulator --\x3e\n\t\t
    \n\t'},ot=new Date,lt={name:"AbgabeMitarbeiterDetail",components:{BsModal:V,InputNumber:primevue.inputnumber,Checkbox:primevue.checkbox,Dropdown:primevue.dropdown,Textarea:primevue.textarea,SpeedDial:primevue.speeddial,Accordion:primevue.accordion,AccordionTab:primevue.accordiontab,Message:primevue.message,VueDatePicker:n},inject:["abgabeTypeOptions","abgabetypenBetreuer","allowedNotenOptions","notenOptionsNonFinal","turnitin_link","old_abgabe_beurteilung_link"],props:{projektarbeit:{type:Object,default:null},isFullscreen:{type:Boolean,default:!1},assistenzMode:{type:Boolean,default:!1}},data(){return{showAutomagicModalPhrase:!1,eidAkzeptiert:!1,enduploadTermin:null,allActiveLanguages:FHC_JS_DATA_STORAGE_OBJECT.server_languages,speedDialItems:[{label:Vue.computed(()=>this.$p.t("abgabetool/c4newAbgabetermin")),icon:"fa fa-plus",command:this.openCreateNewAbgabeModal,disabled:Vue.computed(()=>!this.getAllowedToCreateNewTermin)},{label:Vue.computed(()=>this.$p.t("abgabetool/c4benoten")),icon:"fa fa-user-check",command:this.openBenotung,disabled:Vue.computed(()=>1==this.assistenzMode)},{label:Vue.computed(()=>this.$p.t("abgabetool/c4plagiatcheck_link")),icon:"fa fa-clipboard-check",command:this.openPlagiatcheck},{label:Vue.computed(()=>this.$p.t("abgabetool/c4student_perspective")),icon:"fa fa-eye",command:this.openStudentPage}],newTermin:null,form:Vue.reactive({sprache:"",abstract:"",abstract_en:"",schlagwoerter:"",schlagwoerter_en:"",kontrollschlagwoerter:"",seitenanzahl:1})}},methods:{getNoteBezeichnung(t){return t.note?.bezeichnung?t.note?.positiv?this.$capitalize(this.$p.t("abgabetool/c4positivBenotet"))+" ✅":this.$capitalize(this.$p.t("abgabetool/c4negativBenotet"))+" ❌":!0!==t.bezeichnung?.benotbar||t.note?"":this.$capitalize(this.$p.t("abgabetool/c4notYetGraded"))},getPlaceholderTermin(t){return t?.bezeichnung?this.$p.t("abgabetool/c4paatyp"+t.paabgabetyp_kurzbz):this.$p.t("abgabetool/abgabetypPlaceholder")},saveTermin(t){return t.paabgabe_id,t.note_pk=t.note?.note??null,t.betreuer_person_id=this.projektarbeit.betreuer_person_id,t.fixtermin=!t.invertedFixtermin,this.$api.call(J.postProjektarbeitAbgabe(t)).then(e=>{if("success"==e?.meta?.status){this.$fhcAlert.alertSuccess(this.$p.t("ui/gespeichert"));const a=this.allowedNotenOptions.find(t=>t.note==e.data[0].note),i={allowedToSave:!0,allowedToDelete:!0,...e.data[0]};i.note&&(i.note=a),i.invertedFixtermin=!i.fixtermin;const n=e.data[1],r=this.abgabeTypeOptions.find(t=>t.paabgabetyp_kurzbz==i.paabgabetyp_kurzbz);if(i.bezeichnung={bezeichnung:t.bezeichnung?.bezeichnung,paabgabetyp_kurzbz:t.bezeichnung?.paabgabetyp_kurzbz,benotbar:r.benotbar},n){const t=this.allowedNotenOptions.find(t=>t.note==n.note);n.note=t}else this.projektarbeit.abgabetermine.push(i);this.projektarbeit.abgabetermine.sort((t,e)=>new Date(t.datum)-new Date(e.datum)),this.projektarbeit.abgabetermine.findIndex(e=>t.paabgabe_id==e.paabgabe_id);const s=!n&&!i.note?.positiv&&null!==i.note,o=n&&!i.note?.positiv&&null!==i.note&&(n.note?.positiv||void 0===n.note);s||o?(this.newTermin={paabgabe_id:-1,projektarbeit_id:this.projektarbeit.projektarbeit_id,fixtermin:!1,invertedFixtermin:!0,kurzbz:"",datum:(new Date).toISOString().split("T")[0],note:this.allowedNotenOptions.find(t=>9==t.note),beurteilungsnotiz:"",upload_allowed:!1,paabgabetyp_kurzbz:"",bezeichnung:this.abgabeTypeOptions.find(t=>t.paabgabetyp_kurzbz===i.paabgabetyp_kurzbz),abgabedatum:null,insertvon:this.viewData?.uid??""},this.showAutomagicModalPhrase=!0,this.$refs.modalContainerCreateNewAbgabe.show()):this.showAutomagicModalPhrase=!1}else"error"==e?.meta?.status&&this.$fhcAlert.alertError()})},openZusatzdatenModal(){this.$refs.modalContainerZusatzdaten.show()},async saveZusatzdaten(){if(!await this.validateZusatzdaten())return!1;const t=this.projektarbeit,e=new FormData;e.append("projektarbeit_id",this.projektarbeit.projektarbeit_id),e.append("sprache",this.form.sprache.sprache),e.append("abstract",this.form.abstract),e.append("abstract_en",this.form.abstract_en),e.append("schlagwoerter",this.form.schlagwoerter),e.append("schlagwoerter_en",this.form.schlagwoerter_en),e.append("seitenanzahl",this.form.seitenanzahl),this.loading=!0,this.$api.call(J.postStudentProjektarbeitZusatzdaten(e)).then(e=>{if("success"==e.meta.status){if(this.$fhcAlert.alertSuccess(this.$p.t("ui/gespeichert")),!data?.retval?.[0])return;const e=data.retval[0];t.seitenanzahl=e.seitenanzahl??1,t.kontrollschlagwoerter=e.kontrollschlagwoerter??"",t.schlagwoerter=e.schlagwoerter??"",t.sprache=e.sprache??"",t.schlagwoerter_en=e.schlagwoerter_en??"",t.abstract=e.abstract??"",t.abstract_en=e.abstract_en??""}}).finally(()=>{this.loading=!1}),this.$refs.modalContainerZusatzdaten.hide()},async validateZusatzdaten(){return!1!==await this.$fhcAlert.confirm({message:this.$p.t("abgabetool/confirmZusatzdatenSpeichern"),acceptLabel:this.$capitalize(this.$p.t("abgabetool/c4AcceptAndProceed")),acceptClass:"p-button-primary",rejectLabel:this.$capitalize(this.$p.t("abgabetool/c4Cancel")),rejectClass:"p-button-secondary"})},async handleDeleteTermin(t){if(!1===await this.$fhcAlert.confirm({message:this.$p.t("abgabetool/c4confirm_delete"),acceptLabel:"Löschen",acceptClass:"p-button-danger",rejectLabel:"Zurück",rejectClass:"p-button-secondary"}))return!1;this.deleteTermin(t)},deleteTermin(t){this.$api.call(J.deleteProjektarbeitAbgabe(t.paabgabe_id)).then(e=>{if("success"==e?.meta?.status){this.$fhcAlert.alertSuccess(this.$p.t("ui/genericDeleted",[this.$p.t("abgabetool/abgabe")]));const e=this.projektarbeit.abgabetermine.findIndex(e=>e.paabgabe_id===t.paabgabe_id);this.projektarbeit.abgabetermine.splice(e,1)}else"error"==e?.meta?.status&&this.$fhcAlert.alertError()})},validate:function(t){return!!t.file.length||(this.$fhcAlert.alertWarning(this.$p.t("global/warningChooseFile")),!1)},downloadAbgabe(t){const e=`/api/frontend/v1/Abgabe/getStudentProjektarbeitAbgabeFile?paabgabe_id=${t.paabgabe_id}&student_uid=${this.projektarbeit.student_uid}&projektarbeit_id=${this.projektarbeit.projektarbeit_id}`;window.open(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+e)},convertDateToIsoString(t){if(param instanceof Date&&!isNaN(param.getTime())){const t=param.getFullYear(),e=param.getMonth()+1,a=param.getDate(),i=t=>String(t).padStart(2,"0");return`${t}-${i(e)}-${i(a)}`}return param},dateDiffInDays(t){let e=t;if(t instanceof Date&&!isNaN(e.getTime())){const a=t.getFullYear(),i=t.getMonth()+1,n=t.getDate(),r=t=>String(t).padStart(2,"0");e=`${a}-${r(i)}-${r(n)}`}const a=luxon.DateTime.now().startOf("day");return luxon.DateTime.fromISO(e).startOf("day").diff(a,"days").values.days},getDateStyleClass(t){const e=new Date(t.datum),a=new Date(t.abgabedatum);t.diffindays=this.dateDiffInDays(t.datum);const i=t.abgabedatum&&a>e;return t.note?t.note.positiv?"bestanden":"nichtbestanden":t.bezeichnung?.benotbar&&et.sprache,getOptionLabelAbgabetyp(t){return this.$p.t("abgabetool/c4paatyp"+t.paabgabetyp_kurzbz)},getOptionDisabled:t=>!t.aktiv,getNotenOptionLabel:t=>t.bezeichnung,openStudentPage(){const t=FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/Cis/Abgabetool/Student/"+this.projektarbeit?.student_uid;window.open(t,"_blank")},openPlagiatcheck(){const t=this.turnitin_link;window.open(t,"_blank")},async openBenotung(){if(this.getSemesterBenotbar&&this.projektarbeit?.abgabetermine.find(t=>"end"==t.paabgabetyp_kurzbz&&null!==t.abgabedatum)&&this.projektarbeit?.beurteilungLinkNew){const t=this.projektarbeit?.beurteilungLinkNew;window.open(t,"_blank")}else if(this.projektarbeit?.abgabetermine.find(t=>"end"==t.paabgabetyp_kurzbz&&null!==t.abgabedatum)&&this.projektarbeit?.beurteilungLinkOld){if(!1===await this.$fhcAlert.confirm({message:this.$p.t("abgabetool/c4aeltereParbeitBenotenv2"),acceptLabel:this.$capitalize(this.$p.t("abgabetool/c4AcceptAndProceed")),acceptClass:"btn btn-danger",rejectLabel:this.$capitalize(this.$p.t("abgabetool/c4Cancel")),rejectClass:"btn btn-outline-secondary"}))return!1;const t=this.projektarbeit?.beurteilungLinkOld;window.open(t,"_blank")}else if(!1===await this.$fhcAlert.confirm({message:this.$p.t("abgabetool/c4keinEnduploadErfolgt"),acceptLabel:this.$capitalize(this.$p.t("abgabetool/c4AcceptAndProceed")),acceptClass:"btn btn-danger",rejectLabel:this.$capitalize(this.$p.t("abgabetool/c4Cancel")),rejectClass:"btn btn-outline-secondary"}))return!1},formatDate(t){const e=new Date(t),a=t=>String(t).padStart(2,"0"),i=a(e.getMonth()+1);return`${a(e.getDate())}.${i}.${e.getFullYear()}`},openCreateNewAbgabeModal(){if("Zweitbegutachter"!=this.projektarbeit?.betreuerart_kurzbz){if(!this.newTermin){const t=this.abgabeTypeOptions.find(t=>"zwischen"===t.paabgabetyp_kurzbz);this.newTermin={paabgabe_id:-1,projektarbeit_id:this.projektarbeit.projektarbeit_id,fixtermin:!1,invertedFixtermin:!0,kurzbz:"",datum:(new Date).toISOString().split("T")[0],note:this.allowedNotenOptions.find(t=>9==t.note),beurteilungsnotiz:"",upload_allowed:t.upload_allowed_default,paabgabetyp_kurzbz:"",bezeichnung:t,abgabedatum:null,insertvon:this.viewData?.uid??""}}this.$refs.modalContainerCreateNewAbgabe.show()}else this.$fhcAlert.alertWarning("Terminanlage disabled")},validateTermin:t=>!0,async handleSaveNewAbgabe(t){if(!this.validateTermin(t))return this.$fhcAlert.alertWarning("invalid termin"),!1;await this.saveTermin(t),this.$refs.modalContainerCreateNewAbgabe.hide(),this.newTermin={paabgabe_id:-1,projektarbeit_id:this.projektarbeit.projektarbeit_id,fixtermin:!1,invertedFixtermin:!0,kurzbz:"",datum:(new Date).toISOString().split("T")[0],note:this.allowedNotenOptions.find(t=>9==t.note),beurteilungsnotiz:"",upload_allowed:!1,paabgabetyp_kurzbz:"",bezeichnung:this.abgabeTypeOptions.find(t=>"zwischen"===t.paabgabetyp_kurzbz),abgabedatum:null,insertvon:this.viewData?.uid??""}},handleChangeAbgabetyp(t){"qualgate1"===t.bezeichnung?.paabgabetyp_kurzbz||"qualgate2"===t.bezeichnung?.paabgabetyp_kurzbz?t.kurzbz=t.bezeichnung.bezeichnung:t.kurzbz=""}},computed:{getAllowedToCreateNewTermin(){if(this.assistenzMode)return!0;if("Zweitbegutachter"==this.projektarbeit?.betreuerart_kurzbz)return!1;if(void 0!==this.projektarbeit?.note&&null!==this.projektarbeit.note){return!!this.notenOptionsNonFinal.find(t=>t.note)}return!0},allowedToSaveZusatzdaten(){return this.form.schlagwoerter.length>0&&this.form.schlagwoerter_en.length>0&&this.form.abstract.length>0&&this.form.abstract_en.length>0&&this.form.seitenanzahl>0},getAllowedAbgabeTypeOptions(){return this.assistenzMode?this.abgabeTypeOptions:this.abgabeTypeOptions.filter(t=>this.abgabetypenBetreuer.includes(t.paabgabetyp_kurzbz))},getMessagePtStyle:()=>({root:{style:{margin:"0px"}},wrapper:{style:{padding:"6px"}}}),getEid(){return this.$p.t("abgabetool/c4eidesstattlicheErklaerung")},getEnduploadErlaubt(){return!this.eidAkzeptiert},getSemesterBenotbar(){return this.projektarbeit?.isCurrent??!1},endUploadVorhanden(){return this.projektarbeit?.abgabetermine.find(t=>"end"===t.paabgabetyp_kurzbz&&null!==t.abgabedatum)},qualityGateTerminAvailable(){let t=!1;return this.projektarbeit?.abgabetermine.forEach(e=>{"qualgate1"!=e.bezeichnung?.paabgabetyp_kurzbz&&"qualgate2"!=e?.bezeichnung?.paabgabetyp_kurzbz||(t=!0)}),t},getSpeedDialStyle:()=>"position: static !important;",getSpeedDialWrapperStyle:()=>"position: absolute; z-index: 9999; left: 0px; bottom: 0.5rem;",getTooltipVerspaetet(){return{value:this.$p.t("abgabetool/c4tooltipVerspaetet"),class:"custom-tooltip"}},getTooltipVerpasst(){return{value:this.$p.t("abgabetool/c4tooltipVerpasst"),class:"custom-tooltip"}},getTooltipAbzugeben(){return{value:this.$p.t("abgabetool/c4tooltipAbzugeben"),class:"custom-tooltip"}},getTooltipStandard(){return{value:this.$p.t("abgabetool/c4tooltipStandardv2"),class:"custom-tooltip"}},getTooltipBeurteilungerforderlich(){return{value:this.$p.t("abgabetool/c4tooltipBeurteilungerforderlich"),class:"custom-tooltip"}},getTooltipAbgegeben(){return{value:this.$p.t("abgabetool/c4tooltipAbgegeben"),class:"custom-tooltip"}},getTooltipFixtermin(){return{value:this.$p.t("abgabetool/c4tooltipFixtermin"),class:"custom-tooltip"}},getTooltipAbgabeDetected(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipAbgabeDetected")),class:"custom-tooltip"}},getTooltipNotAllowedToSave(){return{value:this.$p.t("abgabetool/c4notAllowedToEditAbgabeTermin"),class:"custom-tooltip"}},getTooltipNotAllowedToDelete(){return{value:this.$p.t("abgabetool/c4notAllowedToDeleteAbgabeTermin"),class:"custom-tooltip"}},getTooltipBestanden(){return{value:this.$p.t("abgabetool/c4tooltipBestanden"),class:"custom-tooltip"}},getTooltipNichtBestanden(){return{value:this.$p.t("abgabetool/c4tooltipNichtBestanden"),class:"custom-tooltip"}},getProjektarbeitTitel(){return this.projektarbeit?.titel?this.$capitalize(this.$p.t("abgabetool/c4titel"))+": "+this.projektarbeit.titel:""},getProjektarbeitStudent(){return this.projektarbeit?.student?this.$capitalize(this.$p.t("person/student"))+": "+this.projektarbeit.student:""}},watch:{"newTermin.bezeichnung"(t){"qualgate1"!==t?.paabgabetyp_kurzbz&&"qualgate2"!==t?.paabgabetyp_kurzbz||(this.newTermin.kurzbz=t.bezeichnung),this.newTermin.upload_allowed=t.upload_allowed_default},projektarbeit(t){const e=this.abgabeTypeOptions.find(t=>"zwischen"===t.paabgabetyp_kurzbz);this.newTermin={paabgabe_id:-1,projektarbeit_id:t.projektarbeit_id,fixtermin:!1,invertedFixtermin:!0,kurzbz:"",datum:(new Date).toISOString().split("T")[0],note:this.allowedNotenOptions.find(t=>9==t.note),beurteilungsnotiz:"",upload_allowed:e.upload_allowed_default,paabgabetyp_kurzbz:"",bezeichnung:e,abgabedatum:null,insertvon:this.viewData?.uid??""},t?.abgabetermine?.forEach(t=>t.invertedFixtermin=!t.fixtermin),this.form.sprache=t.sprache?this.allActiveLanguages.find(e=>e.sprache==t.sprache):this.allActiveLanguages.find(t=>"German"==t.sprache),this.form.abstract=t.abstract??"",this.form.abstract_en=t.abstract_en??"",this.form.schlagwoerter=t.schlagwoerter??"",this.form.schlagwoerter_en=t.schlagwoerter_en??"",this.form.kontrollschlagwoerter=t.kontrollschlagwoerter??"",this.form.seitenanzahl=t.seitenanzahl??1}},created(){},mounted(){},template:'\n\t\n\t\t\n\t\t\n\t\t\n\t\n\n\t
    \n\t\t
    {{$capitalize( $p.t(\'abgabetool/c4abgabeMitarbeiterbereich\') )}}
    \n\n\t\t
    \n\t\t\t
    \n\t\t\t\t

    {{getProjektarbeitStudent}}

    \n\t\t\t\t

    {{getProjektarbeitTitel}}

    \n\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t
    \n\t\t
    \n\t\t\t
    \n\x3c!--\t\t\t\tTODO: tooltip why this button is disabled--\x3e\n\t\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\t\t
    \n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t
    \n\t\t\t
    {{ $capitalize( $p.t(\'abgabetool/c4keineAbgabetermineGefunden\') )}}
    \n\t\t
    \n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t
    \n'},dt={name:"AbgabetoolMitarbeiter",components:{BsModal:V,CoreFilterCmpt:st,AbgabeDetail:lt,Checkbox:primevue.checkbox,Dropdown:primevue.dropdown,Textarea:primevue.textarea,VueDatePicker:n,FhcOverlay:G},provide(){return{abgabeTypeOptions:Vue.computed(()=>this.abgabeTypeOptions),abgabetypenBetreuer:Vue.computed(()=>this.abgabetypenBetreuer),allowedNotenOptions:Vue.computed(()=>this.allowedNotenOptions),notenOptionsNonFinal:Vue.computed(()=>this.notenOptionsNonFinal),turnitin_link:Vue.computed(()=>this.turnitin_link),old_abgabe_beurteilung_link:Vue.computed(()=>this.old_abgabe_beurteilung_link)}},props:{viewData:{type:Object,required:!0,default:()=>({name:"",uid:""}),validator:t=>t&&t.uid}},data(){return{tableData:null,abgabetypenBetreuer:null,detailIsFullscreen:!1,phrasenPromise:null,phrasenResolved:!1,turnitin_link:null,old_abgabe_beurteilung_link:null,saving:!1,loading:!1,abgabeTypeOptions:null,notenOptions:null,allowedNotenOptions:null,notenOptionsNonFinal:null,serienTermin:Vue.reactive({datum:new Date,bezeichnung:{paabgabetyp_kurzbz:"zwischen",bezeichnung:"Zwischenabgabe"},kurzbz:"",upload_allowed:!1}),showAll:!1,tabulatorUuid:Vue.ref(0),selectedData:[],domain:"",student_uid:null,detail:null,detailOffset:0,projektarbeiten:null,selectedProjektarbeit:null,tableBuiltResolve:null,tableBuiltPromise:null,abgabeTableOptions:{minHeight:250,index:"projektarbeit_id",layout:"fitDataStretch",placeholder:Vue.computed(()=>this.$p.t("global/noDataAvailable")),selectable:!0,selectableCheck:this.selectionCheck,rowHeight:80,columns:[{formatter:function(t,e,a){if(!t.getRow().getData().selectable)return;let i=document.createElement("input");i.type="checkbox",i.addEventListener("click",a=>{a.stopPropagation(),e&&e.handleClick&&e.handleClick(a,t)}),t.getRow().getData().checkbox=i;let n=document.createElement("div");return n.style.cssText="display: flex; justify-content: center; align-items: center; height: 100%; width: 100%;",n.appendChild(i),n},titleFormatter:function(t,e,a){let i=document.createElement("input");return i.type="checkbox",i.addEventListener("click",a=>{a.stopPropagation(),e&&e.handleClick&&e.handleClick(a,t)}),i},hozAlign:"center",headerSort:!1,formatterParams:{handleClick:this.selectHandler},titleFormatterParams:{handleClick:this.selectAllHandler},width:50,cssClass:"sticky-col"},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4details"))),field:"details",formatter:this.detailFormatter,widthGrow:1,tooltip:!1,cssClass:"sticky-col"},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4personenkennzeichen"))),headerFilter:!0,field:"pkz",formatter:this.pkzTextFormatter,widthGrow:1,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4kontakt"))),field:"mail",formatter:this.mailFormatter,widthGrow:1,tooltip:!1,visible:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4vorname"))),field:"vorname",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4nachname"))),field:"nachname",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4projekttyp"))),field:"projekttyp_kurzbz",formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4stg"))),field:"stg",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4sem"))),field:"studiensemester_kurzbz",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4titel"))),field:"titel",headerFilter:!0,formatter:this.centeredTextFormatter,maxWidth:500,widthGrow:8},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4betreuerart"))),field:"betreuerart_beschreibung",formatter:this.centeredTextFormatter,widthGrow:1}],persistence:!1},abgabeTableEventHandlers:[{event:"tableBuilt",handler:async()=>{this.tableBuiltResolve()}},{event:"cellClick",handler:async(t,e)=>{"details"===e.getColumn().getField()?(this.setDetailComponent(e.getValue()),this.undoSelection(e)):"mail"===e.getColumn().getField()&&this.undoSelection(e)}},{event:"rowSelectionChanged",handler:async t=>{this.selectedData.filter(e=>!t.includes(e)).forEach(t=>{t.checkbox&&(t.checkbox.checked=!1)}),t.forEach(t=>{t.checkbox&&(t.checkbox.checked=!0)}),this.selectedData=t}}]}},methods:{selectHandler(t,e){const a=e.getRow();return a.isSelected()?a.deselect():a.select(),t.stopPropagation(),!1},selectAllHandler(t,e){const a=e.getTable().getRows().filter(t=>t.getData().selectable);return a.every(t=>t.isSelected())?a.forEach(t=>t.deselect()):a.forEach(t=>t.select()),t.stopPropagation(),!1},handleToggleFullscreenDetail(){this.detailIsFullscreen=!this.detailIsFullscreen},getOptionLabelAbgabetyp:t=>t.bezeichnung,formatDate(t){const e=new Date(t),a=t=>String(t).padStart(2,"0"),i=a(e.getMonth()+1);return`${a(e.getDate())}.${i}.${e.getFullYear()}`},undoSelection(t){const e=t.getRow();e.isSelected()&&e.deselect()},selectionCheck(t){const e=t.getData();return"Zweitbegutachter"!=e?.betreuerart_kurzbz},showDeadlines(){const t=FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/Cis/Abgabetool/Deadlines";window.open(t,"_blank")},toggleShowAll(t){this.showAll=t,this.loading=!0,this.loadProjektarbeiten(t,()=>{this.$refs.abgabeTable?.tabulator.redraw(!0),this.$refs.abgabeTable?.tabulator.setSort([]),this.loading=!1})},openAddSeriesModal(){this.$refs.modalContainerAddSeries.show()},addSeries(){this.saving=!0,this.$api.call(J.postSerientermin(this.serienTermin.datum.toISOString(),this.serienTermin.bezeichnung.paabgabetyp_kurzbz,this.serienTermin.bezeichnung.bezeichnung,this.serienTermin.kurzbz,this.serienTermin.upload_allowed,this.selectedData?.map(t=>t.projektarbeit_id),!1)).then(t=>{"success"===t.meta.status&&t.data?this.$fhcAlert.alertSuccess(this.$p.t("abgabetool/serienTerminGespeichert")):this.$fhcAlert.alertError(this.$p.t("abgabetool/errorSerienterminSpeichern"))}).finally(()=>{this.saving=!1}),this.$refs.modalContainerAddSeries.hide()},createInfoString(t){let e="";return t.forEach(t=>{e+=t,e+="; "}),e},isPastDate:t=>new Date(t){const a=this.projektarbeiten?.retval?.find(e=>e.projektarbeit_id==t.projektarbeit_id);a.abgabetermine=e.data[0].retval,a.isCurrent=e.data[1];let i=!1;if(void 0!==a.note&&null!==a.note){this.notenOptionsNonFinal.find(t=>t.note)&&(i=!1),i=!0}a.abgabetermine.forEach(t=>{t.note=this.allowedNotenOptions.find(e=>e.note==t.note),t.file=[],t.allowedToSave=!i,t.allowedToDelete=t.allowedToSave&&!t.abgabedatum,t.bezeichnung=this.abgabeTypeOptions.find(e=>e.paabgabetyp_kurzbz===t.paabgabetyp_kurzbz)}),a.student_uid=t.student_uid,a.student=`${a.vorname} ${a.nachname}`,this.selectedProjektarbeit=a,this.$refs.modalContainerAbgabeDetail.show()}).finally(()=>{this.loading=!1})},centeredTextFormatter(t){const e=t.getValue();if(e)return'

    '+e+"

    "},detailFormatter:t=>'
    ',mailFormatter:t=>'
    ',beurteilungFormatter:t=>t.getValue()?'
    ':"-",pkzTextFormatter:t=>'",tableResolve(t){this.tableBuiltResolve=t},buildMailToLink(t){return"mailto:"+t.uid+"@"+this.domain},buildPKZ:t=>`${t.uid} / ${t.matrikelnr}`,buildStg:t=>(t.typ+t.kurzbz)?.toUpperCase(),setupData(t){this.projektarbeiten=t[0],this.domain=t[1],this.tableData=t[0]?.retval?.map(t=>(t.selectable="Zweitbegutachter"!==t.betreuerart_kurzbz,{...t,details:{student_uid:t.uid,projektarbeit_id:t.projektarbeit_id},pkz:this.buildPKZ(t),beurteilung:t.beurteilungLink??null,sem:t.studiensemester_kurzbz,stg:this.buildStg(t),mail:this.buildMailToLink(t),typ:t.projekttyp_kurzbz,titel:t.titel})),this.$refs.abgabeTable.tabulator.setColumns(this.abgabeTableOptions.columns),this.$refs.abgabeTable.tabulator.setData(this.tableData)},loadProjektarbeiten(t=!1,e){this.$api.call(J.getMitarbeiterProjektarbeiten(t)).then(t=>{t?.data&&this.setupData(t.data)}).finally(()=>{e&&e()})},loadAbgaben(t){return new Promise(e=>{this.$api.call(J.getStudentProjektabgaben(t)).then(t=>{e(t)})})},handleUuidDefined(t){this.tabulatorUuid=t},calcMaxTableHeight(){const t=this.tabulatorUuid?"-"+this.tabulatorUuid:"",e=document.getElementById("filterTableDataset"+t);if(!e)return;const a=e.getBoundingClientRect();this.abgabeTableOptions.height=window.visualViewport.height-a.top-80,this.$refs.abgabeTable.tabulator.setHeight(this.abgabeTableOptions.height)},async setupMounted(){this.tableBuiltPromise=new Promise(this.tableResolve),await this.tableBuiltPromise,this.loadProjektarbeiten(),this.calcMaxTableHeight()}},watch:{"serienTermin.bezeichnung"(t){"qualgate1"!==t?.paabgabetyp_kurzbz&&"qualgate2"!==t?.paabgabetyp_kurzbz||(this.serienTermin.kurzbz=t.bezeichnung),this.serienTermin.upload_allowed=t.upload_allowed_default}},computed:{getAllowedAbgabeTypeOptions(){return this.abgabeTypeOptions.filter(t=>this.abgabetypenBetreuer.includes(t.paabgabetyp_kurzbz))}},created(){this.phrasenPromise=this.$p.loadCategory(["abgabetool","global"]),this.phrasenPromise.then(()=>{this.phrasenResolved=!0}),this.$api.call(J.getConfig()).then(t=>{this.turnitin_link=t.data?.turnitin_link,this.old_abgabe_beurteilung_link=t.data?.old_abgabe_beurteilung_link,this.abgabetypenBetreuer=t.data?.abgabetypenBetreuer}).catch(t=>{this.loading=!1}),this.$api.call(J.getNoten()).then(t=>{"success"==t.meta.status&&(this.notenOptions=t.data[0],this.allowedNotenOptions=this.notenOptions.filter(e=>t.data[1].includes(e.note)),this.notenOptionsNonFinal=this.notenOptions.filter(e=>t.data[2].includes(e.note)))}).catch(t=>{this.loading=!1}),this.$api.call(J.getPaAbgabetypen()).then(t=>{this.abgabeTypeOptions=t.data}).catch(t=>{this.loading=!1})},mounted(){this.setupMounted()},template:'\n\t\n '};var ct={name:"BootstrapOffcanvas",data:()=>({offcanvas:null}),props:{backdrop:{type:[Boolean,String],default:!0,validator:t=>["static",!0,!1].includes(t)},keyboard:{type:Boolean,default:!0},scroll:{type:Boolean,default:!1},placement:{type:String,default:"start",validator:t=>["start","end","top","bottom"].includes(t)},noCloseBtn:Boolean,headerClass:{type:[String,Array,Object],default:""},bodyClass:{type:[String,Array,Object],default:"p-4"},footerClass:{type:[String,Array,Object],default:""},dialogClass:[String,Array,Object]},emits:["hideBsOffcanvas","hiddenBsOffcanvas","hidePreventedBsOffcanvas","showBsOffcanvas","shownBsOffcanvas"],methods:{dispose(){return this.offcanvas?.dispose()},hide(){return this.offcanvas?.hide()},show(t){return this.offcanvas?.show(t)},toggle(){return this.offcanvas?.toggle()},popup(t,e,a,i){const n=this,r={};void 0!==t&&(r.default=()=>t),void 0!==a&&(r.title=()=>a),void 0!==i&&(r.footer=()=>i);let s=!1;return"undefined"!=typeof primevue&&(s=!0),new Promise((t,a)=>{const i=Vue.createApp({name:"OffcanvasTmpApp",setup:()=>()=>Vue.h(n,{class:"offcanvas-wrapper",ref:"offcanvas",...e},r),mounted(){this.$refs.offcanvas.show()},beforeUnmount(){this.$refs.offcanvas&&(!1!==this.$refs.offcanvas.result?t(this.$refs.offcanvas.result):a())},unmounted(){o.parentElement.removeChild(o)}}),o=document.createElement("div");s&&i.use(primevue.config.default,{zIndex:{overlay:9999}}),Promise.resolve().then(function(){return I}).then(t=>{i.use(t.default),i.mount(o),document.body.appendChild(o)})})}},mounted(){this.$refs.offcanvas&&(this.offcanvas=new bootstrap.Offcanvas(this.$refs.offcanvas,{backdrop:this.backdrop,keyboard:this.keyboard,scroll:this.scroll}))},template:'\n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\n\t\t\t\n\t\t
    \n\t'},pt={getAllStudiensemesterAndAktOrNext:()=>({method:"get",url:"/api/frontend/v1/organisation/Studiensemester/getAllStudiensemesterAndAktOrNext"}),getAll:(t=null,e=null)=>({method:"get",url:"api/frontend/v1/organisation/studiensemester/getAll",params:{order:t,start:e}})};const ut={name:"AbgabeterminStatusLegende",template:'\t\n\t\t
    \n\t\t\t
    \n\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t(\'abgabetool/c4tooltipVerspaetet\')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t(\'abgabetool/c4tooltipVerpasst\')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t(\'abgabetool/c4tooltipAbzugeben\')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t(\'abgabetool/c4tooltipStandardv2\')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t(\'abgabetool/c4tooltipAbgegeben\')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t(\'abgabetool/c4tooltipBeurteilungerforderlich\')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t(\'abgabetool/c4tooltipBestanden\')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t(\'abgabetool/c4tooltipNichtBestanden\')) }}
    \n\t\t\t\t\t
    \t\n\t\t\t\t
    \n\n\t\t\t
    \n\t\t
    \t\n\t'};async function gt(t,e,a,i,n){let r=t.join(","),s="";const o=a&&"string"==typeof a?a.length+9:0;if(r.length>2024&&!1===await i.confirm({message:n.t("stv","zuvieleEMails")}))return;let l=!0,d=e?.ctrlKey||e?.metaKey;for(;r.length>0;){if(r.length+o>2024){let t=r.lastIndexOf(",",1900);s=r.substring(0,t),r=r.substring(t+1)}else s=r,r="";let t=d?`mailto:?bcc=${s}`:`mailto:${s}`;a&&"string"==typeof a&&(t+=`?subject=${a}`),l?(window.location.href=t,l=!1):!0===await i.confirm({message:n.t("stv","weitereEMail")})&&(window.location.href=t)}}const bt=new Date,ht=luxon.DateTime.now(),ft={name:"AbgabetoolAssistenz",components:{AbgabeterminStatusLegende:ut,BsModal:V,BsOffcanvas:ct,CoreFilterCmpt:st,AbgabeDetail:lt,Checkbox:primevue.checkbox,Dropdown:primevue.dropdown,Inplace:primevue.inplace,Textarea:primevue.textarea,Timeline:primevue.timeline,TieredMenu:primevue.tieredmenu,VueDatePicker:n,FhcOverlay:G},provide(){return{abgabeTypeOptions:Vue.computed(()=>this.abgabeTypeOptions),allowedNotenOptions:Vue.computed(()=>this.allowedNotenOptions),notenOptionsNonFinal:Vue.computed(()=>this.notenOptionsNonFinal),turnitin_link:Vue.computed(()=>this.turnitin_link),old_abgabe_beurteilung_link:Vue.computed(()=>this.old_abgabe_beurteilung_link),abgabetypenBetreuer:Vue.computed(()=>this.abgabeTypeOptions)}},props:{stg_kz_prop:{default:null},viewData:{type:Object,required:!0,default:()=>({name:"",uid:""}),validator:t=>t&&t.uid}},data(){return{tableData:null,studiensemesterOptions:null,allSem:null,curSem:null,notenOptionFilter:null,inplaceToggle:!1,headerFiltersRestored:!1,filtersRestored:!1,colLayoutRestored:!1,sortRestored:!1,stateRestored:!1,timelineProjekt:null,selectedStudiengangOption:null,studiengaengeOptions:null,detailIsFullscreen:!1,allConfigPromise:null,phrasenPromise:null,phrasenResolved:!1,turnitin_link:null,old_abgabe_beurteilung_link:null,ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT:null,ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER:null,saving:!1,loading:!1,abgabeTypeOptions:null,notenOptions:null,allowedNotenFilterOptions:null,allowedNotenOptions:null,notenOptionsNonFinal:null,serienTermin:Vue.reactive({datum:new Date,bezeichnung:{paabgabetyp_kurzbz:"zwischen",bezeichnung:"Zwischenabgabe"},kurzbz:"",fixtermin:!1,invertedFixtermin:!0,upload_allowed:!1}),showAll:!1,tabulatorUuid:Vue.ref(0),selectedData:[],domain:"",student_uid:null,detail:null,detailOffset:0,projektarbeiten:null,selectedProjektarbeit:null,tableBuiltResolve:null,tableBuiltPromise:null,abgabeTableOptions:{minHeight:250,index:"projektarbeit_id",layout:"fitData",placeholder:Vue.computed(()=>this.$capitalize(this.$p.t("global/noDataAvailable"))),selectable:!0,selectableCheck:this.selectionCheck,rowHeight:40,renderVerticalBuffer:2e3,columns:[{formatter:function(t,e,a){if(!t.getRow().getData().selectable)return;let i=document.createElement("input");i.type="checkbox",i.addEventListener("click",a=>{a.stopPropagation(),e&&e.handleClick&&e.handleClick(a,t)}),t.getRow().getData().checkbox=i;let n=document.createElement("div");return n.style.cssText="display: flex; justify-content: center; align-items: center; height: 100%; width: 100%;",n.appendChild(i),n},titleFormatter:function(t,e,a){let i=document.createElement("input");return i.type="checkbox",i.addEventListener("click",a=>{a.stopPropagation(),e&&e.handleClick&&e.handleClick(a,t)}),i},hozAlign:"center",headerSort:!1,formatterParams:{handleClick:this.selectHandler},titleFormatterParams:{handleClick:this.selectAllHandler},width:50,cssClass:"sticky-col"},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4details"))),field:"details",formatter:this.formAction,tooltip:!1,minWidth:150,cssClass:"sticky-col"},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4personenkennzeichen"))),headerFilter:!0,field:"pkz",formatter:this.pkzTextFormatter,widthGrow:1,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4vorname"))),field:"student_vorname",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4nachname"))),field:"student_nachname",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4studstatus"))),field:"studienstatus",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4orgform"))),field:"orgform",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4projekttyp"))),field:"projekttyp_kurzbz",formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4stg"))),field:"stg",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4note"))),field:"note_bez",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4sem"))),field:"studiensemester_kurzbz",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4titel"))),field:"titel",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4erstbetreuer"))),field:"erstbetreuer",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4zweitbetreuer"))),field:"zweitbetreuer",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4prevAbgabetermin"))),headerFilter:!0,field:"prevTermin",formatter:this.abgabterminFormatter,widthGrow:1,width:220,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4nextAbgabetermin"))),headerFilter:!0,field:"nextTermin",formatter:this.abgabterminFormatter,widthGrow:1,width:220,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4qgate1Status"))),headerFilter:!0,field:"qgate1Status",formatter:this.centeredTextFormatter,widthGrow:1,width:220,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4qgate2Status"))),headerFilter:!0,field:"qgate2Status",formatter:this.centeredTextFormatter,widthGrow:1,width:220,tooltip:!1}],persistence:!1,persistenceID:"abgabetool_2025_12"},abgabeTableEventHandlers:[{event:"rowSelectionChanged",handler:async t=>{this.selectedData.filter(e=>!t.includes(e)).forEach(t=>{t.checkbox&&(t.checkbox.checked=!1)}),t.forEach(t=>{t.checkbox&&(t.checkbox.checked=!0)}),this.selectedData=t}}]}},methods:{sammelMailStudent(t){const e=this.selectedData.map(t=>`${t.student_uid}@${this.domain}`).join(","),a=[...new Set(e)],i=this.$p.t("abgabetool/c4sammelmailStudentBetreff",[this.selectedStudiengangOption?.bezeichnung]);gt(a,t.originalEvent,i,this.$fhcAlert,this.$p)},sammelMailBetreuer(t){const e=[];this.selectedData.forEach(t=>{t.betreuer_mail&&e.push(t.betreuer_mail),t.zweitbetreuer_mail&&e.push(t.zweitbetreuer_mail)});const a=[...new Set(e)],i=this.$p.t("abgabetool/c4sammelmailBetreuerBetreff",[this.selectedStudiengangOption?.bezeichnung]);gt(a,t.originalEvent,i,this.$fhcAlert,this.$p)},selectHandler(t,e){const a=e.getRow();return a.isSelected()?a.deselect():a.select(),t.stopPropagation(),!1},selectAllHandler(t,e){const a=e.getTable().getRows().filter(t=>t.getData().selectable);return a.every(t=>t.isSelected())?a.forEach(t=>t.deselect()):a.forEach(t=>t.select()),t.stopPropagation(),!1},checkQualityGateStatus(t){const e=[],a=[];t.qgate1Status=this.$p.t("abgabetool/c4keinTerminVorhanden"),t.qgate1StatusRank=0,t.qgate2Status=this.$p.t("abgabetool/c4keinTerminVorhanden"),t.qgate2StatusRank=0,t.abgabetermine.forEach(t=>{"qualgate1"==t.paabgabetyp_kurzbz&&e.push(t),"qualgate2"==t.paabgabetyp_kurzbz&&a.push(t)}),e.forEach(e=>{if(null!=e.note&&t.qgate1StatusRank<=5){this.notenOptions.find(t=>t.note==e.note).positiv?(t.qgate1Status=this.$p.t("abgabetool/c4positivBenotet"),t.qgate1StatusRank=5):(t.qgate1Status=this.$p.t("abgabetool/c4negativBenotet"),t.qgate1StatusRank=4)}else null==e.note&&t.qgate1StatusRank<=3?(t.qgate1Status=this.$p.t("abgabetool/c4notYetGraded"),t.qgate1StatusRank=3):1==e.upload_allowed&&null==e.abgabedatum&&t.qgate1StatusRank<=2?(t.qgate1Status=this.$p.t("abgabetool/c4notSubmitted"),t.qgate1StatusRank=2):0==e.upload_allowed&&e.diffMs<=0&&t.qgate1StatusRank<=1&&(t.qgate1Status=this.$p.t("abgabetool/c4notHappenedYet"),t.qgate1StatusRank=1)}),a.forEach(e=>{if(null!=e.note&&t.qgate1StatusRank<=5){this.notenOptions.find(t=>t.note==e.note).positiv?(t.qgate2Status=this.$p.t("abgabetool/c4positivBenotet"),t.qgate2StatusRank=5):(t.qgate2Status=this.$p.t("abgabetool/c4negativBenotet"),t.qgate2StatusRank=4)}else null==e.note&&t.qgate2StatusRank<=3?(t.qgate2Status=this.$p.t("abgabetool/c4notYetGraded"),t.qgate2StatusRank=3):1==e.upload_allowed&&null==e.abgabedatum&&t.qgate2StatusRank<=2?(t.qgate2Status=this.$p.t("abgabetool/c4notSubmitted"),t.qgate2StatusRank=2):0==e.upload_allowed&&e.diffMs<=0&&t.qgate2StatusRank<=1&&(t.qgate2Status=this.$p.t("abgabetool/c4notHappenedYet"),t.qgate2StatusRank=1)})},getItemBezeichnung:t=>t.bezeichnung?t?.bezeichnung?.bezeichnung??t?.bezeichnung:"",getItemNote(t){if(!t?.note)return"";if(t.note?.bezeichnung)return t.note.bezeichnung;const e=this.notenOptions.find(e=>e.note==t.note);return e?e.bezeichnung:t.note},handleChangeAbgabetypSerientermin(t){"qualgate1"===t.bezeichnung?.paabgabetyp_kurzbz||"qualgate2"===t.bezeichnung?.paabgabetyp_kurzbz?t.kurzbz=t.bezeichnung.bezeichnung:t.kurzbz=""},semesterChanged(t){if(this.$refs.abgabeTable.tabulator){const e=this.$refs.abgabeTable.tabulator,a=e.getFilters().filter(t=>"studiensemester_kurzbz"!=t.field),i=t.value.studiensemester_kurzbz==this.$p.t("abgabetool/c4all")?"":t.value.studiensemester_kurzbz,n={field:"studiensemester_kurzbz",type:t.value.studiensemester_kurzbz==this.$p.t("abgabetool/c4all")?"!=":"=",value:i};e.setFilter([...a,n])}},checkAbgabetermineProjektarbeit(t){t.abgabetermine.forEach(e=>{e.dateStyle=this.getDateStyleClass(e);const a=luxon.DateTime.fromISO(e.datum);e.diffMs=a.toMillis()-ht.toMillis(),e.diffMs<0?(!t.prevTermin||e.diffMs>t.prevTermin.diffMs)&&(t.prevTermin=e):e.diffMs>0&&(!t.nextTermin||e.diffMs({field:t.field,visible:t.visible,width:t.width})),sort:t.getSorters().map(t=>({field:t.field,dir:t.dir})),filters:t.getFilters(),headerFilters:t.getHeaderFilters()};localStorage.setItem(this.abgabeTableOptions.persistenceID,JSON.stringify(e))},handleTableBuilt(){const t=this.$refs.abgabeTable.tabulator;this.tableBuiltResolve(),t.on("columnMoved",()=>{this.saveState(t)}),t.on("columnResized",()=>{this.saveState(t)}),t.on("columnVisibilityChanged",()=>{this.saveState(t)}),t.on("filterChanged",()=>{this.saveState(t)}),t.on("headerFilterChanged",()=>{this.saveState(t)}),t.on("dataSorted",()=>{this.saveState(t)}),t.on("columnSorted",()=>{this.saveState(t)}),t.on("sortersChanged",()=>{this.saveState(t)});const e=this.loadState();t.on("renderComplete",()=>{if(!this.stateRestored){if(e?.columns&&!this.colLayoutRestored){const a=e.columns.map(t=>({field:t.field,width:t.width,visible:t.visible}));t.setColumnLayout(a),this.colLayoutRestored=!0}if(e?.filters&&!this.filtersRestored&&(this.filtersRestored=!0,t.setFilter(e.filters)),e?.headerFilters&&!this.headerFiltersRestored){this.headerFiltersRestored=!0;for(let a of e.headerFilters)t.setHeaderFilterValue(a.field,a.value)}e?.sort?.length&&!this.sortRestored&&(this.sortRestored=!0,setTimeout(()=>{const a=e.sort.map(e=>{const a=t.columnManager.findColumn(e.field);return a?{column:a,dir:e.dir}:null}).filter(Boolean);t.setSort(a)},100)),this.stateRestored=!0}})},handleToggleFullscreenDetail(){this.detailIsFullscreen=!this.detailIsFullscreen},getOptionLabelAbgabetyp:t=>t.bezeichnung,getOptionLabelStg:t=>t.kurzbzlang+" "+t.bezeichnung,getOptionLabelStudiensemester:t=>t.studiensemester_kurzbz,getNotenFilterOptionLabel:t=>t.bezeichnung,formatDate(t){if(null===t)return"";const e=new Date(t),a=t=>String(t).padStart(2,"0"),i=a(e.getMonth()+1);return`${a(e.getDate())}.${i}.${e.getFullYear()}`},formAction(t){const e=document.createElement("div");e.className="d-flex gap-3",e.style.display="flex",e.style.alignItems="stretch",e.style.justifyContent="center",e.style.height="100%";const a=t.getValue(),i=(t,e,a)=>{const i=document.createElement("button");return i.className="btn btn-outline-secondary",i.style.display="flex",i.style.alignItems="center",i.style.justifyContent="center",i.style.height="100%",i.style.aspectRatio="1 / 1",i.style.padding="0","fa fa-timeline"==t&&(i.style.transform="rotate(90deg)"),i.innerHTML=``,i.title=this.$capitalize(this.$p.t(e)),i.addEventListener("click",t=>{t.stopPropagation(),t.stopImmediatePropagation(),a()}),i};return e.append(i("fa fa-folder-open","abgabetool/c4details",()=>this.setDetailComponent(a)),i("fa fa-timeline","abgabetool/c4termineTimeLine",()=>this.openTimeline(a))),e},undoSelection(t){const e=t.getRow();e.isSelected()&&e.deselect()},selectionCheck(t){const e=t.getData();return"Zweitbegutachter"!=e?.betreuerart_kurzbz},showDeadlines(){const t=FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/Cis/Abgabetool/Deadlines";window.open(t,"_blank")},openAddSeriesModal(){this.$refs.modalContainerAddSeries.show()},addSeries(){const t=this.selectedData?.map(t=>t.projektarbeit_id);this.saving=!0,this.serienTermin.fixtermin=!this.serienTermin.invertedFixtermin,this.$api.call(J.postSerientermin(this.serienTermin.datum.toISOString(),this.serienTermin.bezeichnung.paabgabetyp_kurzbz,this.serienTermin.bezeichnung.bezeichnung,this.serienTermin.kurzbz,this.serienTermin.upload_allowed,t,this.serienTermin.fixtermin)).then(e=>{"success"===e.meta.status&&e.data?this.$fhcAlert.alertSuccess(this.$p.t("abgabetool/serienTerminGespeichert")):this.$fhcAlert.alertError(this.$p.t("abgabetool/errorSerienterminSpeichern"));const a=e.data;t.forEach(t=>{const e=a.find(e=>e.projektarbeit_id==t),i=this.projektarbeiten.find(e=>e.projektarbeit_id==t);e.bezeichnung=this.abgabeTypeOptions.find(t=>t.paabgabetyp_kurzbz==e.paabgabetyp_kurzbz),i.abgabetermine.push(e),i.abgabetermine.sort((t,e)=>new Date(t.datum)-new Date(e.datum))}),this.$refs.abgabeTable.tabulator.deselectRow();const i=this.mapProjekteToTableData(this.projektarbeiten);this.$refs.abgabeTable.tabulator.setData(i),this.$refs.abgabeTable.tabulator.redraw(!0)}).finally(()=>{this.saving=!1}),this.$refs.modalContainerAddSeries.hide()},mapProjekteToTableData(t){return t.map(t=>{if(t.selectable=!0,t.prevTermin=null,t.nextTermin=null,this.checkAbgabetermineProjektarbeit(t),this.notenOptions&&t.note){const e=this.notenOptions.find(e=>e.note==t.note);t.note_bez=e.bezeichnung}return{...t,abgabetermine:t.abgabetermine,details:{student_uid:t.student_uid,projektarbeit_id:t.projektarbeit_id},pkz:this.buildPKZ(t),beurteilung:t.beurteilungLink??null,sem:t.studiensemester_kurzbz,stg:this.buildStg(t),mail:this.buildMailToLink(t),erstbetreuer:this.buildErstbetreuer(t),zweitbetreuer:this.buildZweitbetreuer(t),typ:t.projekttyp_kurzbz,titel:t.titel}})},createInfoString(t){let e="";return t.forEach(t=>{e+=t,e+="; "}),e},isPastDate:t=>new Date(t)e.projektarbeit_id==t.projektarbeit_id);e?.abgabetermine?.length&&this.$api.call(J.getSignaturStatusForProjektarbeitAbgaben(e.abgabetermine.map(t=>t.paabgabe_id),e.student_uid)).then(t=>{"success"===t.meta.status&&t.data.forEach(t=>{const a=e.abgabetermine.find(e=>e.paabgabe_id==t.paabgabe_id);a&&void 0!==t.signatur&&(a.signatur=t.signatur)})});const a=null!==e.note;e.abgabetermine.forEach(t=>{"object"!=typeof t.note&&(t.note=this.allowedNotenOptions.find(e=>e.note==t.note)),t.file=[],t.allowedToSave=!a,t.allowedToDelete=!a&&!t.abgabedatum,t.bezeichnung=this.abgabeTypeOptions.find(e=>e.paabgabetyp_kurzbz===t.paabgabetyp_kurzbz)});const i=e.vorname??e.student_vorname,n=e.nachname??e.student_nachname;e.student=`${i} ${n}`,this.selectedProjektarbeit=e,this.$refs.modalContainerAbgabeDetail.show()},dateDiffInDays(t){const e=luxon.DateTime.now().startOf("day");return luxon.DateTime.fromISO(t).startOf("day").diff(e,"days").values.days},getDateStyleClass(t){const e=new Date(t.datum),a=new Date(t.abgabedatum);t.diffindays=this.dateDiffInDays(t.datum);const i=t.abgabedatum&&a>e;return t.note?t.note.positiv?"bestanden":"nichtbestanden":t.bezeichnung?.benotbar&&ee.projektarbeit_id==t.projektarbeit_id);e?(e.abgabetermine.forEach(t=>{const e=this.abgabeTypeOptions.find(e=>e.paabgabetyp_kurzbz==t.paabgabetyp_kurzbz);t.benotbar=e.benotbar}),this.timelineProjekt=e,this.$refs.drawer.show()):this.$fhcAlert.alertInfo("Keine projektarbeit gefunden")},centeredTextFormatter(t){const e=t.getValue();if(e)return'

    '+e+"

    "},detailFormatter:t=>'
    ',mailFormatter:t=>'
    ',timelineFormatter:()=>'
    ',beurteilungFormatter:t=>t.getValue()?'
    ':"-",pkzTextFormatter:t=>'",abgabterminFormatter(t){const e=t.getValue();if(e){let t="";switch(e.dateStyle){case"verspaetet":t='';break;case"verpasst":t='';break;case"abzugeben":t='';break;case"standard":t='';break;case"abgegeben":t='';break;case"beurteilungerfolderlich":t='';break;case"bestanden":t='';break;case"nichtbestanden":t=''}const a=e.bezeichnung?.bezeichnung??e.bezeichnung;return'
    '+t+'

    '+a+" - "+this.formatDate(e.datum)+"

    "}return""},tableResolve(t){this.tableBuiltResolve=t},buildMailToLink(t){return"mailto:"+t.student_uid+"@"+this.domain},buildPKZ:t=>`${t.student_uid} / ${t.matrikelnr}`,buildStg:t=>(t.typ+t.kurzbz)?.toUpperCase(),buildErstbetreuer:t=>t.erstbetreuer_full_name?t.erstbetreuer_full_name:t.betreuer_vorname+" "+t.betreuer_nachname,buildZweitbetreuer:t=>t.zweitbetreuer_full_name??"",async setupData(t){this.projektarbeiten=t[0],this.domain=t[1],this.tableData=this.mapProjekteToTableData(this.projektarbeiten),await this.tableBuiltPromise,this.$refs.abgabeTable.tabulator.setData(this.tableData)},loadProjektarbeiten(t=!1,e){this.loading=!0,this.$api.call(J.getProjektarbeitenForStudiengang(this.selectedStudiengangOption.studiengang_kz,this.notenOptionFilter?.benotet??0)).then(t=>{t?.data&&this.setupData(t.data)}).finally(()=>{e&&e()}).finally(()=>{this.loading=!1})},loadAbgaben(t){return new Promise(e=>{this.$api.call(J.getStudentProjektabgaben(t)).then(t=>{e(t)})})},handleUuidDefined(t){this.tabulatorUuid=t},calcMaxTableHeight(){const t=this.tabulatorUuid?"-"+this.tabulatorUuid:"",e=document.getElementById("filterTableDataset"+t);if(!e)return;const a=e.getBoundingClientRect();this.abgabeTableOptions.height=window.visualViewport.height-a.top-80,this.$refs.abgabeTable.tabulator.setHeight(this.abgabeTableOptions.height)},async setupMounted(){this.tableBuiltPromise=new Promise(this.tableResolve),await this.tableBuiltPromise,await this.allConfigPromise,this.calcMaxTableHeight()},getOptionDisabled:t=>!t.aktiv},computed:{emailItems(){const t=[];return this.ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT&&t.push({label:this.$p.t("abgabetool/c4sendEmailStudierendev2",[this.uniqueStudentEmailCount]),command:this.sammelMailStudent}),this.ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER&&t.push({label:this.$p.t("abgabetool/c4sendEmailBetreuerv2",[this.uniqueBetreuerEmailCount]),command:this.sammelMailBetreuer}),t},uniqueBetreuerEmailCount(){const t=new Set;return this.selectedData.forEach(e=>{e.betreuer_mail&&t.add(e.betreuer_mail),e.zweitbetreuer_mail&&t.add(e.zweitbetreuer_mail)}),t.size},uniqueStudentEmailCount(){const t=new Set;return this.selectedData.forEach(e=>{e.student_uid&&t.add(e.student_uid)}),t.size}},watch:{"serienTermin.bezeichnung"(t){"qualgate1"!==t?.paabgabetyp_kurzbz&&"qualgate2"!==t?.paabgabetyp_kurzbz||(this.serienTermin.kurzbz=t.bezeichnung),this.serienTermin.upload_allowed=t.upload_allowed_default},selectedStudiengangOption(t,e){null!==this.notenOptionFilter&&null!==this.selectedStudiengangOption&&this.loadProjektarbeiten()},notenOptionFilter(t){null!==this.notenOptionFilter&&null!==this.selectedStudiengangOption&&this.loadProjektarbeiten()}},created(){this.loading=!0,this.phrasenPromise=this.$p.loadCategory(["abgabetool","global"]),this.phrasenPromise.then(()=>{this.phrasenResolved=!0});const t=[this.$api.call(J.getConfig()),this.$api.call(J.getStudiengaenge()),this.$api.call(pt.getAllStudiensemesterAndAktOrNext()),this.$api.call(J.getNoten()),this.$api.call(J.getPaAbgabetypen())];this.allConfigPromise=Promise.allSettled(t).then(t=>{if("fulfilled"===t[0].status){const e=t[0].value;this.turnitin_link=e.data?.turnitin_link,this.old_abgabe_beurteilung_link=e.data?.old_abgabe_beurteilung_link,this.ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT=e.data?.ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT,this.ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER=e.data?.ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER}if("fulfilled"===t[1].status){const e=t[1].value;this.studiengaengeOptions=e.data,this.studiengaengeOptions?.length&&(this.selectedStudiengangOption=this.stg_kz_prop?e.data.find(t=>t.studiengang_kz==this.stg_kz_prop):e.data[0])}if("fulfilled"===t[2].status){const e=t[2].value;this.allSem=e.data[0];const a={studiensemester_kurzbz:this.$p.t("abgabetool/c4all")};this.curSem=a,this.studiensemesterOptions=[a,...this.allSem]}if("fulfilled"===t[3].status){const e=t[3].value;"success"===e.meta?.status&&(this.notenOptions=e.data[0],this.allowedNotenOptions=this.notenOptions.filter(t=>e.data[1].includes(t.note)),this.notenOptionsNonFinal=this.notenOptions.filter(t=>e.data[2].includes(t.note))),this.allowedNotenFilterOptions=[{bezeichnung:Vue.computed(()=>this.$p.t("abgabetool/keineNoteEingetragen")),benotet:0},{bezeichnung:Vue.computed(()=>this.$p.t("abgabetool/c4benotet")),benotet:1},{bezeichnung:Vue.computed(()=>this.$p.t("abgabetool/showAll")),benotet:-1}],this.notenOptionFilter=this.allowedNotenFilterOptions[0]}if("fulfilled"===t[4].status){const e=t[4].value;this.abgabeTypeOptions=e.data}}).finally(()=>{this.loading=!1})},mounted(){this.setupMounted()},template:'\n\t\n '},mt={name:"DeadlineOverview",components:{CoreFilterCmpt:st},props:{person_uid_prop:{default:null},viewData:{type:Object,required:!0,default:()=>({name:"",uid:""}),validator:t=>t&&t.name&&t.uid}},data(){return{fullName:null,deadlines:null,tabulatorUuid:Vue.ref(0),tableBuiltResolve:null,tableBuiltPromise:null,phrasenPromise:null,phrasenResolved:!1,deadlineTableOptions:{height:700,index:"projektarbeit_id",layout:"fitColumns",placeholder:Vue.computed(()=>this.$p.t("global/noDataAvailable")),columns:[{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4zieldatum"))),field:"datum",formatter:this.centeredTextFormatter,widthGrow:1,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4fixterminv4"))),field:"fixterminstring",formatter:this.centeredTextFormatter,widthGrow:1,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4abgabetyp"))),field:"typ_bezeichnung",formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4abgabekurzbz"))),field:"kurzbz",formatter:this.centeredTextFormatter,widthGrow:3},{title:Vue.computed(()=>this.$capitalize(this.$p.t("person/studentIn"))),field:"student",formatter:this.centeredTextFormatter,widthGrow:2},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4stg"))),field:"stg",formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4sem"))),field:"semester",formatter:this.centeredTextFormatter,widthGrow:1}],persistence:!1},deadlineTableEventHandlers:[{event:"tableBuilt",handler:async()=>{this.tableBuiltResolve()}},{event:"cellClick",handler:async(t,e)=>{if("details"===e.getColumn().getField()){const t=e.getValue();if("detailTermine"===t.mode)this.setDetailComponent(e.getValue());else if("beurteilungDownload"===t.mode){const e=FHC_JS_DATA_STORAGE_OBJECT.app_root+"cis/private/pdfExport.php?xml=projektarbeitsbeurteilung.xml.php&xsl=Projektbeurteilung&betreuerart_kurzbz="+t.betreuerart_kurzbz+"&projektarbeit_id="+t.projektarbeit_id+"&person_id="+t.betreuer_person_id;window.open(e,"_blank")}}else if("beurteilung"===e.getColumn().getField()){const t=e.getValue();"-"!=t&&window.open(t,"_blank")}t.stopPropagation()}}]}},methods:{centeredTextFormatter:t=>'

    '+t.getValue()+"

    ",tableResolve(t){this.tableBuiltResolve=t},loadDeadlines(){this.$api.call(J.fetchDeadlines(this.person_uid_prop??null)).then(t=>{t?.data&&this.setupData(t.data)})},setupData(t){this.deadlines=t,this.deadlines.forEach(t=>{t.student=(t.stud_titelpre?t.stud_titelpre+" ":"")+t.stud_vorname+" "+t.stud_nachname+(t.stud_titelpost?" "+t.stud_titelpost:""),t.fixterminstring=t.fixtermin?this.$p.t("abgabetool/c4yes"):this.$p.t("abgabetool/c4no")}),this.$refs.deadlineTable.tabulator.setColumns(this.deadlineTableOptions.columns),this.$refs.deadlineTable.tabulator.setData(this.deadlines)},handleUuidDefined(t){this.tabulatorUuid=t},calcMaxTableHeight(){const t=this.tabulatorUuid?"-"+this.tabulatorUuid:"",e=document.getElementById("filterTableDataset"+t);if(!e)return;const a=e.getBoundingClientRect();this.deadlineTableOptions.height=window.visualViewport.height-a.top-30,this.$refs.deadlineTable.tabulator.setHeight(this.deadlineTableOptions.height)},async setupMounted(){this.tableBuiltPromise=new Promise(this.tableResolve),await this.tableBuiltPromise,this.loadDeadlines(),this.calcMaxTableHeight()}},watch:{},computed:{},created(){this.phrasenPromise=this.$p.loadCategory(["abgabetool","global"]),this.phrasenPromise.then(()=>{this.phrasenResolved=!0})},mounted(){this.setupMounted()},template:'\n\t\t

    {{$p.t(\'abgabetool/deadlinesTitle\')}} {{ fullName ? (\'-\' + fullName) : \'\'}}

    \n\t\t
    \n\t\t\t\n\t\t \n '};const vt=Vue.createApp({name:"AbgabetoolApp",components:{AbgabetoolStudent:Z,AbgabetoolMitarbeiter:dt,AbgabetoolAssistenz:ft,DeadlineOverview:mt},data:function(){return{comp:null,uid:null,student_uid:null,stg_kz:null}},methods:{},computed:{viewData(){return{uid:this.uid}},student_uid_computed(){return this.student_uid??this.uid},stg_kz_computed(){return this.stg_kz??null}},created(){},mounted(){const t=document.getElementById("abgabetoolroot"),e=t.getAttribute("route");this.comp=e;const a=t.getAttribute("uid");this.uid=a;const i=t.getAttribute("stg_kz_prop");this.stg_kz=i;const n=t.getAttribute("student_uid_prop");this.student_uid=n},template:'\n\t\t\n\t'});vt.config.globalProperties.$capitalize=function(t){return t?t[0].toUpperCase()+t.slice(1):""},vt.use(primevue.config.default,{zIndex:{overlay:9e3,tooltip:8e3}}),vt.directive("tooltip",primevue.tooltip),vt.use(N),vt.mount("#abgabetoolroot"); +getStatus:function(){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/getStatus",{})},getTopic:function(){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/getTopic",{})},acceptProfilRequest:function({profil_update_id:t,uid:e,status_message:a,topic:i,requested_change:n}){return this.$fhcApi.post(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/acceptProfilRequest",{profil_update_id:t,uid:e,status_message:a,topic:i,requested_change:n})},denyProfilRequest:function({profil_update_id:t,uid:e,topic:a,status_message:i}){return this.$fhcApi.post(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/denyProfilRequest",{profil_update_id:t,uid:e,topic:a,status_message:i})},insertFile:function(t,e=null){return this.$fhcApi.post(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+`/api/frontend/v1/ProfilUpdate/insertFile/${e}`,t)},getProfilRequestFiles:function(t){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+`/api/frontend/v1/ProfilUpdate/getProfilRequestFiles/${t}`,{})},selectProfilRequest:function(t=null,e=null){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/selectProfilRequest",{...t?{uid:t}:{},...e?{id:e}:{}})},insertProfilRequest:function(t,e,a=null){return this.$fhcApi.post(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/insertProfilRequest",{topic:t,payload:e,...a?{fileID:a}:{}})},updateProfilRequest:function(t,e,a,i=null){return this.$fhcApi.post(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/updateProfilRequest",{topic:t,payload:e,ID:a,...i?{fileID:i}:{}})},deleteProfilRequest:function(t){return this.$fhcApi.post(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/deleteProfilRequest",{requestID:t})}},u={getRoomInfo(t,e,a){return this.$fhcApi.post("/api/frontend/v1/LvPlan/getRoomplan",{ort_kurzbz:t,start_date:e,end_date:a})},getStunden(){return this.$fhcApi.get("/api/frontend/v1/LvPlan/Stunden",{})},getOrtReservierungen(t,e,a){return this.$fhcApi.post(`/api/frontend/v1/LvPlan/getReservierungen/${t}`,{start_date:e,end_date:a})},getLvPlanReservierungen(t,e){return this.$fhcApi.post("/api/frontend/v1/LvPlan/getReservierungen",{start_date:t,end_date:e})},getLehreinheitStudiensemester(t){return this.$fhcApi.get(`/api/frontend/v1/LvPlan/getLehreinheitStudiensemester/${t}`,{})},studiensemesterDateInterval(t){return this.$fhcApi.get(`/api/frontend/v1/LvPlan/studiensemesterDateInterval/${t}`,{})},LvPlanEvents(t,e,a){return this.$fhcApi.get("/api/frontend/v1/LvPlan/LvPlanEvents",{start_date:t,end_date:e,lv_id:a})}},b={verband:{get(){return this.$fhcApi.get("api/frontend/v1/stv/verband")},favorites:{get(){return this.$fhcApi.get("api/frontend/v1/stv/favorites")},set(t){return this.$fhcApi.post("api/frontend/v1/stv/favorites/set",{favorites:t})}}},students:{uid(t,e){let a="api/frontend/v1/stv/students/"+encodeURIComponent(e)+"/uid/"+encodeURIComponent(t);return this.$fhcApi.getUri(a)},prestudent(t,e){let a="api/frontend/v1/stv/students/"+encodeURIComponent(e)+"/prestudent/"+encodeURIComponent(t);return this.$fhcApi.getUri(a)},person(t,e){let a="api/frontend/v1/stv/students/"+encodeURIComponent(e)+"/person/"+encodeURIComponent(t);return this.$fhcApi.getUri(a)},verband(t){return this.$fhcApi.getUri("api/frontend/v1/stv/students/"+t)}},filter:{getStg(){return this.$fhcApi.get("api/frontend/v1/stv/filter/getStg")},setStg(t){return this.$fhcApi.post("api/frontend/v1/stv/filter/setStg",{studiengang_kz:t})}},konto:{tabulatorConfig(t,e){return t.ajaxURL="api/frontend/v1/stv/konto/get",t.ajaxParams=()=>({person_id:e.modelValue.person_id||e.modelValue.map(t=>t.person_id),only_open:e.filter,studiengang_kz:e.studiengang_kz_intern?e.stg_kz:""}),t.ajaxRequestFunc=(t,e,a)=>this.$fhcApi.post(t,a,e),t.ajaxResponse=(t,e,a)=>a.data,t},checkDoubles(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/konto/checkDoubles",e,{confirmErrorHandler:t=>!0})},insert(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/konto/insert",e)},counter(t){return this.$fhcApi.post("api/frontend/v1/stv/konto/counter",t)},edit(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/konto/update",e)},delete(t){return this.$fhcApi.post("api/frontend/v1/stv/konto/delete",{buchungsnr:t})},getBuchungstypen(){return this.$fhcApi.get("api/frontend/v1/stv/konto/getBuchungstypen")}},group:{getGruppen(t,e,a){return this.$fhcApi.get("api/frontend/v1/stv/Gruppen/getGruppen/"+a.id)},deleteGroup(t){return this.$fhcApi.post("api/frontend/v1/stv/Gruppen/deleteGruppe/",t)}},kontakt:{getAdressen(t,e,a){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getAdressen/"+a.id)},addNewAddress(t,e,a){return this.$fhcApi.post(t,"api/frontend/v1/stv/kontakt/addNewAddress/"+e,a)},loadAddress(t){return this.$fhcApi.post("api/frontend/v1/stv/kontakt/loadAddress/",{address_id:t})},updateAddress(t,e,a){return this.$fhcApi.post(t,"api/frontend/v1/stv/kontakt/updateAddress/"+e,a)},deleteAddress(t){return this.$fhcApi.post("api/frontend/v1/stv/kontakt/deleteAddress/",{address_id:t})},getPlaces(t){return this.$fhcApi.get("api/frontend/v1/stv/address/getPlaces/"+t)},getFirmen(t){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getFirmen/"+t)},getNations(){return this.$fhcApi.get("api/frontend/v1/stv/address/getNations/")},getAdressentypen(){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getAdressentypen/")},getBankverbindung(t,e,a){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getBankverbindung/"+a.id)},addNewBankverbindung(t,e,a){return this.$fhcApi.post(t,"api/frontend/v1/stv/kontakt/addNewBankverbindung/"+e,a)},loadBankverbindung(t){return this.$fhcApi.post("api/frontend/v1/stv/kontakt/loadBankverbindung/",{bankverbindung_id:t})},updateBankverbindung(t,e,a){return this.$fhcApi.post(t,"api/frontend/v1/stv/kontakt/updateBankverbindung/"+e,a)},deleteBankverbindung(t){return this.$fhcApi.post("api/frontend/v1/stv/kontakt/deleteBankverbindung/",{bankverbindung_id:t})},getKontakte(t,e,a){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getKontakte/"+a.id)},addNewContact(t,e,a){return this.$fhcApi.post(t,"api/frontend/v1/stv/kontakt/addNewContact/"+e,a)},loadContact(t){return this.$fhcApi.post("api/frontend/v1/stv/kontakt/loadContact/",{kontakt_id:t})},updateContact(t,e,a){return this.$fhcApi.post(t,"api/frontend/v1/stv/kontakt/updateContact/"+e,a)},deleteContact(t){return this.$fhcApi.post("api/frontend/v1/stv/kontakt/deleteContact/",{kontakt_id:t})},getStandorteByFirma(t){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getStandorteByFirma/"+t)},getKontakttypen(){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getKontakttypen/")}},prestudent:{get(t,e){return this.$fhcApi.post("api/frontend/v1/stv/prestudent/get/"+encodeURIComponent(t)+"/"+encodeURIComponent(e))},updatePrestudent(t,e,a){return this.$fhcApi.post(t,"api/frontend/v1/stv/prestudent/updatePrestudent/"+e,a)},getBezeichnungZGV(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getBezeichnungZGV/")},getBezeichnungMZgv(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getBezeichnungMZgv/")},getBezeichnungDZgv(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getBezeichnungDZgv/")},getStgs(){return this.$fhcApi.get("api/frontend/v1/stv/lists/getStgs/")},getAusbildung(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getAusbildung/")},getAufmerksamdurch(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getAufmerksamdurch/")},getBerufstaetigkeit(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getBerufstaetigkeit/")},getTypenStg(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getTypenStg/")},getBisstandort(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getBisstandort/")},getHistoryPrestudent(t,e,a){return this.$fhcApi.get("api/frontend/v1/stv/status/getHistoryPrestudent/"+a.id)},getMaxSem(t){return this.$fhcApi.post("api/frontend/v1/stv/status/getMaxSemester/",{studiengang_kzs:t})},advanceStatus({prestudent_id:t,status_kurzbz:e,studiensemester_kurzbz:a,ausbildungssemester:i}){return this.$fhcApi.post("api/frontend/v1/stv/status/advanceStatus/"+t+"/"+e+"/"+a+"/"+i)},confirmStatus({prestudent_id:t,status_kurzbz:e,studiensemester_kurzbz:a,ausbildungssemester:i}){return this.$fhcApi.post("api/frontend/v1/stv/status/confirmStatus/"+t+"/"+e+"/"+a+"/"+i)},isLastStatus(t){return this.$fhcApi.get("api/frontend/v1/stv/status/isLastStatus/"+t)},deleteStatus({prestudent_id:t,status_kurzbz:e,studiensemester_kurzbz:a,ausbildungssemester:i}){return this.$fhcApi.post("api/frontend/v1/stv/status/deleteStatus/"+t+"/"+e+"/"+a+"/"+i)},getLastBismeldestichtag(){return this.$fhcApi.get("api/frontend/v1/stv/status/getLastBismeldestichtag/")},getHistoryPrestudents(t,e,a){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getHistoryPrestudents/"+a.id)}},status:{insertStatus(t,e,a){return this.$fhcApi.post(t,"api/frontend/v1/stv/status/insertStatus/"+e,a)},loadStatus({prestudent_id:t,status_kurzbz:e,studiensemester_kurzbz:a,ausbildungssemester:i}){return this.$fhcApi.post("api/frontend/v1/stv/status/loadStatus/"+t+"/"+e+"/"+a+"/"+i)},updateStatus(t,{prestudent_id:e,status_kurzbz:a,studiensemester_kurzbz:i,ausbildungssemester:n},r){return this.$fhcApi.post(t,"api/frontend/v1/stv/status/updateStatus/"+e+"/"+a+"/"+i+"/"+n,r)},getStudienplaene(t){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getStudienplaene/"+t)},getStudiengang(t){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getStudiengang/"+t)},getStatusgruende(){return this.$fhcApi.get("api/frontend/v1/stv/status/getStatusgruende/")},getStati(){return this.$fhcApi.get("api/frontend/v1/stv/lists/getStati/")},addStudent(t,e){return this.$fhcApi.post("api/frontend/v1/stv/status/addStudent/"+t,e,{errorHeader:t})},changeStatus(t,e){return this.$fhcApi.post("api/frontend/v1/stv/status/changeStatus/"+t,e,{errorHeader:t})},getStatusarray(){return this.$fhcApi.get("api/frontend/v1/stv/status/getStatusarray/")}},details:{get(t,e){let a="api/frontend/v1/stv/student/get/"+encodeURIComponent(t)+"/"+encodeURIComponent(e);return this.$fhcApi.post(a)},save(t,e,a,i){let n="api/frontend/v1/stv/student/save/"+encodeURIComponent(e)+"/"+encodeURIComponent(a);return this.$fhcApi.post(t,n,i)}},exam:{getPruefungen(t,e,a){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/getPruefungen/"+a.id)},loadPruefung(t){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/loadPruefung/"+t)},getTypenPruefungen(){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/getTypenPruefungen")},getAllLehreinheiten(t){return this.$fhcApi.post("api/frontend/v1/stv/pruefung/getAllLehreinheiten/",t)},getLvsByStudent(t){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/getLvsByStudent/"+t)},getLvsandLesByStudent(t,e){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/getLvsandLesByStudent/"+t+"/"+e)},getLvsAndMas(t){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/getLvsAndMas/"+t)},getMitarbeiterLv(t){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/getMitarbeiterLv/"+t)},getNoten(){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/getNoten")},checkZeugnisnoteLv(t){return this.$fhcApi.post("api/frontend/v1/stv/pruefung/checkZeugnisnoteLv/",t)},addPruefung(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/pruefung/insertPruefung/",e)},updatePruefung(t,e,a){return this.$fhcApi.post(t,"api/frontend/v1/stv/pruefung/updatePruefung/"+e,a)},deletePruefung(t){return this.$fhcApi.post("api/frontend/v1/stv/pruefung/deletePruefung/"+t)}},abschlusspruefung:{getAbschlusspruefung(t,e,a){return this.$fhcApi.get("api/frontend/v1/stv/abschlusspruefung/getAbschlusspruefung/"+a.id)},addNewAbschlusspruefung(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/abschlusspruefung/insertAbschlusspruefung/",e)},loadAbschlusspruefung(t){return this.$fhcApi.post("api/frontend/v1/stv/abschlusspruefung/loadAbschlusspruefung/",{id:t})},updateAbschlusspruefung(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/abschlusspruefung/updateAbschlusspruefung/",e)},deleteAbschlusspruefung(t){return this.$fhcApi.post("api/frontend/v1/stv/abschlusspruefung/deleteAbschlusspruefung/",{id:t})},getTypenAbschlusspruefung(){return this.$fhcApi.get("api/frontend/v1/stv/abschlusspruefung/getTypenAbschlusspruefung/")},getTypenAntritte(){return this.$fhcApi.get("api/frontend/v1/stv/abschlusspruefung/getTypenAntritte/")},getBeurteilungen(){return this.$fhcApi.get("api/frontend/v1/stv/abschlusspruefung/getBeurteilungen/")},getAkadGrade(t){return this.$fhcApi.post("api/frontend/v1/stv/abschlusspruefung/getAkadGrade/",{studiengang_kz:t})},getTypStudiengang(t){return this.$fhcApi.post("api/frontend/v1/stv/abschlusspruefung/getTypStudiengang/",{studiengang_kz:t})},getMitarbeiter(t){return this.$fhcApi.get("api/frontend/v1/stv/abschlusspruefung/getMitarbeiter/"+t)},getPruefer(t){return this.$fhcApi.get("api/frontend/v1/stv/abschlusspruefung/getPruefer/"+t)},getNoten(){return this.$fhcApi.get("api/frontend/v1/stv/abschlusspruefung/getNoten/")},checkForExistingExams(t){return this.$fhcApi.post("api/frontend/v1/stv/abschlusspruefung/checkForExistingExams/",{uids:t})}},grades:{list(){return this.$fhcApi.get("api/frontend/v1/stv/grades/list")},getCertificate(t,e){let a="api/frontend/v1/stv/grades/getCertificate/"+encodeURIComponent(t);return e&&(a=a+"/"+encodeURIComponent(e)),this.$fhcApi.get(a)},getTeacherProposal(t,e){let a="api/frontend/v1/stv/grades/getTeacherProposal/"+encodeURIComponent(t);return e&&(a=a+"/"+encodeURIComponent(e)),this.$fhcApi.get(a)},getRepeaterGrades(t,e){let a="api/frontend/v1/stv/grades/getRepeaterGrades/"+encodeURIComponent(t);return e&&(a=a+"/"+encodeURIComponent(e)),this.$fhcApi.get(a)},updateCertificate({lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:a,note:i,lehrveranstaltung_bezeichnung:n}){return this.$fhcApi.post("api/frontend/v1/stv/grades/updateCertificate",{lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:a,note:i},{errorHeader:n})},deleteCertificate({lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:a,lehrveranstaltung_bezeichnung:i}){return this.$fhcApi.post("api/frontend/v1/stv/grades/deleteCertificate",{lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:a},{errorHeader:i})},copyTeacherProposalToCertificate({lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:a,lehrveranstaltung_bezeichnung:i}){return this.$fhcApi.post("api/frontend/v1/stv/grades/copyTeacherProposalToCertificate",{lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:a},{errorHeader:i})},copyRepeaterGradeToCertificate({studierendenantrag_lehrveranstaltung_id:t,lv_bezeichnung:e}){return this.$fhcApi.post("api/frontend/v1/stv/grades/copyRepeaterGradeToCertificate",{studierendenantrag_lehrveranstaltung_id:t},{errorHeader:e})},getGradeFromPoints(t,e,a,i){const n=i?{errorHandling:!1}:{};return this.$fhcApi.post("api/frontend/v1/stv/grades/getGradeFromPoints",{points:t,lehrveranstaltung_id:e,studiensemester_kurzbz:a},n)}},mobility:{getMobilitaeten(t,e,a){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getMobilitaeten/"+a.id)},getProgramsMobility(){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getProgramsMobility/")},addNewMobility(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/mobility/insertMobility/",e)},loadMobility(t){return this.$fhcApi.get("api/frontend/v1/stv/mobility/loadMobility/"+t)},updateMobility(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/mobility/updateMobility/",e)},deleteMobility(t){return this.$fhcApi.post("api/frontend/v1/stv/mobility/deleteMobility/"+t)},getLVList(t){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getLVList/"+t)},getAllLehreinheiten(t){return this.$fhcApi.post("api/frontend/v1/stv/mobility/getAllLehreinheiten/",t)},getLvsandLesByStudent(t){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getLvsandLesByStudent/"+t)},getPurposes(t,e,a){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getPurposes/"+a.id)},getSupports(t,e,a){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getSupports/"+a.id)},getListPurposes(){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getListPurposes/")},getListSupports(){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getListSupports/")},deleteMobilityPurpose(t){return this.$fhcApi.post("api/frontend/v1/stv/mobility/deleteMobilityPurpose/"+t.bisio_id,t)},addMobilityPurpose(t){return this.$fhcApi.post("api/frontend/v1/stv/mobility/addMobilityPurpose/"+t.bisio_id,t)},deleteMobilitySupport(t){return this.$fhcApi.post("api/frontend/v1/stv/mobility/deleteMobilitySupport/"+t.bisio_id,t)},addMobilitySupport(t){return this.$fhcApi.post("api/frontend/v1/stv/mobility/addMobilitySupport/"+t.bisio_id,t)}},archiv:{tabulatorConfig(t,e){return t.ajaxURL="api/frontend/v1/stv/archiv/get",t.ajaxParams=()=>({person_id:e.modelValue.person_id||e.modelValue.map(t=>t.person_id)}),t.ajaxRequestFunc=(t,e,a)=>this.$fhcApi.post(t,a,e),t.ajaxResponse=(t,e,a)=>a.data,t},getArchivVorlagen(){return this.$fhcApi.post("api/frontend/v1/stv/archiv/getArchivVorlagen")},archive(t){return this.$fhcApi.post("api/frontend/v1/documents/archive",t)},archiveSigned(t){return this.$fhcApi.post("api/frontend/v1/documents/archiveSigned",t)},update(t){return this.$fhcApi.post("api/frontend/v1/stv/archiv/update",t)},delete({akte_id:t,studiengang_kz:e}){return this.$fhcApi.post("api/frontend/v1/stv/archiv/delete",{akte_id:t,studiengang_kz:e})}},documents:{getDocumentsUnaccepted(t,e,a){return this.$fhcApi.get("api/frontend/v1/stv/dokumente/getDocumentsUnaccepted/"+a.id+"/"+a.studiengang_kz)},getDocumentsAccepted(t,e,a){return this.$fhcApi.get("api/frontend/v1/stv/dokumente/getDocumentsAccepted/"+a.id+"/"+a.studiengang_kz)},deleteZuordnung(t){return this.$fhcApi.post("api/frontend/v1/stv/dokumente/deleteZuordnung/"+t.prestudent_id+"/"+t.dokument_kurzbz)},createZuordnung(t){return this.$fhcApi.post("api/frontend/v1/stv/dokumente/createZuordnung/"+t.prestudent_id+"/"+t.dokument_kurzbz)},loadAkte(t){return this.$fhcApi.get("api/frontend/v1/stv/dokumente/loadAkte/"+t)},getDoktypen(){return this.$fhcApi.get("api/frontend/v1/stv/dokumente/getDoktypen/")},updateFile(t,e){return this.$fhcApi.post("api/frontend/v1/stv/dokumente/updateAkte/"+t,e)},deleteFile(t){return this.$fhcApi.post("api/frontend/v1/stv/dokumente/deleteAkte/"+t)},uploadFile(t,e){return this.$fhcApi.post("api/frontend/v1/stv/dokumente/uploadDokument/"+t,e)}},exemptions:{getAnrechnungen(t,e,a){return this.$fhcApi.get("api/frontend/v1/stv/anrechnungen/getAnrechnungen/"+a.id)},getLehrveranstaltungen(t){return this.$fhcApi.get("api/frontend/v1/stv/anrechnungen/getLehrveranstaltungen/"+t)},getBegruendungen(){return this.$fhcApi.get("api/frontend/v1/stv/anrechnungen/getBegruendungen/")},getLvsKompatibel(t){return this.$fhcApi.get("api/frontend/v1/stv/anrechnungen/getLvsKompatibel/"+t)},getLektoren(t){return this.$fhcApi.get("api/frontend/v1/stv/anrechnungen/getLektoren/"+t)},addNewAnrechnung(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/anrechnungen/insertAnrechnung/",e)},loadAnrechnung(t){return this.$fhcApi.get("api/frontend/v1/stv/anrechnungen/loadAnrechnung/"+t)},editAnrechnung(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/anrechnungen/updateAnrechnung/",e)},deleteAnrechnung(t){return this.$fhcApi.post("api/frontend/v1/stv/anrechnungen/deleteAnrechnung/"+t)}},jointstudies:{getStudies(t,e,a){return this.$fhcApi.get("api/frontend/v1/stv/GemeinsameStudien/getStudien/"+a.id)},getTypenMobility(){return this.$fhcApi.get("api/frontend/v1/stv/GemeinsameStudien/getTypenMobility/")},getStudiensemester(){return this.$fhcApi.get("api/frontend/v1/stv/GemeinsameStudien/getStudiensemester/")},getStudyprograms(){return this.$fhcApi.get("api/frontend/v1/stv/GemeinsameStudien/getStudienprogramme/")},getListPartner(){return this.$fhcApi.get("api/frontend/v1/stv/GemeinsameStudien/getPartnerfirmen/")},getStatiPrestudent(){return this.$fhcApi.get("api/frontend/v1/stv/GemeinsameStudien/getStatiPrestudent/")},loadStudy(t){return this.$fhcApi.get("api/frontend/v1/stv/GemeinsameStudien/loadStudie/"+t)},insertStudy(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/GemeinsameStudien/insertStudie/",e)},updateStudy(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/GemeinsameStudien/updateStudie/",e)},deleteStudy(t){return this.$fhcApi.post("api/frontend/v1/stv/GemeinsameStudien/deleteStudie/"+t)}},courselist:{getCourselist(t,e,a){return this.$fhcApi.get("api/frontend/v1/stv/LvTermine/getStundenplan/"+a.student_uid+"/"+a.start_date+"/"+a.end_date+"/"+a.group_consecutiveHours+"/"+a.dbStundenplanTable)},getStudiensemester(){return this.$fhcApi.get("api/frontend/v1/stv/LvTermine/getStudiensemester/")}},configStudent(){return this.$fhcApi.get("api/frontend/v1/stv/config/student")},configStudents(){return this.$fhcApi.get("api/frontend/v1/stv/config/students")}},h={person:{getNotizen(t,e,a){return this.$fhcApi.get("api/frontend/v1/notiz/notizPerson/getNotizen/"+a.id+"/"+a.type)},getUid(){return this.$fhcApi.get("api/frontend/v1/notiz/notizPerson/getUid/")},addNewNotiz(t,e,a){return this.$fhcApi.post(t,"api/frontend/v1/notiz/notizPerson/addNewNotiz/"+e,a)},loadNotiz(t){return this.$fhcApi.post("api/frontend/v1/notiz/notizPerson/loadNotiz/",{notiz_id:t})},loadDokumente(t){return this.$fhcApi.post("api/frontend/v1/notiz/notizPerson/loadDokumente/",{notiz_id:t})},deleteNotiz(t,e,a){return this.$fhcApi.post("api/frontend/v1/notiz/notizPerson/deleteNotiz/",{notiz_id:t,type_id:e,id:a})},updateNotiz(t,e,a){return this.$fhcApi.post(t,"api/frontend/v1/notiz/notizPerson/updateNotiz/"+e,a)},getMitarbeiter(t){return this.$fhcApi.get("api/frontend/v1/notiz/notizPerson/getMitarbeiter/"+t)},isBerechtigt(t,e){return this.$fhcApi.get("api/frontend/v1/notiz/notizPerson/isBerechtigt/")}}},g={person:{getAllBetriebsmittel(t,e,a){return this.$fhcApi.get("api/frontend/v1/betriebsmittel/betriebsmittelP/getAllBetriebsmittel/"+a.type+"/"+a.id)},addNewBetriebsmittel(t,e,a){return this.$fhcApi.post(t,"api/frontend/v1/betriebsmittel/betriebsmittelP/addNewBetriebsmittel/"+e,a)},loadBetriebsmittel(t){return this.$fhcApi.post("api/frontend/v1/betriebsmittel/betriebsmittelP/loadBetriebsmittel/"+t)},updateBetriebsmittel(t,e,a){return this.$fhcApi.post(t,"api/frontend/v1/betriebsmittel/betriebsmittelP/updateBetriebsmittel/"+e,a)},deleteBetriebsmittel(t){return this.$fhcApi.post("api/frontend/v1/betriebsmittel/betriebsmittelP/deleteBetriebsmittel/"+t)},getTypenBetriebsmittel(){return this.$fhcApi.get("api/frontend/v1/betriebsmittel/betriebsmittelP/getTypenBetriebsmittel/")},loadInventarliste(t){return this.$fhcApi.get("api/frontend/v1/betriebsmittel/betriebsmittelP/loadInventarliste/"+t)}}},f={updatePersonUnrulyStatus(t,e){try{const a={person_id:t,unruly:e},i="/api/frontend/v1/checkperson/CheckPerson/updatePersonUnrulyStatus";return this.$fhcApi.post(i,a,null)}catch(t){throw t}},filterPerson(t,e=""){try{const a=e+"/api/frontend/v1/checkperson/CheckPerson/filterPerson";return axios.post(a,t)}catch(t){throw t}}},m={getContentID(t){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/Ort/ContentID",{ort_kurzbz:t})},getRooms(t,e,a,i,n=0){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/Ort/getRooms",{datum:t,von:e,bis:a,typ:i,personenanzahl:n})},getRoomTypes(){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/Ort/getTypes")}},v={content(t,e=null,a=null,i=null){return this.$fhcApi.get("/api/frontend/v1/Cms/content",{content_id:t,...e?{version:e}:{},...a?{sprache:a}:{},...i?{sichtbar:i}:{}})},getNews(t=1,e=10,a){return this.$fhcApi.get("/api/frontend/v1/Cms/getNews",{page:t,page_size:e,sprache:a})},news(t){return this.$fhcApi.get("/api/frontend/v1/Cms/news",{limit:t})},getNewsRowCount:function(){return this.$fhcApi.get("/api/frontend/v1/Cms/getNewsRowCount",{})},getNewsExtra:function(){return this.$fhcApi.get("/api/frontend/v1/Cms/getStudiengangInfoForNews",{})}},y={getStudentenMail(t){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/Lehre/lvStudentenMail",{lehreinheit_id:t})},getLvInfo(t,e){return this.$fhcApi.get(`/api/frontend/v1/Lehre/LV/${t}/${e}`,{})},getStudentPruefungen(t){return this.$fhcApi.get(`/api/frontend/v1/Lehre/Pruefungen/${t}`,{})}},A={getLvMenu(t,e){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+`/api/frontend/v1/LvMenu/getLvMenu/${t}/${e}`,{})}},w={person:{getMessages(t,e,a){return this.$fhcApi.get("api/frontend/v1/messages/messages/getMessages/"+a.id+"/"+a.type+"/"+a.size+"/"+a.page)},getVorlagen(){return this.$fhcApi.get("api/frontend/v1/messages/messages/getVorlagen/")},getMsgVarsLoggedInUser(){return this.$fhcApi.get("api/frontend/v1/messages/messages/getMsgVarsLoggedInUser/")},getMessageVarsPerson(t){return this.$fhcApi.get("api/frontend/v1/messages/messages/getMessageVarsPerson/"+t.id+"/"+t.type_id)},getMsgVarsPrestudent(t){return this.$fhcApi.get("api/frontend/v1/messages/messages/getMsgVarsPrestudent/"+t.id+"/"+t.type_id)},getPersonId(t){return this.$fhcApi.get("api/frontend/v1/messages/messages/getPersonId/"+t.id+"/"+t.type_id)},getUid(t){return this.$fhcApi.get("api/frontend/v1/messages/messages/getUid/"+t.id+"/"+t.type_id)},getDataVorlage(t){return this.$fhcApi.get("api/frontend/v1/messages/messages/getDataVorlage/"+t)},getNameOfDefaultRecipient(t){return this.$fhcApi.get("api/frontend/v1/messages/messages/getNameOfDefaultRecipient/"+t.id+"/"+t.type_id)},getPreviewText(t,e){return this.$fhcApi.post("api/frontend/v1/messages/messages/getPreviewText/"+t.id+"/"+t.type_id,e)},getReplyData(t){return this.$fhcApi.get("api/frontend/v1/messages/messages/getReplyData/"+t)},sendMessageFromModalContext(t,e,a){return this.$fhcApi.post(t,"api/frontend/v1/messages/messages/sendMessage/"+e,a)},sendMessage(t,e){return this.$fhcApi.post("api/frontend/v1/messages/messages/sendMessage/"+t,e)},deleteMessage(t){return this.$fhcApi.post("api/frontend/v1/messages/messages/deleteMessage/"+t)}}},_={getVorlagen(){return this.$fhcApi.get("api/frontend/v1/vorlagen/vorlagen/getVorlagen/")},getVorlagenByLoggedInUser(){return this.$fhcApi.get("api/frontend/v1/vorlagen/vorlagen/getVorlagenByLoggedInUser/")}},$={getStudiensemester:function(){return this.$fhcApi.get("/components/Cis/Mylv/Studiensemester",{})},getAllStudienSemester:function(t=void 0,e=void 0,a=void 0,i=void 0){return this.$fhcApi.get("/api/frontend/v1/Studium/getStudienAllSemester",{studiensemester:t,studiengang:e,semester:a,studienplan:i})},getStudiengaengeForStudienSemester:function(t){return this.$fhcApi.get(`/api/frontend/v1/Studium/getStudiengaengeForStudienSemester/${t}`,{})},getStudienplaeneBySemester:function(t,e){return this.$fhcApi.get("/api/frontend/v1/Studium/getStudienplaeneBySemester",{studiengang:t,studiensemester:e})},getLvPlanForStudiensemester:function(t,e){return this.$fhcApi.get(`/api/frontend/v1/LvPlan/getLvPlanForStudiensemester/${t}/${e}`,{})},getLvEvaluierungInfo:function(t,e){return this.$fhcApi.get(`/api/frontend/v1/Studium/getLvEvaluierungInfo/${t}/${e}`,{})}},k={search:r,phrasen:s,navigation:o,dashboard:{async getViewData(){return this.$fhcApi.get("/api/frontend/v1/Cis4FhcApi/getViewData",null,null)}},filter:l,studstatus:d,profil:c,profilUpdate:p,lvPlan:u,bookmark:{getBookmarks:function(){return this.$fhcApi.get("/api/frontend/v1/Bookmark/getBookmarks",{})},delete:function(t){return this.$fhcApi.get(`/api/frontend/v1/Bookmark/delete/${t}`,{})},update:function({bookmark_id:t,url:e,title:a,tag:i=null}){return this.$fhcApi.post(`/api/frontend/v1/Bookmark/update/${t}`,{url:e,title:a})},insert:function({url:t,title:e,tag:a}){return this.$fhcApi.post("/api/frontend/v1/Bookmark/insert",{url:t,title:e,tag:a})}},stv:b,notiz:h,betriebsmittel:g,checkperson:f,ampeln:{open:function(){return this.$fhcApi.get("/api/frontend/v1/Ampeln/open",{})},all:function(){return this.$fhcApi.get("/api/frontend/v1/Ampeln/all",{})},confirm:function(t){return this.$fhcApi.get(`/api/frontend/v1/Ampeln/confirm/${t}`,{})}},ort:m,cms:v,lehre:y,addons:A,messages:w,vorlagen:_,addons:A,studiengang:{studiengangInformation:function(){return this.$fhcApi.get("/api/frontend/v1/Studgang/getStudiengangInfo",{})},getStudiengangByKz:function(t){return this.$fhcApi.get("/api/frontend/v1/organisation/StudiengangEP/getStudiengangByKz",{studiengang_kz:t})}},menu:{getMenu:function(){return this.$fhcApi.get("/api/frontend/v1/CisMenu/getMenu",{})}},authinfo:{getAuthUID(){return this.$fhcApi.get("/api/frontend/v1/AuthInfo/getAuthUID",{})},getAuthInfo(){return this.$fhcApi.get("/api/frontend/v1/AuthInfo/getAuthInfo",{})}},studium:$,language:{getAll(){return this.$fhcApi.get("/api/frontend/v1/language/get")}}},T={install:(t,e)=>{if(t.config.globalProperties.$fhcApi)return void(e?.factory&&(console.warn("$fhcApi is DEPRECATED!"),t.config.globalProperties.$fhcApi.factory.addEndpoints(e.factory)));function a(t,e,a,i){if("string"==typeof t&&void 0===i)[e,a,i]=[t,e,a],t=void 0;else if(t){if("object"!=typeof t)throw new TypeError("Parameter 1 of _get_config must be an object or a string");void 0===e&&void 0===a&&void 0===i&&(i=t,t=void 0)}if(t){if(!t.clearValidation||!t.setFeedback)throw new TypeError("'form' is not a Form Component");t={clearValidation:t.clearValidation,setFeedback:t.setFeedback},i?i.form=t:i={form:t}}return[e,a,i]}function i(t){const e=t.data;return delete t.data,e.meta?e.meta.response=t:e.meta={response:t},e}FHC_JS_DATA_STORAGE_OBJECT.app_root,FHC_JS_DATA_STORAGE_OBJECT.ci_router;const n=axios.create({timeout:5e5,baseURL:FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/"});n.interceptors.request.use(t=>{if("post"!=t.method||!t.data)return t;if(t.data instanceof FormData)return t;if(!Object.values(t.data).every(t=>!(t instanceof FileList)&&(!Array.isArray(t)||t.every(t=>!(t instanceof File))))){const e=Object.entries(t.data).reduce((t,[e,a])=>{if(a instanceof FileList)for(const i of a)t.FormData.append(e+(a.length>1?"[]":""),i);else Array.isArray(a)?a.every(t=>!(t instanceof File))?t.jsondata[e]=a:a.forEach(i=>t.FormData.append(e+(a.length>1?"[]":""),i)):t.jsondata[e]=a;return t},{FormData:new FormData,jsondata:{}});e.FormData.append("_jsondata",JSON.stringify(e.jsondata)),t.data=e.FormData}return t}),n.interceptors.response.use(e=>("off"==e.config?.errorHandling||!1===e.config?.errorHandling||"fail"==e.config?.errorHandling||e.data.errors&&(e.data.errors=e.data.errors.filter(a=>(e.config[a.type+"ErrorHandler"]||t.config.globalProperties.$fhcApi._defaultErrorHandlers[a.type])(a,e.config))),i(e)),e=>"ERR_CANCELED"==e.code?Promise.reject({handled:!0,...e}):"off"==e.config?.errorHandling||!1===e.config?.errorHandling||"success"==e.config?.errorHandling?Promise.reject(e):e.response?404==e.response.status?(t.config.globalProperties.$fhcAlert.alertDefault("error",e.message,e.request.responseURL,!0),Promise.reject({handled:!0,...e})):(e.response.data.errors=e.response.data.errors.filter(a=>(e.config[a.type+"ErrorHandler"]||t.config.globalProperties.$fhcApi._defaultErrorHandlers[a.type])(a,e.config)),e.response.data.errors.length?Promise.reject(e):Promise.reject({handled:!0,...e})):e.request?(t.config.globalProperties.$fhcAlert.alertDefault("error",e.message,e.request.responseURL),Promise.reject({handled:!0,...e})):(t.config.globalProperties.$fhcAlert.alertError(e.message),Promise.reject({handled:!0,...e}))),t.config.globalProperties.$fhcApi={getUri:t=>(console.warn("$fhcApi.getUri is DEPRECATED! Use $api.getUri instead."),n.getUri({url:t})),get:(t,e,i,r)=>(console.warn("$fhcApi.get is DEPRECATED! Use $api.get instead."),[e,i,r]=a(t,e,i,r),i&&(r?r.params=i:r={params:i}),n.get(e,r)),post:(t,e,i,r)=>(console.warn("$fhcApi.post is DEPRECATED! Use $api.post instead."),[e,i,r]=a(t,e,i,r),n.post(e,i,r)),_defaultErrorHandlers:{validation(e,a){const i=t.config.globalProperties.$fhcAlert;return a?.form?(a.form.clearValidation(),a.form.setFeedback(!1,e.messages),!1):Array.isArray(e.messages)?(e.messages.forEach(i.alertError),!1):"object"!=typeof e.messages||(a?.errorHeader?Object.values(e.messages).forEach(e=>i.alertDefault("error",Array.isArray(a.errorHeader)?t.config.globalProperties.$p.t.apply(null,a.errorHeader):a.errorHeader,e,!0)):Object.entries(e.messages).forEach(([t,e])=>i.alertDefault("error",t,e,!0)),!1)},general(e,a){const i=t.config.globalProperties.$fhcAlert;a?.form?a.form.setFeedback(!1,e.message):a?.errorHeader?i.alertDefault("error",Array.isArray(a.errorHeader)?t.config.globalProperties.$p.t.apply(null,a.errorHeader):a.errorHeader,e.message,!0):i.alertError(e.message)},php(e){const a=t.config.globalProperties.$fhcAlert;var i="";switch(i+="Message: "+e.message+"\n\n",i+="Filename: "+e.filename+"\n",i+="Line Number: "+e.line+"\n",e.backtrace&&e.backtrace.length&&(i+="\nBacktrace: ",e.backtrace.forEach(t=>{i+="\n\tFile: "+t.file+"\n",i+="\tLine: "+t.line+"\n",i+="\tFunction: "+t.function+"\n"})),e.severity){case"Warning":case"Core Warning":case"Compile Warning":case"User Warning":a.alertDefault("warn","PHP "+e.severity,i,!0);break;case"Notice":case"User Notice":case"Runtime Notice":a.alertDefault("info","PHP "+e.severity,i,!0);break;default:i="Type: PHP "+e.severity+"\n\n"+i,a.alertSystemError(i)}},exception(e){const a=t.config.globalProperties.$fhcAlert;var i="";i+="Type: "+e.class+"\n\n",i+="Message: "+e.message+"\n\n",i+="Filename: "+e.filename+"\n",i+="Line Number: "+e.line+"\n",e.backtrace&&e.backtrace.length&&(i+="\nBacktrace: ",e.backtrace.forEach(t=>{i+="\n\tFile: "+t.file+"\n",i+="\tLine: "+t.line+"\n",i+="\tFunction: "+t.function+"\n"})),a.alertSystemError(i)},db(e){const a=t.config.globalProperties.$fhcAlert;var i="";void 0!==e.heading&&(i+=e.heading+"\n\n"),void 0!==e.code&&(i+="Code: "+e.code+"\n\n"),void 0!==e.sql&&(i+="SQL: "+e.sql+"\n\n"),void 0!==e.message?i+="Message: "+e.message+"\n\n":void 0!==e.messages&&(i+="Messages: "+e.messages.join("\n\t")+"\n\n"),void 0!==e.filename&&(i+="Filename: "+e.filename+"\n"),void 0!==e.line&&(i+="Line Number: "+e.line+"\n"),a.alertSystemError(i)},auth(e,a){const i=t.config.globalProperties.$fhcAlert;var n="";n+="Controller name: "+e.controller+"\n",n+="Method name: "+e.method+"\n",n+="Required permissions: "+e.required_permissions,a?.errorHeader?i.alertDefault("error",Array.isArray(a.errorHeader)?t.config.globalProperties.$p.t.apply(null,a.errorHeader):a.errorHeader,e.message,!0):i.alertDefault("error",e.message,n)}}};class r{constructor(e,a){void 0===a?(this.$fhcApi={getUri:e=>(console.warn("$fhcApi.factory is DEPRECATED!"),t.config.globalProperties.$fhcApi.getUri(e)),get:(e,a,i,n)=>(console.warn("$fhcApi.factory is DEPRECATED!"),t.config.globalProperties.$fhcApi.get(e,a,i,n)),post:(e,a,i,n)=>(console.warn("$fhcApi.factory is DEPRECATED!"),t.config.globalProperties.$fhcApi.post(e,a,i,n))},Object.defineProperty(this.$fhcApi,"factory",{get:()=>(console.warn("$fhcApi.factory is DEPRECATED!"),t.config.globalProperties.$fhcApi.factory)}),t.config.globalProperties.$fhcApi.factory=this):Object.defineProperty(this,"$fhcApi",{get(){return(a||this).$fhcApi}}),this.addEndpoints(e,!0)}addEndpoints(t,e){Object.keys(t).forEach(e=>{Object.defineProperty(this,e,{get(){return"function"==typeof t[e]?t[e].bind(this):new r(t[e],this.$fhcApi.factory)}})}),e||console.warn("$fhcApi.factory.addEndpoints() is DEPRECATED!")}}const s=new r(k);e?.factory&&(console.warn("$fhcApi is DEPRECATED!"),s.addEndpoints(e.factory)),t.config.globalProperties.$fhcApi.factory=s,t.provide("$fhcApi",t.config.globalProperties.$fhcApi)}};const S="error",z="retval",F={get:function(t,e,a=null){return F._axiosCall(t,e,"get",a)},post:function(t,e,a=null){return F._axiosCall(t,e,"post",a)},isSuccess:function(t){return!("object"!=typeof t||!t.hasOwnProperty(S)||!t.hasOwnProperty(z)||0!=t.error)},isError:function(t){return!F.isSuccess(t)},hasData:function(t){return!(!F.isSuccess(t)||!("object"==typeof t[z]&&Object.keys(t[z]).length>0||"array"==typeof t[z]&&t[z].length>0||"string"==typeof t[z]&&""!=t[z].trim()||"number"==typeof t[z]))},getData:function(t){return F.hasData(t)?t[z]:null},getError:function(t){return"object"==typeof t&&Object.keys(t).length>0&&t.hasOwnProperty(z)?t[z]:"Generic error"},getErrorCode:function(t){return"object"==typeof t&&t.hasOwnProperty(S)?t[S]:1},_generateRouterURI:function(t){var e=null;return"undefined"!=typeof FHC_JS_DATA_STORAGE_OBJECT&&(e=FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/"+t),e},_printDebug:function(t,e,a){},_axiosCall:function(t,e,a,i){let n={method:a,url:F._generateRouterURI(t),timeout:5e3};if("get"==a?n.params=e:n.data=e,"object"==typeof i)for(var r in i)n[r]=i[r];return axios(n)}},x=document.createElement("div"),C=Vue.createApp({name:"FhcAlertApp",components:{PvToast:e,PvConfirm:a},methods:{mailToUrl:t=>"mailto:"+FHC_JS_DATA_STORAGE_OBJECT.systemerror_mailto+"?subject=Meldung%20Systemfehler&body="+("\n\t\t\t\tDanke, dass Sie uns den Fehler melden. %0D%0A %0D%0A\n\t\t\t\tBitte beschreiben Sie uns ausführlich das Problem.%0D%0A\n\t\t\t\tBsp: Ich habe X ausgewählt und Y angelegt. Beim Speichern erhielt ich die Fehlermeldung. [Optional: Ich habe den Browser Z verwendet.]%0D%0A\n\t\t\t\t-----------------------------------------------------------------------------------------------------------------------------------%0D%0A\n\t\t\t\tPROBLEM: ... %0D%0A %0D%0A %0D%0A\n\n\t\t\t\t-----------------------------------------------------------------------------------------------------------------------------------%0D%0A\n\t\t\t\tFehler URL: "+FHC_JS_DATA_STORAGE_OBJECT.called_path+"/"+FHC_JS_DATA_STORAGE_OBJECT.called_method+"%0D%0A\n\t\t\t\tFehler Meldung: "+t.message.detail+"%0D%0A\n\t\t\t\t-----------------------------------------------------------------------------------------------------------------------------------%0D%0A %0D%0A\n\t\t\t\tWir kümmern uns um eine rasche Behebung des Problems!"),openMessagecard(t){bootstrap.Collapse.getOrCreateInstance(t.target.getAttribute("href")).toggle()}},unmounted(){x.parentElement.removeChild(x)},computed:{showmaillink:function(){return""!==FHC_JS_DATA_STORAGE_OBJECT.systemerror_mailto}},template:'\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t'});C.use(t),C.use(i);const D=C.mount(x);document.body.appendChild(x);var O={install:(t,e)=>{t.config.globalProperties.$p||t.use(N);const a={alertSuccess(t){if(Array.isArray(t))return t.forEach(this.alertSuccess);D.$refs.toast.add({severity:"success",summary:"Info",detail:t,life:1e3})},alertInfo(t){if(Array.isArray(t))return t.forEach(this.alertInfo);D.$refs.toast.add({severity:"info",summary:"Info",detail:t,life:3e3})},alertWarning(t){if(Array.isArray(t))return t.forEach(this.alertWarning);D.$refs.toast.add({severity:"warn",summary:"Achtung",detail:t})},alertError(t){if(Array.isArray(t))return t.forEach(this.alertError);D.$refs.toast.add({severity:"error",summary:"Achtung",detail:t})},alertSystemError(e){if(Array.isArray(e))return e.forEach(this.alertSystemError);D.$refs.alert.add({severity:"error",summary:Vue.computed(()=>t.config.globalProperties.$p.t("alert/systemerror")),detail:e})},confirmDelete:()=>new Promise((e,a)=>{D.$confirm.require({group:"fhcAlertConfirm",header:Vue.computed(()=>t.config.globalProperties.$p.t("alert/attention")),message:Vue.computed(()=>t.config.globalProperties.$p.t("alert/confirm_delete")),acceptLabel:Vue.computed(()=>t.config.globalProperties.$p.t("ui/loeschen")),acceptClass:"p-button-danger",rejectLabel:Vue.computed(()=>t.config.globalProperties.$p.t("ui/abbrechen")),rejectClass:"p-button-secondary",accept(){e(!0)},reject(){e(!1)}})}),confirm:e=>new Promise((a,i)=>{D.$confirm.require({group:e?.group??"fhcAlertConfirm",header:e?.header??Vue.computed(()=>t.config.globalProperties.$p.t("alert/attention")),message:e?.message??"",acceptLabel:e?.acceptLabel??"Ok",acceptClass:e?.acceptClass??"btn btn-primary",rejectLabel:e?.rejectLabel??Vue.computed(()=>t.config.globalProperties.$p.t("ui/abbrechen")),rejectClass:e?.rejectClass??"btn btn-outline-secondary",accept(){a(!0)},reject(){a(!1)}})}),alertDefault(t,e,a,i=!1,n=!1){let r={severity:t,summary:e,detail:a,html:n};i||(r.life=3e3),D.$refs.toast.add(r)},alertMultiple(t,e="info",a="Info",i=!1,n=!1){return!!t.every(t=>"string"==typeof t)&&(t.forEach(t=>this.alertDefault(e,a,t,i,n)),!0)},handleSystemError(t){if(!t.hasOwnProperty("name")||t.name.toLowerCase()!=="AbortError".toLowerCase()){if("string"==typeof t)return a.alertSystemError(t);if(Array.isArray(t)&&t.every(t=>"string"==typeof t))return t.every(a.alertSystemError);if(!t.hasOwnProperty("handled")||!t.handled){if("object"==typeof t&&null!==t){let e="";return t.hasOwnProperty("response")&&t.response?.data?.retval?e+="Error Message: "+(t.response.data.retval.message||t.response.data.retval)+"\r\n":t.hasOwnProperty("message")&&(e+="Error Message: "+t.message.toUpperCase()+"\r\n"),t.hasOwnProperty("config")&&t.config.hasOwnProperty("url")&&(e+="Error ConfigURL: "+t.config.url+"\r\n"),t.hasOwnProperty("stack")&&(e+="Error Stack: "+t.stack+"\r\n"),""==e&&(e="Error Message: "+JSON.stringify(t)+"\r\n"),e+="Error Controller Path: "+FHC_JS_DATA_STORAGE_OBJECT.called_path+"/"+FHC_JS_DATA_STORAGE_OBJECT.called_method,a.alertSystemError(e)}a.alertSystemError("alertSystemError throws Generic Error\r\nError Controller Path: "+FHC_JS_DATA_STORAGE_OBJECT.called_path+"/"+FHC_JS_DATA_STORAGE_OBJECT.called_method)}}},handleSystemMessage(t){if("string"==typeof t)return a.alertWarning(t);if(Array.isArray(t)){if(t.every(t=>"string"==typeof t))return t.every(a.alertWarning);if(t.every(t=>"object"==typeof t)&&null!==msg)return t.every(t=>{t.hasOwnProperty("data")&&t.data.hasOwnProperty("retval")?a.alertWarning(JSON.stringify(t.data.retval)):a.alertSystemError(JSON.stringify(t))})}"object"!=typeof t||null===t?a.alertSystemError("alertSystemError throws Generic Error\r\nError Controller Path: "+FHC_JS_DATA_STORAGE_OBJECT.called_path+"/"+FHC_JS_DATA_STORAGE_OBJECT.called_method):t.hasOwnProperty("data")&&t.data.hasOwnProperty("retval")?a.alertWarning(JSON.stringify(t.data.retval)):a.alertSystemError(JSON.stringify(t))},resetFormValidation(t){const e=new Event("fhc-form-reset");t.querySelectorAll(["[data-fhc-form-validate],[data-fhc-form-error]"]).forEach(t=>t.dispatchEvent(e))},handleFormValidation(t,e){if(void 0===e){if(t&&t.nodeType===Node.ELEMENT_NODE)return e=>a.handleFormValidation(e,t)}else if(400==t?.response?.status){let i=F.getError(t.response.data);"object"!=typeof i&&(i=t.response.data),a.resetFormValidation(e);const n=Object.entries(i).filter(([t,a])=>{const i=e.querySelector('[data-fhc-form-validate="'+t+'"]');return!i||(i.dispatchEvent(new CustomEvent("fhc-form-invalidate",{detail:a})),!1)}).map(t=>t[1]),r=e.querySelector("[data-fhc-form-error]");return void(r&&n.length?r.dispatchEvent(new CustomEvent("fhc-form-error",{detail:n})):n.forEach(a.alertError))}if(400==t?.response?.status){let e=F.getError(t.response.data);a.alertError("object"==typeof e?Object.values(e):e)}else a.handleSystemError(t)}};t.config.globalProperties.$fhcAlert=a,t.provide("$fhcAlert",t.config.globalProperties.$fhcAlert)}},E={install:(t,e)=>{if(t.config.globalProperties.$api)return;function a(t,e){Array.isArray(t)?t.forEach(e):Object.entries(t).forEach(([t,a])=>a.forEach(a=>e(a,t)))}t.config.globalProperties.$fhcAlert||t.use(O);let i={success:!0,fail:!0,combine:{form:["validation","general"],toast:["validation","general","not_found","site_failed"]},handler:{form(t,e){t.clearValidation(),e.forEach(e=>t.setFeedback(!1,e.messages||e.message))},async toast(e){const a=t.config.globalProperties.$p;if(!a)return Promise.reject("Phrasen plugin not loaded!");async function i(t){t=t.reduce((t,e)=>{switch(e.type){case"not_found":case"site_failed":e.message?t[e.message]=[e.url]:t._default=[e.url];break;case"general":t._default||(t._default=[]),t._default.push(e.message);break;case"validation":Object.entries(e.messages).forEach(([e,a])=>{t[e]||(t[e]=[]),Array.isArray(a)?t[e].push(...a):t[e].push(a)})}return t},{});let e=0;const i=await Promise.all(Object.entries(t).sort((t,e)=>["_default"].indexOf(e[0])-["_default"].indexOf(t[0])).map(async([t,i])=>{if("_default"==t){await a.loadCategory("dashboard");t='
    '+a.t("dashboard/general")+"
    "}else t="
    "+t+"
    ";return e+=i.length,t+"
    "+i.join("
    ")+"
    "}));return{counter:e,msgs:i}}let n,r;Array.isArray(e)?({counter:n,msgs:r}=await i(e)):({counter:n,msgs:r}=await Object.entries(e).reduce(async(t,[e,a])=>{const n=await t,{counter:r,msgs:s}=await i(a);return n.counter+=r,n.msgs.push("
    "+e+"
    "+s.join("")+"
    "),n},Promise.resolve({counter:0,msgs:[]}))),await a.loadCategory("ui");const s=a.t("ui/n_errors",{n:n});t.config.globalProperties.$fhcAlert.alertDefault("error",s,"
    "+r.join("")+"
    ",!0,!0)},php(e){a(e,(e,a)=>{var i="";switch(i+="Message: "+e.message+"\n\n",i+="Filename: "+e.filename+"\n",i+="Line Number: "+e.line+"\n",e.backtrace&&e.backtrace.length&&(i+="\nBacktrace: ",e.backtrace.forEach(t=>{i+="\n\tFile: "+t.file+"\n",i+="\tLine: "+t.line+"\n",i+="\tFunction: "+t.function+"\n"})),e.severity){case"Warning":case"Core Warning":case"Compile Warning":case"User Warning":a?a+=": PHP "+e.severity:a="PHP "+e.severity,t.config.globalProperties.$fhcAlert.alertDefault("warn",a,i,!0);break;case"Notice":case"User Notice":case"Runtime Notice":a?a+=": PHP "+e.severity:a="PHP "+e.severity,t.config.globalProperties.$fhcAlert.alertDefault("info",a,i,!0);break;default:i="Type: PHP "+e.severity+"\n\n"+i,a&&(i=a+"\n\n"+i),t.config.globalProperties.$fhcAlert.alertSystemError(i)}})},exception(e){a(e,(e,a)=>{var i="";a&&(i+=a+"\n\n"),i+="Type: "+e.class+"\n\n",i+="Message: "+e.message+"\n\n",i+="Filename: "+e.filename+"\n",i+="Line Number: "+e.line+"\n",e.backtrace&&e.backtrace.length&&(i+="\nBacktrace: ",e.backtrace.forEach(t=>{i+="\n\tFile: "+t.file+"\n",i+="\tLine: "+t.line+"\n",i+="\tFunction: "+t.function+"\n"})),t.config.globalProperties.$fhcAlert.alertSystemError(i)})},db(e){a(e,(e,a)=>{var i="";a&&(i+=a+"\n\n"),void 0!==e.heading&&(i+=e.heading+"\n\n"),void 0!==e.code&&(i+="Code: "+e.code+"\n\n"),void 0!==e.sql&&(i+="SQL: "+e.sql+"\n\n"),void 0!==e.message?i+="Message: "+e.message+"\n\n":void 0!==e.messages&&(i+="Messages: "+e.messages.join("\n\t")+"\n\n"),void 0!==e.filename&&(i+="Filename: "+e.filename+"\n"),void 0!==e.line&&(i+="Line Number: "+e.line+"\n"),t.config.globalProperties.$fhcAlert.alertSystemError(i)})},auth(e){a(e,(e,a)=>{a?a+=": "+e.message:a=e.message;var i="";i+="Controller name: "+e.controller+"\n",i+="Method name: "+e.method+"\n",i+="Required permissions: "+e.required_permissions,t.config.globalProperties.$fhcAlert.alertDefault("error",a,i,!0)})}}};function n(t,e,a,i){if("string"==typeof t&&void 0===i)[e,a,i]=[t,e,a],t=void 0;else if(t){if("object"!=typeof t)throw new TypeError("Parameter 1 of _get_config must be an object or a string");void 0===e&&void 0===a&&void 0===i&&(i=t,t=void 0)}if(t){if(!t.clearValidation||!t.setFeedback)throw new TypeError("'form' is not a Form Component");t={clearValidation:t.clearValidation,setFeedback:t.setFeedback},i?i.form=t:i={form:t}}return[e,a,i]}function r(t){if("string"==typeof t.data||t.data instanceof String)return r({data:t});const e=t.data;return delete t.data,e?(e.meta?e.meta.response=t:e.meta={response:t},e):{meta:{response:t},data:null}}function s(t){if(!1===t||"off"===t)return{...i,success:!1,fail:!1};if(!t||!0===t)return{...i};if("success"===t)return{...i,fail:!1};if("fail"===t)return{...i,success:!1};const{success:e,fail:a,handler:n,combine:r}=t;return t={...i},Object.entries({fail:a,success:e}).forEach(([e,a])=>{void 0!==a&&(t[e]=a)}),Object.entries({handler:n,combine:r}).forEach(([e,a])=>{void 0!==a&&(t[e]={...t[e],...a})}),t}function o(t){const e=s(t?.errorHandling);if(t?.form){const a=e.handler.form;e.handler={...e.handler,form:e=>a(t.form,e)}}else e.combine={...e.combine,form:[]};return e}function l(t){return t.response?404==t.response.status?[{type:"not_found",message:t.message,url:t.request.responseURL}]:null==t.response.data.errors?[]:t.response.data.errors:t.request?[{type:"site_failed",message:t.message,url:t.request.responseURL}]:[{type:"script",message:t.message}]}function d(t,e){const a={},i=[];if(null==e)return{};for(;e.length;)i.push(e.pop());for(var n of i){let i=n.type,s=null;for(var r in t.combine){let e=t.combine[r].includes(i),a=t.handler[r];if(e&&a&&(s=r,"form"==s))break}s&&(i=s);t.handler[i]?(a[i]||(a[i]=[]),Array.isArray(n)?a[i].push(...n):a[i].push(n)):e.push(n)}return a}void 0!==e?.errorHandling&&(i=s(e.errorHandling));const c=axios.create({timeout:5e5,baseURL:FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/"});c.interceptors.request.use(t=>{if("post"!=t.method||!t.data)return t;if(t.data instanceof FormData)return t;if(!Object.values(t.data).every(t=>!(t instanceof FileList)&&(!Array.isArray(t)||t.every(t=>!(t instanceof File))))){const e=Object.entries(t.data).reduce((t,[e,a])=>{if(a instanceof FileList)for(const i of a)t.FormData.append(e+(a.length>1?"[]":""),i);else Array.isArray(a)?a.every(t=>!(t instanceof File))?t.jsondata[e]=a:a.forEach(i=>t.FormData.append(e+(a.length>1?"[]":""),i)):t.jsondata[e]=a;return t},{FormData:new FormData,jsondata:{}});e.FormData.append("_jsondata",JSON.stringify(e.jsondata)),t.data=e.FormData}return t}),c.interceptors.response.use(e=>("off"==e.config?.errorHandling||!1===e.config?.errorHandling||"fail"==e.config?.errorHandling||e.data.errors&&(e.data.errors=e.data.errors.filter(a=>(e.config[a.type+"ErrorHandler"]||t.config.globalProperties.$api._defaultErrorHandlers[a.type])(a,e.config))),r(e)),t=>{if("ERR_CANCELED"==t.code)return Promise.reject({handled:!0,...t});const e=o(t.config);if(!e.fail)return Promise.reject(t);const a=l(t),i=d(e,a);for(var n in i)e.handler[n](i[n]);return a.length?Promise.reject(t):Promise.reject({handled:!0,...t})}),t.config.globalProperties.$api={getUri:t=>c.getUri({url:t}),get:(t,e,a,i)=>([e,a,i]=n(t,e,a,i),a&&(i?i.params=a:i={params:a}),c.get(e,i)),post:(t,e,a,i)=>([e,a,i]=n(t,e,a,i),c.post(e,a,i)),call(e,a,i){if(Array.isArray(e)){const r=t.config.globalProperties.$api;return Promise.allSettled(e.map((t,e)=>(Array.isArray(t)||(t=["#"+e,t]),r.call(t[1],{errorHeader:t[0],errorHandling:!1})))).then(t=>{const[,,e]=n(i,void 0,void 0,a||{}),r=o(e);if(!r.success&&!r.fail)return t;const s={};for(var c of t){const[t,e]="fulfilled"===c.status?[r.success,c.value]:[r.fail,c.reason];if(!t)return;const a=d(r,l(e));for(var p in a)s[p]?s[p][e.config.errorHeader]=a[p]:s[p]={[e.config.errorHeader]:a[p]}}for(var u in s)r.handler[u](s[u]);return t})}let{method:r,url:s,params:c,config:p}=e;return void 0!==a&&(p=a),r||(r="get"),r.toLowerCase&&(r=r.toLowerCase()),"get"==r?this.get(i,s,c,p):"post"==r?this.post(i,s,c,p):void console.error("FhcApi: method not allowed:",r)},getErrorHandler:t=>o(t)},t.provide("$api",t.config.globalProperties.$api)}},P={loadCategory:t=>({method:"get",url:"/api/frontend/v1/phrasen/loadModule/"+t}),setLanguage:(t,e)=>({method:"post",url:"/api/frontend/v1/phrasen/setLanguage",params:{categories:t,language:e}}),getLanguage:()=>({method:"get",url:"/api/frontend/v1/phrasen/getLanguage"}),getActiveDbLanguages:()=>({method:"get",url:"/api/frontend/v1/phrasen/getAllLanguages"})};const j=Vue.reactive({}),B={};let M=Vue.ref(FHC_JS_DATA_STORAGE_OBJECT.user_language),R=Vue.computed(()=>M.value?FHC_JS_DATA_STORAGE_OBJECT.server_languages.find(t=>t.sprache==M.value).LC_Time:null);const L={user_language:M,user_locale:R,setLanguage(t){const e=Object.keys(j);return this.config.globalProperties.$api.call(P.setLanguage(e,t)).then(e=>(e.data.forEach(t=>{j[t.category][t.phrase]=t.text}),M.value=t,e))},loadCategory(t){return Array.isArray(t)?Promise.all(t.map(this.config.globalProperties.$p.loadCategory)):(B[t]||(B[t]=this.config.globalProperties.$api.call(P.loadCategory(t)).then(e=>e?.data?function(t,e){return t.filter(t=>t.category==e).reduce((t,e)=>(t[e.phrase]||(t[e.phrase]=e.text),t),{})}(e.data,t):{}).then(e=>{j[t]=e})),B[t])},t_ref(t,e,a){return console.warn("deprecated"),Vue.computed(()=>this.t(t,e,a))},t(t,e,a){if(void 0===a&&(Array.isArray(t)&&2==t.length||t.split&&2==t.split("/").length)&&(a=e,[t,e]=t.split?t.split("/"):t),void 0===e)return console.error("invalid input",t,e,a),"";let i=Vue.computed(()=>j[t]?function(t,e,a){let i=j[t][e];return i?(a&&(i=i.replace(/\{([^}]*)\}/g,(t,e)=>void 0===a[e]?t:a[e])),i):"<< PHRASE "+e+">>"}(t,e,a):"");return j[t]||this.loadCategory(t),i.value}};var N={install(t,e){t.config.globalProperties.$fhcApi||t.use(T),t.config.globalProperties.$api||t.use(E),t.config.globalProperties.$p={t:L.t,loadCategory:e=>L.loadCategory.call(t,e),setLanguage:e=>L.setLanguage.call(t,e),user_language:M,user_locale:R,t_ref:L.t_ref},t.provide("$p",t.config.globalProperties.$p)}},V=Object.freeze({__proto__:null,default:N,user_locale:R}),I={components:{DmsItem:{emits:["delete"],props:{modelValue:{type:[File,Object],required:!0}},data:()=>({preview:""}),watch:{modelValue(t){"application/x.fhc-dms+json"==t.type&&t.text().then(t=>{const e=JSON.parse(t);this.preview=e.preview||""})}},template:'\n\t
  • \n\t\t\n\t\t{{ modelValue.name }}\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t
  • '}},emits:["update:modelValue"],props:{modelValue:{type:[FileList,Array],required:!0},multiple:Boolean,id:String,name:String,inputClass:[String,Array,Object],noList:Boolean,accept:{type:String,default:""},disabled:{type:Boolean,default:!1}},methods:{stringifyFile:t=>JSON.stringify({lastModified:t.lastModified,lastModifiedDate:t.lastModifiedDate,name:t.name,size:t.size,type:t.type}),addFiles(t){if(!this.multiple)return this.$emit("update:modelValue",t.target.files);const e=new DataTransfer,a=[];for(var i of this.modelValue)e.items.add(i),a.push(this.stringifyFile(i));for(var i of t.target.files)a.indexOf(this.stringifyFile(i))<0&&e.items.add(i);this.$emit("update:modelValue",e.files)},removeFile(t){const e=Array.from(this.modelValue)[t],a=new DataTransfer;for(var i of this.modelValue)i!==e&&a.items.add(i);this.$emit("update:modelValue",a.files)}},watch:{modelValue(t){if(!t)return;if(t instanceof FileList){if(!this.$refs.upload)return;return this.$refs.upload.files=t}const e=new DataTransfer;for(var a of t)if(a instanceof File)e.items.add(a);else{const t=new File([JSON.stringify(a)],a.name,{type:"application/x.fhc-dms+json"});e.items.add(t)}this.$emit("update:modelValue",e.files)}},template:'\n\t
    \n\t\t\n\t\t
      \n\t\t\t\n\t\t\t\n\t\t
    \n\t
    '},H={name:"BootstrapModal",data:()=>({modal:null,fullscreen:!1}),props:{backdrop:{type:[Boolean,String],default:!0,validator:t=>["static",!0,!1].includes(t)},focus:{type:Boolean,default:!0},keyboard:{type:Boolean,default:!0},noCloseBtn:Boolean,dialogClass:[String,Array,Object],headerClass:{type:[String,Array,Object],default:""},bodyClass:{type:[String,Array,Object],default:"px-4 py-5"},footerClass:{type:[String,Array,Object],default:""},allowFullscreenExpand:{type:Boolean,default:!1}},emits:["hideBsModal","hiddenBsModal","hidePreventedBsModal","showBsModal","shownBsModal","toggleFullscreen"],methods:{dispose(){return this.modal.dispose()},handleUpdate(){return this.modal.handleUpdate()},hide(){return this.modal.hide()},show(t){return this.modal.show(t)},toggle(){return this.modal.toggle()},toggleFullscreen(){this.fullscreen=!this.fullscreen,this.$emit("toggleFullscreen")}},mounted(){this.$refs.modal&&(this.modal=new bootstrap.Modal(this.$refs.modal,{backdrop:this.backdrop,focus:this.focus,keyboard:this.keyboard}))},popup(t,e,a,i){const n=this,r={};void 0!==t&&(r.default=()=>t),void 0!==a&&(r.title=()=>a),void 0!==i&&(r.footer=()=>i);let s=!1;return"undefined"!=typeof primevue&&(s=!0),new Promise((t,a)=>{const i=Vue.createApp({name:"ModalTmpApp",setup:()=>()=>Vue.h(n,{class:"fade",...e,ref:"modal","onHidden.bs.modal":i.unmount},r),mounted(){this.$refs.modal.show()},beforeUnmount(){this.$refs.modal&&(!1!==this.$refs.modal.result?t(this.$refs.modal.result):a())},unmounted(){o.parentElement.removeChild(o)}}),o=document.createElement("div");s&&i.use(primevue.config.default,{zIndex:{overlay:9999}}),Promise.resolve().then(function(){return V}).then(t=>{i.use(t.default),i.mount(o),document.body.appendChild(o)})})},template:''},G={getConfig:()=>({method:"get",url:"/api/frontend/v1/Abgabe/getConfig"}),getConfigStudent:()=>({method:"get",url:"/api/frontend/v1/Abgabe/getConfigStudent"}),getStudentProjektarbeiten:t=>({method:"get",url:"/api/frontend/v1/Abgabe/getStudentProjektarbeiten",params:{uid:t}}),getStudentProjektabgaben:t=>({method:"get",url:"/api/frontend/v1/Abgabe/getStudentProjektabgaben",params:{projektarbeit_id:t.projektarbeit_id,student_uid:t.student_uid}}),postStudentProjektarbeitEndupload:t=>({method:"post",url:"/api/frontend/v1/Abgabe/postStudentProjektarbeitEndupload",params:t,config:{Headers:{"Content-Type":"multipart/form-data"}}}),postStudentProjektarbeitZwischenabgabe:t=>({method:"post",url:"/api/frontend/v1/Abgabe/postStudentProjektarbeitZwischenabgabe",params:t,config:{Headers:{"Content-Type":"multipart/form-data"}}}),getMitarbeiterProjektarbeiten:t=>({method:"get",url:"/api/frontend/v1/Abgabe/getMitarbeiterProjektarbeiten",params:{showall:t}}),postProjektarbeitAbgabe(t){let e=t.datum;if(t.datum instanceof Date){e=`${t.datum.getFullYear()}-${String(t.datum.getMonth()+1).padStart(2,"0")}-${String(t.datum.getDate()).padStart(2,"0")}`}return{method:"post",url:"/api/frontend/v1/Abgabe/postProjektarbeitAbgabe",params:{paabgabe_id:t.paabgabe_id,paabgabetyp_kurzbz:t.bezeichnung.paabgabetyp_kurzbz,datum:e,note:t.note_pk,upload_allowed:!!t.upload_allowed,beurteilungsnotiz:t.beurteilungsnotiz??"",fixtermin:t.fixtermin,insertvon:t.insertvon,kurzbz:t.kurzbz,projektarbeit_id:t.projektarbeit_id,betreuer_person_id:t.betreuer_person_id}}},deleteProjektarbeitAbgabe:t=>({method:"post",url:"/api/frontend/v1/Abgabe/deleteProjektarbeitAbgabe",params:{paabgabe_id:t}}),postSerientermin:(t,e,a,i,n,r,s)=>({method:"post",url:"/api/frontend/v1/Abgabe/postSerientermin",params:{datum:t,paabgabetyp_kurzbz:e,bezeichnung:a,kurzbz:i,upload_allowed:n,projektarbeit_ids:r,fixtermin:s}}),fetchDeadlines:t=>({method:"post",url:"/api/frontend/v1/Abgabe/fetchDeadlines",params:{person_id:t}}),getPaAbgabetypen:()=>({method:"get",url:"/api/frontend/v1/Abgabe/getPaAbgabetypen"}),getNoten:()=>({method:"get",url:"/api/frontend/v1/Abgabe/getNoten"}),getProjektarbeitenForStudiengang:(t,e=0)=>({method:"get",url:"/api/frontend/v1/Abgabe/getProjektarbeitenForStudiengang",params:{studiengang_kz:t,benotet:e}}),getStudiengaenge:()=>({method:"get",url:"/api/frontend/v1/Abgabe/getStudiengaenge"}),postStudentProjektarbeitZusatzdaten:t=>({method:"post",url:"/api/frontend/v1/Abgabe/postStudentProjektarbeitZusatzdaten",params:t,config:{Headers:{"Content-Type":"multipart/form-data"}}}),getSignaturStatusForProjektarbeitAbgaben:(t,e)=>({method:"post",url:"/api/frontend/v1/Abgabe/getSignaturStatusForProjektarbeitAbgaben",params:{paabgabe_ids:t,student_uid:e}})};const U={name:"FhcOverlay",props:{active:{type:Boolean,default:!1}},template:'\t\n\t\t
    \n\t\t\t\n\t\t
    \n\t'},q={name:"AbgabeStudentDetail",components:{Upload:I,BsModal:H,InputNumber:primevue.inputnumber,Checkbox:primevue.checkbox,Dropdown:primevue.dropdown,Textarea:primevue.textarea,Accordion:primevue.accordion,AccordionTab:primevue.accordiontab,Message:primevue.message,Inplace:primevue.inplace,VueDatePicker:n,FhcOverlay:U},inject:["notenOptions","isMobile","isViewMode","moodle_link"],props:{projektarbeit:{type:Object,default:null},viewMode:{type:Boolean,default:!1}},data:()=>({loading:!1,eidAkzeptiert:!1,enduploadTermin:null,allActiveLanguages:FHC_JS_DATA_STORAGE_OBJECT.server_languages,form:Vue.reactive({sprache:"",abstract:"",abstract_en:"",schlagwoerter:"",schlagwoerter_en:"",kontrollschlagwoerter:"",seitenanzahl:1})}),methods:{getNoteBezeichnung(t){const e=this.notenOptions.find(e=>e.note==t.note);return e?.bezeichnung?e?.positiv?this.$capitalize(this.$p.t("abgabetool/c4positivBenotet"))+" ✅":this.$capitalize(this.$p.t("abgabetool/c4negativBenotet"))+" ❌":!0!==e?.benotbar||t.note?"":this.$capitalize(this.$p.t("abgabetool/c4notYetGraded"))},async validate(t,e=!1){return t.file.length?!e||!1!==await this.$fhcAlert.confirm({message:this.$p.t("abgabetool/confirmEnduploadSpeichern"),acceptLabel:this.$capitalize(this.$p.t("abgabetool/c4AcceptAndProceed")),acceptClass:"p-button-primary",rejectLabel:this.$capitalize(this.$p.t("abgabetool/c4Cancel")),rejectClass:"p-button-secondary"}):(this.$fhcAlert.alertWarning(this.$capitalize(this.$p.t("global/warningChooseFile"))),!1)},async triggerEndupload(){if(!await this.validate(this.enduploadTermin,!0))return!1;const t=new FormData;t.append("paabgabetyp_kurzbz",this.enduploadTermin.paabgabetyp_kurzbz),t.append("projektarbeit_id",this.enduploadTermin.projektarbeit_id),t.append("paabgabe_id",this.enduploadTermin.paabgabe_id),t.append("student_uid",this.projektarbeit.student_uid),t.append("bperson_id",this.projektarbeit.bperson_id),t.append("sprache",this.form.sprache.sprache),t.append("abstract",this.form.abstract),t.append("abstract_en",this.form.abstract_en),t.append("schlagwoerter",this.form.schlagwoerter),t.append("schlagwoerter_en",this.form.schlagwoerter_en),t.append("seitenanzahl",this.form.seitenanzahl);for(let e=0;e{this.handleUploadRes(t,this.enduploadTermin)}).finally(()=>{this.loading=!1}),this.$refs.modalContainerEnduploadZusatzdaten.hide()},downloadAbgabe(t){const e=`/api/frontend/v1/Abgabe/getStudentProjektarbeitAbgabeFile?paabgabe_id=${t.paabgabe_id}&student_uid=${this.projektarbeit.student_uid}&projektarbeit_id=${this.projektarbeit.projektarbeit_id}`;window.open(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+e)},formatDate(t){const e=new Date(t),a=t=>String(t).padStart(2,"0"),i=a(e.getMonth()+1);return`${a(e.getDate())}.${i}.${e.getFullYear()}`},async upload(t){if(!await this.validate(t))return!1;if("end"===t.bezeichnung?.paabgabetyp_kurzbz)this.enduploadTermin=t,this.$refs.modalContainerEnduploadZusatzdaten.show();else{const e=new FormData;e.append("paabgabetyp_kurzbz",t.paabgabetyp_kurzbz),e.append("projektarbeit_id",this.projektarbeit.projektarbeit_id),e.append("paabgabe_id",t.paabgabe_id),e.append("student_uid",this.projektarbeit.student_uid),e.append("bperson_id",this.projektarbeit.bperson_id);for(let a=0;a{this.handleUploadRes(e,t)}).finally(()=>{this.loading=!1})}},handleUploadRes(t,e){"success"==t.meta.status?(this.$fhcAlert.alertSuccess(this.$capitalize(this.$p.t("abgabetool/c4fileUploadSuccessv3"))),e.abgabedatum=(new Date).toISOString().split("T")[0],void 0!==t?.data?.signatur&&(e.signatur=t.data.signatur)):this.$fhcAlert.alertError(this.$capitalize(this.$p.t("abgabetool/c4fileUploadErrorv3"))),t.meta.signaturInfo&&this.$fhcAlert.alertInfo(t.meta.signaturInfo)},getOptionLabel:t=>t.sprache,getTerminNoteBezeichnung(t){const e=this.notenOptions.find(e=>e.note==t.note);return e?e.bezeichnung:""}},watch:{projektarbeit(t){this.form.sprache=t.sprache?this.allActiveLanguages.find(e=>e.sprache==t.sprache):this.allActiveLanguages.find(t=>"German"==t.sprache),this.form.abstract=t.abstract??"",this.form.abstract_en=t.abstract_en??"",this.form.schlagwoerter=t.schlagwoerter??"",this.form.schlagwoerter_en=t.schlagwoerter_en??"",this.form.kontrollschlagwoerter=t.kontrollschlagwoerter??"",this.form.seitenanzahl=t.seitenanzahl??1}},computed:{getMoodleLink(){return this.moodle_link+this.projektarbeit.studiengang_kz},getMessagePtStyle:()=>({root:{style:{margin:"0px"}},wrapper:{style:{padding:"6px"}}}),getEid(){return this.$capitalize(this.$p.t("abgabetool/c4eidesstattlicheErklaerung"))},allowedToSaveZusatzdaten(){return this.form.schlagwoerter.length>0&&this.form.schlagwoerter_en.length>0&&this.form.abstract.length>0&&this.form.abstract_en.length>0&&this.form.seitenanzahl>0},getAllowedToSendEndupload(){return this.eidAkzeptiert&&this.allowedToSaveZusatzdaten},qualityGateTerminAvailable(){let t=!1;return this.projektarbeit?.abgabetermine.forEach(e=>{"qualgate1"!=e.paabgabetyp_kurzbz&&"qualgate2"!=e.paabgabetyp_kurzbz||(t=!0)}),t},getTooltipVerspaetet(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipVerspaetet")),class:"custom-tooltip"}},getTooltipVerpasst(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipVerpasst")),class:"custom-tooltip"}},getTooltipAbzugeben(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipAbzugeben")),class:"custom-tooltip"}},getTooltipStandard(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipStandardv2")),class:"custom-tooltip"}},getTooltipAbgegeben(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipAbgegeben")),class:"custom-tooltip"}},getTooltipFixtermin(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipFixtermin")),class:"custom-tooltip"}},getTooltipAbgabeDetected(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipAbgabeDetected")),class:"custom-tooltip"}},getTooltipNotAllowedToUpload(){return this.isViewMode?{value:this.$capitalize(this.$p.t("abgabetool/c4studentAbgabeNotAllowedInViewMode")),class:"custom-tooltip"}:{value:this.$capitalize(this.$p.t("abgabetool/c4studentAbgabeNotAllowedRegular")),class:"custom-tooltip"}},getTooltipBeurteilungerforderlich(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipBeurteilungerforderlich")),class:"custom-tooltip"}},getTooltipBestanden(){return{value:this.$p.t("abgabetool/c4tooltipBestanden"),class:"custom-tooltip"}},getTooltipNichtBestanden(){return{value:this.$p.t("abgabetool/c4tooltipNichtBestanden"),class:"custom-tooltip"}}},created(){},mounted(){},template:'\n\t\t\n\n\t\t
    \n\t\t\n\t\t\t
    {{$capitalize( $p.t(\'abgabetool/c4abgabeStudentenbereich\') )}}
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t

    {{$capitalize( $p.t(\'person/student\') ) }}: {{projektarbeit?.student}}

    \n\t\t\t\t\t

    {{$capitalize( $p.t(\'abgabetool/c4titel\') ) }}: {{projektarbeit?.titel}}

    \n\t\t\t\t\t

    {{$capitalize( $p.t(\'abgabetool/c4betreuerv2\') ) }}: {{projektarbeit ? $p.t(\'abgabetool/c4betrart\' + projektarbeit.betreuerart_kurzbz) + \' \' + projektarbeit.betreuer : \'\'}}

    \n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t

    {{ $p.t(\'abgabetool/c4checkoutStgMoodleInfos\') }} \n\t\t\t\t\t\tMoodle\n\t\t\t\t\t

    \n\t\t\t\t
    \n\t\t\t
    \n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t
    \n\t\t\t\t
    {{ $capitalize( $p.t(\'abgabetool/c4keineAbgabetermineGefunden\') )}}
    \n\t\t\t
    \n\t\t\t\n\t\t
    \n\t \t\n\t \t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t \t\n '},J="Europe/Vienna",Z=luxon.DateTime.now().setZone(J);function W(t,e){const a=luxon.DateTime.fromISO(t.datum,{zone:J}).endOf("day"),i=t.abgabedatum?luxon.DateTime.fromISO(t.abgabedatum,{zone:J}):null;t.diffindays=a.diff(Z,"days").days;const n=i&&i>a;if(t.note){const a="object"==typeof t.note?t.note:e.find(e=>e.note==t.note);if(!0===a?.positiv)return"bestanden";if(!1===a?.positiv)return"nichtbestanden"}return t.bezeichnung?.benotbar&&a<=Z?"beurteilungerforderlich":t.upload_allowed?t.abgabedatum?n?"verspaetet":"abgegeben":athis.notenOptions),isViewMode:Vue.computed(()=>this.isViewMode),moodle_link:Vue.computed(()=>this.moodle_link)}},props:{student_uid_prop:{default:null},viewData:{type:Object,required:!0,default:()=>({uid:""}),validator:t=>t&&t.uid}},data:()=>({activeTabIndex:[0],abgabeTypeOptions:null,phrasenPromise:null,phrasenResolved:!1,loading:!1,notenOptions:null,detail:null,projektarbeiten:null,selectedProjektarbeit:null,moodle_link:null}),methods:{checkQualityGatesStrict(t){let e=!1,a=!1;return t.forEach(t=>{const i=this.notenOptions?.find(e=>e.note==t.note);i&&i.positiv&&("qualgate1"==t.paabgabetyp_kurzbz?e=!0:"qualgate2"==t.paabgabetyp_kurzbz&&(a=!0))}),e&&a},checkQualityGatesOptional(t){const e=t.find(t=>"qualgate1"==t.paabgabetyp_kurzbz),a=t.find(t=>"qualgate2"==t.paabgabetyp_kurzbz);let i=!0;e&&(i=!1,t.forEach(t=>{const e=this.notenOptions?.find(e=>e.note==t.note);e&&e.positiv&&"qualgate1"==t.paabgabetyp_kurzbz&&(i=!0)}));let n=!0;return a&&(n=!1,t.forEach(t=>{const e=this.notenOptions?.find(e=>e.note==t.note);e&&e.positiv&&"qualgate2"==t.paabgabetyp_kurzbz&&(n=!0)})),i&&n},isPastDate(t){const e=luxon.DateTime.fromISO(t,{zone:"Europe/Vienna"}).endOf("day");return luxon.DateTime.now().setZone("Europe/Vienna")>e},setDetailComponent(t){this.loading=!0,this.loadAbgaben(t).then(e=>{const a=this.projektarbeiten?.find(e=>e.projektarbeit_id==t.projektarbeit_id);a.abgabetermine=e.data[0].retval;const i=null!==a.note;a.abgabetermine.forEach(t=>{if(t.file=[],t.allowedToUpload=!1,"end"==t.paabgabetyp_kurzbz){const e=!t.fixtermin||!this.isPastDate(t.datum);t.allowedToUpload=e&&this.checkQualityGatesOptional(a.abgabetermine)}else t.fixtermin?t.allowedToUpload=!this.isPastDate(t.datum):t.allowedToUpload=t.upload_allowed;i&&(t.allowedToUpload=!1),t.bezeichnung=this.abgabeTypeOptions.find(e=>e.paabgabetyp_kurzbz===t.paabgabetyp_kurzbz),t.dateStyle=W(t,this.notenOptions)}),a.betreuer=this.buildBetreuer(a),a.student_uid=this.student_uid,this.selectedProjektarbeit=a,this.$refs.modalContainerAbgabeDetail.show()}).finally(()=>{this.loading=!1})},centeredTextFormatter:t=>'

    '+t.getValue()+"

    ",detailFormatter(t){const e=t.getValue();return"detailTermine"===e.mode?'
    ':"beurteilungDownload"===e.mode?'
    ':void 0},mailFormatter:t=>'
    ',beurteilungFormatter:t=>t.getValue()?'
    ':"-",buildMailToLink:t=>"mailto:"+t.email,buildBetreuer:t=>(t.btitelpre?t.btitelpre+" ":"")+t.bvorname+" "+t.bnachname+(t.btitelpost?" "+t.btitelpost:""),async setupData(t){const e=t[0]??null;e&&(this.projektarbeiten=e.map(t=>({...t,details:{student_uid:this.student_uid,projektarbeit_id:t.projektarbeit_id,betreuer_person_id:t.bperson_id,betreuerart_kurzbz:t.betreuerart_kurzbz,mode:"detailTermine"},beurteilung1:t.downloadLink1??null,beurteilung2:t.downloadLink2??null,sem:t.studiensemester_kurzbz,stg:t.kurzbzlang,mail:this.buildMailToLink(t),betreuer:this.buildBetreuer(t),typ:t.projekttypbezeichnung,titel:t.titel})))},loadProjektarbeiten(){this.$api.call(G.getStudentProjektarbeiten(this.student_uid)).then(t=>{t?.data&&this.setupData(t.data)})},loadAbgaben(t){return new Promise(e=>{this.$api.call(G.getStudentProjektabgaben(t)).then(t=>{e(t)})})},async setupMounted(){this.loadProjektarbeiten()},getAccTabHeaderForProjektarbeit(t){let e="";return e+=t.titel??this.$p.t("abgabetool/keinTitel"),e},getMailLink:t=>t.email?"mailto:"+t.email:"",getNoteBezeichnung(t){if(t.note&&this.notenOptions){const e=this.notenOptions.find(e=>e.note==t.note);return e?.bezeichnung}return""},handleDownloadBeurteilung1(t){window.open(t.beurteilung1)},handleDownloadBeurteilung2(t){window.open(t.beurteilung2)}},watch:{},computed:{isViewMode(){return this.student_uid!==this.viewData.uid},student_uid(){return this.student_uid_prop||this.viewData?.uid||null}},async created(){this.phrasenPromise=this.$p.loadCategory(["abgabetool","global"]),this.phrasenPromise.then(()=>{this.phrasenResolved=!0}),this.loading=!0,await this.$api.call(G.getNoten()).then(t=>{"success"==t.meta.status&&(this.notenOptions=t.data[0],this.allowedNotenOptions=this.notenOptions.filter(e=>t.data[1].includes(e.note)))}).finally(()=>{this.loading=!1}),this.$api.call(G.getPaAbgabetypen()).then(t=>{this.abgabeTypeOptions=t.data}).catch(t=>{this.loading=!1}),this.$api.call(G.getConfigStudent()).then(t=>{this.moodle_link=t.data?.moodle_link}).catch(t=>{this.loading=!1})},mounted(){this.setupMounted()},template:'\n\n '},K={emits:["dataFetched"],props:{refresh:{type:Boolean},apiFunction:{required:!0,type:Function},apiFunctionParameters:{}},watch:{refresh:function(t,e){this.fetchData()}},data:function(){return{loading:!1,error:!1,errorMessage:null}},created:function(){this.fetchData()},methods:{fetchData:function(){if(this.loading=!0,this.error=!1,this.errorMessage=null,"function"==typeof this.apiFunction){let t=this.apiFunction(this.apiFunctionParameters);t instanceof Promise?t.then(this.successHandler).catch(this.errorHandler).finally(this.finallyHandler):this.setError("The called apiFunction does not return a Promise")}else this.setError("Property apiFunction is not a function")},setError:function(t){this.loading=!1,this.error=!0,this.errorMessage=t},successHandler:function(t){this.$emit("dataFetched",t?t.data:void 0)},errorHandler:function(t){t.response?.data?.retval?this.setError(t.response.data.retval):t.data?.message?this.setError(t.data.message):this.setError(t.message)},finallyHandler:function(){this.loading=!1}},template:'\n\t\t\n\t\t\t
    Loading...
    \n\t\t
    \n\t\t\n\t\t\t
    {{ errorMessage }}
    \n\t\t
    \n\t\t\n\t'},Q="Filter Component New Filter";var X={props:{filters:{type:Array,default:[]},columns:{type:Array,default:[]},fields:{type:Array,default:[]}},emits:{switchFilter:["filterId"],applyFilterConfig:["filterFields"],saveCustomFilter:["customFilterName"]},data:function(){return{currentFields:[]}},computed:{types(){return this.columns.reduce((t,e)=>{let a=e.type.toLowerCase();return a.indexOf("int")>=0?t[e.name]="Numeric":a.indexOf("varchar")>=0||a.indexOf("text")>=0||a.indexOf("bpchar")>=0?t[e.name]="Text":a.indexOf("timestamp")>=0||a.indexOf("date")>=0?t[e.name]="Date":t[e.name]="",t},{})}},watch:{fields(t){this.currentFields=t}},methods:{switchFilter(t){this.$emit("switchFilter",t.currentTarget.value)},applyFilterConfig(){const t=this.currentFields.filter(t=>t.name!=Q);t.filter(t=>""==t.condition).length?alert("Please fill all the filter options"):this.$emit("applyFilterConfig",t)},addField(t){this.currentFields.push({name:Q})},removeField(t){this.currentFields.splice(t,1)}},template:'\n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t
    \n\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\tFilter {{ index + 1 }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\n\t\t\t\t\t\t\x3c!-- Numeric --\x3e\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t\x3c!-- Text --\x3e\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t\x3c!-- Timestamp and date --\x3e\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\n\t\t\t\t\x3c!-- Filter save options --\x3e\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n\t'},tt={props:{fields:Array,selected:{type:Array,default:[]},names:{type:Object,default:{}}},emits:{hide:["fieldName"],show:["fieldName"]},data:function(){return{selectedFields:[]}},watch:{selected(t){this.selectedFields=t}},methods:{toggle(t){-1!=this.selectedFields.indexOf(t)?(this.selectedFields.splice(this.selectedFields.indexOf(t),1),this.$emit("hide",t)):(this.selectedFields.push(t),this.$emit("show",t))}},template:'\n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\t{{ names[fieldToDisplay] || fieldToDisplay }}\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t\n\t'};const et={jsonLines:"fa-file-lines",xlsx:"fa-file-excel",pdf:"fa-file-pdf",html:"fa-file-code",json:"fa-file",csv:"fa-file-csv"},at={jsonLines:"Download as JSONLINES",xlsx:"Download as XLSX",pdf:"Download as PDF",html:"Download as HTML",json:"Download as JSON",csv:"Download as CSV "};var it={props:{tabulator:Object,config:{type:[Boolean,String,Function,Array,Object],default:!1},iconClass:[String,Array,Object]},computed:{currentConfig(){if(!this.config)return!1;let t=this.config;if(t instanceof Function)return[t];if(null===t)return[];if(!0===this.config&&(t=["csv"]),"[object String]"===Object.prototype.toString.call(t)&&(t=t.split(",")),"object"==typeof t&&!Array.isArray(t)){let n=[];for(var e in t){var a,i=t[e];i&&("[object String]"===Object.prototype.toString.call(i)?null!==(a=this.stringToFileFormatter(i))?n.push({icon:"fa-solid "+et[a],label:i===e?at[a]:e,formatter:a}):null!==(a=this.stringToFileFormatter(e))?n.push({icon:"fa-solid "+et[a],label:i,formatter:a}):alert("neither "+e+" nor "+i+" are supported download file types"):"object"!=typeof i||Array.isArray(i)?null!==(a=this.stringToFileFormatter(e))?n.push({icon:"fa-solid "+et[a],label:at[a],formatter:a}):alert(e+" is not a supported download file type"):null!==(a=this.stringToFileFormatter(e))?(void 0===i.formatter&&(i.formatter=a),void 0===i.label&&(i.label=at[a]),void 0===i.icon&&(i.icon=et[a]),n.push(i)):(void 0===i.label&&(i.label=e),n.push(i)))}t=n}if(Array.isArray(t)){if(t=t.map(t=>{if("[object String]"===Object.prototype.toString.call(t)){let e=this.stringToFileFormatter(t);return null===e?null:{icon:"fa-solid "+et[e],label:at[e],formatter:e}}if(t instanceof Function)return{formatter:t};if("object"==typeof t&&!Array.isArray(t)&&null!==t){if(t.formatter instanceof Function)return t;if(this.validateFileFormatter(t.formatter))return t}return null}).filter(t=>null!==t),t.length<2)return t;if(t.filter(t=>t.label||t.icon).length==t.length)return t;alert("Config not valid")}return[]}},methods:{stringToFileFormatter(t){let e=t.toLowerCase();return"jsonlines"==e?"jsonLines":["xlsx","pdf","html","json","csv"].includes(e)?e:null},validateFileFormatter(t){let e=this.stringToFileFormatter(t);if(!e)return alert(t+" is not a supported file formatter"),!1;if("xlsx"==e&&!window.XLSX)return alert("XLSX Library not loaded"),!1;if("pdf"==e){if(!window.jspdf)return alert("jsPDF Library not loaded"),!1;if(!new jspdf.jsPDF({}).autoTable)return alert("jsPDF-AutoTable Plugin not loaded"),!1}return!0},download(t){this.tabulator.download(t.formatter,t.file,t.options)}},template:'\n\t\n\t'};const nt=new WeakMap;var rt={mounted(t,e){let a=!1;nt.set(t,e=>{if(!a)return;if(t.contains(e.target))return;const i=bootstrap.Collapse.getInstance(t);i&&i.hide()}),t.addEventListener("shown.bs.collapse",()=>{a=!0}),t.addEventListener("hide.bs.collapse",()=>{a=!1}),document.addEventListener("click",nt.get(t),!0)},beforeUnmount(t,e){document.removeEventListener("click",nt.get(t)),delete t.collapsibleAutoHideFunc}};window.Tabulator?.extendModule("layout","modes",{fitDataStretchFrozen(t,e){var a=0,i=this.table.rowManager.element.clientWidth,n=0,r=!1;t.forEach((t,e)=>{t.widthFixed||t.reinitializeWidth(),(this.table.options.responsiveLayout?t.modules.responsive.visible:t.visible&&!t.definition.frozen)&&(r=t),t.visible&&(a+=t.getWidth())}),r?(n=i-a+r.getWidth(),this.table.options.responsiveLayout&&this.table.modExists("responsiveLayout",!0)&&(r.setWidth(0),this.table.modules.responsiveLayout.update()),n>0?r.setWidth(n):r.reinitializeWidth()):this.table.options.responsiveLayout&&this.table.modExists("responsiveLayout",!0)&&this.table.modules.responsiveLayout.update()}});var st={saveCustomFilter:t=>({method:"post",url:"/api/frontend/v1/filter/saveCustomFilter",params:{filterUniqueId:t.filterUniqueId,filterType:t.filterType,customFilterName:t.customFilterName}}),removeCustomFilter:t=>({method:"post",url:"/api/frontend/v1/filter/removeCustomFilter",params:{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterId:t.filterId}}),applyFilterFields:t=>({method:"post",url:"/api/frontend/v1/filter/applyFilterFields",params:{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterFields:t.filterFields}}),addFilterField:t=>({method:"post",url:"/api/frontend/v1/filter/addFilterField",params:{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterField:t.filterField}}),removeFilterField:t=>({method:"post",url:"/api/frontend/v1/filter/removeFilterField",params:{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterField:t.filterField}}),getFilterById:t=>({method:"get",url:"/api/frontend/v1/filter/getFilter",params:{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterId:t.filterId}}),getFilter:t=>({method:"get",url:"/api/frontend/v1/filter/getFilter",params:{filterUniqueId:t.filterUniqueId,filterType:t.filterType}})},ot=0;const lt={components:{CoreFetchCmpt:K,FilterConfig:X,FilterColumns:tt,TableDownload:it},directives:{collapseAutoClose:rt},emits:["nwNewEntry","click:new","tableBuilt","uuidDefined"],props:{onNwNewEntry:Function,title:String,description:String,sideMenu:{type:Boolean,default:!0},filterType:{type:String},tabulatorOptions:Object,tabulatorEvents:Array,tableOnly:Boolean,noColumnFilter:Boolean,reload:Boolean,reloadBtnInfotext:String,download:{type:[Boolean,String,Function,Array,Object],default:!1},newBtnShow:Boolean,newBtnClass:[String,Array,Object],newBtnDisabled:Boolean,newBtnLabel:String,uniqueId:String,idField:String,parentIdField:String,countOnly:Boolean,useSelectionSpan:{type:Boolean,default:!0}},data:function(){return{uuid:0,filterName:null,filterActive:!1,fields:null,dataset:null,datasetMetadata:null,selectedFields:null,filterFields:null,availableFilters:null,selectedFilter:null,fetchCmptRefresh:!1,fetchCmptApiFunction:null,fetchCmptApiFunctionParams:null,fetchCmptDataFetched:null,fetchResult:null,tabulator:null,tableBuilt:!1,tabulatorHasSelector:!1,selectedData:[],persistence:{sort:!0,columns:!0,filter:!1,headerFilter:!1,group:!1,page:!1}}},computed:{notSelectedFields(){return this.fields&&this.selectedFields?this.fields.filter(t=>-1===this.selectedFields.indexOf(t)):null},filteredData(){return this.dataset?JSON.parse(JSON.stringify(this.dataset)):[]},filteredColumns(){let t=JSON.parse(JSON.stringify(this.fields))||[],e=JSON.parse(JSON.stringify(this.selectedFields))||[],a=null;if(this.tabulatorOptions&&this.tabulatorOptions.hasOwnProperty("columns")&&(a=this.tabulatorOptions.columns),!Array.isArray(a)||Array.isArray(a)&&a.length=0,a.push(t)}}else for(let i of a)i.visible=e.indexOf(i.field)>=0||-1==t.indexOf(i.field),i.hasOwnProperty("resizable")&&(i.resizable=i.visible);return a},fieldIdsForVisibilty(){return this.tableBuilt?this.tabulator.getColumns().filter(t=>{let e=t.getDefinition();return!e.frozen&&e.title&&"responsiveCollapse"!=e.formatter}).map(t=>t.getField()):[]},fieldNames(){return this.tableBuilt?this.tabulator.getColumns().reduce((t,e)=>(t[e.getField()]=e.getDefinition().title,t),{}):{}},idExtra(){return this.uuid?"-"+this.uuid:""},columnsForFilter(){if(!this.filteredColumns||!this.datasetMetadata)return[];const t=this.filteredColumns.reduce((t,e)=>(t[e.field]=e.title,t),{});return this.datasetMetadata.map(e=>({...e,title:t[e.name]}))}},methods:{reloadTable(){this.tableOnly?this.tabulator.setData():this.getFilter()},async initTabulator(){let t="< Phrasen Plugin not loaded! >";this.$p&&(await this.$p.loadCategory("ui"),t=this.$p.t("ui/keineDatenVorhanden")),this.tableOnly||await new Promise(t=>{const e=window.location.hash?window.location.hash.slice(1):null,a=e=>{this.setRenderData(e),t()};null===e?this.startFetchCmpt(t=>this.$api.call(st.getFilter(t)),null,a):this.startFetchCmpt(t=>this.$api.call(st.getFilterById(t)),{filterId:e},a)});let e={layout:"fitDataStretchFrozen",movableColumns:!0,columnDefaults:{tooltip:!0},placeholder:t,persistence:this.persistence,...this.tabulatorOptions||{}};if(void 0===e.height&&void 0===e.minHeight&&void 0===e.maxHeight&&(e.height=500),this.tableOnly?e.columns.forEach(t=>{void 0===t.visible&&(t.visible=!0)}):(e.data=this.filteredData,e.columns=this.filteredColumns),(e.selectable||e.columns&&e.columns.filter(t=>"rowSelection"==t.formatter).length)&&(this.tabulatorHasSelector=!0),this.idField&&(this.parentIdField&&(e.dataTree=!0),e.index=this.idField),this.tabulator=new Tabulator(this.$refs.table,e),Array.isArray(this.tabulatorEvents)&&this.tabulatorEvents.length>0)for(let t of this.tabulatorEvents)this.tabulator.on(t.event,t.handler);this.tabulator.on("tableBuilt",()=>{this.tableBuilt=!0,this.$emit("tableBuilt")}),this.tabulator.on("rowSelectionChanged",t=>{this.selectedData=t}),this.parentIdField&&this.idField&&this.tabulator.on("dataLoading",t=>{let e=[];for(let a=0;a{const t=this.tabulator.getColumns();this.fields=t.map(t=>t.getField()),this.selectedFields=t.filter(t=>t.isVisible()).map(t=>t.getField()),this.tabulator.options.persistence.headerFilter&&this._setHeaderFilter()}),this.tabulator.on("dataFiltered",t=>{this.filterActive=t.length>0})},updateTabulator(){this.tabulator&&(this.tableBuilt?this._updateTabulator():this.tabulator.on("tableBuilt",this._updateTabulator))},_updateTabulator(){this.tabulatorHasSelector=this.tabulatorOptions.selectable||this.filteredColumns.filter(t=>"rowSelection"==t.formatter).length,this.tabulator.setColumns(this.filteredColumns),this.tabulator.setData(this.filteredData),this._setHeaderFilter()},clearFilters(){this.tabulator.getHeaderFilters().forEach(t=>{this.tabulator.setHeaderFilterValue(t.field,"")}),this.tabulator.clearFilter(),this.filterActive=!1},_setHeaderFilter(){this.tabulator.getHeaderFilters().forEach(t=>{this.tabulator.setHeaderFilterValue(t.field,t.value)})},getFilter(){null===this.selectedFilter?this.startFetchCmpt(t=>this.$api.call(st.getFilter(t)),null,this.render):this.startFetchCmpt(t=>this.$api.call(st.getFilterById(t)),{filterId:this.selectedFilter},this.render)},setRenderData(t){this.fetchResult=t,this.filterName=t.filterName,this.dataset=t.dataset,this.datasetMetadata=t.datasetMetadata,this.fields=t.fields,this.selectedFields=t.selectedFields,this.filterFields=[];for(let e=0;ethis.$api.call(st.saveCustomFilter(t)),{customFilterName:t},this.getFilter)},handlerRemoveCustomFilter(t){let e=t.currentTarget.getAttribute("href").substring(1);e===this.selectedFilter&&(this.selectedFilter=null),this.startFetchCmpt(t=>this.$api.call(st.removeCustomFilter(t)),{filterId:e},this.getFilter)},handlerGetFilterById:function(t){let e=null,a=t.currentTarget.getAttribute("href");e=null==a?t.currentTarget.value:a.substring(1),this.switchFilter(e)},switchFilter(t){this.selectedFilter=t,this.getFilter()},applyFilterConfig(t){this.selectedFilter=null,this.startFetchCmpt(t=>this.$api.call(st.applyFilterFields(t)),{filterFields:t},this.getFilter)},appendChild(t,e){let a=e[this.parentIdField];for(let i=0;i{this.tableOnly||(this.selectedFilter=window.location.hash?window.location.hash.slice(1):null,this.render(this.fetchResult))})},template:'\n\t\t\x3c!-- Load filter data --\x3e\n\t\t\n\t\t\n\n\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\t\t
    \n\t\t
    \n\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t{{ selectedData.length }} ausgewählt\n\t\t\t\t\t\t Mit {{ selectedData.length }} ausgewählten:\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t[ {{ filterName }} ]\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\n\t\t\t\n\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t\n\n\t\t\x3c!-- Tabulator --\x3e\n\t\t
    \n\t'},dt={name:"AbgabeMitarbeiterDetail",components:{BsModal:H,InputNumber:primevue.inputnumber,Checkbox:primevue.checkbox,Dropdown:primevue.dropdown,Textarea:primevue.textarea,SpeedDial:primevue.speeddial,Accordion:primevue.accordion,AccordionTab:primevue.accordiontab,Message:primevue.message,VueDatePicker:n},emits:["paUpdated"],inject:["abgabeTypeOptions","abgabetypenBetreuer","allowedNotenOptions","notenOptionsNonFinal","turnitin_link","old_abgabe_beurteilung_link"],props:{projektarbeit:{type:Object,default:null},isFullscreen:{type:Boolean,default:!1},assistenzMode:{type:Boolean,default:!1}},data(){return{showAutomagicModalPhrase:!1,eidAkzeptiert:!1,enduploadTermin:null,allActiveLanguages:FHC_JS_DATA_STORAGE_OBJECT.server_languages,speedDialItems:[{label:Vue.computed(()=>this.$p.t("abgabetool/c4newAbgabetermin")),icon:"fa fa-plus",command:this.openCreateNewAbgabeModal,disabled:Vue.computed(()=>!this.getAllowedToCreateNewTermin)},{label:Vue.computed(()=>this.$p.t("abgabetool/c4benoten")),icon:"fa fa-user-check",command:this.openBenotung,disabled:Vue.computed(()=>1==this.assistenzMode)},{label:Vue.computed(()=>this.$p.t("abgabetool/c4plagiatcheck_link")),icon:"fa fa-clipboard-check",command:this.openPlagiatcheck},{label:Vue.computed(()=>this.$p.t("abgabetool/c4student_perspective")),icon:"fa fa-eye",command:this.openStudentPage}],newTermin:null,form:Vue.reactive({sprache:"",abstract:"",abstract_en:"",schlagwoerter:"",schlagwoerter_en:"",kontrollschlagwoerter:"",seitenanzahl:1})}},methods:{getNoteBezeichnung(t){return t.noteBackend?.bezeichnung?t.noteBackend?.positiv?this.$capitalize(this.$p.t("abgabetool/c4positivBenotet"))+" ✅":this.$capitalize(this.$p.t("abgabetool/c4negativBenotet"))+" ❌":!0!==t.bezeichnung?.benotbar||t.noteBackend?"":this.$capitalize(this.$p.t("abgabetool/c4notYetGraded"))},getPlaceholderTermin(t){return t?.bezeichnung?this.$p.t("abgabetool/c4paatyp"+t.paabgabetyp_kurzbz):this.$p.t("abgabetool/abgabetypPlaceholder")},saveTermin(t){return t.paabgabe_id,t.note_pk=t.note?.note??null,t.betreuer_person_id=this.projektarbeit.betreuer_person_id,t.fixtermin=!t.invertedFixtermin,this.$api.call(G.postProjektarbeitAbgabe(t)).then(e=>{if("success"==e?.meta?.status){this.$fhcAlert.alertSuccess(this.$p.t("ui/gespeichert"));const a=this.allowedNotenOptions.find(t=>t.note==e.data[0].note),i={allowedToSave:!0,allowedToDelete:!0,...e.data[0]};i.note&&(i.note=a,i.noteBackend=a),i.invertedFixtermin=!i.fixtermin;const n=e.data[1],r=this.abgabeTypeOptions.find(t=>t.paabgabetyp_kurzbz==i.paabgabetyp_kurzbz);if(i.bezeichnung={bezeichnung:t.bezeichnung?.bezeichnung,paabgabetyp_kurzbz:t.bezeichnung?.paabgabetyp_kurzbz,benotbar:r.benotbar},n){const e=this.allowedNotenOptions.find(t=>t.note==n.note);n.note=e,t.paabgabetyp_kurzbz=i.paabgabetyp_kurzbz,t.noteBackend=a,t.dateStyle=W(t,this.notenOptions)}else i.dateStyle=W(i,this.notenOptions),this.projektarbeit.abgabetermine.push(i);this.projektarbeit.abgabetermine.sort((t,e)=>new Date(t.datum)-new Date(e.datum)),this.projektarbeit.abgabetermine.findIndex(e=>t.paabgabe_id==e.paabgabe_id);const s=!n&&!i.note?.positiv&&null!==i.note,o=n&&!i.note?.positiv&&null!==i.note&&(n.note?.positiv||void 0===n.note);s||o?(this.newTermin={paabgabe_id:-1,projektarbeit_id:this.projektarbeit.projektarbeit_id,fixtermin:!1,invertedFixtermin:!0,kurzbz:"",datum:(new Date).toISOString().split("T")[0],note:this.allowedNotenOptions.find(t=>9==t.note),beurteilungsnotiz:"",upload_allowed:!1,paabgabetyp_kurzbz:"",bezeichnung:this.abgabeTypeOptions.find(t=>t.paabgabetyp_kurzbz===i.paabgabetyp_kurzbz),abgabedatum:null,insertvon:this.viewData?.uid??""},this.showAutomagicModalPhrase=!0,this.$refs.modalContainerCreateNewAbgabe.show()):this.showAutomagicModalPhrase=!1,this.$emit("paUpdated",this.projektarbeit)}else"error"==e?.meta?.status&&this.$fhcAlert.alertError()})},openZusatzdatenModal(){this.$refs.modalContainerZusatzdaten.show()},async saveZusatzdaten(){if(!await this.validateZusatzdaten())return!1;const t=this.projektarbeit,e=new FormData;e.append("projektarbeit_id",this.projektarbeit.projektarbeit_id),e.append("sprache",this.form.sprache.sprache),e.append("abstract",this.form.abstract),e.append("abstract_en",this.form.abstract_en),e.append("schlagwoerter",this.form.schlagwoerter),e.append("schlagwoerter_en",this.form.schlagwoerter_en),e.append("seitenanzahl",this.form.seitenanzahl),this.loading=!0,this.$api.call(G.postStudentProjektarbeitZusatzdaten(e)).then(e=>{if("success"==e.meta.status){if(this.$fhcAlert.alertSuccess(this.$p.t("ui/gespeichert")),!data?.retval?.[0])return;const e=data.retval[0];t.seitenanzahl=e.seitenanzahl??1,t.kontrollschlagwoerter=e.kontrollschlagwoerter??"",t.schlagwoerter=e.schlagwoerter??"",t.sprache=e.sprache??"",t.schlagwoerter_en=e.schlagwoerter_en??"",t.abstract=e.abstract??"",t.abstract_en=e.abstract_en??""}}).finally(()=>{this.loading=!1}),this.$refs.modalContainerZusatzdaten.hide()},async validateZusatzdaten(){return!1!==await this.$fhcAlert.confirm({message:this.$p.t("abgabetool/confirmZusatzdatenSpeichern"),acceptLabel:this.$capitalize(this.$p.t("abgabetool/c4AcceptAndProceed")),acceptClass:"p-button-primary",rejectLabel:this.$capitalize(this.$p.t("abgabetool/c4Cancel")),rejectClass:"p-button-secondary"})},async handleDeleteTermin(t){if(!1===await this.$fhcAlert.confirm({message:this.$p.t("abgabetool/c4confirm_delete"),acceptLabel:"Löschen",acceptClass:"p-button-danger",rejectLabel:"Zurück",rejectClass:"p-button-secondary"}))return!1;this.deleteTermin(t)},deleteTermin(t){this.$api.call(G.deleteProjektarbeitAbgabe(t.paabgabe_id)).then(e=>{if("success"==e?.meta?.status){this.$fhcAlert.alertSuccess(this.$p.t("ui/genericDeleted",[this.$p.t("abgabetool/abgabe")]));const e=this.projektarbeit.abgabetermine.findIndex(e=>e.paabgabe_id===t.paabgabe_id);this.projektarbeit.abgabetermine.splice(e,1),this.$emit("paUpdated",this.projektarbeit)}else"error"==e?.meta?.status&&this.$fhcAlert.alertError()})},validate:function(t){return!!t.file.length||(this.$fhcAlert.alertWarning(this.$p.t("global/warningChooseFile")),!1)},downloadAbgabe(t){const e=`/api/frontend/v1/Abgabe/getStudentProjektarbeitAbgabeFile?paabgabe_id=${t.paabgabe_id}&student_uid=${this.projektarbeit.student_uid}&projektarbeit_id=${this.projektarbeit.projektarbeit_id}`;window.open(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+e)},openBeurteilungLink(t){window.open(t,"_blank")},getOptionLabelSprache:t=>t.sprache,getOptionLabelAbgabetyp(t){return this.$p.t("abgabetool/c4paatyp"+t.paabgabetyp_kurzbz)},getOptionDisabled:t=>!t.aktiv,getNotenOptionLabel:t=>t.bezeichnung,openStudentPage(){const t=FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/Cis/Abgabetool/Student/"+this.projektarbeit?.student_uid;window.open(t,"_blank")},openPlagiatcheck(){const t=this.turnitin_link;window.open(t,"_blank")},async openBenotung(){if(this.getSemesterBenotbar&&this.projektarbeit?.abgabetermine.find(t=>"end"==t.paabgabetyp_kurzbz&&null!==t.abgabedatum)&&this.projektarbeit?.beurteilungLinkNew){const t=this.projektarbeit?.beurteilungLinkNew;window.open(t,"_blank")}else if(this.projektarbeit?.abgabetermine.find(t=>"end"==t.paabgabetyp_kurzbz&&null!==t.abgabedatum)&&this.projektarbeit?.beurteilungLinkOld){if(!1===await this.$fhcAlert.confirm({message:this.$p.t("abgabetool/c4aeltereParbeitBenotenv2"),acceptLabel:this.$capitalize(this.$p.t("abgabetool/c4AcceptAndProceed")),acceptClass:"btn btn-danger",rejectLabel:this.$capitalize(this.$p.t("abgabetool/c4Cancel")),rejectClass:"btn btn-outline-secondary"}))return!1;const t=this.projektarbeit?.beurteilungLinkOld;window.open(t,"_blank")}else if(!1===await this.$fhcAlert.confirm({message:this.$p.t("abgabetool/c4keinEnduploadErfolgt"),acceptLabel:this.$capitalize(this.$p.t("abgabetool/c4AcceptAndProceed")),acceptClass:"btn btn-danger",rejectLabel:this.$capitalize(this.$p.t("abgabetool/c4Cancel")),rejectClass:"btn btn-outline-secondary"}))return!1},formatDate(t){const e=new Date(t),a=t=>String(t).padStart(2,"0"),i=a(e.getMonth()+1);return`${a(e.getDate())}.${i}.${e.getFullYear()}`},openCreateNewAbgabeModal(){if("Zweitbegutachter"!=this.projektarbeit?.betreuerart_kurzbz){if(!this.newTermin){const t=this.abgabeTypeOptions.find(t=>"zwischen"===t.paabgabetyp_kurzbz);this.newTermin={paabgabe_id:-1,projektarbeit_id:this.projektarbeit.projektarbeit_id,fixtermin:!1,invertedFixtermin:!0,kurzbz:"",datum:(new Date).toISOString().split("T")[0],note:this.allowedNotenOptions.find(t=>9==t.note),beurteilungsnotiz:"",upload_allowed:t.upload_allowed_default,paabgabetyp_kurzbz:"",bezeichnung:t,abgabedatum:null,insertvon:this.viewData?.uid??""}}this.$refs.modalContainerCreateNewAbgabe.show()}else this.$fhcAlert.alertWarning("Terminanlage disabled")},validateTermin:t=>!0,async handleSaveNewAbgabe(t){if(!this.validateTermin(t))return this.$fhcAlert.alertWarning("invalid termin"),!1;await this.saveTermin(t),this.$refs.modalContainerCreateNewAbgabe.hide(),this.newTermin={paabgabe_id:-1,projektarbeit_id:this.projektarbeit.projektarbeit_id,fixtermin:!1,invertedFixtermin:!0,kurzbz:"",datum:(new Date).toISOString().split("T")[0],note:this.allowedNotenOptions.find(t=>9==t.note),beurteilungsnotiz:"",upload_allowed:!1,paabgabetyp_kurzbz:"",bezeichnung:this.abgabeTypeOptions.find(t=>"zwischen"===t.paabgabetyp_kurzbz),abgabedatum:null,insertvon:this.viewData?.uid??""}},handleChangeAbgabetyp(t){"qualgate1"===t.bezeichnung?.paabgabetyp_kurzbz||"qualgate2"===t.bezeichnung?.paabgabetyp_kurzbz?t.kurzbz=t.bezeichnung.bezeichnung:t.kurzbz=""}},computed:{getAllowedToCreateNewTermin(){if(this.assistenzMode)return!0;if("Zweitbegutachter"==this.projektarbeit?.betreuerart_kurzbz)return!1;if(void 0!==this.projektarbeit?.note&&null!==this.projektarbeit.note){return!!this.notenOptionsNonFinal.find(t=>t.note)}return!0},allowedToSaveZusatzdaten(){return this.form.schlagwoerter.length>0&&this.form.schlagwoerter_en.length>0&&this.form.abstract.length>0&&this.form.abstract_en.length>0&&this.form.seitenanzahl>0},getAllowedAbgabeTypeOptions(){return this.assistenzMode?this.abgabeTypeOptions:this.abgabeTypeOptions.filter(t=>this.abgabetypenBetreuer.includes(t.paabgabetyp_kurzbz))},getMessagePtStyle:()=>({root:{style:{margin:"0px"}},wrapper:{style:{padding:"6px"}}}),getEid(){return this.$p.t("abgabetool/c4eidesstattlicheErklaerung")},getEnduploadErlaubt(){return!this.eidAkzeptiert},getSemesterBenotbar(){return this.projektarbeit?.isCurrent??!1},endUploadVorhanden(){return this.projektarbeit?.abgabetermine.find(t=>"end"===t.paabgabetyp_kurzbz&&null!==t.abgabedatum)},qualityGateTerminAvailable(){let t=!1;return this.projektarbeit?.abgabetermine.forEach(e=>{"qualgate1"!=e.bezeichnung?.paabgabetyp_kurzbz&&"qualgate2"!=e?.bezeichnung?.paabgabetyp_kurzbz||(t=!0)}),t},getSpeedDialStyle:()=>"position: static !important;",getSpeedDialWrapperStyle:()=>"position: absolute; z-index: 9999; left: 0px; bottom: 0.5rem;",getTooltipVerspaetet(){return{value:this.$p.t("abgabetool/c4tooltipVerspaetet"),class:"custom-tooltip"}},getTooltipVerpasst(){return{value:this.$p.t("abgabetool/c4tooltipVerpasst"),class:"custom-tooltip"}},getTooltipAbzugeben(){return{value:this.$p.t("abgabetool/c4tooltipAbzugeben"),class:"custom-tooltip"}},getTooltipStandard(){return{value:this.$p.t("abgabetool/c4tooltipStandardv2"),class:"custom-tooltip"}},getTooltipBeurteilungerforderlich(){return{value:this.$p.t("abgabetool/c4tooltipBeurteilungerforderlich"),class:"custom-tooltip"}},getTooltipAbgegeben(){return{value:this.$p.t("abgabetool/c4tooltipAbgegeben"),class:"custom-tooltip"}},getTooltipFixtermin(){return{value:this.$p.t("abgabetool/c4tooltipFixtermin"),class:"custom-tooltip"}},getTooltipAbgabeDetected(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipAbgabeDetected")),class:"custom-tooltip"}},getTooltipNotAllowedToSave(){return{value:this.$p.t("abgabetool/c4notAllowedToEditAbgabeTermin"),class:"custom-tooltip"}},getTooltipNotAllowedToDelete(){return{value:this.$p.t("abgabetool/c4notAllowedToDeleteAbgabeTermin"),class:"custom-tooltip"}},getTooltipBestanden(){return{value:this.$p.t("abgabetool/c4tooltipBestanden"),class:"custom-tooltip"}},getTooltipNichtBestanden(){return{value:this.$p.t("abgabetool/c4tooltipNichtBestanden"),class:"custom-tooltip"}},getProjektarbeitTitel(){return this.projektarbeit?.titel?this.$capitalize(this.$p.t("abgabetool/c4titel"))+": "+this.projektarbeit.titel:""},getProjektarbeitStudent(){return this.projektarbeit?.student?this.$capitalize(this.$p.t("person/student"))+": "+this.projektarbeit.student:""}},watch:{"newTermin.bezeichnung"(t){"qualgate1"!==t?.paabgabetyp_kurzbz&&"qualgate2"!==t?.paabgabetyp_kurzbz||(this.newTermin.kurzbz=t.bezeichnung),this.newTermin.upload_allowed=t.upload_allowed_default},projektarbeit(t){const e=this.abgabeTypeOptions.find(t=>"zwischen"===t.paabgabetyp_kurzbz);this.newTermin={paabgabe_id:-1,projektarbeit_id:t.projektarbeit_id,fixtermin:!1,invertedFixtermin:!0,kurzbz:"",datum:(new Date).toISOString().split("T")[0],note:this.allowedNotenOptions.find(t=>9==t.note),beurteilungsnotiz:"",upload_allowed:e.upload_allowed_default,paabgabetyp_kurzbz:"",bezeichnung:e,abgabedatum:null,insertvon:this.viewData?.uid??""},t?.abgabetermine?.forEach(t=>t.invertedFixtermin=!t.fixtermin),this.form.sprache=t.sprache?this.allActiveLanguages.find(e=>e.sprache==t.sprache):this.allActiveLanguages.find(t=>"German"==t.sprache),this.form.abstract=t.abstract??"",this.form.abstract_en=t.abstract_en??"",this.form.schlagwoerter=t.schlagwoerter??"",this.form.schlagwoerter_en=t.schlagwoerter_en??"",this.form.kontrollschlagwoerter=t.kontrollschlagwoerter??"",this.form.seitenanzahl=t.seitenanzahl??1}},created(){},mounted(){},template:'\n\t\n\t\t\n\t\t\n\t\t\n\t\n\n\t
    \n\t\t
    {{$capitalize( $p.t(\'abgabetool/c4abgabeMitarbeiterbereich\') )}}
    \n\n\t\t
    \n\t\t\t
    \n\t\t\t\t

    {{getProjektarbeitStudent}}

    \n\t\t\t\t

    {{getProjektarbeitTitel}}

    \n\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t
    \n\t\t
    \n\t\t\t
    \n\x3c!--\t\t\t\tTODO: tooltip why this button is disabled--\x3e\n\t\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\t\t
    \n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t
    \n\t\t\t
    {{ $capitalize( $p.t(\'abgabetool/c4keineAbgabetermineGefunden\') )}}
    \n\t\t
    \n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t
    \n'};function ct(t,e,a){let i=document.createElement("div"),n=null,r=t.getValue();if(Array.isArray(r)){const t=r[0]?new Date(r[0]):null,e=r[1]?new Date(r[1]):null;n=[t,e]}return Vue.createApp({components:{PrimevueCalendar:primevue.calendar},data:()=>({val:n}),watch:{val(t){a(t)}},template:'\n\t\t\t\t '}).use(primevue.config.default).mount(i),i}async function pt(t,e,a,i,n){let r=t.join(","),s="";const o=a&&"string"==typeof a?a.length+9:0;if(r.length>2024&&!1===await i.confirm({message:n.t("stv","zuvieleEMails")}))return;let l=!0,d=e?.ctrlKey||e?.metaKey;for(;r.length>0;){if(r.length+o>2024){let t=r.lastIndexOf(",",1900);s=r.substring(0,t),r=r.substring(t+1)}else s=r,r="";let t=d?`mailto:?bcc=${s}`:`mailto:${s}`;a&&"string"==typeof a&&(t+=`?subject=${a}`),l?(window.location.href=t,l=!1):!0===await i.confirm({message:n.t("stv","weitereEMail")})&&(window.location.href=t)}}primevue||console.error("PrimeVue not loaded!"),Tabulator.extendModule("filter","filters",{dates:(t,e)=>{if(!t)return!0;let a=new Date(e);if(Array.isArray(t)){let e=new Date(t[0]);if(t[1]){let i=new Date(t[1]);return i.setHours(23,59,59,999),a>=e&&a<=i}return a.toDateString()===e.toDateString()}let i=new Date(t);return a.toDateString()===i.toDateString()}});const ut={name:"AbgabetoolMitarbeiter",components:{BsModal:H,CoreFilterCmpt:lt,AbgabeDetail:dt,Checkbox:primevue.checkbox,Dropdown:primevue.dropdown,Textarea:primevue.textarea,TieredMenu:primevue.tieredmenu,VueDatePicker:n,FhcOverlay:U},provide(){return{abgabeTypeOptions:Vue.computed(()=>this.abgabeTypeOptions),abgabetypenBetreuer:Vue.computed(()=>this.abgabetypenBetreuer),allowedNotenOptions:Vue.computed(()=>this.allowedNotenOptions),notenOptionsNonFinal:Vue.computed(()=>this.notenOptionsNonFinal),turnitin_link:Vue.computed(()=>this.turnitin_link),old_abgabe_beurteilung_link:Vue.computed(()=>this.old_abgabe_beurteilung_link)}},props:{viewData:{type:Object,required:!0,default:()=>({name:"",uid:""}),validator:t=>t&&t.uid}},data(){return{tableData:null,abgabetypenBetreuer:null,detailIsFullscreen:!1,phrasenPromise:null,phrasenResolved:!1,turnitin_link:null,old_abgabe_beurteilung_link:null,BETREUER_SAMMELMAIL_BUTTON_STUDENT:null,saving:!1,loading:!1,abgabeTypeOptions:null,notenOptions:null,allowedNotenOptions:null,notenOptionsNonFinal:null,serienTermin:Vue.reactive({datum:new Date,bezeichnung:{paabgabetyp_kurzbz:"zwischen",bezeichnung:"Zwischenabgabe"},kurzbz:"",upload_allowed:!1}),showAll:!1,tabulatorUuid:Vue.ref(0),selectedData:[],domain:"",student_uid:null,detail:null,detailOffset:0,projektarbeiten:null,selectedProjektarbeit:null,tableBuiltResolve:null,tableBuiltPromise:null,abgabeTableOptions:{minHeight:250,index:"projektarbeit_id",layout:"fitDataStretch",placeholder:Vue.computed(()=>this.$p.t("global/noDataAvailable")),selectable:!0,selectableCheck:this.selectionCheck,rowHeight:40,columns:[{formatter:function(t,e,a){if(!t.getRow().getData().selectable)return;let i=document.createElement("input");i.type="checkbox",i.addEventListener("click",a=>{a.stopPropagation(),e&&e.handleClick&&e.handleClick(a,t)}),t.getRow().getData().checkbox=i;let n=document.createElement("div");return n.style.cssText="display: flex; justify-content: center; align-items: center; height: 100%; width: 100%;",n.appendChild(i),n},titleFormatter:function(t,e,a){let i=document.createElement("input");return i.type="checkbox",i.addEventListener("click",a=>{a.stopPropagation(),e&&e.handleClick&&e.handleClick(a,t)}),i},hozAlign:"center",headerSort:!1,formatterParams:{handleClick:this.selectHandler},titleFormatterParams:{handleClick:this.selectAllHandler},width:50,cssClass:"sticky-col"},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4details"))),field:"details",formatter:this.detailFormatter,headerFilter:!1,headerSort:!1,widthGrow:1,tooltip:!1,cssClass:"sticky-col"},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4personenkennzeichen"))),headerFilter:!0,field:"pkz",formatter:this.pkzTextFormatter,widthGrow:1,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4vorname"))),field:"vorname",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4nachname"))),field:"nachname",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4projekttyp"))),field:"projekttyp_kurzbz",formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4stg"))),field:"stg",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4sem"))),field:"studiensemester_kurzbz",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4titel"))),field:"titel",headerFilter:!0,formatter:this.centeredTextFormatter,maxWidth:500,widthGrow:8},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4betreuerartv2"))),field:"betreuerart_beschreibung",formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4prevAbgabetermin"))),field:"prevTermin",headerFilter:ct,headerFilterFunc:this.headerFilterTerminCol,sorter:this.sortFuncTerminCol,formatter:this.abgabterminFormatter,widthGrow:1,width:250,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4nextAbgabetermin"))),field:"nextTermin",headerFilter:ct,headerFilterFunc:this.headerFilterTerminCol,sorter:this.sortFuncTerminCol,formatter:this.abgabterminFormatter,widthGrow:1,width:250,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4qgate1Status"))),headerFilter:"list",headerFilterParams:{valuesLookup:this.getQGateStatusList},field:"qgate1Status",formatter:this.centeredTextFormatter,widthGrow:1,width:220,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4qgate2Status"))),headerFilter:"list",headerFilterParams:{valuesLookup:this.getQGateStatusList},field:"qgate2Status",formatter:this.centeredTextFormatter,widthGrow:1,width:220,tooltip:!1}],persistence:!1,persistenceID:"abgabeTableBetreuer2026-02-26"},abgabeTableEventHandlers:[{event:"tableBuilt",handler:async()=>{this.tableBuiltResolve()}},{event:"cellClick",handler:async(t,e)=>{"details"===e.getColumn().getField()?(this.setDetailComponent(e.getValue()),this.undoSelection(e)):"mail"===e.getColumn().getField()&&this.undoSelection(e)}},{event:"rowSelectionChanged",handler:async t=>{this.selectedData.filter(e=>!t.includes(e)).forEach(t=>{t.checkbox&&(t.checkbox.checked=!1)}),t.forEach(t=>{t.checkbox&&(t.checkbox.checked=!0)}),this.selectedData=t}}]}},methods:{handlePaUpdated(t){this.checkAbgabetermineProjektarbeit(t),this.$refs.abgabeTable.tabulator.redraw(!0)},sammelMailStudent(t){const e=[];this.selectedData.forEach(t=>{e.push(`${t.student_uid}@${this.domain}`)});pt([...new Set(e)],t.originalEvent,"",this.$fhcAlert,this.$p)},getQGateStatusList(){return[this.$p.t("abgabetool/c4keinTerminVorhanden"),this.$p.t("abgabetool/c4positivBenotet"),this.$p.t("abgabetool/c4negativBenotet"),this.$p.t("abgabetool/c4notYetGraded"),this.$p.t("abgabetool/c4notSubmitted"),this.$p.t("abgabetool/c4notHappenedYet")]},sortFuncTerminCol:(t,e,a,i,n,r,s)=>null==t?1:null==e?-1:"prevTermin"==n._column.field?Math.abs(e.diffMs)-Math.abs(t.diffMs):"nextTermin"==n._column.field?Math.abs(t.diffMs)-Math.abs(e.diffMs):Math.abs(e.diffMs)-Math.abs(t.diffMs),headerFilterTerminCol(t,e){if(!e||!e.luxonDate||!e.luxonDate.isValid)return!1;const a=e.luxonDate,i=t=>{if(!t)return null;let e;return e=t instanceof Date?luxon.DateTime.fromJSDate(t):"string"==typeof t?luxon.DateTime.fromISO(t):luxon.DateTime.fromMillis(Number(t)),e.isValid?e:null},n=i(t[0]),r=i(t[1]);return n&&!r?a.hasSame(n,"day"):!(!n||!r)&&(a>=n.startOf("day")&&a<=r.endOf("day"))},loadState(){return JSON.parse(localStorage.getItem(this.abgabeTableOptions.persistenceID)||"null")},saveState(t){if(!this.stateRestored)return;const e={columns:t.getColumnLayout().map(t=>({field:t.field,visible:t.visible,width:t.width})),sort:t.getSorters().map(t=>({field:t.field,dir:t.dir})),filters:t.getFilters(),headerFilters:t.getHeaderFilters()};localStorage.setItem(this.abgabeTableOptions.persistenceID,JSON.stringify(e))},handleTableBuilt(){const t=this.$refs.abgabeTable.tabulator;this.tableBuiltResolve(),t.on("columnMoved",()=>{this.saveState(t)}),t.on("columnResized",()=>{this.saveState(t)}),t.on("columnVisibilityChanged",()=>{this.saveState(t)}),t.on("filterChanged",()=>{this.saveState(t)}),t.on("headerFilterChanged",()=>{this.saveState(t)}),t.on("dataSorted",()=>{this.saveState(t)}),t.on("columnSorted",()=>{this.saveState(t)}),t.on("sortersChanged",()=>{this.saveState(t)});const e=this.loadState();t.on("renderComplete",()=>{if(!this.stateRestored){if(e?.columns&&!this.colLayoutRestored){const a=e.columns.map(t=>({field:t.field,width:t.width,visible:t.visible}));t.setColumnLayout(a),this.colLayoutRestored=!0}if(e?.filters&&!this.filtersRestored&&(this.filtersRestored=!0,t.setFilter(e.filters)),e?.headerFilters&&!this.headerFiltersRestored){this.headerFiltersRestored=!0;for(let a of e.headerFilters)t.setHeaderFilterValue(a.field,a.value)}e?.sort?.length&&!this.sortRestored&&(this.sortRestored=!0,setTimeout(()=>{const a=e.sort.map(e=>{const a=t.columnManager.findColumn(e.field);return a?{column:a,dir:e.dir}:null}).filter(Boolean);t.setSort(a)},100)),this.stateRestored=!0}})},checkQualityGateStatus(t){const e=[],a=[];t.qgate1Status=this.$p.t("abgabetool/c4keinTerminVorhanden"),t.qgate1StatusRank=0,t.qgate2Status=this.$p.t("abgabetool/c4keinTerminVorhanden"),t.qgate2StatusRank=0,t.abgabetermine.forEach(t=>{"qualgate1"==t.paabgabetyp_kurzbz&&e.push(t),"qualgate2"==t.paabgabetyp_kurzbz&&a.push(t)}),e.forEach(e=>{if(null!=e.note&&t.qgate1StatusRank<=5){("object"!=typeof e.note?this.notenOptions.find(t=>t.note==e.note):e.note).positiv?(t.qgate1Status=this.$p.t("abgabetool/c4positivBenotet"),t.qgate1StatusRank=5):(t.qgate1Status=this.$p.t("abgabetool/c4negativBenotet"),t.qgate1StatusRank=4)}else null==e.note&&t.qgate1StatusRank<=3?(t.qgate1Status=this.$p.t("abgabetool/c4notYetGraded"),t.qgate1StatusRank=3):1==e.upload_allowed&&null==e.abgabedatum&&t.qgate1StatusRank<=2?(t.qgate1Status=this.$p.t("abgabetool/c4notSubmitted"),t.qgate1StatusRank=2):0==e.upload_allowed&&e.diffMs<=0&&t.qgate1StatusRank<=1&&(t.qgate1Status=this.$p.t("abgabetool/c4notHappenedYet"),t.qgate1StatusRank=1)}),a.forEach(e=>{if(null!=e.note&&t.qgate1StatusRank<=5){("object"!=typeof e.note?this.notenOptions.find(t=>t.note==e.note):e.note).positiv?(t.qgate2Status=this.$p.t("abgabetool/c4positivBenotet"),t.qgate2StatusRank=5):(t.qgate2Status=this.$p.t("abgabetool/c4negativBenotet"),t.qgate2StatusRank=4)}else null==e.note&&t.qgate2StatusRank<=3?(t.qgate2Status=this.$p.t("abgabetool/c4notYetGraded"),t.qgate2StatusRank=3):1==e.upload_allowed&&null==e.abgabedatum&&t.qgate2StatusRank<=2?(t.qgate2Status=this.$p.t("abgabetool/c4notSubmitted"),t.qgate2StatusRank=2):0==e.upload_allowed&&e.diffMs<=0&&t.qgate2StatusRank<=1&&(t.qgate2Status=this.$p.t("abgabetool/c4notHappenedYet"),t.qgate2StatusRank=1)})},checkAbgabetermineProjektarbeit(t){const e=luxon.DateTime.now();t.abgabetermine.forEach(a=>{a.dateStyle=W(a,this.notenOptions);const i=luxon.DateTime.fromISO(a.datum).endOf("day");a.luxonDate=i,a.diffMs=i.toMillis()-e.toMillis(),a.diffMs<0?(!t.prevTermin||a.diffMs>t.prevTermin.diffMs)&&(t.prevTermin=a):a.diffMs>0&&(!t.nextTermin||a.diffMs
    '+t+'

    '+a+" - "+this.formatDate(e.datum)+"

    "}return""},selectHandler(t,e){const a=e.getRow();return a.isSelected()?a.deselect():a.select(),t.stopPropagation(),!1},selectAllHandler(t,e){const a=e.getTable().getRows().filter(t=>t.getData().selectable);return a.every(t=>t.isSelected())?a.forEach(t=>t.deselect()):a.forEach(t=>t.select()),t.stopPropagation(),!1},handleToggleFullscreenDetail(){this.detailIsFullscreen=!this.detailIsFullscreen},getOptionLabelAbgabetyp:t=>t.bezeichnung,formatDate(t){const e=new Date(t),a=t=>String(t).padStart(2,"0"),i=a(e.getMonth()+1);return`${a(e.getDate())}.${i}.${e.getFullYear()}`},undoSelection(t){const e=t.getRow();e.isSelected()&&e.deselect()},selectionCheck(t){const e=t.getData();return"Zweitbegutachter"!=e?.betreuerart_kurzbz},showDeadlines(){const t=FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/Cis/Abgabetool/Deadlines";window.open(t,"_blank")},toggleShowAll(t){this.showAll=t,this.loading=!0,this.loadProjektarbeiten(t,()=>{this.$refs.abgabeTable?.tabulator.redraw(!0),this.$refs.abgabeTable?.tabulator.setSort([]),this.loading=!1})},openAddSeriesModal(){this.$refs.modalContainerAddSeries.show()},addSeries(){this.saving=!0,this.$api.call(G.postSerientermin(this.serienTermin.datum.toISOString(),this.serienTermin.bezeichnung.paabgabetyp_kurzbz,this.serienTermin.bezeichnung.bezeichnung,this.serienTermin.kurzbz,this.serienTermin.upload_allowed,this.selectedData?.map(t=>t.projektarbeit_id),!1)).then(t=>{if("success"===t.meta.status&&t.data){this.$fhcAlert.alertSuccess(this.$p.t("abgabetool/serienTerminGespeichert"));const t=this.$refs.abgabeTable?.tabulator.rowManager.scrollLeft,e=this.$refs.abgabeTable?.tabulator.rowManager.scrollTop;this.loading=!0,this.loadProjektarbeiten(this.showAll,()=>{this.$refs.abgabeTable?.tabulator.redraw(!0),this.$refs.abgabeTable?.tabulator.setSort([]),this.loading=!1,Vue.nextTick(()=>{const a=this.$refs.abgabeTable?.tabulator.element.querySelector(".tabulator-tableholder");a&&(a.scrollLeft=t,a.scrollTop=e)})})}else this.$fhcAlert.alertError(this.$p.t("abgabetool/errorSerienterminSpeichern"))}).finally(()=>{this.saving=!1}),this.$refs.modalContainerAddSeries.hide()},createInfoString(t){let e="";return t.forEach(t=>{e+=t,e+="; "}),e},isPastDate(t){const e=luxon.DateTime.fromISO(t,{zone:"Europe/Vienna"}).endOf("day");return luxon.DateTime.now().setZone("Europe/Vienna")>e},setDetailComponent(t){this.loading=!0;const e=this.projektarbeiten?.retval?.find(e=>e.projektarbeit_id==t.projektarbeit_id);let a=!1;if(void 0!==e.note&&null!==e.note){this.notenOptionsNonFinal.find(t=>t.note)&&(a=!1),a=!0}e?.abgabetermine?.length&&this.$api.call(G.getSignaturStatusForProjektarbeitAbgaben(e.abgabetermine.map(t=>t.paabgabe_id),e.student_uid)).then(t=>{"success"===t.meta.status&&t.data.forEach(t=>{const a=e.abgabetermine.find(e=>e.paabgabe_id==t.paabgabe_id);a&&void 0!==t.signatur&&(a.signatur=t.signatur)})}),e.abgabetermine.forEach(t=>{const e=this.allowedNotenOptions.find(e=>e.note==t.note);e&&(t.note=e),t.file=[],!t.noteBackend&&e&&(t.noteBackend=e),t.allowedToSave=!a,t.allowedToDelete=t.allowedToSave&&!t.abgabedatum,t.bezeichnung=this.abgabeTypeOptions.find(e=>e.paabgabetyp_kurzbz===t.paabgabetyp_kurzbz)}),e.student_uid=t.student_uid,e.student=`${e.vorname} ${e.nachname}`,this.selectedProjektarbeit=e,this.$refs.modalContainerAbgabeDetail.show(),this.loading=!1},centeredTextFormatter(t){const e=t.getValue();if(e)return'

    '+e+"

    "},detailFormatter:t=>'
    ',beurteilungFormatter:t=>t.getValue()?'
    ':"-",pkzTextFormatter:t=>'",tableResolve(t){this.tableBuiltResolve=t},buildMailToLink(t){return"mailto:"+t.uid+"@"+this.domain},buildPKZ:t=>`${t.uid} / ${t.matrikelnr}`,buildStg:t=>(t.typ+t.kurzbz)?.toUpperCase(),setupData(t){this.projektarbeiten=t[0],this.domain=t[1],this.tableData=t[0]?.retval?.map(t=>(this.checkAbgabetermineProjektarbeit(t),t.selectable="Zweitbegutachter"!==t.betreuerart_kurzbz,{...t,details:{student_uid:t.uid,projektarbeit_id:t.projektarbeit_id},pkz:this.buildPKZ(t),beurteilung:t.beurteilungLink??null,sem:t.studiensemester_kurzbz,stg:this.buildStg(t),mail:this.buildMailToLink(t),typ:t.projekttyp_kurzbz,titel:t.titel})),this.$refs.abgabeTable.tabulator.setColumns(this.abgabeTableOptions.columns),this.$refs.abgabeTable.tabulator.setData(this.tableData)},loadProjektarbeiten(t=!1,e){this.$api.call(G.getMitarbeiterProjektarbeiten(t)).then(t=>{t?.data&&this.setupData(t.data)}).finally(()=>{e&&e()})},loadAbgaben(t){return new Promise(e=>{this.$api.call(G.getStudentProjektabgaben(t)).then(t=>{e(t)})})},handleUuidDefined(t){this.tabulatorUuid=t},calcMaxTableHeight(){const t=this.tabulatorUuid?"-"+this.tabulatorUuid:"",e=document.getElementById("filterTableDataset"+t);if(!e)return;const a=e.getBoundingClientRect();this.abgabeTableOptions.height=window.visualViewport.height-a.top-80,this.$refs.abgabeTable.tabulator.setHeight(this.abgabeTableOptions.height)},async setupMounted(){this.tableBuiltPromise=new Promise(this.tableResolve),await this.tableBuiltPromise,this.loadProjektarbeiten(),this.calcMaxTableHeight()}},watch:{"serienTermin.bezeichnung"(t){"qualgate1"!==t?.paabgabetyp_kurzbz&&"qualgate2"!==t?.paabgabetyp_kurzbz||(this.serienTermin.kurzbz=t.bezeichnung),this.serienTermin.upload_allowed=t.upload_allowed_default}},computed:{emailItems(){const t=[];return this.BETREUER_SAMMELMAIL_BUTTON_STUDENT&&t.push({label:this.$p.t("abgabetool/c4sendEmailStudierendev2",[this.uniqueStudentEmailCount]),command:this.sammelMailStudent}),t},uniqueStudentEmailCount(){const t=new Set;return this.selectedData.forEach(e=>{e.student_uid&&t.add(e.student_uid)}),t.size},getAllowedAbgabeTypeOptions(){return this.abgabeTypeOptions.filter(t=>this.abgabetypenBetreuer.includes(t.paabgabetyp_kurzbz))}},created(){this.phrasenPromise=this.$p.loadCategory(["abgabetool","global"]),this.phrasenPromise.then(()=>{this.phrasenResolved=!0}),this.$api.call(G.getConfig()).then(t=>{this.turnitin_link=t.data?.turnitin_link,this.old_abgabe_beurteilung_link=t.data?.old_abgabe_beurteilung_link,this.abgabetypenBetreuer=t.data?.abgabetypenBetreuer,this.BETREUER_SAMMELMAIL_BUTTON_STUDENT=t.data?.BETREUER_SAMMELMAIL_BUTTON_STUDENT}).catch(t=>{this.loading=!1}),this.$api.call(G.getNoten()).then(t=>{"success"==t.meta.status&&(this.notenOptions=t.data[0],this.allowedNotenOptions=this.notenOptions.filter(e=>t.data[1].includes(e.note)),this.notenOptionsNonFinal=this.notenOptions.filter(e=>t.data[2].includes(e.note)))}).catch(t=>{this.loading=!1}),this.$api.call(G.getPaAbgabetypen()).then(t=>{this.abgabeTypeOptions=t.data}).catch(t=>{this.loading=!1})},mounted(){this.setupMounted()},template:'\n\t\n '};var bt={name:"BootstrapOffcanvas",data:()=>({offcanvas:null}),props:{backdrop:{type:[Boolean,String],default:!0,validator:t=>["static",!0,!1].includes(t)},keyboard:{type:Boolean,default:!0},scroll:{type:Boolean,default:!1},placement:{type:String,default:"start",validator:t=>["start","end","top","bottom"].includes(t)},noCloseBtn:Boolean,headerClass:{type:[String,Array,Object],default:""},bodyClass:{type:[String,Array,Object],default:"p-4"},footerClass:{type:[String,Array,Object],default:""},dialogClass:[String,Array,Object]},emits:["hideBsOffcanvas","hiddenBsOffcanvas","hidePreventedBsOffcanvas","showBsOffcanvas","shownBsOffcanvas"],methods:{dispose(){return this.offcanvas?.dispose()},hide(){return this.offcanvas?.hide()},show(t){return this.offcanvas?.show(t)},toggle(){return this.offcanvas?.toggle()},popup(t,e,a,i){const n=this,r={};void 0!==t&&(r.default=()=>t),void 0!==a&&(r.title=()=>a),void 0!==i&&(r.footer=()=>i);let s=!1;return"undefined"!=typeof primevue&&(s=!0),new Promise((t,a)=>{const i=Vue.createApp({name:"OffcanvasTmpApp",setup:()=>()=>Vue.h(n,{class:"offcanvas-wrapper",ref:"offcanvas",...e},r),mounted(){this.$refs.offcanvas.show()},beforeUnmount(){this.$refs.offcanvas&&(!1!==this.$refs.offcanvas.result?t(this.$refs.offcanvas.result):a())},unmounted(){o.parentElement.removeChild(o)}}),o=document.createElement("div");s&&i.use(primevue.config.default,{zIndex:{overlay:9999}}),Promise.resolve().then(function(){return V}).then(t=>{i.use(t.default),i.mount(o),document.body.appendChild(o)})})}},mounted(){this.$refs.offcanvas&&(this.offcanvas=new bootstrap.Offcanvas(this.$refs.offcanvas,{backdrop:this.backdrop,keyboard:this.keyboard,scroll:this.scroll}))},template:'\n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\n\t\t\t\n\t\t
    \n\t'},ht={getAllStudiensemesterAndAktOrNext:()=>({method:"get",url:"/api/frontend/v1/organisation/Studiensemester/getAllStudiensemesterAndAktOrNext"}),getAll:(t=null,e=null)=>({method:"get",url:"api/frontend/v1/organisation/studiensemester/getAll",params:{order:t,start:e}})};const gt={name:"AbgabetoolAssistenz",components:{AbgabeterminStatusLegende:{name:"AbgabeterminStatusLegende",template:'\t\n\t\t
    \n\t\t\t
    \n\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t(\'abgabetool/c4tooltipVerspaetet\')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t(\'abgabetool/c4tooltipVerpasst\')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t(\'abgabetool/c4tooltipAbzugeben\')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t(\'abgabetool/c4tooltipStandardv2\')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t(\'abgabetool/c4tooltipAbgegeben\')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t(\'abgabetool/c4tooltipBeurteilungerforderlich\')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t(\'abgabetool/c4tooltipBestanden\')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t(\'abgabetool/c4tooltipNichtBestanden\')) }}
    \n\t\t\t\t\t
    \t\n\t\t\t\t
    \n\n\t\t\t
    \n\t\t
    \t\n\t'},BsModal:H,BsOffcanvas:bt,CoreFilterCmpt:lt,AbgabeDetail:dt,Checkbox:primevue.checkbox,Dropdown:primevue.dropdown,Inplace:primevue.inplace,Textarea:primevue.textarea,Timeline:primevue.timeline,TieredMenu:primevue.tieredmenu,VueDatePicker:n,FhcOverlay:U},provide(){return{abgabeTypeOptions:Vue.computed(()=>this.abgabeTypeOptions),allowedNotenOptions:Vue.computed(()=>this.allowedNotenOptions),notenOptionsNonFinal:Vue.computed(()=>this.notenOptionsNonFinal),turnitin_link:Vue.computed(()=>this.turnitin_link),old_abgabe_beurteilung_link:Vue.computed(()=>this.old_abgabe_beurteilung_link),abgabetypenBetreuer:Vue.computed(()=>this.abgabeTypeOptions)}},props:{stg_kz_prop:{default:null},viewData:{type:Object,required:!0,default:()=>({name:"",uid:""}),validator:t=>t&&t.uid}},data(){return{tableData:null,studiensemesterOptions:null,allSem:null,curSem:null,notenOptionFilter:null,inplaceToggle:!1,headerFiltersRestored:!1,filtersRestored:!1,colLayoutRestored:!1,sortRestored:!1,stateRestored:!1,timelineProjekt:null,selectedStudiengangOption:null,studiengaengeOptions:null,detailIsFullscreen:!1,allConfigPromise:null,phrasenPromise:null,phrasenResolved:!1,turnitin_link:null,old_abgabe_beurteilung_link:null,ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT:null,ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER:null,saving:!1,loading:!1,abgabeTypeOptions:null,notenOptions:null,allowedNotenFilterOptions:null,allowedNotenOptions:null,notenOptionsNonFinal:null,serienTermin:Vue.reactive({datum:new Date,bezeichnung:{paabgabetyp_kurzbz:"zwischen",bezeichnung:"Zwischenabgabe"},kurzbz:"",fixtermin:!1,invertedFixtermin:!0,upload_allowed:!1}),showAll:!1,tabulatorUuid:Vue.ref(0),selectedData:[],domain:"",student_uid:null,detail:null,detailOffset:0,projektarbeiten:null,selectedProjektarbeit:null,tableBuiltResolve:null,tableBuiltPromise:null,abgabeTableOptions:{minHeight:250,index:"projektarbeit_id",layout:"fitData",placeholder:Vue.computed(()=>this.$capitalize(this.$p.t("global/noDataAvailable"))),selectable:!0,selectableCheck:this.selectionCheck,rowHeight:40,renderVerticalBuffer:2e3,columns:[{formatter:function(t,e,a){if(!t.getRow().getData().selectable)return;let i=document.createElement("input");i.type="checkbox",i.addEventListener("click",a=>{a.stopPropagation(),e&&e.handleClick&&e.handleClick(a,t)}),t.getRow().getData().checkbox=i;let n=document.createElement("div");return n.style.cssText="display: flex; justify-content: center; align-items: center; height: 100%; width: 100%;",n.appendChild(i),n},titleFormatter:function(t,e,a){let i=document.createElement("input");return i.type="checkbox",i.addEventListener("click",a=>{a.stopPropagation(),e&&e.handleClick&&e.handleClick(a,t)}),i},hozAlign:"center",headerSort:!1,formatterParams:{handleClick:this.selectHandler},titleFormatterParams:{handleClick:this.selectAllHandler},width:50,cssClass:"sticky-col"},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4details"))),field:"details",headerFilter:!1,headerSort:!1,formatter:this.formAction,tooltip:!1,minWidth:150,cssClass:"sticky-col"},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4personenkennzeichen"))),headerFilter:!0,field:"pkz",formatter:this.pkzTextFormatter,widthGrow:1,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4vorname"))),field:"student_vorname",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4nachname"))),field:"student_nachname",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4studstatus"))),field:"studienstatus",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4orgform"))),field:"orgform",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4projekttyp"))),field:"projekttyp_kurzbz",formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4stg"))),field:"stg",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4note"))),field:"note_bez",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4sem"))),field:"studiensemester_kurzbz",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4titel"))),field:"titel",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4erstbetreuerv2"))),field:"erstbetreuer",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4erstbetreuerTitelPre"))),field:"betreuer_titelpre",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1,visible:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4erstbetreuerVorname"))),field:"betreuer_vorname",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1,visible:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4erstbetreuerNachname"))),field:"betreuer_nachname",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1,visible:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4erstbetreuerTitelPost"))),field:"betreuer_titelpost",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1,visible:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4zweitbetreuerv2"))),field:"zweitbetreuer",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4zweitbetreuerTitelPre"))),field:"zweitbetreuer_titelpre",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1,visible:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4zweitbetreuerVorname"))),field:"zweitbetreuer_vorname",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1,visible:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4zweitbetreuerNachname"))),field:"zweitbetreuer_nachname",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1,visible:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4zweitbetreuerTitelPost"))),field:"zweitbetreuer_titelpost",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1,visible:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4prevAbgabetermin"))),headerFilter:ct,headerFilterFunc:this.headerFilterTerminCol,sorter:this.sortFuncTerminCol,field:"prevTermin",formatter:this.abgabterminFormatter,widthGrow:1,width:250,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4nextAbgabetermin"))),field:"nextTermin",headerFilter:ct,headerFilterFunc:this.headerFilterTerminCol,sorter:this.sortFuncTerminCol,formatter:this.abgabterminFormatter,widthGrow:1,width:250,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4qgate1Status"))),headerFilter:"list",headerFilterParams:{valuesLookup:this.getQGateStatusList},field:"qgate1Status",formatter:this.centeredTextFormatter,widthGrow:1,width:220,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4qgate2Status"))),headerFilter:"list",headerFilterParams:{valuesLookup:this.getQGateStatusList},field:"qgate2Status",formatter:this.centeredTextFormatter,widthGrow:1,width:220,tooltip:!1}],persistence:!1,persistenceID:"abgabetool_2026_02_26"},abgabeTableEventHandlers:[{event:"rowSelectionChanged",handler:async t=>{this.selectedData.filter(e=>!t.includes(e)).forEach(t=>{t.checkbox&&(t.checkbox.checked=!1)}),t.forEach(t=>{t.checkbox&&(t.checkbox.checked=!0)}),this.selectedData=t}}]}},methods:{handlePaUpdated(t){this.checkAbgabetermineProjektarbeit(t),this.$refs.abgabeTable.tabulator.redraw(!0)},getQGateStatusList(){return[this.$p.t("abgabetool/c4keinTerminVorhanden"),this.$p.t("abgabetool/c4positivBenotet"),this.$p.t("abgabetool/c4negativBenotet"),this.$p.t("abgabetool/c4notYetGraded"),this.$p.t("abgabetool/c4notSubmitted"),this.$p.t("abgabetool/c4notHappenedYet")]},sortFuncTerminCol:(t,e,a,i,n,r,s)=>null==t?1:null==e?-1:"prevTermin"==n._column.field?Math.abs(e.diffMs)-Math.abs(t.diffMs):"nextTermin"==n._column.field?Math.abs(t.diffMs)-Math.abs(e.diffMs):Math.abs(e.diffMs)-Math.abs(t.diffMs),headerFilterTerminCol(t,e){if(!e||!e.luxonDate||!e.luxonDate.isValid)return!1;const a=e.luxonDate,i=t=>{if(!t)return null;let e;return e=t instanceof Date?luxon.DateTime.fromJSDate(t):"string"==typeof t?luxon.DateTime.fromISO(t):luxon.DateTime.fromMillis(Number(t)),e.isValid?e:null},n=i(t[0]),r=i(t[1]);return n&&!r?a.hasSame(n,"day"):!(!n||!r)&&(a>=n.startOf("day")&&a<=r.endOf("day"))},sammelMailStudent(t){const e=[];this.selectedData.forEach(t=>{e.push(`${t.student_uid}@${this.domain}`)});const a=[...new Set(e)],i=this.$p.t("abgabetool/c4sammelmailStudentBetreff",[this.selectedStudiengangOption?.bezeichnung]);pt(a,t.originalEvent,i,this.$fhcAlert,this.$p)},sammelMailBetreuer(t){const e=[];this.selectedData.forEach(t=>{t.betreuer_mail&&e.push(t.betreuer_mail),t.zweitbetreuer_mail&&e.push(t.zweitbetreuer_mail)});const a=[...new Set(e)],i=this.$p.t("abgabetool/c4sammelmailBetreuerBetreff",[this.selectedStudiengangOption?.bezeichnung]);pt(a,t.originalEvent,i,this.$fhcAlert,this.$p)},selectHandler(t,e){const a=e.getRow();return a.isSelected()?a.deselect():a.select(),t.stopPropagation(),!1},selectAllHandler(t,e){const a=e.getTable().getRows().filter(t=>t.getData().selectable);return a.every(t=>t.isSelected())?a.forEach(t=>t.deselect()):a.forEach(t=>t.select()),t.stopPropagation(),!1},checkQualityGateStatus(t){const e=[],a=[];t.qgate1Status=this.$p.t("abgabetool/c4keinTerminVorhanden"),t.qgate1StatusRank=0,t.qgate2Status=this.$p.t("abgabetool/c4keinTerminVorhanden"),t.qgate2StatusRank=0,t.abgabetermine.forEach(t=>{"qualgate1"==t.paabgabetyp_kurzbz&&e.push(t),"qualgate2"==t.paabgabetyp_kurzbz&&a.push(t)}),e.forEach(e=>{if(null!=e.note&&t.qgate1StatusRank<=5){("object"!=typeof e.note?this.notenOptions.find(t=>t.note==e.note):e.note).positiv?(t.qgate1Status=this.$p.t("abgabetool/c4positivBenotet"),t.qgate1StatusRank=5):(t.qgate1Status=this.$p.t("abgabetool/c4negativBenotet"),t.qgate1StatusRank=4)}else null==e.note&&t.qgate1StatusRank<=3?(t.qgate1Status=this.$p.t("abgabetool/c4notYetGraded"),t.qgate1StatusRank=3):1==e.upload_allowed&&null==e.abgabedatum&&t.qgate1StatusRank<=2?(t.qgate1Status=this.$p.t("abgabetool/c4notSubmitted"),t.qgate1StatusRank=2):0==e.upload_allowed&&e.diffMs<=0&&t.qgate1StatusRank<=1&&(t.qgate1Status=this.$p.t("abgabetool/c4notHappenedYet"),t.qgate1StatusRank=1)}),a.forEach(e=>{if(null!=e.note&&t.qgate1StatusRank<=5){("object"!=typeof e.note?this.notenOptions.find(t=>t.note==e.note):e.note).positiv?(t.qgate2Status=this.$p.t("abgabetool/c4positivBenotet"),t.qgate2StatusRank=5):(t.qgate2Status=this.$p.t("abgabetool/c4negativBenotet"),t.qgate2StatusRank=4)}else null==e.note&&t.qgate2StatusRank<=3?(t.qgate2Status=this.$p.t("abgabetool/c4notYetGraded"),t.qgate2StatusRank=3):1==e.upload_allowed&&null==e.abgabedatum&&t.qgate2StatusRank<=2?(t.qgate2Status=this.$p.t("abgabetool/c4notSubmitted"),t.qgate2StatusRank=2):0==e.upload_allowed&&e.diffMs<=0&&t.qgate2StatusRank<=1&&(t.qgate2Status=this.$p.t("abgabetool/c4notHappenedYet"),t.qgate2StatusRank=1)})},getItemBezeichnung:t=>t.bezeichnung?t?.bezeichnung?.bezeichnung??t?.bezeichnung:"",getItemNote(t){if(!t?.note)return"";if(t.note?.bezeichnung)return t.note.bezeichnung;const e=this.notenOptions.find(e=>e.note==t.note);return e?e.bezeichnung:t.note},handleChangeAbgabetypSerientermin(t){"qualgate1"===t.bezeichnung?.paabgabetyp_kurzbz||"qualgate2"===t.bezeichnung?.paabgabetyp_kurzbz?t.kurzbz=t.bezeichnung.bezeichnung:t.kurzbz=""},semesterChanged(t){if(this.$refs.abgabeTable.tabulator){const e=this.$refs.abgabeTable.tabulator,a=e.getFilters().filter(t=>"studiensemester_kurzbz"!=t.field),i=t.value.studiensemester_kurzbz==this.$p.t("abgabetool/c4all")?"":t.value.studiensemester_kurzbz,n={field:"studiensemester_kurzbz",type:t.value.studiensemester_kurzbz==this.$p.t("abgabetool/c4all")?"!=":"=",value:i};e.setFilter([...a,n])}},checkAbgabetermineProjektarbeit(t){const e=luxon.DateTime.now();t.abgabetermine.forEach(a=>{a.bezeichnung=this.abgabeTypeOptions.find(t=>t.paabgabetyp_kurzbz===a.paabgabetyp_kurzbz),a.dateStyle=W(a,this.notenOptions);const i=luxon.DateTime.fromISO(a.datum).endOf("day");a.luxonDate=i,a.diffMs=i.toMillis()-e.toMillis(),a.diffMs<0?(!t.prevTermin||a.diffMs>t.prevTermin.diffMs)&&(t.prevTermin=a):a.diffMs>0&&(!t.nextTermin||a.diffMs({field:t.field,visible:t.visible,width:t.width})),sort:t.getSorters().map(t=>({field:t.field,dir:t.dir})),filters:t.getFilters(),headerFilters:t.getHeaderFilters()};localStorage.setItem(this.abgabeTableOptions.persistenceID,JSON.stringify(e))},handleTableBuilt(){const t=this.$refs.abgabeTable.tabulator;this.tableBuiltResolve(),t.on("columnMoved",()=>{this.saveState(t)}),t.on("columnResized",()=>{this.saveState(t)}),t.on("columnVisibilityChanged",()=>{this.saveState(t)}),t.on("filterChanged",()=>{this.saveState(t)}),t.on("headerFilterChanged",()=>{this.saveState(t)}),t.on("dataSorted",()=>{this.saveState(t)}),t.on("columnSorted",()=>{this.saveState(t)}),t.on("sortersChanged",()=>{this.saveState(t)});const e=this.loadState();t.on("renderComplete",()=>{if(!this.stateRestored){if(e?.columns&&!this.colLayoutRestored){const a=e.columns.map(t=>({field:t.field,width:t.width,visible:t.visible}));t.setColumnLayout(a),this.colLayoutRestored=!0}if(e?.filters&&!this.filtersRestored&&(this.filtersRestored=!0,t.setFilter(e.filters)),e?.headerFilters&&!this.headerFiltersRestored){this.headerFiltersRestored=!0;for(let a of e.headerFilters)t.setHeaderFilterValue(a.field,a.value)}e?.sort?.length&&!this.sortRestored&&(this.sortRestored=!0,setTimeout(()=>{const a=e.sort.map(e=>{const a=t.columnManager.findColumn(e.field);return a?{column:a,dir:e.dir}:null}).filter(Boolean);t.setSort(a)},100)),this.stateRestored=!0}})},handleToggleFullscreenDetail(){this.detailIsFullscreen=!this.detailIsFullscreen},getOptionLabelAbgabetyp:t=>t.bezeichnung,getOptionLabelStg:t=>t.kurzbzlang+" "+t.bezeichnung,getOptionLabelStudiensemester:t=>t.studiensemester_kurzbz,getNotenFilterOptionLabel:t=>t.bezeichnung,formatDate(t){if(null===t)return"";const e=new Date(t),a=t=>String(t).padStart(2,"0"),i=a(e.getMonth()+1);return`${a(e.getDate())}.${i}.${e.getFullYear()}`},formAction(t){const e=document.createElement("div");e.className="d-flex gap-3",e.style.display="flex",e.style.alignItems="stretch",e.style.justifyContent="center",e.style.height="100%";const a=t.getValue(),i=(t,e,a)=>{const i=document.createElement("button");return i.className="btn btn-outline-secondary",i.style.display="flex",i.style.alignItems="center",i.style.justifyContent="center",i.style.height="100%",i.style.aspectRatio="1 / 1",i.style.padding="0","fa fa-timeline"==t&&(i.style.transform="rotate(90deg)"),i.innerHTML=``,i.title=this.$capitalize(this.$p.t(e)),i.addEventListener("click",t=>{t.stopPropagation(),t.stopImmediatePropagation(),a()}),i};return e.append(i("fa fa-folder-open","abgabetool/c4details",()=>this.setDetailComponent(a)),i("fa fa-timeline","abgabetool/c4termineTimeLine",()=>this.openTimeline(a))),e},undoSelection(t){const e=t.getRow();e.isSelected()&&e.deselect()},selectionCheck(t){const e=t.getData();return"Zweitbegutachter"!=e?.betreuerart_kurzbz},showDeadlines(){const t=FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/Cis/Abgabetool/Deadlines";window.open(t,"_blank")},openAddSeriesModal(){this.$refs.modalContainerAddSeries.show()},addSeries(){const t=this.selectedData?.map(t=>t.projektarbeit_id),e=[...this.selectedData];this.saving=!0,this.serienTermin.fixtermin=!this.serienTermin.invertedFixtermin,this.$api.call(G.postSerientermin(this.serienTermin.datum.toISOString(),this.serienTermin.bezeichnung.paabgabetyp_kurzbz,this.serienTermin.bezeichnung.bezeichnung,this.serienTermin.kurzbz,this.serienTermin.upload_allowed,t,this.serienTermin.fixtermin)).then(e=>{"success"===e.meta.status&&e.data?this.$fhcAlert.alertSuccess(this.$p.t("abgabetool/serienTerminGespeichert")):this.$fhcAlert.alertError(this.$p.t("abgabetool/errorSerienterminSpeichern"));const a=e.data;t.forEach(t=>{const e=a.find(e=>e.projektarbeit_id==t),i=this.projektarbeiten.find(e=>e.projektarbeit_id==t);e.bezeichnung=this.abgabeTypeOptions.find(t=>t.paabgabetyp_kurzbz==e.paabgabetyp_kurzbz),i.abgabetermine.push(e),i.abgabetermine.sort((t,e)=>new Date(t.datum)-new Date(e.datum))});const i=this.$refs.abgabeTable.tabulator,n=i.rowManager.scrollLeft,r=i.rowManager.scrollTop,s=this.mapProjekteToTableData(this.projektarbeiten);i.setData(s),i.redraw(!0),Vue.nextTick(()=>{const t=this.$refs.abgabeTable?.tabulator.element.querySelector(".tabulator-tableholder");t&&(t.scrollLeft=n,t.scrollTop=r)})}).finally(()=>{this.saving=!1,this.selectedData=e}),this.$refs.modalContainerAddSeries.hide()},mapProjekteToTableData(t){return t.map(t=>{if(t.selectable=!0,t.prevTermin=null,t.nextTermin=null,this.checkAbgabetermineProjektarbeit(t),this.notenOptions&&t.note){const e=this.notenOptions.find(e=>e.note==t.note);t.note_bez=e.bezeichnung}return{...t,abgabetermine:t.abgabetermine,details:{student_uid:t.student_uid,projektarbeit_id:t.projektarbeit_id},pkz:this.buildPKZ(t),beurteilung:t.beurteilungLink??null,sem:t.studiensemester_kurzbz,stg:this.buildStg(t),mail:this.buildMailToLink(t),erstbetreuer:this.buildErstbetreuer(t),zweitbetreuer:this.buildZweitbetreuer(t),typ:t.projekttyp_kurzbz,titel:t.titel}})},createInfoString(t){let e="";return t.forEach(t=>{e+=t,e+="; "}),e},isPastDate(t){const e=luxon.DateTime.fromISO(t,{zone:"Europe/Vienna"}).endOf("day");return luxon.DateTime.now().setZone("Europe/Vienna")>e},setDetailComponent(t){const e=this.projektarbeiten.find(e=>e.projektarbeit_id==t.projektarbeit_id);e?.abgabetermine?.length&&this.$api.call(G.getSignaturStatusForProjektarbeitAbgaben(e.abgabetermine.map(t=>t.paabgabe_id),e.student_uid)).then(t=>{"success"===t.meta.status&&t.data.forEach(t=>{const a=e.abgabetermine.find(e=>e.paabgabe_id==t.paabgabe_id);a&&void 0!==t.signatur&&(a.signatur=t.signatur)})});const a=null!==e.note;e.abgabetermine.forEach(t=>{"object"!=typeof t.note&&(t.note=this.allowedNotenOptions.find(e=>e.note==t.note)),!t.noteBackend&&t.note&&(t.noteBackend=t.note),t.file=[],t.allowedToSave=!a,t.allowedToDelete=!a&&!t.abgabedatum});const i=e.vorname??e.student_vorname,n=e.nachname??e.student_nachname;e.student=`${i} ${n}`,this.selectedProjektarbeit=e,this.$refs.modalContainerAbgabeDetail.show()},openTimeline(t){const e=this.projektarbeiten.find(e=>e.projektarbeit_id==t.projektarbeit_id);e?(e.abgabetermine.forEach(t=>{const e=this.abgabeTypeOptions.find(e=>e.paabgabetyp_kurzbz==t.paabgabetyp_kurzbz);t.benotbar=e.benotbar}),this.timelineProjekt=e,this.$refs.drawer.show()):this.$fhcAlert.alertInfo("Keine projektarbeit gefunden")},centeredTextFormatter(t){const e=t.getValue();if(e)return'

    '+e+"

    "},detailFormatter:t=>'
    ',mailFormatter:t=>'
    ',timelineFormatter:()=>'
    ',beurteilungFormatter:t=>t.getValue()?'
    ':"-",pkzTextFormatter:t=>'",abgabterminFormatter(t){const e=t.getValue();if(e){let t="";switch(e.dateStyle){case"verspaetet":t='';break;case"verpasst":t='';break;case"abzugeben":t='';break;case"standard":t='';break;case"abgegeben":t='';break;case"beurteilungerforderlich":t='';break;case"bestanden":t='';break;case"nichtbestanden":t=''}const a=e.bezeichnung?.bezeichnung??e.bezeichnung;return'
    '+t+'

    '+a+" - "+this.formatDate(e.datum)+"

    "}return""},tableResolve(t){this.tableBuiltResolve=t},buildMailToLink(t){return"mailto:"+t.student_uid+"@"+this.domain},buildPKZ:t=>`${t.student_uid} / ${t.matrikelnr}`,buildStg:t=>(t.typ+t.kurzbz)?.toUpperCase(),buildErstbetreuer:t=>t.erstbetreuer_full_name?t.erstbetreuer_full_name:t.betreuer_vorname+" "+t.betreuer_nachname,buildZweitbetreuer:t=>t.zweitbetreuer_full_name??"",async setupData(t){this.projektarbeiten=t[0],this.domain=t[1],this.tableData=this.mapProjekteToTableData(this.projektarbeiten),await this.tableBuiltPromise,this.$refs.abgabeTable.tabulator.setData(this.tableData)},loadProjektarbeiten(t=!1,e){this.loading=!0,this.$api.call(G.getProjektarbeitenForStudiengang(this.selectedStudiengangOption.studiengang_kz,this.notenOptionFilter?.benotet??0)).then(t=>{t?.data&&this.setupData(t.data)}).finally(()=>{e&&e()}).finally(()=>{this.loading=!1})},loadAbgaben(t){return new Promise(e=>{this.$api.call(G.getStudentProjektabgaben(t)).then(t=>{e(t)})})},handleUuidDefined(t){this.tabulatorUuid=t},calcMaxTableHeight(){const t=this.tabulatorUuid?"-"+this.tabulatorUuid:"",e=document.getElementById("filterTableDataset"+t);if(!e)return;const a=e.getBoundingClientRect();this.abgabeTableOptions.height=window.visualViewport.height-a.top-80,this.$refs.abgabeTable.tabulator.setHeight(this.abgabeTableOptions.height)},async setupMounted(){this.tableBuiltPromise=new Promise(this.tableResolve),await this.tableBuiltPromise,await this.allConfigPromise,this.calcMaxTableHeight()},getOptionDisabled:t=>!t.aktiv},computed:{emailItems(){const t=[];return this.ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT&&t.push({label:this.$p.t("abgabetool/c4sendEmailStudierendev2",[this.uniqueStudentEmailCount]),command:this.sammelMailStudent}),this.ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER&&t.push({label:this.$p.t("abgabetool/c4sendEmailBetreuerv3",[this.uniqueBetreuerEmailCount]),command:this.sammelMailBetreuer}),t},uniqueBetreuerEmailCount(){const t=new Set;return this.selectedData.forEach(e=>{e.betreuer_mail&&t.add(e.betreuer_mail),e.zweitbetreuer_mail&&t.add(e.zweitbetreuer_mail)}),t.size},uniqueStudentEmailCount(){const t=new Set;return this.selectedData.forEach(e=>{e.student_uid&&t.add(e.student_uid)}),t.size}},watch:{"serienTermin.bezeichnung"(t){"qualgate1"!==t?.paabgabetyp_kurzbz&&"qualgate2"!==t?.paabgabetyp_kurzbz||(this.serienTermin.kurzbz=t.bezeichnung),this.serienTermin.upload_allowed=t.upload_allowed_default},selectedStudiengangOption(t,e){null!==this.notenOptionFilter&&null!==this.selectedStudiengangOption&&this.loadProjektarbeiten()},notenOptionFilter(t){null!==this.notenOptionFilter&&null!==this.selectedStudiengangOption&&this.loadProjektarbeiten()},selectedData(t){const e=this.$refs.abgabeTable?.tabulator;if(!e)return;const a=e.getRows();t.forEach(t=>{const e=a.find(e=>{if(e.getData().projektarbeit_id==t.projektarbeit_id)return e});e.select();const i=e.getElement().children[0]?.children[0]?.children[0];i&&(i.checked=!0)})}},created(){this.loading=!0,this.phrasenPromise=this.$p.loadCategory(["abgabetool","global"]),this.phrasenPromise.then(()=>{this.phrasenResolved=!0});const t=[this.$api.call(G.getConfig()),this.$api.call(G.getStudiengaenge()),this.$api.call(ht.getAllStudiensemesterAndAktOrNext()),this.$api.call(G.getNoten()),this.$api.call(G.getPaAbgabetypen())];this.allConfigPromise=Promise.allSettled(t).then(t=>{if("fulfilled"===t[0].status){const e=t[0].value;this.turnitin_link=e.data?.turnitin_link,this.old_abgabe_beurteilung_link=e.data?.old_abgabe_beurteilung_link,this.ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT=e.data?.ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT,this.ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER=e.data?.ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER}if("fulfilled"===t[1].status){const e=t[1].value;this.studiengaengeOptions=e.data,this.studiengaengeOptions?.length&&(this.selectedStudiengangOption=this.stg_kz_prop?e.data.find(t=>t.studiengang_kz==this.stg_kz_prop):e.data[0])}if("fulfilled"===t[2].status){const e=t[2].value;this.allSem=e.data[0];const a={studiensemester_kurzbz:this.$p.t("abgabetool/c4all")};this.curSem=a,this.studiensemesterOptions=[a,...this.allSem]}if("fulfilled"===t[3].status){const e=t[3].value;"success"===e.meta?.status&&(this.notenOptions=e.data[0],this.allowedNotenOptions=this.notenOptions.filter(t=>e.data[1].includes(t.note)),this.notenOptionsNonFinal=this.notenOptions.filter(t=>e.data[2].includes(t.note))),this.allowedNotenFilterOptions=[{bezeichnung:Vue.computed(()=>this.$p.t("abgabetool/keineNoteEingetragen")),benotet:0},{bezeichnung:Vue.computed(()=>this.$p.t("abgabetool/c4benotet")),benotet:1},{bezeichnung:Vue.computed(()=>this.$p.t("abgabetool/showAll")),benotet:-1}],this.notenOptionFilter=this.allowedNotenFilterOptions[0]}if("fulfilled"===t[4].status){const e=t[4].value;this.abgabeTypeOptions=e.data}}).finally(()=>{this.loading=!1})},mounted(){this.setupMounted()},template:'\n\t\n '},ft={name:"DeadlineOverview",components:{CoreFilterCmpt:lt},props:{person_uid_prop:{default:null},viewData:{type:Object,required:!0,default:()=>({name:"",uid:""}),validator:t=>t&&t.name&&t.uid}},data(){return{fullName:null,deadlines:null,tabulatorUuid:Vue.ref(0),tableBuiltResolve:null,tableBuiltPromise:null,phrasenPromise:null,phrasenResolved:!1,deadlineTableOptions:{height:700,index:"projektarbeit_id",layout:"fitColumns",placeholder:Vue.computed(()=>this.$p.t("global/noDataAvailable")),columns:[{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4zieldatumv2"))),field:"datum",formatter:this.centeredTextFormatter,widthGrow:1,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4fixterminv4"))),field:"fixterminstring",formatter:this.centeredTextFormatter,widthGrow:1,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4abgabetyp"))),field:"typ_bezeichnung",formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4abgabekurzbzv2"))),field:"kurzbz",formatter:this.centeredTextFormatter,widthGrow:3},{title:Vue.computed(()=>this.$capitalize(this.$p.t("person/studentIn"))),field:"student",formatter:this.centeredTextFormatter,widthGrow:2},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4stg"))),field:"stg",formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4sem"))),field:"semester",formatter:this.centeredTextFormatter,widthGrow:1}],persistence:!1},deadlineTableEventHandlers:[{event:"tableBuilt",handler:async()=>{this.tableBuiltResolve()}},{event:"cellClick",handler:async(t,e)=>{if("details"===e.getColumn().getField()){const t=e.getValue();if("detailTermine"===t.mode)this.setDetailComponent(e.getValue());else if("beurteilungDownload"===t.mode){const e=FHC_JS_DATA_STORAGE_OBJECT.app_root+"cis/private/pdfExport.php?xml=projektarbeitsbeurteilung.xml.php&xsl=Projektbeurteilung&betreuerart_kurzbz="+t.betreuerart_kurzbz+"&projektarbeit_id="+t.projektarbeit_id+"&person_id="+t.betreuer_person_id;window.open(e,"_blank")}}else if("beurteilung"===e.getColumn().getField()){const t=e.getValue();"-"!=t&&window.open(t,"_blank")}t.stopPropagation()}}]}},methods:{centeredTextFormatter:t=>'

    '+t.getValue()+"

    ",tableResolve(t){this.tableBuiltResolve=t},loadDeadlines(){this.$api.call(G.fetchDeadlines(this.person_uid_prop??null)).then(t=>{t?.data&&this.setupData(t.data)})},setupData(t){this.deadlines=t,this.deadlines.forEach(t=>{t.student=(t.stud_titelpre?t.stud_titelpre+" ":"")+t.stud_vorname+" "+t.stud_nachname+(t.stud_titelpost?" "+t.stud_titelpost:""),t.fixterminstring=t.fixtermin?this.$p.t("abgabetool/c4yes"):this.$p.t("abgabetool/c4no")}),this.$refs.deadlineTable.tabulator.setColumns(this.deadlineTableOptions.columns),this.$refs.deadlineTable.tabulator.setData(this.deadlines)},handleUuidDefined(t){this.tabulatorUuid=t},calcMaxTableHeight(){const t=this.tabulatorUuid?"-"+this.tabulatorUuid:"",e=document.getElementById("filterTableDataset"+t);if(!e)return;const a=e.getBoundingClientRect();this.deadlineTableOptions.height=window.visualViewport.height-a.top-30,this.$refs.deadlineTable.tabulator.setHeight(this.deadlineTableOptions.height)},async setupMounted(){this.tableBuiltPromise=new Promise(this.tableResolve),await this.tableBuiltPromise,this.loadDeadlines(),this.calcMaxTableHeight()}},watch:{},computed:{},created(){this.phrasenPromise=this.$p.loadCategory(["abgabetool","global"]),this.phrasenPromise.then(()=>{this.phrasenResolved=!0})},mounted(){this.setupMounted()},template:'\n\t\t

    {{$p.t(\'abgabetool/deadlinesTitle\')}} {{ fullName ? (\'-\' + fullName) : \'\'}}

    \n\t\t
    \n\t\t\t\n\t\t \n '};const mt=Vue.createApp({name:"AbgabetoolApp",components:{AbgabetoolStudent:Y,AbgabetoolMitarbeiter:ut,AbgabetoolAssistenz:gt,DeadlineOverview:ft},data:function(){return{comp:null,uid:null,student_uid:null,stg_kz:null}},methods:{},computed:{viewData(){return{uid:this.uid}},student_uid_computed(){return this.student_uid??this.uid},stg_kz_computed(){return this.stg_kz??null}},created(){},mounted(){const t=document.getElementById("abgabetoolroot"),e=t.getAttribute("route");this.comp=e;const a=t.getAttribute("uid");this.uid=a;const i=t.getAttribute("stg_kz_prop");this.stg_kz=i;const n=t.getAttribute("student_uid_prop");this.student_uid=n},template:'\n\t\t\n\t'});mt.config.globalProperties.$capitalize=function(t){return t?t[0].toUpperCase()+t.slice(1):""},mt.use(primevue.config.default,{zIndex:{overlay:9e3,tooltip:8e3}}),mt.directive("tooltip",primevue.tooltip),mt.use(N),mt.mount("#abgabetoolroot"); //# sourceMappingURL=Abgabetool.js.map diff --git a/public/dist/js/apps/Abgabetool/Abgabetool.js.map b/public/dist/js/apps/Abgabetool/Abgabetool.js.map index ec37b4974..ed7cecd77 100644 --- a/public/dist/js/apps/Abgabetool/Abgabetool.js.map +++ b/public/dist/js/apps/Abgabetool/Abgabetool.js.map @@ -1 +1 @@ -{"version":3,"file":"Abgabetool.js","sources":["../../../../js/api/search.js","../../../../js/api/phrasen.js","../../../../js/api/navigation.js","../../../../js/api/filter.js","../../../../js/api/studstatus.js","../../../../js/api/profil.js","../../../../js/api/profilUpdate.js","../../../../js/api/lvPlan.js","../../../../js/api/stv.js","../../../../js/api/stv/verband.js","../../../../js/api/stv/students.js","../../../../js/api/stv/filter.js","../../../../js/api/stv/konto.js","../../../../js/api/stv/group.js","../../../../js/api/stv/kontakt.js","../../../../js/api/stv/prestudent.js","../../../../js/api/stv/status.js","../../../../js/api/stv/details.js","../../../../js/api/stv/exam.js","../../../../js/api/stv/abschlusspruefung.js","../../../../js/api/stv/grades.js","../../../../js/api/stv/mobility.js","../../../../js/api/stv/archiv.js","../../../../js/api/stv/documents.js","../../../../js/api/stv/exemptions.js","../../../../js/api/stv/jointstudies.js","../../../../js/api/stv/courselist.js","../../../../js/api/notiz.js","../../../../js/api/notiz/person.js","../../../../js/api/betriebsmittel.js","../../../../js/api/betriebsmittel/person.js","../../../../js/api/checkperson.js","../../../../js/api/ort.js","../../../../js/api/cms.js","../../../../js/api/lehre.js","../../../../js/api/addons.js","../../../../js/api/messages.js","../../../../js/api/messages/person.js","../../../../js/api/vorlagen.js","../../../../js/api/studium.js","../../../../js/api/fhcapifactory.js","../../../../js/api/dashboard.js","../../../../js/api/bookmark.js","../../../../js/api/ampeln.js","../../../../js/api/studiengang.js","../../../../js/api/menu.js","../../../../js/api/authinfo.js","../../../../js/api/language.js","../../../../js/plugin/OldFhcApi.js","../../../../js/RESTClient.js","../../../../js/plugins/FhcAlert.js","../../../../js/plugins/Api.js","../../../../js/api/factory/phrasen.js","../../../../js/plugins/Phrasen.js","../../../../js/components/Form/Upload/Dms.js","../../../../js/components/Form/Upload/Dms/Item.js","../../../../js/components/Bootstrap/Modal.js","../../../../js/api/factory/abgabe.js","../../../../js/components/Overlay/FhcOverlay.js","../../../../js/components/Cis/Abgabetool/AbgabeStudentDetail.js","../../../../js/components/Cis/Abgabetool/AbgabetoolStudent.js","../../../../js/components/Fetch.js","../../../../js/components/filter/Filter/Config.js","../../../../js/components/filter/Filter/Columns.js","../../../../js/components/filter/Table/Download.js","../../../../js/directives/collapseAutoClose.js","../../../../js/tabulator/layouts/fitDataStretchFrozen.js","../../../../js/api/factory/filter.js","../../../../js/components/filter/Filter.js","../../../../js/components/Cis/Abgabetool/AbgabeMitarbeiterDetail.js","../../../../js/components/Cis/Abgabetool/AbgabetoolMitarbeiter.js","../../../../js/components/Bootstrap/Offcanvas.js","../../../../js/api/factory/studiensemester.js","../../../../js/components/Cis/Abgabetool/StatusLegende.js","../../../../js/helpers/EmailHelpers.js","../../../../js/components/Cis/Abgabetool/AbgabetoolAssistenz.js","../../../../js/components/Cis/Abgabetool/DeadlineOverview.js","../../../../js/apps/Abgabetool/Abgabetool.js","../../../../js/helpers/StringHelpers.js"],"sourcesContent":["/**\n * Copyright (C) 2024 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tsearch(searchsettings, config) {\n\t\tconst url = '/api/frontend/v1/searchbar/search';\n\t\treturn this.$fhcApi.post(url, searchsettings, config);\n\t},\n\tsearchAdvanced(searchsettings, config) {\n\t\tconst url = '/api/frontend/v1/searchbar/searchAdvanced';\n\t\treturn this.$fhcApi.post(url, searchsettings, config);\n\t},\n\tsearchdummy(searchsettings) {\n\t\tconst url = 'public/js/apps/api/dummyapi.php/Search';\n\t\treturn this.$fhcApi.post(url, searchsettings);\n\t}\n};\n","/**\n * Copyright (C) 2024 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tloadCategory(category) {\n\t\treturn this.$fhcApi.get('/api/frontend/v1/phrasen/loadModule/' + category);\n\t},\n\tsetLanguage(categories,language) {\n\t\tconst payload = {categories, language}\n\t\treturn this.$fhcApi.post('/api/frontend/v1/phrasen/setLanguage', payload);\n\t},\n\tgetLanguage() {\n\t\treturn this.$fhcApi.get('/api/frontend/v1/phrasen/getLanguage', {});\n\t},\n\tgetActiveDbLanguages() {\n\t\treturn this.$fhcApi.get('/api/frontend/v1/phrasen/getAllLanguages', {});\n\t}\n};","/**\n * Copyright (C) 2024 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tgetHeader(navigation_page) {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/api/frontend/v1/navigation/header',\n\t\t\t{ navigation_page }\n\t\t);\n\t},\n\tgetMenu: function(navigation_page) {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/api/frontend/v1/navigation/menu',\n\t\t\t{ navigation_page }\n\t\t);\n\t}\n};\n\n","/**\n * Copyright (C) 2024 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tsaveCustomFilter(wsParams) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'/api/frontend/v1/filter/saveCustomFilter',\n\t\t\t{\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tcustomFilterName: wsParams.customFilterName\n\t\t\t}\n\t\t);\n\t},\n\tremoveCustomFilter(wsParams) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'/api/frontend/v1/filter/removeCustomFilter',\n\t\t\t{\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterId: wsParams.filterId\n\t\t\t}\n\t\t);\n\t},\n\tapplyFilterFields(wsParams) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'/api/frontend/v1/filter/applyFilterFields',\n\t\t\t{\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterFields: wsParams.filterFields\n\t\t\t}\n\t\t);\n\t},\n\taddFilterField(wsParams) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'/api/frontend/v1/filter/addFilterField',\n\t\t\t{\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterField: wsParams.filterField\n\t\t\t}\n\t\t);\n\t},\n\tremoveFilterField(wsParams) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'/api/frontend/v1/filter/removeFilterField',\n\t\t\t{\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterField: wsParams.filterField\n\t\t\t}\n\t\t);\n\t},\n\tgetFilterById(wsParams) {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/api/frontend/v1/filter/getFilter',\n\t\t\t{\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterId: wsParams.filterId\n\t\t\t}\n\t\t);\n\t},\n\tgetFilter(wsParams) {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/api/frontend/v1/filter/getFilter',\n\t\t\t{\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType\n\t\t\t}\n\t\t);\n\t}\n};\n\n","/**\n * Copyright (C) 2024 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tabmeldung: {\n\t\tgetDetails(antrag_id, prestudent_id) {\n\t\t\tconst url = '/api/frontend/v1/studstatus/abmeldung/'\n\t\t\t\t+ (antrag_id !== undefined ? 'getDetailsForAntrag/' + antrag_id : 'getDetailsForNewAntrag/' + prestudent_id);\n\t\t\treturn this.$fhcApi.get(url);\n\t\t},\n\t\tcreate(stdsem, prestudent_id, grund) {\n\t\t\treturn this.$fhcApi.post('/api/frontend/v1/studstatus/abmeldung/createAntrag', {\n\t\t\t\tstudiensemester: stdsem,\n\t\t\t\tprestudent_id,\n\t\t\t\tgrund\n\t\t\t}, {\n\t\t\t\terrorHandling: 'strict'\n\t\t\t});\n\t\t},\n\t\tcancel(antrag_id) {\n\t\t\tif (!Array.isArray(antrag_id))\n\t\t\t\treturn this.$fhcApi.post(\n\t\t\t\t\t'/api/frontend/v1/studstatus/abmeldung/cancelAntrag',\n\t\t\t\t\t{ antrag_id }\n\t\t\t\t);\n\t\t\treturn Promise.allSettled(antrag_id.map(antrag => this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/abmeldung/cancelAntrag',\n\t\t\t\t{ antrag_id: antrag.studierendenantrag_id },\n\t\t\t\t{ errorHeader: '#' + antrag.studierendenantrag_id }\n\t\t\t)));\n\t\t}\n\t},\n\tunterbrechung: {\n\t\tgetDetails(antrag_id, prestudent_id) {\n\t\t\tconst url = '/api/frontend/v1/studstatus/unterbrechung/'\n\t\t\t\t+ (antrag_id !== undefined ? 'getDetailsForAntrag/' + antrag_id : 'getDetailsForNewAntrag/' + prestudent_id);\n\t\t\treturn this.$fhcApi.get(url);\n\t\t},\n\t\tcreate(studiensemester, prestudent_id, grund, datum_wiedereinstieg, attachment) {\n\t\t\treturn this.$fhcApi.post('/api/frontend/v1/studstatus/unterbrechung/createAntrag', {\n\t\t\t\tstudiensemester,\n\t\t\t\tprestudent_id,\n\t\t\t\tgrund,\n\t\t\t\tdatum_wiedereinstieg,\n\t\t\t\tattachment\n\t\t\t}, {\n\t\t\t\terrorHandling: 'strict'\n\t\t\t});\n\t\t},\n\t\tcancel(antrag_id) {\n\t\t\treturn this.$fhcApi.post('/api/frontend/v1/studstatus/unterbrechung/cancelAntrag', {\n\t\t\t\tantrag_id\n\t\t\t}, {\n\t\t\t\terrorHandling: 'strict'\n\t\t\t});\n\t\t}\n\t},\n\twiederholung: {\n\t\tgetDetails(prestudent_id) {\n\t\t\tconst url = '/api/frontend/v1/studstatus/wiederholung/getDetailsForNewAntrag/' + prestudent_id;\n\t\t\treturn this.$fhcApi.get(url)\n\t\t},\n\t\tgetLvs(antrag_id) {\n\t\t\tconst url = '/api/frontend/v1/studstatus/wiederholung/getLvs/' + antrag_id;\n\t\t\treturn this.$fhcApi.get(url)\n\t\t},\n\t\tcreate(prestudent_id, studiensemester) {\n\t\t\treturn this.$fhcApi.post('/api/frontend/v1/studstatus/wiederholung/createAntrag', {\n\t\t\t\tprestudent_id,\n\t\t\t\tstudiensemester\n\t\t\t}, {\n\t\t\t\terrorHandling: 'strict'\n\t\t\t});\n\t\t},\n\t\tcancel(prestudent_id, studiensemester) {\n\t\t\treturn this.$fhcApi.post('/api/frontend/v1/studstatus/wiederholung/cancelAntrag', {\n\t\t\t\tprestudent_id,\n\t\t\t\tstudiensemester\n\t\t\t}, {\n\t\t\t\terrorHandling: 'strict'\n\t\t\t});\n\t\t},\n\t\tsaveLvs(forbiddenLvs, mandatoryLvs) {\n\t\t\treturn this.$fhcApi.post('/api/frontend/v1/studstatus/wiederholung/saveLvs', {\n\t\t\t\tforbiddenLvs,\n\t\t\t\tmandatoryLvs\n\t\t\t});\n\t\t}\n\t},\n\tleitung: {\n\t\tgetStgs() {\n\t\t\treturn this.$fhcApi.get('/api/frontend/v1/studstatus/leitung/getActiveStgs');\n\t\t},\n\t\tgetAntraege(url, config, params) {\n\t\t\treturn this.$fhcApi\n\t\t\t\t.get('/api/frontend/v1/studstatus/leitung/getAntraege/' + url)\n\t\t\t\t.then(res => res.data); // Return data for tabulator\n\t\t},\n\t\tgetHistory(antrag_id) {\n\t\t\treturn this.$fhcApi.get('/api/frontend/v1/studstatus/leitung/getHistory/' + antrag_id)\n\t\t},\n\t\tgetPrestudents(query, signal) {\n\t\t\treturn this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/leitung/getPrestudents',\n\t\t\t\t{ query },\n\t\t\t\t{\n signal: signal,\n timeout: 30000\n }\n\t\t\t);\n\t\t},\n\t\tapprove(antrag) {\n\t\t\tif (!Array.isArray(antrag))\n\t\t\t\treturn this.$fhcApi.post(\n\t\t\t\t\t'/api/frontend/v1/studstatus/leitung/approveAntrag',\n\t\t\t\t\tantrag\n\t\t\t\t);\n\t\t\treturn Promise.allSettled(antrag.map(a => this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/leitung/approveAntrag',\n\t\t\t\ta,\n\t\t\t\t{ errorHeader: '#' + a.studierendenantrag_id }\n\t\t\t)));\n\t\t},\n\t\treject(antrag) {\n\t\t\tif (!Array.isArray(antrag))\n\t\t\t\treturn this.$fhcApi.post(\n\t\t\t\t\t'/api/frontend/v1/studstatus/leitung/rejectAntrag',\n\t\t\t\t\tantrag\n\t\t\t\t);\n\t\t\treturn Promise.allSettled(antrag.map(a => this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/leitung/rejectAntrag',\n\t\t\t\ta,\n\t\t\t\t{ errorHeader: '#' + a.studierendenantrag_id }\n\t\t\t)));\n\t\t},\n\t\treopen(antrag) {\n\t\t\tif (!Array.isArray(antrag))\n\t\t\t\treturn this.$fhcApi.post(\n\t\t\t\t\t'/api/frontend/v1/studstatus/leitung/reopenAntrag',\n\t\t\t\t\tantrag\n\t\t\t\t);\n\t\t\treturn Promise.allSettled(antrag.map(a => this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/leitung/reopenAntrag',\n\t\t\t\ta,\n\t\t\t\t{ errorHeader: '#' + a.studierendenantrag_id }\n\t\t\t)));\n\t\t},\n\t\tpause(antrag) {\n\t\t\tif (!Array.isArray(antrag))\n\t\t\t\treturn this.$fhcApi.post(\n\t\t\t\t\t'/api/frontend/v1/studstatus/leitung/pauseAntrag',\n\t\t\t\t\tantrag\n\t\t\t\t);\n\t\t\treturn Promise.allSettled(antrag.map(a => this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/leitung/pauseAntrag',\n\t\t\t\ta,\n\t\t\t\t{ errorHeader: '#' + a.studierendenantrag_id }\n\t\t\t)));\n\t\t},\n\t\tunpause(antrag) {\n\t\t\tif (!Array.isArray(antrag))\n\t\t\t\treturn this.$fhcApi.post(\n\t\t\t\t\t'/api/frontend/v1/studstatus/leitung/unpauseAntrag',\n\t\t\t\t\tantrag\n\t\t\t\t);\n\t\t\treturn Promise.allSettled(antrag.map(a => this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/leitung/unpauseAntrag',\n\t\t\t\ta,\n\t\t\t\t{ errorHeader: '#' + a.studierendenantrag_id }\n\t\t\t)));\n\t\t},\n\t\tobject(antrag) {\n\t\t\tif (!Array.isArray(antrag))\n\t\t\t\treturn this.$fhcApi.post(\n\t\t\t\t\t'/api/frontend/v1/studstatus/leitung/objectAntrag',\n\t\t\t\t\tantrag\n\t\t\t\t);\n\t\t\treturn Promise.allSettled(antrag.map(a => this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/leitung/objectAntrag',\n\t\t\t\ta,\n\t\t\t\t{ errorHeader: '#' + a.studierendenantrag_id }\n\t\t\t)));\n\t\t},\n\t\tapproveObjection(antrag) {\n\t\t\tif (!Array.isArray(antrag))\n\t\t\t\treturn this.$fhcApi.post(\n\t\t\t\t\t'/api/frontend/v1/studstatus/leitung/approveObjection',\n\t\t\t\t\tantrag\n\t\t\t\t);\n\t\t\treturn Promise.allSettled(antrag.map(a => this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/leitung/approveObjection',\n\t\t\t\ta,\n\t\t\t\t{ errorHeader: '#' + a.studierendenantrag_id }\n\t\t\t)));\n\t\t},\n\t\tdenyObjection(antrag) {\n\t\t\tif (!Array.isArray(antrag))\n\t\t\t\treturn this.$fhcApi.post(\n\t\t\t\t\t'/api/frontend/v1/studstatus/leitung/denyObjection',\n\t\t\t\t\tantrag\n\t\t\t\t);\n\t\t\treturn Promise.allSettled(antrag.map(a => this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/leitung/denyObjection',\n\t\t\t\ta,\n\t\t\t\t{ errorHeader: '#' + a.studierendenantrag_id }\n\t\t\t)));\n\t\t}\n\t}\n};","export default {\n\n getView: function (uid) {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root + \n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/Profil/getView/${uid}`,{}\n );\n },\n\n fotoSperre: function (value) {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root + \n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/Profil/fotoSperre/${value}`,\n {}\n );\n \n },\n\n isStudent: function (uid) {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root + \n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/Profil/isStudent`,\n {\n uid:uid,\n }\n );\n },\n\n isMitarbeiter: function (uid) {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root + \n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/Profil/isMitarbeiter/${uid}`,\n {}\n );\n },\n\n getZustellAdresse: function () {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root + \n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/Profil/getZustellAdresse`,{}\n );\n },\n\n getZustellKontakt: function () {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root + \n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/Profil/getZustellKontakt`,{}\n );\n },\n\n getGemeinden: function(nation,zip){\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root + \n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/Profil/getGemeinden/${nation}/${zip}`,\n {}\n );\n \n },\n getAllNationen:function(){\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root + \n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n \"/api/frontend/v1/Profil/getAllNationen\",{}\n );\n },\n}","export default {\n //! API calls for profil update requests\n \n getStatus: function () {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/ProfilUpdate/getStatus`,{});\n },\n \n getTopic: function () {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/ProfilUpdate/getTopic`,{});\n },\n \n acceptProfilRequest: function ({profil_update_id, uid, status_message, topic, requested_change}) {\n\n return this.$fhcApi.post(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n \"/api/frontend/v1/ProfilUpdate/acceptProfilRequest\",{profil_update_id, uid, status_message, topic, requested_change});\n },\n \n denyProfilRequest: function ({profil_update_id, uid, topic, status_message}) {\n return this.$fhcApi.post(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n \"/api/frontend/v1/ProfilUpdate/denyProfilRequest\",{profil_update_id,uid,topic,status_message});\n },\n \n insertFile: function (dms, replace = null) {\n\n return this.$fhcApi.post(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/ProfilUpdate/insertFile/${replace}`,\n dms);\n\n },\n \n getProfilRequestFiles: function (requestID) {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/ProfilUpdate/getProfilRequestFiles/${requestID}`,{});\n },\n \n selectProfilRequest: function (uid = null, id = null) {\n\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/ProfilUpdate/selectProfilRequest`,\n {...(uid?{uid}:{}),\n ...(id?{id}:{})\n });\n },\n \n insertProfilRequest: function (topic, payload, fileID = null) {\n\n return this.$fhcApi.post(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n \"/api/frontend/v1/ProfilUpdate/insertProfilRequest\",\n {\n topic,\n payload,\n ...(fileID ? { fileID } : {}),\n });\n },\n \n updateProfilRequest: function (topic, payload, ID, fileID = null) {\n\n return this.$fhcApi.post(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/ProfilUpdate/updateProfilRequest`,\n {\n topic,\n payload,\n ID,\n ...(fileID ? { fileID: fileID } : {}),\n });\n },\n \n deleteProfilRequest: function (requestID) {\n\n return this.$fhcApi.post(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/ProfilUpdate/deleteProfilRequest`,\n {\n requestID,\n });\n },\n };\n ","\nexport default {\n\tgetRoomInfo(ort_kurzbz, start_date, end_date) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'/api/frontend/v1/LvPlan/getRoomplan',\n\t\t\t{ ort_kurzbz, start_date, end_date}\n\t\t);\n\t},\n\tgetStunden() {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/api/frontend/v1/LvPlan/Stunden',\n\t\t\t{}\n\t\t);\n\t},\n\tgetOrtReservierungen(ort_kurzbz, start_date, end_date) {\n\t\treturn this.$fhcApi.post(\n\t\t\t`/api/frontend/v1/LvPlan/getReservierungen/${ort_kurzbz}`,\n\t\t\t{ start_date, end_date}\n\t\t);\n\t},\n\tgetLvPlanReservierungen(start_date, end_date) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'/api/frontend/v1/LvPlan/getReservierungen',\n\t\t\t{ start_date, end_date }\n\t\t);\n\t},\n\tgetLehreinheitStudiensemester(lehreinheit_id) {\n\t\treturn this.$fhcApi.get(\n\t\t\t`/api/frontend/v1/LvPlan/getLehreinheitStudiensemester/${lehreinheit_id}`,\n\t\t\t{}\n\t\t);\n\t},\n\tstudiensemesterDateInterval(date) {\n\t\treturn this.$fhcApi.get(\n\t\t\t`/api/frontend/v1/LvPlan/studiensemesterDateInterval/${date}`,\n\t\t\t{}\n\t\t);\n\t},\n\tLvPlanEvents(start_date, end_date, lv_id) {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/api/frontend/v1/LvPlan/LvPlanEvents',\n\t\t\t{ start_date, end_date, lv_id }\n\t\t);\n\t},\n\t\n\t\n};","import verband from './stv/verband.js';\nimport students from './stv/students.js';\nimport filter from './stv/filter.js';\nimport konto from './stv/konto.js';\nimport group from './stv/group.js';\nimport kontakt from './stv/kontakt.js';\nimport prestudent from './stv/prestudent.js';\nimport status from './stv/status.js';\nimport details from './stv/details.js';\nimport exam from './stv/exam.js';\nimport abschlusspruefung from './stv/abschlusspruefung.js';\nimport grades from './stv/grades.js';\nimport mobility from './stv/mobility.js';\nimport archiv from './stv/archiv.js';\nimport documents from './stv/documents.js';\nimport exemptions from './stv/exemptions.js';\nimport jointstudies from \"./stv/jointstudies.js\";\nimport courselist from './stv/courselist.js';\n\nexport default {\n\tverband,\n\tstudents,\n\tfilter,\n\tkonto,\n\tgroup,\n\tkontakt,\n\tprestudent,\n\tstatus,\n\tdetails,\n\texam,\n\tabschlusspruefung,\n\tgrades,\n\tmobility,\n\tarchiv,\n\tdocuments,\n\texemptions,\n\tjointstudies,\n\tcourselist,\n\tconfigStudent() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/config/student');\n\t},\n\tconfigStudents() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/config/students');\n\t}\n};\n","export default {\n\tget() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/verband');\n\t},\n\tfavorites: {\n\t\tget() {\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/stv/favorites');\n\t\t},\n\t\tset(favorites) {\n\t\t\treturn this.$fhcApi.post('api/frontend/v1/stv/favorites/set', {\n\t\t\t\tfavorites\n\t\t\t});\n\t\t}\n\t}\n}","export default {\n\tuid(uid, studiensemester_kurzbz) {\n\t\tlet url = 'api/frontend/v1/stv/students/'\n\t\t\t+ encodeURIComponent(studiensemester_kurzbz)\n\t\t\t+ '/uid/'\n\t\t\t+ encodeURIComponent(uid);\n\t\treturn this.$fhcApi.getUri(url);\n\t},\n\tprestudent(prestudent_id, studiensemester_kurzbz) {\n\t\tlet url = 'api/frontend/v1/stv/students/'\n\t\t\t+ encodeURIComponent(studiensemester_kurzbz)\n\t\t\t+ '/prestudent/'\n\t\t\t+ encodeURIComponent(prestudent_id);\n\t\treturn this.$fhcApi.getUri(url);\n\t},\n\tperson(person_id, studiensemester_kurzbz) {\n\t\tlet url = 'api/frontend/v1/stv/students/'\n\t\t\t+ encodeURIComponent(studiensemester_kurzbz)\n\t\t\t+ '/person/'\n\t\t\t+ encodeURIComponent(person_id);\n\t\treturn this.$fhcApi.getUri(url);\n\t},\n\tverband(relative_path) {\n\t\treturn this.$fhcApi.getUri('api/frontend/v1/stv/students/' + relative_path);\n\t}\n}","export default {\n\tgetStg() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/filter/getStg');\n\t},\n\tsetStg(studiengang_kz) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/filter/setStg', {\n\t\t\tstudiengang_kz\n\t\t});\n\t}\n};","export default {\n\ttabulatorConfig(config, self) {\n\t\tconfig.ajaxURL = 'api/frontend/v1/stv/konto/get';\n\t\tconfig.ajaxParams = () => {\n\t\t\tconst params = {\n\t\t\t\tperson_id: self.modelValue.person_id || self.modelValue.map(e => e.person_id),\n\t\t\t\tonly_open: self.filter,\n\t\t\t\tstudiengang_kz: self.studiengang_kz_intern ? self.stg_kz : ''\n\t\t\t};\n\t\t\treturn params;\n\t\t};\n\t\tconfig.ajaxRequestFunc = (url, config, params) => this.$fhcApi.post(url, params, config);\n\t\tconfig.ajaxResponse = (url, params, response) => response.data;\n\n\t\treturn config;\n\t},\n\tcheckDoubles(form, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/konto/checkDoubles', data, {\n\t\t\tconfirmErrorHandler: error => true\n\t\t});\n\t},\n\tinsert(form, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/konto/insert', data);\n\t},\n\tcounter(data) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/konto/counter', data);\n\t},\n\tedit(form, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/konto/update', data);\n\t},\n\tdelete(buchungsnr) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/konto/delete', {buchungsnr});\n\t},\n\tgetBuchungstypen() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/konto/getBuchungstypen');\n\t}\n};","export default {\n\tgetGruppen(url, config, params) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/Gruppen/getGruppen/' + params.id);\n\t},\n\tdeleteGroup(params) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/Gruppen/deleteGruppe/', params);\n\t}\n}","export default {\n\t//------------- address.js-----------\n\tgetAdressen (url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/kontakt/getAdressen/' + params.id);\n\t},\n\taddNewAddress(form, id, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/kontakt/addNewAddress/' + id,\n\t\t\tdata\n\t\t);\n\t},\n\tloadAddress(address_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/kontakt/loadAddress/', {address_id});\n\t},\n\tupdateAddress(form, address_id, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/kontakt/updateAddress/' + address_id,\n\t\t\tdata\n\t\t);\n\t},\n\tdeleteAddress(address_id) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/kontakt/deleteAddress/', {address_id});\n\t},\n\tgetPlaces(plz) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/address/getPlaces/' + plz);\n\t},\n\tgetFirmen(searchString) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/kontakt/getFirmen/' + searchString);\n\t},\n\tgetNations() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/address/getNations/');\n\t},\n\tgetAdressentypen() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/kontakt/getAdressentypen/');\n\t},\n\n\t//------------- bankverbindung.js-----------\n\tgetBankverbindung (url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/kontakt/getBankverbindung/' + params.id);\n\t},\n\taddNewBankverbindung(form, id, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/kontakt/addNewBankverbindung/' + id,\n\t\t\tdata\n\t\t);\n\t},\n\tloadBankverbindung(bankverbindung_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/kontakt/loadBankverbindung/', {bankverbindung_id});\n\t},\n\tupdateBankverbindung(form, bankverbindung_id, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/kontakt/updateBankverbindung/' + bankverbindung_id,\n\t\t\tdata\n\t\t);\n\t},\n\tdeleteBankverbindung(bankverbindung_id) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/kontakt/deleteBankverbindung/', {bankverbindung_id});\n\t},\n\n\t//------------- contact.js-----------\n\tgetKontakte (url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/kontakt/getKontakte/' + params.id);\n\t},\n\taddNewContact(form, id, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/kontakt/addNewContact/' + id,\n\t\t\tdata\n\t\t);\n\t},\n\tloadContact(kontakt_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/kontakt/loadContact/', {kontakt_id});\n\t},\n\tupdateContact(form, kontakt_id, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/kontakt/updateContact/' + kontakt_id,\n\t\t\tdata\n\t\t);\n\t},\n\tdeleteContact(kontakt_id) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/kontakt/deleteContact/', {kontakt_id});\n\t},\n\tgetStandorteByFirma(searchString){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/kontakt/getStandorteByFirma/' + searchString);\n\t},\n\tgetKontakttypen(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/kontakt/getKontakttypen/');\n\t}\n};","export default {\n\n//------------- Prestudent.js------------------------------------------------------\n\n\tget(prestudent_id, studiensemester_kurzbz) {\n\t\treturn \tthis.$fhcApi.post(\n\t\t\t'api/frontend/v1/stv/prestudent/get/'\n\t\t\t+ encodeURIComponent(prestudent_id)\n\t\t\t+ '/'\n\t\t\t+ encodeURIComponent(studiensemester_kurzbz)\n\t\t\t);\n\t},\n\tupdatePrestudent(form, prestudent_id, data){\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/prestudent/updatePrestudent/' + prestudent_id,\n\t\t\tdata\n\t\t);\n\t},\n\tgetBezeichnungZGV() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getBezeichnungZGV/');\n\t},\n\tgetBezeichnungMZgv() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getBezeichnungMZgv/');\n\t},\n\tgetBezeichnungDZgv() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getBezeichnungDZgv/');\n\t},\n\tgetStgs() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/lists/getStgs/');\n\t},\n\tgetAusbildung() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getAusbildung/');\n\t},\n\tgetAufmerksamdurch() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getAufmerksamdurch/');\n\t},\n\tgetBerufstaetigkeit() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getBerufstaetigkeit/');\n\t},\n\tgetTypenStg() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getTypenStg/');\n\t},\n\tgetBisstandort() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getBisstandort/');\n\t},\n\n//------------- MultiStatus.js------------------------------------------------------\n\tgetHistoryPrestudent (url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/status/getHistoryPrestudent/' + params.id);\n\t},\n\tgetMaxSem(studiengang_kzs) {\n\t\treturn \tthis.$fhcApi.post('api/frontend/v1/stv/status/getMaxSemester/', {studiengang_kzs});\n\t},\n\tadvanceStatus({prestudent_id, status_kurzbz, studiensemester_kurzbz, ausbildungssemester}) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/status/advanceStatus/'\n\t\t\t+ prestudent_id + '/'\n\t\t\t+ status_kurzbz + '/'\n\t\t\t+ studiensemester_kurzbz + '/'\n\t\t\t+ ausbildungssemester\n\t\t);\n\t},\n\tconfirmStatus({prestudent_id, status_kurzbz, studiensemester_kurzbz, ausbildungssemester}) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/status/confirmStatus/'\n\t\t\t+ prestudent_id + '/'\n\t\t\t+ status_kurzbz + '/'\n\t\t\t+ studiensemester_kurzbz + '/'\n\t\t\t+ ausbildungssemester\n\t\t);\n\t},\n\tisLastStatus(id) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/status/isLastStatus/' + id);\n\t},\n\tdeleteStatus({prestudent_id, status_kurzbz, studiensemester_kurzbz, ausbildungssemester}) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/status/deleteStatus/'\n\t\t\t+ prestudent_id + '/'\n\t\t\t+ status_kurzbz + '/'\n\t\t\t+ studiensemester_kurzbz + '/'\n\t\t\t+ ausbildungssemester\n\t\t);\n\t},\n\tgetLastBismeldestichtag() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/status/getLastBismeldestichtag/');\n\t},\n\n//------------- History.js------------------------------------------------------\n\tgetHistoryPrestudents (url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getHistoryPrestudents/' + params.id);\n\t},\n\n}","export default {\n\n//------------- Modal.js------------------------------------------------------\n\n\tinsertStatus(form, id, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/status/insertStatus/' + id,\n\t\t\tdata\n\t\t);\n\t},\n\tloadStatus({prestudent_id, status_kurzbz, studiensemester_kurzbz, ausbildungssemester}) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'api/frontend/v1/stv/status/loadStatus/'\n\t\t\t+ prestudent_id + '/'\n\t\t\t+ status_kurzbz + '/'\n\t\t\t+ studiensemester_kurzbz + '/'\n\t\t\t+ ausbildungssemester\n\t\t);\n\t},\n\tupdateStatus(form, {prestudent_id, status_kurzbz, studiensemester_kurzbz, ausbildungssemester}, data) {\n\t\treturn this.$fhcApi.post(\n\t\t\tform,\n\t\t\t'api/frontend/v1/stv/status/updateStatus/'\n\t\t\t+ prestudent_id + '/'\n\t\t\t+ status_kurzbz + '/'\n\t\t\t+ studiensemester_kurzbz + '/'\n\t\t\t+ ausbildungssemester,\n\t\t\tdata\n\t\t);\n\t},\n\tgetStudienplaene(prestudent_id) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getStudienplaene/' + prestudent_id);\n\t},\n\tgetStudiengang(prestudent_id) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getStudiengang/' + prestudent_id);\n\t},\n\tgetStatusgruende() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/status/getStatusgruende/');\n\t},\n\tgetStati() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/lists/getStati/');\n\t},\n\n//------------- Dropdown.js------------------------------------------------------\n\n\taddStudent(id, data) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/status/addStudent/' + id,\n\t\t\tdata,\n\t\t\t{errorHeader: id}\n\t\t);\n\t},\n\tchangeStatus(id, data) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/status/changeStatus/' + id,\n\t\t\tdata,\n\t\t\t{errorHeader: id}\n\t\t);\n\t},\n\tgetStatusarray() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/status/getStatusarray/');\n\t}\n}","export default {\n\tget(prestudent_id, studiensemester_kurzbz) {\n\t\tlet url = 'api/frontend/v1/stv/student/get/'\n\t\t\t+ encodeURIComponent(prestudent_id)\n\t\t\t+ '/'\n\t\t\t+ encodeURIComponent(studiensemester_kurzbz);\n\t\treturn this.$fhcApi.post(url);\n\t},\n\tsave(form, prestudent_id, studiensemester_kurzbz, data) {\n\t\tlet url = 'api/frontend/v1/stv/student/save/'\n\t\t\t+ encodeURIComponent(prestudent_id)\n\t\t\t+ '/'\n\t\t\t+ encodeURIComponent(studiensemester_kurzbz);\n\t\treturn this.$fhcApi.post(form, url, data);\n\t},\n}\n","export default {\n\tgetPruefungen(url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/pruefung/getPruefungen/' + params.id);\n\t},\n\tloadPruefung(pruefung_id){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/pruefung/loadPruefung/' + pruefung_id);\n\t},\n\tgetTypenPruefungen(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/pruefung/getTypenPruefungen');\n\t},\n\tgetAllLehreinheiten(data){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/pruefung/getAllLehreinheiten/', data)\n\t},\n\tgetLvsByStudent(uid){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/pruefung/getLvsByStudent/' + uid)\n\t},\n\tgetLvsandLesByStudent(uid, semester){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/pruefung/getLvsandLesByStudent/' + uid + '/' + semester);\n\t},\n\tgetLvsAndMas(uid){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/pruefung/getLvsAndMas/' + uid)\n\t},\n\tgetMitarbeiterLv(id){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/pruefung/getMitarbeiterLv/' + id)\n\t},\n\tgetNoten(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/pruefung/getNoten');\n\t},\n\tcheckZeugnisnoteLv(data){\n\t\treturn \tthis.$fhcApi.post('api/frontend/v1/stv/pruefung/checkZeugnisnoteLv/', data)\n\t},\n\taddPruefung(form, data){\n\t\treturn this.$fhcApi.post(form,'api/frontend/v1/stv/pruefung/insertPruefung/', data);\n\t},\n\tupdatePruefung(form, id, data){\n\t\treturn this.$fhcApi.post(form,'api/frontend/v1/stv/pruefung/updatePruefung/' + id, data);\n\t},\n\tdeletePruefung(id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/pruefung/deletePruefung/' + id)\n\t}\n}","export default {\n\n\tgetAbschlusspruefung (url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/abschlusspruefung/getAbschlusspruefung/' + params.id);\n\t},\n\taddNewAbschlusspruefung(form, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/abschlusspruefung/insertAbschlusspruefung/', data\n\t\t);\n\t},\n\tloadAbschlusspruefung(id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/abschlusspruefung/loadAbschlusspruefung/', {id});\n\t},\n\tupdateAbschlusspruefung(form, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/abschlusspruefung/updateAbschlusspruefung/', data\n\t\t);\n\t},\n\tdeleteAbschlusspruefung(id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/abschlusspruefung/deleteAbschlusspruefung/', {id});\n\t},\n\tgetTypenAbschlusspruefung(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/abschlusspruefung/getTypenAbschlusspruefung/');\n\t},\n\tgetTypenAntritte(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/abschlusspruefung/getTypenAntritte/');\n\t},\n\tgetBeurteilungen(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/abschlusspruefung/getBeurteilungen/');\n\t},\n\tgetAkadGrade(studiengang_kz){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/abschlusspruefung/getAkadGrade/', {studiengang_kz});\n\t},\n\tgetTypStudiengang(studiengang_kz){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/abschlusspruefung/getTypStudiengang/', {studiengang_kz});\n\t},\n\tgetMitarbeiter(searchString){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/abschlusspruefung/getMitarbeiter/' + searchString);\n\t},\n\tgetPruefer(searchString){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/abschlusspruefung/getPruefer/' + searchString);\n\t},\n\tgetNoten(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/abschlusspruefung/getNoten/');\n\t},\n\tcheckForExistingExams(uids) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/abschlusspruefung/checkForExistingExams/', {uids}\n\t\t);\n\t}\n}","export default {\n\tlist() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/grades/list');\n\t},\n\tgetCertificate(prestudent_id, studiensemester_kurzbz) {\n\t\tlet url = 'api/frontend/v1/stv/grades/getCertificate/' + encodeURIComponent(prestudent_id);\n\t\tif (!!studiensemester_kurzbz) {\n\t\t\turl = url + '/' + encodeURIComponent(studiensemester_kurzbz);\n\t\t}\n\t\treturn this.$fhcApi.get(url);\n\t},\n\tgetTeacherProposal(prestudent_id, studiensemester_kurzbz) {\n\t\tlet url = 'api/frontend/v1/stv/grades/getTeacherProposal/' + encodeURIComponent(prestudent_id);\n\t\tif (!!studiensemester_kurzbz) {\n\t\t\turl = url + '/' + encodeURIComponent(studiensemester_kurzbz);\n\t\t}\n\t\treturn this.$fhcApi.get(url);\n\t},\n\tgetRepeaterGrades(prestudent_id, studiensemester_kurzbz) {\n\t\tlet url = 'api/frontend/v1/stv/grades/getRepeaterGrades/' + encodeURIComponent(prestudent_id);\n\t\tif (!!studiensemester_kurzbz) {\n\t\t\turl = url + '/' + encodeURIComponent(studiensemester_kurzbz);\n\t\t}\n\t\treturn this.$fhcApi.get(url);\n\t},\n\tupdateCertificate({lehrveranstaltung_id, student_uid, studiensemester_kurzbz, note, lehrveranstaltung_bezeichnung}) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'api/frontend/v1/stv/grades/updateCertificate',\n\t\t\t{\n\t\t\t\tlehrveranstaltung_id,\n\t\t\t\tstudent_uid,\n\t\t\t\tstudiensemester_kurzbz,\n\t\t\t\tnote\n\t\t\t},\n\t\t\t{\n\t\t\t\terrorHeader: lehrveranstaltung_bezeichnung\n\t\t\t}\n\t\t);\n\t},\n\tdeleteCertificate({lehrveranstaltung_id, student_uid, studiensemester_kurzbz, lehrveranstaltung_bezeichnung}) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'api/frontend/v1/stv/grades/deleteCertificate',\n\t\t\t{\n\t\t\t\tlehrveranstaltung_id,\n\t\t\t\tstudent_uid,\n\t\t\t\tstudiensemester_kurzbz\n\t\t\t},\n\t\t\t{\n\t\t\t\terrorHeader: lehrveranstaltung_bezeichnung\n\t\t\t}\n\t\t);\n\t},\n\tcopyTeacherProposalToCertificate({lehrveranstaltung_id, student_uid, studiensemester_kurzbz, lehrveranstaltung_bezeichnung}) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'api/frontend/v1/stv/grades/copyTeacherProposalToCertificate',\n\t\t\t{\n\t\t\t\tlehrveranstaltung_id,\n\t\t\t\tstudent_uid,\n\t\t\t\tstudiensemester_kurzbz\n\t\t\t},\n\t\t\t{\n\t\t\t\terrorHeader: lehrveranstaltung_bezeichnung\n\t\t\t}\n\t\t);\n\t},\n\tcopyRepeaterGradeToCertificate({studierendenantrag_lehrveranstaltung_id, lv_bezeichnung}) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'api/frontend/v1/stv/grades/copyRepeaterGradeToCertificate',\n\t\t\t{\n\t\t\t\tstudierendenantrag_lehrveranstaltung_id\n\t\t\t},\n\t\t\t{\n\t\t\t\terrorHeader: lv_bezeichnung\n\t\t\t}\n\t\t);\n\t},\n\tgetGradeFromPoints(points, lehrveranstaltung_id, studiensemester_kurzbz, manualErrorHandling) {\n\t\tconst config = manualErrorHandling ? {errorHandling: false} : {};\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/grades/getGradeFromPoints',\n\t\t\t{\n\t\t\t\t\"points\": points,\n\t\t\t\t\"lehrveranstaltung_id\": lehrveranstaltung_id,\n\t\t\t\t\"studiensemester_kurzbz\": studiensemester_kurzbz\n\t\t\t},\n\t\t\tconfig\n\t\t\t);\n\t}\n}","export default {\n\tgetMobilitaeten (url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/mobility/getMobilitaeten/' + params.id);\n\t},\n\tgetProgramsMobility(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/mobility/getProgramsMobility/');\n\t},\n\taddNewMobility(form, data){\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/mobility/insertMobility/', data);\n\t},\n\tloadMobility(bisio_id){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/mobility/loadMobility/' + bisio_id);\n\t},\n\tupdateMobility(form, data){\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/mobility/updateMobility/', data);\n\t},\n\tdeleteMobility(bisio_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/mobility/deleteMobility/' + bisio_id);\n\t},\n\tgetLVList(studiengang_kz){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/mobility/getLVList/' + studiengang_kz);\n\t},\n\tgetAllLehreinheiten(data){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/mobility/getAllLehreinheiten/', data)\n\t},\n\tgetLvsandLesByStudent(uid){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/mobility/getLvsandLesByStudent/' + uid);\n\t},\n\tgetPurposes(url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/mobility/getPurposes/' + params.id);\n\t},\n\tgetSupports(url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/mobility/getSupports/' + params.id);\n\t},\n\tgetListPurposes() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/mobility/getListPurposes/');\n\t},\n\tgetListSupports() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/mobility/getListSupports/');\n\t},\n\tdeleteMobilityPurpose(params) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/mobility/deleteMobilityPurpose/' + params.bisio_id, params);\n\t},\n\taddMobilityPurpose(params) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/mobility/addMobilityPurpose/' + params.bisio_id, params);\n\t},\n\tdeleteMobilitySupport(params) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/mobility/deleteMobilitySupport/' + params.bisio_id, params);\n\t},\n\taddMobilitySupport(params) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/mobility/addMobilitySupport/' + params.bisio_id, params);\n\t},\n\n}","export default {\n\ttabulatorConfig(config, self) {\n\t\tconfig.ajaxURL = 'api/frontend/v1/stv/archiv/get';\n\t\tconfig.ajaxParams = () => {\n\t\t\tconst params = {\n\t\t\t\tperson_id: self.modelValue.person_id || self.modelValue.map(e => e.person_id)\n\t\t\t};\n\t\t\treturn params;\n\t\t};\n\t\tconfig.ajaxRequestFunc = (url, config, params) => this.$fhcApi.post(url, params, config);\n\t\tconfig.ajaxResponse = (url, params, response) => response.data;\n\n\t\treturn config;\n\t},\n\tgetArchivVorlagen() {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/archiv/getArchivVorlagen');\n\t},\n\tarchive(data) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'api/frontend/v1/documents/archive',\n\t\t\tdata\n\t\t);\n\t},\n\tarchiveSigned(data) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'api/frontend/v1/documents/archiveSigned',\n\t\t\tdata\n\t\t);\n\t},\n\tupdate(data) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/archiv/update', data);\n\t},\n\tdelete({akte_id, studiengang_kz}) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/archiv/delete', {akte_id, studiengang_kz});\n\t}\n};\n","export default {\n\tgetDocumentsUnaccepted(url, config, params) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/dokumente/getDocumentsUnaccepted/' + params.id + '/' + params.studiengang_kz);\n\t},\n\tgetDocumentsAccepted(url, config, params) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/dokumente/getDocumentsAccepted/' + params.id + '/' + params.studiengang_kz);\n\t},\n\tdeleteZuordnung(params){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/dokumente/deleteZuordnung/' + params.prestudent_id + '/' + params.dokument_kurzbz);\n\t},\n\tcreateZuordnung(params){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/dokumente/createZuordnung/'\n\t\t\t+ params.prestudent_id + '/'\n\t\t\t+ params.dokument_kurzbz);\n\t},\n\tloadAkte(akte_id){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/dokumente/loadAkte/' + akte_id);\n\t},\n\tgetDoktypen(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/dokumente/getDoktypen/');\n\t},\n\tupdateFile(akte_id, data){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/dokumente/updateAkte/' + akte_id,\n\t\t\tdata);\n\t},\n\tdeleteFile(akte_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/dokumente/deleteAkte/' + akte_id);\n\t},\n\tuploadFile(prestudent_id, data){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/dokumente/uploadDokument/' + prestudent_id,\n\t\t\tdata);\n\t},\n}","export default {\n\tgetAnrechnungen(url, config, params) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/anrechnungen/getAnrechnungen/' + params.id);\n\t},\n\tgetLehrveranstaltungen(prestudent_id){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/anrechnungen/getLehrveranstaltungen/' + prestudent_id);\n\t},\n\tgetBegruendungen(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/anrechnungen/getBegruendungen/');\n\t},\n\tgetLvsKompatibel(lv_id){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/anrechnungen/getLvsKompatibel/' + lv_id);\n\t},\n\tgetLektoren(studiengang_kz){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/anrechnungen/getLektoren/' + studiengang_kz);\n\t},\n\taddNewAnrechnung(form, data){\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/anrechnungen/insertAnrechnung/', data);\n\t},\n\tloadAnrechnung(anrechnung_id){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/anrechnungen/loadAnrechnung/' + anrechnung_id);\n\t},\n\teditAnrechnung(form, data){\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/anrechnungen/updateAnrechnung/', data);\n\t},\n\tdeleteAnrechnung(anrechnung_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/anrechnungen/deleteAnrechnung/' + anrechnung_id);\n\t},\n}","export default {\n\tgetStudies(url, config, params) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/GemeinsameStudien/getStudien/' + params.id);\n\t},\n\tgetTypenMobility(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/GemeinsameStudien/getTypenMobility/');\n\t},\n\tgetStudiensemester(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/GemeinsameStudien/getStudiensemester/');\n\t},\n\tgetStudyprograms(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/GemeinsameStudien/getStudienprogramme/');\n\t},\n\tgetListPartner(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/GemeinsameStudien/getPartnerfirmen/');\n\t},\n\tgetStatiPrestudent(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/GemeinsameStudien/getStatiPrestudent/');\n\t},\n\tloadStudy(id){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/GemeinsameStudien/loadStudie/' + id);\n\t},\n\tinsertStudy(form, data){\n\t\treturn this.$fhcApi.post(form,'api/frontend/v1/stv/GemeinsameStudien/insertStudie/', data);\n\t},\n\tupdateStudy(form, data){\n\t\treturn this.$fhcApi.post(form,'api/frontend/v1/stv/GemeinsameStudien/updateStudie/', data);\n\t},\n\tdeleteStudy(id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/GemeinsameStudien/deleteStudie/' + id);\n\t},\n\n}","export default {\n\tgetCourselist(url, config, params) {\n\t\t//corresponding logic controller Stundenplan.php\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/LvTermine/getStundenplan/'\n\t\t\t+ params.student_uid + '/'\n\t\t\t+ params.start_date + '/'\n\t\t\t+ params.end_date + '/'\n\t\t\t+ params.group_consecutiveHours + '/'\n\t\t\t+ params.dbStundenplanTable\n\t\t);\n\t},\n\tgetStudiensemester(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/LvTermine/getStudiensemester/');\n\t},\n}","import person from \"./notiz/person.js\";\n\nexport default {\n\tperson\n}","export default {\n\tgetNotizen (url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/notiz/notizPerson/getNotizen/' + params.id + '/' + params.type);\n\t},\n\tgetUid(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/notiz/notizPerson/getUid/');\n\t},\n\taddNewNotiz(form, id, formData) {\n\t\treturn this.$fhcApi.post(form,'api/frontend/v1/notiz/notizPerson/addNewNotiz/' + id,\n\t\t\tformData\n\t\t);\n\t},\n\tloadNotiz(notiz_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/notiz/notizPerson/loadNotiz/', {\n\t\t\tnotiz_id\n\t\t});\n\t},\n\tloadDokumente(notiz_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/notiz/notizPerson/loadDokumente/', {\n\t\t\tnotiz_id\n\t\t});\n\t},\n\tdeleteNotiz(notiz_id, type_id, id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/notiz/notizPerson/deleteNotiz/', {\n\t\t\tnotiz_id,\n\t\t\ttype_id,\n\t\t\tid\n\t\t});\n\t},\n\tupdateNotiz(form, notiz_id, formData){\n\t\treturn this.$fhcApi.post(form,'api/frontend/v1/notiz/notizPerson/updateNotiz/' + notiz_id,\n\t\t\tformData\n\t\t);\n\t},\n\tgetMitarbeiter(event){\n\t\treturn this.$fhcApi.get('api/frontend/v1/notiz/notizPerson/getMitarbeiter/' + event);\n\t},\n\tisBerechtigt(id, type_id){\n\t\treturn this.$fhcApi.get('api/frontend/v1/notiz/notizPerson/isBerechtigt/');\n\t}\n}","import person from \"./betriebsmittel/person.js\";\n\nexport default {\n\tperson\n}","export default {\n\tgetAllBetriebsmittel(url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/betriebsmittel/betriebsmittelP/getAllBetriebsmittel/' + params.type + '/' + params.id);\n\t},\n\taddNewBetriebsmittel(form, person_id, formData) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/betriebsmittel/betriebsmittelP/addNewBetriebsmittel/' +\n\t\t\tperson_id, formData\n\t\t);\n\t},\n\tloadBetriebsmittel(betriebsmittelperson_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/betriebsmittel/betriebsmittelP/loadBetriebsmittel/' + betriebsmittelperson_id);\n\t},\n\tupdateBetriebsmittel(form, betriebsmittelperson_id, formData) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/betriebsmittel/betriebsmittelP/updateBetriebsmittel/' + betriebsmittelperson_id,\n\t\t\tformData);\n\t},\n\tdeleteBetriebsmittel(betriebsmittelperson_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/betriebsmittel/betriebsmittelP/deleteBetriebsmittel/' +\tbetriebsmittelperson_id);\n\t},\n\tgetTypenBetriebsmittel(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/betriebsmittel/betriebsmittelP/getTypenBetriebsmittel/');\n\t},\n\tloadInventarliste(query){\n\t\treturn this.$fhcApi.get('api/frontend/v1/betriebsmittel/betriebsmittelP/loadInventarliste/' +\tquery);\n\t}\n}","export default {\n\tupdatePersonUnrulyStatus(person_id, unrulyParam) {\n\n\t\ttry {\n\t\t\tconst payload = {person_id, unruly: unrulyParam}\n\t\t\tconst url = '/api/frontend/v1/checkperson/CheckPerson/updatePersonUnrulyStatus';\n\t\t\treturn this.$fhcApi.post(url, payload, null);\n\t\t} catch (error) {\n\t\t\tthrow error;\n\t\t}\n\n\t},\n\tfilterPerson(payload, base = ''){\n\n\t\ttry {\n\t\t\tconst url = base + '/api/frontend/v1/checkperson/CheckPerson/filterPerson';\n\t\t\treturn axios.post(url, payload)\n\t\t} catch (error) {\n\t\t\tthrow error;\n\t\t}\n\n\t}\n}","export default {\n getContentID(ort_kurbz) {\n\t\treturn this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n \"/api/frontend/v1/Ort/ContentID\",\n\t\t\t{ ort_kurzbz: ort_kurbz }\n\t\t);\n\t},\n\tgetRooms(datum, von, bis, typ, personenanzahl = 0) {\n\t\treturn this.$fhcApi.get(\n\t\t\tFHC_JS_DATA_STORAGE_OBJECT.app_root +\n\t\t\tFHC_JS_DATA_STORAGE_OBJECT.ci_router +\n\t\t\t\"/api/frontend/v1/Ort/getRooms\",\n\t\t\t{ datum, von, bis, typ, personenanzahl }\n\t\t);\n\t},\n\tgetRoomTypes() {\n\t\treturn this.$fhcApi.get(\n\t\t\tFHC_JS_DATA_STORAGE_OBJECT.app_root +\n\t\t\tFHC_JS_DATA_STORAGE_OBJECT.ci_router +\n\t\t\t\"/api/frontend/v1/Ort/getTypes\"\n\t\t);\n\t}\n}","export default {\n content(content_id, version=null, sprache=null, sichtbar=null) {\n return this.$fhcApi.get(\n\t\t\t\"/api/frontend/v1/Cms/content\",\n\t\t\t{ \n\t\t\t\tcontent_id: content_id,\n\t\t\t\t...(version?{version}:{}),\n\t\t\t\t...(sprache?{sprache}:{}),\n\t\t\t\t...(sichtbar?{sichtbar}:{}),\n }\n );\n },\n\t//api function used for the news View that renders the html\n\tgetNews(page = 1, page_size = 10, sprache) {\n\t\treturn this.$fhcApi.get(\n\t\t\t\"/api/frontend/v1/Cms/getNews\",\n\t\t\t{\n\t\t\t\tpage,\n\t\t\t\tpage_size,\n\t\t\t\tsprache,\n\t\t\t},\n\t\t);\n\t},\n\t//api function used for the widget component\n\tnews(limit) {\n\t\treturn this.$fhcApi.get(\n\t\t\t\"/api/frontend/v1/Cms/news\",\n\t\t\t{\n\t\t\t\tlimit: limit\n\t\t\t}\n\t\t);\n\t},\n\tgetNewsRowCount: function () {\n\t\treturn this.$fhcApi.get(\n\t\t\t\"/api/frontend/v1/Cms/getNewsRowCount\",\n\t\t\t{}\n\t\t);\n\t},\n\tgetNewsExtra: function(){\n\t\treturn this.$fhcApi.get(\n\t\t\t\"/api/frontend/v1/Cms/getStudiengangInfoForNews\",\n\t\t\t{}\n\t\t);\n\t}\n }","export default {\n getStudentenMail(lehreinheit_id) {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n \"/api/frontend/v1/Lehre/lvStudentenMail\",\n { lehreinheit_id: lehreinheit_id }\n );\n },\n\tgetLvInfo(studiensemester_kurzbz, lehrveranstaltung_id) {\n\t\treturn this.$fhcApi.get(\n\t\t\t`/api/frontend/v1/Lehre/LV/${studiensemester_kurzbz}/${lehrveranstaltung_id}`\n\t\t\t, {}\n\t\t);\n\t},\n\tgetStudentPruefungen(lehrveranstaltung_id){\n\t\treturn this.$fhcApi.get(\n\t\t\t`/api/frontend/v1/Lehre/Pruefungen/${lehrveranstaltung_id}`\n\t\t\t, {}\n\t\t);\n\t}\n }","export default {\n getLvMenu(lvid, studiensemester_kurzbz) {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/LvMenu/getLvMenu/${lvid}/${studiensemester_kurzbz}`,\n {}\n );\n },\n\n \n }","import person from \"./messages/person.js\";\n\nexport default {\n\tperson\n}","export default {\n\t\tgetMessages(url, config, params) {\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getMessages/' + params.id + '/' + params.type + '/' + params.size + '/' + params.page);\n\t\t},\n\t\tgetVorlagen(){\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getVorlagen/');\n\t\t},\n\t\tgetMsgVarsLoggedInUser(){\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getMsgVarsLoggedInUser/');\n\t\t},\n\t\tgetMessageVarsPerson(params){\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getMessageVarsPerson/' + params.id + '/' + params.type_id);\n\t\t},\n\t\tgetMsgVarsPrestudent(params){\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getMsgVarsPrestudent/' + params.id + '/' + params.type_id);\n\t\t},\n\t\tgetPersonId(params){\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getPersonId/'+ params.id + '/' + params.type_id);\n\t\t},\n\t\tgetUid(params){\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getUid/'+ params.id + '/' + params.type_id);\n\t\t},\n\t\tgetDataVorlage(vorlage_kurzbz){\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getDataVorlage/' + vorlage_kurzbz);\n\t\t},\n\t\tgetNameOfDefaultRecipient(params){\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getNameOfDefaultRecipient/' + params.id + '/' + params.type_id);\n\t\t},\n\t\tgetPreviewText(params, data){\n\t\t\treturn this.$fhcApi.post('api/frontend/v1/messages/messages/getPreviewText/' + params.id + '/' + params.type_id,\n\t\t\t\tdata);\n\t\t},\n\t\tgetReplyData(messageId){\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getReplyData/' + messageId);\n\t\t},\n\t\tsendMessageFromModalContext(form, id, data) {\n\t\t\treturn this.$fhcApi.post(form,'api/frontend/v1/messages/messages/sendMessage/' + id,\n\t\t\t\tdata);\n\t\t},\n\t\tsendMessage(id, data) {\n\t\t\treturn this.$fhcApi.post('api/frontend/v1/messages/messages/sendMessage/' + id,\n\t\t\t\tdata);\n\t\t},\n\t\tdeleteMessage(messageId){\n\t\t\treturn this.$fhcApi.post('api/frontend/v1/messages/messages/deleteMessage/' + messageId);\n\t\t}\n}","export default {\n\tgetVorlagen() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/vorlagen/vorlagen/getVorlagen/');\n\t},\n\tgetVorlagenByLoggedInUser() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/vorlagen/vorlagen/getVorlagenByLoggedInUser/');\n\t}\n}","export default {\n\n\tgetStudiensemester: function () {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/components/Cis/Mylv/Studiensemester',\n\t\t\t{}\n\t\t);\n\t},\n\n\tgetAllStudienSemester: function (studiensemester=undefined, studiengang=undefined, semester=undefined, studienplan=undefined) {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/api/frontend/v1/Studium/getStudienAllSemester',\n\t\t\t{studiensemester, studiengang, semester, studienplan}\n\t\t);\n\t},\n\n\tgetStudiengaengeForStudienSemester: function (studiensemester) {\n\t\treturn this.$fhcApi.get(\n\t\t\t`/api/frontend/v1/Studium/getStudiengaengeForStudienSemester/${studiensemester}`,\n\t\t\t{}\n\t\t);\n\t},\n\tgetStudienplaeneBySemester: function (studiengang, studiensemester) {\n\t\treturn this.$fhcApi.get(\n\t\t\t`/api/frontend/v1/Studium/getStudienplaeneBySemester`,\n\t\t\t{\n\t\t\t\tstudiengang,\n\t\t\t\tstudiensemester,\n\t\t\t}\n\t\t);\n\t},\n\tgetLvPlanForStudiensemester: function (studiensemester, lvid) {\n\t\treturn this.$fhcApi.get(\n\t\t\t`/api/frontend/v1/LvPlan/getLvPlanForStudiensemester/${studiensemester}/${lvid}`,\n\t\t\t{\n\t\t\t}\n\t\t);\n\t},\n\tgetLvEvaluierungInfo: function (studiensemester_kurzbz, lvid) {\n\t\treturn this.$fhcApi.get(\n\t\t\t`/api/frontend/v1/Studium/getLvEvaluierungInfo/${studiensemester_kurzbz}/${lvid}`,\n\t\t\t{\n\t\t\t}\n\t\t);\n\t},\n\t\n}","/**\n * Copyright (C) 2024 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nimport search from \"./search.js\";\nimport phrasen from \"./phrasen.js\";\nimport navigation from \"./navigation.js\";\nimport filter from \"./filter.js\";\nimport studstatus from \"./studstatus.js\";\nimport profil from \"./profil.js\";\nimport profilUpdate from \"./profilUpdate.js\";\nimport lvPlan from \"./lvPlan.js\";\nimport bookmark from \"./bookmark.js\";\nimport stv from \"./stv.js\";\nimport notiz from \"./notiz.js\";\nimport betriebsmittel from \"./betriebsmittel.js\";\nimport checkperson from \"./checkperson.js\";\nimport ampeln from \"./ampeln.js\";\nimport ort from \"./ort.js\";\nimport cms from \"./cms.js\";\nimport lehre from \"./lehre.js\";\nimport addons from \"./addons.js\";\nimport messages from \"./messages.js\";\nimport vorlagen from \"./vorlagen.js\";\nimport studiengang from \"./studiengang.js\";\nimport menu from \"./menu.js\";\nimport dashboard from \"./dashboard.js\";\nimport authinfo from \"./authinfo.js\";\nimport studium from \"./studium.js\";\nimport language from \"./language.js\";\n\nexport default {\n search,\n phrasen,\n navigation,\n dashboard,\n filter,\n studstatus,\n profil,\n profilUpdate,\n lvPlan,\n bookmark,\n stv,\n notiz,\n betriebsmittel,\n checkperson,\n ampeln,\n ort,\n cms,\n lehre,\n addons,\n messages,\n vorlagen,\n addons,\n\tstudiengang,\n\tmenu,\n\tauthinfo,\n\tstudium,\n language\n};\n","export default {\n\tasync getViewData() {\n\t\tconst url = `/api/frontend/v1/Cis4FhcApi/getViewData`;\n\t\treturn this.$fhcApi.get(url, null, null)\n\t},\n}","export default {\n\n getBookmarks: function () {\n return this.$fhcApi.get(\n `/api/frontend/v1/Bookmark/getBookmarks`\n ,{}\n );\n },\n \n delete: function (bookmark_id) {\n return this.$fhcApi.get(\n `/api/frontend/v1/Bookmark/delete/${bookmark_id}`\n ,{}\n ); \n },\n\n\tupdate: function ({ bookmark_id, url, title, tag=null}) {\n\t\treturn this.$fhcApi.post(\n\t\t\t`/api/frontend/v1/Bookmark/update/${bookmark_id}`\n\t\t\t, {\n\t\t\t\turl: url,\n\t\t\t\ttitle: title\n\t\t\t}\n\t\t);\n\t},\n\n insert: function ({url, title, tag}) {\n return this.$fhcApi.post(\n `/api/frontend/v1/Bookmark/insert`\n ,{\n url: url,\n title: title,\n tag: tag\n }\n ); \n },\n}","export default {\n \n open: function () {\n return this.$fhcApi.get(\n `/api/frontend/v1/Ampeln/open`,{});\n },\n\n all: function () {\n return this.$fhcApi.get(\n `/api/frontend/v1/Ampeln/all`,{});\n },\n\n confirm: function (ampel_id) {\n return this.$fhcApi.get(\n `/api/frontend/v1/Ampeln/confirm/${ampel_id}`,{});\n },\n\n}","export default {\n\tstudiengangInformation: function () {\n\t\treturn this.$fhcApi.get(\n\t\t\t\"/api/frontend/v1/Studgang/getStudiengangInfo\",\n\t\t\t{}\n\t\t);\n\t},\n\tgetStudiengangByKz: function (studiengang_kz) {\n\t\treturn this.$fhcApi.get(\n\t\t\t\"/api/frontend/v1/organisation/StudiengangEP/getStudiengangByKz\",\n\t\t\t{\n\t\t\t\t\"studiengang_kz\": studiengang_kz\n\t\t\t}\n\t\t);\n\t}\n}","export default {\n\tgetMenu: function () {\n\t\treturn this.$fhcApi.get(\n\t\t\t\"/api/frontend/v1/CisMenu/getMenu\",\n\t\t\t{}\n\t\t);\n\t}\n\n}","\nexport default {\n\tgetAuthUID() {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/api/frontend/v1/AuthInfo/getAuthUID',\n\t\t\t{ }\n\t\t);\n\t},\n\tgetAuthInfo() {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/api/frontend/v1/AuthInfo/getAuthInfo',\n\t\t\t{}\n\t\t);\n\t},\n};","/**\n * Copyright (C) 2024 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tgetAll() {\n\t\treturn this.$fhcApi.get('/api/frontend/v1/language/get');\n\t}\n};","/** TODO(chris):\n * when deleting this file be sure to\n * remove line 1 & 90 from ../plugins/Phrasen.js\n */\nimport FhcApiFactory from '../api/fhcapifactory.js';\n\n\nexport default {\n\tinstall: (app, options) => {\n\t\tif (app.config.globalProperties.$fhcApi) {\n\t\t\t/* Deprecated Code start */\n\t\t\tif (options?.factory) {\n\t\t\t\tconsole.warn(\"$fhcApi is DEPRECATED!\");\n\t\t\t\tapp.config.globalProperties.$fhcApi.factory.addEndpoints(options.factory);\n\t\t\t}\n\t\t\t/* Deprecated Code end */\n\t\t\treturn;\n\t\t}\n\n\t\tfunction _get_config(form, uri, data, config) {\n\t\t\tif (typeof form == 'string' && config === undefined) {\n\t\t\t\t[uri, data, config] = [form, uri, data];\n\t\t\t\tform = undefined;\n\t\t\t} else if (form) {\n\t\t\t\tif (typeof form != 'object')\n\t\t\t\t\tthrow new TypeError('Parameter 1 of _get_config must be an object or a string');\n\t\t\t\tif (uri === undefined && data === undefined && config === undefined) {\n\t\t\t\t\tconfig = form;\n\t\t\t\t\tform = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (form) {\n\t\t\t\t// NOTE(chris): check if form is fhc-form\n\t\t\t\tif (!form.clearValidation || !form.setFeedback)\n\t\t\t\t\tthrow new TypeError(\"'form' is not a Form Component\");\n\n\t\t\t\tform = {\n\t\t\t\t\tclearValidation: form.clearValidation,\n\t\t\t\t\tsetFeedback: form.setFeedback\n\t\t\t\t};\n\n\t\t\t\tif (config)\n\t\t\t\t\tconfig.form = form;\n\t\t\t\telse\n\t\t\t\t\tconfig = {form};\n\t\t\t}\n\n\t\t\treturn [uri, data, config];\n\t\t}\n\n\t\tfunction _clean_return_value(response) {\n\t\t\tconst result = response.data;\n\t\t\tdelete response.data;\n\t\t\tif (!result.meta)\n\t\t\t\tresult.meta = {response};\n\t\t\telse\n\t\t\t\tresult.meta.response = response;\n\t\t\treturn result;\n\t\t}\n\t\tconst baseURL = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + \"/\";\n\t\tconst fhcApiAxios = axios.create({\n\t\t\ttimeout: 500000,\n\t\t\tbaseURL: FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + \"/\"\n\t\t});\n\n\t\tfhcApiAxios.interceptors.request.use(config => {\n\t\t\tif (config.method != 'post' || !config.data)\n\t\t\t\treturn config;\n\n\t\t\tif (config.data instanceof FormData)\n\t\t\t\treturn config;\n\n\t\t\tif (!Object.values(config.data).every(item => {\n\t\t\t\tif (item instanceof FileList)\n\t\t\t\t\treturn false;\n\t\t\t\tif (Array.isArray(item))\n\t\t\t\t\treturn item.every(i => !(i instanceof File));\n\t\t\t\treturn true;\n\t\t\t})) {\n\t\t\t\tconst newData = Object.entries(config.data).reduce((nd, [key, item]) => {\n\t\t\t\t\tif (item instanceof FileList) {\n\t\t\t\t\t\tfor (const file of item)\n\t\t\t\t\t\t\tnd.FormData.append(key + (item.length > 1 ? '[]' : ''), file);\n\t\t\t\t\t} else if (Array.isArray(item)) {\n\t\t\t\t\t\tif (item.every(i => !(i instanceof File))) {\n\t\t\t\t\t\t\tnd.jsondata[key] = item;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\titem.forEach(file => nd.FormData.append(key + (item.length > 1 ? '[]' : ''), file));\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnd.jsondata[key] = item;\n\t\t\t\t\t}\n\t\t\t\t\treturn nd;\n\t\t\t\t}, {\n\t\t\t\t\tFormData: new FormData(),\n\t\t\t\t\tjsondata: {}\n\t\t\t\t});\n\t\t\t\tnewData.FormData.append('_jsondata', JSON.stringify(newData.jsondata));\n\t\t\t\tconfig.data = newData.FormData;\n\t\t\t}\n\n\t\t\treturn config;\n\t\t});\n\n\t\tfhcApiAxios.interceptors.response.use(response => {\n\t\t\tif (response.config?.errorHandling == 'off'\n\t\t\t\t|| response.config?.errorHandling === false\n\t\t\t\t|| response.config?.errorHandling == 'fail')\n\t\t\t\treturn _clean_return_value(response);\n\n\t\t\t// NOTE(chris): loop through errors\n\t\t\tif (response.data.errors)\n\t\t\t\tresponse.data.errors = response.data.errors.filter(\n\t\t\t\t\terr => (response.config[err.type + 'ErrorHandler'] || app.config.globalProperties.$fhcApi._defaultErrorHandlers[err.type])(err, response.config)\n\t\t\t\t);\n\n\t\t\treturn _clean_return_value(response);\n\t\t}, error => {\n\t\t\tif (error.code == 'ERR_CANCELED')\n\t\t\t\treturn Promise.reject({...{handled: true}, ...error});\n\n\t\t\tif (error.config?.errorHandling == 'off'\n\t\t\t\t|| error.config?.errorHandling === false\n\t\t\t\t|| error.config?.errorHandling == 'success')\n\t\t\t\treturn Promise.reject(error);\n\n\t\t\tif (error.response) {\n\t\t\t\tif (error.response.status == 404) {\n\t\t\t\t\tapp.config.globalProperties.$fhcAlert.alertDefault('error', error.message, error.request.responseURL, true);\n\t\t\t\t\treturn Promise.reject({...{handled: true}, ...error});\n\t\t\t\t}\n\n\t\t\t\t// NOTE(chris): loop through errors\n\t\t\t\terror.response.data.errors = error.response.data.errors.filter(\n\t\t\t\t\terr => (error.config[err.type + 'ErrorHandler'] || app.config.globalProperties.$fhcApi._defaultErrorHandlers[err.type])(err, error.config)\n\t\t\t\t);\n\t\t\t\tif (!error.response.data.errors.length)\n\t\t\t\t\treturn Promise.reject({...{handled: true}, ...error});\n\t\t\t} else if (error.request) {\n\t\t\t\tapp.config.globalProperties.$fhcAlert.alertDefault('error', error.message, error.request.responseURL);\n\t\t\t\treturn Promise.reject({...{handled: true}, ...error});\n\t\t\t} else {\n\t\t\t\tapp.config.globalProperties.$fhcAlert.alertError(error.message);\n\t\t\t\treturn Promise.reject({...{handled: true}, ...error});\n\t\t\t}\n\n\t\t\treturn Promise.reject(error);\n\t\t});\n\n\t\tapp.config.globalProperties.$fhcApi = {\n\t\t\tgetUri(url) {\n\t\t\t\tconsole.warn('$fhcApi.getUri is DEPRECATED! Use $api.getUri instead.');\n\t\t\t\treturn fhcApiAxios.getUri({url});\n\t\t\t},\n\t\t\tget(form, uri, params, config) {\n\t\t\t\tconsole.warn('$fhcApi.get is DEPRECATED! Use $api.get instead.');\n\t\t\t\t[uri, params, config] = _get_config(form, uri, params, config);\n\t\t\t\tif (params) {\n\t\t\t\t\tif (config)\n\t\t\t\t\t\tconfig.params = params;\n\t\t\t\t\telse\n\t\t\t\t\t\tconfig = {params};\n\t\t\t\t}\n\t\t\t\treturn fhcApiAxios.get(uri, config);\n\t\t\t},\n\t\t\tpost(form, uri, data, config) {\n\t\t\t\tconsole.warn('$fhcApi.post is DEPRECATED! Use $api.post instead.');\n\t\t\t\t[uri, data, config] = _get_config(form, uri, data, config);\n\t\t\t\treturn fhcApiAxios.post(uri, data, config);\n\t\t\t},\n\t\t\t_defaultErrorHandlers: {\n\t\t\t\tvalidation(error, config) {\n\t\t\t\t\tconst $fhcAlert = app.config.globalProperties.$fhcAlert;\n\n\t\t\t\t\tif (config?.form) {\n\t\t\t\t\t\tconfig.form.clearValidation();\n\t\t\t\t\t\tconfig.form.setFeedback(false, error.messages);\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (Array.isArray(error.messages)) {\n\t\t\t\t\t\terror.messages.forEach($fhcAlert.alertError);\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t} else if (typeof error.messages == 'object') {\n\t\t\t\t\t\tif (config?.errorHeader)\n\t\t\t\t\t\t\tObject.values(error.messages).forEach(\n\t\t\t\t\t\t\t\tvalue => $fhcAlert.alertDefault(\n\t\t\t\t\t\t\t\t\t'error',\n\t\t\t\t\t\t\t\t\tArray.isArray(config.errorHeader) ? app.config.globalProperties.$p.t.apply(null, config.errorHeader) : config.errorHeader,\n\t\t\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tObject.entries(error.messages).forEach(\n\t\t\t\t\t\t\t\t([key, value]) => $fhcAlert.alertDefault('error', key, value, true)\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\t\t\t\tgeneral(error, config) {\n\t\t\t\t\tconst $fhcAlert = app.config.globalProperties.$fhcAlert;\n\n\t\t\t\t\tif (config?.form)\n\t\t\t\t\t\tconfig.form.setFeedback(false, error.message);\n\t\t\t\t\telse if (config?.errorHeader)\n\t\t\t\t\t\t$fhcAlert.alertDefault(\n\t\t\t\t\t\t\t'error',\n\t\t\t\t\t\t\tArray.isArray(config.errorHeader) ? app.config.globalProperties.$p.t.apply(null, config.errorHeader) : config.errorHeader,\n\t\t\t\t\t\t\terror.message,\n\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t);\n\t\t\t\t\telse\n\t\t\t\t\t\t$fhcAlert.alertError(error.message);\n\t\t\t\t},\n\t\t\t\tphp(error) {\n\t\t\t\t\tconst $fhcAlert = app.config.globalProperties.$fhcAlert;\n\n\t\t\t\t\tvar message = '';\n\t\t\t\t\tmessage += 'Message: ' + error.message + '\\n\\n';\n\t\t\t\t\tmessage += 'Filename: ' + error.filename + '\\n';\n\t\t\t\t\tmessage += 'Line Number: ' + error.line + '\\n';\n\t\t\t\t\tif (error.backtrace && error.backtrace.length) {\n\t\t\t\t\t\tmessage += '\\nBacktrace: ';\n\t\t\t\t\t\terror.backtrace.forEach(err => {\n\t\t\t\t\t\t\tmessage += '\\n\\tFile: ' + err.file + '\\n';\n\t\t\t\t\t\t\tmessage += '\\tLine: ' + err.line + '\\n';\n\t\t\t\t\t\t\tmessage += '\\tFunction: ' + err.function + '\\n';\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tswitch (error.severity) {\n\t\t\t\t\t\tcase 'Warning':\n\t\t\t\t\t\tcase 'Core Warning':\n\t\t\t\t\t\tcase 'Compile Warning':\n\t\t\t\t\t\tcase 'User Warning':\n\t\t\t\t\t\t\t$fhcAlert.alertDefault('warn', 'PHP ' + error.severity, message, true);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'Notice':\n\t\t\t\t\t\tcase 'User Notice':\n\t\t\t\t\t\tcase 'Runtime Notice':\n\t\t\t\t\t\t\t$fhcAlert.alertDefault('info', 'PHP ' + error.severity, message, true);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tmessage = 'Type: PHP ' + error.severity + '\\n\\n' + message;\n\t\t\t\t\t\t\t$fhcAlert.alertSystemError(message);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\texception(error) {\n\t\t\t\t\tconst $fhcAlert = app.config.globalProperties.$fhcAlert;\n\n\t\t\t\t\tvar message = '';\n\t\t\t\t\tmessage += 'Type: ' + error.class + '\\n\\n';\n\t\t\t\t\tmessage += 'Message: ' + error.message + '\\n\\n';\n\t\t\t\t\tmessage += 'Filename: ' + error.filename + '\\n';\n\t\t\t\t\tmessage += 'Line Number: ' + error.line + '\\n';\n\t\t\t\t\tif (error.backtrace && error.backtrace.length) {\n\t\t\t\t\t\tmessage += '\\nBacktrace: ';\n\t\t\t\t\t\terror.backtrace.forEach(err => {\n\t\t\t\t\t\t\tmessage += '\\n\\tFile: ' + err.file + '\\n';\n\t\t\t\t\t\t\tmessage += '\\tLine: ' + err.line + '\\n';\n\t\t\t\t\t\t\tmessage += '\\tFunction: ' + err.function + '\\n';\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t$fhcAlert.alertSystemError(message);\n\t\t\t\t},\n\t\t\t\tdb(error) {\n\t\t\t\t\tconst $fhcAlert = app.config.globalProperties.$fhcAlert;\n\n\t\t\t\t\tvar message = '';\n\t\t\t\t\tif (error.heading !== undefined)\n\t\t\t\t\t\tmessage += error.heading + '\\n\\n';\n\t\t\t\t\tif (error.code !== undefined)\n\t\t\t\t\t\tmessage += 'Code: ' + error.code + '\\n\\n';\n\t\t\t\t\tif (error.sql !== undefined)\n\t\t\t\t\t\tmessage += 'SQL: ' + error.sql + '\\n\\n';\n\t\t\t\t\tif (error.message !== undefined)\n\t\t\t\t\t\tmessage += 'Message: ' + error.message + '\\n\\n';\n\t\t\t\t\telse if (error.messages !== undefined)\n\t\t\t\t\t\tmessage += 'Messages: ' + error.messages.join('\\n\\t') + '\\n\\n';\n\t\t\t\t\tif (error.filename !== undefined)\n\t\t\t\t\t\tmessage += 'Filename: ' + error.filename + '\\n';\n\t\t\t\t\tif (error.line !== undefined)\n\t\t\t\t\t\tmessage += 'Line Number: ' + error.line + '\\n';\n\n\t\t\t\t\t$fhcAlert.alertSystemError(message);\n\t\t\t\t},\n\t\t\t\tauth(error, config) {\n\t\t\t\t\tconst $fhcAlert = app.config.globalProperties.$fhcAlert;\n\n\t\t\t\t\tvar message = '';\n\t\t\t\t\tmessage += 'Controller name: ' + error.controller + '\\n';\n\t\t\t\t\tmessage += 'Method name: ' + error.method + '\\n';\n\t\t\t\t\tmessage += 'Required permissions: ' + error.required_permissions;\n\t\t\t\t\tif (config?.errorHeader)\n\t\t\t\t\t\t$fhcAlert.alertDefault(\n\t\t\t\t\t\t\t'error',\n\t\t\t\t\t\t\tArray.isArray(config.errorHeader) ? app.config.globalProperties.$p.t.apply(null, config.errorHeader) : config.errorHeader,\n\t\t\t\t\t\t\terror.message,\n\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t);\n\t\t\t\t\telse\n\t\t\t\t\t\t$fhcAlert.alertDefault('error', error.message, message);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t/* Deprecated Code start */\n\t\tclass FhcApiFactoryWrapper {\n\t\t\tconstructor(factorypart, root) {\n\t\t\t\tif (root === undefined) {\n\t\t\t\t\tthis.$fhcApi = {\n\t\t\t\t\t\tgetUri(url) {\n\t\t\t\t\t\t\tconsole.warn('$fhcApi.factory is DEPRECATED!');\n\t\t\t\t\t\t\treturn app.config.globalProperties.$fhcApi.getUri(url);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tget(form, uri, params, config) {\n\t\t\t\t\t\t\tconsole.warn('$fhcApi.factory is DEPRECATED!');\n\t\t\t\t\t\t\treturn app.config.globalProperties.$fhcApi.get(form, uri, params, config);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tpost(form, uri, data, config) {\n\t\t\t\t\t\t\tconsole.warn('$fhcApi.factory is DEPRECATED!');\n\t\t\t\t\t\t\treturn app.config.globalProperties.$fhcApi.post(form, uri, data, config);\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\tObject.defineProperty(this.$fhcApi, 'factory', {\n\t\t\t\t\t\tget() {\n\t\t\t\t\t\t\tconsole.warn('$fhcApi.factory is DEPRECATED!');\n\t\t\t\t\t\t\treturn app.config.globalProperties.$fhcApi.factory;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tapp.config.globalProperties.$fhcApi.factory = this;\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty(this, '$fhcApi', {\n\t\t\t\t\t\tget() {\n\t\t\t\t\t\t\treturn (root || this).$fhcApi;\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tthis.addEndpoints(factorypart, true)\n\t\t\t}\n\n\t\t\taddEndpoints(factorypart, noWarn) {\n\t\t\t\tObject.keys(factorypart).forEach(key => {\n\t\t\t\t\tObject.defineProperty(this, key, {\n\t\t\t\t\t\tget() {\n\t\t\t\t\t\t\tif (typeof factorypart[key] == 'function')\n\t\t\t\t\t\t\t\treturn factorypart[key].bind(this);\n\t\t\t\t\t\t\treturn new FhcApiFactoryWrapper(factorypart[key], this.$fhcApi.factory);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\tif (!noWarn) console.warn('$fhcApi.factory.addEndpoints() is DEPRECATED!');\n\t\t\t}\n\t\t}\n\n\t\tconst factory = new FhcApiFactoryWrapper(FhcApiFactory);\n\t\tif (options?.factory) {\n\t\t\tconsole.warn(\"$fhcApi is DEPRECATED!\");\n\t\t\tfactory.addEndpoints(options.factory);\n\t\t}\n\n\t\tapp.config.globalProperties.$fhcApi.factory = factory;\n\t\t/* Deprecated Code end */\n\t\t\n\t\tapp.provide('$fhcApi', app.config.globalProperties.$fhcApi);\n\t}\n};","/**\n * Copyright (C) 2022 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n//--------------------------------------------------------------------------------------------------------------------\n// Configs\n\n// To see debug messages into the browser console set this parameter as true\nconst CORE_REST_CLIENT_DEBUG = false;\n\n// Default timeout (milliseconds)\nconst CORE_REST_CLIENT_TIMEOUT = 5000;\n\n//--------------------------------------------------------------------------------------------------------------------\n// Constants\n\n// Success\nconst CORE_REST_CLIENT_SUCCESS = 0;\n\n// Properties present in a response\nconst CORE_REST_CLIENT_ERROR = \"error\";\nconst CORE_REST_CLIENT_RETVAL = \"retval\";\n\n// HTTP method parameters\nconst CRC_HTTP_GET_METHOD = \"get\";\nconst CRC_HTTP_POST_METHOD = \"post\";\n\n/**\n * Definition and initialization of the object CoreRESTClient\n */\nexport const CoreRESTClient = {\n\t//------------------------------------------------------------------------------------------------------------------\n\t// Public methods\n\n\t/**\n\t * Performs a call using the HTTP GET method\n\t * wsParameters is an object\n\t * axiosParameters is an object\n\t */\n\tget: function(wsURL, wsParameters, axiosParameters = null) {\n\t\treturn CoreRESTClient._axiosCall(wsURL, wsParameters, CRC_HTTP_GET_METHOD, axiosParameters);\n\t},\n\n\t/**\n\t * Performs a call using the HTTP POST method\n\t * wsParameters is an object\n\t * axiosParameters is an object\n\t */\n\tpost: function(wsURL, wsParameters, axiosParameters = null) {\n\t\treturn CoreRESTClient._axiosCall(wsURL, wsParameters, CRC_HTTP_POST_METHOD, axiosParameters);\n\t},\n\n\t/**\n\t * Checks if the response is a success\n\t */\n\tisSuccess: function(response) {\n\n\t\tif (typeof response === \"object\" && response.hasOwnProperty(CORE_REST_CLIENT_ERROR)\n\t\t\t&& response.hasOwnProperty(CORE_REST_CLIENT_RETVAL) && response.error == CORE_REST_CLIENT_SUCCESS)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t/**\n\t * Checks if the response is an error\n\t */\n\tisError: function(response) {\n\t\treturn !CoreRESTClient.isSuccess(response);\n\t},\n\n\t/**\n\t * Checks if the response has data\n\t */\n\thasData: function(response) {\n\n\t\tif (CoreRESTClient.isSuccess(response))\n\t\t{\n\t\t\tif ((typeof response[CORE_REST_CLIENT_RETVAL] === \"object\" && Object.keys(response[CORE_REST_CLIENT_RETVAL]).length > 0)\n\t\t\t\t|| (typeof response[CORE_REST_CLIENT_RETVAL] === \"array\" && response[CORE_REST_CLIENT_RETVAL].length > 0)\n\t\t\t\t|| (typeof response[CORE_REST_CLIENT_RETVAL] === \"string\" && response[CORE_REST_CLIENT_RETVAL].trim() != \"\")\n\t\t\t\t|| typeof response[CORE_REST_CLIENT_RETVAL] === \"number\")\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t/**\n\t * Retrives data from response object\n\t */\n\tgetData: function(response) {\n\n\t\tif (CoreRESTClient.hasData(response))\n\t\t{\n\t\t\treturn response[CORE_REST_CLIENT_RETVAL];\n\t\t}\n\n\t\treturn null;\n\t},\n\n\t/**\n\t * Retrives error message from response object\n\t */\n\tgetError: function(response) {\n\n\t\tif (typeof response === \"object\"\n\t\t\t&& Object.keys(response).length > 0\n\t\t\t&& response.hasOwnProperty(CORE_REST_CLIENT_RETVAL))\n\t\t{\n\t\t\treturn response[CORE_REST_CLIENT_RETVAL];\n\t\t}\n\n\t\treturn \"Generic error\";\n\t},\n\n\t/**\n\t * Retrives code from response object\n\t */\n\tgetErrorCode: function(response) {\n\n\t\tif (typeof response === \"object\" && response.hasOwnProperty(CORE_REST_CLIENT_ERROR))\n\t\t{\n\t\t\treturn response[CORE_REST_CLIENT_ERROR];\n\t\t}\n\n\t\treturn 1; // Generic error\n\t},\n\n\t//------------------------------------------------------------------------------------------------------------------\n\t// Private methods\n\n\t/**\n\t * Generate the router URI using the connection parameters\n\t */\n\t_generateRouterURI: function(wsURL) {\n\t\tvar uri = null;\n\n\t\t// Checks if global JS object FHC_JS_DATA_STORAGE_OBJECT exists\n\t\tif (typeof FHC_JS_DATA_STORAGE_OBJECT !== \"undefined\")\n\t\t{\n\t\t\turi = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + \"/\" + wsURL;\n\t\t}\n\n\t\treturn uri;\n\t},\n\n\t/**\n\t * Method to print debug info after a controller has been called\n\t */\n\t_printDebug: function(parameters, response, errorThrown) {\n\n\t\tif (CORE_REST_CLIENT_DEBUG === true) // If global const CORE_REST_CLIENT_DEBUG is true, but really true!\n\t\t{\n\t\t\t// Print info about called controller\n\t\t\tconsole.log(\"Called controller: \" + parameters.remoteController);\n\t\t\tconsole.log(\"Call parameters:\"); // parameters given to this call\n\t\t\tconsole.log(parameters);\n\n\t\t\tif (response != null) // if there is a response...\n\t\t\t{\n\t\t\t\tconsole.log(\"Controller Response:\");\n\t\t\t\tconsole.log(response); // ...print it\n\t\t\t}\n\t\t\tif (errorThrown != null) // if there is a jQuery error...\n\t\t\t{\n\t\t\t\tconsole.log(\"jQuery error:\");\n\t\t\t\tconsole.log(errorThrown); // ...print it\n\t\t\t}\n\t\t\tconsole.log(\"--------------------------------------------------------------------------------------------\");\n\t\t}\n\t},\n\n\t/**\n\t * Performs a call to the server were the CI PHP layer is running\n\t * - wsURL: alias of the core controller to call\n\t * - wsParameters: parameters to give to the called controller\n\t * - type: POST or GET HTTP method\n\t * - axiosParameters: an object to configure the axios call\n\t */\n\t_axiosCall: function(wsURL, wsParameters, type, axiosParameters) {\n\n\t\t// Axios config object\n\t\tlet axiosCallObj = {\n\t\t\tmethod: type,\n\t\t\turl: CoreRESTClient._generateRouterURI(wsURL),\n\t\t\ttimeout: CORE_REST_CLIENT_TIMEOUT // default time out\n\t\t};\n\n\t\t// The ajax call is HTTP GET\n\t\tif (type == CRC_HTTP_GET_METHOD)\n\t\t{\n\t\t\taxiosCallObj.params = wsParameters;\n\t\t}\n\t\t// The ajax call is HTTP POST\n\t\telse\n\t\t{\n\t\t\taxiosCallObj.data = wsParameters;\n\t\t}\n\n\t\t// Check if axiosParameters is an object\n\t\tif (typeof axiosParameters === \"object\")\n\t\t{\n\t\t\t// And then copies the its properties into axiosCallObj\n\t\t\tfor (var prop in axiosParameters) axiosCallObj[prop] = axiosParameters[prop];\n\t\t}\n\n\t\t// Perform the ajax call via axios\n\t\treturn axios(axiosCallObj);\n\t}\n};\n\n","/**\n * Copyright (C) 2022 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n * \n * @usage:\n * Preperations:\n * Be sure to have PrimeVue loaded with the toast and confirmdialog\n * components as primevue variable\n * Install:\n * Import this Plugin and install it with the app.use() function.\n * Use:\n * In your component you can call now the global property $fhcAlert\n * which has the following functions:\n * \n * alertSuccess\n * ------------\n * Displays a success message\n * @param string\tmessage\n * @return void\n * \n * alertInfo\n * ---------\n * Displays an info message\n * @param string\tmessage\n * @return void\n * \n * alertWarning\n * ------------\n * Displays a warning\n * @param string\tmessage\n * @return void\n * \n * alertError\n * ----------\n * Displays an error\n * @param string\tmessage\n * @return void\n * \n * alertSystemError\n * ----------------\n * Displays an alert with the error details and a button to mail\n * the error to the Support Team\n * @param string\tmessage\n * @return void\n * \n * confirmDelete\n * -------------\n * Displays a confirmation dialog and returns a Promise which resolves\n * with true or false depending und the pressed button.\n * @return Promise\n * \n * alertDefault\n * ------------\n * Displays an alert\n * @param string\tseverity\t\tcan be 'success', 'info', 'warning', 'error'\n * @param string\ttitle\n * @param string\tmessage\n * @param boolean\tsticky\t\t\t(optional) defaults to false\n * @return void\n * \n * alertMultiple\n * -------------\n * Displays multiple alerts\n * @param array\t\tmessageArray\n * @param string\tseverity\t\t(optional) defaults to 'info'\n * @param string\ttitle\t\t\t(optional) defaults to 'Info'\n * @param boolean\tsticky\t\t\t(optional) defaults to false\n * @return void\n * \n * handleSystemError\n * -----------------\n * Automatiticly determine how to display an system error and display it.\n * This would be used in a catch block of an ajax call.\n * @param mixed\t\terror\n * @return void\n * \n * handleSystemMessage\n * -------------------\n * Automatiticly determine how to display a message and display it.\n * @param mixed\t\tmessage\n * @return void\n */\nimport PvConfig from \"../../../index.ci.php/public/js/components/primevue/config/config.esm.min.js\";\nimport PvToast from \"../../../index.ci.php/public/js/components/primevue/toast/toast.esm.min.js\";\nimport PvConfirm from \"../../../index.ci.php/public/js/components/primevue/confirmdialog/confirmdialog.esm.min.js\";\nimport PvConfirmationService from \"../../../index.ci.php/public/js/components/primevue/confirmationservice/confirmationservice.esm.min.js\";\nimport FhcPhrasen from \"./Phrasen.js\";\n\nimport {CoreRESTClient} from '../RESTClient.js';\n\nconst helperAppContainer = document.createElement('div');\n\nconst helperApp = Vue.createApp({\n\tname: \"FhcAlertApp\",\n\tcomponents: {\n\t\tPvToast,\n\t\tPvConfirm\n\t},\n\tmethods: {\n\t\tmailToUrl(slotProps) {\n\t\t\tlet mailTo = FHC_JS_DATA_STORAGE_OBJECT.systemerror_mailto;\n\t\t\tlet subject = 'Meldung%20Systemfehler';\n\t\t\tlet body = `\n\t\t\t\tDanke, dass Sie uns den Fehler melden. %0D%0A %0D%0A\n\t\t\t\tBitte beschreiben Sie uns ausführlich das Problem.%0D%0A\n\t\t\t\tBsp: Ich habe X ausgewählt und Y angelegt. Beim Speichern erhielt ich die Fehlermeldung. [Optional: Ich habe den Browser Z verwendet.]%0D%0A\n\t\t\t\t-----------------------------------------------------------------------------------------------------------------------------------%0D%0A\n\t\t\t\tPROBLEM: ... %0D%0A %0D%0A %0D%0A\n\n\t\t\t\t-----------------------------------------------------------------------------------------------------------------------------------%0D%0A\n\t\t\t\tFehler URL: ` + FHC_JS_DATA_STORAGE_OBJECT.called_path + '/' + FHC_JS_DATA_STORAGE_OBJECT.called_method + `%0D%0A\n\t\t\t\tFehler Meldung: ` + slotProps.message.detail + `%0D%0A\n\t\t\t\t-----------------------------------------------------------------------------------------------------------------------------------%0D%0A %0D%0A\n\t\t\t\tWir kümmern uns um eine rasche Behebung des Problems!`\n\n\t\t\treturn \"mailto:\" + mailTo + \"?subject=\" + subject + \"&body=\" + body;\n\t\t},\n\t\topenMessagecard(e) {\n\t\t\tbootstrap.Collapse.getOrCreateInstance(e.target.getAttribute('href')).toggle();\n\t\t}\n\t},\n\tunmounted() {\n\t\thelperAppContainer.parentElement.removeChild(helperAppContainer);\n\t},\n\tcomputed: {\n\t\tshowmaillink: function() {\n\t\t\treturn FHC_JS_DATA_STORAGE_OBJECT.systemerror_mailto !== '';\n\t\t}\n\t},\n\ttemplate: /* html */`\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t`\n});\n\nhelperApp.use(PvConfig);\nhelperApp.use(PvConfirmationService);\n//helperApp.use(FhcPhrasen);\n\nconst helperAppInstance = helperApp.mount(helperAppContainer);\n\ndocument.body.appendChild(helperAppContainer);\n\n\nexport default {\n\tinstall: (app, options) => {\n\t\tif (!app.config.globalProperties.$p)\n\t\t\tapp.use(FhcPhrasen);\n\n\t\tconst $fhcAlert = {\n\t\t\talertSuccess(message) {\n\t\t\t\tif (Array.isArray(message))\n\t\t\t\t\treturn message.forEach(this.alertSuccess);\n\t\t\t\thelperAppInstance.$refs.toast.add({ severity: 'success', summary: 'Info', detail: message, life: 1000});\n\t\t\t},\n\t\t\talertInfo(message) {\n\t\t\t\tif (Array.isArray(message))\n\t\t\t\t\treturn message.forEach(this.alertInfo);\n\t\t\t\thelperAppInstance.$refs.toast.add({ severity: 'info', summary: 'Info', detail: message, life: 3000 });\n\t\t\t},\n\t\t\talertWarning(message) {\n\t\t\t\tif (Array.isArray(message))\n\t\t\t\t\treturn message.forEach(this.alertWarning);\n\t\t\t\thelperAppInstance.$refs.toast.add({ severity: 'warn', summary: 'Achtung', detail: message});\n\t\t\t},\n\t\t\talertError(message) {\n\t\t\t\tif (Array.isArray(message))\n\t\t\t\t\treturn message.forEach(this.alertError);\n\t\t\t\thelperAppInstance.$refs.toast.add({ severity: 'error', summary: 'Achtung', detail: message });\n\t\t\t},\n\t\t\talertSystemError(message) {\n\t\t\t\t//TODO(Manu) for translation of content of template: restructure in data\n\t\t\t\t//and update definitions with translations\n\n\t\t\t\tif (Array.isArray(message))\n\t\t\t\t\treturn message.forEach(this.alertSystemError);\n\t\t\t\thelperAppInstance.$refs.alert.add({\n\t\t\t\t\tseverity: 'error',\n\t\t\t\t\tsummary: Vue.computed(() => app.config.globalProperties.$p.t('alert/systemerror')),\n\t\t\t\t\tdetail: message});\n\t\t\t},\n\t\t\tconfirmDelete() {\n\t\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\t\thelperAppInstance.$confirm.require({\n\t\t\t\t\t\tgroup: 'fhcAlertConfirm',\n\t\t\t\t\t\theader: Vue.computed(() => app.config.globalProperties.$p.t('alert/attention')),\n\t\t\t\t\t\tmessage: Vue.computed(() => app.config.globalProperties.$p.t('alert/confirm_delete')),\n\t\t\t\t\t\tacceptLabel: Vue.computed(() => app.config.globalProperties.$p.t('ui/loeschen')),\n\t\t\t\t\t\tacceptClass: 'p-button-danger',\n\t\t\t\t\t\trejectLabel: Vue.computed(() => app.config.globalProperties.$p.t('ui/abbrechen')),\n\t\t\t\t\t\trejectClass: 'p-button-secondary',\n\t\t\t\t\t\taccept() {\n\t\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t\t},\n\t\t\t\t\t\treject() {\n\t\t\t\t\t\t\tresolve(false);\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t},\n\t\t\tconfirm(options) {\n\t\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\t\thelperAppInstance.$confirm.require({\n\t\t\t\t\t\tgroup: options?.group ?? 'fhcAlertConfirm',\n\t\t\t\t\t\theader: options?.header ?? Vue.computed(() => app.config.globalProperties.$p.t('alert/attention')),\n\t\t\t\t\t\tmessage: options?.message ?? '',\n\t\t\t\t\t\tacceptLabel: options?.acceptLabel ?? 'Ok',\n\t\t\t\t\t\tacceptClass: options?.acceptClass ?? 'btn btn-primary',\n\t\t\t\t\t\trejectLabel: options?.rejectLabel ?? Vue.computed(() => app.config.globalProperties.$p.t('ui/abbrechen')),\n\t\t\t\t\t\trejectClass: options?.rejectClass ?? 'btn btn-outline-secondary',\n\t\t\t\t\t\taccept() {\n\t\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t\t},\n\t\t\t\t\t\treject() {\n\t\t\t\t\t\t\tresolve(false);\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t},\n\t\t\talertDefault(severity, title, message, sticky = false, html = false) {\n\t\t\t\tlet options = { severity: severity, summary: title, detail: message, html };\n\t\t\t\t\n\t\t\t\tif (!sticky)\n\t\t\t\t\toptions.life = 3000;\n\n\t\t\t\thelperAppInstance.$refs.toast.add(options);\n\t\t\t},\n\t\t\talertMultiple(messageArray, severity = 'info', title = 'Info', sticky = false, html = false){\n\t\t\t\t// Check, if array has only string values\n\t\t\t\tif (messageArray.every(message => typeof message === 'string')) {\n\t\t\t\t\tmessageArray.forEach(message => this.alertDefault(severity, title, message, sticky, html));\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\thandleSystemError(error) {\n\t\t\t\t// don't show an error message to the user if the error was an aborted request\n\t\t\t\tif(error.hasOwnProperty('name') && error.name.toLowerCase() === \"AbortError\".toLowerCase())\n\t\t\t\t\treturn;\n\t\t\t\t\n\t\t\t\t// Error is string\n\t\t\t\tif (typeof error === 'string')\n\t\t\t\t\treturn $fhcAlert.alertSystemError(error);\n\n\t\t\t\t// Error is array of strings\n\t\t\t\tif (Array.isArray(error) && error.every(err => typeof err === 'string'))\n\t\t\t\t\treturn error.every($fhcAlert.alertSystemError);\n\n\t\t\t\t// Error has been handled already\n\t\t\t\tif (error.hasOwnProperty('handled') && error.handled)\n\t\t\t\t\treturn;\n\t\t\t\t\n\t\t\t\t// Error is object\n\t\t\t\tif (typeof error === 'object' && error !== null) {\n\t\t\t\t\tlet errMsg = '';\n\n\n\t\t\t\t\tif (error.hasOwnProperty('response') && error.response?.data?.retval)\n\t\t\t\t\t\terrMsg += 'Error Message: ' + (error.response.data.retval.message || error.response.data.retval) + '\\r\\n';\n\t\t\t\t\telse if (error.hasOwnProperty('message'))\n\t\t\t\t\t\terrMsg += 'Error Message: ' + error.message.toUpperCase() + '\\r\\n';\n\n\t\t\t\t\tif (error.hasOwnProperty('config') && error.config.hasOwnProperty('url'))\n\t\t\t\t\t\terrMsg += 'Error ConfigURL: ' + error.config.url + '\\r\\n';\n\n\t\t\t\t\tif (error.hasOwnProperty('stack'))\n\t\t\t\t\t\terrMsg += 'Error Stack: ' + error.stack + '\\r\\n';\n\t\t\t\t\t\n\t\t\t\t\t// Fallback object error message\n\t\t\t\t\tif (errMsg == '')\n\t\t\t\t\t\terrMsg = 'Error Message: ' + JSON.stringify(error) + '\\r\\n';\n\n\t\t\t\t\terrMsg += 'Error Controller Path: ' + FHC_JS_DATA_STORAGE_OBJECT.called_path + '/' + FHC_JS_DATA_STORAGE_OBJECT.called_method;\n\n\t\t\t\t\treturn $fhcAlert.alertSystemError(errMsg);\n\t\t\t\t}\n\n\t\t\t\t// Fallback\n\t\t\t\t$fhcAlert.alertSystemError('alertSystemError throws Generic Error\\r\\nError Controller Path: ' + FHC_JS_DATA_STORAGE_OBJECT.called_path + '/' + FHC_JS_DATA_STORAGE_OBJECT.called_method);\n\t\t\t},\n\t\t\thandleSystemMessage(message) {\n\t\t\t\t// Message is string\n\t\t\t\tif (typeof message === 'string')\n\t\t\t\t\treturn $fhcAlert.alertWarning(message);\n\n\t\t\t\t// Message is array of strings\n\t\t\t\tif (Array.isArray(message)) {\n\t\t\t\t\t// If Array has only Strings\n\t\t\t\t\tif (message.every(msg => typeof msg === 'string'))\n\t\t\t\t\t\treturn message.every($fhcAlert.alertWarning);\n\n\t\t\t\t\t// If Array has only Objects\n\t\t\t\t\tif (message.every(msg => typeof msg === 'object') && msg !== null) {\n\t\t\t\t\t\treturn message.every(msg => {\n\t\t\t\t\t\t\tif (msg.hasOwnProperty('data') && msg.data.hasOwnProperty('retval')) {\n\t\t\t\t\t\t\t\t$fhcAlert.alertWarning(JSON.stringify(msg.data.retval));\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t$fhcAlert.alertSystemError(JSON.stringify(msg));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Message is Object with data property\n\t\t\t\tif (typeof message === 'object' && message !== null){\n\t\t\t\t\tif (message.hasOwnProperty('data') && message.data.hasOwnProperty('retval')) {\n\t\t\t\t\t\t// NOTE(chris): changed: alertSystemError => alertWarning\n\t\t\t\t\t\t$fhcAlert.alertWarning(JSON.stringify(message.data.retval));\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$fhcAlert.alertSystemError(JSON.stringify(message));\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Fallback\n\t\t\t\t$fhcAlert.alertSystemError('alertSystemError throws Generic Error\\r\\nError Controller Path: ' + FHC_JS_DATA_STORAGE_OBJECT.called_path + '/' + FHC_JS_DATA_STORAGE_OBJECT.called_method);\n\t\t\t},\n\t\t\tresetFormValidation(form) {\n\t\t\t\tconst event = new Event('fhc-form-reset');\n\t\t\t\tform.querySelectorAll(['[data-fhc-form-validate],[data-fhc-form-error]']).forEach(el => el.dispatchEvent(event));\n\t\t\t\t/*const alert = form.querySelector('div.alert.alert-danger[role=\"alert\"]');\n\t\t\t\tif (alert) {\n\t\t\t\t\talert.innerHTML = '';\n\t\t\t\t\talert.classList.add('d-none');\n\t\t\t\t}\n\t\t\t\tform.querySelectorAll('.invalid-feedback').forEach(n => n.remove());\n\t\t\t\tform.querySelectorAll('.is-invalid').forEach(n => n.classList.remove('is-invalid'));\n\t\t\t\tform.querySelectorAll('.is-valid').forEach(n => n.classList.remove('is-valid'));*/\n\t\t\t},\n\t\t\thandleFormValidation(error, form) {\n\t\t\t\tif (form === undefined) {\n\t\t\t\t\tif (error && error.nodeType === Node.ELEMENT_NODE)\n\t\t\t\t\t\treturn err => $fhcAlert.handleFormValidation(err, error);\n\t\t\t\t} else {\n\t\t\t\t\tif (error?.response?.status == 400) {\n\t\t\t\t\t\tlet errors = CoreRESTClient.getError(error.response.data);\n\t\t\t\t\t\tif (typeof errors !== \"object\")\n\t\t\t\t\t\t\terrors = error.response.data;\n\n\t\t\t\t\t\t// NOTE(chris): reset form validation\n\t\t\t\t\t\t$fhcAlert.resetFormValidation(form);\n\t\t\t\t\t\t\n\t\t\t\t\t\t// NOTE(chris): set form input validation\n\t\t\t\t\t\tconst notFound = Object.entries(errors).filter(([key, detail]) => {\n\t\t\t\t\t\t\tconst input = form.querySelector('[data-fhc-form-validate=\"' + key + '\"]');\n\t\t\t\t\t\t\tif (!input)\n\t\t\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t\t\tinput.dispatchEvent(new CustomEvent('fhc-form-invalidate', {detail}));\n\n\t\t\t\t\t\t\t/*const input = form.querySelector('[name=\"' + key + '\"]');\n\t\t\t\t\t\t\tif (!input)\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\tinput.classList.add('is-invalid');\n\t\t\t\t\t\t\tconst feedback = document.createElement('div');\n\t\t\t\t\t\t\tfeedback.classList.add('invalid-feedback');\n\t\t\t\t\t\t\tfeedback.innerHTML = detail;\n\t\t\t\t\t\t\tinput.after(feedback);*/\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}).map(arr => arr[1]);\n\n\n\t\t\t\t\t\t//const alert = form.querySelector('div.alert.alert-danger[role=\"alert\"]');\n\t\t\t\t\t\tconst alert = form.querySelector('[data-fhc-form-error]');\n\t\t\t\t\t\tif (alert && notFound.length) {\n\t\t\t\t\t\t\talert.dispatchEvent(new CustomEvent('fhc-form-error', {detail: notFound}));\n\t\t\t\t\t\t\t/*notFound.forEach(txt => {\n\t\t\t\t\t\t\t\tconst p = document.createElement('p');\n\t\t\t\t\t\t\t\tp.innerHTML = txt;\n\t\t\t\t\t\t\t\talert.append(p);\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tif (notFound.length) {\n\t\t\t\t\t\t\t\talert.lastChild.classList.add('mb-0');\n\t\t\t\t\t\t\t\talert.classList.remove('d-none');\n\t\t\t\t\t\t\t}*/\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnotFound.forEach($fhcAlert.alertError);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (error?.response?.status == 400) {\n\t\t\t\t\tlet errors = CoreRESTClient.getError(error.response.data);\n\t\t\t\t\t$fhcAlert.alertError((typeof errors === 'object') ? Object.values(errors) : errors);\n\t\t\t\t} else {\n\t\t\t\t\t$fhcAlert.handleSystemError(error);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tapp.config.globalProperties.$fhcAlert = $fhcAlert;\n\t\tapp.provide('$fhcAlert', app.config.globalProperties.$fhcAlert);\n\t}\n}","import FhcAlert from './FhcAlert.js';\n\n\nexport default {\n\tinstall: (app, options) => {\n\t\tif (app.config.globalProperties.$api) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!app.config.globalProperties.$fhcAlert)\n\t\t\tapp.use(FhcAlert);\n\n\t\tfunction _send_array_or_object(errors, func) {\n\t\t\tif (Array.isArray(errors))\n\t\t\t\terrors.forEach(func);\n\t\t\telse\n\t\t\t\tObject.entries(errors).forEach(\n\t\t\t\t\t([title, errs]) => errs.forEach(\n\t\t\t\t\t\terror => func(error, title)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t}\n\t\tlet DEFAULT_ERROR_CONFIG = {\n\t\t\tsuccess: true,\n\t\t\tfail: true,\n\t\t\tcombine: {\n\t\t\t\tform: ['validation', 'general'],\n\t\t\t\ttoast: ['validation', 'general', 'not_found', 'site_failed']\n\t\t\t},\n\t\t\thandler: {\n\t\t\t\tform(form, errors) {\n\t\t\t\t\tform.clearValidation();\n\t\t\t\t\terrors.forEach(err => form.setFeedback(\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\terr.messages || err.message\n\t\t\t\t\t));\n\t\t\t\t},\n\t\t\t\tasync toast(errors) {\n\t\t\t\t\tconst $p = app.config.globalProperties.$p;\n\t\t\t\t\tif (!$p)\n\t\t\t\t\t\treturn Promise.reject('Phrasen plugin not loaded!');\n\t\t\t\t\n\t\t\t\t\tasync function _format_toast(errors) {\n\t\t\t\t\t\terrors = errors.reduce((result, err) => {\n\t\t\t\t\t\t\tswitch (err.type) {\n\t\t\t\t\t\t\tcase 'not_found':\n\t\t\t\t\t\t\tcase 'site_failed':\n\t\t\t\t\t\t\t\tif (err.message)\n\t\t\t\t\t\t\t\t\tresult[err.message] = [err.url];\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tresult._default = [err.url];\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'general':\n\t\t\t\t\t\t\t\tif (!result._default)\n\t\t\t\t\t\t\t\t\tresult._default = [];\n\t\t\t\t\t\t\t\tresult._default.push(err.message);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'validation':\n\t\t\t\t\t\t\t\tObject.entries(err.messages)\n\t\t\t\t\t\t\t\t\t.forEach(([field, msg]) => {\n\t\t\t\t\t\t\t\t\t\tif (!result[field])\n\t\t\t\t\t\t\t\t\t\t\tresult[field] = [];\n\t\t\t\t\t\t\t\t\t\tif (Array.isArray(msg))\n\t\t\t\t\t\t\t\t\t\t\tresult[field].push(...msg);\n\t\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\t\tresult[field].push(msg);\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t}, {});\n\t\t\t\t\t\tlet counter = 0;\n\t\t\t\t\t\tconst msgs = await Promise.all(Object.entries(errors)\n\t\t\t\t\t\t\t.sort((a, b) => ['_default'].indexOf(b[0]) - ['_default'].indexOf(a[0])) // sort _default first\n\t\t\t\t\t\t\t.map(async ([field, msgs]) => {\n\t\t\t\t\t\t\t\tif (field == '_default') {\n\t\t\t\t\t\t\t\t\tawait $p.loadCategory('dashboard');\n\t\t\t\t\t\t\t\t\tconst general = $p.t('dashboard/general');\n\t\t\t\t\t\t\t\t\tfield = '
    ' + general + '
    ';\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tfield = '
    ' + field + '
    ';\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tcounter += msgs.length;\n\t\t\t\t\t\t\t\treturn field\n\t\t\t\t\t\t\t\t\t+ '
    '\n\t\t\t\t\t\t\t\t\t+ msgs.join('
    ')\n\t\t\t\t\t\t\t\t\t+ '
    ';\n\t\t\t\t\t\t\t}));\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcounter,\n\t\t\t\t\t\t\tmsgs\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlet counter, msgs;\n\t\t\t\t\tif (Array.isArray(errors)) {\n\t\t\t\t\t\t({ counter, msgs } = await _format_toast(errors));\n\t\t\t\t\t} else {\n\t\t\t\t\t\t({ counter, msgs } = await Object.entries(errors)\n\t\t\t\t\t\t\t.reduce(async (res, [title, errs]) => {\n\t\t\t\t\t\t\t\tconst result = await res;\n\t\t\t\t\t\t\t\tconst { counter, msgs } = await _format_toast(errs);\n\t\t\t\t\t\t\t\tresult.counter += counter;\n\t\t\t\t\t\t\t\tresult.msgs.push('
    '\n\t\t\t\t\t\t\t\t\t+ title\n\t\t\t\t\t\t\t\t\t+ '
    '\n\t\t\t\t\t\t\t\t\t+ msgs.join('')\n\t\t\t\t\t\t\t\t\t+ '
    ');\n\t\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t\t}, Promise.resolve({ counter: 0, msgs: []})));\n\t\t\t\t\t}\n\n\t\t\t\t\tawait $p.loadCategory('ui');\n\t\t\t\t\tconst n_errors = $p.t('ui/n_errors', { n: counter });\n\n\t\t\t\t\tapp.config.globalProperties.$fhcAlert.alertDefault(\n\t\t\t\t\t\t'error',\n\t\t\t\t\t\tn_errors,\n\t\t\t\t\t\t'
    ' + msgs.join('') + '
    ',\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\tphp(errors) {\n\t\t\t\t\t_send_array_or_object(errors, (error, title) => {\n\t\t\t\t\t\tvar message = '';\n\t\t\t\t\t\tmessage += 'Message: ' + error.message + '\\n\\n';\n\t\t\t\t\t\tmessage += 'Filename: ' + error.filename + '\\n';\n\t\t\t\t\t\tmessage += 'Line Number: ' + error.line + '\\n';\n\t\t\t\t\t\tif (error.backtrace && error.backtrace.length) {\n\t\t\t\t\t\t\tmessage += '\\nBacktrace: ';\n\t\t\t\t\t\t\terror.backtrace.forEach(err => {\n\t\t\t\t\t\t\t\tmessage += '\\n\\tFile: ' + err.file + '\\n';\n\t\t\t\t\t\t\t\tmessage += '\\tLine: ' + err.line + '\\n';\n\t\t\t\t\t\t\t\tmessage += '\\tFunction: ' + err.function + '\\n';\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tswitch (error.severity) {\n\t\t\t\t\t\t\tcase 'Warning':\n\t\t\t\t\t\t\tcase 'Core Warning':\n\t\t\t\t\t\t\tcase 'Compile Warning':\n\t\t\t\t\t\t\tcase 'User Warning':\n\t\t\t\t\t\t\t\tif (title)\n\t\t\t\t\t\t\t\t\ttitle += ': PHP ' + error.severity;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\ttitle = 'PHP ' + error.severity;\n\t\t\t\t\t\t\t\tapp.config.globalProperties.$fhcAlert.alertDefault('warn', title, message, true);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'Notice':\n\t\t\t\t\t\t\tcase 'User Notice':\n\t\t\t\t\t\t\tcase 'Runtime Notice':\n\t\t\t\t\t\t\t\tif (title)\n\t\t\t\t\t\t\t\t\ttitle += ': PHP ' + error.severity;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\ttitle = 'PHP ' + error.severity;\n\t\t\t\t\t\t\t\tapp.config.globalProperties.$fhcAlert.alertDefault('info', title, message, true);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tmessage = 'Type: PHP ' + error.severity + '\\n\\n' + message;\n\t\t\t\t\t\t\t\tif (title)\n\t\t\t\t\t\t\t\t\tmessage = title + '\\n\\n' + message;\n\t\t\t\t\t\t\t\tapp.config.globalProperties.$fhcAlert.alertSystemError(message);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\texception(errors) {\n\t\t\t\t\t_send_array_or_object(errors, (error, title) => {\n\t\t\t\t\t\tvar message = '';\n\t\t\t\t\t\tif (title)\n\t\t\t\t\t\t\tmessage += title + '\\n\\n';\n\t\t\t\t\t\tmessage += 'Type: ' + error.class + '\\n\\n';\n\t\t\t\t\t\tmessage += 'Message: ' + error.message + '\\n\\n';\n\t\t\t\t\t\tmessage += 'Filename: ' + error.filename + '\\n';\n\t\t\t\t\t\tmessage += 'Line Number: ' + error.line + '\\n';\n\t\t\t\t\t\tif (error.backtrace && error.backtrace.length) {\n\t\t\t\t\t\t\tmessage += '\\nBacktrace: ';\n\t\t\t\t\t\t\terror.backtrace.forEach(err => {\n\t\t\t\t\t\t\t\tmessage += '\\n\\tFile: ' + err.file + '\\n';\n\t\t\t\t\t\t\t\tmessage += '\\tLine: ' + err.line + '\\n';\n\t\t\t\t\t\t\t\tmessage += '\\tFunction: ' + err.function + '\\n';\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tapp.config.globalProperties.$fhcAlert.alertSystemError(message);\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tdb(errors) {\n\t\t\t\t\t_send_array_or_object(errors, (error, title) => {\n\t\t\t\t\t\tvar message = '';\n\t\t\t\t\t\tif (title)\n\t\t\t\t\t\t\tmessage += title + '\\n\\n';\n\t\t\t\t\t\tif (error.heading !== undefined)\n\t\t\t\t\t\t\tmessage += error.heading + '\\n\\n';\n\t\t\t\t\t\tif (error.code !== undefined)\n\t\t\t\t\t\t\tmessage += 'Code: ' + error.code + '\\n\\n';\n\t\t\t\t\t\tif (error.sql !== undefined)\n\t\t\t\t\t\t\tmessage += 'SQL: ' + error.sql + '\\n\\n';\n\t\t\t\t\t\tif (error.message !== undefined)\n\t\t\t\t\t\t\tmessage += 'Message: ' + error.message + '\\n\\n';\n\t\t\t\t\t\telse if (error.messages !== undefined)\n\t\t\t\t\t\t\tmessage += 'Messages: ' + error.messages.join('\\n\\t') + '\\n\\n';\n\t\t\t\t\t\tif (error.filename !== undefined)\n\t\t\t\t\t\t\tmessage += 'Filename: ' + error.filename + '\\n';\n\t\t\t\t\t\tif (error.line !== undefined)\n\t\t\t\t\t\t\tmessage += 'Line Number: ' + error.line + '\\n';\n\n\t\t\t\t\t\tapp.config.globalProperties.$fhcAlert.alertSystemError(message);\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tauth(errors) {\n\t\t\t\t\t_send_array_or_object(errors, (error, title) => {\n\t\t\t\t\t\tif (title)\n\t\t\t\t\t\t\ttitle += ': ' + error.message;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\ttitle = error.message;\n\n\t\t\t\t\t\tvar message = '';\n\t\t\t\t\t\tmessage += 'Controller name: ' + error.controller + '\\n';\n\t\t\t\t\t\tmessage += 'Method name: ' + error.method + '\\n';\n\t\t\t\t\t\tmessage += 'Required permissions: ' + error.required_permissions;\n\n\t\t\t\t\t\tapp.config.globalProperties.$fhcAlert.alertDefault(\n\t\t\t\t\t\t\t'error',\n\t\t\t\t\t\t\ttitle,\n\t\t\t\t\t\t\tmessage,\n\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tif (options?.errorHandling !== undefined)\n\t\t\tDEFAULT_ERROR_CONFIG = _merge_error_config(options.errorHandling);\n\t\t\n\t\tfunction get_config(form, uri, data, config) {\n\t\t\tif (typeof form == 'string' && config === undefined) {\n\t\t\t\t[uri, data, config] = [form, uri, data];\n\t\t\t\tform = undefined;\n\t\t\t} else if (form) {\n\t\t\t\tif (typeof form != 'object')\n\t\t\t\t\tthrow new TypeError('Parameter 1 of _get_config must be an object or a string');\n\t\t\t\tif (uri === undefined && data === undefined && config === undefined) {\n\t\t\t\t\tconfig = form;\n\t\t\t\t\tform = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (form) {\n\t\t\t\t// NOTE(chris): check if form is fhc-form\n\t\t\t\tif (!form.clearValidation || !form.setFeedback)\n\t\t\t\t\tthrow new TypeError(\"'form' is not a Form Component\");\n\n\t\t\t\tform = {\n\t\t\t\t\tclearValidation: form.clearValidation,\n\t\t\t\t\tsetFeedback: form.setFeedback\n\t\t\t\t};\n\n\t\t\t\tif (config)\n\t\t\t\t\tconfig.form = form;\n\t\t\t\telse\n\t\t\t\t\tconfig = {form};\n\t\t\t}\n\n\t\t\treturn [uri, data, config];\n\t\t}\n\t\tfunction clean_return_value(response) {\n\t\t\tif (typeof response.data === 'string' || response.data instanceof String)\n\t\t\t\treturn clean_return_value({ data: response });\n\n\t\t\tconst result = response.data;\n\t\t\tdelete response.data;\n\t\t\tif (!result)\n\t\t\t\treturn {meta: {response}, data: null};\n\t\t\tif (!result.meta)\n\t\t\t\tresult.meta = { response };\n\t\t\telse\n\t\t\t\tresult.meta.response = response;\n\t\t\treturn result;\n\t\t}\n\t\tfunction _merge_error_config(config) {\n\t\t\tif (config === false || config === 'off')\n\t\t\t\treturn { ...DEFAULT_ERROR_CONFIG, success: false, fail: false };\n\t\t\t\n\t\t\tif (!config || config === true)\n\t\t\t\treturn { ...DEFAULT_ERROR_CONFIG };\n\n\t\t\tif (config === 'success')\n\t\t\t\treturn { ...DEFAULT_ERROR_CONFIG, fail: false };\n\t\t\t\n\t\t\tif (config === 'fail')\n\t\t\t\treturn { ...DEFAULT_ERROR_CONFIG, success: false };\n\t\t\t\n\t\t\tconst { success, fail, handler, combine } = config;\n\t\t\t\n\t\t\tconfig = { ...DEFAULT_ERROR_CONFIG };\n\n\t\t\tObject.entries({ fail, success }).forEach(([key, value]) => {\n\t\t\t\tif (value !== undefined)\n\t\t\t\t\tconfig[key] = value;\n\t\t\t});\n\t\t\tObject.entries({ handler, combine }).forEach(([key, value]) => {\n\t\t\t\tif (value !== undefined)\n\t\t\t\t\tconfig[key] = { ...config[key], ...value };\n\t\t\t});\n\n\t\t\treturn config;\n\t\t}\n\t\tfunction get_error_handler(config) {\n\t\t\tconst result = _merge_error_config(config?.errorHandling);\n\n\t\t\tif (!config?.form) {\n\t\t\t\tresult.combine = { ...result.combine, form: [] };\n\t\t\t} else {\n\t\t\t\tconst formHandler = result.handler.form;\n\t\t\t\tresult.handler = { ...result.handler, form: errors => formHandler(config.form, errors) };\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\t\tfunction get_error_list(error) {\n\t\t\tif (error.response) {\n\t\t\t\tif (error.response.status == 404) {\n\t\t\t\t\treturn [{\n\t\t\t\t\t\ttype: 'not_found',\n\t\t\t\t\t\tmessage: error.message,\n\t\t\t\t\t\turl: error.request.responseURL\n\t\t\t\t\t}];\n\t\t\t\t} else {\n\t\t\t\t\tif (error.response.data.errors == undefined) return [];\n\t\t\t\t\treturn error.response.data.errors;\n\t\t\t\t}\n\t\t\t} else if (error.request) {\n\t\t\t\treturn [{\n\t\t\t\t\ttype: 'site_failed',\n\t\t\t\t\tmessage: error.message,\n\t\t\t\t\turl: error.request.responseURL\n\t\t\t\t}];\n\t\t\t} else {\n\t\t\t\treturn [{\n\t\t\t\t\ttype: 'script',\n\t\t\t\t\tmessage: error.message\n\t\t\t\t}];\n\t\t\t}\n\t\t}\n\t\tfunction popHandleableErrors(errorHandling, errors) {\n\t\t\tconst result = {};\n\t\t\tconst copy = [];\n\n\t\t\tif (errors == undefined) return {};\n\n\t\t\twhile (errors.length)\n\t\t\t\tcopy.push(errors.pop());\n\t\t\tfor (var error of copy) {\n\t\t\t\tlet type = error.type;\n\t\t\t\tlet newType = null;\n\t\t\t\tfor (var t in errorHandling.combine) {\n\t\t\t\t\tlet newTypeCombinesType = errorHandling\n\t\t\t\t\t\t.combine[t]\n\t\t\t\t\t\t.includes(type);\n\t\t\t\t\tlet newTypeHasHandler = errorHandling.handler[t];\n\t\t\t\t\tif (newTypeCombinesType && newTypeHasHandler) {\n\t\t\t\t\t\tnewType = t;\n\t\t\t\t\t\tif (newType == 'form')\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (newType)\n\t\t\t\t\ttype = newType;\n\t\t\t\tconst handler = errorHandling.handler[type];\n\t\t\t\tif (handler) {\n\t\t\t\t\tif (!result[type])\n\t\t\t\t\t\tresult[type] = [];\n\t\t\t\t\tif (Array.isArray(error))\n\t\t\t\t\t\tresult[type].push(...error);\n\t\t\t\t\telse\n\t\t\t\t\t\tresult[type].push(error);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\terrors.push(error);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t\t\n\t\t\n\t\tconst fhcApiAxios = axios.create({\n\t\t\ttimeout: 500000,\n\t\t\tbaseURL: FHC_JS_DATA_STORAGE_OBJECT.app_root\n\t\t\t\t+ FHC_JS_DATA_STORAGE_OBJECT.ci_router\n\t\t\t\t+ \"/\"\n\t\t});\n\n\t\tfhcApiAxios.interceptors.request.use(config => {\n\t\t\tif (config.method != 'post' || !config.data)\n\t\t\t\treturn config;\n\n\t\t\tif (config.data instanceof FormData)\n\t\t\t\treturn config;\n\n\t\t\tif (!Object.values(config.data).every(item => {\n\t\t\t\tif (item instanceof FileList)\n\t\t\t\t\treturn false;\n\t\t\t\tif (Array.isArray(item))\n\t\t\t\t\treturn item.every(i => !(i instanceof File));\n\t\t\t\treturn true;\n\t\t\t})) {\n\t\t\t\tconst newData = Object.entries(config.data).reduce((nd, [key, item]) => {\n\t\t\t\t\tif (item instanceof FileList) {\n\t\t\t\t\t\tfor (const file of item)\n\t\t\t\t\t\t\tnd.FormData.append(key + (item.length > 1 ? '[]' : ''), file);\n\t\t\t\t\t} else if (Array.isArray(item)) {\n\t\t\t\t\t\tif (item.every(i => !(i instanceof File))) {\n\t\t\t\t\t\t\tnd.jsondata[key] = item;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\titem.forEach(file => nd.FormData.append(key + (item.length > 1 ? '[]' : ''), file));\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnd.jsondata[key] = item;\n\t\t\t\t\t}\n\t\t\t\t\treturn nd;\n\t\t\t\t}, {\n\t\t\t\t\tFormData: new FormData(),\n\t\t\t\t\tjsondata: {}\n\t\t\t\t});\n\t\t\t\tnewData.FormData.append('_jsondata', JSON.stringify(newData.jsondata));\n\t\t\t\tconfig.data = newData.FormData;\n\t\t\t}\n\n\t\t\treturn config;\n\t\t});\n\n\t\tfhcApiAxios.interceptors.response.use(\n\t\t\tresponse => {\n\t\t\t\tif (response.config?.errorHandling == 'off'\n\t\t\t\t\t|| response.config?.errorHandling === false\n\t\t\t\t\t|| response.config?.errorHandling == 'fail')\n\t\t\t\t\treturn clean_return_value(response);\n\n\t\t\t\t// NOTE(chris): loop through errors\n\t\t\t\tif (response.data.errors)\n\t\t\t\t\tresponse.data.errors = response.data.errors.filter(\n\t\t\t\t\t\terr => (response.config[err.type + 'ErrorHandler'] || app.config.globalProperties.$api._defaultErrorHandlers[err.type])(err, response.config)\n\t\t\t\t\t);\n\n\t\t\t\treturn clean_return_value(response);\n\t\t\t},\n\t\t\terror => {\n\t\t\t\tif (error.code == 'ERR_CANCELED')\n\t\t\t\t\treturn Promise.reject({ handled: true, ...error });\n\n\t\t\t\tconst errorConfig = get_error_handler(error.config);\n\n\t\t\t\tif (!errorConfig.fail)\n\t\t\t\t\treturn Promise.reject(error);\n\n\t\t\t\tconst remaining = get_error_list(error);\n\n\t\t\t\tconst errors = popHandleableErrors(errorConfig, remaining);\n\n\t\t\t\tfor (var type in errors) {\n\t\t\t\t\terrorConfig.handler[type](errors[type]);\n\t\t\t\t}\n\n\t\t\t\tif (remaining.length)\n\t\t\t\t\treturn Promise.reject(error);\n\t\t\t\t\n\t\t\t\treturn Promise.reject({ handled: true, ...error });\n\t\t\t}\n\t\t);\n\n\t\tapp.config.globalProperties.$api = {\n\t\t\tgetUri(url) {\n\t\t\t\treturn fhcApiAxios.getUri({url});\n\t\t\t},\n\t\t\tget(form, uri, params, config) {\n\t\t\t\t[uri, params, config] = get_config(form, uri, params, config);\n\t\t\t\tif (params) {\n\t\t\t\t\tif (config)\n\t\t\t\t\t\tconfig.params = params;\n\t\t\t\t\telse\n\t\t\t\t\t\tconfig = {params};\n\t\t\t\t}\n\t\t\t\treturn fhcApiAxios.get(uri, config);\n\t\t\t},\n\t\t\tpost(form, uri, data, config) {\n\t\t\t\t[uri, data, config] = get_config(form, uri, data, config);\n\t\t\t\treturn fhcApiAxios.post(uri, data, config);\n\t\t\t},\n\t\t\tcall(factory, configoverwrite, form) {\n\t\t\t\tif (Array.isArray(factory)) {\n\t\t\t\t\tconst $api = app.config.globalProperties.$api;\n\n\t\t\t\t\treturn Promise\n\t\t\t\t\t\t.allSettled(factory.map((config, index) => {\n\t\t\t\t\t\t\tif (!Array.isArray(config))\n\t\t\t\t\t\t\t\tconfig = ['#' + index, config];\n\t\t\t\t\t\t\treturn $api.call(config[1], {\n\t\t\t\t\t\t\t\terrorHeader: config[0],\n\t\t\t\t\t\t\t\terrorHandling: false\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}))\n\t\t\t\t\t\t.then(result => {\n\t\t\t\t\t\t\tconst [ , , config ] = get_config(form, undefined, undefined, configoverwrite || {});\n\t\t\t\t\t\t\tconst errorConfig = get_error_handler(config);\n\n\t\t\t\t\t\t\tif (!errorConfig.success && !errorConfig.fail) {\n\t\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst typedErrors = {};\n\t\t\t\t\t\t\tfor (var res of result) {\n\t\t\t\t\t\t\t\tconst [ allowed, item ] = res.status === 'fulfilled'\n\t\t\t\t\t\t\t\t\t? [ errorConfig.success, res.value ]\n\t\t\t\t\t\t\t\t\t: [ errorConfig.fail, res.reason ];\n\t\t\t\t\t\t\t\tif (!allowed)\n\t\t\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t\t\tconst errors = popHandleableErrors(errorConfig, get_error_list(item));\n\n\t\t\t\t\t\t\t\tfor (var type in errors) {\n\t\t\t\t\t\t\t\t\tif (!typedErrors[type])\n\t\t\t\t\t\t\t\t\t\ttypedErrors[type] = {\n\t\t\t\t\t\t\t\t\t\t\t[item.config.errorHeader]: errors[type]\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\ttypedErrors[type][item.config.errorHeader] = errors[type];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tfor (var errType in typedErrors) {\n\t\t\t\t\t\t\t\terrorConfig.handler[errType](typedErrors[errType]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tlet { method, url, params, config } = factory;\n\t\t\t\tif (configoverwrite !== undefined) {\n\t\t\t\t\tconfig = configoverwrite;\n\t\t\t\t}\n\t\t\t\tif (!method) {\n\t\t\t\t\tmethod = 'get';\n\t\t\t\t}\n\t\t\t\tif (method.toLowerCase)\n\t\t\t\t\tmethod = method.toLowerCase();\n\t\t\t\tif (method == 'get') {\n\t\t\t\t\treturn this.get(form, url, params, config);\n\t\t\t\t} else if (method == 'post') {\n\t\t\t\t\treturn this.post(form, url, params, config);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(\"FhcApi: method not allowed:\", method);\n\t\t\t\t}\n\t\t\t},\n\t\t\tgetErrorHandler(config) {\n\t\t\t\treturn get_error_handler(config);\n\t\t\t}\n\t\t};\n\n\t\tapp.provide('$api', app.config.globalProperties.$api);\n\t}\n};\n","/**\n * Copyright (C) 2025 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tloadCategory(category) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/phrasen/loadModule/' + category\n\t\t};\n\t},\n\tsetLanguage(categories,language) {\n\t\tconst params = {categories, language}\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/phrasen/setLanguage',\n\t\t\tparams\n\t\t};\n\t},\n\tgetLanguage() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/phrasen/getLanguage'\n\t\t};\n\t},\n\tgetActiveDbLanguages() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/phrasen/getAllLanguages'\n\t\t};\n\t}\n};","import OldFhcApi from '../plugin/OldFhcApi.js'; // TODO(chris): remove at some point\nimport PluginsApi from './Api.js';\nimport ApiPhrasen from '../api/factory/phrasen.js';\n\nconst categories = Vue.reactive({});\nconst loadingModules = {};\nlet user_language = Vue.ref(FHC_JS_DATA_STORAGE_OBJECT.user_language);\nexport let user_locale = Vue.computed(()=>{\n\tif(!user_language.value) return null;\n\treturn FHC_JS_DATA_STORAGE_OBJECT.server_languages.find(language => language.sprache == user_language.value).LC_Time;\n});\n\nfunction extractCategory(obj, category) {\n\treturn obj.filter(e => e.category == category).reduce((res, elem) => {\n\t\tif (!res[elem.phrase])\n\t\t\tres[elem.phrase] = elem.text;\n\t\treturn res;\n\t}, {});\n}\nfunction getValueForLoadedPhrase(category, phrase, params) {\n\tlet result = categories[category][phrase];\n\tif (!result)\n\t\treturn '<< PHRASE ' + phrase + '>>';\n\tif (params)\n\t\tresult = result.replace(/\\{([^}]*)\\}/g, (match, p1) => params[p1] === undefined ? match : params[p1]);\n\treturn result;\n}\n\nconst phrasen = {\n\tuser_language,\n\tuser_locale,\n\tsetLanguage(language) {\n\t\tconst catArray = Object.keys(categories)\n\t\treturn this.config.globalProperties.$api\n\t\t\t.call(ApiPhrasen.setLanguage(catArray, language))\n\t\t\t.then(res => {\n\t\t\t\tres.data.forEach(row => {\n\t\t\t\t\tcategories[row.category][row.phrase] = row.text\n\t\t\t\t})\n\n\t\t\t\t// update the reactive data that holds the current active user_language\n\t\t\t\tuser_language.value = language;\n\n\t\t\t\treturn res\n\t\t\t})\n\t},\n\tloadCategory(category) {\n\t\tif (Array.isArray(category))\n\t\t\treturn Promise.all(category.map(this.config.globalProperties\n\t\t\t\t.$p.loadCategory));\n\n\t\tif (!loadingModules[category])\n\t\t\tloadingModules[category] = this.config.globalProperties.$api\n\t\t\t\t.call(ApiPhrasen.loadCategory(category))\n\t\t\t\t.then(res => res?.data ? extractCategory(res.data, category) : {})\n\t\t\t\t.then(res => {\n\t\t\t\t\tcategories[category] = res;\n\t\t\t\t});\n\t\treturn loadingModules[category];\n\t},\n\tt_ref(category, phrase, params) {\n\t\tconsole.warn('deprecated');\n\t\treturn Vue.computed(() => this.t(category, phrase, params));\n\t},\n\tt(category, phrase, params) {\n\t\tif (params === undefined && (\n\t\t\t(Array.isArray(category) && category.length == 2) ||\n\t\t\t(category.split && category.split('/').length == 2))\n\t\t\t) {\n\t\t\tparams = phrase;\n\t\t\t[category, phrase] = category.split ? category.split('/') : category;\n\t\t}\n\t\tif (phrase === undefined) {\n\t\t\tconsole.error('invalid input', category, phrase, params);\n\t\t\treturn '';\n\t\t}\n\t\tlet val = Vue.computed(() => {\n\t\t\tif (!categories[category])\n\t\t\t\treturn '';\n\t\t\treturn getValueForLoadedPhrase(category, phrase, params);\n\t\t});\n\t\tif (!categories[category])\n\t\t\tthis.loadCategory(category);\n\t\treturn val.value;\n\t}\n};\n\nexport default {\n\tinstall(app, options) {\n\t\tif (!app.config.globalProperties.$fhcApi)\n\t\t\tapp.use(OldFhcApi); // TODO(chris): remove at some point\n\t\tif (!app.config.globalProperties.$api)\n\t\t\tapp.use(PluginsApi);\n\t\tapp.config.globalProperties.$p = {\n\t\t\tt: phrasen.t,\n\t\t\tloadCategory: cat => phrasen.loadCategory.call(app, cat),\n\t\t\tsetLanguage: lang => phrasen.setLanguage.call(app, lang),\n\t\t\tuser_language: user_language,\n\t\t\tuser_locale,\n\t\t\tt_ref: phrasen.t_ref\n\t\t};\n\t\tapp.provide('$p', app.config.globalProperties.$p);\n\t}\n}","import DmsItem from './Dms/Item.js';\n\nexport default {\n\tcomponents: {\n\t\tDmsItem\n\t},\n\temits: [\n\t\t'update:modelValue'\n\t],\n\tprops: {\n\t\tmodelValue: {\n\t\t\ttype: [ FileList, Array ],\n\t\t\trequired: true\n\t\t},\n\t\tmultiple: Boolean,\n\t\tid: String,\n\t\tname: String,\n\t\tinputClass: [String, Array, Object],\n\t\tnoList: Boolean,\n\t\taccept: {\n\t\t\ttype: String,\n\t\t\tdefault: ''\n\t\t},\n\t\tdisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t}\n\t},\n\tmethods: {\n\t\tstringifyFile(file) {\n\t\t\treturn JSON.stringify({\n\t\t\t\tlastModified: file.lastModified,\n\t\t\t\tlastModifiedDate: file.lastModifiedDate,\n\t\t\t\tname: file.name,\n\t\t\t\tsize: file.size,\n\t\t\t\ttype: file.type\n\t\t\t});\n\t\t},\n\t\taddFiles(event) {\n\t\t\tif (!this.multiple)\n\t\t\t\treturn this.$emit('update:modelValue', event.target.files);\n\t\t\t\n\t\t\tconst dt = new DataTransfer();\n\t\t\tconst doubles = [];\n\t\t\tfor (var file of this.modelValue) {\n\t\t\t\tdt.items.add(file);\n\t\t\t\tdoubles.push(this.stringifyFile(file));\n\t\t\t}\n\t\t\tfor (var file of event.target.files) {\n\t\t\t\t// NOTE(chris): deep check (with FileReader) would require an async function so we only check the basic attributes\n\t\t\t\tif (doubles.indexOf(this.stringifyFile(file)) < 0)\n\t\t\t\t\tdt.items.add(file);\n\t\t\t}\n\t\t\tthis.$emit('update:modelValue', dt.files);\n\t\t},\n\t\tremoveFile(id) {\n\t\t\tconst fileToRemove = Array.from(this.modelValue)[id];\n\t\t\t\n\t\t\tconst dt = new DataTransfer();\n\t\t\tfor (var file of this.modelValue) {\n\t\t\t\tif (file !== fileToRemove)\n\t\t\t\t\tdt.items.add(file);\n\t\t\t}\n\t\t\tthis.$emit('update:modelValue', dt.files);\n\t\t}\n\t},\n\twatch: {\n\t\tmodelValue(n) {\n\t\t\tif (!n)\n\t\t\t\treturn;\n\t\t\tif (n instanceof FileList) {\n\t\t\t\tif (!this.$refs.upload) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn this.$refs.upload.files = n;\n\t\t\t}\n\n\t\t\tconst dt = new DataTransfer();\n\t\t\tconst dms = [];\n\t\t\tfor (var file of n) {\n\t\t\t\tif (file instanceof File) {\n\t\t\t\t\tdt.items.add(file);\n\t\t\t\t} else {\n\t\t\t\t\tconst dmsFile = new File([JSON.stringify(file)], file.name, {\n\t\t\t\t\t\ttype: 'application/x.fhc-dms+json'\n\t\t\t\t\t});\n\t\t\t\t\tdt.items.add(dmsFile);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.$emit('update:modelValue', dt.files);\n\t\t}\n\t},\n\ttemplate: `\n\t
    \n\t\t\n\t\t
      \n\t\t\t\n\t\t\t\n\t\t
    \n\t
    `\n}","export default {\n\temits: [\n\t\t'delete'\n\t],\n\tprops: {\n\t\tmodelValue: {\n\t\t\ttype: [File, Object],\n\t\t\trequired: true\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tpreview: ''\n\t\t};\n\t},\n\twatch: {\n\t\tmodelValue(n) {\n\t\t\tif (n.type == 'application/x.fhc-dms+json') {\n\t\t\t\tn.text().then(result => {\n\t\t\t\t\tconst obj = JSON.parse(result);\n\t\t\t\t\tthis.preview = obj.preview || '';\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t},\n\ttemplate: `\n\t
  • \n\t\t\n\t\t{{ modelValue.name }}\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t
  • `\n}\n","//import Phrasen from '../../plugin/Phrasen.js';\n\nexport default {\n\tname: 'BootstrapModal',\n\tdata: () => ({\n\t\tmodal: null,\n\t\tfullscreen: false\n\t}),\n\tprops: {\n\t\tbackdrop: {\n\t\t\ttype: [Boolean,String],\n\t\t\tdefault: true,\n\t\t\tvalidator(value) {\n\t\t\t\treturn ['static', true, false].includes(value);\n\t\t\t}\n\t\t},\n\t\tfocus: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true\n\t\t},\n\t\tkeyboard: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true\n\t\t},\n\t\tnoCloseBtn: Boolean,\n\t\tdialogClass: [String,Array,Object],\n\t\theaderClass: {\n\t\t\ttype: [String,Array,Object],\n\t\t\tdefault: ''\n\t\t},\n\t\tbodyClass: {\n\t\t\ttype: [String,Array,Object],\n\t\t\tdefault: 'px-4 py-5'\n\t\t},\n\t\tfooterClass: {\n\t\t\ttype: [String,Array,Object],\n\t\t\tdefault: ''\n\t\t},\n\t\tallowFullscreenExpand: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t}\n\t},\n\temits: [\n\t\t\"hideBsModal\",\n\t\t\"hiddenBsModal\",\n\t\t\"hidePreventedBsModal\",\n\t\t\"showBsModal\",\n\t\t\"shownBsModal\",\n\t\t\"toggleFullscreen\"\n\t],\n\tmethods: {\n\t\tdispose() {\n\t\t\treturn this.modal.dispose();\n\t\t},\n\t\thandleUpdate() {\n\t\t\treturn this.modal.handleUpdate();\n\t\t},\n\t\thide() {\n\t\t\treturn this.modal.hide();\n\t\t},\n\t\tshow(relatedTarget) {\n\t\t\treturn this.modal.show(relatedTarget);\n\t\t},\n\t\ttoggle() {\n\t\t\treturn this.modal.toggle();\n\t\t},\n\t\ttoggleFullscreen() {\n\t\t\tthis.fullscreen = !this.fullscreen\n\t\t\tthis.$emit('toggleFullscreen')\n\t\t}\n\t},\n\tmounted() {\n\t\tif (this.$refs.modal)\n\t\t\tthis.modal = new bootstrap.Modal(this.$refs.modal, {\n\t\t\t\tbackdrop: this.backdrop,\n\t\t\t\tfocus: this.focus,\n\t\t\t\tkeyboard: this.keyboard\n\t\t\t});\n\t},\n\tpopup(body, options, title, footer) {\n\t\tconst BsModal = this,\n\t\t\tslots = {};\n\t\tif (body !== undefined)\n\t\t\tslots.default = () => body;\n\t\tif (title !== undefined)\n\t\t\tslots.title = () => title;\n\t\tif (footer !== undefined)\n\t\t\tslots.footer = () => footer;\n\n\t\t// little hack to check whether primevue is included in the app or not\n\t\tlet includedPrimevue = false;\n\t\tif(typeof primevue !== 'undefined'){\n\t\t\tincludedPrimevue = true;\n\t\t}\n\n\t\treturn new Promise((resolve,reject) => {\n\t\t\tconst instance = Vue.createApp({\n\t\t\t\tname: 'ModalTmpApp',\n\t\t\t\tsetup() {\n\t\t\t\t\treturn () => Vue.h(BsModal, {...{\n\t\t\t\t\t\tclass: 'fade'\n\t\t\t\t\t},...options, ...{\n\t\t\t\t\t\tref: 'modal',\n\t\t\t\t\t\t'onHidden.bs.modal': instance.unmount\n\t\t\t\t\t}}, slots);\n\t\t\t\t},\n\t\t\t\tmounted() {\n\t\t\t\t\tthis.$refs.modal.show();\n\t\t\t\t\t\n\t\t\t\t},\n\t\t\t\tbeforeUnmount() {\n\t\t\t\t\tif (this.$refs.modal)\n\t\t\t\t\t\tthis.$refs.modal.result !== false ? resolve(this.$refs.modal.result) : reject();\n\t\t\t\t},\n\t\t\t\tunmounted() {\n\t\t\t\t\twrapper.parentElement.removeChild(wrapper);\n\t\t\t\t}\n\t\t\t});\n\t\t\tconst wrapper = document.createElement(\"div\");\n\t\t\t\n\t\t\t// if(primevue) --> won't work because primevue is not defined in this scope and promise would be rejected\n\t\t\tif (includedPrimevue){\n\t\t\t\tinstance.use(primevue.config.default, {zIndex: {overlay: 9999}})\n\t\t\t}\n\t\t\t\t \n\t\t\t//instance.use(Phrasen); // TODO(chris): find a more dynamic way\n\t\t\timport('../../plugins/Phrasen.js').then((Phrasen) => {\n\t\t\t\tinstance.use(Phrasen.default);\n\t\t\t\tinstance.mount(wrapper);\n\t\t\t\tdocument.body.appendChild(wrapper);\n\t\t\t});\n\t\t});\n\t},\n\ttemplate: `
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    `\n}\n","export default {\n\tgetConfig() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Abgabe/getConfig'\n\t\t};\n\t},\n\tgetConfigStudent() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Abgabe/getConfigStudent'\n\t\t};\n\t},\n\tgetStudentProjektarbeiten(uid) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Abgabe/getStudentProjektarbeiten',\n\t\t\tparams: { uid }\n\t\t};\n\t},\n\tgetStudentProjektabgaben(detail) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Abgabe/getStudentProjektabgaben',\n\t\t\tparams: { projektarbeit_id: detail.projektarbeit_id, student_uid: detail.student_uid }\n\t\t};\n\t},\n\tpostStudentProjektarbeitEndupload(formData) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/Abgabe/postStudentProjektarbeitEndupload',\n\t\t\tparams: formData,\n\t\t\tconfig: {Headers: { \"Content-Type\": \"multipart/form-data\" }}\n\t\t};\n\t},\n\tpostStudentProjektarbeitZwischenabgabe(formData) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/Abgabe/postStudentProjektarbeitZwischenabgabe',\n\t\t\tparams: formData,\n\t\t\tconfig: {Headers: { \"Content-Type\": \"multipart/form-data\" }}\n\t\t};\n\t},\n\tgetMitarbeiterProjektarbeiten(all) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Abgabe/getMitarbeiterProjektarbeiten',\n\t\t\tparams: { showall: all }\n\t\t};\n\t},\n\tpostProjektarbeitAbgabe(termin) {\n\t\t\n\t\tlet dateString = termin.datum\n\t\tif(termin.datum instanceof Date) {\n\t\t\tconst year = termin.datum.getFullYear();\n\t\t\tconst month = String(termin.datum.getMonth() + 1).padStart(2, '0');\n\t\t\tconst day = String(termin.datum.getDate()).padStart(2, '0');\n\n\t\t\tdateString = `${year}-${month}-${day}`\n\t\t}\n\t\t\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/Abgabe/postProjektarbeitAbgabe',\n\t\t\tparams: { \n\t\t\t\tpaabgabe_id: termin.paabgabe_id,\n\t\t\t\tpaabgabetyp_kurzbz: termin.bezeichnung.paabgabetyp_kurzbz,\n\t\t\t\tdatum: dateString,\n\t\t\t\tnote: termin.note_pk,\n\t\t\t\tupload_allowed: !!termin.upload_allowed,\n\t\t\t\tbeurteilungsnotiz: termin.beurteilungsnotiz ?? '',\n\t\t\t\tfixtermin: termin.fixtermin,\n\t\t\t\tinsertvon: termin.insertvon,\n\t\t\t\tkurzbz: termin.kurzbz,\n\t\t\t\tprojektarbeit_id: termin.projektarbeit_id,\n\t\t\t\tbetreuer_person_id: termin.betreuer_person_id\n\t\t\t}\n\t\t};\n\t},\n\tdeleteProjektarbeitAbgabe(paabgabe_id) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/Abgabe/deleteProjektarbeitAbgabe',\n\t\t\tparams: { paabgabe_id }\n\t\t};\n\t},\n\tpostSerientermin(datum, paabgabetyp_kurzbz, bezeichnung, kurzbz, upload_allowed, projektarbeit_ids, fixtermin) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/Abgabe/postSerientermin',\n\t\t\tparams: { datum, paabgabetyp_kurzbz, bezeichnung, kurzbz, upload_allowed, projektarbeit_ids, fixtermin }\n\t\t};\n\t},\n\tfetchDeadlines(person_id) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/Abgabe/fetchDeadlines',\n\t\t\tparams: { person_id }\n\t\t};\n\t},\n\tgetPaAbgabetypen() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Abgabe/getPaAbgabetypen'\n\t\t};\n\t},\n\t//TODO: SWITCH TO NOTEN API ONCE NOTENTOOL IS IN MASTER TO AVOID DUPLICATE API\n\tgetNoten(){\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Abgabe/getNoten'\n\t\t};\n\t},\n\tgetProjektarbeitenForStudiengang(studiengang_kz, benotet = 0) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Abgabe/getProjektarbeitenForStudiengang',\n\t\t\tparams: { studiengang_kz, benotet }\n\t\t};\n\t},\n\t// TODO: this could also very well be generic info api\n\tgetStudiengaenge() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Abgabe/getStudiengaenge'\n\t\t};\n\t},\n\tpostStudentProjektarbeitZusatzdaten(formData) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/Abgabe/postStudentProjektarbeitZusatzdaten',\n\t\t\tparams: formData,\n\t\t\tconfig: {Headers: { \"Content-Type\": \"multipart/form-data\" }}\n\t\t};\n\t},\n\tgetSignaturStatusForProjektarbeitAbgaben(paabgabe_ids, student_uid) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/Abgabe/getSignaturStatusForProjektarbeitAbgaben',\n\t\t\tparams: {paabgabe_ids, student_uid},\n\n\t\t};\n\t}\n};","export const FhcOverlay = {\n\tname: 'FhcOverlay',\n\tprops: {\n\t\tactive: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t}\t\n\t},\n\ttemplate: `\t\n\t\t
    \n\t\t\t\n\t\t
    \n\t`\n};\nexport default FhcOverlay;","import Upload from '../../../components/Form/Upload/Dms.js';\nimport BsModal from '../../Bootstrap/Modal.js';\nimport VueDatePicker from '../../vueDatepicker.js.php';\nimport ApiAbgabe from '../../../api/factory/abgabe.js'\nimport FhcOverlay from \"../../Overlay/FhcOverlay.js\";\n\nexport const AbgabeStudentDetail = {\n\tname: \"AbgabeStudentDetail\",\n\tcomponents: {\n\t\tUpload,\n\t\tBsModal,\n\t\tInputNumber: primevue.inputnumber,\n\t\tCheckbox: primevue.checkbox,\n\t\tDropdown: primevue.dropdown,\n\t\tTextarea: primevue.textarea,\n\t\tAccordion: primevue.accordion,\n\t\tAccordionTab: primevue.accordiontab,\n\t\tMessage: primevue.message,\n\t\tInplace: primevue.inplace,\n\t\tVueDatePicker,\n\t\tFhcOverlay\n\t},\n\tinject: ['notenOptions', 'isMobile', 'isViewMode', 'moodle_link'],\n\tprops: {\n\t\tprojektarbeit: {\n\t\t\ttype: Object,\n\t\t\tdefault: null\n\t\t},\n\t\tviewMode: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tloading: false,\n\t\t\teidAkzeptiert: false,\n\t\t\tenduploadTermin: null,\n\t\t\tallActiveLanguages: FHC_JS_DATA_STORAGE_OBJECT.server_languages,\n\t\t\tform: Vue.reactive({\n\t\t\t\tsprache: '',\n\t\t\t\tabstract: '',\n\t\t\t\tabstract_en: '',\n\t\t\t\tschlagwoerter: '',\n\t\t\t\tschlagwoerter_en: '',\n\t\t\t\tkontrollschlagwoerter: '',\n\t\t\t\tseitenanzahl: 1,\n\t\t\t})\n\t\t}\n\t},\n\tmethods: {\n\t\tgetNoteBezeichnung(termin){\n\t\t\tconst noteOpt = this.notenOptions.find(opt => opt.note == termin.note)\n\t\t\t\n\t\t\tif(noteOpt?.bezeichnung) {\n\t\t\t\treturn noteOpt?.positiv ? this.$capitalize(this.$p.t('abgabetool/c4positivBenotet')) + ' ✅' : this.$capitalize(this.$p.t('abgabetool/c4negativBenotet')) + ' ❌'\n\t\t\t} else if(noteOpt?.benotbar === true && !termin.note) {\n\t\t\t\treturn this.$capitalize(this.$p.t('abgabetool/c4notYetGraded'));\n\t\t\t} else {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t},\n\t\tasync validate(termin, endupload = false) {\n\t\t\tif(!termin.file.length) {\n\t\t\t\tthis.$fhcAlert.alertWarning(this.$capitalize(this.$p.t('global/warningChooseFile')));\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t\n\t\t\tif(endupload) {\n\t\t\t\tif(await this.$fhcAlert.confirm({\n\t\t\t\t\tmessage: this.$p.t('abgabetool/confirmEnduploadSpeichern'),\n\t\t\t\t\tacceptLabel: this.$capitalize(this.$p.t('abgabetool/c4AcceptAndProceed')),\n\t\t\t\t\tacceptClass: 'p-button-primary',\n\t\t\t\t\trejectLabel: this.$capitalize(this.$p.t('abgabetool/c4Cancel')),\n\t\t\t\t\trejectClass: 'p-button-secondary'\n\t\t\t\t}) === false) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn true;\n\t\t},\n\t\tasync triggerEndupload() {\n\t\t\t\n\t\t\tif (!await this.validate(this.enduploadTermin, true))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t\n\t\t\t// post endabgabe\n\t\t\tconst formData = new FormData();\n\t\t\tformData.append('paabgabetyp_kurzbz', this.enduploadTermin.paabgabetyp_kurzbz)\n\t\t\tformData.append('projektarbeit_id', this.enduploadTermin.projektarbeit_id);\n\t\t\tformData.append('paabgabe_id', this.enduploadTermin.paabgabe_id)\n\t\t\tformData.append('student_uid', this.projektarbeit.student_uid)\n\t\t\tformData.append('bperson_id', this.projektarbeit.bperson_id)\n\t\t\t\n\t\t\tformData.append('sprache', this.form['sprache'].sprache)\n\t\t\tformData.append('abstract', this.form['abstract'])\n\t\t\tformData.append('abstract_en', this.form['abstract_en'])\n\t\t\tformData.append('schlagwoerter', this.form['schlagwoerter'])\n\t\t\tformData.append('schlagwoerter_en', this.form['schlagwoerter_en'])\n\t\t\tformData.append('seitenanzahl', this.form['seitenanzahl'])\n\t\t\t\n\t\t\tfor (let i = 0; i < this.enduploadTermin.file.length; i++) {\n\t\t\t\tformData.append('file', this.enduploadTermin.file[i]);\n\t\t\t}\n\t\t\tthis.loading = true\n\t\t\tthis.$api.call(ApiAbgabe.postStudentProjektarbeitEndupload(formData))\n\t\t\t\t.then(res => {\n\t\t\t\t\tthis.handleUploadRes(res, this.enduploadTermin)\n\t\t\t\t}).finally(()=> {\n\t\t\t\t\tthis.loading = false\n\t\t\t})\n\t\t\t\n\t\t\tthis.$refs.modalContainerEnduploadZusatzdaten.hide()\n\t\t},\n\t\tdownloadAbgabe(termin) {\n\t\t\tconst url = `/api/frontend/v1/Abgabe/getStudentProjektarbeitAbgabeFile?paabgabe_id=${termin.paabgabe_id}&student_uid=${this.projektarbeit.student_uid}&projektarbeit_id=${this.projektarbeit.projektarbeit_id}`;\n\n\t\t\twindow.open(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + url)\n\t\t\t// this.$api.call(ApiAbgabe.getStudentProjektarbeitAbgabeFile(termin.paabgabe_id, this.projektarbeit.student_uid))\n\t\t},\n\t\tformatDate(dateParam) {\n\t\t\tconst date = new Date(dateParam)\n\t\t\t// handle missing leading 0\n\t\t\tconst padZero = (num) => String(num).padStart(2, '0');\n\n\t\t\tconst month = padZero(date.getMonth() + 1); // Months are zero-based\n\t\t\tconst day = padZero(date.getDate());\n\t\t\tconst year = date.getFullYear();\n\n\t\t\treturn `${day}.${month}.${year}`\n\t\t},\n\t\tasync upload(termin) {\n\n\t\t\t// only do this on endupload\n\t\t\tif (! await this.validate(termin))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t\n\t\t\tif(termin.bezeichnung?.paabgabetyp_kurzbz === 'end') {\n\t\t\t\t// open endupload form modal for further inputs\n\t\t\t\tthis.enduploadTermin = termin\n\t\t\t\tthis.$refs.modalContainerEnduploadZusatzdaten.show()\n\t\t\t} else {\n\t\t\t\tconst formData = new FormData();\n\t\t\t\tformData.append('paabgabetyp_kurzbz', termin.paabgabetyp_kurzbz)\n\t\t\t\tformData.append('projektarbeit_id', this.projektarbeit.projektarbeit_id)\n\t\t\t\tformData.append('paabgabe_id', termin.paabgabe_id)\n\t\t\t\tformData.append('student_uid', this.projektarbeit.student_uid)\n\t\t\t\tformData.append('bperson_id', this.projektarbeit.bperson_id)\n\t\t\t\t\n\t\t\t\tfor (let i = 0; i < termin.file.length; i++) {\n\t\t\t\t\tformData.append('file', termin.file[i]);\n\t\t\t\t}\n\n\t\t\t\tthis.loading = true\n\t\t\t\tthis.$api.call(ApiAbgabe.postStudentProjektarbeitZwischenabgabe(formData))\n\t\t\t\t\t.then(res => {\n\t\t\t\t\t\tthis.handleUploadRes(res, termin)\n\t\t\t\t\t}).finally(()=> {\n\t\t\t\t\t\tthis.loading = false\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\t\thandleUploadRes(res, termin) {\n\t\t\tif(res.meta.status == \"success\") {\n\t\t\t\tthis.$fhcAlert.alertSuccess(this.$capitalize(this.$p.t('abgabetool/c4fileUploadSuccessv3')))\n\n\t\t\t\t// update 'abgabedatum' for successful upload -> shows the pdf icon and date once set\n\t\t\t\ttermin.abgabedatum = new Date().toISOString().split('T')[0];\n\t\t\t\tif(res?.data?.signatur !== undefined) {\n\t\t\t\t\ttermin.signatur = res.data.signatur\n\t\t\t\t}\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\tthis.$fhcAlert.alertError(this.$capitalize(this.$p.t('abgabetool/c4fileUploadErrorv3')))\n\t\t\t}\n\t\t\t\n\t\t\tif(res.meta.signaturInfo) {\n\t\t\t\tthis.$fhcAlert.alertInfo(res.meta.signaturInfo)\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t},\n\t\tgetOptionLabel(option) {\n\t\t\treturn option.sprache\n\t\t},\n\t\tgetTerminNoteBezeichnung(termin) {\n\t\t\tconst noteOpt = this.notenOptions.find(opt => opt.note == termin.note)\n\t\t\treturn noteOpt ? noteOpt.bezeichnung : ''\n\t\t},\n\t},\n\twatch: {\n\t\tprojektarbeit(newVal) {\n\t\t\t// default select german if projektarbeit sprache was null\n\t\t\tthis.form.sprache = newVal.sprache ? this.allActiveLanguages.find(lang => lang.sprache == newVal.sprache) : this.allActiveLanguages.find(lang => lang.sprache == 'German')\n\t\t\tthis.form.abstract = newVal.abstract ?? ''\n\t\t\tthis.form.abstract_en = newVal.abstract_en ?? ''\n\t\t\tthis.form.schlagwoerter = newVal.schlagwoerter ?? ''\n\t\t\tthis.form.schlagwoerter_en = newVal.schlagwoerter_en ?? ''\n\t\t\tthis.form.kontrollschlagwoerter = newVal.kontrollschlagwoerter ?? ''\n\t\t\tthis.form.seitenanzahl = newVal.seitenanzahl ?? 1\n\t\t\t\n\t\t}\n\t},\n\tcomputed: {\n\t\tgetMoodleLink() {\n\t\t\treturn this.moodle_link + this.projektarbeit.studiengang_kz\t\n\t\t},\n\t\tgetMessagePtStyle() {\n\t\t\t// adjust outer spacing and internal padding to appear similar to doenload button in size\n\t\t\treturn {\n\t\t\t\troot: {\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tmargin: '0px'\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\twrapper: {\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tpadding: '6px'\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tgetEid() {\n\t\t\treturn this.$capitalize(this.$p.t('abgabetool/c4eidesstattlicheErklaerung'))\n\t\t},\n\t\tallowedToSaveZusatzdaten() {\n\t\t\treturn this.form.schlagwoerter.length > 0 && this.form.schlagwoerter_en.length > 0 && this.form.abstract.length > 0 && this.form.abstract_en.length > 0 && this.form.seitenanzahl > 0\n\t\t},\n\t\tgetAllowedToSendEndupload() {\n\t\t\treturn this.eidAkzeptiert && this.allowedToSaveZusatzdaten\n\t\t},\n\t\tqualityGateTerminAvailable() {\n\t\t\tlet qgatefound = false\n\t\t\tthis.projektarbeit?.abgabetermine.forEach(abgabe => {\n\t\t\t\tif(abgabe.paabgabetyp_kurzbz == 'qualgate1'\n\t\t\t\t\t|| abgabe.paabgabetyp_kurzbz == 'qualgate2') {\n\t\t\t\t\tqgatefound = true\n\t\t\t\t}\n\t\t\t})\n\t\t\treturn qgatefound\n\t\t},\n\t\tgetTooltipVerspaetet() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4tooltipVerspaetet')),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipVerpasst() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4tooltipVerpasst')),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipAbzugeben() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4tooltipAbzugeben')),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipStandard() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4tooltipStandardv2')),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipAbgegeben() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4tooltipAbgegeben')),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipFixtermin() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4tooltipFixtermin')),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipAbgabeDetected() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4tooltipAbgabeDetected')),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipNotAllowedToUpload() {\n\t\t\tif(this.isViewMode) {\n\t\t\t\treturn {\n\t\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4studentAbgabeNotAllowedInViewMode')),\n\t\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn {\n\t\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4studentAbgabeNotAllowedRegular')),\n\t\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tgetTooltipBeurteilungerforderlich() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4tooltipBeurteilungerforderlich')),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipBestanden() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipBestanden'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipNichtBestanden() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipNichtBestanden'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t},\n\tcreated() {\n\t\t\n\t},\n\tmounted() {\n\n\t},\n\ttemplate: `\n\t\t\n\n\t\t
    \n\t\t\n\t\t\t
    {{$capitalize( $p.t('abgabetool/c4abgabeStudentenbereich') )}}
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t

    {{$capitalize( $p.t('person/student') ) }}: {{projektarbeit?.student}}

    \n\t\t\t\t\t

    {{$capitalize( $p.t('abgabetool/c4titel') ) }}: {{projektarbeit?.titel}}

    \n\t\t\t\t\t

    {{$capitalize( $p.t('abgabetool/c4betreuer') ) }}: {{projektarbeit ? $p.t('abgabetool/c4betrart' + projektarbeit.betreuerart_kurzbz) + ' ' + projektarbeit.betreuer : ''}}

    \n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t

    {{ $p.t('abgabetool/c4checkoutStgMoodleInfos') }} \n\t\t\t\t\t\tMoodle\n\t\t\t\t\t

    \n\t\t\t\t
    \n\t\t\t
    \n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t
    \n\t\t\t\t
    {{ $capitalize( $p.t('abgabetool/c4keineAbgabetermineGefunden') )}}
    \n\t\t\t
    \n\t\t\t\n\t\t
    \n\t \t\n\t \t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t \t\n `,\n};\n\nexport default AbgabeStudentDetail;\n","import AbgabeDetail from \"./AbgabeStudentDetail.js\";\nimport ApiAbgabe from '../../../api/factory/abgabe.js'\nimport BsModal from \"../../Bootstrap/Modal.js\";\nimport FhcOverlay from \"../../Overlay/FhcOverlay.js\";\n\nconst today = new Date()\nexport const AbgabetoolStudent = {\n\tname: \"AbgabetoolStudent\",\n\tcomponents: {\n\t\tAccordion: primevue.accordion,\n\t\tAccordionTab: primevue.accordiontab,\n\t\tBsModal,\n\t\tAbgabeDetail,\n\t\tFhcOverlay\n\t},\n\tprovide() {\n\t\treturn {\n\t\t\tnotenOptions: Vue.computed(() => this.notenOptions),\n\t\t\tisViewMode: Vue.computed(() => this.isViewMode),\n\t\t\tmoodle_link: Vue.computed(() => this.moodle_link)\n\t\t}\n\t},\n\tprops: {\n\t\tstudent_uid_prop: {\n\t\t\tdefault: null\n\t\t},\n\t\tviewData: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t\tdefault: () => ({uid: ''}),\n\t\t\tvalidator(value) {\n\t\t\t\treturn value && value.uid\n\t\t\t}\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tactiveTabIndex: [0],\n\t\t\tabgabeTypeOptions: null,\n\t\t\tphrasenPromise: null,\n\t\t\tphrasenResolved: false,\n\t\t\tloading: false,\n\t\t\tnotenOptions: null,\n\t\t\tdetail: null,\n\t\t\tprojektarbeiten: null,\n\t\t\tselectedProjektarbeit: null,\n\t\t\tmoodle_link: null\n\t\t};\n\t},\n\tmethods: {\n\t\tdateDiffInDays(datumParam) {\n\t\t\tlet datum = datumParam\n\t\t\tif(datumParam instanceof Date && !isNaN(datum.getTime()))\n\t\t\t{\n\t\t\t\tconst year = datumParam.getFullYear();\n\t\t\t\tconst month = datumParam.getMonth() + 1;\t// getMonth() is 0-indexed\n\t\t\t\tconst day = datumParam.getDate();\n\t\t\t\tconst pad = (num) => String(num).padStart(2, '0');\n\t\t\t\tdatum = `${year}-${pad(month)}-${pad(day)}`\n\t\t\t}\n\n\t\t\tconst dateToday = luxon.DateTime.now().startOf('day');\n\t\t\tconst dateDatum = luxon.DateTime.fromISO(datum).startOf('day');\n\t\t\tconst duration = dateDatum.diff(dateToday, 'days');\n\n\t\t\treturn duration.values.days;\n\t\t},\n\t\tgetDateStyleClass(termin) {\n\t\t\tconst datum = new Date(termin.datum)\n\t\t\tconst abgabedatum = new Date(termin.abgabedatum)\n\n\t\t\ttermin.diffindays = this.dateDiffInDays(termin.datum)\n\n\t\t\tconst isLate = termin.abgabedatum && abgabedatum > datum;\n\n\t\t\t// GRADE STATUS\n\t\t\tif (termin.note) {\n\t\t\t\tif(Number.isInteger(termin.note)) {\n\t\t\t\t\tconst opt = this.notenOptions.find(opt => opt.note == termin.note)\n\t\t\t\t\tif(opt.positiv) return 'bestanden'\n\t\t\t\t}\n\t\t\t\tif (termin.note.positiv) return 'bestanden';\n\t\t\t\treturn 'nichtbestanden';\n\t\t\t}\n\n\t\t\t// ACTION REQUIRED FOR GRADE\n\t\t\tif (termin.bezeichnung?.benotbar && datum < today) {\n\t\t\t\treturn 'beurteilungerforderlich';\n\t\t\t}\n\n\t\t\t// SUBMISSION STATUS\n\t\t\tif (termin.upload_allowed) {\n\t\t\t\tif (termin.abgabedatum) {\n\t\t\t\t\treturn isLate ? 'verspaetet' : 'abgegeben';\n\t\t\t\t}\n\n\t\t\t\t// no submission yet\n\t\t\t\tif (datum < today) return 'verpasst';\n\t\t\t\tif (termin.diffindays <= 12) return 'abzugeben';\n\t\t\t\treturn 'standard';\n\t\t\t}\n\n\t\t\t// GENERIC STATUS\n\t\t\treturn datum < today ? 'verpasst' : 'standard';\n\t\t},\n\t\tcheckQualityGatesStrict(termine) {\n\t\t\tlet qgate1Passed = false\n\t\t\tlet qgate2Passed = false\n\t\t\t\n\t\t\ttermine.forEach(t => {\n\t\t\t\tconst noteOption = this.notenOptions?.find(opt => opt.note == t.note)\n\t\t\t\tif(noteOption && noteOption.positiv) {\n\t\t\t\t\tif(t.paabgabetyp_kurzbz == 'qualgate1') {\n\t\t\t\t\t\tqgate1Passed = true\n\t\t\t\t\t} else if(t.paabgabetyp_kurzbz == 'qualgate2') {\n\t\t\t\t\t\tqgate2Passed = true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\n\t\t\treturn qgate1Passed && qgate2Passed\n\t\t},\n\t\tcheckQualityGatesOptional(termine) {\n\t\t\tconst qgate1found = termine.find(t => t.paabgabetyp_kurzbz == 'qualgate1')\n\t\t\tconst qgate2found = termine.find(t => t.paabgabetyp_kurzbz == 'qualgate2')\n\t\t\t\n\t\t\tlet qgate1positiv = true\n\t\t\tif(qgate1found) {\n\t\t\t\tqgate1positiv = false\n\n\t\t\t\ttermine.forEach(t => {\n\t\t\t\t\tconst noteOption = this.notenOptions?.find(opt => opt.note == t.note)\n\t\t\t\t\tif(noteOption && noteOption.positiv) {\n\t\t\t\t\t\tif (t.paabgabetyp_kurzbz == 'qualgate1') {\n\t\t\t\t\t\t\tqgate1positiv = true\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tlet qgate2positiv = true\n\t\t\tif(qgate2found) {\n\t\t\t\tqgate2positiv = false\n\n\t\t\t\ttermine.forEach(t => {\n\t\t\t\t\tconst noteOption = this.notenOptions?.find(opt => opt.note == t.note)\n\t\t\t\t\tif(noteOption && noteOption.positiv) {\n\t\t\t\t\t\tif (t.paabgabetyp_kurzbz == 'qualgate2') {\n\t\t\t\t\t\t\tqgate2positiv = true\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\n\t\t\treturn qgate1positiv && qgate2positiv\n\t\t},\n\t\tisPastDate(date) {\n\t\t\treturn new Date(date) < new Date(Date.now())\t\n\t\t},\n\t\tsetDetailComponent(details){\n\t\t\tthis.loading = true\n\t\t\tthis.loadAbgaben(details).then((res)=> {\n\t\t\t\tconst pa = this.projektarbeiten?.find(projekarbeit => projekarbeit.projektarbeit_id == details.projektarbeit_id)\n\t\t\t\tpa.abgabetermine = res.data[0].retval\n\t\t\t\t\n\t\t\t\tconst paIsBenotet = pa.note !== null\n\t\t\t\t\n\t\t\t\tpa.abgabetermine.forEach(termin => {\n\t\t\t\t\ttermin.file = []\n\t\t\t\t\ttermin.allowedToUpload = false\n\t\t\t\t\t\n\t\t\t\t\tif(termin.paabgabetyp_kurzbz == 'end') {\n\t\t\t\t\t\t// old assumed production logic when qgates are required\n\t\t\t\t\t\t// termin.allowedToUpload = !this.isPastDate(termin.datum) && this.checkQualityGatesStrict(pa.abgabetermine)\n\t\t\t\t\t\t\n\t\t\t\t\t\t// new larifari we want qgates but they are optional fhtw mode\n\t\t\t\t\t\ttermin.allowedToUpload = !this.isPastDate(termin.datum) && this.checkQualityGatesOptional(pa.abgabetermine)\n\n\n\t\t\t\t\t\t// development purposes\n\t\t\t\t\t\t// termin.allowedToUpload = this.checkQualityGatesStrict(pa.abgabetermine)\n\t\t\t\t\t\t// termin.allowedToUpload = true\n\n\t\t\t\t\t} else if(termin.fixtermin) {\n\t\t\t\t\t\ttermin.allowedToUpload = !this.isPastDate(termin.datum)\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// this could confuse people since we should dont show people this flag\n\t\t\t\t\t\ttermin.allowedToUpload = termin.upload_allowed \n\t\t\t\t\t}\n\n\t\t\t\t\t// blocks client upload button if projektarbeitet is already beurteilt und thus further abgaben on any termin should be blocked\n\t\t\t\t\tif(paIsBenotet) termin.allowedToUpload = false\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\ttermin.bezeichnung = this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz === termin.paabgabetyp_kurzbz)\n\t\t\t\t\ttermin.dateStyle = this.getDateStyleClass(termin)\n\t\t\t\t})\n\t\t\t\t\n\t\t\t\tpa.betreuer = this.buildBetreuer(pa)\n\t\t\t\tpa.student_uid = this.student_uid\n\t\t\t\t\n\t\t\t\tthis.selectedProjektarbeit = pa\n\n\t\t\t\tthis.$refs.modalContainerAbgabeDetail.show()\n\t\t\t\t\n\t\t\t}).finally(()=>{this.loading=false})\n\t\t},\n\t\tcenteredTextFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\n\t\t\treturn '
    ' +\n\t\t\t\t'

    '+val+'

    '\n\t\t},\n\t\tdetailFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\n\t\t\tif(val.mode === 'detailTermine') {\n\t\t\t\treturn '
    ' +\n\t\t\t\t\t'
    '\n\t\t\t} else if (val.mode === 'beurteilungDownload') {\n\t\t\t\treturn '
    ' +\n\t\t\t\t\t'
    '\n\t\t\t}\n\t\t},\n\t\tmailFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\t\t\t\treturn '
    ' +\n\t\t\t\t\t'
    '\n\t\t},\n\t\tbeurteilungFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\t\t\tif(val) {\n\t\t\t\treturn '
    ' +\n\t\t\t\t\t'
    '\n\t\t\t} else return '-'\n\t\t},\n\t\tbuildMailToLink(projekt) {\n\t\t\t// should always be \"projekt.mitarbeiter_uid +'@'+ this.domain\", built in backend\n\t\t\treturn 'mailto:' + projekt.email\n\t\t},\n\t\tbuildBetreuer(abgabe) {\n\t\t\treturn (abgabe.btitelpre ? abgabe.btitelpre + ' ' : '') + abgabe.bvorname + ' ' + abgabe.bnachname + (abgabe.btitelpost ? ' ' + abgabe.btitelpost : '')\n\t\t},\n\t\tasync setupData(data){\n\t\t\t// this.projektarbeiten = data[0]\n\t\t\tconst projektarbeiten = data[0] ?? null\n\t\t\tif(!projektarbeiten) return\n\t\t\tthis.projektarbeiten = projektarbeiten.map(projekt => {\n\t\t\t\tlet mode = 'detailTermine'\n\t\t\t\t\n\t\t\t\treturn {\n\t\t\t\t\t...projekt,\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\tstudent_uid: this.student_uid,\n\t\t\t\t\t\tprojektarbeit_id: projekt.projektarbeit_id,\n\t\t\t\t\t\tbetreuer_person_id: projekt.bperson_id,\n\t\t\t\t\t\tbetreuerart_kurzbz: projekt.betreuerart_kurzbz,\n\t\t\t\t\t\tmode\n\t\t\t\t\t},\n\t\t\t\t\tbeurteilung1: projekt.downloadLink1 ?? null,\n\t\t\t\t\tbeurteilung2: projekt.downloadLink2 ?? null,\n\t\t\t\t\tsem: projekt.studiensemester_kurzbz,\n\t\t\t\t\tstg: projekt.kurzbzlang,\n\t\t\t\t\tmail: this.buildMailToLink(projekt),\n\t\t\t\t\tbetreuer: this.buildBetreuer(projekt),\n\t\t\t\t\ttyp: projekt.projekttypbezeichnung,\n\t\t\t\t\ttitel: projekt.titel\n\t\t\t\t}\n\t\t\t})\n\n\t\t},\n\t\tloadProjektarbeiten() {\n\t\t\tthis.$api.call(ApiAbgabe.getStudentProjektarbeiten(this.student_uid))\n\t\t\t\t.then(res => {\n\t\t\t\t\tif(res?.data) this.setupData(res.data)\n\t\t\t\t})\n\t\t},\n\t\tloadAbgaben(details) {\n\t\t\treturn new Promise((resolve) => {\n\t\t\t\tthis.$api.call(ApiAbgabe.getStudentProjektabgaben(details))\n\t\t\t\t\t.then(res => {\n\t\t\t\t\t\tresolve(res)\n\t\t\t\t\t})\n\t\t\t})\t\n\t\t},\n\t\tasync setupMounted() {\n\t\t\tthis.loadProjektarbeiten()\n\t\t},\n\t\tgetAccTabHeaderForProjektarbeit(projektarbeit) {\n\t\t\tlet title = ''\n\t\t\t\n\t\t\ttitle += projektarbeit.titel ?? this.$p.t('abgabetool/keinTitel')\n\t\t\t\n\t\t\treturn title\n\t\t},\n\t\tgetMailLink(projektarbeit) {\n\t\t\tif(projektarbeit.email) {\n\t\t\t\treturn 'mailto:'+projektarbeit.email\n\t\t\t} else return ''\n\t\t},\n\t\tgetNoteBezeichnung(projektarbeit) {\n\t\t\tif(projektarbeit.note && this.notenOptions) {\n\t\t\t\tconst noteOpt = this.notenOptions.find(opt => opt.note == projektarbeit.note)\n\t\t\t\treturn noteOpt?.bezeichnung\n\t\t\t} else {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t},\n\t\thandleDownloadBeurteilung1(projektarbeit) {\n\t\t\twindow.open(projektarbeit.beurteilung1)\n\t\t},\n\t\thandleDownloadBeurteilung2(projektarbeit) {\n\t\t\twindow.open(projektarbeit.beurteilung2)\n\t\t}\n\t},\n\twatch: {\n\n\t},\n\tcomputed: {\n\t\tisViewMode() {\n\t\t\treturn this.student_uid !== this.viewData.uid\n\t\t},\n\t\tstudent_uid() {\n\t\t\treturn this.student_uid_prop || this.viewData?.uid || null\n\t\t}\n\t},\n\tasync created() {\n\t\tthis.phrasenPromise = this.$p.loadCategory(['abgabetool', 'global'])\n\t\tthis.phrasenPromise.then(()=> {this.phrasenResolved = true})\n\t\t\n\t\tthis.loading = true\n\t\t//TODO: SWITCH TO NOTEN API ONCE NOTENTOOL IS IN MASTER TO AVOID DUPLICATE API\n\t\tawait this.$api.call(ApiAbgabe.getNoten()).then(res => {\n\t\t\tif(res.meta.status == 'success') {\n\t\t\t\tthis.notenOptions = res.data[0]\n\n\t\t\t\tthis.allowedNotenOptions = this.notenOptions.filter(\n\t\t\t\t\topt => res.data[1].includes(opt.note)\n\t\t\t\t)\n\t\t\t}\n\t\t}).finally(() => {\n\t\t\tthis.loading = false\n\t\t})\n\n\t\t// fetch abgabetypen options\n\t\tthis.$api.call(ApiAbgabe.getPaAbgabetypen()).then(res => {\n\t\t\tthis.abgabeTypeOptions = res.data\n\t\t}).catch(e => {\n\t\t\tthis.loading = false\n\t\t})\n\n\t\t// fetch config to avoid hard coded links\n\t\tthis.$api.call(ApiAbgabe.getConfigStudent()).then(res => {\n\t\t\tthis.moodle_link = res.data?.moodle_link\n\t\t}).catch(e => {\n\t\t\tthis.loading = false\n\t\t})\n\t},\n\tmounted() {\n\t\tthis.setupMounted()\n\t},\n\ttemplate: `\n\n `,\n};\n\nexport default AbgabetoolStudent;\n","/**\n * Copyright (C) 2022 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n/**\n *\n */\nexport const CoreFetchCmpt = {\n\temits: ['dataFetched'], // this component can emit the event dataFetched that it is catched by this component itself\n\tprops: {\n\t\trefresh: { // to refresh this component\n\t\t\ttype: Boolean\n\t\t},\n\t\tapiFunction: { // the function to call, must return a Promise\n\t\t\trequired: true,\n\t\t\ttype: Function\n\t\t},\n\t\tapiFunctionParameters: {} // parameters for the apiFunction, type mixed, optional\n\t},\n\twatch: {\n\t\t/**\n\t\t * If the refresh property is changed then call fetchData\n\t\t */\n\t\trefresh: function (newValue, oldValue) {\n\t\t\tthis.fetchData();\n\t\t}\n\t},\n\tdata: function() {\n\t\treturn {\n\t\t\tloading: false, // if in loading or not\n\t\t\terror: false, // if an error occurred while loading data\n\t\t\terrorMessage: null // the error message\n\t\t};\n\t},\n\tcreated: function() {\n\t\tthis.fetchData();\n\t},\n\tmethods: {\n\t\t/**\n\t\t *\n\t\t */\n\t\tfetchData: function() {\n\t\t\tthis.loading = true; // loader started\n\t\t\tthis.error = false;\n\t\t\tthis.errorMessage = null;\n\n\t\t\t// Checks if the apifunction is a callable function\n\t\t\tif (typeof this.apiFunction == \"function\")\n\t\t\t{\n\t\t\t\t// Call the function stored in apiFunction\n\t \t\tlet apiFunctionResult = this.apiFunction(this.apiFunctionParameters);\n\n\t\t\t\t// It is expected that the function returns a Promise\n\t\t\t\tif (apiFunctionResult instanceof Promise)\n\t\t\t\t{\n\t\t\t\t\tapiFunctionResult\n\t\t\t\t\t\t.then(this.successHandler) // on success\n\t\t\t\t\t\t.catch(this.errorHandler) // on error\n\t\t\t\t\t\t.finally(this.finallyHandler); // finally in any case\n\t\t\t\t}\n\t\t\t\telse // otherwise display an error\n\t\t\t\t{\n\t\t\t\t\tthis.setError(\"The called apiFunction does not return a Promise\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse // otherwise display an error\n\t\t\t{\n\t\t\t\tthis.setError(\"Property apiFunction is not a function\");\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\tsetError: function(errorMessage) {\n\t\t\tthis.loading = false; // loading ended\n\t\t\tthis.error = true; // error occurred\n\t\t\tthis.errorMessage = errorMessage; // save the error message\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\tsuccessHandler: function(response) {\n\t\t\tthis.$emit('dataFetched', response ? response.data : undefined); // trigger the event dataFetched\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\terrorHandler: function(error) {\n\t\t\tif (error.response?.data?.retval)\n\t\t\t\tthis.setError(error.response.data.retval);\n\t\t\telse if (error.data?.message)\n\t\t\t\tthis.setError(error.data.message);\n\t\t\telse\n\t\t\t\tthis.setError(error.message);\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\tfinallyHandler: function() {\n\t\t\tthis.loading = false; // loading ended\n\t\t}\n\t},\n\ttemplate: `\n\t\t\n\t\t\t
    Loading...
    \n\t\t
    \n\t\t\n\t\t\t
    {{ errorMessage }}
    \n\t\t
    \n\t\t\n\t`\n};\n","/**\n * Copyright (C) 2022 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nconst FILTER_COMPONENT_NEW_FILTER = 'Filter Component New Filter';\n\n/**\n *\n */\nexport default {\n\tprops: {\n\t\tfilters: {\n\t\t\ttype: Array,\n\t\t\tdefault: []\n\t\t},\n\t\tcolumns: {\n\t\t\ttype: Array,\n\t\t\tdefault: []\n\t\t},\n\t\tfields: {\n\t\t\ttype: Array,\n\t\t\tdefault: []\n\t\t}\n\t},\n\temits: {\n\t\tswitchFilter: ['filterId'],\n\t\tapplyFilterConfig: ['filterFields'],\n\t\tsaveCustomFilter: ['customFilterName']\n\t},\n\tdata: function() {\n\t\treturn {\n\t\t\tcurrentFields: []\n\t\t};\n\t},\n\tcomputed: {\n\t\ttypes() {\n\t\t\treturn this.columns.reduce((a,c) => {\n\t\t\t\tlet type = c.type.toLowerCase();\n\t\t\t\tif (type.indexOf('int') >= 0)\n\t\t\t\t\ta[c.name] = 'Numeric';\n\t\t\t\telse if (\n\t\t\t\t\ttype.indexOf('varchar') >= 0 || \n\t\t\t\t\ttype.indexOf('text') >= 0 || \n\t\t\t\t\ttype.indexOf('bpchar') >= 0\n\t\t\t\t)\n\t\t\t\t\ta[c.name] = 'Text';\n\t\t\t\telse if (\n\t\t\t\t\ttype.indexOf('timestamp') >= 0 || \n\t\t\t\t\ttype.indexOf('date') >= 0\n\t\t\t\t)\n\t\t\t\t\ta[c.name] = 'Date';\n\t\t\t\telse\n\t\t\t\t\ta[c.name] = '';\n\t\t\t\treturn a;\n\t\t\t}, {});\n\t\t}\n\t},\n\twatch: {\n\t\tfields(n) {\n\t\t\tthis.currentFields = n;\n\t\t}\n\t},\n\tmethods: {\n\t\tswitchFilter(evt) {\n\t\t\tthis.$emit('switchFilter', evt.currentTarget.value);\n\t\t},\n\t\tapplyFilterConfig() {\n\t\t\tconst filteredFields = this.currentFields.filter(el => el.name != FILTER_COMPONENT_NEW_FILTER);\n\t\t\tif (filteredFields.filter(el => el.condition == \"\").length)\n\t\t\t\talert(\"Please fill all the filter options\");\n\t\t\telse\n\t\t\t\tthis.$emit('applyFilterConfig', filteredFields);\n\t\t},\n\t\taddField(evt) {\n\t\t\tthis.currentFields.push({\n\t\t\t\tname: FILTER_COMPONENT_NEW_FILTER\n\t\t\t});\n\t\t},\n\t\tremoveField(index) {\n\t\t\tthis.currentFields.splice(index, 1);\n\t\t}\n\t},\n\ttemplate: `\n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t
    \n\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\tFilter {{ index + 1 }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n\t`\n};\n\n","/**\n * Copyright (C) 2022 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n/**\n *\n */\nexport default {\n\tprops: {\n\t\tfields: Array,\n\t\tselected: {\n\t\t\ttype: Array,\n\t\t\tdefault: []\n\t\t},\n\t\tnames: {\n\t\t\ttype: Object,\n\t\t\tdefault: {}\n\t\t}\n\t},\n\temits: {\n\t\thide: ['fieldName'],\n\t\tshow: ['fieldName']\n\t},\n\tdata: function() {\n\t\treturn {\n\t\t\tselectedFields: []\n\t\t};\n\t},\n\twatch: {\n\t\tselected(n) {\n\t\t\tthis.selectedFields = n;\n\t\t}\n\t},\n\tmethods: {\n\t\ttoggle(field) {\n\t\t\tif (this.selectedFields.indexOf(field) != -1)\n\t\t\t{\n\t\t\t\tthis.selectedFields.splice(this.selectedFields.indexOf(field), 1);\n\t\t\t\tthis.$emit('hide', field);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis.selectedFields.push(field);\n\t\t\t\tthis.$emit('show', field);\n\t\t\t}\n\t\t}\n\t},\n\ttemplate: `\n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\t{{ names[fieldToDisplay] || fieldToDisplay }}\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t\n\t`\n};\n\n","/**\n * Copyright (C) 2022 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nconst DEFAULT_ICONS = {\n\tjsonLines: 'fa-file-lines',\n\txlsx: 'fa-file-excel',\n\tpdf: 'fa-file-pdf',\n\thtml: 'fa-file-code',\n\tjson: 'fa-file',\n\tcsv: 'fa-file-csv'\n};\nconst DEFAULT_LABELS = {\n\tjsonLines: 'Download as JSONLINES',\n\txlsx: 'Download as XLSX',\n\tpdf: 'Download as PDF',\n\thtml: 'Download as HTML',\n\tjson: 'Download as JSON',\n\tcsv: 'Download as CSV '\n};\n\n\n/**\n *\n */\nexport default {\n\tprops: {\n\t\ttabulator: Object,\n\t\tconfig: {\n\t\t\ttype: [Boolean, String, Function, Array, Object],\n\t\t\tdefault: false\n\t\t},\n\t\ticonClass: [String, Array, Object]\n\t},\n\tcomputed: {\n\t\tcurrentConfig() {\n\t\t\tif (!this.config)\n\t\t\t\treturn false;\n\n\t\t\tlet config = this.config;\n\n\t\t\tif (config instanceof Function)\n\t\t\t\treturn [config];\n\n\t\t\tif (config === null)\n\t\t\t\treturn [];\n\n\t\t\tif (this.config === true)\n\t\t\t\tconfig = ['csv'];\n\n\t\t\tif (Object.prototype.toString.call(config) === \"[object String]\")\n\t\t\t\tconfig = config.split(',');\n\n\t\t\tif (typeof config === 'object' && !Array.isArray(config)) {\n\t\t\t\tlet newConfig = [];\n\t\t\t\tfor (var k in config) {\n\t\t\t\t\tvar v = config[k], type;\n\t\t\t\t\t\n\t\t\t\t\tif (!v)\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\n\t\t\t\t\tif (Object.prototype.toString.call(v) === \"[object String]\") {\n\t\t\t\t\t\ttype = this.stringToFileFormatter(v);\n\t\t\t\t\t\tif (type !== null) {\n\t\t\t\t\t\t\tnewConfig.push({\n\t\t\t\t\t\t\t\ticon: 'fa-solid ' + DEFAULT_ICONS[type],\n\t\t\t\t\t\t\t\tlabel: v === k ? DEFAULT_LABELS[type] : k,\n\t\t\t\t\t\t\t\tformatter: type\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttype = this.stringToFileFormatter(k);\n\t\t\t\t\t\t\tif(type !== null) {\n\t\t\t\t\t\t\t\tnewConfig.push({\n\t\t\t\t\t\t\t\t\ticon: 'fa-solid ' + DEFAULT_ICONS[type],\n\t\t\t\t\t\t\t\t\tlabel: v,\n\t\t\t\t\t\t\t\t\tformatter: type\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\talert('neither ' + k + ' nor ' + v + ' are supported download file types');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (typeof v === 'object' && !Array.isArray(v)) {\n\t\t\t\t\t\ttype = this.stringToFileFormatter(k);\n\t\t\t\t\t\tif (type !== null) {\n\t\t\t\t\t\t\tif (v.formatter === undefined)\n\t\t\t\t\t\t\t\tv.formatter = type;\n\t\t\t\t\t\t\tif (v.label === undefined)\n\t\t\t\t\t\t\t\tv.label = DEFAULT_LABELS[type];\n\t\t\t\t\t\t\tif (v.icon === undefined)\n\t\t\t\t\t\t\t\tv.icon = DEFAULT_ICONS[type];\n\t\t\t\t\t\t\tnewConfig.push(v);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (v.label === undefined)\n\t\t\t\t\t\t\t\tv.label = k;\n\t\t\t\t\t\t\tnewConfig.push(v);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttype = this.stringToFileFormatter(k);\n\t\t\t\t\t\tif (type !== null) {\n\t\t\t\t\t\t\tnewConfig.push({\n\t\t\t\t\t\t\t\ticon: 'fa-solid ' + DEFAULT_ICONS[type],\n\t\t\t\t\t\t\t\tlabel: DEFAULT_LABELS[type],\n\t\t\t\t\t\t\t\tformatter: type\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\talert(k + ' is not a supported download file type');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconfig = newConfig;\n\t\t\t}\n\n\t\t\tif (Array.isArray(config))\n\t\t\t{\n\t\t\t\tconfig = config.map(el => {\n\t\t\t\t\tif (Object.prototype.toString.call(el) === \"[object String]\") {\n\t\t\t\t\t\tlet formatter = this.stringToFileFormatter(el);\n\t\t\t\t\t\tif (formatter === null)\n\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\ticon: 'fa-solid ' + DEFAULT_ICONS[formatter],\n\t\t\t\t\t\t\tlabel: DEFAULT_LABELS[formatter],\n\t\t\t\t\t\t\tformatter\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (el instanceof Function)\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tformatter: el\n\t\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (typeof el === 'object' && !Array.isArray(el) && el !== null) {\n\t\t\t\t\t\tif (el.formatter instanceof Function)\n\t\t\t\t\t\t\treturn el;\n\t\t\t\t\t\tif (this.validateFileFormatter(el.formatter))\n\t\t\t\t\t\t\treturn el;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\treturn null;\n\t\t\t\t}).filter(el => el !== null);\n\n\t\t\t\tif (config.length < 2)\n\t\t\t\t\treturn config;\n\n\t\t\t\tif (config.filter(el => el.label || el.icon).length == config.length)\n\t\t\t\t\treturn config;\n\n\t\t\t\talert('Config not valid');\n\t\t\t}\n\n\t\t\treturn [];\n\t\t}\n\t},\n\tmethods: {\n\t\tstringToFileFormatter(input) {\n\t\t\tlet lcInput = input.toLowerCase();\n\t\t\t\n\t\t\tif (lcInput == 'jsonlines')\n\t\t\t\treturn 'jsonLines';\n\t\t\t\n\t\t\tif (['xlsx', 'pdf', 'html', 'json', 'csv'].includes(lcInput))\n\t\t\t\treturn lcInput;\n\n\t\t\treturn null;\n\t\t},\n\t\tvalidateFileFormatter(input) {\n\t\t\tlet formatter = this.stringToFileFormatter(input);\n\t\t\tif (!formatter) {\n\t\t\t\talert(input + ' is not a supported file formatter');\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (formatter == 'xlsx') {\n\t\t\t\tif (!window.XLSX) {\n\t\t\t\t\talert('XLSX Library not loaded');\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (formatter == 'pdf') {\n\t\t\t\tif (!window.jspdf) {\n\t\t\t\t\talert('jsPDF Library not loaded');\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tvar doc = new jspdf.jsPDF({});\n\t\t\t\tif (!doc.autoTable) {\n\t\t\t\t\talert('jsPDF-AutoTable Plugin not loaded');\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t\tdownload(config) {\n\t\t\tthis.tabulator.download(config.formatter, config.file, config.options)\n\t\t}\n\t},\n\ttemplate: `\n\t\n\t`\n};\n\n","const elementDataMap = new WeakMap();\n\nexport default {\n\tmounted(el, binding) {\n\t\tlet open = false;\n\t\telementDataMap.set(el, evt => {\n\t\t\tif (!open)\n\t\t\t\treturn;\n\n\t\t\tif (el.contains(evt.target))\n\t\t\t\treturn;\n\n\t\t\tconst collapse = bootstrap.Collapse.getInstance(el)\n\t\t\tif (collapse)\n\t\t\t\tcollapse.hide();\n\t\t});\n\t\tel.addEventListener('shown.bs.collapse', () => {\n\t\t\topen = true;\n\t\t});\n\t\tel.addEventListener('hide.bs.collapse', () => {\n\t\t\topen = false;\n\t\t});\n\t\tdocument.addEventListener('click', elementDataMap.get(el), true);\n\t},\n\tbeforeUnmount(el, binding) {\n\t\tdocument.removeEventListener('click', elementDataMap.get(el));\n\t\tdelete el.collapsibleAutoHideFunc;\n\t}\n}","/**\n * This may need changes if Tabulator gets updated!\n *\n * Current working Version: 5.5.2\n * \n * This is a copy of the fitDataStretch function. The only difference\n * is the check for frozen columns on line 22.\n */\n\nexport default window.Tabulator?.extendModule(\"layout\", \"modes\", {\n\tfitDataStretchFrozen(columns, forced) {\n\t\tvar colsWidth = 0,\n\t\ttableWidth = this.table.rowManager.element.clientWidth,\n\t\tgap = 0,\n\t\tlastCol = false;\n\n\t\tcolumns.forEach((column, i) => {\n\t\t\tif (!column.widthFixed) {\n\t\t\t\tcolumn.reinitializeWidth();\n\t\t\t}\n\n\t\t\tif (this.table.options.responsiveLayout ? column.modules.responsive.visible : column.visible && !column.definition.frozen) {\n\t\t\t\tlastCol = column;\n\t\t\t}\n\n\t\t\tif (column.visible) {\n\t\t\t\tcolsWidth += column.getWidth();\n\t\t\t}\n\t\t});\n\n\t\tif (lastCol){\n\t\t\tgap = tableWidth - colsWidth + lastCol.getWidth();\n\n\t\t\tif (this.table.options.responsiveLayout && this.table.modExists(\"responsiveLayout\", true)) {\n\t\t\t\tlastCol.setWidth(0);\n\t\t\t\tthis.table.modules.responsiveLayout.update();\n\t\t\t}\n\n\t\t\tif (gap > 0) {\n\t\t\t\tlastCol.setWidth(gap);\n\t\t\t} else {\n\t\t\t\tlastCol.reinitializeWidth();\n\t\t\t}\n\t\t} else {\n\t\t\tif (this.table.options.responsiveLayout && this.table.modExists(\"responsiveLayout\", true)) {\n\t\t\t\tthis.table.modules.responsiveLayout.update();\n\t\t\t}\n\t\t}\n\t}\n});\n","/**\n * Copyright (C) 2025 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tsaveCustomFilter(wsParams) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/filter/saveCustomFilter',\n\t\t\tparams: {\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tcustomFilterName: wsParams.customFilterName\n\t\t\t}\n\t\t};\n\t},\n\tremoveCustomFilter(wsParams) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/filter/removeCustomFilter',\n\t\t\tparams: {\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterId: wsParams.filterId\n\t\t\t}\n\t\t};\n\t},\n\tapplyFilterFields(wsParams) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/filter/applyFilterFields',\n\t\t\tparams: {\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterFields: wsParams.filterFields\n\t\t\t}\n\t\t};\n\t},\n\taddFilterField(wsParams) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/filter/addFilterField',\n\t\t\tparams: {\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterField: wsParams.filterField\n\t\t\t}\n\t\t};\n\t},\n\tremoveFilterField(wsParams) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/filter/removeFilterField',\n\t\t\tparams: {\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterField: wsParams.filterField\n\t\t\t}\n\t\t};\n\t},\n\tgetFilterById(wsParams) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/filter/getFilter',\n\t\t\tparams: {\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterId: wsParams.filterId\n\t\t\t}\n\t\t};\n\t},\n\tgetFilter(wsParams) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/filter/getFilter',\n\t\t\tparams: {\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType\n\t\t\t}\n\t\t};\n\t}\n};","/**\n * Copyright (C) 2022 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nimport {CoreFetchCmpt} from '../../components/Fetch.js';\nimport FilterConfig from './Filter/Config.js';\nimport FilterColumns from './Filter/Columns.js';\nimport TableDownload from './Table/Download.js';\nimport collapseAutoClose from '../../directives/collapseAutoClose.js';\n\nimport moduleLayoutFitDataStretchFrozen from '../../tabulator/layouts/fitDataStretchFrozen.js';\n\nimport ApiFilter from '../../api/factory/filter.js';\n\n//\nconst FILTER_COMPONENT_NEW_FILTER = 'Filter Component New Filter';\nconst FILTER_COMPONENT_NEW_FILTER_TYPE = 'Filter Component New Filter Type';\n\nvar _uuid = 0;\n\n/**\n *\n */\nexport const CoreFilterCmpt = {\n\tcomponents: {\n\t\tCoreFetchCmpt,\n\t\tFilterConfig,\n\t\tFilterColumns,\n\t\tTableDownload\n\t},\n\tdirectives: {\n\t\tcollapseAutoClose\n\t},\n\temits: [\n\t\t'nwNewEntry',\n\t\t'click:new',\n\t\t'tableBuilt',\n\t\t'uuidDefined'\n\t],\n\tprops: {\n\t\tonNwNewEntry: Function, // NOTE(chris): Hack to get the nwNewEntry listener into $props\n\t\ttitle: String,\n\t\tdescription: String,\n\t\tsideMenu: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true\n\t\t},\n\t\tfilterType: {\n\t\t\ttype: String\n\t\t},\n\t\ttabulatorOptions: Object,\n\t\ttabulatorEvents: Array,\n\t\ttableOnly: Boolean,\n\t\tnoColumnFilter:Boolean,\n\t\treload: Boolean,\n\t\treloadBtnInfotext: String,\n\t\tdownload: {\n\t\t\ttype: [Boolean, String, Function, Array, Object],\n\t\t\tdefault: false\n\t\t},\n\t\tnewBtnShow: Boolean,\n\t\tnewBtnClass: [String, Array, Object],\n\t\tnewBtnDisabled: Boolean,\n\t\tnewBtnLabel: String,\n\t\tuniqueId: String,\n\n\t\tidField: String,\n\t\tparentIdField: String,\n\t\tcountOnly: Boolean,\n\t\tuseSelectionSpan: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true\n\t\t}\n\t},\n\tdata: function() {\n\t\treturn {\n\t\t\tuuid: 0,\n\t\t\t// FilterCmpt properties\n\t\t\tfilterName: null,\n\t\t\tfilterActive: false,\n\t\t\tfields: null,\n\t\t\tdataset: null,\n\t\t\tdatasetMetadata: null,\n\t\t\tselectedFields: null,\n\t\t\tfilterFields: null,\n\n\t\t\tavailableFilters: null,\n\t\t\tselectedFilter: null,\n\n\t\t\t// FetchCmpt binded properties\n\t\t\tfetchCmptRefresh: false,\n\t\t\tfetchCmptApiFunction: null,\n\t\t\tfetchCmptApiFunctionParams: null,\n\t\t\tfetchCmptDataFetched: null,\n\n\t\t\tfetchResult: null,\n\n\t\t\ttabulator: null,\n\t\t\ttableBuilt: false,\n\t\t\ttabulatorHasSelector: false,\n\t\t\tselectedData: [],\n\t\t\tpersistence: {\n\t\t\t\tsort: true,\n\t\t\t\tcolumns: true,\n\t\t\t\tfilter: false,\n\t\t\t\theaderFilter: false,\n\t\t\t\tgroup: false,\n\t\t\t\tpage: false,\n\t\t\t}\n\t\t};\n\t},\n\tcomputed: {\n\t\tnotSelectedFields() {\n\t\t\tif (!this.fields || !this.selectedFields)\n\t\t\t\treturn null;\n\t\t\treturn this.fields.filter(x => this.selectedFields.indexOf(x) === -1)\n\t\t},\n\t\tfilteredData() {\n\t\t\tif (!this.dataset)\n\t\t\t\treturn [];\n\t\t\treturn JSON.parse(JSON.stringify(this.dataset));\n\t\t},\n\t\tfilteredColumns() {\n\t\t\tlet fields = JSON.parse(JSON.stringify(this.fields)) || [];\n\t\t\tlet selectedFields = JSON.parse(JSON.stringify(this.selectedFields)) || [];\n\n\t\t\tlet columns = null;\n\n\t\t\t// If the tabulator options has been provided and it contains the property columns\n\t\t\tif (this.tabulatorOptions && this.tabulatorOptions.hasOwnProperty('columns'))\n\t\t\t\tcolumns = this.tabulatorOptions.columns;\n\n\t\t\t// If columns is not an array or it is an array with less elements then the array fields\n\t\t\tif (!Array.isArray(columns) || (Array.isArray(columns) && columns.length < fields.length))\n\t\t\t{\n\t\t\t\tcolumns = []; // set it as an empty array\n\n\t\t\t\t// Loop throught all the retrieved columns from database\n\t\t\t\tfor (let field of fields)\n\t\t\t\t{\n\t\t\t\t\t// Create a new column having the title equal to the field name\n\t\t\t\t\tlet column = {\n\t\t\t\t\t\ttitle: field,\n\t\t\t\t\t\tfield: field\n\t\t\t\t\t};\n\n\t\t\t\t\t// If the column has to be displayed or not\n\t\t\t\t\tcolumn.visible = selectedFields.indexOf(field) >= 0;\n\n\t\t\t\t\t// Add the new column to the list of columns\n\t\t\t\t\tcolumns.push(column);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse // the property columns has been provided in the tabulator options\n\t\t\t{\n\t\t\t\t// Loop throught the property columns of the tabulator options\n\t\t\t\tfor (let col of columns)\n\t\t\t\t{\n\t\t\t\t\t// If the column has to be displayed or not\n\t\t\t\t\t/* fields.indexOf(col.field) == -1; ensures displaying formatter colums\n\t\t\t\t\te.g. column with rowSelection checkboxes or with custom formatted action buttons */\n\t\t\t\t\tcol.visible = selectedFields.indexOf(col.field) >= 0 || fields.indexOf(col.field) == -1;\n\n\t\t\t\t\tif (col.hasOwnProperty('resizable'))\n\t\t\t\t\t\tcol.resizable = col.visible;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn columns;\n\t\t},\n\t\tfieldIdsForVisibilty() {\n\t\t\tif (!this.tableBuilt)\n\t\t\t\treturn [];\n\t\t\treturn this.tabulator.getColumns().filter(col => {\n\t\t\t\tlet def = col.getDefinition();\n\t\t\t\treturn !def.frozen && def.title && def.formatter != \"responsiveCollapse\";\n\t\t\t}).map(col => col.getField());\n\t\t},\n\t\tfieldNames() {\n\t\t\tif (!this.tableBuilt)\n\t\t\t\treturn {};\n\t\t\treturn this.tabulator.getColumns().reduce((res, col) => {\n\t\t\t\tres[col.getField()] = col.getDefinition().title;\n\t\t\t\treturn res;\n\t\t\t}, {});\n\t\t},\n\t\tidExtra() {\n\t\t\tif (!this.uuid)\n\t\t\t\treturn '';\n\t\t\treturn '-' + this.uuid;\n\t\t},\n\t\tcolumnsForFilter() {\n\t\t\tif (!this.filteredColumns || !this.datasetMetadata)\n\t\t\t\treturn [];\n\t\t\tconst filterTitles = this.filteredColumns.reduce((a,c) => {\n\t\t\t\ta[c.field] = c.title;\n\t\t\t\treturn a;\n\t\t\t}, {});\n\t\t\treturn this.datasetMetadata.map(el => ({...el, ...{title: filterTitles[el.name]}}));\n\t\t}\n\t},\n\tmethods: {\n\t\treloadTable() {\n\t\t\tif (this.tableOnly)\n\t\t\t\tthis.tabulator.setData();\n\t\t\telse\n\t\t\t\tthis.getFilter();\n\t\t},\n\t\tasync initTabulator() {\n\t\t\tlet placeholder = '< Phrasen Plugin not loaded! >';\n\t\t\tif (this.$p) {\n\t\t\t\tawait this.$p.loadCategory('ui');\n\t\t\t\tplaceholder = this.$p.t('ui/keineDatenVorhanden');\n\t\t\t}\n\n\t\t\tif (!this.tableOnly) {\n\t\t\t\t// prefetch data to get fields & selectedFields for filteredColumns & filteredData\n\t\t\t\tawait new Promise(resolve => {\n\t\t\t\t\tconst filterId = window.location.hash ? window.location.hash.slice(1) : null;\n\n\t\t\t\t\tconst resolvePromiseFunc = data => {\n\t\t\t\t\t\tthis.setRenderData(data);\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t};\n\t\t\t\t\t// get the filter data\n\t\t\t\t\tif (filterId === null)\n\t\t\t\t\t\tthis.startFetchCmpt(\n\t\t\t\t\t\t\twsParams => this.$api.call(ApiFilter.getFilter(wsParams)),\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\tresolvePromiseFunc\n\t\t\t\t\t\t);\n\t\t\t\t\telse\n\t\t\t\t\t\tthis.startFetchCmpt(\n\t\t\t\t\t\t\twsParams => this.$api.call(ApiFilter.getFilterById(wsParams)),\n\t\t\t\t\t\t\t{ filterId },\n\t\t\t\t\t\t\tresolvePromiseFunc\n\t\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Define a default tabulator options in case it was not provided\n\t\t\tlet tabulatorOptions = {...{\n\t\t\t\t\tlayout: \"fitDataStretchFrozen\",\n\t\t\t\t\tmovableColumns: true,\n\t\t\t\t\tcolumnDefaults:{\n\t\t\t\t\t\ttooltip: true\n\t\t\t\t\t},\n\t\t\t\t\tplaceholder,\n\t\t\t\t\tpersistence: this.persistence,\n\t\t\t\t}, ...(this.tabulatorOptions || {})};\n\n\t\t\t// set default height if no height property is set\n\t\t\tif (tabulatorOptions.height === undefined &&\n\t\t\t\ttabulatorOptions.minHeight === undefined &&\n\t\t\t\ttabulatorOptions.maxHeight === undefined) {\n\t\t\t\ttabulatorOptions.height = 500;\n\t\t\t}\n\n\t\t\tif (!this.tableOnly) {\n\t\t\t\ttabulatorOptions.data = this.filteredData;\n\t\t\t\ttabulatorOptions.columns = this.filteredColumns;\n\t\t\t} else {\n\t\t\t\ttabulatorOptions.columns.forEach(col => {\n\t\t\t\t\tif (col.visible === undefined)\n\t\t\t\t\t\tcol.visible = true;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (tabulatorOptions.selectable || (tabulatorOptions.columns && tabulatorOptions.columns.filter(el => el.formatter == 'rowSelection').length))\n\t\t\t\tthis.tabulatorHasSelector = true;\n\n\t\t\tif (this.idField) {\n\t\t\t\t// enable nested tabulator if parent Id given\n\t\t\t\tif (this.parentIdField) tabulatorOptions.dataTree = true;\n\t\t\t\t// set tabulator index\n\t\t\t\ttabulatorOptions.index = this.idField;\n\t\t\t}\n\n\t\t\t// Start the tabulator with the build options\n\t\t\tthis.tabulator = new Tabulator(\n\t\t\t\tthis.$refs.table,\n\t\t\t\ttabulatorOptions\n\t\t\t);\n\t\t\t// If event handlers have been provided\n\t\t\tif (Array.isArray(this.tabulatorEvents) && this.tabulatorEvents.length > 0)\n\t\t\t{\n\t\t\t\t// Attach all the provided event handlers to the started tabulator\n\t\t\t\tfor (let evt of this.tabulatorEvents)\n\t\t\t\t\tthis.tabulator.on(evt.event, evt.handler);\n\t\t\t}\n\t\t\tthis.tabulator.on('tableBuilt', () => {this.tableBuilt = true; this.$emit('tableBuilt');});\n\t\t\tthis.tabulator.on(\"rowSelectionChanged\", data => {\n\t\t\t\tthis.selectedData = data;\n\t\t\t});\n\n\t\t\t// if nested tabulator, restructure data\n\t\t\tif (this.parentIdField && this.idField) {\n\t\t\t\tthis.tabulator.on(\"dataLoading\", data => {\n\t\t\t\t\tlet toDelete = [];\n\n\t\t\t\t\t// loop through all data\n\t\t\t\t\tfor (let childIdx = 0; childIdx < data.length; childIdx++)\n\t\t\t\t\t{\n\t\t\t\t\t\tlet child = data[childIdx];\n\n\t\t\t\t\t\t// if it has parent id, it is a child\n\t\t\t\t\t\tif (child[this.parentIdField])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// append the child on the right place. If parent found, mark original sw child on 0 level for deleting\n\t\t\t\t\t\t\tif (this.appendChild(data, child)) toDelete.push(childIdx);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// delete the marked children from 0 level\n\t\t\t\t\tfor (let counter = 0; counter < toDelete.length; counter++)\n\t\t\t\t\t{\n\t\t\t\t\t\t// decrease index by counter as index of data array changes after every deletion\n\t\t\t\t\t\tdata.splice(toDelete[counter] - counter, 1);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (this.tableOnly) {\n\t\t\t\tthis.tabulator.on('tableBuilt', () => {\n\t\t\t\t\tconst cols = this.tabulator.getColumns();\n\t\t\t\t\tthis.fields = cols.map(col => col.getField());\n\t\t\t\t\tthis.selectedFields = cols.filter(col => col.isVisible()).map(col => col.getField());\n\t\t\t\t\tif (this.tabulator.options.persistence.headerFilter)\n\t\t\t\t\t\tthis._setHeaderFilter();\n\t\t\t\t});\n\n\t\t\t}\n\n\t\t\tthis.tabulator.on(\"dataFiltered\", filters => {\n\t\t\t\tthis.filterActive = filters.length > 0;\n\t\t\t});\n\t\t},\n\t\tupdateTabulator() {\n\t\t\tif (this.tabulator) {\n\t\t\t\tif (this.tableBuilt)\n\t\t\t\t\tthis._updateTabulator();\n\t\t\t\telse\n\t\t\t\t\tthis.tabulator.on('tableBuilt', this._updateTabulator);\n\t\t\t}\n\t\t},\n\t\t_updateTabulator() {\n\t\t\tthis.tabulatorHasSelector = this.tabulatorOptions.selectable || this.filteredColumns.filter(el => el.formatter == 'rowSelection').length;\n\t\t\tthis.tabulator.setColumns(this.filteredColumns);\n\t\t\tthis.tabulator.setData(this.filteredData);\n\t\t\tthis._setHeaderFilter()\n\t\t},\n\t\tclearFilters()\n\t\t{\n\t\t\tlet existingFilters = this.tabulator.getHeaderFilters();\n\t\t\texistingFilters.forEach(filter => {\n\t\t\t\tthis.tabulator.setHeaderFilterValue(filter.field, \"\");\n\t\t\t});\n\t\t\tthis.tabulator.clearFilter();\n\t\t\tthis.filterActive = false;\n\t\t},\n\t\t_setHeaderFilter()\n\t\t{\n\t\t\tconst existingFilters = this.tabulator.getHeaderFilters();\n\t\t\texistingFilters.forEach(filter => {\n\t\t\t\tthis.tabulator.setHeaderFilterValue(filter.field, filter.value);\n\t\t\t});\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\tgetFilter() {\n\t\t\tif (this.selectedFilter === null)\n\t\t\t\tthis.startFetchCmpt(\n\t\t\t\t\twsParams => this.$api.call(ApiFilter.getFilter(wsParams)),\n\t\t\t\t\tnull,\n\t\t\t\t\tthis.render\n\t\t\t\t);\n\t\t\telse\n\t\t\t\tthis.startFetchCmpt(\n\t\t\t\t\twsParams => this.$api.call(ApiFilter.getFilterById(wsParams)),\n\t\t\t\t\t{\n\t\t\t\t\t\tfilterId: this.selectedFilter\n\t\t\t\t\t},\n\t\t\t\t\tthis.render\n\t\t\t\t);\n\t\t},\n\t\tsetRenderData(data) {\n\t\t\tthis.fetchResult = data;\n\t\t\tthis.filterName = data.filterName;\n\t\t\tthis.dataset = data.dataset;\n\t\t\tthis.datasetMetadata = data.datasetMetadata;\n\n\t\t\tthis.fields = data.fields;\n\t\t\tthis.selectedFields = data.selectedFields;\n\t\t\tthis.filterFields = [];\n\n\t\t\tfor (let i = 0; i < data.datasetMetadata.length; i++)\n\t\t\t{\n\t\t\t\tfor (let j = 0; j < data.filters.length; j++)\n\t\t\t\t{\n\t\t\t\t\tif (data.datasetMetadata[i].name == data.filters[j].name)\n\t\t\t\t\t{\n\t\t\t\t\t\tlet filter = data.filters[j];\n\t\t\t\t\t\tfilter.type = data.datasetMetadata[i].type;\n\n\t\t\t\t\t\tthis.filterFields.push(filter);\n\t\t\t\t\t\t//break;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\trender(response) {\n\t\t\tlet data = response;\n\n\t\t\tthis.setRenderData(data);\n\n\t\t\t// If the side menu is active\n\t\t\tif (this.sideMenu === true)\n\t\t\t{\n\t\t\t\tthis.setSideMenu(data);\n\t\t\t}\n\t\t\telse // otherwise use the dropdown in the filter options\n\t\t\t{\n\t\t\t\tthis.setDropDownMenu(data);\n\t\t\t}\n\t\t\tthis.updateTabulator();\n\t\t},\n\t\t/**\n\t\t * Set the menu\n\t\t */\n\t\tsetSideMenu(data) {\n\t\t\tlet filters = data.sideMenu.filters;\n\t\t\tlet personalFilters = data.sideMenu.personalFilters;\n\t\t\tlet filtersArray = [];\n\n\t\t\tfor (let filtersCount = 0; filtersCount < filters.length; filtersCount++)\n\t\t\t{\n\t\t\t\tlet link = filters[filtersCount].link;\n\n\t\t\t\tif (link == null) link = '#';\n\n\t\t\t\tfiltersArray[filtersArray.length] = {\n\t\t\t\t\tid: filters[filtersCount].filter_id,\n\t\t\t\t\tlink: link + filters[filtersCount].filter_id,\n\t\t\t\t\tdescription: filters[filtersCount].desc,\n\t\t\t\t\tsort: filtersCount,\n\t\t\t\t\tonClickCall: this.handlerGetFilterById\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tfor (let filtersCount = 0; filtersCount < personalFilters.length; filtersCount++)\n\t\t\t{\n\t\t\t\tlet link = personalFilters[filtersCount].link;\n\n\t\t\t\tif (link == null) link = '#';\n\n\t\t\t\tfiltersArray[filtersArray.length] = {\n\t\t\t\t\tid: personalFilters[filtersCount].filter_id,\n\t\t\t\t\tlink: link + personalFilters[filtersCount].filter_id,\n\t\t\t\t\tdescription: personalFilters[filtersCount].desc,\n\t\t\t\t\tsubscriptDescription: personalFilters[filtersCount].subscriptDescription,\n\t\t\t\t\tsubscriptLinkClass: personalFilters[filtersCount].subscriptLinkClass,\n\t\t\t\t\tsubscriptLinkValue: personalFilters[filtersCount].subscriptLinkValue,\n\t\t\t\t\tsort: filtersCount,\n\t\t\t\t\tonClickCall: this.handlerGetFilterById,\n\t\t\t\t\tonClickSubscriptCall: this.handlerRemoveCustomFilter\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tthis.availableFilters = filtersArray;\n\n\t\t\tthis.$emit(\n\t\t\t\t'nwNewEntry',\n\t\t\t\t{\n\t\t\t\t\tlink: \"#\",\n\t\t\t\t\tdescription: \"Filters\",\n\t\t\t\t\ticon: \"filter\",\n\t\t\t\t\tchildren: filtersArray\n\t\t\t\t}\n\t\t\t);\n\t\t},\n\t\t/**\n\t\t * Set the drop down menu\n\t\t */\n\t\tsetDropDownMenu(data) {\n\t\t\tlet filters = data.sideMenu.filters;\n\t\t\tlet personalFilters = data.sideMenu.personalFilters;\n\t\t\tlet filtersArray = [];\n\n\t\t\tfor (let filtersCount = 0; filtersCount < filters.length; filtersCount++)\n\t\t\t{\n\t\t\t\tlet link = filters[filtersCount].link;\n\n\t\t\t\tif (link == null) link = '#';\n\n\t\t\t\tfiltersArray[filtersArray.length] = {\n\t\t\t\t\tid: filters[filtersCount].filter_id,\n\t\t\t\t\toption: filters[filtersCount].filter_id,\n\t\t\t\t\tdescription: filters[filtersCount].desc\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tfor (let filtersCount = 0; filtersCount < personalFilters.length; filtersCount++)\n\t\t\t{\n\t\t\t\tlet link = personalFilters[filtersCount].link;\n\n\t\t\t\tif (link == null) link = '#';\n\n\t\t\t\tfiltersArray[filtersArray.length] = {\n\t\t\t\t\tid: personalFilters[filtersCount].filter_id,\n\t\t\t\t\toption: personalFilters[filtersCount].filter_id,\n\t\t\t\t\tdescription: personalFilters[filtersCount].desc\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tthis.availableFilters = filtersArray;\n\t\t},\n\t\t/**\n\t\t * Used to start/refresh the FetchCmpt\n\t\t */\n\t\tstartFetchCmpt(apiFunction, apiFunctionParameters, dataFetchedCallback) {\n\t\t\t// Assign the function api of the FetchCmpt binded property\n\t\t\tthis.fetchCmptApiFunction = apiFunction;\n\n\t\t\t// In case a null value is provided set the parameters as an empty object\n\t\t\tif (apiFunctionParameters == null) apiFunctionParameters = {};\n\n\t\t\t// Always needed parameters\n\t\t\tapiFunctionParameters.filterUniqueId = FHC_JS_DATA_STORAGE_OBJECT.called_path + \"/\" + FHC_JS_DATA_STORAGE_OBJECT.called_method;\n\t\t\tapiFunctionParameters.filterType = this.filterType;\n\n\t\t\tif (this.uniqueId)\n\t\t\t\tapiFunctionParameters.filterUniqueId += '_' + this.uniqueId;\n\n\t\t\t// Assign parameters to the FetchCmpt binded properties\n\t\t\tthis.fetchCmptApiFunctionParams = apiFunctionParameters;\n\t\t\t// Assign data fetch callback to the FetchCmpt binded properties\n\t\t\tthis.fetchCmptDataFetched = dataFetchedCallback;\n\t\t\t// Set the FetchCmpt binded property refresh to have the component to refresh\n\t\t\t// NOTE: this should be the last one to be called because it triggers the FetchCmpt to start to refresh\n\t\t\tthis.fetchCmptRefresh === true ? this.fetchCmptRefresh = false : this.fetchCmptRefresh = true;\n\t\t},\n\n\t\t// ------------------------------------------------------------------------------------------------------------------\n\t\t// Event handlers\n\n\t\t/**\n\t\t *\n\t\t */\n\t\thandlerSaveCustomFilter(customFilterName) {\n\t\t\tthis.selectedFilter = null;\n\t\t\t//\n\t\t\tthis.startFetchCmpt(\n\t\t\t\twsParams => this.$api.call(ApiFilter.saveCustomFilter(wsParams)),\n\t\t\t\t{\n\t\t\t\t\tcustomFilterName\n\t\t\t\t},\n\t\t\t\tthis.getFilter\n\t\t\t);\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\thandlerRemoveCustomFilter(event) {\n\t\t\tlet filterId = event.currentTarget.getAttribute(\"href\").substring(1);\n\t\t\tif (filterId === this.selectedFilter)\n\t\t\t\tthis.selectedFilter = null;\n\t\t\t//\n\t\t\tthis.startFetchCmpt(\n\t\t\t\twsParams => this.$api.call(ApiFilter.removeCustomFilter(wsParams)),\n\t\t\t\t{\n\t\t\t\t\tfilterId: filterId\n\t\t\t\t},\n\t\t\t\tthis.getFilter\n\t\t\t);\n\t\t},\n\n\t\t/*\n\t\t *\n\t\t */\n\t\thandlerGetFilterById: function(event) {\n\n\t\t\tlet filterId = null;\n\n\t\t\t// Get the attribute href if side menu is rendered\n\t\t\tlet attr = event.currentTarget.getAttribute(\"href\");\n\n\t\t\t// Otherwise get the value of the drop down menu\n\t\t\tif (attr == null)\n\t\t\t{\n\t\t\t\tfilterId = event.currentTarget.value;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfilterId = attr.substring(1);\n\t\t\t}\n\n\t\t\tthis.switchFilter(filterId);\n\t\t},\n\t\tswitchFilter(filterId) {\n\t\t\tthis.selectedFilter = filterId;\n\t\t\tthis.getFilter();\n\t\t},\n\t\tapplyFilterConfig(filterFields) {\n\t\t\tthis.selectedFilter = null;\n\t\t\tthis.startFetchCmpt(\n\t\t\t\twsParams => this.$api.call(ApiFilter.applyFilterFields(wsParams)),\n\t\t\t\t{\n\t\t\t\t\tfilterFields\n\t\t\t\t},\n\t\t\t\tthis.getFilter\n\t\t\t);\n\t\t},\n\n\t\t// append child to it's parent\n\t\tappendChild(data, child) {\n\t\t\t// get parent id\n\t\t\tlet parentId = child[this.parentIdField];\n\n\t\t\t// loop thorugh all data\n\t\t\tfor (let parentIdx = 0; parentIdx < data.length; parentIdx++)\n\t\t\t{\n\t\t\t\tlet parent = data[parentIdx];\n\n\t\t\t\t// if it's the parent\n\t\t\t\tif (parent[this.idField] == parentId)\n\t\t\t\t{\n\t\t\t\t\t// create children array if not done yet\n\t\t\t\t\tif (!parent._children) parent._children = [];\n\n\t\t\t\t\t// if child is not included in children array, append the child\n\t\t\t\t\tif (!parent._children.includes(child)) parent._children.push(child);\n\n\t\t\t\t\t// parent found\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\t// search children for parents\n\t\t\t\telse if (parent._children) this.appendChild(parent._children, child);\n\t\t\t}\n\n\t\t\t// parent not found\n\t\t\treturn false;\n\t\t}\n\t},\n\tbeforeCreate() {\n\t\tif (!this.tableOnly == !this.filterType)\n\t\t\talert('You can not have a filter-type in table-only mode!');\n\t},\n\tcreated() {\n\t\tif (this.sideMenu && (!this.$props.onNwNewEntry || !(this.$props.onNwNewEntry instanceof Function)))\n\t\t\talert('\"nwNewEntry\" listener is mandatory when sideMenu is true');\n\t\tthis.uuid = _uuid++;\n\t\tthis.$emit('uuidDefined', this.uuid)\n\t},\n\tmounted() {\n\t\tthis.initTabulator().then(() => {\n\t\t\tif (!this.tableOnly) {\n\t\t\t\tthis.selectedFilter = window.location.hash ? window.location.hash.slice(1) : null;\n\t\t\t\tthis.render(this.fetchResult);\n\t\t\t}\n\t\t});\n\n\t},\n\ttemplate: `\n\t\t\n\t\t\n\t\t\n\n\t\t
    \n\t\t\t
    \n\t\t\t\t

    \n\t\t\t\t\t{{ title }}\n\t\t\t\t

    \n\t\t\t
    \n\t\t
    \n\t\t
    \n\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t{{ selectedData.length }} ausgewählt\n\t\t\t\t\t\t Mit {{ selectedData.length }} ausgewählten:\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t[ {{ filterName }} ]\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\n\t\t\t\n\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t\n\n\t\t\n\t\t
    \n\t`\n};\n","import BsModal from '../../Bootstrap/Modal.js';\nimport VueDatePicker from '../../vueDatepicker.js.php';\nimport ApiAbgabe from '../../../api/factory/abgabe.js'\n\nconst today = new Date()\nexport const AbgabeMitarbeiterDetail = {\n\tname: \"AbgabeMitarbeiterDetail\",\n\tcomponents: {\n\t\tBsModal,\n\t\tInputNumber: primevue.inputnumber,\n\t\tCheckbox: primevue.checkbox,\n\t\tDropdown: primevue.dropdown,\n\t\tTextarea: primevue.textarea,\n\t\tSpeedDial: primevue.speeddial,\n\t\tAccordion: primevue.accordion,\n\t\tAccordionTab: primevue.accordiontab,\n\t\tMessage: primevue.message,\n\t\tVueDatePicker\n\t},\n\tinject: [\n\t\t'abgabeTypeOptions',\n\t\t'abgabetypenBetreuer',\n\t\t'allowedNotenOptions',\n\t\t'notenOptionsNonFinal',\n\t\t'turnitin_link',\n\t\t'old_abgabe_beurteilung_link'\n\t],\n\tprops: {\n\t\tprojektarbeit: {\n\t\t\ttype: Object,\n\t\t\tdefault: null\n\t\t},\n\t\tisFullscreen: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t},\n\t\tassistenzMode: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tshowAutomagicModalPhrase: false,\n\t\t\teidAkzeptiert: false,\n\t\t\tenduploadTermin: null,\n\t\t\tallActiveLanguages: FHC_JS_DATA_STORAGE_OBJECT.server_languages,\n\t\t\tspeedDialItems: [{\n\t\t\t\tlabel: Vue.computed(() => this.$p.t('abgabetool/c4newAbgabetermin')),\n\t\t\t\ticon: \"fa fa-plus\",\n\t\t\t\tcommand: this.openCreateNewAbgabeModal,\n\t\t\t\tdisabled: Vue.computed(() => !this.getAllowedToCreateNewTermin)\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: Vue.computed(() => this.$p.t('abgabetool/c4benoten')),\n\t\t\t\ticon: \"fa fa-user-check\",\n\t\t\t\tcommand: this.openBenotung,\n\t\t\t\tdisabled: Vue.computed(()=> this.assistenzMode == true)\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: Vue.computed(() => this.$p.t('abgabetool/c4plagiatcheck_link')),\n\t\t\t\ticon: \"fa fa-clipboard-check\",\n\t\t\t\tcommand: this.openPlagiatcheck\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: Vue.computed(() => this.$p.t('abgabetool/c4student_perspective')),\n\t\t\t\ticon: \"fa fa-eye\",\n\t\t\t\tcommand: this.openStudentPage\n\t\t\t}],\n\t\t\tnewTermin: null,\n\t\t\tform: Vue.reactive({\n\t\t\t\tsprache: '',\n\t\t\t\tabstract: '',\n\t\t\t\tabstract_en: '',\n\t\t\t\tschlagwoerter: '',\n\t\t\t\tschlagwoerter_en: '',\n\t\t\t\tkontrollschlagwoerter: '',\n\t\t\t\tseitenanzahl: 1,\n\t\t\t})\n\t\t}\n\t},\n\tmethods: {\n\t\tgetNoteBezeichnung(termin){\n\t\t\tif(termin.note?.bezeichnung) {\n\t\t\t\treturn termin.note?.positiv ? this.$capitalize(this.$p.t('abgabetool/c4positivBenotet')) + ' ✅' : this.$capitalize(this.$p.t('abgabetool/c4negativBenotet')) + ' ❌'\n\t\t\t} else if(termin.bezeichnung?.benotbar === true && !termin.note) {\n\t\t\t\treturn this.$capitalize(this.$p.t('abgabetool/c4notYetGraded'));\n\t\t\t} else {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t},\n\t\tgetPlaceholderTermin(termin) {\n\t\t\treturn termin?.bezeichnung ? this.$p.t('abgabetool/c4paatyp' + termin.paabgabetyp_kurzbz) : this.$p.t('abgabetool/abgabetypPlaceholder')\n\t\t},\n\t\tsaveTermin(termin) {\n\t\t\tconst paabgabe_id = termin.paabgabe_id\n\t\t\ttermin.note_pk = termin.note?.note ?? null\n\t\t\ttermin.betreuer_person_id = this.projektarbeit.betreuer_person_id\n\t\t\t\n\t\t\t// phrasentext 'no late submission allowed' to 'late submission allowed' + boolean UI invert\n\t\t\ttermin.fixtermin = !termin.invertedFixtermin\n\t\t\treturn this.$api.call(ApiAbgabe.postProjektarbeitAbgabe(termin)).then( (res) => {\n\t\t\t\tif(res?.meta?.status == 'success') {\n\t\t\t\t\tthis.$fhcAlert.alertSuccess(this.$p.t('ui/gespeichert'))\n\t\t\t\t\t\n\t\t\t\t\tconst noteOpt = this.allowedNotenOptions.find(opt => opt.note == res.data[0].note)\n\t\t\t\t\tconst newTerminRes = {\n\t\t\t\t\t\t'allowedToSave': true,\n\t\t\t\t\t\t'allowedToDelete': true,\n\t\t\t\t\t\t...res.data[0]\n\t\t\t\t\t}\n\t\t\t\t\tif(newTerminRes.note) newTerminRes.note = noteOpt\n\t\t\t\t\tnewTerminRes.invertedFixtermin = !newTerminRes.fixtermin\n\t\t\t\t\tconst existingTerminRes = res.data[1]\n\t\t\t\t\t\n\t\t\t\t\tconst abgabeOpt = this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz == newTerminRes.paabgabetyp_kurzbz)\n\t\t\t\t\t\n\t\t\t\t\tnewTerminRes.bezeichnung = {\n\t\t\t\t\t\tbezeichnung: termin.bezeichnung?.bezeichnung,\n\t\t\t\t\t\tpaabgabetyp_kurzbz: termin.bezeichnung?.paabgabetyp_kurzbz,\n\t\t\t\t\t\tbenotbar: abgabeOpt.benotbar\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t// only insert new abgabe if we actually created a new one, not when saving/editing existing\n\t\t\t\t\tif(!existingTerminRes){\n\t\t\t\t\t\tthis.projektarbeit.abgabetermine.push(newTerminRes)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst noteOptExisting = this.allowedNotenOptions.find(opt => opt.note == existingTerminRes.note)\n\t\t\t\t\t\texistingTerminRes.note = noteOptExisting\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tthis.projektarbeit.abgabetermine.sort((a, b) =>new Date(a.datum) - new Date(b.datum))\n\t\t\t\t\t\n\t\t\t\t\tconst index = this.projektarbeit.abgabetermine.findIndex(t => termin.paabgabe_id == t.paabgabe_id)\n\t\t\t\t\t\n\t\t\t\t\t// negative abgabe -> automagically open new termin modal\n\t\t\t\t\t// really bad feature imo that will be annoying to deal with\n\t\t\t\t\t\n\t\t\t\t\t// termin is completely new and has negative note\n\t\t\t\t\tconst savedNewWithNegative = !existingTerminRes && !newTerminRes.note?.positiv && newTerminRes.note !== null\n\n\t\t\t\t\t// termin existed previously + oldTermin had different note/positive note or no note at all\n\t\t\t\t\tconst savedExistingNoteAsNegativeAndWasNotNegativeBefore = existingTerminRes && !newTerminRes.note?.positiv && newTerminRes.note !== null && (existingTerminRes.note?.positiv || existingTerminRes.note === undefined)\n\n\t\t\t\t\tconst openModalDueToNegativeBeurteilung = savedNewWithNegative || savedExistingNoteAsNegativeAndWasNotNegativeBefore\n\t\t\t\t\tif(openModalDueToNegativeBeurteilung) {\n\t\t\t\t\t\tthis.newTermin = {\n\t\t\t\t\t\t\t'paabgabe_id': -1,\n\t\t\t\t\t\t\t'projektarbeit_id': this.projektarbeit.projektarbeit_id,\n\t\t\t\t\t\t\t'fixtermin': false,\n\t\t\t\t\t\t\t'invertedFixtermin': true,\n\t\t\t\t\t\t\t'kurzbz': '', // todo kurzbz textfield value vorschlag für qualgates\n\t\t\t\t\t\t\t'datum': new Date().toISOString().split('T')[0],\n\t\t\t\t\t\t\t'note': this.allowedNotenOptions.find(opt => opt.note == 9),\n\t\t\t\t\t\t\t'beurteilungsnotiz': '',\n\t\t\t\t\t\t\t'upload_allowed': false,\n\t\t\t\t\t\t\t'paabgabetyp_kurzbz': '',\n\t\t\t\t\t\t\t'bezeichnung': this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz === newTerminRes.paabgabetyp_kurzbz),\n\t\t\t\t\t\t\t'abgabedatum': null,\n\t\t\t\t\t\t\t'insertvon': this.viewData?.uid ?? ''\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.showAutomagicModalPhrase = true\n\n\t\t\t\t\t\tthis.$refs.modalContainerCreateNewAbgabe.show()\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.showAutomagicModalPhrase = false\t\n\t\t\t\t\t}\n\t\t\t\t} else if(res?.meta?.status == 'error'){\n\t\t\t\t\tthis.$fhcAlert.alertError()\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\topenZusatzdatenModal() {\n\t\t\tthis.$refs.modalContainerZusatzdaten.show()\n\t\t},\n\t\tasync saveZusatzdaten(){\n\t\t\tif (!await this.validateZusatzdaten())\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t\n\t\t\tconst pa = this.projektarbeit\n\n\t\t\t// post endabgabe\n\t\t\tconst formData = new FormData();\n\t\t\tformData.append('projektarbeit_id', this.projektarbeit.projektarbeit_id);\n\n\t\t\tformData.append('sprache', this.form['sprache'].sprache)\n\t\t\tformData.append('abstract', this.form['abstract'])\n\t\t\tformData.append('abstract_en', this.form['abstract_en'])\n\t\t\tformData.append('schlagwoerter', this.form['schlagwoerter'])\n\t\t\tformData.append('schlagwoerter_en', this.form['schlagwoerter_en'])\n\t\t\tformData.append('seitenanzahl', this.form['seitenanzahl'])\n\t\t\t\n\t\t\tthis.loading = true\n\t\t\tthis.$api.call(ApiAbgabe.postStudentProjektarbeitZusatzdaten(formData))\n\t\t\t\t.then(res => {\n\t\t\t\t\tif(res.meta.status == 'success') {\n\t\t\t\t\t\tthis.$fhcAlert.alertSuccess(this.$p.t('ui/gespeichert'))\n\t\t\t\t\t\tif(!data?.retval?.[0]) return\n\t\t\t\t\t\tconst paRes = data.retval[0]\n\t\t\t\t\t\tpa.seitenanzahl = paRes.seitenanzahl ?? 1\n\t\t\t\t\t\tpa.kontrollschlagwoerter = paRes.kontrollschlagwoerter ?? ''\n\t\t\t\t\t\tpa.schlagwoerter = paRes.schlagwoerter ?? ''\n\t\t\t\t\t\tpa.sprache = paRes.sprache ?? ''\n\t\t\t\t\t\tpa.schlagwoerter_en = paRes.schlagwoerter_en ?? ''\n\t\t\t\t\t\tpa.abstract = paRes.abstract ?? ''\n\t\t\t\t\t\tpa.abstract_en = paRes.abstract_en ?? ''\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}).finally(()=> {\n\t\t\t\tthis.loading = false\n\t\t\t})\n\n\t\t\tthis.$refs.modalContainerZusatzdaten.hide()\n\t\t},\n\t\tasync validateZusatzdaten() {\n\t\t\t// just ask once\n\t\t\tif(await this.$fhcAlert.confirm({\n\t\t\t\tmessage: this.$p.t('abgabetool/confirmZusatzdatenSpeichern'),\n\t\t\t\tacceptLabel: this.$capitalize(this.$p.t('abgabetool/c4AcceptAndProceed')),\n\t\t\t\tacceptClass: 'p-button-primary',\n\t\t\t\trejectLabel: this.$capitalize(this.$p.t('abgabetool/c4Cancel')),\n\t\t\t\trejectClass: 'p-button-secondary'\n\t\t\t}) === false) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t\n\t\t\treturn true\n\t\t},\n\t\tasync handleDeleteTermin(termin){\n\t\t\tif(await this.$fhcAlert.confirm({\n\t\t\t\tmessage: this.$p.t('abgabetool/c4confirm_delete'),\n\t\t\t\tacceptLabel: 'Löschen',\n\t\t\t\tacceptClass: 'p-button-danger',\n\t\t\t\trejectLabel: 'Zurück',\n\t\t\t\trejectClass: 'p-button-secondary'\n\t\t\t}) === false) {\n\t\t\t\treturn false\n\t\t\t} else {\n\t\t\t\tthis.deleteTermin(termin)\n\t\t\t}\n\t\t},\n\t\tdeleteTermin(termin) {\n\t\t\tthis.$api.call(ApiAbgabe.deleteProjektarbeitAbgabe(termin.paabgabe_id)).then( (res) => {\n\t\t\t\tif(res?.meta?.status == 'success') {\n\t\t\t\t\tthis.$fhcAlert.alertSuccess(this.$p.t('ui/genericDeleted', [this.$p.t('abgabetool/abgabe')]))\n\t\t\t\t\t// this.$p.t('global/tooltipLektorDeleteKontrolle', [this.$entryParams.permissions.kontrolleDeleteMaxReach ])\n\t\t\t\t\tconst deletedTerminIndex = this.projektarbeit.abgabetermine.findIndex(t => t.paabgabe_id === termin.paabgabe_id)\n\t\t\t\t\tthis.projektarbeit.abgabetermine.splice(deletedTerminIndex, 1)\n\t\t\t\t} else if(res?.meta?.status == 'error'){\n\t\t\t\t\tthis.$fhcAlert.alertError()\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\tvalidate: function(termin) {\n\t\t\tif(!termin.file.length) {\n\t\t\t\tthis.$fhcAlert.alertWarning(this.$p.t('global/warningChooseFile'));\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\treturn true;\n\t\t},\n\t\tdownloadAbgabe(termin) {\n\t\t\tconst url = `/api/frontend/v1/Abgabe/getStudentProjektarbeitAbgabeFile?paabgabe_id=${termin.paabgabe_id}&student_uid=${this.projektarbeit.student_uid}&projektarbeit_id=${this.projektarbeit.projektarbeit_id}`;\n\n\t\t\twindow.open(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + url)\n\t\t\t// this.$api.call(ApiAbgabe.getStudentProjektarbeitAbgabeFile(termin.paabgabe_id, this.projektarbeit.student_uid))\n\t\t},\n\t\tconvertDateToIsoString(date) {\n\t\t\t// 1. Check if it is a Date object AND if the date value is valid (not 'Invalid Date')\n\t\t\tif (param instanceof Date && !isNaN(param.getTime())) {\n\t\t\t\tconst year = param.getFullYear();\n\t\t\t\t// getMonth() is 0-indexed, so we add 1.\n\t\t\t\tconst month = param.getMonth() + 1;\n\t\t\t\tconst day = param.getDate();\n\t\t\n\t\t\t\t// Helper to pad single-digit numbers with a leading zero\n\t\t\t\tconst pad = (num) => String(num).padStart(2, '0');\n\t\t\n\t\t\t\t// Return the formatted string: YYYY-MM-DD\n\t\t\t\treturn `${year}-${pad(month)}-${pad(day)}`;\n\t\t\t}\n\t\t\n\t\t\t// If it's not a valid Date, return the original parameter\n\t\t\treturn param;\n\t\t},\n\t\tdateDiffInDays(datumParam){\n\t\t\tlet datum = datumParam\n\t\t\tif(datumParam instanceof Date && !isNaN(datum.getTime()))\n\t\t\t{\n\t\t\t\tconst year = datumParam.getFullYear();\n\t\t\t\tconst month = datumParam.getMonth() + 1;\t// getMonth() is 0-indexed\n\t\t\t\tconst day = datumParam.getDate();\n\t\t\t\tconst pad = (num) => String(num).padStart(2, '0');\n\t\t\t\tdatum = `${year}-${pad(month)}-${pad(day)}`\t\n\t\t\t}\n\t\t\t\n\t\t\tconst dateToday = luxon.DateTime.now().startOf('day');\n\t\t\tconst dateDatum = luxon.DateTime.fromISO(datum).startOf('day');\n\t\t\tconst duration = dateDatum.diff(dateToday, 'days');\n\t\t\t\n\t\t\treturn duration.values.days;\n\t\t},\n\t\tgetDateStyleClass(termin) {\n\t\t\tconst datum = new Date(termin.datum)\n\t\t\tconst abgabedatum = new Date(termin.abgabedatum)\n\n\t\t\ttermin.diffindays = this.dateDiffInDays(termin.datum)\n\n\t\t\tconst isLate = termin.abgabedatum && abgabedatum > datum;\n\n\t\t\t// GRADE STATUS\n\t\t\tif (termin.note) {\n\t\t\t\tif (termin.note.positiv) return 'bestanden';\n\t\t\t\treturn 'nichtbestanden';\n\t\t\t}\n\n\t\t\t// ACTION REQUIRED FOR GRADE\n\t\t\tif (termin.bezeichnung?.benotbar && datum < today) {\n\t\t\t\treturn 'beurteilungerforderlich';\n\t\t\t}\n\n\t\t\t// SUBMISSION STATUS\n\t\t\tif (termin.upload_allowed) {\n\t\t\t\tif (termin.abgabedatum) {\n\t\t\t\t\treturn isLate ? 'verspaetet' : 'abgegeben';\n\t\t\t\t}\n\n\t\t\t\t// no submission yet\n\t\t\t\tif (datum < today) return 'verpasst';\n\t\t\t\tif (termin.diffindays <= 12) return 'abzugeben';\n\t\t\t\treturn 'standard';\n\t\t\t}\n\n\t\t\t// GENERIC STATUS\n\t\t\treturn datum < today ? 'verpasst' : 'standard';\n\t\t},\n\t\topenBeurteilungLink(link) {\n\t\t\twindow.open(link, '_blank')\n\t\t},\n\t\tgetOptionLabelSprache(option) {\n\t\t\treturn option.sprache\n\t\t},\n\t\tgetOptionLabelAbgabetyp(option) {\n\t\t\treturn this.$p.t('abgabetool/c4paatyp' + option.paabgabetyp_kurzbz)\n\t\t},\n\t\tgetOptionDisabled(option) {\n\t\t\treturn !option.aktiv\n\t\t},\n\t\tgetNotenOptionLabel(option) {\n\t\t\treturn option.bezeichnung\n\t\t},\n\t\topenStudentPage() {\n\t\t\tconst link = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router\n\t\t\t\t+ '/Cis/Abgabetool/Student/' + this.projektarbeit?.student_uid\n\t\t\twindow.open(link, '_blank')\n\t\t},\n\t\topenPlagiatcheck() {\n\t\t\tconst link = this.turnitin_link\n\t\t\twindow.open(link, '_blank')\n\t\t},\n\t\tasync openBenotung() {\n\t\t\t// old link check ?\n\t\t\t\n\t\t\tif(this.getSemesterBenotbar && this.projektarbeit?.abgabetermine.find(termin => termin.paabgabetyp_kurzbz == 'end' && termin.abgabedatum !== null) && this.projektarbeit?.beurteilungLinkNew) {\n\t\t\t\tconst link = this.projektarbeit?.beurteilungLinkNew\n\t\t\t\twindow.open(link, '_blank')\n\t\t\t} else if(this.projektarbeit?.abgabetermine.find(termin => termin.paabgabetyp_kurzbz == 'end' && termin.abgabedatum !== null) && this.projektarbeit?.beurteilungLinkOld) {\n\t\t\t\tif(await this.$fhcAlert.confirm({\n\t\t\t\t\tmessage: this.$p.t('abgabetool/c4aeltereParbeitBenotenv2'),\n\t\t\t\t\tacceptLabel: this.$capitalize(this.$p.t('abgabetool/c4AcceptAndProceed')),\n\t\t\t\t\tacceptClass: 'btn btn-danger',\n\t\t\t\t\trejectLabel: this.$capitalize(this.$p.t('abgabetool/c4Cancel')),\n\t\t\t\t\trejectClass: 'btn btn-outline-secondary'\n\t\t\t\t}) === false) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\n\t\t\t\tconst link = this.projektarbeit?.beurteilungLinkOld\n\t\t\t\twindow.open(link, '_blank')\n\t\t\t} else {\n\t\t\t\t// show info text that no endupload with abgabe has been found\n\t\t\t\tif(await this.$fhcAlert.confirm({\n\t\t\t\t\tmessage: this.$p.t('abgabetool/c4keinEnduploadErfolgt'),\n\t\t\t\t\tacceptLabel: this.$capitalize(this.$p.t('abgabetool/c4AcceptAndProceed')),\n\t\t\t\t\tacceptClass: 'btn btn-danger',\n\t\t\t\t\trejectLabel: this.$capitalize(this.$p.t('abgabetool/c4Cancel')),\n\t\t\t\t\trejectClass: 'btn btn-outline-secondary'\n\t\t\t\t}) === false) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tformatDate(dateParam) {\n\t\t\tconst date = new Date(dateParam)\n\t\t\t// handle missing leading 0\n\t\t\tconst padZero = (num) => String(num).padStart(2, '0');\n\n\t\t\tconst month = padZero(date.getMonth() + 1); // Months are zero-based\n\t\t\tconst day = padZero(date.getDate());\n\t\t\tconst year = date.getFullYear();\n\t\t\t\n\t\t\treturn `${day}.${month}.${year}`\n\t\t},\n\t\topenCreateNewAbgabeModal() {\n\t\t\tif(this.projektarbeit?.betreuerart_kurzbz == 'Zweitbegutachter') {\n\t\t\t\t// maybe alert that this is not allowed or smth\n\n\t\t\t\tthis.$fhcAlert.alertWarning('Terminanlage disabled')\n\t\t\t\treturn\n\t\t\t}\n\t\t\t\n\t\t\tif(!this.newTermin) {\n\t\t\t\tconst typ = this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz === 'zwischen')\n\t\t\t\tthis.newTermin = {\n\t\t\t\t\t'paabgabe_id': -1,\n\t\t\t\t\t'projektarbeit_id': this.projektarbeit.projektarbeit_id,\n\t\t\t\t\t'fixtermin': false,\n\t\t\t\t\t'invertedFixtermin': true,\n\t\t\t\t\t'kurzbz': '',\n\t\t\t\t\t'datum': new Date().toISOString().split('T')[0],\n\t\t\t\t\t'note': this.allowedNotenOptions.find(opt => opt.note == 9),\n\t\t\t\t\t'beurteilungsnotiz': '',\n\t\t\t\t\t'upload_allowed': typ.upload_allowed_default,\n\t\t\t\t\t'paabgabetyp_kurzbz': '',\n\t\t\t\t\t'bezeichnung': typ,\n\t\t\t\t\t'abgabedatum': null,\n\t\t\t\t\t'insertvon': this.viewData?.uid ?? ''\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.$refs.modalContainerCreateNewAbgabe.show()\n\t\t},\n\t\tvalidateTermin(termin) {\n\t\t\t// compare new termin to existing ones to block illegal termin constellations, if they exist\n\t\t\t\n\t\t\treturn true\n\t\t},\n\t\tasync handleSaveNewAbgabe(termin) {\n\t\t\t\n\t\t\tif(!this.validateTermin(termin)) {\n\t\t\t\tthis.$fhcAlert.alertWarning('invalid termin')\n\t\t\t\t\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t\n\t\t\tawait this.saveTermin(termin)\n\t\t\t\n\t\t\tthis.$refs.modalContainerCreateNewAbgabe.hide()\n\t\t\tthis.newTermin = {\n\t\t\t\t'paabgabe_id': -1,\n\t\t\t\t'projektarbeit_id': this.projektarbeit.projektarbeit_id,\n\t\t\t\t'fixtermin': false,\n\t\t\t\t'invertedFixtermin': true,\n\t\t\t\t'kurzbz': '',\n\t\t\t\t'datum': new Date().toISOString().split('T')[0],\n\t\t\t\t'note': this.allowedNotenOptions.find(opt => opt.note == 9),\n\t\t\t\t'beurteilungsnotiz': '',\n\t\t\t\t'upload_allowed': false,\n\t\t\t\t'paabgabetyp_kurzbz': '',\n\t\t\t\t'bezeichnung': this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz === 'zwischen'),\n\t\t\t\t'abgabedatum': null,\n\t\t\t\t'insertvon': this.viewData?.uid ?? ''\n\t\t\t}\n\t\t\t\n\t\t},\n\t\thandleChangeAbgabetyp(termin) {\n\t\t\t// if paabgabetype qualgate is selected, fill out kurzbz textfield with bezeichnung of quality gate so users\n\t\t\t// are possibly less confused\n\t\t\tif(termin.bezeichnung?.paabgabetyp_kurzbz === 'qualgate1' || termin.bezeichnung?.paabgabetyp_kurzbz === 'qualgate2') {\n\t\t\t\ttermin.kurzbz = termin.bezeichnung.bezeichnung\n\t\t\t} else {\n\t\t\t\ttermin.kurzbz = ''\n\t\t\t}\n\t\t}\n\t\t\t\n\t},\n\tcomputed: {\n\t\tgetAllowedToCreateNewTermin() {\n\t\t\tif(this.assistenzMode) return true\n\t\t\tif(this.projektarbeit?.betreuerart_kurzbz == 'Zweitbegutachter') return false\n\t\t\tif(this.projektarbeit?.note !== undefined && this.projektarbeit.note !== null) {\n\t\t\t\t// check if the note is not defined as a non final projektarbeit note\n\t\t\t\tconst opt = this.notenOptionsNonFinal.find(opt => opt.note)\n\t\t\t\t// if thats the case allow further work\n\t\t\t\tif(opt) return true\n\t\t\t\t// else the PA is to be considered finished\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t\n\t\t\t// normally should be allowed if no rules apply\n\t\t\treturn true\n\t\t},\n\t\tallowedToSaveZusatzdaten() {\n\t\t\t\treturn this.form.schlagwoerter.length > 0 && this.form.schlagwoerter_en.length > 0 && this.form.abstract.length > 0 && this.form.abstract_en.length > 0 && this.form.seitenanzahl > 0\n\t\t},\n\t\tgetAllowedAbgabeTypeOptions() {\n\t\t\tif(this.assistenzMode) {\n\t\t\t\treturn this.abgabeTypeOptions\n\t\t\t} else {\n\t\t\t\treturn this.abgabeTypeOptions.filter(opt => this.abgabetypenBetreuer.includes(opt.paabgabetyp_kurzbz))\n\t\t\t}\n\t\t},\n\t\tgetMessagePtStyle() {\n\t\t\t// adjust outer spacing and internal padding to appear similar to doenload button in size\n\t\t\treturn {\n\t\t\t\troot: {\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tmargin: '0px'\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\twrapper: {\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tpadding: '6px'\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\t\n\t\t},\n\t\tgetEid() {\n\t\t\treturn this.$p.t('abgabetool/c4eidesstattlicheErklaerung')\n\t\t},\n\t\tgetEnduploadErlaubt() {\n\t\t\treturn !this.eidAkzeptiert\n\t\t},\n\t\tgetSemesterBenotbar(){\n\t\t\treturn this.projektarbeit?.isCurrent ?? false\n\t\t},\n\t\tendUploadVorhanden(){\n\t\t\treturn this.projektarbeit?.abgabetermine.find(abgabe => abgabe.paabgabetyp_kurzbz === 'end' && abgabe.abgabedatum !== null)\n\t\t},\n\t\tqualityGateTerminAvailable() {\n\t\t\tlet qgatefound = false\n\t\t\tthis.projektarbeit?.abgabetermine.forEach(abgabe => {\n\t\t\t\tif(abgabe.bezeichnung?.paabgabetyp_kurzbz == 'qualgate1'\n\t\t\t\t\t|| abgabe?.bezeichnung?.paabgabetyp_kurzbz == 'qualgate2') {\n\t\t\t\t\tqgatefound = true\n\t\t\t\t}\n\t\t\t})\n\t\t\treturn qgatefound\n\t\t},\n\t\tgetSpeedDialStyle() {\n\t\t\treturn 'position: static !important;'\n\t\t},\n\t\tgetSpeedDialWrapperStyle() {\n\t\t\t// non fullscreen -> wrapper is positioned on right bottom corner of modal, wherever that is\n\t\t\treturn 'position: absolute; z-index: 9999; left: 0px; bottom: 0.5rem;'\n\t\t},\n\t\tgetTooltipVerspaetet() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipVerspaetet'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipVerpasst() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipVerpasst'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipAbzugeben() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipAbzugeben'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipStandard() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipStandardv2'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipBeurteilungerforderlich() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipBeurteilungerforderlich'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipAbgegeben() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipAbgegeben'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipFixtermin() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipFixtermin'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipAbgabeDetected() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4tooltipAbgabeDetected')),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipNotAllowedToSave() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4notAllowedToEditAbgabeTermin'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipNotAllowedToDelete() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4notAllowedToDeleteAbgabeTermin'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipBestanden() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipBestanden'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipNichtBestanden() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipNichtBestanden'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetProjektarbeitTitel() {\n\t\t\tif(this.projektarbeit?.titel) return this.$capitalize(this.$p.t('abgabetool/c4titel')) + ': ' + this.projektarbeit.titel\n\t\t\t\n\t\t\treturn ''\n\t\t},\n\t\tgetProjektarbeitStudent(){\n\n\t\t\tif(this.projektarbeit?.student) return this.$capitalize(this.$p.t('person/student')) + ': ' + this.projektarbeit.student\n\n\t\t\treturn ''\n\t\t}\n\t},\n\twatch: {\n\t\t'newTermin.bezeichnung'(newVal) {\n\t\t\tif(newVal?.paabgabetyp_kurzbz === 'qualgate1' || newVal?.paabgabetyp_kurzbz === 'qualgate2') {\n\t\t\t\tthis.newTermin.kurzbz = newVal.bezeichnung\n\t\t\t}\n\t\t\t\n\t\t\tthis.newTermin.upload_allowed = newVal.upload_allowed_default\n\t\t},\n\t\t'projektarbeit'(newVal) {\n\t\t\t// set invertedFixtermin field for UI/UX purposes -> avoid double negation in text\n\t\t\t\n\t\t\t// reset newTermin object\n\t\t\tconst typ = this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz === 'zwischen')\n\t\t\tthis.newTermin = {\n\t\t\t\t'paabgabe_id': -1,\n\t\t\t\t'projektarbeit_id': newVal.projektarbeit_id,\n\t\t\t\t'fixtermin': false,\n\t\t\t\t'invertedFixtermin': true,\n\t\t\t\t'kurzbz': '',\n\t\t\t\t'datum': new Date().toISOString().split('T')[0],\n\t\t\t\t'note': this.allowedNotenOptions.find(opt => opt.note == 9),\n\t\t\t\t'beurteilungsnotiz': '',\n\t\t\t\t'upload_allowed': typ.upload_allowed_default,\n\t\t\t\t'paabgabetyp_kurzbz': '',\n\t\t\t\t'bezeichnung': typ,\n\t\t\t\t'abgabedatum': null,\n\t\t\t\t'insertvon': this.viewData?.uid ?? ''\n\t\t\t}\n\t\t\t\n\t\t\tnewVal?.abgabetermine?.forEach(termin => termin.invertedFixtermin = !termin.fixtermin)\n\t\t\t\n\t\t\t// default select german if projektarbeit sprache was null\n\t\t\tthis.form.sprache = newVal.sprache ? this.allActiveLanguages.find(lang => lang.sprache == newVal.sprache) : this.allActiveLanguages.find(lang => lang.sprache == 'German')\n\t\t\tthis.form.abstract = newVal.abstract ?? ''\n\t\t\tthis.form.abstract_en = newVal.abstract_en ?? ''\n\t\t\tthis.form.schlagwoerter = newVal.schlagwoerter ?? ''\n\t\t\tthis.form.schlagwoerter_en = newVal.schlagwoerter_en ?? ''\n\t\t\tthis.form.kontrollschlagwoerter = newVal.kontrollschlagwoerter ?? ''\n\t\t\tthis.form.seitenanzahl = newVal.seitenanzahl ?? 1\n\t\t\t\n\t\t},\n\t},\n\tcreated() {\n\n\t},\n\tmounted() {\n\n\t},\n\ttemplate: `\n\t\n\t\t\n\t\t\n\t\t\n\t\n\n\t
    \n\t\t
    {{$capitalize( $p.t('abgabetool/c4abgabeMitarbeiterbereich') )}}
    \n\n\t\t
    \n\t\t\t
    \n\t\t\t\t

    {{getProjektarbeitStudent}}

    \n\t\t\t\t

    {{getProjektarbeitTitel}}

    \n\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t
    \n\t\t
    \n\t\t\t
    \n\n\t\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\t\t
    \n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t
    \n\t\t\t
    {{ $capitalize( $p.t('abgabetool/c4keineAbgabetermineGefunden') )}}
    \n\t\t
    \n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t
    \n`,\n};\n\nexport default AbgabeMitarbeiterDetail;\n","import {CoreFilterCmpt} from \"../../../components/filter/Filter.js\";\nimport AbgabeDetail from \"./AbgabeMitarbeiterDetail.js\";\nimport BsModal from '../../Bootstrap/Modal.js';\nimport VueDatePicker from '../../vueDatepicker.js.php';\nimport ApiAbgabe from '../../../api/factory/abgabe.js'\nimport FhcOverlay from \"../../Overlay/FhcOverlay.js\";\n\nexport const AbgabetoolMitarbeiter = {\n\tname: \"AbgabetoolMitarbeiter\",\n\tcomponents: {\n\t\tBsModal,\n\t\tCoreFilterCmpt,\n\t\tAbgabeDetail,\n\t\tCheckbox: primevue.checkbox,\n\t\tDropdown: primevue.dropdown,\n\t\tTextarea: primevue.textarea,\n\t\tVueDatePicker,\n\t\tFhcOverlay\n\t},\n\tprovide() {\n\t\treturn {\n\t\t\tabgabeTypeOptions: Vue.computed(() => this.abgabeTypeOptions),\n\t\t\tabgabetypenBetreuer: Vue.computed(() => this.abgabetypenBetreuer),\n\t\t\tallowedNotenOptions: Vue.computed(() => this.allowedNotenOptions),\n\t\t\tnotenOptionsNonFinal: Vue.computed(() => this.notenOptionsNonFinal),\n\t\t\tturnitin_link: Vue.computed(() => this.turnitin_link),\n\t\t\told_abgabe_beurteilung_link: Vue.computed(() => this.old_abgabe_beurteilung_link)\n\t\t}\n\t},\n\tprops: {\n\t\tviewData: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t\tdefault: () => ({name: '', uid: ''}),\n\t\t\tvalidator(value) {\n\t\t\t\treturn value && value.uid // && value.name -> extensive viewData use only for cis4 onwards\n\t\t\t}\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\ttableData: null,\n\t\t\tabgabetypenBetreuer: null,\n\t\t\tdetailIsFullscreen: false,\n\t\t\tphrasenPromise: null,\n\t\t\tphrasenResolved: false,\n\t\t\tturnitin_link: null,\n\t\t\told_abgabe_beurteilung_link: null,\n\t\t\tsaving: false,\n\t\t\tloading: false,\n\t\t\tabgabeTypeOptions: null,\n\t\t\tnotenOptions: null,\n\t\t\tallowedNotenOptions: null,\n\t\t\tnotenOptionsNonFinal: null,\n\t\t\tserienTermin: Vue.reactive({\n\t\t\t\tdatum: new Date(),\n\t\t\t\tbezeichnung: {\n\t\t\t\t\tpaabgabetyp_kurzbz: 'zwischen',\n\t\t\t\t\tbezeichnung: 'Zwischenabgabe'\n\t\t\t\t},\n\t\t\t\tkurzbz: '',\n\t\t\t\tupload_allowed: false\n\t\t\t}),\n\t\t\tshowAll: false,\n\t\t\ttabulatorUuid: Vue.ref(0),\n\t\t\tselectedData: [],\n\t\t\tdomain: '',\n\t\t\tstudent_uid: null,\n\t\t\tdetail: null,\n\t\t\tdetailOffset: 0,\n\t\t\tprojektarbeiten: null,\n\t\t\tselectedProjektarbeit: null,\n\t\t\ttableBuiltResolve: null,\n\t\t\ttableBuiltPromise: null,\n\t\t\tabgabeTableOptions: {\n\t\t\t\tminHeight: 250,\n\t\t\t\tindex: 'projektarbeit_id',\n\t\t\t\tlayout: 'fitDataStretch',\n\t\t\t\tplaceholder: Vue.computed(() => this.$p.t('global/noDataAvailable')),\n\t\t\t\tselectable: true,\n\t\t\t\tselectableCheck: this.selectionCheck,\n\t\t\t\trowHeight: 80,\n\t\t\t\tcolumns: [\n\t\t\t\t\t{\n\t\t\t\t\t\tformatter: function (cell, formatterParams, onRendered) {\n\t\t\t\t\t\t\t// create the built-in checkbox\n\t\t\t\t\t\t\tif(!cell.getRow().getData().selectable) return \n\t\t\t\t\t\t\tlet checkbox = document.createElement(\"input\");\n\t\t\t\t\t\t\tcheckbox.type = \"checkbox\";\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t// Handle select manually\n\t\t\t\t\t\t\tcheckbox.addEventListener(\"click\", (e) => {\n\t\t\t\t\t\t\t\te.stopPropagation();\n\n\t\t\t\t\t\t\t\t// call our function\n\t\t\t\t\t\t\t\tif (formatterParams && formatterParams.handleClick) {\n\t\t\t\t\t\t\t\t\tformatterParams.handleClick(e, cell);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tcell.getRow().getData().checkbox = checkbox\n\n\t\t\t\t\t\t\tlet wrapper = document.createElement(\"div\");\n\t\t\t\t\t\t\twrapper.style.cssText = \"display: flex; justify-content: center; align-items: center; height: 100%; width: 100%;\";\n\n\t\t\t\t\t\t\twrapper.appendChild(checkbox);\n\n\t\t\t\t\t\t\treturn wrapper;\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttitleFormatter: function (cell, formatterParams, onRendered) {\n\t\t\t\t\t\t\t// create the built-in checkbox\n\t\t\t\t\t\t\tlet checkbox = document.createElement(\"input\");\n\t\t\t\t\t\t\tcheckbox.type = \"checkbox\";\n\n\t\t\t\t\t\t\t// Handle \"select all\" manually\n\t\t\t\t\t\t\tcheckbox.addEventListener(\"click\", (e) => {\n\t\t\t\t\t\t\t\te.stopPropagation();\n\n\t\t\t\t\t\t\t\t// call our function\n\t\t\t\t\t\t\t\tif (formatterParams && formatterParams.handleClick) {\n\t\t\t\t\t\t\t\t\tformatterParams.handleClick(e, cell);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\treturn checkbox;\n\t\t\t\t\t\t},\n\t\t\t\t\t\thozAlign: \"center\",\n\t\t\t\t\t\theaderSort: false,\n\t\t\t\t\t\tformatterParams: {\n\t\t\t\t\t\t\thandleClick: this.selectHandler\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttitleFormatterParams: {\n\t\t\t\t\t\t\thandleClick: this.selectAllHandler\n\t\t\t\t\t\t},\n\t\t\t\t\t\twidth: 50,\n\t\t\t\t\t\tcssClass: 'sticky-col'\n\t\t\t\t\t},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4details'))), field: 'details', formatter: this.detailFormatter, widthGrow: 1, tooltip: false, cssClass: 'sticky-col'},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4personenkennzeichen'))), headerFilter: true, field: 'pkz', formatter: this.pkzTextFormatter, widthGrow: 1, tooltip: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4kontakt'))), field: 'mail', formatter: this.mailFormatter, widthGrow: 1, tooltip: false, visible: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4vorname'))), field: 'vorname', headerFilter: true, formatter: this.centeredTextFormatter,widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4nachname'))), field: 'nachname', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4projekttyp'))), field: 'projekttyp_kurzbz', formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4stg'))), field: 'stg', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4sem'))), field: 'studiensemester_kurzbz', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4titel'))), field: 'titel', headerFilter: true, formatter: this.centeredTextFormatter, maxWidth: 500, widthGrow: 8},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4betreuerart'))), field: 'betreuerart_beschreibung',formatter: this.centeredTextFormatter, widthGrow: 1}\n\t\t\t\t],\n\t\t\t\tpersistence: false,\n\t\t\t},\n\t\t\tabgabeTableEventHandlers: [{\n\t\t\t\tevent: \"tableBuilt\",\n\t\t\t\thandler: async () => {\n\t\t\t\t\tthis.tableBuiltResolve()\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\tevent: \"cellClick\",\n\t\t\t\thandler: async (e, cell) => {\n\t\t\t\t\tif(cell.getColumn().getField() === \"details\") {\n\t\t\t\t\t\tthis.setDetailComponent(cell.getValue())\n\t\t\t\t\t\tthis.undoSelection(cell)\n\t\t\t\t\t} else if (cell.getColumn().getField() === \"mail\") {\n\t\t\t\t\t\tthis.undoSelection(cell)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\tevent: \"rowSelectionChanged\",\n\t\t\t\thandler: async(data) => {\n\t\t\t\t\tthis.selectedData.filter(sd => !data.includes(sd)).forEach(fsd => {\n\t\t\t\t\t\tif(fsd.checkbox) fsd.checkbox.checked = false\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\tdata.forEach(d => {\n\t\t\t\t\t\tif(d.checkbox) d.checkbox.checked = true\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\tthis.selectedData = data\n\t\t\t\t}\n\t\t\t}\n\t\t\t]};\n\t},\n\tmethods: {\n\t\tselectHandler(e, cell) {\n\t\t\tconst row = cell.getRow();\n\n\t\t\tif(row.isSelected()) {\n\t\t\t\trow.deselect();\n\t\t\t} else {\n\t\t\t\trow.select();\n\t\t\t}\n\n\t\t\t// stop built-in handler\n\t\t\te.stopPropagation();\n\t\t\treturn false;\n\t\t},\n\t\tselectAllHandler(e, cell) {\n\t\t\tconst table = cell.getTable();\n\t\t\tconst rows = table.getRows();\n\n\t\t\t// custom select all logic\n\t\t\tconst allowed = rows.filter(r => r.getData().selectable);\n\t\t\tconst selected = allowed.every(r => r.isSelected());\n\n\t\t\tif(selected) {\n\t\t\t\tallowed.forEach(r => r.deselect());\n\t\t\t} else {\n\t\t\t\tallowed.forEach(r => r.select());\n\t\t\t}\n\n\t\t\t// stop built-in handler\n\t\t\te.stopPropagation();\n\t\t\treturn false;\n\t\t},\n\t\thandleToggleFullscreenDetail() {\n\t\t\tthis.detailIsFullscreen = !this.detailIsFullscreen\n\t\t},\n\t\tgetOptionLabelAbgabetyp(option){\n\t\t\treturn option.bezeichnung\n\t\t},\n\t\tformatDate(dateParam) {\n\t\t\tconst date = new Date(dateParam)\n\t\t\t// handle missing leading 0\n\t\t\tconst padZero = (num) => String(num).padStart(2, '0');\n\n\t\t\tconst month = padZero(date.getMonth() + 1); // Months are zero-based\n\t\t\tconst day = padZero(date.getDate());\n\t\t\tconst year = date.getFullYear();\n\n\t\t\treturn `${day}.${month}.${year}`;\n\t\t},\n\t\tundoSelection(cell) {\n\t\t\t// checks if cells row is selected and unselects -> imitates columns which dont trigger row selection\n\t\t\t// but actually just revert it after the fact\n\n\t\t\tconst row = cell.getRow()\n\t\t\tif(row.isSelected()) {\n\t\t\t\trow.deselect();\n\t\t\t}\n\t\t},\n\t\tselectionCheck(row) {\n\t\t\tconst data = row.getData()\n\t\t\tif(data?.betreuerart_kurzbz == 'Zweitbegutachter') return false\n\t\t\treturn true\n\t\t},\n\t\tshowDeadlines(){\n\t\t\tconst link = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router\n\t\t\t\t+ '/Cis/Abgabetool/Deadlines'\n\t\t\twindow.open(link, '_blank')\n\t\t},\n\t\ttoggleShowAll(showall) {\n\t\t\tthis.showAll = showall\n\t\t\tthis.loading = true\n\t\t\tthis.loadProjektarbeiten(showall, () => {\n\t\t\t\tthis.$refs.abgabeTable?.tabulator.redraw(true)\n\t\t\t\tthis.$refs.abgabeTable?.tabulator.setSort([]);\n\t\t\t\tthis.loading = false\n\t\t\t})\n\t\t},\n\t\topenAddSeriesModal() {\n\t\t\tthis.$refs.modalContainerAddSeries.show()\n\t\t},\n\t\taddSeries() {\n\t\t\tthis.saving = true\n\t\t\tthis.$api.call(ApiAbgabe.postSerientermin(\n\t\t\t\tthis.serienTermin.datum.toISOString(),\n\t\t\t\tthis.serienTermin.bezeichnung.paabgabetyp_kurzbz,\n\t\t\t\tthis.serienTermin.bezeichnung.bezeichnung,\n\t\t\t\tthis.serienTermin.kurzbz,\n\t\t\t\tthis.serienTermin.upload_allowed,\n\t\t\t\tthis.selectedData?.map(projekt => projekt.projektarbeit_id),\n\t\t\t\tfalse\n\t\t\t)).then(res => {\n\t\t\t\tif (res.meta.status === \"success\" && res.data) {\n\t\t\t\t\tthis.$fhcAlert.alertSuccess(this.$p.t('abgabetool/serienTerminGespeichert'))\n\t\t\t\t} else {\n\t\t\t\t\tthis.$fhcAlert.alertError(this.$p.t('abgabetool/errorSerienterminSpeichern'))\n\t\t\t\t}\n\t\t\t}).finally(()=>{\n\t\t\t\tthis.saving = false\n\t\t\t})\n\n\t\t\tthis.$refs.modalContainerAddSeries.hide()\n\t\t},\n\t\tcreateInfoString(data) {\n\t\t\tlet str = '';\n\t\t\t\n\t\t\tdata.forEach(name => {\n\t\t\t\tstr += name\n\t\t\t\tstr += '; '\n\t\t\t})\n\t\t\t\n\t\t\treturn str\n\t\t},\n\t\tisPastDate(date) {\n\t\t\treturn new Date(date) < new Date(Date.now())\n\t\t},\n\t\tsetDetailComponent(details){\n\t\t\tthis.loading=true\n\t\t\tthis.loadAbgaben(details).then((res)=> {\n\t\t\t\tconst pa = this.projektarbeiten?.retval?.find(projekarbeit => projekarbeit.projektarbeit_id == details.projektarbeit_id)\n\t\t\t\tpa.abgabetermine = res.data[0].retval\n\t\t\t\tpa.isCurrent = res.data[1]\n\n\t\t\t\tlet paIsBenotet = false\n\t\t\t\tif(pa.note !== undefined && pa.note !== null) {\n\t\t\t\t\t// check if the note is not defined as a non final projektarbeit note\n\t\t\t\t\tconst opt = this.notenOptionsNonFinal.find(opt => opt.note)\n\t\t\t\t\t// if thats the case allow further work\n\t\t\t\t\tif(opt) paIsBenotet = false\n\t\t\t\t\t// else the PA is to be considered finished\n\t\t\t\t\tpaIsBenotet = true\n\t\t\t\t}\n\n\t\t\t\tpa.abgabetermine.forEach(termin => {\n\t\t\t\t\ttermin.note = this.allowedNotenOptions.find(opt => opt.note == termin.note)\n\t\t\t\t\ttermin.file = []\n\t\t\t\t\t\n\t\t\t\t\t// update 08-01-2026: everybody is allowed to do everything in client, critical checks happen at backend level\n\t\t\t\t\t// termin.allowedToSave = true\n\t\t\t\t\t\n\t\t\t\t\t// update 21-01-2026: actually blocking operations on finished projektarbeiten seems like a decent idea\n\t\t\t\t\ttermin.allowedToSave = paIsBenotet ? false : true\n\t\t\t\t\t\n\t\t\t\t\t// lektoren are not allowed to delete deadlines with existing submissions\n\t\t\t\t\ttermin.allowedToDelete = termin.allowedToSave && !termin.abgabedatum\n\t\t\t\t\t\n\t\t\t\t\ttermin.bezeichnung = this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz === termin.paabgabetyp_kurzbz)\n\n\t\t\t\t})\n\t\t\t\tpa.student_uid = details.student_uid\n\t\t\t\tpa.student = `${pa.vorname} ${pa.nachname}`\n\t\t\t\t\n\t\t\t\tthis.selectedProjektarbeit = pa\n\t\t\t\tthis.$refs.modalContainerAbgabeDetail.show()\n\t\t\t\n\t\t\t}).finally(()=>{this.loading = false})\n\t\t},\n\t\tcenteredTextFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\t\t\tif(!val) return\n\t\t\t\n\t\t\treturn '
    ' +\n\t\t\t\t'

    '+val+'

    '\n\t\t},\n\t\tdetailFormatter(cell) {\n\t\t\treturn '
    ' +\n\t\t\t\t'
    '\n\t\t},\n\t\tmailFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\t\t\treturn '
    ' +\n\t\t\t\t'
    '\n\t\t},\n\t\tbeurteilungFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\t\t\tif(val) {\n\t\t\t\treturn '
    ' +\n\t\t\t\t\t'
    '\n\t\t\t} else return '-'\n\t\t},\n\t\tpkzTextFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\n\t\t\treturn '
    ' +\n\t\t\t\t''+val+'
    '\n\t\t},\n\t\ttableResolve(resolve) {\n\t\t\tthis.tableBuiltResolve = resolve\n\t\t},\n\t\tbuildMailToLink(abgabe) {\n\t\t\treturn 'mailto:' + abgabe.uid +'@'+ this.domain\n\t\t},\n\t\tbuildPKZ(projekt) {\n\t\t\treturn `${projekt.uid} / ${projekt.matrikelnr}`\n\t\t},\n\t\tbuildStg(projekt) {\n\t\t\treturn (projekt.typ + projekt.kurzbz)?.toUpperCase()\t\n\t\t},\n\t\tsetupData(data){\n\t\t\tthis.projektarbeiten = data[0]\n\t\t\tthis.domain = data[1]\n\t\t\t\n\t\t\tthis.tableData = data[0]?.retval?.map(projekt => {\n\n\t\t\t\tprojekt.selectable = projekt.betreuerart_kurzbz !== 'Zweitbegutachter'\n\n\t\t\t\treturn {\n\t\t\t\t\t...projekt,\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\tstudent_uid: projekt.uid,\n\t\t\t\t\t\tprojektarbeit_id: projekt.projektarbeit_id,\n\t\t\t\t\t},\n\t\t\t\t\tpkz: this.buildPKZ(projekt),\n\t\t\t\t\tbeurteilung: projekt.beurteilungLink ?? null,\n\t\t\t\t\tsem: projekt.studiensemester_kurzbz,\n\t\t\t\t\tstg: this.buildStg(projekt),\n\t\t\t\t\tmail: this.buildMailToLink(projekt),\n\t\t\t\t\ttyp: projekt.projekttyp_kurzbz,\n\t\t\t\t\ttitel: projekt.titel\n\t\t\t\t}\n\t\t\t})\n\t\t\t\n\t\t\tthis.$refs.abgabeTable.tabulator.setColumns(this.abgabeTableOptions.columns)\n\t\t\tthis.$refs.abgabeTable.tabulator.setData(this.tableData);\n\t\t},\n\t\tloadProjektarbeiten(all = false, callback) {\n\t\t\tthis.$api.call(ApiAbgabe.getMitarbeiterProjektarbeiten(all))\n\t\t\t\t.then(res => {\n\t\t\t\t\tif(res?.data) this.setupData(res.data)\n\t\t\t\t}).finally(() => {\n\t\t\t\t\tif(callback) {\n\t\t\t\t\t\tcallback()\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t},\n\t\tloadAbgaben(details) {\n\t\t\treturn new Promise((resolve) => {\n\t\t\t\tthis.$api.call(ApiAbgabe.getStudentProjektabgaben(details))\n\t\t\t\t\t.then(res => {\n\t\t\t\t\t\tresolve(res)\n\t\t\t\t\t})\n\t\t\t})\n\t\t},\n\t\thandleUuidDefined(uuid) {\n\t\t\tthis.tabulatorUuid = uuid\n\t\t},\n\t\tcalcMaxTableHeight() {\n\t\t\tconst tableID = this.tabulatorUuid ? ('-' + this.tabulatorUuid) : ''\n\t\t\tconst tableDataSet = document.getElementById('filterTableDataset' + tableID);\n\t\t\tif(!tableDataSet) return\n\t\t\tconst rect = tableDataSet.getBoundingClientRect();\n\n\t\t\tthis.abgabeTableOptions.height = window.visualViewport.height - rect.top - 80\n\t\t\tthis.$refs.abgabeTable.tabulator.setHeight(this.abgabeTableOptions.height)\n\t\t},\n\t\tasync setupMounted() {\n\t\t\tthis.tableBuiltPromise = new Promise(this.tableResolve)\n\t\t\tawait this.tableBuiltPromise\n\n\t\t\tthis.loadProjektarbeiten()\n\n\t\t\tthis.calcMaxTableHeight()\n\n\t\t}\n\t},\n\twatch: {\n\t\t'serienTermin.bezeichnung'(newVal) {\n\t\t\tif(newVal?.paabgabetyp_kurzbz === 'qualgate1' || newVal?.paabgabetyp_kurzbz === 'qualgate2') {\n\t\t\t\tthis.serienTermin.kurzbz = newVal.bezeichnung\n\t\t\t}\n\n\t\t\tthis.serienTermin.upload_allowed = newVal.upload_allowed_default\n\t\t},\n\t},\n\tcomputed: {\n\t\tgetAllowedAbgabeTypeOptions() {\n\t\t\treturn this.abgabeTypeOptions.filter(opt => this.abgabetypenBetreuer.includes(opt.paabgabetyp_kurzbz))\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.phrasenPromise = this.$p.loadCategory(['abgabetool', 'global'])\n\t\tthis.phrasenPromise.then(()=> {this.phrasenResolved = true})\n\t\t// fetch config to avoid hard coded links\n\t\tthis.$api.call(ApiAbgabe.getConfig()).then(res => {\n\t\t\tthis.turnitin_link = res.data?.turnitin_link\n\t\t\tthis.old_abgabe_beurteilung_link = res.data?.old_abgabe_beurteilung_link\n\t\t\tthis.abgabetypenBetreuer = res.data?.abgabetypenBetreuer\n\t\t}).catch(e => {\n\t\t\tthis.loading = false\n\t\t})\n\t\t\n\t\t// fetch noten options\n\t\t//TODO: SWITCH TO NOTEN API ONCE NOTENTOOL IS IN MASTER TO AVOID DUPLICATE API\n\t\tthis.$api.call(ApiAbgabe.getNoten()).then(res => {\n\t\t\tif(res.meta.status == 'success') {\n\t\t\t\tthis.notenOptions = res.data[0]\n\n\t\t\t\tthis.allowedNotenOptions = this.notenOptions.filter(\n\t\t\t\t\topt => res.data[1].includes(opt.note)\n\t\t\t\t)\n\t\t\t\t\n\t\t\t\tthis.notenOptionsNonFinal = this.notenOptions.filter(\n\t\t\t\t\topt => res.data[2].includes(opt.note)\n\t\t\t\t)\n\t\t\t}\n\t\t\t\n\t\t}).catch(e => {\n\t\t\tthis.loading = false\n\t\t})\n\t\t\n\t\t// fetch abgabetypen options\n\t\tthis.$api.call(ApiAbgabe.getPaAbgabetypen()).then(res => {\n\t\t\tthis.abgabeTypeOptions = res.data\n\t\t}).catch(e => {\n\t\t\tthis.loading = false\n\t\t})\n\t},\n\tmounted() {\n\t\tthis.setupMounted()\n\t},\n\ttemplate: `\n\t\n `,\n};\n\nexport default AbgabetoolMitarbeiter;\n","export default {\n\tname: 'BootstrapOffcanvas',\n\tdata: () => ({\n\t\toffcanvas: null\n\t}),\n\tprops: {\n\t\tbackdrop: {\n\t\t\ttype: [Boolean, String],\n\t\t\tdefault: true,\n\t\t\tvalidator(value) {\n\t\t\t\treturn ['static', true, false].includes(value);\n\t\t\t}\n\t\t},\n\t\tkeyboard: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true\n\t\t},\n\t\tscroll: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t},\n\t\tplacement: {\n\t\t\ttype: String,\n\t\t\tdefault: 'start', // start | end | top | bottom\n\t\t\tvalidator(value) {\n\t\t\t\treturn ['start', 'end', 'top', 'bottom'].includes(value);\n\t\t\t}\n\t\t},\n\t\tnoCloseBtn: Boolean,\n\t\theaderClass: {\n\t\t\ttype: [String, Array, Object],\n\t\t\tdefault: ''\n\t\t},\n\t\tbodyClass: {\n\t\t\ttype: [String, Array, Object],\n\t\t\tdefault: 'p-4'\n\t\t},\n\t\tfooterClass: {\n\t\t\ttype: [String, Array, Object],\n\t\t\tdefault: ''\n\t\t},\n\t\tdialogClass: [String, Array, Object]\n\t},\n\temits: [\n\t\t\"hideBsOffcanvas\",\n\t\t\"hiddenBsOffcanvas\",\n\t\t\"hidePreventedBsOffcanvas\",\n\t\t\"showBsOffcanvas\",\n\t\t\"shownBsOffcanvas\"\n\t],\n\tmethods: {\n\t\tdispose() {\n\t\t\treturn this.offcanvas?.dispose();\n\t\t},\n\t\thide() {\n\t\t\treturn this.offcanvas?.hide();\n\t\t},\n\t\tshow(relatedTarget) {\n\t\t\treturn this.offcanvas?.show(relatedTarget);\n\t\t},\n\t\ttoggle() {\n\t\t\treturn this.offcanvas?.toggle();\n\t\t},\n\t\tpopup(body, options, title, footer) {\n\t\t\tconst BsOffcanvas = this,\n\t\t\t\tslots = {};\n\n\t\t\tif (body !== undefined)\n\t\t\t\tslots.default = () => body;\n\t\t\tif (title !== undefined)\n\t\t\t\tslots.title = () => title;\n\t\t\tif (footer !== undefined)\n\t\t\t\tslots.footer = () => footer;\n\n\t\t\tlet includedPrimevue = false;\n\t\t\tif (typeof primevue !== 'undefined')\n\t\t\t\tincludedPrimevue = true;\n\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tconst instance = Vue.createApp({\n\t\t\t\t\tname: 'OffcanvasTmpApp',\n\t\t\t\t\tsetup() {\n\t\t\t\t\t\treturn () =>\n\t\t\t\t\t\t\tVue.h(BsOffcanvas, {\n\t\t\t\t\t\t\t\tclass: 'offcanvas-wrapper',\n\t\t\t\t\t\t\t\tref: 'offcanvas',\n\t\t\t\t\t\t\t\t...options\n\t\t\t\t\t\t\t}, slots);\n\t\t\t\t\t},\n\t\t\t\t\tmounted() {\n\t\t\t\t\t\tthis.$refs.offcanvas.show();\n\t\t\t\t\t},\n\t\t\t\t\tbeforeUnmount() {\n\t\t\t\t\t\tif (this.$refs.offcanvas)\n\t\t\t\t\t\t\tthis.$refs.offcanvas.result !== false ? resolve(this.$refs.offcanvas.result) : reject();\n\t\t\t\t\t},\n\t\t\t\t\tunmounted() {\n\t\t\t\t\t\twrapper.parentElement.removeChild(wrapper);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tconst wrapper = document.createElement('div');\n\n\t\t\t\tif (includedPrimevue) {\n\t\t\t\t\tinstance.use(primevue.config.default, { zIndex: { overlay: 9999 } });\n\t\t\t\t}\n\n\t\t\t\timport('../../plugins/Phrasen.js').then((Phrasen) => {\n\t\t\t\t\tinstance.use(Phrasen.default);\n\t\t\t\t\tinstance.mount(wrapper);\n\t\t\t\t\tdocument.body.appendChild(wrapper);\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t},\n\tmounted() {\n\t\tif (this.$refs.offcanvas) {\n\t\t\tthis.offcanvas = new bootstrap.Offcanvas(this.$refs.offcanvas, {\n\t\t\t\tbackdrop: this.backdrop,\n\t\t\t\tkeyboard: this.keyboard,\n\t\t\t\tscroll: this.scroll\n\t\t\t});\n\t\t}\n\t},\n\ttemplate: `\n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\t\t
    \n\t`\n}\n","/**\n * Copyright (C) 2025 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tgetAllStudiensemesterAndAktOrNext() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/organisation/Studiensemester/getAllStudiensemesterAndAktOrNext',\n\t\t};\n\t},\n\tgetAll(order = null, start = null)\n\t{\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: 'api/frontend/v1/organisation/studiensemester/getAll',\n\t\t\tparams: { order, start }\n\t\t};\n\t}\n};","export const AbgabeterminStatusLegende = {\n\tname: 'AbgabeterminStatusLegende',\n\ttemplate: `\t\n\t\t
    \n\t\t\t
    \n\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t('abgabetool/c4tooltipVerspaetet')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t('abgabetool/c4tooltipVerpasst')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t('abgabetool/c4tooltipAbzugeben')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t('abgabetool/c4tooltipStandardv2')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t('abgabetool/c4tooltipAbgegeben')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t('abgabetool/c4tooltipBeurteilungerforderlich')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t('abgabetool/c4tooltipBestanden')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t('abgabetool/c4tooltipNichtBestanden')) }}
    \n\t\t\t\t\t
    \t\n\t\t\t\t
    \n\n\t\t\t
    \n\t\t
    \t\n\t`\n};\nexport default AbgabeterminStatusLegende;","export async function splitMailsHelper(mails, event, subject, alertPluginRef, phrasenPluginRef) {\n\tlet splititem = \",\";\n\tlet maillist = mails.join(splititem);\n\tlet mailto = \"\";\n\t// take subject line length + '?subject=' length into account\n\tconst subjectlength = subject && typeof subject === 'string' ? subject.length + 9 : 0 \n\tif (maillist.length > 2024)\n\t{\n\t\tif (await alertPluginRef.confirm({message: phrasenPluginRef.t('stv', 'zuvieleEMails') }) === false)\n\t\t\treturn;\n\t}\n\n\tlet firstrun = true;\n\tlet useBcc = event?.ctrlKey || event?.metaKey;\n\twhile (maillist.length > 0)\n\t{\n\t\tif (maillist.length + subjectlength > 2024)\n\t\t{\n\t\t\tlet splitposition = maillist.lastIndexOf(splititem, 1900);\n\t\t\tmailto = maillist.substring(0, splitposition);\n\t\t\tmaillist = maillist.substring(splitposition + 1);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tmailto = maillist;\n\t\t\tmaillist = \"\";\n\t\t}\n\n\t\tlet mailLink = useBcc ? `mailto:?bcc=${mailto}` : `mailto:${mailto}`;\n\t\tif(subject && typeof subject === 'string') mailLink += `?subject=${subject}`\n\t\tif (firstrun)\n\t\t{\n\t\t\twindow.location.href = mailLink;\n\t\t\tfirstrun = false;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (await alertPluginRef.confirm({message: phrasenPluginRef.t('stv', 'weitereEMail')}) === true)\n\t\t\t{\n\t\t\t\twindow.location.href = mailLink;\n\t\t\t}\n\t\t}\n\n\t}\n}","import {CoreFilterCmpt} from \"../../../components/filter/Filter.js\";\nimport AbgabeDetail from \"./AbgabeMitarbeiterDetail.js\";\nimport BsModal from '../../Bootstrap/Modal.js';\nimport BsOffcanvas from '../../Bootstrap/Offcanvas.js';\nimport VueDatePicker from '../../vueDatepicker.js.php';\nimport ApiAbgabe from '../../../api/factory/abgabe.js'\nimport ApiStudiensemester from '../../../api/factory/studiensemester.js';\nimport AbgabeterminStatusLegende from \"./StatusLegende.js\";\nimport FhcOverlay from \"../../Overlay/FhcOverlay.js\";\nimport { splitMailsHelper } from \"../../../helpers/EmailHelpers.js\"\n\n// spoofed date testing\n// const todayISO = '2025-08-08'\n// const today = new Date(todayISO)\n// const now = luxon.DateTime.fromISO(todayISO)\n\n// prod code\nconst today = new Date()\nconst now = luxon.DateTime.now()\n\nexport const AbgabetoolAssistenz = {\n\tname: \"AbgabetoolAssistenz\",\n\tcomponents: {\n\t\tAbgabeterminStatusLegende,\n\t\tBsModal,\n\t\tBsOffcanvas,\n\t\tCoreFilterCmpt,\n\t\tAbgabeDetail,\n\t\tCheckbox: primevue.checkbox,\n\t\tDropdown: primevue.dropdown,\n\t\tInplace: primevue.inplace,\n\t\tTextarea: primevue.textarea,\n\t\tTimeline: primevue.timeline,\n\t\tTieredMenu: primevue.tieredmenu,\n\t\tVueDatePicker,\n\t\tFhcOverlay\n\t},\n\tprovide() {\n\t\treturn {\n\t\t\tabgabeTypeOptions: Vue.computed(() => this.abgabeTypeOptions),\n\t\t\tallowedNotenOptions: Vue.computed(() => this.allowedNotenOptions),\n\t\t\tnotenOptionsNonFinal: Vue.computed(() => this.notenOptionsNonFinal),\n\t\t\tturnitin_link: Vue.computed(() => this.turnitin_link),\n\t\t\told_abgabe_beurteilung_link: Vue.computed(() => this.old_abgabe_beurteilung_link),\n\t\t\tabgabetypenBetreuer: Vue.computed(() => this.abgabeTypeOptions)\n\t\t}\n\t},\n\tprops: {\n\t\tstg_kz_prop: {\n\t\t\tdefault: null\n\t\t},\n\t\tviewData: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t\tdefault: () => ({name: '', uid: ''}),\n\t\t\tvalidator(value) {\n\t\t\t\treturn value && value.uid // && value.name -> extensive viewData use only for cis4 onwards\n\t\t\t}\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\ttableData: null,\n\t\t\tstudiensemesterOptions: null,\n\t\t\tallSem: null,\n\t\t\tcurSem: null,\n\t\t\tnotenOptionFilter: null,\n\t\t\tinplaceToggle: false,\n\t\t\theaderFiltersRestored: false,\n\t\t\tfiltersRestored: false,\n\t\t\tcolLayoutRestored: false,\n\t\t\tsortRestored: false,\n\t\t\tstateRestored: false,\n\t\t\ttimelineProjekt: null,\n\t\t\tselectedStudiengangOption: null,\n\t\t\tstudiengaengeOptions: null,\n\t\t\tdetailIsFullscreen: false,\n\t\t\tallConfigPromise: null,\n\t\t\tphrasenPromise: null,\n\t\t\tphrasenResolved: false,\n\t\t\tturnitin_link: null,\n\t\t\told_abgabe_beurteilung_link: null,\n\t\t\tASSISTENZ_SAMMELMAIL_BUTTON_STUDENT: null,\n\t\t\tASSISTENZ_SAMMELMAIL_BUTTON_BETREUER: null,\n\t\t\tsaving: false,\n\t\t\tloading: false,\n\t\t\tabgabeTypeOptions: null,\n\t\t\tnotenOptions: null,\n\t\t\tallowedNotenFilterOptions: null,\n\t\t\tallowedNotenOptions: null,\n\t\t\tnotenOptionsNonFinal: null,\n\t\t\tserienTermin: Vue.reactive({\n\t\t\t\tdatum: new Date(),\n\t\t\t\tbezeichnung: {\n\t\t\t\t\tpaabgabetyp_kurzbz: 'zwischen',\n\t\t\t\t\tbezeichnung: 'Zwischenabgabe'\n\t\t\t\t},\n\t\t\t\tkurzbz: '',\n\t\t\t\tfixtermin: false,\n\t\t\t\tinvertedFixtermin: true,\n\t\t\t\tupload_allowed: false\n\t\t\t}),\n\t\t\tshowAll: false,\n\t\t\ttabulatorUuid: Vue.ref(0),\n\t\t\tselectedData: [],\n\t\t\tdomain: '',\n\t\t\tstudent_uid: null,\n\t\t\tdetail: null,\n\t\t\tdetailOffset: 0,\n\t\t\tprojektarbeiten: null,\n\t\t\tselectedProjektarbeit: null,\n\t\t\ttableBuiltResolve: null,\n\t\t\ttableBuiltPromise: null,\n\t\t\tabgabeTableOptions: {\n\t\t\t\tminHeight: 250,\n\t\t\t\tindex: 'projektarbeit_id',\n\t\t\t\tlayout: 'fitData',\n\t\t\t\tplaceholder: Vue.computed(() => this.$capitalize(this.$p.t('global/noDataAvailable'))),\n\t\t\t\tselectable: true,\n\t\t\t\tselectableCheck: this.selectionCheck,\n\t\t\t\trowHeight: 40,\n\t\t\t\trenderVerticalBuffer: 2000,\n\t\t\t\tcolumns: [\n\t\t\t\t\t{\n\t\t\t\t\t\tformatter: function (cell, formatterParams, onRendered) {\n\t\t\t\t\t\t\t// create the built-in checkbox\n\t\t\t\t\t\t\tif(!cell.getRow().getData().selectable) return\n\t\t\t\t\t\t\tlet checkbox = document.createElement(\"input\");\n\t\t\t\t\t\t\tcheckbox.type = \"checkbox\";\n\n\t\t\t\t\t\t\t// Handle select manually\n\t\t\t\t\t\t\tcheckbox.addEventListener(\"click\", (e) => {\n\t\t\t\t\t\t\t\te.stopPropagation();\n\n\t\t\t\t\t\t\t\t// call our function\n\t\t\t\t\t\t\t\tif (formatterParams && formatterParams.handleClick) {\n\t\t\t\t\t\t\t\t\tformatterParams.handleClick(e, cell);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tcell.getRow().getData().checkbox = checkbox\n\n\t\t\t\t\t\t\tlet wrapper = document.createElement(\"div\");\n\t\t\t\t\t\t\twrapper.style.cssText = \"display: flex; justify-content: center; align-items: center; height: 100%; width: 100%;\";\n\n\t\t\t\t\t\t\twrapper.appendChild(checkbox);\n\n\t\t\t\t\t\t\treturn wrapper;\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttitleFormatter: function (cell, formatterParams, onRendered) {\n\t\t\t\t\t\t\t// create the built-in checkbox\n\t\t\t\t\t\t\tlet checkbox = document.createElement(\"input\");\n\t\t\t\t\t\t\tcheckbox.type = \"checkbox\";\n\n\t\t\t\t\t\t\t// Handle \"select all\" manually\n\t\t\t\t\t\t\tcheckbox.addEventListener(\"click\", (e) => {\n\t\t\t\t\t\t\t\te.stopPropagation();\n\n\t\t\t\t\t\t\t\t// call our function\n\t\t\t\t\t\t\t\tif (formatterParams && formatterParams.handleClick) {\n\t\t\t\t\t\t\t\t\tformatterParams.handleClick(e, cell);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\treturn checkbox;\n\t\t\t\t\t\t},\n\t\t\t\t\t\thozAlign: \"center\",\n\t\t\t\t\t\theaderSort: false,\n\t\t\t\t\t\tformatterParams: {\n\t\t\t\t\t\t\thandleClick: this.selectHandler\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttitleFormatterParams: {\n\t\t\t\t\t\t\thandleClick: this.selectAllHandler\n\t\t\t\t\t\t},\n\t\t\t\t\t\twidth: 50,\n\t\t\t\t\t\tcssClass: 'sticky-col'\n\t\t\t\t\t},\n\t\t\t\t// {\n\t\t\t\t\t// \tfield: 'rowSelection',\n\t\t\t\t\t// \tformatter: 'rowSelection',\n\t\t\t\t\t// \ttitleFormatter: 'rowSelection',\n\t\t\t\t\t// \ttitleFormatterParams: {\n\t\t\t\t\t// \t\trowRange: \"active\" // Only toggle the values of the active filtered rows\n\t\t\t\t\t// \t},\n\t\t\t\t\t// \thozAlign:\"center\",\n\t\t\t\t\t// \theaderSort: false,\n\t\t\t\t\t// \tfrozen: true,\n\t\t\t\t\t// \twidth: 40\n\t\t\t\t\t// },\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4details'))), field: 'details', formatter: this.formAction, tooltip:false, minWidth: 150, cssClass: 'sticky-col'},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4personenkennzeichen'))), headerFilter: true, field: 'pkz', formatter: this.pkzTextFormatter, widthGrow: 1, tooltip: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4vorname'))), field: 'student_vorname', headerFilter: true, formatter: this.centeredTextFormatter,widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4nachname'))), field: 'student_nachname', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4studstatus'))), field: 'studienstatus', headerFilter: true, formatter: this.centeredTextFormatter,widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4orgform'))), field: 'orgform', headerFilter: true, formatter: this.centeredTextFormatter,widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4projekttyp'))), field: 'projekttyp_kurzbz', formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4stg'))), field: 'stg', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4note'))), field: 'note_bez', headerFilter: true,\n\t\t\t\t\t\t formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4sem'))), field: 'studiensemester_kurzbz', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4titel'))), field: 'titel', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4erstbetreuer'))), field: 'erstbetreuer', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4zweitbetreuer'))), field: 'zweitbetreuer', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4prevAbgabetermin'))), headerFilter: true, field: 'prevTermin', formatter: this.abgabterminFormatter, widthGrow: 1, width: 220, tooltip: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4nextAbgabetermin'))), headerFilter: true, field: 'nextTermin', formatter: this.abgabterminFormatter, widthGrow: 1, width: 220, tooltip: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4qgate1Status'))), headerFilter: true, field: 'qgate1Status', formatter: this.centeredTextFormatter, widthGrow: 1, width: 220, tooltip: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4qgate2Status'))), headerFilter: true, field: 'qgate2Status', formatter: this.centeredTextFormatter, widthGrow: 1, width: 220, tooltip: false},\n\t\t\t\t],\n\t\t\t\tpersistence: false,\n\t\t\t\tpersistenceID: \"abgabetool_2025_12\"\n\t\t\t},\n\t\t\tabgabeTableEventHandlers: [\n\t\t\t{\n\t\t\t\tevent: \"rowSelectionChanged\",\n\t\t\t\thandler: async(data) => {\n\t\t\t\t\tthis.selectedData.filter(sd => !data.includes(sd)).forEach(fsd => {\n\t\t\t\t\t\tif(fsd.checkbox) fsd.checkbox.checked = false\n\t\t\t\t\t})\n\n\t\t\t\t\tdata.forEach(d => {\n\t\t\t\t\t\tif(d.checkbox) d.checkbox.checked = true\n\t\t\t\t\t})\n\n\t\t\t\t\tthis.selectedData = data\n\t\t\t\t}\n\t\t\t}\n\t\t\t]};\n\t},\n\tmethods: {\n\t\tsammelMailStudent(param) {\n\t\t\t\n\t\t\tconst emails = this.selectedData\n\t\t\t\t.map(row => `${row.student_uid}@${this.domain}`)\n\t\t\t\t.join(',');\n\t\t\tconst uniqueRecipients = [...new Set(emails)];\n\t\t\tconst subject = this.$p.t('abgabetool/c4sammelmailStudentBetreff', [this.selectedStudiengangOption?.bezeichnung]);\n\t\t\tsplitMailsHelper(uniqueRecipients, param.originalEvent, subject, this.$fhcAlert, this.$p)\n\t\t},\n\t\tsammelMailBetreuer(param) {\n\t\t\t\n\t\t\tconst recipientList = [];\n\t\t\tthis.selectedData.forEach(row => {\n\t\t\t\tif (row.betreuer_mail) recipientList.push(row.betreuer_mail);\n\t\t\t\tif (row.zweitbetreuer_mail) recipientList.push(row.zweitbetreuer_mail);\n\t\t\t});\n\n\t\t\t// actually not necessary for email clients but looks better for assistenz if we avoid duplicates here\n\t\t\tconst uniqueRecipients = [...new Set(recipientList)];\n\t\t\tconst subject = this.$p.t('abgabetool/c4sammelmailBetreuerBetreff', [this.selectedStudiengangOption?.bezeichnung]);\n\t\t\tsplitMailsHelper(uniqueRecipients, param.originalEvent, subject, this.$fhcAlert, this.$p)\n\t\t},\n\t\tselectHandler(e, cell) {\n\t\t\tconst row = cell.getRow();\n\n\t\t\tif(row.isSelected()){\n\t\t\t\trow.deselect();\n\t\t\t} else {\n\t\t\t\trow.select();\n\t\t\t}\n\n\t\t\t// stop built-in handler\n\t\t\te.stopPropagation();\n\t\t\treturn false;\n\t\t},\n\t\tselectAllHandler(e, cell) {\n\t\t\tconst table = cell.getTable();\n\t\t\tconst rows = table.getRows();\n\n\t\t\t// custom select all logic\n\t\t\tconst allowed = rows.filter(r => r.getData().selectable);\n\t\t\tconst selected = allowed.every(r => r.isSelected());\n\n\t\t\tif(selected){\n\t\t\t\tallowed.forEach(r => r.deselect());\n\t\t\t} else {\n\t\t\t\tallowed.forEach(r => r.select());\n\t\t\t}\n\n\t\t\t// stop built-in handler\n\t\t\te.stopPropagation();\n\t\t\treturn false;\n\t\t},\n\t\tcheckQualityGateStatus(projekt) {\n\t\t\t// TODO: might refine the representation of these states and maybe refactor code a little\n\t\t\tconst qgate1Termine = []\n\t\t\tconst qgate2Termine = []\n\t\t\t\n\t\t\tprojekt.qgate1Status = this.$p.t('abgabetool/c4keinTerminVorhanden')// 'Kein Termin vorhanden'\n\t\t\tprojekt.qgate1StatusRank = 0\n\t\t\tprojekt.qgate2Status = this.$p.t('abgabetool/c4keinTerminVorhanden')\n\t\t\tprojekt.qgate2StatusRank = 0\n\t\t\t\n\t\t\tprojekt.abgabetermine.forEach(termin => {\n\t\t\t\tif(termin.paabgabetyp_kurzbz == 'qualgate1') qgate1Termine.push(termin)\n\t\t\t\tif(termin.paabgabetyp_kurzbz == 'qualgate2') qgate2Termine.push(termin)\n\t\t\t})\n\t\t\t\n\t\t\t// calculate qgateStatusRank and display the highest order status rank of all quality gate termine until one\n\t\t\t// counts as passed, which is just a positive note no matter if anything has been uploaded\n\t\t\t\n\t\t\t// reuse luxon calculated diffMs (termin.datum in relation to today) from previous datestyle check \n\t\t\tqgate1Termine.forEach(qgate => {\n\t\t\t\tif(qgate.note != null && projekt.qgate1StatusRank <= 5) {\n\t\t\t\t\tconst noteOpt = this.notenOptions.find(opt => opt.note == qgate.note)\n\t\t\t\t\tif(noteOpt.positiv) {\n\t\t\t\t\t\tprojekt.qgate1Status = this.$p.t('abgabetool/c4positivBenotet')\n\t\t\t\t\t\tprojekt.qgate1StatusRank = 5\n\t\t\t\t\t} else {\n\t\t\t\t\t\tprojekt.qgate1Status = this.$p.t('abgabetool/c4negativBenotet')\n\t\t\t\t\t\tprojekt.qgate1StatusRank = 4\n\t\t\t\t\t}\n\t\t\t\t} else if (qgate.note == null && projekt.qgate1StatusRank <= 3) {\n\t\t\t\t\tprojekt.qgate1Status = this.$p.t('abgabetool/c4notYetGraded')\n\t\t\t\t\tprojekt.qgate1StatusRank = 3\n\t\t\t\t} else if(qgate.upload_allowed == true && qgate.abgabedatum == null && projekt.qgate1StatusRank <= 2) {\n\t\t\t\t\tprojekt.qgate1Status = this.$p.t('abgabetool/c4notSubmitted')\n\t\t\t\t\tprojekt.qgate1StatusRank = 2\n\t\t\t\t} else if (qgate.upload_allowed == false && qgate.diffMs <= 0 && projekt.qgate1StatusRank <= 1) {\n\t\t\t\t\tprojekt.qgate1Status = this.$p.t('abgabetool/c4notHappenedYet')\n\t\t\t\t\tprojekt.qgate1StatusRank = 1\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tqgate2Termine.forEach(qgate => {\n\t\t\t\tif(qgate.note != null && projekt.qgate1StatusRank <= 5) {\n\t\t\t\t\tconst noteOpt = this.notenOptions.find(opt => opt.note == qgate.note)\n\t\t\t\t\tif(noteOpt.positiv) {\n\t\t\t\t\t\tprojekt.qgate2Status = this.$p.t('abgabetool/c4positivBenotet')\n\t\t\t\t\t\tprojekt.qgate2StatusRank = 5\n\t\t\t\t\t} else {\n\t\t\t\t\t\tprojekt.qgate2Status = this.$p.t('abgabetool/c4negativBenotet')\n\t\t\t\t\t\tprojekt.qgate2StatusRank = 4\n\t\t\t\t\t}\n\t\t\t\t} else if (qgate.note == null && projekt.qgate2StatusRank <= 3) {\n\t\t\t\t\tprojekt.qgate2Status = this.$p.t('abgabetool/c4notYetGraded')\n\t\t\t\t\tprojekt.qgate2StatusRank = 3\n\t\t\t\t} else if(qgate.upload_allowed == true && qgate.abgabedatum == null && projekt.qgate2StatusRank <= 2) {\n\t\t\t\t\tprojekt.qgate2Status = this.$p.t('abgabetool/c4notSubmitted')\n\t\t\t\t\tprojekt.qgate2StatusRank = 2\n\t\t\t\t} else if (qgate.upload_allowed == false && qgate.diffMs <= 0 && projekt.qgate2StatusRank <= 1) {\n\t\t\t\t\tprojekt.qgate2Status = this.$p.t('abgabetool/c4notHappenedYet')\n\t\t\t\t\tprojekt.qgate2StatusRank = 1\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\tgetItemBezeichnung(item){\n\t\t\tif(!item.bezeichnung) return ''\n\t\t\t\n\t\t\treturn item?.bezeichnung?.bezeichnung ?? item?.bezeichnung\n\t\t},\n\t\tgetItemNote(item) {\n\t\t\t// note can be just a number if it is coming from backend\n\t\t\t// if note was just set it is a note option\n\t\t\tif(!item?.note) return ''\n\t\t\tif(item.note?.bezeichnung) return item.note.bezeichnung\n\t\t\t\n\t\t\tconst notenOption = this.notenOptions.find(note => note.note == item.note)\n\t\t\tif(!notenOption) return item.note\n\t\t\t\n\t\t\treturn notenOption.bezeichnung\n\t\t},\n\t\thandleChangeAbgabetypSerientermin(termin) {\n\t\t\t// if paabgabetype qualgate is selected, fill out kurzbz textfield with bezeichnung of quality gate so users\n\t\t\t// are possibly less confused\n\t\t\tif(termin.bezeichnung?.paabgabetyp_kurzbz === 'qualgate1' || termin.bezeichnung?.paabgabetyp_kurzbz === 'qualgate2') {\n\t\t\t\ttermin.kurzbz = termin.bezeichnung.bezeichnung\n\t\t\t} else {\n\t\t\t\ttermin.kurzbz = ''\n\t\t\t}\n\t\t},\n\t\tsemesterChanged(e) {\n\t\t\tif(this.$refs.abgabeTable.tabulator) {\n\t\t\t\tconst table = this.$refs.abgabeTable.tabulator\n\n\t\t\t\t// TODO: maybe check if existing synergy really works with many filters\n\t\t\t\tconst existing = table.getFilters().filter(f => f.field != 'studiensemester_kurzbz');\n\n\t\t\t\tconst compVal = e.value.studiensemester_kurzbz == this.$p.t('abgabetool/c4all') ? '' : e.value.studiensemester_kurzbz\n\t\t\t\tconst compType = e.value.studiensemester_kurzbz == this.$p.t('abgabetool/c4all') ? '!=' : '='\n\t\t\t\tconst newFilter = { field: \"studiensemester_kurzbz\", type: compType, value: compVal };\n\n\t\t\t\t// merge and reapply\n\t\t\t\ttable.setFilter([...existing, newFilter]);\n\t\t\t}\n\t\t\t\n\t\t},\n\t\tcheckAbgabetermineProjektarbeit(projekt) {\n\t\t\t// calculate Abgabetermin time diff to now and assign last and next to projekt\n\t\t\tprojekt.abgabetermine.forEach(termin => {\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t// while already looping through each termin, calculate datestyle beforehand\n\t\t\t\ttermin.dateStyle = this.getDateStyleClass(termin)\n\n\t\t\t\tconst date = luxon.DateTime.fromISO(termin.datum)\n\t\t\t\ttermin.diffMs = date.toMillis() - now.toMillis(); // positive = future, negative = past\n\n\t\t\t\tif (termin.diffMs < 0) {\n\t\t\t\t\tif (!projekt.prevTermin ||\n\t\t\t\t\t\ttermin.diffMs > projekt.prevTermin.diffMs // larger (less negative) = closer to now\n\t\t\t\t\t) {\n\t\t\t\t\t\tprojekt.prevTermin = termin;\n\t\t\t\t\t}\n\t\t\t\t} else if (termin.diffMs > 0) {\n\t\t\t\t\tif (!projekt.nextTermin ||\n\t\t\t\t\t\ttermin.diffMs < projekt.nextTermin.diffMs // smaller positive = closer to now\n\t\t\t\t\t) {\n\t\t\t\t\t\tprojekt.nextTermin = termin;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\n\t\t\t// seperate check for quality gates\n\t\t\tthis.checkQualityGateStatus(projekt)\n\t\t},\n\t\tloadState() {\n\t\t\treturn JSON.parse(localStorage.getItem(this.abgabeTableOptions.persistenceID) || \"null\");\n\t\t},\n\t\tsaveState(table) {\n\t\t\t// avoid storing state after first restore part happened\n\t\t\tif(!this.stateRestored) return\n\t\t\tconst rawLayout = table.getColumnLayout();\n\t\t\tconst state = {\n\t\t\t\tcolumns: rawLayout.map(col => ({\n\t\t\t\t\tfield: col.field,\n\t\t\t\t\tvisible: col.visible,\n\t\t\t\t\twidth: col.width,\n\t\t\t\t})),\n\t\t\t\tsort: table.getSorters().map(s => ({\n\t\t\t\t\tfield: s.field,\n\t\t\t\t\tdir: s.dir,\n\t\t\t\t})),\n\t\t\t\tfilters: table.getFilters(),\n\t\t\t\theaderFilters: table.getHeaderFilters()\n\t\t\t};\n\t\t\t\n\t\t\tlocalStorage.setItem(this.abgabeTableOptions.persistenceID, JSON.stringify(state));\n\t\t},\n\t\thandleTableBuilt() {\n\t\t\tconst table = this.$refs.abgabeTable.tabulator\n\n\t\t\tthis.tableBuiltResolve()\n\t\t\t\n\t\t\ttable.on(\"columnMoved\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"columnResized\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"columnVisibilityChanged\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"filterChanged\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"headerFilterChanged\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"dataSorted\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"columnSorted\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"sortersChanged\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\tconst saved = this.loadState();\n\n\t\t\ttable.on(\"renderComplete\", () => {\n\t\t\t\tif(!this.stateRestored) {\n\n\t\t\t\t\tif (saved?.columns && !this.colLayoutRestored) {\n\t\t\t\t\t\tconst layout = saved.columns.map(col => ({\n\t\t\t\t\t\t\tfield: col.field,\n\t\t\t\t\t\t\twidth: col.width,\n\t\t\t\t\t\t\tvisible: col.visible,\n\t\t\t\t\t\t\t// add more if needed, but keep it simple\n\t\t\t\t\t\t}));\n\t\t\t\t\t\t\n\t\t\t\t\t\ttable.setColumnLayout(layout);\n\n\t\t\t\t\t\tthis.colLayoutRestored = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (saved?.filters && !this.filtersRestored) {\n\t\t\t\t\t\tthis.filtersRestored = true // instantly avoid retriggers\n\t\t\t\t\t\ttable.setFilter(saved.filters);\n\t\t\t\t\t}\n\t\t\t\t\tif (saved?.headerFilters && !this.headerFiltersRestored) {\n\t\t\t\t\t\tthis.headerFiltersRestored = true // instantly avoid retriggers\n\t\t\t\t\t\tfor (let hf of saved.headerFilters) {\n\t\t\t\t\t\t\ttable.setHeaderFilterValue(hf.field, hf.value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (saved?.sort?.length && !this.sortRestored) {\n\t\t\t\t\t\tthis.sortRestored = true;\n\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tconst sortList = saved.sort.map(s => {\n\t\t\t\t\t\t\t\tconst col = table.columnManager.findColumn(s.field);\n\t\t\t\t\t\t\t\tif (!col) {\n\t\t\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn { column: col, dir: s.dir };\n\t\t\t\t\t\t\t}).filter(Boolean);\n\n\t\t\t\t\t\t\ttable.setSort(sortList);\n\t\t\t\t\t\t}, 100);\n\t\t\t\t\t}\n\t\t\t\t\tthis.stateRestored = true\n\n\t\t\t\t}\n\n\t\t\t});\n\t\t},\n\t\thandleToggleFullscreenDetail() {\n\t\t\tthis.detailIsFullscreen = !this.detailIsFullscreen\n\t\t},\n\t\tgetOptionLabelAbgabetyp(option){\n\t\t\treturn option.bezeichnung\n\t\t},\n\t\tgetOptionLabelStg(option){\n\t\t\treturn option.kurzbzlang + ' ' + option.bezeichnung\n\t\t},\n\t\tgetOptionLabelStudiensemester(option){\n\t\t\treturn option.studiensemester_kurzbz\n\t\t},\n\t\tgetNotenFilterOptionLabel(option) {\n\t\t\treturn option.bezeichnung\t\n\t\t},\n\t\tformatDate(dateParam) {\n\t\t\tif(dateParam === null) return ''\n\t\t\tconst date = new Date(dateParam)\n\t\t\t// handle missing leading 0\n\t\t\tconst padZero = (num) => String(num).padStart(2, '0');\n\n\t\t\tconst month = padZero(date.getMonth() + 1); // Months are zero-based\n\t\t\tconst day = padZero(date.getDate());\n\t\t\tconst year = date.getFullYear();\n\n\t\t\treturn `${day}.${month}.${year}`;\n\t\t},\n\t\tformAction(cell) {\n\t\t\tconst actionButtons = document.createElement('div');\n\t\t\tactionButtons.className = \"d-flex gap-3\"; // you can keep Bootstrap gap if loaded\n\t\t\tactionButtons.style.display = \"flex\";\n\t\t\tactionButtons.style.alignItems = \"stretch\"; // buttons stretch to full height\n\t\t\tactionButtons.style.justifyContent = \"center\";\n\t\t\tactionButtons.style.height = \"100%\"; // full grid cell height\n\n\t\t\tconst val = cell.getValue();\n\n\t\t\tconst createButton = (iconClass, titleKey, clickHandler) => {\n\t\t\t\tconst btn = document.createElement('button');\n\t\t\t\tbtn.className = 'btn btn-outline-secondary';\n\t\t\t\tbtn.style.display = \"flex\";\n\t\t\t\tbtn.style.alignItems = \"center\"; // center icon vertically\n\t\t\t\tbtn.style.justifyContent = \"center\"; // center icon horizontally\n\t\t\t\tbtn.style.height = \"100%\"; // fill parent container height\n\t\t\t\tbtn.style.aspectRatio = \"1 / 1\"; // keep square shape (optional)\n\t\t\t\tbtn.style.padding = \"0\"; // remove extra padding for compactness\n\t\t\t\tif(iconClass == 'fa fa-timeline') btn.style.transform = \"rotate(90deg)\";\n\t\t\t\tbtn.innerHTML = ``;\n\t\t\t\tbtn.title = this.$capitalize(this.$p.t(titleKey));\n\t\t\t\tbtn.addEventListener('click', (e) => {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\te.stopImmediatePropagation();\n\t\t\t\t\tclickHandler();\n\t\t\t\t});\n\t\t\t\treturn btn;\n\t\t\t};\n\n\t\t\tactionButtons.append(\n\t\t\t\tcreateButton('fa fa-folder-open', 'abgabetool/c4details', () => this.setDetailComponent(val)),\n\t\t\t\tcreateButton('fa fa-timeline', 'abgabetool/c4termineTimeLine', () => this.openTimeline(val))\n\t\t\t);\n\n\t\t\treturn actionButtons;\n\t\t},\n\n\t\tundoSelection(cell) {\n\t\t\t// checks if cells row is selected and unselects -> imitates columns which dont trigger row selection\n\t\t\t// but actually just revert it after the fact\n\n\t\t\tconst row = cell.getRow()\n\t\t\tif(row.isSelected()) {\n\t\t\t\trow.deselect();\n\t\t\t}\n\t\t},\n\t\tselectionCheck(row) {\n\t\t\tconst data = row.getData()\n\t\t\tif(data?.betreuerart_kurzbz == 'Zweitbegutachter') return false\n\t\t\treturn true\n\t\t},\n\t\tshowDeadlines(){\n\t\t\tconst link = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router\n\t\t\t\t+ '/Cis/Abgabetool/Deadlines'\n\t\t\twindow.open(link, '_blank')\n\t\t},\n\t\topenAddSeriesModal() {\n\t\t\tthis.$refs.modalContainerAddSeries.show()\n\t\t},\n\t\taddSeries() {\n\t\t\tconst pids = this.selectedData?.map(projekt => projekt.projektarbeit_id)\n\t\t\tthis.saving = true\n\t\t\tthis.serienTermin.fixtermin = !this.serienTermin.invertedFixtermin\n\t\t\tthis.$api.call(ApiAbgabe.postSerientermin(\n\t\t\t\tthis.serienTermin.datum.toISOString(),\n\t\t\t\tthis.serienTermin.bezeichnung.paabgabetyp_kurzbz,\n\t\t\t\tthis.serienTermin.bezeichnung.bezeichnung,\n\t\t\t\tthis.serienTermin.kurzbz,\n\t\t\t\tthis.serienTermin.upload_allowed,\n\t\t\t\tpids,\n\t\t\t\tthis.serienTermin.fixtermin\n\t\t\t)).then(res => {\n\t\t\t\t\n\t\t\t\tif (res.meta.status === \"success\" && res.data) {\n\t\t\t\t\tthis.$fhcAlert.alertSuccess(this.$p.t('abgabetool/serienTerminGespeichert'))\n\t\t\t\t} else {\n\t\t\t\t\tthis.$fhcAlert.alertError(this.$p.t('abgabetool/errorSerienterminSpeichern'))\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// put new abgaben into projektarbeiten\n\t\t\t\tconst newAbgaben = res.data\n\t\t\t\tpids.forEach(pid => {\n\t\t\t\t\tconst abgabe = newAbgaben.find(abgabe => abgabe.projektarbeit_id == pid)\n\t\t\t\t\t\n\t\t\t\t\tconst pa = this.projektarbeiten.find(pa => pa.projektarbeit_id == pid)\n\t\t\t\t\n\t\t\t\t\tabgabe.bezeichnung = this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz == abgabe.paabgabetyp_kurzbz)\n\t\t\t\t\t\n\t\t\t\t\tpa.abgabetermine.push(abgabe)\n\t\t\t\t\tpa.abgabetermine.sort((a, b) => new Date(a.datum) - new Date(b.datum))\n\t\t\t\t})\n\t\t\t\t\n\t\t\t\t// reset selection to empty\n\t\t\t\tthis.$refs.abgabeTable.tabulator.deselectRow()\n\n\t\t\t\tconst mappedData = this.mapProjekteToTableData(this.projektarbeiten)\n\t\t\t\t\n\t\t\t\tthis.$refs.abgabeTable.tabulator.setData(mappedData)\n\t\t\t\tthis.$refs.abgabeTable.tabulator.redraw(true)\n\t\t\t}).finally(()=>{\n\t\t\t\tthis.saving = false\n\t\t\t})\n\n\t\t\tthis.$refs.modalContainerAddSeries.hide()\n\t\t},\n\t\tmapProjekteToTableData(projekte) {\n\t\t\t// const now = luxon.DateTime.now();\n\t\t\treturn projekte.map(projekt => {\n\t\t\t\t\n\t\t\t\t// in assistenz context every projektarbeit should be allowed to be selected i guess\n\t\t\t\tprojekt.selectable = true;\n\t\t\t\t\n\t\t\t\tprojekt.prevTermin = null;\n\t\t\t\tprojekt.nextTermin = null;\n\n\t\t\t\tthis.checkAbgabetermineProjektarbeit(projekt)\n\n\t\t\t\tif(this.notenOptions && projekt.note) {\n\t\t\t\t\tconst opt = this.notenOptions.find(n => n.note == projekt.note)\n\t\t\t\t\n\t\t\t\t\t// TODO: mehrsprachig englisch\n\t\t\t\t\tprojekt.note_bez = opt.bezeichnung\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn {\n\t\t\t\t\t...projekt,\n\t\t\t\t\tabgabetermine: projekt.abgabetermine,\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\tstudent_uid: projekt.student_uid,\n\t\t\t\t\t\tprojektarbeit_id: projekt.projektarbeit_id,\n\t\t\t\t\t},\n\t\t\t\t\tpkz: this.buildPKZ(projekt),\n\t\t\t\t\tbeurteilung: projekt.beurteilungLink ?? null,\n\t\t\t\t\tsem: projekt.studiensemester_kurzbz,\n\t\t\t\t\tstg: this.buildStg(projekt),\n\t\t\t\t\tmail: this.buildMailToLink(projekt),\n\t\t\t\t\terstbetreuer: this.buildErstbetreuer(projekt),\n\t\t\t\t\tzweitbetreuer: this.buildZweitbetreuer(projekt),\n\t\t\t\t\ttyp: projekt.projekttyp_kurzbz,\n\t\t\t\t\ttitel: projekt.titel\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\tcreateInfoString(data) {\n\t\t\tlet str = '';\n\n\t\t\tdata.forEach(name => {\n\t\t\t\tstr += name\n\t\t\t\tstr += '; '\n\t\t\t})\n\n\t\t\treturn str\n\t\t},\n\t\tisPastDate(date) {\n\t\t\treturn new Date(date) < new Date(Date.now())\n\t\t},\n\t\tsetDetailComponent(details){\n\t\t\t\n\t\t\tconst pa = this.projektarbeiten.find(projektarbeit => projektarbeit.projektarbeit_id == details.projektarbeit_id)\n\n\t\t\tif(pa?.abgabetermine?.length) {\n\t\t\t\tthis.$api.call(ApiAbgabe.getSignaturStatusForProjektarbeitAbgaben(pa.abgabetermine.map(termin => termin.paabgabe_id), pa.student_uid))\n\t\t\t\t\t.then(res => {\n\t\t\t\t\t\tif(res.meta.status === 'success') {\n\t\t\t\t\t\t\tres.data.forEach(paabgabe => {\n\t\t\t\t\t\t\t\tconst termin = pa.abgabetermine.find(abgabe => abgabe.paabgabe_id == paabgabe.paabgabe_id)\n\t\t\t\t\t\t\t\tif(termin && paabgabe.signatur !== undefined) termin.signatur = paabgabe.signatur\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t}\n\t\t\t\n\t\t\tconst paIsBenotet = pa.note !== null\n\t\t\t\n\t\t\tpa.abgabetermine.forEach(termin => {\n\t\t\t\tif(typeof termin.note !== 'object') {\n\t\t\t\t\ttermin.note = this.allowedNotenOptions.find(opt => opt.note == termin.note)\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\ttermin.file = []\n\n\t\t\t\t// assistenz should be able to edit every abgabe\n\t\t\t\t// update 21-01-2026: actually blocking operations on finished projektarbeiten seems like a decent idea\n\t\t\t\ttermin.allowedToSave = paIsBenotet ? false : true\n\n\t\t\t\t// assistenz are not allowed to delete deadlines with existing submissions\n\t\t\t\ttermin.allowedToDelete = paIsBenotet ? false : !termin.abgabedatum\n\n\t\t\t\ttermin.bezeichnung = this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz === termin.paabgabetyp_kurzbz)\n\n\t\t\t})\n\t\t\t\n\t\t\tconst vorname = pa.vorname ?? pa.student_vorname\n\t\t\tconst nachname = pa.nachname ?? pa.student_nachname\n\t\t\tpa.student = `${vorname} ${nachname}`\n\n\t\t\tthis.selectedProjektarbeit = pa\n\n\t\t\tthis.$refs.modalContainerAbgabeDetail.show()\n\t\t},\n\t\tdateDiffInDays(datum){\n\t\t\tconst dateToday = luxon.DateTime.now().startOf('day');\n\n\t\t\tconst dateDatum = luxon.DateTime.fromISO(datum).startOf('day');\n\n\t\t\tconst duration = dateDatum.diff(dateToday, 'days');\n\n\t\t\treturn duration.values.days;\n\t\t},\n\t\tgetDateStyleClass(termin) {\n\t\t\tconst datum = new Date(termin.datum)\n\t\t\tconst abgabedatum = new Date(termin.abgabedatum)\n\n\t\t\ttermin.diffindays = this.dateDiffInDays(termin.datum)\n\n\t\t\tconst isLate = termin.abgabedatum && abgabedatum > datum;\n\n\t\t\t// GRADE STATUS\n\t\t\tif (termin.note) {\n\t\t\t\tif (termin.note.positiv) return 'bestanden';\n\t\t\t\treturn 'nichtbestanden';\n\t\t\t}\n\n\t\t\t// ACTION REQUIRED FOR GRADE\n\t\t\tif (termin.bezeichnung?.benotbar && datum < today) {\n\t\t\t\treturn 'beurteilungerforderlich';\n\t\t\t}\n\n\t\t\t// SUBMISSION STATUS\n\t\t\tif (termin.upload_allowed) {\n\t\t\t\tif (termin.abgabedatum) {\n\t\t\t\t\treturn isLate ? 'verspaetet' : 'abgegeben';\n\t\t\t\t}\n\n\t\t\t\t// no submission yet\n\t\t\t\tif (datum < today) return 'verpasst';\n\t\t\t\tif (termin.diffindays <= 12) return 'abzugeben';\n\t\t\t\treturn 'standard';\n\t\t\t}\n\n\t\t\t// GENERIC STATUS\n\t\t\treturn datum < today ? 'verpasst' : 'standard';\n\t\t},\n\t\topenTimeline(val) {\n\t\t\tconst projekt = this.projektarbeiten.find(p => p.projektarbeit_id == val.projektarbeit_id)\n\t\t\tif(!projekt) {\n\n\t\t\t\tthis.$fhcAlert.alertInfo('Keine projektarbeit gefunden')\n\t\t\t\t\n\t\t\t\treturn\n\t\t\t}\n\t\t\tprojekt.abgabetermine.forEach(termin => {\n\t\t\t\t// show note only on termine with abgabetypen which are benotbar\n\t\t\t\tconst terminTypOpt = this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz == termin.paabgabetyp_kurzbz)\n\t\t\t\ttermin.benotbar = terminTypOpt.benotbar \n\t\t\t})\n\t\t\tthis.timelineProjekt = projekt\n\t\t\tthis.$refs.drawer.show()\n\t\t},\n\t\tcenteredTextFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\t\t\tif(!val) return\n\n\t\t\treturn '
    ' +\n\t\t\t\t'

    '+val+'

    '\n\t\t},\n\t\tdetailFormatter(cell) {\n\t\t\treturn '
    ' +\n\t\t\t\t'
    '\n\t\t},\n\t\tmailFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\t\t\treturn '
    ' +\n\t\t\t\t'
    '\n\t\t},\n\t\ttimelineFormatter() {\n\t\t\treturn '
    ' +\n\t\t\t\t'
    '\n\t\t},\n\t\tbeurteilungFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\t\t\tif(val) {\n\t\t\t\treturn '
    ' +\n\t\t\t\t\t'
    '\n\t\t\t} else return '-'\n\t\t},\n\t\tpkzTextFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\n\t\t\treturn '
    ' +\n\t\t\t\t''+val+'
    '\n\t\t},\n\t\tabgabterminFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\n\t\t\tif(val) {\n\t\t\t\tlet icon = ''\n\t\t\t\tswitch(val.dateStyle) {\n\t\t\t\t\tcase 'verspaetet':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'verpasst':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'abzugeben':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'standard':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'abgegeben':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'beurteilungerfolderlich':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'bestanden':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'nichtbestanden':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tconst bezeichnung = val.bezeichnung?.bezeichnung ?? val.bezeichnung\n\t\t\t\t\n\t\t\t\treturn '
    ' +\n\t\t\t\t\t'
    ' +\n\t\t\t\t\t\ticon +\n\t\t\t\t\t'
    ' + \n\t\t\t\t\t'
    ' +\n\t\t\t\t\t\t'

    '+bezeichnung+' - '+ this.formatDate(val.datum)+'

    ' +\n\t\t\t\t\t'
    '+\n\t\t\t\t\t'
    '\n\n\t\t\t} else {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\t\n\t\t},\n\t\ttableResolve(resolve) {\n\t\t\tthis.tableBuiltResolve = resolve\n\t\t},\n\t\tbuildMailToLink(projekt) {\n\t\t\treturn 'mailto:' + projekt.student_uid +'@'+ this.domain\n\t\t},\n\t\tbuildPKZ(projekt) {\n\t\t\treturn `${projekt.student_uid} / ${projekt.matrikelnr}`\n\t\t},\n\t\tbuildStg(projekt) {\n\t\t\treturn (projekt.typ + projekt.kurzbz)?.toUpperCase()\n\t\t},\n\t\tbuildErstbetreuer(projekt) {\n\t\t\tif(projekt.erstbetreuer_full_name) return projekt.erstbetreuer_full_name\n\t\t\treturn projekt.betreuer_vorname + ' ' + projekt.betreuer_nachname\n\t\t},\n\t\tbuildZweitbetreuer(projekt) {\n\t\t\treturn projekt.zweitbetreuer_full_name ?? ''\n\t\t},\n\t\tasync setupData(data){\n\t\t\tthis.projektarbeiten = data[0]\n\t\t\tthis.domain = data[1]\n\t\t\t\n\t\t\tthis.tableData = this.mapProjekteToTableData(this.projektarbeiten)\n\n\t\t\tawait this.tableBuiltPromise\n\t\t\t\n\t\t\tthis.$refs.abgabeTable.tabulator.setData(this.tableData);\n\t\t},\n\t\tloadProjektarbeiten(all = false, callback) {\n\t\t\tthis.loading = true\n\t\t\tthis.$api.call(ApiAbgabe.getProjektarbeitenForStudiengang(\n\t\t\t\tthis.selectedStudiengangOption.studiengang_kz,\n\t\t\t\tthis.notenOptionFilter?.benotet ?? 0\n\t\t\t))\n\t\t\t\t.then(res => {\n\t\t\t\t\tif(res?.data) this.setupData(res.data)\n\t\t\t\t}).finally(() => {\n\t\t\t\tif(callback) {\n\t\t\t\t\tcallback()\n\t\t\t\t}\n\t\t\t}).finally(()=>{\n\t\t\t\tthis.loading=false\n\t\t\t})\n\t\t},\n\t\tloadAbgaben(details) {\n\t\t\treturn new Promise((resolve) => {\n\t\t\t\tthis.$api.call(ApiAbgabe.getStudentProjektabgaben(details))\n\t\t\t\t\t.then(res => {\n\t\t\t\t\t\tresolve(res)\n\t\t\t\t\t})\n\t\t\t})\n\t\t},\n\t\thandleUuidDefined(uuid) {\n\t\t\tthis.tabulatorUuid = uuid\n\t\t},\n\t\tcalcMaxTableHeight() {\n\t\t\tconst tableID = this.tabulatorUuid ? ('-' + this.tabulatorUuid) : ''\n\t\t\tconst tableDataSet = document.getElementById('filterTableDataset' + tableID);\n\t\t\tif(!tableDataSet) return\n\t\t\tconst rect = tableDataSet.getBoundingClientRect();\n\n\t\t\tthis.abgabeTableOptions.height = window.visualViewport.height - rect.top - 80\n\t\t\tthis.$refs.abgabeTable.tabulator.setHeight(this.abgabeTableOptions.height)\n\t\t},\n\t\tasync setupMounted() {\n\t\t\tthis.tableBuiltPromise = new Promise(this.tableResolve)\n\t\t\tawait this.tableBuiltPromise\n\t\t\t\n\t\t\tawait this.allConfigPromise\n\t\t\t\n\t\t\t// called through notenOptionFilter/selectedStudiengangOption watcher on startup\n\t\t\t// this.loadProjektarbeiten()\n\n\t\t\tthis.calcMaxTableHeight()\n\t\t},\n\t\tgetOptionDisabled(option) {\n\t\t\treturn !option.aktiv\n\t\t},\n\t},\n\tcomputed: {\n\t\temailItems() {\n\t\t\tconst menu = []\n\t\t\t\n\t\t\tif(this.ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT){\n\t\t\t\tmenu.push({\n\t\t\t\t\tlabel: this.$p.t('abgabetool/c4sendEmailStudierendev2', [this.uniqueStudentEmailCount]),\n\t\t\t\t\tcommand: this.sammelMailStudent\n\t\t\t\t})\n\t\t\t}\n\t\t\t\n\t\t\tif(this.ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER) {\n\t\t\t\tmenu.push({\n\t\t\t\t\tlabel: this.$p.t('abgabetool/c4sendEmailBetreuerv2', [this.uniqueBetreuerEmailCount]),\n\t\t\t\t\tcommand: this.sammelMailBetreuer\n\t\t\t\t})\n\t\t\t}\n\n\t\t\treturn menu\n\t\t},\n\t\tuniqueBetreuerEmailCount() {\n\t\t\tconst emails = new Set();\n\t\t\t\n\t\t\tthis.selectedData.forEach(row => {\n\t\t\t\tif (row.betreuer_mail) emails.add(row.betreuer_mail);\n\t\t\t\tif (row.zweitbetreuer_mail) emails.add(row.zweitbetreuer_mail);\n\t\t\t});\n\n\t\t\treturn emails.size;\n\t\t},\n\t\tuniqueStudentEmailCount() {\n\t\t\tconst emails = new Set();\n\n\t\t\tthis.selectedData.forEach(row => {\n\t\t\t\tif (row.student_uid) {\n\t\t\t\t\temails.add(row.student_uid); // actually dont need domain for this\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn emails.size;\n\t\t}\n\t},\n\twatch: {\n\t\t'serienTermin.bezeichnung'(newVal) {\n\t\t\tif(newVal?.paabgabetyp_kurzbz === 'qualgate1' || newVal?.paabgabetyp_kurzbz === 'qualgate2') {\n\t\t\t\tthis.serienTermin.kurzbz = newVal.bezeichnung\n\t\t\t}\n\n\t\t\tthis.serienTermin.upload_allowed = newVal.upload_allowed_default\n\t\t},\n\t\tselectedStudiengangOption(newVal, oldVal) {\n\t\t\t// implicitely avoids juggling around promises for created api calls,\n\t\t\t// since we need note & stg flags for loadProjektarbeiten\n\t\t\tif(this.notenOptionFilter !== null && this.selectedStudiengangOption !== null) {\n\t\t\t\tthis.loadProjektarbeiten()\n\t\t\t}\n\t\t},\n\t\tnotenOptionFilter(newVal) {\n\t\t\t// that single where clause is worth a decent load time so rather not filter tabulator but just \n\t\t\t// adapt the qry\n\t\t\tif(this.notenOptionFilter !== null && this.selectedStudiengangOption !== null) {\n\t\t\t\tthis.loadProjektarbeiten()\n\t\t\t}\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.loading = true\n\t\tthis.phrasenPromise = this.$p.loadCategory(['abgabetool', 'global'])\n\t\tthis.phrasenPromise.then(()=> {this.phrasenResolved = true})\n\t\t\n\t\t//TODO: SWITCH TO NOTEN API ONCE NOTENTOOL IS IN MASTER TO AVOID DUPLICATE API\n\t\tconst requests = [\n\t\t\tthis.$api.call(ApiAbgabe.getConfig()),\n\t\t\tthis.$api.call(ApiAbgabe.getStudiengaenge()),\n\t\t\tthis.$api.call(ApiStudiensemester.getAllStudiensemesterAndAktOrNext()),\n\t\t\tthis.$api.call(ApiAbgabe.getNoten()),\n\t\t\tthis.$api.call(ApiAbgabe.getPaAbgabetypen())\n\t\t];\n\n\t\tthis.allConfigPromise = Promise.allSettled(requests)\n\t\t\t.then((results) => {\n\t\t\t\t// results is an array of { status: 'fulfilled'|'rejected', value?: any, reason?: any }\n\n\t\t\t\t// 1. Config\n\t\t\t\tif (results[0].status === 'fulfilled') {\n\t\t\t\t\tconst res = results[0].value;\n\t\t\t\t\tthis.turnitin_link = res.data?.turnitin_link;\n\t\t\t\t\tthis.old_abgabe_beurteilung_link = res.data?.old_abgabe_beurteilung_link;\n\t\t\t\t\tthis.ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT = res.data?.ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT;\n\t\t\t\t\tthis.ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER = res.data?.ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER;\n\t\t\t\t}\n\n\t\t\t\t// 2. Studiengänge\n\t\t\t\tif (results[1].status === 'fulfilled') {\n\t\t\t\t\tconst res = results[1].value;\n\t\t\t\t\tthis.studiengaengeOptions = res.data;\n\t\t\t\t\tif (this.studiengaengeOptions?.length) {\n\t\t\t\t\t\tthis.selectedStudiengangOption = this.stg_kz_prop\n\t\t\t\t\t\t\t? res.data.find(stgOpt => stgOpt.studiengang_kz == this.stg_kz_prop)\n\t\t\t\t\t\t\t: res.data[0];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// 3. Studiensemester\n\t\t\t\tif (results[2].status === 'fulfilled') {\n\t\t\t\t\tconst res = results[2].value;\n\t\t\t\t\tthis.allSem = res.data[0];\n\t\t\t\t\tconst all = { studiensemester_kurzbz: this.$p.t('abgabetool/c4all') };\n\t\t\t\t\tthis.curSem = all;\n\t\t\t\t\tthis.studiensemesterOptions = [all, ...this.allSem];\n\t\t\t\t}\n\n\t\t\t\t// 4. Noten\n\t\t\t\tif (results[3].status === 'fulfilled') {\n\t\t\t\t\tconst res = results[3].value;\n\t\t\t\t\tif (res.meta?.status === 'success') {\n\t\t\t\t\t\tthis.notenOptions = res.data[0];\n\t\t\t\t\t\tthis.allowedNotenOptions = this.notenOptions.filter(\n\t\t\t\t\t\t\topt => res.data[1].includes(opt.note)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tthis.notenOptionsNonFinal = this.notenOptions.filter(\n\t\t\t\t\t\t\topt => res.data[2].includes(opt.note)\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.allowedNotenFilterOptions = [\n\t\t\t\t\t\t{ bezeichnung: Vue.computed(() => this.$p.t('abgabetool/keineNoteEingetragen')), benotet: 0 },\n\t\t\t\t\t\t{ bezeichnung: Vue.computed(() => this.$p.t('abgabetool/c4benotet')), benotet: 1 },\n\t\t\t\t\t\t{ bezeichnung: Vue.computed(() => this.$p.t('abgabetool/showAll')), benotet: -1 }\n\t\t\t\t\t];\n\t\t\t\t\tthis.notenOptionFilter = this.allowedNotenFilterOptions[0];\n\t\t\t\t}\n\n\t\t\t\t// 5. Abgabetypen\n\t\t\t\tif (results[4].status === 'fulfilled') {\n\t\t\t\t\tconst res = results[4].value;\n\t\t\t\t\tthis.abgabeTypeOptions = res.data;\n\t\t\t\t}\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tthis.loading = false;\n\t\t\t});\n\t},\n\tmounted() {\n\t\tthis.setupMounted()\n\t},\n\ttemplate: `\n\t\n `,\n};\n\nexport default AbgabetoolAssistenz;\n","import {CoreFilterCmpt} from \"../../../components/filter/Filter.js\";\nimport ApiAbgabe from '../../../api/factory/abgabe.js'\n\nexport const DeadlineOverview = {\n\tname: \"DeadlineOverview\",\n\tcomponents: {\n\t\tCoreFilterCmpt,\n\t},\n\tprops: {\n\t\tperson_uid_prop: {\n\t\t\tdefault: null\t\n\t\t},\n\t\tviewData: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t\tdefault: () => ({name: '', uid: ''}),\n\t\t\tvalidator(value) {\n\t\t\t\treturn value && value.name && value.uid\n\t\t\t}\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tfullName: null, // TODO: fetch this somewhere\n\t\t\tdeadlines: null,\n\t\t\ttabulatorUuid: Vue.ref(0),\n\t\t\ttableBuiltResolve: null,\n\t\t\ttableBuiltPromise: null,\n\t\t\tphrasenPromise: null,\n\t\t\tphrasenResolved: false,\n\t\t\tdeadlineTableOptions: {\n\t\t\t\theight: 700,\n\t\t\t\tindex: 'projektarbeit_id',\n\t\t\t\tlayout: 'fitColumns',\n\t\t\t\tplaceholder: Vue.computed(() => this.$p.t('global/noDataAvailable')),\n\t\t\t\tcolumns: [\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4zieldatum'))), field: 'datum', formatter: this.centeredTextFormatter, widthGrow: 1, tooltip: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4fixterminv4'))), field: 'fixterminstring', formatter: this.centeredTextFormatter, widthGrow: 1, tooltip: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4abgabetyp'))), field: 'typ_bezeichnung', formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4abgabekurzbz'))), field: 'kurzbz', formatter: this.centeredTextFormatter, widthGrow: 3},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('person/studentIn'))), field: 'student', formatter: this.centeredTextFormatter, widthGrow: 2},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4stg'))), field: 'stg', formatter: this.centeredTextFormatter,widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4sem'))), field: 'semester', formatter: this.centeredTextFormatter, widthGrow: 1}\n\t\t\t\t],\n\t\t\t\tpersistence: false,\n\t\t\t},\n\t\t\tdeadlineTableEventHandlers: [{\n\t\t\t\tevent: \"tableBuilt\",\n\t\t\t\thandler: async () => {\n\t\t\t\t\tthis.tableBuiltResolve()\n\t\t\t\t}\n\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tevent: \"cellClick\",\n\t\t\t\t\thandler: async (e, cell) => {\n\n\t\t\t\t\t\tif(cell.getColumn().getField() === \"details\") {\n\t\t\t\t\t\t\tconst val = cell.getValue()\n\n\t\t\t\t\t\t\tif(val.mode === 'detailTermine') {\n\t\t\t\t\t\t\t\tthis.setDetailComponent(cell.getValue())\n\t\t\t\t\t\t\t} else if (val.mode === 'beurteilungDownload') {\n\t\t\t\t\t\t\t\tconst pdfExportLink = FHC_JS_DATA_STORAGE_OBJECT.app_root + 'cis/private/pdfExport.php?xml=projektarbeitsbeurteilung.xml.php&xsl=Projektbeurteilung&betreuerart_kurzbz='+val.betreuerart_kurzbz+'&projektarbeit_id='+val.projektarbeit_id+'&person_id=' + val.betreuer_person_id\n\t\t\t\t\t\t\t\t// const pdfExportLink2 = FHC_JS_DATA_STORAGE_OBJECT.app_root + 'cis/private/lehre/projektbeurteilungDocumentExport.php?betreuerart_kurzbz='+val.betreuerart_kurzbz+'&projektarbeit_id='+val.projektarbeit_id+'&person_id=' + val.betreuer_person_id\n\t\t\t\t\t\t\t\twindow.open(pdfExportLink, '_blank')\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else if (cell.getColumn().getField() === \"beurteilung\") {\n\t\t\t\t\t\t\tconst val = cell.getValue()\n\n\t\t\t\t\t\t\tif(val != '-') window.open(val, '_blank')\n\t\t\t\t\t\t}\n\t\t\t\t\t\te.stopPropagation()\n\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]};\n\t},\n\tmethods: {\n\t\tcenteredTextFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\n\t\t\treturn '
    ' +\n\t\t\t\t'

    '+val+'

    '\n\t\t},\n\t\ttableResolve(resolve) {\n\t\t\tthis.tableBuiltResolve = resolve\n\t\t},\n\t\tloadDeadlines() {\n\t\t\tthis.$api.call(ApiAbgabe.fetchDeadlines(this.person_uid_prop ?? null))\n\t\t\t\t.then(res => {\n\t\t\t\t\tif(res?.data) this.setupData(res.data)\n\t\t\t\t})\n\t\t},\n\t\tsetupData(data) {\n\t\t\tthis.deadlines = data\n\t\t\t\n\t\t\tthis.deadlines.forEach(dl => {\n\t\t\t\tdl.student = (dl.stud_titelpre ? (dl.stud_titelpre + ' ') :'') + dl.stud_vorname + ' ' + dl.stud_nachname + (dl.stud_titelpost ? (' ' + dl.stud_titelpost) :'')\n\t\t\t\tdl.fixterminstring = dl.fixtermin ? this.$p.t('abgabetool/c4yes') : this.$p.t('abgabetool/c4no')\n\t\t\t})\n\n\t\t\tthis.$refs.deadlineTable.tabulator.setColumns(this.deadlineTableOptions.columns)\n\t\t\tthis.$refs.deadlineTable.tabulator.setData(this.deadlines);\n\t\t},\n\t\thandleUuidDefined(uuid) {\n\t\t\tthis.tabulatorUuid = uuid\n\t\t},\n\t\tcalcMaxTableHeight() {\n\t\t\tconst tableID = this.tabulatorUuid ? ('-' + this.tabulatorUuid) : ''\n\t\t\tconst tableDataSet = document.getElementById('filterTableDataset' + tableID);\n\t\t\tif(!tableDataSet) return\n\t\t\tconst rect = tableDataSet.getBoundingClientRect();\n\n\t\t\tthis.deadlineTableOptions.height = window.visualViewport.height - rect.top - 30\n\t\t\tthis.$refs.deadlineTable.tabulator.setHeight(this.deadlineTableOptions.height)\n\t\t},\n\t\tasync setupMounted() {\n\t\t\tthis.tableBuiltPromise = new Promise(this.tableResolve)\n\t\t\tawait this.tableBuiltPromise\n\n\t\t\tthis.loadDeadlines()\n\t\t\tthis.calcMaxTableHeight()\n\t\t}\n\t},\n\twatch: {\n\n\t},\n\tcomputed: {\n\n\t},\n\tcreated() {\n\t\tthis.phrasenPromise = this.$p.loadCategory(['abgabetool', 'global'])\n\t\tthis.phrasenPromise.then(()=> {this.phrasenResolved = true})\n\t},\n\tmounted() {\n\t\tthis.setupMounted()\n\t},\n\ttemplate: `\n\t\t

    {{$p.t('abgabetool/deadlinesTitle')}} {{ fullName ? ('-' + fullName) : ''}}

    \n\t\t
    \n\t\t\t\n\t\t \n `,\n};\n\nexport default DeadlineOverview;\n","import PluginsPhrasen from '../../plugins/Phrasen.js';\nimport AbgabetoolStudent from \"../../components/Cis/Abgabetool/AbgabetoolStudent.js\";\nimport AbgabetoolMitarbeiter from \"../../components/Cis/Abgabetool/AbgabetoolMitarbeiter.js\";\nimport AbgabetoolAssistenz from \"../../components/Cis/Abgabetool/AbgabetoolAssistenz.js\";\nimport DeadlineOverview from \"../../components/Cis/Abgabetool/DeadlineOverview.js\";\nimport {capitalize} from \"../../helpers/StringHelpers.js\";\n\nconst app = Vue.createApp({\n\tname: 'AbgabetoolApp',\n\tcomponents: {\n\t\tAbgabetoolStudent,\n\t\tAbgabetoolMitarbeiter,\n\t\tAbgabetoolAssistenz,\n\t\tDeadlineOverview\n\t},\n\tdata: function() {\n\t\treturn {\n\t\t\tcomp: null,\n\t\t\tuid: null,\n\t\t\tstudent_uid: null,\n\t\t\tstg_kz: null\n\t\t};\n\t},\n\tmethods: {\n\t\t\n\t},\n\tcomputed: {\n\t\tviewData() {\n\t\t\treturn { uid: this.uid}\n\t\t},\n\t\tstudent_uid_computed() {\n\t\t\treturn this.student_uid ?? this.uid\n\t\t},\n\t\tstg_kz_computed() {\n\t\t\treturn this.stg_kz ?? null\n\t\t}\n\t},\n\tcreated() {\n\t},\n\tmounted() {\n\t\t\n\t\tconst root = document.getElementById('abgabetoolroot')\n\t\tconst route = root.getAttribute(\"route\");\n\t\tthis.comp = route\n\n\t\tconst uid = root.getAttribute(\"uid\");\n\t\tthis.uid = uid\n\n\t\tconst stg_kz = root.getAttribute(\"stg_kz_prop\");\n\t\tthis.stg_kz = stg_kz\n\n\t\tconst student_uid = root.getAttribute(\"student_uid_prop\");\n\t\tthis.student_uid = student_uid\n\t\t\n\t},\n\ttemplate: `\n\t\t\n\t`\n});\napp.config.globalProperties.$capitalize = capitalize;\napp.use(primevue.config.default, {\n\tzIndex: {\n\t\toverlay: 9000,\n\t\ttooltip: 8000\n\t}\n})\napp.directive('tooltip', primevue.tooltip);\napp.use(PluginsPhrasen);\napp.mount('#abgabetoolroot');\n","export function capitalize(string) {\n\tif (!string) return '';\n\treturn string[0].toUpperCase() + string.slice(1);\n}"],"names":["search","searchsettings","config","this","$fhcApi","post","searchAdvanced","searchdummy","phrasen$1","loadCategory","category","get","setLanguage","categories","language","payload","getLanguage","getActiveDbLanguages","navigation","getHeader","navigation_page","getMenu","filter$1","saveCustomFilter","wsParams","filterUniqueId","filterType","customFilterName","removeCustomFilter","filterId","applyFilterFields","filterFields","addFilterField","filterField","removeFilterField","getFilterById","getFilter","studstatus","abmeldung","getDetails","antrag_id","prestudent_id","url","undefined","create","stdsem","grund","studiensemester","errorHandling","cancel","Array","isArray","Promise","allSettled","map","antrag","studierendenantrag_id","errorHeader","unterbrechung","datum_wiedereinstieg","attachment","wiederholung","getLvs","saveLvs","forbiddenLvs","mandatoryLvs","leitung","getStgs","getAntraege","params","then","res","data","getHistory","getPrestudents","query","signal","timeout","approve","a","reject","reopen","pause","unpause","object","approveObjection","denyObjection","profil","getView","uid","FHC_JS_DATA_STORAGE_OBJECT","app_root","ci_router","fotoSperre","value","isStudent","isMitarbeiter","getZustellAdresse","getZustellKontakt","getGemeinden","nation","zip","getAllNationen","profilUpdate","getStatus","getTopic","acceptProfilRequest","profil_update_id","status_message","topic","requested_change","denyProfilRequest","insertFile","dms","replace","getProfilRequestFiles","requestID","selectProfilRequest","id","insertProfilRequest","fileID","updateProfilRequest","ID","deleteProfilRequest","lvPlan","getRoomInfo","ort_kurzbz","start_date","end_date","getStunden","getOrtReservierungen","getLvPlanReservierungen","getLehreinheitStudiensemester","lehreinheit_id","studiensemesterDateInterval","date","LvPlanEvents","lv_id","stv","verband","favorites","set","students","studiensemester_kurzbz","encodeURIComponent","getUri","prestudent","person","person_id","relative_path","filter","getStg","setStg","studiengang_kz","konto","tabulatorConfig","self","ajaxURL","ajaxParams","modelValue","e","only_open","studiengang_kz_intern","stg_kz","ajaxRequestFunc","ajaxResponse","response","checkDoubles","form","confirmErrorHandler","error","insert","counter","edit","delete","buchungsnr","getBuchungstypen","group","getGruppen","deleteGroup","kontakt","getAdressen","addNewAddress","loadAddress","address_id","updateAddress","deleteAddress","getPlaces","plz","getFirmen","searchString","getNations","getAdressentypen","getBankverbindung","addNewBankverbindung","loadBankverbindung","bankverbindung_id","updateBankverbindung","deleteBankverbindung","getKontakte","addNewContact","loadContact","kontakt_id","updateContact","deleteContact","getStandorteByFirma","getKontakttypen","updatePrestudent","getBezeichnungZGV","getBezeichnungMZgv","getBezeichnungDZgv","getAusbildung","getAufmerksamdurch","getBerufstaetigkeit","getTypenStg","getBisstandort","getHistoryPrestudent","getMaxSem","studiengang_kzs","advanceStatus","status_kurzbz","ausbildungssemester","confirmStatus","isLastStatus","deleteStatus","getLastBismeldestichtag","getHistoryPrestudents","status","insertStatus","loadStatus","updateStatus","getStudienplaene","getStudiengang","getStatusgruende","getStati","addStudent","changeStatus","getStatusarray","details","save","exam","getPruefungen","loadPruefung","pruefung_id","getTypenPruefungen","getAllLehreinheiten","getLvsByStudent","getLvsandLesByStudent","semester","getLvsAndMas","getMitarbeiterLv","getNoten","checkZeugnisnoteLv","addPruefung","updatePruefung","deletePruefung","abschlusspruefung","getAbschlusspruefung","addNewAbschlusspruefung","loadAbschlusspruefung","updateAbschlusspruefung","deleteAbschlusspruefung","getTypenAbschlusspruefung","getTypenAntritte","getBeurteilungen","getAkadGrade","getTypStudiengang","getMitarbeiter","getPruefer","checkForExistingExams","uids","grades","list","getCertificate","getTeacherProposal","getRepeaterGrades","updateCertificate","lehrveranstaltung_id","student_uid","note","lehrveranstaltung_bezeichnung","deleteCertificate","copyTeacherProposalToCertificate","copyRepeaterGradeToCertificate","studierendenantrag_lehrveranstaltung_id","lv_bezeichnung","getGradeFromPoints","points","manualErrorHandling","mobility","getMobilitaeten","getProgramsMobility","addNewMobility","loadMobility","bisio_id","updateMobility","deleteMobility","getLVList","getPurposes","getSupports","getListPurposes","getListSupports","deleteMobilityPurpose","addMobilityPurpose","deleteMobilitySupport","addMobilitySupport","archiv","getArchivVorlagen","archive","archiveSigned","update","akte_id","documents","getDocumentsUnaccepted","getDocumentsAccepted","deleteZuordnung","dokument_kurzbz","createZuordnung","loadAkte","getDoktypen","updateFile","deleteFile","uploadFile","exemptions","getAnrechnungen","getLehrveranstaltungen","getBegruendungen","getLvsKompatibel","getLektoren","addNewAnrechnung","loadAnrechnung","anrechnung_id","editAnrechnung","deleteAnrechnung","jointstudies","getStudies","getTypenMobility","getStudiensemester","getStudyprograms","getListPartner","getStatiPrestudent","loadStudy","insertStudy","updateStudy","deleteStudy","courselist","getCourselist","group_consecutiveHours","dbStundenplanTable","configStudent","configStudents","notiz","getNotizen","type","getUid","addNewNotiz","formData","loadNotiz","notiz_id","loadDokumente","deleteNotiz","type_id","updateNotiz","event","isBerechtigt","betriebsmittel","getAllBetriebsmittel","addNewBetriebsmittel","loadBetriebsmittel","betriebsmittelperson_id","updateBetriebsmittel","deleteBetriebsmittel","getTypenBetriebsmittel","loadInventarliste","checkperson","updatePersonUnrulyStatus","unrulyParam","unruly","filterPerson","base","axios","ort","getContentID","ort_kurbz","getRooms","datum","von","bis","typ","personenanzahl","getRoomTypes","cms","content","content_id","version","sprache","sichtbar","getNews","page","page_size","news","limit","getNewsRowCount","getNewsExtra","lehre","getStudentenMail","getLvInfo","getStudentPruefungen","addons","getLvMenu","lvid","messages","getMessages","size","getVorlagen","getMsgVarsLoggedInUser","getMessageVarsPerson","getMsgVarsPrestudent","getPersonId","getDataVorlage","vorlage_kurzbz","getNameOfDefaultRecipient","getPreviewText","getReplyData","messageId","sendMessageFromModalContext","sendMessage","deleteMessage","vorlagen","getVorlagenByLoggedInUser","studium","getAllStudienSemester","studiengang","studienplan","getStudiengaengeForStudienSemester","getStudienplaeneBySemester","getLvPlanForStudiensemester","getLvEvaluierungInfo","FhcApiFactory","phrasen","dashboard","getViewData","bookmark","getBookmarks","bookmark_id","title","tag","ampeln","open","all","confirm","ampel_id","studiengangInformation","getStudiengangByKz","menu","authinfo","getAuthUID","getAuthInfo","getAll","OldFhcApi","install","app","options","globalProperties","factory","console","warn","addEndpoints","_get_config","uri","TypeError","clearValidation","setFeedback","_clean_return_value","result","meta","fhcApiAxios","baseURL","interceptors","request","use","method","FormData","Object","values","every","item","FileList","i","File","newData","entries","reduce","nd","key","file","append","length","jsondata","forEach","JSON","stringify","errors","err","_defaultErrorHandlers","code","handled","$fhcAlert","alertDefault","message","responseURL","alertError","validation","$p","t","apply","general","php","filename","line","backtrace","function","severity","alertSystemError","exception","class","db","heading","sql","join","auth","controller","required_permissions","FhcApiFactoryWrapper","constructor","factorypart","root","defineProperty","noWarn","keys","bind","provide","CORE_REST_CLIENT_ERROR","CORE_REST_CLIENT_RETVAL","CoreRESTClient","wsURL","wsParameters","axiosParameters","_axiosCall","isSuccess","hasOwnProperty","isError","hasData","trim","getData","getError","getErrorCode","_generateRouterURI","_printDebug","parameters","errorThrown","axiosCallObj","prop","helperAppContainer","document","createElement","helperApp","Vue","createApp","name","components","PvToast","PvConfirm","methods","mailToUrl","slotProps","systemerror_mailto","called_path","called_method","detail","openMessagecard","bootstrap","Collapse","getOrCreateInstance","target","getAttribute","toggle","unmounted","parentElement","removeChild","computed","showmaillink","template","PvConfig","PvConfirmationService","helperAppInstance","mount","body","appendChild","FhcAlert","FhcPhrasen","alertSuccess","$refs","toast","add","summary","life","alertInfo","alertWarning","alert","confirmDelete","resolve","$confirm","require","header","acceptLabel","acceptClass","rejectLabel","rejectClass","accept","sticky","html","alertMultiple","messageArray","handleSystemError","toLowerCase","errMsg","retval","toUpperCase","stack","handleSystemMessage","msg","resetFormValidation","Event","querySelectorAll","el","dispatchEvent","handleFormValidation","nodeType","Node","ELEMENT_NODE","notFound","input","querySelector","CustomEvent","arr","PluginsApi","$api","_send_array_or_object","func","errs","DEFAULT_ERROR_CONFIG","success","fail","combine","handler","async","_format_toast","_default","push","field","msgs","sort","b","indexOf","n_errors","n","get_config","clean_return_value","String","_merge_error_config","get_error_handler","formHandler","get_error_list","popHandleableErrors","copy","pop","newType","newTypeCombinesType","includes","newTypeHasHandler","errorConfig","remaining","call","configoverwrite","index","typedErrors","allowed","reason","errType","getErrorHandler","ApiPhrasen","reactive","loadingModules","user_language","ref","user_locale","server_languages","find","LC_Time","catArray","row","phrase","text","obj","elem","extractCategory","t_ref","split","val","match","p1","getValueForLoadedPhrase","PluginsPhrasen","cat","lang","Upload","DmsItem","emits","props","required","preview","watch","parse","multiple","Boolean","inputClass","noList","default","disabled","stringifyFile","lastModified","lastModifiedDate","addFiles","$emit","files","dt","DataTransfer","doubles","items","removeFile","fileToRemove","from","upload","dmsFile","BsModal","modal","fullscreen","backdrop","validator","focus","keyboard","noCloseBtn","dialogClass","headerClass","bodyClass","footerClass","allowFullscreenExpand","dispose","handleUpdate","hide","show","relatedTarget","toggleFullscreen","mounted","Modal","popup","footer","slots","includedPrimevue","primevue","instance","setup","h","unmount","beforeUnmount","wrapper","zIndex","overlay","Phrasen","ApiAbgabe","getConfig","getConfigStudent","getStudentProjektarbeiten","getStudentProjektabgaben","projektarbeit_id","postStudentProjektarbeitEndupload","Headers","postStudentProjektarbeitZwischenabgabe","getMitarbeiterProjektarbeiten","showall","postProjektarbeitAbgabe","termin","dateString","Date","getFullYear","getMonth","padStart","getDate","paabgabe_id","paabgabetyp_kurzbz","bezeichnung","note_pk","upload_allowed","beurteilungsnotiz","fixtermin","insertvon","kurzbz","betreuer_person_id","deleteProjektarbeitAbgabe","postSerientermin","projektarbeit_ids","fetchDeadlines","getPaAbgabetypen","getProjektarbeitenForStudiengang","benotet","getStudiengaenge","postStudentProjektarbeitZusatzdaten","getSignaturStatusForProjektarbeitAbgaben","paabgabe_ids","FhcOverlay","active","AbgabeStudentDetail","InputNumber","inputnumber","Checkbox","checkbox","Dropdown","dropdown","Textarea","textarea","Accordion","accordion","AccordionTab","accordiontab","Message","Inplace","inplace","VueDatePicker","inject","projektarbeit","viewMode","loading","eidAkzeptiert","enduploadTermin","allActiveLanguages","abstract","abstract_en","schlagwoerter","schlagwoerter_en","kontrollschlagwoerter","seitenanzahl","getNoteBezeichnung","noteOpt","notenOptions","opt","positiv","$capitalize","benotbar","validate","endupload","triggerEndupload","bperson_id","handleUploadRes","finally","modalContainerEnduploadZusatzdaten","downloadAbgabe","window","formatDate","dateParam","padZero","num","month","abgabedatum","toISOString","signatur","signaturInfo","getOptionLabel","option","getTerminNoteBezeichnung","newVal","getMoodleLink","moodle_link","getMessagePtStyle","style","margin","padding","getEid","allowedToSaveZusatzdaten","getAllowedToSendEndupload","qualityGateTerminAvailable","qgatefound","abgabetermine","abgabe","getTooltipVerspaetet","getTooltipVerpasst","getTooltipAbzugeben","getTooltipStandard","getTooltipAbgegeben","getTooltipFixtermin","getTooltipAbgabeDetected","getTooltipNotAllowedToUpload","isViewMode","getTooltipBeurteilungerforderlich","getTooltipBestanden","getTooltipNichtBestanden","created","today","AbgabetoolStudent","AbgabeDetail","student_uid_prop","viewData","activeTabIndex","abgabeTypeOptions","phrasenPromise","phrasenResolved","projektarbeiten","selectedProjektarbeit","dateDiffInDays","datumParam","isNaN","getTime","year","day","pad","dateToday","luxon","DateTime","now","startOf","fromISO","diff","days","getDateStyleClass","diffindays","isLate","Number","isInteger","checkQualityGatesStrict","termine","qgate1Passed","qgate2Passed","noteOption","checkQualityGatesOptional","qgate1found","qgate2found","qgate1positiv","qgate2positiv","isPastDate","setDetailComponent","loadAbgaben","pa","projekarbeit","paIsBenotet","allowedToUpload","dateStyle","betreuer","buildBetreuer","modalContainerAbgabeDetail","centeredTextFormatter","cell","getValue","detailFormatter","mode","mailFormatter","beurteilungFormatter","buildMailToLink","projekt","email","btitelpre","bvorname","bnachname","btitelpost","setupData","betreuerart_kurzbz","beurteilung1","downloadLink1","beurteilung2","downloadLink2","sem","stg","kurzbzlang","mail","projekttypbezeichnung","titel","loadProjektarbeiten","setupMounted","getAccTabHeaderForProjektarbeit","getMailLink","handleDownloadBeurteilung1","handleDownloadBeurteilung2","allowedNotenOptions","catch","CoreFetchCmpt","refresh","apiFunction","Function","apiFunctionParameters","newValue","oldValue","fetchData","errorMessage","apiFunctionResult","successHandler","errorHandler","finallyHandler","setError","FILTER_COMPONENT_NEW_FILTER","FilterConfig","filters","columns","fields","switchFilter","applyFilterConfig","currentFields","types","c","evt","currentTarget","filteredFields","condition","addField","removeField","splice","FilterColumns","selected","names","selectedFields","DEFAULT_ICONS","jsonLines","xlsx","pdf","json","csv","DEFAULT_LABELS","TableDownload","tabulator","iconClass","currentConfig","prototype","toString","newConfig","k","v","stringToFileFormatter","icon","label","formatter","validateFileFormatter","lcInput","XLSX","jspdf","jsPDF","autoTable","download","elementDataMap","WeakMap","collapseAutoClose","binding","contains","collapse","getInstance","addEventListener","removeEventListener","collapsibleAutoHideFunc","Tabulator","extendModule","fitDataStretchFrozen","forced","colsWidth","tableWidth","table","rowManager","element","clientWidth","gap","lastCol","column","widthFixed","reinitializeWidth","responsiveLayout","modules","responsive","visible","definition","frozen","getWidth","modExists","setWidth","ApiFilter","_uuid","CoreFilterCmpt","directives","onNwNewEntry","description","sideMenu","tabulatorOptions","tabulatorEvents","tableOnly","noColumnFilter","reload","reloadBtnInfotext","newBtnShow","newBtnClass","newBtnDisabled","newBtnLabel","uniqueId","idField","parentIdField","countOnly","useSelectionSpan","uuid","filterName","filterActive","dataset","datasetMetadata","availableFilters","selectedFilter","fetchCmptRefresh","fetchCmptApiFunction","fetchCmptApiFunctionParams","fetchCmptDataFetched","fetchResult","tableBuilt","tabulatorHasSelector","selectedData","persistence","headerFilter","notSelectedFields","x","filteredData","filteredColumns","col","resizable","fieldIdsForVisibilty","getColumns","def","getDefinition","getField","fieldNames","idExtra","columnsForFilter","filterTitles","reloadTable","setData","initTabulator","placeholder","location","hash","slice","resolvePromiseFunc","setRenderData","startFetchCmpt","layout","movableColumns","columnDefaults","tooltip","height","minHeight","maxHeight","selectable","dataTree","on","toDelete","childIdx","child","cols","isVisible","_setHeaderFilter","updateTabulator","_updateTabulator","setColumns","clearFilters","getHeaderFilters","setHeaderFilterValue","clearFilter","render","j","setSideMenu","setDropDownMenu","personalFilters","filtersArray","filtersCount","link","filter_id","desc","onClickCall","handlerGetFilterById","subscriptDescription","subscriptLinkClass","subscriptLinkValue","onClickSubscriptCall","handlerRemoveCustomFilter","children","dataFetchedCallback","handlerSaveCustomFilter","substring","attr","parentId","parentIdx","parent","_children","beforeCreate","$props","AbgabeMitarbeiterDetail","SpeedDial","speeddial","isFullscreen","assistenzMode","showAutomagicModalPhrase","speedDialItems","command","openCreateNewAbgabeModal","getAllowedToCreateNewTermin","openBenotung","openPlagiatcheck","openStudentPage","newTermin","getPlaceholderTermin","saveTermin","invertedFixtermin","newTerminRes","allowedToSave","allowedToDelete","existingTerminRes","abgabeOpt","noteOptExisting","findIndex","savedNewWithNegative","savedExistingNoteAsNegativeAndWasNotNegativeBefore","modalContainerCreateNewAbgabe","openZusatzdatenModal","modalContainerZusatzdaten","saveZusatzdaten","validateZusatzdaten","paRes","handleDeleteTermin","deleteTermin","deletedTerminIndex","convertDateToIsoString","param","openBeurteilungLink","getOptionLabelSprache","getOptionLabelAbgabetyp","getOptionDisabled","aktiv","getNotenOptionLabel","turnitin_link","getSemesterBenotbar","beurteilungLinkNew","beurteilungLinkOld","upload_allowed_default","validateTermin","handleSaveNewAbgabe","handleChangeAbgabetyp","notenOptionsNonFinal","getAllowedAbgabeTypeOptions","abgabetypenBetreuer","getEnduploadErlaubt","isCurrent","endUploadVorhanden","getSpeedDialStyle","getSpeedDialWrapperStyle","getTooltipNotAllowedToSave","getTooltipNotAllowedToDelete","getProjektarbeitTitel","getProjektarbeitStudent","student","AbgabetoolMitarbeiter","old_abgabe_beurteilung_link","tableData","detailIsFullscreen","saving","serienTermin","showAll","tabulatorUuid","domain","detailOffset","tableBuiltResolve","tableBuiltPromise","abgabeTableOptions","selectableCheck","selectionCheck","rowHeight","formatterParams","onRendered","getRow","stopPropagation","handleClick","cssText","titleFormatter","hozAlign","headerSort","selectHandler","titleFormatterParams","selectAllHandler","width","cssClass","widthGrow","pkzTextFormatter","maxWidth","abgabeTableEventHandlers","getColumn","undoSelection","sd","fsd","checked","d","isSelected","deselect","select","getTable","getRows","r","handleToggleFullscreenDetail","showDeadlines","toggleShowAll","abgabeTable","redraw","setSort","openAddSeriesModal","modalContainerAddSeries","addSeries","createInfoString","str","vorname","nachname","tableResolve","buildPKZ","matrikelnr","buildStg","pkz","beurteilung","beurteilungLink","projekttyp_kurzbz","callback","handleUuidDefined","calcMaxTableHeight","tableID","tableDataSet","getElementById","rect","getBoundingClientRect","visualViewport","top","setHeight","BsOffcanvas","offcanvas","scroll","placement","Offcanvas","ApiStudiensemester","getAllStudiensemesterAndAktOrNext","order","start","AbgabeterminStatusLegende","splitMailsHelper","mails","subject","alertPluginRef","phrasenPluginRef","maillist","mailto","subjectlength","firstrun","useBcc","ctrlKey","metaKey","splitposition","lastIndexOf","mailLink","href","AbgabetoolAssistenz","Timeline","timeline","TieredMenu","tieredmenu","stg_kz_prop","studiensemesterOptions","allSem","curSem","notenOptionFilter","inplaceToggle","headerFiltersRestored","filtersRestored","colLayoutRestored","sortRestored","stateRestored","timelineProjekt","selectedStudiengangOption","studiengaengeOptions","allConfigPromise","ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT","ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER","allowedNotenFilterOptions","renderVerticalBuffer","formAction","minWidth","abgabterminFormatter","persistenceID","sammelMailStudent","emails","uniqueRecipients","Set","originalEvent","sammelMailBetreuer","recipientList","betreuer_mail","zweitbetreuer_mail","checkQualityGateStatus","qgate1Termine","qgate2Termine","qgate1Status","qgate1StatusRank","qgate2Status","qgate2StatusRank","qgate","diffMs","getItemBezeichnung","getItemNote","notenOption","handleChangeAbgabetypSerientermin","semesterChanged","existing","getFilters","f","compVal","newFilter","setFilter","checkAbgabetermineProjektarbeit","toMillis","prevTermin","nextTermin","loadState","localStorage","getItem","saveState","state","getColumnLayout","getSorters","s","dir","headerFilters","setItem","handleTableBuilt","saved","setColumnLayout","hf","setTimeout","sortList","columnManager","findColumn","getOptionLabelStg","getOptionLabelStudiensemester","getNotenFilterOptionLabel","actionButtons","className","display","alignItems","justifyContent","createButton","titleKey","clickHandler","btn","aspectRatio","transform","innerHTML","stopImmediatePropagation","openTimeline","pids","newAbgaben","pid","deselectRow","mappedData","mapProjekteToTableData","projekte","note_bez","erstbetreuer","buildErstbetreuer","zweitbetreuer","buildZweitbetreuer","paabgabe","student_vorname","student_nachname","p","terminTypOpt","drawer","timelineFormatter","erstbetreuer_full_name","betreuer_vorname","betreuer_nachname","zweitbetreuer_full_name","emailItems","uniqueStudentEmailCount","uniqueBetreuerEmailCount","oldVal","requests","results","stgOpt","DeadlineOverview","person_uid_prop","fullName","deadlines","deadlineTableOptions","deadlineTableEventHandlers","pdfExportLink","loadDeadlines","dl","stud_titelpre","stud_vorname","stud_nachname","stud_titelpost","fixterminstring","deadlineTable","comp","student_uid_computed","stg_kz_computed","route","string","directive"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"Abgabetool.js","sources":["../../../../js/api/search.js","../../../../js/api/phrasen.js","../../../../js/api/navigation.js","../../../../js/api/filter.js","../../../../js/api/studstatus.js","../../../../js/api/profil.js","../../../../js/api/profilUpdate.js","../../../../js/api/lvPlan.js","../../../../js/api/stv.js","../../../../js/api/stv/verband.js","../../../../js/api/stv/students.js","../../../../js/api/stv/filter.js","../../../../js/api/stv/konto.js","../../../../js/api/stv/group.js","../../../../js/api/stv/kontakt.js","../../../../js/api/stv/prestudent.js","../../../../js/api/stv/status.js","../../../../js/api/stv/details.js","../../../../js/api/stv/exam.js","../../../../js/api/stv/abschlusspruefung.js","../../../../js/api/stv/grades.js","../../../../js/api/stv/mobility.js","../../../../js/api/stv/archiv.js","../../../../js/api/stv/documents.js","../../../../js/api/stv/exemptions.js","../../../../js/api/stv/jointstudies.js","../../../../js/api/stv/courselist.js","../../../../js/api/notiz.js","../../../../js/api/notiz/person.js","../../../../js/api/betriebsmittel.js","../../../../js/api/betriebsmittel/person.js","../../../../js/api/checkperson.js","../../../../js/api/ort.js","../../../../js/api/cms.js","../../../../js/api/lehre.js","../../../../js/api/addons.js","../../../../js/api/messages.js","../../../../js/api/messages/person.js","../../../../js/api/vorlagen.js","../../../../js/api/studium.js","../../../../js/api/fhcapifactory.js","../../../../js/api/dashboard.js","../../../../js/api/bookmark.js","../../../../js/api/ampeln.js","../../../../js/api/studiengang.js","../../../../js/api/menu.js","../../../../js/api/authinfo.js","../../../../js/api/language.js","../../../../js/plugin/OldFhcApi.js","../../../../js/RESTClient.js","../../../../js/plugins/FhcAlert.js","../../../../js/plugins/Api.js","../../../../js/api/factory/phrasen.js","../../../../js/plugins/Phrasen.js","../../../../js/components/Form/Upload/Dms.js","../../../../js/components/Form/Upload/Dms/Item.js","../../../../js/components/Bootstrap/Modal.js","../../../../js/api/factory/abgabe.js","../../../../js/components/Overlay/FhcOverlay.js","../../../../js/components/Cis/Abgabetool/AbgabeStudentDetail.js","../../../../js/components/Cis/Abgabetool/getDateStyleClass.js","../../../../js/components/Cis/Abgabetool/AbgabetoolStudent.js","../../../../js/components/Fetch.js","../../../../js/components/filter/Filter/Config.js","../../../../js/components/filter/Filter/Columns.js","../../../../js/components/filter/Table/Download.js","../../../../js/directives/collapseAutoClose.js","../../../../js/tabulator/layouts/fitDataStretchFrozen.js","../../../../js/api/factory/filter.js","../../../../js/components/filter/Filter.js","../../../../js/components/Cis/Abgabetool/AbgabeMitarbeiterDetail.js","../../../../js/tabulator/filters/Dates.js","../../../../js/helpers/EmailHelpers.js","../../../../js/components/Cis/Abgabetool/AbgabetoolMitarbeiter.js","../../../../js/components/Bootstrap/Offcanvas.js","../../../../js/api/factory/studiensemester.js","../../../../js/components/Cis/Abgabetool/StatusLegende.js","../../../../js/components/Cis/Abgabetool/AbgabetoolAssistenz.js","../../../../js/components/Cis/Abgabetool/DeadlineOverview.js","../../../../js/apps/Abgabetool/Abgabetool.js","../../../../js/helpers/StringHelpers.js"],"sourcesContent":["/**\n * Copyright (C) 2024 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tsearch(searchsettings, config) {\n\t\tconst url = '/api/frontend/v1/searchbar/search';\n\t\treturn this.$fhcApi.post(url, searchsettings, config);\n\t},\n\tsearchAdvanced(searchsettings, config) {\n\t\tconst url = '/api/frontend/v1/searchbar/searchAdvanced';\n\t\treturn this.$fhcApi.post(url, searchsettings, config);\n\t},\n\tsearchdummy(searchsettings) {\n\t\tconst url = 'public/js/apps/api/dummyapi.php/Search';\n\t\treturn this.$fhcApi.post(url, searchsettings);\n\t}\n};\n","/**\n * Copyright (C) 2024 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tloadCategory(category) {\n\t\treturn this.$fhcApi.get('/api/frontend/v1/phrasen/loadModule/' + category);\n\t},\n\tsetLanguage(categories,language) {\n\t\tconst payload = {categories, language}\n\t\treturn this.$fhcApi.post('/api/frontend/v1/phrasen/setLanguage', payload);\n\t},\n\tgetLanguage() {\n\t\treturn this.$fhcApi.get('/api/frontend/v1/phrasen/getLanguage', {});\n\t},\n\tgetActiveDbLanguages() {\n\t\treturn this.$fhcApi.get('/api/frontend/v1/phrasen/getAllLanguages', {});\n\t}\n};","/**\n * Copyright (C) 2024 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tgetHeader(navigation_page) {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/api/frontend/v1/navigation/header',\n\t\t\t{ navigation_page }\n\t\t);\n\t},\n\tgetMenu: function(navigation_page) {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/api/frontend/v1/navigation/menu',\n\t\t\t{ navigation_page }\n\t\t);\n\t}\n};\n\n","/**\n * Copyright (C) 2024 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tsaveCustomFilter(wsParams) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'/api/frontend/v1/filter/saveCustomFilter',\n\t\t\t{\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tcustomFilterName: wsParams.customFilterName\n\t\t\t}\n\t\t);\n\t},\n\tremoveCustomFilter(wsParams) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'/api/frontend/v1/filter/removeCustomFilter',\n\t\t\t{\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterId: wsParams.filterId\n\t\t\t}\n\t\t);\n\t},\n\tapplyFilterFields(wsParams) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'/api/frontend/v1/filter/applyFilterFields',\n\t\t\t{\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterFields: wsParams.filterFields\n\t\t\t}\n\t\t);\n\t},\n\taddFilterField(wsParams) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'/api/frontend/v1/filter/addFilterField',\n\t\t\t{\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterField: wsParams.filterField\n\t\t\t}\n\t\t);\n\t},\n\tremoveFilterField(wsParams) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'/api/frontend/v1/filter/removeFilterField',\n\t\t\t{\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterField: wsParams.filterField\n\t\t\t}\n\t\t);\n\t},\n\tgetFilterById(wsParams) {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/api/frontend/v1/filter/getFilter',\n\t\t\t{\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterId: wsParams.filterId\n\t\t\t}\n\t\t);\n\t},\n\tgetFilter(wsParams) {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/api/frontend/v1/filter/getFilter',\n\t\t\t{\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType\n\t\t\t}\n\t\t);\n\t}\n};\n\n","/**\n * Copyright (C) 2024 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tabmeldung: {\n\t\tgetDetails(antrag_id, prestudent_id) {\n\t\t\tconst url = '/api/frontend/v1/studstatus/abmeldung/'\n\t\t\t\t+ (antrag_id !== undefined ? 'getDetailsForAntrag/' + antrag_id : 'getDetailsForNewAntrag/' + prestudent_id);\n\t\t\treturn this.$fhcApi.get(url);\n\t\t},\n\t\tcreate(stdsem, prestudent_id, grund) {\n\t\t\treturn this.$fhcApi.post('/api/frontend/v1/studstatus/abmeldung/createAntrag', {\n\t\t\t\tstudiensemester: stdsem,\n\t\t\t\tprestudent_id,\n\t\t\t\tgrund\n\t\t\t}, {\n\t\t\t\terrorHandling: 'strict'\n\t\t\t});\n\t\t},\n\t\tcancel(antrag_id) {\n\t\t\tif (!Array.isArray(antrag_id))\n\t\t\t\treturn this.$fhcApi.post(\n\t\t\t\t\t'/api/frontend/v1/studstatus/abmeldung/cancelAntrag',\n\t\t\t\t\t{ antrag_id }\n\t\t\t\t);\n\t\t\treturn Promise.allSettled(antrag_id.map(antrag => this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/abmeldung/cancelAntrag',\n\t\t\t\t{ antrag_id: antrag.studierendenantrag_id },\n\t\t\t\t{ errorHeader: '#' + antrag.studierendenantrag_id }\n\t\t\t)));\n\t\t}\n\t},\n\tunterbrechung: {\n\t\tgetDetails(antrag_id, prestudent_id) {\n\t\t\tconst url = '/api/frontend/v1/studstatus/unterbrechung/'\n\t\t\t\t+ (antrag_id !== undefined ? 'getDetailsForAntrag/' + antrag_id : 'getDetailsForNewAntrag/' + prestudent_id);\n\t\t\treturn this.$fhcApi.get(url);\n\t\t},\n\t\tcreate(studiensemester, prestudent_id, grund, datum_wiedereinstieg, attachment) {\n\t\t\treturn this.$fhcApi.post('/api/frontend/v1/studstatus/unterbrechung/createAntrag', {\n\t\t\t\tstudiensemester,\n\t\t\t\tprestudent_id,\n\t\t\t\tgrund,\n\t\t\t\tdatum_wiedereinstieg,\n\t\t\t\tattachment\n\t\t\t}, {\n\t\t\t\terrorHandling: 'strict'\n\t\t\t});\n\t\t},\n\t\tcancel(antrag_id) {\n\t\t\treturn this.$fhcApi.post('/api/frontend/v1/studstatus/unterbrechung/cancelAntrag', {\n\t\t\t\tantrag_id\n\t\t\t}, {\n\t\t\t\terrorHandling: 'strict'\n\t\t\t});\n\t\t}\n\t},\n\twiederholung: {\n\t\tgetDetails(prestudent_id) {\n\t\t\tconst url = '/api/frontend/v1/studstatus/wiederholung/getDetailsForNewAntrag/' + prestudent_id;\n\t\t\treturn this.$fhcApi.get(url)\n\t\t},\n\t\tgetLvs(antrag_id) {\n\t\t\tconst url = '/api/frontend/v1/studstatus/wiederholung/getLvs/' + antrag_id;\n\t\t\treturn this.$fhcApi.get(url)\n\t\t},\n\t\tcreate(prestudent_id, studiensemester) {\n\t\t\treturn this.$fhcApi.post('/api/frontend/v1/studstatus/wiederholung/createAntrag', {\n\t\t\t\tprestudent_id,\n\t\t\t\tstudiensemester\n\t\t\t}, {\n\t\t\t\terrorHandling: 'strict'\n\t\t\t});\n\t\t},\n\t\tcancel(prestudent_id, studiensemester) {\n\t\t\treturn this.$fhcApi.post('/api/frontend/v1/studstatus/wiederholung/cancelAntrag', {\n\t\t\t\tprestudent_id,\n\t\t\t\tstudiensemester\n\t\t\t}, {\n\t\t\t\terrorHandling: 'strict'\n\t\t\t});\n\t\t},\n\t\tsaveLvs(forbiddenLvs, mandatoryLvs) {\n\t\t\treturn this.$fhcApi.post('/api/frontend/v1/studstatus/wiederholung/saveLvs', {\n\t\t\t\tforbiddenLvs,\n\t\t\t\tmandatoryLvs\n\t\t\t});\n\t\t}\n\t},\n\tleitung: {\n\t\tgetStgs() {\n\t\t\treturn this.$fhcApi.get('/api/frontend/v1/studstatus/leitung/getActiveStgs');\n\t\t},\n\t\tgetAntraege(url, config, params) {\n\t\t\treturn this.$fhcApi\n\t\t\t\t.get('/api/frontend/v1/studstatus/leitung/getAntraege/' + url)\n\t\t\t\t.then(res => res.data); // Return data for tabulator\n\t\t},\n\t\tgetHistory(antrag_id) {\n\t\t\treturn this.$fhcApi.get('/api/frontend/v1/studstatus/leitung/getHistory/' + antrag_id)\n\t\t},\n\t\tgetPrestudents(query, signal) {\n\t\t\treturn this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/leitung/getPrestudents',\n\t\t\t\t{ query },\n\t\t\t\t{\n signal: signal,\n timeout: 30000\n }\n\t\t\t);\n\t\t},\n\t\tapprove(antrag) {\n\t\t\tif (!Array.isArray(antrag))\n\t\t\t\treturn this.$fhcApi.post(\n\t\t\t\t\t'/api/frontend/v1/studstatus/leitung/approveAntrag',\n\t\t\t\t\tantrag\n\t\t\t\t);\n\t\t\treturn Promise.allSettled(antrag.map(a => this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/leitung/approveAntrag',\n\t\t\t\ta,\n\t\t\t\t{ errorHeader: '#' + a.studierendenantrag_id }\n\t\t\t)));\n\t\t},\n\t\treject(antrag) {\n\t\t\tif (!Array.isArray(antrag))\n\t\t\t\treturn this.$fhcApi.post(\n\t\t\t\t\t'/api/frontend/v1/studstatus/leitung/rejectAntrag',\n\t\t\t\t\tantrag\n\t\t\t\t);\n\t\t\treturn Promise.allSettled(antrag.map(a => this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/leitung/rejectAntrag',\n\t\t\t\ta,\n\t\t\t\t{ errorHeader: '#' + a.studierendenantrag_id }\n\t\t\t)));\n\t\t},\n\t\treopen(antrag) {\n\t\t\tif (!Array.isArray(antrag))\n\t\t\t\treturn this.$fhcApi.post(\n\t\t\t\t\t'/api/frontend/v1/studstatus/leitung/reopenAntrag',\n\t\t\t\t\tantrag\n\t\t\t\t);\n\t\t\treturn Promise.allSettled(antrag.map(a => this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/leitung/reopenAntrag',\n\t\t\t\ta,\n\t\t\t\t{ errorHeader: '#' + a.studierendenantrag_id }\n\t\t\t)));\n\t\t},\n\t\tpause(antrag) {\n\t\t\tif (!Array.isArray(antrag))\n\t\t\t\treturn this.$fhcApi.post(\n\t\t\t\t\t'/api/frontend/v1/studstatus/leitung/pauseAntrag',\n\t\t\t\t\tantrag\n\t\t\t\t);\n\t\t\treturn Promise.allSettled(antrag.map(a => this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/leitung/pauseAntrag',\n\t\t\t\ta,\n\t\t\t\t{ errorHeader: '#' + a.studierendenantrag_id }\n\t\t\t)));\n\t\t},\n\t\tunpause(antrag) {\n\t\t\tif (!Array.isArray(antrag))\n\t\t\t\treturn this.$fhcApi.post(\n\t\t\t\t\t'/api/frontend/v1/studstatus/leitung/unpauseAntrag',\n\t\t\t\t\tantrag\n\t\t\t\t);\n\t\t\treturn Promise.allSettled(antrag.map(a => this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/leitung/unpauseAntrag',\n\t\t\t\ta,\n\t\t\t\t{ errorHeader: '#' + a.studierendenantrag_id }\n\t\t\t)));\n\t\t},\n\t\tobject(antrag) {\n\t\t\tif (!Array.isArray(antrag))\n\t\t\t\treturn this.$fhcApi.post(\n\t\t\t\t\t'/api/frontend/v1/studstatus/leitung/objectAntrag',\n\t\t\t\t\tantrag\n\t\t\t\t);\n\t\t\treturn Promise.allSettled(antrag.map(a => this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/leitung/objectAntrag',\n\t\t\t\ta,\n\t\t\t\t{ errorHeader: '#' + a.studierendenantrag_id }\n\t\t\t)));\n\t\t},\n\t\tapproveObjection(antrag) {\n\t\t\tif (!Array.isArray(antrag))\n\t\t\t\treturn this.$fhcApi.post(\n\t\t\t\t\t'/api/frontend/v1/studstatus/leitung/approveObjection',\n\t\t\t\t\tantrag\n\t\t\t\t);\n\t\t\treturn Promise.allSettled(antrag.map(a => this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/leitung/approveObjection',\n\t\t\t\ta,\n\t\t\t\t{ errorHeader: '#' + a.studierendenantrag_id }\n\t\t\t)));\n\t\t},\n\t\tdenyObjection(antrag) {\n\t\t\tif (!Array.isArray(antrag))\n\t\t\t\treturn this.$fhcApi.post(\n\t\t\t\t\t'/api/frontend/v1/studstatus/leitung/denyObjection',\n\t\t\t\t\tantrag\n\t\t\t\t);\n\t\t\treturn Promise.allSettled(antrag.map(a => this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/leitung/denyObjection',\n\t\t\t\ta,\n\t\t\t\t{ errorHeader: '#' + a.studierendenantrag_id }\n\t\t\t)));\n\t\t}\n\t}\n};","export default {\n\n getView: function (uid) {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root + \n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/Profil/getView/${uid}`,{}\n );\n },\n\n fotoSperre: function (value) {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root + \n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/Profil/fotoSperre/${value}`,\n {}\n );\n \n },\n\n isStudent: function (uid) {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root + \n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/Profil/isStudent`,\n {\n uid:uid,\n }\n );\n },\n\n isMitarbeiter: function (uid) {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root + \n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/Profil/isMitarbeiter/${uid}`,\n {}\n );\n },\n\n getZustellAdresse: function () {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root + \n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/Profil/getZustellAdresse`,{}\n );\n },\n\n getZustellKontakt: function () {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root + \n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/Profil/getZustellKontakt`,{}\n );\n },\n\n getGemeinden: function(nation,zip){\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root + \n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/Profil/getGemeinden/${nation}/${zip}`,\n {}\n );\n \n },\n getAllNationen:function(){\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root + \n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n \"/api/frontend/v1/Profil/getAllNationen\",{}\n );\n },\n}","export default {\n //! API calls for profil update requests\n \n getStatus: function () {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/ProfilUpdate/getStatus`,{});\n },\n \n getTopic: function () {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/ProfilUpdate/getTopic`,{});\n },\n \n acceptProfilRequest: function ({profil_update_id, uid, status_message, topic, requested_change}) {\n\n return this.$fhcApi.post(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n \"/api/frontend/v1/ProfilUpdate/acceptProfilRequest\",{profil_update_id, uid, status_message, topic, requested_change});\n },\n \n denyProfilRequest: function ({profil_update_id, uid, topic, status_message}) {\n return this.$fhcApi.post(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n \"/api/frontend/v1/ProfilUpdate/denyProfilRequest\",{profil_update_id,uid,topic,status_message});\n },\n \n insertFile: function (dms, replace = null) {\n\n return this.$fhcApi.post(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/ProfilUpdate/insertFile/${replace}`,\n dms);\n\n },\n \n getProfilRequestFiles: function (requestID) {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/ProfilUpdate/getProfilRequestFiles/${requestID}`,{});\n },\n \n selectProfilRequest: function (uid = null, id = null) {\n\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/ProfilUpdate/selectProfilRequest`,\n {...(uid?{uid}:{}),\n ...(id?{id}:{})\n });\n },\n \n insertProfilRequest: function (topic, payload, fileID = null) {\n\n return this.$fhcApi.post(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n \"/api/frontend/v1/ProfilUpdate/insertProfilRequest\",\n {\n topic,\n payload,\n ...(fileID ? { fileID } : {}),\n });\n },\n \n updateProfilRequest: function (topic, payload, ID, fileID = null) {\n\n return this.$fhcApi.post(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/ProfilUpdate/updateProfilRequest`,\n {\n topic,\n payload,\n ID,\n ...(fileID ? { fileID: fileID } : {}),\n });\n },\n \n deleteProfilRequest: function (requestID) {\n\n return this.$fhcApi.post(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/ProfilUpdate/deleteProfilRequest`,\n {\n requestID,\n });\n },\n };\n ","\nexport default {\n\tgetRoomInfo(ort_kurzbz, start_date, end_date) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'/api/frontend/v1/LvPlan/getRoomplan',\n\t\t\t{ ort_kurzbz, start_date, end_date}\n\t\t);\n\t},\n\tgetStunden() {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/api/frontend/v1/LvPlan/Stunden',\n\t\t\t{}\n\t\t);\n\t},\n\tgetOrtReservierungen(ort_kurzbz, start_date, end_date) {\n\t\treturn this.$fhcApi.post(\n\t\t\t`/api/frontend/v1/LvPlan/getReservierungen/${ort_kurzbz}`,\n\t\t\t{ start_date, end_date}\n\t\t);\n\t},\n\tgetLvPlanReservierungen(start_date, end_date) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'/api/frontend/v1/LvPlan/getReservierungen',\n\t\t\t{ start_date, end_date }\n\t\t);\n\t},\n\tgetLehreinheitStudiensemester(lehreinheit_id) {\n\t\treturn this.$fhcApi.get(\n\t\t\t`/api/frontend/v1/LvPlan/getLehreinheitStudiensemester/${lehreinheit_id}`,\n\t\t\t{}\n\t\t);\n\t},\n\tstudiensemesterDateInterval(date) {\n\t\treturn this.$fhcApi.get(\n\t\t\t`/api/frontend/v1/LvPlan/studiensemesterDateInterval/${date}`,\n\t\t\t{}\n\t\t);\n\t},\n\tLvPlanEvents(start_date, end_date, lv_id) {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/api/frontend/v1/LvPlan/LvPlanEvents',\n\t\t\t{ start_date, end_date, lv_id }\n\t\t);\n\t},\n\t\n\t\n};","import verband from './stv/verband.js';\nimport students from './stv/students.js';\nimport filter from './stv/filter.js';\nimport konto from './stv/konto.js';\nimport group from './stv/group.js';\nimport kontakt from './stv/kontakt.js';\nimport prestudent from './stv/prestudent.js';\nimport status from './stv/status.js';\nimport details from './stv/details.js';\nimport exam from './stv/exam.js';\nimport abschlusspruefung from './stv/abschlusspruefung.js';\nimport grades from './stv/grades.js';\nimport mobility from './stv/mobility.js';\nimport archiv from './stv/archiv.js';\nimport documents from './stv/documents.js';\nimport exemptions from './stv/exemptions.js';\nimport jointstudies from \"./stv/jointstudies.js\";\nimport courselist from './stv/courselist.js';\n\nexport default {\n\tverband,\n\tstudents,\n\tfilter,\n\tkonto,\n\tgroup,\n\tkontakt,\n\tprestudent,\n\tstatus,\n\tdetails,\n\texam,\n\tabschlusspruefung,\n\tgrades,\n\tmobility,\n\tarchiv,\n\tdocuments,\n\texemptions,\n\tjointstudies,\n\tcourselist,\n\tconfigStudent() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/config/student');\n\t},\n\tconfigStudents() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/config/students');\n\t}\n};\n","export default {\n\tget() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/verband');\n\t},\n\tfavorites: {\n\t\tget() {\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/stv/favorites');\n\t\t},\n\t\tset(favorites) {\n\t\t\treturn this.$fhcApi.post('api/frontend/v1/stv/favorites/set', {\n\t\t\t\tfavorites\n\t\t\t});\n\t\t}\n\t}\n}","export default {\n\tuid(uid, studiensemester_kurzbz) {\n\t\tlet url = 'api/frontend/v1/stv/students/'\n\t\t\t+ encodeURIComponent(studiensemester_kurzbz)\n\t\t\t+ '/uid/'\n\t\t\t+ encodeURIComponent(uid);\n\t\treturn this.$fhcApi.getUri(url);\n\t},\n\tprestudent(prestudent_id, studiensemester_kurzbz) {\n\t\tlet url = 'api/frontend/v1/stv/students/'\n\t\t\t+ encodeURIComponent(studiensemester_kurzbz)\n\t\t\t+ '/prestudent/'\n\t\t\t+ encodeURIComponent(prestudent_id);\n\t\treturn this.$fhcApi.getUri(url);\n\t},\n\tperson(person_id, studiensemester_kurzbz) {\n\t\tlet url = 'api/frontend/v1/stv/students/'\n\t\t\t+ encodeURIComponent(studiensemester_kurzbz)\n\t\t\t+ '/person/'\n\t\t\t+ encodeURIComponent(person_id);\n\t\treturn this.$fhcApi.getUri(url);\n\t},\n\tverband(relative_path) {\n\t\treturn this.$fhcApi.getUri('api/frontend/v1/stv/students/' + relative_path);\n\t}\n}","export default {\n\tgetStg() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/filter/getStg');\n\t},\n\tsetStg(studiengang_kz) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/filter/setStg', {\n\t\t\tstudiengang_kz\n\t\t});\n\t}\n};","export default {\n\ttabulatorConfig(config, self) {\n\t\tconfig.ajaxURL = 'api/frontend/v1/stv/konto/get';\n\t\tconfig.ajaxParams = () => {\n\t\t\tconst params = {\n\t\t\t\tperson_id: self.modelValue.person_id || self.modelValue.map(e => e.person_id),\n\t\t\t\tonly_open: self.filter,\n\t\t\t\tstudiengang_kz: self.studiengang_kz_intern ? self.stg_kz : ''\n\t\t\t};\n\t\t\treturn params;\n\t\t};\n\t\tconfig.ajaxRequestFunc = (url, config, params) => this.$fhcApi.post(url, params, config);\n\t\tconfig.ajaxResponse = (url, params, response) => response.data;\n\n\t\treturn config;\n\t},\n\tcheckDoubles(form, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/konto/checkDoubles', data, {\n\t\t\tconfirmErrorHandler: error => true\n\t\t});\n\t},\n\tinsert(form, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/konto/insert', data);\n\t},\n\tcounter(data) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/konto/counter', data);\n\t},\n\tedit(form, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/konto/update', data);\n\t},\n\tdelete(buchungsnr) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/konto/delete', {buchungsnr});\n\t},\n\tgetBuchungstypen() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/konto/getBuchungstypen');\n\t}\n};","export default {\n\tgetGruppen(url, config, params) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/Gruppen/getGruppen/' + params.id);\n\t},\n\tdeleteGroup(params) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/Gruppen/deleteGruppe/', params);\n\t}\n}","export default {\n\t//------------- address.js-----------\n\tgetAdressen (url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/kontakt/getAdressen/' + params.id);\n\t},\n\taddNewAddress(form, id, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/kontakt/addNewAddress/' + id,\n\t\t\tdata\n\t\t);\n\t},\n\tloadAddress(address_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/kontakt/loadAddress/', {address_id});\n\t},\n\tupdateAddress(form, address_id, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/kontakt/updateAddress/' + address_id,\n\t\t\tdata\n\t\t);\n\t},\n\tdeleteAddress(address_id) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/kontakt/deleteAddress/', {address_id});\n\t},\n\tgetPlaces(plz) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/address/getPlaces/' + plz);\n\t},\n\tgetFirmen(searchString) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/kontakt/getFirmen/' + searchString);\n\t},\n\tgetNations() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/address/getNations/');\n\t},\n\tgetAdressentypen() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/kontakt/getAdressentypen/');\n\t},\n\n\t//------------- bankverbindung.js-----------\n\tgetBankverbindung (url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/kontakt/getBankverbindung/' + params.id);\n\t},\n\taddNewBankverbindung(form, id, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/kontakt/addNewBankverbindung/' + id,\n\t\t\tdata\n\t\t);\n\t},\n\tloadBankverbindung(bankverbindung_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/kontakt/loadBankverbindung/', {bankverbindung_id});\n\t},\n\tupdateBankverbindung(form, bankverbindung_id, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/kontakt/updateBankverbindung/' + bankverbindung_id,\n\t\t\tdata\n\t\t);\n\t},\n\tdeleteBankverbindung(bankverbindung_id) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/kontakt/deleteBankverbindung/', {bankverbindung_id});\n\t},\n\n\t//------------- contact.js-----------\n\tgetKontakte (url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/kontakt/getKontakte/' + params.id);\n\t},\n\taddNewContact(form, id, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/kontakt/addNewContact/' + id,\n\t\t\tdata\n\t\t);\n\t},\n\tloadContact(kontakt_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/kontakt/loadContact/', {kontakt_id});\n\t},\n\tupdateContact(form, kontakt_id, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/kontakt/updateContact/' + kontakt_id,\n\t\t\tdata\n\t\t);\n\t},\n\tdeleteContact(kontakt_id) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/kontakt/deleteContact/', {kontakt_id});\n\t},\n\tgetStandorteByFirma(searchString){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/kontakt/getStandorteByFirma/' + searchString);\n\t},\n\tgetKontakttypen(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/kontakt/getKontakttypen/');\n\t}\n};","export default {\n\n//------------- Prestudent.js------------------------------------------------------\n\n\tget(prestudent_id, studiensemester_kurzbz) {\n\t\treturn \tthis.$fhcApi.post(\n\t\t\t'api/frontend/v1/stv/prestudent/get/'\n\t\t\t+ encodeURIComponent(prestudent_id)\n\t\t\t+ '/'\n\t\t\t+ encodeURIComponent(studiensemester_kurzbz)\n\t\t\t);\n\t},\n\tupdatePrestudent(form, prestudent_id, data){\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/prestudent/updatePrestudent/' + prestudent_id,\n\t\t\tdata\n\t\t);\n\t},\n\tgetBezeichnungZGV() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getBezeichnungZGV/');\n\t},\n\tgetBezeichnungMZgv() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getBezeichnungMZgv/');\n\t},\n\tgetBezeichnungDZgv() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getBezeichnungDZgv/');\n\t},\n\tgetStgs() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/lists/getStgs/');\n\t},\n\tgetAusbildung() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getAusbildung/');\n\t},\n\tgetAufmerksamdurch() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getAufmerksamdurch/');\n\t},\n\tgetBerufstaetigkeit() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getBerufstaetigkeit/');\n\t},\n\tgetTypenStg() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getTypenStg/');\n\t},\n\tgetBisstandort() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getBisstandort/');\n\t},\n\n//------------- MultiStatus.js------------------------------------------------------\n\tgetHistoryPrestudent (url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/status/getHistoryPrestudent/' + params.id);\n\t},\n\tgetMaxSem(studiengang_kzs) {\n\t\treturn \tthis.$fhcApi.post('api/frontend/v1/stv/status/getMaxSemester/', {studiengang_kzs});\n\t},\n\tadvanceStatus({prestudent_id, status_kurzbz, studiensemester_kurzbz, ausbildungssemester}) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/status/advanceStatus/'\n\t\t\t+ prestudent_id + '/'\n\t\t\t+ status_kurzbz + '/'\n\t\t\t+ studiensemester_kurzbz + '/'\n\t\t\t+ ausbildungssemester\n\t\t);\n\t},\n\tconfirmStatus({prestudent_id, status_kurzbz, studiensemester_kurzbz, ausbildungssemester}) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/status/confirmStatus/'\n\t\t\t+ prestudent_id + '/'\n\t\t\t+ status_kurzbz + '/'\n\t\t\t+ studiensemester_kurzbz + '/'\n\t\t\t+ ausbildungssemester\n\t\t);\n\t},\n\tisLastStatus(id) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/status/isLastStatus/' + id);\n\t},\n\tdeleteStatus({prestudent_id, status_kurzbz, studiensemester_kurzbz, ausbildungssemester}) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/status/deleteStatus/'\n\t\t\t+ prestudent_id + '/'\n\t\t\t+ status_kurzbz + '/'\n\t\t\t+ studiensemester_kurzbz + '/'\n\t\t\t+ ausbildungssemester\n\t\t);\n\t},\n\tgetLastBismeldestichtag() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/status/getLastBismeldestichtag/');\n\t},\n\n//------------- History.js------------------------------------------------------\n\tgetHistoryPrestudents (url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getHistoryPrestudents/' + params.id);\n\t},\n\n}","export default {\n\n//------------- Modal.js------------------------------------------------------\n\n\tinsertStatus(form, id, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/status/insertStatus/' + id,\n\t\t\tdata\n\t\t);\n\t},\n\tloadStatus({prestudent_id, status_kurzbz, studiensemester_kurzbz, ausbildungssemester}) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'api/frontend/v1/stv/status/loadStatus/'\n\t\t\t+ prestudent_id + '/'\n\t\t\t+ status_kurzbz + '/'\n\t\t\t+ studiensemester_kurzbz + '/'\n\t\t\t+ ausbildungssemester\n\t\t);\n\t},\n\tupdateStatus(form, {prestudent_id, status_kurzbz, studiensemester_kurzbz, ausbildungssemester}, data) {\n\t\treturn this.$fhcApi.post(\n\t\t\tform,\n\t\t\t'api/frontend/v1/stv/status/updateStatus/'\n\t\t\t+ prestudent_id + '/'\n\t\t\t+ status_kurzbz + '/'\n\t\t\t+ studiensemester_kurzbz + '/'\n\t\t\t+ ausbildungssemester,\n\t\t\tdata\n\t\t);\n\t},\n\tgetStudienplaene(prestudent_id) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getStudienplaene/' + prestudent_id);\n\t},\n\tgetStudiengang(prestudent_id) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getStudiengang/' + prestudent_id);\n\t},\n\tgetStatusgruende() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/status/getStatusgruende/');\n\t},\n\tgetStati() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/lists/getStati/');\n\t},\n\n//------------- Dropdown.js------------------------------------------------------\n\n\taddStudent(id, data) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/status/addStudent/' + id,\n\t\t\tdata,\n\t\t\t{errorHeader: id}\n\t\t);\n\t},\n\tchangeStatus(id, data) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/status/changeStatus/' + id,\n\t\t\tdata,\n\t\t\t{errorHeader: id}\n\t\t);\n\t},\n\tgetStatusarray() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/status/getStatusarray/');\n\t}\n}","export default {\n\tget(prestudent_id, studiensemester_kurzbz) {\n\t\tlet url = 'api/frontend/v1/stv/student/get/'\n\t\t\t+ encodeURIComponent(prestudent_id)\n\t\t\t+ '/'\n\t\t\t+ encodeURIComponent(studiensemester_kurzbz);\n\t\treturn this.$fhcApi.post(url);\n\t},\n\tsave(form, prestudent_id, studiensemester_kurzbz, data) {\n\t\tlet url = 'api/frontend/v1/stv/student/save/'\n\t\t\t+ encodeURIComponent(prestudent_id)\n\t\t\t+ '/'\n\t\t\t+ encodeURIComponent(studiensemester_kurzbz);\n\t\treturn this.$fhcApi.post(form, url, data);\n\t},\n}\n","export default {\n\tgetPruefungen(url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/pruefung/getPruefungen/' + params.id);\n\t},\n\tloadPruefung(pruefung_id){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/pruefung/loadPruefung/' + pruefung_id);\n\t},\n\tgetTypenPruefungen(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/pruefung/getTypenPruefungen');\n\t},\n\tgetAllLehreinheiten(data){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/pruefung/getAllLehreinheiten/', data)\n\t},\n\tgetLvsByStudent(uid){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/pruefung/getLvsByStudent/' + uid)\n\t},\n\tgetLvsandLesByStudent(uid, semester){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/pruefung/getLvsandLesByStudent/' + uid + '/' + semester);\n\t},\n\tgetLvsAndMas(uid){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/pruefung/getLvsAndMas/' + uid)\n\t},\n\tgetMitarbeiterLv(id){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/pruefung/getMitarbeiterLv/' + id)\n\t},\n\tgetNoten(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/pruefung/getNoten');\n\t},\n\tcheckZeugnisnoteLv(data){\n\t\treturn \tthis.$fhcApi.post('api/frontend/v1/stv/pruefung/checkZeugnisnoteLv/', data)\n\t},\n\taddPruefung(form, data){\n\t\treturn this.$fhcApi.post(form,'api/frontend/v1/stv/pruefung/insertPruefung/', data);\n\t},\n\tupdatePruefung(form, id, data){\n\t\treturn this.$fhcApi.post(form,'api/frontend/v1/stv/pruefung/updatePruefung/' + id, data);\n\t},\n\tdeletePruefung(id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/pruefung/deletePruefung/' + id)\n\t}\n}","export default {\n\n\tgetAbschlusspruefung (url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/abschlusspruefung/getAbschlusspruefung/' + params.id);\n\t},\n\taddNewAbschlusspruefung(form, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/abschlusspruefung/insertAbschlusspruefung/', data\n\t\t);\n\t},\n\tloadAbschlusspruefung(id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/abschlusspruefung/loadAbschlusspruefung/', {id});\n\t},\n\tupdateAbschlusspruefung(form, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/abschlusspruefung/updateAbschlusspruefung/', data\n\t\t);\n\t},\n\tdeleteAbschlusspruefung(id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/abschlusspruefung/deleteAbschlusspruefung/', {id});\n\t},\n\tgetTypenAbschlusspruefung(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/abschlusspruefung/getTypenAbschlusspruefung/');\n\t},\n\tgetTypenAntritte(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/abschlusspruefung/getTypenAntritte/');\n\t},\n\tgetBeurteilungen(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/abschlusspruefung/getBeurteilungen/');\n\t},\n\tgetAkadGrade(studiengang_kz){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/abschlusspruefung/getAkadGrade/', {studiengang_kz});\n\t},\n\tgetTypStudiengang(studiengang_kz){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/abschlusspruefung/getTypStudiengang/', {studiengang_kz});\n\t},\n\tgetMitarbeiter(searchString){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/abschlusspruefung/getMitarbeiter/' + searchString);\n\t},\n\tgetPruefer(searchString){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/abschlusspruefung/getPruefer/' + searchString);\n\t},\n\tgetNoten(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/abschlusspruefung/getNoten/');\n\t},\n\tcheckForExistingExams(uids) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/abschlusspruefung/checkForExistingExams/', {uids}\n\t\t);\n\t}\n}","export default {\n\tlist() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/grades/list');\n\t},\n\tgetCertificate(prestudent_id, studiensemester_kurzbz) {\n\t\tlet url = 'api/frontend/v1/stv/grades/getCertificate/' + encodeURIComponent(prestudent_id);\n\t\tif (!!studiensemester_kurzbz) {\n\t\t\turl = url + '/' + encodeURIComponent(studiensemester_kurzbz);\n\t\t}\n\t\treturn this.$fhcApi.get(url);\n\t},\n\tgetTeacherProposal(prestudent_id, studiensemester_kurzbz) {\n\t\tlet url = 'api/frontend/v1/stv/grades/getTeacherProposal/' + encodeURIComponent(prestudent_id);\n\t\tif (!!studiensemester_kurzbz) {\n\t\t\turl = url + '/' + encodeURIComponent(studiensemester_kurzbz);\n\t\t}\n\t\treturn this.$fhcApi.get(url);\n\t},\n\tgetRepeaterGrades(prestudent_id, studiensemester_kurzbz) {\n\t\tlet url = 'api/frontend/v1/stv/grades/getRepeaterGrades/' + encodeURIComponent(prestudent_id);\n\t\tif (!!studiensemester_kurzbz) {\n\t\t\turl = url + '/' + encodeURIComponent(studiensemester_kurzbz);\n\t\t}\n\t\treturn this.$fhcApi.get(url);\n\t},\n\tupdateCertificate({lehrveranstaltung_id, student_uid, studiensemester_kurzbz, note, lehrveranstaltung_bezeichnung}) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'api/frontend/v1/stv/grades/updateCertificate',\n\t\t\t{\n\t\t\t\tlehrveranstaltung_id,\n\t\t\t\tstudent_uid,\n\t\t\t\tstudiensemester_kurzbz,\n\t\t\t\tnote\n\t\t\t},\n\t\t\t{\n\t\t\t\terrorHeader: lehrveranstaltung_bezeichnung\n\t\t\t}\n\t\t);\n\t},\n\tdeleteCertificate({lehrveranstaltung_id, student_uid, studiensemester_kurzbz, lehrveranstaltung_bezeichnung}) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'api/frontend/v1/stv/grades/deleteCertificate',\n\t\t\t{\n\t\t\t\tlehrveranstaltung_id,\n\t\t\t\tstudent_uid,\n\t\t\t\tstudiensemester_kurzbz\n\t\t\t},\n\t\t\t{\n\t\t\t\terrorHeader: lehrveranstaltung_bezeichnung\n\t\t\t}\n\t\t);\n\t},\n\tcopyTeacherProposalToCertificate({lehrveranstaltung_id, student_uid, studiensemester_kurzbz, lehrveranstaltung_bezeichnung}) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'api/frontend/v1/stv/grades/copyTeacherProposalToCertificate',\n\t\t\t{\n\t\t\t\tlehrveranstaltung_id,\n\t\t\t\tstudent_uid,\n\t\t\t\tstudiensemester_kurzbz\n\t\t\t},\n\t\t\t{\n\t\t\t\terrorHeader: lehrveranstaltung_bezeichnung\n\t\t\t}\n\t\t);\n\t},\n\tcopyRepeaterGradeToCertificate({studierendenantrag_lehrveranstaltung_id, lv_bezeichnung}) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'api/frontend/v1/stv/grades/copyRepeaterGradeToCertificate',\n\t\t\t{\n\t\t\t\tstudierendenantrag_lehrveranstaltung_id\n\t\t\t},\n\t\t\t{\n\t\t\t\terrorHeader: lv_bezeichnung\n\t\t\t}\n\t\t);\n\t},\n\tgetGradeFromPoints(points, lehrveranstaltung_id, studiensemester_kurzbz, manualErrorHandling) {\n\t\tconst config = manualErrorHandling ? {errorHandling: false} : {};\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/grades/getGradeFromPoints',\n\t\t\t{\n\t\t\t\t\"points\": points,\n\t\t\t\t\"lehrveranstaltung_id\": lehrveranstaltung_id,\n\t\t\t\t\"studiensemester_kurzbz\": studiensemester_kurzbz\n\t\t\t},\n\t\t\tconfig\n\t\t\t);\n\t}\n}","export default {\n\tgetMobilitaeten (url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/mobility/getMobilitaeten/' + params.id);\n\t},\n\tgetProgramsMobility(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/mobility/getProgramsMobility/');\n\t},\n\taddNewMobility(form, data){\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/mobility/insertMobility/', data);\n\t},\n\tloadMobility(bisio_id){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/mobility/loadMobility/' + bisio_id);\n\t},\n\tupdateMobility(form, data){\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/mobility/updateMobility/', data);\n\t},\n\tdeleteMobility(bisio_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/mobility/deleteMobility/' + bisio_id);\n\t},\n\tgetLVList(studiengang_kz){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/mobility/getLVList/' + studiengang_kz);\n\t},\n\tgetAllLehreinheiten(data){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/mobility/getAllLehreinheiten/', data)\n\t},\n\tgetLvsandLesByStudent(uid){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/mobility/getLvsandLesByStudent/' + uid);\n\t},\n\tgetPurposes(url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/mobility/getPurposes/' + params.id);\n\t},\n\tgetSupports(url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/mobility/getSupports/' + params.id);\n\t},\n\tgetListPurposes() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/mobility/getListPurposes/');\n\t},\n\tgetListSupports() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/mobility/getListSupports/');\n\t},\n\tdeleteMobilityPurpose(params) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/mobility/deleteMobilityPurpose/' + params.bisio_id, params);\n\t},\n\taddMobilityPurpose(params) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/mobility/addMobilityPurpose/' + params.bisio_id, params);\n\t},\n\tdeleteMobilitySupport(params) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/mobility/deleteMobilitySupport/' + params.bisio_id, params);\n\t},\n\taddMobilitySupport(params) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/mobility/addMobilitySupport/' + params.bisio_id, params);\n\t},\n\n}","export default {\n\ttabulatorConfig(config, self) {\n\t\tconfig.ajaxURL = 'api/frontend/v1/stv/archiv/get';\n\t\tconfig.ajaxParams = () => {\n\t\t\tconst params = {\n\t\t\t\tperson_id: self.modelValue.person_id || self.modelValue.map(e => e.person_id)\n\t\t\t};\n\t\t\treturn params;\n\t\t};\n\t\tconfig.ajaxRequestFunc = (url, config, params) => this.$fhcApi.post(url, params, config);\n\t\tconfig.ajaxResponse = (url, params, response) => response.data;\n\n\t\treturn config;\n\t},\n\tgetArchivVorlagen() {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/archiv/getArchivVorlagen');\n\t},\n\tarchive(data) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'api/frontend/v1/documents/archive',\n\t\t\tdata\n\t\t);\n\t},\n\tarchiveSigned(data) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'api/frontend/v1/documents/archiveSigned',\n\t\t\tdata\n\t\t);\n\t},\n\tupdate(data) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/archiv/update', data);\n\t},\n\tdelete({akte_id, studiengang_kz}) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/archiv/delete', {akte_id, studiengang_kz});\n\t}\n};\n","export default {\n\tgetDocumentsUnaccepted(url, config, params) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/dokumente/getDocumentsUnaccepted/' + params.id + '/' + params.studiengang_kz);\n\t},\n\tgetDocumentsAccepted(url, config, params) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/dokumente/getDocumentsAccepted/' + params.id + '/' + params.studiengang_kz);\n\t},\n\tdeleteZuordnung(params){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/dokumente/deleteZuordnung/' + params.prestudent_id + '/' + params.dokument_kurzbz);\n\t},\n\tcreateZuordnung(params){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/dokumente/createZuordnung/'\n\t\t\t+ params.prestudent_id + '/'\n\t\t\t+ params.dokument_kurzbz);\n\t},\n\tloadAkte(akte_id){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/dokumente/loadAkte/' + akte_id);\n\t},\n\tgetDoktypen(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/dokumente/getDoktypen/');\n\t},\n\tupdateFile(akte_id, data){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/dokumente/updateAkte/' + akte_id,\n\t\t\tdata);\n\t},\n\tdeleteFile(akte_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/dokumente/deleteAkte/' + akte_id);\n\t},\n\tuploadFile(prestudent_id, data){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/dokumente/uploadDokument/' + prestudent_id,\n\t\t\tdata);\n\t},\n}","export default {\n\tgetAnrechnungen(url, config, params) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/anrechnungen/getAnrechnungen/' + params.id);\n\t},\n\tgetLehrveranstaltungen(prestudent_id){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/anrechnungen/getLehrveranstaltungen/' + prestudent_id);\n\t},\n\tgetBegruendungen(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/anrechnungen/getBegruendungen/');\n\t},\n\tgetLvsKompatibel(lv_id){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/anrechnungen/getLvsKompatibel/' + lv_id);\n\t},\n\tgetLektoren(studiengang_kz){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/anrechnungen/getLektoren/' + studiengang_kz);\n\t},\n\taddNewAnrechnung(form, data){\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/anrechnungen/insertAnrechnung/', data);\n\t},\n\tloadAnrechnung(anrechnung_id){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/anrechnungen/loadAnrechnung/' + anrechnung_id);\n\t},\n\teditAnrechnung(form, data){\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/anrechnungen/updateAnrechnung/', data);\n\t},\n\tdeleteAnrechnung(anrechnung_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/anrechnungen/deleteAnrechnung/' + anrechnung_id);\n\t},\n}","export default {\n\tgetStudies(url, config, params) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/GemeinsameStudien/getStudien/' + params.id);\n\t},\n\tgetTypenMobility(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/GemeinsameStudien/getTypenMobility/');\n\t},\n\tgetStudiensemester(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/GemeinsameStudien/getStudiensemester/');\n\t},\n\tgetStudyprograms(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/GemeinsameStudien/getStudienprogramme/');\n\t},\n\tgetListPartner(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/GemeinsameStudien/getPartnerfirmen/');\n\t},\n\tgetStatiPrestudent(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/GemeinsameStudien/getStatiPrestudent/');\n\t},\n\tloadStudy(id){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/GemeinsameStudien/loadStudie/' + id);\n\t},\n\tinsertStudy(form, data){\n\t\treturn this.$fhcApi.post(form,'api/frontend/v1/stv/GemeinsameStudien/insertStudie/', data);\n\t},\n\tupdateStudy(form, data){\n\t\treturn this.$fhcApi.post(form,'api/frontend/v1/stv/GemeinsameStudien/updateStudie/', data);\n\t},\n\tdeleteStudy(id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/GemeinsameStudien/deleteStudie/' + id);\n\t},\n\n}","export default {\n\tgetCourselist(url, config, params) {\n\t\t//corresponding logic controller Stundenplan.php\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/LvTermine/getStundenplan/'\n\t\t\t+ params.student_uid + '/'\n\t\t\t+ params.start_date + '/'\n\t\t\t+ params.end_date + '/'\n\t\t\t+ params.group_consecutiveHours + '/'\n\t\t\t+ params.dbStundenplanTable\n\t\t);\n\t},\n\tgetStudiensemester(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/LvTermine/getStudiensemester/');\n\t},\n}","import person from \"./notiz/person.js\";\n\nexport default {\n\tperson\n}","export default {\n\tgetNotizen (url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/notiz/notizPerson/getNotizen/' + params.id + '/' + params.type);\n\t},\n\tgetUid(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/notiz/notizPerson/getUid/');\n\t},\n\taddNewNotiz(form, id, formData) {\n\t\treturn this.$fhcApi.post(form,'api/frontend/v1/notiz/notizPerson/addNewNotiz/' + id,\n\t\t\tformData\n\t\t);\n\t},\n\tloadNotiz(notiz_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/notiz/notizPerson/loadNotiz/', {\n\t\t\tnotiz_id\n\t\t});\n\t},\n\tloadDokumente(notiz_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/notiz/notizPerson/loadDokumente/', {\n\t\t\tnotiz_id\n\t\t});\n\t},\n\tdeleteNotiz(notiz_id, type_id, id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/notiz/notizPerson/deleteNotiz/', {\n\t\t\tnotiz_id,\n\t\t\ttype_id,\n\t\t\tid\n\t\t});\n\t},\n\tupdateNotiz(form, notiz_id, formData){\n\t\treturn this.$fhcApi.post(form,'api/frontend/v1/notiz/notizPerson/updateNotiz/' + notiz_id,\n\t\t\tformData\n\t\t);\n\t},\n\tgetMitarbeiter(event){\n\t\treturn this.$fhcApi.get('api/frontend/v1/notiz/notizPerson/getMitarbeiter/' + event);\n\t},\n\tisBerechtigt(id, type_id){\n\t\treturn this.$fhcApi.get('api/frontend/v1/notiz/notizPerson/isBerechtigt/');\n\t}\n}","import person from \"./betriebsmittel/person.js\";\n\nexport default {\n\tperson\n}","export default {\n\tgetAllBetriebsmittel(url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/betriebsmittel/betriebsmittelP/getAllBetriebsmittel/' + params.type + '/' + params.id);\n\t},\n\taddNewBetriebsmittel(form, person_id, formData) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/betriebsmittel/betriebsmittelP/addNewBetriebsmittel/' +\n\t\t\tperson_id, formData\n\t\t);\n\t},\n\tloadBetriebsmittel(betriebsmittelperson_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/betriebsmittel/betriebsmittelP/loadBetriebsmittel/' + betriebsmittelperson_id);\n\t},\n\tupdateBetriebsmittel(form, betriebsmittelperson_id, formData) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/betriebsmittel/betriebsmittelP/updateBetriebsmittel/' + betriebsmittelperson_id,\n\t\t\tformData);\n\t},\n\tdeleteBetriebsmittel(betriebsmittelperson_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/betriebsmittel/betriebsmittelP/deleteBetriebsmittel/' +\tbetriebsmittelperson_id);\n\t},\n\tgetTypenBetriebsmittel(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/betriebsmittel/betriebsmittelP/getTypenBetriebsmittel/');\n\t},\n\tloadInventarliste(query){\n\t\treturn this.$fhcApi.get('api/frontend/v1/betriebsmittel/betriebsmittelP/loadInventarliste/' +\tquery);\n\t}\n}","export default {\n\tupdatePersonUnrulyStatus(person_id, unrulyParam) {\n\n\t\ttry {\n\t\t\tconst payload = {person_id, unruly: unrulyParam}\n\t\t\tconst url = '/api/frontend/v1/checkperson/CheckPerson/updatePersonUnrulyStatus';\n\t\t\treturn this.$fhcApi.post(url, payload, null);\n\t\t} catch (error) {\n\t\t\tthrow error;\n\t\t}\n\n\t},\n\tfilterPerson(payload, base = ''){\n\n\t\ttry {\n\t\t\tconst url = base + '/api/frontend/v1/checkperson/CheckPerson/filterPerson';\n\t\t\treturn axios.post(url, payload)\n\t\t} catch (error) {\n\t\t\tthrow error;\n\t\t}\n\n\t}\n}","export default {\n getContentID(ort_kurbz) {\n\t\treturn this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n \"/api/frontend/v1/Ort/ContentID\",\n\t\t\t{ ort_kurzbz: ort_kurbz }\n\t\t);\n\t},\n\tgetRooms(datum, von, bis, typ, personenanzahl = 0) {\n\t\treturn this.$fhcApi.get(\n\t\t\tFHC_JS_DATA_STORAGE_OBJECT.app_root +\n\t\t\tFHC_JS_DATA_STORAGE_OBJECT.ci_router +\n\t\t\t\"/api/frontend/v1/Ort/getRooms\",\n\t\t\t{ datum, von, bis, typ, personenanzahl }\n\t\t);\n\t},\n\tgetRoomTypes() {\n\t\treturn this.$fhcApi.get(\n\t\t\tFHC_JS_DATA_STORAGE_OBJECT.app_root +\n\t\t\tFHC_JS_DATA_STORAGE_OBJECT.ci_router +\n\t\t\t\"/api/frontend/v1/Ort/getTypes\"\n\t\t);\n\t}\n}","export default {\n content(content_id, version=null, sprache=null, sichtbar=null) {\n return this.$fhcApi.get(\n\t\t\t\"/api/frontend/v1/Cms/content\",\n\t\t\t{ \n\t\t\t\tcontent_id: content_id,\n\t\t\t\t...(version?{version}:{}),\n\t\t\t\t...(sprache?{sprache}:{}),\n\t\t\t\t...(sichtbar?{sichtbar}:{}),\n }\n );\n },\n\t//api function used for the news View that renders the html\n\tgetNews(page = 1, page_size = 10, sprache) {\n\t\treturn this.$fhcApi.get(\n\t\t\t\"/api/frontend/v1/Cms/getNews\",\n\t\t\t{\n\t\t\t\tpage,\n\t\t\t\tpage_size,\n\t\t\t\tsprache,\n\t\t\t},\n\t\t);\n\t},\n\t//api function used for the widget component\n\tnews(limit) {\n\t\treturn this.$fhcApi.get(\n\t\t\t\"/api/frontend/v1/Cms/news\",\n\t\t\t{\n\t\t\t\tlimit: limit\n\t\t\t}\n\t\t);\n\t},\n\tgetNewsRowCount: function () {\n\t\treturn this.$fhcApi.get(\n\t\t\t\"/api/frontend/v1/Cms/getNewsRowCount\",\n\t\t\t{}\n\t\t);\n\t},\n\tgetNewsExtra: function(){\n\t\treturn this.$fhcApi.get(\n\t\t\t\"/api/frontend/v1/Cms/getStudiengangInfoForNews\",\n\t\t\t{}\n\t\t);\n\t}\n }","export default {\n getStudentenMail(lehreinheit_id) {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n \"/api/frontend/v1/Lehre/lvStudentenMail\",\n { lehreinheit_id: lehreinheit_id }\n );\n },\n\tgetLvInfo(studiensemester_kurzbz, lehrveranstaltung_id) {\n\t\treturn this.$fhcApi.get(\n\t\t\t`/api/frontend/v1/Lehre/LV/${studiensemester_kurzbz}/${lehrveranstaltung_id}`\n\t\t\t, {}\n\t\t);\n\t},\n\tgetStudentPruefungen(lehrveranstaltung_id){\n\t\treturn this.$fhcApi.get(\n\t\t\t`/api/frontend/v1/Lehre/Pruefungen/${lehrveranstaltung_id}`\n\t\t\t, {}\n\t\t);\n\t}\n }","export default {\n getLvMenu(lvid, studiensemester_kurzbz) {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/LvMenu/getLvMenu/${lvid}/${studiensemester_kurzbz}`,\n {}\n );\n },\n\n \n }","import person from \"./messages/person.js\";\n\nexport default {\n\tperson\n}","export default {\n\t\tgetMessages(url, config, params) {\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getMessages/' + params.id + '/' + params.type + '/' + params.size + '/' + params.page);\n\t\t},\n\t\tgetVorlagen(){\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getVorlagen/');\n\t\t},\n\t\tgetMsgVarsLoggedInUser(){\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getMsgVarsLoggedInUser/');\n\t\t},\n\t\tgetMessageVarsPerson(params){\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getMessageVarsPerson/' + params.id + '/' + params.type_id);\n\t\t},\n\t\tgetMsgVarsPrestudent(params){\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getMsgVarsPrestudent/' + params.id + '/' + params.type_id);\n\t\t},\n\t\tgetPersonId(params){\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getPersonId/'+ params.id + '/' + params.type_id);\n\t\t},\n\t\tgetUid(params){\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getUid/'+ params.id + '/' + params.type_id);\n\t\t},\n\t\tgetDataVorlage(vorlage_kurzbz){\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getDataVorlage/' + vorlage_kurzbz);\n\t\t},\n\t\tgetNameOfDefaultRecipient(params){\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getNameOfDefaultRecipient/' + params.id + '/' + params.type_id);\n\t\t},\n\t\tgetPreviewText(params, data){\n\t\t\treturn this.$fhcApi.post('api/frontend/v1/messages/messages/getPreviewText/' + params.id + '/' + params.type_id,\n\t\t\t\tdata);\n\t\t},\n\t\tgetReplyData(messageId){\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getReplyData/' + messageId);\n\t\t},\n\t\tsendMessageFromModalContext(form, id, data) {\n\t\t\treturn this.$fhcApi.post(form,'api/frontend/v1/messages/messages/sendMessage/' + id,\n\t\t\t\tdata);\n\t\t},\n\t\tsendMessage(id, data) {\n\t\t\treturn this.$fhcApi.post('api/frontend/v1/messages/messages/sendMessage/' + id,\n\t\t\t\tdata);\n\t\t},\n\t\tdeleteMessage(messageId){\n\t\t\treturn this.$fhcApi.post('api/frontend/v1/messages/messages/deleteMessage/' + messageId);\n\t\t}\n}","export default {\n\tgetVorlagen() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/vorlagen/vorlagen/getVorlagen/');\n\t},\n\tgetVorlagenByLoggedInUser() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/vorlagen/vorlagen/getVorlagenByLoggedInUser/');\n\t}\n}","export default {\n\n\tgetStudiensemester: function () {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/components/Cis/Mylv/Studiensemester',\n\t\t\t{}\n\t\t);\n\t},\n\n\tgetAllStudienSemester: function (studiensemester=undefined, studiengang=undefined, semester=undefined, studienplan=undefined) {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/api/frontend/v1/Studium/getStudienAllSemester',\n\t\t\t{studiensemester, studiengang, semester, studienplan}\n\t\t);\n\t},\n\n\tgetStudiengaengeForStudienSemester: function (studiensemester) {\n\t\treturn this.$fhcApi.get(\n\t\t\t`/api/frontend/v1/Studium/getStudiengaengeForStudienSemester/${studiensemester}`,\n\t\t\t{}\n\t\t);\n\t},\n\tgetStudienplaeneBySemester: function (studiengang, studiensemester) {\n\t\treturn this.$fhcApi.get(\n\t\t\t`/api/frontend/v1/Studium/getStudienplaeneBySemester`,\n\t\t\t{\n\t\t\t\tstudiengang,\n\t\t\t\tstudiensemester,\n\t\t\t}\n\t\t);\n\t},\n\tgetLvPlanForStudiensemester: function (studiensemester, lvid) {\n\t\treturn this.$fhcApi.get(\n\t\t\t`/api/frontend/v1/LvPlan/getLvPlanForStudiensemester/${studiensemester}/${lvid}`,\n\t\t\t{\n\t\t\t}\n\t\t);\n\t},\n\tgetLvEvaluierungInfo: function (studiensemester_kurzbz, lvid) {\n\t\treturn this.$fhcApi.get(\n\t\t\t`/api/frontend/v1/Studium/getLvEvaluierungInfo/${studiensemester_kurzbz}/${lvid}`,\n\t\t\t{\n\t\t\t}\n\t\t);\n\t},\n\t\n}","/**\n * Copyright (C) 2024 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nimport search from \"./search.js\";\nimport phrasen from \"./phrasen.js\";\nimport navigation from \"./navigation.js\";\nimport filter from \"./filter.js\";\nimport studstatus from \"./studstatus.js\";\nimport profil from \"./profil.js\";\nimport profilUpdate from \"./profilUpdate.js\";\nimport lvPlan from \"./lvPlan.js\";\nimport bookmark from \"./bookmark.js\";\nimport stv from \"./stv.js\";\nimport notiz from \"./notiz.js\";\nimport betriebsmittel from \"./betriebsmittel.js\";\nimport checkperson from \"./checkperson.js\";\nimport ampeln from \"./ampeln.js\";\nimport ort from \"./ort.js\";\nimport cms from \"./cms.js\";\nimport lehre from \"./lehre.js\";\nimport addons from \"./addons.js\";\nimport messages from \"./messages.js\";\nimport vorlagen from \"./vorlagen.js\";\nimport studiengang from \"./studiengang.js\";\nimport menu from \"./menu.js\";\nimport dashboard from \"./dashboard.js\";\nimport authinfo from \"./authinfo.js\";\nimport studium from \"./studium.js\";\nimport language from \"./language.js\";\n\nexport default {\n search,\n phrasen,\n navigation,\n dashboard,\n filter,\n studstatus,\n profil,\n profilUpdate,\n lvPlan,\n bookmark,\n stv,\n notiz,\n betriebsmittel,\n checkperson,\n ampeln,\n ort,\n cms,\n lehre,\n addons,\n messages,\n vorlagen,\n addons,\n\tstudiengang,\n\tmenu,\n\tauthinfo,\n\tstudium,\n language\n};\n","export default {\n\tasync getViewData() {\n\t\tconst url = `/api/frontend/v1/Cis4FhcApi/getViewData`;\n\t\treturn this.$fhcApi.get(url, null, null)\n\t},\n}","export default {\n\n getBookmarks: function () {\n return this.$fhcApi.get(\n `/api/frontend/v1/Bookmark/getBookmarks`\n ,{}\n );\n },\n \n delete: function (bookmark_id) {\n return this.$fhcApi.get(\n `/api/frontend/v1/Bookmark/delete/${bookmark_id}`\n ,{}\n ); \n },\n\n\tupdate: function ({ bookmark_id, url, title, tag=null}) {\n\t\treturn this.$fhcApi.post(\n\t\t\t`/api/frontend/v1/Bookmark/update/${bookmark_id}`\n\t\t\t, {\n\t\t\t\turl: url,\n\t\t\t\ttitle: title\n\t\t\t}\n\t\t);\n\t},\n\n insert: function ({url, title, tag}) {\n return this.$fhcApi.post(\n `/api/frontend/v1/Bookmark/insert`\n ,{\n url: url,\n title: title,\n tag: tag\n }\n ); \n },\n}","export default {\n \n open: function () {\n return this.$fhcApi.get(\n `/api/frontend/v1/Ampeln/open`,{});\n },\n\n all: function () {\n return this.$fhcApi.get(\n `/api/frontend/v1/Ampeln/all`,{});\n },\n\n confirm: function (ampel_id) {\n return this.$fhcApi.get(\n `/api/frontend/v1/Ampeln/confirm/${ampel_id}`,{});\n },\n\n}","export default {\n\tstudiengangInformation: function () {\n\t\treturn this.$fhcApi.get(\n\t\t\t\"/api/frontend/v1/Studgang/getStudiengangInfo\",\n\t\t\t{}\n\t\t);\n\t},\n\tgetStudiengangByKz: function (studiengang_kz) {\n\t\treturn this.$fhcApi.get(\n\t\t\t\"/api/frontend/v1/organisation/StudiengangEP/getStudiengangByKz\",\n\t\t\t{\n\t\t\t\t\"studiengang_kz\": studiengang_kz\n\t\t\t}\n\t\t);\n\t}\n}","export default {\n\tgetMenu: function () {\n\t\treturn this.$fhcApi.get(\n\t\t\t\"/api/frontend/v1/CisMenu/getMenu\",\n\t\t\t{}\n\t\t);\n\t}\n\n}","\nexport default {\n\tgetAuthUID() {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/api/frontend/v1/AuthInfo/getAuthUID',\n\t\t\t{ }\n\t\t);\n\t},\n\tgetAuthInfo() {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/api/frontend/v1/AuthInfo/getAuthInfo',\n\t\t\t{}\n\t\t);\n\t},\n};","/**\n * Copyright (C) 2024 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tgetAll() {\n\t\treturn this.$fhcApi.get('/api/frontend/v1/language/get');\n\t}\n};","/** TODO(chris):\n * when deleting this file be sure to\n * remove line 1 & 90 from ../plugins/Phrasen.js\n */\nimport FhcApiFactory from '../api/fhcapifactory.js';\n\n\nexport default {\n\tinstall: (app, options) => {\n\t\tif (app.config.globalProperties.$fhcApi) {\n\t\t\t/* Deprecated Code start */\n\t\t\tif (options?.factory) {\n\t\t\t\tconsole.warn(\"$fhcApi is DEPRECATED!\");\n\t\t\t\tapp.config.globalProperties.$fhcApi.factory.addEndpoints(options.factory);\n\t\t\t}\n\t\t\t/* Deprecated Code end */\n\t\t\treturn;\n\t\t}\n\n\t\tfunction _get_config(form, uri, data, config) {\n\t\t\tif (typeof form == 'string' && config === undefined) {\n\t\t\t\t[uri, data, config] = [form, uri, data];\n\t\t\t\tform = undefined;\n\t\t\t} else if (form) {\n\t\t\t\tif (typeof form != 'object')\n\t\t\t\t\tthrow new TypeError('Parameter 1 of _get_config must be an object or a string');\n\t\t\t\tif (uri === undefined && data === undefined && config === undefined) {\n\t\t\t\t\tconfig = form;\n\t\t\t\t\tform = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (form) {\n\t\t\t\t// NOTE(chris): check if form is fhc-form\n\t\t\t\tif (!form.clearValidation || !form.setFeedback)\n\t\t\t\t\tthrow new TypeError(\"'form' is not a Form Component\");\n\n\t\t\t\tform = {\n\t\t\t\t\tclearValidation: form.clearValidation,\n\t\t\t\t\tsetFeedback: form.setFeedback\n\t\t\t\t};\n\n\t\t\t\tif (config)\n\t\t\t\t\tconfig.form = form;\n\t\t\t\telse\n\t\t\t\t\tconfig = {form};\n\t\t\t}\n\n\t\t\treturn [uri, data, config];\n\t\t}\n\n\t\tfunction _clean_return_value(response) {\n\t\t\tconst result = response.data;\n\t\t\tdelete response.data;\n\t\t\tif (!result.meta)\n\t\t\t\tresult.meta = {response};\n\t\t\telse\n\t\t\t\tresult.meta.response = response;\n\t\t\treturn result;\n\t\t}\n\t\tconst baseURL = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + \"/\";\n\t\tconst fhcApiAxios = axios.create({\n\t\t\ttimeout: 500000,\n\t\t\tbaseURL: FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + \"/\"\n\t\t});\n\n\t\tfhcApiAxios.interceptors.request.use(config => {\n\t\t\tif (config.method != 'post' || !config.data)\n\t\t\t\treturn config;\n\n\t\t\tif (config.data instanceof FormData)\n\t\t\t\treturn config;\n\n\t\t\tif (!Object.values(config.data).every(item => {\n\t\t\t\tif (item instanceof FileList)\n\t\t\t\t\treturn false;\n\t\t\t\tif (Array.isArray(item))\n\t\t\t\t\treturn item.every(i => !(i instanceof File));\n\t\t\t\treturn true;\n\t\t\t})) {\n\t\t\t\tconst newData = Object.entries(config.data).reduce((nd, [key, item]) => {\n\t\t\t\t\tif (item instanceof FileList) {\n\t\t\t\t\t\tfor (const file of item)\n\t\t\t\t\t\t\tnd.FormData.append(key + (item.length > 1 ? '[]' : ''), file);\n\t\t\t\t\t} else if (Array.isArray(item)) {\n\t\t\t\t\t\tif (item.every(i => !(i instanceof File))) {\n\t\t\t\t\t\t\tnd.jsondata[key] = item;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\titem.forEach(file => nd.FormData.append(key + (item.length > 1 ? '[]' : ''), file));\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnd.jsondata[key] = item;\n\t\t\t\t\t}\n\t\t\t\t\treturn nd;\n\t\t\t\t}, {\n\t\t\t\t\tFormData: new FormData(),\n\t\t\t\t\tjsondata: {}\n\t\t\t\t});\n\t\t\t\tnewData.FormData.append('_jsondata', JSON.stringify(newData.jsondata));\n\t\t\t\tconfig.data = newData.FormData;\n\t\t\t}\n\n\t\t\treturn config;\n\t\t});\n\n\t\tfhcApiAxios.interceptors.response.use(response => {\n\t\t\tif (response.config?.errorHandling == 'off'\n\t\t\t\t|| response.config?.errorHandling === false\n\t\t\t\t|| response.config?.errorHandling == 'fail')\n\t\t\t\treturn _clean_return_value(response);\n\n\t\t\t// NOTE(chris): loop through errors\n\t\t\tif (response.data.errors)\n\t\t\t\tresponse.data.errors = response.data.errors.filter(\n\t\t\t\t\terr => (response.config[err.type + 'ErrorHandler'] || app.config.globalProperties.$fhcApi._defaultErrorHandlers[err.type])(err, response.config)\n\t\t\t\t);\n\n\t\t\treturn _clean_return_value(response);\n\t\t}, error => {\n\t\t\tif (error.code == 'ERR_CANCELED')\n\t\t\t\treturn Promise.reject({...{handled: true}, ...error});\n\n\t\t\tif (error.config?.errorHandling == 'off'\n\t\t\t\t|| error.config?.errorHandling === false\n\t\t\t\t|| error.config?.errorHandling == 'success')\n\t\t\t\treturn Promise.reject(error);\n\n\t\t\tif (error.response) {\n\t\t\t\tif (error.response.status == 404) {\n\t\t\t\t\tapp.config.globalProperties.$fhcAlert.alertDefault('error', error.message, error.request.responseURL, true);\n\t\t\t\t\treturn Promise.reject({...{handled: true}, ...error});\n\t\t\t\t}\n\n\t\t\t\t// NOTE(chris): loop through errors\n\t\t\t\terror.response.data.errors = error.response.data.errors.filter(\n\t\t\t\t\terr => (error.config[err.type + 'ErrorHandler'] || app.config.globalProperties.$fhcApi._defaultErrorHandlers[err.type])(err, error.config)\n\t\t\t\t);\n\t\t\t\tif (!error.response.data.errors.length)\n\t\t\t\t\treturn Promise.reject({...{handled: true}, ...error});\n\t\t\t} else if (error.request) {\n\t\t\t\tapp.config.globalProperties.$fhcAlert.alertDefault('error', error.message, error.request.responseURL);\n\t\t\t\treturn Promise.reject({...{handled: true}, ...error});\n\t\t\t} else {\n\t\t\t\tapp.config.globalProperties.$fhcAlert.alertError(error.message);\n\t\t\t\treturn Promise.reject({...{handled: true}, ...error});\n\t\t\t}\n\n\t\t\treturn Promise.reject(error);\n\t\t});\n\n\t\tapp.config.globalProperties.$fhcApi = {\n\t\t\tgetUri(url) {\n\t\t\t\tconsole.warn('$fhcApi.getUri is DEPRECATED! Use $api.getUri instead.');\n\t\t\t\treturn fhcApiAxios.getUri({url});\n\t\t\t},\n\t\t\tget(form, uri, params, config) {\n\t\t\t\tconsole.warn('$fhcApi.get is DEPRECATED! Use $api.get instead.');\n\t\t\t\t[uri, params, config] = _get_config(form, uri, params, config);\n\t\t\t\tif (params) {\n\t\t\t\t\tif (config)\n\t\t\t\t\t\tconfig.params = params;\n\t\t\t\t\telse\n\t\t\t\t\t\tconfig = {params};\n\t\t\t\t}\n\t\t\t\treturn fhcApiAxios.get(uri, config);\n\t\t\t},\n\t\t\tpost(form, uri, data, config) {\n\t\t\t\tconsole.warn('$fhcApi.post is DEPRECATED! Use $api.post instead.');\n\t\t\t\t[uri, data, config] = _get_config(form, uri, data, config);\n\t\t\t\treturn fhcApiAxios.post(uri, data, config);\n\t\t\t},\n\t\t\t_defaultErrorHandlers: {\n\t\t\t\tvalidation(error, config) {\n\t\t\t\t\tconst $fhcAlert = app.config.globalProperties.$fhcAlert;\n\n\t\t\t\t\tif (config?.form) {\n\t\t\t\t\t\tconfig.form.clearValidation();\n\t\t\t\t\t\tconfig.form.setFeedback(false, error.messages);\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (Array.isArray(error.messages)) {\n\t\t\t\t\t\terror.messages.forEach($fhcAlert.alertError);\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t} else if (typeof error.messages == 'object') {\n\t\t\t\t\t\tif (config?.errorHeader)\n\t\t\t\t\t\t\tObject.values(error.messages).forEach(\n\t\t\t\t\t\t\t\tvalue => $fhcAlert.alertDefault(\n\t\t\t\t\t\t\t\t\t'error',\n\t\t\t\t\t\t\t\t\tArray.isArray(config.errorHeader) ? app.config.globalProperties.$p.t.apply(null, config.errorHeader) : config.errorHeader,\n\t\t\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tObject.entries(error.messages).forEach(\n\t\t\t\t\t\t\t\t([key, value]) => $fhcAlert.alertDefault('error', key, value, true)\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\t\t\t\tgeneral(error, config) {\n\t\t\t\t\tconst $fhcAlert = app.config.globalProperties.$fhcAlert;\n\n\t\t\t\t\tif (config?.form)\n\t\t\t\t\t\tconfig.form.setFeedback(false, error.message);\n\t\t\t\t\telse if (config?.errorHeader)\n\t\t\t\t\t\t$fhcAlert.alertDefault(\n\t\t\t\t\t\t\t'error',\n\t\t\t\t\t\t\tArray.isArray(config.errorHeader) ? app.config.globalProperties.$p.t.apply(null, config.errorHeader) : config.errorHeader,\n\t\t\t\t\t\t\terror.message,\n\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t);\n\t\t\t\t\telse\n\t\t\t\t\t\t$fhcAlert.alertError(error.message);\n\t\t\t\t},\n\t\t\t\tphp(error) {\n\t\t\t\t\tconst $fhcAlert = app.config.globalProperties.$fhcAlert;\n\n\t\t\t\t\tvar message = '';\n\t\t\t\t\tmessage += 'Message: ' + error.message + '\\n\\n';\n\t\t\t\t\tmessage += 'Filename: ' + error.filename + '\\n';\n\t\t\t\t\tmessage += 'Line Number: ' + error.line + '\\n';\n\t\t\t\t\tif (error.backtrace && error.backtrace.length) {\n\t\t\t\t\t\tmessage += '\\nBacktrace: ';\n\t\t\t\t\t\terror.backtrace.forEach(err => {\n\t\t\t\t\t\t\tmessage += '\\n\\tFile: ' + err.file + '\\n';\n\t\t\t\t\t\t\tmessage += '\\tLine: ' + err.line + '\\n';\n\t\t\t\t\t\t\tmessage += '\\tFunction: ' + err.function + '\\n';\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tswitch (error.severity) {\n\t\t\t\t\t\tcase 'Warning':\n\t\t\t\t\t\tcase 'Core Warning':\n\t\t\t\t\t\tcase 'Compile Warning':\n\t\t\t\t\t\tcase 'User Warning':\n\t\t\t\t\t\t\t$fhcAlert.alertDefault('warn', 'PHP ' + error.severity, message, true);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'Notice':\n\t\t\t\t\t\tcase 'User Notice':\n\t\t\t\t\t\tcase 'Runtime Notice':\n\t\t\t\t\t\t\t$fhcAlert.alertDefault('info', 'PHP ' + error.severity, message, true);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tmessage = 'Type: PHP ' + error.severity + '\\n\\n' + message;\n\t\t\t\t\t\t\t$fhcAlert.alertSystemError(message);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\texception(error) {\n\t\t\t\t\tconst $fhcAlert = app.config.globalProperties.$fhcAlert;\n\n\t\t\t\t\tvar message = '';\n\t\t\t\t\tmessage += 'Type: ' + error.class + '\\n\\n';\n\t\t\t\t\tmessage += 'Message: ' + error.message + '\\n\\n';\n\t\t\t\t\tmessage += 'Filename: ' + error.filename + '\\n';\n\t\t\t\t\tmessage += 'Line Number: ' + error.line + '\\n';\n\t\t\t\t\tif (error.backtrace && error.backtrace.length) {\n\t\t\t\t\t\tmessage += '\\nBacktrace: ';\n\t\t\t\t\t\terror.backtrace.forEach(err => {\n\t\t\t\t\t\t\tmessage += '\\n\\tFile: ' + err.file + '\\n';\n\t\t\t\t\t\t\tmessage += '\\tLine: ' + err.line + '\\n';\n\t\t\t\t\t\t\tmessage += '\\tFunction: ' + err.function + '\\n';\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t$fhcAlert.alertSystemError(message);\n\t\t\t\t},\n\t\t\t\tdb(error) {\n\t\t\t\t\tconst $fhcAlert = app.config.globalProperties.$fhcAlert;\n\n\t\t\t\t\tvar message = '';\n\t\t\t\t\tif (error.heading !== undefined)\n\t\t\t\t\t\tmessage += error.heading + '\\n\\n';\n\t\t\t\t\tif (error.code !== undefined)\n\t\t\t\t\t\tmessage += 'Code: ' + error.code + '\\n\\n';\n\t\t\t\t\tif (error.sql !== undefined)\n\t\t\t\t\t\tmessage += 'SQL: ' + error.sql + '\\n\\n';\n\t\t\t\t\tif (error.message !== undefined)\n\t\t\t\t\t\tmessage += 'Message: ' + error.message + '\\n\\n';\n\t\t\t\t\telse if (error.messages !== undefined)\n\t\t\t\t\t\tmessage += 'Messages: ' + error.messages.join('\\n\\t') + '\\n\\n';\n\t\t\t\t\tif (error.filename !== undefined)\n\t\t\t\t\t\tmessage += 'Filename: ' + error.filename + '\\n';\n\t\t\t\t\tif (error.line !== undefined)\n\t\t\t\t\t\tmessage += 'Line Number: ' + error.line + '\\n';\n\n\t\t\t\t\t$fhcAlert.alertSystemError(message);\n\t\t\t\t},\n\t\t\t\tauth(error, config) {\n\t\t\t\t\tconst $fhcAlert = app.config.globalProperties.$fhcAlert;\n\n\t\t\t\t\tvar message = '';\n\t\t\t\t\tmessage += 'Controller name: ' + error.controller + '\\n';\n\t\t\t\t\tmessage += 'Method name: ' + error.method + '\\n';\n\t\t\t\t\tmessage += 'Required permissions: ' + error.required_permissions;\n\t\t\t\t\tif (config?.errorHeader)\n\t\t\t\t\t\t$fhcAlert.alertDefault(\n\t\t\t\t\t\t\t'error',\n\t\t\t\t\t\t\tArray.isArray(config.errorHeader) ? app.config.globalProperties.$p.t.apply(null, config.errorHeader) : config.errorHeader,\n\t\t\t\t\t\t\terror.message,\n\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t);\n\t\t\t\t\telse\n\t\t\t\t\t\t$fhcAlert.alertDefault('error', error.message, message);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t/* Deprecated Code start */\n\t\tclass FhcApiFactoryWrapper {\n\t\t\tconstructor(factorypart, root) {\n\t\t\t\tif (root === undefined) {\n\t\t\t\t\tthis.$fhcApi = {\n\t\t\t\t\t\tgetUri(url) {\n\t\t\t\t\t\t\tconsole.warn('$fhcApi.factory is DEPRECATED!');\n\t\t\t\t\t\t\treturn app.config.globalProperties.$fhcApi.getUri(url);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tget(form, uri, params, config) {\n\t\t\t\t\t\t\tconsole.warn('$fhcApi.factory is DEPRECATED!');\n\t\t\t\t\t\t\treturn app.config.globalProperties.$fhcApi.get(form, uri, params, config);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tpost(form, uri, data, config) {\n\t\t\t\t\t\t\tconsole.warn('$fhcApi.factory is DEPRECATED!');\n\t\t\t\t\t\t\treturn app.config.globalProperties.$fhcApi.post(form, uri, data, config);\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\tObject.defineProperty(this.$fhcApi, 'factory', {\n\t\t\t\t\t\tget() {\n\t\t\t\t\t\t\tconsole.warn('$fhcApi.factory is DEPRECATED!');\n\t\t\t\t\t\t\treturn app.config.globalProperties.$fhcApi.factory;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tapp.config.globalProperties.$fhcApi.factory = this;\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty(this, '$fhcApi', {\n\t\t\t\t\t\tget() {\n\t\t\t\t\t\t\treturn (root || this).$fhcApi;\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tthis.addEndpoints(factorypart, true)\n\t\t\t}\n\n\t\t\taddEndpoints(factorypart, noWarn) {\n\t\t\t\tObject.keys(factorypart).forEach(key => {\n\t\t\t\t\tObject.defineProperty(this, key, {\n\t\t\t\t\t\tget() {\n\t\t\t\t\t\t\tif (typeof factorypart[key] == 'function')\n\t\t\t\t\t\t\t\treturn factorypart[key].bind(this);\n\t\t\t\t\t\t\treturn new FhcApiFactoryWrapper(factorypart[key], this.$fhcApi.factory);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\tif (!noWarn) console.warn('$fhcApi.factory.addEndpoints() is DEPRECATED!');\n\t\t\t}\n\t\t}\n\n\t\tconst factory = new FhcApiFactoryWrapper(FhcApiFactory);\n\t\tif (options?.factory) {\n\t\t\tconsole.warn(\"$fhcApi is DEPRECATED!\");\n\t\t\tfactory.addEndpoints(options.factory);\n\t\t}\n\n\t\tapp.config.globalProperties.$fhcApi.factory = factory;\n\t\t/* Deprecated Code end */\n\t\t\n\t\tapp.provide('$fhcApi', app.config.globalProperties.$fhcApi);\n\t}\n};","/**\n * Copyright (C) 2022 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n//--------------------------------------------------------------------------------------------------------------------\n// Configs\n\n// To see debug messages into the browser console set this parameter as true\nconst CORE_REST_CLIENT_DEBUG = false;\n\n// Default timeout (milliseconds)\nconst CORE_REST_CLIENT_TIMEOUT = 5000;\n\n//--------------------------------------------------------------------------------------------------------------------\n// Constants\n\n// Success\nconst CORE_REST_CLIENT_SUCCESS = 0;\n\n// Properties present in a response\nconst CORE_REST_CLIENT_ERROR = \"error\";\nconst CORE_REST_CLIENT_RETVAL = \"retval\";\n\n// HTTP method parameters\nconst CRC_HTTP_GET_METHOD = \"get\";\nconst CRC_HTTP_POST_METHOD = \"post\";\n\n/**\n * Definition and initialization of the object CoreRESTClient\n */\nexport const CoreRESTClient = {\n\t//------------------------------------------------------------------------------------------------------------------\n\t// Public methods\n\n\t/**\n\t * Performs a call using the HTTP GET method\n\t * wsParameters is an object\n\t * axiosParameters is an object\n\t */\n\tget: function(wsURL, wsParameters, axiosParameters = null) {\n\t\treturn CoreRESTClient._axiosCall(wsURL, wsParameters, CRC_HTTP_GET_METHOD, axiosParameters);\n\t},\n\n\t/**\n\t * Performs a call using the HTTP POST method\n\t * wsParameters is an object\n\t * axiosParameters is an object\n\t */\n\tpost: function(wsURL, wsParameters, axiosParameters = null) {\n\t\treturn CoreRESTClient._axiosCall(wsURL, wsParameters, CRC_HTTP_POST_METHOD, axiosParameters);\n\t},\n\n\t/**\n\t * Checks if the response is a success\n\t */\n\tisSuccess: function(response) {\n\n\t\tif (typeof response === \"object\" && response.hasOwnProperty(CORE_REST_CLIENT_ERROR)\n\t\t\t&& response.hasOwnProperty(CORE_REST_CLIENT_RETVAL) && response.error == CORE_REST_CLIENT_SUCCESS)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t/**\n\t * Checks if the response is an error\n\t */\n\tisError: function(response) {\n\t\treturn !CoreRESTClient.isSuccess(response);\n\t},\n\n\t/**\n\t * Checks if the response has data\n\t */\n\thasData: function(response) {\n\n\t\tif (CoreRESTClient.isSuccess(response))\n\t\t{\n\t\t\tif ((typeof response[CORE_REST_CLIENT_RETVAL] === \"object\" && Object.keys(response[CORE_REST_CLIENT_RETVAL]).length > 0)\n\t\t\t\t|| (typeof response[CORE_REST_CLIENT_RETVAL] === \"array\" && response[CORE_REST_CLIENT_RETVAL].length > 0)\n\t\t\t\t|| (typeof response[CORE_REST_CLIENT_RETVAL] === \"string\" && response[CORE_REST_CLIENT_RETVAL].trim() != \"\")\n\t\t\t\t|| typeof response[CORE_REST_CLIENT_RETVAL] === \"number\")\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t/**\n\t * Retrives data from response object\n\t */\n\tgetData: function(response) {\n\n\t\tif (CoreRESTClient.hasData(response))\n\t\t{\n\t\t\treturn response[CORE_REST_CLIENT_RETVAL];\n\t\t}\n\n\t\treturn null;\n\t},\n\n\t/**\n\t * Retrives error message from response object\n\t */\n\tgetError: function(response) {\n\n\t\tif (typeof response === \"object\"\n\t\t\t&& Object.keys(response).length > 0\n\t\t\t&& response.hasOwnProperty(CORE_REST_CLIENT_RETVAL))\n\t\t{\n\t\t\treturn response[CORE_REST_CLIENT_RETVAL];\n\t\t}\n\n\t\treturn \"Generic error\";\n\t},\n\n\t/**\n\t * Retrives code from response object\n\t */\n\tgetErrorCode: function(response) {\n\n\t\tif (typeof response === \"object\" && response.hasOwnProperty(CORE_REST_CLIENT_ERROR))\n\t\t{\n\t\t\treturn response[CORE_REST_CLIENT_ERROR];\n\t\t}\n\n\t\treturn 1; // Generic error\n\t},\n\n\t//------------------------------------------------------------------------------------------------------------------\n\t// Private methods\n\n\t/**\n\t * Generate the router URI using the connection parameters\n\t */\n\t_generateRouterURI: function(wsURL) {\n\t\tvar uri = null;\n\n\t\t// Checks if global JS object FHC_JS_DATA_STORAGE_OBJECT exists\n\t\tif (typeof FHC_JS_DATA_STORAGE_OBJECT !== \"undefined\")\n\t\t{\n\t\t\turi = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + \"/\" + wsURL;\n\t\t}\n\n\t\treturn uri;\n\t},\n\n\t/**\n\t * Method to print debug info after a controller has been called\n\t */\n\t_printDebug: function(parameters, response, errorThrown) {\n\n\t\tif (CORE_REST_CLIENT_DEBUG === true) // If global const CORE_REST_CLIENT_DEBUG is true, but really true!\n\t\t{\n\t\t\t// Print info about called controller\n\t\t\tconsole.log(\"Called controller: \" + parameters.remoteController);\n\t\t\tconsole.log(\"Call parameters:\"); // parameters given to this call\n\t\t\tconsole.log(parameters);\n\n\t\t\tif (response != null) // if there is a response...\n\t\t\t{\n\t\t\t\tconsole.log(\"Controller Response:\");\n\t\t\t\tconsole.log(response); // ...print it\n\t\t\t}\n\t\t\tif (errorThrown != null) // if there is a jQuery error...\n\t\t\t{\n\t\t\t\tconsole.log(\"jQuery error:\");\n\t\t\t\tconsole.log(errorThrown); // ...print it\n\t\t\t}\n\t\t\tconsole.log(\"--------------------------------------------------------------------------------------------\");\n\t\t}\n\t},\n\n\t/**\n\t * Performs a call to the server were the CI PHP layer is running\n\t * - wsURL: alias of the core controller to call\n\t * - wsParameters: parameters to give to the called controller\n\t * - type: POST or GET HTTP method\n\t * - axiosParameters: an object to configure the axios call\n\t */\n\t_axiosCall: function(wsURL, wsParameters, type, axiosParameters) {\n\n\t\t// Axios config object\n\t\tlet axiosCallObj = {\n\t\t\tmethod: type,\n\t\t\turl: CoreRESTClient._generateRouterURI(wsURL),\n\t\t\ttimeout: CORE_REST_CLIENT_TIMEOUT // default time out\n\t\t};\n\n\t\t// The ajax call is HTTP GET\n\t\tif (type == CRC_HTTP_GET_METHOD)\n\t\t{\n\t\t\taxiosCallObj.params = wsParameters;\n\t\t}\n\t\t// The ajax call is HTTP POST\n\t\telse\n\t\t{\n\t\t\taxiosCallObj.data = wsParameters;\n\t\t}\n\n\t\t// Check if axiosParameters is an object\n\t\tif (typeof axiosParameters === \"object\")\n\t\t{\n\t\t\t// And then copies the its properties into axiosCallObj\n\t\t\tfor (var prop in axiosParameters) axiosCallObj[prop] = axiosParameters[prop];\n\t\t}\n\n\t\t// Perform the ajax call via axios\n\t\treturn axios(axiosCallObj);\n\t}\n};\n\n","/**\n * Copyright (C) 2022 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n * \n * @usage:\n * Preperations:\n * Be sure to have PrimeVue loaded with the toast and confirmdialog\n * components as primevue variable\n * Install:\n * Import this Plugin and install it with the app.use() function.\n * Use:\n * In your component you can call now the global property $fhcAlert\n * which has the following functions:\n * \n * alertSuccess\n * ------------\n * Displays a success message\n * @param string\tmessage\n * @return void\n * \n * alertInfo\n * ---------\n * Displays an info message\n * @param string\tmessage\n * @return void\n * \n * alertWarning\n * ------------\n * Displays a warning\n * @param string\tmessage\n * @return void\n * \n * alertError\n * ----------\n * Displays an error\n * @param string\tmessage\n * @return void\n * \n * alertSystemError\n * ----------------\n * Displays an alert with the error details and a button to mail\n * the error to the Support Team\n * @param string\tmessage\n * @return void\n * \n * confirmDelete\n * -------------\n * Displays a confirmation dialog and returns a Promise which resolves\n * with true or false depending und the pressed button.\n * @return Promise\n * \n * alertDefault\n * ------------\n * Displays an alert\n * @param string\tseverity\t\tcan be 'success', 'info', 'warning', 'error'\n * @param string\ttitle\n * @param string\tmessage\n * @param boolean\tsticky\t\t\t(optional) defaults to false\n * @return void\n * \n * alertMultiple\n * -------------\n * Displays multiple alerts\n * @param array\t\tmessageArray\n * @param string\tseverity\t\t(optional) defaults to 'info'\n * @param string\ttitle\t\t\t(optional) defaults to 'Info'\n * @param boolean\tsticky\t\t\t(optional) defaults to false\n * @return void\n * \n * handleSystemError\n * -----------------\n * Automatiticly determine how to display an system error and display it.\n * This would be used in a catch block of an ajax call.\n * @param mixed\t\terror\n * @return void\n * \n * handleSystemMessage\n * -------------------\n * Automatiticly determine how to display a message and display it.\n * @param mixed\t\tmessage\n * @return void\n */\nimport PvConfig from \"../../../index.ci.php/public/js/components/primevue/config/config.esm.min.js\";\nimport PvToast from \"../../../index.ci.php/public/js/components/primevue/toast/toast.esm.min.js\";\nimport PvConfirm from \"../../../index.ci.php/public/js/components/primevue/confirmdialog/confirmdialog.esm.min.js\";\nimport PvConfirmationService from \"../../../index.ci.php/public/js/components/primevue/confirmationservice/confirmationservice.esm.min.js\";\nimport FhcPhrasen from \"./Phrasen.js\";\n\nimport {CoreRESTClient} from '../RESTClient.js';\n\nconst helperAppContainer = document.createElement('div');\n\nconst helperApp = Vue.createApp({\n\tname: \"FhcAlertApp\",\n\tcomponents: {\n\t\tPvToast,\n\t\tPvConfirm\n\t},\n\tmethods: {\n\t\tmailToUrl(slotProps) {\n\t\t\tlet mailTo = FHC_JS_DATA_STORAGE_OBJECT.systemerror_mailto;\n\t\t\tlet subject = 'Meldung%20Systemfehler';\n\t\t\tlet body = `\n\t\t\t\tDanke, dass Sie uns den Fehler melden. %0D%0A %0D%0A\n\t\t\t\tBitte beschreiben Sie uns ausführlich das Problem.%0D%0A\n\t\t\t\tBsp: Ich habe X ausgewählt und Y angelegt. Beim Speichern erhielt ich die Fehlermeldung. [Optional: Ich habe den Browser Z verwendet.]%0D%0A\n\t\t\t\t-----------------------------------------------------------------------------------------------------------------------------------%0D%0A\n\t\t\t\tPROBLEM: ... %0D%0A %0D%0A %0D%0A\n\n\t\t\t\t-----------------------------------------------------------------------------------------------------------------------------------%0D%0A\n\t\t\t\tFehler URL: ` + FHC_JS_DATA_STORAGE_OBJECT.called_path + '/' + FHC_JS_DATA_STORAGE_OBJECT.called_method + `%0D%0A\n\t\t\t\tFehler Meldung: ` + slotProps.message.detail + `%0D%0A\n\t\t\t\t-----------------------------------------------------------------------------------------------------------------------------------%0D%0A %0D%0A\n\t\t\t\tWir kümmern uns um eine rasche Behebung des Problems!`\n\n\t\t\treturn \"mailto:\" + mailTo + \"?subject=\" + subject + \"&body=\" + body;\n\t\t},\n\t\topenMessagecard(e) {\n\t\t\tbootstrap.Collapse.getOrCreateInstance(e.target.getAttribute('href')).toggle();\n\t\t}\n\t},\n\tunmounted() {\n\t\thelperAppContainer.parentElement.removeChild(helperAppContainer);\n\t},\n\tcomputed: {\n\t\tshowmaillink: function() {\n\t\t\treturn FHC_JS_DATA_STORAGE_OBJECT.systemerror_mailto !== '';\n\t\t}\n\t},\n\ttemplate: /* html */`\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t`\n});\n\nhelperApp.use(PvConfig);\nhelperApp.use(PvConfirmationService);\n//helperApp.use(FhcPhrasen);\n\nconst helperAppInstance = helperApp.mount(helperAppContainer);\n\ndocument.body.appendChild(helperAppContainer);\n\n\nexport default {\n\tinstall: (app, options) => {\n\t\tif (!app.config.globalProperties.$p)\n\t\t\tapp.use(FhcPhrasen);\n\n\t\tconst $fhcAlert = {\n\t\t\talertSuccess(message) {\n\t\t\t\tif (Array.isArray(message))\n\t\t\t\t\treturn message.forEach(this.alertSuccess);\n\t\t\t\thelperAppInstance.$refs.toast.add({ severity: 'success', summary: 'Info', detail: message, life: 1000});\n\t\t\t},\n\t\t\talertInfo(message) {\n\t\t\t\tif (Array.isArray(message))\n\t\t\t\t\treturn message.forEach(this.alertInfo);\n\t\t\t\thelperAppInstance.$refs.toast.add({ severity: 'info', summary: 'Info', detail: message, life: 3000 });\n\t\t\t},\n\t\t\talertWarning(message) {\n\t\t\t\tif (Array.isArray(message))\n\t\t\t\t\treturn message.forEach(this.alertWarning);\n\t\t\t\thelperAppInstance.$refs.toast.add({ severity: 'warn', summary: 'Achtung', detail: message});\n\t\t\t},\n\t\t\talertError(message) {\n\t\t\t\tif (Array.isArray(message))\n\t\t\t\t\treturn message.forEach(this.alertError);\n\t\t\t\thelperAppInstance.$refs.toast.add({ severity: 'error', summary: 'Achtung', detail: message });\n\t\t\t},\n\t\t\talertSystemError(message) {\n\t\t\t\t//TODO(Manu) for translation of content of template: restructure in data\n\t\t\t\t//and update definitions with translations\n\n\t\t\t\tif (Array.isArray(message))\n\t\t\t\t\treturn message.forEach(this.alertSystemError);\n\t\t\t\thelperAppInstance.$refs.alert.add({\n\t\t\t\t\tseverity: 'error',\n\t\t\t\t\tsummary: Vue.computed(() => app.config.globalProperties.$p.t('alert/systemerror')),\n\t\t\t\t\tdetail: message});\n\t\t\t},\n\t\t\tconfirmDelete() {\n\t\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\t\thelperAppInstance.$confirm.require({\n\t\t\t\t\t\tgroup: 'fhcAlertConfirm',\n\t\t\t\t\t\theader: Vue.computed(() => app.config.globalProperties.$p.t('alert/attention')),\n\t\t\t\t\t\tmessage: Vue.computed(() => app.config.globalProperties.$p.t('alert/confirm_delete')),\n\t\t\t\t\t\tacceptLabel: Vue.computed(() => app.config.globalProperties.$p.t('ui/loeschen')),\n\t\t\t\t\t\tacceptClass: 'p-button-danger',\n\t\t\t\t\t\trejectLabel: Vue.computed(() => app.config.globalProperties.$p.t('ui/abbrechen')),\n\t\t\t\t\t\trejectClass: 'p-button-secondary',\n\t\t\t\t\t\taccept() {\n\t\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t\t},\n\t\t\t\t\t\treject() {\n\t\t\t\t\t\t\tresolve(false);\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t},\n\t\t\tconfirm(options) {\n\t\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\t\thelperAppInstance.$confirm.require({\n\t\t\t\t\t\tgroup: options?.group ?? 'fhcAlertConfirm',\n\t\t\t\t\t\theader: options?.header ?? Vue.computed(() => app.config.globalProperties.$p.t('alert/attention')),\n\t\t\t\t\t\tmessage: options?.message ?? '',\n\t\t\t\t\t\tacceptLabel: options?.acceptLabel ?? 'Ok',\n\t\t\t\t\t\tacceptClass: options?.acceptClass ?? 'btn btn-primary',\n\t\t\t\t\t\trejectLabel: options?.rejectLabel ?? Vue.computed(() => app.config.globalProperties.$p.t('ui/abbrechen')),\n\t\t\t\t\t\trejectClass: options?.rejectClass ?? 'btn btn-outline-secondary',\n\t\t\t\t\t\taccept() {\n\t\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t\t},\n\t\t\t\t\t\treject() {\n\t\t\t\t\t\t\tresolve(false);\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t},\n\t\t\talertDefault(severity, title, message, sticky = false, html = false) {\n\t\t\t\tlet options = { severity: severity, summary: title, detail: message, html };\n\t\t\t\t\n\t\t\t\tif (!sticky)\n\t\t\t\t\toptions.life = 3000;\n\n\t\t\t\thelperAppInstance.$refs.toast.add(options);\n\t\t\t},\n\t\t\talertMultiple(messageArray, severity = 'info', title = 'Info', sticky = false, html = false){\n\t\t\t\t// Check, if array has only string values\n\t\t\t\tif (messageArray.every(message => typeof message === 'string')) {\n\t\t\t\t\tmessageArray.forEach(message => this.alertDefault(severity, title, message, sticky, html));\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\thandleSystemError(error) {\n\t\t\t\t// don't show an error message to the user if the error was an aborted request\n\t\t\t\tif(error.hasOwnProperty('name') && error.name.toLowerCase() === \"AbortError\".toLowerCase())\n\t\t\t\t\treturn;\n\t\t\t\t\n\t\t\t\t// Error is string\n\t\t\t\tif (typeof error === 'string')\n\t\t\t\t\treturn $fhcAlert.alertSystemError(error);\n\n\t\t\t\t// Error is array of strings\n\t\t\t\tif (Array.isArray(error) && error.every(err => typeof err === 'string'))\n\t\t\t\t\treturn error.every($fhcAlert.alertSystemError);\n\n\t\t\t\t// Error has been handled already\n\t\t\t\tif (error.hasOwnProperty('handled') && error.handled)\n\t\t\t\t\treturn;\n\t\t\t\t\n\t\t\t\t// Error is object\n\t\t\t\tif (typeof error === 'object' && error !== null) {\n\t\t\t\t\tlet errMsg = '';\n\n\n\t\t\t\t\tif (error.hasOwnProperty('response') && error.response?.data?.retval)\n\t\t\t\t\t\terrMsg += 'Error Message: ' + (error.response.data.retval.message || error.response.data.retval) + '\\r\\n';\n\t\t\t\t\telse if (error.hasOwnProperty('message'))\n\t\t\t\t\t\terrMsg += 'Error Message: ' + error.message.toUpperCase() + '\\r\\n';\n\n\t\t\t\t\tif (error.hasOwnProperty('config') && error.config.hasOwnProperty('url'))\n\t\t\t\t\t\terrMsg += 'Error ConfigURL: ' + error.config.url + '\\r\\n';\n\n\t\t\t\t\tif (error.hasOwnProperty('stack'))\n\t\t\t\t\t\terrMsg += 'Error Stack: ' + error.stack + '\\r\\n';\n\t\t\t\t\t\n\t\t\t\t\t// Fallback object error message\n\t\t\t\t\tif (errMsg == '')\n\t\t\t\t\t\terrMsg = 'Error Message: ' + JSON.stringify(error) + '\\r\\n';\n\n\t\t\t\t\terrMsg += 'Error Controller Path: ' + FHC_JS_DATA_STORAGE_OBJECT.called_path + '/' + FHC_JS_DATA_STORAGE_OBJECT.called_method;\n\n\t\t\t\t\treturn $fhcAlert.alertSystemError(errMsg);\n\t\t\t\t}\n\n\t\t\t\t// Fallback\n\t\t\t\t$fhcAlert.alertSystemError('alertSystemError throws Generic Error\\r\\nError Controller Path: ' + FHC_JS_DATA_STORAGE_OBJECT.called_path + '/' + FHC_JS_DATA_STORAGE_OBJECT.called_method);\n\t\t\t},\n\t\t\thandleSystemMessage(message) {\n\t\t\t\t// Message is string\n\t\t\t\tif (typeof message === 'string')\n\t\t\t\t\treturn $fhcAlert.alertWarning(message);\n\n\t\t\t\t// Message is array of strings\n\t\t\t\tif (Array.isArray(message)) {\n\t\t\t\t\t// If Array has only Strings\n\t\t\t\t\tif (message.every(msg => typeof msg === 'string'))\n\t\t\t\t\t\treturn message.every($fhcAlert.alertWarning);\n\n\t\t\t\t\t// If Array has only Objects\n\t\t\t\t\tif (message.every(msg => typeof msg === 'object') && msg !== null) {\n\t\t\t\t\t\treturn message.every(msg => {\n\t\t\t\t\t\t\tif (msg.hasOwnProperty('data') && msg.data.hasOwnProperty('retval')) {\n\t\t\t\t\t\t\t\t$fhcAlert.alertWarning(JSON.stringify(msg.data.retval));\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t$fhcAlert.alertSystemError(JSON.stringify(msg));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Message is Object with data property\n\t\t\t\tif (typeof message === 'object' && message !== null){\n\t\t\t\t\tif (message.hasOwnProperty('data') && message.data.hasOwnProperty('retval')) {\n\t\t\t\t\t\t// NOTE(chris): changed: alertSystemError => alertWarning\n\t\t\t\t\t\t$fhcAlert.alertWarning(JSON.stringify(message.data.retval));\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$fhcAlert.alertSystemError(JSON.stringify(message));\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Fallback\n\t\t\t\t$fhcAlert.alertSystemError('alertSystemError throws Generic Error\\r\\nError Controller Path: ' + FHC_JS_DATA_STORAGE_OBJECT.called_path + '/' + FHC_JS_DATA_STORAGE_OBJECT.called_method);\n\t\t\t},\n\t\t\tresetFormValidation(form) {\n\t\t\t\tconst event = new Event('fhc-form-reset');\n\t\t\t\tform.querySelectorAll(['[data-fhc-form-validate],[data-fhc-form-error]']).forEach(el => el.dispatchEvent(event));\n\t\t\t\t/*const alert = form.querySelector('div.alert.alert-danger[role=\"alert\"]');\n\t\t\t\tif (alert) {\n\t\t\t\t\talert.innerHTML = '';\n\t\t\t\t\talert.classList.add('d-none');\n\t\t\t\t}\n\t\t\t\tform.querySelectorAll('.invalid-feedback').forEach(n => n.remove());\n\t\t\t\tform.querySelectorAll('.is-invalid').forEach(n => n.classList.remove('is-invalid'));\n\t\t\t\tform.querySelectorAll('.is-valid').forEach(n => n.classList.remove('is-valid'));*/\n\t\t\t},\n\t\t\thandleFormValidation(error, form) {\n\t\t\t\tif (form === undefined) {\n\t\t\t\t\tif (error && error.nodeType === Node.ELEMENT_NODE)\n\t\t\t\t\t\treturn err => $fhcAlert.handleFormValidation(err, error);\n\t\t\t\t} else {\n\t\t\t\t\tif (error?.response?.status == 400) {\n\t\t\t\t\t\tlet errors = CoreRESTClient.getError(error.response.data);\n\t\t\t\t\t\tif (typeof errors !== \"object\")\n\t\t\t\t\t\t\terrors = error.response.data;\n\n\t\t\t\t\t\t// NOTE(chris): reset form validation\n\t\t\t\t\t\t$fhcAlert.resetFormValidation(form);\n\t\t\t\t\t\t\n\t\t\t\t\t\t// NOTE(chris): set form input validation\n\t\t\t\t\t\tconst notFound = Object.entries(errors).filter(([key, detail]) => {\n\t\t\t\t\t\t\tconst input = form.querySelector('[data-fhc-form-validate=\"' + key + '\"]');\n\t\t\t\t\t\t\tif (!input)\n\t\t\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t\t\tinput.dispatchEvent(new CustomEvent('fhc-form-invalidate', {detail}));\n\n\t\t\t\t\t\t\t/*const input = form.querySelector('[name=\"' + key + '\"]');\n\t\t\t\t\t\t\tif (!input)\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\tinput.classList.add('is-invalid');\n\t\t\t\t\t\t\tconst feedback = document.createElement('div');\n\t\t\t\t\t\t\tfeedback.classList.add('invalid-feedback');\n\t\t\t\t\t\t\tfeedback.innerHTML = detail;\n\t\t\t\t\t\t\tinput.after(feedback);*/\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}).map(arr => arr[1]);\n\n\n\t\t\t\t\t\t//const alert = form.querySelector('div.alert.alert-danger[role=\"alert\"]');\n\t\t\t\t\t\tconst alert = form.querySelector('[data-fhc-form-error]');\n\t\t\t\t\t\tif (alert && notFound.length) {\n\t\t\t\t\t\t\talert.dispatchEvent(new CustomEvent('fhc-form-error', {detail: notFound}));\n\t\t\t\t\t\t\t/*notFound.forEach(txt => {\n\t\t\t\t\t\t\t\tconst p = document.createElement('p');\n\t\t\t\t\t\t\t\tp.innerHTML = txt;\n\t\t\t\t\t\t\t\talert.append(p);\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tif (notFound.length) {\n\t\t\t\t\t\t\t\talert.lastChild.classList.add('mb-0');\n\t\t\t\t\t\t\t\talert.classList.remove('d-none');\n\t\t\t\t\t\t\t}*/\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnotFound.forEach($fhcAlert.alertError);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (error?.response?.status == 400) {\n\t\t\t\t\tlet errors = CoreRESTClient.getError(error.response.data);\n\t\t\t\t\t$fhcAlert.alertError((typeof errors === 'object') ? Object.values(errors) : errors);\n\t\t\t\t} else {\n\t\t\t\t\t$fhcAlert.handleSystemError(error);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tapp.config.globalProperties.$fhcAlert = $fhcAlert;\n\t\tapp.provide('$fhcAlert', app.config.globalProperties.$fhcAlert);\n\t}\n}","import FhcAlert from './FhcAlert.js';\n\n\nexport default {\n\tinstall: (app, options) => {\n\t\tif (app.config.globalProperties.$api) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!app.config.globalProperties.$fhcAlert)\n\t\t\tapp.use(FhcAlert);\n\n\t\tfunction _send_array_or_object(errors, func) {\n\t\t\tif (Array.isArray(errors))\n\t\t\t\terrors.forEach(func);\n\t\t\telse\n\t\t\t\tObject.entries(errors).forEach(\n\t\t\t\t\t([title, errs]) => errs.forEach(\n\t\t\t\t\t\terror => func(error, title)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t}\n\t\tlet DEFAULT_ERROR_CONFIG = {\n\t\t\tsuccess: true,\n\t\t\tfail: true,\n\t\t\tcombine: {\n\t\t\t\tform: ['validation', 'general'],\n\t\t\t\ttoast: ['validation', 'general', 'not_found', 'site_failed']\n\t\t\t},\n\t\t\thandler: {\n\t\t\t\tform(form, errors) {\n\t\t\t\t\tform.clearValidation();\n\t\t\t\t\terrors.forEach(err => form.setFeedback(\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\terr.messages || err.message\n\t\t\t\t\t));\n\t\t\t\t},\n\t\t\t\tasync toast(errors) {\n\t\t\t\t\tconst $p = app.config.globalProperties.$p;\n\t\t\t\t\tif (!$p)\n\t\t\t\t\t\treturn Promise.reject('Phrasen plugin not loaded!');\n\t\t\t\t\n\t\t\t\t\tasync function _format_toast(errors) {\n\t\t\t\t\t\terrors = errors.reduce((result, err) => {\n\t\t\t\t\t\t\tswitch (err.type) {\n\t\t\t\t\t\t\tcase 'not_found':\n\t\t\t\t\t\t\tcase 'site_failed':\n\t\t\t\t\t\t\t\tif (err.message)\n\t\t\t\t\t\t\t\t\tresult[err.message] = [err.url];\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tresult._default = [err.url];\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'general':\n\t\t\t\t\t\t\t\tif (!result._default)\n\t\t\t\t\t\t\t\t\tresult._default = [];\n\t\t\t\t\t\t\t\tresult._default.push(err.message);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'validation':\n\t\t\t\t\t\t\t\tObject.entries(err.messages)\n\t\t\t\t\t\t\t\t\t.forEach(([field, msg]) => {\n\t\t\t\t\t\t\t\t\t\tif (!result[field])\n\t\t\t\t\t\t\t\t\t\t\tresult[field] = [];\n\t\t\t\t\t\t\t\t\t\tif (Array.isArray(msg))\n\t\t\t\t\t\t\t\t\t\t\tresult[field].push(...msg);\n\t\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\t\tresult[field].push(msg);\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t}, {});\n\t\t\t\t\t\tlet counter = 0;\n\t\t\t\t\t\tconst msgs = await Promise.all(Object.entries(errors)\n\t\t\t\t\t\t\t.sort((a, b) => ['_default'].indexOf(b[0]) - ['_default'].indexOf(a[0])) // sort _default first\n\t\t\t\t\t\t\t.map(async ([field, msgs]) => {\n\t\t\t\t\t\t\t\tif (field == '_default') {\n\t\t\t\t\t\t\t\t\tawait $p.loadCategory('dashboard');\n\t\t\t\t\t\t\t\t\tconst general = $p.t('dashboard/general');\n\t\t\t\t\t\t\t\t\tfield = '
    ' + general + '
    ';\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tfield = '
    ' + field + '
    ';\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tcounter += msgs.length;\n\t\t\t\t\t\t\t\treturn field\n\t\t\t\t\t\t\t\t\t+ '
    '\n\t\t\t\t\t\t\t\t\t+ msgs.join('
    ')\n\t\t\t\t\t\t\t\t\t+ '
    ';\n\t\t\t\t\t\t\t}));\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcounter,\n\t\t\t\t\t\t\tmsgs\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlet counter, msgs;\n\t\t\t\t\tif (Array.isArray(errors)) {\n\t\t\t\t\t\t({ counter, msgs } = await _format_toast(errors));\n\t\t\t\t\t} else {\n\t\t\t\t\t\t({ counter, msgs } = await Object.entries(errors)\n\t\t\t\t\t\t\t.reduce(async (res, [title, errs]) => {\n\t\t\t\t\t\t\t\tconst result = await res;\n\t\t\t\t\t\t\t\tconst { counter, msgs } = await _format_toast(errs);\n\t\t\t\t\t\t\t\tresult.counter += counter;\n\t\t\t\t\t\t\t\tresult.msgs.push('
    '\n\t\t\t\t\t\t\t\t\t+ title\n\t\t\t\t\t\t\t\t\t+ '
    '\n\t\t\t\t\t\t\t\t\t+ msgs.join('')\n\t\t\t\t\t\t\t\t\t+ '
    ');\n\t\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t\t}, Promise.resolve({ counter: 0, msgs: []})));\n\t\t\t\t\t}\n\n\t\t\t\t\tawait $p.loadCategory('ui');\n\t\t\t\t\tconst n_errors = $p.t('ui/n_errors', { n: counter });\n\n\t\t\t\t\tapp.config.globalProperties.$fhcAlert.alertDefault(\n\t\t\t\t\t\t'error',\n\t\t\t\t\t\tn_errors,\n\t\t\t\t\t\t'
    ' + msgs.join('') + '
    ',\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\tphp(errors) {\n\t\t\t\t\t_send_array_or_object(errors, (error, title) => {\n\t\t\t\t\t\tvar message = '';\n\t\t\t\t\t\tmessage += 'Message: ' + error.message + '\\n\\n';\n\t\t\t\t\t\tmessage += 'Filename: ' + error.filename + '\\n';\n\t\t\t\t\t\tmessage += 'Line Number: ' + error.line + '\\n';\n\t\t\t\t\t\tif (error.backtrace && error.backtrace.length) {\n\t\t\t\t\t\t\tmessage += '\\nBacktrace: ';\n\t\t\t\t\t\t\terror.backtrace.forEach(err => {\n\t\t\t\t\t\t\t\tmessage += '\\n\\tFile: ' + err.file + '\\n';\n\t\t\t\t\t\t\t\tmessage += '\\tLine: ' + err.line + '\\n';\n\t\t\t\t\t\t\t\tmessage += '\\tFunction: ' + err.function + '\\n';\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tswitch (error.severity) {\n\t\t\t\t\t\t\tcase 'Warning':\n\t\t\t\t\t\t\tcase 'Core Warning':\n\t\t\t\t\t\t\tcase 'Compile Warning':\n\t\t\t\t\t\t\tcase 'User Warning':\n\t\t\t\t\t\t\t\tif (title)\n\t\t\t\t\t\t\t\t\ttitle += ': PHP ' + error.severity;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\ttitle = 'PHP ' + error.severity;\n\t\t\t\t\t\t\t\tapp.config.globalProperties.$fhcAlert.alertDefault('warn', title, message, true);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'Notice':\n\t\t\t\t\t\t\tcase 'User Notice':\n\t\t\t\t\t\t\tcase 'Runtime Notice':\n\t\t\t\t\t\t\t\tif (title)\n\t\t\t\t\t\t\t\t\ttitle += ': PHP ' + error.severity;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\ttitle = 'PHP ' + error.severity;\n\t\t\t\t\t\t\t\tapp.config.globalProperties.$fhcAlert.alertDefault('info', title, message, true);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tmessage = 'Type: PHP ' + error.severity + '\\n\\n' + message;\n\t\t\t\t\t\t\t\tif (title)\n\t\t\t\t\t\t\t\t\tmessage = title + '\\n\\n' + message;\n\t\t\t\t\t\t\t\tapp.config.globalProperties.$fhcAlert.alertSystemError(message);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\texception(errors) {\n\t\t\t\t\t_send_array_or_object(errors, (error, title) => {\n\t\t\t\t\t\tvar message = '';\n\t\t\t\t\t\tif (title)\n\t\t\t\t\t\t\tmessage += title + '\\n\\n';\n\t\t\t\t\t\tmessage += 'Type: ' + error.class + '\\n\\n';\n\t\t\t\t\t\tmessage += 'Message: ' + error.message + '\\n\\n';\n\t\t\t\t\t\tmessage += 'Filename: ' + error.filename + '\\n';\n\t\t\t\t\t\tmessage += 'Line Number: ' + error.line + '\\n';\n\t\t\t\t\t\tif (error.backtrace && error.backtrace.length) {\n\t\t\t\t\t\t\tmessage += '\\nBacktrace: ';\n\t\t\t\t\t\t\terror.backtrace.forEach(err => {\n\t\t\t\t\t\t\t\tmessage += '\\n\\tFile: ' + err.file + '\\n';\n\t\t\t\t\t\t\t\tmessage += '\\tLine: ' + err.line + '\\n';\n\t\t\t\t\t\t\t\tmessage += '\\tFunction: ' + err.function + '\\n';\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tapp.config.globalProperties.$fhcAlert.alertSystemError(message);\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tdb(errors) {\n\t\t\t\t\t_send_array_or_object(errors, (error, title) => {\n\t\t\t\t\t\tvar message = '';\n\t\t\t\t\t\tif (title)\n\t\t\t\t\t\t\tmessage += title + '\\n\\n';\n\t\t\t\t\t\tif (error.heading !== undefined)\n\t\t\t\t\t\t\tmessage += error.heading + '\\n\\n';\n\t\t\t\t\t\tif (error.code !== undefined)\n\t\t\t\t\t\t\tmessage += 'Code: ' + error.code + '\\n\\n';\n\t\t\t\t\t\tif (error.sql !== undefined)\n\t\t\t\t\t\t\tmessage += 'SQL: ' + error.sql + '\\n\\n';\n\t\t\t\t\t\tif (error.message !== undefined)\n\t\t\t\t\t\t\tmessage += 'Message: ' + error.message + '\\n\\n';\n\t\t\t\t\t\telse if (error.messages !== undefined)\n\t\t\t\t\t\t\tmessage += 'Messages: ' + error.messages.join('\\n\\t') + '\\n\\n';\n\t\t\t\t\t\tif (error.filename !== undefined)\n\t\t\t\t\t\t\tmessage += 'Filename: ' + error.filename + '\\n';\n\t\t\t\t\t\tif (error.line !== undefined)\n\t\t\t\t\t\t\tmessage += 'Line Number: ' + error.line + '\\n';\n\n\t\t\t\t\t\tapp.config.globalProperties.$fhcAlert.alertSystemError(message);\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tauth(errors) {\n\t\t\t\t\t_send_array_or_object(errors, (error, title) => {\n\t\t\t\t\t\tif (title)\n\t\t\t\t\t\t\ttitle += ': ' + error.message;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\ttitle = error.message;\n\n\t\t\t\t\t\tvar message = '';\n\t\t\t\t\t\tmessage += 'Controller name: ' + error.controller + '\\n';\n\t\t\t\t\t\tmessage += 'Method name: ' + error.method + '\\n';\n\t\t\t\t\t\tmessage += 'Required permissions: ' + error.required_permissions;\n\n\t\t\t\t\t\tapp.config.globalProperties.$fhcAlert.alertDefault(\n\t\t\t\t\t\t\t'error',\n\t\t\t\t\t\t\ttitle,\n\t\t\t\t\t\t\tmessage,\n\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tif (options?.errorHandling !== undefined)\n\t\t\tDEFAULT_ERROR_CONFIG = _merge_error_config(options.errorHandling);\n\t\t\n\t\tfunction get_config(form, uri, data, config) {\n\t\t\tif (typeof form == 'string' && config === undefined) {\n\t\t\t\t[uri, data, config] = [form, uri, data];\n\t\t\t\tform = undefined;\n\t\t\t} else if (form) {\n\t\t\t\tif (typeof form != 'object')\n\t\t\t\t\tthrow new TypeError('Parameter 1 of _get_config must be an object or a string');\n\t\t\t\tif (uri === undefined && data === undefined && config === undefined) {\n\t\t\t\t\tconfig = form;\n\t\t\t\t\tform = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (form) {\n\t\t\t\t// NOTE(chris): check if form is fhc-form\n\t\t\t\tif (!form.clearValidation || !form.setFeedback)\n\t\t\t\t\tthrow new TypeError(\"'form' is not a Form Component\");\n\n\t\t\t\tform = {\n\t\t\t\t\tclearValidation: form.clearValidation,\n\t\t\t\t\tsetFeedback: form.setFeedback\n\t\t\t\t};\n\n\t\t\t\tif (config)\n\t\t\t\t\tconfig.form = form;\n\t\t\t\telse\n\t\t\t\t\tconfig = {form};\n\t\t\t}\n\n\t\t\treturn [uri, data, config];\n\t\t}\n\t\tfunction clean_return_value(response) {\n\t\t\tif (typeof response.data === 'string' || response.data instanceof String)\n\t\t\t\treturn clean_return_value({ data: response });\n\n\t\t\tconst result = response.data;\n\t\t\tdelete response.data;\n\t\t\tif (!result)\n\t\t\t\treturn {meta: {response}, data: null};\n\t\t\tif (!result.meta)\n\t\t\t\tresult.meta = { response };\n\t\t\telse\n\t\t\t\tresult.meta.response = response;\n\t\t\treturn result;\n\t\t}\n\t\tfunction _merge_error_config(config) {\n\t\t\tif (config === false || config === 'off')\n\t\t\t\treturn { ...DEFAULT_ERROR_CONFIG, success: false, fail: false };\n\t\t\t\n\t\t\tif (!config || config === true)\n\t\t\t\treturn { ...DEFAULT_ERROR_CONFIG };\n\n\t\t\tif (config === 'success')\n\t\t\t\treturn { ...DEFAULT_ERROR_CONFIG, fail: false };\n\t\t\t\n\t\t\tif (config === 'fail')\n\t\t\t\treturn { ...DEFAULT_ERROR_CONFIG, success: false };\n\t\t\t\n\t\t\tconst { success, fail, handler, combine } = config;\n\t\t\t\n\t\t\tconfig = { ...DEFAULT_ERROR_CONFIG };\n\n\t\t\tObject.entries({ fail, success }).forEach(([key, value]) => {\n\t\t\t\tif (value !== undefined)\n\t\t\t\t\tconfig[key] = value;\n\t\t\t});\n\t\t\tObject.entries({ handler, combine }).forEach(([key, value]) => {\n\t\t\t\tif (value !== undefined)\n\t\t\t\t\tconfig[key] = { ...config[key], ...value };\n\t\t\t});\n\n\t\t\treturn config;\n\t\t}\n\t\tfunction get_error_handler(config) {\n\t\t\tconst result = _merge_error_config(config?.errorHandling);\n\n\t\t\tif (!config?.form) {\n\t\t\t\tresult.combine = { ...result.combine, form: [] };\n\t\t\t} else {\n\t\t\t\tconst formHandler = result.handler.form;\n\t\t\t\tresult.handler = { ...result.handler, form: errors => formHandler(config.form, errors) };\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\t\tfunction get_error_list(error) {\n\t\t\tif (error.response) {\n\t\t\t\tif (error.response.status == 404) {\n\t\t\t\t\treturn [{\n\t\t\t\t\t\ttype: 'not_found',\n\t\t\t\t\t\tmessage: error.message,\n\t\t\t\t\t\turl: error.request.responseURL\n\t\t\t\t\t}];\n\t\t\t\t} else {\n\t\t\t\t\tif (error.response.data.errors == undefined) return [];\n\t\t\t\t\treturn error.response.data.errors;\n\t\t\t\t}\n\t\t\t} else if (error.request) {\n\t\t\t\treturn [{\n\t\t\t\t\ttype: 'site_failed',\n\t\t\t\t\tmessage: error.message,\n\t\t\t\t\turl: error.request.responseURL\n\t\t\t\t}];\n\t\t\t} else {\n\t\t\t\treturn [{\n\t\t\t\t\ttype: 'script',\n\t\t\t\t\tmessage: error.message\n\t\t\t\t}];\n\t\t\t}\n\t\t}\n\t\tfunction popHandleableErrors(errorHandling, errors) {\n\t\t\tconst result = {};\n\t\t\tconst copy = [];\n\n\t\t\tif (errors == undefined) return {};\n\n\t\t\twhile (errors.length)\n\t\t\t\tcopy.push(errors.pop());\n\t\t\tfor (var error of copy) {\n\t\t\t\tlet type = error.type;\n\t\t\t\tlet newType = null;\n\t\t\t\tfor (var t in errorHandling.combine) {\n\t\t\t\t\tlet newTypeCombinesType = errorHandling\n\t\t\t\t\t\t.combine[t]\n\t\t\t\t\t\t.includes(type);\n\t\t\t\t\tlet newTypeHasHandler = errorHandling.handler[t];\n\t\t\t\t\tif (newTypeCombinesType && newTypeHasHandler) {\n\t\t\t\t\t\tnewType = t;\n\t\t\t\t\t\tif (newType == 'form')\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (newType)\n\t\t\t\t\ttype = newType;\n\t\t\t\tconst handler = errorHandling.handler[type];\n\t\t\t\tif (handler) {\n\t\t\t\t\tif (!result[type])\n\t\t\t\t\t\tresult[type] = [];\n\t\t\t\t\tif (Array.isArray(error))\n\t\t\t\t\t\tresult[type].push(...error);\n\t\t\t\t\telse\n\t\t\t\t\t\tresult[type].push(error);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\terrors.push(error);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t\t\n\t\t\n\t\tconst fhcApiAxios = axios.create({\n\t\t\ttimeout: 500000,\n\t\t\tbaseURL: FHC_JS_DATA_STORAGE_OBJECT.app_root\n\t\t\t\t+ FHC_JS_DATA_STORAGE_OBJECT.ci_router\n\t\t\t\t+ \"/\"\n\t\t});\n\n\t\tfhcApiAxios.interceptors.request.use(config => {\n\t\t\tif (config.method != 'post' || !config.data)\n\t\t\t\treturn config;\n\n\t\t\tif (config.data instanceof FormData)\n\t\t\t\treturn config;\n\n\t\t\tif (!Object.values(config.data).every(item => {\n\t\t\t\tif (item instanceof FileList)\n\t\t\t\t\treturn false;\n\t\t\t\tif (Array.isArray(item))\n\t\t\t\t\treturn item.every(i => !(i instanceof File));\n\t\t\t\treturn true;\n\t\t\t})) {\n\t\t\t\tconst newData = Object.entries(config.data).reduce((nd, [key, item]) => {\n\t\t\t\t\tif (item instanceof FileList) {\n\t\t\t\t\t\tfor (const file of item)\n\t\t\t\t\t\t\tnd.FormData.append(key + (item.length > 1 ? '[]' : ''), file);\n\t\t\t\t\t} else if (Array.isArray(item)) {\n\t\t\t\t\t\tif (item.every(i => !(i instanceof File))) {\n\t\t\t\t\t\t\tnd.jsondata[key] = item;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\titem.forEach(file => nd.FormData.append(key + (item.length > 1 ? '[]' : ''), file));\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnd.jsondata[key] = item;\n\t\t\t\t\t}\n\t\t\t\t\treturn nd;\n\t\t\t\t}, {\n\t\t\t\t\tFormData: new FormData(),\n\t\t\t\t\tjsondata: {}\n\t\t\t\t});\n\t\t\t\tnewData.FormData.append('_jsondata', JSON.stringify(newData.jsondata));\n\t\t\t\tconfig.data = newData.FormData;\n\t\t\t}\n\n\t\t\treturn config;\n\t\t});\n\n\t\tfhcApiAxios.interceptors.response.use(\n\t\t\tresponse => {\n\t\t\t\tif (response.config?.errorHandling == 'off'\n\t\t\t\t\t|| response.config?.errorHandling === false\n\t\t\t\t\t|| response.config?.errorHandling == 'fail')\n\t\t\t\t\treturn clean_return_value(response);\n\n\t\t\t\t// NOTE(chris): loop through errors\n\t\t\t\tif (response.data.errors)\n\t\t\t\t\tresponse.data.errors = response.data.errors.filter(\n\t\t\t\t\t\terr => (response.config[err.type + 'ErrorHandler'] || app.config.globalProperties.$api._defaultErrorHandlers[err.type])(err, response.config)\n\t\t\t\t\t);\n\n\t\t\t\treturn clean_return_value(response);\n\t\t\t},\n\t\t\terror => {\n\t\t\t\tif (error.code == 'ERR_CANCELED')\n\t\t\t\t\treturn Promise.reject({ handled: true, ...error });\n\n\t\t\t\tconst errorConfig = get_error_handler(error.config);\n\n\t\t\t\tif (!errorConfig.fail)\n\t\t\t\t\treturn Promise.reject(error);\n\n\t\t\t\tconst remaining = get_error_list(error);\n\n\t\t\t\tconst errors = popHandleableErrors(errorConfig, remaining);\n\n\t\t\t\tfor (var type in errors) {\n\t\t\t\t\terrorConfig.handler[type](errors[type]);\n\t\t\t\t}\n\n\t\t\t\tif (remaining.length)\n\t\t\t\t\treturn Promise.reject(error);\n\t\t\t\t\n\t\t\t\treturn Promise.reject({ handled: true, ...error });\n\t\t\t}\n\t\t);\n\n\t\tapp.config.globalProperties.$api = {\n\t\t\tgetUri(url) {\n\t\t\t\treturn fhcApiAxios.getUri({url});\n\t\t\t},\n\t\t\tget(form, uri, params, config) {\n\t\t\t\t[uri, params, config] = get_config(form, uri, params, config);\n\t\t\t\tif (params) {\n\t\t\t\t\tif (config)\n\t\t\t\t\t\tconfig.params = params;\n\t\t\t\t\telse\n\t\t\t\t\t\tconfig = {params};\n\t\t\t\t}\n\t\t\t\treturn fhcApiAxios.get(uri, config);\n\t\t\t},\n\t\t\tpost(form, uri, data, config) {\n\t\t\t\t[uri, data, config] = get_config(form, uri, data, config);\n\t\t\t\treturn fhcApiAxios.post(uri, data, config);\n\t\t\t},\n\t\t\tcall(factory, configoverwrite, form) {\n\t\t\t\tif (Array.isArray(factory)) {\n\t\t\t\t\tconst $api = app.config.globalProperties.$api;\n\n\t\t\t\t\treturn Promise\n\t\t\t\t\t\t.allSettled(factory.map((config, index) => {\n\t\t\t\t\t\t\tif (!Array.isArray(config))\n\t\t\t\t\t\t\t\tconfig = ['#' + index, config];\n\t\t\t\t\t\t\treturn $api.call(config[1], {\n\t\t\t\t\t\t\t\terrorHeader: config[0],\n\t\t\t\t\t\t\t\terrorHandling: false\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}))\n\t\t\t\t\t\t.then(result => {\n\t\t\t\t\t\t\tconst [ , , config ] = get_config(form, undefined, undefined, configoverwrite || {});\n\t\t\t\t\t\t\tconst errorConfig = get_error_handler(config);\n\n\t\t\t\t\t\t\tif (!errorConfig.success && !errorConfig.fail) {\n\t\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst typedErrors = {};\n\t\t\t\t\t\t\tfor (var res of result) {\n\t\t\t\t\t\t\t\tconst [ allowed, item ] = res.status === 'fulfilled'\n\t\t\t\t\t\t\t\t\t? [ errorConfig.success, res.value ]\n\t\t\t\t\t\t\t\t\t: [ errorConfig.fail, res.reason ];\n\t\t\t\t\t\t\t\tif (!allowed)\n\t\t\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t\t\tconst errors = popHandleableErrors(errorConfig, get_error_list(item));\n\n\t\t\t\t\t\t\t\tfor (var type in errors) {\n\t\t\t\t\t\t\t\t\tif (!typedErrors[type])\n\t\t\t\t\t\t\t\t\t\ttypedErrors[type] = {\n\t\t\t\t\t\t\t\t\t\t\t[item.config.errorHeader]: errors[type]\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\ttypedErrors[type][item.config.errorHeader] = errors[type];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tfor (var errType in typedErrors) {\n\t\t\t\t\t\t\t\terrorConfig.handler[errType](typedErrors[errType]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tlet { method, url, params, config } = factory;\n\t\t\t\tif (configoverwrite !== undefined) {\n\t\t\t\t\tconfig = configoverwrite;\n\t\t\t\t}\n\t\t\t\tif (!method) {\n\t\t\t\t\tmethod = 'get';\n\t\t\t\t}\n\t\t\t\tif (method.toLowerCase)\n\t\t\t\t\tmethod = method.toLowerCase();\n\t\t\t\tif (method == 'get') {\n\t\t\t\t\treturn this.get(form, url, params, config);\n\t\t\t\t} else if (method == 'post') {\n\t\t\t\t\treturn this.post(form, url, params, config);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(\"FhcApi: method not allowed:\", method);\n\t\t\t\t}\n\t\t\t},\n\t\t\tgetErrorHandler(config) {\n\t\t\t\treturn get_error_handler(config);\n\t\t\t}\n\t\t};\n\n\t\tapp.provide('$api', app.config.globalProperties.$api);\n\t}\n};\n","/**\n * Copyright (C) 2025 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tloadCategory(category) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/phrasen/loadModule/' + category\n\t\t};\n\t},\n\tsetLanguage(categories,language) {\n\t\tconst params = {categories, language}\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/phrasen/setLanguage',\n\t\t\tparams\n\t\t};\n\t},\n\tgetLanguage() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/phrasen/getLanguage'\n\t\t};\n\t},\n\tgetActiveDbLanguages() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/phrasen/getAllLanguages'\n\t\t};\n\t}\n};","import OldFhcApi from '../plugin/OldFhcApi.js'; // TODO(chris): remove at some point\nimport PluginsApi from './Api.js';\nimport ApiPhrasen from '../api/factory/phrasen.js';\n\nconst categories = Vue.reactive({});\nconst loadingModules = {};\nlet user_language = Vue.ref(FHC_JS_DATA_STORAGE_OBJECT.user_language);\nexport let user_locale = Vue.computed(()=>{\n\tif(!user_language.value) return null;\n\treturn FHC_JS_DATA_STORAGE_OBJECT.server_languages.find(language => language.sprache == user_language.value).LC_Time;\n});\n\nfunction extractCategory(obj, category) {\n\treturn obj.filter(e => e.category == category).reduce((res, elem) => {\n\t\tif (!res[elem.phrase])\n\t\t\tres[elem.phrase] = elem.text;\n\t\treturn res;\n\t}, {});\n}\nfunction getValueForLoadedPhrase(category, phrase, params) {\n\tlet result = categories[category][phrase];\n\tif (!result)\n\t\treturn '<< PHRASE ' + phrase + '>>';\n\tif (params)\n\t\tresult = result.replace(/\\{([^}]*)\\}/g, (match, p1) => params[p1] === undefined ? match : params[p1]);\n\treturn result;\n}\n\nconst phrasen = {\n\tuser_language,\n\tuser_locale,\n\tsetLanguage(language) {\n\t\tconst catArray = Object.keys(categories)\n\t\treturn this.config.globalProperties.$api\n\t\t\t.call(ApiPhrasen.setLanguage(catArray, language))\n\t\t\t.then(res => {\n\t\t\t\tres.data.forEach(row => {\n\t\t\t\t\tcategories[row.category][row.phrase] = row.text\n\t\t\t\t})\n\n\t\t\t\t// update the reactive data that holds the current active user_language\n\t\t\t\tuser_language.value = language;\n\n\t\t\t\treturn res\n\t\t\t})\n\t},\n\tloadCategory(category) {\n\t\tif (Array.isArray(category))\n\t\t\treturn Promise.all(category.map(this.config.globalProperties\n\t\t\t\t.$p.loadCategory));\n\n\t\tif (!loadingModules[category])\n\t\t\tloadingModules[category] = this.config.globalProperties.$api\n\t\t\t\t.call(ApiPhrasen.loadCategory(category))\n\t\t\t\t.then(res => res?.data ? extractCategory(res.data, category) : {})\n\t\t\t\t.then(res => {\n\t\t\t\t\tcategories[category] = res;\n\t\t\t\t});\n\t\treturn loadingModules[category];\n\t},\n\tt_ref(category, phrase, params) {\n\t\tconsole.warn('deprecated');\n\t\treturn Vue.computed(() => this.t(category, phrase, params));\n\t},\n\tt(category, phrase, params) {\n\t\tif (params === undefined && (\n\t\t\t(Array.isArray(category) && category.length == 2) ||\n\t\t\t(category.split && category.split('/').length == 2))\n\t\t\t) {\n\t\t\tparams = phrase;\n\t\t\t[category, phrase] = category.split ? category.split('/') : category;\n\t\t}\n\t\tif (phrase === undefined) {\n\t\t\tconsole.error('invalid input', category, phrase, params);\n\t\t\treturn '';\n\t\t}\n\t\tlet val = Vue.computed(() => {\n\t\t\tif (!categories[category])\n\t\t\t\treturn '';\n\t\t\treturn getValueForLoadedPhrase(category, phrase, params);\n\t\t});\n\t\tif (!categories[category])\n\t\t\tthis.loadCategory(category);\n\t\treturn val.value;\n\t}\n};\n\nexport default {\n\tinstall(app, options) {\n\t\tif (!app.config.globalProperties.$fhcApi)\n\t\t\tapp.use(OldFhcApi); // TODO(chris): remove at some point\n\t\tif (!app.config.globalProperties.$api)\n\t\t\tapp.use(PluginsApi);\n\t\tapp.config.globalProperties.$p = {\n\t\t\tt: phrasen.t,\n\t\t\tloadCategory: cat => phrasen.loadCategory.call(app, cat),\n\t\t\tsetLanguage: lang => phrasen.setLanguage.call(app, lang),\n\t\t\tuser_language: user_language,\n\t\t\tuser_locale,\n\t\t\tt_ref: phrasen.t_ref\n\t\t};\n\t\tapp.provide('$p', app.config.globalProperties.$p);\n\t}\n}","import DmsItem from './Dms/Item.js';\n\nexport default {\n\tcomponents: {\n\t\tDmsItem\n\t},\n\temits: [\n\t\t'update:modelValue'\n\t],\n\tprops: {\n\t\tmodelValue: {\n\t\t\ttype: [ FileList, Array ],\n\t\t\trequired: true\n\t\t},\n\t\tmultiple: Boolean,\n\t\tid: String,\n\t\tname: String,\n\t\tinputClass: [String, Array, Object],\n\t\tnoList: Boolean,\n\t\taccept: {\n\t\t\ttype: String,\n\t\t\tdefault: ''\n\t\t},\n\t\tdisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t}\n\t},\n\tmethods: {\n\t\tstringifyFile(file) {\n\t\t\treturn JSON.stringify({\n\t\t\t\tlastModified: file.lastModified,\n\t\t\t\tlastModifiedDate: file.lastModifiedDate,\n\t\t\t\tname: file.name,\n\t\t\t\tsize: file.size,\n\t\t\t\ttype: file.type\n\t\t\t});\n\t\t},\n\t\taddFiles(event) {\n\t\t\tif (!this.multiple)\n\t\t\t\treturn this.$emit('update:modelValue', event.target.files);\n\t\t\t\n\t\t\tconst dt = new DataTransfer();\n\t\t\tconst doubles = [];\n\t\t\tfor (var file of this.modelValue) {\n\t\t\t\tdt.items.add(file);\n\t\t\t\tdoubles.push(this.stringifyFile(file));\n\t\t\t}\n\t\t\tfor (var file of event.target.files) {\n\t\t\t\t// NOTE(chris): deep check (with FileReader) would require an async function so we only check the basic attributes\n\t\t\t\tif (doubles.indexOf(this.stringifyFile(file)) < 0)\n\t\t\t\t\tdt.items.add(file);\n\t\t\t}\n\t\t\tthis.$emit('update:modelValue', dt.files);\n\t\t},\n\t\tremoveFile(id) {\n\t\t\tconst fileToRemove = Array.from(this.modelValue)[id];\n\t\t\t\n\t\t\tconst dt = new DataTransfer();\n\t\t\tfor (var file of this.modelValue) {\n\t\t\t\tif (file !== fileToRemove)\n\t\t\t\t\tdt.items.add(file);\n\t\t\t}\n\t\t\tthis.$emit('update:modelValue', dt.files);\n\t\t}\n\t},\n\twatch: {\n\t\tmodelValue(n) {\n\t\t\tif (!n)\n\t\t\t\treturn;\n\t\t\tif (n instanceof FileList) {\n\t\t\t\tif (!this.$refs.upload) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn this.$refs.upload.files = n;\n\t\t\t}\n\n\t\t\tconst dt = new DataTransfer();\n\t\t\tconst dms = [];\n\t\t\tfor (var file of n) {\n\t\t\t\tif (file instanceof File) {\n\t\t\t\t\tdt.items.add(file);\n\t\t\t\t} else {\n\t\t\t\t\tconst dmsFile = new File([JSON.stringify(file)], file.name, {\n\t\t\t\t\t\ttype: 'application/x.fhc-dms+json'\n\t\t\t\t\t});\n\t\t\t\t\tdt.items.add(dmsFile);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.$emit('update:modelValue', dt.files);\n\t\t}\n\t},\n\ttemplate: `\n\t
    \n\t\t\n\t\t
      \n\t\t\t\n\t\t\t\n\t\t
    \n\t
    `\n}","export default {\n\temits: [\n\t\t'delete'\n\t],\n\tprops: {\n\t\tmodelValue: {\n\t\t\ttype: [File, Object],\n\t\t\trequired: true\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tpreview: ''\n\t\t};\n\t},\n\twatch: {\n\t\tmodelValue(n) {\n\t\t\tif (n.type == 'application/x.fhc-dms+json') {\n\t\t\t\tn.text().then(result => {\n\t\t\t\t\tconst obj = JSON.parse(result);\n\t\t\t\t\tthis.preview = obj.preview || '';\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t},\n\ttemplate: `\n\t
  • \n\t\t\n\t\t{{ modelValue.name }}\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t
  • `\n}\n","//import Phrasen from '../../plugin/Phrasen.js';\n\nexport default {\n\tname: 'BootstrapModal',\n\tdata: () => ({\n\t\tmodal: null,\n\t\tfullscreen: false\n\t}),\n\tprops: {\n\t\tbackdrop: {\n\t\t\ttype: [Boolean,String],\n\t\t\tdefault: true,\n\t\t\tvalidator(value) {\n\t\t\t\treturn ['static', true, false].includes(value);\n\t\t\t}\n\t\t},\n\t\tfocus: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true\n\t\t},\n\t\tkeyboard: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true\n\t\t},\n\t\tnoCloseBtn: Boolean,\n\t\tdialogClass: [String,Array,Object],\n\t\theaderClass: {\n\t\t\ttype: [String,Array,Object],\n\t\t\tdefault: ''\n\t\t},\n\t\tbodyClass: {\n\t\t\ttype: [String,Array,Object],\n\t\t\tdefault: 'px-4 py-5'\n\t\t},\n\t\tfooterClass: {\n\t\t\ttype: [String,Array,Object],\n\t\t\tdefault: ''\n\t\t},\n\t\tallowFullscreenExpand: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t}\n\t},\n\temits: [\n\t\t\"hideBsModal\",\n\t\t\"hiddenBsModal\",\n\t\t\"hidePreventedBsModal\",\n\t\t\"showBsModal\",\n\t\t\"shownBsModal\",\n\t\t\"toggleFullscreen\"\n\t],\n\tmethods: {\n\t\tdispose() {\n\t\t\treturn this.modal.dispose();\n\t\t},\n\t\thandleUpdate() {\n\t\t\treturn this.modal.handleUpdate();\n\t\t},\n\t\thide() {\n\t\t\treturn this.modal.hide();\n\t\t},\n\t\tshow(relatedTarget) {\n\t\t\treturn this.modal.show(relatedTarget);\n\t\t},\n\t\ttoggle() {\n\t\t\treturn this.modal.toggle();\n\t\t},\n\t\ttoggleFullscreen() {\n\t\t\tthis.fullscreen = !this.fullscreen\n\t\t\tthis.$emit('toggleFullscreen')\n\t\t}\n\t},\n\tmounted() {\n\t\tif (this.$refs.modal)\n\t\t\tthis.modal = new bootstrap.Modal(this.$refs.modal, {\n\t\t\t\tbackdrop: this.backdrop,\n\t\t\t\tfocus: this.focus,\n\t\t\t\tkeyboard: this.keyboard\n\t\t\t});\n\t},\n\tpopup(body, options, title, footer) {\n\t\tconst BsModal = this,\n\t\t\tslots = {};\n\t\tif (body !== undefined)\n\t\t\tslots.default = () => body;\n\t\tif (title !== undefined)\n\t\t\tslots.title = () => title;\n\t\tif (footer !== undefined)\n\t\t\tslots.footer = () => footer;\n\n\t\t// little hack to check whether primevue is included in the app or not\n\t\tlet includedPrimevue = false;\n\t\tif(typeof primevue !== 'undefined'){\n\t\t\tincludedPrimevue = true;\n\t\t}\n\n\t\treturn new Promise((resolve,reject) => {\n\t\t\tconst instance = Vue.createApp({\n\t\t\t\tname: 'ModalTmpApp',\n\t\t\t\tsetup() {\n\t\t\t\t\treturn () => Vue.h(BsModal, {...{\n\t\t\t\t\t\tclass: 'fade'\n\t\t\t\t\t},...options, ...{\n\t\t\t\t\t\tref: 'modal',\n\t\t\t\t\t\t'onHidden.bs.modal': instance.unmount\n\t\t\t\t\t}}, slots);\n\t\t\t\t},\n\t\t\t\tmounted() {\n\t\t\t\t\tthis.$refs.modal.show();\n\t\t\t\t\t\n\t\t\t\t},\n\t\t\t\tbeforeUnmount() {\n\t\t\t\t\tif (this.$refs.modal)\n\t\t\t\t\t\tthis.$refs.modal.result !== false ? resolve(this.$refs.modal.result) : reject();\n\t\t\t\t},\n\t\t\t\tunmounted() {\n\t\t\t\t\twrapper.parentElement.removeChild(wrapper);\n\t\t\t\t}\n\t\t\t});\n\t\t\tconst wrapper = document.createElement(\"div\");\n\t\t\t\n\t\t\t// if(primevue) --> won't work because primevue is not defined in this scope and promise would be rejected\n\t\t\tif (includedPrimevue){\n\t\t\t\tinstance.use(primevue.config.default, {zIndex: {overlay: 9999}})\n\t\t\t}\n\t\t\t\t \n\t\t\t//instance.use(Phrasen); // TODO(chris): find a more dynamic way\n\t\t\timport('../../plugins/Phrasen.js').then((Phrasen) => {\n\t\t\t\tinstance.use(Phrasen.default);\n\t\t\t\tinstance.mount(wrapper);\n\t\t\t\tdocument.body.appendChild(wrapper);\n\t\t\t});\n\t\t});\n\t},\n\ttemplate: `
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    `\n}\n","export default {\n\tgetConfig() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Abgabe/getConfig'\n\t\t};\n\t},\n\tgetConfigStudent() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Abgabe/getConfigStudent'\n\t\t};\n\t},\n\tgetStudentProjektarbeiten(uid) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Abgabe/getStudentProjektarbeiten',\n\t\t\tparams: { uid }\n\t\t};\n\t},\n\tgetStudentProjektabgaben(detail) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Abgabe/getStudentProjektabgaben',\n\t\t\tparams: { projektarbeit_id: detail.projektarbeit_id, student_uid: detail.student_uid }\n\t\t};\n\t},\n\tpostStudentProjektarbeitEndupload(formData) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/Abgabe/postStudentProjektarbeitEndupload',\n\t\t\tparams: formData,\n\t\t\tconfig: {Headers: { \"Content-Type\": \"multipart/form-data\" }}\n\t\t};\n\t},\n\tpostStudentProjektarbeitZwischenabgabe(formData) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/Abgabe/postStudentProjektarbeitZwischenabgabe',\n\t\t\tparams: formData,\n\t\t\tconfig: {Headers: { \"Content-Type\": \"multipart/form-data\" }}\n\t\t};\n\t},\n\tgetMitarbeiterProjektarbeiten(all) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Abgabe/getMitarbeiterProjektarbeiten',\n\t\t\tparams: { showall: all }\n\t\t};\n\t},\n\tpostProjektarbeitAbgabe(termin) {\n\t\t\n\t\tlet dateString = termin.datum\n\t\tif(termin.datum instanceof Date) {\n\t\t\tconst year = termin.datum.getFullYear();\n\t\t\tconst month = String(termin.datum.getMonth() + 1).padStart(2, '0');\n\t\t\tconst day = String(termin.datum.getDate()).padStart(2, '0');\n\n\t\t\tdateString = `${year}-${month}-${day}`\n\t\t}\n\t\t\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/Abgabe/postProjektarbeitAbgabe',\n\t\t\tparams: { \n\t\t\t\tpaabgabe_id: termin.paabgabe_id,\n\t\t\t\tpaabgabetyp_kurzbz: termin.bezeichnung.paabgabetyp_kurzbz,\n\t\t\t\tdatum: dateString,\n\t\t\t\tnote: termin.note_pk,\n\t\t\t\tupload_allowed: !!termin.upload_allowed,\n\t\t\t\tbeurteilungsnotiz: termin.beurteilungsnotiz ?? '',\n\t\t\t\tfixtermin: termin.fixtermin,\n\t\t\t\tinsertvon: termin.insertvon,\n\t\t\t\tkurzbz: termin.kurzbz,\n\t\t\t\tprojektarbeit_id: termin.projektarbeit_id,\n\t\t\t\tbetreuer_person_id: termin.betreuer_person_id\n\t\t\t}\n\t\t};\n\t},\n\tdeleteProjektarbeitAbgabe(paabgabe_id) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/Abgabe/deleteProjektarbeitAbgabe',\n\t\t\tparams: { paabgabe_id }\n\t\t};\n\t},\n\tpostSerientermin(datum, paabgabetyp_kurzbz, bezeichnung, kurzbz, upload_allowed, projektarbeit_ids, fixtermin) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/Abgabe/postSerientermin',\n\t\t\tparams: { datum, paabgabetyp_kurzbz, bezeichnung, kurzbz, upload_allowed, projektarbeit_ids, fixtermin }\n\t\t};\n\t},\n\tfetchDeadlines(person_id) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/Abgabe/fetchDeadlines',\n\t\t\tparams: { person_id }\n\t\t};\n\t},\n\tgetPaAbgabetypen() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Abgabe/getPaAbgabetypen'\n\t\t};\n\t},\n\t//TODO: SWITCH TO NOTEN API ONCE NOTENTOOL IS IN MASTER TO AVOID DUPLICATE API\n\tgetNoten(){\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Abgabe/getNoten'\n\t\t};\n\t},\n\tgetProjektarbeitenForStudiengang(studiengang_kz, benotet = 0) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Abgabe/getProjektarbeitenForStudiengang',\n\t\t\tparams: { studiengang_kz, benotet }\n\t\t};\n\t},\n\t// TODO: this could also very well be generic info api\n\tgetStudiengaenge() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Abgabe/getStudiengaenge'\n\t\t};\n\t},\n\tpostStudentProjektarbeitZusatzdaten(formData) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/Abgabe/postStudentProjektarbeitZusatzdaten',\n\t\t\tparams: formData,\n\t\t\tconfig: {Headers: { \"Content-Type\": \"multipart/form-data\" }}\n\t\t};\n\t},\n\tgetSignaturStatusForProjektarbeitAbgaben(paabgabe_ids, student_uid) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/Abgabe/getSignaturStatusForProjektarbeitAbgaben',\n\t\t\tparams: {paabgabe_ids, student_uid},\n\n\t\t};\n\t}\n};","export const FhcOverlay = {\n\tname: 'FhcOverlay',\n\tprops: {\n\t\tactive: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t}\t\n\t},\n\ttemplate: `\t\n\t\t
    \n\t\t\t\n\t\t
    \n\t`\n};\nexport default FhcOverlay;","import Upload from '../../../components/Form/Upload/Dms.js';\nimport BsModal from '../../Bootstrap/Modal.js';\nimport VueDatePicker from '../../vueDatepicker.js.php';\nimport ApiAbgabe from '../../../api/factory/abgabe.js'\nimport FhcOverlay from \"../../Overlay/FhcOverlay.js\";\n\nexport const AbgabeStudentDetail = {\n\tname: \"AbgabeStudentDetail\",\n\tcomponents: {\n\t\tUpload,\n\t\tBsModal,\n\t\tInputNumber: primevue.inputnumber,\n\t\tCheckbox: primevue.checkbox,\n\t\tDropdown: primevue.dropdown,\n\t\tTextarea: primevue.textarea,\n\t\tAccordion: primevue.accordion,\n\t\tAccordionTab: primevue.accordiontab,\n\t\tMessage: primevue.message,\n\t\tInplace: primevue.inplace,\n\t\tVueDatePicker,\n\t\tFhcOverlay\n\t},\n\tinject: ['notenOptions', 'isMobile', 'isViewMode', 'moodle_link'],\n\tprops: {\n\t\tprojektarbeit: {\n\t\t\ttype: Object,\n\t\t\tdefault: null\n\t\t},\n\t\tviewMode: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tloading: false,\n\t\t\teidAkzeptiert: false,\n\t\t\tenduploadTermin: null,\n\t\t\tallActiveLanguages: FHC_JS_DATA_STORAGE_OBJECT.server_languages,\n\t\t\tform: Vue.reactive({\n\t\t\t\tsprache: '',\n\t\t\t\tabstract: '',\n\t\t\t\tabstract_en: '',\n\t\t\t\tschlagwoerter: '',\n\t\t\t\tschlagwoerter_en: '',\n\t\t\t\tkontrollschlagwoerter: '',\n\t\t\t\tseitenanzahl: 1,\n\t\t\t})\n\t\t}\n\t},\n\tmethods: {\n\t\tgetNoteBezeichnung(termin){\n\t\t\tconst noteOpt = this.notenOptions.find(opt => opt.note == termin.note)\n\t\t\t\n\t\t\tif(noteOpt?.bezeichnung) {\n\t\t\t\treturn noteOpt?.positiv ? this.$capitalize(this.$p.t('abgabetool/c4positivBenotet')) + ' ✅' : this.$capitalize(this.$p.t('abgabetool/c4negativBenotet')) + ' ❌'\n\t\t\t} else if(noteOpt?.benotbar === true && !termin.note) {\n\t\t\t\treturn this.$capitalize(this.$p.t('abgabetool/c4notYetGraded'));\n\t\t\t} else {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t},\n\t\tasync validate(termin, endupload = false) {\n\t\t\tif(!termin.file.length) {\n\t\t\t\tthis.$fhcAlert.alertWarning(this.$capitalize(this.$p.t('global/warningChooseFile')));\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t\n\t\t\tif(endupload) {\n\t\t\t\tif(await this.$fhcAlert.confirm({\n\t\t\t\t\tmessage: this.$p.t('abgabetool/confirmEnduploadSpeichern'),\n\t\t\t\t\tacceptLabel: this.$capitalize(this.$p.t('abgabetool/c4AcceptAndProceed')),\n\t\t\t\t\tacceptClass: 'p-button-primary',\n\t\t\t\t\trejectLabel: this.$capitalize(this.$p.t('abgabetool/c4Cancel')),\n\t\t\t\t\trejectClass: 'p-button-secondary'\n\t\t\t\t}) === false) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn true;\n\t\t},\n\t\tasync triggerEndupload() {\n\t\t\t\n\t\t\tif (!await this.validate(this.enduploadTermin, true))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t\n\t\t\t// post endabgabe\n\t\t\tconst formData = new FormData();\n\t\t\tformData.append('paabgabetyp_kurzbz', this.enduploadTermin.paabgabetyp_kurzbz)\n\t\t\tformData.append('projektarbeit_id', this.enduploadTermin.projektarbeit_id);\n\t\t\tformData.append('paabgabe_id', this.enduploadTermin.paabgabe_id)\n\t\t\tformData.append('student_uid', this.projektarbeit.student_uid)\n\t\t\tformData.append('bperson_id', this.projektarbeit.bperson_id)\n\t\t\t\n\t\t\tformData.append('sprache', this.form['sprache'].sprache)\n\t\t\tformData.append('abstract', this.form['abstract'])\n\t\t\tformData.append('abstract_en', this.form['abstract_en'])\n\t\t\tformData.append('schlagwoerter', this.form['schlagwoerter'])\n\t\t\tformData.append('schlagwoerter_en', this.form['schlagwoerter_en'])\n\t\t\tformData.append('seitenanzahl', this.form['seitenanzahl'])\n\t\t\t\n\t\t\tfor (let i = 0; i < this.enduploadTermin.file.length; i++) {\n\t\t\t\tformData.append('file', this.enduploadTermin.file[i]);\n\t\t\t}\n\t\t\tthis.loading = true\n\t\t\tthis.$api.call(ApiAbgabe.postStudentProjektarbeitEndupload(formData))\n\t\t\t\t.then(res => {\n\t\t\t\t\tthis.handleUploadRes(res, this.enduploadTermin)\n\t\t\t\t}).finally(()=> {\n\t\t\t\t\tthis.loading = false\n\t\t\t})\n\t\t\t\n\t\t\tthis.$refs.modalContainerEnduploadZusatzdaten.hide()\n\t\t},\n\t\tdownloadAbgabe(termin) {\n\t\t\tconst url = `/api/frontend/v1/Abgabe/getStudentProjektarbeitAbgabeFile?paabgabe_id=${termin.paabgabe_id}&student_uid=${this.projektarbeit.student_uid}&projektarbeit_id=${this.projektarbeit.projektarbeit_id}`;\n\n\t\t\twindow.open(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + url)\n\t\t\t// this.$api.call(ApiAbgabe.getStudentProjektarbeitAbgabeFile(termin.paabgabe_id, this.projektarbeit.student_uid))\n\t\t},\n\t\tformatDate(dateParam) {\n\t\t\tconst date = new Date(dateParam)\n\t\t\t// handle missing leading 0\n\t\t\tconst padZero = (num) => String(num).padStart(2, '0');\n\n\t\t\tconst month = padZero(date.getMonth() + 1); // Months are zero-based\n\t\t\tconst day = padZero(date.getDate());\n\t\t\tconst year = date.getFullYear();\n\n\t\t\treturn `${day}.${month}.${year}`\n\t\t},\n\t\tasync upload(termin) {\n\n\t\t\t// only do this on endupload\n\t\t\tif (! await this.validate(termin))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t\n\t\t\tif(termin.bezeichnung?.paabgabetyp_kurzbz === 'end') {\n\t\t\t\t// open endupload form modal for further inputs\n\t\t\t\tthis.enduploadTermin = termin\n\t\t\t\tthis.$refs.modalContainerEnduploadZusatzdaten.show()\n\t\t\t} else {\n\t\t\t\tconst formData = new FormData();\n\t\t\t\tformData.append('paabgabetyp_kurzbz', termin.paabgabetyp_kurzbz)\n\t\t\t\tformData.append('projektarbeit_id', this.projektarbeit.projektarbeit_id)\n\t\t\t\tformData.append('paabgabe_id', termin.paabgabe_id)\n\t\t\t\tformData.append('student_uid', this.projektarbeit.student_uid)\n\t\t\t\tformData.append('bperson_id', this.projektarbeit.bperson_id)\n\t\t\t\t\n\t\t\t\tfor (let i = 0; i < termin.file.length; i++) {\n\t\t\t\t\tformData.append('file', termin.file[i]);\n\t\t\t\t}\n\n\t\t\t\tthis.loading = true\n\t\t\t\tthis.$api.call(ApiAbgabe.postStudentProjektarbeitZwischenabgabe(formData))\n\t\t\t\t\t.then(res => {\n\t\t\t\t\t\tthis.handleUploadRes(res, termin)\n\t\t\t\t\t}).finally(()=> {\n\t\t\t\t\t\tthis.loading = false\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\t\thandleUploadRes(res, termin) {\n\t\t\tif(res.meta.status == \"success\") {\n\t\t\t\tthis.$fhcAlert.alertSuccess(this.$capitalize(this.$p.t('abgabetool/c4fileUploadSuccessv3')))\n\n\t\t\t\t// update 'abgabedatum' for successful upload -> shows the pdf icon and date once set\n\t\t\t\ttermin.abgabedatum = new Date().toISOString().split('T')[0];\n\t\t\t\tif(res?.data?.signatur !== undefined) {\n\t\t\t\t\ttermin.signatur = res.data.signatur\n\t\t\t\t}\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\tthis.$fhcAlert.alertError(this.$capitalize(this.$p.t('abgabetool/c4fileUploadErrorv3')))\n\t\t\t}\n\t\t\t\n\t\t\tif(res.meta.signaturInfo) {\n\t\t\t\tthis.$fhcAlert.alertInfo(res.meta.signaturInfo)\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t},\n\t\tgetOptionLabel(option) {\n\t\t\treturn option.sprache\n\t\t},\n\t\tgetTerminNoteBezeichnung(termin) {\n\t\t\tconst noteOpt = this.notenOptions.find(opt => opt.note == termin.note)\n\t\t\treturn noteOpt ? noteOpt.bezeichnung : ''\n\t\t},\n\t},\n\twatch: {\n\t\tprojektarbeit(newVal) {\n\t\t\t// default select german if projektarbeit sprache was null\n\t\t\tthis.form.sprache = newVal.sprache ? this.allActiveLanguages.find(lang => lang.sprache == newVal.sprache) : this.allActiveLanguages.find(lang => lang.sprache == 'German')\n\t\t\tthis.form.abstract = newVal.abstract ?? ''\n\t\t\tthis.form.abstract_en = newVal.abstract_en ?? ''\n\t\t\tthis.form.schlagwoerter = newVal.schlagwoerter ?? ''\n\t\t\tthis.form.schlagwoerter_en = newVal.schlagwoerter_en ?? ''\n\t\t\tthis.form.kontrollschlagwoerter = newVal.kontrollschlagwoerter ?? ''\n\t\t\tthis.form.seitenanzahl = newVal.seitenanzahl ?? 1\n\t\t\t\n\t\t}\n\t},\n\tcomputed: {\n\t\tgetMoodleLink() {\n\t\t\treturn this.moodle_link + this.projektarbeit.studiengang_kz\t\n\t\t},\n\t\tgetMessagePtStyle() {\n\t\t\t// adjust outer spacing and internal padding to appear similar to doenload button in size\n\t\t\treturn {\n\t\t\t\troot: {\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tmargin: '0px'\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\twrapper: {\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tpadding: '6px'\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tgetEid() {\n\t\t\treturn this.$capitalize(this.$p.t('abgabetool/c4eidesstattlicheErklaerung'))\n\t\t},\n\t\tallowedToSaveZusatzdaten() {\n\t\t\treturn this.form.schlagwoerter.length > 0 && this.form.schlagwoerter_en.length > 0 && this.form.abstract.length > 0 && this.form.abstract_en.length > 0 && this.form.seitenanzahl > 0\n\t\t},\n\t\tgetAllowedToSendEndupload() {\n\t\t\treturn this.eidAkzeptiert && this.allowedToSaveZusatzdaten\n\t\t},\n\t\tqualityGateTerminAvailable() {\n\t\t\tlet qgatefound = false\n\t\t\tthis.projektarbeit?.abgabetermine.forEach(abgabe => {\n\t\t\t\tif(abgabe.paabgabetyp_kurzbz == 'qualgate1'\n\t\t\t\t\t|| abgabe.paabgabetyp_kurzbz == 'qualgate2') {\n\t\t\t\t\tqgatefound = true\n\t\t\t\t}\n\t\t\t})\n\t\t\treturn qgatefound\n\t\t},\n\t\tgetTooltipVerspaetet() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4tooltipVerspaetet')),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipVerpasst() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4tooltipVerpasst')),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipAbzugeben() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4tooltipAbzugeben')),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipStandard() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4tooltipStandardv2')),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipAbgegeben() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4tooltipAbgegeben')),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipFixtermin() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4tooltipFixtermin')),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipAbgabeDetected() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4tooltipAbgabeDetected')),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipNotAllowedToUpload() {\n\t\t\tif(this.isViewMode) {\n\t\t\t\treturn {\n\t\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4studentAbgabeNotAllowedInViewMode')),\n\t\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn {\n\t\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4studentAbgabeNotAllowedRegular')),\n\t\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tgetTooltipBeurteilungerforderlich() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4tooltipBeurteilungerforderlich')),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipBestanden() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipBestanden'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipNichtBestanden() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipNichtBestanden'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t},\n\tcreated() {\n\t\t\n\t},\n\tmounted() {\n\n\t},\n\ttemplate: `\n\t\t\n\n\t\t
    \n\t\t\n\t\t\t
    {{$capitalize( $p.t('abgabetool/c4abgabeStudentenbereich') )}}
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t

    {{$capitalize( $p.t('person/student') ) }}: {{projektarbeit?.student}}

    \n\t\t\t\t\t

    {{$capitalize( $p.t('abgabetool/c4titel') ) }}: {{projektarbeit?.titel}}

    \n\t\t\t\t\t

    {{$capitalize( $p.t('abgabetool/c4betreuerv2') ) }}: {{projektarbeit ? $p.t('abgabetool/c4betrart' + projektarbeit.betreuerart_kurzbz) + ' ' + projektarbeit.betreuer : ''}}

    \n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t

    {{ $p.t('abgabetool/c4checkoutStgMoodleInfos') }} \n\t\t\t\t\t\tMoodle\n\t\t\t\t\t

    \n\t\t\t\t
    \n\t\t\t
    \n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t
    \n\t\t\t\t
    {{ $capitalize( $p.t('abgabetool/c4keineAbgabetermineGefunden') )}}
    \n\t\t\t
    \n\t\t\t\n\t\t
    \n\t \t\n\t \t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t \t\n `,\n};\n\nexport default AbgabeStudentDetail;\n","\nconst zone = 'Europe/Vienna';\nconst today = luxon.DateTime.now().setZone(zone);\n\nexport function getDateStyleClass(termin, notenOptions) {\n\tconst datum = luxon.DateTime.fromISO(termin.datum, { zone }).endOf('day');\n\tconst abgabedatum = termin.abgabedatum ? luxon.DateTime.fromISO(termin.abgabedatum, { zone }) : null;\n\ttermin.diffindays = datum.diff(today, 'days').days;\n\tconst isLate = abgabedatum && abgabedatum > datum;\n\n\t// GRADE STATUS\n\tif (termin.note) {\n\t\tconst opt = typeof termin.note === 'object' ? termin.note : notenOptions.find(nopt => nopt.note == termin.note)\n\t\tif (opt?.positiv === true) return 'bestanden';\n\t\telse if (opt?.positiv === false) return 'nichtbestanden';\n\t}\n\t\n\t// ACTION REQUIRED FOR GRADE\n\tif (termin.bezeichnung?.benotbar && datum <= today) {\n\t\treturn 'beurteilungerforderlich';\n\t}\n\n\t// SUBMISSION STATUS\n\tif (termin.upload_allowed) {\n\t\tif (termin.abgabedatum) {\n\t\t\treturn isLate ? 'verspaetet' : 'abgegeben';\n\t\t}\n\n\t\t// no submission yet\n\t\tif (datum < today) return 'verpasst';\n\t\tif (termin.diffindays <= 12) return 'abzugeben';\n\t\treturn 'standard';\n\t}\n\n\t// GENERIC STATUS\n\treturn datum < today ? 'verpasst' : 'standard';\n}","import AbgabeDetail from \"./AbgabeStudentDetail.js\";\nimport ApiAbgabe from '../../../api/factory/abgabe.js'\nimport BsModal from \"../../Bootstrap/Modal.js\";\nimport FhcOverlay from \"../../Overlay/FhcOverlay.js\";\nimport { getDateStyleClass} from \"./getDateStyleClass.js\";\n\nexport const AbgabetoolStudent = {\n\tname: \"AbgabetoolStudent\",\n\tcomponents: {\n\t\tAccordion: primevue.accordion,\n\t\tAccordionTab: primevue.accordiontab,\n\t\tBsModal,\n\t\tAbgabeDetail,\n\t\tFhcOverlay\n\t},\n\tprovide() {\n\t\treturn {\n\t\t\tnotenOptions: Vue.computed(() => this.notenOptions),\n\t\t\tisViewMode: Vue.computed(() => this.isViewMode),\n\t\t\tmoodle_link: Vue.computed(() => this.moodle_link)\n\t\t}\n\t},\n\tprops: {\n\t\tstudent_uid_prop: {\n\t\t\tdefault: null\n\t\t},\n\t\tviewData: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t\tdefault: () => ({uid: ''}),\n\t\t\tvalidator(value) {\n\t\t\t\treturn value && value.uid\n\t\t\t}\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tactiveTabIndex: [0],\n\t\t\tabgabeTypeOptions: null,\n\t\t\tphrasenPromise: null,\n\t\t\tphrasenResolved: false,\n\t\t\tloading: false,\n\t\t\tnotenOptions: null,\n\t\t\tdetail: null,\n\t\t\tprojektarbeiten: null,\n\t\t\tselectedProjektarbeit: null,\n\t\t\tmoodle_link: null\n\t\t};\n\t},\n\tmethods: {\n\t\tcheckQualityGatesStrict(termine) {\n\t\t\tlet qgate1Passed = false\n\t\t\tlet qgate2Passed = false\n\t\t\t\n\t\t\ttermine.forEach(t => {\n\t\t\t\tconst noteOption = this.notenOptions?.find(opt => opt.note == t.note)\n\t\t\t\tif(noteOption && noteOption.positiv) {\n\t\t\t\t\tif(t.paabgabetyp_kurzbz == 'qualgate1') {\n\t\t\t\t\t\tqgate1Passed = true\n\t\t\t\t\t} else if(t.paabgabetyp_kurzbz == 'qualgate2') {\n\t\t\t\t\t\tqgate2Passed = true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\n\t\t\treturn qgate1Passed && qgate2Passed\n\t\t},\n\t\tcheckQualityGatesOptional(termine) {\n\t\t\tconst qgate1found = termine.find(t => t.paabgabetyp_kurzbz == 'qualgate1')\n\t\t\tconst qgate2found = termine.find(t => t.paabgabetyp_kurzbz == 'qualgate2')\n\t\t\t\n\t\t\tlet qgate1positiv = true\n\t\t\tif(qgate1found) {\n\t\t\t\tqgate1positiv = false\n\n\t\t\t\ttermine.forEach(t => {\n\t\t\t\t\tconst noteOption = this.notenOptions?.find(opt => opt.note == t.note)\n\t\t\t\t\tif(noteOption && noteOption.positiv) {\n\t\t\t\t\t\tif (t.paabgabetyp_kurzbz == 'qualgate1') {\n\t\t\t\t\t\t\tqgate1positiv = true\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tlet qgate2positiv = true\n\t\t\tif(qgate2found) {\n\t\t\t\tqgate2positiv = false\n\n\t\t\t\ttermine.forEach(t => {\n\t\t\t\t\tconst noteOption = this.notenOptions?.find(opt => opt.note == t.note)\n\t\t\t\t\tif(noteOption && noteOption.positiv) {\n\t\t\t\t\t\tif (t.paabgabetyp_kurzbz == 'qualgate2') {\n\t\t\t\t\t\t\tqgate2positiv = true\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\n\t\t\treturn qgate1positiv && qgate2positiv\n\t\t},\n\t\tisPastDate(date) {\n\t\t\tconst deadline = luxon.DateTime.fromISO(date, { zone: 'Europe/Vienna' }).endOf('day');\n\t\t\tconst nowInVienna = luxon.DateTime.now().setZone('Europe/Vienna');\n\t\t\treturn nowInVienna > deadline;\n\t\t},\n\t\tsetDetailComponent(details){\n\t\t\tthis.loading = true\n\t\t\tthis.loadAbgaben(details).then((res)=> {\n\t\t\t\tconst pa = this.projektarbeiten?.find(projekarbeit => projekarbeit.projektarbeit_id == details.projektarbeit_id)\n\t\t\t\tpa.abgabetermine = res.data[0].retval\n\t\t\t\t\n\t\t\t\tconst paIsBenotet = pa.note !== null\n\t\t\t\t\n\t\t\t\tpa.abgabetermine.forEach(termin => {\n\t\t\t\t\ttermin.file = []\n\t\t\t\t\ttermin.allowedToUpload = false\n\t\t\t\t\t\n\t\t\t\t\tif(termin.paabgabetyp_kurzbz == 'end') {\n\t\t\t\t\t\t// old assumed production logic when qgates are required\n\t\t\t\t\t\t// termin.allowedToUpload = !this.isPastDate(termin.datum) && this.checkQualityGatesStrict(pa.abgabetermine)\n\t\t\t\t\t\t\n\t\t\t\t\t\tconst inTime = termin.fixtermin ? !this.isPastDate(termin.datum) : true\n\t\t\t\t\t\ttermin.allowedToUpload = inTime && this.checkQualityGatesOptional(pa.abgabetermine)\n\n\n\t\t\t\t\t\t// development purposes\n\t\t\t\t\t\t// termin.allowedToUpload = this.checkQualityGatesStrict(pa.abgabetermine)\n\t\t\t\t\t\t// termin.allowedToUpload = true\n\n\t\t\t\t\t} else if(termin.fixtermin) {\n\t\t\t\t\t\ttermin.allowedToUpload = !this.isPastDate(termin.datum)\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// this could confuse people since we should dont show people this flag\n\t\t\t\t\t\ttermin.allowedToUpload = termin.upload_allowed \n\t\t\t\t\t}\n\n\t\t\t\t\t// blocks client upload button if projektarbeitet is already beurteilt und thus further abgaben on any termin should be blocked\n\t\t\t\t\tif(paIsBenotet) termin.allowedToUpload = false\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\ttermin.bezeichnung = this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz === termin.paabgabetyp_kurzbz)\n\t\t\t\t\ttermin.dateStyle = getDateStyleClass(termin, this.notenOptions)\n\t\t\t\t})\n\t\t\t\t\n\t\t\t\tpa.betreuer = this.buildBetreuer(pa)\n\t\t\t\tpa.student_uid = this.student_uid\n\t\t\t\t\n\t\t\t\tthis.selectedProjektarbeit = pa\n\n\t\t\t\tthis.$refs.modalContainerAbgabeDetail.show()\n\t\t\t\t\n\t\t\t}).finally(()=>{this.loading=false})\n\t\t},\n\t\tcenteredTextFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\n\t\t\treturn '
    ' +\n\t\t\t\t'

    '+val+'

    '\n\t\t},\n\t\tdetailFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\n\t\t\tif(val.mode === 'detailTermine') {\n\t\t\t\treturn '
    ' +\n\t\t\t\t\t'
    '\n\t\t\t} else if (val.mode === 'beurteilungDownload') {\n\t\t\t\treturn '
    ' +\n\t\t\t\t\t'
    '\n\t\t\t}\n\t\t},\n\t\tmailFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\t\t\t\treturn '
    ' +\n\t\t\t\t\t'
    '\n\t\t},\n\t\tbeurteilungFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\t\t\tif(val) {\n\t\t\t\treturn '
    ' +\n\t\t\t\t\t'
    '\n\t\t\t} else return '-'\n\t\t},\n\t\tbuildMailToLink(projekt) {\n\t\t\t// should always be \"projekt.mitarbeiter_uid +'@'+ this.domain\", built in backend\n\t\t\treturn 'mailto:' + projekt.email\n\t\t},\n\t\tbuildBetreuer(abgabe) {\n\t\t\treturn (abgabe.btitelpre ? abgabe.btitelpre + ' ' : '') + abgabe.bvorname + ' ' + abgabe.bnachname + (abgabe.btitelpost ? ' ' + abgabe.btitelpost : '')\n\t\t},\n\t\tasync setupData(data){\n\t\t\t// this.projektarbeiten = data[0]\n\t\t\tconst projektarbeiten = data[0] ?? null\n\t\t\tif(!projektarbeiten) return\n\t\t\tthis.projektarbeiten = projektarbeiten.map(projekt => {\n\t\t\t\tlet mode = 'detailTermine'\n\t\t\t\t\n\t\t\t\treturn {\n\t\t\t\t\t...projekt,\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\tstudent_uid: this.student_uid,\n\t\t\t\t\t\tprojektarbeit_id: projekt.projektarbeit_id,\n\t\t\t\t\t\tbetreuer_person_id: projekt.bperson_id,\n\t\t\t\t\t\tbetreuerart_kurzbz: projekt.betreuerart_kurzbz,\n\t\t\t\t\t\tmode\n\t\t\t\t\t},\n\t\t\t\t\tbeurteilung1: projekt.downloadLink1 ?? null,\n\t\t\t\t\tbeurteilung2: projekt.downloadLink2 ?? null,\n\t\t\t\t\tsem: projekt.studiensemester_kurzbz,\n\t\t\t\t\tstg: projekt.kurzbzlang,\n\t\t\t\t\tmail: this.buildMailToLink(projekt),\n\t\t\t\t\tbetreuer: this.buildBetreuer(projekt),\n\t\t\t\t\ttyp: projekt.projekttypbezeichnung,\n\t\t\t\t\ttitel: projekt.titel\n\t\t\t\t}\n\t\t\t})\n\n\t\t},\n\t\tloadProjektarbeiten() {\n\t\t\tthis.$api.call(ApiAbgabe.getStudentProjektarbeiten(this.student_uid))\n\t\t\t\t.then(res => {\n\t\t\t\t\tif(res?.data) this.setupData(res.data)\n\t\t\t\t})\n\t\t},\n\t\tloadAbgaben(details) {\n\t\t\treturn new Promise((resolve) => {\n\t\t\t\tthis.$api.call(ApiAbgabe.getStudentProjektabgaben(details))\n\t\t\t\t\t.then(res => {\n\t\t\t\t\t\tresolve(res)\n\t\t\t\t\t})\n\t\t\t})\t\n\t\t},\n\t\tasync setupMounted() {\n\t\t\tthis.loadProjektarbeiten()\n\t\t},\n\t\tgetAccTabHeaderForProjektarbeit(projektarbeit) {\n\t\t\tlet title = ''\n\t\t\t\n\t\t\ttitle += projektarbeit.titel ?? this.$p.t('abgabetool/keinTitel')\n\t\t\t\n\t\t\treturn title\n\t\t},\n\t\tgetMailLink(projektarbeit) {\n\t\t\tif(projektarbeit.email) {\n\t\t\t\treturn 'mailto:'+projektarbeit.email\n\t\t\t} else return ''\n\t\t},\n\t\tgetNoteBezeichnung(projektarbeit) {\n\t\t\tif(projektarbeit.note && this.notenOptions) {\n\t\t\t\tconst noteOpt = this.notenOptions.find(opt => opt.note == projektarbeit.note)\n\t\t\t\treturn noteOpt?.bezeichnung\n\t\t\t} else {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t},\n\t\thandleDownloadBeurteilung1(projektarbeit) {\n\t\t\twindow.open(projektarbeit.beurteilung1)\n\t\t},\n\t\thandleDownloadBeurteilung2(projektarbeit) {\n\t\t\twindow.open(projektarbeit.beurteilung2)\n\t\t}\n\t},\n\twatch: {\n\n\t},\n\tcomputed: {\n\t\tisViewMode() {\n\t\t\treturn this.student_uid !== this.viewData.uid\n\t\t},\n\t\tstudent_uid() {\n\t\t\treturn this.student_uid_prop || this.viewData?.uid || null\n\t\t}\n\t},\n\tasync created() {\n\t\tthis.phrasenPromise = this.$p.loadCategory(['abgabetool', 'global'])\n\t\tthis.phrasenPromise.then(()=> {this.phrasenResolved = true})\n\t\t\n\t\tthis.loading = true\n\t\t//TODO: SWITCH TO NOTEN API ONCE NOTENTOOL IS IN MASTER TO AVOID DUPLICATE API\n\t\tawait this.$api.call(ApiAbgabe.getNoten()).then(res => {\n\t\t\tif(res.meta.status == 'success') {\n\t\t\t\tthis.notenOptions = res.data[0]\n\n\t\t\t\tthis.allowedNotenOptions = this.notenOptions.filter(\n\t\t\t\t\topt => res.data[1].includes(opt.note)\n\t\t\t\t)\n\t\t\t}\n\t\t}).finally(() => {\n\t\t\tthis.loading = false\n\t\t})\n\n\t\t// fetch abgabetypen options\n\t\tthis.$api.call(ApiAbgabe.getPaAbgabetypen()).then(res => {\n\t\t\tthis.abgabeTypeOptions = res.data\n\t\t}).catch(e => {\n\t\t\tthis.loading = false\n\t\t})\n\n\t\t// fetch config to avoid hard coded links\n\t\tthis.$api.call(ApiAbgabe.getConfigStudent()).then(res => {\n\t\t\tthis.moodle_link = res.data?.moodle_link\n\t\t}).catch(e => {\n\t\t\tthis.loading = false\n\t\t})\n\t},\n\tmounted() {\n\t\tthis.setupMounted()\n\t},\n\ttemplate: `\n\n `,\n};\n\nexport default AbgabetoolStudent;\n","/**\n * Copyright (C) 2022 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n/**\n *\n */\nexport const CoreFetchCmpt = {\n\temits: ['dataFetched'], // this component can emit the event dataFetched that it is catched by this component itself\n\tprops: {\n\t\trefresh: { // to refresh this component\n\t\t\ttype: Boolean\n\t\t},\n\t\tapiFunction: { // the function to call, must return a Promise\n\t\t\trequired: true,\n\t\t\ttype: Function\n\t\t},\n\t\tapiFunctionParameters: {} // parameters for the apiFunction, type mixed, optional\n\t},\n\twatch: {\n\t\t/**\n\t\t * If the refresh property is changed then call fetchData\n\t\t */\n\t\trefresh: function (newValue, oldValue) {\n\t\t\tthis.fetchData();\n\t\t}\n\t},\n\tdata: function() {\n\t\treturn {\n\t\t\tloading: false, // if in loading or not\n\t\t\terror: false, // if an error occurred while loading data\n\t\t\terrorMessage: null // the error message\n\t\t};\n\t},\n\tcreated: function() {\n\t\tthis.fetchData();\n\t},\n\tmethods: {\n\t\t/**\n\t\t *\n\t\t */\n\t\tfetchData: function() {\n\t\t\tthis.loading = true; // loader started\n\t\t\tthis.error = false;\n\t\t\tthis.errorMessage = null;\n\n\t\t\t// Checks if the apifunction is a callable function\n\t\t\tif (typeof this.apiFunction == \"function\")\n\t\t\t{\n\t\t\t\t// Call the function stored in apiFunction\n\t \t\tlet apiFunctionResult = this.apiFunction(this.apiFunctionParameters);\n\n\t\t\t\t// It is expected that the function returns a Promise\n\t\t\t\tif (apiFunctionResult instanceof Promise)\n\t\t\t\t{\n\t\t\t\t\tapiFunctionResult\n\t\t\t\t\t\t.then(this.successHandler) // on success\n\t\t\t\t\t\t.catch(this.errorHandler) // on error\n\t\t\t\t\t\t.finally(this.finallyHandler); // finally in any case\n\t\t\t\t}\n\t\t\t\telse // otherwise display an error\n\t\t\t\t{\n\t\t\t\t\tthis.setError(\"The called apiFunction does not return a Promise\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse // otherwise display an error\n\t\t\t{\n\t\t\t\tthis.setError(\"Property apiFunction is not a function\");\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\tsetError: function(errorMessage) {\n\t\t\tthis.loading = false; // loading ended\n\t\t\tthis.error = true; // error occurred\n\t\t\tthis.errorMessage = errorMessage; // save the error message\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\tsuccessHandler: function(response) {\n\t\t\tthis.$emit('dataFetched', response ? response.data : undefined); // trigger the event dataFetched\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\terrorHandler: function(error) {\n\t\t\tif (error.response?.data?.retval)\n\t\t\t\tthis.setError(error.response.data.retval);\n\t\t\telse if (error.data?.message)\n\t\t\t\tthis.setError(error.data.message);\n\t\t\telse\n\t\t\t\tthis.setError(error.message);\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\tfinallyHandler: function() {\n\t\t\tthis.loading = false; // loading ended\n\t\t}\n\t},\n\ttemplate: `\n\t\t\n\t\t\t
    Loading...
    \n\t\t
    \n\t\t\n\t\t\t
    {{ errorMessage }}
    \n\t\t
    \n\t\t\n\t`\n};\n","/**\n * Copyright (C) 2022 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nconst FILTER_COMPONENT_NEW_FILTER = 'Filter Component New Filter';\n\n/**\n *\n */\nexport default {\n\tprops: {\n\t\tfilters: {\n\t\t\ttype: Array,\n\t\t\tdefault: []\n\t\t},\n\t\tcolumns: {\n\t\t\ttype: Array,\n\t\t\tdefault: []\n\t\t},\n\t\tfields: {\n\t\t\ttype: Array,\n\t\t\tdefault: []\n\t\t}\n\t},\n\temits: {\n\t\tswitchFilter: ['filterId'],\n\t\tapplyFilterConfig: ['filterFields'],\n\t\tsaveCustomFilter: ['customFilterName']\n\t},\n\tdata: function() {\n\t\treturn {\n\t\t\tcurrentFields: []\n\t\t};\n\t},\n\tcomputed: {\n\t\ttypes() {\n\t\t\treturn this.columns.reduce((a,c) => {\n\t\t\t\tlet type = c.type.toLowerCase();\n\t\t\t\tif (type.indexOf('int') >= 0)\n\t\t\t\t\ta[c.name] = 'Numeric';\n\t\t\t\telse if (\n\t\t\t\t\ttype.indexOf('varchar') >= 0 || \n\t\t\t\t\ttype.indexOf('text') >= 0 || \n\t\t\t\t\ttype.indexOf('bpchar') >= 0\n\t\t\t\t)\n\t\t\t\t\ta[c.name] = 'Text';\n\t\t\t\telse if (\n\t\t\t\t\ttype.indexOf('timestamp') >= 0 || \n\t\t\t\t\ttype.indexOf('date') >= 0\n\t\t\t\t)\n\t\t\t\t\ta[c.name] = 'Date';\n\t\t\t\telse\n\t\t\t\t\ta[c.name] = '';\n\t\t\t\treturn a;\n\t\t\t}, {});\n\t\t}\n\t},\n\twatch: {\n\t\tfields(n) {\n\t\t\tthis.currentFields = n;\n\t\t}\n\t},\n\tmethods: {\n\t\tswitchFilter(evt) {\n\t\t\tthis.$emit('switchFilter', evt.currentTarget.value);\n\t\t},\n\t\tapplyFilterConfig() {\n\t\t\tconst filteredFields = this.currentFields.filter(el => el.name != FILTER_COMPONENT_NEW_FILTER);\n\t\t\tif (filteredFields.filter(el => el.condition == \"\").length)\n\t\t\t\talert(\"Please fill all the filter options\");\n\t\t\telse\n\t\t\t\tthis.$emit('applyFilterConfig', filteredFields);\n\t\t},\n\t\taddField(evt) {\n\t\t\tthis.currentFields.push({\n\t\t\t\tname: FILTER_COMPONENT_NEW_FILTER\n\t\t\t});\n\t\t},\n\t\tremoveField(index) {\n\t\t\tthis.currentFields.splice(index, 1);\n\t\t}\n\t},\n\ttemplate: `\n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t
    \n\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\tFilter {{ index + 1 }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n\t`\n};\n\n","/**\n * Copyright (C) 2022 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n/**\n *\n */\nexport default {\n\tprops: {\n\t\tfields: Array,\n\t\tselected: {\n\t\t\ttype: Array,\n\t\t\tdefault: []\n\t\t},\n\t\tnames: {\n\t\t\ttype: Object,\n\t\t\tdefault: {}\n\t\t}\n\t},\n\temits: {\n\t\thide: ['fieldName'],\n\t\tshow: ['fieldName']\n\t},\n\tdata: function() {\n\t\treturn {\n\t\t\tselectedFields: []\n\t\t};\n\t},\n\twatch: {\n\t\tselected(n) {\n\t\t\tthis.selectedFields = n;\n\t\t}\n\t},\n\tmethods: {\n\t\ttoggle(field) {\n\t\t\tif (this.selectedFields.indexOf(field) != -1)\n\t\t\t{\n\t\t\t\tthis.selectedFields.splice(this.selectedFields.indexOf(field), 1);\n\t\t\t\tthis.$emit('hide', field);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis.selectedFields.push(field);\n\t\t\t\tthis.$emit('show', field);\n\t\t\t}\n\t\t}\n\t},\n\ttemplate: `\n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\t{{ names[fieldToDisplay] || fieldToDisplay }}\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t\n\t`\n};\n\n","/**\n * Copyright (C) 2022 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nconst DEFAULT_ICONS = {\n\tjsonLines: 'fa-file-lines',\n\txlsx: 'fa-file-excel',\n\tpdf: 'fa-file-pdf',\n\thtml: 'fa-file-code',\n\tjson: 'fa-file',\n\tcsv: 'fa-file-csv'\n};\nconst DEFAULT_LABELS = {\n\tjsonLines: 'Download as JSONLINES',\n\txlsx: 'Download as XLSX',\n\tpdf: 'Download as PDF',\n\thtml: 'Download as HTML',\n\tjson: 'Download as JSON',\n\tcsv: 'Download as CSV '\n};\n\n\n/**\n *\n */\nexport default {\n\tprops: {\n\t\ttabulator: Object,\n\t\tconfig: {\n\t\t\ttype: [Boolean, String, Function, Array, Object],\n\t\t\tdefault: false\n\t\t},\n\t\ticonClass: [String, Array, Object]\n\t},\n\tcomputed: {\n\t\tcurrentConfig() {\n\t\t\tif (!this.config)\n\t\t\t\treturn false;\n\n\t\t\tlet config = this.config;\n\n\t\t\tif (config instanceof Function)\n\t\t\t\treturn [config];\n\n\t\t\tif (config === null)\n\t\t\t\treturn [];\n\n\t\t\tif (this.config === true)\n\t\t\t\tconfig = ['csv'];\n\n\t\t\tif (Object.prototype.toString.call(config) === \"[object String]\")\n\t\t\t\tconfig = config.split(',');\n\n\t\t\tif (typeof config === 'object' && !Array.isArray(config)) {\n\t\t\t\tlet newConfig = [];\n\t\t\t\tfor (var k in config) {\n\t\t\t\t\tvar v = config[k], type;\n\t\t\t\t\t\n\t\t\t\t\tif (!v)\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\n\t\t\t\t\tif (Object.prototype.toString.call(v) === \"[object String]\") {\n\t\t\t\t\t\ttype = this.stringToFileFormatter(v);\n\t\t\t\t\t\tif (type !== null) {\n\t\t\t\t\t\t\tnewConfig.push({\n\t\t\t\t\t\t\t\ticon: 'fa-solid ' + DEFAULT_ICONS[type],\n\t\t\t\t\t\t\t\tlabel: v === k ? DEFAULT_LABELS[type] : k,\n\t\t\t\t\t\t\t\tformatter: type\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttype = this.stringToFileFormatter(k);\n\t\t\t\t\t\t\tif(type !== null) {\n\t\t\t\t\t\t\t\tnewConfig.push({\n\t\t\t\t\t\t\t\t\ticon: 'fa-solid ' + DEFAULT_ICONS[type],\n\t\t\t\t\t\t\t\t\tlabel: v,\n\t\t\t\t\t\t\t\t\tformatter: type\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\talert('neither ' + k + ' nor ' + v + ' are supported download file types');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (typeof v === 'object' && !Array.isArray(v)) {\n\t\t\t\t\t\ttype = this.stringToFileFormatter(k);\n\t\t\t\t\t\tif (type !== null) {\n\t\t\t\t\t\t\tif (v.formatter === undefined)\n\t\t\t\t\t\t\t\tv.formatter = type;\n\t\t\t\t\t\t\tif (v.label === undefined)\n\t\t\t\t\t\t\t\tv.label = DEFAULT_LABELS[type];\n\t\t\t\t\t\t\tif (v.icon === undefined)\n\t\t\t\t\t\t\t\tv.icon = DEFAULT_ICONS[type];\n\t\t\t\t\t\t\tnewConfig.push(v);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (v.label === undefined)\n\t\t\t\t\t\t\t\tv.label = k;\n\t\t\t\t\t\t\tnewConfig.push(v);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttype = this.stringToFileFormatter(k);\n\t\t\t\t\t\tif (type !== null) {\n\t\t\t\t\t\t\tnewConfig.push({\n\t\t\t\t\t\t\t\ticon: 'fa-solid ' + DEFAULT_ICONS[type],\n\t\t\t\t\t\t\t\tlabel: DEFAULT_LABELS[type],\n\t\t\t\t\t\t\t\tformatter: type\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\talert(k + ' is not a supported download file type');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconfig = newConfig;\n\t\t\t}\n\n\t\t\tif (Array.isArray(config))\n\t\t\t{\n\t\t\t\tconfig = config.map(el => {\n\t\t\t\t\tif (Object.prototype.toString.call(el) === \"[object String]\") {\n\t\t\t\t\t\tlet formatter = this.stringToFileFormatter(el);\n\t\t\t\t\t\tif (formatter === null)\n\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\ticon: 'fa-solid ' + DEFAULT_ICONS[formatter],\n\t\t\t\t\t\t\tlabel: DEFAULT_LABELS[formatter],\n\t\t\t\t\t\t\tformatter\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (el instanceof Function)\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tformatter: el\n\t\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (typeof el === 'object' && !Array.isArray(el) && el !== null) {\n\t\t\t\t\t\tif (el.formatter instanceof Function)\n\t\t\t\t\t\t\treturn el;\n\t\t\t\t\t\tif (this.validateFileFormatter(el.formatter))\n\t\t\t\t\t\t\treturn el;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\treturn null;\n\t\t\t\t}).filter(el => el !== null);\n\n\t\t\t\tif (config.length < 2)\n\t\t\t\t\treturn config;\n\n\t\t\t\tif (config.filter(el => el.label || el.icon).length == config.length)\n\t\t\t\t\treturn config;\n\n\t\t\t\talert('Config not valid');\n\t\t\t}\n\n\t\t\treturn [];\n\t\t}\n\t},\n\tmethods: {\n\t\tstringToFileFormatter(input) {\n\t\t\tlet lcInput = input.toLowerCase();\n\t\t\t\n\t\t\tif (lcInput == 'jsonlines')\n\t\t\t\treturn 'jsonLines';\n\t\t\t\n\t\t\tif (['xlsx', 'pdf', 'html', 'json', 'csv'].includes(lcInput))\n\t\t\t\treturn lcInput;\n\n\t\t\treturn null;\n\t\t},\n\t\tvalidateFileFormatter(input) {\n\t\t\tlet formatter = this.stringToFileFormatter(input);\n\t\t\tif (!formatter) {\n\t\t\t\talert(input + ' is not a supported file formatter');\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (formatter == 'xlsx') {\n\t\t\t\tif (!window.XLSX) {\n\t\t\t\t\talert('XLSX Library not loaded');\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (formatter == 'pdf') {\n\t\t\t\tif (!window.jspdf) {\n\t\t\t\t\talert('jsPDF Library not loaded');\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tvar doc = new jspdf.jsPDF({});\n\t\t\t\tif (!doc.autoTable) {\n\t\t\t\t\talert('jsPDF-AutoTable Plugin not loaded');\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t\tdownload(config) {\n\t\t\tthis.tabulator.download(config.formatter, config.file, config.options)\n\t\t}\n\t},\n\ttemplate: `\n\t\n\t`\n};\n\n","const elementDataMap = new WeakMap();\n\nexport default {\n\tmounted(el, binding) {\n\t\tlet open = false;\n\t\telementDataMap.set(el, evt => {\n\t\t\tif (!open)\n\t\t\t\treturn;\n\n\t\t\tif (el.contains(evt.target))\n\t\t\t\treturn;\n\n\t\t\tconst collapse = bootstrap.Collapse.getInstance(el)\n\t\t\tif (collapse)\n\t\t\t\tcollapse.hide();\n\t\t});\n\t\tel.addEventListener('shown.bs.collapse', () => {\n\t\t\topen = true;\n\t\t});\n\t\tel.addEventListener('hide.bs.collapse', () => {\n\t\t\topen = false;\n\t\t});\n\t\tdocument.addEventListener('click', elementDataMap.get(el), true);\n\t},\n\tbeforeUnmount(el, binding) {\n\t\tdocument.removeEventListener('click', elementDataMap.get(el));\n\t\tdelete el.collapsibleAutoHideFunc;\n\t}\n}","/**\n * This may need changes if Tabulator gets updated!\n *\n * Current working Version: 5.5.2\n * \n * This is a copy of the fitDataStretch function. The only difference\n * is the check for frozen columns on line 22.\n */\n\nexport default window.Tabulator?.extendModule(\"layout\", \"modes\", {\n\tfitDataStretchFrozen(columns, forced) {\n\t\tvar colsWidth = 0,\n\t\ttableWidth = this.table.rowManager.element.clientWidth,\n\t\tgap = 0,\n\t\tlastCol = false;\n\n\t\tcolumns.forEach((column, i) => {\n\t\t\tif (!column.widthFixed) {\n\t\t\t\tcolumn.reinitializeWidth();\n\t\t\t}\n\n\t\t\tif (this.table.options.responsiveLayout ? column.modules.responsive.visible : column.visible && !column.definition.frozen) {\n\t\t\t\tlastCol = column;\n\t\t\t}\n\n\t\t\tif (column.visible) {\n\t\t\t\tcolsWidth += column.getWidth();\n\t\t\t}\n\t\t});\n\n\t\tif (lastCol){\n\t\t\tgap = tableWidth - colsWidth + lastCol.getWidth();\n\n\t\t\tif (this.table.options.responsiveLayout && this.table.modExists(\"responsiveLayout\", true)) {\n\t\t\t\tlastCol.setWidth(0);\n\t\t\t\tthis.table.modules.responsiveLayout.update();\n\t\t\t}\n\n\t\t\tif (gap > 0) {\n\t\t\t\tlastCol.setWidth(gap);\n\t\t\t} else {\n\t\t\t\tlastCol.reinitializeWidth();\n\t\t\t}\n\t\t} else {\n\t\t\tif (this.table.options.responsiveLayout && this.table.modExists(\"responsiveLayout\", true)) {\n\t\t\t\tthis.table.modules.responsiveLayout.update();\n\t\t\t}\n\t\t}\n\t}\n});\n","/**\n * Copyright (C) 2025 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tsaveCustomFilter(wsParams) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/filter/saveCustomFilter',\n\t\t\tparams: {\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tcustomFilterName: wsParams.customFilterName\n\t\t\t}\n\t\t};\n\t},\n\tremoveCustomFilter(wsParams) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/filter/removeCustomFilter',\n\t\t\tparams: {\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterId: wsParams.filterId\n\t\t\t}\n\t\t};\n\t},\n\tapplyFilterFields(wsParams) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/filter/applyFilterFields',\n\t\t\tparams: {\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterFields: wsParams.filterFields\n\t\t\t}\n\t\t};\n\t},\n\taddFilterField(wsParams) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/filter/addFilterField',\n\t\t\tparams: {\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterField: wsParams.filterField\n\t\t\t}\n\t\t};\n\t},\n\tremoveFilterField(wsParams) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/filter/removeFilterField',\n\t\t\tparams: {\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterField: wsParams.filterField\n\t\t\t}\n\t\t};\n\t},\n\tgetFilterById(wsParams) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/filter/getFilter',\n\t\t\tparams: {\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterId: wsParams.filterId\n\t\t\t}\n\t\t};\n\t},\n\tgetFilter(wsParams) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/filter/getFilter',\n\t\t\tparams: {\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType\n\t\t\t}\n\t\t};\n\t}\n};","/**\n * Copyright (C) 2022 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nimport {CoreFetchCmpt} from '../../components/Fetch.js';\nimport FilterConfig from './Filter/Config.js';\nimport FilterColumns from './Filter/Columns.js';\nimport TableDownload from './Table/Download.js';\nimport collapseAutoClose from '../../directives/collapseAutoClose.js';\n\nimport moduleLayoutFitDataStretchFrozen from '../../tabulator/layouts/fitDataStretchFrozen.js';\n\nimport ApiFilter from '../../api/factory/filter.js';\n\n//\nconst FILTER_COMPONENT_NEW_FILTER = 'Filter Component New Filter';\nconst FILTER_COMPONENT_NEW_FILTER_TYPE = 'Filter Component New Filter Type';\n\nvar _uuid = 0;\n\n/**\n *\n */\nexport const CoreFilterCmpt = {\n\tcomponents: {\n\t\tCoreFetchCmpt,\n\t\tFilterConfig,\n\t\tFilterColumns,\n\t\tTableDownload\n\t},\n\tdirectives: {\n\t\tcollapseAutoClose\n\t},\n\temits: [\n\t\t'nwNewEntry',\n\t\t'click:new',\n\t\t'tableBuilt',\n\t\t'uuidDefined'\n\t],\n\tprops: {\n\t\tonNwNewEntry: Function, // NOTE(chris): Hack to get the nwNewEntry listener into $props\n\t\ttitle: String,\n\t\tdescription: String,\n\t\tsideMenu: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true\n\t\t},\n\t\tfilterType: {\n\t\t\ttype: String\n\t\t},\n\t\ttabulatorOptions: Object,\n\t\ttabulatorEvents: Array,\n\t\ttableOnly: Boolean,\n\t\tnoColumnFilter:Boolean,\n\t\treload: Boolean,\n\t\treloadBtnInfotext: String,\n\t\tdownload: {\n\t\t\ttype: [Boolean, String, Function, Array, Object],\n\t\t\tdefault: false\n\t\t},\n\t\tnewBtnShow: Boolean,\n\t\tnewBtnClass: [String, Array, Object],\n\t\tnewBtnDisabled: Boolean,\n\t\tnewBtnLabel: String,\n\t\tuniqueId: String,\n\n\t\tidField: String,\n\t\tparentIdField: String,\n\t\tcountOnly: Boolean,\n\t\tuseSelectionSpan: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true\n\t\t}\n\t},\n\tdata: function() {\n\t\treturn {\n\t\t\tuuid: 0,\n\t\t\t// FilterCmpt properties\n\t\t\tfilterName: null,\n\t\t\tfilterActive: false,\n\t\t\tfields: null,\n\t\t\tdataset: null,\n\t\t\tdatasetMetadata: null,\n\t\t\tselectedFields: null,\n\t\t\tfilterFields: null,\n\n\t\t\tavailableFilters: null,\n\t\t\tselectedFilter: null,\n\n\t\t\t// FetchCmpt binded properties\n\t\t\tfetchCmptRefresh: false,\n\t\t\tfetchCmptApiFunction: null,\n\t\t\tfetchCmptApiFunctionParams: null,\n\t\t\tfetchCmptDataFetched: null,\n\n\t\t\tfetchResult: null,\n\n\t\t\ttabulator: null,\n\t\t\ttableBuilt: false,\n\t\t\ttabulatorHasSelector: false,\n\t\t\tselectedData: [],\n\t\t\tpersistence: {\n\t\t\t\tsort: true,\n\t\t\t\tcolumns: true,\n\t\t\t\tfilter: false,\n\t\t\t\theaderFilter: false,\n\t\t\t\tgroup: false,\n\t\t\t\tpage: false,\n\t\t\t}\n\t\t};\n\t},\n\tcomputed: {\n\t\tnotSelectedFields() {\n\t\t\tif (!this.fields || !this.selectedFields)\n\t\t\t\treturn null;\n\t\t\treturn this.fields.filter(x => this.selectedFields.indexOf(x) === -1)\n\t\t},\n\t\tfilteredData() {\n\t\t\tif (!this.dataset)\n\t\t\t\treturn [];\n\t\t\treturn JSON.parse(JSON.stringify(this.dataset));\n\t\t},\n\t\tfilteredColumns() {\n\t\t\tlet fields = JSON.parse(JSON.stringify(this.fields)) || [];\n\t\t\tlet selectedFields = JSON.parse(JSON.stringify(this.selectedFields)) || [];\n\n\t\t\tlet columns = null;\n\n\t\t\t// If the tabulator options has been provided and it contains the property columns\n\t\t\tif (this.tabulatorOptions && this.tabulatorOptions.hasOwnProperty('columns'))\n\t\t\t\tcolumns = this.tabulatorOptions.columns;\n\n\t\t\t// If columns is not an array or it is an array with less elements then the array fields\n\t\t\tif (!Array.isArray(columns) || (Array.isArray(columns) && columns.length < fields.length))\n\t\t\t{\n\t\t\t\tcolumns = []; // set it as an empty array\n\n\t\t\t\t// Loop throught all the retrieved columns from database\n\t\t\t\tfor (let field of fields)\n\t\t\t\t{\n\t\t\t\t\t// Create a new column having the title equal to the field name\n\t\t\t\t\tlet column = {\n\t\t\t\t\t\ttitle: field,\n\t\t\t\t\t\tfield: field\n\t\t\t\t\t};\n\n\t\t\t\t\t// If the column has to be displayed or not\n\t\t\t\t\tcolumn.visible = selectedFields.indexOf(field) >= 0;\n\n\t\t\t\t\t// Add the new column to the list of columns\n\t\t\t\t\tcolumns.push(column);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse // the property columns has been provided in the tabulator options\n\t\t\t{\n\t\t\t\t// Loop throught the property columns of the tabulator options\n\t\t\t\tfor (let col of columns)\n\t\t\t\t{\n\t\t\t\t\t// If the column has to be displayed or not\n\t\t\t\t\t/* fields.indexOf(col.field) == -1; ensures displaying formatter colums\n\t\t\t\t\te.g. column with rowSelection checkboxes or with custom formatted action buttons */\n\t\t\t\t\tcol.visible = selectedFields.indexOf(col.field) >= 0 || fields.indexOf(col.field) == -1;\n\n\t\t\t\t\tif (col.hasOwnProperty('resizable'))\n\t\t\t\t\t\tcol.resizable = col.visible;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn columns;\n\t\t},\n\t\tfieldIdsForVisibilty() {\n\t\t\tif (!this.tableBuilt)\n\t\t\t\treturn [];\n\t\t\treturn this.tabulator.getColumns().filter(col => {\n\t\t\t\tlet def = col.getDefinition();\n\t\t\t\treturn !def.frozen && def.title && def.formatter != \"responsiveCollapse\";\n\t\t\t}).map(col => col.getField());\n\t\t},\n\t\tfieldNames() {\n\t\t\tif (!this.tableBuilt)\n\t\t\t\treturn {};\n\t\t\treturn this.tabulator.getColumns().reduce((res, col) => {\n\t\t\t\tres[col.getField()] = col.getDefinition().title;\n\t\t\t\treturn res;\n\t\t\t}, {});\n\t\t},\n\t\tidExtra() {\n\t\t\tif (!this.uuid)\n\t\t\t\treturn '';\n\t\t\treturn '-' + this.uuid;\n\t\t},\n\t\tcolumnsForFilter() {\n\t\t\tif (!this.filteredColumns || !this.datasetMetadata)\n\t\t\t\treturn [];\n\t\t\tconst filterTitles = this.filteredColumns.reduce((a,c) => {\n\t\t\t\ta[c.field] = c.title;\n\t\t\t\treturn a;\n\t\t\t}, {});\n\t\t\treturn this.datasetMetadata.map(el => ({...el, ...{title: filterTitles[el.name]}}));\n\t\t}\n\t},\n\tmethods: {\n\t\treloadTable() {\n\t\t\tif (this.tableOnly)\n\t\t\t\tthis.tabulator.setData();\n\t\t\telse\n\t\t\t\tthis.getFilter();\n\t\t},\n\t\tasync initTabulator() {\n\t\t\tlet placeholder = '< Phrasen Plugin not loaded! >';\n\t\t\tif (this.$p) {\n\t\t\t\tawait this.$p.loadCategory('ui');\n\t\t\t\tplaceholder = this.$p.t('ui/keineDatenVorhanden');\n\t\t\t}\n\n\t\t\tif (!this.tableOnly) {\n\t\t\t\t// prefetch data to get fields & selectedFields for filteredColumns & filteredData\n\t\t\t\tawait new Promise(resolve => {\n\t\t\t\t\tconst filterId = window.location.hash ? window.location.hash.slice(1) : null;\n\n\t\t\t\t\tconst resolvePromiseFunc = data => {\n\t\t\t\t\t\tthis.setRenderData(data);\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t};\n\t\t\t\t\t// get the filter data\n\t\t\t\t\tif (filterId === null)\n\t\t\t\t\t\tthis.startFetchCmpt(\n\t\t\t\t\t\t\twsParams => this.$api.call(ApiFilter.getFilter(wsParams)),\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\tresolvePromiseFunc\n\t\t\t\t\t\t);\n\t\t\t\t\telse\n\t\t\t\t\t\tthis.startFetchCmpt(\n\t\t\t\t\t\t\twsParams => this.$api.call(ApiFilter.getFilterById(wsParams)),\n\t\t\t\t\t\t\t{ filterId },\n\t\t\t\t\t\t\tresolvePromiseFunc\n\t\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Define a default tabulator options in case it was not provided\n\t\t\tlet tabulatorOptions = {...{\n\t\t\t\t\tlayout: \"fitDataStretchFrozen\",\n\t\t\t\t\tmovableColumns: true,\n\t\t\t\t\tcolumnDefaults:{\n\t\t\t\t\t\ttooltip: true\n\t\t\t\t\t},\n\t\t\t\t\tplaceholder,\n\t\t\t\t\tpersistence: this.persistence,\n\t\t\t\t}, ...(this.tabulatorOptions || {})};\n\n\t\t\t// set default height if no height property is set\n\t\t\tif (tabulatorOptions.height === undefined &&\n\t\t\t\ttabulatorOptions.minHeight === undefined &&\n\t\t\t\ttabulatorOptions.maxHeight === undefined) {\n\t\t\t\ttabulatorOptions.height = 500;\n\t\t\t}\n\n\t\t\tif (!this.tableOnly) {\n\t\t\t\ttabulatorOptions.data = this.filteredData;\n\t\t\t\ttabulatorOptions.columns = this.filteredColumns;\n\t\t\t} else {\n\t\t\t\ttabulatorOptions.columns.forEach(col => {\n\t\t\t\t\tif (col.visible === undefined)\n\t\t\t\t\t\tcol.visible = true;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (tabulatorOptions.selectable || (tabulatorOptions.columns && tabulatorOptions.columns.filter(el => el.formatter == 'rowSelection').length))\n\t\t\t\tthis.tabulatorHasSelector = true;\n\n\t\t\tif (this.idField) {\n\t\t\t\t// enable nested tabulator if parent Id given\n\t\t\t\tif (this.parentIdField) tabulatorOptions.dataTree = true;\n\t\t\t\t// set tabulator index\n\t\t\t\ttabulatorOptions.index = this.idField;\n\t\t\t}\n\n\t\t\t// Start the tabulator with the build options\n\t\t\tthis.tabulator = new Tabulator(\n\t\t\t\tthis.$refs.table,\n\t\t\t\ttabulatorOptions\n\t\t\t);\n\t\t\t// If event handlers have been provided\n\t\t\tif (Array.isArray(this.tabulatorEvents) && this.tabulatorEvents.length > 0)\n\t\t\t{\n\t\t\t\t// Attach all the provided event handlers to the started tabulator\n\t\t\t\tfor (let evt of this.tabulatorEvents)\n\t\t\t\t\tthis.tabulator.on(evt.event, evt.handler);\n\t\t\t}\n\t\t\tthis.tabulator.on('tableBuilt', () => {this.tableBuilt = true; this.$emit('tableBuilt');});\n\t\t\tthis.tabulator.on(\"rowSelectionChanged\", data => {\n\t\t\t\tthis.selectedData = data;\n\t\t\t});\n\n\t\t\t// if nested tabulator, restructure data\n\t\t\tif (this.parentIdField && this.idField) {\n\t\t\t\tthis.tabulator.on(\"dataLoading\", data => {\n\t\t\t\t\tlet toDelete = [];\n\n\t\t\t\t\t// loop through all data\n\t\t\t\t\tfor (let childIdx = 0; childIdx < data.length; childIdx++)\n\t\t\t\t\t{\n\t\t\t\t\t\tlet child = data[childIdx];\n\n\t\t\t\t\t\t// if it has parent id, it is a child\n\t\t\t\t\t\tif (child[this.parentIdField])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// append the child on the right place. If parent found, mark original sw child on 0 level for deleting\n\t\t\t\t\t\t\tif (this.appendChild(data, child)) toDelete.push(childIdx);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// delete the marked children from 0 level\n\t\t\t\t\tfor (let counter = 0; counter < toDelete.length; counter++)\n\t\t\t\t\t{\n\t\t\t\t\t\t// decrease index by counter as index of data array changes after every deletion\n\t\t\t\t\t\tdata.splice(toDelete[counter] - counter, 1);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (this.tableOnly) {\n\t\t\t\tthis.tabulator.on('tableBuilt', () => {\n\t\t\t\t\tconst cols = this.tabulator.getColumns();\n\t\t\t\t\tthis.fields = cols.map(col => col.getField());\n\t\t\t\t\tthis.selectedFields = cols.filter(col => col.isVisible()).map(col => col.getField());\n\t\t\t\t\tif (this.tabulator.options.persistence.headerFilter)\n\t\t\t\t\t\tthis._setHeaderFilter();\n\t\t\t\t});\n\n\t\t\t}\n\n\t\t\tthis.tabulator.on(\"dataFiltered\", filters => {\n\t\t\t\tthis.filterActive = filters.length > 0;\n\t\t\t});\n\t\t},\n\t\tupdateTabulator() {\n\t\t\tif (this.tabulator) {\n\t\t\t\tif (this.tableBuilt)\n\t\t\t\t\tthis._updateTabulator();\n\t\t\t\telse\n\t\t\t\t\tthis.tabulator.on('tableBuilt', this._updateTabulator);\n\t\t\t}\n\t\t},\n\t\t_updateTabulator() {\n\t\t\tthis.tabulatorHasSelector = this.tabulatorOptions.selectable || this.filteredColumns.filter(el => el.formatter == 'rowSelection').length;\n\t\t\tthis.tabulator.setColumns(this.filteredColumns);\n\t\t\tthis.tabulator.setData(this.filteredData);\n\t\t\tthis._setHeaderFilter()\n\t\t},\n\t\tclearFilters()\n\t\t{\n\t\t\tlet existingFilters = this.tabulator.getHeaderFilters();\n\t\t\texistingFilters.forEach(filter => {\n\t\t\t\tthis.tabulator.setHeaderFilterValue(filter.field, \"\");\n\t\t\t});\n\t\t\tthis.tabulator.clearFilter();\n\t\t\tthis.filterActive = false;\n\t\t},\n\t\t_setHeaderFilter()\n\t\t{\n\t\t\tconst existingFilters = this.tabulator.getHeaderFilters();\n\t\t\texistingFilters.forEach(filter => {\n\t\t\t\tthis.tabulator.setHeaderFilterValue(filter.field, filter.value);\n\t\t\t});\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\tgetFilter() {\n\t\t\tif (this.selectedFilter === null)\n\t\t\t\tthis.startFetchCmpt(\n\t\t\t\t\twsParams => this.$api.call(ApiFilter.getFilter(wsParams)),\n\t\t\t\t\tnull,\n\t\t\t\t\tthis.render\n\t\t\t\t);\n\t\t\telse\n\t\t\t\tthis.startFetchCmpt(\n\t\t\t\t\twsParams => this.$api.call(ApiFilter.getFilterById(wsParams)),\n\t\t\t\t\t{\n\t\t\t\t\t\tfilterId: this.selectedFilter\n\t\t\t\t\t},\n\t\t\t\t\tthis.render\n\t\t\t\t);\n\t\t},\n\t\tsetRenderData(data) {\n\t\t\tthis.fetchResult = data;\n\t\t\tthis.filterName = data.filterName;\n\t\t\tthis.dataset = data.dataset;\n\t\t\tthis.datasetMetadata = data.datasetMetadata;\n\n\t\t\tthis.fields = data.fields;\n\t\t\tthis.selectedFields = data.selectedFields;\n\t\t\tthis.filterFields = [];\n\n\t\t\tfor (let i = 0; i < data.datasetMetadata.length; i++)\n\t\t\t{\n\t\t\t\tfor (let j = 0; j < data.filters.length; j++)\n\t\t\t\t{\n\t\t\t\t\tif (data.datasetMetadata[i].name == data.filters[j].name)\n\t\t\t\t\t{\n\t\t\t\t\t\tlet filter = data.filters[j];\n\t\t\t\t\t\tfilter.type = data.datasetMetadata[i].type;\n\n\t\t\t\t\t\tthis.filterFields.push(filter);\n\t\t\t\t\t\t//break;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\trender(response) {\n\t\t\tlet data = response;\n\n\t\t\tthis.setRenderData(data);\n\n\t\t\t// If the side menu is active\n\t\t\tif (this.sideMenu === true)\n\t\t\t{\n\t\t\t\tthis.setSideMenu(data);\n\t\t\t}\n\t\t\telse // otherwise use the dropdown in the filter options\n\t\t\t{\n\t\t\t\tthis.setDropDownMenu(data);\n\t\t\t}\n\t\t\tthis.updateTabulator();\n\t\t},\n\t\t/**\n\t\t * Set the menu\n\t\t */\n\t\tsetSideMenu(data) {\n\t\t\tlet filters = data.sideMenu.filters;\n\t\t\tlet personalFilters = data.sideMenu.personalFilters;\n\t\t\tlet filtersArray = [];\n\n\t\t\tfor (let filtersCount = 0; filtersCount < filters.length; filtersCount++)\n\t\t\t{\n\t\t\t\tlet link = filters[filtersCount].link;\n\n\t\t\t\tif (link == null) link = '#';\n\n\t\t\t\tfiltersArray[filtersArray.length] = {\n\t\t\t\t\tid: filters[filtersCount].filter_id,\n\t\t\t\t\tlink: link + filters[filtersCount].filter_id,\n\t\t\t\t\tdescription: filters[filtersCount].desc,\n\t\t\t\t\tsort: filtersCount,\n\t\t\t\t\tonClickCall: this.handlerGetFilterById\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tfor (let filtersCount = 0; filtersCount < personalFilters.length; filtersCount++)\n\t\t\t{\n\t\t\t\tlet link = personalFilters[filtersCount].link;\n\n\t\t\t\tif (link == null) link = '#';\n\n\t\t\t\tfiltersArray[filtersArray.length] = {\n\t\t\t\t\tid: personalFilters[filtersCount].filter_id,\n\t\t\t\t\tlink: link + personalFilters[filtersCount].filter_id,\n\t\t\t\t\tdescription: personalFilters[filtersCount].desc,\n\t\t\t\t\tsubscriptDescription: personalFilters[filtersCount].subscriptDescription,\n\t\t\t\t\tsubscriptLinkClass: personalFilters[filtersCount].subscriptLinkClass,\n\t\t\t\t\tsubscriptLinkValue: personalFilters[filtersCount].subscriptLinkValue,\n\t\t\t\t\tsort: filtersCount,\n\t\t\t\t\tonClickCall: this.handlerGetFilterById,\n\t\t\t\t\tonClickSubscriptCall: this.handlerRemoveCustomFilter\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tthis.availableFilters = filtersArray;\n\n\t\t\tthis.$emit(\n\t\t\t\t'nwNewEntry',\n\t\t\t\t{\n\t\t\t\t\tlink: \"#\",\n\t\t\t\t\tdescription: \"Filters\",\n\t\t\t\t\ticon: \"filter\",\n\t\t\t\t\tchildren: filtersArray\n\t\t\t\t}\n\t\t\t);\n\t\t},\n\t\t/**\n\t\t * Set the drop down menu\n\t\t */\n\t\tsetDropDownMenu(data) {\n\t\t\tlet filters = data.sideMenu.filters;\n\t\t\tlet personalFilters = data.sideMenu.personalFilters;\n\t\t\tlet filtersArray = [];\n\n\t\t\tfor (let filtersCount = 0; filtersCount < filters.length; filtersCount++)\n\t\t\t{\n\t\t\t\tlet link = filters[filtersCount].link;\n\n\t\t\t\tif (link == null) link = '#';\n\n\t\t\t\tfiltersArray[filtersArray.length] = {\n\t\t\t\t\tid: filters[filtersCount].filter_id,\n\t\t\t\t\toption: filters[filtersCount].filter_id,\n\t\t\t\t\tdescription: filters[filtersCount].desc\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tfor (let filtersCount = 0; filtersCount < personalFilters.length; filtersCount++)\n\t\t\t{\n\t\t\t\tlet link = personalFilters[filtersCount].link;\n\n\t\t\t\tif (link == null) link = '#';\n\n\t\t\t\tfiltersArray[filtersArray.length] = {\n\t\t\t\t\tid: personalFilters[filtersCount].filter_id,\n\t\t\t\t\toption: personalFilters[filtersCount].filter_id,\n\t\t\t\t\tdescription: personalFilters[filtersCount].desc\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tthis.availableFilters = filtersArray;\n\t\t},\n\t\t/**\n\t\t * Used to start/refresh the FetchCmpt\n\t\t */\n\t\tstartFetchCmpt(apiFunction, apiFunctionParameters, dataFetchedCallback) {\n\t\t\t// Assign the function api of the FetchCmpt binded property\n\t\t\tthis.fetchCmptApiFunction = apiFunction;\n\n\t\t\t// In case a null value is provided set the parameters as an empty object\n\t\t\tif (apiFunctionParameters == null) apiFunctionParameters = {};\n\n\t\t\t// Always needed parameters\n\t\t\tapiFunctionParameters.filterUniqueId = FHC_JS_DATA_STORAGE_OBJECT.called_path + \"/\" + FHC_JS_DATA_STORAGE_OBJECT.called_method;\n\t\t\tapiFunctionParameters.filterType = this.filterType;\n\n\t\t\tif (this.uniqueId)\n\t\t\t\tapiFunctionParameters.filterUniqueId += '_' + this.uniqueId;\n\n\t\t\t// Assign parameters to the FetchCmpt binded properties\n\t\t\tthis.fetchCmptApiFunctionParams = apiFunctionParameters;\n\t\t\t// Assign data fetch callback to the FetchCmpt binded properties\n\t\t\tthis.fetchCmptDataFetched = dataFetchedCallback;\n\t\t\t// Set the FetchCmpt binded property refresh to have the component to refresh\n\t\t\t// NOTE: this should be the last one to be called because it triggers the FetchCmpt to start to refresh\n\t\t\tthis.fetchCmptRefresh === true ? this.fetchCmptRefresh = false : this.fetchCmptRefresh = true;\n\t\t},\n\n\t\t// ------------------------------------------------------------------------------------------------------------------\n\t\t// Event handlers\n\n\t\t/**\n\t\t *\n\t\t */\n\t\thandlerSaveCustomFilter(customFilterName) {\n\t\t\tthis.selectedFilter = null;\n\t\t\t//\n\t\t\tthis.startFetchCmpt(\n\t\t\t\twsParams => this.$api.call(ApiFilter.saveCustomFilter(wsParams)),\n\t\t\t\t{\n\t\t\t\t\tcustomFilterName\n\t\t\t\t},\n\t\t\t\tthis.getFilter\n\t\t\t);\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\thandlerRemoveCustomFilter(event) {\n\t\t\tlet filterId = event.currentTarget.getAttribute(\"href\").substring(1);\n\t\t\tif (filterId === this.selectedFilter)\n\t\t\t\tthis.selectedFilter = null;\n\t\t\t//\n\t\t\tthis.startFetchCmpt(\n\t\t\t\twsParams => this.$api.call(ApiFilter.removeCustomFilter(wsParams)),\n\t\t\t\t{\n\t\t\t\t\tfilterId: filterId\n\t\t\t\t},\n\t\t\t\tthis.getFilter\n\t\t\t);\n\t\t},\n\n\t\t/*\n\t\t *\n\t\t */\n\t\thandlerGetFilterById: function(event) {\n\n\t\t\tlet filterId = null;\n\n\t\t\t// Get the attribute href if side menu is rendered\n\t\t\tlet attr = event.currentTarget.getAttribute(\"href\");\n\n\t\t\t// Otherwise get the value of the drop down menu\n\t\t\tif (attr == null)\n\t\t\t{\n\t\t\t\tfilterId = event.currentTarget.value;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfilterId = attr.substring(1);\n\t\t\t}\n\n\t\t\tthis.switchFilter(filterId);\n\t\t},\n\t\tswitchFilter(filterId) {\n\t\t\tthis.selectedFilter = filterId;\n\t\t\tthis.getFilter();\n\t\t},\n\t\tapplyFilterConfig(filterFields) {\n\t\t\tthis.selectedFilter = null;\n\t\t\tthis.startFetchCmpt(\n\t\t\t\twsParams => this.$api.call(ApiFilter.applyFilterFields(wsParams)),\n\t\t\t\t{\n\t\t\t\t\tfilterFields\n\t\t\t\t},\n\t\t\t\tthis.getFilter\n\t\t\t);\n\t\t},\n\n\t\t// append child to it's parent\n\t\tappendChild(data, child) {\n\t\t\t// get parent id\n\t\t\tlet parentId = child[this.parentIdField];\n\n\t\t\t// loop thorugh all data\n\t\t\tfor (let parentIdx = 0; parentIdx < data.length; parentIdx++)\n\t\t\t{\n\t\t\t\tlet parent = data[parentIdx];\n\n\t\t\t\t// if it's the parent\n\t\t\t\tif (parent[this.idField] == parentId)\n\t\t\t\t{\n\t\t\t\t\t// create children array if not done yet\n\t\t\t\t\tif (!parent._children) parent._children = [];\n\n\t\t\t\t\t// if child is not included in children array, append the child\n\t\t\t\t\tif (!parent._children.includes(child)) parent._children.push(child);\n\n\t\t\t\t\t// parent found\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\t// search children for parents\n\t\t\t\telse if (parent._children) this.appendChild(parent._children, child);\n\t\t\t}\n\n\t\t\t// parent not found\n\t\t\treturn false;\n\t\t}\n\t},\n\tbeforeCreate() {\n\t\tif (!this.tableOnly == !this.filterType)\n\t\t\talert('You can not have a filter-type in table-only mode!');\n\t},\n\tcreated() {\n\t\tif (this.sideMenu && (!this.$props.onNwNewEntry || !(this.$props.onNwNewEntry instanceof Function)))\n\t\t\talert('\"nwNewEntry\" listener is mandatory when sideMenu is true');\n\t\tthis.uuid = _uuid++;\n\t\tthis.$emit('uuidDefined', this.uuid)\n\t},\n\tmounted() {\n\t\tthis.initTabulator().then(() => {\n\t\t\tif (!this.tableOnly) {\n\t\t\t\tthis.selectedFilter = window.location.hash ? window.location.hash.slice(1) : null;\n\t\t\t\tthis.render(this.fetchResult);\n\t\t\t}\n\t\t});\n\n\t},\n\ttemplate: `\n\t\t\n\t\t\n\t\t\n\n\t\t
    \n\t\t\t
    \n\t\t\t\t

    \n\t\t\t\t\t{{ title }}\n\t\t\t\t

    \n\t\t\t
    \n\t\t
    \n\t\t
    \n\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t{{ selectedData.length }} ausgewählt\n\t\t\t\t\t\t Mit {{ selectedData.length }} ausgewählten:\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t[ {{ filterName }} ]\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\n\t\t\t\n\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t\n\n\t\t\n\t\t
    \n\t`\n};\n","import BsModal from '../../Bootstrap/Modal.js';\nimport VueDatePicker from '../../vueDatepicker.js.php';\nimport ApiAbgabe from '../../../api/factory/abgabe.js'\nimport { getDateStyleClass } from \"./getDateStyleClass.js\";\n\nexport const AbgabeMitarbeiterDetail = {\n\tname: \"AbgabeMitarbeiterDetail\",\n\tcomponents: {\n\t\tBsModal,\n\t\tInputNumber: primevue.inputnumber,\n\t\tCheckbox: primevue.checkbox,\n\t\tDropdown: primevue.dropdown,\n\t\tTextarea: primevue.textarea,\n\t\tSpeedDial: primevue.speeddial,\n\t\tAccordion: primevue.accordion,\n\t\tAccordionTab: primevue.accordiontab,\n\t\tMessage: primevue.message,\n\t\tVueDatePicker\n\t},\n\temits: ['paUpdated'],\n\tinject: [\n\t\t'abgabeTypeOptions',\n\t\t'abgabetypenBetreuer',\n\t\t'allowedNotenOptions',\n\t\t'notenOptionsNonFinal',\n\t\t'turnitin_link',\n\t\t'old_abgabe_beurteilung_link'\n\t],\n\tprops: {\n\t\tprojektarbeit: {\n\t\t\ttype: Object,\n\t\t\tdefault: null\n\t\t},\n\t\tisFullscreen: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t},\n\t\tassistenzMode: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tshowAutomagicModalPhrase: false,\n\t\t\teidAkzeptiert: false,\n\t\t\tenduploadTermin: null,\n\t\t\tallActiveLanguages: FHC_JS_DATA_STORAGE_OBJECT.server_languages,\n\t\t\tspeedDialItems: [{\n\t\t\t\tlabel: Vue.computed(() => this.$p.t('abgabetool/c4newAbgabetermin')),\n\t\t\t\ticon: \"fa fa-plus\",\n\t\t\t\tcommand: this.openCreateNewAbgabeModal,\n\t\t\t\tdisabled: Vue.computed(() => !this.getAllowedToCreateNewTermin)\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: Vue.computed(() => this.$p.t('abgabetool/c4benoten')),\n\t\t\t\ticon: \"fa fa-user-check\",\n\t\t\t\tcommand: this.openBenotung,\n\t\t\t\tdisabled: Vue.computed(()=> this.assistenzMode == true)\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: Vue.computed(() => this.$p.t('abgabetool/c4plagiatcheck_link')),\n\t\t\t\ticon: \"fa fa-clipboard-check\",\n\t\t\t\tcommand: this.openPlagiatcheck\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: Vue.computed(() => this.$p.t('abgabetool/c4student_perspective')),\n\t\t\t\ticon: \"fa fa-eye\",\n\t\t\t\tcommand: this.openStudentPage\n\t\t\t}],\n\t\t\tnewTermin: null,\n\t\t\tform: Vue.reactive({\n\t\t\t\tsprache: '',\n\t\t\t\tabstract: '',\n\t\t\t\tabstract_en: '',\n\t\t\t\tschlagwoerter: '',\n\t\t\t\tschlagwoerter_en: '',\n\t\t\t\tkontrollschlagwoerter: '',\n\t\t\t\tseitenanzahl: 1,\n\t\t\t})\n\t\t}\n\t},\n\tmethods: {\n\t\tgetNoteBezeichnung(termin){\n\t\t\tif(termin.noteBackend?.bezeichnung) {\n\t\t\t\treturn termin.noteBackend?.positiv ? this.$capitalize(this.$p.t('abgabetool/c4positivBenotet')) + ' ✅' : this.$capitalize(this.$p.t('abgabetool/c4negativBenotet')) + ' ❌'\n\t\t\t} else if(termin.bezeichnung?.benotbar === true && !termin.noteBackend) {\n\t\t\t\treturn this.$capitalize(this.$p.t('abgabetool/c4notYetGraded'));\n\t\t\t} else {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t},\n\t\tgetPlaceholderTermin(termin) {\n\t\t\treturn termin?.bezeichnung ? this.$p.t('abgabetool/c4paatyp' + termin.paabgabetyp_kurzbz) : this.$p.t('abgabetool/abgabetypPlaceholder')\n\t\t},\n\t\tsaveTermin(termin) {\n\t\t\tconst paabgabe_id = termin.paabgabe_id\n\t\t\ttermin.note_pk = termin.note?.note ?? null\n\t\t\ttermin.betreuer_person_id = this.projektarbeit.betreuer_person_id\n\t\t\t\n\t\t\t// phrasentext 'no late submission allowed' to 'late submission allowed' + boolean UI invert\n\t\t\ttermin.fixtermin = !termin.invertedFixtermin\n\t\t\treturn this.$api.call(ApiAbgabe.postProjektarbeitAbgabe(termin)).then( (res) => {\n\t\t\t\tif(res?.meta?.status == 'success') {\n\t\t\t\t\tthis.$fhcAlert.alertSuccess(this.$p.t('ui/gespeichert'))\n\t\t\t\t\t\n\t\t\t\t\tconst noteOpt = this.allowedNotenOptions.find(opt => opt.note == res.data[0].note)\n\t\t\t\t\tconst newTerminRes = {\n\t\t\t\t\t\t'allowedToSave': true,\n\t\t\t\t\t\t'allowedToDelete': true,\n\t\t\t\t\t\t...res.data[0]\n\t\t\t\t\t}\n\t\t\t\t\tif(newTerminRes.note) {\n\t\t\t\t\t\tnewTerminRes.note = noteOpt\n\t\t\t\t\t\tnewTerminRes.noteBackend = noteOpt // certain UI elements should only reflect persisted state\n\t\t\t\t\t}\n\t\t\t\t\tnewTerminRes.invertedFixtermin = !newTerminRes.fixtermin\n\t\t\t\t\tconst existingTerminRes = res.data[1]\n\t\t\t\t\t\n\t\t\t\t\tconst abgabeOpt = this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz == newTerminRes.paabgabetyp_kurzbz)\n\t\t\t\t\t\n\t\t\t\t\tnewTerminRes.bezeichnung = {\n\t\t\t\t\t\tbezeichnung: termin.bezeichnung?.bezeichnung,\n\t\t\t\t\t\tpaabgabetyp_kurzbz: termin.bezeichnung?.paabgabetyp_kurzbz,\n\t\t\t\t\t\tbenotbar: abgabeOpt.benotbar\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// only insert new abgabe if we actually created a new one, not when saving/editing existing\n\t\t\t\t\tif(!existingTerminRes){\n\t\t\t\t\t\tnewTerminRes.dateStyle = getDateStyleClass(newTerminRes, this.notenOptions)\n\t\t\t\t\t\tthis.projektarbeit.abgabetermine.push(newTerminRes)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst noteOptExisting = this.allowedNotenOptions.find(opt => opt.note == existingTerminRes.note)\n\t\t\t\t\t\texistingTerminRes.note = noteOptExisting\n\n\t\t\t\t\t\ttermin.paabgabetyp_kurzbz = newTerminRes.paabgabetyp_kurzbz\n\t\t\t\t\t\ttermin.noteBackend = noteOpt // do NOT take noteOptExisting -> should reflect the \"yes the qgate grade is confirmed in backend ux behaviour\"\n\t\t\t\t\t\ttermin.dateStyle = getDateStyleClass(termin, this.notenOptions)\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tthis.projektarbeit.abgabetermine.sort((a, b) =>new Date(a.datum) - new Date(b.datum))\n\t\t\t\t\t\n\t\t\t\t\tconst index = this.projektarbeit.abgabetermine.findIndex(t => termin.paabgabe_id == t.paabgabe_id)\n\t\t\t\t\t\n\t\t\t\t\t// negative abgabe -> automagically open new termin modal\n\t\t\t\t\t// really bad feature imo that will be annoying to deal with\n\t\t\t\t\t\n\t\t\t\t\t// termin is completely new and has negative note\n\t\t\t\t\tconst savedNewWithNegative = !existingTerminRes && !newTerminRes.note?.positiv && newTerminRes.note !== null\n\n\t\t\t\t\t// termin existed previously + oldTermin had different note/positive note or no note at all\n\t\t\t\t\tconst savedExistingNoteAsNegativeAndWasNotNegativeBefore = existingTerminRes && !newTerminRes.note?.positiv && newTerminRes.note !== null && (existingTerminRes.note?.positiv || existingTerminRes.note === undefined)\n\n\t\t\t\t\tconst openModalDueToNegativeBeurteilung = savedNewWithNegative || savedExistingNoteAsNegativeAndWasNotNegativeBefore\n\t\t\t\t\tif(openModalDueToNegativeBeurteilung) {\n\t\t\t\t\t\tthis.newTermin = {\n\t\t\t\t\t\t\t'paabgabe_id': -1,\n\t\t\t\t\t\t\t'projektarbeit_id': this.projektarbeit.projektarbeit_id,\n\t\t\t\t\t\t\t'fixtermin': false,\n\t\t\t\t\t\t\t'invertedFixtermin': true,\n\t\t\t\t\t\t\t'kurzbz': '', // todo kurzbz textfield value vorschlag für qualgates\n\t\t\t\t\t\t\t'datum': new Date().toISOString().split('T')[0],\n\t\t\t\t\t\t\t'note': this.allowedNotenOptions.find(opt => opt.note == 9),\n\t\t\t\t\t\t\t'beurteilungsnotiz': '',\n\t\t\t\t\t\t\t'upload_allowed': false,\n\t\t\t\t\t\t\t'paabgabetyp_kurzbz': '',\n\t\t\t\t\t\t\t'bezeichnung': this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz === newTerminRes.paabgabetyp_kurzbz),\n\t\t\t\t\t\t\t'abgabedatum': null,\n\t\t\t\t\t\t\t'insertvon': this.viewData?.uid ?? ''\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.showAutomagicModalPhrase = true\n\n\t\t\t\t\t\tthis.$refs.modalContainerCreateNewAbgabe.show()\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.showAutomagicModalPhrase = false\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tthis.$emit(\"paUpdated\", this.projektarbeit)\n\t\t\t\t} else if(res?.meta?.status == 'error'){\n\t\t\t\t\tthis.$fhcAlert.alertError()\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\topenZusatzdatenModal() {\n\t\t\tthis.$refs.modalContainerZusatzdaten.show()\n\t\t},\n\t\tasync saveZusatzdaten(){\n\t\t\tif (!await this.validateZusatzdaten())\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t\n\t\t\tconst pa = this.projektarbeit\n\n\t\t\t// post endabgabe\n\t\t\tconst formData = new FormData();\n\t\t\tformData.append('projektarbeit_id', this.projektarbeit.projektarbeit_id);\n\n\t\t\tformData.append('sprache', this.form['sprache'].sprache)\n\t\t\tformData.append('abstract', this.form['abstract'])\n\t\t\tformData.append('abstract_en', this.form['abstract_en'])\n\t\t\tformData.append('schlagwoerter', this.form['schlagwoerter'])\n\t\t\tformData.append('schlagwoerter_en', this.form['schlagwoerter_en'])\n\t\t\tformData.append('seitenanzahl', this.form['seitenanzahl'])\n\t\t\t\n\t\t\tthis.loading = true\n\t\t\tthis.$api.call(ApiAbgabe.postStudentProjektarbeitZusatzdaten(formData))\n\t\t\t\t.then(res => {\n\t\t\t\t\tif(res.meta.status == 'success') {\n\t\t\t\t\t\tthis.$fhcAlert.alertSuccess(this.$p.t('ui/gespeichert'))\n\t\t\t\t\t\tif(!data?.retval?.[0]) return\n\t\t\t\t\t\tconst paRes = data.retval[0]\n\t\t\t\t\t\tpa.seitenanzahl = paRes.seitenanzahl ?? 1\n\t\t\t\t\t\tpa.kontrollschlagwoerter = paRes.kontrollschlagwoerter ?? ''\n\t\t\t\t\t\tpa.schlagwoerter = paRes.schlagwoerter ?? ''\n\t\t\t\t\t\tpa.sprache = paRes.sprache ?? ''\n\t\t\t\t\t\tpa.schlagwoerter_en = paRes.schlagwoerter_en ?? ''\n\t\t\t\t\t\tpa.abstract = paRes.abstract ?? ''\n\t\t\t\t\t\tpa.abstract_en = paRes.abstract_en ?? ''\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}).finally(()=> {\n\t\t\t\tthis.loading = false\n\t\t\t})\n\n\t\t\tthis.$refs.modalContainerZusatzdaten.hide()\n\t\t},\n\t\tasync validateZusatzdaten() {\n\t\t\t// just ask once\n\t\t\tif(await this.$fhcAlert.confirm({\n\t\t\t\tmessage: this.$p.t('abgabetool/confirmZusatzdatenSpeichern'),\n\t\t\t\tacceptLabel: this.$capitalize(this.$p.t('abgabetool/c4AcceptAndProceed')),\n\t\t\t\tacceptClass: 'p-button-primary',\n\t\t\t\trejectLabel: this.$capitalize(this.$p.t('abgabetool/c4Cancel')),\n\t\t\t\trejectClass: 'p-button-secondary'\n\t\t\t}) === false) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t\n\t\t\treturn true\n\t\t},\n\t\tasync handleDeleteTermin(termin){\n\t\t\tif(await this.$fhcAlert.confirm({\n\t\t\t\tmessage: this.$p.t('abgabetool/c4confirm_delete'),\n\t\t\t\tacceptLabel: 'Löschen',\n\t\t\t\tacceptClass: 'p-button-danger',\n\t\t\t\trejectLabel: 'Zurück',\n\t\t\t\trejectClass: 'p-button-secondary'\n\t\t\t}) === false) {\n\t\t\t\treturn false\n\t\t\t} else {\n\t\t\t\tthis.deleteTermin(termin)\n\t\t\t}\n\t\t},\n\t\tdeleteTermin(termin) {\n\t\t\tthis.$api.call(ApiAbgabe.deleteProjektarbeitAbgabe(termin.paabgabe_id)).then( (res) => {\n\t\t\t\tif(res?.meta?.status == 'success') {\n\t\t\t\t\tthis.$fhcAlert.alertSuccess(this.$p.t('ui/genericDeleted', [this.$p.t('abgabetool/abgabe')]))\n\t\t\t\t\t// this.$p.t('global/tooltipLektorDeleteKontrolle', [this.$entryParams.permissions.kontrolleDeleteMaxReach ])\n\t\t\t\t\tconst deletedTerminIndex = this.projektarbeit.abgabetermine.findIndex(t => t.paabgabe_id === termin.paabgabe_id)\n\t\t\t\t\tthis.projektarbeit.abgabetermine.splice(deletedTerminIndex, 1)\n\t\t\t\t\tthis.$emit(\"paUpdated\", this.projektarbeit)\n\t\t\t\t} else if(res?.meta?.status == 'error'){\n\t\t\t\t\tthis.$fhcAlert.alertError()\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\tvalidate: function(termin) {\n\t\t\tif(!termin.file.length) {\n\t\t\t\tthis.$fhcAlert.alertWarning(this.$p.t('global/warningChooseFile'));\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\treturn true;\n\t\t},\n\t\tdownloadAbgabe(termin) {\n\t\t\tconst url = `/api/frontend/v1/Abgabe/getStudentProjektarbeitAbgabeFile?paabgabe_id=${termin.paabgabe_id}&student_uid=${this.projektarbeit.student_uid}&projektarbeit_id=${this.projektarbeit.projektarbeit_id}`;\n\n\t\t\twindow.open(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + url)\n\t\t\t// this.$api.call(ApiAbgabe.getStudentProjektarbeitAbgabeFile(termin.paabgabe_id, this.projektarbeit.student_uid))\n\t\t},\n\t\topenBeurteilungLink(link) {\n\t\t\twindow.open(link, '_blank')\n\t\t},\n\t\tgetOptionLabelSprache(option) {\n\t\t\treturn option.sprache\n\t\t},\n\t\tgetOptionLabelAbgabetyp(option) {\n\t\t\treturn this.$p.t('abgabetool/c4paatyp' + option.paabgabetyp_kurzbz)\n\t\t},\n\t\tgetOptionDisabled(option) {\n\t\t\treturn !option.aktiv\n\t\t},\n\t\tgetNotenOptionLabel(option) {\n\t\t\treturn option.bezeichnung\n\t\t},\n\t\topenStudentPage() {\n\t\t\tconst link = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router\n\t\t\t\t+ '/Cis/Abgabetool/Student/' + this.projektarbeit?.student_uid\n\t\t\twindow.open(link, '_blank')\n\t\t},\n\t\topenPlagiatcheck() {\n\t\t\tconst link = this.turnitin_link\n\t\t\twindow.open(link, '_blank')\n\t\t},\n\t\tasync openBenotung() {\n\t\t\t// old link check ?\n\t\t\t\n\t\t\tif(this.getSemesterBenotbar && this.projektarbeit?.abgabetermine.find(termin => termin.paabgabetyp_kurzbz == 'end' && termin.abgabedatum !== null) && this.projektarbeit?.beurteilungLinkNew) {\n\t\t\t\tconst link = this.projektarbeit?.beurteilungLinkNew\n\t\t\t\twindow.open(link, '_blank')\n\t\t\t} else if(this.projektarbeit?.abgabetermine.find(termin => termin.paabgabetyp_kurzbz == 'end' && termin.abgabedatum !== null) && this.projektarbeit?.beurteilungLinkOld) {\n\t\t\t\tif(await this.$fhcAlert.confirm({\n\t\t\t\t\tmessage: this.$p.t('abgabetool/c4aeltereParbeitBenotenv2'),\n\t\t\t\t\tacceptLabel: this.$capitalize(this.$p.t('abgabetool/c4AcceptAndProceed')),\n\t\t\t\t\tacceptClass: 'btn btn-danger',\n\t\t\t\t\trejectLabel: this.$capitalize(this.$p.t('abgabetool/c4Cancel')),\n\t\t\t\t\trejectClass: 'btn btn-outline-secondary'\n\t\t\t\t}) === false) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\n\t\t\t\tconst link = this.projektarbeit?.beurteilungLinkOld\n\t\t\t\twindow.open(link, '_blank')\n\t\t\t} else {\n\t\t\t\t// show info text that no endupload with abgabe has been found\n\t\t\t\tif(await this.$fhcAlert.confirm({\n\t\t\t\t\tmessage: this.$p.t('abgabetool/c4keinEnduploadErfolgt'),\n\t\t\t\t\tacceptLabel: this.$capitalize(this.$p.t('abgabetool/c4AcceptAndProceed')),\n\t\t\t\t\tacceptClass: 'btn btn-danger',\n\t\t\t\t\trejectLabel: this.$capitalize(this.$p.t('abgabetool/c4Cancel')),\n\t\t\t\t\trejectClass: 'btn btn-outline-secondary'\n\t\t\t\t}) === false) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tformatDate(dateParam) {\n\t\t\t// unsafe for datepickers, dont use there\n\t\t\tconst date = new Date(dateParam)\n\t\t\t// handle missing leading 0\n\t\t\tconst padZero = (num) => String(num).padStart(2, '0');\n\n\t\t\tconst month = padZero(date.getMonth() + 1); // Months are zero-based\n\t\t\tconst day = padZero(date.getDate());\n\t\t\tconst year = date.getFullYear();\n\t\t\t\n\t\t\treturn `${day}.${month}.${year}`\n\t\t},\n\t\topenCreateNewAbgabeModal() {\n\t\t\tif(this.projektarbeit?.betreuerart_kurzbz == 'Zweitbegutachter') {\n\t\t\t\t// maybe alert that this is not allowed or smth\n\n\t\t\t\tthis.$fhcAlert.alertWarning('Terminanlage disabled')\n\t\t\t\treturn\n\t\t\t}\n\t\t\t\n\t\t\tif(!this.newTermin) {\n\t\t\t\tconst typ = this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz === 'zwischen')\n\t\t\t\tthis.newTermin = {\n\t\t\t\t\t'paabgabe_id': -1,\n\t\t\t\t\t'projektarbeit_id': this.projektarbeit.projektarbeit_id,\n\t\t\t\t\t'fixtermin': false,\n\t\t\t\t\t'invertedFixtermin': true,\n\t\t\t\t\t'kurzbz': '',\n\t\t\t\t\t'datum': new Date().toISOString().split('T')[0],\n\t\t\t\t\t'note': this.allowedNotenOptions.find(opt => opt.note == 9),\n\t\t\t\t\t'beurteilungsnotiz': '',\n\t\t\t\t\t'upload_allowed': typ.upload_allowed_default,\n\t\t\t\t\t'paabgabetyp_kurzbz': '',\n\t\t\t\t\t'bezeichnung': typ,\n\t\t\t\t\t'abgabedatum': null,\n\t\t\t\t\t'insertvon': this.viewData?.uid ?? ''\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.$refs.modalContainerCreateNewAbgabe.show()\n\t\t},\n\t\tvalidateTermin(termin) {\n\t\t\t// compare new termin to existing ones to block illegal termin constellations, if they exist\n\t\t\t\n\t\t\treturn true\n\t\t},\n\t\tasync handleSaveNewAbgabe(termin) {\n\t\t\t\n\t\t\tif(!this.validateTermin(termin)) {\n\t\t\t\tthis.$fhcAlert.alertWarning('invalid termin')\n\t\t\t\t\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t\n\t\t\tawait this.saveTermin(termin)\n\t\t\t\n\t\t\tthis.$refs.modalContainerCreateNewAbgabe.hide()\n\t\t\tthis.newTermin = {\n\t\t\t\t'paabgabe_id': -1,\n\t\t\t\t'projektarbeit_id': this.projektarbeit.projektarbeit_id,\n\t\t\t\t'fixtermin': false,\n\t\t\t\t'invertedFixtermin': true,\n\t\t\t\t'kurzbz': '',\n\t\t\t\t'datum': new Date().toISOString().split('T')[0],\n\t\t\t\t'note': this.allowedNotenOptions.find(opt => opt.note == 9),\n\t\t\t\t'beurteilungsnotiz': '',\n\t\t\t\t'upload_allowed': false,\n\t\t\t\t'paabgabetyp_kurzbz': '',\n\t\t\t\t'bezeichnung': this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz === 'zwischen'),\n\t\t\t\t'abgabedatum': null,\n\t\t\t\t'insertvon': this.viewData?.uid ?? ''\n\t\t\t}\n\t\t\t\n\t\t},\n\t\thandleChangeAbgabetyp(termin) {\n\t\t\t// if paabgabetype qualgate is selected, fill out kurzbz textfield with bezeichnung of quality gate so users\n\t\t\t// are possibly less confused\n\t\t\tif(termin.bezeichnung?.paabgabetyp_kurzbz === 'qualgate1' || termin.bezeichnung?.paabgabetyp_kurzbz === 'qualgate2') {\n\t\t\t\ttermin.kurzbz = termin.bezeichnung.bezeichnung\n\t\t\t} else {\n\t\t\t\ttermin.kurzbz = ''\n\t\t\t}\n\t\t}\n\t},\n\tcomputed: {\n\t\tgetAllowedToCreateNewTermin() {\n\t\t\tif(this.assistenzMode) return true\n\t\t\tif(this.projektarbeit?.betreuerart_kurzbz == 'Zweitbegutachter') return false\n\t\t\tif(this.projektarbeit?.note !== undefined && this.projektarbeit.note !== null) {\n\t\t\t\t// check if the note is not defined as a non final projektarbeit note\n\t\t\t\tconst opt = this.notenOptionsNonFinal.find(opt => opt.note)\n\t\t\t\t// if thats the case allow further work\n\t\t\t\tif(opt) return true\n\t\t\t\t// else the PA is to be considered finished\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t\n\t\t\t// normally should be allowed if no rules apply\n\t\t\treturn true\n\t\t},\n\t\tallowedToSaveZusatzdaten() {\n\t\t\t\treturn this.form.schlagwoerter.length > 0 && this.form.schlagwoerter_en.length > 0 && this.form.abstract.length > 0 && this.form.abstract_en.length > 0 && this.form.seitenanzahl > 0\n\t\t},\n\t\tgetAllowedAbgabeTypeOptions() {\n\t\t\tif(this.assistenzMode) {\n\t\t\t\treturn this.abgabeTypeOptions\n\t\t\t} else {\n\t\t\t\treturn this.abgabeTypeOptions.filter(opt => this.abgabetypenBetreuer.includes(opt.paabgabetyp_kurzbz))\n\t\t\t}\n\t\t},\n\t\tgetMessagePtStyle() {\n\t\t\t// adjust outer spacing and internal padding to appear similar to doenload button in size\n\t\t\treturn {\n\t\t\t\troot: {\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tmargin: '0px'\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\twrapper: {\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tpadding: '6px'\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\t\n\t\t},\n\t\tgetEid() {\n\t\t\treturn this.$p.t('abgabetool/c4eidesstattlicheErklaerung')\n\t\t},\n\t\tgetEnduploadErlaubt() {\n\t\t\treturn !this.eidAkzeptiert\n\t\t},\n\t\tgetSemesterBenotbar(){\n\t\t\treturn this.projektarbeit?.isCurrent ?? false\n\t\t},\n\t\tendUploadVorhanden(){\n\t\t\treturn this.projektarbeit?.abgabetermine.find(abgabe => abgabe.paabgabetyp_kurzbz === 'end' && abgabe.abgabedatum !== null)\n\t\t},\n\t\tqualityGateTerminAvailable() {\n\t\t\tlet qgatefound = false\n\t\t\tthis.projektarbeit?.abgabetermine.forEach(abgabe => {\n\t\t\t\tif(abgabe.bezeichnung?.paabgabetyp_kurzbz == 'qualgate1'\n\t\t\t\t\t|| abgabe?.bezeichnung?.paabgabetyp_kurzbz == 'qualgate2') {\n\t\t\t\t\tqgatefound = true\n\t\t\t\t}\n\t\t\t})\n\t\t\treturn qgatefound\n\t\t},\n\t\tgetSpeedDialStyle() {\n\t\t\treturn 'position: static !important;'\n\t\t},\n\t\tgetSpeedDialWrapperStyle() {\n\t\t\t// non fullscreen -> wrapper is positioned on right bottom corner of modal, wherever that is\n\t\t\treturn 'position: absolute; z-index: 9999; left: 0px; bottom: 0.5rem;'\n\t\t},\n\t\tgetTooltipVerspaetet() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipVerspaetet'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipVerpasst() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipVerpasst'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipAbzugeben() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipAbzugeben'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipStandard() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipStandardv2'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipBeurteilungerforderlich() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipBeurteilungerforderlich'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipAbgegeben() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipAbgegeben'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipFixtermin() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipFixtermin'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipAbgabeDetected() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4tooltipAbgabeDetected')),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipNotAllowedToSave() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4notAllowedToEditAbgabeTermin'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipNotAllowedToDelete() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4notAllowedToDeleteAbgabeTermin'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipBestanden() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipBestanden'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipNichtBestanden() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipNichtBestanden'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetProjektarbeitTitel() {\n\t\t\tif(this.projektarbeit?.titel) return this.$capitalize(this.$p.t('abgabetool/c4titel')) + ': ' + this.projektarbeit.titel\n\t\t\t\n\t\t\treturn ''\n\t\t},\n\t\tgetProjektarbeitStudent(){\n\t\t\tif(this.projektarbeit?.student) return this.$capitalize(this.$p.t('person/student')) + ': ' + this.projektarbeit.student\n\n\t\t\treturn ''\n\t\t}\n\t},\n\twatch: {\n\t\t'newTermin.bezeichnung'(newVal) {\n\t\t\tif(newVal?.paabgabetyp_kurzbz === 'qualgate1' || newVal?.paabgabetyp_kurzbz === 'qualgate2') {\n\t\t\t\tthis.newTermin.kurzbz = newVal.bezeichnung\n\t\t\t}\n\t\t\t\n\t\t\tthis.newTermin.upload_allowed = newVal.upload_allowed_default\n\t\t},\n\t\t'projektarbeit'(newVal) {\n\t\t\t// set invertedFixtermin field for UI/UX purposes -> avoid double negation in text\n\t\t\t\n\t\t\t// reset newTermin object\n\t\t\tconst typ = this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz === 'zwischen')\n\t\t\tthis.newTermin = {\n\t\t\t\t'paabgabe_id': -1,\n\t\t\t\t'projektarbeit_id': newVal.projektarbeit_id,\n\t\t\t\t'fixtermin': false,\n\t\t\t\t'invertedFixtermin': true,\n\t\t\t\t'kurzbz': '',\n\t\t\t\t'datum': new Date().toISOString().split('T')[0],\n\t\t\t\t'note': this.allowedNotenOptions.find(opt => opt.note == 9),\n\t\t\t\t'beurteilungsnotiz': '',\n\t\t\t\t'upload_allowed': typ.upload_allowed_default,\n\t\t\t\t'paabgabetyp_kurzbz': '',\n\t\t\t\t'bezeichnung': typ,\n\t\t\t\t'abgabedatum': null,\n\t\t\t\t'insertvon': this.viewData?.uid ?? ''\n\t\t\t}\n\t\t\t\n\t\t\tnewVal?.abgabetermine?.forEach(termin => termin.invertedFixtermin = !termin.fixtermin)\n\t\t\t\n\t\t\t// default select german if projektarbeit sprache was null\n\t\t\tthis.form.sprache = newVal.sprache ? this.allActiveLanguages.find(lang => lang.sprache == newVal.sprache) : this.allActiveLanguages.find(lang => lang.sprache == 'German')\n\t\t\tthis.form.abstract = newVal.abstract ?? ''\n\t\t\tthis.form.abstract_en = newVal.abstract_en ?? ''\n\t\t\tthis.form.schlagwoerter = newVal.schlagwoerter ?? ''\n\t\t\tthis.form.schlagwoerter_en = newVal.schlagwoerter_en ?? ''\n\t\t\tthis.form.kontrollschlagwoerter = newVal.kontrollschlagwoerter ?? ''\n\t\t\tthis.form.seitenanzahl = newVal.seitenanzahl ?? 1\n\t\t},\n\t},\n\tcreated() {\n\n\t},\n\tmounted() {\n\n\t},\n\ttemplate: `\n\t\n\t\t\n\t\t\n\t\t\n\t\n\n\t
    \n\t\t
    {{$capitalize( $p.t('abgabetool/c4abgabeMitarbeiterbereich') )}}
    \n\n\t\t
    \n\t\t\t
    \n\t\t\t\t

    {{getProjektarbeitStudent}}

    \n\t\t\t\t

    {{getProjektarbeitTitel}}

    \n\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t
    \n\t\t
    \n\t\t\t
    \n\n\t\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\t\t
    \n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t
    \n\t\t\t
    {{ $capitalize( $p.t('abgabetool/c4keineAbgabetermineGefunden') )}}
    \n\t\t
    \n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t
    \n`,\n};\n\nexport default AbgabeMitarbeiterDetail;\n","if (!primevue) {\n\tconsole.error('PrimeVue not loaded!');\n}\n\n// NOTE(chris): Click on clear button gives an error. This is a bug in primevue => fixed in current version\nTabulator.extendModule('filter', 'filters', {\n\t\"dates\": (headerValue, rowValue) => {\n\t\tif (!headerValue)\n\t\t\treturn true;\n\n\t\tlet rowDate = new Date(rowValue);\n\n\t\tif (Array.isArray(headerValue))\n\t\t{\n\t\t\tlet startDate = new Date(headerValue[0]);\n\t\t\tif (headerValue[1])\n\t\t\t{\n\t\t\t\tlet endDate = new Date(headerValue[1]);\n\n\t\t\t\tendDate.setHours(23, 59, 59, 999);\n\n\t\t\t\treturn rowDate >= startDate && rowDate <= endDate;\n\t\t\t}\n\n\t\t\treturn rowDate.toDateString() === startDate.toDateString();\n\t\t}\n\t\tlet singleDate = new Date(headerValue);\n\t\treturn rowDate.toDateString() === singleDate.toDateString();\n\t}\n});\n\nfunction dateFilter(cell, onRendered, success) {\n\tlet div = document.createElement('div');\n\n\tlet initialValue = null;\n\n\tlet val = cell.getValue();\n\n\tif (Array.isArray(val))\n\t{\n\t\tconst start = val[0] ? new Date(val[0]) : null;\n\t\tconst end = val[1] ? new Date(val[1]) : null;\n\t\tinitialValue = [start, end];\n\t}\n\n\tVue.createApp({\n\t\tcomponents: {\n\t\t\tPrimevueCalendar: primevue.calendar\n\t\t},\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tval: initialValue\n\t\t\t}\n\t\t},\n\t\twatch: {\n\t\t\tval(n) {\n\t\t\t\tsuccess(n);\n\t\t\t}\n\t\t},\n\t\ttemplate: `\n\t\t\t\t `\n\t}).use(primevue.config.default).mount(div);\n\n\treturn div;\n}\nexport { dateFilter };","export async function splitMailsHelper(mails, event, subject, alertPluginRef, phrasenPluginRef) {\n\tlet splititem = \",\";\n\tlet maillist = mails.join(splititem);\n\tlet mailto = \"\";\n\t// take subject line length + '?subject=' length into account\n\tconst subjectlength = subject && typeof subject === 'string' ? subject.length + 9 : 0 \n\tif (maillist.length > 2024)\n\t{\n\t\tif (await alertPluginRef.confirm({message: phrasenPluginRef.t('stv', 'zuvieleEMails') }) === false)\n\t\t\treturn;\n\t}\n\n\tlet firstrun = true;\n\tlet useBcc = event?.ctrlKey || event?.metaKey;\n\twhile (maillist.length > 0)\n\t{\n\t\tif (maillist.length + subjectlength > 2024)\n\t\t{\n\t\t\tlet splitposition = maillist.lastIndexOf(splititem, 1900);\n\t\t\tmailto = maillist.substring(0, splitposition);\n\t\t\tmaillist = maillist.substring(splitposition + 1);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tmailto = maillist;\n\t\t\tmaillist = \"\";\n\t\t}\n\n\t\tlet mailLink = useBcc ? `mailto:?bcc=${mailto}` : `mailto:${mailto}`;\n\t\tif(subject && typeof subject === 'string') mailLink += `?subject=${subject}`\n\t\tif (firstrun)\n\t\t{\n\t\t\twindow.location.href = mailLink;\n\t\t\tfirstrun = false;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (await alertPluginRef.confirm({message: phrasenPluginRef.t('stv', 'weitereEMail')}) === true)\n\t\t\t{\n\t\t\t\twindow.location.href = mailLink;\n\t\t\t}\n\t\t}\n\n\t}\n}","import {CoreFilterCmpt} from \"../../../components/filter/Filter.js\";\nimport AbgabeDetail from \"./AbgabeMitarbeiterDetail.js\";\nimport BsModal from '../../Bootstrap/Modal.js';\nimport VueDatePicker from '../../vueDatepicker.js.php';\nimport ApiAbgabe from '../../../api/factory/abgabe.js'\nimport FhcOverlay from \"../../Overlay/FhcOverlay.js\";\nimport { getDateStyleClass } from \"./getDateStyleClass.js\";\nimport { dateFilter } from '../../../tabulator/filters/Dates.js';\nimport {splitMailsHelper} from \"../../../helpers/EmailHelpers.js\";\n\nexport const AbgabetoolMitarbeiter = {\n\tname: \"AbgabetoolMitarbeiter\",\n\tcomponents: {\n\t\tBsModal,\n\t\tCoreFilterCmpt,\n\t\tAbgabeDetail,\n\t\tCheckbox: primevue.checkbox,\n\t\tDropdown: primevue.dropdown,\n\t\tTextarea: primevue.textarea,\n\t\tTieredMenu: primevue.tieredmenu,\n\t\tVueDatePicker,\n\t\tFhcOverlay\n\t},\n\tprovide() {\n\t\treturn {\n\t\t\tabgabeTypeOptions: Vue.computed(() => this.abgabeTypeOptions),\n\t\t\tabgabetypenBetreuer: Vue.computed(() => this.abgabetypenBetreuer),\n\t\t\tallowedNotenOptions: Vue.computed(() => this.allowedNotenOptions),\n\t\t\tnotenOptionsNonFinal: Vue.computed(() => this.notenOptionsNonFinal),\n\t\t\tturnitin_link: Vue.computed(() => this.turnitin_link),\n\t\t\told_abgabe_beurteilung_link: Vue.computed(() => this.old_abgabe_beurteilung_link)\n\t\t}\n\t},\n\tprops: {\n\t\tviewData: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t\tdefault: () => ({name: '', uid: ''}),\n\t\t\tvalidator(value) {\n\t\t\t\treturn value && value.uid // && value.name -> extensive viewData use only for cis4 onwards\n\t\t\t}\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\ttableData: null,\n\t\t\tabgabetypenBetreuer: null,\n\t\t\tdetailIsFullscreen: false,\n\t\t\tphrasenPromise: null,\n\t\t\tphrasenResolved: false,\n\t\t\tturnitin_link: null,\n\t\t\told_abgabe_beurteilung_link: null,\n\t\t\tBETREUER_SAMMELMAIL_BUTTON_STUDENT: null,\n\t\t\tsaving: false,\n\t\t\tloading: false,\n\t\t\tabgabeTypeOptions: null,\n\t\t\tnotenOptions: null,\n\t\t\tallowedNotenOptions: null,\n\t\t\tnotenOptionsNonFinal: null,\n\t\t\tserienTermin: Vue.reactive({\n\t\t\t\tdatum: new Date(),\n\t\t\t\tbezeichnung: {\n\t\t\t\t\tpaabgabetyp_kurzbz: 'zwischen',\n\t\t\t\t\tbezeichnung: 'Zwischenabgabe'\n\t\t\t\t},\n\t\t\t\tkurzbz: '',\n\t\t\t\tupload_allowed: false\n\t\t\t}),\n\t\t\tshowAll: false,\n\t\t\ttabulatorUuid: Vue.ref(0),\n\t\t\tselectedData: [],\n\t\t\tdomain: '',\n\t\t\tstudent_uid: null,\n\t\t\tdetail: null,\n\t\t\tdetailOffset: 0,\n\t\t\tprojektarbeiten: null,\n\t\t\tselectedProjektarbeit: null,\n\t\t\ttableBuiltResolve: null,\n\t\t\ttableBuiltPromise: null,\n\t\t\tabgabeTableOptions: {\n\t\t\t\tminHeight: 250,\n\t\t\t\tindex: 'projektarbeit_id',\n\t\t\t\tlayout: 'fitDataStretch',\n\t\t\t\tplaceholder: Vue.computed(() => this.$p.t('global/noDataAvailable')),\n\t\t\t\tselectable: true,\n\t\t\t\tselectableCheck: this.selectionCheck,\n\t\t\t\trowHeight: 40,\n\t\t\t\tcolumns: [\n\t\t\t\t\t{\n\t\t\t\t\t\tformatter: function (cell, formatterParams, onRendered) {\n\t\t\t\t\t\t\t// create the built-in checkbox\n\t\t\t\t\t\t\tif(!cell.getRow().getData().selectable) return \n\t\t\t\t\t\t\tlet checkbox = document.createElement(\"input\");\n\t\t\t\t\t\t\tcheckbox.type = \"checkbox\";\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t// Handle select manually\n\t\t\t\t\t\t\tcheckbox.addEventListener(\"click\", (e) => {\n\t\t\t\t\t\t\t\te.stopPropagation();\n\n\t\t\t\t\t\t\t\t// call our function\n\t\t\t\t\t\t\t\tif (formatterParams && formatterParams.handleClick) {\n\t\t\t\t\t\t\t\t\tformatterParams.handleClick(e, cell);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tcell.getRow().getData().checkbox = checkbox\n\n\t\t\t\t\t\t\tlet wrapper = document.createElement(\"div\");\n\t\t\t\t\t\t\twrapper.style.cssText = \"display: flex; justify-content: center; align-items: center; height: 100%; width: 100%;\";\n\n\t\t\t\t\t\t\twrapper.appendChild(checkbox);\n\n\t\t\t\t\t\t\treturn wrapper;\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttitleFormatter: function (cell, formatterParams, onRendered) {\n\t\t\t\t\t\t\t// create the built-in checkbox\n\t\t\t\t\t\t\tlet checkbox = document.createElement(\"input\");\n\t\t\t\t\t\t\tcheckbox.type = \"checkbox\";\n\n\t\t\t\t\t\t\t// Handle \"select all\" manually\n\t\t\t\t\t\t\tcheckbox.addEventListener(\"click\", (e) => {\n\t\t\t\t\t\t\t\te.stopPropagation();\n\n\t\t\t\t\t\t\t\t// call our function\n\t\t\t\t\t\t\t\tif (formatterParams && formatterParams.handleClick) {\n\t\t\t\t\t\t\t\t\tformatterParams.handleClick(e, cell);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\treturn checkbox;\n\t\t\t\t\t\t},\n\t\t\t\t\t\thozAlign: \"center\",\n\t\t\t\t\t\theaderSort: false,\n\t\t\t\t\t\tformatterParams: {\n\t\t\t\t\t\t\thandleClick: this.selectHandler\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttitleFormatterParams: {\n\t\t\t\t\t\t\thandleClick: this.selectAllHandler\n\t\t\t\t\t\t},\n\t\t\t\t\t\twidth: 50,\n\t\t\t\t\t\tcssClass: 'sticky-col'\n\t\t\t\t\t},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4details'))), field: 'details', formatter: this.detailFormatter, headerFilter: false, headerSort: false, widthGrow: 1, tooltip: false, cssClass: 'sticky-col'},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4personenkennzeichen'))), headerFilter: true, field: 'pkz', formatter: this.pkzTextFormatter, widthGrow: 1, tooltip: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4vorname'))), field: 'vorname', headerFilter: true, formatter: this.centeredTextFormatter,widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4nachname'))), field: 'nachname', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4projekttyp'))), field: 'projekttyp_kurzbz', formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4stg'))), field: 'stg', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4sem'))), field: 'studiensemester_kurzbz', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4titel'))), field: 'titel', headerFilter: true, formatter: this.centeredTextFormatter, maxWidth: 500, widthGrow: 8},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4betreuerartv2'))), field: 'betreuerart_beschreibung',formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4prevAbgabetermin'))), field: 'prevTermin',\n\t\t\t\t\t\theaderFilter: dateFilter,\n\t\t\t\t\t\theaderFilterFunc: this.headerFilterTerminCol,\n\t\t\t\t\t\tsorter: this.sortFuncTerminCol,\n\t\t\t\t\t\tformatter: this.abgabterminFormatter, widthGrow: 1, width: 250, tooltip: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4nextAbgabetermin'))), field: 'nextTermin',\n\t\t\t\t\t\theaderFilter: dateFilter,\n\t\t\t\t\t\theaderFilterFunc: this.headerFilterTerminCol,\n\t\t\t\t\t\tsorter: this.sortFuncTerminCol,\n\t\t\t\t\t\tformatter: this.abgabterminFormatter, widthGrow: 1, width: 250, tooltip: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4qgate1Status'))),\n\t\t\t\t\t\theaderFilter: 'list',\n\t\t\t\t\t\theaderFilterParams: { valuesLookup: this.getQGateStatusList }, \n\t\t\t\t\t\tfield: 'qgate1Status', formatter: this.centeredTextFormatter, widthGrow: 1, width: 220, tooltip: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4qgate2Status'))),\n\t\t\t\t\t\theaderFilter: 'list',\n\t\t\t\t\t\theaderFilterParams: { valuesLookup: this.getQGateStatusList }, \n\t\t\t\t\t\tfield: 'qgate2Status', formatter: this.centeredTextFormatter, widthGrow: 1, width: 220, tooltip: false}\n\t\t\t\t],\n\t\t\t\tpersistence: false,\n\t\t\t\tpersistenceID: 'abgabeTableBetreuer2026-02-26'\n\t\t\t},\n\t\t\tabgabeTableEventHandlers: [{\n\t\t\t\tevent: \"tableBuilt\",\n\t\t\t\thandler: async () => {\n\t\t\t\t\tthis.tableBuiltResolve()\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\tevent: \"cellClick\",\n\t\t\t\thandler: async (e, cell) => {\n\t\t\t\t\tif(cell.getColumn().getField() === \"details\") {\n\t\t\t\t\t\tthis.setDetailComponent(cell.getValue())\n\t\t\t\t\t\tthis.undoSelection(cell)\n\t\t\t\t\t} else if (cell.getColumn().getField() === \"mail\") {\n\t\t\t\t\t\tthis.undoSelection(cell)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\tevent: \"rowSelectionChanged\",\n\t\t\t\thandler: async(data) => {\n\t\t\t\t\tthis.selectedData.filter(sd => !data.includes(sd)).forEach(fsd => {\n\t\t\t\t\t\tif(fsd.checkbox) fsd.checkbox.checked = false\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\tdata.forEach(d => {\n\t\t\t\t\t\tif(d.checkbox) d.checkbox.checked = true\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\tthis.selectedData = data\n\t\t\t\t}\n\t\t\t}\n\t\t\t]};\n\t},\n\tmethods: {\n\t\thandlePaUpdated(projektarbeit) {\n\t\t\tthis.checkAbgabetermineProjektarbeit(projektarbeit)\n\t\t\tthis.$refs.abgabeTable.tabulator.redraw(true)\n\t\t},\n\t\tsammelMailStudent(param) {\n\t\t\t\n\t\t\tconst recipientList = [];\n\t\t\tthis.selectedData.forEach(d => {\n\t\t\t\trecipientList.push(`${d.student_uid}@${this.domain}`)\n\t\t\t})\n\t\t\tconst uniqueRecipients = [...new Set(recipientList)];\n\t\t\tconst subject = \"\"; // empty subject line \n\t\t\tsplitMailsHelper(uniqueRecipients, param.originalEvent, subject, this.$fhcAlert, this.$p)\n\t\t},\n\t\tgetQGateStatusList() {\n\t\t\treturn [\n\t\t\t\tthis.$p.t('abgabetool/c4keinTerminVorhanden'),\n\t\t\t\tthis.$p.t('abgabetool/c4positivBenotet'),\n\t\t\t\tthis.$p.t('abgabetool/c4negativBenotet'),\n\t\t\t\tthis.$p.t('abgabetool/c4notYetGraded'),\n\t\t\t\tthis.$p.t('abgabetool/c4notSubmitted'),\n\t\t\t\tthis.$p.t('abgabetool/c4notHappenedYet')\n\t\t\t]\n\t\t},\n\t\tsortFuncTerminCol(a, b, aRow, bRow, column, dir, params) {\n\t\t\tif (a === null || typeof a === \"undefined\") return 1;\n\t\t\tif (b === null || typeof b === \"undefined\") return -1;\n\n\t\t\t// try to handle the prev/next interpretation consistently\n\t\t\t// can only make this wrong UX whise so whatever\n\t\t\tif(column._column.field == 'prevTermin') {\n\t\t\t\treturn Math.abs(b.diffMs) - Math.abs(a.diffMs)\n\t\t\t} else if (column._column.field == 'nextTermin') {\n\t\t\t\treturn Math.abs(a.diffMs) - Math.abs(b.diffMs)\n\t\t\t}\n\n\t\t\t// just in case someone reuses this\n\t\t\treturn Math.abs(b.diffMs) - Math.abs(a.diffMs)\n\t\t},\n\t\theaderFilterTerminCol(filterVal, rowVal) {\n\t\t\tif (!rowVal || !rowVal.luxonDate || !rowVal.luxonDate.isValid) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t\n\t\t\tconst rowDate = rowVal.luxonDate;\n\t\t\t\n\t\t\tconst toLuxon = (val) => {\n\t\t\t\tif (!val) return null;\n\t\t\t\tlet dt;\n\t\t\t\tif (val instanceof Date) {\n\t\t\t\t\tdt = luxon.DateTime.fromJSDate(val);\n\t\t\t\t} else if (typeof val === \"string\") {\n\t\t\t\t\tdt = luxon.DateTime.fromISO(val);\n\t\t\t\t} else { // fallback\n\t\t\t\t\tdt = luxon.DateTime.fromMillis(Number(val));\n\t\t\t\t}\n\n\t\t\t\treturn dt.isValid ? dt : null;\n\t\t\t};\n\n\t\t\tconst von = toLuxon(filterVal[0]);\n\t\t\tconst bis = toLuxon(filterVal[1]);\n\n\t\t\t// specific day\n\t\t\tif (von && !bis) {\n\t\t\t\treturn rowDate.hasSame(von, \"day\");\n\t\t\t}\n\n\t\t\t// range case\n\t\t\tif (von && bis) {\n\t\t\t\treturn rowDate >= von.startOf(\"day\") && rowDate <= bis.endOf(\"day\");\n\t\t\t}\n\n\t\t\treturn false\n\t\t},\n\t\tloadState() {\n\t\t\treturn JSON.parse(localStorage.getItem(this.abgabeTableOptions.persistenceID) || \"null\");\n\t\t},\n\t\tsaveState(table) {\n\t\t\t// avoid storing state after first restore part happened\n\t\t\tif(!this.stateRestored) return\n\t\t\tconst rawLayout = table.getColumnLayout();\n\t\t\tconst state = {\n\t\t\t\tcolumns: rawLayout.map(col => ({\n\t\t\t\t\tfield: col.field,\n\t\t\t\t\tvisible: col.visible,\n\t\t\t\t\twidth: col.width,\n\t\t\t\t})),\n\t\t\t\tsort: table.getSorters().map(s => ({\n\t\t\t\t\tfield: s.field,\n\t\t\t\t\tdir: s.dir,\n\t\t\t\t})),\n\t\t\t\tfilters: table.getFilters(),\n\t\t\t\theaderFilters: table.getHeaderFilters()\n\t\t\t};\n\n\t\t\tlocalStorage.setItem(this.abgabeTableOptions.persistenceID, JSON.stringify(state));\n\t\t},\n\t\thandleTableBuilt() {\n\t\t\tconst table = this.$refs.abgabeTable.tabulator\n\n\t\t\tthis.tableBuiltResolve()\n\n\t\t\ttable.on(\"columnMoved\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"columnResized\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"columnVisibilityChanged\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"filterChanged\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"headerFilterChanged\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"dataSorted\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"columnSorted\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"sortersChanged\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\tconst saved = this.loadState();\n\n\t\t\ttable.on(\"renderComplete\", () => {\n\t\t\t\tif(!this.stateRestored) {\n\n\t\t\t\t\tif (saved?.columns && !this.colLayoutRestored) {\n\t\t\t\t\t\tconst layout = saved.columns.map(col => ({\n\t\t\t\t\t\t\tfield: col.field,\n\t\t\t\t\t\t\twidth: col.width,\n\t\t\t\t\t\t\tvisible: col.visible,\n\t\t\t\t\t\t\t// add more if needed, but keep it simple\n\t\t\t\t\t\t}));\n\n\t\t\t\t\t\ttable.setColumnLayout(layout);\n\n\t\t\t\t\t\tthis.colLayoutRestored = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (saved?.filters && !this.filtersRestored) {\n\t\t\t\t\t\tthis.filtersRestored = true // instantly avoid retriggers\n\t\t\t\t\t\ttable.setFilter(saved.filters);\n\t\t\t\t\t}\n\t\t\t\t\tif (saved?.headerFilters && !this.headerFiltersRestored) {\n\t\t\t\t\t\tthis.headerFiltersRestored = true // instantly avoid retriggers\n\t\t\t\t\t\tfor (let hf of saved.headerFilters) {\n\t\t\t\t\t\t\ttable.setHeaderFilterValue(hf.field, hf.value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (saved?.sort?.length && !this.sortRestored) {\n\t\t\t\t\t\tthis.sortRestored = true;\n\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tconst sortList = saved.sort.map(s => {\n\t\t\t\t\t\t\t\tconst col = table.columnManager.findColumn(s.field);\n\t\t\t\t\t\t\t\tif (!col) {\n\t\t\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn { column: col, dir: s.dir };\n\t\t\t\t\t\t\t}).filter(Boolean);\n\n\t\t\t\t\t\t\ttable.setSort(sortList);\n\t\t\t\t\t\t}, 100);\n\t\t\t\t\t}\n\t\t\t\t\tthis.stateRestored = true\n\n\t\t\t\t}\n\n\t\t\t});\n\t\t},\n\t\tcheckQualityGateStatus(projekt) {\n\t\t\tconst qgate1Termine = []\n\t\t\tconst qgate2Termine = []\n\n\t\t\tprojekt.qgate1Status = this.$p.t('abgabetool/c4keinTerminVorhanden')// 'Kein Termin vorhanden'\n\t\t\tprojekt.qgate1StatusRank = 0\n\t\t\tprojekt.qgate2Status = this.$p.t('abgabetool/c4keinTerminVorhanden')\n\t\t\tprojekt.qgate2StatusRank = 0\n\n\t\t\tprojekt.abgabetermine.forEach(termin => {\n\t\t\t\tif(termin.paabgabetyp_kurzbz == 'qualgate1') qgate1Termine.push(termin)\n\t\t\t\tif(termin.paabgabetyp_kurzbz == 'qualgate2') qgate2Termine.push(termin)\n\t\t\t})\n\n\t\t\t// calculate qgateStatusRank and display the highest order status rank of all quality gate termine until one\n\t\t\t// counts as passed, which is just a positive note no matter if anything has been uploaded\n\n\t\t\t// reuse luxon calculated diffMs (termin.datum in relation to today) from previous datestyle check \n\t\t\tqgate1Termine.forEach(qgate => {\n\t\t\t\tif(qgate.note != null && projekt.qgate1StatusRank <= 5) {\n\t\t\t\t\tconst noteOpt = typeof qgate.note !== 'object' ? this.notenOptions.find(opt => opt.note == qgate.note) : qgate.note\n\t\t\t\t\tif(noteOpt.positiv) {\n\t\t\t\t\t\tprojekt.qgate1Status = this.$p.t('abgabetool/c4positivBenotet')\n\t\t\t\t\t\tprojekt.qgate1StatusRank = 5\n\t\t\t\t\t} else {\n\t\t\t\t\t\tprojekt.qgate1Status = this.$p.t('abgabetool/c4negativBenotet')\n\t\t\t\t\t\tprojekt.qgate1StatusRank = 4\n\t\t\t\t\t}\n\t\t\t\t} else if (qgate.note == null && projekt.qgate1StatusRank <= 3) {\n\t\t\t\t\tprojekt.qgate1Status = this.$p.t('abgabetool/c4notYetGraded')\n\t\t\t\t\tprojekt.qgate1StatusRank = 3\n\t\t\t\t} else if(qgate.upload_allowed == true && qgate.abgabedatum == null && projekt.qgate1StatusRank <= 2) {\n\t\t\t\t\tprojekt.qgate1Status = this.$p.t('abgabetool/c4notSubmitted')\n\t\t\t\t\tprojekt.qgate1StatusRank = 2\n\t\t\t\t} else if (qgate.upload_allowed == false && qgate.diffMs <= 0 && projekt.qgate1StatusRank <= 1) {\n\t\t\t\t\tprojekt.qgate1Status = this.$p.t('abgabetool/c4notHappenedYet')\n\t\t\t\t\tprojekt.qgate1StatusRank = 1\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tqgate2Termine.forEach(qgate => {\n\t\t\t\tif(qgate.note != null && projekt.qgate1StatusRank <= 5) {\n\t\t\t\t\tconst noteOpt = typeof qgate.note !== 'object' ? this.notenOptions.find(opt => opt.note == qgate.note) : qgate.note\n\t\t\t\t\tif(noteOpt.positiv) {\n\t\t\t\t\t\tprojekt.qgate2Status = this.$p.t('abgabetool/c4positivBenotet')\n\t\t\t\t\t\tprojekt.qgate2StatusRank = 5\n\t\t\t\t\t} else {\n\t\t\t\t\t\tprojekt.qgate2Status = this.$p.t('abgabetool/c4negativBenotet')\n\t\t\t\t\t\tprojekt.qgate2StatusRank = 4\n\t\t\t\t\t}\n\t\t\t\t} else if (qgate.note == null && projekt.qgate2StatusRank <= 3) {\n\t\t\t\t\tprojekt.qgate2Status = this.$p.t('abgabetool/c4notYetGraded')\n\t\t\t\t\tprojekt.qgate2StatusRank = 3\n\t\t\t\t} else if(qgate.upload_allowed == true && qgate.abgabedatum == null && projekt.qgate2StatusRank <= 2) {\n\t\t\t\t\tprojekt.qgate2Status = this.$p.t('abgabetool/c4notSubmitted')\n\t\t\t\t\tprojekt.qgate2StatusRank = 2\n\t\t\t\t} else if (qgate.upload_allowed == false && qgate.diffMs <= 0 && projekt.qgate2StatusRank <= 1) {\n\t\t\t\t\tprojekt.qgate2Status = this.$p.t('abgabetool/c4notHappenedYet')\n\t\t\t\t\tprojekt.qgate2StatusRank = 1\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\tcheckAbgabetermineProjektarbeit(projekt) {\n\t\t\tconst now = luxon.DateTime.now()\n\t\t\t// calculate Abgabetermin time diff to now and assign last and next to projekt\n\t\t\tprojekt.abgabetermine.forEach(termin => {\n\t\t\t\t\n\t\t\t\t// while already looping through each termin, calculate datestyle beforehand\n\t\t\t\ttermin.dateStyle = getDateStyleClass(termin, this.notenOptions)\n\n\t\t\t\tconst date = luxon.DateTime.fromISO(termin.datum).endOf('day')\n\t\t\t\ttermin.luxonDate = date\n\t\t\t\ttermin.diffMs = date.toMillis() - now.toMillis(); // positive = future, negative = past\n\n\t\t\t\tif (termin.diffMs < 0) {\n\t\t\t\t\tif (!projekt.prevTermin ||\n\t\t\t\t\t\ttermin.diffMs > projekt.prevTermin.diffMs // larger (less negative) = closer to now\n\t\t\t\t\t) {\n\t\t\t\t\t\tprojekt.prevTermin = termin;\n\t\t\t\t\t}\n\t\t\t\t} else if (termin.diffMs > 0) {\n\t\t\t\t\tif (!projekt.nextTermin ||\n\t\t\t\t\t\ttermin.diffMs < projekt.nextTermin.diffMs // smaller positive = closer to now\n\t\t\t\t\t) {\n\t\t\t\t\t\tprojekt.nextTermin = termin;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\n\t\t\t// seperate check for quality gates\n\t\t\tthis.checkQualityGateStatus(projekt)\n\t\t},\n\t\tabgabterminFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\n\t\t\tif(val) {\n\t\t\t\tlet icon = ''\n\t\t\t\tswitch(val.dateStyle) {\n\t\t\t\t\tcase 'verspaetet':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'verpasst':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'abzugeben':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'standard':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'abgegeben':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'beurteilungerforderlich':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'bestanden':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'nichtbestanden':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t}\n\n\t\t\t\tconst bezeichnung = val.bezeichnung?.bezeichnung ?? val.bezeichnung\n\n\t\t\t\treturn '
    ' +\n\t\t\t\t\t'
    ' +\n\t\t\t\t\ticon +\n\t\t\t\t\t'
    ' +\n\t\t\t\t\t'
    ' +\n\t\t\t\t\t'

    '+bezeichnung+' - '+ this.formatDate(val.datum)+'

    ' +\n\t\t\t\t\t'
    '+\n\t\t\t\t\t'
    '\n\n\t\t\t} else {\n\t\t\t\treturn ''\n\t\t\t}\n\n\t\t},\n\t\tselectHandler(e, cell) {\n\t\t\tconst row = cell.getRow();\n\n\t\t\tif(row.isSelected()) {\n\t\t\t\trow.deselect();\n\t\t\t} else {\n\t\t\t\trow.select();\n\t\t\t}\n\n\t\t\t// stop built-in handler\n\t\t\te.stopPropagation();\n\t\t\treturn false;\n\t\t},\n\t\tselectAllHandler(e, cell) {\n\t\t\tconst table = cell.getTable();\n\t\t\tconst rows = table.getRows();\n\n\t\t\t// custom select all logic\n\t\t\tconst allowed = rows.filter(r => r.getData().selectable);\n\t\t\tconst selected = allowed.every(r => r.isSelected());\n\n\t\t\tif(selected) {\n\t\t\t\tallowed.forEach(r => r.deselect());\n\t\t\t} else {\n\t\t\t\tallowed.forEach(r => r.select());\n\t\t\t}\n\n\t\t\t// stop built-in handler\n\t\t\te.stopPropagation();\n\t\t\treturn false;\n\t\t},\n\t\thandleToggleFullscreenDetail() {\n\t\t\tthis.detailIsFullscreen = !this.detailIsFullscreen\n\t\t},\n\t\tgetOptionLabelAbgabetyp(option){\n\t\t\treturn option.bezeichnung\n\t\t},\n\t\tformatDate(dateParam) {\n\t\t\tconst date = new Date(dateParam)\n\t\t\t// handle missing leading 0\n\t\t\tconst padZero = (num) => String(num).padStart(2, '0');\n\n\t\t\tconst month = padZero(date.getMonth() + 1); // Months are zero-based\n\t\t\tconst day = padZero(date.getDate());\n\t\t\tconst year = date.getFullYear();\n\n\t\t\treturn `${day}.${month}.${year}`;\n\t\t},\n\t\tundoSelection(cell) {\n\t\t\t// checks if cells row is selected and unselects -> imitates columns which dont trigger row selection\n\t\t\t// but actually just revert it after the fact\n\n\t\t\tconst row = cell.getRow()\n\t\t\tif(row.isSelected()) {\n\t\t\t\trow.deselect();\n\t\t\t}\n\t\t},\n\t\tselectionCheck(row) {\n\t\t\tconst data = row.getData()\n\t\t\tif(data?.betreuerart_kurzbz == 'Zweitbegutachter') return false\n\t\t\treturn true\n\t\t},\n\t\tshowDeadlines(){\n\t\t\tconst link = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router\n\t\t\t\t+ '/Cis/Abgabetool/Deadlines'\n\t\t\twindow.open(link, '_blank')\n\t\t},\n\t\ttoggleShowAll(showall) {\n\t\t\tthis.showAll = showall\n\t\t\tthis.loading = true\n\t\t\tthis.loadProjektarbeiten(showall, () => {\n\t\t\t\tthis.$refs.abgabeTable?.tabulator.redraw(true)\n\t\t\t\tthis.$refs.abgabeTable?.tabulator.setSort([]);\n\t\t\t\tthis.loading = false\n\t\t\t})\n\t\t},\n\t\topenAddSeriesModal() {\n\t\t\tthis.$refs.modalContainerAddSeries.show()\n\t\t},\n\t\taddSeries() {\n\t\t\tthis.saving = true\n\t\t\tthis.$api.call(ApiAbgabe.postSerientermin(\n\t\t\t\tthis.serienTermin.datum.toISOString(),\n\t\t\t\tthis.serienTermin.bezeichnung.paabgabetyp_kurzbz,\n\t\t\t\tthis.serienTermin.bezeichnung.bezeichnung,\n\t\t\t\tthis.serienTermin.kurzbz,\n\t\t\t\tthis.serienTermin.upload_allowed,\n\t\t\t\tthis.selectedData?.map(projekt => projekt.projektarbeit_id),\n\t\t\t\tfalse\n\t\t\t)).then(res => {\n\t\t\t\tif (res.meta.status === \"success\" && res.data) {\n\t\t\t\t\tthis.$fhcAlert.alertSuccess(this.$p.t('abgabetool/serienTerminGespeichert'))\n\n\t\t\t\t\tconst oldScrollLeft = this.$refs.abgabeTable?.tabulator.rowManager.scrollLeft\n\t\t\t\t\tconst oldScrollTop = this.$refs.abgabeTable?.tabulator.rowManager.scrollTop\n\t\t\t\t\tthis.loading = true\n\t\t\t\t\tthis.loadProjektarbeiten(this.showAll, () => {\n\t\t\t\t\t\tthis.$refs.abgabeTable?.tabulator.redraw(true)\n\t\t\t\t\t\tthis.$refs.abgabeTable?.tabulator.setSort([]);\n\t\t\t\t\t\tthis.loading = false\n\n\t\t\t\t\t\tVue.nextTick(()=> {\n\t\t\t\t\t\t\tconst table = this.$refs.abgabeTable?.tabulator.element.querySelector('.tabulator-tableholder')\n\t\t\t\t\t\t\tif(table) {\n\t\t\t\t\t\t\t\ttable.scrollLeft = oldScrollLeft;\n\t\t\t\t\t\t\t\ttable.scrollTop = oldScrollTop;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\t\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\tthis.$fhcAlert.alertError(this.$p.t('abgabetool/errorSerienterminSpeichern'))\n\t\t\t\t}\n\t\t\t}).finally(()=>{\n\t\t\t\tthis.saving = false\n\t\t\t})\n\n\t\t\tthis.$refs.modalContainerAddSeries.hide()\n\t\t},\n\t\tcreateInfoString(data) {\n\t\t\tlet str = '';\n\t\t\t\n\t\t\tdata.forEach(name => {\n\t\t\t\tstr += name\n\t\t\t\tstr += '; '\n\t\t\t})\n\t\t\t\n\t\t\treturn str\n\t\t},\n\t\tisPastDate(date) {\n\t\t\tconst deadline = luxon.DateTime.fromISO(date, { zone: 'Europe/Vienna' }).endOf('day');\n\t\t\tconst nowInVienna = luxon.DateTime.now().setZone('Europe/Vienna');\n\t\t\treturn nowInVienna > deadline;\n\t\t},\n\t\tsetDetailComponent(details){\n\t\t\tthis.loading=true\n\n\t\t\tconst pa = this.projektarbeiten?.retval?.find(projekarbeit => projekarbeit.projektarbeit_id == details.projektarbeit_id)\n\n\t\t\tlet paIsBenotet = false\n\t\t\tif(pa.note !== undefined && pa.note !== null) {\n\t\t\t\t// check if the note is not defined as a non final projektarbeit note\n\t\t\t\tconst opt = this.notenOptionsNonFinal.find(opt => opt.note)\n\t\t\t\t// if thats the case allow further work\n\t\t\t\tif(opt) paIsBenotet = false\n\t\t\t\t// else the PA is to be considered finished\n\t\t\t\tpaIsBenotet = true\n\t\t\t}\n\n\t\t\tif(pa?.abgabetermine?.length) {\n\t\t\t\tthis.$api.call(ApiAbgabe.getSignaturStatusForProjektarbeitAbgaben(pa.abgabetermine.map(termin => termin.paabgabe_id), pa.student_uid))\n\t\t\t\t\t.then(res => {\n\t\t\t\t\t\tif(res.meta.status === 'success') {\n\t\t\t\t\t\t\tres.data.forEach(paabgabe => {\n\t\t\t\t\t\t\t\tconst termin = pa.abgabetermine.find(abgabe => abgabe.paabgabe_id == paabgabe.paabgabe_id)\n\t\t\t\t\t\t\t\tif(termin && paabgabe.signatur !== undefined) termin.signatur = paabgabe.signatur\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t}\n\n\t\t\tpa.abgabetermine.forEach(termin => {\n\t\t\t\tconst noteOpt = this.allowedNotenOptions.find(opt => opt.note == termin.note)\n\t\t\t\tif(noteOpt) termin.note = noteOpt\n\t\t\t\ttermin.file = []\n\t\t\t\t\n\t\t\t\t// only set this if it has not been set yet and abgabetermin has a note (qgate)\n\t\t\t\tif(!termin.noteBackend && noteOpt) {\n\t\t\t\t\ttermin.noteBackend = noteOpt\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// update 08-01-2026: everybody is allowed to do everything in client, critical checks happen at backend level\n\t\t\t\t// termin.allowedToSave = true\n\t\t\t\t\n\t\t\t\t// update 21-01-2026: actually blocking operations on finished projektarbeiten seems like a decent idea\n\t\t\t\ttermin.allowedToSave = paIsBenotet ? false : true\n\t\t\t\t\n\t\t\t\t// lektoren are not allowed to delete deadlines with existing submissions\n\t\t\t\ttermin.allowedToDelete = termin.allowedToSave && !termin.abgabedatum\n\t\t\t\t\n\t\t\t\ttermin.bezeichnung = this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz === termin.paabgabetyp_kurzbz)\n\n\t\t\t})\n\t\t\t\n\t\t\tpa.student_uid = details.student_uid\n\t\t\tpa.student = `${pa.vorname} ${pa.nachname}`\n\t\t\t\n\t\t\tthis.selectedProjektarbeit = pa\n\t\t\tthis.$refs.modalContainerAbgabeDetail.show()\n\t\t\n\t\t\n\t\t\tthis.loading = false\n\t\t\t\n\t\t},\n\t\tcenteredTextFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\t\t\tif(!val) return\n\t\t\t\n\t\t\treturn '
    ' +\n\t\t\t\t'

    '+val+'

    '\n\t\t},\n\t\tdetailFormatter(cell) {\n\t\t\treturn '
    ' +\n\t\t\t\t'
    '\n\t\t},\n\t\tbeurteilungFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\t\t\tif(val) {\n\t\t\t\treturn '
    ' +\n\t\t\t\t\t'
    '\n\t\t\t} else return '-'\n\t\t},\n\t\tpkzTextFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\n\t\t\treturn '
    ' +\n\t\t\t\t''+val+'
    '\n\t\t},\n\t\ttableResolve(resolve) {\n\t\t\tthis.tableBuiltResolve = resolve\n\t\t},\n\t\tbuildMailToLink(abgabe) {\n\t\t\treturn 'mailto:' + abgabe.uid +'@'+ this.domain\n\t\t},\n\t\tbuildPKZ(projekt) {\n\t\t\treturn `${projekt.uid} / ${projekt.matrikelnr}`\n\t\t},\n\t\tbuildStg(projekt) {\n\t\t\treturn (projekt.typ + projekt.kurzbz)?.toUpperCase()\t\n\t\t},\n\t\tsetupData(data){\n\t\t\t\n\t\t\t\n\t\t\tthis.projektarbeiten = data[0]\n\t\t\tthis.domain = data[1]\n\t\t\t\n\t\t\tthis.tableData = data[0]?.retval?.map(projekt => {\n\t\t\t\tthis.checkAbgabetermineProjektarbeit(projekt)\n\t\t\t\tprojekt.selectable = projekt.betreuerart_kurzbz !== 'Zweitbegutachter'\n\n\t\t\t\treturn {\n\t\t\t\t\t...projekt,\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\tstudent_uid: projekt.uid,\n\t\t\t\t\t\tprojektarbeit_id: projekt.projektarbeit_id,\n\t\t\t\t\t},\n\t\t\t\t\tpkz: this.buildPKZ(projekt),\n\t\t\t\t\tbeurteilung: projekt.beurteilungLink ?? null,\n\t\t\t\t\tsem: projekt.studiensemester_kurzbz,\n\t\t\t\t\tstg: this.buildStg(projekt),\n\t\t\t\t\tmail: this.buildMailToLink(projekt),\n\t\t\t\t\ttyp: projekt.projekttyp_kurzbz,\n\t\t\t\t\ttitel: projekt.titel\n\t\t\t\t}\n\t\t\t})\n\t\t\t\n\t\t\tthis.$refs.abgabeTable.tabulator.setColumns(this.abgabeTableOptions.columns)\n\t\t\tthis.$refs.abgabeTable.tabulator.setData(this.tableData);\n\t\t},\n\t\tloadProjektarbeiten(all = false, callback) {\n\t\t\tthis.$api.call(ApiAbgabe.getMitarbeiterProjektarbeiten(all))\n\t\t\t\t.then(res => {\n\t\t\t\t\tif(res?.data) this.setupData(res.data)\n\t\t\t\t}).finally(() => {\n\t\t\t\t\tif(callback) {\n\t\t\t\t\t\tcallback()\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t},\n\t\tloadAbgaben(details) {\n\t\t\treturn new Promise((resolve) => {\n\t\t\t\tthis.$api.call(ApiAbgabe.getStudentProjektabgaben(details))\n\t\t\t\t\t.then(res => {\n\t\t\t\t\t\tresolve(res)\n\t\t\t\t\t})\n\t\t\t})\n\t\t},\n\t\thandleUuidDefined(uuid) {\n\t\t\tthis.tabulatorUuid = uuid\n\t\t},\n\t\tcalcMaxTableHeight() {\n\t\t\tconst tableID = this.tabulatorUuid ? ('-' + this.tabulatorUuid) : ''\n\t\t\tconst tableDataSet = document.getElementById('filterTableDataset' + tableID);\n\t\t\tif(!tableDataSet) return\n\t\t\tconst rect = tableDataSet.getBoundingClientRect();\n\n\t\t\tthis.abgabeTableOptions.height = window.visualViewport.height - rect.top - 80\n\t\t\tthis.$refs.abgabeTable.tabulator.setHeight(this.abgabeTableOptions.height)\n\t\t},\n\t\tasync setupMounted() {\n\t\t\tthis.tableBuiltPromise = new Promise(this.tableResolve)\n\t\t\tawait this.tableBuiltPromise\n\n\t\t\tthis.loadProjektarbeiten()\n\n\t\t\tthis.calcMaxTableHeight()\n\n\t\t}\n\t},\n\twatch: {\n\t\t'serienTermin.bezeichnung'(newVal) {\n\t\t\tif(newVal?.paabgabetyp_kurzbz === 'qualgate1' || newVal?.paabgabetyp_kurzbz === 'qualgate2') {\n\t\t\t\tthis.serienTermin.kurzbz = newVal.bezeichnung\n\t\t\t}\n\n\t\t\tthis.serienTermin.upload_allowed = newVal.upload_allowed_default\n\t\t},\n\t},\n\tcomputed: {\n\t\temailItems() {\n\t\t\tconst menu = []\n\n\t\t\tif(this.BETREUER_SAMMELMAIL_BUTTON_STUDENT){\n\t\t\t\tmenu.push({\n\t\t\t\t\tlabel: this.$p.t('abgabetool/c4sendEmailStudierendev2', [this.uniqueStudentEmailCount]),\n\t\t\t\t\tcommand: this.sammelMailStudent\n\t\t\t\t})\n\t\t\t}\n\n\t\t\treturn menu\n\t\t},\n\t\tuniqueStudentEmailCount() {\n\t\t\tconst emails = new Set();\n\n\t\t\tthis.selectedData.forEach(row => {\n\t\t\t\tif (row.student_uid) {\n\t\t\t\t\temails.add(row.student_uid); // actually dont need domain for this\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn emails.size;\n\t\t},\n\t\tgetAllowedAbgabeTypeOptions() {\n\t\t\treturn this.abgabeTypeOptions.filter(opt => this.abgabetypenBetreuer.includes(opt.paabgabetyp_kurzbz))\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.phrasenPromise = this.$p.loadCategory(['abgabetool', 'global'])\n\t\tthis.phrasenPromise.then(()=> {this.phrasenResolved = true})\n\t\t// fetch config to avoid hard coded links\n\t\tthis.$api.call(ApiAbgabe.getConfig()).then(res => {\n\t\t\tthis.turnitin_link = res.data?.turnitin_link\n\t\t\tthis.old_abgabe_beurteilung_link = res.data?.old_abgabe_beurteilung_link\n\t\t\tthis.abgabetypenBetreuer = res.data?.abgabetypenBetreuer\n\t\t\tthis.BETREUER_SAMMELMAIL_BUTTON_STUDENT = res.data?.BETREUER_SAMMELMAIL_BUTTON_STUDENT\n\t\t}).catch(e => {\n\t\t\tthis.loading = false\n\t\t})\n\t\t\n\t\t// fetch noten options\n\t\t//TODO: SWITCH TO NOTEN API ONCE NOTENTOOL IS IN MASTER TO AVOID DUPLICATE API\n\t\tthis.$api.call(ApiAbgabe.getNoten()).then(res => {\n\t\t\tif(res.meta.status == 'success') {\n\t\t\t\tthis.notenOptions = res.data[0]\n\n\t\t\t\tthis.allowedNotenOptions = this.notenOptions.filter(\n\t\t\t\t\topt => res.data[1].includes(opt.note)\n\t\t\t\t)\n\t\t\t\t\n\t\t\t\tthis.notenOptionsNonFinal = this.notenOptions.filter(\n\t\t\t\t\topt => res.data[2].includes(opt.note)\n\t\t\t\t)\n\t\t\t}\n\t\t\t\n\t\t}).catch(e => {\n\t\t\tthis.loading = false\n\t\t})\n\t\t\n\t\t// fetch abgabetypen options\n\t\tthis.$api.call(ApiAbgabe.getPaAbgabetypen()).then(res => {\n\t\t\tthis.abgabeTypeOptions = res.data\n\t\t}).catch(e => {\n\t\t\tthis.loading = false\n\t\t})\n\t},\n\tmounted() {\n\t\tthis.setupMounted()\n\t},\n\ttemplate: `\n\t\n `,\n};\n\nexport default AbgabetoolMitarbeiter;\n","export default {\n\tname: 'BootstrapOffcanvas',\n\tdata: () => ({\n\t\toffcanvas: null\n\t}),\n\tprops: {\n\t\tbackdrop: {\n\t\t\ttype: [Boolean, String],\n\t\t\tdefault: true,\n\t\t\tvalidator(value) {\n\t\t\t\treturn ['static', true, false].includes(value);\n\t\t\t}\n\t\t},\n\t\tkeyboard: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true\n\t\t},\n\t\tscroll: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t},\n\t\tplacement: {\n\t\t\ttype: String,\n\t\t\tdefault: 'start', // start | end | top | bottom\n\t\t\tvalidator(value) {\n\t\t\t\treturn ['start', 'end', 'top', 'bottom'].includes(value);\n\t\t\t}\n\t\t},\n\t\tnoCloseBtn: Boolean,\n\t\theaderClass: {\n\t\t\ttype: [String, Array, Object],\n\t\t\tdefault: ''\n\t\t},\n\t\tbodyClass: {\n\t\t\ttype: [String, Array, Object],\n\t\t\tdefault: 'p-4'\n\t\t},\n\t\tfooterClass: {\n\t\t\ttype: [String, Array, Object],\n\t\t\tdefault: ''\n\t\t},\n\t\tdialogClass: [String, Array, Object]\n\t},\n\temits: [\n\t\t\"hideBsOffcanvas\",\n\t\t\"hiddenBsOffcanvas\",\n\t\t\"hidePreventedBsOffcanvas\",\n\t\t\"showBsOffcanvas\",\n\t\t\"shownBsOffcanvas\"\n\t],\n\tmethods: {\n\t\tdispose() {\n\t\t\treturn this.offcanvas?.dispose();\n\t\t},\n\t\thide() {\n\t\t\treturn this.offcanvas?.hide();\n\t\t},\n\t\tshow(relatedTarget) {\n\t\t\treturn this.offcanvas?.show(relatedTarget);\n\t\t},\n\t\ttoggle() {\n\t\t\treturn this.offcanvas?.toggle();\n\t\t},\n\t\tpopup(body, options, title, footer) {\n\t\t\tconst BsOffcanvas = this,\n\t\t\t\tslots = {};\n\n\t\t\tif (body !== undefined)\n\t\t\t\tslots.default = () => body;\n\t\t\tif (title !== undefined)\n\t\t\t\tslots.title = () => title;\n\t\t\tif (footer !== undefined)\n\t\t\t\tslots.footer = () => footer;\n\n\t\t\tlet includedPrimevue = false;\n\t\t\tif (typeof primevue !== 'undefined')\n\t\t\t\tincludedPrimevue = true;\n\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tconst instance = Vue.createApp({\n\t\t\t\t\tname: 'OffcanvasTmpApp',\n\t\t\t\t\tsetup() {\n\t\t\t\t\t\treturn () =>\n\t\t\t\t\t\t\tVue.h(BsOffcanvas, {\n\t\t\t\t\t\t\t\tclass: 'offcanvas-wrapper',\n\t\t\t\t\t\t\t\tref: 'offcanvas',\n\t\t\t\t\t\t\t\t...options\n\t\t\t\t\t\t\t}, slots);\n\t\t\t\t\t},\n\t\t\t\t\tmounted() {\n\t\t\t\t\t\tthis.$refs.offcanvas.show();\n\t\t\t\t\t},\n\t\t\t\t\tbeforeUnmount() {\n\t\t\t\t\t\tif (this.$refs.offcanvas)\n\t\t\t\t\t\t\tthis.$refs.offcanvas.result !== false ? resolve(this.$refs.offcanvas.result) : reject();\n\t\t\t\t\t},\n\t\t\t\t\tunmounted() {\n\t\t\t\t\t\twrapper.parentElement.removeChild(wrapper);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tconst wrapper = document.createElement('div');\n\n\t\t\t\tif (includedPrimevue) {\n\t\t\t\t\tinstance.use(primevue.config.default, { zIndex: { overlay: 9999 } });\n\t\t\t\t}\n\n\t\t\t\timport('../../plugins/Phrasen.js').then((Phrasen) => {\n\t\t\t\t\tinstance.use(Phrasen.default);\n\t\t\t\t\tinstance.mount(wrapper);\n\t\t\t\t\tdocument.body.appendChild(wrapper);\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t},\n\tmounted() {\n\t\tif (this.$refs.offcanvas) {\n\t\t\tthis.offcanvas = new bootstrap.Offcanvas(this.$refs.offcanvas, {\n\t\t\t\tbackdrop: this.backdrop,\n\t\t\t\tkeyboard: this.keyboard,\n\t\t\t\tscroll: this.scroll\n\t\t\t});\n\t\t}\n\t},\n\ttemplate: `\n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\t\t
    \n\t`\n}\n","/**\n * Copyright (C) 2025 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tgetAllStudiensemesterAndAktOrNext() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/organisation/Studiensemester/getAllStudiensemesterAndAktOrNext',\n\t\t};\n\t},\n\tgetAll(order = null, start = null)\n\t{\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: 'api/frontend/v1/organisation/studiensemester/getAll',\n\t\t\tparams: { order, start }\n\t\t};\n\t}\n};","export const AbgabeterminStatusLegende = {\n\tname: 'AbgabeterminStatusLegende',\n\ttemplate: `\t\n\t\t
    \n\t\t\t
    \n\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t('abgabetool/c4tooltipVerspaetet')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t('abgabetool/c4tooltipVerpasst')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t('abgabetool/c4tooltipAbzugeben')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t('abgabetool/c4tooltipStandardv2')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t('abgabetool/c4tooltipAbgegeben')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t('abgabetool/c4tooltipBeurteilungerforderlich')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t('abgabetool/c4tooltipBestanden')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t('abgabetool/c4tooltipNichtBestanden')) }}
    \n\t\t\t\t\t
    \t\n\t\t\t\t
    \n\n\t\t\t
    \n\t\t
    \t\n\t`\n};\nexport default AbgabeterminStatusLegende;","import {CoreFilterCmpt} from \"../../../components/filter/Filter.js\";\nimport AbgabeDetail from \"./AbgabeMitarbeiterDetail.js\";\nimport BsModal from '../../Bootstrap/Modal.js';\nimport BsOffcanvas from '../../Bootstrap/Offcanvas.js';\nimport VueDatePicker from '../../vueDatepicker.js.php';\nimport ApiAbgabe from '../../../api/factory/abgabe.js'\nimport ApiStudiensemester from '../../../api/factory/studiensemester.js';\nimport AbgabeterminStatusLegende from \"./StatusLegende.js\";\nimport FhcOverlay from \"../../Overlay/FhcOverlay.js\";\nimport { splitMailsHelper } from \"../../../helpers/EmailHelpers.js\"\nimport { getDateStyleClass} from \"./getDateStyleClass.js\";\nimport { dateFilter } from '../../../tabulator/filters/Dates.js';\n\nexport const AbgabetoolAssistenz = {\n\tname: \"AbgabetoolAssistenz\",\n\tcomponents: {\n\t\tAbgabeterminStatusLegende,\n\t\tBsModal,\n\t\tBsOffcanvas,\n\t\tCoreFilterCmpt,\n\t\tAbgabeDetail,\n\t\tCheckbox: primevue.checkbox,\n\t\tDropdown: primevue.dropdown,\n\t\tInplace: primevue.inplace,\n\t\tTextarea: primevue.textarea,\n\t\tTimeline: primevue.timeline,\n\t\tTieredMenu: primevue.tieredmenu,\n\t\tVueDatePicker,\n\t\tFhcOverlay\n\t},\n\tprovide() {\n\t\treturn {\n\t\t\tabgabeTypeOptions: Vue.computed(() => this.abgabeTypeOptions),\n\t\t\tallowedNotenOptions: Vue.computed(() => this.allowedNotenOptions),\n\t\t\tnotenOptionsNonFinal: Vue.computed(() => this.notenOptionsNonFinal),\n\t\t\tturnitin_link: Vue.computed(() => this.turnitin_link),\n\t\t\told_abgabe_beurteilung_link: Vue.computed(() => this.old_abgabe_beurteilung_link),\n\t\t\tabgabetypenBetreuer: Vue.computed(() => this.abgabeTypeOptions)\n\t\t}\n\t},\n\tprops: {\n\t\tstg_kz_prop: {\n\t\t\tdefault: null\n\t\t},\n\t\tviewData: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t\tdefault: () => ({name: '', uid: ''}),\n\t\t\tvalidator(value) {\n\t\t\t\treturn value && value.uid // && value.name -> extensive viewData use only for cis4 onwards\n\t\t\t}\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\ttableData: null,\n\t\t\tstudiensemesterOptions: null,\n\t\t\tallSem: null,\n\t\t\tcurSem: null,\n\t\t\tnotenOptionFilter: null,\n\t\t\tinplaceToggle: false,\n\t\t\theaderFiltersRestored: false,\n\t\t\tfiltersRestored: false,\n\t\t\tcolLayoutRestored: false,\n\t\t\tsortRestored: false,\n\t\t\tstateRestored: false,\n\t\t\ttimelineProjekt: null,\n\t\t\tselectedStudiengangOption: null,\n\t\t\tstudiengaengeOptions: null,\n\t\t\tdetailIsFullscreen: false,\n\t\t\tallConfigPromise: null,\n\t\t\tphrasenPromise: null,\n\t\t\tphrasenResolved: false,\n\t\t\tturnitin_link: null,\n\t\t\told_abgabe_beurteilung_link: null,\n\t\t\tASSISTENZ_SAMMELMAIL_BUTTON_STUDENT: null,\n\t\t\tASSISTENZ_SAMMELMAIL_BUTTON_BETREUER: null,\n\t\t\tsaving: false,\n\t\t\tloading: false,\n\t\t\tabgabeTypeOptions: null,\n\t\t\tnotenOptions: null,\n\t\t\tallowedNotenFilterOptions: null,\n\t\t\tallowedNotenOptions: null,\n\t\t\tnotenOptionsNonFinal: null,\n\t\t\tserienTermin: Vue.reactive({\n\t\t\t\tdatum: new Date(),\n\t\t\t\tbezeichnung: {\n\t\t\t\t\tpaabgabetyp_kurzbz: 'zwischen',\n\t\t\t\t\tbezeichnung: 'Zwischenabgabe'\n\t\t\t\t},\n\t\t\t\tkurzbz: '',\n\t\t\t\tfixtermin: false,\n\t\t\t\tinvertedFixtermin: true,\n\t\t\t\tupload_allowed: false\n\t\t\t}),\n\t\t\tshowAll: false,\n\t\t\ttabulatorUuid: Vue.ref(0),\n\t\t\tselectedData: [],\n\t\t\tdomain: '',\n\t\t\tstudent_uid: null,\n\t\t\tdetail: null,\n\t\t\tdetailOffset: 0,\n\t\t\tprojektarbeiten: null,\n\t\t\tselectedProjektarbeit: null,\n\t\t\ttableBuiltResolve: null,\n\t\t\ttableBuiltPromise: null,\n\t\t\tabgabeTableOptions: {\n\t\t\t\tminHeight: 250,\n\t\t\t\tindex: 'projektarbeit_id',\n\t\t\t\tlayout: 'fitData',\n\t\t\t\tplaceholder: Vue.computed(() => this.$capitalize(this.$p.t('global/noDataAvailable'))),\n\t\t\t\tselectable: true,\n\t\t\t\tselectableCheck: this.selectionCheck,\n\t\t\t\trowHeight: 40,\n\t\t\t\trenderVerticalBuffer: 2000,\n\t\t\t\tcolumns: [\n\t\t\t\t\t{\n\t\t\t\t\t\tformatter: function (cell, formatterParams, onRendered) {\n\t\t\t\t\t\t\t// create the built-in checkbox\n\t\t\t\t\t\t\tif(!cell.getRow().getData().selectable) return\n\t\t\t\t\t\t\tlet checkbox = document.createElement(\"input\");\n\t\t\t\t\t\t\tcheckbox.type = \"checkbox\";\n\n\t\t\t\t\t\t\t// Handle select manually\n\t\t\t\t\t\t\tcheckbox.addEventListener(\"click\", (e) => {\n\t\t\t\t\t\t\t\te.stopPropagation();\n\n\t\t\t\t\t\t\t\t// call our function\n\t\t\t\t\t\t\t\tif (formatterParams && formatterParams.handleClick) {\n\t\t\t\t\t\t\t\t\tformatterParams.handleClick(e, cell);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tcell.getRow().getData().checkbox = checkbox\n\n\t\t\t\t\t\t\tlet wrapper = document.createElement(\"div\");\n\t\t\t\t\t\t\twrapper.style.cssText = \"display: flex; justify-content: center; align-items: center; height: 100%; width: 100%;\";\n\n\t\t\t\t\t\t\twrapper.appendChild(checkbox);\n\n\t\t\t\t\t\t\treturn wrapper;\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttitleFormatter: function (cell, formatterParams, onRendered) {\n\t\t\t\t\t\t\t// create the built-in checkbox\n\t\t\t\t\t\t\tlet checkbox = document.createElement(\"input\");\n\t\t\t\t\t\t\tcheckbox.type = \"checkbox\";\n\n\t\t\t\t\t\t\t// Handle \"select all\" manually\n\t\t\t\t\t\t\tcheckbox.addEventListener(\"click\", (e) => {\n\t\t\t\t\t\t\t\te.stopPropagation();\n\n\t\t\t\t\t\t\t\t// call our function\n\t\t\t\t\t\t\t\tif (formatterParams && formatterParams.handleClick) {\n\t\t\t\t\t\t\t\t\tformatterParams.handleClick(e, cell);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\treturn checkbox;\n\t\t\t\t\t\t},\n\t\t\t\t\t\thozAlign: \"center\",\n\t\t\t\t\t\theaderSort: false,\n\t\t\t\t\t\tformatterParams: {\n\t\t\t\t\t\t\thandleClick: this.selectHandler\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttitleFormatterParams: {\n\t\t\t\t\t\t\thandleClick: this.selectAllHandler\n\t\t\t\t\t\t},\n\t\t\t\t\t\twidth: 50,\n\t\t\t\t\t\tcssClass: 'sticky-col'\n\t\t\t\t\t},\n\t\t\t\t// {\n\t\t\t\t\t// \tfield: 'rowSelection',\n\t\t\t\t\t// \tformatter: 'rowSelection',\n\t\t\t\t\t// \ttitleFormatter: 'rowSelection',\n\t\t\t\t\t// \ttitleFormatterParams: {\n\t\t\t\t\t// \t\trowRange: \"active\" // Only toggle the values of the active filtered rows\n\t\t\t\t\t// \t},\n\t\t\t\t\t// \thozAlign:\"center\",\n\t\t\t\t\t// \theaderSort: false,\n\t\t\t\t\t// \tfrozen: true,\n\t\t\t\t\t// \twidth: 40\n\t\t\t\t\t// },\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4details'))), field: 'details', headerFilter: false, headerSort: false, formatter: this.formAction, tooltip:false, minWidth: 150, cssClass: 'sticky-col'},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4personenkennzeichen'))), headerFilter: true, field: 'pkz', formatter: this.pkzTextFormatter, widthGrow: 1, tooltip: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4vorname'))), field: 'student_vorname', headerFilter: true, formatter: this.centeredTextFormatter,widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4nachname'))), field: 'student_nachname', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4studstatus'))), field: 'studienstatus', headerFilter: true, formatter: this.centeredTextFormatter,widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4orgform'))), field: 'orgform', headerFilter: true, formatter: this.centeredTextFormatter,widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4projekttyp'))), field: 'projekttyp_kurzbz', formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4stg'))), field: 'stg', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4note'))), field: 'note_bez', headerFilter: true,\n\t\t\t\t\t\t formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4sem'))), field: 'studiensemester_kurzbz', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4titel'))), field: 'titel', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4erstbetreuerv2'))), field: 'erstbetreuer', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4erstbetreuerTitelPre'))), field: 'betreuer_titelpre', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1, visible: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4erstbetreuerVorname'))), field: 'betreuer_vorname', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1, visible: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4erstbetreuerNachname'))), field: 'betreuer_nachname', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1, visible: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4erstbetreuerTitelPost'))), field: 'betreuer_titelpost', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1, visible: false},\n\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4zweitbetreuerv2'))), field: 'zweitbetreuer', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},\n\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4zweitbetreuerTitelPre'))), field: 'zweitbetreuer_titelpre', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1, visible: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4zweitbetreuerVorname'))), field: 'zweitbetreuer_vorname', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1, visible: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4zweitbetreuerNachname'))), field: 'zweitbetreuer_nachname', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1, visible: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4zweitbetreuerTitelPost'))), field: 'zweitbetreuer_titelpost', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1, visible: false},\n\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4prevAbgabetermin'))),\n\t\t\t\t\t\theaderFilter: dateFilter,\n\t\t\t\t\t\theaderFilterFunc: this.headerFilterTerminCol,\n\t\t\t\t\t\tsorter: this.sortFuncTerminCol,\n\t\t\t\t\t\tfield: 'prevTermin', formatter: this.abgabterminFormatter, widthGrow: 1, width: 250, tooltip: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4nextAbgabetermin'))), field: 'nextTermin',\n\t\t\t\t\t\theaderFilter: dateFilter,\n\t\t\t\t\t\theaderFilterFunc: this.headerFilterTerminCol,\n\t\t\t\t\t\tsorter: this.sortFuncTerminCol,\n\t\t\t\t\t\tformatter: this.abgabterminFormatter, widthGrow: 1, width: 250, tooltip: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4qgate1Status'))),\n\t\t\t\t\t\theaderFilter: 'list',\n\t\t\t\t\t\theaderFilterParams: { valuesLookup: this.getQGateStatusList },\n\t\t\t\t\t\tfield: 'qgate1Status', formatter: this.centeredTextFormatter, widthGrow: 1, width: 220, tooltip: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4qgate2Status'))),\n\t\t\t\t\t\theaderFilter: 'list',\n\t\t\t\t\t\theaderFilterParams: { valuesLookup: this.getQGateStatusList },\n\t\t\t\t\t\tfield: 'qgate2Status', formatter: this.centeredTextFormatter, widthGrow: 1, width: 220, tooltip: false},\n\t\t\t\t],\n\t\t\t\tpersistence: false,\n\t\t\t\tpersistenceID: \"abgabetool_2026_02_26\"\n\t\t\t},\n\t\t\tabgabeTableEventHandlers: [\n\t\t\t{\n\t\t\t\tevent: \"rowSelectionChanged\",\n\t\t\t\thandler: async(data) => \n\t\t\t\t{\n\t\t\t\t\tthis.selectedData.filter(sd => !data.includes(sd)).forEach(fsd => {\n\t\t\t\t\t\tif(fsd.checkbox) fsd.checkbox.checked = false\n\t\t\t\t\t})\n\n\t\t\t\t\tdata.forEach(d => {\n\t\t\t\t\t\tif(d.checkbox) d.checkbox.checked = true\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\tthis.selectedData = data\n\t\t\t\t}\n\t\t\t}\n\t\t\t]};\n\t},\n\tmethods: {\n\t\thandlePaUpdated(projektarbeit) {\n\t\t\tthis.checkAbgabetermineProjektarbeit(projektarbeit)\n\t\t\tthis.$refs.abgabeTable.tabulator.redraw(true)\n\t\t},\n\t\tgetQGateStatusList() {\n\t\t\treturn [\n\t\t\t\tthis.$p.t('abgabetool/c4keinTerminVorhanden'),\n\t\t\t\tthis.$p.t('abgabetool/c4positivBenotet'),\n\t\t\t\tthis.$p.t('abgabetool/c4negativBenotet'),\n\t\t\t\tthis.$p.t('abgabetool/c4notYetGraded'),\n\t\t\t\tthis.$p.t('abgabetool/c4notSubmitted'),\n\t\t\t\tthis.$p.t('abgabetool/c4notHappenedYet')\n\t\t\t]\t\n\t\t},\n\t\tsortFuncTerminCol(a, b, aRow, bRow, column, dir, params) {\n\t\t\tif (a === null || typeof a === \"undefined\") return 1;\n\t\t\tif (b === null || typeof b === \"undefined\") return -1;\n\t\t\t\n\t\t\t// try to handle the prev/next interpretation consistently\n\t\t\t// can only make this wrong UX whise so whatever\n\t\t\tif(column._column.field == 'prevTermin') {\n\t\t\t\treturn Math.abs(b.diffMs) - Math.abs(a.diffMs)\n\t\t\t} else if (column._column.field == 'nextTermin') {\n\t\t\t\treturn Math.abs(a.diffMs) - Math.abs(b.diffMs)\n\t\t\t}\n\t\t\t\n\t\t\t// just in case someone reuses this\n\t\t\treturn Math.abs(b.diffMs) - Math.abs(a.diffMs) \n\t\t},\n\t\theaderFilterTerminCol(filterVal, rowVal) {\n\t\t\tif (!rowVal || !rowVal.luxonDate || !rowVal.luxonDate.isValid) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst rowDate = rowVal.luxonDate;\n\n\t\t\tconst toLuxon = (val) => {\n\t\t\t\tif (!val) return null;\n\t\t\t\tlet dt;\n\t\t\t\tif (val instanceof Date) {\n\t\t\t\t\tdt = luxon.DateTime.fromJSDate(val);\n\t\t\t\t} else if (typeof val === \"string\") {\n\t\t\t\t\tdt = luxon.DateTime.fromISO(val);\n\t\t\t\t} else { // fallback\n\t\t\t\t\tdt = luxon.DateTime.fromMillis(Number(val));\n\t\t\t\t}\n\n\t\t\t\treturn dt.isValid ? dt : null;\n\t\t\t};\n\n\t\t\tconst von = toLuxon(filterVal[0]);\n\t\t\tconst bis = toLuxon(filterVal[1]);\n\n\t\t\t// specific day\n\t\t\tif (von && !bis) {\n\t\t\t\treturn rowDate.hasSame(von, \"day\");\n\t\t\t}\n\n\t\t\t// range case\n\t\t\tif (von && bis) {\n\t\t\t\treturn rowDate >= von.startOf(\"day\") && rowDate <= bis.endOf(\"day\");\n\t\t\t}\n\n\t\t\treturn false\n\t\t},\n\t\tsammelMailStudent(param) {\n\n\t\t\tconst recipientList = [];\n\t\t\tthis.selectedData.forEach(d => {\n\t\t\t\trecipientList.push(`${d.student_uid}@${this.domain}`)\n\t\t\t})\n\n\t\t\tconst uniqueRecipients = [...new Set(recipientList)];\n\t\t\tconst subject = this.$p.t('abgabetool/c4sammelmailStudentBetreff', [this.selectedStudiengangOption?.bezeichnung]);\n\t\t\tsplitMailsHelper(uniqueRecipients, param.originalEvent, subject, this.$fhcAlert, this.$p)\n\t\t},\n\t\tsammelMailBetreuer(param) {\n\t\t\t\n\t\t\tconst recipientList = [];\n\t\t\tthis.selectedData.forEach(row => {\n\t\t\t\tif (row.betreuer_mail) recipientList.push(row.betreuer_mail);\n\t\t\t\tif (row.zweitbetreuer_mail) recipientList.push(row.zweitbetreuer_mail);\n\t\t\t});\n\n\t\t\t// actually not necessary for email clients but looks better for assistenz if we avoid duplicates here\n\t\t\tconst uniqueRecipients = [...new Set(recipientList)];\n\t\t\tconst subject = this.$p.t('abgabetool/c4sammelmailBetreuerBetreff', [this.selectedStudiengangOption?.bezeichnung]);\n\t\t\tsplitMailsHelper(uniqueRecipients, param.originalEvent, subject, this.$fhcAlert, this.$p)\n\t\t},\n\t\tselectHandler(e, cell) {\n\t\t\tconst row = cell.getRow();\n\n\t\t\tif(row.isSelected()){\n\t\t\t\trow.deselect();\n\t\t\t} else {\n\t\t\t\trow.select();\n\t\t\t}\n\n\t\t\t// stop built-in handler\n\t\t\te.stopPropagation();\n\t\t\treturn false;\n\t\t},\n\t\tselectAllHandler(e, cell) {\n\t\t\tconst table = cell.getTable();\n\t\t\tconst rows = table.getRows();\n\n\t\t\t// custom select all logic\n\t\t\tconst allowed = rows.filter(r => r.getData().selectable);\n\t\t\tconst selected = allowed.every(r => r.isSelected());\n\n\t\t\tif(selected){\n\t\t\t\tallowed.forEach(r => r.deselect());\n\t\t\t} else {\n\t\t\t\tallowed.forEach(r => r.select());\n\t\t\t}\n\n\t\t\t// stop built-in handler\n\t\t\te.stopPropagation();\n\t\t\treturn false;\n\t\t},\n\t\tcheckQualityGateStatus(projekt) {\n\t\t\tconst qgate1Termine = []\n\t\t\tconst qgate2Termine = []\n\t\t\t\n\t\t\tprojekt.qgate1Status = this.$p.t('abgabetool/c4keinTerminVorhanden')// 'Kein Termin vorhanden'\n\t\t\tprojekt.qgate1StatusRank = 0\n\t\t\tprojekt.qgate2Status = this.$p.t('abgabetool/c4keinTerminVorhanden')\n\t\t\tprojekt.qgate2StatusRank = 0\n\t\t\t\n\t\t\tprojekt.abgabetermine.forEach(termin => {\n\t\t\t\tif(termin.paabgabetyp_kurzbz == 'qualgate1') qgate1Termine.push(termin)\n\t\t\t\tif(termin.paabgabetyp_kurzbz == 'qualgate2') qgate2Termine.push(termin)\n\t\t\t})\n\t\t\t\n\t\t\t// calculate qgateStatusRank and display the highest order status rank of all quality gate termine until one\n\t\t\t// counts as passed, which is just a positive note no matter if anything has been uploaded\n\t\t\t\n\t\t\t// reuse luxon calculated diffMs (termin.datum in relation to today) from previous datestyle check \n\t\t\tqgate1Termine.forEach(qgate => {\n\t\t\t\tif(qgate.note != null && projekt.qgate1StatusRank <= 5) {\n\t\t\t\t\tconst noteOpt = typeof qgate.note !== 'object' ? this.notenOptions.find(opt => opt.note == qgate.note) : qgate.note\n\t\t\t\t\tif(noteOpt.positiv) {\n\t\t\t\t\t\tprojekt.qgate1Status = this.$p.t('abgabetool/c4positivBenotet')\n\t\t\t\t\t\tprojekt.qgate1StatusRank = 5\n\t\t\t\t\t} else {\n\t\t\t\t\t\tprojekt.qgate1Status = this.$p.t('abgabetool/c4negativBenotet')\n\t\t\t\t\t\tprojekt.qgate1StatusRank = 4\n\t\t\t\t\t}\n\t\t\t\t} else if (qgate.note == null && projekt.qgate1StatusRank <= 3) {\n\t\t\t\t\tprojekt.qgate1Status = this.$p.t('abgabetool/c4notYetGraded')\n\t\t\t\t\tprojekt.qgate1StatusRank = 3\n\t\t\t\t} else if(qgate.upload_allowed == true && qgate.abgabedatum == null && projekt.qgate1StatusRank <= 2) {\n\t\t\t\t\tprojekt.qgate1Status = this.$p.t('abgabetool/c4notSubmitted')\n\t\t\t\t\tprojekt.qgate1StatusRank = 2\n\t\t\t\t} else if (qgate.upload_allowed == false && qgate.diffMs <= 0 && projekt.qgate1StatusRank <= 1) {\n\t\t\t\t\tprojekt.qgate1Status = this.$p.t('abgabetool/c4notHappenedYet')\n\t\t\t\t\tprojekt.qgate1StatusRank = 1\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tqgate2Termine.forEach(qgate => {\n\t\t\t\tif(qgate.note != null && projekt.qgate1StatusRank <= 5) {\n\t\t\t\t\tconst noteOpt = typeof qgate.note !== 'object' ? this.notenOptions.find(opt => opt.note == qgate.note) : qgate.note\n\t\t\t\t\tif(noteOpt.positiv) {\n\t\t\t\t\t\tprojekt.qgate2Status = this.$p.t('abgabetool/c4positivBenotet')\n\t\t\t\t\t\tprojekt.qgate2StatusRank = 5\n\t\t\t\t\t} else {\n\t\t\t\t\t\tprojekt.qgate2Status = this.$p.t('abgabetool/c4negativBenotet')\n\t\t\t\t\t\tprojekt.qgate2StatusRank = 4\n\t\t\t\t\t}\n\t\t\t\t} else if (qgate.note == null && projekt.qgate2StatusRank <= 3) {\n\t\t\t\t\tprojekt.qgate2Status = this.$p.t('abgabetool/c4notYetGraded')\n\t\t\t\t\tprojekt.qgate2StatusRank = 3\n\t\t\t\t} else if(qgate.upload_allowed == true && qgate.abgabedatum == null && projekt.qgate2StatusRank <= 2) {\n\t\t\t\t\tprojekt.qgate2Status = this.$p.t('abgabetool/c4notSubmitted')\n\t\t\t\t\tprojekt.qgate2StatusRank = 2\n\t\t\t\t} else if (qgate.upload_allowed == false && qgate.diffMs <= 0 && projekt.qgate2StatusRank <= 1) {\n\t\t\t\t\tprojekt.qgate2Status = this.$p.t('abgabetool/c4notHappenedYet')\n\t\t\t\t\tprojekt.qgate2StatusRank = 1\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\tgetItemBezeichnung(item){\n\t\t\tif(!item.bezeichnung) return ''\n\t\t\t\n\t\t\treturn item?.bezeichnung?.bezeichnung ?? item?.bezeichnung\n\t\t},\n\t\tgetItemNote(item) {\n\t\t\t// note can be just a number if it is coming from backend\n\t\t\t// if note was just set it is a note option\n\t\t\tif(!item?.note) return ''\n\t\t\tif(item.note?.bezeichnung) return item.note.bezeichnung\n\t\t\t\n\t\t\tconst notenOption = this.notenOptions.find(note => note.note == item.note)\n\t\t\tif(!notenOption) return item.note\n\t\t\t\n\t\t\treturn notenOption.bezeichnung\n\t\t},\n\t\thandleChangeAbgabetypSerientermin(termin) {\n\t\t\t// if paabgabetype qualgate is selected, fill out kurzbz textfield with bezeichnung of quality gate so users\n\t\t\t// are possibly less confused\n\t\t\tif(termin.bezeichnung?.paabgabetyp_kurzbz === 'qualgate1' || termin.bezeichnung?.paabgabetyp_kurzbz === 'qualgate2') {\n\t\t\t\ttermin.kurzbz = termin.bezeichnung.bezeichnung\n\t\t\t} else {\n\t\t\t\ttermin.kurzbz = ''\n\t\t\t}\n\t\t},\n\t\tsemesterChanged(e) {\n\t\t\tif(this.$refs.abgabeTable.tabulator) {\n\t\t\t\tconst table = this.$refs.abgabeTable.tabulator\n\n\t\t\t\t// TODO: maybe check if existing synergy really works with many filters\n\t\t\t\tconst existing = table.getFilters().filter(f => f.field != 'studiensemester_kurzbz');\n\n\t\t\t\tconst compVal = e.value.studiensemester_kurzbz == this.$p.t('abgabetool/c4all') ? '' : e.value.studiensemester_kurzbz\n\t\t\t\tconst compType = e.value.studiensemester_kurzbz == this.$p.t('abgabetool/c4all') ? '!=' : '='\n\t\t\t\tconst newFilter = { field: \"studiensemester_kurzbz\", type: compType, value: compVal };\n\n\t\t\t\t// merge and reapply\n\t\t\t\ttable.setFilter([...existing, newFilter]);\n\t\t\t}\n\t\t\t\n\t\t},\n\t\tcheckAbgabetermineProjektarbeit(projekt) {\n\t\t\tconst now = luxon.DateTime.now()\n\t\t\t\n\t\t\t// calculate Abgabetermin time diff to now and assign last and next to projekt\n\t\t\tprojekt.abgabetermine.forEach(termin => {\n\n\t\t\t\ttermin.bezeichnung = this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz === termin.paabgabetyp_kurzbz)\n\t\t\t\t\n\t\t\t\t// while already looping through each termin, calculate datestyle beforehand\n\t\t\t\ttermin.dateStyle = getDateStyleClass(termin, this.notenOptions)\n\n\t\t\t\tconst date = luxon.DateTime.fromISO(termin.datum).endOf('day')\n\t\t\t\ttermin.luxonDate = date\n\t\t\t\ttermin.diffMs = date.toMillis() - now.toMillis(); // positive = future, negative = past\n\n\t\t\t\tif (termin.diffMs < 0) {\n\t\t\t\t\tif (!projekt.prevTermin ||\n\t\t\t\t\t\ttermin.diffMs > projekt.prevTermin.diffMs // larger (less negative) = closer to now\n\t\t\t\t\t) {\n\t\t\t\t\t\tprojekt.prevTermin = termin;\n\t\t\t\t\t}\n\t\t\t\t} else if (termin.diffMs > 0) {\n\t\t\t\t\tif (!projekt.nextTermin ||\n\t\t\t\t\t\ttermin.diffMs < projekt.nextTermin.diffMs // smaller positive = closer to now\n\t\t\t\t\t) {\n\t\t\t\t\t\tprojekt.nextTermin = termin;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\n\t\t\t// seperate check for quality gates\n\t\t\tthis.checkQualityGateStatus(projekt)\n\t\t},\n\t\tloadState() {\n\t\t\treturn JSON.parse(localStorage.getItem(this.abgabeTableOptions.persistenceID) || \"null\");\n\t\t},\n\t\tsaveState(table) {\n\t\t\t// avoid storing state after first restore part happened\n\t\t\tif(!this.stateRestored) return\n\t\t\tconst rawLayout = table.getColumnLayout();\n\t\t\tconst state = {\n\t\t\t\tcolumns: rawLayout.map(col => ({\n\t\t\t\t\tfield: col.field,\n\t\t\t\t\tvisible: col.visible,\n\t\t\t\t\twidth: col.width,\n\t\t\t\t})),\n\t\t\t\tsort: table.getSorters().map(s => ({\n\t\t\t\t\tfield: s.field,\n\t\t\t\t\tdir: s.dir,\n\t\t\t\t})),\n\t\t\t\tfilters: table.getFilters(),\n\t\t\t\theaderFilters: table.getHeaderFilters()\n\t\t\t};\n\t\t\t\n\t\t\tlocalStorage.setItem(this.abgabeTableOptions.persistenceID, JSON.stringify(state));\n\t\t},\n\t\thandleTableBuilt() {\n\t\t\tconst table = this.$refs.abgabeTable.tabulator\n\n\t\t\tthis.tableBuiltResolve()\n\t\t\t\n\t\t\ttable.on(\"columnMoved\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"columnResized\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"columnVisibilityChanged\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"filterChanged\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"headerFilterChanged\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"dataSorted\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"columnSorted\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"sortersChanged\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\tconst saved = this.loadState();\n\n\t\t\ttable.on(\"renderComplete\", () => {\n\t\t\t\tif(!this.stateRestored) {\n\n\t\t\t\t\tif (saved?.columns && !this.colLayoutRestored) {\n\t\t\t\t\t\tconst layout = saved.columns.map(col => ({\n\t\t\t\t\t\t\tfield: col.field,\n\t\t\t\t\t\t\twidth: col.width,\n\t\t\t\t\t\t\tvisible: col.visible,\n\t\t\t\t\t\t\t// add more if needed, but keep it simple\n\t\t\t\t\t\t}));\n\t\t\t\t\t\t\n\t\t\t\t\t\ttable.setColumnLayout(layout);\n\n\t\t\t\t\t\tthis.colLayoutRestored = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (saved?.filters && !this.filtersRestored) {\n\t\t\t\t\t\tthis.filtersRestored = true // instantly avoid retriggers\n\t\t\t\t\t\ttable.setFilter(saved.filters);\n\t\t\t\t\t}\n\t\t\t\t\tif (saved?.headerFilters && !this.headerFiltersRestored) {\n\t\t\t\t\t\tthis.headerFiltersRestored = true // instantly avoid retriggers\n\t\t\t\t\t\tfor (let hf of saved.headerFilters) {\n\t\t\t\t\t\t\ttable.setHeaderFilterValue(hf.field, hf.value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (saved?.sort?.length && !this.sortRestored) {\n\t\t\t\t\t\tthis.sortRestored = true;\n\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tconst sortList = saved.sort.map(s => {\n\t\t\t\t\t\t\t\tconst col = table.columnManager.findColumn(s.field);\n\t\t\t\t\t\t\t\tif (!col) {\n\t\t\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn { column: col, dir: s.dir };\n\t\t\t\t\t\t\t}).filter(Boolean);\n\n\t\t\t\t\t\t\ttable.setSort(sortList);\n\t\t\t\t\t\t}, 100);\n\t\t\t\t\t}\n\t\t\t\t\tthis.stateRestored = true\n\n\t\t\t\t}\n\n\t\t\t});\n\t\t},\n\t\thandleToggleFullscreenDetail() {\n\t\t\tthis.detailIsFullscreen = !this.detailIsFullscreen\n\t\t},\n\t\tgetOptionLabelAbgabetyp(option){\n\t\t\treturn option.bezeichnung\n\t\t},\n\t\tgetOptionLabelStg(option){\n\t\t\treturn option.kurzbzlang + ' ' + option.bezeichnung\n\t\t},\n\t\tgetOptionLabelStudiensemester(option){\n\t\t\treturn option.studiensemester_kurzbz\n\t\t},\n\t\tgetNotenFilterOptionLabel(option) {\n\t\t\treturn option.bezeichnung\t\n\t\t},\n\t\tformatDate(dateParam) {\n\t\t\tif(dateParam === null) return ''\n\t\t\tconst date = new Date(dateParam)\n\t\t\t// handle missing leading 0\n\t\t\tconst padZero = (num) => String(num).padStart(2, '0');\n\n\t\t\tconst month = padZero(date.getMonth() + 1); // Months are zero-based\n\t\t\tconst day = padZero(date.getDate());\n\t\t\tconst year = date.getFullYear();\n\n\t\t\treturn `${day}.${month}.${year}`;\n\t\t},\n\t\tformAction(cell) {\n\t\t\tconst actionButtons = document.createElement('div');\n\t\t\tactionButtons.className = \"d-flex gap-3\"; // you can keep Bootstrap gap if loaded\n\t\t\tactionButtons.style.display = \"flex\";\n\t\t\tactionButtons.style.alignItems = \"stretch\"; // buttons stretch to full height\n\t\t\tactionButtons.style.justifyContent = \"center\";\n\t\t\tactionButtons.style.height = \"100%\"; // full grid cell height\n\n\t\t\tconst val = cell.getValue();\n\n\t\t\tconst createButton = (iconClass, titleKey, clickHandler) => {\n\t\t\t\tconst btn = document.createElement('button');\n\t\t\t\tbtn.className = 'btn btn-outline-secondary';\n\t\t\t\tbtn.style.display = \"flex\";\n\t\t\t\tbtn.style.alignItems = \"center\"; // center icon vertically\n\t\t\t\tbtn.style.justifyContent = \"center\"; // center icon horizontally\n\t\t\t\tbtn.style.height = \"100%\"; // fill parent container height\n\t\t\t\tbtn.style.aspectRatio = \"1 / 1\"; // keep square shape (optional)\n\t\t\t\tbtn.style.padding = \"0\"; // remove extra padding for compactness\n\t\t\t\tif(iconClass == 'fa fa-timeline') btn.style.transform = \"rotate(90deg)\";\n\t\t\t\tbtn.innerHTML = ``;\n\t\t\t\tbtn.title = this.$capitalize(this.$p.t(titleKey));\n\t\t\t\tbtn.addEventListener('click', (e) => {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\te.stopImmediatePropagation();\n\t\t\t\t\tclickHandler();\n\t\t\t\t});\n\t\t\t\treturn btn;\n\t\t\t};\n\n\t\t\tactionButtons.append(\n\t\t\t\tcreateButton('fa fa-folder-open', 'abgabetool/c4details', () => this.setDetailComponent(val)),\n\t\t\t\tcreateButton('fa fa-timeline', 'abgabetool/c4termineTimeLine', () => this.openTimeline(val))\n\t\t\t);\n\n\t\t\treturn actionButtons;\n\t\t},\n\n\t\tundoSelection(cell) {\n\t\t\t// checks if cells row is selected and unselects -> imitates columns which dont trigger row selection\n\t\t\t// but actually just revert it after the fact\n\n\t\t\tconst row = cell.getRow()\n\t\t\tif(row.isSelected()) {\n\t\t\t\trow.deselect();\n\t\t\t}\n\t\t},\n\t\tselectionCheck(row) {\n\t\t\tconst data = row.getData()\n\t\t\tif(data?.betreuerart_kurzbz == 'Zweitbegutachter') return false\n\t\t\treturn true\n\t\t},\n\t\tshowDeadlines(){\n\t\t\tconst link = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router\n\t\t\t\t+ '/Cis/Abgabetool/Deadlines'\n\t\t\twindow.open(link, '_blank')\n\t\t},\n\t\topenAddSeriesModal() {\n\t\t\tthis.$refs.modalContainerAddSeries.show()\n\t\t},\n\t\taddSeries() {\n\t\t\tconst pids = this.selectedData?.map(projekt => projekt.projektarbeit_id)\n\t\t\t\n\t\t\tconst preserveSelected = [...this.selectedData]\n\t\t\t\n\t\t\tthis.saving = true\n\t\t\tthis.serienTermin.fixtermin = !this.serienTermin.invertedFixtermin\n\t\t\tthis.$api.call(ApiAbgabe.postSerientermin(\n\t\t\t\tthis.serienTermin.datum.toISOString(),\n\t\t\t\tthis.serienTermin.bezeichnung.paabgabetyp_kurzbz,\n\t\t\t\tthis.serienTermin.bezeichnung.bezeichnung,\n\t\t\t\tthis.serienTermin.kurzbz,\n\t\t\t\tthis.serienTermin.upload_allowed,\n\t\t\t\tpids,\n\t\t\t\tthis.serienTermin.fixtermin\n\t\t\t)).then(res => {\n\t\t\t\t\n\t\t\t\tif (res.meta.status === \"success\" && res.data) {\n\t\t\t\t\tthis.$fhcAlert.alertSuccess(this.$p.t('abgabetool/serienTerminGespeichert'))\n\t\t\t\t} else {\n\t\t\t\t\tthis.$fhcAlert.alertError(this.$p.t('abgabetool/errorSerienterminSpeichern'))\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// put new abgaben into projektarbeiten\n\t\t\t\tconst newAbgaben = res.data\n\t\t\t\tpids.forEach(pid => {\n\t\t\t\t\tconst abgabe = newAbgaben.find(abgabe => abgabe.projektarbeit_id == pid)\n\t\t\t\t\t\n\t\t\t\t\tconst pa = this.projektarbeiten.find(pa => pa.projektarbeit_id == pid)\n\t\t\t\t\n\t\t\t\t\tabgabe.bezeichnung = this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz == abgabe.paabgabetyp_kurzbz)\n\t\t\t\t\t\n\t\t\t\t\tpa.abgabetermine.push(abgabe)\n\t\t\t\t\tpa.abgabetermine.sort((a, b) => new Date(a.datum) - new Date(b.datum))\n\t\t\t\t})\n\t\t\t\t\n\t\t\t\t// reset selection to empty\n\t\t\t\t// this.$refs.abgabeTable.tabulator.deselectRow()\n\t\t\t\tconst table = this.$refs.abgabeTable.tabulator;\n\t\t\t\tconst scrollX = table.rowManager.scrollLeft;\n\t\t\t\tconst scrollY = table.rowManager.scrollTop;\n\t\t\t\t\n\t\t\t\tconst mappedData = this.mapProjekteToTableData(this.projektarbeiten)\n\n\t\t\t\ttable.setData(mappedData)\n\t\t\t\ttable.redraw(true)\n\n\t\t\t\tVue.nextTick(()=> {\n\t\t\t\t\tconst table = this.$refs.abgabeTable?.tabulator.element.querySelector('.tabulator-tableholder')\n\t\t\t\t\tif(table) {\n\t\t\t\t\t\ttable.scrollLeft = scrollX;\n\t\t\t\t\t\ttable.scrollTop = scrollY;\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t\n\t\t\t}).finally(()=>{\n\t\t\t\tthis.saving = false\n\t\t\t\tthis.selectedData = preserveSelected\n\t\t\t})\n\n\t\t\tthis.$refs.modalContainerAddSeries.hide()\n\t\t},\n\t\tmapProjekteToTableData(projekte) {\n\t\t\t// const now = luxon.DateTime.now();\n\t\t\treturn projekte.map(projekt => {\n\t\t\t\t\n\t\t\t\t// in assistenz context every projektarbeit should be allowed to be selected i guess\n\t\t\t\tprojekt.selectable = true;\n\t\t\t\t\n\t\t\t\tprojekt.prevTermin = null;\n\t\t\t\tprojekt.nextTermin = null;\n\n\t\t\t\tthis.checkAbgabetermineProjektarbeit(projekt)\n\n\t\t\t\tif(this.notenOptions && projekt.note) {\n\t\t\t\t\tconst opt = this.notenOptions.find(n => n.note == projekt.note)\n\t\t\t\t\n\t\t\t\t\t// TODO: mehrsprachig englisch\n\t\t\t\t\tprojekt.note_bez = opt.bezeichnung\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn {\n\t\t\t\t\t...projekt,\n\t\t\t\t\tabgabetermine: projekt.abgabetermine,\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\tstudent_uid: projekt.student_uid,\n\t\t\t\t\t\tprojektarbeit_id: projekt.projektarbeit_id,\n\t\t\t\t\t},\n\t\t\t\t\tpkz: this.buildPKZ(projekt),\n\t\t\t\t\tbeurteilung: projekt.beurteilungLink ?? null,\n\t\t\t\t\tsem: projekt.studiensemester_kurzbz,\n\t\t\t\t\tstg: this.buildStg(projekt),\n\t\t\t\t\tmail: this.buildMailToLink(projekt),\n\t\t\t\t\terstbetreuer: this.buildErstbetreuer(projekt),\n\t\t\t\t\tzweitbetreuer: this.buildZweitbetreuer(projekt),\n\t\t\t\t\ttyp: projekt.projekttyp_kurzbz,\n\t\t\t\t\ttitel: projekt.titel\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\tcreateInfoString(data) {\n\t\t\tlet str = '';\n\n\t\t\tdata.forEach(name => {\n\t\t\t\tstr += name\n\t\t\t\tstr += '; '\n\t\t\t})\n\n\t\t\treturn str\n\t\t},\n\t\tisPastDate(date) {\n\t\t\tconst deadline = luxon.DateTime.fromISO(date, { zone: 'Europe/Vienna' }).endOf('day');\n\t\t\tconst nowInVienna = luxon.DateTime.now().setZone('Europe/Vienna');\n\t\t\treturn nowInVienna > deadline;\n\t\t},\n\t\tsetDetailComponent(details){\n\t\t\tconst pa = this.projektarbeiten.find(projektarbeit => projektarbeit.projektarbeit_id == details.projektarbeit_id)\n\n\t\t\tif(pa?.abgabetermine?.length) {\n\t\t\t\tthis.$api.call(ApiAbgabe.getSignaturStatusForProjektarbeitAbgaben(pa.abgabetermine.map(termin => termin.paabgabe_id), pa.student_uid))\n\t\t\t\t\t.then(res => {\n\t\t\t\t\t\tif(res.meta.status === 'success') {\n\t\t\t\t\t\t\tres.data.forEach(paabgabe => {\n\t\t\t\t\t\t\t\tconst termin = pa.abgabetermine.find(abgabe => abgabe.paabgabe_id == paabgabe.paabgabe_id)\n\t\t\t\t\t\t\t\tif(termin && paabgabe.signatur !== undefined) termin.signatur = paabgabe.signatur\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t}\n\t\t\t\n\t\t\tconst paIsBenotet = pa.note !== null\n\t\t\t\n\t\t\tpa.abgabetermine.forEach(termin => {\n\t\t\t\tif(typeof termin.note !== 'object') {\n\t\t\t\t\ttermin.note = this.allowedNotenOptions.find(opt => opt.note == termin.note)\n\t\t\t\t}\n\n\t\t\t\t// only set this if it has not been set yet and abgabetermin has a note (qgate)\n\t\t\t\tif(!termin.noteBackend && termin.note) {\n\t\t\t\t\ttermin.noteBackend = termin.note\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\ttermin.file = []\n\n\t\t\t\t// assistenz should be able to edit every abgabe\n\t\t\t\t// update 21-01-2026: actually blocking operations on finished projektarbeiten seems like a decent idea\n\t\t\t\ttermin.allowedToSave = paIsBenotet ? false : true\n\n\t\t\t\t// assistenz are not allowed to delete deadlines with existing submissions\n\t\t\t\ttermin.allowedToDelete = paIsBenotet ? false : !termin.abgabedatum\n\t\t\t\t\n\t\t\t})\n\t\t\t\n\t\t\tconst vorname = pa.vorname ?? pa.student_vorname\n\t\t\tconst nachname = pa.nachname ?? pa.student_nachname\n\t\t\tpa.student = `${vorname} ${nachname}`\n\n\t\t\tthis.selectedProjektarbeit = pa\n\t\t\tthis.$refs.modalContainerAbgabeDetail.show()\n\t\t},\n\t\topenTimeline(val) {\n\t\t\tconst projekt = this.projektarbeiten.find(p => p.projektarbeit_id == val.projektarbeit_id)\n\t\t\tif(!projekt) {\n\n\t\t\t\tthis.$fhcAlert.alertInfo('Keine projektarbeit gefunden')\n\t\t\t\t\n\t\t\t\treturn\n\t\t\t}\n\t\t\tprojekt.abgabetermine.forEach(termin => {\n\t\t\t\t// show note only on termine with abgabetypen which are benotbar\n\t\t\t\tconst terminTypOpt = this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz == termin.paabgabetyp_kurzbz)\n\t\t\t\ttermin.benotbar = terminTypOpt.benotbar \n\t\t\t})\n\t\t\tthis.timelineProjekt = projekt\n\t\t\tthis.$refs.drawer.show()\n\t\t},\n\t\tcenteredTextFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\t\t\tif(!val) return\n\n\t\t\treturn '
    ' +\n\t\t\t\t'

    '+val+'

    '\n\t\t},\n\t\tdetailFormatter(cell) {\n\t\t\treturn '
    ' +\n\t\t\t\t'
    '\n\t\t},\n\t\tmailFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\t\t\treturn '
    ' +\n\t\t\t\t'
    '\n\t\t},\n\t\ttimelineFormatter() {\n\t\t\treturn '
    ' +\n\t\t\t\t'
    '\n\t\t},\n\t\tbeurteilungFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\t\t\tif(val) {\n\t\t\t\treturn '
    ' +\n\t\t\t\t\t'
    '\n\t\t\t} else return '-'\n\t\t},\n\t\tpkzTextFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\n\t\t\treturn '
    ' +\n\t\t\t\t''+val+'
    '\n\t\t},\n\t\tabgabterminFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\n\t\t\tif(val) {\n\t\t\t\tlet icon = ''\n\t\t\t\tswitch(val.dateStyle) {\n\t\t\t\t\tcase 'verspaetet':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'verpasst':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'abzugeben':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'standard':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'abgegeben':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'beurteilungerforderlich':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'bestanden':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'nichtbestanden':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tconst bezeichnung = val.bezeichnung?.bezeichnung ?? val.bezeichnung\n\t\t\t\t\n\t\t\t\treturn '
    ' +\n\t\t\t\t\t'
    ' +\n\t\t\t\t\t\ticon +\n\t\t\t\t\t'
    ' + \n\t\t\t\t\t'
    ' +\n\t\t\t\t\t\t'

    '+bezeichnung+' - '+ this.formatDate(val.datum)+'

    ' +\n\t\t\t\t\t'
    '+\n\t\t\t\t\t'
    '\n\n\t\t\t} else {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\t\n\t\t},\n\t\ttableResolve(resolve) {\n\t\t\tthis.tableBuiltResolve = resolve\n\t\t},\n\t\tbuildMailToLink(projekt) {\n\t\t\treturn 'mailto:' + projekt.student_uid +'@'+ this.domain\n\t\t},\n\t\tbuildPKZ(projekt) {\n\t\t\treturn `${projekt.student_uid} / ${projekt.matrikelnr}`\n\t\t},\n\t\tbuildStg(projekt) {\n\t\t\treturn (projekt.typ + projekt.kurzbz)?.toUpperCase()\n\t\t},\n\t\tbuildErstbetreuer(projekt) {\n\t\t\tif(projekt.erstbetreuer_full_name) return projekt.erstbetreuer_full_name\n\t\t\treturn projekt.betreuer_vorname + ' ' + projekt.betreuer_nachname\n\t\t},\n\t\tbuildZweitbetreuer(projekt) {\n\t\t\treturn projekt.zweitbetreuer_full_name ?? ''\n\t\t},\n\t\tasync setupData(data){\n\t\t\tthis.projektarbeiten = data[0]\n\t\t\tthis.domain = data[1]\n\t\t\t\n\t\t\tthis.tableData = this.mapProjekteToTableData(this.projektarbeiten)\n\n\t\t\tawait this.tableBuiltPromise\n\t\t\t\n\t\t\tthis.$refs.abgabeTable.tabulator.setData(this.tableData);\n\t\t},\n\t\tloadProjektarbeiten(all = false, callback) {\n\t\t\tthis.loading = true\n\t\t\tthis.$api.call(ApiAbgabe.getProjektarbeitenForStudiengang(\n\t\t\t\tthis.selectedStudiengangOption.studiengang_kz,\n\t\t\t\tthis.notenOptionFilter?.benotet ?? 0\n\t\t\t))\n\t\t\t\t.then(res => {\n\t\t\t\t\tif(res?.data) this.setupData(res.data)\n\t\t\t\t}).finally(() => {\n\t\t\t\tif(callback) {\n\t\t\t\t\tcallback()\n\t\t\t\t}\n\t\t\t}).finally(()=>{\n\t\t\t\tthis.loading=false\n\t\t\t})\n\t\t},\n\t\tloadAbgaben(details) {\n\t\t\treturn new Promise((resolve) => {\n\t\t\t\tthis.$api.call(ApiAbgabe.getStudentProjektabgaben(details))\n\t\t\t\t\t.then(res => {\n\t\t\t\t\t\tresolve(res)\n\t\t\t\t\t})\n\t\t\t})\n\t\t},\n\t\thandleUuidDefined(uuid) {\n\t\t\tthis.tabulatorUuid = uuid\n\t\t},\n\t\tcalcMaxTableHeight() {\n\t\t\tconst tableID = this.tabulatorUuid ? ('-' + this.tabulatorUuid) : ''\n\t\t\tconst tableDataSet = document.getElementById('filterTableDataset' + tableID);\n\t\t\tif(!tableDataSet) return\n\t\t\tconst rect = tableDataSet.getBoundingClientRect();\n\n\t\t\tthis.abgabeTableOptions.height = window.visualViewport.height - rect.top - 80\n\t\t\tthis.$refs.abgabeTable.tabulator.setHeight(this.abgabeTableOptions.height)\n\t\t},\n\t\tasync setupMounted() {\n\t\t\tthis.tableBuiltPromise = new Promise(this.tableResolve)\n\t\t\tawait this.tableBuiltPromise\n\t\t\t\n\t\t\tawait this.allConfigPromise\n\t\t\t\n\t\t\t// called through notenOptionFilter/selectedStudiengangOption watcher on startup\n\t\t\t// this.loadProjektarbeiten()\n\n\t\t\tthis.calcMaxTableHeight()\n\t\t},\n\t\tgetOptionDisabled(option) {\n\t\t\treturn !option.aktiv\n\t\t},\n\t},\n\tcomputed: {\n\t\temailItems() {\n\t\t\tconst menu = []\n\t\t\t\n\t\t\tif(this.ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT){\n\t\t\t\tmenu.push({\n\t\t\t\t\tlabel: this.$p.t('abgabetool/c4sendEmailStudierendev2', [this.uniqueStudentEmailCount]),\n\t\t\t\t\tcommand: this.sammelMailStudent\n\t\t\t\t})\n\t\t\t}\n\t\t\t\n\t\t\tif(this.ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER) {\n\t\t\t\tmenu.push({\n\t\t\t\t\tlabel: this.$p.t('abgabetool/c4sendEmailBetreuerv3', [this.uniqueBetreuerEmailCount]),\n\t\t\t\t\tcommand: this.sammelMailBetreuer\n\t\t\t\t})\n\t\t\t}\n\n\t\t\treturn menu\n\t\t},\n\t\tuniqueBetreuerEmailCount() {\n\t\t\tconst emails = new Set();\n\t\t\t\n\t\t\tthis.selectedData.forEach(row => {\n\t\t\t\tif (row.betreuer_mail) emails.add(row.betreuer_mail);\n\t\t\t\tif (row.zweitbetreuer_mail) emails.add(row.zweitbetreuer_mail);\n\t\t\t});\n\n\t\t\treturn emails.size;\n\t\t},\n\t\tuniqueStudentEmailCount() {\n\t\t\tconst emails = new Set();\n\n\t\t\tthis.selectedData.forEach(row => {\n\t\t\t\tif (row.student_uid) {\n\t\t\t\t\temails.add(row.student_uid); // actually dont need domain for this\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn emails.size;\n\t\t}\n\t},\n\twatch: {\n\t\t'serienTermin.bezeichnung'(newVal) {\n\t\t\tif(newVal?.paabgabetyp_kurzbz === 'qualgate1' || newVal?.paabgabetyp_kurzbz === 'qualgate2') {\n\t\t\t\tthis.serienTermin.kurzbz = newVal.bezeichnung\n\t\t\t}\n\n\t\t\tthis.serienTermin.upload_allowed = newVal.upload_allowed_default\n\t\t},\n\t\tselectedStudiengangOption(newVal, oldVal) {\n\t\t\t// implicitely avoids juggling around promises for created api calls,\n\t\t\t// since we need note & stg flags for loadProjektarbeiten\n\t\t\tif(this.notenOptionFilter !== null && this.selectedStudiengangOption !== null) {\n\t\t\t\tthis.loadProjektarbeiten()\n\t\t\t}\n\t\t},\n\t\tnotenOptionFilter(newVal) {\n\t\t\t// that single where clause is worth a decent load time so rather not filter tabulator but just \n\t\t\t// adapt the qry\n\t\t\tif(this.notenOptionFilter !== null && this.selectedStudiengangOption !== null) {\n\t\t\t\tthis.loadProjektarbeiten()\n\t\t\t}\n\t\t},\n\t\tselectedData(newVal) {\n\t\t\tconst table = this.$refs.abgabeTable?.tabulator\n\t\t\tif(!table) return\n\n\t\t\tconst allRows = table.getRows();\n\n\t\t\tnewVal.forEach(selected => {\n\t\t\t\tconst row = allRows.find(r => {\n\t\t\t\t\tconst data = r.getData()\n\t\t\t\t\tif (data.projektarbeit_id == selected.projektarbeit_id) return r\n\t\t\t\t}) \t\n\t\t\t\t\n\t\t\t\trow.select()\n\t\t\t\tconst cb = row.getElement().children[0]?.children[0]?.children[0]\n\t\t\t\tif(cb) cb.checked = true\n\t\t\t})\n\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.loading = true\n\t\tthis.phrasenPromise = this.$p.loadCategory(['abgabetool', 'global'])\n\t\tthis.phrasenPromise.then(()=> {this.phrasenResolved = true})\n\t\t\n\t\t//TODO: SWITCH TO NOTEN API ONCE NOTENTOOL IS IN MASTER TO AVOID DUPLICATE API\n\t\tconst requests = [\n\t\t\tthis.$api.call(ApiAbgabe.getConfig()),\n\t\t\tthis.$api.call(ApiAbgabe.getStudiengaenge()),\n\t\t\tthis.$api.call(ApiStudiensemester.getAllStudiensemesterAndAktOrNext()),\n\t\t\tthis.$api.call(ApiAbgabe.getNoten()),\n\t\t\tthis.$api.call(ApiAbgabe.getPaAbgabetypen())\n\t\t];\n\n\t\tthis.allConfigPromise = Promise.allSettled(requests)\n\t\t\t.then((results) => {\n\t\t\t\t// results is an array of { status: 'fulfilled'|'rejected', value?: any, reason?: any }\n\n\t\t\t\t// 1. Config\n\t\t\t\tif (results[0].status === 'fulfilled') {\n\t\t\t\t\tconst res = results[0].value;\n\t\t\t\t\tthis.turnitin_link = res.data?.turnitin_link;\n\t\t\t\t\tthis.old_abgabe_beurteilung_link = res.data?.old_abgabe_beurteilung_link;\n\t\t\t\t\tthis.ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT = res.data?.ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT;\n\t\t\t\t\tthis.ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER = res.data?.ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER;\n\t\t\t\t}\n\n\t\t\t\t// 2. Studiengänge\n\t\t\t\tif (results[1].status === 'fulfilled') {\n\t\t\t\t\tconst res = results[1].value;\n\t\t\t\t\tthis.studiengaengeOptions = res.data;\n\t\t\t\t\tif (this.studiengaengeOptions?.length) {\n\t\t\t\t\t\tthis.selectedStudiengangOption = this.stg_kz_prop\n\t\t\t\t\t\t\t? res.data.find(stgOpt => stgOpt.studiengang_kz == this.stg_kz_prop)\n\t\t\t\t\t\t\t: res.data[0];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// 3. Studiensemester\n\t\t\t\tif (results[2].status === 'fulfilled') {\n\t\t\t\t\tconst res = results[2].value;\n\t\t\t\t\tthis.allSem = res.data[0];\n\t\t\t\t\tconst all = { studiensemester_kurzbz: this.$p.t('abgabetool/c4all') };\n\t\t\t\t\tthis.curSem = all;\n\t\t\t\t\tthis.studiensemesterOptions = [all, ...this.allSem];\n\t\t\t\t}\n\n\t\t\t\t// 4. Noten\n\t\t\t\tif (results[3].status === 'fulfilled') {\n\t\t\t\t\tconst res = results[3].value;\n\t\t\t\t\tif (res.meta?.status === 'success') {\n\t\t\t\t\t\tthis.notenOptions = res.data[0];\n\t\t\t\t\t\tthis.allowedNotenOptions = this.notenOptions.filter(\n\t\t\t\t\t\t\topt => res.data[1].includes(opt.note)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tthis.notenOptionsNonFinal = this.notenOptions.filter(\n\t\t\t\t\t\t\topt => res.data[2].includes(opt.note)\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.allowedNotenFilterOptions = [\n\t\t\t\t\t\t{ bezeichnung: Vue.computed(() => this.$p.t('abgabetool/keineNoteEingetragen')), benotet: 0 },\n\t\t\t\t\t\t{ bezeichnung: Vue.computed(() => this.$p.t('abgabetool/c4benotet')), benotet: 1 },\n\t\t\t\t\t\t{ bezeichnung: Vue.computed(() => this.$p.t('abgabetool/showAll')), benotet: -1 }\n\t\t\t\t\t];\n\t\t\t\t\tthis.notenOptionFilter = this.allowedNotenFilterOptions[0];\n\t\t\t\t}\n\n\t\t\t\t// 5. Abgabetypen\n\t\t\t\tif (results[4].status === 'fulfilled') {\n\t\t\t\t\tconst res = results[4].value;\n\t\t\t\t\tthis.abgabeTypeOptions = res.data;\n\t\t\t\t}\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tthis.loading = false;\n\t\t\t});\n\t},\n\tmounted() {\n\t\tthis.setupMounted()\n\t},\n\ttemplate: `\n\t\n `,\n};\n\nexport default AbgabetoolAssistenz;\n","import {CoreFilterCmpt} from \"../../../components/filter/Filter.js\";\nimport ApiAbgabe from '../../../api/factory/abgabe.js'\n\nexport const DeadlineOverview = {\n\tname: \"DeadlineOverview\",\n\tcomponents: {\n\t\tCoreFilterCmpt,\n\t},\n\tprops: {\n\t\tperson_uid_prop: {\n\t\t\tdefault: null\t\n\t\t},\n\t\tviewData: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t\tdefault: () => ({name: '', uid: ''}),\n\t\t\tvalidator(value) {\n\t\t\t\treturn value && value.name && value.uid\n\t\t\t}\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tfullName: null, // TODO: fetch this somewhere\n\t\t\tdeadlines: null,\n\t\t\ttabulatorUuid: Vue.ref(0),\n\t\t\ttableBuiltResolve: null,\n\t\t\ttableBuiltPromise: null,\n\t\t\tphrasenPromise: null,\n\t\t\tphrasenResolved: false,\n\t\t\tdeadlineTableOptions: {\n\t\t\t\theight: 700,\n\t\t\t\tindex: 'projektarbeit_id',\n\t\t\t\tlayout: 'fitColumns',\n\t\t\t\tplaceholder: Vue.computed(() => this.$p.t('global/noDataAvailable')),\n\t\t\t\tcolumns: [\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4zieldatumv2'))), field: 'datum', formatter: this.centeredTextFormatter, widthGrow: 1, tooltip: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4fixterminv4'))), field: 'fixterminstring', formatter: this.centeredTextFormatter, widthGrow: 1, tooltip: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4abgabetyp'))), field: 'typ_bezeichnung', formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4abgabekurzbzv2'))), field: 'kurzbz', formatter: this.centeredTextFormatter, widthGrow: 3},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('person/studentIn'))), field: 'student', formatter: this.centeredTextFormatter, widthGrow: 2},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4stg'))), field: 'stg', formatter: this.centeredTextFormatter,widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4sem'))), field: 'semester', formatter: this.centeredTextFormatter, widthGrow: 1}\n\t\t\t\t],\n\t\t\t\tpersistence: false,\n\t\t\t},\n\t\t\tdeadlineTableEventHandlers: [{\n\t\t\t\tevent: \"tableBuilt\",\n\t\t\t\thandler: async () => {\n\t\t\t\t\tthis.tableBuiltResolve()\n\t\t\t\t}\n\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tevent: \"cellClick\",\n\t\t\t\t\thandler: async (e, cell) => {\n\n\t\t\t\t\t\tif(cell.getColumn().getField() === \"details\") {\n\t\t\t\t\t\t\tconst val = cell.getValue()\n\n\t\t\t\t\t\t\tif(val.mode === 'detailTermine') {\n\t\t\t\t\t\t\t\tthis.setDetailComponent(cell.getValue())\n\t\t\t\t\t\t\t} else if (val.mode === 'beurteilungDownload') {\n\t\t\t\t\t\t\t\tconst pdfExportLink = FHC_JS_DATA_STORAGE_OBJECT.app_root + 'cis/private/pdfExport.php?xml=projektarbeitsbeurteilung.xml.php&xsl=Projektbeurteilung&betreuerart_kurzbz='+val.betreuerart_kurzbz+'&projektarbeit_id='+val.projektarbeit_id+'&person_id=' + val.betreuer_person_id\n\t\t\t\t\t\t\t\t// const pdfExportLink2 = FHC_JS_DATA_STORAGE_OBJECT.app_root + 'cis/private/lehre/projektbeurteilungDocumentExport.php?betreuerart_kurzbz='+val.betreuerart_kurzbz+'&projektarbeit_id='+val.projektarbeit_id+'&person_id=' + val.betreuer_person_id\n\t\t\t\t\t\t\t\twindow.open(pdfExportLink, '_blank')\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else if (cell.getColumn().getField() === \"beurteilung\") {\n\t\t\t\t\t\t\tconst val = cell.getValue()\n\n\t\t\t\t\t\t\tif(val != '-') window.open(val, '_blank')\n\t\t\t\t\t\t}\n\t\t\t\t\t\te.stopPropagation()\n\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]};\n\t},\n\tmethods: {\n\t\tcenteredTextFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\n\t\t\treturn '
    ' +\n\t\t\t\t'

    '+val+'

    '\n\t\t},\n\t\ttableResolve(resolve) {\n\t\t\tthis.tableBuiltResolve = resolve\n\t\t},\n\t\tloadDeadlines() {\n\t\t\tthis.$api.call(ApiAbgabe.fetchDeadlines(this.person_uid_prop ?? null))\n\t\t\t\t.then(res => {\n\t\t\t\t\tif(res?.data) this.setupData(res.data)\n\t\t\t\t})\n\t\t},\n\t\tsetupData(data) {\n\t\t\tthis.deadlines = data\n\t\t\t\n\t\t\tthis.deadlines.forEach(dl => {\n\t\t\t\tdl.student = (dl.stud_titelpre ? (dl.stud_titelpre + ' ') :'') + dl.stud_vorname + ' ' + dl.stud_nachname + (dl.stud_titelpost ? (' ' + dl.stud_titelpost) :'')\n\t\t\t\tdl.fixterminstring = dl.fixtermin ? this.$p.t('abgabetool/c4yes') : this.$p.t('abgabetool/c4no')\n\t\t\t})\n\n\t\t\tthis.$refs.deadlineTable.tabulator.setColumns(this.deadlineTableOptions.columns)\n\t\t\tthis.$refs.deadlineTable.tabulator.setData(this.deadlines);\n\t\t},\n\t\thandleUuidDefined(uuid) {\n\t\t\tthis.tabulatorUuid = uuid\n\t\t},\n\t\tcalcMaxTableHeight() {\n\t\t\tconst tableID = this.tabulatorUuid ? ('-' + this.tabulatorUuid) : ''\n\t\t\tconst tableDataSet = document.getElementById('filterTableDataset' + tableID);\n\t\t\tif(!tableDataSet) return\n\t\t\tconst rect = tableDataSet.getBoundingClientRect();\n\n\t\t\tthis.deadlineTableOptions.height = window.visualViewport.height - rect.top - 30\n\t\t\tthis.$refs.deadlineTable.tabulator.setHeight(this.deadlineTableOptions.height)\n\t\t},\n\t\tasync setupMounted() {\n\t\t\tthis.tableBuiltPromise = new Promise(this.tableResolve)\n\t\t\tawait this.tableBuiltPromise\n\n\t\t\tthis.loadDeadlines()\n\t\t\tthis.calcMaxTableHeight()\n\t\t}\n\t},\n\twatch: {\n\n\t},\n\tcomputed: {\n\n\t},\n\tcreated() {\n\t\tthis.phrasenPromise = this.$p.loadCategory(['abgabetool', 'global'])\n\t\tthis.phrasenPromise.then(()=> {this.phrasenResolved = true})\n\t},\n\tmounted() {\n\t\tthis.setupMounted()\n\t},\n\ttemplate: `\n\t\t

    {{$p.t('abgabetool/deadlinesTitle')}} {{ fullName ? ('-' + fullName) : ''}}

    \n\t\t
    \n\t\t\t\n\t\t \n `,\n};\n\nexport default DeadlineOverview;\n","import PluginsPhrasen from '../../plugins/Phrasen.js';\nimport AbgabetoolStudent from \"../../components/Cis/Abgabetool/AbgabetoolStudent.js\";\nimport AbgabetoolMitarbeiter from \"../../components/Cis/Abgabetool/AbgabetoolMitarbeiter.js\";\nimport AbgabetoolAssistenz from \"../../components/Cis/Abgabetool/AbgabetoolAssistenz.js\";\nimport DeadlineOverview from \"../../components/Cis/Abgabetool/DeadlineOverview.js\";\nimport {capitalize} from \"../../helpers/StringHelpers.js\";\n\nconst app = Vue.createApp({\n\tname: 'AbgabetoolApp',\n\tcomponents: {\n\t\tAbgabetoolStudent,\n\t\tAbgabetoolMitarbeiter,\n\t\tAbgabetoolAssistenz,\n\t\tDeadlineOverview\n\t},\n\tdata: function() {\n\t\treturn {\n\t\t\tcomp: null,\n\t\t\tuid: null,\n\t\t\tstudent_uid: null,\n\t\t\tstg_kz: null\n\t\t};\n\t},\n\tmethods: {\n\t\t\n\t},\n\tcomputed: {\n\t\tviewData() {\n\t\t\treturn { uid: this.uid}\n\t\t},\n\t\tstudent_uid_computed() {\n\t\t\treturn this.student_uid ?? this.uid\n\t\t},\n\t\tstg_kz_computed() {\n\t\t\treturn this.stg_kz ?? null\n\t\t}\n\t},\n\tcreated() {\n\t},\n\tmounted() {\n\t\t\n\t\tconst root = document.getElementById('abgabetoolroot')\n\t\tconst route = root.getAttribute(\"route\");\n\t\tthis.comp = route\n\n\t\tconst uid = root.getAttribute(\"uid\");\n\t\tthis.uid = uid\n\n\t\tconst stg_kz = root.getAttribute(\"stg_kz_prop\");\n\t\tthis.stg_kz = stg_kz\n\n\t\tconst student_uid = root.getAttribute(\"student_uid_prop\");\n\t\tthis.student_uid = student_uid\n\t\t\n\t},\n\ttemplate: `\n\t\t\n\t`\n});\napp.config.globalProperties.$capitalize = capitalize;\napp.use(primevue.config.default, {\n\tzIndex: {\n\t\toverlay: 9000,\n\t\ttooltip: 8000\n\t}\n})\napp.directive('tooltip', primevue.tooltip);\napp.use(PluginsPhrasen);\napp.mount('#abgabetoolroot');\n","export function capitalize(string) {\n\tif (!string) return '';\n\treturn string[0].toUpperCase() + string.slice(1);\n}"],"names":["search","searchsettings","config","this","$fhcApi","post","searchAdvanced","searchdummy","phrasen$1","loadCategory","category","get","setLanguage","categories","language","payload","getLanguage","getActiveDbLanguages","navigation","getHeader","navigation_page","getMenu","filter$1","saveCustomFilter","wsParams","filterUniqueId","filterType","customFilterName","removeCustomFilter","filterId","applyFilterFields","filterFields","addFilterField","filterField","removeFilterField","getFilterById","getFilter","studstatus","abmeldung","getDetails","antrag_id","prestudent_id","url","undefined","create","stdsem","grund","studiensemester","errorHandling","cancel","Array","isArray","Promise","allSettled","map","antrag","studierendenantrag_id","errorHeader","unterbrechung","datum_wiedereinstieg","attachment","wiederholung","getLvs","saveLvs","forbiddenLvs","mandatoryLvs","leitung","getStgs","getAntraege","params","then","res","data","getHistory","getPrestudents","query","signal","timeout","approve","a","reject","reopen","pause","unpause","object","approveObjection","denyObjection","profil","getView","uid","FHC_JS_DATA_STORAGE_OBJECT","app_root","ci_router","fotoSperre","value","isStudent","isMitarbeiter","getZustellAdresse","getZustellKontakt","getGemeinden","nation","zip","getAllNationen","profilUpdate","getStatus","getTopic","acceptProfilRequest","profil_update_id","status_message","topic","requested_change","denyProfilRequest","insertFile","dms","replace","getProfilRequestFiles","requestID","selectProfilRequest","id","insertProfilRequest","fileID","updateProfilRequest","ID","deleteProfilRequest","lvPlan","getRoomInfo","ort_kurzbz","start_date","end_date","getStunden","getOrtReservierungen","getLvPlanReservierungen","getLehreinheitStudiensemester","lehreinheit_id","studiensemesterDateInterval","date","LvPlanEvents","lv_id","stv","verband","favorites","set","students","studiensemester_kurzbz","encodeURIComponent","getUri","prestudent","person","person_id","relative_path","filter","getStg","setStg","studiengang_kz","konto","tabulatorConfig","self","ajaxURL","ajaxParams","modelValue","e","only_open","studiengang_kz_intern","stg_kz","ajaxRequestFunc","ajaxResponse","response","checkDoubles","form","confirmErrorHandler","error","insert","counter","edit","delete","buchungsnr","getBuchungstypen","group","getGruppen","deleteGroup","kontakt","getAdressen","addNewAddress","loadAddress","address_id","updateAddress","deleteAddress","getPlaces","plz","getFirmen","searchString","getNations","getAdressentypen","getBankverbindung","addNewBankverbindung","loadBankverbindung","bankverbindung_id","updateBankverbindung","deleteBankverbindung","getKontakte","addNewContact","loadContact","kontakt_id","updateContact","deleteContact","getStandorteByFirma","getKontakttypen","updatePrestudent","getBezeichnungZGV","getBezeichnungMZgv","getBezeichnungDZgv","getAusbildung","getAufmerksamdurch","getBerufstaetigkeit","getTypenStg","getBisstandort","getHistoryPrestudent","getMaxSem","studiengang_kzs","advanceStatus","status_kurzbz","ausbildungssemester","confirmStatus","isLastStatus","deleteStatus","getLastBismeldestichtag","getHistoryPrestudents","status","insertStatus","loadStatus","updateStatus","getStudienplaene","getStudiengang","getStatusgruende","getStati","addStudent","changeStatus","getStatusarray","details","save","exam","getPruefungen","loadPruefung","pruefung_id","getTypenPruefungen","getAllLehreinheiten","getLvsByStudent","getLvsandLesByStudent","semester","getLvsAndMas","getMitarbeiterLv","getNoten","checkZeugnisnoteLv","addPruefung","updatePruefung","deletePruefung","abschlusspruefung","getAbschlusspruefung","addNewAbschlusspruefung","loadAbschlusspruefung","updateAbschlusspruefung","deleteAbschlusspruefung","getTypenAbschlusspruefung","getTypenAntritte","getBeurteilungen","getAkadGrade","getTypStudiengang","getMitarbeiter","getPruefer","checkForExistingExams","uids","grades","list","getCertificate","getTeacherProposal","getRepeaterGrades","updateCertificate","lehrveranstaltung_id","student_uid","note","lehrveranstaltung_bezeichnung","deleteCertificate","copyTeacherProposalToCertificate","copyRepeaterGradeToCertificate","studierendenantrag_lehrveranstaltung_id","lv_bezeichnung","getGradeFromPoints","points","manualErrorHandling","mobility","getMobilitaeten","getProgramsMobility","addNewMobility","loadMobility","bisio_id","updateMobility","deleteMobility","getLVList","getPurposes","getSupports","getListPurposes","getListSupports","deleteMobilityPurpose","addMobilityPurpose","deleteMobilitySupport","addMobilitySupport","archiv","getArchivVorlagen","archive","archiveSigned","update","akte_id","documents","getDocumentsUnaccepted","getDocumentsAccepted","deleteZuordnung","dokument_kurzbz","createZuordnung","loadAkte","getDoktypen","updateFile","deleteFile","uploadFile","exemptions","getAnrechnungen","getLehrveranstaltungen","getBegruendungen","getLvsKompatibel","getLektoren","addNewAnrechnung","loadAnrechnung","anrechnung_id","editAnrechnung","deleteAnrechnung","jointstudies","getStudies","getTypenMobility","getStudiensemester","getStudyprograms","getListPartner","getStatiPrestudent","loadStudy","insertStudy","updateStudy","deleteStudy","courselist","getCourselist","group_consecutiveHours","dbStundenplanTable","configStudent","configStudents","notiz","getNotizen","type","getUid","addNewNotiz","formData","loadNotiz","notiz_id","loadDokumente","deleteNotiz","type_id","updateNotiz","event","isBerechtigt","betriebsmittel","getAllBetriebsmittel","addNewBetriebsmittel","loadBetriebsmittel","betriebsmittelperson_id","updateBetriebsmittel","deleteBetriebsmittel","getTypenBetriebsmittel","loadInventarliste","checkperson","updatePersonUnrulyStatus","unrulyParam","unruly","filterPerson","base","axios","ort","getContentID","ort_kurbz","getRooms","datum","von","bis","typ","personenanzahl","getRoomTypes","cms","content","content_id","version","sprache","sichtbar","getNews","page","page_size","news","limit","getNewsRowCount","getNewsExtra","lehre","getStudentenMail","getLvInfo","getStudentPruefungen","addons","getLvMenu","lvid","messages","getMessages","size","getVorlagen","getMsgVarsLoggedInUser","getMessageVarsPerson","getMsgVarsPrestudent","getPersonId","getDataVorlage","vorlage_kurzbz","getNameOfDefaultRecipient","getPreviewText","getReplyData","messageId","sendMessageFromModalContext","sendMessage","deleteMessage","vorlagen","getVorlagenByLoggedInUser","studium","getAllStudienSemester","studiengang","studienplan","getStudiengaengeForStudienSemester","getStudienplaeneBySemester","getLvPlanForStudiensemester","getLvEvaluierungInfo","FhcApiFactory","phrasen","dashboard","getViewData","bookmark","getBookmarks","bookmark_id","title","tag","ampeln","open","all","confirm","ampel_id","studiengangInformation","getStudiengangByKz","menu","authinfo","getAuthUID","getAuthInfo","getAll","OldFhcApi","install","app","options","globalProperties","factory","console","warn","addEndpoints","_get_config","uri","TypeError","clearValidation","setFeedback","_clean_return_value","result","meta","fhcApiAxios","baseURL","interceptors","request","use","method","FormData","Object","values","every","item","FileList","i","File","newData","entries","reduce","nd","key","file","append","length","jsondata","forEach","JSON","stringify","errors","err","_defaultErrorHandlers","code","handled","$fhcAlert","alertDefault","message","responseURL","alertError","validation","$p","t","apply","general","php","filename","line","backtrace","function","severity","alertSystemError","exception","class","db","heading","sql","join","auth","controller","required_permissions","FhcApiFactoryWrapper","constructor","factorypart","root","defineProperty","noWarn","keys","bind","provide","CORE_REST_CLIENT_ERROR","CORE_REST_CLIENT_RETVAL","CoreRESTClient","wsURL","wsParameters","axiosParameters","_axiosCall","isSuccess","hasOwnProperty","isError","hasData","trim","getData","getError","getErrorCode","_generateRouterURI","_printDebug","parameters","errorThrown","axiosCallObj","prop","helperAppContainer","document","createElement","helperApp","Vue","createApp","name","components","PvToast","PvConfirm","methods","mailToUrl","slotProps","systemerror_mailto","called_path","called_method","detail","openMessagecard","bootstrap","Collapse","getOrCreateInstance","target","getAttribute","toggle","unmounted","parentElement","removeChild","computed","showmaillink","template","PvConfig","PvConfirmationService","helperAppInstance","mount","body","appendChild","FhcAlert","FhcPhrasen","alertSuccess","$refs","toast","add","summary","life","alertInfo","alertWarning","alert","confirmDelete","resolve","$confirm","require","header","acceptLabel","acceptClass","rejectLabel","rejectClass","accept","sticky","html","alertMultiple","messageArray","handleSystemError","toLowerCase","errMsg","retval","toUpperCase","stack","handleSystemMessage","msg","resetFormValidation","Event","querySelectorAll","el","dispatchEvent","handleFormValidation","nodeType","Node","ELEMENT_NODE","notFound","input","querySelector","CustomEvent","arr","PluginsApi","$api","_send_array_or_object","func","errs","DEFAULT_ERROR_CONFIG","success","fail","combine","handler","async","_format_toast","_default","push","field","msgs","sort","b","indexOf","n_errors","n","get_config","clean_return_value","String","_merge_error_config","get_error_handler","formHandler","get_error_list","popHandleableErrors","copy","pop","newType","newTypeCombinesType","includes","newTypeHasHandler","errorConfig","remaining","call","configoverwrite","index","typedErrors","allowed","reason","errType","getErrorHandler","ApiPhrasen","reactive","loadingModules","user_language","ref","user_locale","server_languages","find","LC_Time","catArray","row","phrase","text","obj","elem","extractCategory","t_ref","split","val","match","p1","getValueForLoadedPhrase","PluginsPhrasen","cat","lang","Upload","DmsItem","emits","props","required","preview","watch","parse","multiple","Boolean","inputClass","noList","default","disabled","stringifyFile","lastModified","lastModifiedDate","addFiles","$emit","files","dt","DataTransfer","doubles","items","removeFile","fileToRemove","from","upload","dmsFile","BsModal","modal","fullscreen","backdrop","validator","focus","keyboard","noCloseBtn","dialogClass","headerClass","bodyClass","footerClass","allowFullscreenExpand","dispose","handleUpdate","hide","show","relatedTarget","toggleFullscreen","mounted","Modal","popup","footer","slots","includedPrimevue","primevue","instance","setup","h","unmount","beforeUnmount","wrapper","zIndex","overlay","Phrasen","ApiAbgabe","getConfig","getConfigStudent","getStudentProjektarbeiten","getStudentProjektabgaben","projektarbeit_id","postStudentProjektarbeitEndupload","Headers","postStudentProjektarbeitZwischenabgabe","getMitarbeiterProjektarbeiten","showall","postProjektarbeitAbgabe","termin","dateString","Date","getFullYear","getMonth","padStart","getDate","paabgabe_id","paabgabetyp_kurzbz","bezeichnung","note_pk","upload_allowed","beurteilungsnotiz","fixtermin","insertvon","kurzbz","betreuer_person_id","deleteProjektarbeitAbgabe","postSerientermin","projektarbeit_ids","fetchDeadlines","getPaAbgabetypen","getProjektarbeitenForStudiengang","benotet","getStudiengaenge","postStudentProjektarbeitZusatzdaten","getSignaturStatusForProjektarbeitAbgaben","paabgabe_ids","FhcOverlay","active","AbgabeStudentDetail","InputNumber","inputnumber","Checkbox","checkbox","Dropdown","dropdown","Textarea","textarea","Accordion","accordion","AccordionTab","accordiontab","Message","Inplace","inplace","VueDatePicker","inject","projektarbeit","viewMode","loading","eidAkzeptiert","enduploadTermin","allActiveLanguages","abstract","abstract_en","schlagwoerter","schlagwoerter_en","kontrollschlagwoerter","seitenanzahl","getNoteBezeichnung","noteOpt","notenOptions","opt","positiv","$capitalize","benotbar","validate","endupload","triggerEndupload","bperson_id","handleUploadRes","finally","modalContainerEnduploadZusatzdaten","downloadAbgabe","window","formatDate","dateParam","padZero","num","month","abgabedatum","toISOString","signatur","signaturInfo","getOptionLabel","option","getTerminNoteBezeichnung","newVal","getMoodleLink","moodle_link","getMessagePtStyle","style","margin","padding","getEid","allowedToSaveZusatzdaten","getAllowedToSendEndupload","qualityGateTerminAvailable","qgatefound","abgabetermine","abgabe","getTooltipVerspaetet","getTooltipVerpasst","getTooltipAbzugeben","getTooltipStandard","getTooltipAbgegeben","getTooltipFixtermin","getTooltipAbgabeDetected","getTooltipNotAllowedToUpload","isViewMode","getTooltipBeurteilungerforderlich","getTooltipBestanden","getTooltipNichtBestanden","created","zone","today","luxon","DateTime","now","setZone","getDateStyleClass","fromISO","endOf","diffindays","diff","days","isLate","nopt","AbgabetoolStudent","AbgabeDetail","student_uid_prop","viewData","activeTabIndex","abgabeTypeOptions","phrasenPromise","phrasenResolved","projektarbeiten","selectedProjektarbeit","checkQualityGatesStrict","termine","qgate1Passed","qgate2Passed","noteOption","checkQualityGatesOptional","qgate1found","qgate2found","qgate1positiv","qgate2positiv","isPastDate","deadline","setDetailComponent","loadAbgaben","pa","projekarbeit","paIsBenotet","allowedToUpload","inTime","dateStyle","betreuer","buildBetreuer","modalContainerAbgabeDetail","centeredTextFormatter","cell","getValue","detailFormatter","mode","mailFormatter","beurteilungFormatter","buildMailToLink","projekt","email","btitelpre","bvorname","bnachname","btitelpost","setupData","betreuerart_kurzbz","beurteilung1","downloadLink1","beurteilung2","downloadLink2","sem","stg","kurzbzlang","mail","projekttypbezeichnung","titel","loadProjektarbeiten","setupMounted","getAccTabHeaderForProjektarbeit","getMailLink","handleDownloadBeurteilung1","handleDownloadBeurteilung2","allowedNotenOptions","catch","CoreFetchCmpt","refresh","apiFunction","Function","apiFunctionParameters","newValue","oldValue","fetchData","errorMessage","apiFunctionResult","successHandler","errorHandler","finallyHandler","setError","FILTER_COMPONENT_NEW_FILTER","FilterConfig","filters","columns","fields","switchFilter","applyFilterConfig","currentFields","types","c","evt","currentTarget","filteredFields","condition","addField","removeField","splice","FilterColumns","selected","names","selectedFields","DEFAULT_ICONS","jsonLines","xlsx","pdf","json","csv","DEFAULT_LABELS","TableDownload","tabulator","iconClass","currentConfig","prototype","toString","newConfig","k","v","stringToFileFormatter","icon","label","formatter","validateFileFormatter","lcInput","XLSX","jspdf","jsPDF","autoTable","download","elementDataMap","WeakMap","collapseAutoClose","binding","contains","collapse","getInstance","addEventListener","removeEventListener","collapsibleAutoHideFunc","Tabulator","extendModule","fitDataStretchFrozen","forced","colsWidth","tableWidth","table","rowManager","element","clientWidth","gap","lastCol","column","widthFixed","reinitializeWidth","responsiveLayout","modules","responsive","visible","definition","frozen","getWidth","modExists","setWidth","ApiFilter","_uuid","CoreFilterCmpt","directives","onNwNewEntry","description","sideMenu","tabulatorOptions","tabulatorEvents","tableOnly","noColumnFilter","reload","reloadBtnInfotext","newBtnShow","newBtnClass","newBtnDisabled","newBtnLabel","uniqueId","idField","parentIdField","countOnly","useSelectionSpan","uuid","filterName","filterActive","dataset","datasetMetadata","availableFilters","selectedFilter","fetchCmptRefresh","fetchCmptApiFunction","fetchCmptApiFunctionParams","fetchCmptDataFetched","fetchResult","tableBuilt","tabulatorHasSelector","selectedData","persistence","headerFilter","notSelectedFields","x","filteredData","filteredColumns","col","resizable","fieldIdsForVisibilty","getColumns","def","getDefinition","getField","fieldNames","idExtra","columnsForFilter","filterTitles","reloadTable","setData","initTabulator","placeholder","location","hash","slice","resolvePromiseFunc","setRenderData","startFetchCmpt","layout","movableColumns","columnDefaults","tooltip","height","minHeight","maxHeight","selectable","dataTree","on","toDelete","childIdx","child","cols","isVisible","_setHeaderFilter","updateTabulator","_updateTabulator","setColumns","clearFilters","getHeaderFilters","setHeaderFilterValue","clearFilter","render","j","setSideMenu","setDropDownMenu","personalFilters","filtersArray","filtersCount","link","filter_id","desc","onClickCall","handlerGetFilterById","subscriptDescription","subscriptLinkClass","subscriptLinkValue","onClickSubscriptCall","handlerRemoveCustomFilter","children","dataFetchedCallback","handlerSaveCustomFilter","substring","attr","parentId","parentIdx","parent","_children","beforeCreate","$props","AbgabeMitarbeiterDetail","SpeedDial","speeddial","isFullscreen","assistenzMode","showAutomagicModalPhrase","speedDialItems","command","openCreateNewAbgabeModal","getAllowedToCreateNewTermin","openBenotung","openPlagiatcheck","openStudentPage","newTermin","noteBackend","getPlaceholderTermin","saveTermin","invertedFixtermin","newTerminRes","allowedToSave","allowedToDelete","existingTerminRes","abgabeOpt","noteOptExisting","findIndex","savedNewWithNegative","savedExistingNoteAsNegativeAndWasNotNegativeBefore","modalContainerCreateNewAbgabe","openZusatzdatenModal","modalContainerZusatzdaten","saveZusatzdaten","validateZusatzdaten","paRes","handleDeleteTermin","deleteTermin","deletedTerminIndex","openBeurteilungLink","getOptionLabelSprache","getOptionLabelAbgabetyp","getOptionDisabled","aktiv","getNotenOptionLabel","turnitin_link","getSemesterBenotbar","beurteilungLinkNew","beurteilungLinkOld","upload_allowed_default","validateTermin","handleSaveNewAbgabe","handleChangeAbgabetyp","notenOptionsNonFinal","getAllowedAbgabeTypeOptions","abgabetypenBetreuer","getEnduploadErlaubt","isCurrent","endUploadVorhanden","getSpeedDialStyle","getSpeedDialWrapperStyle","getTooltipNotAllowedToSave","getTooltipNotAllowedToDelete","getProjektarbeitTitel","getProjektarbeitStudent","student","dateFilter","onRendered","div","initialValue","start","end","PrimevueCalendar","calendar","splitMailsHelper","mails","subject","alertPluginRef","phrasenPluginRef","maillist","mailto","subjectlength","firstrun","useBcc","ctrlKey","metaKey","splitposition","lastIndexOf","mailLink","href","dates","headerValue","rowValue","rowDate","startDate","endDate","setHours","toDateString","singleDate","AbgabetoolMitarbeiter","TieredMenu","tieredmenu","old_abgabe_beurteilung_link","tableData","detailIsFullscreen","BETREUER_SAMMELMAIL_BUTTON_STUDENT","saving","serienTermin","showAll","tabulatorUuid","domain","detailOffset","tableBuiltResolve","tableBuiltPromise","abgabeTableOptions","selectableCheck","selectionCheck","rowHeight","formatterParams","getRow","stopPropagation","handleClick","cssText","titleFormatter","hozAlign","headerSort","selectHandler","titleFormatterParams","selectAllHandler","width","cssClass","widthGrow","pkzTextFormatter","maxWidth","headerFilterFunc","headerFilterTerminCol","sorter","sortFuncTerminCol","abgabterminFormatter","headerFilterParams","valuesLookup","getQGateStatusList","persistenceID","abgabeTableEventHandlers","getColumn","undoSelection","sd","fsd","checked","d","handlePaUpdated","checkAbgabetermineProjektarbeit","abgabeTable","redraw","sammelMailStudent","param","recipientList","Set","originalEvent","aRow","bRow","dir","_column","Math","abs","diffMs","filterVal","rowVal","luxonDate","isValid","toLuxon","fromJSDate","fromMillis","Number","hasSame","startOf","loadState","localStorage","getItem","saveState","stateRestored","state","getColumnLayout","getSorters","s","getFilters","headerFilters","setItem","handleTableBuilt","saved","colLayoutRestored","setColumnLayout","filtersRestored","setFilter","headerFiltersRestored","hf","sortRestored","setTimeout","sortList","columnManager","findColumn","setSort","checkQualityGateStatus","qgate1Termine","qgate2Termine","qgate1Status","qgate1StatusRank","qgate2Status","qgate2StatusRank","qgate","toMillis","prevTermin","nextTermin","isSelected","deselect","select","getTable","getRows","r","handleToggleFullscreenDetail","showDeadlines","toggleShowAll","openAddSeriesModal","modalContainerAddSeries","addSeries","oldScrollLeft","scrollLeft","oldScrollTop","scrollTop","nextTick","createInfoString","str","paabgabe","vorname","nachname","tableResolve","buildPKZ","matrikelnr","buildStg","pkz","beurteilung","beurteilungLink","projekttyp_kurzbz","callback","handleUuidDefined","calcMaxTableHeight","tableID","tableDataSet","getElementById","rect","getBoundingClientRect","visualViewport","top","setHeight","emailItems","uniqueStudentEmailCount","emails","BsOffcanvas","offcanvas","scroll","placement","Offcanvas","ApiStudiensemester","getAllStudiensemesterAndAktOrNext","order","AbgabetoolAssistenz","AbgabeterminStatusLegende","Timeline","timeline","stg_kz_prop","studiensemesterOptions","allSem","curSem","notenOptionFilter","inplaceToggle","timelineProjekt","selectedStudiengangOption","studiengaengeOptions","allConfigPromise","ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT","ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER","allowedNotenFilterOptions","renderVerticalBuffer","formAction","minWidth","uniqueRecipients","sammelMailBetreuer","betreuer_mail","zweitbetreuer_mail","getItemBezeichnung","getItemNote","notenOption","handleChangeAbgabetypSerientermin","semesterChanged","existing","f","compVal","newFilter","getOptionLabelStg","getOptionLabelStudiensemester","getNotenFilterOptionLabel","actionButtons","className","display","alignItems","justifyContent","createButton","titleKey","clickHandler","btn","aspectRatio","transform","innerHTML","stopImmediatePropagation","openTimeline","pids","preserveSelected","newAbgaben","pid","scrollX","scrollY","mappedData","mapProjekteToTableData","projekte","note_bez","erstbetreuer","buildErstbetreuer","zweitbetreuer","buildZweitbetreuer","student_vorname","student_nachname","p","terminTypOpt","drawer","timelineFormatter","erstbetreuer_full_name","betreuer_vorname","betreuer_nachname","zweitbetreuer_full_name","uniqueBetreuerEmailCount","oldVal","allRows","cb","getElement","requests","results","stgOpt","DeadlineOverview","person_uid_prop","fullName","deadlines","deadlineTableOptions","deadlineTableEventHandlers","pdfExportLink","loadDeadlines","dl","stud_titelpre","stud_vorname","stud_nachname","stud_titelpost","fixterminstring","deadlineTable","comp","student_uid_computed","stg_kz_computed","route","string","directive"],"mappings":"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"} \ No newline at end of file diff --git a/public/dist/js/apps/Dashboard/Fhc.js b/public/dist/js/apps/Dashboard/Fhc.js index a50bf9006..6f5f0f6e5 100644 --- a/public/dist/js/apps/Dashboard/Fhc.js +++ b/public/dist/js/apps/Dashboard/Fhc.js @@ -1,6 +1,6 @@ -import t from"../../../../../index.ci.php/public/js/components/primevue/config/config.esm.min.js";import e from"../../../../../index.ci.php/public/js/components/primevue/toast/toast.esm.min.js";import n from"../../../../../index.ci.php/public/js/components/primevue/confirmdialog/confirmdialog.esm.min.js";import a from"../../../../../index.ci.php/public/js/components/primevue/confirmationservice/confirmationservice.esm.min.js";import i from"../../../../js/components/vueDatepicker.js.php";var s={name:"BootstrapModal",data:()=>({modal:null,fullscreen:!1}),props:{backdrop:{type:[Boolean,String],default:!0,validator:t=>["static",!0,!1].includes(t)},focus:{type:Boolean,default:!0},keyboard:{type:Boolean,default:!0},noCloseBtn:Boolean,dialogClass:[String,Array,Object],headerClass:{type:[String,Array,Object],default:""},bodyClass:{type:[String,Array,Object],default:"px-4 py-5"},footerClass:{type:[String,Array,Object],default:""},allowFullscreenExpand:{type:Boolean,default:!1}},emits:["hideBsModal","hiddenBsModal","hidePreventedBsModal","showBsModal","shownBsModal","toggleFullscreen"],methods:{dispose(){return this.modal.dispose()},handleUpdate(){return this.modal.handleUpdate()},hide(){return this.modal.hide()},show(t){return this.modal.show(t)},toggle(){return this.modal.toggle()},toggleFullscreen(){this.fullscreen=!this.fullscreen,this.$emit("toggleFullscreen")}},mounted(){this.$refs.modal&&(this.modal=new bootstrap.Modal(this.$refs.modal,{backdrop:this.backdrop,focus:this.focus,keyboard:this.keyboard}))},popup(t,e,n,a){const i=this,s={};void 0!==t&&(s.default=()=>t),void 0!==n&&(s.title=()=>n),void 0!==a&&(s.footer=()=>a);let r=!1;return"undefined"!=typeof primevue&&(r=!0),new Promise((t,n)=>{const a=Vue.createApp({name:"ModalTmpApp",setup:()=>()=>Vue.h(i,{class:"fade",...e,ref:"modal","onHidden.bs.modal":a.unmount},s),mounted(){this.$refs.modal.show()},beforeUnmount(){this.$refs.modal&&(!1!==this.$refs.modal.result?t(this.$refs.modal.result):n())},unmounted(){l.parentElement.removeChild(l)}}),l=document.createElement("div");r&&a.use(primevue.config.default,{zIndex:{overlay:9999}}),Promise.resolve().then(function(){return it}).then(t=>{a.use(t.default),a.mount(l),document.body.appendChild(l)})})},template:''},r={name:"BootstrapAlert",components:{BsModal:s},mixins:[s],props:{dialogClass:{type:[String,Array,Object],default:"modal-dialog-centered"},onHideBsModal:Function,onHiddenBsModal:Function,onHidePreventedBsModal:Function,onShowBsModal:Function,onShownBsModal:Function},data:()=>({result:!0}),mounted(){this.modal=this.$refs.modalContainer.modal},popup(t,e){return s.popup.bind(this)(t,e)},template:'\n\t\t\n\t\t\n\t'},l={name:"BootstrapConfirm",mixins:[r],data:()=>({result:!1}),popup(t,e){return r.popup.bind(this)(t,e)},template:'\n\t\t\n\t\t\n\t'},o={name:"GridItem",components:{},inject:{},props:{item:Object,active:Boolean},emits:["mouseDown","mouseUp","startMove","startResize","dragging","endDrag","dropDrag","item","touchStart","touchEnd"],data:()=>({dragAction:"",dragging:!1}),computed:{},methods:{registerDragAction(t){if(this.$emit("mouseDown",t),t.target.hasAttribute("drag-action"))this.dragAction=t.target.getAttribute("drag-action");else{let e=t.target.closest("[drag-action]");this.dragAction=e?e.getAttribute("drag-action"):""}},tryDragStart(t,e){let n=this.dragAction||t.target.getAttribute("drag-action");if(n){if(this.dragging=!0,"move"==n)return this.$emit("startMove",t,e);if("resize"==n)return this.$emit("startResize",t,e)}},touchDragEnd(t){this.dragging&&(this.dragging=!1,this.$emit("touchEnd",t))},touchStart(t){this.$emit("touchStart",t),this.registerDragAction(t),this.tryDragStart(t,this.item)},touchMove(t){this.dragging&&(t.preventDefault(),this.$emit("dragging",t))}},template:'\n\t
    \n\t\t\n\t
    '};class d{constructor(t){t.w?(this.w=t.w,this.h=t.h,this.data=[...t.data],this.grid=[...t.grid]):(this.w=t,this.h=1,this.data=[],this.grid=[])}isFreeSlot(t,e){const n=e*this.w+t;return!this.grid[n]&&0!==this.grid[n]}getMaxY(){return this.data.reduce((t,e)=>(e?.y>t&&(t=e.y),t),0)}getFreeSlots(){const t=[];let e=this.getMaxY(),n=this.w*(e+1);for(let t=0;tthis.grid[e]=t.index),this.data[t.index]=t,this.h=Math.max(this.h,t.y+t.h),[];{const a=new d(this);t.frame.forEach(t=>a.grid[t]=-1);const i=a.tryMoving(n,e);if(i.length){const e=i.sort((t,e)=>(void 0===t.cost&&(t.cost=t.moves.reduce((t,e)=>t*e.cost,1)),void 0===e.cost&&(e.cost=e.moves.reduce((t,e)=>t*e.cost,1)),t.cost>e.cost)),n=[];return e[0].moves.forEach(t=>{const e={...this.data[t.index]};e.x+=t.x,e.y+=t.y,e.frame=this.getItemFrame(e),this.h=Math.max(this.h,e.y+e.h),this.remove(e),e.frame.forEach(t=>this.grid[t]=e.index),this.data[t.index]=e,n[t.index]={index:e.index,x:e.x,y:e.y}}),t.frame.forEach(e=>this.grid[e]=t.index),this.data[t.index]=t,n}console.error("FATAL","can't arrange item on grid")}}move(t,e,n){if(t.data.place[this.w]?.pinned)return[];if(t.x==e&&t.y==n)return[];let a;this.remove(t),t.x==e?a=n-t.y>0?0:3:t.y==n&&(a=e-t.x>0?1:2);const i=Array.isArray(t.frame)?[...t.frame]:[t.frame],s={...t};s.x=e,s.y=n,s.frame=this.getItemFrame(s);let r=this.getItemsInFrame(s.frame);if(r.some(t=>this.data[t]?.data.place[this.w]?.pinned))return[];let l=r.map(t=>this.data[t]),o=l.map(t=>t.frame).flat();if(!o.some(t=>!s.frame.includes(t))&&!o.some(t=>i.includes(t))){let a=[],s=[];for(let t of i){if(s.includes(t))continue;let e=l.shift();e&&(s=[...s,...this.getItemFrame({...e,...this.getSingleFramePosition(t)})],a[e.index]={index:e.index,...this.getSingleFramePosition(t)})}return a[t.index]={index:t.index,x:e,y:n},a}const d=this.add(s,a);return d[t.index]={index:t.index,x:e,y:n},d}resize(t,e,n){if(t.w==e&&t.h==n)return[];this.remove(t);const a={...t};a.w=e,a.h=n,a.frame=this.getItemFrame(a);const i=this.add(a);return i&&(i[t.index]={index:t.index,w:e,h:n,x:t.x,y:t.y,resize:!0}),i}tryMoving(t,e){if(Array.isArray(t)){t.forEach(t=>this.remove({index:t}));let n=[{grid:this,moves:[]}];return t.forEach(t=>{let a=[];n.forEach(n=>{n.grid.tryMoving(t,e).forEach(t=>{n.moves,t.moves=[...t.moves,...n.moves],a.push(t)})}),n=a}),n}const n=[0,3,1,2];this.remove({index:t});const a=1+.2*(this.data[t].weight||0);return n.reduce((n,i)=>{let s=this.tryMovingInDirection(i,t,1,(e===i?.5:1+.1*i)*a);return s?[...n,...s]:n},[]).filter(t=>t)}tryMovingInDirection(t,e,n,a){const i={index:e,x:0,y:0,cost:a};let s;switch(t){case 0:if(this.data[e].data?.place[this.w]?.pinned||this.data[e].y-n<0)return!1;s=this.data[e].frame.map(t=>t-this.w*n),i.y=-n;break;case 3:if(this.data[e].data?.place[this.w]?.pinned)return!1;this.data[e].y+this.data[e].h+n>this.h&&(a+=.4),s=this.data[e].frame.map(t=>t+this.w*n),i.y=n;break;case 1:if(this.data[e].data?.place[this.w]?.pinned||this.data[e].x-n<0)return!1;s=this.data[e].frame.map(t=>t-n),i.x=-n;break;case 2:if(this.data[e].data?.place[this.w]?.pinned||this.data[e].x+this.data[e].w+n>this.w)return!1;s=this.data[e].frame.map(t=>t+n),i.x=n}const r=this.getItemsInFrame(s);if(r.includes(-1))return this.tryMovingInDirection(t,e,n+1,a);const l=new d(this);if(s.forEach(t=>l.grid[t]=-1),!r.length)return[{grid:l,moves:[i]}];const o=l.tryMoving(r).map(t=>t.moves.unshift(i)&&t);return!!o.length&&o}clearWeights(){this.data.forEach(t=>t.weight=void 0)}getItemsInFrame(t){return t.map(t=>this.grid[t]).filter((t,e,n)=>(t||0===t)&&n.indexOf(t)===e)}remove(t){this.grid=this.grid.map(e=>e!=t.index?e:void 0)}getItemFrame(t){const e=[];for(let n=0;n({x:-1,y:-1,clientX:0,clientY:0,mode:0,grid:null,dragGrid:null,permUpdates:[],positionUpdates:null,fixedPositionUpdates:null,draggedOffset:[0,0],draggedItem:null,draggedNode:null,reorderedItems:[],clonedWidget:null}),inject:{sectionName:{type:String,default:""}},computed:{additionalRowComputed:{get(){return this.additionalRow},set(t){this.$emit("update:additionalRow",t)}},items_hashmap(){let t={};return this.items.forEach(e=>{if(this.reorderedItems.length>0&&this.needsReordering(e)){let t=this.reorderedItems.filter(t=>t.data.widgetid==e.widgetid)?.pop();t&&(e.x=t.x,e.y=t.y)}t[`x${e.x}y${e.y}`]=e}),t},items_placeholders(){let t=[],e=this.cols,n=this.rows,a={};for(let i=0;i({index:e,x:t.x,y:t.y,w:t.w,h:t.h,weight:t.weight||0,data:t}))},prePlacedItems(){return this.fixedPositionUpdates?this.indexedItems.map(t=>this.fixedPositionUpdates[t.index]?{index:t.index,weight:t.weight,data:t.data,x:void 0===this.fixedPositionUpdates[t.index].x?t.x:this.fixedPositionUpdates[t.index].x,y:void 0===this.fixedPositionUpdates[t.index].y?t.y:this.fixedPositionUpdates[t.index].y,w:void 0===this.fixedPositionUpdates[t.index].w?t.w:this.fixedPositionUpdates[t.index].w,h:void 0===this.fixedPositionUpdates[t.index].h?t.h:this.fixedPositionUpdates[t.index].h}:t):this.indexedItems},placedItems(){if(!this.positionUpdates)return this.prePlacedItems;let t=this.prePlacedItems.map(t=>{if(!this.positionUpdates[t.index])return t;let e=this.positionUpdates[t.index]?.h-t.h,n=this.positionUpdates[t.index]?.w-t.w;return{resize:this.positionUpdates[t.index]?.resize,index:t.index,weight:t.weight,data:t.data,x:void 0===this.positionUpdates[t.index].x?t.x:this.positionUpdates[t.index].x,y:void 0===this.positionUpdates[t.index].y?t.y:this.positionUpdates[t.index].y,w:n>0||void 0===this.positionUpdates[t.index].w?t.w:this.positionUpdates[t.index].w,h:e>0||void 0===this.positionUpdates[t.index].h?t.h:this.positionUpdates[t.index].h}}),e=[];return t.forEach(t=>{if(t.resize){let n={...t,w:void 0===this.positionUpdates[t.index].w?t.w:this.positionUpdates[t.index].w,h:void 0===this.positionUpdates[t.index].h?t.h:this.positionUpdates[t.index].h,resizeOverlay:!0,blank:!0};e.push(n)}}),[...t,...e]},showEmptyTileHover(){return!(!this.active||!this.grid||0!=this.mode||this.x<0||this.y<0||this.x>=this.cols||this.y>=this.rows)&&this.grid.isFreeSlot(this.x,this.y)},widgetSetup(){if(this.widgetsSetup)return this.widgetsSetup.reduce((t,e)=>(t[e.widget_id]=e,t),{})}},watch:{active(t){t||this.dragCancel()},cols(){this.dragCancel()},rows:{handler(t){this.$emit("gridHeight",t)},immediate:!0},indexedItems:{handler(t){this.dragCancel();const e=this.createNewGrid(t);this.fixedPositionUpdates=e,e.length&&this.$emit("rearrangeItems",e.filter(t=>t))},immediate:!0,deep:!0}},methods:{needsReordering(t){return!t?.data?.place[this.cols]},toggleDraggedItemOverlay(t){this.draggedNode&&(t?this.draggedNode.firstElementChild.classList.add("dashboard-item-overlay"):this.draggedNode.firstElementChild.classList.remove("dashboard-item-overlay"))},dragging(t){if(1==this.mode){this.toggleDraggedItemOverlay(!0);const t=this.$refs.container.getBoundingClientRect(),e=this.clonedWidget.getBoundingClientRect();let n=this.clientY-20,a=this.clientX-15;const i=0,s=t.height-e.height,r=0,l=t.width-e.width,o=Math.max(i,Math.min(s,n)),d=Math.max(r,Math.min(l,a));this.clonedWidget.style.top=`${o}px`,this.clonedWidget.style.left=`${d}px`}},createNewGrid(t){this.grid=new d(this.cols);const e=[];let n=[...t].sort((t,e)=>this.needsReordering(t)&&this.needsReordering(e)?0:this.needsReordering(t)?999:this.needsReordering(e)?-999:t.weight>e.weight),a=[];return n.forEach(n=>{let i=this.grid.getFreeSlots();if(this.needsReordering(n)){let t=i.shift();t?(n.x=t.x,n.y=t.y):(n.x=0,n.y=this.grid.h),a.push(n)}if(n.x+n.w>this.cols){let t,a=this.cols-n.x;this.resizeLimit&&([a]=this.resizeLimit(n.data,a,n.h)),a<1&&(a=1),a>this.cols&&(a=this.cols),n.x+a>this.cols&&(t=this.cols-a),a==n.w&&(a=void 0),e[n.index]={item:n.data,x:t,w:a}}n.frame=this.grid.getItemFrame(n),this.convertGridResultToUpdate(this.grid.add(n),e,t)}),this.reorderedItems=a,this.grid.clearWeights(),e},convertGridResultToUpdate(t,e,n){t&&(n||(n=this.indexedItems),t.forEach(t=>{let a={item:n[t.index].data};void 0!==t.x&&(a.x=t.x),void 0!==t.y&&(a.y=t.y),void 0!==t.w&&(a.w=t.w),void 0!==t.h&&(a.h=t.h),e[t.index]=a}))},mouseLeave(){},updateCursor(t){if(!this.active)return this.x=this.y=-1,!1;const e=this.active?this.marginForExtraRow:0,n=this.$refs.container.getBoundingClientRect();t.clientX||t.clientY||!t.touches||(t.clientX=t.touches[0].clientX,t.clientY=t.touches[0].clientY),this.clientX=t.clientX-n.left,this.clientY=t.clientY-n.top;const a=Math.floor(this.cols*(t.clientX-n.left)/this.$refs.container.clientWidth),i=Math.floor((this.rows+e)*(t.clientY-n.top)/this.$refs.container.clientHeight);return(this.x!=a||this.y!=i)&&(this.x=a,this.y=i,!0)},_dragStart(t,e){t.dataTransfer&&(t.dataTransfer.setDragImage(t.target,-99999,-99999),t.dataTransfer.dropEffect="move",t.dataTransfer.effectAllowed="move")},startMove(t,e){this.active&&(this.mode=1,this.draggedItem=e,this.$emit("draggedItem",e),setTimeout(()=>{this.draggedNode=t.target.closest(".drop-grid-item");let e=t.target.closest(".drop-grid-item")?.cloneNode(!0);e.style.zIndex=5,e.classList.add("widgetClone"),this.$refs.container.appendChild(e);e.querySelector("[style='display: none;']").style.removeProperty("display"),this.clonedWidget=e},0),this.draggedOffset=[e.x-this.x,e.y-this.y],this._dragStart(t,e))},startResize(t,e){this.active&&(this.mode=2,this.draggedItem=e,this.$emit("draggedItem",e),this._dragStart(t))},dragOver(t){if(this.y+1>this.rows&&(1==this.mode||2==this.mode)&&this.dragCancel(),!this.active)return this.dragCancel();if(this.checkPinnedWidgetAnimation(),2==this.mode&&this.checkWidgetSizeLimitAnimation(),this.updateCursor(t))switch(this.mode){case 1:{t.preventDefault(),this.dragGrid=new d(this.grid);let e=this.x+this.draggedOffset[0],n=this.y+this.draggedOffset[1];e<0?(this.draggedOffset[0]+=e,e=0):e+this.draggedItem.w>this.cols&&(this.draggedOffset[0]+=this.cols-this.draggedItem.w-e,e=this.cols-this.draggedItem.w),n<0&&(this.draggedOffset[1]+=n,n=0),this.positionUpdates=this.dragGrid.move(this.draggedItem,e,n);break}case 2:{t.preventDefault(),this.dragGrid=new d(this.grid);let e=Math.min(this.cols-this.draggedItem.x,Math.max(1,this.x-this.draggedItem.x+1)),n=Math.max(1,this.y-this.draggedItem.y+1);this.resizeLimit&&([e,n]=this.resizeLimit(this.draggedItem.data,e,n)),this.positionUpdates=this.dragGrid.resize(this.draggedItem,e,n);break}}},dragCancel(){this.removeWidgetClones(),this.additionalRowComputed=!1,this.toggleDraggedItemOverlay(!1),this.mode=0,this.positionUpdates=null,this.draggedOffset=[0,0],this.draggedItem=null,this.$emit("draggedItem",null),this.draggedNode=null},dragEnd(){if(this.removeWidgetClones(),this.toggleDraggedItemOverlay(!1),0==this.mode)return;document.getElementById(this.draggedItem.data.widgetid).classList.remove("border-danger"),Array.from(document.getElementsByClassName("denied-dragging-animation"))?.forEach(t=>{t.classList.remove("denied-dragging-animation")}),this.mode=0;let t=[];this.convertGridResultToUpdate(this.positionUpdates,t),t=this._updateFixedPositions(t),t.length&&this.$emit("rearrangeItems",t.filter(t=>t)),this.draggedItem=null,this.draggedNode=null,this.$emit("draggedItem",null)},_updateFixedPositions(t){t.forEach((t,e)=>{this.fixedPositionUpdates[e]?this.fixedPositionUpdates[e]={...this.fixedPositionUpdates[e],...t}:this.fixedPositionUpdates[e]=t});let e=this.createNewGrid(this.prePlacedItems);return e.length?(e.forEach((e,n)=>t[n]=e),this._updateFixedPositions(t)):t},emptyTileClicked(){this.additionalRowComputed=!1,this.$emit("newItem",this.x,this.y)},updateCursorOnMouseMove(t){0==this.mode&&this.updateCursor(t)},checkPinnedWidgetAnimation(){let t=[];switch(this.mode){case 2:for(let e=this.draggedItem.x;e<=this.x;e++)for(let n=this.draggedItem.y;n<=this.y;n++)this.items.forEach(a=>{a.x==e&&a.y==n&&t.push(a)});break;case 1:t=this.items.filter(t=>t.x==this.x&&t.y==this.y)}Array.from(document.getElementsByClassName("denied-dragging-animation"))?.forEach(t=>{t.classList.remove("denied-dragging-animation")}),t.forEach(t=>{if(t.place[this.cols]&&t.place[this.cols].pinned){let e=document.getElementById(t.widgetid).querySelector("[pinned='true']");e.classList.contains("denied-dragging-animation")||e.classList.add("denied-dragging-animation")}})},checkWidgetSizeLimitAnimation(){let t=this.itemsSetup[this.draggedItem.data.widget],e=t.width.max??t.width,n=t.width.min??t.width,a=t.height.max??t.height,i=t.height.min??t.height,s=document.getElementById(this.draggedItem.data.widgetid),r=this.x-this.draggedItem.x+1,l=this.y-this.draggedItem.y+1;r>0&&(r>e||r0&&(l>a||l\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t'};let u={},p={},h=FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/dashboard/Widget";var m={getWidget:t=>u[t],loadWidget:t=>u[t]?Promise.resolve(u[t]):p[t]?p[t]:h?(p[t]=new Promise((e,n)=>{axios.get(h,{params:{id:t}}).then(n=>{u[t]=n.data.retval,p[t]=void 0,e(u[t])}).catch(t=>n(t.response.data.retval.error))}),p[t]):Promise.reject("Widget could not be loaded because there is no path yet!"),setPath(t){h=t}},g={name:"Item",components:{BsModal:s,HeightTransition:{data:()=>({}),methods:{onEnter(t,e){t.style.height="0",t.style.height=t.scrollHeight+"px"},onLeave(t,e){t.style.height=t.scrollHeight+"px",t.style.height="0"}},template:'\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t'}},data:()=>({component:"",arguments:null,target:!1,widget:null,tmpConfig:{},isLoading:!1,hasConfig:!1,sharedData:null}),emits:["change","remove","dragstart","resizestart","configOpened","configClosed","pinItem","unPinItem"],props:["id","widgetID","config","width","height","custom","hidden","editMode","loading","item_data","place","setup","dragstate","resizeOverlay","additionalRow"],computed:{maxHeight(){return this.setup?.height?.max},maxWidth(){return"[object Number]"==Object.prototype.toString.call(this.setup?.width)?this.setup?.width:this.setup?.width?.max},minHeight(){return this.setup?.height?.min},minWidth(){return this.setup?.width?.min},isResizeable(){return this.maxWidth>1||this.maxHeight>1},isPinned(){return!!this.place?.pinned},ready(){return this.component&&null!==this.arguments}},methods:{unpin(){if(!this.editMode)return;let t={item:this.item_data,x:this.item_data.x,y:this.item_data.y};this.$emit("unPinItem",[t])},pinItem(){let t={item:this.item_data,x:this.item_data.x,y:this.item_data.y};this.$emit("pinItem",[t])},getWidgetC4Link:t=>FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+t.setup.cis4link,handleShowBsModal(){this.$emit("configOpened")},handleHideBsModal(){this.$emit("configClosed")},mouseDown(t){this.target=t.target},startDrag(t){this.$refs.dragHandle.contains(this.target)?this.$emit("dragstart",t):this.isResizeable&&this.$refs.resizeHandle.contains(this.target)&&this.isResizeable?this.$emit("resizestart",t):t.preventDefault()},openConfig(){this.tmpConfig={...this.arguments},this.$refs.config.show()},setConfig(t){this.hasConfig=t},changeConfig(){this.isLoading=!0;let t={...this.tmpConfig};this.sendChangeConfig(t)},changeConfigManually(){let t={...this.arguments};this.sendChangeConfig(t)},sendChangeConfig(t){for(var e in t)this.widget.arguments[e]==t[e]&&delete t[e];this.$emit("change",t)}},watch:{config(){this.arguments={...this.widget?.arguments,...this.config},this.tmpConfig={...this.arguments},this.$refs.config&&this.$refs.config.hide(),this.isLoading=!1}},async created(){this.widget=await m.loadWidget(this.id);let t=(await import(this.widget.setup.file)).default;this.$options.components["widget"+this.widget.widget_id]=t,this.component="widget"+this.widget.widget_id,this.arguments={...this.widget.arguments,...this.config},this.tmpConfig={...this.arguments}},template:'\n\t
    \n\t\t
    \n\t\t\t\n\t\t
    \n\t
    \n\t
    \n\t
    \n\t\t
    \n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t{{ widget.setup.name }}\n\t\t\t\n\t\t\t\n\t\t\t\n \t\t\n \t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t\t
    \n\t\t\t\n\t\t
    \n\t\t
    \n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\n\t\t
    \n\t
    '},f={data:()=>({}),props:{widget:{type:Object,required:!0}},methods:{path:t=>"/"==t[0]?FHC_JS_DATA_STORAGE_OBJECT.app_root+t:t},emits:["select"],template:'\n\t
    \n\t\t\n\t\t
    \n\t\t\t
    {{ widget.setup.name || widget.widget_kurzbz }}
    \n\t\t\t

    {{ widget.beschreibung }}

    \n\t\t
    \n\t
    '},v={name:"Section",components:{DropGrid:c,DashboardItem:g,WidgetIcon:f},inject:{widgetsSetup:{type:Array,default:[]},adminMode:{type:Boolean,default:!1},editMode:{type:Boolean,default:!1}},props:["name","widgets"],emits:["widgetAdd","widgetUpdate","widgetRemove"],data:()=>({configOpened:!1,gridWidth:1,gridHeight:null,draggedItem:null,additionalRow:!1}),provide(){return{editModeIsActive:Vue.computed(()=>this.editModeIsActive),sectionName:Vue.computed(()=>this.name)}},computed:{computedWidgetsSetup(){return this.widgetsSetup?this.widgetsSetup.reduce((t,e)=>(t[e.widget_id]=e.setup,t),{}):{}},editModeIsActive(){return(this.editMode||this.adminMode)&&!this.configOpened},getSectionStyle:()=>"margin-bottom: 8px;",items(){return this.widgets.map(t=>(!t?.widgetid&&t?.id&&(t.widgetid=t.id),{...t,reorder:!1,...t.place[this.gridWidth]||{reorder:!0,x:0,y:0,w:1,h:1}}))}},methods:{sectionNameTranslation(){switch(this.name){case"general":case"custom":return this.$p.t("dashboard",this.name);default:return this.name}},showSectionInformation(){return"general"==this.name?this.$p.t("dashboard","dashboardGeneralSectionDescription"):"custom"==this.name?this.$p.t("dashboard","dashboardCustomSectionDescription"):this.$p.t("dashboard","dashboardSectionDescription",[this.name])},handleConfigOpened(){this.configOpened=!0},handleConfigClosed(){this.configOpened=!1},checkResizeLimit(t,e,n){let a=m.getWidget(t.widget);if(a){let t=a.setup.width;t.max?t.min=t.min||1:t={min:t,max:t},et.max&&(e=t.max);let i=a.setup.height;i.max?i.min=i.min||1:i={min:i,max:i},ni.max&&(n=i.max)}return[e,n]},removeWidget(t,e){if(t.custom)l.popup("Are you sure you want to delete this widget?").then(()=>this.$emit("widgetRemove",this.name,t.id));else{let n={};n[t.id]={hidden:!e},this.updatePreset(n)}},saveConfig(t,e){let n={};n[e.id]={config:t},this.updatePreset(n)},updatePositions(t,e=!1){let n={};t.forEach(t=>{let a={...t.item};a.placeholder||(a.place[this.gridWidth]||(a.place[this.gridWidth]={x:0,y:0,w:1,h:1}),delete a.x,delete a.y,delete a.w,delete a.h,delete a.place[this.gridWidth].pinned,void 0!==t.x&&(a.place[this.gridWidth].x=t.x),void 0!==t.y&&(a.place[this.gridWidth].y=t.y),void 0!==t.w&&(a.place[this.gridWidth].w=t.w),void 0!==t.h&&(a.place[this.gridWidth].h=t.h),e&&(a.place[this.gridWidth].pinned=!0),n[a.id]=a)}),this.updatePreset(n)},updatePreset(t){let e={};e[this.name]=t,this.$emit("widgetUpdate",this.name,e)}},mounted(){let t=this,e=t.$refs.container;t.gridWidth=parseInt(window.getComputedStyle(e).getPropertyValue("--fhc-dashboard-grid-size")),window.addEventListener("resize",()=>{t.gridWidth=parseInt(window.getComputedStyle(e).getPropertyValue("--fhc-dashboard-grid-size"))})},template:'\n\t
    \n\t\t

    \n\t\t\t\n\t\t\t{{sectionNameTranslation()}}:\n\t\t

    \n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t
    '},b={components:{BsModal:s,WidgetIcon:f},props:["widgets"],data:()=>({callbacks:{}}),methods:{getWidget(){return new Promise((t,e)=>{this.callbacks={resolve:t,reject:e},this.$refs.modal.show()})},close(){this.callbacks.reject&&this.callbacks.reject(),this.callbacks={}},pick(t){this.callbacks.resolve&&this.callbacks.resolve(t),this.callbacks={},this.$refs.modal.hide()}},template:'
    \n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t
    '},y={mergeDeep(...t){const e=t=>t&&"object"==typeof t;return t.reduce((t,n)=>(Object.keys(n).forEach(a=>{const i=t[a],s=n[a];Array.isArray(i)&&Array.isArray(s)?t[a]=i.concat(...s):e(i)&&e(s)?t[a]=this.mergeDeep(i,s):t[a]=s}),t),{})}},w={getViewData:()=>({method:"get",url:"/api/frontend/v1/Cis4FhcApi/getViewData"})},k={name:"Dashboard",components:{DashboardSection:v,DashboardWidgetPicker:b},props:{dashboard:{type:String,required:!0,default:"CIS"},viewData:{type:Object,required:!0,validator:t=>t&&t.name&&t.uid&&t.timezone}},data(){return{sections:[],widgets:null,editMode:!1,viewDataInternal:this.viewData}},provide(){return{editMode:Vue.computed(()=>this.editMode),widgetsSetup:Vue.computed(()=>this.widgets),timezone:Vue.computed(()=>this.viewData.timezone)}},computed:{apiurl:()=>FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/dashboard"},methods:{widgetAdd(t,e){null===this.widgets&&axios.get(this.apiurl+"/Widget/getWidgetsForDashboard",{params:{db:this.dashboard}}).then(t=>{t.data.retval.forEach(t=>{t.arguments=JSON.parse(t.arguments),t.setup=JSON.parse(t.setup)}),this.widgets=t.data.retval}).catch(t=>console.error("ERROR:",t)),this.$refs.widgetpicker.getWidget().then(n=>{e.widget=n,e.id="loading_"+String((new Date).valueOf());let a={...e};a.loading=!0,this.sections.forEach(e=>{e.name==t&&e.widgets.push(a)}),axios.post(this.apiurl+"/Config/addWidgetsToUserOverride",{db:this.dashboard,funktion_kurzbz:t,widgets:[e]}).then(n=>{let i=Object.keys(n.data.retval.data[t].widgets).pop();e.id=i,this.sections.forEach(n=>{n.name==t&&(n.widgets.splice(n.widgets.indexOf(a),1),n.widgets.push(e))})}).catch(t=>{console.error("ERROR: ",t),alert("ERROR: "+t.response.data.retval)})}).catch(()=>{})},widgetUpdate(t,e){for(var n in e=e[t]){for(var a in this.sections)if(this.sections[a].name==t){for(var i in this.sections[a].widgets)if(this.sections[a].widgets[i].id==n){for(var s in e[n]=y.mergeDeep(this.sections[a].widgets[i],e[n]),{_x:1,_y:1,_w:1,_h:1,index:1,id:1,preset:1})e[n][s]&&delete e[n][s];break}break}e[n].widgetid=n}axios.post(this.apiurl+"/Config/addWidgetsToUserOverride",{db:this.dashboard,funktion_kurzbz:t,widgets:e}).then(()=>{this.sections.forEach(n=>{n.name==t&&n.widgets.forEach((t,a)=>{e[t.id]&&(e[t.id].id=t.id,e[t.id].index=t.index,n.widgets[a]=e[t.id])})})}).catch(t=>{console.error("ERROR: ",t),alert("ERROR: "+t.response.data.retval)})},widgetRemove(t,e){axios.post(this.apiurl+"/Config/removeWidgetFromUserOverride",{db:this.dashboard,funktion_kurzbz:t,widgetid:e}).then(()=>{this.sections.forEach(n=>{n.name==t&&(n.widgets=n.widgets.filter(t=>t.id!=e))})}).catch(t=>{console.error("ERROR: ",t),alert("ERROR: "+t.response.data.retval)})}},created(){this.$p.loadCategory("dashboard"),axios.get(this.apiurl+"/Widget/getWidgetsForDashboard",{params:{db:this.dashboard}}).then(t=>{this.widgets=t.data.retval}).catch(t=>console.error("ERROR:",t)),axios.get(this.apiurl+"/Config",{params:{db:this.dashboard}}).then(t=>{for(var e in t.data.retval){let a=[],i=[];for(var n in t.data.retval[e].widgets)t.data.retval[e].widgets[n].id=n,t.data.retval[e].widgets[n].custom||t.data.retval[e].widgets[n].preset?a.push(t.data.retval[e].widgets[n]):i.push(n);this.sections.push({name:e,widgets:a}),i.forEach(t=>this.widgetRemove(e,t))}this.sections=this.sections.sort((t,e)=>"custom"==t.name?1:"custom"==e.name?-1:e.widgets.length-t.widgets.length)}).catch(t=>console.error("ERROR:",t))},async beforeMount(){if(!this.viewData.name||!this.viewData.uid){const t=await this.$api.call(w.getViewData());this.viewDataInternal=t.data}},template:'\n\t
    \n\t\t

    \n\t\t\t{{ $p.t(\'global/personalGreeting\', [ viewDataInternal?.name ]) }}\n\t\t\t\n\t\t

    \n\t\t\n\t\t\n\t
    '},_={search(t,e){return this.$fhcApi.post("/api/frontend/v1/searchbar/search",t,e)},searchAdvanced(t,e){return this.$fhcApi.post("/api/frontend/v1/searchbar/searchAdvanced",t,e)},searchdummy(t){return this.$fhcApi.post("public/js/apps/api/dummyapi.php/Search",t)}},A={loadCategory(t){return this.$fhcApi.get("/api/frontend/v1/phrasen/loadModule/"+t)},setLanguage(t,e){const n={categories:t,language:e};return this.$fhcApi.post("/api/frontend/v1/phrasen/setLanguage",n)},getLanguage(){return this.$fhcApi.get("/api/frontend/v1/phrasen/getLanguage",{})},getActiveDbLanguages(){return this.$fhcApi.get("/api/frontend/v1/phrasen/getAllLanguages",{})}},x={getHeader(t){return this.$fhcApi.get("/api/frontend/v1/navigation/header",{navigation_page:t})},getMenu:function(t){return this.$fhcApi.get("/api/frontend/v1/navigation/menu",{navigation_page:t})}},$={saveCustomFilter(t){return this.$fhcApi.post("/api/frontend/v1/filter/saveCustomFilter",{filterUniqueId:t.filterUniqueId,filterType:t.filterType,customFilterName:t.customFilterName})},removeCustomFilter(t){return this.$fhcApi.post("/api/frontend/v1/filter/removeCustomFilter",{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterId:t.filterId})},applyFilterFields(t){return this.$fhcApi.post("/api/frontend/v1/filter/applyFilterFields",{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterFields:t.filterFields})},addFilterField(t){return this.$fhcApi.post("/api/frontend/v1/filter/addFilterField",{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterField:t.filterField})},removeFilterField(t){return this.$fhcApi.post("/api/frontend/v1/filter/removeFilterField",{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterField:t.filterField})},getFilterById(t){return this.$fhcApi.get("/api/frontend/v1/filter/getFilter",{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterId:t.filterId})},getFilter(t){return this.$fhcApi.get("/api/frontend/v1/filter/getFilter",{filterUniqueId:t.filterUniqueId,filterType:t.filterType})}},S={abmeldung:{getDetails(t,e){const n="/api/frontend/v1/studstatus/abmeldung/"+(void 0!==t?"getDetailsForAntrag/"+t:"getDetailsForNewAntrag/"+e);return this.$fhcApi.get(n)},create(t,e,n){return this.$fhcApi.post("/api/frontend/v1/studstatus/abmeldung/createAntrag",{studiensemester:t,prestudent_id:e,grund:n},{errorHandling:"strict"})},cancel(t){return Array.isArray(t)?Promise.allSettled(t.map(t=>this.$fhcApi.post("/api/frontend/v1/studstatus/abmeldung/cancelAntrag",{antrag_id:t.studierendenantrag_id},{errorHeader:"#"+t.studierendenantrag_id}))):this.$fhcApi.post("/api/frontend/v1/studstatus/abmeldung/cancelAntrag",{antrag_id:t})}},unterbrechung:{getDetails(t,e){const n="/api/frontend/v1/studstatus/unterbrechung/"+(void 0!==t?"getDetailsForAntrag/"+t:"getDetailsForNewAntrag/"+e);return this.$fhcApi.get(n)},create(t,e,n,a,i){return this.$fhcApi.post("/api/frontend/v1/studstatus/unterbrechung/createAntrag",{studiensemester:t,prestudent_id:e,grund:n,datum_wiedereinstieg:a,attachment:i},{errorHandling:"strict"})},cancel(t){return this.$fhcApi.post("/api/frontend/v1/studstatus/unterbrechung/cancelAntrag",{antrag_id:t},{errorHandling:"strict"})}},wiederholung:{getDetails(t){const e="/api/frontend/v1/studstatus/wiederholung/getDetailsForNewAntrag/"+t;return this.$fhcApi.get(e)},getLvs(t){const e="/api/frontend/v1/studstatus/wiederholung/getLvs/"+t;return this.$fhcApi.get(e)},create(t,e){return this.$fhcApi.post("/api/frontend/v1/studstatus/wiederholung/createAntrag",{prestudent_id:t,studiensemester:e},{errorHandling:"strict"})},cancel(t,e){return this.$fhcApi.post("/api/frontend/v1/studstatus/wiederholung/cancelAntrag",{prestudent_id:t,studiensemester:e},{errorHandling:"strict"})},saveLvs(t,e){return this.$fhcApi.post("/api/frontend/v1/studstatus/wiederholung/saveLvs",{forbiddenLvs:t,mandatoryLvs:e})}},leitung:{getStgs(){return this.$fhcApi.get("/api/frontend/v1/studstatus/leitung/getActiveStgs")},getAntraege(t,e,n){return this.$fhcApi.get("/api/frontend/v1/studstatus/leitung/getAntraege/"+t).then(t=>t.data)},getHistory(t){return this.$fhcApi.get("/api/frontend/v1/studstatus/leitung/getHistory/"+t)},getPrestudents(t,e){return this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/getPrestudents",{query:t},{signal:e,timeout:3e4})},approve(t){return Array.isArray(t)?Promise.allSettled(t.map(t=>this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/approveAntrag",t,{errorHeader:"#"+t.studierendenantrag_id}))):this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/approveAntrag",t)},reject(t){return Array.isArray(t)?Promise.allSettled(t.map(t=>this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/rejectAntrag",t,{errorHeader:"#"+t.studierendenantrag_id}))):this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/rejectAntrag",t)},reopen(t){return Array.isArray(t)?Promise.allSettled(t.map(t=>this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/reopenAntrag",t,{errorHeader:"#"+t.studierendenantrag_id}))):this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/reopenAntrag",t)},pause(t){return Array.isArray(t)?Promise.allSettled(t.map(t=>this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/pauseAntrag",t,{errorHeader:"#"+t.studierendenantrag_id}))):this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/pauseAntrag",t)},unpause(t){return Array.isArray(t)?Promise.allSettled(t.map(t=>this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/unpauseAntrag",t,{errorHeader:"#"+t.studierendenantrag_id}))):this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/unpauseAntrag",t)},object(t){return Array.isArray(t)?Promise.allSettled(t.map(t=>this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/objectAntrag",t,{errorHeader:"#"+t.studierendenantrag_id}))):this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/objectAntrag",t)},approveObjection(t){return Array.isArray(t)?Promise.allSettled(t.map(t=>this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/approveObjection",t,{errorHeader:"#"+t.studierendenantrag_id}))):this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/approveObjection",t)},denyObjection(t){return Array.isArray(t)?Promise.allSettled(t.map(t=>this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/denyObjection",t,{errorHeader:"#"+t.studierendenantrag_id}))):this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/denyObjection",t)}}},T={getView:function(t){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+`/api/frontend/v1/Profil/getView/${t}`,{})},fotoSperre:function(t){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+`/api/frontend/v1/Profil/fotoSperre/${t}`,{})},isStudent:function(t){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/Profil/isStudent",{uid:t})},isMitarbeiter:function(t){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+`/api/frontend/v1/Profil/isMitarbeiter/${t}`,{})},getZustellAdresse:function(){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/Profil/getZustellAdresse",{})},getZustellKontakt:function(){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/Profil/getZustellKontakt",{})},getGemeinden:function(t,e){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+`/api/frontend/v1/Profil/getGemeinden/${t}/${e}`,{})},getAllNationen:function(){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/Profil/getAllNationen",{})}},z={ +import t from"../../../../../index.ci.php/public/js/components/primevue/config/config.esm.min.js";import e from"../../../../../index.ci.php/public/js/components/primevue/toast/toast.esm.min.js";import n from"../../../../../index.ci.php/public/js/components/primevue/confirmdialog/confirmdialog.esm.min.js";import a from"../../../../../index.ci.php/public/js/components/primevue/confirmationservice/confirmationservice.esm.min.js";import i from"../../../../js/components/vueDatepicker.js.php";var s={name:"BootstrapModal",data:()=>({modal:null,fullscreen:!1}),props:{backdrop:{type:[Boolean,String],default:!0,validator:t=>["static",!0,!1].includes(t)},focus:{type:Boolean,default:!0},keyboard:{type:Boolean,default:!0},noCloseBtn:Boolean,dialogClass:[String,Array,Object],headerClass:{type:[String,Array,Object],default:""},bodyClass:{type:[String,Array,Object],default:"px-4 py-5"},footerClass:{type:[String,Array,Object],default:""},allowFullscreenExpand:{type:Boolean,default:!1}},emits:["hideBsModal","hiddenBsModal","hidePreventedBsModal","showBsModal","shownBsModal","toggleFullscreen"],methods:{dispose(){return this.modal.dispose()},handleUpdate(){return this.modal.handleUpdate()},hide(){return this.modal.hide()},show(t){return this.modal.show(t)},toggle(){return this.modal.toggle()},toggleFullscreen(){this.fullscreen=!this.fullscreen,this.$emit("toggleFullscreen")}},mounted(){this.$refs.modal&&(this.modal=new bootstrap.Modal(this.$refs.modal,{backdrop:this.backdrop,focus:this.focus,keyboard:this.keyboard}))},popup(t,e,n,a){const i=this,s={};void 0!==t&&(s.default=()=>t),void 0!==n&&(s.title=()=>n),void 0!==a&&(s.footer=()=>a);let r=!1;return"undefined"!=typeof primevue&&(r=!0),new Promise((t,n)=>{const a=Vue.createApp({name:"ModalTmpApp",setup:()=>()=>Vue.h(i,{class:"fade",...e,ref:"modal","onHidden.bs.modal":a.unmount},s),mounted(){this.$refs.modal.show()},beforeUnmount(){this.$refs.modal&&(!1!==this.$refs.modal.result?t(this.$refs.modal.result):n())},unmounted(){l.parentElement.removeChild(l)}}),l=document.createElement("div");r&&a.use(primevue.config.default,{zIndex:{overlay:9999}}),Promise.resolve().then(function(){return it}).then(t=>{a.use(t.default),a.mount(l),document.body.appendChild(l)})})},template:''},r={name:"BootstrapAlert",components:{BsModal:s},mixins:[s],props:{dialogClass:{type:[String,Array,Object],default:"modal-dialog-centered"},onHideBsModal:Function,onHiddenBsModal:Function,onHidePreventedBsModal:Function,onShowBsModal:Function,onShownBsModal:Function},data:()=>({result:!0}),mounted(){this.modal=this.$refs.modalContainer.modal},popup(t,e){return s.popup.bind(this)(t,e)},template:'\n\t\t\n\t\t\n\t'},l={name:"BootstrapConfirm",mixins:[r],data:()=>({result:!1}),popup(t,e){return r.popup.bind(this)(t,e)},template:'\n\t\t\n\t\t\n\t'},o={name:"GridItem",components:{},inject:{},props:{item:Object,active:Boolean},emits:["mouseDown","mouseUp","startMove","startResize","dragging","endDrag","dropDrag","item","touchStart","touchEnd"],data:()=>({dragAction:"",dragging:!1}),computed:{},methods:{registerDragAction(t){if(this.$emit("mouseDown",t),t.target.hasAttribute("drag-action"))this.dragAction=t.target.getAttribute("drag-action");else{let e=t.target.closest("[drag-action]");this.dragAction=e?e.getAttribute("drag-action"):""}},tryDragStart(t,e){let n=this.dragAction||t.target.getAttribute("drag-action");if(n){if(this.dragging=!0,"move"==n)return this.$emit("startMove",t,e);if("resize"==n)return this.$emit("startResize",t,e)}},touchDragEnd(t){this.dragging&&(this.dragging=!1,this.$emit("touchEnd",t))},touchStart(t){this.$emit("touchStart",t),this.registerDragAction(t),this.tryDragStart(t,this.item)},touchMove(t){this.dragging&&(t.preventDefault(),this.$emit("dragging",t))}},template:'\n\t
    \n\t\t\n\t
    '};class d{constructor(t){t.w?(this.w=t.w,this.h=t.h,this.data=[...t.data],this.grid=[...t.grid]):(this.w=t,this.h=1,this.data=[],this.grid=[])}isFreeSlot(t,e){const n=e*this.w+t;return!this.grid[n]&&0!==this.grid[n]}getMaxY(){return this.data.reduce((t,e)=>(e?.y>t&&(t=e.y),t),0)}getFreeSlots(){const t=[];let e=this.getMaxY(),n=this.w*(e+1);for(let t=0;tthis.grid[e]=t.index),this.data[t.index]=t,this.h=Math.max(this.h,t.y+t.h),[];{const a=new d(this);t.frame.forEach(t=>a.grid[t]=-1);const i=a.tryMoving(n,e);if(i.length){const e=i.sort((t,e)=>(void 0===t.cost&&(t.cost=t.moves.reduce((t,e)=>t*e.cost,1)),void 0===e.cost&&(e.cost=e.moves.reduce((t,e)=>t*e.cost,1)),t.cost>e.cost)),n=[];return e[0].moves.forEach(t=>{const e={...this.data[t.index]};e.x+=t.x,e.y+=t.y,e.frame=this.getItemFrame(e),this.h=Math.max(this.h,e.y+e.h),this.remove(e),e.frame.forEach(t=>this.grid[t]=e.index),this.data[t.index]=e,n[t.index]={index:e.index,x:e.x,y:e.y}}),t.frame.forEach(e=>this.grid[e]=t.index),this.data[t.index]=t,n}console.error("FATAL","can't arrange item on grid")}}move(t,e,n){if(t.data.place[this.w]?.pinned)return[];if(t.x==e&&t.y==n)return[];let a;this.remove(t),t.x==e?a=n-t.y>0?0:3:t.y==n&&(a=e-t.x>0?1:2);const i=Array.isArray(t.frame)?[...t.frame]:[t.frame],s={...t};s.x=e,s.y=n,s.frame=this.getItemFrame(s);let r=this.getItemsInFrame(s.frame);if(r.some(t=>this.data[t]?.data.place[this.w]?.pinned))return[];let l=r.map(t=>this.data[t]),o=l.map(t=>t.frame).flat();if(!o.some(t=>!s.frame.includes(t))&&!o.some(t=>i.includes(t))){let a=[],s=[];for(let t of i){if(s.includes(t))continue;let e=l.shift();e&&(s=[...s,...this.getItemFrame({...e,...this.getSingleFramePosition(t)})],a[e.index]={index:e.index,...this.getSingleFramePosition(t)})}return a[t.index]={index:t.index,x:e,y:n},a}const d=this.add(s,a);return d[t.index]={index:t.index,x:e,y:n},d}resize(t,e,n){if(t.w==e&&t.h==n)return[];this.remove(t);const a={...t};a.w=e,a.h=n,a.frame=this.getItemFrame(a);const i=this.add(a);return i&&(i[t.index]={index:t.index,w:e,h:n,x:t.x,y:t.y,resize:!0}),i}tryMoving(t,e){if(Array.isArray(t)){t.forEach(t=>this.remove({index:t}));let n=[{grid:this,moves:[]}];return t.forEach(t=>{let a=[];n.forEach(n=>{n.grid.tryMoving(t,e).forEach(t=>{n.moves,t.moves=[...t.moves,...n.moves],a.push(t)})}),n=a}),n}const n=[0,3,1,2];this.remove({index:t});const a=1+.2*(this.data[t].weight||0);return n.reduce((n,i)=>{let s=this.tryMovingInDirection(i,t,1,(e===i?.5:1+.1*i)*a);return s?[...n,...s]:n},[]).filter(t=>t)}tryMovingInDirection(t,e,n,a){const i={index:e,x:0,y:0,cost:a};let s;switch(t){case 0:if(this.data[e].data?.place[this.w]?.pinned||this.data[e].y-n<0)return!1;s=this.data[e].frame.map(t=>t-this.w*n),i.y=-n;break;case 3:if(this.data[e].data?.place[this.w]?.pinned)return!1;this.data[e].y+this.data[e].h+n>this.h&&(a+=.4),s=this.data[e].frame.map(t=>t+this.w*n),i.y=n;break;case 1:if(this.data[e].data?.place[this.w]?.pinned||this.data[e].x-n<0)return!1;s=this.data[e].frame.map(t=>t-n),i.x=-n;break;case 2:if(this.data[e].data?.place[this.w]?.pinned||this.data[e].x+this.data[e].w+n>this.w)return!1;s=this.data[e].frame.map(t=>t+n),i.x=n}const r=this.getItemsInFrame(s);if(r.includes(-1))return this.tryMovingInDirection(t,e,n+1,a);const l=new d(this);if(s.forEach(t=>l.grid[t]=-1),!r.length)return[{grid:l,moves:[i]}];const o=l.tryMoving(r).map(t=>t.moves.unshift(i)&&t);return!!o.length&&o}clearWeights(){this.data.forEach(t=>t.weight=void 0)}getItemsInFrame(t){return t.map(t=>this.grid[t]).filter((t,e,n)=>(t||0===t)&&n.indexOf(t)===e)}remove(t){this.grid=this.grid.map(e=>e!=t.index?e:void 0)}getItemFrame(t){const e=[];for(let n=0;n({x:-1,y:-1,clientX:0,clientY:0,mode:0,grid:null,dragGrid:null,permUpdates:[],positionUpdates:null,fixedPositionUpdates:null,draggedOffset:[0,0],draggedItem:null,draggedNode:null,reorderedItems:[],clonedWidget:null}),inject:{sectionName:{type:String,default:""}},computed:{additionalRowComputed:{get(){return this.additionalRow},set(t){this.$emit("update:additionalRow",t)}},items_hashmap(){let t={};return this.items.forEach(e=>{if(this.reorderedItems.length>0&&this.needsReordering(e)){let t=this.reorderedItems.filter(t=>t.data.widgetid==e.widgetid)?.pop();t&&(e.x=t.x,e.y=t.y)}t[`x${e.x}y${e.y}`]=e}),t},items_placeholders(){let t=[],e=this.cols,n=this.rows,a={};for(let i=0;i({index:e,x:t.x,y:t.y,w:t.w,h:t.h,weight:t.weight||0,data:t}))},prePlacedItems(){return this.fixedPositionUpdates?this.indexedItems.map(t=>this.fixedPositionUpdates[t.index]?{index:t.index,weight:t.weight,data:t.data,x:void 0===this.fixedPositionUpdates[t.index].x?t.x:this.fixedPositionUpdates[t.index].x,y:void 0===this.fixedPositionUpdates[t.index].y?t.y:this.fixedPositionUpdates[t.index].y,w:void 0===this.fixedPositionUpdates[t.index].w?t.w:this.fixedPositionUpdates[t.index].w,h:void 0===this.fixedPositionUpdates[t.index].h?t.h:this.fixedPositionUpdates[t.index].h}:t):this.indexedItems},placedItems(){if(!this.positionUpdates)return this.prePlacedItems;let t=this.prePlacedItems.map(t=>{if(!this.positionUpdates[t.index])return t;let e=this.positionUpdates[t.index]?.h-t.h,n=this.positionUpdates[t.index]?.w-t.w;return{resize:this.positionUpdates[t.index]?.resize,index:t.index,weight:t.weight,data:t.data,x:void 0===this.positionUpdates[t.index].x?t.x:this.positionUpdates[t.index].x,y:void 0===this.positionUpdates[t.index].y?t.y:this.positionUpdates[t.index].y,w:n>0||void 0===this.positionUpdates[t.index].w?t.w:this.positionUpdates[t.index].w,h:e>0||void 0===this.positionUpdates[t.index].h?t.h:this.positionUpdates[t.index].h}}),e=[];return t.forEach(t=>{if(t.resize){let n={...t,w:void 0===this.positionUpdates[t.index].w?t.w:this.positionUpdates[t.index].w,h:void 0===this.positionUpdates[t.index].h?t.h:this.positionUpdates[t.index].h,resizeOverlay:!0,blank:!0};e.push(n)}}),[...t,...e]},showEmptyTileHover(){return!(!this.active||!this.grid||0!=this.mode||this.x<0||this.y<0||this.x>=this.cols||this.y>=this.rows)&&this.grid.isFreeSlot(this.x,this.y)},widgetSetup(){if(this.widgetsSetup)return this.widgetsSetup.reduce((t,e)=>(t[e.widget_id]=e,t),{})}},watch:{active(t){t||this.dragCancel()},cols(){this.dragCancel()},rows:{handler(t){this.$emit("gridHeight",t)},immediate:!0},indexedItems:{handler(t){this.dragCancel();const e=this.createNewGrid(t);this.fixedPositionUpdates=e,e.length&&this.$emit("rearrangeItems",e.filter(t=>t))},immediate:!0,deep:!0}},methods:{needsReordering(t){return!t?.data?.place[this.cols]},toggleDraggedItemOverlay(t){this.draggedNode&&(t?this.draggedNode.firstElementChild.classList.add("dashboard-item-overlay"):this.draggedNode.firstElementChild.classList.remove("dashboard-item-overlay"))},dragging(t){if(1==this.mode){this.toggleDraggedItemOverlay(!0);const t=this.$refs.container.getBoundingClientRect(),e=this.clonedWidget.getBoundingClientRect();let n=this.clientY-20,a=this.clientX-15;const i=0,s=t.height-e.height,r=0,l=t.width-e.width,o=Math.max(i,Math.min(s,n)),d=Math.max(r,Math.min(l,a));this.clonedWidget.style.top=`${o}px`,this.clonedWidget.style.left=`${d}px`}},createNewGrid(t){this.grid=new d(this.cols);const e=[];let n=[...t].sort((t,e)=>this.needsReordering(t)&&this.needsReordering(e)?0:this.needsReordering(t)?999:this.needsReordering(e)?-999:t.weight>e.weight),a=[];return n.forEach(n=>{let i=this.grid.getFreeSlots();if(this.needsReordering(n)){let t=i.shift();t?(n.x=t.x,n.y=t.y):(n.x=0,n.y=this.grid.h),a.push(n)}if(n.x+n.w>this.cols){let t,a=this.cols-n.x;this.resizeLimit&&([a]=this.resizeLimit(n.data,a,n.h)),a<1&&(a=1),a>this.cols&&(a=this.cols),n.x+a>this.cols&&(t=this.cols-a),a==n.w&&(a=void 0),e[n.index]={item:n.data,x:t,w:a}}n.frame=this.grid.getItemFrame(n),this.convertGridResultToUpdate(this.grid.add(n),e,t)}),this.reorderedItems=a,this.grid.clearWeights(),e},convertGridResultToUpdate(t,e,n){t&&(n||(n=this.indexedItems),t.forEach(t=>{let a={item:n[t.index].data};void 0!==t.x&&(a.x=t.x),void 0!==t.y&&(a.y=t.y),void 0!==t.w&&(a.w=t.w),void 0!==t.h&&(a.h=t.h),e[t.index]=a}))},mouseLeave(){},updateCursor(t){if(!this.active)return this.x=this.y=-1,!1;const e=this.active?this.marginForExtraRow:0,n=this.$refs.container.getBoundingClientRect();t.clientX||t.clientY||!t.touches||(t.clientX=t.touches[0].clientX,t.clientY=t.touches[0].clientY),this.clientX=t.clientX-n.left,this.clientY=t.clientY-n.top;const a=Math.floor(this.cols*(t.clientX-n.left)/this.$refs.container.clientWidth),i=Math.floor((this.rows+e)*(t.clientY-n.top)/this.$refs.container.clientHeight);return(this.x!=a||this.y!=i)&&(this.x=a,this.y=i,!0)},_dragStart(t,e){t.dataTransfer&&(t.dataTransfer.setDragImage(t.target,-99999,-99999),t.dataTransfer.dropEffect="move",t.dataTransfer.effectAllowed="move")},startMove(t,e){this.active&&(this.mode=1,this.draggedItem=e,this.$emit("draggedItem",e),setTimeout(()=>{this.draggedNode=t.target.closest(".drop-grid-item");let e=t.target.closest(".drop-grid-item")?.cloneNode(!0);e.style.zIndex=5,e.classList.add("widgetClone"),this.$refs.container.appendChild(e);e.querySelector("[style='display: none;']").style.removeProperty("display"),this.clonedWidget=e},0),this.draggedOffset=[e.x-this.x,e.y-this.y],this._dragStart(t,e))},startResize(t,e){this.active&&(this.mode=2,this.draggedItem=e,this.$emit("draggedItem",e),this._dragStart(t))},dragOver(t){if(this.y+1>this.rows&&(1==this.mode||2==this.mode)&&this.dragCancel(),!this.active)return this.dragCancel();if(this.checkPinnedWidgetAnimation(),2==this.mode&&this.checkWidgetSizeLimitAnimation(),this.updateCursor(t))switch(this.mode){case 1:{t.preventDefault(),this.dragGrid=new d(this.grid);let e=this.x+this.draggedOffset[0],n=this.y+this.draggedOffset[1];e<0?(this.draggedOffset[0]+=e,e=0):e+this.draggedItem.w>this.cols&&(this.draggedOffset[0]+=this.cols-this.draggedItem.w-e,e=this.cols-this.draggedItem.w),n<0&&(this.draggedOffset[1]+=n,n=0),this.positionUpdates=this.dragGrid.move(this.draggedItem,e,n);break}case 2:{t.preventDefault(),this.dragGrid=new d(this.grid);let e=Math.min(this.cols-this.draggedItem.x,Math.max(1,this.x-this.draggedItem.x+1)),n=Math.max(1,this.y-this.draggedItem.y+1);this.resizeLimit&&([e,n]=this.resizeLimit(this.draggedItem.data,e,n)),this.positionUpdates=this.dragGrid.resize(this.draggedItem,e,n);break}}},dragCancel(){this.removeWidgetClones(),this.additionalRowComputed=!1,this.toggleDraggedItemOverlay(!1),this.mode=0,this.positionUpdates=null,this.draggedOffset=[0,0],this.draggedItem=null,this.$emit("draggedItem",null),this.draggedNode=null},dragEnd(){if(this.removeWidgetClones(),this.toggleDraggedItemOverlay(!1),0==this.mode)return;document.getElementById(this.draggedItem.data.widgetid).classList.remove("border-danger"),Array.from(document.getElementsByClassName("denied-dragging-animation"))?.forEach(t=>{t.classList.remove("denied-dragging-animation")}),this.mode=0;let t=[];this.convertGridResultToUpdate(this.positionUpdates,t),t=this._updateFixedPositions(t),t.length&&this.$emit("rearrangeItems",t.filter(t=>t)),this.draggedItem=null,this.draggedNode=null,this.$emit("draggedItem",null)},_updateFixedPositions(t){t.forEach((t,e)=>{this.fixedPositionUpdates[e]?this.fixedPositionUpdates[e]={...this.fixedPositionUpdates[e],...t}:this.fixedPositionUpdates[e]=t});let e=this.createNewGrid(this.prePlacedItems);return e.length?(e.forEach((e,n)=>t[n]=e),this._updateFixedPositions(t)):t},emptyTileClicked(){this.additionalRowComputed=!1,this.$emit("newItem",this.x,this.y)},updateCursorOnMouseMove(t){0==this.mode&&this.updateCursor(t)},checkPinnedWidgetAnimation(){let t=[];switch(this.mode){case 2:for(let e=this.draggedItem.x;e<=this.x;e++)for(let n=this.draggedItem.y;n<=this.y;n++)this.items.forEach(a=>{a.x==e&&a.y==n&&t.push(a)});break;case 1:t=this.items.filter(t=>t.x==this.x&&t.y==this.y)}Array.from(document.getElementsByClassName("denied-dragging-animation"))?.forEach(t=>{t.classList.remove("denied-dragging-animation")}),t.forEach(t=>{if(t.place[this.cols]&&t.place[this.cols].pinned){let e=document.getElementById(t.widgetid).querySelector("[pinned='true']");e.classList.contains("denied-dragging-animation")||e.classList.add("denied-dragging-animation")}})},checkWidgetSizeLimitAnimation(){let t=this.itemsSetup[this.draggedItem.data.widget],e=t.width.max??t.width,n=t.width.min??t.width,a=t.height.max??t.height,i=t.height.min??t.height,s=document.getElementById(this.draggedItem.data.widgetid),r=this.x-this.draggedItem.x+1,l=this.y-this.draggedItem.y+1;r>0&&(r>e||r0&&(l>a||l\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t'};let u={},p={},h=FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/dashboard/Widget";var m={getWidget:t=>u[t],loadWidget:t=>u[t]?Promise.resolve(u[t]):p[t]?p[t]:h?(p[t]=new Promise((e,n)=>{axios.get(h,{params:{id:t}}).then(n=>{u[t]=n.data.retval,p[t]=void 0,e(u[t])}).catch(t=>n(t.response.data.retval.error))}),p[t]):Promise.reject("Widget could not be loaded because there is no path yet!"),setPath(t){h=t}},g={name:"Item",components:{BsModal:s,HeightTransition:{data:()=>({}),methods:{onEnter(t,e){t.style.height="0",t.style.height=t.scrollHeight+"px"},onLeave(t,e){t.style.height=t.scrollHeight+"px",t.style.height="0"}},template:'\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t'}},data:()=>({component:"",arguments:null,target:!1,widget:null,tmpConfig:{},isLoading:!1,hasConfig:!1,sharedData:null}),emits:["change","remove","dragstart","resizestart","configOpened","configClosed","pinItem","unPinItem"],props:["id","widgetID","config","width","height","custom","hidden","editMode","loading","item_data","place","setup","dragstate","resizeOverlay","additionalRow"],computed:{maxHeight(){return this.setup?.height?.max},maxWidth(){return"[object Number]"==Object.prototype.toString.call(this.setup?.width)?this.setup?.width:this.setup?.width?.max},minHeight(){return this.setup?.height?.min},minWidth(){return this.setup?.width?.min},isResizeable(){return this.maxWidth>1||this.maxHeight>1},isPinned(){return!!this.place?.pinned},ready(){return this.component&&null!==this.arguments}},methods:{unpin(){if(!this.editMode)return;let t={item:this.item_data,x:this.item_data.x,y:this.item_data.y};this.$emit("unPinItem",[t])},pinItem(){let t={item:this.item_data,x:this.item_data.x,y:this.item_data.y};this.$emit("pinItem",[t])},getWidgetC4Link:t=>FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+t.setup.cis4link,handleShowBsModal(){this.$emit("configOpened")},handleHideBsModal(){this.$emit("configClosed")},mouseDown(t){this.target=t.target},startDrag(t){this.$refs.dragHandle.contains(this.target)?this.$emit("dragstart",t):this.isResizeable&&this.$refs.resizeHandle.contains(this.target)&&this.isResizeable?this.$emit("resizestart",t):t.preventDefault()},openConfig(){this.tmpConfig={...this.arguments},this.$refs.config.show()},setConfig(t){this.hasConfig=t},changeConfig(){this.isLoading=!0;let t={...this.tmpConfig};this.sendChangeConfig(t)},changeConfigManually(){let t={...this.arguments};this.sendChangeConfig(t)},sendChangeConfig(t){for(var e in t)this.widget.arguments[e]==t[e]&&delete t[e];this.$emit("change",t)}},watch:{config(){this.arguments={...this.widget?.arguments,...this.config},this.tmpConfig={...this.arguments},this.$refs.config&&this.$refs.config.hide(),this.isLoading=!1}},async created(){this.widget=await m.loadWidget(this.id);let t=(await import(this.widget.setup.file)).default;this.$options.components["widget"+this.widget.widget_id]=t,this.component="widget"+this.widget.widget_id,this.arguments={...this.widget.arguments,...this.config},this.tmpConfig={...this.arguments}},template:'\n\t
    \n\t\t
    \n\t\t\t\n\t\t
    \n\t
    \n\t
    \n\t
    \n\t\t
    \n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t{{ widget.setup.name }}\n\t\t\t\n\t\t\t\n\t\t\t\n \t\t\n \t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t\t
    \n\t\t\t\n\t\t
    \n\t\t
    \n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\n\t\t
    \n\t
    '},f={data:()=>({}),props:{widget:{type:Object,required:!0}},methods:{path:t=>"/"==t[0]?FHC_JS_DATA_STORAGE_OBJECT.app_root+t:t},emits:["select"],template:'\n\t
    \n\t\t\n\t\t
    \n\t\t\t
    {{ widget.setup.name || widget.widget_kurzbz }}
    \n\t\t\t

    {{ widget.beschreibung }}

    \n\t\t
    \n\t
    '},b={name:"Section",components:{DropGrid:c,DashboardItem:g,WidgetIcon:f},inject:{widgetsSetup:{type:Array,default:[]},adminMode:{type:Boolean,default:!1},editMode:{type:Boolean,default:!1}},props:["name","widgets"],emits:["widgetAdd","widgetUpdate","widgetRemove"],data:()=>({configOpened:!1,gridWidth:1,gridHeight:null,draggedItem:null,additionalRow:!1}),provide(){return{editModeIsActive:Vue.computed(()=>this.editModeIsActive),sectionName:Vue.computed(()=>this.name)}},computed:{computedWidgetsSetup(){return this.widgetsSetup?this.widgetsSetup.reduce((t,e)=>(t[e.widget_id]=e.setup,t),{}):{}},editModeIsActive(){return(this.editMode||this.adminMode)&&!this.configOpened},getSectionStyle:()=>"margin-bottom: 8px;",items(){return this.widgets.map(t=>(!t?.widgetid&&t?.id&&(t.widgetid=t.id),{...t,reorder:!1,...t.place[this.gridWidth]||{reorder:!0,x:0,y:0,w:1,h:1}}))}},methods:{sectionNameTranslation(){switch(this.name){case"general":case"custom":return this.$p.t("dashboard",this.name);default:return this.name}},showSectionInformation(){return"general"==this.name?this.$p.t("dashboard","dashboardGeneralSectionDescription"):"custom"==this.name?this.$p.t("dashboard","dashboardCustomSectionDescription"):this.$p.t("dashboard","dashboardSectionDescription",[this.name])},handleConfigOpened(){this.configOpened=!0},handleConfigClosed(){this.configOpened=!1},checkResizeLimit(t,e,n){let a=m.getWidget(t.widget);if(a){let t=a.setup.width;t.max?t.min=t.min||1:t={min:t,max:t},et.max&&(e=t.max);let i=a.setup.height;i.max?i.min=i.min||1:i={min:i,max:i},ni.max&&(n=i.max)}return[e,n]},removeWidget(t,e){if(t.custom)l.popup("Are you sure you want to delete this widget?").then(()=>this.$emit("widgetRemove",this.name,t.id));else{let n={};n[t.id]={hidden:!e},this.updatePreset(n)}},saveConfig(t,e){let n={};n[e.id]={config:t},this.updatePreset(n)},updatePositions(t,e=!1){let n={};t.forEach(t=>{let a={...t.item};a.placeholder||(a.place[this.gridWidth]||(a.place[this.gridWidth]={x:0,y:0,w:1,h:1}),delete a.x,delete a.y,delete a.w,delete a.h,delete a.place[this.gridWidth].pinned,void 0!==t.x&&(a.place[this.gridWidth].x=t.x),void 0!==t.y&&(a.place[this.gridWidth].y=t.y),void 0!==t.w&&(a.place[this.gridWidth].w=t.w),void 0!==t.h&&(a.place[this.gridWidth].h=t.h),e&&(a.place[this.gridWidth].pinned=!0),n[a.id]=a)}),this.updatePreset(n)},updatePreset(t){let e={};e[this.name]=t,this.$emit("widgetUpdate",this.name,e)}},mounted(){let t=this,e=t.$refs.container;t.gridWidth=parseInt(window.getComputedStyle(e).getPropertyValue("--fhc-dashboard-grid-size")),window.addEventListener("resize",()=>{t.gridWidth=parseInt(window.getComputedStyle(e).getPropertyValue("--fhc-dashboard-grid-size"))})},template:'\n\t
    \n\t\t

    \n\t\t\t\n\t\t\t{{sectionNameTranslation()}}:\n\t\t

    \n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t
    '},v={components:{BsModal:s,WidgetIcon:f},props:["widgets"],data:()=>({callbacks:{}}),methods:{getWidget(){return new Promise((t,e)=>{this.callbacks={resolve:t,reject:e},this.$refs.modal.show()})},close(){this.callbacks.reject&&this.callbacks.reject(),this.callbacks={}},pick(t){this.callbacks.resolve&&this.callbacks.resolve(t),this.callbacks={},this.$refs.modal.hide()}},template:'
    \n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t
    '},y={mergeDeep(...t){const e=t=>t&&"object"==typeof t;return t.reduce((t,n)=>(Object.keys(n).forEach(a=>{const i=t[a],s=n[a];Array.isArray(i)&&Array.isArray(s)?t[a]=i.concat(...s):e(i)&&e(s)?t[a]=this.mergeDeep(i,s):t[a]=s}),t),{})}},w={getViewData:()=>({method:"get",url:"/api/frontend/v1/Cis4FhcApi/getViewData"})},k={name:"Dashboard",components:{DashboardSection:b,DashboardWidgetPicker:v},props:{dashboard:{type:String,required:!0,default:"CIS"},viewData:{type:Object,required:!0,validator:t=>t&&t.name&&t.uid&&t.timezone}},data(){return{sections:[],widgets:null,editMode:!1,viewDataInternal:this.viewData}},provide(){return{editMode:Vue.computed(()=>this.editMode),widgetsSetup:Vue.computed(()=>this.widgets),timezone:Vue.computed(()=>this.viewData.timezone)}},computed:{apiurl:()=>FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/dashboard"},methods:{widgetAdd(t,e){null===this.widgets&&axios.get(this.apiurl+"/Widget/getWidgetsForDashboard",{params:{db:this.dashboard}}).then(t=>{t.data.retval.forEach(t=>{t.arguments=JSON.parse(t.arguments),t.setup=JSON.parse(t.setup)}),this.widgets=t.data.retval}).catch(t=>console.error("ERROR:",t)),this.$refs.widgetpicker.getWidget().then(n=>{e.widget=n,e.id="loading_"+String((new Date).valueOf());let a={...e};a.loading=!0,this.sections.forEach(e=>{e.name==t&&e.widgets.push(a)}),axios.post(this.apiurl+"/Config/addWidgetsToUserOverride",{db:this.dashboard,funktion_kurzbz:t,widgets:[e]}).then(n=>{let i=Object.keys(n.data.retval.data[t].widgets).pop();e.id=i,this.sections.forEach(n=>{n.name==t&&(n.widgets.splice(n.widgets.indexOf(a),1),n.widgets.push(e))})}).catch(t=>{console.error("ERROR: ",t),alert("ERROR: "+t.response.data.retval)})}).catch(()=>{})},widgetUpdate(t,e){for(var n in e=e[t]){for(var a in this.sections)if(this.sections[a].name==t){for(var i in this.sections[a].widgets)if(this.sections[a].widgets[i].id==n){for(var s in e[n]=y.mergeDeep(this.sections[a].widgets[i],e[n]),{_x:1,_y:1,_w:1,_h:1,index:1,id:1,preset:1})e[n][s]&&delete e[n][s];break}break}e[n].widgetid=n}axios.post(this.apiurl+"/Config/addWidgetsToUserOverride",{db:this.dashboard,funktion_kurzbz:t,widgets:e}).then(()=>{this.sections.forEach(n=>{n.name==t&&n.widgets.forEach((t,a)=>{e[t.id]&&(e[t.id].id=t.id,e[t.id].index=t.index,n.widgets[a]=e[t.id])})})}).catch(t=>{console.error("ERROR: ",t),alert("ERROR: "+t.response.data.retval)})},widgetRemove(t,e){axios.post(this.apiurl+"/Config/removeWidgetFromUserOverride",{db:this.dashboard,funktion_kurzbz:t,widgetid:e}).then(()=>{this.sections.forEach(n=>{n.name==t&&(n.widgets=n.widgets.filter(t=>t.id!=e))})}).catch(t=>{console.error("ERROR: ",t),alert("ERROR: "+t.response.data.retval)})}},created(){this.$p.loadCategory("dashboard"),axios.get(this.apiurl+"/Widget/getWidgetsForDashboard",{params:{db:this.dashboard}}).then(t=>{this.widgets=t.data.retval}).catch(t=>console.error("ERROR:",t)),axios.get(this.apiurl+"/Config",{params:{db:this.dashboard}}).then(t=>{for(var e in t.data.retval){let a=[],i=[];for(var n in t.data.retval[e].widgets)t.data.retval[e].widgets[n].id=n,t.data.retval[e].widgets[n].custom||t.data.retval[e].widgets[n].preset?a.push(t.data.retval[e].widgets[n]):i.push(n);this.sections.push({name:e,widgets:a}),i.forEach(t=>this.widgetRemove(e,t))}this.sections=this.sections.sort((t,e)=>"custom"==t.name?1:"custom"==e.name?-1:e.widgets.length-t.widgets.length)}).catch(t=>console.error("ERROR:",t))},async beforeMount(){if(!this.viewData.name||!this.viewData.uid){const t=await this.$api.call(w.getViewData());this.viewDataInternal=t.data}},template:'\n\t
    \n\t\t

    \n\t\t\t{{ $p.t(\'global/personalGreeting\', [ viewDataInternal?.name ]) }}\n\t\t\t\n\t\t

    \n\t\t\n\t\t\n\t
    '},_={search(t,e){return this.$fhcApi.post("/api/frontend/v1/searchbar/search",t,e)},searchAdvanced(t,e){return this.$fhcApi.post("/api/frontend/v1/searchbar/searchAdvanced",t,e)},searchdummy(t){return this.$fhcApi.post("public/js/apps/api/dummyapi.php/Search",t)}},x={loadCategory(t){return this.$fhcApi.get("/api/frontend/v1/phrasen/loadModule/"+t)},setLanguage(t,e){const n={categories:t,language:e};return this.$fhcApi.post("/api/frontend/v1/phrasen/setLanguage",n)},getLanguage(){return this.$fhcApi.get("/api/frontend/v1/phrasen/getLanguage",{})},getActiveDbLanguages(){return this.$fhcApi.get("/api/frontend/v1/phrasen/getAllLanguages",{})}},A={getHeader(t){return this.$fhcApi.get("/api/frontend/v1/navigation/header",{navigation_page:t})},getMenu:function(t){return this.$fhcApi.get("/api/frontend/v1/navigation/menu",{navigation_page:t})}},$={saveCustomFilter(t){return this.$fhcApi.post("/api/frontend/v1/filter/saveCustomFilter",{filterUniqueId:t.filterUniqueId,filterType:t.filterType,customFilterName:t.customFilterName})},removeCustomFilter(t){return this.$fhcApi.post("/api/frontend/v1/filter/removeCustomFilter",{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterId:t.filterId})},applyFilterFields(t){return this.$fhcApi.post("/api/frontend/v1/filter/applyFilterFields",{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterFields:t.filterFields})},addFilterField(t){return this.$fhcApi.post("/api/frontend/v1/filter/addFilterField",{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterField:t.filterField})},removeFilterField(t){return this.$fhcApi.post("/api/frontend/v1/filter/removeFilterField",{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterField:t.filterField})},getFilterById(t){return this.$fhcApi.get("/api/frontend/v1/filter/getFilter",{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterId:t.filterId})},getFilter(t){return this.$fhcApi.get("/api/frontend/v1/filter/getFilter",{filterUniqueId:t.filterUniqueId,filterType:t.filterType})}},S={abmeldung:{getDetails(t,e){const n="/api/frontend/v1/studstatus/abmeldung/"+(void 0!==t?"getDetailsForAntrag/"+t:"getDetailsForNewAntrag/"+e);return this.$fhcApi.get(n)},create(t,e,n){return this.$fhcApi.post("/api/frontend/v1/studstatus/abmeldung/createAntrag",{studiensemester:t,prestudent_id:e,grund:n},{errorHandling:"strict"})},cancel(t){return Array.isArray(t)?Promise.allSettled(t.map(t=>this.$fhcApi.post("/api/frontend/v1/studstatus/abmeldung/cancelAntrag",{antrag_id:t.studierendenantrag_id},{errorHeader:"#"+t.studierendenantrag_id}))):this.$fhcApi.post("/api/frontend/v1/studstatus/abmeldung/cancelAntrag",{antrag_id:t})}},unterbrechung:{getDetails(t,e){const n="/api/frontend/v1/studstatus/unterbrechung/"+(void 0!==t?"getDetailsForAntrag/"+t:"getDetailsForNewAntrag/"+e);return this.$fhcApi.get(n)},create(t,e,n,a,i){return this.$fhcApi.post("/api/frontend/v1/studstatus/unterbrechung/createAntrag",{studiensemester:t,prestudent_id:e,grund:n,datum_wiedereinstieg:a,attachment:i},{errorHandling:"strict"})},cancel(t){return this.$fhcApi.post("/api/frontend/v1/studstatus/unterbrechung/cancelAntrag",{antrag_id:t},{errorHandling:"strict"})}},wiederholung:{getDetails(t){const e="/api/frontend/v1/studstatus/wiederholung/getDetailsForNewAntrag/"+t;return this.$fhcApi.get(e)},getLvs(t){const e="/api/frontend/v1/studstatus/wiederholung/getLvs/"+t;return this.$fhcApi.get(e)},create(t,e){return this.$fhcApi.post("/api/frontend/v1/studstatus/wiederholung/createAntrag",{prestudent_id:t,studiensemester:e},{errorHandling:"strict"})},cancel(t,e){return this.$fhcApi.post("/api/frontend/v1/studstatus/wiederholung/cancelAntrag",{prestudent_id:t,studiensemester:e},{errorHandling:"strict"})},saveLvs(t,e){return this.$fhcApi.post("/api/frontend/v1/studstatus/wiederholung/saveLvs",{forbiddenLvs:t,mandatoryLvs:e})}},leitung:{getStgs(){return this.$fhcApi.get("/api/frontend/v1/studstatus/leitung/getActiveStgs")},getAntraege(t,e,n){return this.$fhcApi.get("/api/frontend/v1/studstatus/leitung/getAntraege/"+t).then(t=>t.data)},getHistory(t){return this.$fhcApi.get("/api/frontend/v1/studstatus/leitung/getHistory/"+t)},getPrestudents(t,e){return this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/getPrestudents",{query:t},{signal:e,timeout:3e4})},approve(t){return Array.isArray(t)?Promise.allSettled(t.map(t=>this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/approveAntrag",t,{errorHeader:"#"+t.studierendenantrag_id}))):this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/approveAntrag",t)},reject(t){return Array.isArray(t)?Promise.allSettled(t.map(t=>this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/rejectAntrag",t,{errorHeader:"#"+t.studierendenantrag_id}))):this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/rejectAntrag",t)},reopen(t){return Array.isArray(t)?Promise.allSettled(t.map(t=>this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/reopenAntrag",t,{errorHeader:"#"+t.studierendenantrag_id}))):this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/reopenAntrag",t)},pause(t){return Array.isArray(t)?Promise.allSettled(t.map(t=>this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/pauseAntrag",t,{errorHeader:"#"+t.studierendenantrag_id}))):this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/pauseAntrag",t)},unpause(t){return Array.isArray(t)?Promise.allSettled(t.map(t=>this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/unpauseAntrag",t,{errorHeader:"#"+t.studierendenantrag_id}))):this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/unpauseAntrag",t)},object(t){return Array.isArray(t)?Promise.allSettled(t.map(t=>this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/objectAntrag",t,{errorHeader:"#"+t.studierendenantrag_id}))):this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/objectAntrag",t)},approveObjection(t){return Array.isArray(t)?Promise.allSettled(t.map(t=>this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/approveObjection",t,{errorHeader:"#"+t.studierendenantrag_id}))):this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/approveObjection",t)},denyObjection(t){return Array.isArray(t)?Promise.allSettled(t.map(t=>this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/denyObjection",t,{errorHeader:"#"+t.studierendenantrag_id}))):this.$fhcApi.post("/api/frontend/v1/studstatus/leitung/denyObjection",t)}}},T={getView:function(t){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+`/api/frontend/v1/Profil/getView/${t}`,{})},fotoSperre:function(t){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+`/api/frontend/v1/Profil/fotoSperre/${t}`,{})},isStudent:function(t){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/Profil/isStudent",{uid:t})},isMitarbeiter:function(t){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+`/api/frontend/v1/Profil/isMitarbeiter/${t}`,{})},getZustellAdresse:function(){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/Profil/getZustellAdresse",{})},getZustellKontakt:function(){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/Profil/getZustellKontakt",{})},getGemeinden:function(t,e){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+`/api/frontend/v1/Profil/getGemeinden/${t}/${e}`,{})},getAllNationen:function(){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/Profil/getAllNationen",{})}},z={ //! API calls for profil update requests -getStatus:function(){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/getStatus",{})},getTopic:function(){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/getTopic",{})},acceptProfilRequest:function({profil_update_id:t,uid:e,status_message:n,topic:a,requested_change:i}){return this.$fhcApi.post(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/acceptProfilRequest",{profil_update_id:t,uid:e,status_message:n,topic:a,requested_change:i})},denyProfilRequest:function({profil_update_id:t,uid:e,topic:n,status_message:a}){return this.$fhcApi.post(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/denyProfilRequest",{profil_update_id:t,uid:e,topic:n,status_message:a})},insertFile:function(t,e=null){return this.$fhcApi.post(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+`/api/frontend/v1/ProfilUpdate/insertFile/${e}`,t)},getProfilRequestFiles:function(t){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+`/api/frontend/v1/ProfilUpdate/getProfilRequestFiles/${t}`,{})},selectProfilRequest:function(t=null,e=null){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/selectProfilRequest",{...t?{uid:t}:{},...e?{id:e}:{}})},insertProfilRequest:function(t,e,n=null){return this.$fhcApi.post(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/insertProfilRequest",{topic:t,payload:e,...n?{fileID:n}:{}})},updateProfilRequest:function(t,e,n,a=null){return this.$fhcApi.post(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/updateProfilRequest",{topic:t,payload:e,ID:n,...a?{fileID:a}:{}})},deleteProfilRequest:function(t){return this.$fhcApi.post(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/deleteProfilRequest",{requestID:t})}},D={getRoomInfo(t,e,n){return this.$fhcApi.post("/api/frontend/v1/LvPlan/getRoomplan",{ort_kurzbz:t,start_date:e,end_date:n})},getStunden(){return this.$fhcApi.get("/api/frontend/v1/LvPlan/Stunden",{})},getOrtReservierungen(t,e,n){return this.$fhcApi.post(`/api/frontend/v1/LvPlan/getReservierungen/${t}`,{start_date:e,end_date:n})},getLvPlanReservierungen(t,e){return this.$fhcApi.post("/api/frontend/v1/LvPlan/getReservierungen",{start_date:t,end_date:e})},getLehreinheitStudiensemester(t){return this.$fhcApi.get(`/api/frontend/v1/LvPlan/getLehreinheitStudiensemester/${t}`,{})},studiensemesterDateInterval(t){return this.$fhcApi.get(`/api/frontend/v1/LvPlan/studiensemesterDateInterval/${t}`,{})},LvPlanEvents(t,e,n){return this.$fhcApi.get("/api/frontend/v1/LvPlan/LvPlanEvents",{start_date:t,end_date:e,lv_id:n})}},E={verband:{get(){return this.$fhcApi.get("api/frontend/v1/stv/verband")},favorites:{get(){return this.$fhcApi.get("api/frontend/v1/stv/favorites")},set(t){return this.$fhcApi.post("api/frontend/v1/stv/favorites/set",{favorites:t})}}},students:{uid(t,e){let n="api/frontend/v1/stv/students/"+encodeURIComponent(e)+"/uid/"+encodeURIComponent(t);return this.$fhcApi.getUri(n)},prestudent(t,e){let n="api/frontend/v1/stv/students/"+encodeURIComponent(e)+"/prestudent/"+encodeURIComponent(t);return this.$fhcApi.getUri(n)},person(t,e){let n="api/frontend/v1/stv/students/"+encodeURIComponent(e)+"/person/"+encodeURIComponent(t);return this.$fhcApi.getUri(n)},verband(t){return this.$fhcApi.getUri("api/frontend/v1/stv/students/"+t)}},filter:{getStg(){return this.$fhcApi.get("api/frontend/v1/stv/filter/getStg")},setStg(t){return this.$fhcApi.post("api/frontend/v1/stv/filter/setStg",{studiengang_kz:t})}},konto:{tabulatorConfig(t,e){return t.ajaxURL="api/frontend/v1/stv/konto/get",t.ajaxParams=()=>({person_id:e.modelValue.person_id||e.modelValue.map(t=>t.person_id),only_open:e.filter,studiengang_kz:e.studiengang_kz_intern?e.stg_kz:""}),t.ajaxRequestFunc=(t,e,n)=>this.$fhcApi.post(t,n,e),t.ajaxResponse=(t,e,n)=>n.data,t},checkDoubles(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/konto/checkDoubles",e,{confirmErrorHandler:t=>!0})},insert(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/konto/insert",e)},counter(t){return this.$fhcApi.post("api/frontend/v1/stv/konto/counter",t)},edit(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/konto/update",e)},delete(t){return this.$fhcApi.post("api/frontend/v1/stv/konto/delete",{buchungsnr:t})},getBuchungstypen(){return this.$fhcApi.get("api/frontend/v1/stv/konto/getBuchungstypen")}},group:{getGruppen(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/Gruppen/getGruppen/"+n.id)},deleteGroup(t){return this.$fhcApi.post("api/frontend/v1/stv/Gruppen/deleteGruppe/",t)}},kontakt:{getAdressen(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getAdressen/"+n.id)},addNewAddress(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/stv/kontakt/addNewAddress/"+e,n)},loadAddress(t){return this.$fhcApi.post("api/frontend/v1/stv/kontakt/loadAddress/",{address_id:t})},updateAddress(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/stv/kontakt/updateAddress/"+e,n)},deleteAddress(t){return this.$fhcApi.post("api/frontend/v1/stv/kontakt/deleteAddress/",{address_id:t})},getPlaces(t){return this.$fhcApi.get("api/frontend/v1/stv/address/getPlaces/"+t)},getFirmen(t){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getFirmen/"+t)},getNations(){return this.$fhcApi.get("api/frontend/v1/stv/address/getNations/")},getAdressentypen(){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getAdressentypen/")},getBankverbindung(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getBankverbindung/"+n.id)},addNewBankverbindung(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/stv/kontakt/addNewBankverbindung/"+e,n)},loadBankverbindung(t){return this.$fhcApi.post("api/frontend/v1/stv/kontakt/loadBankverbindung/",{bankverbindung_id:t})},updateBankverbindung(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/stv/kontakt/updateBankverbindung/"+e,n)},deleteBankverbindung(t){return this.$fhcApi.post("api/frontend/v1/stv/kontakt/deleteBankverbindung/",{bankverbindung_id:t})},getKontakte(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getKontakte/"+n.id)},addNewContact(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/stv/kontakt/addNewContact/"+e,n)},loadContact(t){return this.$fhcApi.post("api/frontend/v1/stv/kontakt/loadContact/",{kontakt_id:t})},updateContact(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/stv/kontakt/updateContact/"+e,n)},deleteContact(t){return this.$fhcApi.post("api/frontend/v1/stv/kontakt/deleteContact/",{kontakt_id:t})},getStandorteByFirma(t){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getStandorteByFirma/"+t)},getKontakttypen(){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getKontakttypen/")}},prestudent:{get(t,e){return this.$fhcApi.post("api/frontend/v1/stv/prestudent/get/"+encodeURIComponent(t)+"/"+encodeURIComponent(e))},updatePrestudent(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/stv/prestudent/updatePrestudent/"+e,n)},getBezeichnungZGV(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getBezeichnungZGV/")},getBezeichnungMZgv(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getBezeichnungMZgv/")},getBezeichnungDZgv(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getBezeichnungDZgv/")},getStgs(){return this.$fhcApi.get("api/frontend/v1/stv/lists/getStgs/")},getAusbildung(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getAusbildung/")},getAufmerksamdurch(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getAufmerksamdurch/")},getBerufstaetigkeit(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getBerufstaetigkeit/")},getTypenStg(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getTypenStg/")},getBisstandort(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getBisstandort/")},getHistoryPrestudent(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/status/getHistoryPrestudent/"+n.id)},getMaxSem(t){return this.$fhcApi.post("api/frontend/v1/stv/status/getMaxSemester/",{studiengang_kzs:t})},advanceStatus({prestudent_id:t,status_kurzbz:e,studiensemester_kurzbz:n,ausbildungssemester:a}){return this.$fhcApi.post("api/frontend/v1/stv/status/advanceStatus/"+t+"/"+e+"/"+n+"/"+a)},confirmStatus({prestudent_id:t,status_kurzbz:e,studiensemester_kurzbz:n,ausbildungssemester:a}){return this.$fhcApi.post("api/frontend/v1/stv/status/confirmStatus/"+t+"/"+e+"/"+n+"/"+a)},isLastStatus(t){return this.$fhcApi.get("api/frontend/v1/stv/status/isLastStatus/"+t)},deleteStatus({prestudent_id:t,status_kurzbz:e,studiensemester_kurzbz:n,ausbildungssemester:a}){return this.$fhcApi.post("api/frontend/v1/stv/status/deleteStatus/"+t+"/"+e+"/"+n+"/"+a)},getLastBismeldestichtag(){return this.$fhcApi.get("api/frontend/v1/stv/status/getLastBismeldestichtag/")},getHistoryPrestudents(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getHistoryPrestudents/"+n.id)}},status:{insertStatus(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/stv/status/insertStatus/"+e,n)},loadStatus({prestudent_id:t,status_kurzbz:e,studiensemester_kurzbz:n,ausbildungssemester:a}){return this.$fhcApi.post("api/frontend/v1/stv/status/loadStatus/"+t+"/"+e+"/"+n+"/"+a)},updateStatus(t,{prestudent_id:e,status_kurzbz:n,studiensemester_kurzbz:a,ausbildungssemester:i},s){return this.$fhcApi.post(t,"api/frontend/v1/stv/status/updateStatus/"+e+"/"+n+"/"+a+"/"+i,s)},getStudienplaene(t){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getStudienplaene/"+t)},getStudiengang(t){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getStudiengang/"+t)},getStatusgruende(){return this.$fhcApi.get("api/frontend/v1/stv/status/getStatusgruende/")},getStati(){return this.$fhcApi.get("api/frontend/v1/stv/lists/getStati/")},addStudent(t,e){return this.$fhcApi.post("api/frontend/v1/stv/status/addStudent/"+t,e,{errorHeader:t})},changeStatus(t,e){return this.$fhcApi.post("api/frontend/v1/stv/status/changeStatus/"+t,e,{errorHeader:t})},getStatusarray(){return this.$fhcApi.get("api/frontend/v1/stv/status/getStatusarray/")}},details:{get(t,e){let n="api/frontend/v1/stv/student/get/"+encodeURIComponent(t)+"/"+encodeURIComponent(e);return this.$fhcApi.post(n)},save(t,e,n,a){let i="api/frontend/v1/stv/student/save/"+encodeURIComponent(e)+"/"+encodeURIComponent(n);return this.$fhcApi.post(t,i,a)}},exam:{getPruefungen(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/getPruefungen/"+n.id)},loadPruefung(t){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/loadPruefung/"+t)},getTypenPruefungen(){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/getTypenPruefungen")},getAllLehreinheiten(t){return this.$fhcApi.post("api/frontend/v1/stv/pruefung/getAllLehreinheiten/",t)},getLvsByStudent(t){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/getLvsByStudent/"+t)},getLvsandLesByStudent(t,e){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/getLvsandLesByStudent/"+t+"/"+e)},getLvsAndMas(t){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/getLvsAndMas/"+t)},getMitarbeiterLv(t){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/getMitarbeiterLv/"+t)},getNoten(){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/getNoten")},checkZeugnisnoteLv(t){return this.$fhcApi.post("api/frontend/v1/stv/pruefung/checkZeugnisnoteLv/",t)},addPruefung(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/pruefung/insertPruefung/",e)},updatePruefung(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/stv/pruefung/updatePruefung/"+e,n)},deletePruefung(t){return this.$fhcApi.post("api/frontend/v1/stv/pruefung/deletePruefung/"+t)}},abschlusspruefung:{getAbschlusspruefung(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/abschlusspruefung/getAbschlusspruefung/"+n.id)},addNewAbschlusspruefung(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/abschlusspruefung/insertAbschlusspruefung/",e)},loadAbschlusspruefung(t){return this.$fhcApi.post("api/frontend/v1/stv/abschlusspruefung/loadAbschlusspruefung/",{id:t})},updateAbschlusspruefung(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/abschlusspruefung/updateAbschlusspruefung/",e)},deleteAbschlusspruefung(t){return this.$fhcApi.post("api/frontend/v1/stv/abschlusspruefung/deleteAbschlusspruefung/",{id:t})},getTypenAbschlusspruefung(){return this.$fhcApi.get("api/frontend/v1/stv/abschlusspruefung/getTypenAbschlusspruefung/")},getTypenAntritte(){return this.$fhcApi.get("api/frontend/v1/stv/abschlusspruefung/getTypenAntritte/")},getBeurteilungen(){return this.$fhcApi.get("api/frontend/v1/stv/abschlusspruefung/getBeurteilungen/")},getAkadGrade(t){return this.$fhcApi.post("api/frontend/v1/stv/abschlusspruefung/getAkadGrade/",{studiengang_kz:t})},getTypStudiengang(t){return this.$fhcApi.post("api/frontend/v1/stv/abschlusspruefung/getTypStudiengang/",{studiengang_kz:t})},getMitarbeiter(t){return this.$fhcApi.get("api/frontend/v1/stv/abschlusspruefung/getMitarbeiter/"+t)},getPruefer(t){return this.$fhcApi.get("api/frontend/v1/stv/abschlusspruefung/getPruefer/"+t)},getNoten(){return this.$fhcApi.get("api/frontend/v1/stv/abschlusspruefung/getNoten/")},checkForExistingExams(t){return this.$fhcApi.post("api/frontend/v1/stv/abschlusspruefung/checkForExistingExams/",{uids:t})}},grades:{list(){return this.$fhcApi.get("api/frontend/v1/stv/grades/list")},getCertificate(t,e){let n="api/frontend/v1/stv/grades/getCertificate/"+encodeURIComponent(t);return e&&(n=n+"/"+encodeURIComponent(e)),this.$fhcApi.get(n)},getTeacherProposal(t,e){let n="api/frontend/v1/stv/grades/getTeacherProposal/"+encodeURIComponent(t);return e&&(n=n+"/"+encodeURIComponent(e)),this.$fhcApi.get(n)},getRepeaterGrades(t,e){let n="api/frontend/v1/stv/grades/getRepeaterGrades/"+encodeURIComponent(t);return e&&(n=n+"/"+encodeURIComponent(e)),this.$fhcApi.get(n)},updateCertificate({lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:n,note:a,lehrveranstaltung_bezeichnung:i}){return this.$fhcApi.post("api/frontend/v1/stv/grades/updateCertificate",{lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:n,note:a},{errorHeader:i})},deleteCertificate({lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:n,lehrveranstaltung_bezeichnung:a}){return this.$fhcApi.post("api/frontend/v1/stv/grades/deleteCertificate",{lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:n},{errorHeader:a})},copyTeacherProposalToCertificate({lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:n,lehrveranstaltung_bezeichnung:a}){return this.$fhcApi.post("api/frontend/v1/stv/grades/copyTeacherProposalToCertificate",{lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:n},{errorHeader:a})},copyRepeaterGradeToCertificate({studierendenantrag_lehrveranstaltung_id:t,lv_bezeichnung:e}){return this.$fhcApi.post("api/frontend/v1/stv/grades/copyRepeaterGradeToCertificate",{studierendenantrag_lehrveranstaltung_id:t},{errorHeader:e})},getGradeFromPoints(t,e,n,a){const i=a?{errorHandling:!1}:{};return this.$fhcApi.post("api/frontend/v1/stv/grades/getGradeFromPoints",{points:t,lehrveranstaltung_id:e,studiensemester_kurzbz:n},i)}},mobility:{getMobilitaeten(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getMobilitaeten/"+n.id)},getProgramsMobility(){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getProgramsMobility/")},addNewMobility(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/mobility/insertMobility/",e)},loadMobility(t){return this.$fhcApi.get("api/frontend/v1/stv/mobility/loadMobility/"+t)},updateMobility(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/mobility/updateMobility/",e)},deleteMobility(t){return this.$fhcApi.post("api/frontend/v1/stv/mobility/deleteMobility/"+t)},getLVList(t){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getLVList/"+t)},getAllLehreinheiten(t){return this.$fhcApi.post("api/frontend/v1/stv/mobility/getAllLehreinheiten/",t)},getLvsandLesByStudent(t){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getLvsandLesByStudent/"+t)},getPurposes(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getPurposes/"+n.id)},getSupports(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getSupports/"+n.id)},getListPurposes(){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getListPurposes/")},getListSupports(){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getListSupports/")},deleteMobilityPurpose(t){return this.$fhcApi.post("api/frontend/v1/stv/mobility/deleteMobilityPurpose/"+t.bisio_id,t)},addMobilityPurpose(t){return this.$fhcApi.post("api/frontend/v1/stv/mobility/addMobilityPurpose/"+t.bisio_id,t)},deleteMobilitySupport(t){return this.$fhcApi.post("api/frontend/v1/stv/mobility/deleteMobilitySupport/"+t.bisio_id,t)},addMobilitySupport(t){return this.$fhcApi.post("api/frontend/v1/stv/mobility/addMobilitySupport/"+t.bisio_id,t)}},archiv:{tabulatorConfig(t,e){return t.ajaxURL="api/frontend/v1/stv/archiv/get",t.ajaxParams=()=>({person_id:e.modelValue.person_id||e.modelValue.map(t=>t.person_id)}),t.ajaxRequestFunc=(t,e,n)=>this.$fhcApi.post(t,n,e),t.ajaxResponse=(t,e,n)=>n.data,t},getArchivVorlagen(){return this.$fhcApi.post("api/frontend/v1/stv/archiv/getArchivVorlagen")},archive(t){return this.$fhcApi.post("api/frontend/v1/documents/archive",t)},archiveSigned(t){return this.$fhcApi.post("api/frontend/v1/documents/archiveSigned",t)},update(t){return this.$fhcApi.post("api/frontend/v1/stv/archiv/update",t)},delete({akte_id:t,studiengang_kz:e}){return this.$fhcApi.post("api/frontend/v1/stv/archiv/delete",{akte_id:t,studiengang_kz:e})}},documents:{getDocumentsUnaccepted(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/dokumente/getDocumentsUnaccepted/"+n.id+"/"+n.studiengang_kz)},getDocumentsAccepted(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/dokumente/getDocumentsAccepted/"+n.id+"/"+n.studiengang_kz)},deleteZuordnung(t){return this.$fhcApi.post("api/frontend/v1/stv/dokumente/deleteZuordnung/"+t.prestudent_id+"/"+t.dokument_kurzbz)},createZuordnung(t){return this.$fhcApi.post("api/frontend/v1/stv/dokumente/createZuordnung/"+t.prestudent_id+"/"+t.dokument_kurzbz)},loadAkte(t){return this.$fhcApi.get("api/frontend/v1/stv/dokumente/loadAkte/"+t)},getDoktypen(){return this.$fhcApi.get("api/frontend/v1/stv/dokumente/getDoktypen/")},updateFile(t,e){return this.$fhcApi.post("api/frontend/v1/stv/dokumente/updateAkte/"+t,e)},deleteFile(t){return this.$fhcApi.post("api/frontend/v1/stv/dokumente/deleteAkte/"+t)},uploadFile(t,e){return this.$fhcApi.post("api/frontend/v1/stv/dokumente/uploadDokument/"+t,e)}},exemptions:{getAnrechnungen(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/anrechnungen/getAnrechnungen/"+n.id)},getLehrveranstaltungen(t){return this.$fhcApi.get("api/frontend/v1/stv/anrechnungen/getLehrveranstaltungen/"+t)},getBegruendungen(){return this.$fhcApi.get("api/frontend/v1/stv/anrechnungen/getBegruendungen/")},getLvsKompatibel(t){return this.$fhcApi.get("api/frontend/v1/stv/anrechnungen/getLvsKompatibel/"+t)},getLektoren(t){return this.$fhcApi.get("api/frontend/v1/stv/anrechnungen/getLektoren/"+t)},addNewAnrechnung(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/anrechnungen/insertAnrechnung/",e)},loadAnrechnung(t){return this.$fhcApi.get("api/frontend/v1/stv/anrechnungen/loadAnrechnung/"+t)},editAnrechnung(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/anrechnungen/updateAnrechnung/",e)},deleteAnrechnung(t){return this.$fhcApi.post("api/frontend/v1/stv/anrechnungen/deleteAnrechnung/"+t)}},jointstudies:{getStudies(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/GemeinsameStudien/getStudien/"+n.id)},getTypenMobility(){return this.$fhcApi.get("api/frontend/v1/stv/GemeinsameStudien/getTypenMobility/")},getStudiensemester(){return this.$fhcApi.get("api/frontend/v1/stv/GemeinsameStudien/getStudiensemester/")},getStudyprograms(){return this.$fhcApi.get("api/frontend/v1/stv/GemeinsameStudien/getStudienprogramme/")},getListPartner(){return this.$fhcApi.get("api/frontend/v1/stv/GemeinsameStudien/getPartnerfirmen/")},getStatiPrestudent(){return this.$fhcApi.get("api/frontend/v1/stv/GemeinsameStudien/getStatiPrestudent/")},loadStudy(t){return this.$fhcApi.get("api/frontend/v1/stv/GemeinsameStudien/loadStudie/"+t)},insertStudy(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/GemeinsameStudien/insertStudie/",e)},updateStudy(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/GemeinsameStudien/updateStudie/",e)},deleteStudy(t){return this.$fhcApi.post("api/frontend/v1/stv/GemeinsameStudien/deleteStudie/"+t)}},courselist:{getCourselist(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/LvTermine/getStundenplan/"+n.student_uid+"/"+n.start_date+"/"+n.end_date+"/"+n.group_consecutiveHours+"/"+n.dbStundenplanTable)},getStudiensemester(){return this.$fhcApi.get("api/frontend/v1/stv/LvTermine/getStudiensemester/")}},configStudent(){return this.$fhcApi.get("api/frontend/v1/stv/config/student")},configStudents(){return this.$fhcApi.get("api/frontend/v1/stv/config/students")}},C={person:{getNotizen(t,e,n){return this.$fhcApi.get("api/frontend/v1/notiz/notizPerson/getNotizen/"+n.id+"/"+n.type)},getUid(){return this.$fhcApi.get("api/frontend/v1/notiz/notizPerson/getUid/")},addNewNotiz(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/notiz/notizPerson/addNewNotiz/"+e,n)},loadNotiz(t){return this.$fhcApi.post("api/frontend/v1/notiz/notizPerson/loadNotiz/",{notiz_id:t})},loadDokumente(t){return this.$fhcApi.post("api/frontend/v1/notiz/notizPerson/loadDokumente/",{notiz_id:t})},deleteNotiz(t,e,n){return this.$fhcApi.post("api/frontend/v1/notiz/notizPerson/deleteNotiz/",{notiz_id:t,type_id:e,id:n})},updateNotiz(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/notiz/notizPerson/updateNotiz/"+e,n)},getMitarbeiter(t){return this.$fhcApi.get("api/frontend/v1/notiz/notizPerson/getMitarbeiter/"+t)},isBerechtigt(t,e){return this.$fhcApi.get("api/frontend/v1/notiz/notizPerson/isBerechtigt/")}}},O={person:{getAllBetriebsmittel(t,e,n){return this.$fhcApi.get("api/frontend/v1/betriebsmittel/betriebsmittelP/getAllBetriebsmittel/"+n.type+"/"+n.id)},addNewBetriebsmittel(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/betriebsmittel/betriebsmittelP/addNewBetriebsmittel/"+e,n)},loadBetriebsmittel(t){return this.$fhcApi.post("api/frontend/v1/betriebsmittel/betriebsmittelP/loadBetriebsmittel/"+t)},updateBetriebsmittel(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/betriebsmittel/betriebsmittelP/updateBetriebsmittel/"+e,n)},deleteBetriebsmittel(t){return this.$fhcApi.post("api/frontend/v1/betriebsmittel/betriebsmittelP/deleteBetriebsmittel/"+t)},getTypenBetriebsmittel(){return this.$fhcApi.get("api/frontend/v1/betriebsmittel/betriebsmittelP/getTypenBetriebsmittel/")},loadInventarliste(t){return this.$fhcApi.get("api/frontend/v1/betriebsmittel/betriebsmittelP/loadInventarliste/"+t)}}},P={updatePersonUnrulyStatus(t,e){try{const n={person_id:t,unruly:e},a="/api/frontend/v1/checkperson/CheckPerson/updatePersonUnrulyStatus";return this.$fhcApi.post(a,n,null)}catch(t){throw t}},filterPerson(t,e=""){try{const n=e+"/api/frontend/v1/checkperson/CheckPerson/filterPerson";return axios.post(n,t)}catch(t){throw t}}},F={getContentID(t){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/Ort/ContentID",{ort_kurzbz:t})},getRooms(t,e,n,a,i=0){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/Ort/getRooms",{datum:t,von:e,bis:n,typ:a,personenanzahl:i})},getRoomTypes(){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/Ort/getTypes")}},I={content(t,e=null,n=null,a=null){return this.$fhcApi.get("/api/frontend/v1/Cms/content",{content_id:t,...e?{version:e}:{},...n?{sprache:n}:{},...a?{sichtbar:a}:{}})},getNews(t=1,e=10,n){return this.$fhcApi.get("/api/frontend/v1/Cms/getNews",{page:t,page_size:e,sprache:n})},news(t){return this.$fhcApi.get("/api/frontend/v1/Cms/news",{limit:t})},getNewsRowCount:function(){return this.$fhcApi.get("/api/frontend/v1/Cms/getNewsRowCount",{})},getNewsExtra:function(){return this.$fhcApi.get("/api/frontend/v1/Cms/getStudiengangInfoForNews",{})}},M={getStudentenMail(t){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/Lehre/lvStudentenMail",{lehreinheit_id:t})},getLvInfo(t,e){return this.$fhcApi.get(`/api/frontend/v1/Lehre/LV/${t}/${e}`,{})},getStudentPruefungen(t){return this.$fhcApi.get(`/api/frontend/v1/Lehre/Pruefungen/${t}`,{})}},L={getLvMenu(t,e){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+`/api/frontend/v1/LvMenu/getLvMenu/${t}/${e}`,{})}},R={person:{getMessages(t,e,n){return this.$fhcApi.get("api/frontend/v1/messages/messages/getMessages/"+n.id+"/"+n.type+"/"+n.size+"/"+n.page)},getVorlagen(){return this.$fhcApi.get("api/frontend/v1/messages/messages/getVorlagen/")},getMsgVarsLoggedInUser(){return this.$fhcApi.get("api/frontend/v1/messages/messages/getMsgVarsLoggedInUser/")},getMessageVarsPerson(t){return this.$fhcApi.get("api/frontend/v1/messages/messages/getMessageVarsPerson/"+t.id+"/"+t.type_id)},getMsgVarsPrestudent(t){return this.$fhcApi.get("api/frontend/v1/messages/messages/getMsgVarsPrestudent/"+t.id+"/"+t.type_id)},getPersonId(t){return this.$fhcApi.get("api/frontend/v1/messages/messages/getPersonId/"+t.id+"/"+t.type_id)},getUid(t){return this.$fhcApi.get("api/frontend/v1/messages/messages/getUid/"+t.id+"/"+t.type_id)},getDataVorlage(t){return this.$fhcApi.get("api/frontend/v1/messages/messages/getDataVorlage/"+t)},getNameOfDefaultRecipient(t){return this.$fhcApi.get("api/frontend/v1/messages/messages/getNameOfDefaultRecipient/"+t.id+"/"+t.type_id)},getPreviewText(t,e){return this.$fhcApi.post("api/frontend/v1/messages/messages/getPreviewText/"+t.id+"/"+t.type_id,e)},getReplyData(t){return this.$fhcApi.get("api/frontend/v1/messages/messages/getReplyData/"+t)},sendMessageFromModalContext(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/messages/messages/sendMessage/"+e,n)},sendMessage(t,e){return this.$fhcApi.post("api/frontend/v1/messages/messages/sendMessage/"+t,e)},deleteMessage(t){return this.$fhcApi.post("api/frontend/v1/messages/messages/deleteMessage/"+t)}}},N={getVorlagen(){return this.$fhcApi.get("api/frontend/v1/vorlagen/vorlagen/getVorlagen/")},getVorlagenByLoggedInUser(){return this.$fhcApi.get("api/frontend/v1/vorlagen/vorlagen/getVorlagenByLoggedInUser/")}},B={getStudiensemester:function(){return this.$fhcApi.get("/components/Cis/Mylv/Studiensemester",{})},getAllStudienSemester:function(t=void 0,e=void 0,n=void 0,a=void 0){return this.$fhcApi.get("/api/frontend/v1/Studium/getStudienAllSemester",{studiensemester:t,studiengang:e,semester:n,studienplan:a})},getStudiengaengeForStudienSemester:function(t){return this.$fhcApi.get(`/api/frontend/v1/Studium/getStudiengaengeForStudienSemester/${t}`,{})},getStudienplaeneBySemester:function(t,e){return this.$fhcApi.get("/api/frontend/v1/Studium/getStudienplaeneBySemester",{studiengang:t,studiensemester:e})},getLvPlanForStudiensemester:function(t,e){return this.$fhcApi.get(`/api/frontend/v1/LvPlan/getLvPlanForStudiensemester/${t}/${e}`,{})},getLvEvaluierungInfo:function(t,e){return this.$fhcApi.get(`/api/frontend/v1/Studium/getLvEvaluierungInfo/${t}/${e}`,{})}},j={search:_,phrasen:A,navigation:x,dashboard:{async getViewData(){return this.$fhcApi.get("/api/frontend/v1/Cis4FhcApi/getViewData",null,null)}},filter:$,studstatus:S,profil:T,profilUpdate:z,lvPlan:D,bookmark:{getBookmarks:function(){return this.$fhcApi.get("/api/frontend/v1/Bookmark/getBookmarks",{})},delete:function(t){return this.$fhcApi.get(`/api/frontend/v1/Bookmark/delete/${t}`,{})},update:function({bookmark_id:t,url:e,title:n,tag:a=null}){return this.$fhcApi.post(`/api/frontend/v1/Bookmark/update/${t}`,{url:e,title:n})},insert:function({url:t,title:e,tag:n}){return this.$fhcApi.post("/api/frontend/v1/Bookmark/insert",{url:t,title:e,tag:n})}},stv:E,notiz:C,betriebsmittel:O,checkperson:P,ampeln:{open:function(){return this.$fhcApi.get("/api/frontend/v1/Ampeln/open",{})},all:function(){return this.$fhcApi.get("/api/frontend/v1/Ampeln/all",{})},confirm:function(t){return this.$fhcApi.get(`/api/frontend/v1/Ampeln/confirm/${t}`,{})}},ort:F,cms:I,lehre:M,addons:L,messages:R,vorlagen:N,addons:L,studiengang:{studiengangInformation:function(){return this.$fhcApi.get("/api/frontend/v1/Studgang/getStudiengangInfo",{})},getStudiengangByKz:function(t){return this.$fhcApi.get("/api/frontend/v1/organisation/StudiengangEP/getStudiengangByKz",{studiengang_kz:t})}},menu:{getMenu:function(){return this.$fhcApi.get("/api/frontend/v1/CisMenu/getMenu",{})}},authinfo:{getAuthUID(){return this.$fhcApi.get("/api/frontend/v1/AuthInfo/getAuthUID",{})},getAuthInfo(){return this.$fhcApi.get("/api/frontend/v1/AuthInfo/getAuthInfo",{})}},studium:B,language:{getAll(){return this.$fhcApi.get("/api/frontend/v1/language/get")}}},U={install:(t,e)=>{if(t.config.globalProperties.$fhcApi)return void(e?.factory&&(console.warn("$fhcApi is DEPRECATED!"),t.config.globalProperties.$fhcApi.factory.addEndpoints(e.factory)));function n(t,e,n,a){if("string"==typeof t&&void 0===a)[e,n,a]=[t,e,n],t=void 0;else if(t){if("object"!=typeof t)throw new TypeError("Parameter 1 of _get_config must be an object or a string");void 0===e&&void 0===n&&void 0===a&&(a=t,t=void 0)}if(t){if(!t.clearValidation||!t.setFeedback)throw new TypeError("'form' is not a Form Component");t={clearValidation:t.clearValidation,setFeedback:t.setFeedback},a?a.form=t:a={form:t}}return[e,n,a]}function a(t){const e=t.data;return delete t.data,e.meta?e.meta.response=t:e.meta={response:t},e}FHC_JS_DATA_STORAGE_OBJECT.app_root,FHC_JS_DATA_STORAGE_OBJECT.ci_router;const i=axios.create({timeout:5e5,baseURL:FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/"});i.interceptors.request.use(t=>{if("post"!=t.method||!t.data)return t;if(t.data instanceof FormData)return t;if(!Object.values(t.data).every(t=>!(t instanceof FileList)&&(!Array.isArray(t)||t.every(t=>!(t instanceof File))))){const e=Object.entries(t.data).reduce((t,[e,n])=>{if(n instanceof FileList)for(const a of n)t.FormData.append(e+(n.length>1?"[]":""),a);else Array.isArray(n)?n.every(t=>!(t instanceof File))?t.jsondata[e]=n:n.forEach(a=>t.FormData.append(e+(n.length>1?"[]":""),a)):t.jsondata[e]=n;return t},{FormData:new FormData,jsondata:{}});e.FormData.append("_jsondata",JSON.stringify(e.jsondata)),t.data=e.FormData}return t}),i.interceptors.response.use(e=>("off"==e.config?.errorHandling||!1===e.config?.errorHandling||"fail"==e.config?.errorHandling||e.data.errors&&(e.data.errors=e.data.errors.filter(n=>(e.config[n.type+"ErrorHandler"]||t.config.globalProperties.$fhcApi._defaultErrorHandlers[n.type])(n,e.config))),a(e)),e=>"ERR_CANCELED"==e.code?Promise.reject({handled:!0,...e}):"off"==e.config?.errorHandling||!1===e.config?.errorHandling||"success"==e.config?.errorHandling?Promise.reject(e):e.response?404==e.response.status?(t.config.globalProperties.$fhcAlert.alertDefault("error",e.message,e.request.responseURL,!0),Promise.reject({handled:!0,...e})):(e.response.data.errors=e.response.data.errors.filter(n=>(e.config[n.type+"ErrorHandler"]||t.config.globalProperties.$fhcApi._defaultErrorHandlers[n.type])(n,e.config)),e.response.data.errors.length?Promise.reject(e):Promise.reject({handled:!0,...e})):e.request?(t.config.globalProperties.$fhcAlert.alertDefault("error",e.message,e.request.responseURL),Promise.reject({handled:!0,...e})):(t.config.globalProperties.$fhcAlert.alertError(e.message),Promise.reject({handled:!0,...e}))),t.config.globalProperties.$fhcApi={getUri:t=>(console.warn("$fhcApi.getUri is DEPRECATED! Use $api.getUri instead."),i.getUri({url:t})),get:(t,e,a,s)=>(console.warn("$fhcApi.get is DEPRECATED! Use $api.get instead."),[e,a,s]=n(t,e,a,s),a&&(s?s.params=a:s={params:a}),i.get(e,s)),post:(t,e,a,s)=>(console.warn("$fhcApi.post is DEPRECATED! Use $api.post instead."),[e,a,s]=n(t,e,a,s),i.post(e,a,s)),_defaultErrorHandlers:{validation(e,n){const a=t.config.globalProperties.$fhcAlert;return n?.form?(n.form.clearValidation(),n.form.setFeedback(!1,e.messages),!1):Array.isArray(e.messages)?(e.messages.forEach(a.alertError),!1):"object"!=typeof e.messages||(n?.errorHeader?Object.values(e.messages).forEach(e=>a.alertDefault("error",Array.isArray(n.errorHeader)?t.config.globalProperties.$p.t.apply(null,n.errorHeader):n.errorHeader,e,!0)):Object.entries(e.messages).forEach(([t,e])=>a.alertDefault("error",t,e,!0)),!1)},general(e,n){const a=t.config.globalProperties.$fhcAlert;n?.form?n.form.setFeedback(!1,e.message):n?.errorHeader?a.alertDefault("error",Array.isArray(n.errorHeader)?t.config.globalProperties.$p.t.apply(null,n.errorHeader):n.errorHeader,e.message,!0):a.alertError(e.message)},php(e){const n=t.config.globalProperties.$fhcAlert;var a="";switch(a+="Message: "+e.message+"\n\n",a+="Filename: "+e.filename+"\n",a+="Line Number: "+e.line+"\n",e.backtrace&&e.backtrace.length&&(a+="\nBacktrace: ",e.backtrace.forEach(t=>{a+="\n\tFile: "+t.file+"\n",a+="\tLine: "+t.line+"\n",a+="\tFunction: "+t.function+"\n"})),e.severity){case"Warning":case"Core Warning":case"Compile Warning":case"User Warning":n.alertDefault("warn","PHP "+e.severity,a,!0);break;case"Notice":case"User Notice":case"Runtime Notice":n.alertDefault("info","PHP "+e.severity,a,!0);break;default:a="Type: PHP "+e.severity+"\n\n"+a,n.alertSystemError(a)}},exception(e){const n=t.config.globalProperties.$fhcAlert;var a="";a+="Type: "+e.class+"\n\n",a+="Message: "+e.message+"\n\n",a+="Filename: "+e.filename+"\n",a+="Line Number: "+e.line+"\n",e.backtrace&&e.backtrace.length&&(a+="\nBacktrace: ",e.backtrace.forEach(t=>{a+="\n\tFile: "+t.file+"\n",a+="\tLine: "+t.line+"\n",a+="\tFunction: "+t.function+"\n"})),n.alertSystemError(a)},db(e){const n=t.config.globalProperties.$fhcAlert;var a="";void 0!==e.heading&&(a+=e.heading+"\n\n"),void 0!==e.code&&(a+="Code: "+e.code+"\n\n"),void 0!==e.sql&&(a+="SQL: "+e.sql+"\n\n"),void 0!==e.message?a+="Message: "+e.message+"\n\n":void 0!==e.messages&&(a+="Messages: "+e.messages.join("\n\t")+"\n\n"),void 0!==e.filename&&(a+="Filename: "+e.filename+"\n"),void 0!==e.line&&(a+="Line Number: "+e.line+"\n"),n.alertSystemError(a)},auth(e,n){const a=t.config.globalProperties.$fhcAlert;var i="";i+="Controller name: "+e.controller+"\n",i+="Method name: "+e.method+"\n",i+="Required permissions: "+e.required_permissions,n?.errorHeader?a.alertDefault("error",Array.isArray(n.errorHeader)?t.config.globalProperties.$p.t.apply(null,n.errorHeader):n.errorHeader,e.message,!0):a.alertDefault("error",e.message,i)}}};class s{constructor(e,n){void 0===n?(this.$fhcApi={getUri:e=>(console.warn("$fhcApi.factory is DEPRECATED!"),t.config.globalProperties.$fhcApi.getUri(e)),get:(e,n,a,i)=>(console.warn("$fhcApi.factory is DEPRECATED!"),t.config.globalProperties.$fhcApi.get(e,n,a,i)),post:(e,n,a,i)=>(console.warn("$fhcApi.factory is DEPRECATED!"),t.config.globalProperties.$fhcApi.post(e,n,a,i))},Object.defineProperty(this.$fhcApi,"factory",{get:()=>(console.warn("$fhcApi.factory is DEPRECATED!"),t.config.globalProperties.$fhcApi.factory)}),t.config.globalProperties.$fhcApi.factory=this):Object.defineProperty(this,"$fhcApi",{get(){return(n||this).$fhcApi}}),this.addEndpoints(e,!0)}addEndpoints(t,e){Object.keys(t).forEach(e=>{Object.defineProperty(this,e,{get(){return"function"==typeof t[e]?t[e].bind(this):new s(t[e],this.$fhcApi.factory)}})}),e||console.warn("$fhcApi.factory.addEndpoints() is DEPRECATED!")}}const r=new s(j);e?.factory&&(console.warn("$fhcApi is DEPRECATED!"),r.addEndpoints(e.factory)),t.config.globalProperties.$fhcApi.factory=r,t.provide("$fhcApi",t.config.globalProperties.$fhcApi)}};const V="error",H="retval",G={get:function(t,e,n=null){return G._axiosCall(t,e,"get",n)},post:function(t,e,n=null){return G._axiosCall(t,e,"post",n)},isSuccess:function(t){return!("object"!=typeof t||!t.hasOwnProperty(V)||!t.hasOwnProperty(H)||0!=t.error)},isError:function(t){return!G.isSuccess(t)},hasData:function(t){return!(!G.isSuccess(t)||!("object"==typeof t[H]&&Object.keys(t[H]).length>0||"array"==typeof t[H]&&t[H].length>0||"string"==typeof t[H]&&""!=t[H].trim()||"number"==typeof t[H]))},getData:function(t){return G.hasData(t)?t[H]:null},getError:function(t){return"object"==typeof t&&Object.keys(t).length>0&&t.hasOwnProperty(H)?t[H]:"Generic error"},getErrorCode:function(t){return"object"==typeof t&&t.hasOwnProperty(V)?t[V]:1},_generateRouterURI:function(t){var e=null;return"undefined"!=typeof FHC_JS_DATA_STORAGE_OBJECT&&(e=FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/"+t),e},_printDebug:function(t,e,n){},_axiosCall:function(t,e,n,a){let i={method:n,url:G._generateRouterURI(t),timeout:5e3};if("get"==n?i.params=e:i.data=e,"object"==typeof a)for(var s in a)i[s]=a[s];return axios(i)}},q=document.createElement("div"),J=Vue.createApp({name:"FhcAlertApp",components:{PvToast:e,PvConfirm:n},methods:{mailToUrl:t=>"mailto:"+FHC_JS_DATA_STORAGE_OBJECT.systemerror_mailto+"?subject=Meldung%20Systemfehler&body="+("\n\t\t\t\tDanke, dass Sie uns den Fehler melden. %0D%0A %0D%0A\n\t\t\t\tBitte beschreiben Sie uns ausführlich das Problem.%0D%0A\n\t\t\t\tBsp: Ich habe X ausgewählt und Y angelegt. Beim Speichern erhielt ich die Fehlermeldung. [Optional: Ich habe den Browser Z verwendet.]%0D%0A\n\t\t\t\t-----------------------------------------------------------------------------------------------------------------------------------%0D%0A\n\t\t\t\tPROBLEM: ... %0D%0A %0D%0A %0D%0A\n\n\t\t\t\t-----------------------------------------------------------------------------------------------------------------------------------%0D%0A\n\t\t\t\tFehler URL: "+FHC_JS_DATA_STORAGE_OBJECT.called_path+"/"+FHC_JS_DATA_STORAGE_OBJECT.called_method+"%0D%0A\n\t\t\t\tFehler Meldung: "+t.message.detail+"%0D%0A\n\t\t\t\t-----------------------------------------------------------------------------------------------------------------------------------%0D%0A %0D%0A\n\t\t\t\tWir kümmern uns um eine rasche Behebung des Problems!"),openMessagecard(t){bootstrap.Collapse.getOrCreateInstance(t.target.getAttribute("href")).toggle()}},unmounted(){q.parentElement.removeChild(q)},computed:{showmaillink:function(){return""!==FHC_JS_DATA_STORAGE_OBJECT.systemerror_mailto}},template:'\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t'});J.use(t),J.use(a);const W=J.mount(q);document.body.appendChild(q);var Z={install:(t,e)=>{t.config.globalProperties.$p||t.use(at);const n={alertSuccess(t){if(Array.isArray(t))return t.forEach(this.alertSuccess);W.$refs.toast.add({severity:"success",summary:"Info",detail:t,life:1e3})},alertInfo(t){if(Array.isArray(t))return t.forEach(this.alertInfo);W.$refs.toast.add({severity:"info",summary:"Info",detail:t,life:3e3})},alertWarning(t){if(Array.isArray(t))return t.forEach(this.alertWarning);W.$refs.toast.add({severity:"warn",summary:"Achtung",detail:t})},alertError(t){if(Array.isArray(t))return t.forEach(this.alertError);W.$refs.toast.add({severity:"error",summary:"Achtung",detail:t})},alertSystemError(e){if(Array.isArray(e))return e.forEach(this.alertSystemError);W.$refs.alert.add({severity:"error",summary:Vue.computed(()=>t.config.globalProperties.$p.t("alert/systemerror")),detail:e})},confirmDelete:()=>new Promise((e,n)=>{W.$confirm.require({group:"fhcAlertConfirm",header:Vue.computed(()=>t.config.globalProperties.$p.t("alert/attention")),message:Vue.computed(()=>t.config.globalProperties.$p.t("alert/confirm_delete")),acceptLabel:Vue.computed(()=>t.config.globalProperties.$p.t("ui/loeschen")),acceptClass:"p-button-danger",rejectLabel:Vue.computed(()=>t.config.globalProperties.$p.t("ui/abbrechen")),rejectClass:"p-button-secondary",accept(){e(!0)},reject(){e(!1)}})}),confirm:e=>new Promise((n,a)=>{W.$confirm.require({group:e?.group??"fhcAlertConfirm",header:e?.header??Vue.computed(()=>t.config.globalProperties.$p.t("alert/attention")),message:e?.message??"",acceptLabel:e?.acceptLabel??"Ok",acceptClass:e?.acceptClass??"btn btn-primary",rejectLabel:e?.rejectLabel??Vue.computed(()=>t.config.globalProperties.$p.t("ui/abbrechen")),rejectClass:e?.rejectClass??"btn btn-outline-secondary",accept(){n(!0)},reject(){n(!1)}})}),alertDefault(t,e,n,a=!1,i=!1){let s={severity:t,summary:e,detail:n,html:i};a||(s.life=3e3),W.$refs.toast.add(s)},alertMultiple(t,e="info",n="Info",a=!1,i=!1){return!!t.every(t=>"string"==typeof t)&&(t.forEach(t=>this.alertDefault(e,n,t,a,i)),!0)},handleSystemError(t){if(!t.hasOwnProperty("name")||t.name.toLowerCase()!=="AbortError".toLowerCase()){if("string"==typeof t)return n.alertSystemError(t);if(Array.isArray(t)&&t.every(t=>"string"==typeof t))return t.every(n.alertSystemError);if(!t.hasOwnProperty("handled")||!t.handled){if("object"==typeof t&&null!==t){let e="";return t.hasOwnProperty("response")&&t.response?.data?.retval?e+="Error Message: "+(t.response.data.retval.message||t.response.data.retval)+"\r\n":t.hasOwnProperty("message")&&(e+="Error Message: "+t.message.toUpperCase()+"\r\n"),t.hasOwnProperty("config")&&t.config.hasOwnProperty("url")&&(e+="Error ConfigURL: "+t.config.url+"\r\n"),t.hasOwnProperty("stack")&&(e+="Error Stack: "+t.stack+"\r\n"),""==e&&(e="Error Message: "+JSON.stringify(t)+"\r\n"),e+="Error Controller Path: "+FHC_JS_DATA_STORAGE_OBJECT.called_path+"/"+FHC_JS_DATA_STORAGE_OBJECT.called_method,n.alertSystemError(e)}n.alertSystemError("alertSystemError throws Generic Error\r\nError Controller Path: "+FHC_JS_DATA_STORAGE_OBJECT.called_path+"/"+FHC_JS_DATA_STORAGE_OBJECT.called_method)}}},handleSystemMessage(t){if("string"==typeof t)return n.alertWarning(t);if(Array.isArray(t)){if(t.every(t=>"string"==typeof t))return t.every(n.alertWarning);if(t.every(t=>"object"==typeof t)&&null!==msg)return t.every(t=>{t.hasOwnProperty("data")&&t.data.hasOwnProperty("retval")?n.alertWarning(JSON.stringify(t.data.retval)):n.alertSystemError(JSON.stringify(t))})}"object"!=typeof t||null===t?n.alertSystemError("alertSystemError throws Generic Error\r\nError Controller Path: "+FHC_JS_DATA_STORAGE_OBJECT.called_path+"/"+FHC_JS_DATA_STORAGE_OBJECT.called_method):t.hasOwnProperty("data")&&t.data.hasOwnProperty("retval")?n.alertWarning(JSON.stringify(t.data.retval)):n.alertSystemError(JSON.stringify(t))},resetFormValidation(t){const e=new Event("fhc-form-reset");t.querySelectorAll(["[data-fhc-form-validate],[data-fhc-form-error]"]).forEach(t=>t.dispatchEvent(e))},handleFormValidation(t,e){if(void 0===e){if(t&&t.nodeType===Node.ELEMENT_NODE)return e=>n.handleFormValidation(e,t)}else if(400==t?.response?.status){let a=G.getError(t.response.data);"object"!=typeof a&&(a=t.response.data),n.resetFormValidation(e);const i=Object.entries(a).filter(([t,n])=>{const a=e.querySelector('[data-fhc-form-validate="'+t+'"]');return!a||(a.dispatchEvent(new CustomEvent("fhc-form-invalidate",{detail:n})),!1)}).map(t=>t[1]),s=e.querySelector("[data-fhc-form-error]");return void(s&&i.length?s.dispatchEvent(new CustomEvent("fhc-form-error",{detail:i})):i.forEach(n.alertError))}if(400==t?.response?.status){let e=G.getError(t.response.data);n.alertError("object"==typeof e?Object.values(e):e)}else n.handleSystemError(t)}};t.config.globalProperties.$fhcAlert=n,t.provide("$fhcAlert",t.config.globalProperties.$fhcAlert)}},K={install:(t,e)=>{if(t.config.globalProperties.$api)return;function n(t,e){Array.isArray(t)?t.forEach(e):Object.entries(t).forEach(([t,n])=>n.forEach(n=>e(n,t)))}t.config.globalProperties.$fhcAlert||t.use(Z);let a={success:!0,fail:!0,combine:{form:["validation","general"],toast:["validation","general","not_found","site_failed"]},handler:{form(t,e){t.clearValidation(),e.forEach(e=>t.setFeedback(!1,e.messages||e.message))},async toast(e){const n=t.config.globalProperties.$p;if(!n)return Promise.reject("Phrasen plugin not loaded!");async function a(t){t=t.reduce((t,e)=>{switch(e.type){case"not_found":case"site_failed":e.message?t[e.message]=[e.url]:t._default=[e.url];break;case"general":t._default||(t._default=[]),t._default.push(e.message);break;case"validation":Object.entries(e.messages).forEach(([e,n])=>{t[e]||(t[e]=[]),Array.isArray(n)?t[e].push(...n):t[e].push(n)})}return t},{});let e=0;const a=await Promise.all(Object.entries(t).sort((t,e)=>["_default"].indexOf(e[0])-["_default"].indexOf(t[0])).map(async([t,a])=>{if("_default"==t){await n.loadCategory("dashboard");t='
    '+n.t("dashboard/general")+"
    "}else t="
    "+t+"
    ";return e+=a.length,t+"
    "+a.join("
    ")+"
    "}));return{counter:e,msgs:a}}let i,s;Array.isArray(e)?({counter:i,msgs:s}=await a(e)):({counter:i,msgs:s}=await Object.entries(e).reduce(async(t,[e,n])=>{const i=await t,{counter:s,msgs:r}=await a(n);return i.counter+=s,i.msgs.push("
    "+e+"
    "+r.join("")+"
    "),i},Promise.resolve({counter:0,msgs:[]}))),await n.loadCategory("ui");const r=n.t("ui/n_errors",{n:i});t.config.globalProperties.$fhcAlert.alertDefault("error",r,"
    "+s.join("")+"
    ",!0,!0)},php(e){n(e,(e,n)=>{var a="";switch(a+="Message: "+e.message+"\n\n",a+="Filename: "+e.filename+"\n",a+="Line Number: "+e.line+"\n",e.backtrace&&e.backtrace.length&&(a+="\nBacktrace: ",e.backtrace.forEach(t=>{a+="\n\tFile: "+t.file+"\n",a+="\tLine: "+t.line+"\n",a+="\tFunction: "+t.function+"\n"})),e.severity){case"Warning":case"Core Warning":case"Compile Warning":case"User Warning":n?n+=": PHP "+e.severity:n="PHP "+e.severity,t.config.globalProperties.$fhcAlert.alertDefault("warn",n,a,!0);break;case"Notice":case"User Notice":case"Runtime Notice":n?n+=": PHP "+e.severity:n="PHP "+e.severity,t.config.globalProperties.$fhcAlert.alertDefault("info",n,a,!0);break;default:a="Type: PHP "+e.severity+"\n\n"+a,n&&(a=n+"\n\n"+a),t.config.globalProperties.$fhcAlert.alertSystemError(a)}})},exception(e){n(e,(e,n)=>{var a="";n&&(a+=n+"\n\n"),a+="Type: "+e.class+"\n\n",a+="Message: "+e.message+"\n\n",a+="Filename: "+e.filename+"\n",a+="Line Number: "+e.line+"\n",e.backtrace&&e.backtrace.length&&(a+="\nBacktrace: ",e.backtrace.forEach(t=>{a+="\n\tFile: "+t.file+"\n",a+="\tLine: "+t.line+"\n",a+="\tFunction: "+t.function+"\n"})),t.config.globalProperties.$fhcAlert.alertSystemError(a)})},db(e){n(e,(e,n)=>{var a="";n&&(a+=n+"\n\n"),void 0!==e.heading&&(a+=e.heading+"\n\n"),void 0!==e.code&&(a+="Code: "+e.code+"\n\n"),void 0!==e.sql&&(a+="SQL: "+e.sql+"\n\n"),void 0!==e.message?a+="Message: "+e.message+"\n\n":void 0!==e.messages&&(a+="Messages: "+e.messages.join("\n\t")+"\n\n"),void 0!==e.filename&&(a+="Filename: "+e.filename+"\n"),void 0!==e.line&&(a+="Line Number: "+e.line+"\n"),t.config.globalProperties.$fhcAlert.alertSystemError(a)})},auth(e){n(e,(e,n)=>{n?n+=": "+e.message:n=e.message;var a="";a+="Controller name: "+e.controller+"\n",a+="Method name: "+e.method+"\n",a+="Required permissions: "+e.required_permissions,t.config.globalProperties.$fhcAlert.alertDefault("error",n,a,!0)})}}};function i(t,e,n,a){if("string"==typeof t&&void 0===a)[e,n,a]=[t,e,n],t=void 0;else if(t){if("object"!=typeof t)throw new TypeError("Parameter 1 of _get_config must be an object or a string");void 0===e&&void 0===n&&void 0===a&&(a=t,t=void 0)}if(t){if(!t.clearValidation||!t.setFeedback)throw new TypeError("'form' is not a Form Component");t={clearValidation:t.clearValidation,setFeedback:t.setFeedback},a?a.form=t:a={form:t}}return[e,n,a]}function s(t){if("string"==typeof t.data||t.data instanceof String)return s({data:t});const e=t.data;return delete t.data,e?(e.meta?e.meta.response=t:e.meta={response:t},e):{meta:{response:t},data:null}}function r(t){if(!1===t||"off"===t)return{...a,success:!1,fail:!1};if(!t||!0===t)return{...a};if("success"===t)return{...a,fail:!1};if("fail"===t)return{...a,success:!1};const{success:e,fail:n,handler:i,combine:s}=t;return t={...a},Object.entries({fail:n,success:e}).forEach(([e,n])=>{void 0!==n&&(t[e]=n)}),Object.entries({handler:i,combine:s}).forEach(([e,n])=>{void 0!==n&&(t[e]={...t[e],...n})}),t}function l(t){const e=r(t?.errorHandling);if(t?.form){const n=e.handler.form;e.handler={...e.handler,form:e=>n(t.form,e)}}else e.combine={...e.combine,form:[]};return e}function o(t){return t.response?404==t.response.status?[{type:"not_found",message:t.message,url:t.request.responseURL}]:null==t.response.data.errors?[]:t.response.data.errors:t.request?[{type:"site_failed",message:t.message,url:t.request.responseURL}]:[{type:"script",message:t.message}]}function d(t,e){const n={},a=[];if(null==e)return{};for(;e.length;)a.push(e.pop());for(var i of a){let a=i.type,r=null;for(var s in t.combine){let e=t.combine[s].includes(a),n=t.handler[s];if(e&&n&&(r=s,"form"==r))break}r&&(a=r);t.handler[a]?(n[a]||(n[a]=[]),Array.isArray(i)?n[a].push(...i):n[a].push(i)):e.push(i)}return n}void 0!==e?.errorHandling&&(a=r(e.errorHandling));const c=axios.create({timeout:5e5,baseURL:FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/"});c.interceptors.request.use(t=>{if("post"!=t.method||!t.data)return t;if(t.data instanceof FormData)return t;if(!Object.values(t.data).every(t=>!(t instanceof FileList)&&(!Array.isArray(t)||t.every(t=>!(t instanceof File))))){const e=Object.entries(t.data).reduce((t,[e,n])=>{if(n instanceof FileList)for(const a of n)t.FormData.append(e+(n.length>1?"[]":""),a);else Array.isArray(n)?n.every(t=>!(t instanceof File))?t.jsondata[e]=n:n.forEach(a=>t.FormData.append(e+(n.length>1?"[]":""),a)):t.jsondata[e]=n;return t},{FormData:new FormData,jsondata:{}});e.FormData.append("_jsondata",JSON.stringify(e.jsondata)),t.data=e.FormData}return t}),c.interceptors.response.use(e=>("off"==e.config?.errorHandling||!1===e.config?.errorHandling||"fail"==e.config?.errorHandling||e.data.errors&&(e.data.errors=e.data.errors.filter(n=>(e.config[n.type+"ErrorHandler"]||t.config.globalProperties.$api._defaultErrorHandlers[n.type])(n,e.config))),s(e)),t=>{if("ERR_CANCELED"==t.code)return Promise.reject({handled:!0,...t});const e=l(t.config);if(!e.fail)return Promise.reject(t);const n=o(t),a=d(e,n);for(var i in a)e.handler[i](a[i]);return n.length?Promise.reject(t):Promise.reject({handled:!0,...t})}),t.config.globalProperties.$api={getUri:t=>c.getUri({url:t}),get:(t,e,n,a)=>([e,n,a]=i(t,e,n,a),n&&(a?a.params=n:a={params:n}),c.get(e,a)),post:(t,e,n,a)=>([e,n,a]=i(t,e,n,a),c.post(e,n,a)),call(e,n,a){if(Array.isArray(e)){const s=t.config.globalProperties.$api;return Promise.allSettled(e.map((t,e)=>(Array.isArray(t)||(t=["#"+e,t]),s.call(t[1],{errorHeader:t[0],errorHandling:!1})))).then(t=>{const[,,e]=i(a,void 0,void 0,n||{}),s=l(e);if(!s.success&&!s.fail)return t;const r={};for(var c of t){const[t,e]="fulfilled"===c.status?[s.success,c.value]:[s.fail,c.reason];if(!t)return;const n=d(s,o(e));for(var u in n)r[u]?r[u][e.config.errorHeader]=n[u]:r[u]={[e.config.errorHeader]:n[u]}}for(var p in r)s.handler[p](r[p]);return t})}let{method:s,url:r,params:c,config:u}=e;return void 0!==n&&(u=n),s||(s="get"),s.toLowerCase&&(s=s.toLowerCase()),"get"==s?this.get(a,r,c,u):"post"==s?this.post(a,r,c,u):void console.error("FhcApi: method not allowed:",s)},getErrorHandler:t=>l(t)},t.provide("$api",t.config.globalProperties.$api)}},Y={loadCategory:t=>({method:"get",url:"/api/frontend/v1/phrasen/loadModule/"+t}),setLanguage:(t,e)=>({method:"post",url:"/api/frontend/v1/phrasen/setLanguage",params:{categories:t,language:e}}),getLanguage:()=>({method:"get",url:"/api/frontend/v1/phrasen/getLanguage"}),getActiveDbLanguages:()=>({method:"get",url:"/api/frontend/v1/phrasen/getAllLanguages"})};const Q=Vue.reactive({}),X={};let tt=Vue.ref(FHC_JS_DATA_STORAGE_OBJECT.user_language),et=Vue.computed(()=>tt.value?FHC_JS_DATA_STORAGE_OBJECT.server_languages.find(t=>t.sprache==tt.value).LC_Time:null);const nt={user_language:tt,user_locale:et,setLanguage(t){const e=Object.keys(Q);return this.config.globalProperties.$api.call(Y.setLanguage(e,t)).then(e=>(e.data.forEach(t=>{Q[t.category][t.phrase]=t.text}),tt.value=t,e))},loadCategory(t){return Array.isArray(t)?Promise.all(t.map(this.config.globalProperties.$p.loadCategory)):(X[t]||(X[t]=this.config.globalProperties.$api.call(Y.loadCategory(t)).then(e=>e?.data?function(t,e){return t.filter(t=>t.category==e).reduce((t,e)=>(t[e.phrase]||(t[e.phrase]=e.text),t),{})}(e.data,t):{}).then(e=>{Q[t]=e})),X[t])},t_ref(t,e,n){return console.warn("deprecated"),Vue.computed(()=>this.t(t,e,n))},t(t,e,n){if(void 0===n&&(Array.isArray(t)&&2==t.length||t.split&&2==t.split("/").length)&&(n=e,[t,e]=t.split?t.split("/"):t),void 0===e)return console.error("invalid input",t,e,n),"";let a=Vue.computed(()=>Q[t]?function(t,e,n){let a=Q[t][e];return a?(n&&(a=a.replace(/\{([^}]*)\}/g,(t,e)=>void 0===n[e]?t:n[e])),a):"<< PHRASE "+e+">>"}(t,e,n):"");return Q[t]||this.loadCategory(t),a.value}};var at={install(t,e){t.config.globalProperties.$fhcApi||t.use(U),t.config.globalProperties.$api||t.use(K),t.config.globalProperties.$p={t:nt.t,loadCategory:e=>nt.loadCategory.call(t,e),setLanguage:e=>nt.setLanguage.call(t,e),user_language:tt,user_locale:et,t_ref:nt.t_ref},t.provide("$p",t.config.globalProperties.$p)}},it=Object.freeze({__proto__:null,default:at,user_locale:et});let st=Vue.ref(FHC_JS_DATA_STORAGE_OBJECT.theme.name);const rt=FHC_JS_DATA_STORAGE_OBJECT.theme.modes,lt=t=>{if(!t)return;for(const t of rt)document.documentElement.classList.remove(t);st.value=t,document.documentElement.classList.add(t),document.body.setAttribute("data-bs-theme",t);let e=document.querySelector('link[href*="primevue/resources/themes"]');"dark"==t?e.attributes.href.value=e.attributes.href.value.replace("bootstrap4-light-blue","bootstrap4-dark-blue"):("light"==t||e.attributes.href.value.includes("bootstrap4-dark-blue"))&&(e.attributes.href.value=e.attributes.href.value.replace("bootstrap4-dark-blue","bootstrap4-light-blue")),localStorage.setItem("theme",t)};var ot={install:(t,e)=>{document.documentElement.classList.add(st.value),(()=>{let t=localStorage.getItem("theme");t&&rt.includes(t)||(t=rt[0],localStorage.setItem("theme",t)),lt(t)})(),t.config.globalProperties.$theme={theme_name:st,theme_modes:rt,switchTheme:t=>{lt(t)}}}};const dt=t=>{const e=t.toString(16);return 1===e.length?"0"+e:e};function ct(t){return(299*parseInt(t.substring(1,3),16)+587*parseInt(t.substring(3,5),16)+114*parseInt(t.substring(5,7),16))/1e3>=128?"black":"white"}var ut={mounted(t,e){const n=window.getComputedStyle(t).backgroundColor;let a=new RegExp(/^rgba?\s*\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*,?\s*([0-9]+.?[0-9]?)?\s*\)/),i=n.match(a);if(i){i.length<3&&console.error("Invalid RGB color format");let e=parseInt(i[1],10),n=parseInt(i[2],10),a=parseInt(i[3],10),s=`#${dt(e)}${dt(n)}${dt(a)}`;t.style.color=ct(s)}else t.style.color=ct(n)}};const pt={lehreinheit:{id:"lehreinheit_id",dragIcon:"fa-solid fa-chalkboard-user",extras:["stundenblockung"]},vevent:{id:"uid",dragIcon:"fa-solid fa-calendar",extras:["dtstart","dtend","summary"]},person:{id:"person_id",dragIcon:"fa-solid fa-user"},student:{id:"student_uid",dragIcon:"fa-solid fa-user-graduate"},prestudent:{id:"prestudent_id",dragIcon:"fa-solid fa-user-graduate text-muted"}},ht=Object.keys(pt);function mt(t){if(!t)return!1;if(Array.isArray(t))return t.every(mt);if(!t.type)return!1;if("-collection"==t.type.substr(-11)){if(!Object.prototype.hasOwnProperty.call(t,"values"))return!1;if(!ht.includes(t.type.substr(0,t.type.length-11)))return!1}else{if(!Object.prototype.hasOwnProperty.call(t,"id"))return!1;if(!ht.includes(t.type))return!1;if(pt[t.type].extras&&!pt[t.type].extras.every(e=>Object.prototype.hasOwnProperty.call(t,e)))return!1}return!0}function gt(t,e,n){let a=null;try{if(a=ft(t,n),!a)return null;if(!n&&Array.isArray(a)){if(a=a.filter(mt),!a.length)return null}else if(!mt(a))return null;if(e&&e.length)if(Array.isArray(a)){if(n&&!a.every(t=>e.includes(t.type)))return null;if(!n&&(a=a.filter(t=>e.includes(t.type)),!a.length))return null}else if(!e.includes(a.type))return null}catch(t){return null}return Array.isArray(a)&&1==a.length?a.find(Boolean):a}function ft(t,e){const n=[];for(const a of t.dataTransfer.types){if("application/fhc-"!=a.substr(0,16)){if(e)return null;continue}let i=a.substr(16),s=!1;if("-collection"==i.substr(-11)&&(i=i.substr(0,i.length-11),s=!0),!ht.includes(i)){if(e)return null;continue}let r=JSON.parse(t.dataTransfer.getData(a));s?n.push(...r.values):n.push(r)}return n.length?1==n.length?n[0]:n:null}var vt={...Object.keys(pt).reduce((t,e)=>(t["TYPE_"+e.toUpperCase()]=e,t),{}),isValidDragObject:mt,getValidTransferData:gt,isValidTransferData:function(t,e,n){return!!gt(t,e,n)},getTransferData:ft,convertToValidDragObject:function t(e,n){if(Array.isArray(e)){const a=e.map(t).filter(Boolean);if(!a.length)return;if(n&&a.length!=e.length)return;const i=a.reduce((t,e)=>(t[e.type]||(t[e.type]=[]),t[e.type].push(e),t),{});return Object.entries(i).map(([t,e])=>e.length>1?{type:t+"-collection",values:e}:e[0])}if(Object.prototype.hasOwnProperty.call(e,"type")&&mt(e))return e;const a=Object.entries(pt).find(([,t])=>!!Object.prototype.hasOwnProperty.call(e,t.id)&&!(t.extras&&!t.extras.every(t=>Object.prototype.hasOwnProperty.call(e,t))));if(!a)return;const[i,s]=a,r={};return r.type=i,r.id=e[s.id],s.extras&&s.extras.forEach(t=>r[t]=e[t]),r},setTransferData:function t(e,n,a=!1){if(a){const t=(Array.isArray(n)?n:[n]).map(t=>{const e=document.createElement("i"),n=document.createElement("span"),a=document.createElement("span");a.className="btn btn-outline-dark bg-light",n.className="small",pt[t.type]?(e.className=pt[t.type].dragIcon||"fa-solid fa-question",n.textContent=t.id):"-collection"==t.type.substr(-11)&&pt[t.type.substr(0,t.type.length-11)]?(a.style.boxShadow="3px 3px var(--bs-btn-border-color)",e.className=pt[t.type.substr(0,t.type.length-11)].dragIcon||"fa-solid fa-question",n.textContent="x"+t.values.length):(e.className="fa-solid fa-question",n.textContent=t.id||""),a.append(e);const i=document.createElement("div");return i.className="d-flex flex-column align-items-center gap-2 small",i.append(a,n),i}),a=document.createElement("div");a.className="d-flex flex-row gap-2 small",a.append(...t),document.body.append(a),e.dataTransfer.setDragImage(a,-25,0),requestAnimationFrame(()=>{document.body.removeChild(a)})}if(Array.isArray(n))return n.forEach(n=>t(e,n));e.dataTransfer.setData("application/fhc-"+n.type,JSON.stringify(n))},eventHasTypes:function(t,e,n){return e&&e.length||(e=ht),e=e.map(t=>"application/fhc-"+t),!![...t.dataTransfer.types].length&&(n?[...t.dataTransfer.types].every(t=>e.includes(t)):e.some(e=>[...t.dataTransfer.types].includes(e)))},bindDragEnterLeave:function(t,e,n){let a=!1,i=!0;function s(n){a=!1,i=!0,window.addEventListener("dragenter",l,!0),window.addEventListener("dragleave",o,!0),window.addEventListener("drop",d,!0),e(n),t.removeEventListener("dragenter",s)}function r(e,a){window.removeEventListener("dragenter",l,!0),window.removeEventListener("dragleave",o,!0),window.removeEventListener("drop",d,!0),n(e,a),t.addEventListener("dragenter",s)}function l(e){i=!1,t==e.target||t.contains(e.target)?a=!0:r(e)}function o(e){if(t==e.target||t.contains(e.target)){if(a)return void(a=!1)}else if(i)return void(i=!1);r(e)}function d(t){r(t,!0)}return t.addEventListener("dragenter",s),()=>{t.removeEventListener("dragenter",s)}}},bt={mounted(t,e,n){if("draggable"==e.arg)t.addEventListener("update-my-value",t=>{t.preventDefault(),e.value=t.detail.item}),t.addEventListener("dragstart",n=>{t.dispatchEvent(new CustomEvent("calendar-dragstart",{cancelable:!0,bubbles:!0,detail:{item:e.value,x:n.offsetX/t.offsetWidth,y:n.offsetY/t.offsetHeight,originalEvent:n}}))}),t.addEventListener("dragend",n=>{t.dispatchEvent(new CustomEvent("calendar-dragend",{cancelable:!0,bubbles:!0,detail:{item:e.value,originalEvent:n}}))});else if("dropcage"==e.arg){let e=null;t.addEventListener("dragover",n=>{if(!e)return e=t.getBoundingClientRect(),t.dispatchEvent(new CustomEvent("calendar-dragenter",{detail:{originalEvent:n}}))}),window.addEventListener("dragleave",n=>{if(!e)return;let a;return a=void 0===n.clientX?{x:n.pageX+document.documentElement.scrollLeft,y:n.pageY+document.documentElement.scrollTop}:{x:n.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,y:n.clientY+document.body.scrollTop+document.documentElement.scrollTop},a.x>e.left+e.width-1||a.xe.top+e.height-1||a.y{if(e)return e=null,t.dispatchEvent(new CustomEvent("calendar-dragleave",{detail:{originalEvent:n}}))})}else"dropzone"==e.arg&&t.addEventListener(e.modifiers.once?"dragenter":"dragover",n=>{const a=e.value instanceof Function?e.value(n):e.value,i=a.timestamp?a:{timestamp:a};t.dispatchEvent(new CustomEvent("calendar-dragchange",{cancelable:!0,bubbles:!0,detail:i}))})},updated(t,e,n,a){"draggable"==e.arg&&t.dispatchEvent(new CustomEvent("update-my-value",{cancelable:!0,detail:{item:e.value}}))}},yt={name:"CalendarDragAndDrop",directives:{CalDnd:bt},provide(){return{events:Vue.computed(()=>this.correctedEvents),backgrounds:Vue.computed(()=>this.backgrounds),dropAllowed:Vue.computed(()=>this.dragging&&this.dropAllowed)}},inject:{mode:"mode",dropableEvents:"dropableEvents"},props:{events:Array,backgrounds:Array},emits:["drop"],data:()=>({dragging:!1,allowed:!1,draggedInternalEvent:null,draggedExternalEvent:null,targetTimestamp:0,targetGridEnds:null,dropAllowed:!1,shadowPreview:!1}),computed:{correctedEvents(){if(this.dragging){if(this.draggedInternalEvent){const t=this.events.findIndex(t=>t.id==this.draggedInternalEvent.id);return this.previewEvent&&!this.shadowPreview?this.events.toSpliced(t,1,this.previewEvent):this.events.toSpliced(t,1)}if(this.previewEvent&&!this.shadowPreview)return[...this.events,this.previewEvent]}return this.events},correctedBackgrounds(){return this.dragging&&this.shadowPreview?[...this.backgrounds,{start:new Date(this.targetTimestamp),class:"shadow-preview"}]:this.backgrounds},previewEvent(){if(!this.dragging||!this.dropAllowed)return null;if(!this.targetTimestamp)return null;const t=this.draggedInternalEvent||this.draggedExternalEvent;if(!t)return null;let e=t.end-t.start;return this.targetGridEnds&&(e=this.targetGridEnds.find(t=>t>=this.targetTimestamp+e)-this.targetTimestamp),{orig:t.orig,start:this.targetTimestamp,end:this.targetTimestamp+e}}},methods:{onDragstart(t){const e=vt.convertToTransferData(t.detail.item.orig);vt.isValidDragObject(e)&&(vt.setTransferData(t.detail.originalEvent,e),this.draggedInternalEvent=t.detail.item)},onDragend(){this.draggedInternalEvent=null,this.dragging=!1},onDragenter(t){if(this.dragging=!0,this.draggedInternalEvent)this.dropAllowed=this.dropableEvents(this.draggedInternalEvent,this.mode);else{const e=vt.getValidTransferData(t.detail.originalEvent);this.draggedExternalEvent=e?{id:e.id,type:e.type,start:e.isostart?luxon.DateTime.fromISO(e.isostart).setZone(this.timezone):luxon.DateTime.local().setZone(this.timezone),end:e.isoend?luxon.DateTime.fromISO(e.isoend).setZone(this.timezone):luxon.DateTime.local().setZone(this.timezone),orig:e}:null,this.dropAllowed=this.dropableEvents(e,this.mode)}},onDragleave(){this.dragging=!1},onDragchange(t){this.targetTimestamp=t.detail.timestamp,this.targetGridEnds=t.detail.ends||null},onDrop(t){this.dragging&&this.dropAllowed&&(this.$emit("drop",t,this.previewEvent.start,this.previewEvent.end),this.dropAllowed=!1,this.dragging=!1)}},template:'\n\t\n\t\t\n\t\n\t'},wt={name:"CalendarHeader",components:{DatePicker:{name:"CalendarHeaderDatepicker",components:{VueDatePicker:VueDatePicker},inject:["locale","timezone"],props:{date:{type:luxon.DateTime,required:!0},mode:{type:String,required:!0},listLength:{type:Number,default:7}},emits:["update:date"],computed:{convertedDate(){return this.date.setZone(this.timezone).setZone("local",{keepLocalTime:!0})},current(){switch(this.mode){case"month":return{month:this.convertedDate.month-1,year:this.convertedDate.year};case"list":return[this.convertedDate.startOf("day").ts,this.convertedDate.startOf("day").plus({days:this.listLength}).ts-1];case"week":return[this.convertedDate.startOf("week",{useLocaleWeeks:!0}).ts,this.convertedDate.endOf("week",{useLocaleWeeks:!0}).ts];case"day":return this.convertedDate;default:return null}},title(){switch(this.mode){case"month":return this.date.toLocaleString({month:"long",year:"numeric"});case"week":var t=this.date.localWeekYear,e=this.date.toFormat("nn");return this.$p.t("calendar/year_kw",{year:t,week:e});case"list":return this.date.toLocaleString(luxon.DateTime.DATE_FULL)+"-"+this.date.plus({days:this.listLength-1}).toLocaleString(luxon.DateTime.DATE_FULL);case"day":return this.date.toLocaleString(luxon.DateTime.DATE_FULL);default:return"View not Supported"}},weekStart(){return luxon.Info.getStartOfWeek(this.date)%7}},methods:{update(t){let e;switch(this.mode){case"month":t.month++,e=luxon.DateTime.fromObject(t).setZone(this.timezone,{keepLocalTime:!0}).setLocale(this.locale);break;case"list":case"week":e=luxon.DateTime.fromJSDate(t[0]).setZone(this.timezone,{keepLocalTime:!0}).setLocale(this.locale);break;case"day":e=luxon.DateTime.fromJSDate(t).setZone(this.timezone,{keepLocalTime:!0}).setLocale(this.locale);break;default:return}this.$emit("update:date",e)},weekNumbers(t){return luxon.DateTime.fromJSDate(t,{locale:this.locale}).localWeekNumber}},template:'\n\t title"\n\t\t:month-picker="mode == \'month\'"\n\t\t:week-picker="mode == \'week\'"\n\t\t:range="mode == \'list\' ? { autoRange: listLength - 1 } : false"\n\t\t:text-input="mode == \'day\'"\n\t\t:week-start="weekStart"\n\t\t:week-numbers="{ type: weekNumbers }"\n\t\t:clearable="false"\n\t\t:enable-time-picker="false"\n\t\t:config="{ keepActionRow: mode != \'month\' }"\n\t\t:action-row="{ showSelect: false, showCancel: false, showNow: mode != \'month\', showPreview: false }"\n\t\tauto-apply\n\t\tsix-weeks\n\t\tteleport\n\t\t:locale="locale"\n\t\t:now-button-label="$p.t(\'calendar/today\')"\n\t\t:week-num-name="$p.t(\'calendar/kw\')"\n\t/>\n\t'}},props:{date:{type:luxon.DateTime,required:!0},mode:{type:String,required:!0},modeOptions:{type:Object,default:{}},btnMonth:Boolean,btnWeek:Boolean,btnDay:Boolean,btnList:Boolean},emits:["next","prev","click:mode","update:date","update:mode"],data:()=>({open:!1}),methods:{clickMode(t,e){this.$emit("click:mode",t),t.defaultPrevented||this.$emit("update:mode",e)}},template:'\n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t
    \n\t
    \n\t'},kt={name:"CalendarSlider",inject:{time:{from:"sliderTime",default:".3s"}},emits:["slid"],data:()=>({target:0,extrasAfter:0,extrasBefore:0,running:!1,promiseResolve:null}),computed:{itemsAfter(){return[...Array(this.extrasAfter)].map((t,e)=>1+e)},itemsBefore(){return[...Array(this.extrasBefore)].map((t,e)=>e-this.extrasBefore)},styleSlider(){const t={position:"absolute",top:0,left:0,width:"100%",height:"100%"};return this.running&&(t.left=100*-this.target+"%",t.transition="left "+this.time+" ease-in-out"),t},styleBefore(){return{position:"absolute",top:0,height:"100%",display:"flex",right:"100%",width:100*this.extrasBefore+"%"}},styleAfter(){return{position:"absolute",top:0,height:"100%",display:"flex",left:"100%",width:100*this.extrasAfter+"%"}}},methods:{prevPage(){return this.slidePages(-1)},nextPage(){return this.slidePages(1)},slidePages(t){return new Promise(e=>{this.promiseResolve=e,this.running=!0;const n=this.target+t;n>0?this.extrasAftern&&(this.extrasBefore=-n),this.target=n})},endSlide(){this.promiseResolve&&(this.promiseResolve(this.target),this.promiseResolve=null),this.$emit("slid",this.target),this.running=!1,this.target=0,this.extrasAfter=this.extrasBefore=0}},template:'\n\t\n\t\t\n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\t\t\n\t\n\t'};const _t=[];function At(t,e,n){const a=_t.findIndex(e=>e.el==t);a>=0&&(t.removeEventListener("click",_t[a].listener),_t.splice(a,1));const i=t=>{t.preventDefault(),t.stopPropagation();const a=new CustomEvent("cal-click",{cancelable:!0,bubbles:!0,detail:{source:e,value:n}});t.target.dispatchEvent(a)};_t.push({el:t,listener:i}),t.addEventListener("click",i)}var xt={mounted(t,e,n){"container"==e.arg?t.addEventListener("cal-click",t=>{const n=new Event("click:"+t.detail.source,{cancelable:!0});if(e.instance.$emit("click:"+t.detail.source,n,t.detail.value),!n.defaultPrevented){const e=new CustomEvent("cal-click-default",{cancelable:!0,bubbles:!0,detail:t.detail});t.target.dispatchEvent(e)}}):At(t,e.arg,e.value)},updated(t,e,n,a){"container"!=e.arg&&At(t,e.arg,e.value)}},$t={name:"CalendarBase",components:{BaseDraganddrop:yt,BaseHeader:wt,BaseSlider:kt,BsModal:s},directives:{CalClick:xt},provide(){return{locale:Vue.computed(()=>this.locale),timezone:Vue.computed(()=>this.timezone),timeGrid:Vue.computed(()=>this.timeGrid),draggableEvents:Vue.computed(()=>this.draggableEvents?Array.isArray(this.draggableEvents)?t=>this.draggableEvents.includes(t.type):this.draggableEvents instanceof Function?this.draggableEvents:()=>!0:()=>!1),dropableEvents:Vue.computed(()=>this.onDrop?Array.isArray(this.dropableEvents)?t=>this.dropableEvents.includes(t.type):this.dropableEvents instanceof Function?this.dropableEvents:()=>!0:()=>!1),hasDragoverFunc:Vue.computed(()=>this.onDragover),mode:Vue.computed(()=>this.mode)}},props:{locale:{type:String,default:"de"},timezone:{type:String,required:!0},date:{type:[Date,String,Number,luxon.DateTime],default:t=>luxon.DateTime.now().setZone(t.timezone).startOf("day")},modes:{type:Object,required:!0,default:{}},mode:String,modeOptions:Object,events:{type:Array,default:[]},backgrounds:{type:Array,default:[]},showBtns:Boolean,btnMonth:{type:Boolean,default:void 0},btnWeek:{type:Boolean,default:void 0},btnDay:{type:Boolean,default:void 0},btnList:{type:Boolean,default:void 0},timeGrid:Array,draggableEvents:[Boolean,Array,Function],dropableEvents:[Boolean,Array,Function],onDragover:Function,onDrop:Function},emits:["click:next","click:prev","click:mode","click:event","click:day","click:week","update:date","update:mode","update:range","drop"],data:()=>({internalView:null,internalDate:null,modalEvent:null}),computed:{convertedEvents(){return this.events.map(t=>({id:t.type+t[t.type+"_id"],type:t.type,start:luxon.DateTime.fromISO(t.isostart).setZone(this.timezone),end:luxon.DateTime.fromISO(t.isoend).setZone(this.timezone),orig:t}))},convertedBackgrounds(){return this.backgrounds.map(t=>{const e={...t};return e.start&&(Number.isInteger(e.start)?e.start=luxon.DateTime.fromMillis(e.start,{zone:this.timezone,locale:this.locale}):e.start instanceof Date?e.start=luxon.DateTime.fromJSDate(e.start,{zone:this.timezone,locale:this.locale}):("string"==typeof e.start||e.start instanceof String)&&(e.start=luxon.DateTime.fromISO(e.start,{zone:this.timezone,locale:this.locale}))),e.end&&(Number.isInteger(e.end)?e.end=luxon.DateTime.fromMillis(e.end,{zone:this.timezone,locale:this.locale}):e.end instanceof Date?e.end=luxon.DateTime.fromJSDate(e.end,{zone:this.timezone,locale:this.locale}):("string"==typeof e.end||e.end instanceof String)&&(e.end=luxon.DateTime.fromISO(e.end,{zone:this.timezone,locale:this.locale}))),e})},sDate(){return this.date instanceof luxon.DateTime?this.date:luxon.DateTime.fromJSDate(new Date(this.date)).setZone(this.timezone)},cDate:{get(){return(this.internalDate?this.internalDate:this.sDate).setLocale(this.locale)},set(t){this.internalDate=t,this.$emit("update:date",t,this.cMode)}},sMode(){let t=this.mode;return t&&(t=t.toLowerCase()),t&&this.modes[t]||(t=Object.keys(this.modes).find(Boolean)),t||""},cMode:{get(){return this.internalView?this.internalView:this.sMode},set(t){this.internalView=t,this.$emit("update:mode",t,this.cDate)}}},watch:{sDate(t,e){this.sDate.isValid&&!this.sDate.hasSame(this.internalDate,"day")&&(this.internalDate=this.sDate)},sMode(){this.sMode&&(this.internalView=this.sMode)}},methods:{clickPrev(){const t=new Event("click:prev",{cancelable:!0});this.$emit("click:prev",t),t.defaultPrevented||this.$refs.mode.prevPage()},clickNext(){const t=new Event("click:next",{cancelable:!0});this.$emit("click:next",t),t.defaultPrevented||this.$refs.mode.nextPage()},handleClickDefaults(t){switch(t.detail.source){case"day":"day"!=this.cMode&&this.modes.day&&(t.stopPropagation(),this.cDate=t.detail.value,this.cMode="day");break;case"week":"week"!=this.cMode&&this.modes.week&&(t.stopPropagation(),this.cDate=luxon.DateTime.fromObject({localWeekNumber:t.detail.value.number,localWeekYear:t.detail.value.year},{zone:this.cDate.zoneName,locale:this.cDate.locale}),this.cMode="week")}},onDropItem(t,e,n){this.$emit("drop",t,e,n)},showEventModal(t){this.modalEvent=t,this.$refs.modal.show()},hideEventModal(){this.modalEvent&&(this.modalEvent.closeFn=void 0),this.$refs.modal.hide(),this.modalEvent=null},onModalHidden(){this.modalEvent.closeFn&&this.modalEvent.closeFn()}},beforeUnmount(){this.hideEventModal()},template:'\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t
    \n\t'},St={getRoomInfo:(t,e,n)=>({method:"post",url:"/api/frontend/v1/LvPlan/getRoomplan",params:{ort_kurzbz:t,start_date:e,end_date:n}}),getLvPlan:(t,e,n)=>({method:"get",url:"/api/frontend/v1/LvPlan/getLvPlan",params:{start_date:t,end_date:e,lv_id:n}}),eventsPersonal:(t,e)=>({method:"post",url:"/api/frontend/v1/lvPlan/eventsPersonal",params:{start_date:t,end_date:e}}),eventsLv:(t,e,n)=>({method:"post",url:"/api/frontend/v1/lvPlan/eventsLv",params:{lv_id:t,start_date:e,end_date:n}}),getStunden:()=>({method:"get",url:"/api/frontend/v1/LvPlan/Stunden"}),getOrtReservierungen:(t,e,n)=>({method:"post",url:`/api/frontend/v1/LvPlan/getReservierungen/${t}`,params:{start_date:e,end_date:n}}),getLvPlanReservierungen:(t,e)=>({method:"post",url:"/api/frontend/v1/LvPlan/getReservierungen",params:{start_date:t,end_date:e}}),getLehreinheitStudiensemester:t=>({method:"get",url:`/api/frontend/v1/LvPlan/getLehreinheitStudiensemester/${t}`}),studiensemesterDateInterval:t=>({method:"get",url:`/api/frontend/v1/LvPlan/studiensemesterDateInterval/${t}`}),LvPlanEvents:(t,e,n)=>({method:"post",url:"/api/frontend/v1/LvPlan/LvPlanEvents",params:{start_date:t,end_date:e,lv_id:n}}),getLv:t=>({method:"get",url:"/api/frontend/v1/LvPlan/getLv/"+t})};var Tt={name:"GridLineEvent",directives:{CalDnd:bt,CalClick:xt},inject:{draggableEvents:"draggableEvents",mode:"mode"},props:{event:{type:Object,required:!0,validator:t=>t.start&&t.end&&t.orig}},computed:{isHeaderOrFooter(){return["header","footer"].includes(this.event.orig)},draggable(){return!this.isHeaderOrFooter&&this.draggableEvents(this.event.orig,this.mode)},classes(){const t=[];return this.isHeaderOrFooter?t.push("event-"+this.event.orig):(this.event.startsHere&&t.push("event-begin"),this.event.endsHere&&t.push("event-end")),t}},template:'\n\t\n\t\t\n\t\t\t{{ event.orig }}\n\t\t\n\t\n\t'},zt={name:"CalendarGrid",components:{GridLine:{name:"GridLine",components:{LineEvent:Tt,LineBackground:{name:"GridLineBackground",inject:{flipAxis:"flipAxis"},props:{start:{type:luxon.DateTime,required:!0},end:{type:luxon.DateTime,required:!0},background:{type:Object,required:!0,validator:t=>!(!t.start&&!t.end)&&((!t.start||t.start instanceof luxon.DateTime)&&(!t.end||t.end instanceof luxon.DateTime))}},computed:{styles(){if(!this.background.endsHere&&!this.background.startsHere)return this.background.style;const t=(this.end.ts-this.start.ts)/100;let e={};return this.background.startsHere&&(e[this.flipAxis?"left":"top"]=this.background.start.diff(this.start)/t+"%"),this.background.endsHere&&(e[this.flipAxis?"right":"bottom"]=this.end.diff(this.background.end)/t+"%"),this.background.style?[this.background.style,e]:e},classes(){if(!this.background.endsHere&&!this.background.startsHere)return this.background.class;const t=[];return this.background.class&&t.push(this.background.class),this.background.startsHere&&t.push("bg-begin"),this.background.endsHere&&t.push("bg-end"),t}},template:'\n\t\n\t\t{{ background.label }}\n\t\n\t'}},inject:{axisRow:"axisRow"},props:{date:{type:luxon.DateTime,required:!0},start:{type:luxon.DateTime,required:!0},end:{type:luxon.DateTime,required:!0},events:{type:Array,default:[]},backgrounds:{type:Array,default:[]}},computed:{eventsWithRowInfo(){const t=[];return this.events.forEach(e=>{const n=[1,-1];e.startsHere&&(n[0]="t_"+e.start.diff(this.date).toMillis()),e.endsHere&&(n[1]="t_"+e.end.diff(this.date).toMillis()),t.push({...e,rows:n})}),t}},template:'\n\t\n\t\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t'},GridLineEvent:Tt},directives:{CalDnd:bt},inject:{originalEvents:"events",originalBackgrounds:"backgrounds",dropAllowed:"dropAllowed"},provide(){return{flipAxis:Vue.computed(()=>this.flipAxis),axisRow:Vue.computed(()=>this.axisRow)}},props:{axisMain:{type:Array,required:!0,validator:t=>t.every(t=>t instanceof luxon.DateTime)},axisParts:{type:Array,required:!0,validator:t=>t.every(t=>t instanceof luxon.Duration||Number.isInteger(t)||(t.start instanceof luxon.Duration||Number.isInteger(t.start))&&(t.end instanceof luxon.Duration||Number.isInteger(t.end)))},flipAxis:Boolean,allDayEvents:Boolean,axisMainCollapsible:Boolean,snapToGrid:Boolean},data:()=>({dragging:!1,resizeObserver:null,mutationObserver:null,userScroll:!0}),computed:{axisRow(){return this.flipAxis?"column":"row"},axisCol(){return this.flipAxis?"row":"column"},axisPartsWithBreaks(){return this.axisParts.reduce((t,e,n)=>{const a=e.start||e,i=e.end;if(t.length){const e=t.pop();Array.isArray(e)?t.push({start:e[0],end:a,index:e[1]}):e!=a&&t.push({start:e,end:a})}return i?(t.push({start:a,end:i,index:n}),t.push(i)):t.push([a,n]),t},[]).slice(0,-1)},axisPartsSave(){return this.axisParts[this.axisParts.length-1].end?this.axisParts:this.axisParts.slice(0,-1)},start(){return this.axisPartsWithBreaks[0].start},end(){return this.axisPartsWithBreaks[this.axisPartsWithBreaks.length-1].end},ends(){const t=[],e=this.axisPartsWithBreaks.filter(t=>void 0!==t.index).map(t=>t.end);for(var n of this.axisMain)for(var a of e)t.push(n.plus(a));return t},axisMainBorders(){return this.axisMain.reduce((t,e)=>t.concat([e.plus(this.start),e.plus(this.end)]),[])},eventsAllDay(){return this.allDayEvents?this.mapIntoMainAxis(this.originalEvents.filter(t=>t.orig.allDayEvent)):[]},eventsNormal(){return this.allDayEvents?this.mapIntoMainAxis(this.originalEvents.filter(t=>!t.orig.allDayEvent)):this.events},events(){return this.mapIntoMainAxis(this.originalEvents)},backgrounds(){return this.mapIntoMainAxis(this.originalBackgrounds)},hasValidEvents(){return this.events.find(t=>t.length)},styleGridCols(){let t="repeat("+this.axisMain.length+", 1fr)";return this.axisMainCollapsible&&this.hasValidEvents&&(t=this.events.map(t=>t.length?"1fr":"var(--fhc-calendar-axis-collapsible, .5fr)").join(" ")),t},styleGridRows(){const t={};return this.axisPartsWithBreaks.forEach(e=>{let n=e.start.toMillis();t[n]||(t[n]=["t_"+n]),void 0!==e.index&&t[n].push("ps_"+e.index),n=e.end.toMillis(),t[n]||(t[n]=["t_"+n]),void 0!==e.index&&t[n].push("pe_"+e.index)}),this.eventsNormal.forEach((e,n)=>{let a=this.axisMain[n];e.forEach(e=>{if(e.startsHere||e.endsHere){if(e.startsHere){let n=e.start.diff(a).toMillis();t[n]||(t[n]=["t_"+n,"e_"+n])}if(e.endsHere){let n=e.end.diff(a).toMillis();t[n]||(t[n]=["t_"+n,"e_"+n])}}})}),Object.keys(t).sort((t,e)=>parseInt(t)-parseInt(e)).map((e,n,a)=>{let i=a[n+1];return i?"["+t[e].join(" ")+"] "+(i-e)+"fr":(t[e].push("end"),"["+t[e].join(" ")+"]")}).join(" ")}},methods:{mapIntoMainAxis(t){const e=Array.from({length:this.axisMain.length},()=>Array());return t.forEach(t=>{const n=t.start||this.axisMainBorders[0].plus(-1),a=t.end||this.axisMainBorders[this.axisMainBorders.length-1].plus(1);for(var i=0;is){const l=n>=s,o=a<=r;e[i].push({...t,startsHere:l,endsHere:o})}}}),e},getPageTop(t){let e=t.offsetTop;return t.offsetParent&&(e+=this.getPageTop(t.offsetParent)),e},getPageLeft(t){let e=t.offsetLeft;return t.offsetParent&&(e+=this.getPageLeft(t.offsetParent)),e},getTimestampFromMouse(t,e){let n,a;return this.flipAxis?(n=t.pageX-this.getPageLeft(this.$refs.body)+this.$refs.main.scrollLeft,a=n/this.$refs.body.offsetWidth):(n=t.pageY-this.getPageTop(this.$refs.body)+this.$refs.main.scrollTop,a=n/this.$refs.body.offsetHeight),e+this.start+Math.floor((this.end-this.start)*a)},enableAutoScroll(){this.resizeObserver||(this.resizeObserver=new ResizeObserver(this.scrollToEarliestEvent)),this.resizeObserver.observe(this.$refs.body),this.mutationObserver||(this.mutationObserver=new MutationObserver(t=>{t.some(t=>t.addedNodes.length&&[].some.call(t.addedNodes,t=>t.matches&&t.matches(".fhc-calendar-base-grid-line-event")))&&this.scrollToEarliestEvent()})),this.mutationObserver.observe(this.$refs.body,{subtree:!0,childList:!0}),this.scrollToEarliestEvent()},disableAutoScroll(){this.resizeObserver&&this.resizeObserver.disconnect(),this.resizeObserver=null,this.mutationObserver&&this.mutationObserver.disconnect(),this.mutationObserver=null},scrollToEarliestEvent(){const t=this.$refs.scroller.querySelectorAll(".fhc-calendar-base-grid-line-event");let e=[0,null];for(var n of t.values()){const t=n.offsetTop;(!e[1]||t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\t'},Dt={name:"LabelDay",directives:{CalClick:xt},props:{date:{type:luxon.DateTime,required:!0}},computed:{titleFull(){return this.date.toLocaleString({day:"numeric",month:"long",year:"numeric"})},titleLong(){return this.date.toLocaleString({day:"2-digit",month:"2-digit",year:"numeric"})},titleShort(){return this.date.toLocaleString({day:"numeric",month:"numeric"})},titleNarrow(){return this.date.toLocaleString({day:"numeric"})}},template:'\n\t\n\t\t{{ titleFull }}\n\t\t{{ titleLong }}\n\t\t{{ titleShort }}\n\t\t{{ titleNarrow }}\n\t\n\t'},Et={name:"LabelDow",directives:{CalClick:xt},props:{date:{type:luxon.DateTime,required:!0}},computed:{titleLong(){return this.date.toLocaleString({weekday:"long"})},titleShort(){return this.date.toLocaleString({weekday:"short"})},titleNarrow(){return this.date.toLocaleString({weekday:"narrow"})}},template:'\n\t\n\t\t{{ titleLong }}\n\t\t{{ titleShort }}\n\t\t{{ titleNarrow }}\n\t\n\t'},Ct={name:"LabelTime",props:{part:{type:[luxon.Duration,Number,Object],required:!0,validator(t){if(t instanceof Object){if(t instanceof luxon.Duration)return!0;let e=!0,n=!0;return t.start&&(e=t.start instanceof luxon.Duration||Number.isInteger(t.start)),t.end&&(n=t.end instanceof luxon.Duration||Number.isInteger(t.end)),e&&n}return!0}}},computed:{sanitizedTimestamps(){return this.part.start||this.part.end?this.part:{start:this.part}},start(){return this.sanitizedTimestamps.start?this.formatTime(this.sanitizedTimestamps.start):null},end(){return this.sanitizedTimestamps.end?this.formatTime(this.sanitizedTimestamps.end):null}},methods:{formatTime:t=>t.toISOTime({suppressSeconds:!0})},template:'\n\t
    \n\t\t{{ start }}\n\t\t-\n\t\t{{ end }}\n\t
    \n\t'};var Ot={name:"ModeDay",components:{BaseSlider:kt,DayView:{name:"DayView",components:{CalendarGrid:zt,LabelDay:Dt,LabelDow:Et,LabelTime:Ct},inject:{timeGrid:"timeGrid",originalEvents:"events",timezone:"timezone"},props:{day:{type:luxon.DateTime,required:!0},emptyMessage:String,emptyMessageDetails:String},emits:["requestModalOpen","requestModalClose"],data:()=>({chosenEvent:null,gridMainRef:null}),computed:{axisMain(){return[this.day.startOf("day")]},axisParts(){return this.timeGrid?this.timeGrid.map(t=>({start:luxon.Duration.fromISOTime(t.start),end:luxon.Duration.fromISOTime(t.end)})):Array.from({length:17},(t,e)=>luxon.Duration.fromObject({hours:e+7}))},events(){return this.originalEvents.filter(t=>t.startthis.day).sort((t,e)=>t.start.ts-e.start.ts).map(t=>t.orig)},currentEvent(){if(this.chosenEvent&&this.events.find(t=>t==this.chosenEvent))return this.chosenEvent;let t=null;return this.events&&(t=this.events.find(Boolean)),t&&"loading"==t.type?null:t},isToday(){return this.day.hasSame(luxon.DateTime.now().setZone(this.timezone),"day")}},watch:{compact(){this.compact?this.chosenEvent&&this.$emit("requestModalOpen",{event:this.chosenEvent,closeFn:()=>{this.chosenEvent=null}}):this.$emit("requestModalClose")}},methods:{handleClickDefaults(t){"event"==t.detail.source&&(this.chosenEvent=t.detail.value,this.compact&&this.$emit("requestModalOpen",{event:this.chosenEvent,closeFn:()=>{this.chosenEvent=null}}))}},setup(){const t=Vue.ref(null),{compact:e}=function(t,e){const n=Vue.ref(!1),a=Vue.ref(!1),i=Vue.ref(!1),s=Vue.computed(()=>Vue.isRef(t)?t.value&&t.value.$el?t.value.$el:t.value:t),r=Vue.computed(()=>{const t=Vue.isRef(e)?e.value:e;return Number.isInteger(t)?[["compact",t]]:Array.isArray(t)?t.map((t,e)=>[e,t]).sort((t,e)=>t[1]-e[1]):Object.entries(t).sort((t,e)=>t[1]-e[1])});function l(){if(void 0===s.value.offsetWidth)return;const t=r.value.find(t=>t[1]>s.value.offsetWidth);a.value=t?t[0]:"full",n.value=a.value==r.value[0][0]}const o=new ResizeObserver(()=>{s.value&&l()});function d(){s.value&&(l(),o.observe(s.value),i.value=!0)}function c(){i.value&&o.disconnect()}return Vue.onMounted(d),Vue.onUnmounted(c),Vue.watchEffect(()=>{s.value&&(c(),d())}),{compact:n,size:a}}(t,750);return{container:t,compact:e}},mounted(){this.gridMainRef=this.$refs.grid.$refs.main},template:'\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t{{ emptyMessage }}\n\t\t\t\n\t\t\n\t\t
    \n\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t\t

    {{ emptyMessageDetails }}

    \n\t\t\t\n\t\t\n\t\n\t'}},props:{currentDate:{type:luxon.DateTime,required:!0}},emits:["update:currentDate","update:range","click","requestModalOpen","requestModalClose"],data(){return{focusDate:this.currentDate,rangeOffset:0}},computed:{range(){let t=this.focusDate.startOf("day"),e=this.focusDate.endOf("day");return 0!=this.rangeOffset&&(this.rangeOffset<0?t=t.plus({days:this.rangeOffset}):e=e.plus({days:this.rangeOffset})),luxon.Interval.fromDateTimes(t,e)}},watch:{currentDate(){this.currentDate.locale!=this.focusDate.locale?(this.focusDate=this.currentDate,this.$emit("update:range",this.range)):(this.rangeOffset=this.currentDate.startOf("day").diff(this.focusDate.startOf("day"),"days").days,this.rangeOffset&&(this.$refs.view.$refs.grid.disableAutoScroll(),this.$emit("update:range",this.range),this.$refs.slider.slidePages(this.rangeOffset).then(this.updatePage)))}},methods:{prevPage(){this.rangeOffset=this.$refs.slider.target-1,this.$refs.view.$refs.grid.disableAutoScroll(),this.$emit("update:range",this.range),this.$refs.slider.prevPage().then(this.updatePage)},nextPage(){this.rangeOffset=this.$refs.slider.target+1,this.$refs.view.$refs.grid.disableAutoScroll(),this.$emit("update:range",this.range),this.$refs.slider.nextPage().then(this.updatePage)},updatePage(t){const e=this.focusDate.plus({days:t});this.focusDate=e,this.rangeOffset=0,this.$emit("update:currentDate",this.focusDate),this.$emit("update:range",this.range),this.$refs.view.$refs.grid.enableAutoScroll()},viewAttrs(t){const e=this.focusDate.plus({days:t});return{...this.$attrs,day:e}}},mounted(){this.$emit("update:range",this.range),this.$refs.view.$refs.grid.enableAutoScroll()},template:'\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\t'},Pt={name:"ModeWeek",components:{BaseSlider:kt,WeekView:{name:"WeekView",components:{CalendarGrid:zt,LabelDay:Dt,LabelDow:Et,LabelTime:Ct},inject:{timeGrid:"timeGrid",timezone:"timezone"},props:{day:{type:luxon.DateTime,required:!0},collapseEmptyDays:Boolean},computed:{start(){return this.day.startOf("week",{useLocaleWeeks:!0})},axisMain(){return Array.from({length:7},(t,e)=>this.start.plus({days:e}))},axisParts(){return this.timeGrid?this.timeGrid.map(t=>({start:luxon.Duration.fromISOTime(t.start),end:luxon.Duration.fromISOTime(t.end)})):Array.from({length:17},(t,e)=>luxon.Duration.fromObject({hours:e+7}))}},methods:{isToday(t){return t.hasSame(luxon.DateTime.now().setZone(this.timezone),"day")}},template:'\n\t
    \n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t
    \n\t'}},props:{currentDate:{type:luxon.DateTime,required:!0}},emits:["update:currentDate","update:range","click","requestModalOpen"],data(){return{focusDate:this.currentDate,rangeOffset:0}},computed:{range(){let t=this.focusDate.startOf("week",{useLocaleWeeks:!0}),e=this.focusDate.endOf("week",{useLocaleWeeks:!0});return 0!=this.rangeOffset&&(this.rangeOffset<0?t=t.plus({weeks:this.rangeOffset}):e=e.plus({weeks:this.rangeOffset})),luxon.Interval.fromDateTimes(t,e)}},watch:{currentDate(){this.currentDate.locale!=this.focusDate.locale?(this.focusDate=this.currentDate,this.$emit("update:range",this.range)):(this.rangeOffset=this.currentDate.startOf("week",{useLocaleWeeks:!0}).diff(this.focusDate.startOf("week",{useLocaleWeeks:!0}),"weeks").weeks,this.rangeOffset&&(this.$refs.view.$refs.grid.disableAutoScroll(),this.$emit("update:range",this.range),this.$refs.slider.slidePages(this.rangeOffset).then(this.updatePage)))}},methods:{prevPage(){this.rangeOffset=this.$refs.slider.target-1,this.$refs.view.$refs.grid.disableAutoScroll(),this.$emit("update:range",this.range),this.$refs.slider.prevPage().then(this.updatePage)},nextPage(){this.rangeOffset=this.$refs.slider.target+1,this.$refs.view.$refs.grid.disableAutoScroll(),this.$emit("update:range",this.range),this.$refs.slider.nextPage().then(this.updatePage)},updatePage(t){const e=this.focusDate.plus({weeks:t});this.focusDate=e,this.rangeOffset=0,this.$emit("update:currentDate",this.focusDate),this.$emit("update:range",this.range),this.$refs.view.$refs.grid.enableAutoScroll()},viewAttrs(t){const e=this.focusDate.plus({weeks:t});return{...this.$attrs,day:e}},handleClickDefaults(t){switch(t.detail.source){case"day":this.$emit("update:currentDate",t.detail.value);break;case"event":this.$emit("requestModalOpen",{event:t.detail.value})}}},mounted(){this.$emit("update:range",this.range),this.$refs.view.$refs.grid.enableAutoScroll()},template:'\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\t'},Ft={name:"ModeMonth",components:{BaseSlider:kt,MonthView:{name:"MonthView",components:{CalendarGrid:zt,LabelWeek:{name:"LabelWeek",directives:{CalClick:xt},props:{date:{type:luxon.DateTime,required:!0}},computed:{weeks(){const t=this.date.startOf("week",{useLocaleWeeks:!0}),e=this.date.endOf("week",{useLocaleWeeks:!0}),n=[{number:t.localWeekNumber,year:t.localWeekYear},{number:e.localWeekNumber,year:e.localWeekYear}];return n[0].number==n[1].number&&n.pop(),n}},template:'\n\t
    \n\t\t\n\t\t\t{{ week.number }}\n\t\t\n\t
    \n\t'},LabelDow:Et,LabelDay:Dt},provide(){return{events:Vue.computed(()=>{const t=this.events.map(t=>{const e=t.start.startOf("day"),n=t.end.plus({days:1}).startOf("day");return{...t,start:e,end:n}});for(var e=5;e>-1;e--)for(var n=6;n>-1;n--){const a=this.axisMain[e].plus(this.axisParts[n]);t.unshift({start:a,end:a.plus({days:1}),orig:"header"})}return t})}},inject:{events:"events",timezone:"timezone"},props:{day:{type:luxon.DateTime,required:!0}},computed:{axisMain(){const t=this.day.startOf("month").startOf("week",{useLocaleWeeks:!0});return Array.from({length:6},(e,n)=>t.plus({weeks:n}))},axisParts:()=>Array.from({length:8},(t,e)=>luxon.Duration.fromObject({days:e}))},methods:{isToday(t){return t.hasSame(luxon.DateTime.now().setZone(this.timezone),"day")}},template:'\n\t
    \n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t
    \n\t'}},props:{currentDate:{type:luxon.DateTime,required:!0}},emits:["update:currentDate","update:range","click","requestModalOpen"],data(){return{focusDate:this.currentDate,rangeOffset:0}},computed:{range(){let t=this.focusDate.startOf("month").startOf("week",{useLocaleWeeks:!0}),e=t.plus({days:41}).endOf("day");if(0!=this.rangeOffset){const n=this.focusDate.plus({months:this.rangeOffset}).startOf("month").startOf("week",{useLocaleWeeks:!0});this.rangeOffset<0?t=n:e=n.plus({days:41}).endOf("day")}return luxon.Interval.fromDateTimes(t,e)}},watch:{currentDate(){this.currentDate.locale!=this.focusDate.locale?(this.focusDate=this.currentDate,this.$emit("update:range",this.range)):(this.rangeOffset=this.currentDate.startOf("month").diff(this.focusDate.startOf("month"),"months").months,this.rangeOffset&&(this.$emit("update:range",this.range),this.$refs.slider.slidePages(this.rangeOffset).then(this.updatePage)))}},methods:{prevPage(){this.rangeOffset=this.$refs.slider.target-1,this.$emit("update:range",this.range),this.$refs.slider.prevPage().then(this.updatePage)},nextPage(){this.rangeOffset=this.$refs.slider.target+1,this.$emit("update:range",this.range),this.$refs.slider.nextPage().then(this.updatePage)},updatePage(t){const e=this.focusDate.plus({months:t});this.focusDate=e,this.rangeOffset=0,this.$emit("update:currentDate",this.focusDate),this.$emit("update:range",this.range)},viewAttrs(t){return{day:this.focusDate.plus({months:t})}},handleClickDefaults(t){switch(t.detail.source){case"week":let e=luxon.DateTime.fromObject({localWeekNumber:t.detail.value.number,localWeekYear:t.detail.value.year},{zone:this.currentDate.zoneName,locale:this.currentDate.locale});this.focusDate.hasSame(e.startOf("week",{useLocaleWeeks:!0}),"month")?this.focusDate.hasSame(e.endOf("week",{useLocaleWeeks:!0}),"month")||this.$emit("update:currentDate",e.endOf("week",{useLocaleWeeks:!0})):this.$emit("update:currentDate",e.startOf("week",{useLocaleWeeks:!0}));break;case"day":this.$emit("update:currentDate",t.detail.value);break;case"event":this.$emit("requestModalOpen",{event:t.detail.value})}}},mounted(){this.$emit("update:range",this.range)},template:'\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\t'},It={name:"CalendarLvPlan",components:{FhcCalendar:$t},inject:["renderers"],props:{timezone:{type:String,required:!0},date:{type:[Date,String,Number,luxon.DateTime],default:luxon.DateTime.local()},mode:{type:String,default:"Week"},getPromiseFunc:{type:Function,required:!0}},emits:["update:date","update:mode","update:range"],data(){return{modes:{day:Vue.markRaw(Ot),week:Vue.markRaw(Pt),month:Vue.markRaw(Ft)},modeOptions:{day:{emptyMessage:Vue.computed(()=>this.$p.t("lehre/noLvFound")),emptyMessageDetails:Vue.computed(()=>this.$p.t("lehre/noLvFound"))},week:{collapseEmptyDays:!1}},teachingunits:null}},computed:{backgrounds(){let t=luxon.DateTime.now().setZone(this.timezone);return"Month"==this.mode?[{class:"background-past",end:t.startOf("day")}]:[{class:"background-past",end:t,label:t.startOf("minute").toISOTime({suppressSeconds:!0,includeOffset:!1})}]}},methods:{eventStyle(t){if(t.farbe)return"--event-bg:#"+t.farbe},updateRange(t){this.rangeInterval=t,this.$emit("update:range",t)}},setup(t,e){const n=Vue.ref(null),{events:a,lv:i}=function(t,e){let n=0;const a=Vue.ref([]),i=Vue.ref([]),s=Vue.computed(()=>a.value.concat(i.value)),r=Vue.ref(null),l=[],o=(t,e)=>Array.isArray(t)?e.concat(t):(e.push(t),e),d=(t,a)=>{let s=[];if(l.length)if(l[l.length-1]+1==t.ts)l[l.length-1]=a.ts;else if(l[l.length-1]a.ts)l.unshift(t.ts,a.ts);else{let e=l.findIndex(e=>e>=t.ts);if(e%2){if(l[e]>=a.ts)return[];let n=e==l.length-1;if(n||l[e+1]>a.ts){let i=l[e]+1;t=t.plus(i-t.ts),n||l[e+1]!=a.ts+1?l[e]=a.ts:l.splice(e,2)}else{if(l[e+2]=a.ts)return[];let n=l[e+1]+1;s=o(d(t.plus(n-t.ts),a),s)}else{if(l[e+1]=a.ts?s:(i.value.push({loading_id:n++,type:"loading",isostart:t.toISODate()+"T"+t.toISOTime(),isoend:a.toISODate()+"T"+a.toISOTime()}),o(e(t,a),s))};return Vue.watchEffect(()=>{const e=Vue.toValue(t);if(!(e instanceof luxon.Interval))return;const n=d(e.start,e.end);Promise.allSettled(n).then(t=>{t.forEach(t=>{"fulfilled"===t.status&&"success"===t.value.meta.status&&(t.value.meta.lv&&(r.value=t.value.meta.lv),a.value=a.value.concat(t.value.data),i.value=[])})})}),{events:s,lv:r}}(n,t.getPromiseFunc);return Vue.watch(i,t=>{e.emit("update:lv",t)}),{rangeInterval:n,events:a,lv:i}},created(){this.$api.call(St.getStunden()).then(t=>this.teachingunits=t.data.map(t=>({id:t.stunde,start:t.beginn,end:t.ende})))},template:'\n\t\n\t\t\n\t\t\n\t'},Mt={getAuthUID:()=>({method:"get",url:"/api/frontend/v1/AuthInfo/getAuthUID"}),getAuthInfo:()=>({method:"get",url:"/api/frontend/v1/AuthInfo/getAuthInfo"})};var Lt={name:"LvPlanLehrveranstaltung",components:{FhcCalendar:It},props:{viewData:Object,propsViewData:Object},data:()=>({lv:null}),computed:{currentDay(){return!this.propsViewData?.focus_date||isNaN(new Date(this.propsViewData?.focus_date))?luxon.DateTime.now().setZone(this.viewData.timezone).toISODate():this.propsViewData?.focus_date},currentMode(){return this.propsViewData?.mode&&["day","week","month"].includes(this.propsViewData?.mode.toLowerCase())?this.propsViewData?.mode:"Week"},currentLv(){return isNaN(parseInt(this.propsViewData?.lv_id))?null:this.propsViewData.lv_id},lvTitle(){return null===this.currentLv?"":this.lv?"English"===this.$p.user_language.value?this.lv.bezeichnung_english:this.lv.bezeichnung:""}},methods:{handleChangeDate(t,e){return this.handleChangeMode(e,t)},handleChangeMode(t,e){const n=t[0].toUpperCase()+t.slice(1),a=e.toISODate();this.$router.push({name:"LvPlan",params:{mode:n,focus_date:a,lv_id:this.currentLv}})},getPromiseFunc(t,e){return[this.$api.call(St.eventsLv(this.propsViewData.lv_id,t.toISODate(),e.toISODate())),this.$api.call(St.getLvPlanReservierungen(t.toISODate(),e.toISODate()))]}},created(){null!==this.currentLv&&this.$api.call(St.getLv(this.propsViewData?.lv_id)).then(t=>{this.lv=t.data})},template:'\n\t
    \n\t\t

    \n\t\t\t{{ $p.t(\'lehre/stundenplan\') }}\n\t\t\t\n\t\t\t\t{{ lvTitle }}\n\t\t\t\n\t\t

    \n\t\t
    \n\t\t
    \n\t\t\t{{ $p.t(\'lehre/noLvFound\') }}\n\t\t
    \n\t\t\n\t
    '};var Rt={name:"LvPlanPersonal",components:{FhcCalendar:It},props:{viewData:Object,propsViewData:Object},data:()=>({studiensemester_kurzbz:null,studiensemester_start:null,studiensemester_ende:null,uid:null,isMitarbeiter:!1,isStudent:!1}),computed:{currentDay(){return!this.propsViewData?.focus_date||isNaN(new Date(this.propsViewData?.focus_date))?luxon.DateTime.now().setZone(this.viewData.timezone).toISODate():this.propsViewData?.focus_date},currentMode(){return this.propsViewData?.mode&&["day","week","month"].includes(this.propsViewData?.mode.toLowerCase())?this.propsViewData?.mode:"Week"},downloadLinks(){if(!this.studiensemester_start||!this.studiensemester_ende||!this.uid)return!1;let t=!1;if(t=this.isStudent?"student":t,t=this.isMitarbeiter?"lektor":t,!1===t)return;const e={zone:this.viewData.timezone},n=luxon.DateTime.fromISO(this.studiensemester_start,e).toUnixInteger(),a=luxon.DateTime.fromISO(this.studiensemester_ende,e).toUnixInteger(),i=FHC_JS_DATA_STORAGE_OBJECT.app_root+"cis/private/lvplan/stpl_kalender.php?type="+t+"&pers_uid="+this.uid+"&begin="+n+"&ende="+a;return[{title:"excel",icon:"fa-solid fa-file-excel",link:i+"&format=excel"},{title:"csv",icon:"fa-solid fa-file-csv",link:i+"&format=csv"},{title:"ical1",icon:"fa-regular fa-calendar",link:i+"&format=ical&version=1&target=ical"},{title:"ical2",icon:"fa-regular fa-calendar",link:i+"&format=ical&version=2&target=ical"}]}},methods:{handleChangeDate(t,e){return this.handleChangeMode(e,t)},handleChangeMode(t,e){const n=t[0].toUpperCase()+t.slice(1),a=e.toISODate();this.$router.push({name:"MyLvPlan",params:{mode:n,focus_date:a}})},updateRange(t){this.$api.call(St.studiensemesterDateInterval(t.end.startOf("week").toISODate())).then(t=>{this.studiensemester_kurzbz=t.data.studiensemester_kurzbz,this.studiensemester_start=t.data.start,this.studiensemester_ende=t.data.ende})},getPromiseFunc(t,e){return[this.$api.call(St.eventsPersonal(t.toISODate(),e.toISODate())),this.$api.call(St.getLvPlanReservierungen(t.toISODate(),e.toISODate()))]}},created(){this.$api.call(Mt.getAuthInfo()).then(t=>{this.uid=t.data.uid,this.isMitarbeiter=t.data.isMitarbeiter,this.isStudent=t.data.isStudent})},template:'\n\t
    \n\t\t

    \n\t\t\t{{ $p.t(\'lehre/stundenplan\') }}\n\t\t\t\n\t\t\t\t{{ studiensemester_kurzbz }}\n\t\t\t\n\t\t

    \n\t\t
    \n\t\t\n\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ title }}\n\t\t\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\n\t'},Nt={components:{BsModal:s},mixins:[s],props:{pruefungenData:null|Array,bezeichnung:String,onHideBsModal:Function,onHiddenBsModal:Function,onHidePreventedBsModal:Function,onShowBsModal:Function,onShownBsModal:Function},data:()=>({result:!0}),mounted(){this.modal=this.$refs.modalContainer.modal},popup(t){return s.popup.bind(this)(null,t)},template:'\n\t\t\n\t\t\n\t'},Bt={getStudentenMail:t=>({method:"get",url:"/api/frontend/v1/Lehre/lvStudentenMail",params:{lehreinheit_id:t}}),getLvInfo:(t,e)=>({method:"get",url:`/api/frontend/v1/Lehre/LV/${t}/${e}`}),getStudentPruefungen:t=>({method:"get",url:`/api/frontend/v1/Lehre/Pruefungen/${t}`})};const jt={};var Ut={props:{studien_semester:String,lehrveranstaltung_id:Number},data:()=>({bezeichnung:null,studiengang_kuerzel:null,semester:null,orgform_kurzbz:null,sprache:null,ects:null,incoming:null,result:!0,info:null}),computed:{lektorNamesLinks(){let t={};return this.info.lektoren.forEach(e=>{let n=((e.titelpre||"")+" "+(e.vorname||"")+" "+(e.nachname||"")+" "+(e.titelpost||"")).trim();t[n]=FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+`/Cis/Profil/View/${e.uid}`}),t},lektorNames(){return this.info.lektoren.map(t=>((t.titelpre||"")+" "+(t.vorname||"")+" "+(t.nachname||"")+" "+(t.titelpost||"")).trim())},lvLeitung(){return this.info.lvLeitung&&this.info.lvLeitung.length?this.info.lvLeitung.map(t=>((t.titelpre||"")+" "+(t.vorname||"")+" "+(t.nachname||"")+" "+(t.titelpost||"")).trim()):null},oe(){return this.info.oe.organisationseinheittyp?this.info.oe.organisationseinheittyp+" "+this.info.oe.bezeichnung:""},oeLeitung(){return this.info.oeLeitung&&this.info.oeLeitung.length?this.info.oeLeitung.map(t=>((t.titelpre||"")+" "+(t.vorname||"")+" "+(t.nachname||"")+" "+(t.titelpost||"")).trim()):["-"]},koordinator(){return this.info.koordinator&&this.info.koordinator.length?this.info.koordinator.map(t=>((t.titelpre||"")+" "+(t.vorname||"")+" "+(t.nachname||"")+" "+(t.titelpost||"")).trim()):null},currentLang(){return this.info?this.info.lastLang?this.info.lastLang:this.info.lvinfo?this.info.lvinfoDefaultLang&&this.info.lvinfo[this.info.lvinfoDefaultLang]?this.info.lvinfoDefaultLang:Object.keys(this.info.lvinfo).shift():null:null}},created(){this.$api.call(Bt.getLvInfo(this.studien_semester,this.lehrveranstaltung_id)).then(t=>t.data).then(t=>{Object.assign(this,{bezeichnung:t.bezeichnung,studiengang_kuerzel:t.studiengang_kuerzel,semester:t.semester,orgform_kurzbz:t.orgform_kurzbz,sprache:t.sprache,ects:t.ects,incoming:t.incoming??"-"})}),jt[this.lehrveranstaltung_id]?this.info=jt[this.lehrveranstaltung_id]:axios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/components/Cis/Mylv/Info/"+this.studien_semester+"/"+this.lehrveranstaltung_id).then(t=>{this.info=jt[this.lehrveranstaltung_id]=t.data.retval||[]}).catch(()=>this.info={})},template:'\n\t\t\t

    {{$p.t(\'lvinfo/lehrveranstaltungsinformationen\')}}

    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    {{$p.t(\'lehre/lehrveranstaltung\')}}{{bezeichnung}}
    {{$p.t(\'lehre/studiengang\')}}{{studiengang_kuerzel}}
    {{$p.t(\'lehre/semester\')}}{{semester}}
    {{$p.t(\'lehre/studiensemester\')}}{{studien_semester}}
    {{$p.t(\'lehre/organisationsform\')}}{{orgform_kurzbz}}
    {{$p.t(\'lehre/lehrbeauftragter\')}}\n\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t{{name}}\n\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
    {{$p.t(\'lehre/lvleitung\')}}\n\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t{{name}}\n\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    {{$p.t(\'global/sprache\')}}{{sprache}}
    {{$p.t(\'lehre/ects\')}}{{ects}}
    {{$p.t(\'lehre/incomingplaetze\')}}{{incoming}}
    {{$p.t(\'lehre/organisationseinheit\')}}\n\t\t\t\t\t\t\t\t{{oe}}
    \n\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t{{$p.t(\'global/leitung\')}}: {{oeLeitung.join(\', \')}}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t
    \n\t\n\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    '};const Vt={},Ht={};function Gt(t,e){return t.filter(t=>t.category==e).reduce((t,e)=>(t[e.phrase]||(t[e.phrase]=e.text),t),{})}function qt(t){for(;Ht[t].length;){var e=Ht[t].pop();e[0].value=Jt(t,e[1],e[2]),Vue.triggerRef(e[0])}}function Jt(t,e,n){let a=Vt[t][e];return a?(n&&(a=a.replace(/\{([^}]*)\}/g,(t,e)=>void 0===n[e]?t:n[e])),a):"<< PHRASE "+e+">>"}const Wt={t_ref(t,e,n){if(void 0===n&&(Array.isArray(t)&&2==t.length||t.split&&2==t.split("/").length)&&(n=e,[t,e]=t.split?t.split("/"):t),void 0===e)return console.error("invalid input"),"";if(!Vt[t]){var a="";if(void 0!==window.FHC_JS_PHRASES_STORAGE_OBJECT){var i=Gt(FHC_JS_PHRASES_STORAGE_OBJECT,t);void 0!==i[e]&&(a=i[e])}if(!Vt[t]||0===Object.keys(Vt[t]).length){Vt[t]=void 0;let i=Vue.ref(a);return function(t,e,n,a){if(Ht[t])return Ht[t].push([e,n,a]),void(Vt[t]&&qt(t));Ht[t]=[[e,n,a]],axios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/components/Phrasen/loadModule/"+t).then(e=>{e.data.retval?Vt[t]=Gt(e.data.retval,t):Vt[t]={},qt(t)}).catch(t=>console.error(t))}(t,i,e,n),i}}var s=Jt(t,e,n);return Vue.ref(s)},t(t,e,n){return Vue.unref(this.t_ref(t,e,n))}};var Zt={data:()=>({p:Wt})},Kt={props:{menu:{type:Array,default:null},containerStyles:Array,rowStyles:Array,hasLvPlanEintraege:{required:!1,default:!0,type:Boolean}},data:()=>({}),methods:{c4_disabled:function(t){return!this.c4_link(t)&&!t.c4_moodle_links?.length||("addon_fhtw_menu_lvplan_lva"==t.id&&!this.hasLvPlanEintraege||null)},c4_target:function(t){return t.c4_moodle_links?.length>0?null:t.c4_target??null},c4_link:t=>t?Array.isArray(t.c4_moodle_links)&&t.c4_moodle_links.length?null:t.c4_link??null:null,getMenuName(t){return t.phrase?this.$p.t(t.phrase):t.name}},template:'\n\t
    {{$p.t(\'lehre\',\'lehrveranstaltungsUnavailable\')}}
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t

    {{ getMenuName(menuItem) }}

    \n\t\t\t\t\t\t
    {{text}}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n\t'},Yt={getLvMenu:(t,e)=>({method:"get",url:`/api/frontend/v1/LvMenu/getLvMenu/${t}/${e}`})},Qt={props:{event:{type:Object,required:!0,default:null},studiensemester:{type:String,required:!1,default:null},titel:{type:String,required:!1,default:null},preselectedMenu:{type:Object,required:!1,default:null}},data:()=>({result:!1,menu:[],isMenuSelected:!1,hasLvPlanEintraege:!0,lvEvaluierungMessage:""}),mixins:[s],components:{BsModal:s,LvMenu:Kt},inject:["studium_studiensemester"],methods:{hiddenModal:function(){this.isMenuSelected=!1},showModal:function(){if(this.preselectedMenu?this.isMenuSelected=!0:this.$api.call(Yt.getLvMenu(this.event.lehrveranstaltung_id,this.studiensemester??this.event.studiensemester_kurzbz)).then(t=>{t.data&&(this.menu=t.data)}),this.studium_studiensemester&&this.$fhcApi.factory.studium.getLvEvaluierungInfo(this.studium_studiensemester,this.event.lehreinheit_id??this.event.lehrveranstaltung_id).then(t=>t.data).then(t=>{this.lvEvaluierungMessage=t.message}),this.studiensemester&&this.event)return this.$fhcApi.factory.studium.getLvPlanForStudiensemester(this.studiensemester,this.event.lehreinheit_id??this.event.lehrveranstaltung_id).then(t=>t.data).then(t=>{Array.isArray(t)&&t.length>0?this.hasLvPlanEintraege=!0:this.hasLvPlanEintraege=!1})}},mounted(){this.modal=this.$refs.modalContainer},beforeUnmount(){this.$refs.modalContainer.hide()},template:'\n \n\n\t\t\n \n \n \n\n \n '},Xt={components:{MylvSemesterStudiengang:{components:{MylvSemesterStudiengangLv:{components:{LvUebersicht:Qt},mixins:[Zt],inject:["studien_semester"],props:{lehrveranstaltung_id:Number,bezeichnung:String,bezeichnung_eng:String,module:String,farbe:String,lvinfo:Boolean,benotung:Boolean,lvnote:String,lvnotebez:Array,znote:String,znotebez:Array,studiengang_kuerzel:String,semester:[String,Number],orgform_kurzbz:String,sprache:String,ects:String,incoming:Number,positiv:Boolean,note_index:String},data:()=>({pruefungenData:null,info:null,menu:null,preselectedMenuItem:null}),computed:{gradeColor(){if(null!=this.positiv)return this.positiv?"var(--fhc-success)":"var(--fhc-danger)"},is_organisatorische_einheit(){return"organisatorische_einheit"==this.menu},emptyMenu(){return!this.menu||!Array.isArray(this.menu)||Array.isArray(this.menu)&&0==this.menu.length},bodyStyle:()=>({}),grade(){const t="English"===this.$p.user_language.value?1:0;return this.benotung&&this.znotebez?.length?this.znotebez[t]:this.benotung&&this.lvnotebez?.length?this.lvnotebez[t]:null},LvHasPruefungenInformation(){return this.pruefungenData&&this.pruefungenData.length>0}},methods:{fetchMenu(t=this.lehrveranstaltung_id,e=this.studien_semester){return this.$api.call(Yt.getLvMenu(t,e)).then(t=>{this.menu=t.data}).catch(t=>{this.$fhcAlert.handleSystemError(t),this.menu=[]})},c4_link:t=>t?Array.isArray(t.c4_moodle_links)&&t.c4_moodle_links.length?"#":t.c4_link??null:null,openLvOption(t){"core_menu_mailanstudierende"==t.id||"core_menu_digitale_anwesenheitslisten"==t.id?window.location.href=t.c4_link:(this.preselectedMenuItem=t,Vue.nextTick(()=>{this.$refs.lvUebersicht.show()}))},openPruefungen(){this.LvHasPruefungenInformation&&Nt.popup({pruefungenData:this.pruefungenData,bezeichnung:this.bezeichnung})},openInfos(){this.info||(this.info=!0,Ut.popup({lehrveranstaltung_id:this.lehrveranstaltung_id,bezeichnung:this.bezeichnung,bezeichnung_eng:this.bezeichnung_eng,studiengang_kuerzel:this.studiengang_kuerzel,semester:this.semester,studien_semester:this.studien_semester,orgform_kurzbz:this.orgform_kurzbz,sprache:this.sprache,ects:this.ects,incoming:this.incoming}).then(()=>this.info=!1).catch(()=>this.info=!1))}},watch:{studien_semester(t){this.fetchMenu(this.lehrveranstaltung_id,t)}},created(){this.$api.call(Bt.getStudentPruefungen(this.lehrveranstaltung_id)).then(t=>t.data).then(t=>{this.pruefungenData=t})},mounted(){this.fetchMenu(this.lehrveranstaltung_id,this.studien_semester)},template:'
    \n\t\t\n\n\t\t
    \n\t\t\t\x3c!-- {{module}} if the module of the lv is important then query the module from the api endpoint for LV--\x3e\n\t\t\t
    {{ $p.t(\'lehre/organisationseinheit\') }}:
    \n\t\t\t
    {{$p.user_language.value === \'English\' ? bezeichnung_eng : bezeichnung}}
    \n\t\t
    \n\t\t
    \n\t\t\t\n\t\t\t\n\t\t
    \n\t\t\n\t
    '}},mixins:[Zt],props:{bezeichnung:String,kuerzel:String,semester:[String,Number],lvs:Array,sg_bezeichnung_eng:String},computed:{lehrveranstaltungen(){return[...new Map(this.lvs.map(t=>[t.lehrveranstaltung_id,t])).values()]}},methods:{note:t=>t.benotung&&(t.znote||t.lvnote)||null},template:'
    \n\t\t
    \n\t\t\t

    {{$p.user_language.value === \'English\' ? sg_bezeichnung_eng : bezeichnung}} - {{kuerzel}}\n\t\t\t\t{{semester}}.{{$p.t(\'lehre/semester\')}}\n\t\t\t

    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    '}},provide(){return{studien_semester:Vue.computed(()=>this.semester)}},props:{semester:[String,Number],lvs:Array},computed:{ready(){return null!==this.lvs},studiengaenge(){return[...new Map(this.lvs.map(t=>[t.studiengang_kz+"#"+t.semester,{studiengang_kz:t.studiengang_kz,bezeichnung:t.sg_bezeichnung,sg_bezeichnung_eng:t.sg_bezeichnung_eng,kuerzel:t.studiengang_kuerzel,semester:t.semester}])).values()].sort((t,e)=>t.bezeichnung.toLowerCase()==e.bezeichnung.toLowerCase()?t.semester>e.semester:t.bezeichnung.toLowerCase()>e.bezeichnung.toLowerCase())}},methods:{lvsForStudiengang(t){return this.lvs.filter(e=>e.studiengang_kz==t.studiengang_kz&&e.semester==t.semester)}},template:'
    \n\t\t\n\t
    \n\t
    \n\t\t\n\t
    '},te={components:{MylvSemester:Xt},mixins:[Zt],data:()=>({firstLoad:!0,studiensemester:null,lvs:{},currentSemester:null}),computed:{ready(){return null!==this.studiensemester&&(!this.firstLoad||null!==this.current.lvs)},current(){return null===this.currentSemester?{semester:null,lvs:[]}:(void 0===this.lvs[this.currentSemester]&&(this.lvs[this.currentSemester]={semester:this.currentSemester,lvs:null},axios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/components/Cis/Mylv/Lvs/"+this.currentSemester).then(t=>{this.lvs[this.currentSemester].lvs=t.data.retval||[],this.firstLoad=!1})),this.lvs[this.currentSemester])},nearestSem(){let t=Date.now(),e=null,n=0;return this.studiensemester.forEach(a=>{let i=new Date(a.start),s=new Date(a.ende);if(t>=i&&t<=s)return e=a.studiensemester_kurzbz,void(n=0);let r=Math.min(Math.abs(t-i),Math.abs(t-s));(null===e||r{this.studiensemester=t.data.retval||[];const e=this.$route.params.studiensemester;e&&this.studiensemester.filter(t=>t.studiensemester_kurzbz==e).length?this.currentSemester=e:this.currentSemester=this.nearestSem})},beforeRouteUpdate(t,e,n){t.params.studiensemester&&this.studiensemester.filter(e=>e.studiensemester_kurzbz==t.params.studiensemester).length&&t.params.studiensemester!=this.currentSemester&&(this.currentSemester=t.params.studiensemester),n()},template:'\n\n\t

    {{$p.t(\'lehre/myLV\')}}

    \n\t
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t\t\n\t\t\n\t
    \n\t
    \n\t\t\n\t
    '};const ee={emits:["dataFetched"],props:{refresh:{type:Boolean},apiFunction:{required:!0,type:Function},apiFunctionParameters:{}},watch:{refresh:function(t,e){this.fetchData()}},data:function(){return{loading:!1,error:!1,errorMessage:null}},created:function(){this.fetchData()},methods:{fetchData:function(){if(this.loading=!0,this.error=!1,this.errorMessage=null,"function"==typeof this.apiFunction){let t=this.apiFunction(this.apiFunctionParameters);t instanceof Promise?t.then(this.successHandler).catch(this.errorHandler).finally(this.finallyHandler):this.setError("The called apiFunction does not return a Promise")}else this.setError("Property apiFunction is not a function")},setError:function(t){this.loading=!1,this.error=!0,this.errorMessage=t},successHandler:function(t){this.$emit("dataFetched",t?t.data:void 0)},errorHandler:function(t){t.response?.data?.retval?this.setError(t.response.data.retval):t.data?.message?this.setError(t.data.message):this.setError(t.message)},finallyHandler:function(){this.loading=!1}},template:'\n\t\t\n\t\t\t
    Loading...
    \n\t\t
    \n\t\t\n\t\t\t
    {{ errorMessage }}
    \n\t\t
    \n\t\t\n\t'},ne="Filter Component New Filter";var ae={props:{filters:{type:Array,default:[]},columns:{type:Array,default:[]},fields:{type:Array,default:[]}},emits:{switchFilter:["filterId"],applyFilterConfig:["filterFields"],saveCustomFilter:["customFilterName"]},data:function(){return{currentFields:[]}},computed:{types(){return this.columns.reduce((t,e)=>{let n=e.type.toLowerCase();return n.indexOf("int")>=0?t[e.name]="Numeric":n.indexOf("varchar")>=0||n.indexOf("text")>=0||n.indexOf("bpchar")>=0?t[e.name]="Text":n.indexOf("timestamp")>=0||n.indexOf("date")>=0?t[e.name]="Date":t[e.name]="",t},{})}},watch:{fields(t){this.currentFields=t}},methods:{switchFilter(t){this.$emit("switchFilter",t.currentTarget.value)},applyFilterConfig(){const t=this.currentFields.filter(t=>t.name!=ne);t.filter(t=>""==t.condition).length?alert("Please fill all the filter options"):this.$emit("applyFilterConfig",t)},addField(t){this.currentFields.push({name:ne})},removeField(t){this.currentFields.splice(t,1)}},template:'\n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t
    \n\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\tFilter {{ index + 1 }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\n\t\t\t\t\t\t\x3c!-- Numeric --\x3e\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t\x3c!-- Text --\x3e\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t\x3c!-- Timestamp and date --\x3e\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\n\t\t\t\t\x3c!-- Filter save options --\x3e\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n\t'},ie={props:{fields:Array,selected:{type:Array,default:[]},names:{type:Object,default:{}}},emits:{hide:["fieldName"],show:["fieldName"]},data:function(){return{selectedFields:[]}},watch:{selected(t){this.selectedFields=t}},methods:{toggle(t){-1!=this.selectedFields.indexOf(t)?(this.selectedFields.splice(this.selectedFields.indexOf(t),1),this.$emit("hide",t)):(this.selectedFields.push(t),this.$emit("show",t))}},template:'\n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\t{{ names[fieldToDisplay] || fieldToDisplay }}\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t\n\t'};const se={jsonLines:"fa-file-lines",xlsx:"fa-file-excel",pdf:"fa-file-pdf",html:"fa-file-code",json:"fa-file",csv:"fa-file-csv"},re={jsonLines:"Download as JSONLINES",xlsx:"Download as XLSX",pdf:"Download as PDF",html:"Download as HTML",json:"Download as JSON",csv:"Download as CSV "};var le={props:{tabulator:Object,config:{type:[Boolean,String,Function,Array,Object],default:!1},iconClass:[String,Array,Object]},computed:{currentConfig(){if(!this.config)return!1;let t=this.config;if(t instanceof Function)return[t];if(null===t)return[];if(!0===this.config&&(t=["csv"]),"[object String]"===Object.prototype.toString.call(t)&&(t=t.split(",")),"object"==typeof t&&!Array.isArray(t)){let i=[];for(var e in t){var n,a=t[e];a&&("[object String]"===Object.prototype.toString.call(a)?null!==(n=this.stringToFileFormatter(a))?i.push({icon:"fa-solid "+se[n],label:a===e?re[n]:e,formatter:n}):null!==(n=this.stringToFileFormatter(e))?i.push({icon:"fa-solid "+se[n],label:a,formatter:n}):alert("neither "+e+" nor "+a+" are supported download file types"):"object"!=typeof a||Array.isArray(a)?null!==(n=this.stringToFileFormatter(e))?i.push({icon:"fa-solid "+se[n],label:re[n],formatter:n}):alert(e+" is not a supported download file type"):null!==(n=this.stringToFileFormatter(e))?(void 0===a.formatter&&(a.formatter=n),void 0===a.label&&(a.label=re[n]),void 0===a.icon&&(a.icon=se[n]),i.push(a)):(void 0===a.label&&(a.label=e),i.push(a)))}t=i}if(Array.isArray(t)){if(t=t.map(t=>{if("[object String]"===Object.prototype.toString.call(t)){let e=this.stringToFileFormatter(t);return null===e?null:{icon:"fa-solid "+se[e],label:re[e],formatter:e}}if(t instanceof Function)return{formatter:t};if("object"==typeof t&&!Array.isArray(t)&&null!==t){if(t.formatter instanceof Function)return t;if(this.validateFileFormatter(t.formatter))return t}return null}).filter(t=>null!==t),t.length<2)return t;if(t.filter(t=>t.label||t.icon).length==t.length)return t;alert("Config not valid")}return[]}},methods:{stringToFileFormatter(t){let e=t.toLowerCase();return"jsonlines"==e?"jsonLines":["xlsx","pdf","html","json","csv"].includes(e)?e:null},validateFileFormatter(t){let e=this.stringToFileFormatter(t);if(!e)return alert(t+" is not a supported file formatter"),!1;if("xlsx"==e&&!window.XLSX)return alert("XLSX Library not loaded"),!1;if("pdf"==e){if(!window.jspdf)return alert("jsPDF Library not loaded"),!1;if(!new jspdf.jsPDF({}).autoTable)return alert("jsPDF-AutoTable Plugin not loaded"),!1}return!0},download(t){this.tabulator.download(t.formatter,t.file,t.options)}},template:'\n\t\n\t'};const oe=new WeakMap;var de={mounted(t,e){let n=!1;oe.set(t,e=>{if(!n)return;if(t.contains(e.target))return;const a=bootstrap.Collapse.getInstance(t);a&&a.hide()}),t.addEventListener("shown.bs.collapse",()=>{n=!0}),t.addEventListener("hide.bs.collapse",()=>{n=!1}),document.addEventListener("click",oe.get(t),!0)},beforeUnmount(t,e){document.removeEventListener("click",oe.get(t)),delete t.collapsibleAutoHideFunc}};window.Tabulator?.extendModule("layout","modes",{fitDataStretchFrozen(t,e){var n=0,a=this.table.rowManager.element.clientWidth,i=0,s=!1;t.forEach((t,e)=>{t.widthFixed||t.reinitializeWidth(),(this.table.options.responsiveLayout?t.modules.responsive.visible:t.visible&&!t.definition.frozen)&&(s=t),t.visible&&(n+=t.getWidth())}),s?(i=a-n+s.getWidth(),this.table.options.responsiveLayout&&this.table.modExists("responsiveLayout",!0)&&(s.setWidth(0),this.table.modules.responsiveLayout.update()),i>0?s.setWidth(i):s.reinitializeWidth()):this.table.options.responsiveLayout&&this.table.modExists("responsiveLayout",!0)&&this.table.modules.responsiveLayout.update()}});var ce={saveCustomFilter:t=>({method:"post",url:"/api/frontend/v1/filter/saveCustomFilter",params:{filterUniqueId:t.filterUniqueId,filterType:t.filterType,customFilterName:t.customFilterName}}),removeCustomFilter:t=>({method:"post",url:"/api/frontend/v1/filter/removeCustomFilter",params:{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterId:t.filterId}}),applyFilterFields:t=>({method:"post",url:"/api/frontend/v1/filter/applyFilterFields",params:{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterFields:t.filterFields}}),addFilterField:t=>({method:"post",url:"/api/frontend/v1/filter/addFilterField",params:{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterField:t.filterField}}),removeFilterField:t=>({method:"post",url:"/api/frontend/v1/filter/removeFilterField",params:{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterField:t.filterField}}),getFilterById:t=>({method:"get",url:"/api/frontend/v1/filter/getFilter",params:{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterId:t.filterId}}),getFilter:t=>({method:"get",url:"/api/frontend/v1/filter/getFilter",params:{filterUniqueId:t.filterUniqueId,filterType:t.filterType}})},ue=0;const pe={components:{CoreFetchCmpt:ee,FilterConfig:ae,FilterColumns:ie,TableDownload:le},directives:{collapseAutoClose:de},emits:["nwNewEntry","click:new","tableBuilt","uuidDefined"],props:{onNwNewEntry:Function,title:String,description:String,sideMenu:{type:Boolean,default:!0},filterType:{type:String},tabulatorOptions:Object,tabulatorEvents:Array,tableOnly:Boolean,noColumnFilter:Boolean,reload:Boolean,reloadBtnInfotext:String,download:{type:[Boolean,String,Function,Array,Object],default:!1},newBtnShow:Boolean,newBtnClass:[String,Array,Object],newBtnDisabled:Boolean,newBtnLabel:String,uniqueId:String,idField:String,parentIdField:String,countOnly:Boolean,useSelectionSpan:{type:Boolean,default:!0}},data:function(){return{uuid:0,filterName:null,filterActive:!1,fields:null,dataset:null,datasetMetadata:null,selectedFields:null,filterFields:null,availableFilters:null,selectedFilter:null,fetchCmptRefresh:!1,fetchCmptApiFunction:null,fetchCmptApiFunctionParams:null,fetchCmptDataFetched:null,fetchResult:null,tabulator:null,tableBuilt:!1,tabulatorHasSelector:!1,selectedData:[],persistence:{sort:!0,columns:!0,filter:!1,headerFilter:!1,group:!1,page:!1}}},computed:{notSelectedFields(){return this.fields&&this.selectedFields?this.fields.filter(t=>-1===this.selectedFields.indexOf(t)):null},filteredData(){return this.dataset?JSON.parse(JSON.stringify(this.dataset)):[]},filteredColumns(){let t=JSON.parse(JSON.stringify(this.fields))||[],e=JSON.parse(JSON.stringify(this.selectedFields))||[],n=null;if(this.tabulatorOptions&&this.tabulatorOptions.hasOwnProperty("columns")&&(n=this.tabulatorOptions.columns),!Array.isArray(n)||Array.isArray(n)&&n.length=0,n.push(t)}}else for(let a of n)a.visible=e.indexOf(a.field)>=0||-1==t.indexOf(a.field),a.hasOwnProperty("resizable")&&(a.resizable=a.visible);return n},fieldIdsForVisibilty(){return this.tableBuilt?this.tabulator.getColumns().filter(t=>{let e=t.getDefinition();return!e.frozen&&e.title&&"responsiveCollapse"!=e.formatter}).map(t=>t.getField()):[]},fieldNames(){return this.tableBuilt?this.tabulator.getColumns().reduce((t,e)=>(t[e.getField()]=e.getDefinition().title,t),{}):{}},idExtra(){return this.uuid?"-"+this.uuid:""},columnsForFilter(){if(!this.filteredColumns||!this.datasetMetadata)return[];const t=this.filteredColumns.reduce((t,e)=>(t[e.field]=e.title,t),{});return this.datasetMetadata.map(e=>({...e,title:t[e.name]}))}},methods:{reloadTable(){this.tableOnly?this.tabulator.setData():this.getFilter()},async initTabulator(){let t="< Phrasen Plugin not loaded! >";this.$p&&(await this.$p.loadCategory("ui"),t=this.$p.t("ui/keineDatenVorhanden")),this.tableOnly||await new Promise(t=>{const e=window.location.hash?window.location.hash.slice(1):null,n=e=>{this.setRenderData(e),t()};null===e?this.startFetchCmpt(t=>this.$api.call(ce.getFilter(t)),null,n):this.startFetchCmpt(t=>this.$api.call(ce.getFilterById(t)),{filterId:e},n)});let e={layout:"fitDataStretchFrozen",movableColumns:!0,columnDefaults:{tooltip:!0},placeholder:t,persistence:this.persistence,...this.tabulatorOptions||{}};if(void 0===e.height&&void 0===e.minHeight&&void 0===e.maxHeight&&(e.height=500),this.tableOnly?e.columns.forEach(t=>{void 0===t.visible&&(t.visible=!0)}):(e.data=this.filteredData,e.columns=this.filteredColumns),(e.selectable||e.columns&&e.columns.filter(t=>"rowSelection"==t.formatter).length)&&(this.tabulatorHasSelector=!0),this.idField&&(this.parentIdField&&(e.dataTree=!0),e.index=this.idField),this.tabulator=new Tabulator(this.$refs.table,e),Array.isArray(this.tabulatorEvents)&&this.tabulatorEvents.length>0)for(let t of this.tabulatorEvents)this.tabulator.on(t.event,t.handler);this.tabulator.on("tableBuilt",()=>{this.tableBuilt=!0,this.$emit("tableBuilt")}),this.tabulator.on("rowSelectionChanged",t=>{this.selectedData=t}),this.parentIdField&&this.idField&&this.tabulator.on("dataLoading",t=>{let e=[];for(let n=0;n{const t=this.tabulator.getColumns();this.fields=t.map(t=>t.getField()),this.selectedFields=t.filter(t=>t.isVisible()).map(t=>t.getField()),this.tabulator.options.persistence.headerFilter&&this._setHeaderFilter()}),this.tabulator.on("dataFiltered",t=>{this.filterActive=t.length>0})},updateTabulator(){this.tabulator&&(this.tableBuilt?this._updateTabulator():this.tabulator.on("tableBuilt",this._updateTabulator))},_updateTabulator(){this.tabulatorHasSelector=this.tabulatorOptions.selectable||this.filteredColumns.filter(t=>"rowSelection"==t.formatter).length,this.tabulator.setColumns(this.filteredColumns),this.tabulator.setData(this.filteredData),this._setHeaderFilter()},clearFilters(){this.tabulator.getHeaderFilters().forEach(t=>{this.tabulator.setHeaderFilterValue(t.field,"")}),this.tabulator.clearFilter(),this.filterActive=!1},_setHeaderFilter(){this.tabulator.getHeaderFilters().forEach(t=>{this.tabulator.setHeaderFilterValue(t.field,t.value)})},getFilter(){null===this.selectedFilter?this.startFetchCmpt(t=>this.$api.call(ce.getFilter(t)),null,this.render):this.startFetchCmpt(t=>this.$api.call(ce.getFilterById(t)),{filterId:this.selectedFilter},this.render)},setRenderData(t){this.fetchResult=t,this.filterName=t.filterName,this.dataset=t.dataset,this.datasetMetadata=t.datasetMetadata,this.fields=t.fields,this.selectedFields=t.selectedFields,this.filterFields=[];for(let e=0;ethis.$api.call(ce.saveCustomFilter(t)),{customFilterName:t},this.getFilter)},handlerRemoveCustomFilter(t){let e=t.currentTarget.getAttribute("href").substring(1);e===this.selectedFilter&&(this.selectedFilter=null),this.startFetchCmpt(t=>this.$api.call(ce.removeCustomFilter(t)),{filterId:e},this.getFilter)},handlerGetFilterById:function(t){let e=null,n=t.currentTarget.getAttribute("href");e=null==n?t.currentTarget.value:n.substring(1),this.switchFilter(e)},switchFilter(t){this.selectedFilter=t,this.getFilter()},applyFilterConfig(t){this.selectedFilter=null,this.startFetchCmpt(t=>this.$api.call(ce.applyFilterFields(t)),{filterFields:t},this.getFilter)},appendChild(t,e){let n=e[this.parentIdField];for(let a=0;a{this.tableOnly||(this.selectedFilter=window.location.hash?window.location.hash.slice(1):null,this.render(this.fetchResult))})},template:'\n\t\t\x3c!-- Load filter data --\x3e\n\t\t\n\t\t\n\n\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\t\t
    \n\t\t
    \n\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t{{ selectedData.length }} ausgewählt\n\t\t\t\t\t\t Mit {{ selectedData.length }} ausgewählten:\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t[ {{ filterName }} ]\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\n\t\t\t\n\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t\n\n\t\t\x3c!-- Tabulator --\x3e\n\t\t
    \n\t'};var he={props:{data:Object,title:{type:String}},data:()=>({}),created(){},template:'\n\t'},me={props:{data:{type:String}},data:()=>({}),template:"\n
    \n
    \n {{$p.t('profil','fhAusweisStatus',[data])}}\n
    \n
    "},ge={props:{data:{type:String},title:{type:String,required:!0},mobile:{type:Boolean,default:!1}},methods:{hideCollapse:function(){this.collapseOpen=!1},showCollapse:function(){this.collapseOpen=!0}},data:()=>({collapseOpen:!1}),template:'\n
    \n \n \n
    '},fe={props:{data:Object,view:String,withZustelladresse:{type:Boolean,default:!0}},data:()=>({}),created(){},template:'\n \n
    \n \n \x3c!-- column 1 in the address row --\x3e\n
    \n \n
    \n \n
    \n
    \n
    {{$p.t(\'person\',\'strasse\')}}
    \n {{data.strasse}} \n
    \n
    \n \n \x3c!-- column 2 in the address row --\x3e\n
    \n
    \n
    {{$p.t(\'global\',\'typ\')}}
    \n {{data.typ}} \n
    \n
    \n \n
    \n
    \n
    {{$p.t(\'person\',\'ort\')}}
    \n {{data.ort}} \n
    \n
    \n
    \n
    \n
    {{$p.t(\'person\',\'plz\')}}
    \n {{data.plz}} \n
    \n
    \n\n
    \n
    \n
    {{$p.t(\'person\',\'zustelladresse\')}}
    \n
    \n \n
    \n
    \n
    \n
    \n'},ve={props:{view:String,data:Object},data:()=>({}),created(){},template:'\n\t\n'},be={data:()=>({}),props:{title:{type:String,required:!0},data:{type:Array}},template:'\n
    \n
    \n {{title}}\n
    \n
    \n \x3c!-- HIER SIND DIE EMAILS --\x3e\n
    \n
    \n\t\t\t\t\n
    \n
    \n
    \n
    '},ye={data:()=>({}),props:{data:{type:Object},title:{type:String}},inject:{studiengang_kz:{from:"studiengang_kz",default:!1}},computed:{getLinkGruppeListe(){return!1===this.studiengang_kz?"":this.data.gruppe?.value&&this.data.verband?.value&&this.data.semester?.value?FHC_JS_DATA_STORAGE_OBJECT.app_root+"cis/private/stud_in_grp.php?kz="+this.studiengang_kz+"&sem="+this.data.semester.value+"&verband="+this.data.verband.value+"&grp="+this.data.gruppe.value:""},getLinkVerbandListe(){return!1===this.studiengang_kz?"":this.data.verband?.value&&this.data.semester?.value?FHC_JS_DATA_STORAGE_OBJECT.app_root+"cis/private/stud_in_grp.php?kz="+this.studiengang_kz+"&sem="+this.data.semester.value+"&verband="+this.data.verband.value:""},getLinkSemesterListe(){return!1===this.studiengang_kz?"":this.data.semester?.value?FHC_JS_DATA_STORAGE_OBJECT.app_root+"cis/private/stud_in_grp.php?kz="+this.studiengang_kz+"&sem="+this.data.semester.value:""}},created(){},template:'\n
    \n
    {{title}}
    \n
    \n
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{entry.label }}
    \n\t\t\t\n\t\t\t\t\t\t\x3c!-- print Telefon link --\x3e\n\t\t\t\t\t\t{{entry.value ?? \'-\'}}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\x3c!-- print semester link --\x3e\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ entry.value }}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\x3c!-- print verband link --\x3e\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ entry.value }}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\x3c!-- print gruppe link --\x3e\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ entry.value }}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\x3c!-- else print information --\x3e\n\t\t\t\t\t\t{{ entry.value ?? \'-\'}}\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    '},we={profilViewData(t){let e="/api/frontend/v1/Profil/profilViewData";return t&&(e+=`/${t}`),{method:"get",url:e}},fotoSperre:t=>({method:"get",url:`/api/frontend/v1/Profil/fotoSperre/${t}`}),isStudent:t=>({method:"get",url:"/api/frontend/v1/Profil/isStudent",params:{uid:t}}),isMitarbeiter:t=>({method:"get",url:`/api/frontend/v1/Profil/isMitarbeiter/${t}`}),getZustellAdresse:()=>({method:"get",url:"/api/frontend/v1/Profil/getZustellAdresse"}),getZustellKontakt:()=>({method:"get",url:"/api/frontend/v1/Profil/getZustellKontakt"}),getGemeinden:(t,e)=>({method:"get",url:`/api/frontend/v1/Profil/getGemeinden/${t}/${e}`}),getAllNationen:()=>({method:"get",url:"/api/frontend/v1/Profil/getAllNationen"})},ke={components:{DmsItem:{emits:["delete"],props:{modelValue:{type:[File,Object],required:!0}},data:()=>({preview:""}),watch:{modelValue(t){"application/x.fhc-dms+json"==t.type&&t.text().then(t=>{const e=JSON.parse(t);this.preview=e.preview||""})}},template:'\n\t
  • \n\t\t\n\t\t{{ modelValue.name }}\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t
  • '}},emits:["update:modelValue"],props:{modelValue:{type:[FileList,Array],required:!0},multiple:Boolean,id:String,name:String,inputClass:[String,Array,Object],noList:Boolean,accept:{type:String,default:""},disabled:{type:Boolean,default:!1}},methods:{stringifyFile:t=>JSON.stringify({lastModified:t.lastModified,lastModifiedDate:t.lastModifiedDate,name:t.name,size:t.size,type:t.type}),addFiles(t){if(!this.multiple)return this.$emit("update:modelValue",t.target.files);const e=new DataTransfer,n=[];for(var a of this.modelValue)e.items.add(a),n.push(this.stringifyFile(a));for(var a of t.target.files)n.indexOf(this.stringifyFile(a))<0&&e.items.add(a);this.$emit("update:modelValue",e.files)},removeFile(t){const e=Array.from(this.modelValue)[t],n=new DataTransfer;for(var a of this.modelValue)a!==e&&n.items.add(a);this.$emit("update:modelValue",n.files)}},watch:{modelValue(t){if(!t)return;if(t instanceof FileList){if(!this.$refs.upload)return;return this.$refs.upload.files=t}const e=new DataTransfer;for(var n of t)if(n instanceof File)e.items.add(n);else{const t=new File([JSON.stringify(n)],n.name,{type:"application/x.fhc-dms+json"});e.items.add(t)}this.$emit("update:modelValue",e.files)}},template:'\n\t
    \n\t\t\n\t\t
      \n\t\t\t\n\t\t\t\n\t\t
    \n\t
    '},_e={ +getStatus:function(){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/getStatus",{})},getTopic:function(){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/getTopic",{})},acceptProfilRequest:function({profil_update_id:t,uid:e,status_message:n,topic:a,requested_change:i}){return this.$fhcApi.post(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/acceptProfilRequest",{profil_update_id:t,uid:e,status_message:n,topic:a,requested_change:i})},denyProfilRequest:function({profil_update_id:t,uid:e,topic:n,status_message:a}){return this.$fhcApi.post(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/denyProfilRequest",{profil_update_id:t,uid:e,topic:n,status_message:a})},insertFile:function(t,e=null){return this.$fhcApi.post(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+`/api/frontend/v1/ProfilUpdate/insertFile/${e}`,t)},getProfilRequestFiles:function(t){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+`/api/frontend/v1/ProfilUpdate/getProfilRequestFiles/${t}`,{})},selectProfilRequest:function(t=null,e=null){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/selectProfilRequest",{...t?{uid:t}:{},...e?{id:e}:{}})},insertProfilRequest:function(t,e,n=null){return this.$fhcApi.post(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/insertProfilRequest",{topic:t,payload:e,...n?{fileID:n}:{}})},updateProfilRequest:function(t,e,n,a=null){return this.$fhcApi.post(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/updateProfilRequest",{topic:t,payload:e,ID:n,...a?{fileID:a}:{}})},deleteProfilRequest:function(t){return this.$fhcApi.post(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/ProfilUpdate/deleteProfilRequest",{requestID:t})}},D={getRoomInfo(t,e,n){return this.$fhcApi.post("/api/frontend/v1/LvPlan/getRoomplan",{ort_kurzbz:t,start_date:e,end_date:n})},getStunden(){return this.$fhcApi.get("/api/frontend/v1/LvPlan/Stunden",{})},getOrtReservierungen(t,e,n){return this.$fhcApi.post(`/api/frontend/v1/LvPlan/getReservierungen/${t}`,{start_date:e,end_date:n})},getLvPlanReservierungen(t,e){return this.$fhcApi.post("/api/frontend/v1/LvPlan/getReservierungen",{start_date:t,end_date:e})},getLehreinheitStudiensemester(t){return this.$fhcApi.get(`/api/frontend/v1/LvPlan/getLehreinheitStudiensemester/${t}`,{})},studiensemesterDateInterval(t){return this.$fhcApi.get(`/api/frontend/v1/LvPlan/studiensemesterDateInterval/${t}`,{})},LvPlanEvents(t,e,n){return this.$fhcApi.get("/api/frontend/v1/LvPlan/LvPlanEvents",{start_date:t,end_date:e,lv_id:n})}},E={verband:{get(){return this.$fhcApi.get("api/frontend/v1/stv/verband")},favorites:{get(){return this.$fhcApi.get("api/frontend/v1/stv/favorites")},set(t){return this.$fhcApi.post("api/frontend/v1/stv/favorites/set",{favorites:t})}}},students:{uid(t,e){let n="api/frontend/v1/stv/students/"+encodeURIComponent(e)+"/uid/"+encodeURIComponent(t);return this.$fhcApi.getUri(n)},prestudent(t,e){let n="api/frontend/v1/stv/students/"+encodeURIComponent(e)+"/prestudent/"+encodeURIComponent(t);return this.$fhcApi.getUri(n)},person(t,e){let n="api/frontend/v1/stv/students/"+encodeURIComponent(e)+"/person/"+encodeURIComponent(t);return this.$fhcApi.getUri(n)},verband(t){return this.$fhcApi.getUri("api/frontend/v1/stv/students/"+t)}},filter:{getStg(){return this.$fhcApi.get("api/frontend/v1/stv/filter/getStg")},setStg(t){return this.$fhcApi.post("api/frontend/v1/stv/filter/setStg",{studiengang_kz:t})}},konto:{tabulatorConfig(t,e){return t.ajaxURL="api/frontend/v1/stv/konto/get",t.ajaxParams=()=>({person_id:e.modelValue.person_id||e.modelValue.map(t=>t.person_id),only_open:e.filter,studiengang_kz:e.studiengang_kz_intern?e.stg_kz:""}),t.ajaxRequestFunc=(t,e,n)=>this.$fhcApi.post(t,n,e),t.ajaxResponse=(t,e,n)=>n.data,t},checkDoubles(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/konto/checkDoubles",e,{confirmErrorHandler:t=>!0})},insert(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/konto/insert",e)},counter(t){return this.$fhcApi.post("api/frontend/v1/stv/konto/counter",t)},edit(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/konto/update",e)},delete(t){return this.$fhcApi.post("api/frontend/v1/stv/konto/delete",{buchungsnr:t})},getBuchungstypen(){return this.$fhcApi.get("api/frontend/v1/stv/konto/getBuchungstypen")}},group:{getGruppen(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/Gruppen/getGruppen/"+n.id)},deleteGroup(t){return this.$fhcApi.post("api/frontend/v1/stv/Gruppen/deleteGruppe/",t)}},kontakt:{getAdressen(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getAdressen/"+n.id)},addNewAddress(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/stv/kontakt/addNewAddress/"+e,n)},loadAddress(t){return this.$fhcApi.post("api/frontend/v1/stv/kontakt/loadAddress/",{address_id:t})},updateAddress(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/stv/kontakt/updateAddress/"+e,n)},deleteAddress(t){return this.$fhcApi.post("api/frontend/v1/stv/kontakt/deleteAddress/",{address_id:t})},getPlaces(t){return this.$fhcApi.get("api/frontend/v1/stv/address/getPlaces/"+t)},getFirmen(t){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getFirmen/"+t)},getNations(){return this.$fhcApi.get("api/frontend/v1/stv/address/getNations/")},getAdressentypen(){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getAdressentypen/")},getBankverbindung(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getBankverbindung/"+n.id)},addNewBankverbindung(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/stv/kontakt/addNewBankverbindung/"+e,n)},loadBankverbindung(t){return this.$fhcApi.post("api/frontend/v1/stv/kontakt/loadBankverbindung/",{bankverbindung_id:t})},updateBankverbindung(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/stv/kontakt/updateBankverbindung/"+e,n)},deleteBankverbindung(t){return this.$fhcApi.post("api/frontend/v1/stv/kontakt/deleteBankverbindung/",{bankverbindung_id:t})},getKontakte(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getKontakte/"+n.id)},addNewContact(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/stv/kontakt/addNewContact/"+e,n)},loadContact(t){return this.$fhcApi.post("api/frontend/v1/stv/kontakt/loadContact/",{kontakt_id:t})},updateContact(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/stv/kontakt/updateContact/"+e,n)},deleteContact(t){return this.$fhcApi.post("api/frontend/v1/stv/kontakt/deleteContact/",{kontakt_id:t})},getStandorteByFirma(t){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getStandorteByFirma/"+t)},getKontakttypen(){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getKontakttypen/")}},prestudent:{get(t,e){return this.$fhcApi.post("api/frontend/v1/stv/prestudent/get/"+encodeURIComponent(t)+"/"+encodeURIComponent(e))},updatePrestudent(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/stv/prestudent/updatePrestudent/"+e,n)},getBezeichnungZGV(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getBezeichnungZGV/")},getBezeichnungMZgv(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getBezeichnungMZgv/")},getBezeichnungDZgv(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getBezeichnungDZgv/")},getStgs(){return this.$fhcApi.get("api/frontend/v1/stv/lists/getStgs/")},getAusbildung(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getAusbildung/")},getAufmerksamdurch(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getAufmerksamdurch/")},getBerufstaetigkeit(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getBerufstaetigkeit/")},getTypenStg(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getTypenStg/")},getBisstandort(){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getBisstandort/")},getHistoryPrestudent(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/status/getHistoryPrestudent/"+n.id)},getMaxSem(t){return this.$fhcApi.post("api/frontend/v1/stv/status/getMaxSemester/",{studiengang_kzs:t})},advanceStatus({prestudent_id:t,status_kurzbz:e,studiensemester_kurzbz:n,ausbildungssemester:a}){return this.$fhcApi.post("api/frontend/v1/stv/status/advanceStatus/"+t+"/"+e+"/"+n+"/"+a)},confirmStatus({prestudent_id:t,status_kurzbz:e,studiensemester_kurzbz:n,ausbildungssemester:a}){return this.$fhcApi.post("api/frontend/v1/stv/status/confirmStatus/"+t+"/"+e+"/"+n+"/"+a)},isLastStatus(t){return this.$fhcApi.get("api/frontend/v1/stv/status/isLastStatus/"+t)},deleteStatus({prestudent_id:t,status_kurzbz:e,studiensemester_kurzbz:n,ausbildungssemester:a}){return this.$fhcApi.post("api/frontend/v1/stv/status/deleteStatus/"+t+"/"+e+"/"+n+"/"+a)},getLastBismeldestichtag(){return this.$fhcApi.get("api/frontend/v1/stv/status/getLastBismeldestichtag/")},getHistoryPrestudents(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getHistoryPrestudents/"+n.id)}},status:{insertStatus(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/stv/status/insertStatus/"+e,n)},loadStatus({prestudent_id:t,status_kurzbz:e,studiensemester_kurzbz:n,ausbildungssemester:a}){return this.$fhcApi.post("api/frontend/v1/stv/status/loadStatus/"+t+"/"+e+"/"+n+"/"+a)},updateStatus(t,{prestudent_id:e,status_kurzbz:n,studiensemester_kurzbz:a,ausbildungssemester:i},s){return this.$fhcApi.post(t,"api/frontend/v1/stv/status/updateStatus/"+e+"/"+n+"/"+a+"/"+i,s)},getStudienplaene(t){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getStudienplaene/"+t)},getStudiengang(t){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getStudiengang/"+t)},getStatusgruende(){return this.$fhcApi.get("api/frontend/v1/stv/status/getStatusgruende/")},getStati(){return this.$fhcApi.get("api/frontend/v1/stv/lists/getStati/")},addStudent(t,e){return this.$fhcApi.post("api/frontend/v1/stv/status/addStudent/"+t,e,{errorHeader:t})},changeStatus(t,e){return this.$fhcApi.post("api/frontend/v1/stv/status/changeStatus/"+t,e,{errorHeader:t})},getStatusarray(){return this.$fhcApi.get("api/frontend/v1/stv/status/getStatusarray/")}},details:{get(t,e){let n="api/frontend/v1/stv/student/get/"+encodeURIComponent(t)+"/"+encodeURIComponent(e);return this.$fhcApi.post(n)},save(t,e,n,a){let i="api/frontend/v1/stv/student/save/"+encodeURIComponent(e)+"/"+encodeURIComponent(n);return this.$fhcApi.post(t,i,a)}},exam:{getPruefungen(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/getPruefungen/"+n.id)},loadPruefung(t){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/loadPruefung/"+t)},getTypenPruefungen(){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/getTypenPruefungen")},getAllLehreinheiten(t){return this.$fhcApi.post("api/frontend/v1/stv/pruefung/getAllLehreinheiten/",t)},getLvsByStudent(t){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/getLvsByStudent/"+t)},getLvsandLesByStudent(t,e){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/getLvsandLesByStudent/"+t+"/"+e)},getLvsAndMas(t){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/getLvsAndMas/"+t)},getMitarbeiterLv(t){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/getMitarbeiterLv/"+t)},getNoten(){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/getNoten")},checkZeugnisnoteLv(t){return this.$fhcApi.post("api/frontend/v1/stv/pruefung/checkZeugnisnoteLv/",t)},addPruefung(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/pruefung/insertPruefung/",e)},updatePruefung(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/stv/pruefung/updatePruefung/"+e,n)},deletePruefung(t){return this.$fhcApi.post("api/frontend/v1/stv/pruefung/deletePruefung/"+t)}},abschlusspruefung:{getAbschlusspruefung(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/abschlusspruefung/getAbschlusspruefung/"+n.id)},addNewAbschlusspruefung(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/abschlusspruefung/insertAbschlusspruefung/",e)},loadAbschlusspruefung(t){return this.$fhcApi.post("api/frontend/v1/stv/abschlusspruefung/loadAbschlusspruefung/",{id:t})},updateAbschlusspruefung(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/abschlusspruefung/updateAbschlusspruefung/",e)},deleteAbschlusspruefung(t){return this.$fhcApi.post("api/frontend/v1/stv/abschlusspruefung/deleteAbschlusspruefung/",{id:t})},getTypenAbschlusspruefung(){return this.$fhcApi.get("api/frontend/v1/stv/abschlusspruefung/getTypenAbschlusspruefung/")},getTypenAntritte(){return this.$fhcApi.get("api/frontend/v1/stv/abschlusspruefung/getTypenAntritte/")},getBeurteilungen(){return this.$fhcApi.get("api/frontend/v1/stv/abschlusspruefung/getBeurteilungen/")},getAkadGrade(t){return this.$fhcApi.post("api/frontend/v1/stv/abschlusspruefung/getAkadGrade/",{studiengang_kz:t})},getTypStudiengang(t){return this.$fhcApi.post("api/frontend/v1/stv/abschlusspruefung/getTypStudiengang/",{studiengang_kz:t})},getMitarbeiter(t){return this.$fhcApi.get("api/frontend/v1/stv/abschlusspruefung/getMitarbeiter/"+t)},getPruefer(t){return this.$fhcApi.get("api/frontend/v1/stv/abschlusspruefung/getPruefer/"+t)},getNoten(){return this.$fhcApi.get("api/frontend/v1/stv/abschlusspruefung/getNoten/")},checkForExistingExams(t){return this.$fhcApi.post("api/frontend/v1/stv/abschlusspruefung/checkForExistingExams/",{uids:t})}},grades:{list(){return this.$fhcApi.get("api/frontend/v1/stv/grades/list")},getCertificate(t,e){let n="api/frontend/v1/stv/grades/getCertificate/"+encodeURIComponent(t);return e&&(n=n+"/"+encodeURIComponent(e)),this.$fhcApi.get(n)},getTeacherProposal(t,e){let n="api/frontend/v1/stv/grades/getTeacherProposal/"+encodeURIComponent(t);return e&&(n=n+"/"+encodeURIComponent(e)),this.$fhcApi.get(n)},getRepeaterGrades(t,e){let n="api/frontend/v1/stv/grades/getRepeaterGrades/"+encodeURIComponent(t);return e&&(n=n+"/"+encodeURIComponent(e)),this.$fhcApi.get(n)},updateCertificate({lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:n,note:a,lehrveranstaltung_bezeichnung:i}){return this.$fhcApi.post("api/frontend/v1/stv/grades/updateCertificate",{lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:n,note:a},{errorHeader:i})},deleteCertificate({lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:n,lehrveranstaltung_bezeichnung:a}){return this.$fhcApi.post("api/frontend/v1/stv/grades/deleteCertificate",{lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:n},{errorHeader:a})},copyTeacherProposalToCertificate({lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:n,lehrveranstaltung_bezeichnung:a}){return this.$fhcApi.post("api/frontend/v1/stv/grades/copyTeacherProposalToCertificate",{lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:n},{errorHeader:a})},copyRepeaterGradeToCertificate({studierendenantrag_lehrveranstaltung_id:t,lv_bezeichnung:e}){return this.$fhcApi.post("api/frontend/v1/stv/grades/copyRepeaterGradeToCertificate",{studierendenantrag_lehrveranstaltung_id:t},{errorHeader:e})},getGradeFromPoints(t,e,n,a){const i=a?{errorHandling:!1}:{};return this.$fhcApi.post("api/frontend/v1/stv/grades/getGradeFromPoints",{points:t,lehrveranstaltung_id:e,studiensemester_kurzbz:n},i)}},mobility:{getMobilitaeten(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getMobilitaeten/"+n.id)},getProgramsMobility(){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getProgramsMobility/")},addNewMobility(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/mobility/insertMobility/",e)},loadMobility(t){return this.$fhcApi.get("api/frontend/v1/stv/mobility/loadMobility/"+t)},updateMobility(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/mobility/updateMobility/",e)},deleteMobility(t){return this.$fhcApi.post("api/frontend/v1/stv/mobility/deleteMobility/"+t)},getLVList(t){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getLVList/"+t)},getAllLehreinheiten(t){return this.$fhcApi.post("api/frontend/v1/stv/mobility/getAllLehreinheiten/",t)},getLvsandLesByStudent(t){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getLvsandLesByStudent/"+t)},getPurposes(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getPurposes/"+n.id)},getSupports(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getSupports/"+n.id)},getListPurposes(){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getListPurposes/")},getListSupports(){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getListSupports/")},deleteMobilityPurpose(t){return this.$fhcApi.post("api/frontend/v1/stv/mobility/deleteMobilityPurpose/"+t.bisio_id,t)},addMobilityPurpose(t){return this.$fhcApi.post("api/frontend/v1/stv/mobility/addMobilityPurpose/"+t.bisio_id,t)},deleteMobilitySupport(t){return this.$fhcApi.post("api/frontend/v1/stv/mobility/deleteMobilitySupport/"+t.bisio_id,t)},addMobilitySupport(t){return this.$fhcApi.post("api/frontend/v1/stv/mobility/addMobilitySupport/"+t.bisio_id,t)}},archiv:{tabulatorConfig(t,e){return t.ajaxURL="api/frontend/v1/stv/archiv/get",t.ajaxParams=()=>({person_id:e.modelValue.person_id||e.modelValue.map(t=>t.person_id)}),t.ajaxRequestFunc=(t,e,n)=>this.$fhcApi.post(t,n,e),t.ajaxResponse=(t,e,n)=>n.data,t},getArchivVorlagen(){return this.$fhcApi.post("api/frontend/v1/stv/archiv/getArchivVorlagen")},archive(t){return this.$fhcApi.post("api/frontend/v1/documents/archive",t)},archiveSigned(t){return this.$fhcApi.post("api/frontend/v1/documents/archiveSigned",t)},update(t){return this.$fhcApi.post("api/frontend/v1/stv/archiv/update",t)},delete({akte_id:t,studiengang_kz:e}){return this.$fhcApi.post("api/frontend/v1/stv/archiv/delete",{akte_id:t,studiengang_kz:e})}},documents:{getDocumentsUnaccepted(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/dokumente/getDocumentsUnaccepted/"+n.id+"/"+n.studiengang_kz)},getDocumentsAccepted(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/dokumente/getDocumentsAccepted/"+n.id+"/"+n.studiengang_kz)},deleteZuordnung(t){return this.$fhcApi.post("api/frontend/v1/stv/dokumente/deleteZuordnung/"+t.prestudent_id+"/"+t.dokument_kurzbz)},createZuordnung(t){return this.$fhcApi.post("api/frontend/v1/stv/dokumente/createZuordnung/"+t.prestudent_id+"/"+t.dokument_kurzbz)},loadAkte(t){return this.$fhcApi.get("api/frontend/v1/stv/dokumente/loadAkte/"+t)},getDoktypen(){return this.$fhcApi.get("api/frontend/v1/stv/dokumente/getDoktypen/")},updateFile(t,e){return this.$fhcApi.post("api/frontend/v1/stv/dokumente/updateAkte/"+t,e)},deleteFile(t){return this.$fhcApi.post("api/frontend/v1/stv/dokumente/deleteAkte/"+t)},uploadFile(t,e){return this.$fhcApi.post("api/frontend/v1/stv/dokumente/uploadDokument/"+t,e)}},exemptions:{getAnrechnungen(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/anrechnungen/getAnrechnungen/"+n.id)},getLehrveranstaltungen(t){return this.$fhcApi.get("api/frontend/v1/stv/anrechnungen/getLehrveranstaltungen/"+t)},getBegruendungen(){return this.$fhcApi.get("api/frontend/v1/stv/anrechnungen/getBegruendungen/")},getLvsKompatibel(t){return this.$fhcApi.get("api/frontend/v1/stv/anrechnungen/getLvsKompatibel/"+t)},getLektoren(t){return this.$fhcApi.get("api/frontend/v1/stv/anrechnungen/getLektoren/"+t)},addNewAnrechnung(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/anrechnungen/insertAnrechnung/",e)},loadAnrechnung(t){return this.$fhcApi.get("api/frontend/v1/stv/anrechnungen/loadAnrechnung/"+t)},editAnrechnung(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/anrechnungen/updateAnrechnung/",e)},deleteAnrechnung(t){return this.$fhcApi.post("api/frontend/v1/stv/anrechnungen/deleteAnrechnung/"+t)}},jointstudies:{getStudies(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/GemeinsameStudien/getStudien/"+n.id)},getTypenMobility(){return this.$fhcApi.get("api/frontend/v1/stv/GemeinsameStudien/getTypenMobility/")},getStudiensemester(){return this.$fhcApi.get("api/frontend/v1/stv/GemeinsameStudien/getStudiensemester/")},getStudyprograms(){return this.$fhcApi.get("api/frontend/v1/stv/GemeinsameStudien/getStudienprogramme/")},getListPartner(){return this.$fhcApi.get("api/frontend/v1/stv/GemeinsameStudien/getPartnerfirmen/")},getStatiPrestudent(){return this.$fhcApi.get("api/frontend/v1/stv/GemeinsameStudien/getStatiPrestudent/")},loadStudy(t){return this.$fhcApi.get("api/frontend/v1/stv/GemeinsameStudien/loadStudie/"+t)},insertStudy(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/GemeinsameStudien/insertStudie/",e)},updateStudy(t,e){return this.$fhcApi.post(t,"api/frontend/v1/stv/GemeinsameStudien/updateStudie/",e)},deleteStudy(t){return this.$fhcApi.post("api/frontend/v1/stv/GemeinsameStudien/deleteStudie/"+t)}},courselist:{getCourselist(t,e,n){return this.$fhcApi.get("api/frontend/v1/stv/LvTermine/getStundenplan/"+n.student_uid+"/"+n.start_date+"/"+n.end_date+"/"+n.group_consecutiveHours+"/"+n.dbStundenplanTable)},getStudiensemester(){return this.$fhcApi.get("api/frontend/v1/stv/LvTermine/getStudiensemester/")}},configStudent(){return this.$fhcApi.get("api/frontend/v1/stv/config/student")},configStudents(){return this.$fhcApi.get("api/frontend/v1/stv/config/students")}},C={person:{getNotizen(t,e,n){return this.$fhcApi.get("api/frontend/v1/notiz/notizPerson/getNotizen/"+n.id+"/"+n.type)},getUid(){return this.$fhcApi.get("api/frontend/v1/notiz/notizPerson/getUid/")},addNewNotiz(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/notiz/notizPerson/addNewNotiz/"+e,n)},loadNotiz(t){return this.$fhcApi.post("api/frontend/v1/notiz/notizPerson/loadNotiz/",{notiz_id:t})},loadDokumente(t){return this.$fhcApi.post("api/frontend/v1/notiz/notizPerson/loadDokumente/",{notiz_id:t})},deleteNotiz(t,e,n){return this.$fhcApi.post("api/frontend/v1/notiz/notizPerson/deleteNotiz/",{notiz_id:t,type_id:e,id:n})},updateNotiz(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/notiz/notizPerson/updateNotiz/"+e,n)},getMitarbeiter(t){return this.$fhcApi.get("api/frontend/v1/notiz/notizPerson/getMitarbeiter/"+t)},isBerechtigt(t,e){return this.$fhcApi.get("api/frontend/v1/notiz/notizPerson/isBerechtigt/")}}},O={person:{getAllBetriebsmittel(t,e,n){return this.$fhcApi.get("api/frontend/v1/betriebsmittel/betriebsmittelP/getAllBetriebsmittel/"+n.type+"/"+n.id)},addNewBetriebsmittel(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/betriebsmittel/betriebsmittelP/addNewBetriebsmittel/"+e,n)},loadBetriebsmittel(t){return this.$fhcApi.post("api/frontend/v1/betriebsmittel/betriebsmittelP/loadBetriebsmittel/"+t)},updateBetriebsmittel(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/betriebsmittel/betriebsmittelP/updateBetriebsmittel/"+e,n)},deleteBetriebsmittel(t){return this.$fhcApi.post("api/frontend/v1/betriebsmittel/betriebsmittelP/deleteBetriebsmittel/"+t)},getTypenBetriebsmittel(){return this.$fhcApi.get("api/frontend/v1/betriebsmittel/betriebsmittelP/getTypenBetriebsmittel/")},loadInventarliste(t){return this.$fhcApi.get("api/frontend/v1/betriebsmittel/betriebsmittelP/loadInventarliste/"+t)}}},F={updatePersonUnrulyStatus(t,e){try{const n={person_id:t,unruly:e},a="/api/frontend/v1/checkperson/CheckPerson/updatePersonUnrulyStatus";return this.$fhcApi.post(a,n,null)}catch(t){throw t}},filterPerson(t,e=""){try{const n=e+"/api/frontend/v1/checkperson/CheckPerson/filterPerson";return axios.post(n,t)}catch(t){throw t}}},P={getContentID(t){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/Ort/ContentID",{ort_kurzbz:t})},getRooms(t,e,n,a,i=0){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/Ort/getRooms",{datum:t,von:e,bis:n,typ:a,personenanzahl:i})},getRoomTypes(){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/Ort/getTypes")}},I={content(t,e=null,n=null,a=null){return this.$fhcApi.get("/api/frontend/v1/Cms/content",{content_id:t,...e?{version:e}:{},...n?{sprache:n}:{},...a?{sichtbar:a}:{}})},getNews(t=1,e=10,n){return this.$fhcApi.get("/api/frontend/v1/Cms/getNews",{page:t,page_size:e,sprache:n})},news(t){return this.$fhcApi.get("/api/frontend/v1/Cms/news",{limit:t})},getNewsRowCount:function(){return this.$fhcApi.get("/api/frontend/v1/Cms/getNewsRowCount",{})},getNewsExtra:function(){return this.$fhcApi.get("/api/frontend/v1/Cms/getStudiengangInfoForNews",{})}},M={getStudentenMail(t){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/api/frontend/v1/Lehre/lvStudentenMail",{lehreinheit_id:t})},getLvInfo(t,e){return this.$fhcApi.get(`/api/frontend/v1/Lehre/LV/${t}/${e}`,{})},getStudentPruefungen(t){return this.$fhcApi.get(`/api/frontend/v1/Lehre/Pruefungen/${t}`,{})}},L={getLvMenu(t,e){return this.$fhcApi.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+`/api/frontend/v1/LvMenu/getLvMenu/${t}/${e}`,{})}},R={person:{getMessages(t,e,n){return this.$fhcApi.get("api/frontend/v1/messages/messages/getMessages/"+n.id+"/"+n.type+"/"+n.size+"/"+n.page)},getVorlagen(){return this.$fhcApi.get("api/frontend/v1/messages/messages/getVorlagen/")},getMsgVarsLoggedInUser(){return this.$fhcApi.get("api/frontend/v1/messages/messages/getMsgVarsLoggedInUser/")},getMessageVarsPerson(t){return this.$fhcApi.get("api/frontend/v1/messages/messages/getMessageVarsPerson/"+t.id+"/"+t.type_id)},getMsgVarsPrestudent(t){return this.$fhcApi.get("api/frontend/v1/messages/messages/getMsgVarsPrestudent/"+t.id+"/"+t.type_id)},getPersonId(t){return this.$fhcApi.get("api/frontend/v1/messages/messages/getPersonId/"+t.id+"/"+t.type_id)},getUid(t){return this.$fhcApi.get("api/frontend/v1/messages/messages/getUid/"+t.id+"/"+t.type_id)},getDataVorlage(t){return this.$fhcApi.get("api/frontend/v1/messages/messages/getDataVorlage/"+t)},getNameOfDefaultRecipient(t){return this.$fhcApi.get("api/frontend/v1/messages/messages/getNameOfDefaultRecipient/"+t.id+"/"+t.type_id)},getPreviewText(t,e){return this.$fhcApi.post("api/frontend/v1/messages/messages/getPreviewText/"+t.id+"/"+t.type_id,e)},getReplyData(t){return this.$fhcApi.get("api/frontend/v1/messages/messages/getReplyData/"+t)},sendMessageFromModalContext(t,e,n){return this.$fhcApi.post(t,"api/frontend/v1/messages/messages/sendMessage/"+e,n)},sendMessage(t,e){return this.$fhcApi.post("api/frontend/v1/messages/messages/sendMessage/"+t,e)},deleteMessage(t){return this.$fhcApi.post("api/frontend/v1/messages/messages/deleteMessage/"+t)}}},N={getVorlagen(){return this.$fhcApi.get("api/frontend/v1/vorlagen/vorlagen/getVorlagen/")},getVorlagenByLoggedInUser(){return this.$fhcApi.get("api/frontend/v1/vorlagen/vorlagen/getVorlagenByLoggedInUser/")}},B={getStudiensemester:function(){return this.$fhcApi.get("/components/Cis/Mylv/Studiensemester",{})},getAllStudienSemester:function(t=void 0,e=void 0,n=void 0,a=void 0){return this.$fhcApi.get("/api/frontend/v1/Studium/getStudienAllSemester",{studiensemester:t,studiengang:e,semester:n,studienplan:a})},getStudiengaengeForStudienSemester:function(t){return this.$fhcApi.get(`/api/frontend/v1/Studium/getStudiengaengeForStudienSemester/${t}`,{})},getStudienplaeneBySemester:function(t,e){return this.$fhcApi.get("/api/frontend/v1/Studium/getStudienplaeneBySemester",{studiengang:t,studiensemester:e})},getLvPlanForStudiensemester:function(t,e){return this.$fhcApi.get(`/api/frontend/v1/LvPlan/getLvPlanForStudiensemester/${t}/${e}`,{})},getLvEvaluierungInfo:function(t,e){return this.$fhcApi.get(`/api/frontend/v1/Studium/getLvEvaluierungInfo/${t}/${e}`,{})}},j={search:_,phrasen:x,navigation:A,dashboard:{async getViewData(){return this.$fhcApi.get("/api/frontend/v1/Cis4FhcApi/getViewData",null,null)}},filter:$,studstatus:S,profil:T,profilUpdate:z,lvPlan:D,bookmark:{getBookmarks:function(){return this.$fhcApi.get("/api/frontend/v1/Bookmark/getBookmarks",{})},delete:function(t){return this.$fhcApi.get(`/api/frontend/v1/Bookmark/delete/${t}`,{})},update:function({bookmark_id:t,url:e,title:n,tag:a=null}){return this.$fhcApi.post(`/api/frontend/v1/Bookmark/update/${t}`,{url:e,title:n})},insert:function({url:t,title:e,tag:n}){return this.$fhcApi.post("/api/frontend/v1/Bookmark/insert",{url:t,title:e,tag:n})}},stv:E,notiz:C,betriebsmittel:O,checkperson:F,ampeln:{open:function(){return this.$fhcApi.get("/api/frontend/v1/Ampeln/open",{})},all:function(){return this.$fhcApi.get("/api/frontend/v1/Ampeln/all",{})},confirm:function(t){return this.$fhcApi.get(`/api/frontend/v1/Ampeln/confirm/${t}`,{})}},ort:P,cms:I,lehre:M,addons:L,messages:R,vorlagen:N,addons:L,studiengang:{studiengangInformation:function(){return this.$fhcApi.get("/api/frontend/v1/Studgang/getStudiengangInfo",{})},getStudiengangByKz:function(t){return this.$fhcApi.get("/api/frontend/v1/organisation/StudiengangEP/getStudiengangByKz",{studiengang_kz:t})}},menu:{getMenu:function(){return this.$fhcApi.get("/api/frontend/v1/CisMenu/getMenu",{})}},authinfo:{getAuthUID(){return this.$fhcApi.get("/api/frontend/v1/AuthInfo/getAuthUID",{})},getAuthInfo(){return this.$fhcApi.get("/api/frontend/v1/AuthInfo/getAuthInfo",{})}},studium:B,language:{getAll(){return this.$fhcApi.get("/api/frontend/v1/language/get")}}},U={install:(t,e)=>{if(t.config.globalProperties.$fhcApi)return void(e?.factory&&(console.warn("$fhcApi is DEPRECATED!"),t.config.globalProperties.$fhcApi.factory.addEndpoints(e.factory)));function n(t,e,n,a){if("string"==typeof t&&void 0===a)[e,n,a]=[t,e,n],t=void 0;else if(t){if("object"!=typeof t)throw new TypeError("Parameter 1 of _get_config must be an object or a string");void 0===e&&void 0===n&&void 0===a&&(a=t,t=void 0)}if(t){if(!t.clearValidation||!t.setFeedback)throw new TypeError("'form' is not a Form Component");t={clearValidation:t.clearValidation,setFeedback:t.setFeedback},a?a.form=t:a={form:t}}return[e,n,a]}function a(t){const e=t.data;return delete t.data,e.meta?e.meta.response=t:e.meta={response:t},e}FHC_JS_DATA_STORAGE_OBJECT.app_root,FHC_JS_DATA_STORAGE_OBJECT.ci_router;const i=axios.create({timeout:5e5,baseURL:FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/"});i.interceptors.request.use(t=>{if("post"!=t.method||!t.data)return t;if(t.data instanceof FormData)return t;if(!Object.values(t.data).every(t=>!(t instanceof FileList)&&(!Array.isArray(t)||t.every(t=>!(t instanceof File))))){const e=Object.entries(t.data).reduce((t,[e,n])=>{if(n instanceof FileList)for(const a of n)t.FormData.append(e+(n.length>1?"[]":""),a);else Array.isArray(n)?n.every(t=>!(t instanceof File))?t.jsondata[e]=n:n.forEach(a=>t.FormData.append(e+(n.length>1?"[]":""),a)):t.jsondata[e]=n;return t},{FormData:new FormData,jsondata:{}});e.FormData.append("_jsondata",JSON.stringify(e.jsondata)),t.data=e.FormData}return t}),i.interceptors.response.use(e=>("off"==e.config?.errorHandling||!1===e.config?.errorHandling||"fail"==e.config?.errorHandling||e.data.errors&&(e.data.errors=e.data.errors.filter(n=>(e.config[n.type+"ErrorHandler"]||t.config.globalProperties.$fhcApi._defaultErrorHandlers[n.type])(n,e.config))),a(e)),e=>"ERR_CANCELED"==e.code?Promise.reject({handled:!0,...e}):"off"==e.config?.errorHandling||!1===e.config?.errorHandling||"success"==e.config?.errorHandling?Promise.reject(e):e.response?404==e.response.status?(t.config.globalProperties.$fhcAlert.alertDefault("error",e.message,e.request.responseURL,!0),Promise.reject({handled:!0,...e})):(e.response.data.errors=e.response.data.errors.filter(n=>(e.config[n.type+"ErrorHandler"]||t.config.globalProperties.$fhcApi._defaultErrorHandlers[n.type])(n,e.config)),e.response.data.errors.length?Promise.reject(e):Promise.reject({handled:!0,...e})):e.request?(t.config.globalProperties.$fhcAlert.alertDefault("error",e.message,e.request.responseURL),Promise.reject({handled:!0,...e})):(t.config.globalProperties.$fhcAlert.alertError(e.message),Promise.reject({handled:!0,...e}))),t.config.globalProperties.$fhcApi={getUri:t=>(console.warn("$fhcApi.getUri is DEPRECATED! Use $api.getUri instead."),i.getUri({url:t})),get:(t,e,a,s)=>(console.warn("$fhcApi.get is DEPRECATED! Use $api.get instead."),[e,a,s]=n(t,e,a,s),a&&(s?s.params=a:s={params:a}),i.get(e,s)),post:(t,e,a,s)=>(console.warn("$fhcApi.post is DEPRECATED! Use $api.post instead."),[e,a,s]=n(t,e,a,s),i.post(e,a,s)),_defaultErrorHandlers:{validation(e,n){const a=t.config.globalProperties.$fhcAlert;return n?.form?(n.form.clearValidation(),n.form.setFeedback(!1,e.messages),!1):Array.isArray(e.messages)?(e.messages.forEach(a.alertError),!1):"object"!=typeof e.messages||(n?.errorHeader?Object.values(e.messages).forEach(e=>a.alertDefault("error",Array.isArray(n.errorHeader)?t.config.globalProperties.$p.t.apply(null,n.errorHeader):n.errorHeader,e,!0)):Object.entries(e.messages).forEach(([t,e])=>a.alertDefault("error",t,e,!0)),!1)},general(e,n){const a=t.config.globalProperties.$fhcAlert;n?.form?n.form.setFeedback(!1,e.message):n?.errorHeader?a.alertDefault("error",Array.isArray(n.errorHeader)?t.config.globalProperties.$p.t.apply(null,n.errorHeader):n.errorHeader,e.message,!0):a.alertError(e.message)},php(e){const n=t.config.globalProperties.$fhcAlert;var a="";switch(a+="Message: "+e.message+"\n\n",a+="Filename: "+e.filename+"\n",a+="Line Number: "+e.line+"\n",e.backtrace&&e.backtrace.length&&(a+="\nBacktrace: ",e.backtrace.forEach(t=>{a+="\n\tFile: "+t.file+"\n",a+="\tLine: "+t.line+"\n",a+="\tFunction: "+t.function+"\n"})),e.severity){case"Warning":case"Core Warning":case"Compile Warning":case"User Warning":n.alertDefault("warn","PHP "+e.severity,a,!0);break;case"Notice":case"User Notice":case"Runtime Notice":n.alertDefault("info","PHP "+e.severity,a,!0);break;default:a="Type: PHP "+e.severity+"\n\n"+a,n.alertSystemError(a)}},exception(e){const n=t.config.globalProperties.$fhcAlert;var a="";a+="Type: "+e.class+"\n\n",a+="Message: "+e.message+"\n\n",a+="Filename: "+e.filename+"\n",a+="Line Number: "+e.line+"\n",e.backtrace&&e.backtrace.length&&(a+="\nBacktrace: ",e.backtrace.forEach(t=>{a+="\n\tFile: "+t.file+"\n",a+="\tLine: "+t.line+"\n",a+="\tFunction: "+t.function+"\n"})),n.alertSystemError(a)},db(e){const n=t.config.globalProperties.$fhcAlert;var a="";void 0!==e.heading&&(a+=e.heading+"\n\n"),void 0!==e.code&&(a+="Code: "+e.code+"\n\n"),void 0!==e.sql&&(a+="SQL: "+e.sql+"\n\n"),void 0!==e.message?a+="Message: "+e.message+"\n\n":void 0!==e.messages&&(a+="Messages: "+e.messages.join("\n\t")+"\n\n"),void 0!==e.filename&&(a+="Filename: "+e.filename+"\n"),void 0!==e.line&&(a+="Line Number: "+e.line+"\n"),n.alertSystemError(a)},auth(e,n){const a=t.config.globalProperties.$fhcAlert;var i="";i+="Controller name: "+e.controller+"\n",i+="Method name: "+e.method+"\n",i+="Required permissions: "+e.required_permissions,n?.errorHeader?a.alertDefault("error",Array.isArray(n.errorHeader)?t.config.globalProperties.$p.t.apply(null,n.errorHeader):n.errorHeader,e.message,!0):a.alertDefault("error",e.message,i)}}};class s{constructor(e,n){void 0===n?(this.$fhcApi={getUri:e=>(console.warn("$fhcApi.factory is DEPRECATED!"),t.config.globalProperties.$fhcApi.getUri(e)),get:(e,n,a,i)=>(console.warn("$fhcApi.factory is DEPRECATED!"),t.config.globalProperties.$fhcApi.get(e,n,a,i)),post:(e,n,a,i)=>(console.warn("$fhcApi.factory is DEPRECATED!"),t.config.globalProperties.$fhcApi.post(e,n,a,i))},Object.defineProperty(this.$fhcApi,"factory",{get:()=>(console.warn("$fhcApi.factory is DEPRECATED!"),t.config.globalProperties.$fhcApi.factory)}),t.config.globalProperties.$fhcApi.factory=this):Object.defineProperty(this,"$fhcApi",{get(){return(n||this).$fhcApi}}),this.addEndpoints(e,!0)}addEndpoints(t,e){Object.keys(t).forEach(e=>{Object.defineProperty(this,e,{get(){return"function"==typeof t[e]?t[e].bind(this):new s(t[e],this.$fhcApi.factory)}})}),e||console.warn("$fhcApi.factory.addEndpoints() is DEPRECATED!")}}const r=new s(j);e?.factory&&(console.warn("$fhcApi is DEPRECATED!"),r.addEndpoints(e.factory)),t.config.globalProperties.$fhcApi.factory=r,t.provide("$fhcApi",t.config.globalProperties.$fhcApi)}};const V="error",H="retval",q={get:function(t,e,n=null){return q._axiosCall(t,e,"get",n)},post:function(t,e,n=null){return q._axiosCall(t,e,"post",n)},isSuccess:function(t){return!("object"!=typeof t||!t.hasOwnProperty(V)||!t.hasOwnProperty(H)||0!=t.error)},isError:function(t){return!q.isSuccess(t)},hasData:function(t){return!(!q.isSuccess(t)||!("object"==typeof t[H]&&Object.keys(t[H]).length>0||"array"==typeof t[H]&&t[H].length>0||"string"==typeof t[H]&&""!=t[H].trim()||"number"==typeof t[H]))},getData:function(t){return q.hasData(t)?t[H]:null},getError:function(t){return"object"==typeof t&&Object.keys(t).length>0&&t.hasOwnProperty(H)?t[H]:"Generic error"},getErrorCode:function(t){return"object"==typeof t&&t.hasOwnProperty(V)?t[V]:1},_generateRouterURI:function(t){var e=null;return"undefined"!=typeof FHC_JS_DATA_STORAGE_OBJECT&&(e=FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/"+t),e},_printDebug:function(t,e,n){},_axiosCall:function(t,e,n,a){let i={method:n,url:q._generateRouterURI(t),timeout:5e3};if("get"==n?i.params=e:i.data=e,"object"==typeof a)for(var s in a)i[s]=a[s];return axios(i)}},G=document.createElement("div"),J=Vue.createApp({name:"FhcAlertApp",components:{PvToast:e,PvConfirm:n},methods:{mailToUrl:t=>"mailto:"+FHC_JS_DATA_STORAGE_OBJECT.systemerror_mailto+"?subject=Meldung%20Systemfehler&body="+("\n\t\t\t\tDanke, dass Sie uns den Fehler melden. %0D%0A %0D%0A\n\t\t\t\tBitte beschreiben Sie uns ausführlich das Problem.%0D%0A\n\t\t\t\tBsp: Ich habe X ausgewählt und Y angelegt. Beim Speichern erhielt ich die Fehlermeldung. [Optional: Ich habe den Browser Z verwendet.]%0D%0A\n\t\t\t\t-----------------------------------------------------------------------------------------------------------------------------------%0D%0A\n\t\t\t\tPROBLEM: ... %0D%0A %0D%0A %0D%0A\n\n\t\t\t\t-----------------------------------------------------------------------------------------------------------------------------------%0D%0A\n\t\t\t\tFehler URL: "+FHC_JS_DATA_STORAGE_OBJECT.called_path+"/"+FHC_JS_DATA_STORAGE_OBJECT.called_method+"%0D%0A\n\t\t\t\tFehler Meldung: "+t.message.detail+"%0D%0A\n\t\t\t\t-----------------------------------------------------------------------------------------------------------------------------------%0D%0A %0D%0A\n\t\t\t\tWir kümmern uns um eine rasche Behebung des Problems!"),openMessagecard(t){bootstrap.Collapse.getOrCreateInstance(t.target.getAttribute("href")).toggle()}},unmounted(){G.parentElement.removeChild(G)},computed:{showmaillink:function(){return""!==FHC_JS_DATA_STORAGE_OBJECT.systemerror_mailto}},template:'\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t'});J.use(t),J.use(a);const W=J.mount(G);document.body.appendChild(G);var Z={install:(t,e)=>{t.config.globalProperties.$p||t.use(at);const n={alertSuccess(t){if(Array.isArray(t))return t.forEach(this.alertSuccess);W.$refs.toast.add({severity:"success",summary:"Info",detail:t,life:1e3})},alertInfo(t){if(Array.isArray(t))return t.forEach(this.alertInfo);W.$refs.toast.add({severity:"info",summary:"Info",detail:t,life:3e3})},alertWarning(t){if(Array.isArray(t))return t.forEach(this.alertWarning);W.$refs.toast.add({severity:"warn",summary:"Achtung",detail:t})},alertError(t){if(Array.isArray(t))return t.forEach(this.alertError);W.$refs.toast.add({severity:"error",summary:"Achtung",detail:t})},alertSystemError(e){if(Array.isArray(e))return e.forEach(this.alertSystemError);W.$refs.alert.add({severity:"error",summary:Vue.computed(()=>t.config.globalProperties.$p.t("alert/systemerror")),detail:e})},confirmDelete:()=>new Promise((e,n)=>{W.$confirm.require({group:"fhcAlertConfirm",header:Vue.computed(()=>t.config.globalProperties.$p.t("alert/attention")),message:Vue.computed(()=>t.config.globalProperties.$p.t("alert/confirm_delete")),acceptLabel:Vue.computed(()=>t.config.globalProperties.$p.t("ui/loeschen")),acceptClass:"p-button-danger",rejectLabel:Vue.computed(()=>t.config.globalProperties.$p.t("ui/abbrechen")),rejectClass:"p-button-secondary",accept(){e(!0)},reject(){e(!1)}})}),confirm:e=>new Promise((n,a)=>{W.$confirm.require({group:e?.group??"fhcAlertConfirm",header:e?.header??Vue.computed(()=>t.config.globalProperties.$p.t("alert/attention")),message:e?.message??"",acceptLabel:e?.acceptLabel??"Ok",acceptClass:e?.acceptClass??"btn btn-primary",rejectLabel:e?.rejectLabel??Vue.computed(()=>t.config.globalProperties.$p.t("ui/abbrechen")),rejectClass:e?.rejectClass??"btn btn-outline-secondary",accept(){n(!0)},reject(){n(!1)}})}),alertDefault(t,e,n,a=!1,i=!1){let s={severity:t,summary:e,detail:n,html:i};a||(s.life=3e3),W.$refs.toast.add(s)},alertMultiple(t,e="info",n="Info",a=!1,i=!1){return!!t.every(t=>"string"==typeof t)&&(t.forEach(t=>this.alertDefault(e,n,t,a,i)),!0)},handleSystemError(t){if(!t.hasOwnProperty("name")||t.name.toLowerCase()!=="AbortError".toLowerCase()){if("string"==typeof t)return n.alertSystemError(t);if(Array.isArray(t)&&t.every(t=>"string"==typeof t))return t.every(n.alertSystemError);if(!t.hasOwnProperty("handled")||!t.handled){if("object"==typeof t&&null!==t){let e="";return t.hasOwnProperty("response")&&t.response?.data?.retval?e+="Error Message: "+(t.response.data.retval.message||t.response.data.retval)+"\r\n":t.hasOwnProperty("message")&&(e+="Error Message: "+t.message.toUpperCase()+"\r\n"),t.hasOwnProperty("config")&&t.config.hasOwnProperty("url")&&(e+="Error ConfigURL: "+t.config.url+"\r\n"),t.hasOwnProperty("stack")&&(e+="Error Stack: "+t.stack+"\r\n"),""==e&&(e="Error Message: "+JSON.stringify(t)+"\r\n"),e+="Error Controller Path: "+FHC_JS_DATA_STORAGE_OBJECT.called_path+"/"+FHC_JS_DATA_STORAGE_OBJECT.called_method,n.alertSystemError(e)}n.alertSystemError("alertSystemError throws Generic Error\r\nError Controller Path: "+FHC_JS_DATA_STORAGE_OBJECT.called_path+"/"+FHC_JS_DATA_STORAGE_OBJECT.called_method)}}},handleSystemMessage(t){if("string"==typeof t)return n.alertWarning(t);if(Array.isArray(t)){if(t.every(t=>"string"==typeof t))return t.every(n.alertWarning);if(t.every(t=>"object"==typeof t)&&null!==msg)return t.every(t=>{t.hasOwnProperty("data")&&t.data.hasOwnProperty("retval")?n.alertWarning(JSON.stringify(t.data.retval)):n.alertSystemError(JSON.stringify(t))})}"object"!=typeof t||null===t?n.alertSystemError("alertSystemError throws Generic Error\r\nError Controller Path: "+FHC_JS_DATA_STORAGE_OBJECT.called_path+"/"+FHC_JS_DATA_STORAGE_OBJECT.called_method):t.hasOwnProperty("data")&&t.data.hasOwnProperty("retval")?n.alertWarning(JSON.stringify(t.data.retval)):n.alertSystemError(JSON.stringify(t))},resetFormValidation(t){const e=new Event("fhc-form-reset");t.querySelectorAll(["[data-fhc-form-validate],[data-fhc-form-error]"]).forEach(t=>t.dispatchEvent(e))},handleFormValidation(t,e){if(void 0===e){if(t&&t.nodeType===Node.ELEMENT_NODE)return e=>n.handleFormValidation(e,t)}else if(400==t?.response?.status){let a=q.getError(t.response.data);"object"!=typeof a&&(a=t.response.data),n.resetFormValidation(e);const i=Object.entries(a).filter(([t,n])=>{const a=e.querySelector('[data-fhc-form-validate="'+t+'"]');return!a||(a.dispatchEvent(new CustomEvent("fhc-form-invalidate",{detail:n})),!1)}).map(t=>t[1]),s=e.querySelector("[data-fhc-form-error]");return void(s&&i.length?s.dispatchEvent(new CustomEvent("fhc-form-error",{detail:i})):i.forEach(n.alertError))}if(400==t?.response?.status){let e=q.getError(t.response.data);n.alertError("object"==typeof e?Object.values(e):e)}else n.handleSystemError(t)}};t.config.globalProperties.$fhcAlert=n,t.provide("$fhcAlert",t.config.globalProperties.$fhcAlert)}},K={install:(t,e)=>{if(t.config.globalProperties.$api)return;function n(t,e){Array.isArray(t)?t.forEach(e):Object.entries(t).forEach(([t,n])=>n.forEach(n=>e(n,t)))}t.config.globalProperties.$fhcAlert||t.use(Z);let a={success:!0,fail:!0,combine:{form:["validation","general"],toast:["validation","general","not_found","site_failed"]},handler:{form(t,e){t.clearValidation(),e.forEach(e=>t.setFeedback(!1,e.messages||e.message))},async toast(e){const n=t.config.globalProperties.$p;if(!n)return Promise.reject("Phrasen plugin not loaded!");async function a(t){t=t.reduce((t,e)=>{switch(e.type){case"not_found":case"site_failed":e.message?t[e.message]=[e.url]:t._default=[e.url];break;case"general":t._default||(t._default=[]),t._default.push(e.message);break;case"validation":Object.entries(e.messages).forEach(([e,n])=>{t[e]||(t[e]=[]),Array.isArray(n)?t[e].push(...n):t[e].push(n)})}return t},{});let e=0;const a=await Promise.all(Object.entries(t).sort((t,e)=>["_default"].indexOf(e[0])-["_default"].indexOf(t[0])).map(async([t,a])=>{if("_default"==t){await n.loadCategory("dashboard");t='
    '+n.t("dashboard/general")+"
    "}else t="
    "+t+"
    ";return e+=a.length,t+"
    "+a.join("
    ")+"
    "}));return{counter:e,msgs:a}}let i,s;Array.isArray(e)?({counter:i,msgs:s}=await a(e)):({counter:i,msgs:s}=await Object.entries(e).reduce(async(t,[e,n])=>{const i=await t,{counter:s,msgs:r}=await a(n);return i.counter+=s,i.msgs.push("
    "+e+"
    "+r.join("")+"
    "),i},Promise.resolve({counter:0,msgs:[]}))),await n.loadCategory("ui");const r=n.t("ui/n_errors",{n:i});t.config.globalProperties.$fhcAlert.alertDefault("error",r,"
    "+s.join("")+"
    ",!0,!0)},php(e){n(e,(e,n)=>{var a="";switch(a+="Message: "+e.message+"\n\n",a+="Filename: "+e.filename+"\n",a+="Line Number: "+e.line+"\n",e.backtrace&&e.backtrace.length&&(a+="\nBacktrace: ",e.backtrace.forEach(t=>{a+="\n\tFile: "+t.file+"\n",a+="\tLine: "+t.line+"\n",a+="\tFunction: "+t.function+"\n"})),e.severity){case"Warning":case"Core Warning":case"Compile Warning":case"User Warning":n?n+=": PHP "+e.severity:n="PHP "+e.severity,t.config.globalProperties.$fhcAlert.alertDefault("warn",n,a,!0);break;case"Notice":case"User Notice":case"Runtime Notice":n?n+=": PHP "+e.severity:n="PHP "+e.severity,t.config.globalProperties.$fhcAlert.alertDefault("info",n,a,!0);break;default:a="Type: PHP "+e.severity+"\n\n"+a,n&&(a=n+"\n\n"+a),t.config.globalProperties.$fhcAlert.alertSystemError(a)}})},exception(e){n(e,(e,n)=>{var a="";n&&(a+=n+"\n\n"),a+="Type: "+e.class+"\n\n",a+="Message: "+e.message+"\n\n",a+="Filename: "+e.filename+"\n",a+="Line Number: "+e.line+"\n",e.backtrace&&e.backtrace.length&&(a+="\nBacktrace: ",e.backtrace.forEach(t=>{a+="\n\tFile: "+t.file+"\n",a+="\tLine: "+t.line+"\n",a+="\tFunction: "+t.function+"\n"})),t.config.globalProperties.$fhcAlert.alertSystemError(a)})},db(e){n(e,(e,n)=>{var a="";n&&(a+=n+"\n\n"),void 0!==e.heading&&(a+=e.heading+"\n\n"),void 0!==e.code&&(a+="Code: "+e.code+"\n\n"),void 0!==e.sql&&(a+="SQL: "+e.sql+"\n\n"),void 0!==e.message?a+="Message: "+e.message+"\n\n":void 0!==e.messages&&(a+="Messages: "+e.messages.join("\n\t")+"\n\n"),void 0!==e.filename&&(a+="Filename: "+e.filename+"\n"),void 0!==e.line&&(a+="Line Number: "+e.line+"\n"),t.config.globalProperties.$fhcAlert.alertSystemError(a)})},auth(e){n(e,(e,n)=>{n?n+=": "+e.message:n=e.message;var a="";a+="Controller name: "+e.controller+"\n",a+="Method name: "+e.method+"\n",a+="Required permissions: "+e.required_permissions,t.config.globalProperties.$fhcAlert.alertDefault("error",n,a,!0)})}}};function i(t,e,n,a){if("string"==typeof t&&void 0===a)[e,n,a]=[t,e,n],t=void 0;else if(t){if("object"!=typeof t)throw new TypeError("Parameter 1 of _get_config must be an object or a string");void 0===e&&void 0===n&&void 0===a&&(a=t,t=void 0)}if(t){if(!t.clearValidation||!t.setFeedback)throw new TypeError("'form' is not a Form Component");t={clearValidation:t.clearValidation,setFeedback:t.setFeedback},a?a.form=t:a={form:t}}return[e,n,a]}function s(t){if("string"==typeof t.data||t.data instanceof String)return s({data:t});const e=t.data;return delete t.data,e?(e.meta?e.meta.response=t:e.meta={response:t},e):{meta:{response:t},data:null}}function r(t){if(!1===t||"off"===t)return{...a,success:!1,fail:!1};if(!t||!0===t)return{...a};if("success"===t)return{...a,fail:!1};if("fail"===t)return{...a,success:!1};const{success:e,fail:n,handler:i,combine:s}=t;return t={...a},Object.entries({fail:n,success:e}).forEach(([e,n])=>{void 0!==n&&(t[e]=n)}),Object.entries({handler:i,combine:s}).forEach(([e,n])=>{void 0!==n&&(t[e]={...t[e],...n})}),t}function l(t){const e=r(t?.errorHandling);if(t?.form){const n=e.handler.form;e.handler={...e.handler,form:e=>n(t.form,e)}}else e.combine={...e.combine,form:[]};return e}function o(t){return t.response?404==t.response.status?[{type:"not_found",message:t.message,url:t.request.responseURL}]:null==t.response.data.errors?[]:t.response.data.errors:t.request?[{type:"site_failed",message:t.message,url:t.request.responseURL}]:[{type:"script",message:t.message}]}function d(t,e){const n={},a=[];if(null==e)return{};for(;e.length;)a.push(e.pop());for(var i of a){let a=i.type,r=null;for(var s in t.combine){let e=t.combine[s].includes(a),n=t.handler[s];if(e&&n&&(r=s,"form"==r))break}r&&(a=r);t.handler[a]?(n[a]||(n[a]=[]),Array.isArray(i)?n[a].push(...i):n[a].push(i)):e.push(i)}return n}void 0!==e?.errorHandling&&(a=r(e.errorHandling));const c=axios.create({timeout:5e5,baseURL:FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/"});c.interceptors.request.use(t=>{if("post"!=t.method||!t.data)return t;if(t.data instanceof FormData)return t;if(!Object.values(t.data).every(t=>!(t instanceof FileList)&&(!Array.isArray(t)||t.every(t=>!(t instanceof File))))){const e=Object.entries(t.data).reduce((t,[e,n])=>{if(n instanceof FileList)for(const a of n)t.FormData.append(e+(n.length>1?"[]":""),a);else Array.isArray(n)?n.every(t=>!(t instanceof File))?t.jsondata[e]=n:n.forEach(a=>t.FormData.append(e+(n.length>1?"[]":""),a)):t.jsondata[e]=n;return t},{FormData:new FormData,jsondata:{}});e.FormData.append("_jsondata",JSON.stringify(e.jsondata)),t.data=e.FormData}return t}),c.interceptors.response.use(e=>("off"==e.config?.errorHandling||!1===e.config?.errorHandling||"fail"==e.config?.errorHandling||e.data.errors&&(e.data.errors=e.data.errors.filter(n=>(e.config[n.type+"ErrorHandler"]||t.config.globalProperties.$api._defaultErrorHandlers[n.type])(n,e.config))),s(e)),t=>{if("ERR_CANCELED"==t.code)return Promise.reject({handled:!0,...t});const e=l(t.config);if(!e.fail)return Promise.reject(t);const n=o(t),a=d(e,n);for(var i in a)e.handler[i](a[i]);return n.length?Promise.reject(t):Promise.reject({handled:!0,...t})}),t.config.globalProperties.$api={getUri:t=>c.getUri({url:t}),get:(t,e,n,a)=>([e,n,a]=i(t,e,n,a),n&&(a?a.params=n:a={params:n}),c.get(e,a)),post:(t,e,n,a)=>([e,n,a]=i(t,e,n,a),c.post(e,n,a)),call(e,n,a){if(Array.isArray(e)){const s=t.config.globalProperties.$api;return Promise.allSettled(e.map((t,e)=>(Array.isArray(t)||(t=["#"+e,t]),s.call(t[1],{errorHeader:t[0],errorHandling:!1})))).then(t=>{const[,,e]=i(a,void 0,void 0,n||{}),s=l(e);if(!s.success&&!s.fail)return t;const r={};for(var c of t){const[t,e]="fulfilled"===c.status?[s.success,c.value]:[s.fail,c.reason];if(!t)return;const n=d(s,o(e));for(var u in n)r[u]?r[u][e.config.errorHeader]=n[u]:r[u]={[e.config.errorHeader]:n[u]}}for(var p in r)s.handler[p](r[p]);return t})}let{method:s,url:r,params:c,config:u}=e;return void 0!==n&&(u=n),s||(s="get"),s.toLowerCase&&(s=s.toLowerCase()),"get"==s?this.get(a,r,c,u):"post"==s?this.post(a,r,c,u):void console.error("FhcApi: method not allowed:",s)},getErrorHandler:t=>l(t)},t.provide("$api",t.config.globalProperties.$api)}},Y={loadCategory:t=>({method:"get",url:"/api/frontend/v1/phrasen/loadModule/"+t}),setLanguage:(t,e)=>({method:"post",url:"/api/frontend/v1/phrasen/setLanguage",params:{categories:t,language:e}}),getLanguage:()=>({method:"get",url:"/api/frontend/v1/phrasen/getLanguage"}),getActiveDbLanguages:()=>({method:"get",url:"/api/frontend/v1/phrasen/getAllLanguages"})};const Q=Vue.reactive({}),X={};let tt=Vue.ref(FHC_JS_DATA_STORAGE_OBJECT.user_language),et=Vue.computed(()=>tt.value?FHC_JS_DATA_STORAGE_OBJECT.server_languages.find(t=>t.sprache==tt.value).LC_Time:null);const nt={user_language:tt,user_locale:et,setLanguage(t){const e=Object.keys(Q);return this.config.globalProperties.$api.call(Y.setLanguage(e,t)).then(e=>(e.data.forEach(t=>{Q[t.category][t.phrase]=t.text}),tt.value=t,e))},loadCategory(t){return Array.isArray(t)?Promise.all(t.map(this.config.globalProperties.$p.loadCategory)):(X[t]||(X[t]=this.config.globalProperties.$api.call(Y.loadCategory(t)).then(e=>e?.data?function(t,e){return t.filter(t=>t.category==e).reduce((t,e)=>(t[e.phrase]||(t[e.phrase]=e.text),t),{})}(e.data,t):{}).then(e=>{Q[t]=e})),X[t])},t_ref(t,e,n){return console.warn("deprecated"),Vue.computed(()=>this.t(t,e,n))},t(t,e,n){if(void 0===n&&(Array.isArray(t)&&2==t.length||t.split&&2==t.split("/").length)&&(n=e,[t,e]=t.split?t.split("/"):t),void 0===e)return console.error("invalid input",t,e,n),"";let a=Vue.computed(()=>Q[t]?function(t,e,n){let a=Q[t][e];return a?(n&&(a=a.replace(/\{([^}]*)\}/g,(t,e)=>void 0===n[e]?t:n[e])),a):"<< PHRASE "+e+">>"}(t,e,n):"");return Q[t]||this.loadCategory(t),a.value}};var at={install(t,e){t.config.globalProperties.$fhcApi||t.use(U),t.config.globalProperties.$api||t.use(K),t.config.globalProperties.$p={t:nt.t,loadCategory:e=>nt.loadCategory.call(t,e),setLanguage:e=>nt.setLanguage.call(t,e),user_language:tt,user_locale:et,t_ref:nt.t_ref},t.provide("$p",t.config.globalProperties.$p)}},it=Object.freeze({__proto__:null,default:at,user_locale:et});let st=Vue.ref(FHC_JS_DATA_STORAGE_OBJECT.theme.name);const rt=FHC_JS_DATA_STORAGE_OBJECT.theme.modes,lt=t=>{if(!t)return;for(const t of rt)document.documentElement.classList.remove(t);st.value=t,document.documentElement.classList.add(t),document.body.setAttribute("data-bs-theme",t);let e=document.querySelector('link[href*="primevue/resources/themes"]');"dark"==t?e.attributes.href.value=e.attributes.href.value.replace("bootstrap4-light-blue","bootstrap4-dark-blue"):("light"==t||e.attributes.href.value.includes("bootstrap4-dark-blue"))&&(e.attributes.href.value=e.attributes.href.value.replace("bootstrap4-dark-blue","bootstrap4-light-blue")),localStorage.setItem("theme",t)};var ot={install:(t,e)=>{document.documentElement.classList.add(st.value),(()=>{let t=localStorage.getItem("theme");t&&rt.includes(t)||(t=rt[0],localStorage.setItem("theme",t)),lt(t)})(),t.config.globalProperties.$theme={theme_name:st,theme_modes:rt,switchTheme:t=>{lt(t)}}}};const dt=t=>{const e=t.toString(16);return 1===e.length?"0"+e:e};function ct(t){return(299*parseInt(t.substring(1,3),16)+587*parseInt(t.substring(3,5),16)+114*parseInt(t.substring(5,7),16))/1e3>=128?"black":"white"}var ut={mounted(t,e){const n=window.getComputedStyle(t).backgroundColor;let a=new RegExp(/^rgba?\s*\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*,?\s*([0-9]+.?[0-9]?)?\s*\)/),i=n.match(a);if(i){i.length<3&&console.error("Invalid RGB color format");let e=parseInt(i[1],10),n=parseInt(i[2],10),a=parseInt(i[3],10),s=`#${dt(e)}${dt(n)}${dt(a)}`;t.style.color=ct(s)}else t.style.color=ct(n)}};const pt={lehreinheit:{id:"lehreinheit_id",dragIcon:"fa-solid fa-chalkboard-user",extras:["stundenblockung"]},vevent:{id:"uid",dragIcon:"fa-solid fa-calendar",extras:["dtstart","dtend","summary"]},person:{id:"person_id",dragIcon:"fa-solid fa-user"},student:{id:"student_uid",dragIcon:"fa-solid fa-user-graduate"},prestudent:{id:"prestudent_id",dragIcon:"fa-solid fa-user-graduate text-muted"}},ht=Object.keys(pt);function mt(t){if(!t)return!1;if(Array.isArray(t))return t.every(mt);if(!t.type)return!1;if("-collection"==t.type.substr(-11)){if(!Object.prototype.hasOwnProperty.call(t,"values"))return!1;if(!ht.includes(t.type.substr(0,t.type.length-11)))return!1}else{if(!Object.prototype.hasOwnProperty.call(t,"id"))return!1;if(!ht.includes(t.type))return!1;if(pt[t.type].extras&&!pt[t.type].extras.every(e=>Object.prototype.hasOwnProperty.call(t,e)))return!1}return!0}function gt(t,e,n){let a=null;try{if(a=ft(t,n),!a)return null;if(!n&&Array.isArray(a)){if(a=a.filter(mt),!a.length)return null}else if(!mt(a))return null;if(e&&e.length)if(Array.isArray(a)){if(n&&!a.every(t=>e.includes(t.type)))return null;if(!n&&(a=a.filter(t=>e.includes(t.type)),!a.length))return null}else if(!e.includes(a.type))return null}catch(t){return null}return Array.isArray(a)&&1==a.length?a.find(Boolean):a}function ft(t,e){const n=[];for(const a of t.dataTransfer.types){if("application/fhc-"!=a.substr(0,16)){if(e)return null;continue}let i=a.substr(16),s=!1;if("-collection"==i.substr(-11)&&(i=i.substr(0,i.length-11),s=!0),!ht.includes(i)){if(e)return null;continue}let r=JSON.parse(t.dataTransfer.getData(a));s?n.push(...r.values):n.push(r)}return n.length?1==n.length?n[0]:n:null}var bt={...Object.keys(pt).reduce((t,e)=>(t["TYPE_"+e.toUpperCase()]=e,t),{}),isValidDragObject:mt,getValidTransferData:gt,isValidTransferData:function(t,e,n){return!!gt(t,e,n)},getTransferData:ft,convertToValidDragObject:function t(e,n){if(Array.isArray(e)){const a=e.map(t).filter(Boolean);if(!a.length)return;if(n&&a.length!=e.length)return;const i=a.reduce((t,e)=>(t[e.type]||(t[e.type]=[]),t[e.type].push(e),t),{});return Object.entries(i).map(([t,e])=>e.length>1?{type:t+"-collection",values:e}:e[0])}if(Object.prototype.hasOwnProperty.call(e,"type")&&mt(e))return e;const a=Object.entries(pt).find(([,t])=>!!Object.prototype.hasOwnProperty.call(e,t.id)&&!(t.extras&&!t.extras.every(t=>Object.prototype.hasOwnProperty.call(e,t))));if(!a)return;const[i,s]=a,r={};return r.type=i,r.id=e[s.id],s.extras&&s.extras.forEach(t=>r[t]=e[t]),r},setTransferData:function t(e,n,a=!1){if(a){const t=(Array.isArray(n)?n:[n]).map(t=>{const e=document.createElement("i"),n=document.createElement("span"),a=document.createElement("span");a.className="btn btn-outline-dark bg-light",n.className="small",pt[t.type]?(e.className=pt[t.type].dragIcon||"fa-solid fa-question",n.textContent=t.id):"-collection"==t.type.substr(-11)&&pt[t.type.substr(0,t.type.length-11)]?(a.style.boxShadow="3px 3px var(--bs-btn-border-color)",e.className=pt[t.type.substr(0,t.type.length-11)].dragIcon||"fa-solid fa-question",n.textContent="x"+t.values.length):(e.className="fa-solid fa-question",n.textContent=t.id||""),a.append(e);const i=document.createElement("div");return i.className="d-flex flex-column align-items-center gap-2 small",i.append(a,n),i}),a=document.createElement("div");a.className="d-flex flex-row gap-2 small",a.append(...t),document.body.append(a),e.dataTransfer.setDragImage(a,-25,0),requestAnimationFrame(()=>{document.body.removeChild(a)})}if(Array.isArray(n))return n.forEach(n=>t(e,n));e.dataTransfer.setData("application/fhc-"+n.type,JSON.stringify(n))},eventHasTypes:function(t,e,n){return e&&e.length||(e=ht),e=e.map(t=>"application/fhc-"+t),!![...t.dataTransfer.types].length&&(n?[...t.dataTransfer.types].every(t=>e.includes(t)):e.some(e=>[...t.dataTransfer.types].includes(e)))},bindDragEnterLeave:function(t,e,n){let a=!1,i=!0;function s(n){a=!1,i=!0,window.addEventListener("dragenter",l,!0),window.addEventListener("dragleave",o,!0),window.addEventListener("drop",d,!0),e(n),t.removeEventListener("dragenter",s)}function r(e,a){window.removeEventListener("dragenter",l,!0),window.removeEventListener("dragleave",o,!0),window.removeEventListener("drop",d,!0),n(e,a),t.addEventListener("dragenter",s)}function l(e){i=!1,t==e.target||t.contains(e.target)?a=!0:r(e)}function o(e){if(t==e.target||t.contains(e.target)){if(a)return void(a=!1)}else if(i)return void(i=!1);r(e)}function d(t){r(t,!0)}return t.addEventListener("dragenter",s),()=>{t.removeEventListener("dragenter",s)}}},vt={mounted(t,e,n){if("draggable"==e.arg)t.addEventListener("update-my-value",t=>{t.preventDefault(),e.value=t.detail.item}),t.addEventListener("dragstart",n=>{t.dispatchEvent(new CustomEvent("calendar-dragstart",{cancelable:!0,bubbles:!0,detail:{item:e.value,x:n.offsetX/t.offsetWidth,y:n.offsetY/t.offsetHeight,originalEvent:n}}))}),t.addEventListener("dragend",n=>{t.dispatchEvent(new CustomEvent("calendar-dragend",{cancelable:!0,bubbles:!0,detail:{item:e.value,originalEvent:n}}))});else if("dropcage"==e.arg){let e=null;t.addEventListener("dragover",n=>{if(!e)return e=t.getBoundingClientRect(),t.dispatchEvent(new CustomEvent("calendar-dragenter",{detail:{originalEvent:n}}))}),window.addEventListener("dragleave",n=>{if(!e)return;let a;return a=void 0===n.clientX?{x:n.pageX+document.documentElement.scrollLeft,y:n.pageY+document.documentElement.scrollTop}:{x:n.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,y:n.clientY+document.body.scrollTop+document.documentElement.scrollTop},a.x>e.left+e.width-1||a.xe.top+e.height-1||a.y{if(e)return e=null,t.dispatchEvent(new CustomEvent("calendar-dragleave",{detail:{originalEvent:n}}))})}else"dropzone"==e.arg&&t.addEventListener(e.modifiers.once?"dragenter":"dragover",n=>{const a=e.value instanceof Function?e.value(n):e.value,i=a.timestamp?a:{timestamp:a};t.dispatchEvent(new CustomEvent("calendar-dragchange",{cancelable:!0,bubbles:!0,detail:i}))})},updated(t,e,n,a){"draggable"==e.arg&&t.dispatchEvent(new CustomEvent("update-my-value",{cancelable:!0,detail:{item:e.value}}))}},yt={name:"CalendarDragAndDrop",directives:{CalDnd:vt},provide(){return{events:Vue.computed(()=>this.correctedEvents),backgrounds:Vue.computed(()=>this.backgrounds),dropAllowed:Vue.computed(()=>this.dragging&&this.dropAllowed)}},inject:{mode:"mode",dropableEvents:"dropableEvents"},props:{events:Array,backgrounds:Array},emits:["drop"],data:()=>({dragging:!1,allowed:!1,draggedInternalEvent:null,draggedExternalEvent:null,targetTimestamp:0,targetGridEnds:null,dropAllowed:!1,shadowPreview:!1}),computed:{correctedEvents(){if(this.dragging){if(this.draggedInternalEvent){const t=this.events.findIndex(t=>t.id==this.draggedInternalEvent.id);return this.previewEvent&&!this.shadowPreview?this.events.toSpliced(t,1,this.previewEvent):this.events.toSpliced(t,1)}if(this.previewEvent&&!this.shadowPreview)return[...this.events,this.previewEvent]}return this.events},correctedBackgrounds(){return this.dragging&&this.shadowPreview?[...this.backgrounds,{start:new Date(this.targetTimestamp),class:"shadow-preview"}]:this.backgrounds},previewEvent(){if(!this.dragging||!this.dropAllowed)return null;if(!this.targetTimestamp)return null;const t=this.draggedInternalEvent||this.draggedExternalEvent;if(!t)return null;let e=t.end-t.start;return this.targetGridEnds&&(e=this.targetGridEnds.find(t=>t>=this.targetTimestamp+e)-this.targetTimestamp),{orig:t.orig,start:this.targetTimestamp,end:this.targetTimestamp+e}}},methods:{onDragstart(t){const e=bt.convertToTransferData(t.detail.item.orig);bt.isValidDragObject(e)&&(bt.setTransferData(t.detail.originalEvent,e),this.draggedInternalEvent=t.detail.item)},onDragend(){this.draggedInternalEvent=null,this.dragging=!1},onDragenter(t){if(this.dragging=!0,this.draggedInternalEvent)this.dropAllowed=this.dropableEvents(this.draggedInternalEvent,this.mode);else{const e=bt.getValidTransferData(t.detail.originalEvent);this.draggedExternalEvent=e?{id:e.id,type:e.type,start:e.isostart?luxon.DateTime.fromISO(e.isostart).setZone(this.timezone):luxon.DateTime.local().setZone(this.timezone),end:e.isoend?luxon.DateTime.fromISO(e.isoend).setZone(this.timezone):luxon.DateTime.local().setZone(this.timezone),orig:e}:null,this.dropAllowed=this.dropableEvents(e,this.mode)}},onDragleave(){this.dragging=!1},onDragchange(t){this.targetTimestamp=t.detail.timestamp,this.targetGridEnds=t.detail.ends||null},onDrop(t){this.dragging&&this.dropAllowed&&(this.$emit("drop",t,this.previewEvent.start,this.previewEvent.end),this.dropAllowed=!1,this.dragging=!1)}},template:'\n\t\n\t\t\n\t\n\t'},wt={name:"CalendarHeader",components:{DatePicker:{name:"CalendarHeaderDatepicker",components:{VueDatePicker:VueDatePicker},inject:["locale","timezone"],props:{date:{type:luxon.DateTime,required:!0},mode:{type:String,required:!0},listLength:{type:Number,default:7}},emits:["update:date"],computed:{convertedDate(){return this.date.setZone(this.timezone).setZone("local",{keepLocalTime:!0})},current(){switch(this.mode){case"month":return{month:this.convertedDate.month-1,year:this.convertedDate.year};case"list":return[this.convertedDate.startOf("day").ts,this.convertedDate.startOf("day").plus({days:this.listLength}).ts-1];case"week":return[this.convertedDate.startOf("week",{useLocaleWeeks:!0}).ts,this.convertedDate.endOf("week",{useLocaleWeeks:!0}).ts];case"day":return this.convertedDate;default:return null}},title(){switch(this.mode){case"month":return this.date.toLocaleString({month:"long",year:"numeric"});case"week":var t=this.date.localWeekYear,e=this.date.toFormat("nn");return this.$p.t("calendar/year_kw",{year:t,week:e});case"list":return this.date.toLocaleString(luxon.DateTime.DATE_FULL)+"-"+this.date.plus({days:this.listLength-1}).toLocaleString(luxon.DateTime.DATE_FULL);case"day":return this.date.toLocaleString(luxon.DateTime.DATE_FULL);default:return"View not Supported"}},weekStart(){return luxon.Info.getStartOfWeek(this.date)%7}},methods:{update(t){let e;switch(this.mode){case"month":t.month++,e=luxon.DateTime.fromObject(t).setZone(this.timezone,{keepLocalTime:!0}).setLocale(this.locale);break;case"list":case"week":e=luxon.DateTime.fromJSDate(t[0]).setZone(this.timezone,{keepLocalTime:!0}).setLocale(this.locale);break;case"day":e=luxon.DateTime.fromJSDate(t).setZone(this.timezone,{keepLocalTime:!0}).setLocale(this.locale);break;default:return}this.$emit("update:date",e)},weekNumbers(t){return luxon.DateTime.fromJSDate(t,{locale:this.locale}).localWeekNumber}},template:'\n\t title"\n\t\t:month-picker="mode == \'month\'"\n\t\t:week-picker="mode == \'week\'"\n\t\t:range="mode == \'list\' ? { autoRange: listLength - 1 } : false"\n\t\t:text-input="mode == \'day\'"\n\t\t:week-start="weekStart"\n\t\t:week-numbers="{ type: weekNumbers }"\n\t\t:clearable="false"\n\t\t:enable-time-picker="false"\n\t\t:config="{ keepActionRow: mode != \'month\' }"\n\t\t:action-row="{ showSelect: false, showCancel: false, showNow: mode != \'month\', showPreview: false }"\n\t\tauto-apply\n\t\tsix-weeks\n\t\tteleport\n\t\t:locale="locale"\n\t\t:now-button-label="$p.t(\'calendar/today\')"\n\t\t:week-num-name="$p.t(\'calendar/kw\')"\n\t/>\n\t'}},props:{date:{type:luxon.DateTime,required:!0},mode:{type:String,required:!0},modeOptions:{type:Object,default:{}},btnMonth:Boolean,btnWeek:Boolean,btnDay:Boolean,btnList:Boolean},emits:["next","prev","click:mode","update:date","update:mode"],data:()=>({open:!1}),methods:{clickMode(t,e){this.$emit("click:mode",t),t.defaultPrevented||this.$emit("update:mode",e)}},template:'\n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t
    \n\t
    \n\t'},kt={name:"CalendarSlider",inject:{time:{from:"sliderTime",default:".3s"}},emits:["slid"],data:()=>({target:0,extrasAfter:0,extrasBefore:0,running:!1,promiseResolve:null}),computed:{itemsAfter(){return[...Array(this.extrasAfter)].map((t,e)=>1+e)},itemsBefore(){return[...Array(this.extrasBefore)].map((t,e)=>e-this.extrasBefore)},styleSlider(){const t={position:"absolute",top:0,left:0,width:"100%",height:"100%"};return this.running&&(t.left=100*-this.target+"%",t.transition="left "+this.time+" ease-in-out"),t},styleBefore(){return{position:"absolute",top:0,height:"100%",display:"flex",right:"100%",width:100*this.extrasBefore+"%"}},styleAfter(){return{position:"absolute",top:0,height:"100%",display:"flex",left:"100%",width:100*this.extrasAfter+"%"}}},methods:{prevPage(){return this.slidePages(-1)},nextPage(){return this.slidePages(1)},slidePages(t){return new Promise(e=>{this.promiseResolve=e,this.running=!0;const n=this.target+t;n>0?this.extrasAftern&&(this.extrasBefore=-n),this.target=n})},endSlide(){this.promiseResolve&&(this.promiseResolve(this.target),this.promiseResolve=null),this.$emit("slid",this.target),this.running=!1,this.target=0,this.extrasAfter=this.extrasBefore=0}},template:'\n\t\n\t\t\n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\t\t\n\t\n\t'};const _t=[];function xt(t,e,n){const a=_t.findIndex(e=>e.el==t);a>=0&&(t.removeEventListener("click",_t[a].listener),_t.splice(a,1));const i=t=>{t.preventDefault(),t.stopPropagation();const a=new CustomEvent("cal-click",{cancelable:!0,bubbles:!0,detail:{source:e,value:n}});t.target.dispatchEvent(a)};_t.push({el:t,listener:i}),t.addEventListener("click",i)}var At={mounted(t,e,n){"container"==e.arg?t.addEventListener("cal-click",t=>{const n=new Event("click:"+t.detail.source,{cancelable:!0});if(e.instance.$emit("click:"+t.detail.source,n,t.detail.value),!n.defaultPrevented){const e=new CustomEvent("cal-click-default",{cancelable:!0,bubbles:!0,detail:t.detail});t.target.dispatchEvent(e)}}):xt(t,e.arg,e.value)},updated(t,e,n,a){"container"!=e.arg&&xt(t,e.arg,e.value)}},$t={name:"CalendarBase",components:{BaseDraganddrop:yt,BaseHeader:wt,BaseSlider:kt,BsModal:s},directives:{CalClick:At},provide(){return{locale:Vue.computed(()=>this.locale),timezone:Vue.computed(()=>this.timezone),timeGrid:Vue.computed(()=>this.timeGrid),draggableEvents:Vue.computed(()=>this.draggableEvents?Array.isArray(this.draggableEvents)?t=>this.draggableEvents.includes(t.type):this.draggableEvents instanceof Function?this.draggableEvents:()=>!0:()=>!1),dropableEvents:Vue.computed(()=>this.onDrop?Array.isArray(this.dropableEvents)?t=>this.dropableEvents.includes(t.type):this.dropableEvents instanceof Function?this.dropableEvents:()=>!0:()=>!1),hasDragoverFunc:Vue.computed(()=>this.onDragover),mode:Vue.computed(()=>this.mode)}},props:{locale:{type:String,default:"de"},timezone:{type:String,required:!0},date:{type:[Date,String,Number,luxon.DateTime],default:t=>luxon.DateTime.now().setZone(t.timezone).startOf("day")},modes:{type:Object,required:!0,default:{}},mode:String,modeOptions:Object,events:{type:Array,default:[]},backgrounds:{type:Array,default:[]},showBtns:Boolean,btnMonth:{type:Boolean,default:void 0},btnWeek:{type:Boolean,default:void 0},btnDay:{type:Boolean,default:void 0},btnList:{type:Boolean,default:void 0},timeGrid:Array,draggableEvents:[Boolean,Array,Function],dropableEvents:[Boolean,Array,Function],onDragover:Function,onDrop:Function},emits:["click:next","click:prev","click:mode","click:event","click:day","click:week","update:date","update:mode","update:range","drop"],data:()=>({internalView:null,internalDate:null,modalEvent:null}),computed:{convertedEvents(){return this.events.map(t=>({id:t.type+t[t.type+"_id"],type:t.type,start:luxon.DateTime.fromISO(t.isostart).setZone(this.timezone),end:luxon.DateTime.fromISO(t.isoend).setZone(this.timezone),orig:t}))},convertedBackgrounds(){return this.backgrounds.map(t=>{const e={...t};return e.start&&(Number.isInteger(e.start)?e.start=luxon.DateTime.fromMillis(e.start,{zone:this.timezone,locale:this.locale}):e.start instanceof Date?e.start=luxon.DateTime.fromJSDate(e.start,{zone:this.timezone,locale:this.locale}):("string"==typeof e.start||e.start instanceof String)&&(e.start=luxon.DateTime.fromISO(e.start,{zone:this.timezone,locale:this.locale}))),e.end&&(Number.isInteger(e.end)?e.end=luxon.DateTime.fromMillis(e.end,{zone:this.timezone,locale:this.locale}):e.end instanceof Date?e.end=luxon.DateTime.fromJSDate(e.end,{zone:this.timezone,locale:this.locale}):("string"==typeof e.end||e.end instanceof String)&&(e.end=luxon.DateTime.fromISO(e.end,{zone:this.timezone,locale:this.locale}))),e})},sDate(){return this.date instanceof luxon.DateTime?this.date:luxon.DateTime.fromJSDate(new Date(this.date)).setZone(this.timezone)},cDate:{get(){return(this.internalDate?this.internalDate:this.sDate).setLocale(this.locale)},set(t){this.internalDate=t,this.$emit("update:date",t,this.cMode)}},sMode(){let t=this.mode;return t&&(t=t.toLowerCase()),t&&this.modes[t]||(t=Object.keys(this.modes).find(Boolean)),t||""},cMode:{get(){return this.internalView?this.internalView:this.sMode},set(t){this.internalView=t,this.$emit("update:mode",t,this.cDate)}}},watch:{sDate(t,e){this.sDate.isValid&&!this.sDate.hasSame(this.internalDate,"day")&&(this.internalDate=this.sDate)},sMode(){this.sMode&&(this.internalView=this.sMode)}},methods:{clickPrev(){const t=new Event("click:prev",{cancelable:!0});this.$emit("click:prev",t),t.defaultPrevented||this.$refs.mode.prevPage()},clickNext(){const t=new Event("click:next",{cancelable:!0});this.$emit("click:next",t),t.defaultPrevented||this.$refs.mode.nextPage()},handleClickDefaults(t){switch(t.detail.source){case"day":"day"!=this.cMode&&this.modes.day&&(t.stopPropagation(),this.cDate=t.detail.value,this.cMode="day");break;case"week":"week"!=this.cMode&&this.modes.week&&(t.stopPropagation(),this.cDate=luxon.DateTime.fromObject({localWeekNumber:t.detail.value.number,localWeekYear:t.detail.value.year},{zone:this.cDate.zoneName,locale:this.cDate.locale}),this.cMode="week")}},onDropItem(t,e,n){this.$emit("drop",t,e,n)},showEventModal(t){this.modalEvent=t,this.$refs.modal.show()},hideEventModal(){this.modalEvent&&(this.modalEvent.closeFn=void 0),this.$refs.modal.hide(),this.modalEvent=null},onModalHidden(){this.modalEvent.closeFn&&this.modalEvent.closeFn()}},beforeUnmount(){this.hideEventModal()},template:'\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t
    \n\t'},St={getRoomInfo:(t,e,n)=>({method:"post",url:"/api/frontend/v1/LvPlan/getRoomplan",params:{ort_kurzbz:t,start_date:e,end_date:n}}),getLvPlan:(t,e,n)=>({method:"get",url:"/api/frontend/v1/LvPlan/getLvPlan",params:{start_date:t,end_date:e,lv_id:n}}),eventsPersonal:(t,e)=>({method:"post",url:"/api/frontend/v1/lvPlan/eventsPersonal",params:{start_date:t,end_date:e}}),eventsLv:(t,e,n)=>({method:"post",url:"/api/frontend/v1/lvPlan/eventsLv",params:{lv_id:t,start_date:e,end_date:n}}),getStunden:()=>({method:"get",url:"/api/frontend/v1/LvPlan/Stunden"}),getOrtReservierungen:(t,e,n)=>({method:"post",url:`/api/frontend/v1/LvPlan/getReservierungen/${t}`,params:{start_date:e,end_date:n}}),getLvPlanReservierungen:(t,e)=>({method:"post",url:"/api/frontend/v1/LvPlan/getReservierungen",params:{start_date:t,end_date:e}}),getLehreinheitStudiensemester:t=>({method:"get",url:`/api/frontend/v1/LvPlan/getLehreinheitStudiensemester/${t}`}),studiensemesterDateInterval:t=>({method:"get",url:`/api/frontend/v1/LvPlan/studiensemesterDateInterval/${t}`}),LvPlanEvents:(t,e,n)=>({method:"post",url:"/api/frontend/v1/LvPlan/LvPlanEvents",params:{start_date:t,end_date:e,lv_id:n}}),getLv:t=>({method:"get",url:"/api/frontend/v1/LvPlan/getLv/"+t})};var Tt={name:"GridLineEvent",directives:{CalDnd:vt,CalClick:At},inject:{draggableEvents:"draggableEvents",mode:"mode"},props:{event:{type:Object,required:!0,validator:t=>t.start&&t.end&&t.orig}},computed:{isHeaderOrFooter(){return["header","footer"].includes(this.event.orig)},draggable(){return!this.isHeaderOrFooter&&this.draggableEvents(this.event.orig,this.mode)},classes(){const t=[];return this.isHeaderOrFooter?t.push("event-"+this.event.orig):(this.event.startsHere&&t.push("event-begin"),this.event.endsHere&&t.push("event-end")),t}},template:'\n\t\n\t\t\n\t\t\t{{ event.orig }}\n\t\t\n\t\n\t'},zt={name:"CalendarGrid",components:{GridLine:{name:"GridLine",components:{LineEvent:Tt,LineBackground:{name:"GridLineBackground",inject:{flipAxis:"flipAxis"},props:{start:{type:luxon.DateTime,required:!0},end:{type:luxon.DateTime,required:!0},background:{type:Object,required:!0,validator:t=>!(!t.start&&!t.end)&&((!t.start||t.start instanceof luxon.DateTime)&&(!t.end||t.end instanceof luxon.DateTime))}},computed:{styles(){if(!this.background.endsHere&&!this.background.startsHere)return this.background.style;const t=(this.end.ts-this.start.ts)/100;let e={};return this.background.startsHere&&(e[this.flipAxis?"left":"top"]=this.background.start.diff(this.start)/t+"%"),this.background.endsHere&&(e[this.flipAxis?"right":"bottom"]=this.end.diff(this.background.end)/t+"%"),this.background.style?[this.background.style,e]:e},classes(){if(!this.background.endsHere&&!this.background.startsHere)return this.background.class;const t=[];return this.background.class&&t.push(this.background.class),this.background.startsHere&&t.push("bg-begin"),this.background.endsHere&&t.push("bg-end"),t}},template:'\n\t\n\t\t{{ background.label }}\n\t\n\t'}},inject:{axisRow:"axisRow"},props:{date:{type:luxon.DateTime,required:!0},start:{type:luxon.DateTime,required:!0},end:{type:luxon.DateTime,required:!0},events:{type:Array,default:[]},backgrounds:{type:Array,default:[]}},computed:{eventsWithRowInfo(){const t=[];return this.events.forEach(e=>{const n=[1,-1];e.startsHere&&(n[0]="t_"+e.start.diff(this.date).toMillis()),e.endsHere&&(n[1]="t_"+e.end.diff(this.date).toMillis()),t.push({...e,rows:n})}),t}},template:'\n\t\n\t\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t'},GridLineEvent:Tt},directives:{CalDnd:vt},inject:{originalEvents:"events",originalBackgrounds:"backgrounds",dropAllowed:"dropAllowed"},provide(){return{flipAxis:Vue.computed(()=>this.flipAxis),axisRow:Vue.computed(()=>this.axisRow)}},props:{axisMain:{type:Array,required:!0,validator:t=>t.every(t=>t instanceof luxon.DateTime)},axisParts:{type:Array,required:!0,validator:t=>t.every(t=>t instanceof luxon.Duration||Number.isInteger(t)||(t.start instanceof luxon.Duration||Number.isInteger(t.start))&&(t.end instanceof luxon.Duration||Number.isInteger(t.end)))},flipAxis:Boolean,allDayEvents:Boolean,axisMainCollapsible:Boolean,snapToGrid:Boolean},data:()=>({dragging:!1,resizeObserver:null,mutationObserver:null,userScroll:!0}),computed:{axisRow(){return this.flipAxis?"column":"row"},axisCol(){return this.flipAxis?"row":"column"},axisPartsWithBreaks(){return this.axisParts.reduce((t,e,n)=>{const a=e.start||e,i=e.end;if(t.length){const e=t.pop();Array.isArray(e)?t.push({start:e[0],end:a,index:e[1]}):e!=a&&t.push({start:e,end:a})}return i?(t.push({start:a,end:i,index:n}),t.push(i)):t.push([a,n]),t},[]).slice(0,-1)},axisPartsSave(){return this.axisParts[this.axisParts.length-1].end?this.axisParts:this.axisParts.slice(0,-1)},start(){return this.axisPartsWithBreaks[0].start},end(){return this.axisPartsWithBreaks[this.axisPartsWithBreaks.length-1].end},ends(){const t=[],e=this.axisPartsWithBreaks.filter(t=>void 0!==t.index).map(t=>t.end);for(var n of this.axisMain)for(var a of e)t.push(n.plus(a));return t},axisMainBorders(){return this.axisMain.reduce((t,e)=>t.concat([e.plus(this.start),e.plus(this.end)]),[])},eventsAllDay(){return this.allDayEvents?this.mapIntoMainAxis(this.originalEvents.filter(t=>t.orig.allDayEvent)):[]},eventsNormal(){return this.allDayEvents?this.mapIntoMainAxis(this.originalEvents.filter(t=>!t.orig.allDayEvent)):this.events},events(){return this.mapIntoMainAxis(this.originalEvents)},backgrounds(){return this.mapIntoMainAxis(this.originalBackgrounds)},hasValidEvents(){return this.events.find(t=>t.length)},styleGridCols(){let t="repeat("+this.axisMain.length+", 1fr)";return this.axisMainCollapsible&&this.hasValidEvents&&(t=this.events.map(t=>t.length?"1fr":"var(--fhc-calendar-axis-collapsible, .5fr)").join(" ")),t},styleGridRows(){const t={};return this.axisPartsWithBreaks.forEach(e=>{let n=e.start.toMillis();t[n]||(t[n]=["t_"+n]),void 0!==e.index&&t[n].push("ps_"+e.index),n=e.end.toMillis(),t[n]||(t[n]=["t_"+n]),void 0!==e.index&&t[n].push("pe_"+e.index)}),this.eventsNormal.forEach((e,n)=>{let a=this.axisMain[n];e.forEach(e=>{if(e.startsHere||e.endsHere){if(e.startsHere){let n=e.start.diff(a).toMillis();t[n]||(t[n]=["t_"+n,"e_"+n])}if(e.endsHere){let n=e.end.diff(a).toMillis();t[n]||(t[n]=["t_"+n,"e_"+n])}}})}),Object.keys(t).sort((t,e)=>parseInt(t)-parseInt(e)).map((e,n,a)=>{let i=a[n+1];return i?"["+t[e].join(" ")+"] "+(i-e)+"fr":(t[e].push("end"),"["+t[e].join(" ")+"]")}).join(" ")}},methods:{mapIntoMainAxis(t){const e=Array.from({length:this.axisMain.length},()=>Array());return t.forEach(t=>{const n=t.start||this.axisMainBorders[0].plus(-1),a=t.end||this.axisMainBorders[this.axisMainBorders.length-1].plus(1);for(var i=0;is){const l=n>=s,o=a<=r;e[i].push({...t,startsHere:l,endsHere:o})}}}),e},getPageTop(t){let e=t.offsetTop;return t.offsetParent&&(e+=this.getPageTop(t.offsetParent)),e},getPageLeft(t){let e=t.offsetLeft;return t.offsetParent&&(e+=this.getPageLeft(t.offsetParent)),e},getTimestampFromMouse(t,e){let n,a;return this.flipAxis?(n=t.pageX-this.getPageLeft(this.$refs.body)+this.$refs.main.scrollLeft,a=n/this.$refs.body.offsetWidth):(n=t.pageY-this.getPageTop(this.$refs.body)+this.$refs.main.scrollTop,a=n/this.$refs.body.offsetHeight),e+this.start+Math.floor((this.end-this.start)*a)},enableAutoScroll(){this.resizeObserver||(this.resizeObserver=new ResizeObserver(this.scrollToEarliestEvent)),this.resizeObserver.observe(this.$refs.body),this.mutationObserver||(this.mutationObserver=new MutationObserver(t=>{t.some(t=>t.addedNodes.length&&[].some.call(t.addedNodes,t=>t.matches&&t.matches(".fhc-calendar-base-grid-line-event")))&&this.scrollToEarliestEvent()})),this.mutationObserver.observe(this.$refs.body,{subtree:!0,childList:!0}),this.scrollToEarliestEvent()},disableAutoScroll(){this.resizeObserver&&this.resizeObserver.disconnect(),this.resizeObserver=null,this.mutationObserver&&this.mutationObserver.disconnect(),this.mutationObserver=null},scrollToEarliestEvent(){const t=this.$refs.scroller.querySelectorAll(".fhc-calendar-base-grid-line-event");let e=[0,null];for(var n of t.values()){const t=n.offsetTop;(!e[1]||t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\t'},Dt={name:"LabelDay",directives:{CalClick:At},props:{date:{type:luxon.DateTime,required:!0}},computed:{titleFull(){return this.date.toLocaleString({day:"numeric",month:"long",year:"numeric"})},titleLong(){return this.date.toLocaleString({day:"2-digit",month:"2-digit",year:"numeric"})},titleShort(){return this.date.toLocaleString({day:"numeric",month:"numeric"})},titleNarrow(){return this.date.toLocaleString({day:"numeric"})}},template:'\n\t\n\t\t{{ titleFull }}\n\t\t{{ titleLong }}\n\t\t{{ titleShort }}\n\t\t{{ titleNarrow }}\n\t\n\t'},Et={name:"LabelDow",directives:{CalClick:At},props:{date:{type:luxon.DateTime,required:!0}},computed:{titleLong(){return this.date.toLocaleString({weekday:"long"})},titleShort(){return this.date.toLocaleString({weekday:"short"})},titleNarrow(){return this.date.toLocaleString({weekday:"narrow"})}},template:'\n\t\n\t\t{{ titleLong }}\n\t\t{{ titleShort }}\n\t\t{{ titleNarrow }}\n\t\n\t'},Ct={name:"LabelTime",props:{part:{type:[luxon.Duration,Number,Object],required:!0,validator(t){if(t instanceof Object){if(t instanceof luxon.Duration)return!0;let e=!0,n=!0;return t.start&&(e=t.start instanceof luxon.Duration||Number.isInteger(t.start)),t.end&&(n=t.end instanceof luxon.Duration||Number.isInteger(t.end)),e&&n}return!0}}},computed:{sanitizedTimestamps(){return this.part.start||this.part.end?this.part:{start:this.part}},start(){return this.sanitizedTimestamps.start?this.formatTime(this.sanitizedTimestamps.start):null},end(){return this.sanitizedTimestamps.end?this.formatTime(this.sanitizedTimestamps.end):null}},methods:{formatTime:t=>t.toISOTime({suppressSeconds:!0})},template:'\n\t
    \n\t\t{{ start }}\n\t\t-\n\t\t{{ end }}\n\t
    \n\t'};var Ot={name:"ModeDay",components:{BaseSlider:kt,DayView:{name:"DayView",components:{CalendarGrid:zt,LabelDay:Dt,LabelDow:Et,LabelTime:Ct},inject:{timeGrid:"timeGrid",originalEvents:"events",timezone:"timezone"},props:{day:{type:luxon.DateTime,required:!0},emptyMessage:String,emptyMessageDetails:String},emits:["requestModalOpen","requestModalClose"],data:()=>({chosenEvent:null,gridMainRef:null}),computed:{axisMain(){return[this.day.startOf("day")]},axisParts(){return this.timeGrid?this.timeGrid.map(t=>({start:luxon.Duration.fromISOTime(t.start),end:luxon.Duration.fromISOTime(t.end)})):Array.from({length:17},(t,e)=>luxon.Duration.fromObject({hours:e+7}))},events(){return this.originalEvents.filter(t=>t.startthis.day).sort((t,e)=>t.start.ts-e.start.ts).map(t=>t.orig)},currentEvent(){if(this.chosenEvent&&this.events.find(t=>t==this.chosenEvent))return this.chosenEvent;let t=null;return this.events&&(t=this.events.find(Boolean)),t&&"loading"==t.type?null:t},isToday(){return this.day.hasSame(luxon.DateTime.now().setZone(this.timezone),"day")}},watch:{compact(){this.compact?this.chosenEvent&&this.$emit("requestModalOpen",{event:this.chosenEvent,closeFn:()=>{this.chosenEvent=null}}):this.$emit("requestModalClose")}},methods:{handleClickDefaults(t){"event"==t.detail.source&&(this.chosenEvent=t.detail.value,this.compact&&this.$emit("requestModalOpen",{event:this.chosenEvent,closeFn:()=>{this.chosenEvent=null}}))}},setup(){const t=Vue.ref(null),{compact:e}=function(t,e){const n=Vue.ref(!1),a=Vue.ref(!1),i=Vue.ref(!1),s=Vue.computed(()=>Vue.isRef(t)?t.value&&t.value.$el?t.value.$el:t.value:t),r=Vue.computed(()=>{const t=Vue.isRef(e)?e.value:e;return Number.isInteger(t)?[["compact",t]]:Array.isArray(t)?t.map((t,e)=>[e,t]).sort((t,e)=>t[1]-e[1]):Object.entries(t).sort((t,e)=>t[1]-e[1])});function l(){if(void 0===s.value.offsetWidth)return;const t=r.value.find(t=>t[1]>s.value.offsetWidth);a.value=t?t[0]:"full",n.value=a.value==r.value[0][0]}const o=new ResizeObserver(()=>{s.value&&l()});function d(){s.value&&(l(),o.observe(s.value),i.value=!0)}function c(){i.value&&o.disconnect()}return Vue.onMounted(d),Vue.onUnmounted(c),Vue.watchEffect(()=>{s.value&&(c(),d())}),{compact:n,size:a}}(t,750);return{container:t,compact:e}},mounted(){this.gridMainRef=this.$refs.grid.$refs.main},template:'\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t{{ emptyMessage }}\n\t\t\t\n\t\t\n\t\t
    \n\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t\t

    {{ emptyMessageDetails }}

    \n\t\t\t\n\t\t\n\t\n\t'}},props:{currentDate:{type:luxon.DateTime,required:!0}},emits:["update:currentDate","update:range","click","requestModalOpen","requestModalClose"],data(){return{focusDate:this.currentDate,rangeOffset:0}},computed:{range(){let t=this.focusDate.startOf("day"),e=this.focusDate.endOf("day");return 0!=this.rangeOffset&&(this.rangeOffset<0?t=t.plus({days:this.rangeOffset}):e=e.plus({days:this.rangeOffset})),luxon.Interval.fromDateTimes(t,e)}},watch:{currentDate(){this.currentDate.locale!=this.focusDate.locale?(this.focusDate=this.currentDate,this.$emit("update:range",this.range)):(this.rangeOffset=this.currentDate.startOf("day").diff(this.focusDate.startOf("day"),"days").days,this.rangeOffset&&(this.$refs.view.$refs.grid.disableAutoScroll(),this.$emit("update:range",this.range),this.$refs.slider.slidePages(this.rangeOffset).then(this.updatePage)))}},methods:{prevPage(){this.rangeOffset=this.$refs.slider.target-1,this.$refs.view.$refs.grid.disableAutoScroll(),this.$emit("update:range",this.range),this.$refs.slider.prevPage().then(this.updatePage)},nextPage(){this.rangeOffset=this.$refs.slider.target+1,this.$refs.view.$refs.grid.disableAutoScroll(),this.$emit("update:range",this.range),this.$refs.slider.nextPage().then(this.updatePage)},updatePage(t){const e=this.focusDate.plus({days:t});this.focusDate=e,this.rangeOffset=0,this.$emit("update:currentDate",this.focusDate),this.$emit("update:range",this.range),this.$refs.view.$refs.grid.enableAutoScroll()},viewAttrs(t){const e=this.focusDate.plus({days:t});return{...this.$attrs,day:e}}},mounted(){this.$emit("update:range",this.range),this.$refs.view.$refs.grid.enableAutoScroll()},template:'\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\t'},Ft={name:"ModeWeek",components:{BaseSlider:kt,WeekView:{name:"WeekView",components:{CalendarGrid:zt,LabelDay:Dt,LabelDow:Et,LabelTime:Ct},inject:{timeGrid:"timeGrid",timezone:"timezone"},props:{day:{type:luxon.DateTime,required:!0},collapseEmptyDays:Boolean},computed:{start(){return this.day.startOf("week",{useLocaleWeeks:!0})},axisMain(){return Array.from({length:7},(t,e)=>this.start.plus({days:e}))},axisParts(){return this.timeGrid?this.timeGrid.map(t=>({start:luxon.Duration.fromISOTime(t.start),end:luxon.Duration.fromISOTime(t.end)})):Array.from({length:17},(t,e)=>luxon.Duration.fromObject({hours:e+7}))}},methods:{isToday(t){return t.hasSame(luxon.DateTime.now().setZone(this.timezone),"day")}},template:'\n\t
    \n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t
    \n\t'}},props:{currentDate:{type:luxon.DateTime,required:!0}},emits:["update:currentDate","update:range","click","requestModalOpen"],data(){return{focusDate:this.currentDate,rangeOffset:0}},computed:{range(){let t=this.focusDate.startOf("week",{useLocaleWeeks:!0}),e=this.focusDate.endOf("week",{useLocaleWeeks:!0});return 0!=this.rangeOffset&&(this.rangeOffset<0?t=t.plus({weeks:this.rangeOffset}):e=e.plus({weeks:this.rangeOffset})),luxon.Interval.fromDateTimes(t,e)}},watch:{currentDate(){this.currentDate.locale!=this.focusDate.locale?(this.focusDate=this.currentDate,this.$emit("update:range",this.range)):(this.rangeOffset=this.currentDate.startOf("week",{useLocaleWeeks:!0}).diff(this.focusDate.startOf("week",{useLocaleWeeks:!0}),"weeks").weeks,this.rangeOffset&&(this.$refs.view.$refs.grid.disableAutoScroll(),this.$emit("update:range",this.range),this.$refs.slider.slidePages(this.rangeOffset).then(this.updatePage)))}},methods:{prevPage(){this.rangeOffset=this.$refs.slider.target-1,this.$refs.view.$refs.grid.disableAutoScroll(),this.$emit("update:range",this.range),this.$refs.slider.prevPage().then(this.updatePage)},nextPage(){this.rangeOffset=this.$refs.slider.target+1,this.$refs.view.$refs.grid.disableAutoScroll(),this.$emit("update:range",this.range),this.$refs.slider.nextPage().then(this.updatePage)},updatePage(t){const e=this.focusDate.plus({weeks:t});this.focusDate=e,this.rangeOffset=0,this.$emit("update:currentDate",this.focusDate),this.$emit("update:range",this.range),this.$refs.view.$refs.grid.enableAutoScroll()},viewAttrs(t){const e=this.focusDate.plus({weeks:t});return{...this.$attrs,day:e}},handleClickDefaults(t){switch(t.detail.source){case"day":this.$emit("update:currentDate",t.detail.value);break;case"event":this.$emit("requestModalOpen",{event:t.detail.value})}}},mounted(){this.$emit("update:range",this.range),this.$refs.view.$refs.grid.enableAutoScroll()},template:'\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\t'},Pt={name:"ModeMonth",components:{BaseSlider:kt,MonthView:{name:"MonthView",components:{CalendarGrid:zt,LabelWeek:{name:"LabelWeek",directives:{CalClick:At},props:{date:{type:luxon.DateTime,required:!0}},computed:{weeks(){const t=this.date.startOf("week",{useLocaleWeeks:!0}),e=this.date.endOf("week",{useLocaleWeeks:!0}),n=[{number:t.localWeekNumber,year:t.localWeekYear},{number:e.localWeekNumber,year:e.localWeekYear}];return n[0].number==n[1].number&&n.pop(),n}},template:'\n\t
    \n\t\t\n\t\t\t{{ week.number }}\n\t\t\n\t
    \n\t'},LabelDow:Et,LabelDay:Dt},provide(){return{events:Vue.computed(()=>{const t=this.events.map(t=>{const e=t.start.startOf("day"),n=t.end.plus({days:1}).startOf("day");return{...t,start:e,end:n}});for(var e=5;e>-1;e--)for(var n=6;n>-1;n--){const a=this.axisMain[e].plus(this.axisParts[n]);t.unshift({start:a,end:a.plus({days:1}),orig:"header"})}return t})}},inject:{events:"events",timezone:"timezone"},props:{day:{type:luxon.DateTime,required:!0}},computed:{axisMain(){const t=this.day.startOf("month").startOf("week",{useLocaleWeeks:!0});return Array.from({length:6},(e,n)=>t.plus({weeks:n}))},axisParts:()=>Array.from({length:8},(t,e)=>luxon.Duration.fromObject({days:e}))},methods:{isToday(t){return t.hasSame(luxon.DateTime.now().setZone(this.timezone),"day")}},template:'\n\t
    \n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t
    \n\t'}},props:{currentDate:{type:luxon.DateTime,required:!0}},emits:["update:currentDate","update:range","click","requestModalOpen"],data(){return{focusDate:this.currentDate,rangeOffset:0}},computed:{range(){let t=this.focusDate.startOf("month").startOf("week",{useLocaleWeeks:!0}),e=t.plus({days:41}).endOf("day");if(0!=this.rangeOffset){const n=this.focusDate.plus({months:this.rangeOffset}).startOf("month").startOf("week",{useLocaleWeeks:!0});this.rangeOffset<0?t=n:e=n.plus({days:41}).endOf("day")}return luxon.Interval.fromDateTimes(t,e)}},watch:{currentDate(){this.currentDate.locale!=this.focusDate.locale?(this.focusDate=this.currentDate,this.$emit("update:range",this.range)):(this.rangeOffset=this.currentDate.startOf("month").diff(this.focusDate.startOf("month"),"months").months,this.rangeOffset&&(this.$emit("update:range",this.range),this.$refs.slider.slidePages(this.rangeOffset).then(this.updatePage)))}},methods:{prevPage(){this.rangeOffset=this.$refs.slider.target-1,this.$emit("update:range",this.range),this.$refs.slider.prevPage().then(this.updatePage)},nextPage(){this.rangeOffset=this.$refs.slider.target+1,this.$emit("update:range",this.range),this.$refs.slider.nextPage().then(this.updatePage)},updatePage(t){const e=this.focusDate.plus({months:t});this.focusDate=e,this.rangeOffset=0,this.$emit("update:currentDate",this.focusDate),this.$emit("update:range",this.range)},viewAttrs(t){return{day:this.focusDate.plus({months:t})}},handleClickDefaults(t){switch(t.detail.source){case"week":let e=luxon.DateTime.fromObject({localWeekNumber:t.detail.value.number,localWeekYear:t.detail.value.year},{zone:this.currentDate.zoneName,locale:this.currentDate.locale});this.focusDate.hasSame(e.startOf("week",{useLocaleWeeks:!0}),"month")?this.focusDate.hasSame(e.endOf("week",{useLocaleWeeks:!0}),"month")||this.$emit("update:currentDate",e.endOf("week",{useLocaleWeeks:!0})):this.$emit("update:currentDate",e.startOf("week",{useLocaleWeeks:!0}));break;case"day":this.$emit("update:currentDate",t.detail.value);break;case"event":this.$emit("requestModalOpen",{event:t.detail.value})}}},mounted(){this.$emit("update:range",this.range)},template:'\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\t'},It={name:"CalendarLvPlan",components:{FhcCalendar:$t},inject:["renderers"],props:{timezone:{type:String,required:!0},date:{type:[Date,String,Number,luxon.DateTime],default:luxon.DateTime.local()},mode:{type:String,default:"Week"},getPromiseFunc:{type:Function,required:!0}},emits:["update:date","update:mode","update:range"],data(){return{modes:{day:Vue.markRaw(Ot),week:Vue.markRaw(Ft),month:Vue.markRaw(Pt)},modeOptions:{day:{emptyMessage:Vue.computed(()=>this.$p.t("lehre/noLvFound")),emptyMessageDetails:Vue.computed(()=>this.$p.t("lehre/noLvFound"))},week:{collapseEmptyDays:!1}},teachingunits:null}},computed:{backgrounds(){let t=luxon.DateTime.now().setZone(this.timezone);return"Month"==this.mode?[{class:"background-past",end:t.startOf("day")}]:[{class:"background-past",end:t,label:t.startOf("minute").toISOTime({suppressSeconds:!0,includeOffset:!1})}]}},methods:{eventStyle(t){if(t.farbe)return"--event-bg:#"+t.farbe},updateRange(t){this.rangeInterval=t,this.$emit("update:range",t)}},setup(t,e){const n=Vue.ref(null),{events:a,lv:i}=function(t,e){let n=0;const a=Vue.ref([]),i=Vue.ref([]),s=Vue.computed(()=>a.value.concat(i.value)),r=Vue.ref(null),l=[],o=(t,e)=>Array.isArray(t)?e.concat(t):(e.push(t),e),d=(t,a)=>{let s=[];if(l.length)if(l[l.length-1]+1==t.ts)l[l.length-1]=a.ts;else if(l[l.length-1]a.ts)l.unshift(t.ts,a.ts);else{let e=l.findIndex(e=>e>=t.ts);if(e%2){if(l[e]>=a.ts)return[];let n=e==l.length-1;if(n||l[e+1]>a.ts){let i=l[e]+1;t=t.plus(i-t.ts),n||l[e+1]!=a.ts+1?l[e]=a.ts:l.splice(e,2)}else{if(l[e+2]=a.ts)return[];let n=l[e+1]+1;s=o(d(t.plus(n-t.ts),a),s)}else{if(l[e+1]=a.ts?s:(i.value.push({loading_id:n++,type:"loading",isostart:t.toISODate()+"T"+t.toISOTime(),isoend:a.toISODate()+"T"+a.toISOTime()}),o(e(t,a),s))};return Vue.watchEffect(()=>{const e=Vue.toValue(t);if(!(e instanceof luxon.Interval))return;const n=d(e.start,e.end);Promise.allSettled(n).then(t=>{t.forEach(t=>{"fulfilled"===t.status&&"success"===t.value.meta.status&&(t.value.meta.lv&&(r.value=t.value.meta.lv),a.value=a.value.concat(t.value.data),i.value=[])})})}),{events:s,lv:r}}(n,t.getPromiseFunc);return Vue.watch(i,t=>{e.emit("update:lv",t)}),{rangeInterval:n,events:a,lv:i}},created(){this.$api.call(St.getStunden()).then(t=>this.teachingunits=t.data.map(t=>({id:t.stunde,start:t.beginn,end:t.ende})))},template:'\n\t\n\t\t\n\t\t\n\t'},Mt={getAuthUID:()=>({method:"get",url:"/api/frontend/v1/AuthInfo/getAuthUID"}),getAuthInfo:()=>({method:"get",url:"/api/frontend/v1/AuthInfo/getAuthInfo"})};var Lt={name:"LvPlanLehrveranstaltung",components:{FhcCalendar:It},props:{viewData:Object,propsViewData:Object},data:()=>({lv:null}),computed:{currentDay(){return!this.propsViewData?.focus_date||isNaN(new Date(this.propsViewData?.focus_date))?luxon.DateTime.now().setZone(this.viewData.timezone).toISODate():this.propsViewData?.focus_date},currentMode(){return this.propsViewData?.mode&&["day","week","month"].includes(this.propsViewData?.mode.toLowerCase())?this.propsViewData?.mode:"Week"},currentLv(){return isNaN(parseInt(this.propsViewData?.lv_id))?null:this.propsViewData.lv_id},lvTitle(){return null===this.currentLv?"":this.lv?"English"===this.$p.user_language.value?this.lv.bezeichnung_english:this.lv.bezeichnung:""}},methods:{handleChangeDate(t,e){return this.handleChangeMode(e,t)},handleChangeMode(t,e){const n=t[0].toUpperCase()+t.slice(1),a=e.toISODate();this.$router.push({name:"LvPlan",params:{mode:n,focus_date:a,lv_id:this.currentLv}})},getPromiseFunc(t,e){return[this.$api.call(St.eventsLv(this.propsViewData.lv_id,t.toISODate(),e.toISODate())),this.$api.call(St.getLvPlanReservierungen(t.toISODate(),e.toISODate()))]}},created(){null!==this.currentLv&&this.$api.call(St.getLv(this.propsViewData?.lv_id)).then(t=>{this.lv=t.data})},template:'\n\t
    \n\t\t

    \n\t\t\t{{ $p.t(\'lehre/stundenplan\') }}\n\t\t\t\n\t\t\t\t{{ lvTitle }}\n\t\t\t\n\t\t

    \n\t\t
    \n\t\t
    \n\t\t\t{{ $p.t(\'lehre/noLvFound\') }}\n\t\t
    \n\t\t\n\t
    '};var Rt={name:"LvPlanPersonal",components:{FhcCalendar:It},props:{viewData:Object,propsViewData:Object},data:()=>({studiensemester_kurzbz:null,studiensemester_start:null,studiensemester_ende:null,uid:null,isMitarbeiter:!1,isStudent:!1}),computed:{currentDay(){return!this.propsViewData?.focus_date||isNaN(new Date(this.propsViewData?.focus_date))?luxon.DateTime.now().setZone(this.viewData.timezone).toISODate():this.propsViewData?.focus_date},currentMode(){return this.propsViewData?.mode&&["day","week","month"].includes(this.propsViewData?.mode.toLowerCase())?this.propsViewData?.mode:"Week"},downloadLinks(){if(!this.studiensemester_start||!this.studiensemester_ende||!this.uid)return!1;let t=!1;if(t=this.isStudent?"student":t,t=this.isMitarbeiter?"lektor":t,!1===t)return;const e={zone:this.viewData.timezone},n=luxon.DateTime.fromISO(this.studiensemester_start,e).toUnixInteger(),a=luxon.DateTime.fromISO(this.studiensemester_ende,e).toUnixInteger(),i=FHC_JS_DATA_STORAGE_OBJECT.app_root+"cis/private/lvplan/stpl_kalender.php?type="+t+"&pers_uid="+this.uid+"&begin="+n+"&ende="+a;return[{title:"excel",icon:"fa-solid fa-file-excel",link:i+"&format=excel"},{title:"csv",icon:"fa-solid fa-file-csv",link:i+"&format=csv"},{title:"ical1",icon:"fa-regular fa-calendar",link:i+"&format=ical&version=1&target=ical"},{title:"ical2",icon:"fa-regular fa-calendar",link:i+"&format=ical&version=2&target=ical"}]}},methods:{handleChangeDate(t,e){return this.handleChangeMode(e,t)},handleChangeMode(t,e){const n=t[0].toUpperCase()+t.slice(1),a=e.toISODate();this.$router.push({name:"MyLvPlan",params:{mode:n,focus_date:a}})},updateRange(t){this.$api.call(St.studiensemesterDateInterval(t.end.startOf("week").toISODate())).then(t=>{this.studiensemester_kurzbz=t.data.studiensemester_kurzbz,this.studiensemester_start=t.data.start,this.studiensemester_ende=t.data.ende})},getPromiseFunc(t,e){return[this.$api.call(St.eventsPersonal(t.toISODate(),e.toISODate())),this.$api.call(St.getLvPlanReservierungen(t.toISODate(),e.toISODate()))]}},created(){this.$api.call(Mt.getAuthInfo()).then(t=>{this.uid=t.data.uid,this.isMitarbeiter=t.data.isMitarbeiter,this.isStudent=t.data.isStudent})},template:'\n\t
    \n\t\t

    \n\t\t\t{{ $p.t(\'lehre/stundenplan\') }}\n\t\t\t\n\t\t\t\t{{ studiensemester_kurzbz }}\n\t\t\t\n\t\t

    \n\t\t
    \n\t\t\n\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ title }}\n\t\t\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\n\t'},Nt={components:{BsModal:s},mixins:[s],props:{pruefungenData:null|Array,bezeichnung:String,onHideBsModal:Function,onHiddenBsModal:Function,onHidePreventedBsModal:Function,onShowBsModal:Function,onShownBsModal:Function},data:()=>({result:!0}),mounted(){this.modal=this.$refs.modalContainer.modal},popup(t){return s.popup.bind(this)(null,t)},template:'\n\t\t\n\t\t\n\t'},Bt={getStudentenMail:t=>({method:"get",url:"/api/frontend/v1/Lehre/lvStudentenMail",params:{lehreinheit_id:t}}),getLvInfo:(t,e)=>({method:"get",url:`/api/frontend/v1/Lehre/LV/${t}/${e}`}),getStudentPruefungen:t=>({method:"get",url:`/api/frontend/v1/Lehre/Pruefungen/${t}`})};const jt={};var Ut={props:{studien_semester:String,lehrveranstaltung_id:Number},data:()=>({bezeichnung:null,studiengang_kuerzel:null,semester:null,orgform_kurzbz:null,sprache:null,ects:null,incoming:null,result:!0,info:null}),computed:{lektorNamesLinks(){let t={};return this.info.lektoren.forEach(e=>{let n=((e.titelpre||"")+" "+(e.vorname||"")+" "+(e.nachname||"")+" "+(e.titelpost||"")).trim();t[n]=FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+`/Cis/Profil/View/${e.uid}`}),t},lektorNames(){return this.info.lektoren.map(t=>((t.titelpre||"")+" "+(t.vorname||"")+" "+(t.nachname||"")+" "+(t.titelpost||"")).trim())},lvLeitung(){return this.info.lvLeitung&&this.info.lvLeitung.length?this.info.lvLeitung.map(t=>((t.titelpre||"")+" "+(t.vorname||"")+" "+(t.nachname||"")+" "+(t.titelpost||"")).trim()):null},oe(){return this.info.oe.organisationseinheittyp?this.info.oe.organisationseinheittyp+" "+this.info.oe.bezeichnung:""},oeLeitung(){return this.info.oeLeitung&&this.info.oeLeitung.length?this.info.oeLeitung.map(t=>((t.titelpre||"")+" "+(t.vorname||"")+" "+(t.nachname||"")+" "+(t.titelpost||"")).trim()):["-"]},koordinator(){return this.info.koordinator&&this.info.koordinator.length?this.info.koordinator.map(t=>((t.titelpre||"")+" "+(t.vorname||"")+" "+(t.nachname||"")+" "+(t.titelpost||"")).trim()):null},currentLang(){return this.info?this.info.lastLang?this.info.lastLang:this.info.lvinfo?this.info.lvinfoDefaultLang&&this.info.lvinfo[this.info.lvinfoDefaultLang]?this.info.lvinfoDefaultLang:Object.keys(this.info.lvinfo).shift():null:null}},created(){this.$api.call(Bt.getLvInfo(this.studien_semester,this.lehrveranstaltung_id)).then(t=>t.data).then(t=>{Object.assign(this,{bezeichnung:t.bezeichnung,studiengang_kuerzel:t.studiengang_kuerzel,semester:t.semester,orgform_kurzbz:t.orgform_kurzbz,sprache:t.sprache,ects:t.ects,incoming:t.incoming??"-"})}),jt[this.lehrveranstaltung_id]?this.info=jt[this.lehrveranstaltung_id]:axios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/components/Cis/Mylv/Info/"+this.studien_semester+"/"+this.lehrveranstaltung_id).then(t=>{this.info=jt[this.lehrveranstaltung_id]=t.data.retval||[]}).catch(()=>this.info={})},template:'\n\t\t\t

    {{$p.t(\'lvinfo/lehrveranstaltungsinformationen\')}}

    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    {{$p.t(\'lehre/lehrveranstaltung\')}}{{bezeichnung}}
    {{$p.t(\'lehre/studiengang\')}}{{studiengang_kuerzel}}
    {{$p.t(\'lehre/semester\')}}{{semester}}
    {{$p.t(\'lehre/studiensemester\')}}{{studien_semester}}
    {{$p.t(\'lehre/organisationsform\')}}{{orgform_kurzbz}}
    {{$p.t(\'lehre/lehrbeauftragter\')}}\n\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t{{name}}\n\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
    {{$p.t(\'lehre/lvleitung\')}}\n\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t{{name}}\n\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    {{$p.t(\'global/sprache\')}}{{sprache}}
    {{$p.t(\'lehre/ects\')}}{{ects}}
    {{$p.t(\'lehre/incomingplaetze\')}}{{incoming}}
    {{$p.t(\'lehre/organisationseinheit\')}}\n\t\t\t\t\t\t\t\t{{oe}}
    \n\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t{{$p.t(\'global/leitung\')}}: {{oeLeitung.join(\', \')}}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t
    \n\t\n\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    '};const Vt={},Ht={};function qt(t,e){return t.filter(t=>t.category==e).reduce((t,e)=>(t[e.phrase]||(t[e.phrase]=e.text),t),{})}function Gt(t){for(;Ht[t].length;){var e=Ht[t].pop();e[0].value=Jt(t,e[1],e[2]),Vue.triggerRef(e[0])}}function Jt(t,e,n){let a=Vt[t][e];return a?(n&&(a=a.replace(/\{([^}]*)\}/g,(t,e)=>void 0===n[e]?t:n[e])),a):"<< PHRASE "+e+">>"}const Wt={t_ref(t,e,n){if(void 0===n&&(Array.isArray(t)&&2==t.length||t.split&&2==t.split("/").length)&&(n=e,[t,e]=t.split?t.split("/"):t),void 0===e)return console.error("invalid input"),"";if(!Vt[t]){var a="";if(void 0!==window.FHC_JS_PHRASES_STORAGE_OBJECT){var i=qt(FHC_JS_PHRASES_STORAGE_OBJECT,t);void 0!==i[e]&&(a=i[e])}if(!Vt[t]||0===Object.keys(Vt[t]).length){Vt[t]=void 0;let i=Vue.ref(a);return function(t,e,n,a){if(Ht[t])return Ht[t].push([e,n,a]),void(Vt[t]&&Gt(t));Ht[t]=[[e,n,a]],axios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/components/Phrasen/loadModule/"+t).then(e=>{e.data.retval?Vt[t]=qt(e.data.retval,t):Vt[t]={},Gt(t)}).catch(t=>console.error(t))}(t,i,e,n),i}}var s=Jt(t,e,n);return Vue.ref(s)},t(t,e,n){return Vue.unref(this.t_ref(t,e,n))}};var Zt={data:()=>({p:Wt})},Kt={props:{menu:{type:Array,default:null},containerStyles:Array,rowStyles:Array,hasLvPlanEintraege:{required:!1,default:!0,type:Boolean}},data:()=>({}),methods:{c4_disabled:function(t){return!this.c4_link(t)&&!t.c4_moodle_links?.length||("addon_fhtw_menu_lvplan_lva"==t.id&&!this.hasLvPlanEintraege||null)},c4_target:function(t){return t.c4_moodle_links?.length>0?null:t.c4_target??null},c4_link:t=>t?Array.isArray(t.c4_moodle_links)&&t.c4_moodle_links.length?null:t.c4_link??null:null,getMenuName(t){return t.phrase?this.$p.t(t.phrase):t.name}},template:'\n\t
    {{$p.t(\'lehre\',\'lehrveranstaltungsUnavailable\')}}
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t

    {{ getMenuName(menuItem) }}

    \n\t\t\t\t\t\t
    {{text}}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n\t'},Yt={getLvMenu:(t,e)=>({method:"get",url:`/api/frontend/v1/LvMenu/getLvMenu/${t}/${e}`})},Qt={props:{event:{type:Object,required:!0,default:null},studiensemester:{type:String,required:!1,default:null},titel:{type:String,required:!1,default:null},preselectedMenu:{type:Object,required:!1,default:null}},data:()=>({result:!1,menu:[],isMenuSelected:!1,hasLvPlanEintraege:!0,lvEvaluierungMessage:""}),mixins:[s],components:{BsModal:s,LvMenu:Kt},inject:["studium_studiensemester"],methods:{hiddenModal:function(){this.isMenuSelected=!1},showModal:function(){if(this.preselectedMenu?this.isMenuSelected=!0:this.$api.call(Yt.getLvMenu(this.event.lehrveranstaltung_id,this.studiensemester??this.event.studiensemester_kurzbz)).then(t=>{t.data&&(this.menu=t.data)}),this.studium_studiensemester&&this.$fhcApi.factory.studium.getLvEvaluierungInfo(this.studium_studiensemester,this.event.lehreinheit_id??this.event.lehrveranstaltung_id).then(t=>t.data).then(t=>{this.lvEvaluierungMessage=t.message}),this.studiensemester&&this.event)return this.$fhcApi.factory.studium.getLvPlanForStudiensemester(this.studiensemester,this.event.lehreinheit_id??this.event.lehrveranstaltung_id).then(t=>t.data).then(t=>{Array.isArray(t)&&t.length>0?this.hasLvPlanEintraege=!0:this.hasLvPlanEintraege=!1})}},mounted(){this.modal=this.$refs.modalContainer},beforeUnmount(){this.$refs.modalContainer.hide()},template:'\n \n\n\t\t\n \n \n \n\n \n '},Xt={components:{MylvSemesterStudiengang:{components:{MylvSemesterStudiengangLv:{components:{LvUebersicht:Qt},mixins:[Zt],inject:["studien_semester"],props:{lehrveranstaltung_id:Number,bezeichnung:String,bezeichnung_eng:String,module:String,farbe:String,lvinfo:Boolean,benotung:Boolean,lvnote:String,lvnotebez:Array,znote:String,znotebez:Array,studiengang_kuerzel:String,semester:[String,Number],orgform_kurzbz:String,sprache:String,ects:String,incoming:Number,positiv:Boolean,note_index:String},data:()=>({pruefungenData:null,info:null,menu:null,preselectedMenuItem:null}),computed:{gradeColor(){if(null!=this.positiv)return this.positiv?"var(--fhc-success)":"var(--fhc-danger)"},is_organisatorische_einheit(){return"organisatorische_einheit"==this.menu},emptyMenu(){return!this.menu||!Array.isArray(this.menu)||Array.isArray(this.menu)&&0==this.menu.length},bodyStyle:()=>({}),grade(){const t="English"===this.$p.user_language.value?1:0;return this.benotung&&this.znotebez?.length?this.znotebez[t]:this.benotung&&this.lvnotebez?.length?this.lvnotebez[t]:null},LvHasPruefungenInformation(){return this.pruefungenData&&this.pruefungenData.length>0}},methods:{fetchMenu(t=this.lehrveranstaltung_id,e=this.studien_semester){return this.$api.call(Yt.getLvMenu(t,e)).then(t=>{this.menu=t.data}).catch(t=>{this.$fhcAlert.handleSystemError(t),this.menu=[]})},c4_link:t=>t?Array.isArray(t.c4_moodle_links)&&t.c4_moodle_links.length?"#":t.c4_link??null:null,openLvOption(t){"core_menu_mailanstudierende"==t.id||"core_menu_digitale_anwesenheitslisten"==t.id?window.location.href=t.c4_link:(this.preselectedMenuItem=t,Vue.nextTick(()=>{this.$refs.lvUebersicht.show()}))},openPruefungen(){this.LvHasPruefungenInformation&&Nt.popup({pruefungenData:this.pruefungenData,bezeichnung:this.bezeichnung})},openInfos(){this.info||(this.info=!0,Ut.popup({lehrveranstaltung_id:this.lehrveranstaltung_id,bezeichnung:this.bezeichnung,bezeichnung_eng:this.bezeichnung_eng,studiengang_kuerzel:this.studiengang_kuerzel,semester:this.semester,studien_semester:this.studien_semester,orgform_kurzbz:this.orgform_kurzbz,sprache:this.sprache,ects:this.ects,incoming:this.incoming}).then(()=>this.info=!1).catch(()=>this.info=!1))}},watch:{studien_semester(t){this.fetchMenu(this.lehrveranstaltung_id,t)}},created(){this.$api.call(Bt.getStudentPruefungen(this.lehrveranstaltung_id)).then(t=>t.data).then(t=>{this.pruefungenData=t})},mounted(){this.fetchMenu(this.lehrveranstaltung_id,this.studien_semester)},template:'
    \n\t\t\n\n\t\t
    \n\t\t\t\x3c!-- {{module}} if the module of the lv is important then query the module from the api endpoint for LV--\x3e\n\t\t\t
    {{ $p.t(\'lehre/organisationseinheit\') }}:
    \n\t\t\t
    {{$p.user_language.value === \'English\' ? bezeichnung_eng : bezeichnung}}
    \n\t\t
    \n\t\t
    \n\t\t\t\n\t\t\t\n\t\t
    \n\t\t\n\t
    '}},mixins:[Zt],props:{bezeichnung:String,kuerzel:String,semester:[String,Number],lvs:Array,sg_bezeichnung_eng:String},computed:{lehrveranstaltungen(){return[...new Map(this.lvs.map(t=>[t.lehrveranstaltung_id,t])).values()]}},methods:{note:t=>t.benotung&&(t.znote||t.lvnote)||null},template:'
    \n\t\t
    \n\t\t\t

    {{$p.user_language.value === \'English\' ? sg_bezeichnung_eng : bezeichnung}} - {{kuerzel}}\n\t\t\t\t{{semester}}.{{$p.t(\'lehre/semester\')}}\n\t\t\t

    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    '}},provide(){return{studien_semester:Vue.computed(()=>this.semester)}},props:{semester:[String,Number],lvs:Array},computed:{ready(){return null!==this.lvs},studiengaenge(){return[...new Map(this.lvs.map(t=>[t.studiengang_kz+"#"+t.semester,{studiengang_kz:t.studiengang_kz,bezeichnung:t.sg_bezeichnung,sg_bezeichnung_eng:t.sg_bezeichnung_eng,kuerzel:t.studiengang_kuerzel,semester:t.semester}])).values()].sort((t,e)=>t.bezeichnung.toLowerCase()==e.bezeichnung.toLowerCase()?t.semester>e.semester:t.bezeichnung.toLowerCase()>e.bezeichnung.toLowerCase())}},methods:{lvsForStudiengang(t){return this.lvs.filter(e=>e.studiengang_kz==t.studiengang_kz&&e.semester==t.semester)}},template:'
    \n\t\t\n\t
    \n\t
    \n\t\t\n\t
    '},te={components:{MylvSemester:Xt},mixins:[Zt],data:()=>({firstLoad:!0,studiensemester:null,lvs:{},currentSemester:null}),computed:{ready(){return null!==this.studiensemester&&(!this.firstLoad||null!==this.current.lvs)},current(){return null===this.currentSemester?{semester:null,lvs:[]}:(void 0===this.lvs[this.currentSemester]&&(this.lvs[this.currentSemester]={semester:this.currentSemester,lvs:null},axios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/components/Cis/Mylv/Lvs/"+this.currentSemester).then(t=>{this.lvs[this.currentSemester].lvs=t.data.retval||[],this.firstLoad=!1})),this.lvs[this.currentSemester])},nearestSem(){let t=Date.now(),e=null,n=0;return this.studiensemester.forEach(a=>{let i=new Date(a.start),s=new Date(a.ende);if(t>=i&&t<=s)return e=a.studiensemester_kurzbz,void(n=0);let r=Math.min(Math.abs(t-i),Math.abs(t-s));(null===e||r{this.studiensemester=t.data.retval||[];const e=this.$route.params.studiensemester;e&&this.studiensemester.filter(t=>t.studiensemester_kurzbz==e).length?this.currentSemester=e:this.currentSemester=this.nearestSem})},beforeRouteUpdate(t,e,n){t.params.studiensemester&&this.studiensemester.filter(e=>e.studiensemester_kurzbz==t.params.studiensemester).length&&t.params.studiensemester!=this.currentSemester&&(this.currentSemester=t.params.studiensemester),n()},template:'\n\n\t

    {{$p.t(\'lehre/myLV\')}}

    \n\t
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t\t\n\t\t\n\t
    \n\t
    \n\t\t\n\t
    '};const ee={emits:["dataFetched"],props:{refresh:{type:Boolean},apiFunction:{required:!0,type:Function},apiFunctionParameters:{}},watch:{refresh:function(t,e){this.fetchData()}},data:function(){return{loading:!1,error:!1,errorMessage:null}},created:function(){this.fetchData()},methods:{fetchData:function(){if(this.loading=!0,this.error=!1,this.errorMessage=null,"function"==typeof this.apiFunction){let t=this.apiFunction(this.apiFunctionParameters);t instanceof Promise?t.then(this.successHandler).catch(this.errorHandler).finally(this.finallyHandler):this.setError("The called apiFunction does not return a Promise")}else this.setError("Property apiFunction is not a function")},setError:function(t){this.loading=!1,this.error=!0,this.errorMessage=t},successHandler:function(t){this.$emit("dataFetched",t?t.data:void 0)},errorHandler:function(t){t.response?.data?.retval?this.setError(t.response.data.retval):t.data?.message?this.setError(t.data.message):this.setError(t.message)},finallyHandler:function(){this.loading=!1}},template:'\n\t\t\n\t\t\t
    Loading...
    \n\t\t
    \n\t\t\n\t\t\t
    {{ errorMessage }}
    \n\t\t
    \n\t\t\n\t'},ne="Filter Component New Filter";var ae={props:{filters:{type:Array,default:[]},columns:{type:Array,default:[]},fields:{type:Array,default:[]}},emits:{switchFilter:["filterId"],applyFilterConfig:["filterFields"],saveCustomFilter:["customFilterName"]},data:function(){return{currentFields:[]}},computed:{types(){return this.columns.reduce((t,e)=>{let n=e.type.toLowerCase();return n.indexOf("int")>=0?t[e.name]="Numeric":n.indexOf("varchar")>=0||n.indexOf("text")>=0||n.indexOf("bpchar")>=0?t[e.name]="Text":n.indexOf("timestamp")>=0||n.indexOf("date")>=0?t[e.name]="Date":t[e.name]="",t},{})}},watch:{fields(t){this.currentFields=t}},methods:{switchFilter(t){this.$emit("switchFilter",t.currentTarget.value)},applyFilterConfig(){const t=this.currentFields.filter(t=>t.name!=ne);t.filter(t=>""==t.condition).length?alert("Please fill all the filter options"):this.$emit("applyFilterConfig",t)},addField(t){this.currentFields.push({name:ne})},removeField(t){this.currentFields.splice(t,1)}},template:'\n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t
    \n\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\tFilter {{ index + 1 }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\n\t\t\t\t\t\t\x3c!-- Numeric --\x3e\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t\x3c!-- Text --\x3e\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t\x3c!-- Timestamp and date --\x3e\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\n\t\t\t\t\x3c!-- Filter save options --\x3e\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n\t'},ie={props:{fields:Array,selected:{type:Array,default:[]},names:{type:Object,default:{}}},emits:{hide:["fieldName"],show:["fieldName"]},data:function(){return{selectedFields:[]}},watch:{selected(t){this.selectedFields=t}},methods:{toggle(t){-1!=this.selectedFields.indexOf(t)?(this.selectedFields.splice(this.selectedFields.indexOf(t),1),this.$emit("hide",t)):(this.selectedFields.push(t),this.$emit("show",t))}},template:'\n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\t{{ names[fieldToDisplay] || fieldToDisplay }}\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t\n\t'};const se={jsonLines:"fa-file-lines",xlsx:"fa-file-excel",pdf:"fa-file-pdf",html:"fa-file-code",json:"fa-file",csv:"fa-file-csv"},re={jsonLines:"Download as JSONLINES",xlsx:"Download as XLSX",pdf:"Download as PDF",html:"Download as HTML",json:"Download as JSON",csv:"Download as CSV "};var le={props:{tabulator:Object,config:{type:[Boolean,String,Function,Array,Object],default:!1},iconClass:[String,Array,Object]},computed:{currentConfig(){if(!this.config)return!1;let t=this.config;if(t instanceof Function)return[t];if(null===t)return[];if(!0===this.config&&(t=["csv"]),"[object String]"===Object.prototype.toString.call(t)&&(t=t.split(",")),"object"==typeof t&&!Array.isArray(t)){let i=[];for(var e in t){var n,a=t[e];a&&("[object String]"===Object.prototype.toString.call(a)?null!==(n=this.stringToFileFormatter(a))?i.push({icon:"fa-solid "+se[n],label:a===e?re[n]:e,formatter:n}):null!==(n=this.stringToFileFormatter(e))?i.push({icon:"fa-solid "+se[n],label:a,formatter:n}):alert("neither "+e+" nor "+a+" are supported download file types"):"object"!=typeof a||Array.isArray(a)?null!==(n=this.stringToFileFormatter(e))?i.push({icon:"fa-solid "+se[n],label:re[n],formatter:n}):alert(e+" is not a supported download file type"):null!==(n=this.stringToFileFormatter(e))?(void 0===a.formatter&&(a.formatter=n),void 0===a.label&&(a.label=re[n]),void 0===a.icon&&(a.icon=se[n]),i.push(a)):(void 0===a.label&&(a.label=e),i.push(a)))}t=i}if(Array.isArray(t)){if(t=t.map(t=>{if("[object String]"===Object.prototype.toString.call(t)){let e=this.stringToFileFormatter(t);return null===e?null:{icon:"fa-solid "+se[e],label:re[e],formatter:e}}if(t instanceof Function)return{formatter:t};if("object"==typeof t&&!Array.isArray(t)&&null!==t){if(t.formatter instanceof Function)return t;if(this.validateFileFormatter(t.formatter))return t}return null}).filter(t=>null!==t),t.length<2)return t;if(t.filter(t=>t.label||t.icon).length==t.length)return t;alert("Config not valid")}return[]}},methods:{stringToFileFormatter(t){let e=t.toLowerCase();return"jsonlines"==e?"jsonLines":["xlsx","pdf","html","json","csv"].includes(e)?e:null},validateFileFormatter(t){let e=this.stringToFileFormatter(t);if(!e)return alert(t+" is not a supported file formatter"),!1;if("xlsx"==e&&!window.XLSX)return alert("XLSX Library not loaded"),!1;if("pdf"==e){if(!window.jspdf)return alert("jsPDF Library not loaded"),!1;if(!new jspdf.jsPDF({}).autoTable)return alert("jsPDF-AutoTable Plugin not loaded"),!1}return!0},download(t){this.tabulator.download(t.formatter,t.file,t.options)}},template:'\n\t\n\t'};const oe=new WeakMap;var de={mounted(t,e){let n=!1;oe.set(t,e=>{if(!n)return;if(t.contains(e.target))return;const a=bootstrap.Collapse.getInstance(t);a&&a.hide()}),t.addEventListener("shown.bs.collapse",()=>{n=!0}),t.addEventListener("hide.bs.collapse",()=>{n=!1}),document.addEventListener("click",oe.get(t),!0)},beforeUnmount(t,e){document.removeEventListener("click",oe.get(t)),delete t.collapsibleAutoHideFunc}};window.Tabulator?.extendModule("layout","modes",{fitDataStretchFrozen(t,e){var n=0,a=this.table.rowManager.element.clientWidth,i=0,s=!1;t.forEach((t,e)=>{t.widthFixed||t.reinitializeWidth(),(this.table.options.responsiveLayout?t.modules.responsive.visible:t.visible&&!t.definition.frozen)&&(s=t),t.visible&&(n+=t.getWidth())}),s?(i=a-n+s.getWidth(),this.table.options.responsiveLayout&&this.table.modExists("responsiveLayout",!0)&&(s.setWidth(0),this.table.modules.responsiveLayout.update()),i>0?s.setWidth(i):s.reinitializeWidth()):this.table.options.responsiveLayout&&this.table.modExists("responsiveLayout",!0)&&this.table.modules.responsiveLayout.update()}});var ce={saveCustomFilter:t=>({method:"post",url:"/api/frontend/v1/filter/saveCustomFilter",params:{filterUniqueId:t.filterUniqueId,filterType:t.filterType,customFilterName:t.customFilterName}}),removeCustomFilter:t=>({method:"post",url:"/api/frontend/v1/filter/removeCustomFilter",params:{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterId:t.filterId}}),applyFilterFields:t=>({method:"post",url:"/api/frontend/v1/filter/applyFilterFields",params:{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterFields:t.filterFields}}),addFilterField:t=>({method:"post",url:"/api/frontend/v1/filter/addFilterField",params:{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterField:t.filterField}}),removeFilterField:t=>({method:"post",url:"/api/frontend/v1/filter/removeFilterField",params:{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterField:t.filterField}}),getFilterById:t=>({method:"get",url:"/api/frontend/v1/filter/getFilter",params:{filterUniqueId:t.filterUniqueId,filterType:t.filterType,filterId:t.filterId}}),getFilter:t=>({method:"get",url:"/api/frontend/v1/filter/getFilter",params:{filterUniqueId:t.filterUniqueId,filterType:t.filterType}})},ue=0;const pe={components:{CoreFetchCmpt:ee,FilterConfig:ae,FilterColumns:ie,TableDownload:le},directives:{collapseAutoClose:de},emits:["nwNewEntry","click:new","tableBuilt","uuidDefined"],props:{onNwNewEntry:Function,title:String,description:String,sideMenu:{type:Boolean,default:!0},filterType:{type:String},tabulatorOptions:Object,tabulatorEvents:Array,tableOnly:Boolean,noColumnFilter:Boolean,reload:Boolean,reloadBtnInfotext:String,download:{type:[Boolean,String,Function,Array,Object],default:!1},newBtnShow:Boolean,newBtnClass:[String,Array,Object],newBtnDisabled:Boolean,newBtnLabel:String,uniqueId:String,idField:String,parentIdField:String,countOnly:Boolean,useSelectionSpan:{type:Boolean,default:!0}},data:function(){return{uuid:0,filterName:null,filterActive:!1,fields:null,dataset:null,datasetMetadata:null,selectedFields:null,filterFields:null,availableFilters:null,selectedFilter:null,fetchCmptRefresh:!1,fetchCmptApiFunction:null,fetchCmptApiFunctionParams:null,fetchCmptDataFetched:null,fetchResult:null,tabulator:null,tableBuilt:!1,tabulatorHasSelector:!1,selectedData:[],persistence:{sort:!0,columns:!0,filter:!1,headerFilter:!1,group:!1,page:!1}}},computed:{notSelectedFields(){return this.fields&&this.selectedFields?this.fields.filter(t=>-1===this.selectedFields.indexOf(t)):null},filteredData(){return this.dataset?JSON.parse(JSON.stringify(this.dataset)):[]},filteredColumns(){let t=JSON.parse(JSON.stringify(this.fields))||[],e=JSON.parse(JSON.stringify(this.selectedFields))||[],n=null;if(this.tabulatorOptions&&this.tabulatorOptions.hasOwnProperty("columns")&&(n=this.tabulatorOptions.columns),!Array.isArray(n)||Array.isArray(n)&&n.length=0,n.push(t)}}else for(let a of n)a.visible=e.indexOf(a.field)>=0||-1==t.indexOf(a.field),a.hasOwnProperty("resizable")&&(a.resizable=a.visible);return n},fieldIdsForVisibilty(){return this.tableBuilt?this.tabulator.getColumns().filter(t=>{let e=t.getDefinition();return!e.frozen&&e.title&&"responsiveCollapse"!=e.formatter}).map(t=>t.getField()):[]},fieldNames(){return this.tableBuilt?this.tabulator.getColumns().reduce((t,e)=>(t[e.getField()]=e.getDefinition().title,t),{}):{}},idExtra(){return this.uuid?"-"+this.uuid:""},columnsForFilter(){if(!this.filteredColumns||!this.datasetMetadata)return[];const t=this.filteredColumns.reduce((t,e)=>(t[e.field]=e.title,t),{});return this.datasetMetadata.map(e=>({...e,title:t[e.name]}))}},methods:{reloadTable(){this.tableOnly?this.tabulator.setData():this.getFilter()},async initTabulator(){let t="< Phrasen Plugin not loaded! >";this.$p&&(await this.$p.loadCategory("ui"),t=this.$p.t("ui/keineDatenVorhanden")),this.tableOnly||await new Promise(t=>{const e=window.location.hash?window.location.hash.slice(1):null,n=e=>{this.setRenderData(e),t()};null===e?this.startFetchCmpt(t=>this.$api.call(ce.getFilter(t)),null,n):this.startFetchCmpt(t=>this.$api.call(ce.getFilterById(t)),{filterId:e},n)});let e={layout:"fitDataStretchFrozen",movableColumns:!0,columnDefaults:{tooltip:!0},placeholder:t,persistence:this.persistence,...this.tabulatorOptions||{}};if(void 0===e.height&&void 0===e.minHeight&&void 0===e.maxHeight&&(e.height=500),this.tableOnly?e.columns.forEach(t=>{void 0===t.visible&&(t.visible=!0)}):(e.data=this.filteredData,e.columns=this.filteredColumns),(e.selectable||e.columns&&e.columns.filter(t=>"rowSelection"==t.formatter).length)&&(this.tabulatorHasSelector=!0),this.idField&&(this.parentIdField&&(e.dataTree=!0),e.index=this.idField),this.tabulator=new Tabulator(this.$refs.table,e),Array.isArray(this.tabulatorEvents)&&this.tabulatorEvents.length>0)for(let t of this.tabulatorEvents)this.tabulator.on(t.event,t.handler);this.tabulator.on("tableBuilt",()=>{this.tableBuilt=!0,this.$emit("tableBuilt")}),this.tabulator.on("rowSelectionChanged",t=>{this.selectedData=t}),this.parentIdField&&this.idField&&this.tabulator.on("dataLoading",t=>{let e=[];for(let n=0;n{const t=this.tabulator.getColumns();this.fields=t.map(t=>t.getField()),this.selectedFields=t.filter(t=>t.isVisible()).map(t=>t.getField()),this.tabulator.options.persistence.headerFilter&&this._setHeaderFilter()}),this.tabulator.on("dataFiltered",t=>{this.filterActive=t.length>0})},updateTabulator(){this.tabulator&&(this.tableBuilt?this._updateTabulator():this.tabulator.on("tableBuilt",this._updateTabulator))},_updateTabulator(){this.tabulatorHasSelector=this.tabulatorOptions.selectable||this.filteredColumns.filter(t=>"rowSelection"==t.formatter).length,this.tabulator.setColumns(this.filteredColumns),this.tabulator.setData(this.filteredData),this._setHeaderFilter()},clearFilters(){this.tabulator.getHeaderFilters().forEach(t=>{this.tabulator.setHeaderFilterValue(t.field,"")}),this.tabulator.clearFilter(),this.filterActive=!1},_setHeaderFilter(){this.tabulator.getHeaderFilters().forEach(t=>{this.tabulator.setHeaderFilterValue(t.field,t.value)})},getFilter(){null===this.selectedFilter?this.startFetchCmpt(t=>this.$api.call(ce.getFilter(t)),null,this.render):this.startFetchCmpt(t=>this.$api.call(ce.getFilterById(t)),{filterId:this.selectedFilter},this.render)},setRenderData(t){this.fetchResult=t,this.filterName=t.filterName,this.dataset=t.dataset,this.datasetMetadata=t.datasetMetadata,this.fields=t.fields,this.selectedFields=t.selectedFields,this.filterFields=[];for(let e=0;ethis.$api.call(ce.saveCustomFilter(t)),{customFilterName:t},this.getFilter)},handlerRemoveCustomFilter(t){let e=t.currentTarget.getAttribute("href").substring(1);e===this.selectedFilter&&(this.selectedFilter=null),this.startFetchCmpt(t=>this.$api.call(ce.removeCustomFilter(t)),{filterId:e},this.getFilter)},handlerGetFilterById:function(t){let e=null,n=t.currentTarget.getAttribute("href");e=null==n?t.currentTarget.value:n.substring(1),this.switchFilter(e)},switchFilter(t){this.selectedFilter=t,this.getFilter()},applyFilterConfig(t){this.selectedFilter=null,this.startFetchCmpt(t=>this.$api.call(ce.applyFilterFields(t)),{filterFields:t},this.getFilter)},appendChild(t,e){let n=e[this.parentIdField];for(let a=0;a{this.tableOnly||(this.selectedFilter=window.location.hash?window.location.hash.slice(1):null,this.render(this.fetchResult))})},template:'\n\t\t\x3c!-- Load filter data --\x3e\n\t\t\n\t\t\n\n\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\t\t
    \n\t\t
    \n\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t{{ selectedData.length }} ausgewählt\n\t\t\t\t\t\t Mit {{ selectedData.length }} ausgewählten:\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t[ {{ filterName }} ]\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\n\t\t\t\n\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t\n\n\t\t\x3c!-- Tabulator --\x3e\n\t\t
    \n\t'};var he={props:{data:Object,title:{type:String}},data:()=>({}),created(){},template:'\n\t'},me={props:{data:{type:String}},data:()=>({}),template:"\n
    \n
    \n {{$p.t('profil','fhAusweisStatus',[data])}}\n
    \n
    "},ge={props:{data:{type:String},title:{type:String,required:!0},mobile:{type:Boolean,default:!1}},methods:{hideCollapse:function(){this.collapseOpen=!1},showCollapse:function(){this.collapseOpen=!0}},data:()=>({collapseOpen:!1}),template:'\n
    \n \n \n
    '},fe={props:{data:Object,view:String,withZustelladresse:{type:Boolean,default:!0}},data:()=>({}),created(){},template:'\n \n
    \n \n \x3c!-- column 1 in the address row --\x3e\n
    \n \n
    \n \n
    \n
    \n
    {{$p.t(\'person\',\'strasse\')}}
    \n {{data.strasse}} \n
    \n
    \n \n \x3c!-- column 2 in the address row --\x3e\n
    \n
    \n
    {{$p.t(\'global\',\'typ\')}}
    \n {{data.typ}} \n
    \n
    \n \n
    \n
    \n
    {{$p.t(\'person\',\'ort\')}}
    \n {{data.ort}} \n
    \n
    \n
    \n
    \n
    {{$p.t(\'person\',\'plz\')}}
    \n {{data.plz}} \n
    \n
    \n\n
    \n
    \n
    {{$p.t(\'person\',\'zustelladresse\')}}
    \n
    \n \n
    \n
    \n
    \n
    \n'},be={props:{view:String,data:Object},data:()=>({}),created(){},template:'\n\t\n'},ve={data:()=>({}),props:{title:{type:String,required:!0},data:{type:Array}},template:'\n
    \n
    \n {{title}}\n
    \n
    \n \x3c!-- HIER SIND DIE EMAILS --\x3e\n
    \n
    \n\t\t\t\t\n
    \n
    \n
    \n
    '},ye={data:()=>({}),props:{data:{type:Object},title:{type:String}},inject:{studiengang_kz:{from:"studiengang_kz",default:!1}},computed:{getLinkGruppeListe(){return!1===this.studiengang_kz?"":this.data.gruppe?.value&&this.data.verband?.value&&this.data.semester?.value?FHC_JS_DATA_STORAGE_OBJECT.app_root+"cis/private/stud_in_grp.php?kz="+this.studiengang_kz+"&sem="+this.data.semester.value+"&verband="+this.data.verband.value+"&grp="+this.data.gruppe.value:""},getLinkVerbandListe(){return!1===this.studiengang_kz?"":this.data.verband?.value&&this.data.semester?.value?FHC_JS_DATA_STORAGE_OBJECT.app_root+"cis/private/stud_in_grp.php?kz="+this.studiengang_kz+"&sem="+this.data.semester.value+"&verband="+this.data.verband.value:""},getLinkSemesterListe(){return!1===this.studiengang_kz?"":this.data.semester?.value?FHC_JS_DATA_STORAGE_OBJECT.app_root+"cis/private/stud_in_grp.php?kz="+this.studiengang_kz+"&sem="+this.data.semester.value:""}},created(){},template:'\n
    \n
    {{title}}
    \n
    \n
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{entry.label }}
    \n\t\t\t\n\t\t\t\t\t\t\x3c!-- print Telefon link --\x3e\n\t\t\t\t\t\t{{entry.value ?? \'-\'}}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\x3c!-- print semester link --\x3e\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ entry.value }}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\x3c!-- print verband link --\x3e\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ entry.value }}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\x3c!-- print gruppe link --\x3e\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ entry.value }}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\x3c!-- else print information --\x3e\n\t\t\t\t\t\t{{ entry.value ?? \'-\'}}\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    '},we={profilViewData(t){let e="/api/frontend/v1/Profil/profilViewData";return t&&(e+=`/${t}`),{method:"get",url:e}},fotoSperre:t=>({method:"get",url:`/api/frontend/v1/Profil/fotoSperre/${t}`}),isStudent:t=>({method:"get",url:"/api/frontend/v1/Profil/isStudent",params:{uid:t}}),isMitarbeiter:t=>({method:"get",url:`/api/frontend/v1/Profil/isMitarbeiter/${t}`}),getZustellAdresse:()=>({method:"get",url:"/api/frontend/v1/Profil/getZustellAdresse"}),getZustellKontakt:()=>({method:"get",url:"/api/frontend/v1/Profil/getZustellKontakt"}),getGemeinden:(t,e)=>({method:"get",url:`/api/frontend/v1/Profil/getGemeinden/${t}/${e}`}),getAllNationen:()=>({method:"get",url:"/api/frontend/v1/Profil/getAllNationen"})},ke={components:{DmsItem:{emits:["delete"],props:{modelValue:{type:[File,Object],required:!0}},data:()=>({preview:""}),watch:{modelValue(t){"application/x.fhc-dms+json"==t.type&&t.text().then(t=>{const e=JSON.parse(t);this.preview=e.preview||""})}},template:'\n\t
  • \n\t\t\n\t\t{{ modelValue.name }}\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t
  • '}},emits:["update:modelValue"],props:{modelValue:{type:[FileList,Array],required:!0},multiple:Boolean,id:String,name:String,inputClass:[String,Array,Object],noList:Boolean,accept:{type:String,default:""},disabled:{type:Boolean,default:!1}},methods:{stringifyFile:t=>JSON.stringify({lastModified:t.lastModified,lastModifiedDate:t.lastModifiedDate,name:t.name,size:t.size,type:t.type}),addFiles(t){if(!this.multiple)return this.$emit("update:modelValue",t.target.files);const e=new DataTransfer,n=[];for(var a of this.modelValue)e.items.add(a),n.push(this.stringifyFile(a));for(var a of t.target.files)n.indexOf(this.stringifyFile(a))<0&&e.items.add(a);this.$emit("update:modelValue",e.files)},removeFile(t){const e=Array.from(this.modelValue)[t],n=new DataTransfer;for(var a of this.modelValue)a!==e&&n.items.add(a);this.$emit("update:modelValue",n.files)}},watch:{modelValue(t){if(!t)return;if(t instanceof FileList){if(!this.$refs.upload)return;return this.$refs.upload.files=t}const e=new DataTransfer;for(var n of t)if(n instanceof File)e.items.add(n);else{const t=new File([JSON.stringify(n)],n.name,{type:"application/x.fhc-dms+json"});e.items.add(t)}this.$emit("update:modelValue",e.files)}},template:'\n\t
    \n\t\t\n\t\t
      \n\t\t\t\n\t\t\t\n\t\t
    \n\t
    '},_e={ //! API calls for profil update requests -getStatus:()=>({method:"get",url:"/api/frontend/v1/ProfilUpdate/getStatus"}),getTopic:()=>({method:"get",url:"/api/frontend/v1/ProfilUpdate/getTopic"}),acceptProfilRequest:({profil_update_id:t,uid:e,status_message:n,topic:a,requested_change:i})=>({method:"post",url:"/api/frontend/v1/ProfilUpdate/acceptProfilRequest",params:{profil_update_id:t,uid:e,status_message:n,topic:a,requested_change:i}}),denyProfilRequest:({profil_update_id:t,uid:e,topic:n,status_message:a})=>({method:"post",url:"/api/frontend/v1/ProfilUpdate/denyProfilRequest",params:{profil_update_id:t,uid:e,topic:n,status_message:a}}),insertFile:(t,e=null)=>({method:"post",url:`/api/frontend/v1/ProfilUpdate/insertFile/${e}`,params:t}),updateProfilbild:t=>({method:"post",url:"/api/frontend/v1/ProfilUpdate/updateProfilbild",params:t}),getProfilUpdateWithPermission:t=>({method:"get",url:"/api/frontend/v1/ProfilUpdate/getProfilUpdateWithPermission"+(""!==t?"/"+encodeURIComponent(t):"")}),getProfilRequestFiles:t=>({method:"get",url:`/api/frontend/v1/ProfilUpdate/getProfilRequestFiles/${t}`}),selectProfilRequest:(t=null,e=null)=>({method:"get",url:"/api/frontend/v1/ProfilUpdate/selectProfilRequest",params:{...t?{uid:t}:{},...e?{id:e}:{}}}),insertProfilRequest:(t,e,n=null)=>({method:"post",url:"/api/frontend/v1/ProfilUpdate/insertProfilRequest",params:{topic:t,payload:e,...n?{fileID:n}:{}}}),updateProfilRequest:(t,e,n,a=null)=>({method:"post",url:"/api/frontend/v1/ProfilUpdate/updateProfilRequest",params:{topic:t,payload:e,ID:n,...a?{fileID:a}:{}}}),deleteProfilRequest:t=>({method:"post",url:"/api/frontend/v1/ProfilUpdate/deleteProfilRequest",params:{requestID:t}})},Ae={data:()=>({dmsData:[]}),components:{Dms:ke,BsModal:s},mixins:[s],props:{titel:{type:String},files:{type:Array},updateID:{type:Boolean},onHideBsModal:Function,onHiddenBsModal:Function,onHidePreventedBsModal:Function,onShowBsModal:Function,onShownBsModal:Function},methods:{async uploadImage(){if(this.dmsData){let t=new FormData;t.append("files[]",this.dmsData[0]),await this.$api.call(_e.updateProfilbild(t)).then(t=>{this.$fhcAlert.alertSuccess(this.$p.t("global","hochgeladen")),this.modal.hide()})}}},mounted(){this.modal=this.$refs.modalContainer.modal,this.files&&(this.dmsData=this.files)},popup(t){return s.popup.bind(this),s.popup(null,t)},template:'\n\n\t\n\t\t\n\t\t\n\t\n '},xe={props:{title:{type:String},data:{type:Object},fotoStatus:{type:Boolean,default:!0}},components:{ImageUpload:Ae},data(){return{FotoSperre:this.data.foto_sperre}},emits:["showEditProfilModal"],inject:["isEditable"],methods:{showModal(){this.$refs.imageUpload.show()},sperre_foto_function(){this.data&&this.$api.call(we.fotoSperre(!this.FotoSperre)).then(t=>{this.FotoSperre=t.data.foto_sperre})}},computed:{get_image_base64_src:function(){return this.data.foto?"data:image/jpeg;base64,"+this.data.foto:""},name:function(){return{vorname:this.data.Vorname,nachname:this.data.Nachname}},profilInfo:function(){let t={},e=["Vorname","Nachname","foto_sperre","foto"];return Object.keys(this.data).forEach(n=>{e.includes(n)||(t[n]=this.data[n])}),t}},template:'\n\n
    \n\t\n
    \n
    \n
    \n \n
    \n
    \n {{title}}\n
    \n
    \n
    \n
    \n
    \n \x3c!-- SQUEEZING THE IMAGE INSIDE THE FIRST INFORMATION COLUMN --\x3e\n \x3c!-- START OF THE FIRST ROW WITH THE PROFIL IMAGE --\x3e\n
    \n
    \n
    \n profile picture\n \x3c!-- LOCKING IMAGE FUNCTIONALITY --\x3e\n
    \n \n
    \n\t\t\t\t\t\t
    \n \n
    \n
    \n
    \n \x3c!-- END OF THE ROW WITH THE IMAGE --\x3e\n
    \n \x3c!-- END OF SQUEEZE --\x3e\n \x3c!-- COLUMNS WITH MULTIPLE ROWS NEXT TO PROFIL PICTURE --\x3e\n
    \n
    \n
    \n
    \n
    {{$p.t(\'profilUpdate\',\'vorname\')}}
    \n {{name.vorname}} \n
    \n
    \n
    \n
    \n
    {{$p.t(\'profilUpdate\',\'nachname\')}}
    \n {{name.nachname}} \n
    \n
    \n
    \n
    \n
    \n
    \n
    {{$p.t(\'profil\',bez)}}
    \n {{wert?wert:\'-\'}} \n
    \n
    \n
    \n
    \n
    \n'},$e={name:"EditProfilSelect",components:{Kontakt:ve,EditKontakt:{props:{data:Object},data:()=>({originalValue:null,zustellKontakteCount:null}),inject:["getZustellkontakteCount"],methods:{updateValue:function(t,e){this.data[e]="zustellung"===e?t.target.checked:""===t.target.value?null:t.target.value,this.$emit("profilUpdate",this.isChanged?this.data:null),this.zustellKontakteCount=this.getZustellkontakteCount()}},computed:{showZustellKontakteWarning:function(){if(JSON.parse(this.originalValue).zustellung)return!1;const t=this.zustellKontakteCount.filter(t=>t.kontakttyp===this.data?.kontakttyp);return this.zustellKontakteCount.some(t=>t.kontakt_id===this.data.kontakt_id)?this.kontakteOfSelectedType.length>=2&&this.data.zustellung:this.data.zustellung&&t.length},isChanged:function(){return!(!this.data.kontakt||!this.data.kontakttyp)&&JSON.stringify(this.data)!==this.originalValue}},created(){this.originalValue=JSON.stringify(this.data),this.zustellKontakteCount=this.getZustellkontakteCount()},template:'\n\n
    \n\n
    \n\n\n
    \n
    {{$p.t(\'profilUpdate\',\'kontaktTyp\')}}
    \n\n \n
    \n\n
    \n
    \n\n \x3c!-- rendering KONTAKT emails --\x3e\n\n\n
    \n
    {{data.kontakttyp?data.kontakttyp:$p.t(\'global\',\'kontakt\')}}
    \n\n \n
    \n\n
    \n
    \n\n
    \n
    {{$p.t(\'global\',\'anmerkung\')}}
    \n\n \n
    \n\n
    \n\n \x3c!-- warning message for too many zustellungs Kontakte --\x3e\n
    \n
    \n {{$p.t(\'profilUpdate\',\'zustell_kontakte_warning\')}}\n
    \n
    \n \x3c!-- End of warning --\x3e\n\n
    \n {{$p.t(\'profilUpdate\',\'zustellungsKontakt\')}}\n\n \n
    \n
    \n '},Adresse:fe,EditAdresse:{components:{AutoComplete:primevue.autocomplete,Dms:ke},props:{data:Object,files:{type:Array,default:[]}},inject:["getZustelladressenCount","updateFileID","isMitarbeiter"],data:()=>({gemeinden:[],ortschaftnamen:[],selectedNation:null,nationenList:[],originalValue:null,zustellAdressenCount:null,dmsData:[],fileschanged:!1}),watch:{"data.gemeinde":function(t,e){this.$emit("profilUpdate",this.isChanged?this.data:null)},"data.ort":function(t,e){this.$emit("profilUpdate",this.isChanged?this.data:null)}},methods:{autocompleteSearchGemeinden:function(t){this.gemeinden=this.gemeinden.map(t=>t)},autocompleteSearchOrtschaftsnamen:function(t){this.ortschaftnamen=this.ortschaftnamen.map(t=>t)},getGemeinde:function(){this.data.nation&&"A"===this.data.nation&&this.data.plz&&this.data.plz>999&&this.data.plz<32e3?this.$api.call(we.getGemeinden(this.data.nation,this.data.plz)).then(t=>{t.data.length&&(this.gemeinden=[...new Set(t.data.map(t=>t.name))],this.ortschaftnamen=[...new Set(t.data.map(t=>t.ortschaftsname))])}):this.gemeinden=[]},updateValue:function(t,e){"zustelladresse"===e?this.data[e]=t.target.checked:"files"===e?(this.dmsData.length>0&&"application/x.fhc-dms+json"!==this.dmsData[0].type&&(this.fileschanged=!0),this.updateFileID(this.dmsData)):this.data[e]=""===t.target.value?null:t.target.value,this.$emit("profilUpdate",this.isChanged?this.data:null),this.zustellAdressenCount=this.getZustelladressenCount()},deleteDmsData:function(){this.dmsData=[],this.updateValue(null,"files")}},computed:{showZustellAdressenWarning:function(){return!JSON.parse(this.originalValue).zustelladresse&&(this.zustellAdressenCount.includes(this.data.adresse_id)?this.zustellAdressenCount.length>=2&&this.data.zustelladresse:this.data.zustelladresse&&this.zustellAdressenCount.length)},isChanged:function(){if(!(this.data.strasse&&this.data.plz&&this.data.ort&&this.data.typ&&0!==this.dmsData.length))return!1;return this.originalValue!==JSON.stringify(this.data)||this.fileschanged}},created(){this.$api.call(we.getAllNationen()).then(t=>{this.nationenList=t.data,this.getGemeinde()}),this.originalValue=JSON.stringify(this.data),this.zustellAdressenCount=this.getZustelladressenCount()},mounted(){this.files&&(this.dmsData=this.files)},template:'\n
    \n \x3c!-- warning message for too many zustellungs Adressen --\x3e\n
    \n
    \n\t {{$p.t(\'profilUpdate\',\'zustell_adressen_warning\')}}\n
    \n
    \n \x3c!-- End of warning --\x3e\n\n\n
    \n
    \n \n \n
    \n
    \n\n \x3c!-- NATION --\x3e\n
    \n
    \n
    {{$p.t(\'person\',\'nation\')}}*
    \n \n
    \n
    \n\n \x3c!-- PLZ --\x3e\n
    \n
    \n
    {{$p.t(\'person\',\'plz\')}}*
    \n \n
    \n
    \n\n \x3c!-- GEMEINDE --\x3e\n
    \n
    \n
    {{$p.t(\'person\',\'gemeinde\')}}*
    \n \n
    \n
    \n\n \x3c!-- ORT --\x3e\n
    \n
    \n
    {{$p.t(\'person\',\'ort\')}}*
    \n \n
    \n
    \n\n \x3c!-- STRASSE --\x3e\n
    \n
    \n
    {{$p.t(\'person\',\'strasse\')}}*
    \n \n
    \n
    \n \n \x3c!-- ADRESSEN TYP --\x3e\n
    \n
    \n
    {{$p.t(\'profilUpdate\',\'kontaktTyp\')}}*
    \n \n
    \n
    \n\n\t
    \n\t\t
    \n\t\t\t
    {{$p.t(\'profilUpdate\',\'meldebestaetigung\')}}*
    \n\t\t\t\n\t\t
    \n\t\t
    \n\t\t\t
     
    \n\t\t\t\n\t\t
    \n\t
    \n\n
    \n '},Status:{components:{Adresse:fe,Kontakt:ve},inject:["profilUpdateTopic"],data:()=>({files:null}),methods:{getDocumentLink:function(t){return FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+`/Cis/ProfilUpdate/show/${t}`}},computed:{getComponentView:function(){return this.topic==this.profilUpdateTopic["Private Adressen"]||this.topic==this.profilUpdateTopic["Add Adresse"]||this.topic==this.profilUpdateTopic["Delete Adresse"]?"Adresse":this.topic==this.profilUpdateTopic["Private Kontakte"]||this.topic==this.profilUpdateTopic["Add Kontakt"]||this.topic==this.profilUpdateTopic["Delete Kontakt"]?"Kontakt":"text_input"},cardHeader:function(){return this.topic==this.profilUpdateTopic["Delete Addresse"]||this.topic==this.profilUpdateTopic["Delete Kontakt"]?"Delete":this.topic==this.profilUpdateTopic["Add Adresse"]||this.topic==this.profilUpdateTopic["Add Kontakt"]?"Add":"Update"}},props:{data:{type:Object},view:{type:String},status:{type:String},status_message:{type:String},status_timestamp:{type:String},updateID:{type:Number},topic:{type:String}},created(){this.$api.call(_e.getProfilRequestFiles(this.updateID)).then(t=>{this.files=t.data})},template:'\n
    \n\n
    \n
    \n
    {{$p.t(\'global\',\'status\')}}
    \n {{status}} \n
    \n
    \n\n
    \n
    \n
    {{$p.t(\'global\',\'datum\')}}
    \n {{status_timestamp}} \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    {{$p.t(\'profilUpdate\',\'statusMessage\')}}
    \n \n
    \n
    \n
    \n\n\n
    \n
    \n \n {{cardHeader}} \n
    \n
    \n \n \n \n
    \n
    \n\n\t
    \n\t\t
    {{$p.t(\'profilUpdate\',\'nachweisdokumente\')}}
    \n\t\t
    \n\t\t\t{{file.name}}\n\t\t
    \n\t
    \n '},TextInputDokument:{data:()=>({dmsData:[],originalValue:null}),components:{Dms:ke},props:{data:{type:Object},withFiles:{type:Boolean,default:!1},files:{type:Array},updateID:{type:Boolean}},inject:["updateFileID"],computed:{didFilesChange:function(){this.updateFileID(this.dmsData);let t=!1;return this.files?(Array.from(this.dmsData).forEach(e=>{this.files.some(t=>t.name!==e.name)&&(t=!0)}),!(this.dmsData.length==this.files.length)||t):!!Array.from(this.dmsData).length},didDataChange:function(){return JSON.stringify(this.data)!==this.originalValue},isChanged:function(){return this.withFiles?this.updateID?(this.didDataChange||this.didFilesChange)&&this.dmsData.length:this.didDataChange&&this.didFilesChange:this.didDataChange}},emits:["profilUpdate"],watch:{dmsData(t){this.emitChanges()}},methods:{stringifyFile:t=>JSON.stringify({lastModified:t.lastModified,lastModifiedDate:t.lastModifiedDate,name:t.name,size:t.size,type:t.type}),emitChanges:function(){this.isChanged?this.$emit("profilUpdate",{value:this.data.value}):this.$emit("profilUpdate",null)}},mounted(){this.originalValue=JSON.stringify(Vue.toRaw(this.data)),this.files&&(this.dmsData=this.files)},template:'\n\n

    {{$p.t(\'profilUpdate\',\'profilUpdateInformationMessage\',[data.titel])}}

    \n\n
    \n
    {{data.titel?data.titel:$p.t(\'global\',\'titel\')}}
    \n\n \n\n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n '}},inject:["profilUpdateTopic","isMitarbeiter"],props:{list:Object,size:{type:Number,default:null},ariaLabel:{type:String,required:!0},profilUpdate:String,topic:String,breadcrumb:String},emits:{"update:profilUpdate":null,"update:topic":null,"update:breadcrumb":null,submit:null,select:null},data(){return{view:null,data:null,breadcrumbItems:[],modal_topic:this.topic,properties:null}},methods:{addItem:function(){this.view=this.modal_topic==this.profilUpdateTopic["Private Kontakte"]?"EditKontakt":"EditAdresse",this.modal_topic=this.modal_topic==this.profilUpdateTopic["Private Kontakte"]?this.profilUpdateTopic["Add Kontakt"]:this.profilUpdateTopic["Add Adresse"],this.$emit("update:topic",this.modal_topic),this.breadcrumbItems.push(this.modal_topic),this.$emit("update:breadcrumb",this.breadcrumbItems),this.data="EditAdresse"==this.view?{add:!0,adresse_id:null,strasse:null,typ:null,plz:null,ort:null,zustelladresse:!1}:{add:!0,kontakt_id:null,kontakttyp:null,kontakt:null,anmerkung:null,zustellung:!1}},deleteItem:function(t){t.data.delete=!0,this.$emit("update:profilUpdate",t.data),this.modal_topic=this.modal_topic==this.profilUpdateTopic["Private Adressen"]?this.profilUpdateTopic["Delete Adresse"]:this.profilUpdateTopic["Delete Kontakt"],this.$emit("update:topic",this.modal_topic),this.$emit("submit")},profilUpdateEmit:function(t){this.$emit("update:profilUpdate",t)},updateOptions:function(t,e){this.properties=e,this.data=e.data,this.view=e.view,e.title?(this.modal_topic=e.topic,this.$emit("update:topic",this.modal_topic),this.breadcrumbItems.push(e.title)):e.data.kontakttyp?(this.breadcrumbItems.push(e.data.kontakttyp),this.breadcrumbItems.push(e.data.kontakt)):e.data.strasse&&this.breadcrumbItems.push(e.data.strasse),this.$emit("update:breadcrumb",this.breadcrumbItems)}},computed:{},created(){this.properties={...this.list},this.data=this.list.data?JSON.parse(JSON.stringify(this.list.data)):null,this.view=this.list.view?JSON.parse(JSON.stringify(this.list.view)):null},mounted(){},template:'\n \n \n '},Se={components:{BsModal:s},props:{timeout:{type:Number,default:300}},data:()=>({t:null,state:0}),methods:{show(){switch(this.state){case 0:return this.timeout?(this.state=1,void(this.t=window.setTimeout(()=>this.$refs.modal.show(),this.timeout))):this.$refs.modal.show();case 4:return window.setTimeout(()=>this.show(),1)}},hide(){switch(this.state){case 1:return window.clearTimeout(this.t);case 2:return window.setTimeout(()=>this.hide(),1);case 3:this.$refs.modal.hide()}}},mounted(){this.$refs.modal.$refs.modal.addEventListener("show.bs.modal",()=>{this.state=2}),this.$refs.modal.$refs.modal.addEventListener("shown.bs.modal",()=>{this.state=3}),this.$refs.modal.$refs.modal.addEventListener("hide.bs.modal",()=>{this.state=4}),this.$refs.modal.$refs.modal.addEventListener("hidden.bs.modal",()=>{this.state=0})},template:'\n\t\n\t\tLoading...\n\t'},Te={components:{BsModal:s,Alert:r,EditProfilSelect:$e,Loader:Se},mixins:[s],props:{isMitarbeiter:{type:Boolean,default:!1},value:Object,titel:String,zustelladressenCount:Function,zustellkontakteCount:Function,onHideBsModal:Function,onHiddenBsModal:Function,onHidePreventedBsModal:Function,onShowBsModal:Function,onShownBsModal:Function},data(){return{topic:null,profilUpdate:null,editData:this.value,fileID:null,breadcrumb:null,loading:!1,result:!1,info:null}},inject:["setLoading"],provide(){return{updateFileID:this.updateFileIDFunction,isMitarbeiter:this.isMitarbeiter}},methods:{updateFileIDFunction:function(t){this.fileID=t},handleFailedError:function(t){console.error(t),this.loading=!1,this.setLoading(!1),this.result=!1,this.hide()},async submitProfilChange(){if(this.topic&&this.profilUpdate){if(this.fileID){const t=await this.uploadFiles(this.fileID);this.fileID=t||null}const t=t=>{t.data.error?(this.result=!1,r.popup("Ein Fehler ist aufgetreten: "+JSON.stringify(t.data.retval))):(this.result=!0,r.popup("Ihre Anfrage wurde erfolgreich gesendet. Bitte warten Sie, während sich das Team um Ihre Anfrage kümmert."))};this.loading=!0,this.setLoading(!0),this.editData.updateID?this.$api.call(_e.updateProfilRequest(this.topic,this.profilUpdate,this.editData.updateID,this.fileID?this.fileID[0]:null)).then(e=>{t(e)}).catch(t=>this.$fhcAlert.handleSystemError).finally(()=>{this.loading=!1,this.setLoading(!1),this.hide()}):this.$api.call(_e.insertProfilRequest(this.topic,this.profilUpdate,this.fileID?this.fileID[0]:null)).then(e=>{t(e)}).catch(t=>this.$fhcAlert.handleSystemError).finally(()=>{this.loading=!1,this.setLoading(!1),this.hide()})}},uploadFiles:async function(t){if("application/x.fhc-dms+json"!==t[0].type){let e=new FormData;e.append("files[]",t[0]);return this.editData.updateID?await this.$api.call(_e.insertFile(e,this.editData.updateID)).then(t=>t.data?.map(t=>t.dms_id)):await this.$api.call(_e.insertFile(e)).then(t=>t.data?.map(t=>t.dms_id))}return!1}},computed:{showFooter:function(){switch(this.value.view){case"Status":case"Kontakt":case"Adresse":return!1;default:return!0}}},created(){this.editData.topic&&(this.topic=this.editData.topic)},mounted(){this.modal=this.$refs.modalContainer.modal},popup(t){return s.popup.bind(this),s.popup(null,t)},template:'\n\n\t\n\t\n\t\x3c!-- optional footer --\x3e\n\t\n \x3c!-- end of optional footer --\x3e \n'},ze={components:{EditProfil:Te},props:{data:{type:Object}},inject:["getZustellkontakteCount","getZustelladressenCount","profilUpdateStates","profilUpdateTopic"],emits:["fetchUpdates"],data(){return{showUpdateModal:!1,content:null,editProfilTitle:this.$p.t("profil","profilBearbeiten")}},methods:{hideEditProfilModal:function(){this.$refs.updateEditModal.result&&this.$emit("fetchUpdates"),this.showUpdateModal=!1},async showEditProfilModal(t){let e=this.getView(t.topic,t.status),n=null,a=null,i=null,s=!1;if("TextInputDokument"===e){n={titel:t.topic,value:t.requested_change.value};i=await this.$api.call(_e.getProfilRequestFiles(t.profil_update_id)).then(t=>t.data),i&&(s=!0)}else n=t.requested_change;if(a={updateID:t.profil_update_id,view:e,data:n,withFiles:s,topic:t.topic,files:i},"EditAdresse"===e){const e=await this.$api.call(we.isMitarbeiter(t.uid)).then(t=>t.data);e&&(a.isMitarbeiter=e);i=await this.$api.call(_e.getProfilRequestFiles(t.profil_update_id)).then(t=>t.data),a.files=i}t.status!==this.profilUpdateStates.Pending&&(a.status=t.status,a.status_message=t.status_message,a.status_timestamp=t.status_timestamp),this.content=a,this.editProfilTitle=t.topic,a&&(this.showUpdateModal=!0,Vue.nextTick(()=>{this.$refs.updateEditModal.show()}))},deleteRequest:function(t){this.$api.call(_e.deleteProfilRequest(t.profil_update_id)).then(t=>{t.data.error?console.error("error happened",t.data):this.$emit("fetchUpdates")})},getView:function(t,e){if(e!==this.profilUpdateStates.Pending)return"Status";switch(t){case this.profilUpdateTopic["Private Kontakte"]:case this.profilUpdateTopic["Add Kontakt"]:return"EditKontakt";case this.profilUpdateTopic["Delete Kontakt"]:return"Kontakt";case this.profilUpdateTopic["Private Adressen"]:case this.profilUpdateTopic["Add Adresse"]:return"EditAdresse";case this.profilUpdateTopic["Delete Adresse"]:return"Adresse";default:return"TextInputDokument"}}},created(){},computed:{},template:'\n
    \n \n
    {{$p.t(\'profilUpdate\',\'profilUpdates\')}}
    \n
    \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    {{$p.t(\'profilUpdate\',\'topic\')}}{{$p.t(\'global\',\'status\')}}{{$p.t(\'global\',\'datum\')}}{{$p.t(\'ui\',\'aktion\')}}
    {{item.topic}}{{item.status}}{{item.status_timestamp?item.status_timestamp:item.insertamum}}
    \n
    \n
    \n
    \n'};function De(t,e,n){let a=document.createElement("div"),i=null,s=t.getValue();if(Array.isArray(s)){const t=s[0]?new Date(s[0]):null,e=s[1]?new Date(s[1]):null;i=[t,e]}return Vue.createApp({components:{PrimevueCalendar:primevue.calendar},data:()=>({val:i}),watch:{val(t){n(t)}},template:'\n\t\t\t\t '}).use(primevue.config.default).mount(a),a}primevue||console.error("PrimeVue not loaded!"),Tabulator.extendModule("filter","filters",{dates:(t,e)=>{if(!t)return!0;let n=new Date(e);if(Array.isArray(t)){let e=new Date(t[0]);if(t[1]){let a=new Date(t[1]);return a.setHours(23,59,59,999),n>=e&&n<=a}return n.toDateString()===e.toDateString()}let a=new Date(t);return n.toDateString()===a.toDateString()}});var Ee={components:{CoreFilterCmpt:pe,Mailverteiler:he,AusweisStatus:me,QuickLinks:ge,Adresse:fe,Kontakt:ve,ProfilEmails:be,RoleInformation:ye,ProfilInformation:xe,FetchProfilUpdates:ze,EditProfil:Te},inject:["sortProfilUpdates","collapseFunction","language","isEditable"],data(){return{showModal:!1,collapseIconBetriebsmittel:!0,editDataFilter:null,preloadedPhrasen:{},zutrittsgruppen_table_options:{persistenceID:"filterTableStudentProfilZutrittsgruppen",persistence:{columns:!1},minHeight:200,layout:"fitColumns",columns:[{title:Vue.computed(()=>this.preloadedPhrasen.zutrittsGruppenPhrase),field:"bezeichnung"}]},betriebsmittel_table_options:{persistenceID:"filterTableStudentProfilBetriebsmittel",persistence:{columns:!1},minHeight:300,layout:"fitColumns",responsiveLayout:"collapse",responsiveLayoutCollapseUseFormatters:!1,responsiveLayoutCollapseFormatter:Vue.$collapseFormatter,columns:[{title:"",field:"collapse",headerSort:!1,headerFilter:!1,formatter:"responsiveCollapse",maxWidth:40,headerClick:this.collapseFunction},{title:Vue.computed(()=>this.preloadedPhrasen.entlehnteBetriebsmittelPhrase),field:"betriebsmittel",headerFilter:!0,minWidth:200,visible:!0},{title:Vue.computed(()=>this.preloadedPhrasen.inventarnummerPhrase),field:"Nummer",headerFilter:!0,resizable:!0,minWidth:200,visible:!0},{title:Vue.computed(()=>this.preloadedPhrasen.ausgabedatum),field:"Ausgegeben_am",headerFilterFunc:"dates",headerFilter:De,minWidth:200,visible:!0,formatter:"datetime",formatterParams:this.datetimeFormatterParams()}]}}},props:{data:Object,editData:Object},provide(){return{studiengang_kz:Vue.computed({get:()=>this.data.studiengang_kz})}},methods:{betriebsmittelTableBuilt:function(){this.$refs.betriebsmittelTable.tabulator.setColumns(this.betriebsmittel_table_options.columns),this.$refs.betriebsmittelTable.tabulator.setData(this.data.mittel)},zutrittsgruppenTableBuilt:function(){this.$refs.zutrittsgruppenTable.tabulator.setColumns(this.zutrittsgruppen_table_options.columns),this.$refs.zutrittsgruppenTable.tabulator.setData(this.data.zuttritsgruppen)},fetchProfilUpdates:function(){this.$api.call(_e.selectProfilRequest()).then(t=>{!t.error&&t&&(this.data.profilUpdates=t.data?.length?t.data.sort(this.sortProfilUpdates):null)})},hideEditProfilModal:function(){this.$refs.editModal.result&&this.$api.call(_e.selectProfilRequest()).then(t=>{!t.error&&t.data?(this.data.profilUpdates=t.data,this.data.profilUpdates.sort(this.sortProfilUpdates)):console.error("Error when fetching profile updates: "+t)}).catch(t=>{console.error(t)}),this.showModal=!1,this.editDataFilter=null},showEditProfilModal(t){t&&(this.editDataFilter=t),this.showModal=!0,Vue.nextTick(()=>{this.$refs.editModal.show()})},datetimeFormatterParams:function(){return{inputFormat:"yyyy-MM-dd",outputFormat:"dd.MM.yyyy",invalidPlaceholder:"(invalid date)",timezone:FHC_JS_DATA_STORAGE_OBJECT.timezone}}},computed:{fotoStatus(){return this.data?.fotoStatus??null},filteredEditData(){return this.editDataFilter?this.editData.data[this.editDataFilter]:this.editData},profilInformation(){return this.data?{Vorname:this.data.vorname,Nachname:this.data.nachname,Username:this.data.username,Anrede:this.data.anrede,Titel:this.data.titel,Postnomen:this.data.postnomen,foto_sperre:this.data.foto_sperre,foto:this.data.foto}:{}},roleInformation(){return this.data?{geburtsdatum:{label:`${this.$p.t("profil","Geburtsdatum")}`,value:this.data.gebdatum},geburtsort:{label:`${this.$p.t("profil","Geburtsort")}`,value:this.data.gebort},personenkennzeichen:{label:`${this.$p.t("person","personenkennzeichen")}`,value:this.data.personenkennzeichen},studiengang:{label:`${this.$p.t("lehre","studiengang")}`,value:this.data.studiengang},semester:{label:`${this.$p.t("lehre","semester")}`,value:this.data.semester},verband:{label:`${this.$p.t("lehre","lehrverband")}`,value:this.data.verband},gruppe:{label:`${this.$p.t("lehre","gruppe")}`,value:this.data.gruppe.trim()}}:{}}},created(){this.$p.loadCategory("profil").then(()=>{this.preloadedPhrasen.zutrittsGruppenPhrase=this.$p.t("profil/zutrittsGruppen"),this.preloadedPhrasen.entlehnteBetriebsmittelPhrase=this.$p.t("profil/entlehnteBetriebsmittel"),this.preloadedPhrasen.inventarnummerPhrase=this.$p.t("profil/inventarnummer"),this.preloadedPhrasen.ausgabedatum=this.$p.t("profil/ausgabedatum"),this.preloadedPhrasen.loaded=!0}),this.data.profilUpdates?.sort(this.sortProfilUpdates)},watch:{"language.value"(t){this.$refs.betriebsmittelTable&&this.$refs.betriebsmittelTable.tabulator.setColumns(this.betriebsmittel_table_options.columns),this.$refs.zutrittsgruppenTable&&this.$refs.zutrittsgruppenTable.tabulator.setColumns(this.zutrittsgruppen_table_options.columns)}},template:'\n
    \n \n \x3c!-- ROW --\x3e\n
    \n \x3c!-- HIDDEN QUICK LINKS --\x3e\n
    \n \x3c!--TODO: uncomment when implemented\n\t\t\t
    \n
    \n \n
    \n
    --\x3e\n\n\t\t\t\x3c!-- Bearbeiten Button --\x3e\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\x3c!-- MOBILE PROFIL UPDATES --\x3e\n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t
    \n\t\t\t\x3c!-- END OF HIDDEN QUCK LINKS --\x3e\n\n\t\t\t\x3c!-- MAIN PANNEL --\x3e\n\t\t\t
    \n\t\t\t\t\x3c!-- ROW WITH PROFIL IMAGE AND INFORMATION --\x3e\n\t\t\t\t\x3c!-- INFORMATION CONTENT START --\x3e\n\t\t\t\t\x3c!-- ROW WITH THE PROFIL INFORMATION --\x3e\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\x3c!-- PROFIL INFORMATION --\x3e\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\x3c!-- STUDENT INFO --\x3e\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\x3c!-- START OF SECOND PROFIL INFORMATION COLUMN --\x3e\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\x3c!-- EMAILS --\x3e\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\x3c!-- PRIVATE KONTAKTE--\x3e\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t\t{{$p.t(\'profil\',\'privateKontakte\')}}\n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\x3c!-- PRIVATE ADRESSEN--\x3e\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t\t{{$p.t(\'profil\',\'privateAdressen\')}}\n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t
    \n\t\t\t\x3c!-- SECOND ROW UNDER THE PROFIL IMAGE AND INFORMATION WITH THE TABLES --\x3e\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\x3c!-- END OF MAIN CONTENT COL --\x3e\n\t\t
    \n\t\t\x3c!-- START OF SIDE PANEL --\x3e\n\t\t
    \n\t\t\t\x3c!--TODO: uncomment when implemented\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    --\x3e\n\t\t\t\x3c!-- Bearbeiten Button --\x3e\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\x3c!-- PROFIL UPDATES --\x3e\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t\x3c!-- START OF THE SECOND ROW IN THE SIDE PANEL --\x3e\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\x3c!-- HIER SIND DIE MAILVERTEILER --\x3e\n\t\t\t\t\t\n\t\t\t\t
    \n \x3c!-- END OF THE SECOND ROW IN THE SIDE PANEL --\x3e\n
    \n \x3c!-- END OF SIDE PANEL --\x3e\n
    \n \x3c!-- END OF CONTAINER ROW--\x3e\n
    \n\x3c!-- END OF CONTAINER --\x3e\n
    \n'},Ce={components:{CoreFilterCmpt:pe,EditProfil:Te,Adresse:fe,Kontakt:ve,FetchProfilUpdates:ze,AusweisStatus:me,Mailverteiler:he,QuickLinks:ge,ProfilEmails:be,RoleInformation:ye,ProfilInformation:xe},inject:["sortProfilUpdates","collapseFunction","language","isEditable"],data(){return{showModal:!1,editDataFilter:null,preloadedPhrasen:{},funktionen_table_options:{persistenceID:"filterTableMaProfilFunktionen",persistence:{columns:!1},minHeight:300,layout:"fitColumns",responsiveLayout:"collapse",responsiveLayoutCollapseUseFormatters:!1,responsiveLayoutCollapseFormatter:Vue.$collapseFormatter,columns:[{title:"",field:"collapse",headerSort:!1,headerFilter:!1,formatter:"responsiveCollapse",maxWidth:40,headerClick:this.collapseFunction,visible:!0},{title:Vue.computed(()=>this.preloadedPhrasen.bezeichnungPhrase),field:"Bezeichnung",headerFilter:!0,minWidth:200,visible:!0},{title:Vue.computed(()=>this.preloadedPhrasen.organisationseinheitPhrase),field:"Organisationseinheit",headerFilter:!0,minWidth:200,visible:!0},{title:Vue.computed(()=>this.preloadedPhrasen.gueltigVonPhrase),field:"Gültig_von",headerFilterFunc:"dates",headerFilter:De,resizable:!0,minWidth:200,visible:!0,formatter:"datetime",formatterParams:this.datetimeFormatterParams()},{title:Vue.computed(()=>this.preloadedPhrasen.gueltigBisPhrase),field:"Gültig_bis",headerFilterFunc:"dates",headerFilter:De,resizable:!0,minWidth:200,visible:!0,formatter:"datetime",formatterParams:this.datetimeFormatterParams()},{title:Vue.computed(()=>this.preloadedPhrasen.wochenstundenPhrase),field:"Wochenstunden",headerFilter:!0,minWidth:200,visible:!0}]},betriebsmittel_table_options:{persistenceID:"filterTableMaProfilBetriebsmittel",persistence:{columns:!1},minHeight:300,layout:"fitColumns",responsiveLayout:"collapse",responsiveLayoutCollapseUseFormatters:!1,responsiveLayoutCollapseFormatter:Vue.$collapseFormatter,data:[{betriebsmittel:"",Nummer:"",Ausgegeben_am:""}],columns:[{title:"",field:"collapse",headerSort:!1,headerFilter:!1,formatter:"responsiveCollapse",maxWidth:40,headerClick:this.collapseFunction,visible:!0},{title:Vue.computed(()=>this.preloadedPhrasen.entlehnteBetriebsmittelPhrase),field:"betriebsmittel",headerFilter:!0,minWidth:200,visible:!0},{title:Vue.computed(()=>this.preloadedPhrasen.inventarnummerPhrase),field:"Nummer",headerFilter:!0,resizable:!0,minWidth:200,visible:!0},{title:Vue.computed(()=>this.preloadedPhrasen.ausgabedatumPhrase),field:"Ausgegeben_am",headerFilterFunc:"dates",headerFilter:De,minWidth:200,visible:!0,formatter:"datetime",formatterParams:this.datetimeFormatterParams()}]}}},props:{data:Object,editData:Object},methods:{betriebsmittelTableBuilt:function(){this.$refs.betriebsmittelTable.tabulator.setColumns(this.betriebsmittel_table_options.columns),this.$refs.betriebsmittelTable.tabulator.setData(this.data.mittel)},funktionenTableBuilt:function(){this.$refs.funktionenTable.tabulator.setColumns(this.funktionen_table_options.columns),this.$refs.funktionenTable.tabulator.setData(this.data.funktionen)},hideEditProfilModal:function(){this.$refs.editModal.result&&this.$api.call(_e.selectProfilRequest()).then(t=>{!t.error&&t.data?(this.data.profilUpdates=t.data,this.data.profilUpdates.sort(this.sortProfilUpdates)):console.error("Error when fetching profile updates: "+t)}).catch(t=>{console.error(t)}),this.showModal=!1,this.editDataFilter=null},showEditProfilModal(t){t&&(this.editDataFilter=t),this.showModal=!0,Vue.nextTick(()=>{this.$refs.editModal.show()})},fetchProfilUpdates:function(){this.$api.call(_e.selectProfilRequest()).then(t=>{!t.error&&t&&(this.data.profilUpdates=t.data?.length?t.data.sort(this.sortProfilUpdates):null)})},setTableColumnTitles(){this.$refs.betriebsmittelTable&&this.$refs.betriebsmittelTable.tabulator.setColumns(this.betriebsmittel_table_options.columns),this.$refs.funktionenTable&&this.$refs.funktionenTable.tabulator.setColumns(this.funktionen_table_options.columns)},datetimeFormatterParams:function(){return{inputFormat:"yyyy-MM-dd",outputFormat:"dd.MM.yyyy",invalidPlaceholder:"(invalid date)",timezone:FHC_JS_DATA_STORAGE_OBJECT.timezone}}},computed:{fotoStatus(){return this.data?.fotoStatus??null},getTelefonValue(){return this.data.standort_telefon?.kontakt?this.data.standort_telefon.kontakt+" "+this.data.telefonklappe:this.data.standort_telefon?this.data.standort_telefon+" "+this.data.telefonklappe:this.data.telefonklappe},filteredEditData(){return this.editDataFilter?this.editData.data[this.editDataFilter]:this.editData},profilInformation(){return this.data?{Vorname:this.data.vorname,Nachname:this.data.nachname,Username:this.data.username,Anrede:this.data.anrede,Titel:this.data.titel,Postnomen:this.data.postnomen,foto_sperre:this.data.foto_sperre,foto:this.data.foto}:{}},roleInformation(){return this.data?{geburtsdatum:{label:`${this.$p.t("profil","Geburtsdatum")}`,value:this.data.gebdatum},geburtsort:{label:`${this.$p.t("profil","Geburtsort")}`,value:this.data.gebort},personenkennzeichen:{label:`${this.$p.t("profil","Kurzzeichen")}`,value:this.data.kurzbz},telefon:{label:`${this.$p.t("profil","Telefon")}`,value:this.getTelefonValue},office:{label:`${this.$p.t("profil","Büro")}`,value:this.data.ort_kurzbz}}:{}}},created(){this.$p.loadCategory(["ui","lehre","global","profil"]).then(()=>{this.preloadedPhrasen.bezeichnungPhrase=this.$p.t("ui/bezeichnung"),this.preloadedPhrasen.organisationseinheitPhrase=this.$p.t("lehre/organisationseinheit"),this.preloadedPhrasen.gueltigVonPhrase=this.$p.t("global/gueltigVon"),this.preloadedPhrasen.gueltigBisPhrase=this.$p.t("global/gueltigBis"),this.preloadedPhrasen.wochenstundenPhrase=this.$p.t("profil/wochenstunden"),this.preloadedPhrasen.entlehnteBetriebsmittelPhrase=this.$p.t("profil/entlehnteBetriebsmittel"),this.preloadedPhrasen.inventarnummerPhrase=this.$p.t("profil/inventarnummer"),this.preloadedPhrasen.ausgabedatumPhrase=this.$p.t("profil/ausgabedatum"),this.preloadedPhrasen.loaded=!0}),this.data.profilUpdates?.sort(this.sortProfilUpdates)},watch:{"data.funktionen"(t){this.$refs.funktionenTable&&this.$refs.funktionenTable.tabulator.setData(t)},"data.mittel"(t){this.$refs.betriebsmittelTable&&this.$refs.betriebsmittelTable.tabulator.setData(t)},"language.value"(t){this.setTableColumnTitles()}},template:'\n
    \n \n
    \n
    \n \x3c!--TODO: uncomment when implemented\n
    \n
    \n \n
    \n
    --\x3e\n \x3c!-- Bearbeiten Button --\x3e\n
    \n
    \n \n
    \n
    \n
    \n
    \n \x3c!-- MOBILE PROFIL UPDATES --\x3e\n \n
    \n
    \n
    \n \x3c!-- END OF HIDDEN ROW (HIDDEN IN VIEWPORTS GREATER THEN-EQUAL MD) --\x3e\n \x3c!-- MAIN PANNEL --\x3e\n
    \n \x3c!-- ROW WITH PROFIL IMAGE AND INFORMATION --\x3e\n \x3c!-- INFORMATION CONTENT START --\x3e\n \x3c!-- ROW WITH THE PROFIL INFORMATION --\x3e\n
    \n
    \n
    \n
    \n \x3c!-- PROFIL INFORMATION --\x3e\n \n
    \n
    \n
    \n
    \n \x3c!-- MITARBEITER INFO --\x3e\n \n
    \n
    \n \x3c!-- START OF SECOND PROFIL INFORMATION COLUMN --\x3e\n
    \n
    \n
    \n
    \n \x3c!-- EMAILS --\x3e\n \n
    \n
    \n
    \n
    \n \x3c!-- PRIVATE KONTAKTE--\x3e\n
    \n
    \n
    \n
    \n \n
    \n
    \n {{$p.t(\'profil\',\'privateKontakte\')}}\n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \x3c!-- PRIVATE ADRESSEN--\x3e\n
    \n
    \n
    \n
    \n \n
    \n
    \n {{$p.t(\'profil\',\'privateAdressen\')}}\n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \x3c!-- FUNKTIONEN TABELLE --\x3e\n \n
    \n
    \n \x3c!-- BETRIEBSMITTEL TABELLE --\x3e\n \n
    \n
    \n
    \n \x3c!-- START OF SIDE PANEL --\x3e\n
    \n \x3c!--TODO: uncomment when implemented\n
    \n \n
    \n \n \n \n \n \n
    \n
    --\x3e\n \x3c!-- Bearbeiten Button --\x3e\n
    \n
    \n \n
    \n
    \n
    \n
    \n \x3c!-- PROFIL UPDATES --\x3e\n \n
    \n
    \n
    \n
    \n \x3c!-- AUSWEIS STATUS --\x3e\n \n
    \n
    \n
    \n
    \n \x3c!-- MAILVERTEILER --\x3e\n \n
    \n
    \n
    \n
    \n
    \n\n \n '},Oe={data:()=>({}),components:{QuickLinks:ge,Mailverteiler:he,ProfilEmails:be,RoleInformation:ye,ProfilInformation:xe},props:["data"],provide(){return{studiengang_kz:Vue.computed({get:()=>this.data.studiengang_kz})}},methods:{},computed:{fotoStatus(){return this.data?.fotoStatus??null},profilInformation(){return this.data?{Vorname:this.data.vorname,Nachname:this.data.nachname,Username:this.data.username,Anrede:this.data.anrede,Titel:this.data.titel,Postnomen:this.data.postnomen,foto_sperre:this.data.foto_sperre,foto:this.data.foto}:{}},personEmails(){return this.data?.emails?this.data.emails:[]},roleInformation(){return this.data?{geburtsdatum:{label:`${this.$p.t("profil","Geburtsdatum")}`,value:this.data.gebdatum},geburtsort:{label:`${this.$p.t("profil","Geburtsort")}`,value:this.data.gebort},personenkennzeichen:{label:`${this.$p.t("person","personenkennzeichen")}`,value:this.data.personenkennzeichen},studiengang:{label:`${this.$p.t("lehre","studiengang")}`,value:this.data.studiengang},semester:{label:`${this.$p.t("lehre","semester")}`,value:this.data.semester},verband:{label:`${this.$p.t("lehre","lehrverband")}`,value:this.data.verband},gruppe:{label:`${this.$p.t("lehre","gruppe")}`,value:this.data.gruppe.trim()}}:{}}},mounted(){},template:' \n\n
    \n \x3c!-- ROW --\x3e \n
    \n \x3c!-- HIDDEN QUICK LINKS --\x3e\n \x3c!-- uncomment when implemented\n
    \n \n \n \n
    --\x3e\n \x3c!-- END OF HIDDEN QUCK LINKS --\x3e\n \x3c!-- MAIN PANNEL --\x3e\n
    \n \x3c!-- ROW WITH PROFIL IMAGE AND INFORMATION --\x3e\n \x3c!-- INFORMATION CONTENT START --\x3e\n \x3c!-- ROW WITH THE PROFIL INFORMATION --\x3e \n
    \n \x3c!-- FIRST KAESTCHEN --\x3e\n
    \n
    \n
    \n \n
    \n
    \n \x3c!-- START OF SECOND PROFIL INFORMATION COLUMN --\x3e\n \x3c!-- END OF PROFIL INFORMATION ROW --\x3e\n \x3c!-- INFORMATION CONTENT END --\x3e\n
    \n
    \n
    \n
    \n \x3c!-- EMAILS --\x3e\n \n
    \n
    \n \x3c!-- SECOND ROW OF SECOND COLUMN IN MAIN CONTENT --\x3e\n
    \n
    \n \n
    \n
    \n \x3c!-- END OF SECOND ROW OF SECOND COLUMN IN MAIN CONTENT --\x3e\n \x3c!-- END OF THE SECOND INFORMATION COLUMN --\x3e\n
    \n \x3c!-- START OF THE SECOND PROFIL INFORMATION ROW --\x3e \n \x3c!-- ROW WITH PROFIL IMAGE AND INFORMATION END --\x3e\n
    \n \x3c!-- END OF MAIN CONTENT COL --\x3e\n
    \n \x3c!-- START OF SIDE PANEL --\x3e\n
    \n \x3c!-- SRART OF QUICK LINKS IN THE SIDE PANEL --\x3e\n \x3c!-- START OF THE FIRDT ROW IN THE SIDE PANEL --\x3e\n \x3c!-- THESE QUCK LINKS ARE ONLY VISIBLE UNTIL VIEWPORT MD --\x3e\n \x3c!--TODO: uncomment when implemented\n
    \n
    \n \n \n \n
    \n
    --\x3e\n \x3c!-- START OF THE SECOND ROW IN THE SIDE PANEL --\x3e\n
    \n
    \n \x3c!-- HIER SIND DIE MAILVERTEILER --\x3e\n \n
    \n \x3c!-- END OF THE SECOND ROW IN THE SIDE PANEL --\x3e\n
    \n \x3c!-- END OF SIDE PANEL --\x3e\n
    \n \x3c!-- END OF CONTAINER ROW--\x3e\n
    \n \x3c!-- END OF CONTAINER --\x3e\n
    \n '},Pe={components:{CoreFilterCmpt:pe,Mailverteiler:he,QuickLinks:ge,RoleInformation:ye,ProfilEmails:be,ProfilInformation:xe},inject:["collapseFunction","language"],data(){return{collapseIconFunktionen:!0,preloadedPhrasen:{},funktionen_table_options:{persistenceID:"filterTableMaViewProfilFunktionen",persistence:{columns:!1},minHeight:300,layout:"fitColumns",responsiveLayout:"collapse",responsiveLayoutCollapseUseFormatters:!1,responsiveLayoutCollapseFormatter:Vue.$collapseFormatter,columns:[{title:"",field:"collapse",headerSort:!1,headerFilter:!1,formatter:"responsiveCollapse",maxWidth:40,headerClick:this.collapseFunction,visible:!0},{title:Vue.computed(()=>this.$p.t("ui/bezeichnung")),field:"Bezeichnung",headerFilter:!0,minWidth:200,visible:!0},{title:Vue.computed(()=>this.$p.t("lehre/organisationseinheit")),field:"Organisationseinheit",headerFilter:!0,minWidth:200,visible:!0},{title:Vue.computed(()=>this.$p.t("global/gueltigVon")),field:"Gültig_von",headerFilterFunc:"dates",headerFilter:De,resizable:!0,minWidth:200,visible:!0,formatter:"datetime",formatterParams:this.datetimeFormatterParams()},{title:Vue.computed(()=>this.$p.t("global/gueltigBis")),field:"Gültig_bis",headerFilterFunc:"dates",headerFilter:De,resizable:!0,minWidth:200,visible:!0,formatter:"datetime",formatterParams:this.datetimeFormatterParams()},{title:Vue.computed(()=>this.$p.t("profil/wochenstunden")),field:"Wochenstunden",headerFilter:!0,minWidth:200,visible:!0}]}}},props:["data"],methods:{funktionenTableBuilt:function(){this.$refs.funktionenTable.tabulator.setData(this.data.funktionen)},datetimeFormatterParams:function(){return{inputFormat:"yyyy-MM-dd",outputFormat:"dd.MM.yyyy",invalidPlaceholder:"(invalid date)",timezone:FHC_JS_DATA_STORAGE_OBJECT.timezone}}},watch:{"data.funktionen"(t){this.$refs.funktionenTable&&this.$refs.funktionenTable.tabulator.setData(t)},"language.value"(t){this.$refs.funktionenTable&&this.$refs.funktionenTable.tabulator.setColumns(this.funktionen_table_options.columns)}},computed:{getTelefonValue(){return this.data.standort_telefon?.kontakt?this.data.standort_telefon.kontakt+" "+this.data.telefonklappe:this.data.standort_telefon?this.data.standort_telefon+" "+this.data.telefonklappe:this.data.telefonklappe},fotoStatus(){return this.data?.fotoStatus??null},personEmails(){return this.data?.emails?this.data.emails:[]},profilInformation(){return this.data?{Vorname:this.data.vorname,Nachname:this.data.nachname,Username:this.data.username,Anrede:this.data.anrede,Titel:this.data.titel,Postnomen:this.data.postnomen,foto_sperre:this.data.foto_sperre,foto:this.data.foto}:{}},roleInformation(){return this.data?{geburtsdatum:{label:`${this.$p.t("profil","Geburtsdatum")}`,value:this.data.gebdatum},geburtsort:{label:`${this.$p.t("profil","Geburtsort")}`,value:this.data.gebort},personenkennzeichen:{label:`${this.$p.t("profil","Kurzzeichen")}`,value:this.data.kurzbz},telefon:{label:`${this.$p.t("profil","Telefon")}`,value:this.getTelefonValue},office:{label:`${this.$p.t("profil","Büro")}`,value:this.data.ort_kurzbz}}:{}}},created(){this.$p.loadCategory(["ui","lehre","global","profil"]).then(()=>{this.preloadedPhrasen.bezeichnungPhrase=this.$p.t("ui/bezeichnung"),this.preloadedPhrasen.organisationseinheitPhrase=this.$p.t("lehre/organisationseinheit"),this.preloadedPhrasen.gueltigVonPhrase=this.$p.t("global/gueltigVon"),this.preloadedPhrasen.gueltigBisPhrase=this.$p.t("global/gueltigBis"),this.preloadedPhrasen.wochenstundenPhrase=this.$p.t("profil/wochenstunden"),this.preloadedPhrasen.loaded=!0})},template:'\n\n
    \n \x3c!-- ROW --\x3e\n
    \n \x3c!-- HIDDEN QUICK LINKS --\x3e\n \x3c!-- TODO: uncomment when implemented\n
    \n\n \n\n
    \n --\x3e\n \x3c!-- END OF HIDDEN QUCK LINKS --\x3e\n \x3c!-- MAIN PANNEL --\x3e\n
    \n \x3c!-- ROW WITH PROFIL IMAGE AND INFORMATION --\x3e\n \x3c!-- INFORMATION CONTENT START --\x3e\n \x3c!-- ROW WITH THE PROFIL INFORMATION --\x3e\n
    \n \x3c!-- FIRST KAESTCHEN --\x3e\n
    \n
    \n
    \n \x3c!-- Profil Informationen --\x3e\n \n
    \n
    \n \x3c!-- START OF SECOND PROFIL INFORMATION COLUMN --\x3e\n \x3c!-- END OF PROFIL INFORMATION ROW --\x3e\n \x3c!-- INFORMATION CONTENT END --\x3e\n
    \n
    \n
    \n
    \n \x3c!-- EMAILS --\x3e\n \n
    \n
    \n \x3c!-- SECOND ROW OF SECOND COLUMN IN MAIN CONTENT --\x3e\n
    \n
    \n \x3c!-- roleInformation --\x3e\n \n
    \n
    \n \x3c!-- END OF SECOND ROW OF SECOND COLUMN IN MAIN CONTENT --\x3e\n \x3c!-- END OF THE SECOND INFORMATION COLUMN --\x3e\n
    \n \x3c!-- START OF THE SECOND PROFIL INFORMATION ROW --\x3e\n \x3c!-- ROW WITH PROFIL IMAGE AND INFORMATION END --\x3e\n
    \n \x3c!-- SECOND ROW UNDER THE PROFIL IMAGE AND INFORMATION WITH THE TABLES --\x3e\n
    \n \x3c!-- FIRST TABLE --\x3e\n
    \n \n
    \n \x3c!-- END OF THE ROW WITH THE TABLES UNDER THE PROFIL INFORMATION --\x3e\n
    \n \x3c!-- END OF MAIN CONTENT COL --\x3e\n
    \n \x3c!-- START OF SIDE PANEL --\x3e\n
    \n \x3c!-- VISIBLE UNTIL VIEWPORT MD --\x3e\n \x3c!--TODO: uncomment when implemented\n
    \n
    \n \n \n \n
    \n
    \n --\x3e\n
    \n
    \n \x3c!-- MAILVERTEILER --\x3e\n \n
    \n
    \n \x3c!-- END OF SIDE PANEL --\x3e\n
    \n \x3c!-- END OF CONTAINER ROW--\x3e\n
    \n \x3c!-- END OF CONTAINER --\x3e\n
    \n'};Vue.$collapseFormatter=function(t){var e=document.createElement("div");e.classList.add("tabulator-collapsed-row"),e.classList.add("text-break");var n=document.createElement("div");return n.classList.add("row"),e.appendChild(n),t.forEach(function(t){let e=document.createElement("div");e.classList.add("col-6");let a=document.createElement("div");a.classList.add("col-6"),e.innerHTML=""+t.title+"",a.innerHTML=t.value?t.value:"-",n.appendChild(e),n.appendChild(a)}),Object.keys(t).length?e:""};const Fe={name:"Profil",components:{StudentProfil:Ee,MitarbeiterProfil:Ce,ViewStudentProfil:Oe,ViewMitarbeiterProfil:Pe,Loading:Se},props:{uid:{type:String,required:!1},viewData:{type:Object}},data(){return{loading:!1,profilUpdateStates:null,profilUpdateTopic:null,view:null,data:null,notFoundUID:null,isEditable:this.viewData.editable??!1}},provide(){return{isEditable:Vue.computed(()=>this.isEditable),profilUpdateStates:Vue.computed(()=>!!this.profilUpdateStates&&this.profilUpdateStates),profilUpdateTopic:Vue.computed(()=>!!this.profilUpdateTopic&&this.profilUpdateTopic),setLoading:t=>{this.loading=t},getZustellkontakteCount:this.zustellKontakteCount,getZustelladressenCount:this.zustellAdressenCount,collapseFunction:(t,e)=>{void 0===this[t.target.id]&&(this[t.target.id]=!0),this[t.target.id]=!this[t.target.id];let n=e._column.cells.map(t=>t.element.children[0]);this[t.target.id]?t.target.classList.replace("fa-angle-up","fa-angle-down"):t.target.classList.replace("fa-angle-down","fa-angle-up"),this[t.target.id]?n.filter(t=>!t.classList.contains("open")).forEach(t=>{t.click()}):n.filter(t=>t.classList.contains("open")).forEach(t=>{t.click()})},sortProfilUpdates:(t,e)=>{let n=0;return n="pending"===t.status.toLowerCase()||"accepted"===t.status.toLowerCase()&&"rejected"===e.status.toLowerCase()?-1:1,t.status===e.status&&(n=new Date(e.insertamum.split(".").reverse().join("-"))-new Date(t.insertamum.split(".").reverse().join("-"))),n}}},methods:{async load(){await this.$api.call(_e.getStatus()).then(t=>{this.profilUpdateStates=t.data}).catch(t=>{console.error(t)}),this.$api.call(_e.getTopic()).then(t=>{this.profilUpdateTopic=t.data}).catch(t=>{console.error(t)}),this.$api.call(we.profilViewData(this.$route.params.uid??null)).then(t=>t.data).then(t=>{this.view=t?.profil_data.view,this.data=t?.profil_data.data,this.isEditable=t?.editable??!1}).catch(t=>{console.error(t)})},zustellAdressenCount(){if(!this.data||!this.data.adressen)return null;let t=[];return this.data.profilUpdates?.length&&(t=t.concat(this.data.profilUpdates.filter(t=>t.requested_change.zustelladresse).map(t=>t.requested_change.adresse_id))),this.data.profilUpdates?.length&&this.data.adressen.filter(t=>t.zustelladresse).every(t=>this.data.profilUpdates.some(e=>e.requested_change.adresse_id==t.adresse_id))||(t=t.concat(this.data.adressen.filter(t=>t.zustelladresse).map(t=>t.adresse_id))),[...new Set(t)]},zustellKontakteCount(){if(!this.data||!this.data.kontakte)return null;let t=[];return this.data.profilUpdates?.length&&(t=t.concat(this.data.profilUpdates.filter(t=>"Pending"===t.status&&t.requested_change.zustellung).map(t=>({kontakt_id:t.requested_change.kontakt_id,kontakttyp:t.requested_change.kontakttyp})))),this.data.profilUpdates?.length&&this.data.kontakte.filter(t=>t.zustellung).every(t=>this.data.profilUpdates.some(e=>"Pending"===e.status&&e.requested_change.kontakt_id==t.kontakt_id))||(t=t.concat(this.data.kontakte.filter(t=>t.zustellung).map(t=>({kontakt_id:t.kontakt_id,kontakttyp:t.kontakttyp})))),[...new Set(t)]}},computed:{filteredEditData(){if(this.data)return{view:null,data:{Personen_Informationen:{title:this.$p.t("profil","personenInformationen"),topic:"Personen_informationen",view:null,data:{vorname:{title:this.$p.t("person","vorname"),topic:this.profilUpdateTopic?.Vorname,view:"TextInputDokument",withFiles:!0,data:{titel:"vorname",value:this.data.vorname}},nachname:{title:this.$p.t("person","nachname"),topic:this.profilUpdateTopic?.Nachname,view:"TextInputDokument",withFiles:!0,data:{titel:"nachname",value:this.data.nachname}},titel:{title:this.$p.t("global","titel"),topic:this.profilUpdateTopic?.Titel,view:"TextInputDokument",withFiles:!0,data:{titel:"titel",value:this.data.titel}},postnomen:{title:this.$p.t("profil","postnomen"),topic:this.profilUpdateTopic?.Postnomen,view:"TextInputDokument",withFiles:!0,data:{titel:"postnomen",value:this.data.postnomen}}}},Private_Kontakte:{title:this.$p.t("profil","privateKontakte"),topic:this.profilUpdateTopic?.["Private Kontakte"],data:this.data.kontakte?.filter(t=>!this.data.profilUpdates?.some(e=>e.status===this.profilUpdateStates.Pending&&e.requested_change?.kontakt_id===t.kontakt_id)).map(t=>({listview:"Kontakt",view:"EditKontakt",data:t}))},Private_Adressen:{title:this.$p.t("profil","privateAdressen"),topic:this.profilUpdateTopic?.["Private Adressen"],data:this.data.adressen?.filter(t=>!this.data.profilUpdates?.some(e=>e.status===this.profilUpdateStates.Pending&&e.requested_change?.adresse_id==t.adresse_id)).map(t=>({listview:"Adresse",view:"EditAdresse",data:t}))}}}}},watch:{loading:function(t){t?this.$refs.loadingModalRef.show():this.$refs.loadingModalRef.hide()},uid(t,e){this.load()}},created(){this.load()},template:'\n\t
    \n\t\t
    \n\t\t\t

    Es wurde keine Person mit der UID {{this.notFoundUID}} gefunden

    \n\t\t
    \n\t\t
    \n \n \n\t\t
    \n\t
    '};var Ie={getContentID:t=>({method:"get",url:"/api/frontend/v1/Ort/ContentID",params:{ort_kurzbz:t}}),getRooms:(t,e,n,a,i=0)=>({method:"get",url:"/api/frontend/v1/Ort/getRooms",params:{datum:t,von:e,bis:n,typ:a,personenanzahl:i}}),getRoomTypes:()=>({method:"get",url:"/api/frontend/v1/Ort/getTypes",params:{}})};const Me={name:"Raumsuche",props:{},components:{VueDatePicker:i,CoreFilterCmpt:pe,InputNumber:primevue.inputnumber},data(){return{phrasenPromise:null,phrasenResolved:!1,tabulatorUuid:Vue.ref(0),tableBuiltResolve:null,tableBuiltPromise:null,roomtypes:null,defaultType:{raumtyp_kurzbz:"",beschreibung:Vue.computed(()=>this.$p.t("global/alle"))},anzahl:1,selectedType:null,datum:new Date,von:Vue.ref({hours:(new Date).getHours(),minutes:(new Date).getMinutes()}),bis:Vue.ref({hours:(new Date).getHours()+1,minutes:(new Date).getMinutes()}),datepickerTextInputOptions:{enterSubmit:!0,tabSubmit:!0,selectOnFocus:!0,format:"dd.MM.yyyy",escClose:!0},timepickerTextInputOptions:{enterSubmit:!0,tabSubmit:!0,selectOnFocus:!0,format:"HH:mm",escClose:!0},raumsucheTableOptions:{height:Vue.ref(400),index:"ort_kurzbz",layout:"fitColumns",placeholder:this.$p.t("global/noDataAvailable"),columns:[{title:Vue.computed(()=>this.$p.t("rauminfo/raum_kurzbz")),field:"ort_kurzbz",widthGrow:1},{title:Vue.computed(()=>this.$p.t("global/bezeichnung")),field:"bezeichnung",widthGrow:2},{title:Vue.computed(()=>this.$p.t("rauminfo/raumnummer")),field:"nummer",widthGrow:1},{title:Vue.computed(()=>this.$p.t("rauminfo/personcap")),field:"personen",widthGrow:1},{title:Vue.computed(()=>this.$p.t("rauminfo/rauminfo")),field:"linkInfo",formatter:this.linkFormatter,widthGrow:1},{title:Vue.computed(()=>this.$p.t("rauminfo/roomReservations")),field:"linkRes",formatter:this.linkFormatter,widthGrow:1}],persistence:!1},raumsucheTableEventHandlers:[{event:"tableBuilt",handler:async()=>{this.tableBuiltResolve()}}]}},methods:{tableResolve(t){this.tableBuiltResolve=t},linkFormatter(t){const e=t.getValue(),n="linkInfo"===t.getField()?this.$p.t("rauminfo/rauminfo"):this.$p.t("rauminfo/roomReservations");return e?'
    ':'
    -
    '},roomPlanLink:t=>FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/CisVue/Cms/getRoomInformation/"+t.ort_kurzbz,roomInfoLink:t=>FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/CisVue/Cms/content/"+t.content_id,getTimeString:t=>`${String(t.hours).padStart(2,"0")}:${String(t.minutes).padStart(2,"0")}`,setupData(t){const e=t.map(t=>({ort_kurzbz:t.ort_kurzbz,bezeichnung:t.bezeichnung.replace("&","&"),nummer:t.planbezeichnung,personen:t.max_person,linkInfo:t.content_id?this.roomInfoLink(t):null,linkRes:this.roomPlanLink(t)}));this.$refs.raumsucheTable.tabulator.setData(e)},loadRoomTypes(){this.$api.call(Ie.getRoomTypes()).then(t=>{t?.data?.forEach(t=>{t.beschreibung=t.beschreibung.replace("&","&")}),this.selectedType=this.defaultType,this.roomtypes=t?.data??[]})},loadRooms(){this.$api.call(Ie.getRooms(this.datum.toISOString(),this.getTimeString(this.von),this.getTimeString(this.bis),this.selectedType?.raumtyp_kurzbz??"",this.anzahl)).then(t=>{t?.data?.retval&&this.setupData(t.data.retval)})},handleUuidDefined(t){this.tabulatorUuid=t},search(){this.loadRooms()},setRoute(t){},dateFormat:t=>`${String(t.getDate()).padStart(2,"0")}.${String(t.getMonth()+1).padStart(2,"0")}.${t.getFullYear()}`,timeFormat:t=>`${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`,async setupMounted(){this.tableBuiltPromise=new Promise(this.tableResolve),await this.tableBuiltPromise,this.loadRoomTypes(),this.loadRooms();const t=this.tabulatorUuid?"-"+this.tabulatorUuid:"",e=document.getElementById("filterTableDataset"+t);if(!e)return;const n=e.getBoundingClientRect(),a=window.visualViewport.height-n.top-100;this.$refs.raumsucheTable&&this.$refs.raumsucheTable.$refs.table.style.setProperty("height",a+"px")}},computed:{isDarkMode(){return"dark"==this.$theme.theme_name.value}},created(){this.phrasenPromise=this.$p.loadCategory(["rauminfo","global"]),this.phrasenPromise.then(()=>{this.phrasenResolved=!0})},mounted(){this.setupMounted()},template:'\n\t

    {{$p.t(\'rauminfo/roomSearch\')}}

    \n\t
    \n\t
    \n\t\t
    \n\t\t\t\n\t\t\t\n\t\t
    \n\t\t
    \n\t\t\t\n\t\t\t\n\t\t
    \n\t\t
    \n\t\t\t\n\t\t\t\n\t\t
    \n\t\t\n\t\t
    \n\t\t\t\n\t\t
    \n\t\t\n\n\t\t
    \n\t\t\t\n\t\t
    \n\t\t
    \n\t\t\t\n\t\t
    \n\t
    \n\t\n\n \n '};var Le={components:{paginator:primevue.paginator},emits:["update:rows"],props:{maxPageCount:{type:Number,default:0},page_size:{type:Number,required:!0}},data:()=>({}),methods:{newPageEvent:function(t){}},mounted(){},template:'\n \t\x3c!-- Desktop --\x3e\n\t
    \n\t\t\n\t\t\n\t
    \n\t\x3c!-- Mobile --\x3e\n\t
    \n\t\t\n\t\t\n\t
    \n '},Re={props:{uid:String,vorname:String,nachname:String,titelpre:String,kontakt:String,telefoneklappe:String,email:String,planbezeichnung:String,foto:String,displayWidget:{type:Boolean,default:!1}},template:'\n\t
    \n\t\t
    \n\t\t\tmitarbeiter_foto\n\t\t
    \n\t\t
    \n\t\t\t
    {{fullname}}
    \n\t\t
    \n\t\t
    \n\t\t
    \n\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t
    {{phone.number}}
    \n\n\t\t\t\t
    \n\t\t\t\t
    {{ort}}
    \n\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t
    \n\n\t\t
    \n\t
    \n\t',computed:{formattedEmail:function(){if(!this.email)return null;let t=this.email.replace("mailto:","").split("@");return t[0]+"@"+t[1]},fullname:function(){return this.titelpre&&this.vorname&&this.nachname?`${this.titelpre} ${this.vorname} ${this.nachname}`:this.vorname&&this.nachname?`${this.vorname} ${this.nachname}`:this.nachname?this.vorname:null},phone:function(){return this.kontakt&&this.telefoneklappe?{link:"tel:".concat(this.kontakt).concat(" "+this.telefoneklappe),number:this.kontakt.concat(" "+this.telefoneklappe)}:this.kontakt?{link:"tel:".concat(this.kontakt),number:this.kontakt}:null},email_link:function(){return this.email?"mailto:".concat(this.email):null},base64Image:function(){return this.foto?"data:image/png;base64,".concat(this.foto):null},ort:function(){return this.planbezeichnung??null},profilViewLink:function(){return this.uid?FHC_JS_DATA_STORAGE_OBJECT.app_root.concat(FHC_JS_DATA_STORAGE_OBJECT.ci_router).concat("/Cis/Profil/View/").concat(this.uid):null}}},Ne={props:{title:String,vertretungsList:Array,showBezeichnung:Boolean},template:'\n\t
    \n\t\t
    \n\t\t\t{{title}}\n\t\t
    \n\t\t
    \n\t\t\t

    \n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{{vertretungFormatedName(vertretung,false)}}\n\t\t\t

    \n\t\t
    \n\t
    \n\t',methods:{profilViewLink:function(t){return t?FHC_JS_DATA_STORAGE_OBJECT.app_root.concat(FHC_JS_DATA_STORAGE_OBJECT.ci_router).concat("/Cis/Profil/View/").concat(t):null},vertretungFormatedName:function(t){return t?`${t.vorname??""} ${t.nachname??""} ${t.bezeichnung&&this.showBezeichnung?"(".concat(t.bezeichnung.replace("(","").replace(")","")).concat(")"):""}`:null}}},Be={studiengangInformation:()=>({method:"get",url:"/api/frontend/v1/Studgang/getStudiengangInfo"}),getStudiengangByKz:t=>({method:"get",url:"/api/frontend/v1/organisation/StudiengangEP/getStudiengangByKz",params:{studiengang_kz:t}})},je={data:()=>({studiengang:null,semester:null,stg_ltg:null,gf_ltg:null,stv_ltg:null,ass:null,hochschulvertr:null,stdv:null,jahrgangsvertr:null}),props:{displayWidget:{type:Boolean,default:!1}},components:{StudiengangPerson:Re,StudiengangVertretung:Ne},template:'\n\t\t
    \n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t
    \n\t\n',computed:{collection_array:function(){let t=[];return Array.isArray(this.stg_ltg)&&1==this.stg_ltg.length&&Array.isArray(this.ass)&&1==this.ass.length?t.push({title:`${this.$p.t("global","studiengangsleitung")}/${this.$p.t("studiengangInformation","assistenz")}`,collection:[...this.stg_ltg,...this.ass]}):(t.push({title:this.$p.t("global","studiengangsleitung"),collection:this.stg_ltg}),t.push({title:this.$p.t("studiengangInformation","assistenz"),collection:this.ass})),Array.isArray(this.gf_ltg)&&1==this.gf_ltg.length&&Array.isArray(this.stv_ltg)&&1==this.stv_ltg.length?t.push({title:this.$p.t("studiengangInformation","geschaeftsfuehrende_stellvertretende_leitung"),collection:[...this.gf_ltg,...this.stv_ltg]}):(t.push({title:this.$p.t("studiengangInformation","geschaeftsfuehrende_leitung"),collection:this.gf_ltg}),t.push({title:this.$p.t("studiengangInformation","stellvertretende_leitung"),collection:this.stv_ltg})),t},moodleLink:function(){if(this.studiengang&&this.studiengang.studiengang_kz)return"https://moodle.technikum-wien.at/course/view.php?idnumber=dl"+this.studiengang.studiengang_kz}},mounted(){this.$api.call(Be.studiengangInformation()).then(t=>t.data).then(t=>{Object.assign(this,t)})}},Ue={content:(t,e=null,n=null,a=null)=>({method:"get",url:"/api/frontend/v1/Cms/content",params:{content_id:t,...e?{version:e}:{},...n?{sprache:n}:{},...a?{sichtbar:a}:{}}}),getNews:(t=1,e=10,n)=>({method:"get",url:"/api/frontend/v1/Cms/getNews",params:{page:t,page_size:e,sprache:n}}),news:t=>({method:"get",url:"/api/frontend/v1/Cms/news",params:{limit:t}}),getNewsRowCount:()=>({method:"get",url:"/api/frontend/v1/Cms/getNewsRowCount"}),getNewsExtra:()=>({method:"get",url:"/api/frontend/v1/Cms/getStudiengangInfoForNews"})},Ve={name:"NewsComponent",components:{Pagination:Le,StudiengangInformation:je},data:()=>({content:null,maxPageCount:0,page_size:10,page:1}),watch:{"$p.user_language.value":function(t){this.fetchNews()}},computed:{sprache:function(){return this.$p.user_language.value}},methods:{fetchNews(){return this.$api.call(Ue.getNews(this.page,this.page_size,this.sprache)).then(t=>t.data).then(t=>{this.content=t,document.querySelectorAll("#cms [data-confirm]").forEach(t=>{t.addEventListener("click",e=>{e.preventDefault(),l.popup(t.dataset.confirm).then(()=>{Axios.get(t.href).then(t=>{location=location}).catch(t=>console.error("ERROR:",t))}).catch(()=>{})})}),document.querySelectorAll("#cms [data-href]").forEach(t=>{t.href=t.dataset.href.replace(/^ROOT\//,FHC_JS_DATA_STORAGE_OBJECT.app_root)}),Vue.nextTick(()=>{document.querySelectorAll(".card-header").forEach(t=>{t.classList.add("fhc-primary")}),document.querySelectorAll(".row").forEach(t=>{t.classList.add("w-100"),t.classList.add("align-items-center")}),document.querySelectorAll(".row h2").forEach(t=>{t.classList.add("mb-0")})})})},loadNewPageContent(t){this.$api.call(Ue.getNews(t.page,t.rows)).then(t=>t.data).then(t=>{this.content=t})}},created(){this.fetchNews(),this.$api.call(Ue.getNewsRowCount()).then(t=>t.data).then(t=>{this.maxPageCount=t})},template:'\n \t

    News

    \n\t
    \n\t\n\t\n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n\t\n\t\n '},He={name:"RaumComponent",data:()=>({imgContent:null}),props:{content:{type:String,required:!0},content_id:{type:[Number,String]}},methods:{sanitizeLegacyTables(t){t.querySelectorAll("table").forEach(t=>{const e=t.textContent.trim(),n=document.createElement("p");n.textContent=e,t.parentNode.replaceChild(n,t)});t.querySelectorAll("ul").forEach(t=>{Array.from(t.children).forEach(e=>{const n=document.createElement("p");n.textContent=e.textContent,t.parentNode.appendChild(n)}),t.parentNode.removeChild(t)});Array.from(t.querySelectorAll("td")).filter(t=>t.scrollWidth>100).forEach(t=>{if(t.firstChild?.nodeType===Node.TEXT_NODE&&t.firstChild.length>10){const e=document.createElement("p");e.appendChild(t.firstChild),t.appendChild(e)}});Array.from(t.querySelectorAll("th")).forEach(t=>{t.children.length>1&&(t.innerHTML=Array.from(t.childNodes).find(t=>t.textContent).textContent)});t.querySelectorAll("p").forEach(t=>{t.style.setProperty("word-wrap","break-word"),t.style.setProperty("white-space","normal"),t.style.setProperty("max-width","400px")})}},mounted(){let t=document.getElementsByClassName("tablesorter");for(let e of t)this.sanitizeLegacyTables(e),new Tabulator(e,{layout:"fitDataStretch",columnDefaults:{formatter:"html",resizable:!1,minWidth:"100px"}});let e=document.getElementsByTagName("h1");if(e=e.length?e[0]:null,e&&e.innerText){let t=e.innerText,n=new RegExp("\\w*\\s([a-zA-Z][0-9\\.]+)$"),a=t.match(n);if(a){t=a[0],t=t.replace(" ","_");let n=document.createElement("a");n.href=FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/CisVue/Cms/getRoomInformation/"+t,n.appendChild(e.cloneNode(!0)),e.replaceWith(n);let i=document.querySelectorAll('.menubox a[href*="stpl_week.php"]');for(let t of i)t.href=n.href}else console.error(`the regular expression did not match the room name: ${t}`);return}const n=(new DOMParser).parseFromString(`
    ${this.content}
    `,"text/html").querySelector("img");if(n&&n.title){const t={};for(let e of n.attributes)t[e.name]=e.value;this.imgContent=t}console.error("was not able to get the title of the raum_contentmittitel")},template:'\n \x3c!-- div that contains the content --\x3e\n\x3c!-- TODO: test with more img content from cms--\x3e\n
    \n
    \n

    Content was not found

    \n '};const Ge={relative:[{priority:1,regex:new RegExp(/^\.\.\/cms\/content\.php\?content_id=([0-9]+)/),replacement:FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/CisVue/Cms/content",group_replacement_strategy:"PATH_SEGMENTS"},{priority:2,regex:new RegExp(/^\.\.\/cms\/news\.php/),replacement:FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/CisVue/Cms/news"},{priority:3,regex:new RegExp(/^\.\.\/index\.ci\.php/),replacement:FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router},{priority:10,regex:new RegExp(/^\.\.\//),replacement:FHC_JS_DATA_STORAGE_OBJECT.app_root}],absolute:[{}]},qe=Ge.relative.sort((t,e)=>t.priority-e.priority).map(t=>({regex:t.regex,replacement:t.replacement,group_replacement_strategy:t.group_replacement_strategy}));function Je(t){for(let{regex:e,replacement:n,group_replacement_strategy:a}of qe){let i=t.match(e);if(i){let s=t.replace(e,n);switch(a){case"QUERY_PARAMETERS":s=s.concat(`?${i[1]}`);for(let t of i.slice(2))s=s.concat(`&${t}`);break;case"PATH_SEGMENTS":for(let t of i.slice(1))s=s.concat(`/${t}`)}return s}}return t}Ge.absolute.sort((t,e)=>t.priority-e.priority).map(t=>({regex:t.regex,replacement:t.replacement,group_replacement_strategy:t.group_replacement_strategy}));var We={name:"GeneralComponent",props:{content:{type:String,required:!0}},methods:{sanitizeLegacyTables(t){t.querySelectorAll("table").forEach(t=>{const e=t.textContent.trim(),n=document.createElement("p");n.textContent=e,t.parentNode.replaceChild(n,t)});t.querySelectorAll("ul").forEach(t=>{Array.from(t.children).forEach(e=>{const n=document.createElement("p");n.textContent=e.textContent,t.parentNode.appendChild(n)}),t.parentNode.removeChild(t)});Array.from(t.querySelectorAll("td")).filter(t=>t.scrollWidth>100).forEach(t=>{if(t.firstChild?.nodeType===Node.TEXT_NODE&&t.firstChild.length>10){const e=document.createElement("p");e.appendChild(t.firstChild),t.appendChild(e)}});Array.from(t.querySelectorAll("th")).forEach(t=>{t.children.length>1&&(t.innerHTML=Array.from(t.childNodes).find(t=>t.textContent).textContent)});t.querySelectorAll("p").forEach(t=>{t.style.setProperty("word-wrap","break-word"),t.style.setProperty("white-space","normal"),t.style.setProperty("max-width","400px")})},prepareContent(){Array.from(document.getElementsByClassName("tablesorter")).forEach((t,e)=>{this.sanitizeLegacyTables(t),new Tabulator(t,{index:e,layout:"fitDataFill",columnDefaults:{formatter:"html",resizable:!0,minWidth:"100px"}})}),document.querySelectorAll("#cms [data-confirm]").forEach(t=>{t.addEventListener("click",e=>{e.preventDefault(),BsConfirm.popup(t.dataset.confirm).then(()=>{Axios.get(t.href).then(t=>{location=location}).catch(t=>console.error("ERROR:",t))}).catch(()=>{})})}),document.querySelectorAll("#cms [data-href]").forEach(t=>{t.href=t.dataset.href.replace(/^ROOT\//,FHC_JS_DATA_STORAGE_OBJECT.app_root)}),document.querySelectorAll("[href]").forEach(t=>{let e=Je(t.getAttribute("href"));t.href=e}),document.querySelectorAll("[style*=background-color]").forEach(t=>{"rgb(255, 255, 255)"==t.style.backgroundColor&&(t.style.backgroundColor="var(--fhc-background)"),t.querySelector("*[style*=background-color]")&&(t.style.backgroundColor="var(--fhc-tertiary)")})}},updated(){this.prepareContent()},mounted(){this.prepareContent()},template:'\n \x3c!-- div that contains the content --\x3e\n
    \n \t
    \n
    \n

    Content was not found

    \n '},Ze={name:"ContentComponent",props:{content_id:{type:[Number,String],required:!0},version:{type:[String,Number],default:null},sichtbar:{type:[String,Number],default:null}},components:{raum_contentmittitel:He,news_content:{name:"NewsContentType",props:{content:{type:String,required:!0}},methods:{sanitizeLegacyTables(t){t.querySelectorAll("table").forEach(t=>{const e=t.textContent.trim(),n=document.createElement("p");n.textContent=e,t.parentNode.replaceChild(n,t)});t.querySelectorAll("ul").forEach(t=>{Array.from(t.children).forEach(e=>{const n=document.createElement("p");n.textContent=e.textContent,t.parentNode.appendChild(n)}),t.parentNode.removeChild(t)});Array.from(t.querySelectorAll("td")).filter(t=>t.scrollWidth>100).forEach(t=>{if(t.firstChild?.nodeType===Node.TEXT_NODE&&t.firstChild.length>10){const e=document.createElement("p");e.appendChild(t.firstChild),t.appendChild(e)}});Array.from(t.querySelectorAll("th")).forEach(t=>{t.children.length>1&&(t.innerHTML=Array.from(t.childNodes).find(t=>t.textContent).textContent)});t.querySelectorAll("p").forEach(t=>{t.style.setProperty("word-wrap","break-word"),t.style.setProperty("white-space","normal"),t.style.setProperty("max-width","400px")})}},mounted(){Array.from(document.getElementsByClassName("tablesorter")).forEach((t,e)=>{this.sanitizeLegacyTables(t),new Tabulator(t,{index:e,layout:"fitDataFill",columnDefaults:{formatter:"html",resizable:!0,minWidth:"100px"}})}),document.querySelectorAll("#cms [data-confirm]").forEach(t=>{t.addEventListener("click",e=>{e.preventDefault(),BsConfirm.popup(t.dataset.confirm).then(()=>{Axios.get(t.href).then(t=>{location=location}).catch(t=>console.error("ERROR:",t))}).catch(()=>{})})}),document.querySelectorAll("#cms [data-href]").forEach(t=>{t.href=t.dataset.href.replace(/^ROOT\//,FHC_JS_DATA_STORAGE_OBJECT.app_root)}),document.querySelectorAll("[href]").forEach(t=>{let e=Je(t.getAttribute("href"));t.href=e}),document.querySelectorAll("[style*=background-color]").forEach(t=>{"rgb(255, 255, 255)"==t.style.backgroundColor&&(t.style.backgroundColor="var(--fhc-background)"),t.querySelector("*[style*=background-color]")&&(t.style.backgroundColor="var(--fhc-tertiary)")}),Vue.nextTick(()=>{document.querySelectorAll(".card-header").forEach(t=>{t.classList.add("fhc-primary")}),document.querySelectorAll(".row").forEach(t=>{t.classList.add("w-100"),t.classList.add("align-items-center")}),document.querySelectorAll(".row h2").forEach(t=>{t.classList.add("mb-0")})})},template:'\n\t \x3c!-- div that contains the content --\x3e\n\t
    \n\t\t
    \n\t
    \n\t

    Content was not found

    \n\t '},general:We,iframe_content:{name:"iframe_content",props:{content:{type:String,required:!0}},computed:{srcUrl(){const t=(new DOMParser).parseFromString(`
    ${this.content}
    `,"text/html").querySelector("iframe[src]");if(!t)return"";return Je(t.getAttribute("src")||"")}},template:'\n\t\t
    \n\t\t\t\n\t\t
    Keine URL gefunden.
    \n\t\t
    \n\t'}},data(){return{content_type:null,content:null,content_id_internal:this.content_id}},methods:{fetchContent(){this.$api.call(Ue.content(this.content_id_internal,this.version,this.sprache,this.sichtbar)).then(t=>{this.$nextTick(function(){this.content=t.data.content,this.content_type=t.data.type})})}},watch:{sprache:function(t){this.fetchContent()},"$route.params.content_id"(t){this.content_id_internal=t,this.fetchContent()}},computed:{sprache(){return this.$p.user_language.value},computeContentType:function(){switch(this.content_type){case"raum_contentmittitel":return"raum_contentmittitel";case"news":return"news_content";case"iframe":return"iframe_content";default:return"general"}}},created(){this.fetchContent()},template:'\n \x3c!-- div that contains the content --\x3e\n\t
    \n \t\n\t
    \n

    No content is available to display

    \n '};const Ke="Week";var Ye={name:"RoomInformation",components:{FhcCalendar:It},props:{viewData:Object,propsViewData:Object},computed:{currentDay(){return this.propsViewData?.focus_date||luxon.DateTime.now().setZone(this.viewData.timezone).toISODate()},currentMode(){return this.propsViewData?.mode||Ke}},methods:{handleChangeDate(t,e){return this.handleChangeMode(e,t)},handleChangeMode(t,e){const n=t[0].toUpperCase()+t.slice(1),a=e.toISODate();this.$router.push({name:"RoomInformation",params:{mode:n,focus_date:a,ort_kurzbz:this.propsViewData.ort_kurzbz}})},getPromiseFunc(t,e){return[this.$api.call(St.getRoomInfo(this.propsViewData.ort_kurzbz,t.toISODate(),e.toISODate())),this.$api.call(St.getOrtReservierungen(this.propsViewData.ort_kurzbz,t.toISODate(),e.toISODate()))]}},template:'\n\t
    \n\t\t

    {{ $p.t(\'rauminfo/rauminfo\') }} {{ propsViewData.ort_kurzbz }}

    \n\t\t
    \n\t\t\n\t
    '},Qe={getConfig:()=>({method:"get",url:"/api/frontend/v1/Abgabe/getConfig"}),getConfigStudent:()=>({method:"get",url:"/api/frontend/v1/Abgabe/getConfigStudent"}),getStudentProjektarbeiten:t=>({method:"get",url:"/api/frontend/v1/Abgabe/getStudentProjektarbeiten",params:{uid:t}}),getStudentProjektabgaben:t=>({method:"get",url:"/api/frontend/v1/Abgabe/getStudentProjektabgaben",params:{projektarbeit_id:t.projektarbeit_id,student_uid:t.student_uid}}),postStudentProjektarbeitEndupload:t=>({method:"post",url:"/api/frontend/v1/Abgabe/postStudentProjektarbeitEndupload",params:t,config:{Headers:{"Content-Type":"multipart/form-data"}}}),postStudentProjektarbeitZwischenabgabe:t=>({method:"post",url:"/api/frontend/v1/Abgabe/postStudentProjektarbeitZwischenabgabe",params:t,config:{Headers:{"Content-Type":"multipart/form-data"}}}),getMitarbeiterProjektarbeiten:t=>({method:"get",url:"/api/frontend/v1/Abgabe/getMitarbeiterProjektarbeiten",params:{showall:t}}),postProjektarbeitAbgabe(t){let e=t.datum;if(t.datum instanceof Date){e=`${t.datum.getFullYear()}-${String(t.datum.getMonth()+1).padStart(2,"0")}-${String(t.datum.getDate()).padStart(2,"0")}`}return{method:"post",url:"/api/frontend/v1/Abgabe/postProjektarbeitAbgabe",params:{paabgabe_id:t.paabgabe_id,paabgabetyp_kurzbz:t.bezeichnung.paabgabetyp_kurzbz,datum:e,note:t.note_pk,upload_allowed:!!t.upload_allowed,beurteilungsnotiz:t.beurteilungsnotiz??"",fixtermin:t.fixtermin,insertvon:t.insertvon,kurzbz:t.kurzbz,projektarbeit_id:t.projektarbeit_id,betreuer_person_id:t.betreuer_person_id}}},deleteProjektarbeitAbgabe:t=>({method:"post",url:"/api/frontend/v1/Abgabe/deleteProjektarbeitAbgabe",params:{paabgabe_id:t}}),postSerientermin:(t,e,n,a,i,s,r)=>({method:"post",url:"/api/frontend/v1/Abgabe/postSerientermin",params:{datum:t,paabgabetyp_kurzbz:e,bezeichnung:n,kurzbz:a,upload_allowed:i,projektarbeit_ids:s,fixtermin:r}}),fetchDeadlines:t=>({method:"post",url:"/api/frontend/v1/Abgabe/fetchDeadlines",params:{person_id:t}}),getPaAbgabetypen:()=>({method:"get",url:"/api/frontend/v1/Abgabe/getPaAbgabetypen"}),getNoten:()=>({method:"get",url:"/api/frontend/v1/Abgabe/getNoten"}),getProjektarbeitenForStudiengang:(t,e=0)=>({method:"get",url:"/api/frontend/v1/Abgabe/getProjektarbeitenForStudiengang",params:{studiengang_kz:t,benotet:e}}),getStudiengaenge:()=>({method:"get",url:"/api/frontend/v1/Abgabe/getStudiengaenge"}),postStudentProjektarbeitZusatzdaten:t=>({method:"post",url:"/api/frontend/v1/Abgabe/postStudentProjektarbeitZusatzdaten",params:t,config:{Headers:{"Content-Type":"multipart/form-data"}}}),getSignaturStatusForProjektarbeitAbgaben:(t,e)=>({method:"post",url:"/api/frontend/v1/Abgabe/getSignaturStatusForProjektarbeitAbgaben",params:{paabgabe_ids:t,student_uid:e}})};const Xe={name:"FhcOverlay",props:{active:{type:Boolean,default:!1}},template:'\t\n\t\t
    \n\t\t\t\n\t\t
    \n\t'},tn={name:"AbgabeStudentDetail",components:{Upload:ke,BsModal:s,InputNumber:primevue.inputnumber,Checkbox:primevue.checkbox,Dropdown:primevue.dropdown,Textarea:primevue.textarea,Accordion:primevue.accordion,AccordionTab:primevue.accordiontab,Message:primevue.message,Inplace:primevue.inplace,VueDatePicker:i,FhcOverlay:Xe},inject:["notenOptions","isMobile","isViewMode","moodle_link"],props:{projektarbeit:{type:Object,default:null},viewMode:{type:Boolean,default:!1}},data:()=>({loading:!1,eidAkzeptiert:!1,enduploadTermin:null,allActiveLanguages:FHC_JS_DATA_STORAGE_OBJECT.server_languages,form:Vue.reactive({sprache:"",abstract:"",abstract_en:"",schlagwoerter:"",schlagwoerter_en:"",kontrollschlagwoerter:"",seitenanzahl:1})}),methods:{getNoteBezeichnung(t){const e=this.notenOptions.find(e=>e.note==t.note);return e?.bezeichnung?e?.positiv?this.$capitalize(this.$p.t("abgabetool/c4positivBenotet"))+" ✅":this.$capitalize(this.$p.t("abgabetool/c4negativBenotet"))+" ❌":!0!==e?.benotbar||t.note?"":this.$capitalize(this.$p.t("abgabetool/c4notYetGraded"))},async validate(t,e=!1){return t.file.length?!e||!1!==await this.$fhcAlert.confirm({message:this.$p.t("abgabetool/confirmEnduploadSpeichern"),acceptLabel:this.$capitalize(this.$p.t("abgabetool/c4AcceptAndProceed")),acceptClass:"p-button-primary",rejectLabel:this.$capitalize(this.$p.t("abgabetool/c4Cancel")),rejectClass:"p-button-secondary"}):(this.$fhcAlert.alertWarning(this.$capitalize(this.$p.t("global/warningChooseFile"))),!1)},async triggerEndupload(){if(!await this.validate(this.enduploadTermin,!0))return!1;const t=new FormData;t.append("paabgabetyp_kurzbz",this.enduploadTermin.paabgabetyp_kurzbz),t.append("projektarbeit_id",this.enduploadTermin.projektarbeit_id),t.append("paabgabe_id",this.enduploadTermin.paabgabe_id),t.append("student_uid",this.projektarbeit.student_uid),t.append("bperson_id",this.projektarbeit.bperson_id),t.append("sprache",this.form.sprache.sprache),t.append("abstract",this.form.abstract),t.append("abstract_en",this.form.abstract_en),t.append("schlagwoerter",this.form.schlagwoerter),t.append("schlagwoerter_en",this.form.schlagwoerter_en),t.append("seitenanzahl",this.form.seitenanzahl);for(let e=0;e{this.handleUploadRes(t,this.enduploadTermin)}).finally(()=>{this.loading=!1}),this.$refs.modalContainerEnduploadZusatzdaten.hide()},downloadAbgabe(t){const e=`/api/frontend/v1/Abgabe/getStudentProjektarbeitAbgabeFile?paabgabe_id=${t.paabgabe_id}&student_uid=${this.projektarbeit.student_uid}&projektarbeit_id=${this.projektarbeit.projektarbeit_id}`;window.open(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+e)},formatDate(t){const e=new Date(t),n=t=>String(t).padStart(2,"0"),a=n(e.getMonth()+1);return`${n(e.getDate())}.${a}.${e.getFullYear()}`},async upload(t){if(!await this.validate(t))return!1;if("end"===t.bezeichnung?.paabgabetyp_kurzbz)this.enduploadTermin=t,this.$refs.modalContainerEnduploadZusatzdaten.show();else{const e=new FormData;e.append("paabgabetyp_kurzbz",t.paabgabetyp_kurzbz),e.append("projektarbeit_id",this.projektarbeit.projektarbeit_id),e.append("paabgabe_id",t.paabgabe_id),e.append("student_uid",this.projektarbeit.student_uid),e.append("bperson_id",this.projektarbeit.bperson_id);for(let n=0;n{this.handleUploadRes(e,t)}).finally(()=>{this.loading=!1})}},handleUploadRes(t,e){"success"==t.meta.status?(this.$fhcAlert.alertSuccess(this.$capitalize(this.$p.t("abgabetool/c4fileUploadSuccessv3"))),e.abgabedatum=(new Date).toISOString().split("T")[0],void 0!==t?.data?.signatur&&(e.signatur=t.data.signatur)):this.$fhcAlert.alertError(this.$capitalize(this.$p.t("abgabetool/c4fileUploadErrorv3"))),t.meta.signaturInfo&&this.$fhcAlert.alertInfo(t.meta.signaturInfo)},getOptionLabel:t=>t.sprache,getTerminNoteBezeichnung(t){const e=this.notenOptions.find(e=>e.note==t.note);return e?e.bezeichnung:""}},watch:{projektarbeit(t){this.form.sprache=t.sprache?this.allActiveLanguages.find(e=>e.sprache==t.sprache):this.allActiveLanguages.find(t=>"German"==t.sprache),this.form.abstract=t.abstract??"",this.form.abstract_en=t.abstract_en??"",this.form.schlagwoerter=t.schlagwoerter??"",this.form.schlagwoerter_en=t.schlagwoerter_en??"",this.form.kontrollschlagwoerter=t.kontrollschlagwoerter??"",this.form.seitenanzahl=t.seitenanzahl??1}},computed:{getMoodleLink(){return this.moodle_link+this.projektarbeit.studiengang_kz},getMessagePtStyle:()=>({root:{style:{margin:"0px"}},wrapper:{style:{padding:"6px"}}}),getEid(){return this.$capitalize(this.$p.t("abgabetool/c4eidesstattlicheErklaerung"))},allowedToSaveZusatzdaten(){return this.form.schlagwoerter.length>0&&this.form.schlagwoerter_en.length>0&&this.form.abstract.length>0&&this.form.abstract_en.length>0&&this.form.seitenanzahl>0},getAllowedToSendEndupload(){return this.eidAkzeptiert&&this.allowedToSaveZusatzdaten},qualityGateTerminAvailable(){let t=!1;return this.projektarbeit?.abgabetermine.forEach(e=>{"qualgate1"!=e.paabgabetyp_kurzbz&&"qualgate2"!=e.paabgabetyp_kurzbz||(t=!0)}),t},getTooltipVerspaetet(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipVerspaetet")),class:"custom-tooltip"}},getTooltipVerpasst(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipVerpasst")),class:"custom-tooltip"}},getTooltipAbzugeben(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipAbzugeben")),class:"custom-tooltip"}},getTooltipStandard(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipStandardv2")),class:"custom-tooltip"}},getTooltipAbgegeben(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipAbgegeben")),class:"custom-tooltip"}},getTooltipFixtermin(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipFixtermin")),class:"custom-tooltip"}},getTooltipAbgabeDetected(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipAbgabeDetected")),class:"custom-tooltip"}},getTooltipNotAllowedToUpload(){return this.isViewMode?{value:this.$capitalize(this.$p.t("abgabetool/c4studentAbgabeNotAllowedInViewMode")),class:"custom-tooltip"}:{value:this.$capitalize(this.$p.t("abgabetool/c4studentAbgabeNotAllowedRegular")),class:"custom-tooltip"}},getTooltipBeurteilungerforderlich(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipBeurteilungerforderlich")),class:"custom-tooltip"}},getTooltipBestanden(){return{value:this.$p.t("abgabetool/c4tooltipBestanden"),class:"custom-tooltip"}},getTooltipNichtBestanden(){return{value:this.$p.t("abgabetool/c4tooltipNichtBestanden"),class:"custom-tooltip"}}},created(){},mounted(){},template:'\n\t\t\n\n\t\t
    \n\t\t\n\t\t\t
    {{$capitalize( $p.t(\'abgabetool/c4abgabeStudentenbereich\') )}}
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t

    {{$capitalize( $p.t(\'person/student\') ) }}: {{projektarbeit?.student}}

    \n\t\t\t\t\t

    {{$capitalize( $p.t(\'abgabetool/c4titel\') ) }}: {{projektarbeit?.titel}}

    \n\t\t\t\t\t

    {{$capitalize( $p.t(\'abgabetool/c4betreuer\') ) }}: {{projektarbeit ? $p.t(\'abgabetool/c4betrart\' + projektarbeit.betreuerart_kurzbz) + \' \' + projektarbeit.betreuer : \'\'}}

    \n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t

    {{ $p.t(\'abgabetool/c4checkoutStgMoodleInfos\') }} \n\t\t\t\t\t\tMoodle\n\t\t\t\t\t

    \n\t\t\t\t
    \n\t\t\t
    \n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t
    \n\t\t\t\t
    {{ $capitalize( $p.t(\'abgabetool/c4keineAbgabetermineGefunden\') )}}
    \n\t\t\t
    \n\t\t\t\n\t\t
    \n\t \t\n\t \t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t \t\n '},en=new Date,nn={name:"AbgabetoolStudent",components:{Accordion:primevue.accordion,AccordionTab:primevue.accordiontab,BsModal:s,AbgabeDetail:tn,FhcOverlay:Xe},provide(){return{notenOptions:Vue.computed(()=>this.notenOptions),isViewMode:Vue.computed(()=>this.isViewMode),moodle_link:Vue.computed(()=>this.moodle_link)}},props:{student_uid_prop:{default:null},viewData:{type:Object,required:!0,default:()=>({uid:""}),validator:t=>t&&t.uid}},data:()=>({activeTabIndex:[0],abgabeTypeOptions:null,phrasenPromise:null,phrasenResolved:!1,loading:!1,notenOptions:null,detail:null,projektarbeiten:null,selectedProjektarbeit:null,moodle_link:null}),methods:{dateDiffInDays(t){let e=t;if(t instanceof Date&&!isNaN(e.getTime())){const n=t.getFullYear(),a=t.getMonth()+1,i=t.getDate(),s=t=>String(t).padStart(2,"0");e=`${n}-${s(a)}-${s(i)}`}const n=luxon.DateTime.now().startOf("day");return luxon.DateTime.fromISO(e).startOf("day").diff(n,"days").values.days},getDateStyleClass(t){const e=new Date(t.datum),n=new Date(t.abgabedatum);t.diffindays=this.dateDiffInDays(t.datum);const a=t.abgabedatum&&n>e;if(t.note){if(Number.isInteger(t.note)){if(this.notenOptions.find(e=>e.note==t.note).positiv)return"bestanden"}return t.note.positiv?"bestanden":"nichtbestanden"}return t.bezeichnung?.benotbar&&e{const a=this.notenOptions?.find(e=>e.note==t.note);a&&a.positiv&&("qualgate1"==t.paabgabetyp_kurzbz?e=!0:"qualgate2"==t.paabgabetyp_kurzbz&&(n=!0))}),e&&n},checkQualityGatesOptional(t){const e=t.find(t=>"qualgate1"==t.paabgabetyp_kurzbz),n=t.find(t=>"qualgate2"==t.paabgabetyp_kurzbz);let a=!0;e&&(a=!1,t.forEach(t=>{const e=this.notenOptions?.find(e=>e.note==t.note);e&&e.positiv&&"qualgate1"==t.paabgabetyp_kurzbz&&(a=!0)}));let i=!0;return n&&(i=!1,t.forEach(t=>{const e=this.notenOptions?.find(e=>e.note==t.note);e&&e.positiv&&"qualgate2"==t.paabgabetyp_kurzbz&&(i=!0)})),a&&i},isPastDate:t=>new Date(t){const n=this.projektarbeiten?.find(e=>e.projektarbeit_id==t.projektarbeit_id);n.abgabetermine=e.data[0].retval;const a=null!==n.note;n.abgabetermine.forEach(t=>{t.file=[],t.allowedToUpload=!1,"end"==t.paabgabetyp_kurzbz?t.allowedToUpload=!this.isPastDate(t.datum)&&this.checkQualityGatesOptional(n.abgabetermine):t.fixtermin?t.allowedToUpload=!this.isPastDate(t.datum):t.allowedToUpload=t.upload_allowed,a&&(t.allowedToUpload=!1),t.bezeichnung=this.abgabeTypeOptions.find(e=>e.paabgabetyp_kurzbz===t.paabgabetyp_kurzbz),t.dateStyle=this.getDateStyleClass(t)}),n.betreuer=this.buildBetreuer(n),n.student_uid=this.student_uid,this.selectedProjektarbeit=n,this.$refs.modalContainerAbgabeDetail.show()}).finally(()=>{this.loading=!1})},centeredTextFormatter:t=>'

    '+t.getValue()+"

    ",detailFormatter(t){const e=t.getValue();return"detailTermine"===e.mode?'
    ':"beurteilungDownload"===e.mode?'
    ':void 0},mailFormatter:t=>'
    ',beurteilungFormatter:t=>t.getValue()?'
    ':"-",buildMailToLink:t=>"mailto:"+t.email,buildBetreuer:t=>(t.btitelpre?t.btitelpre+" ":"")+t.bvorname+" "+t.bnachname+(t.btitelpost?" "+t.btitelpost:""),async setupData(t){const e=t[0]??null;e&&(this.projektarbeiten=e.map(t=>({...t,details:{student_uid:this.student_uid,projektarbeit_id:t.projektarbeit_id,betreuer_person_id:t.bperson_id,betreuerart_kurzbz:t.betreuerart_kurzbz,mode:"detailTermine"},beurteilung1:t.downloadLink1??null,beurteilung2:t.downloadLink2??null,sem:t.studiensemester_kurzbz,stg:t.kurzbzlang,mail:this.buildMailToLink(t),betreuer:this.buildBetreuer(t),typ:t.projekttypbezeichnung,titel:t.titel})))},loadProjektarbeiten(){this.$api.call(Qe.getStudentProjektarbeiten(this.student_uid)).then(t=>{t?.data&&this.setupData(t.data)})},loadAbgaben(t){return new Promise(e=>{this.$api.call(Qe.getStudentProjektabgaben(t)).then(t=>{e(t)})})},async setupMounted(){this.loadProjektarbeiten()},getAccTabHeaderForProjektarbeit(t){let e="";return e+=t.titel??this.$p.t("abgabetool/keinTitel"),e},getMailLink:t=>t.email?"mailto:"+t.email:"",getNoteBezeichnung(t){if(t.note&&this.notenOptions){const e=this.notenOptions.find(e=>e.note==t.note);return e?.bezeichnung}return""},handleDownloadBeurteilung1(t){window.open(t.beurteilung1)},handleDownloadBeurteilung2(t){window.open(t.beurteilung2)}},watch:{},computed:{isViewMode(){return this.student_uid!==this.viewData.uid},student_uid(){return this.student_uid_prop||this.viewData?.uid||null}},async created(){this.phrasenPromise=this.$p.loadCategory(["abgabetool","global"]),this.phrasenPromise.then(()=>{this.phrasenResolved=!0}),this.loading=!0,await this.$api.call(Qe.getNoten()).then(t=>{"success"==t.meta.status&&(this.notenOptions=t.data[0],this.allowedNotenOptions=this.notenOptions.filter(e=>t.data[1].includes(e.note)))}).finally(()=>{this.loading=!1}),this.$api.call(Qe.getPaAbgabetypen()).then(t=>{this.abgabeTypeOptions=t.data}).catch(t=>{this.loading=!1}),this.$api.call(Qe.getConfigStudent()).then(t=>{this.moodle_link=t.data?.moodle_link}).catch(t=>{this.loading=!1})},mounted(){this.setupMounted()},template:'\n\n '},an=new Date,sn={name:"AbgabeMitarbeiterDetail",components:{BsModal:s,InputNumber:primevue.inputnumber,Checkbox:primevue.checkbox,Dropdown:primevue.dropdown,Textarea:primevue.textarea,SpeedDial:primevue.speeddial,Accordion:primevue.accordion,AccordionTab:primevue.accordiontab,Message:primevue.message,VueDatePicker:i},inject:["abgabeTypeOptions","abgabetypenBetreuer","allowedNotenOptions","notenOptionsNonFinal","turnitin_link","old_abgabe_beurteilung_link"],props:{projektarbeit:{type:Object,default:null},isFullscreen:{type:Boolean,default:!1},assistenzMode:{type:Boolean,default:!1}},data(){return{showAutomagicModalPhrase:!1,eidAkzeptiert:!1,enduploadTermin:null,allActiveLanguages:FHC_JS_DATA_STORAGE_OBJECT.server_languages,speedDialItems:[{label:Vue.computed(()=>this.$p.t("abgabetool/c4newAbgabetermin")),icon:"fa fa-plus",command:this.openCreateNewAbgabeModal,disabled:Vue.computed(()=>!this.getAllowedToCreateNewTermin)},{label:Vue.computed(()=>this.$p.t("abgabetool/c4benoten")),icon:"fa fa-user-check",command:this.openBenotung,disabled:Vue.computed(()=>1==this.assistenzMode)},{label:Vue.computed(()=>this.$p.t("abgabetool/c4plagiatcheck_link")),icon:"fa fa-clipboard-check",command:this.openPlagiatcheck},{label:Vue.computed(()=>this.$p.t("abgabetool/c4student_perspective")),icon:"fa fa-eye",command:this.openStudentPage}],newTermin:null,form:Vue.reactive({sprache:"",abstract:"",abstract_en:"",schlagwoerter:"",schlagwoerter_en:"",kontrollschlagwoerter:"",seitenanzahl:1})}},methods:{getNoteBezeichnung(t){return t.note?.bezeichnung?t.note?.positiv?this.$capitalize(this.$p.t("abgabetool/c4positivBenotet"))+" ✅":this.$capitalize(this.$p.t("abgabetool/c4negativBenotet"))+" ❌":!0!==t.bezeichnung?.benotbar||t.note?"":this.$capitalize(this.$p.t("abgabetool/c4notYetGraded"))},getPlaceholderTermin(t){return t?.bezeichnung?this.$p.t("abgabetool/c4paatyp"+t.paabgabetyp_kurzbz):this.$p.t("abgabetool/abgabetypPlaceholder")},saveTermin(t){return t.paabgabe_id,t.note_pk=t.note?.note??null,t.betreuer_person_id=this.projektarbeit.betreuer_person_id,t.fixtermin=!t.invertedFixtermin,this.$api.call(Qe.postProjektarbeitAbgabe(t)).then(e=>{if("success"==e?.meta?.status){this.$fhcAlert.alertSuccess(this.$p.t("ui/gespeichert"));const n=this.allowedNotenOptions.find(t=>t.note==e.data[0].note),a={allowedToSave:!0,allowedToDelete:!0,...e.data[0]};a.note&&(a.note=n),a.invertedFixtermin=!a.fixtermin;const i=e.data[1],s=this.abgabeTypeOptions.find(t=>t.paabgabetyp_kurzbz==a.paabgabetyp_kurzbz);if(a.bezeichnung={bezeichnung:t.bezeichnung?.bezeichnung,paabgabetyp_kurzbz:t.bezeichnung?.paabgabetyp_kurzbz,benotbar:s.benotbar},i){const t=this.allowedNotenOptions.find(t=>t.note==i.note);i.note=t}else this.projektarbeit.abgabetermine.push(a);this.projektarbeit.abgabetermine.sort((t,e)=>new Date(t.datum)-new Date(e.datum)),this.projektarbeit.abgabetermine.findIndex(e=>t.paabgabe_id==e.paabgabe_id);const r=!i&&!a.note?.positiv&&null!==a.note,l=i&&!a.note?.positiv&&null!==a.note&&(i.note?.positiv||void 0===i.note);r||l?(this.newTermin={paabgabe_id:-1,projektarbeit_id:this.projektarbeit.projektarbeit_id,fixtermin:!1,invertedFixtermin:!0,kurzbz:"",datum:(new Date).toISOString().split("T")[0],note:this.allowedNotenOptions.find(t=>9==t.note),beurteilungsnotiz:"",upload_allowed:!1,paabgabetyp_kurzbz:"",bezeichnung:this.abgabeTypeOptions.find(t=>t.paabgabetyp_kurzbz===a.paabgabetyp_kurzbz),abgabedatum:null,insertvon:this.viewData?.uid??""},this.showAutomagicModalPhrase=!0,this.$refs.modalContainerCreateNewAbgabe.show()):this.showAutomagicModalPhrase=!1}else"error"==e?.meta?.status&&this.$fhcAlert.alertError()})},openZusatzdatenModal(){this.$refs.modalContainerZusatzdaten.show()},async saveZusatzdaten(){if(!await this.validateZusatzdaten())return!1;const t=this.projektarbeit,e=new FormData;e.append("projektarbeit_id",this.projektarbeit.projektarbeit_id),e.append("sprache",this.form.sprache.sprache),e.append("abstract",this.form.abstract),e.append("abstract_en",this.form.abstract_en),e.append("schlagwoerter",this.form.schlagwoerter),e.append("schlagwoerter_en",this.form.schlagwoerter_en),e.append("seitenanzahl",this.form.seitenanzahl),this.loading=!0,this.$api.call(Qe.postStudentProjektarbeitZusatzdaten(e)).then(e=>{if("success"==e.meta.status){if(this.$fhcAlert.alertSuccess(this.$p.t("ui/gespeichert")),!data?.retval?.[0])return;const e=data.retval[0];t.seitenanzahl=e.seitenanzahl??1,t.kontrollschlagwoerter=e.kontrollschlagwoerter??"",t.schlagwoerter=e.schlagwoerter??"",t.sprache=e.sprache??"",t.schlagwoerter_en=e.schlagwoerter_en??"",t.abstract=e.abstract??"",t.abstract_en=e.abstract_en??""}}).finally(()=>{this.loading=!1}),this.$refs.modalContainerZusatzdaten.hide()},async validateZusatzdaten(){return!1!==await this.$fhcAlert.confirm({message:this.$p.t("abgabetool/confirmZusatzdatenSpeichern"),acceptLabel:this.$capitalize(this.$p.t("abgabetool/c4AcceptAndProceed")),acceptClass:"p-button-primary",rejectLabel:this.$capitalize(this.$p.t("abgabetool/c4Cancel")),rejectClass:"p-button-secondary"})},async handleDeleteTermin(t){if(!1===await this.$fhcAlert.confirm({message:this.$p.t("abgabetool/c4confirm_delete"),acceptLabel:"Löschen",acceptClass:"p-button-danger",rejectLabel:"Zurück",rejectClass:"p-button-secondary"}))return!1;this.deleteTermin(t)},deleteTermin(t){this.$api.call(Qe.deleteProjektarbeitAbgabe(t.paabgabe_id)).then(e=>{if("success"==e?.meta?.status){this.$fhcAlert.alertSuccess(this.$p.t("ui/genericDeleted",[this.$p.t("abgabetool/abgabe")]));const e=this.projektarbeit.abgabetermine.findIndex(e=>e.paabgabe_id===t.paabgabe_id);this.projektarbeit.abgabetermine.splice(e,1)}else"error"==e?.meta?.status&&this.$fhcAlert.alertError()})},validate:function(t){return!!t.file.length||(this.$fhcAlert.alertWarning(this.$p.t("global/warningChooseFile")),!1)},downloadAbgabe(t){const e=`/api/frontend/v1/Abgabe/getStudentProjektarbeitAbgabeFile?paabgabe_id=${t.paabgabe_id}&student_uid=${this.projektarbeit.student_uid}&projektarbeit_id=${this.projektarbeit.projektarbeit_id}`;window.open(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+e)},convertDateToIsoString(t){if(param instanceof Date&&!isNaN(param.getTime())){const t=param.getFullYear(),e=param.getMonth()+1,n=param.getDate(),a=t=>String(t).padStart(2,"0");return`${t}-${a(e)}-${a(n)}`}return param},dateDiffInDays(t){let e=t;if(t instanceof Date&&!isNaN(e.getTime())){const n=t.getFullYear(),a=t.getMonth()+1,i=t.getDate(),s=t=>String(t).padStart(2,"0");e=`${n}-${s(a)}-${s(i)}`}const n=luxon.DateTime.now().startOf("day");return luxon.DateTime.fromISO(e).startOf("day").diff(n,"days").values.days},getDateStyleClass(t){const e=new Date(t.datum),n=new Date(t.abgabedatum);t.diffindays=this.dateDiffInDays(t.datum);const a=t.abgabedatum&&n>e;return t.note?t.note.positiv?"bestanden":"nichtbestanden":t.bezeichnung?.benotbar&&et.sprache,getOptionLabelAbgabetyp(t){return this.$p.t("abgabetool/c4paatyp"+t.paabgabetyp_kurzbz)},getOptionDisabled:t=>!t.aktiv,getNotenOptionLabel:t=>t.bezeichnung,openStudentPage(){const t=FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/Cis/Abgabetool/Student/"+this.projektarbeit?.student_uid;window.open(t,"_blank")},openPlagiatcheck(){const t=this.turnitin_link;window.open(t,"_blank")},async openBenotung(){if(this.getSemesterBenotbar&&this.projektarbeit?.abgabetermine.find(t=>"end"==t.paabgabetyp_kurzbz&&null!==t.abgabedatum)&&this.projektarbeit?.beurteilungLinkNew){const t=this.projektarbeit?.beurteilungLinkNew;window.open(t,"_blank")}else if(this.projektarbeit?.abgabetermine.find(t=>"end"==t.paabgabetyp_kurzbz&&null!==t.abgabedatum)&&this.projektarbeit?.beurteilungLinkOld){if(!1===await this.$fhcAlert.confirm({message:this.$p.t("abgabetool/c4aeltereParbeitBenotenv2"),acceptLabel:this.$capitalize(this.$p.t("abgabetool/c4AcceptAndProceed")),acceptClass:"btn btn-danger",rejectLabel:this.$capitalize(this.$p.t("abgabetool/c4Cancel")),rejectClass:"btn btn-outline-secondary"}))return!1;const t=this.projektarbeit?.beurteilungLinkOld;window.open(t,"_blank")}else if(!1===await this.$fhcAlert.confirm({message:this.$p.t("abgabetool/c4keinEnduploadErfolgt"),acceptLabel:this.$capitalize(this.$p.t("abgabetool/c4AcceptAndProceed")),acceptClass:"btn btn-danger",rejectLabel:this.$capitalize(this.$p.t("abgabetool/c4Cancel")),rejectClass:"btn btn-outline-secondary"}))return!1},formatDate(t){const e=new Date(t),n=t=>String(t).padStart(2,"0"),a=n(e.getMonth()+1);return`${n(e.getDate())}.${a}.${e.getFullYear()}`},openCreateNewAbgabeModal(){if("Zweitbegutachter"!=this.projektarbeit?.betreuerart_kurzbz){if(!this.newTermin){const t=this.abgabeTypeOptions.find(t=>"zwischen"===t.paabgabetyp_kurzbz);this.newTermin={paabgabe_id:-1,projektarbeit_id:this.projektarbeit.projektarbeit_id,fixtermin:!1,invertedFixtermin:!0,kurzbz:"",datum:(new Date).toISOString().split("T")[0],note:this.allowedNotenOptions.find(t=>9==t.note),beurteilungsnotiz:"",upload_allowed:t.upload_allowed_default,paabgabetyp_kurzbz:"",bezeichnung:t,abgabedatum:null,insertvon:this.viewData?.uid??""}}this.$refs.modalContainerCreateNewAbgabe.show()}else this.$fhcAlert.alertWarning("Terminanlage disabled")},validateTermin:t=>!0,async handleSaveNewAbgabe(t){if(!this.validateTermin(t))return this.$fhcAlert.alertWarning("invalid termin"),!1;await this.saveTermin(t),this.$refs.modalContainerCreateNewAbgabe.hide(),this.newTermin={paabgabe_id:-1,projektarbeit_id:this.projektarbeit.projektarbeit_id,fixtermin:!1,invertedFixtermin:!0,kurzbz:"",datum:(new Date).toISOString().split("T")[0],note:this.allowedNotenOptions.find(t=>9==t.note),beurteilungsnotiz:"",upload_allowed:!1,paabgabetyp_kurzbz:"",bezeichnung:this.abgabeTypeOptions.find(t=>"zwischen"===t.paabgabetyp_kurzbz),abgabedatum:null,insertvon:this.viewData?.uid??""}},handleChangeAbgabetyp(t){"qualgate1"===t.bezeichnung?.paabgabetyp_kurzbz||"qualgate2"===t.bezeichnung?.paabgabetyp_kurzbz?t.kurzbz=t.bezeichnung.bezeichnung:t.kurzbz=""}},computed:{getAllowedToCreateNewTermin(){if(this.assistenzMode)return!0;if("Zweitbegutachter"==this.projektarbeit?.betreuerart_kurzbz)return!1;if(void 0!==this.projektarbeit?.note&&null!==this.projektarbeit.note){return!!this.notenOptionsNonFinal.find(t=>t.note)}return!0},allowedToSaveZusatzdaten(){return this.form.schlagwoerter.length>0&&this.form.schlagwoerter_en.length>0&&this.form.abstract.length>0&&this.form.abstract_en.length>0&&this.form.seitenanzahl>0},getAllowedAbgabeTypeOptions(){return this.assistenzMode?this.abgabeTypeOptions:this.abgabeTypeOptions.filter(t=>this.abgabetypenBetreuer.includes(t.paabgabetyp_kurzbz))},getMessagePtStyle:()=>({root:{style:{margin:"0px"}},wrapper:{style:{padding:"6px"}}}),getEid(){return this.$p.t("abgabetool/c4eidesstattlicheErklaerung")},getEnduploadErlaubt(){return!this.eidAkzeptiert},getSemesterBenotbar(){return this.projektarbeit?.isCurrent??!1},endUploadVorhanden(){return this.projektarbeit?.abgabetermine.find(t=>"end"===t.paabgabetyp_kurzbz&&null!==t.abgabedatum)},qualityGateTerminAvailable(){let t=!1;return this.projektarbeit?.abgabetermine.forEach(e=>{"qualgate1"!=e.bezeichnung?.paabgabetyp_kurzbz&&"qualgate2"!=e?.bezeichnung?.paabgabetyp_kurzbz||(t=!0)}),t},getSpeedDialStyle:()=>"position: static !important;",getSpeedDialWrapperStyle:()=>"position: absolute; z-index: 9999; left: 0px; bottom: 0.5rem;",getTooltipVerspaetet(){return{value:this.$p.t("abgabetool/c4tooltipVerspaetet"),class:"custom-tooltip"}},getTooltipVerpasst(){return{value:this.$p.t("abgabetool/c4tooltipVerpasst"),class:"custom-tooltip"}},getTooltipAbzugeben(){return{value:this.$p.t("abgabetool/c4tooltipAbzugeben"),class:"custom-tooltip"}},getTooltipStandard(){return{value:this.$p.t("abgabetool/c4tooltipStandardv2"),class:"custom-tooltip"}},getTooltipBeurteilungerforderlich(){return{value:this.$p.t("abgabetool/c4tooltipBeurteilungerforderlich"),class:"custom-tooltip"}},getTooltipAbgegeben(){return{value:this.$p.t("abgabetool/c4tooltipAbgegeben"),class:"custom-tooltip"}},getTooltipFixtermin(){return{value:this.$p.t("abgabetool/c4tooltipFixtermin"),class:"custom-tooltip"}},getTooltipAbgabeDetected(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipAbgabeDetected")),class:"custom-tooltip"}},getTooltipNotAllowedToSave(){return{value:this.$p.t("abgabetool/c4notAllowedToEditAbgabeTermin"),class:"custom-tooltip"}},getTooltipNotAllowedToDelete(){return{value:this.$p.t("abgabetool/c4notAllowedToDeleteAbgabeTermin"),class:"custom-tooltip"}},getTooltipBestanden(){return{value:this.$p.t("abgabetool/c4tooltipBestanden"),class:"custom-tooltip"}},getTooltipNichtBestanden(){return{value:this.$p.t("abgabetool/c4tooltipNichtBestanden"),class:"custom-tooltip"}},getProjektarbeitTitel(){return this.projektarbeit?.titel?this.$capitalize(this.$p.t("abgabetool/c4titel"))+": "+this.projektarbeit.titel:""},getProjektarbeitStudent(){return this.projektarbeit?.student?this.$capitalize(this.$p.t("person/student"))+": "+this.projektarbeit.student:""}},watch:{"newTermin.bezeichnung"(t){"qualgate1"!==t?.paabgabetyp_kurzbz&&"qualgate2"!==t?.paabgabetyp_kurzbz||(this.newTermin.kurzbz=t.bezeichnung),this.newTermin.upload_allowed=t.upload_allowed_default},projektarbeit(t){const e=this.abgabeTypeOptions.find(t=>"zwischen"===t.paabgabetyp_kurzbz);this.newTermin={paabgabe_id:-1,projektarbeit_id:t.projektarbeit_id,fixtermin:!1,invertedFixtermin:!0,kurzbz:"",datum:(new Date).toISOString().split("T")[0],note:this.allowedNotenOptions.find(t=>9==t.note),beurteilungsnotiz:"",upload_allowed:e.upload_allowed_default,paabgabetyp_kurzbz:"",bezeichnung:e,abgabedatum:null,insertvon:this.viewData?.uid??""},t?.abgabetermine?.forEach(t=>t.invertedFixtermin=!t.fixtermin),this.form.sprache=t.sprache?this.allActiveLanguages.find(e=>e.sprache==t.sprache):this.allActiveLanguages.find(t=>"German"==t.sprache),this.form.abstract=t.abstract??"",this.form.abstract_en=t.abstract_en??"",this.form.schlagwoerter=t.schlagwoerter??"",this.form.schlagwoerter_en=t.schlagwoerter_en??"",this.form.kontrollschlagwoerter=t.kontrollschlagwoerter??"",this.form.seitenanzahl=t.seitenanzahl??1}},created(){},mounted(){},template:'\n\t\n\t\t\n\t\t\n\t\t\n\t\n\n\t
    \n\t\t
    {{$capitalize( $p.t(\'abgabetool/c4abgabeMitarbeiterbereich\') )}}
    \n\n\t\t
    \n\t\t\t
    \n\t\t\t\t

    {{getProjektarbeitStudent}}

    \n\t\t\t\t

    {{getProjektarbeitTitel}}

    \n\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t
    \n\t\t
    \n\t\t\t
    \n\x3c!--\t\t\t\tTODO: tooltip why this button is disabled--\x3e\n\t\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\t\t
    \n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t
    \n\t\t\t
    {{ $capitalize( $p.t(\'abgabetool/c4keineAbgabetermineGefunden\') )}}
    \n\t\t
    \n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t
    \n'},rn={name:"AbgabetoolMitarbeiter",components:{BsModal:s,CoreFilterCmpt:pe,AbgabeDetail:sn,Checkbox:primevue.checkbox,Dropdown:primevue.dropdown,Textarea:primevue.textarea,VueDatePicker:i,FhcOverlay:Xe},provide(){return{abgabeTypeOptions:Vue.computed(()=>this.abgabeTypeOptions),abgabetypenBetreuer:Vue.computed(()=>this.abgabetypenBetreuer),allowedNotenOptions:Vue.computed(()=>this.allowedNotenOptions),notenOptionsNonFinal:Vue.computed(()=>this.notenOptionsNonFinal),turnitin_link:Vue.computed(()=>this.turnitin_link),old_abgabe_beurteilung_link:Vue.computed(()=>this.old_abgabe_beurteilung_link)}},props:{viewData:{type:Object,required:!0,default:()=>({name:"",uid:""}),validator:t=>t&&t.uid}},data(){return{tableData:null,abgabetypenBetreuer:null,detailIsFullscreen:!1,phrasenPromise:null,phrasenResolved:!1,turnitin_link:null,old_abgabe_beurteilung_link:null,saving:!1,loading:!1,abgabeTypeOptions:null,notenOptions:null,allowedNotenOptions:null,notenOptionsNonFinal:null,serienTermin:Vue.reactive({datum:new Date,bezeichnung:{paabgabetyp_kurzbz:"zwischen",bezeichnung:"Zwischenabgabe"},kurzbz:"",upload_allowed:!1}),showAll:!1,tabulatorUuid:Vue.ref(0),selectedData:[],domain:"",student_uid:null,detail:null,detailOffset:0,projektarbeiten:null,selectedProjektarbeit:null,tableBuiltResolve:null,tableBuiltPromise:null,abgabeTableOptions:{minHeight:250,index:"projektarbeit_id",layout:"fitDataStretch",placeholder:Vue.computed(()=>this.$p.t("global/noDataAvailable")),selectable:!0,selectableCheck:this.selectionCheck,rowHeight:80,columns:[{formatter:function(t,e,n){if(!t.getRow().getData().selectable)return;let a=document.createElement("input");a.type="checkbox",a.addEventListener("click",n=>{n.stopPropagation(),e&&e.handleClick&&e.handleClick(n,t)}),t.getRow().getData().checkbox=a;let i=document.createElement("div");return i.style.cssText="display: flex; justify-content: center; align-items: center; height: 100%; width: 100%;",i.appendChild(a),i},titleFormatter:function(t,e,n){let a=document.createElement("input");return a.type="checkbox",a.addEventListener("click",n=>{n.stopPropagation(),e&&e.handleClick&&e.handleClick(n,t)}),a},hozAlign:"center",headerSort:!1,formatterParams:{handleClick:this.selectHandler},titleFormatterParams:{handleClick:this.selectAllHandler},width:50,cssClass:"sticky-col"},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4details"))),field:"details",formatter:this.detailFormatter,widthGrow:1,tooltip:!1,cssClass:"sticky-col"},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4personenkennzeichen"))),headerFilter:!0,field:"pkz",formatter:this.pkzTextFormatter,widthGrow:1,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4kontakt"))),field:"mail",formatter:this.mailFormatter,widthGrow:1,tooltip:!1,visible:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4vorname"))),field:"vorname",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4nachname"))),field:"nachname",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4projekttyp"))),field:"projekttyp_kurzbz",formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4stg"))),field:"stg",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4sem"))),field:"studiensemester_kurzbz",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4titel"))),field:"titel",headerFilter:!0,formatter:this.centeredTextFormatter,maxWidth:500,widthGrow:8},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4betreuerart"))),field:"betreuerart_beschreibung",formatter:this.centeredTextFormatter,widthGrow:1}],persistence:!1},abgabeTableEventHandlers:[{event:"tableBuilt",handler:async()=>{this.tableBuiltResolve()}},{event:"cellClick",handler:async(t,e)=>{"details"===e.getColumn().getField()?(this.setDetailComponent(e.getValue()),this.undoSelection(e)):"mail"===e.getColumn().getField()&&this.undoSelection(e)}},{event:"rowSelectionChanged",handler:async t=>{this.selectedData.filter(e=>!t.includes(e)).forEach(t=>{t.checkbox&&(t.checkbox.checked=!1)}),t.forEach(t=>{t.checkbox&&(t.checkbox.checked=!0)}),this.selectedData=t}}]}},methods:{selectHandler(t,e){const n=e.getRow();return n.isSelected()?n.deselect():n.select(),t.stopPropagation(),!1},selectAllHandler(t,e){const n=e.getTable().getRows().filter(t=>t.getData().selectable);return n.every(t=>t.isSelected())?n.forEach(t=>t.deselect()):n.forEach(t=>t.select()),t.stopPropagation(),!1},handleToggleFullscreenDetail(){this.detailIsFullscreen=!this.detailIsFullscreen},getOptionLabelAbgabetyp:t=>t.bezeichnung,formatDate(t){const e=new Date(t),n=t=>String(t).padStart(2,"0"),a=n(e.getMonth()+1);return`${n(e.getDate())}.${a}.${e.getFullYear()}`},undoSelection(t){const e=t.getRow();e.isSelected()&&e.deselect()},selectionCheck(t){const e=t.getData();return"Zweitbegutachter"!=e?.betreuerart_kurzbz},showDeadlines(){const t=FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/Cis/Abgabetool/Deadlines";window.open(t,"_blank")},toggleShowAll(t){this.showAll=t,this.loading=!0,this.loadProjektarbeiten(t,()=>{this.$refs.abgabeTable?.tabulator.redraw(!0),this.$refs.abgabeTable?.tabulator.setSort([]),this.loading=!1})},openAddSeriesModal(){this.$refs.modalContainerAddSeries.show()},addSeries(){this.saving=!0,this.$api.call(Qe.postSerientermin(this.serienTermin.datum.toISOString(),this.serienTermin.bezeichnung.paabgabetyp_kurzbz,this.serienTermin.bezeichnung.bezeichnung,this.serienTermin.kurzbz,this.serienTermin.upload_allowed,this.selectedData?.map(t=>t.projektarbeit_id),!1)).then(t=>{"success"===t.meta.status&&t.data?this.$fhcAlert.alertSuccess(this.$p.t("abgabetool/serienTerminGespeichert")):this.$fhcAlert.alertError(this.$p.t("abgabetool/errorSerienterminSpeichern"))}).finally(()=>{this.saving=!1}),this.$refs.modalContainerAddSeries.hide()},createInfoString(t){let e="";return t.forEach(t=>{e+=t,e+="; "}),e},isPastDate:t=>new Date(t){const n=this.projektarbeiten?.retval?.find(e=>e.projektarbeit_id==t.projektarbeit_id);n.abgabetermine=e.data[0].retval,n.isCurrent=e.data[1];let a=!1;if(void 0!==n.note&&null!==n.note){this.notenOptionsNonFinal.find(t=>t.note)&&(a=!1),a=!0}n.abgabetermine.forEach(t=>{t.note=this.allowedNotenOptions.find(e=>e.note==t.note),t.file=[],t.allowedToSave=!a,t.allowedToDelete=t.allowedToSave&&!t.abgabedatum,t.bezeichnung=this.abgabeTypeOptions.find(e=>e.paabgabetyp_kurzbz===t.paabgabetyp_kurzbz)}),n.student_uid=t.student_uid,n.student=`${n.vorname} ${n.nachname}`,this.selectedProjektarbeit=n,this.$refs.modalContainerAbgabeDetail.show()}).finally(()=>{this.loading=!1})},centeredTextFormatter(t){const e=t.getValue();if(e)return'

    '+e+"

    "},detailFormatter:t=>'
    ',mailFormatter:t=>'
    ',beurteilungFormatter:t=>t.getValue()?'
    ':"-",pkzTextFormatter:t=>'",tableResolve(t){this.tableBuiltResolve=t},buildMailToLink(t){return"mailto:"+t.uid+"@"+this.domain},buildPKZ:t=>`${t.uid} / ${t.matrikelnr}`,buildStg:t=>(t.typ+t.kurzbz)?.toUpperCase(),setupData(t){this.projektarbeiten=t[0],this.domain=t[1],this.tableData=t[0]?.retval?.map(t=>(t.selectable="Zweitbegutachter"!==t.betreuerart_kurzbz,{...t,details:{student_uid:t.uid,projektarbeit_id:t.projektarbeit_id},pkz:this.buildPKZ(t),beurteilung:t.beurteilungLink??null,sem:t.studiensemester_kurzbz,stg:this.buildStg(t),mail:this.buildMailToLink(t),typ:t.projekttyp_kurzbz,titel:t.titel})),this.$refs.abgabeTable.tabulator.setColumns(this.abgabeTableOptions.columns),this.$refs.abgabeTable.tabulator.setData(this.tableData)},loadProjektarbeiten(t=!1,e){this.$api.call(Qe.getMitarbeiterProjektarbeiten(t)).then(t=>{t?.data&&this.setupData(t.data)}).finally(()=>{e&&e()})},loadAbgaben(t){return new Promise(e=>{this.$api.call(Qe.getStudentProjektabgaben(t)).then(t=>{e(t)})})},handleUuidDefined(t){this.tabulatorUuid=t},calcMaxTableHeight(){const t=this.tabulatorUuid?"-"+this.tabulatorUuid:"",e=document.getElementById("filterTableDataset"+t);if(!e)return;const n=e.getBoundingClientRect();this.abgabeTableOptions.height=window.visualViewport.height-n.top-80,this.$refs.abgabeTable.tabulator.setHeight(this.abgabeTableOptions.height)},async setupMounted(){this.tableBuiltPromise=new Promise(this.tableResolve),await this.tableBuiltPromise,this.loadProjektarbeiten(),this.calcMaxTableHeight()}},watch:{"serienTermin.bezeichnung"(t){"qualgate1"!==t?.paabgabetyp_kurzbz&&"qualgate2"!==t?.paabgabetyp_kurzbz||(this.serienTermin.kurzbz=t.bezeichnung),this.serienTermin.upload_allowed=t.upload_allowed_default}},computed:{getAllowedAbgabeTypeOptions(){return this.abgabeTypeOptions.filter(t=>this.abgabetypenBetreuer.includes(t.paabgabetyp_kurzbz))}},created(){this.phrasenPromise=this.$p.loadCategory(["abgabetool","global"]),this.phrasenPromise.then(()=>{this.phrasenResolved=!0}),this.$api.call(Qe.getConfig()).then(t=>{this.turnitin_link=t.data?.turnitin_link,this.old_abgabe_beurteilung_link=t.data?.old_abgabe_beurteilung_link,this.abgabetypenBetreuer=t.data?.abgabetypenBetreuer}).catch(t=>{this.loading=!1}),this.$api.call(Qe.getNoten()).then(t=>{"success"==t.meta.status&&(this.notenOptions=t.data[0],this.allowedNotenOptions=this.notenOptions.filter(e=>t.data[1].includes(e.note)),this.notenOptionsNonFinal=this.notenOptions.filter(e=>t.data[2].includes(e.note)))}).catch(t=>{this.loading=!1}),this.$api.call(Qe.getPaAbgabetypen()).then(t=>{this.abgabeTypeOptions=t.data}).catch(t=>{this.loading=!1})},mounted(){this.setupMounted()},template:'\n\t\n '};var ln={name:"BootstrapOffcanvas",data:()=>({offcanvas:null}),props:{backdrop:{type:[Boolean,String],default:!0,validator:t=>["static",!0,!1].includes(t)},keyboard:{type:Boolean,default:!0},scroll:{type:Boolean,default:!1},placement:{type:String,default:"start",validator:t=>["start","end","top","bottom"].includes(t)},noCloseBtn:Boolean,headerClass:{type:[String,Array,Object],default:""},bodyClass:{type:[String,Array,Object],default:"p-4"},footerClass:{type:[String,Array,Object],default:""},dialogClass:[String,Array,Object]},emits:["hideBsOffcanvas","hiddenBsOffcanvas","hidePreventedBsOffcanvas","showBsOffcanvas","shownBsOffcanvas"],methods:{dispose(){return this.offcanvas?.dispose()},hide(){return this.offcanvas?.hide()},show(t){return this.offcanvas?.show(t)},toggle(){return this.offcanvas?.toggle()},popup(t,e,n,a){const i=this,s={};void 0!==t&&(s.default=()=>t),void 0!==n&&(s.title=()=>n),void 0!==a&&(s.footer=()=>a);let r=!1;return"undefined"!=typeof primevue&&(r=!0),new Promise((t,n)=>{const a=Vue.createApp({name:"OffcanvasTmpApp",setup:()=>()=>Vue.h(i,{class:"offcanvas-wrapper",ref:"offcanvas",...e},s),mounted(){this.$refs.offcanvas.show()},beforeUnmount(){this.$refs.offcanvas&&(!1!==this.$refs.offcanvas.result?t(this.$refs.offcanvas.result):n())},unmounted(){l.parentElement.removeChild(l)}}),l=document.createElement("div");r&&a.use(primevue.config.default,{zIndex:{overlay:9999}}),Promise.resolve().then(function(){return it}).then(t=>{a.use(t.default),a.mount(l),document.body.appendChild(l)})})}},mounted(){this.$refs.offcanvas&&(this.offcanvas=new bootstrap.Offcanvas(this.$refs.offcanvas,{backdrop:this.backdrop,keyboard:this.keyboard,scroll:this.scroll}))},template:'\n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\n\t\t\t\n\t\t
    \n\t'},on={getAllStudiensemesterAndAktOrNext:()=>({method:"get",url:"/api/frontend/v1/organisation/Studiensemester/getAllStudiensemesterAndAktOrNext"}),getAll:(t=null,e=null)=>({method:"get",url:"api/frontend/v1/organisation/studiensemester/getAll",params:{order:t,start:e}})};const dn={name:"AbgabeterminStatusLegende",template:'\t\n\t\t
    \n\t\t\t
    \n\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t(\'abgabetool/c4tooltipVerspaetet\')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t(\'abgabetool/c4tooltipVerpasst\')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t(\'abgabetool/c4tooltipAbzugeben\')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t(\'abgabetool/c4tooltipStandardv2\')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t(\'abgabetool/c4tooltipAbgegeben\')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t(\'abgabetool/c4tooltipBeurteilungerforderlich\')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t(\'abgabetool/c4tooltipBestanden\')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t(\'abgabetool/c4tooltipNichtBestanden\')) }}
    \n\t\t\t\t\t
    \t\n\t\t\t\t
    \n\n\t\t\t
    \n\t\t
    \t\n\t'};async function cn(t,e,n,a,i){let s=t.join(","),r="";const l=n&&"string"==typeof n?n.length+9:0;if(s.length>2024&&!1===await a.confirm({message:i.t("stv","zuvieleEMails")}))return;let o=!0,d=e?.ctrlKey||e?.metaKey;for(;s.length>0;){if(s.length+l>2024){let t=s.lastIndexOf(",",1900);r=s.substring(0,t),s=s.substring(t+1)}else r=s,s="";let t=d?`mailto:?bcc=${r}`:`mailto:${r}`;n&&"string"==typeof n&&(t+=`?subject=${n}`),o?(window.location.href=t,o=!1):!0===await a.confirm({message:i.t("stv","weitereEMail")})&&(window.location.href=t)}}const un=new Date,pn=luxon.DateTime.now(),hn={name:"AbgabetoolAssistenz",components:{AbgabeterminStatusLegende:dn,BsModal:s,BsOffcanvas:ln,CoreFilterCmpt:pe,AbgabeDetail:sn,Checkbox:primevue.checkbox,Dropdown:primevue.dropdown,Inplace:primevue.inplace,Textarea:primevue.textarea,Timeline:primevue.timeline,TieredMenu:primevue.tieredmenu,VueDatePicker:i,FhcOverlay:Xe},provide(){return{abgabeTypeOptions:Vue.computed(()=>this.abgabeTypeOptions),allowedNotenOptions:Vue.computed(()=>this.allowedNotenOptions),notenOptionsNonFinal:Vue.computed(()=>this.notenOptionsNonFinal),turnitin_link:Vue.computed(()=>this.turnitin_link),old_abgabe_beurteilung_link:Vue.computed(()=>this.old_abgabe_beurteilung_link),abgabetypenBetreuer:Vue.computed(()=>this.abgabeTypeOptions)}},props:{stg_kz_prop:{default:null},viewData:{type:Object,required:!0,default:()=>({name:"",uid:""}),validator:t=>t&&t.uid}},data(){return{tableData:null,studiensemesterOptions:null,allSem:null,curSem:null,notenOptionFilter:null,inplaceToggle:!1,headerFiltersRestored:!1,filtersRestored:!1,colLayoutRestored:!1,sortRestored:!1,stateRestored:!1,timelineProjekt:null,selectedStudiengangOption:null,studiengaengeOptions:null,detailIsFullscreen:!1,allConfigPromise:null,phrasenPromise:null,phrasenResolved:!1,turnitin_link:null,old_abgabe_beurteilung_link:null,ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT:null,ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER:null,saving:!1,loading:!1,abgabeTypeOptions:null,notenOptions:null,allowedNotenFilterOptions:null,allowedNotenOptions:null,notenOptionsNonFinal:null,serienTermin:Vue.reactive({datum:new Date,bezeichnung:{paabgabetyp_kurzbz:"zwischen",bezeichnung:"Zwischenabgabe"},kurzbz:"",fixtermin:!1,invertedFixtermin:!0,upload_allowed:!1}),showAll:!1,tabulatorUuid:Vue.ref(0),selectedData:[],domain:"",student_uid:null,detail:null,detailOffset:0,projektarbeiten:null,selectedProjektarbeit:null,tableBuiltResolve:null,tableBuiltPromise:null,abgabeTableOptions:{minHeight:250,index:"projektarbeit_id",layout:"fitData",placeholder:Vue.computed(()=>this.$capitalize(this.$p.t("global/noDataAvailable"))),selectable:!0,selectableCheck:this.selectionCheck,rowHeight:40,renderVerticalBuffer:2e3,columns:[{formatter:function(t,e,n){if(!t.getRow().getData().selectable)return;let a=document.createElement("input");a.type="checkbox",a.addEventListener("click",n=>{n.stopPropagation(),e&&e.handleClick&&e.handleClick(n,t)}),t.getRow().getData().checkbox=a;let i=document.createElement("div");return i.style.cssText="display: flex; justify-content: center; align-items: center; height: 100%; width: 100%;",i.appendChild(a),i},titleFormatter:function(t,e,n){let a=document.createElement("input");return a.type="checkbox",a.addEventListener("click",n=>{n.stopPropagation(),e&&e.handleClick&&e.handleClick(n,t)}),a},hozAlign:"center",headerSort:!1,formatterParams:{handleClick:this.selectHandler},titleFormatterParams:{handleClick:this.selectAllHandler},width:50,cssClass:"sticky-col"},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4details"))),field:"details",formatter:this.formAction,tooltip:!1,minWidth:150,cssClass:"sticky-col"},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4personenkennzeichen"))),headerFilter:!0,field:"pkz",formatter:this.pkzTextFormatter,widthGrow:1,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4vorname"))),field:"student_vorname",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4nachname"))),field:"student_nachname",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4studstatus"))),field:"studienstatus",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4orgform"))),field:"orgform",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4projekttyp"))),field:"projekttyp_kurzbz",formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4stg"))),field:"stg",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4note"))),field:"note_bez",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4sem"))),field:"studiensemester_kurzbz",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4titel"))),field:"titel",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4erstbetreuer"))),field:"erstbetreuer",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4zweitbetreuer"))),field:"zweitbetreuer",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4prevAbgabetermin"))),headerFilter:!0,field:"prevTermin",formatter:this.abgabterminFormatter,widthGrow:1,width:220,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4nextAbgabetermin"))),headerFilter:!0,field:"nextTermin",formatter:this.abgabterminFormatter,widthGrow:1,width:220,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4qgate1Status"))),headerFilter:!0,field:"qgate1Status",formatter:this.centeredTextFormatter,widthGrow:1,width:220,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4qgate2Status"))),headerFilter:!0,field:"qgate2Status",formatter:this.centeredTextFormatter,widthGrow:1,width:220,tooltip:!1}],persistence:!1,persistenceID:"abgabetool_2025_12"},abgabeTableEventHandlers:[{event:"rowSelectionChanged",handler:async t=>{this.selectedData.filter(e=>!t.includes(e)).forEach(t=>{t.checkbox&&(t.checkbox.checked=!1)}),t.forEach(t=>{t.checkbox&&(t.checkbox.checked=!0)}),this.selectedData=t}}]}},methods:{sammelMailStudent(t){const e=this.selectedData.map(t=>`${t.student_uid}@${this.domain}`).join(","),n=[...new Set(e)],a=this.$p.t("abgabetool/c4sammelmailStudentBetreff",[this.selectedStudiengangOption?.bezeichnung]);cn(n,t.originalEvent,a,this.$fhcAlert,this.$p)},sammelMailBetreuer(t){const e=[];this.selectedData.forEach(t=>{t.betreuer_mail&&e.push(t.betreuer_mail),t.zweitbetreuer_mail&&e.push(t.zweitbetreuer_mail)});const n=[...new Set(e)],a=this.$p.t("abgabetool/c4sammelmailBetreuerBetreff",[this.selectedStudiengangOption?.bezeichnung]);cn(n,t.originalEvent,a,this.$fhcAlert,this.$p)},selectHandler(t,e){const n=e.getRow();return n.isSelected()?n.deselect():n.select(),t.stopPropagation(),!1},selectAllHandler(t,e){const n=e.getTable().getRows().filter(t=>t.getData().selectable);return n.every(t=>t.isSelected())?n.forEach(t=>t.deselect()):n.forEach(t=>t.select()),t.stopPropagation(),!1},checkQualityGateStatus(t){const e=[],n=[];t.qgate1Status=this.$p.t("abgabetool/c4keinTerminVorhanden"),t.qgate1StatusRank=0,t.qgate2Status=this.$p.t("abgabetool/c4keinTerminVorhanden"),t.qgate2StatusRank=0,t.abgabetermine.forEach(t=>{"qualgate1"==t.paabgabetyp_kurzbz&&e.push(t),"qualgate2"==t.paabgabetyp_kurzbz&&n.push(t)}),e.forEach(e=>{if(null!=e.note&&t.qgate1StatusRank<=5){this.notenOptions.find(t=>t.note==e.note).positiv?(t.qgate1Status=this.$p.t("abgabetool/c4positivBenotet"),t.qgate1StatusRank=5):(t.qgate1Status=this.$p.t("abgabetool/c4negativBenotet"),t.qgate1StatusRank=4)}else null==e.note&&t.qgate1StatusRank<=3?(t.qgate1Status=this.$p.t("abgabetool/c4notYetGraded"),t.qgate1StatusRank=3):1==e.upload_allowed&&null==e.abgabedatum&&t.qgate1StatusRank<=2?(t.qgate1Status=this.$p.t("abgabetool/c4notSubmitted"),t.qgate1StatusRank=2):0==e.upload_allowed&&e.diffMs<=0&&t.qgate1StatusRank<=1&&(t.qgate1Status=this.$p.t("abgabetool/c4notHappenedYet"),t.qgate1StatusRank=1)}),n.forEach(e=>{if(null!=e.note&&t.qgate1StatusRank<=5){this.notenOptions.find(t=>t.note==e.note).positiv?(t.qgate2Status=this.$p.t("abgabetool/c4positivBenotet"),t.qgate2StatusRank=5):(t.qgate2Status=this.$p.t("abgabetool/c4negativBenotet"),t.qgate2StatusRank=4)}else null==e.note&&t.qgate2StatusRank<=3?(t.qgate2Status=this.$p.t("abgabetool/c4notYetGraded"),t.qgate2StatusRank=3):1==e.upload_allowed&&null==e.abgabedatum&&t.qgate2StatusRank<=2?(t.qgate2Status=this.$p.t("abgabetool/c4notSubmitted"),t.qgate2StatusRank=2):0==e.upload_allowed&&e.diffMs<=0&&t.qgate2StatusRank<=1&&(t.qgate2Status=this.$p.t("abgabetool/c4notHappenedYet"),t.qgate2StatusRank=1)})},getItemBezeichnung:t=>t.bezeichnung?t?.bezeichnung?.bezeichnung??t?.bezeichnung:"",getItemNote(t){if(!t?.note)return"";if(t.note?.bezeichnung)return t.note.bezeichnung;const e=this.notenOptions.find(e=>e.note==t.note);return e?e.bezeichnung:t.note},handleChangeAbgabetypSerientermin(t){"qualgate1"===t.bezeichnung?.paabgabetyp_kurzbz||"qualgate2"===t.bezeichnung?.paabgabetyp_kurzbz?t.kurzbz=t.bezeichnung.bezeichnung:t.kurzbz=""},semesterChanged(t){if(this.$refs.abgabeTable.tabulator){const e=this.$refs.abgabeTable.tabulator,n=e.getFilters().filter(t=>"studiensemester_kurzbz"!=t.field),a=t.value.studiensemester_kurzbz==this.$p.t("abgabetool/c4all")?"":t.value.studiensemester_kurzbz,i={field:"studiensemester_kurzbz",type:t.value.studiensemester_kurzbz==this.$p.t("abgabetool/c4all")?"!=":"=",value:a};e.setFilter([...n,i])}},checkAbgabetermineProjektarbeit(t){t.abgabetermine.forEach(e=>{e.dateStyle=this.getDateStyleClass(e);const n=luxon.DateTime.fromISO(e.datum);e.diffMs=n.toMillis()-pn.toMillis(),e.diffMs<0?(!t.prevTermin||e.diffMs>t.prevTermin.diffMs)&&(t.prevTermin=e):e.diffMs>0&&(!t.nextTermin||e.diffMs({field:t.field,visible:t.visible,width:t.width})),sort:t.getSorters().map(t=>({field:t.field,dir:t.dir})),filters:t.getFilters(),headerFilters:t.getHeaderFilters()};localStorage.setItem(this.abgabeTableOptions.persistenceID,JSON.stringify(e))},handleTableBuilt(){const t=this.$refs.abgabeTable.tabulator;this.tableBuiltResolve(),t.on("columnMoved",()=>{this.saveState(t)}),t.on("columnResized",()=>{this.saveState(t)}),t.on("columnVisibilityChanged",()=>{this.saveState(t)}),t.on("filterChanged",()=>{this.saveState(t)}),t.on("headerFilterChanged",()=>{this.saveState(t)}),t.on("dataSorted",()=>{this.saveState(t)}),t.on("columnSorted",()=>{this.saveState(t)}),t.on("sortersChanged",()=>{this.saveState(t)});const e=this.loadState();t.on("renderComplete",()=>{if(!this.stateRestored){if(e?.columns&&!this.colLayoutRestored){const n=e.columns.map(t=>({field:t.field,width:t.width,visible:t.visible}));t.setColumnLayout(n),this.colLayoutRestored=!0}if(e?.filters&&!this.filtersRestored&&(this.filtersRestored=!0,t.setFilter(e.filters)),e?.headerFilters&&!this.headerFiltersRestored){this.headerFiltersRestored=!0;for(let n of e.headerFilters)t.setHeaderFilterValue(n.field,n.value)}e?.sort?.length&&!this.sortRestored&&(this.sortRestored=!0,setTimeout(()=>{const n=e.sort.map(e=>{const n=t.columnManager.findColumn(e.field);return n?{column:n,dir:e.dir}:null}).filter(Boolean);t.setSort(n)},100)),this.stateRestored=!0}})},handleToggleFullscreenDetail(){this.detailIsFullscreen=!this.detailIsFullscreen},getOptionLabelAbgabetyp:t=>t.bezeichnung,getOptionLabelStg:t=>t.kurzbzlang+" "+t.bezeichnung,getOptionLabelStudiensemester:t=>t.studiensemester_kurzbz,getNotenFilterOptionLabel:t=>t.bezeichnung,formatDate(t){if(null===t)return"";const e=new Date(t),n=t=>String(t).padStart(2,"0"),a=n(e.getMonth()+1);return`${n(e.getDate())}.${a}.${e.getFullYear()}`},formAction(t){const e=document.createElement("div");e.className="d-flex gap-3",e.style.display="flex",e.style.alignItems="stretch",e.style.justifyContent="center",e.style.height="100%";const n=t.getValue(),a=(t,e,n)=>{const a=document.createElement("button");return a.className="btn btn-outline-secondary",a.style.display="flex",a.style.alignItems="center",a.style.justifyContent="center",a.style.height="100%",a.style.aspectRatio="1 / 1",a.style.padding="0","fa fa-timeline"==t&&(a.style.transform="rotate(90deg)"),a.innerHTML=``,a.title=this.$capitalize(this.$p.t(e)),a.addEventListener("click",t=>{t.stopPropagation(),t.stopImmediatePropagation(),n()}),a};return e.append(a("fa fa-folder-open","abgabetool/c4details",()=>this.setDetailComponent(n)),a("fa fa-timeline","abgabetool/c4termineTimeLine",()=>this.openTimeline(n))),e},undoSelection(t){const e=t.getRow();e.isSelected()&&e.deselect()},selectionCheck(t){const e=t.getData();return"Zweitbegutachter"!=e?.betreuerart_kurzbz},showDeadlines(){const t=FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/Cis/Abgabetool/Deadlines";window.open(t,"_blank")},openAddSeriesModal(){this.$refs.modalContainerAddSeries.show()},addSeries(){const t=this.selectedData?.map(t=>t.projektarbeit_id);this.saving=!0,this.serienTermin.fixtermin=!this.serienTermin.invertedFixtermin,this.$api.call(Qe.postSerientermin(this.serienTermin.datum.toISOString(),this.serienTermin.bezeichnung.paabgabetyp_kurzbz,this.serienTermin.bezeichnung.bezeichnung,this.serienTermin.kurzbz,this.serienTermin.upload_allowed,t,this.serienTermin.fixtermin)).then(e=>{"success"===e.meta.status&&e.data?this.$fhcAlert.alertSuccess(this.$p.t("abgabetool/serienTerminGespeichert")):this.$fhcAlert.alertError(this.$p.t("abgabetool/errorSerienterminSpeichern"));const n=e.data;t.forEach(t=>{const e=n.find(e=>e.projektarbeit_id==t),a=this.projektarbeiten.find(e=>e.projektarbeit_id==t);e.bezeichnung=this.abgabeTypeOptions.find(t=>t.paabgabetyp_kurzbz==e.paabgabetyp_kurzbz),a.abgabetermine.push(e),a.abgabetermine.sort((t,e)=>new Date(t.datum)-new Date(e.datum))}),this.$refs.abgabeTable.tabulator.deselectRow();const a=this.mapProjekteToTableData(this.projektarbeiten);this.$refs.abgabeTable.tabulator.setData(a),this.$refs.abgabeTable.tabulator.redraw(!0)}).finally(()=>{this.saving=!1}),this.$refs.modalContainerAddSeries.hide()},mapProjekteToTableData(t){return t.map(t=>{if(t.selectable=!0,t.prevTermin=null,t.nextTermin=null,this.checkAbgabetermineProjektarbeit(t),this.notenOptions&&t.note){const e=this.notenOptions.find(e=>e.note==t.note);t.note_bez=e.bezeichnung}return{...t,abgabetermine:t.abgabetermine,details:{student_uid:t.student_uid,projektarbeit_id:t.projektarbeit_id},pkz:this.buildPKZ(t),beurteilung:t.beurteilungLink??null,sem:t.studiensemester_kurzbz,stg:this.buildStg(t),mail:this.buildMailToLink(t),erstbetreuer:this.buildErstbetreuer(t),zweitbetreuer:this.buildZweitbetreuer(t),typ:t.projekttyp_kurzbz,titel:t.titel}})},createInfoString(t){let e="";return t.forEach(t=>{e+=t,e+="; "}),e},isPastDate:t=>new Date(t)e.projektarbeit_id==t.projektarbeit_id);e?.abgabetermine?.length&&this.$api.call(Qe.getSignaturStatusForProjektarbeitAbgaben(e.abgabetermine.map(t=>t.paabgabe_id),e.student_uid)).then(t=>{"success"===t.meta.status&&t.data.forEach(t=>{const n=e.abgabetermine.find(e=>e.paabgabe_id==t.paabgabe_id);n&&void 0!==t.signatur&&(n.signatur=t.signatur)})});const n=null!==e.note;e.abgabetermine.forEach(t=>{"object"!=typeof t.note&&(t.note=this.allowedNotenOptions.find(e=>e.note==t.note)),t.file=[],t.allowedToSave=!n,t.allowedToDelete=!n&&!t.abgabedatum,t.bezeichnung=this.abgabeTypeOptions.find(e=>e.paabgabetyp_kurzbz===t.paabgabetyp_kurzbz)});const a=e.vorname??e.student_vorname,i=e.nachname??e.student_nachname;e.student=`${a} ${i}`,this.selectedProjektarbeit=e,this.$refs.modalContainerAbgabeDetail.show()},dateDiffInDays(t){const e=luxon.DateTime.now().startOf("day");return luxon.DateTime.fromISO(t).startOf("day").diff(e,"days").values.days},getDateStyleClass(t){const e=new Date(t.datum),n=new Date(t.abgabedatum);t.diffindays=this.dateDiffInDays(t.datum);const a=t.abgabedatum&&n>e;return t.note?t.note.positiv?"bestanden":"nichtbestanden":t.bezeichnung?.benotbar&&ee.projektarbeit_id==t.projektarbeit_id);e?(e.abgabetermine.forEach(t=>{const e=this.abgabeTypeOptions.find(e=>e.paabgabetyp_kurzbz==t.paabgabetyp_kurzbz);t.benotbar=e.benotbar}),this.timelineProjekt=e,this.$refs.drawer.show()):this.$fhcAlert.alertInfo("Keine projektarbeit gefunden")},centeredTextFormatter(t){const e=t.getValue();if(e)return'

    '+e+"

    "},detailFormatter:t=>'
    ',mailFormatter:t=>'
    ',timelineFormatter:()=>'
    ',beurteilungFormatter:t=>t.getValue()?'
    ':"-",pkzTextFormatter:t=>'",abgabterminFormatter(t){const e=t.getValue();if(e){let t="";switch(e.dateStyle){case"verspaetet":t='';break;case"verpasst":t='';break;case"abzugeben":t='';break;case"standard":t='';break;case"abgegeben":t='';break;case"beurteilungerfolderlich":t='';break;case"bestanden":t='';break;case"nichtbestanden":t=''}const n=e.bezeichnung?.bezeichnung??e.bezeichnung;return'
    '+t+'

    '+n+" - "+this.formatDate(e.datum)+"

    "}return""},tableResolve(t){this.tableBuiltResolve=t},buildMailToLink(t){return"mailto:"+t.student_uid+"@"+this.domain},buildPKZ:t=>`${t.student_uid} / ${t.matrikelnr}`,buildStg:t=>(t.typ+t.kurzbz)?.toUpperCase(),buildErstbetreuer:t=>t.erstbetreuer_full_name?t.erstbetreuer_full_name:t.betreuer_vorname+" "+t.betreuer_nachname,buildZweitbetreuer:t=>t.zweitbetreuer_full_name??"",async setupData(t){this.projektarbeiten=t[0],this.domain=t[1],this.tableData=this.mapProjekteToTableData(this.projektarbeiten),await this.tableBuiltPromise,this.$refs.abgabeTable.tabulator.setData(this.tableData)},loadProjektarbeiten(t=!1,e){this.loading=!0,this.$api.call(Qe.getProjektarbeitenForStudiengang(this.selectedStudiengangOption.studiengang_kz,this.notenOptionFilter?.benotet??0)).then(t=>{t?.data&&this.setupData(t.data)}).finally(()=>{e&&e()}).finally(()=>{this.loading=!1})},loadAbgaben(t){return new Promise(e=>{this.$api.call(Qe.getStudentProjektabgaben(t)).then(t=>{e(t)})})},handleUuidDefined(t){this.tabulatorUuid=t},calcMaxTableHeight(){const t=this.tabulatorUuid?"-"+this.tabulatorUuid:"",e=document.getElementById("filterTableDataset"+t);if(!e)return;const n=e.getBoundingClientRect();this.abgabeTableOptions.height=window.visualViewport.height-n.top-80,this.$refs.abgabeTable.tabulator.setHeight(this.abgabeTableOptions.height)},async setupMounted(){this.tableBuiltPromise=new Promise(this.tableResolve),await this.tableBuiltPromise,await this.allConfigPromise,this.calcMaxTableHeight()},getOptionDisabled:t=>!t.aktiv},computed:{emailItems(){const t=[];return this.ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT&&t.push({label:this.$p.t("abgabetool/c4sendEmailStudierendev2",[this.uniqueStudentEmailCount]),command:this.sammelMailStudent}),this.ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER&&t.push({label:this.$p.t("abgabetool/c4sendEmailBetreuerv2",[this.uniqueBetreuerEmailCount]),command:this.sammelMailBetreuer}),t},uniqueBetreuerEmailCount(){const t=new Set;return this.selectedData.forEach(e=>{e.betreuer_mail&&t.add(e.betreuer_mail),e.zweitbetreuer_mail&&t.add(e.zweitbetreuer_mail)}),t.size},uniqueStudentEmailCount(){const t=new Set;return this.selectedData.forEach(e=>{e.student_uid&&t.add(e.student_uid)}),t.size}},watch:{"serienTermin.bezeichnung"(t){"qualgate1"!==t?.paabgabetyp_kurzbz&&"qualgate2"!==t?.paabgabetyp_kurzbz||(this.serienTermin.kurzbz=t.bezeichnung),this.serienTermin.upload_allowed=t.upload_allowed_default},selectedStudiengangOption(t,e){null!==this.notenOptionFilter&&null!==this.selectedStudiengangOption&&this.loadProjektarbeiten()},notenOptionFilter(t){null!==this.notenOptionFilter&&null!==this.selectedStudiengangOption&&this.loadProjektarbeiten()}},created(){this.loading=!0,this.phrasenPromise=this.$p.loadCategory(["abgabetool","global"]),this.phrasenPromise.then(()=>{this.phrasenResolved=!0});const t=[this.$api.call(Qe.getConfig()),this.$api.call(Qe.getStudiengaenge()),this.$api.call(on.getAllStudiensemesterAndAktOrNext()),this.$api.call(Qe.getNoten()),this.$api.call(Qe.getPaAbgabetypen())];this.allConfigPromise=Promise.allSettled(t).then(t=>{if("fulfilled"===t[0].status){const e=t[0].value;this.turnitin_link=e.data?.turnitin_link,this.old_abgabe_beurteilung_link=e.data?.old_abgabe_beurteilung_link,this.ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT=e.data?.ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT,this.ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER=e.data?.ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER}if("fulfilled"===t[1].status){const e=t[1].value;this.studiengaengeOptions=e.data,this.studiengaengeOptions?.length&&(this.selectedStudiengangOption=this.stg_kz_prop?e.data.find(t=>t.studiengang_kz==this.stg_kz_prop):e.data[0])}if("fulfilled"===t[2].status){const e=t[2].value;this.allSem=e.data[0];const n={studiensemester_kurzbz:this.$p.t("abgabetool/c4all")};this.curSem=n,this.studiensemesterOptions=[n,...this.allSem]}if("fulfilled"===t[3].status){const e=t[3].value;"success"===e.meta?.status&&(this.notenOptions=e.data[0],this.allowedNotenOptions=this.notenOptions.filter(t=>e.data[1].includes(t.note)),this.notenOptionsNonFinal=this.notenOptions.filter(t=>e.data[2].includes(t.note))),this.allowedNotenFilterOptions=[{bezeichnung:Vue.computed(()=>this.$p.t("abgabetool/keineNoteEingetragen")),benotet:0},{bezeichnung:Vue.computed(()=>this.$p.t("abgabetool/c4benotet")),benotet:1},{bezeichnung:Vue.computed(()=>this.$p.t("abgabetool/showAll")),benotet:-1}],this.notenOptionFilter=this.allowedNotenFilterOptions[0]}if("fulfilled"===t[4].status){const e=t[4].value;this.abgabeTypeOptions=e.data}}).finally(()=>{this.loading=!1})},mounted(){this.setupMounted()},template:'\n\t\n '},mn={name:"DeadlineOverview",components:{CoreFilterCmpt:pe},props:{person_uid_prop:{default:null},viewData:{type:Object,required:!0,default:()=>({name:"",uid:""}),validator:t=>t&&t.name&&t.uid}},data(){return{fullName:null,deadlines:null,tabulatorUuid:Vue.ref(0),tableBuiltResolve:null,tableBuiltPromise:null,phrasenPromise:null,phrasenResolved:!1,deadlineTableOptions:{height:700,index:"projektarbeit_id",layout:"fitColumns",placeholder:Vue.computed(()=>this.$p.t("global/noDataAvailable")),columns:[{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4zieldatum"))),field:"datum",formatter:this.centeredTextFormatter,widthGrow:1,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4fixterminv4"))),field:"fixterminstring",formatter:this.centeredTextFormatter,widthGrow:1,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4abgabetyp"))),field:"typ_bezeichnung",formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4abgabekurzbz"))),field:"kurzbz",formatter:this.centeredTextFormatter,widthGrow:3},{title:Vue.computed(()=>this.$capitalize(this.$p.t("person/studentIn"))),field:"student",formatter:this.centeredTextFormatter,widthGrow:2},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4stg"))),field:"stg",formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4sem"))),field:"semester",formatter:this.centeredTextFormatter,widthGrow:1}],persistence:!1},deadlineTableEventHandlers:[{event:"tableBuilt",handler:async()=>{this.tableBuiltResolve()}},{event:"cellClick",handler:async(t,e)=>{if("details"===e.getColumn().getField()){const t=e.getValue();if("detailTermine"===t.mode)this.setDetailComponent(e.getValue());else if("beurteilungDownload"===t.mode){const e=FHC_JS_DATA_STORAGE_OBJECT.app_root+"cis/private/pdfExport.php?xml=projektarbeitsbeurteilung.xml.php&xsl=Projektbeurteilung&betreuerart_kurzbz="+t.betreuerart_kurzbz+"&projektarbeit_id="+t.projektarbeit_id+"&person_id="+t.betreuer_person_id;window.open(e,"_blank")}}else if("beurteilung"===e.getColumn().getField()){const t=e.getValue();"-"!=t&&window.open(t,"_blank")}t.stopPropagation()}}]}},methods:{centeredTextFormatter:t=>'

    '+t.getValue()+"

    ",tableResolve(t){this.tableBuiltResolve=t},loadDeadlines(){this.$api.call(Qe.fetchDeadlines(this.person_uid_prop??null)).then(t=>{t?.data&&this.setupData(t.data)})},setupData(t){this.deadlines=t,this.deadlines.forEach(t=>{t.student=(t.stud_titelpre?t.stud_titelpre+" ":"")+t.stud_vorname+" "+t.stud_nachname+(t.stud_titelpost?" "+t.stud_titelpost:""),t.fixterminstring=t.fixtermin?this.$p.t("abgabetool/c4yes"):this.$p.t("abgabetool/c4no")}),this.$refs.deadlineTable.tabulator.setColumns(this.deadlineTableOptions.columns),this.$refs.deadlineTable.tabulator.setData(this.deadlines)},handleUuidDefined(t){this.tabulatorUuid=t},calcMaxTableHeight(){const t=this.tabulatorUuid?"-"+this.tabulatorUuid:"",e=document.getElementById("filterTableDataset"+t);if(!e)return;const n=e.getBoundingClientRect();this.deadlineTableOptions.height=window.visualViewport.height-n.top-30,this.$refs.deadlineTable.tabulator.setHeight(this.deadlineTableOptions.height)},async setupMounted(){this.tableBuiltPromise=new Promise(this.tableResolve),await this.tableBuiltPromise,this.loadDeadlines(),this.calcMaxTableHeight()}},watch:{},computed:{},created(){this.phrasenPromise=this.$p.loadCategory(["abgabetool","global"]),this.phrasenPromise.then(()=>{this.phrasenResolved=!0})},mounted(){this.setupMounted()},template:'\n\t\t

    {{$p.t(\'abgabetool/deadlinesTitle\')}} {{ fullName ? (\'-\' + fullName) : \'\'}}

    \n\t\t
    \n\t\t\t\n\t\t \n '};var gn={data:()=>({studienSemester:[],selectedStudiensemester:null,studiengaenge:[],selectedStudiengang:null,studienOrdnung:[],selectedStudienordnung:null,semester:[],selectedSemester:null,lehrveranstaltungen:[],selectedLehrveranstaltung:null,menu:null}),provide(){return{studium_studiengang:Vue.computed(()=>this.selectedStudiengang),studium_studiensemester:Vue.computed(()=>this.selectedStudiensemester),studium_semester:Vue.computed(()=>this.selectedSemester),studium_studienordnung:Vue.computed(()=>this.selectedStudienordnung)}},components:{LvUebersicht:Qt},watch:{selectedStudiensemester:function(t,e){if(t&&t!=e){const e=this.getDataFromLocalStorage("sudiensemester");t&&(!e||e&&e!=t)&&this.storeDataToLocalStorage("sudiensemester",t)}},selectedSemester:function(t,e){if(t&&t!=e){const e=this.getDataFromLocalStorage("semester");(!e||e&&e!=t)&&this.storeDataToLocalStorage("semester",t)}},selectedStudiengang:function(t,e){if(t&&t!=e){const e=this.getDataFromLocalStorage("studiengang");(!e||e&&e!=t)&&this.storeDataToLocalStorage("studiengang",JSON.stringify(t))}},selectedStudienordnung:function(t,e){if(t&&t!=e){const e=this.getDataFromLocalStorage("studienordnung");(!e||e&&e!=t)&&this.storeDataToLocalStorage("studienordnung",JSON.stringify(t))}}},methods:{changeStudiensemester(t){let e=this.$refs.studiensemester;e.selectedIndex=(e.selectedIndex+t+e.options.length)%e.options.length,this.changeSelectedStudienSemester(e.value)},changeStudiengang(t){let e=this.$refs.studiengaenge;e.selectedIndex=(e.selectedIndex+t+e.options.length)%e.options.length,this.changeSelectedStudienGang(e.value)},changeSemester(t){let e=this.$refs.semester;e.selectedIndex=(e.selectedIndex+t+e.options.length)%e.options.length,this.changeSelectedSemester(e.value)},changeStudienordnung(t){let e=this.$refs.studienordnung,n=(e.selectedIndex+t+e.options.length)%e.options.length;e.options[n].disabled&&(n=(n+t+e.options.length)%e.options.length),e.selectedIndex=n,this.changeSelectedStudienPlan(e.value)},storeDataToLocalStorage(t,e){localStorage.setItem(t,e)},getDataFromLocalStorage:t=>localStorage.getItem(t),changeSelectedStudienSemester(t){this.$fhcApi.factory.studium.getAllStudienSemester(t,this.selectedStudiengang,this.selectedSemester,this.selectedStudienordnung).then(t=>t.data).then(t=>{this.extractPropertyValues(t)})},changeSelectedStudienGang(t){this.$fhcApi.factory.studium.getAllStudienSemester(this.selectedStudiensemester,t,this.selectedSemester,this.selectedStudienordnung).then(t=>t.data).then(t=>{this.extractPropertyValues(t)})},changeSelectedSemester(t){this.$fhcApi.factory.studium.getAllStudienSemester(this.selectedStudiensemester,this.selectedStudiengang,t,this.selectedStudienordnung).then(t=>t.data).then(t=>{this.extractPropertyValues(t)})},changeSelectedStudienPlan(t){this.$fhcApi.factory.studium.getAllStudienSemester(this.selectedStudiensemester,this.selectedStudiengang,this.selectedSemester,t).then(t=>t.data).then(t=>{this.extractPropertyValues(t)})},openLvUebersicht(t){this.selectedLehrveranstaltung=t,this.selectedLehrveranstaltung.type="lehreinheit",this.selectedLehrveranstaltung.lehreinheit_id=this.selectedLehrveranstaltung.lehrveranstaltung_id,this.selectedLehrveranstaltung&&Vue.nextTick(()=>{this.$refs.lvUebersicht.show()})},sortStudienSemester(t){let e=new RegExp(/^(WS|SS)([0-9]{4})/);t.sort((t,n)=>{let[a,i,s]=t.studiensemester_kurzbz.match(e),[r,l,o]=n.studiensemester_kurzbz.match(e);return s==o?i>l?-1:1:s>o?-1:1})},setHash(t){location.hash=t},extractPropertyValues(t){let{studienSemester:e,studiengang:n,semester:a,studienplan:i,lehrveranstaltungen:s}=t;this.sortStudienSemester(e.all),this.studienSemester=e.all,this.selectedStudiensemester=e.preselected.studiensemester_kurzbz,this.studiengaenge=n.all,this.selectedStudiengang=n.preselected?.studiengang_kz,this.semester=a.all,this.selectedSemester=a?.preselected,this.studienOrdnung=i.all,this.selectedStudienordnung=i.preselected?.studienplan_id,this.lehrveranstaltungen=s,this.lehrveranstaltungen.sort((t,e)=>t.bezeichnung.toLowerCase()>e.bezeichnung.toLowerCase()?1:t.bezeichnung.toLowerCase(){t.lehrveranstaltungen.sort((t,e)=>t.bezeichnung.toLowerCase()>e.bezeichnung.toLowerCase()?1:t.bezeichnung.toLowerCase()t?`${t?.bezeichnung}-${t?.orgform_kurzbz} ( ${t?.orgform_bezeichnung}, ${t?.sprache} )`:"",studiengangTitel:t=>t?`${t?.kurzbzlang} (${t?.bezeichnung})`:"",studiensemesterTitel(t){if(!t)return"";let e=new RegExp(/^(WS|SS)([0-9]{4})/),n=t.match(e);switch(n[1]){case"WS":return`Wintersemester ${n[2]}`;case"SS":return`Sommersemester ${n[2]}`;default:return`${t}`}}},computed:{selectedLehrveranstaltungTitel(){const t=this.studiengaenge.find(t=>t.studiengang_kz==this.selectedStudiengang);return`${this.selectedLehrveranstaltung?.bezeichnung} ${this.selectedLehrveranstaltung?.lehrform_kurzbz} / ${t.kurzbzlang}-${this.selectedSemester} ${this.selectedLehrveranstaltung?.orgform_kurzbz} (${this.selectedStudiensemester})`},computedStudienOrdnung(){return this.studienOrdnung?Object.values(this.studienOrdnung).reduce((t,e)=>(t[e.bezeichnung]||(t[e.bezeichnung]=[]),t[e.bezeichnung].push(e),t),{}):null},computedStudienOrdnungSelectValues(){if(!this.computedStudienOrdnung)return null;let t=[];return Object.entries(this.computedStudienOrdnung).forEach(([e,n])=>{t.push({bezeichnung:`Studienordnung: ${e}`,disabled:!0}),n.forEach(e=>{t.push({studienplan:e,diabled:!1,bezeichnung:`${e?.bezeichnung}-${e?.orgform_kurzbz} ( ${e?.orgform_bezeichnung}, ${e?.sprache} )`})})}),t}},created(){const t=this.getDataFromLocalStorage("sudiensemester")??void 0,e=JSON.parse(this.getDataFromLocalStorage("studiengang"))??void 0,n=this.getDataFromLocalStorage("semester")??void 0,a=JSON.parse(this.getDataFromLocalStorage("studienordnung"))??void 0;this.$fhcApi.factory.studium.getAllStudienSemester(t,e,n,a).then(t=>t.data).then(t=>{this.extractPropertyValues(t)})},template:'\n\t
    \n\t

    Studium

    \n\t
    \n\t\n\t\t\n\t\n\t
    \n\t\t
    \n\t\t
    Studiensemester:
    \n\t\t
    \n\t\t\t\n\t\t\t\n\t\t\t\n\t\t
    \n\t\t
    \n\n\t\t
    \n\t\t
    Studiengang:
    \n\t\t
    \n\t\t\t\n\t\t\t\n\t\t\t\n\t\t
    \n\t\t
    \n\n\t\t
    \n\t\t
    Semester:
    \n\t\t
    \n\t\t\t\n\t\t\t\n\t\t\t\n\t\t
    \n\t\t
    \n\n\t\t
    \n\t\t
    Studienordnung:
    \n\t\t
    \n\t\t\t\n\t\t\t\n\t\t\t\n\t\t
    \n\t\t
    \n\t
    \n\n\t
    \n\n\t
    \n\t\n\t
    \n\n\n\t
    \n\t\n\t'},fn={loadRenderers:()=>({method:"get",url:"/api/frontend/v1/RendererLoader/GetRenderers",params:{}})},vn={info:(t,e)=>({method:"post",url:"/api/frontend/v1/RouteInfo/info",params:{app:t,path:e}})};const bn=FHC_JS_DATA_STORAGE_OBJECT.app_root.replace(/(https:|)(^|\/\/)(.*?\/)/g,"")+FHC_JS_DATA_STORAGE_OBJECT.ci_router,yn=VueRouter.createRouter({history:VueRouter.createWebHistory(`/${bn}`),routes:[{path:"/Cis/Studium",name:"Studium",component:gn,props:!0},{path:"/Cis/Profil/View/:uid",name:"ProfilView",component:Fe,props:!0},{path:"/Cis/Profil",name:"Profil",component:Fe,props:!0},{path:"/Cis/Abgabetool/Student/:student_uid_prop?",name:"AbgabetoolStudent",component:nn,props:!0},{path:"/Cis/Abgabetool/Mitarbeiter",name:"AbgabetoolMitarbeiter",component:rn,props:!0},{path:"/Cis/Abgabetool/Assistenz/:stg_kz_prop?",name:"AbgabetoolAssistenz",component:hn,props:!0},{path:"/Cis/Abgabetool/Deadlines/:person_uid_prop?",name:"DeadlineOverview",component:mn,props:!0},{path:"/Cis/Raumsuche",name:"Raumsuche",component:Me,props:!0},{path:"/CisVue/Cms/getRoomInformation/:ort_kurzbz",name:"RoomInformationOld",component:Ye,redirect:t=>({name:"RoomInformation",params:{ort_kurzbz:t.params.ort_kurzbz,mode:Ke,focus_date:(new Date).toISOString().split("T")[0]}})},{path:"/CisVue/Cms/getRoomInformation/:mode/:focus_date/:ort_kurzbz",name:"RoomInformation",component:Ye,props:t=>{const e=t.params.mode&&["Month","Week","Day"].includes(t.params.mode.charAt(0).toUpperCase()+t.params.mode.slice(1).toLowerCase())?t.params.mode.charAt(0).toUpperCase()+t.params.mode.slice(1).toLowerCase():Ke,n=new Date(t.params.focus_date);return{propsViewData:{mode:e,focus_date:isNaN(n)?(new Date).toISOString().split("T")[0]:t.params.focus_date,ort_kurzbz:t.params.ort_kurzbz}}},beforeEnter:(t,e,n)=>{t.params.mode&&t.params.focus_date?n():n({name:"RoomInformation",params:{mode:t.params.mode||Ke,focus_date:t.params.focus_date||(new Date).toISOString().split("T")[0],ort_kurzbz:route.params.ort_kurzbz}})}},{path:"/CisVue/Cms/Content/:content_id",name:"Content",component:Ze,props:!0},{path:"/CisVue/Cms/News",name:"News",component:Ve,props:!0},{path:"/Cis/MyLv/:studiensemester?",name:"MyLv",component:te,props:!0},{path:"/Cis/MyLv/Info/:studien_semester/:lehrveranstaltung_id",name:"LvInfo",component:Ut,props:!0},{path:"/Cis/LvPlan/:lv_id(\\d+)",name:"LvPlanOld",component:Lt,redirect(t){const e=Vue.unref(yn.currentRoute),{mode:n,focus_date:a}=e.params;return{name:"LvPlan",params:{mode:n,focus_date:a,lv_id:t.params.lv_id}}}},{path:"/Cis/LvPlan/:mode?/:focus_date?/:lv_id?",name:"LvPlan",component:Lt,props:t=>({propsViewData:t.params})},{path:"/Cis/MyLvPlan/:mode?/:focus_date?",name:"MyLvPlan",component:Rt,props:t=>({propsViewData:t.params})},{path:"/Cis4",name:"Cis4",component:k,props:{dashboard:"CIS"}},{path:"/",name:"FhcDashboard",component:k,props:{dashboard:"CIS"}},{path:"/:pathMatch(.*)*",name:"Fallback",component:k,props:{dashboard:"CIS"},redirect:()=>({name:"Cis4",params:{dashboard:"CIS"}})}]}),wn=Vue.createApp({name:"FhcApp",data:()=>({appSideMenuEntries:{},renderers:null}),components:{},computed:{isMobile:()=>window.matchMedia("(max-width: 767px)").matches},provide(){return{language:Vue.computed(()=>this.$p.user_language),renderers:Vue.computed(()=>this.renderers),isMobile:this.isMobile}},methods:{isInternalRoute(t){const e=window.location.origin;return t.startsWith(e)},handleClick(t){const e=t.target.closest("a");if("skiplink"!=e?.id&&e&&this.isInternalRoute(e.href)){const n=new URL(e.href).pathname,a=this.$router.options.history.base,i=n.replace(a,"")||"/",s=this.$router.resolve(i);if(!s?.matched?.length||"Fallback"===s.name)return;if(t.preventDefault(),this.isMobile){document.getElementById("nav-main").classList.contains("show")&&document.getElementById("nav-main-btn").click()}this.$router.push(i)}}},async created(){await this.$api.call(fn.loadRenderers()).then(t=>t.data).then(t=>{for(let a of Object.keys(t)){let i=null,s=null,r=null;if(t[a].modalTitle&&(i=Vue.markRaw(Vue.defineAsyncComponent(()=>import(t[a].modalTitle)))),t[a].modalContent&&(s=Vue.markRaw(Vue.defineAsyncComponent(()=>import(t[a].modalContent)))),t[a].calendarEvent&&(r=Vue.markRaw(Vue.defineAsyncComponent(()=>import(t[a].calendarEvent)))),t[a].calendarEventStyles){var e=document.head;if(!e.querySelector(`link[href="${t[a].calendarEventStyles}"]`)){var n=document.createElement("link");n.type="text/css",n.rel="stylesheet",n.href=t[a].calendarEventStyles,e.appendChild(n)}}null===this.renderers&&(this.renderers={}),this.renderers[a]||(this.renderers[a]={}),this.renderers[a].modalTitle=i,this.renderers[a].modalContent=s,this.renderers[a].calendarEvent=r}})},mounted(){document.addEventListener("click",this.handleClick)},beforeUnmount(){document.removeEventListener("click",this.handleClick)}});!function(){const t=/Chrome/.test(navigator.userAgent),e=/Firefox/.test(navigator.userAgent);if(t){const t=function(){const t=document.createElement("div");t.style.position="absolute",t.style.top="-9999px",t.style.width="100px",t.style.height="100px",t.style.overflow="scroll",document.body.appendChild(t);const e=t.offsetWidth-t.clientWidth;return document.body.removeChild(t),e}()+"px";document.body.style.setProperty("--scrollbar-width",t)}else e&&document.body.style.setProperty("--scrollbar-width","0px")}(),wn.config.globalProperties.$capitalize=function(t){return t?t[0].toUpperCase()+t.slice(1):""},wn.use(yn),wn.use(primevue.config.default,{zIndex:{overlay:9e3,tooltip:8e3}}),wn.directive("tooltip",primevue.tooltip),wn.use(at),wn.use(ot),wn.directive("contrast",ut),wn.mount("#fhccontent"),yn.afterEach((t,e,n)=>{wn.config.globalProperties.$api.call(vn.info("cis4",t.fullPath))}); +getStatus:()=>({method:"get",url:"/api/frontend/v1/ProfilUpdate/getStatus"}),getTopic:()=>({method:"get",url:"/api/frontend/v1/ProfilUpdate/getTopic"}),acceptProfilRequest:({profil_update_id:t,uid:e,status_message:n,topic:a,requested_change:i})=>({method:"post",url:"/api/frontend/v1/ProfilUpdate/acceptProfilRequest",params:{profil_update_id:t,uid:e,status_message:n,topic:a,requested_change:i}}),denyProfilRequest:({profil_update_id:t,uid:e,topic:n,status_message:a})=>({method:"post",url:"/api/frontend/v1/ProfilUpdate/denyProfilRequest",params:{profil_update_id:t,uid:e,topic:n,status_message:a}}),insertFile:(t,e=null)=>({method:"post",url:`/api/frontend/v1/ProfilUpdate/insertFile/${e}`,params:t}),updateProfilbild:t=>({method:"post",url:"/api/frontend/v1/ProfilUpdate/updateProfilbild",params:t}),getProfilUpdateWithPermission:t=>({method:"get",url:"/api/frontend/v1/ProfilUpdate/getProfilUpdateWithPermission"+(""!==t?"/"+encodeURIComponent(t):"")}),getProfilRequestFiles:t=>({method:"get",url:`/api/frontend/v1/ProfilUpdate/getProfilRequestFiles/${t}`}),selectProfilRequest:(t=null,e=null)=>({method:"get",url:"/api/frontend/v1/ProfilUpdate/selectProfilRequest",params:{...t?{uid:t}:{},...e?{id:e}:{}}}),insertProfilRequest:(t,e,n=null)=>({method:"post",url:"/api/frontend/v1/ProfilUpdate/insertProfilRequest",params:{topic:t,payload:e,...n?{fileID:n}:{}}}),updateProfilRequest:(t,e,n,a=null)=>({method:"post",url:"/api/frontend/v1/ProfilUpdate/updateProfilRequest",params:{topic:t,payload:e,ID:n,...a?{fileID:a}:{}}}),deleteProfilRequest:t=>({method:"post",url:"/api/frontend/v1/ProfilUpdate/deleteProfilRequest",params:{requestID:t}})},xe={data:()=>({dmsData:[]}),components:{Dms:ke,BsModal:s},mixins:[s],props:{titel:{type:String},files:{type:Array},updateID:{type:Boolean},onHideBsModal:Function,onHiddenBsModal:Function,onHidePreventedBsModal:Function,onShowBsModal:Function,onShownBsModal:Function},methods:{async uploadImage(){if(this.dmsData){let t=new FormData;t.append("files[]",this.dmsData[0]),await this.$api.call(_e.updateProfilbild(t)).then(t=>{this.$fhcAlert.alertSuccess(this.$p.t("global","hochgeladen")),this.modal.hide()})}}},mounted(){this.modal=this.$refs.modalContainer.modal,this.files&&(this.dmsData=this.files)},popup(t){return s.popup.bind(this),s.popup(null,t)},template:'\n\n\t\n\t\t\n\t\t\n\t\n '},Ae={props:{title:{type:String},data:{type:Object},fotoStatus:{type:Boolean,default:!0}},components:{ImageUpload:xe},data(){return{FotoSperre:this.data.foto_sperre}},emits:["showEditProfilModal"],inject:["isEditable"],methods:{showModal(){this.$refs.imageUpload.show()},sperre_foto_function(){this.data&&this.$api.call(we.fotoSperre(!this.FotoSperre)).then(t=>{this.FotoSperre=t.data.foto_sperre})}},computed:{get_image_base64_src:function(){return this.data.foto?"data:image/jpeg;base64,"+this.data.foto:""},name:function(){return{vorname:this.data.Vorname,nachname:this.data.Nachname}},profilInfo:function(){let t={},e=["Vorname","Nachname","foto_sperre","foto"];return Object.keys(this.data).forEach(n=>{e.includes(n)||(t[n]=this.data[n])}),t}},template:'\n\n
    \n\t\n
    \n
    \n
    \n \n
    \n
    \n {{title}}\n
    \n
    \n
    \n
    \n
    \n \x3c!-- SQUEEZING THE IMAGE INSIDE THE FIRST INFORMATION COLUMN --\x3e\n \x3c!-- START OF THE FIRST ROW WITH THE PROFIL IMAGE --\x3e\n
    \n
    \n
    \n profile picture\n \x3c!-- LOCKING IMAGE FUNCTIONALITY --\x3e\n
    \n \n
    \n\t\t\t\t\t\t
    \n \n
    \n
    \n
    \n \x3c!-- END OF THE ROW WITH THE IMAGE --\x3e\n
    \n \x3c!-- END OF SQUEEZE --\x3e\n \x3c!-- COLUMNS WITH MULTIPLE ROWS NEXT TO PROFIL PICTURE --\x3e\n
    \n
    \n
    \n
    \n
    {{$p.t(\'profilUpdate\',\'vorname\')}}
    \n {{name.vorname}} \n
    \n
    \n
    \n
    \n
    {{$p.t(\'profilUpdate\',\'nachname\')}}
    \n {{name.nachname}} \n
    \n
    \n
    \n
    \n
    \n
    \n
    {{$p.t(\'profil\',bez)}}
    \n {{wert?wert:\'-\'}} \n
    \n
    \n
    \n
    \n
    \n'},$e={name:"EditProfilSelect",components:{Kontakt:be,EditKontakt:{props:{data:Object},data:()=>({originalValue:null,zustellKontakteCount:null}),inject:["getZustellkontakteCount"],methods:{updateValue:function(t,e){this.data[e]="zustellung"===e?t.target.checked:""===t.target.value?null:t.target.value,this.$emit("profilUpdate",this.isChanged?this.data:null),this.zustellKontakteCount=this.getZustellkontakteCount()}},computed:{showZustellKontakteWarning:function(){if(JSON.parse(this.originalValue).zustellung)return!1;const t=this.zustellKontakteCount.filter(t=>t.kontakttyp===this.data?.kontakttyp);return this.zustellKontakteCount.some(t=>t.kontakt_id===this.data.kontakt_id)?this.kontakteOfSelectedType.length>=2&&this.data.zustellung:this.data.zustellung&&t.length},isChanged:function(){return!(!this.data.kontakt||!this.data.kontakttyp)&&JSON.stringify(this.data)!==this.originalValue}},created(){this.originalValue=JSON.stringify(this.data),this.zustellKontakteCount=this.getZustellkontakteCount()},template:'\n\n
    \n\n
    \n\n\n
    \n
    {{$p.t(\'profilUpdate\',\'kontaktTyp\')}}
    \n\n \n
    \n\n
    \n
    \n\n \x3c!-- rendering KONTAKT emails --\x3e\n\n\n
    \n
    {{data.kontakttyp?data.kontakttyp:$p.t(\'global\',\'kontakt\')}}
    \n\n \n
    \n\n
    \n
    \n\n
    \n
    {{$p.t(\'global\',\'anmerkung\')}}
    \n\n \n
    \n\n
    \n\n \x3c!-- warning message for too many zustellungs Kontakte --\x3e\n
    \n
    \n {{$p.t(\'profilUpdate\',\'zustell_kontakte_warning\')}}\n
    \n
    \n \x3c!-- End of warning --\x3e\n\n
    \n {{$p.t(\'profilUpdate\',\'zustellungsKontakt\')}}\n\n \n
    \n
    \n '},Adresse:fe,EditAdresse:{components:{AutoComplete:primevue.autocomplete,Dms:ke},props:{data:Object,files:{type:Array,default:[]}},inject:["getZustelladressenCount","updateFileID","isMitarbeiter"],data:()=>({gemeinden:[],ortschaftnamen:[],selectedNation:null,nationenList:[],originalValue:null,zustellAdressenCount:null,dmsData:[],fileschanged:!1}),watch:{"data.gemeinde":function(t,e){this.$emit("profilUpdate",this.isChanged?this.data:null)},"data.ort":function(t,e){this.$emit("profilUpdate",this.isChanged?this.data:null)}},methods:{autocompleteSearchGemeinden:function(t){this.gemeinden=this.gemeinden.map(t=>t)},autocompleteSearchOrtschaftsnamen:function(t){this.ortschaftnamen=this.ortschaftnamen.map(t=>t)},getGemeinde:function(){this.data.nation&&"A"===this.data.nation&&this.data.plz&&this.data.plz>999&&this.data.plz<32e3?this.$api.call(we.getGemeinden(this.data.nation,this.data.plz)).then(t=>{t.data.length&&(this.gemeinden=[...new Set(t.data.map(t=>t.name))],this.ortschaftnamen=[...new Set(t.data.map(t=>t.ortschaftsname))])}):this.gemeinden=[]},updateValue:function(t,e){"zustelladresse"===e?this.data[e]=t.target.checked:"files"===e?(this.dmsData.length>0&&"application/x.fhc-dms+json"!==this.dmsData[0].type&&(this.fileschanged=!0),this.updateFileID(this.dmsData)):this.data[e]=""===t.target.value?null:t.target.value,this.$emit("profilUpdate",this.isChanged?this.data:null),this.zustellAdressenCount=this.getZustelladressenCount()},deleteDmsData:function(){this.dmsData=[],this.updateValue(null,"files")}},computed:{showZustellAdressenWarning:function(){return!JSON.parse(this.originalValue).zustelladresse&&(this.zustellAdressenCount.includes(this.data.adresse_id)?this.zustellAdressenCount.length>=2&&this.data.zustelladresse:this.data.zustelladresse&&this.zustellAdressenCount.length)},isChanged:function(){if(!(this.data.strasse&&this.data.plz&&this.data.ort&&this.data.typ&&0!==this.dmsData.length))return!1;return this.originalValue!==JSON.stringify(this.data)||this.fileschanged}},created(){this.$api.call(we.getAllNationen()).then(t=>{this.nationenList=t.data,this.getGemeinde()}),this.originalValue=JSON.stringify(this.data),this.zustellAdressenCount=this.getZustelladressenCount()},mounted(){this.files&&(this.dmsData=this.files)},template:'\n
    \n \x3c!-- warning message for too many zustellungs Adressen --\x3e\n
    \n
    \n\t {{$p.t(\'profilUpdate\',\'zustell_adressen_warning\')}}\n
    \n
    \n \x3c!-- End of warning --\x3e\n\n\n
    \n
    \n \n \n
    \n
    \n\n \x3c!-- NATION --\x3e\n
    \n
    \n
    {{$p.t(\'person\',\'nation\')}}*
    \n \n
    \n
    \n\n \x3c!-- PLZ --\x3e\n
    \n
    \n
    {{$p.t(\'person\',\'plz\')}}*
    \n \n
    \n
    \n\n \x3c!-- GEMEINDE --\x3e\n
    \n
    \n
    {{$p.t(\'person\',\'gemeinde\')}}*
    \n \n
    \n
    \n\n \x3c!-- ORT --\x3e\n
    \n
    \n
    {{$p.t(\'person\',\'ort\')}}*
    \n \n
    \n
    \n\n \x3c!-- STRASSE --\x3e\n
    \n
    \n
    {{$p.t(\'person\',\'strasse\')}}*
    \n \n
    \n
    \n \n \x3c!-- ADRESSEN TYP --\x3e\n
    \n
    \n
    {{$p.t(\'profilUpdate\',\'kontaktTyp\')}}*
    \n \n
    \n
    \n\n\t
    \n\t\t
    \n\t\t\t
    {{$p.t(\'profilUpdate\',\'meldebestaetigung\')}}*
    \n\t\t\t\n\t\t
    \n\t\t
    \n\t\t\t
     
    \n\t\t\t\n\t\t
    \n\t
    \n\n
    \n '},Status:{components:{Adresse:fe,Kontakt:be},inject:["profilUpdateTopic"],data:()=>({files:null}),methods:{getDocumentLink:function(t){return FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+`/Cis/ProfilUpdate/show/${t}`}},computed:{getComponentView:function(){return this.topic==this.profilUpdateTopic["Private Adressen"]||this.topic==this.profilUpdateTopic["Add Adresse"]||this.topic==this.profilUpdateTopic["Delete Adresse"]?"Adresse":this.topic==this.profilUpdateTopic["Private Kontakte"]||this.topic==this.profilUpdateTopic["Add Kontakt"]||this.topic==this.profilUpdateTopic["Delete Kontakt"]?"Kontakt":"text_input"},cardHeader:function(){return this.topic==this.profilUpdateTopic["Delete Addresse"]||this.topic==this.profilUpdateTopic["Delete Kontakt"]?"Delete":this.topic==this.profilUpdateTopic["Add Adresse"]||this.topic==this.profilUpdateTopic["Add Kontakt"]?"Add":"Update"}},props:{data:{type:Object},view:{type:String},status:{type:String},status_message:{type:String},status_timestamp:{type:String},updateID:{type:Number},topic:{type:String}},created(){this.$api.call(_e.getProfilRequestFiles(this.updateID)).then(t=>{this.files=t.data})},template:'\n
    \n\n
    \n
    \n
    {{$p.t(\'global\',\'status\')}}
    \n {{status}} \n
    \n
    \n\n
    \n
    \n
    {{$p.t(\'global\',\'datum\')}}
    \n {{status_timestamp}} \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    {{$p.t(\'profilUpdate\',\'statusMessage\')}}
    \n \n
    \n
    \n
    \n\n\n
    \n
    \n \n {{cardHeader}} \n
    \n
    \n \n \n \n
    \n
    \n\n\t
    \n\t\t
    {{$p.t(\'profilUpdate\',\'nachweisdokumente\')}}
    \n\t\t
    \n\t\t\t{{file.name}}\n\t\t
    \n\t
    \n '},TextInputDokument:{data:()=>({dmsData:[],originalValue:null}),components:{Dms:ke},props:{data:{type:Object},withFiles:{type:Boolean,default:!1},files:{type:Array},updateID:{type:Boolean}},inject:["updateFileID"],computed:{didFilesChange:function(){this.updateFileID(this.dmsData);let t=!1;return this.files?(Array.from(this.dmsData).forEach(e=>{this.files.some(t=>t.name!==e.name)&&(t=!0)}),!(this.dmsData.length==this.files.length)||t):!!Array.from(this.dmsData).length},didDataChange:function(){return JSON.stringify(this.data)!==this.originalValue},isChanged:function(){return this.withFiles?this.updateID?(this.didDataChange||this.didFilesChange)&&this.dmsData.length:this.didDataChange&&this.didFilesChange:this.didDataChange}},emits:["profilUpdate"],watch:{dmsData(t){this.emitChanges()}},methods:{stringifyFile:t=>JSON.stringify({lastModified:t.lastModified,lastModifiedDate:t.lastModifiedDate,name:t.name,size:t.size,type:t.type}),emitChanges:function(){this.isChanged?this.$emit("profilUpdate",{value:this.data.value}):this.$emit("profilUpdate",null)}},mounted(){this.originalValue=JSON.stringify(Vue.toRaw(this.data)),this.files&&(this.dmsData=this.files)},template:'\n\n

    {{$p.t(\'profilUpdate\',\'profilUpdateInformationMessage\',[data.titel])}}

    \n\n
    \n
    {{data.titel?data.titel:$p.t(\'global\',\'titel\')}}
    \n\n \n\n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n '}},inject:["profilUpdateTopic","isMitarbeiter"],props:{list:Object,size:{type:Number,default:null},ariaLabel:{type:String,required:!0},profilUpdate:String,topic:String,breadcrumb:String},emits:{"update:profilUpdate":null,"update:topic":null,"update:breadcrumb":null,submit:null,select:null},data(){return{view:null,data:null,breadcrumbItems:[],modal_topic:this.topic,properties:null}},methods:{addItem:function(){this.view=this.modal_topic==this.profilUpdateTopic["Private Kontakte"]?"EditKontakt":"EditAdresse",this.modal_topic=this.modal_topic==this.profilUpdateTopic["Private Kontakte"]?this.profilUpdateTopic["Add Kontakt"]:this.profilUpdateTopic["Add Adresse"],this.$emit("update:topic",this.modal_topic),this.breadcrumbItems.push(this.modal_topic),this.$emit("update:breadcrumb",this.breadcrumbItems),this.data="EditAdresse"==this.view?{add:!0,adresse_id:null,strasse:null,typ:null,plz:null,ort:null,zustelladresse:!1}:{add:!0,kontakt_id:null,kontakttyp:null,kontakt:null,anmerkung:null,zustellung:!1}},deleteItem:function(t){t.data.delete=!0,this.$emit("update:profilUpdate",t.data),this.modal_topic=this.modal_topic==this.profilUpdateTopic["Private Adressen"]?this.profilUpdateTopic["Delete Adresse"]:this.profilUpdateTopic["Delete Kontakt"],this.$emit("update:topic",this.modal_topic),this.$emit("submit")},profilUpdateEmit:function(t){this.$emit("update:profilUpdate",t)},updateOptions:function(t,e){this.properties=e,this.data=e.data,this.view=e.view,e.title?(this.modal_topic=e.topic,this.$emit("update:topic",this.modal_topic),this.breadcrumbItems.push(e.title)):e.data.kontakttyp?(this.breadcrumbItems.push(e.data.kontakttyp),this.breadcrumbItems.push(e.data.kontakt)):e.data.strasse&&this.breadcrumbItems.push(e.data.strasse),this.$emit("update:breadcrumb",this.breadcrumbItems)}},computed:{},created(){this.properties={...this.list},this.data=this.list.data?JSON.parse(JSON.stringify(this.list.data)):null,this.view=this.list.view?JSON.parse(JSON.stringify(this.list.view)):null},mounted(){},template:'\n \n \n '},Se={components:{BsModal:s},props:{timeout:{type:Number,default:300}},data:()=>({t:null,state:0}),methods:{show(){switch(this.state){case 0:return this.timeout?(this.state=1,void(this.t=window.setTimeout(()=>this.$refs.modal.show(),this.timeout))):this.$refs.modal.show();case 4:return window.setTimeout(()=>this.show(),1)}},hide(){switch(this.state){case 1:return window.clearTimeout(this.t);case 2:return window.setTimeout(()=>this.hide(),1);case 3:this.$refs.modal.hide()}}},mounted(){this.$refs.modal.$refs.modal.addEventListener("show.bs.modal",()=>{this.state=2}),this.$refs.modal.$refs.modal.addEventListener("shown.bs.modal",()=>{this.state=3}),this.$refs.modal.$refs.modal.addEventListener("hide.bs.modal",()=>{this.state=4}),this.$refs.modal.$refs.modal.addEventListener("hidden.bs.modal",()=>{this.state=0})},template:'\n\t\n\t\tLoading...\n\t'},Te={components:{BsModal:s,Alert:r,EditProfilSelect:$e,Loader:Se},mixins:[s],props:{isMitarbeiter:{type:Boolean,default:!1},value:Object,titel:String,zustelladressenCount:Function,zustellkontakteCount:Function,onHideBsModal:Function,onHiddenBsModal:Function,onHidePreventedBsModal:Function,onShowBsModal:Function,onShownBsModal:Function},data(){return{topic:null,profilUpdate:null,editData:this.value,fileID:null,breadcrumb:null,loading:!1,result:!1,info:null}},inject:["setLoading"],provide(){return{updateFileID:this.updateFileIDFunction,isMitarbeiter:this.isMitarbeiter}},methods:{updateFileIDFunction:function(t){this.fileID=t},handleFailedError:function(t){console.error(t),this.loading=!1,this.setLoading(!1),this.result=!1,this.hide()},async submitProfilChange(){if(this.topic&&this.profilUpdate){if(this.fileID){const t=await this.uploadFiles(this.fileID);this.fileID=t||null}const t=t=>{t.data.error?(this.result=!1,r.popup("Ein Fehler ist aufgetreten: "+JSON.stringify(t.data.retval))):(this.result=!0,r.popup("Ihre Anfrage wurde erfolgreich gesendet. Bitte warten Sie, während sich das Team um Ihre Anfrage kümmert."))};this.loading=!0,this.setLoading(!0),this.editData.updateID?this.$api.call(_e.updateProfilRequest(this.topic,this.profilUpdate,this.editData.updateID,this.fileID?this.fileID[0]:null)).then(e=>{t(e)}).catch(t=>this.$fhcAlert.handleSystemError).finally(()=>{this.loading=!1,this.setLoading(!1),this.hide()}):this.$api.call(_e.insertProfilRequest(this.topic,this.profilUpdate,this.fileID?this.fileID[0]:null)).then(e=>{t(e)}).catch(t=>this.$fhcAlert.handleSystemError).finally(()=>{this.loading=!1,this.setLoading(!1),this.hide()})}},uploadFiles:async function(t){if("application/x.fhc-dms+json"!==t[0].type){let e=new FormData;e.append("files[]",t[0]);return this.editData.updateID?await this.$api.call(_e.insertFile(e,this.editData.updateID)).then(t=>t.data?.map(t=>t.dms_id)):await this.$api.call(_e.insertFile(e)).then(t=>t.data?.map(t=>t.dms_id))}return!1}},computed:{showFooter:function(){switch(this.value.view){case"Status":case"Kontakt":case"Adresse":return!1;default:return!0}}},created(){this.editData.topic&&(this.topic=this.editData.topic)},mounted(){this.modal=this.$refs.modalContainer.modal},popup(t){return s.popup.bind(this),s.popup(null,t)},template:'\n\n\t\n\t\n\t\x3c!-- optional footer --\x3e\n\t\n \x3c!-- end of optional footer --\x3e \n'},ze={components:{EditProfil:Te},props:{data:{type:Object}},inject:["getZustellkontakteCount","getZustelladressenCount","profilUpdateStates","profilUpdateTopic"],emits:["fetchUpdates"],data(){return{showUpdateModal:!1,content:null,editProfilTitle:this.$p.t("profil","profilBearbeiten")}},methods:{hideEditProfilModal:function(){this.$refs.updateEditModal.result&&this.$emit("fetchUpdates"),this.showUpdateModal=!1},async showEditProfilModal(t){let e=this.getView(t.topic,t.status),n=null,a=null,i=null,s=!1;if("TextInputDokument"===e){n={titel:t.topic,value:t.requested_change.value};i=await this.$api.call(_e.getProfilRequestFiles(t.profil_update_id)).then(t=>t.data),i&&(s=!0)}else n=t.requested_change;if(a={updateID:t.profil_update_id,view:e,data:n,withFiles:s,topic:t.topic,files:i},"EditAdresse"===e){const e=await this.$api.call(we.isMitarbeiter(t.uid)).then(t=>t.data);e&&(a.isMitarbeiter=e);i=await this.$api.call(_e.getProfilRequestFiles(t.profil_update_id)).then(t=>t.data),a.files=i}t.status!==this.profilUpdateStates.Pending&&(a.status=t.status,a.status_message=t.status_message,a.status_timestamp=t.status_timestamp),this.content=a,this.editProfilTitle=t.topic,a&&(this.showUpdateModal=!0,Vue.nextTick(()=>{this.$refs.updateEditModal.show()}))},deleteRequest:function(t){this.$api.call(_e.deleteProfilRequest(t.profil_update_id)).then(t=>{t.data.error?console.error("error happened",t.data):this.$emit("fetchUpdates")})},getView:function(t,e){if(e!==this.profilUpdateStates.Pending)return"Status";switch(t){case this.profilUpdateTopic["Private Kontakte"]:case this.profilUpdateTopic["Add Kontakt"]:return"EditKontakt";case this.profilUpdateTopic["Delete Kontakt"]:return"Kontakt";case this.profilUpdateTopic["Private Adressen"]:case this.profilUpdateTopic["Add Adresse"]:return"EditAdresse";case this.profilUpdateTopic["Delete Adresse"]:return"Adresse";default:return"TextInputDokument"}}},created(){},computed:{},template:'\n
    \n \n
    {{$p.t(\'profilUpdate\',\'profilUpdates\')}}
    \n
    \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    {{$p.t(\'profilUpdate\',\'topic\')}}{{$p.t(\'global\',\'status\')}}{{$p.t(\'global\',\'datum\')}}{{$p.t(\'ui\',\'aktion\')}}
    {{item.topic}}{{item.status}}{{item.status_timestamp?item.status_timestamp:item.insertamum}}
    \n
    \n
    \n
    \n'};function De(t,e,n){let a=document.createElement("div"),i=null,s=t.getValue();if(Array.isArray(s)){const t=s[0]?new Date(s[0]):null,e=s[1]?new Date(s[1]):null;i=[t,e]}return Vue.createApp({components:{PrimevueCalendar:primevue.calendar},data:()=>({val:i}),watch:{val(t){n(t)}},template:'\n\t\t\t\t '}).use(primevue.config.default).mount(a),a}primevue||console.error("PrimeVue not loaded!"),Tabulator.extendModule("filter","filters",{dates:(t,e)=>{if(!t)return!0;let n=new Date(e);if(Array.isArray(t)){let e=new Date(t[0]);if(t[1]){let a=new Date(t[1]);return a.setHours(23,59,59,999),n>=e&&n<=a}return n.toDateString()===e.toDateString()}let a=new Date(t);return n.toDateString()===a.toDateString()}});var Ee={components:{CoreFilterCmpt:pe,Mailverteiler:he,AusweisStatus:me,QuickLinks:ge,Adresse:fe,Kontakt:be,ProfilEmails:ve,RoleInformation:ye,ProfilInformation:Ae,FetchProfilUpdates:ze,EditProfil:Te},inject:["sortProfilUpdates","collapseFunction","language","isEditable"],data(){return{showModal:!1,collapseIconBetriebsmittel:!0,editDataFilter:null,preloadedPhrasen:{},zutrittsgruppen_table_options:{persistenceID:"filterTableStudentProfilZutrittsgruppen",persistence:{columns:!1},minHeight:200,layout:"fitColumns",columns:[{title:Vue.computed(()=>this.preloadedPhrasen.zutrittsGruppenPhrase),field:"bezeichnung"}]},betriebsmittel_table_options:{persistenceID:"filterTableStudentProfilBetriebsmittel",persistence:{columns:!1},minHeight:300,layout:"fitColumns",responsiveLayout:"collapse",responsiveLayoutCollapseUseFormatters:!1,responsiveLayoutCollapseFormatter:Vue.$collapseFormatter,columns:[{title:"",field:"collapse",headerSort:!1,headerFilter:!1,formatter:"responsiveCollapse",maxWidth:40,headerClick:this.collapseFunction},{title:Vue.computed(()=>this.preloadedPhrasen.entlehnteBetriebsmittelPhrase),field:"betriebsmittel",headerFilter:!0,minWidth:200,visible:!0},{title:Vue.computed(()=>this.preloadedPhrasen.inventarnummerPhrase),field:"Nummer",headerFilter:!0,resizable:!0,minWidth:200,visible:!0},{title:Vue.computed(()=>this.preloadedPhrasen.ausgabedatum),field:"Ausgegeben_am",headerFilterFunc:"dates",headerFilter:De,minWidth:200,visible:!0,formatter:"datetime",formatterParams:this.datetimeFormatterParams()}]}}},props:{data:Object,editData:Object},provide(){return{studiengang_kz:Vue.computed({get:()=>this.data.studiengang_kz})}},methods:{betriebsmittelTableBuilt:function(){this.$refs.betriebsmittelTable.tabulator.setColumns(this.betriebsmittel_table_options.columns),this.$refs.betriebsmittelTable.tabulator.setData(this.data.mittel)},zutrittsgruppenTableBuilt:function(){this.$refs.zutrittsgruppenTable.tabulator.setColumns(this.zutrittsgruppen_table_options.columns),this.$refs.zutrittsgruppenTable.tabulator.setData(this.data.zuttritsgruppen)},fetchProfilUpdates:function(){this.$api.call(_e.selectProfilRequest()).then(t=>{!t.error&&t&&(this.data.profilUpdates=t.data?.length?t.data.sort(this.sortProfilUpdates):null)})},hideEditProfilModal:function(){this.$refs.editModal.result&&this.$api.call(_e.selectProfilRequest()).then(t=>{!t.error&&t.data?(this.data.profilUpdates=t.data,this.data.profilUpdates.sort(this.sortProfilUpdates)):console.error("Error when fetching profile updates: "+t)}).catch(t=>{console.error(t)}),this.showModal=!1,this.editDataFilter=null},showEditProfilModal(t){t&&(this.editDataFilter=t),this.showModal=!0,Vue.nextTick(()=>{this.$refs.editModal.show()})},datetimeFormatterParams:function(){return{inputFormat:"yyyy-MM-dd",outputFormat:"dd.MM.yyyy",invalidPlaceholder:"(invalid date)",timezone:FHC_JS_DATA_STORAGE_OBJECT.timezone}}},computed:{fotoStatus(){return this.data?.fotoStatus??null},filteredEditData(){return this.editDataFilter?this.editData.data[this.editDataFilter]:this.editData},profilInformation(){return this.data?{Vorname:this.data.vorname,Nachname:this.data.nachname,Username:this.data.username,Anrede:this.data.anrede,Titel:this.data.titel,Postnomen:this.data.postnomen,foto_sperre:this.data.foto_sperre,foto:this.data.foto}:{}},roleInformation(){return this.data?{geburtsdatum:{label:`${this.$p.t("profil","Geburtsdatum")}`,value:this.data.gebdatum},geburtsort:{label:`${this.$p.t("profil","Geburtsort")}`,value:this.data.gebort},personenkennzeichen:{label:`${this.$p.t("person","personenkennzeichen")}`,value:this.data.personenkennzeichen},studiengang:{label:`${this.$p.t("lehre","studiengang")}`,value:this.data.studiengang},semester:{label:`${this.$p.t("lehre","semester")}`,value:this.data.semester},verband:{label:`${this.$p.t("lehre","lehrverband")}`,value:this.data.verband},gruppe:{label:`${this.$p.t("lehre","gruppe")}`,value:this.data.gruppe.trim()}}:{}}},created(){this.$p.loadCategory("profil").then(()=>{this.preloadedPhrasen.zutrittsGruppenPhrase=this.$p.t("profil/zutrittsGruppen"),this.preloadedPhrasen.entlehnteBetriebsmittelPhrase=this.$p.t("profil/entlehnteBetriebsmittel"),this.preloadedPhrasen.inventarnummerPhrase=this.$p.t("profil/inventarnummer"),this.preloadedPhrasen.ausgabedatum=this.$p.t("profil/ausgabedatum"),this.preloadedPhrasen.loaded=!0}),this.data.profilUpdates?.sort(this.sortProfilUpdates)},watch:{"language.value"(t){this.$refs.betriebsmittelTable&&this.$refs.betriebsmittelTable.tabulator.setColumns(this.betriebsmittel_table_options.columns),this.$refs.zutrittsgruppenTable&&this.$refs.zutrittsgruppenTable.tabulator.setColumns(this.zutrittsgruppen_table_options.columns)}},template:'\n
    \n \n \x3c!-- ROW --\x3e\n
    \n \x3c!-- HIDDEN QUICK LINKS --\x3e\n
    \n \x3c!--TODO: uncomment when implemented\n\t\t\t
    \n
    \n \n
    \n
    --\x3e\n\n\t\t\t\x3c!-- Bearbeiten Button --\x3e\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\x3c!-- MOBILE PROFIL UPDATES --\x3e\n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t
    \n\t\t\t\x3c!-- END OF HIDDEN QUCK LINKS --\x3e\n\n\t\t\t\x3c!-- MAIN PANNEL --\x3e\n\t\t\t
    \n\t\t\t\t\x3c!-- ROW WITH PROFIL IMAGE AND INFORMATION --\x3e\n\t\t\t\t\x3c!-- INFORMATION CONTENT START --\x3e\n\t\t\t\t\x3c!-- ROW WITH THE PROFIL INFORMATION --\x3e\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\x3c!-- PROFIL INFORMATION --\x3e\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\x3c!-- STUDENT INFO --\x3e\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\x3c!-- START OF SECOND PROFIL INFORMATION COLUMN --\x3e\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\x3c!-- EMAILS --\x3e\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\x3c!-- PRIVATE KONTAKTE--\x3e\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t\t{{$p.t(\'profil\',\'privateKontakte\')}}\n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\x3c!-- PRIVATE ADRESSEN--\x3e\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t\t{{$p.t(\'profil\',\'privateAdressen\')}}\n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t
    \n\t\t\t\x3c!-- SECOND ROW UNDER THE PROFIL IMAGE AND INFORMATION WITH THE TABLES --\x3e\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\x3c!-- END OF MAIN CONTENT COL --\x3e\n\t\t
    \n\t\t\x3c!-- START OF SIDE PANEL --\x3e\n\t\t
    \n\t\t\t\x3c!--TODO: uncomment when implemented\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    --\x3e\n\t\t\t\x3c!-- Bearbeiten Button --\x3e\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\x3c!-- PROFIL UPDATES --\x3e\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t\x3c!-- START OF THE SECOND ROW IN THE SIDE PANEL --\x3e\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\x3c!-- HIER SIND DIE MAILVERTEILER --\x3e\n\t\t\t\t\t\n\t\t\t\t
    \n \x3c!-- END OF THE SECOND ROW IN THE SIDE PANEL --\x3e\n
    \n \x3c!-- END OF SIDE PANEL --\x3e\n
    \n \x3c!-- END OF CONTAINER ROW--\x3e\n
    \n\x3c!-- END OF CONTAINER --\x3e\n
    \n'},Ce={components:{CoreFilterCmpt:pe,EditProfil:Te,Adresse:fe,Kontakt:be,FetchProfilUpdates:ze,AusweisStatus:me,Mailverteiler:he,QuickLinks:ge,ProfilEmails:ve,RoleInformation:ye,ProfilInformation:Ae},inject:["sortProfilUpdates","collapseFunction","language","isEditable"],data(){return{showModal:!1,editDataFilter:null,preloadedPhrasen:{},funktionen_table_options:{persistenceID:"filterTableMaProfilFunktionen",persistence:{columns:!1},minHeight:300,layout:"fitColumns",responsiveLayout:"collapse",responsiveLayoutCollapseUseFormatters:!1,responsiveLayoutCollapseFormatter:Vue.$collapseFormatter,columns:[{title:"",field:"collapse",headerSort:!1,headerFilter:!1,formatter:"responsiveCollapse",maxWidth:40,headerClick:this.collapseFunction,visible:!0},{title:Vue.computed(()=>this.preloadedPhrasen.bezeichnungPhrase),field:"Bezeichnung",headerFilter:!0,minWidth:200,visible:!0},{title:Vue.computed(()=>this.preloadedPhrasen.organisationseinheitPhrase),field:"Organisationseinheit",headerFilter:!0,minWidth:200,visible:!0},{title:Vue.computed(()=>this.preloadedPhrasen.gueltigVonPhrase),field:"Gültig_von",headerFilterFunc:"dates",headerFilter:De,resizable:!0,minWidth:200,visible:!0,formatter:"datetime",formatterParams:this.datetimeFormatterParams()},{title:Vue.computed(()=>this.preloadedPhrasen.gueltigBisPhrase),field:"Gültig_bis",headerFilterFunc:"dates",headerFilter:De,resizable:!0,minWidth:200,visible:!0,formatter:"datetime",formatterParams:this.datetimeFormatterParams()},{title:Vue.computed(()=>this.preloadedPhrasen.wochenstundenPhrase),field:"Wochenstunden",headerFilter:!0,minWidth:200,visible:!0}]},betriebsmittel_table_options:{persistenceID:"filterTableMaProfilBetriebsmittel",persistence:{columns:!1},minHeight:300,layout:"fitColumns",responsiveLayout:"collapse",responsiveLayoutCollapseUseFormatters:!1,responsiveLayoutCollapseFormatter:Vue.$collapseFormatter,data:[{betriebsmittel:"",Nummer:"",Ausgegeben_am:""}],columns:[{title:"",field:"collapse",headerSort:!1,headerFilter:!1,formatter:"responsiveCollapse",maxWidth:40,headerClick:this.collapseFunction,visible:!0},{title:Vue.computed(()=>this.preloadedPhrasen.entlehnteBetriebsmittelPhrase),field:"betriebsmittel",headerFilter:!0,minWidth:200,visible:!0},{title:Vue.computed(()=>this.preloadedPhrasen.inventarnummerPhrase),field:"Nummer",headerFilter:!0,resizable:!0,minWidth:200,visible:!0},{title:Vue.computed(()=>this.preloadedPhrasen.ausgabedatumPhrase),field:"Ausgegeben_am",headerFilterFunc:"dates",headerFilter:De,minWidth:200,visible:!0,formatter:"datetime",formatterParams:this.datetimeFormatterParams()}]}}},props:{data:Object,editData:Object},methods:{betriebsmittelTableBuilt:function(){this.$refs.betriebsmittelTable.tabulator.setColumns(this.betriebsmittel_table_options.columns),this.$refs.betriebsmittelTable.tabulator.setData(this.data.mittel)},funktionenTableBuilt:function(){this.$refs.funktionenTable.tabulator.setColumns(this.funktionen_table_options.columns),this.$refs.funktionenTable.tabulator.setData(this.data.funktionen)},hideEditProfilModal:function(){this.$refs.editModal.result&&this.$api.call(_e.selectProfilRequest()).then(t=>{!t.error&&t.data?(this.data.profilUpdates=t.data,this.data.profilUpdates.sort(this.sortProfilUpdates)):console.error("Error when fetching profile updates: "+t)}).catch(t=>{console.error(t)}),this.showModal=!1,this.editDataFilter=null},showEditProfilModal(t){t&&(this.editDataFilter=t),this.showModal=!0,Vue.nextTick(()=>{this.$refs.editModal.show()})},fetchProfilUpdates:function(){this.$api.call(_e.selectProfilRequest()).then(t=>{!t.error&&t&&(this.data.profilUpdates=t.data?.length?t.data.sort(this.sortProfilUpdates):null)})},setTableColumnTitles(){this.$refs.betriebsmittelTable&&this.$refs.betriebsmittelTable.tabulator.setColumns(this.betriebsmittel_table_options.columns),this.$refs.funktionenTable&&this.$refs.funktionenTable.tabulator.setColumns(this.funktionen_table_options.columns)},datetimeFormatterParams:function(){return{inputFormat:"yyyy-MM-dd",outputFormat:"dd.MM.yyyy",invalidPlaceholder:"(invalid date)",timezone:FHC_JS_DATA_STORAGE_OBJECT.timezone}}},computed:{fotoStatus(){return this.data?.fotoStatus??null},getTelefonValue(){return this.data.standort_telefon?.kontakt?this.data.standort_telefon.kontakt+" "+this.data.telefonklappe:this.data.standort_telefon?this.data.standort_telefon+" "+this.data.telefonklappe:this.data.telefonklappe},filteredEditData(){return this.editDataFilter?this.editData.data[this.editDataFilter]:this.editData},profilInformation(){return this.data?{Vorname:this.data.vorname,Nachname:this.data.nachname,Username:this.data.username,Anrede:this.data.anrede,Titel:this.data.titel,Postnomen:this.data.postnomen,foto_sperre:this.data.foto_sperre,foto:this.data.foto}:{}},roleInformation(){return this.data?{geburtsdatum:{label:`${this.$p.t("profil","Geburtsdatum")}`,value:this.data.gebdatum},geburtsort:{label:`${this.$p.t("profil","Geburtsort")}`,value:this.data.gebort},personenkennzeichen:{label:`${this.$p.t("profil","Kurzzeichen")}`,value:this.data.kurzbz},telefon:{label:`${this.$p.t("profil","Telefon")}`,value:this.getTelefonValue},office:{label:`${this.$p.t("profil","Büro")}`,value:this.data.ort_kurzbz}}:{}}},created(){this.$p.loadCategory(["ui","lehre","global","profil"]).then(()=>{this.preloadedPhrasen.bezeichnungPhrase=this.$p.t("ui/bezeichnung"),this.preloadedPhrasen.organisationseinheitPhrase=this.$p.t("lehre/organisationseinheit"),this.preloadedPhrasen.gueltigVonPhrase=this.$p.t("global/gueltigVon"),this.preloadedPhrasen.gueltigBisPhrase=this.$p.t("global/gueltigBis"),this.preloadedPhrasen.wochenstundenPhrase=this.$p.t("profil/wochenstunden"),this.preloadedPhrasen.entlehnteBetriebsmittelPhrase=this.$p.t("profil/entlehnteBetriebsmittel"),this.preloadedPhrasen.inventarnummerPhrase=this.$p.t("profil/inventarnummer"),this.preloadedPhrasen.ausgabedatumPhrase=this.$p.t("profil/ausgabedatum"),this.preloadedPhrasen.loaded=!0}),this.data.profilUpdates?.sort(this.sortProfilUpdates)},watch:{"data.funktionen"(t){this.$refs.funktionenTable&&this.$refs.funktionenTable.tabulator.setData(t)},"data.mittel"(t){this.$refs.betriebsmittelTable&&this.$refs.betriebsmittelTable.tabulator.setData(t)},"language.value"(t){this.setTableColumnTitles()}},template:'\n
    \n \n
    \n
    \n \x3c!--TODO: uncomment when implemented\n
    \n
    \n \n
    \n
    --\x3e\n \x3c!-- Bearbeiten Button --\x3e\n
    \n
    \n \n
    \n
    \n
    \n
    \n \x3c!-- MOBILE PROFIL UPDATES --\x3e\n \n
    \n
    \n
    \n \x3c!-- END OF HIDDEN ROW (HIDDEN IN VIEWPORTS GREATER THEN-EQUAL MD) --\x3e\n \x3c!-- MAIN PANNEL --\x3e\n
    \n \x3c!-- ROW WITH PROFIL IMAGE AND INFORMATION --\x3e\n \x3c!-- INFORMATION CONTENT START --\x3e\n \x3c!-- ROW WITH THE PROFIL INFORMATION --\x3e\n
    \n
    \n
    \n
    \n \x3c!-- PROFIL INFORMATION --\x3e\n \n
    \n
    \n
    \n
    \n \x3c!-- MITARBEITER INFO --\x3e\n \n
    \n
    \n \x3c!-- START OF SECOND PROFIL INFORMATION COLUMN --\x3e\n
    \n
    \n
    \n
    \n \x3c!-- EMAILS --\x3e\n \n
    \n
    \n
    \n
    \n \x3c!-- PRIVATE KONTAKTE--\x3e\n
    \n
    \n
    \n
    \n \n
    \n
    \n {{$p.t(\'profil\',\'privateKontakte\')}}\n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \x3c!-- PRIVATE ADRESSEN--\x3e\n
    \n
    \n
    \n
    \n \n
    \n
    \n {{$p.t(\'profil\',\'privateAdressen\')}}\n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \x3c!-- FUNKTIONEN TABELLE --\x3e\n \n
    \n
    \n \x3c!-- BETRIEBSMITTEL TABELLE --\x3e\n \n
    \n
    \n
    \n \x3c!-- START OF SIDE PANEL --\x3e\n
    \n \x3c!--TODO: uncomment when implemented\n
    \n \n
    \n \n \n \n \n \n
    \n
    --\x3e\n \x3c!-- Bearbeiten Button --\x3e\n
    \n
    \n \n
    \n
    \n
    \n
    \n \x3c!-- PROFIL UPDATES --\x3e\n \n
    \n
    \n
    \n
    \n \x3c!-- AUSWEIS STATUS --\x3e\n \n
    \n
    \n
    \n
    \n \x3c!-- MAILVERTEILER --\x3e\n \n
    \n
    \n
    \n
    \n
    \n\n \n '},Oe={data:()=>({}),components:{QuickLinks:ge,Mailverteiler:he,ProfilEmails:ve,RoleInformation:ye,ProfilInformation:Ae},props:["data"],provide(){return{studiengang_kz:Vue.computed({get:()=>this.data.studiengang_kz})}},methods:{},computed:{fotoStatus(){return this.data?.fotoStatus??null},profilInformation(){return this.data?{Vorname:this.data.vorname,Nachname:this.data.nachname,Username:this.data.username,Anrede:this.data.anrede,Titel:this.data.titel,Postnomen:this.data.postnomen,foto_sperre:this.data.foto_sperre,foto:this.data.foto}:{}},personEmails(){return this.data?.emails?this.data.emails:[]},roleInformation(){return this.data?{geburtsdatum:{label:`${this.$p.t("profil","Geburtsdatum")}`,value:this.data.gebdatum},geburtsort:{label:`${this.$p.t("profil","Geburtsort")}`,value:this.data.gebort},personenkennzeichen:{label:`${this.$p.t("person","personenkennzeichen")}`,value:this.data.personenkennzeichen},studiengang:{label:`${this.$p.t("lehre","studiengang")}`,value:this.data.studiengang},semester:{label:`${this.$p.t("lehre","semester")}`,value:this.data.semester},verband:{label:`${this.$p.t("lehre","lehrverband")}`,value:this.data.verband},gruppe:{label:`${this.$p.t("lehre","gruppe")}`,value:this.data.gruppe.trim()}}:{}}},mounted(){},template:' \n\n
    \n \x3c!-- ROW --\x3e \n
    \n \x3c!-- HIDDEN QUICK LINKS --\x3e\n \x3c!-- uncomment when implemented\n
    \n \n \n \n
    --\x3e\n \x3c!-- END OF HIDDEN QUCK LINKS --\x3e\n \x3c!-- MAIN PANNEL --\x3e\n
    \n \x3c!-- ROW WITH PROFIL IMAGE AND INFORMATION --\x3e\n \x3c!-- INFORMATION CONTENT START --\x3e\n \x3c!-- ROW WITH THE PROFIL INFORMATION --\x3e \n
    \n \x3c!-- FIRST KAESTCHEN --\x3e\n
    \n
    \n
    \n \n
    \n
    \n \x3c!-- START OF SECOND PROFIL INFORMATION COLUMN --\x3e\n \x3c!-- END OF PROFIL INFORMATION ROW --\x3e\n \x3c!-- INFORMATION CONTENT END --\x3e\n
    \n
    \n
    \n
    \n \x3c!-- EMAILS --\x3e\n \n
    \n
    \n \x3c!-- SECOND ROW OF SECOND COLUMN IN MAIN CONTENT --\x3e\n
    \n
    \n \n
    \n
    \n \x3c!-- END OF SECOND ROW OF SECOND COLUMN IN MAIN CONTENT --\x3e\n \x3c!-- END OF THE SECOND INFORMATION COLUMN --\x3e\n
    \n \x3c!-- START OF THE SECOND PROFIL INFORMATION ROW --\x3e \n \x3c!-- ROW WITH PROFIL IMAGE AND INFORMATION END --\x3e\n
    \n \x3c!-- END OF MAIN CONTENT COL --\x3e\n
    \n \x3c!-- START OF SIDE PANEL --\x3e\n
    \n \x3c!-- SRART OF QUICK LINKS IN THE SIDE PANEL --\x3e\n \x3c!-- START OF THE FIRDT ROW IN THE SIDE PANEL --\x3e\n \x3c!-- THESE QUCK LINKS ARE ONLY VISIBLE UNTIL VIEWPORT MD --\x3e\n \x3c!--TODO: uncomment when implemented\n
    \n
    \n \n \n \n
    \n
    --\x3e\n \x3c!-- START OF THE SECOND ROW IN THE SIDE PANEL --\x3e\n
    \n
    \n \x3c!-- HIER SIND DIE MAILVERTEILER --\x3e\n \n
    \n \x3c!-- END OF THE SECOND ROW IN THE SIDE PANEL --\x3e\n
    \n \x3c!-- END OF SIDE PANEL --\x3e\n
    \n \x3c!-- END OF CONTAINER ROW--\x3e\n
    \n \x3c!-- END OF CONTAINER --\x3e\n
    \n '},Fe={components:{CoreFilterCmpt:pe,Mailverteiler:he,QuickLinks:ge,RoleInformation:ye,ProfilEmails:ve,ProfilInformation:Ae},inject:["collapseFunction","language"],data(){return{collapseIconFunktionen:!0,preloadedPhrasen:{},funktionen_table_options:{persistenceID:"filterTableMaViewProfilFunktionen",persistence:{columns:!1},minHeight:300,layout:"fitColumns",responsiveLayout:"collapse",responsiveLayoutCollapseUseFormatters:!1,responsiveLayoutCollapseFormatter:Vue.$collapseFormatter,columns:[{title:"",field:"collapse",headerSort:!1,headerFilter:!1,formatter:"responsiveCollapse",maxWidth:40,headerClick:this.collapseFunction,visible:!0},{title:Vue.computed(()=>this.$p.t("ui/bezeichnung")),field:"Bezeichnung",headerFilter:!0,minWidth:200,visible:!0},{title:Vue.computed(()=>this.$p.t("lehre/organisationseinheit")),field:"Organisationseinheit",headerFilter:!0,minWidth:200,visible:!0},{title:Vue.computed(()=>this.$p.t("global/gueltigVon")),field:"Gültig_von",headerFilterFunc:"dates",headerFilter:De,resizable:!0,minWidth:200,visible:!0,formatter:"datetime",formatterParams:this.datetimeFormatterParams()},{title:Vue.computed(()=>this.$p.t("global/gueltigBis")),field:"Gültig_bis",headerFilterFunc:"dates",headerFilter:De,resizable:!0,minWidth:200,visible:!0,formatter:"datetime",formatterParams:this.datetimeFormatterParams()},{title:Vue.computed(()=>this.$p.t("profil/wochenstunden")),field:"Wochenstunden",headerFilter:!0,minWidth:200,visible:!0}]}}},props:["data"],methods:{funktionenTableBuilt:function(){this.$refs.funktionenTable.tabulator.setData(this.data.funktionen)},datetimeFormatterParams:function(){return{inputFormat:"yyyy-MM-dd",outputFormat:"dd.MM.yyyy",invalidPlaceholder:"(invalid date)",timezone:FHC_JS_DATA_STORAGE_OBJECT.timezone}}},watch:{"data.funktionen"(t){this.$refs.funktionenTable&&this.$refs.funktionenTable.tabulator.setData(t)},"language.value"(t){this.$refs.funktionenTable&&this.$refs.funktionenTable.tabulator.setColumns(this.funktionen_table_options.columns)}},computed:{getTelefonValue(){return this.data.standort_telefon?.kontakt?this.data.standort_telefon.kontakt+" "+this.data.telefonklappe:this.data.standort_telefon?this.data.standort_telefon+" "+this.data.telefonklappe:this.data.telefonklappe},fotoStatus(){return this.data?.fotoStatus??null},personEmails(){return this.data?.emails?this.data.emails:[]},profilInformation(){return this.data?{Vorname:this.data.vorname,Nachname:this.data.nachname,Username:this.data.username,Anrede:this.data.anrede,Titel:this.data.titel,Postnomen:this.data.postnomen,foto_sperre:this.data.foto_sperre,foto:this.data.foto}:{}},roleInformation(){return this.data?{geburtsdatum:{label:`${this.$p.t("profil","Geburtsdatum")}`,value:this.data.gebdatum},geburtsort:{label:`${this.$p.t("profil","Geburtsort")}`,value:this.data.gebort},personenkennzeichen:{label:`${this.$p.t("profil","Kurzzeichen")}`,value:this.data.kurzbz},telefon:{label:`${this.$p.t("profil","Telefon")}`,value:this.getTelefonValue},office:{label:`${this.$p.t("profil","Büro")}`,value:this.data.ort_kurzbz}}:{}}},created(){this.$p.loadCategory(["ui","lehre","global","profil"]).then(()=>{this.preloadedPhrasen.bezeichnungPhrase=this.$p.t("ui/bezeichnung"),this.preloadedPhrasen.organisationseinheitPhrase=this.$p.t("lehre/organisationseinheit"),this.preloadedPhrasen.gueltigVonPhrase=this.$p.t("global/gueltigVon"),this.preloadedPhrasen.gueltigBisPhrase=this.$p.t("global/gueltigBis"),this.preloadedPhrasen.wochenstundenPhrase=this.$p.t("profil/wochenstunden"),this.preloadedPhrasen.loaded=!0})},template:'\n\n
    \n \x3c!-- ROW --\x3e\n
    \n \x3c!-- HIDDEN QUICK LINKS --\x3e\n \x3c!-- TODO: uncomment when implemented\n
    \n\n \n\n
    \n --\x3e\n \x3c!-- END OF HIDDEN QUCK LINKS --\x3e\n \x3c!-- MAIN PANNEL --\x3e\n
    \n \x3c!-- ROW WITH PROFIL IMAGE AND INFORMATION --\x3e\n \x3c!-- INFORMATION CONTENT START --\x3e\n \x3c!-- ROW WITH THE PROFIL INFORMATION --\x3e\n
    \n \x3c!-- FIRST KAESTCHEN --\x3e\n
    \n
    \n
    \n \x3c!-- Profil Informationen --\x3e\n \n
    \n
    \n \x3c!-- START OF SECOND PROFIL INFORMATION COLUMN --\x3e\n \x3c!-- END OF PROFIL INFORMATION ROW --\x3e\n \x3c!-- INFORMATION CONTENT END --\x3e\n
    \n
    \n
    \n
    \n \x3c!-- EMAILS --\x3e\n \n
    \n
    \n \x3c!-- SECOND ROW OF SECOND COLUMN IN MAIN CONTENT --\x3e\n
    \n
    \n \x3c!-- roleInformation --\x3e\n \n
    \n
    \n \x3c!-- END OF SECOND ROW OF SECOND COLUMN IN MAIN CONTENT --\x3e\n \x3c!-- END OF THE SECOND INFORMATION COLUMN --\x3e\n
    \n \x3c!-- START OF THE SECOND PROFIL INFORMATION ROW --\x3e\n \x3c!-- ROW WITH PROFIL IMAGE AND INFORMATION END --\x3e\n
    \n \x3c!-- SECOND ROW UNDER THE PROFIL IMAGE AND INFORMATION WITH THE TABLES --\x3e\n
    \n \x3c!-- FIRST TABLE --\x3e\n
    \n \n
    \n \x3c!-- END OF THE ROW WITH THE TABLES UNDER THE PROFIL INFORMATION --\x3e\n
    \n \x3c!-- END OF MAIN CONTENT COL --\x3e\n
    \n \x3c!-- START OF SIDE PANEL --\x3e\n
    \n \x3c!-- VISIBLE UNTIL VIEWPORT MD --\x3e\n \x3c!--TODO: uncomment when implemented\n
    \n
    \n \n \n \n
    \n
    \n --\x3e\n
    \n
    \n \x3c!-- MAILVERTEILER --\x3e\n \n
    \n
    \n \x3c!-- END OF SIDE PANEL --\x3e\n
    \n \x3c!-- END OF CONTAINER ROW--\x3e\n
    \n \x3c!-- END OF CONTAINER --\x3e\n
    \n'};Vue.$collapseFormatter=function(t){var e=document.createElement("div");e.classList.add("tabulator-collapsed-row"),e.classList.add("text-break");var n=document.createElement("div");return n.classList.add("row"),e.appendChild(n),t.forEach(function(t){let e=document.createElement("div");e.classList.add("col-6");let a=document.createElement("div");a.classList.add("col-6"),e.innerHTML=""+t.title+"",a.innerHTML=t.value?t.value:"-",n.appendChild(e),n.appendChild(a)}),Object.keys(t).length?e:""};const Pe={name:"Profil",components:{StudentProfil:Ee,MitarbeiterProfil:Ce,ViewStudentProfil:Oe,ViewMitarbeiterProfil:Fe,Loading:Se},props:{uid:{type:String,required:!1},viewData:{type:Object}},data(){return{loading:!1,profilUpdateStates:null,profilUpdateTopic:null,view:null,data:null,notFoundUID:null,isEditable:this.viewData.editable??!1}},provide(){return{isEditable:Vue.computed(()=>this.isEditable),profilUpdateStates:Vue.computed(()=>!!this.profilUpdateStates&&this.profilUpdateStates),profilUpdateTopic:Vue.computed(()=>!!this.profilUpdateTopic&&this.profilUpdateTopic),setLoading:t=>{this.loading=t},getZustellkontakteCount:this.zustellKontakteCount,getZustelladressenCount:this.zustellAdressenCount,collapseFunction:(t,e)=>{void 0===this[t.target.id]&&(this[t.target.id]=!0),this[t.target.id]=!this[t.target.id];let n=e._column.cells.map(t=>t.element.children[0]);this[t.target.id]?t.target.classList.replace("fa-angle-up","fa-angle-down"):t.target.classList.replace("fa-angle-down","fa-angle-up"),this[t.target.id]?n.filter(t=>!t.classList.contains("open")).forEach(t=>{t.click()}):n.filter(t=>t.classList.contains("open")).forEach(t=>{t.click()})},sortProfilUpdates:(t,e)=>{let n=0;return n="pending"===t.status.toLowerCase()||"accepted"===t.status.toLowerCase()&&"rejected"===e.status.toLowerCase()?-1:1,t.status===e.status&&(n=new Date(e.insertamum.split(".").reverse().join("-"))-new Date(t.insertamum.split(".").reverse().join("-"))),n}}},methods:{async load(){await this.$api.call(_e.getStatus()).then(t=>{this.profilUpdateStates=t.data}).catch(t=>{console.error(t)}),this.$api.call(_e.getTopic()).then(t=>{this.profilUpdateTopic=t.data}).catch(t=>{console.error(t)}),this.$api.call(we.profilViewData(this.$route.params.uid??null)).then(t=>t.data).then(t=>{this.view=t?.profil_data.view,this.data=t?.profil_data.data,this.isEditable=t?.editable??!1}).catch(t=>{console.error(t)})},zustellAdressenCount(){if(!this.data||!this.data.adressen)return null;let t=[];return this.data.profilUpdates?.length&&(t=t.concat(this.data.profilUpdates.filter(t=>t.requested_change.zustelladresse).map(t=>t.requested_change.adresse_id))),this.data.profilUpdates?.length&&this.data.adressen.filter(t=>t.zustelladresse).every(t=>this.data.profilUpdates.some(e=>e.requested_change.adresse_id==t.adresse_id))||(t=t.concat(this.data.adressen.filter(t=>t.zustelladresse).map(t=>t.adresse_id))),[...new Set(t)]},zustellKontakteCount(){if(!this.data||!this.data.kontakte)return null;let t=[];return this.data.profilUpdates?.length&&(t=t.concat(this.data.profilUpdates.filter(t=>"Pending"===t.status&&t.requested_change.zustellung).map(t=>({kontakt_id:t.requested_change.kontakt_id,kontakttyp:t.requested_change.kontakttyp})))),this.data.profilUpdates?.length&&this.data.kontakte.filter(t=>t.zustellung).every(t=>this.data.profilUpdates.some(e=>"Pending"===e.status&&e.requested_change.kontakt_id==t.kontakt_id))||(t=t.concat(this.data.kontakte.filter(t=>t.zustellung).map(t=>({kontakt_id:t.kontakt_id,kontakttyp:t.kontakttyp})))),[...new Set(t)]}},computed:{filteredEditData(){if(this.data)return{view:null,data:{Personen_Informationen:{title:this.$p.t("profil","personenInformationen"),topic:"Personen_informationen",view:null,data:{vorname:{title:this.$p.t("person","vorname"),topic:this.profilUpdateTopic?.Vorname,view:"TextInputDokument",withFiles:!0,data:{titel:"vorname",value:this.data.vorname}},nachname:{title:this.$p.t("person","nachname"),topic:this.profilUpdateTopic?.Nachname,view:"TextInputDokument",withFiles:!0,data:{titel:"nachname",value:this.data.nachname}},titel:{title:this.$p.t("global","titel"),topic:this.profilUpdateTopic?.Titel,view:"TextInputDokument",withFiles:!0,data:{titel:"titel",value:this.data.titel}},postnomen:{title:this.$p.t("profil","postnomen"),topic:this.profilUpdateTopic?.Postnomen,view:"TextInputDokument",withFiles:!0,data:{titel:"postnomen",value:this.data.postnomen}}}},Private_Kontakte:{title:this.$p.t("profil","privateKontakte"),topic:this.profilUpdateTopic?.["Private Kontakte"],data:this.data.kontakte?.filter(t=>!this.data.profilUpdates?.some(e=>e.status===this.profilUpdateStates.Pending&&e.requested_change?.kontakt_id===t.kontakt_id)).map(t=>({listview:"Kontakt",view:"EditKontakt",data:t}))},Private_Adressen:{title:this.$p.t("profil","privateAdressen"),topic:this.profilUpdateTopic?.["Private Adressen"],data:this.data.adressen?.filter(t=>!this.data.profilUpdates?.some(e=>e.status===this.profilUpdateStates.Pending&&e.requested_change?.adresse_id==t.adresse_id)).map(t=>({listview:"Adresse",view:"EditAdresse",data:t}))}}}}},watch:{loading:function(t){t?this.$refs.loadingModalRef.show():this.$refs.loadingModalRef.hide()},uid(t,e){this.load()}},created(){this.load()},template:'\n\t
    \n\t\t
    \n\t\t\t

    Es wurde keine Person mit der UID {{this.notFoundUID}} gefunden

    \n\t\t
    \n\t\t
    \n \n \n\t\t
    \n\t
    '};var Ie={getContentID:t=>({method:"get",url:"/api/frontend/v1/Ort/ContentID",params:{ort_kurzbz:t}}),getRooms:(t,e,n,a,i=0)=>({method:"get",url:"/api/frontend/v1/Ort/getRooms",params:{datum:t,von:e,bis:n,typ:a,personenanzahl:i}}),getRoomTypes:()=>({method:"get",url:"/api/frontend/v1/Ort/getTypes",params:{}})};const Me={name:"Raumsuche",props:{},components:{VueDatePicker:i,CoreFilterCmpt:pe,InputNumber:primevue.inputnumber},data(){return{phrasenPromise:null,phrasenResolved:!1,tabulatorUuid:Vue.ref(0),tableBuiltResolve:null,tableBuiltPromise:null,roomtypes:null,defaultType:{raumtyp_kurzbz:"",beschreibung:Vue.computed(()=>this.$p.t("global/alle"))},anzahl:1,selectedType:null,datum:new Date,von:Vue.ref({hours:(new Date).getHours(),minutes:(new Date).getMinutes()}),bis:Vue.ref({hours:(new Date).getHours()+1,minutes:(new Date).getMinutes()}),datepickerTextInputOptions:{enterSubmit:!0,tabSubmit:!0,selectOnFocus:!0,format:"dd.MM.yyyy",escClose:!0},timepickerTextInputOptions:{enterSubmit:!0,tabSubmit:!0,selectOnFocus:!0,format:"HH:mm",escClose:!0},raumsucheTableOptions:{height:Vue.ref(400),index:"ort_kurzbz",layout:"fitColumns",placeholder:this.$p.t("global/noDataAvailable"),columns:[{title:Vue.computed(()=>this.$p.t("rauminfo/raum_kurzbz")),field:"ort_kurzbz",widthGrow:1},{title:Vue.computed(()=>this.$p.t("global/bezeichnung")),field:"bezeichnung",widthGrow:2},{title:Vue.computed(()=>this.$p.t("rauminfo/raumnummer")),field:"nummer",widthGrow:1},{title:Vue.computed(()=>this.$p.t("rauminfo/personcap")),field:"personen",widthGrow:1},{title:Vue.computed(()=>this.$p.t("rauminfo/rauminfo")),field:"linkInfo",formatter:this.linkFormatter,widthGrow:1},{title:Vue.computed(()=>this.$p.t("rauminfo/roomReservations")),field:"linkRes",formatter:this.linkFormatter,widthGrow:1}],persistence:!1},raumsucheTableEventHandlers:[{event:"tableBuilt",handler:async()=>{this.tableBuiltResolve()}}]}},methods:{tableResolve(t){this.tableBuiltResolve=t},linkFormatter(t){const e=t.getValue(),n="linkInfo"===t.getField()?this.$p.t("rauminfo/rauminfo"):this.$p.t("rauminfo/roomReservations");return e?'
    ':'
    -
    '},roomPlanLink:t=>FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/CisVue/Cms/getRoomInformation/"+t.ort_kurzbz,roomInfoLink:t=>FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/CisVue/Cms/content/"+t.content_id,getTimeString:t=>`${String(t.hours).padStart(2,"0")}:${String(t.minutes).padStart(2,"0")}`,setupData(t){const e=t.map(t=>({ort_kurzbz:t.ort_kurzbz,bezeichnung:t.bezeichnung.replace("&","&"),nummer:t.planbezeichnung,personen:t.max_person,linkInfo:t.content_id?this.roomInfoLink(t):null,linkRes:this.roomPlanLink(t)}));this.$refs.raumsucheTable.tabulator.setData(e)},loadRoomTypes(){this.$api.call(Ie.getRoomTypes()).then(t=>{t?.data?.forEach(t=>{t.beschreibung=t.beschreibung.replace("&","&")}),this.selectedType=this.defaultType,this.roomtypes=t?.data??[]})},loadRooms(){this.$api.call(Ie.getRooms(this.datum.toISOString(),this.getTimeString(this.von),this.getTimeString(this.bis),this.selectedType?.raumtyp_kurzbz??"",this.anzahl)).then(t=>{t?.data?.retval&&this.setupData(t.data.retval)})},handleUuidDefined(t){this.tabulatorUuid=t},search(){this.loadRooms()},setRoute(t){},dateFormat:t=>`${String(t.getDate()).padStart(2,"0")}.${String(t.getMonth()+1).padStart(2,"0")}.${t.getFullYear()}`,timeFormat:t=>`${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`,async setupMounted(){this.tableBuiltPromise=new Promise(this.tableResolve),await this.tableBuiltPromise,this.loadRoomTypes(),this.loadRooms();const t=this.tabulatorUuid?"-"+this.tabulatorUuid:"",e=document.getElementById("filterTableDataset"+t);if(!e)return;const n=e.getBoundingClientRect(),a=window.visualViewport.height-n.top-100;this.$refs.raumsucheTable&&this.$refs.raumsucheTable.$refs.table.style.setProperty("height",a+"px")}},computed:{isDarkMode(){return"dark"==this.$theme.theme_name.value}},created(){this.phrasenPromise=this.$p.loadCategory(["rauminfo","global"]),this.phrasenPromise.then(()=>{this.phrasenResolved=!0})},mounted(){this.setupMounted()},template:'\n\t

    {{$p.t(\'rauminfo/roomSearch\')}}

    \n\t
    \n\t
    \n\t\t
    \n\t\t\t\n\t\t\t\n\t\t
    \n\t\t
    \n\t\t\t\n\t\t\t\n\t\t
    \n\t\t
    \n\t\t\t\n\t\t\t\n\t\t
    \n\t\t\n\t\t
    \n\t\t\t\n\t\t
    \n\t\t\n\n\t\t
    \n\t\t\t\n\t\t
    \n\t\t
    \n\t\t\t\n\t\t
    \n\t
    \n\t\n\n \n '};var Le={components:{paginator:primevue.paginator},emits:["update:rows"],props:{maxPageCount:{type:Number,default:0},page_size:{type:Number,required:!0}},data:()=>({}),methods:{newPageEvent:function(t){}},mounted(){},template:'\n \t\x3c!-- Desktop --\x3e\n\t
    \n\t\t\n\t\t\n\t
    \n\t\x3c!-- Mobile --\x3e\n\t
    \n\t\t\n\t\t\n\t
    \n '},Re={props:{uid:String,vorname:String,nachname:String,titelpre:String,kontakt:String,telefoneklappe:String,email:String,planbezeichnung:String,foto:String,displayWidget:{type:Boolean,default:!1}},template:'\n\t
    \n\t\t
    \n\t\t\tmitarbeiter_foto\n\t\t
    \n\t\t
    \n\t\t\t
    {{fullname}}
    \n\t\t
    \n\t\t
    \n\t\t
    \n\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t
    {{phone.number}}
    \n\n\t\t\t\t
    \n\t\t\t\t
    {{ort}}
    \n\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t
    \n\n\t\t
    \n\t
    \n\t',computed:{formattedEmail:function(){if(!this.email)return null;let t=this.email.replace("mailto:","").split("@");return t[0]+"@"+t[1]},fullname:function(){return this.titelpre&&this.vorname&&this.nachname?`${this.titelpre} ${this.vorname} ${this.nachname}`:this.vorname&&this.nachname?`${this.vorname} ${this.nachname}`:this.nachname?this.vorname:null},phone:function(){return this.kontakt&&this.telefoneklappe?{link:"tel:".concat(this.kontakt).concat(" "+this.telefoneklappe),number:this.kontakt.concat(" "+this.telefoneklappe)}:this.kontakt?{link:"tel:".concat(this.kontakt),number:this.kontakt}:null},email_link:function(){return this.email?"mailto:".concat(this.email):null},base64Image:function(){return this.foto?"data:image/png;base64,".concat(this.foto):null},ort:function(){return this.planbezeichnung??null},profilViewLink:function(){return this.uid?FHC_JS_DATA_STORAGE_OBJECT.app_root.concat(FHC_JS_DATA_STORAGE_OBJECT.ci_router).concat("/Cis/Profil/View/").concat(this.uid):null}}},Ne={props:{title:String,vertretungsList:Array,showBezeichnung:Boolean},template:'\n\t
    \n\t\t
    \n\t\t\t{{title}}\n\t\t
    \n\t\t
    \n\t\t\t

    \n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{{vertretungFormatedName(vertretung,false)}}\n\t\t\t

    \n\t\t
    \n\t
    \n\t',methods:{profilViewLink:function(t){return t?FHC_JS_DATA_STORAGE_OBJECT.app_root.concat(FHC_JS_DATA_STORAGE_OBJECT.ci_router).concat("/Cis/Profil/View/").concat(t):null},vertretungFormatedName:function(t){return t?`${t.vorname??""} ${t.nachname??""} ${t.bezeichnung&&this.showBezeichnung?"(".concat(t.bezeichnung.replace("(","").replace(")","")).concat(")"):""}`:null}}},Be={studiengangInformation:()=>({method:"get",url:"/api/frontend/v1/Studgang/getStudiengangInfo"}),getStudiengangByKz:t=>({method:"get",url:"/api/frontend/v1/organisation/StudiengangEP/getStudiengangByKz",params:{studiengang_kz:t}})},je={data:()=>({studiengang:null,semester:null,stg_ltg:null,gf_ltg:null,stv_ltg:null,ass:null,hochschulvertr:null,stdv:null,jahrgangsvertr:null}),props:{displayWidget:{type:Boolean,default:!1}},components:{StudiengangPerson:Re,StudiengangVertretung:Ne},template:'\n\t\t
    \n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t
    \n\t\n',computed:{collection_array:function(){let t=[];return Array.isArray(this.stg_ltg)&&1==this.stg_ltg.length&&Array.isArray(this.ass)&&1==this.ass.length?t.push({title:`${this.$p.t("global","studiengangsleitung")}/${this.$p.t("studiengangInformation","assistenz")}`,collection:[...this.stg_ltg,...this.ass]}):(t.push({title:this.$p.t("global","studiengangsleitung"),collection:this.stg_ltg}),t.push({title:this.$p.t("studiengangInformation","assistenz"),collection:this.ass})),Array.isArray(this.gf_ltg)&&1==this.gf_ltg.length&&Array.isArray(this.stv_ltg)&&1==this.stv_ltg.length?t.push({title:this.$p.t("studiengangInformation","geschaeftsfuehrende_stellvertretende_leitung"),collection:[...this.gf_ltg,...this.stv_ltg]}):(t.push({title:this.$p.t("studiengangInformation","geschaeftsfuehrende_leitung"),collection:this.gf_ltg}),t.push({title:this.$p.t("studiengangInformation","stellvertretende_leitung"),collection:this.stv_ltg})),t},moodleLink:function(){if(this.studiengang&&this.studiengang.studiengang_kz)return"https://moodle.technikum-wien.at/course/view.php?idnumber=dl"+this.studiengang.studiengang_kz}},mounted(){this.$api.call(Be.studiengangInformation()).then(t=>t.data).then(t=>{Object.assign(this,t)})}},Ue={content:(t,e=null,n=null,a=null)=>({method:"get",url:"/api/frontend/v1/Cms/content",params:{content_id:t,...e?{version:e}:{},...n?{sprache:n}:{},...a?{sichtbar:a}:{}}}),getNews:(t=1,e=10,n)=>({method:"get",url:"/api/frontend/v1/Cms/getNews",params:{page:t,page_size:e,sprache:n}}),news:t=>({method:"get",url:"/api/frontend/v1/Cms/news",params:{limit:t}}),getNewsRowCount:()=>({method:"get",url:"/api/frontend/v1/Cms/getNewsRowCount"}),getNewsExtra:()=>({method:"get",url:"/api/frontend/v1/Cms/getStudiengangInfoForNews"})},Ve={name:"NewsComponent",components:{Pagination:Le,StudiengangInformation:je},data:()=>({content:null,maxPageCount:0,page_size:10,page:1}),watch:{"$p.user_language.value":function(t){this.fetchNews()}},computed:{sprache:function(){return this.$p.user_language.value}},methods:{fetchNews(){return this.$api.call(Ue.getNews(this.page,this.page_size,this.sprache)).then(t=>t.data).then(t=>{this.content=t,document.querySelectorAll("#cms [data-confirm]").forEach(t=>{t.addEventListener("click",e=>{e.preventDefault(),l.popup(t.dataset.confirm).then(()=>{Axios.get(t.href).then(t=>{location=location}).catch(t=>console.error("ERROR:",t))}).catch(()=>{})})}),document.querySelectorAll("#cms [data-href]").forEach(t=>{t.href=t.dataset.href.replace(/^ROOT\//,FHC_JS_DATA_STORAGE_OBJECT.app_root)}),Vue.nextTick(()=>{document.querySelectorAll(".card-header").forEach(t=>{t.classList.add("fhc-primary")}),document.querySelectorAll(".row").forEach(t=>{t.classList.add("w-100"),t.classList.add("align-items-center")}),document.querySelectorAll(".row h2").forEach(t=>{t.classList.add("mb-0")})})})},loadNewPageContent(t){this.$api.call(Ue.getNews(t.page,t.rows)).then(t=>t.data).then(t=>{this.content=t})}},created(){this.fetchNews(),this.$api.call(Ue.getNewsRowCount()).then(t=>t.data).then(t=>{this.maxPageCount=t})},template:'\n \t

    News

    \n\t
    \n\t\n\t\n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n\t\n\t\n '},He={name:"RaumComponent",data:()=>({imgContent:null}),props:{content:{type:String,required:!0},content_id:{type:[Number,String]}},methods:{sanitizeLegacyTables(t){t.querySelectorAll("table").forEach(t=>{const e=t.textContent.trim(),n=document.createElement("p");n.textContent=e,t.parentNode.replaceChild(n,t)});t.querySelectorAll("ul").forEach(t=>{Array.from(t.children).forEach(e=>{const n=document.createElement("p");n.textContent=e.textContent,t.parentNode.appendChild(n)}),t.parentNode.removeChild(t)});Array.from(t.querySelectorAll("td")).filter(t=>t.scrollWidth>100).forEach(t=>{if(t.firstChild?.nodeType===Node.TEXT_NODE&&t.firstChild.length>10){const e=document.createElement("p");e.appendChild(t.firstChild),t.appendChild(e)}});Array.from(t.querySelectorAll("th")).forEach(t=>{t.children.length>1&&(t.innerHTML=Array.from(t.childNodes).find(t=>t.textContent).textContent)});t.querySelectorAll("p").forEach(t=>{t.style.setProperty("word-wrap","break-word"),t.style.setProperty("white-space","normal"),t.style.setProperty("max-width","400px")})}},mounted(){let t=document.getElementsByClassName("tablesorter");for(let e of t)this.sanitizeLegacyTables(e),new Tabulator(e,{layout:"fitDataStretch",columnDefaults:{formatter:"html",resizable:!1,minWidth:"100px"}});let e=document.getElementsByTagName("h1");if(e=e.length?e[0]:null,e&&e.innerText){let t=e.innerText,n=new RegExp("\\w*\\s([a-zA-Z][0-9\\.]+)$"),a=t.match(n);if(a){t=a[0],t=t.replace(" ","_");let n=document.createElement("a");n.href=FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/CisVue/Cms/getRoomInformation/"+t,n.appendChild(e.cloneNode(!0)),e.replaceWith(n);let i=document.querySelectorAll('.menubox a[href*="stpl_week.php"]');for(let t of i)t.href=n.href}else console.error(`the regular expression did not match the room name: ${t}`);return}const n=(new DOMParser).parseFromString(`
    ${this.content}
    `,"text/html").querySelector("img");if(n&&n.title){const t={};for(let e of n.attributes)t[e.name]=e.value;this.imgContent=t}console.error("was not able to get the title of the raum_contentmittitel")},template:'\n \x3c!-- div that contains the content --\x3e\n\x3c!-- TODO: test with more img content from cms--\x3e\n
    \n
    \n

    Content was not found

    \n '};const qe={relative:[{priority:1,regex:new RegExp(/^\.\.\/cms\/content\.php\?content_id=([0-9]+)/),replacement:FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/CisVue/Cms/content",group_replacement_strategy:"PATH_SEGMENTS"},{priority:2,regex:new RegExp(/^\.\.\/cms\/news\.php/),replacement:FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/CisVue/Cms/news"},{priority:3,regex:new RegExp(/^\.\.\/index\.ci\.php/),replacement:FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router},{priority:10,regex:new RegExp(/^\.\.\//),replacement:FHC_JS_DATA_STORAGE_OBJECT.app_root}],absolute:[{}]},Ge=qe.relative.sort((t,e)=>t.priority-e.priority).map(t=>({regex:t.regex,replacement:t.replacement,group_replacement_strategy:t.group_replacement_strategy}));function Je(t){for(let{regex:e,replacement:n,group_replacement_strategy:a}of Ge){let i=t.match(e);if(i){let s=t.replace(e,n);switch(a){case"QUERY_PARAMETERS":s=s.concat(`?${i[1]}`);for(let t of i.slice(2))s=s.concat(`&${t}`);break;case"PATH_SEGMENTS":for(let t of i.slice(1))s=s.concat(`/${t}`)}return s}}return t}qe.absolute.sort((t,e)=>t.priority-e.priority).map(t=>({regex:t.regex,replacement:t.replacement,group_replacement_strategy:t.group_replacement_strategy}));var We={name:"GeneralComponent",props:{content:{type:String,required:!0}},methods:{sanitizeLegacyTables(t){t.querySelectorAll("table").forEach(t=>{const e=t.textContent.trim(),n=document.createElement("p");n.textContent=e,t.parentNode.replaceChild(n,t)});t.querySelectorAll("ul").forEach(t=>{Array.from(t.children).forEach(e=>{const n=document.createElement("p");n.textContent=e.textContent,t.parentNode.appendChild(n)}),t.parentNode.removeChild(t)});Array.from(t.querySelectorAll("td")).filter(t=>t.scrollWidth>100).forEach(t=>{if(t.firstChild?.nodeType===Node.TEXT_NODE&&t.firstChild.length>10){const e=document.createElement("p");e.appendChild(t.firstChild),t.appendChild(e)}});Array.from(t.querySelectorAll("th")).forEach(t=>{t.children.length>1&&(t.innerHTML=Array.from(t.childNodes).find(t=>t.textContent).textContent)});t.querySelectorAll("p").forEach(t=>{t.style.setProperty("word-wrap","break-word"),t.style.setProperty("white-space","normal"),t.style.setProperty("max-width","400px")})},prepareContent(){Array.from(document.getElementsByClassName("tablesorter")).forEach((t,e)=>{this.sanitizeLegacyTables(t),new Tabulator(t,{index:e,layout:"fitDataFill",columnDefaults:{formatter:"html",resizable:!0,minWidth:"100px"}})}),document.querySelectorAll("#cms [data-confirm]").forEach(t=>{t.addEventListener("click",e=>{e.preventDefault(),BsConfirm.popup(t.dataset.confirm).then(()=>{Axios.get(t.href).then(t=>{location=location}).catch(t=>console.error("ERROR:",t))}).catch(()=>{})})}),document.querySelectorAll("#cms [data-href]").forEach(t=>{t.href=t.dataset.href.replace(/^ROOT\//,FHC_JS_DATA_STORAGE_OBJECT.app_root)}),document.querySelectorAll("[href]").forEach(t=>{let e=Je(t.getAttribute("href"));t.href=e}),document.querySelectorAll("[style*=background-color]").forEach(t=>{"rgb(255, 255, 255)"==t.style.backgroundColor&&(t.style.backgroundColor="var(--fhc-background)"),t.querySelector("*[style*=background-color]")&&(t.style.backgroundColor="var(--fhc-tertiary)")})}},updated(){this.prepareContent()},mounted(){this.prepareContent()},template:'\n \x3c!-- div that contains the content --\x3e\n
    \n \t
    \n
    \n

    Content was not found

    \n '},Ze={name:"ContentComponent",props:{content_id:{type:[Number,String],required:!0},version:{type:[String,Number],default:null},sichtbar:{type:[String,Number],default:null}},components:{raum_contentmittitel:He,news_content:{name:"NewsContentType",props:{content:{type:String,required:!0}},methods:{sanitizeLegacyTables(t){t.querySelectorAll("table").forEach(t=>{const e=t.textContent.trim(),n=document.createElement("p");n.textContent=e,t.parentNode.replaceChild(n,t)});t.querySelectorAll("ul").forEach(t=>{Array.from(t.children).forEach(e=>{const n=document.createElement("p");n.textContent=e.textContent,t.parentNode.appendChild(n)}),t.parentNode.removeChild(t)});Array.from(t.querySelectorAll("td")).filter(t=>t.scrollWidth>100).forEach(t=>{if(t.firstChild?.nodeType===Node.TEXT_NODE&&t.firstChild.length>10){const e=document.createElement("p");e.appendChild(t.firstChild),t.appendChild(e)}});Array.from(t.querySelectorAll("th")).forEach(t=>{t.children.length>1&&(t.innerHTML=Array.from(t.childNodes).find(t=>t.textContent).textContent)});t.querySelectorAll("p").forEach(t=>{t.style.setProperty("word-wrap","break-word"),t.style.setProperty("white-space","normal"),t.style.setProperty("max-width","400px")})}},mounted(){Array.from(document.getElementsByClassName("tablesorter")).forEach((t,e)=>{this.sanitizeLegacyTables(t),new Tabulator(t,{index:e,layout:"fitDataFill",columnDefaults:{formatter:"html",resizable:!0,minWidth:"100px"}})}),document.querySelectorAll("#cms [data-confirm]").forEach(t=>{t.addEventListener("click",e=>{e.preventDefault(),BsConfirm.popup(t.dataset.confirm).then(()=>{Axios.get(t.href).then(t=>{location=location}).catch(t=>console.error("ERROR:",t))}).catch(()=>{})})}),document.querySelectorAll("#cms [data-href]").forEach(t=>{t.href=t.dataset.href.replace(/^ROOT\//,FHC_JS_DATA_STORAGE_OBJECT.app_root)}),document.querySelectorAll("[href]").forEach(t=>{let e=Je(t.getAttribute("href"));t.href=e}),document.querySelectorAll("[style*=background-color]").forEach(t=>{"rgb(255, 255, 255)"==t.style.backgroundColor&&(t.style.backgroundColor="var(--fhc-background)"),t.querySelector("*[style*=background-color]")&&(t.style.backgroundColor="var(--fhc-tertiary)")}),Vue.nextTick(()=>{document.querySelectorAll(".card-header").forEach(t=>{t.classList.add("fhc-primary")}),document.querySelectorAll(".row").forEach(t=>{t.classList.add("w-100"),t.classList.add("align-items-center")}),document.querySelectorAll(".row h2").forEach(t=>{t.classList.add("mb-0")})})},template:'\n\t \x3c!-- div that contains the content --\x3e\n\t
    \n\t\t
    \n\t
    \n\t

    Content was not found

    \n\t '},general:We,iframe_content:{name:"iframe_content",props:{content:{type:String,required:!0}},computed:{srcUrl(){const t=(new DOMParser).parseFromString(`
    ${this.content}
    `,"text/html").querySelector("iframe[src]");if(!t)return"";return Je(t.getAttribute("src")||"")}},template:'\n\t\t
    \n\t\t\t\n\t\t
    Keine URL gefunden.
    \n\t\t
    \n\t'}},data(){return{content_type:null,content:null,content_id_internal:this.content_id}},methods:{fetchContent(){this.$api.call(Ue.content(this.content_id_internal,this.version,this.sprache,this.sichtbar)).then(t=>{this.$nextTick(function(){this.content=t.data.content,this.content_type=t.data.type})})}},watch:{sprache:function(t){this.fetchContent()},"$route.params.content_id"(t){this.content_id_internal=t,this.fetchContent()}},computed:{sprache(){return this.$p.user_language.value},computeContentType:function(){switch(this.content_type){case"raum_contentmittitel":return"raum_contentmittitel";case"news":return"news_content";case"iframe":return"iframe_content";default:return"general"}}},created(){this.fetchContent()},template:'\n \x3c!-- div that contains the content --\x3e\n\t
    \n \t\n\t
    \n

    No content is available to display

    \n '};const Ke="Week";var Ye={name:"RoomInformation",components:{FhcCalendar:It},props:{viewData:Object,propsViewData:Object},computed:{currentDay(){return this.propsViewData?.focus_date||luxon.DateTime.now().setZone(this.viewData.timezone).toISODate()},currentMode(){return this.propsViewData?.mode||Ke}},methods:{handleChangeDate(t,e){return this.handleChangeMode(e,t)},handleChangeMode(t,e){const n=t[0].toUpperCase()+t.slice(1),a=e.toISODate();this.$router.push({name:"RoomInformation",params:{mode:n,focus_date:a,ort_kurzbz:this.propsViewData.ort_kurzbz}})},getPromiseFunc(t,e){return[this.$api.call(St.getRoomInfo(this.propsViewData.ort_kurzbz,t.toISODate(),e.toISODate())),this.$api.call(St.getOrtReservierungen(this.propsViewData.ort_kurzbz,t.toISODate(),e.toISODate()))]}},template:'\n\t
    \n\t\t

    {{ $p.t(\'rauminfo/rauminfo\') }} {{ propsViewData.ort_kurzbz }}

    \n\t\t
    \n\t\t\n\t
    '},Qe={getConfig:()=>({method:"get",url:"/api/frontend/v1/Abgabe/getConfig"}),getConfigStudent:()=>({method:"get",url:"/api/frontend/v1/Abgabe/getConfigStudent"}),getStudentProjektarbeiten:t=>({method:"get",url:"/api/frontend/v1/Abgabe/getStudentProjektarbeiten",params:{uid:t}}),getStudentProjektabgaben:t=>({method:"get",url:"/api/frontend/v1/Abgabe/getStudentProjektabgaben",params:{projektarbeit_id:t.projektarbeit_id,student_uid:t.student_uid}}),postStudentProjektarbeitEndupload:t=>({method:"post",url:"/api/frontend/v1/Abgabe/postStudentProjektarbeitEndupload",params:t,config:{Headers:{"Content-Type":"multipart/form-data"}}}),postStudentProjektarbeitZwischenabgabe:t=>({method:"post",url:"/api/frontend/v1/Abgabe/postStudentProjektarbeitZwischenabgabe",params:t,config:{Headers:{"Content-Type":"multipart/form-data"}}}),getMitarbeiterProjektarbeiten:t=>({method:"get",url:"/api/frontend/v1/Abgabe/getMitarbeiterProjektarbeiten",params:{showall:t}}),postProjektarbeitAbgabe(t){let e=t.datum;if(t.datum instanceof Date){e=`${t.datum.getFullYear()}-${String(t.datum.getMonth()+1).padStart(2,"0")}-${String(t.datum.getDate()).padStart(2,"0")}`}return{method:"post",url:"/api/frontend/v1/Abgabe/postProjektarbeitAbgabe",params:{paabgabe_id:t.paabgabe_id,paabgabetyp_kurzbz:t.bezeichnung.paabgabetyp_kurzbz,datum:e,note:t.note_pk,upload_allowed:!!t.upload_allowed,beurteilungsnotiz:t.beurteilungsnotiz??"",fixtermin:t.fixtermin,insertvon:t.insertvon,kurzbz:t.kurzbz,projektarbeit_id:t.projektarbeit_id,betreuer_person_id:t.betreuer_person_id}}},deleteProjektarbeitAbgabe:t=>({method:"post",url:"/api/frontend/v1/Abgabe/deleteProjektarbeitAbgabe",params:{paabgabe_id:t}}),postSerientermin:(t,e,n,a,i,s,r)=>({method:"post",url:"/api/frontend/v1/Abgabe/postSerientermin",params:{datum:t,paabgabetyp_kurzbz:e,bezeichnung:n,kurzbz:a,upload_allowed:i,projektarbeit_ids:s,fixtermin:r}}),fetchDeadlines:t=>({method:"post",url:"/api/frontend/v1/Abgabe/fetchDeadlines",params:{person_id:t}}),getPaAbgabetypen:()=>({method:"get",url:"/api/frontend/v1/Abgabe/getPaAbgabetypen"}),getNoten:()=>({method:"get",url:"/api/frontend/v1/Abgabe/getNoten"}),getProjektarbeitenForStudiengang:(t,e=0)=>({method:"get",url:"/api/frontend/v1/Abgabe/getProjektarbeitenForStudiengang",params:{studiengang_kz:t,benotet:e}}),getStudiengaenge:()=>({method:"get",url:"/api/frontend/v1/Abgabe/getStudiengaenge"}),postStudentProjektarbeitZusatzdaten:t=>({method:"post",url:"/api/frontend/v1/Abgabe/postStudentProjektarbeitZusatzdaten",params:t,config:{Headers:{"Content-Type":"multipart/form-data"}}}),getSignaturStatusForProjektarbeitAbgaben:(t,e)=>({method:"post",url:"/api/frontend/v1/Abgabe/getSignaturStatusForProjektarbeitAbgaben",params:{paabgabe_ids:t,student_uid:e}})};const Xe={name:"FhcOverlay",props:{active:{type:Boolean,default:!1}},template:'\t\n\t\t
    \n\t\t\t\n\t\t
    \n\t'},tn={name:"AbgabeStudentDetail",components:{Upload:ke,BsModal:s,InputNumber:primevue.inputnumber,Checkbox:primevue.checkbox,Dropdown:primevue.dropdown,Textarea:primevue.textarea,Accordion:primevue.accordion,AccordionTab:primevue.accordiontab,Message:primevue.message,Inplace:primevue.inplace,VueDatePicker:i,FhcOverlay:Xe},inject:["notenOptions","isMobile","isViewMode","moodle_link"],props:{projektarbeit:{type:Object,default:null},viewMode:{type:Boolean,default:!1}},data:()=>({loading:!1,eidAkzeptiert:!1,enduploadTermin:null,allActiveLanguages:FHC_JS_DATA_STORAGE_OBJECT.server_languages,form:Vue.reactive({sprache:"",abstract:"",abstract_en:"",schlagwoerter:"",schlagwoerter_en:"",kontrollschlagwoerter:"",seitenanzahl:1})}),methods:{getNoteBezeichnung(t){const e=this.notenOptions.find(e=>e.note==t.note);return e?.bezeichnung?e?.positiv?this.$capitalize(this.$p.t("abgabetool/c4positivBenotet"))+" ✅":this.$capitalize(this.$p.t("abgabetool/c4negativBenotet"))+" ❌":!0!==e?.benotbar||t.note?"":this.$capitalize(this.$p.t("abgabetool/c4notYetGraded"))},async validate(t,e=!1){return t.file.length?!e||!1!==await this.$fhcAlert.confirm({message:this.$p.t("abgabetool/confirmEnduploadSpeichern"),acceptLabel:this.$capitalize(this.$p.t("abgabetool/c4AcceptAndProceed")),acceptClass:"p-button-primary",rejectLabel:this.$capitalize(this.$p.t("abgabetool/c4Cancel")),rejectClass:"p-button-secondary"}):(this.$fhcAlert.alertWarning(this.$capitalize(this.$p.t("global/warningChooseFile"))),!1)},async triggerEndupload(){if(!await this.validate(this.enduploadTermin,!0))return!1;const t=new FormData;t.append("paabgabetyp_kurzbz",this.enduploadTermin.paabgabetyp_kurzbz),t.append("projektarbeit_id",this.enduploadTermin.projektarbeit_id),t.append("paabgabe_id",this.enduploadTermin.paabgabe_id),t.append("student_uid",this.projektarbeit.student_uid),t.append("bperson_id",this.projektarbeit.bperson_id),t.append("sprache",this.form.sprache.sprache),t.append("abstract",this.form.abstract),t.append("abstract_en",this.form.abstract_en),t.append("schlagwoerter",this.form.schlagwoerter),t.append("schlagwoerter_en",this.form.schlagwoerter_en),t.append("seitenanzahl",this.form.seitenanzahl);for(let e=0;e{this.handleUploadRes(t,this.enduploadTermin)}).finally(()=>{this.loading=!1}),this.$refs.modalContainerEnduploadZusatzdaten.hide()},downloadAbgabe(t){const e=`/api/frontend/v1/Abgabe/getStudentProjektarbeitAbgabeFile?paabgabe_id=${t.paabgabe_id}&student_uid=${this.projektarbeit.student_uid}&projektarbeit_id=${this.projektarbeit.projektarbeit_id}`;window.open(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+e)},formatDate(t){const e=new Date(t),n=t=>String(t).padStart(2,"0"),a=n(e.getMonth()+1);return`${n(e.getDate())}.${a}.${e.getFullYear()}`},async upload(t){if(!await this.validate(t))return!1;if("end"===t.bezeichnung?.paabgabetyp_kurzbz)this.enduploadTermin=t,this.$refs.modalContainerEnduploadZusatzdaten.show();else{const e=new FormData;e.append("paabgabetyp_kurzbz",t.paabgabetyp_kurzbz),e.append("projektarbeit_id",this.projektarbeit.projektarbeit_id),e.append("paabgabe_id",t.paabgabe_id),e.append("student_uid",this.projektarbeit.student_uid),e.append("bperson_id",this.projektarbeit.bperson_id);for(let n=0;n{this.handleUploadRes(e,t)}).finally(()=>{this.loading=!1})}},handleUploadRes(t,e){"success"==t.meta.status?(this.$fhcAlert.alertSuccess(this.$capitalize(this.$p.t("abgabetool/c4fileUploadSuccessv3"))),e.abgabedatum=(new Date).toISOString().split("T")[0],void 0!==t?.data?.signatur&&(e.signatur=t.data.signatur)):this.$fhcAlert.alertError(this.$capitalize(this.$p.t("abgabetool/c4fileUploadErrorv3"))),t.meta.signaturInfo&&this.$fhcAlert.alertInfo(t.meta.signaturInfo)},getOptionLabel:t=>t.sprache,getTerminNoteBezeichnung(t){const e=this.notenOptions.find(e=>e.note==t.note);return e?e.bezeichnung:""}},watch:{projektarbeit(t){this.form.sprache=t.sprache?this.allActiveLanguages.find(e=>e.sprache==t.sprache):this.allActiveLanguages.find(t=>"German"==t.sprache),this.form.abstract=t.abstract??"",this.form.abstract_en=t.abstract_en??"",this.form.schlagwoerter=t.schlagwoerter??"",this.form.schlagwoerter_en=t.schlagwoerter_en??"",this.form.kontrollschlagwoerter=t.kontrollschlagwoerter??"",this.form.seitenanzahl=t.seitenanzahl??1}},computed:{getMoodleLink(){return this.moodle_link+this.projektarbeit.studiengang_kz},getMessagePtStyle:()=>({root:{style:{margin:"0px"}},wrapper:{style:{padding:"6px"}}}),getEid(){return this.$capitalize(this.$p.t("abgabetool/c4eidesstattlicheErklaerung"))},allowedToSaveZusatzdaten(){return this.form.schlagwoerter.length>0&&this.form.schlagwoerter_en.length>0&&this.form.abstract.length>0&&this.form.abstract_en.length>0&&this.form.seitenanzahl>0},getAllowedToSendEndupload(){return this.eidAkzeptiert&&this.allowedToSaveZusatzdaten},qualityGateTerminAvailable(){let t=!1;return this.projektarbeit?.abgabetermine.forEach(e=>{"qualgate1"!=e.paabgabetyp_kurzbz&&"qualgate2"!=e.paabgabetyp_kurzbz||(t=!0)}),t},getTooltipVerspaetet(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipVerspaetet")),class:"custom-tooltip"}},getTooltipVerpasst(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipVerpasst")),class:"custom-tooltip"}},getTooltipAbzugeben(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipAbzugeben")),class:"custom-tooltip"}},getTooltipStandard(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipStandardv2")),class:"custom-tooltip"}},getTooltipAbgegeben(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipAbgegeben")),class:"custom-tooltip"}},getTooltipFixtermin(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipFixtermin")),class:"custom-tooltip"}},getTooltipAbgabeDetected(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipAbgabeDetected")),class:"custom-tooltip"}},getTooltipNotAllowedToUpload(){return this.isViewMode?{value:this.$capitalize(this.$p.t("abgabetool/c4studentAbgabeNotAllowedInViewMode")),class:"custom-tooltip"}:{value:this.$capitalize(this.$p.t("abgabetool/c4studentAbgabeNotAllowedRegular")),class:"custom-tooltip"}},getTooltipBeurteilungerforderlich(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipBeurteilungerforderlich")),class:"custom-tooltip"}},getTooltipBestanden(){return{value:this.$p.t("abgabetool/c4tooltipBestanden"),class:"custom-tooltip"}},getTooltipNichtBestanden(){return{value:this.$p.t("abgabetool/c4tooltipNichtBestanden"),class:"custom-tooltip"}}},created(){},mounted(){},template:'\n\t\t\n\n\t\t
    \n\t\t\n\t\t\t
    {{$capitalize( $p.t(\'abgabetool/c4abgabeStudentenbereich\') )}}
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t

    {{$capitalize( $p.t(\'person/student\') ) }}: {{projektarbeit?.student}}

    \n\t\t\t\t\t

    {{$capitalize( $p.t(\'abgabetool/c4titel\') ) }}: {{projektarbeit?.titel}}

    \n\t\t\t\t\t

    {{$capitalize( $p.t(\'abgabetool/c4betreuerv2\') ) }}: {{projektarbeit ? $p.t(\'abgabetool/c4betrart\' + projektarbeit.betreuerart_kurzbz) + \' \' + projektarbeit.betreuer : \'\'}}

    \n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t

    {{ $p.t(\'abgabetool/c4checkoutStgMoodleInfos\') }} \n\t\t\t\t\t\tMoodle\n\t\t\t\t\t

    \n\t\t\t\t
    \n\t\t\t
    \n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t
    \n\t\t\t\t
    {{ $capitalize( $p.t(\'abgabetool/c4keineAbgabetermineGefunden\') )}}
    \n\t\t\t
    \n\t\t\t\n\t\t
    \n\t \t\n\t \t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t \t\n '},en="Europe/Vienna",nn=luxon.DateTime.now().setZone(en);function an(t,e){const n=luxon.DateTime.fromISO(t.datum,{zone:en}).endOf("day"),a=t.abgabedatum?luxon.DateTime.fromISO(t.abgabedatum,{zone:en}):null;t.diffindays=n.diff(nn,"days").days;const i=a&&a>n;if(t.note){const n="object"==typeof t.note?t.note:e.find(e=>e.note==t.note);if(!0===n?.positiv)return"bestanden";if(!1===n?.positiv)return"nichtbestanden"}return t.bezeichnung?.benotbar&&n<=nn?"beurteilungerforderlich":t.upload_allowed?t.abgabedatum?i?"verspaetet":"abgegeben":nthis.notenOptions),isViewMode:Vue.computed(()=>this.isViewMode),moodle_link:Vue.computed(()=>this.moodle_link)}},props:{student_uid_prop:{default:null},viewData:{type:Object,required:!0,default:()=>({uid:""}),validator:t=>t&&t.uid}},data:()=>({activeTabIndex:[0],abgabeTypeOptions:null,phrasenPromise:null,phrasenResolved:!1,loading:!1,notenOptions:null,detail:null,projektarbeiten:null,selectedProjektarbeit:null,moodle_link:null}),methods:{checkQualityGatesStrict(t){let e=!1,n=!1;return t.forEach(t=>{const a=this.notenOptions?.find(e=>e.note==t.note);a&&a.positiv&&("qualgate1"==t.paabgabetyp_kurzbz?e=!0:"qualgate2"==t.paabgabetyp_kurzbz&&(n=!0))}),e&&n},checkQualityGatesOptional(t){const e=t.find(t=>"qualgate1"==t.paabgabetyp_kurzbz),n=t.find(t=>"qualgate2"==t.paabgabetyp_kurzbz);let a=!0;e&&(a=!1,t.forEach(t=>{const e=this.notenOptions?.find(e=>e.note==t.note);e&&e.positiv&&"qualgate1"==t.paabgabetyp_kurzbz&&(a=!0)}));let i=!0;return n&&(i=!1,t.forEach(t=>{const e=this.notenOptions?.find(e=>e.note==t.note);e&&e.positiv&&"qualgate2"==t.paabgabetyp_kurzbz&&(i=!0)})),a&&i},isPastDate(t){const e=luxon.DateTime.fromISO(t,{zone:"Europe/Vienna"}).endOf("day");return luxon.DateTime.now().setZone("Europe/Vienna")>e},setDetailComponent(t){this.loading=!0,this.loadAbgaben(t).then(e=>{const n=this.projektarbeiten?.find(e=>e.projektarbeit_id==t.projektarbeit_id);n.abgabetermine=e.data[0].retval;const a=null!==n.note;n.abgabetermine.forEach(t=>{if(t.file=[],t.allowedToUpload=!1,"end"==t.paabgabetyp_kurzbz){const e=!t.fixtermin||!this.isPastDate(t.datum);t.allowedToUpload=e&&this.checkQualityGatesOptional(n.abgabetermine)}else t.fixtermin?t.allowedToUpload=!this.isPastDate(t.datum):t.allowedToUpload=t.upload_allowed;a&&(t.allowedToUpload=!1),t.bezeichnung=this.abgabeTypeOptions.find(e=>e.paabgabetyp_kurzbz===t.paabgabetyp_kurzbz),t.dateStyle=an(t,this.notenOptions)}),n.betreuer=this.buildBetreuer(n),n.student_uid=this.student_uid,this.selectedProjektarbeit=n,this.$refs.modalContainerAbgabeDetail.show()}).finally(()=>{this.loading=!1})},centeredTextFormatter:t=>'

    '+t.getValue()+"

    ",detailFormatter(t){const e=t.getValue();return"detailTermine"===e.mode?'
    ':"beurteilungDownload"===e.mode?'
    ':void 0},mailFormatter:t=>'
    ',beurteilungFormatter:t=>t.getValue()?'
    ':"-",buildMailToLink:t=>"mailto:"+t.email,buildBetreuer:t=>(t.btitelpre?t.btitelpre+" ":"")+t.bvorname+" "+t.bnachname+(t.btitelpost?" "+t.btitelpost:""),async setupData(t){const e=t[0]??null;e&&(this.projektarbeiten=e.map(t=>({...t,details:{student_uid:this.student_uid,projektarbeit_id:t.projektarbeit_id,betreuer_person_id:t.bperson_id,betreuerart_kurzbz:t.betreuerart_kurzbz,mode:"detailTermine"},beurteilung1:t.downloadLink1??null,beurteilung2:t.downloadLink2??null,sem:t.studiensemester_kurzbz,stg:t.kurzbzlang,mail:this.buildMailToLink(t),betreuer:this.buildBetreuer(t),typ:t.projekttypbezeichnung,titel:t.titel})))},loadProjektarbeiten(){this.$api.call(Qe.getStudentProjektarbeiten(this.student_uid)).then(t=>{t?.data&&this.setupData(t.data)})},loadAbgaben(t){return new Promise(e=>{this.$api.call(Qe.getStudentProjektabgaben(t)).then(t=>{e(t)})})},async setupMounted(){this.loadProjektarbeiten()},getAccTabHeaderForProjektarbeit(t){let e="";return e+=t.titel??this.$p.t("abgabetool/keinTitel"),e},getMailLink:t=>t.email?"mailto:"+t.email:"",getNoteBezeichnung(t){if(t.note&&this.notenOptions){const e=this.notenOptions.find(e=>e.note==t.note);return e?.bezeichnung}return""},handleDownloadBeurteilung1(t){window.open(t.beurteilung1)},handleDownloadBeurteilung2(t){window.open(t.beurteilung2)}},watch:{},computed:{isViewMode(){return this.student_uid!==this.viewData.uid},student_uid(){return this.student_uid_prop||this.viewData?.uid||null}},async created(){this.phrasenPromise=this.$p.loadCategory(["abgabetool","global"]),this.phrasenPromise.then(()=>{this.phrasenResolved=!0}),this.loading=!0,await this.$api.call(Qe.getNoten()).then(t=>{"success"==t.meta.status&&(this.notenOptions=t.data[0],this.allowedNotenOptions=this.notenOptions.filter(e=>t.data[1].includes(e.note)))}).finally(()=>{this.loading=!1}),this.$api.call(Qe.getPaAbgabetypen()).then(t=>{this.abgabeTypeOptions=t.data}).catch(t=>{this.loading=!1}),this.$api.call(Qe.getConfigStudent()).then(t=>{this.moodle_link=t.data?.moodle_link}).catch(t=>{this.loading=!1})},mounted(){this.setupMounted()},template:'\n\n '},rn={name:"AbgabeMitarbeiterDetail",components:{BsModal:s,InputNumber:primevue.inputnumber,Checkbox:primevue.checkbox,Dropdown:primevue.dropdown,Textarea:primevue.textarea,SpeedDial:primevue.speeddial,Accordion:primevue.accordion,AccordionTab:primevue.accordiontab,Message:primevue.message,VueDatePicker:i},emits:["paUpdated"],inject:["abgabeTypeOptions","abgabetypenBetreuer","allowedNotenOptions","notenOptionsNonFinal","turnitin_link","old_abgabe_beurteilung_link"],props:{projektarbeit:{type:Object,default:null},isFullscreen:{type:Boolean,default:!1},assistenzMode:{type:Boolean,default:!1}},data(){return{showAutomagicModalPhrase:!1,eidAkzeptiert:!1,enduploadTermin:null,allActiveLanguages:FHC_JS_DATA_STORAGE_OBJECT.server_languages,speedDialItems:[{label:Vue.computed(()=>this.$p.t("abgabetool/c4newAbgabetermin")),icon:"fa fa-plus",command:this.openCreateNewAbgabeModal,disabled:Vue.computed(()=>!this.getAllowedToCreateNewTermin)},{label:Vue.computed(()=>this.$p.t("abgabetool/c4benoten")),icon:"fa fa-user-check",command:this.openBenotung,disabled:Vue.computed(()=>1==this.assistenzMode)},{label:Vue.computed(()=>this.$p.t("abgabetool/c4plagiatcheck_link")),icon:"fa fa-clipboard-check",command:this.openPlagiatcheck},{label:Vue.computed(()=>this.$p.t("abgabetool/c4student_perspective")),icon:"fa fa-eye",command:this.openStudentPage}],newTermin:null,form:Vue.reactive({sprache:"",abstract:"",abstract_en:"",schlagwoerter:"",schlagwoerter_en:"",kontrollschlagwoerter:"",seitenanzahl:1})}},methods:{getNoteBezeichnung(t){return t.noteBackend?.bezeichnung?t.noteBackend?.positiv?this.$capitalize(this.$p.t("abgabetool/c4positivBenotet"))+" ✅":this.$capitalize(this.$p.t("abgabetool/c4negativBenotet"))+" ❌":!0!==t.bezeichnung?.benotbar||t.noteBackend?"":this.$capitalize(this.$p.t("abgabetool/c4notYetGraded"))},getPlaceholderTermin(t){return t?.bezeichnung?this.$p.t("abgabetool/c4paatyp"+t.paabgabetyp_kurzbz):this.$p.t("abgabetool/abgabetypPlaceholder")},saveTermin(t){return t.paabgabe_id,t.note_pk=t.note?.note??null,t.betreuer_person_id=this.projektarbeit.betreuer_person_id,t.fixtermin=!t.invertedFixtermin,this.$api.call(Qe.postProjektarbeitAbgabe(t)).then(e=>{if("success"==e?.meta?.status){this.$fhcAlert.alertSuccess(this.$p.t("ui/gespeichert"));const n=this.allowedNotenOptions.find(t=>t.note==e.data[0].note),a={allowedToSave:!0,allowedToDelete:!0,...e.data[0]};a.note&&(a.note=n,a.noteBackend=n),a.invertedFixtermin=!a.fixtermin;const i=e.data[1],s=this.abgabeTypeOptions.find(t=>t.paabgabetyp_kurzbz==a.paabgabetyp_kurzbz);if(a.bezeichnung={bezeichnung:t.bezeichnung?.bezeichnung,paabgabetyp_kurzbz:t.bezeichnung?.paabgabetyp_kurzbz,benotbar:s.benotbar},i){const e=this.allowedNotenOptions.find(t=>t.note==i.note);i.note=e,t.paabgabetyp_kurzbz=a.paabgabetyp_kurzbz,t.noteBackend=n,t.dateStyle=an(t,this.notenOptions)}else a.dateStyle=an(a,this.notenOptions),this.projektarbeit.abgabetermine.push(a);this.projektarbeit.abgabetermine.sort((t,e)=>new Date(t.datum)-new Date(e.datum)),this.projektarbeit.abgabetermine.findIndex(e=>t.paabgabe_id==e.paabgabe_id);const r=!i&&!a.note?.positiv&&null!==a.note,l=i&&!a.note?.positiv&&null!==a.note&&(i.note?.positiv||void 0===i.note);r||l?(this.newTermin={paabgabe_id:-1,projektarbeit_id:this.projektarbeit.projektarbeit_id,fixtermin:!1,invertedFixtermin:!0,kurzbz:"",datum:(new Date).toISOString().split("T")[0],note:this.allowedNotenOptions.find(t=>9==t.note),beurteilungsnotiz:"",upload_allowed:!1,paabgabetyp_kurzbz:"",bezeichnung:this.abgabeTypeOptions.find(t=>t.paabgabetyp_kurzbz===a.paabgabetyp_kurzbz),abgabedatum:null,insertvon:this.viewData?.uid??""},this.showAutomagicModalPhrase=!0,this.$refs.modalContainerCreateNewAbgabe.show()):this.showAutomagicModalPhrase=!1,this.$emit("paUpdated",this.projektarbeit)}else"error"==e?.meta?.status&&this.$fhcAlert.alertError()})},openZusatzdatenModal(){this.$refs.modalContainerZusatzdaten.show()},async saveZusatzdaten(){if(!await this.validateZusatzdaten())return!1;const t=this.projektarbeit,e=new FormData;e.append("projektarbeit_id",this.projektarbeit.projektarbeit_id),e.append("sprache",this.form.sprache.sprache),e.append("abstract",this.form.abstract),e.append("abstract_en",this.form.abstract_en),e.append("schlagwoerter",this.form.schlagwoerter),e.append("schlagwoerter_en",this.form.schlagwoerter_en),e.append("seitenanzahl",this.form.seitenanzahl),this.loading=!0,this.$api.call(Qe.postStudentProjektarbeitZusatzdaten(e)).then(e=>{if("success"==e.meta.status){if(this.$fhcAlert.alertSuccess(this.$p.t("ui/gespeichert")),!data?.retval?.[0])return;const e=data.retval[0];t.seitenanzahl=e.seitenanzahl??1,t.kontrollschlagwoerter=e.kontrollschlagwoerter??"",t.schlagwoerter=e.schlagwoerter??"",t.sprache=e.sprache??"",t.schlagwoerter_en=e.schlagwoerter_en??"",t.abstract=e.abstract??"",t.abstract_en=e.abstract_en??""}}).finally(()=>{this.loading=!1}),this.$refs.modalContainerZusatzdaten.hide()},async validateZusatzdaten(){return!1!==await this.$fhcAlert.confirm({message:this.$p.t("abgabetool/confirmZusatzdatenSpeichern"),acceptLabel:this.$capitalize(this.$p.t("abgabetool/c4AcceptAndProceed")),acceptClass:"p-button-primary",rejectLabel:this.$capitalize(this.$p.t("abgabetool/c4Cancel")),rejectClass:"p-button-secondary"})},async handleDeleteTermin(t){if(!1===await this.$fhcAlert.confirm({message:this.$p.t("abgabetool/c4confirm_delete"),acceptLabel:"Löschen",acceptClass:"p-button-danger",rejectLabel:"Zurück",rejectClass:"p-button-secondary"}))return!1;this.deleteTermin(t)},deleteTermin(t){this.$api.call(Qe.deleteProjektarbeitAbgabe(t.paabgabe_id)).then(e=>{if("success"==e?.meta?.status){this.$fhcAlert.alertSuccess(this.$p.t("ui/genericDeleted",[this.$p.t("abgabetool/abgabe")]));const e=this.projektarbeit.abgabetermine.findIndex(e=>e.paabgabe_id===t.paabgabe_id);this.projektarbeit.abgabetermine.splice(e,1),this.$emit("paUpdated",this.projektarbeit)}else"error"==e?.meta?.status&&this.$fhcAlert.alertError()})},validate:function(t){return!!t.file.length||(this.$fhcAlert.alertWarning(this.$p.t("global/warningChooseFile")),!1)},downloadAbgabe(t){const e=`/api/frontend/v1/Abgabe/getStudentProjektarbeitAbgabeFile?paabgabe_id=${t.paabgabe_id}&student_uid=${this.projektarbeit.student_uid}&projektarbeit_id=${this.projektarbeit.projektarbeit_id}`;window.open(FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+e)},openBeurteilungLink(t){window.open(t,"_blank")},getOptionLabelSprache:t=>t.sprache,getOptionLabelAbgabetyp(t){return this.$p.t("abgabetool/c4paatyp"+t.paabgabetyp_kurzbz)},getOptionDisabled:t=>!t.aktiv,getNotenOptionLabel:t=>t.bezeichnung,openStudentPage(){const t=FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/Cis/Abgabetool/Student/"+this.projektarbeit?.student_uid;window.open(t,"_blank")},openPlagiatcheck(){const t=this.turnitin_link;window.open(t,"_blank")},async openBenotung(){if(this.getSemesterBenotbar&&this.projektarbeit?.abgabetermine.find(t=>"end"==t.paabgabetyp_kurzbz&&null!==t.abgabedatum)&&this.projektarbeit?.beurteilungLinkNew){const t=this.projektarbeit?.beurteilungLinkNew;window.open(t,"_blank")}else if(this.projektarbeit?.abgabetermine.find(t=>"end"==t.paabgabetyp_kurzbz&&null!==t.abgabedatum)&&this.projektarbeit?.beurteilungLinkOld){if(!1===await this.$fhcAlert.confirm({message:this.$p.t("abgabetool/c4aeltereParbeitBenotenv2"),acceptLabel:this.$capitalize(this.$p.t("abgabetool/c4AcceptAndProceed")),acceptClass:"btn btn-danger",rejectLabel:this.$capitalize(this.$p.t("abgabetool/c4Cancel")),rejectClass:"btn btn-outline-secondary"}))return!1;const t=this.projektarbeit?.beurteilungLinkOld;window.open(t,"_blank")}else if(!1===await this.$fhcAlert.confirm({message:this.$p.t("abgabetool/c4keinEnduploadErfolgt"),acceptLabel:this.$capitalize(this.$p.t("abgabetool/c4AcceptAndProceed")),acceptClass:"btn btn-danger",rejectLabel:this.$capitalize(this.$p.t("abgabetool/c4Cancel")),rejectClass:"btn btn-outline-secondary"}))return!1},formatDate(t){const e=new Date(t),n=t=>String(t).padStart(2,"0"),a=n(e.getMonth()+1);return`${n(e.getDate())}.${a}.${e.getFullYear()}`},openCreateNewAbgabeModal(){if("Zweitbegutachter"!=this.projektarbeit?.betreuerart_kurzbz){if(!this.newTermin){const t=this.abgabeTypeOptions.find(t=>"zwischen"===t.paabgabetyp_kurzbz);this.newTermin={paabgabe_id:-1,projektarbeit_id:this.projektarbeit.projektarbeit_id,fixtermin:!1,invertedFixtermin:!0,kurzbz:"",datum:(new Date).toISOString().split("T")[0],note:this.allowedNotenOptions.find(t=>9==t.note),beurteilungsnotiz:"",upload_allowed:t.upload_allowed_default,paabgabetyp_kurzbz:"",bezeichnung:t,abgabedatum:null,insertvon:this.viewData?.uid??""}}this.$refs.modalContainerCreateNewAbgabe.show()}else this.$fhcAlert.alertWarning("Terminanlage disabled")},validateTermin:t=>!0,async handleSaveNewAbgabe(t){if(!this.validateTermin(t))return this.$fhcAlert.alertWarning("invalid termin"),!1;await this.saveTermin(t),this.$refs.modalContainerCreateNewAbgabe.hide(),this.newTermin={paabgabe_id:-1,projektarbeit_id:this.projektarbeit.projektarbeit_id,fixtermin:!1,invertedFixtermin:!0,kurzbz:"",datum:(new Date).toISOString().split("T")[0],note:this.allowedNotenOptions.find(t=>9==t.note),beurteilungsnotiz:"",upload_allowed:!1,paabgabetyp_kurzbz:"",bezeichnung:this.abgabeTypeOptions.find(t=>"zwischen"===t.paabgabetyp_kurzbz),abgabedatum:null,insertvon:this.viewData?.uid??""}},handleChangeAbgabetyp(t){"qualgate1"===t.bezeichnung?.paabgabetyp_kurzbz||"qualgate2"===t.bezeichnung?.paabgabetyp_kurzbz?t.kurzbz=t.bezeichnung.bezeichnung:t.kurzbz=""}},computed:{getAllowedToCreateNewTermin(){if(this.assistenzMode)return!0;if("Zweitbegutachter"==this.projektarbeit?.betreuerart_kurzbz)return!1;if(void 0!==this.projektarbeit?.note&&null!==this.projektarbeit.note){return!!this.notenOptionsNonFinal.find(t=>t.note)}return!0},allowedToSaveZusatzdaten(){return this.form.schlagwoerter.length>0&&this.form.schlagwoerter_en.length>0&&this.form.abstract.length>0&&this.form.abstract_en.length>0&&this.form.seitenanzahl>0},getAllowedAbgabeTypeOptions(){return this.assistenzMode?this.abgabeTypeOptions:this.abgabeTypeOptions.filter(t=>this.abgabetypenBetreuer.includes(t.paabgabetyp_kurzbz))},getMessagePtStyle:()=>({root:{style:{margin:"0px"}},wrapper:{style:{padding:"6px"}}}),getEid(){return this.$p.t("abgabetool/c4eidesstattlicheErklaerung")},getEnduploadErlaubt(){return!this.eidAkzeptiert},getSemesterBenotbar(){return this.projektarbeit?.isCurrent??!1},endUploadVorhanden(){return this.projektarbeit?.abgabetermine.find(t=>"end"===t.paabgabetyp_kurzbz&&null!==t.abgabedatum)},qualityGateTerminAvailable(){let t=!1;return this.projektarbeit?.abgabetermine.forEach(e=>{"qualgate1"!=e.bezeichnung?.paabgabetyp_kurzbz&&"qualgate2"!=e?.bezeichnung?.paabgabetyp_kurzbz||(t=!0)}),t},getSpeedDialStyle:()=>"position: static !important;",getSpeedDialWrapperStyle:()=>"position: absolute; z-index: 9999; left: 0px; bottom: 0.5rem;",getTooltipVerspaetet(){return{value:this.$p.t("abgabetool/c4tooltipVerspaetet"),class:"custom-tooltip"}},getTooltipVerpasst(){return{value:this.$p.t("abgabetool/c4tooltipVerpasst"),class:"custom-tooltip"}},getTooltipAbzugeben(){return{value:this.$p.t("abgabetool/c4tooltipAbzugeben"),class:"custom-tooltip"}},getTooltipStandard(){return{value:this.$p.t("abgabetool/c4tooltipStandardv2"),class:"custom-tooltip"}},getTooltipBeurteilungerforderlich(){return{value:this.$p.t("abgabetool/c4tooltipBeurteilungerforderlich"),class:"custom-tooltip"}},getTooltipAbgegeben(){return{value:this.$p.t("abgabetool/c4tooltipAbgegeben"),class:"custom-tooltip"}},getTooltipFixtermin(){return{value:this.$p.t("abgabetool/c4tooltipFixtermin"),class:"custom-tooltip"}},getTooltipAbgabeDetected(){return{value:this.$capitalize(this.$p.t("abgabetool/c4tooltipAbgabeDetected")),class:"custom-tooltip"}},getTooltipNotAllowedToSave(){return{value:this.$p.t("abgabetool/c4notAllowedToEditAbgabeTermin"),class:"custom-tooltip"}},getTooltipNotAllowedToDelete(){return{value:this.$p.t("abgabetool/c4notAllowedToDeleteAbgabeTermin"),class:"custom-tooltip"}},getTooltipBestanden(){return{value:this.$p.t("abgabetool/c4tooltipBestanden"),class:"custom-tooltip"}},getTooltipNichtBestanden(){return{value:this.$p.t("abgabetool/c4tooltipNichtBestanden"),class:"custom-tooltip"}},getProjektarbeitTitel(){return this.projektarbeit?.titel?this.$capitalize(this.$p.t("abgabetool/c4titel"))+": "+this.projektarbeit.titel:""},getProjektarbeitStudent(){return this.projektarbeit?.student?this.$capitalize(this.$p.t("person/student"))+": "+this.projektarbeit.student:""}},watch:{"newTermin.bezeichnung"(t){"qualgate1"!==t?.paabgabetyp_kurzbz&&"qualgate2"!==t?.paabgabetyp_kurzbz||(this.newTermin.kurzbz=t.bezeichnung),this.newTermin.upload_allowed=t.upload_allowed_default},projektarbeit(t){const e=this.abgabeTypeOptions.find(t=>"zwischen"===t.paabgabetyp_kurzbz);this.newTermin={paabgabe_id:-1,projektarbeit_id:t.projektarbeit_id,fixtermin:!1,invertedFixtermin:!0,kurzbz:"",datum:(new Date).toISOString().split("T")[0],note:this.allowedNotenOptions.find(t=>9==t.note),beurteilungsnotiz:"",upload_allowed:e.upload_allowed_default,paabgabetyp_kurzbz:"",bezeichnung:e,abgabedatum:null,insertvon:this.viewData?.uid??""},t?.abgabetermine?.forEach(t=>t.invertedFixtermin=!t.fixtermin),this.form.sprache=t.sprache?this.allActiveLanguages.find(e=>e.sprache==t.sprache):this.allActiveLanguages.find(t=>"German"==t.sprache),this.form.abstract=t.abstract??"",this.form.abstract_en=t.abstract_en??"",this.form.schlagwoerter=t.schlagwoerter??"",this.form.schlagwoerter_en=t.schlagwoerter_en??"",this.form.kontrollschlagwoerter=t.kontrollschlagwoerter??"",this.form.seitenanzahl=t.seitenanzahl??1}},created(){},mounted(){},template:'\n\t\n\t\t\n\t\t\n\t\t\n\t\n\n\t
    \n\t\t
    {{$capitalize( $p.t(\'abgabetool/c4abgabeMitarbeiterbereich\') )}}
    \n\n\t\t
    \n\t\t\t
    \n\t\t\t\t

    {{getProjektarbeitStudent}}

    \n\t\t\t\t

    {{getProjektarbeitTitel}}

    \n\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t
    \n\t\t
    \n\t\t\t
    \n\x3c!--\t\t\t\tTODO: tooltip why this button is disabled--\x3e\n\t\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\t\t
    \n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t
    \n\t\t\t
    {{ $capitalize( $p.t(\'abgabetool/c4keineAbgabetermineGefunden\') )}}
    \n\t\t
    \n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t
    \n'};async function ln(t,e,n,a,i){let s=t.join(","),r="";const l=n&&"string"==typeof n?n.length+9:0;if(s.length>2024&&!1===await a.confirm({message:i.t("stv","zuvieleEMails")}))return;let o=!0,d=e?.ctrlKey||e?.metaKey;for(;s.length>0;){if(s.length+l>2024){let t=s.lastIndexOf(",",1900);r=s.substring(0,t),s=s.substring(t+1)}else r=s,s="";let t=d?`mailto:?bcc=${r}`:`mailto:${r}`;n&&"string"==typeof n&&(t+=`?subject=${n}`),o?(window.location.href=t,o=!1):!0===await a.confirm({message:i.t("stv","weitereEMail")})&&(window.location.href=t)}}const on={name:"AbgabetoolMitarbeiter",components:{BsModal:s,CoreFilterCmpt:pe,AbgabeDetail:rn,Checkbox:primevue.checkbox,Dropdown:primevue.dropdown,Textarea:primevue.textarea,TieredMenu:primevue.tieredmenu,VueDatePicker:i,FhcOverlay:Xe},provide(){return{abgabeTypeOptions:Vue.computed(()=>this.abgabeTypeOptions),abgabetypenBetreuer:Vue.computed(()=>this.abgabetypenBetreuer),allowedNotenOptions:Vue.computed(()=>this.allowedNotenOptions),notenOptionsNonFinal:Vue.computed(()=>this.notenOptionsNonFinal),turnitin_link:Vue.computed(()=>this.turnitin_link),old_abgabe_beurteilung_link:Vue.computed(()=>this.old_abgabe_beurteilung_link)}},props:{viewData:{type:Object,required:!0,default:()=>({name:"",uid:""}),validator:t=>t&&t.uid}},data(){return{tableData:null,abgabetypenBetreuer:null,detailIsFullscreen:!1,phrasenPromise:null,phrasenResolved:!1,turnitin_link:null,old_abgabe_beurteilung_link:null,BETREUER_SAMMELMAIL_BUTTON_STUDENT:null,saving:!1,loading:!1,abgabeTypeOptions:null,notenOptions:null,allowedNotenOptions:null,notenOptionsNonFinal:null,serienTermin:Vue.reactive({datum:new Date,bezeichnung:{paabgabetyp_kurzbz:"zwischen",bezeichnung:"Zwischenabgabe"},kurzbz:"",upload_allowed:!1}),showAll:!1,tabulatorUuid:Vue.ref(0),selectedData:[],domain:"",student_uid:null,detail:null,detailOffset:0,projektarbeiten:null,selectedProjektarbeit:null,tableBuiltResolve:null,tableBuiltPromise:null,abgabeTableOptions:{minHeight:250,index:"projektarbeit_id",layout:"fitDataStretch",placeholder:Vue.computed(()=>this.$p.t("global/noDataAvailable")),selectable:!0,selectableCheck:this.selectionCheck,rowHeight:40,columns:[{formatter:function(t,e,n){if(!t.getRow().getData().selectable)return;let a=document.createElement("input");a.type="checkbox",a.addEventListener("click",n=>{n.stopPropagation(),e&&e.handleClick&&e.handleClick(n,t)}),t.getRow().getData().checkbox=a;let i=document.createElement("div");return i.style.cssText="display: flex; justify-content: center; align-items: center; height: 100%; width: 100%;",i.appendChild(a),i},titleFormatter:function(t,e,n){let a=document.createElement("input");return a.type="checkbox",a.addEventListener("click",n=>{n.stopPropagation(),e&&e.handleClick&&e.handleClick(n,t)}),a},hozAlign:"center",headerSort:!1,formatterParams:{handleClick:this.selectHandler},titleFormatterParams:{handleClick:this.selectAllHandler},width:50,cssClass:"sticky-col"},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4details"))),field:"details",formatter:this.detailFormatter,headerFilter:!1,headerSort:!1,widthGrow:1,tooltip:!1,cssClass:"sticky-col"},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4personenkennzeichen"))),headerFilter:!0,field:"pkz",formatter:this.pkzTextFormatter,widthGrow:1,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4vorname"))),field:"vorname",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4nachname"))),field:"nachname",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4projekttyp"))),field:"projekttyp_kurzbz",formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4stg"))),field:"stg",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4sem"))),field:"studiensemester_kurzbz",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4titel"))),field:"titel",headerFilter:!0,formatter:this.centeredTextFormatter,maxWidth:500,widthGrow:8},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4betreuerartv2"))),field:"betreuerart_beschreibung",formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4prevAbgabetermin"))),field:"prevTermin",headerFilter:De,headerFilterFunc:this.headerFilterTerminCol,sorter:this.sortFuncTerminCol,formatter:this.abgabterminFormatter,widthGrow:1,width:250,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4nextAbgabetermin"))),field:"nextTermin",headerFilter:De,headerFilterFunc:this.headerFilterTerminCol,sorter:this.sortFuncTerminCol,formatter:this.abgabterminFormatter,widthGrow:1,width:250,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4qgate1Status"))),headerFilter:"list",headerFilterParams:{valuesLookup:this.getQGateStatusList},field:"qgate1Status",formatter:this.centeredTextFormatter,widthGrow:1,width:220,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4qgate2Status"))),headerFilter:"list",headerFilterParams:{valuesLookup:this.getQGateStatusList},field:"qgate2Status",formatter:this.centeredTextFormatter,widthGrow:1,width:220,tooltip:!1}],persistence:!1,persistenceID:"abgabeTableBetreuer2026-02-26"},abgabeTableEventHandlers:[{event:"tableBuilt",handler:async()=>{this.tableBuiltResolve()}},{event:"cellClick",handler:async(t,e)=>{"details"===e.getColumn().getField()?(this.setDetailComponent(e.getValue()),this.undoSelection(e)):"mail"===e.getColumn().getField()&&this.undoSelection(e)}},{event:"rowSelectionChanged",handler:async t=>{this.selectedData.filter(e=>!t.includes(e)).forEach(t=>{t.checkbox&&(t.checkbox.checked=!1)}),t.forEach(t=>{t.checkbox&&(t.checkbox.checked=!0)}),this.selectedData=t}}]}},methods:{handlePaUpdated(t){this.checkAbgabetermineProjektarbeit(t),this.$refs.abgabeTable.tabulator.redraw(!0)},sammelMailStudent(t){const e=[];this.selectedData.forEach(t=>{e.push(`${t.student_uid}@${this.domain}`)});ln([...new Set(e)],t.originalEvent,"",this.$fhcAlert,this.$p)},getQGateStatusList(){return[this.$p.t("abgabetool/c4keinTerminVorhanden"),this.$p.t("abgabetool/c4positivBenotet"),this.$p.t("abgabetool/c4negativBenotet"),this.$p.t("abgabetool/c4notYetGraded"),this.$p.t("abgabetool/c4notSubmitted"),this.$p.t("abgabetool/c4notHappenedYet")]},sortFuncTerminCol:(t,e,n,a,i,s,r)=>null==t?1:null==e?-1:"prevTermin"==i._column.field?Math.abs(e.diffMs)-Math.abs(t.diffMs):"nextTermin"==i._column.field?Math.abs(t.diffMs)-Math.abs(e.diffMs):Math.abs(e.diffMs)-Math.abs(t.diffMs),headerFilterTerminCol(t,e){if(!e||!e.luxonDate||!e.luxonDate.isValid)return!1;const n=e.luxonDate,a=t=>{if(!t)return null;let e;return e=t instanceof Date?luxon.DateTime.fromJSDate(t):"string"==typeof t?luxon.DateTime.fromISO(t):luxon.DateTime.fromMillis(Number(t)),e.isValid?e:null},i=a(t[0]),s=a(t[1]);return i&&!s?n.hasSame(i,"day"):!(!i||!s)&&(n>=i.startOf("day")&&n<=s.endOf("day"))},loadState(){return JSON.parse(localStorage.getItem(this.abgabeTableOptions.persistenceID)||"null")},saveState(t){if(!this.stateRestored)return;const e={columns:t.getColumnLayout().map(t=>({field:t.field,visible:t.visible,width:t.width})),sort:t.getSorters().map(t=>({field:t.field,dir:t.dir})),filters:t.getFilters(),headerFilters:t.getHeaderFilters()};localStorage.setItem(this.abgabeTableOptions.persistenceID,JSON.stringify(e))},handleTableBuilt(){const t=this.$refs.abgabeTable.tabulator;this.tableBuiltResolve(),t.on("columnMoved",()=>{this.saveState(t)}),t.on("columnResized",()=>{this.saveState(t)}),t.on("columnVisibilityChanged",()=>{this.saveState(t)}),t.on("filterChanged",()=>{this.saveState(t)}),t.on("headerFilterChanged",()=>{this.saveState(t)}),t.on("dataSorted",()=>{this.saveState(t)}),t.on("columnSorted",()=>{this.saveState(t)}),t.on("sortersChanged",()=>{this.saveState(t)});const e=this.loadState();t.on("renderComplete",()=>{if(!this.stateRestored){if(e?.columns&&!this.colLayoutRestored){const n=e.columns.map(t=>({field:t.field,width:t.width,visible:t.visible}));t.setColumnLayout(n),this.colLayoutRestored=!0}if(e?.filters&&!this.filtersRestored&&(this.filtersRestored=!0,t.setFilter(e.filters)),e?.headerFilters&&!this.headerFiltersRestored){this.headerFiltersRestored=!0;for(let n of e.headerFilters)t.setHeaderFilterValue(n.field,n.value)}e?.sort?.length&&!this.sortRestored&&(this.sortRestored=!0,setTimeout(()=>{const n=e.sort.map(e=>{const n=t.columnManager.findColumn(e.field);return n?{column:n,dir:e.dir}:null}).filter(Boolean);t.setSort(n)},100)),this.stateRestored=!0}})},checkQualityGateStatus(t){const e=[],n=[];t.qgate1Status=this.$p.t("abgabetool/c4keinTerminVorhanden"),t.qgate1StatusRank=0,t.qgate2Status=this.$p.t("abgabetool/c4keinTerminVorhanden"),t.qgate2StatusRank=0,t.abgabetermine.forEach(t=>{"qualgate1"==t.paabgabetyp_kurzbz&&e.push(t),"qualgate2"==t.paabgabetyp_kurzbz&&n.push(t)}),e.forEach(e=>{if(null!=e.note&&t.qgate1StatusRank<=5){("object"!=typeof e.note?this.notenOptions.find(t=>t.note==e.note):e.note).positiv?(t.qgate1Status=this.$p.t("abgabetool/c4positivBenotet"),t.qgate1StatusRank=5):(t.qgate1Status=this.$p.t("abgabetool/c4negativBenotet"),t.qgate1StatusRank=4)}else null==e.note&&t.qgate1StatusRank<=3?(t.qgate1Status=this.$p.t("abgabetool/c4notYetGraded"),t.qgate1StatusRank=3):1==e.upload_allowed&&null==e.abgabedatum&&t.qgate1StatusRank<=2?(t.qgate1Status=this.$p.t("abgabetool/c4notSubmitted"),t.qgate1StatusRank=2):0==e.upload_allowed&&e.diffMs<=0&&t.qgate1StatusRank<=1&&(t.qgate1Status=this.$p.t("abgabetool/c4notHappenedYet"),t.qgate1StatusRank=1)}),n.forEach(e=>{if(null!=e.note&&t.qgate1StatusRank<=5){("object"!=typeof e.note?this.notenOptions.find(t=>t.note==e.note):e.note).positiv?(t.qgate2Status=this.$p.t("abgabetool/c4positivBenotet"),t.qgate2StatusRank=5):(t.qgate2Status=this.$p.t("abgabetool/c4negativBenotet"),t.qgate2StatusRank=4)}else null==e.note&&t.qgate2StatusRank<=3?(t.qgate2Status=this.$p.t("abgabetool/c4notYetGraded"),t.qgate2StatusRank=3):1==e.upload_allowed&&null==e.abgabedatum&&t.qgate2StatusRank<=2?(t.qgate2Status=this.$p.t("abgabetool/c4notSubmitted"),t.qgate2StatusRank=2):0==e.upload_allowed&&e.diffMs<=0&&t.qgate2StatusRank<=1&&(t.qgate2Status=this.$p.t("abgabetool/c4notHappenedYet"),t.qgate2StatusRank=1)})},checkAbgabetermineProjektarbeit(t){const e=luxon.DateTime.now();t.abgabetermine.forEach(n=>{n.dateStyle=an(n,this.notenOptions);const a=luxon.DateTime.fromISO(n.datum).endOf("day");n.luxonDate=a,n.diffMs=a.toMillis()-e.toMillis(),n.diffMs<0?(!t.prevTermin||n.diffMs>t.prevTermin.diffMs)&&(t.prevTermin=n):n.diffMs>0&&(!t.nextTermin||n.diffMs
    '+t+'

    '+n+" - "+this.formatDate(e.datum)+"

    "}return""},selectHandler(t,e){const n=e.getRow();return n.isSelected()?n.deselect():n.select(),t.stopPropagation(),!1},selectAllHandler(t,e){const n=e.getTable().getRows().filter(t=>t.getData().selectable);return n.every(t=>t.isSelected())?n.forEach(t=>t.deselect()):n.forEach(t=>t.select()),t.stopPropagation(),!1},handleToggleFullscreenDetail(){this.detailIsFullscreen=!this.detailIsFullscreen},getOptionLabelAbgabetyp:t=>t.bezeichnung,formatDate(t){const e=new Date(t),n=t=>String(t).padStart(2,"0"),a=n(e.getMonth()+1);return`${n(e.getDate())}.${a}.${e.getFullYear()}`},undoSelection(t){const e=t.getRow();e.isSelected()&&e.deselect()},selectionCheck(t){const e=t.getData();return"Zweitbegutachter"!=e?.betreuerart_kurzbz},showDeadlines(){const t=FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/Cis/Abgabetool/Deadlines";window.open(t,"_blank")},toggleShowAll(t){this.showAll=t,this.loading=!0,this.loadProjektarbeiten(t,()=>{this.$refs.abgabeTable?.tabulator.redraw(!0),this.$refs.abgabeTable?.tabulator.setSort([]),this.loading=!1})},openAddSeriesModal(){this.$refs.modalContainerAddSeries.show()},addSeries(){this.saving=!0,this.$api.call(Qe.postSerientermin(this.serienTermin.datum.toISOString(),this.serienTermin.bezeichnung.paabgabetyp_kurzbz,this.serienTermin.bezeichnung.bezeichnung,this.serienTermin.kurzbz,this.serienTermin.upload_allowed,this.selectedData?.map(t=>t.projektarbeit_id),!1)).then(t=>{if("success"===t.meta.status&&t.data){this.$fhcAlert.alertSuccess(this.$p.t("abgabetool/serienTerminGespeichert"));const t=this.$refs.abgabeTable?.tabulator.rowManager.scrollLeft,e=this.$refs.abgabeTable?.tabulator.rowManager.scrollTop;this.loading=!0,this.loadProjektarbeiten(this.showAll,()=>{this.$refs.abgabeTable?.tabulator.redraw(!0),this.$refs.abgabeTable?.tabulator.setSort([]),this.loading=!1,Vue.nextTick(()=>{const n=this.$refs.abgabeTable?.tabulator.element.querySelector(".tabulator-tableholder");n&&(n.scrollLeft=t,n.scrollTop=e)})})}else this.$fhcAlert.alertError(this.$p.t("abgabetool/errorSerienterminSpeichern"))}).finally(()=>{this.saving=!1}),this.$refs.modalContainerAddSeries.hide()},createInfoString(t){let e="";return t.forEach(t=>{e+=t,e+="; "}),e},isPastDate(t){const e=luxon.DateTime.fromISO(t,{zone:"Europe/Vienna"}).endOf("day");return luxon.DateTime.now().setZone("Europe/Vienna")>e},setDetailComponent(t){this.loading=!0;const e=this.projektarbeiten?.retval?.find(e=>e.projektarbeit_id==t.projektarbeit_id);let n=!1;if(void 0!==e.note&&null!==e.note){this.notenOptionsNonFinal.find(t=>t.note)&&(n=!1),n=!0}e?.abgabetermine?.length&&this.$api.call(Qe.getSignaturStatusForProjektarbeitAbgaben(e.abgabetermine.map(t=>t.paabgabe_id),e.student_uid)).then(t=>{"success"===t.meta.status&&t.data.forEach(t=>{const n=e.abgabetermine.find(e=>e.paabgabe_id==t.paabgabe_id);n&&void 0!==t.signatur&&(n.signatur=t.signatur)})}),e.abgabetermine.forEach(t=>{const e=this.allowedNotenOptions.find(e=>e.note==t.note);e&&(t.note=e),t.file=[],!t.noteBackend&&e&&(t.noteBackend=e),t.allowedToSave=!n,t.allowedToDelete=t.allowedToSave&&!t.abgabedatum,t.bezeichnung=this.abgabeTypeOptions.find(e=>e.paabgabetyp_kurzbz===t.paabgabetyp_kurzbz)}),e.student_uid=t.student_uid,e.student=`${e.vorname} ${e.nachname}`,this.selectedProjektarbeit=e,this.$refs.modalContainerAbgabeDetail.show(),this.loading=!1},centeredTextFormatter(t){const e=t.getValue();if(e)return'

    '+e+"

    "},detailFormatter:t=>'
    ',beurteilungFormatter:t=>t.getValue()?'
    ':"-",pkzTextFormatter:t=>'",tableResolve(t){this.tableBuiltResolve=t},buildMailToLink(t){return"mailto:"+t.uid+"@"+this.domain},buildPKZ:t=>`${t.uid} / ${t.matrikelnr}`,buildStg:t=>(t.typ+t.kurzbz)?.toUpperCase(),setupData(t){this.projektarbeiten=t[0],this.domain=t[1],this.tableData=t[0]?.retval?.map(t=>(this.checkAbgabetermineProjektarbeit(t),t.selectable="Zweitbegutachter"!==t.betreuerart_kurzbz,{...t,details:{student_uid:t.uid,projektarbeit_id:t.projektarbeit_id},pkz:this.buildPKZ(t),beurteilung:t.beurteilungLink??null,sem:t.studiensemester_kurzbz,stg:this.buildStg(t),mail:this.buildMailToLink(t),typ:t.projekttyp_kurzbz,titel:t.titel})),this.$refs.abgabeTable.tabulator.setColumns(this.abgabeTableOptions.columns),this.$refs.abgabeTable.tabulator.setData(this.tableData)},loadProjektarbeiten(t=!1,e){this.$api.call(Qe.getMitarbeiterProjektarbeiten(t)).then(t=>{t?.data&&this.setupData(t.data)}).finally(()=>{e&&e()})},loadAbgaben(t){return new Promise(e=>{this.$api.call(Qe.getStudentProjektabgaben(t)).then(t=>{e(t)})})},handleUuidDefined(t){this.tabulatorUuid=t},calcMaxTableHeight(){const t=this.tabulatorUuid?"-"+this.tabulatorUuid:"",e=document.getElementById("filterTableDataset"+t);if(!e)return;const n=e.getBoundingClientRect();this.abgabeTableOptions.height=window.visualViewport.height-n.top-80,this.$refs.abgabeTable.tabulator.setHeight(this.abgabeTableOptions.height)},async setupMounted(){this.tableBuiltPromise=new Promise(this.tableResolve),await this.tableBuiltPromise,this.loadProjektarbeiten(),this.calcMaxTableHeight()}},watch:{"serienTermin.bezeichnung"(t){"qualgate1"!==t?.paabgabetyp_kurzbz&&"qualgate2"!==t?.paabgabetyp_kurzbz||(this.serienTermin.kurzbz=t.bezeichnung),this.serienTermin.upload_allowed=t.upload_allowed_default}},computed:{emailItems(){const t=[];return this.BETREUER_SAMMELMAIL_BUTTON_STUDENT&&t.push({label:this.$p.t("abgabetool/c4sendEmailStudierendev2",[this.uniqueStudentEmailCount]),command:this.sammelMailStudent}),t},uniqueStudentEmailCount(){const t=new Set;return this.selectedData.forEach(e=>{e.student_uid&&t.add(e.student_uid)}),t.size},getAllowedAbgabeTypeOptions(){return this.abgabeTypeOptions.filter(t=>this.abgabetypenBetreuer.includes(t.paabgabetyp_kurzbz))}},created(){this.phrasenPromise=this.$p.loadCategory(["abgabetool","global"]),this.phrasenPromise.then(()=>{this.phrasenResolved=!0}),this.$api.call(Qe.getConfig()).then(t=>{this.turnitin_link=t.data?.turnitin_link,this.old_abgabe_beurteilung_link=t.data?.old_abgabe_beurteilung_link,this.abgabetypenBetreuer=t.data?.abgabetypenBetreuer,this.BETREUER_SAMMELMAIL_BUTTON_STUDENT=t.data?.BETREUER_SAMMELMAIL_BUTTON_STUDENT}).catch(t=>{this.loading=!1}),this.$api.call(Qe.getNoten()).then(t=>{"success"==t.meta.status&&(this.notenOptions=t.data[0],this.allowedNotenOptions=this.notenOptions.filter(e=>t.data[1].includes(e.note)),this.notenOptionsNonFinal=this.notenOptions.filter(e=>t.data[2].includes(e.note)))}).catch(t=>{this.loading=!1}),this.$api.call(Qe.getPaAbgabetypen()).then(t=>{this.abgabeTypeOptions=t.data}).catch(t=>{this.loading=!1})},mounted(){this.setupMounted()},template:'\n\t\n '};var dn={name:"BootstrapOffcanvas",data:()=>({offcanvas:null}),props:{backdrop:{type:[Boolean,String],default:!0,validator:t=>["static",!0,!1].includes(t)},keyboard:{type:Boolean,default:!0},scroll:{type:Boolean,default:!1},placement:{type:String,default:"start",validator:t=>["start","end","top","bottom"].includes(t)},noCloseBtn:Boolean,headerClass:{type:[String,Array,Object],default:""},bodyClass:{type:[String,Array,Object],default:"p-4"},footerClass:{type:[String,Array,Object],default:""},dialogClass:[String,Array,Object]},emits:["hideBsOffcanvas","hiddenBsOffcanvas","hidePreventedBsOffcanvas","showBsOffcanvas","shownBsOffcanvas"],methods:{dispose(){return this.offcanvas?.dispose()},hide(){return this.offcanvas?.hide()},show(t){return this.offcanvas?.show(t)},toggle(){return this.offcanvas?.toggle()},popup(t,e,n,a){const i=this,s={};void 0!==t&&(s.default=()=>t),void 0!==n&&(s.title=()=>n),void 0!==a&&(s.footer=()=>a);let r=!1;return"undefined"!=typeof primevue&&(r=!0),new Promise((t,n)=>{const a=Vue.createApp({name:"OffcanvasTmpApp",setup:()=>()=>Vue.h(i,{class:"offcanvas-wrapper",ref:"offcanvas",...e},s),mounted(){this.$refs.offcanvas.show()},beforeUnmount(){this.$refs.offcanvas&&(!1!==this.$refs.offcanvas.result?t(this.$refs.offcanvas.result):n())},unmounted(){l.parentElement.removeChild(l)}}),l=document.createElement("div");r&&a.use(primevue.config.default,{zIndex:{overlay:9999}}),Promise.resolve().then(function(){return it}).then(t=>{a.use(t.default),a.mount(l),document.body.appendChild(l)})})}},mounted(){this.$refs.offcanvas&&(this.offcanvas=new bootstrap.Offcanvas(this.$refs.offcanvas,{backdrop:this.backdrop,keyboard:this.keyboard,scroll:this.scroll}))},template:'\n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\n\t\t\t\n\t\t
    \n\t'},cn={getAllStudiensemesterAndAktOrNext:()=>({method:"get",url:"/api/frontend/v1/organisation/Studiensemester/getAllStudiensemesterAndAktOrNext"}),getAll:(t=null,e=null)=>({method:"get",url:"api/frontend/v1/organisation/studiensemester/getAll",params:{order:t,start:e}})};const un={name:"AbgabetoolAssistenz",components:{AbgabeterminStatusLegende:{name:"AbgabeterminStatusLegende",template:'\t\n\t\t
    \n\t\t\t
    \n\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t(\'abgabetool/c4tooltipVerspaetet\')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t(\'abgabetool/c4tooltipVerpasst\')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t(\'abgabetool/c4tooltipAbzugeben\')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t(\'abgabetool/c4tooltipStandardv2\')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t(\'abgabetool/c4tooltipAbgegeben\')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t(\'abgabetool/c4tooltipBeurteilungerforderlich\')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t(\'abgabetool/c4tooltipBestanden\')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t(\'abgabetool/c4tooltipNichtBestanden\')) }}
    \n\t\t\t\t\t
    \t\n\t\t\t\t
    \n\n\t\t\t
    \n\t\t
    \t\n\t'},BsModal:s,BsOffcanvas:dn,CoreFilterCmpt:pe,AbgabeDetail:rn,Checkbox:primevue.checkbox,Dropdown:primevue.dropdown,Inplace:primevue.inplace,Textarea:primevue.textarea,Timeline:primevue.timeline,TieredMenu:primevue.tieredmenu,VueDatePicker:i,FhcOverlay:Xe},provide(){return{abgabeTypeOptions:Vue.computed(()=>this.abgabeTypeOptions),allowedNotenOptions:Vue.computed(()=>this.allowedNotenOptions),notenOptionsNonFinal:Vue.computed(()=>this.notenOptionsNonFinal),turnitin_link:Vue.computed(()=>this.turnitin_link),old_abgabe_beurteilung_link:Vue.computed(()=>this.old_abgabe_beurteilung_link),abgabetypenBetreuer:Vue.computed(()=>this.abgabeTypeOptions)}},props:{stg_kz_prop:{default:null},viewData:{type:Object,required:!0,default:()=>({name:"",uid:""}),validator:t=>t&&t.uid}},data(){return{tableData:null,studiensemesterOptions:null,allSem:null,curSem:null,notenOptionFilter:null,inplaceToggle:!1,headerFiltersRestored:!1,filtersRestored:!1,colLayoutRestored:!1,sortRestored:!1,stateRestored:!1,timelineProjekt:null,selectedStudiengangOption:null,studiengaengeOptions:null,detailIsFullscreen:!1,allConfigPromise:null,phrasenPromise:null,phrasenResolved:!1,turnitin_link:null,old_abgabe_beurteilung_link:null,ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT:null,ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER:null,saving:!1,loading:!1,abgabeTypeOptions:null,notenOptions:null,allowedNotenFilterOptions:null,allowedNotenOptions:null,notenOptionsNonFinal:null,serienTermin:Vue.reactive({datum:new Date,bezeichnung:{paabgabetyp_kurzbz:"zwischen",bezeichnung:"Zwischenabgabe"},kurzbz:"",fixtermin:!1,invertedFixtermin:!0,upload_allowed:!1}),showAll:!1,tabulatorUuid:Vue.ref(0),selectedData:[],domain:"",student_uid:null,detail:null,detailOffset:0,projektarbeiten:null,selectedProjektarbeit:null,tableBuiltResolve:null,tableBuiltPromise:null,abgabeTableOptions:{minHeight:250,index:"projektarbeit_id",layout:"fitData",placeholder:Vue.computed(()=>this.$capitalize(this.$p.t("global/noDataAvailable"))),selectable:!0,selectableCheck:this.selectionCheck,rowHeight:40,renderVerticalBuffer:2e3,columns:[{formatter:function(t,e,n){if(!t.getRow().getData().selectable)return;let a=document.createElement("input");a.type="checkbox",a.addEventListener("click",n=>{n.stopPropagation(),e&&e.handleClick&&e.handleClick(n,t)}),t.getRow().getData().checkbox=a;let i=document.createElement("div");return i.style.cssText="display: flex; justify-content: center; align-items: center; height: 100%; width: 100%;",i.appendChild(a),i},titleFormatter:function(t,e,n){let a=document.createElement("input");return a.type="checkbox",a.addEventListener("click",n=>{n.stopPropagation(),e&&e.handleClick&&e.handleClick(n,t)}),a},hozAlign:"center",headerSort:!1,formatterParams:{handleClick:this.selectHandler},titleFormatterParams:{handleClick:this.selectAllHandler},width:50,cssClass:"sticky-col"},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4details"))),field:"details",headerFilter:!1,headerSort:!1,formatter:this.formAction,tooltip:!1,minWidth:150,cssClass:"sticky-col"},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4personenkennzeichen"))),headerFilter:!0,field:"pkz",formatter:this.pkzTextFormatter,widthGrow:1,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4vorname"))),field:"student_vorname",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4nachname"))),field:"student_nachname",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4studstatus"))),field:"studienstatus",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4orgform"))),field:"orgform",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4projekttyp"))),field:"projekttyp_kurzbz",formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4stg"))),field:"stg",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4note"))),field:"note_bez",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4sem"))),field:"studiensemester_kurzbz",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4titel"))),field:"titel",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4erstbetreuerv2"))),field:"erstbetreuer",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4erstbetreuerTitelPre"))),field:"betreuer_titelpre",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1,visible:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4erstbetreuerVorname"))),field:"betreuer_vorname",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1,visible:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4erstbetreuerNachname"))),field:"betreuer_nachname",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1,visible:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4erstbetreuerTitelPost"))),field:"betreuer_titelpost",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1,visible:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4zweitbetreuerv2"))),field:"zweitbetreuer",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4zweitbetreuerTitelPre"))),field:"zweitbetreuer_titelpre",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1,visible:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4zweitbetreuerVorname"))),field:"zweitbetreuer_vorname",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1,visible:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4zweitbetreuerNachname"))),field:"zweitbetreuer_nachname",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1,visible:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4zweitbetreuerTitelPost"))),field:"zweitbetreuer_titelpost",headerFilter:!0,formatter:this.centeredTextFormatter,widthGrow:1,visible:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4prevAbgabetermin"))),headerFilter:De,headerFilterFunc:this.headerFilterTerminCol,sorter:this.sortFuncTerminCol,field:"prevTermin",formatter:this.abgabterminFormatter,widthGrow:1,width:250,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4nextAbgabetermin"))),field:"nextTermin",headerFilter:De,headerFilterFunc:this.headerFilterTerminCol,sorter:this.sortFuncTerminCol,formatter:this.abgabterminFormatter,widthGrow:1,width:250,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4qgate1Status"))),headerFilter:"list",headerFilterParams:{valuesLookup:this.getQGateStatusList},field:"qgate1Status",formatter:this.centeredTextFormatter,widthGrow:1,width:220,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4qgate2Status"))),headerFilter:"list",headerFilterParams:{valuesLookup:this.getQGateStatusList},field:"qgate2Status",formatter:this.centeredTextFormatter,widthGrow:1,width:220,tooltip:!1}],persistence:!1,persistenceID:"abgabetool_2026_02_26"},abgabeTableEventHandlers:[{event:"rowSelectionChanged",handler:async t=>{this.selectedData.filter(e=>!t.includes(e)).forEach(t=>{t.checkbox&&(t.checkbox.checked=!1)}),t.forEach(t=>{t.checkbox&&(t.checkbox.checked=!0)}),this.selectedData=t}}]}},methods:{handlePaUpdated(t){this.checkAbgabetermineProjektarbeit(t),this.$refs.abgabeTable.tabulator.redraw(!0)},getQGateStatusList(){return[this.$p.t("abgabetool/c4keinTerminVorhanden"),this.$p.t("abgabetool/c4positivBenotet"),this.$p.t("abgabetool/c4negativBenotet"),this.$p.t("abgabetool/c4notYetGraded"),this.$p.t("abgabetool/c4notSubmitted"),this.$p.t("abgabetool/c4notHappenedYet")]},sortFuncTerminCol:(t,e,n,a,i,s,r)=>null==t?1:null==e?-1:"prevTermin"==i._column.field?Math.abs(e.diffMs)-Math.abs(t.diffMs):"nextTermin"==i._column.field?Math.abs(t.diffMs)-Math.abs(e.diffMs):Math.abs(e.diffMs)-Math.abs(t.diffMs),headerFilterTerminCol(t,e){if(!e||!e.luxonDate||!e.luxonDate.isValid)return!1;const n=e.luxonDate,a=t=>{if(!t)return null;let e;return e=t instanceof Date?luxon.DateTime.fromJSDate(t):"string"==typeof t?luxon.DateTime.fromISO(t):luxon.DateTime.fromMillis(Number(t)),e.isValid?e:null},i=a(t[0]),s=a(t[1]);return i&&!s?n.hasSame(i,"day"):!(!i||!s)&&(n>=i.startOf("day")&&n<=s.endOf("day"))},sammelMailStudent(t){const e=[];this.selectedData.forEach(t=>{e.push(`${t.student_uid}@${this.domain}`)});const n=[...new Set(e)],a=this.$p.t("abgabetool/c4sammelmailStudentBetreff",[this.selectedStudiengangOption?.bezeichnung]);ln(n,t.originalEvent,a,this.$fhcAlert,this.$p)},sammelMailBetreuer(t){const e=[];this.selectedData.forEach(t=>{t.betreuer_mail&&e.push(t.betreuer_mail),t.zweitbetreuer_mail&&e.push(t.zweitbetreuer_mail)});const n=[...new Set(e)],a=this.$p.t("abgabetool/c4sammelmailBetreuerBetreff",[this.selectedStudiengangOption?.bezeichnung]);ln(n,t.originalEvent,a,this.$fhcAlert,this.$p)},selectHandler(t,e){const n=e.getRow();return n.isSelected()?n.deselect():n.select(),t.stopPropagation(),!1},selectAllHandler(t,e){const n=e.getTable().getRows().filter(t=>t.getData().selectable);return n.every(t=>t.isSelected())?n.forEach(t=>t.deselect()):n.forEach(t=>t.select()),t.stopPropagation(),!1},checkQualityGateStatus(t){const e=[],n=[];t.qgate1Status=this.$p.t("abgabetool/c4keinTerminVorhanden"),t.qgate1StatusRank=0,t.qgate2Status=this.$p.t("abgabetool/c4keinTerminVorhanden"),t.qgate2StatusRank=0,t.abgabetermine.forEach(t=>{"qualgate1"==t.paabgabetyp_kurzbz&&e.push(t),"qualgate2"==t.paabgabetyp_kurzbz&&n.push(t)}),e.forEach(e=>{if(null!=e.note&&t.qgate1StatusRank<=5){("object"!=typeof e.note?this.notenOptions.find(t=>t.note==e.note):e.note).positiv?(t.qgate1Status=this.$p.t("abgabetool/c4positivBenotet"),t.qgate1StatusRank=5):(t.qgate1Status=this.$p.t("abgabetool/c4negativBenotet"),t.qgate1StatusRank=4)}else null==e.note&&t.qgate1StatusRank<=3?(t.qgate1Status=this.$p.t("abgabetool/c4notYetGraded"),t.qgate1StatusRank=3):1==e.upload_allowed&&null==e.abgabedatum&&t.qgate1StatusRank<=2?(t.qgate1Status=this.$p.t("abgabetool/c4notSubmitted"),t.qgate1StatusRank=2):0==e.upload_allowed&&e.diffMs<=0&&t.qgate1StatusRank<=1&&(t.qgate1Status=this.$p.t("abgabetool/c4notHappenedYet"),t.qgate1StatusRank=1)}),n.forEach(e=>{if(null!=e.note&&t.qgate1StatusRank<=5){("object"!=typeof e.note?this.notenOptions.find(t=>t.note==e.note):e.note).positiv?(t.qgate2Status=this.$p.t("abgabetool/c4positivBenotet"),t.qgate2StatusRank=5):(t.qgate2Status=this.$p.t("abgabetool/c4negativBenotet"),t.qgate2StatusRank=4)}else null==e.note&&t.qgate2StatusRank<=3?(t.qgate2Status=this.$p.t("abgabetool/c4notYetGraded"),t.qgate2StatusRank=3):1==e.upload_allowed&&null==e.abgabedatum&&t.qgate2StatusRank<=2?(t.qgate2Status=this.$p.t("abgabetool/c4notSubmitted"),t.qgate2StatusRank=2):0==e.upload_allowed&&e.diffMs<=0&&t.qgate2StatusRank<=1&&(t.qgate2Status=this.$p.t("abgabetool/c4notHappenedYet"),t.qgate2StatusRank=1)})},getItemBezeichnung:t=>t.bezeichnung?t?.bezeichnung?.bezeichnung??t?.bezeichnung:"",getItemNote(t){if(!t?.note)return"";if(t.note?.bezeichnung)return t.note.bezeichnung;const e=this.notenOptions.find(e=>e.note==t.note);return e?e.bezeichnung:t.note},handleChangeAbgabetypSerientermin(t){"qualgate1"===t.bezeichnung?.paabgabetyp_kurzbz||"qualgate2"===t.bezeichnung?.paabgabetyp_kurzbz?t.kurzbz=t.bezeichnung.bezeichnung:t.kurzbz=""},semesterChanged(t){if(this.$refs.abgabeTable.tabulator){const e=this.$refs.abgabeTable.tabulator,n=e.getFilters().filter(t=>"studiensemester_kurzbz"!=t.field),a=t.value.studiensemester_kurzbz==this.$p.t("abgabetool/c4all")?"":t.value.studiensemester_kurzbz,i={field:"studiensemester_kurzbz",type:t.value.studiensemester_kurzbz==this.$p.t("abgabetool/c4all")?"!=":"=",value:a};e.setFilter([...n,i])}},checkAbgabetermineProjektarbeit(t){const e=luxon.DateTime.now();t.abgabetermine.forEach(n=>{n.bezeichnung=this.abgabeTypeOptions.find(t=>t.paabgabetyp_kurzbz===n.paabgabetyp_kurzbz),n.dateStyle=an(n,this.notenOptions);const a=luxon.DateTime.fromISO(n.datum).endOf("day");n.luxonDate=a,n.diffMs=a.toMillis()-e.toMillis(),n.diffMs<0?(!t.prevTermin||n.diffMs>t.prevTermin.diffMs)&&(t.prevTermin=n):n.diffMs>0&&(!t.nextTermin||n.diffMs({field:t.field,visible:t.visible,width:t.width})),sort:t.getSorters().map(t=>({field:t.field,dir:t.dir})),filters:t.getFilters(),headerFilters:t.getHeaderFilters()};localStorage.setItem(this.abgabeTableOptions.persistenceID,JSON.stringify(e))},handleTableBuilt(){const t=this.$refs.abgabeTable.tabulator;this.tableBuiltResolve(),t.on("columnMoved",()=>{this.saveState(t)}),t.on("columnResized",()=>{this.saveState(t)}),t.on("columnVisibilityChanged",()=>{this.saveState(t)}),t.on("filterChanged",()=>{this.saveState(t)}),t.on("headerFilterChanged",()=>{this.saveState(t)}),t.on("dataSorted",()=>{this.saveState(t)}),t.on("columnSorted",()=>{this.saveState(t)}),t.on("sortersChanged",()=>{this.saveState(t)});const e=this.loadState();t.on("renderComplete",()=>{if(!this.stateRestored){if(e?.columns&&!this.colLayoutRestored){const n=e.columns.map(t=>({field:t.field,width:t.width,visible:t.visible}));t.setColumnLayout(n),this.colLayoutRestored=!0}if(e?.filters&&!this.filtersRestored&&(this.filtersRestored=!0,t.setFilter(e.filters)),e?.headerFilters&&!this.headerFiltersRestored){this.headerFiltersRestored=!0;for(let n of e.headerFilters)t.setHeaderFilterValue(n.field,n.value)}e?.sort?.length&&!this.sortRestored&&(this.sortRestored=!0,setTimeout(()=>{const n=e.sort.map(e=>{const n=t.columnManager.findColumn(e.field);return n?{column:n,dir:e.dir}:null}).filter(Boolean);t.setSort(n)},100)),this.stateRestored=!0}})},handleToggleFullscreenDetail(){this.detailIsFullscreen=!this.detailIsFullscreen},getOptionLabelAbgabetyp:t=>t.bezeichnung,getOptionLabelStg:t=>t.kurzbzlang+" "+t.bezeichnung,getOptionLabelStudiensemester:t=>t.studiensemester_kurzbz,getNotenFilterOptionLabel:t=>t.bezeichnung,formatDate(t){if(null===t)return"";const e=new Date(t),n=t=>String(t).padStart(2,"0"),a=n(e.getMonth()+1);return`${n(e.getDate())}.${a}.${e.getFullYear()}`},formAction(t){const e=document.createElement("div");e.className="d-flex gap-3",e.style.display="flex",e.style.alignItems="stretch",e.style.justifyContent="center",e.style.height="100%";const n=t.getValue(),a=(t,e,n)=>{const a=document.createElement("button");return a.className="btn btn-outline-secondary",a.style.display="flex",a.style.alignItems="center",a.style.justifyContent="center",a.style.height="100%",a.style.aspectRatio="1 / 1",a.style.padding="0","fa fa-timeline"==t&&(a.style.transform="rotate(90deg)"),a.innerHTML=``,a.title=this.$capitalize(this.$p.t(e)),a.addEventListener("click",t=>{t.stopPropagation(),t.stopImmediatePropagation(),n()}),a};return e.append(a("fa fa-folder-open","abgabetool/c4details",()=>this.setDetailComponent(n)),a("fa fa-timeline","abgabetool/c4termineTimeLine",()=>this.openTimeline(n))),e},undoSelection(t){const e=t.getRow();e.isSelected()&&e.deselect()},selectionCheck(t){const e=t.getData();return"Zweitbegutachter"!=e?.betreuerart_kurzbz},showDeadlines(){const t=FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/Cis/Abgabetool/Deadlines";window.open(t,"_blank")},openAddSeriesModal(){this.$refs.modalContainerAddSeries.show()},addSeries(){const t=this.selectedData?.map(t=>t.projektarbeit_id),e=[...this.selectedData];this.saving=!0,this.serienTermin.fixtermin=!this.serienTermin.invertedFixtermin,this.$api.call(Qe.postSerientermin(this.serienTermin.datum.toISOString(),this.serienTermin.bezeichnung.paabgabetyp_kurzbz,this.serienTermin.bezeichnung.bezeichnung,this.serienTermin.kurzbz,this.serienTermin.upload_allowed,t,this.serienTermin.fixtermin)).then(e=>{"success"===e.meta.status&&e.data?this.$fhcAlert.alertSuccess(this.$p.t("abgabetool/serienTerminGespeichert")):this.$fhcAlert.alertError(this.$p.t("abgabetool/errorSerienterminSpeichern"));const n=e.data;t.forEach(t=>{const e=n.find(e=>e.projektarbeit_id==t),a=this.projektarbeiten.find(e=>e.projektarbeit_id==t);e.bezeichnung=this.abgabeTypeOptions.find(t=>t.paabgabetyp_kurzbz==e.paabgabetyp_kurzbz),a.abgabetermine.push(e),a.abgabetermine.sort((t,e)=>new Date(t.datum)-new Date(e.datum))});const a=this.$refs.abgabeTable.tabulator,i=a.rowManager.scrollLeft,s=a.rowManager.scrollTop,r=this.mapProjekteToTableData(this.projektarbeiten);a.setData(r),a.redraw(!0),Vue.nextTick(()=>{const t=this.$refs.abgabeTable?.tabulator.element.querySelector(".tabulator-tableholder");t&&(t.scrollLeft=i,t.scrollTop=s)})}).finally(()=>{this.saving=!1,this.selectedData=e}),this.$refs.modalContainerAddSeries.hide()},mapProjekteToTableData(t){return t.map(t=>{if(t.selectable=!0,t.prevTermin=null,t.nextTermin=null,this.checkAbgabetermineProjektarbeit(t),this.notenOptions&&t.note){const e=this.notenOptions.find(e=>e.note==t.note);t.note_bez=e.bezeichnung}return{...t,abgabetermine:t.abgabetermine,details:{student_uid:t.student_uid,projektarbeit_id:t.projektarbeit_id},pkz:this.buildPKZ(t),beurteilung:t.beurteilungLink??null,sem:t.studiensemester_kurzbz,stg:this.buildStg(t),mail:this.buildMailToLink(t),erstbetreuer:this.buildErstbetreuer(t),zweitbetreuer:this.buildZweitbetreuer(t),typ:t.projekttyp_kurzbz,titel:t.titel}})},createInfoString(t){let e="";return t.forEach(t=>{e+=t,e+="; "}),e},isPastDate(t){const e=luxon.DateTime.fromISO(t,{zone:"Europe/Vienna"}).endOf("day");return luxon.DateTime.now().setZone("Europe/Vienna")>e},setDetailComponent(t){const e=this.projektarbeiten.find(e=>e.projektarbeit_id==t.projektarbeit_id);e?.abgabetermine?.length&&this.$api.call(Qe.getSignaturStatusForProjektarbeitAbgaben(e.abgabetermine.map(t=>t.paabgabe_id),e.student_uid)).then(t=>{"success"===t.meta.status&&t.data.forEach(t=>{const n=e.abgabetermine.find(e=>e.paabgabe_id==t.paabgabe_id);n&&void 0!==t.signatur&&(n.signatur=t.signatur)})});const n=null!==e.note;e.abgabetermine.forEach(t=>{"object"!=typeof t.note&&(t.note=this.allowedNotenOptions.find(e=>e.note==t.note)),!t.noteBackend&&t.note&&(t.noteBackend=t.note),t.file=[],t.allowedToSave=!n,t.allowedToDelete=!n&&!t.abgabedatum});const a=e.vorname??e.student_vorname,i=e.nachname??e.student_nachname;e.student=`${a} ${i}`,this.selectedProjektarbeit=e,this.$refs.modalContainerAbgabeDetail.show()},openTimeline(t){const e=this.projektarbeiten.find(e=>e.projektarbeit_id==t.projektarbeit_id);e?(e.abgabetermine.forEach(t=>{const e=this.abgabeTypeOptions.find(e=>e.paabgabetyp_kurzbz==t.paabgabetyp_kurzbz);t.benotbar=e.benotbar}),this.timelineProjekt=e,this.$refs.drawer.show()):this.$fhcAlert.alertInfo("Keine projektarbeit gefunden")},centeredTextFormatter(t){const e=t.getValue();if(e)return'

    '+e+"

    "},detailFormatter:t=>'
    ',mailFormatter:t=>'
    ',timelineFormatter:()=>'
    ',beurteilungFormatter:t=>t.getValue()?'
    ':"-",pkzTextFormatter:t=>'",abgabterminFormatter(t){const e=t.getValue();if(e){let t="";switch(e.dateStyle){case"verspaetet":t='';break;case"verpasst":t='';break;case"abzugeben":t='';break;case"standard":t='';break;case"abgegeben":t='';break;case"beurteilungerforderlich":t='';break;case"bestanden":t='';break;case"nichtbestanden":t=''}const n=e.bezeichnung?.bezeichnung??e.bezeichnung;return'
    '+t+'

    '+n+" - "+this.formatDate(e.datum)+"

    "}return""},tableResolve(t){this.tableBuiltResolve=t},buildMailToLink(t){return"mailto:"+t.student_uid+"@"+this.domain},buildPKZ:t=>`${t.student_uid} / ${t.matrikelnr}`,buildStg:t=>(t.typ+t.kurzbz)?.toUpperCase(),buildErstbetreuer:t=>t.erstbetreuer_full_name?t.erstbetreuer_full_name:t.betreuer_vorname+" "+t.betreuer_nachname,buildZweitbetreuer:t=>t.zweitbetreuer_full_name??"",async setupData(t){this.projektarbeiten=t[0],this.domain=t[1],this.tableData=this.mapProjekteToTableData(this.projektarbeiten),await this.tableBuiltPromise,this.$refs.abgabeTable.tabulator.setData(this.tableData)},loadProjektarbeiten(t=!1,e){this.loading=!0,this.$api.call(Qe.getProjektarbeitenForStudiengang(this.selectedStudiengangOption.studiengang_kz,this.notenOptionFilter?.benotet??0)).then(t=>{t?.data&&this.setupData(t.data)}).finally(()=>{e&&e()}).finally(()=>{this.loading=!1})},loadAbgaben(t){return new Promise(e=>{this.$api.call(Qe.getStudentProjektabgaben(t)).then(t=>{e(t)})})},handleUuidDefined(t){this.tabulatorUuid=t},calcMaxTableHeight(){const t=this.tabulatorUuid?"-"+this.tabulatorUuid:"",e=document.getElementById("filterTableDataset"+t);if(!e)return;const n=e.getBoundingClientRect();this.abgabeTableOptions.height=window.visualViewport.height-n.top-80,this.$refs.abgabeTable.tabulator.setHeight(this.abgabeTableOptions.height)},async setupMounted(){this.tableBuiltPromise=new Promise(this.tableResolve),await this.tableBuiltPromise,await this.allConfigPromise,this.calcMaxTableHeight()},getOptionDisabled:t=>!t.aktiv},computed:{emailItems(){const t=[];return this.ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT&&t.push({label:this.$p.t("abgabetool/c4sendEmailStudierendev2",[this.uniqueStudentEmailCount]),command:this.sammelMailStudent}),this.ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER&&t.push({label:this.$p.t("abgabetool/c4sendEmailBetreuerv3",[this.uniqueBetreuerEmailCount]),command:this.sammelMailBetreuer}),t},uniqueBetreuerEmailCount(){const t=new Set;return this.selectedData.forEach(e=>{e.betreuer_mail&&t.add(e.betreuer_mail),e.zweitbetreuer_mail&&t.add(e.zweitbetreuer_mail)}),t.size},uniqueStudentEmailCount(){const t=new Set;return this.selectedData.forEach(e=>{e.student_uid&&t.add(e.student_uid)}),t.size}},watch:{"serienTermin.bezeichnung"(t){"qualgate1"!==t?.paabgabetyp_kurzbz&&"qualgate2"!==t?.paabgabetyp_kurzbz||(this.serienTermin.kurzbz=t.bezeichnung),this.serienTermin.upload_allowed=t.upload_allowed_default},selectedStudiengangOption(t,e){null!==this.notenOptionFilter&&null!==this.selectedStudiengangOption&&this.loadProjektarbeiten()},notenOptionFilter(t){null!==this.notenOptionFilter&&null!==this.selectedStudiengangOption&&this.loadProjektarbeiten()},selectedData(t){const e=this.$refs.abgabeTable?.tabulator;if(!e)return;const n=e.getRows();t.forEach(t=>{const e=n.find(e=>{if(e.getData().projektarbeit_id==t.projektarbeit_id)return e});e.select();const a=e.getElement().children[0]?.children[0]?.children[0];a&&(a.checked=!0)})}},created(){this.loading=!0,this.phrasenPromise=this.$p.loadCategory(["abgabetool","global"]),this.phrasenPromise.then(()=>{this.phrasenResolved=!0});const t=[this.$api.call(Qe.getConfig()),this.$api.call(Qe.getStudiengaenge()),this.$api.call(cn.getAllStudiensemesterAndAktOrNext()),this.$api.call(Qe.getNoten()),this.$api.call(Qe.getPaAbgabetypen())];this.allConfigPromise=Promise.allSettled(t).then(t=>{if("fulfilled"===t[0].status){const e=t[0].value;this.turnitin_link=e.data?.turnitin_link,this.old_abgabe_beurteilung_link=e.data?.old_abgabe_beurteilung_link,this.ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT=e.data?.ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT,this.ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER=e.data?.ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER}if("fulfilled"===t[1].status){const e=t[1].value;this.studiengaengeOptions=e.data,this.studiengaengeOptions?.length&&(this.selectedStudiengangOption=this.stg_kz_prop?e.data.find(t=>t.studiengang_kz==this.stg_kz_prop):e.data[0])}if("fulfilled"===t[2].status){const e=t[2].value;this.allSem=e.data[0];const n={studiensemester_kurzbz:this.$p.t("abgabetool/c4all")};this.curSem=n,this.studiensemesterOptions=[n,...this.allSem]}if("fulfilled"===t[3].status){const e=t[3].value;"success"===e.meta?.status&&(this.notenOptions=e.data[0],this.allowedNotenOptions=this.notenOptions.filter(t=>e.data[1].includes(t.note)),this.notenOptionsNonFinal=this.notenOptions.filter(t=>e.data[2].includes(t.note))),this.allowedNotenFilterOptions=[{bezeichnung:Vue.computed(()=>this.$p.t("abgabetool/keineNoteEingetragen")),benotet:0},{bezeichnung:Vue.computed(()=>this.$p.t("abgabetool/c4benotet")),benotet:1},{bezeichnung:Vue.computed(()=>this.$p.t("abgabetool/showAll")),benotet:-1}],this.notenOptionFilter=this.allowedNotenFilterOptions[0]}if("fulfilled"===t[4].status){const e=t[4].value;this.abgabeTypeOptions=e.data}}).finally(()=>{this.loading=!1})},mounted(){this.setupMounted()},template:'\n\t\n '},pn={name:"DeadlineOverview",components:{CoreFilterCmpt:pe},props:{person_uid_prop:{default:null},viewData:{type:Object,required:!0,default:()=>({name:"",uid:""}),validator:t=>t&&t.name&&t.uid}},data(){return{fullName:null,deadlines:null,tabulatorUuid:Vue.ref(0),tableBuiltResolve:null,tableBuiltPromise:null,phrasenPromise:null,phrasenResolved:!1,deadlineTableOptions:{height:700,index:"projektarbeit_id",layout:"fitColumns",placeholder:Vue.computed(()=>this.$p.t("global/noDataAvailable")),columns:[{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4zieldatumv2"))),field:"datum",formatter:this.centeredTextFormatter,widthGrow:1,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4fixterminv4"))),field:"fixterminstring",formatter:this.centeredTextFormatter,widthGrow:1,tooltip:!1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4abgabetyp"))),field:"typ_bezeichnung",formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4abgabekurzbzv2"))),field:"kurzbz",formatter:this.centeredTextFormatter,widthGrow:3},{title:Vue.computed(()=>this.$capitalize(this.$p.t("person/studentIn"))),field:"student",formatter:this.centeredTextFormatter,widthGrow:2},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4stg"))),field:"stg",formatter:this.centeredTextFormatter,widthGrow:1},{title:Vue.computed(()=>this.$capitalize(this.$p.t("abgabetool/c4sem"))),field:"semester",formatter:this.centeredTextFormatter,widthGrow:1}],persistence:!1},deadlineTableEventHandlers:[{event:"tableBuilt",handler:async()=>{this.tableBuiltResolve()}},{event:"cellClick",handler:async(t,e)=>{if("details"===e.getColumn().getField()){const t=e.getValue();if("detailTermine"===t.mode)this.setDetailComponent(e.getValue());else if("beurteilungDownload"===t.mode){const e=FHC_JS_DATA_STORAGE_OBJECT.app_root+"cis/private/pdfExport.php?xml=projektarbeitsbeurteilung.xml.php&xsl=Projektbeurteilung&betreuerart_kurzbz="+t.betreuerart_kurzbz+"&projektarbeit_id="+t.projektarbeit_id+"&person_id="+t.betreuer_person_id;window.open(e,"_blank")}}else if("beurteilung"===e.getColumn().getField()){const t=e.getValue();"-"!=t&&window.open(t,"_blank")}t.stopPropagation()}}]}},methods:{centeredTextFormatter:t=>'

    '+t.getValue()+"

    ",tableResolve(t){this.tableBuiltResolve=t},loadDeadlines(){this.$api.call(Qe.fetchDeadlines(this.person_uid_prop??null)).then(t=>{t?.data&&this.setupData(t.data)})},setupData(t){this.deadlines=t,this.deadlines.forEach(t=>{t.student=(t.stud_titelpre?t.stud_titelpre+" ":"")+t.stud_vorname+" "+t.stud_nachname+(t.stud_titelpost?" "+t.stud_titelpost:""),t.fixterminstring=t.fixtermin?this.$p.t("abgabetool/c4yes"):this.$p.t("abgabetool/c4no")}),this.$refs.deadlineTable.tabulator.setColumns(this.deadlineTableOptions.columns),this.$refs.deadlineTable.tabulator.setData(this.deadlines)},handleUuidDefined(t){this.tabulatorUuid=t},calcMaxTableHeight(){const t=this.tabulatorUuid?"-"+this.tabulatorUuid:"",e=document.getElementById("filterTableDataset"+t);if(!e)return;const n=e.getBoundingClientRect();this.deadlineTableOptions.height=window.visualViewport.height-n.top-30,this.$refs.deadlineTable.tabulator.setHeight(this.deadlineTableOptions.height)},async setupMounted(){this.tableBuiltPromise=new Promise(this.tableResolve),await this.tableBuiltPromise,this.loadDeadlines(),this.calcMaxTableHeight()}},watch:{},computed:{},created(){this.phrasenPromise=this.$p.loadCategory(["abgabetool","global"]),this.phrasenPromise.then(()=>{this.phrasenResolved=!0})},mounted(){this.setupMounted()},template:'\n\t\t

    {{$p.t(\'abgabetool/deadlinesTitle\')}} {{ fullName ? (\'-\' + fullName) : \'\'}}

    \n\t\t
    \n\t\t\t\n\t\t \n '};var hn={data:()=>({studienSemester:[],selectedStudiensemester:null,studiengaenge:[],selectedStudiengang:null,studienOrdnung:[],selectedStudienordnung:null,semester:[],selectedSemester:null,lehrveranstaltungen:[],selectedLehrveranstaltung:null,menu:null}),provide(){return{studium_studiengang:Vue.computed(()=>this.selectedStudiengang),studium_studiensemester:Vue.computed(()=>this.selectedStudiensemester),studium_semester:Vue.computed(()=>this.selectedSemester),studium_studienordnung:Vue.computed(()=>this.selectedStudienordnung)}},components:{LvUebersicht:Qt},watch:{selectedStudiensemester:function(t,e){if(t&&t!=e){const e=this.getDataFromLocalStorage("sudiensemester");t&&(!e||e&&e!=t)&&this.storeDataToLocalStorage("sudiensemester",t)}},selectedSemester:function(t,e){if(t&&t!=e){const e=this.getDataFromLocalStorage("semester");(!e||e&&e!=t)&&this.storeDataToLocalStorage("semester",t)}},selectedStudiengang:function(t,e){if(t&&t!=e){const e=this.getDataFromLocalStorage("studiengang");(!e||e&&e!=t)&&this.storeDataToLocalStorage("studiengang",JSON.stringify(t))}},selectedStudienordnung:function(t,e){if(t&&t!=e){const e=this.getDataFromLocalStorage("studienordnung");(!e||e&&e!=t)&&this.storeDataToLocalStorage("studienordnung",JSON.stringify(t))}}},methods:{changeStudiensemester(t){let e=this.$refs.studiensemester;e.selectedIndex=(e.selectedIndex+t+e.options.length)%e.options.length,this.changeSelectedStudienSemester(e.value)},changeStudiengang(t){let e=this.$refs.studiengaenge;e.selectedIndex=(e.selectedIndex+t+e.options.length)%e.options.length,this.changeSelectedStudienGang(e.value)},changeSemester(t){let e=this.$refs.semester;e.selectedIndex=(e.selectedIndex+t+e.options.length)%e.options.length,this.changeSelectedSemester(e.value)},changeStudienordnung(t){let e=this.$refs.studienordnung,n=(e.selectedIndex+t+e.options.length)%e.options.length;e.options[n].disabled&&(n=(n+t+e.options.length)%e.options.length),e.selectedIndex=n,this.changeSelectedStudienPlan(e.value)},storeDataToLocalStorage(t,e){localStorage.setItem(t,e)},getDataFromLocalStorage:t=>localStorage.getItem(t),changeSelectedStudienSemester(t){this.$fhcApi.factory.studium.getAllStudienSemester(t,this.selectedStudiengang,this.selectedSemester,this.selectedStudienordnung).then(t=>t.data).then(t=>{this.extractPropertyValues(t)})},changeSelectedStudienGang(t){this.$fhcApi.factory.studium.getAllStudienSemester(this.selectedStudiensemester,t,this.selectedSemester,this.selectedStudienordnung).then(t=>t.data).then(t=>{this.extractPropertyValues(t)})},changeSelectedSemester(t){this.$fhcApi.factory.studium.getAllStudienSemester(this.selectedStudiensemester,this.selectedStudiengang,t,this.selectedStudienordnung).then(t=>t.data).then(t=>{this.extractPropertyValues(t)})},changeSelectedStudienPlan(t){this.$fhcApi.factory.studium.getAllStudienSemester(this.selectedStudiensemester,this.selectedStudiengang,this.selectedSemester,t).then(t=>t.data).then(t=>{this.extractPropertyValues(t)})},openLvUebersicht(t){this.selectedLehrveranstaltung=t,this.selectedLehrveranstaltung.type="lehreinheit",this.selectedLehrveranstaltung.lehreinheit_id=this.selectedLehrveranstaltung.lehrveranstaltung_id,this.selectedLehrveranstaltung&&Vue.nextTick(()=>{this.$refs.lvUebersicht.show()})},sortStudienSemester(t){let e=new RegExp(/^(WS|SS)([0-9]{4})/);t.sort((t,n)=>{let[a,i,s]=t.studiensemester_kurzbz.match(e),[r,l,o]=n.studiensemester_kurzbz.match(e);return s==o?i>l?-1:1:s>o?-1:1})},setHash(t){location.hash=t},extractPropertyValues(t){let{studienSemester:e,studiengang:n,semester:a,studienplan:i,lehrveranstaltungen:s}=t;this.sortStudienSemester(e.all),this.studienSemester=e.all,this.selectedStudiensemester=e.preselected.studiensemester_kurzbz,this.studiengaenge=n.all,this.selectedStudiengang=n.preselected?.studiengang_kz,this.semester=a.all,this.selectedSemester=a?.preselected,this.studienOrdnung=i.all,this.selectedStudienordnung=i.preselected?.studienplan_id,this.lehrveranstaltungen=s,this.lehrveranstaltungen.sort((t,e)=>t.bezeichnung.toLowerCase()>e.bezeichnung.toLowerCase()?1:t.bezeichnung.toLowerCase(){t.lehrveranstaltungen.sort((t,e)=>t.bezeichnung.toLowerCase()>e.bezeichnung.toLowerCase()?1:t.bezeichnung.toLowerCase()t?`${t?.bezeichnung}-${t?.orgform_kurzbz} ( ${t?.orgform_bezeichnung}, ${t?.sprache} )`:"",studiengangTitel:t=>t?`${t?.kurzbzlang} (${t?.bezeichnung})`:"",studiensemesterTitel(t){if(!t)return"";let e=new RegExp(/^(WS|SS)([0-9]{4})/),n=t.match(e);switch(n[1]){case"WS":return`Wintersemester ${n[2]}`;case"SS":return`Sommersemester ${n[2]}`;default:return`${t}`}}},computed:{selectedLehrveranstaltungTitel(){const t=this.studiengaenge.find(t=>t.studiengang_kz==this.selectedStudiengang);return`${this.selectedLehrveranstaltung?.bezeichnung} ${this.selectedLehrveranstaltung?.lehrform_kurzbz} / ${t.kurzbzlang}-${this.selectedSemester} ${this.selectedLehrveranstaltung?.orgform_kurzbz} (${this.selectedStudiensemester})`},computedStudienOrdnung(){return this.studienOrdnung?Object.values(this.studienOrdnung).reduce((t,e)=>(t[e.bezeichnung]||(t[e.bezeichnung]=[]),t[e.bezeichnung].push(e),t),{}):null},computedStudienOrdnungSelectValues(){if(!this.computedStudienOrdnung)return null;let t=[];return Object.entries(this.computedStudienOrdnung).forEach(([e,n])=>{t.push({bezeichnung:`Studienordnung: ${e}`,disabled:!0}),n.forEach(e=>{t.push({studienplan:e,diabled:!1,bezeichnung:`${e?.bezeichnung}-${e?.orgform_kurzbz} ( ${e?.orgform_bezeichnung}, ${e?.sprache} )`})})}),t}},created(){const t=this.getDataFromLocalStorage("sudiensemester")??void 0,e=JSON.parse(this.getDataFromLocalStorage("studiengang"))??void 0,n=this.getDataFromLocalStorage("semester")??void 0,a=JSON.parse(this.getDataFromLocalStorage("studienordnung"))??void 0;this.$fhcApi.factory.studium.getAllStudienSemester(t,e,n,a).then(t=>t.data).then(t=>{this.extractPropertyValues(t)})},template:'\n\t
    \n\t

    Studium

    \n\t
    \n\t\n\t\t\n\t\n\t
    \n\t\t
    \n\t\t
    Studiensemester:
    \n\t\t
    \n\t\t\t\n\t\t\t\n\t\t\t\n\t\t
    \n\t\t
    \n\n\t\t
    \n\t\t
    Studiengang:
    \n\t\t
    \n\t\t\t\n\t\t\t\n\t\t\t\n\t\t
    \n\t\t
    \n\n\t\t
    \n\t\t
    Semester:
    \n\t\t
    \n\t\t\t\n\t\t\t\n\t\t\t\n\t\t
    \n\t\t
    \n\n\t\t
    \n\t\t
    Studienordnung:
    \n\t\t
    \n\t\t\t\n\t\t\t\n\t\t\t\n\t\t
    \n\t\t
    \n\t
    \n\n\t
    \n\n\t
    \n\t\n\t
    \n\n\n\t
    \n\t\n\t'},mn={loadRenderers:()=>({method:"get",url:"/api/frontend/v1/RendererLoader/GetRenderers",params:{}})},gn={info:(t,e)=>({method:"post",url:"/api/frontend/v1/RouteInfo/info",params:{app:t,path:e}})};const fn=FHC_JS_DATA_STORAGE_OBJECT.app_root.replace(/(https:|)(^|\/\/)(.*?\/)/g,"")+FHC_JS_DATA_STORAGE_OBJECT.ci_router,bn=VueRouter.createRouter({history:VueRouter.createWebHistory(`/${fn}`),routes:[{path:"/Cis/Studium",name:"Studium",component:hn,props:!0},{path:"/Cis/Profil/View/:uid",name:"ProfilView",component:Pe,props:!0},{path:"/Cis/Profil",name:"Profil",component:Pe,props:!0},{path:"/Cis/Abgabetool/Student/:student_uid_prop?",name:"AbgabetoolStudent",component:sn,props:!0},{path:"/Cis/Abgabetool/Mitarbeiter",name:"AbgabetoolMitarbeiter",component:on,props:!0},{path:"/Cis/Abgabetool/Assistenz/:stg_kz_prop?",name:"AbgabetoolAssistenz",component:un,props:!0},{path:"/Cis/Abgabetool/Deadlines/:person_uid_prop?",name:"DeadlineOverview",component:pn,props:!0},{path:"/Cis/Raumsuche",name:"Raumsuche",component:Me,props:!0},{path:"/CisVue/Cms/getRoomInformation/:ort_kurzbz",name:"RoomInformationOld",component:Ye,redirect:t=>({name:"RoomInformation",params:{ort_kurzbz:t.params.ort_kurzbz,mode:Ke,focus_date:(new Date).toISOString().split("T")[0]}})},{path:"/CisVue/Cms/getRoomInformation/:mode/:focus_date/:ort_kurzbz",name:"RoomInformation",component:Ye,props:t=>{const e=t.params.mode&&["Month","Week","Day"].includes(t.params.mode.charAt(0).toUpperCase()+t.params.mode.slice(1).toLowerCase())?t.params.mode.charAt(0).toUpperCase()+t.params.mode.slice(1).toLowerCase():Ke,n=new Date(t.params.focus_date);return{propsViewData:{mode:e,focus_date:isNaN(n)?(new Date).toISOString().split("T")[0]:t.params.focus_date,ort_kurzbz:t.params.ort_kurzbz}}},beforeEnter:(t,e,n)=>{t.params.mode&&t.params.focus_date?n():n({name:"RoomInformation",params:{mode:t.params.mode||Ke,focus_date:t.params.focus_date||(new Date).toISOString().split("T")[0],ort_kurzbz:route.params.ort_kurzbz}})}},{path:"/CisVue/Cms/Content/:content_id",name:"Content",component:Ze,props:!0},{path:"/CisVue/Cms/News",name:"News",component:Ve,props:!0},{path:"/Cis/MyLv/:studiensemester?",name:"MyLv",component:te,props:!0},{path:"/Cis/MyLv/Info/:studien_semester/:lehrveranstaltung_id",name:"LvInfo",component:Ut,props:!0},{path:"/Cis/LvPlan/:lv_id(\\d+)",name:"LvPlanOld",component:Lt,redirect(t){const e=Vue.unref(bn.currentRoute),{mode:n,focus_date:a}=e.params;return{name:"LvPlan",params:{mode:n,focus_date:a,lv_id:t.params.lv_id}}}},{path:"/Cis/LvPlan/:mode?/:focus_date?/:lv_id?",name:"LvPlan",component:Lt,props:t=>({propsViewData:t.params})},{path:"/Cis/MyLvPlan/:mode?/:focus_date?",name:"MyLvPlan",component:Rt,props:t=>({propsViewData:t.params})},{path:"/Cis4",name:"Cis4",component:k,props:{dashboard:"CIS"}},{path:"/",name:"FhcDashboard",component:k,props:{dashboard:"CIS"}},{path:"/:pathMatch(.*)*",name:"Fallback",component:k,props:{dashboard:"CIS"},redirect:()=>({name:"Cis4",params:{dashboard:"CIS"}})}]}),vn=Vue.createApp({name:"FhcApp",data:()=>({appSideMenuEntries:{},renderers:null}),components:{},computed:{isMobile:()=>window.matchMedia("(max-width: 767px)").matches},provide(){return{language:Vue.computed(()=>this.$p.user_language),renderers:Vue.computed(()=>this.renderers),isMobile:this.isMobile}},methods:{isInternalRoute(t){const e=window.location.origin;return t.startsWith(e)},handleClick(t){const e=t.target.closest("a");if("skiplink"!=e?.id&&e&&this.isInternalRoute(e.href)){const n=new URL(e.href).pathname,a=this.$router.options.history.base,i=n.replace(a,"")||"/",s=this.$router.resolve(i);if(!s?.matched?.length||"Fallback"===s.name)return;if(t.preventDefault(),this.isMobile){document.getElementById("nav-main").classList.contains("show")&&document.getElementById("nav-main-btn").click()}this.$router.push(i)}}},async created(){await this.$api.call(mn.loadRenderers()).then(t=>t.data).then(t=>{for(let a of Object.keys(t)){let i=null,s=null,r=null;if(t[a].modalTitle&&(i=Vue.markRaw(Vue.defineAsyncComponent(()=>import(t[a].modalTitle)))),t[a].modalContent&&(s=Vue.markRaw(Vue.defineAsyncComponent(()=>import(t[a].modalContent)))),t[a].calendarEvent&&(r=Vue.markRaw(Vue.defineAsyncComponent(()=>import(t[a].calendarEvent)))),t[a].calendarEventStyles){var e=document.head;if(!e.querySelector(`link[href="${t[a].calendarEventStyles}"]`)){var n=document.createElement("link");n.type="text/css",n.rel="stylesheet",n.href=t[a].calendarEventStyles,e.appendChild(n)}}null===this.renderers&&(this.renderers={}),this.renderers[a]||(this.renderers[a]={}),this.renderers[a].modalTitle=i,this.renderers[a].modalContent=s,this.renderers[a].calendarEvent=r}})},mounted(){document.addEventListener("click",this.handleClick)},beforeUnmount(){document.removeEventListener("click",this.handleClick)}});!function(){const t=/Chrome/.test(navigator.userAgent),e=/Firefox/.test(navigator.userAgent);if(t){const t=function(){const t=document.createElement("div");t.style.position="absolute",t.style.top="-9999px",t.style.width="100px",t.style.height="100px",t.style.overflow="scroll",document.body.appendChild(t);const e=t.offsetWidth-t.clientWidth;return document.body.removeChild(t),e}()+"px";document.body.style.setProperty("--scrollbar-width",t)}else e&&document.body.style.setProperty("--scrollbar-width","0px")}(),vn.config.globalProperties.$capitalize=function(t){return t?t[0].toUpperCase()+t.slice(1):""},vn.use(bn),vn.use(primevue.config.default,{zIndex:{overlay:9e3,tooltip:8e3}}),vn.directive("tooltip",primevue.tooltip),vn.use(at),vn.use(ot),vn.directive("contrast",ut),vn.mount("#fhccontent"),bn.afterEach((t,e,n)=>{vn.config.globalProperties.$api.call(gn.info("cis4",t.fullPath))}); //# sourceMappingURL=Fhc.js.map diff --git a/public/dist/js/apps/Dashboard/Fhc.js.map b/public/dist/js/apps/Dashboard/Fhc.js.map index 69d9a62b2..3c034838d 100644 --- a/public/dist/js/apps/Dashboard/Fhc.js.map +++ b/public/dist/js/apps/Dashboard/Fhc.js.map @@ -1 +1 @@ -{"version":3,"file":"Fhc.js","sources":["../../../../js/components/Bootstrap/Modal.js","../../../../js/components/Bootstrap/Alert.js","../../../../js/components/Bootstrap/Confirm.js","../../../../js/components/Drop/Grid/Item.js","../../../../js/composables/GridLogic.js","../../../../js/components/Drop/Grid.js","../../../../js/composables/Dashboard/CachedWidgetLoader.js","../../../../js/components/Dashboard/Item.js","../../../../js/components/Tranistion/HeightTransition.js","../../../../js/components/Dashboard/Widget/WidgetIcon.js","../../../../js/components/Dashboard/Section.js","../../../../js/components/Dashboard/Widget/Picker.js","../../../../js/helpers/ObjectUtils.js","../../../../js/api/factory/cis/dashboard.js","../../../../js/components/Dashboard/Dashboard.js","../../../../js/api/search.js","../../../../js/api/phrasen.js","../../../../js/api/navigation.js","../../../../js/api/filter.js","../../../../js/api/studstatus.js","../../../../js/api/profil.js","../../../../js/api/profilUpdate.js","../../../../js/api/lvPlan.js","../../../../js/api/stv.js","../../../../js/api/stv/verband.js","../../../../js/api/stv/students.js","../../../../js/api/stv/filter.js","../../../../js/api/stv/konto.js","../../../../js/api/stv/group.js","../../../../js/api/stv/kontakt.js","../../../../js/api/stv/prestudent.js","../../../../js/api/stv/status.js","../../../../js/api/stv/details.js","../../../../js/api/stv/exam.js","../../../../js/api/stv/abschlusspruefung.js","../../../../js/api/stv/grades.js","../../../../js/api/stv/mobility.js","../../../../js/api/stv/archiv.js","../../../../js/api/stv/documents.js","../../../../js/api/stv/exemptions.js","../../../../js/api/stv/jointstudies.js","../../../../js/api/stv/courselist.js","../../../../js/api/notiz.js","../../../../js/api/notiz/person.js","../../../../js/api/betriebsmittel.js","../../../../js/api/betriebsmittel/person.js","../../../../js/api/checkperson.js","../../../../js/api/ort.js","../../../../js/api/cms.js","../../../../js/api/lehre.js","../../../../js/api/addons.js","../../../../js/api/messages.js","../../../../js/api/messages/person.js","../../../../js/api/vorlagen.js","../../../../js/api/studium.js","../../../../js/api/fhcapifactory.js","../../../../js/api/dashboard.js","../../../../js/api/bookmark.js","../../../../js/api/ampeln.js","../../../../js/api/studiengang.js","../../../../js/api/menu.js","../../../../js/api/authinfo.js","../../../../js/api/language.js","../../../../js/plugin/OldFhcApi.js","../../../../js/RESTClient.js","../../../../js/plugins/FhcAlert.js","../../../../js/plugins/Api.js","../../../../js/api/factory/phrasen.js","../../../../js/plugins/Phrasen.js","../../../../js/plugins/Theme.js","../../../../js/directives/contrast.js","../../../../js/helpers/DragAndDrop.js","../../../../js/directives/Calendar/DragAndDrop.js","../../../../js/components/Calendar/Base/DragAndDrop.js","../../../../js/components/Calendar/Base/Header.js","../../../../js/components/Calendar/Base/Header/Datepicker.js","../../../../js/components/Calendar/Base/Slider.js","../../../../js/directives/Calendar/Click.js","../../../../js/components/Calendar/Base.js","../../../../js/api/factory/lvPlan.js","../../../../js/components/Calendar/Base/Grid/Line/Event.js","../../../../js/components/Calendar/Base/Grid.js","../../../../js/components/Calendar/Base/Grid/Line.js","../../../../js/components/Calendar/Base/Grid/Line/Background.js","../../../../js/components/Calendar/Base/Label/Day.js","../../../../js/components/Calendar/Base/Label/Dow.js","../../../../js/components/Calendar/Base/Label/Time.js","../../../../js/components/Calendar/Mode/Day/View.js","../../../../js/components/Calendar/Mode/Day.js","../../../../js/composables/Responsive.js","../../../../js/components/Calendar/Mode/Week.js","../../../../js/components/Calendar/Mode/Week/View.js","../../../../js/components/Calendar/Mode/Month.js","../../../../js/components/Calendar/Mode/Month/View.js","../../../../js/components/Calendar/Base/Label/Week.js","../../../../js/components/Calendar/LvPlan.js","../../../../js/composables/EventLoader.js","../../../../js/api/factory/authinfo.js","../../../../js/components/Cis/LvPlan/Lehrveranstaltung.js","../../../../js/components/Cis/LvPlan/Personal.js","../../../../js/components/Cis/Mylv/Semester/Studiengang/Lv/Pruefungen.js","../../../../js/api/factory/lehre.js","../../../../js/components/Cis/Mylv/Semester/Studiengang/Lv/Info.js","../../../../js/mixins/Phrasen.js","../../../../js/components/Cis/Mylv/LvMenu.js","../../../../js/api/factory/addons.js","../../../../js/components/Cis/Mylv/LvUebersicht.js","../../../../js/components/Cis/Mylv/Semester.js","../../../../js/components/Cis/Mylv/Semester/Studiengang.js","../../../../js/components/Cis/Mylv/Semester/Studiengang/Lv.js","../../../../js/components/Cis/Mylv/Student.js","../../../../js/components/Fetch.js","../../../../js/components/filter/Filter/Config.js","../../../../js/components/filter/Filter/Columns.js","../../../../js/components/filter/Table/Download.js","../../../../js/directives/collapseAutoClose.js","../../../../js/tabulator/layouts/fitDataStretchFrozen.js","../../../../js/api/factory/filter.js","../../../../js/components/filter/Filter.js","../../../../js/components/Cis/Profil/ProfilComponents/Mailverteiler.js","../../../../js/components/Cis/Profil/ProfilComponents/FhAusweisStatus.js","../../../../js/components/Cis/Profil/ProfilComponents/QuickLinks.js","../../../../js/components/Cis/Profil/ProfilComponents/Adresse.js","../../../../js/components/Cis/Profil/ProfilComponents/Kontakt.js","../../../../js/components/Cis/Profil/ProfilComponents/ProfilEmails.js","../../../../js/components/Cis/Profil/ProfilComponents/RoleInformation.js","../../../../js/api/factory/profil.js","../../../../js/components/Form/Upload/Dms.js","../../../../js/components/Form/Upload/Dms/Item.js","../../../../js/api/factory/profilUpdate.js","../../../../js/components/Cis/Profil/ProfilModal/EditProfilComponents/ImageUpload.js","../../../../js/components/Cis/Profil/ProfilComponents/ProfilInformation.js","../../../../js/components/Cis/Profil/ProfilModal/EditProfilSelect.js","../../../../js/components/Cis/Profil/ProfilModal/EditProfilComponents/EditKontakt.js","../../../../js/components/Cis/Profil/ProfilModal/EditProfilComponents/EditAdresse.js","../../../../js/components/Cis/Profil/ProfilModal/EditProfilComponents/Status.js","../../../../js/components/Cis/Profil/ProfilModal/EditProfilComponents/TextInputDokument.js","../../../../js/components/Loader.js","../../../../js/components/Cis/Profil/ProfilModal/EditProfil.js","../../../../js/components/Cis/Profil/ProfilComponents/FetchProfilUpdates.js","../../../../js/tabulator/filters/Dates.js","../../../../js/components/Cis/Profil/StudentProfil.js","../../../../js/components/Cis/Profil/MitarbeiterProfil.js","../../../../js/components/Cis/Profil/StudentViewProfil.js","../../../../js/components/Cis/Profil/MitarbeiterViewProfil.js","../../../../js/components/Cis/Profil/Profil.js","../../../../js/api/factory/ort.js","../../../../js/components/Cis/Raumsuche/Raumsuche.js","../../../../js/components/Pagination/Pagination.js","../../../../js/components/Cis/Cms/StudiengangInformation/StudiengangPerson.js","../../../../js/components/Cis/Cms/StudiengangInformation/StudiengangVertretung.js","../../../../js/api/factory/studiengang.js","../../../../js/components/Cis/Cms/StudiengangInformation/StudiengangInformation.js","../../../../js/api/factory/cms.js","../../../../js/components/Cis/Cms/News.js","../../../../js/components/Cis/Cms/Content_types/Raum_contentmittitel.js","../../../../js/helpers/LegacyLinkReplaceHelper.js","../../../../js/components/Cis/Cms/Content_types/General.js","../../../../js/components/Cis/Cms/Content.js","../../../../js/components/Cis/Cms/Content_types/News_content.js","../../../../js/components/Cis/Cms/Content_types/Iframe_content.js","../../../../js/components/Cis/Mylv/RoomInformation.js","../../../../js/api/factory/abgabe.js","../../../../js/components/Overlay/FhcOverlay.js","../../../../js/components/Cis/Abgabetool/AbgabeStudentDetail.js","../../../../js/components/Cis/Abgabetool/AbgabetoolStudent.js","../../../../js/components/Cis/Abgabetool/AbgabeMitarbeiterDetail.js","../../../../js/components/Cis/Abgabetool/AbgabetoolMitarbeiter.js","../../../../js/components/Bootstrap/Offcanvas.js","../../../../js/api/factory/studiensemester.js","../../../../js/components/Cis/Abgabetool/StatusLegende.js","../../../../js/helpers/EmailHelpers.js","../../../../js/components/Cis/Abgabetool/AbgabetoolAssistenz.js","../../../../js/components/Cis/Abgabetool/DeadlineOverview.js","../../../../js/components/Cis/Studium/Studium.js","../../../../js/api/factory/renderers.js","../../../../js/api/factory/routeinfo.js","../../../../js/apps/Dashboard/Fhc.js","../../../../js/helpers/CssVarCalcHelpers.js","../../../../js/helpers/StringHelpers.js"],"sourcesContent":["//import Phrasen from '../../plugin/Phrasen.js';\n\nexport default {\n\tname: 'BootstrapModal',\n\tdata: () => ({\n\t\tmodal: null,\n\t\tfullscreen: false\n\t}),\n\tprops: {\n\t\tbackdrop: {\n\t\t\ttype: [Boolean,String],\n\t\t\tdefault: true,\n\t\t\tvalidator(value) {\n\t\t\t\treturn ['static', true, false].includes(value);\n\t\t\t}\n\t\t},\n\t\tfocus: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true\n\t\t},\n\t\tkeyboard: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true\n\t\t},\n\t\tnoCloseBtn: Boolean,\n\t\tdialogClass: [String,Array,Object],\n\t\theaderClass: {\n\t\t\ttype: [String,Array,Object],\n\t\t\tdefault: ''\n\t\t},\n\t\tbodyClass: {\n\t\t\ttype: [String,Array,Object],\n\t\t\tdefault: 'px-4 py-5'\n\t\t},\n\t\tfooterClass: {\n\t\t\ttype: [String,Array,Object],\n\t\t\tdefault: ''\n\t\t},\n\t\tallowFullscreenExpand: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t}\n\t},\n\temits: [\n\t\t\"hideBsModal\",\n\t\t\"hiddenBsModal\",\n\t\t\"hidePreventedBsModal\",\n\t\t\"showBsModal\",\n\t\t\"shownBsModal\",\n\t\t\"toggleFullscreen\"\n\t],\n\tmethods: {\n\t\tdispose() {\n\t\t\treturn this.modal.dispose();\n\t\t},\n\t\thandleUpdate() {\n\t\t\treturn this.modal.handleUpdate();\n\t\t},\n\t\thide() {\n\t\t\treturn this.modal.hide();\n\t\t},\n\t\tshow(relatedTarget) {\n\t\t\treturn this.modal.show(relatedTarget);\n\t\t},\n\t\ttoggle() {\n\t\t\treturn this.modal.toggle();\n\t\t},\n\t\ttoggleFullscreen() {\n\t\t\tthis.fullscreen = !this.fullscreen\n\t\t\tthis.$emit('toggleFullscreen')\n\t\t}\n\t},\n\tmounted() {\n\t\tif (this.$refs.modal)\n\t\t\tthis.modal = new bootstrap.Modal(this.$refs.modal, {\n\t\t\t\tbackdrop: this.backdrop,\n\t\t\t\tfocus: this.focus,\n\t\t\t\tkeyboard: this.keyboard\n\t\t\t});\n\t},\n\tpopup(body, options, title, footer) {\n\t\tconst BsModal = this,\n\t\t\tslots = {};\n\t\tif (body !== undefined)\n\t\t\tslots.default = () => body;\n\t\tif (title !== undefined)\n\t\t\tslots.title = () => title;\n\t\tif (footer !== undefined)\n\t\t\tslots.footer = () => footer;\n\n\t\t// little hack to check whether primevue is included in the app or not\n\t\tlet includedPrimevue = false;\n\t\tif(typeof primevue !== 'undefined'){\n\t\t\tincludedPrimevue = true;\n\t\t}\n\n\t\treturn new Promise((resolve,reject) => {\n\t\t\tconst instance = Vue.createApp({\n\t\t\t\tname: 'ModalTmpApp',\n\t\t\t\tsetup() {\n\t\t\t\t\treturn () => Vue.h(BsModal, {...{\n\t\t\t\t\t\tclass: 'fade'\n\t\t\t\t\t},...options, ...{\n\t\t\t\t\t\tref: 'modal',\n\t\t\t\t\t\t'onHidden.bs.modal': instance.unmount\n\t\t\t\t\t}}, slots);\n\t\t\t\t},\n\t\t\t\tmounted() {\n\t\t\t\t\tthis.$refs.modal.show();\n\t\t\t\t\t\n\t\t\t\t},\n\t\t\t\tbeforeUnmount() {\n\t\t\t\t\tif (this.$refs.modal)\n\t\t\t\t\t\tthis.$refs.modal.result !== false ? resolve(this.$refs.modal.result) : reject();\n\t\t\t\t},\n\t\t\t\tunmounted() {\n\t\t\t\t\twrapper.parentElement.removeChild(wrapper);\n\t\t\t\t}\n\t\t\t});\n\t\t\tconst wrapper = document.createElement(\"div\");\n\t\t\t\n\t\t\t// if(primevue) --> won't work because primevue is not defined in this scope and promise would be rejected\n\t\t\tif (includedPrimevue){\n\t\t\t\tinstance.use(primevue.config.default, {zIndex: {overlay: 9999}})\n\t\t\t}\n\t\t\t\t \n\t\t\t//instance.use(Phrasen); // TODO(chris): find a more dynamic way\n\t\t\timport('../../plugins/Phrasen.js').then((Phrasen) => {\n\t\t\t\tinstance.use(Phrasen.default);\n\t\t\t\tinstance.mount(wrapper);\n\t\t\t\tdocument.body.appendChild(wrapper);\n\t\t\t});\n\t\t});\n\t},\n\ttemplate: `
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    `\n}\n","import BsModal from './Modal.js';\n\nexport default {\n\tname: 'BootstrapAlert',\n\tcomponents: {\n\t\tBsModal\n\t},\n\tmixins: [\n\t\tBsModal\n\t],\n\tprops: {\n\t\tdialogClass: {\n\t\t\ttype: [String,Array,Object],\n\t\t\tdefault: 'modal-dialog-centered'\n\t\t},\n\t\t/*\n\t\t * NOTE(chris):\n\t\t * Hack to expose in \"emits\" declared events to $props which we use\n\t\t * in the v-bind directive to forward all events.\n\t\t * @see: https://github.com/vuejs/core/issues/3432\n\t\t*/\n\t\tonHideBsModal: Function,\n\t\tonHiddenBsModal: Function,\n\t\tonHidePreventedBsModal: Function,\n\t\tonShowBsModal: Function,\n\t\tonShownBsModal: Function\n\t},\n\tdata: () => ({\n\t\tresult: true\n\t}),\n\tmounted() {\n\t\tthis.modal = this.$refs.modalContainer.modal;\n\t},\n\tpopup(msg, options) {\n\t\treturn BsModal.popup.bind(this)(msg, options);\n\t},\n\ttemplate: `\n\t\t\n\t\t\n\t`\n}\n","import BsAlert from './Alert.js';\n\nexport default {\n\tname: 'BootstrapConfirm',\n\tmixins: [\n\t\tBsAlert\n\t],\n\tdata: () => ({\n\t\tresult: false\n\t}),\n\tpopup(msg, options) {\n\t\treturn BsAlert.popup.bind(this)(msg, options);\n\t},\n\ttemplate: `\n\t\t\n\t\t\n\t`\n}\n","export default {\n\tname:'GridItem',\n\tcomponents: {\n\t},\n\tinject: {\n\t},\n\tprops: {\n\t\titem: Object,\n\t\tactive: Boolean\n\t},\n\temits: [\n\t\t\"mouseDown\",\n\t\t\"mouseUp\",\n\t\t\"startMove\",\n\t\t\"startResize\",\n\t\t\"dragging\",\n\t\t\"endDrag\",\n\t\t\"dropDrag\",\n\t\t\"item\",\n\t\t\"touchStart\",\n\t\t\"touchEnd\",\n\t],\n\tdata() {\n\t\treturn {\n\t\t\tdragAction: '',\n\t\t\tdragging: false\n\t\t}\n\t},\n\tcomputed: {\n\t},\n\tmethods: {\n\t\tregisterDragAction(evt) {\n\t\t\tthis.$emit('mouseDown', evt);\n\t\t\tif (evt.target.hasAttribute('drag-action')) {\n\t\t\t\tthis.dragAction = evt.target.getAttribute('drag-action');\n\t\t\t} else {\n\t\t\t\tlet parent = evt.target.closest('[drag-action]');\n\t\t\t\tif (parent) {\n\t\t\t\t\tthis.dragAction = parent.getAttribute('drag-action');\n\t\t\t\t} else {\n\t\t\t\t\tthis.dragAction = '';\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\ttryDragStart(evt, item) {\n\t\t\tlet dragAction = this.dragAction || evt.target.getAttribute('drag-action');\n\t\t\tif (dragAction) {\n\t\t\t\tthis.dragging = true;\n\t\t\t\tif (dragAction == 'move')\n\t\t\t\t\treturn this.$emit('startMove', evt, item);\n\t\t\t\telse if (dragAction == 'resize')\n\t\t\t\t\treturn this.$emit('startResize', evt, item);\n\t\t\t}\n\t\t\t//evt.preventDefault();\n\t\t},\n\t\ttouchDragEnd(evt) {\n\t\t\tif (!this.dragging)\n\t\t\t\treturn;\n\t\t\tthis.dragging = false;\n\t\t\tthis.$emit('touchEnd', evt);\n\t\t},\n\t\ttouchStart(event){\n\t\t\tthis.$emit('touchStart', event); \n\t\t\tthis.registerDragAction(event); \n\t\t\tthis.tryDragStart(event, this.item);\n\t\t},\n\t\ttouchMove(event){\n\t\t\tif(this.dragging){\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.$emit('dragging', event);\n\t\t\t}\n\t\t}\n\t\t\n\t},\n\ttemplate: `\n\t
    \n\t\t\n\t
    `\n}\n","// TODO(chris): Comments\n\nconst DIR_UP = 0;\nconst DIR_LEFT = 1;\nconst DIR_RIGHT = 2;\nconst DIR_DOWN = 3;\n\nclass GridLogic {\n\tconstructor(w) {\n\t\tif (w.w) {\n\t\t\tthis.w = w.w;\n\t\t\tthis.h = w.h;\n\t\t\tthis.data = [...w.data];\n\t\t\tthis.grid = [...w.grid];\n\t\t} else {\n\t\t\tthis.w = w;\n\t\t\tthis.h = 1;\n\t\t\tthis.data = [];\n\t\t\tthis.grid = [];\n\t\t}\n\t}\n\tisFreeSlot(x, y) {\n\t\tconst i = y*this.w + x;\n\t\treturn !this.grid[i] && this.grid[i] !== 0;\n\t}\n\tgetMaxY(){\n\t\treturn this.data.reduce((acc, item) => { \n\t\t\tif (item?.y > acc) {\n\t\t\t\t acc = item.y; \n\t\t\t} \n\t\t\treturn acc; \n\t\t}, 0);\n\t}\n\tgetFreeSlots() {\n\t\tconst freeSlots = [];\n\t\tlet biggestY = this.getMaxY();\n\t\tlet totalSpaces = this.w * (biggestY+1);\n\t\tfor(let i=0; i < totalSpaces; i++){\n\t\t\tif (!this.grid[i] && this.grid[i] !== 0){\n\t\t\t\tthis.grid[i] = undefined;\n\t\t\t}\n\t\t}\n\t\tfor(let i =0; i < this.grid.length; i++){\n\t\t\tif (!this.grid[i] && this.grid[i] !== 0){\n\t\t\t\tlet x = i % this.w;\n\t\t\t\tlet y = Math.floor(i / this.w);\n\t\t\t\tfreeSlots.push({x, y});\n\t\t\t}\n\t\t}\n\t\treturn freeSlots;\n\t}\n\tadd(item, prefer) {\n\t\tlet occupiers = this.getItemsInFrame(item.frame);\n\t\tif (!occupiers.length) {\n\t\t\titem.frame.forEach(f => this.grid[f] = item.index);\n\t\t\tthis.data[item.index] = item;\n\t\t\tthis.h = Math.max(this.h, item.y + item.h);\n\t\t\treturn [];\n\t\t} else {\n\t\t\tconst intermGrid = new GridLogic(this);\n\t\t\t\n\t\t\titem.frame.forEach(f => intermGrid.grid[f] = -1);\n\n\t\t\tconst possiblities = intermGrid.tryMoving(occupiers, prefer);\n\t\t\tif (possiblities.length) {\n\t\t\t\tconst bestOption = possiblities.sort((a,b) => {\n\t\t\t\t\tif (a.cost === undefined)\n\t\t\t\t\t\ta.cost = a.moves.reduce((a, v) => a * v.cost, 1);\n\t\t\t\t\tif (b.cost === undefined)\n\t\t\t\t\t\tb.cost = b.moves.reduce((a, v) => a * v.cost, 1);\n\t\t\t\t\treturn a.cost > b.cost;\n\t\t\t\t});\n\t\t\t\tconst result = [];\n\t\t\t\tbestOption[0].moves.forEach(move => {\n\t\t\t\t\tconst currItem = {...this.data[move.index]};\n\t\t\t\t\tcurrItem.x += move.x;\n\t\t\t\t\tcurrItem.y += move.y;\n\t\t\t\t\tcurrItem.frame = this.getItemFrame(currItem);\n\t\t\t\t\tthis.h = Math.max(this.h, currItem.y + currItem.h);\n\t\t\t\t\tthis.remove(currItem);\n\t\t\t\t\tcurrItem.frame.forEach(f => this.grid[f] = currItem.index);\n\t\t\t\t\tthis.data[move.index] = currItem;\n\t\t\t\t\tresult[move.index] = {\n\t\t\t\t\t\tindex: currItem.index,\n\t\t\t\t\t\tx: currItem.x,\n\t\t\t\t\t\ty: currItem.y\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t\titem.frame.forEach(f => this.grid[f] = item.index);\n\t\t\t\tthis.data[item.index] = item;\n\n\t\t\t\treturn result;\n\t\t\t} else {\n\t\t\t\tconsole.error('FATAL', \"can't arrange item on grid\");\n\t\t\t}\n\t\t}\n\t}\n\tmove(item, x, y) {\n\t\tif (item.data.place[this.w]?.pinned)\n\t\t\treturn [];\n\t\tif (item.x == x && item.y == y)\n\t\t\treturn [];\n\t\t\n\t\tthis.remove(item);\n\n\t\tlet prefer = undefined;\n\t\tif (item.x == x) {\n\t\t\tif (y-item.y > 0)\n\t\t\t\tprefer = DIR_UP;\n\t\t\telse\n\t\t\t\tprefer = DIR_DOWN;\n\t\t} else if (item.y == y) {\n\t\t\tif (x-item.x > 0)\n\t\t\t\tprefer = DIR_LEFT;\n\t\t\telse\n\t\t\t\tprefer = DIR_RIGHT;\n\t\t}\n\n\t\tconst originalFrame = Array.isArray(item.frame) ? [...item.frame] : [item.frame];\n\n\t\tconst currItem = {...item};\n\t\tcurrItem.x = x;\n\t\tcurrItem.y = y;\n\t\tcurrItem.frame = this.getItemFrame(currItem);\n\t\tlet occupiers = this.getItemsInFrame(currItem.frame);\n\t\t\n\t\t// does not update if the target conatins pinned widgets\n\t\tif (occupiers.some(frame => this.data[frame]?.data.place[this.w]?.pinned)) {\n\t\t\treturn [];\n\t\t}\n\t\t\n\t\t// checks if target contains widget with the same high and width\n\t\tlet occupiersData = occupiers.map(occupier => this.data[occupier]);\n\t\tlet occupiersFrame = occupiersData.map(occupier => occupier.frame).flat();\n\t\tif (!occupiersFrame.some(frame => !currItem.frame.includes(frame)) && !occupiersFrame.some(frame => originalFrame.includes(frame))){\n\t\t\tlet replaceUpdate = [];\n\t\t\tlet newOccupierFrames = [];\n\t\t\tfor(let f of originalFrame){\n\t\t\t\tif(newOccupierFrames.includes(f)){\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tlet occ = occupiersData.shift();\n\t\t\t\tif(occ){\n\t\t\t\t\tnewOccupierFrames = [...newOccupierFrames, ...this.getItemFrame({ ...occ, ...this.getSingleFramePosition(f) })];\n\t\t\t\t\treplaceUpdate[occ.index] = { index: occ.index, ...this.getSingleFramePosition(f)}\n\t\t\t\t}\n\t\t\t}\n\t\t\treplaceUpdate[item.index] = { index: item.index, x, y };\n\t\t\t\n\t\t\treturn replaceUpdate;\n\t\t}\n\t\t\n\t\tconst updates = this.add(currItem, prefer);\n\t\tupdates[item.index] = {index: item.index, x, y};\n\t\treturn updates;\n\t}\n\tresize(item, w, h) {\n\t\tif (item.w == w && item.h == h)\n\t\t\treturn [];\n\t\tthis.remove(item);\n\n\t\tconst currItem = {...item};\n\t\tcurrItem.w = w;\n\t\tcurrItem.h = h;\n\t\tcurrItem.frame = this.getItemFrame(currItem);\n\t\t\n\t\tconst updates = this.add(currItem);\n\t\tif(updates)\n\t\t\tupdates[item.index] = {index: item.index, w, h, x:item.x, y:item.y, resize:true};\n\n\t\treturn updates;\n\t}\n\ttryMoving(index, prefer) {\n\t\tif (Array.isArray(index)) {\n\t\t\tindex.forEach(i => this.remove({index:i}));\n\t\t\tlet possiblities = [{grid: this, moves: []}];\n\t\t\tindex.forEach(i => {\n\t\t\t\tlet newPoss = [];\n\t\t\t\tpossiblities.forEach(possiblity => {\n\t\t\t\t\tpossiblity.grid.tryMoving(i, prefer).forEach(p => {\n\t\t\t\t\t\tpossiblity.moves\n\t\t\t\t\t\tp.moves = [...p.moves, ...possiblity.moves];\n\t\t\t\t\t\tnewPoss.push(p)\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\tpossiblities = newPoss;\n\t\t\t});\n\t\t\treturn possiblities;\n\t\t}\n\t\tconst directions = [DIR_UP, DIR_DOWN, DIR_LEFT, DIR_RIGHT];\n\n\t\tthis.remove({index});\n\n\t\tconst weight = 1 + .2*(this.data[index].weight || 0);\n\n\t\treturn directions.reduce((result, dir) => {\n\t\t\tlet res = this.tryMovingInDirection(dir, index, 1, (prefer === dir ? .5 : 1 + dir*.1) * weight);\n\t\t\tif (!res)\n\t\t\t\treturn result;\n\t\t\treturn [...result, ...res];\n\t\t}, []).filter(p => p);\n\t}\n\ttryMovingInDirection(dir, index, amount, cost) {\n\t\tconst move = {index, x:0, y: 0, cost: cost};\n\t\tlet targetframe;\n\t\tswitch(dir) {\n\t\t\tcase DIR_UP:\n\t\t\t\tif (this.data[index].data?.place[this.w]?.pinned || this.data[index].y - amount < 0)\n\t\t\t\t\treturn false;\n\t\t\t\ttargetframe = this.data[index].frame.map(i => i-this.w*amount);\n\t\t\t\tmove.y = -amount;\n\t\t\t\tbreak;\n\t\t\tcase DIR_DOWN:\n\t\t\t\tif (this.data[index].data?.place[this.w]?.pinned)\n\t\t\t\t\treturn false;\n\t\t\t\tif (this.data[index].y + this.data[index].h + amount > this.h)\n\t\t\t\t\tcost += .4;\n\t\t\t\ttargetframe = this.data[index].frame.map(i => i+this.w*amount);\n\t\t\t\tmove.y = amount;\n\t\t\t\tbreak;\n\t\t\tcase DIR_LEFT:\n\t\t\t\tif (this.data[index].data?.place[this.w]?.pinned || this.data[index].x - amount < 0)\n\t\t\t\t\treturn false;\n\t\t\t\ttargetframe = this.data[index].frame.map(i => i-amount);\n\t\t\t\tmove.x = -amount;\n\t\t\t\tbreak;\n\t\t\tcase DIR_RIGHT:\n\t\t\t\tif (this.data[index].data?.place[this.w]?.pinned || this.data[index].x + this.data[index].w + amount > this.w)\n\t\t\t\t\treturn false;\n\t\t\t\ttargetframe = this.data[index].frame.map(i => i+amount);\n\t\t\t\tmove.x = amount;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tconst occupiers = this.getItemsInFrame(targetframe);\n\t\tif (occupiers.includes(-1)) {\n\t\t\treturn this.tryMovingInDirection(dir, index, amount+1, cost);\n\t\t}\n\t\t\n\t\tconst intermGrid = new GridLogic(this);\n\t\ttargetframe.forEach(f => intermGrid.grid[f] = -1);\n\t\t\n\t\tif (!occupiers.length) {\n\t\t\treturn [{grid: intermGrid, moves: [move]}];\n\t\t}\n\t\tconst possiblities = intermGrid.tryMoving(occupiers).map(possiblity => possiblity.moves.unshift(move) && possiblity);\n\t\treturn possiblities.length ? possiblities : false;\n\t}\n\tclearWeights() {\n\t\tthis.data.forEach(item => item.weight = undefined);\n\t}\n\tgetItemsInFrame(frame) {\n\t\treturn frame.map(i => this.grid[i]).filter((v,i,a) => (v || v === 0) && a.indexOf(v) === i);\n\t}\n\tremove(item) {\n\t\tthis.grid = this.grid.map(i => i != item.index ? i : undefined);\n\t}\n\tgetItemFrame(item) {\n\t\tconst frame = [];\n\t\tfor (let i = 0; i < item.w; i++)\n\t\t\tfor (let j = 0; j < item.h; j++)\n\t\t\t\tframe.push(i + item.x + (j + item.y) * this.w);\n\t\treturn frame;\n\t}\n\tgetSingleFramePosition(frame){\n\t\treturn { x: frame % this.w, y: Math.floor(frame / this.w)};\n\t}\n\tdebug() {\n\t\treturn this.grid;\n\t}\n}\n\nexport default GridLogic;","// TODO(chris): Comments\n\nimport GridItem from './Grid/Item.js';\nimport GridLogic from '../../composables/GridLogic.js';\n\nconst MODE_IDLE = 0;\nconst MODE_MOVE = 1;\nconst MODE_RESIZE = 2;\nconst MODE_MOUSE_DOWN = 3;\n\nexport default {\n\tname: 'Grid',\n\tcomponents: {\n\t\tGridItem,\n\t},\n\tprops: {\n\t\tcols: Number,\n\t\titems: Array,\n\t\titemsSetup: Object,\n\t\tresizeLimit: Function,\n\t\tactive: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true\n\t\t},\n\t\tmarginForExtraRow: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0\n\t\t},\n\t\tadditionalRow:{\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t}\n\t},\n\temits: [\n\t\t\"rearrangeItems\",\n\t\t\"newItem\",\n\t\t\"gridHeight\",\n\t\t\"draggedItem\",\n\t\t\"update:additionalRow\"\n\t],\n\tdata() {\n\t\treturn {\n\t\t\tx: -1,\n\t\t\ty: -1,\n\t\t\tclientX:0,\n\t\t\tclientY: 0,\n\t\t\tmode: MODE_IDLE,\n\t\t\tgrid: null,\n\t\t\tdragGrid: null,\n\t\t\tpermUpdates: [],\n\t\t\tpositionUpdates: null,\n\t\t\tfixedPositionUpdates: null,\n\t\t\tdraggedOffset: [0,0],\n\t\t\tdraggedItem: null,\n\t\t\tdraggedNode: null,\n\t\t\treorderedItems:[],\n\t\t\tclonedWidget:null,\n\t\t}\n\t},\n\tinject:{\n\t\tsectionName: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t},\n\tcomputed: {\n\t\tadditionalRowComputed: {\n\t\t\tget() {\n\t\t\t\treturn this.additionalRow;\n\t\t\t},\n\t\t\tset(value) {\n\t\t\t\tthis.$emit('update:additionalRow', value);\n\t\t\t}\n\t\t},\n\t\titems_hashmap() {\n\t\t\tlet items = {};\n\t\t\tthis.items.forEach(item => {\n\t\t\t\tif (this.reorderedItems.length > 0 && this.needsReordering(item)){\n\t\t\t\t\t\tlet rearrangedPosition = this.reorderedItems.filter(widget => widget.data.widgetid == item.widgetid)?.pop();\n\t\t\t\t\t\tif (rearrangedPosition) {\t\t\t\n\t\t\t\t\t\t\titem.x = rearrangedPosition.x;\n\t\t\t\t\t\t\titem.y = rearrangedPosition.y;\n\t\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\titems[`x${item.x}y${item.y}`] = item;\n\t\t\t});\t\n\t\t\treturn items\n\t\t},\n\t\titems_placeholders(){\n\t\t\tlet placeholders = [];\n\t\t\tlet col_max = this.cols;\n\t\t\tlet rows_max = this.rows;\n\n\t\t\t// occupied hashmap to keep track of the occupied cells\n\t\t\tlet occupied = {};\n\n\t\t\tfor (let y = 0; y < rows_max; y++) {\n\t\t\t\tfor (let x = 0; x < col_max; x++) {\n\t\t\t\t\t// skip current position if it was registered as occupied\n\t\t\t\t\tif (Object.keys(occupied).length && occupied[`x${x}y${y}`]) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tlet current_item = this.items_hashmap[`x${x}y${y}`];\n\t\t\t\t\tif (current_item) {\n\t\t\t\t\t\t//calculate the occupied cells from the width and the height from the items \n\t\t\t\t\t\tlet width = current_item.w;\n\t\t\t\t\t\tlet height = current_item.h;\n\t\t\t\t\t\tlet max_x = x + width - 1;\n\t\t\t\t\t\tlet max_y = y + height - 1;\n\t\t\t\t\t\tif(x != max_x || y != max_y){\n\t\t\t\t\t\t\tfor (let occupied_y = y; occupied_y <= max_y; occupied_y++) {\n\t\t\t\t\t\t\t\tfor (let occupied_x = x; occupied_x <= max_x; occupied_x++) {\n\t\t\t\t\t\t\t\t\tif (occupied_x != x || occupied_y != y) {\n\t\t\t\t\t\t\t\t\t\toccupied[`x${occupied_x}y${occupied_y}`]=true;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tplaceholders.push({ x: x, y: y, w: 1, h: 1, placeholder: true, \n\t\t\t\t\t\t\tdata: { id: 'placeholder_' + String(placeholders.length).padStart(4, \"0\") } });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn placeholders;\n\t\t},\n\t\tplacedItems_withPlaceholders() {\n\t\t\treturn [...this.placedItems, ...this.items_placeholders];\n\t\t},\n\t\trows() {\n\t\t\tif (this.additionalRowComputed) {\n\t\t\t\t\treturn this.grid ? (this.grid.h+1) : 1;\n\t\t\t}\n\t\t\treturn this.grid ? this.grid.h : 1;\n\t\t\t\n\t\t},\n\t\tgridStyle() {\n\t\t\tconst addH = this.active ? this.marginForExtraRow : 0;\n\t\t\treturn {\n\t\t\t\t'--fhc-dg-row-height': 100/(this.rows + addH) + '%',\n\t\t\t\t'--fhc-dg-col-width': 100/this.cols + '%',\n\t\t\t\t'--fhc-dg-item-padding-horizontal': '0.25%',\n\t\t\t\t'--fhc-dg-item-padding-top': '0.5%',\n\t\t\t\t'padding-bottom': 100 * (this.rows + addH)/this.cols + '%'\n\t\t\t}\n\t\t},\n\t\tindexedItems() {\n\t\t\treturn this.items.map(\n\t\t\t\t(item, index) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tindex: index,\n\t\t\t\t\t\tx: item.x,\n\t\t\t\t\t\ty: item.y,\n\t\t\t\t\t\tw: item.w,\n\t\t\t\t\t\th: item.h,\n\t\t\t\t\t\tweight: item.weight || 0,\n\t\t\t\t\t\tdata: item\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t);\n\t\t},\n\t\tprePlacedItems() {\n\t\t\tif (!this.fixedPositionUpdates)\n\t\t\t\treturn this.indexedItems;\n\t\t\treturn this.indexedItems.map(item => {\n\t\t\t\tif (!this.fixedPositionUpdates[item.index])\n\t\t\t\t\treturn item;\n\t\t\t\treturn {\n\t\t\t\t\tindex: item.index,\n\t\t\t\t\tweight: item.weight,\n\t\t\t\t\tdata: item.data,\n\t\t\t\t\tx: this.fixedPositionUpdates[item.index].x === undefined ? item.x : this.fixedPositionUpdates[item.index].x,\n\t\t\t\t\ty: this.fixedPositionUpdates[item.index].y === undefined ? item.y : this.fixedPositionUpdates[item.index].y,\n\t\t\t\t\tw: this.fixedPositionUpdates[item.index].w === undefined ? item.w : this.fixedPositionUpdates[item.index].w,\n\t\t\t\t\th: this.fixedPositionUpdates[item.index].h === undefined ? item.h : this.fixedPositionUpdates[item.index].h\n\t\t\t\t};\n\t\t\t});\n\t\t},\n\t\tplacedItems() {\n\t\t\tif (!this.positionUpdates)\n\t\t\t\treturn this.prePlacedItems;\n\t\t\tlet mappedPlacedItems= this.prePlacedItems.map(item => {\n\t\t\t\tif (!this.positionUpdates[item.index] )\n\t\t\t\t\treturn item;\n\t\t\t\tlet height_diff = this.positionUpdates[item.index]?.h - item.h;\n\t\t\t\tlet width_diff = this.positionUpdates[item.index]?.w - item.w;\n\t\t\t\treturn {\n\t\t\t\t\tresize: this.positionUpdates[item.index]?.resize,\n\t\t\t\t\tindex: item.index,\n\t\t\t\t\tweight: item.weight,\n\t\t\t\t\tdata: item.data,\n\t\t\t\t\tx: this.positionUpdates[item.index].x === undefined ? item.x : this.positionUpdates[item.index].x,\n\t\t\t\t\ty: this.positionUpdates[item.index].y === undefined ? item.y : this.positionUpdates[item.index].y,\n\t\t\t\t\tw: width_diff>0?item.w:this.positionUpdates[item.index].w === undefined ? item.w : this.positionUpdates[item.index].w,\n\t\t\t\t\th: height_diff > 0 ?item.h:this.positionUpdates[item.index].h === undefined ? item.h : this.positionUpdates[item.index].h\n\t\t\t\t\t\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tlet temporaryResizeItems = [];\n\t\t\tmappedPlacedItems.forEach(item=>{\n\t\t\t\tif(item.resize){\n\t\t\t\t\tlet newItem = {\n\t\t\t\t\t\t...item,\n\t\t\t\t\t\tw:this.positionUpdates[item.index].w === undefined ? item.w : this.positionUpdates[item.index].w,\n\t\t\t\t\t\th:this.positionUpdates[item.index].h === undefined ? item.h : this.positionUpdates[item.index].h,\n\t\t\t\t\t\tresizeOverlay:true,\n\t\t\t\t\t\tblank:true,\n\t\t\t\t\t};\n\t\t\t\t\ttemporaryResizeItems.push(newItem)\n\t\t\t\t}\n\t\t\t})\n\t\t\treturn [...mappedPlacedItems, ...temporaryResizeItems];\n\t\t},\n\t\tshowEmptyTileHover() {\n\t\t\tif (!this.active || !this.grid || this.mode != MODE_IDLE || this.x < 0 || this.y < 0 || this.x >= this.cols || this.y >= this.rows)\n\t\t\t\treturn false;\n\t\t\treturn this.grid.isFreeSlot(this.x, this.y);\n\t\t},\n\t\twidgetSetup(){\n\t\t\tif (!this.widgetsSetup)\n\t\t\t\treturn;\n\t\t\treturn this.widgetsSetup.reduce((acc, ele) => { \n\t\t\t\tacc[ele.widget_id] =ele;\n\t\t\t\treturn acc;\n\t\t\t} ,{});\n\t\t},\n\t},\n\twatch: {\n\t\tactive(active) {\n\t\t\tif (!active)\n\t\t\t\tthis.dragCancel();\n\t\t},\n\t\tcols() {\n\t\t\tthis.dragCancel();\n\t\t},\n\t rows: {\n\t\t\thandler(value) {\n\t\t\t\tthis.$emit('gridHeight', value);\n\t\t\t},\n\t\t\timmediate: true\n\t\t},\n\t\tindexedItems: {\n\t\t\thandler(value) {\n\t\t\t\tthis.dragCancel();\n\n\t\t\t\tconst updated = this.createNewGrid(value);\n\n\t\t\t\tthis.fixedPositionUpdates = updated;\n\t\t\t\tif (updated.length)\n\t\t\t\t\tthis.$emit('rearrangeItems', updated.filter(v => v));\n\t\t\t},\n\t\t\timmediate: true,\n\t\t\tdeep: true\n\t\t}\n\t},\n\tmethods: {\n\t\tneedsReordering(item){\n\t\t\tif (!item?.data?.place[this.cols]){\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\ttoggleDraggedItemOverlay(condition){\n\t\t\tif(!this.draggedNode)\n\t\t\t\treturn;\n\t\t\tif(condition){\n\t\t\t\tthis.draggedNode.firstElementChild.classList.add(\"dashboard-item-overlay\");\n\t\t\t}else{\n\t\t\t\tthis.draggedNode.firstElementChild.classList.remove(\"dashboard-item-overlay\");\n\t\t\t}\n\t\t},\n\t\tdragging(event){\n\t\t\tif(this.mode == MODE_MOVE){\n\t\t\t\tthis.toggleDraggedItemOverlay(true);\n\t\t\t\t\n\t\t\t\tconst containerRect = this.$refs.container.getBoundingClientRect();\n\t\t\t\tconst clonedWidgetRect = this.clonedWidget.getBoundingClientRect();\n\t\t\t\t\n\t\t\t\tlet desiredTop = this.clientY - 20;\n\t\t\t\tlet desiredLeft = this.clientX - 15;\n\t\t\t\t\n\t\t\t\tconst minTop = 0;\n\t\t\t\tconst maxTop = containerRect.height - clonedWidgetRect.height;\n\t\t\t\tconst minLeft = 0;\n\t\t\t\tconst maxLeft = containerRect.width - clonedWidgetRect.width;\n\t\t\t\t\n\t\t\t\tconst constrainedTop = Math.max(minTop, Math.min(maxTop, desiredTop));\n\t\t\t\tconst constrainedLeft = Math.max(minLeft, Math.min(maxLeft, desiredLeft));\n\t\t\t\t\n\t\t\t\tthis.clonedWidget.style.top = `${constrainedTop}px`;\n\t\t\t\tthis.clonedWidget.style.left = `${constrainedLeft}px`;\n\t\t\t}\n\t\t},\n\t\tcreateNewGrid(items) {\n\t\t\tthis.grid = new GridLogic(this.cols);\n\t\t\tconst result = [];\n\t\t\tlet sortedItems = [...items].sort((a, b) => {\n\t\t\t\tif(this.needsReordering(a) && this.needsReordering(b)){\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\telse if(this.needsReordering(a)){\n\t\t\t\t\treturn 999;\n\t\t\t\t}\n\t\t\t\telse if(this.needsReordering(b)){\n\t\t\t\t\treturn -999;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn a.weight > b.weight;\n\t\t\t}); \n\t\t\tlet reorderedItems = [];\n\t\t\tsortedItems.forEach(item => {\n\t\t\t\tlet freeSlots = this.grid.getFreeSlots();\n\t\t\t\t\n\t\t\t\tif(this.needsReordering(item)){\n\t\t\t\t\tlet firstFreeSlot = freeSlots.shift();\n\t\t\t\t\tif (!firstFreeSlot) {\n\t\t\t\t\t\titem.x = 0;\n\t\t\t\t\t\titem.y = this.grid.h;\n\t\t\t\t\t}else{\n\t\t\t\t\t\titem.x = firstFreeSlot.x;\n\t\t\t\t\t\titem.y = firstFreeSlot.y;\n\t\t\t\t\t}\n\t\t\t\t\treorderedItems.push(item);\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tif (item.x + item.w > this.cols) {\n\t\t\t\t\tlet targetW = this.cols-item.x,\n\t\t\t\t\t\ttargetX = undefined;\n\t\t\t\t\tif (this.resizeLimit) {\n\t\t\t\t\t\t[targetW] = this.resizeLimit(item.data, targetW, item.h);\n\t\t\t\t\t}\n\t\t\t\t\tif (targetW < 1)\n\t\t\t\t\t\ttargetW = 1;\n\t\t\t\t\tif (targetW > this.cols)\n\t\t\t\t\t\ttargetW = this.cols;\n\t\t\t\t\tif (item.x + targetW > this.cols) {\n\t\t\t\t\t\ttargetX = this.cols - targetW;\n\t\t\t\t\t}\n\t\t\t\t\tif (targetW == item.w)\n\t\t\t\t\t\ttargetW = undefined;\n\t\t\t\t\tresult[item.index] = {\n\t\t\t\t\t\titem: item.data,\n\t\t\t\t\t\tx: targetX,\n\t\t\t\t\t\tw: targetW\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\titem.frame = this.grid.getItemFrame(item);\n\t\t\t\tthis.convertGridResultToUpdate(this.grid.add(item), result, items);\n\t\t\t});\n\t\t\tthis.reorderedItems = reorderedItems;\n\t\t\tthis.grid.clearWeights();\n\t\t\treturn result;\n\t\t},\n\t\tconvertGridResultToUpdate(input, output, baseArray) {\n\t\t\t\n\t\t\tif (!input)\n\t\t\t\treturn;\n\t\t\tif (!baseArray)\n\t\t\t\tbaseArray = this.indexedItems;\n\t\t\tinput.forEach(item => {\n\t\t\t\tlet result = {\n\t\t\t\t\titem: baseArray[item.index].data\n\t\t\t\t};\n\t\t\t\tif (item.x !== undefined)\n\t\t\t\t\tresult.x = item.x;\n\t\t\t\tif (item.y !== undefined)\n\t\t\t\t\tresult.y = item.y;\n\t\t\t\tif (item.w !== undefined)\n\t\t\t\t\tresult.w = item.w;\n\t\t\t\tif (item.h !== undefined)\n\t\t\t\t\tresult.h = item.h;\n\t\t\t\toutput[item.index] = result;\n\t\t\t});\n\t\t},\n\t\tmouseLeave() {\n\t\t\t/* if (this.mode == MODE_IDLE) {\n\t\t\t\tthis.x = -1;\n\t\t\t\tthis.y = -1;\n\t\t\t\t\n\t\t\t} */\n\t\t},\n\t\tupdateCursor(evt) {\n\t\t\tif (!this.active) {\n\t\t\t\tthis.x = this.y = -1;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst addH = this.active ? this.marginForExtraRow : 0;\n\t\t\tconst rect = this.$refs.container.getBoundingClientRect();\n\t\t\t\n\t\t\tif (!evt.clientX && !evt.clientY && evt.touches){\n\t\t\t\tevt.clientX = evt.touches[0].clientX;\n\t\t\t\tevt.clientY = evt.touches[0].clientY;\n\t\t\t}\n\n\t\t\tthis.clientX = (evt.clientX - rect.left);\n\t\t\tthis.clientY = (evt.clientY - rect.top);\n\t\t\tconst gridX = Math.floor(this.cols * (evt.clientX - rect.left) / this.$refs.container.clientWidth);\n\t\t\tconst gridY = Math.floor((this.rows + addH) * (evt.clientY - rect.top) / this.$refs.container.clientHeight);\n\t\t\t\n\t\t\tif (this.x == gridX && this.y == gridY)\n\t\t\t\treturn false;\n\t\t\t\n\t\t\tthis.x = gridX;\n\t\t\tthis.y = gridY;\n\n\t\t\treturn true;\n\t\t},\n\t\t_dragStart(evt, item) {\n\t\t\tif (evt.dataTransfer) {\n\t\t\t\tevt.dataTransfer.setDragImage(evt.target, -99999, -99999);\n\t\t\t\tevt.dataTransfer.dropEffect = 'move';\n\t\t\t\tevt.dataTransfer.effectAllowed = 'move';\n\t\t\t}\n\t\t},\n\t\tstartMove(evt, item) {\n\t\t\t\n\t\t\tif (!this.active)\n\t\t\t\treturn;\n\t\t\t\n\t\t\tthis.mode = MODE_MOVE;\n\t\t\t\n\t\t\tthis.draggedItem = item;\n\t\t\t\n\t\t\tthis.$emit('draggedItem', item);\n\t\t\t// workaround for chrome fireing event dragend when styles are manipulated during dragging\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.draggedNode = evt.target.closest(\".drop-grid-item\");\n\t\t\t\t//clones the widget for the drag Image\n\t\t\t\t\n\t\t\t\tlet clone = evt.target.closest(\".drop-grid-item\")?.cloneNode(true);\n\n\t\t\t\tclone.style.zIndex = 5;\n\t\t\t\tclone.classList.add(\"widgetClone\");\n\t\t\t\tthis.$refs.container.appendChild(clone);\n\t\t\t\tconst hiddenWidget = clone.querySelector(\"[style='display: none;']\");\n\t\t\t\thiddenWidget.style.removeProperty(\"display\");\n\t\t\t\tthis.clonedWidget = clone;\n\t\t\t}, 0);\n\n\t\t\tthis.draggedOffset = [item.x - this.x, item.y - this.y];\n\t\t\tthis._dragStart(evt, item);\n\t\t},\n\t\tstartResize(evt, item) {\n\t\t\tif (!this.active)\n\t\t\t\treturn;\n\t\t\tthis.mode = MODE_RESIZE;\n\t\t\tthis.draggedItem = item;\n\t\t\tthis.$emit('draggedItem', item);\n\t\t\tthis._dragStart(evt);\n\t\t},\n\t\tdragOver(evt) {\n\t\t\tif ((this.y + 1) > this.rows && (this.mode == MODE_MOVE || this.mode == MODE_RESIZE)) {\n\t\t\t\tthis.dragCancel();\n\t\t\t\t\n\t\t\t}\n\t\t\tif (!this.active)\n\t\t\t\treturn this.dragCancel();\n\t\t\tthis.checkPinnedWidgetAnimation();\n\t\t\tif(this.mode == MODE_RESIZE){\n\t\t\t\tthis.checkWidgetSizeLimitAnimation();\n\t\t\t}\n\t\t\tif (this.updateCursor(evt)) {\n\t\t\t\tswitch(this.mode) {\n\t\t\t\t\tcase MODE_MOVE: {\n\t\t\t\t\t\tevt.preventDefault();\n\t\t\t\t\t\tthis.dragGrid = new GridLogic(this.grid);\n\t\t\t\t\t\tlet x = this.x + this.draggedOffset[0];\n\t\t\t\t\t\tlet y = this.y + this.draggedOffset[1];\n\t\t\t\t\t\tif (x < 0) {\n\t\t\t\t\t\t\tthis.draggedOffset[0] += x;\n\t\t\t\t\t\t\tx = 0;\n\t\t\t\t\t\t} else if (x + this.draggedItem.w > this.cols) {\n\t\t\t\t\t\t\tthis.draggedOffset[0] += this.cols - this.draggedItem.w - x;\n\t\t\t\t\t\t\tx = this.cols - this.draggedItem.w;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (y < 0) {\n\t\t\t\t\t\t\tthis.draggedOffset[1] += y;\n\t\t\t\t\t\t\ty = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.positionUpdates= this.dragGrid.move(this.draggedItem, x, y);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase MODE_RESIZE: {\n\t\t\t\t\t\tevt.preventDefault();\n\t\t\t\t\t\tthis.dragGrid = new GridLogic(this.grid);\n\t\t\t\t\t\tlet w = Math.min(this.cols - this.draggedItem.x, Math.max(1, this.x - this.draggedItem.x + 1));\n\t\t\t\t\t\tlet h = Math.max(1, this.y - this.draggedItem.y + 1);\n\t\t\t\t\t\tif (this.resizeLimit)\n\t\t\t\t\t\t\t[w, h] = this.resizeLimit(this.draggedItem.data, w, h);\n\t\t\t\t\t\tthis.positionUpdates = this.dragGrid.resize(this.draggedItem, w, h);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tdragCancel() {\n\t\t\tthis.removeWidgetClones();\n\t\t\tthis.additionalRowComputed = false;\n\t\t\tthis.toggleDraggedItemOverlay(false);\n\t\t\tthis.mode = MODE_IDLE;\n\t\t\tthis.positionUpdates = null;\n\t\t\tthis.draggedOffset = [0,0],\n\t\t\tthis.draggedItem = null;\n\t\t\tthis.$emit('draggedItem',null);\n\t\t\tthis.draggedNode = null;\n\t\t\t\n\t\t},\n\t\tdragEnd() {\n\t\t\tthis.removeWidgetClones();\n\t\t\tthis.toggleDraggedItemOverlay(false);\n\t\t\t\n\t\t\tif (this.mode == MODE_IDLE){\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// clean up unused classes\n\t\t\tlet draggedItemNode = document.getElementById(this.draggedItem.data.widgetid);\n\t\t\tdraggedItemNode.classList.remove(\"border-danger\");\n\t\t\tArray.from(document.getElementsByClassName(\"denied-dragging-animation\"))?.forEach(ele => {\n\t\t\t\tele.classList.remove(\"denied-dragging-animation\");\n\t\t\t})\n\t\t\t\n\t\t\t//if (!this.active || this.x < 0 || this.y < 0 || this.x >= this.cols)\n\t\t\t\t//return this.dragCancel();\n\n\t\t\tthis.mode = MODE_IDLE;\n\t\t\tlet updated = [];\n\t\t\tthis.convertGridResultToUpdate(this.positionUpdates, updated);\n\t\t\tupdated = this._updateFixedPositions(updated);\n\t\t\tif (updated.length)\n\t\t\t\tthis.$emit('rearrangeItems', updated.filter(v => v));\n\n\t\t\tthis.draggedItem = null;\n\t\t\tthis.draggedNode = null;\n\t\t\tthis.$emit('draggedItem', null);\n\t\t},\n\t\t_updateFixedPositions(updated) {\n\t\t\tupdated.forEach((item, index) => {\n\t\t\t\tif (!this.fixedPositionUpdates[index])\n\t\t\t\t\tthis.fixedPositionUpdates[index] = item;\n\t\t\t\telse\n\t\t\t\t\tthis.fixedPositionUpdates[index] = {...this.fixedPositionUpdates[index], ...item};\n\t\t\t});\n\t\t\tlet additionalUpdates = this.createNewGrid(this.prePlacedItems);\n\t\t\tif (additionalUpdates.length) {\n\t\t\t\t// NOTE(chris): this should never happen but it's here for safety\n\t\t\t\tadditionalUpdates.forEach((item, index) => updated[index] = item);\n\t\t\t\treturn this._updateFixedPositions(updated);\n\t\t\t}\n\t\t\treturn updated;\n\t\t},\n\t\temptyTileClicked() {\n\t\t\tthis.additionalRowComputed = false;\n\t\t\tthis.$emit('newItem', this.x, this.y);\n\t\t},\n\t\tupdateCursorOnMouseMove(evt){\n\t\t\tif(this.mode == MODE_IDLE){\n\t\t\t\tthis.updateCursor(evt);\n\t\t\t}\n\t\t},\n\t\tcheckPinnedWidgetAnimation(){\n\t\t\tlet itemAtPosition=[];\n\t\t\tswitch(this.mode){\n\t\t\t\tcase MODE_RESIZE:\n\t\t\t\t\tfor (let x = this.draggedItem.x; x <= this.x; x++) {\n\t\t\t\t\t\tfor (let y = this.draggedItem.y; y <= this.y; y++) {\n\t\t\t\t\t\t\tthis.items.forEach(item => {\n\t\t\t\t\t\t\t\tif (item.x == x && item.y == y) {\n\t\t\t\t\t\t\t\t\titemAtPosition.push(item);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase MODE_MOVE:\n\t\t\t\t\titemAtPosition = this.items.filter(item=>item.x == this.x && item.y == this.y);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tArray.from(document.getElementsByClassName(\"denied-dragging-animation\"))?.forEach(ele => {\n\t\t\t\tele.classList.remove(\"denied-dragging-animation\");\n\t\t\t})\n\n\t\t\titemAtPosition.forEach(item=>{\n\t\t\t\tif (item.place[this.cols] && item.place[this.cols].pinned) {\n\t\t\t\t\tlet pinnedWidget = document.getElementById(item.widgetid);\n\t\t\t\t\tlet pinNode = pinnedWidget.querySelector(\"[pinned='true']\");\n\t\t\t\t\tif (!pinNode.classList.contains(\"denied-dragging-animation\")) {\n\t\t\t\t\t\tpinNode.classList.add(\"denied-dragging-animation\");\n\t\t\t\t\t}\n\t\t\t\t}\t\n\t\t\t})\n\t\t},\n\t\tcheckWidgetSizeLimitAnimation() {\n\n\t\t\tlet draggedItemSetup = this.itemsSetup[this.draggedItem.data.widget];\n\t\t\tlet draggedItemMaxWidth = draggedItemSetup.width.max ?? draggedItemSetup.width;\n\t\t\tlet draggedItemMinWidth = draggedItemSetup.width.min ?? draggedItemSetup.width;\n\t\t\tlet draggedItemMaxHeight = draggedItemSetup.height.max ?? draggedItemSetup.height;\n\t\t\tlet draggedItemMinHeight = draggedItemSetup.height.min ?? draggedItemSetup.height;\n\t\t\tlet draggedItemNode = document.getElementById(this.draggedItem.data.widgetid);\n\n\t\t\tlet width_after_resize = this.x - this.draggedItem.x + 1; \n\t\t\tlet height_after_resize = this.y - this.draggedItem.y + 1; \n\t\t\tif( \n\t\t\t\t(width_after_resize > 0 && (width_after_resize > draggedItemMaxWidth\n\t\t\t\t|| width_after_resize < draggedItemMinWidth)\n\t\t\t\t)\n\t\t\t\t||\n\t\t\t\t(height_after_resize > 0 && (height_after_resize > draggedItemMaxHeight\n\t\t\t\t|| height_after_resize < draggedItemMinHeight)\n\t\t\t\t)\n\t\t\t){\n\t\t\t\tdraggedItemNode.classList.add(\"border-danger\");\n\t\t\t}else{\n\t\t\t\tdraggedItemNode.classList.remove(\"border-danger\");\n\t\t\t}\n\t\t},\n\t\tremoveWidgetClones(){\n\t\t\tlet widgetClones = Array.from(document.getElementsByClassName(\"widgetClone\"));\n\t\t\tfor (let i = 0; i < widgetClones.length; i++) {\n\t\t\t\tthis.$refs.container.removeChild(widgetClones[i]);\n\t\t\t}\n\t\t},\n\t\tmouseDown(){\n\t\t\tthis.mode = MODE_MOUSE_DOWN;\n\t\t},\n\t\tmouseUp() {\n\t\t\tthis.mode = MODE_IDLE;\n\t\t},\n\t},\n\ttemplate: `\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t`\n}\n\n/*\nOLD VERSION - ON HOVER\n\n\t\n\n*/","let __widgets = {};\nlet __widgetsStarted = {};\nlet __path = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/dashboard/Widget';\n\nexport default {\n\tgetWidget(id) {\n\t\treturn __widgets[id];\n\t},\n\tloadWidget(id) {\n\t\tif (__widgets[id])\n\t\t\treturn Promise.resolve(__widgets[id]);\n\t\tif (__widgetsStarted[id])\n\t\t\treturn __widgetsStarted[id];\n\t\tif (!__path)\n\t\t\treturn Promise.reject('Widget could not be loaded because there is no path yet!');\n\n\t\t__widgetsStarted[id] = new Promise((resolve, reject) => {\n\t\t\taxios.get(__path, {params:{id}}).then(res => {\n\t\t\t\t__widgets[id] = res.data.retval;\n\t\t\t\t__widgetsStarted[id] = undefined;\n\t\t\t\tresolve(__widgets[id]);\n\t\t\t}).catch(error => reject(error.response.data.retval.error));\n\t\t});\n\t\treturn __widgetsStarted[id];\n\t},\n\tsetPath(path) {\n\t\t__path = path;\n\t}\n}","import BsModal from \"../Bootstrap/Modal.js\";\nimport CachedWidgetLoader from \"../../composables/Dashboard/CachedWidgetLoader.js\";\nimport HeightTransition from \"../Tranistion/HeightTransition.js\";\n\nimport {absoluteJsImportUrl} from \"../../helpers/UrlHelpers.js\";\n\nexport default {\n\tname: 'Item',\n\tcomponents: {\n\t\tBsModal,\n\t\tHeightTransition\n\t},\n\tdata: () => ({\n\t\tcomponent: \"\",\n\t\targuments: null,\n\t\ttarget: false,\n\t\twidget: null,\n\t\ttmpConfig: {},\n\t\tisLoading: false,\n\t\thasConfig: false,\n\t\tsharedData: null,\n\t}),\n\temits: [\n\t\t\"change\",\n\t\t\"remove\",\n\t\t\"dragstart\",\n\t\t\"resizestart\",\n\t\t\"configOpened\",\n\t\t\"configClosed\",\n\t\t\"pinItem\",\n\t\t\"unPinItem\"\n\t],\n\tprops: [\n\t\t\"id\",\n\t\t\"widgetID\",\n\t\t\"config\",\n\t\t\"width\",\n\t\t\"height\",\n\t\t\"custom\",\n\t\t\"hidden\",\n\t\t\"editMode\",\n\t\t\"loading\",\n\t\t\"item_data\",\n\t\t\"place\",\n\t\t\"setup\",\n\t\t\"dragstate\",\n\t\t\"resizeOverlay\",\n\t\t\"additionalRow\"\n\t],\n\tcomputed: {\n\t\tmaxHeight(){\n\t\t\treturn this.setup?.height?.max;\n\t\t},\n\t\tmaxWidth(){\n\t\t\tif (Object.prototype.toString.call(this.setup?.width) == \"[object Number]\"){\n\t\t\t\treturn this.setup?.width;\n\t\t\t}\n\t\t\treturn this.setup?.width?.max;\n\t\t},\n\t\tminHeight() {\n\t\t\treturn this.setup?.height?.min;\n\t\t},\n\t\tminWidth() {\n\t\t\treturn this.setup?.width?.min;\n\t\t},\n\t\tisResizeable(){\n\t\t\treturn this.maxWidth >1 || this.maxHeight >1;\n\t\t},\n\t\tisPinned(){\n\t\t\treturn this.place?.pinned ? true : false;\n\t\t},\n\t\tready() {\n\t\t\treturn this.component && this.arguments !== null;\n\t\t},\n\t},\n\tmethods: {\n\t\tunpin(){\n\t\t\t// Unpinning is only possible in edit mode\n\t\t\tif(!this.editMode)\n\t\t\t\treturn;\n\t\t\tlet result = { item: this.item_data, x: this.item_data.x, y: this.item_data.y };\n\t\t\tthis.$emit('unPinItem', [result]);\n\t\t},\n\t\tpinItem(){\n\t\t\tlet result = { item: this.item_data, x: this.item_data.x, y: this.item_data.y};\n\t\t\tthis.$emit('pinItem',[result]);\n\t\t},\n\t\tgetWidgetC4Link(widget) {\n\t\t\treturn (FHC_JS_DATA_STORAGE_OBJECT.app_root +\n\t\t\t\tFHC_JS_DATA_STORAGE_OBJECT.ci_router + widget.setup.cis4link)\n\t\t},\n\t\thandleShowBsModal() {\n\t\t\tthis.$emit('configOpened')\n\t\t},\n\t\thandleHideBsModal() {\n\t\t\tthis.$emit('configClosed')\n\t\t},\n\t\tmouseDown(e) {\n\t\t\tthis.target = e.target;\n\t\t},\n\t\tstartDrag(e) {\n\t\t\tif (this.$refs.dragHandle.contains(this.target)) {\n\t\t\t\tthis.$emit(\"dragstart\", e);\n\t\t\t} else if (\n\t\t\t\tthis.isResizeable &&\n\t\t\t\tthis.$refs.resizeHandle.contains(this.target)\n\t\t\t) {\n\t\t\t\tif (this.isResizeable) this.$emit(\"resizestart\", e);\n\t\t\t\telse e.preventDefault();\n\t\t\t} else {\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t},\n\t\topenConfig() {\n\t\t\tthis.tmpConfig = { ...this.arguments };\n\t\t\tthis.$refs.config.show();\n\t\t},\n\t\tsetConfig(hasConfig) {\n\t\t\tthis.hasConfig = hasConfig;\n\t\t},\n\t\tchangeConfig() {\n\t\t\tthis.isLoading = true;\n\t\t\tlet config = { ...this.tmpConfig };\n\t\t\tthis.sendChangeConfig(config);\n\t\t},\n\t\tchangeConfigManually() {\n\t\t\tlet config = { ...this.arguments };\n\t\t\tthis.sendChangeConfig(config);\n\t\t},\n\t\tsendChangeConfig(config) {\n\t\t\tfor (var k in config) {\n\t\t\t\tif (this.widget.arguments[k] == config[k]) {\n\t\t\t\tdelete config[k];\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.$emit(\"change\", config);\n\t\t},\n\t},\n\twatch: {\n\t\tconfig() {\n\t\t\tthis.arguments = { ...this.widget?.arguments, ...this.config };\n\t\t\tthis.tmpConfig = { ...this.arguments };\n\t\t\tthis.$refs.config && this.$refs.config.hide();\n\t\t\tthis.isLoading = false;\n\t\t},\n\t},\n\tasync created() {\n\t\tthis.widget = await CachedWidgetLoader.loadWidget(this.id);\n\t\tlet component = (await import(this.widget.setup.file)).default;\n\t\tthis.$options.components[\"widget\" + this.widget.widget_id] = component;\n\t\tthis.component = \"widget\" + this.widget.widget_id;\n\t\tthis.arguments = { ...this.widget.arguments, ...this.config };\n\t\tthis.tmpConfig = { ...this.arguments };\n\t},\n\ttemplate: /*html*/ `\n\t
    \n\t\t
    \n\t\t\t\n\t\t
    \n\t
    \n\t
    \n\t
    \n\t\t
    \n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t{{ widget.setup.name }}\n\t\t\t\n\t\t\t\n\t\t\t\n \t\t\n \t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t\t
    \n\t\t\t\n\t\t
    \n\t\t
    \n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\n\t\t
    \n\t
    `,\n};\n","export default {\n\tdata(){\n\t\treturn {\n\n\t\t}\n\t},\n\tmethods:{\n\t\tonEnter(el,done){\n\t\t\tel.style.height = '0';\n\t\t\tel.style.height = el.scrollHeight + 'px';\n\t\t},\n\t\tonLeave(el,done){\n\t\t\tel.style.height = el.scrollHeight + 'px';\n\t\t\tel.style.height = '0';\n\t\t}\n\t},\n\ttemplate:\n\t/*html*/`\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t`,\n};","export default {\n\tdata(){\n\t\treturn {\n\n\t\t}\n\t},\n\tprops:{\n\t\twidget:{\n\t\t\ttype:Object,\n\t\t\trequired:true,\n\t\t}\n\t},\n\tmethods:{\n\t\tpath(src) {\n\t\t\tif (src[0] == '/')\n\t\t\t\treturn FHC_JS_DATA_STORAGE_OBJECT.app_root + src;\n\t\t\treturn src;\n\t\t}\n\t},\n\temits:[\"select\"],\n\ttemplate: /*html */`\n\t
    \n\t\t\n\t\t
    \n\t\t\t
    {{ widget.setup.name || widget.widget_kurzbz }}
    \n\t\t\t

    {{ widget.beschreibung }}

    \n\t\t
    \n\t
    `,\n}","import BsConfirm from \"../Bootstrap/Confirm.js\";\nimport DropGrid from '../Drop/Grid.js'\nimport DashboardItem from \"./Item.js\";\nimport CachedWidgetLoader from \"../../composables/Dashboard/CachedWidgetLoader.js\";\nimport WidgetIcon from \"./Widget/WidgetIcon.js\"\n\nexport default {\n\tname: 'Section',\n\tcomponents: {\n\t\tDropGrid,\n\t\tDashboardItem,\n\t\tWidgetIcon,\n\t},\n\tinject: {\n\t\twidgetsSetup:{\n\t\t\ttype: Array,\n\t\t\tdefault: [],\n\t\t},\n\t\tadminMode: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t},\n\t\teditMode: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t}\n\t},\n\tprops: [\n\t\t\"name\",\n\t\t\"widgets\"\n\t],\n\temits: [\n\t\t\"widgetAdd\",\n\t\t\"widgetUpdate\",\n\t\t\"widgetRemove\"\n\t],\n\tdata() {\n\t\treturn {\n\t\t\tconfigOpened: false,\n\t\t\tgridWidth: 1,\n\t\t\tgridHeight: null,\n\t\t\tdraggedItem:null,\n\t\t\tadditionalRow:false,\n\t\t}\n\t},\n\tprovide() {\n\t\treturn {\n\t\t\teditModeIsActive: Vue.computed(() =>\n\t\t\t\tthis.editModeIsActive\n\t\t\t),\t\n\t\t\tsectionName: Vue.computed(() => this.name),\t\n\t\t}\n\t},\n\tcomputed: {\n\t\tcomputedWidgetsSetup(){\n\t\t\tif(!this.widgetsSetup) return {};\n\t\t\treturn this.widgetsSetup.reduce((acc, setup)=>{\n\t\t\t\tacc[setup.widget_id] = setup.setup;\n\t\t\t\treturn acc;\n\t\t\t},{})\n\t\t},\n\t\teditModeIsActive() {\n\t\t\treturn (this.editMode || this.adminMode) && !this.configOpened\t\n\t\t},\n\t\tgetSectionStyle() {\n\t\t\treturn 'margin-bottom: 8px;';\n\t\t},\n\t\titems() {\n\t\t\t// reuses the nearest placement of the widget from another viewport \n\t\t\t/* const computeNearestPlace = (item, gridWidth) =>{\n\t\t\t\tlet place;\n\t\t\t\tif (Object.keys(item.place).length > 0) {\n\t\t\t\t\tconst nearestIndex = Object.keys(item.place)\n\t\t\t\t\t\t\t\t\t\t\t .sort((a, b) => Math.abs(a - gridWidth) - Math.abs(b - gridWidth))\n\t\t\t\t\t\t\t\t\t\t\t .shift();\n\t\t\t\t\tplace = item.place[nearestIndex];\n\t\t\t\t}\n\t\t\t\telse{\n\t\t\t\t\tplace = { x: 0, y: 0, w: 1, h: 1 };\n\t\t\t\t}\n\t\t\t\treturn place;\n\t\t\t} */\n\t\t\t\n\t\t\tlet placedItems = this.widgets.map(item => {\n\t\t\t\tif(!item?.widgetid && item?.id){\n\t\t\t\t\titem.widgetid = item.id;\n\t\t\t\t}\n\t\t\t\treturn { ...item, reorder: false, ...(item.place[this.gridWidth] || { reorder: true, ...{ x: 0, y: 0, w: 1, h: 1 } })};\n\t\t\t});\n\t\t\treturn placedItems;\n\t\t\t\n\t\t},\n\t\t\n\t},\n\tmethods: {\n\t\tsectionNameTranslation(){\n\t\t\tswitch(this.name){\n\t\t\t\tcase \"general\": \n\t\t\t\t\treturn this.$p.t('dashboard',this.name); \n\t\t\t\t\tbreak;\n\t\t\t\tcase \"custom\":\n\t\t\t\t\treturn this.$p.t('dashboard',this.name);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\treturn this.name;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t\tshowSectionInformation(){\n\t\t\tif (this.name == \"general\"){\n\t\t\t\treturn this.$p.t('dashboard', 'dashboardGeneralSectionDescription'); \n\t\t\t}\n\t\t\telse if(this.name == \"custom\"){\n\t\t\t\treturn this.$p.t('dashboard', 'dashboardCustomSectionDescription');\n\t\t\t}\n\t\t\telse{\n\t\t\t\treturn this.$p.t('dashboard', 'dashboardSectionDescription', [this.name]);\n\t\t\t}\n\t\t},\n\t\thandleConfigOpened() {\n\t\t\tthis.configOpened = true\n\t\t},\n\t\thandleConfigClosed() {\n\t\t\tthis.configOpened = false\n\t\t},\n\t\tcheckResizeLimit(item, w, h) {\n\t\t\t// NOTE(chris): widgets needs to be loaded for this to work\n\t\t\tlet widget = CachedWidgetLoader.getWidget(item.widget);\n\t\t\tif (widget) {\n\t\t\t\tlet minmaxW = widget.setup.width;\n\t\t\t\tif (minmaxW.max)\n\t\t\t\t\tminmaxW.min = minmaxW.min || 1;\n\t\t\t\telse\n\t\t\t\t\tminmaxW = {min:minmaxW,max:minmaxW};\n\t\t\t\tif (w < minmaxW.min)\n\t\t\t\t\tw = minmaxW.min; \n\t\t\t\tif (w > minmaxW.max)\n\t\t\t\t\tw = minmaxW.max;\n\n\t\t\t\tlet minmaxH = widget.setup.height;\n\t\t\t\tif (minmaxH.max)\n\t\t\t\t\tminmaxH.min = minmaxH.min || 1;\n\t\t\t\telse\n\t\t\t\t\tminmaxH = {min:minmaxH,max:minmaxH};\n\t\t\t\tif (h < minmaxH.min)\n\t\t\t\t\th = minmaxH.min;\n\t\t\t\tif (h > minmaxH.max)\n\t\t\t\t\th = minmaxH.max;\n\t\t\t}\n\t\t\treturn [w, h];\n\t\t},\n\t\tremoveWidget(item, revert) {\n\t\t\tif (item.custom) {\n\t\t\t\tBsConfirm.popup('Are you sure you want to delete this widget?').then(() => this.$emit('widgetRemove', this.name, item.id));\n\t\t\t} else {\n\t\t\t\tlet update = {};\n\t\t\t\tupdate[item.id] = { hidden: !revert };\n\t\t\t\tthis.updatePreset(update);\n\t\t\t}\n\t\t},\n\t\tsaveConfig(config, item) {\n\t\t\tlet payload = {};\n\t\t\tpayload[item.id] = { config };\n\t\t\tthis.updatePreset(payload);\n\t\t},\n\t\tupdatePositions(updated, pinned=false) {\n\t\t\tlet result = {};\n\t\t\tupdated.forEach(update => {\n\t\t\t\t\n\t\t\t\tlet item = {...update.item};\n\t\t\t\tif (!item.placeholder) {\n\t\t\t\tif (!item.place[this.gridWidth])\n\t\t\t\t\titem.place[this.gridWidth] = {x: 0, y: 0, w: 1, h: 1};\n\t\t\t\tdelete item.x;\n\t\t\t\tdelete item.y;\n\t\t\t\tdelete item.w;\n\t\t\t\tdelete item.h;\n\t\t\t\tdelete item.place[this.gridWidth].pinned;\n\t\t\t\tif (update.x !== undefined)\n\t\t\t\t\titem.place[this.gridWidth].x = update.x;\n\t\t\t\tif (update.y !== undefined)\n\t\t\t\t\titem.place[this.gridWidth].y = update.y;\n\t\t\t\tif (update.w !== undefined)\n\t\t\t\t\titem.place[this.gridWidth].w = update.w;\n\t\t\t\tif (update.h !== undefined)\n\t\t\t\t\titem.place[this.gridWidth].h = update.h;\n\t\t\t\tif (pinned){\n\t\t\t\t\titem.place[this.gridWidth].pinned = true;\n\t\t\t\t}\n\n\t\t\t\tresult[item.id] = item;\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.updatePreset(result);\n\t\t},\n\t\tupdatePreset(update) {\n\t\t\tlet payload = {};\n\t\t\tpayload[this.name] = update;\n\t\t\tthis.$emit('widgetUpdate', this.name, payload);\n\t\t}\n\t},\n\tmounted() {\n\t\tlet self = this;\n\t\tlet cont = self.$refs.container;\n\t\tself.gridWidth = parseInt(window.getComputedStyle(cont).getPropertyValue('--fhc-dashboard-grid-size'));\n\t\t\n\t\twindow.addEventListener('resize', () => {\n\t\t\tself.gridWidth = parseInt(window.getComputedStyle(cont).getPropertyValue('--fhc-dashboard-grid-size'));\n\t\t});\n\t},\n\ttemplate: `\n\t
    \n\t\t

    \n\t\t\t\n\t\t\t{{sectionNameTranslation()}}:\n\t\t

    \n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t
    `\n}\n\n/*\nOLD VERSION - ON HOVER\n\n*/","import BsModal from \"../../Bootstrap/Modal.js\";\nimport WidgetIcon from \"./WidgetIcon.js\";\n\nexport default {\n\tcomponents: {\n\t\tBsModal,\n\t\tWidgetIcon,\n\t},\n\tprops: [\n\t\t\"widgets\"\n\t],\n\tdata: () => ({\n\t\tcallbacks: {}\n\t}),\n\tmethods: {\n\t\tgetWidget() {\n\t\t\treturn new Promise((resolve,reject) => {\n\t\t\t\tthis.callbacks = {resolve,reject};\n\t\t\t\tthis.$refs.modal.show();\n\t\t\t});\n\t\t},\n\t\tclose() {\n\t\t\tif (this.callbacks.reject)\n\t\t\t\tthis.callbacks.reject();\n\t\t\tthis.callbacks = {};\n\t\t},\n\t\tpick(widget_id) {\n\t\t\tif (this.callbacks.resolve)\n\t\t\t\tthis.callbacks.resolve(widget_id);\n\t\t\tthis.callbacks = {};\n\t\t\tthis.$refs.modal.hide();\n\t\t},\n\t\t\n\t},\n\ttemplate: `
    \n\t\t 0}\" @hiddenBsModal=\"close\">\n\t\t\t\n\t\t\t\n\t\t\n\t
    `\n}\n","export default {\n\t/**\n\t* Performs a deep merge of objects and returns new object. Does not modify\n\t* objects (immutable) and merges arrays via concatenation.\n\t*\n\t* @param {...object} objects - Objects to merge\n\t* @returns {object} New object with merged key/values\n\t*/\n\tmergeDeep(...objects) {\n\t\tconst isObject = obj => obj && typeof obj === 'object';\n\t\t\n\t\treturn objects.reduce((prev, obj) => {\n\t\t\tObject.keys(obj).forEach(key => {\n\t\t\t\tconst pVal = prev[key];\n\t\t\t\tconst oVal = obj[key];\n\t\t\t\t\n\t\t\t\tif (Array.isArray(pVal) && Array.isArray(oVal)) {\n\t\t\t\t\tprev[key] = pVal.concat(...oVal);\n\t\t\t\t}\n\t\t\t\telse if (isObject(pVal) && isObject(oVal)) {\n\t\t\t\t\tprev[key] = this.mergeDeep(pVal, oVal);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tprev[key] = oVal;\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\treturn prev;\n\t\t}, {});\n\t}\n}","/**\n * Copyright (C) 2025 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tgetViewData() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Cis4FhcApi/getViewData'\n\t\t};\n\t}\n};","import DashboardSection from \"./Section.js\";\nimport DashboardWidgetPicker from \"./Widget/Picker.js\";\nimport ObjectUtils from \"../../helpers/ObjectUtils.js\";\n\nimport ApiDashboard from '../../api/factory/cis/dashboard.js';\n\nexport default {\n\tname: 'Dashboard',\n\tcomponents: {\n\t\tDashboardSection,\n\t\tDashboardWidgetPicker\n\t},\n\tprops: {\n\t\tdashboard: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t\tdefault: 'CIS'\n\t\t},\n\t\tviewData: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t\tvalidator(value) {\n\t\t\t\treturn value && value.name && value.uid && value.timezone\n\t\t\t}\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tsections: [],\n\t\t\twidgets: null,\n\t\t\teditMode: false,\n\t\t\tviewDataInternal: this.viewData\n\t\t}\n\t},\n\tprovide() {\n\t\treturn {\n\t\t\teditMode: Vue.computed(()=>this.editMode),\n\t\t\twidgetsSetup: Vue.computed(() => this.widgets),\n\t\t\ttimezone: Vue.computed(() => this.viewData.timezone)\n\t\t}\n\t},\n\tcomputed: {\n\t\tapiurl() {\n\t\t\treturn FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/dashboard';\n\t\t}\n\t},\n\tmethods: {\n\t\twidgetAdd(section_name, widget) {\n\t\t\tif (this.widgets === null) {\n\t\t\t\taxios.get(this.apiurl + '/Widget/getWidgetsForDashboard', {params:{\n\t\t\t\t\tdb: this.dashboard\n\t\t\t\t}}).then(res => {\n\t\t\t\t\tres.data.retval.forEach(widget => {\n\t\t\t\t\t\twidget.arguments = JSON.parse(widget.arguments);\n\t\t\t\t\t\twidget.setup = JSON.parse(widget.setup);\n\t\t\t\t\t});\n\t\t\t\t\tthis.widgets = res.data.retval;\n\t\t\t\t}).catch(err => console.error('ERROR:', err));\n\t\t\t}\n\t\t\tthis.$refs.widgetpicker.getWidget().then(widget_id => {\n\t\t\t\twidget.widget = widget_id;\n\t\t\t\twidget.id = 'loading_' + String((new Date()).valueOf());\n\t\t\t\tlet loading = {...widget};\n\t\t\t\tloading.loading = true;\n\t\t\t\tthis.sections.forEach(section => {\n\t\t\t\t\tif (section.name == section_name)\n\t\t\t\t\t\tsection.widgets.push(loading);\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\taxios.post(this.apiurl + '/Config/addWidgetsToUserOverride', {\n\t\t\t\t\tdb: this.dashboard,\n\t\t\t\t\tfunktion_kurzbz: section_name,\n\t\t\t\t\twidgets: [widget]\n\t\t\t\t}).then(result => {\n\t\t\t\t\tlet newId = Object.keys(result.data.retval.data[section_name].widgets).pop();\n\t\t\t\t\twidget.id = newId;\n\t\t\t\t\tthis.sections.forEach(section => {\n\t\t\t\t\t\tif (section.name == section_name) {\n\t\t\t\t\t\t\tsection.widgets.splice(section.widgets.indexOf(loading),1);\n\t\t\t\t\t\t\tsection.widgets.push(widget);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}).catch(error => {\n\t\t\t\t\tconsole.error('ERROR: ', error);\n\t\t\t\t\talert('ERROR: ' + error.response.data.retval);\n\t\t\t\t});\n\t\t\t}).catch(() => {});\n\t\t},\n\t\twidgetUpdate(section_name, payload) {\n\t\t\tpayload = payload[section_name];\n\t\t\tfor (var k in payload) {\n\t\t\t\tfor (var i in this.sections) {\n\t\t\t\t\tif (this.sections[i].name == section_name) {\n\t\t\t\t\t\tfor (var wid in this.sections[i].widgets) {\n\t\t\t\t\t\t\tif (this.sections[i].widgets[wid].id == k) {\n\t\t\t\t\t\t\t\tpayload[k] = ObjectUtils.mergeDeep(this.sections[i].widgets[wid], payload[k]);\n\t\t\t\t\t\t\t\t// NOTE(chris): remove internal props\n\t\t\t\t\t\t\t\tfor (var prop in {_x:1,_y:1,_w:1,_h:1,index:1,id:1,preset:1})\n\t\t\t\t\t\t\t\t\tif (payload[k][prop])\n\t\t\t\t\t\t\t\t\t\tdelete payload[k][prop];\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tpayload[k].widgetid = k;\n\t\t\t}\n\t\t\taxios.post(this.apiurl + '/Config/addWidgetsToUserOverride', {\n\t\t\t\tdb: this.dashboard,\n\t\t\t\tfunktion_kurzbz: section_name,\n\t\t\t\twidgets: payload\n\t\t\t}).then(() => {\n\t\t\t\tthis.sections.forEach(section => {\n\t\t\t\t\tif (section.name == section_name) {\n\t\t\t\t\t\tsection.widgets.forEach((widget, i) => {\n\t\t\t\t\t\t\tif (payload[widget.id]) {\n\t\t\t\t\t\t\t\tpayload[widget.id].id = widget.id;\n\t\t\t\t\t\t\t\tpayload[widget.id].index = widget.index;\n\t\t\t\t\t\t\t\tsection.widgets[i] = payload[widget.id];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}).catch(error => {\n\t\t\t\t// TODO(chris): revert placement on failure\n\t\t\t\tconsole.error('ERROR: ', error);\n\t\t\t\talert('ERROR: ' + error.response.data.retval);\n\t\t\t});\n\t\t},\n\t\twidgetRemove(section_name, id) {\n\t\t\taxios.post(this.apiurl + '/Config/removeWidgetFromUserOverride', {\n\t\t\t\tdb: this.dashboard,\n\t\t\t\tfunktion_kurzbz: section_name,\n\t\t\t\twidgetid: id\n\t\t\t}).then(() => {\n\t\t\t\tthis.sections.forEach(section => {\n\t\t\t\t\tif (section.name == section_name)\n\t\t\t\t\t\tsection.widgets = section.widgets.filter(widget => widget.id != id);\n\t\t\t\t});\n\t\t\t}).catch(error => {\n\t\t\t\tconsole.error('ERROR: ', error);\n\t\t\t\talert('ERROR: ' + error.response.data.retval);\n\t\t\t});\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.$p.loadCategory('dashboard');\n\t\taxios.get(this.apiurl + '/Widget/getWidgetsForDashboard', {\n\t\t\tparams: {\n\t\t\t\tdb: this.dashboard\n\t\t\t}\n\t\t}).then(res => {\n\t\t\tthis.widgets = res.data.retval;\n\t\t}).catch(err => console.error('ERROR:', err));\n\n\t\taxios.get(this.apiurl + '/Config', {params:{\n\t\t\tdb: this.dashboard\n\t\t}}).then(res => {\n\t\t\tfor (var name in res.data.retval) {\n\t\t\t\tlet widgets = [];\n\t\t\t\tlet remove = [];\n\t\t\t\tfor (var wid in res.data.retval[name].widgets) {\n\t\t\t\t\tres.data.retval[name].widgets[wid].id = wid;\n\t\t\t\t\tif (res.data.retval[name].widgets[wid].custom || res.data.retval[name].widgets[wid].preset)\n\t\t\t\t\t\twidgets.push(res.data.retval[name].widgets[wid]);\n\t\t\t\t\telse\n\t\t\t\t\t\tremove.push(wid);\n\t\t\t\t}\n\t\t\t\tthis.sections.push({\n\t\t\t\t\tname: name,\n\t\t\t\t\twidgets: widgets\n\t\t\t\t});\n\t\t\t\tremove.forEach(wid => this.widgetRemove(name, wid));\n\t\t\t}\n\t\t\tthis.sections = this.sections.sort((section1, section2) => {\n\t\t\t\tif(section1.name == 'custom')\n\t\t\t\t\treturn 1;\n\t\t\t\tif (section2.name == 'custom')\n\t\t\t\t\treturn -1;\n\t\t\t\treturn section2.widgets.length - section1.widgets.length;\n\t\t\t});\n\t\t}).catch(err => console.error('ERROR:', err));\n\t},\n\tasync beforeMount() {\n\t\tif (!this.viewData.name || !this.viewData.uid) {\n\t\t\tconst res = await this.$api.call(ApiDashboard.getViewData());\n\t\t\tthis.viewDataInternal = res.data\n\t\t}\t\n\t},\n\ttemplate: `\n\t
    \n\t\t

    \n\t\t\t{{ $p.t('global/personalGreeting', [ viewDataInternal?.name ]) }}\n\t\t\t\n\t\t

    \n\t\t\n\t\t\n\t
    `\n}\n","/**\n * Copyright (C) 2024 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tsearch(searchsettings, config) {\n\t\tconst url = '/api/frontend/v1/searchbar/search';\n\t\treturn this.$fhcApi.post(url, searchsettings, config);\n\t},\n\tsearchAdvanced(searchsettings, config) {\n\t\tconst url = '/api/frontend/v1/searchbar/searchAdvanced';\n\t\treturn this.$fhcApi.post(url, searchsettings, config);\n\t},\n\tsearchdummy(searchsettings) {\n\t\tconst url = 'public/js/apps/api/dummyapi.php/Search';\n\t\treturn this.$fhcApi.post(url, searchsettings);\n\t}\n};\n","/**\n * Copyright (C) 2024 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tloadCategory(category) {\n\t\treturn this.$fhcApi.get('/api/frontend/v1/phrasen/loadModule/' + category);\n\t},\n\tsetLanguage(categories,language) {\n\t\tconst payload = {categories, language}\n\t\treturn this.$fhcApi.post('/api/frontend/v1/phrasen/setLanguage', payload);\n\t},\n\tgetLanguage() {\n\t\treturn this.$fhcApi.get('/api/frontend/v1/phrasen/getLanguage', {});\n\t},\n\tgetActiveDbLanguages() {\n\t\treturn this.$fhcApi.get('/api/frontend/v1/phrasen/getAllLanguages', {});\n\t}\n};","/**\n * Copyright (C) 2024 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tgetHeader(navigation_page) {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/api/frontend/v1/navigation/header',\n\t\t\t{ navigation_page }\n\t\t);\n\t},\n\tgetMenu: function(navigation_page) {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/api/frontend/v1/navigation/menu',\n\t\t\t{ navigation_page }\n\t\t);\n\t}\n};\n\n","/**\n * Copyright (C) 2024 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tsaveCustomFilter(wsParams) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'/api/frontend/v1/filter/saveCustomFilter',\n\t\t\t{\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tcustomFilterName: wsParams.customFilterName\n\t\t\t}\n\t\t);\n\t},\n\tremoveCustomFilter(wsParams) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'/api/frontend/v1/filter/removeCustomFilter',\n\t\t\t{\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterId: wsParams.filterId\n\t\t\t}\n\t\t);\n\t},\n\tapplyFilterFields(wsParams) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'/api/frontend/v1/filter/applyFilterFields',\n\t\t\t{\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterFields: wsParams.filterFields\n\t\t\t}\n\t\t);\n\t},\n\taddFilterField(wsParams) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'/api/frontend/v1/filter/addFilterField',\n\t\t\t{\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterField: wsParams.filterField\n\t\t\t}\n\t\t);\n\t},\n\tremoveFilterField(wsParams) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'/api/frontend/v1/filter/removeFilterField',\n\t\t\t{\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterField: wsParams.filterField\n\t\t\t}\n\t\t);\n\t},\n\tgetFilterById(wsParams) {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/api/frontend/v1/filter/getFilter',\n\t\t\t{\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterId: wsParams.filterId\n\t\t\t}\n\t\t);\n\t},\n\tgetFilter(wsParams) {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/api/frontend/v1/filter/getFilter',\n\t\t\t{\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType\n\t\t\t}\n\t\t);\n\t}\n};\n\n","/**\n * Copyright (C) 2024 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tabmeldung: {\n\t\tgetDetails(antrag_id, prestudent_id) {\n\t\t\tconst url = '/api/frontend/v1/studstatus/abmeldung/'\n\t\t\t\t+ (antrag_id !== undefined ? 'getDetailsForAntrag/' + antrag_id : 'getDetailsForNewAntrag/' + prestudent_id);\n\t\t\treturn this.$fhcApi.get(url);\n\t\t},\n\t\tcreate(stdsem, prestudent_id, grund) {\n\t\t\treturn this.$fhcApi.post('/api/frontend/v1/studstatus/abmeldung/createAntrag', {\n\t\t\t\tstudiensemester: stdsem,\n\t\t\t\tprestudent_id,\n\t\t\t\tgrund\n\t\t\t}, {\n\t\t\t\terrorHandling: 'strict'\n\t\t\t});\n\t\t},\n\t\tcancel(antrag_id) {\n\t\t\tif (!Array.isArray(antrag_id))\n\t\t\t\treturn this.$fhcApi.post(\n\t\t\t\t\t'/api/frontend/v1/studstatus/abmeldung/cancelAntrag',\n\t\t\t\t\t{ antrag_id }\n\t\t\t\t);\n\t\t\treturn Promise.allSettled(antrag_id.map(antrag => this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/abmeldung/cancelAntrag',\n\t\t\t\t{ antrag_id: antrag.studierendenantrag_id },\n\t\t\t\t{ errorHeader: '#' + antrag.studierendenantrag_id }\n\t\t\t)));\n\t\t}\n\t},\n\tunterbrechung: {\n\t\tgetDetails(antrag_id, prestudent_id) {\n\t\t\tconst url = '/api/frontend/v1/studstatus/unterbrechung/'\n\t\t\t\t+ (antrag_id !== undefined ? 'getDetailsForAntrag/' + antrag_id : 'getDetailsForNewAntrag/' + prestudent_id);\n\t\t\treturn this.$fhcApi.get(url);\n\t\t},\n\t\tcreate(studiensemester, prestudent_id, grund, datum_wiedereinstieg, attachment) {\n\t\t\treturn this.$fhcApi.post('/api/frontend/v1/studstatus/unterbrechung/createAntrag', {\n\t\t\t\tstudiensemester,\n\t\t\t\tprestudent_id,\n\t\t\t\tgrund,\n\t\t\t\tdatum_wiedereinstieg,\n\t\t\t\tattachment\n\t\t\t}, {\n\t\t\t\terrorHandling: 'strict'\n\t\t\t});\n\t\t},\n\t\tcancel(antrag_id) {\n\t\t\treturn this.$fhcApi.post('/api/frontend/v1/studstatus/unterbrechung/cancelAntrag', {\n\t\t\t\tantrag_id\n\t\t\t}, {\n\t\t\t\terrorHandling: 'strict'\n\t\t\t});\n\t\t}\n\t},\n\twiederholung: {\n\t\tgetDetails(prestudent_id) {\n\t\t\tconst url = '/api/frontend/v1/studstatus/wiederholung/getDetailsForNewAntrag/' + prestudent_id;\n\t\t\treturn this.$fhcApi.get(url)\n\t\t},\n\t\tgetLvs(antrag_id) {\n\t\t\tconst url = '/api/frontend/v1/studstatus/wiederholung/getLvs/' + antrag_id;\n\t\t\treturn this.$fhcApi.get(url)\n\t\t},\n\t\tcreate(prestudent_id, studiensemester) {\n\t\t\treturn this.$fhcApi.post('/api/frontend/v1/studstatus/wiederholung/createAntrag', {\n\t\t\t\tprestudent_id,\n\t\t\t\tstudiensemester\n\t\t\t}, {\n\t\t\t\terrorHandling: 'strict'\n\t\t\t});\n\t\t},\n\t\tcancel(prestudent_id, studiensemester) {\n\t\t\treturn this.$fhcApi.post('/api/frontend/v1/studstatus/wiederholung/cancelAntrag', {\n\t\t\t\tprestudent_id,\n\t\t\t\tstudiensemester\n\t\t\t}, {\n\t\t\t\terrorHandling: 'strict'\n\t\t\t});\n\t\t},\n\t\tsaveLvs(forbiddenLvs, mandatoryLvs) {\n\t\t\treturn this.$fhcApi.post('/api/frontend/v1/studstatus/wiederholung/saveLvs', {\n\t\t\t\tforbiddenLvs,\n\t\t\t\tmandatoryLvs\n\t\t\t});\n\t\t}\n\t},\n\tleitung: {\n\t\tgetStgs() {\n\t\t\treturn this.$fhcApi.get('/api/frontend/v1/studstatus/leitung/getActiveStgs');\n\t\t},\n\t\tgetAntraege(url, config, params) {\n\t\t\treturn this.$fhcApi\n\t\t\t\t.get('/api/frontend/v1/studstatus/leitung/getAntraege/' + url)\n\t\t\t\t.then(res => res.data); // Return data for tabulator\n\t\t},\n\t\tgetHistory(antrag_id) {\n\t\t\treturn this.$fhcApi.get('/api/frontend/v1/studstatus/leitung/getHistory/' + antrag_id)\n\t\t},\n\t\tgetPrestudents(query, signal) {\n\t\t\treturn this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/leitung/getPrestudents',\n\t\t\t\t{ query },\n\t\t\t\t{\n signal: signal,\n timeout: 30000\n }\n\t\t\t);\n\t\t},\n\t\tapprove(antrag) {\n\t\t\tif (!Array.isArray(antrag))\n\t\t\t\treturn this.$fhcApi.post(\n\t\t\t\t\t'/api/frontend/v1/studstatus/leitung/approveAntrag',\n\t\t\t\t\tantrag\n\t\t\t\t);\n\t\t\treturn Promise.allSettled(antrag.map(a => this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/leitung/approveAntrag',\n\t\t\t\ta,\n\t\t\t\t{ errorHeader: '#' + a.studierendenantrag_id }\n\t\t\t)));\n\t\t},\n\t\treject(antrag) {\n\t\t\tif (!Array.isArray(antrag))\n\t\t\t\treturn this.$fhcApi.post(\n\t\t\t\t\t'/api/frontend/v1/studstatus/leitung/rejectAntrag',\n\t\t\t\t\tantrag\n\t\t\t\t);\n\t\t\treturn Promise.allSettled(antrag.map(a => this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/leitung/rejectAntrag',\n\t\t\t\ta,\n\t\t\t\t{ errorHeader: '#' + a.studierendenantrag_id }\n\t\t\t)));\n\t\t},\n\t\treopen(antrag) {\n\t\t\tif (!Array.isArray(antrag))\n\t\t\t\treturn this.$fhcApi.post(\n\t\t\t\t\t'/api/frontend/v1/studstatus/leitung/reopenAntrag',\n\t\t\t\t\tantrag\n\t\t\t\t);\n\t\t\treturn Promise.allSettled(antrag.map(a => this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/leitung/reopenAntrag',\n\t\t\t\ta,\n\t\t\t\t{ errorHeader: '#' + a.studierendenantrag_id }\n\t\t\t)));\n\t\t},\n\t\tpause(antrag) {\n\t\t\tif (!Array.isArray(antrag))\n\t\t\t\treturn this.$fhcApi.post(\n\t\t\t\t\t'/api/frontend/v1/studstatus/leitung/pauseAntrag',\n\t\t\t\t\tantrag\n\t\t\t\t);\n\t\t\treturn Promise.allSettled(antrag.map(a => this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/leitung/pauseAntrag',\n\t\t\t\ta,\n\t\t\t\t{ errorHeader: '#' + a.studierendenantrag_id }\n\t\t\t)));\n\t\t},\n\t\tunpause(antrag) {\n\t\t\tif (!Array.isArray(antrag))\n\t\t\t\treturn this.$fhcApi.post(\n\t\t\t\t\t'/api/frontend/v1/studstatus/leitung/unpauseAntrag',\n\t\t\t\t\tantrag\n\t\t\t\t);\n\t\t\treturn Promise.allSettled(antrag.map(a => this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/leitung/unpauseAntrag',\n\t\t\t\ta,\n\t\t\t\t{ errorHeader: '#' + a.studierendenantrag_id }\n\t\t\t)));\n\t\t},\n\t\tobject(antrag) {\n\t\t\tif (!Array.isArray(antrag))\n\t\t\t\treturn this.$fhcApi.post(\n\t\t\t\t\t'/api/frontend/v1/studstatus/leitung/objectAntrag',\n\t\t\t\t\tantrag\n\t\t\t\t);\n\t\t\treturn Promise.allSettled(antrag.map(a => this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/leitung/objectAntrag',\n\t\t\t\ta,\n\t\t\t\t{ errorHeader: '#' + a.studierendenantrag_id }\n\t\t\t)));\n\t\t},\n\t\tapproveObjection(antrag) {\n\t\t\tif (!Array.isArray(antrag))\n\t\t\t\treturn this.$fhcApi.post(\n\t\t\t\t\t'/api/frontend/v1/studstatus/leitung/approveObjection',\n\t\t\t\t\tantrag\n\t\t\t\t);\n\t\t\treturn Promise.allSettled(antrag.map(a => this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/leitung/approveObjection',\n\t\t\t\ta,\n\t\t\t\t{ errorHeader: '#' + a.studierendenantrag_id }\n\t\t\t)));\n\t\t},\n\t\tdenyObjection(antrag) {\n\t\t\tif (!Array.isArray(antrag))\n\t\t\t\treturn this.$fhcApi.post(\n\t\t\t\t\t'/api/frontend/v1/studstatus/leitung/denyObjection',\n\t\t\t\t\tantrag\n\t\t\t\t);\n\t\t\treturn Promise.allSettled(antrag.map(a => this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/leitung/denyObjection',\n\t\t\t\ta,\n\t\t\t\t{ errorHeader: '#' + a.studierendenantrag_id }\n\t\t\t)));\n\t\t}\n\t}\n};","export default {\n\n getView: function (uid) {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root + \n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/Profil/getView/${uid}`,{}\n );\n },\n\n fotoSperre: function (value) {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root + \n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/Profil/fotoSperre/${value}`,\n {}\n );\n \n },\n\n isStudent: function (uid) {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root + \n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/Profil/isStudent`,\n {\n uid:uid,\n }\n );\n },\n\n isMitarbeiter: function (uid) {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root + \n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/Profil/isMitarbeiter/${uid}`,\n {}\n );\n },\n\n getZustellAdresse: function () {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root + \n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/Profil/getZustellAdresse`,{}\n );\n },\n\n getZustellKontakt: function () {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root + \n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/Profil/getZustellKontakt`,{}\n );\n },\n\n getGemeinden: function(nation,zip){\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root + \n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/Profil/getGemeinden/${nation}/${zip}`,\n {}\n );\n \n },\n getAllNationen:function(){\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root + \n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n \"/api/frontend/v1/Profil/getAllNationen\",{}\n );\n },\n}","export default {\n //! API calls for profil update requests\n \n getStatus: function () {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/ProfilUpdate/getStatus`,{});\n },\n \n getTopic: function () {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/ProfilUpdate/getTopic`,{});\n },\n \n acceptProfilRequest: function ({profil_update_id, uid, status_message, topic, requested_change}) {\n\n return this.$fhcApi.post(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n \"/api/frontend/v1/ProfilUpdate/acceptProfilRequest\",{profil_update_id, uid, status_message, topic, requested_change});\n },\n \n denyProfilRequest: function ({profil_update_id, uid, topic, status_message}) {\n return this.$fhcApi.post(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n \"/api/frontend/v1/ProfilUpdate/denyProfilRequest\",{profil_update_id,uid,topic,status_message});\n },\n \n insertFile: function (dms, replace = null) {\n\n return this.$fhcApi.post(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/ProfilUpdate/insertFile/${replace}`,\n dms);\n\n },\n \n getProfilRequestFiles: function (requestID) {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/ProfilUpdate/getProfilRequestFiles/${requestID}`,{});\n },\n \n selectProfilRequest: function (uid = null, id = null) {\n\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/ProfilUpdate/selectProfilRequest`,\n {...(uid?{uid}:{}),\n ...(id?{id}:{})\n });\n },\n \n insertProfilRequest: function (topic, payload, fileID = null) {\n\n return this.$fhcApi.post(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n \"/api/frontend/v1/ProfilUpdate/insertProfilRequest\",\n {\n topic,\n payload,\n ...(fileID ? { fileID } : {}),\n });\n },\n \n updateProfilRequest: function (topic, payload, ID, fileID = null) {\n\n return this.$fhcApi.post(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/ProfilUpdate/updateProfilRequest`,\n {\n topic,\n payload,\n ID,\n ...(fileID ? { fileID: fileID } : {}),\n });\n },\n \n deleteProfilRequest: function (requestID) {\n\n return this.$fhcApi.post(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/ProfilUpdate/deleteProfilRequest`,\n {\n requestID,\n });\n },\n };\n ","\nexport default {\n\tgetRoomInfo(ort_kurzbz, start_date, end_date) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'/api/frontend/v1/LvPlan/getRoomplan',\n\t\t\t{ ort_kurzbz, start_date, end_date}\n\t\t);\n\t},\n\tgetStunden() {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/api/frontend/v1/LvPlan/Stunden',\n\t\t\t{}\n\t\t);\n\t},\n\tgetOrtReservierungen(ort_kurzbz, start_date, end_date) {\n\t\treturn this.$fhcApi.post(\n\t\t\t`/api/frontend/v1/LvPlan/getReservierungen/${ort_kurzbz}`,\n\t\t\t{ start_date, end_date}\n\t\t);\n\t},\n\tgetLvPlanReservierungen(start_date, end_date) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'/api/frontend/v1/LvPlan/getReservierungen',\n\t\t\t{ start_date, end_date }\n\t\t);\n\t},\n\tgetLehreinheitStudiensemester(lehreinheit_id) {\n\t\treturn this.$fhcApi.get(\n\t\t\t`/api/frontend/v1/LvPlan/getLehreinheitStudiensemester/${lehreinheit_id}`,\n\t\t\t{}\n\t\t);\n\t},\n\tstudiensemesterDateInterval(date) {\n\t\treturn this.$fhcApi.get(\n\t\t\t`/api/frontend/v1/LvPlan/studiensemesterDateInterval/${date}`,\n\t\t\t{}\n\t\t);\n\t},\n\tLvPlanEvents(start_date, end_date, lv_id) {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/api/frontend/v1/LvPlan/LvPlanEvents',\n\t\t\t{ start_date, end_date, lv_id }\n\t\t);\n\t},\n\t\n\t\n};","import verband from './stv/verband.js';\nimport students from './stv/students.js';\nimport filter from './stv/filter.js';\nimport konto from './stv/konto.js';\nimport group from './stv/group.js';\nimport kontakt from './stv/kontakt.js';\nimport prestudent from './stv/prestudent.js';\nimport status from './stv/status.js';\nimport details from './stv/details.js';\nimport exam from './stv/exam.js';\nimport abschlusspruefung from './stv/abschlusspruefung.js';\nimport grades from './stv/grades.js';\nimport mobility from './stv/mobility.js';\nimport archiv from './stv/archiv.js';\nimport documents from './stv/documents.js';\nimport exemptions from './stv/exemptions.js';\nimport jointstudies from \"./stv/jointstudies.js\";\nimport courselist from './stv/courselist.js';\n\nexport default {\n\tverband,\n\tstudents,\n\tfilter,\n\tkonto,\n\tgroup,\n\tkontakt,\n\tprestudent,\n\tstatus,\n\tdetails,\n\texam,\n\tabschlusspruefung,\n\tgrades,\n\tmobility,\n\tarchiv,\n\tdocuments,\n\texemptions,\n\tjointstudies,\n\tcourselist,\n\tconfigStudent() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/config/student');\n\t},\n\tconfigStudents() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/config/students');\n\t}\n};\n","export default {\n\tget() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/verband');\n\t},\n\tfavorites: {\n\t\tget() {\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/stv/favorites');\n\t\t},\n\t\tset(favorites) {\n\t\t\treturn this.$fhcApi.post('api/frontend/v1/stv/favorites/set', {\n\t\t\t\tfavorites\n\t\t\t});\n\t\t}\n\t}\n}","export default {\n\tuid(uid, studiensemester_kurzbz) {\n\t\tlet url = 'api/frontend/v1/stv/students/'\n\t\t\t+ encodeURIComponent(studiensemester_kurzbz)\n\t\t\t+ '/uid/'\n\t\t\t+ encodeURIComponent(uid);\n\t\treturn this.$fhcApi.getUri(url);\n\t},\n\tprestudent(prestudent_id, studiensemester_kurzbz) {\n\t\tlet url = 'api/frontend/v1/stv/students/'\n\t\t\t+ encodeURIComponent(studiensemester_kurzbz)\n\t\t\t+ '/prestudent/'\n\t\t\t+ encodeURIComponent(prestudent_id);\n\t\treturn this.$fhcApi.getUri(url);\n\t},\n\tperson(person_id, studiensemester_kurzbz) {\n\t\tlet url = 'api/frontend/v1/stv/students/'\n\t\t\t+ encodeURIComponent(studiensemester_kurzbz)\n\t\t\t+ '/person/'\n\t\t\t+ encodeURIComponent(person_id);\n\t\treturn this.$fhcApi.getUri(url);\n\t},\n\tverband(relative_path) {\n\t\treturn this.$fhcApi.getUri('api/frontend/v1/stv/students/' + relative_path);\n\t}\n}","export default {\n\tgetStg() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/filter/getStg');\n\t},\n\tsetStg(studiengang_kz) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/filter/setStg', {\n\t\t\tstudiengang_kz\n\t\t});\n\t}\n};","export default {\n\ttabulatorConfig(config, self) {\n\t\tconfig.ajaxURL = 'api/frontend/v1/stv/konto/get';\n\t\tconfig.ajaxParams = () => {\n\t\t\tconst params = {\n\t\t\t\tperson_id: self.modelValue.person_id || self.modelValue.map(e => e.person_id),\n\t\t\t\tonly_open: self.filter,\n\t\t\t\tstudiengang_kz: self.studiengang_kz_intern ? self.stg_kz : ''\n\t\t\t};\n\t\t\treturn params;\n\t\t};\n\t\tconfig.ajaxRequestFunc = (url, config, params) => this.$fhcApi.post(url, params, config);\n\t\tconfig.ajaxResponse = (url, params, response) => response.data;\n\n\t\treturn config;\n\t},\n\tcheckDoubles(form, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/konto/checkDoubles', data, {\n\t\t\tconfirmErrorHandler: error => true\n\t\t});\n\t},\n\tinsert(form, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/konto/insert', data);\n\t},\n\tcounter(data) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/konto/counter', data);\n\t},\n\tedit(form, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/konto/update', data);\n\t},\n\tdelete(buchungsnr) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/konto/delete', {buchungsnr});\n\t},\n\tgetBuchungstypen() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/konto/getBuchungstypen');\n\t}\n};","export default {\n\tgetGruppen(url, config, params) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/Gruppen/getGruppen/' + params.id);\n\t},\n\tdeleteGroup(params) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/Gruppen/deleteGruppe/', params);\n\t}\n}","export default {\n\t//------------- address.js-----------\n\tgetAdressen (url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/kontakt/getAdressen/' + params.id);\n\t},\n\taddNewAddress(form, id, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/kontakt/addNewAddress/' + id,\n\t\t\tdata\n\t\t);\n\t},\n\tloadAddress(address_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/kontakt/loadAddress/', {address_id});\n\t},\n\tupdateAddress(form, address_id, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/kontakt/updateAddress/' + address_id,\n\t\t\tdata\n\t\t);\n\t},\n\tdeleteAddress(address_id) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/kontakt/deleteAddress/', {address_id});\n\t},\n\tgetPlaces(plz) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/address/getPlaces/' + plz);\n\t},\n\tgetFirmen(searchString) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/kontakt/getFirmen/' + searchString);\n\t},\n\tgetNations() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/address/getNations/');\n\t},\n\tgetAdressentypen() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/kontakt/getAdressentypen/');\n\t},\n\n\t//------------- bankverbindung.js-----------\n\tgetBankverbindung (url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/kontakt/getBankverbindung/' + params.id);\n\t},\n\taddNewBankverbindung(form, id, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/kontakt/addNewBankverbindung/' + id,\n\t\t\tdata\n\t\t);\n\t},\n\tloadBankverbindung(bankverbindung_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/kontakt/loadBankverbindung/', {bankverbindung_id});\n\t},\n\tupdateBankverbindung(form, bankverbindung_id, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/kontakt/updateBankverbindung/' + bankverbindung_id,\n\t\t\tdata\n\t\t);\n\t},\n\tdeleteBankverbindung(bankverbindung_id) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/kontakt/deleteBankverbindung/', {bankverbindung_id});\n\t},\n\n\t//------------- contact.js-----------\n\tgetKontakte (url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/kontakt/getKontakte/' + params.id);\n\t},\n\taddNewContact(form, id, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/kontakt/addNewContact/' + id,\n\t\t\tdata\n\t\t);\n\t},\n\tloadContact(kontakt_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/kontakt/loadContact/', {kontakt_id});\n\t},\n\tupdateContact(form, kontakt_id, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/kontakt/updateContact/' + kontakt_id,\n\t\t\tdata\n\t\t);\n\t},\n\tdeleteContact(kontakt_id) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/kontakt/deleteContact/', {kontakt_id});\n\t},\n\tgetStandorteByFirma(searchString){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/kontakt/getStandorteByFirma/' + searchString);\n\t},\n\tgetKontakttypen(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/kontakt/getKontakttypen/');\n\t}\n};","export default {\n\n//------------- Prestudent.js------------------------------------------------------\n\n\tget(prestudent_id, studiensemester_kurzbz) {\n\t\treturn \tthis.$fhcApi.post(\n\t\t\t'api/frontend/v1/stv/prestudent/get/'\n\t\t\t+ encodeURIComponent(prestudent_id)\n\t\t\t+ '/'\n\t\t\t+ encodeURIComponent(studiensemester_kurzbz)\n\t\t\t);\n\t},\n\tupdatePrestudent(form, prestudent_id, data){\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/prestudent/updatePrestudent/' + prestudent_id,\n\t\t\tdata\n\t\t);\n\t},\n\tgetBezeichnungZGV() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getBezeichnungZGV/');\n\t},\n\tgetBezeichnungMZgv() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getBezeichnungMZgv/');\n\t},\n\tgetBezeichnungDZgv() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getBezeichnungDZgv/');\n\t},\n\tgetStgs() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/lists/getStgs/');\n\t},\n\tgetAusbildung() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getAusbildung/');\n\t},\n\tgetAufmerksamdurch() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getAufmerksamdurch/');\n\t},\n\tgetBerufstaetigkeit() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getBerufstaetigkeit/');\n\t},\n\tgetTypenStg() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getTypenStg/');\n\t},\n\tgetBisstandort() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getBisstandort/');\n\t},\n\n//------------- MultiStatus.js------------------------------------------------------\n\tgetHistoryPrestudent (url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/status/getHistoryPrestudent/' + params.id);\n\t},\n\tgetMaxSem(studiengang_kzs) {\n\t\treturn \tthis.$fhcApi.post('api/frontend/v1/stv/status/getMaxSemester/', {studiengang_kzs});\n\t},\n\tadvanceStatus({prestudent_id, status_kurzbz, studiensemester_kurzbz, ausbildungssemester}) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/status/advanceStatus/'\n\t\t\t+ prestudent_id + '/'\n\t\t\t+ status_kurzbz + '/'\n\t\t\t+ studiensemester_kurzbz + '/'\n\t\t\t+ ausbildungssemester\n\t\t);\n\t},\n\tconfirmStatus({prestudent_id, status_kurzbz, studiensemester_kurzbz, ausbildungssemester}) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/status/confirmStatus/'\n\t\t\t+ prestudent_id + '/'\n\t\t\t+ status_kurzbz + '/'\n\t\t\t+ studiensemester_kurzbz + '/'\n\t\t\t+ ausbildungssemester\n\t\t);\n\t},\n\tisLastStatus(id) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/status/isLastStatus/' + id);\n\t},\n\tdeleteStatus({prestudent_id, status_kurzbz, studiensemester_kurzbz, ausbildungssemester}) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/status/deleteStatus/'\n\t\t\t+ prestudent_id + '/'\n\t\t\t+ status_kurzbz + '/'\n\t\t\t+ studiensemester_kurzbz + '/'\n\t\t\t+ ausbildungssemester\n\t\t);\n\t},\n\tgetLastBismeldestichtag() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/status/getLastBismeldestichtag/');\n\t},\n\n//------------- History.js------------------------------------------------------\n\tgetHistoryPrestudents (url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getHistoryPrestudents/' + params.id);\n\t},\n\n}","export default {\n\n//------------- Modal.js------------------------------------------------------\n\n\tinsertStatus(form, id, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/status/insertStatus/' + id,\n\t\t\tdata\n\t\t);\n\t},\n\tloadStatus({prestudent_id, status_kurzbz, studiensemester_kurzbz, ausbildungssemester}) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'api/frontend/v1/stv/status/loadStatus/'\n\t\t\t+ prestudent_id + '/'\n\t\t\t+ status_kurzbz + '/'\n\t\t\t+ studiensemester_kurzbz + '/'\n\t\t\t+ ausbildungssemester\n\t\t);\n\t},\n\tupdateStatus(form, {prestudent_id, status_kurzbz, studiensemester_kurzbz, ausbildungssemester}, data) {\n\t\treturn this.$fhcApi.post(\n\t\t\tform,\n\t\t\t'api/frontend/v1/stv/status/updateStatus/'\n\t\t\t+ prestudent_id + '/'\n\t\t\t+ status_kurzbz + '/'\n\t\t\t+ studiensemester_kurzbz + '/'\n\t\t\t+ ausbildungssemester,\n\t\t\tdata\n\t\t);\n\t},\n\tgetStudienplaene(prestudent_id) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getStudienplaene/' + prestudent_id);\n\t},\n\tgetStudiengang(prestudent_id) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getStudiengang/' + prestudent_id);\n\t},\n\tgetStatusgruende() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/status/getStatusgruende/');\n\t},\n\tgetStati() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/lists/getStati/');\n\t},\n\n//------------- Dropdown.js------------------------------------------------------\n\n\taddStudent(id, data) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/status/addStudent/' + id,\n\t\t\tdata,\n\t\t\t{errorHeader: id}\n\t\t);\n\t},\n\tchangeStatus(id, data) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/status/changeStatus/' + id,\n\t\t\tdata,\n\t\t\t{errorHeader: id}\n\t\t);\n\t},\n\tgetStatusarray() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/status/getStatusarray/');\n\t}\n}","export default {\n\tget(prestudent_id, studiensemester_kurzbz) {\n\t\tlet url = 'api/frontend/v1/stv/student/get/'\n\t\t\t+ encodeURIComponent(prestudent_id)\n\t\t\t+ '/'\n\t\t\t+ encodeURIComponent(studiensemester_kurzbz);\n\t\treturn this.$fhcApi.post(url);\n\t},\n\tsave(form, prestudent_id, studiensemester_kurzbz, data) {\n\t\tlet url = 'api/frontend/v1/stv/student/save/'\n\t\t\t+ encodeURIComponent(prestudent_id)\n\t\t\t+ '/'\n\t\t\t+ encodeURIComponent(studiensemester_kurzbz);\n\t\treturn this.$fhcApi.post(form, url, data);\n\t},\n}\n","export default {\n\tgetPruefungen(url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/pruefung/getPruefungen/' + params.id);\n\t},\n\tloadPruefung(pruefung_id){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/pruefung/loadPruefung/' + pruefung_id);\n\t},\n\tgetTypenPruefungen(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/pruefung/getTypenPruefungen');\n\t},\n\tgetAllLehreinheiten(data){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/pruefung/getAllLehreinheiten/', data)\n\t},\n\tgetLvsByStudent(uid){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/pruefung/getLvsByStudent/' + uid)\n\t},\n\tgetLvsandLesByStudent(uid, semester){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/pruefung/getLvsandLesByStudent/' + uid + '/' + semester);\n\t},\n\tgetLvsAndMas(uid){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/pruefung/getLvsAndMas/' + uid)\n\t},\n\tgetMitarbeiterLv(id){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/pruefung/getMitarbeiterLv/' + id)\n\t},\n\tgetNoten(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/pruefung/getNoten');\n\t},\n\tcheckZeugnisnoteLv(data){\n\t\treturn \tthis.$fhcApi.post('api/frontend/v1/stv/pruefung/checkZeugnisnoteLv/', data)\n\t},\n\taddPruefung(form, data){\n\t\treturn this.$fhcApi.post(form,'api/frontend/v1/stv/pruefung/insertPruefung/', data);\n\t},\n\tupdatePruefung(form, id, data){\n\t\treturn this.$fhcApi.post(form,'api/frontend/v1/stv/pruefung/updatePruefung/' + id, data);\n\t},\n\tdeletePruefung(id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/pruefung/deletePruefung/' + id)\n\t}\n}","export default {\n\n\tgetAbschlusspruefung (url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/abschlusspruefung/getAbschlusspruefung/' + params.id);\n\t},\n\taddNewAbschlusspruefung(form, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/abschlusspruefung/insertAbschlusspruefung/', data\n\t\t);\n\t},\n\tloadAbschlusspruefung(id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/abschlusspruefung/loadAbschlusspruefung/', {id});\n\t},\n\tupdateAbschlusspruefung(form, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/abschlusspruefung/updateAbschlusspruefung/', data\n\t\t);\n\t},\n\tdeleteAbschlusspruefung(id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/abschlusspruefung/deleteAbschlusspruefung/', {id});\n\t},\n\tgetTypenAbschlusspruefung(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/abschlusspruefung/getTypenAbschlusspruefung/');\n\t},\n\tgetTypenAntritte(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/abschlusspruefung/getTypenAntritte/');\n\t},\n\tgetBeurteilungen(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/abschlusspruefung/getBeurteilungen/');\n\t},\n\tgetAkadGrade(studiengang_kz){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/abschlusspruefung/getAkadGrade/', {studiengang_kz});\n\t},\n\tgetTypStudiengang(studiengang_kz){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/abschlusspruefung/getTypStudiengang/', {studiengang_kz});\n\t},\n\tgetMitarbeiter(searchString){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/abschlusspruefung/getMitarbeiter/' + searchString);\n\t},\n\tgetPruefer(searchString){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/abschlusspruefung/getPruefer/' + searchString);\n\t},\n\tgetNoten(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/abschlusspruefung/getNoten/');\n\t},\n\tcheckForExistingExams(uids) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/abschlusspruefung/checkForExistingExams/', {uids}\n\t\t);\n\t}\n}","export default {\n\tlist() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/grades/list');\n\t},\n\tgetCertificate(prestudent_id, studiensemester_kurzbz) {\n\t\tlet url = 'api/frontend/v1/stv/grades/getCertificate/' + encodeURIComponent(prestudent_id);\n\t\tif (!!studiensemester_kurzbz) {\n\t\t\turl = url + '/' + encodeURIComponent(studiensemester_kurzbz);\n\t\t}\n\t\treturn this.$fhcApi.get(url);\n\t},\n\tgetTeacherProposal(prestudent_id, studiensemester_kurzbz) {\n\t\tlet url = 'api/frontend/v1/stv/grades/getTeacherProposal/' + encodeURIComponent(prestudent_id);\n\t\tif (!!studiensemester_kurzbz) {\n\t\t\turl = url + '/' + encodeURIComponent(studiensemester_kurzbz);\n\t\t}\n\t\treturn this.$fhcApi.get(url);\n\t},\n\tgetRepeaterGrades(prestudent_id, studiensemester_kurzbz) {\n\t\tlet url = 'api/frontend/v1/stv/grades/getRepeaterGrades/' + encodeURIComponent(prestudent_id);\n\t\tif (!!studiensemester_kurzbz) {\n\t\t\turl = url + '/' + encodeURIComponent(studiensemester_kurzbz);\n\t\t}\n\t\treturn this.$fhcApi.get(url);\n\t},\n\tupdateCertificate({lehrveranstaltung_id, student_uid, studiensemester_kurzbz, note, lehrveranstaltung_bezeichnung}) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'api/frontend/v1/stv/grades/updateCertificate',\n\t\t\t{\n\t\t\t\tlehrveranstaltung_id,\n\t\t\t\tstudent_uid,\n\t\t\t\tstudiensemester_kurzbz,\n\t\t\t\tnote\n\t\t\t},\n\t\t\t{\n\t\t\t\terrorHeader: lehrveranstaltung_bezeichnung\n\t\t\t}\n\t\t);\n\t},\n\tdeleteCertificate({lehrveranstaltung_id, student_uid, studiensemester_kurzbz, lehrveranstaltung_bezeichnung}) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'api/frontend/v1/stv/grades/deleteCertificate',\n\t\t\t{\n\t\t\t\tlehrveranstaltung_id,\n\t\t\t\tstudent_uid,\n\t\t\t\tstudiensemester_kurzbz\n\t\t\t},\n\t\t\t{\n\t\t\t\terrorHeader: lehrveranstaltung_bezeichnung\n\t\t\t}\n\t\t);\n\t},\n\tcopyTeacherProposalToCertificate({lehrveranstaltung_id, student_uid, studiensemester_kurzbz, lehrveranstaltung_bezeichnung}) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'api/frontend/v1/stv/grades/copyTeacherProposalToCertificate',\n\t\t\t{\n\t\t\t\tlehrveranstaltung_id,\n\t\t\t\tstudent_uid,\n\t\t\t\tstudiensemester_kurzbz\n\t\t\t},\n\t\t\t{\n\t\t\t\terrorHeader: lehrveranstaltung_bezeichnung\n\t\t\t}\n\t\t);\n\t},\n\tcopyRepeaterGradeToCertificate({studierendenantrag_lehrveranstaltung_id, lv_bezeichnung}) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'api/frontend/v1/stv/grades/copyRepeaterGradeToCertificate',\n\t\t\t{\n\t\t\t\tstudierendenantrag_lehrveranstaltung_id\n\t\t\t},\n\t\t\t{\n\t\t\t\terrorHeader: lv_bezeichnung\n\t\t\t}\n\t\t);\n\t},\n\tgetGradeFromPoints(points, lehrveranstaltung_id, studiensemester_kurzbz, manualErrorHandling) {\n\t\tconst config = manualErrorHandling ? {errorHandling: false} : {};\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/grades/getGradeFromPoints',\n\t\t\t{\n\t\t\t\t\"points\": points,\n\t\t\t\t\"lehrveranstaltung_id\": lehrveranstaltung_id,\n\t\t\t\t\"studiensemester_kurzbz\": studiensemester_kurzbz\n\t\t\t},\n\t\t\tconfig\n\t\t\t);\n\t}\n}","export default {\n\tgetMobilitaeten (url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/mobility/getMobilitaeten/' + params.id);\n\t},\n\tgetProgramsMobility(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/mobility/getProgramsMobility/');\n\t},\n\taddNewMobility(form, data){\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/mobility/insertMobility/', data);\n\t},\n\tloadMobility(bisio_id){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/mobility/loadMobility/' + bisio_id);\n\t},\n\tupdateMobility(form, data){\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/mobility/updateMobility/', data);\n\t},\n\tdeleteMobility(bisio_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/mobility/deleteMobility/' + bisio_id);\n\t},\n\tgetLVList(studiengang_kz){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/mobility/getLVList/' + studiengang_kz);\n\t},\n\tgetAllLehreinheiten(data){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/mobility/getAllLehreinheiten/', data)\n\t},\n\tgetLvsandLesByStudent(uid){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/mobility/getLvsandLesByStudent/' + uid);\n\t},\n\tgetPurposes(url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/mobility/getPurposes/' + params.id);\n\t},\n\tgetSupports(url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/mobility/getSupports/' + params.id);\n\t},\n\tgetListPurposes() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/mobility/getListPurposes/');\n\t},\n\tgetListSupports() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/mobility/getListSupports/');\n\t},\n\tdeleteMobilityPurpose(params) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/mobility/deleteMobilityPurpose/' + params.bisio_id, params);\n\t},\n\taddMobilityPurpose(params) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/mobility/addMobilityPurpose/' + params.bisio_id, params);\n\t},\n\tdeleteMobilitySupport(params) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/mobility/deleteMobilitySupport/' + params.bisio_id, params);\n\t},\n\taddMobilitySupport(params) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/mobility/addMobilitySupport/' + params.bisio_id, params);\n\t},\n\n}","export default {\n\ttabulatorConfig(config, self) {\n\t\tconfig.ajaxURL = 'api/frontend/v1/stv/archiv/get';\n\t\tconfig.ajaxParams = () => {\n\t\t\tconst params = {\n\t\t\t\tperson_id: self.modelValue.person_id || self.modelValue.map(e => e.person_id)\n\t\t\t};\n\t\t\treturn params;\n\t\t};\n\t\tconfig.ajaxRequestFunc = (url, config, params) => this.$fhcApi.post(url, params, config);\n\t\tconfig.ajaxResponse = (url, params, response) => response.data;\n\n\t\treturn config;\n\t},\n\tgetArchivVorlagen() {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/archiv/getArchivVorlagen');\n\t},\n\tarchive(data) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'api/frontend/v1/documents/archive',\n\t\t\tdata\n\t\t);\n\t},\n\tarchiveSigned(data) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'api/frontend/v1/documents/archiveSigned',\n\t\t\tdata\n\t\t);\n\t},\n\tupdate(data) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/archiv/update', data);\n\t},\n\tdelete({akte_id, studiengang_kz}) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/archiv/delete', {akte_id, studiengang_kz});\n\t}\n};\n","export default {\n\tgetDocumentsUnaccepted(url, config, params) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/dokumente/getDocumentsUnaccepted/' + params.id + '/' + params.studiengang_kz);\n\t},\n\tgetDocumentsAccepted(url, config, params) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/dokumente/getDocumentsAccepted/' + params.id + '/' + params.studiengang_kz);\n\t},\n\tdeleteZuordnung(params){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/dokumente/deleteZuordnung/' + params.prestudent_id + '/' + params.dokument_kurzbz);\n\t},\n\tcreateZuordnung(params){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/dokumente/createZuordnung/'\n\t\t\t+ params.prestudent_id + '/'\n\t\t\t+ params.dokument_kurzbz);\n\t},\n\tloadAkte(akte_id){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/dokumente/loadAkte/' + akte_id);\n\t},\n\tgetDoktypen(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/dokumente/getDoktypen/');\n\t},\n\tupdateFile(akte_id, data){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/dokumente/updateAkte/' + akte_id,\n\t\t\tdata);\n\t},\n\tdeleteFile(akte_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/dokumente/deleteAkte/' + akte_id);\n\t},\n\tuploadFile(prestudent_id, data){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/dokumente/uploadDokument/' + prestudent_id,\n\t\t\tdata);\n\t},\n}","export default {\n\tgetAnrechnungen(url, config, params) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/anrechnungen/getAnrechnungen/' + params.id);\n\t},\n\tgetLehrveranstaltungen(prestudent_id){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/anrechnungen/getLehrveranstaltungen/' + prestudent_id);\n\t},\n\tgetBegruendungen(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/anrechnungen/getBegruendungen/');\n\t},\n\tgetLvsKompatibel(lv_id){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/anrechnungen/getLvsKompatibel/' + lv_id);\n\t},\n\tgetLektoren(studiengang_kz){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/anrechnungen/getLektoren/' + studiengang_kz);\n\t},\n\taddNewAnrechnung(form, data){\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/anrechnungen/insertAnrechnung/', data);\n\t},\n\tloadAnrechnung(anrechnung_id){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/anrechnungen/loadAnrechnung/' + anrechnung_id);\n\t},\n\teditAnrechnung(form, data){\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/anrechnungen/updateAnrechnung/', data);\n\t},\n\tdeleteAnrechnung(anrechnung_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/anrechnungen/deleteAnrechnung/' + anrechnung_id);\n\t},\n}","export default {\n\tgetStudies(url, config, params) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/GemeinsameStudien/getStudien/' + params.id);\n\t},\n\tgetTypenMobility(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/GemeinsameStudien/getTypenMobility/');\n\t},\n\tgetStudiensemester(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/GemeinsameStudien/getStudiensemester/');\n\t},\n\tgetStudyprograms(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/GemeinsameStudien/getStudienprogramme/');\n\t},\n\tgetListPartner(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/GemeinsameStudien/getPartnerfirmen/');\n\t},\n\tgetStatiPrestudent(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/GemeinsameStudien/getStatiPrestudent/');\n\t},\n\tloadStudy(id){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/GemeinsameStudien/loadStudie/' + id);\n\t},\n\tinsertStudy(form, data){\n\t\treturn this.$fhcApi.post(form,'api/frontend/v1/stv/GemeinsameStudien/insertStudie/', data);\n\t},\n\tupdateStudy(form, data){\n\t\treturn this.$fhcApi.post(form,'api/frontend/v1/stv/GemeinsameStudien/updateStudie/', data);\n\t},\n\tdeleteStudy(id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/GemeinsameStudien/deleteStudie/' + id);\n\t},\n\n}","export default {\n\tgetCourselist(url, config, params) {\n\t\t//corresponding logic controller Stundenplan.php\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/LvTermine/getStundenplan/'\n\t\t\t+ params.student_uid + '/'\n\t\t\t+ params.start_date + '/'\n\t\t\t+ params.end_date + '/'\n\t\t\t+ params.group_consecutiveHours + '/'\n\t\t\t+ params.dbStundenplanTable\n\t\t);\n\t},\n\tgetStudiensemester(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/LvTermine/getStudiensemester/');\n\t},\n}","import person from \"./notiz/person.js\";\n\nexport default {\n\tperson\n}","export default {\n\tgetNotizen (url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/notiz/notizPerson/getNotizen/' + params.id + '/' + params.type);\n\t},\n\tgetUid(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/notiz/notizPerson/getUid/');\n\t},\n\taddNewNotiz(form, id, formData) {\n\t\treturn this.$fhcApi.post(form,'api/frontend/v1/notiz/notizPerson/addNewNotiz/' + id,\n\t\t\tformData\n\t\t);\n\t},\n\tloadNotiz(notiz_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/notiz/notizPerson/loadNotiz/', {\n\t\t\tnotiz_id\n\t\t});\n\t},\n\tloadDokumente(notiz_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/notiz/notizPerson/loadDokumente/', {\n\t\t\tnotiz_id\n\t\t});\n\t},\n\tdeleteNotiz(notiz_id, type_id, id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/notiz/notizPerson/deleteNotiz/', {\n\t\t\tnotiz_id,\n\t\t\ttype_id,\n\t\t\tid\n\t\t});\n\t},\n\tupdateNotiz(form, notiz_id, formData){\n\t\treturn this.$fhcApi.post(form,'api/frontend/v1/notiz/notizPerson/updateNotiz/' + notiz_id,\n\t\t\tformData\n\t\t);\n\t},\n\tgetMitarbeiter(event){\n\t\treturn this.$fhcApi.get('api/frontend/v1/notiz/notizPerson/getMitarbeiter/' + event);\n\t},\n\tisBerechtigt(id, type_id){\n\t\treturn this.$fhcApi.get('api/frontend/v1/notiz/notizPerson/isBerechtigt/');\n\t}\n}","import person from \"./betriebsmittel/person.js\";\n\nexport default {\n\tperson\n}","export default {\n\tgetAllBetriebsmittel(url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/betriebsmittel/betriebsmittelP/getAllBetriebsmittel/' + params.type + '/' + params.id);\n\t},\n\taddNewBetriebsmittel(form, person_id, formData) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/betriebsmittel/betriebsmittelP/addNewBetriebsmittel/' +\n\t\t\tperson_id, formData\n\t\t);\n\t},\n\tloadBetriebsmittel(betriebsmittelperson_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/betriebsmittel/betriebsmittelP/loadBetriebsmittel/' + betriebsmittelperson_id);\n\t},\n\tupdateBetriebsmittel(form, betriebsmittelperson_id, formData) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/betriebsmittel/betriebsmittelP/updateBetriebsmittel/' + betriebsmittelperson_id,\n\t\t\tformData);\n\t},\n\tdeleteBetriebsmittel(betriebsmittelperson_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/betriebsmittel/betriebsmittelP/deleteBetriebsmittel/' +\tbetriebsmittelperson_id);\n\t},\n\tgetTypenBetriebsmittel(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/betriebsmittel/betriebsmittelP/getTypenBetriebsmittel/');\n\t},\n\tloadInventarliste(query){\n\t\treturn this.$fhcApi.get('api/frontend/v1/betriebsmittel/betriebsmittelP/loadInventarliste/' +\tquery);\n\t}\n}","export default {\n\tupdatePersonUnrulyStatus(person_id, unrulyParam) {\n\n\t\ttry {\n\t\t\tconst payload = {person_id, unruly: unrulyParam}\n\t\t\tconst url = '/api/frontend/v1/checkperson/CheckPerson/updatePersonUnrulyStatus';\n\t\t\treturn this.$fhcApi.post(url, payload, null);\n\t\t} catch (error) {\n\t\t\tthrow error;\n\t\t}\n\n\t},\n\tfilterPerson(payload, base = ''){\n\n\t\ttry {\n\t\t\tconst url = base + '/api/frontend/v1/checkperson/CheckPerson/filterPerson';\n\t\t\treturn axios.post(url, payload)\n\t\t} catch (error) {\n\t\t\tthrow error;\n\t\t}\n\n\t}\n}","export default {\n getContentID(ort_kurbz) {\n\t\treturn this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n \"/api/frontend/v1/Ort/ContentID\",\n\t\t\t{ ort_kurzbz: ort_kurbz }\n\t\t);\n\t},\n\tgetRooms(datum, von, bis, typ, personenanzahl = 0) {\n\t\treturn this.$fhcApi.get(\n\t\t\tFHC_JS_DATA_STORAGE_OBJECT.app_root +\n\t\t\tFHC_JS_DATA_STORAGE_OBJECT.ci_router +\n\t\t\t\"/api/frontend/v1/Ort/getRooms\",\n\t\t\t{ datum, von, bis, typ, personenanzahl }\n\t\t);\n\t},\n\tgetRoomTypes() {\n\t\treturn this.$fhcApi.get(\n\t\t\tFHC_JS_DATA_STORAGE_OBJECT.app_root +\n\t\t\tFHC_JS_DATA_STORAGE_OBJECT.ci_router +\n\t\t\t\"/api/frontend/v1/Ort/getTypes\"\n\t\t);\n\t}\n}","export default {\n content(content_id, version=null, sprache=null, sichtbar=null) {\n return this.$fhcApi.get(\n\t\t\t\"/api/frontend/v1/Cms/content\",\n\t\t\t{ \n\t\t\t\tcontent_id: content_id,\n\t\t\t\t...(version?{version}:{}),\n\t\t\t\t...(sprache?{sprache}:{}),\n\t\t\t\t...(sichtbar?{sichtbar}:{}),\n }\n );\n },\n\t//api function used for the news View that renders the html\n\tgetNews(page = 1, page_size = 10, sprache) {\n\t\treturn this.$fhcApi.get(\n\t\t\t\"/api/frontend/v1/Cms/getNews\",\n\t\t\t{\n\t\t\t\tpage,\n\t\t\t\tpage_size,\n\t\t\t\tsprache,\n\t\t\t},\n\t\t);\n\t},\n\t//api function used for the widget component\n\tnews(limit) {\n\t\treturn this.$fhcApi.get(\n\t\t\t\"/api/frontend/v1/Cms/news\",\n\t\t\t{\n\t\t\t\tlimit: limit\n\t\t\t}\n\t\t);\n\t},\n\tgetNewsRowCount: function () {\n\t\treturn this.$fhcApi.get(\n\t\t\t\"/api/frontend/v1/Cms/getNewsRowCount\",\n\t\t\t{}\n\t\t);\n\t},\n\tgetNewsExtra: function(){\n\t\treturn this.$fhcApi.get(\n\t\t\t\"/api/frontend/v1/Cms/getStudiengangInfoForNews\",\n\t\t\t{}\n\t\t);\n\t}\n }","export default {\n getStudentenMail(lehreinheit_id) {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n \"/api/frontend/v1/Lehre/lvStudentenMail\",\n { lehreinheit_id: lehreinheit_id }\n );\n },\n\tgetLvInfo(studiensemester_kurzbz, lehrveranstaltung_id) {\n\t\treturn this.$fhcApi.get(\n\t\t\t`/api/frontend/v1/Lehre/LV/${studiensemester_kurzbz}/${lehrveranstaltung_id}`\n\t\t\t, {}\n\t\t);\n\t},\n\tgetStudentPruefungen(lehrveranstaltung_id){\n\t\treturn this.$fhcApi.get(\n\t\t\t`/api/frontend/v1/Lehre/Pruefungen/${lehrveranstaltung_id}`\n\t\t\t, {}\n\t\t);\n\t}\n }","export default {\n getLvMenu(lvid, studiensemester_kurzbz) {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/LvMenu/getLvMenu/${lvid}/${studiensemester_kurzbz}`,\n {}\n );\n },\n\n \n }","import person from \"./messages/person.js\";\n\nexport default {\n\tperson\n}","export default {\n\t\tgetMessages(url, config, params) {\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getMessages/' + params.id + '/' + params.type + '/' + params.size + '/' + params.page);\n\t\t},\n\t\tgetVorlagen(){\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getVorlagen/');\n\t\t},\n\t\tgetMsgVarsLoggedInUser(){\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getMsgVarsLoggedInUser/');\n\t\t},\n\t\tgetMessageVarsPerson(params){\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getMessageVarsPerson/' + params.id + '/' + params.type_id);\n\t\t},\n\t\tgetMsgVarsPrestudent(params){\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getMsgVarsPrestudent/' + params.id + '/' + params.type_id);\n\t\t},\n\t\tgetPersonId(params){\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getPersonId/'+ params.id + '/' + params.type_id);\n\t\t},\n\t\tgetUid(params){\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getUid/'+ params.id + '/' + params.type_id);\n\t\t},\n\t\tgetDataVorlage(vorlage_kurzbz){\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getDataVorlage/' + vorlage_kurzbz);\n\t\t},\n\t\tgetNameOfDefaultRecipient(params){\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getNameOfDefaultRecipient/' + params.id + '/' + params.type_id);\n\t\t},\n\t\tgetPreviewText(params, data){\n\t\t\treturn this.$fhcApi.post('api/frontend/v1/messages/messages/getPreviewText/' + params.id + '/' + params.type_id,\n\t\t\t\tdata);\n\t\t},\n\t\tgetReplyData(messageId){\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getReplyData/' + messageId);\n\t\t},\n\t\tsendMessageFromModalContext(form, id, data) {\n\t\t\treturn this.$fhcApi.post(form,'api/frontend/v1/messages/messages/sendMessage/' + id,\n\t\t\t\tdata);\n\t\t},\n\t\tsendMessage(id, data) {\n\t\t\treturn this.$fhcApi.post('api/frontend/v1/messages/messages/sendMessage/' + id,\n\t\t\t\tdata);\n\t\t},\n\t\tdeleteMessage(messageId){\n\t\t\treturn this.$fhcApi.post('api/frontend/v1/messages/messages/deleteMessage/' + messageId);\n\t\t}\n}","export default {\n\tgetVorlagen() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/vorlagen/vorlagen/getVorlagen/');\n\t},\n\tgetVorlagenByLoggedInUser() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/vorlagen/vorlagen/getVorlagenByLoggedInUser/');\n\t}\n}","export default {\n\n\tgetStudiensemester: function () {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/components/Cis/Mylv/Studiensemester',\n\t\t\t{}\n\t\t);\n\t},\n\n\tgetAllStudienSemester: function (studiensemester=undefined, studiengang=undefined, semester=undefined, studienplan=undefined) {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/api/frontend/v1/Studium/getStudienAllSemester',\n\t\t\t{studiensemester, studiengang, semester, studienplan}\n\t\t);\n\t},\n\n\tgetStudiengaengeForStudienSemester: function (studiensemester) {\n\t\treturn this.$fhcApi.get(\n\t\t\t`/api/frontend/v1/Studium/getStudiengaengeForStudienSemester/${studiensemester}`,\n\t\t\t{}\n\t\t);\n\t},\n\tgetStudienplaeneBySemester: function (studiengang, studiensemester) {\n\t\treturn this.$fhcApi.get(\n\t\t\t`/api/frontend/v1/Studium/getStudienplaeneBySemester`,\n\t\t\t{\n\t\t\t\tstudiengang,\n\t\t\t\tstudiensemester,\n\t\t\t}\n\t\t);\n\t},\n\tgetLvPlanForStudiensemester: function (studiensemester, lvid) {\n\t\treturn this.$fhcApi.get(\n\t\t\t`/api/frontend/v1/LvPlan/getLvPlanForStudiensemester/${studiensemester}/${lvid}`,\n\t\t\t{\n\t\t\t}\n\t\t);\n\t},\n\tgetLvEvaluierungInfo: function (studiensemester_kurzbz, lvid) {\n\t\treturn this.$fhcApi.get(\n\t\t\t`/api/frontend/v1/Studium/getLvEvaluierungInfo/${studiensemester_kurzbz}/${lvid}`,\n\t\t\t{\n\t\t\t}\n\t\t);\n\t},\n\t\n}","/**\n * Copyright (C) 2024 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nimport search from \"./search.js\";\nimport phrasen from \"./phrasen.js\";\nimport navigation from \"./navigation.js\";\nimport filter from \"./filter.js\";\nimport studstatus from \"./studstatus.js\";\nimport profil from \"./profil.js\";\nimport profilUpdate from \"./profilUpdate.js\";\nimport lvPlan from \"./lvPlan.js\";\nimport bookmark from \"./bookmark.js\";\nimport stv from \"./stv.js\";\nimport notiz from \"./notiz.js\";\nimport betriebsmittel from \"./betriebsmittel.js\";\nimport checkperson from \"./checkperson.js\";\nimport ampeln from \"./ampeln.js\";\nimport ort from \"./ort.js\";\nimport cms from \"./cms.js\";\nimport lehre from \"./lehre.js\";\nimport addons from \"./addons.js\";\nimport messages from \"./messages.js\";\nimport vorlagen from \"./vorlagen.js\";\nimport studiengang from \"./studiengang.js\";\nimport menu from \"./menu.js\";\nimport dashboard from \"./dashboard.js\";\nimport authinfo from \"./authinfo.js\";\nimport studium from \"./studium.js\";\nimport language from \"./language.js\";\n\nexport default {\n search,\n phrasen,\n navigation,\n dashboard,\n filter,\n studstatus,\n profil,\n profilUpdate,\n lvPlan,\n bookmark,\n stv,\n notiz,\n betriebsmittel,\n checkperson,\n ampeln,\n ort,\n cms,\n lehre,\n addons,\n messages,\n vorlagen,\n addons,\n\tstudiengang,\n\tmenu,\n\tauthinfo,\n\tstudium,\n language\n};\n","export default {\n\tasync getViewData() {\n\t\tconst url = `/api/frontend/v1/Cis4FhcApi/getViewData`;\n\t\treturn this.$fhcApi.get(url, null, null)\n\t},\n}","export default {\n\n getBookmarks: function () {\n return this.$fhcApi.get(\n `/api/frontend/v1/Bookmark/getBookmarks`\n ,{}\n );\n },\n \n delete: function (bookmark_id) {\n return this.$fhcApi.get(\n `/api/frontend/v1/Bookmark/delete/${bookmark_id}`\n ,{}\n ); \n },\n\n\tupdate: function ({ bookmark_id, url, title, tag=null}) {\n\t\treturn this.$fhcApi.post(\n\t\t\t`/api/frontend/v1/Bookmark/update/${bookmark_id}`\n\t\t\t, {\n\t\t\t\turl: url,\n\t\t\t\ttitle: title\n\t\t\t}\n\t\t);\n\t},\n\n insert: function ({url, title, tag}) {\n return this.$fhcApi.post(\n `/api/frontend/v1/Bookmark/insert`\n ,{\n url: url,\n title: title,\n tag: tag\n }\n ); \n },\n}","export default {\n \n open: function () {\n return this.$fhcApi.get(\n `/api/frontend/v1/Ampeln/open`,{});\n },\n\n all: function () {\n return this.$fhcApi.get(\n `/api/frontend/v1/Ampeln/all`,{});\n },\n\n confirm: function (ampel_id) {\n return this.$fhcApi.get(\n `/api/frontend/v1/Ampeln/confirm/${ampel_id}`,{});\n },\n\n}","export default {\n\tstudiengangInformation: function () {\n\t\treturn this.$fhcApi.get(\n\t\t\t\"/api/frontend/v1/Studgang/getStudiengangInfo\",\n\t\t\t{}\n\t\t);\n\t},\n\tgetStudiengangByKz: function (studiengang_kz) {\n\t\treturn this.$fhcApi.get(\n\t\t\t\"/api/frontend/v1/organisation/StudiengangEP/getStudiengangByKz\",\n\t\t\t{\n\t\t\t\t\"studiengang_kz\": studiengang_kz\n\t\t\t}\n\t\t);\n\t}\n}","export default {\n\tgetMenu: function () {\n\t\treturn this.$fhcApi.get(\n\t\t\t\"/api/frontend/v1/CisMenu/getMenu\",\n\t\t\t{}\n\t\t);\n\t}\n\n}","\nexport default {\n\tgetAuthUID() {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/api/frontend/v1/AuthInfo/getAuthUID',\n\t\t\t{ }\n\t\t);\n\t},\n\tgetAuthInfo() {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/api/frontend/v1/AuthInfo/getAuthInfo',\n\t\t\t{}\n\t\t);\n\t},\n};","/**\n * Copyright (C) 2024 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tgetAll() {\n\t\treturn this.$fhcApi.get('/api/frontend/v1/language/get');\n\t}\n};","/** TODO(chris):\n * when deleting this file be sure to\n * remove line 1 & 90 from ../plugins/Phrasen.js\n */\nimport FhcApiFactory from '../api/fhcapifactory.js';\n\n\nexport default {\n\tinstall: (app, options) => {\n\t\tif (app.config.globalProperties.$fhcApi) {\n\t\t\t/* Deprecated Code start */\n\t\t\tif (options?.factory) {\n\t\t\t\tconsole.warn(\"$fhcApi is DEPRECATED!\");\n\t\t\t\tapp.config.globalProperties.$fhcApi.factory.addEndpoints(options.factory);\n\t\t\t}\n\t\t\t/* Deprecated Code end */\n\t\t\treturn;\n\t\t}\n\n\t\tfunction _get_config(form, uri, data, config) {\n\t\t\tif (typeof form == 'string' && config === undefined) {\n\t\t\t\t[uri, data, config] = [form, uri, data];\n\t\t\t\tform = undefined;\n\t\t\t} else if (form) {\n\t\t\t\tif (typeof form != 'object')\n\t\t\t\t\tthrow new TypeError('Parameter 1 of _get_config must be an object or a string');\n\t\t\t\tif (uri === undefined && data === undefined && config === undefined) {\n\t\t\t\t\tconfig = form;\n\t\t\t\t\tform = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (form) {\n\t\t\t\t// NOTE(chris): check if form is fhc-form\n\t\t\t\tif (!form.clearValidation || !form.setFeedback)\n\t\t\t\t\tthrow new TypeError(\"'form' is not a Form Component\");\n\n\t\t\t\tform = {\n\t\t\t\t\tclearValidation: form.clearValidation,\n\t\t\t\t\tsetFeedback: form.setFeedback\n\t\t\t\t};\n\n\t\t\t\tif (config)\n\t\t\t\t\tconfig.form = form;\n\t\t\t\telse\n\t\t\t\t\tconfig = {form};\n\t\t\t}\n\n\t\t\treturn [uri, data, config];\n\t\t}\n\n\t\tfunction _clean_return_value(response) {\n\t\t\tconst result = response.data;\n\t\t\tdelete response.data;\n\t\t\tif (!result.meta)\n\t\t\t\tresult.meta = {response};\n\t\t\telse\n\t\t\t\tresult.meta.response = response;\n\t\t\treturn result;\n\t\t}\n\t\tconst baseURL = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + \"/\";\n\t\tconst fhcApiAxios = axios.create({\n\t\t\ttimeout: 500000,\n\t\t\tbaseURL: FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + \"/\"\n\t\t});\n\n\t\tfhcApiAxios.interceptors.request.use(config => {\n\t\t\tif (config.method != 'post' || !config.data)\n\t\t\t\treturn config;\n\n\t\t\tif (config.data instanceof FormData)\n\t\t\t\treturn config;\n\n\t\t\tif (!Object.values(config.data).every(item => {\n\t\t\t\tif (item instanceof FileList)\n\t\t\t\t\treturn false;\n\t\t\t\tif (Array.isArray(item))\n\t\t\t\t\treturn item.every(i => !(i instanceof File));\n\t\t\t\treturn true;\n\t\t\t})) {\n\t\t\t\tconst newData = Object.entries(config.data).reduce((nd, [key, item]) => {\n\t\t\t\t\tif (item instanceof FileList) {\n\t\t\t\t\t\tfor (const file of item)\n\t\t\t\t\t\t\tnd.FormData.append(key + (item.length > 1 ? '[]' : ''), file);\n\t\t\t\t\t} else if (Array.isArray(item)) {\n\t\t\t\t\t\tif (item.every(i => !(i instanceof File))) {\n\t\t\t\t\t\t\tnd.jsondata[key] = item;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\titem.forEach(file => nd.FormData.append(key + (item.length > 1 ? '[]' : ''), file));\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnd.jsondata[key] = item;\n\t\t\t\t\t}\n\t\t\t\t\treturn nd;\n\t\t\t\t}, {\n\t\t\t\t\tFormData: new FormData(),\n\t\t\t\t\tjsondata: {}\n\t\t\t\t});\n\t\t\t\tnewData.FormData.append('_jsondata', JSON.stringify(newData.jsondata));\n\t\t\t\tconfig.data = newData.FormData;\n\t\t\t}\n\n\t\t\treturn config;\n\t\t});\n\n\t\tfhcApiAxios.interceptors.response.use(response => {\n\t\t\tif (response.config?.errorHandling == 'off'\n\t\t\t\t|| response.config?.errorHandling === false\n\t\t\t\t|| response.config?.errorHandling == 'fail')\n\t\t\t\treturn _clean_return_value(response);\n\n\t\t\t// NOTE(chris): loop through errors\n\t\t\tif (response.data.errors)\n\t\t\t\tresponse.data.errors = response.data.errors.filter(\n\t\t\t\t\terr => (response.config[err.type + 'ErrorHandler'] || app.config.globalProperties.$fhcApi._defaultErrorHandlers[err.type])(err, response.config)\n\t\t\t\t);\n\n\t\t\treturn _clean_return_value(response);\n\t\t}, error => {\n\t\t\tif (error.code == 'ERR_CANCELED')\n\t\t\t\treturn Promise.reject({...{handled: true}, ...error});\n\n\t\t\tif (error.config?.errorHandling == 'off'\n\t\t\t\t|| error.config?.errorHandling === false\n\t\t\t\t|| error.config?.errorHandling == 'success')\n\t\t\t\treturn Promise.reject(error);\n\n\t\t\tif (error.response) {\n\t\t\t\tif (error.response.status == 404) {\n\t\t\t\t\tapp.config.globalProperties.$fhcAlert.alertDefault('error', error.message, error.request.responseURL, true);\n\t\t\t\t\treturn Promise.reject({...{handled: true}, ...error});\n\t\t\t\t}\n\n\t\t\t\t// NOTE(chris): loop through errors\n\t\t\t\terror.response.data.errors = error.response.data.errors.filter(\n\t\t\t\t\terr => (error.config[err.type + 'ErrorHandler'] || app.config.globalProperties.$fhcApi._defaultErrorHandlers[err.type])(err, error.config)\n\t\t\t\t);\n\t\t\t\tif (!error.response.data.errors.length)\n\t\t\t\t\treturn Promise.reject({...{handled: true}, ...error});\n\t\t\t} else if (error.request) {\n\t\t\t\tapp.config.globalProperties.$fhcAlert.alertDefault('error', error.message, error.request.responseURL);\n\t\t\t\treturn Promise.reject({...{handled: true}, ...error});\n\t\t\t} else {\n\t\t\t\tapp.config.globalProperties.$fhcAlert.alertError(error.message);\n\t\t\t\treturn Promise.reject({...{handled: true}, ...error});\n\t\t\t}\n\n\t\t\treturn Promise.reject(error);\n\t\t});\n\n\t\tapp.config.globalProperties.$fhcApi = {\n\t\t\tgetUri(url) {\n\t\t\t\tconsole.warn('$fhcApi.getUri is DEPRECATED! Use $api.getUri instead.');\n\t\t\t\treturn fhcApiAxios.getUri({url});\n\t\t\t},\n\t\t\tget(form, uri, params, config) {\n\t\t\t\tconsole.warn('$fhcApi.get is DEPRECATED! Use $api.get instead.');\n\t\t\t\t[uri, params, config] = _get_config(form, uri, params, config);\n\t\t\t\tif (params) {\n\t\t\t\t\tif (config)\n\t\t\t\t\t\tconfig.params = params;\n\t\t\t\t\telse\n\t\t\t\t\t\tconfig = {params};\n\t\t\t\t}\n\t\t\t\treturn fhcApiAxios.get(uri, config);\n\t\t\t},\n\t\t\tpost(form, uri, data, config) {\n\t\t\t\tconsole.warn('$fhcApi.post is DEPRECATED! Use $api.post instead.');\n\t\t\t\t[uri, data, config] = _get_config(form, uri, data, config);\n\t\t\t\treturn fhcApiAxios.post(uri, data, config);\n\t\t\t},\n\t\t\t_defaultErrorHandlers: {\n\t\t\t\tvalidation(error, config) {\n\t\t\t\t\tconst $fhcAlert = app.config.globalProperties.$fhcAlert;\n\n\t\t\t\t\tif (config?.form) {\n\t\t\t\t\t\tconfig.form.clearValidation();\n\t\t\t\t\t\tconfig.form.setFeedback(false, error.messages);\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (Array.isArray(error.messages)) {\n\t\t\t\t\t\terror.messages.forEach($fhcAlert.alertError);\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t} else if (typeof error.messages == 'object') {\n\t\t\t\t\t\tif (config?.errorHeader)\n\t\t\t\t\t\t\tObject.values(error.messages).forEach(\n\t\t\t\t\t\t\t\tvalue => $fhcAlert.alertDefault(\n\t\t\t\t\t\t\t\t\t'error',\n\t\t\t\t\t\t\t\t\tArray.isArray(config.errorHeader) ? app.config.globalProperties.$p.t.apply(null, config.errorHeader) : config.errorHeader,\n\t\t\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tObject.entries(error.messages).forEach(\n\t\t\t\t\t\t\t\t([key, value]) => $fhcAlert.alertDefault('error', key, value, true)\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\t\t\t\tgeneral(error, config) {\n\t\t\t\t\tconst $fhcAlert = app.config.globalProperties.$fhcAlert;\n\n\t\t\t\t\tif (config?.form)\n\t\t\t\t\t\tconfig.form.setFeedback(false, error.message);\n\t\t\t\t\telse if (config?.errorHeader)\n\t\t\t\t\t\t$fhcAlert.alertDefault(\n\t\t\t\t\t\t\t'error',\n\t\t\t\t\t\t\tArray.isArray(config.errorHeader) ? app.config.globalProperties.$p.t.apply(null, config.errorHeader) : config.errorHeader,\n\t\t\t\t\t\t\terror.message,\n\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t);\n\t\t\t\t\telse\n\t\t\t\t\t\t$fhcAlert.alertError(error.message);\n\t\t\t\t},\n\t\t\t\tphp(error) {\n\t\t\t\t\tconst $fhcAlert = app.config.globalProperties.$fhcAlert;\n\n\t\t\t\t\tvar message = '';\n\t\t\t\t\tmessage += 'Message: ' + error.message + '\\n\\n';\n\t\t\t\t\tmessage += 'Filename: ' + error.filename + '\\n';\n\t\t\t\t\tmessage += 'Line Number: ' + error.line + '\\n';\n\t\t\t\t\tif (error.backtrace && error.backtrace.length) {\n\t\t\t\t\t\tmessage += '\\nBacktrace: ';\n\t\t\t\t\t\terror.backtrace.forEach(err => {\n\t\t\t\t\t\t\tmessage += '\\n\\tFile: ' + err.file + '\\n';\n\t\t\t\t\t\t\tmessage += '\\tLine: ' + err.line + '\\n';\n\t\t\t\t\t\t\tmessage += '\\tFunction: ' + err.function + '\\n';\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tswitch (error.severity) {\n\t\t\t\t\t\tcase 'Warning':\n\t\t\t\t\t\tcase 'Core Warning':\n\t\t\t\t\t\tcase 'Compile Warning':\n\t\t\t\t\t\tcase 'User Warning':\n\t\t\t\t\t\t\t$fhcAlert.alertDefault('warn', 'PHP ' + error.severity, message, true);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'Notice':\n\t\t\t\t\t\tcase 'User Notice':\n\t\t\t\t\t\tcase 'Runtime Notice':\n\t\t\t\t\t\t\t$fhcAlert.alertDefault('info', 'PHP ' + error.severity, message, true);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tmessage = 'Type: PHP ' + error.severity + '\\n\\n' + message;\n\t\t\t\t\t\t\t$fhcAlert.alertSystemError(message);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\texception(error) {\n\t\t\t\t\tconst $fhcAlert = app.config.globalProperties.$fhcAlert;\n\n\t\t\t\t\tvar message = '';\n\t\t\t\t\tmessage += 'Type: ' + error.class + '\\n\\n';\n\t\t\t\t\tmessage += 'Message: ' + error.message + '\\n\\n';\n\t\t\t\t\tmessage += 'Filename: ' + error.filename + '\\n';\n\t\t\t\t\tmessage += 'Line Number: ' + error.line + '\\n';\n\t\t\t\t\tif (error.backtrace && error.backtrace.length) {\n\t\t\t\t\t\tmessage += '\\nBacktrace: ';\n\t\t\t\t\t\terror.backtrace.forEach(err => {\n\t\t\t\t\t\t\tmessage += '\\n\\tFile: ' + err.file + '\\n';\n\t\t\t\t\t\t\tmessage += '\\tLine: ' + err.line + '\\n';\n\t\t\t\t\t\t\tmessage += '\\tFunction: ' + err.function + '\\n';\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t$fhcAlert.alertSystemError(message);\n\t\t\t\t},\n\t\t\t\tdb(error) {\n\t\t\t\t\tconst $fhcAlert = app.config.globalProperties.$fhcAlert;\n\n\t\t\t\t\tvar message = '';\n\t\t\t\t\tif (error.heading !== undefined)\n\t\t\t\t\t\tmessage += error.heading + '\\n\\n';\n\t\t\t\t\tif (error.code !== undefined)\n\t\t\t\t\t\tmessage += 'Code: ' + error.code + '\\n\\n';\n\t\t\t\t\tif (error.sql !== undefined)\n\t\t\t\t\t\tmessage += 'SQL: ' + error.sql + '\\n\\n';\n\t\t\t\t\tif (error.message !== undefined)\n\t\t\t\t\t\tmessage += 'Message: ' + error.message + '\\n\\n';\n\t\t\t\t\telse if (error.messages !== undefined)\n\t\t\t\t\t\tmessage += 'Messages: ' + error.messages.join('\\n\\t') + '\\n\\n';\n\t\t\t\t\tif (error.filename !== undefined)\n\t\t\t\t\t\tmessage += 'Filename: ' + error.filename + '\\n';\n\t\t\t\t\tif (error.line !== undefined)\n\t\t\t\t\t\tmessage += 'Line Number: ' + error.line + '\\n';\n\n\t\t\t\t\t$fhcAlert.alertSystemError(message);\n\t\t\t\t},\n\t\t\t\tauth(error, config) {\n\t\t\t\t\tconst $fhcAlert = app.config.globalProperties.$fhcAlert;\n\n\t\t\t\t\tvar message = '';\n\t\t\t\t\tmessage += 'Controller name: ' + error.controller + '\\n';\n\t\t\t\t\tmessage += 'Method name: ' + error.method + '\\n';\n\t\t\t\t\tmessage += 'Required permissions: ' + error.required_permissions;\n\t\t\t\t\tif (config?.errorHeader)\n\t\t\t\t\t\t$fhcAlert.alertDefault(\n\t\t\t\t\t\t\t'error',\n\t\t\t\t\t\t\tArray.isArray(config.errorHeader) ? app.config.globalProperties.$p.t.apply(null, config.errorHeader) : config.errorHeader,\n\t\t\t\t\t\t\terror.message,\n\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t);\n\t\t\t\t\telse\n\t\t\t\t\t\t$fhcAlert.alertDefault('error', error.message, message);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t/* Deprecated Code start */\n\t\tclass FhcApiFactoryWrapper {\n\t\t\tconstructor(factorypart, root) {\n\t\t\t\tif (root === undefined) {\n\t\t\t\t\tthis.$fhcApi = {\n\t\t\t\t\t\tgetUri(url) {\n\t\t\t\t\t\t\tconsole.warn('$fhcApi.factory is DEPRECATED!');\n\t\t\t\t\t\t\treturn app.config.globalProperties.$fhcApi.getUri(url);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tget(form, uri, params, config) {\n\t\t\t\t\t\t\tconsole.warn('$fhcApi.factory is DEPRECATED!');\n\t\t\t\t\t\t\treturn app.config.globalProperties.$fhcApi.get(form, uri, params, config);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tpost(form, uri, data, config) {\n\t\t\t\t\t\t\tconsole.warn('$fhcApi.factory is DEPRECATED!');\n\t\t\t\t\t\t\treturn app.config.globalProperties.$fhcApi.post(form, uri, data, config);\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\tObject.defineProperty(this.$fhcApi, 'factory', {\n\t\t\t\t\t\tget() {\n\t\t\t\t\t\t\tconsole.warn('$fhcApi.factory is DEPRECATED!');\n\t\t\t\t\t\t\treturn app.config.globalProperties.$fhcApi.factory;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tapp.config.globalProperties.$fhcApi.factory = this;\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty(this, '$fhcApi', {\n\t\t\t\t\t\tget() {\n\t\t\t\t\t\t\treturn (root || this).$fhcApi;\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tthis.addEndpoints(factorypart, true)\n\t\t\t}\n\n\t\t\taddEndpoints(factorypart, noWarn) {\n\t\t\t\tObject.keys(factorypart).forEach(key => {\n\t\t\t\t\tObject.defineProperty(this, key, {\n\t\t\t\t\t\tget() {\n\t\t\t\t\t\t\tif (typeof factorypart[key] == 'function')\n\t\t\t\t\t\t\t\treturn factorypart[key].bind(this);\n\t\t\t\t\t\t\treturn new FhcApiFactoryWrapper(factorypart[key], this.$fhcApi.factory);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\tif (!noWarn) console.warn('$fhcApi.factory.addEndpoints() is DEPRECATED!');\n\t\t\t}\n\t\t}\n\n\t\tconst factory = new FhcApiFactoryWrapper(FhcApiFactory);\n\t\tif (options?.factory) {\n\t\t\tconsole.warn(\"$fhcApi is DEPRECATED!\");\n\t\t\tfactory.addEndpoints(options.factory);\n\t\t}\n\n\t\tapp.config.globalProperties.$fhcApi.factory = factory;\n\t\t/* Deprecated Code end */\n\t\t\n\t\tapp.provide('$fhcApi', app.config.globalProperties.$fhcApi);\n\t}\n};","/**\n * Copyright (C) 2022 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n//--------------------------------------------------------------------------------------------------------------------\n// Configs\n\n// To see debug messages into the browser console set this parameter as true\nconst CORE_REST_CLIENT_DEBUG = false;\n\n// Default timeout (milliseconds)\nconst CORE_REST_CLIENT_TIMEOUT = 5000;\n\n//--------------------------------------------------------------------------------------------------------------------\n// Constants\n\n// Success\nconst CORE_REST_CLIENT_SUCCESS = 0;\n\n// Properties present in a response\nconst CORE_REST_CLIENT_ERROR = \"error\";\nconst CORE_REST_CLIENT_RETVAL = \"retval\";\n\n// HTTP method parameters\nconst CRC_HTTP_GET_METHOD = \"get\";\nconst CRC_HTTP_POST_METHOD = \"post\";\n\n/**\n * Definition and initialization of the object CoreRESTClient\n */\nexport const CoreRESTClient = {\n\t//------------------------------------------------------------------------------------------------------------------\n\t// Public methods\n\n\t/**\n\t * Performs a call using the HTTP GET method\n\t * wsParameters is an object\n\t * axiosParameters is an object\n\t */\n\tget: function(wsURL, wsParameters, axiosParameters = null) {\n\t\treturn CoreRESTClient._axiosCall(wsURL, wsParameters, CRC_HTTP_GET_METHOD, axiosParameters);\n\t},\n\n\t/**\n\t * Performs a call using the HTTP POST method\n\t * wsParameters is an object\n\t * axiosParameters is an object\n\t */\n\tpost: function(wsURL, wsParameters, axiosParameters = null) {\n\t\treturn CoreRESTClient._axiosCall(wsURL, wsParameters, CRC_HTTP_POST_METHOD, axiosParameters);\n\t},\n\n\t/**\n\t * Checks if the response is a success\n\t */\n\tisSuccess: function(response) {\n\n\t\tif (typeof response === \"object\" && response.hasOwnProperty(CORE_REST_CLIENT_ERROR)\n\t\t\t&& response.hasOwnProperty(CORE_REST_CLIENT_RETVAL) && response.error == CORE_REST_CLIENT_SUCCESS)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t/**\n\t * Checks if the response is an error\n\t */\n\tisError: function(response) {\n\t\treturn !CoreRESTClient.isSuccess(response);\n\t},\n\n\t/**\n\t * Checks if the response has data\n\t */\n\thasData: function(response) {\n\n\t\tif (CoreRESTClient.isSuccess(response))\n\t\t{\n\t\t\tif ((typeof response[CORE_REST_CLIENT_RETVAL] === \"object\" && Object.keys(response[CORE_REST_CLIENT_RETVAL]).length > 0)\n\t\t\t\t|| (typeof response[CORE_REST_CLIENT_RETVAL] === \"array\" && response[CORE_REST_CLIENT_RETVAL].length > 0)\n\t\t\t\t|| (typeof response[CORE_REST_CLIENT_RETVAL] === \"string\" && response[CORE_REST_CLIENT_RETVAL].trim() != \"\")\n\t\t\t\t|| typeof response[CORE_REST_CLIENT_RETVAL] === \"number\")\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t/**\n\t * Retrives data from response object\n\t */\n\tgetData: function(response) {\n\n\t\tif (CoreRESTClient.hasData(response))\n\t\t{\n\t\t\treturn response[CORE_REST_CLIENT_RETVAL];\n\t\t}\n\n\t\treturn null;\n\t},\n\n\t/**\n\t * Retrives error message from response object\n\t */\n\tgetError: function(response) {\n\n\t\tif (typeof response === \"object\"\n\t\t\t&& Object.keys(response).length > 0\n\t\t\t&& response.hasOwnProperty(CORE_REST_CLIENT_RETVAL))\n\t\t{\n\t\t\treturn response[CORE_REST_CLIENT_RETVAL];\n\t\t}\n\n\t\treturn \"Generic error\";\n\t},\n\n\t/**\n\t * Retrives code from response object\n\t */\n\tgetErrorCode: function(response) {\n\n\t\tif (typeof response === \"object\" && response.hasOwnProperty(CORE_REST_CLIENT_ERROR))\n\t\t{\n\t\t\treturn response[CORE_REST_CLIENT_ERROR];\n\t\t}\n\n\t\treturn 1; // Generic error\n\t},\n\n\t//------------------------------------------------------------------------------------------------------------------\n\t// Private methods\n\n\t/**\n\t * Generate the router URI using the connection parameters\n\t */\n\t_generateRouterURI: function(wsURL) {\n\t\tvar uri = null;\n\n\t\t// Checks if global JS object FHC_JS_DATA_STORAGE_OBJECT exists\n\t\tif (typeof FHC_JS_DATA_STORAGE_OBJECT !== \"undefined\")\n\t\t{\n\t\t\turi = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + \"/\" + wsURL;\n\t\t}\n\n\t\treturn uri;\n\t},\n\n\t/**\n\t * Method to print debug info after a controller has been called\n\t */\n\t_printDebug: function(parameters, response, errorThrown) {\n\n\t\tif (CORE_REST_CLIENT_DEBUG === true) // If global const CORE_REST_CLIENT_DEBUG is true, but really true!\n\t\t{\n\t\t\t// Print info about called controller\n\t\t\tconsole.log(\"Called controller: \" + parameters.remoteController);\n\t\t\tconsole.log(\"Call parameters:\"); // parameters given to this call\n\t\t\tconsole.log(parameters);\n\n\t\t\tif (response != null) // if there is a response...\n\t\t\t{\n\t\t\t\tconsole.log(\"Controller Response:\");\n\t\t\t\tconsole.log(response); // ...print it\n\t\t\t}\n\t\t\tif (errorThrown != null) // if there is a jQuery error...\n\t\t\t{\n\t\t\t\tconsole.log(\"jQuery error:\");\n\t\t\t\tconsole.log(errorThrown); // ...print it\n\t\t\t}\n\t\t\tconsole.log(\"--------------------------------------------------------------------------------------------\");\n\t\t}\n\t},\n\n\t/**\n\t * Performs a call to the server were the CI PHP layer is running\n\t * - wsURL: alias of the core controller to call\n\t * - wsParameters: parameters to give to the called controller\n\t * - type: POST or GET HTTP method\n\t * - axiosParameters: an object to configure the axios call\n\t */\n\t_axiosCall: function(wsURL, wsParameters, type, axiosParameters) {\n\n\t\t// Axios config object\n\t\tlet axiosCallObj = {\n\t\t\tmethod: type,\n\t\t\turl: CoreRESTClient._generateRouterURI(wsURL),\n\t\t\ttimeout: CORE_REST_CLIENT_TIMEOUT // default time out\n\t\t};\n\n\t\t// The ajax call is HTTP GET\n\t\tif (type == CRC_HTTP_GET_METHOD)\n\t\t{\n\t\t\taxiosCallObj.params = wsParameters;\n\t\t}\n\t\t// The ajax call is HTTP POST\n\t\telse\n\t\t{\n\t\t\taxiosCallObj.data = wsParameters;\n\t\t}\n\n\t\t// Check if axiosParameters is an object\n\t\tif (typeof axiosParameters === \"object\")\n\t\t{\n\t\t\t// And then copies the its properties into axiosCallObj\n\t\t\tfor (var prop in axiosParameters) axiosCallObj[prop] = axiosParameters[prop];\n\t\t}\n\n\t\t// Perform the ajax call via axios\n\t\treturn axios(axiosCallObj);\n\t}\n};\n\n","/**\n * Copyright (C) 2022 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n * \n * @usage:\n * Preperations:\n * Be sure to have PrimeVue loaded with the toast and confirmdialog\n * components as primevue variable\n * Install:\n * Import this Plugin and install it with the app.use() function.\n * Use:\n * In your component you can call now the global property $fhcAlert\n * which has the following functions:\n * \n * alertSuccess\n * ------------\n * Displays a success message\n * @param string\tmessage\n * @return void\n * \n * alertInfo\n * ---------\n * Displays an info message\n * @param string\tmessage\n * @return void\n * \n * alertWarning\n * ------------\n * Displays a warning\n * @param string\tmessage\n * @return void\n * \n * alertError\n * ----------\n * Displays an error\n * @param string\tmessage\n * @return void\n * \n * alertSystemError\n * ----------------\n * Displays an alert with the error details and a button to mail\n * the error to the Support Team\n * @param string\tmessage\n * @return void\n * \n * confirmDelete\n * -------------\n * Displays a confirmation dialog and returns a Promise which resolves\n * with true or false depending und the pressed button.\n * @return Promise\n * \n * alertDefault\n * ------------\n * Displays an alert\n * @param string\tseverity\t\tcan be 'success', 'info', 'warning', 'error'\n * @param string\ttitle\n * @param string\tmessage\n * @param boolean\tsticky\t\t\t(optional) defaults to false\n * @return void\n * \n * alertMultiple\n * -------------\n * Displays multiple alerts\n * @param array\t\tmessageArray\n * @param string\tseverity\t\t(optional) defaults to 'info'\n * @param string\ttitle\t\t\t(optional) defaults to 'Info'\n * @param boolean\tsticky\t\t\t(optional) defaults to false\n * @return void\n * \n * handleSystemError\n * -----------------\n * Automatiticly determine how to display an system error and display it.\n * This would be used in a catch block of an ajax call.\n * @param mixed\t\terror\n * @return void\n * \n * handleSystemMessage\n * -------------------\n * Automatiticly determine how to display a message and display it.\n * @param mixed\t\tmessage\n * @return void\n */\nimport PvConfig from \"../../../index.ci.php/public/js/components/primevue/config/config.esm.min.js\";\nimport PvToast from \"../../../index.ci.php/public/js/components/primevue/toast/toast.esm.min.js\";\nimport PvConfirm from \"../../../index.ci.php/public/js/components/primevue/confirmdialog/confirmdialog.esm.min.js\";\nimport PvConfirmationService from \"../../../index.ci.php/public/js/components/primevue/confirmationservice/confirmationservice.esm.min.js\";\nimport FhcPhrasen from \"./Phrasen.js\";\n\nimport {CoreRESTClient} from '../RESTClient.js';\n\nconst helperAppContainer = document.createElement('div');\n\nconst helperApp = Vue.createApp({\n\tname: \"FhcAlertApp\",\n\tcomponents: {\n\t\tPvToast,\n\t\tPvConfirm\n\t},\n\tmethods: {\n\t\tmailToUrl(slotProps) {\n\t\t\tlet mailTo = FHC_JS_DATA_STORAGE_OBJECT.systemerror_mailto;\n\t\t\tlet subject = 'Meldung%20Systemfehler';\n\t\t\tlet body = `\n\t\t\t\tDanke, dass Sie uns den Fehler melden. %0D%0A %0D%0A\n\t\t\t\tBitte beschreiben Sie uns ausführlich das Problem.%0D%0A\n\t\t\t\tBsp: Ich habe X ausgewählt und Y angelegt. Beim Speichern erhielt ich die Fehlermeldung. [Optional: Ich habe den Browser Z verwendet.]%0D%0A\n\t\t\t\t-----------------------------------------------------------------------------------------------------------------------------------%0D%0A\n\t\t\t\tPROBLEM: ... %0D%0A %0D%0A %0D%0A\n\n\t\t\t\t-----------------------------------------------------------------------------------------------------------------------------------%0D%0A\n\t\t\t\tFehler URL: ` + FHC_JS_DATA_STORAGE_OBJECT.called_path + '/' + FHC_JS_DATA_STORAGE_OBJECT.called_method + `%0D%0A\n\t\t\t\tFehler Meldung: ` + slotProps.message.detail + `%0D%0A\n\t\t\t\t-----------------------------------------------------------------------------------------------------------------------------------%0D%0A %0D%0A\n\t\t\t\tWir kümmern uns um eine rasche Behebung des Problems!`\n\n\t\t\treturn \"mailto:\" + mailTo + \"?subject=\" + subject + \"&body=\" + body;\n\t\t},\n\t\topenMessagecard(e) {\n\t\t\tbootstrap.Collapse.getOrCreateInstance(e.target.getAttribute('href')).toggle();\n\t\t}\n\t},\n\tunmounted() {\n\t\thelperAppContainer.parentElement.removeChild(helperAppContainer);\n\t},\n\tcomputed: {\n\t\tshowmaillink: function() {\n\t\t\treturn FHC_JS_DATA_STORAGE_OBJECT.systemerror_mailto !== '';\n\t\t}\n\t},\n\ttemplate: /* html */`\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t`\n});\n\nhelperApp.use(PvConfig);\nhelperApp.use(PvConfirmationService);\n//helperApp.use(FhcPhrasen);\n\nconst helperAppInstance = helperApp.mount(helperAppContainer);\n\ndocument.body.appendChild(helperAppContainer);\n\n\nexport default {\n\tinstall: (app, options) => {\n\t\tif (!app.config.globalProperties.$p)\n\t\t\tapp.use(FhcPhrasen);\n\n\t\tconst $fhcAlert = {\n\t\t\talertSuccess(message) {\n\t\t\t\tif (Array.isArray(message))\n\t\t\t\t\treturn message.forEach(this.alertSuccess);\n\t\t\t\thelperAppInstance.$refs.toast.add({ severity: 'success', summary: 'Info', detail: message, life: 1000});\n\t\t\t},\n\t\t\talertInfo(message) {\n\t\t\t\tif (Array.isArray(message))\n\t\t\t\t\treturn message.forEach(this.alertInfo);\n\t\t\t\thelperAppInstance.$refs.toast.add({ severity: 'info', summary: 'Info', detail: message, life: 3000 });\n\t\t\t},\n\t\t\talertWarning(message) {\n\t\t\t\tif (Array.isArray(message))\n\t\t\t\t\treturn message.forEach(this.alertWarning);\n\t\t\t\thelperAppInstance.$refs.toast.add({ severity: 'warn', summary: 'Achtung', detail: message});\n\t\t\t},\n\t\t\talertError(message) {\n\t\t\t\tif (Array.isArray(message))\n\t\t\t\t\treturn message.forEach(this.alertError);\n\t\t\t\thelperAppInstance.$refs.toast.add({ severity: 'error', summary: 'Achtung', detail: message });\n\t\t\t},\n\t\t\talertSystemError(message) {\n\t\t\t\t//TODO(Manu) for translation of content of template: restructure in data\n\t\t\t\t//and update definitions with translations\n\n\t\t\t\tif (Array.isArray(message))\n\t\t\t\t\treturn message.forEach(this.alertSystemError);\n\t\t\t\thelperAppInstance.$refs.alert.add({\n\t\t\t\t\tseverity: 'error',\n\t\t\t\t\tsummary: Vue.computed(() => app.config.globalProperties.$p.t('alert/systemerror')),\n\t\t\t\t\tdetail: message});\n\t\t\t},\n\t\t\tconfirmDelete() {\n\t\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\t\thelperAppInstance.$confirm.require({\n\t\t\t\t\t\tgroup: 'fhcAlertConfirm',\n\t\t\t\t\t\theader: Vue.computed(() => app.config.globalProperties.$p.t('alert/attention')),\n\t\t\t\t\t\tmessage: Vue.computed(() => app.config.globalProperties.$p.t('alert/confirm_delete')),\n\t\t\t\t\t\tacceptLabel: Vue.computed(() => app.config.globalProperties.$p.t('ui/loeschen')),\n\t\t\t\t\t\tacceptClass: 'p-button-danger',\n\t\t\t\t\t\trejectLabel: Vue.computed(() => app.config.globalProperties.$p.t('ui/abbrechen')),\n\t\t\t\t\t\trejectClass: 'p-button-secondary',\n\t\t\t\t\t\taccept() {\n\t\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t\t},\n\t\t\t\t\t\treject() {\n\t\t\t\t\t\t\tresolve(false);\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t},\n\t\t\tconfirm(options) {\n\t\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\t\thelperAppInstance.$confirm.require({\n\t\t\t\t\t\tgroup: options?.group ?? 'fhcAlertConfirm',\n\t\t\t\t\t\theader: options?.header ?? Vue.computed(() => app.config.globalProperties.$p.t('alert/attention')),\n\t\t\t\t\t\tmessage: options?.message ?? '',\n\t\t\t\t\t\tacceptLabel: options?.acceptLabel ?? 'Ok',\n\t\t\t\t\t\tacceptClass: options?.acceptClass ?? 'btn btn-primary',\n\t\t\t\t\t\trejectLabel: options?.rejectLabel ?? Vue.computed(() => app.config.globalProperties.$p.t('ui/abbrechen')),\n\t\t\t\t\t\trejectClass: options?.rejectClass ?? 'btn btn-outline-secondary',\n\t\t\t\t\t\taccept() {\n\t\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t\t},\n\t\t\t\t\t\treject() {\n\t\t\t\t\t\t\tresolve(false);\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t},\n\t\t\talertDefault(severity, title, message, sticky = false, html = false) {\n\t\t\t\tlet options = { severity: severity, summary: title, detail: message, html };\n\t\t\t\t\n\t\t\t\tif (!sticky)\n\t\t\t\t\toptions.life = 3000;\n\n\t\t\t\thelperAppInstance.$refs.toast.add(options);\n\t\t\t},\n\t\t\talertMultiple(messageArray, severity = 'info', title = 'Info', sticky = false, html = false){\n\t\t\t\t// Check, if array has only string values\n\t\t\t\tif (messageArray.every(message => typeof message === 'string')) {\n\t\t\t\t\tmessageArray.forEach(message => this.alertDefault(severity, title, message, sticky, html));\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\thandleSystemError(error) {\n\t\t\t\t// don't show an error message to the user if the error was an aborted request\n\t\t\t\tif(error.hasOwnProperty('name') && error.name.toLowerCase() === \"AbortError\".toLowerCase())\n\t\t\t\t\treturn;\n\t\t\t\t\n\t\t\t\t// Error is string\n\t\t\t\tif (typeof error === 'string')\n\t\t\t\t\treturn $fhcAlert.alertSystemError(error);\n\n\t\t\t\t// Error is array of strings\n\t\t\t\tif (Array.isArray(error) && error.every(err => typeof err === 'string'))\n\t\t\t\t\treturn error.every($fhcAlert.alertSystemError);\n\n\t\t\t\t// Error has been handled already\n\t\t\t\tif (error.hasOwnProperty('handled') && error.handled)\n\t\t\t\t\treturn;\n\t\t\t\t\n\t\t\t\t// Error is object\n\t\t\t\tif (typeof error === 'object' && error !== null) {\n\t\t\t\t\tlet errMsg = '';\n\n\n\t\t\t\t\tif (error.hasOwnProperty('response') && error.response?.data?.retval)\n\t\t\t\t\t\terrMsg += 'Error Message: ' + (error.response.data.retval.message || error.response.data.retval) + '\\r\\n';\n\t\t\t\t\telse if (error.hasOwnProperty('message'))\n\t\t\t\t\t\terrMsg += 'Error Message: ' + error.message.toUpperCase() + '\\r\\n';\n\n\t\t\t\t\tif (error.hasOwnProperty('config') && error.config.hasOwnProperty('url'))\n\t\t\t\t\t\terrMsg += 'Error ConfigURL: ' + error.config.url + '\\r\\n';\n\n\t\t\t\t\tif (error.hasOwnProperty('stack'))\n\t\t\t\t\t\terrMsg += 'Error Stack: ' + error.stack + '\\r\\n';\n\t\t\t\t\t\n\t\t\t\t\t// Fallback object error message\n\t\t\t\t\tif (errMsg == '')\n\t\t\t\t\t\terrMsg = 'Error Message: ' + JSON.stringify(error) + '\\r\\n';\n\n\t\t\t\t\terrMsg += 'Error Controller Path: ' + FHC_JS_DATA_STORAGE_OBJECT.called_path + '/' + FHC_JS_DATA_STORAGE_OBJECT.called_method;\n\n\t\t\t\t\treturn $fhcAlert.alertSystemError(errMsg);\n\t\t\t\t}\n\n\t\t\t\t// Fallback\n\t\t\t\t$fhcAlert.alertSystemError('alertSystemError throws Generic Error\\r\\nError Controller Path: ' + FHC_JS_DATA_STORAGE_OBJECT.called_path + '/' + FHC_JS_DATA_STORAGE_OBJECT.called_method);\n\t\t\t},\n\t\t\thandleSystemMessage(message) {\n\t\t\t\t// Message is string\n\t\t\t\tif (typeof message === 'string')\n\t\t\t\t\treturn $fhcAlert.alertWarning(message);\n\n\t\t\t\t// Message is array of strings\n\t\t\t\tif (Array.isArray(message)) {\n\t\t\t\t\t// If Array has only Strings\n\t\t\t\t\tif (message.every(msg => typeof msg === 'string'))\n\t\t\t\t\t\treturn message.every($fhcAlert.alertWarning);\n\n\t\t\t\t\t// If Array has only Objects\n\t\t\t\t\tif (message.every(msg => typeof msg === 'object') && msg !== null) {\n\t\t\t\t\t\treturn message.every(msg => {\n\t\t\t\t\t\t\tif (msg.hasOwnProperty('data') && msg.data.hasOwnProperty('retval')) {\n\t\t\t\t\t\t\t\t$fhcAlert.alertWarning(JSON.stringify(msg.data.retval));\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t$fhcAlert.alertSystemError(JSON.stringify(msg));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Message is Object with data property\n\t\t\t\tif (typeof message === 'object' && message !== null){\n\t\t\t\t\tif (message.hasOwnProperty('data') && message.data.hasOwnProperty('retval')) {\n\t\t\t\t\t\t// NOTE(chris): changed: alertSystemError => alertWarning\n\t\t\t\t\t\t$fhcAlert.alertWarning(JSON.stringify(message.data.retval));\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$fhcAlert.alertSystemError(JSON.stringify(message));\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Fallback\n\t\t\t\t$fhcAlert.alertSystemError('alertSystemError throws Generic Error\\r\\nError Controller Path: ' + FHC_JS_DATA_STORAGE_OBJECT.called_path + '/' + FHC_JS_DATA_STORAGE_OBJECT.called_method);\n\t\t\t},\n\t\t\tresetFormValidation(form) {\n\t\t\t\tconst event = new Event('fhc-form-reset');\n\t\t\t\tform.querySelectorAll(['[data-fhc-form-validate],[data-fhc-form-error]']).forEach(el => el.dispatchEvent(event));\n\t\t\t\t/*const alert = form.querySelector('div.alert.alert-danger[role=\"alert\"]');\n\t\t\t\tif (alert) {\n\t\t\t\t\talert.innerHTML = '';\n\t\t\t\t\talert.classList.add('d-none');\n\t\t\t\t}\n\t\t\t\tform.querySelectorAll('.invalid-feedback').forEach(n => n.remove());\n\t\t\t\tform.querySelectorAll('.is-invalid').forEach(n => n.classList.remove('is-invalid'));\n\t\t\t\tform.querySelectorAll('.is-valid').forEach(n => n.classList.remove('is-valid'));*/\n\t\t\t},\n\t\t\thandleFormValidation(error, form) {\n\t\t\t\tif (form === undefined) {\n\t\t\t\t\tif (error && error.nodeType === Node.ELEMENT_NODE)\n\t\t\t\t\t\treturn err => $fhcAlert.handleFormValidation(err, error);\n\t\t\t\t} else {\n\t\t\t\t\tif (error?.response?.status == 400) {\n\t\t\t\t\t\tlet errors = CoreRESTClient.getError(error.response.data);\n\t\t\t\t\t\tif (typeof errors !== \"object\")\n\t\t\t\t\t\t\terrors = error.response.data;\n\n\t\t\t\t\t\t// NOTE(chris): reset form validation\n\t\t\t\t\t\t$fhcAlert.resetFormValidation(form);\n\t\t\t\t\t\t\n\t\t\t\t\t\t// NOTE(chris): set form input validation\n\t\t\t\t\t\tconst notFound = Object.entries(errors).filter(([key, detail]) => {\n\t\t\t\t\t\t\tconst input = form.querySelector('[data-fhc-form-validate=\"' + key + '\"]');\n\t\t\t\t\t\t\tif (!input)\n\t\t\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t\t\tinput.dispatchEvent(new CustomEvent('fhc-form-invalidate', {detail}));\n\n\t\t\t\t\t\t\t/*const input = form.querySelector('[name=\"' + key + '\"]');\n\t\t\t\t\t\t\tif (!input)\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\tinput.classList.add('is-invalid');\n\t\t\t\t\t\t\tconst feedback = document.createElement('div');\n\t\t\t\t\t\t\tfeedback.classList.add('invalid-feedback');\n\t\t\t\t\t\t\tfeedback.innerHTML = detail;\n\t\t\t\t\t\t\tinput.after(feedback);*/\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}).map(arr => arr[1]);\n\n\n\t\t\t\t\t\t//const alert = form.querySelector('div.alert.alert-danger[role=\"alert\"]');\n\t\t\t\t\t\tconst alert = form.querySelector('[data-fhc-form-error]');\n\t\t\t\t\t\tif (alert && notFound.length) {\n\t\t\t\t\t\t\talert.dispatchEvent(new CustomEvent('fhc-form-error', {detail: notFound}));\n\t\t\t\t\t\t\t/*notFound.forEach(txt => {\n\t\t\t\t\t\t\t\tconst p = document.createElement('p');\n\t\t\t\t\t\t\t\tp.innerHTML = txt;\n\t\t\t\t\t\t\t\talert.append(p);\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tif (notFound.length) {\n\t\t\t\t\t\t\t\talert.lastChild.classList.add('mb-0');\n\t\t\t\t\t\t\t\talert.classList.remove('d-none');\n\t\t\t\t\t\t\t}*/\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnotFound.forEach($fhcAlert.alertError);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (error?.response?.status == 400) {\n\t\t\t\t\tlet errors = CoreRESTClient.getError(error.response.data);\n\t\t\t\t\t$fhcAlert.alertError((typeof errors === 'object') ? Object.values(errors) : errors);\n\t\t\t\t} else {\n\t\t\t\t\t$fhcAlert.handleSystemError(error);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tapp.config.globalProperties.$fhcAlert = $fhcAlert;\n\t\tapp.provide('$fhcAlert', app.config.globalProperties.$fhcAlert);\n\t}\n}","import FhcAlert from './FhcAlert.js';\n\n\nexport default {\n\tinstall: (app, options) => {\n\t\tif (app.config.globalProperties.$api) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!app.config.globalProperties.$fhcAlert)\n\t\t\tapp.use(FhcAlert);\n\n\t\tfunction _send_array_or_object(errors, func) {\n\t\t\tif (Array.isArray(errors))\n\t\t\t\terrors.forEach(func);\n\t\t\telse\n\t\t\t\tObject.entries(errors).forEach(\n\t\t\t\t\t([title, errs]) => errs.forEach(\n\t\t\t\t\t\terror => func(error, title)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t}\n\t\tlet DEFAULT_ERROR_CONFIG = {\n\t\t\tsuccess: true,\n\t\t\tfail: true,\n\t\t\tcombine: {\n\t\t\t\tform: ['validation', 'general'],\n\t\t\t\ttoast: ['validation', 'general', 'not_found', 'site_failed']\n\t\t\t},\n\t\t\thandler: {\n\t\t\t\tform(form, errors) {\n\t\t\t\t\tform.clearValidation();\n\t\t\t\t\terrors.forEach(err => form.setFeedback(\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\terr.messages || err.message\n\t\t\t\t\t));\n\t\t\t\t},\n\t\t\t\tasync toast(errors) {\n\t\t\t\t\tconst $p = app.config.globalProperties.$p;\n\t\t\t\t\tif (!$p)\n\t\t\t\t\t\treturn Promise.reject('Phrasen plugin not loaded!');\n\t\t\t\t\n\t\t\t\t\tasync function _format_toast(errors) {\n\t\t\t\t\t\terrors = errors.reduce((result, err) => {\n\t\t\t\t\t\t\tswitch (err.type) {\n\t\t\t\t\t\t\tcase 'not_found':\n\t\t\t\t\t\t\tcase 'site_failed':\n\t\t\t\t\t\t\t\tif (err.message)\n\t\t\t\t\t\t\t\t\tresult[err.message] = [err.url];\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tresult._default = [err.url];\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'general':\n\t\t\t\t\t\t\t\tif (!result._default)\n\t\t\t\t\t\t\t\t\tresult._default = [];\n\t\t\t\t\t\t\t\tresult._default.push(err.message);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'validation':\n\t\t\t\t\t\t\t\tObject.entries(err.messages)\n\t\t\t\t\t\t\t\t\t.forEach(([field, msg]) => {\n\t\t\t\t\t\t\t\t\t\tif (!result[field])\n\t\t\t\t\t\t\t\t\t\t\tresult[field] = [];\n\t\t\t\t\t\t\t\t\t\tif (Array.isArray(msg))\n\t\t\t\t\t\t\t\t\t\t\tresult[field].push(...msg);\n\t\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\t\tresult[field].push(msg);\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t}, {});\n\t\t\t\t\t\tlet counter = 0;\n\t\t\t\t\t\tconst msgs = await Promise.all(Object.entries(errors)\n\t\t\t\t\t\t\t.sort((a, b) => ['_default'].indexOf(b[0]) - ['_default'].indexOf(a[0])) // sort _default first\n\t\t\t\t\t\t\t.map(async ([field, msgs]) => {\n\t\t\t\t\t\t\t\tif (field == '_default') {\n\t\t\t\t\t\t\t\t\tawait $p.loadCategory('dashboard');\n\t\t\t\t\t\t\t\t\tconst general = $p.t('dashboard/general');\n\t\t\t\t\t\t\t\t\tfield = '
    ' + general + '
    ';\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tfield = '
    ' + field + '
    ';\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tcounter += msgs.length;\n\t\t\t\t\t\t\t\treturn field\n\t\t\t\t\t\t\t\t\t+ '
    '\n\t\t\t\t\t\t\t\t\t+ msgs.join('
    ')\n\t\t\t\t\t\t\t\t\t+ '
    ';\n\t\t\t\t\t\t\t}));\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcounter,\n\t\t\t\t\t\t\tmsgs\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlet counter, msgs;\n\t\t\t\t\tif (Array.isArray(errors)) {\n\t\t\t\t\t\t({ counter, msgs } = await _format_toast(errors));\n\t\t\t\t\t} else {\n\t\t\t\t\t\t({ counter, msgs } = await Object.entries(errors)\n\t\t\t\t\t\t\t.reduce(async (res, [title, errs]) => {\n\t\t\t\t\t\t\t\tconst result = await res;\n\t\t\t\t\t\t\t\tconst { counter, msgs } = await _format_toast(errs);\n\t\t\t\t\t\t\t\tresult.counter += counter;\n\t\t\t\t\t\t\t\tresult.msgs.push('
    '\n\t\t\t\t\t\t\t\t\t+ title\n\t\t\t\t\t\t\t\t\t+ '
    '\n\t\t\t\t\t\t\t\t\t+ msgs.join('')\n\t\t\t\t\t\t\t\t\t+ '
    ');\n\t\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t\t}, Promise.resolve({ counter: 0, msgs: []})));\n\t\t\t\t\t}\n\n\t\t\t\t\tawait $p.loadCategory('ui');\n\t\t\t\t\tconst n_errors = $p.t('ui/n_errors', { n: counter });\n\n\t\t\t\t\tapp.config.globalProperties.$fhcAlert.alertDefault(\n\t\t\t\t\t\t'error',\n\t\t\t\t\t\tn_errors,\n\t\t\t\t\t\t'
    ' + msgs.join('') + '
    ',\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\tphp(errors) {\n\t\t\t\t\t_send_array_or_object(errors, (error, title) => {\n\t\t\t\t\t\tvar message = '';\n\t\t\t\t\t\tmessage += 'Message: ' + error.message + '\\n\\n';\n\t\t\t\t\t\tmessage += 'Filename: ' + error.filename + '\\n';\n\t\t\t\t\t\tmessage += 'Line Number: ' + error.line + '\\n';\n\t\t\t\t\t\tif (error.backtrace && error.backtrace.length) {\n\t\t\t\t\t\t\tmessage += '\\nBacktrace: ';\n\t\t\t\t\t\t\terror.backtrace.forEach(err => {\n\t\t\t\t\t\t\t\tmessage += '\\n\\tFile: ' + err.file + '\\n';\n\t\t\t\t\t\t\t\tmessage += '\\tLine: ' + err.line + '\\n';\n\t\t\t\t\t\t\t\tmessage += '\\tFunction: ' + err.function + '\\n';\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tswitch (error.severity) {\n\t\t\t\t\t\t\tcase 'Warning':\n\t\t\t\t\t\t\tcase 'Core Warning':\n\t\t\t\t\t\t\tcase 'Compile Warning':\n\t\t\t\t\t\t\tcase 'User Warning':\n\t\t\t\t\t\t\t\tif (title)\n\t\t\t\t\t\t\t\t\ttitle += ': PHP ' + error.severity;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\ttitle = 'PHP ' + error.severity;\n\t\t\t\t\t\t\t\tapp.config.globalProperties.$fhcAlert.alertDefault('warn', title, message, true);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'Notice':\n\t\t\t\t\t\t\tcase 'User Notice':\n\t\t\t\t\t\t\tcase 'Runtime Notice':\n\t\t\t\t\t\t\t\tif (title)\n\t\t\t\t\t\t\t\t\ttitle += ': PHP ' + error.severity;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\ttitle = 'PHP ' + error.severity;\n\t\t\t\t\t\t\t\tapp.config.globalProperties.$fhcAlert.alertDefault('info', title, message, true);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tmessage = 'Type: PHP ' + error.severity + '\\n\\n' + message;\n\t\t\t\t\t\t\t\tif (title)\n\t\t\t\t\t\t\t\t\tmessage = title + '\\n\\n' + message;\n\t\t\t\t\t\t\t\tapp.config.globalProperties.$fhcAlert.alertSystemError(message);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\texception(errors) {\n\t\t\t\t\t_send_array_or_object(errors, (error, title) => {\n\t\t\t\t\t\tvar message = '';\n\t\t\t\t\t\tif (title)\n\t\t\t\t\t\t\tmessage += title + '\\n\\n';\n\t\t\t\t\t\tmessage += 'Type: ' + error.class + '\\n\\n';\n\t\t\t\t\t\tmessage += 'Message: ' + error.message + '\\n\\n';\n\t\t\t\t\t\tmessage += 'Filename: ' + error.filename + '\\n';\n\t\t\t\t\t\tmessage += 'Line Number: ' + error.line + '\\n';\n\t\t\t\t\t\tif (error.backtrace && error.backtrace.length) {\n\t\t\t\t\t\t\tmessage += '\\nBacktrace: ';\n\t\t\t\t\t\t\terror.backtrace.forEach(err => {\n\t\t\t\t\t\t\t\tmessage += '\\n\\tFile: ' + err.file + '\\n';\n\t\t\t\t\t\t\t\tmessage += '\\tLine: ' + err.line + '\\n';\n\t\t\t\t\t\t\t\tmessage += '\\tFunction: ' + err.function + '\\n';\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tapp.config.globalProperties.$fhcAlert.alertSystemError(message);\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tdb(errors) {\n\t\t\t\t\t_send_array_or_object(errors, (error, title) => {\n\t\t\t\t\t\tvar message = '';\n\t\t\t\t\t\tif (title)\n\t\t\t\t\t\t\tmessage += title + '\\n\\n';\n\t\t\t\t\t\tif (error.heading !== undefined)\n\t\t\t\t\t\t\tmessage += error.heading + '\\n\\n';\n\t\t\t\t\t\tif (error.code !== undefined)\n\t\t\t\t\t\t\tmessage += 'Code: ' + error.code + '\\n\\n';\n\t\t\t\t\t\tif (error.sql !== undefined)\n\t\t\t\t\t\t\tmessage += 'SQL: ' + error.sql + '\\n\\n';\n\t\t\t\t\t\tif (error.message !== undefined)\n\t\t\t\t\t\t\tmessage += 'Message: ' + error.message + '\\n\\n';\n\t\t\t\t\t\telse if (error.messages !== undefined)\n\t\t\t\t\t\t\tmessage += 'Messages: ' + error.messages.join('\\n\\t') + '\\n\\n';\n\t\t\t\t\t\tif (error.filename !== undefined)\n\t\t\t\t\t\t\tmessage += 'Filename: ' + error.filename + '\\n';\n\t\t\t\t\t\tif (error.line !== undefined)\n\t\t\t\t\t\t\tmessage += 'Line Number: ' + error.line + '\\n';\n\n\t\t\t\t\t\tapp.config.globalProperties.$fhcAlert.alertSystemError(message);\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tauth(errors) {\n\t\t\t\t\t_send_array_or_object(errors, (error, title) => {\n\t\t\t\t\t\tif (title)\n\t\t\t\t\t\t\ttitle += ': ' + error.message;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\ttitle = error.message;\n\n\t\t\t\t\t\tvar message = '';\n\t\t\t\t\t\tmessage += 'Controller name: ' + error.controller + '\\n';\n\t\t\t\t\t\tmessage += 'Method name: ' + error.method + '\\n';\n\t\t\t\t\t\tmessage += 'Required permissions: ' + error.required_permissions;\n\n\t\t\t\t\t\tapp.config.globalProperties.$fhcAlert.alertDefault(\n\t\t\t\t\t\t\t'error',\n\t\t\t\t\t\t\ttitle,\n\t\t\t\t\t\t\tmessage,\n\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tif (options?.errorHandling !== undefined)\n\t\t\tDEFAULT_ERROR_CONFIG = _merge_error_config(options.errorHandling);\n\t\t\n\t\tfunction get_config(form, uri, data, config) {\n\t\t\tif (typeof form == 'string' && config === undefined) {\n\t\t\t\t[uri, data, config] = [form, uri, data];\n\t\t\t\tform = undefined;\n\t\t\t} else if (form) {\n\t\t\t\tif (typeof form != 'object')\n\t\t\t\t\tthrow new TypeError('Parameter 1 of _get_config must be an object or a string');\n\t\t\t\tif (uri === undefined && data === undefined && config === undefined) {\n\t\t\t\t\tconfig = form;\n\t\t\t\t\tform = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (form) {\n\t\t\t\t// NOTE(chris): check if form is fhc-form\n\t\t\t\tif (!form.clearValidation || !form.setFeedback)\n\t\t\t\t\tthrow new TypeError(\"'form' is not a Form Component\");\n\n\t\t\t\tform = {\n\t\t\t\t\tclearValidation: form.clearValidation,\n\t\t\t\t\tsetFeedback: form.setFeedback\n\t\t\t\t};\n\n\t\t\t\tif (config)\n\t\t\t\t\tconfig.form = form;\n\t\t\t\telse\n\t\t\t\t\tconfig = {form};\n\t\t\t}\n\n\t\t\treturn [uri, data, config];\n\t\t}\n\t\tfunction clean_return_value(response) {\n\t\t\tif (typeof response.data === 'string' || response.data instanceof String)\n\t\t\t\treturn clean_return_value({ data: response });\n\n\t\t\tconst result = response.data;\n\t\t\tdelete response.data;\n\t\t\tif (!result)\n\t\t\t\treturn {meta: {response}, data: null};\n\t\t\tif (!result.meta)\n\t\t\t\tresult.meta = { response };\n\t\t\telse\n\t\t\t\tresult.meta.response = response;\n\t\t\treturn result;\n\t\t}\n\t\tfunction _merge_error_config(config) {\n\t\t\tif (config === false || config === 'off')\n\t\t\t\treturn { ...DEFAULT_ERROR_CONFIG, success: false, fail: false };\n\t\t\t\n\t\t\tif (!config || config === true)\n\t\t\t\treturn { ...DEFAULT_ERROR_CONFIG };\n\n\t\t\tif (config === 'success')\n\t\t\t\treturn { ...DEFAULT_ERROR_CONFIG, fail: false };\n\t\t\t\n\t\t\tif (config === 'fail')\n\t\t\t\treturn { ...DEFAULT_ERROR_CONFIG, success: false };\n\t\t\t\n\t\t\tconst { success, fail, handler, combine } = config;\n\t\t\t\n\t\t\tconfig = { ...DEFAULT_ERROR_CONFIG };\n\n\t\t\tObject.entries({ fail, success }).forEach(([key, value]) => {\n\t\t\t\tif (value !== undefined)\n\t\t\t\t\tconfig[key] = value;\n\t\t\t});\n\t\t\tObject.entries({ handler, combine }).forEach(([key, value]) => {\n\t\t\t\tif (value !== undefined)\n\t\t\t\t\tconfig[key] = { ...config[key], ...value };\n\t\t\t});\n\n\t\t\treturn config;\n\t\t}\n\t\tfunction get_error_handler(config) {\n\t\t\tconst result = _merge_error_config(config?.errorHandling);\n\n\t\t\tif (!config?.form) {\n\t\t\t\tresult.combine = { ...result.combine, form: [] };\n\t\t\t} else {\n\t\t\t\tconst formHandler = result.handler.form;\n\t\t\t\tresult.handler = { ...result.handler, form: errors => formHandler(config.form, errors) };\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\t\tfunction get_error_list(error) {\n\t\t\tif (error.response) {\n\t\t\t\tif (error.response.status == 404) {\n\t\t\t\t\treturn [{\n\t\t\t\t\t\ttype: 'not_found',\n\t\t\t\t\t\tmessage: error.message,\n\t\t\t\t\t\turl: error.request.responseURL\n\t\t\t\t\t}];\n\t\t\t\t} else {\n\t\t\t\t\tif (error.response.data.errors == undefined) return [];\n\t\t\t\t\treturn error.response.data.errors;\n\t\t\t\t}\n\t\t\t} else if (error.request) {\n\t\t\t\treturn [{\n\t\t\t\t\ttype: 'site_failed',\n\t\t\t\t\tmessage: error.message,\n\t\t\t\t\turl: error.request.responseURL\n\t\t\t\t}];\n\t\t\t} else {\n\t\t\t\treturn [{\n\t\t\t\t\ttype: 'script',\n\t\t\t\t\tmessage: error.message\n\t\t\t\t}];\n\t\t\t}\n\t\t}\n\t\tfunction popHandleableErrors(errorHandling, errors) {\n\t\t\tconst result = {};\n\t\t\tconst copy = [];\n\n\t\t\tif (errors == undefined) return {};\n\n\t\t\twhile (errors.length)\n\t\t\t\tcopy.push(errors.pop());\n\t\t\tfor (var error of copy) {\n\t\t\t\tlet type = error.type;\n\t\t\t\tlet newType = null;\n\t\t\t\tfor (var t in errorHandling.combine) {\n\t\t\t\t\tlet newTypeCombinesType = errorHandling\n\t\t\t\t\t\t.combine[t]\n\t\t\t\t\t\t.includes(type);\n\t\t\t\t\tlet newTypeHasHandler = errorHandling.handler[t];\n\t\t\t\t\tif (newTypeCombinesType && newTypeHasHandler) {\n\t\t\t\t\t\tnewType = t;\n\t\t\t\t\t\tif (newType == 'form')\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (newType)\n\t\t\t\t\ttype = newType;\n\t\t\t\tconst handler = errorHandling.handler[type];\n\t\t\t\tif (handler) {\n\t\t\t\t\tif (!result[type])\n\t\t\t\t\t\tresult[type] = [];\n\t\t\t\t\tif (Array.isArray(error))\n\t\t\t\t\t\tresult[type].push(...error);\n\t\t\t\t\telse\n\t\t\t\t\t\tresult[type].push(error);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\terrors.push(error);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t\t\n\t\t\n\t\tconst fhcApiAxios = axios.create({\n\t\t\ttimeout: 500000,\n\t\t\tbaseURL: FHC_JS_DATA_STORAGE_OBJECT.app_root\n\t\t\t\t+ FHC_JS_DATA_STORAGE_OBJECT.ci_router\n\t\t\t\t+ \"/\"\n\t\t});\n\n\t\tfhcApiAxios.interceptors.request.use(config => {\n\t\t\tif (config.method != 'post' || !config.data)\n\t\t\t\treturn config;\n\n\t\t\tif (config.data instanceof FormData)\n\t\t\t\treturn config;\n\n\t\t\tif (!Object.values(config.data).every(item => {\n\t\t\t\tif (item instanceof FileList)\n\t\t\t\t\treturn false;\n\t\t\t\tif (Array.isArray(item))\n\t\t\t\t\treturn item.every(i => !(i instanceof File));\n\t\t\t\treturn true;\n\t\t\t})) {\n\t\t\t\tconst newData = Object.entries(config.data).reduce((nd, [key, item]) => {\n\t\t\t\t\tif (item instanceof FileList) {\n\t\t\t\t\t\tfor (const file of item)\n\t\t\t\t\t\t\tnd.FormData.append(key + (item.length > 1 ? '[]' : ''), file);\n\t\t\t\t\t} else if (Array.isArray(item)) {\n\t\t\t\t\t\tif (item.every(i => !(i instanceof File))) {\n\t\t\t\t\t\t\tnd.jsondata[key] = item;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\titem.forEach(file => nd.FormData.append(key + (item.length > 1 ? '[]' : ''), file));\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnd.jsondata[key] = item;\n\t\t\t\t\t}\n\t\t\t\t\treturn nd;\n\t\t\t\t}, {\n\t\t\t\t\tFormData: new FormData(),\n\t\t\t\t\tjsondata: {}\n\t\t\t\t});\n\t\t\t\tnewData.FormData.append('_jsondata', JSON.stringify(newData.jsondata));\n\t\t\t\tconfig.data = newData.FormData;\n\t\t\t}\n\n\t\t\treturn config;\n\t\t});\n\n\t\tfhcApiAxios.interceptors.response.use(\n\t\t\tresponse => {\n\t\t\t\tif (response.config?.errorHandling == 'off'\n\t\t\t\t\t|| response.config?.errorHandling === false\n\t\t\t\t\t|| response.config?.errorHandling == 'fail')\n\t\t\t\t\treturn clean_return_value(response);\n\n\t\t\t\t// NOTE(chris): loop through errors\n\t\t\t\tif (response.data.errors)\n\t\t\t\t\tresponse.data.errors = response.data.errors.filter(\n\t\t\t\t\t\terr => (response.config[err.type + 'ErrorHandler'] || app.config.globalProperties.$api._defaultErrorHandlers[err.type])(err, response.config)\n\t\t\t\t\t);\n\n\t\t\t\treturn clean_return_value(response);\n\t\t\t},\n\t\t\terror => {\n\t\t\t\tif (error.code == 'ERR_CANCELED')\n\t\t\t\t\treturn Promise.reject({ handled: true, ...error });\n\n\t\t\t\tconst errorConfig = get_error_handler(error.config);\n\n\t\t\t\tif (!errorConfig.fail)\n\t\t\t\t\treturn Promise.reject(error);\n\n\t\t\t\tconst remaining = get_error_list(error);\n\n\t\t\t\tconst errors = popHandleableErrors(errorConfig, remaining);\n\n\t\t\t\tfor (var type in errors) {\n\t\t\t\t\terrorConfig.handler[type](errors[type]);\n\t\t\t\t}\n\n\t\t\t\tif (remaining.length)\n\t\t\t\t\treturn Promise.reject(error);\n\t\t\t\t\n\t\t\t\treturn Promise.reject({ handled: true, ...error });\n\t\t\t}\n\t\t);\n\n\t\tapp.config.globalProperties.$api = {\n\t\t\tgetUri(url) {\n\t\t\t\treturn fhcApiAxios.getUri({url});\n\t\t\t},\n\t\t\tget(form, uri, params, config) {\n\t\t\t\t[uri, params, config] = get_config(form, uri, params, config);\n\t\t\t\tif (params) {\n\t\t\t\t\tif (config)\n\t\t\t\t\t\tconfig.params = params;\n\t\t\t\t\telse\n\t\t\t\t\t\tconfig = {params};\n\t\t\t\t}\n\t\t\t\treturn fhcApiAxios.get(uri, config);\n\t\t\t},\n\t\t\tpost(form, uri, data, config) {\n\t\t\t\t[uri, data, config] = get_config(form, uri, data, config);\n\t\t\t\treturn fhcApiAxios.post(uri, data, config);\n\t\t\t},\n\t\t\tcall(factory, configoverwrite, form) {\n\t\t\t\tif (Array.isArray(factory)) {\n\t\t\t\t\tconst $api = app.config.globalProperties.$api;\n\n\t\t\t\t\treturn Promise\n\t\t\t\t\t\t.allSettled(factory.map((config, index) => {\n\t\t\t\t\t\t\tif (!Array.isArray(config))\n\t\t\t\t\t\t\t\tconfig = ['#' + index, config];\n\t\t\t\t\t\t\treturn $api.call(config[1], {\n\t\t\t\t\t\t\t\terrorHeader: config[0],\n\t\t\t\t\t\t\t\terrorHandling: false\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}))\n\t\t\t\t\t\t.then(result => {\n\t\t\t\t\t\t\tconst [ , , config ] = get_config(form, undefined, undefined, configoverwrite || {});\n\t\t\t\t\t\t\tconst errorConfig = get_error_handler(config);\n\n\t\t\t\t\t\t\tif (!errorConfig.success && !errorConfig.fail) {\n\t\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst typedErrors = {};\n\t\t\t\t\t\t\tfor (var res of result) {\n\t\t\t\t\t\t\t\tconst [ allowed, item ] = res.status === 'fulfilled'\n\t\t\t\t\t\t\t\t\t? [ errorConfig.success, res.value ]\n\t\t\t\t\t\t\t\t\t: [ errorConfig.fail, res.reason ];\n\t\t\t\t\t\t\t\tif (!allowed)\n\t\t\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t\t\tconst errors = popHandleableErrors(errorConfig, get_error_list(item));\n\n\t\t\t\t\t\t\t\tfor (var type in errors) {\n\t\t\t\t\t\t\t\t\tif (!typedErrors[type])\n\t\t\t\t\t\t\t\t\t\ttypedErrors[type] = {\n\t\t\t\t\t\t\t\t\t\t\t[item.config.errorHeader]: errors[type]\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\ttypedErrors[type][item.config.errorHeader] = errors[type];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tfor (var errType in typedErrors) {\n\t\t\t\t\t\t\t\terrorConfig.handler[errType](typedErrors[errType]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tlet { method, url, params, config } = factory;\n\t\t\t\tif (configoverwrite !== undefined) {\n\t\t\t\t\tconfig = configoverwrite;\n\t\t\t\t}\n\t\t\t\tif (!method) {\n\t\t\t\t\tmethod = 'get';\n\t\t\t\t}\n\t\t\t\tif (method.toLowerCase)\n\t\t\t\t\tmethod = method.toLowerCase();\n\t\t\t\tif (method == 'get') {\n\t\t\t\t\treturn this.get(form, url, params, config);\n\t\t\t\t} else if (method == 'post') {\n\t\t\t\t\treturn this.post(form, url, params, config);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(\"FhcApi: method not allowed:\", method);\n\t\t\t\t}\n\t\t\t},\n\t\t\tgetErrorHandler(config) {\n\t\t\t\treturn get_error_handler(config);\n\t\t\t}\n\t\t};\n\n\t\tapp.provide('$api', app.config.globalProperties.$api);\n\t}\n};\n","/**\n * Copyright (C) 2025 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tloadCategory(category) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/phrasen/loadModule/' + category\n\t\t};\n\t},\n\tsetLanguage(categories,language) {\n\t\tconst params = {categories, language}\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/phrasen/setLanguage',\n\t\t\tparams\n\t\t};\n\t},\n\tgetLanguage() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/phrasen/getLanguage'\n\t\t};\n\t},\n\tgetActiveDbLanguages() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/phrasen/getAllLanguages'\n\t\t};\n\t}\n};","import OldFhcApi from '../plugin/OldFhcApi.js'; // TODO(chris): remove at some point\nimport PluginsApi from './Api.js';\nimport ApiPhrasen from '../api/factory/phrasen.js';\n\nconst categories = Vue.reactive({});\nconst loadingModules = {};\nlet user_language = Vue.ref(FHC_JS_DATA_STORAGE_OBJECT.user_language);\nexport let user_locale = Vue.computed(()=>{\n\tif(!user_language.value) return null;\n\treturn FHC_JS_DATA_STORAGE_OBJECT.server_languages.find(language => language.sprache == user_language.value).LC_Time;\n});\n\nfunction extractCategory(obj, category) {\n\treturn obj.filter(e => e.category == category).reduce((res, elem) => {\n\t\tif (!res[elem.phrase])\n\t\t\tres[elem.phrase] = elem.text;\n\t\treturn res;\n\t}, {});\n}\nfunction getValueForLoadedPhrase(category, phrase, params) {\n\tlet result = categories[category][phrase];\n\tif (!result)\n\t\treturn '<< PHRASE ' + phrase + '>>';\n\tif (params)\n\t\tresult = result.replace(/\\{([^}]*)\\}/g, (match, p1) => params[p1] === undefined ? match : params[p1]);\n\treturn result;\n}\n\nconst phrasen = {\n\tuser_language,\n\tuser_locale,\n\tsetLanguage(language) {\n\t\tconst catArray = Object.keys(categories)\n\t\treturn this.config.globalProperties.$api\n\t\t\t.call(ApiPhrasen.setLanguage(catArray, language))\n\t\t\t.then(res => {\n\t\t\t\tres.data.forEach(row => {\n\t\t\t\t\tcategories[row.category][row.phrase] = row.text\n\t\t\t\t})\n\n\t\t\t\t// update the reactive data that holds the current active user_language\n\t\t\t\tuser_language.value = language;\n\n\t\t\t\treturn res\n\t\t\t})\n\t},\n\tloadCategory(category) {\n\t\tif (Array.isArray(category))\n\t\t\treturn Promise.all(category.map(this.config.globalProperties\n\t\t\t\t.$p.loadCategory));\n\n\t\tif (!loadingModules[category])\n\t\t\tloadingModules[category] = this.config.globalProperties.$api\n\t\t\t\t.call(ApiPhrasen.loadCategory(category))\n\t\t\t\t.then(res => res?.data ? extractCategory(res.data, category) : {})\n\t\t\t\t.then(res => {\n\t\t\t\t\tcategories[category] = res;\n\t\t\t\t});\n\t\treturn loadingModules[category];\n\t},\n\tt_ref(category, phrase, params) {\n\t\tconsole.warn('deprecated');\n\t\treturn Vue.computed(() => this.t(category, phrase, params));\n\t},\n\tt(category, phrase, params) {\n\t\tif (params === undefined && (\n\t\t\t(Array.isArray(category) && category.length == 2) ||\n\t\t\t(category.split && category.split('/').length == 2))\n\t\t\t) {\n\t\t\tparams = phrase;\n\t\t\t[category, phrase] = category.split ? category.split('/') : category;\n\t\t}\n\t\tif (phrase === undefined) {\n\t\t\tconsole.error('invalid input', category, phrase, params);\n\t\t\treturn '';\n\t\t}\n\t\tlet val = Vue.computed(() => {\n\t\t\tif (!categories[category])\n\t\t\t\treturn '';\n\t\t\treturn getValueForLoadedPhrase(category, phrase, params);\n\t\t});\n\t\tif (!categories[category])\n\t\t\tthis.loadCategory(category);\n\t\treturn val.value;\n\t}\n};\n\nexport default {\n\tinstall(app, options) {\n\t\tif (!app.config.globalProperties.$fhcApi)\n\t\t\tapp.use(OldFhcApi); // TODO(chris): remove at some point\n\t\tif (!app.config.globalProperties.$api)\n\t\t\tapp.use(PluginsApi);\n\t\tapp.config.globalProperties.$p = {\n\t\t\tt: phrasen.t,\n\t\t\tloadCategory: cat => phrasen.loadCategory.call(app, cat),\n\t\t\tsetLanguage: lang => phrasen.setLanguage.call(app, lang),\n\t\t\tuser_language: user_language,\n\t\t\tuser_locale,\n\t\t\tt_ref: phrasen.t_ref\n\t\t};\n\t\tapp.provide('$p', app.config.globalProperties.$p);\n\t}\n}","let theme_name = Vue.ref(FHC_JS_DATA_STORAGE_OBJECT.theme.name);\nconst theme_modes = FHC_JS_DATA_STORAGE_OBJECT.theme.modes;\n\nconst toggleTheme = (theme)=>{\n\tif (!theme) return;\n\n\tfor (const theme of theme_modes) {\n\t\tdocument.documentElement.classList.remove(theme);\n\t}\n\ttheme_name.value = theme;\n\tdocument.documentElement.classList.add(theme);\n\n\tdocument.body.setAttribute(\"data-bs-theme\", theme);\n\n\tlet stylesheet = document.querySelector('link[href*=\"primevue/resources/themes\"]');\n\tif (theme == \"dark\") {\n\t\tstylesheet.attributes.href.value = stylesheet.attributes.href.value.replace(\"bootstrap4-light-blue\", \"bootstrap4-dark-blue\");\n\t} else if (theme == \"light\") {\n\t\tstylesheet.attributes.href.value = stylesheet.attributes.href.value.replace(\"bootstrap4-dark-blue\", \"bootstrap4-light-blue\");\n\t}\n\telse{\n\t\tif (stylesheet.attributes.href.value.includes(\"bootstrap4-dark-blue\"))\n\t\t\tstylesheet.attributes.href.value = stylesheet.attributes.href.value.replace(\"bootstrap4-dark-blue\", \"bootstrap4-light-blue\");\n\t}\n\n\tlocalStorage.setItem(\"theme\", theme);\n}\n\nconst initializeTheme = ()=>{\n\t\n\tlet theme = localStorage.getItem(\"theme\");\n\tif (!theme || !theme_modes.includes(theme)) {\n\t\t// set the first theme mode as default\n\t\ttheme = theme_modes[0];\n\t\tlocalStorage.setItem(\"theme\",theme);\n\t}\n\ttoggleTheme(theme);\n}\n\n\nexport default {\n\tinstall: (app,options)=>{\n\t\t\n\t\tdocument.documentElement.classList.add(theme_name.value);\n\n\t\tinitializeTheme();\n\n\t\tapp.config.globalProperties.$theme = {\n\t\t\ttheme_name,\n\t\t\ttheme_modes,\n\t\t\tswitchTheme: (theme) => {\n\t\t\t\ttoggleTheme(theme);\n\t\t\t}, \n\t\t} \n\t}\n}","const rgbToHex = (value) => {\n\tconst hex = value.toString(16);\n\treturn hex.length === 1 ? '0' + hex : hex;\n};\n\nfunction getContrastYIQ(hexcolor) {\n\t\n\tvar r = parseInt(hexcolor.substring(1, 3), 16);\n\tvar g = parseInt(hexcolor.substring(3, 5), 16);\n\tvar b = parseInt(hexcolor.substring(5, 7), 16);\n\tvar yiq = ((r * 299) + (g * 587) + (b * 114)) / 1000;\n\treturn (yiq >= 128) ? 'black' : 'white';\n}\n\nexport default {\n\tmounted(element, binding){\n\t\tconst bgColor = window.getComputedStyle(element).backgroundColor;\n\t\tlet rgbRegEx = new RegExp(/^rgba?\\s*\\(([0-9]+)\\s*,\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*,?\\s*([0-9]+.?[0-9]?)?\\s*\\)/);\n\t\tlet isRgb = bgColor.match(rgbRegEx);\n\t\tif (isRgb) {\n\t\t\tif (isRgb.length < 3) {\n\t\t\t\tconsole.error(\"Invalid RGB color format\");\n\t\t\t}\n\t\t\tlet r = parseInt(isRgb[1], 10);\n\t\t\tlet g = parseInt(isRgb[2], 10);\n\t\t\tlet b = parseInt(isRgb[3], 10);\n\t\t\tlet hexColor = `#${rgbToHex(r)}${rgbToHex(g)}${rgbToHex(b)}`;\n\t\t\telement.style.color = getContrastYIQ(hexColor);\n\t\t}\n\t\telse\n\t\t{\n\t\t\telement.style.color = getContrastYIQ(bgColor);\n\t\t}\n\t},\n}","/**\n * TODO(chris): This is only a prototype!!!\n */\n\nconst TYPE_DEFINITION = {\n\tlehreinheit: {\n\t\tid: \"lehreinheit_id\",\n\t\tdragIcon: \"fa-solid fa-chalkboard-user\",\n\t\textras: [\n\t\t\t\"stundenblockung\"\n\t\t]\n\t},\n\tvevent: {\n\t\tid: \"uid\",\n\t\tdragIcon: \"fa-solid fa-calendar\",\n\t\textras: [\n\t\t\t\"dtstart\",\n\t\t\t\"dtend\",\n\t\t\t\"summary\"\n\t\t]\n\t},\n\tperson: {\n\t\tid: \"person_id\",\n\t\tdragIcon: \"fa-solid fa-user\"\n\t},\n\tstudent: {\n\t\tid: \"student_uid\",\n\t\tdragIcon: \"fa-solid fa-user-graduate\"\n\t},\n\tprestudent: {\n\t\tid: \"prestudent_id\",\n\t\tdragIcon: \"fa-solid fa-user-graduate text-muted\"\n\t}\n\t// TODO: IMPLEMENT OTHER TYPES\n};\n\nconst VALID_TYPES = Object.keys(TYPE_DEFINITION);\n\nconst TYPE_CONSTANTS = Object.keys(TYPE_DEFINITION).reduce((res, type) => {\n\tres['TYPE_' + type.toUpperCase()] = type;\n\treturn res;\n}, {});\n\nfunction isValidDragObject(value) {\n\tif (!value)\n\t\treturn false;\n\tif (Array.isArray(value))\n\t\treturn value.every(isValidDragObject);\n\tif (!value.type)\n\t\treturn false;\n\n\tif (value.type.substr(-11) == '-collection') {\n\t\tif (!Object.prototype.hasOwnProperty.call(value, 'values'))\n\t\t\treturn false;\n\n\t\tif (!VALID_TYPES.includes(value.type.substr(0, value.type.length-11)))\n\t\t\treturn false;\n\t} else {\n\t\tif (!Object.prototype.hasOwnProperty.call(value, 'id'))\n\t\t\treturn false;\n\n\t\tif (!VALID_TYPES.includes(value.type))\n\t\t\treturn false;\n\n\t\tif (TYPE_DEFINITION[value.type].extras) {\n\t\t\tif (!TYPE_DEFINITION[value.type].extras.every(extra => Object.prototype.hasOwnProperty.call(value, extra)))\n\t\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\nfunction getValidTransferData(event, allowedTypes, strict) {\n\tlet obj = null;\n\n\ttry {\n\t\tobj = getTransferData(event, strict);\n\t\tif (!obj)\n\t\t\treturn null;\n\n\t\tif (!strict && Array.isArray(obj)) {\n\t\t\tobj = obj.filter(isValidDragObject);\n\t\t\tif (!obj.length)\n\t\t\t\treturn null;\n\t\t} else if (!isValidDragObject(obj))\n\t\t\treturn null;\n\n\t\tif (allowedTypes && allowedTypes.length) {\n\t\t\tif (Array.isArray(obj)) {\n\t\t\t\tif (strict && !obj.every(v => allowedTypes.includes(v.type))) {\n\t\t\t\t\treturn null;\n\t\t\t\t} else if (!strict) {\n\t\t\t\t\tobj = obj.filter(v => allowedTypes.includes(v.type));\n\t\t\t\t\tif (!obj.length)\n\t\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t} else if (!allowedTypes.includes(obj.type)) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t} catch(_error) {\n\t\treturn null;\n\t}\n\n\tif (Array.isArray(obj) && obj.length == 1)\n\t\treturn obj.find(Boolean);\n\n\treturn obj;\n}\n\nfunction isValidTransferData(event, allowedTypes, strict) {\n\treturn getValidTransferData(event, allowedTypes, strict) ? true : false;\n}\n\nfunction getTransferData(event, strict) {\n\tconst result = [];\n\n\tfor (const type of event.dataTransfer.types) {\n\t\tif (type.substr(0, 16) != 'application/fhc-') {\n\t\t\tif (strict)\n\t\t\t\treturn null;\n\t\t\tcontinue;\n\t\t}\n\t\tlet base_type = type.substr(16);\n\t\tlet collection = false;\n\t\tif (base_type.substr(-11) == '-collection') {\n\t\t\tbase_type = base_type.substr(0, base_type.length-11);\n\t\t\tcollection = true;\n\t\t}\n\t\tif (!VALID_TYPES.includes(base_type)) {\n\t\t\tif (strict)\n\t\t\t\treturn null;\n\t\t\tcontinue;\n\t\t}\n\t\tlet data = JSON.parse(event.dataTransfer.getData(type));\n\t\tif (collection)\n\t\t\tresult.push(...data.values);\n\t\telse\n\t\t\tresult.push(data);\n\t}\n\n\tif (!result.length)\n\t\treturn null;\n\n\tif (result.length == 1)\n\t\treturn result[0];\n\n\treturn result;\n}\n\nfunction convertToValidDragObject(data, strict) {\n\tif (Array.isArray(data)) {\n\t\tconst converted = data.map(convertToValidDragObject).filter(Boolean);\n\t\tif (!converted.length)\n\t\t\treturn undefined;\n\t\tif (strict && converted.length != data.length)\n\t\t\treturn undefined;\n\n\t\tconst sorted = converted.reduce((res, item) => {\n\t\t\tif (!res[item.type])\n\t\t\t\tres[item.type] = [];\n\t\t\tres[item.type].push(item);\n\t\t\treturn res;\n\t\t}, {});\n\n\t\treturn Object.entries(sorted).map(([type, values]) => {\n\t\t\tif (values.length > 1) {\n\t\t\t\treturn {\n\t\t\t\t\ttype: type + '-collection',\n\t\t\t\t\tvalues\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn values[0];\n\t\t});\n\t}\n\n\tif (Object.prototype.hasOwnProperty.call(data, 'type') && isValidDragObject(data)) {\n\t\treturn data;\n\t}\n\n\tconst found = Object.entries(TYPE_DEFINITION).find(([ , typedef ]) => {\n\t\tif (!Object.prototype.hasOwnProperty.call(data, typedef.id))\n\t\t\treturn false;\n\t\tif (typedef.extras) {\n\t\t\tif (!typedef.extras.every(extra => Object.prototype.hasOwnProperty.call(data, extra)))\n\t\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t});\n\n\tif (!found) {\n\t\treturn undefined;\n\t}\n\n\tconst [ type, typedef ] = found;\n\n\tconst newData = {};\n\tnewData.type = type;\n\tnewData.id = data[typedef.id];\n\tif (typedef.extras)\n\t\ttypedef.extras.forEach(extra => newData[extra] = data[extra]);\n\n\treturn newData;\n}\n\nfunction setTransferData(event, validDragObject, setDragImage = false) {\n\tif (setDragImage) {\n\t\tconst dragItems = Array.isArray(validDragObject) ? validDragObject : [ validDragObject ];\n\t\tconst dragElements = dragItems.map(item => {\n\t\t\tconst icon = document.createElement('i');\n\t\t\tconst label = document.createElement('span');\n\t\t\tconst iconContainer = document.createElement('span');\n\n\t\t\ticonContainer.className = 'btn btn-outline-dark bg-light';\n\t\t\tlabel.className = 'small';\n\n\t\t\tif (TYPE_DEFINITION[item.type]) {\n\t\t\t\ticon.className = TYPE_DEFINITION[item.type].dragIcon || 'fa-solid fa-question';\n\t\t\t\tlabel.textContent = item.id;\n\t\t\t} else if (item.type.substr(-11) == '-collection' && TYPE_DEFINITION[item.type.substr(0, item.type.length-11)]) {\n\t\t\t\ticonContainer.style.boxShadow = '3px 3px var(--bs-btn-border-color)';\n\t\t\t\ticon.className = TYPE_DEFINITION[item.type.substr(0, item.type.length-11)].dragIcon || 'fa-solid fa-question';\n\t\t\t\tlabel.textContent = 'x' + item.values.length;\n\t\t\t} else {\n\t\t\t\ticon.className = 'fa-solid fa-question';\n\t\t\t\tlabel.textContent = item.id || '';\n\t\t\t}\n\t\t\t\n\t\t\ticonContainer.append(icon);\n\n\t\t\tconst itemContainer = document.createElement('div');\n\t\t\titemContainer.className = 'd-flex flex-column align-items-center gap-2 small';\n\t\t\titemContainer.append(iconContainer, label);\n\t\t\treturn itemContainer;\n\t\t});\n\n\t\tconst container = document.createElement('div');\n\t\tcontainer.className = 'd-flex flex-row gap-2 small';\n\t\tcontainer.append(...dragElements);\n\n\t\tdocument.body.append(container);\n\t\tevent.dataTransfer.setDragImage(container, -25, 0);\n\t\trequestAnimationFrame(() => {\n\t\t\tdocument.body.removeChild(container);\n\t\t});\n\t}\n\tif (Array.isArray(validDragObject)) {\n\t\treturn validDragObject.forEach(data => setTransferData(event, data));\n\t}\n\t\n\tevent.dataTransfer.setData('application/fhc-' + validDragObject.type, JSON.stringify(validDragObject));\n}\n\n/**\n * check if the dataTransfer types are in the allowed types array\n * if strict is disabled at least one type must be the allowed array\n * otherwise all types have to be in the allowed array\n *\n * @param Event\t\tevent\n * @param Array\t\tallowedTypes\n * @param Boolean\tstrict\n */\nfunction eventHasTypes(event, allowedTypes, strict) {\n\tif (!allowedTypes || !allowedTypes.length)\n\t\tallowedTypes = VALID_TYPES;\n\tallowedTypes = allowedTypes.map(type => 'application/fhc-' + type);\n\n\tconst dataTypes = [...event.dataTransfer.types];\n\t\n\t// NOTE(chris): if dragging across browsers the dataTransfer object is\n\t// set to a default one without data. Since we do not support dragging\n\t// across browsers (yet) we return false which will disallow dropping.\n\tif (!dataTypes.length)\n\t\treturn false;\n\t\n\tif (!strict)\n\t\treturn allowedTypes.some(type => [...event.dataTransfer.types].includes(type));\n\t\n\treturn [...event.dataTransfer.types].every(type => allowedTypes.includes(type));\n}\n\nfunction bindDragEnterLeave(el, onEnter, onLeave) {\n\t// NOTE(chris): add save dragenter and dragleave events\n\t// that won't fire when hovering over child elements\n\n\tlet skipLeave = false;\n\tlet skipLeaveParent = true;\n\n\tfunction init(evt) {\n\t\tskipLeave = false;\n\t\tskipLeaveParent = true;\n\t\t// add global listeners\n\t\twindow.addEventListener('dragenter', globalDragenter, true);\n\t\twindow.addEventListener('dragleave', globalDragleave, true);\n\t\twindow.addEventListener('drop', globalDrop, true);\n\t\t// call enter\n\t\tonEnter(evt);\n\t\t// remove self\n\t\tel.removeEventListener('dragenter', init);\n\t}\n\n\tfunction cleanup(evt, wasDropped) {\n\t\t// remove global listeners\n\t\twindow.removeEventListener('dragenter', globalDragenter, true);\n\t\twindow.removeEventListener('dragleave', globalDragleave, true);\n\t\twindow.removeEventListener('drop', globalDrop, true);\n\t\t// call leave\n\t\tonLeave(evt, wasDropped);\n\t\t// add init\n\t\tel.addEventListener('dragenter', init);\n\t}\n\n\tfunction globalDragenter(evt) {\n\t\tskipLeaveParent = false;\n\t\tif (el != evt.target && !el.contains(evt.target)) {\n\t\t\tcleanup(evt);\n\t\t} else {\n\t\t\tskipLeave = true;\n\t\t}\n\t}\n\tfunction globalDragleave(evt) {\n\t\tif (el != evt.target && !el.contains(evt.target)) {\n\t\t\tif (skipLeaveParent) {\n\t\t\t\tskipLeaveParent = false;\n\t\t\t\treturn;\n\t\t\t}\n\t\t} else {\n\t\t\tif (skipLeave) {\n\t\t\t\tskipLeave = false;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tcleanup(evt);\n\t}\n\tfunction globalDrop(evt) {\n\t\tcleanup(evt, true);\n\t}\n\n\tel.addEventListener('dragenter', init);\n\n\treturn () => {\n\t\t// cleanup\n\t\tel.removeEventListener('dragenter', init);\n\t}\n}\n\nexport {\n\tisValidDragObject,\n\tgetValidTransferData,\n\tisValidTransferData,\n\tgetTransferData,\n\tconvertToValidDragObject,\n\tsetTransferData,\n\teventHasTypes,\n\tbindDragEnterLeave\n};\nexport default {\n\t...TYPE_CONSTANTS,\n\tisValidDragObject,\n\tgetValidTransferData,\n\tisValidTransferData,\n\tgetTransferData,\n\tconvertToValidDragObject,\n\tsetTransferData,\n\teventHasTypes,\n\tbindDragEnterLeave\n};\n","/**\n * TODO(chris): This needs serious rework!!!\n */\nexport default {\n\tmounted(el, binding, vnode) {\n\t\tif (binding.arg == 'draggable') {\n\t\t\tel.addEventListener('update-my-value', evt => {\n\t\t\t\tevt.preventDefault();\n\t\t\t\tbinding.value = evt.detail.item;\n\t\t\t});\n\t\t\tel.addEventListener('dragstart', evt => {\n\t\t\t\tel.dispatchEvent(new CustomEvent('calendar-dragstart', {\n\t\t\t\t\tcancelable: true,\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tdetail: {\n\t\t\t\t\t\titem: binding.value,\n\t\t\t\t\t\tx: evt.offsetX / el.offsetWidth,\n\t\t\t\t\t\ty: evt.offsetY / el.offsetHeight,\n\t\t\t\t\t\toriginalEvent: evt\n\t\t\t\t\t}\n\t\t\t\t}));\n\t\t\t});\n\t\t\tel.addEventListener('dragend', evt => {\n\t\t\t\tel.dispatchEvent(new CustomEvent('calendar-dragend', {\n\t\t\t\t\tcancelable: true,\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tdetail: {\n\t\t\t\t\t\titem: binding.value,\n\t\t\t\t\t\toriginalEvent: evt\n\t\t\t\t\t}\n\t\t\t\t}));\n\t\t\t});\n\t\t} else if (binding.arg == 'dropcage') {\n\t\t\tlet hitbox = null;\n\t\t\tel.addEventListener('dragover', evt => {\n\t\t\t\tif (hitbox)\n\t\t\t\t\treturn;\n\t\t\t\thitbox = el.getBoundingClientRect();\n\t\t\t\treturn el.dispatchEvent(new CustomEvent('calendar-dragenter', {\n\t\t\t\t\tdetail: { originalEvent: evt }\n\t\t\t\t}));\n\t\t\t});\n\t\t\twindow.addEventListener('dragleave', evt => {\n\t\t\t\tif (!hitbox)\n\t\t\t\t\treturn;\n\t\t\t\tlet pos;\n\t\t\t\tif (typeof evt.clientX === 'undefined')\n\t\t\t\t\tpos = {\n\t\t\t\t\t\tx: evt.pageX + document.documentElement.scrollLeft,\n\t\t\t\t\t\ty: evt.pageY + document.documentElement.scrollTop\n\t\t\t\t\t};\n\t\t\t\telse\n\t\t\t\t\tpos = {\n\t\t\t\t\t\tx: evt.clientX + document.body.scrollLeft + document.documentElement.scrollLeft,\n\t\t\t\t\t\ty: evt.clientY + document.body.scrollTop + document.documentElement.scrollTop\n\t\t\t\t\t};\n\t\t\t\tif (pos.x > hitbox.left + hitbox.width - 1 || pos.x < hitbox.left || pos.y > hitbox.top + hitbox.height - 1 || pos.y < hitbox.top) {\n\t\t\t\t\thitbox = null;\n\t\t\t\t\treturn el.dispatchEvent(new CustomEvent('calendar-dragleave', {\n\t\t\t\t\t\tdetail: { originalEvent: evt }\n\t\t\t\t\t}));\n\t\t\t\t}\n\t\t\t});\n\t\t\twindow.addEventListener('drop', evt => {\n\t\t\t\tif (!hitbox)\n\t\t\t\t\treturn;\n\t\t\t\t\n\t\t\t\thitbox = null;\n\t\t\t\treturn el.dispatchEvent(new CustomEvent('calendar-dragleave', {\n\t\t\t\t\tdetail: { originalEvent: evt }\n\t\t\t\t}));\n\t\t\t});\n\t\t} else if (binding.arg == 'dropzone') {\n\t\t\tel.addEventListener(\n\t\t\t\tbinding.modifiers.once ? 'dragenter' : 'dragover',\n\t\t\t\tevt => {\n\t\t\t\t\tconst timestamp = binding.value instanceof Function\n\t\t\t\t\t\t? binding.value(evt)\n\t\t\t\t\t\t: binding.value;\n\t\t\t\t\tconst detail = timestamp.timestamp ? timestamp : { timestamp };\n\t\t\t\t\tel.dispatchEvent(new CustomEvent('calendar-dragchange', {\n\t\t\t\t\t\tcancelable: true,\n\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\tdetail\n\t\t\t\t\t}));\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t},\n\tupdated(el, binding, vnode, prevVnode) {\n\t\tif (binding.arg == 'draggable') {\n\t\t\tel.dispatchEvent(new CustomEvent('update-my-value', {\n\t\t\t\tcancelable: true,\n\t\t\t\tdetail: {\n\t\t\t\t\titem: binding.value\n\t\t\t\t}\n\t\t\t}));\n\t\t}\n\t}\n}","import DragAndDrop from '../../../helpers/DragAndDrop.js';\n\nimport CalDnd from '../../../directives/Calendar/DragAndDrop.js';\n\n/**\n * TODO(chris): this needs serious rework!\n */\n\nexport default {\n\tname: \"CalendarDragAndDrop\",\n\tdirectives: {\n\t\tCalDnd\n\t},\n\tprovide() {\n\t\treturn {\n\t\t\tevents: Vue.computed(() => this.correctedEvents),\n\t\t\tbackgrounds: Vue.computed(() => this.backgrounds),\n\t\t\tdropAllowed: Vue.computed(() => this.dragging && this.dropAllowed)\n\t\t};\n\t},\n\tinject: {\n\t\tmode: \"mode\",\n\t\tdropableEvents: \"dropableEvents\"\n\t},\n\tprops: {\n\t\tevents: Array,\n\t\tbackgrounds: Array\n\t},\n\temits: [\n\t\t\"drop\"\n\t],\n\tdata() {\n\t\treturn {\n\t\t\tdragging: false,\n\t\t\tallowed: false,\n\t\t\tdraggedInternalEvent: null,\n\t\t\tdraggedExternalEvent: null,\n\t\t\ttargetTimestamp: 0,\n\t\t\ttargetGridEnds: null,\n\t\t\tdropAllowed: false,\n\n\t\t\tshadowPreview: false // TODO(chris): IMPLEMENT! (use background instead of event as preview)\n\t\t};\n\t},\n\tcomputed: {\n\t\tcorrectedEvents() {\n\t\t\tif (this.dragging) {\n\t\t\t\tif (this.draggedInternalEvent) {\n\t\t\t\t\tconst index = this.events.findIndex(e => e.id == this.draggedInternalEvent.id);\n\t\t\t\t\tif (this.previewEvent && !this.shadowPreview)\n\t\t\t\t\t\treturn this.events.toSpliced(index, 1, this.previewEvent);\n\t\t\t\t\telse\n\t\t\t\t\t\treturn this.events.toSpliced(index, 1);\n\t\t\t\t}\n\t\t\t\tif (this.previewEvent && !this.shadowPreview)\n\t\t\t\t\treturn [...this.events, this.previewEvent];\n\t\t\t}\n\n\t\t\treturn this.events;\n\t\t},\n\t\tcorrectedBackgrounds() {\n\t\t\tif (this.dragging) {\n\t\t\t\tif (this.shadowPreview) {\n\t\t\t\t\t// TODO(chris): how to get the length\n\t\t\t\t\treturn [...this.backgrounds, {\n\t\t\t\t\t\tstart: new Date(this.targetTimestamp),\n\t\t\t\t\t\tclass: 'shadow-preview'\n\t\t\t\t\t}];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this.backgrounds;\n\t\t},\n\t\tpreviewEvent() {\n\t\t\tif (!this.dragging || !this.dropAllowed)\n\t\t\t\treturn null;\n\t\t\tif (!this.targetTimestamp)\n\t\t\t\treturn null;\n\n\t\t\tconst event = this.draggedInternalEvent || this.draggedExternalEvent;\n\n\t\t\tif (!event)\n\t\t\t\treturn null;\n\t\t\t\n\t\t\t// TODO(chris): calculate length correctly from orig\n\t\t\tlet length = event.end - event.start;\n\t\t\tif (this.targetGridEnds)\n\t\t\t\tlength = this.targetGridEnds.find(end => end >= this.targetTimestamp + length) - this.targetTimestamp;\n\t\t\t\n\t\t\treturn {\n\t\t\t\torig: event.orig,\n\t\t\t\tstart: this.targetTimestamp,\n\t\t\t\tend: this.targetTimestamp + length\n\t\t\t};\n\t\t}\n\t},\n\tmethods: {\n\t\tonDragstart(evt) {\n\t\t\tconst data = DragAndDrop.convertToTransferData(evt.detail.item.orig);\n\t\t\tif (DragAndDrop.isValidDragObject(data)) {\n\t\t\t\tDragAndDrop.setTransferData(evt.detail.originalEvent, data);\n\t\t\t\tthis.draggedInternalEvent = evt.detail.item;\n\t\t\t}\n\t\t},\n\t\tonDragend() {\n\t\t\tthis.draggedInternalEvent = null;\n\t\t\tthis.dragging = false;\n\t\t},\n\t\tonDragenter(evt) {\n\t\t\tthis.dragging = true;\n\n\t\t\tif (!this.draggedInternalEvent) {\n\t\t\t\tconst event = DragAndDrop.getValidTransferData(evt.detail.originalEvent);\n\t\t\t\tif (event) {\n\t\t\t\t\tthis.draggedExternalEvent = {\n\t\t\t\t\t\tid: event.id,\n\t\t\t\t\t\ttype: event.type,\n\t\t\t\t\t\tstart: event.isostart\n\t\t\t\t\t\t\t? luxon.DateTime.fromISO(event.isostart).setZone(this.timezone)\n\t\t\t\t\t\t\t: luxon.DateTime.local().setZone(this.timezone),\n\t\t\t\t\t\tend: event.isoend\n\t\t\t\t\t\t\t? luxon.DateTime.fromISO(event.isoend).setZone(this.timezone)\n\t\t\t\t\t\t\t: luxon.DateTime.local().setZone(this.timezone),\n\t\t\t\t\t\torig: event\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tthis.draggedExternalEvent = null;\n\t\t\t\t}\n\t\t\t\tthis.dropAllowed = this.dropableEvents(event, this.mode);\n\t\t\t} else {\n\t\t\t\tthis.dropAllowed = this.dropableEvents(this.draggedInternalEvent, this.mode);\n\t\t\t}\n\t\t},\n\t\tonDragleave() {\n\t\t\tthis.dragging = false;\n\t\t},\n\t\tonDragchange(evt) {\n\t\t\tthis.targetTimestamp = evt.detail.timestamp;\n\t\t\t\n\t\t\tthis.targetGridEnds = evt.detail.ends || null;\n\t\t},\n\t\tonDrop(evt) {\n\t\t\tif (!this.dragging || !this.dropAllowed)\n\t\t\t\treturn;\n\n\t\t\tthis.$emit('drop', evt, this.previewEvent.start, this.previewEvent.end);\n\t\t\tthis.dropAllowed = false;\n\t\t\tthis.dragging = false;\n\t\t}\n\t},\n\ttemplate: `\n\t\n\t\t\n\t\n\t`\n}\n","/**\n * TODO(chris): use click-directive\n */\nimport DatePicker from './Header/Datepicker.js';\n\nexport default {\n\tname: \"CalendarHeader\",\n\tcomponents: {\n\t\tDatePicker\n\t},\n\tprops: {\n\t\tdate: {\n\t\t\ttype: luxon.DateTime,\n\t\t\trequired: true\n\t\t},\n\t\tmode: {\n\t\t\ttype: String,\n\t\t\trequired: true\n\t\t},\n\t\tmodeOptions: {\n\t\t\ttype: Object,\n\t\t\tdefault: {}\n\t\t},\n\t\tbtnMonth: Boolean,\n\t\tbtnWeek: Boolean,\n\t\tbtnDay: Boolean,\n\t\tbtnList: Boolean\n\t},\n\temits: [\n\t\t\"next\",\n\t\t\"prev\",\n\t\t\"click:mode\",\n\t\t\"update:date\",\n\t\t\"update:mode\"\n\t],\n\tdata() {\n\t\treturn {\n\t\t\topen: false\n\t\t};\n\t},\n\tmethods: {\n\t\tclickMode(evt, mode) {\n\t\t\tthis.$emit('click:mode', evt);\n\t\t\tif (!evt.defaultPrevented)\n\t\t\t\tthis.$emit('update:mode', mode);\n\t\t}\n\t},\n\ttemplate: /* html */`\n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t
    \n\t
    \n\t`\n}\n","// TODO(chris): translate aria-labels\n\nexport default {\n\tname: \"CalendarHeaderDatepicker\",\n\tcomponents: {\n\t\tVueDatePicker\n\t},\n\tinject: [\n\t\t\"locale\",\n\t\t\"timezone\"\n\t],\n\tprops: {\n\t\tdate: {\n\t\t\ttype: luxon.DateTime,\n\t\t\trequired: true\n\t\t},\n\t\tmode: {\n\t\t\ttype: String,\n\t\t\trequired: true\n\t\t},\n\t\tlistLength: {\n\t\t\ttype: Number,\n\t\t\tdefault: 7\n\t\t}\n\t},\n\temits: [\n\t\t\"update:date\"\n\t],\n\tcomputed: {\n\t\tconvertedDate() {\n\t\t\t// convert to target TZ then strip TZ Information\n\t\t\t// so the datepicker can work with local times\n\t\t\treturn this.date.setZone(this.timezone).setZone('local', { keepLocalTime: true });\n\t\t},\n\t\tcurrent() {\n\t\t\tswitch (this.mode) {\n\t\t\tcase \"month\":\n\t\t\t\treturn {month: this.convertedDate.month-1, year: this.convertedDate.year};\n\t\t\tcase \"list\":\n\t\t\t\treturn [this.convertedDate.startOf('day').ts, this.convertedDate.startOf('day').plus({ days: this.listLength }).ts - 1];\n\t\t\tcase \"week\":\n\t\t\t\treturn [this.convertedDate.startOf('week', { useLocaleWeeks: true }).ts, this.convertedDate.endOf('week', { useLocaleWeeks: true }).ts];\n\t\t\tcase \"day\":\n\t\t\t\treturn this.convertedDate;\n\t\t\tdefault:\n\t\t\t\treturn null;\n\t\t\t}\n\t\t},\n\t\ttitle() {\n\t\t\tswitch (this.mode) {\n\t\t\tcase \"month\":\n\t\t\t\treturn this.date.toLocaleString({ month: 'long', year: 'numeric' });\n\t\t\tcase \"week\":\n\t\t\t\tvar year = this.date.localWeekYear;\n\t\t\t\tvar week = this.date.toFormat('nn');\n\t\t\t\treturn this.$p.t('calendar/year_kw', { year, week });\n\t\t\tcase \"list\":\n\t\t\t\treturn this.date.toLocaleString(luxon.DateTime.DATE_FULL) + '-' + this.date.plus({ days: this.listLength - 1 }).toLocaleString(luxon.DateTime.DATE_FULL);\n\t\t\tcase \"day\":\n\t\t\t\treturn this.date.toLocaleString(luxon.DateTime.DATE_FULL);\n\t\t\tdefault:\n\t\t\t\treturn 'View not Supported';\n\t\t\t}\n\t\t},\n\t\tweekStart() {\n\t\t\treturn luxon.Info.getStartOfWeek(this.date)%7;\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate(value) {\n\t\t\tlet date;\n\t\t\tswitch (this.mode) {\n\t\t\tcase \"month\":\n\t\t\t\tvalue.month++;\n\t\t\t\tdate = luxon.DateTime.fromObject(value).setZone(this.timezone, { keepLocalTime: true }).setLocale(this.locale);\n\t\t\t\tbreak;\n\t\t\tcase \"list\":\n\t\t\tcase \"week\":\n\t\t\t\tdate = luxon.DateTime.fromJSDate(value[0]).setZone(this.timezone, { keepLocalTime: true }).setLocale(this.locale);\n\t\t\t\tbreak;\n\t\t\tcase \"day\":\n\t\t\t\tdate = luxon.DateTime.fromJSDate(value).setZone(this.timezone, { keepLocalTime: true }).setLocale(this.locale);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\treturn; // Don't update if the value is invalid!\n\t\t\t}\n\t\t\tthis.$emit(\"update:date\", date);\n\t\t},\n\t\tweekNumbers(date) {\n\t\t\treturn luxon.DateTime.fromJSDate(date, { locale: this.locale }).localWeekNumber;\n\t\t}\n\t},\n\ttemplate: /* html */`\n\t title\"\n\t\t:month-picker=\"mode == 'month'\"\n\t\t:week-picker=\"mode == 'week'\"\n\t\t:range=\"mode == 'list' ? { autoRange: listLength - 1 } : false\"\n\t\t:text-input=\"mode == 'day'\"\n\t\t:week-start=\"weekStart\"\n\t\t:week-numbers=\"{ type: weekNumbers }\"\n\t\t:clearable=\"false\"\n\t\t:enable-time-picker=\"false\"\n\t\t:config=\"{ keepActionRow: mode != 'month' }\"\n\t\t:action-row=\"{ showSelect: false, showCancel: false, showNow: mode != 'month', showPreview: false }\"\n\t\tauto-apply\n\t\tsix-weeks\n\t\tteleport\n\t\t:locale=\"locale\"\n\t\t:now-button-label=\"$p.t('calendar/today')\"\n\t\t:week-num-name=\"$p.t('calendar/kw')\"\n\t/>\n\t`\n}\n","export default {\n\tname: 'CalendarSlider',\n\tinject: {\n\t\ttime: {\n\t\t\tfrom: \"sliderTime\",\n\t\t\tdefault: \".3s\"\n\t\t}\n\t},\n\temits: [\n\t\t'slid'\n\t],\n\tdata() {\n\t\treturn {\n\t\t\ttarget: 0,\n\t\t\textrasAfter: 0,\n\t\t\textrasBefore: 0,\n\t\t\trunning: false,\n\t\t\tpromiseResolve: null\n\t\t}\n\t},\n\tcomputed: {\n\t\titemsAfter() {\n\t\t\treturn [...Array(this.extrasAfter)].map((i, k) => 1+k);\n\t\t},\n\t\titemsBefore() {\n\t\t\treturn [...Array(this.extrasBefore)].map((i, k) => k-this.extrasBefore);\n\t\t},\n\t\tstyleSlider() {\n\t\t\tconst style = {\n\t\t\t\tposition: 'absolute',\n\t\t\t\ttop: 0,\n\t\t\t\tleft: 0,\n\t\t\t\twidth: '100%',\n\t\t\t\theight: '100%'\n\t\t\t};\n\t\t\tif (this.running) {\n\t\t\t\tstyle.left = (-this.target * 100) + '%';\n\t\t\t\tstyle.transition = 'left ' + this.time + ' ease-in-out';\n\t\t\t}\n\t\t\treturn style;\n\t\t},\n\t\tstyleBefore() {\n\t\t\treturn {\n\t\t\t\tposition: 'absolute',\n\t\t\t\ttop: 0,\n\t\t\t\theight: '100%',\n\t\t\t\tdisplay: 'flex',\n\t\t\t\tright: '100%',\n\t\t\t\twidth: (this.extrasBefore * 100) + '%'\n\t\t\t};\n\t\t},\n\t\tstyleAfter() {\n\t\t\treturn {\n\t\t\t\tposition: 'absolute',\n\t\t\t\ttop: 0,\n\t\t\t\theight: '100%',\n\t\t\t\tdisplay: 'flex',\n\t\t\t\tleft: '100%',\n\t\t\t\twidth: (this.extrasAfter * 100) + '%'\n\t\t\t};\n\t\t}\n\t},\n\tmethods: {\n\t\tprevPage() {\n\t\t\treturn this.slidePages(-1);\n\t\t},\n\t\tnextPage() {\n\t\t\treturn this.slidePages(1);\n\t\t},\n\t\tslidePages(dir) {\n\t\t\treturn new Promise(resolve => {\n\t\t\t\tthis.promiseResolve = resolve;\n\t\t\t\tthis.running = true;\n\t\t\t\tconst newTarget = this.target + dir;\n\t\t\t\tif (newTarget > 0) {\n\t\t\t\t\tif (this.extrasAfter < newTarget)\n\t\t\t\t\t\tthis.extrasAfter = newTarget;\n\t\t\t\t} else if (newTarget < 0) {\n\t\t\t\t\tif (-this.extrasBefore > newTarget)\n\t\t\t\t\t\tthis.extrasBefore = -newTarget;\n\t\t\t\t}\n\t\t\t\tthis.target = newTarget;\n\t\t\t});\n\t\t},\n\t\tendSlide() {\n\t\t\tif (this.promiseResolve) {\n\t\t\t\tthis.promiseResolve(this.target);\n\t\t\t\tthis.promiseResolve = null;\n\t\t\t}\n\t\t\tthis.$emit('slid', this.target);\n\t\t\tthis.running = false;\n\t\t\tthis.target = 0;\n\t\t\tthis.extrasAfter = this.extrasBefore = 0;\n\t\t}\n\t},\n\ttemplate: /* html */`\n\t\n\t\t\n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\t\t\n\t\n\t`\n}\n","const clickListeners = [];\n\nfunction saveAddClickListener(el, source, value) {\n\tconst index = clickListeners.findIndex(data => data.el == el);\n\tif (index >= 0) {\n\t\tel.removeEventListener('click', clickListeners[index].listener);\n\t\tclickListeners.splice(index, 1);\n\t}\n\tconst listener = evt => {\n\t\tevt.preventDefault();\n\t\tevt.stopPropagation();\n\t\tconst customEvent = new CustomEvent('cal-click', {\n\t\t\tcancelable: true,\n\t\t\tbubbles: true,\n\t\t\tdetail: { source, value }\n\t\t});\n\t\tevt.target.dispatchEvent(customEvent);\n\t}\n\tclickListeners.push({el, listener});\n\tel.addEventListener('click', listener);\n}\n\nexport default {\n\tmounted(el, binding, vnode) {\n\t\tif (binding.arg == 'container') {\n\t\t\tel.addEventListener('cal-click', evt => {\n\t\t\t\tconst customEvent = new Event('click:' + evt.detail.source, {\n\t\t\t\t\tcancelable: true\n\t\t\t\t});\n\t\t\t\tbinding.instance.$emit('click:' + evt.detail.source, customEvent, evt.detail.value);\n\t\t\t\tif (!customEvent.defaultPrevented) {\n\t\t\t\t\tconst finalEvent = new CustomEvent('cal-click-default', {\n\t\t\t\t\t\tcancelable: true,\n\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\tdetail: evt.detail\n\t\t\t\t\t});\n\t\t\t\t\tevt.target.dispatchEvent(finalEvent);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsaveAddClickListener(el, binding.arg, binding.value);\n\t\t}\n\t},\n\tupdated(el, binding, vnode, prevVnode) {\n\t\tif (binding.arg != 'container') {\n\t\t\tsaveAddClickListener(el, binding.arg, binding.value);\n\t\t}\n\t}\n}","import BaseDraganddrop from './Base/DragAndDrop.js';\nimport BaseHeader from './Base/Header.js';\nimport BaseSlider from './Base/Slider.js';\nimport BsModal from '../Bootstrap/Modal.js';\n\nimport CalClick from '../../directives/Calendar/Click.js';\n\nexport default {\n\tname: \"CalendarBase\",\n\tcomponents: {\n\t\tBaseDraganddrop,\n\t\tBaseHeader,\n\t\tBaseSlider,\n\t\tBsModal\n\t},\n\tdirectives: {\n\t\tCalClick\n\t},\n\tprovide() {\n\t\treturn {\n\t\t\tlocale: Vue.computed(() => this.locale),\n\t\t\ttimezone: Vue.computed(() => this.timezone),\n\t\t\ttimeGrid: Vue.computed(() => this.timeGrid),\n\t\t\tdraggableEvents: Vue.computed(() => {\n\t\t\t\tif (!this.draggableEvents)\n\t\t\t\t\treturn () => false;\n\n\t\t\t\tif (Array.isArray(this.draggableEvents))\n\t\t\t\t\treturn event => this.draggableEvents.includes(event.type);\n\t\t\t\tif (this.draggableEvents instanceof Function)\n\t\t\t\t\treturn this.draggableEvents;\n\t\t\t\t\n\t\t\t\treturn () => true;\n\t\t\t}),\n\t\t\tdropableEvents: Vue.computed(() => {\n\t\t\t\tif (!this.onDrop)\n\t\t\t\t\treturn () => false;\n\n\t\t\t\tif (Array.isArray(this.dropableEvents))\n\t\t\t\t\treturn item => this.dropableEvents.includes(item.type);\n\t\t\t\tif (this.dropableEvents instanceof Function)\n\t\t\t\t\treturn this.dropableEvents;\n\n\t\t\t\treturn () => true;\n\t\t\t}),\n\t\t\thasDragoverFunc: Vue.computed(() => this.onDragover),\n\t\t\tmode: Vue.computed(() => this.mode)\n\t\t};\n\t},\n\tprops: {\n\t\tlocale: {\n\t\t\ttype: String,\n\t\t\tdefault: 'de'\n\t\t},\n\t\ttimezone: {\n\t\t\ttype: String,\n\t\t\trequired: true\n\t\t},\n\t\tdate: {\n\t\t\ttype: [Date, String, Number, luxon.DateTime],\n\t\t\tdefault: props => luxon.DateTime.now().setZone(props.timezone).startOf('day')\n\t\t},\n\t\tmodes: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t\tdefault: {}\n\t\t\t// TODO(chris): verfication functions\n\t\t},\n\t\tmode: String,\n\t\tmodeOptions: Object,\n\t\tevents: {\n\t\t\ttype: Array,\n\t\t\tdefault: []\n\t\t},\n\t\tbackgrounds: {\n\t\t\ttype: Array,\n\t\t\tdefault: []\n\t\t},\n\t\tshowBtns: Boolean,\n\t\tbtnMonth: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: undefined\n\t\t},\n\t\tbtnWeek: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: undefined\n\t\t},\n\t\tbtnDay: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: undefined\n\t\t},\n\t\tbtnList: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: undefined\n\t\t},\n\t\ttimeGrid: Array,\n\t\tdraggableEvents: [Boolean, Array, Function],\n\t\tdropableEvents: [Boolean, Array, Function],\n\t\tonDragover: Function,\n\t\tonDrop: Function\n\t},\n\temits: [\n\t\t\"click:next\",\n\t\t\"click:prev\",\n\t\t\"click:mode\",\n\t\t\"click:event\",\n\t\t\"click:day\",\n\t\t\"click:week\",\n\t\t\"update:date\",\n\t\t\"update:mode\",\n\t\t\"update:range\",\n\t\t\"drop\"\n\t],\n\tdata() {\n\t\treturn {\n\t\t\tinternalView: null,\n\t\t\tinternalDate: null,\n\t\t\tmodalEvent: null\n\t\t};\n\t},\n\tcomputed: {\n\t\tconvertedEvents() {\n\t\t\treturn this.events.map(orig => ({\n\t\t\t\tid: orig.type + orig[orig.type + '_id'],\n\t\t\t\ttype: orig.type,\n\t\t\t\tstart: luxon.DateTime.fromISO(orig.isostart).setZone(this.timezone),\n\t\t\t\tend: luxon.DateTime.fromISO(orig.isoend).setZone(this.timezone),\n\t\t\t\torig\n\t\t\t}));\n\t\t},\n\t\tconvertedBackgrounds() {\n\t\t\treturn this.backgrounds.map(bg => {\n\t\t\t\tconst res = { ...bg };\n\t\t\t\tif (res.start) {\n\t\t\t\t\tif (Number.isInteger(res.start))\n\t\t\t\t\t\tres.start = luxon.DateTime.fromMillis(res.start, { zone: this.timezone, locale: this.locale });\n\t\t\t\t\telse if (res.start instanceof Date)\n\t\t\t\t\t\tres.start = luxon.DateTime.fromJSDate(res.start, { zone: this.timezone, locale: this.locale });\n\t\t\t\t\telse if (typeof res.start === \n\t\t\t\t\t\t'string' || res.start instanceof String)\n\t\t\t\t\t\tres.start = luxon.DateTime.fromISO(res.start, { zone: this.timezone, locale: this.locale });\n\t\t\t\t}\n\t\t\t\tif (res.end) {\n\t\t\t\t\tif (Number.isInteger(res.end))\n\t\t\t\t\t\tres.end = luxon.DateTime.fromMillis(res.end, { zone: this.timezone, locale: this.locale });\n\t\t\t\t\telse if (res.end instanceof Date)\n\t\t\t\t\t\tres.end = luxon.DateTime.fromJSDate(res.end, { zone: this.timezone, locale: this.locale });\n\t\t\t\t\telse if (typeof res.end === \n\t\t\t\t\t\t'string' || res.end instanceof String)\n\t\t\t\t\t\tres.end = luxon.DateTime.fromISO(res.end, { zone: this.timezone, locale: this.locale });\n\t\t\t\t}\n\t\t\t\treturn res;\n\t\t\t});\n\t\t},\n\t\tsDate() {\n\t\t\tif (this.date instanceof luxon.DateTime)\n\t\t\t\treturn this.date;\n\t\t\treturn luxon.DateTime.fromJSDate(new Date(this.date)).setZone(this.timezone);\n\t\t},\n\t\tcDate: {\n\t\t\tget() {\n\t\t\t\tconst date = this.internalDate ? this.internalDate : this.sDate;\n\t\t\t\treturn date.setLocale(this.locale);\n\t\t\t},\n\t\t\tset(value) {\n\t\t\t\tthis.internalDate = value;\n\t\t\t\tthis.$emit('update:date', value, this.cMode);\n\t\t\t}\n\t\t},\n\t\tsMode() {\n\t\t\t// choose default mode\n\t\t\tlet mode = this.mode;\n\t\t\tif (mode)\n\t\t\t\tmode = mode.toLowerCase();\n\t\t\tif (!mode || !this.modes[mode])\n\t\t\t\tmode = Object.keys(this.modes).find(Boolean); // start with first entry as active mode\n\t\t\treturn mode || '';\n\t\t},\n\t\tcMode: {\n\t\t\tget() {\n\t\t\t\treturn this.internalView ? this.internalView : this.sMode;\n\t\t\t},\n\t\t\tset(value) {\n\t\t\t\tthis.internalView = value;\n\t\t\t\tthis.$emit('update:mode', value, this.cDate);\n\t\t\t}\n\t\t}\n\t},\n\twatch: {\n\t\tsDate(n, o) {\n\t\t\tif (this.sDate.isValid && !this.sDate.hasSame(this.internalDate, 'day'))\n\t\t\t\tthis.internalDate = this.sDate;\n\t\t},\n\t\tsMode() {\n\t\t\tif (this.sMode)\n\t\t\t\tthis.internalView = this.sMode;\n\t\t}\n\t},\n\tmethods: {\n\t\tclickPrev() {\n\t\t\tconst evt = new Event('click:prev', {cancelable: true});\n\t\t\tthis.$emit('click:prev', evt);\n\t\t\tif (evt.defaultPrevented)\n\t\t\t\treturn;\n\n\t\t\t// default: switch page\n\t\t\tthis.$refs.mode.prevPage();\n\t\t},\n\t\tclickNext() {\n\t\t\tconst evt = new Event('click:next', {cancelable: true});\n\t\t\tthis.$emit('click:next', evt);\n\t\t\tif (evt.defaultPrevented)\n\t\t\t\treturn;\n\n\t\t\t// default: switch page\n\t\t\tthis.$refs.mode.nextPage();\n\t\t},\n\t\thandleClickDefaults(evt) {\n\t\t\t// TODO(chris): implement\n\t\t\tswitch (evt.detail.source) {\n\t\t\tcase 'day':\n\t\t\t\tif (this.cMode != 'day' && this.modes['day']) {\n\t\t\t\t\tevt.stopPropagation();\n\t\t\t\t\tthis.cDate = evt.detail.value;\n\t\t\t\t\tthis.cMode = 'day';\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'week':\n\t\t\t\tif (this.cMode != 'week' && this.modes['week']) {\n\t\t\t\t\tevt.stopPropagation();\n\t\t\t\t\tthis.cDate = luxon.DateTime.fromObject({\n\t\t\t\t\t\tlocalWeekNumber: evt.detail.value.number,\n\t\t\t\t\t\tlocalWeekYear: evt.detail.value.year\n\t\t\t\t\t}, {\n\t\t\t\t\t\tzone: this.cDate.zoneName,\n\t\t\t\t\t\tlocale: this.cDate.locale\n\t\t\t\t\t});\n\t\t\t\t\tthis.cMode = 'week';\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t\tonDropItem(evt, start, end) {\n\t\t\tthis.$emit('drop', evt, start, end);\n\t\t},\n\t\tshowEventModal(eventObj) {\n\t\t\tthis.modalEvent = eventObj;\n\t\t\tthis.$refs.modal.show();\n\t\t},\n\t\thideEventModal() {\n\t\t\tif (this.modalEvent)\n\t\t\t\tthis.modalEvent.closeFn = undefined;\n\t\t\tthis.$refs.modal.hide();\n\t\t\tthis.modalEvent = null;\n\t\t},\n\t\tonModalHidden() {\n\t\t\tif (this.modalEvent.closeFn)\n\t\t\t\tthis.modalEvent.closeFn();\n\t\t}\n\t},\n\tbeforeUnmount() {\n\t\tthis.hideEventModal();\n\t},\n\ttemplate: /* html */`\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t
    \n\t`\n}\n","/**\n * Copyright (C) 2025 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tgetRoomInfo(ort_kurzbz, start_date, end_date) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/LvPlan/getRoomplan',\n\t\t\tparams: { ort_kurzbz, start_date, end_date }\n\t\t};\n\t},\n\tgetLvPlan(start_date, end_date, lv_id) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/LvPlan/getLvPlan',\n\t\t\tparams: { start_date, end_date, lv_id }\n\t\t};\n\t},\n\teventsPersonal(start_date, end_date) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/lvPlan/eventsPersonal',\n\t\t\tparams: { start_date, end_date }\n\t\t};\n\t},\n\teventsLv(lv_id, start_date, end_date) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/lvPlan/eventsLv',\n\t\t\tparams: { lv_id, start_date, end_date }\n\t\t};\n\t},\n\tgetStunden() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/LvPlan/Stunden'\n\t\t};\n\t},\n\tgetOrtReservierungen(ort_kurzbz, start_date, end_date) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: `/api/frontend/v1/LvPlan/getReservierungen/${ort_kurzbz}`,\n\t\t\tparams: { start_date, end_date }\n\t\t};\n\t},\n\tgetLvPlanReservierungen(start_date, end_date) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/LvPlan/getReservierungen',\n\t\t\tparams: { start_date, end_date }\n\t\t};\n\t},\n\tgetLehreinheitStudiensemester(lehreinheit_id) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: `/api/frontend/v1/LvPlan/getLehreinheitStudiensemester/${lehreinheit_id}`\n\t\t};\n\t},\n\tstudiensemesterDateInterval(date) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: `/api/frontend/v1/LvPlan/studiensemesterDateInterval/${date}`\n\t\t};\n\t},\n\tLvPlanEvents(start_date, end_date, lv_id) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/LvPlan/LvPlanEvents',\n\t\t\tparams: { \n\t\t\t\tstart_date: start_date, \n\t\t\t\tend_date: end_date, \n\t\t\t\tlv_id: lv_id \n\t\t\t}\n\t\t};\n\t},\n\tgetLv(lehrveranstaltung_id) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/LvPlan/getLv/' + lehrveranstaltung_id\n\t\t};\n\t}\n};","import CalDnd from '../../../../../directives/Calendar/DragAndDrop.js';\nimport CalClick from '../../../../../directives/Calendar/Click.js';\n\nexport default {\n\tname: \"GridLineEvent\",\n\tdirectives: {\n\t\tCalDnd,\n\t\tCalClick\n\t},\n\tinject: {\n\t\tdraggableEvents: \"draggableEvents\",\n\t\tmode: \"mode\"\n\t},\n\tprops: {\n\t\tevent: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t\tvalidator(value) {\n\t\t\t\treturn (value.start && value.end && value.orig);\n\t\t\t}\n\t\t}\n\t},\n\tcomputed: {\n\t\tisHeaderOrFooter() {\n\t\t\treturn ['header', 'footer'].includes(this.event.orig);\n\t\t},\n\t\tdraggable() {\n\t\t\treturn !this.isHeaderOrFooter && this.draggableEvents(this.event.orig, this.mode);\n\t\t},\n\t\tclasses() {\n\t\t\tconst classes = [];\n\t\t\tif (this.isHeaderOrFooter) {\n\t\t\t\tclasses.push('event-' + this.event.orig);\n\t\t\t} else {\n\t\t\t\tif (this.event.startsHere)\n\t\t\t\t\tclasses.push('event-begin');\n\t\t\t\tif (this.event.endsHere)\n\t\t\t\t\tclasses.push('event-end');\n\t\t\t}\n\t\t\treturn classes\n\t\t}\n\t},\n\ttemplate: /* html */`\n\t\n\t\t\n\t\t\t{{ event.orig }}\n\t\t\n\t\n\t`\n}\n","import GridLine from './Grid/Line.js';\nimport GridLineEvent from './Grid/Line/Event.js';\n\nimport CalDnd from '../../../directives/Calendar/DragAndDrop.js';\n\nexport default {\n\tname: \"CalendarGrid\",\n\tcomponents: {\n\t\tGridLine,\n\t\tGridLineEvent\n\t},\n\tdirectives: {\n\t\tCalDnd\n\t},\n\tinject: {\n\t\toriginalEvents: \"events\",\n\t\toriginalBackgrounds: \"backgrounds\",\n\t\tdropAllowed: \"dropAllowed\"\n\t},\n\tprovide() {\n\t\treturn {\n\t\t\tflipAxis: Vue.computed(() => this.flipAxis),\n\t\t\taxisRow: Vue.computed(() => this.axisRow)\n\t\t};\n\t},\n\tprops: {\n\t\taxisMain: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t\tvalidator(value) {\n\t\t\t\treturn value.every(item => item instanceof luxon.DateTime);\n\t\t\t}\n\t\t},\n\t\taxisParts: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t\tvalidator(value) {\n\t\t\t\treturn value.every(item =>\n\t\t\t\t\titem instanceof luxon.Duration\n\t\t\t\t\t|| Number.isInteger(item)\n\t\t\t\t\t|| (\n\t\t\t\t\t\t(\n\t\t\t\t\t\t\titem.start instanceof luxon.Duration\n\t\t\t\t\t\t\t|| Number.isInteger(item.start)\n\t\t\t\t\t\t) && (\n\t\t\t\t\t\t\titem.end instanceof luxon.Duration\n\t\t\t\t\t\t\t|| Number.isInteger(item.end)\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\tflipAxis: Boolean,\n\t\tallDayEvents: Boolean,\n\t\taxisMainCollapsible: Boolean,\n\t\tsnapToGrid: Boolean\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdragging: false,\n\t\t\tresizeObserver: null,\n\t\t\tmutationObserver: null,\n\t\t\tuserScroll: true\n\t\t};\n\t},\n\tcomputed: {\n\t\taxisRow() {\n\t\t\treturn this.flipAxis ? 'column' : 'row';\n\t\t},\n\t\taxisCol() {\n\t\t\treturn this.flipAxis ? 'row' : 'column';\n\t\t},\n\t\taxisPartsWithBreaks() {\n\t\t\treturn this.axisParts.reduce((res, tu, index) => {\n\t\t\t\tconst start = tu.start || tu;\n\t\t\t\tconst end = tu.end;\n\n\t\t\t\tif (res.length) {\n\t\t\t\t\tconst lastTuEnd = res.pop();\n\t\t\t\t\tif (Array.isArray(lastTuEnd)) {\n\t\t\t\t\t\tres.push({\n\t\t\t\t\t\t\tstart: lastTuEnd[0],\n\t\t\t\t\t\t\tend: start,\n\t\t\t\t\t\t\tindex: lastTuEnd[1]\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (lastTuEnd != start) {\n\t\t\t\t\t\t// add pause\n\t\t\t\t\t\tres.push({\n\t\t\t\t\t\t\tstart: lastTuEnd,\n\t\t\t\t\t\t\tend: start\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!end) {\n\t\t\t\t\tres.push([start, index]);\n\t\t\t\t} else {\n\t\t\t\t\tres.push({\n\t\t\t\t\t\tstart,\n\t\t\t\t\t\tend,\n\t\t\t\t\t\tindex\n\t\t\t\t\t});\n\t\t\t\t\tres.push(end);\n\t\t\t\t}\n\t\t\t\treturn res;\n\t\t\t}, []).slice(0, -1);\n\t\t},\n\t\taxisPartsSave() {\n\t\t\tif (!this.axisParts[this.axisParts.length - 1].end)\n\t\t\t\treturn this.axisParts.slice(0, -1);\n\t\t\treturn this.axisParts;\n\t\t},\n\t\tstart() {\n\t\t\treturn this.axisPartsWithBreaks[0].start;\n\t\t},\n\t\tend() {\n\t\t\treturn this.axisPartsWithBreaks[this.axisPartsWithBreaks.length - 1].end;\n\t\t},\n\t\tends() {\n\t\t\tconst ends = [];\n\t\t\tconst partsEnds = this.axisPartsWithBreaks\n\t\t\t\t.filter(p => p.index !== undefined)\n\t\t\t\t.map(p => p.end);\n\t\t\tfor (var date of this.axisMain)\n\t\t\t\tfor (var part of partsEnds)\n\t\t\t\t\tends.push(date.plus(part));\n\n\t\t\treturn ends;\n\t\t},\n\t\taxisMainBorders() {\n\t\t\treturn this.axisMain.reduce(\n\t\t\t\t(res, curr) => res.concat([curr.plus(this.start), curr.plus(this.end)]),\n\t\t\t\t[]\n\t\t\t);\n\t\t},\n\t\teventsAllDay() {\n\t\t\tif (!this.allDayEvents)\n\t\t\t\treturn [];\n\t\t\treturn this.mapIntoMainAxis(this.originalEvents.filter(event => event.orig.allDayEvent));\n\t\t},\n\t\teventsNormal() {\n\t\t\tif (!this.allDayEvents)\n\t\t\t\treturn this.events;\n\t\t\treturn this.mapIntoMainAxis(this.originalEvents.filter(event => !event.orig.allDayEvent));\n\t\t},\n\t\tevents() {\n\t\t\treturn this.mapIntoMainAxis(this.originalEvents);\n\t\t},\n\t\tbackgrounds() {\n\t\t\treturn this.mapIntoMainAxis(this.originalBackgrounds);\n\t\t},\n\t\thasValidEvents() {\n\t\t\treturn this.events.find(e => e.length);\n\t\t},\n\t\tstyleGridCols() {\n\t\t\tlet cols = 'repeat(' + this.axisMain.length + ', 1fr)';\n\t\t\tif (this.axisMainCollapsible) {\n\t\t\t\tif (this.hasValidEvents)\n\t\t\t\t\tcols = this.events\n\t\t\t\t\t\t.map(e => e.length\n\t\t\t\t\t\t\t? '1fr'\n\t\t\t\t\t\t\t: 'var(--fhc-calendar-axis-collapsible, .5fr)')\n\t\t\t\t\t\t.join(' ');\n\t\t\t}\n\t\t\treturn cols;\n\t\t},\n\t\tstyleGridRows() {\n\t\t\tconst gridlines = {};\n\n\t\t\tthis.axisPartsWithBreaks.forEach(part => {\n\t\t\t\tlet ts = part.start.toMillis();\n\t\t\t\tif (!gridlines[ts])\n\t\t\t\t\tgridlines[ts] = ['t_' + ts];\n\t\t\t\tif (part.index !== undefined)\n\t\t\t\t\tgridlines[ts].push('ps_' + part.index);\n\t\t\t\tts = part.end.toMillis();\n\t\t\t\tif (!gridlines[ts])\n\t\t\t\t\tgridlines[ts] = ['t_' + ts];\n\t\t\t\tif (part.index !== undefined)\n\t\t\t\t\tgridlines[ts].push('pe_' + part.index);\n\t\t\t});\n\n\t\t\tthis.eventsNormal.forEach((events, mainIndex) => {\n\t\t\t\tlet day = this.axisMain[mainIndex];\n\t\t\t\tevents.forEach(event => {\n\t\t\t\t\tif (!event.startsHere && !event.endsHere)\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tif (event.startsHere) {\n\t\t\t\t\t\tlet ts = event.start.diff(day).toMillis();\n\t\t\t\t\t\tif (!gridlines[ts])\n\t\t\t\t\t\t\tgridlines[ts] = ['t_' + ts, 'e_' + ts];\n\t\t\t\t\t}\n\t\t\t\t\tif (event.endsHere) {\n\t\t\t\t\t\tlet ts = event.end.diff(day).toMillis();\n\t\t\t\t\t\tif (!gridlines[ts])\n\t\t\t\t\t\t\tgridlines[ts] = ['t_' + ts, 'e_' + ts];\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn Object.keys(gridlines).sort((a,b) => parseInt(a)-parseInt(b)).map((start, i, keys) => {\n\t\t\t\tlet end = keys[i + 1];\n\t\t\t\tif (!end) {\n\t\t\t\t\tgridlines[start].push('end');\n\t\t\t\t\treturn '[' + gridlines[start].join(' ') + ']';\n\t\t\t\t}\n\t\t\t\treturn '[' + gridlines[start].join(' ') + '] ' + (end - start) + 'fr';\n\t\t\t}).join(' ');\n\t\t}\n\t},\n\tmethods: {\n\t\tmapIntoMainAxis(target) {\n\t\t\tconst result = Array.from({length: this.axisMain.length}, () => Array());\n\n\t\t\ttarget.forEach(event => {\n\t\t\t\tconst start = event.start || this.axisMainBorders[0].plus(-1);\n\t\t\t\tconst end = event.end || this.axisMainBorders[this.axisMainBorders.length - 1].plus(1);\n\n\t\t\t\tfor (var i = 0; i < this.axisMain.length; i++) {\n\t\t\t\t\tlet laneStart = this.axisMainBorders[i * 2];\n\t\t\t\t\tlet laneEnd = this.axisMainBorders[i * 2 + 1];\n\t\t\t\t\tif (event.orig?.allDayEvent) {\n\t\t\t\t\t\tlaneStart = laneStart.startOf('day');\n\t\t\t\t\t\tlaneEnd = laneEnd.endOf('day');\n\t\t\t\t\t}\n\t\t\t\t\tif (start < laneEnd && end > laneStart) {\n\t\t\t\t\t\tconst startsHere = start >= laneStart;\n\t\t\t\t\t\tconst endsHere = end <= laneEnd;\n\t\t\t\t\t\tresult[i].push({\n\t\t\t\t\t\t\t...event,\n\t\t\t\t\t\t\tstartsHere,\n\t\t\t\t\t\t\tendsHere\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn result;\n\t\t},\n\n\t\t/* DRAG AND DROP */\n\t\tgetPageTop(el) {\n\t\t\tlet pageTop = el.offsetTop;\n\t\t\tif (el.offsetParent)\n\t\t\t\tpageTop += this.getPageTop(el.offsetParent);\n\t\t\treturn pageTop;\n\t\t},\n\t\tgetPageLeft(el) {\n\t\t\tlet pageLeft = el.offsetLeft;\n\t\t\tif (el.offsetParent)\n\t\t\t\tpageLeft += this.getPageLeft(el.offsetParent);\n\t\t\treturn pageLeft;\n\t\t},\n\t\tgetTimestampFromMouse(evt, dayTimestamp) {\n\t\t\tlet mouse, mouseFrac;\n\t\t\tif (this.flipAxis) {\n\t\t\t\tmouse = evt.pageX - this.getPageLeft(this.$refs.body) + this.$refs.main.scrollLeft;\n\t\t\t\tmouseFrac = mouse / this.$refs.body.offsetWidth;\n\t\t\t} else {\n\t\t\t\tmouse = evt.pageY - this.getPageTop(this.$refs.body) + this.$refs.main.scrollTop;\n\t\t\t\tmouseFrac = mouse / this.$refs.body.offsetHeight;\n\t\t\t}\n\n\t\t\treturn dayTimestamp + this.start + Math.floor((this.end - this.start) * mouseFrac);\n\t\t},\n\n\t\t/* SCROLLING */\n\t\tenableAutoScroll() {\n\t\t\tif (!this.resizeObserver)\n\t\t\t\tthis.resizeObserver = new ResizeObserver(this.scrollToEarliestEvent);\n\t\t\tthis.resizeObserver.observe(this.$refs.body);\n\n\t\t\tif (!this.mutationObserver)\n\t\t\t\tthis.mutationObserver = new MutationObserver(mutations => {\n\t\t\t\t\tif (mutations.some(m => m.addedNodes.length && [].some.call(m.addedNodes, el => el.matches && el.matches('.fhc-calendar-base-grid-line-event'))))\n\t\t\t\t\t\tthis.scrollToEarliestEvent();\n\t\t\t\t});\n\t\t\tthis.mutationObserver.observe(this.$refs.body, {\n\t\t\t\tsubtree: true,\n\t\t\t\tchildList: true\n\t\t\t});\n\n\t\t\tthis.scrollToEarliestEvent();\n\t\t},\n\t\tdisableAutoScroll() {\n\t\t\tif (this.resizeObserver)\n\t\t\t\tthis.resizeObserver.disconnect();\n\t\t\tthis.resizeObserver = null;\n\n\t\t\tif (this.mutationObserver)\n\t\t\t\tthis.mutationObserver.disconnect();\n\t\t\tthis.mutationObserver = null;\n\t\t},\n\t\tscrollToEarliestEvent() {\n\t\t\tconst eventElements = this.$refs.scroller.querySelectorAll('.fhc-calendar-base-grid-line-event');\n\n\t\t\tlet earliestEventOffset = [0, null];\n\t\t\tfor (var el of eventElements.values()) {\n\t\t\t\tconst top = el.offsetTop;\n\t\t\t\tif (!earliestEventOffset[1] || top < earliestEventOffset[0])\n\t\t\t\t\tearliestEventOffset = [top, el];\n\t\t\t}\n\n\t\t\tthis.userScroll = false;\n\t\t\tif (earliestEventOffset[1]) {\n\t\t\t\tearliestEventOffset[1].scrollIntoView({ behavior: \"smooth\" });\n\t\t\t} else {\n\t\t\t\tthis.$refs.scroller.scrollTo(0, 0);\n\t\t\t}\n\t\t}\n\t},\n\tbeforeUnmount() {\n\t\tthis.disableAutoScroll();\n\t},\n\ttemplate: /* html */`\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t end > date))}\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\t`\n}\n","import LineEvent from './Line/Event.js';\nimport LineBackground from './Line/Background.js';\n\n/**\n * TODO(chris):\n * Event overflow for Month mode (more-button)\n */\n\nexport default {\n\tname: \"GridLine\",\n\tcomponents: {\n\t\tLineEvent,\n\t\tLineBackground\n\t},\n\tinject: {\n\t\taxisRow: \"axisRow\"\n\t},\n\tprops: {\n\t\tdate: {\n\t\t\ttype: luxon.DateTime,\n\t\t\trequired: true\n\t\t},\n\t\tstart: {\n\t\t\ttype: luxon.DateTime,\n\t\t\trequired: true\n\t\t},\n\t\tend: {\n\t\t\ttype: luxon.DateTime,\n\t\t\trequired: true\n\t\t},\n\t\tevents: {\n\t\t\ttype: Array,\n\t\t\tdefault: []\n\t\t},\n\t\tbackgrounds: {\n\t\t\ttype: Array,\n\t\t\tdefault: []\n\t\t}\n\t},\n\tcomputed: {\n\t\teventsWithRowInfo() {\n\t\t\tconst events = [];\n\t\t\tthis.events.forEach(event => {\n\t\t\t\tconst rows = [1, -1];\n\t\t\t\tif (event.startsHere) {\n\t\t\t\t\trows[0] = 't_' + event.start.diff(this.date).toMillis();\n\t\t\t\t}\n\t\t\t\tif (event.endsHere) {\n\t\t\t\t\trows[1] = 't_' + event.end.diff(this.date).toMillis();\n\t\t\t\t}\n\n\t\t\t\tevents.push({\n\t\t\t\t\t...event,\n\t\t\t\t\trows\n\t\t\t\t});\n\t\t\t});\n\t\t\treturn events;\n\t\t}\n\t},\n\ttemplate: /* html */`\n\t\n\t\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t`\n}\n","export default {\n\tname: \"GridLineBackground\",\n\tinject: {\n\t\tflipAxis: \"flipAxis\"\n\t},\n\tprops: {\n\t\tstart: {\n\t\t\ttype: luxon.DateTime,\n\t\t\trequired: true\n\t\t},\n\t\tend: {\n\t\t\ttype: luxon.DateTime,\n\t\t\trequired: true\n\t\t},\n\t\tbackground: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t\tvalidator(value) {\n\t\t\t\tif (!value.start && !value.end)\n\t\t\t\t\treturn false;\n\t\t\t\tif (value.start && !(value.start instanceof luxon.DateTime))\n\t\t\t\t\treturn false;\n\t\t\t\tif (value.end && !(value.end instanceof luxon.DateTime))\n\t\t\t\t\treturn false;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t},\n\tcomputed: {\n\t\tstyles() {\n\t\t\tif (!this.background.endsHere && !this.background.startsHere)\n\t\t\t\treturn this.background.style;\n\n\t\t\tconst perc = (this.end.ts - this.start.ts) / 100;\n\t\t\t\n\t\t\tlet border = {};\n\t\t\tif (this.background.startsHere)\n\t\t\t\tborder[this.flipAxis ? 'left' : 'top'] = (this.background.start.diff(this.start)) / perc + '%';\n\t\t\tif (this.background.endsHere)\n\t\t\t\tborder[this.flipAxis ? 'right' : 'bottom'] = (this.end.diff(this.background.end)) / perc + '%';\n\n\t\t\tif (!this.background.style)\n\t\t\t\treturn border;\n\t\t\t\n\t\t\treturn [this.background.style, border];\n\t\t},\n\t\tclasses() {\n\t\t\tif (!this.background.endsHere && !this.background.startsHere)\n\t\t\t\treturn this.background.class;\n\t\t\t\n\t\t\tconst result = [];\n\t\t\tif (this.background.class)\n\t\t\t\tresult.push(this.background.class);\n\t\t\tif (this.background.startsHere)\n\t\t\t\tresult.push('bg-begin');\n\t\t\tif (this.background.endsHere)\n\t\t\t\tresult.push('bg-end');\n\t\t\treturn result;\n\t\t}\n\t},\n\ttemplate: /* html */`\n\t\n\t\t{{ background.label }}\n\t\n\t`\n}\n","import CalClick from '../../../../directives/Calendar/Click.js';\n\nexport default {\n\tname: \"LabelDay\",\n\tdirectives: {\n\t\tCalClick\n\t},\n\tprops: {\n\t\tdate: {\n\t\t\ttype: luxon.DateTime,\n\t\t\trequired: true\n\t\t}\n\t},\n\tcomputed: {\n\t\ttitleFull() {\n\t\t\treturn this.date.toLocaleString({day: 'numeric', month: 'long', year: 'numeric'});\n\t\t},\n\t\ttitleLong() {\n\t\t\treturn this.date.toLocaleString({day: '2-digit', month: '2-digit', year: 'numeric'});\n\t\t},\n\t\ttitleShort() {\n\t\t\treturn this.date.toLocaleString({day: 'numeric', month: 'numeric'});\n\t\t},\n\t\ttitleNarrow() {\n\t\t\treturn this.date.toLocaleString({day: 'numeric'});\n\t\t}\n\t},\n\ttemplate: /* html */`\n\t\n\t\t{{ titleFull }}\n\t\t{{ titleLong }}\n\t\t{{ titleShort }}\n\t\t{{ titleNarrow }}\n\t\n\t`\n}\n","import CalClick from '../../../../directives/Calendar/Click.js';\n\nexport default {\n\tname: \"LabelDow\",\n\tdirectives: {\n\t\tCalClick\n\t},\n\tprops: {\n\t\tdate: {\n\t\t\ttype: luxon.DateTime,\n\t\t\trequired: true\n\t\t}\n\t},\n\tcomputed: {\n\t\ttitleLong() {\n\t\t\treturn this.date.toLocaleString({weekday: 'long'});\n\t\t},\n\t\ttitleShort() {\n\t\t\treturn this.date.toLocaleString({weekday: 'short'});\n\t\t},\n\t\ttitleNarrow() {\n\t\t\treturn this.date.toLocaleString({weekday: 'narrow'});\n\t\t}\n\t},\n\ttemplate: /* html */`\n\t\n\t\t{{ titleLong }}\n\t\t{{ titleShort }}\n\t\t{{ titleNarrow }}\n\t\n\t`\n}\n","export default {\n\tname: \"LabelTime\",\n\tprops: {\n\t\tpart: {\n\t\t\ttype: [luxon.Duration, Number, Object],\n\t\t\trequired: true,\n\t\t\tvalidator(value) {\n\t\t\t\tif (value instanceof Object) {\n\t\t\t\t\tif (value instanceof luxon.Duration)\n\t\t\t\t\t\treturn true;\n\t\t\t\t\tlet start_ok = true;\n\t\t\t\t\tlet end_ok = true;\n\t\t\t\t\tif (value.start) {\n\t\t\t\t\t\tstart_ok = (\n\t\t\t\t\t\t\tvalue.start instanceof luxon.Duration\n\t\t\t\t\t\t\t|| Number.isInteger(value.start)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (value.end) {\n\t\t\t\t\t\tend_ok = (\n\t\t\t\t\t\t\tvalue.end instanceof luxon.Duration\n\t\t\t\t\t\t\t|| Number.isInteger(value.end)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn start_ok && end_ok;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t},\n\tcomputed: {\n\t\tsanitizedTimestamps() {\n\t\t\treturn this.part.start || this.part.end ? this.part : { start: this.part };\n\t\t},\n\t\tstart() {\n\t\t\tif (!this.sanitizedTimestamps.start)\n\t\t\t\treturn null;\n\t\t\treturn this.formatTime(this.sanitizedTimestamps.start);\n\t\t},\n\t\tend() {\n\t\t\tif (!this.sanitizedTimestamps.end)\n\t\t\t\treturn null;\n\t\t\treturn this.formatTime(this.sanitizedTimestamps.end);\n\t\t}\n\t},\n\tmethods: {\n\t\tformatTime(date) {\n\t\t\treturn date.toISOTime({ suppressSeconds: true });\n\t\t}\n\t},\n\ttemplate: `\n\t
    \n\t\t{{ start }}\n\t\t-\n\t\t{{ end }}\n\t
    \n\t`\n}\n","import CalendarGrid from '../../Base/Grid.js';\nimport LabelDay from '../../Base/Label/Day.js';\nimport LabelDow from '../../Base/Label/Dow.js';\nimport LabelTime from '../../Base/Label/Time.js';\n\nimport { useResizeObserver } from '../../../../composables/Responsive.js';\n\nexport default {\n\tname: \"DayView\",\n\tcomponents: {\n\t\tCalendarGrid,\n\t\tLabelDay,\n\t\tLabelDow,\n\t\tLabelTime\n\t},\n\tinject: {\n\t\ttimeGrid: \"timeGrid\",\n\t\toriginalEvents: \"events\",\n\t\ttimezone: \"timezone\"\n\t},\n\tprops: {\n\t\tday: {\n\t\t\ttype: luxon.DateTime,\n\t\t\trequired: true\n\t\t},\n\t\temptyMessage: String,\n\t\temptyMessageDetails: String\n\t},\n\temits: [\n\t\t\"requestModalOpen\",\n\t\t\"requestModalClose\"\n\t],\n\tdata() {\n\t\treturn {\n\t\t\tchosenEvent: null,\n\t\t\tgridMainRef: null\n\t\t};\n\t},\n\tcomputed: {\n\t\taxisMain() {\n\t\t\treturn [this.day.startOf('day')];\n\t\t},\n\t\taxisParts() {\n\t\t\tif (this.timeGrid) {\n\t\t\t\t// create {start, end} array\n\t\t\t\treturn this.timeGrid.map(tu => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstart: luxon.Duration.fromISOTime(tu.start),\n\t\t\t\t\t\tend: luxon.Duration.fromISOTime(tu.end)\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// create 07:00-23:00\n\t\t\t\treturn Array.from({ length: 17 }, (e, i) => luxon.Duration.fromObject({ hours: i + 7 }));\n\t\t\t}\n\t\t},\n\t\tevents() {\n\t\t\treturn this.originalEvents\n\t\t\t\t.filter(event => event.start < this.day.plus({ days: 1 }) && event.end > this.day)\n\t\t\t\t.sort((a, b) => a.start.ts - b.start.ts)\n\t\t\t\t.map(evt => evt.orig);\n\t\t},\n\t\tcurrentEvent() {\n\t\t\tif (this.chosenEvent) {\n\t\t\t\tif (this.events.find(e => e == this.chosenEvent))\n\t\t\t\t\treturn this.chosenEvent;\n\t\t\t}\n\t\t\tlet first = null;\n\t\t\tif (this.events)\n\t\t\t\tfirst = this.events.find(Boolean); // undefined => none found\n\n\t\t\tif (first && first.type == 'loading')\n\t\t\t\treturn null; // null => loading\n\n\t\t\treturn first;\n\t\t},\n\t\tisToday() {\n\t\t\treturn this.day.hasSame(luxon.DateTime.now().setZone(this.timezone), 'day');\n\t\t}\n\t},\n\twatch: {\n\t\tcompact() {\n\t\t\tif (this.compact) {\n\t\t\t\tif (this.chosenEvent) {\n\t\t\t\t\tthis.$emit('requestModalOpen', {\n\t\t\t\t\t\tevent: this.chosenEvent,\n\t\t\t\t\t\tcloseFn: () => { this.chosenEvent = null; }\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.$emit('requestModalClose');\n\t\t\t}\n\t\t}\n\t},\n\tmethods: {\n\t\thandleClickDefaults(evt) {\n\t\t\tif (evt.detail.source == 'event') {\n\t\t\t\tthis.chosenEvent = evt.detail.value;\n\t\t\t\tif (this.compact) {\n\t\t\t\t\tthis.$emit('requestModalOpen', {\n\t\t\t\t\t\tevent: this.chosenEvent,\n\t\t\t\t\t\tcloseFn: () => { this.chosenEvent = null; }\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\tsetup() {\n\t\tconst container = Vue.ref(null); // use useTemplateRef when updating to Vue 3.5\n\t\tconst { compact } = useResizeObserver(container, 750);\n\n\t\treturn {\n\t\t\tcontainer, // must be exposed or it won't be set in Vue < 3.5\n\t\t\tcompact\n\t\t};\n\t},\n\tmounted() {\n\t\tthis.gridMainRef = this.$refs.grid.$refs.main;\n\t},\n\ttemplate: /* html */`\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t{{ emptyMessage }}\n\t\t\t\n\t\t\n\t\t
    \n\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t\t

    {{ emptyMessageDetails }}

    \n\t\t\t\n\t\t\n\t\n\t`\n}\n","import BaseSlider from '../Base/Slider.js';\nimport DayView from './Day/View.js';\n\nexport default {\n\tname: \"ModeDay\",\n\tcomponents: {\n\t\tBaseSlider,\n\t\tDayView\n\t},\n\tprops: {\n\t\tcurrentDate: {\n\t\t\ttype: luxon.DateTime,\n\t\t\trequired: true\n\t\t}\n\t},\n\temits: [\n\t\t\"update:currentDate\",\n\t\t\"update:range\",\n\t\t\"click\",\n\t\t\"requestModalOpen\",\n\t\t\"requestModalClose\"\n\t],\n\tdata() {\n\t\treturn {\n\t\t\tfocusDate: this.currentDate,\n\t\t\trangeOffset: 0\n\t\t};\n\t},\n\tcomputed: {\n\t\trange() {\n\t\t\tlet first = this.focusDate.startOf('day');\n\t\t\tlet last = this.focusDate.endOf('day');\n\t\t\t\n\t\t\tif (this.rangeOffset != 0) {\n\t\t\t\tif (this.rangeOffset < 0) {\n\t\t\t\t\tfirst = first.plus({ days: this.rangeOffset });\n\t\t\t\t} else {\n\t\t\t\t\tlast = last.plus({ days: this.rangeOffset });\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn luxon.Interval.fromDateTimes(first, last);\n\t\t}\n\t},\n\twatch: {\n\t\tcurrentDate() {\n\t\t\tif (this.currentDate.locale != this.focusDate.locale) {\n\t\t\t\tthis.focusDate = this.currentDate;\n\t\t\t\tthis.$emit('update:range', this.range);\n\t\t\t} else {\n\t\t\t\tthis.rangeOffset = this.currentDate.startOf('day').diff(this.focusDate.startOf('day'), 'days').days;\n\t\t\t\tif (this.rangeOffset) {\n\t\t\t\t\tthis.$refs.view.$refs.grid.disableAutoScroll();\n\t\t\t\t\tthis.$emit('update:range', this.range);\n\t\t\t\t\tthis.$refs.slider.slidePages(this.rangeOffset).then(this.updatePage);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\tmethods: {\n\t\tprevPage() {\n\t\t\tthis.rangeOffset = this.$refs.slider.target - 1;\n\t\t\tthis.$refs.view.$refs.grid.disableAutoScroll();\n\t\t\tthis.$emit('update:range', this.range);\n\t\t\tthis.$refs.slider.prevPage().then(this.updatePage);\n\t\t},\n\t\tnextPage() {\n\t\t\tthis.rangeOffset = this.$refs.slider.target + 1;\n\t\t\tthis.$refs.view.$refs.grid.disableAutoScroll();\n\t\t\tthis.$emit('update:range', this.range);\n\t\t\tthis.$refs.slider.nextPage().then(this.updatePage);\n\t\t},\n\t\tupdatePage(days) {\n\t\t\tconst newFocusDate = this.focusDate.plus({ days });\n\t\t\tthis.focusDate = newFocusDate;\n\t\t\tthis.rangeOffset = 0;\n\t\t\tthis.$emit('update:currentDate', this.focusDate);\n\t\t\tthis.$emit('update:range', this.range);\n\t\t\tthis.$refs.view.$refs.grid.enableAutoScroll();\n\t\t},\n\t\tviewAttrs(days) {\n\t\t\tconst day = this.focusDate.plus({ days });\n\t\t\treturn { ...this.$attrs, day };\n\t\t}\n\t},\n\tmounted() {\n\t\tthis.$emit('update:range', this.range);\n\t\tthis.$refs.view.$refs.grid.enableAutoScroll();\n\t},\n\ttemplate: `\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\t`\n}\n","/**\n * size returns the key of smallest threshold array (integer converts to\n * { compact: threshold }) entry that is bigger than the current width of\n * the element or 'full' if none is found.\n * compact is true if the smallest threshold array entry is bigger than the\n * current width or false otherwise.\n *\n * @param DOMElement|VueTemplateRef\t\telement\n * @param object|array|integer\t\t\tthreshold\n * @return object\t\t\t\t\t\t{ compact:Boolean, size:String }\n */\nexport function useResizeObserver(element, threshold) {\n\t/* Result Vars */\n\tconst compact = Vue.ref(false);\n\tconst size = Vue.ref(false);\n\n\t/* Helper Vars */\n\tconst mounted = Vue.ref(false);\n\tconst elementRef = Vue.computed(() => {\n\t\tif (!Vue.isRef(element))\n\t\t\treturn element;\n\t\t\n\t\tif (!element.value)\n\t\t\treturn element.value;\n\t\t\n\t\tif (element.value.$el) // Maybe there is a better test\n\t\t\treturn element.value.$el;\n\n\t\treturn element.value;\n\t});\n\tconst compareArray = Vue.computed(() => {\n\t\tconst input = Vue.isRef(threshold) ? threshold.value : threshold;\n\t\tif (Number.isInteger(input))\n\t\t\treturn [['compact', input]];\n\t\tif (Array.isArray(input))\n\t\t\treturn input.map((value, key) => [key, value]).sort((a, b) => a[1]-b[1]);\n\t\treturn Object.entries(input).sort((a, b) => a[1]-b[1]);\n\t});\n\n\t/* Helper Functions */\n\tfunction updateResultVars() {\n\t\tconst compare = threshold.value || threshold;\n\t\tif (elementRef.value.offsetWidth === undefined)\n\t\t\treturn;\n\n\t\tconst found = compareArray.value.find(compare => compare[1] > elementRef.value.offsetWidth);\n\n\t\tsize.value = found ? found[0] : 'full';\n\t\tcompact.value = (size.value == compareArray.value[0][0]);\n\t}\n\n\t/* Observer */\n\tconst observer = new ResizeObserver(() => {\n\t\tif (elementRef.value) {\n\t\t\tupdateResultVars();\n\t\t}\n\t});\n\t/* Observer Helper Functions */\n\tfunction addObserver() {\n\t\tif (!elementRef.value)\n\t\t\treturn;\n\n\t\tupdateResultVars();\n\t\tobserver.observe(elementRef.value);\n\t\tmounted.value = true;\n\t}\n\tfunction removeObserver() {\n\t\tif (mounted.value) {\n\t\t\tobserver.disconnect()\n\t\t}\n\t}\n\n\t/* Main Logic */\n\tVue.onMounted(addObserver);\n\tVue.onUnmounted(removeObserver);\n\t\n\tVue.watchEffect(() => {\n\t\tif (elementRef.value) {\n\t\t\tremoveObserver();\n\t\t\taddObserver();\n\t\t}\n\t});\n\n\treturn { compact, size };\n}","import BaseSlider from '../Base/Slider.js';\nimport WeekView from './Week/View.js';\n\nexport default {\n\tname: \"ModeWeek\",\n\tcomponents: {\n\t\tBaseSlider,\n\t\tWeekView\n\t},\n\tprops: {\n\t\tcurrentDate: {\n\t\t\ttype: luxon.DateTime,\n\t\t\trequired: true\n\t\t}\n\t},\n\temits: [\n\t\t\"update:currentDate\",\n\t\t\"update:range\",\n\t\t\"click\",\n\t\t\"requestModalOpen\"\n\t],\n\tdata() {\n\t\treturn {\n\t\t\tfocusDate: this.currentDate,\n\t\t\trangeOffset: 0\n\t\t};\n\t},\n\tcomputed: {\n\t\trange() {\n\t\t\tlet first = this.focusDate.startOf('week', { useLocaleWeeks: true });\n\t\t\tlet last = this.focusDate.endOf('week', { useLocaleWeeks: true });\n\n\t\t\tif (this.rangeOffset != 0) {\n\t\t\t\tif (this.rangeOffset < 0) {\n\t\t\t\t\tfirst = first.plus({ weeks: this.rangeOffset });\n\t\t\t\t} else {\n\t\t\t\t\tlast = last.plus({ weeks: this.rangeOffset });\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn luxon.Interval.fromDateTimes(first, last);\n\t\t}\n\t},\n\twatch: {\n\t\tcurrentDate() {\n\t\t\tif (this.currentDate.locale != this.focusDate.locale) {\n\t\t\t\tthis.focusDate = this.currentDate;\n\t\t\t\tthis.$emit('update:range', this.range);\n\t\t\t} else {\n\t\t\t\tthis.rangeOffset = this.currentDate.startOf('week', { useLocaleWeeks: true }).diff(this.focusDate.startOf('week', { useLocaleWeeks: true }), 'weeks').weeks;\n\t\t\t\tif (this.rangeOffset) {\n\t\t\t\t\tthis.$refs.view.$refs.grid.disableAutoScroll();\n\t\t\t\t\tthis.$emit('update:range', this.range);\n\t\t\t\t\tthis.$refs.slider.slidePages(this.rangeOffset).then(this.updatePage);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\tmethods: {\n\t\tprevPage() {\n\t\t\tthis.rangeOffset = this.$refs.slider.target - 1;\n\t\t\tthis.$refs.view.$refs.grid.disableAutoScroll();\n\t\t\tthis.$emit('update:range', this.range);\n\t\t\tthis.$refs.slider.prevPage().then(this.updatePage);\n\t\t},\n\t\tnextPage() {\n\t\t\tthis.rangeOffset = this.$refs.slider.target + 1;\n\t\t\tthis.$refs.view.$refs.grid.disableAutoScroll();\n\t\t\tthis.$emit('update:range', this.range);\n\t\t\tthis.$refs.slider.nextPage().then(this.updatePage);\n\t\t},\n\t\tupdatePage(weeks) {\n\t\t\tconst newFocusDate = this.focusDate.plus({ weeks });\n\t\t\tthis.focusDate = newFocusDate;\n\t\t\tthis.rangeOffset = 0;\n\t\t\tthis.$emit('update:currentDate', this.focusDate);\n\t\t\tthis.$emit('update:range', this.range);\n\t\t\tthis.$refs.view.$refs.grid.enableAutoScroll();\n\t\t},\n\t\tviewAttrs(weeks) {\n\t\t\tconst day = this.focusDate.plus({ weeks });\n\t\t\treturn { ...this.$attrs, day };\n\t\t},\n\t\thandleClickDefaults(evt) {\n\t\t\tswitch (evt.detail.source) {\n\t\t\tcase 'day':\n\t\t\t\t// default: Set current-date\n\t\t\t\tthis.$emit('update:currentDate', evt.detail.value);\n\t\t\t\tbreak;\n\t\t\tcase 'event':\n\t\t\t\t// default: Request Modal\n\t\t\t\tthis.$emit('requestModalOpen', { event: evt.detail.value });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t},\n\tmounted() {\n\t\tthis.$emit('update:range', this.range);\n\t\tthis.$refs.view.$refs.grid.enableAutoScroll();\n\t},\n\ttemplate: `\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\t`\n}\n","import CalendarGrid from '../../Base/Grid.js';\nimport LabelDay from '../../Base/Label/Day.js';\nimport LabelDow from '../../Base/Label/Dow.js';\nimport LabelTime from '../../Base/Label/Time.js';\n\nexport default {\n\tname: \"WeekView\",\n\tcomponents: {\n\t\tCalendarGrid,\n\t\tLabelDay,\n\t\tLabelDow,\n\t\tLabelTime\n\t},\n\tinject: {\n\t\ttimeGrid: \"timeGrid\",\n\t\ttimezone: \"timezone\"\n\t},\n\tprops: {\n\t\tday: {\n\t\t\ttype: luxon.DateTime,\n\t\t\trequired: true\n\t\t},\n\t\tcollapseEmptyDays: Boolean\n\t},\n\tcomputed: {\n\t\tstart() {\n\t\t\treturn this.day.startOf('week', { useLocaleWeeks: true });\n\t\t},\n\t\taxisMain() {\n\t\t\treturn Array.from({ length: 7 }, (e, i) => this.start.plus({ days: i }));\n\t\t},\n\t\taxisParts() {\n\t\t\tif (this.timeGrid) {\n\t\t\t\t// create {start, end} array\n\t\t\t\treturn this.timeGrid.map(tu => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstart: luxon.Duration.fromISOTime(tu.start),\n\t\t\t\t\t\tend: luxon.Duration.fromISOTime(tu.end)\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// create 07:00-23:00\n\t\t\t\treturn Array.from({ length: 17 }, (e, i) => luxon.Duration.fromObject({ hours: i + 7 }));\n\t\t\t}\n\t\t}\n\t},\n\tmethods: {\n\t\tisToday(date) {\n\t\t\treturn date.hasSame(luxon.DateTime.now().setZone(this.timezone), 'day');\n\t\t}\n\t},\n\ttemplate: /* html */`\n\t
    \n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t
    \n\t`\n}\n","import BaseSlider from '../Base/Slider.js';\nimport MonthView from './Month/View.js';\n\nexport default {\n\tname: \"ModeMonth\",\n\tcomponents: {\n\t\tBaseSlider,\n\t\tMonthView\n\t},\n\tprops: {\n\t\tcurrentDate: {\n\t\t\ttype: luxon.DateTime,\n\t\t\trequired: true\n\t\t}\n\t},\n\temits: [\n\t\t\"update:currentDate\",\n\t\t\"update:range\",\n\t\t\"click\",\n\t\t\"requestModalOpen\"\n\t],\n\tdata() {\n\t\treturn {\n\t\t\tfocusDate: this.currentDate,\n\t\t\trangeOffset: 0\n\t\t};\n\t},\n\tcomputed: {\n\t\trange() {\n\t\t\tlet first = this.focusDate.startOf('month').startOf('week', { useLocaleWeeks: true });\n\t\t\tlet last = first.plus({ days: 41 }).endOf('day'); // NOTE(chris): 6 weeks minus 1 day\n\n\t\t\tif (this.rangeOffset != 0) {\n\t\t\t\tconst nextFocusDate = this.focusDate.plus({ months: this.rangeOffset});\n\t\t\t\tconst nextRangeStart = nextFocusDate.startOf('month').startOf('week', { useLocaleWeeks: true });\n\t\t\t\tif (this.rangeOffset < 0) {\n\t\t\t\t\tfirst = nextRangeStart;\n\t\t\t\t} else {\n\t\t\t\t\tlast = nextRangeStart.plus({ days: 41 }).endOf('day');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn luxon.Interval.fromDateTimes(first, last);\n\t\t}\n\t},\n\twatch: {\n\t\tcurrentDate() {\n\t\t\tif (this.currentDate.locale != this.focusDate.locale) {\n\t\t\t\tthis.focusDate = this.currentDate;\n\t\t\t\tthis.$emit('update:range', this.range);\n\t\t\t} else {\n\t\t\t\tthis.rangeOffset = this.currentDate.startOf('month').diff(this.focusDate.startOf('month'), 'months').months;\n\t\t\t\tif (this.rangeOffset) {\n\t\t\t\t\tthis.$emit('update:range', this.range);\n\t\t\t\t\tthis.$refs.slider.slidePages(this.rangeOffset).then(this.updatePage);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\tmethods: {\n\t\tprevPage() {\n\t\t\tthis.rangeOffset = this.$refs.slider.target - 1;\n\t\t\tthis.$emit('update:range', this.range);\n\t\t\tthis.$refs.slider.prevPage().then(this.updatePage);\n\t\t},\n\t\tnextPage() {\n\t\t\tthis.rangeOffset = this.$refs.slider.target + 1;\n\t\t\tthis.$emit('update:range', this.range);\n\t\t\tthis.$refs.slider.nextPage().then(this.updatePage);\n\t\t},\n\t\tupdatePage(months) {\n\t\t\tconst newFocusDate = this.focusDate.plus({ months });\n\t\t\tthis.focusDate = newFocusDate;\n\t\t\tthis.rangeOffset = 0;\n\t\t\tthis.$emit('update:currentDate', this.focusDate);\n\t\t\tthis.$emit('update:range', this.range);\n\t\t},\n\t\tviewAttrs(months) {\n\t\t\tconst day = this.focusDate.plus({ months });\n\t\t\treturn { day };\n\t\t},\n\t\thandleClickDefaults(evt) {\n\t\t\tswitch (evt.detail.source) {\n\t\t\tcase 'week':\n\t\t\t\t// default: Move to week if not in month\n\t\t\t\tlet dayInWeek = luxon.DateTime.fromObject({\n\t\t\t\t\tlocalWeekNumber: evt.detail.value.number,\n\t\t\t\t\tlocalWeekYear: evt.detail.value.year\n\t\t\t\t}, {\n\t\t\t\t\tzone: this.currentDate.zoneName,\n\t\t\t\t\tlocale: this.currentDate.locale\n\t\t\t\t});\n\n\t\t\t\tif (!this.focusDate.hasSame(dayInWeek.startOf('week', { useLocaleWeeks: true }), 'month')) {\n\t\t\t\t\tthis.$emit('update:currentDate', dayInWeek.startOf('week', { useLocaleWeeks: true }));\n\t\t\t\t} else if (!this.focusDate.hasSame(dayInWeek.endOf('week', { useLocaleWeeks: true }), 'month')) {\n\t\t\t\t\tthis.$emit('update:currentDate', dayInWeek.endOf('week', { useLocaleWeeks: true }));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'day':\n\t\t\t\t// default: Set current-date\n\t\t\t\tthis.$emit('update:currentDate', evt.detail.value);\n\t\t\t\tbreak;\n\t\t\tcase 'event':\n\t\t\t\t// default: Request Modal\n\t\t\t\tthis.$emit('requestModalOpen', { event: evt.detail.value });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t},\n\tmounted() {\n\t\tthis.$emit('update:range', this.range);\n\t},\n\ttemplate: `\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\t`\n}\n","import CalendarGrid from '../../Base/Grid.js';\nimport LabelWeek from '../../Base/Label/Week.js';\nimport LabelDow from '../../Base/Label/Dow.js';\nimport LabelDay from '../../Base/Label/Day.js';\n\nexport default {\n\tname: \"MonthView\",\n\tcomponents: {\n\t\tCalendarGrid,\n\t\tLabelWeek,\n\t\tLabelDow,\n\t\tLabelDay\n\t},\n\tprovide() {\n\t\treturn {\n\t\t\t// NOTE(chris): snap events to day\n\t\t\tevents: Vue.computed(() => {\n\t\t\t\t//const events = [];\n\t\t\t\tconst events = this.events.map(event => {\n\t\t\t\t\tconst start = event.start.startOf('day');\n\t\t\t\t\tconst end = event.end.plus({ days: 1 }).startOf('day');\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...event,\n\t\t\t\t\t\tstart,\n\t\t\t\t\t\tend\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t\tfor (var w = 5; w > -1; w--) {\n\t\t\t\t\tfor (var d = 6; d > -1; d--) {\n\t\t\t\t\t\tconst startdate = this.axisMain[w].plus(this.axisParts[d]);\n\t\t\t\t\t\tevents.unshift({\n\t\t\t\t\t\t\tstart: startdate,\n\t\t\t\t\t\t\tend: startdate.plus({ days: 1 }),\n\t\t\t\t\t\t\torig: 'header'\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn events;\n\t\t\t})\n\t\t};\n\t},\n\tinject: {\n\t\tevents: \"events\",\n\t\ttimezone: \"timezone\"\n\t},\n\tprops: {\n\t\tday: {\n\t\t\ttype: luxon.DateTime,\n\t\t\trequired: true\n\t\t}\n\t},\n\tcomputed: {\n\t\taxisMain() {\n\t\t\tconst start = this.day.startOf('month').startOf('week', { useLocaleWeeks: true });\n\t\t\treturn Array.from({ length: 6 }, (e, i) => start.plus({ weeks: i }));\n\t\t},\n\t\taxisParts() {\n\t\t\treturn Array.from({ length: 8 }, (e, i) => luxon.Duration.fromObject({ days: i }));\n\t\t}\n\t},\n\tmethods: {\n\t\tisToday(date) {\n\t\t\treturn date.hasSame(luxon.DateTime.now().setZone(this.timezone), 'day');\n\t\t}\n\t},\n\ttemplate: /* html */`\n\t
    \n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t
    \n\t`\n}\n","import CalClick from '../../../../directives/Calendar/Click.js';\n\nexport default {\n\tname: \"LabelWeek\",\n\tdirectives: {\n\t\tCalClick\n\t},\n\tprops: {\n\t\tdate: {\n\t\t\ttype: luxon.DateTime,\n\t\t\trequired: true\n\t\t}\n\t},\n\tcomputed: {\n\t\tweeks() {\n\t\t\tconst firstDay = this.date.startOf('week', { useLocaleWeeks: true });\n\t\t\tconst lastDay = this.date.endOf('week', { useLocaleWeeks: true });\n\n\t\t\tconst weeks = [\n\t\t\t\t{ number: firstDay.localWeekNumber, year: firstDay.localWeekYear },\n\t\t\t\t{ number: lastDay.localWeekNumber, year: lastDay.localWeekYear }\n\t\t\t];\n\t\t\tif (weeks[0].number == weeks[1].number)\n\t\t\t\tweeks.pop();\n\t\t\treturn weeks;\n\t\t}\n\t},\n\ttemplate: `\n\t
    \n\t\t\n\t\t\t{{ week.number }}\n\t\t\n\t
    \n\t`\n}\n","import FhcCalendar from \"./Base.js\";\n\nimport ApiLvPlan from '../../api/factory/lvPlan.js';\n\nimport { useEventLoader } from '../../composables/EventLoader.js';\n\nimport ModeDay from './Mode/Day.js';\nimport ModeWeek from './Mode/Week.js';\nimport ModeMonth from './Mode/Month.js';\n\nexport default {\n\tname: \"CalendarLvPlan\",\n\tcomponents: {\n\t\tFhcCalendar\n\t},\n\tinject: [\n\t\t\"renderers\"\n\t],\n\tprops: {\n\t\ttimezone: {\n\t\t\ttype: String,\n\t\t\trequired: true\n\t\t},\n\t\tdate: {\n\t\t\ttype: [Date, String, Number, luxon.DateTime],\n\t\t\tdefault: luxon.DateTime.local()\n\t\t},\n\t\tmode: {\n\t\t\ttype: String,\n\t\t\tdefault: 'Week'\n\t\t},\n\t\tgetPromiseFunc: {\n\t\t\ttype: Function,\n\t\t\trequired: true\n\t\t}\n\t},\n\temits: [\n\t\t\"update:date\",\n\t\t\"update:mode\",\n\t\t\"update:range\"\n\t],\n\tdata() {\n\t\treturn {\n\t\t\tmodes: {\n\t\t\t\tday: Vue.markRaw(ModeDay),\n\t\t\t\tweek: Vue.markRaw(ModeWeek),\n\t\t\t\tmonth: Vue.markRaw(ModeMonth)\n\t\t\t},\n\t\t\tmodeOptions: {\n\t\t\t\tday: {\n\t\t\t\t\temptyMessage: Vue.computed(() => this.$p.t('lehre/noLvFound')),\n\t\t\t\t\temptyMessageDetails: Vue.computed(() => this.$p.t('lehre/noLvFound'))\n\t\t\t\t},\n\t\t\t\tweek: {\n\t\t\t\t\tcollapseEmptyDays: false\n\t\t\t\t}\n\t\t\t},\n\t\t\tteachingunits: null\n\t\t};\n\t},\n\tcomputed: {\n\t\tbackgrounds() {\n\t\t\tlet now = luxon.DateTime.now().setZone(this.timezone);\n\n\t\t\tif (this.mode == 'Month')\n\t\t\t\treturn [\n\t\t\t\t\t{\n\t\t\t\t\t\tclass: 'background-past',\n\t\t\t\t\t\tend: now.startOf('day')\n\t\t\t\t\t}\n\t\t\t\t];\n\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tclass: 'background-past',\n\t\t\t\t\tend: now,\n\t\t\t\t\tlabel: now.startOf('minute').toISOTime({ suppressSeconds: true, includeOffset: false })\n\t\t\t\t}\n\t\t\t];\n\t\t}\n\t},\n\tmethods: {\n\t\teventStyle(event) {\n\t\t\tif (!event.farbe)\n\t\t\t\treturn undefined;\n\t\t\treturn '--event-bg:#' + event.farbe;\n\t\t},\n\t\tupdateRange(rangeInterval) {\n\t\t\tthis.rangeInterval = rangeInterval;\n\t\t\tthis.$emit('update:range', rangeInterval);\n\t\t}\n\t},\n\tsetup(props, context) {\n\t\tconst rangeInterval = Vue.ref(null);\n\t\t\n\t\tconst { events, lv } = useEventLoader(rangeInterval, props.getPromiseFunc);\n\n\t\tVue.watch(lv, newValue => {\n\t\t\tcontext.emit('update:lv', newValue);\n\t\t});\n\n\t\treturn {\n\t\t\trangeInterval,\n\t\t\tevents,\n\t\t\tlv\n\t\t};\n\t},\n\tcreated() {\n\t\tthis.$api\n\t\t\t.call(ApiLvPlan.getStunden())\n\t\t\t.then(res => {\n\t\t\t\treturn this.teachingunits = res.data.map(el => ({\n\t\t\t\t\tid: el.stunde,\n\t\t\t\t\tstart: el.beginn,\n\t\t\t\t\tend: el.ende\n\t\t\t\t}));\n\t\t\t});\n\t},\n\ttemplate: /* html */`\n\t $emit('update:date', newDate, newMode)\"\n\t\t@update:mode=\"(newMode, newDate) => $emit('update:mode', newMode, newDate)\"\n\t\t@update:range=\"updateRange\"\n\t>\n\t\t\n\t\t\n\t`\n}\n","// TODO(chris): load events that are longer than the interval without doubling it\n\nexport function useEventLoader(rangeInterval, getPromiseFunc) {\n\tlet loading_id = 0;\n\tconst events = Vue.ref([]);\n\tconst loadingEvents = Vue.ref([]);\n\tconst allEvents = Vue.computed(() => events.value.concat(loadingEvents.value));\n\tconst lv = Vue.ref(null);\n\tconst eventsLoaded = [];\n\n\tconst mergePromiseArr = (n, o) => {\n\t\tif (Array.isArray(n))\n\t\t\treturn o.concat(n);\n\t\treturn o.push(n), o;\n\t};\n\n\tconst markEventsLoaded = (start, end) => {\n\t\tlet result = [];\n\t\tif (!eventsLoaded.length) {\n\t\t\t// empty: add new chunk\n\t\t\teventsLoaded.push(start.ts, end.ts);\n\t\t} else {\n\t\t\tif (eventsLoaded[eventsLoaded.length-1] + 1 == start.ts) {\n\t\t\t\t// add to the end of last chunk\n\t\t\t\teventsLoaded[eventsLoaded.length-1] = end.ts;\n\t\t\t} else if (eventsLoaded[eventsLoaded.length-1] < start.ts) {\n\t\t\t\t// add new chunk after the last chunk\n\t\t\t\teventsLoaded.push(start.ts, end.ts);\n\t\t\t} else if (eventsLoaded[0] == end.ts + 1) {\n\t\t\t\t// add to the start of first chunk\n\t\t\t\teventsLoaded[0] = start.ts;\n\t\t\t} else if (eventsLoaded[0] > end.ts) {\n\t\t\t\teventsLoaded.unshift(start.ts, end.ts);\n\t\t\t} else {\n\t\t\t\tlet index = eventsLoaded.findIndex(e => e >= start.ts);\n\n\t\t\t\tif (index % 2) {\n\t\t\t\t\t// starts inside an existing chunk\n\t\t\t\t\tif (eventsLoaded[index] >= end.ts)\n\t\t\t\t\t\treturn []; // Already loaded\n\n\t\t\t\t\tlet indexIsLast = (index == eventsLoaded.length - 1);\n\n\t\t\t\t\tif (indexIsLast || eventsLoaded[index + 1] > end.ts) {\n\t\t\t\t\t\t// extend an existing chunk\n\t\t\t\t\t\t// and merge with the next if necessary\n\t\t\t\t\t\tlet nStart = eventsLoaded[index] + 1;\n\t\t\t\t\t\tstart = start.plus(nStart - start.ts);\n\t\t\t\t\t\tif (!indexIsLast && eventsLoaded[index + 1] == end.ts + 1)\n\t\t\t\t\t\t\teventsLoaded.splice(index, 2);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\teventsLoaded[index] = end.ts;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// merge exising chunks\n\t\t\t\t\t\t// and load the rest if necessary\n\t\t\t\t\t\tif (eventsLoaded[index + 2] < end.ts) {\n\t\t\t\t\t\t\tlet rStart = eventsLoaded[index + 2] + 1;\n\t\t\t\t\t\t\tresult = mergePromiseArr(markEventsLoaded(start.plus(rStart - start.ts), end), result);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet nStart = eventsLoaded[index] + 1;\n\t\t\t\t\t\tstart = start.plus(nStart - start.ts);\n\t\t\t\t\t\tlet nEnd = eventsLoaded[index + 1] - 1;\n\t\t\t\t\t\tend = end.plus(nEnd - end.ts);\n\t\t\t\t\t\teventsLoaded.splice(index, 2);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// starts between two chunks or before the first\n\t\t\t\t\tif (!index) {\n\t\t\t\t\t\t// extend the first chunk\n\t\t\t\t\t\t// and load the rest if necessary\n\t\t\t\t\t\tif (eventsLoaded[1] < end.ts) {\n\t\t\t\t\t\t\tlet rStart = eventsLoaded[1] + 1;\n\t\t\t\t\t\t\tresult = mergePromiseArr(markEventsLoaded(start.plus(rStart - start.ts), end), result);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlet nEnd = eventsLoaded[0] - 1;\n\t\t\t\t\t\tend = end.plus(nEnd - end.ts);\n\t\t\t\t\t\teventsLoaded[0] = start.ts;\n\t\t\t\t\t} else if (eventsLoaded[index] == start.ts) {\n\t\t\t\t\t\t// starts at the same position as an existing chunk\n\t\t\t\t\t\tif (eventsLoaded[index + 1] >= end.ts)\n\t\t\t\t\t\t\treturn []; // Already loaded\n\t\t\t\t\t\t// load the rest\n\t\t\t\t\t\tlet rStart = eventsLoaded[index + 1] + 1;\n\t\t\t\t\t\tresult = mergePromiseArr(markEventsLoaded(start.plus(rStart - start.ts), end), result);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// extend an existing chunk\n\t\t\t\t\t\t// and load the rest if necessary\n\t\t\t\t\t\tif (eventsLoaded[index + 1] < end.ts) {\n\t\t\t\t\t\t\tlet rStart = eventsLoaded[index + 1] + 1;\n\t\t\t\t\t\t\tresult = mergePromiseArr(markEventsLoaded(start.plus(rStart - start.ts), end), result);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlet nEnd = eventsLoaded[index] - 1;\n\t\t\t\t\t\tend = end.plus(nEnd - end.ts);\n\t\t\t\t\t\teventsLoaded[index] = start.ts;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (start.ts >= end.ts)\n\t\t\treturn result;\n\n\t\tloadingEvents.value.push({\n\t\t\tloading_id: loading_id++,\n\t\t\ttype: \"loading\",\n\t\t\tisostart: start.toISODate() + 'T' + start.toISOTime(),\n\t\t\tisoend: end.toISODate() + 'T' + end.toISOTime()\n\t\t});\n\n\t\treturn mergePromiseArr(getPromiseFunc(start, end), result);\n\t};\n\n\tVue.watchEffect(() => {\n\t\tconst range = Vue.toValue(rangeInterval);\n\t\tif (!(range instanceof luxon.Interval))\n\t\t\treturn;\n\t\tconst promises = markEventsLoaded(range.start, range.end);\n\t\tPromise\n\t\t\t.allSettled(promises)\n\t\t\t.then(results => {\n\t\t\t\tresults.forEach(res => {\n\t\t\t\t\tif (\n\t\t\t\t\t\tres.status === 'fulfilled'\n\t\t\t\t\t\t&& res.value.meta.status === \"success\"\n\t\t\t\t\t) {\n\t\t\t\t\t\tif (res.value.meta.lv)\n\t\t\t\t\t\t\tlv.value = res.value.meta.lv;\n\n\t\t\t\t\t\tevents.value = events.value.concat(res.value.data);\n\t\t\t\t\t\tloadingEvents.value = [];\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t});\n\t})\n\n\treturn { events: allEvents, lv }\n}","/**\n * Copyright (C) 2025 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tgetAuthUID() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/AuthInfo/getAuthUID'\n\t\t};\n\t},\n\tgetAuthInfo() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/AuthInfo/getAuthInfo'\n\t\t};\n\t}\n};","import FhcCalendar from \"../../Calendar/LvPlan.js\";\n\nimport ApiLvPlan from '../../../api/factory/lvPlan.js';\nimport ApiAuthinfo from '../../../api/factory/authinfo.js';\n\nexport const DEFAULT_MODE_LVPLAN = 'Week'\n\nexport default {\n\tname: 'LvPlanLehrveranstaltung',\n\tcomponents: {\n\t\tFhcCalendar\n\t},\n\tprops: {\n\t\tviewData: Object, // NOTE(chris): this is inherited from router-view\n\t\tpropsViewData: Object\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tlv: null\n\t\t};\n\t},\n\tcomputed:{\n\t\tcurrentDay() {\n\t\t\tif (!this.propsViewData?.focus_date || isNaN(new Date(this.propsViewData?.focus_date)))\n\t\t\t\treturn luxon.DateTime.now().setZone(this.viewData.timezone).toISODate();\n\t\t\treturn this.propsViewData?.focus_date;\n\t\t},\n\t\tcurrentMode() {\n\t\t\tif (!this.propsViewData?.mode || !['day', 'week', 'month'].includes(this.propsViewData?.mode.toLowerCase()))\n\t\t\t\treturn DEFAULT_MODE_LVPLAN;\n\t\t\treturn this.propsViewData?.mode;\n\t\t},\n\t\tcurrentLv() {\n\t\t\tif (isNaN(parseInt(this.propsViewData?.lv_id)))\n\t\t\t\treturn null;\n\t\t\treturn this.propsViewData.lv_id;\n\t\t},\n\t\tlvTitle() {\n\t\t\tif (this.currentLv === null)\n\t\t\t\treturn '';\n\t\t\tif (!this.lv)\n\t\t\t\treturn '';\n\n\t\t\tif (this.$p.user_language.value === 'English')\n\t\t\t\treturn this.lv.bezeichnung_english;\n\n\t\t\treturn this.lv.bezeichnung;\n\t\t}\n\t},\n\tmethods: {\n\t\thandleChangeDate(day, newMode) {\n\t\t\treturn this.handleChangeMode(newMode, day);\n\t\t},\n\t\thandleChangeMode(newMode, day) {\n\t\t\tconst mode = newMode[0].toUpperCase() + newMode.slice(1)\n\t\t\tconst focus_date = day.toISODate();\n\t\t\t\n\t\t\tthis.$router.push({\n\t\t\t\tname: \"LvPlan\",\n\t\t\t\tparams: {\n\t\t\t\t\tmode,\n\t\t\t\t\tfocus_date,\n\t\t\t\t\tlv_id: this.currentLv\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tgetPromiseFunc(start, end) {\n\t\t\treturn [\n\t\t\t\tthis.$api.call(ApiLvPlan.eventsLv(this.propsViewData.lv_id, start.toISODate(), end.toISODate())),\n\t\t\t\tthis.$api.call(ApiLvPlan.getLvPlanReservierungen(start.toISODate(), end.toISODate()))\n\t\t\t];\n\t\t}\n\t},\n\tcreated() {\n\t\tif (this.currentLv === null)\n\t\t\treturn;\n\t\tthis.$api\n\t\t\t.call(ApiLvPlan.getLv(this.propsViewData?.lv_id))\n\t\t\t.then(res => {\n\t\t\t\tthis.lv = res.data;\n\t\t\t});\n\t},\n\ttemplate: /*html*/`\n\t
    \n\t\t

    \n\t\t\t{{ $p.t('lehre/stundenplan') }}\n\t\t\t\n\t\t\t\t{{ lvTitle }}\n\t\t\t\n\t\t

    \n\t\t
    \n\t\t
    \n\t\t\t{{ $p.t('lehre/noLvFound') }}\n\t\t
    \n\t\t\n\t
    `\n};\n","import FhcCalendar from \"../../Calendar/LvPlan.js\";\n\nimport ApiLvPlan from '../../../api/factory/lvPlan.js';\nimport ApiAuthinfo from '../../../api/factory/authinfo.js';\n\nexport const DEFAULT_MODE_LVPLAN = 'Week'\n\nexport default {\n\tname: 'LvPlanPersonal',\n\tcomponents: {\n\t\tFhcCalendar\n\t},\n\tprops: {\n\t\tviewData: Object, // NOTE(chris): this is inherited from router-view\n\t\tpropsViewData: Object\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tstudiensemester_kurzbz: null,\n\t\t\tstudiensemester_start: null,\n\t\t\tstudiensemester_ende: null,\n\t\t\tuid: null,\n\t\t\tisMitarbeiter: false,\n\t\t\tisStudent: false\n\t\t};\n\t},\n\tcomputed:{\n\t\tcurrentDay() {\n\t\t\tif (!this.propsViewData?.focus_date || isNaN(new Date(this.propsViewData?.focus_date)))\n\t\t\t\treturn luxon.DateTime.now().setZone(this.viewData.timezone).toISODate();\n\t\t\treturn this.propsViewData?.focus_date;\n\t\t},\n\t\tcurrentMode() {\n\t\t\tif (!this.propsViewData?.mode || !['day', 'week', 'month'].includes(this.propsViewData?.mode.toLowerCase()))\n\t\t\t\treturn DEFAULT_MODE_LVPLAN;\n\t\t\treturn this.propsViewData?.mode;\n\t\t},\n\t\tdownloadLinks() {\n\t\t\tif (!this.studiensemester_start || !this.studiensemester_ende || !this.uid)\n\t\t\t\treturn false;\n\n\t\t\tlet type = false;\n\t\t\ttype = this.isStudent ? 'student' : type;\n\t\t\ttype = this.isMitarbeiter ? 'lektor' : type;\n\t\t\tif (false === type)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst opts = { zone: this.viewData.timezone };\n\t\t\tconst start = luxon.DateTime\n\t\t\t\t.fromISO(this.studiensemester_start, opts)\n\t\t\t\t.toUnixInteger();\n\t\t\tconst ende = luxon.DateTime\n\t\t\t\t.fromISO(this.studiensemester_ende, opts)\n\t\t\t\t.toUnixInteger();\n\n\t\t\tconst download_link = FHC_JS_DATA_STORAGE_OBJECT.app_root\n\t\t\t\t+ 'cis/private/lvplan/stpl_kalender.php'\n\t\t\t\t+ '?type=' + type\n\t\t\t\t+ '&pers_uid=' + this.uid\n\t\t\t\t+ '&begin=' + start\n\t\t\t\t+ '&ende=' + ende;\n\n\t\t\treturn [\n\t\t\t\t{ title: \"excel\", icon: 'fa-solid fa-file-excel', link: download_link + '&format=excel' },\n\t\t\t\t{ title: \"csv\", icon: 'fa-solid fa-file-csv', link: download_link + '&format=csv' },\n\t\t\t\t{ title: \"ical1\", icon: 'fa-regular fa-calendar', link: download_link + '&format=ical&version=1&target=ical' },\n\t\t\t\t{ title: \"ical2\", icon: 'fa-regular fa-calendar', link: download_link + '&format=ical&version=2&target=ical' }\n\t\t\t];\n\t\t}\n\t},\n\tmethods: {\n\t\thandleChangeDate(day, newMode) {\n\t\t\treturn this.handleChangeMode(newMode, day);\n\t\t},\n\t\thandleChangeMode(newMode, day) {\n\t\t\tconst mode = newMode[0].toUpperCase() + newMode.slice(1)\n\t\t\tconst focus_date = day.toISODate();\n\t\t\t\n\t\t\tthis.$router.push({\n\t\t\t\tname: \"MyLvPlan\",\n\t\t\t\tparams: {\n\t\t\t\t\tmode,\n\t\t\t\t\tfocus_date\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tupdateRange(rangeInterval) {\n\t\t\tthis.$api\n\t\t\t\t.call(ApiLvPlan.studiensemesterDateInterval(\n\t\t\t\t\trangeInterval.end.startOf('week').toISODate()\n\t\t\t\t))\n\t\t\t\t.then(res => {\n\t\t\t\t\tthis.studiensemester_kurzbz = res.data.studiensemester_kurzbz;\n\t\t\t\t\tthis.studiensemester_start = res.data.start;\n\t\t\t\t\tthis.studiensemester_ende = res.data.ende;\n\t\t\t\t});\n\t\t},\n\t\tgetPromiseFunc(start, end) {\n\t\t\treturn [\n\t\t\t\tthis.$api.call(ApiLvPlan.eventsPersonal(start.toISODate(), end.toISODate())),\n\t\t\t\tthis.$api.call(ApiLvPlan.getLvPlanReservierungen(start.toISODate(), end.toISODate()))\n\t\t\t];\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.$api\n\t\t\t.call(ApiAuthinfo.getAuthInfo())\n\t\t\t.then(res => {\n\t\t\t\tthis.uid = res.data.uid;\n\t\t\t\tthis.isMitarbeiter = res.data.isMitarbeiter;\n\t\t\t\tthis.isStudent = res.data.isStudent;\n\t\t\t});\n\t},\n\ttemplate: /*html*/`\n\t
    \n\t\t

    \n\t\t\t{{ $p.t('lehre/stundenplan') }}\n\t\t\t\n\t\t\t\t{{ studiensemester_kurzbz }}\n\t\t\t\n\t\t

    \n\t\t
    \n\t\t\n\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ title }}\n\t\t\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\n\t`\n};\n","import BsModal from '../../../../../Bootstrap/Modal.js';\n\nconst pruefungen = {};\n\nexport default {\n\tcomponents: {\n\t\tBsModal\n\t},\n\tmixins: [\n\t\tBsModal\n\t],\n\tprops: {\n\t\tpruefungenData: Array|null,\n\t\tbezeichnung: String,\n\t\t/*\n\t\t * NOTE(chris): \n\t\t * Hack to expose in \"emits\" declared events to $props which we use \n\t\t * in the v-bind directive to forward all events.\n\t\t * @see: https://github.com/vuejs/core/issues/3432\n\t\t*/\n\t\tonHideBsModal: Function,\n\t\tonHiddenBsModal: Function,\n\t\tonHidePreventedBsModal: Function,\n\t\tonShowBsModal: Function,\n\t\tonShownBsModal: Function\n\t},\n\tdata: () => ({\n\t\tresult: true,\n\t}),\n\tmounted() {\n\t\tthis.modal = this.$refs.modalContainer.modal;\n\t},\n\tpopup(options) {\n\t\treturn BsModal.popup.bind(this)(null, options);\n\t},\n\ttemplate: `\n\t\t\n\t\t\n\t`\n}\n","/**\n * Copyright (C) 2025 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tgetStudentenMail(lehreinheit_id) {\n\t\t// TODO(chris): seems to be called from nowhere?\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Lehre/lvStudentenMail',\n\t\t\tparams: { lehreinheit_id }\n\t\t};\n\t},\n\tgetLvInfo(studiensemester_kurzbz, lehrveranstaltung_id) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: `/api/frontend/v1/Lehre/LV/${studiensemester_kurzbz}/${lehrveranstaltung_id}`\n\t\t};\n\t},\n\tgetStudentPruefungen(lehrveranstaltung_id) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: `/api/frontend/v1/Lehre/Pruefungen/${lehrveranstaltung_id}`\n\t\t};\n\t}\n};","import ApiLehre from '../../../../../../api/factory/lehre.js';\n\nconst infos = {};\n\nexport default {\n\tprops:{\n\t\tstudien_semester: String,\n\t\tlehrveranstaltung_id: Number,\n\t},\n\tdata: () => ({\n\t\tbezeichnung: null,\n\t\tstudiengang_kuerzel: null,\n\t\tsemester: null,\n\t\torgform_kurzbz: null,\n\t\tsprache: null,\n\t\tects: null,\n\t\tincoming: null,\n\t\tresult: true,\n\t\tinfo: null,\n\t}),\n\tcomputed: {\n\t\tlektorNamesLinks(){\n\t\t\tlet lektorenLinks = {};\n\t\t\tthis.info.lektoren.forEach(e => {\n\t\t\t\tlet name = ((e.titelpre || '') + ' ' + (e.vorname || '') + ' ' + (e.nachname || '') + ' ' + (e.titelpost || '')).trim();\n\t\t\t\tlektorenLinks[name] = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + `/Cis/Profil/View/${e.uid}`;\n\t\t\t});\n\t\t\treturn lektorenLinks;\n\t\t},\n\t\tlektorNames(){\n\t\t\treturn this.info.lektoren.map((e)=>((e.titelpre || '') + ' ' + (e.vorname || '') + ' ' + (e.nachname || '') + ' ' + (e.titelpost || '')).trim());\n\t\t},\n\t\tlvLeitung() {\n\t\t\treturn this.info.lvLeitung && this.info.lvLeitung.length ? this.info.lvLeitung.map(e => ((e.titelpre || '') + ' ' + (e.vorname || '') + ' ' + (e.nachname || '') + ' ' + (e.titelpost || '')).trim()) : null;\n\t\t},\n\t\toe() {\n\t\t\treturn this.info.oe.organisationseinheittyp ? (this.info.oe.organisationseinheittyp + ' ' + this.info.oe.bezeichnung) : '';\n\t\t},\n\t\toeLeitung() {\n\t\t\tif (!this.info.oeLeitung || !this.info.oeLeitung.length)\n\t\t\t\treturn ['-'];\n\t\t\treturn this.info.oeLeitung.map(e => ((e.titelpre || '') + ' ' + (e.vorname || '') + ' ' + (e.nachname || '') + ' ' + (e.titelpost || '')).trim());\n\t\t},\n\t\tkoordinator() {\n\t\t\tif (!this.info.koordinator || !this.info.koordinator.length)\n\t\t\t\treturn null;\n\t\t\treturn this.info.koordinator.map(e => ((e.titelpre || '') + ' ' + (e.vorname || '') + ' ' + (e.nachname || '') + ' ' + (e.titelpost || '')).trim());\n\t\t},\n\t\tcurrentLang() {\n\t\t\tif (!this.info)\n\t\t\t\treturn null;\n\t\t\tif (this.info.lastLang)\n\t\t\t\treturn this.info.lastLang;\n\t\t\tif (!this.info.lvinfo)\n\t\t\t\treturn null;\n\t\t\treturn this.info.lvinfoDefaultLang && this.info.lvinfo[this.info.lvinfoDefaultLang] ? this.info.lvinfoDefaultLang : Object.keys(this.info.lvinfo).shift();\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.$api.call(ApiLehre.getLvInfo(this.studien_semester, this.lehrveranstaltung_id))\n\t\t.then(\n\t\t\tres => res.data\n\t\t).then(data =>{\n\t\t\tObject.assign(this, \n\t\t\t\t{\n\t\t\t\t\tbezeichnung : data.bezeichnung,\n\t\t\t\t\tstudiengang_kuerzel: data.studiengang_kuerzel,\n\t\t\t\t\tsemester: data.semester,\n\t\t\t\t\torgform_kurzbz: data.orgform_kurzbz,\n\t\t\t\t\tsprache: data.sprache,\n\t\t\t\t\tects: data.ects,\n\t\t\t\t\tincoming: data.incoming ?? '-',\n\t\t\t\t});\n\t\t})\n\n\t\tif (infos[this.lehrveranstaltung_id]) {\n\t\t\tthis.info = infos[this.lehrveranstaltung_id];\n\t\t} else {\n\t\t\taxios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Cis/Mylv/Info/' + this.studien_semester + '/' + this.lehrveranstaltung_id).then(res => {\n\t\t\t\tthis.info = infos[this.lehrveranstaltung_id] = res.data.retval || [];\n\t\t\t}).catch(() => this.info = {});\n\t\t}\n\t},\n\ttemplate: /*html*/`\n\t\t\t

    {{$p.t('lvinfo/lehrveranstaltungsinformationen')}}

    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    {{$p.t('lehre/lehrveranstaltung')}}{{bezeichnung}}
    {{$p.t('lehre/studiengang')}}{{studiengang_kuerzel}}
    {{$p.t('lehre/semester')}}{{semester}}
    {{$p.t('lehre/studiensemester')}}{{studien_semester}}
    {{$p.t('lehre/organisationsform')}}{{orgform_kurzbz}}
    {{$p.t('lehre/lehrbeauftragter')}}\n\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t{{name}}\n\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
    {{$p.t('lehre/lvleitung')}}\n\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t{{name}}\n\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    {{$p.t('global/sprache')}}{{sprache}}
    {{$p.t('lehre/ects')}}{{ects}}
    {{$p.t('lehre/incomingplaetze')}}{{incoming}}
    {{$p.t('lehre/organisationseinheit')}}\n\t\t\t\t\t\t\t\t{{oe}}
    \n\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t{{$p.t('global/leitung')}}: {{oeLeitung.join(', ')}}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t
    \n\t\n\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    1\" class=\"text-end\">\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    `\n}\n","const categories = {};\nconst loadingModules = {};\n\nfunction extractCategory(obj, category) {\n\treturn obj.filter(e => e.category == category).reduce((res, elem) => {\n\t\tif (!res[elem.phrase])\n\t\t\tres[elem.phrase] = elem.text;\n\t\treturn res;\n\t}, {});\n}\nfunction reloadRefs(category) {\n\twhile (loadingModules[category].length) {\n\t\tvar v = loadingModules[category].pop();\n\t\tv[0].value = getValueForLoadedPhrase(category, v[1], v[2]);\n\t\tVue.triggerRef(v[0]);\n\t\t/*Vue.unref(v);*/\n\t}\n}\nfunction loadLazy(category, val, phrase, params) {\n\t// NOTE(chris): load module if it's not loaded yet\n\tif (loadingModules[category]) {\n\t\tloadingModules[category].push([val, phrase, params]);\n\t\tif (categories[category]) // NOTE(chris): this is for safety in case the loading finished the moment before the val was pushed into the array\n\t\t\treloadRefs(category);\n\t\treturn;\n\t}\n\tloadingModules[category] = [[val, phrase, params]];\n\n\taxios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Phrasen/loadModule/' + category).then(res => {\n\t\tif (res.data.retval)\n\t\t\tcategories[category] = extractCategory(res.data.retval, category);\n\t\telse\n\t\t\tcategories[category] = {};\n\n\t\treloadRefs(category);\n\t}).catch(err => console.error(err));\n}\nfunction getValueForLoadedPhrase(category, phrase, params) {\n\tlet result = categories[category][phrase];\n\tif (!result)\n\t\treturn '<< PHRASE ' + phrase + '>>';\n\tif (params)\n\t\tresult = result.replace(/\\{([^}]*)\\}/g, (match, p1) => params[p1] === undefined ? match : params[p1]);\n\treturn result;\n}\n\n\nconst phrasen = {\n\tt_ref(category, phrase, params) {\n\t\tif (params === undefined && (\n\t\t\t(Array.isArray(category) && category.length == 2) ||\n\t\t\t(category.split && category.split('/').length == 2))\n\t\t\t) {\n\t\t\tparams = phrase;\n\t\t\t[category, phrase] = category.split ? category.split('/') : category;\n\t\t}\n\t\tif (phrase === undefined) {\n\t\t\tconsole.error('invalid input');\n\t\t\treturn '';\n\t\t}\n\t\tif (!categories[category]) {\n\t\t\t\n\t\t\tvar initialval = '';\n \t\t\tif (window.FHC_JS_PHRASES_STORAGE_OBJECT !== undefined) {\n \t\t\t\tvar tmp_category = extractCategory(FHC_JS_PHRASES_STORAGE_OBJECT, category);\n\t\t\t\tif(tmp_category[phrase] !== undefined ) {\n\t\t\t\t\tinitialval = tmp_category[phrase];\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (!categories[category] || Object.keys(categories[category]).length === 0) {\n\t\t\t\tcategories[category] = undefined;\n\t\t\t\tlet val = Vue.ref(initialval);\n\t\t\t\tloadLazy(category, val, phrase, params);\n\t\t\t\treturn val;\n\t\t\t}\n\t\t}\n\t\tvar result = getValueForLoadedPhrase(category, phrase, params);\n\t\treturn Vue.ref(result);\n\t},\n\tt(category, phrase, params) {\n\t\treturn Vue.unref(this.t_ref(category, phrase, params));\n\t}\n};\n\nexport default {\n\tdata: () => {\n\t\treturn {\n\t\t\tp: phrasen\n\t\t}\n\t}\n}\n\n// Composable (wrapper for mixin)\nexport function usePhrasen() {\n\n\tfunction t(category, phrase, params) {\n\t\treturn phrasen.t(category, phrase, params);\n\t}\n\n\treturn {\t\t\n\t\tt,\n\t}\n\n}\n","\nexport default {\n\tprops:{\n\t\tmenu:{\n\t\t\ttype:Array,\n\t\t\tdefault:null,\n\t\t},\n\t\tcontainerStyles: Array,\n\t\trowStyles: Array,\n\t\thasLvPlanEintraege: {\n\t\t\trequired:false,\n\t\t\tdefault:true,\n\t\t\ttype:Boolean,\n\t\t},\n\t},\n\tdata(){\n\t\treturn{\n\t\t\t\n\t\t}\n\t},\n\tmethods:{\n\t\tc4_disabled: function (menuItem) {\n\t\t\tif (!this.c4_link(menuItem) && !menuItem.c4_moodle_links?.length) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (menuItem.id == \"addon_fhtw_menu_lvplan_lva\" && !this.hasLvPlanEintraege){\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tc4_target: function (menuItem) {\n\t\t\tif (menuItem.c4_moodle_links?.length > 0) return null;\n\t\t\treturn menuItem.c4_target ?? null;\n\t\t},\n\t\tc4_link(menuItem) {\n\t\t\tif (!menuItem) return null;\n\t\t\tif (Array.isArray(menuItem.c4_moodle_links) && menuItem.c4_moodle_links.length) \n\t\t\t{\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn menuItem.c4_link ?? null;\n\t\t\t}\n\t\t},\n\t\tgetMenuName(menuItem) {\n\t\t\tif(menuItem.phrase) {\n\t\t\t\treturn this.$p.t(menuItem.phrase)\n\t\t\t} else {\n\t\t\t\treturn menuItem.name\n\t\t\t}\n\t\t}\n\t},\n\ttemplate:/*html*/`\n\t
    {{$p.t('lehre','lehrveranstaltungsUnavailable')}}
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t

    {{ getMenuName(menuItem) }}

    \n\t\t\t\t\t\t
    {{text}}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n\t`\n}","/**\n * Copyright (C) 2025 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tgetLvMenu(lvid, studiensemester_kurzbz) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: `/api/frontend/v1/LvMenu/getLvMenu/${lvid}/${studiensemester_kurzbz}`\n\t\t};\n\t}\n};","import BsModal from \"../../Bootstrap/Modal.js\";\nimport LvMenu from \"./LvMenu.js\";\n\nimport ApiAddons from '../../../api/factory/addons.js';\n\nexport default {\n \n props:{\n event:{\n type:Object,\n required:true,\n default:null,\n },\n\t\tstudiensemester: {\n\t\t\ttype: String,\n\t\t\trequired: false,\n\t\t\tdefault: null,\n\t\t},\n\t\ttitel: {\n\t\t\ttype: String,\n\t\t\trequired: false,\n\t\t\tdefault: null,\n\t\t},\n\t\t// prop used to preselect a menu item and skip the grid overview\n\t\tpreselectedMenu: {\n\t\t\ttype: Object,\n\t\t\trequired: false,\n\t\t\tdefault: null,\n\t\t}\n },\n data(){\n return {\n result: false,\n menu: [],\n\t\t\tisMenuSelected:false,\n\t\t\thasLvPlanEintraege: true,\n\t\t\tlvEvaluierungMessage: \"\",\n }\n },\n mixins:[BsModal],\n components:{\n BsModal,\n\t\tLvMenu,\n },\n\tinject: [\"studium_studiensemester\"],\n methods:{\n \n hiddenModal: function(){\n\t\t\tthis.isMenuSelected = false;\n },\n showModal: function(){\n\t\t\tif (!this.preselectedMenu) {\n this.$api\n\t\t\t\t\t.call(ApiAddons.getLvMenu(this.event.lehrveranstaltung_id, (this.studiensemester ?? this.event.studiensemester_kurzbz)))\n .then(res => {\n \t\t\t\t\tif (res.data) {\n \t\t\t\t\t\tthis.menu = res.data;\n \t\t\t\t\t}\n \t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis.isMenuSelected = true;\n\t\t\t}\n\n\t\t\t// check lv evaluierung info\n\t\t\tif (this.studium_studiensemester) {\n\t\t\t\tthis.$fhcApi.factory.studium.getLvEvaluierungInfo(this.studium_studiensemester, this.event.lehreinheit_id ?? this.event.lehrveranstaltung_id)\n\t\t\t\t\t.then(data => data.data)\n\t\t\t\t\t.then(res => {\n\t\t\t\t\t\tthis.lvEvaluierungMessage = res.message;\n\t\t\t\t\t})\n\t\t\t}\n\n\t\t\t// check if the lv has lvplan entries for this studiensemester\n\t\t\tif (this.studiensemester && this.event) {\n\t\t\t\treturn this.$fhcApi.factory.studium.getLvPlanForStudiensemester(this.studiensemester, this.event.lehreinheit_id ?? this.event.lehrveranstaltung_id)\n\t\t\t\t\t.then(data => data.data)\n\t\t\t\t\t.then(res => {\n\t\t\t\t\t\tif (Array.isArray(res) && res.length > 0) {\n\t\t\t\t\t\t\tthis.hasLvPlanEintraege = true;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.hasLvPlanEintraege = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t}\n\t\t\t\n },\n },\n\tmounted(){\n this.modal = this.$refs.modalContainer;\n },\n\tbeforeUnmount(){\n\t\tthis.$refs.modalContainer.hide();\n\t},\n template:/*html*/`\n \n\n\t\t\n \n \n \n\n \n `,\n};","import MylvSemesterStudiengang from \"./Semester/Studiengang.js\";\n\nexport default {\n\tcomponents: {\n\t\tMylvSemesterStudiengang\n\t},\n\tprovide() {\n\t\treturn {\n\t\t\tstudien_semester: Vue.computed(() => this.semester) \n\t\t}\n\t},\n\tprops: {\n\t\tsemester: [String, Number],\n\t\tlvs: Array\n\t},\n\tcomputed: {\n\t\tready() { return this.lvs !== null; },\n\t\tstudiengaenge() {\n\t\t\treturn [... new Map(\n\t\t\t\tthis.lvs\n\t\t\t\t.map(lv => [\n\t\t\t\t\tlv.studiengang_kz + '#' + lv.semester, \n\t\t\t\t\t{\n\t\t\t\t\t\tstudiengang_kz: lv.studiengang_kz, \n\t\t\t\t\t\tbezeichnung: lv.sg_bezeichnung,\n\t\t\t\t\t\tsg_bezeichnung_eng: lv.sg_bezeichnung_eng,\n\t\t\t\t\t\tkuerzel: lv.studiengang_kuerzel, \n\t\t\t\t\t\tsemester: lv.semester\n\t\t\t\t\t}\n\t\t\t\t])\n\t\t\t).values()].sort((a, b) => a.bezeichnung.toLowerCase() == b.bezeichnung.toLowerCase() ? a.semester > b.semester : a.bezeichnung.toLowerCase() > b.bezeichnung.toLowerCase());\n\t\t},\n\t},\n\tmethods: {\n\t\tlvsForStudiengang(studiengang) {\n\t\t\treturn this.lvs.filter(lv => lv.studiengang_kz == studiengang.studiengang_kz && lv.semester == studiengang.semester);\n\t\t}\n\t},\n\ttemplate: `
    \n\t\t\n\t
    \n\t
    \n\t\t\n\t
    `\n};","import MylvSemesterStudiengangLv from \"./Studiengang/Lv.js\";\nimport Phrasen from \"../../../../mixins/Phrasen.js\";\n\nexport default {\n\tcomponents: {\n\t\tMylvSemesterStudiengangLv\n\t},\n\tmixins: [\n\t\tPhrasen\n\t],\n\tprops: {\n\t\tbezeichnung: String,\n\t\tkuerzel: String,\n\t\tsemester: [String,Number],\n\t\tlvs: Array,\n\t\tsg_bezeichnung_eng: String\n\t},\n\tcomputed: {\n\t\tlehrveranstaltungen() {\n\t\t\treturn [... new Map(\n\t\t\t\tthis.lvs\n\t\t\t\t.map(lv => [\n\t\t\t\t\tlv.lehrveranstaltung_id, \n\t\t\t\t\tlv\n\t\t\t\t])\n\t\t\t).values()]\n\t\t}\n\t},\n\tmethods: {\n\t\tnote(lv) {\n\t\t\treturn lv.benotung ? lv.znote || lv.lvnote || null : null;\n\t\t}\n\t},\n\ttemplate: `
    \n\t\t
    \n\t\t\t

    {{$p.user_language.value === 'English' ? sg_bezeichnung_eng : bezeichnung}} - {{kuerzel}}\n\t\t\t\t{{semester}}.{{$p.t('lehre/semester')}}\n\t\t\t

    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    `\n};","import LvPruefungen from \"./Lv/Pruefungen.js\";\nimport LvInfo from \"./Lv/Info.js\";\nimport Phrasen from \"../../../../../mixins/Phrasen.js\";\nimport LvUebersicht from \"../../LvUebersicht.js\";\n\nimport ApiLehre from '../../../../../api/factory/lehre.js';\nimport ApiAddons from '../../../../../api/factory/addons.js';\n\n// TODO(chris): L10n\n\nexport default {\n\tcomponents:{\n\t\tLvUebersicht,\n\t},\n\tmixins: [\n\t\tPhrasen\n\t],\n\tinject: ['studien_semester'],\n\tprops: {\n\t\tlehrveranstaltung_id: Number,\n\t\tbezeichnung: String,\n\t\tbezeichnung_eng: String,\n\t\tmodule: String,\n\t\tfarbe: String,\n\t\tlvinfo: Boolean,\n\t\tbenotung: Boolean,\n\t\tlvnote: String,\n\t\tlvnotebez: Array,\n\t\tznote: String,\n\t\tznotebez: Array,\n\t\tstudiengang_kuerzel: String,\n\t\tsemester: [String, Number],\n\t\torgform_kurzbz: String,\n\t\tsprache: String,\n\t\tects: String,\n\t\tincoming: Number,\n\t\tpositiv: Boolean,\n\t\tnote_index: String\n\t},\n\tdata: () => {\n\t\treturn {\n\t\t\tpruefungenData: null,\n\t\t\tinfo: null,\n\t\t\tmenu: null,\n\t\t\tpreselectedMenuItem: null,\n\t\t}\n\t},\n\tcomputed: {\n\t\tgradeColor() {\n\t\t\t// early return if value is null or undefined\n\t\t\tif (this.positiv == null) return;\n\t\t\t// returns a suitable color for the given grade\n\t\t\tif (this.positiv)\n\t\t\t{\n\t\t\t\treturn 'var(--fhc-success)';\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn 'var(--fhc-danger)';\n\t\t\t}\n\t\t},\n\t\tis_organisatorische_einheit(){\n\t\t\treturn this.menu == \"organisatorische_einheit\";\n\t\t},\n\t\temptyMenu(){\n\t\t\treturn !this.menu || !Array.isArray(this.menu) || Array.isArray(this.menu) && this.menu.length == 0;\n\t\t},\n\t\tbodyStyle() {return {};\n\t\t\t/*const bodyStyle = {};\n\t\t\tif (this.farbe)\n\t\t\t\tbodyStyle['background-color'] = '#' + this.farbe;\n\t\t\treturn bodyStyle;*/\n\t\t},\n\t\tgrade() {\n\t\t\tconst languageIndex = this.$p.user_language.value === 'English' ? 1 : 0\n\t\t\tif(this.benotung && this.znotebez?.length) {\n\t\t\t\treturn this.znotebez[languageIndex]\n\t\t\t} else if(this.benotung && this.lvnotebez?.length) {\n\t\t\t\treturn this.lvnotebez[languageIndex]\n\t\t\t} else return null\n\t\t},\n\t\tLvHasPruefungenInformation(){\n\t\t\treturn this.pruefungenData && this.pruefungenData.length > 0;\n\t\t},\n\t},\n\tmethods: {\n\t\t\n\t\tfetchMenu(lehrveranstaltung_id = this.lehrveranstaltung_id, studien_semester = this.studien_semester) {\n\t\t\treturn this.$api\n\t\t\t\t.call(ApiAddons.getLvMenu(lehrveranstaltung_id, studien_semester))\n\t\t\t\t.then(res => {\n\t\t\t\t\tthis.menu = res.data;\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tthis.$fhcAlert.handleSystemError(error);\n\t\t\t\t\tthis.menu = [];\n\t\t\t\t});\n\t\t},\n\n\t\tc4_link(menuItem) {\n\t\t\tif (!menuItem) return null;\n\t\t\tif (Array.isArray(menuItem.c4_moodle_links) && menuItem.c4_moodle_links.length) {\n\t\t\t\treturn '#';\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn menuItem.c4_link ?? null;\n\t\t\t}\n\t\t},\n\t\topenLvOption(menuItem){\n\t\t\tif (menuItem.id == \"core_menu_mailanstudierende\"){\n\t\t\t\twindow.location.href = menuItem.c4_link;\n\t\t\t} else if (menuItem.id == \"core_menu_digitale_anwesenheitslisten\") {\n\t\t\t\twindow.location.href = menuItem.c4_link;\n\t\t\t} else{\n\t\t\t\tthis.preselectedMenuItem = menuItem;\n\t\t\t\tVue.nextTick(() => {\n\t\t\t\t\tthis.$refs.lvUebersicht.show();\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\topenPruefungen() {\n\t\t\t// early return if the pruefungenData is empty or not set\n\t\t\tif (!this.LvHasPruefungenInformation) return;\n\n\t\t\tLvPruefungen.popup({\n\t\t\t\tpruefungenData: this.pruefungenData, \n\t\t\t\tbezeichnung: this.bezeichnung\n\t\t\t});\n\t\t},\n\t\topenInfos() {\n\t\t\tif (!this.info) {\n\t\t\t\tthis.info = true;\n\t\t\t\t// TODO(chris): load all this params on ajax?\n\t\t\t\tLvInfo.popup({\n\t\t\t\t\tlehrveranstaltung_id: this.lehrveranstaltung_id, \n\t\t\t\t\tbezeichnung: this.bezeichnung,\n\t\t\t\t\tbezeichnung_eng: this.bezeichnung_eng,\n\t\t\t\t\tstudiengang_kuerzel: this.studiengang_kuerzel,\n\t\t\t\t\tsemester: this.semester,\n\t\t\t\t\tstudien_semester: this.studien_semester,\n\t\t\t\t\torgform_kurzbz: this.orgform_kurzbz,\n\t\t\t\t\tsprache: this.sprache,\n\t\t\t\t\tects: this.ects,\n\t\t\t\t\tincoming: this.incoming\n\t\t\t\t}).then(() => this.info = false).catch(() => this.info = false);\n\t\t\t}\n\t\t}\n\t},\n\twatch:{\n\t\tstudien_semester(newValue){\n\t\t\tthis.fetchMenu(this.lehrveranstaltung_id, newValue);\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.$api\n\t\t\t.call(ApiLehre.getStudentPruefungen(this.lehrveranstaltung_id))\n\t\t\t.then(res => res.data)\n\t\t\t.then(pruefungen => {\n\t\t\t\tthis.pruefungenData = pruefungen;\n\t\t\t}); \n\t},\n\tmounted() {\n\t\tthis.fetchMenu(this.lehrveranstaltung_id, this.studien_semester);\n\t},\n\ttemplate: /*html*/`
    \n\t\t\n\n\t\t
    \n\t\t\t\n\t\t\t
    {{ $p.t('lehre/organisationseinheit') }}:
    \n\t\t\t
    {{$p.user_language.value === 'English' ? bezeichnung_eng : bezeichnung}}
    \n\t\t
    \n\t\t
    \n\t\t\t\n\t\t\t\n\t\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t
    \n\t
    `\n};","import MylvSemester from \"./Semester.js\";\nimport Phrasen from \"../../../mixins/Phrasen.js\";\n\n// TODO(chris): phrase: global/studiensemester_auswaehlen\n// TODO(chris): phrase: next & prev +aria-label\n\nexport default {\n\tcomponents: {\n\t\tMylvSemester\n\t},\n\tmixins: [\n\t\tPhrasen\n\t],\n\tdata: () => {\n\t\treturn {\n\t\t\tfirstLoad: true,\n\t\t\tstudiensemester: null,\n\t\t\tlvs: {},\n\t\t\tcurrentSemester: null\n\t\t};\n\t},\n\tcomputed: {\n\t\tready() {\n\t\t\treturn this.studiensemester !== null && (!this.firstLoad || this.current.lvs !== null);\n\t\t},\n\t\tcurrent() {\n\t\t\tif (this.currentSemester === null)\n\t\t\t\treturn { semester: null, lvs: [] };\n\t\t\tif (this.lvs[this.currentSemester] === undefined) {\n\t\t\t\tthis.lvs[this.currentSemester] = {\n\t\t\t\t\tsemester: this.currentSemester, \n\t\t\t\t\tlvs: null\n\t\t\t\t};\n\t\t\t\taxios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Cis/Mylv/Lvs/' + this.currentSemester).then(res => {\n\t\t\t\t\tthis.lvs[this.currentSemester].lvs = res.data.retval || [];\n\t\t\t\t\tthis.firstLoad = false;\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn this.lvs[this.currentSemester];\n\t\t},\n\t\tnearestSem() {\n\t\t\tlet now = Date.now();\n\t\t\tlet nearestSem = null;\n\t\t\tlet nearestSemDiff = 0;\n\t\t\tthis.studiensemester.forEach(sem => {\n\t\t\t\tlet start = new Date(sem.start);\n\t\t\t\tlet end = new Date(sem.ende);\n\t\t\t\tif (now >= start && now <= end) {\n\t\t\t\t\tnearestSem = sem.studiensemester_kurzbz;\n\t\t\t\t\tnearestSemDiff = 0;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tlet diff = Math.min(Math.abs(now - start), Math.abs(now - end));\n\t\t\t\tif (nearestSem === null || diff < nearestSemDiff) {\n\t\t\t\t\tnearestSem = sem.studiensemester_kurzbz;\n\t\t\t\t\tnearestSemDiff = diff;\n\t\t\t\t}\n\n\t\t\t});\n\t\t\treturn nearestSem;\n\t\t},\n\t\tcurrentIsFirst() {\n\t\t\treturn this.studiensemester[0].studiensemester_kurzbz == this.currentSemester;\n\t\t},\n\t\tcurrentIsLast() {\n\t\t\treturn this.studiensemester[this.studiensemester.length-1].studiensemester_kurzbz == this.currentSemester;\n\t\t}\n\t},\n\tmethods: {\n\t\tprevSem() {\n\t\t\tthis.$refs.studiensemester.selectedIndex--;\n\t\t\tthis.$refs.studiensemester.dispatchEvent(new Event('change', { bubbles: true }));\n\t\t},\n\t\tnextSem() {\n\t\t\tthis.$refs.studiensemester.selectedIndex++;\n\t\t\tthis.$refs.studiensemester.dispatchEvent(new Event('change', { bubbles: true }));\n\t\t},\n\t\tupdateRouter(val) {\n\t\t\tthis.$router.push(`/Cis/MyLv/${val}`);\n\t\t}\n\t},\n\tcreated() {\n\t\taxios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Cis/Mylv/Studiensemester').then(res => {\n\t\t\tthis.studiensemester = res.data.retval || [];\n\t\t\tconst routerStudiensemester = this.$route.params.studiensemester;\n\t\t\tif (routerStudiensemester && this.studiensemester.filter(s => s.studiensemester_kurzbz == routerStudiensemester).length)\n\t\t\t\tthis.currentSemester = routerStudiensemester;\n\t\t\telse\n\t\t\t\tthis.currentSemester = this.nearestSem;\n\t\t});\n\t},\n\tbeforeRouteUpdate(to, from, next){\n\t\tif (to.params.studiensemester && this.studiensemester.filter(s => s.studiensemester_kurzbz == to.params.studiensemester).length && to.params.studiensemester != this.currentSemester)\n\t\t\tthis.currentSemester = to.params.studiensemester;\n\t\tnext();\n\n\t},\n\ttemplate: `\n\n\t

    {{$p.t('lehre/myLV')}}

    \n\t
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t\t
    \n\t\t\t{{$p.t('lehre/noLvFound')}}\n\t\t
    \n\t\t\n\t
    \n\t
    \n\t\t\n\t
    `\n};","/**\n * Copyright (C) 2022 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n/**\n *\n */\nexport const CoreFetchCmpt = {\n\temits: ['dataFetched'], // this component can emit the event dataFetched that it is catched by this component itself\n\tprops: {\n\t\trefresh: { // to refresh this component\n\t\t\ttype: Boolean\n\t\t},\n\t\tapiFunction: { // the function to call, must return a Promise\n\t\t\trequired: true,\n\t\t\ttype: Function\n\t\t},\n\t\tapiFunctionParameters: {} // parameters for the apiFunction, type mixed, optional\n\t},\n\twatch: {\n\t\t/**\n\t\t * If the refresh property is changed then call fetchData\n\t\t */\n\t\trefresh: function (newValue, oldValue) {\n\t\t\tthis.fetchData();\n\t\t}\n\t},\n\tdata: function() {\n\t\treturn {\n\t\t\tloading: false, // if in loading or not\n\t\t\terror: false, // if an error occurred while loading data\n\t\t\terrorMessage: null // the error message\n\t\t};\n\t},\n\tcreated: function() {\n\t\tthis.fetchData();\n\t},\n\tmethods: {\n\t\t/**\n\t\t *\n\t\t */\n\t\tfetchData: function() {\n\t\t\tthis.loading = true; // loader started\n\t\t\tthis.error = false;\n\t\t\tthis.errorMessage = null;\n\n\t\t\t// Checks if the apifunction is a callable function\n\t\t\tif (typeof this.apiFunction == \"function\")\n\t\t\t{\n\t\t\t\t// Call the function stored in apiFunction\n\t \t\tlet apiFunctionResult = this.apiFunction(this.apiFunctionParameters);\n\n\t\t\t\t// It is expected that the function returns a Promise\n\t\t\t\tif (apiFunctionResult instanceof Promise)\n\t\t\t\t{\n\t\t\t\t\tapiFunctionResult\n\t\t\t\t\t\t.then(this.successHandler) // on success\n\t\t\t\t\t\t.catch(this.errorHandler) // on error\n\t\t\t\t\t\t.finally(this.finallyHandler); // finally in any case\n\t\t\t\t}\n\t\t\t\telse // otherwise display an error\n\t\t\t\t{\n\t\t\t\t\tthis.setError(\"The called apiFunction does not return a Promise\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse // otherwise display an error\n\t\t\t{\n\t\t\t\tthis.setError(\"Property apiFunction is not a function\");\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\tsetError: function(errorMessage) {\n\t\t\tthis.loading = false; // loading ended\n\t\t\tthis.error = true; // error occurred\n\t\t\tthis.errorMessage = errorMessage; // save the error message\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\tsuccessHandler: function(response) {\n\t\t\tthis.$emit('dataFetched', response ? response.data : undefined); // trigger the event dataFetched\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\terrorHandler: function(error) {\n\t\t\tif (error.response?.data?.retval)\n\t\t\t\tthis.setError(error.response.data.retval);\n\t\t\telse if (error.data?.message)\n\t\t\t\tthis.setError(error.data.message);\n\t\t\telse\n\t\t\t\tthis.setError(error.message);\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\tfinallyHandler: function() {\n\t\t\tthis.loading = false; // loading ended\n\t\t}\n\t},\n\ttemplate: `\n\t\t\n\t\t\t
    Loading...
    \n\t\t
    \n\t\t\n\t\t\t
    {{ errorMessage }}
    \n\t\t
    \n\t\t\n\t`\n};\n","/**\n * Copyright (C) 2022 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nconst FILTER_COMPONENT_NEW_FILTER = 'Filter Component New Filter';\n\n/**\n *\n */\nexport default {\n\tprops: {\n\t\tfilters: {\n\t\t\ttype: Array,\n\t\t\tdefault: []\n\t\t},\n\t\tcolumns: {\n\t\t\ttype: Array,\n\t\t\tdefault: []\n\t\t},\n\t\tfields: {\n\t\t\ttype: Array,\n\t\t\tdefault: []\n\t\t}\n\t},\n\temits: {\n\t\tswitchFilter: ['filterId'],\n\t\tapplyFilterConfig: ['filterFields'],\n\t\tsaveCustomFilter: ['customFilterName']\n\t},\n\tdata: function() {\n\t\treturn {\n\t\t\tcurrentFields: []\n\t\t};\n\t},\n\tcomputed: {\n\t\ttypes() {\n\t\t\treturn this.columns.reduce((a,c) => {\n\t\t\t\tlet type = c.type.toLowerCase();\n\t\t\t\tif (type.indexOf('int') >= 0)\n\t\t\t\t\ta[c.name] = 'Numeric';\n\t\t\t\telse if (\n\t\t\t\t\ttype.indexOf('varchar') >= 0 || \n\t\t\t\t\ttype.indexOf('text') >= 0 || \n\t\t\t\t\ttype.indexOf('bpchar') >= 0\n\t\t\t\t)\n\t\t\t\t\ta[c.name] = 'Text';\n\t\t\t\telse if (\n\t\t\t\t\ttype.indexOf('timestamp') >= 0 || \n\t\t\t\t\ttype.indexOf('date') >= 0\n\t\t\t\t)\n\t\t\t\t\ta[c.name] = 'Date';\n\t\t\t\telse\n\t\t\t\t\ta[c.name] = '';\n\t\t\t\treturn a;\n\t\t\t}, {});\n\t\t}\n\t},\n\twatch: {\n\t\tfields(n) {\n\t\t\tthis.currentFields = n;\n\t\t}\n\t},\n\tmethods: {\n\t\tswitchFilter(evt) {\n\t\t\tthis.$emit('switchFilter', evt.currentTarget.value);\n\t\t},\n\t\tapplyFilterConfig() {\n\t\t\tconst filteredFields = this.currentFields.filter(el => el.name != FILTER_COMPONENT_NEW_FILTER);\n\t\t\tif (filteredFields.filter(el => el.condition == \"\").length)\n\t\t\t\talert(\"Please fill all the filter options\");\n\t\t\telse\n\t\t\t\tthis.$emit('applyFilterConfig', filteredFields);\n\t\t},\n\t\taddField(evt) {\n\t\t\tthis.currentFields.push({\n\t\t\t\tname: FILTER_COMPONENT_NEW_FILTER\n\t\t\t});\n\t\t},\n\t\tremoveField(index) {\n\t\t\tthis.currentFields.splice(index, 1);\n\t\t}\n\t},\n\ttemplate: `\n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t
    \n\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\tFilter {{ index + 1 }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n\t`\n};\n\n","/**\n * Copyright (C) 2022 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n/**\n *\n */\nexport default {\n\tprops: {\n\t\tfields: Array,\n\t\tselected: {\n\t\t\ttype: Array,\n\t\t\tdefault: []\n\t\t},\n\t\tnames: {\n\t\t\ttype: Object,\n\t\t\tdefault: {}\n\t\t}\n\t},\n\temits: {\n\t\thide: ['fieldName'],\n\t\tshow: ['fieldName']\n\t},\n\tdata: function() {\n\t\treturn {\n\t\t\tselectedFields: []\n\t\t};\n\t},\n\twatch: {\n\t\tselected(n) {\n\t\t\tthis.selectedFields = n;\n\t\t}\n\t},\n\tmethods: {\n\t\ttoggle(field) {\n\t\t\tif (this.selectedFields.indexOf(field) != -1)\n\t\t\t{\n\t\t\t\tthis.selectedFields.splice(this.selectedFields.indexOf(field), 1);\n\t\t\t\tthis.$emit('hide', field);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis.selectedFields.push(field);\n\t\t\t\tthis.$emit('show', field);\n\t\t\t}\n\t\t}\n\t},\n\ttemplate: `\n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\t{{ names[fieldToDisplay] || fieldToDisplay }}\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t\n\t`\n};\n\n","/**\n * Copyright (C) 2022 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nconst DEFAULT_ICONS = {\n\tjsonLines: 'fa-file-lines',\n\txlsx: 'fa-file-excel',\n\tpdf: 'fa-file-pdf',\n\thtml: 'fa-file-code',\n\tjson: 'fa-file',\n\tcsv: 'fa-file-csv'\n};\nconst DEFAULT_LABELS = {\n\tjsonLines: 'Download as JSONLINES',\n\txlsx: 'Download as XLSX',\n\tpdf: 'Download as PDF',\n\thtml: 'Download as HTML',\n\tjson: 'Download as JSON',\n\tcsv: 'Download as CSV '\n};\n\n\n/**\n *\n */\nexport default {\n\tprops: {\n\t\ttabulator: Object,\n\t\tconfig: {\n\t\t\ttype: [Boolean, String, Function, Array, Object],\n\t\t\tdefault: false\n\t\t},\n\t\ticonClass: [String, Array, Object]\n\t},\n\tcomputed: {\n\t\tcurrentConfig() {\n\t\t\tif (!this.config)\n\t\t\t\treturn false;\n\n\t\t\tlet config = this.config;\n\n\t\t\tif (config instanceof Function)\n\t\t\t\treturn [config];\n\n\t\t\tif (config === null)\n\t\t\t\treturn [];\n\n\t\t\tif (this.config === true)\n\t\t\t\tconfig = ['csv'];\n\n\t\t\tif (Object.prototype.toString.call(config) === \"[object String]\")\n\t\t\t\tconfig = config.split(',');\n\n\t\t\tif (typeof config === 'object' && !Array.isArray(config)) {\n\t\t\t\tlet newConfig = [];\n\t\t\t\tfor (var k in config) {\n\t\t\t\t\tvar v = config[k], type;\n\t\t\t\t\t\n\t\t\t\t\tif (!v)\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\n\t\t\t\t\tif (Object.prototype.toString.call(v) === \"[object String]\") {\n\t\t\t\t\t\ttype = this.stringToFileFormatter(v);\n\t\t\t\t\t\tif (type !== null) {\n\t\t\t\t\t\t\tnewConfig.push({\n\t\t\t\t\t\t\t\ticon: 'fa-solid ' + DEFAULT_ICONS[type],\n\t\t\t\t\t\t\t\tlabel: v === k ? DEFAULT_LABELS[type] : k,\n\t\t\t\t\t\t\t\tformatter: type\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttype = this.stringToFileFormatter(k);\n\t\t\t\t\t\t\tif(type !== null) {\n\t\t\t\t\t\t\t\tnewConfig.push({\n\t\t\t\t\t\t\t\t\ticon: 'fa-solid ' + DEFAULT_ICONS[type],\n\t\t\t\t\t\t\t\t\tlabel: v,\n\t\t\t\t\t\t\t\t\tformatter: type\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\talert('neither ' + k + ' nor ' + v + ' are supported download file types');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (typeof v === 'object' && !Array.isArray(v)) {\n\t\t\t\t\t\ttype = this.stringToFileFormatter(k);\n\t\t\t\t\t\tif (type !== null) {\n\t\t\t\t\t\t\tif (v.formatter === undefined)\n\t\t\t\t\t\t\t\tv.formatter = type;\n\t\t\t\t\t\t\tif (v.label === undefined)\n\t\t\t\t\t\t\t\tv.label = DEFAULT_LABELS[type];\n\t\t\t\t\t\t\tif (v.icon === undefined)\n\t\t\t\t\t\t\t\tv.icon = DEFAULT_ICONS[type];\n\t\t\t\t\t\t\tnewConfig.push(v);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (v.label === undefined)\n\t\t\t\t\t\t\t\tv.label = k;\n\t\t\t\t\t\t\tnewConfig.push(v);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttype = this.stringToFileFormatter(k);\n\t\t\t\t\t\tif (type !== null) {\n\t\t\t\t\t\t\tnewConfig.push({\n\t\t\t\t\t\t\t\ticon: 'fa-solid ' + DEFAULT_ICONS[type],\n\t\t\t\t\t\t\t\tlabel: DEFAULT_LABELS[type],\n\t\t\t\t\t\t\t\tformatter: type\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\talert(k + ' is not a supported download file type');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconfig = newConfig;\n\t\t\t}\n\n\t\t\tif (Array.isArray(config))\n\t\t\t{\n\t\t\t\tconfig = config.map(el => {\n\t\t\t\t\tif (Object.prototype.toString.call(el) === \"[object String]\") {\n\t\t\t\t\t\tlet formatter = this.stringToFileFormatter(el);\n\t\t\t\t\t\tif (formatter === null)\n\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\ticon: 'fa-solid ' + DEFAULT_ICONS[formatter],\n\t\t\t\t\t\t\tlabel: DEFAULT_LABELS[formatter],\n\t\t\t\t\t\t\tformatter\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (el instanceof Function)\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tformatter: el\n\t\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (typeof el === 'object' && !Array.isArray(el) && el !== null) {\n\t\t\t\t\t\tif (el.formatter instanceof Function)\n\t\t\t\t\t\t\treturn el;\n\t\t\t\t\t\tif (this.validateFileFormatter(el.formatter))\n\t\t\t\t\t\t\treturn el;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\treturn null;\n\t\t\t\t}).filter(el => el !== null);\n\n\t\t\t\tif (config.length < 2)\n\t\t\t\t\treturn config;\n\n\t\t\t\tif (config.filter(el => el.label || el.icon).length == config.length)\n\t\t\t\t\treturn config;\n\n\t\t\t\talert('Config not valid');\n\t\t\t}\n\n\t\t\treturn [];\n\t\t}\n\t},\n\tmethods: {\n\t\tstringToFileFormatter(input) {\n\t\t\tlet lcInput = input.toLowerCase();\n\t\t\t\n\t\t\tif (lcInput == 'jsonlines')\n\t\t\t\treturn 'jsonLines';\n\t\t\t\n\t\t\tif (['xlsx', 'pdf', 'html', 'json', 'csv'].includes(lcInput))\n\t\t\t\treturn lcInput;\n\n\t\t\treturn null;\n\t\t},\n\t\tvalidateFileFormatter(input) {\n\t\t\tlet formatter = this.stringToFileFormatter(input);\n\t\t\tif (!formatter) {\n\t\t\t\talert(input + ' is not a supported file formatter');\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (formatter == 'xlsx') {\n\t\t\t\tif (!window.XLSX) {\n\t\t\t\t\talert('XLSX Library not loaded');\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (formatter == 'pdf') {\n\t\t\t\tif (!window.jspdf) {\n\t\t\t\t\talert('jsPDF Library not loaded');\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tvar doc = new jspdf.jsPDF({});\n\t\t\t\tif (!doc.autoTable) {\n\t\t\t\t\talert('jsPDF-AutoTable Plugin not loaded');\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t\tdownload(config) {\n\t\t\tthis.tabulator.download(config.formatter, config.file, config.options)\n\t\t}\n\t},\n\ttemplate: `\n\t\n\t`\n};\n\n","const elementDataMap = new WeakMap();\n\nexport default {\n\tmounted(el, binding) {\n\t\tlet open = false;\n\t\telementDataMap.set(el, evt => {\n\t\t\tif (!open)\n\t\t\t\treturn;\n\n\t\t\tif (el.contains(evt.target))\n\t\t\t\treturn;\n\n\t\t\tconst collapse = bootstrap.Collapse.getInstance(el)\n\t\t\tif (collapse)\n\t\t\t\tcollapse.hide();\n\t\t});\n\t\tel.addEventListener('shown.bs.collapse', () => {\n\t\t\topen = true;\n\t\t});\n\t\tel.addEventListener('hide.bs.collapse', () => {\n\t\t\topen = false;\n\t\t});\n\t\tdocument.addEventListener('click', elementDataMap.get(el), true);\n\t},\n\tbeforeUnmount(el, binding) {\n\t\tdocument.removeEventListener('click', elementDataMap.get(el));\n\t\tdelete el.collapsibleAutoHideFunc;\n\t}\n}","/**\n * This may need changes if Tabulator gets updated!\n *\n * Current working Version: 5.5.2\n * \n * This is a copy of the fitDataStretch function. The only difference\n * is the check for frozen columns on line 22.\n */\n\nexport default window.Tabulator?.extendModule(\"layout\", \"modes\", {\n\tfitDataStretchFrozen(columns, forced) {\n\t\tvar colsWidth = 0,\n\t\ttableWidth = this.table.rowManager.element.clientWidth,\n\t\tgap = 0,\n\t\tlastCol = false;\n\n\t\tcolumns.forEach((column, i) => {\n\t\t\tif (!column.widthFixed) {\n\t\t\t\tcolumn.reinitializeWidth();\n\t\t\t}\n\n\t\t\tif (this.table.options.responsiveLayout ? column.modules.responsive.visible : column.visible && !column.definition.frozen) {\n\t\t\t\tlastCol = column;\n\t\t\t}\n\n\t\t\tif (column.visible) {\n\t\t\t\tcolsWidth += column.getWidth();\n\t\t\t}\n\t\t});\n\n\t\tif (lastCol){\n\t\t\tgap = tableWidth - colsWidth + lastCol.getWidth();\n\n\t\t\tif (this.table.options.responsiveLayout && this.table.modExists(\"responsiveLayout\", true)) {\n\t\t\t\tlastCol.setWidth(0);\n\t\t\t\tthis.table.modules.responsiveLayout.update();\n\t\t\t}\n\n\t\t\tif (gap > 0) {\n\t\t\t\tlastCol.setWidth(gap);\n\t\t\t} else {\n\t\t\t\tlastCol.reinitializeWidth();\n\t\t\t}\n\t\t} else {\n\t\t\tif (this.table.options.responsiveLayout && this.table.modExists(\"responsiveLayout\", true)) {\n\t\t\t\tthis.table.modules.responsiveLayout.update();\n\t\t\t}\n\t\t}\n\t}\n});\n","/**\n * Copyright (C) 2025 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tsaveCustomFilter(wsParams) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/filter/saveCustomFilter',\n\t\t\tparams: {\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tcustomFilterName: wsParams.customFilterName\n\t\t\t}\n\t\t};\n\t},\n\tremoveCustomFilter(wsParams) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/filter/removeCustomFilter',\n\t\t\tparams: {\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterId: wsParams.filterId\n\t\t\t}\n\t\t};\n\t},\n\tapplyFilterFields(wsParams) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/filter/applyFilterFields',\n\t\t\tparams: {\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterFields: wsParams.filterFields\n\t\t\t}\n\t\t};\n\t},\n\taddFilterField(wsParams) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/filter/addFilterField',\n\t\t\tparams: {\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterField: wsParams.filterField\n\t\t\t}\n\t\t};\n\t},\n\tremoveFilterField(wsParams) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/filter/removeFilterField',\n\t\t\tparams: {\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterField: wsParams.filterField\n\t\t\t}\n\t\t};\n\t},\n\tgetFilterById(wsParams) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/filter/getFilter',\n\t\t\tparams: {\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterId: wsParams.filterId\n\t\t\t}\n\t\t};\n\t},\n\tgetFilter(wsParams) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/filter/getFilter',\n\t\t\tparams: {\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType\n\t\t\t}\n\t\t};\n\t}\n};","/**\n * Copyright (C) 2022 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nimport {CoreFetchCmpt} from '../../components/Fetch.js';\nimport FilterConfig from './Filter/Config.js';\nimport FilterColumns from './Filter/Columns.js';\nimport TableDownload from './Table/Download.js';\nimport collapseAutoClose from '../../directives/collapseAutoClose.js';\n\nimport moduleLayoutFitDataStretchFrozen from '../../tabulator/layouts/fitDataStretchFrozen.js';\n\nimport ApiFilter from '../../api/factory/filter.js';\n\n//\nconst FILTER_COMPONENT_NEW_FILTER = 'Filter Component New Filter';\nconst FILTER_COMPONENT_NEW_FILTER_TYPE = 'Filter Component New Filter Type';\n\nvar _uuid = 0;\n\n/**\n *\n */\nexport const CoreFilterCmpt = {\n\tcomponents: {\n\t\tCoreFetchCmpt,\n\t\tFilterConfig,\n\t\tFilterColumns,\n\t\tTableDownload\n\t},\n\tdirectives: {\n\t\tcollapseAutoClose\n\t},\n\temits: [\n\t\t'nwNewEntry',\n\t\t'click:new',\n\t\t'tableBuilt',\n\t\t'uuidDefined'\n\t],\n\tprops: {\n\t\tonNwNewEntry: Function, // NOTE(chris): Hack to get the nwNewEntry listener into $props\n\t\ttitle: String,\n\t\tdescription: String,\n\t\tsideMenu: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true\n\t\t},\n\t\tfilterType: {\n\t\t\ttype: String\n\t\t},\n\t\ttabulatorOptions: Object,\n\t\ttabulatorEvents: Array,\n\t\ttableOnly: Boolean,\n\t\tnoColumnFilter:Boolean,\n\t\treload: Boolean,\n\t\treloadBtnInfotext: String,\n\t\tdownload: {\n\t\t\ttype: [Boolean, String, Function, Array, Object],\n\t\t\tdefault: false\n\t\t},\n\t\tnewBtnShow: Boolean,\n\t\tnewBtnClass: [String, Array, Object],\n\t\tnewBtnDisabled: Boolean,\n\t\tnewBtnLabel: String,\n\t\tuniqueId: String,\n\n\t\tidField: String,\n\t\tparentIdField: String,\n\t\tcountOnly: Boolean,\n\t\tuseSelectionSpan: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true\n\t\t}\n\t},\n\tdata: function() {\n\t\treturn {\n\t\t\tuuid: 0,\n\t\t\t// FilterCmpt properties\n\t\t\tfilterName: null,\n\t\t\tfilterActive: false,\n\t\t\tfields: null,\n\t\t\tdataset: null,\n\t\t\tdatasetMetadata: null,\n\t\t\tselectedFields: null,\n\t\t\tfilterFields: null,\n\n\t\t\tavailableFilters: null,\n\t\t\tselectedFilter: null,\n\n\t\t\t// FetchCmpt binded properties\n\t\t\tfetchCmptRefresh: false,\n\t\t\tfetchCmptApiFunction: null,\n\t\t\tfetchCmptApiFunctionParams: null,\n\t\t\tfetchCmptDataFetched: null,\n\n\t\t\tfetchResult: null,\n\n\t\t\ttabulator: null,\n\t\t\ttableBuilt: false,\n\t\t\ttabulatorHasSelector: false,\n\t\t\tselectedData: [],\n\t\t\tpersistence: {\n\t\t\t\tsort: true,\n\t\t\t\tcolumns: true,\n\t\t\t\tfilter: false,\n\t\t\t\theaderFilter: false,\n\t\t\t\tgroup: false,\n\t\t\t\tpage: false,\n\t\t\t}\n\t\t};\n\t},\n\tcomputed: {\n\t\tnotSelectedFields() {\n\t\t\tif (!this.fields || !this.selectedFields)\n\t\t\t\treturn null;\n\t\t\treturn this.fields.filter(x => this.selectedFields.indexOf(x) === -1)\n\t\t},\n\t\tfilteredData() {\n\t\t\tif (!this.dataset)\n\t\t\t\treturn [];\n\t\t\treturn JSON.parse(JSON.stringify(this.dataset));\n\t\t},\n\t\tfilteredColumns() {\n\t\t\tlet fields = JSON.parse(JSON.stringify(this.fields)) || [];\n\t\t\tlet selectedFields = JSON.parse(JSON.stringify(this.selectedFields)) || [];\n\n\t\t\tlet columns = null;\n\n\t\t\t// If the tabulator options has been provided and it contains the property columns\n\t\t\tif (this.tabulatorOptions && this.tabulatorOptions.hasOwnProperty('columns'))\n\t\t\t\tcolumns = this.tabulatorOptions.columns;\n\n\t\t\t// If columns is not an array or it is an array with less elements then the array fields\n\t\t\tif (!Array.isArray(columns) || (Array.isArray(columns) && columns.length < fields.length))\n\t\t\t{\n\t\t\t\tcolumns = []; // set it as an empty array\n\n\t\t\t\t// Loop throught all the retrieved columns from database\n\t\t\t\tfor (let field of fields)\n\t\t\t\t{\n\t\t\t\t\t// Create a new column having the title equal to the field name\n\t\t\t\t\tlet column = {\n\t\t\t\t\t\ttitle: field,\n\t\t\t\t\t\tfield: field\n\t\t\t\t\t};\n\n\t\t\t\t\t// If the column has to be displayed or not\n\t\t\t\t\tcolumn.visible = selectedFields.indexOf(field) >= 0;\n\n\t\t\t\t\t// Add the new column to the list of columns\n\t\t\t\t\tcolumns.push(column);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse // the property columns has been provided in the tabulator options\n\t\t\t{\n\t\t\t\t// Loop throught the property columns of the tabulator options\n\t\t\t\tfor (let col of columns)\n\t\t\t\t{\n\t\t\t\t\t// If the column has to be displayed or not\n\t\t\t\t\t/* fields.indexOf(col.field) == -1; ensures displaying formatter colums\n\t\t\t\t\te.g. column with rowSelection checkboxes or with custom formatted action buttons */\n\t\t\t\t\tcol.visible = selectedFields.indexOf(col.field) >= 0 || fields.indexOf(col.field) == -1;\n\n\t\t\t\t\tif (col.hasOwnProperty('resizable'))\n\t\t\t\t\t\tcol.resizable = col.visible;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn columns;\n\t\t},\n\t\tfieldIdsForVisibilty() {\n\t\t\tif (!this.tableBuilt)\n\t\t\t\treturn [];\n\t\t\treturn this.tabulator.getColumns().filter(col => {\n\t\t\t\tlet def = col.getDefinition();\n\t\t\t\treturn !def.frozen && def.title && def.formatter != \"responsiveCollapse\";\n\t\t\t}).map(col => col.getField());\n\t\t},\n\t\tfieldNames() {\n\t\t\tif (!this.tableBuilt)\n\t\t\t\treturn {};\n\t\t\treturn this.tabulator.getColumns().reduce((res, col) => {\n\t\t\t\tres[col.getField()] = col.getDefinition().title;\n\t\t\t\treturn res;\n\t\t\t}, {});\n\t\t},\n\t\tidExtra() {\n\t\t\tif (!this.uuid)\n\t\t\t\treturn '';\n\t\t\treturn '-' + this.uuid;\n\t\t},\n\t\tcolumnsForFilter() {\n\t\t\tif (!this.filteredColumns || !this.datasetMetadata)\n\t\t\t\treturn [];\n\t\t\tconst filterTitles = this.filteredColumns.reduce((a,c) => {\n\t\t\t\ta[c.field] = c.title;\n\t\t\t\treturn a;\n\t\t\t}, {});\n\t\t\treturn this.datasetMetadata.map(el => ({...el, ...{title: filterTitles[el.name]}}));\n\t\t}\n\t},\n\tmethods: {\n\t\treloadTable() {\n\t\t\tif (this.tableOnly)\n\t\t\t\tthis.tabulator.setData();\n\t\t\telse\n\t\t\t\tthis.getFilter();\n\t\t},\n\t\tasync initTabulator() {\n\t\t\tlet placeholder = '< Phrasen Plugin not loaded! >';\n\t\t\tif (this.$p) {\n\t\t\t\tawait this.$p.loadCategory('ui');\n\t\t\t\tplaceholder = this.$p.t('ui/keineDatenVorhanden');\n\t\t\t}\n\n\t\t\tif (!this.tableOnly) {\n\t\t\t\t// prefetch data to get fields & selectedFields for filteredColumns & filteredData\n\t\t\t\tawait new Promise(resolve => {\n\t\t\t\t\tconst filterId = window.location.hash ? window.location.hash.slice(1) : null;\n\n\t\t\t\t\tconst resolvePromiseFunc = data => {\n\t\t\t\t\t\tthis.setRenderData(data);\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t};\n\t\t\t\t\t// get the filter data\n\t\t\t\t\tif (filterId === null)\n\t\t\t\t\t\tthis.startFetchCmpt(\n\t\t\t\t\t\t\twsParams => this.$api.call(ApiFilter.getFilter(wsParams)),\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\tresolvePromiseFunc\n\t\t\t\t\t\t);\n\t\t\t\t\telse\n\t\t\t\t\t\tthis.startFetchCmpt(\n\t\t\t\t\t\t\twsParams => this.$api.call(ApiFilter.getFilterById(wsParams)),\n\t\t\t\t\t\t\t{ filterId },\n\t\t\t\t\t\t\tresolvePromiseFunc\n\t\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Define a default tabulator options in case it was not provided\n\t\t\tlet tabulatorOptions = {...{\n\t\t\t\t\tlayout: \"fitDataStretchFrozen\",\n\t\t\t\t\tmovableColumns: true,\n\t\t\t\t\tcolumnDefaults:{\n\t\t\t\t\t\ttooltip: true\n\t\t\t\t\t},\n\t\t\t\t\tplaceholder,\n\t\t\t\t\tpersistence: this.persistence,\n\t\t\t\t}, ...(this.tabulatorOptions || {})};\n\n\t\t\t// set default height if no height property is set\n\t\t\tif (tabulatorOptions.height === undefined &&\n\t\t\t\ttabulatorOptions.minHeight === undefined &&\n\t\t\t\ttabulatorOptions.maxHeight === undefined) {\n\t\t\t\ttabulatorOptions.height = 500;\n\t\t\t}\n\n\t\t\tif (!this.tableOnly) {\n\t\t\t\ttabulatorOptions.data = this.filteredData;\n\t\t\t\ttabulatorOptions.columns = this.filteredColumns;\n\t\t\t} else {\n\t\t\t\ttabulatorOptions.columns.forEach(col => {\n\t\t\t\t\tif (col.visible === undefined)\n\t\t\t\t\t\tcol.visible = true;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (tabulatorOptions.selectable || (tabulatorOptions.columns && tabulatorOptions.columns.filter(el => el.formatter == 'rowSelection').length))\n\t\t\t\tthis.tabulatorHasSelector = true;\n\n\t\t\tif (this.idField) {\n\t\t\t\t// enable nested tabulator if parent Id given\n\t\t\t\tif (this.parentIdField) tabulatorOptions.dataTree = true;\n\t\t\t\t// set tabulator index\n\t\t\t\ttabulatorOptions.index = this.idField;\n\t\t\t}\n\n\t\t\t// Start the tabulator with the build options\n\t\t\tthis.tabulator = new Tabulator(\n\t\t\t\tthis.$refs.table,\n\t\t\t\ttabulatorOptions\n\t\t\t);\n\t\t\t// If event handlers have been provided\n\t\t\tif (Array.isArray(this.tabulatorEvents) && this.tabulatorEvents.length > 0)\n\t\t\t{\n\t\t\t\t// Attach all the provided event handlers to the started tabulator\n\t\t\t\tfor (let evt of this.tabulatorEvents)\n\t\t\t\t\tthis.tabulator.on(evt.event, evt.handler);\n\t\t\t}\n\t\t\tthis.tabulator.on('tableBuilt', () => {this.tableBuilt = true; this.$emit('tableBuilt');});\n\t\t\tthis.tabulator.on(\"rowSelectionChanged\", data => {\n\t\t\t\tthis.selectedData = data;\n\t\t\t});\n\n\t\t\t// if nested tabulator, restructure data\n\t\t\tif (this.parentIdField && this.idField) {\n\t\t\t\tthis.tabulator.on(\"dataLoading\", data => {\n\t\t\t\t\tlet toDelete = [];\n\n\t\t\t\t\t// loop through all data\n\t\t\t\t\tfor (let childIdx = 0; childIdx < data.length; childIdx++)\n\t\t\t\t\t{\n\t\t\t\t\t\tlet child = data[childIdx];\n\n\t\t\t\t\t\t// if it has parent id, it is a child\n\t\t\t\t\t\tif (child[this.parentIdField])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// append the child on the right place. If parent found, mark original sw child on 0 level for deleting\n\t\t\t\t\t\t\tif (this.appendChild(data, child)) toDelete.push(childIdx);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// delete the marked children from 0 level\n\t\t\t\t\tfor (let counter = 0; counter < toDelete.length; counter++)\n\t\t\t\t\t{\n\t\t\t\t\t\t// decrease index by counter as index of data array changes after every deletion\n\t\t\t\t\t\tdata.splice(toDelete[counter] - counter, 1);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (this.tableOnly) {\n\t\t\t\tthis.tabulator.on('tableBuilt', () => {\n\t\t\t\t\tconst cols = this.tabulator.getColumns();\n\t\t\t\t\tthis.fields = cols.map(col => col.getField());\n\t\t\t\t\tthis.selectedFields = cols.filter(col => col.isVisible()).map(col => col.getField());\n\t\t\t\t\tif (this.tabulator.options.persistence.headerFilter)\n\t\t\t\t\t\tthis._setHeaderFilter();\n\t\t\t\t});\n\n\t\t\t}\n\n\t\t\tthis.tabulator.on(\"dataFiltered\", filters => {\n\t\t\t\tthis.filterActive = filters.length > 0;\n\t\t\t});\n\t\t},\n\t\tupdateTabulator() {\n\t\t\tif (this.tabulator) {\n\t\t\t\tif (this.tableBuilt)\n\t\t\t\t\tthis._updateTabulator();\n\t\t\t\telse\n\t\t\t\t\tthis.tabulator.on('tableBuilt', this._updateTabulator);\n\t\t\t}\n\t\t},\n\t\t_updateTabulator() {\n\t\t\tthis.tabulatorHasSelector = this.tabulatorOptions.selectable || this.filteredColumns.filter(el => el.formatter == 'rowSelection').length;\n\t\t\tthis.tabulator.setColumns(this.filteredColumns);\n\t\t\tthis.tabulator.setData(this.filteredData);\n\t\t\tthis._setHeaderFilter()\n\t\t},\n\t\tclearFilters()\n\t\t{\n\t\t\tlet existingFilters = this.tabulator.getHeaderFilters();\n\t\t\texistingFilters.forEach(filter => {\n\t\t\t\tthis.tabulator.setHeaderFilterValue(filter.field, \"\");\n\t\t\t});\n\t\t\tthis.tabulator.clearFilter();\n\t\t\tthis.filterActive = false;\n\t\t},\n\t\t_setHeaderFilter()\n\t\t{\n\t\t\tconst existingFilters = this.tabulator.getHeaderFilters();\n\t\t\texistingFilters.forEach(filter => {\n\t\t\t\tthis.tabulator.setHeaderFilterValue(filter.field, filter.value);\n\t\t\t});\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\tgetFilter() {\n\t\t\tif (this.selectedFilter === null)\n\t\t\t\tthis.startFetchCmpt(\n\t\t\t\t\twsParams => this.$api.call(ApiFilter.getFilter(wsParams)),\n\t\t\t\t\tnull,\n\t\t\t\t\tthis.render\n\t\t\t\t);\n\t\t\telse\n\t\t\t\tthis.startFetchCmpt(\n\t\t\t\t\twsParams => this.$api.call(ApiFilter.getFilterById(wsParams)),\n\t\t\t\t\t{\n\t\t\t\t\t\tfilterId: this.selectedFilter\n\t\t\t\t\t},\n\t\t\t\t\tthis.render\n\t\t\t\t);\n\t\t},\n\t\tsetRenderData(data) {\n\t\t\tthis.fetchResult = data;\n\t\t\tthis.filterName = data.filterName;\n\t\t\tthis.dataset = data.dataset;\n\t\t\tthis.datasetMetadata = data.datasetMetadata;\n\n\t\t\tthis.fields = data.fields;\n\t\t\tthis.selectedFields = data.selectedFields;\n\t\t\tthis.filterFields = [];\n\n\t\t\tfor (let i = 0; i < data.datasetMetadata.length; i++)\n\t\t\t{\n\t\t\t\tfor (let j = 0; j < data.filters.length; j++)\n\t\t\t\t{\n\t\t\t\t\tif (data.datasetMetadata[i].name == data.filters[j].name)\n\t\t\t\t\t{\n\t\t\t\t\t\tlet filter = data.filters[j];\n\t\t\t\t\t\tfilter.type = data.datasetMetadata[i].type;\n\n\t\t\t\t\t\tthis.filterFields.push(filter);\n\t\t\t\t\t\t//break;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\trender(response) {\n\t\t\tlet data = response;\n\n\t\t\tthis.setRenderData(data);\n\n\t\t\t// If the side menu is active\n\t\t\tif (this.sideMenu === true)\n\t\t\t{\n\t\t\t\tthis.setSideMenu(data);\n\t\t\t}\n\t\t\telse // otherwise use the dropdown in the filter options\n\t\t\t{\n\t\t\t\tthis.setDropDownMenu(data);\n\t\t\t}\n\t\t\tthis.updateTabulator();\n\t\t},\n\t\t/**\n\t\t * Set the menu\n\t\t */\n\t\tsetSideMenu(data) {\n\t\t\tlet filters = data.sideMenu.filters;\n\t\t\tlet personalFilters = data.sideMenu.personalFilters;\n\t\t\tlet filtersArray = [];\n\n\t\t\tfor (let filtersCount = 0; filtersCount < filters.length; filtersCount++)\n\t\t\t{\n\t\t\t\tlet link = filters[filtersCount].link;\n\n\t\t\t\tif (link == null) link = '#';\n\n\t\t\t\tfiltersArray[filtersArray.length] = {\n\t\t\t\t\tid: filters[filtersCount].filter_id,\n\t\t\t\t\tlink: link + filters[filtersCount].filter_id,\n\t\t\t\t\tdescription: filters[filtersCount].desc,\n\t\t\t\t\tsort: filtersCount,\n\t\t\t\t\tonClickCall: this.handlerGetFilterById\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tfor (let filtersCount = 0; filtersCount < personalFilters.length; filtersCount++)\n\t\t\t{\n\t\t\t\tlet link = personalFilters[filtersCount].link;\n\n\t\t\t\tif (link == null) link = '#';\n\n\t\t\t\tfiltersArray[filtersArray.length] = {\n\t\t\t\t\tid: personalFilters[filtersCount].filter_id,\n\t\t\t\t\tlink: link + personalFilters[filtersCount].filter_id,\n\t\t\t\t\tdescription: personalFilters[filtersCount].desc,\n\t\t\t\t\tsubscriptDescription: personalFilters[filtersCount].subscriptDescription,\n\t\t\t\t\tsubscriptLinkClass: personalFilters[filtersCount].subscriptLinkClass,\n\t\t\t\t\tsubscriptLinkValue: personalFilters[filtersCount].subscriptLinkValue,\n\t\t\t\t\tsort: filtersCount,\n\t\t\t\t\tonClickCall: this.handlerGetFilterById,\n\t\t\t\t\tonClickSubscriptCall: this.handlerRemoveCustomFilter\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tthis.availableFilters = filtersArray;\n\n\t\t\tthis.$emit(\n\t\t\t\t'nwNewEntry',\n\t\t\t\t{\n\t\t\t\t\tlink: \"#\",\n\t\t\t\t\tdescription: \"Filters\",\n\t\t\t\t\ticon: \"filter\",\n\t\t\t\t\tchildren: filtersArray\n\t\t\t\t}\n\t\t\t);\n\t\t},\n\t\t/**\n\t\t * Set the drop down menu\n\t\t */\n\t\tsetDropDownMenu(data) {\n\t\t\tlet filters = data.sideMenu.filters;\n\t\t\tlet personalFilters = data.sideMenu.personalFilters;\n\t\t\tlet filtersArray = [];\n\n\t\t\tfor (let filtersCount = 0; filtersCount < filters.length; filtersCount++)\n\t\t\t{\n\t\t\t\tlet link = filters[filtersCount].link;\n\n\t\t\t\tif (link == null) link = '#';\n\n\t\t\t\tfiltersArray[filtersArray.length] = {\n\t\t\t\t\tid: filters[filtersCount].filter_id,\n\t\t\t\t\toption: filters[filtersCount].filter_id,\n\t\t\t\t\tdescription: filters[filtersCount].desc\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tfor (let filtersCount = 0; filtersCount < personalFilters.length; filtersCount++)\n\t\t\t{\n\t\t\t\tlet link = personalFilters[filtersCount].link;\n\n\t\t\t\tif (link == null) link = '#';\n\n\t\t\t\tfiltersArray[filtersArray.length] = {\n\t\t\t\t\tid: personalFilters[filtersCount].filter_id,\n\t\t\t\t\toption: personalFilters[filtersCount].filter_id,\n\t\t\t\t\tdescription: personalFilters[filtersCount].desc\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tthis.availableFilters = filtersArray;\n\t\t},\n\t\t/**\n\t\t * Used to start/refresh the FetchCmpt\n\t\t */\n\t\tstartFetchCmpt(apiFunction, apiFunctionParameters, dataFetchedCallback) {\n\t\t\t// Assign the function api of the FetchCmpt binded property\n\t\t\tthis.fetchCmptApiFunction = apiFunction;\n\n\t\t\t// In case a null value is provided set the parameters as an empty object\n\t\t\tif (apiFunctionParameters == null) apiFunctionParameters = {};\n\n\t\t\t// Always needed parameters\n\t\t\tapiFunctionParameters.filterUniqueId = FHC_JS_DATA_STORAGE_OBJECT.called_path + \"/\" + FHC_JS_DATA_STORAGE_OBJECT.called_method;\n\t\t\tapiFunctionParameters.filterType = this.filterType;\n\n\t\t\tif (this.uniqueId)\n\t\t\t\tapiFunctionParameters.filterUniqueId += '_' + this.uniqueId;\n\n\t\t\t// Assign parameters to the FetchCmpt binded properties\n\t\t\tthis.fetchCmptApiFunctionParams = apiFunctionParameters;\n\t\t\t// Assign data fetch callback to the FetchCmpt binded properties\n\t\t\tthis.fetchCmptDataFetched = dataFetchedCallback;\n\t\t\t// Set the FetchCmpt binded property refresh to have the component to refresh\n\t\t\t// NOTE: this should be the last one to be called because it triggers the FetchCmpt to start to refresh\n\t\t\tthis.fetchCmptRefresh === true ? this.fetchCmptRefresh = false : this.fetchCmptRefresh = true;\n\t\t},\n\n\t\t// ------------------------------------------------------------------------------------------------------------------\n\t\t// Event handlers\n\n\t\t/**\n\t\t *\n\t\t */\n\t\thandlerSaveCustomFilter(customFilterName) {\n\t\t\tthis.selectedFilter = null;\n\t\t\t//\n\t\t\tthis.startFetchCmpt(\n\t\t\t\twsParams => this.$api.call(ApiFilter.saveCustomFilter(wsParams)),\n\t\t\t\t{\n\t\t\t\t\tcustomFilterName\n\t\t\t\t},\n\t\t\t\tthis.getFilter\n\t\t\t);\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\thandlerRemoveCustomFilter(event) {\n\t\t\tlet filterId = event.currentTarget.getAttribute(\"href\").substring(1);\n\t\t\tif (filterId === this.selectedFilter)\n\t\t\t\tthis.selectedFilter = null;\n\t\t\t//\n\t\t\tthis.startFetchCmpt(\n\t\t\t\twsParams => this.$api.call(ApiFilter.removeCustomFilter(wsParams)),\n\t\t\t\t{\n\t\t\t\t\tfilterId: filterId\n\t\t\t\t},\n\t\t\t\tthis.getFilter\n\t\t\t);\n\t\t},\n\n\t\t/*\n\t\t *\n\t\t */\n\t\thandlerGetFilterById: function(event) {\n\n\t\t\tlet filterId = null;\n\n\t\t\t// Get the attribute href if side menu is rendered\n\t\t\tlet attr = event.currentTarget.getAttribute(\"href\");\n\n\t\t\t// Otherwise get the value of the drop down menu\n\t\t\tif (attr == null)\n\t\t\t{\n\t\t\t\tfilterId = event.currentTarget.value;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfilterId = attr.substring(1);\n\t\t\t}\n\n\t\t\tthis.switchFilter(filterId);\n\t\t},\n\t\tswitchFilter(filterId) {\n\t\t\tthis.selectedFilter = filterId;\n\t\t\tthis.getFilter();\n\t\t},\n\t\tapplyFilterConfig(filterFields) {\n\t\t\tthis.selectedFilter = null;\n\t\t\tthis.startFetchCmpt(\n\t\t\t\twsParams => this.$api.call(ApiFilter.applyFilterFields(wsParams)),\n\t\t\t\t{\n\t\t\t\t\tfilterFields\n\t\t\t\t},\n\t\t\t\tthis.getFilter\n\t\t\t);\n\t\t},\n\n\t\t// append child to it's parent\n\t\tappendChild(data, child) {\n\t\t\t// get parent id\n\t\t\tlet parentId = child[this.parentIdField];\n\n\t\t\t// loop thorugh all data\n\t\t\tfor (let parentIdx = 0; parentIdx < data.length; parentIdx++)\n\t\t\t{\n\t\t\t\tlet parent = data[parentIdx];\n\n\t\t\t\t// if it's the parent\n\t\t\t\tif (parent[this.idField] == parentId)\n\t\t\t\t{\n\t\t\t\t\t// create children array if not done yet\n\t\t\t\t\tif (!parent._children) parent._children = [];\n\n\t\t\t\t\t// if child is not included in children array, append the child\n\t\t\t\t\tif (!parent._children.includes(child)) parent._children.push(child);\n\n\t\t\t\t\t// parent found\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\t// search children for parents\n\t\t\t\telse if (parent._children) this.appendChild(parent._children, child);\n\t\t\t}\n\n\t\t\t// parent not found\n\t\t\treturn false;\n\t\t}\n\t},\n\tbeforeCreate() {\n\t\tif (!this.tableOnly == !this.filterType)\n\t\t\talert('You can not have a filter-type in table-only mode!');\n\t},\n\tcreated() {\n\t\tif (this.sideMenu && (!this.$props.onNwNewEntry || !(this.$props.onNwNewEntry instanceof Function)))\n\t\t\talert('\"nwNewEntry\" listener is mandatory when sideMenu is true');\n\t\tthis.uuid = _uuid++;\n\t\tthis.$emit('uuidDefined', this.uuid)\n\t},\n\tmounted() {\n\t\tthis.initTabulator().then(() => {\n\t\t\tif (!this.tableOnly) {\n\t\t\t\tthis.selectedFilter = window.location.hash ? window.location.hash.slice(1) : null;\n\t\t\t\tthis.render(this.fetchResult);\n\t\t\t}\n\t\t});\n\n\t},\n\ttemplate: `\n\t\t\n\t\t\n\t\t\n\n\t\t
    \n\t\t\t
    \n\t\t\t\t

    \n\t\t\t\t\t{{ title }}\n\t\t\t\t

    \n\t\t\t
    \n\t\t
    \n\t\t
    \n\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t{{ selectedData.length }} ausgewählt\n\t\t\t\t\t\t Mit {{ selectedData.length }} ausgewählten:\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t[ {{ filterName }} ]\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\n\t\t\t\n\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t\n\n\t\t\n\t\t
    \n\t`\n};\n","export default {\n props: {\n data: Object,\n title: { type: String },\n },\n data() {\n return {};\n },\n created(){\n\n },\n template: /*html*/`\n\t`,\n};\n","export default {\n\tprops: {\n\t\tdata: {\n\t\t\ttype: String,\n\t\t}\n\t},\n\tdata() {\n\t\treturn {}\n\t},\n\ttemplate: /*html*/`\n
    \n
    \n {{$p.t('profil','fhAusweisStatus',[data])}}\n
    \n
    `,\n}","export default {\n\t//TODO: To be implemented\n\tprops: {\n\t\tdata: {\n\t\t\ttype: String,\n\t\t},\n\t\ttitle: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tmobile: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tmethods: {\n\t\thideCollapse: function () {\n\t\t\tthis.collapseOpen = false;\n\t\t},\n\t\tshowCollapse: function () {\n\t\t\tthis.collapseOpen = true;\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tcollapseOpen: false,\n\t\t};\n\t},\n\ttemplate: /*html*/ `\n
    \n \n \n
    `,\n};\n","export default {\n props:{\n data:Object,\n view:String,\n withZustelladresse:{\n type:Boolean,\n default:true,\n },\n },\n data(){\n return{}\n },\n created(){\n \n },\n template:/*html*/`\n \n
    \n \n \n
    \n \n
    \n \n
    \n
    \n
    {{$p.t('person','strasse')}}
    \n {{data.strasse}} \n
    \n
    \n \n \n
    \n
    \n
    {{$p.t('global','typ')}}
    \n {{data.typ}} \n
    \n
    \n \n
    \n
    \n
    {{$p.t('person','ort')}}
    \n {{data.ort}} \n
    \n
    \n
    \n
    \n
    {{$p.t('person','plz')}}
    \n {{data.plz}} \n
    \n
    \n\n
    \n
    \n
    {{$p.t('person','zustelladresse')}}
    \n
    \n \n
    \n
    \n
    \n
    \n`\n};","export default{\n props:{\n view:String,\n data:Object,\n },\n data(){\n return {\n\n }\n },\n created(){\n\n }, \n template:/*html*/`\n\t\n`,\n};","export default {\n\tdata() {\n\t\treturn {};\n\t},\n\tprops: {\n\t\ttitle: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tdata: {\n\t\t\ttype: Array,\n\t\t},\n\t},\n\ttemplate: /*html*/ `\n
    \n
    \n {{title}}\n
    \n
    \n \n
    \n
    \n\t\t\t\t\n
    \n
    \n
    \n
    `,\n};\n","export default {\n\tdata() {\n\t\treturn {}\n\t},\n\tprops: {\n\t\tdata: {\n\t\t\ttype: Object,\n\t\t},\n\t\ttitle: {\n\t\t\ttype: String,\n\t\t}\n\t},\n\tinject: {\n\t\t// inject info that should not be displayed\n\t\t'studiengang_kz': {\n\t\t\tfrom: 'studiengang_kz',\n\t\t\tdefault: false\n\t\t},\n\t},\n\tcomputed: {\n\t\tgetLinkGruppeListe() {\n\t\t\tif(this.studiengang_kz === false) {\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\treturn this.data.gruppe?.value && this.data.verband?.value && this.data.semester?.value ? FHC_JS_DATA_STORAGE_OBJECT.app_root \n\t\t\t\t+ 'cis/private/stud_in_grp.php?kz='+this.studiengang_kz+'&sem=' + this.data.semester.value\n\t\t\t\t+ '&verband=' + this.data.verband.value + '&grp=' + this.data.gruppe.value : ''\n\t\t},\n\t\tgetLinkVerbandListe() {\n\t\t\tif(this.studiengang_kz === false) {\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\treturn this.data.verband?.value && this.data.semester?.value ? FHC_JS_DATA_STORAGE_OBJECT.app_root \n\t\t\t\t+ 'cis/private/stud_in_grp.php?kz='+this.studiengang_kz+'&sem=' + this.data.semester.value\n\t\t\t\t+ '&verband=' + this.data.verband.value : ''\n\t\t},\n\t\tgetLinkSemesterListe() {\n\t\t\tif(this.studiengang_kz === false) {\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\treturn this.data.semester?.value ? FHC_JS_DATA_STORAGE_OBJECT.app_root \n\t\t\t\t+ 'cis/private/stud_in_grp.php?kz='+this.studiengang_kz+'&sem=' + this.data.semester.value : ''\n\t\t}\n\t},\n\tcreated() {\n\t\t//TODO: check if data.Telefon is a valid telefon number to call before using it as a tel: link\n\t},\n\ttemplate: `\n
    \n
    {{title}}
    \n
    \n
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{entry.label }}
    \n\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t{{entry.value ?? '-'}}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ entry.value }}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ entry.value }}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ entry.value }}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t{{ entry.value ?? '-'}}\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    `\n};","/**\n * Copyright (C) 2025 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\t\n\tprofilViewData(uid) {\n\t\tlet url = \"/api/frontend/v1/Profil/profilViewData\";\n\t\tif(uid){\n\t\t\turl += `/${uid}`;\n\t\t}\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: url\n\t\t};\n\t},\n\tfotoSperre(value) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: `/api/frontend/v1/Profil/fotoSperre/${value}`\n\t\t};\n\t\t\n\t},\n\tisStudent(uid) {\n\t\t// TODO(chris): seems to be called from nowhere?\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Profil/isStudent',\n\t\t\tparams: { uid }\n\t\t};\n\t},\n\tisMitarbeiter(uid) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: `/api/frontend/v1/Profil/isMitarbeiter/${uid}`\n\t\t};\n\t},\n\tgetZustellAdresse() {\n\t\t// TODO(chris): seems to be called from nowhere?\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Profil/getZustellAdresse'\n\t\t};\n\t},\n\tgetZustellKontakt() {\n\t\t// TODO(chris): seems to be called from nowhere?\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Profil/getZustellKontakt'\n\t\t};\n\t},\n\tgetGemeinden(nation, zip) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: `/api/frontend/v1/Profil/getGemeinden/${nation}/${zip}`\n\t\t};\n\t\t\n\t},\n\tgetAllNationen() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Profil/getAllNationen'\n\t\t};\n\t},\n};","import DmsItem from './Dms/Item.js';\n\nexport default {\n\tcomponents: {\n\t\tDmsItem\n\t},\n\temits: [\n\t\t'update:modelValue'\n\t],\n\tprops: {\n\t\tmodelValue: {\n\t\t\ttype: [ FileList, Array ],\n\t\t\trequired: true\n\t\t},\n\t\tmultiple: Boolean,\n\t\tid: String,\n\t\tname: String,\n\t\tinputClass: [String, Array, Object],\n\t\tnoList: Boolean,\n\t\taccept: {\n\t\t\ttype: String,\n\t\t\tdefault: ''\n\t\t},\n\t\tdisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t}\n\t},\n\tmethods: {\n\t\tstringifyFile(file) {\n\t\t\treturn JSON.stringify({\n\t\t\t\tlastModified: file.lastModified,\n\t\t\t\tlastModifiedDate: file.lastModifiedDate,\n\t\t\t\tname: file.name,\n\t\t\t\tsize: file.size,\n\t\t\t\ttype: file.type\n\t\t\t});\n\t\t},\n\t\taddFiles(event) {\n\t\t\tif (!this.multiple)\n\t\t\t\treturn this.$emit('update:modelValue', event.target.files);\n\t\t\t\n\t\t\tconst dt = new DataTransfer();\n\t\t\tconst doubles = [];\n\t\t\tfor (var file of this.modelValue) {\n\t\t\t\tdt.items.add(file);\n\t\t\t\tdoubles.push(this.stringifyFile(file));\n\t\t\t}\n\t\t\tfor (var file of event.target.files) {\n\t\t\t\t// NOTE(chris): deep check (with FileReader) would require an async function so we only check the basic attributes\n\t\t\t\tif (doubles.indexOf(this.stringifyFile(file)) < 0)\n\t\t\t\t\tdt.items.add(file);\n\t\t\t}\n\t\t\tthis.$emit('update:modelValue', dt.files);\n\t\t},\n\t\tremoveFile(id) {\n\t\t\tconst fileToRemove = Array.from(this.modelValue)[id];\n\t\t\t\n\t\t\tconst dt = new DataTransfer();\n\t\t\tfor (var file of this.modelValue) {\n\t\t\t\tif (file !== fileToRemove)\n\t\t\t\t\tdt.items.add(file);\n\t\t\t}\n\t\t\tthis.$emit('update:modelValue', dt.files);\n\t\t}\n\t},\n\twatch: {\n\t\tmodelValue(n) {\n\t\t\tif (!n)\n\t\t\t\treturn;\n\t\t\tif (n instanceof FileList) {\n\t\t\t\tif (!this.$refs.upload) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn this.$refs.upload.files = n;\n\t\t\t}\n\n\t\t\tconst dt = new DataTransfer();\n\t\t\tconst dms = [];\n\t\t\tfor (var file of n) {\n\t\t\t\tif (file instanceof File) {\n\t\t\t\t\tdt.items.add(file);\n\t\t\t\t} else {\n\t\t\t\t\tconst dmsFile = new File([JSON.stringify(file)], file.name, {\n\t\t\t\t\t\ttype: 'application/x.fhc-dms+json'\n\t\t\t\t\t});\n\t\t\t\t\tdt.items.add(dmsFile);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.$emit('update:modelValue', dt.files);\n\t\t}\n\t},\n\ttemplate: `\n\t
    \n\t\t\n\t\t
      \n\t\t\t\n\t\t\t\n\t\t
    \n\t
    `\n}","export default {\n\temits: [\n\t\t'delete'\n\t],\n\tprops: {\n\t\tmodelValue: {\n\t\t\ttype: [File, Object],\n\t\t\trequired: true\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tpreview: ''\n\t\t};\n\t},\n\twatch: {\n\t\tmodelValue(n) {\n\t\t\tif (n.type == 'application/x.fhc-dms+json') {\n\t\t\t\tn.text().then(result => {\n\t\t\t\t\tconst obj = JSON.parse(result);\n\t\t\t\t\tthis.preview = obj.preview || '';\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t},\n\ttemplate: `\n\t
  • \n\t\t\n\t\t{{ modelValue.name }}\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t
  • `\n}\n","/**\n * Copyright (C) 2025 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\t//! API calls for profil update requests\n\tgetStatus() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/ProfilUpdate/getStatus'\n\t\t};\n\t},\n\tgetTopic() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/ProfilUpdate/getTopic'\n\t\t};\n\t},\n\tacceptProfilRequest({profil_update_id, uid, status_message, topic, requested_change}) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/ProfilUpdate/acceptProfilRequest',\n\t\t\tparams: {\n\t\t\t\tprofil_update_id,\n\t\t\t\tuid,\n\t\t\t\tstatus_message,\n\t\t\t\ttopic,\n\t\t\t\trequested_change\n\t\t\t}\n\t\t};\n\t},\n\tdenyProfilRequest({profil_update_id, uid, topic, status_message}) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/ProfilUpdate/denyProfilRequest',\n\t\t\tparams: {\n\t\t\t\tprofil_update_id,\n\t\t\t\tuid,\n\t\t\t\ttopic,\n\t\t\t\tstatus_message\n\t\t\t}\n\t\t};\n\t},\n\tinsertFile(dms, replace = null) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: `/api/frontend/v1/ProfilUpdate/insertFile/${replace}`,\n\t\t\tparams: dms\n\t\t};\n\t},\n\tupdateProfilbild(dms) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: `/api/frontend/v1/ProfilUpdate/updateProfilbild`,\n\t\t\tparams: dms\n\t\t};\n\t},\n\tgetProfilUpdateWithPermission(filter) {\n\t\tconst url_filter = (filter !== '') ? '/' + encodeURIComponent(filter) : '';\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/ProfilUpdate/getProfilUpdateWithPermission' + url_filter\n\t\t};\n\t},\n\tgetProfilRequestFiles(requestID) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: `/api/frontend/v1/ProfilUpdate/getProfilRequestFiles/${requestID}`\n\t\t};\n\t},\n\tselectProfilRequest(uid = null, id = null) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/ProfilUpdate/selectProfilRequest',\n\t\t\tparams: {\n\t\t\t\t...(uid ? { uid } : {}),\n\t\t\t\t...(id ? { id } : {})\n\t\t\t}\n\t\t};\n\t},\n\tinsertProfilRequest(topic, payload, fileID = null) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/ProfilUpdate/insertProfilRequest',\n\t\t\tparams: {\n\t\t\t\ttopic,\n\t\t\t\tpayload,\n\t\t\t\t...(fileID ? { fileID } : {})\n\t\t\t}\n\t\t};\n\t},\n\tupdateProfilRequest(topic, payload, ID, fileID = null) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/ProfilUpdate/updateProfilRequest',\n\t\t\tparams: {\n\t\t\t\ttopic,\n\t\t\t\tpayload,\n\t\t\t\tID,\n\t\t\t\t...(fileID ? { fileID } : {})\n\t\t\t}\n\t\t};\n\t},\n\tdeleteProfilRequest(requestID) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/ProfilUpdate/deleteProfilRequest',\n\t\t\tparams: { requestID }\n\t\t};\n\t}\n};","import Dms from \"../../../../Form/Upload/Dms.js\";\nimport BsModal from \"../../../../Bootstrap/Modal.js\";\n\nimport ApiProfilUpdate from '../../../../../api/factory/profilUpdate.js';\n\nexport default {\n\tdata() {\n\t\treturn {\n\t\t\tdmsData: [],\n\t\t};\n\t},\n\tcomponents: {\n\t\tDms,\n\t\tBsModal,\n\t},\n\tmixins: [BsModal],\n\tprops: {\n\t\ttitel: {\n\t\t\ttype: String,\n\t\t},\n\t\tfiles: {\n\t\t\ttype: Array,\n\t\t},\n\t\tupdateID: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tonHideBsModal: Function,\n\t\tonHiddenBsModal: Function,\n\t\tonHidePreventedBsModal: Function,\n\t\tonShowBsModal: Function,\n\t\tonShownBsModal: Function,\n\t},\n\tmethods:{\n\t\tasync uploadImage(){\n\t\t\tif(this.dmsData){\n\t\t\t\tlet formData = new FormData();\n\t\t\t\tformData.append(\"files[]\", this.dmsData[0]);\n\t\t\t\tawait this.$api\n\t\t\t\t\t.call(ApiProfilUpdate.updateProfilbild(formData))\n\t\t\t\t\t.then((res) => {\n\t\t\t\t\t\tthis.$fhcAlert.alertSuccess(this.$p.t('global','hochgeladen'));\n\t\t\t\t\t\tthis.modal.hide();\n\t\t\t\t\t});\t\n\t\t\t}\n\t\t\t\n\t\t}\n\t},\n\tmounted() {\n\t\tthis.modal = this.$refs.modalContainer.modal;\n\t\tif (this.files) {\n\t\t\tthis.dmsData = this.files;\n\t\t}\n\t},\n\tpopup(options) {\n\t\t\tBsModal.popup.bind(this);\n\t\t\treturn BsModal.popup(null, options);\n\t},\n\ttemplate: /*html*/`\n\n\t\n\t\t\n\t\t\n\t\n `,\n};\n","import ApiProfil from '../../../../api/factory/profil.js';\nimport ImageUpload from '../../Profil/ProfilModal/EditProfilComponents/ImageUpload.js';\n\nexport default {\n\tprops: {\n\t\ttitle: {\n\t\t\ttype: String,\n\t\t},\n\t\tdata: {\n\t\t\ttype: Object,\n\t\t},\n\t\tfotoStatus:{\n\t\t\ttype: Boolean,\n\t\t\tdefault: true\n\t\t}\n\t},\n\tcomponents:{\n\t\tImageUpload,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tFotoSperre: this.data.foto_sperre,\n\t\t};\n\t},\n\temits: [\"showEditProfilModal\"],\n\tinject:[\"isEditable\"],\n\n\tmethods: {\n\t\tshowModal(){\n\t\t\tthis.$refs.imageUpload.show();\n\t\t},\n\t\tsperre_foto_function() {\n\t\t\t//TODO: refactor\n\t\t\tif (!this.data) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.$api\n\t\t\t\t.call(ApiProfil.fotoSperre(!this.FotoSperre))\n\t\t\t\t.then(res => {\n\t\t\t\t\tthis.FotoSperre = res.data.foto_sperre;\n\t\t\t\t});\n\t\t}\n\t},\n\tcomputed: {\n\t\tget_image_base64_src: function () {\n\t\t\tif (!this.data.foto) {\n\t\t\t\treturn \"\";\n\t\t\t}\n\t\t\treturn \"data:image/jpeg;base64,\" + this.data.foto;\n\t\t},\n\t\tname: function () {\n\t\t\treturn {vorname: this.data.Vorname, nachname: this.data.Nachname};\n\t\t},\n\t\tprofilInfo: function () {\n\t\t\tlet res = {};\n\t\t\tlet notIncludedProperties = [\n\t\t\t\t\"Vorname\",\n\t\t\t\t\"Nachname\",\n\t\t\t\t\"foto_sperre\",\n\t\t\t\t\"foto\",\n\t\t\t];\n\t\t\tObject.keys(this.data).forEach((key) => {\n\t\t\t\tif (!notIncludedProperties.includes(key)) {\n\t\t\t\t\tres[key] = this.data[key];\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn res;\n\t\t},\n\t},\n\ttemplate: /*html*/ `\n\n
    \n\t\n
    \n
    \n
    \n \n
    \n
    \n {{title}}\n
    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n \"profile\n \n
    \n \n
    \n\t\t\t\t\t\t
    \n \n
    \n
    \n
    \n \n
    \n \n \n
    \n
    \n
    \n
    \n
    {{$p.t('profilUpdate','vorname')}}
    \n {{name.vorname}} \n
    \n
    \n
    \n
    \n
    {{$p.t('profilUpdate','nachname')}}
    \n {{name.nachname}} \n
    \n
    \n
    \n
    \n
    \n
    \n
    {{$p.t('profil',bez)}}
    \n {{wert?wert:'-'}} \n
    \n
    \n
    \n
    \n
    \n`,\n};\n","import Kontakt from \"../ProfilComponents/Kontakt.js\";\nimport EditKontakt from \"./EditProfilComponents/EditKontakt.js\";\nimport Adresse from \"../ProfilComponents/Adresse.js\";\nimport EditAdresse from \"./EditProfilComponents/EditAdresse.js\";\nimport Status from \"./EditProfilComponents/Status.js\";\nimport TextInputDokument from \"./EditProfilComponents/TextInputDokument.js\";\n\nexport default {\n\tname: 'EditProfilSelect',\n\tcomponents: {\n\t\tKontakt,\n\t\tEditKontakt,\n\t\tAdresse,\n\t\tEditAdresse,\n\t\tStatus,\n\t\tTextInputDokument,\n\t},\n\tinject: [\"profilUpdateTopic\", \"isMitarbeiter\"],\n\tprops: {\n\t\tlist: Object,\n\n\t\t//? Prop used to determine how many options the select should initially show\n\t\tsize: {\n\t\t\ttype: Number,\n\t\t\tdefault: null,\n\t\t},\n\t\t//? Content for the aria label of the select\n\t\tariaLabel: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tprofilUpdate: String,\n\t\ttopic: String,\n\t\tbreadcrumb: String,\n\t},\n\temits: {\n\t\t//? update:modelValue event is needed to notify the v-model when the value has changed\n\t\t[\"update:profilUpdate\"]: null,\n\t\t[\"update:topic\"]: null,\n\t\t[\"update:breadcrumb\"]: null,\n\t\tsubmit: null,\n\t\tselect: null,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tview: null,\n\t\t\tdata: null,\n\t\t\tbreadcrumbItems: [],\n\t\t\tmodal_topic: this.topic,\n\t\t\tproperties: null,\n\t\t};\n\t},\n\n\tmethods: {\n\t\taddItem: function () {\n\t\t\tthis.view =\n\t\t\t\tthis.modal_topic == this.profilUpdateTopic[\"Private Kontakte\"]\n\t\t\t\t\t? \"EditKontakt\"\n\t\t\t\t\t: \"EditAdresse\";\n\n\t\t\t//? updates the topic when a Kontakt or an Address should be added\n\t\t\tthis.modal_topic =\n\t\t\t\tthis.modal_topic == this.profilUpdateTopic[\"Private Kontakte\"]\n\t\t\t\t\t? this.profilUpdateTopic[\"Add Kontakt\"]\n\t\t\t\t\t: this.profilUpdateTopic[\"Add Adresse\"];\n\t\t\tthis.$emit(\"update:topic\", this.modal_topic);\n\t\t\tthis.breadcrumbItems.push(this.modal_topic);\n\t\t\tthis.$emit(\"update:breadcrumb\", this.breadcrumbItems);\n\n\t\t\tthis.data =\n\t\t\t\tthis.view == \"EditAdresse\"\n\t\t\t\t\t? {\n\t\t\t\t\t\t//? add flag\n\t\t\t\t\t\tadd: true,\n\t\t\t\t\t\tadresse_id: null,\n\t\t\t\t\t\tstrasse: null,\n\t\t\t\t\t\ttyp: null,\n\t\t\t\t\t\tplz: null,\n\t\t\t\t\t\tort: null,\n\t\t\t\t\t\tzustelladresse: false,\n\t\t\t\t\t}\n\t\t\t\t\t: {\n\t\t\t\t\t\t//? add flag\n\t\t\t\t\t\tadd: true,\n\t\t\t\t\t\tkontakt_id: null,\n\t\t\t\t\t\tkontakttyp: null,\n\t\t\t\t\t\tkontakt: null,\n\t\t\t\t\t\tanmerkung: null,\n\t\t\t\t\t\tzustellung: false,\n\t\t\t\t\t};\n\t\t},\n\n\t\tdeleteItem: function (item) {\n\t\t\t//? delete flag\n\t\t\titem.data.delete = true;\n\t\t\tthis.$emit(\"update:profilUpdate\", item.data);\n\t\t\t//? updates the topic when a Kontakt or an Address should be deleted\n\n\t\t\tthis.modal_topic = this.modal_topic == this.profilUpdateTopic[\"Private Adressen\"]\n\t\t\t\t? this.profilUpdateTopic[\"Delete Adresse\"]\n\t\t\t\t: this.profilUpdateTopic[\"Delete Kontakt\"];\n\t\t\tthis.$emit(\"update:topic\", this.modal_topic);\n\t\t\tthis.$emit(\"submit\");\n\t\t},\n\n\t\tprofilUpdateEmit: function (event) {\n\t\t\t//? passes the updated profil information to the parent component\n\t\t\tthis.$emit(\"update:profilUpdate\", event);\n\t\t},\n\n\t\tupdateOptions: function (event, item) {\n\t\t\tthis.properties = item;\n\t\t\tthis.data = item.data;\n\t\t\tthis.view = item.view;\n\t\t\tif (item.title) {\n\t\t\t\t//? emits the selected topic to the parent component\n\t\t\t\tthis.modal_topic = item.topic;\n\t\t\t\tthis.$emit(\"update:topic\", this.modal_topic);\n\n\t\t\t\t//? emits the new item for the breadcrumb in the parent component\n\t\t\t\tthis.breadcrumbItems.push(item.title);\n\t\t\t} else {\n\t\t\t\tif (item.data.kontakttyp) {\n\t\t\t\t\tthis.breadcrumbItems.push(item.data.kontakttyp);\n\t\t\t\t\tthis.breadcrumbItems.push(item.data.kontakt);\n\t\t\t\t} else if (item.data.strasse) {\n\t\t\t\t\tthis.breadcrumbItems.push(item.data.strasse);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.$emit(\"update:breadcrumb\", this.breadcrumbItems);\n\t\t},\n\t},\n\tcomputed: {},\n\tcreated() {\n\t\t//? JSON parse and stringify are used to deep clone the objects\n\t\tthis.properties = {...this.list};\n\t\tthis.data = this.list.data\n\t\t\t? JSON.parse(JSON.stringify(this.list.data))\n\t\t\t: null;\n\t\tthis.view = this.list.view\n\t\t\t? JSON.parse(JSON.stringify(this.list.view))\n\t\t\t: null;\n\t},\n\tmounted() {\n\t},\n\n\ttemplate: /*html*/ `\n \n \n `,\n};\n","export default {\n props: {\n data: Object,\n },\n\n data() {\n return {\n originalValue: null,\n zustellKontakteCount: null,\n };\n },\n\n inject: [\"getZustellkontakteCount\"],\n\n methods: {\n updateValue: function (event, bind) {\n if (bind === \"zustellung\") {\n this.data[bind] = event.target.checked;\n } else {\n //? sets the value of a property to null when an empty string is entered to keep the isChanged function valid\n this.data[bind] = event.target.value === \"\" ? null : event.target.value;\n }\n this.$emit(\"profilUpdate\", this.isChanged ? this.data : null);\n this.zustellKontakteCount = this.getZustellkontakteCount();\n },\n },\n\n computed: {\n showZustellKontakteWarning: function () {\n\t // if the kontakt is already a zustellungskontakt when the user is editing the kontakt, then no warning is shown and the zustellung will be overwritten\n\t if (JSON.parse(this.originalValue).zustellung) {\n\t return false;\n\t }\n\t const kontakteOfSelectedType = this.zustellKontakteCount.filter((element) => {\n\t\t return element.kontakttyp === this.data?.kontakttyp\n\t });\n // if zustellKontakteCount is not 0 and the own kontakt has the flag zustellung set to true\n if (!this.zustellKontakteCount.some((element) => element.kontakt_id === this.data.kontakt_id)) {\n return this.data.zustellung && kontakteOfSelectedType.length;\n }\n return this.kontakteOfSelectedType.length >= 2 && this.data.zustellung;\n },\n isChanged: function () {\n //? returns true if the original passed data object was changed\n if (!this.data.kontakt || !this.data.kontakttyp) {\n return false;\n }\n return JSON.stringify(this.data) !== this.originalValue;\n },\n },\n\n created() {\n this.originalValue = JSON.stringify(this.data);\n this.zustellKontakteCount = this.getZustellkontakteCount();\n },\n \n template:\n /*html*/\n `\n\n
    \n\n
    \n\n\n
    \n
    {{$p.t('profilUpdate','kontaktTyp')}}
    \n\n \n
    \n\n
    \n
    \n\n \n\n\n
    \n
    {{data.kontakttyp?data.kontakttyp:$p.t('global','kontakt')}}
    \n\n \n
    \n\n
    \n
    \n\n
    \n
    {{$p.t('global','anmerkung')}}
    \n\n \n
    \n\n
    \n\n \n
    \n
    \n {{$p.t('profilUpdate','zustell_kontakte_warning')}}\n
    \n
    \n \n\n
    \n {{$p.t('profilUpdate','zustellungsKontakt')}}\n\n \n
    \n
    \n `,\n};\n","import Dms from \"../../../../Form/Upload/Dms.js\";\n\nimport ApiProfil from '../../../../../api/factory/profil.js';\n\nexport default {\n components: {\n AutoComplete: primevue.autocomplete,\n\tDms: Dms\n },\n\n props: {\n data: Object,\n files: {\n type: Array,\n default: []\n },\n },\n\n inject: [\"getZustelladressenCount\", \"updateFileID\", \"isMitarbeiter\"],\n\n data() {\n return {\n gemeinden: [],\n ortschaftnamen: [],\n selectedNation: null,\n nationenList: [],\n originalValue: null,\n zustellAdressenCount: null,\n\t dmsData: [],\n\t fileschanged: false\n };\n },\n\n watch: {\n \"data.gemeinde\": function (newValue, oldValue) {\n this.$emit(\"profilUpdate\", this.isChanged ? this.data : null);\n },\n \"data.ort\": function (newValue, oldValue) {\n this.$emit(\"profilUpdate\", this.isChanged ? this.data : null);\n },\n },\n\n methods: {\n\n autocompleteSearchGemeinden: function (event) {\n this.gemeinden = this.gemeinden.map((gemeinde) => gemeinde);\n },\n\n autocompleteSearchOrtschaftsnamen: function (event) {\n this.ortschaftnamen = this.ortschaftnamen.map((ortschaft) => ortschaft);\n },\n\n getGemeinde: function () {\n //? only query the gemeinde is the nation is Austria and the PLZ is greater than 999 and less than 32000\n if (\n this.data.nation &&\n this.data.nation === \"A\" &&\n this.data.plz &&\n this.data.plz > 999 &&\n this.data.plz < 32000\n ) {\n this.$api\n .call(ApiProfil.getGemeinden(this.data.nation, this.data.plz))\n .then((res) => {\n if (res.data.length) {\n this.gemeinden = [\n ...new Set(\n res.data.map((element) => {\n return element.name;\n })\n ),\n ];\n this.ortschaftnamen = [\n ...new Set(\n res.data.map((element) => {\n return element.ortschaftsname;\n })\n ),\n ];\n }\n });\n } else {\n this.gemeinden = [];\n }\n },\n\n updateValue: function (event, bind) {\n //? sets the value of a property to null when an empty string is entered to keep the isChanged function valid\n if (bind === \"zustelladresse\") {\n this.data[bind] = event.target.checked;\n\t } else if(bind === 'files') {\n\t\t if(this.dmsData.length > 0 && this.dmsData[0].type !== 'application/x.fhc-dms+json') {\n\t\t this.fileschanged = true;\n\t\t }\n\t\t this.updateFileID(this.dmsData);\n } else {\n this.data[bind] = event.target.value === \"\" ? null : event.target.value;\n }\n\n this.$emit(\"profilUpdate\", this.isChanged ? this.data : null);\n // update the zustellAdressen count\n this.zustellAdressenCount = this.getZustelladressenCount();\n },\n\n\tdeleteDmsData: function() {\n\t\tthis.dmsData = [];\n\t\tthis.updateValue(null, 'files');\n\t}\n },\n\n computed: {\n showZustellAdressenWarning: function () {\n\n\t // if the address was already a zustellungsadresse when editing the address, then the warning will not be shown and the zustellungsadresse will just be overwritten\n\t if (JSON.parse(this.originalValue).zustelladresse){\n\t\treturn false;\n\t }\n // if zustellAdressenCount is not 0 and the own kontakt has the flag zustellung set to true\n if (!this.zustellAdressenCount.includes(this.data.adresse_id)) {\n return this.data.zustelladresse && this.zustellAdressenCount.length;\n }\n return this.zustellAdressenCount.length >= 2 && this.data.zustelladresse;\n },\n isChanged: function () {\n if (\n !this.data.strasse ||\n !this.data.plz ||\n !this.data.ort ||\n !this.data.typ ||\n this.dmsData.length === 0\n ) {\n return false;\n }\n\n const datachanged = this.originalValue !== JSON.stringify(this.data);\n return datachanged || this.fileschanged;\n },\n },\n\n created() {\n // get all available nationen\n this.$api\n .call(ApiProfil.getAllNationen())\n .then(res => {\n this.nationenList = res.data;\n this.getGemeinde();\n });\n \n this.originalValue = JSON.stringify(this.data);\n this.zustellAdressenCount = this.getZustelladressenCount();\n },\n\n mounted() {\n if (this.files) {\n this.dmsData = this.files;\n }\n },\n\n template: /*html*/ `\n
    \n \n
    \n
    \n\t {{$p.t('profilUpdate','zustell_adressen_warning')}}\n
    \n
    \n \n\n\n
    \n
    \n \n \n
    \n
    \n\n \n
    \n
    \n
    {{$p.t('person','nation')}}*
    \n \n
    \n
    \n\n \n
    \n
    \n
    {{$p.t('person','plz')}}*
    \n \n
    \n
    \n\n \n
    \n
    \n
    {{$p.t('person','gemeinde')}}*
    \n \n
    \n
    \n\n \n
    \n
    \n
    {{$p.t('person','ort')}}*
    \n \n
    \n
    \n\n \n
    \n
    \n
    {{$p.t('person','strasse')}}*
    \n \n
    \n
    \n \n \n
    \n
    \n
    {{$p.t('profilUpdate','kontaktTyp')}}*
    \n \n
    \n
    \n\n\t
    \n\t\t
    \n\t\t\t
    {{$p.t('profilUpdate','meldebestaetigung')}}*
    \n\t\t\t\n\t\t
    \n\t\t
    \n\t\t\t
     
    \n\t\t\t\n\t\t
    \n\t
    \n\n
    \n `,\n};\n","import Adresse from \"../../ProfilComponents/Adresse.js\";\nimport Kontakt from \"../../ProfilComponents/Kontakt.js\";\n\nimport ApiProfilUpdate from '../../../../../api/factory/profilUpdate.js';\n\nexport default {\n components: {\n Adresse,\n Kontakt,\n },\n inject: [\"profilUpdateTopic\"],\n data() {\n return {\n files: null,\n };\n },\n methods: {\n getDocumentLink: function (dms_id) {\n return (\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/Cis/ProfilUpdate/show/${dms_id}`\n );\n },\n },\n computed: {\n getComponentView: function () {\n if (\n this.topic == this.profilUpdateTopic[\"Private Adressen\"] ||\n this.topic == this.profilUpdateTopic[\"Add Adresse\"] ||\n this.topic == this.profilUpdateTopic[\"Delete Adresse\"]\n ) {\n return \"Adresse\";\n } else if (\n this.topic == this.profilUpdateTopic[\"Private Kontakte\"] ||\n this.topic == this.profilUpdateTopic[\"Add Kontakt\"] ||\n this.topic == this.profilUpdateTopic[\"Delete Kontakt\"]\n ) {\n return \"Kontakt\";\n } else {\n return \"text_input\";\n }\n },\n cardHeader: function () {\n if (\n this.topic == this.profilUpdateTopic[\"Delete Addresse\"] ||\n this.topic == this.profilUpdateTopic[\"Delete Kontakt\"]\n ) {\n return \"Delete\";\n } else if (\n this.topic == this.profilUpdateTopic[\"Add Adresse\"] ||\n this.topic == this.profilUpdateTopic[\"Add Kontakt\"]\n ) {\n return \"Add\";\n } else {\n return \"Update\";\n }\n },\n },\n props: {\n data: { type: Object },\n view: { type: String },\n status: { type: String },\n status_message: { type: String },\n status_timestamp: { type: String },\n updateID: { type: Number },\n topic: { type: String },\n },\n created() {\n this.$api\n .call(ApiProfilUpdate.getProfilRequestFiles(this.updateID))\n .then((res) => {\n this.files = res.data;\n });\n },\n template: /*html*/ `\n
    \n\n
    \n
    \n
    {{$p.t('global','status')}}
    \n {{status}} \n
    \n
    \n\n
    \n
    \n
    {{$p.t('global','datum')}}
    \n {{status_timestamp}} \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    {{$p.t('profilUpdate','statusMessage')}}
    \n \n
    \n
    \n
    \n\n\n
    \n
    \n \n {{cardHeader}} \n
    \n
    \n \n \n \n
    \n
    \n\n\t
    \n\t\t
    {{$p.t('profilUpdate','nachweisdokumente')}}
    \n\t\t
    \n\t\t\t{{file.name}}\n\t\t
    \n\t
    \n `,\n};\n","import Dms from \"../../../../Form/Upload/Dms.js\";\n\nexport default {\n data() {\n return {\n dmsData: [],\n originalValue: null,\n };\n },\n components: {\n Dms,\n },\n props: {\n data: {\n type: Object,\n },\n withFiles: {\n type: Boolean,\n default: false,\n },\n files: {\n type: Array,\n },\n updateID: {\n type: Boolean,\n },\n },\n inject:[\"updateFileID\"],\n computed: {\n didFilesChange: function () {\n this.updateFileID(this.dmsData);\n let res = false;\n //? case in which the profilRequest has already associated files \n if(this.files){ \n Array.from(this.dmsData).forEach((file) => {\n if (this.files.some((f) => f.name !== file.name)) {\n res = true;\n }\n });\n return !(this.dmsData.length == this.files.length) || res;\n }\n //? case in which the user creates a new profilRequest\n else{ \n return Array.from(this.dmsData).length? true:false;\n }\n },\n didDataChange: function(){\n return JSON.stringify(this.data) !== this.originalValue;\n },\n isChanged: function () {\n if (this.withFiles) {\n if(this.updateID){\n return (this.didDataChange || this.didFilesChange) && this.dmsData.length;\n }\n return this.didDataChange && this.didFilesChange;\n }\n return this.didDataChange\n },\n },\n emits: [\"profilUpdate\"],\n watch: {\n //? watcher to trigger the event emit when a file was uploaded or removed\n dmsData(value) {\n this.emitChanges();\n },\n },\n methods: {\n stringifyFile(file) {\n\t\t\treturn JSON.stringify({\n\t\t\t\tlastModified: file.lastModified,\n\t\t\t\tlastModifiedDate: file.lastModifiedDate,\n\t\t\t\tname: file.name,\n\t\t\t\tsize: file.size,\n\t\t\t\ttype: file.type\n\t\t\t});\n\t\t},\n emitChanges: function () {\n if (this.isChanged) {\n \n this.$emit(\n \"profilUpdate\", { value: this.data.value }\n );\n } else {\n this.$emit(\"profilUpdate\", null);\n }\n },\n },\n mounted() {\n this.originalValue = JSON.stringify(Vue.toRaw(this.data));\n\n if (this.files) {\n this.dmsData = this.files;\n }\n },\n template: /*html*/`\n\n

    {{$p.t('profilUpdate','profilUpdateInformationMessage',[data.titel])}}

    \n\n
    \n
    {{data.titel?data.titel:$p.t('global','titel')}}
    \n\n \n\n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n `,\n};\n","import BsModal from './Bootstrap/Modal.js';\n\nexport default {\n\tcomponents: {\n\t\tBsModal\n\t},\n\tprops: {\n\t\ttimeout: {\n\t\t\ttype: Number,\n\t\t\tdefault: 300\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tt: null,\n\t\t\tstate: 0\n\t\t}\n\t},\n\tmethods: {\n\t\tshow() {\n\t\t\tswitch (this.state) {\n\t\t\t\tcase 0:\n\t\t\t\t\tif (this.timeout) {\n\t\t\t\t\t\tthis.state = 1;\n\t\t\t\t\t\tthis.t = window.setTimeout(() => this.$refs.modal.show(), this.timeout);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t} else\n\t\t\t\t\t\treturn this.$refs.modal.show();\n\t\t\t\tcase 4:\n\t\t\t\t\treturn window.setTimeout(() => this.show(), 1);\n\t\t\t}\n\t\t},\n\t\thide() {\n\t\t\tswitch (this.state) {\n\t\t\t\tcase 1:\n\t\t\t\t\treturn window.clearTimeout(this.t);\n\t\t\t\tcase 2:\n\t\t\t\t\treturn window.setTimeout(() => this.hide(), 1);\n\t\t\t\tcase 3:\n\t\t\t\t\tthis.$refs.modal.hide();\n\t\t\t}\n\t\t}\n\t},\n\tmounted() {\n\t\tthis.$refs.modal.$refs.modal.addEventListener('show.bs.modal', () => {\n\t\t\tthis.state = 2;\n\t\t});\n\t\tthis.$refs.modal.$refs.modal.addEventListener('shown.bs.modal', () => {\n\t\t\tthis.state = 3;\n\t\t});\n\t\tthis.$refs.modal.$refs.modal.addEventListener('hide.bs.modal', () => {\n\t\t\tthis.state = 4;\n\t\t});\n\t\tthis.$refs.modal.$refs.modal.addEventListener('hidden.bs.modal', () => {\n\t\t\tthis.state = 0;\n\t\t});\n\t},\n\ttemplate: `\n\t\n\t\tLoading...\n\t`\n}","import BsModal from \"../../../Bootstrap/Modal.js\";\nimport Alert from \"../../../Bootstrap/Alert.js\";\nimport EditProfilSelect from \"./EditProfilSelect.js\";\nimport Loader from \"../../../Loader.js\";\n\nimport ApiProfilUpdate from '../../../../api/factory/profilUpdate.js';\n\nexport default {\n\tcomponents: {\n\t\tBsModal,\n\t\tAlert,\n\t\tEditProfilSelect,\n\t\tLoader,\n\t},\n\tmixins: [BsModal],\n\tprops: {\n\t\tisMitarbeiter: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t},\n\t\tvalue: Object,\n\t\ttitel: String,\n\t\tzustelladressenCount: Function,\n\t\tzustellkontakteCount: Function,\n\t\t/*\n\t\t * NOTE(chris):\n\t\t * Hack to expose in \"emits\" declared events to $props which we use\n\t\t * in the v-bind directive to forward all events.\n\t\t * @see: https://github.com/vuejs/core/issues/3432\n\t\t */\n\t\tonHideBsModal: Function,\n\t\tonHiddenBsModal: Function,\n\t\tonHidePreventedBsModal: Function,\n\t\tonShowBsModal: Function,\n\t\tonShownBsModal: Function,\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\ttopic: null,\n\t\t\tprofilUpdate: null,\n\t\t\teditData: this.value,\n\t\t\tfileID: null,\n\t\t\tbreadcrumb: null,\n\t\t\tloading: false,\n\t\t\tresult: false,\n\t\t\tinfo: null,\n\t\t};\n\t},\n\tinject: [\"setLoading\"],\n\tprovide() {\n\t\treturn {\n\t\t\tupdateFileID: this.updateFileIDFunction,\n\t\t\tisMitarbeiter: this.isMitarbeiter\n\t\t};\n\t},\n\n\tmethods: {\n\t\tupdateFileIDFunction: function (newFileID) {\n\t\t\tthis.fileID = newFileID;\n\t\t},\n\n\t\thandleFailedError: function (err) {\n\t\t\tconsole.error(err);\n\t\t\tthis.loading = false;\n\t\t\tthis.setLoading(false);\n\t\t\tthis.result = false;\n\t\t\tthis.hide();\n\t\t},\n\n\t\tasync submitProfilChange() {\n\n\t\t\t//? check if data is valid before making a request\n\t\t\tif (this.topic && this.profilUpdate) {\n\t\t\t\t//? if profil update contains any attachment\n\t\t\t\tif (this.fileID) {\n\t\t\t\t\tconst fileData = await this.uploadFiles(this.fileID);\n\n\t\t\t\t\tthis.fileID = fileData ? fileData : null;\n\t\t\t\t}\n\n\t\t\t\t//? inserts new row in public.tbl_cis_profil_update\n\t\t\t\t//* calls the update api call if an update field is present in the data that was passed to the modal\n\t\t\t\tconst handleApiResponse = (res) => {\n\t\t\t\t\t//? toggles the loading to false and closes the loading modal\n\t\t\t\t\tif (res.data.error) {\n\t\t\t\t\t\tthis.result = false;\n\t\t\t\t\t\tAlert.popup(\n\t\t\t\t\t\t\t\"Ein Fehler ist aufgetreten: \" + JSON.stringify(res.data.retval)\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.result = true;\n\t\t\t\t\t\tAlert.popup(\n\t\t\t\t\t\t\t\"Ihre Anfrage wurde erfolgreich gesendet. Bitte warten Sie, während sich das Team um Ihre Anfrage kümmert.\"\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t//* v-show on EditProfil modal binded to this.loading\n\t\t\t\t//? hides the EditProfil modal and shows the loading modal by calling a callback that was passed as prop from the parent component\n\t\t\t\tthis.loading = true;\n\t\t\t\tthis.setLoading(true);\n\n\t\t\t\t//? if an updateID is present, updateProfilRequest is called, else insertProfilRequest is called\n\t\t\t\tthis.editData.updateID ?\n\t\t\t\t\tthis.$api\n\t\t\t\t\t\t.call(ApiProfilUpdate.updateProfilRequest(\n\t\t\t\t\t\t\tthis.topic,\n\t\t\t\t\t\t\tthis.profilUpdate,\n\t\t\t\t\t\t\tthis.editData.updateID,\n\t\t\t\t\t\t\tthis.fileID ? this.fileID[0] : null\n\t\t\t\t\t\t))\n\t\t\t\t\t\t.then((res) => {\n\t\t\t\t\t\t\thandleApiResponse(res);\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch((err) => this.$fhcAlert.handleSystemError)\n\t\t\t\t\t\t.finally(() => {\n\t\t\t\t\t\t\tthis.loading = false;\n\t\t\t\t\t\t\tthis.setLoading(false);\n\t\t\t\t\t\t\tthis.hide();\n\t\t\t\t\t\t})\n\t\t\t\t\t:\n\t\t\t\t\tthis.$api\n\t\t\t\t\t\t.call(ApiProfilUpdate.insertProfilRequest(\n\t\t\t\t\t\t\tthis.topic,\n\t\t\t\t\t\t\tthis.profilUpdate,\n\t\t\t\t\t\t\tthis.fileID ? this.fileID[0] : null\n\t\t\t\t\t\t))\n\t\t\t\t\t\t.then((res) => {\n\t\t\t\t\t\t\thandleApiResponse(res);\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch((err) => this.$fhcAlert.handleSystemError)\n\t\t\t\t\t\t.finally(() => {\n\t\t\t\t\t\t\tthis.loading = false;\n\t\t\t\t\t\t\tthis.setLoading(false);\n\t\t\t\t\t\t\tthis.hide();\n\t\t\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\tuploadFiles: async function (files) {\n\t\t\tif (files[0].type !== \"application/x.fhc-dms+json\") {\n\t\t\t\tlet formData = new FormData();\n\t\t\t\tformData.append(\"files[]\", files[0]);\n\t\t\t\tconst result = this.editData.updateID\n\t\t\t\t\t? //? updating old attachment by replacing\n\t\t\t\t\t //* second parameter of api request insertFile checks if the file has to be replaced or not\n\t\t\t\t\tawait this.$api\n\t\t\t\t\t\t.call(ApiProfilUpdate.insertFile(\n\t\t\t\t\t\t\tformData,\n\t\t\t\t\t\t\tthis.editData.updateID\n\t\t\t\t\t\t))\n\t\t\t\t\t\t.then((res) => {\n\t\t\t\t\t\t\treturn res.data?.map((file) => file.dms_id);\n\t\t\t\t\t\t})\n\t\t\t\t\t: //? fresh insert of new attachment\n\t\t\t\t\tawait this.$api\n\t\t\t\t\t\t.call(ApiProfilUpdate.insertFile(formData))\n\t\t\t\t\t\t.then((res) => {\n\t\t\t\t\t\t\treturn res.data?.map((file) => file.dms_id);\n\t\t\t\t\t\t});\n\t\t\t\treturn result;\n\t\t\t} else {\n\t\t\t\t//? attachment hasn't been replaced\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t},\n\tcomputed: {\n\t\tshowFooter: function () {\n\t\t\tswitch (this.value.view) {\n\t\t\t\tcase 'Status':\n\t\t\t\t\treturn false;\n\t\t\t\tcase 'Kontakt':\n\t\t\t\t\treturn false;\n\t\t\t\tcase 'Adresse':\n\t\t\t\t\treturn false;\n\t\t\t\tdefault:\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\t},\n\tcreated() {\n\t\tif (this.editData.topic) {\n\t\t\t//? if the topic was passed through the prop add it to the component\n\t\t\tthis.topic = this.editData.topic;\n\t\t}\n\t},\n\tmounted() {\n\t\tthis.modal = this.$refs.modalContainer.modal;\n\t},\n\tpopup(options) {\n\t\tBsModal.popup.bind(this);\n\t\treturn BsModal.popup(null, options);\n\t},\n\ttemplate: /*html*/ `\n\n\t\n\t\n\t\n\t\n \n`,\n};\n","import EditProfil from \"../ProfilModal/EditProfil.js\";\n\nimport ApiProfil from '../../../../api/factory/profil.js';\nimport ApiProfilUpdate from '../../../../api/factory/profilUpdate.js';\n\n//? EditProfil is the modal used to edit the profil updates\nexport default {\n\tcomponents: {EditProfil},\n\tprops: {\n\t\tdata: {\n\t\t\ttype: Object,\n\t\t},\n\t},\n\n\tinject: [\n\t\t\"getZustellkontakteCount\",\n\t\t\"getZustelladressenCount\",\n\t\t\"profilUpdateStates\",\n\t\t\"profilUpdateTopic\",\n\t],\n\n\temits: [\"fetchUpdates\"],\n\n\tdata() {\n\t\treturn {\n\t\t\tshowUpdateModal: false,\n\t\t\tcontent: null,\n\t\t\teditProfilTitle: this.$p.t(\"profil\", \"profilBearbeiten\"),\n\t\t};\n\t},\n\n\tmethods: {\n\t\thideEditProfilModal: function () {\n\t\t\t//? checks the editModal component property result, if the user made a successful request or not\n\t\t\tif (this.$refs.updateEditModal.result) {\n\t\t\t\tthis.$emit(\"fetchUpdates\");\n\t\t\t} else {\n\t\t\t\t// when modal was closed without submitting request\n\t\t\t}\n\t\t\tthis.showUpdateModal = false;\n\t\t},\n\n\t\tasync showEditProfilModal(updateRequest) {\n\n\t\t\tlet view = this.getView(updateRequest.topic, updateRequest.status);\n\n\t\t\tlet data = null;\n\t\t\tlet content = null;\n\t\t\tlet files = null;\n\t\t\tlet withFiles = false;\n\n\t\t\tif (view === \"TextInputDokument\") {\n\t\t\t\tdata = {\n\t\t\t\t\ttitel: updateRequest.topic,\n\t\t\t\t\tvalue: updateRequest.requested_change.value,\n\t\t\t\t};\n\n\t\t\t\tconst filesFromDatabase =\n\t\t\t\t\tawait this.$api\n\t\t\t\t\t\t.call(ApiProfilUpdate.getProfilRequestFiles(\n\t\t\t\t\t\t\tupdateRequest.profil_update_id\n\t\t\t\t\t\t))\n\t\t\t\t\t\t.then((res) => {\n\t\t\t\t\t\t\treturn res.data;\n\t\t\t\t\t\t});\n\n\t\t\t\tfiles = filesFromDatabase;\n\t\t\t\tif (files) {\n\t\t\t\t\twithFiles = true;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdata = updateRequest.requested_change;\n\t\t\t}\n\n\t\t\tcontent = {\n\t\t\t\tupdateID: updateRequest.profil_update_id,\n\t\t\t\tview: view,\n\t\t\t\tdata: data,\n\t\t\t\twithFiles: withFiles,\n\t\t\t\ttopic: updateRequest.topic,\n\t\t\t\tfiles: files,\n\t\t\t};\n\n\t\t\tif (view === \"EditAdresse\") {\n\n\t\t\t\tconst isMitarbeiter = await this.$api.call(ApiProfil.isMitarbeiter(updateRequest.uid)).then((res) => res.data);\n\n\t\t\t\tif (isMitarbeiter) {\n\t\t\t\t\tcontent[\"isMitarbeiter\"] = isMitarbeiter;\n\t\t\t\t}\n\n\t\t\t\tconst filesFromDatabase =\n\t\t\t\t\tawait this.$api\n\t\t\t\t\t\t.call(ApiProfilUpdate.getProfilRequestFiles(\n\t\t\t\t\t\t\tupdateRequest.profil_update_id\n\t\t\t\t\t\t))\n\t\t\t\t\t\t.then((res) => {\n\t\t\t\t\t\t\treturn res.data;\n\t\t\t\t\t\t});\n\n\t\t\t\tfiles = filesFromDatabase;\n\t\t\t\tcontent[\"files\"] = files;\n\t\t\t}\n\n\t\t\t//? adds the status information if the profil update request was rejected or accepted\n\t\t\tif (updateRequest.status !== this.profilUpdateStates[\"Pending\"]) {\n\t\t\t\tcontent[\"status\"] = updateRequest.status;\n\t\t\t\tcontent[\"status_message\"] = updateRequest.status_message;\n\t\t\t\tcontent[\"status_timestamp\"] = updateRequest.status_timestamp;\n\t\t\t}\n\n\t\t\t//? update data of the reactive content\n\t\t\tthis.content = content;\n\t\t\tthis.editProfilTitle = updateRequest.topic;\n\n\t\t\t//? only show the popup if also the right content is available\n\t\t\tif (content) {\n\t\t\t\tthis.showUpdateModal = true;\n\t\t\t\t// after a state change, wait for the DOM updates to complete\n\t\t\t\tVue.nextTick(() => {\n\t\t\t\t\tthis.$refs.updateEditModal.show();\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\tdeleteRequest: function (item) {\n\t\t\tthis.$api\n\t\t\t\t.call(ApiProfilUpdate.deleteProfilRequest(item.profil_update_id))\n\t\t\t\t.then((res) => {\n\t\t\t\t\tif (res.data.error) {\n\t\t\t\t\t\t//? open alert\n\t\t\t\t\t\tconsole.error(\"error happened\", res.data);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.$emit(\"fetchUpdates\");\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t},\n\n\t\tgetView: function (topic, status) {\n\t\t\tif (!(status === this.profilUpdateStates[\"Pending\"])) {\n\t\t\t\treturn \"Status\";\n\t\t\t}\n\n\t\t\tswitch (topic) {\n\t\t\t\tcase this.profilUpdateTopic[\"Private Kontakte\"]:\n\t\t\t\t\treturn \"EditKontakt\";\n\t\t\t\tcase this.profilUpdateTopic[\"Add Kontakt\"]:\n\t\t\t\t\treturn \"EditKontakt\";\n\t\t\t\tcase this.profilUpdateTopic[\"Delete Kontakt\"]:\n\t\t\t\t\treturn \"Kontakt\";\n\t\t\t\tcase this.profilUpdateTopic[\"Private Adressen\"]:\n\t\t\t\t\treturn \"EditAdresse\";\n\t\t\t\tcase this.profilUpdateTopic[\"Add Adresse\"]:\n\t\t\t\t\treturn \"EditAdresse\";\n\t\t\t\tcase this.profilUpdateTopic[\"Delete Adresse\"]:\n\t\t\t\t\treturn \"Adresse\";\n\t\t\t\tdefault:\n\t\t\t\t\treturn \"TextInputDokument\";\n\t\t\t}\n\t\t},\n\n\t},\n\tcreated() {\n\t},\n\n\tcomputed: {},\n\n\ttemplate: /*html*/ `\n
    \n \n
    {{$p.t('profilUpdate','profilUpdates')}}
    \n
    \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    {{$p.t('profilUpdate','topic')}}{{$p.t('global','status')}}{{$p.t('global','datum')}}{{$p.t('ui','aktion')}}
    {{item.topic}}{{item.status}}{{item.status_timestamp?item.status_timestamp:item.insertamum}}
    \n
    \n
    \n
    \n`,\n};\n","if (!primevue) {\n\tconsole.error('PrimeVue not loaded!');\n}\n\n// NOTE(chris): Click on clear button gives an error. This is a bug in primevue => fixed in current version\nTabulator.extendModule('filter', 'filters', {\n\t\"dates\": (headerValue, rowValue) => {\n\t\tif (!headerValue)\n\t\t\treturn true;\n\n\t\tlet rowDate = new Date(rowValue);\n\n\t\tif (Array.isArray(headerValue))\n\t\t{\n\t\t\tlet startDate = new Date(headerValue[0]);\n\t\t\tif (headerValue[1])\n\t\t\t{\n\t\t\t\tlet endDate = new Date(headerValue[1]);\n\n\t\t\t\tendDate.setHours(23, 59, 59, 999);\n\n\t\t\t\treturn rowDate >= startDate && rowDate <= endDate;\n\t\t\t}\n\n\t\t\treturn rowDate.toDateString() === startDate.toDateString();\n\t\t}\n\t\tlet singleDate = new Date(headerValue);\n\t\treturn rowDate.toDateString() === singleDate.toDateString();\n\t}\n});\n\nfunction dateFilter(cell, onRendered, success) {\n\tlet div = document.createElement('div');\n\n\tlet initialValue = null;\n\n\tlet val = cell.getValue();\n\n\tif (Array.isArray(val))\n\t{\n\t\tconst start = val[0] ? new Date(val[0]) : null;\n\t\tconst end = val[1] ? new Date(val[1]) : null;\n\t\tinitialValue = [start, end];\n\t}\n\n\tVue.createApp({\n\t\tcomponents: {\n\t\t\tPrimevueCalendar: primevue.calendar\n\t\t},\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tval: initialValue\n\t\t\t}\n\t\t},\n\t\twatch: {\n\t\t\tval(n) {\n\t\t\t\tsuccess(n);\n\t\t\t}\n\t\t},\n\t\ttemplate: `\n\t\t\t\t `\n\t}).use(primevue.config.default).mount(div);\n\n\treturn div;\n}\nexport { dateFilter };","import {CoreFilterCmpt} from \"../../../components/filter/Filter.js\";\nimport Mailverteiler from \"./ProfilComponents/Mailverteiler.js\";\nimport AusweisStatus from \"./ProfilComponents/FhAusweisStatus.js\";\nimport QuickLinks from \"./ProfilComponents/QuickLinks.js\";\nimport Adresse from \"./ProfilComponents/Adresse.js\";\nimport Kontakt from \"./ProfilComponents/Kontakt.js\";\nimport ProfilEmails from \"./ProfilComponents/ProfilEmails.js\";\nimport RoleInformation from \"./ProfilComponents/RoleInformation.js\";\nimport ProfilInformation from \"./ProfilComponents/ProfilInformation.js\";\nimport FetchProfilUpdates from \"./ProfilComponents/FetchProfilUpdates.js\";\nimport EditProfil from \"./ProfilModal/EditProfil.js\";\n\nimport ApiProfilUpdate from '../../../api/factory/profilUpdate.js';\nimport { dateFilter } from '../../../tabulator/filters/Dates.js';\n\nexport default {\n\tcomponents: {\n\t\tCoreFilterCmpt,\n\t\tMailverteiler,\n\t\tAusweisStatus,\n\t\tQuickLinks,\n\t\tAdresse,\n\t\tKontakt,\n\t\tProfilEmails,\n\t\tRoleInformation,\n\t\tProfilInformation,\n\t\tFetchProfilUpdates,\n\t\tEditProfil,\n\t},\n\tinject: [\"sortProfilUpdates\", \"collapseFunction\", \"language\",\"isEditable\"],\n\tdata() {\n\t\treturn {\n\t\t\tshowModal: false,\n\t\t\tcollapseIconBetriebsmittel: true,\n\t\t\teditDataFilter: null,\n\t\t\tpreloadedPhrasen:{},\n\t\t\t// tabulator options\n\t\t\tzutrittsgruppen_table_options: {\n\t\t\t\tpersistenceID: \"filterTableStudentProfilZutrittsgruppen\",\n\t\t\t\tpersistence: {\n\t\t\t\t\tcolumns: false\n\t\t\t\t},\n\t\t\t\tminHeight: 200,\n\t\t\t\tlayout: \"fitColumns\",\n\t\t\t\tcolumns: [{\n\t\t\t\t\ttitle: Vue.computed(() => this.preloadedPhrasen.zutrittsGruppenPhrase),\n\t\t\t\t\tfield: \"bezeichnung\"\n\t\t\t\t}],\n\t\t\t},\n\t\t\tbetriebsmittel_table_options: {\n\t\t\t\tpersistenceID: \"filterTableStudentProfilBetriebsmittel\",\n\t\t\t\tpersistence: {\n\t\t\t\t\tcolumns: false\n\t\t\t\t},\n\t\t\t\tminHeight: 300,\n\t\t\t\tlayout: \"fitColumns\",\n\t\t\t\tresponsiveLayout: \"collapse\",\n\t\t\t\tresponsiveLayoutCollapseUseFormatters: false,\n\t\t\t\tresponsiveLayoutCollapseFormatter: Vue.$collapseFormatter,\n\t\t\t\tcolumns: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle:\n\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\tfield: \"collapse\",\n\t\t\t\t\t\theaderSort: false,\n\t\t\t\t\t\theaderFilter: false,\n\t\t\t\t\t\tformatter: \"responsiveCollapse\",\n\t\t\t\t\t\tmaxWidth: 40,\n\t\t\t\t\t\theaderClick: this.collapseFunction,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: Vue.computed(()=>this.preloadedPhrasen.entlehnteBetriebsmittelPhrase),\n\t\t\t\t\t\tfield: \"betriebsmittel\",\n\t\t\t\t\t\theaderFilter: true,\n\t\t\t\t\t\tminWidth: 200,\n\t\t\t\t\t\tvisible: true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: Vue.computed(() =>this.preloadedPhrasen.inventarnummerPhrase) ,\n\t\t\t\t\t\tfield: \"Nummer\",\n\t\t\t\t\t\theaderFilter: true,\n\t\t\t\t\t\tresizable: true,\n\t\t\t\t\t\tminWidth: 200,\n\t\t\t\t\t\tvisible: true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: Vue.computed(() =>this.preloadedPhrasen.ausgabedatum) ,\n\t\t\t\t\t\tfield: \"Ausgegeben_am\",\n\t\t\t\t\t\theaderFilterFunc: 'dates',\n\t\t\t\t\t\theaderFilter: dateFilter,\n\t\t\t\t\t\tminWidth: 200,\n\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\tformatter:\"datetime\",\n\t\t\t\t\t\tformatterParams: this.datetimeFormatterParams()\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t};\n\t},\n\n\tprops: {\n\t\tdata: Object,\n\t\teditData: Object,\n\t},\n\tprovide() {\n\t\treturn {\n\t\t\tstudiengang_kz: Vue.computed({ get: () => this.data.studiengang_kz }),\n\t\t}\n\t},\n\tmethods: {\n\n\t\tbetriebsmittelTableBuilt: function () {\n\t\t\tthis.$refs.betriebsmittelTable.tabulator.setColumns(this.betriebsmittel_table_options.columns)\n\t\t\tthis.$refs.betriebsmittelTable.tabulator.setData(this.data.mittel);\n\t\t},\n\t\tzutrittsgruppenTableBuilt: function () {\n\t\t\tthis.$refs.zutrittsgruppenTable.tabulator.setColumns(this.zutrittsgruppen_table_options.columns)\n\t\t\tthis.$refs.zutrittsgruppenTable.tabulator.setData(\n\t\t\t\tthis.data.zuttritsgruppen\n\t\t\t);\n\t\t},\n\t\tfetchProfilUpdates: function () {\n\t\t\tthis.$api\n\t\t\t\t.call(ApiProfilUpdate.selectProfilRequest())\n\t\t\t\t.then((res) => {\n\t\t\t\t\tif (!res.error && res) {\n\t\t\t\t\t\tthis.data.profilUpdates = res.data?.length\n\t\t\t\t\t\t\t? res.data.sort(this.sortProfilUpdates)\n\t\t\t\t\t\t\t: null;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t},\n\n\t\thideEditProfilModal: function () {\n\t\t\t//? checks the editModal component property result, if the user made a successful request or not\n\t\t\tif (this.$refs.editModal.result) {\n\t\t\t\tthis.$api\n\t\t\t\t\t.call(ApiProfilUpdate.selectProfilRequest())\n\t\t\t\t\t.then((request) => {\n\t\t\t\t\t\tif (!request.error && request.data) {\n\t\t\t\t\t\t\tthis.data.profilUpdates = request.data;\n\t\t\t\t\t\t\tthis.data.profilUpdates.sort(this.sortProfilUpdates);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconsole.error(\"Error when fetching profile updates: \" + request);\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t.catch((err) => {\n\t\t\t\t\t\tconsole.error(err);\n\t\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// when modal was closed without submitting request\n\t\t\t}\n\t\t\tthis.showModal = false;\n\t\t\tthis.editDataFilter = null;\n\t\t},\n\n\t\tshowEditProfilModal(view) {\n\t\t\tif (view) {\n\t\t\t\tthis.editDataFilter = view;\n\t\t\t}\n\t\t\tthis.showModal = true;\n\t\t\t// after a state change, wait for the DOM updates to complete\n\t\t\tVue.nextTick(() => {\n\t\t\t\tthis.$refs.editModal.show();\n\t\t\t});\n\t\t},\n\t\tdatetimeFormatterParams: function() {\n\t\t\tconst params = {\n\t\t\t\tinputFormat:\"yyyy-MM-dd\",\n\t\t\t\toutputFormat:\"dd.MM.yyyy\",\n\t\t\t\tinvalidPlaceholder:\"(invalid date)\",\n\t\t\t\ttimezone:FHC_JS_DATA_STORAGE_OBJECT.timezone\n\t\t\t};\n\t\t\treturn params;\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t\n\t\tfotoStatus() {\n\t\t\treturn this.data?.fotoStatus ?? null;\n\t\t},\n\n\t\tfilteredEditData() {\n\t\t\treturn this.editDataFilter\n\t\t\t\t? this.editData.data[this.editDataFilter]\n\t\t\t\t: this.editData;\n\t\t},\n\n\t\tprofilInformation() {\n\t\t\tif (!this.data) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tVorname: this.data.vorname,\n\t\t\t\tNachname: this.data.nachname,\n\t\t\t\tUsername: this.data.username,\n\t\t\t\tAnrede: this.data.anrede,\n\t\t\t\tTitel: this.data.titel,\n\t\t\t\tPostnomen: this.data.postnomen,\n\t\t\t\tfoto_sperre: this.data.foto_sperre,\n\t\t\t\tfoto: this.data.foto,\n\t\t\t};\n\t\t},\n\n\t\troleInformation() {\n\t\t\tif (!this.data) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tgeburtsdatum: {\n\t\t\t\t\tlabel: `${this.$p.t('profil','Geburtsdatum')}`,\n\t\t\t\t\tvalue: this.data.gebdatum\n\t\t\t\t},\n\t\t\t\tgeburtsort: {\n\t\t\t\t\tlabel: `${this.$p.t('profil','Geburtsort')}`,\n\t\t\t\t\tvalue: this.data.gebort\n\t\t\t\t},\n\t\t\t\tpersonenkennzeichen: {\n\t\t\t\t\tlabel: `${this.$p.t('person','personenkennzeichen')}`,\n\t\t\t\t\tvalue: this.data.personenkennzeichen\n\t\t\t\t},\n\t\t\t\tstudiengang: {\n\t\t\t\t\tlabel: `${this.$p.t('lehre','studiengang')}`,\n\t\t\t\t\tvalue: this.data.studiengang\n\t\t\t\t},\n\t\t\t\tsemester: {\n\t\t\t\t\tlabel: `${this.$p.t('lehre','semester')}`,\n\t\t\t\t\tvalue: this.data.semester\n\t\t\t\t},\n\t\t\t\tverband: {\n\t\t\t\t\tlabel: `${this.$p.t('lehre','lehrverband')}`,\n\t\t\t\t\tvalue: this.data.verband\n\t\t\t\t},\n\t\t\t\tgruppe: {\n\t\t\t\t\tlabel: `${this.$p.t('lehre','gruppe')}`,\n\t\t\t\t\tvalue: this.data.gruppe.trim()\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\t},\n\tcreated() {\n\t\t// preload phrasen\n\t\tthis.$p.loadCategory('profil').then(() => {\n\t\t\tthis.preloadedPhrasen.zutrittsGruppenPhrase = this.$p.t('profil/zutrittsGruppen');\n\t\t\tthis.preloadedPhrasen.entlehnteBetriebsmittelPhrase = this.$p.t('profil/entlehnteBetriebsmittel');\n\t\t\tthis.preloadedPhrasen.inventarnummerPhrase = this.$p.t('profil/inventarnummer');\n\t\t\tthis.preloadedPhrasen.ausgabedatum = this.$p.t('profil/ausgabedatum');\n\t\t\tthis.preloadedPhrasen.loaded = true;\n\t\t});\n\t\t//? sorts the profil Updates: pending -> accepted -> rejected\n\t\tthis.data.profilUpdates?.sort(this.sortProfilUpdates);\n\t},\n\twatch: {\n\t\t'language.value'(newVal) {\n\t\t\tif(this.$refs.betriebsmittelTable) this.$refs.betriebsmittelTable.tabulator.setColumns(this.betriebsmittel_table_options.columns)\n\t\t\tif(this.$refs.zutrittsgruppenTable) this.$refs.zutrittsgruppenTable.tabulator.setColumns(this.zutrittsgruppen_table_options.columns)\n\t\t}\n\t},\n\ttemplate: /*html*/ `\n
    \n \n \n
    \n \n
    \n \n\n\t\t\t\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t
    \n\t\t\t\n\n\t\t\t\n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t\t{{$p.t('profil','privateKontakte')}}\n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t\t{{$p.t('profil','privateAdressen')}}\n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t
    \n\t\t\t\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\n\t\t
    \n\t\t\n\t\t
    \n\t\t\t\n\t\t\t\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n \n
    \n \n
    \n \n
    \n\n
    \n`,\n};\n","import {CoreFilterCmpt} from \"../../../components/filter/Filter.js\";\nimport EditProfil from \"./ProfilModal/EditProfil.js\";\nimport Adresse from \"./ProfilComponents/Adresse.js\";\nimport Kontakt from \"./ProfilComponents/Kontakt.js\";\nimport FetchProfilUpdates from \"./ProfilComponents/FetchProfilUpdates.js\";\nimport Mailverteiler from \"./ProfilComponents/Mailverteiler.js\";\nimport AusweisStatus from \"./ProfilComponents/FhAusweisStatus.js\";\nimport QuickLinks from \"./ProfilComponents/QuickLinks.js\";\nimport ProfilEmails from \"./ProfilComponents/ProfilEmails.js\";\nimport RoleInformation from \"./ProfilComponents/RoleInformation.js\";\nimport ProfilInformation from \"./ProfilComponents/ProfilInformation.js\";\n\nimport ApiProfilUpdate from '../../../api/factory/profilUpdate.js';\nimport { dateFilter } from '../../../tabulator/filters/Dates.js';\n\nexport default {\n\tcomponents: {\n\t\tCoreFilterCmpt,\n\t\tEditProfil,\n\t\tAdresse,\n\t\tKontakt,\n\t\tFetchProfilUpdates,\n\t\tAusweisStatus,\n\t\tMailverteiler,\n\t\tQuickLinks,\n\t\tProfilEmails,\n\t\tRoleInformation,\n\t\tProfilInformation,\n\t},\n\n\tinject: [\"sortProfilUpdates\", \"collapseFunction\", \"language\",\"isEditable\"],\n\n\tdata() {\n\t\treturn {\n\t\t\tshowModal: false,\n\t\t\teditDataFilter: null,\n\t\t\tpreloadedPhrasen:{},\n\t\t\t// tabulator options\n\t\t\tfunktionen_table_options: {\n\t\t\t\tpersistenceID: \"filterTableMaProfilFunktionen\",\n\t\t\t\tpersistence: {\n\t\t\t\t\tcolumns: false\n\t\t\t\t},\n\t\t\t\tminHeight: 300,\n\t\t\t\tlayout: \"fitColumns\",\n\t\t\t\tresponsiveLayout: \"collapse\",\n\t\t\t\tresponsiveLayoutCollapseUseFormatters: false,\n\t\t\t\tresponsiveLayoutCollapseFormatter: Vue.$collapseFormatter,\n\t\t\t\tcolumns: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle:\n\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\tfield: \"collapse\",\n\t\t\t\t\t\theaderSort: false,\n\t\t\t\t\t\theaderFilter: false,\n\t\t\t\t\t\tformatter: \"responsiveCollapse\",\n\t\t\t\t\t\tmaxWidth: 40,\n\t\t\t\t\t\theaderClick: this.collapseFunction,\n\t\t\t\t\t\tvisible: true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: Vue.computed(() => this.preloadedPhrasen.bezeichnungPhrase),\n\t\t\t\t\t\tfield: \"Bezeichnung\",\n\t\t\t\t\t\theaderFilter: true,\n\t\t\t\t\t\tminWidth: 200,\n\t\t\t\t\t\tvisible: true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: Vue.computed(() => this.preloadedPhrasen.organisationseinheitPhrase),\n\t\t\t\t\t\tfield: \"Organisationseinheit\",\n\t\t\t\t\t\theaderFilter: true,\n\t\t\t\t\t\tminWidth: 200,\n\t\t\t\t\t\tvisible: true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: Vue.computed(() => this.preloadedPhrasen.gueltigVonPhrase),\n\t\t\t\t\t\tfield: \"Gültig_von\",\n\t\t\t\t\t\theaderFilterFunc: 'dates',\n\t\t\t\t\t\theaderFilter: dateFilter,\n\t\t\t\t\t\tresizable: true,\n\t\t\t\t\t\tminWidth: 200,\n\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\tformatter:\"datetime\",\n\t\t\t\t\t\tformatterParams: this.datetimeFormatterParams()\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: Vue.computed(() => this.preloadedPhrasen.gueltigBisPhrase),\n\t\t\t\t\t\tfield: \"Gültig_bis\",\n\t\t\t\t\t\theaderFilterFunc: 'dates',\n\t\t\t\t\t\theaderFilter: dateFilter,\n\t\t\t\t\t\tresizable: true,\n\t\t\t\t\t\tminWidth: 200,\n\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\tformatter:\"datetime\",\n\t\t\t\t\t\tformatterParams: this.datetimeFormatterParams()\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: Vue.computed(() => this.preloadedPhrasen.wochenstundenPhrase),\n\t\t\t\t\t\tfield: \"Wochenstunden\",\n\t\t\t\t\t\theaderFilter: true,\n\t\t\t\t\t\tminWidth: 200,\n\t\t\t\t\t\tvisible: true\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\n\t\t\tbetriebsmittel_table_options: {\n\t\t\t\tpersistenceID: \"filterTableMaProfilBetriebsmittel\",\n\t\t\t\tpersistence: {\n\t\t\t\t\tcolumns: false\n\t\t\t\t},\n\t\t\t\tminHeight: 300,\n\t\t\t\tlayout: \"fitColumns\",\n\t\t\t\tresponsiveLayout: \"collapse\",\n\t\t\t\tresponsiveLayoutCollapseUseFormatters: false,\n\t\t\t\tresponsiveLayoutCollapseFormatter: Vue.$collapseFormatter,\n\t\t\t\tdata: [{betriebsmittel: \"\", Nummer: \"\", Ausgegeben_am: \"\"}],\n\t\t\t\tcolumns: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle:\n\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\tfield: \"collapse\",\n\t\t\t\t\t\theaderSort: false,\n\t\t\t\t\t\theaderFilter: false,\n\t\t\t\t\t\tformatter: \"responsiveCollapse\",\n\t\t\t\t\t\tmaxWidth: 40,\n\t\t\t\t\t\theaderClick: this.collapseFunction,\n\t\t\t\t\t\tvisible: true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: Vue.computed(() => this.preloadedPhrasen.entlehnteBetriebsmittelPhrase),\n\t\t\t\t\t\tfield: \"betriebsmittel\",\n\t\t\t\t\t\theaderFilter: true,\n\t\t\t\t\t\tminWidth: 200,\n\t\t\t\t\t\tvisible: true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: Vue.computed(() => this.preloadedPhrasen.inventarnummerPhrase),\n\t\t\t\t\t\tfield: \"Nummer\",\n\t\t\t\t\t\theaderFilter: true,\n\t\t\t\t\t\tresizable: true,\n\t\t\t\t\t\tminWidth: 200,\n\t\t\t\t\t\tvisible: true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: Vue.computed(() => this.preloadedPhrasen.ausgabedatumPhrase),\n\t\t\t\t\t\tfield: \"Ausgegeben_am\",\n\t\t\t\t\t\theaderFilterFunc: 'dates',\n\t\t\t\t\t\theaderFilter: dateFilter,\n\t\t\t\t\t\tminWidth: 200,\n\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\tformatter:\"datetime\",\n\t\t\t\t\t\tformatterParams: this.datetimeFormatterParams()\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t}\n\t\t};\n\t},\n\n\tprops: {\n\t\tdata: Object,\n\t\teditData: Object,\n\t},\n\t\n\tmethods: {\n\t\tbetriebsmittelTableBuilt: function () {\n\t\t\tthis.$refs.betriebsmittelTable.tabulator.setColumns(this.betriebsmittel_table_options.columns)\n\t\t\tthis.$refs.betriebsmittelTable.tabulator.setData(this.data.mittel);\n\t\t},\n\t\tfunktionenTableBuilt: function () {\n\t\t\tthis.$refs.funktionenTable.tabulator.setColumns(this.funktionen_table_options.columns)\n\t\t\tthis.$refs.funktionenTable.tabulator.setData(this.data.funktionen);\n\t\t},\n\t\thideEditProfilModal: function () {\n\t\t\t//? checks the editModal component property result, if the user made a successful request or not\n\t\t\tif (this.$refs.editModal.result) {\n\t\t\t\tthis.$api\n\t\t\t\t\t.call(ApiProfilUpdate.selectProfilRequest())\n\t\t\t\t\t.then((request) => {\n\t\t\t\t\t\tif (!request.error && request.data) {\n\t\t\t\t\t\t\tthis.data.profilUpdates = request.data;\n\t\t\t\t\t\t\tthis.data.profilUpdates.sort(this.sortProfilUpdates);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconsole.error(\"Error when fetching profile updates: \" + request);\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t.catch((err) => {\n\t\t\t\t\t\tconsole.error(err);\n\t\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// when modal was closed without submitting request\n\t\t\t}\n\t\t\tthis.showModal = false;\n\t\t\tthis.editDataFilter = null;\n\t\t},\n\n\t\tshowEditProfilModal(view) {\n\t\t\tif (view) {\n\t\t\t\tthis.editDataFilter = view;\n\t\t\t}\n\n\t\t\tthis.showModal = true;\n\t\t\tVue.nextTick(() => {\n\t\t\t\tthis.$refs.editModal.show();\n\t\t\t});\n\n\t\t\t// after a state change, wait for the DOM updates to complete\n\t\t},\n\n\t\tfetchProfilUpdates: function () {\n\t\t\tthis.$api\n\t\t\t\t.call(ApiProfilUpdate.selectProfilRequest())\n\t\t\t\t.then((res) => {\n\t\t\t\t\tif (!res.error && res) {\n\t\t\t\t\t\tthis.data.profilUpdates = res.data?.length\n\t\t\t\t\t\t\t? res.data.sort(this.sortProfilUpdates)\n\t\t\t\t\t\t\t: null;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t},\n\t\tsetTableColumnTitles() { // reevaluates computed phrasen\n\t\t\tif(this.$refs.betriebsmittelTable) this.$refs.betriebsmittelTable.tabulator.setColumns(this.betriebsmittel_table_options.columns)\n\t\t\tif(this.$refs.funktionenTable) this.$refs.funktionenTable.tabulator.setColumns(this.funktionen_table_options.columns)\n\t\t},\n\t\tdatetimeFormatterParams: function() {\n\t\t\tconst params = {\n\t\t\t\tinputFormat:\"yyyy-MM-dd\",\n\t\t\t\toutputFormat:\"dd.MM.yyyy\",\n\t\t\t\tinvalidPlaceholder:\"(invalid date)\",\n\t\t\t\ttimezone:FHC_JS_DATA_STORAGE_OBJECT.timezone\n\t\t\t};\n\t\t\treturn params;\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tfotoStatus() {\n\t\t\treturn this.data?.fotoStatus ?? null;\n\t\t},\n\t\tgetTelefonValue() {\n\t\t\tif(this.data.standort_telefon?.kontakt) {\n\t\t\t\treturn this.data.standort_telefon.kontakt + \" \" + this.data.telefonklappe\n\t\t\t} else if(this.data.standort_telefon) {\n\t\t\t\treturn this.data.standort_telefon + \" \" + this.data.telefonklappe\n\t\t\t} else {\n\t\t\t\treturn this.data.telefonklappe\n\t\t\t}\n\t\t},\n\t\tfilteredEditData() {\n\t\t\treturn this.editDataFilter\n\t\t\t\t? this.editData.data[this.editDataFilter]\n\t\t\t\t: this.editData;\n\t\t},\n\t\tprofilInformation() {\n\t\t\tif (!this.data) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tVorname: this.data.vorname,\n\t\t\t\tNachname: this.data.nachname,\n\t\t\t\tUsername: this.data.username,\n\t\t\t\tAnrede: this.data.anrede,\n\t\t\t\tTitel: this.data.titel,\n\t\t\t\tPostnomen: this.data.postnomen,\n\t\t\t\tfoto_sperre: this.data.foto_sperre,\n\t\t\t\tfoto: this.data.foto,\n\t\t\t};\n\t\t},\n\n\t\troleInformation() {\n\t\t\tif (!this.data) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tgeburtsdatum: {\n\t\t\t\t\tlabel: `${this.$p.t('profil','Geburtsdatum')}`,\n\t\t\t\t\tvalue: this.data.gebdatum\n\t\t\t\t},\n\t\t\t\tgeburtsort: {\n\t\t\t\t\tlabel: `${this.$p.t('profil','Geburtsort')}`,\n\t\t\t\t\tvalue: this.data.gebort\n\t\t\t\t},\n\t\t\t\tpersonenkennzeichen: {\n\t\t\t\t\tlabel: `${this.$p.t('profil','Kurzzeichen')}`,\n\t\t\t\t\tvalue: this.data.kurzbz\n\t\t\t\t},\n\t\t\t\ttelefon: {\n\t\t\t\t\tlabel: `${this.$p.t('profil','Telefon')}`,\n\t\t\t\t\tvalue: this.getTelefonValue\n\t\t\t\t},\n\t\t\t\toffice: {\n\t\t\t\t\tlabel: `${this.$p.t('profil','Büro')}`,\n\t\t\t\t\tvalue: this.data.ort_kurzbz\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\t},\n\n\tcreated() {\n\t\t// preload phrasen\n\t\tthis.$p.loadCategory([\"ui\",\"lehre\",\"global\",\"profil\"]).then(() => {\n\t\t\tthis.preloadedPhrasen.bezeichnungPhrase = this.$p.t('ui/bezeichnung');\n\t\t\tthis.preloadedPhrasen.organisationseinheitPhrase = this.$p.t('lehre/organisationseinheit');\n\t\t\tthis.preloadedPhrasen.gueltigVonPhrase = this.$p.t('global/gueltigVon');\n\t\t\tthis.preloadedPhrasen.gueltigBisPhrase = this.$p.t('global/gueltigBis');\n\t\t\tthis.preloadedPhrasen.wochenstundenPhrase = this.$p.t('profil/wochenstunden');\n\t\t\tthis.preloadedPhrasen.entlehnteBetriebsmittelPhrase = this.$p.t('profil/entlehnteBetriebsmittel');\n\t\t\tthis.preloadedPhrasen.inventarnummerPhrase = this.$p.t('profil/inventarnummer');\n\t\t\tthis.preloadedPhrasen.ausgabedatumPhrase = this.$p.t('profil/ausgabedatum');\n\t\t\tthis.preloadedPhrasen.loaded=true;\n\t\t});\n\t\t//? sorts the profil Updates: pending -> accepted -> rejected\n\t\tthis.data.profilUpdates?.sort(this.sortProfilUpdates);\n\n\t},\n\twatch: {\n\t\t'data.funktionen'(newVal) {\n\t\t\tif(this.$refs.funktionenTable) this.$refs.funktionenTable.tabulator.setData(newVal);\n\t\t},\n\t\t'data.mittel'(newVal) {\n\t\t\tif(this.$refs.betriebsmittelTable) this.$refs.betriebsmittelTable.tabulator.setData(newVal);\n\t\t},\n\t\t'language.value'(newVal) {\n\t\t\tthis.setTableColumnTitles()\n\t\t}\n\t},\n\ttemplate: /*html*/ `\n
    \n \n
    \n
    \n \n \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n \n \n
    \n \n \n \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n {{$p.t('profil','privateKontakte')}}\n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n {{$p.t('profil','privateAdressen')}}\n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n
    \n \n
    \n \n \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n\n \n `,\n};\n","import QuickLinks from \"./ProfilComponents/QuickLinks.js\";\nimport Mailverteiler from \"./ProfilComponents/Mailverteiler.js\";\nimport ProfilEmails from \"./ProfilComponents/ProfilEmails.js\";\nimport RoleInformation from \"./ProfilComponents/RoleInformation.js\";\nimport ProfilInformation from \"./ProfilComponents/ProfilInformation.js\";\n\nexport default {\n\tdata() {\n\t\treturn {};\n\t},\n\tcomponents: {\n\t\tQuickLinks,\n\t\tMailverteiler,\n\t\tProfilEmails,\n\t\tRoleInformation,\n\t\tProfilInformation,\n\t},\n\n\tprops: [\"data\"],\n\tprovide() {\n\t\treturn {\n\t\t\tstudiengang_kz: Vue.computed({ get: () => this.data.studiengang_kz }),\n\t\t}\n\t},\n\t\n\tmethods: {},\n\n\tcomputed: {\n\t\tfotoStatus() {\n\t\t\treturn this.data?.fotoStatus ?? null;\n\t\t},\n\t\tprofilInformation() {\n\t\t\tif (!this.data) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tVorname: this.data.vorname,\n\t\t\t\tNachname: this.data.nachname,\n\t\t\t\tUsername: this.data.username,\n\t\t\t\tAnrede: this.data.anrede,\n\t\t\t\tTitel: this.data.titel,\n\t\t\t\tPostnomen: this.data.postnomen,\n\t\t\t\tfoto_sperre: this.data.foto_sperre,\n\t\t\t\tfoto: this.data.foto,\n\t\t\t};\n\t\t},\n\n\t\tpersonEmails() {\n\t\t\treturn this.data?.emails ? this.data.emails : [];\n\t\t},\n\n\t\troleInformation() {\n\t\t\tif (!this.data) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\n\t\t\treturn {\n\t\t\t\tgeburtsdatum: {\n\t\t\t\t\tlabel: `${this.$p.t('profil','Geburtsdatum')}`,\n\t\t\t\t\tvalue: this.data.gebdatum\n\t\t\t\t},\n\t\t\t\tgeburtsort: {\n\t\t\t\t\tlabel: `${this.$p.t('profil','Geburtsort')}`,\n\t\t\t\t\tvalue: this.data.gebort\n\t\t\t\t},\n\t\t\t\tpersonenkennzeichen: {\n\t\t\t\t\tlabel: `${this.$p.t('person','personenkennzeichen')}`,\n\t\t\t\t\tvalue: this.data.personenkennzeichen\n\t\t\t\t},\n\t\t\t\tstudiengang: {\n\t\t\t\t\tlabel: `${this.$p.t('lehre','studiengang')}`,\n\t\t\t\t\tvalue: this.data.studiengang\n\t\t\t\t},\n\t\t\t\tsemester: {\n\t\t\t\t\tlabel: `${this.$p.t('lehre','semester')}`,\n\t\t\t\t\tvalue: this.data.semester\n\t\t\t\t},\n\t\t\t\tverband: {\n\t\t\t\t\tlabel: `${this.$p.t('lehre','lehrverband')}`,\n\t\t\t\t\tvalue: this.data.verband\n\t\t\t\t},\n\t\t\t\tgruppe: {\n\t\t\t\t\tlabel: `${this.$p.t('lehre','gruppe')}`,\n\t\t\t\t\tvalue: this.data.gruppe.trim()\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\t},\n\n\tmounted() {\n\t},\n\n\ttemplate: /*html*/ ` \n\n
    \n \n
    \n \n \n \n \n
    \n \n \n \n
    \n \n
    \n
    \n
    \n \n
    \n
    \n \n \n \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n \n
    \n \n \n
    \n \n
    \n \n
    \n \n \n \n \n \n
    \n
    \n \n \n
    \n \n
    \n \n
    \n \n
    \n \n
    \n `,\n};\n","import {CoreFilterCmpt} from \"../../../components/filter/Filter.js\";\nimport Mailverteiler from \"./ProfilComponents/Mailverteiler.js\";\nimport QuickLinks from \"./ProfilComponents/QuickLinks.js\";\nimport RoleInformation from \"./ProfilComponents/RoleInformation.js\";\nimport ProfilEmails from \"./ProfilComponents/ProfilEmails.js\";\nimport ProfilInformation from \"./ProfilComponents/ProfilInformation.js\";\n\nimport { dateFilter } from '../../../tabulator/filters/Dates.js';\n\nexport default {\n\tcomponents: {\n\t\tCoreFilterCmpt,\n\t\tMailverteiler,\n\t\tQuickLinks,\n\t\tRoleInformation,\n\t\tProfilEmails,\n\t\tProfilInformation,\n\t},\n\tinject: [\"collapseFunction\", \"language\"],\n\tdata() {\n\t\treturn {\n\t\t\tcollapseIconFunktionen: true,\n\t\t\tpreloadedPhrasen:{},\n\t\t\tfunktionen_table_options: {\n\t\t\t\tpersistenceID: \"filterTableMaViewProfilFunktionen\",\n\t\t\t\tpersistence: {\n\t\t\t\t\tcolumns: false\n\t\t\t\t},\n\t\t\t\tminHeight: 300,\n\t\t\t\tlayout: \"fitColumns\",\n\t\t\t\tresponsiveLayout: \"collapse\",\n\t\t\t\tresponsiveLayoutCollapseUseFormatters: false,\n\t\t\t\tresponsiveLayoutCollapseFormatter: Vue.$collapseFormatter,\n\t\t\t\tcolumns: [\n\t\t\t\t\t//? option when wanting to hide the collapsed list\n\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle:\n\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\tfield: \"collapse\",\n\t\t\t\t\t\theaderSort: false,\n\t\t\t\t\t\theaderFilter: false,\n\t\t\t\t\t\tformatter: \"responsiveCollapse\",\n\t\t\t\t\t\tmaxWidth: 40,\n\t\t\t\t\t\theaderClick: this.collapseFunction,\n\t\t\t\t\t\tvisible: true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: Vue.computed(() => this.$p.t('ui/bezeichnung')),\n\t\t\t\t\t\tfield: \"Bezeichnung\",\n\t\t\t\t\t\theaderFilter: true,\n\t\t\t\t\t\tminWidth: 200,\n\t\t\t\t\t\tvisible: true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: Vue.computed(() => this.$p.t('lehre/organisationseinheit')),\n\t\t\t\t\t\tfield: \"Organisationseinheit\",\n\t\t\t\t\t\theaderFilter: true,\n\t\t\t\t\t\tminWidth: 200,\n\t\t\t\t\t\tvisible: true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: Vue.computed(() => this.$p.t('global/gueltigVon')),\n\t\t\t\t\t\tfield: \"Gültig_von\",\n\t\t\t\t\t\theaderFilterFunc: 'dates',\n\t\t\t\t\t\theaderFilter: dateFilter,\n\t\t\t\t\t\tresizable: true,\n\t\t\t\t\t\tminWidth: 200,\n\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\tformatter:\"datetime\",\n\t\t\t\t\t\tformatterParams: this.datetimeFormatterParams()\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: Vue.computed(() => this.$p.t('global/gueltigBis')),\n\t\t\t\t\t\tfield: \"Gültig_bis\",\n\t\t\t\t\t\theaderFilterFunc: 'dates',\n\t\t\t\t\t\theaderFilter: dateFilter,\n\t\t\t\t\t\tresizable: true,\n\t\t\t\t\t\tminWidth: 200,\n\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\tformatter:\"datetime\",\n\t\t\t\t\t\tformatterParams: this.datetimeFormatterParams()\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: Vue.computed(() => this.$p.t('profil/wochenstunden')),\n\t\t\t\t\t\tfield: \"Wochenstunden\",\n\t\t\t\t\t\theaderFilter: true,\n\t\t\t\t\t\tminWidth: 200,\n\t\t\t\t\t\tvisible: true\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t};\n\t},\n\n\t//? this is the prop passed to the dynamic component with the custom data of the view\n\tprops: [\"data\"],\n\tmethods: {\n\t\tfunktionenTableBuilt: function () {\n\t\t\tthis.$refs.funktionenTable.tabulator.setData(this.data.funktionen);\n\t\t},\n\t\tdatetimeFormatterParams: function() {\n\t\t\tconst params = {\n\t\t\t\tinputFormat:\"yyyy-MM-dd\",\n\t\t\t\toutputFormat:\"dd.MM.yyyy\",\n\t\t\t\tinvalidPlaceholder:\"(invalid date)\",\n\t\t\t\ttimezone:FHC_JS_DATA_STORAGE_OBJECT.timezone\n\t\t\t};\n\t\t\treturn params;\n\t\t}\n\t},\n\twatch: {\n\t\t'data.funktionen'(newVal) {\n\t\t\tif(this.$refs.funktionenTable) this.$refs.funktionenTable.tabulator.setData(newVal);\n\t\t},\n\t\t'language.value'(newVal) { // reevaluates computed phrasen\n\t\t\tif(this.$refs.funktionenTable) this.$refs.funktionenTable.tabulator.setColumns(this.funktionen_table_options.columns)\n\t\t}\n\t},\n\tcomputed: {\n\t\tgetTelefonValue() {\n\t\t\tif(this.data.standort_telefon?.kontakt) {\n\t\t\t\treturn this.data.standort_telefon.kontakt + \" \" + this.data.telefonklappe\n\t\t\t} else if(this.data.standort_telefon) {\n\t\t\t\treturn this.data.standort_telefon + \" \" + this.data.telefonklappe\n\t\t\t} else {\n\t\t\t\treturn this.data.telefonklappe\n\t\t\t}\n\t\t},\n\t\tfotoStatus() {\n\t\t\treturn this.data?.fotoStatus ?? null;\n\t\t},\n\n\t\tpersonEmails() {\n\t\t\treturn this.data?.emails ? this.data.emails : [];\n\t\t},\n\n\t\tprofilInformation() {\n\t\t\tif (!this.data) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tVorname: this.data.vorname,\n\t\t\t\tNachname: this.data.nachname,\n\t\t\t\tUsername: this.data.username,\n\t\t\t\tAnrede: this.data.anrede,\n\t\t\t\tTitel: this.data.titel,\n\t\t\t\tPostnomen: this.data.postnomen,\n\t\t\t\tfoto_sperre: this.data.foto_sperre,\n\t\t\t\tfoto: this.data.foto,\n\t\t\t};\n\t\t},\n\n\t\troleInformation() {\n\t\t\tif (!this.data) {\n\t\t\t\treturn {};\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tgeburtsdatum: {\n\t\t\t\t\tlabel: `${this.$p.t('profil','Geburtsdatum')}`,\n\t\t\t\t\tvalue: this.data.gebdatum\n\t\t\t\t},\n\t\t\t\tgeburtsort: {\n\t\t\t\t\tlabel: `${this.$p.t('profil','Geburtsort')}`,\n\t\t\t\t\tvalue: this.data.gebort\n\t\t\t\t},\n\t\t\t\tpersonenkennzeichen: {\n\t\t\t\t\tlabel: `${this.$p.t('profil','Kurzzeichen')}`,\n\t\t\t\t\tvalue: this.data.kurzbz\n\t\t\t\t},\n\t\t\t\ttelefon: {\n\t\t\t\t\tlabel: `${this.$p.t('profil','Telefon')}`,\n\t\t\t\t\tvalue: this.getTelefonValue\n\t\t\t\t},\n\t\t\t\toffice: {\n\t\t\t\t\tlabel: `${this.$p.t('profil','Büro')}`,\n\t\t\t\t\tvalue: this.data.ort_kurzbz\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\t},\n\tcreated(){\n\t\tthis.$p.loadCategory([\"ui\", \"lehre\", \"global\", \"profil\"]).then(() => {\n\t\t\tthis.preloadedPhrasen.bezeichnungPhrase = this.$p.t('ui/bezeichnung');\n\t\t\tthis.preloadedPhrasen.organisationseinheitPhrase = this.$p.t('lehre/organisationseinheit');\n\t\t\tthis.preloadedPhrasen.gueltigVonPhrase = this.$p.t('global/gueltigVon');\n\t\t\tthis.preloadedPhrasen.gueltigBisPhrase = this.$p.t('global/gueltigBis');\n\t\t\tthis.preloadedPhrasen.wochenstundenPhrase = this.$p.t('profil/wochenstunden');\n\t\t\tthis.preloadedPhrasen.loaded = true;\n\t\t});\n\t},\n\n\ttemplate: /*html*/ `\n\n
    \n \n
    \n \n \n \n \n
    \n \n \n \n
    \n \n
    \n
    \n
    \n \n \n
    \n
    \n \n \n \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n \n \n
    \n \n
    \n \n
    \n \n
    \n \n
    \n \n
    \n \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n \n
    \n \n
    \n \n
    \n`,\n};\n","import StudentProfil from \"./StudentProfil.js\";\nimport MitarbeiterProfil from \"./MitarbeiterProfil.js\";\nimport ViewStudentProfil from \"./StudentViewProfil.js\";\nimport ViewMitarbeiterProfil from \"./MitarbeiterViewProfil.js\";\nimport Loading from \"../../Loader.js\";\n\nimport ApiProfil from '../../../api/factory/profil.js';\nimport ApiProfilUpdate from '../../../api/factory/profilUpdate.js';\n\nVue.$collapseFormatter = function (data) {\n\t//data - an array of objects containing the column title and value for each cell\n\tvar container = document.createElement(\"div\");\n\tcontainer.classList.add(\"tabulator-collapsed-row\");\n\tcontainer.classList.add(\"text-break\");\n\n\tvar list = document.createElement(\"div\");\n\tlist.classList.add(\"row\");\n\n\tcontainer.appendChild(list);\n\n\tdata.forEach(function (col) {\n\t\tlet item = document.createElement(\"div\");\n\t\titem.classList.add(\"col-6\");\n\t\tlet item2 = document.createElement(\"div\");\n\t\titem2.classList.add(\"col-6\");\n\n\t\titem.innerHTML = \"\" + col.title + \"\";\n\t\titem2.innerHTML = col.value ? col.value : \"-\";\n\n\t\tlist.appendChild(item);\n\t\tlist.appendChild(item2);\n\t});\n\n\treturn Object.keys(data).length ? container : \"\";\n};\n\nexport const Profil = {\n\tname: 'Profil',\n\tcomponents: {\n\t\tStudentProfil,\n\t\tMitarbeiterProfil,\n\t\tViewStudentProfil,\n\t\tViewMitarbeiterProfil,\n\t\tLoading,\n\t},\n\tprops: {\n\t\tuid: {\n\t\t\ttype: String,\n\t\t\trequired:false,\n\t\t},\n\t\tviewData: {\n\t\t\ttype: Object,\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\t//? loading property is used for showing/hiding the loading modal\n\t\t\tloading: false,\n\t\t\tprofilUpdateStates: null,\n\t\t\tprofilUpdateTopic: null,\n\t\t\tview: null,\n\t\t\tdata: null,\n\t\t\t// notfound is null by default, but contains an UID if no user exists with that UID\n\t\t\tnotFoundUID: null,\n\t\t\tisEditable: this.viewData.editable ?? false,\n\t\t};\n\t},\n\tprovide() {\n\t\treturn {\n\t\t\tisEditable: Vue.computed(()=>this.isEditable),\n\t\t\tprofilUpdateStates: Vue.computed(() =>\n\t\t\t\tthis.profilUpdateStates ? this.profilUpdateStates : false\n\t\t\t),\n\t\t\tprofilUpdateTopic: Vue.computed(() =>\n\t\t\t\tthis.profilUpdateTopic ? this.profilUpdateTopic : false\n\t\t\t),\n\t\t\tsetLoading: (newValue) => {\n\t\t\t\tthis.loading = newValue;\n\t\t\t},\n\t\t\tgetZustellkontakteCount: this.zustellKontakteCount,\n\t\t\tgetZustelladressenCount: this.zustellAdressenCount,\n\t\t\tcollapseFunction: (e, column) => {\n\t\t\t\t//* check if property doesn't exist already and add it to the reactive this properties\n\t\t\t\tif (this[e.target.id] === undefined) {\n\t\t\t\t\tthis[e.target.id] = true;\n\t\t\t\t}\n\t\t\t\tthis[e.target.id] = !this[e.target.id];\n\n\t\t\t\t//* gets all event icons of the different rows to use the onClick event later\n\t\t\t\tlet allClickableIcons = column._column.cells.map((row) => {\n\t\t\t\t\treturn row.element.children[0];\n\t\t\t\t});\n\n\t\t\t\t//* changes the icon that shows or hides all the collapsed columns\n\t\t\t\t//* if the replace function does not find the class to replace, it just simply returns false\n\t\t\t\tif (this[e.target.id]) {\n\t\t\t\t\te.target.classList.replace(\"fa-angle-up\", \"fa-angle-down\");\n\t\t\t\t} else {\n\t\t\t\t\te.target.classList.replace(\"fa-angle-down\", \"fa-angle-up\");\n\t\t\t\t}\n\n\t\t\t\t//* changes the icon for every collapsed column to open or closed\n\t\t\t\tif (this[e.target.id]) {\n\t\t\t\t\tallClickableIcons\n\t\t\t\t\t\t.filter((column) => {\n\t\t\t\t\t\t\treturn !column.classList.contains(\"open\");\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.forEach((col) => {\n\t\t\t\t\t\t\tcol.click();\n\t\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tallClickableIcons\n\t\t\t\t\t\t.filter((column) => {\n\t\t\t\t\t\t\treturn column.classList.contains(\"open\");\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.forEach((col) => {\n\t\t\t\t\t\t\tcol.click();\n\t\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t\tsortProfilUpdates: (ele1, ele2) => {\n\t\t\t\tlet result = 0;\n\t\t\t\tif (ele1.status.toLowerCase() === \"pending\") {\n\t\t\t\t\tresult = -1;\n\t\t\t\t} else if (ele1.status.toLowerCase() === \"accepted\") {\n\t\t\t\t\tresult = ele2.status.toLowerCase() === \"rejected\" ? -1 : 1;\n\t\t\t\t} else {\n\t\t\t\t\tresult = 1;\n\t\t\t\t}\n\t\t\t\t//? if they have the same status the insert date is used for ordering\n\t\t\t\tif (ele1.status === ele2.status) {\n\t\t\t\t\tresult =\n\t\t\t\t\t\tnew Date(ele2.insertamum.split(\".\").reverse().join(\"-\")) -\n\t\t\t\t\t\tnew Date(ele1.insertamum.split(\".\").reverse().join(\"-\"));\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t},\n\t\t};\n\t},\n\tmethods: {\n\t\tasync load() {\n\t\t\t// fetch profilUpdateStates to provide them to children components\n\t\t\tawait this.$api\n\t\t\t\t.call(ApiProfilUpdate.getStatus())\n\t\t\t\t.then((response) => {\n\t\t\t\t\tthis.profilUpdateStates = response.data;\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconsole.error(error);\n\t\t\t\t});\n\n\t\t\tthis.$api\n\t\t\t\t.call(ApiProfilUpdate.getTopic())\n\t\t\t\t.then((response) => {\n\t\t\t\t\tthis.profilUpdateTopic = response.data;\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconsole.error(error);\n\t\t\t\t});\n\t\t\t\n\t\t\t\n\t\t\tthis.$api\n\t\t\t\t.call(ApiProfil.profilViewData(this.$route.params.uid??null))\n\t\t\t\t.then((response) => response.data).then(data=>{\n\t\t\t\t\tthis.view = data?.profil_data.view;\n\t\t\t\t\tthis.data = data?.profil_data.data;\n\t\t\t\t\tthis.isEditable = data?.editable ?? false;\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconsole.error(error);\n\t\t\t\t});\n\t\t\t\n\t\t\t\n\t\t},\n\t\tzustellAdressenCount() {\n\t\t\tif (!this.data || !this.data.adressen) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tlet adressenArray = [];\n\t\t\tif (this.data.profilUpdates?.length) {\n\t\t\t\tadressenArray = adressenArray.concat(\n\t\t\t\t\tthis.data.profilUpdates\n\t\t\t\t\t\t.filter((update) => {\n\t\t\t\t\t\t\treturn update.requested_change.zustelladresse;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.map((adresse) => {\n\t\t\t\t\t\t\treturn adresse.requested_change.adresse_id;\n\t\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t!this.data.profilUpdates?.length ||\n\t\t\t\t!this.data.adressen\n\t\t\t\t\t.filter((adresse) => adresse.zustelladresse)\n\t\t\t\t\t.every((adresse) =>\n\t\t\t\t\t\tthis.data.profilUpdates.some(\n\t\t\t\t\t\t\t(update) =>\n\t\t\t\t\t\t\t\tupdate.requested_change.adresse_id == adresse.adresse_id\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t) {\n\t\t\t\tadressenArray = adressenArray.concat(\n\t\t\t\t\tthis.data.adressen\n\t\t\t\t\t\t.filter((adresse) => {\n\t\t\t\t\t\t\treturn adresse.zustelladresse;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.map((adr) => {\n\t\t\t\t\t\t\treturn adr.adresse_id;\n\t\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn [...new Set(adressenArray)];\n\t\t\t\n\t\t},\n\t\tzustellKontakteCount() {\n\t\t\tif (!this.data || !this.data.kontakte) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tlet kontakteArray = [];\n\n\t\t\tif (this.data.profilUpdates?.length) {\n\t\t\t\tkontakteArray = kontakteArray.concat(\n\t\t\t\t\tthis.data.profilUpdates\n\t\t\t\t\t\t.filter((update) => {\n\t\t\t\t\t\t\treturn update.status === 'Pending' && update.requested_change.zustellung;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.map((kontant) => {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\tkontakt_id: kontant.requested_change.kontakt_id,\n\t\t\t\t\t\t\t\t\t\tkontakttyp: kontant.requested_change.kontakttyp\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t!this.data.profilUpdates?.length ||\n\t\t\t\t!this.data.kontakte\n\t\t\t\t\t.filter((kontakt) => kontakt.zustellung)\n\t\t\t\t\t.every((kontakt) =>\n\t\t\t\t\t\tthis.data.profilUpdates.some(\n\t\t\t\t\t\t\t(update) =>\n\t\t\t\t\t\t\t\tupdate.status === 'Pending' && update.requested_change.kontakt_id == kontakt.kontakt_id\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t) {\n\t\t\t\tkontakteArray = kontakteArray.concat(\n\t\t\t\t\tthis.data.kontakte\n\t\t\t\t\t\t.filter((kontakt) => {\n\t\t\t\t\t\t\treturn kontakt.zustellung;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.map((kon) => {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\tkontakt_id: kon.kontakt_id,\n\t\t\t\t\t\t\t\t\t\tkontakttyp: kon.kontakttyp\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn [...new Set(kontakteArray)];\n\t\t},\n\t},\n\tcomputed: {\n\t\t\n\t\tfilteredEditData() {\n\t\t\tif (!this.data) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tview: null,\n\t\t\t\tdata: {\n\t\t\t\t\tPersonen_Informationen: {\n\t\t\t\t\t\ttitle: this.$p.t(\"profil\", \"personenInformationen\"),\n\t\t\t\t\t\ttopic: \"Personen_informationen\",\n\t\t\t\t\t\tview: null,\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tvorname: {\n\t\t\t\t\t\t\t\ttitle: this.$p.t(\"person\", \"vorname\"),\n\t\t\t\t\t\t\t\ttopic: this.profilUpdateTopic?.[\"Vorname\"],\n\t\t\t\t\t\t\t\tview: \"TextInputDokument\",\n\t\t\t\t\t\t\t\twithFiles: true,\n\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\ttitel: \"vorname\",\n\t\t\t\t\t\t\t\t\tvalue: this.data.vorname,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tnachname: {\n\t\t\t\t\t\t\t\ttitle: this.$p.t(\"person\", \"nachname\"),\n\t\t\t\t\t\t\t\ttopic: this.profilUpdateTopic?.[\"Nachname\"],\n\t\t\t\t\t\t\t\tview: \"TextInputDokument\",\n\t\t\t\t\t\t\t\twithFiles: true,\n\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\ttitel: \"nachname\",\n\t\t\t\t\t\t\t\t\tvalue: this.data.nachname,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttitel: {\n\t\t\t\t\t\t\t\ttitle: this.$p.t(\"global\", \"titel\"),\n\t\t\t\t\t\t\t\ttopic: this.profilUpdateTopic?.[\"Titel\"],\n\t\t\t\t\t\t\t\tview: \"TextInputDokument\",\n\t\t\t\t\t\t\t\twithFiles: true,\n\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\ttitel: \"titel\",\n\t\t\t\t\t\t\t\t\tvalue: this.data.titel,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tpostnomen: {\n\t\t\t\t\t\t\t\ttitle: this.$p.t(\"profil\", \"postnomen\"),\n\t\t\t\t\t\t\t\ttopic: this.profilUpdateTopic?.[\"Postnomen\"],\n\t\t\t\t\t\t\t\tview: \"TextInputDokument\",\n\t\t\t\t\t\t\t\twithFiles: true,\n\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\ttitel: \"postnomen\",\n\t\t\t\t\t\t\t\t\tvalue: this.data.postnomen,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tPrivate_Kontakte: {\n\t\t\t\t\t\ttitle: this.$p.t(\"profil\", \"privateKontakte\"),\n\t\t\t\t\t\ttopic: this.profilUpdateTopic?.[\"Private Kontakte\"],\n\t\t\t\t\t\tdata: this.data.kontakte\n\t\t\t\t\t\t\t?.filter((item) => {\n\t\t\t\t\t\t\t\t// excludes all contacts that are already used in pending profil update requests\n\t\t\t\t\t\t\t\treturn !this.data.profilUpdates?.some(\n\t\t\t\t\t\t\t\t\t(update) =>\n\t\t\t\t\t\t\t\t\t\tupdate.status === this.profilUpdateStates[\"Pending\"] &&\n\t\t\t\t\t\t\t\t\t\tupdate.requested_change?.kontakt_id === item.kontakt_id\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.map((kontakt) => {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tlistview: \"Kontakt\",\n\t\t\t\t\t\t\t\t\tview: \"EditKontakt\",\n\t\t\t\t\t\t\t\t\tdata: kontakt,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t\tPrivate_Adressen: {\n\t\t\t\t\t\ttitle: this.$p.t(\"profil\", \"privateAdressen\"),\n\t\t\t\t\t\ttopic: this.profilUpdateTopic?.[\"Private Adressen\"],\n\t\t\t\t\t\tdata: this.data.adressen\n\t\t\t\t\t\t\t?.filter((item) => {\n\t\t\t\t\t\t\t\treturn !this.data.profilUpdates?.some((update) => {\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\tupdate.status === this.profilUpdateStates[\"Pending\"] &&\n\t\t\t\t\t\t\t\t\t\tupdate.requested_change?.adresse_id == item.adresse_id\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.map((adresse) => {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tlistview: \"Adresse\",\n\t\t\t\t\t\t\t\t\tview: \"EditAdresse\",\n\t\t\t\t\t\t\t\t\tdata: adresse,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t},\n\twatch: {\n\t\tloading: function (newValue) {\n\t\t\tif (newValue) {\n\t\t\t\tthis.$refs.loadingModalRef.show();\n\t\t\t} else {\n\t\t\t\tthis.$refs.loadingModalRef.hide();\n\t\t\t}\n\t\t},\n\t\tuid (newVal, oldVal) {\n\t\t\tthis.load()\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.load()\n\t},\n\ttemplate: `\n\t
    \n\t\t
    \n\t\t\t

    Es wurde keine Person mit der UID {{this.notFoundUID}} gefunden

    \n\t\t
    \n\t\t
    \n \n \n\t\t
    \n\t
    `,\n}\n\nexport default Profil","/**\n * Copyright (C) 2025 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tgetContentID(ort_kurbz) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Ort/ContentID',\n\t\t\tparams: { ort_kurzbz: ort_kurbz }\n\t\t};\n\t},\n\tgetRooms(datum, von, bis, typ, personenanzahl = 0) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Ort/getRooms',\n\t\t\tparams: { datum, von, bis, typ, personenanzahl }\n\t\t};\n\t},\n\tgetRoomTypes() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Ort/getTypes',\n\t\t\tparams: { }\n\t\t};\n\t}\n};","import {CoreFilterCmpt} from \"../../../components/filter/Filter.js\";\nimport VueDatePicker from '../../vueDatepicker.js.php';\nimport ApiOrt from '../../../api/factory/ort.js'\nexport const Raumsuche = {\n\tname: \"Raumsuche\",\n\tprops: {\n\t\t\n\t},\n\tcomponents: {\n\t\tVueDatePicker,\n\t\tCoreFilterCmpt,\n\t\tInputNumber: primevue.inputnumber,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tphrasenPromise: null,\n\t\t\tphrasenResolved: false,\n\t\t\ttabulatorUuid: Vue.ref(0),\n\t\t\ttableBuiltResolve: null,\n\t\t\ttableBuiltPromise: null,\n\t\t\troomtypes: null,\n\t\t\tdefaultType: {\n\t\t\t\traumtyp_kurzbz: '',\n\t\t\t\tbeschreibung: Vue.computed(() => this.$p.t('global/alle'))\n\t\t\t},\n\t\t\tanzahl: 1,\n\t\t\tselectedType: null,\n\t\t\tdatum: new Date(),\n\t\t\tvon: Vue.ref({\n\t\t\t\thours: new Date().getHours(),\n\t\t\t\tminutes: new Date().getMinutes()\n\t\t\t}),\n\t\t\tbis: Vue.ref({\n\t\t\t\thours: new Date().getHours() + 1,\n\t\t\t\tminutes: new Date().getMinutes()\n\t\t\t}),\n\t\t\tdatepickerTextInputOptions: {\n\t\t\t\tenterSubmit: true,\n\t\t\t\ttabSubmit: true,\n\t\t\t\tselectOnFocus: true,\n\t\t\t\tformat: 'dd.MM.yyyy',\n\t\t\t\tescClose: true\n\t\t\t},\n\t\t\ttimepickerTextInputOptions: {\n\t\t\t\tenterSubmit: true,\n\t\t\t\ttabSubmit: true,\n\t\t\t\tselectOnFocus: true,\n\t\t\t\tformat: 'HH:mm',\n\t\t\t\tescClose: true\n\t\t\t},\n\t\t\traumsucheTableOptions: {\n\t\t\t\theight: Vue.ref(400),\n\t\t\t\tindex: 'ort_kurzbz',\n\t\t\t\tlayout: 'fitColumns',\n\t\t\t\tplaceholder: this.$p.t('global/noDataAvailable'),\n\t\t\t\tcolumns: [\n\t\t\t\t\t{title: Vue.computed(() => this.$p.t('rauminfo/raum_kurzbz')), field: 'ort_kurzbz', widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$p.t('global/bezeichnung')), field: 'bezeichnung', widthGrow: 2},\n\t\t\t\t\t{title: Vue.computed(() => this.$p.t('rauminfo/raumnummer')), field: 'nummer', widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$p.t('rauminfo/personcap')), field: 'personen', widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$p.t('rauminfo/rauminfo')),\n\t\t\t\t\t\tfield: 'linkInfo', formatter: this.linkFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$p.t('rauminfo/roomReservations')), \n\t\t\t\t\t\tfield: 'linkRes', formatter: this.linkFormatter, widthGrow: 1}\n\t\t\t\t],\n\t\t\t\tpersistence: false,\n\t\t\t},\n\t\t\traumsucheTableEventHandlers: [{\n\t\t\t\tevent: \"tableBuilt\",\n\t\t\t\thandler: async () => {\n\t\t\t\t\tthis.tableBuiltResolve()\n\t\t\t\t}\n\t\t\t}\n\t\t\t]};\n\t},\n\tmethods: {\n\t\ttableResolve(resolve) {\n\t\t\tthis.tableBuiltResolve = resolve\n\t\t},\n\t\tlinkFormatter(cell) {\n\t\t\tconst val = cell.getValue();\n\t\t\tconst field = cell.getField();\n\t\t\tconst arialabel = (field === 'linkInfo') \n\t\t\t\t\t\t\t? this.$p.t('rauminfo/rauminfo') \n\t\t\t\t\t\t\t: this.$p.t('rauminfo/roomReservations');\n\t\t\tif(val) {\n\t\t\t\treturn ''\n\t\t\t} else {\n\t\t\t\treturn '
    ' +\n\t\t\t\t\t'-
    '\n\t\t\t}\n\t\t},\n\t\troomPlanLink(room) {\n\t\t\treturn FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router\n\t\t\t+ '/CisVue/Cms/getRoomInformation/' + room.ort_kurzbz\n\t\t},\n\t\troomInfoLink(room) {\n\t\t\treturn FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router\n\t\t\t\t+ '/CisVue/Cms/content/' + room.content_id\n\t\t},\n\t\tgetTimeString(time) {\n\t\t\tconst hours = String(time.hours).padStart(2, '0');\n\t\t\tconst minutes = String(time.minutes).padStart(2, '0');\n\t\t\treturn `${hours}:${minutes}`\n\t\t},\n\t\tsetupData(data){\n\t\t\tconst d = data.map(room => {\n\t\t\t\treturn {\n\t\t\t\t\tort_kurzbz: room.ort_kurzbz,\n\t\t\t\t\tbezeichnung: room.bezeichnung.replace('&', '&'),\n\t\t\t\t\tnummer: room.planbezeichnung,\n\t\t\t\t\tpersonen: room.max_person,\n\t\t\t\t\tlinkInfo: room.content_id ? this.roomInfoLink(room) : null,\n\t\t\t\t\tlinkRes: this.roomPlanLink(room)\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\t\n\t\t\t})\n\t\t\t\n\t\t\tthis.$refs.raumsucheTable.tabulator.setData(d);\n\t\t},\n\t\tloadRoomTypes() {\n\t\t\tthis.$api.call(ApiOrt.getRoomTypes())\n\t\t\t\t.then(res => {\n\t\t\t\tres?.data?.forEach(type => {\n\t\t\t\t\ttype.beschreibung = type.beschreibung.replace('&', '&')\n\t\t\t\t})\n\t\t\t\tthis.selectedType = this.defaultType\n\t\t\t\tthis.roomtypes = res?.data ?? []\n\t\t\t})\n\t\t},\n\t\tloadRooms() {\n\t\t\tthis.$api.call(ApiOrt.getRooms(this.datum.toISOString(), this.getTimeString(this.von), this.getTimeString(this.bis), this.selectedType?.raumtyp_kurzbz ?? '', this.anzahl))\n\t\t\t\t.then(res => {\n\t\t\t\t\tif(res?.data?.retval) this.setupData(res.data.retval)\n\t\t\t})\n\t\t},\n\t\thandleUuidDefined(uuid) {\n\t\t\tthis.tabulatorUuid = uuid\n\t\t},\n\t\tsearch(){\n\t\t\tthis.loadRooms()\n\t\t},\n\t\tsetRoute(val) {\n\t\t\t// TODO: router push\n\t\t},\n\t\tdateFormat(date) {\n\t\t\tconst day = String(date.getDate()).padStart(2, '0');\n\t\t\tconst month = String(date.getMonth() + 1).padStart(2, '0');\n\t\t\tconst year = date.getFullYear();\n\t\t\treturn `${day}.${month}.${year}`\n\t\t},\n\t\ttimeFormat(date) {\n\t\t\tconst hours = String(date.getHours()).padStart(2, '0');\n\t\t\tconst minutes = String(date.getMinutes()).padStart(2, '0');\n\t\t\treturn `${hours}:${minutes}`;\n\t\t},\n\t\tasync setupMounted() {\n\t\t\t\n\t\t\tthis.tableBuiltPromise = new Promise(this.tableResolve)\n\t\t\tawait this.tableBuiltPromise\n\t\t\t\n\t\t\tthis.loadRoomTypes()\n\t\t\tthis.loadRooms()\n\n\t\t\tconst tableID = this.tabulatorUuid ? ('-' + this.tabulatorUuid) : ''\n\t\t\tconst tableDataSet = document.getElementById('filterTableDataset' + tableID);\n\t\t\tif(!tableDataSet) return\n\t\t\tconst rect = tableDataSet.getBoundingClientRect();\n\n\t\t\tconst h = window.visualViewport.height - rect.top - 100\n\t\t\tif(this.$refs.raumsucheTable) {\n\t\t\t\tthis.$refs.raumsucheTable.$refs.table.style.setProperty('height', h+'px')\n\t\t\t}\n\t\t\t\n\t\t}\n\t},\n\tcomputed: {\n\t\tisDarkMode(){\n\t\t\treturn this.$theme.theme_name.value == 'dark';\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.phrasenPromise = this.$p.loadCategory(['rauminfo', 'global'])\n\t\tthis.phrasenPromise.then(()=> {this.phrasenResolved = true})\n\t},\n\tmounted() {\n\t\tthis.setupMounted()\n\t},\n\ttemplate: `\n\t

    {{$p.t('rauminfo/roomSearch')}}

    \n\t
    \n\t
    \n\t\t
    \n\t\t\t\n\t\t\t\n\t\t
    \n\t\t
    \n\t\t\t\n\t\t\t\n\t\t
    \n\t\t
    \n\t\t\t\n\t\t\t\n\t\t
    \n\t\t\n\t\t
    \n\t\t\t\n\t\t
    \n\t\t\n\n\t\t
    \n\t\t\t\n\t\t
    \n\t\t
    \n\t\t\t\n\t\t
    \n\t
    \n\t\n\n \n `,\n};\n\nexport default Raumsuche;\n","export default {\n components: {\n paginator: primevue.paginator,\n },\n emits: [\"update:rows\"],\n props: {\n maxPageCount: {\n type: Number,\n default: 0,\n },\n page_size: {\n type: Number,\n required: true,\n },\n },\n data() {\n return {};\n },\n methods: {\n newPageEvent: function (data) {\n \n },\n },\n mounted() {},\n template: /*html*/ `\n \t\n\t
    \n\t\t$emit('page',{...data, page:data.page+1})\" :rows=\"page_size\" :totalRecords=\"maxPageCount\" :rowsPerPageOptions=\"[10, 20, 30]\" >\n\t\t\n\t
    \n\t\n\t
    \n\t\t$emit('page',{...data, page:data.page+1})\" :rows=\"page_size\" :totalRecords=\"maxPageCount\" :rowsPerPageOptions=\"[10, 20, 30]\" template=\"FirstPageLink PrevPageLink CurrentPageReport NextPageLink LastPageLink RowsPerPageDropdown\">\n\t\t\n\t
    \n `,\n};\n","export default {\n\tprops:{\n\t\tuid:String,\n\t\tvorname:String,\n\t\tnachname:String,\n\t\ttitelpre:String,\n\t\tkontakt:String,\t\n\t\ttelefoneklappe:String,\n\t\temail:String,\n\t\tplanbezeichnung:String,\n\t\tfoto:String,\n\t\tdisplayWidget:{\n\t\t\ttype:Boolean,\n\t\t\tdefault:false,\n\t\t}\n\t},\n\ttemplate:/*html*/`\n\t
    \n\t\t
    \n\t\t\t\"mitarbeiter_foto\"\n\t\t
    \n\t\t
    \n\t\t\t
    {{fullname}}
    \n\t\t
    \n\t\t
    \n\t\t
    \n\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t
    {{phone.number}}
    \n\n\t\t\t\t
    \n\t\t\t\t
    {{ort}}
    \n\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t
    \n\n\t\t
    \n\t
    \n\t`,\n\tcomputed:{\n\t\tformattedEmail: function(){\n\t\t\tif(!this.email ) return null;\n\t\t\tlet emailString= this.email.replace(\"mailto:\", \"\");\n\t\t\t// when splitting a string, the letter that is used to split the string will be removed from the result\n\t\t\tlet emailArray = emailString.split('@');\n\t\t\t// returns both parts of the splitted string in combination with the removed letter and a word break\n\t\t\treturn emailArray[0] + '@' + emailArray[1];\n\t\t},\n\t\tfullname: function () {\n\t\t\tif (this.titelpre && this.vorname && this.nachname) {\n\t\t\t\treturn `${this.titelpre} ${this.vorname} ${this.nachname}`;\n\t\t\t}\n\t\t\telse if (this.vorname && this.nachname) {\n\t\t\t\treturn `${this.vorname} ${this.nachname}`;\n\t\t\t}\n\t\t\telse if (this.nachname) {\n\t\t\t\treturn this.vorname;\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t},\n\t\tphone: function () {\n\t\t\tif (this.kontakt && this.telefoneklappe) {\n\t\t\t\treturn {\n\t\t\t\t\tlink: \"tel:\".concat(this.kontakt).concat(\" \" + this.telefoneklappe),\n\t\t\t\t\tnumber: this.kontakt.concat(\" \" + this.telefoneklappe),\n\t\t\t\t} \n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn this.kontakt ? {\n\t\t\t\t\tlink: \"tel:\".concat(this.kontakt),\n\t\t\t\t\tnumber: this.kontakt,\n\t\t\t\t} : null;\n\t\t\t}\n\t\t},\n\t\temail_link: function () {\n\t\t\treturn this.email ? \"mailto:\".concat(this.email) : null;\n\t\t},\n\t\tbase64Image:function(){\n\t\t\treturn this.foto ? 'data:image/png;base64,'.concat(this.foto) : null;\n\t\t},\n\t\tort:function(){\n\t\t\treturn this.planbezeichnung ?? null;\n\t\t},\n\t\tprofilViewLink: function(){\n\t\t\treturn this.uid ? FHC_JS_DATA_STORAGE_OBJECT.app_root.concat(FHC_JS_DATA_STORAGE_OBJECT.ci_router).concat(\"/Cis/Profil/View/\").concat(this.uid): null; \n\t\t},\n\t},\n\t\n}","export default {\n\tprops: {\n\t\ttitle:String,\n\t\tvertretungsList:Array,\n\t\tshowBezeichnung:Boolean,\n\t},\n\ttemplate:/*html*/`\n\t
    \n\t\t
    \n\t\t\t{{title}}\n\t\t
    \n\t\t
    \n\t\t\t

    \n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{{vertretungFormatedName(vertretung,false)}}\n\t\t\t

    \n\t\t
    \n\t
    \n\t`,\n\tmethods: {\n\t\tprofilViewLink: function (uid) {\n\t\t\treturn uid ? FHC_JS_DATA_STORAGE_OBJECT.app_root.concat(FHC_JS_DATA_STORAGE_OBJECT.ci_router).concat(\"/Cis/Profil/View/\").concat(uid) : null;\n\t\t},\n\t\tvertretungFormatedName: function (vertretung) {\n\t\t\tif (!vertretung) return null;\n\t\t\treturn `${vertretung.vorname ?? ''} ${vertretung.nachname ?? ''} ${vertretung.bezeichnung && this.showBezeichnung ? '('.concat(vertretung.bezeichnung.replace(\"(\", \"\").replace(\")\", \"\")).concat(\")\") : ''}`\n\t\t},\n\t},\n\n}","/**\n * Copyright (C) 2025 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tstudiengangInformation() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Studgang/getStudiengangInfo'\n\t\t};\n\t},\n\tgetStudiengangByKz(studiengang_kz) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/organisation/StudiengangEP/getStudiengangByKz',\n\t\t\tparams: { studiengang_kz }\n\t\t};\n\t}\n};","import StudiengangPerson from \"./StudiengangPerson.js\";\nimport StudiengangVertretung from \"./StudiengangVertretung.js\";\n\nimport ApiStudiengang from '../../../../api/factory/studiengang.js';\n\nexport default {\ndata(){\n\treturn{\n\t\tstudiengang:null,\n\t\tsemester: null,\n\t\tstg_ltg: null,\n\t\tgf_ltg: null,\n\t\tstv_ltg: null,\n\t\tass: null,\n\t\thochschulvertr: null,\n\t\tstdv: null,\n\t\tjahrgangsvertr: null,\n\t}\n},\nprops:{\n\tdisplayWidget:{\n\t\ttype:Boolean,\n\t\tdefault:false,\n\t}\n},\ncomponents:{\n\tStudiengangPerson,\n\tStudiengangVertretung,\n},\ntemplate:/*html*/`\n\t\t
    \n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t
    \n\t\n`,\ncomputed:{\n\t// this function concatenates the studiengangsleitung and the assistenz or the \n\t// geschaeftsfuehrende-Stellvertretende Leitung if both collections only contain one person\n\tcollection_array: function(){\n\t\tlet returnData = [];\n\n\t\tif (Array.isArray(this.stg_ltg) && this.stg_ltg.length == 1 && Array.isArray(this.ass) && this.ass.length == 1)\n\t\t{\n\t\t\treturnData.push({ title: `${this.$p.t('global', 'studiengangsleitung')}/${this.$p.t('studiengangInformation', 'assistenz')}` , collection: [...this.stg_ltg, ...this.ass] });\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturnData.push({ title: this.$p.t('global', 'studiengangsleitung'), collection: this.stg_ltg });\n\t\t\treturnData.push({ title: this.$p.t('studiengangInformation', 'assistenz'), collection: this.ass });\n\t\t}\n\t\tif (Array.isArray(this.gf_ltg) && this.gf_ltg.length == 1 && Array.isArray(this.stv_ltg) && this.stv_ltg.length == 1)\n\t\t{\n\t\t\treturnData.push({ title: this.$p.t('studiengangInformation', 'geschaeftsfuehrende_stellvertretende_leitung'), collection: [...this.gf_ltg, ...this.stv_ltg] });\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturnData.push({ title: this.$p.t('studiengangInformation', 'geschaeftsfuehrende_leitung'), collection: this.gf_ltg });\n\t\t\treturnData.push({ title: this.$p.t('studiengangInformation', 'stellvertretende_leitung'), collection: this.stv_ltg });\n\t\t}\n\n\t\treturn returnData;\n\t},\n\tmoodleLink: function(){\n\t\t// early return if the studiengang information is not available\n\t\tif(!this.studiengang || !this.studiengang.studiengang_kz) return;\n\n\t\treturn `https://moodle.technikum-wien.at/course/view.php?idnumber=dl` + this.studiengang.studiengang_kz;\n\t},\n},\n\tmounted() {\n\t\tthis.$api\n\t\t\t.call(ApiStudiengang.studiengangInformation())\n\t\t\t.then(res => res.data)\n\t\t\t.then(studiengangInformationen => {\n\t\t\t\tObject.assign(this, studiengangInformationen);\n\t\t\t});\n\t}\n};\n","/**\n * Copyright (C) 2025 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tcontent(content_id, version=null, sprache=null, sichtbar=null) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Cms/content',\n\t\t\tparams: {\n\t\t\t\tcontent_id,\n\t\t\t\t...(version ? { version } : {}),\n\t\t\t\t...(sprache ? { sprache } : {}),\n\t\t\t\t...(sichtbar ? { sichtbar } : {})\n\t\t\t}\n\t\t};\n\t},\n\t//api function used for the news View that renders the html\n\tgetNews(page = 1, page_size = 10, sprache) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Cms/getNews',\n\t\t\tparams: {\n\t\t\t\tpage,\n\t\t\t\tpage_size,\n\t\t\t\tsprache\n\t\t\t},\n\t\t};\n\t},\n\t//api function used for the widget component\n\tnews(limit) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Cms/news',\n\t\t\tparams: { limit }\n\t\t};\n\t},\n\tgetNewsRowCount() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Cms/getNewsRowCount'\n\t\t};\n\t},\n\tgetNewsExtra() {\n\t\t// TODO(chris): seems to be called from nowhere?\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Cms/getStudiengangInfoForNews'\n\t\t};\n\t}\n};","import Pagination from \"../../Pagination/Pagination.js\";\nimport StudiengangInformation from \"./StudiengangInformation/StudiengangInformation.js\";\nimport BsConfirm from \"../../Bootstrap/Confirm.js\";\n\nimport ApiCms from '../../../api/factory/cms.js';\n\nexport default {\n\tname: \"NewsComponent\",\n components: {\n Pagination,\n\tStudiengangInformation,\n },\n data() {\n return {\n content: null,\n maxPageCount: 0,\n page_size: 10,\n\t page:1,\n };\n },\n watch:{\n\t'$p.user_language.value':function(sprache){\n\t\tthis.fetchNews();\n\t}\n },\n computed:{\n\tsprache: function(){\n\t\treturn this.$p.user_language.value;\n\t},\n },\n methods: {\n\t\tfetchNews() {\n\t\t\treturn this.$api\n\t\t\t\t.call(ApiCms.getNews(this.page, this.page_size, this.sprache))\n\t\t\t\t.then(res => res.data)\n\t\t\t\t.then(result => {\n\t\t\t\t\tthis.content = result;\n\n\t\t\t\t\tdocument.querySelectorAll(\"#cms [data-confirm]\").forEach((el) => {\n\t\t\t\t\t\tel.addEventListener(\"click\", (evt) => {\n\t\t\t\t\t\t\tevt.preventDefault();\n\t\t\t\t\t\t\tBsConfirm.popup(el.dataset.confirm)\n\t\t\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\t\t\tAxios.get(el.href)\n\t\t\t\t\t\t\t\t\t\t.then((res) => {\n\t\t\t\t\t\t\t\t\t\t\t// TODO(chris): check for success then show message and/or reload\n\t\t\t\t\t\t\t\t\t\t\tlocation = location;\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t.catch((err) => console.error(\"ERROR:\", err));\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.catch(() => {\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t\tdocument.querySelectorAll(\"#cms [data-href]\").forEach((el) => {\n\t\t\t\t\t\tel.href = el.dataset.href.replace(\n\t\t\t\t\t\t\t/^ROOT\\//,\n\t\t\t\t\t\t\tFHC_JS_DATA_STORAGE_OBJECT.app_root\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t\tVue.nextTick(()=>{\n\t\t\t\t\t\tdocument.querySelectorAll(\".card-header\").forEach((el) => {\n\t\t\t\t\t\t\tel.classList.add(\"fhc-primary\");\n\t\t\t\t\t\t});\n\t\t\t\t\t\tdocument.querySelectorAll(\".row\").forEach((el) => {\n\t\t\t\t\t\t\tel.classList.add(\"w-100\");\n\t\t\t\t\t\t\tel.classList.add(\"align-items-center\");\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t});\n\t\t\t\t\t\tdocument.querySelectorAll(\".row h2\").forEach((el) => {\n\t\t\t\t\t\t\tel.classList.add(\"mb-0\");\n\t\t\t\t\t\t});\n\n\t\t\t\t\t})\n\t\t\t\t});\n\t\t},\n\t\tloadNewPageContent(data) {\n\t\t\tthis.$api\n\t\t\t\t.call(ApiCms.getNews(data.page, data.rows))\n\t\t\t\t.then(res => res.data)\n\t\t\t\t.then(result => {\n\t\t\t\t\tthis.content = result;\n\t\t\t\t\t\n\t\t\t\t});\n\t\t}\n },\n created() {\n this.fetchNews();\n\n\t\tthis.$api\n\t\t\t.call(ApiCms.getNewsRowCount())\n\t\t\t.then(res => res.data)\n\t\t\t.then(result => {\n\t\t\t\tthis.maxPageCount = result;\n\t\t\t});\n },\n template: /*html*/ `\n \t

    News

    \n\t
    \n\t\n\t\n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n\t\n\t\n `,\n};\n","\nexport default {\n\tname: \"RaumComponent\",\n\tdata() {\n\t\treturn {\n\t\t\timgContent: null\n\t\t}\n\t},\n props:{\n content:{\n type:String,\n required:true,\n },\n\t content_id:{\n\t\ttype: [Number, String],\n\t }\n },\n\tmethods: {\n\t\tsanitizeLegacyTables(table) {\n\n\t\t\t// find nested tables and replace with p element\n\t\t\tconst tt = table.querySelectorAll('table')\n\t\t\ttt.forEach(t => {\n\t\t\t\tconst textContent = t.textContent.trim();\n\t\t\t\tconst pElement = document.createElement('p');\n\t\t\t\tpElement.textContent = textContent;\n\t\t\t\tt.parentNode.replaceChild(pElement, t);\n\t\t\t})\n\n\t\t\t// find unordered lists, traverse li childs and replace with p element -> more readable than 1 p tag for ul\n\t\t\tconst ul = table.querySelectorAll('ul')\n\t\t\tul.forEach(u => {\n\t\t\t\tArray.from(u.children).forEach(li => {\n\t\t\t\t\tconst p = document.createElement('p');\n\t\t\t\t\tp.textContent = li.textContent\n\t\t\t\t\tu.parentNode.appendChild(p)\n\t\t\t\t})\n\t\t\t\tu.parentNode.removeChild(u)\n\n\t\t\t})\n\n\t\t\t// find bare text nodes and put into p element\n\t\t\tconst td = Array.from(table.querySelectorAll('td')).filter(el => el.scrollWidth > 100)\n\t\t\ttd.forEach(element => {\n\t\t\t\tif (element.firstChild?.nodeType === Node.TEXT_NODE && element.firstChild.length > 10) {\n\t\t\t\t\tconst p = document.createElement('p');\n\t\t\t\t\tp.appendChild(element.firstChild)\n\t\t\t\t\telement.appendChild(p);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// flatten nested th elements\n\t\t\tconst ths = Array.from(table.querySelectorAll('th'))\n\t\t\tths.forEach(th => {\n\n\t\t\t\tif(th.children.length > 1) {\n\t\t\t\t\tth.innerHTML = Array.from(th.childNodes).find(cn => cn.textContent).textContent\n\t\t\t\t}\n\t\t\t})\n\n\t\t\t// let p elements wrap on overflow\n\t\t\tconst p = table.querySelectorAll('p')\n\t\t\tp.forEach(p => {\n\t\t\t\tp.style.setProperty('word-wrap', 'break-word');\n\t\t\t\tp.style.setProperty('white-space', 'normal');\n\t\t\t\tp.style.setProperty('max-width', '400px');\n\t\t\t})\n\t\t}\n\t},\n mounted(){\n\t\t// replaces the tablesorter with the tabulator\n\t\tlet tables = document.getElementsByClassName(\"tablesorter\");\n\t\t\n\t\tfor (let table of tables) {\n\t\t\tthis.sanitizeLegacyTables(table)\n\t\t\tnew Tabulator(table, {\n\t\t\t\tlayout: \"fitDataStretch\",\n\n\t\t\t\tcolumnDefaults: {\n\t\t\t\t\tformatter: \"html\",\n\t\t\t\t\tresizable: false,\n\t\t\t\t\tminWidth: \"100px\",\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t\t\n\t\tlet title = document.getElementsByTagName(\"h1\");\n\t\ttitle = title.length ? title[0] : null;\n\t\t// tries to wrap the Raum titel with a link tag that redirects to the Reservierungen of that Raum\n\t\tif (title && title.innerText) \n\t\t{\n\t\t\tlet room_name = title.innerText;\n\t\t\tlet room_name_reg_exp = new RegExp(\"\\\\w*\\\\s([a-zA-Z][0-9\\\\.]+)$\");\n\t\t\tlet room_name_reg_exp_result = room_name.match(room_name_reg_exp);\n\t\t\tif(room_name_reg_exp_result)\n\t\t\t{\n\t\t\t\troom_name = room_name_reg_exp_result[0];\n\t\t\t\troom_name = room_name.replace(\" \",\"_\");\n\t\t\t\tlet link_element = document.createElement(\"a\");\n\t\t\t\tlink_element.href = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + \"/CisVue/Cms/getRoomInformation/\" + room_name;\n\t\t\t\tlink_element.appendChild(title.cloneNode(true));\n\t\t\t\ttitle.replaceWith(link_element);\n\n\t\t\t\tlet lvplanlinks = document.querySelectorAll('.menubox a[href*=\"stpl_week.php\"]');\n\t\t\t\tfor(let lvplanlink of lvplanlinks) {\n\t\t\t\t\tlvplanlink.href = link_element.href;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tconsole.error(`the regular expression did not match the room name: ${room_name}`);\n\t\t\t}\n\t\t\t\n\t\t\treturn\n\t\t}\n\t\t\n\t\tconst parser = new DOMParser()\n\t\tconst doc = parser.parseFromString(`
    ${this.content}
    `, \"text/html\");\n\n\t\tconst img = doc.querySelector(\"img\")\n\t\tif(img && img.title)\n\t\t{\n\t\t\tconst imgAttributes = {}\n\t\t\tfor (let attr of img.attributes) {\n\t\t\t\timgAttributes[attr.name] = attr.value\n\t\t\t}\n\n\t\t\tthis.imgContent = imgAttributes\n\t\t}\n\t\t\n\t\tconsole.error(`was not able to get the title of the raum_contentmittitel`);\n\t\t\n },\n template: /*html*/ `\n \n\n
    \n
    \n

    Content was not found

    \n `,\n };\n ","// collection of relative and absolute regex to replace legacy links\nconst GROUP_REPLACEMENT_STRATEGIES = {\n\tQUERY_PARAMETERS:'QUERY_PARAMETERS',\n\tPATH_SEGMENTS:'PATH_SEGMENTS',\n}\n\nconst regexList = {\n\trelative:[\n\t\t{ \n\t\t\tpriority: 1, \n\t\t\tregex: new RegExp(/^\\.\\.\\/cms\\/content\\.php\\?content_id=([0-9]+)/),\n\t\t\treplacement: FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/CisVue/Cms/content',\n\t\t\tgroup_replacement_strategy:GROUP_REPLACEMENT_STRATEGIES.PATH_SEGMENTS,\n\t\t},\n\t\t{ \n\t\t\tpriority: 2,\n\t\t\tregex: new RegExp(/^\\.\\.\\/cms\\/news\\.php/),\n\t\t\treplacement: FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/CisVue/Cms/news',\n\t\t},\n\t\t{ \n\t\t\tpriority: 3,\n\t\t\tregex: new RegExp(/^\\.\\.\\/index\\.ci\\.php/),\n\t\t\treplacement: FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router,\n\t\t},\n\t\t{ \n\t\t\tpriority: 10, \n\t\t\tregex: new RegExp(/^\\.\\.\\//),\n\t\t\treplacement: FHC_JS_DATA_STORAGE_OBJECT.app_root,\n\t\t},\n\t],\n\tabsolute:[\n\t\t{}\n\t]\n};\n\n// sorts the relative regex array by priority ascending\nconst relative_regex = regexList.relative\n\t.sort((a, b) => {\n\t\treturn a.priority - b.priority;\n\t})\n\t.map(regex => {\n\t\treturn {\n\t\t\tregex: regex.regex, \n\t\t\treplacement: regex.replacement,\n\t\t\tgroup_replacement_strategy: regex.group_replacement_strategy,\n\t\t}\n\t});\n\n// sorts the absolute regex array by priority ascending\nconst absolute_regex = regexList.absolute\n\t.sort((a, b) => {\n\t\treturn a.priority - b.priority;\n\t})\n\t.map(regex => {\n\t\treturn {\n\t\t\tregex: regex.regex,\n\t\t\treplacement: regex.replacement,\n\t\t\tgroup_replacement_strategy: regex.group_replacement_strategy,\n\t\t}\n\t})\n\n\nexport function replaceRelativeLegacyLink(relativeLegacyLink){\n\tfor (let {regex,replacement,group_replacement_strategy} of relative_regex){\t\n\t\t// if any of the regex matches the relativeLegacyLink, replace the matched part with the new app_root path\n\t\tlet match = relativeLegacyLink.match(regex);\n\t\tif (match) {\n\t\t\tlet new_link = relativeLegacyLink.replace(regex, replacement);\n\t\t\t\n\t\t\t\tswitch (group_replacement_strategy){\n\t\t\t\t\tcase 'QUERY_PARAMETERS':\n\t\t\t\t\t\t//TODO: this doesn't really work yet because the query parameter are key/value pairs\n\t\t\t\t\t\tnew_link = new_link.concat(`?${match[1]}`);\n\t\t\t\t\t\tfor (let query_parameter of match.slice(2)) {\n\t\t\t\t\t\t\tnew_link = new_link.concat(`&${query_parameter}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'PATH_SEGMENTS':\n\t\t\t\t\t\tfor (let query_parameter of match.slice(1)) { \n\t\t\t\t\t\t\tnew_link = new_link.concat(`/${query_parameter}`);\n\t\t\t\t\t\t} \n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\n\t\t\treturn new_link; \n\t\t}\n\t}\n\t// if none of the regex matched with the string return the original path\n\treturn relativeLegacyLink;\n}\n\n","import { replaceRelativeLegacyLink } from \"../../../../helpers/LegacyLinkReplaceHelper.js\"\nexport default {\n\tname: \"GeneralComponent\",\n props:{\n content:{\n type:String,\n required:true,\n },\n },\n\tmethods: {\n\t\tsanitizeLegacyTables(table) {\n\t\t\t\n\t\t\t// find nested tables and replace with p element\n\t\t\tconst tt = table.querySelectorAll('table')\n\t\t\ttt.forEach(t => {\n\t\t\t\tconst textContent = t.textContent.trim();\n\t\t\t\tconst pElement = document.createElement('p');\n\t\t\t\tpElement.textContent = textContent;\n\t\t\t\tt.parentNode.replaceChild(pElement, t);\n\t\t\t})\n\n\t\t\t// find unordered lists, traverse li childs and replace with p element -> more readable than 1 p tag for ul\n\t\t\tconst ul = table.querySelectorAll('ul')\n\t\t\tul.forEach(u => {\n\t\t\t\tArray.from(u.children).forEach(li => {\n\t\t\t\t\tconst p = document.createElement('p');\n\t\t\t\t\tp.textContent = li.textContent\n\t\t\t\t\tu.parentNode.appendChild(p)\n\t\t\t\t})\n\t\t\t\tu.parentNode.removeChild(u)\n\t\t\t\t\n\t\t\t})\n\n\t\t\t// find bare text nodes and put into p element\n\t\t\tconst td = Array.from(table.querySelectorAll('td')).filter(el => el.scrollWidth > 100)\n\t\t\ttd.forEach(element => {\n\t\t\t\tif (element.firstChild?.nodeType === Node.TEXT_NODE && element.firstChild.length > 10) {\n\t\t\t\t\tconst p = document.createElement('p');\n\t\t\t\t\tp.appendChild(element.firstChild)\n\t\t\t\t\telement.appendChild(p);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// flatten nested th elements\n\t\t\tconst ths = Array.from(table.querySelectorAll('th'))\n\t\t\tths.forEach(th => {\n\n\t\t\t\tif(th.children.length > 1) {\n\t\t\t\t\tth.innerHTML = Array.from(th.childNodes).find(cn => cn.textContent).textContent\n\t\t\t\t}\n\t\t\t})\n\n\t\t\t// let p elements wrap on overflow\n\t\t\tconst p = table.querySelectorAll('p')\n\t\t\tp.forEach(p => {\n\t\t\t\tp.style.setProperty('word-wrap', 'break-word');\n\t\t\t\tp.style.setProperty('white-space', 'normal');\n\t\t\t\tp.style.setProperty('max-width', '400px');\n\t\t\t})\n\t\t},\n\t\tprepareContent() {\n\t\t\t// replaces the tablesorter with the tabulator\n\t\t\tlet tables = Array.from(document.getElementsByClassName(\"tablesorter\"));\n\n\t\t\ttables.forEach((table, index) => {\n\t\t\t\tthis.sanitizeLegacyTables(table)\n\n\t\t\t\tnew Tabulator(table, {\n\t\t\t\t\tindex: index,\n\t\t\t\t\tlayout: \"fitDataFill\",\n\n\t\t\t\t\tcolumnDefaults: {\n\t\t\t\t\t\tformatter: \"html\",\n\t\t\t\t\t\tresizable: true,\n\t\t\t\t\t\tminWidth: \"100px\"\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\n\t\t\tdocument.querySelectorAll(\"#cms [data-confirm]\").forEach((el) => {\n\t\t\t\tel.addEventListener(\"click\", (evt) => {\n\t\t\t\t\tevt.preventDefault();\n\t\t\t\t\tBsConfirm.popup(el.dataset.confirm)\n\t\t\t\t\t.then(() => {\n\t\t\t\t\t\tAxios.get(el.href)\n\t\t\t\t\t\t.then((res) => {\n\t\t\t\t\t\t\t// TODO(chris): check for success then show message and/or reload\n\t\t\t\t\t\t\tlocation = location;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch((err) => console.error(\"ERROR:\", err));\n\t\t\t\t\t})\n\t\t\t\t\t.catch(() => {});\n\t\t\t\t});\n\t\t\t});\n\t\t\tdocument.querySelectorAll(\"#cms [data-href]\").forEach((el) => {\n\t\t\t\tel.href = el.dataset.href.replace(\n\t\t\t\t\t/^ROOT\\//,\n\t\t\t\t\tFHC_JS_DATA_STORAGE_OBJECT.app_root\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tdocument.querySelectorAll(\"[href]\").forEach((element) => {\n\t\t\t\tlet orignal_href = element.getAttribute(\"href\");\n\t\t\t\tlet new_href = replaceRelativeLegacyLink(orignal_href);\n\t\t\t\telement.href = new_href;\n\t\t\t});\n\n\t\t\tdocument.querySelectorAll(\"[style*=background-color]\").forEach((element) => {\n\t\t\t\tif (element.style.backgroundColor == \"rgb(255, 255, 255)\"){\n\t\t\t\t\telement.style.backgroundColor = \"var(--fhc-background)\";\n\t\t\t\t}\n\t\t\t\tif(element.querySelector(\"*[style*=background-color]\")){\n\t\t\t\t\telement.style.backgroundColor = \"var(--fhc-tertiary)\";\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t},\n\tupdated() {\n\t\tthis.prepareContent();\n\t},\n\tmounted(){\n\t\tthis.prepareContent();\n\t},\n template: /*html*/ `\n \n
    \n \t
    \n
    \n

    Content was not found

    \n `,\n };\n ","import raum_contentmittitel from './Content_types/Raum_contentmittitel.js'\nimport general from './Content_types/General.js'\nimport BsConfirm from \"../../Bootstrap/Confirm.js\";\nimport news_content from './Content_types/News_content.js';\nimport iframe_content from './Content_types/Iframe_content.js';\n\nimport ApiCms from '../../../api/factory/cms.js';\n\nexport default {\n\tname: \"ContentComponent\",\n\tprops: {\n\t\tcontent_id: {\n\t\t\ttype: [Number, String],\n\t\t\trequired: true\n\t\t},\n\t\tversion: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: null,\n\t\t},\n\t\tsichtbar: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: null,\n\t\t}\n\t},\n\tcomponents: {\n\t\traum_contentmittitel,\n\t\tnews_content,\n\t\tgeneral,\n\t\tiframe_content\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tcontent_type: null,\n\t\t\tcontent: null,\n\t\t\tcontent_id_internal: this.content_id\n\t\t};\n\t},\n\tmethods: {\n\t\tfetchContent(){\n\t\t\tthis.$api\n\t\t\t\t.call(ApiCms.content(this.content_id_internal, this.version, this.sprache, this.sichtbar))\n\t\t\t\t.then(res => {\n\t\t\t\t\tthis.$nextTick(function() {\n\t\t\t\t\t\tthis.content = res.data.content;\n\t\t\t\t\t\tthis.content_type = res.data.type;\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t}\n\t},\n\twatch:{\n\t\tsprache: function(sprache){\n\t\t\tthis.fetchContent();\n\t\t},\n\t\t'$route.params.content_id'(newVal) {\n\t\t\tthis.content_id_internal = newVal\n\t\t\tthis.fetchContent();\n\t\t}\n\t},\n\tcomputed: {\n\t\tsprache(){\n\t\t\treturn this.$p.user_language.value;\n\t\t},\n\t\tcomputeContentType: function () {\n\t\t\tswitch (this.content_type) {\n\t\t\t\tcase \"raum_contentmittitel\":\n\t\t\t\t\treturn \"raum_contentmittitel\";\n\t\t\t\tcase \"news\":\n\t\t\t\t\treturn \"news_content\";\n\t\t\t\tcase \"iframe\":\n\t\t\t\t\treturn \"iframe_content\";\n\t\t\t\tdefault:\n\t\t\t\t\treturn \"general\";\n\t\t\t};\n\t\t},\n\t},\n\tcreated() {\n\t\tthis.fetchContent();\n\t},\n\ttemplate: /*html*/ `\n \n\t
    \n \t\n\t
    \n

    No content is available to display

    \n `,\n};\n","import { replaceRelativeLegacyLink } from \"../../../../helpers/LegacyLinkReplaceHelper.js\"\nexport default {\n\tname: \"NewsContentType\",\n\tprops:{\n\t content:{\n\t\t type:String,\n\t\t required:true,\n\t },\n\t},\n\tmethods: {\n\t\tsanitizeLegacyTables(table) {\n\t\t\t\n\t\t\t// find nested tables and replace with p element\n\t\t\tconst tt = table.querySelectorAll('table')\n\t\t\ttt.forEach(t => {\n\t\t\t\tconst textContent = t.textContent.trim();\n\t\t\t\tconst pElement = document.createElement('p');\n\t\t\t\tpElement.textContent = textContent;\n\t\t\t\tt.parentNode.replaceChild(pElement, t);\n\t\t\t})\n\n\t\t\t// find unordered lists, traverse li childs and replace with p element -> more readable than 1 p tag for ul\n\t\t\tconst ul = table.querySelectorAll('ul')\n\t\t\tul.forEach(u => {\n\t\t\t\tArray.from(u.children).forEach(li => {\n\t\t\t\t\tconst p = document.createElement('p');\n\t\t\t\t\tp.textContent = li.textContent\n\t\t\t\t\tu.parentNode.appendChild(p)\n\t\t\t\t})\n\t\t\t\tu.parentNode.removeChild(u)\n\t\t\t\t\n\t\t\t})\n\n\t\t\t// find bare text nodes and put into p element\n\t\t\tconst td = Array.from(table.querySelectorAll('td')).filter(el => el.scrollWidth > 100)\n\t\t\ttd.forEach(element => {\n\t\t\t\tif (element.firstChild?.nodeType === Node.TEXT_NODE && element.firstChild.length > 10) {\n\t\t\t\t\tconst p = document.createElement('p');\n\t\t\t\t\tp.appendChild(element.firstChild)\n\t\t\t\t\telement.appendChild(p);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// flatten nested th elements\n\t\t\tconst ths = Array.from(table.querySelectorAll('th'))\n\t\t\tths.forEach(th => {\n\n\t\t\t\tif(th.children.length > 1) {\n\t\t\t\t\tth.innerHTML = Array.from(th.childNodes).find(cn => cn.textContent).textContent\n\t\t\t\t}\n\t\t\t})\n\n\t\t\t// let p elements wrap on overflow\n\t\t\tconst p = table.querySelectorAll('p')\n\t\t\tp.forEach(p => {\n\t\t\t\tp.style.setProperty('word-wrap', 'break-word');\n\t\t\t\tp.style.setProperty('white-space', 'normal');\n\t\t\t\tp.style.setProperty('max-width', '400px');\n\t\t\t})\n\t\t}\n\t},\n\tmounted(){\n\t\t// replaces the tablesorter with the tabulator\n\t\tlet tables = Array.from(document.getElementsByClassName(\"tablesorter\"));\n\n\t\ttables.forEach((table, index) => {\n\t\t\tthis.sanitizeLegacyTables(table)\n\t\t\t\n\t\t\tnew Tabulator(table, {\n\t\t\t\tindex: index,\n\t\t\t\tlayout: \"fitDataFill\",\n\n\t\t\t\tcolumnDefaults: {\n\t\t\t\t\tformatter: \"html\",\n\t\t\t\t\tresizable: true,\n\t\t\t\t\tminWidth: \"100px\"\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\n\t\tdocument.querySelectorAll(\"#cms [data-confirm]\").forEach((el) => {\n\t\t\tel.addEventListener(\"click\", (evt) => {\n\t\t\t evt.preventDefault();\n\t\t\t BsConfirm.popup(el.dataset.confirm)\n\t\t\t\t.then(() => {\n\t\t\t\t Axios.get(el.href)\n\t\t\t\t\t.then((res) => {\n\t\t\t\t\t\t// TODO(chris): check for success then show message and/or reload\n\t\t\t\t\t\tlocation = location;\n\t\t\t\t\t})\n\t\t\t\t\t.catch((err) => console.error(\"ERROR:\", err));\n\t\t\t\t})\n\t\t\t\t.catch(() => {});\n\t\t\t});\n\t\t });\n\t\tdocument.querySelectorAll(\"#cms [data-href]\").forEach((el) => {\n\t\t\tel.href = el.dataset.href.replace(\n\t\t\t\t/^ROOT\\//,\n\t\t\t\tFHC_JS_DATA_STORAGE_OBJECT.app_root\n\t\t\t);\n\t\t});\n\t\t\t\n\t\tdocument.querySelectorAll(\"[href]\").forEach((element) => {\n\t\t\tlet orignal_href = element.getAttribute(\"href\");\n\t\t\tlet new_href = replaceRelativeLegacyLink(orignal_href);\n\t\t\telement.href = new_href;\n\t\t});\n\n\t\tdocument.querySelectorAll(\"[style*=background-color]\").forEach((element) => {\n\t\t\tif (element.style.backgroundColor == \"rgb(255, 255, 255)\"){\n\t\t\t\telement.style.backgroundColor = \"var(--fhc-background)\";\n\t\t\t}\n\t\t\tif(element.querySelector(\"*[style*=background-color]\")){\n\t\t\t\telement.style.backgroundColor = \"var(--fhc-tertiary)\";\n\t\t\t}\n\t\t});\n\n\t\tVue.nextTick(() => {\n\t\t\tdocument.querySelectorAll(\".card-header\").forEach((el) => {\n\t\t\t\tel.classList.add(\"fhc-primary\");\n\t\t\t});\n\t\t\tdocument.querySelectorAll(\".row\").forEach((el) => {\n\t\t\t\tel.classList.add(\"w-100\");\n\t\t\t\tel.classList.add(\"align-items-center\");\n\n\t\t\t});\n\t\t\tdocument.querySelectorAll(\".row h2\").forEach((el) => {\n\t\t\t\tel.classList.add(\"mb-0\");\n\t\t\t});\n\n\t\t})\n\n\t},\n\ttemplate: /*html*/ `\n\t \n\t
    \n\t\t
    \n\t
    \n\t

    Content was not found

    \n\t `,\n };\n ","import { replaceRelativeLegacyLink } from \"../../../../helpers/LegacyLinkReplaceHelper.js\";\n\nexport default {\n\tname: \"iframe_content\",\n\tprops: {\n\t\tcontent: { type: String, required: true }\n\t},\n\tcomputed: {\n\t\tsrcUrl() {\n\t\t\tconst parser = new DOMParser()\n\t\t\tconst doc = parser.parseFromString(`
    ${this.content}
    `, \"text/html\");\n\t\t\tconst iframe = doc.querySelector(\"iframe[src]\");\n\n\t\t\tif (!iframe)\n\t\t\t\treturn \"\";\n\n\t\t\tlet url = iframe.getAttribute(\"src\") || \"\";\n\t\t\treturn replaceRelativeLegacyLink(url);\n\t\t}\n\t},\n\ttemplate: `\n\t\t
    \n\t\t\t\n\t\t
    Keine URL gefunden.
    \n\t\t
    \n\t`\n};\n","import FhcCalendar from \"../../Calendar/LvPlan.js\";\n\nimport ApiLvPlan from '../../../api/factory/lvPlan.js';\n\nexport const DEFAULT_MODE_RAUMINFO = 'Week'\n\nexport default {\n\tname: \"RoomInformation\",\n\tcomponents: {\n\t\tFhcCalendar\n\t},\n\tprops:{\n\t\tviewData: Object, // NOTE(chris): this is inherited from router-view\n\t\tpropsViewData: Object\n\t},\n\tcomputed: {\n\t\tcurrentDay() {\n\t\t\treturn this.propsViewData?.focus_date || luxon.DateTime.now().setZone(this.viewData.timezone).toISODate();\n\t\t},\n\t\tcurrentMode() {\n\t\t\treturn this.propsViewData?.mode || DEFAULT_MODE_RAUMINFO;\n\t\t}\n\t},\n\tmethods:{\n\t\thandleChangeDate(day, newMode) {\n\t\t\treturn this.handleChangeMode(newMode, day);\n\t\t},\n\t\thandleChangeMode(newMode, day) {\n\t\t\tconst mode = newMode[0].toUpperCase() + newMode.slice(1)\n\t\t\tconst focus_date = day.toISODate();\n\n\t\t\tthis.$router.push({\n\t\t\t\tname: \"RoomInformation\",\n\t\t\t\tparams: {\n\t\t\t\t\tmode,\n\t\t\t\t\tfocus_date,\n\t\t\t\t\tort_kurzbz: this.propsViewData.ort_kurzbz\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tgetPromiseFunc(start, end) {\n\t\t\treturn [\n\t\t\t\tthis.$api.call(ApiLvPlan.getRoomInfo(this.propsViewData.ort_kurzbz, start.toISODate(), end.toISODate())),\n\t\t\t\tthis.$api.call(ApiLvPlan.getOrtReservierungen(this.propsViewData.ort_kurzbz, start.toISODate(), end.toISODate()))\n\t\t\t];\n\t\t}\n\t},\n\ttemplate: /*html*/`\n\t
    \n\t\t

    {{ $p.t('rauminfo/rauminfo') }} {{ propsViewData.ort_kurzbz }}

    \n\t\t
    \n\t\t\n\t
    `\n};\n","export default {\n\tgetConfig() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Abgabe/getConfig'\n\t\t};\n\t},\n\tgetConfigStudent() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Abgabe/getConfigStudent'\n\t\t};\n\t},\n\tgetStudentProjektarbeiten(uid) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Abgabe/getStudentProjektarbeiten',\n\t\t\tparams: { uid }\n\t\t};\n\t},\n\tgetStudentProjektabgaben(detail) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Abgabe/getStudentProjektabgaben',\n\t\t\tparams: { projektarbeit_id: detail.projektarbeit_id, student_uid: detail.student_uid }\n\t\t};\n\t},\n\tpostStudentProjektarbeitEndupload(formData) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/Abgabe/postStudentProjektarbeitEndupload',\n\t\t\tparams: formData,\n\t\t\tconfig: {Headers: { \"Content-Type\": \"multipart/form-data\" }}\n\t\t};\n\t},\n\tpostStudentProjektarbeitZwischenabgabe(formData) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/Abgabe/postStudentProjektarbeitZwischenabgabe',\n\t\t\tparams: formData,\n\t\t\tconfig: {Headers: { \"Content-Type\": \"multipart/form-data\" }}\n\t\t};\n\t},\n\tgetMitarbeiterProjektarbeiten(all) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Abgabe/getMitarbeiterProjektarbeiten',\n\t\t\tparams: { showall: all }\n\t\t};\n\t},\n\tpostProjektarbeitAbgabe(termin) {\n\t\t\n\t\tlet dateString = termin.datum\n\t\tif(termin.datum instanceof Date) {\n\t\t\tconst year = termin.datum.getFullYear();\n\t\t\tconst month = String(termin.datum.getMonth() + 1).padStart(2, '0');\n\t\t\tconst day = String(termin.datum.getDate()).padStart(2, '0');\n\n\t\t\tdateString = `${year}-${month}-${day}`\n\t\t}\n\t\t\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/Abgabe/postProjektarbeitAbgabe',\n\t\t\tparams: { \n\t\t\t\tpaabgabe_id: termin.paabgabe_id,\n\t\t\t\tpaabgabetyp_kurzbz: termin.bezeichnung.paabgabetyp_kurzbz,\n\t\t\t\tdatum: dateString,\n\t\t\t\tnote: termin.note_pk,\n\t\t\t\tupload_allowed: !!termin.upload_allowed,\n\t\t\t\tbeurteilungsnotiz: termin.beurteilungsnotiz ?? '',\n\t\t\t\tfixtermin: termin.fixtermin,\n\t\t\t\tinsertvon: termin.insertvon,\n\t\t\t\tkurzbz: termin.kurzbz,\n\t\t\t\tprojektarbeit_id: termin.projektarbeit_id,\n\t\t\t\tbetreuer_person_id: termin.betreuer_person_id\n\t\t\t}\n\t\t};\n\t},\n\tdeleteProjektarbeitAbgabe(paabgabe_id) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/Abgabe/deleteProjektarbeitAbgabe',\n\t\t\tparams: { paabgabe_id }\n\t\t};\n\t},\n\tpostSerientermin(datum, paabgabetyp_kurzbz, bezeichnung, kurzbz, upload_allowed, projektarbeit_ids, fixtermin) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/Abgabe/postSerientermin',\n\t\t\tparams: { datum, paabgabetyp_kurzbz, bezeichnung, kurzbz, upload_allowed, projektarbeit_ids, fixtermin }\n\t\t};\n\t},\n\tfetchDeadlines(person_id) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/Abgabe/fetchDeadlines',\n\t\t\tparams: { person_id }\n\t\t};\n\t},\n\tgetPaAbgabetypen() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Abgabe/getPaAbgabetypen'\n\t\t};\n\t},\n\t//TODO: SWITCH TO NOTEN API ONCE NOTENTOOL IS IN MASTER TO AVOID DUPLICATE API\n\tgetNoten(){\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Abgabe/getNoten'\n\t\t};\n\t},\n\tgetProjektarbeitenForStudiengang(studiengang_kz, benotet = 0) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Abgabe/getProjektarbeitenForStudiengang',\n\t\t\tparams: { studiengang_kz, benotet }\n\t\t};\n\t},\n\t// TODO: this could also very well be generic info api\n\tgetStudiengaenge() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Abgabe/getStudiengaenge'\n\t\t};\n\t},\n\tpostStudentProjektarbeitZusatzdaten(formData) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/Abgabe/postStudentProjektarbeitZusatzdaten',\n\t\t\tparams: formData,\n\t\t\tconfig: {Headers: { \"Content-Type\": \"multipart/form-data\" }}\n\t\t};\n\t},\n\tgetSignaturStatusForProjektarbeitAbgaben(paabgabe_ids, student_uid) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/Abgabe/getSignaturStatusForProjektarbeitAbgaben',\n\t\t\tparams: {paabgabe_ids, student_uid},\n\n\t\t};\n\t}\n};","export const FhcOverlay = {\n\tname: 'FhcOverlay',\n\tprops: {\n\t\tactive: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t}\t\n\t},\n\ttemplate: `\t\n\t\t
    \n\t\t\t\n\t\t
    \n\t`\n};\nexport default FhcOverlay;","import Upload from '../../../components/Form/Upload/Dms.js';\nimport BsModal from '../../Bootstrap/Modal.js';\nimport VueDatePicker from '../../vueDatepicker.js.php';\nimport ApiAbgabe from '../../../api/factory/abgabe.js'\nimport FhcOverlay from \"../../Overlay/FhcOverlay.js\";\n\nexport const AbgabeStudentDetail = {\n\tname: \"AbgabeStudentDetail\",\n\tcomponents: {\n\t\tUpload,\n\t\tBsModal,\n\t\tInputNumber: primevue.inputnumber,\n\t\tCheckbox: primevue.checkbox,\n\t\tDropdown: primevue.dropdown,\n\t\tTextarea: primevue.textarea,\n\t\tAccordion: primevue.accordion,\n\t\tAccordionTab: primevue.accordiontab,\n\t\tMessage: primevue.message,\n\t\tInplace: primevue.inplace,\n\t\tVueDatePicker,\n\t\tFhcOverlay\n\t},\n\tinject: ['notenOptions', 'isMobile', 'isViewMode', 'moodle_link'],\n\tprops: {\n\t\tprojektarbeit: {\n\t\t\ttype: Object,\n\t\t\tdefault: null\n\t\t},\n\t\tviewMode: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tloading: false,\n\t\t\teidAkzeptiert: false,\n\t\t\tenduploadTermin: null,\n\t\t\tallActiveLanguages: FHC_JS_DATA_STORAGE_OBJECT.server_languages,\n\t\t\tform: Vue.reactive({\n\t\t\t\tsprache: '',\n\t\t\t\tabstract: '',\n\t\t\t\tabstract_en: '',\n\t\t\t\tschlagwoerter: '',\n\t\t\t\tschlagwoerter_en: '',\n\t\t\t\tkontrollschlagwoerter: '',\n\t\t\t\tseitenanzahl: 1,\n\t\t\t})\n\t\t}\n\t},\n\tmethods: {\n\t\tgetNoteBezeichnung(termin){\n\t\t\tconst noteOpt = this.notenOptions.find(opt => opt.note == termin.note)\n\t\t\t\n\t\t\tif(noteOpt?.bezeichnung) {\n\t\t\t\treturn noteOpt?.positiv ? this.$capitalize(this.$p.t('abgabetool/c4positivBenotet')) + ' ✅' : this.$capitalize(this.$p.t('abgabetool/c4negativBenotet')) + ' ❌'\n\t\t\t} else if(noteOpt?.benotbar === true && !termin.note) {\n\t\t\t\treturn this.$capitalize(this.$p.t('abgabetool/c4notYetGraded'));\n\t\t\t} else {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t},\n\t\tasync validate(termin, endupload = false) {\n\t\t\tif(!termin.file.length) {\n\t\t\t\tthis.$fhcAlert.alertWarning(this.$capitalize(this.$p.t('global/warningChooseFile')));\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t\n\t\t\tif(endupload) {\n\t\t\t\tif(await this.$fhcAlert.confirm({\n\t\t\t\t\tmessage: this.$p.t('abgabetool/confirmEnduploadSpeichern'),\n\t\t\t\t\tacceptLabel: this.$capitalize(this.$p.t('abgabetool/c4AcceptAndProceed')),\n\t\t\t\t\tacceptClass: 'p-button-primary',\n\t\t\t\t\trejectLabel: this.$capitalize(this.$p.t('abgabetool/c4Cancel')),\n\t\t\t\t\trejectClass: 'p-button-secondary'\n\t\t\t\t}) === false) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn true;\n\t\t},\n\t\tasync triggerEndupload() {\n\t\t\t\n\t\t\tif (!await this.validate(this.enduploadTermin, true))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t\n\t\t\t// post endabgabe\n\t\t\tconst formData = new FormData();\n\t\t\tformData.append('paabgabetyp_kurzbz', this.enduploadTermin.paabgabetyp_kurzbz)\n\t\t\tformData.append('projektarbeit_id', this.enduploadTermin.projektarbeit_id);\n\t\t\tformData.append('paabgabe_id', this.enduploadTermin.paabgabe_id)\n\t\t\tformData.append('student_uid', this.projektarbeit.student_uid)\n\t\t\tformData.append('bperson_id', this.projektarbeit.bperson_id)\n\t\t\t\n\t\t\tformData.append('sprache', this.form['sprache'].sprache)\n\t\t\tformData.append('abstract', this.form['abstract'])\n\t\t\tformData.append('abstract_en', this.form['abstract_en'])\n\t\t\tformData.append('schlagwoerter', this.form['schlagwoerter'])\n\t\t\tformData.append('schlagwoerter_en', this.form['schlagwoerter_en'])\n\t\t\tformData.append('seitenanzahl', this.form['seitenanzahl'])\n\t\t\t\n\t\t\tfor (let i = 0; i < this.enduploadTermin.file.length; i++) {\n\t\t\t\tformData.append('file', this.enduploadTermin.file[i]);\n\t\t\t}\n\t\t\tthis.loading = true\n\t\t\tthis.$api.call(ApiAbgabe.postStudentProjektarbeitEndupload(formData))\n\t\t\t\t.then(res => {\n\t\t\t\t\tthis.handleUploadRes(res, this.enduploadTermin)\n\t\t\t\t}).finally(()=> {\n\t\t\t\t\tthis.loading = false\n\t\t\t})\n\t\t\t\n\t\t\tthis.$refs.modalContainerEnduploadZusatzdaten.hide()\n\t\t},\n\t\tdownloadAbgabe(termin) {\n\t\t\tconst url = `/api/frontend/v1/Abgabe/getStudentProjektarbeitAbgabeFile?paabgabe_id=${termin.paabgabe_id}&student_uid=${this.projektarbeit.student_uid}&projektarbeit_id=${this.projektarbeit.projektarbeit_id}`;\n\n\t\t\twindow.open(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + url)\n\t\t\t// this.$api.call(ApiAbgabe.getStudentProjektarbeitAbgabeFile(termin.paabgabe_id, this.projektarbeit.student_uid))\n\t\t},\n\t\tformatDate(dateParam) {\n\t\t\tconst date = new Date(dateParam)\n\t\t\t// handle missing leading 0\n\t\t\tconst padZero = (num) => String(num).padStart(2, '0');\n\n\t\t\tconst month = padZero(date.getMonth() + 1); // Months are zero-based\n\t\t\tconst day = padZero(date.getDate());\n\t\t\tconst year = date.getFullYear();\n\n\t\t\treturn `${day}.${month}.${year}`\n\t\t},\n\t\tasync upload(termin) {\n\n\t\t\t// only do this on endupload\n\t\t\tif (! await this.validate(termin))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t\n\t\t\tif(termin.bezeichnung?.paabgabetyp_kurzbz === 'end') {\n\t\t\t\t// open endupload form modal for further inputs\n\t\t\t\tthis.enduploadTermin = termin\n\t\t\t\tthis.$refs.modalContainerEnduploadZusatzdaten.show()\n\t\t\t} else {\n\t\t\t\tconst formData = new FormData();\n\t\t\t\tformData.append('paabgabetyp_kurzbz', termin.paabgabetyp_kurzbz)\n\t\t\t\tformData.append('projektarbeit_id', this.projektarbeit.projektarbeit_id)\n\t\t\t\tformData.append('paabgabe_id', termin.paabgabe_id)\n\t\t\t\tformData.append('student_uid', this.projektarbeit.student_uid)\n\t\t\t\tformData.append('bperson_id', this.projektarbeit.bperson_id)\n\t\t\t\t\n\t\t\t\tfor (let i = 0; i < termin.file.length; i++) {\n\t\t\t\t\tformData.append('file', termin.file[i]);\n\t\t\t\t}\n\n\t\t\t\tthis.loading = true\n\t\t\t\tthis.$api.call(ApiAbgabe.postStudentProjektarbeitZwischenabgabe(formData))\n\t\t\t\t\t.then(res => {\n\t\t\t\t\t\tthis.handleUploadRes(res, termin)\n\t\t\t\t\t}).finally(()=> {\n\t\t\t\t\t\tthis.loading = false\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\t\thandleUploadRes(res, termin) {\n\t\t\tif(res.meta.status == \"success\") {\n\t\t\t\tthis.$fhcAlert.alertSuccess(this.$capitalize(this.$p.t('abgabetool/c4fileUploadSuccessv3')))\n\n\t\t\t\t// update 'abgabedatum' for successful upload -> shows the pdf icon and date once set\n\t\t\t\ttermin.abgabedatum = new Date().toISOString().split('T')[0];\n\t\t\t\tif(res?.data?.signatur !== undefined) {\n\t\t\t\t\ttermin.signatur = res.data.signatur\n\t\t\t\t}\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\tthis.$fhcAlert.alertError(this.$capitalize(this.$p.t('abgabetool/c4fileUploadErrorv3')))\n\t\t\t}\n\t\t\t\n\t\t\tif(res.meta.signaturInfo) {\n\t\t\t\tthis.$fhcAlert.alertInfo(res.meta.signaturInfo)\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t},\n\t\tgetOptionLabel(option) {\n\t\t\treturn option.sprache\n\t\t},\n\t\tgetTerminNoteBezeichnung(termin) {\n\t\t\tconst noteOpt = this.notenOptions.find(opt => opt.note == termin.note)\n\t\t\treturn noteOpt ? noteOpt.bezeichnung : ''\n\t\t},\n\t},\n\twatch: {\n\t\tprojektarbeit(newVal) {\n\t\t\t// default select german if projektarbeit sprache was null\n\t\t\tthis.form.sprache = newVal.sprache ? this.allActiveLanguages.find(lang => lang.sprache == newVal.sprache) : this.allActiveLanguages.find(lang => lang.sprache == 'German')\n\t\t\tthis.form.abstract = newVal.abstract ?? ''\n\t\t\tthis.form.abstract_en = newVal.abstract_en ?? ''\n\t\t\tthis.form.schlagwoerter = newVal.schlagwoerter ?? ''\n\t\t\tthis.form.schlagwoerter_en = newVal.schlagwoerter_en ?? ''\n\t\t\tthis.form.kontrollschlagwoerter = newVal.kontrollschlagwoerter ?? ''\n\t\t\tthis.form.seitenanzahl = newVal.seitenanzahl ?? 1\n\t\t\t\n\t\t}\n\t},\n\tcomputed: {\n\t\tgetMoodleLink() {\n\t\t\treturn this.moodle_link + this.projektarbeit.studiengang_kz\t\n\t\t},\n\t\tgetMessagePtStyle() {\n\t\t\t// adjust outer spacing and internal padding to appear similar to doenload button in size\n\t\t\treturn {\n\t\t\t\troot: {\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tmargin: '0px'\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\twrapper: {\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tpadding: '6px'\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tgetEid() {\n\t\t\treturn this.$capitalize(this.$p.t('abgabetool/c4eidesstattlicheErklaerung'))\n\t\t},\n\t\tallowedToSaveZusatzdaten() {\n\t\t\treturn this.form.schlagwoerter.length > 0 && this.form.schlagwoerter_en.length > 0 && this.form.abstract.length > 0 && this.form.abstract_en.length > 0 && this.form.seitenanzahl > 0\n\t\t},\n\t\tgetAllowedToSendEndupload() {\n\t\t\treturn this.eidAkzeptiert && this.allowedToSaveZusatzdaten\n\t\t},\n\t\tqualityGateTerminAvailable() {\n\t\t\tlet qgatefound = false\n\t\t\tthis.projektarbeit?.abgabetermine.forEach(abgabe => {\n\t\t\t\tif(abgabe.paabgabetyp_kurzbz == 'qualgate1'\n\t\t\t\t\t|| abgabe.paabgabetyp_kurzbz == 'qualgate2') {\n\t\t\t\t\tqgatefound = true\n\t\t\t\t}\n\t\t\t})\n\t\t\treturn qgatefound\n\t\t},\n\t\tgetTooltipVerspaetet() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4tooltipVerspaetet')),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipVerpasst() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4tooltipVerpasst')),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipAbzugeben() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4tooltipAbzugeben')),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipStandard() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4tooltipStandardv2')),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipAbgegeben() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4tooltipAbgegeben')),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipFixtermin() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4tooltipFixtermin')),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipAbgabeDetected() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4tooltipAbgabeDetected')),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipNotAllowedToUpload() {\n\t\t\tif(this.isViewMode) {\n\t\t\t\treturn {\n\t\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4studentAbgabeNotAllowedInViewMode')),\n\t\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn {\n\t\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4studentAbgabeNotAllowedRegular')),\n\t\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tgetTooltipBeurteilungerforderlich() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4tooltipBeurteilungerforderlich')),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipBestanden() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipBestanden'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipNichtBestanden() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipNichtBestanden'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t},\n\tcreated() {\n\t\t\n\t},\n\tmounted() {\n\n\t},\n\ttemplate: `\n\t\t\n\n\t\t
    \n\t\t\n\t\t\t
    {{$capitalize( $p.t('abgabetool/c4abgabeStudentenbereich') )}}
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t

    {{$capitalize( $p.t('person/student') ) }}: {{projektarbeit?.student}}

    \n\t\t\t\t\t

    {{$capitalize( $p.t('abgabetool/c4titel') ) }}: {{projektarbeit?.titel}}

    \n\t\t\t\t\t

    {{$capitalize( $p.t('abgabetool/c4betreuer') ) }}: {{projektarbeit ? $p.t('abgabetool/c4betrart' + projektarbeit.betreuerart_kurzbz) + ' ' + projektarbeit.betreuer : ''}}

    \n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t

    {{ $p.t('abgabetool/c4checkoutStgMoodleInfos') }} \n\t\t\t\t\t\tMoodle\n\t\t\t\t\t

    \n\t\t\t\t
    \n\t\t\t
    \n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t
    \n\t\t\t\t
    {{ $capitalize( $p.t('abgabetool/c4keineAbgabetermineGefunden') )}}
    \n\t\t\t
    \n\t\t\t\n\t\t
    \n\t \t\n\t \t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t \t\n `,\n};\n\nexport default AbgabeStudentDetail;\n","import AbgabeDetail from \"./AbgabeStudentDetail.js\";\nimport ApiAbgabe from '../../../api/factory/abgabe.js'\nimport BsModal from \"../../Bootstrap/Modal.js\";\nimport FhcOverlay from \"../../Overlay/FhcOverlay.js\";\n\nconst today = new Date()\nexport const AbgabetoolStudent = {\n\tname: \"AbgabetoolStudent\",\n\tcomponents: {\n\t\tAccordion: primevue.accordion,\n\t\tAccordionTab: primevue.accordiontab,\n\t\tBsModal,\n\t\tAbgabeDetail,\n\t\tFhcOverlay\n\t},\n\tprovide() {\n\t\treturn {\n\t\t\tnotenOptions: Vue.computed(() => this.notenOptions),\n\t\t\tisViewMode: Vue.computed(() => this.isViewMode),\n\t\t\tmoodle_link: Vue.computed(() => this.moodle_link)\n\t\t}\n\t},\n\tprops: {\n\t\tstudent_uid_prop: {\n\t\t\tdefault: null\n\t\t},\n\t\tviewData: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t\tdefault: () => ({uid: ''}),\n\t\t\tvalidator(value) {\n\t\t\t\treturn value && value.uid\n\t\t\t}\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tactiveTabIndex: [0],\n\t\t\tabgabeTypeOptions: null,\n\t\t\tphrasenPromise: null,\n\t\t\tphrasenResolved: false,\n\t\t\tloading: false,\n\t\t\tnotenOptions: null,\n\t\t\tdetail: null,\n\t\t\tprojektarbeiten: null,\n\t\t\tselectedProjektarbeit: null,\n\t\t\tmoodle_link: null\n\t\t};\n\t},\n\tmethods: {\n\t\tdateDiffInDays(datumParam) {\n\t\t\tlet datum = datumParam\n\t\t\tif(datumParam instanceof Date && !isNaN(datum.getTime()))\n\t\t\t{\n\t\t\t\tconst year = datumParam.getFullYear();\n\t\t\t\tconst month = datumParam.getMonth() + 1;\t// getMonth() is 0-indexed\n\t\t\t\tconst day = datumParam.getDate();\n\t\t\t\tconst pad = (num) => String(num).padStart(2, '0');\n\t\t\t\tdatum = `${year}-${pad(month)}-${pad(day)}`\n\t\t\t}\n\n\t\t\tconst dateToday = luxon.DateTime.now().startOf('day');\n\t\t\tconst dateDatum = luxon.DateTime.fromISO(datum).startOf('day');\n\t\t\tconst duration = dateDatum.diff(dateToday, 'days');\n\n\t\t\treturn duration.values.days;\n\t\t},\n\t\tgetDateStyleClass(termin) {\n\t\t\tconst datum = new Date(termin.datum)\n\t\t\tconst abgabedatum = new Date(termin.abgabedatum)\n\n\t\t\ttermin.diffindays = this.dateDiffInDays(termin.datum)\n\n\t\t\tconst isLate = termin.abgabedatum && abgabedatum > datum;\n\n\t\t\t// GRADE STATUS\n\t\t\tif (termin.note) {\n\t\t\t\tif(Number.isInteger(termin.note)) {\n\t\t\t\t\tconst opt = this.notenOptions.find(opt => opt.note == termin.note)\n\t\t\t\t\tif(opt.positiv) return 'bestanden'\n\t\t\t\t}\n\t\t\t\tif (termin.note.positiv) return 'bestanden';\n\t\t\t\treturn 'nichtbestanden';\n\t\t\t}\n\n\t\t\t// ACTION REQUIRED FOR GRADE\n\t\t\tif (termin.bezeichnung?.benotbar && datum < today) {\n\t\t\t\treturn 'beurteilungerforderlich';\n\t\t\t}\n\n\t\t\t// SUBMISSION STATUS\n\t\t\tif (termin.upload_allowed) {\n\t\t\t\tif (termin.abgabedatum) {\n\t\t\t\t\treturn isLate ? 'verspaetet' : 'abgegeben';\n\t\t\t\t}\n\n\t\t\t\t// no submission yet\n\t\t\t\tif (datum < today) return 'verpasst';\n\t\t\t\tif (termin.diffindays <= 12) return 'abzugeben';\n\t\t\t\treturn 'standard';\n\t\t\t}\n\n\t\t\t// GENERIC STATUS\n\t\t\treturn datum < today ? 'verpasst' : 'standard';\n\t\t},\n\t\tcheckQualityGatesStrict(termine) {\n\t\t\tlet qgate1Passed = false\n\t\t\tlet qgate2Passed = false\n\t\t\t\n\t\t\ttermine.forEach(t => {\n\t\t\t\tconst noteOption = this.notenOptions?.find(opt => opt.note == t.note)\n\t\t\t\tif(noteOption && noteOption.positiv) {\n\t\t\t\t\tif(t.paabgabetyp_kurzbz == 'qualgate1') {\n\t\t\t\t\t\tqgate1Passed = true\n\t\t\t\t\t} else if(t.paabgabetyp_kurzbz == 'qualgate2') {\n\t\t\t\t\t\tqgate2Passed = true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\n\t\t\treturn qgate1Passed && qgate2Passed\n\t\t},\n\t\tcheckQualityGatesOptional(termine) {\n\t\t\tconst qgate1found = termine.find(t => t.paabgabetyp_kurzbz == 'qualgate1')\n\t\t\tconst qgate2found = termine.find(t => t.paabgabetyp_kurzbz == 'qualgate2')\n\t\t\t\n\t\t\tlet qgate1positiv = true\n\t\t\tif(qgate1found) {\n\t\t\t\tqgate1positiv = false\n\n\t\t\t\ttermine.forEach(t => {\n\t\t\t\t\tconst noteOption = this.notenOptions?.find(opt => opt.note == t.note)\n\t\t\t\t\tif(noteOption && noteOption.positiv) {\n\t\t\t\t\t\tif (t.paabgabetyp_kurzbz == 'qualgate1') {\n\t\t\t\t\t\t\tqgate1positiv = true\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tlet qgate2positiv = true\n\t\t\tif(qgate2found) {\n\t\t\t\tqgate2positiv = false\n\n\t\t\t\ttermine.forEach(t => {\n\t\t\t\t\tconst noteOption = this.notenOptions?.find(opt => opt.note == t.note)\n\t\t\t\t\tif(noteOption && noteOption.positiv) {\n\t\t\t\t\t\tif (t.paabgabetyp_kurzbz == 'qualgate2') {\n\t\t\t\t\t\t\tqgate2positiv = true\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\n\t\t\treturn qgate1positiv && qgate2positiv\n\t\t},\n\t\tisPastDate(date) {\n\t\t\treturn new Date(date) < new Date(Date.now())\t\n\t\t},\n\t\tsetDetailComponent(details){\n\t\t\tthis.loading = true\n\t\t\tthis.loadAbgaben(details).then((res)=> {\n\t\t\t\tconst pa = this.projektarbeiten?.find(projekarbeit => projekarbeit.projektarbeit_id == details.projektarbeit_id)\n\t\t\t\tpa.abgabetermine = res.data[0].retval\n\t\t\t\t\n\t\t\t\tconst paIsBenotet = pa.note !== null\n\t\t\t\t\n\t\t\t\tpa.abgabetermine.forEach(termin => {\n\t\t\t\t\ttermin.file = []\n\t\t\t\t\ttermin.allowedToUpload = false\n\t\t\t\t\t\n\t\t\t\t\tif(termin.paabgabetyp_kurzbz == 'end') {\n\t\t\t\t\t\t// old assumed production logic when qgates are required\n\t\t\t\t\t\t// termin.allowedToUpload = !this.isPastDate(termin.datum) && this.checkQualityGatesStrict(pa.abgabetermine)\n\t\t\t\t\t\t\n\t\t\t\t\t\t// new larifari we want qgates but they are optional fhtw mode\n\t\t\t\t\t\ttermin.allowedToUpload = !this.isPastDate(termin.datum) && this.checkQualityGatesOptional(pa.abgabetermine)\n\n\n\t\t\t\t\t\t// development purposes\n\t\t\t\t\t\t// termin.allowedToUpload = this.checkQualityGatesStrict(pa.abgabetermine)\n\t\t\t\t\t\t// termin.allowedToUpload = true\n\n\t\t\t\t\t} else if(termin.fixtermin) {\n\t\t\t\t\t\ttermin.allowedToUpload = !this.isPastDate(termin.datum)\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// this could confuse people since we should dont show people this flag\n\t\t\t\t\t\ttermin.allowedToUpload = termin.upload_allowed \n\t\t\t\t\t}\n\n\t\t\t\t\t// blocks client upload button if projektarbeitet is already beurteilt und thus further abgaben on any termin should be blocked\n\t\t\t\t\tif(paIsBenotet) termin.allowedToUpload = false\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\ttermin.bezeichnung = this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz === termin.paabgabetyp_kurzbz)\n\t\t\t\t\ttermin.dateStyle = this.getDateStyleClass(termin)\n\t\t\t\t})\n\t\t\t\t\n\t\t\t\tpa.betreuer = this.buildBetreuer(pa)\n\t\t\t\tpa.student_uid = this.student_uid\n\t\t\t\t\n\t\t\t\tthis.selectedProjektarbeit = pa\n\n\t\t\t\tthis.$refs.modalContainerAbgabeDetail.show()\n\t\t\t\t\n\t\t\t}).finally(()=>{this.loading=false})\n\t\t},\n\t\tcenteredTextFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\n\t\t\treturn '
    ' +\n\t\t\t\t'

    '+val+'

    '\n\t\t},\n\t\tdetailFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\n\t\t\tif(val.mode === 'detailTermine') {\n\t\t\t\treturn '
    ' +\n\t\t\t\t\t'
    '\n\t\t\t} else if (val.mode === 'beurteilungDownload') {\n\t\t\t\treturn '
    ' +\n\t\t\t\t\t'
    '\n\t\t\t}\n\t\t},\n\t\tmailFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\t\t\t\treturn '
    ' +\n\t\t\t\t\t'
    '\n\t\t},\n\t\tbeurteilungFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\t\t\tif(val) {\n\t\t\t\treturn '
    ' +\n\t\t\t\t\t'
    '\n\t\t\t} else return '-'\n\t\t},\n\t\tbuildMailToLink(projekt) {\n\t\t\t// should always be \"projekt.mitarbeiter_uid +'@'+ this.domain\", built in backend\n\t\t\treturn 'mailto:' + projekt.email\n\t\t},\n\t\tbuildBetreuer(abgabe) {\n\t\t\treturn (abgabe.btitelpre ? abgabe.btitelpre + ' ' : '') + abgabe.bvorname + ' ' + abgabe.bnachname + (abgabe.btitelpost ? ' ' + abgabe.btitelpost : '')\n\t\t},\n\t\tasync setupData(data){\n\t\t\t// this.projektarbeiten = data[0]\n\t\t\tconst projektarbeiten = data[0] ?? null\n\t\t\tif(!projektarbeiten) return\n\t\t\tthis.projektarbeiten = projektarbeiten.map(projekt => {\n\t\t\t\tlet mode = 'detailTermine'\n\t\t\t\t\n\t\t\t\treturn {\n\t\t\t\t\t...projekt,\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\tstudent_uid: this.student_uid,\n\t\t\t\t\t\tprojektarbeit_id: projekt.projektarbeit_id,\n\t\t\t\t\t\tbetreuer_person_id: projekt.bperson_id,\n\t\t\t\t\t\tbetreuerart_kurzbz: projekt.betreuerart_kurzbz,\n\t\t\t\t\t\tmode\n\t\t\t\t\t},\n\t\t\t\t\tbeurteilung1: projekt.downloadLink1 ?? null,\n\t\t\t\t\tbeurteilung2: projekt.downloadLink2 ?? null,\n\t\t\t\t\tsem: projekt.studiensemester_kurzbz,\n\t\t\t\t\tstg: projekt.kurzbzlang,\n\t\t\t\t\tmail: this.buildMailToLink(projekt),\n\t\t\t\t\tbetreuer: this.buildBetreuer(projekt),\n\t\t\t\t\ttyp: projekt.projekttypbezeichnung,\n\t\t\t\t\ttitel: projekt.titel\n\t\t\t\t}\n\t\t\t})\n\n\t\t},\n\t\tloadProjektarbeiten() {\n\t\t\tthis.$api.call(ApiAbgabe.getStudentProjektarbeiten(this.student_uid))\n\t\t\t\t.then(res => {\n\t\t\t\t\tif(res?.data) this.setupData(res.data)\n\t\t\t\t})\n\t\t},\n\t\tloadAbgaben(details) {\n\t\t\treturn new Promise((resolve) => {\n\t\t\t\tthis.$api.call(ApiAbgabe.getStudentProjektabgaben(details))\n\t\t\t\t\t.then(res => {\n\t\t\t\t\t\tresolve(res)\n\t\t\t\t\t})\n\t\t\t})\t\n\t\t},\n\t\tasync setupMounted() {\n\t\t\tthis.loadProjektarbeiten()\n\t\t},\n\t\tgetAccTabHeaderForProjektarbeit(projektarbeit) {\n\t\t\tlet title = ''\n\t\t\t\n\t\t\ttitle += projektarbeit.titel ?? this.$p.t('abgabetool/keinTitel')\n\t\t\t\n\t\t\treturn title\n\t\t},\n\t\tgetMailLink(projektarbeit) {\n\t\t\tif(projektarbeit.email) {\n\t\t\t\treturn 'mailto:'+projektarbeit.email\n\t\t\t} else return ''\n\t\t},\n\t\tgetNoteBezeichnung(projektarbeit) {\n\t\t\tif(projektarbeit.note && this.notenOptions) {\n\t\t\t\tconst noteOpt = this.notenOptions.find(opt => opt.note == projektarbeit.note)\n\t\t\t\treturn noteOpt?.bezeichnung\n\t\t\t} else {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t},\n\t\thandleDownloadBeurteilung1(projektarbeit) {\n\t\t\twindow.open(projektarbeit.beurteilung1)\n\t\t},\n\t\thandleDownloadBeurteilung2(projektarbeit) {\n\t\t\twindow.open(projektarbeit.beurteilung2)\n\t\t}\n\t},\n\twatch: {\n\n\t},\n\tcomputed: {\n\t\tisViewMode() {\n\t\t\treturn this.student_uid !== this.viewData.uid\n\t\t},\n\t\tstudent_uid() {\n\t\t\treturn this.student_uid_prop || this.viewData?.uid || null\n\t\t}\n\t},\n\tasync created() {\n\t\tthis.phrasenPromise = this.$p.loadCategory(['abgabetool', 'global'])\n\t\tthis.phrasenPromise.then(()=> {this.phrasenResolved = true})\n\t\t\n\t\tthis.loading = true\n\t\t//TODO: SWITCH TO NOTEN API ONCE NOTENTOOL IS IN MASTER TO AVOID DUPLICATE API\n\t\tawait this.$api.call(ApiAbgabe.getNoten()).then(res => {\n\t\t\tif(res.meta.status == 'success') {\n\t\t\t\tthis.notenOptions = res.data[0]\n\n\t\t\t\tthis.allowedNotenOptions = this.notenOptions.filter(\n\t\t\t\t\topt => res.data[1].includes(opt.note)\n\t\t\t\t)\n\t\t\t}\n\t\t}).finally(() => {\n\t\t\tthis.loading = false\n\t\t})\n\n\t\t// fetch abgabetypen options\n\t\tthis.$api.call(ApiAbgabe.getPaAbgabetypen()).then(res => {\n\t\t\tthis.abgabeTypeOptions = res.data\n\t\t}).catch(e => {\n\t\t\tthis.loading = false\n\t\t})\n\n\t\t// fetch config to avoid hard coded links\n\t\tthis.$api.call(ApiAbgabe.getConfigStudent()).then(res => {\n\t\t\tthis.moodle_link = res.data?.moodle_link\n\t\t}).catch(e => {\n\t\t\tthis.loading = false\n\t\t})\n\t},\n\tmounted() {\n\t\tthis.setupMounted()\n\t},\n\ttemplate: `\n\n `,\n};\n\nexport default AbgabetoolStudent;\n","import BsModal from '../../Bootstrap/Modal.js';\nimport VueDatePicker from '../../vueDatepicker.js.php';\nimport ApiAbgabe from '../../../api/factory/abgabe.js'\n\nconst today = new Date()\nexport const AbgabeMitarbeiterDetail = {\n\tname: \"AbgabeMitarbeiterDetail\",\n\tcomponents: {\n\t\tBsModal,\n\t\tInputNumber: primevue.inputnumber,\n\t\tCheckbox: primevue.checkbox,\n\t\tDropdown: primevue.dropdown,\n\t\tTextarea: primevue.textarea,\n\t\tSpeedDial: primevue.speeddial,\n\t\tAccordion: primevue.accordion,\n\t\tAccordionTab: primevue.accordiontab,\n\t\tMessage: primevue.message,\n\t\tVueDatePicker\n\t},\n\tinject: [\n\t\t'abgabeTypeOptions',\n\t\t'abgabetypenBetreuer',\n\t\t'allowedNotenOptions',\n\t\t'notenOptionsNonFinal',\n\t\t'turnitin_link',\n\t\t'old_abgabe_beurteilung_link'\n\t],\n\tprops: {\n\t\tprojektarbeit: {\n\t\t\ttype: Object,\n\t\t\tdefault: null\n\t\t},\n\t\tisFullscreen: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t},\n\t\tassistenzMode: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tshowAutomagicModalPhrase: false,\n\t\t\teidAkzeptiert: false,\n\t\t\tenduploadTermin: null,\n\t\t\tallActiveLanguages: FHC_JS_DATA_STORAGE_OBJECT.server_languages,\n\t\t\tspeedDialItems: [{\n\t\t\t\tlabel: Vue.computed(() => this.$p.t('abgabetool/c4newAbgabetermin')),\n\t\t\t\ticon: \"fa fa-plus\",\n\t\t\t\tcommand: this.openCreateNewAbgabeModal,\n\t\t\t\tdisabled: Vue.computed(() => !this.getAllowedToCreateNewTermin)\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: Vue.computed(() => this.$p.t('abgabetool/c4benoten')),\n\t\t\t\ticon: \"fa fa-user-check\",\n\t\t\t\tcommand: this.openBenotung,\n\t\t\t\tdisabled: Vue.computed(()=> this.assistenzMode == true)\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: Vue.computed(() => this.$p.t('abgabetool/c4plagiatcheck_link')),\n\t\t\t\ticon: \"fa fa-clipboard-check\",\n\t\t\t\tcommand: this.openPlagiatcheck\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: Vue.computed(() => this.$p.t('abgabetool/c4student_perspective')),\n\t\t\t\ticon: \"fa fa-eye\",\n\t\t\t\tcommand: this.openStudentPage\n\t\t\t}],\n\t\t\tnewTermin: null,\n\t\t\tform: Vue.reactive({\n\t\t\t\tsprache: '',\n\t\t\t\tabstract: '',\n\t\t\t\tabstract_en: '',\n\t\t\t\tschlagwoerter: '',\n\t\t\t\tschlagwoerter_en: '',\n\t\t\t\tkontrollschlagwoerter: '',\n\t\t\t\tseitenanzahl: 1,\n\t\t\t})\n\t\t}\n\t},\n\tmethods: {\n\t\tgetNoteBezeichnung(termin){\n\t\t\tif(termin.note?.bezeichnung) {\n\t\t\t\treturn termin.note?.positiv ? this.$capitalize(this.$p.t('abgabetool/c4positivBenotet')) + ' ✅' : this.$capitalize(this.$p.t('abgabetool/c4negativBenotet')) + ' ❌'\n\t\t\t} else if(termin.bezeichnung?.benotbar === true && !termin.note) {\n\t\t\t\treturn this.$capitalize(this.$p.t('abgabetool/c4notYetGraded'));\n\t\t\t} else {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t},\n\t\tgetPlaceholderTermin(termin) {\n\t\t\treturn termin?.bezeichnung ? this.$p.t('abgabetool/c4paatyp' + termin.paabgabetyp_kurzbz) : this.$p.t('abgabetool/abgabetypPlaceholder')\n\t\t},\n\t\tsaveTermin(termin) {\n\t\t\tconst paabgabe_id = termin.paabgabe_id\n\t\t\ttermin.note_pk = termin.note?.note ?? null\n\t\t\ttermin.betreuer_person_id = this.projektarbeit.betreuer_person_id\n\t\t\t\n\t\t\t// phrasentext 'no late submission allowed' to 'late submission allowed' + boolean UI invert\n\t\t\ttermin.fixtermin = !termin.invertedFixtermin\n\t\t\treturn this.$api.call(ApiAbgabe.postProjektarbeitAbgabe(termin)).then( (res) => {\n\t\t\t\tif(res?.meta?.status == 'success') {\n\t\t\t\t\tthis.$fhcAlert.alertSuccess(this.$p.t('ui/gespeichert'))\n\t\t\t\t\t\n\t\t\t\t\tconst noteOpt = this.allowedNotenOptions.find(opt => opt.note == res.data[0].note)\n\t\t\t\t\tconst newTerminRes = {\n\t\t\t\t\t\t'allowedToSave': true,\n\t\t\t\t\t\t'allowedToDelete': true,\n\t\t\t\t\t\t...res.data[0]\n\t\t\t\t\t}\n\t\t\t\t\tif(newTerminRes.note) newTerminRes.note = noteOpt\n\t\t\t\t\tnewTerminRes.invertedFixtermin = !newTerminRes.fixtermin\n\t\t\t\t\tconst existingTerminRes = res.data[1]\n\t\t\t\t\t\n\t\t\t\t\tconst abgabeOpt = this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz == newTerminRes.paabgabetyp_kurzbz)\n\t\t\t\t\t\n\t\t\t\t\tnewTerminRes.bezeichnung = {\n\t\t\t\t\t\tbezeichnung: termin.bezeichnung?.bezeichnung,\n\t\t\t\t\t\tpaabgabetyp_kurzbz: termin.bezeichnung?.paabgabetyp_kurzbz,\n\t\t\t\t\t\tbenotbar: abgabeOpt.benotbar\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t// only insert new abgabe if we actually created a new one, not when saving/editing existing\n\t\t\t\t\tif(!existingTerminRes){\n\t\t\t\t\t\tthis.projektarbeit.abgabetermine.push(newTerminRes)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst noteOptExisting = this.allowedNotenOptions.find(opt => opt.note == existingTerminRes.note)\n\t\t\t\t\t\texistingTerminRes.note = noteOptExisting\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tthis.projektarbeit.abgabetermine.sort((a, b) =>new Date(a.datum) - new Date(b.datum))\n\t\t\t\t\t\n\t\t\t\t\tconst index = this.projektarbeit.abgabetermine.findIndex(t => termin.paabgabe_id == t.paabgabe_id)\n\t\t\t\t\t\n\t\t\t\t\t// negative abgabe -> automagically open new termin modal\n\t\t\t\t\t// really bad feature imo that will be annoying to deal with\n\t\t\t\t\t\n\t\t\t\t\t// termin is completely new and has negative note\n\t\t\t\t\tconst savedNewWithNegative = !existingTerminRes && !newTerminRes.note?.positiv && newTerminRes.note !== null\n\n\t\t\t\t\t// termin existed previously + oldTermin had different note/positive note or no note at all\n\t\t\t\t\tconst savedExistingNoteAsNegativeAndWasNotNegativeBefore = existingTerminRes && !newTerminRes.note?.positiv && newTerminRes.note !== null && (existingTerminRes.note?.positiv || existingTerminRes.note === undefined)\n\n\t\t\t\t\tconst openModalDueToNegativeBeurteilung = savedNewWithNegative || savedExistingNoteAsNegativeAndWasNotNegativeBefore\n\t\t\t\t\tif(openModalDueToNegativeBeurteilung) {\n\t\t\t\t\t\tthis.newTermin = {\n\t\t\t\t\t\t\t'paabgabe_id': -1,\n\t\t\t\t\t\t\t'projektarbeit_id': this.projektarbeit.projektarbeit_id,\n\t\t\t\t\t\t\t'fixtermin': false,\n\t\t\t\t\t\t\t'invertedFixtermin': true,\n\t\t\t\t\t\t\t'kurzbz': '', // todo kurzbz textfield value vorschlag für qualgates\n\t\t\t\t\t\t\t'datum': new Date().toISOString().split('T')[0],\n\t\t\t\t\t\t\t'note': this.allowedNotenOptions.find(opt => opt.note == 9),\n\t\t\t\t\t\t\t'beurteilungsnotiz': '',\n\t\t\t\t\t\t\t'upload_allowed': false,\n\t\t\t\t\t\t\t'paabgabetyp_kurzbz': '',\n\t\t\t\t\t\t\t'bezeichnung': this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz === newTerminRes.paabgabetyp_kurzbz),\n\t\t\t\t\t\t\t'abgabedatum': null,\n\t\t\t\t\t\t\t'insertvon': this.viewData?.uid ?? ''\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.showAutomagicModalPhrase = true\n\n\t\t\t\t\t\tthis.$refs.modalContainerCreateNewAbgabe.show()\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.showAutomagicModalPhrase = false\t\n\t\t\t\t\t}\n\t\t\t\t} else if(res?.meta?.status == 'error'){\n\t\t\t\t\tthis.$fhcAlert.alertError()\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\topenZusatzdatenModal() {\n\t\t\tthis.$refs.modalContainerZusatzdaten.show()\n\t\t},\n\t\tasync saveZusatzdaten(){\n\t\t\tif (!await this.validateZusatzdaten())\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t\n\t\t\tconst pa = this.projektarbeit\n\n\t\t\t// post endabgabe\n\t\t\tconst formData = new FormData();\n\t\t\tformData.append('projektarbeit_id', this.projektarbeit.projektarbeit_id);\n\n\t\t\tformData.append('sprache', this.form['sprache'].sprache)\n\t\t\tformData.append('abstract', this.form['abstract'])\n\t\t\tformData.append('abstract_en', this.form['abstract_en'])\n\t\t\tformData.append('schlagwoerter', this.form['schlagwoerter'])\n\t\t\tformData.append('schlagwoerter_en', this.form['schlagwoerter_en'])\n\t\t\tformData.append('seitenanzahl', this.form['seitenanzahl'])\n\t\t\t\n\t\t\tthis.loading = true\n\t\t\tthis.$api.call(ApiAbgabe.postStudentProjektarbeitZusatzdaten(formData))\n\t\t\t\t.then(res => {\n\t\t\t\t\tif(res.meta.status == 'success') {\n\t\t\t\t\t\tthis.$fhcAlert.alertSuccess(this.$p.t('ui/gespeichert'))\n\t\t\t\t\t\tif(!data?.retval?.[0]) return\n\t\t\t\t\t\tconst paRes = data.retval[0]\n\t\t\t\t\t\tpa.seitenanzahl = paRes.seitenanzahl ?? 1\n\t\t\t\t\t\tpa.kontrollschlagwoerter = paRes.kontrollschlagwoerter ?? ''\n\t\t\t\t\t\tpa.schlagwoerter = paRes.schlagwoerter ?? ''\n\t\t\t\t\t\tpa.sprache = paRes.sprache ?? ''\n\t\t\t\t\t\tpa.schlagwoerter_en = paRes.schlagwoerter_en ?? ''\n\t\t\t\t\t\tpa.abstract = paRes.abstract ?? ''\n\t\t\t\t\t\tpa.abstract_en = paRes.abstract_en ?? ''\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}).finally(()=> {\n\t\t\t\tthis.loading = false\n\t\t\t})\n\n\t\t\tthis.$refs.modalContainerZusatzdaten.hide()\n\t\t},\n\t\tasync validateZusatzdaten() {\n\t\t\t// just ask once\n\t\t\tif(await this.$fhcAlert.confirm({\n\t\t\t\tmessage: this.$p.t('abgabetool/confirmZusatzdatenSpeichern'),\n\t\t\t\tacceptLabel: this.$capitalize(this.$p.t('abgabetool/c4AcceptAndProceed')),\n\t\t\t\tacceptClass: 'p-button-primary',\n\t\t\t\trejectLabel: this.$capitalize(this.$p.t('abgabetool/c4Cancel')),\n\t\t\t\trejectClass: 'p-button-secondary'\n\t\t\t}) === false) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t\n\t\t\treturn true\n\t\t},\n\t\tasync handleDeleteTermin(termin){\n\t\t\tif(await this.$fhcAlert.confirm({\n\t\t\t\tmessage: this.$p.t('abgabetool/c4confirm_delete'),\n\t\t\t\tacceptLabel: 'Löschen',\n\t\t\t\tacceptClass: 'p-button-danger',\n\t\t\t\trejectLabel: 'Zurück',\n\t\t\t\trejectClass: 'p-button-secondary'\n\t\t\t}) === false) {\n\t\t\t\treturn false\n\t\t\t} else {\n\t\t\t\tthis.deleteTermin(termin)\n\t\t\t}\n\t\t},\n\t\tdeleteTermin(termin) {\n\t\t\tthis.$api.call(ApiAbgabe.deleteProjektarbeitAbgabe(termin.paabgabe_id)).then( (res) => {\n\t\t\t\tif(res?.meta?.status == 'success') {\n\t\t\t\t\tthis.$fhcAlert.alertSuccess(this.$p.t('ui/genericDeleted', [this.$p.t('abgabetool/abgabe')]))\n\t\t\t\t\t// this.$p.t('global/tooltipLektorDeleteKontrolle', [this.$entryParams.permissions.kontrolleDeleteMaxReach ])\n\t\t\t\t\tconst deletedTerminIndex = this.projektarbeit.abgabetermine.findIndex(t => t.paabgabe_id === termin.paabgabe_id)\n\t\t\t\t\tthis.projektarbeit.abgabetermine.splice(deletedTerminIndex, 1)\n\t\t\t\t} else if(res?.meta?.status == 'error'){\n\t\t\t\t\tthis.$fhcAlert.alertError()\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\tvalidate: function(termin) {\n\t\t\tif(!termin.file.length) {\n\t\t\t\tthis.$fhcAlert.alertWarning(this.$p.t('global/warningChooseFile'));\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\treturn true;\n\t\t},\n\t\tdownloadAbgabe(termin) {\n\t\t\tconst url = `/api/frontend/v1/Abgabe/getStudentProjektarbeitAbgabeFile?paabgabe_id=${termin.paabgabe_id}&student_uid=${this.projektarbeit.student_uid}&projektarbeit_id=${this.projektarbeit.projektarbeit_id}`;\n\n\t\t\twindow.open(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + url)\n\t\t\t// this.$api.call(ApiAbgabe.getStudentProjektarbeitAbgabeFile(termin.paabgabe_id, this.projektarbeit.student_uid))\n\t\t},\n\t\tconvertDateToIsoString(date) {\n\t\t\t// 1. Check if it is a Date object AND if the date value is valid (not 'Invalid Date')\n\t\t\tif (param instanceof Date && !isNaN(param.getTime())) {\n\t\t\t\tconst year = param.getFullYear();\n\t\t\t\t// getMonth() is 0-indexed, so we add 1.\n\t\t\t\tconst month = param.getMonth() + 1;\n\t\t\t\tconst day = param.getDate();\n\t\t\n\t\t\t\t// Helper to pad single-digit numbers with a leading zero\n\t\t\t\tconst pad = (num) => String(num).padStart(2, '0');\n\t\t\n\t\t\t\t// Return the formatted string: YYYY-MM-DD\n\t\t\t\treturn `${year}-${pad(month)}-${pad(day)}`;\n\t\t\t}\n\t\t\n\t\t\t// If it's not a valid Date, return the original parameter\n\t\t\treturn param;\n\t\t},\n\t\tdateDiffInDays(datumParam){\n\t\t\tlet datum = datumParam\n\t\t\tif(datumParam instanceof Date && !isNaN(datum.getTime()))\n\t\t\t{\n\t\t\t\tconst year = datumParam.getFullYear();\n\t\t\t\tconst month = datumParam.getMonth() + 1;\t// getMonth() is 0-indexed\n\t\t\t\tconst day = datumParam.getDate();\n\t\t\t\tconst pad = (num) => String(num).padStart(2, '0');\n\t\t\t\tdatum = `${year}-${pad(month)}-${pad(day)}`\t\n\t\t\t}\n\t\t\t\n\t\t\tconst dateToday = luxon.DateTime.now().startOf('day');\n\t\t\tconst dateDatum = luxon.DateTime.fromISO(datum).startOf('day');\n\t\t\tconst duration = dateDatum.diff(dateToday, 'days');\n\t\t\t\n\t\t\treturn duration.values.days;\n\t\t},\n\t\tgetDateStyleClass(termin) {\n\t\t\tconst datum = new Date(termin.datum)\n\t\t\tconst abgabedatum = new Date(termin.abgabedatum)\n\n\t\t\ttermin.diffindays = this.dateDiffInDays(termin.datum)\n\n\t\t\tconst isLate = termin.abgabedatum && abgabedatum > datum;\n\n\t\t\t// GRADE STATUS\n\t\t\tif (termin.note) {\n\t\t\t\tif (termin.note.positiv) return 'bestanden';\n\t\t\t\treturn 'nichtbestanden';\n\t\t\t}\n\n\t\t\t// ACTION REQUIRED FOR GRADE\n\t\t\tif (termin.bezeichnung?.benotbar && datum < today) {\n\t\t\t\treturn 'beurteilungerforderlich';\n\t\t\t}\n\n\t\t\t// SUBMISSION STATUS\n\t\t\tif (termin.upload_allowed) {\n\t\t\t\tif (termin.abgabedatum) {\n\t\t\t\t\treturn isLate ? 'verspaetet' : 'abgegeben';\n\t\t\t\t}\n\n\t\t\t\t// no submission yet\n\t\t\t\tif (datum < today) return 'verpasst';\n\t\t\t\tif (termin.diffindays <= 12) return 'abzugeben';\n\t\t\t\treturn 'standard';\n\t\t\t}\n\n\t\t\t// GENERIC STATUS\n\t\t\treturn datum < today ? 'verpasst' : 'standard';\n\t\t},\n\t\topenBeurteilungLink(link) {\n\t\t\twindow.open(link, '_blank')\n\t\t},\n\t\tgetOptionLabelSprache(option) {\n\t\t\treturn option.sprache\n\t\t},\n\t\tgetOptionLabelAbgabetyp(option) {\n\t\t\treturn this.$p.t('abgabetool/c4paatyp' + option.paabgabetyp_kurzbz)\n\t\t},\n\t\tgetOptionDisabled(option) {\n\t\t\treturn !option.aktiv\n\t\t},\n\t\tgetNotenOptionLabel(option) {\n\t\t\treturn option.bezeichnung\n\t\t},\n\t\topenStudentPage() {\n\t\t\tconst link = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router\n\t\t\t\t+ '/Cis/Abgabetool/Student/' + this.projektarbeit?.student_uid\n\t\t\twindow.open(link, '_blank')\n\t\t},\n\t\topenPlagiatcheck() {\n\t\t\tconst link = this.turnitin_link\n\t\t\twindow.open(link, '_blank')\n\t\t},\n\t\tasync openBenotung() {\n\t\t\t// old link check ?\n\t\t\t\n\t\t\tif(this.getSemesterBenotbar && this.projektarbeit?.abgabetermine.find(termin => termin.paabgabetyp_kurzbz == 'end' && termin.abgabedatum !== null) && this.projektarbeit?.beurteilungLinkNew) {\n\t\t\t\tconst link = this.projektarbeit?.beurteilungLinkNew\n\t\t\t\twindow.open(link, '_blank')\n\t\t\t} else if(this.projektarbeit?.abgabetermine.find(termin => termin.paabgabetyp_kurzbz == 'end' && termin.abgabedatum !== null) && this.projektarbeit?.beurteilungLinkOld) {\n\t\t\t\tif(await this.$fhcAlert.confirm({\n\t\t\t\t\tmessage: this.$p.t('abgabetool/c4aeltereParbeitBenotenv2'),\n\t\t\t\t\tacceptLabel: this.$capitalize(this.$p.t('abgabetool/c4AcceptAndProceed')),\n\t\t\t\t\tacceptClass: 'btn btn-danger',\n\t\t\t\t\trejectLabel: this.$capitalize(this.$p.t('abgabetool/c4Cancel')),\n\t\t\t\t\trejectClass: 'btn btn-outline-secondary'\n\t\t\t\t}) === false) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\n\t\t\t\tconst link = this.projektarbeit?.beurteilungLinkOld\n\t\t\t\twindow.open(link, '_blank')\n\t\t\t} else {\n\t\t\t\t// show info text that no endupload with abgabe has been found\n\t\t\t\tif(await this.$fhcAlert.confirm({\n\t\t\t\t\tmessage: this.$p.t('abgabetool/c4keinEnduploadErfolgt'),\n\t\t\t\t\tacceptLabel: this.$capitalize(this.$p.t('abgabetool/c4AcceptAndProceed')),\n\t\t\t\t\tacceptClass: 'btn btn-danger',\n\t\t\t\t\trejectLabel: this.$capitalize(this.$p.t('abgabetool/c4Cancel')),\n\t\t\t\t\trejectClass: 'btn btn-outline-secondary'\n\t\t\t\t}) === false) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tformatDate(dateParam) {\n\t\t\tconst date = new Date(dateParam)\n\t\t\t// handle missing leading 0\n\t\t\tconst padZero = (num) => String(num).padStart(2, '0');\n\n\t\t\tconst month = padZero(date.getMonth() + 1); // Months are zero-based\n\t\t\tconst day = padZero(date.getDate());\n\t\t\tconst year = date.getFullYear();\n\t\t\t\n\t\t\treturn `${day}.${month}.${year}`\n\t\t},\n\t\topenCreateNewAbgabeModal() {\n\t\t\tif(this.projektarbeit?.betreuerart_kurzbz == 'Zweitbegutachter') {\n\t\t\t\t// maybe alert that this is not allowed or smth\n\n\t\t\t\tthis.$fhcAlert.alertWarning('Terminanlage disabled')\n\t\t\t\treturn\n\t\t\t}\n\t\t\t\n\t\t\tif(!this.newTermin) {\n\t\t\t\tconst typ = this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz === 'zwischen')\n\t\t\t\tthis.newTermin = {\n\t\t\t\t\t'paabgabe_id': -1,\n\t\t\t\t\t'projektarbeit_id': this.projektarbeit.projektarbeit_id,\n\t\t\t\t\t'fixtermin': false,\n\t\t\t\t\t'invertedFixtermin': true,\n\t\t\t\t\t'kurzbz': '',\n\t\t\t\t\t'datum': new Date().toISOString().split('T')[0],\n\t\t\t\t\t'note': this.allowedNotenOptions.find(opt => opt.note == 9),\n\t\t\t\t\t'beurteilungsnotiz': '',\n\t\t\t\t\t'upload_allowed': typ.upload_allowed_default,\n\t\t\t\t\t'paabgabetyp_kurzbz': '',\n\t\t\t\t\t'bezeichnung': typ,\n\t\t\t\t\t'abgabedatum': null,\n\t\t\t\t\t'insertvon': this.viewData?.uid ?? ''\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.$refs.modalContainerCreateNewAbgabe.show()\n\t\t},\n\t\tvalidateTermin(termin) {\n\t\t\t// compare new termin to existing ones to block illegal termin constellations, if they exist\n\t\t\t\n\t\t\treturn true\n\t\t},\n\t\tasync handleSaveNewAbgabe(termin) {\n\t\t\t\n\t\t\tif(!this.validateTermin(termin)) {\n\t\t\t\tthis.$fhcAlert.alertWarning('invalid termin')\n\t\t\t\t\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t\n\t\t\tawait this.saveTermin(termin)\n\t\t\t\n\t\t\tthis.$refs.modalContainerCreateNewAbgabe.hide()\n\t\t\tthis.newTermin = {\n\t\t\t\t'paabgabe_id': -1,\n\t\t\t\t'projektarbeit_id': this.projektarbeit.projektarbeit_id,\n\t\t\t\t'fixtermin': false,\n\t\t\t\t'invertedFixtermin': true,\n\t\t\t\t'kurzbz': '',\n\t\t\t\t'datum': new Date().toISOString().split('T')[0],\n\t\t\t\t'note': this.allowedNotenOptions.find(opt => opt.note == 9),\n\t\t\t\t'beurteilungsnotiz': '',\n\t\t\t\t'upload_allowed': false,\n\t\t\t\t'paabgabetyp_kurzbz': '',\n\t\t\t\t'bezeichnung': this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz === 'zwischen'),\n\t\t\t\t'abgabedatum': null,\n\t\t\t\t'insertvon': this.viewData?.uid ?? ''\n\t\t\t}\n\t\t\t\n\t\t},\n\t\thandleChangeAbgabetyp(termin) {\n\t\t\t// if paabgabetype qualgate is selected, fill out kurzbz textfield with bezeichnung of quality gate so users\n\t\t\t// are possibly less confused\n\t\t\tif(termin.bezeichnung?.paabgabetyp_kurzbz === 'qualgate1' || termin.bezeichnung?.paabgabetyp_kurzbz === 'qualgate2') {\n\t\t\t\ttermin.kurzbz = termin.bezeichnung.bezeichnung\n\t\t\t} else {\n\t\t\t\ttermin.kurzbz = ''\n\t\t\t}\n\t\t}\n\t\t\t\n\t},\n\tcomputed: {\n\t\tgetAllowedToCreateNewTermin() {\n\t\t\tif(this.assistenzMode) return true\n\t\t\tif(this.projektarbeit?.betreuerart_kurzbz == 'Zweitbegutachter') return false\n\t\t\tif(this.projektarbeit?.note !== undefined && this.projektarbeit.note !== null) {\n\t\t\t\t// check if the note is not defined as a non final projektarbeit note\n\t\t\t\tconst opt = this.notenOptionsNonFinal.find(opt => opt.note)\n\t\t\t\t// if thats the case allow further work\n\t\t\t\tif(opt) return true\n\t\t\t\t// else the PA is to be considered finished\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t\n\t\t\t// normally should be allowed if no rules apply\n\t\t\treturn true\n\t\t},\n\t\tallowedToSaveZusatzdaten() {\n\t\t\t\treturn this.form.schlagwoerter.length > 0 && this.form.schlagwoerter_en.length > 0 && this.form.abstract.length > 0 && this.form.abstract_en.length > 0 && this.form.seitenanzahl > 0\n\t\t},\n\t\tgetAllowedAbgabeTypeOptions() {\n\t\t\tif(this.assistenzMode) {\n\t\t\t\treturn this.abgabeTypeOptions\n\t\t\t} else {\n\t\t\t\treturn this.abgabeTypeOptions.filter(opt => this.abgabetypenBetreuer.includes(opt.paabgabetyp_kurzbz))\n\t\t\t}\n\t\t},\n\t\tgetMessagePtStyle() {\n\t\t\t// adjust outer spacing and internal padding to appear similar to doenload button in size\n\t\t\treturn {\n\t\t\t\troot: {\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tmargin: '0px'\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\twrapper: {\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tpadding: '6px'\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\t\n\t\t},\n\t\tgetEid() {\n\t\t\treturn this.$p.t('abgabetool/c4eidesstattlicheErklaerung')\n\t\t},\n\t\tgetEnduploadErlaubt() {\n\t\t\treturn !this.eidAkzeptiert\n\t\t},\n\t\tgetSemesterBenotbar(){\n\t\t\treturn this.projektarbeit?.isCurrent ?? false\n\t\t},\n\t\tendUploadVorhanden(){\n\t\t\treturn this.projektarbeit?.abgabetermine.find(abgabe => abgabe.paabgabetyp_kurzbz === 'end' && abgabe.abgabedatum !== null)\n\t\t},\n\t\tqualityGateTerminAvailable() {\n\t\t\tlet qgatefound = false\n\t\t\tthis.projektarbeit?.abgabetermine.forEach(abgabe => {\n\t\t\t\tif(abgabe.bezeichnung?.paabgabetyp_kurzbz == 'qualgate1'\n\t\t\t\t\t|| abgabe?.bezeichnung?.paabgabetyp_kurzbz == 'qualgate2') {\n\t\t\t\t\tqgatefound = true\n\t\t\t\t}\n\t\t\t})\n\t\t\treturn qgatefound\n\t\t},\n\t\tgetSpeedDialStyle() {\n\t\t\treturn 'position: static !important;'\n\t\t},\n\t\tgetSpeedDialWrapperStyle() {\n\t\t\t// non fullscreen -> wrapper is positioned on right bottom corner of modal, wherever that is\n\t\t\treturn 'position: absolute; z-index: 9999; left: 0px; bottom: 0.5rem;'\n\t\t},\n\t\tgetTooltipVerspaetet() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipVerspaetet'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipVerpasst() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipVerpasst'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipAbzugeben() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipAbzugeben'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipStandard() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipStandardv2'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipBeurteilungerforderlich() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipBeurteilungerforderlich'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipAbgegeben() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipAbgegeben'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipFixtermin() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipFixtermin'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipAbgabeDetected() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4tooltipAbgabeDetected')),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipNotAllowedToSave() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4notAllowedToEditAbgabeTermin'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipNotAllowedToDelete() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4notAllowedToDeleteAbgabeTermin'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipBestanden() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipBestanden'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipNichtBestanden() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipNichtBestanden'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetProjektarbeitTitel() {\n\t\t\tif(this.projektarbeit?.titel) return this.$capitalize(this.$p.t('abgabetool/c4titel')) + ': ' + this.projektarbeit.titel\n\t\t\t\n\t\t\treturn ''\n\t\t},\n\t\tgetProjektarbeitStudent(){\n\n\t\t\tif(this.projektarbeit?.student) return this.$capitalize(this.$p.t('person/student')) + ': ' + this.projektarbeit.student\n\n\t\t\treturn ''\n\t\t}\n\t},\n\twatch: {\n\t\t'newTermin.bezeichnung'(newVal) {\n\t\t\tif(newVal?.paabgabetyp_kurzbz === 'qualgate1' || newVal?.paabgabetyp_kurzbz === 'qualgate2') {\n\t\t\t\tthis.newTermin.kurzbz = newVal.bezeichnung\n\t\t\t}\n\t\t\t\n\t\t\tthis.newTermin.upload_allowed = newVal.upload_allowed_default\n\t\t},\n\t\t'projektarbeit'(newVal) {\n\t\t\t// set invertedFixtermin field for UI/UX purposes -> avoid double negation in text\n\t\t\t\n\t\t\t// reset newTermin object\n\t\t\tconst typ = this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz === 'zwischen')\n\t\t\tthis.newTermin = {\n\t\t\t\t'paabgabe_id': -1,\n\t\t\t\t'projektarbeit_id': newVal.projektarbeit_id,\n\t\t\t\t'fixtermin': false,\n\t\t\t\t'invertedFixtermin': true,\n\t\t\t\t'kurzbz': '',\n\t\t\t\t'datum': new Date().toISOString().split('T')[0],\n\t\t\t\t'note': this.allowedNotenOptions.find(opt => opt.note == 9),\n\t\t\t\t'beurteilungsnotiz': '',\n\t\t\t\t'upload_allowed': typ.upload_allowed_default,\n\t\t\t\t'paabgabetyp_kurzbz': '',\n\t\t\t\t'bezeichnung': typ,\n\t\t\t\t'abgabedatum': null,\n\t\t\t\t'insertvon': this.viewData?.uid ?? ''\n\t\t\t}\n\t\t\t\n\t\t\tnewVal?.abgabetermine?.forEach(termin => termin.invertedFixtermin = !termin.fixtermin)\n\t\t\t\n\t\t\t// default select german if projektarbeit sprache was null\n\t\t\tthis.form.sprache = newVal.sprache ? this.allActiveLanguages.find(lang => lang.sprache == newVal.sprache) : this.allActiveLanguages.find(lang => lang.sprache == 'German')\n\t\t\tthis.form.abstract = newVal.abstract ?? ''\n\t\t\tthis.form.abstract_en = newVal.abstract_en ?? ''\n\t\t\tthis.form.schlagwoerter = newVal.schlagwoerter ?? ''\n\t\t\tthis.form.schlagwoerter_en = newVal.schlagwoerter_en ?? ''\n\t\t\tthis.form.kontrollschlagwoerter = newVal.kontrollschlagwoerter ?? ''\n\t\t\tthis.form.seitenanzahl = newVal.seitenanzahl ?? 1\n\t\t\t\n\t\t},\n\t},\n\tcreated() {\n\n\t},\n\tmounted() {\n\n\t},\n\ttemplate: `\n\t\n\t\t\n\t\t\n\t\t\n\t\n\n\t
    \n\t\t
    {{$capitalize( $p.t('abgabetool/c4abgabeMitarbeiterbereich') )}}
    \n\n\t\t
    \n\t\t\t
    \n\t\t\t\t

    {{getProjektarbeitStudent}}

    \n\t\t\t\t

    {{getProjektarbeitTitel}}

    \n\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t
    \n\t\t
    \n\t\t\t
    \n\n\t\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\t\t
    \n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t
    \n\t\t\t
    {{ $capitalize( $p.t('abgabetool/c4keineAbgabetermineGefunden') )}}
    \n\t\t
    \n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t
    \n`,\n};\n\nexport default AbgabeMitarbeiterDetail;\n","import {CoreFilterCmpt} from \"../../../components/filter/Filter.js\";\nimport AbgabeDetail from \"./AbgabeMitarbeiterDetail.js\";\nimport BsModal from '../../Bootstrap/Modal.js';\nimport VueDatePicker from '../../vueDatepicker.js.php';\nimport ApiAbgabe from '../../../api/factory/abgabe.js'\nimport FhcOverlay from \"../../Overlay/FhcOverlay.js\";\n\nexport const AbgabetoolMitarbeiter = {\n\tname: \"AbgabetoolMitarbeiter\",\n\tcomponents: {\n\t\tBsModal,\n\t\tCoreFilterCmpt,\n\t\tAbgabeDetail,\n\t\tCheckbox: primevue.checkbox,\n\t\tDropdown: primevue.dropdown,\n\t\tTextarea: primevue.textarea,\n\t\tVueDatePicker,\n\t\tFhcOverlay\n\t},\n\tprovide() {\n\t\treturn {\n\t\t\tabgabeTypeOptions: Vue.computed(() => this.abgabeTypeOptions),\n\t\t\tabgabetypenBetreuer: Vue.computed(() => this.abgabetypenBetreuer),\n\t\t\tallowedNotenOptions: Vue.computed(() => this.allowedNotenOptions),\n\t\t\tnotenOptionsNonFinal: Vue.computed(() => this.notenOptionsNonFinal),\n\t\t\tturnitin_link: Vue.computed(() => this.turnitin_link),\n\t\t\told_abgabe_beurteilung_link: Vue.computed(() => this.old_abgabe_beurteilung_link)\n\t\t}\n\t},\n\tprops: {\n\t\tviewData: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t\tdefault: () => ({name: '', uid: ''}),\n\t\t\tvalidator(value) {\n\t\t\t\treturn value && value.uid // && value.name -> extensive viewData use only for cis4 onwards\n\t\t\t}\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\ttableData: null,\n\t\t\tabgabetypenBetreuer: null,\n\t\t\tdetailIsFullscreen: false,\n\t\t\tphrasenPromise: null,\n\t\t\tphrasenResolved: false,\n\t\t\tturnitin_link: null,\n\t\t\told_abgabe_beurteilung_link: null,\n\t\t\tsaving: false,\n\t\t\tloading: false,\n\t\t\tabgabeTypeOptions: null,\n\t\t\tnotenOptions: null,\n\t\t\tallowedNotenOptions: null,\n\t\t\tnotenOptionsNonFinal: null,\n\t\t\tserienTermin: Vue.reactive({\n\t\t\t\tdatum: new Date(),\n\t\t\t\tbezeichnung: {\n\t\t\t\t\tpaabgabetyp_kurzbz: 'zwischen',\n\t\t\t\t\tbezeichnung: 'Zwischenabgabe'\n\t\t\t\t},\n\t\t\t\tkurzbz: '',\n\t\t\t\tupload_allowed: false\n\t\t\t}),\n\t\t\tshowAll: false,\n\t\t\ttabulatorUuid: Vue.ref(0),\n\t\t\tselectedData: [],\n\t\t\tdomain: '',\n\t\t\tstudent_uid: null,\n\t\t\tdetail: null,\n\t\t\tdetailOffset: 0,\n\t\t\tprojektarbeiten: null,\n\t\t\tselectedProjektarbeit: null,\n\t\t\ttableBuiltResolve: null,\n\t\t\ttableBuiltPromise: null,\n\t\t\tabgabeTableOptions: {\n\t\t\t\tminHeight: 250,\n\t\t\t\tindex: 'projektarbeit_id',\n\t\t\t\tlayout: 'fitDataStretch',\n\t\t\t\tplaceholder: Vue.computed(() => this.$p.t('global/noDataAvailable')),\n\t\t\t\tselectable: true,\n\t\t\t\tselectableCheck: this.selectionCheck,\n\t\t\t\trowHeight: 80,\n\t\t\t\tcolumns: [\n\t\t\t\t\t{\n\t\t\t\t\t\tformatter: function (cell, formatterParams, onRendered) {\n\t\t\t\t\t\t\t// create the built-in checkbox\n\t\t\t\t\t\t\tif(!cell.getRow().getData().selectable) return \n\t\t\t\t\t\t\tlet checkbox = document.createElement(\"input\");\n\t\t\t\t\t\t\tcheckbox.type = \"checkbox\";\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t// Handle select manually\n\t\t\t\t\t\t\tcheckbox.addEventListener(\"click\", (e) => {\n\t\t\t\t\t\t\t\te.stopPropagation();\n\n\t\t\t\t\t\t\t\t// call our function\n\t\t\t\t\t\t\t\tif (formatterParams && formatterParams.handleClick) {\n\t\t\t\t\t\t\t\t\tformatterParams.handleClick(e, cell);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tcell.getRow().getData().checkbox = checkbox\n\n\t\t\t\t\t\t\tlet wrapper = document.createElement(\"div\");\n\t\t\t\t\t\t\twrapper.style.cssText = \"display: flex; justify-content: center; align-items: center; height: 100%; width: 100%;\";\n\n\t\t\t\t\t\t\twrapper.appendChild(checkbox);\n\n\t\t\t\t\t\t\treturn wrapper;\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttitleFormatter: function (cell, formatterParams, onRendered) {\n\t\t\t\t\t\t\t// create the built-in checkbox\n\t\t\t\t\t\t\tlet checkbox = document.createElement(\"input\");\n\t\t\t\t\t\t\tcheckbox.type = \"checkbox\";\n\n\t\t\t\t\t\t\t// Handle \"select all\" manually\n\t\t\t\t\t\t\tcheckbox.addEventListener(\"click\", (e) => {\n\t\t\t\t\t\t\t\te.stopPropagation();\n\n\t\t\t\t\t\t\t\t// call our function\n\t\t\t\t\t\t\t\tif (formatterParams && formatterParams.handleClick) {\n\t\t\t\t\t\t\t\t\tformatterParams.handleClick(e, cell);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\treturn checkbox;\n\t\t\t\t\t\t},\n\t\t\t\t\t\thozAlign: \"center\",\n\t\t\t\t\t\theaderSort: false,\n\t\t\t\t\t\tformatterParams: {\n\t\t\t\t\t\t\thandleClick: this.selectHandler\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttitleFormatterParams: {\n\t\t\t\t\t\t\thandleClick: this.selectAllHandler\n\t\t\t\t\t\t},\n\t\t\t\t\t\twidth: 50,\n\t\t\t\t\t\tcssClass: 'sticky-col'\n\t\t\t\t\t},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4details'))), field: 'details', formatter: this.detailFormatter, widthGrow: 1, tooltip: false, cssClass: 'sticky-col'},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4personenkennzeichen'))), headerFilter: true, field: 'pkz', formatter: this.pkzTextFormatter, widthGrow: 1, tooltip: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4kontakt'))), field: 'mail', formatter: this.mailFormatter, widthGrow: 1, tooltip: false, visible: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4vorname'))), field: 'vorname', headerFilter: true, formatter: this.centeredTextFormatter,widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4nachname'))), field: 'nachname', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4projekttyp'))), field: 'projekttyp_kurzbz', formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4stg'))), field: 'stg', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4sem'))), field: 'studiensemester_kurzbz', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4titel'))), field: 'titel', headerFilter: true, formatter: this.centeredTextFormatter, maxWidth: 500, widthGrow: 8},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4betreuerart'))), field: 'betreuerart_beschreibung',formatter: this.centeredTextFormatter, widthGrow: 1}\n\t\t\t\t],\n\t\t\t\tpersistence: false,\n\t\t\t},\n\t\t\tabgabeTableEventHandlers: [{\n\t\t\t\tevent: \"tableBuilt\",\n\t\t\t\thandler: async () => {\n\t\t\t\t\tthis.tableBuiltResolve()\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\tevent: \"cellClick\",\n\t\t\t\thandler: async (e, cell) => {\n\t\t\t\t\tif(cell.getColumn().getField() === \"details\") {\n\t\t\t\t\t\tthis.setDetailComponent(cell.getValue())\n\t\t\t\t\t\tthis.undoSelection(cell)\n\t\t\t\t\t} else if (cell.getColumn().getField() === \"mail\") {\n\t\t\t\t\t\tthis.undoSelection(cell)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\tevent: \"rowSelectionChanged\",\n\t\t\t\thandler: async(data) => {\n\t\t\t\t\tthis.selectedData.filter(sd => !data.includes(sd)).forEach(fsd => {\n\t\t\t\t\t\tif(fsd.checkbox) fsd.checkbox.checked = false\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\tdata.forEach(d => {\n\t\t\t\t\t\tif(d.checkbox) d.checkbox.checked = true\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\tthis.selectedData = data\n\t\t\t\t}\n\t\t\t}\n\t\t\t]};\n\t},\n\tmethods: {\n\t\tselectHandler(e, cell) {\n\t\t\tconst row = cell.getRow();\n\n\t\t\tif(row.isSelected()) {\n\t\t\t\trow.deselect();\n\t\t\t} else {\n\t\t\t\trow.select();\n\t\t\t}\n\n\t\t\t// stop built-in handler\n\t\t\te.stopPropagation();\n\t\t\treturn false;\n\t\t},\n\t\tselectAllHandler(e, cell) {\n\t\t\tconst table = cell.getTable();\n\t\t\tconst rows = table.getRows();\n\n\t\t\t// custom select all logic\n\t\t\tconst allowed = rows.filter(r => r.getData().selectable);\n\t\t\tconst selected = allowed.every(r => r.isSelected());\n\n\t\t\tif(selected) {\n\t\t\t\tallowed.forEach(r => r.deselect());\n\t\t\t} else {\n\t\t\t\tallowed.forEach(r => r.select());\n\t\t\t}\n\n\t\t\t// stop built-in handler\n\t\t\te.stopPropagation();\n\t\t\treturn false;\n\t\t},\n\t\thandleToggleFullscreenDetail() {\n\t\t\tthis.detailIsFullscreen = !this.detailIsFullscreen\n\t\t},\n\t\tgetOptionLabelAbgabetyp(option){\n\t\t\treturn option.bezeichnung\n\t\t},\n\t\tformatDate(dateParam) {\n\t\t\tconst date = new Date(dateParam)\n\t\t\t// handle missing leading 0\n\t\t\tconst padZero = (num) => String(num).padStart(2, '0');\n\n\t\t\tconst month = padZero(date.getMonth() + 1); // Months are zero-based\n\t\t\tconst day = padZero(date.getDate());\n\t\t\tconst year = date.getFullYear();\n\n\t\t\treturn `${day}.${month}.${year}`;\n\t\t},\n\t\tundoSelection(cell) {\n\t\t\t// checks if cells row is selected and unselects -> imitates columns which dont trigger row selection\n\t\t\t// but actually just revert it after the fact\n\n\t\t\tconst row = cell.getRow()\n\t\t\tif(row.isSelected()) {\n\t\t\t\trow.deselect();\n\t\t\t}\n\t\t},\n\t\tselectionCheck(row) {\n\t\t\tconst data = row.getData()\n\t\t\tif(data?.betreuerart_kurzbz == 'Zweitbegutachter') return false\n\t\t\treturn true\n\t\t},\n\t\tshowDeadlines(){\n\t\t\tconst link = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router\n\t\t\t\t+ '/Cis/Abgabetool/Deadlines'\n\t\t\twindow.open(link, '_blank')\n\t\t},\n\t\ttoggleShowAll(showall) {\n\t\t\tthis.showAll = showall\n\t\t\tthis.loading = true\n\t\t\tthis.loadProjektarbeiten(showall, () => {\n\t\t\t\tthis.$refs.abgabeTable?.tabulator.redraw(true)\n\t\t\t\tthis.$refs.abgabeTable?.tabulator.setSort([]);\n\t\t\t\tthis.loading = false\n\t\t\t})\n\t\t},\n\t\topenAddSeriesModal() {\n\t\t\tthis.$refs.modalContainerAddSeries.show()\n\t\t},\n\t\taddSeries() {\n\t\t\tthis.saving = true\n\t\t\tthis.$api.call(ApiAbgabe.postSerientermin(\n\t\t\t\tthis.serienTermin.datum.toISOString(),\n\t\t\t\tthis.serienTermin.bezeichnung.paabgabetyp_kurzbz,\n\t\t\t\tthis.serienTermin.bezeichnung.bezeichnung,\n\t\t\t\tthis.serienTermin.kurzbz,\n\t\t\t\tthis.serienTermin.upload_allowed,\n\t\t\t\tthis.selectedData?.map(projekt => projekt.projektarbeit_id),\n\t\t\t\tfalse\n\t\t\t)).then(res => {\n\t\t\t\tif (res.meta.status === \"success\" && res.data) {\n\t\t\t\t\tthis.$fhcAlert.alertSuccess(this.$p.t('abgabetool/serienTerminGespeichert'))\n\t\t\t\t} else {\n\t\t\t\t\tthis.$fhcAlert.alertError(this.$p.t('abgabetool/errorSerienterminSpeichern'))\n\t\t\t\t}\n\t\t\t}).finally(()=>{\n\t\t\t\tthis.saving = false\n\t\t\t})\n\n\t\t\tthis.$refs.modalContainerAddSeries.hide()\n\t\t},\n\t\tcreateInfoString(data) {\n\t\t\tlet str = '';\n\t\t\t\n\t\t\tdata.forEach(name => {\n\t\t\t\tstr += name\n\t\t\t\tstr += '; '\n\t\t\t})\n\t\t\t\n\t\t\treturn str\n\t\t},\n\t\tisPastDate(date) {\n\t\t\treturn new Date(date) < new Date(Date.now())\n\t\t},\n\t\tsetDetailComponent(details){\n\t\t\tthis.loading=true\n\t\t\tthis.loadAbgaben(details).then((res)=> {\n\t\t\t\tconst pa = this.projektarbeiten?.retval?.find(projekarbeit => projekarbeit.projektarbeit_id == details.projektarbeit_id)\n\t\t\t\tpa.abgabetermine = res.data[0].retval\n\t\t\t\tpa.isCurrent = res.data[1]\n\n\t\t\t\tlet paIsBenotet = false\n\t\t\t\tif(pa.note !== undefined && pa.note !== null) {\n\t\t\t\t\t// check if the note is not defined as a non final projektarbeit note\n\t\t\t\t\tconst opt = this.notenOptionsNonFinal.find(opt => opt.note)\n\t\t\t\t\t// if thats the case allow further work\n\t\t\t\t\tif(opt) paIsBenotet = false\n\t\t\t\t\t// else the PA is to be considered finished\n\t\t\t\t\tpaIsBenotet = true\n\t\t\t\t}\n\n\t\t\t\tpa.abgabetermine.forEach(termin => {\n\t\t\t\t\ttermin.note = this.allowedNotenOptions.find(opt => opt.note == termin.note)\n\t\t\t\t\ttermin.file = []\n\t\t\t\t\t\n\t\t\t\t\t// update 08-01-2026: everybody is allowed to do everything in client, critical checks happen at backend level\n\t\t\t\t\t// termin.allowedToSave = true\n\t\t\t\t\t\n\t\t\t\t\t// update 21-01-2026: actually blocking operations on finished projektarbeiten seems like a decent idea\n\t\t\t\t\ttermin.allowedToSave = paIsBenotet ? false : true\n\t\t\t\t\t\n\t\t\t\t\t// lektoren are not allowed to delete deadlines with existing submissions\n\t\t\t\t\ttermin.allowedToDelete = termin.allowedToSave && !termin.abgabedatum\n\t\t\t\t\t\n\t\t\t\t\ttermin.bezeichnung = this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz === termin.paabgabetyp_kurzbz)\n\n\t\t\t\t})\n\t\t\t\tpa.student_uid = details.student_uid\n\t\t\t\tpa.student = `${pa.vorname} ${pa.nachname}`\n\t\t\t\t\n\t\t\t\tthis.selectedProjektarbeit = pa\n\t\t\t\tthis.$refs.modalContainerAbgabeDetail.show()\n\t\t\t\n\t\t\t}).finally(()=>{this.loading = false})\n\t\t},\n\t\tcenteredTextFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\t\t\tif(!val) return\n\t\t\t\n\t\t\treturn '
    ' +\n\t\t\t\t'

    '+val+'

    '\n\t\t},\n\t\tdetailFormatter(cell) {\n\t\t\treturn '
    ' +\n\t\t\t\t'
    '\n\t\t},\n\t\tmailFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\t\t\treturn '
    ' +\n\t\t\t\t'
    '\n\t\t},\n\t\tbeurteilungFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\t\t\tif(val) {\n\t\t\t\treturn '
    ' +\n\t\t\t\t\t'
    '\n\t\t\t} else return '-'\n\t\t},\n\t\tpkzTextFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\n\t\t\treturn '
    ' +\n\t\t\t\t''+val+'
    '\n\t\t},\n\t\ttableResolve(resolve) {\n\t\t\tthis.tableBuiltResolve = resolve\n\t\t},\n\t\tbuildMailToLink(abgabe) {\n\t\t\treturn 'mailto:' + abgabe.uid +'@'+ this.domain\n\t\t},\n\t\tbuildPKZ(projekt) {\n\t\t\treturn `${projekt.uid} / ${projekt.matrikelnr}`\n\t\t},\n\t\tbuildStg(projekt) {\n\t\t\treturn (projekt.typ + projekt.kurzbz)?.toUpperCase()\t\n\t\t},\n\t\tsetupData(data){\n\t\t\tthis.projektarbeiten = data[0]\n\t\t\tthis.domain = data[1]\n\t\t\t\n\t\t\tthis.tableData = data[0]?.retval?.map(projekt => {\n\n\t\t\t\tprojekt.selectable = projekt.betreuerart_kurzbz !== 'Zweitbegutachter'\n\n\t\t\t\treturn {\n\t\t\t\t\t...projekt,\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\tstudent_uid: projekt.uid,\n\t\t\t\t\t\tprojektarbeit_id: projekt.projektarbeit_id,\n\t\t\t\t\t},\n\t\t\t\t\tpkz: this.buildPKZ(projekt),\n\t\t\t\t\tbeurteilung: projekt.beurteilungLink ?? null,\n\t\t\t\t\tsem: projekt.studiensemester_kurzbz,\n\t\t\t\t\tstg: this.buildStg(projekt),\n\t\t\t\t\tmail: this.buildMailToLink(projekt),\n\t\t\t\t\ttyp: projekt.projekttyp_kurzbz,\n\t\t\t\t\ttitel: projekt.titel\n\t\t\t\t}\n\t\t\t})\n\t\t\t\n\t\t\tthis.$refs.abgabeTable.tabulator.setColumns(this.abgabeTableOptions.columns)\n\t\t\tthis.$refs.abgabeTable.tabulator.setData(this.tableData);\n\t\t},\n\t\tloadProjektarbeiten(all = false, callback) {\n\t\t\tthis.$api.call(ApiAbgabe.getMitarbeiterProjektarbeiten(all))\n\t\t\t\t.then(res => {\n\t\t\t\t\tif(res?.data) this.setupData(res.data)\n\t\t\t\t}).finally(() => {\n\t\t\t\t\tif(callback) {\n\t\t\t\t\t\tcallback()\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t},\n\t\tloadAbgaben(details) {\n\t\t\treturn new Promise((resolve) => {\n\t\t\t\tthis.$api.call(ApiAbgabe.getStudentProjektabgaben(details))\n\t\t\t\t\t.then(res => {\n\t\t\t\t\t\tresolve(res)\n\t\t\t\t\t})\n\t\t\t})\n\t\t},\n\t\thandleUuidDefined(uuid) {\n\t\t\tthis.tabulatorUuid = uuid\n\t\t},\n\t\tcalcMaxTableHeight() {\n\t\t\tconst tableID = this.tabulatorUuid ? ('-' + this.tabulatorUuid) : ''\n\t\t\tconst tableDataSet = document.getElementById('filterTableDataset' + tableID);\n\t\t\tif(!tableDataSet) return\n\t\t\tconst rect = tableDataSet.getBoundingClientRect();\n\n\t\t\tthis.abgabeTableOptions.height = window.visualViewport.height - rect.top - 80\n\t\t\tthis.$refs.abgabeTable.tabulator.setHeight(this.abgabeTableOptions.height)\n\t\t},\n\t\tasync setupMounted() {\n\t\t\tthis.tableBuiltPromise = new Promise(this.tableResolve)\n\t\t\tawait this.tableBuiltPromise\n\n\t\t\tthis.loadProjektarbeiten()\n\n\t\t\tthis.calcMaxTableHeight()\n\n\t\t}\n\t},\n\twatch: {\n\t\t'serienTermin.bezeichnung'(newVal) {\n\t\t\tif(newVal?.paabgabetyp_kurzbz === 'qualgate1' || newVal?.paabgabetyp_kurzbz === 'qualgate2') {\n\t\t\t\tthis.serienTermin.kurzbz = newVal.bezeichnung\n\t\t\t}\n\n\t\t\tthis.serienTermin.upload_allowed = newVal.upload_allowed_default\n\t\t},\n\t},\n\tcomputed: {\n\t\tgetAllowedAbgabeTypeOptions() {\n\t\t\treturn this.abgabeTypeOptions.filter(opt => this.abgabetypenBetreuer.includes(opt.paabgabetyp_kurzbz))\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.phrasenPromise = this.$p.loadCategory(['abgabetool', 'global'])\n\t\tthis.phrasenPromise.then(()=> {this.phrasenResolved = true})\n\t\t// fetch config to avoid hard coded links\n\t\tthis.$api.call(ApiAbgabe.getConfig()).then(res => {\n\t\t\tthis.turnitin_link = res.data?.turnitin_link\n\t\t\tthis.old_abgabe_beurteilung_link = res.data?.old_abgabe_beurteilung_link\n\t\t\tthis.abgabetypenBetreuer = res.data?.abgabetypenBetreuer\n\t\t}).catch(e => {\n\t\t\tthis.loading = false\n\t\t})\n\t\t\n\t\t// fetch noten options\n\t\t//TODO: SWITCH TO NOTEN API ONCE NOTENTOOL IS IN MASTER TO AVOID DUPLICATE API\n\t\tthis.$api.call(ApiAbgabe.getNoten()).then(res => {\n\t\t\tif(res.meta.status == 'success') {\n\t\t\t\tthis.notenOptions = res.data[0]\n\n\t\t\t\tthis.allowedNotenOptions = this.notenOptions.filter(\n\t\t\t\t\topt => res.data[1].includes(opt.note)\n\t\t\t\t)\n\t\t\t\t\n\t\t\t\tthis.notenOptionsNonFinal = this.notenOptions.filter(\n\t\t\t\t\topt => res.data[2].includes(opt.note)\n\t\t\t\t)\n\t\t\t}\n\t\t\t\n\t\t}).catch(e => {\n\t\t\tthis.loading = false\n\t\t})\n\t\t\n\t\t// fetch abgabetypen options\n\t\tthis.$api.call(ApiAbgabe.getPaAbgabetypen()).then(res => {\n\t\t\tthis.abgabeTypeOptions = res.data\n\t\t}).catch(e => {\n\t\t\tthis.loading = false\n\t\t})\n\t},\n\tmounted() {\n\t\tthis.setupMounted()\n\t},\n\ttemplate: `\n\t\n `,\n};\n\nexport default AbgabetoolMitarbeiter;\n","export default {\n\tname: 'BootstrapOffcanvas',\n\tdata: () => ({\n\t\toffcanvas: null\n\t}),\n\tprops: {\n\t\tbackdrop: {\n\t\t\ttype: [Boolean, String],\n\t\t\tdefault: true,\n\t\t\tvalidator(value) {\n\t\t\t\treturn ['static', true, false].includes(value);\n\t\t\t}\n\t\t},\n\t\tkeyboard: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true\n\t\t},\n\t\tscroll: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t},\n\t\tplacement: {\n\t\t\ttype: String,\n\t\t\tdefault: 'start', // start | end | top | bottom\n\t\t\tvalidator(value) {\n\t\t\t\treturn ['start', 'end', 'top', 'bottom'].includes(value);\n\t\t\t}\n\t\t},\n\t\tnoCloseBtn: Boolean,\n\t\theaderClass: {\n\t\t\ttype: [String, Array, Object],\n\t\t\tdefault: ''\n\t\t},\n\t\tbodyClass: {\n\t\t\ttype: [String, Array, Object],\n\t\t\tdefault: 'p-4'\n\t\t},\n\t\tfooterClass: {\n\t\t\ttype: [String, Array, Object],\n\t\t\tdefault: ''\n\t\t},\n\t\tdialogClass: [String, Array, Object]\n\t},\n\temits: [\n\t\t\"hideBsOffcanvas\",\n\t\t\"hiddenBsOffcanvas\",\n\t\t\"hidePreventedBsOffcanvas\",\n\t\t\"showBsOffcanvas\",\n\t\t\"shownBsOffcanvas\"\n\t],\n\tmethods: {\n\t\tdispose() {\n\t\t\treturn this.offcanvas?.dispose();\n\t\t},\n\t\thide() {\n\t\t\treturn this.offcanvas?.hide();\n\t\t},\n\t\tshow(relatedTarget) {\n\t\t\treturn this.offcanvas?.show(relatedTarget);\n\t\t},\n\t\ttoggle() {\n\t\t\treturn this.offcanvas?.toggle();\n\t\t},\n\t\tpopup(body, options, title, footer) {\n\t\t\tconst BsOffcanvas = this,\n\t\t\t\tslots = {};\n\n\t\t\tif (body !== undefined)\n\t\t\t\tslots.default = () => body;\n\t\t\tif (title !== undefined)\n\t\t\t\tslots.title = () => title;\n\t\t\tif (footer !== undefined)\n\t\t\t\tslots.footer = () => footer;\n\n\t\t\tlet includedPrimevue = false;\n\t\t\tif (typeof primevue !== 'undefined')\n\t\t\t\tincludedPrimevue = true;\n\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tconst instance = Vue.createApp({\n\t\t\t\t\tname: 'OffcanvasTmpApp',\n\t\t\t\t\tsetup() {\n\t\t\t\t\t\treturn () =>\n\t\t\t\t\t\t\tVue.h(BsOffcanvas, {\n\t\t\t\t\t\t\t\tclass: 'offcanvas-wrapper',\n\t\t\t\t\t\t\t\tref: 'offcanvas',\n\t\t\t\t\t\t\t\t...options\n\t\t\t\t\t\t\t}, slots);\n\t\t\t\t\t},\n\t\t\t\t\tmounted() {\n\t\t\t\t\t\tthis.$refs.offcanvas.show();\n\t\t\t\t\t},\n\t\t\t\t\tbeforeUnmount() {\n\t\t\t\t\t\tif (this.$refs.offcanvas)\n\t\t\t\t\t\t\tthis.$refs.offcanvas.result !== false ? resolve(this.$refs.offcanvas.result) : reject();\n\t\t\t\t\t},\n\t\t\t\t\tunmounted() {\n\t\t\t\t\t\twrapper.parentElement.removeChild(wrapper);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tconst wrapper = document.createElement('div');\n\n\t\t\t\tif (includedPrimevue) {\n\t\t\t\t\tinstance.use(primevue.config.default, { zIndex: { overlay: 9999 } });\n\t\t\t\t}\n\n\t\t\t\timport('../../plugins/Phrasen.js').then((Phrasen) => {\n\t\t\t\t\tinstance.use(Phrasen.default);\n\t\t\t\t\tinstance.mount(wrapper);\n\t\t\t\t\tdocument.body.appendChild(wrapper);\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t},\n\tmounted() {\n\t\tif (this.$refs.offcanvas) {\n\t\t\tthis.offcanvas = new bootstrap.Offcanvas(this.$refs.offcanvas, {\n\t\t\t\tbackdrop: this.backdrop,\n\t\t\t\tkeyboard: this.keyboard,\n\t\t\t\tscroll: this.scroll\n\t\t\t});\n\t\t}\n\t},\n\ttemplate: `\n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\t\t
    \n\t`\n}\n","/**\n * Copyright (C) 2025 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tgetAllStudiensemesterAndAktOrNext() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/organisation/Studiensemester/getAllStudiensemesterAndAktOrNext',\n\t\t};\n\t},\n\tgetAll(order = null, start = null)\n\t{\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: 'api/frontend/v1/organisation/studiensemester/getAll',\n\t\t\tparams: { order, start }\n\t\t};\n\t}\n};","export const AbgabeterminStatusLegende = {\n\tname: 'AbgabeterminStatusLegende',\n\ttemplate: `\t\n\t\t
    \n\t\t\t
    \n\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t('abgabetool/c4tooltipVerspaetet')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t('abgabetool/c4tooltipVerpasst')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t('abgabetool/c4tooltipAbzugeben')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t('abgabetool/c4tooltipStandardv2')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t('abgabetool/c4tooltipAbgegeben')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t('abgabetool/c4tooltipBeurteilungerforderlich')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t('abgabetool/c4tooltipBestanden')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t('abgabetool/c4tooltipNichtBestanden')) }}
    \n\t\t\t\t\t
    \t\n\t\t\t\t
    \n\n\t\t\t
    \n\t\t
    \t\n\t`\n};\nexport default AbgabeterminStatusLegende;","export async function splitMailsHelper(mails, event, subject, alertPluginRef, phrasenPluginRef) {\n\tlet splititem = \",\";\n\tlet maillist = mails.join(splititem);\n\tlet mailto = \"\";\n\t// take subject line length + '?subject=' length into account\n\tconst subjectlength = subject && typeof subject === 'string' ? subject.length + 9 : 0 \n\tif (maillist.length > 2024)\n\t{\n\t\tif (await alertPluginRef.confirm({message: phrasenPluginRef.t('stv', 'zuvieleEMails') }) === false)\n\t\t\treturn;\n\t}\n\n\tlet firstrun = true;\n\tlet useBcc = event?.ctrlKey || event?.metaKey;\n\twhile (maillist.length > 0)\n\t{\n\t\tif (maillist.length + subjectlength > 2024)\n\t\t{\n\t\t\tlet splitposition = maillist.lastIndexOf(splititem, 1900);\n\t\t\tmailto = maillist.substring(0, splitposition);\n\t\t\tmaillist = maillist.substring(splitposition + 1);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tmailto = maillist;\n\t\t\tmaillist = \"\";\n\t\t}\n\n\t\tlet mailLink = useBcc ? `mailto:?bcc=${mailto}` : `mailto:${mailto}`;\n\t\tif(subject && typeof subject === 'string') mailLink += `?subject=${subject}`\n\t\tif (firstrun)\n\t\t{\n\t\t\twindow.location.href = mailLink;\n\t\t\tfirstrun = false;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (await alertPluginRef.confirm({message: phrasenPluginRef.t('stv', 'weitereEMail')}) === true)\n\t\t\t{\n\t\t\t\twindow.location.href = mailLink;\n\t\t\t}\n\t\t}\n\n\t}\n}","import {CoreFilterCmpt} from \"../../../components/filter/Filter.js\";\nimport AbgabeDetail from \"./AbgabeMitarbeiterDetail.js\";\nimport BsModal from '../../Bootstrap/Modal.js';\nimport BsOffcanvas from '../../Bootstrap/Offcanvas.js';\nimport VueDatePicker from '../../vueDatepicker.js.php';\nimport ApiAbgabe from '../../../api/factory/abgabe.js'\nimport ApiStudiensemester from '../../../api/factory/studiensemester.js';\nimport AbgabeterminStatusLegende from \"./StatusLegende.js\";\nimport FhcOverlay from \"../../Overlay/FhcOverlay.js\";\nimport { splitMailsHelper } from \"../../../helpers/EmailHelpers.js\"\n\n// spoofed date testing\n// const todayISO = '2025-08-08'\n// const today = new Date(todayISO)\n// const now = luxon.DateTime.fromISO(todayISO)\n\n// prod code\nconst today = new Date()\nconst now = luxon.DateTime.now()\n\nexport const AbgabetoolAssistenz = {\n\tname: \"AbgabetoolAssistenz\",\n\tcomponents: {\n\t\tAbgabeterminStatusLegende,\n\t\tBsModal,\n\t\tBsOffcanvas,\n\t\tCoreFilterCmpt,\n\t\tAbgabeDetail,\n\t\tCheckbox: primevue.checkbox,\n\t\tDropdown: primevue.dropdown,\n\t\tInplace: primevue.inplace,\n\t\tTextarea: primevue.textarea,\n\t\tTimeline: primevue.timeline,\n\t\tTieredMenu: primevue.tieredmenu,\n\t\tVueDatePicker,\n\t\tFhcOverlay\n\t},\n\tprovide() {\n\t\treturn {\n\t\t\tabgabeTypeOptions: Vue.computed(() => this.abgabeTypeOptions),\n\t\t\tallowedNotenOptions: Vue.computed(() => this.allowedNotenOptions),\n\t\t\tnotenOptionsNonFinal: Vue.computed(() => this.notenOptionsNonFinal),\n\t\t\tturnitin_link: Vue.computed(() => this.turnitin_link),\n\t\t\told_abgabe_beurteilung_link: Vue.computed(() => this.old_abgabe_beurteilung_link),\n\t\t\tabgabetypenBetreuer: Vue.computed(() => this.abgabeTypeOptions)\n\t\t}\n\t},\n\tprops: {\n\t\tstg_kz_prop: {\n\t\t\tdefault: null\n\t\t},\n\t\tviewData: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t\tdefault: () => ({name: '', uid: ''}),\n\t\t\tvalidator(value) {\n\t\t\t\treturn value && value.uid // && value.name -> extensive viewData use only for cis4 onwards\n\t\t\t}\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\ttableData: null,\n\t\t\tstudiensemesterOptions: null,\n\t\t\tallSem: null,\n\t\t\tcurSem: null,\n\t\t\tnotenOptionFilter: null,\n\t\t\tinplaceToggle: false,\n\t\t\theaderFiltersRestored: false,\n\t\t\tfiltersRestored: false,\n\t\t\tcolLayoutRestored: false,\n\t\t\tsortRestored: false,\n\t\t\tstateRestored: false,\n\t\t\ttimelineProjekt: null,\n\t\t\tselectedStudiengangOption: null,\n\t\t\tstudiengaengeOptions: null,\n\t\t\tdetailIsFullscreen: false,\n\t\t\tallConfigPromise: null,\n\t\t\tphrasenPromise: null,\n\t\t\tphrasenResolved: false,\n\t\t\tturnitin_link: null,\n\t\t\told_abgabe_beurteilung_link: null,\n\t\t\tASSISTENZ_SAMMELMAIL_BUTTON_STUDENT: null,\n\t\t\tASSISTENZ_SAMMELMAIL_BUTTON_BETREUER: null,\n\t\t\tsaving: false,\n\t\t\tloading: false,\n\t\t\tabgabeTypeOptions: null,\n\t\t\tnotenOptions: null,\n\t\t\tallowedNotenFilterOptions: null,\n\t\t\tallowedNotenOptions: null,\n\t\t\tnotenOptionsNonFinal: null,\n\t\t\tserienTermin: Vue.reactive({\n\t\t\t\tdatum: new Date(),\n\t\t\t\tbezeichnung: {\n\t\t\t\t\tpaabgabetyp_kurzbz: 'zwischen',\n\t\t\t\t\tbezeichnung: 'Zwischenabgabe'\n\t\t\t\t},\n\t\t\t\tkurzbz: '',\n\t\t\t\tfixtermin: false,\n\t\t\t\tinvertedFixtermin: true,\n\t\t\t\tupload_allowed: false\n\t\t\t}),\n\t\t\tshowAll: false,\n\t\t\ttabulatorUuid: Vue.ref(0),\n\t\t\tselectedData: [],\n\t\t\tdomain: '',\n\t\t\tstudent_uid: null,\n\t\t\tdetail: null,\n\t\t\tdetailOffset: 0,\n\t\t\tprojektarbeiten: null,\n\t\t\tselectedProjektarbeit: null,\n\t\t\ttableBuiltResolve: null,\n\t\t\ttableBuiltPromise: null,\n\t\t\tabgabeTableOptions: {\n\t\t\t\tminHeight: 250,\n\t\t\t\tindex: 'projektarbeit_id',\n\t\t\t\tlayout: 'fitData',\n\t\t\t\tplaceholder: Vue.computed(() => this.$capitalize(this.$p.t('global/noDataAvailable'))),\n\t\t\t\tselectable: true,\n\t\t\t\tselectableCheck: this.selectionCheck,\n\t\t\t\trowHeight: 40,\n\t\t\t\trenderVerticalBuffer: 2000,\n\t\t\t\tcolumns: [\n\t\t\t\t\t{\n\t\t\t\t\t\tformatter: function (cell, formatterParams, onRendered) {\n\t\t\t\t\t\t\t// create the built-in checkbox\n\t\t\t\t\t\t\tif(!cell.getRow().getData().selectable) return\n\t\t\t\t\t\t\tlet checkbox = document.createElement(\"input\");\n\t\t\t\t\t\t\tcheckbox.type = \"checkbox\";\n\n\t\t\t\t\t\t\t// Handle select manually\n\t\t\t\t\t\t\tcheckbox.addEventListener(\"click\", (e) => {\n\t\t\t\t\t\t\t\te.stopPropagation();\n\n\t\t\t\t\t\t\t\t// call our function\n\t\t\t\t\t\t\t\tif (formatterParams && formatterParams.handleClick) {\n\t\t\t\t\t\t\t\t\tformatterParams.handleClick(e, cell);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tcell.getRow().getData().checkbox = checkbox\n\n\t\t\t\t\t\t\tlet wrapper = document.createElement(\"div\");\n\t\t\t\t\t\t\twrapper.style.cssText = \"display: flex; justify-content: center; align-items: center; height: 100%; width: 100%;\";\n\n\t\t\t\t\t\t\twrapper.appendChild(checkbox);\n\n\t\t\t\t\t\t\treturn wrapper;\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttitleFormatter: function (cell, formatterParams, onRendered) {\n\t\t\t\t\t\t\t// create the built-in checkbox\n\t\t\t\t\t\t\tlet checkbox = document.createElement(\"input\");\n\t\t\t\t\t\t\tcheckbox.type = \"checkbox\";\n\n\t\t\t\t\t\t\t// Handle \"select all\" manually\n\t\t\t\t\t\t\tcheckbox.addEventListener(\"click\", (e) => {\n\t\t\t\t\t\t\t\te.stopPropagation();\n\n\t\t\t\t\t\t\t\t// call our function\n\t\t\t\t\t\t\t\tif (formatterParams && formatterParams.handleClick) {\n\t\t\t\t\t\t\t\t\tformatterParams.handleClick(e, cell);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\treturn checkbox;\n\t\t\t\t\t\t},\n\t\t\t\t\t\thozAlign: \"center\",\n\t\t\t\t\t\theaderSort: false,\n\t\t\t\t\t\tformatterParams: {\n\t\t\t\t\t\t\thandleClick: this.selectHandler\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttitleFormatterParams: {\n\t\t\t\t\t\t\thandleClick: this.selectAllHandler\n\t\t\t\t\t\t},\n\t\t\t\t\t\twidth: 50,\n\t\t\t\t\t\tcssClass: 'sticky-col'\n\t\t\t\t\t},\n\t\t\t\t// {\n\t\t\t\t\t// \tfield: 'rowSelection',\n\t\t\t\t\t// \tformatter: 'rowSelection',\n\t\t\t\t\t// \ttitleFormatter: 'rowSelection',\n\t\t\t\t\t// \ttitleFormatterParams: {\n\t\t\t\t\t// \t\trowRange: \"active\" // Only toggle the values of the active filtered rows\n\t\t\t\t\t// \t},\n\t\t\t\t\t// \thozAlign:\"center\",\n\t\t\t\t\t// \theaderSort: false,\n\t\t\t\t\t// \tfrozen: true,\n\t\t\t\t\t// \twidth: 40\n\t\t\t\t\t// },\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4details'))), field: 'details', formatter: this.formAction, tooltip:false, minWidth: 150, cssClass: 'sticky-col'},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4personenkennzeichen'))), headerFilter: true, field: 'pkz', formatter: this.pkzTextFormatter, widthGrow: 1, tooltip: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4vorname'))), field: 'student_vorname', headerFilter: true, formatter: this.centeredTextFormatter,widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4nachname'))), field: 'student_nachname', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4studstatus'))), field: 'studienstatus', headerFilter: true, formatter: this.centeredTextFormatter,widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4orgform'))), field: 'orgform', headerFilter: true, formatter: this.centeredTextFormatter,widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4projekttyp'))), field: 'projekttyp_kurzbz', formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4stg'))), field: 'stg', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4note'))), field: 'note_bez', headerFilter: true,\n\t\t\t\t\t\t formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4sem'))), field: 'studiensemester_kurzbz', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4titel'))), field: 'titel', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4erstbetreuer'))), field: 'erstbetreuer', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4zweitbetreuer'))), field: 'zweitbetreuer', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4prevAbgabetermin'))), headerFilter: true, field: 'prevTermin', formatter: this.abgabterminFormatter, widthGrow: 1, width: 220, tooltip: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4nextAbgabetermin'))), headerFilter: true, field: 'nextTermin', formatter: this.abgabterminFormatter, widthGrow: 1, width: 220, tooltip: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4qgate1Status'))), headerFilter: true, field: 'qgate1Status', formatter: this.centeredTextFormatter, widthGrow: 1, width: 220, tooltip: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4qgate2Status'))), headerFilter: true, field: 'qgate2Status', formatter: this.centeredTextFormatter, widthGrow: 1, width: 220, tooltip: false},\n\t\t\t\t],\n\t\t\t\tpersistence: false,\n\t\t\t\tpersistenceID: \"abgabetool_2025_12\"\n\t\t\t},\n\t\t\tabgabeTableEventHandlers: [\n\t\t\t{\n\t\t\t\tevent: \"rowSelectionChanged\",\n\t\t\t\thandler: async(data) => {\n\t\t\t\t\tthis.selectedData.filter(sd => !data.includes(sd)).forEach(fsd => {\n\t\t\t\t\t\tif(fsd.checkbox) fsd.checkbox.checked = false\n\t\t\t\t\t})\n\n\t\t\t\t\tdata.forEach(d => {\n\t\t\t\t\t\tif(d.checkbox) d.checkbox.checked = true\n\t\t\t\t\t})\n\n\t\t\t\t\tthis.selectedData = data\n\t\t\t\t}\n\t\t\t}\n\t\t\t]};\n\t},\n\tmethods: {\n\t\tsammelMailStudent(param) {\n\t\t\t\n\t\t\tconst emails = this.selectedData\n\t\t\t\t.map(row => `${row.student_uid}@${this.domain}`)\n\t\t\t\t.join(',');\n\t\t\tconst uniqueRecipients = [...new Set(emails)];\n\t\t\tconst subject = this.$p.t('abgabetool/c4sammelmailStudentBetreff', [this.selectedStudiengangOption?.bezeichnung]);\n\t\t\tsplitMailsHelper(uniqueRecipients, param.originalEvent, subject, this.$fhcAlert, this.$p)\n\t\t},\n\t\tsammelMailBetreuer(param) {\n\t\t\t\n\t\t\tconst recipientList = [];\n\t\t\tthis.selectedData.forEach(row => {\n\t\t\t\tif (row.betreuer_mail) recipientList.push(row.betreuer_mail);\n\t\t\t\tif (row.zweitbetreuer_mail) recipientList.push(row.zweitbetreuer_mail);\n\t\t\t});\n\n\t\t\t// actually not necessary for email clients but looks better for assistenz if we avoid duplicates here\n\t\t\tconst uniqueRecipients = [...new Set(recipientList)];\n\t\t\tconst subject = this.$p.t('abgabetool/c4sammelmailBetreuerBetreff', [this.selectedStudiengangOption?.bezeichnung]);\n\t\t\tsplitMailsHelper(uniqueRecipients, param.originalEvent, subject, this.$fhcAlert, this.$p)\n\t\t},\n\t\tselectHandler(e, cell) {\n\t\t\tconst row = cell.getRow();\n\n\t\t\tif(row.isSelected()){\n\t\t\t\trow.deselect();\n\t\t\t} else {\n\t\t\t\trow.select();\n\t\t\t}\n\n\t\t\t// stop built-in handler\n\t\t\te.stopPropagation();\n\t\t\treturn false;\n\t\t},\n\t\tselectAllHandler(e, cell) {\n\t\t\tconst table = cell.getTable();\n\t\t\tconst rows = table.getRows();\n\n\t\t\t// custom select all logic\n\t\t\tconst allowed = rows.filter(r => r.getData().selectable);\n\t\t\tconst selected = allowed.every(r => r.isSelected());\n\n\t\t\tif(selected){\n\t\t\t\tallowed.forEach(r => r.deselect());\n\t\t\t} else {\n\t\t\t\tallowed.forEach(r => r.select());\n\t\t\t}\n\n\t\t\t// stop built-in handler\n\t\t\te.stopPropagation();\n\t\t\treturn false;\n\t\t},\n\t\tcheckQualityGateStatus(projekt) {\n\t\t\t// TODO: might refine the representation of these states and maybe refactor code a little\n\t\t\tconst qgate1Termine = []\n\t\t\tconst qgate2Termine = []\n\t\t\t\n\t\t\tprojekt.qgate1Status = this.$p.t('abgabetool/c4keinTerminVorhanden')// 'Kein Termin vorhanden'\n\t\t\tprojekt.qgate1StatusRank = 0\n\t\t\tprojekt.qgate2Status = this.$p.t('abgabetool/c4keinTerminVorhanden')\n\t\t\tprojekt.qgate2StatusRank = 0\n\t\t\t\n\t\t\tprojekt.abgabetermine.forEach(termin => {\n\t\t\t\tif(termin.paabgabetyp_kurzbz == 'qualgate1') qgate1Termine.push(termin)\n\t\t\t\tif(termin.paabgabetyp_kurzbz == 'qualgate2') qgate2Termine.push(termin)\n\t\t\t})\n\t\t\t\n\t\t\t// calculate qgateStatusRank and display the highest order status rank of all quality gate termine until one\n\t\t\t// counts as passed, which is just a positive note no matter if anything has been uploaded\n\t\t\t\n\t\t\t// reuse luxon calculated diffMs (termin.datum in relation to today) from previous datestyle check \n\t\t\tqgate1Termine.forEach(qgate => {\n\t\t\t\tif(qgate.note != null && projekt.qgate1StatusRank <= 5) {\n\t\t\t\t\tconst noteOpt = this.notenOptions.find(opt => opt.note == qgate.note)\n\t\t\t\t\tif(noteOpt.positiv) {\n\t\t\t\t\t\tprojekt.qgate1Status = this.$p.t('abgabetool/c4positivBenotet')\n\t\t\t\t\t\tprojekt.qgate1StatusRank = 5\n\t\t\t\t\t} else {\n\t\t\t\t\t\tprojekt.qgate1Status = this.$p.t('abgabetool/c4negativBenotet')\n\t\t\t\t\t\tprojekt.qgate1StatusRank = 4\n\t\t\t\t\t}\n\t\t\t\t} else if (qgate.note == null && projekt.qgate1StatusRank <= 3) {\n\t\t\t\t\tprojekt.qgate1Status = this.$p.t('abgabetool/c4notYetGraded')\n\t\t\t\t\tprojekt.qgate1StatusRank = 3\n\t\t\t\t} else if(qgate.upload_allowed == true && qgate.abgabedatum == null && projekt.qgate1StatusRank <= 2) {\n\t\t\t\t\tprojekt.qgate1Status = this.$p.t('abgabetool/c4notSubmitted')\n\t\t\t\t\tprojekt.qgate1StatusRank = 2\n\t\t\t\t} else if (qgate.upload_allowed == false && qgate.diffMs <= 0 && projekt.qgate1StatusRank <= 1) {\n\t\t\t\t\tprojekt.qgate1Status = this.$p.t('abgabetool/c4notHappenedYet')\n\t\t\t\t\tprojekt.qgate1StatusRank = 1\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tqgate2Termine.forEach(qgate => {\n\t\t\t\tif(qgate.note != null && projekt.qgate1StatusRank <= 5) {\n\t\t\t\t\tconst noteOpt = this.notenOptions.find(opt => opt.note == qgate.note)\n\t\t\t\t\tif(noteOpt.positiv) {\n\t\t\t\t\t\tprojekt.qgate2Status = this.$p.t('abgabetool/c4positivBenotet')\n\t\t\t\t\t\tprojekt.qgate2StatusRank = 5\n\t\t\t\t\t} else {\n\t\t\t\t\t\tprojekt.qgate2Status = this.$p.t('abgabetool/c4negativBenotet')\n\t\t\t\t\t\tprojekt.qgate2StatusRank = 4\n\t\t\t\t\t}\n\t\t\t\t} else if (qgate.note == null && projekt.qgate2StatusRank <= 3) {\n\t\t\t\t\tprojekt.qgate2Status = this.$p.t('abgabetool/c4notYetGraded')\n\t\t\t\t\tprojekt.qgate2StatusRank = 3\n\t\t\t\t} else if(qgate.upload_allowed == true && qgate.abgabedatum == null && projekt.qgate2StatusRank <= 2) {\n\t\t\t\t\tprojekt.qgate2Status = this.$p.t('abgabetool/c4notSubmitted')\n\t\t\t\t\tprojekt.qgate2StatusRank = 2\n\t\t\t\t} else if (qgate.upload_allowed == false && qgate.diffMs <= 0 && projekt.qgate2StatusRank <= 1) {\n\t\t\t\t\tprojekt.qgate2Status = this.$p.t('abgabetool/c4notHappenedYet')\n\t\t\t\t\tprojekt.qgate2StatusRank = 1\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\tgetItemBezeichnung(item){\n\t\t\tif(!item.bezeichnung) return ''\n\t\t\t\n\t\t\treturn item?.bezeichnung?.bezeichnung ?? item?.bezeichnung\n\t\t},\n\t\tgetItemNote(item) {\n\t\t\t// note can be just a number if it is coming from backend\n\t\t\t// if note was just set it is a note option\n\t\t\tif(!item?.note) return ''\n\t\t\tif(item.note?.bezeichnung) return item.note.bezeichnung\n\t\t\t\n\t\t\tconst notenOption = this.notenOptions.find(note => note.note == item.note)\n\t\t\tif(!notenOption) return item.note\n\t\t\t\n\t\t\treturn notenOption.bezeichnung\n\t\t},\n\t\thandleChangeAbgabetypSerientermin(termin) {\n\t\t\t// if paabgabetype qualgate is selected, fill out kurzbz textfield with bezeichnung of quality gate so users\n\t\t\t// are possibly less confused\n\t\t\tif(termin.bezeichnung?.paabgabetyp_kurzbz === 'qualgate1' || termin.bezeichnung?.paabgabetyp_kurzbz === 'qualgate2') {\n\t\t\t\ttermin.kurzbz = termin.bezeichnung.bezeichnung\n\t\t\t} else {\n\t\t\t\ttermin.kurzbz = ''\n\t\t\t}\n\t\t},\n\t\tsemesterChanged(e) {\n\t\t\tif(this.$refs.abgabeTable.tabulator) {\n\t\t\t\tconst table = this.$refs.abgabeTable.tabulator\n\n\t\t\t\t// TODO: maybe check if existing synergy really works with many filters\n\t\t\t\tconst existing = table.getFilters().filter(f => f.field != 'studiensemester_kurzbz');\n\n\t\t\t\tconst compVal = e.value.studiensemester_kurzbz == this.$p.t('abgabetool/c4all') ? '' : e.value.studiensemester_kurzbz\n\t\t\t\tconst compType = e.value.studiensemester_kurzbz == this.$p.t('abgabetool/c4all') ? '!=' : '='\n\t\t\t\tconst newFilter = { field: \"studiensemester_kurzbz\", type: compType, value: compVal };\n\n\t\t\t\t// merge and reapply\n\t\t\t\ttable.setFilter([...existing, newFilter]);\n\t\t\t}\n\t\t\t\n\t\t},\n\t\tcheckAbgabetermineProjektarbeit(projekt) {\n\t\t\t// calculate Abgabetermin time diff to now and assign last and next to projekt\n\t\t\tprojekt.abgabetermine.forEach(termin => {\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t// while already looping through each termin, calculate datestyle beforehand\n\t\t\t\ttermin.dateStyle = this.getDateStyleClass(termin)\n\n\t\t\t\tconst date = luxon.DateTime.fromISO(termin.datum)\n\t\t\t\ttermin.diffMs = date.toMillis() - now.toMillis(); // positive = future, negative = past\n\n\t\t\t\tif (termin.diffMs < 0) {\n\t\t\t\t\tif (!projekt.prevTermin ||\n\t\t\t\t\t\ttermin.diffMs > projekt.prevTermin.diffMs // larger (less negative) = closer to now\n\t\t\t\t\t) {\n\t\t\t\t\t\tprojekt.prevTermin = termin;\n\t\t\t\t\t}\n\t\t\t\t} else if (termin.diffMs > 0) {\n\t\t\t\t\tif (!projekt.nextTermin ||\n\t\t\t\t\t\ttermin.diffMs < projekt.nextTermin.diffMs // smaller positive = closer to now\n\t\t\t\t\t) {\n\t\t\t\t\t\tprojekt.nextTermin = termin;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\n\t\t\t// seperate check for quality gates\n\t\t\tthis.checkQualityGateStatus(projekt)\n\t\t},\n\t\tloadState() {\n\t\t\treturn JSON.parse(localStorage.getItem(this.abgabeTableOptions.persistenceID) || \"null\");\n\t\t},\n\t\tsaveState(table) {\n\t\t\t// avoid storing state after first restore part happened\n\t\t\tif(!this.stateRestored) return\n\t\t\tconst rawLayout = table.getColumnLayout();\n\t\t\tconst state = {\n\t\t\t\tcolumns: rawLayout.map(col => ({\n\t\t\t\t\tfield: col.field,\n\t\t\t\t\tvisible: col.visible,\n\t\t\t\t\twidth: col.width,\n\t\t\t\t})),\n\t\t\t\tsort: table.getSorters().map(s => ({\n\t\t\t\t\tfield: s.field,\n\t\t\t\t\tdir: s.dir,\n\t\t\t\t})),\n\t\t\t\tfilters: table.getFilters(),\n\t\t\t\theaderFilters: table.getHeaderFilters()\n\t\t\t};\n\t\t\t\n\t\t\tlocalStorage.setItem(this.abgabeTableOptions.persistenceID, JSON.stringify(state));\n\t\t},\n\t\thandleTableBuilt() {\n\t\t\tconst table = this.$refs.abgabeTable.tabulator\n\n\t\t\tthis.tableBuiltResolve()\n\t\t\t\n\t\t\ttable.on(\"columnMoved\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"columnResized\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"columnVisibilityChanged\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"filterChanged\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"headerFilterChanged\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"dataSorted\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"columnSorted\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"sortersChanged\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\tconst saved = this.loadState();\n\n\t\t\ttable.on(\"renderComplete\", () => {\n\t\t\t\tif(!this.stateRestored) {\n\n\t\t\t\t\tif (saved?.columns && !this.colLayoutRestored) {\n\t\t\t\t\t\tconst layout = saved.columns.map(col => ({\n\t\t\t\t\t\t\tfield: col.field,\n\t\t\t\t\t\t\twidth: col.width,\n\t\t\t\t\t\t\tvisible: col.visible,\n\t\t\t\t\t\t\t// add more if needed, but keep it simple\n\t\t\t\t\t\t}));\n\t\t\t\t\t\t\n\t\t\t\t\t\ttable.setColumnLayout(layout);\n\n\t\t\t\t\t\tthis.colLayoutRestored = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (saved?.filters && !this.filtersRestored) {\n\t\t\t\t\t\tthis.filtersRestored = true // instantly avoid retriggers\n\t\t\t\t\t\ttable.setFilter(saved.filters);\n\t\t\t\t\t}\n\t\t\t\t\tif (saved?.headerFilters && !this.headerFiltersRestored) {\n\t\t\t\t\t\tthis.headerFiltersRestored = true // instantly avoid retriggers\n\t\t\t\t\t\tfor (let hf of saved.headerFilters) {\n\t\t\t\t\t\t\ttable.setHeaderFilterValue(hf.field, hf.value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (saved?.sort?.length && !this.sortRestored) {\n\t\t\t\t\t\tthis.sortRestored = true;\n\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tconst sortList = saved.sort.map(s => {\n\t\t\t\t\t\t\t\tconst col = table.columnManager.findColumn(s.field);\n\t\t\t\t\t\t\t\tif (!col) {\n\t\t\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn { column: col, dir: s.dir };\n\t\t\t\t\t\t\t}).filter(Boolean);\n\n\t\t\t\t\t\t\ttable.setSort(sortList);\n\t\t\t\t\t\t}, 100);\n\t\t\t\t\t}\n\t\t\t\t\tthis.stateRestored = true\n\n\t\t\t\t}\n\n\t\t\t});\n\t\t},\n\t\thandleToggleFullscreenDetail() {\n\t\t\tthis.detailIsFullscreen = !this.detailIsFullscreen\n\t\t},\n\t\tgetOptionLabelAbgabetyp(option){\n\t\t\treturn option.bezeichnung\n\t\t},\n\t\tgetOptionLabelStg(option){\n\t\t\treturn option.kurzbzlang + ' ' + option.bezeichnung\n\t\t},\n\t\tgetOptionLabelStudiensemester(option){\n\t\t\treturn option.studiensemester_kurzbz\n\t\t},\n\t\tgetNotenFilterOptionLabel(option) {\n\t\t\treturn option.bezeichnung\t\n\t\t},\n\t\tformatDate(dateParam) {\n\t\t\tif(dateParam === null) return ''\n\t\t\tconst date = new Date(dateParam)\n\t\t\t// handle missing leading 0\n\t\t\tconst padZero = (num) => String(num).padStart(2, '0');\n\n\t\t\tconst month = padZero(date.getMonth() + 1); // Months are zero-based\n\t\t\tconst day = padZero(date.getDate());\n\t\t\tconst year = date.getFullYear();\n\n\t\t\treturn `${day}.${month}.${year}`;\n\t\t},\n\t\tformAction(cell) {\n\t\t\tconst actionButtons = document.createElement('div');\n\t\t\tactionButtons.className = \"d-flex gap-3\"; // you can keep Bootstrap gap if loaded\n\t\t\tactionButtons.style.display = \"flex\";\n\t\t\tactionButtons.style.alignItems = \"stretch\"; // buttons stretch to full height\n\t\t\tactionButtons.style.justifyContent = \"center\";\n\t\t\tactionButtons.style.height = \"100%\"; // full grid cell height\n\n\t\t\tconst val = cell.getValue();\n\n\t\t\tconst createButton = (iconClass, titleKey, clickHandler) => {\n\t\t\t\tconst btn = document.createElement('button');\n\t\t\t\tbtn.className = 'btn btn-outline-secondary';\n\t\t\t\tbtn.style.display = \"flex\";\n\t\t\t\tbtn.style.alignItems = \"center\"; // center icon vertically\n\t\t\t\tbtn.style.justifyContent = \"center\"; // center icon horizontally\n\t\t\t\tbtn.style.height = \"100%\"; // fill parent container height\n\t\t\t\tbtn.style.aspectRatio = \"1 / 1\"; // keep square shape (optional)\n\t\t\t\tbtn.style.padding = \"0\"; // remove extra padding for compactness\n\t\t\t\tif(iconClass == 'fa fa-timeline') btn.style.transform = \"rotate(90deg)\";\n\t\t\t\tbtn.innerHTML = ``;\n\t\t\t\tbtn.title = this.$capitalize(this.$p.t(titleKey));\n\t\t\t\tbtn.addEventListener('click', (e) => {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\te.stopImmediatePropagation();\n\t\t\t\t\tclickHandler();\n\t\t\t\t});\n\t\t\t\treturn btn;\n\t\t\t};\n\n\t\t\tactionButtons.append(\n\t\t\t\tcreateButton('fa fa-folder-open', 'abgabetool/c4details', () => this.setDetailComponent(val)),\n\t\t\t\tcreateButton('fa fa-timeline', 'abgabetool/c4termineTimeLine', () => this.openTimeline(val))\n\t\t\t);\n\n\t\t\treturn actionButtons;\n\t\t},\n\n\t\tundoSelection(cell) {\n\t\t\t// checks if cells row is selected and unselects -> imitates columns which dont trigger row selection\n\t\t\t// but actually just revert it after the fact\n\n\t\t\tconst row = cell.getRow()\n\t\t\tif(row.isSelected()) {\n\t\t\t\trow.deselect();\n\t\t\t}\n\t\t},\n\t\tselectionCheck(row) {\n\t\t\tconst data = row.getData()\n\t\t\tif(data?.betreuerart_kurzbz == 'Zweitbegutachter') return false\n\t\t\treturn true\n\t\t},\n\t\tshowDeadlines(){\n\t\t\tconst link = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router\n\t\t\t\t+ '/Cis/Abgabetool/Deadlines'\n\t\t\twindow.open(link, '_blank')\n\t\t},\n\t\topenAddSeriesModal() {\n\t\t\tthis.$refs.modalContainerAddSeries.show()\n\t\t},\n\t\taddSeries() {\n\t\t\tconst pids = this.selectedData?.map(projekt => projekt.projektarbeit_id)\n\t\t\tthis.saving = true\n\t\t\tthis.serienTermin.fixtermin = !this.serienTermin.invertedFixtermin\n\t\t\tthis.$api.call(ApiAbgabe.postSerientermin(\n\t\t\t\tthis.serienTermin.datum.toISOString(),\n\t\t\t\tthis.serienTermin.bezeichnung.paabgabetyp_kurzbz,\n\t\t\t\tthis.serienTermin.bezeichnung.bezeichnung,\n\t\t\t\tthis.serienTermin.kurzbz,\n\t\t\t\tthis.serienTermin.upload_allowed,\n\t\t\t\tpids,\n\t\t\t\tthis.serienTermin.fixtermin\n\t\t\t)).then(res => {\n\t\t\t\t\n\t\t\t\tif (res.meta.status === \"success\" && res.data) {\n\t\t\t\t\tthis.$fhcAlert.alertSuccess(this.$p.t('abgabetool/serienTerminGespeichert'))\n\t\t\t\t} else {\n\t\t\t\t\tthis.$fhcAlert.alertError(this.$p.t('abgabetool/errorSerienterminSpeichern'))\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// put new abgaben into projektarbeiten\n\t\t\t\tconst newAbgaben = res.data\n\t\t\t\tpids.forEach(pid => {\n\t\t\t\t\tconst abgabe = newAbgaben.find(abgabe => abgabe.projektarbeit_id == pid)\n\t\t\t\t\t\n\t\t\t\t\tconst pa = this.projektarbeiten.find(pa => pa.projektarbeit_id == pid)\n\t\t\t\t\n\t\t\t\t\tabgabe.bezeichnung = this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz == abgabe.paabgabetyp_kurzbz)\n\t\t\t\t\t\n\t\t\t\t\tpa.abgabetermine.push(abgabe)\n\t\t\t\t\tpa.abgabetermine.sort((a, b) => new Date(a.datum) - new Date(b.datum))\n\t\t\t\t})\n\t\t\t\t\n\t\t\t\t// reset selection to empty\n\t\t\t\tthis.$refs.abgabeTable.tabulator.deselectRow()\n\n\t\t\t\tconst mappedData = this.mapProjekteToTableData(this.projektarbeiten)\n\t\t\t\t\n\t\t\t\tthis.$refs.abgabeTable.tabulator.setData(mappedData)\n\t\t\t\tthis.$refs.abgabeTable.tabulator.redraw(true)\n\t\t\t}).finally(()=>{\n\t\t\t\tthis.saving = false\n\t\t\t})\n\n\t\t\tthis.$refs.modalContainerAddSeries.hide()\n\t\t},\n\t\tmapProjekteToTableData(projekte) {\n\t\t\t// const now = luxon.DateTime.now();\n\t\t\treturn projekte.map(projekt => {\n\t\t\t\t\n\t\t\t\t// in assistenz context every projektarbeit should be allowed to be selected i guess\n\t\t\t\tprojekt.selectable = true;\n\t\t\t\t\n\t\t\t\tprojekt.prevTermin = null;\n\t\t\t\tprojekt.nextTermin = null;\n\n\t\t\t\tthis.checkAbgabetermineProjektarbeit(projekt)\n\n\t\t\t\tif(this.notenOptions && projekt.note) {\n\t\t\t\t\tconst opt = this.notenOptions.find(n => n.note == projekt.note)\n\t\t\t\t\n\t\t\t\t\t// TODO: mehrsprachig englisch\n\t\t\t\t\tprojekt.note_bez = opt.bezeichnung\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn {\n\t\t\t\t\t...projekt,\n\t\t\t\t\tabgabetermine: projekt.abgabetermine,\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\tstudent_uid: projekt.student_uid,\n\t\t\t\t\t\tprojektarbeit_id: projekt.projektarbeit_id,\n\t\t\t\t\t},\n\t\t\t\t\tpkz: this.buildPKZ(projekt),\n\t\t\t\t\tbeurteilung: projekt.beurteilungLink ?? null,\n\t\t\t\t\tsem: projekt.studiensemester_kurzbz,\n\t\t\t\t\tstg: this.buildStg(projekt),\n\t\t\t\t\tmail: this.buildMailToLink(projekt),\n\t\t\t\t\terstbetreuer: this.buildErstbetreuer(projekt),\n\t\t\t\t\tzweitbetreuer: this.buildZweitbetreuer(projekt),\n\t\t\t\t\ttyp: projekt.projekttyp_kurzbz,\n\t\t\t\t\ttitel: projekt.titel\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\tcreateInfoString(data) {\n\t\t\tlet str = '';\n\n\t\t\tdata.forEach(name => {\n\t\t\t\tstr += name\n\t\t\t\tstr += '; '\n\t\t\t})\n\n\t\t\treturn str\n\t\t},\n\t\tisPastDate(date) {\n\t\t\treturn new Date(date) < new Date(Date.now())\n\t\t},\n\t\tsetDetailComponent(details){\n\t\t\t\n\t\t\tconst pa = this.projektarbeiten.find(projektarbeit => projektarbeit.projektarbeit_id == details.projektarbeit_id)\n\n\t\t\tif(pa?.abgabetermine?.length) {\n\t\t\t\tthis.$api.call(ApiAbgabe.getSignaturStatusForProjektarbeitAbgaben(pa.abgabetermine.map(termin => termin.paabgabe_id), pa.student_uid))\n\t\t\t\t\t.then(res => {\n\t\t\t\t\t\tif(res.meta.status === 'success') {\n\t\t\t\t\t\t\tres.data.forEach(paabgabe => {\n\t\t\t\t\t\t\t\tconst termin = pa.abgabetermine.find(abgabe => abgabe.paabgabe_id == paabgabe.paabgabe_id)\n\t\t\t\t\t\t\t\tif(termin && paabgabe.signatur !== undefined) termin.signatur = paabgabe.signatur\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t}\n\t\t\t\n\t\t\tconst paIsBenotet = pa.note !== null\n\t\t\t\n\t\t\tpa.abgabetermine.forEach(termin => {\n\t\t\t\tif(typeof termin.note !== 'object') {\n\t\t\t\t\ttermin.note = this.allowedNotenOptions.find(opt => opt.note == termin.note)\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\ttermin.file = []\n\n\t\t\t\t// assistenz should be able to edit every abgabe\n\t\t\t\t// update 21-01-2026: actually blocking operations on finished projektarbeiten seems like a decent idea\n\t\t\t\ttermin.allowedToSave = paIsBenotet ? false : true\n\n\t\t\t\t// assistenz are not allowed to delete deadlines with existing submissions\n\t\t\t\ttermin.allowedToDelete = paIsBenotet ? false : !termin.abgabedatum\n\n\t\t\t\ttermin.bezeichnung = this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz === termin.paabgabetyp_kurzbz)\n\n\t\t\t})\n\t\t\t\n\t\t\tconst vorname = pa.vorname ?? pa.student_vorname\n\t\t\tconst nachname = pa.nachname ?? pa.student_nachname\n\t\t\tpa.student = `${vorname} ${nachname}`\n\n\t\t\tthis.selectedProjektarbeit = pa\n\n\t\t\tthis.$refs.modalContainerAbgabeDetail.show()\n\t\t},\n\t\tdateDiffInDays(datum){\n\t\t\tconst dateToday = luxon.DateTime.now().startOf('day');\n\n\t\t\tconst dateDatum = luxon.DateTime.fromISO(datum).startOf('day');\n\n\t\t\tconst duration = dateDatum.diff(dateToday, 'days');\n\n\t\t\treturn duration.values.days;\n\t\t},\n\t\tgetDateStyleClass(termin) {\n\t\t\tconst datum = new Date(termin.datum)\n\t\t\tconst abgabedatum = new Date(termin.abgabedatum)\n\n\t\t\ttermin.diffindays = this.dateDiffInDays(termin.datum)\n\n\t\t\tconst isLate = termin.abgabedatum && abgabedatum > datum;\n\n\t\t\t// GRADE STATUS\n\t\t\tif (termin.note) {\n\t\t\t\tif (termin.note.positiv) return 'bestanden';\n\t\t\t\treturn 'nichtbestanden';\n\t\t\t}\n\n\t\t\t// ACTION REQUIRED FOR GRADE\n\t\t\tif (termin.bezeichnung?.benotbar && datum < today) {\n\t\t\t\treturn 'beurteilungerforderlich';\n\t\t\t}\n\n\t\t\t// SUBMISSION STATUS\n\t\t\tif (termin.upload_allowed) {\n\t\t\t\tif (termin.abgabedatum) {\n\t\t\t\t\treturn isLate ? 'verspaetet' : 'abgegeben';\n\t\t\t\t}\n\n\t\t\t\t// no submission yet\n\t\t\t\tif (datum < today) return 'verpasst';\n\t\t\t\tif (termin.diffindays <= 12) return 'abzugeben';\n\t\t\t\treturn 'standard';\n\t\t\t}\n\n\t\t\t// GENERIC STATUS\n\t\t\treturn datum < today ? 'verpasst' : 'standard';\n\t\t},\n\t\topenTimeline(val) {\n\t\t\tconst projekt = this.projektarbeiten.find(p => p.projektarbeit_id == val.projektarbeit_id)\n\t\t\tif(!projekt) {\n\n\t\t\t\tthis.$fhcAlert.alertInfo('Keine projektarbeit gefunden')\n\t\t\t\t\n\t\t\t\treturn\n\t\t\t}\n\t\t\tprojekt.abgabetermine.forEach(termin => {\n\t\t\t\t// show note only on termine with abgabetypen which are benotbar\n\t\t\t\tconst terminTypOpt = this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz == termin.paabgabetyp_kurzbz)\n\t\t\t\ttermin.benotbar = terminTypOpt.benotbar \n\t\t\t})\n\t\t\tthis.timelineProjekt = projekt\n\t\t\tthis.$refs.drawer.show()\n\t\t},\n\t\tcenteredTextFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\t\t\tif(!val) return\n\n\t\t\treturn '
    ' +\n\t\t\t\t'

    '+val+'

    '\n\t\t},\n\t\tdetailFormatter(cell) {\n\t\t\treturn '
    ' +\n\t\t\t\t'
    '\n\t\t},\n\t\tmailFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\t\t\treturn '
    ' +\n\t\t\t\t'
    '\n\t\t},\n\t\ttimelineFormatter() {\n\t\t\treturn '
    ' +\n\t\t\t\t'
    '\n\t\t},\n\t\tbeurteilungFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\t\t\tif(val) {\n\t\t\t\treturn '
    ' +\n\t\t\t\t\t'
    '\n\t\t\t} else return '-'\n\t\t},\n\t\tpkzTextFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\n\t\t\treturn '
    ' +\n\t\t\t\t''+val+'
    '\n\t\t},\n\t\tabgabterminFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\n\t\t\tif(val) {\n\t\t\t\tlet icon = ''\n\t\t\t\tswitch(val.dateStyle) {\n\t\t\t\t\tcase 'verspaetet':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'verpasst':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'abzugeben':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'standard':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'abgegeben':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'beurteilungerfolderlich':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'bestanden':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'nichtbestanden':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tconst bezeichnung = val.bezeichnung?.bezeichnung ?? val.bezeichnung\n\t\t\t\t\n\t\t\t\treturn '
    ' +\n\t\t\t\t\t'
    ' +\n\t\t\t\t\t\ticon +\n\t\t\t\t\t'
    ' + \n\t\t\t\t\t'
    ' +\n\t\t\t\t\t\t'

    '+bezeichnung+' - '+ this.formatDate(val.datum)+'

    ' +\n\t\t\t\t\t'
    '+\n\t\t\t\t\t'
    '\n\n\t\t\t} else {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\t\n\t\t},\n\t\ttableResolve(resolve) {\n\t\t\tthis.tableBuiltResolve = resolve\n\t\t},\n\t\tbuildMailToLink(projekt) {\n\t\t\treturn 'mailto:' + projekt.student_uid +'@'+ this.domain\n\t\t},\n\t\tbuildPKZ(projekt) {\n\t\t\treturn `${projekt.student_uid} / ${projekt.matrikelnr}`\n\t\t},\n\t\tbuildStg(projekt) {\n\t\t\treturn (projekt.typ + projekt.kurzbz)?.toUpperCase()\n\t\t},\n\t\tbuildErstbetreuer(projekt) {\n\t\t\tif(projekt.erstbetreuer_full_name) return projekt.erstbetreuer_full_name\n\t\t\treturn projekt.betreuer_vorname + ' ' + projekt.betreuer_nachname\n\t\t},\n\t\tbuildZweitbetreuer(projekt) {\n\t\t\treturn projekt.zweitbetreuer_full_name ?? ''\n\t\t},\n\t\tasync setupData(data){\n\t\t\tthis.projektarbeiten = data[0]\n\t\t\tthis.domain = data[1]\n\t\t\t\n\t\t\tthis.tableData = this.mapProjekteToTableData(this.projektarbeiten)\n\n\t\t\tawait this.tableBuiltPromise\n\t\t\t\n\t\t\tthis.$refs.abgabeTable.tabulator.setData(this.tableData);\n\t\t},\n\t\tloadProjektarbeiten(all = false, callback) {\n\t\t\tthis.loading = true\n\t\t\tthis.$api.call(ApiAbgabe.getProjektarbeitenForStudiengang(\n\t\t\t\tthis.selectedStudiengangOption.studiengang_kz,\n\t\t\t\tthis.notenOptionFilter?.benotet ?? 0\n\t\t\t))\n\t\t\t\t.then(res => {\n\t\t\t\t\tif(res?.data) this.setupData(res.data)\n\t\t\t\t}).finally(() => {\n\t\t\t\tif(callback) {\n\t\t\t\t\tcallback()\n\t\t\t\t}\n\t\t\t}).finally(()=>{\n\t\t\t\tthis.loading=false\n\t\t\t})\n\t\t},\n\t\tloadAbgaben(details) {\n\t\t\treturn new Promise((resolve) => {\n\t\t\t\tthis.$api.call(ApiAbgabe.getStudentProjektabgaben(details))\n\t\t\t\t\t.then(res => {\n\t\t\t\t\t\tresolve(res)\n\t\t\t\t\t})\n\t\t\t})\n\t\t},\n\t\thandleUuidDefined(uuid) {\n\t\t\tthis.tabulatorUuid = uuid\n\t\t},\n\t\tcalcMaxTableHeight() {\n\t\t\tconst tableID = this.tabulatorUuid ? ('-' + this.tabulatorUuid) : ''\n\t\t\tconst tableDataSet = document.getElementById('filterTableDataset' + tableID);\n\t\t\tif(!tableDataSet) return\n\t\t\tconst rect = tableDataSet.getBoundingClientRect();\n\n\t\t\tthis.abgabeTableOptions.height = window.visualViewport.height - rect.top - 80\n\t\t\tthis.$refs.abgabeTable.tabulator.setHeight(this.abgabeTableOptions.height)\n\t\t},\n\t\tasync setupMounted() {\n\t\t\tthis.tableBuiltPromise = new Promise(this.tableResolve)\n\t\t\tawait this.tableBuiltPromise\n\t\t\t\n\t\t\tawait this.allConfigPromise\n\t\t\t\n\t\t\t// called through notenOptionFilter/selectedStudiengangOption watcher on startup\n\t\t\t// this.loadProjektarbeiten()\n\n\t\t\tthis.calcMaxTableHeight()\n\t\t},\n\t\tgetOptionDisabled(option) {\n\t\t\treturn !option.aktiv\n\t\t},\n\t},\n\tcomputed: {\n\t\temailItems() {\n\t\t\tconst menu = []\n\t\t\t\n\t\t\tif(this.ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT){\n\t\t\t\tmenu.push({\n\t\t\t\t\tlabel: this.$p.t('abgabetool/c4sendEmailStudierendev2', [this.uniqueStudentEmailCount]),\n\t\t\t\t\tcommand: this.sammelMailStudent\n\t\t\t\t})\n\t\t\t}\n\t\t\t\n\t\t\tif(this.ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER) {\n\t\t\t\tmenu.push({\n\t\t\t\t\tlabel: this.$p.t('abgabetool/c4sendEmailBetreuerv2', [this.uniqueBetreuerEmailCount]),\n\t\t\t\t\tcommand: this.sammelMailBetreuer\n\t\t\t\t})\n\t\t\t}\n\n\t\t\treturn menu\n\t\t},\n\t\tuniqueBetreuerEmailCount() {\n\t\t\tconst emails = new Set();\n\t\t\t\n\t\t\tthis.selectedData.forEach(row => {\n\t\t\t\tif (row.betreuer_mail) emails.add(row.betreuer_mail);\n\t\t\t\tif (row.zweitbetreuer_mail) emails.add(row.zweitbetreuer_mail);\n\t\t\t});\n\n\t\t\treturn emails.size;\n\t\t},\n\t\tuniqueStudentEmailCount() {\n\t\t\tconst emails = new Set();\n\n\t\t\tthis.selectedData.forEach(row => {\n\t\t\t\tif (row.student_uid) {\n\t\t\t\t\temails.add(row.student_uid); // actually dont need domain for this\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn emails.size;\n\t\t}\n\t},\n\twatch: {\n\t\t'serienTermin.bezeichnung'(newVal) {\n\t\t\tif(newVal?.paabgabetyp_kurzbz === 'qualgate1' || newVal?.paabgabetyp_kurzbz === 'qualgate2') {\n\t\t\t\tthis.serienTermin.kurzbz = newVal.bezeichnung\n\t\t\t}\n\n\t\t\tthis.serienTermin.upload_allowed = newVal.upload_allowed_default\n\t\t},\n\t\tselectedStudiengangOption(newVal, oldVal) {\n\t\t\t// implicitely avoids juggling around promises for created api calls,\n\t\t\t// since we need note & stg flags for loadProjektarbeiten\n\t\t\tif(this.notenOptionFilter !== null && this.selectedStudiengangOption !== null) {\n\t\t\t\tthis.loadProjektarbeiten()\n\t\t\t}\n\t\t},\n\t\tnotenOptionFilter(newVal) {\n\t\t\t// that single where clause is worth a decent load time so rather not filter tabulator but just \n\t\t\t// adapt the qry\n\t\t\tif(this.notenOptionFilter !== null && this.selectedStudiengangOption !== null) {\n\t\t\t\tthis.loadProjektarbeiten()\n\t\t\t}\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.loading = true\n\t\tthis.phrasenPromise = this.$p.loadCategory(['abgabetool', 'global'])\n\t\tthis.phrasenPromise.then(()=> {this.phrasenResolved = true})\n\t\t\n\t\t//TODO: SWITCH TO NOTEN API ONCE NOTENTOOL IS IN MASTER TO AVOID DUPLICATE API\n\t\tconst requests = [\n\t\t\tthis.$api.call(ApiAbgabe.getConfig()),\n\t\t\tthis.$api.call(ApiAbgabe.getStudiengaenge()),\n\t\t\tthis.$api.call(ApiStudiensemester.getAllStudiensemesterAndAktOrNext()),\n\t\t\tthis.$api.call(ApiAbgabe.getNoten()),\n\t\t\tthis.$api.call(ApiAbgabe.getPaAbgabetypen())\n\t\t];\n\n\t\tthis.allConfigPromise = Promise.allSettled(requests)\n\t\t\t.then((results) => {\n\t\t\t\t// results is an array of { status: 'fulfilled'|'rejected', value?: any, reason?: any }\n\n\t\t\t\t// 1. Config\n\t\t\t\tif (results[0].status === 'fulfilled') {\n\t\t\t\t\tconst res = results[0].value;\n\t\t\t\t\tthis.turnitin_link = res.data?.turnitin_link;\n\t\t\t\t\tthis.old_abgabe_beurteilung_link = res.data?.old_abgabe_beurteilung_link;\n\t\t\t\t\tthis.ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT = res.data?.ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT;\n\t\t\t\t\tthis.ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER = res.data?.ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER;\n\t\t\t\t}\n\n\t\t\t\t// 2. Studiengänge\n\t\t\t\tif (results[1].status === 'fulfilled') {\n\t\t\t\t\tconst res = results[1].value;\n\t\t\t\t\tthis.studiengaengeOptions = res.data;\n\t\t\t\t\tif (this.studiengaengeOptions?.length) {\n\t\t\t\t\t\tthis.selectedStudiengangOption = this.stg_kz_prop\n\t\t\t\t\t\t\t? res.data.find(stgOpt => stgOpt.studiengang_kz == this.stg_kz_prop)\n\t\t\t\t\t\t\t: res.data[0];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// 3. Studiensemester\n\t\t\t\tif (results[2].status === 'fulfilled') {\n\t\t\t\t\tconst res = results[2].value;\n\t\t\t\t\tthis.allSem = res.data[0];\n\t\t\t\t\tconst all = { studiensemester_kurzbz: this.$p.t('abgabetool/c4all') };\n\t\t\t\t\tthis.curSem = all;\n\t\t\t\t\tthis.studiensemesterOptions = [all, ...this.allSem];\n\t\t\t\t}\n\n\t\t\t\t// 4. Noten\n\t\t\t\tif (results[3].status === 'fulfilled') {\n\t\t\t\t\tconst res = results[3].value;\n\t\t\t\t\tif (res.meta?.status === 'success') {\n\t\t\t\t\t\tthis.notenOptions = res.data[0];\n\t\t\t\t\t\tthis.allowedNotenOptions = this.notenOptions.filter(\n\t\t\t\t\t\t\topt => res.data[1].includes(opt.note)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tthis.notenOptionsNonFinal = this.notenOptions.filter(\n\t\t\t\t\t\t\topt => res.data[2].includes(opt.note)\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.allowedNotenFilterOptions = [\n\t\t\t\t\t\t{ bezeichnung: Vue.computed(() => this.$p.t('abgabetool/keineNoteEingetragen')), benotet: 0 },\n\t\t\t\t\t\t{ bezeichnung: Vue.computed(() => this.$p.t('abgabetool/c4benotet')), benotet: 1 },\n\t\t\t\t\t\t{ bezeichnung: Vue.computed(() => this.$p.t('abgabetool/showAll')), benotet: -1 }\n\t\t\t\t\t];\n\t\t\t\t\tthis.notenOptionFilter = this.allowedNotenFilterOptions[0];\n\t\t\t\t}\n\n\t\t\t\t// 5. Abgabetypen\n\t\t\t\tif (results[4].status === 'fulfilled') {\n\t\t\t\t\tconst res = results[4].value;\n\t\t\t\t\tthis.abgabeTypeOptions = res.data;\n\t\t\t\t}\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tthis.loading = false;\n\t\t\t});\n\t},\n\tmounted() {\n\t\tthis.setupMounted()\n\t},\n\ttemplate: `\n\t\n `,\n};\n\nexport default AbgabetoolAssistenz;\n","import {CoreFilterCmpt} from \"../../../components/filter/Filter.js\";\nimport ApiAbgabe from '../../../api/factory/abgabe.js'\n\nexport const DeadlineOverview = {\n\tname: \"DeadlineOverview\",\n\tcomponents: {\n\t\tCoreFilterCmpt,\n\t},\n\tprops: {\n\t\tperson_uid_prop: {\n\t\t\tdefault: null\t\n\t\t},\n\t\tviewData: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t\tdefault: () => ({name: '', uid: ''}),\n\t\t\tvalidator(value) {\n\t\t\t\treturn value && value.name && value.uid\n\t\t\t}\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tfullName: null, // TODO: fetch this somewhere\n\t\t\tdeadlines: null,\n\t\t\ttabulatorUuid: Vue.ref(0),\n\t\t\ttableBuiltResolve: null,\n\t\t\ttableBuiltPromise: null,\n\t\t\tphrasenPromise: null,\n\t\t\tphrasenResolved: false,\n\t\t\tdeadlineTableOptions: {\n\t\t\t\theight: 700,\n\t\t\t\tindex: 'projektarbeit_id',\n\t\t\t\tlayout: 'fitColumns',\n\t\t\t\tplaceholder: Vue.computed(() => this.$p.t('global/noDataAvailable')),\n\t\t\t\tcolumns: [\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4zieldatum'))), field: 'datum', formatter: this.centeredTextFormatter, widthGrow: 1, tooltip: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4fixterminv4'))), field: 'fixterminstring', formatter: this.centeredTextFormatter, widthGrow: 1, tooltip: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4abgabetyp'))), field: 'typ_bezeichnung', formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4abgabekurzbz'))), field: 'kurzbz', formatter: this.centeredTextFormatter, widthGrow: 3},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('person/studentIn'))), field: 'student', formatter: this.centeredTextFormatter, widthGrow: 2},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4stg'))), field: 'stg', formatter: this.centeredTextFormatter,widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4sem'))), field: 'semester', formatter: this.centeredTextFormatter, widthGrow: 1}\n\t\t\t\t],\n\t\t\t\tpersistence: false,\n\t\t\t},\n\t\t\tdeadlineTableEventHandlers: [{\n\t\t\t\tevent: \"tableBuilt\",\n\t\t\t\thandler: async () => {\n\t\t\t\t\tthis.tableBuiltResolve()\n\t\t\t\t}\n\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tevent: \"cellClick\",\n\t\t\t\t\thandler: async (e, cell) => {\n\n\t\t\t\t\t\tif(cell.getColumn().getField() === \"details\") {\n\t\t\t\t\t\t\tconst val = cell.getValue()\n\n\t\t\t\t\t\t\tif(val.mode === 'detailTermine') {\n\t\t\t\t\t\t\t\tthis.setDetailComponent(cell.getValue())\n\t\t\t\t\t\t\t} else if (val.mode === 'beurteilungDownload') {\n\t\t\t\t\t\t\t\tconst pdfExportLink = FHC_JS_DATA_STORAGE_OBJECT.app_root + 'cis/private/pdfExport.php?xml=projektarbeitsbeurteilung.xml.php&xsl=Projektbeurteilung&betreuerart_kurzbz='+val.betreuerart_kurzbz+'&projektarbeit_id='+val.projektarbeit_id+'&person_id=' + val.betreuer_person_id\n\t\t\t\t\t\t\t\t// const pdfExportLink2 = FHC_JS_DATA_STORAGE_OBJECT.app_root + 'cis/private/lehre/projektbeurteilungDocumentExport.php?betreuerart_kurzbz='+val.betreuerart_kurzbz+'&projektarbeit_id='+val.projektarbeit_id+'&person_id=' + val.betreuer_person_id\n\t\t\t\t\t\t\t\twindow.open(pdfExportLink, '_blank')\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else if (cell.getColumn().getField() === \"beurteilung\") {\n\t\t\t\t\t\t\tconst val = cell.getValue()\n\n\t\t\t\t\t\t\tif(val != '-') window.open(val, '_blank')\n\t\t\t\t\t\t}\n\t\t\t\t\t\te.stopPropagation()\n\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]};\n\t},\n\tmethods: {\n\t\tcenteredTextFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\n\t\t\treturn '
    ' +\n\t\t\t\t'

    '+val+'

    '\n\t\t},\n\t\ttableResolve(resolve) {\n\t\t\tthis.tableBuiltResolve = resolve\n\t\t},\n\t\tloadDeadlines() {\n\t\t\tthis.$api.call(ApiAbgabe.fetchDeadlines(this.person_uid_prop ?? null))\n\t\t\t\t.then(res => {\n\t\t\t\t\tif(res?.data) this.setupData(res.data)\n\t\t\t\t})\n\t\t},\n\t\tsetupData(data) {\n\t\t\tthis.deadlines = data\n\t\t\t\n\t\t\tthis.deadlines.forEach(dl => {\n\t\t\t\tdl.student = (dl.stud_titelpre ? (dl.stud_titelpre + ' ') :'') + dl.stud_vorname + ' ' + dl.stud_nachname + (dl.stud_titelpost ? (' ' + dl.stud_titelpost) :'')\n\t\t\t\tdl.fixterminstring = dl.fixtermin ? this.$p.t('abgabetool/c4yes') : this.$p.t('abgabetool/c4no')\n\t\t\t})\n\n\t\t\tthis.$refs.deadlineTable.tabulator.setColumns(this.deadlineTableOptions.columns)\n\t\t\tthis.$refs.deadlineTable.tabulator.setData(this.deadlines);\n\t\t},\n\t\thandleUuidDefined(uuid) {\n\t\t\tthis.tabulatorUuid = uuid\n\t\t},\n\t\tcalcMaxTableHeight() {\n\t\t\tconst tableID = this.tabulatorUuid ? ('-' + this.tabulatorUuid) : ''\n\t\t\tconst tableDataSet = document.getElementById('filterTableDataset' + tableID);\n\t\t\tif(!tableDataSet) return\n\t\t\tconst rect = tableDataSet.getBoundingClientRect();\n\n\t\t\tthis.deadlineTableOptions.height = window.visualViewport.height - rect.top - 30\n\t\t\tthis.$refs.deadlineTable.tabulator.setHeight(this.deadlineTableOptions.height)\n\t\t},\n\t\tasync setupMounted() {\n\t\t\tthis.tableBuiltPromise = new Promise(this.tableResolve)\n\t\t\tawait this.tableBuiltPromise\n\n\t\t\tthis.loadDeadlines()\n\t\t\tthis.calcMaxTableHeight()\n\t\t}\n\t},\n\twatch: {\n\n\t},\n\tcomputed: {\n\n\t},\n\tcreated() {\n\t\tthis.phrasenPromise = this.$p.loadCategory(['abgabetool', 'global'])\n\t\tthis.phrasenPromise.then(()=> {this.phrasenResolved = true})\n\t},\n\tmounted() {\n\t\tthis.setupMounted()\n\t},\n\ttemplate: `\n\t\t

    {{$p.t('abgabetool/deadlinesTitle')}} {{ fullName ? ('-' + fullName) : ''}}

    \n\t\t
    \n\t\t\t\n\t\t \n `,\n};\n\nexport default DeadlineOverview;\n","import LvUebersicht from \"../Mylv/LvUebersicht.js\";\n\n\nexport default {\n\tdata(){\n\t\treturn {\n\t\t\tstudienSemester :[],\n\t\t\tselectedStudiensemester: null,\n\t\t\tstudiengaenge:[],\n\t\t\tselectedStudiengang:null,\n\t\t\tstudienOrdnung: [],\n\t\t\tselectedStudienordnung: null,\n\t\t\tsemester:[],\n\t\t\tselectedSemester:null,\n\t\t\tlehrveranstaltungen: [],\n\t\t\tselectedLehrveranstaltung: null,\n\t\t\tmenu:null,\n\t\t}\n\t},\n\tprovide(){\n\t\treturn {\n\t\t\tstudium_studiengang : Vue.computed(()=> this.selectedStudiengang),\n\t\t\tstudium_studiensemester: Vue.computed(() => this.selectedStudiensemester),\n\t\t\tstudium_semester: Vue.computed(() => this.selectedSemester),\n\t\t\tstudium_studienordnung: Vue.computed(() => this.selectedStudienordnung),\n\n\t\t}\n\t},\n\tcomponents: {\n\t\tLvUebersicht,\n\t},\n\twatch:{\n\t\tselectedStudiensemester: function(newVal, oldVal){\n\t\t\tif(newVal && newVal != oldVal){\n\t\t\t\tconst studiensemester =this.getDataFromLocalStorage(\"sudiensemester\");\n\t\t\t\tif (newVal && (!studiensemester || (studiensemester && studiensemester != newVal))){\n\t\t\t\t\tthis.storeDataToLocalStorage(\"sudiensemester\", newVal);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tselectedSemester: function (newVal, oldVal) {\n\t\t\tif (newVal && newVal != oldVal) {\n\t\t\t\tconst semester = this.getDataFromLocalStorage(\"semester\");\n\t\t\t\tif (!semester || (semester && semester != newVal)) {\n\t\t\t\t\tthis.storeDataToLocalStorage(\"semester\", newVal);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tselectedStudiengang: function (newVal, oldVal) {\n\t\t\tif (newVal && newVal != oldVal) {\n\t\t\t\tconst studiengang = this.getDataFromLocalStorage(\"studiengang\");\n\t\t\t\tif (!studiengang || (studiengang && studiengang != newVal)) {\n\t\t\t\t\tthis.storeDataToLocalStorage(\"studiengang\", JSON.stringify(newVal));\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tselectedStudienordnung: function (newVal, oldVal) {\n\t\t\tif (newVal && newVal != oldVal) {\n\t\t\t\tconst studienordnung = this.getDataFromLocalStorage(\"studienordnung\");\n\t\t\t\tif (!studienordnung || (studienordnung && studienordnung != newVal)) {\n\t\t\t\t\tthis.storeDataToLocalStorage(\"studienordnung\", JSON.stringify(newVal));\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t},\n\tmethods:{\n\t\tchangeStudiensemester(value){\n\t\t\tlet studiensemester = this.$refs.studiensemester;\n\t\t\tstudiensemester.selectedIndex = (studiensemester.selectedIndex + value + studiensemester.options.length) % studiensemester.options.length;\n\t\t\tthis.changeSelectedStudienSemester(studiensemester.value);\n\t\t},\n\t\tchangeStudiengang(value) {\n\t\t\tlet studiengang = this.$refs.studiengaenge;\n\t\t\tstudiengang.selectedIndex = (studiengang.selectedIndex + value + studiengang.options.length) % studiengang.options.length;\n\t\t\tthis.changeSelectedStudienGang(studiengang.value);\n\t\t},\n\t\tchangeSemester(value) {\n\t\t\tlet semester = this.$refs.semester;\n\t\t\tsemester.selectedIndex = (semester.selectedIndex + value + semester.options.length) % semester.options.length;\n\t\t\tthis.changeSelectedSemester(semester.value);\n\t\t},\n\t\tchangeStudienordnung(value) {\n\t\t\tlet studienordnung = this.$refs.studienordnung;\n\t\t\tlet newSelectIndex = (studienordnung.selectedIndex + value + studienordnung.options.length) % studienordnung.options.length;\n\t\t\tif(studienordnung.options[newSelectIndex].disabled){\n\t\t\t\tnewSelectIndex = (newSelectIndex + value + studienordnung.options.length) % studienordnung.options.length;\n\t\t\t}\n\t\t\tstudienordnung.selectedIndex = newSelectIndex;\n\t\t\tthis.changeSelectedStudienPlan(studienordnung.value);\n\t\t},\n\t\t\n\t\tstoreDataToLocalStorage(key,value){\n\t\t\tlocalStorage.setItem(key, value);\n\t\t},\n\t\tgetDataFromLocalStorage(key){\n\t\t\tconst value = localStorage.getItem(key);\n\t\t\treturn value;\n\t\t},\n\t\tchangeSelectedStudienSemester(studiensemester_kurzbz) {\n\t\t\tthis.$fhcApi.factory.studium.getAllStudienSemester(studiensemester_kurzbz, this.selectedStudiengang, this.selectedSemester, this.selectedStudienordnung)\n\t\t\t\t.then(data => data.data)\n\t\t\t\t.then(res => {\n\t\t\t\t\tthis.extractPropertyValues(res);\n\t\t\t\t})\n\t\t},\n\t\tchangeSelectedStudienGang(studiengang_kz) {\n\t\t\tthis.$fhcApi.factory.studium.getAllStudienSemester(this.selectedStudiensemester, studiengang_kz, this.selectedSemester, this.selectedStudienordnung)\n\t\t\t\t.then(data => data.data)\n\t\t\t\t.then(res => {\n\t\t\t\t\tthis.extractPropertyValues(res);\n\t\t\t\t})\n\t\t},\n\t\tchangeSelectedSemester(semester) {\n\t\t\tthis.$fhcApi.factory.studium.getAllStudienSemester(this.selectedStudiensemester, this.selectedStudiengang, semester, this.selectedStudienordnung)\n\t\t\t\t.then(data => data.data)\n\t\t\t\t.then(res => {\n\t\t\t\t\tthis.extractPropertyValues(res);\n\t\t\t\t})\n\t\t},\n\t\tchangeSelectedStudienPlan(studienplan_id) {\n\t\t\tthis.$fhcApi.factory.studium.getAllStudienSemester(this.selectedStudiensemester, this.selectedStudiengang, this.selectedSemester, studienplan_id)\n\t\t\t\t.then(data => data.data)\n\t\t\t\t.then(res => {\n\t\t\t\t\tthis.extractPropertyValues(res);\n\t\t\t\t})\n\t\t},\n\t\topenLvUebersicht(lehrveranstaltung) {\n\t\t\tthis.selectedLehrveranstaltung = lehrveranstaltung;\n\t\t\t//convert lehrveranstaltung properties for compatibility with LvPlan LvModal\n\t\t\tthis.selectedLehrveranstaltung.type =\"lehreinheit\";\n\t\t\tthis.selectedLehrveranstaltung.lehreinheit_id = this.selectedLehrveranstaltung.lehrveranstaltung_id;\n\t\t\tif(this.selectedLehrveranstaltung){\n\t\t\t\tVue.nextTick(()=>{\n\t\t\t\t\tthis.$refs.lvUebersicht.show();\n\t\t\t\t})\n\t\t\t}\n\t\t\t\n\t\t},\n\t\tsortStudienSemester(studienSemester){\n\t\t\tlet regex = new RegExp(/^(WS|SS)([0-9]{4})/);\n\t\t\tstudienSemester.sort((sem1,sem2)=>{\n\t\t\t\tlet [sem1Match, sem1Semester, sem1Year] = sem1.studiensemester_kurzbz.match(regex);\n\t\t\t\tlet [sem2Match, sem2Semester, sem2Year] = sem2.studiensemester_kurzbz.match(regex);\n\t\t\t\tif(sem1Year == sem2Year){\n\t\t\t\t\treturn sem1Semester > sem2Semester? -1:1;\n\t\t\t\t}\n\t\t\t\treturn sem1Year > sem2Year? -1:1;\n\t\t\t})\n\t\t},\n\t\tsetHash(val) {\n\t\t\t// TODO: make this a router param to enable history\n\t\t\tlocation.hash = val;\n\t\t},\n\t\textractPropertyValues(res){\n\t\t\tlet { studienSemester, studiengang, semester, studienplan, lehrveranstaltungen } = res;\n\t\t\tthis.sortStudienSemester(studienSemester.all);\n\t\t\tthis.studienSemester = studienSemester.all;\n\t\t\tthis.selectedStudiensemester = studienSemester.preselected.studiensemester_kurzbz;\n\n\t\t\tthis.studiengaenge = studiengang.all;\n\t\t\tthis.selectedStudiengang = studiengang.preselected?.studiengang_kz;\n\n\t\t\tthis.semester = semester.all;\n\t\t\tthis.selectedSemester = semester?.preselected;\n\n\t\t\tthis.studienOrdnung = studienplan.all;\n\t\t\tthis.selectedStudienordnung = studienplan.preselected?.studienplan_id;\n\n\t\t\tthis.lehrveranstaltungen = lehrveranstaltungen;\n\t\t\tthis.lehrveranstaltungen.sort((lv1, lv2) => {\n\t\t\t\tif (lv1.bezeichnung.toLowerCase() > lv2.bezeichnung.toLowerCase()) {\n\t\t\t\t\treturn 1;\n\t\t\t\t} else if (lv1.bezeichnung.toLowerCase() < lv2.bezeichnung.toLowerCase()) {\n\t\t\t\t\treturn -1;\n\t\t\t\t} else {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.lehrveranstaltungen.forEach((lehrveranstaltung)=>{\n\t\t\t\tlehrveranstaltung.lehrveranstaltungen.sort((lv1,lv2)=>{\n\t\t\t\t\tif (lv1.bezeichnung.toLowerCase() > lv2.bezeichnung.toLowerCase()) {\n\t\t\t\t\t\treturn 1;\n\t\t\t\t\t} else if (lv1.bezeichnung.toLowerCase() < lv2.bezeichnung.toLowerCase()) {\n\t\t\t\t\t\treturn -1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t\t},\n\t\tstudienordnungTitel(studienordnung){\n\t\t\tif(!studienordnung) return \"\";\n\t\t\treturn `${studienordnung?.bezeichnung}-${studienordnung?.orgform_kurzbz} ( ${studienordnung?.orgform_bezeichnung}, ${studienordnung?.sprache} )`;\n\t\t},\n\t\tstudiengangTitel(studiengang) {\n\t\t\tif (!studiengang) return \"\";\n\t\t\treturn `${studiengang?.kurzbzlang} (${studiengang?.bezeichnung})`;\n\t\t},\n\t\tstudiensemesterTitel(studiensemester){\n\t\t\tif (!studiensemester) return \"\";\n\t\t\tlet studiensemester_regex = new RegExp(/^(WS|SS)([0-9]{4})/);\n\t\t\tlet match = studiensemester.match(studiensemester_regex);\n\t\t\tswitch(match[1]){\n\t\t\t\tcase \"WS\":\n\t\t\t\t\treturn `Wintersemester ${match[2]}`;\n\t\t\t\tcase \"SS\":\n\t\t\t\t\treturn `Sommersemester ${match[2]}`;\t\n\t\t\t\tdefault:\n\t\t\t\t\treturn `${studiensemester}`;\n\t\t\t}\n\t\t}\n\t},\n\n\tcomputed:{\n\t\tselectedLehrveranstaltungTitel(){\n\t\t\tconst studiengang = this.studiengaenge.find((studiengang) => studiengang.studiengang_kz == this.selectedStudiengang);\n\t\t\treturn `${this.selectedLehrveranstaltung?.bezeichnung} ${this.selectedLehrveranstaltung?.lehrform_kurzbz} / ${studiengang.kurzbzlang}-${this.selectedSemester} ${this.selectedLehrveranstaltung?.orgform_kurzbz} (${this.selectedStudiensemester})`;\n\t\t},\n\t\tcomputedStudienOrdnung(){\n\t\t\tif(!this.studienOrdnung) return null;\n\t\t\treturn Object.values(this.studienOrdnung).reduce((carry, item)=>{\n\t\t\t\tif(!carry[item.bezeichnung]){\n\t\t\t\t\tcarry[item.bezeichnung] = [];\n\t\t\t\t}\n\t\t\t\tcarry[item.bezeichnung].push(item);\n\t\t\t\treturn carry;\n\t\t\t},{});\n\t\t},\n\t\tcomputedStudienOrdnungSelectValues() {\n\t\t\tif (!this.computedStudienOrdnung) return null;\n\t\t\tlet result = [];\n\t\t\tObject.entries(this.computedStudienOrdnung).forEach(([key,value])=>{\n\t\t\t\tresult.push({\n\t\t\t\t\tbezeichnung: `Studienordnung: ${key}`,\n\t\t\t\t\tdisabled: true,\n\t\t\t\t});\n\t\t\t\tvalue.forEach((studienplan)=>{\n\t\t\t\t\tresult.push({\n\t\t\t\t\t\tstudienplan:studienplan,\n\t\t\t\t\t\tdiabled: false,\n\t\t\t\t\t\tbezeichnung: `${studienplan?.bezeichnung}-${studienplan?.orgform_kurzbz} ( ${studienplan?.orgform_bezeichnung}, ${studienplan?.sprache} )`\n\t\t\t\t\t\t\t\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t});\n\t\t\treturn result;\n\t\t},\n\t},\n\t\n\tcreated(){\n\n\t\tconst studiensemester = this.getDataFromLocalStorage(\"sudiensemester\") ?? undefined;\n\t\tconst studiengang = JSON.parse(this.getDataFromLocalStorage(\"studiengang\")) ?? undefined;\n\t\tconst semester = this.getDataFromLocalStorage(\"semester\") ?? undefined;\n\t\tconst studienordnung = JSON.parse(this.getDataFromLocalStorage(\"studienordnung\")) ?? undefined;\n\n\t\t// only fetch default data if no data is stored in the local storage\n\t\t\n\t\tthis.$fhcApi.factory.studium.getAllStudienSemester(studiensemester, studiengang, semester, studienordnung)\n\t\t.then(data => data.data)\n\t\t.then(res => {\n\t\t\tthis.extractPropertyValues(res);\n\t\t})\n\n\t},\n\ttemplate: `\n\t
    \n\t

    Studium

    \n\t
    \n\t\n\t\t\n\t\n\t
    \n\t\t
    \n\t\t
    Studiensemester:
    \n\t\t
    \n\t\t\t\n\t\t\t\n\t\t\t\n\t\t
    \n\t\t
    \n\n\t\t
    \n\t\t
    Studiengang:
    \n\t\t
    \n\t\t\t\n\t\t\t\n\t\t\t\n\t\t
    \n\t\t
    \n\n\t\t
    \n\t\t
    Semester:
    \n\t\t
    \n\t\t\t\n\t\t\t\n\t\t\t\n\t\t
    \n\t\t
    \n\n\t\t
    \n\t\t
    Studienordnung:
    \n\t\t
    \n\t\t\t\n\t\t\t\n\t\t\t\n\t\t
    \n\t\t
    \n\t
    \n\n\t
    \n\n\t
    \n\t\n\t
    \n\n\n\t
    \n\t\n\t`\n};","\nexport default {\n\t\t\n\tloadRenderers() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/RendererLoader/GetRenderers',\n\t\t\tparams: {\n\t\t\t}\n\t\t};\n\t},\n}","/**\n * Copyright (C) 2025 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tinfo(app, path) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/RouteInfo/info',\n\t\t\tparams: {\n\t\t\t\tapp: app,\n\t\t\t\tpath: path\n\t\t\t}\n\t\t};\n\t}\n};","import FhcDashboard from '../../components/Dashboard/Dashboard.js';\nimport PluginsPhrasen from '../../plugins/Phrasen.js';\nimport Theme from '../../plugins/Theme.js';\nimport contrast from '../../directives/contrast.js';\nimport {setScrollbarWidth} from \"../../helpers/CssVarCalcHelpers.js\";\nimport LvPlan from \"../../components/Cis/LvPlan/Lehrveranstaltung.js\";\nimport MyLvPlan from \"../../components/Cis/LvPlan/Personal.js\";\nimport MylvStudent from \"../../components/Cis/Mylv/Student.js\";\nimport Profil from \"../../components/Cis/Profil/Profil.js\";\nimport Raumsuche from \"../../components/Cis/Raumsuche/Raumsuche.js\";\nimport CmsNews from \"../../components/Cis/Cms/News.js\";\nimport CmsContent from \"../../components/Cis/Cms/Content.js\";\nimport Info from \"../../components/Cis/Mylv/Semester/Studiengang/Lv/Info.js\";\nimport RoomInformation, {DEFAULT_MODE_RAUMINFO} from \"../../components/Cis/Mylv/RoomInformation.js\";\nimport AbgabetoolStudent from \"../../components/Cis/Abgabetool/AbgabetoolStudent.js\";\nimport AbgabetoolMitarbeiter from \"../../components/Cis/Abgabetool/AbgabetoolMitarbeiter.js\";\nimport AbgabetoolAssistenz from \"../../components/Cis/Abgabetool/AbgabetoolAssistenz.js\";\nimport DeadlineOverview from \"../../components/Cis/Abgabetool/DeadlineOverview.js\";\nimport Studium from \"../../components/Cis/Studium/Studium.js\";\n\nimport ApiRenderers from '../../api/factory/renderers.js';\nimport ApiRouteInfo from '../../api/factory/routeinfo.js';\nimport {capitalize} from \"../../helpers/StringHelpers.js\";\n\nconst ciPath = FHC_JS_DATA_STORAGE_OBJECT.app_root.replace(/(https:|)(^|\\/\\/)(.*?\\/)/g, '') + FHC_JS_DATA_STORAGE_OBJECT.ci_router;\n\nconst router = VueRouter.createRouter({\n\thistory: VueRouter.createWebHistory(`/${ciPath}`),\n\troutes: [\n\t\t{\n\t\t\tpath: `/Cis/Studium`,\n\t\t\tname: 'Studium',\n\t\t\tcomponent: Studium,\n\t\t\tprops: true\n\t\t},\n\t\t{\n\t\t\tpath: `/Cis/Profil/View/:uid`,\n\t\t\tname: 'ProfilView',\n\t\t\tcomponent: Profil,\n\t\t\tprops: true\n\t\t},\n\t\t{\n\t\t\tpath: `/Cis/Profil`,\n\t\t\tname: 'Profil',\n\t\t\tcomponent: Profil,\n\t\t\tprops: true\n\t\t},\n\t\t{\n\t\t\tpath: `/Cis/Abgabetool/Student/:student_uid_prop?`,\n\t\t\tname: 'AbgabetoolStudent',\n\t\t\tcomponent: AbgabetoolStudent,\n\t\t\tprops: true\n\t\t},\n\t\t{\n\t\t\tpath: `/Cis/Abgabetool/Mitarbeiter`,\n\t\t\tname: 'AbgabetoolMitarbeiter',\n\t\t\tcomponent: AbgabetoolMitarbeiter,\n\t\t\tprops: true\n\t\t},\n\t\t{\n\t\t\tpath: `/Cis/Abgabetool/Assistenz/:stg_kz_prop?`,\n\t\t\tname: 'AbgabetoolAssistenz',\n\t\t\tcomponent: AbgabetoolAssistenz,\n\t\t\tprops: true\n\t\t},\n\t\t{\n\t\t\tpath: `/Cis/Abgabetool/Deadlines/:person_uid_prop?`,\n\t\t\tname: 'DeadlineOverview',\n\t\t\tcomponent: DeadlineOverview,\n\t\t\tprops: true\n\t\t},\n\t\t{\n\t\t\tpath: `/Cis/Raumsuche`,\n\t\t\tname: 'Raumsuche',\n\t\t\tcomponent: Raumsuche,\n\t\t\tprops: true\n\t\t},\n\t\t// Redirect old links to new format\n\t\t{\n\t\t\tpath: \"/CisVue/Cms/getRoomInformation/:ort_kurzbz\",\n\t\t\tname: \"RoomInformationOld\",\n\t\t\tcomponent: RoomInformation,\n\t\t\tredirect: (to) => {\n\t\t\t\treturn { // redirect to longer Rauminfo url and map params\n\t\t\t\t\tname: \"RoomInformation\",\n\t\t\t\t\tparams: { // in this case always populate other params since they are not optional\n\t\t\t\t\t\tort_kurzbz: to.params.ort_kurzbz,\n\t\t\t\t\t\tmode: DEFAULT_MODE_RAUMINFO,\n\t\t\t\t\t\tfocus_date: new Date().toISOString().split(\"T\")[0]\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tpath: `/CisVue/Cms/getRoomInformation/:mode/:focus_date/:ort_kurzbz`,\n\t\t\tname: 'RoomInformation',\n\t\t\tcomponent: RoomInformation,\n\t\t\tprops: (route) => { // validate and set mode/focus date if for some reason missing\n\t\t\t\tconst validModes = [\"Month\", \"Week\", \"Day\"];\n\n\t\t\t\t// check mode string\n\t\t\t\tconst mode = route.params.mode &&\n\t\t\t\tvalidModes.includes(route.params.mode.charAt(0).toUpperCase() + route.params.mode.slice(1).toLowerCase())\n\t\t\t\t\t? route.params.mode.charAt(0).toUpperCase() + route.params.mode.slice(1).toLowerCase()\n\t\t\t\t\t: DEFAULT_MODE_RAUMINFO;\n\n\t\t\t\t// default to today date if not provided\n\t\t\t\tconst d = new Date(route.params.focus_date)\n\t\t\t\tconst focus_date = !isNaN(d) ? route.params.focus_date : new Date().toISOString().split(\"T\")[0];\n\n\t\t\t\t// for consistency reasons format the props into one object but actually use a new name to we dont collide with\n\t\t\t\t// existing viewData declaration written from codeigniter 3 into routerview tag\n\t\t\t\treturn {\n\t\t\t\t\tpropsViewData: {\n\t\t\t\t\t\tmode,\n\t\t\t\t\t\tfocus_date,\n\t\t\t\t\t\tort_kurzbz: route.params.ort_kurzbz\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t},\n\t\t\tbeforeEnter: (to, from, next) => {\n\t\t\t\t// missing mode or focus_date -> set defaults\n\t\t\t\tif (!to.params.mode || !to.params.focus_date) {\n\t\t\t\t\tnext({\n\t\t\t\t\t\tname: \"RoomInformation\",\n\t\t\t\t\t\tparams: {\n\t\t\t\t\t\t\tmode: to.params.mode || DEFAULT_MODE_RAUMINFO,\n\t\t\t\t\t\t\tfocus_date: to.params.focus_date || new Date().toISOString().split(\"T\")[0],\n\t\t\t\t\t\t\tort_kurzbz: route.params.ort_kurzbz\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tnext();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tpath: `/CisVue/Cms/Content/:content_id`,\n\t\t\tname: 'Content',\n\t\t\tcomponent: CmsContent,\n\t\t\tprops: true\n\t\t},\n\t\t{\n\t\t\tpath: `/CisVue/Cms/News`,\n\t\t\tname: 'News',\n\t\t\tcomponent: CmsNews,\n\t\t\tprops: true\n\t\t},\n\t\t{\n\t\t\tpath: `/Cis/MyLv/:studiensemester?`,\n\t\t\tname: 'MyLv',\n\t\t\tcomponent: MylvStudent,\n\t\t\tprops: true,\n\t\t},\n\t\t{\n\t\t\tpath: `/Cis/MyLv/Info/:studien_semester/:lehrveranstaltung_id`,\n\t\t\tname: 'LvInfo',\n\t\t\tcomponent: Info,\n\t\t\tprops: true\n\t\t},\n\t\t// Redirect old links to new format\n\t\t{\n\t\t\t// only trigger on first param being numeric to avoid paths like \"LvPlan/Month\" entering here\n\t\t\tpath: \"/Cis/LvPlan/:lv_id(\\\\d+)\", \n\t\t\tname: \"LvPlanOld\",\n\t\t\tcomponent: LvPlan,\n\t\t\tredirect(to) {\n\t\t\t\tconst route = Vue.unref(router.currentRoute);\n\t\t\t\tconst { mode, focus_date } = route.params; // keep mode and focus_date if available\n\t\t\t\treturn { // redirect to longer LvPlan url and map params\n\t\t\t\t\tname: \"LvPlan\",\n\t\t\t\t\tparams: {\n\t\t\t\t\t\tmode,\n\t\t\t\t\t\tfocus_date,\n\t\t\t\t\t\tlv_id: to.params.lv_id\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tpath: `/Cis/LvPlan/:mode?/:focus_date?/:lv_id?`,\n\t\t\tname: 'LvPlan',\n\t\t\tcomponent: LvPlan,\n\t\t\tprops(route) {\n\t\t\t\treturn {\n\t\t\t\t\tpropsViewData: route.params\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tpath: `/Cis/MyLvPlan/:mode?/:focus_date?`,\n\t\t\tname: 'MyLvPlan',\n\t\t\tcomponent: MyLvPlan,\n\t\t\tprops(route) {\n\t\t\t\treturn {\n\t\t\t\t\tpropsViewData: route.params\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tpath: `/Cis4`,\n\t\t\tname: 'Cis4',\n\t\t\tcomponent: FhcDashboard,\n\t\t\tprops: {dashboard: 'CIS'},\n\t\t},\n\t\t{\n\t\t\tpath: `/`,\n\t\t\tname: 'FhcDashboard',\n\t\t\tcomponent: FhcDashboard,\n\t\t\tprops: {dashboard: 'CIS'},\n\t\t},\n\t\t{\n\t\t\tpath: '/:pathMatch(.*)*',\n\t\t\tname: 'Fallback',\n\t\t\tcomponent: FhcDashboard,\n\t\t\tprops: {dashboard: 'CIS'},\n\t\t\tredirect: () => {\n\t\t\t\treturn {\n\t\t\t\t\tname: \"Cis4\",\n\t\t\t\t\tparams: {\n\t\t\t\t\t\tdashboard: 'CIS'\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t},\n\t\t},\n\t]\n})\n\nconst app = Vue.createApp({\n\tname: 'FhcApp',\n\tdata: () => ({\n\t\tappSideMenuEntries: {},\n\t\trenderers: null,\n\t}),\n\tcomponents: {},\n\tcomputed: {\n\t\tisMobile() {\n\t\t\tconst smallScreen = window.matchMedia(\"(max-width: 767px)\").matches;\n\t\t\tconst touchCapable = (\"ontouchstart\" in window) || navigator.maxTouchPoints > 0;\n\t\t\treturn smallScreen;// && touchCapable;\n\t\t}\t\n\t},\n\tprovide() {\n\t\treturn { // provide injectable & watchable language property\n\t\t\tlanguage: Vue.computed(() => this.$p.user_language),\n\t\t\trenderers: Vue.computed(() => this.renderers),\n\t\t\tisMobile: this.isMobile\n\t\t}\t\n\t},\n\tmethods: {\n\t\tisInternalRoute(href) {\n\t\t\tconst internalBase = window.location.origin\n\t\t\treturn href.startsWith(internalBase);\n\t\t},\n\t\thandleClick(event) {\n\t\t\tconst target = event.target.closest('a');\n\n\t\t\tif(target?.id == 'skiplink') return\n\t\t\tif (target && this.isInternalRoute(target.href)) {\n\t\t\t\tconst url = new URL(target.href)\n\t\t\t\t\n\t\t\t\tconst path = url.pathname\n\t\t\t\tconst base = this.$router.options.history.base\n\t\t\t\tconst route = path.replace(base, '') || '/'\n\n\t\t\t\t// let click event propagate normally if we dont route internally\n\t\t\t\tconst res = this.$router.resolve(route)\n\t\t\t\tif(!res?.matched?.length || res.name === 'Fallback') return\n\t\t\t\t\n\t\t\t\tevent.preventDefault(); // Prevent browser navigation\n\t\t\t\t\n\t\t\t\tif(this.isMobile) { // toggle the menu\n\t\t\t\t\tconst navMain = document.getElementById('nav-main');\n\t\t\t\t\t// fix unwanted toggle from off to on for some links on mobile\n\t\t\t\t\tif(navMain.classList.contains('show')){\n\t\t\t\t\t\tdocument.getElementById('nav-main-btn').click();\n\t\t\t\t\t} \n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.$router.push(route);\n\t\t\t\t\n\t\t\t}\n\t\t}\n\t},\n\tasync created(){\n\t\t\n\t\tawait this.$api\n\t\t\t.call(ApiRenderers.loadRenderers())\n\t\t\t.then(res => res.data)\n\t\t\t.then(data => {\n\t\t\t\tfor (let rendertype of Object.keys(data)) {\n\t\t\t\t\tlet modalTitle = null;\n\t\t\t\t\tlet modalContent = null;\n\t\t\t\t\tlet calendarEvent = null;\n\t\t\t\t\tif (data[rendertype].modalTitle)\n\t\t\t\t\t\tmodalTitle = Vue.markRaw(Vue.defineAsyncComponent(() => import(data[rendertype].modalTitle)));\n\t\t\t\t\tif (data[rendertype].modalContent) \t\n\t\t\t\t\t\tmodalContent = Vue.markRaw(Vue.defineAsyncComponent(() => import(data[rendertype].modalContent)));\n\t\t\t\t\tif (data[rendertype].calendarEvent) \t\n\t\t\t\t\t\tcalendarEvent = Vue.markRaw(Vue.defineAsyncComponent(() => import(data[rendertype].calendarEvent)));\n\n\t\t\t\t\tif (data[rendertype].calendarEventStyles){\n\t\t\t\t\t\tvar head = document.head;\n\t\t\t\t\t\tif(!head.querySelector(`link[href=\"${data[rendertype].calendarEventStyles}\"]`)){\n\t\t\t\t\t\t\tvar link = document.createElement(\"link\");\n\t\t\t\t\t\t\tlink.type = \"text/css\";\n\t\t\t\t\t\t\tlink.rel = \"stylesheet\";\n\t\t\t\t\t\t\tlink.href = data[rendertype].calendarEventStyles;\n\t\t\t\t\t\t\thead.appendChild(link);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif(this.renderers === null) {\n\t\t\t\t\t\tthis.renderers = {};\n\t\t\t\t\t}\n\t\t\t\t\tif (!this.renderers[rendertype]) {\n\t\t\t\t\t\tthis.renderers[rendertype] = {}\n\t\t\t\t\t}\n\t\t\t\t\tthis.renderers[rendertype].modalTitle = modalTitle;\n\t\t\t\t\tthis.renderers[rendertype].modalContent = modalContent;\n\t\t\t\t\tthis.renderers[rendertype].calendarEvent = calendarEvent;\n\t\t\t\t}\n\t\t\t});\n\t},\n\tmounted() {\n\t\tdocument.addEventListener('click', this.handleClick);\n\t\t\n\t},\n\tbeforeUnmount() {\n\t\tdocument.removeEventListener('click', this.handleClick);\n\t},\n});\n\n// kind of a bandaid for bad css on some pages to avoid horizontal scroll\nsetScrollbarWidth();\napp.config.globalProperties.$capitalize = capitalize;\napp.use(router);\napp.use(primevue.config.default, {\n\tzIndex: {\n\t\toverlay: 9000,\n\t\ttooltip: 8000\n\t}\n})\napp.directive('tooltip', primevue.tooltip);\napp.use(PluginsPhrasen);\napp.use(Theme);\napp.directive('contrast', contrast);\napp.mount('#fhccontent');\n\nrouter.afterEach((to, from, failure) => {\n\tapp.config.globalProperties.$api.call(ApiRouteInfo.info('cis4', to.fullPath));\n});","// Create a temporary div element, set styles to ensure it's scrollable and off-screen, get scrollbar width from that\nfunction getScrollbarWidth() {\n\tconst div = document.createElement('div');\n\n\tdiv.style.position = 'absolute';\n\tdiv.style.top = '-9999px';\n\tdiv.style.width = '100px';\n\tdiv.style.height = '100px';\n\tdiv.style.overflow = 'scroll';\n\n\tdocument.body.appendChild(div);\n\tconst scrollbarWidth = div.offsetWidth - div.clientWidth;\n\tdocument.body.removeChild(div);\n\n\treturn scrollbarWidth;\n}\n\n// Detect the browser and set a CSS variable for the scrollbar width since chrome scrollbars mess with 100vw/vh css\nexport function setScrollbarWidth() {\n\tconst isChromium = /Chrome/.test(navigator.userAgent);\n\tconst isFirefox = /Firefox/.test(navigator.userAgent);\n\n\tif (isChromium) {\n\t\tconst width = getScrollbarWidth() + 'px';\n\t\tdocument.body.style.setProperty('--scrollbar-width', width); // Set the value for Chrome\n\t} else if (isFirefox) {\n\t\tdocument.body.style.setProperty('--scrollbar-width', '0px'); // Set the value for Firefox or adjust as needed\n\t}\n}","export function capitalize(string) {\n\tif (!string) return '';\n\treturn string[0].toUpperCase() + string.slice(1);\n}"],"names":["BsModal","name","data","modal","fullscreen","props","backdrop","type","Boolean","String","default","validator","value","includes","focus","keyboard","noCloseBtn","dialogClass","Array","Object","headerClass","bodyClass","footerClass","allowFullscreenExpand","emits","methods","dispose","this","handleUpdate","hide","show","relatedTarget","toggle","toggleFullscreen","$emit","mounted","$refs","bootstrap","Modal","popup","body","options","title","footer","slots","undefined","includedPrimevue","primevue","Promise","resolve","reject","instance","Vue","createApp","setup","h","class","ref","unmount","beforeUnmount","result","unmounted","wrapper","parentElement","removeChild","document","createElement","use","config","zIndex","overlay","then","Phrasen$1","Phrasen","mount","appendChild","template","Alert","components","mixins","onHideBsModal","Function","onHiddenBsModal","onHidePreventedBsModal","onShowBsModal","onShownBsModal","modalContainer","msg","bind","BsConfirm$1","BsAlert","GridItem","inject","item","active","dragAction","dragging","computed","registerDragAction","evt","target","hasAttribute","getAttribute","parent","closest","tryDragStart","touchDragEnd","touchStart","event","touchMove","preventDefault","GridLogic","constructor","w","grid","isFreeSlot","x","y","i","getMaxY","reduce","acc","getFreeSlots","freeSlots","biggestY","totalSpaces","length","Math","floor","push","add","prefer","occupiers","getItemsInFrame","frame","forEach","f","index","max","intermGrid","possiblities","tryMoving","bestOption","sort","a","b","cost","moves","v","move","currItem","getItemFrame","remove","console","error","place","pinned","originalFrame","isArray","some","occupiersData","map","occupier","occupiersFrame","flat","replaceUpdate","newOccupierFrames","occ","shift","getSingleFramePosition","updates","resize","newPoss","possiblity","p","directions","weight","dir","res","tryMovingInDirection","filter","amount","targetframe","unshift","clearWeights","indexOf","j","debug","DropGrid","cols","Number","items","itemsSetup","resizeLimit","marginForExtraRow","additionalRow","clientX","clientY","mode","dragGrid","permUpdates","positionUpdates","fixedPositionUpdates","draggedOffset","draggedItem","draggedNode","reorderedItems","clonedWidget","sectionName","additionalRowComputed","get","set","items_hashmap","needsReordering","rearrangedPosition","widget","widgetid","pop","items_placeholders","placeholders","col_max","rows_max","rows","occupied","keys","current_item","max_x","max_y","occupied_y","occupied_x","placeholder","id","padStart","placedItems_withPlaceholders","placedItems","gridStyle","addH","indexedItems","prePlacedItems","mappedPlacedItems","height_diff","width_diff","temporaryResizeItems","newItem","resizeOverlay","blank","showEmptyTileHover","widgetSetup","widgetsSetup","ele","widget_id","watch","dragCancel","handler","immediate","updated","createNewGrid","deep","toggleDraggedItemOverlay","condition","firstElementChild","classList","containerRect","container","getBoundingClientRect","clonedWidgetRect","desiredTop","desiredLeft","minTop","maxTop","height","minLeft","maxLeft","width","constrainedTop","min","constrainedLeft","style","top","left","sortedItems","firstFreeSlot","targetX","targetW","convertGridResultToUpdate","input","output","baseArray","mouseLeave","updateCursor","rect","touches","gridX","clientWidth","gridY","clientHeight","_dragStart","dataTransfer","setDragImage","dropEffect","effectAllowed","startMove","setTimeout","clone","cloneNode","querySelector","removeProperty","startResize","dragOver","checkPinnedWidgetAnimation","checkWidgetSizeLimitAnimation","removeWidgetClones","dragEnd","getElementById","from","getElementsByClassName","_updateFixedPositions","additionalUpdates","emptyTileClicked","updateCursorOnMouseMove","itemAtPosition","pinNode","contains","draggedItemSetup","draggedItemMaxWidth","draggedItemMinWidth","draggedItemMaxHeight","draggedItemMinHeight","draggedItemNode","width_after_resize","height_after_resize","widgetClones","mouseDown","mouseUp","__widgets","__widgetsStarted","__path","FHC_JS_DATA_STORAGE_OBJECT","app_root","ci_router","CachedWidgetLoader","getWidget","loadWidget","axios","params","retval","catch","response","setPath","path","DashboardItem","HeightTransition","onEnter","el","done","scrollHeight","onLeave","component","arguments","tmpConfig","isLoading","hasConfig","sharedData","maxHeight","maxWidth","prototype","toString","call","minHeight","minWidth","isResizeable","isPinned","ready","unpin","editMode","item_data","pinItem","getWidgetC4Link","cis4link","handleShowBsModal","handleHideBsModal","e","startDrag","dragHandle","resizeHandle","openConfig","setConfig","changeConfig","sendChangeConfig","changeConfigManually","k","created","import","file","$options","WidgetIcon","required","src","DashboardSection","adminMode","configOpened","gridWidth","gridHeight","provide","editModeIsActive","computedWidgetsSetup","getSectionStyle","widgets","reorder","sectionNameTranslation","$p","t","showSectionInformation","handleConfigOpened","handleConfigClosed","checkResizeLimit","minmaxW","minmaxH","removeWidget","revert","custom","BsConfirm","update","hidden","updatePreset","saveConfig","payload","updatePositions","self","cont","parseInt","window","getComputedStyle","getPropertyValue","addEventListener","DashboardWidgetPicker","callbacks","close","pick","ObjectUtils","mergeDeep","objects","isObject","obj","prev","key","pVal","oVal","concat","ApiDashboard","getViewData","method","url","FhcDashboard","dashboard","viewData","uid","timezone","sections","viewDataInternal","apiurl","widgetAdd","section_name","db","JSON","parse","err","widgetpicker","Date","valueOf","loading","section","post","funktion_kurzbz","newId","splice","alert","widgetUpdate","wid","prop","_x","_y","_w","_h","preset","widgetRemove","loadCategory","section1","section2","beforeMount","$api","search","searchsettings","$fhcApi","searchAdvanced","searchdummy","phrasen$2","category","setLanguage","categories","language","getLanguage","getActiveDbLanguages","navigation","getHeader","navigation_page","getMenu","filter$1","saveCustomFilter","wsParams","filterUniqueId","filterType","customFilterName","removeCustomFilter","filterId","applyFilterFields","filterFields","addFilterField","filterField","removeFilterField","getFilterById","getFilter","studstatus","abmeldung","getDetails","antrag_id","prestudent_id","create","stdsem","grund","studiensemester","errorHandling","cancel","allSettled","antrag","studierendenantrag_id","errorHeader","unterbrechung","datum_wiedereinstieg","attachment","wiederholung","getLvs","saveLvs","forbiddenLvs","mandatoryLvs","leitung","getStgs","getAntraege","getHistory","getPrestudents","query","signal","timeout","approve","reopen","pause","unpause","object","approveObjection","denyObjection","profil","getView","fotoSperre","isStudent","isMitarbeiter","getZustellAdresse","getZustellKontakt","getGemeinden","nation","zip","getAllNationen","profilUpdate","getStatus","getTopic","acceptProfilRequest","profil_update_id","status_message","topic","requested_change","denyProfilRequest","insertFile","dms","replace","getProfilRequestFiles","requestID","selectProfilRequest","insertProfilRequest","fileID","updateProfilRequest","ID","deleteProfilRequest","lvPlan","getRoomInfo","ort_kurzbz","start_date","end_date","getStunden","getOrtReservierungen","getLvPlanReservierungen","getLehreinheitStudiensemester","lehreinheit_id","studiensemesterDateInterval","date","LvPlanEvents","lv_id","stv","verband","favorites","students","studiensemester_kurzbz","encodeURIComponent","getUri","prestudent","person","person_id","relative_path","getStg","setStg","studiengang_kz","konto","tabulatorConfig","ajaxURL","ajaxParams","modelValue","only_open","studiengang_kz_intern","stg_kz","ajaxRequestFunc","ajaxResponse","checkDoubles","form","confirmErrorHandler","insert","counter","edit","delete","buchungsnr","getBuchungstypen","group","getGruppen","deleteGroup","kontakt","getAdressen","addNewAddress","loadAddress","address_id","updateAddress","deleteAddress","getPlaces","plz","getFirmen","searchString","getNations","getAdressentypen","getBankverbindung","addNewBankverbindung","loadBankverbindung","bankverbindung_id","updateBankverbindung","deleteBankverbindung","getKontakte","addNewContact","loadContact","kontakt_id","updateContact","deleteContact","getStandorteByFirma","getKontakttypen","updatePrestudent","getBezeichnungZGV","getBezeichnungMZgv","getBezeichnungDZgv","getAusbildung","getAufmerksamdurch","getBerufstaetigkeit","getTypenStg","getBisstandort","getHistoryPrestudent","getMaxSem","studiengang_kzs","advanceStatus","status_kurzbz","ausbildungssemester","confirmStatus","isLastStatus","deleteStatus","getLastBismeldestichtag","getHistoryPrestudents","status","insertStatus","loadStatus","updateStatus","getStudienplaene","getStudiengang","getStatusgruende","getStati","addStudent","changeStatus","getStatusarray","details","save","exam","getPruefungen","loadPruefung","pruefung_id","getTypenPruefungen","getAllLehreinheiten","getLvsByStudent","getLvsandLesByStudent","semester","getLvsAndMas","getMitarbeiterLv","getNoten","checkZeugnisnoteLv","addPruefung","updatePruefung","deletePruefung","abschlusspruefung","getAbschlusspruefung","addNewAbschlusspruefung","loadAbschlusspruefung","updateAbschlusspruefung","deleteAbschlusspruefung","getTypenAbschlusspruefung","getTypenAntritte","getBeurteilungen","getAkadGrade","getTypStudiengang","getMitarbeiter","getPruefer","checkForExistingExams","uids","grades","list","getCertificate","getTeacherProposal","getRepeaterGrades","updateCertificate","lehrveranstaltung_id","student_uid","note","lehrveranstaltung_bezeichnung","deleteCertificate","copyTeacherProposalToCertificate","copyRepeaterGradeToCertificate","studierendenantrag_lehrveranstaltung_id","lv_bezeichnung","getGradeFromPoints","points","manualErrorHandling","mobility","getMobilitaeten","getProgramsMobility","addNewMobility","loadMobility","bisio_id","updateMobility","deleteMobility","getLVList","getPurposes","getSupports","getListPurposes","getListSupports","deleteMobilityPurpose","addMobilityPurpose","deleteMobilitySupport","addMobilitySupport","archiv","getArchivVorlagen","archive","archiveSigned","akte_id","documents","getDocumentsUnaccepted","getDocumentsAccepted","deleteZuordnung","dokument_kurzbz","createZuordnung","loadAkte","getDoktypen","updateFile","deleteFile","uploadFile","exemptions","getAnrechnungen","getLehrveranstaltungen","getBegruendungen","getLvsKompatibel","getLektoren","addNewAnrechnung","loadAnrechnung","anrechnung_id","editAnrechnung","deleteAnrechnung","jointstudies","getStudies","getTypenMobility","getStudiensemester","getStudyprograms","getListPartner","getStatiPrestudent","loadStudy","insertStudy","updateStudy","deleteStudy","courselist","getCourselist","group_consecutiveHours","dbStundenplanTable","configStudent","configStudents","notiz","getNotizen","getUid","addNewNotiz","formData","loadNotiz","notiz_id","loadDokumente","deleteNotiz","type_id","updateNotiz","isBerechtigt","betriebsmittel","getAllBetriebsmittel","addNewBetriebsmittel","loadBetriebsmittel","betriebsmittelperson_id","updateBetriebsmittel","deleteBetriebsmittel","getTypenBetriebsmittel","loadInventarliste","checkperson","updatePersonUnrulyStatus","unrulyParam","unruly","filterPerson","base","ort","getContentID","ort_kurbz","getRooms","datum","von","bis","typ","personenanzahl","getRoomTypes","cms","content","content_id","version","sprache","sichtbar","getNews","page","page_size","news","limit","getNewsRowCount","getNewsExtra","lehre","getStudentenMail","getLvInfo","getStudentPruefungen","addons","getLvMenu","lvid","messages","getMessages","size","getVorlagen","getMsgVarsLoggedInUser","getMessageVarsPerson","getMsgVarsPrestudent","getPersonId","getDataVorlage","vorlage_kurzbz","getNameOfDefaultRecipient","getPreviewText","getReplyData","messageId","sendMessageFromModalContext","sendMessage","deleteMessage","vorlagen","getVorlagenByLoggedInUser","studium","getAllStudienSemester","studiengang","studienplan","getStudiengaengeForStudienSemester","getStudienplaeneBySemester","getLvPlanForStudiensemester","getLvEvaluierungInfo","FhcApiFactory","phrasen","bookmark","getBookmarks","bookmark_id","tag","ampeln","open","all","confirm","ampel_id","studiengangInformation","getStudiengangByKz","menu","authinfo","getAuthUID","getAuthInfo","getAll","OldFhcApi","install","app","globalProperties","factory","warn","addEndpoints","_get_config","uri","TypeError","clearValidation","setFeedback","_clean_return_value","meta","fhcApiAxios","baseURL","interceptors","request","FormData","values","every","FileList","File","newData","entries","nd","append","jsondata","stringify","errors","_defaultErrorHandlers","code","handled","$fhcAlert","alertDefault","message","responseURL","alertError","validation","apply","general","php","filename","line","backtrace","function","severity","alertSystemError","exception","heading","sql","join","auth","controller","required_permissions","FhcApiFactoryWrapper","factorypart","root","defineProperty","noWarn","CORE_REST_CLIENT_ERROR","CORE_REST_CLIENT_RETVAL","CoreRESTClient","wsURL","wsParameters","axiosParameters","_axiosCall","isSuccess","hasOwnProperty","isError","hasData","trim","getData","getError","getErrorCode","_generateRouterURI","_printDebug","parameters","errorThrown","axiosCallObj","helperAppContainer","helperApp","PvToast","PvConfirm","mailToUrl","slotProps","systemerror_mailto","called_path","called_method","detail","openMessagecard","Collapse","getOrCreateInstance","showmaillink","PvConfig","PvConfirmationService","helperAppInstance","FhcAlert","FhcPhrasen","alertSuccess","toast","summary","life","alertInfo","alertWarning","confirmDelete","$confirm","require","header","acceptLabel","acceptClass","rejectLabel","rejectClass","accept","sticky","html","alertMultiple","messageArray","handleSystemError","toLowerCase","errMsg","toUpperCase","stack","handleSystemMessage","resetFormValidation","Event","querySelectorAll","dispatchEvent","handleFormValidation","nodeType","Node","ELEMENT_NODE","notFound","CustomEvent","arr","PluginsApi","_send_array_or_object","func","errs","DEFAULT_ERROR_CONFIG","success","fail","combine","async","_format_toast","_default","field","msgs","n_errors","n","get_config","clean_return_value","_merge_error_config","get_error_handler","formHandler","get_error_list","popHandleableErrors","copy","newType","newTypeCombinesType","newTypeHasHandler","errorConfig","remaining","configoverwrite","typedErrors","allowed","reason","errType","getErrorHandler","ApiPhrasen","reactive","loadingModules","user_language","user_locale","server_languages","find","LC_Time","catArray","row","phrase","text","elem","extractCategory","t_ref","split","val","match","p1","getValueForLoadedPhrase","PluginsPhrasen","cat","lang","theme_name","theme","theme_modes","modes","toggleTheme","documentElement","setAttribute","stylesheet","attributes","href","localStorage","setItem","Theme","initializeTheme","getItem","$theme","switchTheme","rgbToHex","hex","getContrastYIQ","hexcolor","substring","contrast","element","binding","bgColor","backgroundColor","rgbRegEx","RegExp","isRgb","r","g","hexColor","color","TYPE_DEFINITION","lehreinheit","dragIcon","extras","vevent","student","VALID_TYPES","isValidDragObject","substr","extra","getValidTransferData","allowedTypes","strict","getTransferData","_error","types","base_type","collection","DragAndDrop","isValidTransferData","convertToValidDragObject","converted","sorted","found","typedef","setTransferData","validDragObject","dragElements","icon","label","iconContainer","className","textContent","boxShadow","itemContainer","requestAnimationFrame","setData","eventHasTypes","bindDragEnterLeave","skipLeave","skipLeaveParent","init","globalDragenter","globalDragleave","globalDrop","removeEventListener","cleanup","wasDropped","CalDnd","vnode","arg","cancelable","bubbles","offsetX","offsetWidth","offsetY","offsetHeight","originalEvent","hitbox","pos","pageX","scrollLeft","pageY","scrollTop","modifiers","once","timestamp","prevVnode","BaseDraganddrop","directives","events","correctedEvents","backgrounds","dropAllowed","dropableEvents","draggedInternalEvent","draggedExternalEvent","targetTimestamp","targetGridEnds","shadowPreview","findIndex","previewEvent","toSpliced","correctedBackgrounds","start","end","orig","onDragstart","convertToTransferData","onDragend","onDragenter","isostart","luxon","DateTime","fromISO","setZone","local","isoend","onDragleave","onDragchange","ends","onDrop","BaseHeader","DatePicker","VueDatePicker","listLength","convertedDate","keepLocalTime","current","month","year","startOf","ts","plus","days","useLocaleWeeks","endOf","toLocaleString","localWeekYear","week","toFormat","DATE_FULL","weekStart","Info","getStartOfWeek","fromObject","setLocale","locale","fromJSDate","weekNumbers","localWeekNumber","modeOptions","btnMonth","btnWeek","btnDay","btnList","clickMode","defaultPrevented","BaseSlider","time","extrasAfter","extrasBefore","running","promiseResolve","itemsAfter","itemsBefore","styleSlider","position","transition","styleBefore","display","right","styleAfter","prevPage","slidePages","nextPage","newTarget","endSlide","clickListeners","saveAddClickListener","source","listener","stopPropagation","customEvent","CalClick","finalEvent","FhcCalendar$1","timeGrid","draggableEvents","hasDragoverFunc","onDragover","now","showBtns","internalView","internalDate","modalEvent","convertedEvents","convertedBackgrounds","bg","isInteger","fromMillis","zone","sDate","cDate","cMode","sMode","o","isValid","hasSame","clickPrev","clickNext","handleClickDefaults","number","zoneName","onDropItem","showEventModal","eventObj","hideEventModal","closeFn","onModalHidden","ApiLvPlan","getLvPlan","eventsPersonal","eventsLv","getLv","GridLineEvent","isHeaderOrFooter","draggable","classes","startsHere","endsHere","CalendarGrid","GridLine","LineEvent","LineBackground","flipAxis","background","styles","perc","border","diff","axisRow","eventsWithRowInfo","toMillis","originalEvents","originalBackgrounds","axisMain","axisParts","Duration","allDayEvents","axisMainCollapsible","snapToGrid","resizeObserver","mutationObserver","userScroll","axisCol","axisPartsWithBreaks","tu","lastTuEnd","slice","axisPartsSave","partsEnds","part","axisMainBorders","curr","eventsAllDay","mapIntoMainAxis","allDayEvent","eventsNormal","hasValidEvents","styleGridCols","styleGridRows","gridlines","mainIndex","day","laneStart","laneEnd","getPageTop","pageTop","offsetTop","offsetParent","getPageLeft","pageLeft","offsetLeft","getTimestampFromMouse","dayTimestamp","mouse","mouseFrac","main","enableAutoScroll","ResizeObserver","scrollToEarliestEvent","observe","MutationObserver","mutations","m","addedNodes","matches","subtree","childList","disableAutoScroll","disconnect","eventElements","scroller","earliestEventOffset","scrollIntoView","behavior","scrollTo","LabelDay","titleFull","titleLong","titleShort","titleNarrow","LabelDow","weekday","LabelTime","start_ok","end_ok","sanitizedTimestamps","formatTime","toISOTime","suppressSeconds","ModeDay","DayView","emptyMessage","emptyMessageDetails","chosenEvent","gridMainRef","fromISOTime","hours","currentEvent","first","isToday","compact","threshold","elementRef","isRef","$el","compareArray","updateResultVars","compare","observer","addObserver","removeObserver","onMounted","onUnmounted","watchEffect","useResizeObserver","currentDate","focusDate","rangeOffset","range","last","Interval","fromDateTimes","view","slider","updatePage","newFocusDate","viewAttrs","$attrs","ModeWeek","WeekView","collapseEmptyDays","weeks","ModeMonth","MonthView","LabelWeek","firstDay","lastDay","d","startdate","nextRangeStart","months","dayInWeek","FhcCalendar","getPromiseFunc","markRaw","teachingunits","includeOffset","eventStyle","farbe","updateRange","rangeInterval","context","lv","loading_id","loadingEvents","allEvents","eventsLoaded","mergePromiseArr","markEventsLoaded","indexIsLast","nStart","rStart","nEnd","toISODate","toValue","promises","results","useEventLoader","newValue","emit","stunde","beginn","ende","ApiAuthinfo","LvPlan","propsViewData","currentDay","focus_date","isNaN","currentMode","currentLv","lvTitle","bezeichnung_english","bezeichnung","handleChangeDate","newMode","handleChangeMode","$router","MyLvPlan","studiensemester_start","studiensemester_ende","downloadLinks","opts","toUnixInteger","download_link","link","LvPruefungen","pruefungenData","ApiLehre","infos","studien_semester","studiengang_kuerzel","orgform_kurzbz","ects","incoming","info","lektorNamesLinks","lektorenLinks","lektoren","titelpre","vorname","nachname","titelpost","lektorNames","lvLeitung","oe","organisationseinheittyp","oeLeitung","koordinator","currentLang","lastLang","lvinfo","lvinfoDefaultLang","assign","reloadRefs","triggerRef","initialval","FHC_JS_PHRASES_STORAGE_OBJECT","tmp_category","loadLazy","unref","LvMenu","containerStyles","rowStyles","hasLvPlanEintraege","c4_disabled","menuItem","c4_link","c4_moodle_links","c4_target","getMenuName","ApiAddons","LvUebersicht","titel","preselectedMenu","isMenuSelected","lvEvaluierungMessage","hiddenModal","showModal","studium_studiensemester","MylvSemester","MylvSemesterStudiengang","MylvSemesterStudiengangLv","bezeichnung_eng","module","benotung","lvnote","lvnotebez","znote","znotebez","positiv","note_index","preselectedMenuItem","gradeColor","is_organisatorische_einheit","emptyMenu","bodyStyle","grade","languageIndex","LvHasPruefungenInformation","fetchMenu","openLvOption","location","nextTick","lvUebersicht","openPruefungen","openInfos","LvInfo","pruefungen","kuerzel","lvs","sg_bezeichnung_eng","lehrveranstaltungen","Map","studiengaenge","sg_bezeichnung","lvsForStudiengang","MylvStudent","firstLoad","currentSemester","nearestSem","nearestSemDiff","sem","abs","currentIsFirst","currentIsLast","prevSem","selectedIndex","nextSem","updateRouter","routerStudiensemester","$route","s","beforeRouteUpdate","to","next","CoreFetchCmpt","refresh","apiFunction","apiFunctionParameters","oldValue","fetchData","errorMessage","apiFunctionResult","successHandler","errorHandler","finally","finallyHandler","setError","FILTER_COMPONENT_NEW_FILTER","FilterConfig","filters","columns","fields","switchFilter","applyFilterConfig","currentFields","c","currentTarget","filteredFields","addField","removeField","FilterColumns","selected","names","selectedFields","DEFAULT_ICONS","jsonLines","xlsx","pdf","json","csv","DEFAULT_LABELS","TableDownload","tabulator","iconClass","currentConfig","newConfig","stringToFileFormatter","formatter","validateFileFormatter","lcInput","XLSX","jspdf","jsPDF","autoTable","download","elementDataMap","WeakMap","collapseAutoClose","collapse","getInstance","collapsibleAutoHideFunc","Tabulator","extendModule","fitDataStretchFrozen","forced","colsWidth","tableWidth","table","rowManager","gap","lastCol","column","widthFixed","reinitializeWidth","responsiveLayout","modules","responsive","visible","definition","frozen","getWidth","modExists","setWidth","ApiFilter","_uuid","CoreFilterCmpt","onNwNewEntry","description","sideMenu","tabulatorOptions","tabulatorEvents","tableOnly","noColumnFilter","reload","reloadBtnInfotext","newBtnShow","newBtnClass","newBtnDisabled","newBtnLabel","uniqueId","idField","parentIdField","countOnly","useSelectionSpan","uuid","filterName","filterActive","dataset","datasetMetadata","availableFilters","selectedFilter","fetchCmptRefresh","fetchCmptApiFunction","fetchCmptApiFunctionParams","fetchCmptDataFetched","fetchResult","tableBuilt","tabulatorHasSelector","selectedData","persistence","headerFilter","notSelectedFields","filteredData","filteredColumns","col","resizable","fieldIdsForVisibilty","getColumns","def","getDefinition","getField","fieldNames","idExtra","columnsForFilter","filterTitles","reloadTable","initTabulator","hash","resolvePromiseFunc","setRenderData","startFetchCmpt","layout","movableColumns","columnDefaults","tooltip","selectable","dataTree","on","toDelete","childIdx","child","isVisible","_setHeaderFilter","updateTabulator","_updateTabulator","setColumns","clearFilters","getHeaderFilters","setHeaderFilterValue","clearFilter","render","setSideMenu","setDropDownMenu","personalFilters","filtersArray","filtersCount","filter_id","desc","onClickCall","handlerGetFilterById","subscriptDescription","subscriptLinkClass","subscriptLinkValue","onClickSubscriptCall","handlerRemoveCustomFilter","children","option","dataFetchedCallback","handlerSaveCustomFilter","attr","parentId","parentIdx","_children","beforeCreate","$props","Mailverteiler","AusweisStatus","QuickLinks","mobile","hideCollapse","collapseOpen","showCollapse","Adresse","withZustelladresse","Kontakt","ProfilEmails","RoleInformation","getLinkGruppeListe","gruppe","getLinkVerbandListe","getLinkSemesterListe","ApiProfil","profilViewData","Upload","DmsItem","preview","multiple","inputClass","noList","disabled","stringifyFile","lastModified","lastModifiedDate","addFiles","files","dt","DataTransfer","doubles","removeFile","fileToRemove","upload","dmsFile","ApiProfilUpdate","updateProfilbild","getProfilUpdateWithPermission","ImageUpload","dmsData","Dms","updateID","uploadImage","ProfilInformation","fotoStatus","FotoSperre","foto_sperre","imageUpload","sperre_foto_function","get_image_base64_src","foto","Vorname","Nachname","profilInfo","notIncludedProperties","EditProfilSelect","EditKontakt","originalValue","zustellKontakteCount","updateValue","checked","isChanged","getZustellkontakteCount","showZustellKontakteWarning","zustellung","kontakteOfSelectedType","kontakttyp","EditAdresse","AutoComplete","autocomplete","gemeinden","ortschaftnamen","selectedNation","nationenList","zustellAdressenCount","fileschanged","autocompleteSearchGemeinden","gemeinde","autocompleteSearchOrtschaftsnamen","ortschaft","getGemeinde","Set","ortschaftsname","updateFileID","getZustelladressenCount","deleteDmsData","showZustellAdressenWarning","zustelladresse","adresse_id","strasse","Status","getDocumentLink","dms_id","getComponentView","profilUpdateTopic","cardHeader","status_timestamp","TextInputDokument","withFiles","didFilesChange","didDataChange","emitChanges","toRaw","ariaLabel","breadcrumb","submit","select","breadcrumbItems","modal_topic","properties","addItem","anmerkung","deleteItem","profilUpdateEmit","updateOptions","Loading","state","clearTimeout","EditProfil","Loader","zustelladressenCount","zustellkontakteCount","editData","updateFileIDFunction","newFileID","handleFailedError","setLoading","submitProfilChange","fileData","uploadFiles","handleApiResponse","showFooter","FetchProfilUpdates","showUpdateModal","editProfilTitle","hideEditProfilModal","updateEditModal","showEditProfilModal","updateRequest","profilUpdateStates","deleteRequest","dateFilter","cell","onRendered","div","initialValue","getValue","PrimevueCalendar","calendar","dates","headerValue","rowValue","rowDate","startDate","endDate","setHours","toDateString","singleDate","StudentProfil","collapseIconBetriebsmittel","editDataFilter","preloadedPhrasen","zutrittsgruppen_table_options","persistenceID","zutrittsGruppenPhrase","betriebsmittel_table_options","responsiveLayoutCollapseUseFormatters","responsiveLayoutCollapseFormatter","$collapseFormatter","headerSort","headerClick","collapseFunction","entlehnteBetriebsmittelPhrase","inventarnummerPhrase","ausgabedatum","headerFilterFunc","formatterParams","datetimeFormatterParams","betriebsmittelTableBuilt","betriebsmittelTable","mittel","zutrittsgruppenTableBuilt","zutrittsgruppenTable","zuttritsgruppen","fetchProfilUpdates","profilUpdates","sortProfilUpdates","editModal","inputFormat","outputFormat","invalidPlaceholder","filteredEditData","profilInformation","Username","username","Anrede","anrede","Titel","Postnomen","postnomen","roleInformation","geburtsdatum","gebdatum","geburtsort","gebort","personenkennzeichen","loaded","newVal","MitarbeiterProfil","funktionen_table_options","bezeichnungPhrase","organisationseinheitPhrase","gueltigVonPhrase","gueltigBisPhrase","wochenstundenPhrase","Nummer","Ausgegeben_am","ausgabedatumPhrase","funktionenTableBuilt","funktionenTable","funktionen","setTableColumnTitles","getTelefonValue","standort_telefon","telefonklappe","kurzbz","telefon","office","ViewStudentProfil","personEmails","emails","ViewMitarbeiterProfil","collapseIconFunktionen","item2","innerHTML","Profil","notFoundUID","isEditable","editable","allClickableIcons","_column","cells","click","ele1","ele2","insertamum","reverse","load","profil_data","adressen","adressenArray","adresse","adr","kontakte","kontakteArray","kontant","kon","Personen_Informationen","Private_Kontakte","listview","Private_Adressen","loadingModalRef","oldVal","ApiOrt","Raumsuche","InputNumber","inputnumber","phrasenPromise","phrasenResolved","tabulatorUuid","tableBuiltResolve","tableBuiltPromise","roomtypes","defaultType","raumtyp_kurzbz","beschreibung","anzahl","selectedType","getHours","minutes","getMinutes","datepickerTextInputOptions","enterSubmit","tabSubmit","selectOnFocus","format","escClose","timepickerTextInputOptions","raumsucheTableOptions","widthGrow","linkFormatter","raumsucheTableEventHandlers","tableResolve","arialabel","roomPlanLink","room","roomInfoLink","getTimeString","setupData","nummer","planbezeichnung","personen","max_person","linkInfo","linkRes","raumsucheTable","loadRoomTypes","loadRooms","toISOString","handleUuidDefined","setRoute","dateFormat","getDate","getMonth","getFullYear","timeFormat","setupMounted","tableID","tableDataSet","visualViewport","setProperty","isDarkMode","Pagination","paginator","maxPageCount","newPageEvent","StudiengangPerson","telefoneklappe","email","displayWidget","formattedEmail","emailArray","fullname","phone","email_link","base64Image","profilViewLink","StudiengangVertretung","vertretungsList","showBezeichnung","vertretungFormatedName","vertretung","ApiStudiengang","StudiengangInformation","stg_ltg","gf_ltg","stv_ltg","ass","hochschulvertr","stdv","jahrgangsvertr","collection_array","returnData","moodleLink","studiengangInformationen","ApiCms","CmsNews","fetchNews","Axios","loadNewPageContent","raum_contentmittitel","imgContent","sanitizeLegacyTables","pElement","parentNode","replaceChild","u","li","scrollWidth","firstChild","TEXT_NODE","th","childNodes","cn","tables","getElementsByTagName","innerText","room_name","room_name_reg_exp","room_name_reg_exp_result","link_element","replaceWith","lvplanlinks","lvplanlink","img","DOMParser","parseFromString","imgAttributes","regexList","relative","priority","regex","replacement","group_replacement_strategy","absolute","relative_regex","replaceRelativeLegacyLink","relativeLegacyLink","new_link","query_parameter","prepareContent","new_href","CmsContent","news_content","iframe_content","srcUrl","iframe","content_type","content_id_internal","fetchContent","$nextTick","computeContentType","DEFAULT_MODE_RAUMINFO","RoomInformation","ApiAbgabe","getConfig","getConfigStudent","getStudentProjektarbeiten","getStudentProjektabgaben","projektarbeit_id","postStudentProjektarbeitEndupload","Headers","postStudentProjektarbeitZwischenabgabe","getMitarbeiterProjektarbeiten","showall","postProjektarbeitAbgabe","termin","dateString","paabgabe_id","paabgabetyp_kurzbz","note_pk","upload_allowed","beurteilungsnotiz","fixtermin","insertvon","betreuer_person_id","deleteProjektarbeitAbgabe","postSerientermin","projektarbeit_ids","fetchDeadlines","getPaAbgabetypen","getProjektarbeitenForStudiengang","benotet","getStudiengaenge","postStudentProjektarbeitZusatzdaten","getSignaturStatusForProjektarbeitAbgaben","paabgabe_ids","FhcOverlay","AbgabeStudentDetail","Checkbox","checkbox","Dropdown","dropdown","Textarea","textarea","Accordion","accordion","AccordionTab","accordiontab","Message","Inplace","inplace","projektarbeit","viewMode","eidAkzeptiert","enduploadTermin","allActiveLanguages","abstract","abstract_en","schlagwoerter","schlagwoerter_en","kontrollschlagwoerter","seitenanzahl","getNoteBezeichnung","noteOpt","notenOptions","opt","$capitalize","benotbar","validate","endupload","triggerEndupload","bperson_id","handleUploadRes","modalContainerEnduploadZusatzdaten","downloadAbgabe","formatDate","dateParam","padZero","num","abgabedatum","signatur","signaturInfo","getOptionLabel","getTerminNoteBezeichnung","getMoodleLink","moodle_link","getMessagePtStyle","margin","padding","getEid","allowedToSaveZusatzdaten","getAllowedToSendEndupload","qualityGateTerminAvailable","qgatefound","abgabetermine","abgabe","getTooltipVerspaetet","getTooltipVerpasst","getTooltipAbzugeben","getTooltipStandard","getTooltipAbgegeben","getTooltipFixtermin","getTooltipAbgabeDetected","getTooltipNotAllowedToUpload","isViewMode","getTooltipBeurteilungerforderlich","getTooltipBestanden","getTooltipNichtBestanden","today","AbgabetoolStudent","AbgabeDetail","student_uid_prop","activeTabIndex","abgabeTypeOptions","projektarbeiten","selectedProjektarbeit","dateDiffInDays","datumParam","getTime","pad","dateToday","getDateStyleClass","diffindays","isLate","checkQualityGatesStrict","termine","qgate1Passed","qgate2Passed","noteOption","checkQualityGatesOptional","qgate1found","qgate2found","qgate1positiv","qgate2positiv","isPastDate","setDetailComponent","loadAbgaben","pa","projekarbeit","paIsBenotet","allowedToUpload","dateStyle","betreuer","buildBetreuer","modalContainerAbgabeDetail","centeredTextFormatter","detailFormatter","mailFormatter","beurteilungFormatter","buildMailToLink","projekt","btitelpre","bvorname","bnachname","btitelpost","betreuerart_kurzbz","beurteilung1","downloadLink1","beurteilung2","downloadLink2","stg","kurzbzlang","mail","projekttypbezeichnung","loadProjektarbeiten","getAccTabHeaderForProjektarbeit","getMailLink","handleDownloadBeurteilung1","handleDownloadBeurteilung2","allowedNotenOptions","AbgabeMitarbeiterDetail","SpeedDial","speeddial","isFullscreen","assistenzMode","showAutomagicModalPhrase","speedDialItems","command","openCreateNewAbgabeModal","getAllowedToCreateNewTermin","openBenotung","openPlagiatcheck","openStudentPage","newTermin","getPlaceholderTermin","saveTermin","invertedFixtermin","newTerminRes","allowedToSave","allowedToDelete","existingTerminRes","abgabeOpt","noteOptExisting","savedNewWithNegative","savedExistingNoteAsNegativeAndWasNotNegativeBefore","modalContainerCreateNewAbgabe","openZusatzdatenModal","modalContainerZusatzdaten","saveZusatzdaten","validateZusatzdaten","paRes","handleDeleteTermin","deleteTermin","deletedTerminIndex","convertDateToIsoString","param","openBeurteilungLink","getOptionLabelSprache","getOptionLabelAbgabetyp","getOptionDisabled","aktiv","getNotenOptionLabel","turnitin_link","getSemesterBenotbar","beurteilungLinkNew","beurteilungLinkOld","upload_allowed_default","validateTermin","handleSaveNewAbgabe","handleChangeAbgabetyp","notenOptionsNonFinal","getAllowedAbgabeTypeOptions","abgabetypenBetreuer","getEnduploadErlaubt","isCurrent","endUploadVorhanden","getSpeedDialStyle","getSpeedDialWrapperStyle","getTooltipNotAllowedToSave","getTooltipNotAllowedToDelete","getProjektarbeitTitel","getProjektarbeitStudent","AbgabetoolMitarbeiter","old_abgabe_beurteilung_link","tableData","detailIsFullscreen","saving","serienTermin","showAll","domain","detailOffset","abgabeTableOptions","selectableCheck","selectionCheck","rowHeight","getRow","handleClick","cssText","titleFormatter","hozAlign","selectHandler","titleFormatterParams","selectAllHandler","cssClass","pkzTextFormatter","abgabeTableEventHandlers","getColumn","undoSelection","sd","fsd","isSelected","deselect","getTable","getRows","handleToggleFullscreenDetail","showDeadlines","toggleShowAll","abgabeTable","redraw","setSort","openAddSeriesModal","modalContainerAddSeries","addSeries","createInfoString","str","buildPKZ","matrikelnr","buildStg","pkz","beurteilung","beurteilungLink","projekttyp_kurzbz","callback","calcMaxTableHeight","setHeight","BsOffcanvas","offcanvas","scroll","placement","Offcanvas","ApiStudiensemester","getAllStudiensemesterAndAktOrNext","order","AbgabeterminStatusLegende","splitMailsHelper","mails","subject","alertPluginRef","phrasenPluginRef","maillist","mailto","subjectlength","firstrun","useBcc","ctrlKey","metaKey","splitposition","lastIndexOf","mailLink","AbgabetoolAssistenz","Timeline","timeline","TieredMenu","tieredmenu","stg_kz_prop","studiensemesterOptions","allSem","curSem","notenOptionFilter","inplaceToggle","headerFiltersRestored","filtersRestored","colLayoutRestored","sortRestored","stateRestored","timelineProjekt","selectedStudiengangOption","studiengaengeOptions","allConfigPromise","ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT","ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER","allowedNotenFilterOptions","renderVerticalBuffer","formAction","abgabterminFormatter","sammelMailStudent","uniqueRecipients","sammelMailBetreuer","recipientList","betreuer_mail","zweitbetreuer_mail","checkQualityGateStatus","qgate1Termine","qgate2Termine","qgate1Status","qgate1StatusRank","qgate2Status","qgate2StatusRank","qgate","diffMs","getItemBezeichnung","getItemNote","notenOption","handleChangeAbgabetypSerientermin","semesterChanged","existing","getFilters","compVal","newFilter","setFilter","checkAbgabetermineProjektarbeit","prevTermin","nextTermin","loadState","saveState","getColumnLayout","getSorters","headerFilters","handleTableBuilt","saved","setColumnLayout","hf","sortList","columnManager","findColumn","getOptionLabelStg","getOptionLabelStudiensemester","getNotenFilterOptionLabel","actionButtons","alignItems","justifyContent","createButton","titleKey","clickHandler","btn","aspectRatio","transform","stopImmediatePropagation","openTimeline","pids","newAbgaben","pid","deselectRow","mappedData","mapProjekteToTableData","projekte","note_bez","erstbetreuer","buildErstbetreuer","zweitbetreuer","buildZweitbetreuer","paabgabe","student_vorname","student_nachname","terminTypOpt","drawer","timelineFormatter","erstbetreuer_full_name","betreuer_vorname","betreuer_nachname","zweitbetreuer_full_name","emailItems","uniqueStudentEmailCount","uniqueBetreuerEmailCount","requests","stgOpt","DeadlineOverview","person_uid_prop","fullName","deadlines","deadlineTableOptions","deadlineTableEventHandlers","pdfExportLink","loadDeadlines","dl","stud_titelpre","stud_vorname","stud_nachname","stud_titelpost","fixterminstring","deadlineTable","Studium","studienSemester","selectedStudiensemester","selectedStudiengang","studienOrdnung","selectedStudienordnung","selectedSemester","selectedLehrveranstaltung","studium_studiengang","studium_semester","studium_studienordnung","getDataFromLocalStorage","storeDataToLocalStorage","studienordnung","changeStudiensemester","changeSelectedStudienSemester","changeStudiengang","changeSelectedStudienGang","changeSemester","changeSelectedSemester","changeStudienordnung","newSelectIndex","changeSelectedStudienPlan","extractPropertyValues","studienplan_id","openLvUebersicht","lehrveranstaltung","sortStudienSemester","sem1","sem2","sem1Match","sem1Semester","sem1Year","sem2Match","sem2Semester","sem2Year","setHash","preselected","lv1","lv2","studienordnungTitel","orgform_bezeichnung","studiengangTitel","studiensemesterTitel","studiensemester_regex","selectedLehrveranstaltungTitel","lehrform_kurzbz","computedStudienOrdnung","carry","computedStudienOrdnungSelectValues","diabled","ApiRenderers","loadRenderers","ApiRouteInfo","ciPath","router","VueRouter","createRouter","history","createWebHistory","routes","redirect","route","charAt","beforeEnter","currentRoute","appSideMenuEntries","renderers","isMobile","matchMedia","isInternalRoute","internalBase","origin","startsWith","URL","pathname","matched","rendertype","modalTitle","modalContent","calendarEvent","defineAsyncComponent","calendarEventStyles","head","rel","isChromium","test","navigator","userAgent","isFirefox","overflow","scrollbarWidth","getScrollbarWidth","setScrollbarWidth","string","directive","afterEach","failure","fullPath"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"Fhc.js","sources":["../../../../js/components/Bootstrap/Modal.js","../../../../js/components/Bootstrap/Alert.js","../../../../js/components/Bootstrap/Confirm.js","../../../../js/components/Drop/Grid/Item.js","../../../../js/composables/GridLogic.js","../../../../js/components/Drop/Grid.js","../../../../js/composables/Dashboard/CachedWidgetLoader.js","../../../../js/components/Dashboard/Item.js","../../../../js/components/Tranistion/HeightTransition.js","../../../../js/components/Dashboard/Widget/WidgetIcon.js","../../../../js/components/Dashboard/Section.js","../../../../js/components/Dashboard/Widget/Picker.js","../../../../js/helpers/ObjectUtils.js","../../../../js/api/factory/cis/dashboard.js","../../../../js/components/Dashboard/Dashboard.js","../../../../js/api/search.js","../../../../js/api/phrasen.js","../../../../js/api/navigation.js","../../../../js/api/filter.js","../../../../js/api/studstatus.js","../../../../js/api/profil.js","../../../../js/api/profilUpdate.js","../../../../js/api/lvPlan.js","../../../../js/api/stv.js","../../../../js/api/stv/verband.js","../../../../js/api/stv/students.js","../../../../js/api/stv/filter.js","../../../../js/api/stv/konto.js","../../../../js/api/stv/group.js","../../../../js/api/stv/kontakt.js","../../../../js/api/stv/prestudent.js","../../../../js/api/stv/status.js","../../../../js/api/stv/details.js","../../../../js/api/stv/exam.js","../../../../js/api/stv/abschlusspruefung.js","../../../../js/api/stv/grades.js","../../../../js/api/stv/mobility.js","../../../../js/api/stv/archiv.js","../../../../js/api/stv/documents.js","../../../../js/api/stv/exemptions.js","../../../../js/api/stv/jointstudies.js","../../../../js/api/stv/courselist.js","../../../../js/api/notiz.js","../../../../js/api/notiz/person.js","../../../../js/api/betriebsmittel.js","../../../../js/api/betriebsmittel/person.js","../../../../js/api/checkperson.js","../../../../js/api/ort.js","../../../../js/api/cms.js","../../../../js/api/lehre.js","../../../../js/api/addons.js","../../../../js/api/messages.js","../../../../js/api/messages/person.js","../../../../js/api/vorlagen.js","../../../../js/api/studium.js","../../../../js/api/fhcapifactory.js","../../../../js/api/dashboard.js","../../../../js/api/bookmark.js","../../../../js/api/ampeln.js","../../../../js/api/studiengang.js","../../../../js/api/menu.js","../../../../js/api/authinfo.js","../../../../js/api/language.js","../../../../js/plugin/OldFhcApi.js","../../../../js/RESTClient.js","../../../../js/plugins/FhcAlert.js","../../../../js/plugins/Api.js","../../../../js/api/factory/phrasen.js","../../../../js/plugins/Phrasen.js","../../../../js/plugins/Theme.js","../../../../js/directives/contrast.js","../../../../js/helpers/DragAndDrop.js","../../../../js/directives/Calendar/DragAndDrop.js","../../../../js/components/Calendar/Base/DragAndDrop.js","../../../../js/components/Calendar/Base/Header.js","../../../../js/components/Calendar/Base/Header/Datepicker.js","../../../../js/components/Calendar/Base/Slider.js","../../../../js/directives/Calendar/Click.js","../../../../js/components/Calendar/Base.js","../../../../js/api/factory/lvPlan.js","../../../../js/components/Calendar/Base/Grid/Line/Event.js","../../../../js/components/Calendar/Base/Grid.js","../../../../js/components/Calendar/Base/Grid/Line.js","../../../../js/components/Calendar/Base/Grid/Line/Background.js","../../../../js/components/Calendar/Base/Label/Day.js","../../../../js/components/Calendar/Base/Label/Dow.js","../../../../js/components/Calendar/Base/Label/Time.js","../../../../js/components/Calendar/Mode/Day/View.js","../../../../js/components/Calendar/Mode/Day.js","../../../../js/composables/Responsive.js","../../../../js/components/Calendar/Mode/Week.js","../../../../js/components/Calendar/Mode/Week/View.js","../../../../js/components/Calendar/Mode/Month.js","../../../../js/components/Calendar/Mode/Month/View.js","../../../../js/components/Calendar/Base/Label/Week.js","../../../../js/components/Calendar/LvPlan.js","../../../../js/composables/EventLoader.js","../../../../js/api/factory/authinfo.js","../../../../js/components/Cis/LvPlan/Lehrveranstaltung.js","../../../../js/components/Cis/LvPlan/Personal.js","../../../../js/components/Cis/Mylv/Semester/Studiengang/Lv/Pruefungen.js","../../../../js/api/factory/lehre.js","../../../../js/components/Cis/Mylv/Semester/Studiengang/Lv/Info.js","../../../../js/mixins/Phrasen.js","../../../../js/components/Cis/Mylv/LvMenu.js","../../../../js/api/factory/addons.js","../../../../js/components/Cis/Mylv/LvUebersicht.js","../../../../js/components/Cis/Mylv/Semester.js","../../../../js/components/Cis/Mylv/Semester/Studiengang.js","../../../../js/components/Cis/Mylv/Semester/Studiengang/Lv.js","../../../../js/components/Cis/Mylv/Student.js","../../../../js/components/Fetch.js","../../../../js/components/filter/Filter/Config.js","../../../../js/components/filter/Filter/Columns.js","../../../../js/components/filter/Table/Download.js","../../../../js/directives/collapseAutoClose.js","../../../../js/tabulator/layouts/fitDataStretchFrozen.js","../../../../js/api/factory/filter.js","../../../../js/components/filter/Filter.js","../../../../js/components/Cis/Profil/ProfilComponents/Mailverteiler.js","../../../../js/components/Cis/Profil/ProfilComponents/FhAusweisStatus.js","../../../../js/components/Cis/Profil/ProfilComponents/QuickLinks.js","../../../../js/components/Cis/Profil/ProfilComponents/Adresse.js","../../../../js/components/Cis/Profil/ProfilComponents/Kontakt.js","../../../../js/components/Cis/Profil/ProfilComponents/ProfilEmails.js","../../../../js/components/Cis/Profil/ProfilComponents/RoleInformation.js","../../../../js/api/factory/profil.js","../../../../js/components/Form/Upload/Dms.js","../../../../js/components/Form/Upload/Dms/Item.js","../../../../js/api/factory/profilUpdate.js","../../../../js/components/Cis/Profil/ProfilModal/EditProfilComponents/ImageUpload.js","../../../../js/components/Cis/Profil/ProfilComponents/ProfilInformation.js","../../../../js/components/Cis/Profil/ProfilModal/EditProfilSelect.js","../../../../js/components/Cis/Profil/ProfilModal/EditProfilComponents/EditKontakt.js","../../../../js/components/Cis/Profil/ProfilModal/EditProfilComponents/EditAdresse.js","../../../../js/components/Cis/Profil/ProfilModal/EditProfilComponents/Status.js","../../../../js/components/Cis/Profil/ProfilModal/EditProfilComponents/TextInputDokument.js","../../../../js/components/Loader.js","../../../../js/components/Cis/Profil/ProfilModal/EditProfil.js","../../../../js/components/Cis/Profil/ProfilComponents/FetchProfilUpdates.js","../../../../js/tabulator/filters/Dates.js","../../../../js/components/Cis/Profil/StudentProfil.js","../../../../js/components/Cis/Profil/MitarbeiterProfil.js","../../../../js/components/Cis/Profil/StudentViewProfil.js","../../../../js/components/Cis/Profil/MitarbeiterViewProfil.js","../../../../js/components/Cis/Profil/Profil.js","../../../../js/api/factory/ort.js","../../../../js/components/Cis/Raumsuche/Raumsuche.js","../../../../js/components/Pagination/Pagination.js","../../../../js/components/Cis/Cms/StudiengangInformation/StudiengangPerson.js","../../../../js/components/Cis/Cms/StudiengangInformation/StudiengangVertretung.js","../../../../js/api/factory/studiengang.js","../../../../js/components/Cis/Cms/StudiengangInformation/StudiengangInformation.js","../../../../js/api/factory/cms.js","../../../../js/components/Cis/Cms/News.js","../../../../js/components/Cis/Cms/Content_types/Raum_contentmittitel.js","../../../../js/helpers/LegacyLinkReplaceHelper.js","../../../../js/components/Cis/Cms/Content_types/General.js","../../../../js/components/Cis/Cms/Content.js","../../../../js/components/Cis/Cms/Content_types/News_content.js","../../../../js/components/Cis/Cms/Content_types/Iframe_content.js","../../../../js/components/Cis/Mylv/RoomInformation.js","../../../../js/api/factory/abgabe.js","../../../../js/components/Overlay/FhcOverlay.js","../../../../js/components/Cis/Abgabetool/AbgabeStudentDetail.js","../../../../js/components/Cis/Abgabetool/getDateStyleClass.js","../../../../js/components/Cis/Abgabetool/AbgabetoolStudent.js","../../../../js/components/Cis/Abgabetool/AbgabeMitarbeiterDetail.js","../../../../js/helpers/EmailHelpers.js","../../../../js/components/Cis/Abgabetool/AbgabetoolMitarbeiter.js","../../../../js/components/Bootstrap/Offcanvas.js","../../../../js/api/factory/studiensemester.js","../../../../js/components/Cis/Abgabetool/StatusLegende.js","../../../../js/components/Cis/Abgabetool/AbgabetoolAssistenz.js","../../../../js/components/Cis/Abgabetool/DeadlineOverview.js","../../../../js/components/Cis/Studium/Studium.js","../../../../js/api/factory/renderers.js","../../../../js/api/factory/routeinfo.js","../../../../js/apps/Dashboard/Fhc.js","../../../../js/helpers/CssVarCalcHelpers.js","../../../../js/helpers/StringHelpers.js"],"sourcesContent":["//import Phrasen from '../../plugin/Phrasen.js';\n\nexport default {\n\tname: 'BootstrapModal',\n\tdata: () => ({\n\t\tmodal: null,\n\t\tfullscreen: false\n\t}),\n\tprops: {\n\t\tbackdrop: {\n\t\t\ttype: [Boolean,String],\n\t\t\tdefault: true,\n\t\t\tvalidator(value) {\n\t\t\t\treturn ['static', true, false].includes(value);\n\t\t\t}\n\t\t},\n\t\tfocus: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true\n\t\t},\n\t\tkeyboard: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true\n\t\t},\n\t\tnoCloseBtn: Boolean,\n\t\tdialogClass: [String,Array,Object],\n\t\theaderClass: {\n\t\t\ttype: [String,Array,Object],\n\t\t\tdefault: ''\n\t\t},\n\t\tbodyClass: {\n\t\t\ttype: [String,Array,Object],\n\t\t\tdefault: 'px-4 py-5'\n\t\t},\n\t\tfooterClass: {\n\t\t\ttype: [String,Array,Object],\n\t\t\tdefault: ''\n\t\t},\n\t\tallowFullscreenExpand: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t}\n\t},\n\temits: [\n\t\t\"hideBsModal\",\n\t\t\"hiddenBsModal\",\n\t\t\"hidePreventedBsModal\",\n\t\t\"showBsModal\",\n\t\t\"shownBsModal\",\n\t\t\"toggleFullscreen\"\n\t],\n\tmethods: {\n\t\tdispose() {\n\t\t\treturn this.modal.dispose();\n\t\t},\n\t\thandleUpdate() {\n\t\t\treturn this.modal.handleUpdate();\n\t\t},\n\t\thide() {\n\t\t\treturn this.modal.hide();\n\t\t},\n\t\tshow(relatedTarget) {\n\t\t\treturn this.modal.show(relatedTarget);\n\t\t},\n\t\ttoggle() {\n\t\t\treturn this.modal.toggle();\n\t\t},\n\t\ttoggleFullscreen() {\n\t\t\tthis.fullscreen = !this.fullscreen\n\t\t\tthis.$emit('toggleFullscreen')\n\t\t}\n\t},\n\tmounted() {\n\t\tif (this.$refs.modal)\n\t\t\tthis.modal = new bootstrap.Modal(this.$refs.modal, {\n\t\t\t\tbackdrop: this.backdrop,\n\t\t\t\tfocus: this.focus,\n\t\t\t\tkeyboard: this.keyboard\n\t\t\t});\n\t},\n\tpopup(body, options, title, footer) {\n\t\tconst BsModal = this,\n\t\t\tslots = {};\n\t\tif (body !== undefined)\n\t\t\tslots.default = () => body;\n\t\tif (title !== undefined)\n\t\t\tslots.title = () => title;\n\t\tif (footer !== undefined)\n\t\t\tslots.footer = () => footer;\n\n\t\t// little hack to check whether primevue is included in the app or not\n\t\tlet includedPrimevue = false;\n\t\tif(typeof primevue !== 'undefined'){\n\t\t\tincludedPrimevue = true;\n\t\t}\n\n\t\treturn new Promise((resolve,reject) => {\n\t\t\tconst instance = Vue.createApp({\n\t\t\t\tname: 'ModalTmpApp',\n\t\t\t\tsetup() {\n\t\t\t\t\treturn () => Vue.h(BsModal, {...{\n\t\t\t\t\t\tclass: 'fade'\n\t\t\t\t\t},...options, ...{\n\t\t\t\t\t\tref: 'modal',\n\t\t\t\t\t\t'onHidden.bs.modal': instance.unmount\n\t\t\t\t\t}}, slots);\n\t\t\t\t},\n\t\t\t\tmounted() {\n\t\t\t\t\tthis.$refs.modal.show();\n\t\t\t\t\t\n\t\t\t\t},\n\t\t\t\tbeforeUnmount() {\n\t\t\t\t\tif (this.$refs.modal)\n\t\t\t\t\t\tthis.$refs.modal.result !== false ? resolve(this.$refs.modal.result) : reject();\n\t\t\t\t},\n\t\t\t\tunmounted() {\n\t\t\t\t\twrapper.parentElement.removeChild(wrapper);\n\t\t\t\t}\n\t\t\t});\n\t\t\tconst wrapper = document.createElement(\"div\");\n\t\t\t\n\t\t\t// if(primevue) --> won't work because primevue is not defined in this scope and promise would be rejected\n\t\t\tif (includedPrimevue){\n\t\t\t\tinstance.use(primevue.config.default, {zIndex: {overlay: 9999}})\n\t\t\t}\n\t\t\t\t \n\t\t\t//instance.use(Phrasen); // TODO(chris): find a more dynamic way\n\t\t\timport('../../plugins/Phrasen.js').then((Phrasen) => {\n\t\t\t\tinstance.use(Phrasen.default);\n\t\t\t\tinstance.mount(wrapper);\n\t\t\t\tdocument.body.appendChild(wrapper);\n\t\t\t});\n\t\t});\n\t},\n\ttemplate: `
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    `\n}\n","import BsModal from './Modal.js';\n\nexport default {\n\tname: 'BootstrapAlert',\n\tcomponents: {\n\t\tBsModal\n\t},\n\tmixins: [\n\t\tBsModal\n\t],\n\tprops: {\n\t\tdialogClass: {\n\t\t\ttype: [String,Array,Object],\n\t\t\tdefault: 'modal-dialog-centered'\n\t\t},\n\t\t/*\n\t\t * NOTE(chris):\n\t\t * Hack to expose in \"emits\" declared events to $props which we use\n\t\t * in the v-bind directive to forward all events.\n\t\t * @see: https://github.com/vuejs/core/issues/3432\n\t\t*/\n\t\tonHideBsModal: Function,\n\t\tonHiddenBsModal: Function,\n\t\tonHidePreventedBsModal: Function,\n\t\tonShowBsModal: Function,\n\t\tonShownBsModal: Function\n\t},\n\tdata: () => ({\n\t\tresult: true\n\t}),\n\tmounted() {\n\t\tthis.modal = this.$refs.modalContainer.modal;\n\t},\n\tpopup(msg, options) {\n\t\treturn BsModal.popup.bind(this)(msg, options);\n\t},\n\ttemplate: `\n\t\t\n\t\t\n\t`\n}\n","import BsAlert from './Alert.js';\n\nexport default {\n\tname: 'BootstrapConfirm',\n\tmixins: [\n\t\tBsAlert\n\t],\n\tdata: () => ({\n\t\tresult: false\n\t}),\n\tpopup(msg, options) {\n\t\treturn BsAlert.popup.bind(this)(msg, options);\n\t},\n\ttemplate: `\n\t\t\n\t\t\n\t`\n}\n","export default {\n\tname:'GridItem',\n\tcomponents: {\n\t},\n\tinject: {\n\t},\n\tprops: {\n\t\titem: Object,\n\t\tactive: Boolean\n\t},\n\temits: [\n\t\t\"mouseDown\",\n\t\t\"mouseUp\",\n\t\t\"startMove\",\n\t\t\"startResize\",\n\t\t\"dragging\",\n\t\t\"endDrag\",\n\t\t\"dropDrag\",\n\t\t\"item\",\n\t\t\"touchStart\",\n\t\t\"touchEnd\",\n\t],\n\tdata() {\n\t\treturn {\n\t\t\tdragAction: '',\n\t\t\tdragging: false\n\t\t}\n\t},\n\tcomputed: {\n\t},\n\tmethods: {\n\t\tregisterDragAction(evt) {\n\t\t\tthis.$emit('mouseDown', evt);\n\t\t\tif (evt.target.hasAttribute('drag-action')) {\n\t\t\t\tthis.dragAction = evt.target.getAttribute('drag-action');\n\t\t\t} else {\n\t\t\t\tlet parent = evt.target.closest('[drag-action]');\n\t\t\t\tif (parent) {\n\t\t\t\t\tthis.dragAction = parent.getAttribute('drag-action');\n\t\t\t\t} else {\n\t\t\t\t\tthis.dragAction = '';\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\ttryDragStart(evt, item) {\n\t\t\tlet dragAction = this.dragAction || evt.target.getAttribute('drag-action');\n\t\t\tif (dragAction) {\n\t\t\t\tthis.dragging = true;\n\t\t\t\tif (dragAction == 'move')\n\t\t\t\t\treturn this.$emit('startMove', evt, item);\n\t\t\t\telse if (dragAction == 'resize')\n\t\t\t\t\treturn this.$emit('startResize', evt, item);\n\t\t\t}\n\t\t\t//evt.preventDefault();\n\t\t},\n\t\ttouchDragEnd(evt) {\n\t\t\tif (!this.dragging)\n\t\t\t\treturn;\n\t\t\tthis.dragging = false;\n\t\t\tthis.$emit('touchEnd', evt);\n\t\t},\n\t\ttouchStart(event){\n\t\t\tthis.$emit('touchStart', event); \n\t\t\tthis.registerDragAction(event); \n\t\t\tthis.tryDragStart(event, this.item);\n\t\t},\n\t\ttouchMove(event){\n\t\t\tif(this.dragging){\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.$emit('dragging', event);\n\t\t\t}\n\t\t}\n\t\t\n\t},\n\ttemplate: `\n\t
    \n\t\t\n\t
    `\n}\n","// TODO(chris): Comments\n\nconst DIR_UP = 0;\nconst DIR_LEFT = 1;\nconst DIR_RIGHT = 2;\nconst DIR_DOWN = 3;\n\nclass GridLogic {\n\tconstructor(w) {\n\t\tif (w.w) {\n\t\t\tthis.w = w.w;\n\t\t\tthis.h = w.h;\n\t\t\tthis.data = [...w.data];\n\t\t\tthis.grid = [...w.grid];\n\t\t} else {\n\t\t\tthis.w = w;\n\t\t\tthis.h = 1;\n\t\t\tthis.data = [];\n\t\t\tthis.grid = [];\n\t\t}\n\t}\n\tisFreeSlot(x, y) {\n\t\tconst i = y*this.w + x;\n\t\treturn !this.grid[i] && this.grid[i] !== 0;\n\t}\n\tgetMaxY(){\n\t\treturn this.data.reduce((acc, item) => { \n\t\t\tif (item?.y > acc) {\n\t\t\t\t acc = item.y; \n\t\t\t} \n\t\t\treturn acc; \n\t\t}, 0);\n\t}\n\tgetFreeSlots() {\n\t\tconst freeSlots = [];\n\t\tlet biggestY = this.getMaxY();\n\t\tlet totalSpaces = this.w * (biggestY+1);\n\t\tfor(let i=0; i < totalSpaces; i++){\n\t\t\tif (!this.grid[i] && this.grid[i] !== 0){\n\t\t\t\tthis.grid[i] = undefined;\n\t\t\t}\n\t\t}\n\t\tfor(let i =0; i < this.grid.length; i++){\n\t\t\tif (!this.grid[i] && this.grid[i] !== 0){\n\t\t\t\tlet x = i % this.w;\n\t\t\t\tlet y = Math.floor(i / this.w);\n\t\t\t\tfreeSlots.push({x, y});\n\t\t\t}\n\t\t}\n\t\treturn freeSlots;\n\t}\n\tadd(item, prefer) {\n\t\tlet occupiers = this.getItemsInFrame(item.frame);\n\t\tif (!occupiers.length) {\n\t\t\titem.frame.forEach(f => this.grid[f] = item.index);\n\t\t\tthis.data[item.index] = item;\n\t\t\tthis.h = Math.max(this.h, item.y + item.h);\n\t\t\treturn [];\n\t\t} else {\n\t\t\tconst intermGrid = new GridLogic(this);\n\t\t\t\n\t\t\titem.frame.forEach(f => intermGrid.grid[f] = -1);\n\n\t\t\tconst possiblities = intermGrid.tryMoving(occupiers, prefer);\n\t\t\tif (possiblities.length) {\n\t\t\t\tconst bestOption = possiblities.sort((a,b) => {\n\t\t\t\t\tif (a.cost === undefined)\n\t\t\t\t\t\ta.cost = a.moves.reduce((a, v) => a * v.cost, 1);\n\t\t\t\t\tif (b.cost === undefined)\n\t\t\t\t\t\tb.cost = b.moves.reduce((a, v) => a * v.cost, 1);\n\t\t\t\t\treturn a.cost > b.cost;\n\t\t\t\t});\n\t\t\t\tconst result = [];\n\t\t\t\tbestOption[0].moves.forEach(move => {\n\t\t\t\t\tconst currItem = {...this.data[move.index]};\n\t\t\t\t\tcurrItem.x += move.x;\n\t\t\t\t\tcurrItem.y += move.y;\n\t\t\t\t\tcurrItem.frame = this.getItemFrame(currItem);\n\t\t\t\t\tthis.h = Math.max(this.h, currItem.y + currItem.h);\n\t\t\t\t\tthis.remove(currItem);\n\t\t\t\t\tcurrItem.frame.forEach(f => this.grid[f] = currItem.index);\n\t\t\t\t\tthis.data[move.index] = currItem;\n\t\t\t\t\tresult[move.index] = {\n\t\t\t\t\t\tindex: currItem.index,\n\t\t\t\t\t\tx: currItem.x,\n\t\t\t\t\t\ty: currItem.y\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t\titem.frame.forEach(f => this.grid[f] = item.index);\n\t\t\t\tthis.data[item.index] = item;\n\n\t\t\t\treturn result;\n\t\t\t} else {\n\t\t\t\tconsole.error('FATAL', \"can't arrange item on grid\");\n\t\t\t}\n\t\t}\n\t}\n\tmove(item, x, y) {\n\t\tif (item.data.place[this.w]?.pinned)\n\t\t\treturn [];\n\t\tif (item.x == x && item.y == y)\n\t\t\treturn [];\n\t\t\n\t\tthis.remove(item);\n\n\t\tlet prefer = undefined;\n\t\tif (item.x == x) {\n\t\t\tif (y-item.y > 0)\n\t\t\t\tprefer = DIR_UP;\n\t\t\telse\n\t\t\t\tprefer = DIR_DOWN;\n\t\t} else if (item.y == y) {\n\t\t\tif (x-item.x > 0)\n\t\t\t\tprefer = DIR_LEFT;\n\t\t\telse\n\t\t\t\tprefer = DIR_RIGHT;\n\t\t}\n\n\t\tconst originalFrame = Array.isArray(item.frame) ? [...item.frame] : [item.frame];\n\n\t\tconst currItem = {...item};\n\t\tcurrItem.x = x;\n\t\tcurrItem.y = y;\n\t\tcurrItem.frame = this.getItemFrame(currItem);\n\t\tlet occupiers = this.getItemsInFrame(currItem.frame);\n\t\t\n\t\t// does not update if the target conatins pinned widgets\n\t\tif (occupiers.some(frame => this.data[frame]?.data.place[this.w]?.pinned)) {\n\t\t\treturn [];\n\t\t}\n\t\t\n\t\t// checks if target contains widget with the same high and width\n\t\tlet occupiersData = occupiers.map(occupier => this.data[occupier]);\n\t\tlet occupiersFrame = occupiersData.map(occupier => occupier.frame).flat();\n\t\tif (!occupiersFrame.some(frame => !currItem.frame.includes(frame)) && !occupiersFrame.some(frame => originalFrame.includes(frame))){\n\t\t\tlet replaceUpdate = [];\n\t\t\tlet newOccupierFrames = [];\n\t\t\tfor(let f of originalFrame){\n\t\t\t\tif(newOccupierFrames.includes(f)){\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tlet occ = occupiersData.shift();\n\t\t\t\tif(occ){\n\t\t\t\t\tnewOccupierFrames = [...newOccupierFrames, ...this.getItemFrame({ ...occ, ...this.getSingleFramePosition(f) })];\n\t\t\t\t\treplaceUpdate[occ.index] = { index: occ.index, ...this.getSingleFramePosition(f)}\n\t\t\t\t}\n\t\t\t}\n\t\t\treplaceUpdate[item.index] = { index: item.index, x, y };\n\t\t\t\n\t\t\treturn replaceUpdate;\n\t\t}\n\t\t\n\t\tconst updates = this.add(currItem, prefer);\n\t\tupdates[item.index] = {index: item.index, x, y};\n\t\treturn updates;\n\t}\n\tresize(item, w, h) {\n\t\tif (item.w == w && item.h == h)\n\t\t\treturn [];\n\t\tthis.remove(item);\n\n\t\tconst currItem = {...item};\n\t\tcurrItem.w = w;\n\t\tcurrItem.h = h;\n\t\tcurrItem.frame = this.getItemFrame(currItem);\n\t\t\n\t\tconst updates = this.add(currItem);\n\t\tif(updates)\n\t\t\tupdates[item.index] = {index: item.index, w, h, x:item.x, y:item.y, resize:true};\n\n\t\treturn updates;\n\t}\n\ttryMoving(index, prefer) {\n\t\tif (Array.isArray(index)) {\n\t\t\tindex.forEach(i => this.remove({index:i}));\n\t\t\tlet possiblities = [{grid: this, moves: []}];\n\t\t\tindex.forEach(i => {\n\t\t\t\tlet newPoss = [];\n\t\t\t\tpossiblities.forEach(possiblity => {\n\t\t\t\t\tpossiblity.grid.tryMoving(i, prefer).forEach(p => {\n\t\t\t\t\t\tpossiblity.moves\n\t\t\t\t\t\tp.moves = [...p.moves, ...possiblity.moves];\n\t\t\t\t\t\tnewPoss.push(p)\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\tpossiblities = newPoss;\n\t\t\t});\n\t\t\treturn possiblities;\n\t\t}\n\t\tconst directions = [DIR_UP, DIR_DOWN, DIR_LEFT, DIR_RIGHT];\n\n\t\tthis.remove({index});\n\n\t\tconst weight = 1 + .2*(this.data[index].weight || 0);\n\n\t\treturn directions.reduce((result, dir) => {\n\t\t\tlet res = this.tryMovingInDirection(dir, index, 1, (prefer === dir ? .5 : 1 + dir*.1) * weight);\n\t\t\tif (!res)\n\t\t\t\treturn result;\n\t\t\treturn [...result, ...res];\n\t\t}, []).filter(p => p);\n\t}\n\ttryMovingInDirection(dir, index, amount, cost) {\n\t\tconst move = {index, x:0, y: 0, cost: cost};\n\t\tlet targetframe;\n\t\tswitch(dir) {\n\t\t\tcase DIR_UP:\n\t\t\t\tif (this.data[index].data?.place[this.w]?.pinned || this.data[index].y - amount < 0)\n\t\t\t\t\treturn false;\n\t\t\t\ttargetframe = this.data[index].frame.map(i => i-this.w*amount);\n\t\t\t\tmove.y = -amount;\n\t\t\t\tbreak;\n\t\t\tcase DIR_DOWN:\n\t\t\t\tif (this.data[index].data?.place[this.w]?.pinned)\n\t\t\t\t\treturn false;\n\t\t\t\tif (this.data[index].y + this.data[index].h + amount > this.h)\n\t\t\t\t\tcost += .4;\n\t\t\t\ttargetframe = this.data[index].frame.map(i => i+this.w*amount);\n\t\t\t\tmove.y = amount;\n\t\t\t\tbreak;\n\t\t\tcase DIR_LEFT:\n\t\t\t\tif (this.data[index].data?.place[this.w]?.pinned || this.data[index].x - amount < 0)\n\t\t\t\t\treturn false;\n\t\t\t\ttargetframe = this.data[index].frame.map(i => i-amount);\n\t\t\t\tmove.x = -amount;\n\t\t\t\tbreak;\n\t\t\tcase DIR_RIGHT:\n\t\t\t\tif (this.data[index].data?.place[this.w]?.pinned || this.data[index].x + this.data[index].w + amount > this.w)\n\t\t\t\t\treturn false;\n\t\t\t\ttargetframe = this.data[index].frame.map(i => i+amount);\n\t\t\t\tmove.x = amount;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tconst occupiers = this.getItemsInFrame(targetframe);\n\t\tif (occupiers.includes(-1)) {\n\t\t\treturn this.tryMovingInDirection(dir, index, amount+1, cost);\n\t\t}\n\t\t\n\t\tconst intermGrid = new GridLogic(this);\n\t\ttargetframe.forEach(f => intermGrid.grid[f] = -1);\n\t\t\n\t\tif (!occupiers.length) {\n\t\t\treturn [{grid: intermGrid, moves: [move]}];\n\t\t}\n\t\tconst possiblities = intermGrid.tryMoving(occupiers).map(possiblity => possiblity.moves.unshift(move) && possiblity);\n\t\treturn possiblities.length ? possiblities : false;\n\t}\n\tclearWeights() {\n\t\tthis.data.forEach(item => item.weight = undefined);\n\t}\n\tgetItemsInFrame(frame) {\n\t\treturn frame.map(i => this.grid[i]).filter((v,i,a) => (v || v === 0) && a.indexOf(v) === i);\n\t}\n\tremove(item) {\n\t\tthis.grid = this.grid.map(i => i != item.index ? i : undefined);\n\t}\n\tgetItemFrame(item) {\n\t\tconst frame = [];\n\t\tfor (let i = 0; i < item.w; i++)\n\t\t\tfor (let j = 0; j < item.h; j++)\n\t\t\t\tframe.push(i + item.x + (j + item.y) * this.w);\n\t\treturn frame;\n\t}\n\tgetSingleFramePosition(frame){\n\t\treturn { x: frame % this.w, y: Math.floor(frame / this.w)};\n\t}\n\tdebug() {\n\t\treturn this.grid;\n\t}\n}\n\nexport default GridLogic;","// TODO(chris): Comments\n\nimport GridItem from './Grid/Item.js';\nimport GridLogic from '../../composables/GridLogic.js';\n\nconst MODE_IDLE = 0;\nconst MODE_MOVE = 1;\nconst MODE_RESIZE = 2;\nconst MODE_MOUSE_DOWN = 3;\n\nexport default {\n\tname: 'Grid',\n\tcomponents: {\n\t\tGridItem,\n\t},\n\tprops: {\n\t\tcols: Number,\n\t\titems: Array,\n\t\titemsSetup: Object,\n\t\tresizeLimit: Function,\n\t\tactive: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true\n\t\t},\n\t\tmarginForExtraRow: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0\n\t\t},\n\t\tadditionalRow:{\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t}\n\t},\n\temits: [\n\t\t\"rearrangeItems\",\n\t\t\"newItem\",\n\t\t\"gridHeight\",\n\t\t\"draggedItem\",\n\t\t\"update:additionalRow\"\n\t],\n\tdata() {\n\t\treturn {\n\t\t\tx: -1,\n\t\t\ty: -1,\n\t\t\tclientX:0,\n\t\t\tclientY: 0,\n\t\t\tmode: MODE_IDLE,\n\t\t\tgrid: null,\n\t\t\tdragGrid: null,\n\t\t\tpermUpdates: [],\n\t\t\tpositionUpdates: null,\n\t\t\tfixedPositionUpdates: null,\n\t\t\tdraggedOffset: [0,0],\n\t\t\tdraggedItem: null,\n\t\t\tdraggedNode: null,\n\t\t\treorderedItems:[],\n\t\t\tclonedWidget:null,\n\t\t}\n\t},\n\tinject:{\n\t\tsectionName: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t},\n\tcomputed: {\n\t\tadditionalRowComputed: {\n\t\t\tget() {\n\t\t\t\treturn this.additionalRow;\n\t\t\t},\n\t\t\tset(value) {\n\t\t\t\tthis.$emit('update:additionalRow', value);\n\t\t\t}\n\t\t},\n\t\titems_hashmap() {\n\t\t\tlet items = {};\n\t\t\tthis.items.forEach(item => {\n\t\t\t\tif (this.reorderedItems.length > 0 && this.needsReordering(item)){\n\t\t\t\t\t\tlet rearrangedPosition = this.reorderedItems.filter(widget => widget.data.widgetid == item.widgetid)?.pop();\n\t\t\t\t\t\tif (rearrangedPosition) {\t\t\t\n\t\t\t\t\t\t\titem.x = rearrangedPosition.x;\n\t\t\t\t\t\t\titem.y = rearrangedPosition.y;\n\t\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\titems[`x${item.x}y${item.y}`] = item;\n\t\t\t});\t\n\t\t\treturn items\n\t\t},\n\t\titems_placeholders(){\n\t\t\tlet placeholders = [];\n\t\t\tlet col_max = this.cols;\n\t\t\tlet rows_max = this.rows;\n\n\t\t\t// occupied hashmap to keep track of the occupied cells\n\t\t\tlet occupied = {};\n\n\t\t\tfor (let y = 0; y < rows_max; y++) {\n\t\t\t\tfor (let x = 0; x < col_max; x++) {\n\t\t\t\t\t// skip current position if it was registered as occupied\n\t\t\t\t\tif (Object.keys(occupied).length && occupied[`x${x}y${y}`]) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tlet current_item = this.items_hashmap[`x${x}y${y}`];\n\t\t\t\t\tif (current_item) {\n\t\t\t\t\t\t//calculate the occupied cells from the width and the height from the items \n\t\t\t\t\t\tlet width = current_item.w;\n\t\t\t\t\t\tlet height = current_item.h;\n\t\t\t\t\t\tlet max_x = x + width - 1;\n\t\t\t\t\t\tlet max_y = y + height - 1;\n\t\t\t\t\t\tif(x != max_x || y != max_y){\n\t\t\t\t\t\t\tfor (let occupied_y = y; occupied_y <= max_y; occupied_y++) {\n\t\t\t\t\t\t\t\tfor (let occupied_x = x; occupied_x <= max_x; occupied_x++) {\n\t\t\t\t\t\t\t\t\tif (occupied_x != x || occupied_y != y) {\n\t\t\t\t\t\t\t\t\t\toccupied[`x${occupied_x}y${occupied_y}`]=true;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tplaceholders.push({ x: x, y: y, w: 1, h: 1, placeholder: true, \n\t\t\t\t\t\t\tdata: { id: 'placeholder_' + String(placeholders.length).padStart(4, \"0\") } });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn placeholders;\n\t\t},\n\t\tplacedItems_withPlaceholders() {\n\t\t\treturn [...this.placedItems, ...this.items_placeholders];\n\t\t},\n\t\trows() {\n\t\t\tif (this.additionalRowComputed) {\n\t\t\t\t\treturn this.grid ? (this.grid.h+1) : 1;\n\t\t\t}\n\t\t\treturn this.grid ? this.grid.h : 1;\n\t\t\t\n\t\t},\n\t\tgridStyle() {\n\t\t\tconst addH = this.active ? this.marginForExtraRow : 0;\n\t\t\treturn {\n\t\t\t\t'--fhc-dg-row-height': 100/(this.rows + addH) + '%',\n\t\t\t\t'--fhc-dg-col-width': 100/this.cols + '%',\n\t\t\t\t'--fhc-dg-item-padding-horizontal': '0.25%',\n\t\t\t\t'--fhc-dg-item-padding-top': '0.5%',\n\t\t\t\t'padding-bottom': 100 * (this.rows + addH)/this.cols + '%'\n\t\t\t}\n\t\t},\n\t\tindexedItems() {\n\t\t\treturn this.items.map(\n\t\t\t\t(item, index) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tindex: index,\n\t\t\t\t\t\tx: item.x,\n\t\t\t\t\t\ty: item.y,\n\t\t\t\t\t\tw: item.w,\n\t\t\t\t\t\th: item.h,\n\t\t\t\t\t\tweight: item.weight || 0,\n\t\t\t\t\t\tdata: item\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t);\n\t\t},\n\t\tprePlacedItems() {\n\t\t\tif (!this.fixedPositionUpdates)\n\t\t\t\treturn this.indexedItems;\n\t\t\treturn this.indexedItems.map(item => {\n\t\t\t\tif (!this.fixedPositionUpdates[item.index])\n\t\t\t\t\treturn item;\n\t\t\t\treturn {\n\t\t\t\t\tindex: item.index,\n\t\t\t\t\tweight: item.weight,\n\t\t\t\t\tdata: item.data,\n\t\t\t\t\tx: this.fixedPositionUpdates[item.index].x === undefined ? item.x : this.fixedPositionUpdates[item.index].x,\n\t\t\t\t\ty: this.fixedPositionUpdates[item.index].y === undefined ? item.y : this.fixedPositionUpdates[item.index].y,\n\t\t\t\t\tw: this.fixedPositionUpdates[item.index].w === undefined ? item.w : this.fixedPositionUpdates[item.index].w,\n\t\t\t\t\th: this.fixedPositionUpdates[item.index].h === undefined ? item.h : this.fixedPositionUpdates[item.index].h\n\t\t\t\t};\n\t\t\t});\n\t\t},\n\t\tplacedItems() {\n\t\t\tif (!this.positionUpdates)\n\t\t\t\treturn this.prePlacedItems;\n\t\t\tlet mappedPlacedItems= this.prePlacedItems.map(item => {\n\t\t\t\tif (!this.positionUpdates[item.index] )\n\t\t\t\t\treturn item;\n\t\t\t\tlet height_diff = this.positionUpdates[item.index]?.h - item.h;\n\t\t\t\tlet width_diff = this.positionUpdates[item.index]?.w - item.w;\n\t\t\t\treturn {\n\t\t\t\t\tresize: this.positionUpdates[item.index]?.resize,\n\t\t\t\t\tindex: item.index,\n\t\t\t\t\tweight: item.weight,\n\t\t\t\t\tdata: item.data,\n\t\t\t\t\tx: this.positionUpdates[item.index].x === undefined ? item.x : this.positionUpdates[item.index].x,\n\t\t\t\t\ty: this.positionUpdates[item.index].y === undefined ? item.y : this.positionUpdates[item.index].y,\n\t\t\t\t\tw: width_diff>0?item.w:this.positionUpdates[item.index].w === undefined ? item.w : this.positionUpdates[item.index].w,\n\t\t\t\t\th: height_diff > 0 ?item.h:this.positionUpdates[item.index].h === undefined ? item.h : this.positionUpdates[item.index].h\n\t\t\t\t\t\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tlet temporaryResizeItems = [];\n\t\t\tmappedPlacedItems.forEach(item=>{\n\t\t\t\tif(item.resize){\n\t\t\t\t\tlet newItem = {\n\t\t\t\t\t\t...item,\n\t\t\t\t\t\tw:this.positionUpdates[item.index].w === undefined ? item.w : this.positionUpdates[item.index].w,\n\t\t\t\t\t\th:this.positionUpdates[item.index].h === undefined ? item.h : this.positionUpdates[item.index].h,\n\t\t\t\t\t\tresizeOverlay:true,\n\t\t\t\t\t\tblank:true,\n\t\t\t\t\t};\n\t\t\t\t\ttemporaryResizeItems.push(newItem)\n\t\t\t\t}\n\t\t\t})\n\t\t\treturn [...mappedPlacedItems, ...temporaryResizeItems];\n\t\t},\n\t\tshowEmptyTileHover() {\n\t\t\tif (!this.active || !this.grid || this.mode != MODE_IDLE || this.x < 0 || this.y < 0 || this.x >= this.cols || this.y >= this.rows)\n\t\t\t\treturn false;\n\t\t\treturn this.grid.isFreeSlot(this.x, this.y);\n\t\t},\n\t\twidgetSetup(){\n\t\t\tif (!this.widgetsSetup)\n\t\t\t\treturn;\n\t\t\treturn this.widgetsSetup.reduce((acc, ele) => { \n\t\t\t\tacc[ele.widget_id] =ele;\n\t\t\t\treturn acc;\n\t\t\t} ,{});\n\t\t},\n\t},\n\twatch: {\n\t\tactive(active) {\n\t\t\tif (!active)\n\t\t\t\tthis.dragCancel();\n\t\t},\n\t\tcols() {\n\t\t\tthis.dragCancel();\n\t\t},\n\t rows: {\n\t\t\thandler(value) {\n\t\t\t\tthis.$emit('gridHeight', value);\n\t\t\t},\n\t\t\timmediate: true\n\t\t},\n\t\tindexedItems: {\n\t\t\thandler(value) {\n\t\t\t\tthis.dragCancel();\n\n\t\t\t\tconst updated = this.createNewGrid(value);\n\n\t\t\t\tthis.fixedPositionUpdates = updated;\n\t\t\t\tif (updated.length)\n\t\t\t\t\tthis.$emit('rearrangeItems', updated.filter(v => v));\n\t\t\t},\n\t\t\timmediate: true,\n\t\t\tdeep: true\n\t\t}\n\t},\n\tmethods: {\n\t\tneedsReordering(item){\n\t\t\tif (!item?.data?.place[this.cols]){\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\ttoggleDraggedItemOverlay(condition){\n\t\t\tif(!this.draggedNode)\n\t\t\t\treturn;\n\t\t\tif(condition){\n\t\t\t\tthis.draggedNode.firstElementChild.classList.add(\"dashboard-item-overlay\");\n\t\t\t}else{\n\t\t\t\tthis.draggedNode.firstElementChild.classList.remove(\"dashboard-item-overlay\");\n\t\t\t}\n\t\t},\n\t\tdragging(event){\n\t\t\tif(this.mode == MODE_MOVE){\n\t\t\t\tthis.toggleDraggedItemOverlay(true);\n\t\t\t\t\n\t\t\t\tconst containerRect = this.$refs.container.getBoundingClientRect();\n\t\t\t\tconst clonedWidgetRect = this.clonedWidget.getBoundingClientRect();\n\t\t\t\t\n\t\t\t\tlet desiredTop = this.clientY - 20;\n\t\t\t\tlet desiredLeft = this.clientX - 15;\n\t\t\t\t\n\t\t\t\tconst minTop = 0;\n\t\t\t\tconst maxTop = containerRect.height - clonedWidgetRect.height;\n\t\t\t\tconst minLeft = 0;\n\t\t\t\tconst maxLeft = containerRect.width - clonedWidgetRect.width;\n\t\t\t\t\n\t\t\t\tconst constrainedTop = Math.max(minTop, Math.min(maxTop, desiredTop));\n\t\t\t\tconst constrainedLeft = Math.max(minLeft, Math.min(maxLeft, desiredLeft));\n\t\t\t\t\n\t\t\t\tthis.clonedWidget.style.top = `${constrainedTop}px`;\n\t\t\t\tthis.clonedWidget.style.left = `${constrainedLeft}px`;\n\t\t\t}\n\t\t},\n\t\tcreateNewGrid(items) {\n\t\t\tthis.grid = new GridLogic(this.cols);\n\t\t\tconst result = [];\n\t\t\tlet sortedItems = [...items].sort((a, b) => {\n\t\t\t\tif(this.needsReordering(a) && this.needsReordering(b)){\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\telse if(this.needsReordering(a)){\n\t\t\t\t\treturn 999;\n\t\t\t\t}\n\t\t\t\telse if(this.needsReordering(b)){\n\t\t\t\t\treturn -999;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn a.weight > b.weight;\n\t\t\t}); \n\t\t\tlet reorderedItems = [];\n\t\t\tsortedItems.forEach(item => {\n\t\t\t\tlet freeSlots = this.grid.getFreeSlots();\n\t\t\t\t\n\t\t\t\tif(this.needsReordering(item)){\n\t\t\t\t\tlet firstFreeSlot = freeSlots.shift();\n\t\t\t\t\tif (!firstFreeSlot) {\n\t\t\t\t\t\titem.x = 0;\n\t\t\t\t\t\titem.y = this.grid.h;\n\t\t\t\t\t}else{\n\t\t\t\t\t\titem.x = firstFreeSlot.x;\n\t\t\t\t\t\titem.y = firstFreeSlot.y;\n\t\t\t\t\t}\n\t\t\t\t\treorderedItems.push(item);\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tif (item.x + item.w > this.cols) {\n\t\t\t\t\tlet targetW = this.cols-item.x,\n\t\t\t\t\t\ttargetX = undefined;\n\t\t\t\t\tif (this.resizeLimit) {\n\t\t\t\t\t\t[targetW] = this.resizeLimit(item.data, targetW, item.h);\n\t\t\t\t\t}\n\t\t\t\t\tif (targetW < 1)\n\t\t\t\t\t\ttargetW = 1;\n\t\t\t\t\tif (targetW > this.cols)\n\t\t\t\t\t\ttargetW = this.cols;\n\t\t\t\t\tif (item.x + targetW > this.cols) {\n\t\t\t\t\t\ttargetX = this.cols - targetW;\n\t\t\t\t\t}\n\t\t\t\t\tif (targetW == item.w)\n\t\t\t\t\t\ttargetW = undefined;\n\t\t\t\t\tresult[item.index] = {\n\t\t\t\t\t\titem: item.data,\n\t\t\t\t\t\tx: targetX,\n\t\t\t\t\t\tw: targetW\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\titem.frame = this.grid.getItemFrame(item);\n\t\t\t\tthis.convertGridResultToUpdate(this.grid.add(item), result, items);\n\t\t\t});\n\t\t\tthis.reorderedItems = reorderedItems;\n\t\t\tthis.grid.clearWeights();\n\t\t\treturn result;\n\t\t},\n\t\tconvertGridResultToUpdate(input, output, baseArray) {\n\t\t\t\n\t\t\tif (!input)\n\t\t\t\treturn;\n\t\t\tif (!baseArray)\n\t\t\t\tbaseArray = this.indexedItems;\n\t\t\tinput.forEach(item => {\n\t\t\t\tlet result = {\n\t\t\t\t\titem: baseArray[item.index].data\n\t\t\t\t};\n\t\t\t\tif (item.x !== undefined)\n\t\t\t\t\tresult.x = item.x;\n\t\t\t\tif (item.y !== undefined)\n\t\t\t\t\tresult.y = item.y;\n\t\t\t\tif (item.w !== undefined)\n\t\t\t\t\tresult.w = item.w;\n\t\t\t\tif (item.h !== undefined)\n\t\t\t\t\tresult.h = item.h;\n\t\t\t\toutput[item.index] = result;\n\t\t\t});\n\t\t},\n\t\tmouseLeave() {\n\t\t\t/* if (this.mode == MODE_IDLE) {\n\t\t\t\tthis.x = -1;\n\t\t\t\tthis.y = -1;\n\t\t\t\t\n\t\t\t} */\n\t\t},\n\t\tupdateCursor(evt) {\n\t\t\tif (!this.active) {\n\t\t\t\tthis.x = this.y = -1;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst addH = this.active ? this.marginForExtraRow : 0;\n\t\t\tconst rect = this.$refs.container.getBoundingClientRect();\n\t\t\t\n\t\t\tif (!evt.clientX && !evt.clientY && evt.touches){\n\t\t\t\tevt.clientX = evt.touches[0].clientX;\n\t\t\t\tevt.clientY = evt.touches[0].clientY;\n\t\t\t}\n\n\t\t\tthis.clientX = (evt.clientX - rect.left);\n\t\t\tthis.clientY = (evt.clientY - rect.top);\n\t\t\tconst gridX = Math.floor(this.cols * (evt.clientX - rect.left) / this.$refs.container.clientWidth);\n\t\t\tconst gridY = Math.floor((this.rows + addH) * (evt.clientY - rect.top) / this.$refs.container.clientHeight);\n\t\t\t\n\t\t\tif (this.x == gridX && this.y == gridY)\n\t\t\t\treturn false;\n\t\t\t\n\t\t\tthis.x = gridX;\n\t\t\tthis.y = gridY;\n\n\t\t\treturn true;\n\t\t},\n\t\t_dragStart(evt, item) {\n\t\t\tif (evt.dataTransfer) {\n\t\t\t\tevt.dataTransfer.setDragImage(evt.target, -99999, -99999);\n\t\t\t\tevt.dataTransfer.dropEffect = 'move';\n\t\t\t\tevt.dataTransfer.effectAllowed = 'move';\n\t\t\t}\n\t\t},\n\t\tstartMove(evt, item) {\n\t\t\t\n\t\t\tif (!this.active)\n\t\t\t\treturn;\n\t\t\t\n\t\t\tthis.mode = MODE_MOVE;\n\t\t\t\n\t\t\tthis.draggedItem = item;\n\t\t\t\n\t\t\tthis.$emit('draggedItem', item);\n\t\t\t// workaround for chrome fireing event dragend when styles are manipulated during dragging\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.draggedNode = evt.target.closest(\".drop-grid-item\");\n\t\t\t\t//clones the widget for the drag Image\n\t\t\t\t\n\t\t\t\tlet clone = evt.target.closest(\".drop-grid-item\")?.cloneNode(true);\n\n\t\t\t\tclone.style.zIndex = 5;\n\t\t\t\tclone.classList.add(\"widgetClone\");\n\t\t\t\tthis.$refs.container.appendChild(clone);\n\t\t\t\tconst hiddenWidget = clone.querySelector(\"[style='display: none;']\");\n\t\t\t\thiddenWidget.style.removeProperty(\"display\");\n\t\t\t\tthis.clonedWidget = clone;\n\t\t\t}, 0);\n\n\t\t\tthis.draggedOffset = [item.x - this.x, item.y - this.y];\n\t\t\tthis._dragStart(evt, item);\n\t\t},\n\t\tstartResize(evt, item) {\n\t\t\tif (!this.active)\n\t\t\t\treturn;\n\t\t\tthis.mode = MODE_RESIZE;\n\t\t\tthis.draggedItem = item;\n\t\t\tthis.$emit('draggedItem', item);\n\t\t\tthis._dragStart(evt);\n\t\t},\n\t\tdragOver(evt) {\n\t\t\tif ((this.y + 1) > this.rows && (this.mode == MODE_MOVE || this.mode == MODE_RESIZE)) {\n\t\t\t\tthis.dragCancel();\n\t\t\t\t\n\t\t\t}\n\t\t\tif (!this.active)\n\t\t\t\treturn this.dragCancel();\n\t\t\tthis.checkPinnedWidgetAnimation();\n\t\t\tif(this.mode == MODE_RESIZE){\n\t\t\t\tthis.checkWidgetSizeLimitAnimation();\n\t\t\t}\n\t\t\tif (this.updateCursor(evt)) {\n\t\t\t\tswitch(this.mode) {\n\t\t\t\t\tcase MODE_MOVE: {\n\t\t\t\t\t\tevt.preventDefault();\n\t\t\t\t\t\tthis.dragGrid = new GridLogic(this.grid);\n\t\t\t\t\t\tlet x = this.x + this.draggedOffset[0];\n\t\t\t\t\t\tlet y = this.y + this.draggedOffset[1];\n\t\t\t\t\t\tif (x < 0) {\n\t\t\t\t\t\t\tthis.draggedOffset[0] += x;\n\t\t\t\t\t\t\tx = 0;\n\t\t\t\t\t\t} else if (x + this.draggedItem.w > this.cols) {\n\t\t\t\t\t\t\tthis.draggedOffset[0] += this.cols - this.draggedItem.w - x;\n\t\t\t\t\t\t\tx = this.cols - this.draggedItem.w;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (y < 0) {\n\t\t\t\t\t\t\tthis.draggedOffset[1] += y;\n\t\t\t\t\t\t\ty = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.positionUpdates= this.dragGrid.move(this.draggedItem, x, y);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase MODE_RESIZE: {\n\t\t\t\t\t\tevt.preventDefault();\n\t\t\t\t\t\tthis.dragGrid = new GridLogic(this.grid);\n\t\t\t\t\t\tlet w = Math.min(this.cols - this.draggedItem.x, Math.max(1, this.x - this.draggedItem.x + 1));\n\t\t\t\t\t\tlet h = Math.max(1, this.y - this.draggedItem.y + 1);\n\t\t\t\t\t\tif (this.resizeLimit)\n\t\t\t\t\t\t\t[w, h] = this.resizeLimit(this.draggedItem.data, w, h);\n\t\t\t\t\t\tthis.positionUpdates = this.dragGrid.resize(this.draggedItem, w, h);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tdragCancel() {\n\t\t\tthis.removeWidgetClones();\n\t\t\tthis.additionalRowComputed = false;\n\t\t\tthis.toggleDraggedItemOverlay(false);\n\t\t\tthis.mode = MODE_IDLE;\n\t\t\tthis.positionUpdates = null;\n\t\t\tthis.draggedOffset = [0,0],\n\t\t\tthis.draggedItem = null;\n\t\t\tthis.$emit('draggedItem',null);\n\t\t\tthis.draggedNode = null;\n\t\t\t\n\t\t},\n\t\tdragEnd() {\n\t\t\tthis.removeWidgetClones();\n\t\t\tthis.toggleDraggedItemOverlay(false);\n\t\t\t\n\t\t\tif (this.mode == MODE_IDLE){\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// clean up unused classes\n\t\t\tlet draggedItemNode = document.getElementById(this.draggedItem.data.widgetid);\n\t\t\tdraggedItemNode.classList.remove(\"border-danger\");\n\t\t\tArray.from(document.getElementsByClassName(\"denied-dragging-animation\"))?.forEach(ele => {\n\t\t\t\tele.classList.remove(\"denied-dragging-animation\");\n\t\t\t})\n\t\t\t\n\t\t\t//if (!this.active || this.x < 0 || this.y < 0 || this.x >= this.cols)\n\t\t\t\t//return this.dragCancel();\n\n\t\t\tthis.mode = MODE_IDLE;\n\t\t\tlet updated = [];\n\t\t\tthis.convertGridResultToUpdate(this.positionUpdates, updated);\n\t\t\tupdated = this._updateFixedPositions(updated);\n\t\t\tif (updated.length)\n\t\t\t\tthis.$emit('rearrangeItems', updated.filter(v => v));\n\n\t\t\tthis.draggedItem = null;\n\t\t\tthis.draggedNode = null;\n\t\t\tthis.$emit('draggedItem', null);\n\t\t},\n\t\t_updateFixedPositions(updated) {\n\t\t\tupdated.forEach((item, index) => {\n\t\t\t\tif (!this.fixedPositionUpdates[index])\n\t\t\t\t\tthis.fixedPositionUpdates[index] = item;\n\t\t\t\telse\n\t\t\t\t\tthis.fixedPositionUpdates[index] = {...this.fixedPositionUpdates[index], ...item};\n\t\t\t});\n\t\t\tlet additionalUpdates = this.createNewGrid(this.prePlacedItems);\n\t\t\tif (additionalUpdates.length) {\n\t\t\t\t// NOTE(chris): this should never happen but it's here for safety\n\t\t\t\tadditionalUpdates.forEach((item, index) => updated[index] = item);\n\t\t\t\treturn this._updateFixedPositions(updated);\n\t\t\t}\n\t\t\treturn updated;\n\t\t},\n\t\temptyTileClicked() {\n\t\t\tthis.additionalRowComputed = false;\n\t\t\tthis.$emit('newItem', this.x, this.y);\n\t\t},\n\t\tupdateCursorOnMouseMove(evt){\n\t\t\tif(this.mode == MODE_IDLE){\n\t\t\t\tthis.updateCursor(evt);\n\t\t\t}\n\t\t},\n\t\tcheckPinnedWidgetAnimation(){\n\t\t\tlet itemAtPosition=[];\n\t\t\tswitch(this.mode){\n\t\t\t\tcase MODE_RESIZE:\n\t\t\t\t\tfor (let x = this.draggedItem.x; x <= this.x; x++) {\n\t\t\t\t\t\tfor (let y = this.draggedItem.y; y <= this.y; y++) {\n\t\t\t\t\t\t\tthis.items.forEach(item => {\n\t\t\t\t\t\t\t\tif (item.x == x && item.y == y) {\n\t\t\t\t\t\t\t\t\titemAtPosition.push(item);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase MODE_MOVE:\n\t\t\t\t\titemAtPosition = this.items.filter(item=>item.x == this.x && item.y == this.y);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tArray.from(document.getElementsByClassName(\"denied-dragging-animation\"))?.forEach(ele => {\n\t\t\t\tele.classList.remove(\"denied-dragging-animation\");\n\t\t\t})\n\n\t\t\titemAtPosition.forEach(item=>{\n\t\t\t\tif (item.place[this.cols] && item.place[this.cols].pinned) {\n\t\t\t\t\tlet pinnedWidget = document.getElementById(item.widgetid);\n\t\t\t\t\tlet pinNode = pinnedWidget.querySelector(\"[pinned='true']\");\n\t\t\t\t\tif (!pinNode.classList.contains(\"denied-dragging-animation\")) {\n\t\t\t\t\t\tpinNode.classList.add(\"denied-dragging-animation\");\n\t\t\t\t\t}\n\t\t\t\t}\t\n\t\t\t})\n\t\t},\n\t\tcheckWidgetSizeLimitAnimation() {\n\n\t\t\tlet draggedItemSetup = this.itemsSetup[this.draggedItem.data.widget];\n\t\t\tlet draggedItemMaxWidth = draggedItemSetup.width.max ?? draggedItemSetup.width;\n\t\t\tlet draggedItemMinWidth = draggedItemSetup.width.min ?? draggedItemSetup.width;\n\t\t\tlet draggedItemMaxHeight = draggedItemSetup.height.max ?? draggedItemSetup.height;\n\t\t\tlet draggedItemMinHeight = draggedItemSetup.height.min ?? draggedItemSetup.height;\n\t\t\tlet draggedItemNode = document.getElementById(this.draggedItem.data.widgetid);\n\n\t\t\tlet width_after_resize = this.x - this.draggedItem.x + 1; \n\t\t\tlet height_after_resize = this.y - this.draggedItem.y + 1; \n\t\t\tif( \n\t\t\t\t(width_after_resize > 0 && (width_after_resize > draggedItemMaxWidth\n\t\t\t\t|| width_after_resize < draggedItemMinWidth)\n\t\t\t\t)\n\t\t\t\t||\n\t\t\t\t(height_after_resize > 0 && (height_after_resize > draggedItemMaxHeight\n\t\t\t\t|| height_after_resize < draggedItemMinHeight)\n\t\t\t\t)\n\t\t\t){\n\t\t\t\tdraggedItemNode.classList.add(\"border-danger\");\n\t\t\t}else{\n\t\t\t\tdraggedItemNode.classList.remove(\"border-danger\");\n\t\t\t}\n\t\t},\n\t\tremoveWidgetClones(){\n\t\t\tlet widgetClones = Array.from(document.getElementsByClassName(\"widgetClone\"));\n\t\t\tfor (let i = 0; i < widgetClones.length; i++) {\n\t\t\t\tthis.$refs.container.removeChild(widgetClones[i]);\n\t\t\t}\n\t\t},\n\t\tmouseDown(){\n\t\t\tthis.mode = MODE_MOUSE_DOWN;\n\t\t},\n\t\tmouseUp() {\n\t\t\tthis.mode = MODE_IDLE;\n\t\t},\n\t},\n\ttemplate: `\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t`\n}\n\n/*\nOLD VERSION - ON HOVER\n\n\t\n\n*/","let __widgets = {};\nlet __widgetsStarted = {};\nlet __path = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/dashboard/Widget';\n\nexport default {\n\tgetWidget(id) {\n\t\treturn __widgets[id];\n\t},\n\tloadWidget(id) {\n\t\tif (__widgets[id])\n\t\t\treturn Promise.resolve(__widgets[id]);\n\t\tif (__widgetsStarted[id])\n\t\t\treturn __widgetsStarted[id];\n\t\tif (!__path)\n\t\t\treturn Promise.reject('Widget could not be loaded because there is no path yet!');\n\n\t\t__widgetsStarted[id] = new Promise((resolve, reject) => {\n\t\t\taxios.get(__path, {params:{id}}).then(res => {\n\t\t\t\t__widgets[id] = res.data.retval;\n\t\t\t\t__widgetsStarted[id] = undefined;\n\t\t\t\tresolve(__widgets[id]);\n\t\t\t}).catch(error => reject(error.response.data.retval.error));\n\t\t});\n\t\treturn __widgetsStarted[id];\n\t},\n\tsetPath(path) {\n\t\t__path = path;\n\t}\n}","import BsModal from \"../Bootstrap/Modal.js\";\nimport CachedWidgetLoader from \"../../composables/Dashboard/CachedWidgetLoader.js\";\nimport HeightTransition from \"../Tranistion/HeightTransition.js\";\n\nimport {absoluteJsImportUrl} from \"../../helpers/UrlHelpers.js\";\n\nexport default {\n\tname: 'Item',\n\tcomponents: {\n\t\tBsModal,\n\t\tHeightTransition\n\t},\n\tdata: () => ({\n\t\tcomponent: \"\",\n\t\targuments: null,\n\t\ttarget: false,\n\t\twidget: null,\n\t\ttmpConfig: {},\n\t\tisLoading: false,\n\t\thasConfig: false,\n\t\tsharedData: null,\n\t}),\n\temits: [\n\t\t\"change\",\n\t\t\"remove\",\n\t\t\"dragstart\",\n\t\t\"resizestart\",\n\t\t\"configOpened\",\n\t\t\"configClosed\",\n\t\t\"pinItem\",\n\t\t\"unPinItem\"\n\t],\n\tprops: [\n\t\t\"id\",\n\t\t\"widgetID\",\n\t\t\"config\",\n\t\t\"width\",\n\t\t\"height\",\n\t\t\"custom\",\n\t\t\"hidden\",\n\t\t\"editMode\",\n\t\t\"loading\",\n\t\t\"item_data\",\n\t\t\"place\",\n\t\t\"setup\",\n\t\t\"dragstate\",\n\t\t\"resizeOverlay\",\n\t\t\"additionalRow\"\n\t],\n\tcomputed: {\n\t\tmaxHeight(){\n\t\t\treturn this.setup?.height?.max;\n\t\t},\n\t\tmaxWidth(){\n\t\t\tif (Object.prototype.toString.call(this.setup?.width) == \"[object Number]\"){\n\t\t\t\treturn this.setup?.width;\n\t\t\t}\n\t\t\treturn this.setup?.width?.max;\n\t\t},\n\t\tminHeight() {\n\t\t\treturn this.setup?.height?.min;\n\t\t},\n\t\tminWidth() {\n\t\t\treturn this.setup?.width?.min;\n\t\t},\n\t\tisResizeable(){\n\t\t\treturn this.maxWidth >1 || this.maxHeight >1;\n\t\t},\n\t\tisPinned(){\n\t\t\treturn this.place?.pinned ? true : false;\n\t\t},\n\t\tready() {\n\t\t\treturn this.component && this.arguments !== null;\n\t\t},\n\t},\n\tmethods: {\n\t\tunpin(){\n\t\t\t// Unpinning is only possible in edit mode\n\t\t\tif(!this.editMode)\n\t\t\t\treturn;\n\t\t\tlet result = { item: this.item_data, x: this.item_data.x, y: this.item_data.y };\n\t\t\tthis.$emit('unPinItem', [result]);\n\t\t},\n\t\tpinItem(){\n\t\t\tlet result = { item: this.item_data, x: this.item_data.x, y: this.item_data.y};\n\t\t\tthis.$emit('pinItem',[result]);\n\t\t},\n\t\tgetWidgetC4Link(widget) {\n\t\t\treturn (FHC_JS_DATA_STORAGE_OBJECT.app_root +\n\t\t\t\tFHC_JS_DATA_STORAGE_OBJECT.ci_router + widget.setup.cis4link)\n\t\t},\n\t\thandleShowBsModal() {\n\t\t\tthis.$emit('configOpened')\n\t\t},\n\t\thandleHideBsModal() {\n\t\t\tthis.$emit('configClosed')\n\t\t},\n\t\tmouseDown(e) {\n\t\t\tthis.target = e.target;\n\t\t},\n\t\tstartDrag(e) {\n\t\t\tif (this.$refs.dragHandle.contains(this.target)) {\n\t\t\t\tthis.$emit(\"dragstart\", e);\n\t\t\t} else if (\n\t\t\t\tthis.isResizeable &&\n\t\t\t\tthis.$refs.resizeHandle.contains(this.target)\n\t\t\t) {\n\t\t\t\tif (this.isResizeable) this.$emit(\"resizestart\", e);\n\t\t\t\telse e.preventDefault();\n\t\t\t} else {\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t},\n\t\topenConfig() {\n\t\t\tthis.tmpConfig = { ...this.arguments };\n\t\t\tthis.$refs.config.show();\n\t\t},\n\t\tsetConfig(hasConfig) {\n\t\t\tthis.hasConfig = hasConfig;\n\t\t},\n\t\tchangeConfig() {\n\t\t\tthis.isLoading = true;\n\t\t\tlet config = { ...this.tmpConfig };\n\t\t\tthis.sendChangeConfig(config);\n\t\t},\n\t\tchangeConfigManually() {\n\t\t\tlet config = { ...this.arguments };\n\t\t\tthis.sendChangeConfig(config);\n\t\t},\n\t\tsendChangeConfig(config) {\n\t\t\tfor (var k in config) {\n\t\t\t\tif (this.widget.arguments[k] == config[k]) {\n\t\t\t\tdelete config[k];\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.$emit(\"change\", config);\n\t\t},\n\t},\n\twatch: {\n\t\tconfig() {\n\t\t\tthis.arguments = { ...this.widget?.arguments, ...this.config };\n\t\t\tthis.tmpConfig = { ...this.arguments };\n\t\t\tthis.$refs.config && this.$refs.config.hide();\n\t\t\tthis.isLoading = false;\n\t\t},\n\t},\n\tasync created() {\n\t\tthis.widget = await CachedWidgetLoader.loadWidget(this.id);\n\t\tlet component = (await import(this.widget.setup.file)).default;\n\t\tthis.$options.components[\"widget\" + this.widget.widget_id] = component;\n\t\tthis.component = \"widget\" + this.widget.widget_id;\n\t\tthis.arguments = { ...this.widget.arguments, ...this.config };\n\t\tthis.tmpConfig = { ...this.arguments };\n\t},\n\ttemplate: /*html*/ `\n\t
    \n\t\t
    \n\t\t\t\n\t\t
    \n\t
    \n\t
    \n\t
    \n\t\t
    \n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t{{ widget.setup.name }}\n\t\t\t\n\t\t\t\n\t\t\t\n \t\t\n \t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t\t
    \n\t\t\t\n\t\t
    \n\t\t
    \n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\n\t\t
    \n\t
    `,\n};\n","export default {\n\tdata(){\n\t\treturn {\n\n\t\t}\n\t},\n\tmethods:{\n\t\tonEnter(el,done){\n\t\t\tel.style.height = '0';\n\t\t\tel.style.height = el.scrollHeight + 'px';\n\t\t},\n\t\tonLeave(el,done){\n\t\t\tel.style.height = el.scrollHeight + 'px';\n\t\t\tel.style.height = '0';\n\t\t}\n\t},\n\ttemplate:\n\t/*html*/`\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t`,\n};","export default {\n\tdata(){\n\t\treturn {\n\n\t\t}\n\t},\n\tprops:{\n\t\twidget:{\n\t\t\ttype:Object,\n\t\t\trequired:true,\n\t\t}\n\t},\n\tmethods:{\n\t\tpath(src) {\n\t\t\tif (src[0] == '/')\n\t\t\t\treturn FHC_JS_DATA_STORAGE_OBJECT.app_root + src;\n\t\t\treturn src;\n\t\t}\n\t},\n\temits:[\"select\"],\n\ttemplate: /*html */`\n\t
    \n\t\t\n\t\t
    \n\t\t\t
    {{ widget.setup.name || widget.widget_kurzbz }}
    \n\t\t\t

    {{ widget.beschreibung }}

    \n\t\t
    \n\t
    `,\n}","import BsConfirm from \"../Bootstrap/Confirm.js\";\nimport DropGrid from '../Drop/Grid.js'\nimport DashboardItem from \"./Item.js\";\nimport CachedWidgetLoader from \"../../composables/Dashboard/CachedWidgetLoader.js\";\nimport WidgetIcon from \"./Widget/WidgetIcon.js\"\n\nexport default {\n\tname: 'Section',\n\tcomponents: {\n\t\tDropGrid,\n\t\tDashboardItem,\n\t\tWidgetIcon,\n\t},\n\tinject: {\n\t\twidgetsSetup:{\n\t\t\ttype: Array,\n\t\t\tdefault: [],\n\t\t},\n\t\tadminMode: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t},\n\t\teditMode: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t}\n\t},\n\tprops: [\n\t\t\"name\",\n\t\t\"widgets\"\n\t],\n\temits: [\n\t\t\"widgetAdd\",\n\t\t\"widgetUpdate\",\n\t\t\"widgetRemove\"\n\t],\n\tdata() {\n\t\treturn {\n\t\t\tconfigOpened: false,\n\t\t\tgridWidth: 1,\n\t\t\tgridHeight: null,\n\t\t\tdraggedItem:null,\n\t\t\tadditionalRow:false,\n\t\t}\n\t},\n\tprovide() {\n\t\treturn {\n\t\t\teditModeIsActive: Vue.computed(() =>\n\t\t\t\tthis.editModeIsActive\n\t\t\t),\t\n\t\t\tsectionName: Vue.computed(() => this.name),\t\n\t\t}\n\t},\n\tcomputed: {\n\t\tcomputedWidgetsSetup(){\n\t\t\tif(!this.widgetsSetup) return {};\n\t\t\treturn this.widgetsSetup.reduce((acc, setup)=>{\n\t\t\t\tacc[setup.widget_id] = setup.setup;\n\t\t\t\treturn acc;\n\t\t\t},{})\n\t\t},\n\t\teditModeIsActive() {\n\t\t\treturn (this.editMode || this.adminMode) && !this.configOpened\t\n\t\t},\n\t\tgetSectionStyle() {\n\t\t\treturn 'margin-bottom: 8px;';\n\t\t},\n\t\titems() {\n\t\t\t// reuses the nearest placement of the widget from another viewport \n\t\t\t/* const computeNearestPlace = (item, gridWidth) =>{\n\t\t\t\tlet place;\n\t\t\t\tif (Object.keys(item.place).length > 0) {\n\t\t\t\t\tconst nearestIndex = Object.keys(item.place)\n\t\t\t\t\t\t\t\t\t\t\t .sort((a, b) => Math.abs(a - gridWidth) - Math.abs(b - gridWidth))\n\t\t\t\t\t\t\t\t\t\t\t .shift();\n\t\t\t\t\tplace = item.place[nearestIndex];\n\t\t\t\t}\n\t\t\t\telse{\n\t\t\t\t\tplace = { x: 0, y: 0, w: 1, h: 1 };\n\t\t\t\t}\n\t\t\t\treturn place;\n\t\t\t} */\n\t\t\t\n\t\t\tlet placedItems = this.widgets.map(item => {\n\t\t\t\tif(!item?.widgetid && item?.id){\n\t\t\t\t\titem.widgetid = item.id;\n\t\t\t\t}\n\t\t\t\treturn { ...item, reorder: false, ...(item.place[this.gridWidth] || { reorder: true, ...{ x: 0, y: 0, w: 1, h: 1 } })};\n\t\t\t});\n\t\t\treturn placedItems;\n\t\t\t\n\t\t},\n\t\t\n\t},\n\tmethods: {\n\t\tsectionNameTranslation(){\n\t\t\tswitch(this.name){\n\t\t\t\tcase \"general\": \n\t\t\t\t\treturn this.$p.t('dashboard',this.name); \n\t\t\t\t\tbreak;\n\t\t\t\tcase \"custom\":\n\t\t\t\t\treturn this.$p.t('dashboard',this.name);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\treturn this.name;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t\tshowSectionInformation(){\n\t\t\tif (this.name == \"general\"){\n\t\t\t\treturn this.$p.t('dashboard', 'dashboardGeneralSectionDescription'); \n\t\t\t}\n\t\t\telse if(this.name == \"custom\"){\n\t\t\t\treturn this.$p.t('dashboard', 'dashboardCustomSectionDescription');\n\t\t\t}\n\t\t\telse{\n\t\t\t\treturn this.$p.t('dashboard', 'dashboardSectionDescription', [this.name]);\n\t\t\t}\n\t\t},\n\t\thandleConfigOpened() {\n\t\t\tthis.configOpened = true\n\t\t},\n\t\thandleConfigClosed() {\n\t\t\tthis.configOpened = false\n\t\t},\n\t\tcheckResizeLimit(item, w, h) {\n\t\t\t// NOTE(chris): widgets needs to be loaded for this to work\n\t\t\tlet widget = CachedWidgetLoader.getWidget(item.widget);\n\t\t\tif (widget) {\n\t\t\t\tlet minmaxW = widget.setup.width;\n\t\t\t\tif (minmaxW.max)\n\t\t\t\t\tminmaxW.min = minmaxW.min || 1;\n\t\t\t\telse\n\t\t\t\t\tminmaxW = {min:minmaxW,max:minmaxW};\n\t\t\t\tif (w < minmaxW.min)\n\t\t\t\t\tw = minmaxW.min; \n\t\t\t\tif (w > minmaxW.max)\n\t\t\t\t\tw = minmaxW.max;\n\n\t\t\t\tlet minmaxH = widget.setup.height;\n\t\t\t\tif (minmaxH.max)\n\t\t\t\t\tminmaxH.min = minmaxH.min || 1;\n\t\t\t\telse\n\t\t\t\t\tminmaxH = {min:minmaxH,max:minmaxH};\n\t\t\t\tif (h < minmaxH.min)\n\t\t\t\t\th = minmaxH.min;\n\t\t\t\tif (h > minmaxH.max)\n\t\t\t\t\th = minmaxH.max;\n\t\t\t}\n\t\t\treturn [w, h];\n\t\t},\n\t\tremoveWidget(item, revert) {\n\t\t\tif (item.custom) {\n\t\t\t\tBsConfirm.popup('Are you sure you want to delete this widget?').then(() => this.$emit('widgetRemove', this.name, item.id));\n\t\t\t} else {\n\t\t\t\tlet update = {};\n\t\t\t\tupdate[item.id] = { hidden: !revert };\n\t\t\t\tthis.updatePreset(update);\n\t\t\t}\n\t\t},\n\t\tsaveConfig(config, item) {\n\t\t\tlet payload = {};\n\t\t\tpayload[item.id] = { config };\n\t\t\tthis.updatePreset(payload);\n\t\t},\n\t\tupdatePositions(updated, pinned=false) {\n\t\t\tlet result = {};\n\t\t\tupdated.forEach(update => {\n\t\t\t\t\n\t\t\t\tlet item = {...update.item};\n\t\t\t\tif (!item.placeholder) {\n\t\t\t\tif (!item.place[this.gridWidth])\n\t\t\t\t\titem.place[this.gridWidth] = {x: 0, y: 0, w: 1, h: 1};\n\t\t\t\tdelete item.x;\n\t\t\t\tdelete item.y;\n\t\t\t\tdelete item.w;\n\t\t\t\tdelete item.h;\n\t\t\t\tdelete item.place[this.gridWidth].pinned;\n\t\t\t\tif (update.x !== undefined)\n\t\t\t\t\titem.place[this.gridWidth].x = update.x;\n\t\t\t\tif (update.y !== undefined)\n\t\t\t\t\titem.place[this.gridWidth].y = update.y;\n\t\t\t\tif (update.w !== undefined)\n\t\t\t\t\titem.place[this.gridWidth].w = update.w;\n\t\t\t\tif (update.h !== undefined)\n\t\t\t\t\titem.place[this.gridWidth].h = update.h;\n\t\t\t\tif (pinned){\n\t\t\t\t\titem.place[this.gridWidth].pinned = true;\n\t\t\t\t}\n\n\t\t\t\tresult[item.id] = item;\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.updatePreset(result);\n\t\t},\n\t\tupdatePreset(update) {\n\t\t\tlet payload = {};\n\t\t\tpayload[this.name] = update;\n\t\t\tthis.$emit('widgetUpdate', this.name, payload);\n\t\t}\n\t},\n\tmounted() {\n\t\tlet self = this;\n\t\tlet cont = self.$refs.container;\n\t\tself.gridWidth = parseInt(window.getComputedStyle(cont).getPropertyValue('--fhc-dashboard-grid-size'));\n\t\t\n\t\twindow.addEventListener('resize', () => {\n\t\t\tself.gridWidth = parseInt(window.getComputedStyle(cont).getPropertyValue('--fhc-dashboard-grid-size'));\n\t\t});\n\t},\n\ttemplate: `\n\t
    \n\t\t

    \n\t\t\t\n\t\t\t{{sectionNameTranslation()}}:\n\t\t

    \n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t
    `\n}\n\n/*\nOLD VERSION - ON HOVER\n\n*/","import BsModal from \"../../Bootstrap/Modal.js\";\nimport WidgetIcon from \"./WidgetIcon.js\";\n\nexport default {\n\tcomponents: {\n\t\tBsModal,\n\t\tWidgetIcon,\n\t},\n\tprops: [\n\t\t\"widgets\"\n\t],\n\tdata: () => ({\n\t\tcallbacks: {}\n\t}),\n\tmethods: {\n\t\tgetWidget() {\n\t\t\treturn new Promise((resolve,reject) => {\n\t\t\t\tthis.callbacks = {resolve,reject};\n\t\t\t\tthis.$refs.modal.show();\n\t\t\t});\n\t\t},\n\t\tclose() {\n\t\t\tif (this.callbacks.reject)\n\t\t\t\tthis.callbacks.reject();\n\t\t\tthis.callbacks = {};\n\t\t},\n\t\tpick(widget_id) {\n\t\t\tif (this.callbacks.resolve)\n\t\t\t\tthis.callbacks.resolve(widget_id);\n\t\t\tthis.callbacks = {};\n\t\t\tthis.$refs.modal.hide();\n\t\t},\n\t\t\n\t},\n\ttemplate: `
    \n\t\t 0}\" @hiddenBsModal=\"close\">\n\t\t\t\n\t\t\t\n\t\t\n\t
    `\n}\n","export default {\n\t/**\n\t* Performs a deep merge of objects and returns new object. Does not modify\n\t* objects (immutable) and merges arrays via concatenation.\n\t*\n\t* @param {...object} objects - Objects to merge\n\t* @returns {object} New object with merged key/values\n\t*/\n\tmergeDeep(...objects) {\n\t\tconst isObject = obj => obj && typeof obj === 'object';\n\t\t\n\t\treturn objects.reduce((prev, obj) => {\n\t\t\tObject.keys(obj).forEach(key => {\n\t\t\t\tconst pVal = prev[key];\n\t\t\t\tconst oVal = obj[key];\n\t\t\t\t\n\t\t\t\tif (Array.isArray(pVal) && Array.isArray(oVal)) {\n\t\t\t\t\tprev[key] = pVal.concat(...oVal);\n\t\t\t\t}\n\t\t\t\telse if (isObject(pVal) && isObject(oVal)) {\n\t\t\t\t\tprev[key] = this.mergeDeep(pVal, oVal);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tprev[key] = oVal;\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\treturn prev;\n\t\t}, {});\n\t}\n}","/**\n * Copyright (C) 2025 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tgetViewData() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Cis4FhcApi/getViewData'\n\t\t};\n\t}\n};","import DashboardSection from \"./Section.js\";\nimport DashboardWidgetPicker from \"./Widget/Picker.js\";\nimport ObjectUtils from \"../../helpers/ObjectUtils.js\";\n\nimport ApiDashboard from '../../api/factory/cis/dashboard.js';\n\nexport default {\n\tname: 'Dashboard',\n\tcomponents: {\n\t\tDashboardSection,\n\t\tDashboardWidgetPicker\n\t},\n\tprops: {\n\t\tdashboard: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t\tdefault: 'CIS'\n\t\t},\n\t\tviewData: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t\tvalidator(value) {\n\t\t\t\treturn value && value.name && value.uid && value.timezone\n\t\t\t}\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tsections: [],\n\t\t\twidgets: null,\n\t\t\teditMode: false,\n\t\t\tviewDataInternal: this.viewData\n\t\t}\n\t},\n\tprovide() {\n\t\treturn {\n\t\t\teditMode: Vue.computed(()=>this.editMode),\n\t\t\twidgetsSetup: Vue.computed(() => this.widgets),\n\t\t\ttimezone: Vue.computed(() => this.viewData.timezone)\n\t\t}\n\t},\n\tcomputed: {\n\t\tapiurl() {\n\t\t\treturn FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/dashboard';\n\t\t}\n\t},\n\tmethods: {\n\t\twidgetAdd(section_name, widget) {\n\t\t\tif (this.widgets === null) {\n\t\t\t\taxios.get(this.apiurl + '/Widget/getWidgetsForDashboard', {params:{\n\t\t\t\t\tdb: this.dashboard\n\t\t\t\t}}).then(res => {\n\t\t\t\t\tres.data.retval.forEach(widget => {\n\t\t\t\t\t\twidget.arguments = JSON.parse(widget.arguments);\n\t\t\t\t\t\twidget.setup = JSON.parse(widget.setup);\n\t\t\t\t\t});\n\t\t\t\t\tthis.widgets = res.data.retval;\n\t\t\t\t}).catch(err => console.error('ERROR:', err));\n\t\t\t}\n\t\t\tthis.$refs.widgetpicker.getWidget().then(widget_id => {\n\t\t\t\twidget.widget = widget_id;\n\t\t\t\twidget.id = 'loading_' + String((new Date()).valueOf());\n\t\t\t\tlet loading = {...widget};\n\t\t\t\tloading.loading = true;\n\t\t\t\tthis.sections.forEach(section => {\n\t\t\t\t\tif (section.name == section_name)\n\t\t\t\t\t\tsection.widgets.push(loading);\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\taxios.post(this.apiurl + '/Config/addWidgetsToUserOverride', {\n\t\t\t\t\tdb: this.dashboard,\n\t\t\t\t\tfunktion_kurzbz: section_name,\n\t\t\t\t\twidgets: [widget]\n\t\t\t\t}).then(result => {\n\t\t\t\t\tlet newId = Object.keys(result.data.retval.data[section_name].widgets).pop();\n\t\t\t\t\twidget.id = newId;\n\t\t\t\t\tthis.sections.forEach(section => {\n\t\t\t\t\t\tif (section.name == section_name) {\n\t\t\t\t\t\t\tsection.widgets.splice(section.widgets.indexOf(loading),1);\n\t\t\t\t\t\t\tsection.widgets.push(widget);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}).catch(error => {\n\t\t\t\t\tconsole.error('ERROR: ', error);\n\t\t\t\t\talert('ERROR: ' + error.response.data.retval);\n\t\t\t\t});\n\t\t\t}).catch(() => {});\n\t\t},\n\t\twidgetUpdate(section_name, payload) {\n\t\t\tpayload = payload[section_name];\n\t\t\tfor (var k in payload) {\n\t\t\t\tfor (var i in this.sections) {\n\t\t\t\t\tif (this.sections[i].name == section_name) {\n\t\t\t\t\t\tfor (var wid in this.sections[i].widgets) {\n\t\t\t\t\t\t\tif (this.sections[i].widgets[wid].id == k) {\n\t\t\t\t\t\t\t\tpayload[k] = ObjectUtils.mergeDeep(this.sections[i].widgets[wid], payload[k]);\n\t\t\t\t\t\t\t\t// NOTE(chris): remove internal props\n\t\t\t\t\t\t\t\tfor (var prop in {_x:1,_y:1,_w:1,_h:1,index:1,id:1,preset:1})\n\t\t\t\t\t\t\t\t\tif (payload[k][prop])\n\t\t\t\t\t\t\t\t\t\tdelete payload[k][prop];\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tpayload[k].widgetid = k;\n\t\t\t}\n\t\t\taxios.post(this.apiurl + '/Config/addWidgetsToUserOverride', {\n\t\t\t\tdb: this.dashboard,\n\t\t\t\tfunktion_kurzbz: section_name,\n\t\t\t\twidgets: payload\n\t\t\t}).then(() => {\n\t\t\t\tthis.sections.forEach(section => {\n\t\t\t\t\tif (section.name == section_name) {\n\t\t\t\t\t\tsection.widgets.forEach((widget, i) => {\n\t\t\t\t\t\t\tif (payload[widget.id]) {\n\t\t\t\t\t\t\t\tpayload[widget.id].id = widget.id;\n\t\t\t\t\t\t\t\tpayload[widget.id].index = widget.index;\n\t\t\t\t\t\t\t\tsection.widgets[i] = payload[widget.id];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}).catch(error => {\n\t\t\t\t// TODO(chris): revert placement on failure\n\t\t\t\tconsole.error('ERROR: ', error);\n\t\t\t\talert('ERROR: ' + error.response.data.retval);\n\t\t\t});\n\t\t},\n\t\twidgetRemove(section_name, id) {\n\t\t\taxios.post(this.apiurl + '/Config/removeWidgetFromUserOverride', {\n\t\t\t\tdb: this.dashboard,\n\t\t\t\tfunktion_kurzbz: section_name,\n\t\t\t\twidgetid: id\n\t\t\t}).then(() => {\n\t\t\t\tthis.sections.forEach(section => {\n\t\t\t\t\tif (section.name == section_name)\n\t\t\t\t\t\tsection.widgets = section.widgets.filter(widget => widget.id != id);\n\t\t\t\t});\n\t\t\t}).catch(error => {\n\t\t\t\tconsole.error('ERROR: ', error);\n\t\t\t\talert('ERROR: ' + error.response.data.retval);\n\t\t\t});\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.$p.loadCategory('dashboard');\n\t\taxios.get(this.apiurl + '/Widget/getWidgetsForDashboard', {\n\t\t\tparams: {\n\t\t\t\tdb: this.dashboard\n\t\t\t}\n\t\t}).then(res => {\n\t\t\tthis.widgets = res.data.retval;\n\t\t}).catch(err => console.error('ERROR:', err));\n\n\t\taxios.get(this.apiurl + '/Config', {params:{\n\t\t\tdb: this.dashboard\n\t\t}}).then(res => {\n\t\t\tfor (var name in res.data.retval) {\n\t\t\t\tlet widgets = [];\n\t\t\t\tlet remove = [];\n\t\t\t\tfor (var wid in res.data.retval[name].widgets) {\n\t\t\t\t\tres.data.retval[name].widgets[wid].id = wid;\n\t\t\t\t\tif (res.data.retval[name].widgets[wid].custom || res.data.retval[name].widgets[wid].preset)\n\t\t\t\t\t\twidgets.push(res.data.retval[name].widgets[wid]);\n\t\t\t\t\telse\n\t\t\t\t\t\tremove.push(wid);\n\t\t\t\t}\n\t\t\t\tthis.sections.push({\n\t\t\t\t\tname: name,\n\t\t\t\t\twidgets: widgets\n\t\t\t\t});\n\t\t\t\tremove.forEach(wid => this.widgetRemove(name, wid));\n\t\t\t}\n\t\t\tthis.sections = this.sections.sort((section1, section2) => {\n\t\t\t\tif(section1.name == 'custom')\n\t\t\t\t\treturn 1;\n\t\t\t\tif (section2.name == 'custom')\n\t\t\t\t\treturn -1;\n\t\t\t\treturn section2.widgets.length - section1.widgets.length;\n\t\t\t});\n\t\t}).catch(err => console.error('ERROR:', err));\n\t},\n\tasync beforeMount() {\n\t\tif (!this.viewData.name || !this.viewData.uid) {\n\t\t\tconst res = await this.$api.call(ApiDashboard.getViewData());\n\t\t\tthis.viewDataInternal = res.data\n\t\t}\t\n\t},\n\ttemplate: `\n\t
    \n\t\t

    \n\t\t\t{{ $p.t('global/personalGreeting', [ viewDataInternal?.name ]) }}\n\t\t\t\n\t\t

    \n\t\t\n\t\t\n\t
    `\n}\n","/**\n * Copyright (C) 2024 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tsearch(searchsettings, config) {\n\t\tconst url = '/api/frontend/v1/searchbar/search';\n\t\treturn this.$fhcApi.post(url, searchsettings, config);\n\t},\n\tsearchAdvanced(searchsettings, config) {\n\t\tconst url = '/api/frontend/v1/searchbar/searchAdvanced';\n\t\treturn this.$fhcApi.post(url, searchsettings, config);\n\t},\n\tsearchdummy(searchsettings) {\n\t\tconst url = 'public/js/apps/api/dummyapi.php/Search';\n\t\treturn this.$fhcApi.post(url, searchsettings);\n\t}\n};\n","/**\n * Copyright (C) 2024 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tloadCategory(category) {\n\t\treturn this.$fhcApi.get('/api/frontend/v1/phrasen/loadModule/' + category);\n\t},\n\tsetLanguage(categories,language) {\n\t\tconst payload = {categories, language}\n\t\treturn this.$fhcApi.post('/api/frontend/v1/phrasen/setLanguage', payload);\n\t},\n\tgetLanguage() {\n\t\treturn this.$fhcApi.get('/api/frontend/v1/phrasen/getLanguage', {});\n\t},\n\tgetActiveDbLanguages() {\n\t\treturn this.$fhcApi.get('/api/frontend/v1/phrasen/getAllLanguages', {});\n\t}\n};","/**\n * Copyright (C) 2024 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tgetHeader(navigation_page) {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/api/frontend/v1/navigation/header',\n\t\t\t{ navigation_page }\n\t\t);\n\t},\n\tgetMenu: function(navigation_page) {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/api/frontend/v1/navigation/menu',\n\t\t\t{ navigation_page }\n\t\t);\n\t}\n};\n\n","/**\n * Copyright (C) 2024 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tsaveCustomFilter(wsParams) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'/api/frontend/v1/filter/saveCustomFilter',\n\t\t\t{\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tcustomFilterName: wsParams.customFilterName\n\t\t\t}\n\t\t);\n\t},\n\tremoveCustomFilter(wsParams) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'/api/frontend/v1/filter/removeCustomFilter',\n\t\t\t{\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterId: wsParams.filterId\n\t\t\t}\n\t\t);\n\t},\n\tapplyFilterFields(wsParams) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'/api/frontend/v1/filter/applyFilterFields',\n\t\t\t{\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterFields: wsParams.filterFields\n\t\t\t}\n\t\t);\n\t},\n\taddFilterField(wsParams) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'/api/frontend/v1/filter/addFilterField',\n\t\t\t{\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterField: wsParams.filterField\n\t\t\t}\n\t\t);\n\t},\n\tremoveFilterField(wsParams) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'/api/frontend/v1/filter/removeFilterField',\n\t\t\t{\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterField: wsParams.filterField\n\t\t\t}\n\t\t);\n\t},\n\tgetFilterById(wsParams) {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/api/frontend/v1/filter/getFilter',\n\t\t\t{\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterId: wsParams.filterId\n\t\t\t}\n\t\t);\n\t},\n\tgetFilter(wsParams) {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/api/frontend/v1/filter/getFilter',\n\t\t\t{\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType\n\t\t\t}\n\t\t);\n\t}\n};\n\n","/**\n * Copyright (C) 2024 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tabmeldung: {\n\t\tgetDetails(antrag_id, prestudent_id) {\n\t\t\tconst url = '/api/frontend/v1/studstatus/abmeldung/'\n\t\t\t\t+ (antrag_id !== undefined ? 'getDetailsForAntrag/' + antrag_id : 'getDetailsForNewAntrag/' + prestudent_id);\n\t\t\treturn this.$fhcApi.get(url);\n\t\t},\n\t\tcreate(stdsem, prestudent_id, grund) {\n\t\t\treturn this.$fhcApi.post('/api/frontend/v1/studstatus/abmeldung/createAntrag', {\n\t\t\t\tstudiensemester: stdsem,\n\t\t\t\tprestudent_id,\n\t\t\t\tgrund\n\t\t\t}, {\n\t\t\t\terrorHandling: 'strict'\n\t\t\t});\n\t\t},\n\t\tcancel(antrag_id) {\n\t\t\tif (!Array.isArray(antrag_id))\n\t\t\t\treturn this.$fhcApi.post(\n\t\t\t\t\t'/api/frontend/v1/studstatus/abmeldung/cancelAntrag',\n\t\t\t\t\t{ antrag_id }\n\t\t\t\t);\n\t\t\treturn Promise.allSettled(antrag_id.map(antrag => this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/abmeldung/cancelAntrag',\n\t\t\t\t{ antrag_id: antrag.studierendenantrag_id },\n\t\t\t\t{ errorHeader: '#' + antrag.studierendenantrag_id }\n\t\t\t)));\n\t\t}\n\t},\n\tunterbrechung: {\n\t\tgetDetails(antrag_id, prestudent_id) {\n\t\t\tconst url = '/api/frontend/v1/studstatus/unterbrechung/'\n\t\t\t\t+ (antrag_id !== undefined ? 'getDetailsForAntrag/' + antrag_id : 'getDetailsForNewAntrag/' + prestudent_id);\n\t\t\treturn this.$fhcApi.get(url);\n\t\t},\n\t\tcreate(studiensemester, prestudent_id, grund, datum_wiedereinstieg, attachment) {\n\t\t\treturn this.$fhcApi.post('/api/frontend/v1/studstatus/unterbrechung/createAntrag', {\n\t\t\t\tstudiensemester,\n\t\t\t\tprestudent_id,\n\t\t\t\tgrund,\n\t\t\t\tdatum_wiedereinstieg,\n\t\t\t\tattachment\n\t\t\t}, {\n\t\t\t\terrorHandling: 'strict'\n\t\t\t});\n\t\t},\n\t\tcancel(antrag_id) {\n\t\t\treturn this.$fhcApi.post('/api/frontend/v1/studstatus/unterbrechung/cancelAntrag', {\n\t\t\t\tantrag_id\n\t\t\t}, {\n\t\t\t\terrorHandling: 'strict'\n\t\t\t});\n\t\t}\n\t},\n\twiederholung: {\n\t\tgetDetails(prestudent_id) {\n\t\t\tconst url = '/api/frontend/v1/studstatus/wiederholung/getDetailsForNewAntrag/' + prestudent_id;\n\t\t\treturn this.$fhcApi.get(url)\n\t\t},\n\t\tgetLvs(antrag_id) {\n\t\t\tconst url = '/api/frontend/v1/studstatus/wiederholung/getLvs/' + antrag_id;\n\t\t\treturn this.$fhcApi.get(url)\n\t\t},\n\t\tcreate(prestudent_id, studiensemester) {\n\t\t\treturn this.$fhcApi.post('/api/frontend/v1/studstatus/wiederholung/createAntrag', {\n\t\t\t\tprestudent_id,\n\t\t\t\tstudiensemester\n\t\t\t}, {\n\t\t\t\terrorHandling: 'strict'\n\t\t\t});\n\t\t},\n\t\tcancel(prestudent_id, studiensemester) {\n\t\t\treturn this.$fhcApi.post('/api/frontend/v1/studstatus/wiederholung/cancelAntrag', {\n\t\t\t\tprestudent_id,\n\t\t\t\tstudiensemester\n\t\t\t}, {\n\t\t\t\terrorHandling: 'strict'\n\t\t\t});\n\t\t},\n\t\tsaveLvs(forbiddenLvs, mandatoryLvs) {\n\t\t\treturn this.$fhcApi.post('/api/frontend/v1/studstatus/wiederholung/saveLvs', {\n\t\t\t\tforbiddenLvs,\n\t\t\t\tmandatoryLvs\n\t\t\t});\n\t\t}\n\t},\n\tleitung: {\n\t\tgetStgs() {\n\t\t\treturn this.$fhcApi.get('/api/frontend/v1/studstatus/leitung/getActiveStgs');\n\t\t},\n\t\tgetAntraege(url, config, params) {\n\t\t\treturn this.$fhcApi\n\t\t\t\t.get('/api/frontend/v1/studstatus/leitung/getAntraege/' + url)\n\t\t\t\t.then(res => res.data); // Return data for tabulator\n\t\t},\n\t\tgetHistory(antrag_id) {\n\t\t\treturn this.$fhcApi.get('/api/frontend/v1/studstatus/leitung/getHistory/' + antrag_id)\n\t\t},\n\t\tgetPrestudents(query, signal) {\n\t\t\treturn this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/leitung/getPrestudents',\n\t\t\t\t{ query },\n\t\t\t\t{\n signal: signal,\n timeout: 30000\n }\n\t\t\t);\n\t\t},\n\t\tapprove(antrag) {\n\t\t\tif (!Array.isArray(antrag))\n\t\t\t\treturn this.$fhcApi.post(\n\t\t\t\t\t'/api/frontend/v1/studstatus/leitung/approveAntrag',\n\t\t\t\t\tantrag\n\t\t\t\t);\n\t\t\treturn Promise.allSettled(antrag.map(a => this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/leitung/approveAntrag',\n\t\t\t\ta,\n\t\t\t\t{ errorHeader: '#' + a.studierendenantrag_id }\n\t\t\t)));\n\t\t},\n\t\treject(antrag) {\n\t\t\tif (!Array.isArray(antrag))\n\t\t\t\treturn this.$fhcApi.post(\n\t\t\t\t\t'/api/frontend/v1/studstatus/leitung/rejectAntrag',\n\t\t\t\t\tantrag\n\t\t\t\t);\n\t\t\treturn Promise.allSettled(antrag.map(a => this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/leitung/rejectAntrag',\n\t\t\t\ta,\n\t\t\t\t{ errorHeader: '#' + a.studierendenantrag_id }\n\t\t\t)));\n\t\t},\n\t\treopen(antrag) {\n\t\t\tif (!Array.isArray(antrag))\n\t\t\t\treturn this.$fhcApi.post(\n\t\t\t\t\t'/api/frontend/v1/studstatus/leitung/reopenAntrag',\n\t\t\t\t\tantrag\n\t\t\t\t);\n\t\t\treturn Promise.allSettled(antrag.map(a => this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/leitung/reopenAntrag',\n\t\t\t\ta,\n\t\t\t\t{ errorHeader: '#' + a.studierendenantrag_id }\n\t\t\t)));\n\t\t},\n\t\tpause(antrag) {\n\t\t\tif (!Array.isArray(antrag))\n\t\t\t\treturn this.$fhcApi.post(\n\t\t\t\t\t'/api/frontend/v1/studstatus/leitung/pauseAntrag',\n\t\t\t\t\tantrag\n\t\t\t\t);\n\t\t\treturn Promise.allSettled(antrag.map(a => this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/leitung/pauseAntrag',\n\t\t\t\ta,\n\t\t\t\t{ errorHeader: '#' + a.studierendenantrag_id }\n\t\t\t)));\n\t\t},\n\t\tunpause(antrag) {\n\t\t\tif (!Array.isArray(antrag))\n\t\t\t\treturn this.$fhcApi.post(\n\t\t\t\t\t'/api/frontend/v1/studstatus/leitung/unpauseAntrag',\n\t\t\t\t\tantrag\n\t\t\t\t);\n\t\t\treturn Promise.allSettled(antrag.map(a => this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/leitung/unpauseAntrag',\n\t\t\t\ta,\n\t\t\t\t{ errorHeader: '#' + a.studierendenantrag_id }\n\t\t\t)));\n\t\t},\n\t\tobject(antrag) {\n\t\t\tif (!Array.isArray(antrag))\n\t\t\t\treturn this.$fhcApi.post(\n\t\t\t\t\t'/api/frontend/v1/studstatus/leitung/objectAntrag',\n\t\t\t\t\tantrag\n\t\t\t\t);\n\t\t\treturn Promise.allSettled(antrag.map(a => this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/leitung/objectAntrag',\n\t\t\t\ta,\n\t\t\t\t{ errorHeader: '#' + a.studierendenantrag_id }\n\t\t\t)));\n\t\t},\n\t\tapproveObjection(antrag) {\n\t\t\tif (!Array.isArray(antrag))\n\t\t\t\treturn this.$fhcApi.post(\n\t\t\t\t\t'/api/frontend/v1/studstatus/leitung/approveObjection',\n\t\t\t\t\tantrag\n\t\t\t\t);\n\t\t\treturn Promise.allSettled(antrag.map(a => this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/leitung/approveObjection',\n\t\t\t\ta,\n\t\t\t\t{ errorHeader: '#' + a.studierendenantrag_id }\n\t\t\t)));\n\t\t},\n\t\tdenyObjection(antrag) {\n\t\t\tif (!Array.isArray(antrag))\n\t\t\t\treturn this.$fhcApi.post(\n\t\t\t\t\t'/api/frontend/v1/studstatus/leitung/denyObjection',\n\t\t\t\t\tantrag\n\t\t\t\t);\n\t\t\treturn Promise.allSettled(antrag.map(a => this.$fhcApi.post(\n\t\t\t\t'/api/frontend/v1/studstatus/leitung/denyObjection',\n\t\t\t\ta,\n\t\t\t\t{ errorHeader: '#' + a.studierendenantrag_id }\n\t\t\t)));\n\t\t}\n\t}\n};","export default {\n\n getView: function (uid) {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root + \n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/Profil/getView/${uid}`,{}\n );\n },\n\n fotoSperre: function (value) {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root + \n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/Profil/fotoSperre/${value}`,\n {}\n );\n \n },\n\n isStudent: function (uid) {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root + \n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/Profil/isStudent`,\n {\n uid:uid,\n }\n );\n },\n\n isMitarbeiter: function (uid) {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root + \n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/Profil/isMitarbeiter/${uid}`,\n {}\n );\n },\n\n getZustellAdresse: function () {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root + \n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/Profil/getZustellAdresse`,{}\n );\n },\n\n getZustellKontakt: function () {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root + \n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/Profil/getZustellKontakt`,{}\n );\n },\n\n getGemeinden: function(nation,zip){\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root + \n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/Profil/getGemeinden/${nation}/${zip}`,\n {}\n );\n \n },\n getAllNationen:function(){\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root + \n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n \"/api/frontend/v1/Profil/getAllNationen\",{}\n );\n },\n}","export default {\n //! API calls for profil update requests\n \n getStatus: function () {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/ProfilUpdate/getStatus`,{});\n },\n \n getTopic: function () {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/ProfilUpdate/getTopic`,{});\n },\n \n acceptProfilRequest: function ({profil_update_id, uid, status_message, topic, requested_change}) {\n\n return this.$fhcApi.post(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n \"/api/frontend/v1/ProfilUpdate/acceptProfilRequest\",{profil_update_id, uid, status_message, topic, requested_change});\n },\n \n denyProfilRequest: function ({profil_update_id, uid, topic, status_message}) {\n return this.$fhcApi.post(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n \"/api/frontend/v1/ProfilUpdate/denyProfilRequest\",{profil_update_id,uid,topic,status_message});\n },\n \n insertFile: function (dms, replace = null) {\n\n return this.$fhcApi.post(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/ProfilUpdate/insertFile/${replace}`,\n dms);\n\n },\n \n getProfilRequestFiles: function (requestID) {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/ProfilUpdate/getProfilRequestFiles/${requestID}`,{});\n },\n \n selectProfilRequest: function (uid = null, id = null) {\n\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/ProfilUpdate/selectProfilRequest`,\n {...(uid?{uid}:{}),\n ...(id?{id}:{})\n });\n },\n \n insertProfilRequest: function (topic, payload, fileID = null) {\n\n return this.$fhcApi.post(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n \"/api/frontend/v1/ProfilUpdate/insertProfilRequest\",\n {\n topic,\n payload,\n ...(fileID ? { fileID } : {}),\n });\n },\n \n updateProfilRequest: function (topic, payload, ID, fileID = null) {\n\n return this.$fhcApi.post(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/ProfilUpdate/updateProfilRequest`,\n {\n topic,\n payload,\n ID,\n ...(fileID ? { fileID: fileID } : {}),\n });\n },\n \n deleteProfilRequest: function (requestID) {\n\n return this.$fhcApi.post(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/ProfilUpdate/deleteProfilRequest`,\n {\n requestID,\n });\n },\n };\n ","\nexport default {\n\tgetRoomInfo(ort_kurzbz, start_date, end_date) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'/api/frontend/v1/LvPlan/getRoomplan',\n\t\t\t{ ort_kurzbz, start_date, end_date}\n\t\t);\n\t},\n\tgetStunden() {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/api/frontend/v1/LvPlan/Stunden',\n\t\t\t{}\n\t\t);\n\t},\n\tgetOrtReservierungen(ort_kurzbz, start_date, end_date) {\n\t\treturn this.$fhcApi.post(\n\t\t\t`/api/frontend/v1/LvPlan/getReservierungen/${ort_kurzbz}`,\n\t\t\t{ start_date, end_date}\n\t\t);\n\t},\n\tgetLvPlanReservierungen(start_date, end_date) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'/api/frontend/v1/LvPlan/getReservierungen',\n\t\t\t{ start_date, end_date }\n\t\t);\n\t},\n\tgetLehreinheitStudiensemester(lehreinheit_id) {\n\t\treturn this.$fhcApi.get(\n\t\t\t`/api/frontend/v1/LvPlan/getLehreinheitStudiensemester/${lehreinheit_id}`,\n\t\t\t{}\n\t\t);\n\t},\n\tstudiensemesterDateInterval(date) {\n\t\treturn this.$fhcApi.get(\n\t\t\t`/api/frontend/v1/LvPlan/studiensemesterDateInterval/${date}`,\n\t\t\t{}\n\t\t);\n\t},\n\tLvPlanEvents(start_date, end_date, lv_id) {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/api/frontend/v1/LvPlan/LvPlanEvents',\n\t\t\t{ start_date, end_date, lv_id }\n\t\t);\n\t},\n\t\n\t\n};","import verband from './stv/verband.js';\nimport students from './stv/students.js';\nimport filter from './stv/filter.js';\nimport konto from './stv/konto.js';\nimport group from './stv/group.js';\nimport kontakt from './stv/kontakt.js';\nimport prestudent from './stv/prestudent.js';\nimport status from './stv/status.js';\nimport details from './stv/details.js';\nimport exam from './stv/exam.js';\nimport abschlusspruefung from './stv/abschlusspruefung.js';\nimport grades from './stv/grades.js';\nimport mobility from './stv/mobility.js';\nimport archiv from './stv/archiv.js';\nimport documents from './stv/documents.js';\nimport exemptions from './stv/exemptions.js';\nimport jointstudies from \"./stv/jointstudies.js\";\nimport courselist from './stv/courselist.js';\n\nexport default {\n\tverband,\n\tstudents,\n\tfilter,\n\tkonto,\n\tgroup,\n\tkontakt,\n\tprestudent,\n\tstatus,\n\tdetails,\n\texam,\n\tabschlusspruefung,\n\tgrades,\n\tmobility,\n\tarchiv,\n\tdocuments,\n\texemptions,\n\tjointstudies,\n\tcourselist,\n\tconfigStudent() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/config/student');\n\t},\n\tconfigStudents() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/config/students');\n\t}\n};\n","export default {\n\tget() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/verband');\n\t},\n\tfavorites: {\n\t\tget() {\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/stv/favorites');\n\t\t},\n\t\tset(favorites) {\n\t\t\treturn this.$fhcApi.post('api/frontend/v1/stv/favorites/set', {\n\t\t\t\tfavorites\n\t\t\t});\n\t\t}\n\t}\n}","export default {\n\tuid(uid, studiensemester_kurzbz) {\n\t\tlet url = 'api/frontend/v1/stv/students/'\n\t\t\t+ encodeURIComponent(studiensemester_kurzbz)\n\t\t\t+ '/uid/'\n\t\t\t+ encodeURIComponent(uid);\n\t\treturn this.$fhcApi.getUri(url);\n\t},\n\tprestudent(prestudent_id, studiensemester_kurzbz) {\n\t\tlet url = 'api/frontend/v1/stv/students/'\n\t\t\t+ encodeURIComponent(studiensemester_kurzbz)\n\t\t\t+ '/prestudent/'\n\t\t\t+ encodeURIComponent(prestudent_id);\n\t\treturn this.$fhcApi.getUri(url);\n\t},\n\tperson(person_id, studiensemester_kurzbz) {\n\t\tlet url = 'api/frontend/v1/stv/students/'\n\t\t\t+ encodeURIComponent(studiensemester_kurzbz)\n\t\t\t+ '/person/'\n\t\t\t+ encodeURIComponent(person_id);\n\t\treturn this.$fhcApi.getUri(url);\n\t},\n\tverband(relative_path) {\n\t\treturn this.$fhcApi.getUri('api/frontend/v1/stv/students/' + relative_path);\n\t}\n}","export default {\n\tgetStg() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/filter/getStg');\n\t},\n\tsetStg(studiengang_kz) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/filter/setStg', {\n\t\t\tstudiengang_kz\n\t\t});\n\t}\n};","export default {\n\ttabulatorConfig(config, self) {\n\t\tconfig.ajaxURL = 'api/frontend/v1/stv/konto/get';\n\t\tconfig.ajaxParams = () => {\n\t\t\tconst params = {\n\t\t\t\tperson_id: self.modelValue.person_id || self.modelValue.map(e => e.person_id),\n\t\t\t\tonly_open: self.filter,\n\t\t\t\tstudiengang_kz: self.studiengang_kz_intern ? self.stg_kz : ''\n\t\t\t};\n\t\t\treturn params;\n\t\t};\n\t\tconfig.ajaxRequestFunc = (url, config, params) => this.$fhcApi.post(url, params, config);\n\t\tconfig.ajaxResponse = (url, params, response) => response.data;\n\n\t\treturn config;\n\t},\n\tcheckDoubles(form, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/konto/checkDoubles', data, {\n\t\t\tconfirmErrorHandler: error => true\n\t\t});\n\t},\n\tinsert(form, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/konto/insert', data);\n\t},\n\tcounter(data) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/konto/counter', data);\n\t},\n\tedit(form, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/konto/update', data);\n\t},\n\tdelete(buchungsnr) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/konto/delete', {buchungsnr});\n\t},\n\tgetBuchungstypen() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/konto/getBuchungstypen');\n\t}\n};","export default {\n\tgetGruppen(url, config, params) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/Gruppen/getGruppen/' + params.id);\n\t},\n\tdeleteGroup(params) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/Gruppen/deleteGruppe/', params);\n\t}\n}","export default {\n\t//------------- address.js-----------\n\tgetAdressen (url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/kontakt/getAdressen/' + params.id);\n\t},\n\taddNewAddress(form, id, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/kontakt/addNewAddress/' + id,\n\t\t\tdata\n\t\t);\n\t},\n\tloadAddress(address_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/kontakt/loadAddress/', {address_id});\n\t},\n\tupdateAddress(form, address_id, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/kontakt/updateAddress/' + address_id,\n\t\t\tdata\n\t\t);\n\t},\n\tdeleteAddress(address_id) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/kontakt/deleteAddress/', {address_id});\n\t},\n\tgetPlaces(plz) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/address/getPlaces/' + plz);\n\t},\n\tgetFirmen(searchString) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/kontakt/getFirmen/' + searchString);\n\t},\n\tgetNations() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/address/getNations/');\n\t},\n\tgetAdressentypen() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/kontakt/getAdressentypen/');\n\t},\n\n\t//------------- bankverbindung.js-----------\n\tgetBankverbindung (url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/kontakt/getBankverbindung/' + params.id);\n\t},\n\taddNewBankverbindung(form, id, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/kontakt/addNewBankverbindung/' + id,\n\t\t\tdata\n\t\t);\n\t},\n\tloadBankverbindung(bankverbindung_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/kontakt/loadBankverbindung/', {bankverbindung_id});\n\t},\n\tupdateBankverbindung(form, bankverbindung_id, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/kontakt/updateBankverbindung/' + bankverbindung_id,\n\t\t\tdata\n\t\t);\n\t},\n\tdeleteBankverbindung(bankverbindung_id) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/kontakt/deleteBankverbindung/', {bankverbindung_id});\n\t},\n\n\t//------------- contact.js-----------\n\tgetKontakte (url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/kontakt/getKontakte/' + params.id);\n\t},\n\taddNewContact(form, id, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/kontakt/addNewContact/' + id,\n\t\t\tdata\n\t\t);\n\t},\n\tloadContact(kontakt_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/kontakt/loadContact/', {kontakt_id});\n\t},\n\tupdateContact(form, kontakt_id, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/kontakt/updateContact/' + kontakt_id,\n\t\t\tdata\n\t\t);\n\t},\n\tdeleteContact(kontakt_id) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/kontakt/deleteContact/', {kontakt_id});\n\t},\n\tgetStandorteByFirma(searchString){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/kontakt/getStandorteByFirma/' + searchString);\n\t},\n\tgetKontakttypen(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/kontakt/getKontakttypen/');\n\t}\n};","export default {\n\n//------------- Prestudent.js------------------------------------------------------\n\n\tget(prestudent_id, studiensemester_kurzbz) {\n\t\treturn \tthis.$fhcApi.post(\n\t\t\t'api/frontend/v1/stv/prestudent/get/'\n\t\t\t+ encodeURIComponent(prestudent_id)\n\t\t\t+ '/'\n\t\t\t+ encodeURIComponent(studiensemester_kurzbz)\n\t\t\t);\n\t},\n\tupdatePrestudent(form, prestudent_id, data){\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/prestudent/updatePrestudent/' + prestudent_id,\n\t\t\tdata\n\t\t);\n\t},\n\tgetBezeichnungZGV() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getBezeichnungZGV/');\n\t},\n\tgetBezeichnungMZgv() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getBezeichnungMZgv/');\n\t},\n\tgetBezeichnungDZgv() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getBezeichnungDZgv/');\n\t},\n\tgetStgs() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/lists/getStgs/');\n\t},\n\tgetAusbildung() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getAusbildung/');\n\t},\n\tgetAufmerksamdurch() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getAufmerksamdurch/');\n\t},\n\tgetBerufstaetigkeit() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getBerufstaetigkeit/');\n\t},\n\tgetTypenStg() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getTypenStg/');\n\t},\n\tgetBisstandort() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getBisstandort/');\n\t},\n\n//------------- MultiStatus.js------------------------------------------------------\n\tgetHistoryPrestudent (url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/status/getHistoryPrestudent/' + params.id);\n\t},\n\tgetMaxSem(studiengang_kzs) {\n\t\treturn \tthis.$fhcApi.post('api/frontend/v1/stv/status/getMaxSemester/', {studiengang_kzs});\n\t},\n\tadvanceStatus({prestudent_id, status_kurzbz, studiensemester_kurzbz, ausbildungssemester}) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/status/advanceStatus/'\n\t\t\t+ prestudent_id + '/'\n\t\t\t+ status_kurzbz + '/'\n\t\t\t+ studiensemester_kurzbz + '/'\n\t\t\t+ ausbildungssemester\n\t\t);\n\t},\n\tconfirmStatus({prestudent_id, status_kurzbz, studiensemester_kurzbz, ausbildungssemester}) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/status/confirmStatus/'\n\t\t\t+ prestudent_id + '/'\n\t\t\t+ status_kurzbz + '/'\n\t\t\t+ studiensemester_kurzbz + '/'\n\t\t\t+ ausbildungssemester\n\t\t);\n\t},\n\tisLastStatus(id) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/status/isLastStatus/' + id);\n\t},\n\tdeleteStatus({prestudent_id, status_kurzbz, studiensemester_kurzbz, ausbildungssemester}) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/status/deleteStatus/'\n\t\t\t+ prestudent_id + '/'\n\t\t\t+ status_kurzbz + '/'\n\t\t\t+ studiensemester_kurzbz + '/'\n\t\t\t+ ausbildungssemester\n\t\t);\n\t},\n\tgetLastBismeldestichtag() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/status/getLastBismeldestichtag/');\n\t},\n\n//------------- History.js------------------------------------------------------\n\tgetHistoryPrestudents (url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getHistoryPrestudents/' + params.id);\n\t},\n\n}","export default {\n\n//------------- Modal.js------------------------------------------------------\n\n\tinsertStatus(form, id, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/status/insertStatus/' + id,\n\t\t\tdata\n\t\t);\n\t},\n\tloadStatus({prestudent_id, status_kurzbz, studiensemester_kurzbz, ausbildungssemester}) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'api/frontend/v1/stv/status/loadStatus/'\n\t\t\t+ prestudent_id + '/'\n\t\t\t+ status_kurzbz + '/'\n\t\t\t+ studiensemester_kurzbz + '/'\n\t\t\t+ ausbildungssemester\n\t\t);\n\t},\n\tupdateStatus(form, {prestudent_id, status_kurzbz, studiensemester_kurzbz, ausbildungssemester}, data) {\n\t\treturn this.$fhcApi.post(\n\t\t\tform,\n\t\t\t'api/frontend/v1/stv/status/updateStatus/'\n\t\t\t+ prestudent_id + '/'\n\t\t\t+ status_kurzbz + '/'\n\t\t\t+ studiensemester_kurzbz + '/'\n\t\t\t+ ausbildungssemester,\n\t\t\tdata\n\t\t);\n\t},\n\tgetStudienplaene(prestudent_id) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getStudienplaene/' + prestudent_id);\n\t},\n\tgetStudiengang(prestudent_id) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/prestudent/getStudiengang/' + prestudent_id);\n\t},\n\tgetStatusgruende() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/status/getStatusgruende/');\n\t},\n\tgetStati() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/lists/getStati/');\n\t},\n\n//------------- Dropdown.js------------------------------------------------------\n\n\taddStudent(id, data) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/status/addStudent/' + id,\n\t\t\tdata,\n\t\t\t{errorHeader: id}\n\t\t);\n\t},\n\tchangeStatus(id, data) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/status/changeStatus/' + id,\n\t\t\tdata,\n\t\t\t{errorHeader: id}\n\t\t);\n\t},\n\tgetStatusarray() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/status/getStatusarray/');\n\t}\n}","export default {\n\tget(prestudent_id, studiensemester_kurzbz) {\n\t\tlet url = 'api/frontend/v1/stv/student/get/'\n\t\t\t+ encodeURIComponent(prestudent_id)\n\t\t\t+ '/'\n\t\t\t+ encodeURIComponent(studiensemester_kurzbz);\n\t\treturn this.$fhcApi.post(url);\n\t},\n\tsave(form, prestudent_id, studiensemester_kurzbz, data) {\n\t\tlet url = 'api/frontend/v1/stv/student/save/'\n\t\t\t+ encodeURIComponent(prestudent_id)\n\t\t\t+ '/'\n\t\t\t+ encodeURIComponent(studiensemester_kurzbz);\n\t\treturn this.$fhcApi.post(form, url, data);\n\t},\n}\n","export default {\n\tgetPruefungen(url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/pruefung/getPruefungen/' + params.id);\n\t},\n\tloadPruefung(pruefung_id){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/pruefung/loadPruefung/' + pruefung_id);\n\t},\n\tgetTypenPruefungen(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/pruefung/getTypenPruefungen');\n\t},\n\tgetAllLehreinheiten(data){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/pruefung/getAllLehreinheiten/', data)\n\t},\n\tgetLvsByStudent(uid){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/pruefung/getLvsByStudent/' + uid)\n\t},\n\tgetLvsandLesByStudent(uid, semester){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/pruefung/getLvsandLesByStudent/' + uid + '/' + semester);\n\t},\n\tgetLvsAndMas(uid){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/pruefung/getLvsAndMas/' + uid)\n\t},\n\tgetMitarbeiterLv(id){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/pruefung/getMitarbeiterLv/' + id)\n\t},\n\tgetNoten(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/pruefung/getNoten');\n\t},\n\tcheckZeugnisnoteLv(data){\n\t\treturn \tthis.$fhcApi.post('api/frontend/v1/stv/pruefung/checkZeugnisnoteLv/', data)\n\t},\n\taddPruefung(form, data){\n\t\treturn this.$fhcApi.post(form,'api/frontend/v1/stv/pruefung/insertPruefung/', data);\n\t},\n\tupdatePruefung(form, id, data){\n\t\treturn this.$fhcApi.post(form,'api/frontend/v1/stv/pruefung/updatePruefung/' + id, data);\n\t},\n\tdeletePruefung(id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/pruefung/deletePruefung/' + id)\n\t}\n}","export default {\n\n\tgetAbschlusspruefung (url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/abschlusspruefung/getAbschlusspruefung/' + params.id);\n\t},\n\taddNewAbschlusspruefung(form, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/abschlusspruefung/insertAbschlusspruefung/', data\n\t\t);\n\t},\n\tloadAbschlusspruefung(id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/abschlusspruefung/loadAbschlusspruefung/', {id});\n\t},\n\tupdateAbschlusspruefung(form, data) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/abschlusspruefung/updateAbschlusspruefung/', data\n\t\t);\n\t},\n\tdeleteAbschlusspruefung(id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/abschlusspruefung/deleteAbschlusspruefung/', {id});\n\t},\n\tgetTypenAbschlusspruefung(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/abschlusspruefung/getTypenAbschlusspruefung/');\n\t},\n\tgetTypenAntritte(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/abschlusspruefung/getTypenAntritte/');\n\t},\n\tgetBeurteilungen(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/abschlusspruefung/getBeurteilungen/');\n\t},\n\tgetAkadGrade(studiengang_kz){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/abschlusspruefung/getAkadGrade/', {studiengang_kz});\n\t},\n\tgetTypStudiengang(studiengang_kz){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/abschlusspruefung/getTypStudiengang/', {studiengang_kz});\n\t},\n\tgetMitarbeiter(searchString){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/abschlusspruefung/getMitarbeiter/' + searchString);\n\t},\n\tgetPruefer(searchString){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/abschlusspruefung/getPruefer/' + searchString);\n\t},\n\tgetNoten(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/abschlusspruefung/getNoten/');\n\t},\n\tcheckForExistingExams(uids) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/abschlusspruefung/checkForExistingExams/', {uids}\n\t\t);\n\t}\n}","export default {\n\tlist() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/grades/list');\n\t},\n\tgetCertificate(prestudent_id, studiensemester_kurzbz) {\n\t\tlet url = 'api/frontend/v1/stv/grades/getCertificate/' + encodeURIComponent(prestudent_id);\n\t\tif (!!studiensemester_kurzbz) {\n\t\t\turl = url + '/' + encodeURIComponent(studiensemester_kurzbz);\n\t\t}\n\t\treturn this.$fhcApi.get(url);\n\t},\n\tgetTeacherProposal(prestudent_id, studiensemester_kurzbz) {\n\t\tlet url = 'api/frontend/v1/stv/grades/getTeacherProposal/' + encodeURIComponent(prestudent_id);\n\t\tif (!!studiensemester_kurzbz) {\n\t\t\turl = url + '/' + encodeURIComponent(studiensemester_kurzbz);\n\t\t}\n\t\treturn this.$fhcApi.get(url);\n\t},\n\tgetRepeaterGrades(prestudent_id, studiensemester_kurzbz) {\n\t\tlet url = 'api/frontend/v1/stv/grades/getRepeaterGrades/' + encodeURIComponent(prestudent_id);\n\t\tif (!!studiensemester_kurzbz) {\n\t\t\turl = url + '/' + encodeURIComponent(studiensemester_kurzbz);\n\t\t}\n\t\treturn this.$fhcApi.get(url);\n\t},\n\tupdateCertificate({lehrveranstaltung_id, student_uid, studiensemester_kurzbz, note, lehrveranstaltung_bezeichnung}) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'api/frontend/v1/stv/grades/updateCertificate',\n\t\t\t{\n\t\t\t\tlehrveranstaltung_id,\n\t\t\t\tstudent_uid,\n\t\t\t\tstudiensemester_kurzbz,\n\t\t\t\tnote\n\t\t\t},\n\t\t\t{\n\t\t\t\terrorHeader: lehrveranstaltung_bezeichnung\n\t\t\t}\n\t\t);\n\t},\n\tdeleteCertificate({lehrveranstaltung_id, student_uid, studiensemester_kurzbz, lehrveranstaltung_bezeichnung}) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'api/frontend/v1/stv/grades/deleteCertificate',\n\t\t\t{\n\t\t\t\tlehrveranstaltung_id,\n\t\t\t\tstudent_uid,\n\t\t\t\tstudiensemester_kurzbz\n\t\t\t},\n\t\t\t{\n\t\t\t\terrorHeader: lehrveranstaltung_bezeichnung\n\t\t\t}\n\t\t);\n\t},\n\tcopyTeacherProposalToCertificate({lehrveranstaltung_id, student_uid, studiensemester_kurzbz, lehrveranstaltung_bezeichnung}) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'api/frontend/v1/stv/grades/copyTeacherProposalToCertificate',\n\t\t\t{\n\t\t\t\tlehrveranstaltung_id,\n\t\t\t\tstudent_uid,\n\t\t\t\tstudiensemester_kurzbz\n\t\t\t},\n\t\t\t{\n\t\t\t\terrorHeader: lehrveranstaltung_bezeichnung\n\t\t\t}\n\t\t);\n\t},\n\tcopyRepeaterGradeToCertificate({studierendenantrag_lehrveranstaltung_id, lv_bezeichnung}) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'api/frontend/v1/stv/grades/copyRepeaterGradeToCertificate',\n\t\t\t{\n\t\t\t\tstudierendenantrag_lehrveranstaltung_id\n\t\t\t},\n\t\t\t{\n\t\t\t\terrorHeader: lv_bezeichnung\n\t\t\t}\n\t\t);\n\t},\n\tgetGradeFromPoints(points, lehrveranstaltung_id, studiensemester_kurzbz, manualErrorHandling) {\n\t\tconst config = manualErrorHandling ? {errorHandling: false} : {};\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/grades/getGradeFromPoints',\n\t\t\t{\n\t\t\t\t\"points\": points,\n\t\t\t\t\"lehrveranstaltung_id\": lehrveranstaltung_id,\n\t\t\t\t\"studiensemester_kurzbz\": studiensemester_kurzbz\n\t\t\t},\n\t\t\tconfig\n\t\t\t);\n\t}\n}","export default {\n\tgetMobilitaeten (url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/mobility/getMobilitaeten/' + params.id);\n\t},\n\tgetProgramsMobility(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/mobility/getProgramsMobility/');\n\t},\n\taddNewMobility(form, data){\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/mobility/insertMobility/', data);\n\t},\n\tloadMobility(bisio_id){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/mobility/loadMobility/' + bisio_id);\n\t},\n\tupdateMobility(form, data){\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/mobility/updateMobility/', data);\n\t},\n\tdeleteMobility(bisio_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/mobility/deleteMobility/' + bisio_id);\n\t},\n\tgetLVList(studiengang_kz){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/mobility/getLVList/' + studiengang_kz);\n\t},\n\tgetAllLehreinheiten(data){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/mobility/getAllLehreinheiten/', data)\n\t},\n\tgetLvsandLesByStudent(uid){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/mobility/getLvsandLesByStudent/' + uid);\n\t},\n\tgetPurposes(url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/mobility/getPurposes/' + params.id);\n\t},\n\tgetSupports(url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/mobility/getSupports/' + params.id);\n\t},\n\tgetListPurposes() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/mobility/getListPurposes/');\n\t},\n\tgetListSupports() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/mobility/getListSupports/');\n\t},\n\tdeleteMobilityPurpose(params) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/mobility/deleteMobilityPurpose/' + params.bisio_id, params);\n\t},\n\taddMobilityPurpose(params) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/mobility/addMobilityPurpose/' + params.bisio_id, params);\n\t},\n\tdeleteMobilitySupport(params) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/mobility/deleteMobilitySupport/' + params.bisio_id, params);\n\t},\n\taddMobilitySupport(params) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/mobility/addMobilitySupport/' + params.bisio_id, params);\n\t},\n\n}","export default {\n\ttabulatorConfig(config, self) {\n\t\tconfig.ajaxURL = 'api/frontend/v1/stv/archiv/get';\n\t\tconfig.ajaxParams = () => {\n\t\t\tconst params = {\n\t\t\t\tperson_id: self.modelValue.person_id || self.modelValue.map(e => e.person_id)\n\t\t\t};\n\t\t\treturn params;\n\t\t};\n\t\tconfig.ajaxRequestFunc = (url, config, params) => this.$fhcApi.post(url, params, config);\n\t\tconfig.ajaxResponse = (url, params, response) => response.data;\n\n\t\treturn config;\n\t},\n\tgetArchivVorlagen() {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/archiv/getArchivVorlagen');\n\t},\n\tarchive(data) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'api/frontend/v1/documents/archive',\n\t\t\tdata\n\t\t);\n\t},\n\tarchiveSigned(data) {\n\t\treturn this.$fhcApi.post(\n\t\t\t'api/frontend/v1/documents/archiveSigned',\n\t\t\tdata\n\t\t);\n\t},\n\tupdate(data) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/archiv/update', data);\n\t},\n\tdelete({akte_id, studiengang_kz}) {\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/archiv/delete', {akte_id, studiengang_kz});\n\t}\n};\n","export default {\n\tgetDocumentsUnaccepted(url, config, params) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/dokumente/getDocumentsUnaccepted/' + params.id + '/' + params.studiengang_kz);\n\t},\n\tgetDocumentsAccepted(url, config, params) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/dokumente/getDocumentsAccepted/' + params.id + '/' + params.studiengang_kz);\n\t},\n\tdeleteZuordnung(params){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/dokumente/deleteZuordnung/' + params.prestudent_id + '/' + params.dokument_kurzbz);\n\t},\n\tcreateZuordnung(params){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/dokumente/createZuordnung/'\n\t\t\t+ params.prestudent_id + '/'\n\t\t\t+ params.dokument_kurzbz);\n\t},\n\tloadAkte(akte_id){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/dokumente/loadAkte/' + akte_id);\n\t},\n\tgetDoktypen(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/dokumente/getDoktypen/');\n\t},\n\tupdateFile(akte_id, data){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/dokumente/updateAkte/' + akte_id,\n\t\t\tdata);\n\t},\n\tdeleteFile(akte_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/dokumente/deleteAkte/' + akte_id);\n\t},\n\tuploadFile(prestudent_id, data){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/dokumente/uploadDokument/' + prestudent_id,\n\t\t\tdata);\n\t},\n}","export default {\n\tgetAnrechnungen(url, config, params) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/anrechnungen/getAnrechnungen/' + params.id);\n\t},\n\tgetLehrveranstaltungen(prestudent_id){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/anrechnungen/getLehrveranstaltungen/' + prestudent_id);\n\t},\n\tgetBegruendungen(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/anrechnungen/getBegruendungen/');\n\t},\n\tgetLvsKompatibel(lv_id){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/anrechnungen/getLvsKompatibel/' + lv_id);\n\t},\n\tgetLektoren(studiengang_kz){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/anrechnungen/getLektoren/' + studiengang_kz);\n\t},\n\taddNewAnrechnung(form, data){\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/anrechnungen/insertAnrechnung/', data);\n\t},\n\tloadAnrechnung(anrechnung_id){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/anrechnungen/loadAnrechnung/' + anrechnung_id);\n\t},\n\teditAnrechnung(form, data){\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/stv/anrechnungen/updateAnrechnung/', data);\n\t},\n\tdeleteAnrechnung(anrechnung_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/anrechnungen/deleteAnrechnung/' + anrechnung_id);\n\t},\n}","export default {\n\tgetStudies(url, config, params) {\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/GemeinsameStudien/getStudien/' + params.id);\n\t},\n\tgetTypenMobility(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/GemeinsameStudien/getTypenMobility/');\n\t},\n\tgetStudiensemester(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/GemeinsameStudien/getStudiensemester/');\n\t},\n\tgetStudyprograms(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/GemeinsameStudien/getStudienprogramme/');\n\t},\n\tgetListPartner(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/GemeinsameStudien/getPartnerfirmen/');\n\t},\n\tgetStatiPrestudent(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/GemeinsameStudien/getStatiPrestudent/');\n\t},\n\tloadStudy(id){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/GemeinsameStudien/loadStudie/' + id);\n\t},\n\tinsertStudy(form, data){\n\t\treturn this.$fhcApi.post(form,'api/frontend/v1/stv/GemeinsameStudien/insertStudie/', data);\n\t},\n\tupdateStudy(form, data){\n\t\treturn this.$fhcApi.post(form,'api/frontend/v1/stv/GemeinsameStudien/updateStudie/', data);\n\t},\n\tdeleteStudy(id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/stv/GemeinsameStudien/deleteStudie/' + id);\n\t},\n\n}","export default {\n\tgetCourselist(url, config, params) {\n\t\t//corresponding logic controller Stundenplan.php\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/LvTermine/getStundenplan/'\n\t\t\t+ params.student_uid + '/'\n\t\t\t+ params.start_date + '/'\n\t\t\t+ params.end_date + '/'\n\t\t\t+ params.group_consecutiveHours + '/'\n\t\t\t+ params.dbStundenplanTable\n\t\t);\n\t},\n\tgetStudiensemester(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/stv/LvTermine/getStudiensemester/');\n\t},\n}","import person from \"./notiz/person.js\";\n\nexport default {\n\tperson\n}","export default {\n\tgetNotizen (url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/notiz/notizPerson/getNotizen/' + params.id + '/' + params.type);\n\t},\n\tgetUid(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/notiz/notizPerson/getUid/');\n\t},\n\taddNewNotiz(form, id, formData) {\n\t\treturn this.$fhcApi.post(form,'api/frontend/v1/notiz/notizPerson/addNewNotiz/' + id,\n\t\t\tformData\n\t\t);\n\t},\n\tloadNotiz(notiz_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/notiz/notizPerson/loadNotiz/', {\n\t\t\tnotiz_id\n\t\t});\n\t},\n\tloadDokumente(notiz_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/notiz/notizPerson/loadDokumente/', {\n\t\t\tnotiz_id\n\t\t});\n\t},\n\tdeleteNotiz(notiz_id, type_id, id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/notiz/notizPerson/deleteNotiz/', {\n\t\t\tnotiz_id,\n\t\t\ttype_id,\n\t\t\tid\n\t\t});\n\t},\n\tupdateNotiz(form, notiz_id, formData){\n\t\treturn this.$fhcApi.post(form,'api/frontend/v1/notiz/notizPerson/updateNotiz/' + notiz_id,\n\t\t\tformData\n\t\t);\n\t},\n\tgetMitarbeiter(event){\n\t\treturn this.$fhcApi.get('api/frontend/v1/notiz/notizPerson/getMitarbeiter/' + event);\n\t},\n\tisBerechtigt(id, type_id){\n\t\treturn this.$fhcApi.get('api/frontend/v1/notiz/notizPerson/isBerechtigt/');\n\t}\n}","import person from \"./betriebsmittel/person.js\";\n\nexport default {\n\tperson\n}","export default {\n\tgetAllBetriebsmittel(url, config, params){\n\t\treturn this.$fhcApi.get('api/frontend/v1/betriebsmittel/betriebsmittelP/getAllBetriebsmittel/' + params.type + '/' + params.id);\n\t},\n\taddNewBetriebsmittel(form, person_id, formData) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/betriebsmittel/betriebsmittelP/addNewBetriebsmittel/' +\n\t\t\tperson_id, formData\n\t\t);\n\t},\n\tloadBetriebsmittel(betriebsmittelperson_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/betriebsmittel/betriebsmittelP/loadBetriebsmittel/' + betriebsmittelperson_id);\n\t},\n\tupdateBetriebsmittel(form, betriebsmittelperson_id, formData) {\n\t\treturn this.$fhcApi.post(form, 'api/frontend/v1/betriebsmittel/betriebsmittelP/updateBetriebsmittel/' + betriebsmittelperson_id,\n\t\t\tformData);\n\t},\n\tdeleteBetriebsmittel(betriebsmittelperson_id){\n\t\treturn this.$fhcApi.post('api/frontend/v1/betriebsmittel/betriebsmittelP/deleteBetriebsmittel/' +\tbetriebsmittelperson_id);\n\t},\n\tgetTypenBetriebsmittel(){\n\t\treturn this.$fhcApi.get('api/frontend/v1/betriebsmittel/betriebsmittelP/getTypenBetriebsmittel/');\n\t},\n\tloadInventarliste(query){\n\t\treturn this.$fhcApi.get('api/frontend/v1/betriebsmittel/betriebsmittelP/loadInventarliste/' +\tquery);\n\t}\n}","export default {\n\tupdatePersonUnrulyStatus(person_id, unrulyParam) {\n\n\t\ttry {\n\t\t\tconst payload = {person_id, unruly: unrulyParam}\n\t\t\tconst url = '/api/frontend/v1/checkperson/CheckPerson/updatePersonUnrulyStatus';\n\t\t\treturn this.$fhcApi.post(url, payload, null);\n\t\t} catch (error) {\n\t\t\tthrow error;\n\t\t}\n\n\t},\n\tfilterPerson(payload, base = ''){\n\n\t\ttry {\n\t\t\tconst url = base + '/api/frontend/v1/checkperson/CheckPerson/filterPerson';\n\t\t\treturn axios.post(url, payload)\n\t\t} catch (error) {\n\t\t\tthrow error;\n\t\t}\n\n\t}\n}","export default {\n getContentID(ort_kurbz) {\n\t\treturn this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n \"/api/frontend/v1/Ort/ContentID\",\n\t\t\t{ ort_kurzbz: ort_kurbz }\n\t\t);\n\t},\n\tgetRooms(datum, von, bis, typ, personenanzahl = 0) {\n\t\treturn this.$fhcApi.get(\n\t\t\tFHC_JS_DATA_STORAGE_OBJECT.app_root +\n\t\t\tFHC_JS_DATA_STORAGE_OBJECT.ci_router +\n\t\t\t\"/api/frontend/v1/Ort/getRooms\",\n\t\t\t{ datum, von, bis, typ, personenanzahl }\n\t\t);\n\t},\n\tgetRoomTypes() {\n\t\treturn this.$fhcApi.get(\n\t\t\tFHC_JS_DATA_STORAGE_OBJECT.app_root +\n\t\t\tFHC_JS_DATA_STORAGE_OBJECT.ci_router +\n\t\t\t\"/api/frontend/v1/Ort/getTypes\"\n\t\t);\n\t}\n}","export default {\n content(content_id, version=null, sprache=null, sichtbar=null) {\n return this.$fhcApi.get(\n\t\t\t\"/api/frontend/v1/Cms/content\",\n\t\t\t{ \n\t\t\t\tcontent_id: content_id,\n\t\t\t\t...(version?{version}:{}),\n\t\t\t\t...(sprache?{sprache}:{}),\n\t\t\t\t...(sichtbar?{sichtbar}:{}),\n }\n );\n },\n\t//api function used for the news View that renders the html\n\tgetNews(page = 1, page_size = 10, sprache) {\n\t\treturn this.$fhcApi.get(\n\t\t\t\"/api/frontend/v1/Cms/getNews\",\n\t\t\t{\n\t\t\t\tpage,\n\t\t\t\tpage_size,\n\t\t\t\tsprache,\n\t\t\t},\n\t\t);\n\t},\n\t//api function used for the widget component\n\tnews(limit) {\n\t\treturn this.$fhcApi.get(\n\t\t\t\"/api/frontend/v1/Cms/news\",\n\t\t\t{\n\t\t\t\tlimit: limit\n\t\t\t}\n\t\t);\n\t},\n\tgetNewsRowCount: function () {\n\t\treturn this.$fhcApi.get(\n\t\t\t\"/api/frontend/v1/Cms/getNewsRowCount\",\n\t\t\t{}\n\t\t);\n\t},\n\tgetNewsExtra: function(){\n\t\treturn this.$fhcApi.get(\n\t\t\t\"/api/frontend/v1/Cms/getStudiengangInfoForNews\",\n\t\t\t{}\n\t\t);\n\t}\n }","export default {\n getStudentenMail(lehreinheit_id) {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n \"/api/frontend/v1/Lehre/lvStudentenMail\",\n { lehreinheit_id: lehreinheit_id }\n );\n },\n\tgetLvInfo(studiensemester_kurzbz, lehrveranstaltung_id) {\n\t\treturn this.$fhcApi.get(\n\t\t\t`/api/frontend/v1/Lehre/LV/${studiensemester_kurzbz}/${lehrveranstaltung_id}`\n\t\t\t, {}\n\t\t);\n\t},\n\tgetStudentPruefungen(lehrveranstaltung_id){\n\t\treturn this.$fhcApi.get(\n\t\t\t`/api/frontend/v1/Lehre/Pruefungen/${lehrveranstaltung_id}`\n\t\t\t, {}\n\t\t);\n\t}\n }","export default {\n getLvMenu(lvid, studiensemester_kurzbz) {\n return this.$fhcApi.get(\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/api/frontend/v1/LvMenu/getLvMenu/${lvid}/${studiensemester_kurzbz}`,\n {}\n );\n },\n\n \n }","import person from \"./messages/person.js\";\n\nexport default {\n\tperson\n}","export default {\n\t\tgetMessages(url, config, params) {\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getMessages/' + params.id + '/' + params.type + '/' + params.size + '/' + params.page);\n\t\t},\n\t\tgetVorlagen(){\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getVorlagen/');\n\t\t},\n\t\tgetMsgVarsLoggedInUser(){\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getMsgVarsLoggedInUser/');\n\t\t},\n\t\tgetMessageVarsPerson(params){\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getMessageVarsPerson/' + params.id + '/' + params.type_id);\n\t\t},\n\t\tgetMsgVarsPrestudent(params){\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getMsgVarsPrestudent/' + params.id + '/' + params.type_id);\n\t\t},\n\t\tgetPersonId(params){\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getPersonId/'+ params.id + '/' + params.type_id);\n\t\t},\n\t\tgetUid(params){\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getUid/'+ params.id + '/' + params.type_id);\n\t\t},\n\t\tgetDataVorlage(vorlage_kurzbz){\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getDataVorlage/' + vorlage_kurzbz);\n\t\t},\n\t\tgetNameOfDefaultRecipient(params){\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getNameOfDefaultRecipient/' + params.id + '/' + params.type_id);\n\t\t},\n\t\tgetPreviewText(params, data){\n\t\t\treturn this.$fhcApi.post('api/frontend/v1/messages/messages/getPreviewText/' + params.id + '/' + params.type_id,\n\t\t\t\tdata);\n\t\t},\n\t\tgetReplyData(messageId){\n\t\t\treturn this.$fhcApi.get('api/frontend/v1/messages/messages/getReplyData/' + messageId);\n\t\t},\n\t\tsendMessageFromModalContext(form, id, data) {\n\t\t\treturn this.$fhcApi.post(form,'api/frontend/v1/messages/messages/sendMessage/' + id,\n\t\t\t\tdata);\n\t\t},\n\t\tsendMessage(id, data) {\n\t\t\treturn this.$fhcApi.post('api/frontend/v1/messages/messages/sendMessage/' + id,\n\t\t\t\tdata);\n\t\t},\n\t\tdeleteMessage(messageId){\n\t\t\treturn this.$fhcApi.post('api/frontend/v1/messages/messages/deleteMessage/' + messageId);\n\t\t}\n}","export default {\n\tgetVorlagen() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/vorlagen/vorlagen/getVorlagen/');\n\t},\n\tgetVorlagenByLoggedInUser() {\n\t\treturn this.$fhcApi.get('api/frontend/v1/vorlagen/vorlagen/getVorlagenByLoggedInUser/');\n\t}\n}","export default {\n\n\tgetStudiensemester: function () {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/components/Cis/Mylv/Studiensemester',\n\t\t\t{}\n\t\t);\n\t},\n\n\tgetAllStudienSemester: function (studiensemester=undefined, studiengang=undefined, semester=undefined, studienplan=undefined) {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/api/frontend/v1/Studium/getStudienAllSemester',\n\t\t\t{studiensemester, studiengang, semester, studienplan}\n\t\t);\n\t},\n\n\tgetStudiengaengeForStudienSemester: function (studiensemester) {\n\t\treturn this.$fhcApi.get(\n\t\t\t`/api/frontend/v1/Studium/getStudiengaengeForStudienSemester/${studiensemester}`,\n\t\t\t{}\n\t\t);\n\t},\n\tgetStudienplaeneBySemester: function (studiengang, studiensemester) {\n\t\treturn this.$fhcApi.get(\n\t\t\t`/api/frontend/v1/Studium/getStudienplaeneBySemester`,\n\t\t\t{\n\t\t\t\tstudiengang,\n\t\t\t\tstudiensemester,\n\t\t\t}\n\t\t);\n\t},\n\tgetLvPlanForStudiensemester: function (studiensemester, lvid) {\n\t\treturn this.$fhcApi.get(\n\t\t\t`/api/frontend/v1/LvPlan/getLvPlanForStudiensemester/${studiensemester}/${lvid}`,\n\t\t\t{\n\t\t\t}\n\t\t);\n\t},\n\tgetLvEvaluierungInfo: function (studiensemester_kurzbz, lvid) {\n\t\treturn this.$fhcApi.get(\n\t\t\t`/api/frontend/v1/Studium/getLvEvaluierungInfo/${studiensemester_kurzbz}/${lvid}`,\n\t\t\t{\n\t\t\t}\n\t\t);\n\t},\n\t\n}","/**\n * Copyright (C) 2024 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nimport search from \"./search.js\";\nimport phrasen from \"./phrasen.js\";\nimport navigation from \"./navigation.js\";\nimport filter from \"./filter.js\";\nimport studstatus from \"./studstatus.js\";\nimport profil from \"./profil.js\";\nimport profilUpdate from \"./profilUpdate.js\";\nimport lvPlan from \"./lvPlan.js\";\nimport bookmark from \"./bookmark.js\";\nimport stv from \"./stv.js\";\nimport notiz from \"./notiz.js\";\nimport betriebsmittel from \"./betriebsmittel.js\";\nimport checkperson from \"./checkperson.js\";\nimport ampeln from \"./ampeln.js\";\nimport ort from \"./ort.js\";\nimport cms from \"./cms.js\";\nimport lehre from \"./lehre.js\";\nimport addons from \"./addons.js\";\nimport messages from \"./messages.js\";\nimport vorlagen from \"./vorlagen.js\";\nimport studiengang from \"./studiengang.js\";\nimport menu from \"./menu.js\";\nimport dashboard from \"./dashboard.js\";\nimport authinfo from \"./authinfo.js\";\nimport studium from \"./studium.js\";\nimport language from \"./language.js\";\n\nexport default {\n search,\n phrasen,\n navigation,\n dashboard,\n filter,\n studstatus,\n profil,\n profilUpdate,\n lvPlan,\n bookmark,\n stv,\n notiz,\n betriebsmittel,\n checkperson,\n ampeln,\n ort,\n cms,\n lehre,\n addons,\n messages,\n vorlagen,\n addons,\n\tstudiengang,\n\tmenu,\n\tauthinfo,\n\tstudium,\n language\n};\n","export default {\n\tasync getViewData() {\n\t\tconst url = `/api/frontend/v1/Cis4FhcApi/getViewData`;\n\t\treturn this.$fhcApi.get(url, null, null)\n\t},\n}","export default {\n\n getBookmarks: function () {\n return this.$fhcApi.get(\n `/api/frontend/v1/Bookmark/getBookmarks`\n ,{}\n );\n },\n \n delete: function (bookmark_id) {\n return this.$fhcApi.get(\n `/api/frontend/v1/Bookmark/delete/${bookmark_id}`\n ,{}\n ); \n },\n\n\tupdate: function ({ bookmark_id, url, title, tag=null}) {\n\t\treturn this.$fhcApi.post(\n\t\t\t`/api/frontend/v1/Bookmark/update/${bookmark_id}`\n\t\t\t, {\n\t\t\t\turl: url,\n\t\t\t\ttitle: title\n\t\t\t}\n\t\t);\n\t},\n\n insert: function ({url, title, tag}) {\n return this.$fhcApi.post(\n `/api/frontend/v1/Bookmark/insert`\n ,{\n url: url,\n title: title,\n tag: tag\n }\n ); \n },\n}","export default {\n \n open: function () {\n return this.$fhcApi.get(\n `/api/frontend/v1/Ampeln/open`,{});\n },\n\n all: function () {\n return this.$fhcApi.get(\n `/api/frontend/v1/Ampeln/all`,{});\n },\n\n confirm: function (ampel_id) {\n return this.$fhcApi.get(\n `/api/frontend/v1/Ampeln/confirm/${ampel_id}`,{});\n },\n\n}","export default {\n\tstudiengangInformation: function () {\n\t\treturn this.$fhcApi.get(\n\t\t\t\"/api/frontend/v1/Studgang/getStudiengangInfo\",\n\t\t\t{}\n\t\t);\n\t},\n\tgetStudiengangByKz: function (studiengang_kz) {\n\t\treturn this.$fhcApi.get(\n\t\t\t\"/api/frontend/v1/organisation/StudiengangEP/getStudiengangByKz\",\n\t\t\t{\n\t\t\t\t\"studiengang_kz\": studiengang_kz\n\t\t\t}\n\t\t);\n\t}\n}","export default {\n\tgetMenu: function () {\n\t\treturn this.$fhcApi.get(\n\t\t\t\"/api/frontend/v1/CisMenu/getMenu\",\n\t\t\t{}\n\t\t);\n\t}\n\n}","\nexport default {\n\tgetAuthUID() {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/api/frontend/v1/AuthInfo/getAuthUID',\n\t\t\t{ }\n\t\t);\n\t},\n\tgetAuthInfo() {\n\t\treturn this.$fhcApi.get(\n\t\t\t'/api/frontend/v1/AuthInfo/getAuthInfo',\n\t\t\t{}\n\t\t);\n\t},\n};","/**\n * Copyright (C) 2024 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tgetAll() {\n\t\treturn this.$fhcApi.get('/api/frontend/v1/language/get');\n\t}\n};","/** TODO(chris):\n * when deleting this file be sure to\n * remove line 1 & 90 from ../plugins/Phrasen.js\n */\nimport FhcApiFactory from '../api/fhcapifactory.js';\n\n\nexport default {\n\tinstall: (app, options) => {\n\t\tif (app.config.globalProperties.$fhcApi) {\n\t\t\t/* Deprecated Code start */\n\t\t\tif (options?.factory) {\n\t\t\t\tconsole.warn(\"$fhcApi is DEPRECATED!\");\n\t\t\t\tapp.config.globalProperties.$fhcApi.factory.addEndpoints(options.factory);\n\t\t\t}\n\t\t\t/* Deprecated Code end */\n\t\t\treturn;\n\t\t}\n\n\t\tfunction _get_config(form, uri, data, config) {\n\t\t\tif (typeof form == 'string' && config === undefined) {\n\t\t\t\t[uri, data, config] = [form, uri, data];\n\t\t\t\tform = undefined;\n\t\t\t} else if (form) {\n\t\t\t\tif (typeof form != 'object')\n\t\t\t\t\tthrow new TypeError('Parameter 1 of _get_config must be an object or a string');\n\t\t\t\tif (uri === undefined && data === undefined && config === undefined) {\n\t\t\t\t\tconfig = form;\n\t\t\t\t\tform = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (form) {\n\t\t\t\t// NOTE(chris): check if form is fhc-form\n\t\t\t\tif (!form.clearValidation || !form.setFeedback)\n\t\t\t\t\tthrow new TypeError(\"'form' is not a Form Component\");\n\n\t\t\t\tform = {\n\t\t\t\t\tclearValidation: form.clearValidation,\n\t\t\t\t\tsetFeedback: form.setFeedback\n\t\t\t\t};\n\n\t\t\t\tif (config)\n\t\t\t\t\tconfig.form = form;\n\t\t\t\telse\n\t\t\t\t\tconfig = {form};\n\t\t\t}\n\n\t\t\treturn [uri, data, config];\n\t\t}\n\n\t\tfunction _clean_return_value(response) {\n\t\t\tconst result = response.data;\n\t\t\tdelete response.data;\n\t\t\tif (!result.meta)\n\t\t\t\tresult.meta = {response};\n\t\t\telse\n\t\t\t\tresult.meta.response = response;\n\t\t\treturn result;\n\t\t}\n\t\tconst baseURL = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + \"/\";\n\t\tconst fhcApiAxios = axios.create({\n\t\t\ttimeout: 500000,\n\t\t\tbaseURL: FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + \"/\"\n\t\t});\n\n\t\tfhcApiAxios.interceptors.request.use(config => {\n\t\t\tif (config.method != 'post' || !config.data)\n\t\t\t\treturn config;\n\n\t\t\tif (config.data instanceof FormData)\n\t\t\t\treturn config;\n\n\t\t\tif (!Object.values(config.data).every(item => {\n\t\t\t\tif (item instanceof FileList)\n\t\t\t\t\treturn false;\n\t\t\t\tif (Array.isArray(item))\n\t\t\t\t\treturn item.every(i => !(i instanceof File));\n\t\t\t\treturn true;\n\t\t\t})) {\n\t\t\t\tconst newData = Object.entries(config.data).reduce((nd, [key, item]) => {\n\t\t\t\t\tif (item instanceof FileList) {\n\t\t\t\t\t\tfor (const file of item)\n\t\t\t\t\t\t\tnd.FormData.append(key + (item.length > 1 ? '[]' : ''), file);\n\t\t\t\t\t} else if (Array.isArray(item)) {\n\t\t\t\t\t\tif (item.every(i => !(i instanceof File))) {\n\t\t\t\t\t\t\tnd.jsondata[key] = item;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\titem.forEach(file => nd.FormData.append(key + (item.length > 1 ? '[]' : ''), file));\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnd.jsondata[key] = item;\n\t\t\t\t\t}\n\t\t\t\t\treturn nd;\n\t\t\t\t}, {\n\t\t\t\t\tFormData: new FormData(),\n\t\t\t\t\tjsondata: {}\n\t\t\t\t});\n\t\t\t\tnewData.FormData.append('_jsondata', JSON.stringify(newData.jsondata));\n\t\t\t\tconfig.data = newData.FormData;\n\t\t\t}\n\n\t\t\treturn config;\n\t\t});\n\n\t\tfhcApiAxios.interceptors.response.use(response => {\n\t\t\tif (response.config?.errorHandling == 'off'\n\t\t\t\t|| response.config?.errorHandling === false\n\t\t\t\t|| response.config?.errorHandling == 'fail')\n\t\t\t\treturn _clean_return_value(response);\n\n\t\t\t// NOTE(chris): loop through errors\n\t\t\tif (response.data.errors)\n\t\t\t\tresponse.data.errors = response.data.errors.filter(\n\t\t\t\t\terr => (response.config[err.type + 'ErrorHandler'] || app.config.globalProperties.$fhcApi._defaultErrorHandlers[err.type])(err, response.config)\n\t\t\t\t);\n\n\t\t\treturn _clean_return_value(response);\n\t\t}, error => {\n\t\t\tif (error.code == 'ERR_CANCELED')\n\t\t\t\treturn Promise.reject({...{handled: true}, ...error});\n\n\t\t\tif (error.config?.errorHandling == 'off'\n\t\t\t\t|| error.config?.errorHandling === false\n\t\t\t\t|| error.config?.errorHandling == 'success')\n\t\t\t\treturn Promise.reject(error);\n\n\t\t\tif (error.response) {\n\t\t\t\tif (error.response.status == 404) {\n\t\t\t\t\tapp.config.globalProperties.$fhcAlert.alertDefault('error', error.message, error.request.responseURL, true);\n\t\t\t\t\treturn Promise.reject({...{handled: true}, ...error});\n\t\t\t\t}\n\n\t\t\t\t// NOTE(chris): loop through errors\n\t\t\t\terror.response.data.errors = error.response.data.errors.filter(\n\t\t\t\t\terr => (error.config[err.type + 'ErrorHandler'] || app.config.globalProperties.$fhcApi._defaultErrorHandlers[err.type])(err, error.config)\n\t\t\t\t);\n\t\t\t\tif (!error.response.data.errors.length)\n\t\t\t\t\treturn Promise.reject({...{handled: true}, ...error});\n\t\t\t} else if (error.request) {\n\t\t\t\tapp.config.globalProperties.$fhcAlert.alertDefault('error', error.message, error.request.responseURL);\n\t\t\t\treturn Promise.reject({...{handled: true}, ...error});\n\t\t\t} else {\n\t\t\t\tapp.config.globalProperties.$fhcAlert.alertError(error.message);\n\t\t\t\treturn Promise.reject({...{handled: true}, ...error});\n\t\t\t}\n\n\t\t\treturn Promise.reject(error);\n\t\t});\n\n\t\tapp.config.globalProperties.$fhcApi = {\n\t\t\tgetUri(url) {\n\t\t\t\tconsole.warn('$fhcApi.getUri is DEPRECATED! Use $api.getUri instead.');\n\t\t\t\treturn fhcApiAxios.getUri({url});\n\t\t\t},\n\t\t\tget(form, uri, params, config) {\n\t\t\t\tconsole.warn('$fhcApi.get is DEPRECATED! Use $api.get instead.');\n\t\t\t\t[uri, params, config] = _get_config(form, uri, params, config);\n\t\t\t\tif (params) {\n\t\t\t\t\tif (config)\n\t\t\t\t\t\tconfig.params = params;\n\t\t\t\t\telse\n\t\t\t\t\t\tconfig = {params};\n\t\t\t\t}\n\t\t\t\treturn fhcApiAxios.get(uri, config);\n\t\t\t},\n\t\t\tpost(form, uri, data, config) {\n\t\t\t\tconsole.warn('$fhcApi.post is DEPRECATED! Use $api.post instead.');\n\t\t\t\t[uri, data, config] = _get_config(form, uri, data, config);\n\t\t\t\treturn fhcApiAxios.post(uri, data, config);\n\t\t\t},\n\t\t\t_defaultErrorHandlers: {\n\t\t\t\tvalidation(error, config) {\n\t\t\t\t\tconst $fhcAlert = app.config.globalProperties.$fhcAlert;\n\n\t\t\t\t\tif (config?.form) {\n\t\t\t\t\t\tconfig.form.clearValidation();\n\t\t\t\t\t\tconfig.form.setFeedback(false, error.messages);\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (Array.isArray(error.messages)) {\n\t\t\t\t\t\terror.messages.forEach($fhcAlert.alertError);\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t} else if (typeof error.messages == 'object') {\n\t\t\t\t\t\tif (config?.errorHeader)\n\t\t\t\t\t\t\tObject.values(error.messages).forEach(\n\t\t\t\t\t\t\t\tvalue => $fhcAlert.alertDefault(\n\t\t\t\t\t\t\t\t\t'error',\n\t\t\t\t\t\t\t\t\tArray.isArray(config.errorHeader) ? app.config.globalProperties.$p.t.apply(null, config.errorHeader) : config.errorHeader,\n\t\t\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tObject.entries(error.messages).forEach(\n\t\t\t\t\t\t\t\t([key, value]) => $fhcAlert.alertDefault('error', key, value, true)\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\t\t\t\tgeneral(error, config) {\n\t\t\t\t\tconst $fhcAlert = app.config.globalProperties.$fhcAlert;\n\n\t\t\t\t\tif (config?.form)\n\t\t\t\t\t\tconfig.form.setFeedback(false, error.message);\n\t\t\t\t\telse if (config?.errorHeader)\n\t\t\t\t\t\t$fhcAlert.alertDefault(\n\t\t\t\t\t\t\t'error',\n\t\t\t\t\t\t\tArray.isArray(config.errorHeader) ? app.config.globalProperties.$p.t.apply(null, config.errorHeader) : config.errorHeader,\n\t\t\t\t\t\t\terror.message,\n\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t);\n\t\t\t\t\telse\n\t\t\t\t\t\t$fhcAlert.alertError(error.message);\n\t\t\t\t},\n\t\t\t\tphp(error) {\n\t\t\t\t\tconst $fhcAlert = app.config.globalProperties.$fhcAlert;\n\n\t\t\t\t\tvar message = '';\n\t\t\t\t\tmessage += 'Message: ' + error.message + '\\n\\n';\n\t\t\t\t\tmessage += 'Filename: ' + error.filename + '\\n';\n\t\t\t\t\tmessage += 'Line Number: ' + error.line + '\\n';\n\t\t\t\t\tif (error.backtrace && error.backtrace.length) {\n\t\t\t\t\t\tmessage += '\\nBacktrace: ';\n\t\t\t\t\t\terror.backtrace.forEach(err => {\n\t\t\t\t\t\t\tmessage += '\\n\\tFile: ' + err.file + '\\n';\n\t\t\t\t\t\t\tmessage += '\\tLine: ' + err.line + '\\n';\n\t\t\t\t\t\t\tmessage += '\\tFunction: ' + err.function + '\\n';\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tswitch (error.severity) {\n\t\t\t\t\t\tcase 'Warning':\n\t\t\t\t\t\tcase 'Core Warning':\n\t\t\t\t\t\tcase 'Compile Warning':\n\t\t\t\t\t\tcase 'User Warning':\n\t\t\t\t\t\t\t$fhcAlert.alertDefault('warn', 'PHP ' + error.severity, message, true);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'Notice':\n\t\t\t\t\t\tcase 'User Notice':\n\t\t\t\t\t\tcase 'Runtime Notice':\n\t\t\t\t\t\t\t$fhcAlert.alertDefault('info', 'PHP ' + error.severity, message, true);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tmessage = 'Type: PHP ' + error.severity + '\\n\\n' + message;\n\t\t\t\t\t\t\t$fhcAlert.alertSystemError(message);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\texception(error) {\n\t\t\t\t\tconst $fhcAlert = app.config.globalProperties.$fhcAlert;\n\n\t\t\t\t\tvar message = '';\n\t\t\t\t\tmessage += 'Type: ' + error.class + '\\n\\n';\n\t\t\t\t\tmessage += 'Message: ' + error.message + '\\n\\n';\n\t\t\t\t\tmessage += 'Filename: ' + error.filename + '\\n';\n\t\t\t\t\tmessage += 'Line Number: ' + error.line + '\\n';\n\t\t\t\t\tif (error.backtrace && error.backtrace.length) {\n\t\t\t\t\t\tmessage += '\\nBacktrace: ';\n\t\t\t\t\t\terror.backtrace.forEach(err => {\n\t\t\t\t\t\t\tmessage += '\\n\\tFile: ' + err.file + '\\n';\n\t\t\t\t\t\t\tmessage += '\\tLine: ' + err.line + '\\n';\n\t\t\t\t\t\t\tmessage += '\\tFunction: ' + err.function + '\\n';\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t$fhcAlert.alertSystemError(message);\n\t\t\t\t},\n\t\t\t\tdb(error) {\n\t\t\t\t\tconst $fhcAlert = app.config.globalProperties.$fhcAlert;\n\n\t\t\t\t\tvar message = '';\n\t\t\t\t\tif (error.heading !== undefined)\n\t\t\t\t\t\tmessage += error.heading + '\\n\\n';\n\t\t\t\t\tif (error.code !== undefined)\n\t\t\t\t\t\tmessage += 'Code: ' + error.code + '\\n\\n';\n\t\t\t\t\tif (error.sql !== undefined)\n\t\t\t\t\t\tmessage += 'SQL: ' + error.sql + '\\n\\n';\n\t\t\t\t\tif (error.message !== undefined)\n\t\t\t\t\t\tmessage += 'Message: ' + error.message + '\\n\\n';\n\t\t\t\t\telse if (error.messages !== undefined)\n\t\t\t\t\t\tmessage += 'Messages: ' + error.messages.join('\\n\\t') + '\\n\\n';\n\t\t\t\t\tif (error.filename !== undefined)\n\t\t\t\t\t\tmessage += 'Filename: ' + error.filename + '\\n';\n\t\t\t\t\tif (error.line !== undefined)\n\t\t\t\t\t\tmessage += 'Line Number: ' + error.line + '\\n';\n\n\t\t\t\t\t$fhcAlert.alertSystemError(message);\n\t\t\t\t},\n\t\t\t\tauth(error, config) {\n\t\t\t\t\tconst $fhcAlert = app.config.globalProperties.$fhcAlert;\n\n\t\t\t\t\tvar message = '';\n\t\t\t\t\tmessage += 'Controller name: ' + error.controller + '\\n';\n\t\t\t\t\tmessage += 'Method name: ' + error.method + '\\n';\n\t\t\t\t\tmessage += 'Required permissions: ' + error.required_permissions;\n\t\t\t\t\tif (config?.errorHeader)\n\t\t\t\t\t\t$fhcAlert.alertDefault(\n\t\t\t\t\t\t\t'error',\n\t\t\t\t\t\t\tArray.isArray(config.errorHeader) ? app.config.globalProperties.$p.t.apply(null, config.errorHeader) : config.errorHeader,\n\t\t\t\t\t\t\terror.message,\n\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t);\n\t\t\t\t\telse\n\t\t\t\t\t\t$fhcAlert.alertDefault('error', error.message, message);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t/* Deprecated Code start */\n\t\tclass FhcApiFactoryWrapper {\n\t\t\tconstructor(factorypart, root) {\n\t\t\t\tif (root === undefined) {\n\t\t\t\t\tthis.$fhcApi = {\n\t\t\t\t\t\tgetUri(url) {\n\t\t\t\t\t\t\tconsole.warn('$fhcApi.factory is DEPRECATED!');\n\t\t\t\t\t\t\treturn app.config.globalProperties.$fhcApi.getUri(url);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tget(form, uri, params, config) {\n\t\t\t\t\t\t\tconsole.warn('$fhcApi.factory is DEPRECATED!');\n\t\t\t\t\t\t\treturn app.config.globalProperties.$fhcApi.get(form, uri, params, config);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tpost(form, uri, data, config) {\n\t\t\t\t\t\t\tconsole.warn('$fhcApi.factory is DEPRECATED!');\n\t\t\t\t\t\t\treturn app.config.globalProperties.$fhcApi.post(form, uri, data, config);\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\tObject.defineProperty(this.$fhcApi, 'factory', {\n\t\t\t\t\t\tget() {\n\t\t\t\t\t\t\tconsole.warn('$fhcApi.factory is DEPRECATED!');\n\t\t\t\t\t\t\treturn app.config.globalProperties.$fhcApi.factory;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tapp.config.globalProperties.$fhcApi.factory = this;\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty(this, '$fhcApi', {\n\t\t\t\t\t\tget() {\n\t\t\t\t\t\t\treturn (root || this).$fhcApi;\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tthis.addEndpoints(factorypart, true)\n\t\t\t}\n\n\t\t\taddEndpoints(factorypart, noWarn) {\n\t\t\t\tObject.keys(factorypart).forEach(key => {\n\t\t\t\t\tObject.defineProperty(this, key, {\n\t\t\t\t\t\tget() {\n\t\t\t\t\t\t\tif (typeof factorypart[key] == 'function')\n\t\t\t\t\t\t\t\treturn factorypart[key].bind(this);\n\t\t\t\t\t\t\treturn new FhcApiFactoryWrapper(factorypart[key], this.$fhcApi.factory);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\tif (!noWarn) console.warn('$fhcApi.factory.addEndpoints() is DEPRECATED!');\n\t\t\t}\n\t\t}\n\n\t\tconst factory = new FhcApiFactoryWrapper(FhcApiFactory);\n\t\tif (options?.factory) {\n\t\t\tconsole.warn(\"$fhcApi is DEPRECATED!\");\n\t\t\tfactory.addEndpoints(options.factory);\n\t\t}\n\n\t\tapp.config.globalProperties.$fhcApi.factory = factory;\n\t\t/* Deprecated Code end */\n\t\t\n\t\tapp.provide('$fhcApi', app.config.globalProperties.$fhcApi);\n\t}\n};","/**\n * Copyright (C) 2022 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n//--------------------------------------------------------------------------------------------------------------------\n// Configs\n\n// To see debug messages into the browser console set this parameter as true\nconst CORE_REST_CLIENT_DEBUG = false;\n\n// Default timeout (milliseconds)\nconst CORE_REST_CLIENT_TIMEOUT = 5000;\n\n//--------------------------------------------------------------------------------------------------------------------\n// Constants\n\n// Success\nconst CORE_REST_CLIENT_SUCCESS = 0;\n\n// Properties present in a response\nconst CORE_REST_CLIENT_ERROR = \"error\";\nconst CORE_REST_CLIENT_RETVAL = \"retval\";\n\n// HTTP method parameters\nconst CRC_HTTP_GET_METHOD = \"get\";\nconst CRC_HTTP_POST_METHOD = \"post\";\n\n/**\n * Definition and initialization of the object CoreRESTClient\n */\nexport const CoreRESTClient = {\n\t//------------------------------------------------------------------------------------------------------------------\n\t// Public methods\n\n\t/**\n\t * Performs a call using the HTTP GET method\n\t * wsParameters is an object\n\t * axiosParameters is an object\n\t */\n\tget: function(wsURL, wsParameters, axiosParameters = null) {\n\t\treturn CoreRESTClient._axiosCall(wsURL, wsParameters, CRC_HTTP_GET_METHOD, axiosParameters);\n\t},\n\n\t/**\n\t * Performs a call using the HTTP POST method\n\t * wsParameters is an object\n\t * axiosParameters is an object\n\t */\n\tpost: function(wsURL, wsParameters, axiosParameters = null) {\n\t\treturn CoreRESTClient._axiosCall(wsURL, wsParameters, CRC_HTTP_POST_METHOD, axiosParameters);\n\t},\n\n\t/**\n\t * Checks if the response is a success\n\t */\n\tisSuccess: function(response) {\n\n\t\tif (typeof response === \"object\" && response.hasOwnProperty(CORE_REST_CLIENT_ERROR)\n\t\t\t&& response.hasOwnProperty(CORE_REST_CLIENT_RETVAL) && response.error == CORE_REST_CLIENT_SUCCESS)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t/**\n\t * Checks if the response is an error\n\t */\n\tisError: function(response) {\n\t\treturn !CoreRESTClient.isSuccess(response);\n\t},\n\n\t/**\n\t * Checks if the response has data\n\t */\n\thasData: function(response) {\n\n\t\tif (CoreRESTClient.isSuccess(response))\n\t\t{\n\t\t\tif ((typeof response[CORE_REST_CLIENT_RETVAL] === \"object\" && Object.keys(response[CORE_REST_CLIENT_RETVAL]).length > 0)\n\t\t\t\t|| (typeof response[CORE_REST_CLIENT_RETVAL] === \"array\" && response[CORE_REST_CLIENT_RETVAL].length > 0)\n\t\t\t\t|| (typeof response[CORE_REST_CLIENT_RETVAL] === \"string\" && response[CORE_REST_CLIENT_RETVAL].trim() != \"\")\n\t\t\t\t|| typeof response[CORE_REST_CLIENT_RETVAL] === \"number\")\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t/**\n\t * Retrives data from response object\n\t */\n\tgetData: function(response) {\n\n\t\tif (CoreRESTClient.hasData(response))\n\t\t{\n\t\t\treturn response[CORE_REST_CLIENT_RETVAL];\n\t\t}\n\n\t\treturn null;\n\t},\n\n\t/**\n\t * Retrives error message from response object\n\t */\n\tgetError: function(response) {\n\n\t\tif (typeof response === \"object\"\n\t\t\t&& Object.keys(response).length > 0\n\t\t\t&& response.hasOwnProperty(CORE_REST_CLIENT_RETVAL))\n\t\t{\n\t\t\treturn response[CORE_REST_CLIENT_RETVAL];\n\t\t}\n\n\t\treturn \"Generic error\";\n\t},\n\n\t/**\n\t * Retrives code from response object\n\t */\n\tgetErrorCode: function(response) {\n\n\t\tif (typeof response === \"object\" && response.hasOwnProperty(CORE_REST_CLIENT_ERROR))\n\t\t{\n\t\t\treturn response[CORE_REST_CLIENT_ERROR];\n\t\t}\n\n\t\treturn 1; // Generic error\n\t},\n\n\t//------------------------------------------------------------------------------------------------------------------\n\t// Private methods\n\n\t/**\n\t * Generate the router URI using the connection parameters\n\t */\n\t_generateRouterURI: function(wsURL) {\n\t\tvar uri = null;\n\n\t\t// Checks if global JS object FHC_JS_DATA_STORAGE_OBJECT exists\n\t\tif (typeof FHC_JS_DATA_STORAGE_OBJECT !== \"undefined\")\n\t\t{\n\t\t\turi = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + \"/\" + wsURL;\n\t\t}\n\n\t\treturn uri;\n\t},\n\n\t/**\n\t * Method to print debug info after a controller has been called\n\t */\n\t_printDebug: function(parameters, response, errorThrown) {\n\n\t\tif (CORE_REST_CLIENT_DEBUG === true) // If global const CORE_REST_CLIENT_DEBUG is true, but really true!\n\t\t{\n\t\t\t// Print info about called controller\n\t\t\tconsole.log(\"Called controller: \" + parameters.remoteController);\n\t\t\tconsole.log(\"Call parameters:\"); // parameters given to this call\n\t\t\tconsole.log(parameters);\n\n\t\t\tif (response != null) // if there is a response...\n\t\t\t{\n\t\t\t\tconsole.log(\"Controller Response:\");\n\t\t\t\tconsole.log(response); // ...print it\n\t\t\t}\n\t\t\tif (errorThrown != null) // if there is a jQuery error...\n\t\t\t{\n\t\t\t\tconsole.log(\"jQuery error:\");\n\t\t\t\tconsole.log(errorThrown); // ...print it\n\t\t\t}\n\t\t\tconsole.log(\"--------------------------------------------------------------------------------------------\");\n\t\t}\n\t},\n\n\t/**\n\t * Performs a call to the server were the CI PHP layer is running\n\t * - wsURL: alias of the core controller to call\n\t * - wsParameters: parameters to give to the called controller\n\t * - type: POST or GET HTTP method\n\t * - axiosParameters: an object to configure the axios call\n\t */\n\t_axiosCall: function(wsURL, wsParameters, type, axiosParameters) {\n\n\t\t// Axios config object\n\t\tlet axiosCallObj = {\n\t\t\tmethod: type,\n\t\t\turl: CoreRESTClient._generateRouterURI(wsURL),\n\t\t\ttimeout: CORE_REST_CLIENT_TIMEOUT // default time out\n\t\t};\n\n\t\t// The ajax call is HTTP GET\n\t\tif (type == CRC_HTTP_GET_METHOD)\n\t\t{\n\t\t\taxiosCallObj.params = wsParameters;\n\t\t}\n\t\t// The ajax call is HTTP POST\n\t\telse\n\t\t{\n\t\t\taxiosCallObj.data = wsParameters;\n\t\t}\n\n\t\t// Check if axiosParameters is an object\n\t\tif (typeof axiosParameters === \"object\")\n\t\t{\n\t\t\t// And then copies the its properties into axiosCallObj\n\t\t\tfor (var prop in axiosParameters) axiosCallObj[prop] = axiosParameters[prop];\n\t\t}\n\n\t\t// Perform the ajax call via axios\n\t\treturn axios(axiosCallObj);\n\t}\n};\n\n","/**\n * Copyright (C) 2022 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n * \n * @usage:\n * Preperations:\n * Be sure to have PrimeVue loaded with the toast and confirmdialog\n * components as primevue variable\n * Install:\n * Import this Plugin and install it with the app.use() function.\n * Use:\n * In your component you can call now the global property $fhcAlert\n * which has the following functions:\n * \n * alertSuccess\n * ------------\n * Displays a success message\n * @param string\tmessage\n * @return void\n * \n * alertInfo\n * ---------\n * Displays an info message\n * @param string\tmessage\n * @return void\n * \n * alertWarning\n * ------------\n * Displays a warning\n * @param string\tmessage\n * @return void\n * \n * alertError\n * ----------\n * Displays an error\n * @param string\tmessage\n * @return void\n * \n * alertSystemError\n * ----------------\n * Displays an alert with the error details and a button to mail\n * the error to the Support Team\n * @param string\tmessage\n * @return void\n * \n * confirmDelete\n * -------------\n * Displays a confirmation dialog and returns a Promise which resolves\n * with true or false depending und the pressed button.\n * @return Promise\n * \n * alertDefault\n * ------------\n * Displays an alert\n * @param string\tseverity\t\tcan be 'success', 'info', 'warning', 'error'\n * @param string\ttitle\n * @param string\tmessage\n * @param boolean\tsticky\t\t\t(optional) defaults to false\n * @return void\n * \n * alertMultiple\n * -------------\n * Displays multiple alerts\n * @param array\t\tmessageArray\n * @param string\tseverity\t\t(optional) defaults to 'info'\n * @param string\ttitle\t\t\t(optional) defaults to 'Info'\n * @param boolean\tsticky\t\t\t(optional) defaults to false\n * @return void\n * \n * handleSystemError\n * -----------------\n * Automatiticly determine how to display an system error and display it.\n * This would be used in a catch block of an ajax call.\n * @param mixed\t\terror\n * @return void\n * \n * handleSystemMessage\n * -------------------\n * Automatiticly determine how to display a message and display it.\n * @param mixed\t\tmessage\n * @return void\n */\nimport PvConfig from \"../../../index.ci.php/public/js/components/primevue/config/config.esm.min.js\";\nimport PvToast from \"../../../index.ci.php/public/js/components/primevue/toast/toast.esm.min.js\";\nimport PvConfirm from \"../../../index.ci.php/public/js/components/primevue/confirmdialog/confirmdialog.esm.min.js\";\nimport PvConfirmationService from \"../../../index.ci.php/public/js/components/primevue/confirmationservice/confirmationservice.esm.min.js\";\nimport FhcPhrasen from \"./Phrasen.js\";\n\nimport {CoreRESTClient} from '../RESTClient.js';\n\nconst helperAppContainer = document.createElement('div');\n\nconst helperApp = Vue.createApp({\n\tname: \"FhcAlertApp\",\n\tcomponents: {\n\t\tPvToast,\n\t\tPvConfirm\n\t},\n\tmethods: {\n\t\tmailToUrl(slotProps) {\n\t\t\tlet mailTo = FHC_JS_DATA_STORAGE_OBJECT.systemerror_mailto;\n\t\t\tlet subject = 'Meldung%20Systemfehler';\n\t\t\tlet body = `\n\t\t\t\tDanke, dass Sie uns den Fehler melden. %0D%0A %0D%0A\n\t\t\t\tBitte beschreiben Sie uns ausführlich das Problem.%0D%0A\n\t\t\t\tBsp: Ich habe X ausgewählt und Y angelegt. Beim Speichern erhielt ich die Fehlermeldung. [Optional: Ich habe den Browser Z verwendet.]%0D%0A\n\t\t\t\t-----------------------------------------------------------------------------------------------------------------------------------%0D%0A\n\t\t\t\tPROBLEM: ... %0D%0A %0D%0A %0D%0A\n\n\t\t\t\t-----------------------------------------------------------------------------------------------------------------------------------%0D%0A\n\t\t\t\tFehler URL: ` + FHC_JS_DATA_STORAGE_OBJECT.called_path + '/' + FHC_JS_DATA_STORAGE_OBJECT.called_method + `%0D%0A\n\t\t\t\tFehler Meldung: ` + slotProps.message.detail + `%0D%0A\n\t\t\t\t-----------------------------------------------------------------------------------------------------------------------------------%0D%0A %0D%0A\n\t\t\t\tWir kümmern uns um eine rasche Behebung des Problems!`\n\n\t\t\treturn \"mailto:\" + mailTo + \"?subject=\" + subject + \"&body=\" + body;\n\t\t},\n\t\topenMessagecard(e) {\n\t\t\tbootstrap.Collapse.getOrCreateInstance(e.target.getAttribute('href')).toggle();\n\t\t}\n\t},\n\tunmounted() {\n\t\thelperAppContainer.parentElement.removeChild(helperAppContainer);\n\t},\n\tcomputed: {\n\t\tshowmaillink: function() {\n\t\t\treturn FHC_JS_DATA_STORAGE_OBJECT.systemerror_mailto !== '';\n\t\t}\n\t},\n\ttemplate: /* html */`\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t`\n});\n\nhelperApp.use(PvConfig);\nhelperApp.use(PvConfirmationService);\n//helperApp.use(FhcPhrasen);\n\nconst helperAppInstance = helperApp.mount(helperAppContainer);\n\ndocument.body.appendChild(helperAppContainer);\n\n\nexport default {\n\tinstall: (app, options) => {\n\t\tif (!app.config.globalProperties.$p)\n\t\t\tapp.use(FhcPhrasen);\n\n\t\tconst $fhcAlert = {\n\t\t\talertSuccess(message) {\n\t\t\t\tif (Array.isArray(message))\n\t\t\t\t\treturn message.forEach(this.alertSuccess);\n\t\t\t\thelperAppInstance.$refs.toast.add({ severity: 'success', summary: 'Info', detail: message, life: 1000});\n\t\t\t},\n\t\t\talertInfo(message) {\n\t\t\t\tif (Array.isArray(message))\n\t\t\t\t\treturn message.forEach(this.alertInfo);\n\t\t\t\thelperAppInstance.$refs.toast.add({ severity: 'info', summary: 'Info', detail: message, life: 3000 });\n\t\t\t},\n\t\t\talertWarning(message) {\n\t\t\t\tif (Array.isArray(message))\n\t\t\t\t\treturn message.forEach(this.alertWarning);\n\t\t\t\thelperAppInstance.$refs.toast.add({ severity: 'warn', summary: 'Achtung', detail: message});\n\t\t\t},\n\t\t\talertError(message) {\n\t\t\t\tif (Array.isArray(message))\n\t\t\t\t\treturn message.forEach(this.alertError);\n\t\t\t\thelperAppInstance.$refs.toast.add({ severity: 'error', summary: 'Achtung', detail: message });\n\t\t\t},\n\t\t\talertSystemError(message) {\n\t\t\t\t//TODO(Manu) for translation of content of template: restructure in data\n\t\t\t\t//and update definitions with translations\n\n\t\t\t\tif (Array.isArray(message))\n\t\t\t\t\treturn message.forEach(this.alertSystemError);\n\t\t\t\thelperAppInstance.$refs.alert.add({\n\t\t\t\t\tseverity: 'error',\n\t\t\t\t\tsummary: Vue.computed(() => app.config.globalProperties.$p.t('alert/systemerror')),\n\t\t\t\t\tdetail: message});\n\t\t\t},\n\t\t\tconfirmDelete() {\n\t\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\t\thelperAppInstance.$confirm.require({\n\t\t\t\t\t\tgroup: 'fhcAlertConfirm',\n\t\t\t\t\t\theader: Vue.computed(() => app.config.globalProperties.$p.t('alert/attention')),\n\t\t\t\t\t\tmessage: Vue.computed(() => app.config.globalProperties.$p.t('alert/confirm_delete')),\n\t\t\t\t\t\tacceptLabel: Vue.computed(() => app.config.globalProperties.$p.t('ui/loeschen')),\n\t\t\t\t\t\tacceptClass: 'p-button-danger',\n\t\t\t\t\t\trejectLabel: Vue.computed(() => app.config.globalProperties.$p.t('ui/abbrechen')),\n\t\t\t\t\t\trejectClass: 'p-button-secondary',\n\t\t\t\t\t\taccept() {\n\t\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t\t},\n\t\t\t\t\t\treject() {\n\t\t\t\t\t\t\tresolve(false);\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t},\n\t\t\tconfirm(options) {\n\t\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\t\thelperAppInstance.$confirm.require({\n\t\t\t\t\t\tgroup: options?.group ?? 'fhcAlertConfirm',\n\t\t\t\t\t\theader: options?.header ?? Vue.computed(() => app.config.globalProperties.$p.t('alert/attention')),\n\t\t\t\t\t\tmessage: options?.message ?? '',\n\t\t\t\t\t\tacceptLabel: options?.acceptLabel ?? 'Ok',\n\t\t\t\t\t\tacceptClass: options?.acceptClass ?? 'btn btn-primary',\n\t\t\t\t\t\trejectLabel: options?.rejectLabel ?? Vue.computed(() => app.config.globalProperties.$p.t('ui/abbrechen')),\n\t\t\t\t\t\trejectClass: options?.rejectClass ?? 'btn btn-outline-secondary',\n\t\t\t\t\t\taccept() {\n\t\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t\t},\n\t\t\t\t\t\treject() {\n\t\t\t\t\t\t\tresolve(false);\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t},\n\t\t\talertDefault(severity, title, message, sticky = false, html = false) {\n\t\t\t\tlet options = { severity: severity, summary: title, detail: message, html };\n\t\t\t\t\n\t\t\t\tif (!sticky)\n\t\t\t\t\toptions.life = 3000;\n\n\t\t\t\thelperAppInstance.$refs.toast.add(options);\n\t\t\t},\n\t\t\talertMultiple(messageArray, severity = 'info', title = 'Info', sticky = false, html = false){\n\t\t\t\t// Check, if array has only string values\n\t\t\t\tif (messageArray.every(message => typeof message === 'string')) {\n\t\t\t\t\tmessageArray.forEach(message => this.alertDefault(severity, title, message, sticky, html));\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\thandleSystemError(error) {\n\t\t\t\t// don't show an error message to the user if the error was an aborted request\n\t\t\t\tif(error.hasOwnProperty('name') && error.name.toLowerCase() === \"AbortError\".toLowerCase())\n\t\t\t\t\treturn;\n\t\t\t\t\n\t\t\t\t// Error is string\n\t\t\t\tif (typeof error === 'string')\n\t\t\t\t\treturn $fhcAlert.alertSystemError(error);\n\n\t\t\t\t// Error is array of strings\n\t\t\t\tif (Array.isArray(error) && error.every(err => typeof err === 'string'))\n\t\t\t\t\treturn error.every($fhcAlert.alertSystemError);\n\n\t\t\t\t// Error has been handled already\n\t\t\t\tif (error.hasOwnProperty('handled') && error.handled)\n\t\t\t\t\treturn;\n\t\t\t\t\n\t\t\t\t// Error is object\n\t\t\t\tif (typeof error === 'object' && error !== null) {\n\t\t\t\t\tlet errMsg = '';\n\n\n\t\t\t\t\tif (error.hasOwnProperty('response') && error.response?.data?.retval)\n\t\t\t\t\t\terrMsg += 'Error Message: ' + (error.response.data.retval.message || error.response.data.retval) + '\\r\\n';\n\t\t\t\t\telse if (error.hasOwnProperty('message'))\n\t\t\t\t\t\terrMsg += 'Error Message: ' + error.message.toUpperCase() + '\\r\\n';\n\n\t\t\t\t\tif (error.hasOwnProperty('config') && error.config.hasOwnProperty('url'))\n\t\t\t\t\t\terrMsg += 'Error ConfigURL: ' + error.config.url + '\\r\\n';\n\n\t\t\t\t\tif (error.hasOwnProperty('stack'))\n\t\t\t\t\t\terrMsg += 'Error Stack: ' + error.stack + '\\r\\n';\n\t\t\t\t\t\n\t\t\t\t\t// Fallback object error message\n\t\t\t\t\tif (errMsg == '')\n\t\t\t\t\t\terrMsg = 'Error Message: ' + JSON.stringify(error) + '\\r\\n';\n\n\t\t\t\t\terrMsg += 'Error Controller Path: ' + FHC_JS_DATA_STORAGE_OBJECT.called_path + '/' + FHC_JS_DATA_STORAGE_OBJECT.called_method;\n\n\t\t\t\t\treturn $fhcAlert.alertSystemError(errMsg);\n\t\t\t\t}\n\n\t\t\t\t// Fallback\n\t\t\t\t$fhcAlert.alertSystemError('alertSystemError throws Generic Error\\r\\nError Controller Path: ' + FHC_JS_DATA_STORAGE_OBJECT.called_path + '/' + FHC_JS_DATA_STORAGE_OBJECT.called_method);\n\t\t\t},\n\t\t\thandleSystemMessage(message) {\n\t\t\t\t// Message is string\n\t\t\t\tif (typeof message === 'string')\n\t\t\t\t\treturn $fhcAlert.alertWarning(message);\n\n\t\t\t\t// Message is array of strings\n\t\t\t\tif (Array.isArray(message)) {\n\t\t\t\t\t// If Array has only Strings\n\t\t\t\t\tif (message.every(msg => typeof msg === 'string'))\n\t\t\t\t\t\treturn message.every($fhcAlert.alertWarning);\n\n\t\t\t\t\t// If Array has only Objects\n\t\t\t\t\tif (message.every(msg => typeof msg === 'object') && msg !== null) {\n\t\t\t\t\t\treturn message.every(msg => {\n\t\t\t\t\t\t\tif (msg.hasOwnProperty('data') && msg.data.hasOwnProperty('retval')) {\n\t\t\t\t\t\t\t\t$fhcAlert.alertWarning(JSON.stringify(msg.data.retval));\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t$fhcAlert.alertSystemError(JSON.stringify(msg));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Message is Object with data property\n\t\t\t\tif (typeof message === 'object' && message !== null){\n\t\t\t\t\tif (message.hasOwnProperty('data') && message.data.hasOwnProperty('retval')) {\n\t\t\t\t\t\t// NOTE(chris): changed: alertSystemError => alertWarning\n\t\t\t\t\t\t$fhcAlert.alertWarning(JSON.stringify(message.data.retval));\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$fhcAlert.alertSystemError(JSON.stringify(message));\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Fallback\n\t\t\t\t$fhcAlert.alertSystemError('alertSystemError throws Generic Error\\r\\nError Controller Path: ' + FHC_JS_DATA_STORAGE_OBJECT.called_path + '/' + FHC_JS_DATA_STORAGE_OBJECT.called_method);\n\t\t\t},\n\t\t\tresetFormValidation(form) {\n\t\t\t\tconst event = new Event('fhc-form-reset');\n\t\t\t\tform.querySelectorAll(['[data-fhc-form-validate],[data-fhc-form-error]']).forEach(el => el.dispatchEvent(event));\n\t\t\t\t/*const alert = form.querySelector('div.alert.alert-danger[role=\"alert\"]');\n\t\t\t\tif (alert) {\n\t\t\t\t\talert.innerHTML = '';\n\t\t\t\t\talert.classList.add('d-none');\n\t\t\t\t}\n\t\t\t\tform.querySelectorAll('.invalid-feedback').forEach(n => n.remove());\n\t\t\t\tform.querySelectorAll('.is-invalid').forEach(n => n.classList.remove('is-invalid'));\n\t\t\t\tform.querySelectorAll('.is-valid').forEach(n => n.classList.remove('is-valid'));*/\n\t\t\t},\n\t\t\thandleFormValidation(error, form) {\n\t\t\t\tif (form === undefined) {\n\t\t\t\t\tif (error && error.nodeType === Node.ELEMENT_NODE)\n\t\t\t\t\t\treturn err => $fhcAlert.handleFormValidation(err, error);\n\t\t\t\t} else {\n\t\t\t\t\tif (error?.response?.status == 400) {\n\t\t\t\t\t\tlet errors = CoreRESTClient.getError(error.response.data);\n\t\t\t\t\t\tif (typeof errors !== \"object\")\n\t\t\t\t\t\t\terrors = error.response.data;\n\n\t\t\t\t\t\t// NOTE(chris): reset form validation\n\t\t\t\t\t\t$fhcAlert.resetFormValidation(form);\n\t\t\t\t\t\t\n\t\t\t\t\t\t// NOTE(chris): set form input validation\n\t\t\t\t\t\tconst notFound = Object.entries(errors).filter(([key, detail]) => {\n\t\t\t\t\t\t\tconst input = form.querySelector('[data-fhc-form-validate=\"' + key + '\"]');\n\t\t\t\t\t\t\tif (!input)\n\t\t\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t\t\tinput.dispatchEvent(new CustomEvent('fhc-form-invalidate', {detail}));\n\n\t\t\t\t\t\t\t/*const input = form.querySelector('[name=\"' + key + '\"]');\n\t\t\t\t\t\t\tif (!input)\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\tinput.classList.add('is-invalid');\n\t\t\t\t\t\t\tconst feedback = document.createElement('div');\n\t\t\t\t\t\t\tfeedback.classList.add('invalid-feedback');\n\t\t\t\t\t\t\tfeedback.innerHTML = detail;\n\t\t\t\t\t\t\tinput.after(feedback);*/\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}).map(arr => arr[1]);\n\n\n\t\t\t\t\t\t//const alert = form.querySelector('div.alert.alert-danger[role=\"alert\"]');\n\t\t\t\t\t\tconst alert = form.querySelector('[data-fhc-form-error]');\n\t\t\t\t\t\tif (alert && notFound.length) {\n\t\t\t\t\t\t\talert.dispatchEvent(new CustomEvent('fhc-form-error', {detail: notFound}));\n\t\t\t\t\t\t\t/*notFound.forEach(txt => {\n\t\t\t\t\t\t\t\tconst p = document.createElement('p');\n\t\t\t\t\t\t\t\tp.innerHTML = txt;\n\t\t\t\t\t\t\t\talert.append(p);\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tif (notFound.length) {\n\t\t\t\t\t\t\t\talert.lastChild.classList.add('mb-0');\n\t\t\t\t\t\t\t\talert.classList.remove('d-none');\n\t\t\t\t\t\t\t}*/\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnotFound.forEach($fhcAlert.alertError);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (error?.response?.status == 400) {\n\t\t\t\t\tlet errors = CoreRESTClient.getError(error.response.data);\n\t\t\t\t\t$fhcAlert.alertError((typeof errors === 'object') ? Object.values(errors) : errors);\n\t\t\t\t} else {\n\t\t\t\t\t$fhcAlert.handleSystemError(error);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tapp.config.globalProperties.$fhcAlert = $fhcAlert;\n\t\tapp.provide('$fhcAlert', app.config.globalProperties.$fhcAlert);\n\t}\n}","import FhcAlert from './FhcAlert.js';\n\n\nexport default {\n\tinstall: (app, options) => {\n\t\tif (app.config.globalProperties.$api) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!app.config.globalProperties.$fhcAlert)\n\t\t\tapp.use(FhcAlert);\n\n\t\tfunction _send_array_or_object(errors, func) {\n\t\t\tif (Array.isArray(errors))\n\t\t\t\terrors.forEach(func);\n\t\t\telse\n\t\t\t\tObject.entries(errors).forEach(\n\t\t\t\t\t([title, errs]) => errs.forEach(\n\t\t\t\t\t\terror => func(error, title)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t}\n\t\tlet DEFAULT_ERROR_CONFIG = {\n\t\t\tsuccess: true,\n\t\t\tfail: true,\n\t\t\tcombine: {\n\t\t\t\tform: ['validation', 'general'],\n\t\t\t\ttoast: ['validation', 'general', 'not_found', 'site_failed']\n\t\t\t},\n\t\t\thandler: {\n\t\t\t\tform(form, errors) {\n\t\t\t\t\tform.clearValidation();\n\t\t\t\t\terrors.forEach(err => form.setFeedback(\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\terr.messages || err.message\n\t\t\t\t\t));\n\t\t\t\t},\n\t\t\t\tasync toast(errors) {\n\t\t\t\t\tconst $p = app.config.globalProperties.$p;\n\t\t\t\t\tif (!$p)\n\t\t\t\t\t\treturn Promise.reject('Phrasen plugin not loaded!');\n\t\t\t\t\n\t\t\t\t\tasync function _format_toast(errors) {\n\t\t\t\t\t\terrors = errors.reduce((result, err) => {\n\t\t\t\t\t\t\tswitch (err.type) {\n\t\t\t\t\t\t\tcase 'not_found':\n\t\t\t\t\t\t\tcase 'site_failed':\n\t\t\t\t\t\t\t\tif (err.message)\n\t\t\t\t\t\t\t\t\tresult[err.message] = [err.url];\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tresult._default = [err.url];\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'general':\n\t\t\t\t\t\t\t\tif (!result._default)\n\t\t\t\t\t\t\t\t\tresult._default = [];\n\t\t\t\t\t\t\t\tresult._default.push(err.message);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'validation':\n\t\t\t\t\t\t\t\tObject.entries(err.messages)\n\t\t\t\t\t\t\t\t\t.forEach(([field, msg]) => {\n\t\t\t\t\t\t\t\t\t\tif (!result[field])\n\t\t\t\t\t\t\t\t\t\t\tresult[field] = [];\n\t\t\t\t\t\t\t\t\t\tif (Array.isArray(msg))\n\t\t\t\t\t\t\t\t\t\t\tresult[field].push(...msg);\n\t\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\t\tresult[field].push(msg);\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t}, {});\n\t\t\t\t\t\tlet counter = 0;\n\t\t\t\t\t\tconst msgs = await Promise.all(Object.entries(errors)\n\t\t\t\t\t\t\t.sort((a, b) => ['_default'].indexOf(b[0]) - ['_default'].indexOf(a[0])) // sort _default first\n\t\t\t\t\t\t\t.map(async ([field, msgs]) => {\n\t\t\t\t\t\t\t\tif (field == '_default') {\n\t\t\t\t\t\t\t\t\tawait $p.loadCategory('dashboard');\n\t\t\t\t\t\t\t\t\tconst general = $p.t('dashboard/general');\n\t\t\t\t\t\t\t\t\tfield = '
    ' + general + '
    ';\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tfield = '
    ' + field + '
    ';\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tcounter += msgs.length;\n\t\t\t\t\t\t\t\treturn field\n\t\t\t\t\t\t\t\t\t+ '
    '\n\t\t\t\t\t\t\t\t\t+ msgs.join('
    ')\n\t\t\t\t\t\t\t\t\t+ '
    ';\n\t\t\t\t\t\t\t}));\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcounter,\n\t\t\t\t\t\t\tmsgs\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlet counter, msgs;\n\t\t\t\t\tif (Array.isArray(errors)) {\n\t\t\t\t\t\t({ counter, msgs } = await _format_toast(errors));\n\t\t\t\t\t} else {\n\t\t\t\t\t\t({ counter, msgs } = await Object.entries(errors)\n\t\t\t\t\t\t\t.reduce(async (res, [title, errs]) => {\n\t\t\t\t\t\t\t\tconst result = await res;\n\t\t\t\t\t\t\t\tconst { counter, msgs } = await _format_toast(errs);\n\t\t\t\t\t\t\t\tresult.counter += counter;\n\t\t\t\t\t\t\t\tresult.msgs.push('
    '\n\t\t\t\t\t\t\t\t\t+ title\n\t\t\t\t\t\t\t\t\t+ '
    '\n\t\t\t\t\t\t\t\t\t+ msgs.join('')\n\t\t\t\t\t\t\t\t\t+ '
    ');\n\t\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t\t}, Promise.resolve({ counter: 0, msgs: []})));\n\t\t\t\t\t}\n\n\t\t\t\t\tawait $p.loadCategory('ui');\n\t\t\t\t\tconst n_errors = $p.t('ui/n_errors', { n: counter });\n\n\t\t\t\t\tapp.config.globalProperties.$fhcAlert.alertDefault(\n\t\t\t\t\t\t'error',\n\t\t\t\t\t\tn_errors,\n\t\t\t\t\t\t'
    ' + msgs.join('') + '
    ',\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\tphp(errors) {\n\t\t\t\t\t_send_array_or_object(errors, (error, title) => {\n\t\t\t\t\t\tvar message = '';\n\t\t\t\t\t\tmessage += 'Message: ' + error.message + '\\n\\n';\n\t\t\t\t\t\tmessage += 'Filename: ' + error.filename + '\\n';\n\t\t\t\t\t\tmessage += 'Line Number: ' + error.line + '\\n';\n\t\t\t\t\t\tif (error.backtrace && error.backtrace.length) {\n\t\t\t\t\t\t\tmessage += '\\nBacktrace: ';\n\t\t\t\t\t\t\terror.backtrace.forEach(err => {\n\t\t\t\t\t\t\t\tmessage += '\\n\\tFile: ' + err.file + '\\n';\n\t\t\t\t\t\t\t\tmessage += '\\tLine: ' + err.line + '\\n';\n\t\t\t\t\t\t\t\tmessage += '\\tFunction: ' + err.function + '\\n';\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tswitch (error.severity) {\n\t\t\t\t\t\t\tcase 'Warning':\n\t\t\t\t\t\t\tcase 'Core Warning':\n\t\t\t\t\t\t\tcase 'Compile Warning':\n\t\t\t\t\t\t\tcase 'User Warning':\n\t\t\t\t\t\t\t\tif (title)\n\t\t\t\t\t\t\t\t\ttitle += ': PHP ' + error.severity;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\ttitle = 'PHP ' + error.severity;\n\t\t\t\t\t\t\t\tapp.config.globalProperties.$fhcAlert.alertDefault('warn', title, message, true);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'Notice':\n\t\t\t\t\t\t\tcase 'User Notice':\n\t\t\t\t\t\t\tcase 'Runtime Notice':\n\t\t\t\t\t\t\t\tif (title)\n\t\t\t\t\t\t\t\t\ttitle += ': PHP ' + error.severity;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\ttitle = 'PHP ' + error.severity;\n\t\t\t\t\t\t\t\tapp.config.globalProperties.$fhcAlert.alertDefault('info', title, message, true);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tmessage = 'Type: PHP ' + error.severity + '\\n\\n' + message;\n\t\t\t\t\t\t\t\tif (title)\n\t\t\t\t\t\t\t\t\tmessage = title + '\\n\\n' + message;\n\t\t\t\t\t\t\t\tapp.config.globalProperties.$fhcAlert.alertSystemError(message);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\texception(errors) {\n\t\t\t\t\t_send_array_or_object(errors, (error, title) => {\n\t\t\t\t\t\tvar message = '';\n\t\t\t\t\t\tif (title)\n\t\t\t\t\t\t\tmessage += title + '\\n\\n';\n\t\t\t\t\t\tmessage += 'Type: ' + error.class + '\\n\\n';\n\t\t\t\t\t\tmessage += 'Message: ' + error.message + '\\n\\n';\n\t\t\t\t\t\tmessage += 'Filename: ' + error.filename + '\\n';\n\t\t\t\t\t\tmessage += 'Line Number: ' + error.line + '\\n';\n\t\t\t\t\t\tif (error.backtrace && error.backtrace.length) {\n\t\t\t\t\t\t\tmessage += '\\nBacktrace: ';\n\t\t\t\t\t\t\terror.backtrace.forEach(err => {\n\t\t\t\t\t\t\t\tmessage += '\\n\\tFile: ' + err.file + '\\n';\n\t\t\t\t\t\t\t\tmessage += '\\tLine: ' + err.line + '\\n';\n\t\t\t\t\t\t\t\tmessage += '\\tFunction: ' + err.function + '\\n';\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tapp.config.globalProperties.$fhcAlert.alertSystemError(message);\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tdb(errors) {\n\t\t\t\t\t_send_array_or_object(errors, (error, title) => {\n\t\t\t\t\t\tvar message = '';\n\t\t\t\t\t\tif (title)\n\t\t\t\t\t\t\tmessage += title + '\\n\\n';\n\t\t\t\t\t\tif (error.heading !== undefined)\n\t\t\t\t\t\t\tmessage += error.heading + '\\n\\n';\n\t\t\t\t\t\tif (error.code !== undefined)\n\t\t\t\t\t\t\tmessage += 'Code: ' + error.code + '\\n\\n';\n\t\t\t\t\t\tif (error.sql !== undefined)\n\t\t\t\t\t\t\tmessage += 'SQL: ' + error.sql + '\\n\\n';\n\t\t\t\t\t\tif (error.message !== undefined)\n\t\t\t\t\t\t\tmessage += 'Message: ' + error.message + '\\n\\n';\n\t\t\t\t\t\telse if (error.messages !== undefined)\n\t\t\t\t\t\t\tmessage += 'Messages: ' + error.messages.join('\\n\\t') + '\\n\\n';\n\t\t\t\t\t\tif (error.filename !== undefined)\n\t\t\t\t\t\t\tmessage += 'Filename: ' + error.filename + '\\n';\n\t\t\t\t\t\tif (error.line !== undefined)\n\t\t\t\t\t\t\tmessage += 'Line Number: ' + error.line + '\\n';\n\n\t\t\t\t\t\tapp.config.globalProperties.$fhcAlert.alertSystemError(message);\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tauth(errors) {\n\t\t\t\t\t_send_array_or_object(errors, (error, title) => {\n\t\t\t\t\t\tif (title)\n\t\t\t\t\t\t\ttitle += ': ' + error.message;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\ttitle = error.message;\n\n\t\t\t\t\t\tvar message = '';\n\t\t\t\t\t\tmessage += 'Controller name: ' + error.controller + '\\n';\n\t\t\t\t\t\tmessage += 'Method name: ' + error.method + '\\n';\n\t\t\t\t\t\tmessage += 'Required permissions: ' + error.required_permissions;\n\n\t\t\t\t\t\tapp.config.globalProperties.$fhcAlert.alertDefault(\n\t\t\t\t\t\t\t'error',\n\t\t\t\t\t\t\ttitle,\n\t\t\t\t\t\t\tmessage,\n\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tif (options?.errorHandling !== undefined)\n\t\t\tDEFAULT_ERROR_CONFIG = _merge_error_config(options.errorHandling);\n\t\t\n\t\tfunction get_config(form, uri, data, config) {\n\t\t\tif (typeof form == 'string' && config === undefined) {\n\t\t\t\t[uri, data, config] = [form, uri, data];\n\t\t\t\tform = undefined;\n\t\t\t} else if (form) {\n\t\t\t\tif (typeof form != 'object')\n\t\t\t\t\tthrow new TypeError('Parameter 1 of _get_config must be an object or a string');\n\t\t\t\tif (uri === undefined && data === undefined && config === undefined) {\n\t\t\t\t\tconfig = form;\n\t\t\t\t\tform = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (form) {\n\t\t\t\t// NOTE(chris): check if form is fhc-form\n\t\t\t\tif (!form.clearValidation || !form.setFeedback)\n\t\t\t\t\tthrow new TypeError(\"'form' is not a Form Component\");\n\n\t\t\t\tform = {\n\t\t\t\t\tclearValidation: form.clearValidation,\n\t\t\t\t\tsetFeedback: form.setFeedback\n\t\t\t\t};\n\n\t\t\t\tif (config)\n\t\t\t\t\tconfig.form = form;\n\t\t\t\telse\n\t\t\t\t\tconfig = {form};\n\t\t\t}\n\n\t\t\treturn [uri, data, config];\n\t\t}\n\t\tfunction clean_return_value(response) {\n\t\t\tif (typeof response.data === 'string' || response.data instanceof String)\n\t\t\t\treturn clean_return_value({ data: response });\n\n\t\t\tconst result = response.data;\n\t\t\tdelete response.data;\n\t\t\tif (!result)\n\t\t\t\treturn {meta: {response}, data: null};\n\t\t\tif (!result.meta)\n\t\t\t\tresult.meta = { response };\n\t\t\telse\n\t\t\t\tresult.meta.response = response;\n\t\t\treturn result;\n\t\t}\n\t\tfunction _merge_error_config(config) {\n\t\t\tif (config === false || config === 'off')\n\t\t\t\treturn { ...DEFAULT_ERROR_CONFIG, success: false, fail: false };\n\t\t\t\n\t\t\tif (!config || config === true)\n\t\t\t\treturn { ...DEFAULT_ERROR_CONFIG };\n\n\t\t\tif (config === 'success')\n\t\t\t\treturn { ...DEFAULT_ERROR_CONFIG, fail: false };\n\t\t\t\n\t\t\tif (config === 'fail')\n\t\t\t\treturn { ...DEFAULT_ERROR_CONFIG, success: false };\n\t\t\t\n\t\t\tconst { success, fail, handler, combine } = config;\n\t\t\t\n\t\t\tconfig = { ...DEFAULT_ERROR_CONFIG };\n\n\t\t\tObject.entries({ fail, success }).forEach(([key, value]) => {\n\t\t\t\tif (value !== undefined)\n\t\t\t\t\tconfig[key] = value;\n\t\t\t});\n\t\t\tObject.entries({ handler, combine }).forEach(([key, value]) => {\n\t\t\t\tif (value !== undefined)\n\t\t\t\t\tconfig[key] = { ...config[key], ...value };\n\t\t\t});\n\n\t\t\treturn config;\n\t\t}\n\t\tfunction get_error_handler(config) {\n\t\t\tconst result = _merge_error_config(config?.errorHandling);\n\n\t\t\tif (!config?.form) {\n\t\t\t\tresult.combine = { ...result.combine, form: [] };\n\t\t\t} else {\n\t\t\t\tconst formHandler = result.handler.form;\n\t\t\t\tresult.handler = { ...result.handler, form: errors => formHandler(config.form, errors) };\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\t\tfunction get_error_list(error) {\n\t\t\tif (error.response) {\n\t\t\t\tif (error.response.status == 404) {\n\t\t\t\t\treturn [{\n\t\t\t\t\t\ttype: 'not_found',\n\t\t\t\t\t\tmessage: error.message,\n\t\t\t\t\t\turl: error.request.responseURL\n\t\t\t\t\t}];\n\t\t\t\t} else {\n\t\t\t\t\tif (error.response.data.errors == undefined) return [];\n\t\t\t\t\treturn error.response.data.errors;\n\t\t\t\t}\n\t\t\t} else if (error.request) {\n\t\t\t\treturn [{\n\t\t\t\t\ttype: 'site_failed',\n\t\t\t\t\tmessage: error.message,\n\t\t\t\t\turl: error.request.responseURL\n\t\t\t\t}];\n\t\t\t} else {\n\t\t\t\treturn [{\n\t\t\t\t\ttype: 'script',\n\t\t\t\t\tmessage: error.message\n\t\t\t\t}];\n\t\t\t}\n\t\t}\n\t\tfunction popHandleableErrors(errorHandling, errors) {\n\t\t\tconst result = {};\n\t\t\tconst copy = [];\n\n\t\t\tif (errors == undefined) return {};\n\n\t\t\twhile (errors.length)\n\t\t\t\tcopy.push(errors.pop());\n\t\t\tfor (var error of copy) {\n\t\t\t\tlet type = error.type;\n\t\t\t\tlet newType = null;\n\t\t\t\tfor (var t in errorHandling.combine) {\n\t\t\t\t\tlet newTypeCombinesType = errorHandling\n\t\t\t\t\t\t.combine[t]\n\t\t\t\t\t\t.includes(type);\n\t\t\t\t\tlet newTypeHasHandler = errorHandling.handler[t];\n\t\t\t\t\tif (newTypeCombinesType && newTypeHasHandler) {\n\t\t\t\t\t\tnewType = t;\n\t\t\t\t\t\tif (newType == 'form')\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (newType)\n\t\t\t\t\ttype = newType;\n\t\t\t\tconst handler = errorHandling.handler[type];\n\t\t\t\tif (handler) {\n\t\t\t\t\tif (!result[type])\n\t\t\t\t\t\tresult[type] = [];\n\t\t\t\t\tif (Array.isArray(error))\n\t\t\t\t\t\tresult[type].push(...error);\n\t\t\t\t\telse\n\t\t\t\t\t\tresult[type].push(error);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\terrors.push(error);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t\t\n\t\t\n\t\tconst fhcApiAxios = axios.create({\n\t\t\ttimeout: 500000,\n\t\t\tbaseURL: FHC_JS_DATA_STORAGE_OBJECT.app_root\n\t\t\t\t+ FHC_JS_DATA_STORAGE_OBJECT.ci_router\n\t\t\t\t+ \"/\"\n\t\t});\n\n\t\tfhcApiAxios.interceptors.request.use(config => {\n\t\t\tif (config.method != 'post' || !config.data)\n\t\t\t\treturn config;\n\n\t\t\tif (config.data instanceof FormData)\n\t\t\t\treturn config;\n\n\t\t\tif (!Object.values(config.data).every(item => {\n\t\t\t\tif (item instanceof FileList)\n\t\t\t\t\treturn false;\n\t\t\t\tif (Array.isArray(item))\n\t\t\t\t\treturn item.every(i => !(i instanceof File));\n\t\t\t\treturn true;\n\t\t\t})) {\n\t\t\t\tconst newData = Object.entries(config.data).reduce((nd, [key, item]) => {\n\t\t\t\t\tif (item instanceof FileList) {\n\t\t\t\t\t\tfor (const file of item)\n\t\t\t\t\t\t\tnd.FormData.append(key + (item.length > 1 ? '[]' : ''), file);\n\t\t\t\t\t} else if (Array.isArray(item)) {\n\t\t\t\t\t\tif (item.every(i => !(i instanceof File))) {\n\t\t\t\t\t\t\tnd.jsondata[key] = item;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\titem.forEach(file => nd.FormData.append(key + (item.length > 1 ? '[]' : ''), file));\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnd.jsondata[key] = item;\n\t\t\t\t\t}\n\t\t\t\t\treturn nd;\n\t\t\t\t}, {\n\t\t\t\t\tFormData: new FormData(),\n\t\t\t\t\tjsondata: {}\n\t\t\t\t});\n\t\t\t\tnewData.FormData.append('_jsondata', JSON.stringify(newData.jsondata));\n\t\t\t\tconfig.data = newData.FormData;\n\t\t\t}\n\n\t\t\treturn config;\n\t\t});\n\n\t\tfhcApiAxios.interceptors.response.use(\n\t\t\tresponse => {\n\t\t\t\tif (response.config?.errorHandling == 'off'\n\t\t\t\t\t|| response.config?.errorHandling === false\n\t\t\t\t\t|| response.config?.errorHandling == 'fail')\n\t\t\t\t\treturn clean_return_value(response);\n\n\t\t\t\t// NOTE(chris): loop through errors\n\t\t\t\tif (response.data.errors)\n\t\t\t\t\tresponse.data.errors = response.data.errors.filter(\n\t\t\t\t\t\terr => (response.config[err.type + 'ErrorHandler'] || app.config.globalProperties.$api._defaultErrorHandlers[err.type])(err, response.config)\n\t\t\t\t\t);\n\n\t\t\t\treturn clean_return_value(response);\n\t\t\t},\n\t\t\terror => {\n\t\t\t\tif (error.code == 'ERR_CANCELED')\n\t\t\t\t\treturn Promise.reject({ handled: true, ...error });\n\n\t\t\t\tconst errorConfig = get_error_handler(error.config);\n\n\t\t\t\tif (!errorConfig.fail)\n\t\t\t\t\treturn Promise.reject(error);\n\n\t\t\t\tconst remaining = get_error_list(error);\n\n\t\t\t\tconst errors = popHandleableErrors(errorConfig, remaining);\n\n\t\t\t\tfor (var type in errors) {\n\t\t\t\t\terrorConfig.handler[type](errors[type]);\n\t\t\t\t}\n\n\t\t\t\tif (remaining.length)\n\t\t\t\t\treturn Promise.reject(error);\n\t\t\t\t\n\t\t\t\treturn Promise.reject({ handled: true, ...error });\n\t\t\t}\n\t\t);\n\n\t\tapp.config.globalProperties.$api = {\n\t\t\tgetUri(url) {\n\t\t\t\treturn fhcApiAxios.getUri({url});\n\t\t\t},\n\t\t\tget(form, uri, params, config) {\n\t\t\t\t[uri, params, config] = get_config(form, uri, params, config);\n\t\t\t\tif (params) {\n\t\t\t\t\tif (config)\n\t\t\t\t\t\tconfig.params = params;\n\t\t\t\t\telse\n\t\t\t\t\t\tconfig = {params};\n\t\t\t\t}\n\t\t\t\treturn fhcApiAxios.get(uri, config);\n\t\t\t},\n\t\t\tpost(form, uri, data, config) {\n\t\t\t\t[uri, data, config] = get_config(form, uri, data, config);\n\t\t\t\treturn fhcApiAxios.post(uri, data, config);\n\t\t\t},\n\t\t\tcall(factory, configoverwrite, form) {\n\t\t\t\tif (Array.isArray(factory)) {\n\t\t\t\t\tconst $api = app.config.globalProperties.$api;\n\n\t\t\t\t\treturn Promise\n\t\t\t\t\t\t.allSettled(factory.map((config, index) => {\n\t\t\t\t\t\t\tif (!Array.isArray(config))\n\t\t\t\t\t\t\t\tconfig = ['#' + index, config];\n\t\t\t\t\t\t\treturn $api.call(config[1], {\n\t\t\t\t\t\t\t\terrorHeader: config[0],\n\t\t\t\t\t\t\t\terrorHandling: false\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}))\n\t\t\t\t\t\t.then(result => {\n\t\t\t\t\t\t\tconst [ , , config ] = get_config(form, undefined, undefined, configoverwrite || {});\n\t\t\t\t\t\t\tconst errorConfig = get_error_handler(config);\n\n\t\t\t\t\t\t\tif (!errorConfig.success && !errorConfig.fail) {\n\t\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst typedErrors = {};\n\t\t\t\t\t\t\tfor (var res of result) {\n\t\t\t\t\t\t\t\tconst [ allowed, item ] = res.status === 'fulfilled'\n\t\t\t\t\t\t\t\t\t? [ errorConfig.success, res.value ]\n\t\t\t\t\t\t\t\t\t: [ errorConfig.fail, res.reason ];\n\t\t\t\t\t\t\t\tif (!allowed)\n\t\t\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t\t\tconst errors = popHandleableErrors(errorConfig, get_error_list(item));\n\n\t\t\t\t\t\t\t\tfor (var type in errors) {\n\t\t\t\t\t\t\t\t\tif (!typedErrors[type])\n\t\t\t\t\t\t\t\t\t\ttypedErrors[type] = {\n\t\t\t\t\t\t\t\t\t\t\t[item.config.errorHeader]: errors[type]\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\ttypedErrors[type][item.config.errorHeader] = errors[type];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tfor (var errType in typedErrors) {\n\t\t\t\t\t\t\t\terrorConfig.handler[errType](typedErrors[errType]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tlet { method, url, params, config } = factory;\n\t\t\t\tif (configoverwrite !== undefined) {\n\t\t\t\t\tconfig = configoverwrite;\n\t\t\t\t}\n\t\t\t\tif (!method) {\n\t\t\t\t\tmethod = 'get';\n\t\t\t\t}\n\t\t\t\tif (method.toLowerCase)\n\t\t\t\t\tmethod = method.toLowerCase();\n\t\t\t\tif (method == 'get') {\n\t\t\t\t\treturn this.get(form, url, params, config);\n\t\t\t\t} else if (method == 'post') {\n\t\t\t\t\treturn this.post(form, url, params, config);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(\"FhcApi: method not allowed:\", method);\n\t\t\t\t}\n\t\t\t},\n\t\t\tgetErrorHandler(config) {\n\t\t\t\treturn get_error_handler(config);\n\t\t\t}\n\t\t};\n\n\t\tapp.provide('$api', app.config.globalProperties.$api);\n\t}\n};\n","/**\n * Copyright (C) 2025 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tloadCategory(category) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/phrasen/loadModule/' + category\n\t\t};\n\t},\n\tsetLanguage(categories,language) {\n\t\tconst params = {categories, language}\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/phrasen/setLanguage',\n\t\t\tparams\n\t\t};\n\t},\n\tgetLanguage() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/phrasen/getLanguage'\n\t\t};\n\t},\n\tgetActiveDbLanguages() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/phrasen/getAllLanguages'\n\t\t};\n\t}\n};","import OldFhcApi from '../plugin/OldFhcApi.js'; // TODO(chris): remove at some point\nimport PluginsApi from './Api.js';\nimport ApiPhrasen from '../api/factory/phrasen.js';\n\nconst categories = Vue.reactive({});\nconst loadingModules = {};\nlet user_language = Vue.ref(FHC_JS_DATA_STORAGE_OBJECT.user_language);\nexport let user_locale = Vue.computed(()=>{\n\tif(!user_language.value) return null;\n\treturn FHC_JS_DATA_STORAGE_OBJECT.server_languages.find(language => language.sprache == user_language.value).LC_Time;\n});\n\nfunction extractCategory(obj, category) {\n\treturn obj.filter(e => e.category == category).reduce((res, elem) => {\n\t\tif (!res[elem.phrase])\n\t\t\tres[elem.phrase] = elem.text;\n\t\treturn res;\n\t}, {});\n}\nfunction getValueForLoadedPhrase(category, phrase, params) {\n\tlet result = categories[category][phrase];\n\tif (!result)\n\t\treturn '<< PHRASE ' + phrase + '>>';\n\tif (params)\n\t\tresult = result.replace(/\\{([^}]*)\\}/g, (match, p1) => params[p1] === undefined ? match : params[p1]);\n\treturn result;\n}\n\nconst phrasen = {\n\tuser_language,\n\tuser_locale,\n\tsetLanguage(language) {\n\t\tconst catArray = Object.keys(categories)\n\t\treturn this.config.globalProperties.$api\n\t\t\t.call(ApiPhrasen.setLanguage(catArray, language))\n\t\t\t.then(res => {\n\t\t\t\tres.data.forEach(row => {\n\t\t\t\t\tcategories[row.category][row.phrase] = row.text\n\t\t\t\t})\n\n\t\t\t\t// update the reactive data that holds the current active user_language\n\t\t\t\tuser_language.value = language;\n\n\t\t\t\treturn res\n\t\t\t})\n\t},\n\tloadCategory(category) {\n\t\tif (Array.isArray(category))\n\t\t\treturn Promise.all(category.map(this.config.globalProperties\n\t\t\t\t.$p.loadCategory));\n\n\t\tif (!loadingModules[category])\n\t\t\tloadingModules[category] = this.config.globalProperties.$api\n\t\t\t\t.call(ApiPhrasen.loadCategory(category))\n\t\t\t\t.then(res => res?.data ? extractCategory(res.data, category) : {})\n\t\t\t\t.then(res => {\n\t\t\t\t\tcategories[category] = res;\n\t\t\t\t});\n\t\treturn loadingModules[category];\n\t},\n\tt_ref(category, phrase, params) {\n\t\tconsole.warn('deprecated');\n\t\treturn Vue.computed(() => this.t(category, phrase, params));\n\t},\n\tt(category, phrase, params) {\n\t\tif (params === undefined && (\n\t\t\t(Array.isArray(category) && category.length == 2) ||\n\t\t\t(category.split && category.split('/').length == 2))\n\t\t\t) {\n\t\t\tparams = phrase;\n\t\t\t[category, phrase] = category.split ? category.split('/') : category;\n\t\t}\n\t\tif (phrase === undefined) {\n\t\t\tconsole.error('invalid input', category, phrase, params);\n\t\t\treturn '';\n\t\t}\n\t\tlet val = Vue.computed(() => {\n\t\t\tif (!categories[category])\n\t\t\t\treturn '';\n\t\t\treturn getValueForLoadedPhrase(category, phrase, params);\n\t\t});\n\t\tif (!categories[category])\n\t\t\tthis.loadCategory(category);\n\t\treturn val.value;\n\t}\n};\n\nexport default {\n\tinstall(app, options) {\n\t\tif (!app.config.globalProperties.$fhcApi)\n\t\t\tapp.use(OldFhcApi); // TODO(chris): remove at some point\n\t\tif (!app.config.globalProperties.$api)\n\t\t\tapp.use(PluginsApi);\n\t\tapp.config.globalProperties.$p = {\n\t\t\tt: phrasen.t,\n\t\t\tloadCategory: cat => phrasen.loadCategory.call(app, cat),\n\t\t\tsetLanguage: lang => phrasen.setLanguage.call(app, lang),\n\t\t\tuser_language: user_language,\n\t\t\tuser_locale,\n\t\t\tt_ref: phrasen.t_ref\n\t\t};\n\t\tapp.provide('$p', app.config.globalProperties.$p);\n\t}\n}","let theme_name = Vue.ref(FHC_JS_DATA_STORAGE_OBJECT.theme.name);\nconst theme_modes = FHC_JS_DATA_STORAGE_OBJECT.theme.modes;\n\nconst toggleTheme = (theme)=>{\n\tif (!theme) return;\n\n\tfor (const theme of theme_modes) {\n\t\tdocument.documentElement.classList.remove(theme);\n\t}\n\ttheme_name.value = theme;\n\tdocument.documentElement.classList.add(theme);\n\n\tdocument.body.setAttribute(\"data-bs-theme\", theme);\n\n\tlet stylesheet = document.querySelector('link[href*=\"primevue/resources/themes\"]');\n\tif (theme == \"dark\") {\n\t\tstylesheet.attributes.href.value = stylesheet.attributes.href.value.replace(\"bootstrap4-light-blue\", \"bootstrap4-dark-blue\");\n\t} else if (theme == \"light\") {\n\t\tstylesheet.attributes.href.value = stylesheet.attributes.href.value.replace(\"bootstrap4-dark-blue\", \"bootstrap4-light-blue\");\n\t}\n\telse{\n\t\tif (stylesheet.attributes.href.value.includes(\"bootstrap4-dark-blue\"))\n\t\t\tstylesheet.attributes.href.value = stylesheet.attributes.href.value.replace(\"bootstrap4-dark-blue\", \"bootstrap4-light-blue\");\n\t}\n\n\tlocalStorage.setItem(\"theme\", theme);\n}\n\nconst initializeTheme = ()=>{\n\t\n\tlet theme = localStorage.getItem(\"theme\");\n\tif (!theme || !theme_modes.includes(theme)) {\n\t\t// set the first theme mode as default\n\t\ttheme = theme_modes[0];\n\t\tlocalStorage.setItem(\"theme\",theme);\n\t}\n\ttoggleTheme(theme);\n}\n\n\nexport default {\n\tinstall: (app,options)=>{\n\t\t\n\t\tdocument.documentElement.classList.add(theme_name.value);\n\n\t\tinitializeTheme();\n\n\t\tapp.config.globalProperties.$theme = {\n\t\t\ttheme_name,\n\t\t\ttheme_modes,\n\t\t\tswitchTheme: (theme) => {\n\t\t\t\ttoggleTheme(theme);\n\t\t\t}, \n\t\t} \n\t}\n}","const rgbToHex = (value) => {\n\tconst hex = value.toString(16);\n\treturn hex.length === 1 ? '0' + hex : hex;\n};\n\nfunction getContrastYIQ(hexcolor) {\n\t\n\tvar r = parseInt(hexcolor.substring(1, 3), 16);\n\tvar g = parseInt(hexcolor.substring(3, 5), 16);\n\tvar b = parseInt(hexcolor.substring(5, 7), 16);\n\tvar yiq = ((r * 299) + (g * 587) + (b * 114)) / 1000;\n\treturn (yiq >= 128) ? 'black' : 'white';\n}\n\nexport default {\n\tmounted(element, binding){\n\t\tconst bgColor = window.getComputedStyle(element).backgroundColor;\n\t\tlet rgbRegEx = new RegExp(/^rgba?\\s*\\(([0-9]+)\\s*,\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*,?\\s*([0-9]+.?[0-9]?)?\\s*\\)/);\n\t\tlet isRgb = bgColor.match(rgbRegEx);\n\t\tif (isRgb) {\n\t\t\tif (isRgb.length < 3) {\n\t\t\t\tconsole.error(\"Invalid RGB color format\");\n\t\t\t}\n\t\t\tlet r = parseInt(isRgb[1], 10);\n\t\t\tlet g = parseInt(isRgb[2], 10);\n\t\t\tlet b = parseInt(isRgb[3], 10);\n\t\t\tlet hexColor = `#${rgbToHex(r)}${rgbToHex(g)}${rgbToHex(b)}`;\n\t\t\telement.style.color = getContrastYIQ(hexColor);\n\t\t}\n\t\telse\n\t\t{\n\t\t\telement.style.color = getContrastYIQ(bgColor);\n\t\t}\n\t},\n}","/**\n * TODO(chris): This is only a prototype!!!\n */\n\nconst TYPE_DEFINITION = {\n\tlehreinheit: {\n\t\tid: \"lehreinheit_id\",\n\t\tdragIcon: \"fa-solid fa-chalkboard-user\",\n\t\textras: [\n\t\t\t\"stundenblockung\"\n\t\t]\n\t},\n\tvevent: {\n\t\tid: \"uid\",\n\t\tdragIcon: \"fa-solid fa-calendar\",\n\t\textras: [\n\t\t\t\"dtstart\",\n\t\t\t\"dtend\",\n\t\t\t\"summary\"\n\t\t]\n\t},\n\tperson: {\n\t\tid: \"person_id\",\n\t\tdragIcon: \"fa-solid fa-user\"\n\t},\n\tstudent: {\n\t\tid: \"student_uid\",\n\t\tdragIcon: \"fa-solid fa-user-graduate\"\n\t},\n\tprestudent: {\n\t\tid: \"prestudent_id\",\n\t\tdragIcon: \"fa-solid fa-user-graduate text-muted\"\n\t}\n\t// TODO: IMPLEMENT OTHER TYPES\n};\n\nconst VALID_TYPES = Object.keys(TYPE_DEFINITION);\n\nconst TYPE_CONSTANTS = Object.keys(TYPE_DEFINITION).reduce((res, type) => {\n\tres['TYPE_' + type.toUpperCase()] = type;\n\treturn res;\n}, {});\n\nfunction isValidDragObject(value) {\n\tif (!value)\n\t\treturn false;\n\tif (Array.isArray(value))\n\t\treturn value.every(isValidDragObject);\n\tif (!value.type)\n\t\treturn false;\n\n\tif (value.type.substr(-11) == '-collection') {\n\t\tif (!Object.prototype.hasOwnProperty.call(value, 'values'))\n\t\t\treturn false;\n\n\t\tif (!VALID_TYPES.includes(value.type.substr(0, value.type.length-11)))\n\t\t\treturn false;\n\t} else {\n\t\tif (!Object.prototype.hasOwnProperty.call(value, 'id'))\n\t\t\treturn false;\n\n\t\tif (!VALID_TYPES.includes(value.type))\n\t\t\treturn false;\n\n\t\tif (TYPE_DEFINITION[value.type].extras) {\n\t\t\tif (!TYPE_DEFINITION[value.type].extras.every(extra => Object.prototype.hasOwnProperty.call(value, extra)))\n\t\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\nfunction getValidTransferData(event, allowedTypes, strict) {\n\tlet obj = null;\n\n\ttry {\n\t\tobj = getTransferData(event, strict);\n\t\tif (!obj)\n\t\t\treturn null;\n\n\t\tif (!strict && Array.isArray(obj)) {\n\t\t\tobj = obj.filter(isValidDragObject);\n\t\t\tif (!obj.length)\n\t\t\t\treturn null;\n\t\t} else if (!isValidDragObject(obj))\n\t\t\treturn null;\n\n\t\tif (allowedTypes && allowedTypes.length) {\n\t\t\tif (Array.isArray(obj)) {\n\t\t\t\tif (strict && !obj.every(v => allowedTypes.includes(v.type))) {\n\t\t\t\t\treturn null;\n\t\t\t\t} else if (!strict) {\n\t\t\t\t\tobj = obj.filter(v => allowedTypes.includes(v.type));\n\t\t\t\t\tif (!obj.length)\n\t\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t} else if (!allowedTypes.includes(obj.type)) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t} catch(_error) {\n\t\treturn null;\n\t}\n\n\tif (Array.isArray(obj) && obj.length == 1)\n\t\treturn obj.find(Boolean);\n\n\treturn obj;\n}\n\nfunction isValidTransferData(event, allowedTypes, strict) {\n\treturn getValidTransferData(event, allowedTypes, strict) ? true : false;\n}\n\nfunction getTransferData(event, strict) {\n\tconst result = [];\n\n\tfor (const type of event.dataTransfer.types) {\n\t\tif (type.substr(0, 16) != 'application/fhc-') {\n\t\t\tif (strict)\n\t\t\t\treturn null;\n\t\t\tcontinue;\n\t\t}\n\t\tlet base_type = type.substr(16);\n\t\tlet collection = false;\n\t\tif (base_type.substr(-11) == '-collection') {\n\t\t\tbase_type = base_type.substr(0, base_type.length-11);\n\t\t\tcollection = true;\n\t\t}\n\t\tif (!VALID_TYPES.includes(base_type)) {\n\t\t\tif (strict)\n\t\t\t\treturn null;\n\t\t\tcontinue;\n\t\t}\n\t\tlet data = JSON.parse(event.dataTransfer.getData(type));\n\t\tif (collection)\n\t\t\tresult.push(...data.values);\n\t\telse\n\t\t\tresult.push(data);\n\t}\n\n\tif (!result.length)\n\t\treturn null;\n\n\tif (result.length == 1)\n\t\treturn result[0];\n\n\treturn result;\n}\n\nfunction convertToValidDragObject(data, strict) {\n\tif (Array.isArray(data)) {\n\t\tconst converted = data.map(convertToValidDragObject).filter(Boolean);\n\t\tif (!converted.length)\n\t\t\treturn undefined;\n\t\tif (strict && converted.length != data.length)\n\t\t\treturn undefined;\n\n\t\tconst sorted = converted.reduce((res, item) => {\n\t\t\tif (!res[item.type])\n\t\t\t\tres[item.type] = [];\n\t\t\tres[item.type].push(item);\n\t\t\treturn res;\n\t\t}, {});\n\n\t\treturn Object.entries(sorted).map(([type, values]) => {\n\t\t\tif (values.length > 1) {\n\t\t\t\treturn {\n\t\t\t\t\ttype: type + '-collection',\n\t\t\t\t\tvalues\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn values[0];\n\t\t});\n\t}\n\n\tif (Object.prototype.hasOwnProperty.call(data, 'type') && isValidDragObject(data)) {\n\t\treturn data;\n\t}\n\n\tconst found = Object.entries(TYPE_DEFINITION).find(([ , typedef ]) => {\n\t\tif (!Object.prototype.hasOwnProperty.call(data, typedef.id))\n\t\t\treturn false;\n\t\tif (typedef.extras) {\n\t\t\tif (!typedef.extras.every(extra => Object.prototype.hasOwnProperty.call(data, extra)))\n\t\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t});\n\n\tif (!found) {\n\t\treturn undefined;\n\t}\n\n\tconst [ type, typedef ] = found;\n\n\tconst newData = {};\n\tnewData.type = type;\n\tnewData.id = data[typedef.id];\n\tif (typedef.extras)\n\t\ttypedef.extras.forEach(extra => newData[extra] = data[extra]);\n\n\treturn newData;\n}\n\nfunction setTransferData(event, validDragObject, setDragImage = false) {\n\tif (setDragImage) {\n\t\tconst dragItems = Array.isArray(validDragObject) ? validDragObject : [ validDragObject ];\n\t\tconst dragElements = dragItems.map(item => {\n\t\t\tconst icon = document.createElement('i');\n\t\t\tconst label = document.createElement('span');\n\t\t\tconst iconContainer = document.createElement('span');\n\n\t\t\ticonContainer.className = 'btn btn-outline-dark bg-light';\n\t\t\tlabel.className = 'small';\n\n\t\t\tif (TYPE_DEFINITION[item.type]) {\n\t\t\t\ticon.className = TYPE_DEFINITION[item.type].dragIcon || 'fa-solid fa-question';\n\t\t\t\tlabel.textContent = item.id;\n\t\t\t} else if (item.type.substr(-11) == '-collection' && TYPE_DEFINITION[item.type.substr(0, item.type.length-11)]) {\n\t\t\t\ticonContainer.style.boxShadow = '3px 3px var(--bs-btn-border-color)';\n\t\t\t\ticon.className = TYPE_DEFINITION[item.type.substr(0, item.type.length-11)].dragIcon || 'fa-solid fa-question';\n\t\t\t\tlabel.textContent = 'x' + item.values.length;\n\t\t\t} else {\n\t\t\t\ticon.className = 'fa-solid fa-question';\n\t\t\t\tlabel.textContent = item.id || '';\n\t\t\t}\n\t\t\t\n\t\t\ticonContainer.append(icon);\n\n\t\t\tconst itemContainer = document.createElement('div');\n\t\t\titemContainer.className = 'd-flex flex-column align-items-center gap-2 small';\n\t\t\titemContainer.append(iconContainer, label);\n\t\t\treturn itemContainer;\n\t\t});\n\n\t\tconst container = document.createElement('div');\n\t\tcontainer.className = 'd-flex flex-row gap-2 small';\n\t\tcontainer.append(...dragElements);\n\n\t\tdocument.body.append(container);\n\t\tevent.dataTransfer.setDragImage(container, -25, 0);\n\t\trequestAnimationFrame(() => {\n\t\t\tdocument.body.removeChild(container);\n\t\t});\n\t}\n\tif (Array.isArray(validDragObject)) {\n\t\treturn validDragObject.forEach(data => setTransferData(event, data));\n\t}\n\t\n\tevent.dataTransfer.setData('application/fhc-' + validDragObject.type, JSON.stringify(validDragObject));\n}\n\n/**\n * check if the dataTransfer types are in the allowed types array\n * if strict is disabled at least one type must be the allowed array\n * otherwise all types have to be in the allowed array\n *\n * @param Event\t\tevent\n * @param Array\t\tallowedTypes\n * @param Boolean\tstrict\n */\nfunction eventHasTypes(event, allowedTypes, strict) {\n\tif (!allowedTypes || !allowedTypes.length)\n\t\tallowedTypes = VALID_TYPES;\n\tallowedTypes = allowedTypes.map(type => 'application/fhc-' + type);\n\n\tconst dataTypes = [...event.dataTransfer.types];\n\t\n\t// NOTE(chris): if dragging across browsers the dataTransfer object is\n\t// set to a default one without data. Since we do not support dragging\n\t// across browsers (yet) we return false which will disallow dropping.\n\tif (!dataTypes.length)\n\t\treturn false;\n\t\n\tif (!strict)\n\t\treturn allowedTypes.some(type => [...event.dataTransfer.types].includes(type));\n\t\n\treturn [...event.dataTransfer.types].every(type => allowedTypes.includes(type));\n}\n\nfunction bindDragEnterLeave(el, onEnter, onLeave) {\n\t// NOTE(chris): add save dragenter and dragleave events\n\t// that won't fire when hovering over child elements\n\n\tlet skipLeave = false;\n\tlet skipLeaveParent = true;\n\n\tfunction init(evt) {\n\t\tskipLeave = false;\n\t\tskipLeaveParent = true;\n\t\t// add global listeners\n\t\twindow.addEventListener('dragenter', globalDragenter, true);\n\t\twindow.addEventListener('dragleave', globalDragleave, true);\n\t\twindow.addEventListener('drop', globalDrop, true);\n\t\t// call enter\n\t\tonEnter(evt);\n\t\t// remove self\n\t\tel.removeEventListener('dragenter', init);\n\t}\n\n\tfunction cleanup(evt, wasDropped) {\n\t\t// remove global listeners\n\t\twindow.removeEventListener('dragenter', globalDragenter, true);\n\t\twindow.removeEventListener('dragleave', globalDragleave, true);\n\t\twindow.removeEventListener('drop', globalDrop, true);\n\t\t// call leave\n\t\tonLeave(evt, wasDropped);\n\t\t// add init\n\t\tel.addEventListener('dragenter', init);\n\t}\n\n\tfunction globalDragenter(evt) {\n\t\tskipLeaveParent = false;\n\t\tif (el != evt.target && !el.contains(evt.target)) {\n\t\t\tcleanup(evt);\n\t\t} else {\n\t\t\tskipLeave = true;\n\t\t}\n\t}\n\tfunction globalDragleave(evt) {\n\t\tif (el != evt.target && !el.contains(evt.target)) {\n\t\t\tif (skipLeaveParent) {\n\t\t\t\tskipLeaveParent = false;\n\t\t\t\treturn;\n\t\t\t}\n\t\t} else {\n\t\t\tif (skipLeave) {\n\t\t\t\tskipLeave = false;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tcleanup(evt);\n\t}\n\tfunction globalDrop(evt) {\n\t\tcleanup(evt, true);\n\t}\n\n\tel.addEventListener('dragenter', init);\n\n\treturn () => {\n\t\t// cleanup\n\t\tel.removeEventListener('dragenter', init);\n\t}\n}\n\nexport {\n\tisValidDragObject,\n\tgetValidTransferData,\n\tisValidTransferData,\n\tgetTransferData,\n\tconvertToValidDragObject,\n\tsetTransferData,\n\teventHasTypes,\n\tbindDragEnterLeave\n};\nexport default {\n\t...TYPE_CONSTANTS,\n\tisValidDragObject,\n\tgetValidTransferData,\n\tisValidTransferData,\n\tgetTransferData,\n\tconvertToValidDragObject,\n\tsetTransferData,\n\teventHasTypes,\n\tbindDragEnterLeave\n};\n","/**\n * TODO(chris): This needs serious rework!!!\n */\nexport default {\n\tmounted(el, binding, vnode) {\n\t\tif (binding.arg == 'draggable') {\n\t\t\tel.addEventListener('update-my-value', evt => {\n\t\t\t\tevt.preventDefault();\n\t\t\t\tbinding.value = evt.detail.item;\n\t\t\t});\n\t\t\tel.addEventListener('dragstart', evt => {\n\t\t\t\tel.dispatchEvent(new CustomEvent('calendar-dragstart', {\n\t\t\t\t\tcancelable: true,\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tdetail: {\n\t\t\t\t\t\titem: binding.value,\n\t\t\t\t\t\tx: evt.offsetX / el.offsetWidth,\n\t\t\t\t\t\ty: evt.offsetY / el.offsetHeight,\n\t\t\t\t\t\toriginalEvent: evt\n\t\t\t\t\t}\n\t\t\t\t}));\n\t\t\t});\n\t\t\tel.addEventListener('dragend', evt => {\n\t\t\t\tel.dispatchEvent(new CustomEvent('calendar-dragend', {\n\t\t\t\t\tcancelable: true,\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tdetail: {\n\t\t\t\t\t\titem: binding.value,\n\t\t\t\t\t\toriginalEvent: evt\n\t\t\t\t\t}\n\t\t\t\t}));\n\t\t\t});\n\t\t} else if (binding.arg == 'dropcage') {\n\t\t\tlet hitbox = null;\n\t\t\tel.addEventListener('dragover', evt => {\n\t\t\t\tif (hitbox)\n\t\t\t\t\treturn;\n\t\t\t\thitbox = el.getBoundingClientRect();\n\t\t\t\treturn el.dispatchEvent(new CustomEvent('calendar-dragenter', {\n\t\t\t\t\tdetail: { originalEvent: evt }\n\t\t\t\t}));\n\t\t\t});\n\t\t\twindow.addEventListener('dragleave', evt => {\n\t\t\t\tif (!hitbox)\n\t\t\t\t\treturn;\n\t\t\t\tlet pos;\n\t\t\t\tif (typeof evt.clientX === 'undefined')\n\t\t\t\t\tpos = {\n\t\t\t\t\t\tx: evt.pageX + document.documentElement.scrollLeft,\n\t\t\t\t\t\ty: evt.pageY + document.documentElement.scrollTop\n\t\t\t\t\t};\n\t\t\t\telse\n\t\t\t\t\tpos = {\n\t\t\t\t\t\tx: evt.clientX + document.body.scrollLeft + document.documentElement.scrollLeft,\n\t\t\t\t\t\ty: evt.clientY + document.body.scrollTop + document.documentElement.scrollTop\n\t\t\t\t\t};\n\t\t\t\tif (pos.x > hitbox.left + hitbox.width - 1 || pos.x < hitbox.left || pos.y > hitbox.top + hitbox.height - 1 || pos.y < hitbox.top) {\n\t\t\t\t\thitbox = null;\n\t\t\t\t\treturn el.dispatchEvent(new CustomEvent('calendar-dragleave', {\n\t\t\t\t\t\tdetail: { originalEvent: evt }\n\t\t\t\t\t}));\n\t\t\t\t}\n\t\t\t});\n\t\t\twindow.addEventListener('drop', evt => {\n\t\t\t\tif (!hitbox)\n\t\t\t\t\treturn;\n\t\t\t\t\n\t\t\t\thitbox = null;\n\t\t\t\treturn el.dispatchEvent(new CustomEvent('calendar-dragleave', {\n\t\t\t\t\tdetail: { originalEvent: evt }\n\t\t\t\t}));\n\t\t\t});\n\t\t} else if (binding.arg == 'dropzone') {\n\t\t\tel.addEventListener(\n\t\t\t\tbinding.modifiers.once ? 'dragenter' : 'dragover',\n\t\t\t\tevt => {\n\t\t\t\t\tconst timestamp = binding.value instanceof Function\n\t\t\t\t\t\t? binding.value(evt)\n\t\t\t\t\t\t: binding.value;\n\t\t\t\t\tconst detail = timestamp.timestamp ? timestamp : { timestamp };\n\t\t\t\t\tel.dispatchEvent(new CustomEvent('calendar-dragchange', {\n\t\t\t\t\t\tcancelable: true,\n\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\tdetail\n\t\t\t\t\t}));\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t},\n\tupdated(el, binding, vnode, prevVnode) {\n\t\tif (binding.arg == 'draggable') {\n\t\t\tel.dispatchEvent(new CustomEvent('update-my-value', {\n\t\t\t\tcancelable: true,\n\t\t\t\tdetail: {\n\t\t\t\t\titem: binding.value\n\t\t\t\t}\n\t\t\t}));\n\t\t}\n\t}\n}","import DragAndDrop from '../../../helpers/DragAndDrop.js';\n\nimport CalDnd from '../../../directives/Calendar/DragAndDrop.js';\n\n/**\n * TODO(chris): this needs serious rework!\n */\n\nexport default {\n\tname: \"CalendarDragAndDrop\",\n\tdirectives: {\n\t\tCalDnd\n\t},\n\tprovide() {\n\t\treturn {\n\t\t\tevents: Vue.computed(() => this.correctedEvents),\n\t\t\tbackgrounds: Vue.computed(() => this.backgrounds),\n\t\t\tdropAllowed: Vue.computed(() => this.dragging && this.dropAllowed)\n\t\t};\n\t},\n\tinject: {\n\t\tmode: \"mode\",\n\t\tdropableEvents: \"dropableEvents\"\n\t},\n\tprops: {\n\t\tevents: Array,\n\t\tbackgrounds: Array\n\t},\n\temits: [\n\t\t\"drop\"\n\t],\n\tdata() {\n\t\treturn {\n\t\t\tdragging: false,\n\t\t\tallowed: false,\n\t\t\tdraggedInternalEvent: null,\n\t\t\tdraggedExternalEvent: null,\n\t\t\ttargetTimestamp: 0,\n\t\t\ttargetGridEnds: null,\n\t\t\tdropAllowed: false,\n\n\t\t\tshadowPreview: false // TODO(chris): IMPLEMENT! (use background instead of event as preview)\n\t\t};\n\t},\n\tcomputed: {\n\t\tcorrectedEvents() {\n\t\t\tif (this.dragging) {\n\t\t\t\tif (this.draggedInternalEvent) {\n\t\t\t\t\tconst index = this.events.findIndex(e => e.id == this.draggedInternalEvent.id);\n\t\t\t\t\tif (this.previewEvent && !this.shadowPreview)\n\t\t\t\t\t\treturn this.events.toSpliced(index, 1, this.previewEvent);\n\t\t\t\t\telse\n\t\t\t\t\t\treturn this.events.toSpliced(index, 1);\n\t\t\t\t}\n\t\t\t\tif (this.previewEvent && !this.shadowPreview)\n\t\t\t\t\treturn [...this.events, this.previewEvent];\n\t\t\t}\n\n\t\t\treturn this.events;\n\t\t},\n\t\tcorrectedBackgrounds() {\n\t\t\tif (this.dragging) {\n\t\t\t\tif (this.shadowPreview) {\n\t\t\t\t\t// TODO(chris): how to get the length\n\t\t\t\t\treturn [...this.backgrounds, {\n\t\t\t\t\t\tstart: new Date(this.targetTimestamp),\n\t\t\t\t\t\tclass: 'shadow-preview'\n\t\t\t\t\t}];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this.backgrounds;\n\t\t},\n\t\tpreviewEvent() {\n\t\t\tif (!this.dragging || !this.dropAllowed)\n\t\t\t\treturn null;\n\t\t\tif (!this.targetTimestamp)\n\t\t\t\treturn null;\n\n\t\t\tconst event = this.draggedInternalEvent || this.draggedExternalEvent;\n\n\t\t\tif (!event)\n\t\t\t\treturn null;\n\t\t\t\n\t\t\t// TODO(chris): calculate length correctly from orig\n\t\t\tlet length = event.end - event.start;\n\t\t\tif (this.targetGridEnds)\n\t\t\t\tlength = this.targetGridEnds.find(end => end >= this.targetTimestamp + length) - this.targetTimestamp;\n\t\t\t\n\t\t\treturn {\n\t\t\t\torig: event.orig,\n\t\t\t\tstart: this.targetTimestamp,\n\t\t\t\tend: this.targetTimestamp + length\n\t\t\t};\n\t\t}\n\t},\n\tmethods: {\n\t\tonDragstart(evt) {\n\t\t\tconst data = DragAndDrop.convertToTransferData(evt.detail.item.orig);\n\t\t\tif (DragAndDrop.isValidDragObject(data)) {\n\t\t\t\tDragAndDrop.setTransferData(evt.detail.originalEvent, data);\n\t\t\t\tthis.draggedInternalEvent = evt.detail.item;\n\t\t\t}\n\t\t},\n\t\tonDragend() {\n\t\t\tthis.draggedInternalEvent = null;\n\t\t\tthis.dragging = false;\n\t\t},\n\t\tonDragenter(evt) {\n\t\t\tthis.dragging = true;\n\n\t\t\tif (!this.draggedInternalEvent) {\n\t\t\t\tconst event = DragAndDrop.getValidTransferData(evt.detail.originalEvent);\n\t\t\t\tif (event) {\n\t\t\t\t\tthis.draggedExternalEvent = {\n\t\t\t\t\t\tid: event.id,\n\t\t\t\t\t\ttype: event.type,\n\t\t\t\t\t\tstart: event.isostart\n\t\t\t\t\t\t\t? luxon.DateTime.fromISO(event.isostart).setZone(this.timezone)\n\t\t\t\t\t\t\t: luxon.DateTime.local().setZone(this.timezone),\n\t\t\t\t\t\tend: event.isoend\n\t\t\t\t\t\t\t? luxon.DateTime.fromISO(event.isoend).setZone(this.timezone)\n\t\t\t\t\t\t\t: luxon.DateTime.local().setZone(this.timezone),\n\t\t\t\t\t\torig: event\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tthis.draggedExternalEvent = null;\n\t\t\t\t}\n\t\t\t\tthis.dropAllowed = this.dropableEvents(event, this.mode);\n\t\t\t} else {\n\t\t\t\tthis.dropAllowed = this.dropableEvents(this.draggedInternalEvent, this.mode);\n\t\t\t}\n\t\t},\n\t\tonDragleave() {\n\t\t\tthis.dragging = false;\n\t\t},\n\t\tonDragchange(evt) {\n\t\t\tthis.targetTimestamp = evt.detail.timestamp;\n\t\t\t\n\t\t\tthis.targetGridEnds = evt.detail.ends || null;\n\t\t},\n\t\tonDrop(evt) {\n\t\t\tif (!this.dragging || !this.dropAllowed)\n\t\t\t\treturn;\n\n\t\t\tthis.$emit('drop', evt, this.previewEvent.start, this.previewEvent.end);\n\t\t\tthis.dropAllowed = false;\n\t\t\tthis.dragging = false;\n\t\t}\n\t},\n\ttemplate: `\n\t\n\t\t\n\t\n\t`\n}\n","/**\n * TODO(chris): use click-directive\n */\nimport DatePicker from './Header/Datepicker.js';\n\nexport default {\n\tname: \"CalendarHeader\",\n\tcomponents: {\n\t\tDatePicker\n\t},\n\tprops: {\n\t\tdate: {\n\t\t\ttype: luxon.DateTime,\n\t\t\trequired: true\n\t\t},\n\t\tmode: {\n\t\t\ttype: String,\n\t\t\trequired: true\n\t\t},\n\t\tmodeOptions: {\n\t\t\ttype: Object,\n\t\t\tdefault: {}\n\t\t},\n\t\tbtnMonth: Boolean,\n\t\tbtnWeek: Boolean,\n\t\tbtnDay: Boolean,\n\t\tbtnList: Boolean\n\t},\n\temits: [\n\t\t\"next\",\n\t\t\"prev\",\n\t\t\"click:mode\",\n\t\t\"update:date\",\n\t\t\"update:mode\"\n\t],\n\tdata() {\n\t\treturn {\n\t\t\topen: false\n\t\t};\n\t},\n\tmethods: {\n\t\tclickMode(evt, mode) {\n\t\t\tthis.$emit('click:mode', evt);\n\t\t\tif (!evt.defaultPrevented)\n\t\t\t\tthis.$emit('update:mode', mode);\n\t\t}\n\t},\n\ttemplate: /* html */`\n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t
    \n\t
    \n\t`\n}\n","// TODO(chris): translate aria-labels\n\nexport default {\n\tname: \"CalendarHeaderDatepicker\",\n\tcomponents: {\n\t\tVueDatePicker\n\t},\n\tinject: [\n\t\t\"locale\",\n\t\t\"timezone\"\n\t],\n\tprops: {\n\t\tdate: {\n\t\t\ttype: luxon.DateTime,\n\t\t\trequired: true\n\t\t},\n\t\tmode: {\n\t\t\ttype: String,\n\t\t\trequired: true\n\t\t},\n\t\tlistLength: {\n\t\t\ttype: Number,\n\t\t\tdefault: 7\n\t\t}\n\t},\n\temits: [\n\t\t\"update:date\"\n\t],\n\tcomputed: {\n\t\tconvertedDate() {\n\t\t\t// convert to target TZ then strip TZ Information\n\t\t\t// so the datepicker can work with local times\n\t\t\treturn this.date.setZone(this.timezone).setZone('local', { keepLocalTime: true });\n\t\t},\n\t\tcurrent() {\n\t\t\tswitch (this.mode) {\n\t\t\tcase \"month\":\n\t\t\t\treturn {month: this.convertedDate.month-1, year: this.convertedDate.year};\n\t\t\tcase \"list\":\n\t\t\t\treturn [this.convertedDate.startOf('day').ts, this.convertedDate.startOf('day').plus({ days: this.listLength }).ts - 1];\n\t\t\tcase \"week\":\n\t\t\t\treturn [this.convertedDate.startOf('week', { useLocaleWeeks: true }).ts, this.convertedDate.endOf('week', { useLocaleWeeks: true }).ts];\n\t\t\tcase \"day\":\n\t\t\t\treturn this.convertedDate;\n\t\t\tdefault:\n\t\t\t\treturn null;\n\t\t\t}\n\t\t},\n\t\ttitle() {\n\t\t\tswitch (this.mode) {\n\t\t\tcase \"month\":\n\t\t\t\treturn this.date.toLocaleString({ month: 'long', year: 'numeric' });\n\t\t\tcase \"week\":\n\t\t\t\tvar year = this.date.localWeekYear;\n\t\t\t\tvar week = this.date.toFormat('nn');\n\t\t\t\treturn this.$p.t('calendar/year_kw', { year, week });\n\t\t\tcase \"list\":\n\t\t\t\treturn this.date.toLocaleString(luxon.DateTime.DATE_FULL) + '-' + this.date.plus({ days: this.listLength - 1 }).toLocaleString(luxon.DateTime.DATE_FULL);\n\t\t\tcase \"day\":\n\t\t\t\treturn this.date.toLocaleString(luxon.DateTime.DATE_FULL);\n\t\t\tdefault:\n\t\t\t\treturn 'View not Supported';\n\t\t\t}\n\t\t},\n\t\tweekStart() {\n\t\t\treturn luxon.Info.getStartOfWeek(this.date)%7;\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate(value) {\n\t\t\tlet date;\n\t\t\tswitch (this.mode) {\n\t\t\tcase \"month\":\n\t\t\t\tvalue.month++;\n\t\t\t\tdate = luxon.DateTime.fromObject(value).setZone(this.timezone, { keepLocalTime: true }).setLocale(this.locale);\n\t\t\t\tbreak;\n\t\t\tcase \"list\":\n\t\t\tcase \"week\":\n\t\t\t\tdate = luxon.DateTime.fromJSDate(value[0]).setZone(this.timezone, { keepLocalTime: true }).setLocale(this.locale);\n\t\t\t\tbreak;\n\t\t\tcase \"day\":\n\t\t\t\tdate = luxon.DateTime.fromJSDate(value).setZone(this.timezone, { keepLocalTime: true }).setLocale(this.locale);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\treturn; // Don't update if the value is invalid!\n\t\t\t}\n\t\t\tthis.$emit(\"update:date\", date);\n\t\t},\n\t\tweekNumbers(date) {\n\t\t\treturn luxon.DateTime.fromJSDate(date, { locale: this.locale }).localWeekNumber;\n\t\t}\n\t},\n\ttemplate: /* html */`\n\t title\"\n\t\t:month-picker=\"mode == 'month'\"\n\t\t:week-picker=\"mode == 'week'\"\n\t\t:range=\"mode == 'list' ? { autoRange: listLength - 1 } : false\"\n\t\t:text-input=\"mode == 'day'\"\n\t\t:week-start=\"weekStart\"\n\t\t:week-numbers=\"{ type: weekNumbers }\"\n\t\t:clearable=\"false\"\n\t\t:enable-time-picker=\"false\"\n\t\t:config=\"{ keepActionRow: mode != 'month' }\"\n\t\t:action-row=\"{ showSelect: false, showCancel: false, showNow: mode != 'month', showPreview: false }\"\n\t\tauto-apply\n\t\tsix-weeks\n\t\tteleport\n\t\t:locale=\"locale\"\n\t\t:now-button-label=\"$p.t('calendar/today')\"\n\t\t:week-num-name=\"$p.t('calendar/kw')\"\n\t/>\n\t`\n}\n","export default {\n\tname: 'CalendarSlider',\n\tinject: {\n\t\ttime: {\n\t\t\tfrom: \"sliderTime\",\n\t\t\tdefault: \".3s\"\n\t\t}\n\t},\n\temits: [\n\t\t'slid'\n\t],\n\tdata() {\n\t\treturn {\n\t\t\ttarget: 0,\n\t\t\textrasAfter: 0,\n\t\t\textrasBefore: 0,\n\t\t\trunning: false,\n\t\t\tpromiseResolve: null\n\t\t}\n\t},\n\tcomputed: {\n\t\titemsAfter() {\n\t\t\treturn [...Array(this.extrasAfter)].map((i, k) => 1+k);\n\t\t},\n\t\titemsBefore() {\n\t\t\treturn [...Array(this.extrasBefore)].map((i, k) => k-this.extrasBefore);\n\t\t},\n\t\tstyleSlider() {\n\t\t\tconst style = {\n\t\t\t\tposition: 'absolute',\n\t\t\t\ttop: 0,\n\t\t\t\tleft: 0,\n\t\t\t\twidth: '100%',\n\t\t\t\theight: '100%'\n\t\t\t};\n\t\t\tif (this.running) {\n\t\t\t\tstyle.left = (-this.target * 100) + '%';\n\t\t\t\tstyle.transition = 'left ' + this.time + ' ease-in-out';\n\t\t\t}\n\t\t\treturn style;\n\t\t},\n\t\tstyleBefore() {\n\t\t\treturn {\n\t\t\t\tposition: 'absolute',\n\t\t\t\ttop: 0,\n\t\t\t\theight: '100%',\n\t\t\t\tdisplay: 'flex',\n\t\t\t\tright: '100%',\n\t\t\t\twidth: (this.extrasBefore * 100) + '%'\n\t\t\t};\n\t\t},\n\t\tstyleAfter() {\n\t\t\treturn {\n\t\t\t\tposition: 'absolute',\n\t\t\t\ttop: 0,\n\t\t\t\theight: '100%',\n\t\t\t\tdisplay: 'flex',\n\t\t\t\tleft: '100%',\n\t\t\t\twidth: (this.extrasAfter * 100) + '%'\n\t\t\t};\n\t\t}\n\t},\n\tmethods: {\n\t\tprevPage() {\n\t\t\treturn this.slidePages(-1);\n\t\t},\n\t\tnextPage() {\n\t\t\treturn this.slidePages(1);\n\t\t},\n\t\tslidePages(dir) {\n\t\t\treturn new Promise(resolve => {\n\t\t\t\tthis.promiseResolve = resolve;\n\t\t\t\tthis.running = true;\n\t\t\t\tconst newTarget = this.target + dir;\n\t\t\t\tif (newTarget > 0) {\n\t\t\t\t\tif (this.extrasAfter < newTarget)\n\t\t\t\t\t\tthis.extrasAfter = newTarget;\n\t\t\t\t} else if (newTarget < 0) {\n\t\t\t\t\tif (-this.extrasBefore > newTarget)\n\t\t\t\t\t\tthis.extrasBefore = -newTarget;\n\t\t\t\t}\n\t\t\t\tthis.target = newTarget;\n\t\t\t});\n\t\t},\n\t\tendSlide() {\n\t\t\tif (this.promiseResolve) {\n\t\t\t\tthis.promiseResolve(this.target);\n\t\t\t\tthis.promiseResolve = null;\n\t\t\t}\n\t\t\tthis.$emit('slid', this.target);\n\t\t\tthis.running = false;\n\t\t\tthis.target = 0;\n\t\t\tthis.extrasAfter = this.extrasBefore = 0;\n\t\t}\n\t},\n\ttemplate: /* html */`\n\t\n\t\t\n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\t\t\n\t\n\t`\n}\n","const clickListeners = [];\n\nfunction saveAddClickListener(el, source, value) {\n\tconst index = clickListeners.findIndex(data => data.el == el);\n\tif (index >= 0) {\n\t\tel.removeEventListener('click', clickListeners[index].listener);\n\t\tclickListeners.splice(index, 1);\n\t}\n\tconst listener = evt => {\n\t\tevt.preventDefault();\n\t\tevt.stopPropagation();\n\t\tconst customEvent = new CustomEvent('cal-click', {\n\t\t\tcancelable: true,\n\t\t\tbubbles: true,\n\t\t\tdetail: { source, value }\n\t\t});\n\t\tevt.target.dispatchEvent(customEvent);\n\t}\n\tclickListeners.push({el, listener});\n\tel.addEventListener('click', listener);\n}\n\nexport default {\n\tmounted(el, binding, vnode) {\n\t\tif (binding.arg == 'container') {\n\t\t\tel.addEventListener('cal-click', evt => {\n\t\t\t\tconst customEvent = new Event('click:' + evt.detail.source, {\n\t\t\t\t\tcancelable: true\n\t\t\t\t});\n\t\t\t\tbinding.instance.$emit('click:' + evt.detail.source, customEvent, evt.detail.value);\n\t\t\t\tif (!customEvent.defaultPrevented) {\n\t\t\t\t\tconst finalEvent = new CustomEvent('cal-click-default', {\n\t\t\t\t\t\tcancelable: true,\n\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\tdetail: evt.detail\n\t\t\t\t\t});\n\t\t\t\t\tevt.target.dispatchEvent(finalEvent);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsaveAddClickListener(el, binding.arg, binding.value);\n\t\t}\n\t},\n\tupdated(el, binding, vnode, prevVnode) {\n\t\tif (binding.arg != 'container') {\n\t\t\tsaveAddClickListener(el, binding.arg, binding.value);\n\t\t}\n\t}\n}","import BaseDraganddrop from './Base/DragAndDrop.js';\nimport BaseHeader from './Base/Header.js';\nimport BaseSlider from './Base/Slider.js';\nimport BsModal from '../Bootstrap/Modal.js';\n\nimport CalClick from '../../directives/Calendar/Click.js';\n\nexport default {\n\tname: \"CalendarBase\",\n\tcomponents: {\n\t\tBaseDraganddrop,\n\t\tBaseHeader,\n\t\tBaseSlider,\n\t\tBsModal\n\t},\n\tdirectives: {\n\t\tCalClick\n\t},\n\tprovide() {\n\t\treturn {\n\t\t\tlocale: Vue.computed(() => this.locale),\n\t\t\ttimezone: Vue.computed(() => this.timezone),\n\t\t\ttimeGrid: Vue.computed(() => this.timeGrid),\n\t\t\tdraggableEvents: Vue.computed(() => {\n\t\t\t\tif (!this.draggableEvents)\n\t\t\t\t\treturn () => false;\n\n\t\t\t\tif (Array.isArray(this.draggableEvents))\n\t\t\t\t\treturn event => this.draggableEvents.includes(event.type);\n\t\t\t\tif (this.draggableEvents instanceof Function)\n\t\t\t\t\treturn this.draggableEvents;\n\t\t\t\t\n\t\t\t\treturn () => true;\n\t\t\t}),\n\t\t\tdropableEvents: Vue.computed(() => {\n\t\t\t\tif (!this.onDrop)\n\t\t\t\t\treturn () => false;\n\n\t\t\t\tif (Array.isArray(this.dropableEvents))\n\t\t\t\t\treturn item => this.dropableEvents.includes(item.type);\n\t\t\t\tif (this.dropableEvents instanceof Function)\n\t\t\t\t\treturn this.dropableEvents;\n\n\t\t\t\treturn () => true;\n\t\t\t}),\n\t\t\thasDragoverFunc: Vue.computed(() => this.onDragover),\n\t\t\tmode: Vue.computed(() => this.mode)\n\t\t};\n\t},\n\tprops: {\n\t\tlocale: {\n\t\t\ttype: String,\n\t\t\tdefault: 'de'\n\t\t},\n\t\ttimezone: {\n\t\t\ttype: String,\n\t\t\trequired: true\n\t\t},\n\t\tdate: {\n\t\t\ttype: [Date, String, Number, luxon.DateTime],\n\t\t\tdefault: props => luxon.DateTime.now().setZone(props.timezone).startOf('day')\n\t\t},\n\t\tmodes: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t\tdefault: {}\n\t\t\t// TODO(chris): verfication functions\n\t\t},\n\t\tmode: String,\n\t\tmodeOptions: Object,\n\t\tevents: {\n\t\t\ttype: Array,\n\t\t\tdefault: []\n\t\t},\n\t\tbackgrounds: {\n\t\t\ttype: Array,\n\t\t\tdefault: []\n\t\t},\n\t\tshowBtns: Boolean,\n\t\tbtnMonth: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: undefined\n\t\t},\n\t\tbtnWeek: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: undefined\n\t\t},\n\t\tbtnDay: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: undefined\n\t\t},\n\t\tbtnList: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: undefined\n\t\t},\n\t\ttimeGrid: Array,\n\t\tdraggableEvents: [Boolean, Array, Function],\n\t\tdropableEvents: [Boolean, Array, Function],\n\t\tonDragover: Function,\n\t\tonDrop: Function\n\t},\n\temits: [\n\t\t\"click:next\",\n\t\t\"click:prev\",\n\t\t\"click:mode\",\n\t\t\"click:event\",\n\t\t\"click:day\",\n\t\t\"click:week\",\n\t\t\"update:date\",\n\t\t\"update:mode\",\n\t\t\"update:range\",\n\t\t\"drop\"\n\t],\n\tdata() {\n\t\treturn {\n\t\t\tinternalView: null,\n\t\t\tinternalDate: null,\n\t\t\tmodalEvent: null\n\t\t};\n\t},\n\tcomputed: {\n\t\tconvertedEvents() {\n\t\t\treturn this.events.map(orig => ({\n\t\t\t\tid: orig.type + orig[orig.type + '_id'],\n\t\t\t\ttype: orig.type,\n\t\t\t\tstart: luxon.DateTime.fromISO(orig.isostart).setZone(this.timezone),\n\t\t\t\tend: luxon.DateTime.fromISO(orig.isoend).setZone(this.timezone),\n\t\t\t\torig\n\t\t\t}));\n\t\t},\n\t\tconvertedBackgrounds() {\n\t\t\treturn this.backgrounds.map(bg => {\n\t\t\t\tconst res = { ...bg };\n\t\t\t\tif (res.start) {\n\t\t\t\t\tif (Number.isInteger(res.start))\n\t\t\t\t\t\tres.start = luxon.DateTime.fromMillis(res.start, { zone: this.timezone, locale: this.locale });\n\t\t\t\t\telse if (res.start instanceof Date)\n\t\t\t\t\t\tres.start = luxon.DateTime.fromJSDate(res.start, { zone: this.timezone, locale: this.locale });\n\t\t\t\t\telse if (typeof res.start === \n\t\t\t\t\t\t'string' || res.start instanceof String)\n\t\t\t\t\t\tres.start = luxon.DateTime.fromISO(res.start, { zone: this.timezone, locale: this.locale });\n\t\t\t\t}\n\t\t\t\tif (res.end) {\n\t\t\t\t\tif (Number.isInteger(res.end))\n\t\t\t\t\t\tres.end = luxon.DateTime.fromMillis(res.end, { zone: this.timezone, locale: this.locale });\n\t\t\t\t\telse if (res.end instanceof Date)\n\t\t\t\t\t\tres.end = luxon.DateTime.fromJSDate(res.end, { zone: this.timezone, locale: this.locale });\n\t\t\t\t\telse if (typeof res.end === \n\t\t\t\t\t\t'string' || res.end instanceof String)\n\t\t\t\t\t\tres.end = luxon.DateTime.fromISO(res.end, { zone: this.timezone, locale: this.locale });\n\t\t\t\t}\n\t\t\t\treturn res;\n\t\t\t});\n\t\t},\n\t\tsDate() {\n\t\t\tif (this.date instanceof luxon.DateTime)\n\t\t\t\treturn this.date;\n\t\t\treturn luxon.DateTime.fromJSDate(new Date(this.date)).setZone(this.timezone);\n\t\t},\n\t\tcDate: {\n\t\t\tget() {\n\t\t\t\tconst date = this.internalDate ? this.internalDate : this.sDate;\n\t\t\t\treturn date.setLocale(this.locale);\n\t\t\t},\n\t\t\tset(value) {\n\t\t\t\tthis.internalDate = value;\n\t\t\t\tthis.$emit('update:date', value, this.cMode);\n\t\t\t}\n\t\t},\n\t\tsMode() {\n\t\t\t// choose default mode\n\t\t\tlet mode = this.mode;\n\t\t\tif (mode)\n\t\t\t\tmode = mode.toLowerCase();\n\t\t\tif (!mode || !this.modes[mode])\n\t\t\t\tmode = Object.keys(this.modes).find(Boolean); // start with first entry as active mode\n\t\t\treturn mode || '';\n\t\t},\n\t\tcMode: {\n\t\t\tget() {\n\t\t\t\treturn this.internalView ? this.internalView : this.sMode;\n\t\t\t},\n\t\t\tset(value) {\n\t\t\t\tthis.internalView = value;\n\t\t\t\tthis.$emit('update:mode', value, this.cDate);\n\t\t\t}\n\t\t}\n\t},\n\twatch: {\n\t\tsDate(n, o) {\n\t\t\tif (this.sDate.isValid && !this.sDate.hasSame(this.internalDate, 'day'))\n\t\t\t\tthis.internalDate = this.sDate;\n\t\t},\n\t\tsMode() {\n\t\t\tif (this.sMode)\n\t\t\t\tthis.internalView = this.sMode;\n\t\t}\n\t},\n\tmethods: {\n\t\tclickPrev() {\n\t\t\tconst evt = new Event('click:prev', {cancelable: true});\n\t\t\tthis.$emit('click:prev', evt);\n\t\t\tif (evt.defaultPrevented)\n\t\t\t\treturn;\n\n\t\t\t// default: switch page\n\t\t\tthis.$refs.mode.prevPage();\n\t\t},\n\t\tclickNext() {\n\t\t\tconst evt = new Event('click:next', {cancelable: true});\n\t\t\tthis.$emit('click:next', evt);\n\t\t\tif (evt.defaultPrevented)\n\t\t\t\treturn;\n\n\t\t\t// default: switch page\n\t\t\tthis.$refs.mode.nextPage();\n\t\t},\n\t\thandleClickDefaults(evt) {\n\t\t\t// TODO(chris): implement\n\t\t\tswitch (evt.detail.source) {\n\t\t\tcase 'day':\n\t\t\t\tif (this.cMode != 'day' && this.modes['day']) {\n\t\t\t\t\tevt.stopPropagation();\n\t\t\t\t\tthis.cDate = evt.detail.value;\n\t\t\t\t\tthis.cMode = 'day';\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'week':\n\t\t\t\tif (this.cMode != 'week' && this.modes['week']) {\n\t\t\t\t\tevt.stopPropagation();\n\t\t\t\t\tthis.cDate = luxon.DateTime.fromObject({\n\t\t\t\t\t\tlocalWeekNumber: evt.detail.value.number,\n\t\t\t\t\t\tlocalWeekYear: evt.detail.value.year\n\t\t\t\t\t}, {\n\t\t\t\t\t\tzone: this.cDate.zoneName,\n\t\t\t\t\t\tlocale: this.cDate.locale\n\t\t\t\t\t});\n\t\t\t\t\tthis.cMode = 'week';\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t\tonDropItem(evt, start, end) {\n\t\t\tthis.$emit('drop', evt, start, end);\n\t\t},\n\t\tshowEventModal(eventObj) {\n\t\t\tthis.modalEvent = eventObj;\n\t\t\tthis.$refs.modal.show();\n\t\t},\n\t\thideEventModal() {\n\t\t\tif (this.modalEvent)\n\t\t\t\tthis.modalEvent.closeFn = undefined;\n\t\t\tthis.$refs.modal.hide();\n\t\t\tthis.modalEvent = null;\n\t\t},\n\t\tonModalHidden() {\n\t\t\tif (this.modalEvent.closeFn)\n\t\t\t\tthis.modalEvent.closeFn();\n\t\t}\n\t},\n\tbeforeUnmount() {\n\t\tthis.hideEventModal();\n\t},\n\ttemplate: /* html */`\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t
    \n\t`\n}\n","/**\n * Copyright (C) 2025 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tgetRoomInfo(ort_kurzbz, start_date, end_date) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/LvPlan/getRoomplan',\n\t\t\tparams: { ort_kurzbz, start_date, end_date }\n\t\t};\n\t},\n\tgetLvPlan(start_date, end_date, lv_id) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/LvPlan/getLvPlan',\n\t\t\tparams: { start_date, end_date, lv_id }\n\t\t};\n\t},\n\teventsPersonal(start_date, end_date) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/lvPlan/eventsPersonal',\n\t\t\tparams: { start_date, end_date }\n\t\t};\n\t},\n\teventsLv(lv_id, start_date, end_date) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/lvPlan/eventsLv',\n\t\t\tparams: { lv_id, start_date, end_date }\n\t\t};\n\t},\n\tgetStunden() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/LvPlan/Stunden'\n\t\t};\n\t},\n\tgetOrtReservierungen(ort_kurzbz, start_date, end_date) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: `/api/frontend/v1/LvPlan/getReservierungen/${ort_kurzbz}`,\n\t\t\tparams: { start_date, end_date }\n\t\t};\n\t},\n\tgetLvPlanReservierungen(start_date, end_date) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/LvPlan/getReservierungen',\n\t\t\tparams: { start_date, end_date }\n\t\t};\n\t},\n\tgetLehreinheitStudiensemester(lehreinheit_id) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: `/api/frontend/v1/LvPlan/getLehreinheitStudiensemester/${lehreinheit_id}`\n\t\t};\n\t},\n\tstudiensemesterDateInterval(date) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: `/api/frontend/v1/LvPlan/studiensemesterDateInterval/${date}`\n\t\t};\n\t},\n\tLvPlanEvents(start_date, end_date, lv_id) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/LvPlan/LvPlanEvents',\n\t\t\tparams: { \n\t\t\t\tstart_date: start_date, \n\t\t\t\tend_date: end_date, \n\t\t\t\tlv_id: lv_id \n\t\t\t}\n\t\t};\n\t},\n\tgetLv(lehrveranstaltung_id) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/LvPlan/getLv/' + lehrveranstaltung_id\n\t\t};\n\t}\n};","import CalDnd from '../../../../../directives/Calendar/DragAndDrop.js';\nimport CalClick from '../../../../../directives/Calendar/Click.js';\n\nexport default {\n\tname: \"GridLineEvent\",\n\tdirectives: {\n\t\tCalDnd,\n\t\tCalClick\n\t},\n\tinject: {\n\t\tdraggableEvents: \"draggableEvents\",\n\t\tmode: \"mode\"\n\t},\n\tprops: {\n\t\tevent: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t\tvalidator(value) {\n\t\t\t\treturn (value.start && value.end && value.orig);\n\t\t\t}\n\t\t}\n\t},\n\tcomputed: {\n\t\tisHeaderOrFooter() {\n\t\t\treturn ['header', 'footer'].includes(this.event.orig);\n\t\t},\n\t\tdraggable() {\n\t\t\treturn !this.isHeaderOrFooter && this.draggableEvents(this.event.orig, this.mode);\n\t\t},\n\t\tclasses() {\n\t\t\tconst classes = [];\n\t\t\tif (this.isHeaderOrFooter) {\n\t\t\t\tclasses.push('event-' + this.event.orig);\n\t\t\t} else {\n\t\t\t\tif (this.event.startsHere)\n\t\t\t\t\tclasses.push('event-begin');\n\t\t\t\tif (this.event.endsHere)\n\t\t\t\t\tclasses.push('event-end');\n\t\t\t}\n\t\t\treturn classes\n\t\t}\n\t},\n\ttemplate: /* html */`\n\t\n\t\t\n\t\t\t{{ event.orig }}\n\t\t\n\t\n\t`\n}\n","import GridLine from './Grid/Line.js';\nimport GridLineEvent from './Grid/Line/Event.js';\n\nimport CalDnd from '../../../directives/Calendar/DragAndDrop.js';\n\nexport default {\n\tname: \"CalendarGrid\",\n\tcomponents: {\n\t\tGridLine,\n\t\tGridLineEvent\n\t},\n\tdirectives: {\n\t\tCalDnd\n\t},\n\tinject: {\n\t\toriginalEvents: \"events\",\n\t\toriginalBackgrounds: \"backgrounds\",\n\t\tdropAllowed: \"dropAllowed\"\n\t},\n\tprovide() {\n\t\treturn {\n\t\t\tflipAxis: Vue.computed(() => this.flipAxis),\n\t\t\taxisRow: Vue.computed(() => this.axisRow)\n\t\t};\n\t},\n\tprops: {\n\t\taxisMain: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t\tvalidator(value) {\n\t\t\t\treturn value.every(item => item instanceof luxon.DateTime);\n\t\t\t}\n\t\t},\n\t\taxisParts: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t\tvalidator(value) {\n\t\t\t\treturn value.every(item =>\n\t\t\t\t\titem instanceof luxon.Duration\n\t\t\t\t\t|| Number.isInteger(item)\n\t\t\t\t\t|| (\n\t\t\t\t\t\t(\n\t\t\t\t\t\t\titem.start instanceof luxon.Duration\n\t\t\t\t\t\t\t|| Number.isInteger(item.start)\n\t\t\t\t\t\t) && (\n\t\t\t\t\t\t\titem.end instanceof luxon.Duration\n\t\t\t\t\t\t\t|| Number.isInteger(item.end)\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\tflipAxis: Boolean,\n\t\tallDayEvents: Boolean,\n\t\taxisMainCollapsible: Boolean,\n\t\tsnapToGrid: Boolean\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdragging: false,\n\t\t\tresizeObserver: null,\n\t\t\tmutationObserver: null,\n\t\t\tuserScroll: true\n\t\t};\n\t},\n\tcomputed: {\n\t\taxisRow() {\n\t\t\treturn this.flipAxis ? 'column' : 'row';\n\t\t},\n\t\taxisCol() {\n\t\t\treturn this.flipAxis ? 'row' : 'column';\n\t\t},\n\t\taxisPartsWithBreaks() {\n\t\t\treturn this.axisParts.reduce((res, tu, index) => {\n\t\t\t\tconst start = tu.start || tu;\n\t\t\t\tconst end = tu.end;\n\n\t\t\t\tif (res.length) {\n\t\t\t\t\tconst lastTuEnd = res.pop();\n\t\t\t\t\tif (Array.isArray(lastTuEnd)) {\n\t\t\t\t\t\tres.push({\n\t\t\t\t\t\t\tstart: lastTuEnd[0],\n\t\t\t\t\t\t\tend: start,\n\t\t\t\t\t\t\tindex: lastTuEnd[1]\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (lastTuEnd != start) {\n\t\t\t\t\t\t// add pause\n\t\t\t\t\t\tres.push({\n\t\t\t\t\t\t\tstart: lastTuEnd,\n\t\t\t\t\t\t\tend: start\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!end) {\n\t\t\t\t\tres.push([start, index]);\n\t\t\t\t} else {\n\t\t\t\t\tres.push({\n\t\t\t\t\t\tstart,\n\t\t\t\t\t\tend,\n\t\t\t\t\t\tindex\n\t\t\t\t\t});\n\t\t\t\t\tres.push(end);\n\t\t\t\t}\n\t\t\t\treturn res;\n\t\t\t}, []).slice(0, -1);\n\t\t},\n\t\taxisPartsSave() {\n\t\t\tif (!this.axisParts[this.axisParts.length - 1].end)\n\t\t\t\treturn this.axisParts.slice(0, -1);\n\t\t\treturn this.axisParts;\n\t\t},\n\t\tstart() {\n\t\t\treturn this.axisPartsWithBreaks[0].start;\n\t\t},\n\t\tend() {\n\t\t\treturn this.axisPartsWithBreaks[this.axisPartsWithBreaks.length - 1].end;\n\t\t},\n\t\tends() {\n\t\t\tconst ends = [];\n\t\t\tconst partsEnds = this.axisPartsWithBreaks\n\t\t\t\t.filter(p => p.index !== undefined)\n\t\t\t\t.map(p => p.end);\n\t\t\tfor (var date of this.axisMain)\n\t\t\t\tfor (var part of partsEnds)\n\t\t\t\t\tends.push(date.plus(part));\n\n\t\t\treturn ends;\n\t\t},\n\t\taxisMainBorders() {\n\t\t\treturn this.axisMain.reduce(\n\t\t\t\t(res, curr) => res.concat([curr.plus(this.start), curr.plus(this.end)]),\n\t\t\t\t[]\n\t\t\t);\n\t\t},\n\t\teventsAllDay() {\n\t\t\tif (!this.allDayEvents)\n\t\t\t\treturn [];\n\t\t\treturn this.mapIntoMainAxis(this.originalEvents.filter(event => event.orig.allDayEvent));\n\t\t},\n\t\teventsNormal() {\n\t\t\tif (!this.allDayEvents)\n\t\t\t\treturn this.events;\n\t\t\treturn this.mapIntoMainAxis(this.originalEvents.filter(event => !event.orig.allDayEvent));\n\t\t},\n\t\tevents() {\n\t\t\treturn this.mapIntoMainAxis(this.originalEvents);\n\t\t},\n\t\tbackgrounds() {\n\t\t\treturn this.mapIntoMainAxis(this.originalBackgrounds);\n\t\t},\n\t\thasValidEvents() {\n\t\t\treturn this.events.find(e => e.length);\n\t\t},\n\t\tstyleGridCols() {\n\t\t\tlet cols = 'repeat(' + this.axisMain.length + ', 1fr)';\n\t\t\tif (this.axisMainCollapsible) {\n\t\t\t\tif (this.hasValidEvents)\n\t\t\t\t\tcols = this.events\n\t\t\t\t\t\t.map(e => e.length\n\t\t\t\t\t\t\t? '1fr'\n\t\t\t\t\t\t\t: 'var(--fhc-calendar-axis-collapsible, .5fr)')\n\t\t\t\t\t\t.join(' ');\n\t\t\t}\n\t\t\treturn cols;\n\t\t},\n\t\tstyleGridRows() {\n\t\t\tconst gridlines = {};\n\n\t\t\tthis.axisPartsWithBreaks.forEach(part => {\n\t\t\t\tlet ts = part.start.toMillis();\n\t\t\t\tif (!gridlines[ts])\n\t\t\t\t\tgridlines[ts] = ['t_' + ts];\n\t\t\t\tif (part.index !== undefined)\n\t\t\t\t\tgridlines[ts].push('ps_' + part.index);\n\t\t\t\tts = part.end.toMillis();\n\t\t\t\tif (!gridlines[ts])\n\t\t\t\t\tgridlines[ts] = ['t_' + ts];\n\t\t\t\tif (part.index !== undefined)\n\t\t\t\t\tgridlines[ts].push('pe_' + part.index);\n\t\t\t});\n\n\t\t\tthis.eventsNormal.forEach((events, mainIndex) => {\n\t\t\t\tlet day = this.axisMain[mainIndex];\n\t\t\t\tevents.forEach(event => {\n\t\t\t\t\tif (!event.startsHere && !event.endsHere)\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tif (event.startsHere) {\n\t\t\t\t\t\tlet ts = event.start.diff(day).toMillis();\n\t\t\t\t\t\tif (!gridlines[ts])\n\t\t\t\t\t\t\tgridlines[ts] = ['t_' + ts, 'e_' + ts];\n\t\t\t\t\t}\n\t\t\t\t\tif (event.endsHere) {\n\t\t\t\t\t\tlet ts = event.end.diff(day).toMillis();\n\t\t\t\t\t\tif (!gridlines[ts])\n\t\t\t\t\t\t\tgridlines[ts] = ['t_' + ts, 'e_' + ts];\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn Object.keys(gridlines).sort((a,b) => parseInt(a)-parseInt(b)).map((start, i, keys) => {\n\t\t\t\tlet end = keys[i + 1];\n\t\t\t\tif (!end) {\n\t\t\t\t\tgridlines[start].push('end');\n\t\t\t\t\treturn '[' + gridlines[start].join(' ') + ']';\n\t\t\t\t}\n\t\t\t\treturn '[' + gridlines[start].join(' ') + '] ' + (end - start) + 'fr';\n\t\t\t}).join(' ');\n\t\t}\n\t},\n\tmethods: {\n\t\tmapIntoMainAxis(target) {\n\t\t\tconst result = Array.from({length: this.axisMain.length}, () => Array());\n\n\t\t\ttarget.forEach(event => {\n\t\t\t\tconst start = event.start || this.axisMainBorders[0].plus(-1);\n\t\t\t\tconst end = event.end || this.axisMainBorders[this.axisMainBorders.length - 1].plus(1);\n\n\t\t\t\tfor (var i = 0; i < this.axisMain.length; i++) {\n\t\t\t\t\tlet laneStart = this.axisMainBorders[i * 2];\n\t\t\t\t\tlet laneEnd = this.axisMainBorders[i * 2 + 1];\n\t\t\t\t\tif (event.orig?.allDayEvent) {\n\t\t\t\t\t\tlaneStart = laneStart.startOf('day');\n\t\t\t\t\t\tlaneEnd = laneEnd.endOf('day');\n\t\t\t\t\t}\n\t\t\t\t\tif (start < laneEnd && end > laneStart) {\n\t\t\t\t\t\tconst startsHere = start >= laneStart;\n\t\t\t\t\t\tconst endsHere = end <= laneEnd;\n\t\t\t\t\t\tresult[i].push({\n\t\t\t\t\t\t\t...event,\n\t\t\t\t\t\t\tstartsHere,\n\t\t\t\t\t\t\tendsHere\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn result;\n\t\t},\n\n\t\t/* DRAG AND DROP */\n\t\tgetPageTop(el) {\n\t\t\tlet pageTop = el.offsetTop;\n\t\t\tif (el.offsetParent)\n\t\t\t\tpageTop += this.getPageTop(el.offsetParent);\n\t\t\treturn pageTop;\n\t\t},\n\t\tgetPageLeft(el) {\n\t\t\tlet pageLeft = el.offsetLeft;\n\t\t\tif (el.offsetParent)\n\t\t\t\tpageLeft += this.getPageLeft(el.offsetParent);\n\t\t\treturn pageLeft;\n\t\t},\n\t\tgetTimestampFromMouse(evt, dayTimestamp) {\n\t\t\tlet mouse, mouseFrac;\n\t\t\tif (this.flipAxis) {\n\t\t\t\tmouse = evt.pageX - this.getPageLeft(this.$refs.body) + this.$refs.main.scrollLeft;\n\t\t\t\tmouseFrac = mouse / this.$refs.body.offsetWidth;\n\t\t\t} else {\n\t\t\t\tmouse = evt.pageY - this.getPageTop(this.$refs.body) + this.$refs.main.scrollTop;\n\t\t\t\tmouseFrac = mouse / this.$refs.body.offsetHeight;\n\t\t\t}\n\n\t\t\treturn dayTimestamp + this.start + Math.floor((this.end - this.start) * mouseFrac);\n\t\t},\n\n\t\t/* SCROLLING */\n\t\tenableAutoScroll() {\n\t\t\tif (!this.resizeObserver)\n\t\t\t\tthis.resizeObserver = new ResizeObserver(this.scrollToEarliestEvent);\n\t\t\tthis.resizeObserver.observe(this.$refs.body);\n\n\t\t\tif (!this.mutationObserver)\n\t\t\t\tthis.mutationObserver = new MutationObserver(mutations => {\n\t\t\t\t\tif (mutations.some(m => m.addedNodes.length && [].some.call(m.addedNodes, el => el.matches && el.matches('.fhc-calendar-base-grid-line-event'))))\n\t\t\t\t\t\tthis.scrollToEarliestEvent();\n\t\t\t\t});\n\t\t\tthis.mutationObserver.observe(this.$refs.body, {\n\t\t\t\tsubtree: true,\n\t\t\t\tchildList: true\n\t\t\t});\n\n\t\t\tthis.scrollToEarliestEvent();\n\t\t},\n\t\tdisableAutoScroll() {\n\t\t\tif (this.resizeObserver)\n\t\t\t\tthis.resizeObserver.disconnect();\n\t\t\tthis.resizeObserver = null;\n\n\t\t\tif (this.mutationObserver)\n\t\t\t\tthis.mutationObserver.disconnect();\n\t\t\tthis.mutationObserver = null;\n\t\t},\n\t\tscrollToEarliestEvent() {\n\t\t\tconst eventElements = this.$refs.scroller.querySelectorAll('.fhc-calendar-base-grid-line-event');\n\n\t\t\tlet earliestEventOffset = [0, null];\n\t\t\tfor (var el of eventElements.values()) {\n\t\t\t\tconst top = el.offsetTop;\n\t\t\t\tif (!earliestEventOffset[1] || top < earliestEventOffset[0])\n\t\t\t\t\tearliestEventOffset = [top, el];\n\t\t\t}\n\n\t\t\tthis.userScroll = false;\n\t\t\tif (earliestEventOffset[1]) {\n\t\t\t\tearliestEventOffset[1].scrollIntoView({ behavior: \"smooth\" });\n\t\t\t} else {\n\t\t\t\tthis.$refs.scroller.scrollTo(0, 0);\n\t\t\t}\n\t\t}\n\t},\n\tbeforeUnmount() {\n\t\tthis.disableAutoScroll();\n\t},\n\ttemplate: /* html */`\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t end > date))}\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\t`\n}\n","import LineEvent from './Line/Event.js';\nimport LineBackground from './Line/Background.js';\n\n/**\n * TODO(chris):\n * Event overflow for Month mode (more-button)\n */\n\nexport default {\n\tname: \"GridLine\",\n\tcomponents: {\n\t\tLineEvent,\n\t\tLineBackground\n\t},\n\tinject: {\n\t\taxisRow: \"axisRow\"\n\t},\n\tprops: {\n\t\tdate: {\n\t\t\ttype: luxon.DateTime,\n\t\t\trequired: true\n\t\t},\n\t\tstart: {\n\t\t\ttype: luxon.DateTime,\n\t\t\trequired: true\n\t\t},\n\t\tend: {\n\t\t\ttype: luxon.DateTime,\n\t\t\trequired: true\n\t\t},\n\t\tevents: {\n\t\t\ttype: Array,\n\t\t\tdefault: []\n\t\t},\n\t\tbackgrounds: {\n\t\t\ttype: Array,\n\t\t\tdefault: []\n\t\t}\n\t},\n\tcomputed: {\n\t\teventsWithRowInfo() {\n\t\t\tconst events = [];\n\t\t\tthis.events.forEach(event => {\n\t\t\t\tconst rows = [1, -1];\n\t\t\t\tif (event.startsHere) {\n\t\t\t\t\trows[0] = 't_' + event.start.diff(this.date).toMillis();\n\t\t\t\t}\n\t\t\t\tif (event.endsHere) {\n\t\t\t\t\trows[1] = 't_' + event.end.diff(this.date).toMillis();\n\t\t\t\t}\n\n\t\t\t\tevents.push({\n\t\t\t\t\t...event,\n\t\t\t\t\trows\n\t\t\t\t});\n\t\t\t});\n\t\t\treturn events;\n\t\t}\n\t},\n\ttemplate: /* html */`\n\t\n\t\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t`\n}\n","export default {\n\tname: \"GridLineBackground\",\n\tinject: {\n\t\tflipAxis: \"flipAxis\"\n\t},\n\tprops: {\n\t\tstart: {\n\t\t\ttype: luxon.DateTime,\n\t\t\trequired: true\n\t\t},\n\t\tend: {\n\t\t\ttype: luxon.DateTime,\n\t\t\trequired: true\n\t\t},\n\t\tbackground: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t\tvalidator(value) {\n\t\t\t\tif (!value.start && !value.end)\n\t\t\t\t\treturn false;\n\t\t\t\tif (value.start && !(value.start instanceof luxon.DateTime))\n\t\t\t\t\treturn false;\n\t\t\t\tif (value.end && !(value.end instanceof luxon.DateTime))\n\t\t\t\t\treturn false;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t},\n\tcomputed: {\n\t\tstyles() {\n\t\t\tif (!this.background.endsHere && !this.background.startsHere)\n\t\t\t\treturn this.background.style;\n\n\t\t\tconst perc = (this.end.ts - this.start.ts) / 100;\n\t\t\t\n\t\t\tlet border = {};\n\t\t\tif (this.background.startsHere)\n\t\t\t\tborder[this.flipAxis ? 'left' : 'top'] = (this.background.start.diff(this.start)) / perc + '%';\n\t\t\tif (this.background.endsHere)\n\t\t\t\tborder[this.flipAxis ? 'right' : 'bottom'] = (this.end.diff(this.background.end)) / perc + '%';\n\n\t\t\tif (!this.background.style)\n\t\t\t\treturn border;\n\t\t\t\n\t\t\treturn [this.background.style, border];\n\t\t},\n\t\tclasses() {\n\t\t\tif (!this.background.endsHere && !this.background.startsHere)\n\t\t\t\treturn this.background.class;\n\t\t\t\n\t\t\tconst result = [];\n\t\t\tif (this.background.class)\n\t\t\t\tresult.push(this.background.class);\n\t\t\tif (this.background.startsHere)\n\t\t\t\tresult.push('bg-begin');\n\t\t\tif (this.background.endsHere)\n\t\t\t\tresult.push('bg-end');\n\t\t\treturn result;\n\t\t}\n\t},\n\ttemplate: /* html */`\n\t\n\t\t{{ background.label }}\n\t\n\t`\n}\n","import CalClick from '../../../../directives/Calendar/Click.js';\n\nexport default {\n\tname: \"LabelDay\",\n\tdirectives: {\n\t\tCalClick\n\t},\n\tprops: {\n\t\tdate: {\n\t\t\ttype: luxon.DateTime,\n\t\t\trequired: true\n\t\t}\n\t},\n\tcomputed: {\n\t\ttitleFull() {\n\t\t\treturn this.date.toLocaleString({day: 'numeric', month: 'long', year: 'numeric'});\n\t\t},\n\t\ttitleLong() {\n\t\t\treturn this.date.toLocaleString({day: '2-digit', month: '2-digit', year: 'numeric'});\n\t\t},\n\t\ttitleShort() {\n\t\t\treturn this.date.toLocaleString({day: 'numeric', month: 'numeric'});\n\t\t},\n\t\ttitleNarrow() {\n\t\t\treturn this.date.toLocaleString({day: 'numeric'});\n\t\t}\n\t},\n\ttemplate: /* html */`\n\t\n\t\t{{ titleFull }}\n\t\t{{ titleLong }}\n\t\t{{ titleShort }}\n\t\t{{ titleNarrow }}\n\t\n\t`\n}\n","import CalClick from '../../../../directives/Calendar/Click.js';\n\nexport default {\n\tname: \"LabelDow\",\n\tdirectives: {\n\t\tCalClick\n\t},\n\tprops: {\n\t\tdate: {\n\t\t\ttype: luxon.DateTime,\n\t\t\trequired: true\n\t\t}\n\t},\n\tcomputed: {\n\t\ttitleLong() {\n\t\t\treturn this.date.toLocaleString({weekday: 'long'});\n\t\t},\n\t\ttitleShort() {\n\t\t\treturn this.date.toLocaleString({weekday: 'short'});\n\t\t},\n\t\ttitleNarrow() {\n\t\t\treturn this.date.toLocaleString({weekday: 'narrow'});\n\t\t}\n\t},\n\ttemplate: /* html */`\n\t\n\t\t{{ titleLong }}\n\t\t{{ titleShort }}\n\t\t{{ titleNarrow }}\n\t\n\t`\n}\n","export default {\n\tname: \"LabelTime\",\n\tprops: {\n\t\tpart: {\n\t\t\ttype: [luxon.Duration, Number, Object],\n\t\t\trequired: true,\n\t\t\tvalidator(value) {\n\t\t\t\tif (value instanceof Object) {\n\t\t\t\t\tif (value instanceof luxon.Duration)\n\t\t\t\t\t\treturn true;\n\t\t\t\t\tlet start_ok = true;\n\t\t\t\t\tlet end_ok = true;\n\t\t\t\t\tif (value.start) {\n\t\t\t\t\t\tstart_ok = (\n\t\t\t\t\t\t\tvalue.start instanceof luxon.Duration\n\t\t\t\t\t\t\t|| Number.isInteger(value.start)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (value.end) {\n\t\t\t\t\t\tend_ok = (\n\t\t\t\t\t\t\tvalue.end instanceof luxon.Duration\n\t\t\t\t\t\t\t|| Number.isInteger(value.end)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn start_ok && end_ok;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t},\n\tcomputed: {\n\t\tsanitizedTimestamps() {\n\t\t\treturn this.part.start || this.part.end ? this.part : { start: this.part };\n\t\t},\n\t\tstart() {\n\t\t\tif (!this.sanitizedTimestamps.start)\n\t\t\t\treturn null;\n\t\t\treturn this.formatTime(this.sanitizedTimestamps.start);\n\t\t},\n\t\tend() {\n\t\t\tif (!this.sanitizedTimestamps.end)\n\t\t\t\treturn null;\n\t\t\treturn this.formatTime(this.sanitizedTimestamps.end);\n\t\t}\n\t},\n\tmethods: {\n\t\tformatTime(date) {\n\t\t\treturn date.toISOTime({ suppressSeconds: true });\n\t\t}\n\t},\n\ttemplate: `\n\t
    \n\t\t{{ start }}\n\t\t-\n\t\t{{ end }}\n\t
    \n\t`\n}\n","import CalendarGrid from '../../Base/Grid.js';\nimport LabelDay from '../../Base/Label/Day.js';\nimport LabelDow from '../../Base/Label/Dow.js';\nimport LabelTime from '../../Base/Label/Time.js';\n\nimport { useResizeObserver } from '../../../../composables/Responsive.js';\n\nexport default {\n\tname: \"DayView\",\n\tcomponents: {\n\t\tCalendarGrid,\n\t\tLabelDay,\n\t\tLabelDow,\n\t\tLabelTime\n\t},\n\tinject: {\n\t\ttimeGrid: \"timeGrid\",\n\t\toriginalEvents: \"events\",\n\t\ttimezone: \"timezone\"\n\t},\n\tprops: {\n\t\tday: {\n\t\t\ttype: luxon.DateTime,\n\t\t\trequired: true\n\t\t},\n\t\temptyMessage: String,\n\t\temptyMessageDetails: String\n\t},\n\temits: [\n\t\t\"requestModalOpen\",\n\t\t\"requestModalClose\"\n\t],\n\tdata() {\n\t\treturn {\n\t\t\tchosenEvent: null,\n\t\t\tgridMainRef: null\n\t\t};\n\t},\n\tcomputed: {\n\t\taxisMain() {\n\t\t\treturn [this.day.startOf('day')];\n\t\t},\n\t\taxisParts() {\n\t\t\tif (this.timeGrid) {\n\t\t\t\t// create {start, end} array\n\t\t\t\treturn this.timeGrid.map(tu => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstart: luxon.Duration.fromISOTime(tu.start),\n\t\t\t\t\t\tend: luxon.Duration.fromISOTime(tu.end)\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// create 07:00-23:00\n\t\t\t\treturn Array.from({ length: 17 }, (e, i) => luxon.Duration.fromObject({ hours: i + 7 }));\n\t\t\t}\n\t\t},\n\t\tevents() {\n\t\t\treturn this.originalEvents\n\t\t\t\t.filter(event => event.start < this.day.plus({ days: 1 }) && event.end > this.day)\n\t\t\t\t.sort((a, b) => a.start.ts - b.start.ts)\n\t\t\t\t.map(evt => evt.orig);\n\t\t},\n\t\tcurrentEvent() {\n\t\t\tif (this.chosenEvent) {\n\t\t\t\tif (this.events.find(e => e == this.chosenEvent))\n\t\t\t\t\treturn this.chosenEvent;\n\t\t\t}\n\t\t\tlet first = null;\n\t\t\tif (this.events)\n\t\t\t\tfirst = this.events.find(Boolean); // undefined => none found\n\n\t\t\tif (first && first.type == 'loading')\n\t\t\t\treturn null; // null => loading\n\n\t\t\treturn first;\n\t\t},\n\t\tisToday() {\n\t\t\treturn this.day.hasSame(luxon.DateTime.now().setZone(this.timezone), 'day');\n\t\t}\n\t},\n\twatch: {\n\t\tcompact() {\n\t\t\tif (this.compact) {\n\t\t\t\tif (this.chosenEvent) {\n\t\t\t\t\tthis.$emit('requestModalOpen', {\n\t\t\t\t\t\tevent: this.chosenEvent,\n\t\t\t\t\t\tcloseFn: () => { this.chosenEvent = null; }\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.$emit('requestModalClose');\n\t\t\t}\n\t\t}\n\t},\n\tmethods: {\n\t\thandleClickDefaults(evt) {\n\t\t\tif (evt.detail.source == 'event') {\n\t\t\t\tthis.chosenEvent = evt.detail.value;\n\t\t\t\tif (this.compact) {\n\t\t\t\t\tthis.$emit('requestModalOpen', {\n\t\t\t\t\t\tevent: this.chosenEvent,\n\t\t\t\t\t\tcloseFn: () => { this.chosenEvent = null; }\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\tsetup() {\n\t\tconst container = Vue.ref(null); // use useTemplateRef when updating to Vue 3.5\n\t\tconst { compact } = useResizeObserver(container, 750);\n\n\t\treturn {\n\t\t\tcontainer, // must be exposed or it won't be set in Vue < 3.5\n\t\t\tcompact\n\t\t};\n\t},\n\tmounted() {\n\t\tthis.gridMainRef = this.$refs.grid.$refs.main;\n\t},\n\ttemplate: /* html */`\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t{{ emptyMessage }}\n\t\t\t\n\t\t\n\t\t
    \n\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t\t

    {{ emptyMessageDetails }}

    \n\t\t\t\n\t\t\n\t\n\t`\n}\n","import BaseSlider from '../Base/Slider.js';\nimport DayView from './Day/View.js';\n\nexport default {\n\tname: \"ModeDay\",\n\tcomponents: {\n\t\tBaseSlider,\n\t\tDayView\n\t},\n\tprops: {\n\t\tcurrentDate: {\n\t\t\ttype: luxon.DateTime,\n\t\t\trequired: true\n\t\t}\n\t},\n\temits: [\n\t\t\"update:currentDate\",\n\t\t\"update:range\",\n\t\t\"click\",\n\t\t\"requestModalOpen\",\n\t\t\"requestModalClose\"\n\t],\n\tdata() {\n\t\treturn {\n\t\t\tfocusDate: this.currentDate,\n\t\t\trangeOffset: 0\n\t\t};\n\t},\n\tcomputed: {\n\t\trange() {\n\t\t\tlet first = this.focusDate.startOf('day');\n\t\t\tlet last = this.focusDate.endOf('day');\n\t\t\t\n\t\t\tif (this.rangeOffset != 0) {\n\t\t\t\tif (this.rangeOffset < 0) {\n\t\t\t\t\tfirst = first.plus({ days: this.rangeOffset });\n\t\t\t\t} else {\n\t\t\t\t\tlast = last.plus({ days: this.rangeOffset });\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn luxon.Interval.fromDateTimes(first, last);\n\t\t}\n\t},\n\twatch: {\n\t\tcurrentDate() {\n\t\t\tif (this.currentDate.locale != this.focusDate.locale) {\n\t\t\t\tthis.focusDate = this.currentDate;\n\t\t\t\tthis.$emit('update:range', this.range);\n\t\t\t} else {\n\t\t\t\tthis.rangeOffset = this.currentDate.startOf('day').diff(this.focusDate.startOf('day'), 'days').days;\n\t\t\t\tif (this.rangeOffset) {\n\t\t\t\t\tthis.$refs.view.$refs.grid.disableAutoScroll();\n\t\t\t\t\tthis.$emit('update:range', this.range);\n\t\t\t\t\tthis.$refs.slider.slidePages(this.rangeOffset).then(this.updatePage);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\tmethods: {\n\t\tprevPage() {\n\t\t\tthis.rangeOffset = this.$refs.slider.target - 1;\n\t\t\tthis.$refs.view.$refs.grid.disableAutoScroll();\n\t\t\tthis.$emit('update:range', this.range);\n\t\t\tthis.$refs.slider.prevPage().then(this.updatePage);\n\t\t},\n\t\tnextPage() {\n\t\t\tthis.rangeOffset = this.$refs.slider.target + 1;\n\t\t\tthis.$refs.view.$refs.grid.disableAutoScroll();\n\t\t\tthis.$emit('update:range', this.range);\n\t\t\tthis.$refs.slider.nextPage().then(this.updatePage);\n\t\t},\n\t\tupdatePage(days) {\n\t\t\tconst newFocusDate = this.focusDate.plus({ days });\n\t\t\tthis.focusDate = newFocusDate;\n\t\t\tthis.rangeOffset = 0;\n\t\t\tthis.$emit('update:currentDate', this.focusDate);\n\t\t\tthis.$emit('update:range', this.range);\n\t\t\tthis.$refs.view.$refs.grid.enableAutoScroll();\n\t\t},\n\t\tviewAttrs(days) {\n\t\t\tconst day = this.focusDate.plus({ days });\n\t\t\treturn { ...this.$attrs, day };\n\t\t}\n\t},\n\tmounted() {\n\t\tthis.$emit('update:range', this.range);\n\t\tthis.$refs.view.$refs.grid.enableAutoScroll();\n\t},\n\ttemplate: `\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\t`\n}\n","/**\n * size returns the key of smallest threshold array (integer converts to\n * { compact: threshold }) entry that is bigger than the current width of\n * the element or 'full' if none is found.\n * compact is true if the smallest threshold array entry is bigger than the\n * current width or false otherwise.\n *\n * @param DOMElement|VueTemplateRef\t\telement\n * @param object|array|integer\t\t\tthreshold\n * @return object\t\t\t\t\t\t{ compact:Boolean, size:String }\n */\nexport function useResizeObserver(element, threshold) {\n\t/* Result Vars */\n\tconst compact = Vue.ref(false);\n\tconst size = Vue.ref(false);\n\n\t/* Helper Vars */\n\tconst mounted = Vue.ref(false);\n\tconst elementRef = Vue.computed(() => {\n\t\tif (!Vue.isRef(element))\n\t\t\treturn element;\n\t\t\n\t\tif (!element.value)\n\t\t\treturn element.value;\n\t\t\n\t\tif (element.value.$el) // Maybe there is a better test\n\t\t\treturn element.value.$el;\n\n\t\treturn element.value;\n\t});\n\tconst compareArray = Vue.computed(() => {\n\t\tconst input = Vue.isRef(threshold) ? threshold.value : threshold;\n\t\tif (Number.isInteger(input))\n\t\t\treturn [['compact', input]];\n\t\tif (Array.isArray(input))\n\t\t\treturn input.map((value, key) => [key, value]).sort((a, b) => a[1]-b[1]);\n\t\treturn Object.entries(input).sort((a, b) => a[1]-b[1]);\n\t});\n\n\t/* Helper Functions */\n\tfunction updateResultVars() {\n\t\tconst compare = threshold.value || threshold;\n\t\tif (elementRef.value.offsetWidth === undefined)\n\t\t\treturn;\n\n\t\tconst found = compareArray.value.find(compare => compare[1] > elementRef.value.offsetWidth);\n\n\t\tsize.value = found ? found[0] : 'full';\n\t\tcompact.value = (size.value == compareArray.value[0][0]);\n\t}\n\n\t/* Observer */\n\tconst observer = new ResizeObserver(() => {\n\t\tif (elementRef.value) {\n\t\t\tupdateResultVars();\n\t\t}\n\t});\n\t/* Observer Helper Functions */\n\tfunction addObserver() {\n\t\tif (!elementRef.value)\n\t\t\treturn;\n\n\t\tupdateResultVars();\n\t\tobserver.observe(elementRef.value);\n\t\tmounted.value = true;\n\t}\n\tfunction removeObserver() {\n\t\tif (mounted.value) {\n\t\t\tobserver.disconnect()\n\t\t}\n\t}\n\n\t/* Main Logic */\n\tVue.onMounted(addObserver);\n\tVue.onUnmounted(removeObserver);\n\t\n\tVue.watchEffect(() => {\n\t\tif (elementRef.value) {\n\t\t\tremoveObserver();\n\t\t\taddObserver();\n\t\t}\n\t});\n\n\treturn { compact, size };\n}","import BaseSlider from '../Base/Slider.js';\nimport WeekView from './Week/View.js';\n\nexport default {\n\tname: \"ModeWeek\",\n\tcomponents: {\n\t\tBaseSlider,\n\t\tWeekView\n\t},\n\tprops: {\n\t\tcurrentDate: {\n\t\t\ttype: luxon.DateTime,\n\t\t\trequired: true\n\t\t}\n\t},\n\temits: [\n\t\t\"update:currentDate\",\n\t\t\"update:range\",\n\t\t\"click\",\n\t\t\"requestModalOpen\"\n\t],\n\tdata() {\n\t\treturn {\n\t\t\tfocusDate: this.currentDate,\n\t\t\trangeOffset: 0\n\t\t};\n\t},\n\tcomputed: {\n\t\trange() {\n\t\t\tlet first = this.focusDate.startOf('week', { useLocaleWeeks: true });\n\t\t\tlet last = this.focusDate.endOf('week', { useLocaleWeeks: true });\n\n\t\t\tif (this.rangeOffset != 0) {\n\t\t\t\tif (this.rangeOffset < 0) {\n\t\t\t\t\tfirst = first.plus({ weeks: this.rangeOffset });\n\t\t\t\t} else {\n\t\t\t\t\tlast = last.plus({ weeks: this.rangeOffset });\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn luxon.Interval.fromDateTimes(first, last);\n\t\t}\n\t},\n\twatch: {\n\t\tcurrentDate() {\n\t\t\tif (this.currentDate.locale != this.focusDate.locale) {\n\t\t\t\tthis.focusDate = this.currentDate;\n\t\t\t\tthis.$emit('update:range', this.range);\n\t\t\t} else {\n\t\t\t\tthis.rangeOffset = this.currentDate.startOf('week', { useLocaleWeeks: true }).diff(this.focusDate.startOf('week', { useLocaleWeeks: true }), 'weeks').weeks;\n\t\t\t\tif (this.rangeOffset) {\n\t\t\t\t\tthis.$refs.view.$refs.grid.disableAutoScroll();\n\t\t\t\t\tthis.$emit('update:range', this.range);\n\t\t\t\t\tthis.$refs.slider.slidePages(this.rangeOffset).then(this.updatePage);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\tmethods: {\n\t\tprevPage() {\n\t\t\tthis.rangeOffset = this.$refs.slider.target - 1;\n\t\t\tthis.$refs.view.$refs.grid.disableAutoScroll();\n\t\t\tthis.$emit('update:range', this.range);\n\t\t\tthis.$refs.slider.prevPage().then(this.updatePage);\n\t\t},\n\t\tnextPage() {\n\t\t\tthis.rangeOffset = this.$refs.slider.target + 1;\n\t\t\tthis.$refs.view.$refs.grid.disableAutoScroll();\n\t\t\tthis.$emit('update:range', this.range);\n\t\t\tthis.$refs.slider.nextPage().then(this.updatePage);\n\t\t},\n\t\tupdatePage(weeks) {\n\t\t\tconst newFocusDate = this.focusDate.plus({ weeks });\n\t\t\tthis.focusDate = newFocusDate;\n\t\t\tthis.rangeOffset = 0;\n\t\t\tthis.$emit('update:currentDate', this.focusDate);\n\t\t\tthis.$emit('update:range', this.range);\n\t\t\tthis.$refs.view.$refs.grid.enableAutoScroll();\n\t\t},\n\t\tviewAttrs(weeks) {\n\t\t\tconst day = this.focusDate.plus({ weeks });\n\t\t\treturn { ...this.$attrs, day };\n\t\t},\n\t\thandleClickDefaults(evt) {\n\t\t\tswitch (evt.detail.source) {\n\t\t\tcase 'day':\n\t\t\t\t// default: Set current-date\n\t\t\t\tthis.$emit('update:currentDate', evt.detail.value);\n\t\t\t\tbreak;\n\t\t\tcase 'event':\n\t\t\t\t// default: Request Modal\n\t\t\t\tthis.$emit('requestModalOpen', { event: evt.detail.value });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t},\n\tmounted() {\n\t\tthis.$emit('update:range', this.range);\n\t\tthis.$refs.view.$refs.grid.enableAutoScroll();\n\t},\n\ttemplate: `\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\t`\n}\n","import CalendarGrid from '../../Base/Grid.js';\nimport LabelDay from '../../Base/Label/Day.js';\nimport LabelDow from '../../Base/Label/Dow.js';\nimport LabelTime from '../../Base/Label/Time.js';\n\nexport default {\n\tname: \"WeekView\",\n\tcomponents: {\n\t\tCalendarGrid,\n\t\tLabelDay,\n\t\tLabelDow,\n\t\tLabelTime\n\t},\n\tinject: {\n\t\ttimeGrid: \"timeGrid\",\n\t\ttimezone: \"timezone\"\n\t},\n\tprops: {\n\t\tday: {\n\t\t\ttype: luxon.DateTime,\n\t\t\trequired: true\n\t\t},\n\t\tcollapseEmptyDays: Boolean\n\t},\n\tcomputed: {\n\t\tstart() {\n\t\t\treturn this.day.startOf('week', { useLocaleWeeks: true });\n\t\t},\n\t\taxisMain() {\n\t\t\treturn Array.from({ length: 7 }, (e, i) => this.start.plus({ days: i }));\n\t\t},\n\t\taxisParts() {\n\t\t\tif (this.timeGrid) {\n\t\t\t\t// create {start, end} array\n\t\t\t\treturn this.timeGrid.map(tu => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstart: luxon.Duration.fromISOTime(tu.start),\n\t\t\t\t\t\tend: luxon.Duration.fromISOTime(tu.end)\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// create 07:00-23:00\n\t\t\t\treturn Array.from({ length: 17 }, (e, i) => luxon.Duration.fromObject({ hours: i + 7 }));\n\t\t\t}\n\t\t}\n\t},\n\tmethods: {\n\t\tisToday(date) {\n\t\t\treturn date.hasSame(luxon.DateTime.now().setZone(this.timezone), 'day');\n\t\t}\n\t},\n\ttemplate: /* html */`\n\t
    \n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t
    \n\t`\n}\n","import BaseSlider from '../Base/Slider.js';\nimport MonthView from './Month/View.js';\n\nexport default {\n\tname: \"ModeMonth\",\n\tcomponents: {\n\t\tBaseSlider,\n\t\tMonthView\n\t},\n\tprops: {\n\t\tcurrentDate: {\n\t\t\ttype: luxon.DateTime,\n\t\t\trequired: true\n\t\t}\n\t},\n\temits: [\n\t\t\"update:currentDate\",\n\t\t\"update:range\",\n\t\t\"click\",\n\t\t\"requestModalOpen\"\n\t],\n\tdata() {\n\t\treturn {\n\t\t\tfocusDate: this.currentDate,\n\t\t\trangeOffset: 0\n\t\t};\n\t},\n\tcomputed: {\n\t\trange() {\n\t\t\tlet first = this.focusDate.startOf('month').startOf('week', { useLocaleWeeks: true });\n\t\t\tlet last = first.plus({ days: 41 }).endOf('day'); // NOTE(chris): 6 weeks minus 1 day\n\n\t\t\tif (this.rangeOffset != 0) {\n\t\t\t\tconst nextFocusDate = this.focusDate.plus({ months: this.rangeOffset});\n\t\t\t\tconst nextRangeStart = nextFocusDate.startOf('month').startOf('week', { useLocaleWeeks: true });\n\t\t\t\tif (this.rangeOffset < 0) {\n\t\t\t\t\tfirst = nextRangeStart;\n\t\t\t\t} else {\n\t\t\t\t\tlast = nextRangeStart.plus({ days: 41 }).endOf('day');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn luxon.Interval.fromDateTimes(first, last);\n\t\t}\n\t},\n\twatch: {\n\t\tcurrentDate() {\n\t\t\tif (this.currentDate.locale != this.focusDate.locale) {\n\t\t\t\tthis.focusDate = this.currentDate;\n\t\t\t\tthis.$emit('update:range', this.range);\n\t\t\t} else {\n\t\t\t\tthis.rangeOffset = this.currentDate.startOf('month').diff(this.focusDate.startOf('month'), 'months').months;\n\t\t\t\tif (this.rangeOffset) {\n\t\t\t\t\tthis.$emit('update:range', this.range);\n\t\t\t\t\tthis.$refs.slider.slidePages(this.rangeOffset).then(this.updatePage);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\tmethods: {\n\t\tprevPage() {\n\t\t\tthis.rangeOffset = this.$refs.slider.target - 1;\n\t\t\tthis.$emit('update:range', this.range);\n\t\t\tthis.$refs.slider.prevPage().then(this.updatePage);\n\t\t},\n\t\tnextPage() {\n\t\t\tthis.rangeOffset = this.$refs.slider.target + 1;\n\t\t\tthis.$emit('update:range', this.range);\n\t\t\tthis.$refs.slider.nextPage().then(this.updatePage);\n\t\t},\n\t\tupdatePage(months) {\n\t\t\tconst newFocusDate = this.focusDate.plus({ months });\n\t\t\tthis.focusDate = newFocusDate;\n\t\t\tthis.rangeOffset = 0;\n\t\t\tthis.$emit('update:currentDate', this.focusDate);\n\t\t\tthis.$emit('update:range', this.range);\n\t\t},\n\t\tviewAttrs(months) {\n\t\t\tconst day = this.focusDate.plus({ months });\n\t\t\treturn { day };\n\t\t},\n\t\thandleClickDefaults(evt) {\n\t\t\tswitch (evt.detail.source) {\n\t\t\tcase 'week':\n\t\t\t\t// default: Move to week if not in month\n\t\t\t\tlet dayInWeek = luxon.DateTime.fromObject({\n\t\t\t\t\tlocalWeekNumber: evt.detail.value.number,\n\t\t\t\t\tlocalWeekYear: evt.detail.value.year\n\t\t\t\t}, {\n\t\t\t\t\tzone: this.currentDate.zoneName,\n\t\t\t\t\tlocale: this.currentDate.locale\n\t\t\t\t});\n\n\t\t\t\tif (!this.focusDate.hasSame(dayInWeek.startOf('week', { useLocaleWeeks: true }), 'month')) {\n\t\t\t\t\tthis.$emit('update:currentDate', dayInWeek.startOf('week', { useLocaleWeeks: true }));\n\t\t\t\t} else if (!this.focusDate.hasSame(dayInWeek.endOf('week', { useLocaleWeeks: true }), 'month')) {\n\t\t\t\t\tthis.$emit('update:currentDate', dayInWeek.endOf('week', { useLocaleWeeks: true }));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'day':\n\t\t\t\t// default: Set current-date\n\t\t\t\tthis.$emit('update:currentDate', evt.detail.value);\n\t\t\t\tbreak;\n\t\t\tcase 'event':\n\t\t\t\t// default: Request Modal\n\t\t\t\tthis.$emit('requestModalOpen', { event: evt.detail.value });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t},\n\tmounted() {\n\t\tthis.$emit('update:range', this.range);\n\t},\n\ttemplate: `\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\t`\n}\n","import CalendarGrid from '../../Base/Grid.js';\nimport LabelWeek from '../../Base/Label/Week.js';\nimport LabelDow from '../../Base/Label/Dow.js';\nimport LabelDay from '../../Base/Label/Day.js';\n\nexport default {\n\tname: \"MonthView\",\n\tcomponents: {\n\t\tCalendarGrid,\n\t\tLabelWeek,\n\t\tLabelDow,\n\t\tLabelDay\n\t},\n\tprovide() {\n\t\treturn {\n\t\t\t// NOTE(chris): snap events to day\n\t\t\tevents: Vue.computed(() => {\n\t\t\t\t//const events = [];\n\t\t\t\tconst events = this.events.map(event => {\n\t\t\t\t\tconst start = event.start.startOf('day');\n\t\t\t\t\tconst end = event.end.plus({ days: 1 }).startOf('day');\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...event,\n\t\t\t\t\t\tstart,\n\t\t\t\t\t\tend\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t\tfor (var w = 5; w > -1; w--) {\n\t\t\t\t\tfor (var d = 6; d > -1; d--) {\n\t\t\t\t\t\tconst startdate = this.axisMain[w].plus(this.axisParts[d]);\n\t\t\t\t\t\tevents.unshift({\n\t\t\t\t\t\t\tstart: startdate,\n\t\t\t\t\t\t\tend: startdate.plus({ days: 1 }),\n\t\t\t\t\t\t\torig: 'header'\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn events;\n\t\t\t})\n\t\t};\n\t},\n\tinject: {\n\t\tevents: \"events\",\n\t\ttimezone: \"timezone\"\n\t},\n\tprops: {\n\t\tday: {\n\t\t\ttype: luxon.DateTime,\n\t\t\trequired: true\n\t\t}\n\t},\n\tcomputed: {\n\t\taxisMain() {\n\t\t\tconst start = this.day.startOf('month').startOf('week', { useLocaleWeeks: true });\n\t\t\treturn Array.from({ length: 6 }, (e, i) => start.plus({ weeks: i }));\n\t\t},\n\t\taxisParts() {\n\t\t\treturn Array.from({ length: 8 }, (e, i) => luxon.Duration.fromObject({ days: i }));\n\t\t}\n\t},\n\tmethods: {\n\t\tisToday(date) {\n\t\t\treturn date.hasSame(luxon.DateTime.now().setZone(this.timezone), 'day');\n\t\t}\n\t},\n\ttemplate: /* html */`\n\t
    \n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t
    \n\t`\n}\n","import CalClick from '../../../../directives/Calendar/Click.js';\n\nexport default {\n\tname: \"LabelWeek\",\n\tdirectives: {\n\t\tCalClick\n\t},\n\tprops: {\n\t\tdate: {\n\t\t\ttype: luxon.DateTime,\n\t\t\trequired: true\n\t\t}\n\t},\n\tcomputed: {\n\t\tweeks() {\n\t\t\tconst firstDay = this.date.startOf('week', { useLocaleWeeks: true });\n\t\t\tconst lastDay = this.date.endOf('week', { useLocaleWeeks: true });\n\n\t\t\tconst weeks = [\n\t\t\t\t{ number: firstDay.localWeekNumber, year: firstDay.localWeekYear },\n\t\t\t\t{ number: lastDay.localWeekNumber, year: lastDay.localWeekYear }\n\t\t\t];\n\t\t\tif (weeks[0].number == weeks[1].number)\n\t\t\t\tweeks.pop();\n\t\t\treturn weeks;\n\t\t}\n\t},\n\ttemplate: `\n\t
    \n\t\t\n\t\t\t{{ week.number }}\n\t\t\n\t
    \n\t`\n}\n","import FhcCalendar from \"./Base.js\";\n\nimport ApiLvPlan from '../../api/factory/lvPlan.js';\n\nimport { useEventLoader } from '../../composables/EventLoader.js';\n\nimport ModeDay from './Mode/Day.js';\nimport ModeWeek from './Mode/Week.js';\nimport ModeMonth from './Mode/Month.js';\n\nexport default {\n\tname: \"CalendarLvPlan\",\n\tcomponents: {\n\t\tFhcCalendar\n\t},\n\tinject: [\n\t\t\"renderers\"\n\t],\n\tprops: {\n\t\ttimezone: {\n\t\t\ttype: String,\n\t\t\trequired: true\n\t\t},\n\t\tdate: {\n\t\t\ttype: [Date, String, Number, luxon.DateTime],\n\t\t\tdefault: luxon.DateTime.local()\n\t\t},\n\t\tmode: {\n\t\t\ttype: String,\n\t\t\tdefault: 'Week'\n\t\t},\n\t\tgetPromiseFunc: {\n\t\t\ttype: Function,\n\t\t\trequired: true\n\t\t}\n\t},\n\temits: [\n\t\t\"update:date\",\n\t\t\"update:mode\",\n\t\t\"update:range\"\n\t],\n\tdata() {\n\t\treturn {\n\t\t\tmodes: {\n\t\t\t\tday: Vue.markRaw(ModeDay),\n\t\t\t\tweek: Vue.markRaw(ModeWeek),\n\t\t\t\tmonth: Vue.markRaw(ModeMonth)\n\t\t\t},\n\t\t\tmodeOptions: {\n\t\t\t\tday: {\n\t\t\t\t\temptyMessage: Vue.computed(() => this.$p.t('lehre/noLvFound')),\n\t\t\t\t\temptyMessageDetails: Vue.computed(() => this.$p.t('lehre/noLvFound'))\n\t\t\t\t},\n\t\t\t\tweek: {\n\t\t\t\t\tcollapseEmptyDays: false\n\t\t\t\t}\n\t\t\t},\n\t\t\tteachingunits: null\n\t\t};\n\t},\n\tcomputed: {\n\t\tbackgrounds() {\n\t\t\tlet now = luxon.DateTime.now().setZone(this.timezone);\n\n\t\t\tif (this.mode == 'Month')\n\t\t\t\treturn [\n\t\t\t\t\t{\n\t\t\t\t\t\tclass: 'background-past',\n\t\t\t\t\t\tend: now.startOf('day')\n\t\t\t\t\t}\n\t\t\t\t];\n\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tclass: 'background-past',\n\t\t\t\t\tend: now,\n\t\t\t\t\tlabel: now.startOf('minute').toISOTime({ suppressSeconds: true, includeOffset: false })\n\t\t\t\t}\n\t\t\t];\n\t\t}\n\t},\n\tmethods: {\n\t\teventStyle(event) {\n\t\t\tif (!event.farbe)\n\t\t\t\treturn undefined;\n\t\t\treturn '--event-bg:#' + event.farbe;\n\t\t},\n\t\tupdateRange(rangeInterval) {\n\t\t\tthis.rangeInterval = rangeInterval;\n\t\t\tthis.$emit('update:range', rangeInterval);\n\t\t}\n\t},\n\tsetup(props, context) {\n\t\tconst rangeInterval = Vue.ref(null);\n\t\t\n\t\tconst { events, lv } = useEventLoader(rangeInterval, props.getPromiseFunc);\n\n\t\tVue.watch(lv, newValue => {\n\t\t\tcontext.emit('update:lv', newValue);\n\t\t});\n\n\t\treturn {\n\t\t\trangeInterval,\n\t\t\tevents,\n\t\t\tlv\n\t\t};\n\t},\n\tcreated() {\n\t\tthis.$api\n\t\t\t.call(ApiLvPlan.getStunden())\n\t\t\t.then(res => {\n\t\t\t\treturn this.teachingunits = res.data.map(el => ({\n\t\t\t\t\tid: el.stunde,\n\t\t\t\t\tstart: el.beginn,\n\t\t\t\t\tend: el.ende\n\t\t\t\t}));\n\t\t\t});\n\t},\n\ttemplate: /* html */`\n\t $emit('update:date', newDate, newMode)\"\n\t\t@update:mode=\"(newMode, newDate) => $emit('update:mode', newMode, newDate)\"\n\t\t@update:range=\"updateRange\"\n\t>\n\t\t\n\t\t\n\t`\n}\n","// TODO(chris): load events that are longer than the interval without doubling it\n\nexport function useEventLoader(rangeInterval, getPromiseFunc) {\n\tlet loading_id = 0;\n\tconst events = Vue.ref([]);\n\tconst loadingEvents = Vue.ref([]);\n\tconst allEvents = Vue.computed(() => events.value.concat(loadingEvents.value));\n\tconst lv = Vue.ref(null);\n\tconst eventsLoaded = [];\n\n\tconst mergePromiseArr = (n, o) => {\n\t\tif (Array.isArray(n))\n\t\t\treturn o.concat(n);\n\t\treturn o.push(n), o;\n\t};\n\n\tconst markEventsLoaded = (start, end) => {\n\t\tlet result = [];\n\t\tif (!eventsLoaded.length) {\n\t\t\t// empty: add new chunk\n\t\t\teventsLoaded.push(start.ts, end.ts);\n\t\t} else {\n\t\t\tif (eventsLoaded[eventsLoaded.length-1] + 1 == start.ts) {\n\t\t\t\t// add to the end of last chunk\n\t\t\t\teventsLoaded[eventsLoaded.length-1] = end.ts;\n\t\t\t} else if (eventsLoaded[eventsLoaded.length-1] < start.ts) {\n\t\t\t\t// add new chunk after the last chunk\n\t\t\t\teventsLoaded.push(start.ts, end.ts);\n\t\t\t} else if (eventsLoaded[0] == end.ts + 1) {\n\t\t\t\t// add to the start of first chunk\n\t\t\t\teventsLoaded[0] = start.ts;\n\t\t\t} else if (eventsLoaded[0] > end.ts) {\n\t\t\t\teventsLoaded.unshift(start.ts, end.ts);\n\t\t\t} else {\n\t\t\t\tlet index = eventsLoaded.findIndex(e => e >= start.ts);\n\n\t\t\t\tif (index % 2) {\n\t\t\t\t\t// starts inside an existing chunk\n\t\t\t\t\tif (eventsLoaded[index] >= end.ts)\n\t\t\t\t\t\treturn []; // Already loaded\n\n\t\t\t\t\tlet indexIsLast = (index == eventsLoaded.length - 1);\n\n\t\t\t\t\tif (indexIsLast || eventsLoaded[index + 1] > end.ts) {\n\t\t\t\t\t\t// extend an existing chunk\n\t\t\t\t\t\t// and merge with the next if necessary\n\t\t\t\t\t\tlet nStart = eventsLoaded[index] + 1;\n\t\t\t\t\t\tstart = start.plus(nStart - start.ts);\n\t\t\t\t\t\tif (!indexIsLast && eventsLoaded[index + 1] == end.ts + 1)\n\t\t\t\t\t\t\teventsLoaded.splice(index, 2);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\teventsLoaded[index] = end.ts;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// merge exising chunks\n\t\t\t\t\t\t// and load the rest if necessary\n\t\t\t\t\t\tif (eventsLoaded[index + 2] < end.ts) {\n\t\t\t\t\t\t\tlet rStart = eventsLoaded[index + 2] + 1;\n\t\t\t\t\t\t\tresult = mergePromiseArr(markEventsLoaded(start.plus(rStart - start.ts), end), result);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet nStart = eventsLoaded[index] + 1;\n\t\t\t\t\t\tstart = start.plus(nStart - start.ts);\n\t\t\t\t\t\tlet nEnd = eventsLoaded[index + 1] - 1;\n\t\t\t\t\t\tend = end.plus(nEnd - end.ts);\n\t\t\t\t\t\teventsLoaded.splice(index, 2);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// starts between two chunks or before the first\n\t\t\t\t\tif (!index) {\n\t\t\t\t\t\t// extend the first chunk\n\t\t\t\t\t\t// and load the rest if necessary\n\t\t\t\t\t\tif (eventsLoaded[1] < end.ts) {\n\t\t\t\t\t\t\tlet rStart = eventsLoaded[1] + 1;\n\t\t\t\t\t\t\tresult = mergePromiseArr(markEventsLoaded(start.plus(rStart - start.ts), end), result);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlet nEnd = eventsLoaded[0] - 1;\n\t\t\t\t\t\tend = end.plus(nEnd - end.ts);\n\t\t\t\t\t\teventsLoaded[0] = start.ts;\n\t\t\t\t\t} else if (eventsLoaded[index] == start.ts) {\n\t\t\t\t\t\t// starts at the same position as an existing chunk\n\t\t\t\t\t\tif (eventsLoaded[index + 1] >= end.ts)\n\t\t\t\t\t\t\treturn []; // Already loaded\n\t\t\t\t\t\t// load the rest\n\t\t\t\t\t\tlet rStart = eventsLoaded[index + 1] + 1;\n\t\t\t\t\t\tresult = mergePromiseArr(markEventsLoaded(start.plus(rStart - start.ts), end), result);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// extend an existing chunk\n\t\t\t\t\t\t// and load the rest if necessary\n\t\t\t\t\t\tif (eventsLoaded[index + 1] < end.ts) {\n\t\t\t\t\t\t\tlet rStart = eventsLoaded[index + 1] + 1;\n\t\t\t\t\t\t\tresult = mergePromiseArr(markEventsLoaded(start.plus(rStart - start.ts), end), result);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlet nEnd = eventsLoaded[index] - 1;\n\t\t\t\t\t\tend = end.plus(nEnd - end.ts);\n\t\t\t\t\t\teventsLoaded[index] = start.ts;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (start.ts >= end.ts)\n\t\t\treturn result;\n\n\t\tloadingEvents.value.push({\n\t\t\tloading_id: loading_id++,\n\t\t\ttype: \"loading\",\n\t\t\tisostart: start.toISODate() + 'T' + start.toISOTime(),\n\t\t\tisoend: end.toISODate() + 'T' + end.toISOTime()\n\t\t});\n\n\t\treturn mergePromiseArr(getPromiseFunc(start, end), result);\n\t};\n\n\tVue.watchEffect(() => {\n\t\tconst range = Vue.toValue(rangeInterval);\n\t\tif (!(range instanceof luxon.Interval))\n\t\t\treturn;\n\t\tconst promises = markEventsLoaded(range.start, range.end);\n\t\tPromise\n\t\t\t.allSettled(promises)\n\t\t\t.then(results => {\n\t\t\t\tresults.forEach(res => {\n\t\t\t\t\tif (\n\t\t\t\t\t\tres.status === 'fulfilled'\n\t\t\t\t\t\t&& res.value.meta.status === \"success\"\n\t\t\t\t\t) {\n\t\t\t\t\t\tif (res.value.meta.lv)\n\t\t\t\t\t\t\tlv.value = res.value.meta.lv;\n\n\t\t\t\t\t\tevents.value = events.value.concat(res.value.data);\n\t\t\t\t\t\tloadingEvents.value = [];\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t});\n\t})\n\n\treturn { events: allEvents, lv }\n}","/**\n * Copyright (C) 2025 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tgetAuthUID() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/AuthInfo/getAuthUID'\n\t\t};\n\t},\n\tgetAuthInfo() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/AuthInfo/getAuthInfo'\n\t\t};\n\t}\n};","import FhcCalendar from \"../../Calendar/LvPlan.js\";\n\nimport ApiLvPlan from '../../../api/factory/lvPlan.js';\nimport ApiAuthinfo from '../../../api/factory/authinfo.js';\n\nexport const DEFAULT_MODE_LVPLAN = 'Week'\n\nexport default {\n\tname: 'LvPlanLehrveranstaltung',\n\tcomponents: {\n\t\tFhcCalendar\n\t},\n\tprops: {\n\t\tviewData: Object, // NOTE(chris): this is inherited from router-view\n\t\tpropsViewData: Object\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tlv: null\n\t\t};\n\t},\n\tcomputed:{\n\t\tcurrentDay() {\n\t\t\tif (!this.propsViewData?.focus_date || isNaN(new Date(this.propsViewData?.focus_date)))\n\t\t\t\treturn luxon.DateTime.now().setZone(this.viewData.timezone).toISODate();\n\t\t\treturn this.propsViewData?.focus_date;\n\t\t},\n\t\tcurrentMode() {\n\t\t\tif (!this.propsViewData?.mode || !['day', 'week', 'month'].includes(this.propsViewData?.mode.toLowerCase()))\n\t\t\t\treturn DEFAULT_MODE_LVPLAN;\n\t\t\treturn this.propsViewData?.mode;\n\t\t},\n\t\tcurrentLv() {\n\t\t\tif (isNaN(parseInt(this.propsViewData?.lv_id)))\n\t\t\t\treturn null;\n\t\t\treturn this.propsViewData.lv_id;\n\t\t},\n\t\tlvTitle() {\n\t\t\tif (this.currentLv === null)\n\t\t\t\treturn '';\n\t\t\tif (!this.lv)\n\t\t\t\treturn '';\n\n\t\t\tif (this.$p.user_language.value === 'English')\n\t\t\t\treturn this.lv.bezeichnung_english;\n\n\t\t\treturn this.lv.bezeichnung;\n\t\t}\n\t},\n\tmethods: {\n\t\thandleChangeDate(day, newMode) {\n\t\t\treturn this.handleChangeMode(newMode, day);\n\t\t},\n\t\thandleChangeMode(newMode, day) {\n\t\t\tconst mode = newMode[0].toUpperCase() + newMode.slice(1)\n\t\t\tconst focus_date = day.toISODate();\n\t\t\t\n\t\t\tthis.$router.push({\n\t\t\t\tname: \"LvPlan\",\n\t\t\t\tparams: {\n\t\t\t\t\tmode,\n\t\t\t\t\tfocus_date,\n\t\t\t\t\tlv_id: this.currentLv\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tgetPromiseFunc(start, end) {\n\t\t\treturn [\n\t\t\t\tthis.$api.call(ApiLvPlan.eventsLv(this.propsViewData.lv_id, start.toISODate(), end.toISODate())),\n\t\t\t\tthis.$api.call(ApiLvPlan.getLvPlanReservierungen(start.toISODate(), end.toISODate()))\n\t\t\t];\n\t\t}\n\t},\n\tcreated() {\n\t\tif (this.currentLv === null)\n\t\t\treturn;\n\t\tthis.$api\n\t\t\t.call(ApiLvPlan.getLv(this.propsViewData?.lv_id))\n\t\t\t.then(res => {\n\t\t\t\tthis.lv = res.data;\n\t\t\t});\n\t},\n\ttemplate: /*html*/`\n\t
    \n\t\t

    \n\t\t\t{{ $p.t('lehre/stundenplan') }}\n\t\t\t\n\t\t\t\t{{ lvTitle }}\n\t\t\t\n\t\t

    \n\t\t
    \n\t\t
    \n\t\t\t{{ $p.t('lehre/noLvFound') }}\n\t\t
    \n\t\t\n\t
    `\n};\n","import FhcCalendar from \"../../Calendar/LvPlan.js\";\n\nimport ApiLvPlan from '../../../api/factory/lvPlan.js';\nimport ApiAuthinfo from '../../../api/factory/authinfo.js';\n\nexport const DEFAULT_MODE_LVPLAN = 'Week'\n\nexport default {\n\tname: 'LvPlanPersonal',\n\tcomponents: {\n\t\tFhcCalendar\n\t},\n\tprops: {\n\t\tviewData: Object, // NOTE(chris): this is inherited from router-view\n\t\tpropsViewData: Object\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tstudiensemester_kurzbz: null,\n\t\t\tstudiensemester_start: null,\n\t\t\tstudiensemester_ende: null,\n\t\t\tuid: null,\n\t\t\tisMitarbeiter: false,\n\t\t\tisStudent: false\n\t\t};\n\t},\n\tcomputed:{\n\t\tcurrentDay() {\n\t\t\tif (!this.propsViewData?.focus_date || isNaN(new Date(this.propsViewData?.focus_date)))\n\t\t\t\treturn luxon.DateTime.now().setZone(this.viewData.timezone).toISODate();\n\t\t\treturn this.propsViewData?.focus_date;\n\t\t},\n\t\tcurrentMode() {\n\t\t\tif (!this.propsViewData?.mode || !['day', 'week', 'month'].includes(this.propsViewData?.mode.toLowerCase()))\n\t\t\t\treturn DEFAULT_MODE_LVPLAN;\n\t\t\treturn this.propsViewData?.mode;\n\t\t},\n\t\tdownloadLinks() {\n\t\t\tif (!this.studiensemester_start || !this.studiensemester_ende || !this.uid)\n\t\t\t\treturn false;\n\n\t\t\tlet type = false;\n\t\t\ttype = this.isStudent ? 'student' : type;\n\t\t\ttype = this.isMitarbeiter ? 'lektor' : type;\n\t\t\tif (false === type)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst opts = { zone: this.viewData.timezone };\n\t\t\tconst start = luxon.DateTime\n\t\t\t\t.fromISO(this.studiensemester_start, opts)\n\t\t\t\t.toUnixInteger();\n\t\t\tconst ende = luxon.DateTime\n\t\t\t\t.fromISO(this.studiensemester_ende, opts)\n\t\t\t\t.toUnixInteger();\n\n\t\t\tconst download_link = FHC_JS_DATA_STORAGE_OBJECT.app_root\n\t\t\t\t+ 'cis/private/lvplan/stpl_kalender.php'\n\t\t\t\t+ '?type=' + type\n\t\t\t\t+ '&pers_uid=' + this.uid\n\t\t\t\t+ '&begin=' + start\n\t\t\t\t+ '&ende=' + ende;\n\n\t\t\treturn [\n\t\t\t\t{ title: \"excel\", icon: 'fa-solid fa-file-excel', link: download_link + '&format=excel' },\n\t\t\t\t{ title: \"csv\", icon: 'fa-solid fa-file-csv', link: download_link + '&format=csv' },\n\t\t\t\t{ title: \"ical1\", icon: 'fa-regular fa-calendar', link: download_link + '&format=ical&version=1&target=ical' },\n\t\t\t\t{ title: \"ical2\", icon: 'fa-regular fa-calendar', link: download_link + '&format=ical&version=2&target=ical' }\n\t\t\t];\n\t\t}\n\t},\n\tmethods: {\n\t\thandleChangeDate(day, newMode) {\n\t\t\treturn this.handleChangeMode(newMode, day);\n\t\t},\n\t\thandleChangeMode(newMode, day) {\n\t\t\tconst mode = newMode[0].toUpperCase() + newMode.slice(1)\n\t\t\tconst focus_date = day.toISODate();\n\t\t\t\n\t\t\tthis.$router.push({\n\t\t\t\tname: \"MyLvPlan\",\n\t\t\t\tparams: {\n\t\t\t\t\tmode,\n\t\t\t\t\tfocus_date\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tupdateRange(rangeInterval) {\n\t\t\tthis.$api\n\t\t\t\t.call(ApiLvPlan.studiensemesterDateInterval(\n\t\t\t\t\trangeInterval.end.startOf('week').toISODate()\n\t\t\t\t))\n\t\t\t\t.then(res => {\n\t\t\t\t\tthis.studiensemester_kurzbz = res.data.studiensemester_kurzbz;\n\t\t\t\t\tthis.studiensemester_start = res.data.start;\n\t\t\t\t\tthis.studiensemester_ende = res.data.ende;\n\t\t\t\t});\n\t\t},\n\t\tgetPromiseFunc(start, end) {\n\t\t\treturn [\n\t\t\t\tthis.$api.call(ApiLvPlan.eventsPersonal(start.toISODate(), end.toISODate())),\n\t\t\t\tthis.$api.call(ApiLvPlan.getLvPlanReservierungen(start.toISODate(), end.toISODate()))\n\t\t\t];\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.$api\n\t\t\t.call(ApiAuthinfo.getAuthInfo())\n\t\t\t.then(res => {\n\t\t\t\tthis.uid = res.data.uid;\n\t\t\t\tthis.isMitarbeiter = res.data.isMitarbeiter;\n\t\t\t\tthis.isStudent = res.data.isStudent;\n\t\t\t});\n\t},\n\ttemplate: /*html*/`\n\t
    \n\t\t

    \n\t\t\t{{ $p.t('lehre/stundenplan') }}\n\t\t\t\n\t\t\t\t{{ studiensemester_kurzbz }}\n\t\t\t\n\t\t

    \n\t\t
    \n\t\t\n\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ title }}\n\t\t\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\n\t`\n};\n","import BsModal from '../../../../../Bootstrap/Modal.js';\n\nconst pruefungen = {};\n\nexport default {\n\tcomponents: {\n\t\tBsModal\n\t},\n\tmixins: [\n\t\tBsModal\n\t],\n\tprops: {\n\t\tpruefungenData: Array|null,\n\t\tbezeichnung: String,\n\t\t/*\n\t\t * NOTE(chris): \n\t\t * Hack to expose in \"emits\" declared events to $props which we use \n\t\t * in the v-bind directive to forward all events.\n\t\t * @see: https://github.com/vuejs/core/issues/3432\n\t\t*/\n\t\tonHideBsModal: Function,\n\t\tonHiddenBsModal: Function,\n\t\tonHidePreventedBsModal: Function,\n\t\tonShowBsModal: Function,\n\t\tonShownBsModal: Function\n\t},\n\tdata: () => ({\n\t\tresult: true,\n\t}),\n\tmounted() {\n\t\tthis.modal = this.$refs.modalContainer.modal;\n\t},\n\tpopup(options) {\n\t\treturn BsModal.popup.bind(this)(null, options);\n\t},\n\ttemplate: `\n\t\t\n\t\t\n\t`\n}\n","/**\n * Copyright (C) 2025 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tgetStudentenMail(lehreinheit_id) {\n\t\t// TODO(chris): seems to be called from nowhere?\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Lehre/lvStudentenMail',\n\t\t\tparams: { lehreinheit_id }\n\t\t};\n\t},\n\tgetLvInfo(studiensemester_kurzbz, lehrveranstaltung_id) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: `/api/frontend/v1/Lehre/LV/${studiensemester_kurzbz}/${lehrveranstaltung_id}`\n\t\t};\n\t},\n\tgetStudentPruefungen(lehrveranstaltung_id) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: `/api/frontend/v1/Lehre/Pruefungen/${lehrveranstaltung_id}`\n\t\t};\n\t}\n};","import ApiLehre from '../../../../../../api/factory/lehre.js';\n\nconst infos = {};\n\nexport default {\n\tprops:{\n\t\tstudien_semester: String,\n\t\tlehrveranstaltung_id: Number,\n\t},\n\tdata: () => ({\n\t\tbezeichnung: null,\n\t\tstudiengang_kuerzel: null,\n\t\tsemester: null,\n\t\torgform_kurzbz: null,\n\t\tsprache: null,\n\t\tects: null,\n\t\tincoming: null,\n\t\tresult: true,\n\t\tinfo: null,\n\t}),\n\tcomputed: {\n\t\tlektorNamesLinks(){\n\t\t\tlet lektorenLinks = {};\n\t\t\tthis.info.lektoren.forEach(e => {\n\t\t\t\tlet name = ((e.titelpre || '') + ' ' + (e.vorname || '') + ' ' + (e.nachname || '') + ' ' + (e.titelpost || '')).trim();\n\t\t\t\tlektorenLinks[name] = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + `/Cis/Profil/View/${e.uid}`;\n\t\t\t});\n\t\t\treturn lektorenLinks;\n\t\t},\n\t\tlektorNames(){\n\t\t\treturn this.info.lektoren.map((e)=>((e.titelpre || '') + ' ' + (e.vorname || '') + ' ' + (e.nachname || '') + ' ' + (e.titelpost || '')).trim());\n\t\t},\n\t\tlvLeitung() {\n\t\t\treturn this.info.lvLeitung && this.info.lvLeitung.length ? this.info.lvLeitung.map(e => ((e.titelpre || '') + ' ' + (e.vorname || '') + ' ' + (e.nachname || '') + ' ' + (e.titelpost || '')).trim()) : null;\n\t\t},\n\t\toe() {\n\t\t\treturn this.info.oe.organisationseinheittyp ? (this.info.oe.organisationseinheittyp + ' ' + this.info.oe.bezeichnung) : '';\n\t\t},\n\t\toeLeitung() {\n\t\t\tif (!this.info.oeLeitung || !this.info.oeLeitung.length)\n\t\t\t\treturn ['-'];\n\t\t\treturn this.info.oeLeitung.map(e => ((e.titelpre || '') + ' ' + (e.vorname || '') + ' ' + (e.nachname || '') + ' ' + (e.titelpost || '')).trim());\n\t\t},\n\t\tkoordinator() {\n\t\t\tif (!this.info.koordinator || !this.info.koordinator.length)\n\t\t\t\treturn null;\n\t\t\treturn this.info.koordinator.map(e => ((e.titelpre || '') + ' ' + (e.vorname || '') + ' ' + (e.nachname || '') + ' ' + (e.titelpost || '')).trim());\n\t\t},\n\t\tcurrentLang() {\n\t\t\tif (!this.info)\n\t\t\t\treturn null;\n\t\t\tif (this.info.lastLang)\n\t\t\t\treturn this.info.lastLang;\n\t\t\tif (!this.info.lvinfo)\n\t\t\t\treturn null;\n\t\t\treturn this.info.lvinfoDefaultLang && this.info.lvinfo[this.info.lvinfoDefaultLang] ? this.info.lvinfoDefaultLang : Object.keys(this.info.lvinfo).shift();\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.$api.call(ApiLehre.getLvInfo(this.studien_semester, this.lehrveranstaltung_id))\n\t\t.then(\n\t\t\tres => res.data\n\t\t).then(data =>{\n\t\t\tObject.assign(this, \n\t\t\t\t{\n\t\t\t\t\tbezeichnung : data.bezeichnung,\n\t\t\t\t\tstudiengang_kuerzel: data.studiengang_kuerzel,\n\t\t\t\t\tsemester: data.semester,\n\t\t\t\t\torgform_kurzbz: data.orgform_kurzbz,\n\t\t\t\t\tsprache: data.sprache,\n\t\t\t\t\tects: data.ects,\n\t\t\t\t\tincoming: data.incoming ?? '-',\n\t\t\t\t});\n\t\t})\n\n\t\tif (infos[this.lehrveranstaltung_id]) {\n\t\t\tthis.info = infos[this.lehrveranstaltung_id];\n\t\t} else {\n\t\t\taxios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Cis/Mylv/Info/' + this.studien_semester + '/' + this.lehrveranstaltung_id).then(res => {\n\t\t\t\tthis.info = infos[this.lehrveranstaltung_id] = res.data.retval || [];\n\t\t\t}).catch(() => this.info = {});\n\t\t}\n\t},\n\ttemplate: /*html*/`\n\t\t\t

    {{$p.t('lvinfo/lehrveranstaltungsinformationen')}}

    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    {{$p.t('lehre/lehrveranstaltung')}}{{bezeichnung}}
    {{$p.t('lehre/studiengang')}}{{studiengang_kuerzel}}
    {{$p.t('lehre/semester')}}{{semester}}
    {{$p.t('lehre/studiensemester')}}{{studien_semester}}
    {{$p.t('lehre/organisationsform')}}{{orgform_kurzbz}}
    {{$p.t('lehre/lehrbeauftragter')}}\n\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t{{name}}\n\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
    {{$p.t('lehre/lvleitung')}}\n\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t{{name}}\n\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    {{$p.t('global/sprache')}}{{sprache}}
    {{$p.t('lehre/ects')}}{{ects}}
    {{$p.t('lehre/incomingplaetze')}}{{incoming}}
    {{$p.t('lehre/organisationseinheit')}}\n\t\t\t\t\t\t\t\t{{oe}}
    \n\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t{{$p.t('global/leitung')}}: {{oeLeitung.join(', ')}}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t
    \n\t\n\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    1\" class=\"text-end\">\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    `\n}\n","const categories = {};\nconst loadingModules = {};\n\nfunction extractCategory(obj, category) {\n\treturn obj.filter(e => e.category == category).reduce((res, elem) => {\n\t\tif (!res[elem.phrase])\n\t\t\tres[elem.phrase] = elem.text;\n\t\treturn res;\n\t}, {});\n}\nfunction reloadRefs(category) {\n\twhile (loadingModules[category].length) {\n\t\tvar v = loadingModules[category].pop();\n\t\tv[0].value = getValueForLoadedPhrase(category, v[1], v[2]);\n\t\tVue.triggerRef(v[0]);\n\t\t/*Vue.unref(v);*/\n\t}\n}\nfunction loadLazy(category, val, phrase, params) {\n\t// NOTE(chris): load module if it's not loaded yet\n\tif (loadingModules[category]) {\n\t\tloadingModules[category].push([val, phrase, params]);\n\t\tif (categories[category]) // NOTE(chris): this is for safety in case the loading finished the moment before the val was pushed into the array\n\t\t\treloadRefs(category);\n\t\treturn;\n\t}\n\tloadingModules[category] = [[val, phrase, params]];\n\n\taxios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Phrasen/loadModule/' + category).then(res => {\n\t\tif (res.data.retval)\n\t\t\tcategories[category] = extractCategory(res.data.retval, category);\n\t\telse\n\t\t\tcategories[category] = {};\n\n\t\treloadRefs(category);\n\t}).catch(err => console.error(err));\n}\nfunction getValueForLoadedPhrase(category, phrase, params) {\n\tlet result = categories[category][phrase];\n\tif (!result)\n\t\treturn '<< PHRASE ' + phrase + '>>';\n\tif (params)\n\t\tresult = result.replace(/\\{([^}]*)\\}/g, (match, p1) => params[p1] === undefined ? match : params[p1]);\n\treturn result;\n}\n\n\nconst phrasen = {\n\tt_ref(category, phrase, params) {\n\t\tif (params === undefined && (\n\t\t\t(Array.isArray(category) && category.length == 2) ||\n\t\t\t(category.split && category.split('/').length == 2))\n\t\t\t) {\n\t\t\tparams = phrase;\n\t\t\t[category, phrase] = category.split ? category.split('/') : category;\n\t\t}\n\t\tif (phrase === undefined) {\n\t\t\tconsole.error('invalid input');\n\t\t\treturn '';\n\t\t}\n\t\tif (!categories[category]) {\n\t\t\t\n\t\t\tvar initialval = '';\n \t\t\tif (window.FHC_JS_PHRASES_STORAGE_OBJECT !== undefined) {\n \t\t\t\tvar tmp_category = extractCategory(FHC_JS_PHRASES_STORAGE_OBJECT, category);\n\t\t\t\tif(tmp_category[phrase] !== undefined ) {\n\t\t\t\t\tinitialval = tmp_category[phrase];\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (!categories[category] || Object.keys(categories[category]).length === 0) {\n\t\t\t\tcategories[category] = undefined;\n\t\t\t\tlet val = Vue.ref(initialval);\n\t\t\t\tloadLazy(category, val, phrase, params);\n\t\t\t\treturn val;\n\t\t\t}\n\t\t}\n\t\tvar result = getValueForLoadedPhrase(category, phrase, params);\n\t\treturn Vue.ref(result);\n\t},\n\tt(category, phrase, params) {\n\t\treturn Vue.unref(this.t_ref(category, phrase, params));\n\t}\n};\n\nexport default {\n\tdata: () => {\n\t\treturn {\n\t\t\tp: phrasen\n\t\t}\n\t}\n}\n\n// Composable (wrapper for mixin)\nexport function usePhrasen() {\n\n\tfunction t(category, phrase, params) {\n\t\treturn phrasen.t(category, phrase, params);\n\t}\n\n\treturn {\t\t\n\t\tt,\n\t}\n\n}\n","\nexport default {\n\tprops:{\n\t\tmenu:{\n\t\t\ttype:Array,\n\t\t\tdefault:null,\n\t\t},\n\t\tcontainerStyles: Array,\n\t\trowStyles: Array,\n\t\thasLvPlanEintraege: {\n\t\t\trequired:false,\n\t\t\tdefault:true,\n\t\t\ttype:Boolean,\n\t\t},\n\t},\n\tdata(){\n\t\treturn{\n\t\t\t\n\t\t}\n\t},\n\tmethods:{\n\t\tc4_disabled: function (menuItem) {\n\t\t\tif (!this.c4_link(menuItem) && !menuItem.c4_moodle_links?.length) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (menuItem.id == \"addon_fhtw_menu_lvplan_lva\" && !this.hasLvPlanEintraege){\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tc4_target: function (menuItem) {\n\t\t\tif (menuItem.c4_moodle_links?.length > 0) return null;\n\t\t\treturn menuItem.c4_target ?? null;\n\t\t},\n\t\tc4_link(menuItem) {\n\t\t\tif (!menuItem) return null;\n\t\t\tif (Array.isArray(menuItem.c4_moodle_links) && menuItem.c4_moodle_links.length) \n\t\t\t{\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn menuItem.c4_link ?? null;\n\t\t\t}\n\t\t},\n\t\tgetMenuName(menuItem) {\n\t\t\tif(menuItem.phrase) {\n\t\t\t\treturn this.$p.t(menuItem.phrase)\n\t\t\t} else {\n\t\t\t\treturn menuItem.name\n\t\t\t}\n\t\t}\n\t},\n\ttemplate:/*html*/`\n\t
    {{$p.t('lehre','lehrveranstaltungsUnavailable')}}
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t

    {{ getMenuName(menuItem) }}

    \n\t\t\t\t\t\t
    {{text}}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n\t`\n}","/**\n * Copyright (C) 2025 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tgetLvMenu(lvid, studiensemester_kurzbz) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: `/api/frontend/v1/LvMenu/getLvMenu/${lvid}/${studiensemester_kurzbz}`\n\t\t};\n\t}\n};","import BsModal from \"../../Bootstrap/Modal.js\";\nimport LvMenu from \"./LvMenu.js\";\n\nimport ApiAddons from '../../../api/factory/addons.js';\n\nexport default {\n \n props:{\n event:{\n type:Object,\n required:true,\n default:null,\n },\n\t\tstudiensemester: {\n\t\t\ttype: String,\n\t\t\trequired: false,\n\t\t\tdefault: null,\n\t\t},\n\t\ttitel: {\n\t\t\ttype: String,\n\t\t\trequired: false,\n\t\t\tdefault: null,\n\t\t},\n\t\t// prop used to preselect a menu item and skip the grid overview\n\t\tpreselectedMenu: {\n\t\t\ttype: Object,\n\t\t\trequired: false,\n\t\t\tdefault: null,\n\t\t}\n },\n data(){\n return {\n result: false,\n menu: [],\n\t\t\tisMenuSelected:false,\n\t\t\thasLvPlanEintraege: true,\n\t\t\tlvEvaluierungMessage: \"\",\n }\n },\n mixins:[BsModal],\n components:{\n BsModal,\n\t\tLvMenu,\n },\n\tinject: [\"studium_studiensemester\"],\n methods:{\n \n hiddenModal: function(){\n\t\t\tthis.isMenuSelected = false;\n },\n showModal: function(){\n\t\t\tif (!this.preselectedMenu) {\n this.$api\n\t\t\t\t\t.call(ApiAddons.getLvMenu(this.event.lehrveranstaltung_id, (this.studiensemester ?? this.event.studiensemester_kurzbz)))\n .then(res => {\n \t\t\t\t\tif (res.data) {\n \t\t\t\t\t\tthis.menu = res.data;\n \t\t\t\t\t}\n \t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis.isMenuSelected = true;\n\t\t\t}\n\n\t\t\t// check lv evaluierung info\n\t\t\tif (this.studium_studiensemester) {\n\t\t\t\tthis.$fhcApi.factory.studium.getLvEvaluierungInfo(this.studium_studiensemester, this.event.lehreinheit_id ?? this.event.lehrveranstaltung_id)\n\t\t\t\t\t.then(data => data.data)\n\t\t\t\t\t.then(res => {\n\t\t\t\t\t\tthis.lvEvaluierungMessage = res.message;\n\t\t\t\t\t})\n\t\t\t}\n\n\t\t\t// check if the lv has lvplan entries for this studiensemester\n\t\t\tif (this.studiensemester && this.event) {\n\t\t\t\treturn this.$fhcApi.factory.studium.getLvPlanForStudiensemester(this.studiensemester, this.event.lehreinheit_id ?? this.event.lehrveranstaltung_id)\n\t\t\t\t\t.then(data => data.data)\n\t\t\t\t\t.then(res => {\n\t\t\t\t\t\tif (Array.isArray(res) && res.length > 0) {\n\t\t\t\t\t\t\tthis.hasLvPlanEintraege = true;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.hasLvPlanEintraege = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t}\n\t\t\t\n },\n },\n\tmounted(){\n this.modal = this.$refs.modalContainer;\n },\n\tbeforeUnmount(){\n\t\tthis.$refs.modalContainer.hide();\n\t},\n template:/*html*/`\n \n\n\t\t\n \n \n \n\n \n `,\n};","import MylvSemesterStudiengang from \"./Semester/Studiengang.js\";\n\nexport default {\n\tcomponents: {\n\t\tMylvSemesterStudiengang\n\t},\n\tprovide() {\n\t\treturn {\n\t\t\tstudien_semester: Vue.computed(() => this.semester) \n\t\t}\n\t},\n\tprops: {\n\t\tsemester: [String, Number],\n\t\tlvs: Array\n\t},\n\tcomputed: {\n\t\tready() { return this.lvs !== null; },\n\t\tstudiengaenge() {\n\t\t\treturn [... new Map(\n\t\t\t\tthis.lvs\n\t\t\t\t.map(lv => [\n\t\t\t\t\tlv.studiengang_kz + '#' + lv.semester, \n\t\t\t\t\t{\n\t\t\t\t\t\tstudiengang_kz: lv.studiengang_kz, \n\t\t\t\t\t\tbezeichnung: lv.sg_bezeichnung,\n\t\t\t\t\t\tsg_bezeichnung_eng: lv.sg_bezeichnung_eng,\n\t\t\t\t\t\tkuerzel: lv.studiengang_kuerzel, \n\t\t\t\t\t\tsemester: lv.semester\n\t\t\t\t\t}\n\t\t\t\t])\n\t\t\t).values()].sort((a, b) => a.bezeichnung.toLowerCase() == b.bezeichnung.toLowerCase() ? a.semester > b.semester : a.bezeichnung.toLowerCase() > b.bezeichnung.toLowerCase());\n\t\t},\n\t},\n\tmethods: {\n\t\tlvsForStudiengang(studiengang) {\n\t\t\treturn this.lvs.filter(lv => lv.studiengang_kz == studiengang.studiengang_kz && lv.semester == studiengang.semester);\n\t\t}\n\t},\n\ttemplate: `
    \n\t\t\n\t
    \n\t
    \n\t\t\n\t
    `\n};","import MylvSemesterStudiengangLv from \"./Studiengang/Lv.js\";\nimport Phrasen from \"../../../../mixins/Phrasen.js\";\n\nexport default {\n\tcomponents: {\n\t\tMylvSemesterStudiengangLv\n\t},\n\tmixins: [\n\t\tPhrasen\n\t],\n\tprops: {\n\t\tbezeichnung: String,\n\t\tkuerzel: String,\n\t\tsemester: [String,Number],\n\t\tlvs: Array,\n\t\tsg_bezeichnung_eng: String\n\t},\n\tcomputed: {\n\t\tlehrveranstaltungen() {\n\t\t\treturn [... new Map(\n\t\t\t\tthis.lvs\n\t\t\t\t.map(lv => [\n\t\t\t\t\tlv.lehrveranstaltung_id, \n\t\t\t\t\tlv\n\t\t\t\t])\n\t\t\t).values()]\n\t\t}\n\t},\n\tmethods: {\n\t\tnote(lv) {\n\t\t\treturn lv.benotung ? lv.znote || lv.lvnote || null : null;\n\t\t}\n\t},\n\ttemplate: `
    \n\t\t
    \n\t\t\t

    {{$p.user_language.value === 'English' ? sg_bezeichnung_eng : bezeichnung}} - {{kuerzel}}\n\t\t\t\t{{semester}}.{{$p.t('lehre/semester')}}\n\t\t\t

    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    `\n};","import LvPruefungen from \"./Lv/Pruefungen.js\";\nimport LvInfo from \"./Lv/Info.js\";\nimport Phrasen from \"../../../../../mixins/Phrasen.js\";\nimport LvUebersicht from \"../../LvUebersicht.js\";\n\nimport ApiLehre from '../../../../../api/factory/lehre.js';\nimport ApiAddons from '../../../../../api/factory/addons.js';\n\n// TODO(chris): L10n\n\nexport default {\n\tcomponents:{\n\t\tLvUebersicht,\n\t},\n\tmixins: [\n\t\tPhrasen\n\t],\n\tinject: ['studien_semester'],\n\tprops: {\n\t\tlehrveranstaltung_id: Number,\n\t\tbezeichnung: String,\n\t\tbezeichnung_eng: String,\n\t\tmodule: String,\n\t\tfarbe: String,\n\t\tlvinfo: Boolean,\n\t\tbenotung: Boolean,\n\t\tlvnote: String,\n\t\tlvnotebez: Array,\n\t\tznote: String,\n\t\tznotebez: Array,\n\t\tstudiengang_kuerzel: String,\n\t\tsemester: [String, Number],\n\t\torgform_kurzbz: String,\n\t\tsprache: String,\n\t\tects: String,\n\t\tincoming: Number,\n\t\tpositiv: Boolean,\n\t\tnote_index: String\n\t},\n\tdata: () => {\n\t\treturn {\n\t\t\tpruefungenData: null,\n\t\t\tinfo: null,\n\t\t\tmenu: null,\n\t\t\tpreselectedMenuItem: null,\n\t\t}\n\t},\n\tcomputed: {\n\t\tgradeColor() {\n\t\t\t// early return if value is null or undefined\n\t\t\tif (this.positiv == null) return;\n\t\t\t// returns a suitable color for the given grade\n\t\t\tif (this.positiv)\n\t\t\t{\n\t\t\t\treturn 'var(--fhc-success)';\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn 'var(--fhc-danger)';\n\t\t\t}\n\t\t},\n\t\tis_organisatorische_einheit(){\n\t\t\treturn this.menu == \"organisatorische_einheit\";\n\t\t},\n\t\temptyMenu(){\n\t\t\treturn !this.menu || !Array.isArray(this.menu) || Array.isArray(this.menu) && this.menu.length == 0;\n\t\t},\n\t\tbodyStyle() {return {};\n\t\t\t/*const bodyStyle = {};\n\t\t\tif (this.farbe)\n\t\t\t\tbodyStyle['background-color'] = '#' + this.farbe;\n\t\t\treturn bodyStyle;*/\n\t\t},\n\t\tgrade() {\n\t\t\tconst languageIndex = this.$p.user_language.value === 'English' ? 1 : 0\n\t\t\tif(this.benotung && this.znotebez?.length) {\n\t\t\t\treturn this.znotebez[languageIndex]\n\t\t\t} else if(this.benotung && this.lvnotebez?.length) {\n\t\t\t\treturn this.lvnotebez[languageIndex]\n\t\t\t} else return null\n\t\t},\n\t\tLvHasPruefungenInformation(){\n\t\t\treturn this.pruefungenData && this.pruefungenData.length > 0;\n\t\t},\n\t},\n\tmethods: {\n\t\t\n\t\tfetchMenu(lehrveranstaltung_id = this.lehrveranstaltung_id, studien_semester = this.studien_semester) {\n\t\t\treturn this.$api\n\t\t\t\t.call(ApiAddons.getLvMenu(lehrveranstaltung_id, studien_semester))\n\t\t\t\t.then(res => {\n\t\t\t\t\tthis.menu = res.data;\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tthis.$fhcAlert.handleSystemError(error);\n\t\t\t\t\tthis.menu = [];\n\t\t\t\t});\n\t\t},\n\n\t\tc4_link(menuItem) {\n\t\t\tif (!menuItem) return null;\n\t\t\tif (Array.isArray(menuItem.c4_moodle_links) && menuItem.c4_moodle_links.length) {\n\t\t\t\treturn '#';\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn menuItem.c4_link ?? null;\n\t\t\t}\n\t\t},\n\t\topenLvOption(menuItem){\n\t\t\tif (menuItem.id == \"core_menu_mailanstudierende\"){\n\t\t\t\twindow.location.href = menuItem.c4_link;\n\t\t\t} else if (menuItem.id == \"core_menu_digitale_anwesenheitslisten\") {\n\t\t\t\twindow.location.href = menuItem.c4_link;\n\t\t\t} else{\n\t\t\t\tthis.preselectedMenuItem = menuItem;\n\t\t\t\tVue.nextTick(() => {\n\t\t\t\t\tthis.$refs.lvUebersicht.show();\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\topenPruefungen() {\n\t\t\t// early return if the pruefungenData is empty or not set\n\t\t\tif (!this.LvHasPruefungenInformation) return;\n\n\t\t\tLvPruefungen.popup({\n\t\t\t\tpruefungenData: this.pruefungenData, \n\t\t\t\tbezeichnung: this.bezeichnung\n\t\t\t});\n\t\t},\n\t\topenInfos() {\n\t\t\tif (!this.info) {\n\t\t\t\tthis.info = true;\n\t\t\t\t// TODO(chris): load all this params on ajax?\n\t\t\t\tLvInfo.popup({\n\t\t\t\t\tlehrveranstaltung_id: this.lehrveranstaltung_id, \n\t\t\t\t\tbezeichnung: this.bezeichnung,\n\t\t\t\t\tbezeichnung_eng: this.bezeichnung_eng,\n\t\t\t\t\tstudiengang_kuerzel: this.studiengang_kuerzel,\n\t\t\t\t\tsemester: this.semester,\n\t\t\t\t\tstudien_semester: this.studien_semester,\n\t\t\t\t\torgform_kurzbz: this.orgform_kurzbz,\n\t\t\t\t\tsprache: this.sprache,\n\t\t\t\t\tects: this.ects,\n\t\t\t\t\tincoming: this.incoming\n\t\t\t\t}).then(() => this.info = false).catch(() => this.info = false);\n\t\t\t}\n\t\t}\n\t},\n\twatch:{\n\t\tstudien_semester(newValue){\n\t\t\tthis.fetchMenu(this.lehrveranstaltung_id, newValue);\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.$api\n\t\t\t.call(ApiLehre.getStudentPruefungen(this.lehrveranstaltung_id))\n\t\t\t.then(res => res.data)\n\t\t\t.then(pruefungen => {\n\t\t\t\tthis.pruefungenData = pruefungen;\n\t\t\t}); \n\t},\n\tmounted() {\n\t\tthis.fetchMenu(this.lehrveranstaltung_id, this.studien_semester);\n\t},\n\ttemplate: /*html*/`
    \n\t\t\n\n\t\t
    \n\t\t\t\n\t\t\t
    {{ $p.t('lehre/organisationseinheit') }}:
    \n\t\t\t
    {{$p.user_language.value === 'English' ? bezeichnung_eng : bezeichnung}}
    \n\t\t
    \n\t\t
    \n\t\t\t\n\t\t\t\n\t\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t
    \n\t
    `\n};","import MylvSemester from \"./Semester.js\";\nimport Phrasen from \"../../../mixins/Phrasen.js\";\n\n// TODO(chris): phrase: global/studiensemester_auswaehlen\n// TODO(chris): phrase: next & prev +aria-label\n\nexport default {\n\tcomponents: {\n\t\tMylvSemester\n\t},\n\tmixins: [\n\t\tPhrasen\n\t],\n\tdata: () => {\n\t\treturn {\n\t\t\tfirstLoad: true,\n\t\t\tstudiensemester: null,\n\t\t\tlvs: {},\n\t\t\tcurrentSemester: null\n\t\t};\n\t},\n\tcomputed: {\n\t\tready() {\n\t\t\treturn this.studiensemester !== null && (!this.firstLoad || this.current.lvs !== null);\n\t\t},\n\t\tcurrent() {\n\t\t\tif (this.currentSemester === null)\n\t\t\t\treturn { semester: null, lvs: [] };\n\t\t\tif (this.lvs[this.currentSemester] === undefined) {\n\t\t\t\tthis.lvs[this.currentSemester] = {\n\t\t\t\t\tsemester: this.currentSemester, \n\t\t\t\t\tlvs: null\n\t\t\t\t};\n\t\t\t\taxios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Cis/Mylv/Lvs/' + this.currentSemester).then(res => {\n\t\t\t\t\tthis.lvs[this.currentSemester].lvs = res.data.retval || [];\n\t\t\t\t\tthis.firstLoad = false;\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn this.lvs[this.currentSemester];\n\t\t},\n\t\tnearestSem() {\n\t\t\tlet now = Date.now();\n\t\t\tlet nearestSem = null;\n\t\t\tlet nearestSemDiff = 0;\n\t\t\tthis.studiensemester.forEach(sem => {\n\t\t\t\tlet start = new Date(sem.start);\n\t\t\t\tlet end = new Date(sem.ende);\n\t\t\t\tif (now >= start && now <= end) {\n\t\t\t\t\tnearestSem = sem.studiensemester_kurzbz;\n\t\t\t\t\tnearestSemDiff = 0;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tlet diff = Math.min(Math.abs(now - start), Math.abs(now - end));\n\t\t\t\tif (nearestSem === null || diff < nearestSemDiff) {\n\t\t\t\t\tnearestSem = sem.studiensemester_kurzbz;\n\t\t\t\t\tnearestSemDiff = diff;\n\t\t\t\t}\n\n\t\t\t});\n\t\t\treturn nearestSem;\n\t\t},\n\t\tcurrentIsFirst() {\n\t\t\treturn this.studiensemester[0].studiensemester_kurzbz == this.currentSemester;\n\t\t},\n\t\tcurrentIsLast() {\n\t\t\treturn this.studiensemester[this.studiensemester.length-1].studiensemester_kurzbz == this.currentSemester;\n\t\t}\n\t},\n\tmethods: {\n\t\tprevSem() {\n\t\t\tthis.$refs.studiensemester.selectedIndex--;\n\t\t\tthis.$refs.studiensemester.dispatchEvent(new Event('change', { bubbles: true }));\n\t\t},\n\t\tnextSem() {\n\t\t\tthis.$refs.studiensemester.selectedIndex++;\n\t\t\tthis.$refs.studiensemester.dispatchEvent(new Event('change', { bubbles: true }));\n\t\t},\n\t\tupdateRouter(val) {\n\t\t\tthis.$router.push(`/Cis/MyLv/${val}`);\n\t\t}\n\t},\n\tcreated() {\n\t\taxios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Cis/Mylv/Studiensemester').then(res => {\n\t\t\tthis.studiensemester = res.data.retval || [];\n\t\t\tconst routerStudiensemester = this.$route.params.studiensemester;\n\t\t\tif (routerStudiensemester && this.studiensemester.filter(s => s.studiensemester_kurzbz == routerStudiensemester).length)\n\t\t\t\tthis.currentSemester = routerStudiensemester;\n\t\t\telse\n\t\t\t\tthis.currentSemester = this.nearestSem;\n\t\t});\n\t},\n\tbeforeRouteUpdate(to, from, next){\n\t\tif (to.params.studiensemester && this.studiensemester.filter(s => s.studiensemester_kurzbz == to.params.studiensemester).length && to.params.studiensemester != this.currentSemester)\n\t\t\tthis.currentSemester = to.params.studiensemester;\n\t\tnext();\n\n\t},\n\ttemplate: `\n\n\t

    {{$p.t('lehre/myLV')}}

    \n\t
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t\t
    \n\t\t\t{{$p.t('lehre/noLvFound')}}\n\t\t
    \n\t\t\n\t
    \n\t
    \n\t\t\n\t
    `\n};","/**\n * Copyright (C) 2022 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n/**\n *\n */\nexport const CoreFetchCmpt = {\n\temits: ['dataFetched'], // this component can emit the event dataFetched that it is catched by this component itself\n\tprops: {\n\t\trefresh: { // to refresh this component\n\t\t\ttype: Boolean\n\t\t},\n\t\tapiFunction: { // the function to call, must return a Promise\n\t\t\trequired: true,\n\t\t\ttype: Function\n\t\t},\n\t\tapiFunctionParameters: {} // parameters for the apiFunction, type mixed, optional\n\t},\n\twatch: {\n\t\t/**\n\t\t * If the refresh property is changed then call fetchData\n\t\t */\n\t\trefresh: function (newValue, oldValue) {\n\t\t\tthis.fetchData();\n\t\t}\n\t},\n\tdata: function() {\n\t\treturn {\n\t\t\tloading: false, // if in loading or not\n\t\t\terror: false, // if an error occurred while loading data\n\t\t\terrorMessage: null // the error message\n\t\t};\n\t},\n\tcreated: function() {\n\t\tthis.fetchData();\n\t},\n\tmethods: {\n\t\t/**\n\t\t *\n\t\t */\n\t\tfetchData: function() {\n\t\t\tthis.loading = true; // loader started\n\t\t\tthis.error = false;\n\t\t\tthis.errorMessage = null;\n\n\t\t\t// Checks if the apifunction is a callable function\n\t\t\tif (typeof this.apiFunction == \"function\")\n\t\t\t{\n\t\t\t\t// Call the function stored in apiFunction\n\t \t\tlet apiFunctionResult = this.apiFunction(this.apiFunctionParameters);\n\n\t\t\t\t// It is expected that the function returns a Promise\n\t\t\t\tif (apiFunctionResult instanceof Promise)\n\t\t\t\t{\n\t\t\t\t\tapiFunctionResult\n\t\t\t\t\t\t.then(this.successHandler) // on success\n\t\t\t\t\t\t.catch(this.errorHandler) // on error\n\t\t\t\t\t\t.finally(this.finallyHandler); // finally in any case\n\t\t\t\t}\n\t\t\t\telse // otherwise display an error\n\t\t\t\t{\n\t\t\t\t\tthis.setError(\"The called apiFunction does not return a Promise\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse // otherwise display an error\n\t\t\t{\n\t\t\t\tthis.setError(\"Property apiFunction is not a function\");\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\tsetError: function(errorMessage) {\n\t\t\tthis.loading = false; // loading ended\n\t\t\tthis.error = true; // error occurred\n\t\t\tthis.errorMessage = errorMessage; // save the error message\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\tsuccessHandler: function(response) {\n\t\t\tthis.$emit('dataFetched', response ? response.data : undefined); // trigger the event dataFetched\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\terrorHandler: function(error) {\n\t\t\tif (error.response?.data?.retval)\n\t\t\t\tthis.setError(error.response.data.retval);\n\t\t\telse if (error.data?.message)\n\t\t\t\tthis.setError(error.data.message);\n\t\t\telse\n\t\t\t\tthis.setError(error.message);\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\tfinallyHandler: function() {\n\t\t\tthis.loading = false; // loading ended\n\t\t}\n\t},\n\ttemplate: `\n\t\t\n\t\t\t
    Loading...
    \n\t\t
    \n\t\t\n\t\t\t
    {{ errorMessage }}
    \n\t\t
    \n\t\t\n\t`\n};\n","/**\n * Copyright (C) 2022 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nconst FILTER_COMPONENT_NEW_FILTER = 'Filter Component New Filter';\n\n/**\n *\n */\nexport default {\n\tprops: {\n\t\tfilters: {\n\t\t\ttype: Array,\n\t\t\tdefault: []\n\t\t},\n\t\tcolumns: {\n\t\t\ttype: Array,\n\t\t\tdefault: []\n\t\t},\n\t\tfields: {\n\t\t\ttype: Array,\n\t\t\tdefault: []\n\t\t}\n\t},\n\temits: {\n\t\tswitchFilter: ['filterId'],\n\t\tapplyFilterConfig: ['filterFields'],\n\t\tsaveCustomFilter: ['customFilterName']\n\t},\n\tdata: function() {\n\t\treturn {\n\t\t\tcurrentFields: []\n\t\t};\n\t},\n\tcomputed: {\n\t\ttypes() {\n\t\t\treturn this.columns.reduce((a,c) => {\n\t\t\t\tlet type = c.type.toLowerCase();\n\t\t\t\tif (type.indexOf('int') >= 0)\n\t\t\t\t\ta[c.name] = 'Numeric';\n\t\t\t\telse if (\n\t\t\t\t\ttype.indexOf('varchar') >= 0 || \n\t\t\t\t\ttype.indexOf('text') >= 0 || \n\t\t\t\t\ttype.indexOf('bpchar') >= 0\n\t\t\t\t)\n\t\t\t\t\ta[c.name] = 'Text';\n\t\t\t\telse if (\n\t\t\t\t\ttype.indexOf('timestamp') >= 0 || \n\t\t\t\t\ttype.indexOf('date') >= 0\n\t\t\t\t)\n\t\t\t\t\ta[c.name] = 'Date';\n\t\t\t\telse\n\t\t\t\t\ta[c.name] = '';\n\t\t\t\treturn a;\n\t\t\t}, {});\n\t\t}\n\t},\n\twatch: {\n\t\tfields(n) {\n\t\t\tthis.currentFields = n;\n\t\t}\n\t},\n\tmethods: {\n\t\tswitchFilter(evt) {\n\t\t\tthis.$emit('switchFilter', evt.currentTarget.value);\n\t\t},\n\t\tapplyFilterConfig() {\n\t\t\tconst filteredFields = this.currentFields.filter(el => el.name != FILTER_COMPONENT_NEW_FILTER);\n\t\t\tif (filteredFields.filter(el => el.condition == \"\").length)\n\t\t\t\talert(\"Please fill all the filter options\");\n\t\t\telse\n\t\t\t\tthis.$emit('applyFilterConfig', filteredFields);\n\t\t},\n\t\taddField(evt) {\n\t\t\tthis.currentFields.push({\n\t\t\t\tname: FILTER_COMPONENT_NEW_FILTER\n\t\t\t});\n\t\t},\n\t\tremoveField(index) {\n\t\t\tthis.currentFields.splice(index, 1);\n\t\t}\n\t},\n\ttemplate: `\n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t
    \n\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\tFilter {{ index + 1 }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n\t`\n};\n\n","/**\n * Copyright (C) 2022 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\n/**\n *\n */\nexport default {\n\tprops: {\n\t\tfields: Array,\n\t\tselected: {\n\t\t\ttype: Array,\n\t\t\tdefault: []\n\t\t},\n\t\tnames: {\n\t\t\ttype: Object,\n\t\t\tdefault: {}\n\t\t}\n\t},\n\temits: {\n\t\thide: ['fieldName'],\n\t\tshow: ['fieldName']\n\t},\n\tdata: function() {\n\t\treturn {\n\t\t\tselectedFields: []\n\t\t};\n\t},\n\twatch: {\n\t\tselected(n) {\n\t\t\tthis.selectedFields = n;\n\t\t}\n\t},\n\tmethods: {\n\t\ttoggle(field) {\n\t\t\tif (this.selectedFields.indexOf(field) != -1)\n\t\t\t{\n\t\t\t\tthis.selectedFields.splice(this.selectedFields.indexOf(field), 1);\n\t\t\t\tthis.$emit('hide', field);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis.selectedFields.push(field);\n\t\t\t\tthis.$emit('show', field);\n\t\t\t}\n\t\t}\n\t},\n\ttemplate: `\n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\t{{ names[fieldToDisplay] || fieldToDisplay }}\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t\n\t`\n};\n\n","/**\n * Copyright (C) 2022 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nconst DEFAULT_ICONS = {\n\tjsonLines: 'fa-file-lines',\n\txlsx: 'fa-file-excel',\n\tpdf: 'fa-file-pdf',\n\thtml: 'fa-file-code',\n\tjson: 'fa-file',\n\tcsv: 'fa-file-csv'\n};\nconst DEFAULT_LABELS = {\n\tjsonLines: 'Download as JSONLINES',\n\txlsx: 'Download as XLSX',\n\tpdf: 'Download as PDF',\n\thtml: 'Download as HTML',\n\tjson: 'Download as JSON',\n\tcsv: 'Download as CSV '\n};\n\n\n/**\n *\n */\nexport default {\n\tprops: {\n\t\ttabulator: Object,\n\t\tconfig: {\n\t\t\ttype: [Boolean, String, Function, Array, Object],\n\t\t\tdefault: false\n\t\t},\n\t\ticonClass: [String, Array, Object]\n\t},\n\tcomputed: {\n\t\tcurrentConfig() {\n\t\t\tif (!this.config)\n\t\t\t\treturn false;\n\n\t\t\tlet config = this.config;\n\n\t\t\tif (config instanceof Function)\n\t\t\t\treturn [config];\n\n\t\t\tif (config === null)\n\t\t\t\treturn [];\n\n\t\t\tif (this.config === true)\n\t\t\t\tconfig = ['csv'];\n\n\t\t\tif (Object.prototype.toString.call(config) === \"[object String]\")\n\t\t\t\tconfig = config.split(',');\n\n\t\t\tif (typeof config === 'object' && !Array.isArray(config)) {\n\t\t\t\tlet newConfig = [];\n\t\t\t\tfor (var k in config) {\n\t\t\t\t\tvar v = config[k], type;\n\t\t\t\t\t\n\t\t\t\t\tif (!v)\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\n\t\t\t\t\tif (Object.prototype.toString.call(v) === \"[object String]\") {\n\t\t\t\t\t\ttype = this.stringToFileFormatter(v);\n\t\t\t\t\t\tif (type !== null) {\n\t\t\t\t\t\t\tnewConfig.push({\n\t\t\t\t\t\t\t\ticon: 'fa-solid ' + DEFAULT_ICONS[type],\n\t\t\t\t\t\t\t\tlabel: v === k ? DEFAULT_LABELS[type] : k,\n\t\t\t\t\t\t\t\tformatter: type\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttype = this.stringToFileFormatter(k);\n\t\t\t\t\t\t\tif(type !== null) {\n\t\t\t\t\t\t\t\tnewConfig.push({\n\t\t\t\t\t\t\t\t\ticon: 'fa-solid ' + DEFAULT_ICONS[type],\n\t\t\t\t\t\t\t\t\tlabel: v,\n\t\t\t\t\t\t\t\t\tformatter: type\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\talert('neither ' + k + ' nor ' + v + ' are supported download file types');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (typeof v === 'object' && !Array.isArray(v)) {\n\t\t\t\t\t\ttype = this.stringToFileFormatter(k);\n\t\t\t\t\t\tif (type !== null) {\n\t\t\t\t\t\t\tif (v.formatter === undefined)\n\t\t\t\t\t\t\t\tv.formatter = type;\n\t\t\t\t\t\t\tif (v.label === undefined)\n\t\t\t\t\t\t\t\tv.label = DEFAULT_LABELS[type];\n\t\t\t\t\t\t\tif (v.icon === undefined)\n\t\t\t\t\t\t\t\tv.icon = DEFAULT_ICONS[type];\n\t\t\t\t\t\t\tnewConfig.push(v);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (v.label === undefined)\n\t\t\t\t\t\t\t\tv.label = k;\n\t\t\t\t\t\t\tnewConfig.push(v);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttype = this.stringToFileFormatter(k);\n\t\t\t\t\t\tif (type !== null) {\n\t\t\t\t\t\t\tnewConfig.push({\n\t\t\t\t\t\t\t\ticon: 'fa-solid ' + DEFAULT_ICONS[type],\n\t\t\t\t\t\t\t\tlabel: DEFAULT_LABELS[type],\n\t\t\t\t\t\t\t\tformatter: type\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\talert(k + ' is not a supported download file type');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconfig = newConfig;\n\t\t\t}\n\n\t\t\tif (Array.isArray(config))\n\t\t\t{\n\t\t\t\tconfig = config.map(el => {\n\t\t\t\t\tif (Object.prototype.toString.call(el) === \"[object String]\") {\n\t\t\t\t\t\tlet formatter = this.stringToFileFormatter(el);\n\t\t\t\t\t\tif (formatter === null)\n\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\ticon: 'fa-solid ' + DEFAULT_ICONS[formatter],\n\t\t\t\t\t\t\tlabel: DEFAULT_LABELS[formatter],\n\t\t\t\t\t\t\tformatter\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (el instanceof Function)\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tformatter: el\n\t\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (typeof el === 'object' && !Array.isArray(el) && el !== null) {\n\t\t\t\t\t\tif (el.formatter instanceof Function)\n\t\t\t\t\t\t\treturn el;\n\t\t\t\t\t\tif (this.validateFileFormatter(el.formatter))\n\t\t\t\t\t\t\treturn el;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\treturn null;\n\t\t\t\t}).filter(el => el !== null);\n\n\t\t\t\tif (config.length < 2)\n\t\t\t\t\treturn config;\n\n\t\t\t\tif (config.filter(el => el.label || el.icon).length == config.length)\n\t\t\t\t\treturn config;\n\n\t\t\t\talert('Config not valid');\n\t\t\t}\n\n\t\t\treturn [];\n\t\t}\n\t},\n\tmethods: {\n\t\tstringToFileFormatter(input) {\n\t\t\tlet lcInput = input.toLowerCase();\n\t\t\t\n\t\t\tif (lcInput == 'jsonlines')\n\t\t\t\treturn 'jsonLines';\n\t\t\t\n\t\t\tif (['xlsx', 'pdf', 'html', 'json', 'csv'].includes(lcInput))\n\t\t\t\treturn lcInput;\n\n\t\t\treturn null;\n\t\t},\n\t\tvalidateFileFormatter(input) {\n\t\t\tlet formatter = this.stringToFileFormatter(input);\n\t\t\tif (!formatter) {\n\t\t\t\talert(input + ' is not a supported file formatter');\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (formatter == 'xlsx') {\n\t\t\t\tif (!window.XLSX) {\n\t\t\t\t\talert('XLSX Library not loaded');\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (formatter == 'pdf') {\n\t\t\t\tif (!window.jspdf) {\n\t\t\t\t\talert('jsPDF Library not loaded');\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tvar doc = new jspdf.jsPDF({});\n\t\t\t\tif (!doc.autoTable) {\n\t\t\t\t\talert('jsPDF-AutoTable Plugin not loaded');\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t\tdownload(config) {\n\t\t\tthis.tabulator.download(config.formatter, config.file, config.options)\n\t\t}\n\t},\n\ttemplate: `\n\t\n\t`\n};\n\n","const elementDataMap = new WeakMap();\n\nexport default {\n\tmounted(el, binding) {\n\t\tlet open = false;\n\t\telementDataMap.set(el, evt => {\n\t\t\tif (!open)\n\t\t\t\treturn;\n\n\t\t\tif (el.contains(evt.target))\n\t\t\t\treturn;\n\n\t\t\tconst collapse = bootstrap.Collapse.getInstance(el)\n\t\t\tif (collapse)\n\t\t\t\tcollapse.hide();\n\t\t});\n\t\tel.addEventListener('shown.bs.collapse', () => {\n\t\t\topen = true;\n\t\t});\n\t\tel.addEventListener('hide.bs.collapse', () => {\n\t\t\topen = false;\n\t\t});\n\t\tdocument.addEventListener('click', elementDataMap.get(el), true);\n\t},\n\tbeforeUnmount(el, binding) {\n\t\tdocument.removeEventListener('click', elementDataMap.get(el));\n\t\tdelete el.collapsibleAutoHideFunc;\n\t}\n}","/**\n * This may need changes if Tabulator gets updated!\n *\n * Current working Version: 5.5.2\n * \n * This is a copy of the fitDataStretch function. The only difference\n * is the check for frozen columns on line 22.\n */\n\nexport default window.Tabulator?.extendModule(\"layout\", \"modes\", {\n\tfitDataStretchFrozen(columns, forced) {\n\t\tvar colsWidth = 0,\n\t\ttableWidth = this.table.rowManager.element.clientWidth,\n\t\tgap = 0,\n\t\tlastCol = false;\n\n\t\tcolumns.forEach((column, i) => {\n\t\t\tif (!column.widthFixed) {\n\t\t\t\tcolumn.reinitializeWidth();\n\t\t\t}\n\n\t\t\tif (this.table.options.responsiveLayout ? column.modules.responsive.visible : column.visible && !column.definition.frozen) {\n\t\t\t\tlastCol = column;\n\t\t\t}\n\n\t\t\tif (column.visible) {\n\t\t\t\tcolsWidth += column.getWidth();\n\t\t\t}\n\t\t});\n\n\t\tif (lastCol){\n\t\t\tgap = tableWidth - colsWidth + lastCol.getWidth();\n\n\t\t\tif (this.table.options.responsiveLayout && this.table.modExists(\"responsiveLayout\", true)) {\n\t\t\t\tlastCol.setWidth(0);\n\t\t\t\tthis.table.modules.responsiveLayout.update();\n\t\t\t}\n\n\t\t\tif (gap > 0) {\n\t\t\t\tlastCol.setWidth(gap);\n\t\t\t} else {\n\t\t\t\tlastCol.reinitializeWidth();\n\t\t\t}\n\t\t} else {\n\t\t\tif (this.table.options.responsiveLayout && this.table.modExists(\"responsiveLayout\", true)) {\n\t\t\t\tthis.table.modules.responsiveLayout.update();\n\t\t\t}\n\t\t}\n\t}\n});\n","/**\n * Copyright (C) 2025 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tsaveCustomFilter(wsParams) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/filter/saveCustomFilter',\n\t\t\tparams: {\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tcustomFilterName: wsParams.customFilterName\n\t\t\t}\n\t\t};\n\t},\n\tremoveCustomFilter(wsParams) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/filter/removeCustomFilter',\n\t\t\tparams: {\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterId: wsParams.filterId\n\t\t\t}\n\t\t};\n\t},\n\tapplyFilterFields(wsParams) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/filter/applyFilterFields',\n\t\t\tparams: {\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterFields: wsParams.filterFields\n\t\t\t}\n\t\t};\n\t},\n\taddFilterField(wsParams) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/filter/addFilterField',\n\t\t\tparams: {\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterField: wsParams.filterField\n\t\t\t}\n\t\t};\n\t},\n\tremoveFilterField(wsParams) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/filter/removeFilterField',\n\t\t\tparams: {\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterField: wsParams.filterField\n\t\t\t}\n\t\t};\n\t},\n\tgetFilterById(wsParams) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/filter/getFilter',\n\t\t\tparams: {\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType,\n\t\t\t\tfilterId: wsParams.filterId\n\t\t\t}\n\t\t};\n\t},\n\tgetFilter(wsParams) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/filter/getFilter',\n\t\t\tparams: {\n\t\t\t\tfilterUniqueId: wsParams.filterUniqueId,\n\t\t\t\tfilterType: wsParams.filterType\n\t\t\t}\n\t\t};\n\t}\n};","/**\n * Copyright (C) 2022 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nimport {CoreFetchCmpt} from '../../components/Fetch.js';\nimport FilterConfig from './Filter/Config.js';\nimport FilterColumns from './Filter/Columns.js';\nimport TableDownload from './Table/Download.js';\nimport collapseAutoClose from '../../directives/collapseAutoClose.js';\n\nimport moduleLayoutFitDataStretchFrozen from '../../tabulator/layouts/fitDataStretchFrozen.js';\n\nimport ApiFilter from '../../api/factory/filter.js';\n\n//\nconst FILTER_COMPONENT_NEW_FILTER = 'Filter Component New Filter';\nconst FILTER_COMPONENT_NEW_FILTER_TYPE = 'Filter Component New Filter Type';\n\nvar _uuid = 0;\n\n/**\n *\n */\nexport const CoreFilterCmpt = {\n\tcomponents: {\n\t\tCoreFetchCmpt,\n\t\tFilterConfig,\n\t\tFilterColumns,\n\t\tTableDownload\n\t},\n\tdirectives: {\n\t\tcollapseAutoClose\n\t},\n\temits: [\n\t\t'nwNewEntry',\n\t\t'click:new',\n\t\t'tableBuilt',\n\t\t'uuidDefined'\n\t],\n\tprops: {\n\t\tonNwNewEntry: Function, // NOTE(chris): Hack to get the nwNewEntry listener into $props\n\t\ttitle: String,\n\t\tdescription: String,\n\t\tsideMenu: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true\n\t\t},\n\t\tfilterType: {\n\t\t\ttype: String\n\t\t},\n\t\ttabulatorOptions: Object,\n\t\ttabulatorEvents: Array,\n\t\ttableOnly: Boolean,\n\t\tnoColumnFilter:Boolean,\n\t\treload: Boolean,\n\t\treloadBtnInfotext: String,\n\t\tdownload: {\n\t\t\ttype: [Boolean, String, Function, Array, Object],\n\t\t\tdefault: false\n\t\t},\n\t\tnewBtnShow: Boolean,\n\t\tnewBtnClass: [String, Array, Object],\n\t\tnewBtnDisabled: Boolean,\n\t\tnewBtnLabel: String,\n\t\tuniqueId: String,\n\n\t\tidField: String,\n\t\tparentIdField: String,\n\t\tcountOnly: Boolean,\n\t\tuseSelectionSpan: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true\n\t\t}\n\t},\n\tdata: function() {\n\t\treturn {\n\t\t\tuuid: 0,\n\t\t\t// FilterCmpt properties\n\t\t\tfilterName: null,\n\t\t\tfilterActive: false,\n\t\t\tfields: null,\n\t\t\tdataset: null,\n\t\t\tdatasetMetadata: null,\n\t\t\tselectedFields: null,\n\t\t\tfilterFields: null,\n\n\t\t\tavailableFilters: null,\n\t\t\tselectedFilter: null,\n\n\t\t\t// FetchCmpt binded properties\n\t\t\tfetchCmptRefresh: false,\n\t\t\tfetchCmptApiFunction: null,\n\t\t\tfetchCmptApiFunctionParams: null,\n\t\t\tfetchCmptDataFetched: null,\n\n\t\t\tfetchResult: null,\n\n\t\t\ttabulator: null,\n\t\t\ttableBuilt: false,\n\t\t\ttabulatorHasSelector: false,\n\t\t\tselectedData: [],\n\t\t\tpersistence: {\n\t\t\t\tsort: true,\n\t\t\t\tcolumns: true,\n\t\t\t\tfilter: false,\n\t\t\t\theaderFilter: false,\n\t\t\t\tgroup: false,\n\t\t\t\tpage: false,\n\t\t\t}\n\t\t};\n\t},\n\tcomputed: {\n\t\tnotSelectedFields() {\n\t\t\tif (!this.fields || !this.selectedFields)\n\t\t\t\treturn null;\n\t\t\treturn this.fields.filter(x => this.selectedFields.indexOf(x) === -1)\n\t\t},\n\t\tfilteredData() {\n\t\t\tif (!this.dataset)\n\t\t\t\treturn [];\n\t\t\treturn JSON.parse(JSON.stringify(this.dataset));\n\t\t},\n\t\tfilteredColumns() {\n\t\t\tlet fields = JSON.parse(JSON.stringify(this.fields)) || [];\n\t\t\tlet selectedFields = JSON.parse(JSON.stringify(this.selectedFields)) || [];\n\n\t\t\tlet columns = null;\n\n\t\t\t// If the tabulator options has been provided and it contains the property columns\n\t\t\tif (this.tabulatorOptions && this.tabulatorOptions.hasOwnProperty('columns'))\n\t\t\t\tcolumns = this.tabulatorOptions.columns;\n\n\t\t\t// If columns is not an array or it is an array with less elements then the array fields\n\t\t\tif (!Array.isArray(columns) || (Array.isArray(columns) && columns.length < fields.length))\n\t\t\t{\n\t\t\t\tcolumns = []; // set it as an empty array\n\n\t\t\t\t// Loop throught all the retrieved columns from database\n\t\t\t\tfor (let field of fields)\n\t\t\t\t{\n\t\t\t\t\t// Create a new column having the title equal to the field name\n\t\t\t\t\tlet column = {\n\t\t\t\t\t\ttitle: field,\n\t\t\t\t\t\tfield: field\n\t\t\t\t\t};\n\n\t\t\t\t\t// If the column has to be displayed or not\n\t\t\t\t\tcolumn.visible = selectedFields.indexOf(field) >= 0;\n\n\t\t\t\t\t// Add the new column to the list of columns\n\t\t\t\t\tcolumns.push(column);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse // the property columns has been provided in the tabulator options\n\t\t\t{\n\t\t\t\t// Loop throught the property columns of the tabulator options\n\t\t\t\tfor (let col of columns)\n\t\t\t\t{\n\t\t\t\t\t// If the column has to be displayed or not\n\t\t\t\t\t/* fields.indexOf(col.field) == -1; ensures displaying formatter colums\n\t\t\t\t\te.g. column with rowSelection checkboxes or with custom formatted action buttons */\n\t\t\t\t\tcol.visible = selectedFields.indexOf(col.field) >= 0 || fields.indexOf(col.field) == -1;\n\n\t\t\t\t\tif (col.hasOwnProperty('resizable'))\n\t\t\t\t\t\tcol.resizable = col.visible;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn columns;\n\t\t},\n\t\tfieldIdsForVisibilty() {\n\t\t\tif (!this.tableBuilt)\n\t\t\t\treturn [];\n\t\t\treturn this.tabulator.getColumns().filter(col => {\n\t\t\t\tlet def = col.getDefinition();\n\t\t\t\treturn !def.frozen && def.title && def.formatter != \"responsiveCollapse\";\n\t\t\t}).map(col => col.getField());\n\t\t},\n\t\tfieldNames() {\n\t\t\tif (!this.tableBuilt)\n\t\t\t\treturn {};\n\t\t\treturn this.tabulator.getColumns().reduce((res, col) => {\n\t\t\t\tres[col.getField()] = col.getDefinition().title;\n\t\t\t\treturn res;\n\t\t\t}, {});\n\t\t},\n\t\tidExtra() {\n\t\t\tif (!this.uuid)\n\t\t\t\treturn '';\n\t\t\treturn '-' + this.uuid;\n\t\t},\n\t\tcolumnsForFilter() {\n\t\t\tif (!this.filteredColumns || !this.datasetMetadata)\n\t\t\t\treturn [];\n\t\t\tconst filterTitles = this.filteredColumns.reduce((a,c) => {\n\t\t\t\ta[c.field] = c.title;\n\t\t\t\treturn a;\n\t\t\t}, {});\n\t\t\treturn this.datasetMetadata.map(el => ({...el, ...{title: filterTitles[el.name]}}));\n\t\t}\n\t},\n\tmethods: {\n\t\treloadTable() {\n\t\t\tif (this.tableOnly)\n\t\t\t\tthis.tabulator.setData();\n\t\t\telse\n\t\t\t\tthis.getFilter();\n\t\t},\n\t\tasync initTabulator() {\n\t\t\tlet placeholder = '< Phrasen Plugin not loaded! >';\n\t\t\tif (this.$p) {\n\t\t\t\tawait this.$p.loadCategory('ui');\n\t\t\t\tplaceholder = this.$p.t('ui/keineDatenVorhanden');\n\t\t\t}\n\n\t\t\tif (!this.tableOnly) {\n\t\t\t\t// prefetch data to get fields & selectedFields for filteredColumns & filteredData\n\t\t\t\tawait new Promise(resolve => {\n\t\t\t\t\tconst filterId = window.location.hash ? window.location.hash.slice(1) : null;\n\n\t\t\t\t\tconst resolvePromiseFunc = data => {\n\t\t\t\t\t\tthis.setRenderData(data);\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t};\n\t\t\t\t\t// get the filter data\n\t\t\t\t\tif (filterId === null)\n\t\t\t\t\t\tthis.startFetchCmpt(\n\t\t\t\t\t\t\twsParams => this.$api.call(ApiFilter.getFilter(wsParams)),\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\tresolvePromiseFunc\n\t\t\t\t\t\t);\n\t\t\t\t\telse\n\t\t\t\t\t\tthis.startFetchCmpt(\n\t\t\t\t\t\t\twsParams => this.$api.call(ApiFilter.getFilterById(wsParams)),\n\t\t\t\t\t\t\t{ filterId },\n\t\t\t\t\t\t\tresolvePromiseFunc\n\t\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Define a default tabulator options in case it was not provided\n\t\t\tlet tabulatorOptions = {...{\n\t\t\t\t\tlayout: \"fitDataStretchFrozen\",\n\t\t\t\t\tmovableColumns: true,\n\t\t\t\t\tcolumnDefaults:{\n\t\t\t\t\t\ttooltip: true\n\t\t\t\t\t},\n\t\t\t\t\tplaceholder,\n\t\t\t\t\tpersistence: this.persistence,\n\t\t\t\t}, ...(this.tabulatorOptions || {})};\n\n\t\t\t// set default height if no height property is set\n\t\t\tif (tabulatorOptions.height === undefined &&\n\t\t\t\ttabulatorOptions.minHeight === undefined &&\n\t\t\t\ttabulatorOptions.maxHeight === undefined) {\n\t\t\t\ttabulatorOptions.height = 500;\n\t\t\t}\n\n\t\t\tif (!this.tableOnly) {\n\t\t\t\ttabulatorOptions.data = this.filteredData;\n\t\t\t\ttabulatorOptions.columns = this.filteredColumns;\n\t\t\t} else {\n\t\t\t\ttabulatorOptions.columns.forEach(col => {\n\t\t\t\t\tif (col.visible === undefined)\n\t\t\t\t\t\tcol.visible = true;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (tabulatorOptions.selectable || (tabulatorOptions.columns && tabulatorOptions.columns.filter(el => el.formatter == 'rowSelection').length))\n\t\t\t\tthis.tabulatorHasSelector = true;\n\n\t\t\tif (this.idField) {\n\t\t\t\t// enable nested tabulator if parent Id given\n\t\t\t\tif (this.parentIdField) tabulatorOptions.dataTree = true;\n\t\t\t\t// set tabulator index\n\t\t\t\ttabulatorOptions.index = this.idField;\n\t\t\t}\n\n\t\t\t// Start the tabulator with the build options\n\t\t\tthis.tabulator = new Tabulator(\n\t\t\t\tthis.$refs.table,\n\t\t\t\ttabulatorOptions\n\t\t\t);\n\t\t\t// If event handlers have been provided\n\t\t\tif (Array.isArray(this.tabulatorEvents) && this.tabulatorEvents.length > 0)\n\t\t\t{\n\t\t\t\t// Attach all the provided event handlers to the started tabulator\n\t\t\t\tfor (let evt of this.tabulatorEvents)\n\t\t\t\t\tthis.tabulator.on(evt.event, evt.handler);\n\t\t\t}\n\t\t\tthis.tabulator.on('tableBuilt', () => {this.tableBuilt = true; this.$emit('tableBuilt');});\n\t\t\tthis.tabulator.on(\"rowSelectionChanged\", data => {\n\t\t\t\tthis.selectedData = data;\n\t\t\t});\n\n\t\t\t// if nested tabulator, restructure data\n\t\t\tif (this.parentIdField && this.idField) {\n\t\t\t\tthis.tabulator.on(\"dataLoading\", data => {\n\t\t\t\t\tlet toDelete = [];\n\n\t\t\t\t\t// loop through all data\n\t\t\t\t\tfor (let childIdx = 0; childIdx < data.length; childIdx++)\n\t\t\t\t\t{\n\t\t\t\t\t\tlet child = data[childIdx];\n\n\t\t\t\t\t\t// if it has parent id, it is a child\n\t\t\t\t\t\tif (child[this.parentIdField])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// append the child on the right place. If parent found, mark original sw child on 0 level for deleting\n\t\t\t\t\t\t\tif (this.appendChild(data, child)) toDelete.push(childIdx);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// delete the marked children from 0 level\n\t\t\t\t\tfor (let counter = 0; counter < toDelete.length; counter++)\n\t\t\t\t\t{\n\t\t\t\t\t\t// decrease index by counter as index of data array changes after every deletion\n\t\t\t\t\t\tdata.splice(toDelete[counter] - counter, 1);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (this.tableOnly) {\n\t\t\t\tthis.tabulator.on('tableBuilt', () => {\n\t\t\t\t\tconst cols = this.tabulator.getColumns();\n\t\t\t\t\tthis.fields = cols.map(col => col.getField());\n\t\t\t\t\tthis.selectedFields = cols.filter(col => col.isVisible()).map(col => col.getField());\n\t\t\t\t\tif (this.tabulator.options.persistence.headerFilter)\n\t\t\t\t\t\tthis._setHeaderFilter();\n\t\t\t\t});\n\n\t\t\t}\n\n\t\t\tthis.tabulator.on(\"dataFiltered\", filters => {\n\t\t\t\tthis.filterActive = filters.length > 0;\n\t\t\t});\n\t\t},\n\t\tupdateTabulator() {\n\t\t\tif (this.tabulator) {\n\t\t\t\tif (this.tableBuilt)\n\t\t\t\t\tthis._updateTabulator();\n\t\t\t\telse\n\t\t\t\t\tthis.tabulator.on('tableBuilt', this._updateTabulator);\n\t\t\t}\n\t\t},\n\t\t_updateTabulator() {\n\t\t\tthis.tabulatorHasSelector = this.tabulatorOptions.selectable || this.filteredColumns.filter(el => el.formatter == 'rowSelection').length;\n\t\t\tthis.tabulator.setColumns(this.filteredColumns);\n\t\t\tthis.tabulator.setData(this.filteredData);\n\t\t\tthis._setHeaderFilter()\n\t\t},\n\t\tclearFilters()\n\t\t{\n\t\t\tlet existingFilters = this.tabulator.getHeaderFilters();\n\t\t\texistingFilters.forEach(filter => {\n\t\t\t\tthis.tabulator.setHeaderFilterValue(filter.field, \"\");\n\t\t\t});\n\t\t\tthis.tabulator.clearFilter();\n\t\t\tthis.filterActive = false;\n\t\t},\n\t\t_setHeaderFilter()\n\t\t{\n\t\t\tconst existingFilters = this.tabulator.getHeaderFilters();\n\t\t\texistingFilters.forEach(filter => {\n\t\t\t\tthis.tabulator.setHeaderFilterValue(filter.field, filter.value);\n\t\t\t});\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\tgetFilter() {\n\t\t\tif (this.selectedFilter === null)\n\t\t\t\tthis.startFetchCmpt(\n\t\t\t\t\twsParams => this.$api.call(ApiFilter.getFilter(wsParams)),\n\t\t\t\t\tnull,\n\t\t\t\t\tthis.render\n\t\t\t\t);\n\t\t\telse\n\t\t\t\tthis.startFetchCmpt(\n\t\t\t\t\twsParams => this.$api.call(ApiFilter.getFilterById(wsParams)),\n\t\t\t\t\t{\n\t\t\t\t\t\tfilterId: this.selectedFilter\n\t\t\t\t\t},\n\t\t\t\t\tthis.render\n\t\t\t\t);\n\t\t},\n\t\tsetRenderData(data) {\n\t\t\tthis.fetchResult = data;\n\t\t\tthis.filterName = data.filterName;\n\t\t\tthis.dataset = data.dataset;\n\t\t\tthis.datasetMetadata = data.datasetMetadata;\n\n\t\t\tthis.fields = data.fields;\n\t\t\tthis.selectedFields = data.selectedFields;\n\t\t\tthis.filterFields = [];\n\n\t\t\tfor (let i = 0; i < data.datasetMetadata.length; i++)\n\t\t\t{\n\t\t\t\tfor (let j = 0; j < data.filters.length; j++)\n\t\t\t\t{\n\t\t\t\t\tif (data.datasetMetadata[i].name == data.filters[j].name)\n\t\t\t\t\t{\n\t\t\t\t\t\tlet filter = data.filters[j];\n\t\t\t\t\t\tfilter.type = data.datasetMetadata[i].type;\n\n\t\t\t\t\t\tthis.filterFields.push(filter);\n\t\t\t\t\t\t//break;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\trender(response) {\n\t\t\tlet data = response;\n\n\t\t\tthis.setRenderData(data);\n\n\t\t\t// If the side menu is active\n\t\t\tif (this.sideMenu === true)\n\t\t\t{\n\t\t\t\tthis.setSideMenu(data);\n\t\t\t}\n\t\t\telse // otherwise use the dropdown in the filter options\n\t\t\t{\n\t\t\t\tthis.setDropDownMenu(data);\n\t\t\t}\n\t\t\tthis.updateTabulator();\n\t\t},\n\t\t/**\n\t\t * Set the menu\n\t\t */\n\t\tsetSideMenu(data) {\n\t\t\tlet filters = data.sideMenu.filters;\n\t\t\tlet personalFilters = data.sideMenu.personalFilters;\n\t\t\tlet filtersArray = [];\n\n\t\t\tfor (let filtersCount = 0; filtersCount < filters.length; filtersCount++)\n\t\t\t{\n\t\t\t\tlet link = filters[filtersCount].link;\n\n\t\t\t\tif (link == null) link = '#';\n\n\t\t\t\tfiltersArray[filtersArray.length] = {\n\t\t\t\t\tid: filters[filtersCount].filter_id,\n\t\t\t\t\tlink: link + filters[filtersCount].filter_id,\n\t\t\t\t\tdescription: filters[filtersCount].desc,\n\t\t\t\t\tsort: filtersCount,\n\t\t\t\t\tonClickCall: this.handlerGetFilterById\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tfor (let filtersCount = 0; filtersCount < personalFilters.length; filtersCount++)\n\t\t\t{\n\t\t\t\tlet link = personalFilters[filtersCount].link;\n\n\t\t\t\tif (link == null) link = '#';\n\n\t\t\t\tfiltersArray[filtersArray.length] = {\n\t\t\t\t\tid: personalFilters[filtersCount].filter_id,\n\t\t\t\t\tlink: link + personalFilters[filtersCount].filter_id,\n\t\t\t\t\tdescription: personalFilters[filtersCount].desc,\n\t\t\t\t\tsubscriptDescription: personalFilters[filtersCount].subscriptDescription,\n\t\t\t\t\tsubscriptLinkClass: personalFilters[filtersCount].subscriptLinkClass,\n\t\t\t\t\tsubscriptLinkValue: personalFilters[filtersCount].subscriptLinkValue,\n\t\t\t\t\tsort: filtersCount,\n\t\t\t\t\tonClickCall: this.handlerGetFilterById,\n\t\t\t\t\tonClickSubscriptCall: this.handlerRemoveCustomFilter\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tthis.availableFilters = filtersArray;\n\n\t\t\tthis.$emit(\n\t\t\t\t'nwNewEntry',\n\t\t\t\t{\n\t\t\t\t\tlink: \"#\",\n\t\t\t\t\tdescription: \"Filters\",\n\t\t\t\t\ticon: \"filter\",\n\t\t\t\t\tchildren: filtersArray\n\t\t\t\t}\n\t\t\t);\n\t\t},\n\t\t/**\n\t\t * Set the drop down menu\n\t\t */\n\t\tsetDropDownMenu(data) {\n\t\t\tlet filters = data.sideMenu.filters;\n\t\t\tlet personalFilters = data.sideMenu.personalFilters;\n\t\t\tlet filtersArray = [];\n\n\t\t\tfor (let filtersCount = 0; filtersCount < filters.length; filtersCount++)\n\t\t\t{\n\t\t\t\tlet link = filters[filtersCount].link;\n\n\t\t\t\tif (link == null) link = '#';\n\n\t\t\t\tfiltersArray[filtersArray.length] = {\n\t\t\t\t\tid: filters[filtersCount].filter_id,\n\t\t\t\t\toption: filters[filtersCount].filter_id,\n\t\t\t\t\tdescription: filters[filtersCount].desc\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tfor (let filtersCount = 0; filtersCount < personalFilters.length; filtersCount++)\n\t\t\t{\n\t\t\t\tlet link = personalFilters[filtersCount].link;\n\n\t\t\t\tif (link == null) link = '#';\n\n\t\t\t\tfiltersArray[filtersArray.length] = {\n\t\t\t\t\tid: personalFilters[filtersCount].filter_id,\n\t\t\t\t\toption: personalFilters[filtersCount].filter_id,\n\t\t\t\t\tdescription: personalFilters[filtersCount].desc\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tthis.availableFilters = filtersArray;\n\t\t},\n\t\t/**\n\t\t * Used to start/refresh the FetchCmpt\n\t\t */\n\t\tstartFetchCmpt(apiFunction, apiFunctionParameters, dataFetchedCallback) {\n\t\t\t// Assign the function api of the FetchCmpt binded property\n\t\t\tthis.fetchCmptApiFunction = apiFunction;\n\n\t\t\t// In case a null value is provided set the parameters as an empty object\n\t\t\tif (apiFunctionParameters == null) apiFunctionParameters = {};\n\n\t\t\t// Always needed parameters\n\t\t\tapiFunctionParameters.filterUniqueId = FHC_JS_DATA_STORAGE_OBJECT.called_path + \"/\" + FHC_JS_DATA_STORAGE_OBJECT.called_method;\n\t\t\tapiFunctionParameters.filterType = this.filterType;\n\n\t\t\tif (this.uniqueId)\n\t\t\t\tapiFunctionParameters.filterUniqueId += '_' + this.uniqueId;\n\n\t\t\t// Assign parameters to the FetchCmpt binded properties\n\t\t\tthis.fetchCmptApiFunctionParams = apiFunctionParameters;\n\t\t\t// Assign data fetch callback to the FetchCmpt binded properties\n\t\t\tthis.fetchCmptDataFetched = dataFetchedCallback;\n\t\t\t// Set the FetchCmpt binded property refresh to have the component to refresh\n\t\t\t// NOTE: this should be the last one to be called because it triggers the FetchCmpt to start to refresh\n\t\t\tthis.fetchCmptRefresh === true ? this.fetchCmptRefresh = false : this.fetchCmptRefresh = true;\n\t\t},\n\n\t\t// ------------------------------------------------------------------------------------------------------------------\n\t\t// Event handlers\n\n\t\t/**\n\t\t *\n\t\t */\n\t\thandlerSaveCustomFilter(customFilterName) {\n\t\t\tthis.selectedFilter = null;\n\t\t\t//\n\t\t\tthis.startFetchCmpt(\n\t\t\t\twsParams => this.$api.call(ApiFilter.saveCustomFilter(wsParams)),\n\t\t\t\t{\n\t\t\t\t\tcustomFilterName\n\t\t\t\t},\n\t\t\t\tthis.getFilter\n\t\t\t);\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\thandlerRemoveCustomFilter(event) {\n\t\t\tlet filterId = event.currentTarget.getAttribute(\"href\").substring(1);\n\t\t\tif (filterId === this.selectedFilter)\n\t\t\t\tthis.selectedFilter = null;\n\t\t\t//\n\t\t\tthis.startFetchCmpt(\n\t\t\t\twsParams => this.$api.call(ApiFilter.removeCustomFilter(wsParams)),\n\t\t\t\t{\n\t\t\t\t\tfilterId: filterId\n\t\t\t\t},\n\t\t\t\tthis.getFilter\n\t\t\t);\n\t\t},\n\n\t\t/*\n\t\t *\n\t\t */\n\t\thandlerGetFilterById: function(event) {\n\n\t\t\tlet filterId = null;\n\n\t\t\t// Get the attribute href if side menu is rendered\n\t\t\tlet attr = event.currentTarget.getAttribute(\"href\");\n\n\t\t\t// Otherwise get the value of the drop down menu\n\t\t\tif (attr == null)\n\t\t\t{\n\t\t\t\tfilterId = event.currentTarget.value;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfilterId = attr.substring(1);\n\t\t\t}\n\n\t\t\tthis.switchFilter(filterId);\n\t\t},\n\t\tswitchFilter(filterId) {\n\t\t\tthis.selectedFilter = filterId;\n\t\t\tthis.getFilter();\n\t\t},\n\t\tapplyFilterConfig(filterFields) {\n\t\t\tthis.selectedFilter = null;\n\t\t\tthis.startFetchCmpt(\n\t\t\t\twsParams => this.$api.call(ApiFilter.applyFilterFields(wsParams)),\n\t\t\t\t{\n\t\t\t\t\tfilterFields\n\t\t\t\t},\n\t\t\t\tthis.getFilter\n\t\t\t);\n\t\t},\n\n\t\t// append child to it's parent\n\t\tappendChild(data, child) {\n\t\t\t// get parent id\n\t\t\tlet parentId = child[this.parentIdField];\n\n\t\t\t// loop thorugh all data\n\t\t\tfor (let parentIdx = 0; parentIdx < data.length; parentIdx++)\n\t\t\t{\n\t\t\t\tlet parent = data[parentIdx];\n\n\t\t\t\t// if it's the parent\n\t\t\t\tif (parent[this.idField] == parentId)\n\t\t\t\t{\n\t\t\t\t\t// create children array if not done yet\n\t\t\t\t\tif (!parent._children) parent._children = [];\n\n\t\t\t\t\t// if child is not included in children array, append the child\n\t\t\t\t\tif (!parent._children.includes(child)) parent._children.push(child);\n\n\t\t\t\t\t// parent found\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\t// search children for parents\n\t\t\t\telse if (parent._children) this.appendChild(parent._children, child);\n\t\t\t}\n\n\t\t\t// parent not found\n\t\t\treturn false;\n\t\t}\n\t},\n\tbeforeCreate() {\n\t\tif (!this.tableOnly == !this.filterType)\n\t\t\talert('You can not have a filter-type in table-only mode!');\n\t},\n\tcreated() {\n\t\tif (this.sideMenu && (!this.$props.onNwNewEntry || !(this.$props.onNwNewEntry instanceof Function)))\n\t\t\talert('\"nwNewEntry\" listener is mandatory when sideMenu is true');\n\t\tthis.uuid = _uuid++;\n\t\tthis.$emit('uuidDefined', this.uuid)\n\t},\n\tmounted() {\n\t\tthis.initTabulator().then(() => {\n\t\t\tif (!this.tableOnly) {\n\t\t\t\tthis.selectedFilter = window.location.hash ? window.location.hash.slice(1) : null;\n\t\t\t\tthis.render(this.fetchResult);\n\t\t\t}\n\t\t});\n\n\t},\n\ttemplate: `\n\t\t\n\t\t\n\t\t\n\n\t\t
    \n\t\t\t
    \n\t\t\t\t

    \n\t\t\t\t\t{{ title }}\n\t\t\t\t

    \n\t\t\t
    \n\t\t
    \n\t\t
    \n\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t{{ selectedData.length }} ausgewählt\n\t\t\t\t\t\t Mit {{ selectedData.length }} ausgewählten:\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t[ {{ filterName }} ]\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\n\t\t\t\n\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t\n\n\t\t\n\t\t
    \n\t`\n};\n","export default {\n props: {\n data: Object,\n title: { type: String },\n },\n data() {\n return {};\n },\n created(){\n\n },\n template: /*html*/`\n\t`,\n};\n","export default {\n\tprops: {\n\t\tdata: {\n\t\t\ttype: String,\n\t\t}\n\t},\n\tdata() {\n\t\treturn {}\n\t},\n\ttemplate: /*html*/`\n
    \n
    \n {{$p.t('profil','fhAusweisStatus',[data])}}\n
    \n
    `,\n}","export default {\n\t//TODO: To be implemented\n\tprops: {\n\t\tdata: {\n\t\t\ttype: String,\n\t\t},\n\t\ttitle: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tmobile: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tmethods: {\n\t\thideCollapse: function () {\n\t\t\tthis.collapseOpen = false;\n\t\t},\n\t\tshowCollapse: function () {\n\t\t\tthis.collapseOpen = true;\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tcollapseOpen: false,\n\t\t};\n\t},\n\ttemplate: /*html*/ `\n
    \n \n \n
    `,\n};\n","export default {\n props:{\n data:Object,\n view:String,\n withZustelladresse:{\n type:Boolean,\n default:true,\n },\n },\n data(){\n return{}\n },\n created(){\n \n },\n template:/*html*/`\n \n
    \n \n \n
    \n \n
    \n \n
    \n
    \n
    {{$p.t('person','strasse')}}
    \n {{data.strasse}} \n
    \n
    \n \n \n
    \n
    \n
    {{$p.t('global','typ')}}
    \n {{data.typ}} \n
    \n
    \n \n
    \n
    \n
    {{$p.t('person','ort')}}
    \n {{data.ort}} \n
    \n
    \n
    \n
    \n
    {{$p.t('person','plz')}}
    \n {{data.plz}} \n
    \n
    \n\n
    \n
    \n
    {{$p.t('person','zustelladresse')}}
    \n
    \n \n
    \n
    \n
    \n
    \n`\n};","export default{\n props:{\n view:String,\n data:Object,\n },\n data(){\n return {\n\n }\n },\n created(){\n\n }, \n template:/*html*/`\n\t\n`,\n};","export default {\n\tdata() {\n\t\treturn {};\n\t},\n\tprops: {\n\t\ttitle: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tdata: {\n\t\t\ttype: Array,\n\t\t},\n\t},\n\ttemplate: /*html*/ `\n
    \n
    \n {{title}}\n
    \n
    \n \n
    \n
    \n\t\t\t\t\n
    \n
    \n
    \n
    `,\n};\n","export default {\n\tdata() {\n\t\treturn {}\n\t},\n\tprops: {\n\t\tdata: {\n\t\t\ttype: Object,\n\t\t},\n\t\ttitle: {\n\t\t\ttype: String,\n\t\t}\n\t},\n\tinject: {\n\t\t// inject info that should not be displayed\n\t\t'studiengang_kz': {\n\t\t\tfrom: 'studiengang_kz',\n\t\t\tdefault: false\n\t\t},\n\t},\n\tcomputed: {\n\t\tgetLinkGruppeListe() {\n\t\t\tif(this.studiengang_kz === false) {\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\treturn this.data.gruppe?.value && this.data.verband?.value && this.data.semester?.value ? FHC_JS_DATA_STORAGE_OBJECT.app_root \n\t\t\t\t+ 'cis/private/stud_in_grp.php?kz='+this.studiengang_kz+'&sem=' + this.data.semester.value\n\t\t\t\t+ '&verband=' + this.data.verband.value + '&grp=' + this.data.gruppe.value : ''\n\t\t},\n\t\tgetLinkVerbandListe() {\n\t\t\tif(this.studiengang_kz === false) {\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\treturn this.data.verband?.value && this.data.semester?.value ? FHC_JS_DATA_STORAGE_OBJECT.app_root \n\t\t\t\t+ 'cis/private/stud_in_grp.php?kz='+this.studiengang_kz+'&sem=' + this.data.semester.value\n\t\t\t\t+ '&verband=' + this.data.verband.value : ''\n\t\t},\n\t\tgetLinkSemesterListe() {\n\t\t\tif(this.studiengang_kz === false) {\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\treturn this.data.semester?.value ? FHC_JS_DATA_STORAGE_OBJECT.app_root \n\t\t\t\t+ 'cis/private/stud_in_grp.php?kz='+this.studiengang_kz+'&sem=' + this.data.semester.value : ''\n\t\t}\n\t},\n\tcreated() {\n\t\t//TODO: check if data.Telefon is a valid telefon number to call before using it as a tel: link\n\t},\n\ttemplate: `\n
    \n
    {{title}}
    \n
    \n
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{entry.label }}
    \n\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t{{entry.value ?? '-'}}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ entry.value }}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ entry.value }}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ entry.value }}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t{{ entry.value ?? '-'}}\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    `\n};","/**\n * Copyright (C) 2025 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\t\n\tprofilViewData(uid) {\n\t\tlet url = \"/api/frontend/v1/Profil/profilViewData\";\n\t\tif(uid){\n\t\t\turl += `/${uid}`;\n\t\t}\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: url\n\t\t};\n\t},\n\tfotoSperre(value) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: `/api/frontend/v1/Profil/fotoSperre/${value}`\n\t\t};\n\t\t\n\t},\n\tisStudent(uid) {\n\t\t// TODO(chris): seems to be called from nowhere?\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Profil/isStudent',\n\t\t\tparams: { uid }\n\t\t};\n\t},\n\tisMitarbeiter(uid) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: `/api/frontend/v1/Profil/isMitarbeiter/${uid}`\n\t\t};\n\t},\n\tgetZustellAdresse() {\n\t\t// TODO(chris): seems to be called from nowhere?\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Profil/getZustellAdresse'\n\t\t};\n\t},\n\tgetZustellKontakt() {\n\t\t// TODO(chris): seems to be called from nowhere?\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Profil/getZustellKontakt'\n\t\t};\n\t},\n\tgetGemeinden(nation, zip) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: `/api/frontend/v1/Profil/getGemeinden/${nation}/${zip}`\n\t\t};\n\t\t\n\t},\n\tgetAllNationen() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Profil/getAllNationen'\n\t\t};\n\t},\n};","import DmsItem from './Dms/Item.js';\n\nexport default {\n\tcomponents: {\n\t\tDmsItem\n\t},\n\temits: [\n\t\t'update:modelValue'\n\t],\n\tprops: {\n\t\tmodelValue: {\n\t\t\ttype: [ FileList, Array ],\n\t\t\trequired: true\n\t\t},\n\t\tmultiple: Boolean,\n\t\tid: String,\n\t\tname: String,\n\t\tinputClass: [String, Array, Object],\n\t\tnoList: Boolean,\n\t\taccept: {\n\t\t\ttype: String,\n\t\t\tdefault: ''\n\t\t},\n\t\tdisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t}\n\t},\n\tmethods: {\n\t\tstringifyFile(file) {\n\t\t\treturn JSON.stringify({\n\t\t\t\tlastModified: file.lastModified,\n\t\t\t\tlastModifiedDate: file.lastModifiedDate,\n\t\t\t\tname: file.name,\n\t\t\t\tsize: file.size,\n\t\t\t\ttype: file.type\n\t\t\t});\n\t\t},\n\t\taddFiles(event) {\n\t\t\tif (!this.multiple)\n\t\t\t\treturn this.$emit('update:modelValue', event.target.files);\n\t\t\t\n\t\t\tconst dt = new DataTransfer();\n\t\t\tconst doubles = [];\n\t\t\tfor (var file of this.modelValue) {\n\t\t\t\tdt.items.add(file);\n\t\t\t\tdoubles.push(this.stringifyFile(file));\n\t\t\t}\n\t\t\tfor (var file of event.target.files) {\n\t\t\t\t// NOTE(chris): deep check (with FileReader) would require an async function so we only check the basic attributes\n\t\t\t\tif (doubles.indexOf(this.stringifyFile(file)) < 0)\n\t\t\t\t\tdt.items.add(file);\n\t\t\t}\n\t\t\tthis.$emit('update:modelValue', dt.files);\n\t\t},\n\t\tremoveFile(id) {\n\t\t\tconst fileToRemove = Array.from(this.modelValue)[id];\n\t\t\t\n\t\t\tconst dt = new DataTransfer();\n\t\t\tfor (var file of this.modelValue) {\n\t\t\t\tif (file !== fileToRemove)\n\t\t\t\t\tdt.items.add(file);\n\t\t\t}\n\t\t\tthis.$emit('update:modelValue', dt.files);\n\t\t}\n\t},\n\twatch: {\n\t\tmodelValue(n) {\n\t\t\tif (!n)\n\t\t\t\treturn;\n\t\t\tif (n instanceof FileList) {\n\t\t\t\tif (!this.$refs.upload) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn this.$refs.upload.files = n;\n\t\t\t}\n\n\t\t\tconst dt = new DataTransfer();\n\t\t\tconst dms = [];\n\t\t\tfor (var file of n) {\n\t\t\t\tif (file instanceof File) {\n\t\t\t\t\tdt.items.add(file);\n\t\t\t\t} else {\n\t\t\t\t\tconst dmsFile = new File([JSON.stringify(file)], file.name, {\n\t\t\t\t\t\ttype: 'application/x.fhc-dms+json'\n\t\t\t\t\t});\n\t\t\t\t\tdt.items.add(dmsFile);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.$emit('update:modelValue', dt.files);\n\t\t}\n\t},\n\ttemplate: `\n\t
    \n\t\t\n\t\t
      \n\t\t\t\n\t\t\t\n\t\t
    \n\t
    `\n}","export default {\n\temits: [\n\t\t'delete'\n\t],\n\tprops: {\n\t\tmodelValue: {\n\t\t\ttype: [File, Object],\n\t\t\trequired: true\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tpreview: ''\n\t\t};\n\t},\n\twatch: {\n\t\tmodelValue(n) {\n\t\t\tif (n.type == 'application/x.fhc-dms+json') {\n\t\t\t\tn.text().then(result => {\n\t\t\t\t\tconst obj = JSON.parse(result);\n\t\t\t\t\tthis.preview = obj.preview || '';\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t},\n\ttemplate: `\n\t
  • \n\t\t\n\t\t{{ modelValue.name }}\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t
  • `\n}\n","/**\n * Copyright (C) 2025 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\t//! API calls for profil update requests\n\tgetStatus() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/ProfilUpdate/getStatus'\n\t\t};\n\t},\n\tgetTopic() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/ProfilUpdate/getTopic'\n\t\t};\n\t},\n\tacceptProfilRequest({profil_update_id, uid, status_message, topic, requested_change}) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/ProfilUpdate/acceptProfilRequest',\n\t\t\tparams: {\n\t\t\t\tprofil_update_id,\n\t\t\t\tuid,\n\t\t\t\tstatus_message,\n\t\t\t\ttopic,\n\t\t\t\trequested_change\n\t\t\t}\n\t\t};\n\t},\n\tdenyProfilRequest({profil_update_id, uid, topic, status_message}) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/ProfilUpdate/denyProfilRequest',\n\t\t\tparams: {\n\t\t\t\tprofil_update_id,\n\t\t\t\tuid,\n\t\t\t\ttopic,\n\t\t\t\tstatus_message\n\t\t\t}\n\t\t};\n\t},\n\tinsertFile(dms, replace = null) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: `/api/frontend/v1/ProfilUpdate/insertFile/${replace}`,\n\t\t\tparams: dms\n\t\t};\n\t},\n\tupdateProfilbild(dms) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: `/api/frontend/v1/ProfilUpdate/updateProfilbild`,\n\t\t\tparams: dms\n\t\t};\n\t},\n\tgetProfilUpdateWithPermission(filter) {\n\t\tconst url_filter = (filter !== '') ? '/' + encodeURIComponent(filter) : '';\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/ProfilUpdate/getProfilUpdateWithPermission' + url_filter\n\t\t};\n\t},\n\tgetProfilRequestFiles(requestID) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: `/api/frontend/v1/ProfilUpdate/getProfilRequestFiles/${requestID}`\n\t\t};\n\t},\n\tselectProfilRequest(uid = null, id = null) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/ProfilUpdate/selectProfilRequest',\n\t\t\tparams: {\n\t\t\t\t...(uid ? { uid } : {}),\n\t\t\t\t...(id ? { id } : {})\n\t\t\t}\n\t\t};\n\t},\n\tinsertProfilRequest(topic, payload, fileID = null) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/ProfilUpdate/insertProfilRequest',\n\t\t\tparams: {\n\t\t\t\ttopic,\n\t\t\t\tpayload,\n\t\t\t\t...(fileID ? { fileID } : {})\n\t\t\t}\n\t\t};\n\t},\n\tupdateProfilRequest(topic, payload, ID, fileID = null) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/ProfilUpdate/updateProfilRequest',\n\t\t\tparams: {\n\t\t\t\ttopic,\n\t\t\t\tpayload,\n\t\t\t\tID,\n\t\t\t\t...(fileID ? { fileID } : {})\n\t\t\t}\n\t\t};\n\t},\n\tdeleteProfilRequest(requestID) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/ProfilUpdate/deleteProfilRequest',\n\t\t\tparams: { requestID }\n\t\t};\n\t}\n};","import Dms from \"../../../../Form/Upload/Dms.js\";\nimport BsModal from \"../../../../Bootstrap/Modal.js\";\n\nimport ApiProfilUpdate from '../../../../../api/factory/profilUpdate.js';\n\nexport default {\n\tdata() {\n\t\treturn {\n\t\t\tdmsData: [],\n\t\t};\n\t},\n\tcomponents: {\n\t\tDms,\n\t\tBsModal,\n\t},\n\tmixins: [BsModal],\n\tprops: {\n\t\ttitel: {\n\t\t\ttype: String,\n\t\t},\n\t\tfiles: {\n\t\t\ttype: Array,\n\t\t},\n\t\tupdateID: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tonHideBsModal: Function,\n\t\tonHiddenBsModal: Function,\n\t\tonHidePreventedBsModal: Function,\n\t\tonShowBsModal: Function,\n\t\tonShownBsModal: Function,\n\t},\n\tmethods:{\n\t\tasync uploadImage(){\n\t\t\tif(this.dmsData){\n\t\t\t\tlet formData = new FormData();\n\t\t\t\tformData.append(\"files[]\", this.dmsData[0]);\n\t\t\t\tawait this.$api\n\t\t\t\t\t.call(ApiProfilUpdate.updateProfilbild(formData))\n\t\t\t\t\t.then((res) => {\n\t\t\t\t\t\tthis.$fhcAlert.alertSuccess(this.$p.t('global','hochgeladen'));\n\t\t\t\t\t\tthis.modal.hide();\n\t\t\t\t\t});\t\n\t\t\t}\n\t\t\t\n\t\t}\n\t},\n\tmounted() {\n\t\tthis.modal = this.$refs.modalContainer.modal;\n\t\tif (this.files) {\n\t\t\tthis.dmsData = this.files;\n\t\t}\n\t},\n\tpopup(options) {\n\t\t\tBsModal.popup.bind(this);\n\t\t\treturn BsModal.popup(null, options);\n\t},\n\ttemplate: /*html*/`\n\n\t\n\t\t\n\t\t\n\t\n `,\n};\n","import ApiProfil from '../../../../api/factory/profil.js';\nimport ImageUpload from '../../Profil/ProfilModal/EditProfilComponents/ImageUpload.js';\n\nexport default {\n\tprops: {\n\t\ttitle: {\n\t\t\ttype: String,\n\t\t},\n\t\tdata: {\n\t\t\ttype: Object,\n\t\t},\n\t\tfotoStatus:{\n\t\t\ttype: Boolean,\n\t\t\tdefault: true\n\t\t}\n\t},\n\tcomponents:{\n\t\tImageUpload,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tFotoSperre: this.data.foto_sperre,\n\t\t};\n\t},\n\temits: [\"showEditProfilModal\"],\n\tinject:[\"isEditable\"],\n\n\tmethods: {\n\t\tshowModal(){\n\t\t\tthis.$refs.imageUpload.show();\n\t\t},\n\t\tsperre_foto_function() {\n\t\t\t//TODO: refactor\n\t\t\tif (!this.data) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.$api\n\t\t\t\t.call(ApiProfil.fotoSperre(!this.FotoSperre))\n\t\t\t\t.then(res => {\n\t\t\t\t\tthis.FotoSperre = res.data.foto_sperre;\n\t\t\t\t});\n\t\t}\n\t},\n\tcomputed: {\n\t\tget_image_base64_src: function () {\n\t\t\tif (!this.data.foto) {\n\t\t\t\treturn \"\";\n\t\t\t}\n\t\t\treturn \"data:image/jpeg;base64,\" + this.data.foto;\n\t\t},\n\t\tname: function () {\n\t\t\treturn {vorname: this.data.Vorname, nachname: this.data.Nachname};\n\t\t},\n\t\tprofilInfo: function () {\n\t\t\tlet res = {};\n\t\t\tlet notIncludedProperties = [\n\t\t\t\t\"Vorname\",\n\t\t\t\t\"Nachname\",\n\t\t\t\t\"foto_sperre\",\n\t\t\t\t\"foto\",\n\t\t\t];\n\t\t\tObject.keys(this.data).forEach((key) => {\n\t\t\t\tif (!notIncludedProperties.includes(key)) {\n\t\t\t\t\tres[key] = this.data[key];\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn res;\n\t\t},\n\t},\n\ttemplate: /*html*/ `\n\n
    \n\t\n
    \n
    \n
    \n \n
    \n
    \n {{title}}\n
    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n \"profile\n \n
    \n \n
    \n\t\t\t\t\t\t
    \n \n
    \n
    \n
    \n \n
    \n \n \n
    \n
    \n
    \n
    \n
    {{$p.t('profilUpdate','vorname')}}
    \n {{name.vorname}} \n
    \n
    \n
    \n
    \n
    {{$p.t('profilUpdate','nachname')}}
    \n {{name.nachname}} \n
    \n
    \n
    \n
    \n
    \n
    \n
    {{$p.t('profil',bez)}}
    \n {{wert?wert:'-'}} \n
    \n
    \n
    \n
    \n
    \n`,\n};\n","import Kontakt from \"../ProfilComponents/Kontakt.js\";\nimport EditKontakt from \"./EditProfilComponents/EditKontakt.js\";\nimport Adresse from \"../ProfilComponents/Adresse.js\";\nimport EditAdresse from \"./EditProfilComponents/EditAdresse.js\";\nimport Status from \"./EditProfilComponents/Status.js\";\nimport TextInputDokument from \"./EditProfilComponents/TextInputDokument.js\";\n\nexport default {\n\tname: 'EditProfilSelect',\n\tcomponents: {\n\t\tKontakt,\n\t\tEditKontakt,\n\t\tAdresse,\n\t\tEditAdresse,\n\t\tStatus,\n\t\tTextInputDokument,\n\t},\n\tinject: [\"profilUpdateTopic\", \"isMitarbeiter\"],\n\tprops: {\n\t\tlist: Object,\n\n\t\t//? Prop used to determine how many options the select should initially show\n\t\tsize: {\n\t\t\ttype: Number,\n\t\t\tdefault: null,\n\t\t},\n\t\t//? Content for the aria label of the select\n\t\tariaLabel: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tprofilUpdate: String,\n\t\ttopic: String,\n\t\tbreadcrumb: String,\n\t},\n\temits: {\n\t\t//? update:modelValue event is needed to notify the v-model when the value has changed\n\t\t[\"update:profilUpdate\"]: null,\n\t\t[\"update:topic\"]: null,\n\t\t[\"update:breadcrumb\"]: null,\n\t\tsubmit: null,\n\t\tselect: null,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tview: null,\n\t\t\tdata: null,\n\t\t\tbreadcrumbItems: [],\n\t\t\tmodal_topic: this.topic,\n\t\t\tproperties: null,\n\t\t};\n\t},\n\n\tmethods: {\n\t\taddItem: function () {\n\t\t\tthis.view =\n\t\t\t\tthis.modal_topic == this.profilUpdateTopic[\"Private Kontakte\"]\n\t\t\t\t\t? \"EditKontakt\"\n\t\t\t\t\t: \"EditAdresse\";\n\n\t\t\t//? updates the topic when a Kontakt or an Address should be added\n\t\t\tthis.modal_topic =\n\t\t\t\tthis.modal_topic == this.profilUpdateTopic[\"Private Kontakte\"]\n\t\t\t\t\t? this.profilUpdateTopic[\"Add Kontakt\"]\n\t\t\t\t\t: this.profilUpdateTopic[\"Add Adresse\"];\n\t\t\tthis.$emit(\"update:topic\", this.modal_topic);\n\t\t\tthis.breadcrumbItems.push(this.modal_topic);\n\t\t\tthis.$emit(\"update:breadcrumb\", this.breadcrumbItems);\n\n\t\t\tthis.data =\n\t\t\t\tthis.view == \"EditAdresse\"\n\t\t\t\t\t? {\n\t\t\t\t\t\t//? add flag\n\t\t\t\t\t\tadd: true,\n\t\t\t\t\t\tadresse_id: null,\n\t\t\t\t\t\tstrasse: null,\n\t\t\t\t\t\ttyp: null,\n\t\t\t\t\t\tplz: null,\n\t\t\t\t\t\tort: null,\n\t\t\t\t\t\tzustelladresse: false,\n\t\t\t\t\t}\n\t\t\t\t\t: {\n\t\t\t\t\t\t//? add flag\n\t\t\t\t\t\tadd: true,\n\t\t\t\t\t\tkontakt_id: null,\n\t\t\t\t\t\tkontakttyp: null,\n\t\t\t\t\t\tkontakt: null,\n\t\t\t\t\t\tanmerkung: null,\n\t\t\t\t\t\tzustellung: false,\n\t\t\t\t\t};\n\t\t},\n\n\t\tdeleteItem: function (item) {\n\t\t\t//? delete flag\n\t\t\titem.data.delete = true;\n\t\t\tthis.$emit(\"update:profilUpdate\", item.data);\n\t\t\t//? updates the topic when a Kontakt or an Address should be deleted\n\n\t\t\tthis.modal_topic = this.modal_topic == this.profilUpdateTopic[\"Private Adressen\"]\n\t\t\t\t? this.profilUpdateTopic[\"Delete Adresse\"]\n\t\t\t\t: this.profilUpdateTopic[\"Delete Kontakt\"];\n\t\t\tthis.$emit(\"update:topic\", this.modal_topic);\n\t\t\tthis.$emit(\"submit\");\n\t\t},\n\n\t\tprofilUpdateEmit: function (event) {\n\t\t\t//? passes the updated profil information to the parent component\n\t\t\tthis.$emit(\"update:profilUpdate\", event);\n\t\t},\n\n\t\tupdateOptions: function (event, item) {\n\t\t\tthis.properties = item;\n\t\t\tthis.data = item.data;\n\t\t\tthis.view = item.view;\n\t\t\tif (item.title) {\n\t\t\t\t//? emits the selected topic to the parent component\n\t\t\t\tthis.modal_topic = item.topic;\n\t\t\t\tthis.$emit(\"update:topic\", this.modal_topic);\n\n\t\t\t\t//? emits the new item for the breadcrumb in the parent component\n\t\t\t\tthis.breadcrumbItems.push(item.title);\n\t\t\t} else {\n\t\t\t\tif (item.data.kontakttyp) {\n\t\t\t\t\tthis.breadcrumbItems.push(item.data.kontakttyp);\n\t\t\t\t\tthis.breadcrumbItems.push(item.data.kontakt);\n\t\t\t\t} else if (item.data.strasse) {\n\t\t\t\t\tthis.breadcrumbItems.push(item.data.strasse);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.$emit(\"update:breadcrumb\", this.breadcrumbItems);\n\t\t},\n\t},\n\tcomputed: {},\n\tcreated() {\n\t\t//? JSON parse and stringify are used to deep clone the objects\n\t\tthis.properties = {...this.list};\n\t\tthis.data = this.list.data\n\t\t\t? JSON.parse(JSON.stringify(this.list.data))\n\t\t\t: null;\n\t\tthis.view = this.list.view\n\t\t\t? JSON.parse(JSON.stringify(this.list.view))\n\t\t\t: null;\n\t},\n\tmounted() {\n\t},\n\n\ttemplate: /*html*/ `\n \n \n `,\n};\n","export default {\n props: {\n data: Object,\n },\n\n data() {\n return {\n originalValue: null,\n zustellKontakteCount: null,\n };\n },\n\n inject: [\"getZustellkontakteCount\"],\n\n methods: {\n updateValue: function (event, bind) {\n if (bind === \"zustellung\") {\n this.data[bind] = event.target.checked;\n } else {\n //? sets the value of a property to null when an empty string is entered to keep the isChanged function valid\n this.data[bind] = event.target.value === \"\" ? null : event.target.value;\n }\n this.$emit(\"profilUpdate\", this.isChanged ? this.data : null);\n this.zustellKontakteCount = this.getZustellkontakteCount();\n },\n },\n\n computed: {\n showZustellKontakteWarning: function () {\n\t // if the kontakt is already a zustellungskontakt when the user is editing the kontakt, then no warning is shown and the zustellung will be overwritten\n\t if (JSON.parse(this.originalValue).zustellung) {\n\t return false;\n\t }\n\t const kontakteOfSelectedType = this.zustellKontakteCount.filter((element) => {\n\t\t return element.kontakttyp === this.data?.kontakttyp\n\t });\n // if zustellKontakteCount is not 0 and the own kontakt has the flag zustellung set to true\n if (!this.zustellKontakteCount.some((element) => element.kontakt_id === this.data.kontakt_id)) {\n return this.data.zustellung && kontakteOfSelectedType.length;\n }\n return this.kontakteOfSelectedType.length >= 2 && this.data.zustellung;\n },\n isChanged: function () {\n //? returns true if the original passed data object was changed\n if (!this.data.kontakt || !this.data.kontakttyp) {\n return false;\n }\n return JSON.stringify(this.data) !== this.originalValue;\n },\n },\n\n created() {\n this.originalValue = JSON.stringify(this.data);\n this.zustellKontakteCount = this.getZustellkontakteCount();\n },\n \n template:\n /*html*/\n `\n\n
    \n\n
    \n\n\n
    \n
    {{$p.t('profilUpdate','kontaktTyp')}}
    \n\n \n
    \n\n
    \n
    \n\n \n\n\n
    \n
    {{data.kontakttyp?data.kontakttyp:$p.t('global','kontakt')}}
    \n\n \n
    \n\n
    \n
    \n\n
    \n
    {{$p.t('global','anmerkung')}}
    \n\n \n
    \n\n
    \n\n \n
    \n
    \n {{$p.t('profilUpdate','zustell_kontakte_warning')}}\n
    \n
    \n \n\n
    \n {{$p.t('profilUpdate','zustellungsKontakt')}}\n\n \n
    \n
    \n `,\n};\n","import Dms from \"../../../../Form/Upload/Dms.js\";\n\nimport ApiProfil from '../../../../../api/factory/profil.js';\n\nexport default {\n components: {\n AutoComplete: primevue.autocomplete,\n\tDms: Dms\n },\n\n props: {\n data: Object,\n files: {\n type: Array,\n default: []\n },\n },\n\n inject: [\"getZustelladressenCount\", \"updateFileID\", \"isMitarbeiter\"],\n\n data() {\n return {\n gemeinden: [],\n ortschaftnamen: [],\n selectedNation: null,\n nationenList: [],\n originalValue: null,\n zustellAdressenCount: null,\n\t dmsData: [],\n\t fileschanged: false\n };\n },\n\n watch: {\n \"data.gemeinde\": function (newValue, oldValue) {\n this.$emit(\"profilUpdate\", this.isChanged ? this.data : null);\n },\n \"data.ort\": function (newValue, oldValue) {\n this.$emit(\"profilUpdate\", this.isChanged ? this.data : null);\n },\n },\n\n methods: {\n\n autocompleteSearchGemeinden: function (event) {\n this.gemeinden = this.gemeinden.map((gemeinde) => gemeinde);\n },\n\n autocompleteSearchOrtschaftsnamen: function (event) {\n this.ortschaftnamen = this.ortschaftnamen.map((ortschaft) => ortschaft);\n },\n\n getGemeinde: function () {\n //? only query the gemeinde is the nation is Austria and the PLZ is greater than 999 and less than 32000\n if (\n this.data.nation &&\n this.data.nation === \"A\" &&\n this.data.plz &&\n this.data.plz > 999 &&\n this.data.plz < 32000\n ) {\n this.$api\n .call(ApiProfil.getGemeinden(this.data.nation, this.data.plz))\n .then((res) => {\n if (res.data.length) {\n this.gemeinden = [\n ...new Set(\n res.data.map((element) => {\n return element.name;\n })\n ),\n ];\n this.ortschaftnamen = [\n ...new Set(\n res.data.map((element) => {\n return element.ortschaftsname;\n })\n ),\n ];\n }\n });\n } else {\n this.gemeinden = [];\n }\n },\n\n updateValue: function (event, bind) {\n //? sets the value of a property to null when an empty string is entered to keep the isChanged function valid\n if (bind === \"zustelladresse\") {\n this.data[bind] = event.target.checked;\n\t } else if(bind === 'files') {\n\t\t if(this.dmsData.length > 0 && this.dmsData[0].type !== 'application/x.fhc-dms+json') {\n\t\t this.fileschanged = true;\n\t\t }\n\t\t this.updateFileID(this.dmsData);\n } else {\n this.data[bind] = event.target.value === \"\" ? null : event.target.value;\n }\n\n this.$emit(\"profilUpdate\", this.isChanged ? this.data : null);\n // update the zustellAdressen count\n this.zustellAdressenCount = this.getZustelladressenCount();\n },\n\n\tdeleteDmsData: function() {\n\t\tthis.dmsData = [];\n\t\tthis.updateValue(null, 'files');\n\t}\n },\n\n computed: {\n showZustellAdressenWarning: function () {\n\n\t // if the address was already a zustellungsadresse when editing the address, then the warning will not be shown and the zustellungsadresse will just be overwritten\n\t if (JSON.parse(this.originalValue).zustelladresse){\n\t\treturn false;\n\t }\n // if zustellAdressenCount is not 0 and the own kontakt has the flag zustellung set to true\n if (!this.zustellAdressenCount.includes(this.data.adresse_id)) {\n return this.data.zustelladresse && this.zustellAdressenCount.length;\n }\n return this.zustellAdressenCount.length >= 2 && this.data.zustelladresse;\n },\n isChanged: function () {\n if (\n !this.data.strasse ||\n !this.data.plz ||\n !this.data.ort ||\n !this.data.typ ||\n this.dmsData.length === 0\n ) {\n return false;\n }\n\n const datachanged = this.originalValue !== JSON.stringify(this.data);\n return datachanged || this.fileschanged;\n },\n },\n\n created() {\n // get all available nationen\n this.$api\n .call(ApiProfil.getAllNationen())\n .then(res => {\n this.nationenList = res.data;\n this.getGemeinde();\n });\n \n this.originalValue = JSON.stringify(this.data);\n this.zustellAdressenCount = this.getZustelladressenCount();\n },\n\n mounted() {\n if (this.files) {\n this.dmsData = this.files;\n }\n },\n\n template: /*html*/ `\n
    \n \n
    \n
    \n\t {{$p.t('profilUpdate','zustell_adressen_warning')}}\n
    \n
    \n \n\n\n
    \n
    \n \n \n
    \n
    \n\n \n
    \n
    \n
    {{$p.t('person','nation')}}*
    \n \n
    \n
    \n\n \n
    \n
    \n
    {{$p.t('person','plz')}}*
    \n \n
    \n
    \n\n \n
    \n
    \n
    {{$p.t('person','gemeinde')}}*
    \n \n
    \n
    \n\n \n
    \n
    \n
    {{$p.t('person','ort')}}*
    \n \n
    \n
    \n\n \n
    \n
    \n
    {{$p.t('person','strasse')}}*
    \n \n
    \n
    \n \n \n
    \n
    \n
    {{$p.t('profilUpdate','kontaktTyp')}}*
    \n \n
    \n
    \n\n\t
    \n\t\t
    \n\t\t\t
    {{$p.t('profilUpdate','meldebestaetigung')}}*
    \n\t\t\t\n\t\t
    \n\t\t
    \n\t\t\t
     
    \n\t\t\t\n\t\t
    \n\t
    \n\n
    \n `,\n};\n","import Adresse from \"../../ProfilComponents/Adresse.js\";\nimport Kontakt from \"../../ProfilComponents/Kontakt.js\";\n\nimport ApiProfilUpdate from '../../../../../api/factory/profilUpdate.js';\n\nexport default {\n components: {\n Adresse,\n Kontakt,\n },\n inject: [\"profilUpdateTopic\"],\n data() {\n return {\n files: null,\n };\n },\n methods: {\n getDocumentLink: function (dms_id) {\n return (\n FHC_JS_DATA_STORAGE_OBJECT.app_root +\n FHC_JS_DATA_STORAGE_OBJECT.ci_router +\n `/Cis/ProfilUpdate/show/${dms_id}`\n );\n },\n },\n computed: {\n getComponentView: function () {\n if (\n this.topic == this.profilUpdateTopic[\"Private Adressen\"] ||\n this.topic == this.profilUpdateTopic[\"Add Adresse\"] ||\n this.topic == this.profilUpdateTopic[\"Delete Adresse\"]\n ) {\n return \"Adresse\";\n } else if (\n this.topic == this.profilUpdateTopic[\"Private Kontakte\"] ||\n this.topic == this.profilUpdateTopic[\"Add Kontakt\"] ||\n this.topic == this.profilUpdateTopic[\"Delete Kontakt\"]\n ) {\n return \"Kontakt\";\n } else {\n return \"text_input\";\n }\n },\n cardHeader: function () {\n if (\n this.topic == this.profilUpdateTopic[\"Delete Addresse\"] ||\n this.topic == this.profilUpdateTopic[\"Delete Kontakt\"]\n ) {\n return \"Delete\";\n } else if (\n this.topic == this.profilUpdateTopic[\"Add Adresse\"] ||\n this.topic == this.profilUpdateTopic[\"Add Kontakt\"]\n ) {\n return \"Add\";\n } else {\n return \"Update\";\n }\n },\n },\n props: {\n data: { type: Object },\n view: { type: String },\n status: { type: String },\n status_message: { type: String },\n status_timestamp: { type: String },\n updateID: { type: Number },\n topic: { type: String },\n },\n created() {\n this.$api\n .call(ApiProfilUpdate.getProfilRequestFiles(this.updateID))\n .then((res) => {\n this.files = res.data;\n });\n },\n template: /*html*/ `\n
    \n\n
    \n
    \n
    {{$p.t('global','status')}}
    \n {{status}} \n
    \n
    \n\n
    \n
    \n
    {{$p.t('global','datum')}}
    \n {{status_timestamp}} \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    {{$p.t('profilUpdate','statusMessage')}}
    \n \n
    \n
    \n
    \n\n\n
    \n
    \n \n {{cardHeader}} \n
    \n
    \n \n \n \n
    \n
    \n\n\t
    \n\t\t
    {{$p.t('profilUpdate','nachweisdokumente')}}
    \n\t\t
    \n\t\t\t{{file.name}}\n\t\t
    \n\t
    \n `,\n};\n","import Dms from \"../../../../Form/Upload/Dms.js\";\n\nexport default {\n data() {\n return {\n dmsData: [],\n originalValue: null,\n };\n },\n components: {\n Dms,\n },\n props: {\n data: {\n type: Object,\n },\n withFiles: {\n type: Boolean,\n default: false,\n },\n files: {\n type: Array,\n },\n updateID: {\n type: Boolean,\n },\n },\n inject:[\"updateFileID\"],\n computed: {\n didFilesChange: function () {\n this.updateFileID(this.dmsData);\n let res = false;\n //? case in which the profilRequest has already associated files \n if(this.files){ \n Array.from(this.dmsData).forEach((file) => {\n if (this.files.some((f) => f.name !== file.name)) {\n res = true;\n }\n });\n return !(this.dmsData.length == this.files.length) || res;\n }\n //? case in which the user creates a new profilRequest\n else{ \n return Array.from(this.dmsData).length? true:false;\n }\n },\n didDataChange: function(){\n return JSON.stringify(this.data) !== this.originalValue;\n },\n isChanged: function () {\n if (this.withFiles) {\n if(this.updateID){\n return (this.didDataChange || this.didFilesChange) && this.dmsData.length;\n }\n return this.didDataChange && this.didFilesChange;\n }\n return this.didDataChange\n },\n },\n emits: [\"profilUpdate\"],\n watch: {\n //? watcher to trigger the event emit when a file was uploaded or removed\n dmsData(value) {\n this.emitChanges();\n },\n },\n methods: {\n stringifyFile(file) {\n\t\t\treturn JSON.stringify({\n\t\t\t\tlastModified: file.lastModified,\n\t\t\t\tlastModifiedDate: file.lastModifiedDate,\n\t\t\t\tname: file.name,\n\t\t\t\tsize: file.size,\n\t\t\t\ttype: file.type\n\t\t\t});\n\t\t},\n emitChanges: function () {\n if (this.isChanged) {\n \n this.$emit(\n \"profilUpdate\", { value: this.data.value }\n );\n } else {\n this.$emit(\"profilUpdate\", null);\n }\n },\n },\n mounted() {\n this.originalValue = JSON.stringify(Vue.toRaw(this.data));\n\n if (this.files) {\n this.dmsData = this.files;\n }\n },\n template: /*html*/`\n\n

    {{$p.t('profilUpdate','profilUpdateInformationMessage',[data.titel])}}

    \n\n
    \n
    {{data.titel?data.titel:$p.t('global','titel')}}
    \n\n \n\n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n `,\n};\n","import BsModal from './Bootstrap/Modal.js';\n\nexport default {\n\tcomponents: {\n\t\tBsModal\n\t},\n\tprops: {\n\t\ttimeout: {\n\t\t\ttype: Number,\n\t\t\tdefault: 300\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tt: null,\n\t\t\tstate: 0\n\t\t}\n\t},\n\tmethods: {\n\t\tshow() {\n\t\t\tswitch (this.state) {\n\t\t\t\tcase 0:\n\t\t\t\t\tif (this.timeout) {\n\t\t\t\t\t\tthis.state = 1;\n\t\t\t\t\t\tthis.t = window.setTimeout(() => this.$refs.modal.show(), this.timeout);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t} else\n\t\t\t\t\t\treturn this.$refs.modal.show();\n\t\t\t\tcase 4:\n\t\t\t\t\treturn window.setTimeout(() => this.show(), 1);\n\t\t\t}\n\t\t},\n\t\thide() {\n\t\t\tswitch (this.state) {\n\t\t\t\tcase 1:\n\t\t\t\t\treturn window.clearTimeout(this.t);\n\t\t\t\tcase 2:\n\t\t\t\t\treturn window.setTimeout(() => this.hide(), 1);\n\t\t\t\tcase 3:\n\t\t\t\t\tthis.$refs.modal.hide();\n\t\t\t}\n\t\t}\n\t},\n\tmounted() {\n\t\tthis.$refs.modal.$refs.modal.addEventListener('show.bs.modal', () => {\n\t\t\tthis.state = 2;\n\t\t});\n\t\tthis.$refs.modal.$refs.modal.addEventListener('shown.bs.modal', () => {\n\t\t\tthis.state = 3;\n\t\t});\n\t\tthis.$refs.modal.$refs.modal.addEventListener('hide.bs.modal', () => {\n\t\t\tthis.state = 4;\n\t\t});\n\t\tthis.$refs.modal.$refs.modal.addEventListener('hidden.bs.modal', () => {\n\t\t\tthis.state = 0;\n\t\t});\n\t},\n\ttemplate: `\n\t\n\t\tLoading...\n\t`\n}","import BsModal from \"../../../Bootstrap/Modal.js\";\nimport Alert from \"../../../Bootstrap/Alert.js\";\nimport EditProfilSelect from \"./EditProfilSelect.js\";\nimport Loader from \"../../../Loader.js\";\n\nimport ApiProfilUpdate from '../../../../api/factory/profilUpdate.js';\n\nexport default {\n\tcomponents: {\n\t\tBsModal,\n\t\tAlert,\n\t\tEditProfilSelect,\n\t\tLoader,\n\t},\n\tmixins: [BsModal],\n\tprops: {\n\t\tisMitarbeiter: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t},\n\t\tvalue: Object,\n\t\ttitel: String,\n\t\tzustelladressenCount: Function,\n\t\tzustellkontakteCount: Function,\n\t\t/*\n\t\t * NOTE(chris):\n\t\t * Hack to expose in \"emits\" declared events to $props which we use\n\t\t * in the v-bind directive to forward all events.\n\t\t * @see: https://github.com/vuejs/core/issues/3432\n\t\t */\n\t\tonHideBsModal: Function,\n\t\tonHiddenBsModal: Function,\n\t\tonHidePreventedBsModal: Function,\n\t\tonShowBsModal: Function,\n\t\tonShownBsModal: Function,\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\ttopic: null,\n\t\t\tprofilUpdate: null,\n\t\t\teditData: this.value,\n\t\t\tfileID: null,\n\t\t\tbreadcrumb: null,\n\t\t\tloading: false,\n\t\t\tresult: false,\n\t\t\tinfo: null,\n\t\t};\n\t},\n\tinject: [\"setLoading\"],\n\tprovide() {\n\t\treturn {\n\t\t\tupdateFileID: this.updateFileIDFunction,\n\t\t\tisMitarbeiter: this.isMitarbeiter\n\t\t};\n\t},\n\n\tmethods: {\n\t\tupdateFileIDFunction: function (newFileID) {\n\t\t\tthis.fileID = newFileID;\n\t\t},\n\n\t\thandleFailedError: function (err) {\n\t\t\tconsole.error(err);\n\t\t\tthis.loading = false;\n\t\t\tthis.setLoading(false);\n\t\t\tthis.result = false;\n\t\t\tthis.hide();\n\t\t},\n\n\t\tasync submitProfilChange() {\n\n\t\t\t//? check if data is valid before making a request\n\t\t\tif (this.topic && this.profilUpdate) {\n\t\t\t\t//? if profil update contains any attachment\n\t\t\t\tif (this.fileID) {\n\t\t\t\t\tconst fileData = await this.uploadFiles(this.fileID);\n\n\t\t\t\t\tthis.fileID = fileData ? fileData : null;\n\t\t\t\t}\n\n\t\t\t\t//? inserts new row in public.tbl_cis_profil_update\n\t\t\t\t//* calls the update api call if an update field is present in the data that was passed to the modal\n\t\t\t\tconst handleApiResponse = (res) => {\n\t\t\t\t\t//? toggles the loading to false and closes the loading modal\n\t\t\t\t\tif (res.data.error) {\n\t\t\t\t\t\tthis.result = false;\n\t\t\t\t\t\tAlert.popup(\n\t\t\t\t\t\t\t\"Ein Fehler ist aufgetreten: \" + JSON.stringify(res.data.retval)\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.result = true;\n\t\t\t\t\t\tAlert.popup(\n\t\t\t\t\t\t\t\"Ihre Anfrage wurde erfolgreich gesendet. Bitte warten Sie, während sich das Team um Ihre Anfrage kümmert.\"\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t//* v-show on EditProfil modal binded to this.loading\n\t\t\t\t//? hides the EditProfil modal and shows the loading modal by calling a callback that was passed as prop from the parent component\n\t\t\t\tthis.loading = true;\n\t\t\t\tthis.setLoading(true);\n\n\t\t\t\t//? if an updateID is present, updateProfilRequest is called, else insertProfilRequest is called\n\t\t\t\tthis.editData.updateID ?\n\t\t\t\t\tthis.$api\n\t\t\t\t\t\t.call(ApiProfilUpdate.updateProfilRequest(\n\t\t\t\t\t\t\tthis.topic,\n\t\t\t\t\t\t\tthis.profilUpdate,\n\t\t\t\t\t\t\tthis.editData.updateID,\n\t\t\t\t\t\t\tthis.fileID ? this.fileID[0] : null\n\t\t\t\t\t\t))\n\t\t\t\t\t\t.then((res) => {\n\t\t\t\t\t\t\thandleApiResponse(res);\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch((err) => this.$fhcAlert.handleSystemError)\n\t\t\t\t\t\t.finally(() => {\n\t\t\t\t\t\t\tthis.loading = false;\n\t\t\t\t\t\t\tthis.setLoading(false);\n\t\t\t\t\t\t\tthis.hide();\n\t\t\t\t\t\t})\n\t\t\t\t\t:\n\t\t\t\t\tthis.$api\n\t\t\t\t\t\t.call(ApiProfilUpdate.insertProfilRequest(\n\t\t\t\t\t\t\tthis.topic,\n\t\t\t\t\t\t\tthis.profilUpdate,\n\t\t\t\t\t\t\tthis.fileID ? this.fileID[0] : null\n\t\t\t\t\t\t))\n\t\t\t\t\t\t.then((res) => {\n\t\t\t\t\t\t\thandleApiResponse(res);\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch((err) => this.$fhcAlert.handleSystemError)\n\t\t\t\t\t\t.finally(() => {\n\t\t\t\t\t\t\tthis.loading = false;\n\t\t\t\t\t\t\tthis.setLoading(false);\n\t\t\t\t\t\t\tthis.hide();\n\t\t\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\tuploadFiles: async function (files) {\n\t\t\tif (files[0].type !== \"application/x.fhc-dms+json\") {\n\t\t\t\tlet formData = new FormData();\n\t\t\t\tformData.append(\"files[]\", files[0]);\n\t\t\t\tconst result = this.editData.updateID\n\t\t\t\t\t? //? updating old attachment by replacing\n\t\t\t\t\t //* second parameter of api request insertFile checks if the file has to be replaced or not\n\t\t\t\t\tawait this.$api\n\t\t\t\t\t\t.call(ApiProfilUpdate.insertFile(\n\t\t\t\t\t\t\tformData,\n\t\t\t\t\t\t\tthis.editData.updateID\n\t\t\t\t\t\t))\n\t\t\t\t\t\t.then((res) => {\n\t\t\t\t\t\t\treturn res.data?.map((file) => file.dms_id);\n\t\t\t\t\t\t})\n\t\t\t\t\t: //? fresh insert of new attachment\n\t\t\t\t\tawait this.$api\n\t\t\t\t\t\t.call(ApiProfilUpdate.insertFile(formData))\n\t\t\t\t\t\t.then((res) => {\n\t\t\t\t\t\t\treturn res.data?.map((file) => file.dms_id);\n\t\t\t\t\t\t});\n\t\t\t\treturn result;\n\t\t\t} else {\n\t\t\t\t//? attachment hasn't been replaced\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t},\n\tcomputed: {\n\t\tshowFooter: function () {\n\t\t\tswitch (this.value.view) {\n\t\t\t\tcase 'Status':\n\t\t\t\t\treturn false;\n\t\t\t\tcase 'Kontakt':\n\t\t\t\t\treturn false;\n\t\t\t\tcase 'Adresse':\n\t\t\t\t\treturn false;\n\t\t\t\tdefault:\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\t},\n\tcreated() {\n\t\tif (this.editData.topic) {\n\t\t\t//? if the topic was passed through the prop add it to the component\n\t\t\tthis.topic = this.editData.topic;\n\t\t}\n\t},\n\tmounted() {\n\t\tthis.modal = this.$refs.modalContainer.modal;\n\t},\n\tpopup(options) {\n\t\tBsModal.popup.bind(this);\n\t\treturn BsModal.popup(null, options);\n\t},\n\ttemplate: /*html*/ `\n\n\t\n\t\n\t\n\t\n \n`,\n};\n","import EditProfil from \"../ProfilModal/EditProfil.js\";\n\nimport ApiProfil from '../../../../api/factory/profil.js';\nimport ApiProfilUpdate from '../../../../api/factory/profilUpdate.js';\n\n//? EditProfil is the modal used to edit the profil updates\nexport default {\n\tcomponents: {EditProfil},\n\tprops: {\n\t\tdata: {\n\t\t\ttype: Object,\n\t\t},\n\t},\n\n\tinject: [\n\t\t\"getZustellkontakteCount\",\n\t\t\"getZustelladressenCount\",\n\t\t\"profilUpdateStates\",\n\t\t\"profilUpdateTopic\",\n\t],\n\n\temits: [\"fetchUpdates\"],\n\n\tdata() {\n\t\treturn {\n\t\t\tshowUpdateModal: false,\n\t\t\tcontent: null,\n\t\t\teditProfilTitle: this.$p.t(\"profil\", \"profilBearbeiten\"),\n\t\t};\n\t},\n\n\tmethods: {\n\t\thideEditProfilModal: function () {\n\t\t\t//? checks the editModal component property result, if the user made a successful request or not\n\t\t\tif (this.$refs.updateEditModal.result) {\n\t\t\t\tthis.$emit(\"fetchUpdates\");\n\t\t\t} else {\n\t\t\t\t// when modal was closed without submitting request\n\t\t\t}\n\t\t\tthis.showUpdateModal = false;\n\t\t},\n\n\t\tasync showEditProfilModal(updateRequest) {\n\n\t\t\tlet view = this.getView(updateRequest.topic, updateRequest.status);\n\n\t\t\tlet data = null;\n\t\t\tlet content = null;\n\t\t\tlet files = null;\n\t\t\tlet withFiles = false;\n\n\t\t\tif (view === \"TextInputDokument\") {\n\t\t\t\tdata = {\n\t\t\t\t\ttitel: updateRequest.topic,\n\t\t\t\t\tvalue: updateRequest.requested_change.value,\n\t\t\t\t};\n\n\t\t\t\tconst filesFromDatabase =\n\t\t\t\t\tawait this.$api\n\t\t\t\t\t\t.call(ApiProfilUpdate.getProfilRequestFiles(\n\t\t\t\t\t\t\tupdateRequest.profil_update_id\n\t\t\t\t\t\t))\n\t\t\t\t\t\t.then((res) => {\n\t\t\t\t\t\t\treturn res.data;\n\t\t\t\t\t\t});\n\n\t\t\t\tfiles = filesFromDatabase;\n\t\t\t\tif (files) {\n\t\t\t\t\twithFiles = true;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdata = updateRequest.requested_change;\n\t\t\t}\n\n\t\t\tcontent = {\n\t\t\t\tupdateID: updateRequest.profil_update_id,\n\t\t\t\tview: view,\n\t\t\t\tdata: data,\n\t\t\t\twithFiles: withFiles,\n\t\t\t\ttopic: updateRequest.topic,\n\t\t\t\tfiles: files,\n\t\t\t};\n\n\t\t\tif (view === \"EditAdresse\") {\n\n\t\t\t\tconst isMitarbeiter = await this.$api.call(ApiProfil.isMitarbeiter(updateRequest.uid)).then((res) => res.data);\n\n\t\t\t\tif (isMitarbeiter) {\n\t\t\t\t\tcontent[\"isMitarbeiter\"] = isMitarbeiter;\n\t\t\t\t}\n\n\t\t\t\tconst filesFromDatabase =\n\t\t\t\t\tawait this.$api\n\t\t\t\t\t\t.call(ApiProfilUpdate.getProfilRequestFiles(\n\t\t\t\t\t\t\tupdateRequest.profil_update_id\n\t\t\t\t\t\t))\n\t\t\t\t\t\t.then((res) => {\n\t\t\t\t\t\t\treturn res.data;\n\t\t\t\t\t\t});\n\n\t\t\t\tfiles = filesFromDatabase;\n\t\t\t\tcontent[\"files\"] = files;\n\t\t\t}\n\n\t\t\t//? adds the status information if the profil update request was rejected or accepted\n\t\t\tif (updateRequest.status !== this.profilUpdateStates[\"Pending\"]) {\n\t\t\t\tcontent[\"status\"] = updateRequest.status;\n\t\t\t\tcontent[\"status_message\"] = updateRequest.status_message;\n\t\t\t\tcontent[\"status_timestamp\"] = updateRequest.status_timestamp;\n\t\t\t}\n\n\t\t\t//? update data of the reactive content\n\t\t\tthis.content = content;\n\t\t\tthis.editProfilTitle = updateRequest.topic;\n\n\t\t\t//? only show the popup if also the right content is available\n\t\t\tif (content) {\n\t\t\t\tthis.showUpdateModal = true;\n\t\t\t\t// after a state change, wait for the DOM updates to complete\n\t\t\t\tVue.nextTick(() => {\n\t\t\t\t\tthis.$refs.updateEditModal.show();\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\tdeleteRequest: function (item) {\n\t\t\tthis.$api\n\t\t\t\t.call(ApiProfilUpdate.deleteProfilRequest(item.profil_update_id))\n\t\t\t\t.then((res) => {\n\t\t\t\t\tif (res.data.error) {\n\t\t\t\t\t\t//? open alert\n\t\t\t\t\t\tconsole.error(\"error happened\", res.data);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.$emit(\"fetchUpdates\");\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t},\n\n\t\tgetView: function (topic, status) {\n\t\t\tif (!(status === this.profilUpdateStates[\"Pending\"])) {\n\t\t\t\treturn \"Status\";\n\t\t\t}\n\n\t\t\tswitch (topic) {\n\t\t\t\tcase this.profilUpdateTopic[\"Private Kontakte\"]:\n\t\t\t\t\treturn \"EditKontakt\";\n\t\t\t\tcase this.profilUpdateTopic[\"Add Kontakt\"]:\n\t\t\t\t\treturn \"EditKontakt\";\n\t\t\t\tcase this.profilUpdateTopic[\"Delete Kontakt\"]:\n\t\t\t\t\treturn \"Kontakt\";\n\t\t\t\tcase this.profilUpdateTopic[\"Private Adressen\"]:\n\t\t\t\t\treturn \"EditAdresse\";\n\t\t\t\tcase this.profilUpdateTopic[\"Add Adresse\"]:\n\t\t\t\t\treturn \"EditAdresse\";\n\t\t\t\tcase this.profilUpdateTopic[\"Delete Adresse\"]:\n\t\t\t\t\treturn \"Adresse\";\n\t\t\t\tdefault:\n\t\t\t\t\treturn \"TextInputDokument\";\n\t\t\t}\n\t\t},\n\n\t},\n\tcreated() {\n\t},\n\n\tcomputed: {},\n\n\ttemplate: /*html*/ `\n
    \n \n
    {{$p.t('profilUpdate','profilUpdates')}}
    \n
    \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    {{$p.t('profilUpdate','topic')}}{{$p.t('global','status')}}{{$p.t('global','datum')}}{{$p.t('ui','aktion')}}
    {{item.topic}}{{item.status}}{{item.status_timestamp?item.status_timestamp:item.insertamum}}
    \n
    \n
    \n
    \n`,\n};\n","if (!primevue) {\n\tconsole.error('PrimeVue not loaded!');\n}\n\n// NOTE(chris): Click on clear button gives an error. This is a bug in primevue => fixed in current version\nTabulator.extendModule('filter', 'filters', {\n\t\"dates\": (headerValue, rowValue) => {\n\t\tif (!headerValue)\n\t\t\treturn true;\n\n\t\tlet rowDate = new Date(rowValue);\n\n\t\tif (Array.isArray(headerValue))\n\t\t{\n\t\t\tlet startDate = new Date(headerValue[0]);\n\t\t\tif (headerValue[1])\n\t\t\t{\n\t\t\t\tlet endDate = new Date(headerValue[1]);\n\n\t\t\t\tendDate.setHours(23, 59, 59, 999);\n\n\t\t\t\treturn rowDate >= startDate && rowDate <= endDate;\n\t\t\t}\n\n\t\t\treturn rowDate.toDateString() === startDate.toDateString();\n\t\t}\n\t\tlet singleDate = new Date(headerValue);\n\t\treturn rowDate.toDateString() === singleDate.toDateString();\n\t}\n});\n\nfunction dateFilter(cell, onRendered, success) {\n\tlet div = document.createElement('div');\n\n\tlet initialValue = null;\n\n\tlet val = cell.getValue();\n\n\tif (Array.isArray(val))\n\t{\n\t\tconst start = val[0] ? new Date(val[0]) : null;\n\t\tconst end = val[1] ? new Date(val[1]) : null;\n\t\tinitialValue = [start, end];\n\t}\n\n\tVue.createApp({\n\t\tcomponents: {\n\t\t\tPrimevueCalendar: primevue.calendar\n\t\t},\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tval: initialValue\n\t\t\t}\n\t\t},\n\t\twatch: {\n\t\t\tval(n) {\n\t\t\t\tsuccess(n);\n\t\t\t}\n\t\t},\n\t\ttemplate: `\n\t\t\t\t `\n\t}).use(primevue.config.default).mount(div);\n\n\treturn div;\n}\nexport { dateFilter };","import {CoreFilterCmpt} from \"../../../components/filter/Filter.js\";\nimport Mailverteiler from \"./ProfilComponents/Mailverteiler.js\";\nimport AusweisStatus from \"./ProfilComponents/FhAusweisStatus.js\";\nimport QuickLinks from \"./ProfilComponents/QuickLinks.js\";\nimport Adresse from \"./ProfilComponents/Adresse.js\";\nimport Kontakt from \"./ProfilComponents/Kontakt.js\";\nimport ProfilEmails from \"./ProfilComponents/ProfilEmails.js\";\nimport RoleInformation from \"./ProfilComponents/RoleInformation.js\";\nimport ProfilInformation from \"./ProfilComponents/ProfilInformation.js\";\nimport FetchProfilUpdates from \"./ProfilComponents/FetchProfilUpdates.js\";\nimport EditProfil from \"./ProfilModal/EditProfil.js\";\n\nimport ApiProfilUpdate from '../../../api/factory/profilUpdate.js';\nimport { dateFilter } from '../../../tabulator/filters/Dates.js';\n\nexport default {\n\tcomponents: {\n\t\tCoreFilterCmpt,\n\t\tMailverteiler,\n\t\tAusweisStatus,\n\t\tQuickLinks,\n\t\tAdresse,\n\t\tKontakt,\n\t\tProfilEmails,\n\t\tRoleInformation,\n\t\tProfilInformation,\n\t\tFetchProfilUpdates,\n\t\tEditProfil,\n\t},\n\tinject: [\"sortProfilUpdates\", \"collapseFunction\", \"language\",\"isEditable\"],\n\tdata() {\n\t\treturn {\n\t\t\tshowModal: false,\n\t\t\tcollapseIconBetriebsmittel: true,\n\t\t\teditDataFilter: null,\n\t\t\tpreloadedPhrasen:{},\n\t\t\t// tabulator options\n\t\t\tzutrittsgruppen_table_options: {\n\t\t\t\tpersistenceID: \"filterTableStudentProfilZutrittsgruppen\",\n\t\t\t\tpersistence: {\n\t\t\t\t\tcolumns: false\n\t\t\t\t},\n\t\t\t\tminHeight: 200,\n\t\t\t\tlayout: \"fitColumns\",\n\t\t\t\tcolumns: [{\n\t\t\t\t\ttitle: Vue.computed(() => this.preloadedPhrasen.zutrittsGruppenPhrase),\n\t\t\t\t\tfield: \"bezeichnung\"\n\t\t\t\t}],\n\t\t\t},\n\t\t\tbetriebsmittel_table_options: {\n\t\t\t\tpersistenceID: \"filterTableStudentProfilBetriebsmittel\",\n\t\t\t\tpersistence: {\n\t\t\t\t\tcolumns: false\n\t\t\t\t},\n\t\t\t\tminHeight: 300,\n\t\t\t\tlayout: \"fitColumns\",\n\t\t\t\tresponsiveLayout: \"collapse\",\n\t\t\t\tresponsiveLayoutCollapseUseFormatters: false,\n\t\t\t\tresponsiveLayoutCollapseFormatter: Vue.$collapseFormatter,\n\t\t\t\tcolumns: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle:\n\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\tfield: \"collapse\",\n\t\t\t\t\t\theaderSort: false,\n\t\t\t\t\t\theaderFilter: false,\n\t\t\t\t\t\tformatter: \"responsiveCollapse\",\n\t\t\t\t\t\tmaxWidth: 40,\n\t\t\t\t\t\theaderClick: this.collapseFunction,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: Vue.computed(()=>this.preloadedPhrasen.entlehnteBetriebsmittelPhrase),\n\t\t\t\t\t\tfield: \"betriebsmittel\",\n\t\t\t\t\t\theaderFilter: true,\n\t\t\t\t\t\tminWidth: 200,\n\t\t\t\t\t\tvisible: true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: Vue.computed(() =>this.preloadedPhrasen.inventarnummerPhrase) ,\n\t\t\t\t\t\tfield: \"Nummer\",\n\t\t\t\t\t\theaderFilter: true,\n\t\t\t\t\t\tresizable: true,\n\t\t\t\t\t\tminWidth: 200,\n\t\t\t\t\t\tvisible: true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: Vue.computed(() =>this.preloadedPhrasen.ausgabedatum) ,\n\t\t\t\t\t\tfield: \"Ausgegeben_am\",\n\t\t\t\t\t\theaderFilterFunc: 'dates',\n\t\t\t\t\t\theaderFilter: dateFilter,\n\t\t\t\t\t\tminWidth: 200,\n\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\tformatter:\"datetime\",\n\t\t\t\t\t\tformatterParams: this.datetimeFormatterParams()\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t};\n\t},\n\n\tprops: {\n\t\tdata: Object,\n\t\teditData: Object,\n\t},\n\tprovide() {\n\t\treturn {\n\t\t\tstudiengang_kz: Vue.computed({ get: () => this.data.studiengang_kz }),\n\t\t}\n\t},\n\tmethods: {\n\n\t\tbetriebsmittelTableBuilt: function () {\n\t\t\tthis.$refs.betriebsmittelTable.tabulator.setColumns(this.betriebsmittel_table_options.columns)\n\t\t\tthis.$refs.betriebsmittelTable.tabulator.setData(this.data.mittel);\n\t\t},\n\t\tzutrittsgruppenTableBuilt: function () {\n\t\t\tthis.$refs.zutrittsgruppenTable.tabulator.setColumns(this.zutrittsgruppen_table_options.columns)\n\t\t\tthis.$refs.zutrittsgruppenTable.tabulator.setData(\n\t\t\t\tthis.data.zuttritsgruppen\n\t\t\t);\n\t\t},\n\t\tfetchProfilUpdates: function () {\n\t\t\tthis.$api\n\t\t\t\t.call(ApiProfilUpdate.selectProfilRequest())\n\t\t\t\t.then((res) => {\n\t\t\t\t\tif (!res.error && res) {\n\t\t\t\t\t\tthis.data.profilUpdates = res.data?.length\n\t\t\t\t\t\t\t? res.data.sort(this.sortProfilUpdates)\n\t\t\t\t\t\t\t: null;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t},\n\n\t\thideEditProfilModal: function () {\n\t\t\t//? checks the editModal component property result, if the user made a successful request or not\n\t\t\tif (this.$refs.editModal.result) {\n\t\t\t\tthis.$api\n\t\t\t\t\t.call(ApiProfilUpdate.selectProfilRequest())\n\t\t\t\t\t.then((request) => {\n\t\t\t\t\t\tif (!request.error && request.data) {\n\t\t\t\t\t\t\tthis.data.profilUpdates = request.data;\n\t\t\t\t\t\t\tthis.data.profilUpdates.sort(this.sortProfilUpdates);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconsole.error(\"Error when fetching profile updates: \" + request);\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t.catch((err) => {\n\t\t\t\t\t\tconsole.error(err);\n\t\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// when modal was closed without submitting request\n\t\t\t}\n\t\t\tthis.showModal = false;\n\t\t\tthis.editDataFilter = null;\n\t\t},\n\n\t\tshowEditProfilModal(view) {\n\t\t\tif (view) {\n\t\t\t\tthis.editDataFilter = view;\n\t\t\t}\n\t\t\tthis.showModal = true;\n\t\t\t// after a state change, wait for the DOM updates to complete\n\t\t\tVue.nextTick(() => {\n\t\t\t\tthis.$refs.editModal.show();\n\t\t\t});\n\t\t},\n\t\tdatetimeFormatterParams: function() {\n\t\t\tconst params = {\n\t\t\t\tinputFormat:\"yyyy-MM-dd\",\n\t\t\t\toutputFormat:\"dd.MM.yyyy\",\n\t\t\t\tinvalidPlaceholder:\"(invalid date)\",\n\t\t\t\ttimezone:FHC_JS_DATA_STORAGE_OBJECT.timezone\n\t\t\t};\n\t\t\treturn params;\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t\n\t\tfotoStatus() {\n\t\t\treturn this.data?.fotoStatus ?? null;\n\t\t},\n\n\t\tfilteredEditData() {\n\t\t\treturn this.editDataFilter\n\t\t\t\t? this.editData.data[this.editDataFilter]\n\t\t\t\t: this.editData;\n\t\t},\n\n\t\tprofilInformation() {\n\t\t\tif (!this.data) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tVorname: this.data.vorname,\n\t\t\t\tNachname: this.data.nachname,\n\t\t\t\tUsername: this.data.username,\n\t\t\t\tAnrede: this.data.anrede,\n\t\t\t\tTitel: this.data.titel,\n\t\t\t\tPostnomen: this.data.postnomen,\n\t\t\t\tfoto_sperre: this.data.foto_sperre,\n\t\t\t\tfoto: this.data.foto,\n\t\t\t};\n\t\t},\n\n\t\troleInformation() {\n\t\t\tif (!this.data) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tgeburtsdatum: {\n\t\t\t\t\tlabel: `${this.$p.t('profil','Geburtsdatum')}`,\n\t\t\t\t\tvalue: this.data.gebdatum\n\t\t\t\t},\n\t\t\t\tgeburtsort: {\n\t\t\t\t\tlabel: `${this.$p.t('profil','Geburtsort')}`,\n\t\t\t\t\tvalue: this.data.gebort\n\t\t\t\t},\n\t\t\t\tpersonenkennzeichen: {\n\t\t\t\t\tlabel: `${this.$p.t('person','personenkennzeichen')}`,\n\t\t\t\t\tvalue: this.data.personenkennzeichen\n\t\t\t\t},\n\t\t\t\tstudiengang: {\n\t\t\t\t\tlabel: `${this.$p.t('lehre','studiengang')}`,\n\t\t\t\t\tvalue: this.data.studiengang\n\t\t\t\t},\n\t\t\t\tsemester: {\n\t\t\t\t\tlabel: `${this.$p.t('lehre','semester')}`,\n\t\t\t\t\tvalue: this.data.semester\n\t\t\t\t},\n\t\t\t\tverband: {\n\t\t\t\t\tlabel: `${this.$p.t('lehre','lehrverband')}`,\n\t\t\t\t\tvalue: this.data.verband\n\t\t\t\t},\n\t\t\t\tgruppe: {\n\t\t\t\t\tlabel: `${this.$p.t('lehre','gruppe')}`,\n\t\t\t\t\tvalue: this.data.gruppe.trim()\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\t},\n\tcreated() {\n\t\t// preload phrasen\n\t\tthis.$p.loadCategory('profil').then(() => {\n\t\t\tthis.preloadedPhrasen.zutrittsGruppenPhrase = this.$p.t('profil/zutrittsGruppen');\n\t\t\tthis.preloadedPhrasen.entlehnteBetriebsmittelPhrase = this.$p.t('profil/entlehnteBetriebsmittel');\n\t\t\tthis.preloadedPhrasen.inventarnummerPhrase = this.$p.t('profil/inventarnummer');\n\t\t\tthis.preloadedPhrasen.ausgabedatum = this.$p.t('profil/ausgabedatum');\n\t\t\tthis.preloadedPhrasen.loaded = true;\n\t\t});\n\t\t//? sorts the profil Updates: pending -> accepted -> rejected\n\t\tthis.data.profilUpdates?.sort(this.sortProfilUpdates);\n\t},\n\twatch: {\n\t\t'language.value'(newVal) {\n\t\t\tif(this.$refs.betriebsmittelTable) this.$refs.betriebsmittelTable.tabulator.setColumns(this.betriebsmittel_table_options.columns)\n\t\t\tif(this.$refs.zutrittsgruppenTable) this.$refs.zutrittsgruppenTable.tabulator.setColumns(this.zutrittsgruppen_table_options.columns)\n\t\t}\n\t},\n\ttemplate: /*html*/ `\n
    \n \n \n
    \n \n
    \n \n\n\t\t\t\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t
    \n\t\t\t\n\n\t\t\t\n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t\t{{$p.t('profil','privateKontakte')}}\n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t\t{{$p.t('profil','privateAdressen')}}\n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t
    \n\t\t\t\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\n\t\t
    \n\t\t\n\t\t
    \n\t\t\t\n\t\t\t\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n \n
    \n \n
    \n \n
    \n\n
    \n`,\n};\n","import {CoreFilterCmpt} from \"../../../components/filter/Filter.js\";\nimport EditProfil from \"./ProfilModal/EditProfil.js\";\nimport Adresse from \"./ProfilComponents/Adresse.js\";\nimport Kontakt from \"./ProfilComponents/Kontakt.js\";\nimport FetchProfilUpdates from \"./ProfilComponents/FetchProfilUpdates.js\";\nimport Mailverteiler from \"./ProfilComponents/Mailverteiler.js\";\nimport AusweisStatus from \"./ProfilComponents/FhAusweisStatus.js\";\nimport QuickLinks from \"./ProfilComponents/QuickLinks.js\";\nimport ProfilEmails from \"./ProfilComponents/ProfilEmails.js\";\nimport RoleInformation from \"./ProfilComponents/RoleInformation.js\";\nimport ProfilInformation from \"./ProfilComponents/ProfilInformation.js\";\n\nimport ApiProfilUpdate from '../../../api/factory/profilUpdate.js';\nimport { dateFilter } from '../../../tabulator/filters/Dates.js';\n\nexport default {\n\tcomponents: {\n\t\tCoreFilterCmpt,\n\t\tEditProfil,\n\t\tAdresse,\n\t\tKontakt,\n\t\tFetchProfilUpdates,\n\t\tAusweisStatus,\n\t\tMailverteiler,\n\t\tQuickLinks,\n\t\tProfilEmails,\n\t\tRoleInformation,\n\t\tProfilInformation,\n\t},\n\n\tinject: [\"sortProfilUpdates\", \"collapseFunction\", \"language\",\"isEditable\"],\n\n\tdata() {\n\t\treturn {\n\t\t\tshowModal: false,\n\t\t\teditDataFilter: null,\n\t\t\tpreloadedPhrasen:{},\n\t\t\t// tabulator options\n\t\t\tfunktionen_table_options: {\n\t\t\t\tpersistenceID: \"filterTableMaProfilFunktionen\",\n\t\t\t\tpersistence: {\n\t\t\t\t\tcolumns: false\n\t\t\t\t},\n\t\t\t\tminHeight: 300,\n\t\t\t\tlayout: \"fitColumns\",\n\t\t\t\tresponsiveLayout: \"collapse\",\n\t\t\t\tresponsiveLayoutCollapseUseFormatters: false,\n\t\t\t\tresponsiveLayoutCollapseFormatter: Vue.$collapseFormatter,\n\t\t\t\tcolumns: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle:\n\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\tfield: \"collapse\",\n\t\t\t\t\t\theaderSort: false,\n\t\t\t\t\t\theaderFilter: false,\n\t\t\t\t\t\tformatter: \"responsiveCollapse\",\n\t\t\t\t\t\tmaxWidth: 40,\n\t\t\t\t\t\theaderClick: this.collapseFunction,\n\t\t\t\t\t\tvisible: true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: Vue.computed(() => this.preloadedPhrasen.bezeichnungPhrase),\n\t\t\t\t\t\tfield: \"Bezeichnung\",\n\t\t\t\t\t\theaderFilter: true,\n\t\t\t\t\t\tminWidth: 200,\n\t\t\t\t\t\tvisible: true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: Vue.computed(() => this.preloadedPhrasen.organisationseinheitPhrase),\n\t\t\t\t\t\tfield: \"Organisationseinheit\",\n\t\t\t\t\t\theaderFilter: true,\n\t\t\t\t\t\tminWidth: 200,\n\t\t\t\t\t\tvisible: true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: Vue.computed(() => this.preloadedPhrasen.gueltigVonPhrase),\n\t\t\t\t\t\tfield: \"Gültig_von\",\n\t\t\t\t\t\theaderFilterFunc: 'dates',\n\t\t\t\t\t\theaderFilter: dateFilter,\n\t\t\t\t\t\tresizable: true,\n\t\t\t\t\t\tminWidth: 200,\n\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\tformatter:\"datetime\",\n\t\t\t\t\t\tformatterParams: this.datetimeFormatterParams()\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: Vue.computed(() => this.preloadedPhrasen.gueltigBisPhrase),\n\t\t\t\t\t\tfield: \"Gültig_bis\",\n\t\t\t\t\t\theaderFilterFunc: 'dates',\n\t\t\t\t\t\theaderFilter: dateFilter,\n\t\t\t\t\t\tresizable: true,\n\t\t\t\t\t\tminWidth: 200,\n\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\tformatter:\"datetime\",\n\t\t\t\t\t\tformatterParams: this.datetimeFormatterParams()\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: Vue.computed(() => this.preloadedPhrasen.wochenstundenPhrase),\n\t\t\t\t\t\tfield: \"Wochenstunden\",\n\t\t\t\t\t\theaderFilter: true,\n\t\t\t\t\t\tminWidth: 200,\n\t\t\t\t\t\tvisible: true\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\n\t\t\tbetriebsmittel_table_options: {\n\t\t\t\tpersistenceID: \"filterTableMaProfilBetriebsmittel\",\n\t\t\t\tpersistence: {\n\t\t\t\t\tcolumns: false\n\t\t\t\t},\n\t\t\t\tminHeight: 300,\n\t\t\t\tlayout: \"fitColumns\",\n\t\t\t\tresponsiveLayout: \"collapse\",\n\t\t\t\tresponsiveLayoutCollapseUseFormatters: false,\n\t\t\t\tresponsiveLayoutCollapseFormatter: Vue.$collapseFormatter,\n\t\t\t\tdata: [{betriebsmittel: \"\", Nummer: \"\", Ausgegeben_am: \"\"}],\n\t\t\t\tcolumns: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle:\n\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\tfield: \"collapse\",\n\t\t\t\t\t\theaderSort: false,\n\t\t\t\t\t\theaderFilter: false,\n\t\t\t\t\t\tformatter: \"responsiveCollapse\",\n\t\t\t\t\t\tmaxWidth: 40,\n\t\t\t\t\t\theaderClick: this.collapseFunction,\n\t\t\t\t\t\tvisible: true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: Vue.computed(() => this.preloadedPhrasen.entlehnteBetriebsmittelPhrase),\n\t\t\t\t\t\tfield: \"betriebsmittel\",\n\t\t\t\t\t\theaderFilter: true,\n\t\t\t\t\t\tminWidth: 200,\n\t\t\t\t\t\tvisible: true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: Vue.computed(() => this.preloadedPhrasen.inventarnummerPhrase),\n\t\t\t\t\t\tfield: \"Nummer\",\n\t\t\t\t\t\theaderFilter: true,\n\t\t\t\t\t\tresizable: true,\n\t\t\t\t\t\tminWidth: 200,\n\t\t\t\t\t\tvisible: true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: Vue.computed(() => this.preloadedPhrasen.ausgabedatumPhrase),\n\t\t\t\t\t\tfield: \"Ausgegeben_am\",\n\t\t\t\t\t\theaderFilterFunc: 'dates',\n\t\t\t\t\t\theaderFilter: dateFilter,\n\t\t\t\t\t\tminWidth: 200,\n\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\tformatter:\"datetime\",\n\t\t\t\t\t\tformatterParams: this.datetimeFormatterParams()\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t}\n\t\t};\n\t},\n\n\tprops: {\n\t\tdata: Object,\n\t\teditData: Object,\n\t},\n\t\n\tmethods: {\n\t\tbetriebsmittelTableBuilt: function () {\n\t\t\tthis.$refs.betriebsmittelTable.tabulator.setColumns(this.betriebsmittel_table_options.columns)\n\t\t\tthis.$refs.betriebsmittelTable.tabulator.setData(this.data.mittel);\n\t\t},\n\t\tfunktionenTableBuilt: function () {\n\t\t\tthis.$refs.funktionenTable.tabulator.setColumns(this.funktionen_table_options.columns)\n\t\t\tthis.$refs.funktionenTable.tabulator.setData(this.data.funktionen);\n\t\t},\n\t\thideEditProfilModal: function () {\n\t\t\t//? checks the editModal component property result, if the user made a successful request or not\n\t\t\tif (this.$refs.editModal.result) {\n\t\t\t\tthis.$api\n\t\t\t\t\t.call(ApiProfilUpdate.selectProfilRequest())\n\t\t\t\t\t.then((request) => {\n\t\t\t\t\t\tif (!request.error && request.data) {\n\t\t\t\t\t\t\tthis.data.profilUpdates = request.data;\n\t\t\t\t\t\t\tthis.data.profilUpdates.sort(this.sortProfilUpdates);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconsole.error(\"Error when fetching profile updates: \" + request);\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t.catch((err) => {\n\t\t\t\t\t\tconsole.error(err);\n\t\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// when modal was closed without submitting request\n\t\t\t}\n\t\t\tthis.showModal = false;\n\t\t\tthis.editDataFilter = null;\n\t\t},\n\n\t\tshowEditProfilModal(view) {\n\t\t\tif (view) {\n\t\t\t\tthis.editDataFilter = view;\n\t\t\t}\n\n\t\t\tthis.showModal = true;\n\t\t\tVue.nextTick(() => {\n\t\t\t\tthis.$refs.editModal.show();\n\t\t\t});\n\n\t\t\t// after a state change, wait for the DOM updates to complete\n\t\t},\n\n\t\tfetchProfilUpdates: function () {\n\t\t\tthis.$api\n\t\t\t\t.call(ApiProfilUpdate.selectProfilRequest())\n\t\t\t\t.then((res) => {\n\t\t\t\t\tif (!res.error && res) {\n\t\t\t\t\t\tthis.data.profilUpdates = res.data?.length\n\t\t\t\t\t\t\t? res.data.sort(this.sortProfilUpdates)\n\t\t\t\t\t\t\t: null;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t},\n\t\tsetTableColumnTitles() { // reevaluates computed phrasen\n\t\t\tif(this.$refs.betriebsmittelTable) this.$refs.betriebsmittelTable.tabulator.setColumns(this.betriebsmittel_table_options.columns)\n\t\t\tif(this.$refs.funktionenTable) this.$refs.funktionenTable.tabulator.setColumns(this.funktionen_table_options.columns)\n\t\t},\n\t\tdatetimeFormatterParams: function() {\n\t\t\tconst params = {\n\t\t\t\tinputFormat:\"yyyy-MM-dd\",\n\t\t\t\toutputFormat:\"dd.MM.yyyy\",\n\t\t\t\tinvalidPlaceholder:\"(invalid date)\",\n\t\t\t\ttimezone:FHC_JS_DATA_STORAGE_OBJECT.timezone\n\t\t\t};\n\t\t\treturn params;\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tfotoStatus() {\n\t\t\treturn this.data?.fotoStatus ?? null;\n\t\t},\n\t\tgetTelefonValue() {\n\t\t\tif(this.data.standort_telefon?.kontakt) {\n\t\t\t\treturn this.data.standort_telefon.kontakt + \" \" + this.data.telefonklappe\n\t\t\t} else if(this.data.standort_telefon) {\n\t\t\t\treturn this.data.standort_telefon + \" \" + this.data.telefonklappe\n\t\t\t} else {\n\t\t\t\treturn this.data.telefonklappe\n\t\t\t}\n\t\t},\n\t\tfilteredEditData() {\n\t\t\treturn this.editDataFilter\n\t\t\t\t? this.editData.data[this.editDataFilter]\n\t\t\t\t: this.editData;\n\t\t},\n\t\tprofilInformation() {\n\t\t\tif (!this.data) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tVorname: this.data.vorname,\n\t\t\t\tNachname: this.data.nachname,\n\t\t\t\tUsername: this.data.username,\n\t\t\t\tAnrede: this.data.anrede,\n\t\t\t\tTitel: this.data.titel,\n\t\t\t\tPostnomen: this.data.postnomen,\n\t\t\t\tfoto_sperre: this.data.foto_sperre,\n\t\t\t\tfoto: this.data.foto,\n\t\t\t};\n\t\t},\n\n\t\troleInformation() {\n\t\t\tif (!this.data) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tgeburtsdatum: {\n\t\t\t\t\tlabel: `${this.$p.t('profil','Geburtsdatum')}`,\n\t\t\t\t\tvalue: this.data.gebdatum\n\t\t\t\t},\n\t\t\t\tgeburtsort: {\n\t\t\t\t\tlabel: `${this.$p.t('profil','Geburtsort')}`,\n\t\t\t\t\tvalue: this.data.gebort\n\t\t\t\t},\n\t\t\t\tpersonenkennzeichen: {\n\t\t\t\t\tlabel: `${this.$p.t('profil','Kurzzeichen')}`,\n\t\t\t\t\tvalue: this.data.kurzbz\n\t\t\t\t},\n\t\t\t\ttelefon: {\n\t\t\t\t\tlabel: `${this.$p.t('profil','Telefon')}`,\n\t\t\t\t\tvalue: this.getTelefonValue\n\t\t\t\t},\n\t\t\t\toffice: {\n\t\t\t\t\tlabel: `${this.$p.t('profil','Büro')}`,\n\t\t\t\t\tvalue: this.data.ort_kurzbz\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\t},\n\n\tcreated() {\n\t\t// preload phrasen\n\t\tthis.$p.loadCategory([\"ui\",\"lehre\",\"global\",\"profil\"]).then(() => {\n\t\t\tthis.preloadedPhrasen.bezeichnungPhrase = this.$p.t('ui/bezeichnung');\n\t\t\tthis.preloadedPhrasen.organisationseinheitPhrase = this.$p.t('lehre/organisationseinheit');\n\t\t\tthis.preloadedPhrasen.gueltigVonPhrase = this.$p.t('global/gueltigVon');\n\t\t\tthis.preloadedPhrasen.gueltigBisPhrase = this.$p.t('global/gueltigBis');\n\t\t\tthis.preloadedPhrasen.wochenstundenPhrase = this.$p.t('profil/wochenstunden');\n\t\t\tthis.preloadedPhrasen.entlehnteBetriebsmittelPhrase = this.$p.t('profil/entlehnteBetriebsmittel');\n\t\t\tthis.preloadedPhrasen.inventarnummerPhrase = this.$p.t('profil/inventarnummer');\n\t\t\tthis.preloadedPhrasen.ausgabedatumPhrase = this.$p.t('profil/ausgabedatum');\n\t\t\tthis.preloadedPhrasen.loaded=true;\n\t\t});\n\t\t//? sorts the profil Updates: pending -> accepted -> rejected\n\t\tthis.data.profilUpdates?.sort(this.sortProfilUpdates);\n\n\t},\n\twatch: {\n\t\t'data.funktionen'(newVal) {\n\t\t\tif(this.$refs.funktionenTable) this.$refs.funktionenTable.tabulator.setData(newVal);\n\t\t},\n\t\t'data.mittel'(newVal) {\n\t\t\tif(this.$refs.betriebsmittelTable) this.$refs.betriebsmittelTable.tabulator.setData(newVal);\n\t\t},\n\t\t'language.value'(newVal) {\n\t\t\tthis.setTableColumnTitles()\n\t\t}\n\t},\n\ttemplate: /*html*/ `\n
    \n \n
    \n
    \n \n \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n \n \n
    \n \n \n \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n {{$p.t('profil','privateKontakte')}}\n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n
    \n
    \n {{$p.t('profil','privateAdressen')}}\n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n
    \n \n
    \n \n \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n
    \n\n \n `,\n};\n","import QuickLinks from \"./ProfilComponents/QuickLinks.js\";\nimport Mailverteiler from \"./ProfilComponents/Mailverteiler.js\";\nimport ProfilEmails from \"./ProfilComponents/ProfilEmails.js\";\nimport RoleInformation from \"./ProfilComponents/RoleInformation.js\";\nimport ProfilInformation from \"./ProfilComponents/ProfilInformation.js\";\n\nexport default {\n\tdata() {\n\t\treturn {};\n\t},\n\tcomponents: {\n\t\tQuickLinks,\n\t\tMailverteiler,\n\t\tProfilEmails,\n\t\tRoleInformation,\n\t\tProfilInformation,\n\t},\n\n\tprops: [\"data\"],\n\tprovide() {\n\t\treturn {\n\t\t\tstudiengang_kz: Vue.computed({ get: () => this.data.studiengang_kz }),\n\t\t}\n\t},\n\t\n\tmethods: {},\n\n\tcomputed: {\n\t\tfotoStatus() {\n\t\t\treturn this.data?.fotoStatus ?? null;\n\t\t},\n\t\tprofilInformation() {\n\t\t\tif (!this.data) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tVorname: this.data.vorname,\n\t\t\t\tNachname: this.data.nachname,\n\t\t\t\tUsername: this.data.username,\n\t\t\t\tAnrede: this.data.anrede,\n\t\t\t\tTitel: this.data.titel,\n\t\t\t\tPostnomen: this.data.postnomen,\n\t\t\t\tfoto_sperre: this.data.foto_sperre,\n\t\t\t\tfoto: this.data.foto,\n\t\t\t};\n\t\t},\n\n\t\tpersonEmails() {\n\t\t\treturn this.data?.emails ? this.data.emails : [];\n\t\t},\n\n\t\troleInformation() {\n\t\t\tif (!this.data) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\n\t\t\treturn {\n\t\t\t\tgeburtsdatum: {\n\t\t\t\t\tlabel: `${this.$p.t('profil','Geburtsdatum')}`,\n\t\t\t\t\tvalue: this.data.gebdatum\n\t\t\t\t},\n\t\t\t\tgeburtsort: {\n\t\t\t\t\tlabel: `${this.$p.t('profil','Geburtsort')}`,\n\t\t\t\t\tvalue: this.data.gebort\n\t\t\t\t},\n\t\t\t\tpersonenkennzeichen: {\n\t\t\t\t\tlabel: `${this.$p.t('person','personenkennzeichen')}`,\n\t\t\t\t\tvalue: this.data.personenkennzeichen\n\t\t\t\t},\n\t\t\t\tstudiengang: {\n\t\t\t\t\tlabel: `${this.$p.t('lehre','studiengang')}`,\n\t\t\t\t\tvalue: this.data.studiengang\n\t\t\t\t},\n\t\t\t\tsemester: {\n\t\t\t\t\tlabel: `${this.$p.t('lehre','semester')}`,\n\t\t\t\t\tvalue: this.data.semester\n\t\t\t\t},\n\t\t\t\tverband: {\n\t\t\t\t\tlabel: `${this.$p.t('lehre','lehrverband')}`,\n\t\t\t\t\tvalue: this.data.verband\n\t\t\t\t},\n\t\t\t\tgruppe: {\n\t\t\t\t\tlabel: `${this.$p.t('lehre','gruppe')}`,\n\t\t\t\t\tvalue: this.data.gruppe.trim()\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\t},\n\n\tmounted() {\n\t},\n\n\ttemplate: /*html*/ ` \n\n
    \n \n
    \n \n \n \n \n
    \n \n \n \n
    \n \n
    \n
    \n
    \n \n
    \n
    \n \n \n \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n \n
    \n \n \n
    \n \n
    \n \n
    \n \n \n \n \n \n
    \n
    \n \n \n
    \n \n
    \n \n
    \n \n
    \n \n
    \n `,\n};\n","import {CoreFilterCmpt} from \"../../../components/filter/Filter.js\";\nimport Mailverteiler from \"./ProfilComponents/Mailverteiler.js\";\nimport QuickLinks from \"./ProfilComponents/QuickLinks.js\";\nimport RoleInformation from \"./ProfilComponents/RoleInformation.js\";\nimport ProfilEmails from \"./ProfilComponents/ProfilEmails.js\";\nimport ProfilInformation from \"./ProfilComponents/ProfilInformation.js\";\n\nimport { dateFilter } from '../../../tabulator/filters/Dates.js';\n\nexport default {\n\tcomponents: {\n\t\tCoreFilterCmpt,\n\t\tMailverteiler,\n\t\tQuickLinks,\n\t\tRoleInformation,\n\t\tProfilEmails,\n\t\tProfilInformation,\n\t},\n\tinject: [\"collapseFunction\", \"language\"],\n\tdata() {\n\t\treturn {\n\t\t\tcollapseIconFunktionen: true,\n\t\t\tpreloadedPhrasen:{},\n\t\t\tfunktionen_table_options: {\n\t\t\t\tpersistenceID: \"filterTableMaViewProfilFunktionen\",\n\t\t\t\tpersistence: {\n\t\t\t\t\tcolumns: false\n\t\t\t\t},\n\t\t\t\tminHeight: 300,\n\t\t\t\tlayout: \"fitColumns\",\n\t\t\t\tresponsiveLayout: \"collapse\",\n\t\t\t\tresponsiveLayoutCollapseUseFormatters: false,\n\t\t\t\tresponsiveLayoutCollapseFormatter: Vue.$collapseFormatter,\n\t\t\t\tcolumns: [\n\t\t\t\t\t//? option when wanting to hide the collapsed list\n\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle:\n\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\tfield: \"collapse\",\n\t\t\t\t\t\theaderSort: false,\n\t\t\t\t\t\theaderFilter: false,\n\t\t\t\t\t\tformatter: \"responsiveCollapse\",\n\t\t\t\t\t\tmaxWidth: 40,\n\t\t\t\t\t\theaderClick: this.collapseFunction,\n\t\t\t\t\t\tvisible: true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: Vue.computed(() => this.$p.t('ui/bezeichnung')),\n\t\t\t\t\t\tfield: \"Bezeichnung\",\n\t\t\t\t\t\theaderFilter: true,\n\t\t\t\t\t\tminWidth: 200,\n\t\t\t\t\t\tvisible: true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: Vue.computed(() => this.$p.t('lehre/organisationseinheit')),\n\t\t\t\t\t\tfield: \"Organisationseinheit\",\n\t\t\t\t\t\theaderFilter: true,\n\t\t\t\t\t\tminWidth: 200,\n\t\t\t\t\t\tvisible: true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: Vue.computed(() => this.$p.t('global/gueltigVon')),\n\t\t\t\t\t\tfield: \"Gültig_von\",\n\t\t\t\t\t\theaderFilterFunc: 'dates',\n\t\t\t\t\t\theaderFilter: dateFilter,\n\t\t\t\t\t\tresizable: true,\n\t\t\t\t\t\tminWidth: 200,\n\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\tformatter:\"datetime\",\n\t\t\t\t\t\tformatterParams: this.datetimeFormatterParams()\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: Vue.computed(() => this.$p.t('global/gueltigBis')),\n\t\t\t\t\t\tfield: \"Gültig_bis\",\n\t\t\t\t\t\theaderFilterFunc: 'dates',\n\t\t\t\t\t\theaderFilter: dateFilter,\n\t\t\t\t\t\tresizable: true,\n\t\t\t\t\t\tminWidth: 200,\n\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\tformatter:\"datetime\",\n\t\t\t\t\t\tformatterParams: this.datetimeFormatterParams()\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: Vue.computed(() => this.$p.t('profil/wochenstunden')),\n\t\t\t\t\t\tfield: \"Wochenstunden\",\n\t\t\t\t\t\theaderFilter: true,\n\t\t\t\t\t\tminWidth: 200,\n\t\t\t\t\t\tvisible: true\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t};\n\t},\n\n\t//? this is the prop passed to the dynamic component with the custom data of the view\n\tprops: [\"data\"],\n\tmethods: {\n\t\tfunktionenTableBuilt: function () {\n\t\t\tthis.$refs.funktionenTable.tabulator.setData(this.data.funktionen);\n\t\t},\n\t\tdatetimeFormatterParams: function() {\n\t\t\tconst params = {\n\t\t\t\tinputFormat:\"yyyy-MM-dd\",\n\t\t\t\toutputFormat:\"dd.MM.yyyy\",\n\t\t\t\tinvalidPlaceholder:\"(invalid date)\",\n\t\t\t\ttimezone:FHC_JS_DATA_STORAGE_OBJECT.timezone\n\t\t\t};\n\t\t\treturn params;\n\t\t}\n\t},\n\twatch: {\n\t\t'data.funktionen'(newVal) {\n\t\t\tif(this.$refs.funktionenTable) this.$refs.funktionenTable.tabulator.setData(newVal);\n\t\t},\n\t\t'language.value'(newVal) { // reevaluates computed phrasen\n\t\t\tif(this.$refs.funktionenTable) this.$refs.funktionenTable.tabulator.setColumns(this.funktionen_table_options.columns)\n\t\t}\n\t},\n\tcomputed: {\n\t\tgetTelefonValue() {\n\t\t\tif(this.data.standort_telefon?.kontakt) {\n\t\t\t\treturn this.data.standort_telefon.kontakt + \" \" + this.data.telefonklappe\n\t\t\t} else if(this.data.standort_telefon) {\n\t\t\t\treturn this.data.standort_telefon + \" \" + this.data.telefonklappe\n\t\t\t} else {\n\t\t\t\treturn this.data.telefonklappe\n\t\t\t}\n\t\t},\n\t\tfotoStatus() {\n\t\t\treturn this.data?.fotoStatus ?? null;\n\t\t},\n\n\t\tpersonEmails() {\n\t\t\treturn this.data?.emails ? this.data.emails : [];\n\t\t},\n\n\t\tprofilInformation() {\n\t\t\tif (!this.data) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tVorname: this.data.vorname,\n\t\t\t\tNachname: this.data.nachname,\n\t\t\t\tUsername: this.data.username,\n\t\t\t\tAnrede: this.data.anrede,\n\t\t\t\tTitel: this.data.titel,\n\t\t\t\tPostnomen: this.data.postnomen,\n\t\t\t\tfoto_sperre: this.data.foto_sperre,\n\t\t\t\tfoto: this.data.foto,\n\t\t\t};\n\t\t},\n\n\t\troleInformation() {\n\t\t\tif (!this.data) {\n\t\t\t\treturn {};\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tgeburtsdatum: {\n\t\t\t\t\tlabel: `${this.$p.t('profil','Geburtsdatum')}`,\n\t\t\t\t\tvalue: this.data.gebdatum\n\t\t\t\t},\n\t\t\t\tgeburtsort: {\n\t\t\t\t\tlabel: `${this.$p.t('profil','Geburtsort')}`,\n\t\t\t\t\tvalue: this.data.gebort\n\t\t\t\t},\n\t\t\t\tpersonenkennzeichen: {\n\t\t\t\t\tlabel: `${this.$p.t('profil','Kurzzeichen')}`,\n\t\t\t\t\tvalue: this.data.kurzbz\n\t\t\t\t},\n\t\t\t\ttelefon: {\n\t\t\t\t\tlabel: `${this.$p.t('profil','Telefon')}`,\n\t\t\t\t\tvalue: this.getTelefonValue\n\t\t\t\t},\n\t\t\t\toffice: {\n\t\t\t\t\tlabel: `${this.$p.t('profil','Büro')}`,\n\t\t\t\t\tvalue: this.data.ort_kurzbz\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\t},\n\tcreated(){\n\t\tthis.$p.loadCategory([\"ui\", \"lehre\", \"global\", \"profil\"]).then(() => {\n\t\t\tthis.preloadedPhrasen.bezeichnungPhrase = this.$p.t('ui/bezeichnung');\n\t\t\tthis.preloadedPhrasen.organisationseinheitPhrase = this.$p.t('lehre/organisationseinheit');\n\t\t\tthis.preloadedPhrasen.gueltigVonPhrase = this.$p.t('global/gueltigVon');\n\t\t\tthis.preloadedPhrasen.gueltigBisPhrase = this.$p.t('global/gueltigBis');\n\t\t\tthis.preloadedPhrasen.wochenstundenPhrase = this.$p.t('profil/wochenstunden');\n\t\t\tthis.preloadedPhrasen.loaded = true;\n\t\t});\n\t},\n\n\ttemplate: /*html*/ `\n\n
    \n \n
    \n \n \n \n \n
    \n \n \n \n
    \n \n
    \n
    \n
    \n \n \n
    \n
    \n \n \n \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n \n \n
    \n \n
    \n \n
    \n \n
    \n \n
    \n \n
    \n \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n \n
    \n \n
    \n \n
    \n`,\n};\n","import StudentProfil from \"./StudentProfil.js\";\nimport MitarbeiterProfil from \"./MitarbeiterProfil.js\";\nimport ViewStudentProfil from \"./StudentViewProfil.js\";\nimport ViewMitarbeiterProfil from \"./MitarbeiterViewProfil.js\";\nimport Loading from \"../../Loader.js\";\n\nimport ApiProfil from '../../../api/factory/profil.js';\nimport ApiProfilUpdate from '../../../api/factory/profilUpdate.js';\n\nVue.$collapseFormatter = function (data) {\n\t//data - an array of objects containing the column title and value for each cell\n\tvar container = document.createElement(\"div\");\n\tcontainer.classList.add(\"tabulator-collapsed-row\");\n\tcontainer.classList.add(\"text-break\");\n\n\tvar list = document.createElement(\"div\");\n\tlist.classList.add(\"row\");\n\n\tcontainer.appendChild(list);\n\n\tdata.forEach(function (col) {\n\t\tlet item = document.createElement(\"div\");\n\t\titem.classList.add(\"col-6\");\n\t\tlet item2 = document.createElement(\"div\");\n\t\titem2.classList.add(\"col-6\");\n\n\t\titem.innerHTML = \"\" + col.title + \"\";\n\t\titem2.innerHTML = col.value ? col.value : \"-\";\n\n\t\tlist.appendChild(item);\n\t\tlist.appendChild(item2);\n\t});\n\n\treturn Object.keys(data).length ? container : \"\";\n};\n\nexport const Profil = {\n\tname: 'Profil',\n\tcomponents: {\n\t\tStudentProfil,\n\t\tMitarbeiterProfil,\n\t\tViewStudentProfil,\n\t\tViewMitarbeiterProfil,\n\t\tLoading,\n\t},\n\tprops: {\n\t\tuid: {\n\t\t\ttype: String,\n\t\t\trequired:false,\n\t\t},\n\t\tviewData: {\n\t\t\ttype: Object,\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\t//? loading property is used for showing/hiding the loading modal\n\t\t\tloading: false,\n\t\t\tprofilUpdateStates: null,\n\t\t\tprofilUpdateTopic: null,\n\t\t\tview: null,\n\t\t\tdata: null,\n\t\t\t// notfound is null by default, but contains an UID if no user exists with that UID\n\t\t\tnotFoundUID: null,\n\t\t\tisEditable: this.viewData.editable ?? false,\n\t\t};\n\t},\n\tprovide() {\n\t\treturn {\n\t\t\tisEditable: Vue.computed(()=>this.isEditable),\n\t\t\tprofilUpdateStates: Vue.computed(() =>\n\t\t\t\tthis.profilUpdateStates ? this.profilUpdateStates : false\n\t\t\t),\n\t\t\tprofilUpdateTopic: Vue.computed(() =>\n\t\t\t\tthis.profilUpdateTopic ? this.profilUpdateTopic : false\n\t\t\t),\n\t\t\tsetLoading: (newValue) => {\n\t\t\t\tthis.loading = newValue;\n\t\t\t},\n\t\t\tgetZustellkontakteCount: this.zustellKontakteCount,\n\t\t\tgetZustelladressenCount: this.zustellAdressenCount,\n\t\t\tcollapseFunction: (e, column) => {\n\t\t\t\t//* check if property doesn't exist already and add it to the reactive this properties\n\t\t\t\tif (this[e.target.id] === undefined) {\n\t\t\t\t\tthis[e.target.id] = true;\n\t\t\t\t}\n\t\t\t\tthis[e.target.id] = !this[e.target.id];\n\n\t\t\t\t//* gets all event icons of the different rows to use the onClick event later\n\t\t\t\tlet allClickableIcons = column._column.cells.map((row) => {\n\t\t\t\t\treturn row.element.children[0];\n\t\t\t\t});\n\n\t\t\t\t//* changes the icon that shows or hides all the collapsed columns\n\t\t\t\t//* if the replace function does not find the class to replace, it just simply returns false\n\t\t\t\tif (this[e.target.id]) {\n\t\t\t\t\te.target.classList.replace(\"fa-angle-up\", \"fa-angle-down\");\n\t\t\t\t} else {\n\t\t\t\t\te.target.classList.replace(\"fa-angle-down\", \"fa-angle-up\");\n\t\t\t\t}\n\n\t\t\t\t//* changes the icon for every collapsed column to open or closed\n\t\t\t\tif (this[e.target.id]) {\n\t\t\t\t\tallClickableIcons\n\t\t\t\t\t\t.filter((column) => {\n\t\t\t\t\t\t\treturn !column.classList.contains(\"open\");\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.forEach((col) => {\n\t\t\t\t\t\t\tcol.click();\n\t\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tallClickableIcons\n\t\t\t\t\t\t.filter((column) => {\n\t\t\t\t\t\t\treturn column.classList.contains(\"open\");\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.forEach((col) => {\n\t\t\t\t\t\t\tcol.click();\n\t\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t\tsortProfilUpdates: (ele1, ele2) => {\n\t\t\t\tlet result = 0;\n\t\t\t\tif (ele1.status.toLowerCase() === \"pending\") {\n\t\t\t\t\tresult = -1;\n\t\t\t\t} else if (ele1.status.toLowerCase() === \"accepted\") {\n\t\t\t\t\tresult = ele2.status.toLowerCase() === \"rejected\" ? -1 : 1;\n\t\t\t\t} else {\n\t\t\t\t\tresult = 1;\n\t\t\t\t}\n\t\t\t\t//? if they have the same status the insert date is used for ordering\n\t\t\t\tif (ele1.status === ele2.status) {\n\t\t\t\t\tresult =\n\t\t\t\t\t\tnew Date(ele2.insertamum.split(\".\").reverse().join(\"-\")) -\n\t\t\t\t\t\tnew Date(ele1.insertamum.split(\".\").reverse().join(\"-\"));\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t},\n\t\t};\n\t},\n\tmethods: {\n\t\tasync load() {\n\t\t\t// fetch profilUpdateStates to provide them to children components\n\t\t\tawait this.$api\n\t\t\t\t.call(ApiProfilUpdate.getStatus())\n\t\t\t\t.then((response) => {\n\t\t\t\t\tthis.profilUpdateStates = response.data;\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconsole.error(error);\n\t\t\t\t});\n\n\t\t\tthis.$api\n\t\t\t\t.call(ApiProfilUpdate.getTopic())\n\t\t\t\t.then((response) => {\n\t\t\t\t\tthis.profilUpdateTopic = response.data;\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconsole.error(error);\n\t\t\t\t});\n\t\t\t\n\t\t\t\n\t\t\tthis.$api\n\t\t\t\t.call(ApiProfil.profilViewData(this.$route.params.uid??null))\n\t\t\t\t.then((response) => response.data).then(data=>{\n\t\t\t\t\tthis.view = data?.profil_data.view;\n\t\t\t\t\tthis.data = data?.profil_data.data;\n\t\t\t\t\tthis.isEditable = data?.editable ?? false;\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconsole.error(error);\n\t\t\t\t});\n\t\t\t\n\t\t\t\n\t\t},\n\t\tzustellAdressenCount() {\n\t\t\tif (!this.data || !this.data.adressen) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tlet adressenArray = [];\n\t\t\tif (this.data.profilUpdates?.length) {\n\t\t\t\tadressenArray = adressenArray.concat(\n\t\t\t\t\tthis.data.profilUpdates\n\t\t\t\t\t\t.filter((update) => {\n\t\t\t\t\t\t\treturn update.requested_change.zustelladresse;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.map((adresse) => {\n\t\t\t\t\t\t\treturn adresse.requested_change.adresse_id;\n\t\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t!this.data.profilUpdates?.length ||\n\t\t\t\t!this.data.adressen\n\t\t\t\t\t.filter((adresse) => adresse.zustelladresse)\n\t\t\t\t\t.every((adresse) =>\n\t\t\t\t\t\tthis.data.profilUpdates.some(\n\t\t\t\t\t\t\t(update) =>\n\t\t\t\t\t\t\t\tupdate.requested_change.adresse_id == adresse.adresse_id\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t) {\n\t\t\t\tadressenArray = adressenArray.concat(\n\t\t\t\t\tthis.data.adressen\n\t\t\t\t\t\t.filter((adresse) => {\n\t\t\t\t\t\t\treturn adresse.zustelladresse;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.map((adr) => {\n\t\t\t\t\t\t\treturn adr.adresse_id;\n\t\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn [...new Set(adressenArray)];\n\t\t\t\n\t\t},\n\t\tzustellKontakteCount() {\n\t\t\tif (!this.data || !this.data.kontakte) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tlet kontakteArray = [];\n\n\t\t\tif (this.data.profilUpdates?.length) {\n\t\t\t\tkontakteArray = kontakteArray.concat(\n\t\t\t\t\tthis.data.profilUpdates\n\t\t\t\t\t\t.filter((update) => {\n\t\t\t\t\t\t\treturn update.status === 'Pending' && update.requested_change.zustellung;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.map((kontant) => {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\tkontakt_id: kontant.requested_change.kontakt_id,\n\t\t\t\t\t\t\t\t\t\tkontakttyp: kontant.requested_change.kontakttyp\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t!this.data.profilUpdates?.length ||\n\t\t\t\t!this.data.kontakte\n\t\t\t\t\t.filter((kontakt) => kontakt.zustellung)\n\t\t\t\t\t.every((kontakt) =>\n\t\t\t\t\t\tthis.data.profilUpdates.some(\n\t\t\t\t\t\t\t(update) =>\n\t\t\t\t\t\t\t\tupdate.status === 'Pending' && update.requested_change.kontakt_id == kontakt.kontakt_id\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t) {\n\t\t\t\tkontakteArray = kontakteArray.concat(\n\t\t\t\t\tthis.data.kontakte\n\t\t\t\t\t\t.filter((kontakt) => {\n\t\t\t\t\t\t\treturn kontakt.zustellung;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.map((kon) => {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\tkontakt_id: kon.kontakt_id,\n\t\t\t\t\t\t\t\t\t\tkontakttyp: kon.kontakttyp\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn [...new Set(kontakteArray)];\n\t\t},\n\t},\n\tcomputed: {\n\t\t\n\t\tfilteredEditData() {\n\t\t\tif (!this.data) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tview: null,\n\t\t\t\tdata: {\n\t\t\t\t\tPersonen_Informationen: {\n\t\t\t\t\t\ttitle: this.$p.t(\"profil\", \"personenInformationen\"),\n\t\t\t\t\t\ttopic: \"Personen_informationen\",\n\t\t\t\t\t\tview: null,\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tvorname: {\n\t\t\t\t\t\t\t\ttitle: this.$p.t(\"person\", \"vorname\"),\n\t\t\t\t\t\t\t\ttopic: this.profilUpdateTopic?.[\"Vorname\"],\n\t\t\t\t\t\t\t\tview: \"TextInputDokument\",\n\t\t\t\t\t\t\t\twithFiles: true,\n\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\ttitel: \"vorname\",\n\t\t\t\t\t\t\t\t\tvalue: this.data.vorname,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tnachname: {\n\t\t\t\t\t\t\t\ttitle: this.$p.t(\"person\", \"nachname\"),\n\t\t\t\t\t\t\t\ttopic: this.profilUpdateTopic?.[\"Nachname\"],\n\t\t\t\t\t\t\t\tview: \"TextInputDokument\",\n\t\t\t\t\t\t\t\twithFiles: true,\n\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\ttitel: \"nachname\",\n\t\t\t\t\t\t\t\t\tvalue: this.data.nachname,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttitel: {\n\t\t\t\t\t\t\t\ttitle: this.$p.t(\"global\", \"titel\"),\n\t\t\t\t\t\t\t\ttopic: this.profilUpdateTopic?.[\"Titel\"],\n\t\t\t\t\t\t\t\tview: \"TextInputDokument\",\n\t\t\t\t\t\t\t\twithFiles: true,\n\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\ttitel: \"titel\",\n\t\t\t\t\t\t\t\t\tvalue: this.data.titel,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tpostnomen: {\n\t\t\t\t\t\t\t\ttitle: this.$p.t(\"profil\", \"postnomen\"),\n\t\t\t\t\t\t\t\ttopic: this.profilUpdateTopic?.[\"Postnomen\"],\n\t\t\t\t\t\t\t\tview: \"TextInputDokument\",\n\t\t\t\t\t\t\t\twithFiles: true,\n\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\ttitel: \"postnomen\",\n\t\t\t\t\t\t\t\t\tvalue: this.data.postnomen,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tPrivate_Kontakte: {\n\t\t\t\t\t\ttitle: this.$p.t(\"profil\", \"privateKontakte\"),\n\t\t\t\t\t\ttopic: this.profilUpdateTopic?.[\"Private Kontakte\"],\n\t\t\t\t\t\tdata: this.data.kontakte\n\t\t\t\t\t\t\t?.filter((item) => {\n\t\t\t\t\t\t\t\t// excludes all contacts that are already used in pending profil update requests\n\t\t\t\t\t\t\t\treturn !this.data.profilUpdates?.some(\n\t\t\t\t\t\t\t\t\t(update) =>\n\t\t\t\t\t\t\t\t\t\tupdate.status === this.profilUpdateStates[\"Pending\"] &&\n\t\t\t\t\t\t\t\t\t\tupdate.requested_change?.kontakt_id === item.kontakt_id\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.map((kontakt) => {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tlistview: \"Kontakt\",\n\t\t\t\t\t\t\t\t\tview: \"EditKontakt\",\n\t\t\t\t\t\t\t\t\tdata: kontakt,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t\tPrivate_Adressen: {\n\t\t\t\t\t\ttitle: this.$p.t(\"profil\", \"privateAdressen\"),\n\t\t\t\t\t\ttopic: this.profilUpdateTopic?.[\"Private Adressen\"],\n\t\t\t\t\t\tdata: this.data.adressen\n\t\t\t\t\t\t\t?.filter((item) => {\n\t\t\t\t\t\t\t\treturn !this.data.profilUpdates?.some((update) => {\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\tupdate.status === this.profilUpdateStates[\"Pending\"] &&\n\t\t\t\t\t\t\t\t\t\tupdate.requested_change?.adresse_id == item.adresse_id\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.map((adresse) => {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tlistview: \"Adresse\",\n\t\t\t\t\t\t\t\t\tview: \"EditAdresse\",\n\t\t\t\t\t\t\t\t\tdata: adresse,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t},\n\twatch: {\n\t\tloading: function (newValue) {\n\t\t\tif (newValue) {\n\t\t\t\tthis.$refs.loadingModalRef.show();\n\t\t\t} else {\n\t\t\t\tthis.$refs.loadingModalRef.hide();\n\t\t\t}\n\t\t},\n\t\tuid (newVal, oldVal) {\n\t\t\tthis.load()\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.load()\n\t},\n\ttemplate: `\n\t
    \n\t\t
    \n\t\t\t

    Es wurde keine Person mit der UID {{this.notFoundUID}} gefunden

    \n\t\t
    \n\t\t
    \n \n \n\t\t
    \n\t
    `,\n}\n\nexport default Profil","/**\n * Copyright (C) 2025 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tgetContentID(ort_kurbz) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Ort/ContentID',\n\t\t\tparams: { ort_kurzbz: ort_kurbz }\n\t\t};\n\t},\n\tgetRooms(datum, von, bis, typ, personenanzahl = 0) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Ort/getRooms',\n\t\t\tparams: { datum, von, bis, typ, personenanzahl }\n\t\t};\n\t},\n\tgetRoomTypes() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Ort/getTypes',\n\t\t\tparams: { }\n\t\t};\n\t}\n};","import {CoreFilterCmpt} from \"../../../components/filter/Filter.js\";\nimport VueDatePicker from '../../vueDatepicker.js.php';\nimport ApiOrt from '../../../api/factory/ort.js'\nexport const Raumsuche = {\n\tname: \"Raumsuche\",\n\tprops: {\n\t\t\n\t},\n\tcomponents: {\n\t\tVueDatePicker,\n\t\tCoreFilterCmpt,\n\t\tInputNumber: primevue.inputnumber,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tphrasenPromise: null,\n\t\t\tphrasenResolved: false,\n\t\t\ttabulatorUuid: Vue.ref(0),\n\t\t\ttableBuiltResolve: null,\n\t\t\ttableBuiltPromise: null,\n\t\t\troomtypes: null,\n\t\t\tdefaultType: {\n\t\t\t\traumtyp_kurzbz: '',\n\t\t\t\tbeschreibung: Vue.computed(() => this.$p.t('global/alle'))\n\t\t\t},\n\t\t\tanzahl: 1,\n\t\t\tselectedType: null,\n\t\t\tdatum: new Date(),\n\t\t\tvon: Vue.ref({\n\t\t\t\thours: new Date().getHours(),\n\t\t\t\tminutes: new Date().getMinutes()\n\t\t\t}),\n\t\t\tbis: Vue.ref({\n\t\t\t\thours: new Date().getHours() + 1,\n\t\t\t\tminutes: new Date().getMinutes()\n\t\t\t}),\n\t\t\tdatepickerTextInputOptions: {\n\t\t\t\tenterSubmit: true,\n\t\t\t\ttabSubmit: true,\n\t\t\t\tselectOnFocus: true,\n\t\t\t\tformat: 'dd.MM.yyyy',\n\t\t\t\tescClose: true\n\t\t\t},\n\t\t\ttimepickerTextInputOptions: {\n\t\t\t\tenterSubmit: true,\n\t\t\t\ttabSubmit: true,\n\t\t\t\tselectOnFocus: true,\n\t\t\t\tformat: 'HH:mm',\n\t\t\t\tescClose: true\n\t\t\t},\n\t\t\traumsucheTableOptions: {\n\t\t\t\theight: Vue.ref(400),\n\t\t\t\tindex: 'ort_kurzbz',\n\t\t\t\tlayout: 'fitColumns',\n\t\t\t\tplaceholder: this.$p.t('global/noDataAvailable'),\n\t\t\t\tcolumns: [\n\t\t\t\t\t{title: Vue.computed(() => this.$p.t('rauminfo/raum_kurzbz')), field: 'ort_kurzbz', widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$p.t('global/bezeichnung')), field: 'bezeichnung', widthGrow: 2},\n\t\t\t\t\t{title: Vue.computed(() => this.$p.t('rauminfo/raumnummer')), field: 'nummer', widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$p.t('rauminfo/personcap')), field: 'personen', widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$p.t('rauminfo/rauminfo')),\n\t\t\t\t\t\tfield: 'linkInfo', formatter: this.linkFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$p.t('rauminfo/roomReservations')), \n\t\t\t\t\t\tfield: 'linkRes', formatter: this.linkFormatter, widthGrow: 1}\n\t\t\t\t],\n\t\t\t\tpersistence: false,\n\t\t\t},\n\t\t\traumsucheTableEventHandlers: [{\n\t\t\t\tevent: \"tableBuilt\",\n\t\t\t\thandler: async () => {\n\t\t\t\t\tthis.tableBuiltResolve()\n\t\t\t\t}\n\t\t\t}\n\t\t\t]};\n\t},\n\tmethods: {\n\t\ttableResolve(resolve) {\n\t\t\tthis.tableBuiltResolve = resolve\n\t\t},\n\t\tlinkFormatter(cell) {\n\t\t\tconst val = cell.getValue();\n\t\t\tconst field = cell.getField();\n\t\t\tconst arialabel = (field === 'linkInfo') \n\t\t\t\t\t\t\t? this.$p.t('rauminfo/rauminfo') \n\t\t\t\t\t\t\t: this.$p.t('rauminfo/roomReservations');\n\t\t\tif(val) {\n\t\t\t\treturn ''\n\t\t\t} else {\n\t\t\t\treturn '
    ' +\n\t\t\t\t\t'-
    '\n\t\t\t}\n\t\t},\n\t\troomPlanLink(room) {\n\t\t\treturn FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router\n\t\t\t+ '/CisVue/Cms/getRoomInformation/' + room.ort_kurzbz\n\t\t},\n\t\troomInfoLink(room) {\n\t\t\treturn FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router\n\t\t\t\t+ '/CisVue/Cms/content/' + room.content_id\n\t\t},\n\t\tgetTimeString(time) {\n\t\t\tconst hours = String(time.hours).padStart(2, '0');\n\t\t\tconst minutes = String(time.minutes).padStart(2, '0');\n\t\t\treturn `${hours}:${minutes}`\n\t\t},\n\t\tsetupData(data){\n\t\t\tconst d = data.map(room => {\n\t\t\t\treturn {\n\t\t\t\t\tort_kurzbz: room.ort_kurzbz,\n\t\t\t\t\tbezeichnung: room.bezeichnung.replace('&', '&'),\n\t\t\t\t\tnummer: room.planbezeichnung,\n\t\t\t\t\tpersonen: room.max_person,\n\t\t\t\t\tlinkInfo: room.content_id ? this.roomInfoLink(room) : null,\n\t\t\t\t\tlinkRes: this.roomPlanLink(room)\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\t\n\t\t\t})\n\t\t\t\n\t\t\tthis.$refs.raumsucheTable.tabulator.setData(d);\n\t\t},\n\t\tloadRoomTypes() {\n\t\t\tthis.$api.call(ApiOrt.getRoomTypes())\n\t\t\t\t.then(res => {\n\t\t\t\tres?.data?.forEach(type => {\n\t\t\t\t\ttype.beschreibung = type.beschreibung.replace('&', '&')\n\t\t\t\t})\n\t\t\t\tthis.selectedType = this.defaultType\n\t\t\t\tthis.roomtypes = res?.data ?? []\n\t\t\t})\n\t\t},\n\t\tloadRooms() {\n\t\t\tthis.$api.call(ApiOrt.getRooms(this.datum.toISOString(), this.getTimeString(this.von), this.getTimeString(this.bis), this.selectedType?.raumtyp_kurzbz ?? '', this.anzahl))\n\t\t\t\t.then(res => {\n\t\t\t\t\tif(res?.data?.retval) this.setupData(res.data.retval)\n\t\t\t})\n\t\t},\n\t\thandleUuidDefined(uuid) {\n\t\t\tthis.tabulatorUuid = uuid\n\t\t},\n\t\tsearch(){\n\t\t\tthis.loadRooms()\n\t\t},\n\t\tsetRoute(val) {\n\t\t\t// TODO: router push\n\t\t},\n\t\tdateFormat(date) {\n\t\t\tconst day = String(date.getDate()).padStart(2, '0');\n\t\t\tconst month = String(date.getMonth() + 1).padStart(2, '0');\n\t\t\tconst year = date.getFullYear();\n\t\t\treturn `${day}.${month}.${year}`\n\t\t},\n\t\ttimeFormat(date) {\n\t\t\tconst hours = String(date.getHours()).padStart(2, '0');\n\t\t\tconst minutes = String(date.getMinutes()).padStart(2, '0');\n\t\t\treturn `${hours}:${minutes}`;\n\t\t},\n\t\tasync setupMounted() {\n\t\t\t\n\t\t\tthis.tableBuiltPromise = new Promise(this.tableResolve)\n\t\t\tawait this.tableBuiltPromise\n\t\t\t\n\t\t\tthis.loadRoomTypes()\n\t\t\tthis.loadRooms()\n\n\t\t\tconst tableID = this.tabulatorUuid ? ('-' + this.tabulatorUuid) : ''\n\t\t\tconst tableDataSet = document.getElementById('filterTableDataset' + tableID);\n\t\t\tif(!tableDataSet) return\n\t\t\tconst rect = tableDataSet.getBoundingClientRect();\n\n\t\t\tconst h = window.visualViewport.height - rect.top - 100\n\t\t\tif(this.$refs.raumsucheTable) {\n\t\t\t\tthis.$refs.raumsucheTable.$refs.table.style.setProperty('height', h+'px')\n\t\t\t}\n\t\t\t\n\t\t}\n\t},\n\tcomputed: {\n\t\tisDarkMode(){\n\t\t\treturn this.$theme.theme_name.value == 'dark';\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.phrasenPromise = this.$p.loadCategory(['rauminfo', 'global'])\n\t\tthis.phrasenPromise.then(()=> {this.phrasenResolved = true})\n\t},\n\tmounted() {\n\t\tthis.setupMounted()\n\t},\n\ttemplate: `\n\t

    {{$p.t('rauminfo/roomSearch')}}

    \n\t
    \n\t
    \n\t\t
    \n\t\t\t\n\t\t\t\n\t\t
    \n\t\t
    \n\t\t\t\n\t\t\t\n\t\t
    \n\t\t
    \n\t\t\t\n\t\t\t\n\t\t
    \n\t\t\n\t\t
    \n\t\t\t\n\t\t
    \n\t\t\n\n\t\t
    \n\t\t\t\n\t\t
    \n\t\t
    \n\t\t\t\n\t\t
    \n\t
    \n\t\n\n \n `,\n};\n\nexport default Raumsuche;\n","export default {\n components: {\n paginator: primevue.paginator,\n },\n emits: [\"update:rows\"],\n props: {\n maxPageCount: {\n type: Number,\n default: 0,\n },\n page_size: {\n type: Number,\n required: true,\n },\n },\n data() {\n return {};\n },\n methods: {\n newPageEvent: function (data) {\n \n },\n },\n mounted() {},\n template: /*html*/ `\n \t\n\t
    \n\t\t$emit('page',{...data, page:data.page+1})\" :rows=\"page_size\" :totalRecords=\"maxPageCount\" :rowsPerPageOptions=\"[10, 20, 30]\" >\n\t\t\n\t
    \n\t\n\t
    \n\t\t$emit('page',{...data, page:data.page+1})\" :rows=\"page_size\" :totalRecords=\"maxPageCount\" :rowsPerPageOptions=\"[10, 20, 30]\" template=\"FirstPageLink PrevPageLink CurrentPageReport NextPageLink LastPageLink RowsPerPageDropdown\">\n\t\t\n\t
    \n `,\n};\n","export default {\n\tprops:{\n\t\tuid:String,\n\t\tvorname:String,\n\t\tnachname:String,\n\t\ttitelpre:String,\n\t\tkontakt:String,\t\n\t\ttelefoneklappe:String,\n\t\temail:String,\n\t\tplanbezeichnung:String,\n\t\tfoto:String,\n\t\tdisplayWidget:{\n\t\t\ttype:Boolean,\n\t\t\tdefault:false,\n\t\t}\n\t},\n\ttemplate:/*html*/`\n\t
    \n\t\t
    \n\t\t\t\"mitarbeiter_foto\"\n\t\t
    \n\t\t
    \n\t\t\t
    {{fullname}}
    \n\t\t
    \n\t\t
    \n\t\t
    \n\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t
    {{phone.number}}
    \n\n\t\t\t\t
    \n\t\t\t\t
    {{ort}}
    \n\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t
    \n\n\t\t
    \n\t
    \n\t`,\n\tcomputed:{\n\t\tformattedEmail: function(){\n\t\t\tif(!this.email ) return null;\n\t\t\tlet emailString= this.email.replace(\"mailto:\", \"\");\n\t\t\t// when splitting a string, the letter that is used to split the string will be removed from the result\n\t\t\tlet emailArray = emailString.split('@');\n\t\t\t// returns both parts of the splitted string in combination with the removed letter and a word break\n\t\t\treturn emailArray[0] + '@' + emailArray[1];\n\t\t},\n\t\tfullname: function () {\n\t\t\tif (this.titelpre && this.vorname && this.nachname) {\n\t\t\t\treturn `${this.titelpre} ${this.vorname} ${this.nachname}`;\n\t\t\t}\n\t\t\telse if (this.vorname && this.nachname) {\n\t\t\t\treturn `${this.vorname} ${this.nachname}`;\n\t\t\t}\n\t\t\telse if (this.nachname) {\n\t\t\t\treturn this.vorname;\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t},\n\t\tphone: function () {\n\t\t\tif (this.kontakt && this.telefoneklappe) {\n\t\t\t\treturn {\n\t\t\t\t\tlink: \"tel:\".concat(this.kontakt).concat(\" \" + this.telefoneklappe),\n\t\t\t\t\tnumber: this.kontakt.concat(\" \" + this.telefoneklappe),\n\t\t\t\t} \n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn this.kontakt ? {\n\t\t\t\t\tlink: \"tel:\".concat(this.kontakt),\n\t\t\t\t\tnumber: this.kontakt,\n\t\t\t\t} : null;\n\t\t\t}\n\t\t},\n\t\temail_link: function () {\n\t\t\treturn this.email ? \"mailto:\".concat(this.email) : null;\n\t\t},\n\t\tbase64Image:function(){\n\t\t\treturn this.foto ? 'data:image/png;base64,'.concat(this.foto) : null;\n\t\t},\n\t\tort:function(){\n\t\t\treturn this.planbezeichnung ?? null;\n\t\t},\n\t\tprofilViewLink: function(){\n\t\t\treturn this.uid ? FHC_JS_DATA_STORAGE_OBJECT.app_root.concat(FHC_JS_DATA_STORAGE_OBJECT.ci_router).concat(\"/Cis/Profil/View/\").concat(this.uid): null; \n\t\t},\n\t},\n\t\n}","export default {\n\tprops: {\n\t\ttitle:String,\n\t\tvertretungsList:Array,\n\t\tshowBezeichnung:Boolean,\n\t},\n\ttemplate:/*html*/`\n\t
    \n\t\t
    \n\t\t\t{{title}}\n\t\t
    \n\t\t
    \n\t\t\t

    \n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{{vertretungFormatedName(vertretung,false)}}\n\t\t\t

    \n\t\t
    \n\t
    \n\t`,\n\tmethods: {\n\t\tprofilViewLink: function (uid) {\n\t\t\treturn uid ? FHC_JS_DATA_STORAGE_OBJECT.app_root.concat(FHC_JS_DATA_STORAGE_OBJECT.ci_router).concat(\"/Cis/Profil/View/\").concat(uid) : null;\n\t\t},\n\t\tvertretungFormatedName: function (vertretung) {\n\t\t\tif (!vertretung) return null;\n\t\t\treturn `${vertretung.vorname ?? ''} ${vertretung.nachname ?? ''} ${vertretung.bezeichnung && this.showBezeichnung ? '('.concat(vertretung.bezeichnung.replace(\"(\", \"\").replace(\")\", \"\")).concat(\")\") : ''}`\n\t\t},\n\t},\n\n}","/**\n * Copyright (C) 2025 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tstudiengangInformation() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Studgang/getStudiengangInfo'\n\t\t};\n\t},\n\tgetStudiengangByKz(studiengang_kz) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/organisation/StudiengangEP/getStudiengangByKz',\n\t\t\tparams: { studiengang_kz }\n\t\t};\n\t}\n};","import StudiengangPerson from \"./StudiengangPerson.js\";\nimport StudiengangVertretung from \"./StudiengangVertretung.js\";\n\nimport ApiStudiengang from '../../../../api/factory/studiengang.js';\n\nexport default {\ndata(){\n\treturn{\n\t\tstudiengang:null,\n\t\tsemester: null,\n\t\tstg_ltg: null,\n\t\tgf_ltg: null,\n\t\tstv_ltg: null,\n\t\tass: null,\n\t\thochschulvertr: null,\n\t\tstdv: null,\n\t\tjahrgangsvertr: null,\n\t}\n},\nprops:{\n\tdisplayWidget:{\n\t\ttype:Boolean,\n\t\tdefault:false,\n\t}\n},\ncomponents:{\n\tStudiengangPerson,\n\tStudiengangVertretung,\n},\ntemplate:/*html*/`\n\t\t
    \n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t
    \n\t\n`,\ncomputed:{\n\t// this function concatenates the studiengangsleitung and the assistenz or the \n\t// geschaeftsfuehrende-Stellvertretende Leitung if both collections only contain one person\n\tcollection_array: function(){\n\t\tlet returnData = [];\n\n\t\tif (Array.isArray(this.stg_ltg) && this.stg_ltg.length == 1 && Array.isArray(this.ass) && this.ass.length == 1)\n\t\t{\n\t\t\treturnData.push({ title: `${this.$p.t('global', 'studiengangsleitung')}/${this.$p.t('studiengangInformation', 'assistenz')}` , collection: [...this.stg_ltg, ...this.ass] });\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturnData.push({ title: this.$p.t('global', 'studiengangsleitung'), collection: this.stg_ltg });\n\t\t\treturnData.push({ title: this.$p.t('studiengangInformation', 'assistenz'), collection: this.ass });\n\t\t}\n\t\tif (Array.isArray(this.gf_ltg) && this.gf_ltg.length == 1 && Array.isArray(this.stv_ltg) && this.stv_ltg.length == 1)\n\t\t{\n\t\t\treturnData.push({ title: this.$p.t('studiengangInformation', 'geschaeftsfuehrende_stellvertretende_leitung'), collection: [...this.gf_ltg, ...this.stv_ltg] });\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturnData.push({ title: this.$p.t('studiengangInformation', 'geschaeftsfuehrende_leitung'), collection: this.gf_ltg });\n\t\t\treturnData.push({ title: this.$p.t('studiengangInformation', 'stellvertretende_leitung'), collection: this.stv_ltg });\n\t\t}\n\n\t\treturn returnData;\n\t},\n\tmoodleLink: function(){\n\t\t// early return if the studiengang information is not available\n\t\tif(!this.studiengang || !this.studiengang.studiengang_kz) return;\n\n\t\treturn `https://moodle.technikum-wien.at/course/view.php?idnumber=dl` + this.studiengang.studiengang_kz;\n\t},\n},\n\tmounted() {\n\t\tthis.$api\n\t\t\t.call(ApiStudiengang.studiengangInformation())\n\t\t\t.then(res => res.data)\n\t\t\t.then(studiengangInformationen => {\n\t\t\t\tObject.assign(this, studiengangInformationen);\n\t\t\t});\n\t}\n};\n","/**\n * Copyright (C) 2025 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tcontent(content_id, version=null, sprache=null, sichtbar=null) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Cms/content',\n\t\t\tparams: {\n\t\t\t\tcontent_id,\n\t\t\t\t...(version ? { version } : {}),\n\t\t\t\t...(sprache ? { sprache } : {}),\n\t\t\t\t...(sichtbar ? { sichtbar } : {})\n\t\t\t}\n\t\t};\n\t},\n\t//api function used for the news View that renders the html\n\tgetNews(page = 1, page_size = 10, sprache) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Cms/getNews',\n\t\t\tparams: {\n\t\t\t\tpage,\n\t\t\t\tpage_size,\n\t\t\t\tsprache\n\t\t\t},\n\t\t};\n\t},\n\t//api function used for the widget component\n\tnews(limit) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Cms/news',\n\t\t\tparams: { limit }\n\t\t};\n\t},\n\tgetNewsRowCount() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Cms/getNewsRowCount'\n\t\t};\n\t},\n\tgetNewsExtra() {\n\t\t// TODO(chris): seems to be called from nowhere?\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Cms/getStudiengangInfoForNews'\n\t\t};\n\t}\n};","import Pagination from \"../../Pagination/Pagination.js\";\nimport StudiengangInformation from \"./StudiengangInformation/StudiengangInformation.js\";\nimport BsConfirm from \"../../Bootstrap/Confirm.js\";\n\nimport ApiCms from '../../../api/factory/cms.js';\n\nexport default {\n\tname: \"NewsComponent\",\n components: {\n Pagination,\n\tStudiengangInformation,\n },\n data() {\n return {\n content: null,\n maxPageCount: 0,\n page_size: 10,\n\t page:1,\n };\n },\n watch:{\n\t'$p.user_language.value':function(sprache){\n\t\tthis.fetchNews();\n\t}\n },\n computed:{\n\tsprache: function(){\n\t\treturn this.$p.user_language.value;\n\t},\n },\n methods: {\n\t\tfetchNews() {\n\t\t\treturn this.$api\n\t\t\t\t.call(ApiCms.getNews(this.page, this.page_size, this.sprache))\n\t\t\t\t.then(res => res.data)\n\t\t\t\t.then(result => {\n\t\t\t\t\tthis.content = result;\n\n\t\t\t\t\tdocument.querySelectorAll(\"#cms [data-confirm]\").forEach((el) => {\n\t\t\t\t\t\tel.addEventListener(\"click\", (evt) => {\n\t\t\t\t\t\t\tevt.preventDefault();\n\t\t\t\t\t\t\tBsConfirm.popup(el.dataset.confirm)\n\t\t\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\t\t\tAxios.get(el.href)\n\t\t\t\t\t\t\t\t\t\t.then((res) => {\n\t\t\t\t\t\t\t\t\t\t\t// TODO(chris): check for success then show message and/or reload\n\t\t\t\t\t\t\t\t\t\t\tlocation = location;\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t.catch((err) => console.error(\"ERROR:\", err));\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.catch(() => {\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t\tdocument.querySelectorAll(\"#cms [data-href]\").forEach((el) => {\n\t\t\t\t\t\tel.href = el.dataset.href.replace(\n\t\t\t\t\t\t\t/^ROOT\\//,\n\t\t\t\t\t\t\tFHC_JS_DATA_STORAGE_OBJECT.app_root\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t\tVue.nextTick(()=>{\n\t\t\t\t\t\tdocument.querySelectorAll(\".card-header\").forEach((el) => {\n\t\t\t\t\t\t\tel.classList.add(\"fhc-primary\");\n\t\t\t\t\t\t});\n\t\t\t\t\t\tdocument.querySelectorAll(\".row\").forEach((el) => {\n\t\t\t\t\t\t\tel.classList.add(\"w-100\");\n\t\t\t\t\t\t\tel.classList.add(\"align-items-center\");\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t});\n\t\t\t\t\t\tdocument.querySelectorAll(\".row h2\").forEach((el) => {\n\t\t\t\t\t\t\tel.classList.add(\"mb-0\");\n\t\t\t\t\t\t});\n\n\t\t\t\t\t})\n\t\t\t\t});\n\t\t},\n\t\tloadNewPageContent(data) {\n\t\t\tthis.$api\n\t\t\t\t.call(ApiCms.getNews(data.page, data.rows))\n\t\t\t\t.then(res => res.data)\n\t\t\t\t.then(result => {\n\t\t\t\t\tthis.content = result;\n\t\t\t\t\t\n\t\t\t\t});\n\t\t}\n },\n created() {\n this.fetchNews();\n\n\t\tthis.$api\n\t\t\t.call(ApiCms.getNewsRowCount())\n\t\t\t.then(res => res.data)\n\t\t\t.then(result => {\n\t\t\t\tthis.maxPageCount = result;\n\t\t\t});\n },\n template: /*html*/ `\n \t

    News

    \n\t
    \n\t\n\t\n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n\t\n\t\n `,\n};\n","\nexport default {\n\tname: \"RaumComponent\",\n\tdata() {\n\t\treturn {\n\t\t\timgContent: null\n\t\t}\n\t},\n props:{\n content:{\n type:String,\n required:true,\n },\n\t content_id:{\n\t\ttype: [Number, String],\n\t }\n },\n\tmethods: {\n\t\tsanitizeLegacyTables(table) {\n\n\t\t\t// find nested tables and replace with p element\n\t\t\tconst tt = table.querySelectorAll('table')\n\t\t\ttt.forEach(t => {\n\t\t\t\tconst textContent = t.textContent.trim();\n\t\t\t\tconst pElement = document.createElement('p');\n\t\t\t\tpElement.textContent = textContent;\n\t\t\t\tt.parentNode.replaceChild(pElement, t);\n\t\t\t})\n\n\t\t\t// find unordered lists, traverse li childs and replace with p element -> more readable than 1 p tag for ul\n\t\t\tconst ul = table.querySelectorAll('ul')\n\t\t\tul.forEach(u => {\n\t\t\t\tArray.from(u.children).forEach(li => {\n\t\t\t\t\tconst p = document.createElement('p');\n\t\t\t\t\tp.textContent = li.textContent\n\t\t\t\t\tu.parentNode.appendChild(p)\n\t\t\t\t})\n\t\t\t\tu.parentNode.removeChild(u)\n\n\t\t\t})\n\n\t\t\t// find bare text nodes and put into p element\n\t\t\tconst td = Array.from(table.querySelectorAll('td')).filter(el => el.scrollWidth > 100)\n\t\t\ttd.forEach(element => {\n\t\t\t\tif (element.firstChild?.nodeType === Node.TEXT_NODE && element.firstChild.length > 10) {\n\t\t\t\t\tconst p = document.createElement('p');\n\t\t\t\t\tp.appendChild(element.firstChild)\n\t\t\t\t\telement.appendChild(p);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// flatten nested th elements\n\t\t\tconst ths = Array.from(table.querySelectorAll('th'))\n\t\t\tths.forEach(th => {\n\n\t\t\t\tif(th.children.length > 1) {\n\t\t\t\t\tth.innerHTML = Array.from(th.childNodes).find(cn => cn.textContent).textContent\n\t\t\t\t}\n\t\t\t})\n\n\t\t\t// let p elements wrap on overflow\n\t\t\tconst p = table.querySelectorAll('p')\n\t\t\tp.forEach(p => {\n\t\t\t\tp.style.setProperty('word-wrap', 'break-word');\n\t\t\t\tp.style.setProperty('white-space', 'normal');\n\t\t\t\tp.style.setProperty('max-width', '400px');\n\t\t\t})\n\t\t}\n\t},\n mounted(){\n\t\t// replaces the tablesorter with the tabulator\n\t\tlet tables = document.getElementsByClassName(\"tablesorter\");\n\t\t\n\t\tfor (let table of tables) {\n\t\t\tthis.sanitizeLegacyTables(table)\n\t\t\tnew Tabulator(table, {\n\t\t\t\tlayout: \"fitDataStretch\",\n\n\t\t\t\tcolumnDefaults: {\n\t\t\t\t\tformatter: \"html\",\n\t\t\t\t\tresizable: false,\n\t\t\t\t\tminWidth: \"100px\",\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t\t\n\t\tlet title = document.getElementsByTagName(\"h1\");\n\t\ttitle = title.length ? title[0] : null;\n\t\t// tries to wrap the Raum titel with a link tag that redirects to the Reservierungen of that Raum\n\t\tif (title && title.innerText) \n\t\t{\n\t\t\tlet room_name = title.innerText;\n\t\t\tlet room_name_reg_exp = new RegExp(\"\\\\w*\\\\s([a-zA-Z][0-9\\\\.]+)$\");\n\t\t\tlet room_name_reg_exp_result = room_name.match(room_name_reg_exp);\n\t\t\tif(room_name_reg_exp_result)\n\t\t\t{\n\t\t\t\troom_name = room_name_reg_exp_result[0];\n\t\t\t\troom_name = room_name.replace(\" \",\"_\");\n\t\t\t\tlet link_element = document.createElement(\"a\");\n\t\t\t\tlink_element.href = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + \"/CisVue/Cms/getRoomInformation/\" + room_name;\n\t\t\t\tlink_element.appendChild(title.cloneNode(true));\n\t\t\t\ttitle.replaceWith(link_element);\n\n\t\t\t\tlet lvplanlinks = document.querySelectorAll('.menubox a[href*=\"stpl_week.php\"]');\n\t\t\t\tfor(let lvplanlink of lvplanlinks) {\n\t\t\t\t\tlvplanlink.href = link_element.href;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tconsole.error(`the regular expression did not match the room name: ${room_name}`);\n\t\t\t}\n\t\t\t\n\t\t\treturn\n\t\t}\n\t\t\n\t\tconst parser = new DOMParser()\n\t\tconst doc = parser.parseFromString(`
    ${this.content}
    `, \"text/html\");\n\n\t\tconst img = doc.querySelector(\"img\")\n\t\tif(img && img.title)\n\t\t{\n\t\t\tconst imgAttributes = {}\n\t\t\tfor (let attr of img.attributes) {\n\t\t\t\timgAttributes[attr.name] = attr.value\n\t\t\t}\n\n\t\t\tthis.imgContent = imgAttributes\n\t\t}\n\t\t\n\t\tconsole.error(`was not able to get the title of the raum_contentmittitel`);\n\t\t\n },\n template: /*html*/ `\n \n\n
    \n
    \n

    Content was not found

    \n `,\n };\n ","// collection of relative and absolute regex to replace legacy links\nconst GROUP_REPLACEMENT_STRATEGIES = {\n\tQUERY_PARAMETERS:'QUERY_PARAMETERS',\n\tPATH_SEGMENTS:'PATH_SEGMENTS',\n}\n\nconst regexList = {\n\trelative:[\n\t\t{ \n\t\t\tpriority: 1, \n\t\t\tregex: new RegExp(/^\\.\\.\\/cms\\/content\\.php\\?content_id=([0-9]+)/),\n\t\t\treplacement: FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/CisVue/Cms/content',\n\t\t\tgroup_replacement_strategy:GROUP_REPLACEMENT_STRATEGIES.PATH_SEGMENTS,\n\t\t},\n\t\t{ \n\t\t\tpriority: 2,\n\t\t\tregex: new RegExp(/^\\.\\.\\/cms\\/news\\.php/),\n\t\t\treplacement: FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/CisVue/Cms/news',\n\t\t},\n\t\t{ \n\t\t\tpriority: 3,\n\t\t\tregex: new RegExp(/^\\.\\.\\/index\\.ci\\.php/),\n\t\t\treplacement: FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router,\n\t\t},\n\t\t{ \n\t\t\tpriority: 10, \n\t\t\tregex: new RegExp(/^\\.\\.\\//),\n\t\t\treplacement: FHC_JS_DATA_STORAGE_OBJECT.app_root,\n\t\t},\n\t],\n\tabsolute:[\n\t\t{}\n\t]\n};\n\n// sorts the relative regex array by priority ascending\nconst relative_regex = regexList.relative\n\t.sort((a, b) => {\n\t\treturn a.priority - b.priority;\n\t})\n\t.map(regex => {\n\t\treturn {\n\t\t\tregex: regex.regex, \n\t\t\treplacement: regex.replacement,\n\t\t\tgroup_replacement_strategy: regex.group_replacement_strategy,\n\t\t}\n\t});\n\n// sorts the absolute regex array by priority ascending\nconst absolute_regex = regexList.absolute\n\t.sort((a, b) => {\n\t\treturn a.priority - b.priority;\n\t})\n\t.map(regex => {\n\t\treturn {\n\t\t\tregex: regex.regex,\n\t\t\treplacement: regex.replacement,\n\t\t\tgroup_replacement_strategy: regex.group_replacement_strategy,\n\t\t}\n\t})\n\n\nexport function replaceRelativeLegacyLink(relativeLegacyLink){\n\tfor (let {regex,replacement,group_replacement_strategy} of relative_regex){\t\n\t\t// if any of the regex matches the relativeLegacyLink, replace the matched part with the new app_root path\n\t\tlet match = relativeLegacyLink.match(regex);\n\t\tif (match) {\n\t\t\tlet new_link = relativeLegacyLink.replace(regex, replacement);\n\t\t\t\n\t\t\t\tswitch (group_replacement_strategy){\n\t\t\t\t\tcase 'QUERY_PARAMETERS':\n\t\t\t\t\t\t//TODO: this doesn't really work yet because the query parameter are key/value pairs\n\t\t\t\t\t\tnew_link = new_link.concat(`?${match[1]}`);\n\t\t\t\t\t\tfor (let query_parameter of match.slice(2)) {\n\t\t\t\t\t\t\tnew_link = new_link.concat(`&${query_parameter}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'PATH_SEGMENTS':\n\t\t\t\t\t\tfor (let query_parameter of match.slice(1)) { \n\t\t\t\t\t\t\tnew_link = new_link.concat(`/${query_parameter}`);\n\t\t\t\t\t\t} \n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\n\t\t\treturn new_link; \n\t\t}\n\t}\n\t// if none of the regex matched with the string return the original path\n\treturn relativeLegacyLink;\n}\n\n","import { replaceRelativeLegacyLink } from \"../../../../helpers/LegacyLinkReplaceHelper.js\"\nexport default {\n\tname: \"GeneralComponent\",\n props:{\n content:{\n type:String,\n required:true,\n },\n },\n\tmethods: {\n\t\tsanitizeLegacyTables(table) {\n\t\t\t\n\t\t\t// find nested tables and replace with p element\n\t\t\tconst tt = table.querySelectorAll('table')\n\t\t\ttt.forEach(t => {\n\t\t\t\tconst textContent = t.textContent.trim();\n\t\t\t\tconst pElement = document.createElement('p');\n\t\t\t\tpElement.textContent = textContent;\n\t\t\t\tt.parentNode.replaceChild(pElement, t);\n\t\t\t})\n\n\t\t\t// find unordered lists, traverse li childs and replace with p element -> more readable than 1 p tag for ul\n\t\t\tconst ul = table.querySelectorAll('ul')\n\t\t\tul.forEach(u => {\n\t\t\t\tArray.from(u.children).forEach(li => {\n\t\t\t\t\tconst p = document.createElement('p');\n\t\t\t\t\tp.textContent = li.textContent\n\t\t\t\t\tu.parentNode.appendChild(p)\n\t\t\t\t})\n\t\t\t\tu.parentNode.removeChild(u)\n\t\t\t\t\n\t\t\t})\n\n\t\t\t// find bare text nodes and put into p element\n\t\t\tconst td = Array.from(table.querySelectorAll('td')).filter(el => el.scrollWidth > 100)\n\t\t\ttd.forEach(element => {\n\t\t\t\tif (element.firstChild?.nodeType === Node.TEXT_NODE && element.firstChild.length > 10) {\n\t\t\t\t\tconst p = document.createElement('p');\n\t\t\t\t\tp.appendChild(element.firstChild)\n\t\t\t\t\telement.appendChild(p);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// flatten nested th elements\n\t\t\tconst ths = Array.from(table.querySelectorAll('th'))\n\t\t\tths.forEach(th => {\n\n\t\t\t\tif(th.children.length > 1) {\n\t\t\t\t\tth.innerHTML = Array.from(th.childNodes).find(cn => cn.textContent).textContent\n\t\t\t\t}\n\t\t\t})\n\n\t\t\t// let p elements wrap on overflow\n\t\t\tconst p = table.querySelectorAll('p')\n\t\t\tp.forEach(p => {\n\t\t\t\tp.style.setProperty('word-wrap', 'break-word');\n\t\t\t\tp.style.setProperty('white-space', 'normal');\n\t\t\t\tp.style.setProperty('max-width', '400px');\n\t\t\t})\n\t\t},\n\t\tprepareContent() {\n\t\t\t// replaces the tablesorter with the tabulator\n\t\t\tlet tables = Array.from(document.getElementsByClassName(\"tablesorter\"));\n\n\t\t\ttables.forEach((table, index) => {\n\t\t\t\tthis.sanitizeLegacyTables(table)\n\n\t\t\t\tnew Tabulator(table, {\n\t\t\t\t\tindex: index,\n\t\t\t\t\tlayout: \"fitDataFill\",\n\n\t\t\t\t\tcolumnDefaults: {\n\t\t\t\t\t\tformatter: \"html\",\n\t\t\t\t\t\tresizable: true,\n\t\t\t\t\t\tminWidth: \"100px\"\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\n\t\t\tdocument.querySelectorAll(\"#cms [data-confirm]\").forEach((el) => {\n\t\t\t\tel.addEventListener(\"click\", (evt) => {\n\t\t\t\t\tevt.preventDefault();\n\t\t\t\t\tBsConfirm.popup(el.dataset.confirm)\n\t\t\t\t\t.then(() => {\n\t\t\t\t\t\tAxios.get(el.href)\n\t\t\t\t\t\t.then((res) => {\n\t\t\t\t\t\t\t// TODO(chris): check for success then show message and/or reload\n\t\t\t\t\t\t\tlocation = location;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch((err) => console.error(\"ERROR:\", err));\n\t\t\t\t\t})\n\t\t\t\t\t.catch(() => {});\n\t\t\t\t});\n\t\t\t});\n\t\t\tdocument.querySelectorAll(\"#cms [data-href]\").forEach((el) => {\n\t\t\t\tel.href = el.dataset.href.replace(\n\t\t\t\t\t/^ROOT\\//,\n\t\t\t\t\tFHC_JS_DATA_STORAGE_OBJECT.app_root\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tdocument.querySelectorAll(\"[href]\").forEach((element) => {\n\t\t\t\tlet orignal_href = element.getAttribute(\"href\");\n\t\t\t\tlet new_href = replaceRelativeLegacyLink(orignal_href);\n\t\t\t\telement.href = new_href;\n\t\t\t});\n\n\t\t\tdocument.querySelectorAll(\"[style*=background-color]\").forEach((element) => {\n\t\t\t\tif (element.style.backgroundColor == \"rgb(255, 255, 255)\"){\n\t\t\t\t\telement.style.backgroundColor = \"var(--fhc-background)\";\n\t\t\t\t}\n\t\t\t\tif(element.querySelector(\"*[style*=background-color]\")){\n\t\t\t\t\telement.style.backgroundColor = \"var(--fhc-tertiary)\";\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t},\n\tupdated() {\n\t\tthis.prepareContent();\n\t},\n\tmounted(){\n\t\tthis.prepareContent();\n\t},\n template: /*html*/ `\n \n
    \n \t
    \n
    \n

    Content was not found

    \n `,\n };\n ","import raum_contentmittitel from './Content_types/Raum_contentmittitel.js'\nimport general from './Content_types/General.js'\nimport BsConfirm from \"../../Bootstrap/Confirm.js\";\nimport news_content from './Content_types/News_content.js';\nimport iframe_content from './Content_types/Iframe_content.js';\n\nimport ApiCms from '../../../api/factory/cms.js';\n\nexport default {\n\tname: \"ContentComponent\",\n\tprops: {\n\t\tcontent_id: {\n\t\t\ttype: [Number, String],\n\t\t\trequired: true\n\t\t},\n\t\tversion: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: null,\n\t\t},\n\t\tsichtbar: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: null,\n\t\t}\n\t},\n\tcomponents: {\n\t\traum_contentmittitel,\n\t\tnews_content,\n\t\tgeneral,\n\t\tiframe_content\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tcontent_type: null,\n\t\t\tcontent: null,\n\t\t\tcontent_id_internal: this.content_id\n\t\t};\n\t},\n\tmethods: {\n\t\tfetchContent(){\n\t\t\tthis.$api\n\t\t\t\t.call(ApiCms.content(this.content_id_internal, this.version, this.sprache, this.sichtbar))\n\t\t\t\t.then(res => {\n\t\t\t\t\tthis.$nextTick(function() {\n\t\t\t\t\t\tthis.content = res.data.content;\n\t\t\t\t\t\tthis.content_type = res.data.type;\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t}\n\t},\n\twatch:{\n\t\tsprache: function(sprache){\n\t\t\tthis.fetchContent();\n\t\t},\n\t\t'$route.params.content_id'(newVal) {\n\t\t\tthis.content_id_internal = newVal\n\t\t\tthis.fetchContent();\n\t\t}\n\t},\n\tcomputed: {\n\t\tsprache(){\n\t\t\treturn this.$p.user_language.value;\n\t\t},\n\t\tcomputeContentType: function () {\n\t\t\tswitch (this.content_type) {\n\t\t\t\tcase \"raum_contentmittitel\":\n\t\t\t\t\treturn \"raum_contentmittitel\";\n\t\t\t\tcase \"news\":\n\t\t\t\t\treturn \"news_content\";\n\t\t\t\tcase \"iframe\":\n\t\t\t\t\treturn \"iframe_content\";\n\t\t\t\tdefault:\n\t\t\t\t\treturn \"general\";\n\t\t\t};\n\t\t},\n\t},\n\tcreated() {\n\t\tthis.fetchContent();\n\t},\n\ttemplate: /*html*/ `\n \n\t
    \n \t\n\t
    \n

    No content is available to display

    \n `,\n};\n","import { replaceRelativeLegacyLink } from \"../../../../helpers/LegacyLinkReplaceHelper.js\"\nexport default {\n\tname: \"NewsContentType\",\n\tprops:{\n\t content:{\n\t\t type:String,\n\t\t required:true,\n\t },\n\t},\n\tmethods: {\n\t\tsanitizeLegacyTables(table) {\n\t\t\t\n\t\t\t// find nested tables and replace with p element\n\t\t\tconst tt = table.querySelectorAll('table')\n\t\t\ttt.forEach(t => {\n\t\t\t\tconst textContent = t.textContent.trim();\n\t\t\t\tconst pElement = document.createElement('p');\n\t\t\t\tpElement.textContent = textContent;\n\t\t\t\tt.parentNode.replaceChild(pElement, t);\n\t\t\t})\n\n\t\t\t// find unordered lists, traverse li childs and replace with p element -> more readable than 1 p tag for ul\n\t\t\tconst ul = table.querySelectorAll('ul')\n\t\t\tul.forEach(u => {\n\t\t\t\tArray.from(u.children).forEach(li => {\n\t\t\t\t\tconst p = document.createElement('p');\n\t\t\t\t\tp.textContent = li.textContent\n\t\t\t\t\tu.parentNode.appendChild(p)\n\t\t\t\t})\n\t\t\t\tu.parentNode.removeChild(u)\n\t\t\t\t\n\t\t\t})\n\n\t\t\t// find bare text nodes and put into p element\n\t\t\tconst td = Array.from(table.querySelectorAll('td')).filter(el => el.scrollWidth > 100)\n\t\t\ttd.forEach(element => {\n\t\t\t\tif (element.firstChild?.nodeType === Node.TEXT_NODE && element.firstChild.length > 10) {\n\t\t\t\t\tconst p = document.createElement('p');\n\t\t\t\t\tp.appendChild(element.firstChild)\n\t\t\t\t\telement.appendChild(p);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// flatten nested th elements\n\t\t\tconst ths = Array.from(table.querySelectorAll('th'))\n\t\t\tths.forEach(th => {\n\n\t\t\t\tif(th.children.length > 1) {\n\t\t\t\t\tth.innerHTML = Array.from(th.childNodes).find(cn => cn.textContent).textContent\n\t\t\t\t}\n\t\t\t})\n\n\t\t\t// let p elements wrap on overflow\n\t\t\tconst p = table.querySelectorAll('p')\n\t\t\tp.forEach(p => {\n\t\t\t\tp.style.setProperty('word-wrap', 'break-word');\n\t\t\t\tp.style.setProperty('white-space', 'normal');\n\t\t\t\tp.style.setProperty('max-width', '400px');\n\t\t\t})\n\t\t}\n\t},\n\tmounted(){\n\t\t// replaces the tablesorter with the tabulator\n\t\tlet tables = Array.from(document.getElementsByClassName(\"tablesorter\"));\n\n\t\ttables.forEach((table, index) => {\n\t\t\tthis.sanitizeLegacyTables(table)\n\t\t\t\n\t\t\tnew Tabulator(table, {\n\t\t\t\tindex: index,\n\t\t\t\tlayout: \"fitDataFill\",\n\n\t\t\t\tcolumnDefaults: {\n\t\t\t\t\tformatter: \"html\",\n\t\t\t\t\tresizable: true,\n\t\t\t\t\tminWidth: \"100px\"\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\n\t\tdocument.querySelectorAll(\"#cms [data-confirm]\").forEach((el) => {\n\t\t\tel.addEventListener(\"click\", (evt) => {\n\t\t\t evt.preventDefault();\n\t\t\t BsConfirm.popup(el.dataset.confirm)\n\t\t\t\t.then(() => {\n\t\t\t\t Axios.get(el.href)\n\t\t\t\t\t.then((res) => {\n\t\t\t\t\t\t// TODO(chris): check for success then show message and/or reload\n\t\t\t\t\t\tlocation = location;\n\t\t\t\t\t})\n\t\t\t\t\t.catch((err) => console.error(\"ERROR:\", err));\n\t\t\t\t})\n\t\t\t\t.catch(() => {});\n\t\t\t});\n\t\t });\n\t\tdocument.querySelectorAll(\"#cms [data-href]\").forEach((el) => {\n\t\t\tel.href = el.dataset.href.replace(\n\t\t\t\t/^ROOT\\//,\n\t\t\t\tFHC_JS_DATA_STORAGE_OBJECT.app_root\n\t\t\t);\n\t\t});\n\t\t\t\n\t\tdocument.querySelectorAll(\"[href]\").forEach((element) => {\n\t\t\tlet orignal_href = element.getAttribute(\"href\");\n\t\t\tlet new_href = replaceRelativeLegacyLink(orignal_href);\n\t\t\telement.href = new_href;\n\t\t});\n\n\t\tdocument.querySelectorAll(\"[style*=background-color]\").forEach((element) => {\n\t\t\tif (element.style.backgroundColor == \"rgb(255, 255, 255)\"){\n\t\t\t\telement.style.backgroundColor = \"var(--fhc-background)\";\n\t\t\t}\n\t\t\tif(element.querySelector(\"*[style*=background-color]\")){\n\t\t\t\telement.style.backgroundColor = \"var(--fhc-tertiary)\";\n\t\t\t}\n\t\t});\n\n\t\tVue.nextTick(() => {\n\t\t\tdocument.querySelectorAll(\".card-header\").forEach((el) => {\n\t\t\t\tel.classList.add(\"fhc-primary\");\n\t\t\t});\n\t\t\tdocument.querySelectorAll(\".row\").forEach((el) => {\n\t\t\t\tel.classList.add(\"w-100\");\n\t\t\t\tel.classList.add(\"align-items-center\");\n\n\t\t\t});\n\t\t\tdocument.querySelectorAll(\".row h2\").forEach((el) => {\n\t\t\t\tel.classList.add(\"mb-0\");\n\t\t\t});\n\n\t\t})\n\n\t},\n\ttemplate: /*html*/ `\n\t \n\t
    \n\t\t
    \n\t
    \n\t

    Content was not found

    \n\t `,\n };\n ","import { replaceRelativeLegacyLink } from \"../../../../helpers/LegacyLinkReplaceHelper.js\";\n\nexport default {\n\tname: \"iframe_content\",\n\tprops: {\n\t\tcontent: { type: String, required: true }\n\t},\n\tcomputed: {\n\t\tsrcUrl() {\n\t\t\tconst parser = new DOMParser()\n\t\t\tconst doc = parser.parseFromString(`
    ${this.content}
    `, \"text/html\");\n\t\t\tconst iframe = doc.querySelector(\"iframe[src]\");\n\n\t\t\tif (!iframe)\n\t\t\t\treturn \"\";\n\n\t\t\tlet url = iframe.getAttribute(\"src\") || \"\";\n\t\t\treturn replaceRelativeLegacyLink(url);\n\t\t}\n\t},\n\ttemplate: `\n\t\t
    \n\t\t\t\n\t\t
    Keine URL gefunden.
    \n\t\t
    \n\t`\n};\n","import FhcCalendar from \"../../Calendar/LvPlan.js\";\n\nimport ApiLvPlan from '../../../api/factory/lvPlan.js';\n\nexport const DEFAULT_MODE_RAUMINFO = 'Week'\n\nexport default {\n\tname: \"RoomInformation\",\n\tcomponents: {\n\t\tFhcCalendar\n\t},\n\tprops:{\n\t\tviewData: Object, // NOTE(chris): this is inherited from router-view\n\t\tpropsViewData: Object\n\t},\n\tcomputed: {\n\t\tcurrentDay() {\n\t\t\treturn this.propsViewData?.focus_date || luxon.DateTime.now().setZone(this.viewData.timezone).toISODate();\n\t\t},\n\t\tcurrentMode() {\n\t\t\treturn this.propsViewData?.mode || DEFAULT_MODE_RAUMINFO;\n\t\t}\n\t},\n\tmethods:{\n\t\thandleChangeDate(day, newMode) {\n\t\t\treturn this.handleChangeMode(newMode, day);\n\t\t},\n\t\thandleChangeMode(newMode, day) {\n\t\t\tconst mode = newMode[0].toUpperCase() + newMode.slice(1)\n\t\t\tconst focus_date = day.toISODate();\n\n\t\t\tthis.$router.push({\n\t\t\t\tname: \"RoomInformation\",\n\t\t\t\tparams: {\n\t\t\t\t\tmode,\n\t\t\t\t\tfocus_date,\n\t\t\t\t\tort_kurzbz: this.propsViewData.ort_kurzbz\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tgetPromiseFunc(start, end) {\n\t\t\treturn [\n\t\t\t\tthis.$api.call(ApiLvPlan.getRoomInfo(this.propsViewData.ort_kurzbz, start.toISODate(), end.toISODate())),\n\t\t\t\tthis.$api.call(ApiLvPlan.getOrtReservierungen(this.propsViewData.ort_kurzbz, start.toISODate(), end.toISODate()))\n\t\t\t];\n\t\t}\n\t},\n\ttemplate: /*html*/`\n\t
    \n\t\t

    {{ $p.t('rauminfo/rauminfo') }} {{ propsViewData.ort_kurzbz }}

    \n\t\t
    \n\t\t\n\t
    `\n};\n","export default {\n\tgetConfig() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Abgabe/getConfig'\n\t\t};\n\t},\n\tgetConfigStudent() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Abgabe/getConfigStudent'\n\t\t};\n\t},\n\tgetStudentProjektarbeiten(uid) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Abgabe/getStudentProjektarbeiten',\n\t\t\tparams: { uid }\n\t\t};\n\t},\n\tgetStudentProjektabgaben(detail) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Abgabe/getStudentProjektabgaben',\n\t\t\tparams: { projektarbeit_id: detail.projektarbeit_id, student_uid: detail.student_uid }\n\t\t};\n\t},\n\tpostStudentProjektarbeitEndupload(formData) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/Abgabe/postStudentProjektarbeitEndupload',\n\t\t\tparams: formData,\n\t\t\tconfig: {Headers: { \"Content-Type\": \"multipart/form-data\" }}\n\t\t};\n\t},\n\tpostStudentProjektarbeitZwischenabgabe(formData) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/Abgabe/postStudentProjektarbeitZwischenabgabe',\n\t\t\tparams: formData,\n\t\t\tconfig: {Headers: { \"Content-Type\": \"multipart/form-data\" }}\n\t\t};\n\t},\n\tgetMitarbeiterProjektarbeiten(all) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Abgabe/getMitarbeiterProjektarbeiten',\n\t\t\tparams: { showall: all }\n\t\t};\n\t},\n\tpostProjektarbeitAbgabe(termin) {\n\t\t\n\t\tlet dateString = termin.datum\n\t\tif(termin.datum instanceof Date) {\n\t\t\tconst year = termin.datum.getFullYear();\n\t\t\tconst month = String(termin.datum.getMonth() + 1).padStart(2, '0');\n\t\t\tconst day = String(termin.datum.getDate()).padStart(2, '0');\n\n\t\t\tdateString = `${year}-${month}-${day}`\n\t\t}\n\t\t\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/Abgabe/postProjektarbeitAbgabe',\n\t\t\tparams: { \n\t\t\t\tpaabgabe_id: termin.paabgabe_id,\n\t\t\t\tpaabgabetyp_kurzbz: termin.bezeichnung.paabgabetyp_kurzbz,\n\t\t\t\tdatum: dateString,\n\t\t\t\tnote: termin.note_pk,\n\t\t\t\tupload_allowed: !!termin.upload_allowed,\n\t\t\t\tbeurteilungsnotiz: termin.beurteilungsnotiz ?? '',\n\t\t\t\tfixtermin: termin.fixtermin,\n\t\t\t\tinsertvon: termin.insertvon,\n\t\t\t\tkurzbz: termin.kurzbz,\n\t\t\t\tprojektarbeit_id: termin.projektarbeit_id,\n\t\t\t\tbetreuer_person_id: termin.betreuer_person_id\n\t\t\t}\n\t\t};\n\t},\n\tdeleteProjektarbeitAbgabe(paabgabe_id) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/Abgabe/deleteProjektarbeitAbgabe',\n\t\t\tparams: { paabgabe_id }\n\t\t};\n\t},\n\tpostSerientermin(datum, paabgabetyp_kurzbz, bezeichnung, kurzbz, upload_allowed, projektarbeit_ids, fixtermin) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/Abgabe/postSerientermin',\n\t\t\tparams: { datum, paabgabetyp_kurzbz, bezeichnung, kurzbz, upload_allowed, projektarbeit_ids, fixtermin }\n\t\t};\n\t},\n\tfetchDeadlines(person_id) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/Abgabe/fetchDeadlines',\n\t\t\tparams: { person_id }\n\t\t};\n\t},\n\tgetPaAbgabetypen() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Abgabe/getPaAbgabetypen'\n\t\t};\n\t},\n\t//TODO: SWITCH TO NOTEN API ONCE NOTENTOOL IS IN MASTER TO AVOID DUPLICATE API\n\tgetNoten(){\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Abgabe/getNoten'\n\t\t};\n\t},\n\tgetProjektarbeitenForStudiengang(studiengang_kz, benotet = 0) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Abgabe/getProjektarbeitenForStudiengang',\n\t\t\tparams: { studiengang_kz, benotet }\n\t\t};\n\t},\n\t// TODO: this could also very well be generic info api\n\tgetStudiengaenge() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/Abgabe/getStudiengaenge'\n\t\t};\n\t},\n\tpostStudentProjektarbeitZusatzdaten(formData) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/Abgabe/postStudentProjektarbeitZusatzdaten',\n\t\t\tparams: formData,\n\t\t\tconfig: {Headers: { \"Content-Type\": \"multipart/form-data\" }}\n\t\t};\n\t},\n\tgetSignaturStatusForProjektarbeitAbgaben(paabgabe_ids, student_uid) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/Abgabe/getSignaturStatusForProjektarbeitAbgaben',\n\t\t\tparams: {paabgabe_ids, student_uid},\n\n\t\t};\n\t}\n};","export const FhcOverlay = {\n\tname: 'FhcOverlay',\n\tprops: {\n\t\tactive: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t}\t\n\t},\n\ttemplate: `\t\n\t\t
    \n\t\t\t\n\t\t
    \n\t`\n};\nexport default FhcOverlay;","import Upload from '../../../components/Form/Upload/Dms.js';\nimport BsModal from '../../Bootstrap/Modal.js';\nimport VueDatePicker from '../../vueDatepicker.js.php';\nimport ApiAbgabe from '../../../api/factory/abgabe.js'\nimport FhcOverlay from \"../../Overlay/FhcOverlay.js\";\n\nexport const AbgabeStudentDetail = {\n\tname: \"AbgabeStudentDetail\",\n\tcomponents: {\n\t\tUpload,\n\t\tBsModal,\n\t\tInputNumber: primevue.inputnumber,\n\t\tCheckbox: primevue.checkbox,\n\t\tDropdown: primevue.dropdown,\n\t\tTextarea: primevue.textarea,\n\t\tAccordion: primevue.accordion,\n\t\tAccordionTab: primevue.accordiontab,\n\t\tMessage: primevue.message,\n\t\tInplace: primevue.inplace,\n\t\tVueDatePicker,\n\t\tFhcOverlay\n\t},\n\tinject: ['notenOptions', 'isMobile', 'isViewMode', 'moodle_link'],\n\tprops: {\n\t\tprojektarbeit: {\n\t\t\ttype: Object,\n\t\t\tdefault: null\n\t\t},\n\t\tviewMode: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tloading: false,\n\t\t\teidAkzeptiert: false,\n\t\t\tenduploadTermin: null,\n\t\t\tallActiveLanguages: FHC_JS_DATA_STORAGE_OBJECT.server_languages,\n\t\t\tform: Vue.reactive({\n\t\t\t\tsprache: '',\n\t\t\t\tabstract: '',\n\t\t\t\tabstract_en: '',\n\t\t\t\tschlagwoerter: '',\n\t\t\t\tschlagwoerter_en: '',\n\t\t\t\tkontrollschlagwoerter: '',\n\t\t\t\tseitenanzahl: 1,\n\t\t\t})\n\t\t}\n\t},\n\tmethods: {\n\t\tgetNoteBezeichnung(termin){\n\t\t\tconst noteOpt = this.notenOptions.find(opt => opt.note == termin.note)\n\t\t\t\n\t\t\tif(noteOpt?.bezeichnung) {\n\t\t\t\treturn noteOpt?.positiv ? this.$capitalize(this.$p.t('abgabetool/c4positivBenotet')) + ' ✅' : this.$capitalize(this.$p.t('abgabetool/c4negativBenotet')) + ' ❌'\n\t\t\t} else if(noteOpt?.benotbar === true && !termin.note) {\n\t\t\t\treturn this.$capitalize(this.$p.t('abgabetool/c4notYetGraded'));\n\t\t\t} else {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t},\n\t\tasync validate(termin, endupload = false) {\n\t\t\tif(!termin.file.length) {\n\t\t\t\tthis.$fhcAlert.alertWarning(this.$capitalize(this.$p.t('global/warningChooseFile')));\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t\n\t\t\tif(endupload) {\n\t\t\t\tif(await this.$fhcAlert.confirm({\n\t\t\t\t\tmessage: this.$p.t('abgabetool/confirmEnduploadSpeichern'),\n\t\t\t\t\tacceptLabel: this.$capitalize(this.$p.t('abgabetool/c4AcceptAndProceed')),\n\t\t\t\t\tacceptClass: 'p-button-primary',\n\t\t\t\t\trejectLabel: this.$capitalize(this.$p.t('abgabetool/c4Cancel')),\n\t\t\t\t\trejectClass: 'p-button-secondary'\n\t\t\t\t}) === false) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn true;\n\t\t},\n\t\tasync triggerEndupload() {\n\t\t\t\n\t\t\tif (!await this.validate(this.enduploadTermin, true))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t\n\t\t\t// post endabgabe\n\t\t\tconst formData = new FormData();\n\t\t\tformData.append('paabgabetyp_kurzbz', this.enduploadTermin.paabgabetyp_kurzbz)\n\t\t\tformData.append('projektarbeit_id', this.enduploadTermin.projektarbeit_id);\n\t\t\tformData.append('paabgabe_id', this.enduploadTermin.paabgabe_id)\n\t\t\tformData.append('student_uid', this.projektarbeit.student_uid)\n\t\t\tformData.append('bperson_id', this.projektarbeit.bperson_id)\n\t\t\t\n\t\t\tformData.append('sprache', this.form['sprache'].sprache)\n\t\t\tformData.append('abstract', this.form['abstract'])\n\t\t\tformData.append('abstract_en', this.form['abstract_en'])\n\t\t\tformData.append('schlagwoerter', this.form['schlagwoerter'])\n\t\t\tformData.append('schlagwoerter_en', this.form['schlagwoerter_en'])\n\t\t\tformData.append('seitenanzahl', this.form['seitenanzahl'])\n\t\t\t\n\t\t\tfor (let i = 0; i < this.enduploadTermin.file.length; i++) {\n\t\t\t\tformData.append('file', this.enduploadTermin.file[i]);\n\t\t\t}\n\t\t\tthis.loading = true\n\t\t\tthis.$api.call(ApiAbgabe.postStudentProjektarbeitEndupload(formData))\n\t\t\t\t.then(res => {\n\t\t\t\t\tthis.handleUploadRes(res, this.enduploadTermin)\n\t\t\t\t}).finally(()=> {\n\t\t\t\t\tthis.loading = false\n\t\t\t})\n\t\t\t\n\t\t\tthis.$refs.modalContainerEnduploadZusatzdaten.hide()\n\t\t},\n\t\tdownloadAbgabe(termin) {\n\t\t\tconst url = `/api/frontend/v1/Abgabe/getStudentProjektarbeitAbgabeFile?paabgabe_id=${termin.paabgabe_id}&student_uid=${this.projektarbeit.student_uid}&projektarbeit_id=${this.projektarbeit.projektarbeit_id}`;\n\n\t\t\twindow.open(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + url)\n\t\t\t// this.$api.call(ApiAbgabe.getStudentProjektarbeitAbgabeFile(termin.paabgabe_id, this.projektarbeit.student_uid))\n\t\t},\n\t\tformatDate(dateParam) {\n\t\t\tconst date = new Date(dateParam)\n\t\t\t// handle missing leading 0\n\t\t\tconst padZero = (num) => String(num).padStart(2, '0');\n\n\t\t\tconst month = padZero(date.getMonth() + 1); // Months are zero-based\n\t\t\tconst day = padZero(date.getDate());\n\t\t\tconst year = date.getFullYear();\n\n\t\t\treturn `${day}.${month}.${year}`\n\t\t},\n\t\tasync upload(termin) {\n\n\t\t\t// only do this on endupload\n\t\t\tif (! await this.validate(termin))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t\n\t\t\tif(termin.bezeichnung?.paabgabetyp_kurzbz === 'end') {\n\t\t\t\t// open endupload form modal for further inputs\n\t\t\t\tthis.enduploadTermin = termin\n\t\t\t\tthis.$refs.modalContainerEnduploadZusatzdaten.show()\n\t\t\t} else {\n\t\t\t\tconst formData = new FormData();\n\t\t\t\tformData.append('paabgabetyp_kurzbz', termin.paabgabetyp_kurzbz)\n\t\t\t\tformData.append('projektarbeit_id', this.projektarbeit.projektarbeit_id)\n\t\t\t\tformData.append('paabgabe_id', termin.paabgabe_id)\n\t\t\t\tformData.append('student_uid', this.projektarbeit.student_uid)\n\t\t\t\tformData.append('bperson_id', this.projektarbeit.bperson_id)\n\t\t\t\t\n\t\t\t\tfor (let i = 0; i < termin.file.length; i++) {\n\t\t\t\t\tformData.append('file', termin.file[i]);\n\t\t\t\t}\n\n\t\t\t\tthis.loading = true\n\t\t\t\tthis.$api.call(ApiAbgabe.postStudentProjektarbeitZwischenabgabe(formData))\n\t\t\t\t\t.then(res => {\n\t\t\t\t\t\tthis.handleUploadRes(res, termin)\n\t\t\t\t\t}).finally(()=> {\n\t\t\t\t\t\tthis.loading = false\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\t\thandleUploadRes(res, termin) {\n\t\t\tif(res.meta.status == \"success\") {\n\t\t\t\tthis.$fhcAlert.alertSuccess(this.$capitalize(this.$p.t('abgabetool/c4fileUploadSuccessv3')))\n\n\t\t\t\t// update 'abgabedatum' for successful upload -> shows the pdf icon and date once set\n\t\t\t\ttermin.abgabedatum = new Date().toISOString().split('T')[0];\n\t\t\t\tif(res?.data?.signatur !== undefined) {\n\t\t\t\t\ttermin.signatur = res.data.signatur\n\t\t\t\t}\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\tthis.$fhcAlert.alertError(this.$capitalize(this.$p.t('abgabetool/c4fileUploadErrorv3')))\n\t\t\t}\n\t\t\t\n\t\t\tif(res.meta.signaturInfo) {\n\t\t\t\tthis.$fhcAlert.alertInfo(res.meta.signaturInfo)\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t},\n\t\tgetOptionLabel(option) {\n\t\t\treturn option.sprache\n\t\t},\n\t\tgetTerminNoteBezeichnung(termin) {\n\t\t\tconst noteOpt = this.notenOptions.find(opt => opt.note == termin.note)\n\t\t\treturn noteOpt ? noteOpt.bezeichnung : ''\n\t\t},\n\t},\n\twatch: {\n\t\tprojektarbeit(newVal) {\n\t\t\t// default select german if projektarbeit sprache was null\n\t\t\tthis.form.sprache = newVal.sprache ? this.allActiveLanguages.find(lang => lang.sprache == newVal.sprache) : this.allActiveLanguages.find(lang => lang.sprache == 'German')\n\t\t\tthis.form.abstract = newVal.abstract ?? ''\n\t\t\tthis.form.abstract_en = newVal.abstract_en ?? ''\n\t\t\tthis.form.schlagwoerter = newVal.schlagwoerter ?? ''\n\t\t\tthis.form.schlagwoerter_en = newVal.schlagwoerter_en ?? ''\n\t\t\tthis.form.kontrollschlagwoerter = newVal.kontrollschlagwoerter ?? ''\n\t\t\tthis.form.seitenanzahl = newVal.seitenanzahl ?? 1\n\t\t\t\n\t\t}\n\t},\n\tcomputed: {\n\t\tgetMoodleLink() {\n\t\t\treturn this.moodle_link + this.projektarbeit.studiengang_kz\t\n\t\t},\n\t\tgetMessagePtStyle() {\n\t\t\t// adjust outer spacing and internal padding to appear similar to doenload button in size\n\t\t\treturn {\n\t\t\t\troot: {\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tmargin: '0px'\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\twrapper: {\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tpadding: '6px'\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tgetEid() {\n\t\t\treturn this.$capitalize(this.$p.t('abgabetool/c4eidesstattlicheErklaerung'))\n\t\t},\n\t\tallowedToSaveZusatzdaten() {\n\t\t\treturn this.form.schlagwoerter.length > 0 && this.form.schlagwoerter_en.length > 0 && this.form.abstract.length > 0 && this.form.abstract_en.length > 0 && this.form.seitenanzahl > 0\n\t\t},\n\t\tgetAllowedToSendEndupload() {\n\t\t\treturn this.eidAkzeptiert && this.allowedToSaveZusatzdaten\n\t\t},\n\t\tqualityGateTerminAvailable() {\n\t\t\tlet qgatefound = false\n\t\t\tthis.projektarbeit?.abgabetermine.forEach(abgabe => {\n\t\t\t\tif(abgabe.paabgabetyp_kurzbz == 'qualgate1'\n\t\t\t\t\t|| abgabe.paabgabetyp_kurzbz == 'qualgate2') {\n\t\t\t\t\tqgatefound = true\n\t\t\t\t}\n\t\t\t})\n\t\t\treturn qgatefound\n\t\t},\n\t\tgetTooltipVerspaetet() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4tooltipVerspaetet')),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipVerpasst() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4tooltipVerpasst')),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipAbzugeben() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4tooltipAbzugeben')),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipStandard() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4tooltipStandardv2')),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipAbgegeben() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4tooltipAbgegeben')),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipFixtermin() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4tooltipFixtermin')),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipAbgabeDetected() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4tooltipAbgabeDetected')),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipNotAllowedToUpload() {\n\t\t\tif(this.isViewMode) {\n\t\t\t\treturn {\n\t\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4studentAbgabeNotAllowedInViewMode')),\n\t\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn {\n\t\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4studentAbgabeNotAllowedRegular')),\n\t\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tgetTooltipBeurteilungerforderlich() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4tooltipBeurteilungerforderlich')),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipBestanden() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipBestanden'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipNichtBestanden() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipNichtBestanden'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t},\n\tcreated() {\n\t\t\n\t},\n\tmounted() {\n\n\t},\n\ttemplate: `\n\t\t\n\n\t\t
    \n\t\t\n\t\t\t
    {{$capitalize( $p.t('abgabetool/c4abgabeStudentenbereich') )}}
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t

    {{$capitalize( $p.t('person/student') ) }}: {{projektarbeit?.student}}

    \n\t\t\t\t\t

    {{$capitalize( $p.t('abgabetool/c4titel') ) }}: {{projektarbeit?.titel}}

    \n\t\t\t\t\t

    {{$capitalize( $p.t('abgabetool/c4betreuerv2') ) }}: {{projektarbeit ? $p.t('abgabetool/c4betrart' + projektarbeit.betreuerart_kurzbz) + ' ' + projektarbeit.betreuer : ''}}

    \n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t

    {{ $p.t('abgabetool/c4checkoutStgMoodleInfos') }} \n\t\t\t\t\t\tMoodle\n\t\t\t\t\t

    \n\t\t\t\t
    \n\t\t\t
    \n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t
    \n\t\t\t\t
    {{ $capitalize( $p.t('abgabetool/c4keineAbgabetermineGefunden') )}}
    \n\t\t\t
    \n\t\t\t\n\t\t
    \n\t \t\n\t \t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t \t\n `,\n};\n\nexport default AbgabeStudentDetail;\n","\nconst zone = 'Europe/Vienna';\nconst today = luxon.DateTime.now().setZone(zone);\n\nexport function getDateStyleClass(termin, notenOptions) {\n\tconst datum = luxon.DateTime.fromISO(termin.datum, { zone }).endOf('day');\n\tconst abgabedatum = termin.abgabedatum ? luxon.DateTime.fromISO(termin.abgabedatum, { zone }) : null;\n\ttermin.diffindays = datum.diff(today, 'days').days;\n\tconst isLate = abgabedatum && abgabedatum > datum;\n\n\t// GRADE STATUS\n\tif (termin.note) {\n\t\tconst opt = typeof termin.note === 'object' ? termin.note : notenOptions.find(nopt => nopt.note == termin.note)\n\t\tif (opt?.positiv === true) return 'bestanden';\n\t\telse if (opt?.positiv === false) return 'nichtbestanden';\n\t}\n\t\n\t// ACTION REQUIRED FOR GRADE\n\tif (termin.bezeichnung?.benotbar && datum <= today) {\n\t\treturn 'beurteilungerforderlich';\n\t}\n\n\t// SUBMISSION STATUS\n\tif (termin.upload_allowed) {\n\t\tif (termin.abgabedatum) {\n\t\t\treturn isLate ? 'verspaetet' : 'abgegeben';\n\t\t}\n\n\t\t// no submission yet\n\t\tif (datum < today) return 'verpasst';\n\t\tif (termin.diffindays <= 12) return 'abzugeben';\n\t\treturn 'standard';\n\t}\n\n\t// GENERIC STATUS\n\treturn datum < today ? 'verpasst' : 'standard';\n}","import AbgabeDetail from \"./AbgabeStudentDetail.js\";\nimport ApiAbgabe from '../../../api/factory/abgabe.js'\nimport BsModal from \"../../Bootstrap/Modal.js\";\nimport FhcOverlay from \"../../Overlay/FhcOverlay.js\";\nimport { getDateStyleClass} from \"./getDateStyleClass.js\";\n\nexport const AbgabetoolStudent = {\n\tname: \"AbgabetoolStudent\",\n\tcomponents: {\n\t\tAccordion: primevue.accordion,\n\t\tAccordionTab: primevue.accordiontab,\n\t\tBsModal,\n\t\tAbgabeDetail,\n\t\tFhcOverlay\n\t},\n\tprovide() {\n\t\treturn {\n\t\t\tnotenOptions: Vue.computed(() => this.notenOptions),\n\t\t\tisViewMode: Vue.computed(() => this.isViewMode),\n\t\t\tmoodle_link: Vue.computed(() => this.moodle_link)\n\t\t}\n\t},\n\tprops: {\n\t\tstudent_uid_prop: {\n\t\t\tdefault: null\n\t\t},\n\t\tviewData: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t\tdefault: () => ({uid: ''}),\n\t\t\tvalidator(value) {\n\t\t\t\treturn value && value.uid\n\t\t\t}\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tactiveTabIndex: [0],\n\t\t\tabgabeTypeOptions: null,\n\t\t\tphrasenPromise: null,\n\t\t\tphrasenResolved: false,\n\t\t\tloading: false,\n\t\t\tnotenOptions: null,\n\t\t\tdetail: null,\n\t\t\tprojektarbeiten: null,\n\t\t\tselectedProjektarbeit: null,\n\t\t\tmoodle_link: null\n\t\t};\n\t},\n\tmethods: {\n\t\tcheckQualityGatesStrict(termine) {\n\t\t\tlet qgate1Passed = false\n\t\t\tlet qgate2Passed = false\n\t\t\t\n\t\t\ttermine.forEach(t => {\n\t\t\t\tconst noteOption = this.notenOptions?.find(opt => opt.note == t.note)\n\t\t\t\tif(noteOption && noteOption.positiv) {\n\t\t\t\t\tif(t.paabgabetyp_kurzbz == 'qualgate1') {\n\t\t\t\t\t\tqgate1Passed = true\n\t\t\t\t\t} else if(t.paabgabetyp_kurzbz == 'qualgate2') {\n\t\t\t\t\t\tqgate2Passed = true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\n\t\t\treturn qgate1Passed && qgate2Passed\n\t\t},\n\t\tcheckQualityGatesOptional(termine) {\n\t\t\tconst qgate1found = termine.find(t => t.paabgabetyp_kurzbz == 'qualgate1')\n\t\t\tconst qgate2found = termine.find(t => t.paabgabetyp_kurzbz == 'qualgate2')\n\t\t\t\n\t\t\tlet qgate1positiv = true\n\t\t\tif(qgate1found) {\n\t\t\t\tqgate1positiv = false\n\n\t\t\t\ttermine.forEach(t => {\n\t\t\t\t\tconst noteOption = this.notenOptions?.find(opt => opt.note == t.note)\n\t\t\t\t\tif(noteOption && noteOption.positiv) {\n\t\t\t\t\t\tif (t.paabgabetyp_kurzbz == 'qualgate1') {\n\t\t\t\t\t\t\tqgate1positiv = true\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tlet qgate2positiv = true\n\t\t\tif(qgate2found) {\n\t\t\t\tqgate2positiv = false\n\n\t\t\t\ttermine.forEach(t => {\n\t\t\t\t\tconst noteOption = this.notenOptions?.find(opt => opt.note == t.note)\n\t\t\t\t\tif(noteOption && noteOption.positiv) {\n\t\t\t\t\t\tif (t.paabgabetyp_kurzbz == 'qualgate2') {\n\t\t\t\t\t\t\tqgate2positiv = true\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\n\t\t\treturn qgate1positiv && qgate2positiv\n\t\t},\n\t\tisPastDate(date) {\n\t\t\tconst deadline = luxon.DateTime.fromISO(date, { zone: 'Europe/Vienna' }).endOf('day');\n\t\t\tconst nowInVienna = luxon.DateTime.now().setZone('Europe/Vienna');\n\t\t\treturn nowInVienna > deadline;\n\t\t},\n\t\tsetDetailComponent(details){\n\t\t\tthis.loading = true\n\t\t\tthis.loadAbgaben(details).then((res)=> {\n\t\t\t\tconst pa = this.projektarbeiten?.find(projekarbeit => projekarbeit.projektarbeit_id == details.projektarbeit_id)\n\t\t\t\tpa.abgabetermine = res.data[0].retval\n\t\t\t\t\n\t\t\t\tconst paIsBenotet = pa.note !== null\n\t\t\t\t\n\t\t\t\tpa.abgabetermine.forEach(termin => {\n\t\t\t\t\ttermin.file = []\n\t\t\t\t\ttermin.allowedToUpload = false\n\t\t\t\t\t\n\t\t\t\t\tif(termin.paabgabetyp_kurzbz == 'end') {\n\t\t\t\t\t\t// old assumed production logic when qgates are required\n\t\t\t\t\t\t// termin.allowedToUpload = !this.isPastDate(termin.datum) && this.checkQualityGatesStrict(pa.abgabetermine)\n\t\t\t\t\t\t\n\t\t\t\t\t\tconst inTime = termin.fixtermin ? !this.isPastDate(termin.datum) : true\n\t\t\t\t\t\ttermin.allowedToUpload = inTime && this.checkQualityGatesOptional(pa.abgabetermine)\n\n\n\t\t\t\t\t\t// development purposes\n\t\t\t\t\t\t// termin.allowedToUpload = this.checkQualityGatesStrict(pa.abgabetermine)\n\t\t\t\t\t\t// termin.allowedToUpload = true\n\n\t\t\t\t\t} else if(termin.fixtermin) {\n\t\t\t\t\t\ttermin.allowedToUpload = !this.isPastDate(termin.datum)\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// this could confuse people since we should dont show people this flag\n\t\t\t\t\t\ttermin.allowedToUpload = termin.upload_allowed \n\t\t\t\t\t}\n\n\t\t\t\t\t// blocks client upload button if projektarbeitet is already beurteilt und thus further abgaben on any termin should be blocked\n\t\t\t\t\tif(paIsBenotet) termin.allowedToUpload = false\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\ttermin.bezeichnung = this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz === termin.paabgabetyp_kurzbz)\n\t\t\t\t\ttermin.dateStyle = getDateStyleClass(termin, this.notenOptions)\n\t\t\t\t})\n\t\t\t\t\n\t\t\t\tpa.betreuer = this.buildBetreuer(pa)\n\t\t\t\tpa.student_uid = this.student_uid\n\t\t\t\t\n\t\t\t\tthis.selectedProjektarbeit = pa\n\n\t\t\t\tthis.$refs.modalContainerAbgabeDetail.show()\n\t\t\t\t\n\t\t\t}).finally(()=>{this.loading=false})\n\t\t},\n\t\tcenteredTextFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\n\t\t\treturn '
    ' +\n\t\t\t\t'

    '+val+'

    '\n\t\t},\n\t\tdetailFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\n\t\t\tif(val.mode === 'detailTermine') {\n\t\t\t\treturn '
    ' +\n\t\t\t\t\t'
    '\n\t\t\t} else if (val.mode === 'beurteilungDownload') {\n\t\t\t\treturn '
    ' +\n\t\t\t\t\t'
    '\n\t\t\t}\n\t\t},\n\t\tmailFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\t\t\t\treturn '
    ' +\n\t\t\t\t\t'
    '\n\t\t},\n\t\tbeurteilungFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\t\t\tif(val) {\n\t\t\t\treturn '
    ' +\n\t\t\t\t\t'
    '\n\t\t\t} else return '-'\n\t\t},\n\t\tbuildMailToLink(projekt) {\n\t\t\t// should always be \"projekt.mitarbeiter_uid +'@'+ this.domain\", built in backend\n\t\t\treturn 'mailto:' + projekt.email\n\t\t},\n\t\tbuildBetreuer(abgabe) {\n\t\t\treturn (abgabe.btitelpre ? abgabe.btitelpre + ' ' : '') + abgabe.bvorname + ' ' + abgabe.bnachname + (abgabe.btitelpost ? ' ' + abgabe.btitelpost : '')\n\t\t},\n\t\tasync setupData(data){\n\t\t\t// this.projektarbeiten = data[0]\n\t\t\tconst projektarbeiten = data[0] ?? null\n\t\t\tif(!projektarbeiten) return\n\t\t\tthis.projektarbeiten = projektarbeiten.map(projekt => {\n\t\t\t\tlet mode = 'detailTermine'\n\t\t\t\t\n\t\t\t\treturn {\n\t\t\t\t\t...projekt,\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\tstudent_uid: this.student_uid,\n\t\t\t\t\t\tprojektarbeit_id: projekt.projektarbeit_id,\n\t\t\t\t\t\tbetreuer_person_id: projekt.bperson_id,\n\t\t\t\t\t\tbetreuerart_kurzbz: projekt.betreuerart_kurzbz,\n\t\t\t\t\t\tmode\n\t\t\t\t\t},\n\t\t\t\t\tbeurteilung1: projekt.downloadLink1 ?? null,\n\t\t\t\t\tbeurteilung2: projekt.downloadLink2 ?? null,\n\t\t\t\t\tsem: projekt.studiensemester_kurzbz,\n\t\t\t\t\tstg: projekt.kurzbzlang,\n\t\t\t\t\tmail: this.buildMailToLink(projekt),\n\t\t\t\t\tbetreuer: this.buildBetreuer(projekt),\n\t\t\t\t\ttyp: projekt.projekttypbezeichnung,\n\t\t\t\t\ttitel: projekt.titel\n\t\t\t\t}\n\t\t\t})\n\n\t\t},\n\t\tloadProjektarbeiten() {\n\t\t\tthis.$api.call(ApiAbgabe.getStudentProjektarbeiten(this.student_uid))\n\t\t\t\t.then(res => {\n\t\t\t\t\tif(res?.data) this.setupData(res.data)\n\t\t\t\t})\n\t\t},\n\t\tloadAbgaben(details) {\n\t\t\treturn new Promise((resolve) => {\n\t\t\t\tthis.$api.call(ApiAbgabe.getStudentProjektabgaben(details))\n\t\t\t\t\t.then(res => {\n\t\t\t\t\t\tresolve(res)\n\t\t\t\t\t})\n\t\t\t})\t\n\t\t},\n\t\tasync setupMounted() {\n\t\t\tthis.loadProjektarbeiten()\n\t\t},\n\t\tgetAccTabHeaderForProjektarbeit(projektarbeit) {\n\t\t\tlet title = ''\n\t\t\t\n\t\t\ttitle += projektarbeit.titel ?? this.$p.t('abgabetool/keinTitel')\n\t\t\t\n\t\t\treturn title\n\t\t},\n\t\tgetMailLink(projektarbeit) {\n\t\t\tif(projektarbeit.email) {\n\t\t\t\treturn 'mailto:'+projektarbeit.email\n\t\t\t} else return ''\n\t\t},\n\t\tgetNoteBezeichnung(projektarbeit) {\n\t\t\tif(projektarbeit.note && this.notenOptions) {\n\t\t\t\tconst noteOpt = this.notenOptions.find(opt => opt.note == projektarbeit.note)\n\t\t\t\treturn noteOpt?.bezeichnung\n\t\t\t} else {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t},\n\t\thandleDownloadBeurteilung1(projektarbeit) {\n\t\t\twindow.open(projektarbeit.beurteilung1)\n\t\t},\n\t\thandleDownloadBeurteilung2(projektarbeit) {\n\t\t\twindow.open(projektarbeit.beurteilung2)\n\t\t}\n\t},\n\twatch: {\n\n\t},\n\tcomputed: {\n\t\tisViewMode() {\n\t\t\treturn this.student_uid !== this.viewData.uid\n\t\t},\n\t\tstudent_uid() {\n\t\t\treturn this.student_uid_prop || this.viewData?.uid || null\n\t\t}\n\t},\n\tasync created() {\n\t\tthis.phrasenPromise = this.$p.loadCategory(['abgabetool', 'global'])\n\t\tthis.phrasenPromise.then(()=> {this.phrasenResolved = true})\n\t\t\n\t\tthis.loading = true\n\t\t//TODO: SWITCH TO NOTEN API ONCE NOTENTOOL IS IN MASTER TO AVOID DUPLICATE API\n\t\tawait this.$api.call(ApiAbgabe.getNoten()).then(res => {\n\t\t\tif(res.meta.status == 'success') {\n\t\t\t\tthis.notenOptions = res.data[0]\n\n\t\t\t\tthis.allowedNotenOptions = this.notenOptions.filter(\n\t\t\t\t\topt => res.data[1].includes(opt.note)\n\t\t\t\t)\n\t\t\t}\n\t\t}).finally(() => {\n\t\t\tthis.loading = false\n\t\t})\n\n\t\t// fetch abgabetypen options\n\t\tthis.$api.call(ApiAbgabe.getPaAbgabetypen()).then(res => {\n\t\t\tthis.abgabeTypeOptions = res.data\n\t\t}).catch(e => {\n\t\t\tthis.loading = false\n\t\t})\n\n\t\t// fetch config to avoid hard coded links\n\t\tthis.$api.call(ApiAbgabe.getConfigStudent()).then(res => {\n\t\t\tthis.moodle_link = res.data?.moodle_link\n\t\t}).catch(e => {\n\t\t\tthis.loading = false\n\t\t})\n\t},\n\tmounted() {\n\t\tthis.setupMounted()\n\t},\n\ttemplate: `\n\n `,\n};\n\nexport default AbgabetoolStudent;\n","import BsModal from '../../Bootstrap/Modal.js';\nimport VueDatePicker from '../../vueDatepicker.js.php';\nimport ApiAbgabe from '../../../api/factory/abgabe.js'\nimport { getDateStyleClass } from \"./getDateStyleClass.js\";\n\nexport const AbgabeMitarbeiterDetail = {\n\tname: \"AbgabeMitarbeiterDetail\",\n\tcomponents: {\n\t\tBsModal,\n\t\tInputNumber: primevue.inputnumber,\n\t\tCheckbox: primevue.checkbox,\n\t\tDropdown: primevue.dropdown,\n\t\tTextarea: primevue.textarea,\n\t\tSpeedDial: primevue.speeddial,\n\t\tAccordion: primevue.accordion,\n\t\tAccordionTab: primevue.accordiontab,\n\t\tMessage: primevue.message,\n\t\tVueDatePicker\n\t},\n\temits: ['paUpdated'],\n\tinject: [\n\t\t'abgabeTypeOptions',\n\t\t'abgabetypenBetreuer',\n\t\t'allowedNotenOptions',\n\t\t'notenOptionsNonFinal',\n\t\t'turnitin_link',\n\t\t'old_abgabe_beurteilung_link'\n\t],\n\tprops: {\n\t\tprojektarbeit: {\n\t\t\ttype: Object,\n\t\t\tdefault: null\n\t\t},\n\t\tisFullscreen: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t},\n\t\tassistenzMode: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tshowAutomagicModalPhrase: false,\n\t\t\teidAkzeptiert: false,\n\t\t\tenduploadTermin: null,\n\t\t\tallActiveLanguages: FHC_JS_DATA_STORAGE_OBJECT.server_languages,\n\t\t\tspeedDialItems: [{\n\t\t\t\tlabel: Vue.computed(() => this.$p.t('abgabetool/c4newAbgabetermin')),\n\t\t\t\ticon: \"fa fa-plus\",\n\t\t\t\tcommand: this.openCreateNewAbgabeModal,\n\t\t\t\tdisabled: Vue.computed(() => !this.getAllowedToCreateNewTermin)\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: Vue.computed(() => this.$p.t('abgabetool/c4benoten')),\n\t\t\t\ticon: \"fa fa-user-check\",\n\t\t\t\tcommand: this.openBenotung,\n\t\t\t\tdisabled: Vue.computed(()=> this.assistenzMode == true)\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: Vue.computed(() => this.$p.t('abgabetool/c4plagiatcheck_link')),\n\t\t\t\ticon: \"fa fa-clipboard-check\",\n\t\t\t\tcommand: this.openPlagiatcheck\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: Vue.computed(() => this.$p.t('abgabetool/c4student_perspective')),\n\t\t\t\ticon: \"fa fa-eye\",\n\t\t\t\tcommand: this.openStudentPage\n\t\t\t}],\n\t\t\tnewTermin: null,\n\t\t\tform: Vue.reactive({\n\t\t\t\tsprache: '',\n\t\t\t\tabstract: '',\n\t\t\t\tabstract_en: '',\n\t\t\t\tschlagwoerter: '',\n\t\t\t\tschlagwoerter_en: '',\n\t\t\t\tkontrollschlagwoerter: '',\n\t\t\t\tseitenanzahl: 1,\n\t\t\t})\n\t\t}\n\t},\n\tmethods: {\n\t\tgetNoteBezeichnung(termin){\n\t\t\tif(termin.noteBackend?.bezeichnung) {\n\t\t\t\treturn termin.noteBackend?.positiv ? this.$capitalize(this.$p.t('abgabetool/c4positivBenotet')) + ' ✅' : this.$capitalize(this.$p.t('abgabetool/c4negativBenotet')) + ' ❌'\n\t\t\t} else if(termin.bezeichnung?.benotbar === true && !termin.noteBackend) {\n\t\t\t\treturn this.$capitalize(this.$p.t('abgabetool/c4notYetGraded'));\n\t\t\t} else {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t},\n\t\tgetPlaceholderTermin(termin) {\n\t\t\treturn termin?.bezeichnung ? this.$p.t('abgabetool/c4paatyp' + termin.paabgabetyp_kurzbz) : this.$p.t('abgabetool/abgabetypPlaceholder')\n\t\t},\n\t\tsaveTermin(termin) {\n\t\t\tconst paabgabe_id = termin.paabgabe_id\n\t\t\ttermin.note_pk = termin.note?.note ?? null\n\t\t\ttermin.betreuer_person_id = this.projektarbeit.betreuer_person_id\n\t\t\t\n\t\t\t// phrasentext 'no late submission allowed' to 'late submission allowed' + boolean UI invert\n\t\t\ttermin.fixtermin = !termin.invertedFixtermin\n\t\t\treturn this.$api.call(ApiAbgabe.postProjektarbeitAbgabe(termin)).then( (res) => {\n\t\t\t\tif(res?.meta?.status == 'success') {\n\t\t\t\t\tthis.$fhcAlert.alertSuccess(this.$p.t('ui/gespeichert'))\n\t\t\t\t\t\n\t\t\t\t\tconst noteOpt = this.allowedNotenOptions.find(opt => opt.note == res.data[0].note)\n\t\t\t\t\tconst newTerminRes = {\n\t\t\t\t\t\t'allowedToSave': true,\n\t\t\t\t\t\t'allowedToDelete': true,\n\t\t\t\t\t\t...res.data[0]\n\t\t\t\t\t}\n\t\t\t\t\tif(newTerminRes.note) {\n\t\t\t\t\t\tnewTerminRes.note = noteOpt\n\t\t\t\t\t\tnewTerminRes.noteBackend = noteOpt // certain UI elements should only reflect persisted state\n\t\t\t\t\t}\n\t\t\t\t\tnewTerminRes.invertedFixtermin = !newTerminRes.fixtermin\n\t\t\t\t\tconst existingTerminRes = res.data[1]\n\t\t\t\t\t\n\t\t\t\t\tconst abgabeOpt = this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz == newTerminRes.paabgabetyp_kurzbz)\n\t\t\t\t\t\n\t\t\t\t\tnewTerminRes.bezeichnung = {\n\t\t\t\t\t\tbezeichnung: termin.bezeichnung?.bezeichnung,\n\t\t\t\t\t\tpaabgabetyp_kurzbz: termin.bezeichnung?.paabgabetyp_kurzbz,\n\t\t\t\t\t\tbenotbar: abgabeOpt.benotbar\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// only insert new abgabe if we actually created a new one, not when saving/editing existing\n\t\t\t\t\tif(!existingTerminRes){\n\t\t\t\t\t\tnewTerminRes.dateStyle = getDateStyleClass(newTerminRes, this.notenOptions)\n\t\t\t\t\t\tthis.projektarbeit.abgabetermine.push(newTerminRes)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst noteOptExisting = this.allowedNotenOptions.find(opt => opt.note == existingTerminRes.note)\n\t\t\t\t\t\texistingTerminRes.note = noteOptExisting\n\n\t\t\t\t\t\ttermin.paabgabetyp_kurzbz = newTerminRes.paabgabetyp_kurzbz\n\t\t\t\t\t\ttermin.noteBackend = noteOpt // do NOT take noteOptExisting -> should reflect the \"yes the qgate grade is confirmed in backend ux behaviour\"\n\t\t\t\t\t\ttermin.dateStyle = getDateStyleClass(termin, this.notenOptions)\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tthis.projektarbeit.abgabetermine.sort((a, b) =>new Date(a.datum) - new Date(b.datum))\n\t\t\t\t\t\n\t\t\t\t\tconst index = this.projektarbeit.abgabetermine.findIndex(t => termin.paabgabe_id == t.paabgabe_id)\n\t\t\t\t\t\n\t\t\t\t\t// negative abgabe -> automagically open new termin modal\n\t\t\t\t\t// really bad feature imo that will be annoying to deal with\n\t\t\t\t\t\n\t\t\t\t\t// termin is completely new and has negative note\n\t\t\t\t\tconst savedNewWithNegative = !existingTerminRes && !newTerminRes.note?.positiv && newTerminRes.note !== null\n\n\t\t\t\t\t// termin existed previously + oldTermin had different note/positive note or no note at all\n\t\t\t\t\tconst savedExistingNoteAsNegativeAndWasNotNegativeBefore = existingTerminRes && !newTerminRes.note?.positiv && newTerminRes.note !== null && (existingTerminRes.note?.positiv || existingTerminRes.note === undefined)\n\n\t\t\t\t\tconst openModalDueToNegativeBeurteilung = savedNewWithNegative || savedExistingNoteAsNegativeAndWasNotNegativeBefore\n\t\t\t\t\tif(openModalDueToNegativeBeurteilung) {\n\t\t\t\t\t\tthis.newTermin = {\n\t\t\t\t\t\t\t'paabgabe_id': -1,\n\t\t\t\t\t\t\t'projektarbeit_id': this.projektarbeit.projektarbeit_id,\n\t\t\t\t\t\t\t'fixtermin': false,\n\t\t\t\t\t\t\t'invertedFixtermin': true,\n\t\t\t\t\t\t\t'kurzbz': '', // todo kurzbz textfield value vorschlag für qualgates\n\t\t\t\t\t\t\t'datum': new Date().toISOString().split('T')[0],\n\t\t\t\t\t\t\t'note': this.allowedNotenOptions.find(opt => opt.note == 9),\n\t\t\t\t\t\t\t'beurteilungsnotiz': '',\n\t\t\t\t\t\t\t'upload_allowed': false,\n\t\t\t\t\t\t\t'paabgabetyp_kurzbz': '',\n\t\t\t\t\t\t\t'bezeichnung': this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz === newTerminRes.paabgabetyp_kurzbz),\n\t\t\t\t\t\t\t'abgabedatum': null,\n\t\t\t\t\t\t\t'insertvon': this.viewData?.uid ?? ''\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.showAutomagicModalPhrase = true\n\n\t\t\t\t\t\tthis.$refs.modalContainerCreateNewAbgabe.show()\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.showAutomagicModalPhrase = false\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tthis.$emit(\"paUpdated\", this.projektarbeit)\n\t\t\t\t} else if(res?.meta?.status == 'error'){\n\t\t\t\t\tthis.$fhcAlert.alertError()\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\topenZusatzdatenModal() {\n\t\t\tthis.$refs.modalContainerZusatzdaten.show()\n\t\t},\n\t\tasync saveZusatzdaten(){\n\t\t\tif (!await this.validateZusatzdaten())\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t\n\t\t\tconst pa = this.projektarbeit\n\n\t\t\t// post endabgabe\n\t\t\tconst formData = new FormData();\n\t\t\tformData.append('projektarbeit_id', this.projektarbeit.projektarbeit_id);\n\n\t\t\tformData.append('sprache', this.form['sprache'].sprache)\n\t\t\tformData.append('abstract', this.form['abstract'])\n\t\t\tformData.append('abstract_en', this.form['abstract_en'])\n\t\t\tformData.append('schlagwoerter', this.form['schlagwoerter'])\n\t\t\tformData.append('schlagwoerter_en', this.form['schlagwoerter_en'])\n\t\t\tformData.append('seitenanzahl', this.form['seitenanzahl'])\n\t\t\t\n\t\t\tthis.loading = true\n\t\t\tthis.$api.call(ApiAbgabe.postStudentProjektarbeitZusatzdaten(formData))\n\t\t\t\t.then(res => {\n\t\t\t\t\tif(res.meta.status == 'success') {\n\t\t\t\t\t\tthis.$fhcAlert.alertSuccess(this.$p.t('ui/gespeichert'))\n\t\t\t\t\t\tif(!data?.retval?.[0]) return\n\t\t\t\t\t\tconst paRes = data.retval[0]\n\t\t\t\t\t\tpa.seitenanzahl = paRes.seitenanzahl ?? 1\n\t\t\t\t\t\tpa.kontrollschlagwoerter = paRes.kontrollschlagwoerter ?? ''\n\t\t\t\t\t\tpa.schlagwoerter = paRes.schlagwoerter ?? ''\n\t\t\t\t\t\tpa.sprache = paRes.sprache ?? ''\n\t\t\t\t\t\tpa.schlagwoerter_en = paRes.schlagwoerter_en ?? ''\n\t\t\t\t\t\tpa.abstract = paRes.abstract ?? ''\n\t\t\t\t\t\tpa.abstract_en = paRes.abstract_en ?? ''\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}).finally(()=> {\n\t\t\t\tthis.loading = false\n\t\t\t})\n\n\t\t\tthis.$refs.modalContainerZusatzdaten.hide()\n\t\t},\n\t\tasync validateZusatzdaten() {\n\t\t\t// just ask once\n\t\t\tif(await this.$fhcAlert.confirm({\n\t\t\t\tmessage: this.$p.t('abgabetool/confirmZusatzdatenSpeichern'),\n\t\t\t\tacceptLabel: this.$capitalize(this.$p.t('abgabetool/c4AcceptAndProceed')),\n\t\t\t\tacceptClass: 'p-button-primary',\n\t\t\t\trejectLabel: this.$capitalize(this.$p.t('abgabetool/c4Cancel')),\n\t\t\t\trejectClass: 'p-button-secondary'\n\t\t\t}) === false) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t\n\t\t\treturn true\n\t\t},\n\t\tasync handleDeleteTermin(termin){\n\t\t\tif(await this.$fhcAlert.confirm({\n\t\t\t\tmessage: this.$p.t('abgabetool/c4confirm_delete'),\n\t\t\t\tacceptLabel: 'Löschen',\n\t\t\t\tacceptClass: 'p-button-danger',\n\t\t\t\trejectLabel: 'Zurück',\n\t\t\t\trejectClass: 'p-button-secondary'\n\t\t\t}) === false) {\n\t\t\t\treturn false\n\t\t\t} else {\n\t\t\t\tthis.deleteTermin(termin)\n\t\t\t}\n\t\t},\n\t\tdeleteTermin(termin) {\n\t\t\tthis.$api.call(ApiAbgabe.deleteProjektarbeitAbgabe(termin.paabgabe_id)).then( (res) => {\n\t\t\t\tif(res?.meta?.status == 'success') {\n\t\t\t\t\tthis.$fhcAlert.alertSuccess(this.$p.t('ui/genericDeleted', [this.$p.t('abgabetool/abgabe')]))\n\t\t\t\t\t// this.$p.t('global/tooltipLektorDeleteKontrolle', [this.$entryParams.permissions.kontrolleDeleteMaxReach ])\n\t\t\t\t\tconst deletedTerminIndex = this.projektarbeit.abgabetermine.findIndex(t => t.paabgabe_id === termin.paabgabe_id)\n\t\t\t\t\tthis.projektarbeit.abgabetermine.splice(deletedTerminIndex, 1)\n\t\t\t\t\tthis.$emit(\"paUpdated\", this.projektarbeit)\n\t\t\t\t} else if(res?.meta?.status == 'error'){\n\t\t\t\t\tthis.$fhcAlert.alertError()\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\tvalidate: function(termin) {\n\t\t\tif(!termin.file.length) {\n\t\t\t\tthis.$fhcAlert.alertWarning(this.$p.t('global/warningChooseFile'));\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\treturn true;\n\t\t},\n\t\tdownloadAbgabe(termin) {\n\t\t\tconst url = `/api/frontend/v1/Abgabe/getStudentProjektarbeitAbgabeFile?paabgabe_id=${termin.paabgabe_id}&student_uid=${this.projektarbeit.student_uid}&projektarbeit_id=${this.projektarbeit.projektarbeit_id}`;\n\n\t\t\twindow.open(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + url)\n\t\t\t// this.$api.call(ApiAbgabe.getStudentProjektarbeitAbgabeFile(termin.paabgabe_id, this.projektarbeit.student_uid))\n\t\t},\n\t\topenBeurteilungLink(link) {\n\t\t\twindow.open(link, '_blank')\n\t\t},\n\t\tgetOptionLabelSprache(option) {\n\t\t\treturn option.sprache\n\t\t},\n\t\tgetOptionLabelAbgabetyp(option) {\n\t\t\treturn this.$p.t('abgabetool/c4paatyp' + option.paabgabetyp_kurzbz)\n\t\t},\n\t\tgetOptionDisabled(option) {\n\t\t\treturn !option.aktiv\n\t\t},\n\t\tgetNotenOptionLabel(option) {\n\t\t\treturn option.bezeichnung\n\t\t},\n\t\topenStudentPage() {\n\t\t\tconst link = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router\n\t\t\t\t+ '/Cis/Abgabetool/Student/' + this.projektarbeit?.student_uid\n\t\t\twindow.open(link, '_blank')\n\t\t},\n\t\topenPlagiatcheck() {\n\t\t\tconst link = this.turnitin_link\n\t\t\twindow.open(link, '_blank')\n\t\t},\n\t\tasync openBenotung() {\n\t\t\t// old link check ?\n\t\t\t\n\t\t\tif(this.getSemesterBenotbar && this.projektarbeit?.abgabetermine.find(termin => termin.paabgabetyp_kurzbz == 'end' && termin.abgabedatum !== null) && this.projektarbeit?.beurteilungLinkNew) {\n\t\t\t\tconst link = this.projektarbeit?.beurteilungLinkNew\n\t\t\t\twindow.open(link, '_blank')\n\t\t\t} else if(this.projektarbeit?.abgabetermine.find(termin => termin.paabgabetyp_kurzbz == 'end' && termin.abgabedatum !== null) && this.projektarbeit?.beurteilungLinkOld) {\n\t\t\t\tif(await this.$fhcAlert.confirm({\n\t\t\t\t\tmessage: this.$p.t('abgabetool/c4aeltereParbeitBenotenv2'),\n\t\t\t\t\tacceptLabel: this.$capitalize(this.$p.t('abgabetool/c4AcceptAndProceed')),\n\t\t\t\t\tacceptClass: 'btn btn-danger',\n\t\t\t\t\trejectLabel: this.$capitalize(this.$p.t('abgabetool/c4Cancel')),\n\t\t\t\t\trejectClass: 'btn btn-outline-secondary'\n\t\t\t\t}) === false) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\n\t\t\t\tconst link = this.projektarbeit?.beurteilungLinkOld\n\t\t\t\twindow.open(link, '_blank')\n\t\t\t} else {\n\t\t\t\t// show info text that no endupload with abgabe has been found\n\t\t\t\tif(await this.$fhcAlert.confirm({\n\t\t\t\t\tmessage: this.$p.t('abgabetool/c4keinEnduploadErfolgt'),\n\t\t\t\t\tacceptLabel: this.$capitalize(this.$p.t('abgabetool/c4AcceptAndProceed')),\n\t\t\t\t\tacceptClass: 'btn btn-danger',\n\t\t\t\t\trejectLabel: this.$capitalize(this.$p.t('abgabetool/c4Cancel')),\n\t\t\t\t\trejectClass: 'btn btn-outline-secondary'\n\t\t\t\t}) === false) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tformatDate(dateParam) {\n\t\t\t// unsafe for datepickers, dont use there\n\t\t\tconst date = new Date(dateParam)\n\t\t\t// handle missing leading 0\n\t\t\tconst padZero = (num) => String(num).padStart(2, '0');\n\n\t\t\tconst month = padZero(date.getMonth() + 1); // Months are zero-based\n\t\t\tconst day = padZero(date.getDate());\n\t\t\tconst year = date.getFullYear();\n\t\t\t\n\t\t\treturn `${day}.${month}.${year}`\n\t\t},\n\t\topenCreateNewAbgabeModal() {\n\t\t\tif(this.projektarbeit?.betreuerart_kurzbz == 'Zweitbegutachter') {\n\t\t\t\t// maybe alert that this is not allowed or smth\n\n\t\t\t\tthis.$fhcAlert.alertWarning('Terminanlage disabled')\n\t\t\t\treturn\n\t\t\t}\n\t\t\t\n\t\t\tif(!this.newTermin) {\n\t\t\t\tconst typ = this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz === 'zwischen')\n\t\t\t\tthis.newTermin = {\n\t\t\t\t\t'paabgabe_id': -1,\n\t\t\t\t\t'projektarbeit_id': this.projektarbeit.projektarbeit_id,\n\t\t\t\t\t'fixtermin': false,\n\t\t\t\t\t'invertedFixtermin': true,\n\t\t\t\t\t'kurzbz': '',\n\t\t\t\t\t'datum': new Date().toISOString().split('T')[0],\n\t\t\t\t\t'note': this.allowedNotenOptions.find(opt => opt.note == 9),\n\t\t\t\t\t'beurteilungsnotiz': '',\n\t\t\t\t\t'upload_allowed': typ.upload_allowed_default,\n\t\t\t\t\t'paabgabetyp_kurzbz': '',\n\t\t\t\t\t'bezeichnung': typ,\n\t\t\t\t\t'abgabedatum': null,\n\t\t\t\t\t'insertvon': this.viewData?.uid ?? ''\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.$refs.modalContainerCreateNewAbgabe.show()\n\t\t},\n\t\tvalidateTermin(termin) {\n\t\t\t// compare new termin to existing ones to block illegal termin constellations, if they exist\n\t\t\t\n\t\t\treturn true\n\t\t},\n\t\tasync handleSaveNewAbgabe(termin) {\n\t\t\t\n\t\t\tif(!this.validateTermin(termin)) {\n\t\t\t\tthis.$fhcAlert.alertWarning('invalid termin')\n\t\t\t\t\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t\n\t\t\tawait this.saveTermin(termin)\n\t\t\t\n\t\t\tthis.$refs.modalContainerCreateNewAbgabe.hide()\n\t\t\tthis.newTermin = {\n\t\t\t\t'paabgabe_id': -1,\n\t\t\t\t'projektarbeit_id': this.projektarbeit.projektarbeit_id,\n\t\t\t\t'fixtermin': false,\n\t\t\t\t'invertedFixtermin': true,\n\t\t\t\t'kurzbz': '',\n\t\t\t\t'datum': new Date().toISOString().split('T')[0],\n\t\t\t\t'note': this.allowedNotenOptions.find(opt => opt.note == 9),\n\t\t\t\t'beurteilungsnotiz': '',\n\t\t\t\t'upload_allowed': false,\n\t\t\t\t'paabgabetyp_kurzbz': '',\n\t\t\t\t'bezeichnung': this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz === 'zwischen'),\n\t\t\t\t'abgabedatum': null,\n\t\t\t\t'insertvon': this.viewData?.uid ?? ''\n\t\t\t}\n\t\t\t\n\t\t},\n\t\thandleChangeAbgabetyp(termin) {\n\t\t\t// if paabgabetype qualgate is selected, fill out kurzbz textfield with bezeichnung of quality gate so users\n\t\t\t// are possibly less confused\n\t\t\tif(termin.bezeichnung?.paabgabetyp_kurzbz === 'qualgate1' || termin.bezeichnung?.paabgabetyp_kurzbz === 'qualgate2') {\n\t\t\t\ttermin.kurzbz = termin.bezeichnung.bezeichnung\n\t\t\t} else {\n\t\t\t\ttermin.kurzbz = ''\n\t\t\t}\n\t\t}\n\t},\n\tcomputed: {\n\t\tgetAllowedToCreateNewTermin() {\n\t\t\tif(this.assistenzMode) return true\n\t\t\tif(this.projektarbeit?.betreuerart_kurzbz == 'Zweitbegutachter') return false\n\t\t\tif(this.projektarbeit?.note !== undefined && this.projektarbeit.note !== null) {\n\t\t\t\t// check if the note is not defined as a non final projektarbeit note\n\t\t\t\tconst opt = this.notenOptionsNonFinal.find(opt => opt.note)\n\t\t\t\t// if thats the case allow further work\n\t\t\t\tif(opt) return true\n\t\t\t\t// else the PA is to be considered finished\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t\n\t\t\t// normally should be allowed if no rules apply\n\t\t\treturn true\n\t\t},\n\t\tallowedToSaveZusatzdaten() {\n\t\t\t\treturn this.form.schlagwoerter.length > 0 && this.form.schlagwoerter_en.length > 0 && this.form.abstract.length > 0 && this.form.abstract_en.length > 0 && this.form.seitenanzahl > 0\n\t\t},\n\t\tgetAllowedAbgabeTypeOptions() {\n\t\t\tif(this.assistenzMode) {\n\t\t\t\treturn this.abgabeTypeOptions\n\t\t\t} else {\n\t\t\t\treturn this.abgabeTypeOptions.filter(opt => this.abgabetypenBetreuer.includes(opt.paabgabetyp_kurzbz))\n\t\t\t}\n\t\t},\n\t\tgetMessagePtStyle() {\n\t\t\t// adjust outer spacing and internal padding to appear similar to doenload button in size\n\t\t\treturn {\n\t\t\t\troot: {\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tmargin: '0px'\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\twrapper: {\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tpadding: '6px'\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\t\n\t\t},\n\t\tgetEid() {\n\t\t\treturn this.$p.t('abgabetool/c4eidesstattlicheErklaerung')\n\t\t},\n\t\tgetEnduploadErlaubt() {\n\t\t\treturn !this.eidAkzeptiert\n\t\t},\n\t\tgetSemesterBenotbar(){\n\t\t\treturn this.projektarbeit?.isCurrent ?? false\n\t\t},\n\t\tendUploadVorhanden(){\n\t\t\treturn this.projektarbeit?.abgabetermine.find(abgabe => abgabe.paabgabetyp_kurzbz === 'end' && abgabe.abgabedatum !== null)\n\t\t},\n\t\tqualityGateTerminAvailable() {\n\t\t\tlet qgatefound = false\n\t\t\tthis.projektarbeit?.abgabetermine.forEach(abgabe => {\n\t\t\t\tif(abgabe.bezeichnung?.paabgabetyp_kurzbz == 'qualgate1'\n\t\t\t\t\t|| abgabe?.bezeichnung?.paabgabetyp_kurzbz == 'qualgate2') {\n\t\t\t\t\tqgatefound = true\n\t\t\t\t}\n\t\t\t})\n\t\t\treturn qgatefound\n\t\t},\n\t\tgetSpeedDialStyle() {\n\t\t\treturn 'position: static !important;'\n\t\t},\n\t\tgetSpeedDialWrapperStyle() {\n\t\t\t// non fullscreen -> wrapper is positioned on right bottom corner of modal, wherever that is\n\t\t\treturn 'position: absolute; z-index: 9999; left: 0px; bottom: 0.5rem;'\n\t\t},\n\t\tgetTooltipVerspaetet() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipVerspaetet'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipVerpasst() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipVerpasst'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipAbzugeben() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipAbzugeben'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipStandard() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipStandardv2'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipBeurteilungerforderlich() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipBeurteilungerforderlich'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipAbgegeben() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipAbgegeben'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipFixtermin() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipFixtermin'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipAbgabeDetected() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$capitalize(this.$p.t('abgabetool/c4tooltipAbgabeDetected')),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipNotAllowedToSave() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4notAllowedToEditAbgabeTermin'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipNotAllowedToDelete() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4notAllowedToDeleteAbgabeTermin'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipBestanden() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipBestanden'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetTooltipNichtBestanden() {\n\t\t\treturn {\n\t\t\t\tvalue: this.$p.t('abgabetool/c4tooltipNichtBestanden'),\n\t\t\t\tclass: \"custom-tooltip\"\n\t\t\t}\n\t\t},\n\t\tgetProjektarbeitTitel() {\n\t\t\tif(this.projektarbeit?.titel) return this.$capitalize(this.$p.t('abgabetool/c4titel')) + ': ' + this.projektarbeit.titel\n\t\t\t\n\t\t\treturn ''\n\t\t},\n\t\tgetProjektarbeitStudent(){\n\t\t\tif(this.projektarbeit?.student) return this.$capitalize(this.$p.t('person/student')) + ': ' + this.projektarbeit.student\n\n\t\t\treturn ''\n\t\t}\n\t},\n\twatch: {\n\t\t'newTermin.bezeichnung'(newVal) {\n\t\t\tif(newVal?.paabgabetyp_kurzbz === 'qualgate1' || newVal?.paabgabetyp_kurzbz === 'qualgate2') {\n\t\t\t\tthis.newTermin.kurzbz = newVal.bezeichnung\n\t\t\t}\n\t\t\t\n\t\t\tthis.newTermin.upload_allowed = newVal.upload_allowed_default\n\t\t},\n\t\t'projektarbeit'(newVal) {\n\t\t\t// set invertedFixtermin field for UI/UX purposes -> avoid double negation in text\n\t\t\t\n\t\t\t// reset newTermin object\n\t\t\tconst typ = this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz === 'zwischen')\n\t\t\tthis.newTermin = {\n\t\t\t\t'paabgabe_id': -1,\n\t\t\t\t'projektarbeit_id': newVal.projektarbeit_id,\n\t\t\t\t'fixtermin': false,\n\t\t\t\t'invertedFixtermin': true,\n\t\t\t\t'kurzbz': '',\n\t\t\t\t'datum': new Date().toISOString().split('T')[0],\n\t\t\t\t'note': this.allowedNotenOptions.find(opt => opt.note == 9),\n\t\t\t\t'beurteilungsnotiz': '',\n\t\t\t\t'upload_allowed': typ.upload_allowed_default,\n\t\t\t\t'paabgabetyp_kurzbz': '',\n\t\t\t\t'bezeichnung': typ,\n\t\t\t\t'abgabedatum': null,\n\t\t\t\t'insertvon': this.viewData?.uid ?? ''\n\t\t\t}\n\t\t\t\n\t\t\tnewVal?.abgabetermine?.forEach(termin => termin.invertedFixtermin = !termin.fixtermin)\n\t\t\t\n\t\t\t// default select german if projektarbeit sprache was null\n\t\t\tthis.form.sprache = newVal.sprache ? this.allActiveLanguages.find(lang => lang.sprache == newVal.sprache) : this.allActiveLanguages.find(lang => lang.sprache == 'German')\n\t\t\tthis.form.abstract = newVal.abstract ?? ''\n\t\t\tthis.form.abstract_en = newVal.abstract_en ?? ''\n\t\t\tthis.form.schlagwoerter = newVal.schlagwoerter ?? ''\n\t\t\tthis.form.schlagwoerter_en = newVal.schlagwoerter_en ?? ''\n\t\t\tthis.form.kontrollschlagwoerter = newVal.kontrollschlagwoerter ?? ''\n\t\t\tthis.form.seitenanzahl = newVal.seitenanzahl ?? 1\n\t\t},\n\t},\n\tcreated() {\n\n\t},\n\tmounted() {\n\n\t},\n\ttemplate: `\n\t\n\t\t\n\t\t\n\t\t\n\t\n\n\t
    \n\t\t
    {{$capitalize( $p.t('abgabetool/c4abgabeMitarbeiterbereich') )}}
    \n\n\t\t
    \n\t\t\t
    \n\t\t\t\t

    {{getProjektarbeitStudent}}

    \n\t\t\t\t

    {{getProjektarbeitTitel}}

    \n\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t
    \n\t\t
    \n\t\t\t
    \n\n\t\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\t\t
    \n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t
    \n\t\t\t
    {{ $capitalize( $p.t('abgabetool/c4keineAbgabetermineGefunden') )}}
    \n\t\t
    \n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t
    \n`,\n};\n\nexport default AbgabeMitarbeiterDetail;\n","export async function splitMailsHelper(mails, event, subject, alertPluginRef, phrasenPluginRef) {\n\tlet splititem = \",\";\n\tlet maillist = mails.join(splititem);\n\tlet mailto = \"\";\n\t// take subject line length + '?subject=' length into account\n\tconst subjectlength = subject && typeof subject === 'string' ? subject.length + 9 : 0 \n\tif (maillist.length > 2024)\n\t{\n\t\tif (await alertPluginRef.confirm({message: phrasenPluginRef.t('stv', 'zuvieleEMails') }) === false)\n\t\t\treturn;\n\t}\n\n\tlet firstrun = true;\n\tlet useBcc = event?.ctrlKey || event?.metaKey;\n\twhile (maillist.length > 0)\n\t{\n\t\tif (maillist.length + subjectlength > 2024)\n\t\t{\n\t\t\tlet splitposition = maillist.lastIndexOf(splititem, 1900);\n\t\t\tmailto = maillist.substring(0, splitposition);\n\t\t\tmaillist = maillist.substring(splitposition + 1);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tmailto = maillist;\n\t\t\tmaillist = \"\";\n\t\t}\n\n\t\tlet mailLink = useBcc ? `mailto:?bcc=${mailto}` : `mailto:${mailto}`;\n\t\tif(subject && typeof subject === 'string') mailLink += `?subject=${subject}`\n\t\tif (firstrun)\n\t\t{\n\t\t\twindow.location.href = mailLink;\n\t\t\tfirstrun = false;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (await alertPluginRef.confirm({message: phrasenPluginRef.t('stv', 'weitereEMail')}) === true)\n\t\t\t{\n\t\t\t\twindow.location.href = mailLink;\n\t\t\t}\n\t\t}\n\n\t}\n}","import {CoreFilterCmpt} from \"../../../components/filter/Filter.js\";\nimport AbgabeDetail from \"./AbgabeMitarbeiterDetail.js\";\nimport BsModal from '../../Bootstrap/Modal.js';\nimport VueDatePicker from '../../vueDatepicker.js.php';\nimport ApiAbgabe from '../../../api/factory/abgabe.js'\nimport FhcOverlay from \"../../Overlay/FhcOverlay.js\";\nimport { getDateStyleClass } from \"./getDateStyleClass.js\";\nimport { dateFilter } from '../../../tabulator/filters/Dates.js';\nimport {splitMailsHelper} from \"../../../helpers/EmailHelpers.js\";\n\nexport const AbgabetoolMitarbeiter = {\n\tname: \"AbgabetoolMitarbeiter\",\n\tcomponents: {\n\t\tBsModal,\n\t\tCoreFilterCmpt,\n\t\tAbgabeDetail,\n\t\tCheckbox: primevue.checkbox,\n\t\tDropdown: primevue.dropdown,\n\t\tTextarea: primevue.textarea,\n\t\tTieredMenu: primevue.tieredmenu,\n\t\tVueDatePicker,\n\t\tFhcOverlay\n\t},\n\tprovide() {\n\t\treturn {\n\t\t\tabgabeTypeOptions: Vue.computed(() => this.abgabeTypeOptions),\n\t\t\tabgabetypenBetreuer: Vue.computed(() => this.abgabetypenBetreuer),\n\t\t\tallowedNotenOptions: Vue.computed(() => this.allowedNotenOptions),\n\t\t\tnotenOptionsNonFinal: Vue.computed(() => this.notenOptionsNonFinal),\n\t\t\tturnitin_link: Vue.computed(() => this.turnitin_link),\n\t\t\told_abgabe_beurteilung_link: Vue.computed(() => this.old_abgabe_beurteilung_link)\n\t\t}\n\t},\n\tprops: {\n\t\tviewData: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t\tdefault: () => ({name: '', uid: ''}),\n\t\t\tvalidator(value) {\n\t\t\t\treturn value && value.uid // && value.name -> extensive viewData use only for cis4 onwards\n\t\t\t}\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\ttableData: null,\n\t\t\tabgabetypenBetreuer: null,\n\t\t\tdetailIsFullscreen: false,\n\t\t\tphrasenPromise: null,\n\t\t\tphrasenResolved: false,\n\t\t\tturnitin_link: null,\n\t\t\told_abgabe_beurteilung_link: null,\n\t\t\tBETREUER_SAMMELMAIL_BUTTON_STUDENT: null,\n\t\t\tsaving: false,\n\t\t\tloading: false,\n\t\t\tabgabeTypeOptions: null,\n\t\t\tnotenOptions: null,\n\t\t\tallowedNotenOptions: null,\n\t\t\tnotenOptionsNonFinal: null,\n\t\t\tserienTermin: Vue.reactive({\n\t\t\t\tdatum: new Date(),\n\t\t\t\tbezeichnung: {\n\t\t\t\t\tpaabgabetyp_kurzbz: 'zwischen',\n\t\t\t\t\tbezeichnung: 'Zwischenabgabe'\n\t\t\t\t},\n\t\t\t\tkurzbz: '',\n\t\t\t\tupload_allowed: false\n\t\t\t}),\n\t\t\tshowAll: false,\n\t\t\ttabulatorUuid: Vue.ref(0),\n\t\t\tselectedData: [],\n\t\t\tdomain: '',\n\t\t\tstudent_uid: null,\n\t\t\tdetail: null,\n\t\t\tdetailOffset: 0,\n\t\t\tprojektarbeiten: null,\n\t\t\tselectedProjektarbeit: null,\n\t\t\ttableBuiltResolve: null,\n\t\t\ttableBuiltPromise: null,\n\t\t\tabgabeTableOptions: {\n\t\t\t\tminHeight: 250,\n\t\t\t\tindex: 'projektarbeit_id',\n\t\t\t\tlayout: 'fitDataStretch',\n\t\t\t\tplaceholder: Vue.computed(() => this.$p.t('global/noDataAvailable')),\n\t\t\t\tselectable: true,\n\t\t\t\tselectableCheck: this.selectionCheck,\n\t\t\t\trowHeight: 40,\n\t\t\t\tcolumns: [\n\t\t\t\t\t{\n\t\t\t\t\t\tformatter: function (cell, formatterParams, onRendered) {\n\t\t\t\t\t\t\t// create the built-in checkbox\n\t\t\t\t\t\t\tif(!cell.getRow().getData().selectable) return \n\t\t\t\t\t\t\tlet checkbox = document.createElement(\"input\");\n\t\t\t\t\t\t\tcheckbox.type = \"checkbox\";\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t// Handle select manually\n\t\t\t\t\t\t\tcheckbox.addEventListener(\"click\", (e) => {\n\t\t\t\t\t\t\t\te.stopPropagation();\n\n\t\t\t\t\t\t\t\t// call our function\n\t\t\t\t\t\t\t\tif (formatterParams && formatterParams.handleClick) {\n\t\t\t\t\t\t\t\t\tformatterParams.handleClick(e, cell);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tcell.getRow().getData().checkbox = checkbox\n\n\t\t\t\t\t\t\tlet wrapper = document.createElement(\"div\");\n\t\t\t\t\t\t\twrapper.style.cssText = \"display: flex; justify-content: center; align-items: center; height: 100%; width: 100%;\";\n\n\t\t\t\t\t\t\twrapper.appendChild(checkbox);\n\n\t\t\t\t\t\t\treturn wrapper;\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttitleFormatter: function (cell, formatterParams, onRendered) {\n\t\t\t\t\t\t\t// create the built-in checkbox\n\t\t\t\t\t\t\tlet checkbox = document.createElement(\"input\");\n\t\t\t\t\t\t\tcheckbox.type = \"checkbox\";\n\n\t\t\t\t\t\t\t// Handle \"select all\" manually\n\t\t\t\t\t\t\tcheckbox.addEventListener(\"click\", (e) => {\n\t\t\t\t\t\t\t\te.stopPropagation();\n\n\t\t\t\t\t\t\t\t// call our function\n\t\t\t\t\t\t\t\tif (formatterParams && formatterParams.handleClick) {\n\t\t\t\t\t\t\t\t\tformatterParams.handleClick(e, cell);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\treturn checkbox;\n\t\t\t\t\t\t},\n\t\t\t\t\t\thozAlign: \"center\",\n\t\t\t\t\t\theaderSort: false,\n\t\t\t\t\t\tformatterParams: {\n\t\t\t\t\t\t\thandleClick: this.selectHandler\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttitleFormatterParams: {\n\t\t\t\t\t\t\thandleClick: this.selectAllHandler\n\t\t\t\t\t\t},\n\t\t\t\t\t\twidth: 50,\n\t\t\t\t\t\tcssClass: 'sticky-col'\n\t\t\t\t\t},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4details'))), field: 'details', formatter: this.detailFormatter, headerFilter: false, headerSort: false, widthGrow: 1, tooltip: false, cssClass: 'sticky-col'},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4personenkennzeichen'))), headerFilter: true, field: 'pkz', formatter: this.pkzTextFormatter, widthGrow: 1, tooltip: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4vorname'))), field: 'vorname', headerFilter: true, formatter: this.centeredTextFormatter,widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4nachname'))), field: 'nachname', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4projekttyp'))), field: 'projekttyp_kurzbz', formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4stg'))), field: 'stg', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4sem'))), field: 'studiensemester_kurzbz', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4titel'))), field: 'titel', headerFilter: true, formatter: this.centeredTextFormatter, maxWidth: 500, widthGrow: 8},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4betreuerartv2'))), field: 'betreuerart_beschreibung',formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4prevAbgabetermin'))), field: 'prevTermin',\n\t\t\t\t\t\theaderFilter: dateFilter,\n\t\t\t\t\t\theaderFilterFunc: this.headerFilterTerminCol,\n\t\t\t\t\t\tsorter: this.sortFuncTerminCol,\n\t\t\t\t\t\tformatter: this.abgabterminFormatter, widthGrow: 1, width: 250, tooltip: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4nextAbgabetermin'))), field: 'nextTermin',\n\t\t\t\t\t\theaderFilter: dateFilter,\n\t\t\t\t\t\theaderFilterFunc: this.headerFilterTerminCol,\n\t\t\t\t\t\tsorter: this.sortFuncTerminCol,\n\t\t\t\t\t\tformatter: this.abgabterminFormatter, widthGrow: 1, width: 250, tooltip: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4qgate1Status'))),\n\t\t\t\t\t\theaderFilter: 'list',\n\t\t\t\t\t\theaderFilterParams: { valuesLookup: this.getQGateStatusList }, \n\t\t\t\t\t\tfield: 'qgate1Status', formatter: this.centeredTextFormatter, widthGrow: 1, width: 220, tooltip: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4qgate2Status'))),\n\t\t\t\t\t\theaderFilter: 'list',\n\t\t\t\t\t\theaderFilterParams: { valuesLookup: this.getQGateStatusList }, \n\t\t\t\t\t\tfield: 'qgate2Status', formatter: this.centeredTextFormatter, widthGrow: 1, width: 220, tooltip: false}\n\t\t\t\t],\n\t\t\t\tpersistence: false,\n\t\t\t\tpersistenceID: 'abgabeTableBetreuer2026-02-26'\n\t\t\t},\n\t\t\tabgabeTableEventHandlers: [{\n\t\t\t\tevent: \"tableBuilt\",\n\t\t\t\thandler: async () => {\n\t\t\t\t\tthis.tableBuiltResolve()\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\tevent: \"cellClick\",\n\t\t\t\thandler: async (e, cell) => {\n\t\t\t\t\tif(cell.getColumn().getField() === \"details\") {\n\t\t\t\t\t\tthis.setDetailComponent(cell.getValue())\n\t\t\t\t\t\tthis.undoSelection(cell)\n\t\t\t\t\t} else if (cell.getColumn().getField() === \"mail\") {\n\t\t\t\t\t\tthis.undoSelection(cell)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\tevent: \"rowSelectionChanged\",\n\t\t\t\thandler: async(data) => {\n\t\t\t\t\tthis.selectedData.filter(sd => !data.includes(sd)).forEach(fsd => {\n\t\t\t\t\t\tif(fsd.checkbox) fsd.checkbox.checked = false\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\tdata.forEach(d => {\n\t\t\t\t\t\tif(d.checkbox) d.checkbox.checked = true\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\tthis.selectedData = data\n\t\t\t\t}\n\t\t\t}\n\t\t\t]};\n\t},\n\tmethods: {\n\t\thandlePaUpdated(projektarbeit) {\n\t\t\tthis.checkAbgabetermineProjektarbeit(projektarbeit)\n\t\t\tthis.$refs.abgabeTable.tabulator.redraw(true)\n\t\t},\n\t\tsammelMailStudent(param) {\n\t\t\t\n\t\t\tconst recipientList = [];\n\t\t\tthis.selectedData.forEach(d => {\n\t\t\t\trecipientList.push(`${d.student_uid}@${this.domain}`)\n\t\t\t})\n\t\t\tconst uniqueRecipients = [...new Set(recipientList)];\n\t\t\tconst subject = \"\"; // empty subject line \n\t\t\tsplitMailsHelper(uniqueRecipients, param.originalEvent, subject, this.$fhcAlert, this.$p)\n\t\t},\n\t\tgetQGateStatusList() {\n\t\t\treturn [\n\t\t\t\tthis.$p.t('abgabetool/c4keinTerminVorhanden'),\n\t\t\t\tthis.$p.t('abgabetool/c4positivBenotet'),\n\t\t\t\tthis.$p.t('abgabetool/c4negativBenotet'),\n\t\t\t\tthis.$p.t('abgabetool/c4notYetGraded'),\n\t\t\t\tthis.$p.t('abgabetool/c4notSubmitted'),\n\t\t\t\tthis.$p.t('abgabetool/c4notHappenedYet')\n\t\t\t]\n\t\t},\n\t\tsortFuncTerminCol(a, b, aRow, bRow, column, dir, params) {\n\t\t\tif (a === null || typeof a === \"undefined\") return 1;\n\t\t\tif (b === null || typeof b === \"undefined\") return -1;\n\n\t\t\t// try to handle the prev/next interpretation consistently\n\t\t\t// can only make this wrong UX whise so whatever\n\t\t\tif(column._column.field == 'prevTermin') {\n\t\t\t\treturn Math.abs(b.diffMs) - Math.abs(a.diffMs)\n\t\t\t} else if (column._column.field == 'nextTermin') {\n\t\t\t\treturn Math.abs(a.diffMs) - Math.abs(b.diffMs)\n\t\t\t}\n\n\t\t\t// just in case someone reuses this\n\t\t\treturn Math.abs(b.diffMs) - Math.abs(a.diffMs)\n\t\t},\n\t\theaderFilterTerminCol(filterVal, rowVal) {\n\t\t\tif (!rowVal || !rowVal.luxonDate || !rowVal.luxonDate.isValid) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t\n\t\t\tconst rowDate = rowVal.luxonDate;\n\t\t\t\n\t\t\tconst toLuxon = (val) => {\n\t\t\t\tif (!val) return null;\n\t\t\t\tlet dt;\n\t\t\t\tif (val instanceof Date) {\n\t\t\t\t\tdt = luxon.DateTime.fromJSDate(val);\n\t\t\t\t} else if (typeof val === \"string\") {\n\t\t\t\t\tdt = luxon.DateTime.fromISO(val);\n\t\t\t\t} else { // fallback\n\t\t\t\t\tdt = luxon.DateTime.fromMillis(Number(val));\n\t\t\t\t}\n\n\t\t\t\treturn dt.isValid ? dt : null;\n\t\t\t};\n\n\t\t\tconst von = toLuxon(filterVal[0]);\n\t\t\tconst bis = toLuxon(filterVal[1]);\n\n\t\t\t// specific day\n\t\t\tif (von && !bis) {\n\t\t\t\treturn rowDate.hasSame(von, \"day\");\n\t\t\t}\n\n\t\t\t// range case\n\t\t\tif (von && bis) {\n\t\t\t\treturn rowDate >= von.startOf(\"day\") && rowDate <= bis.endOf(\"day\");\n\t\t\t}\n\n\t\t\treturn false\n\t\t},\n\t\tloadState() {\n\t\t\treturn JSON.parse(localStorage.getItem(this.abgabeTableOptions.persistenceID) || \"null\");\n\t\t},\n\t\tsaveState(table) {\n\t\t\t// avoid storing state after first restore part happened\n\t\t\tif(!this.stateRestored) return\n\t\t\tconst rawLayout = table.getColumnLayout();\n\t\t\tconst state = {\n\t\t\t\tcolumns: rawLayout.map(col => ({\n\t\t\t\t\tfield: col.field,\n\t\t\t\t\tvisible: col.visible,\n\t\t\t\t\twidth: col.width,\n\t\t\t\t})),\n\t\t\t\tsort: table.getSorters().map(s => ({\n\t\t\t\t\tfield: s.field,\n\t\t\t\t\tdir: s.dir,\n\t\t\t\t})),\n\t\t\t\tfilters: table.getFilters(),\n\t\t\t\theaderFilters: table.getHeaderFilters()\n\t\t\t};\n\n\t\t\tlocalStorage.setItem(this.abgabeTableOptions.persistenceID, JSON.stringify(state));\n\t\t},\n\t\thandleTableBuilt() {\n\t\t\tconst table = this.$refs.abgabeTable.tabulator\n\n\t\t\tthis.tableBuiltResolve()\n\n\t\t\ttable.on(\"columnMoved\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"columnResized\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"columnVisibilityChanged\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"filterChanged\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"headerFilterChanged\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"dataSorted\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"columnSorted\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"sortersChanged\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\tconst saved = this.loadState();\n\n\t\t\ttable.on(\"renderComplete\", () => {\n\t\t\t\tif(!this.stateRestored) {\n\n\t\t\t\t\tif (saved?.columns && !this.colLayoutRestored) {\n\t\t\t\t\t\tconst layout = saved.columns.map(col => ({\n\t\t\t\t\t\t\tfield: col.field,\n\t\t\t\t\t\t\twidth: col.width,\n\t\t\t\t\t\t\tvisible: col.visible,\n\t\t\t\t\t\t\t// add more if needed, but keep it simple\n\t\t\t\t\t\t}));\n\n\t\t\t\t\t\ttable.setColumnLayout(layout);\n\n\t\t\t\t\t\tthis.colLayoutRestored = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (saved?.filters && !this.filtersRestored) {\n\t\t\t\t\t\tthis.filtersRestored = true // instantly avoid retriggers\n\t\t\t\t\t\ttable.setFilter(saved.filters);\n\t\t\t\t\t}\n\t\t\t\t\tif (saved?.headerFilters && !this.headerFiltersRestored) {\n\t\t\t\t\t\tthis.headerFiltersRestored = true // instantly avoid retriggers\n\t\t\t\t\t\tfor (let hf of saved.headerFilters) {\n\t\t\t\t\t\t\ttable.setHeaderFilterValue(hf.field, hf.value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (saved?.sort?.length && !this.sortRestored) {\n\t\t\t\t\t\tthis.sortRestored = true;\n\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tconst sortList = saved.sort.map(s => {\n\t\t\t\t\t\t\t\tconst col = table.columnManager.findColumn(s.field);\n\t\t\t\t\t\t\t\tif (!col) {\n\t\t\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn { column: col, dir: s.dir };\n\t\t\t\t\t\t\t}).filter(Boolean);\n\n\t\t\t\t\t\t\ttable.setSort(sortList);\n\t\t\t\t\t\t}, 100);\n\t\t\t\t\t}\n\t\t\t\t\tthis.stateRestored = true\n\n\t\t\t\t}\n\n\t\t\t});\n\t\t},\n\t\tcheckQualityGateStatus(projekt) {\n\t\t\tconst qgate1Termine = []\n\t\t\tconst qgate2Termine = []\n\n\t\t\tprojekt.qgate1Status = this.$p.t('abgabetool/c4keinTerminVorhanden')// 'Kein Termin vorhanden'\n\t\t\tprojekt.qgate1StatusRank = 0\n\t\t\tprojekt.qgate2Status = this.$p.t('abgabetool/c4keinTerminVorhanden')\n\t\t\tprojekt.qgate2StatusRank = 0\n\n\t\t\tprojekt.abgabetermine.forEach(termin => {\n\t\t\t\tif(termin.paabgabetyp_kurzbz == 'qualgate1') qgate1Termine.push(termin)\n\t\t\t\tif(termin.paabgabetyp_kurzbz == 'qualgate2') qgate2Termine.push(termin)\n\t\t\t})\n\n\t\t\t// calculate qgateStatusRank and display the highest order status rank of all quality gate termine until one\n\t\t\t// counts as passed, which is just a positive note no matter if anything has been uploaded\n\n\t\t\t// reuse luxon calculated diffMs (termin.datum in relation to today) from previous datestyle check \n\t\t\tqgate1Termine.forEach(qgate => {\n\t\t\t\tif(qgate.note != null && projekt.qgate1StatusRank <= 5) {\n\t\t\t\t\tconst noteOpt = typeof qgate.note !== 'object' ? this.notenOptions.find(opt => opt.note == qgate.note) : qgate.note\n\t\t\t\t\tif(noteOpt.positiv) {\n\t\t\t\t\t\tprojekt.qgate1Status = this.$p.t('abgabetool/c4positivBenotet')\n\t\t\t\t\t\tprojekt.qgate1StatusRank = 5\n\t\t\t\t\t} else {\n\t\t\t\t\t\tprojekt.qgate1Status = this.$p.t('abgabetool/c4negativBenotet')\n\t\t\t\t\t\tprojekt.qgate1StatusRank = 4\n\t\t\t\t\t}\n\t\t\t\t} else if (qgate.note == null && projekt.qgate1StatusRank <= 3) {\n\t\t\t\t\tprojekt.qgate1Status = this.$p.t('abgabetool/c4notYetGraded')\n\t\t\t\t\tprojekt.qgate1StatusRank = 3\n\t\t\t\t} else if(qgate.upload_allowed == true && qgate.abgabedatum == null && projekt.qgate1StatusRank <= 2) {\n\t\t\t\t\tprojekt.qgate1Status = this.$p.t('abgabetool/c4notSubmitted')\n\t\t\t\t\tprojekt.qgate1StatusRank = 2\n\t\t\t\t} else if (qgate.upload_allowed == false && qgate.diffMs <= 0 && projekt.qgate1StatusRank <= 1) {\n\t\t\t\t\tprojekt.qgate1Status = this.$p.t('abgabetool/c4notHappenedYet')\n\t\t\t\t\tprojekt.qgate1StatusRank = 1\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tqgate2Termine.forEach(qgate => {\n\t\t\t\tif(qgate.note != null && projekt.qgate1StatusRank <= 5) {\n\t\t\t\t\tconst noteOpt = typeof qgate.note !== 'object' ? this.notenOptions.find(opt => opt.note == qgate.note) : qgate.note\n\t\t\t\t\tif(noteOpt.positiv) {\n\t\t\t\t\t\tprojekt.qgate2Status = this.$p.t('abgabetool/c4positivBenotet')\n\t\t\t\t\t\tprojekt.qgate2StatusRank = 5\n\t\t\t\t\t} else {\n\t\t\t\t\t\tprojekt.qgate2Status = this.$p.t('abgabetool/c4negativBenotet')\n\t\t\t\t\t\tprojekt.qgate2StatusRank = 4\n\t\t\t\t\t}\n\t\t\t\t} else if (qgate.note == null && projekt.qgate2StatusRank <= 3) {\n\t\t\t\t\tprojekt.qgate2Status = this.$p.t('abgabetool/c4notYetGraded')\n\t\t\t\t\tprojekt.qgate2StatusRank = 3\n\t\t\t\t} else if(qgate.upload_allowed == true && qgate.abgabedatum == null && projekt.qgate2StatusRank <= 2) {\n\t\t\t\t\tprojekt.qgate2Status = this.$p.t('abgabetool/c4notSubmitted')\n\t\t\t\t\tprojekt.qgate2StatusRank = 2\n\t\t\t\t} else if (qgate.upload_allowed == false && qgate.diffMs <= 0 && projekt.qgate2StatusRank <= 1) {\n\t\t\t\t\tprojekt.qgate2Status = this.$p.t('abgabetool/c4notHappenedYet')\n\t\t\t\t\tprojekt.qgate2StatusRank = 1\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\tcheckAbgabetermineProjektarbeit(projekt) {\n\t\t\tconst now = luxon.DateTime.now()\n\t\t\t// calculate Abgabetermin time diff to now and assign last and next to projekt\n\t\t\tprojekt.abgabetermine.forEach(termin => {\n\t\t\t\t\n\t\t\t\t// while already looping through each termin, calculate datestyle beforehand\n\t\t\t\ttermin.dateStyle = getDateStyleClass(termin, this.notenOptions)\n\n\t\t\t\tconst date = luxon.DateTime.fromISO(termin.datum).endOf('day')\n\t\t\t\ttermin.luxonDate = date\n\t\t\t\ttermin.diffMs = date.toMillis() - now.toMillis(); // positive = future, negative = past\n\n\t\t\t\tif (termin.diffMs < 0) {\n\t\t\t\t\tif (!projekt.prevTermin ||\n\t\t\t\t\t\ttermin.diffMs > projekt.prevTermin.diffMs // larger (less negative) = closer to now\n\t\t\t\t\t) {\n\t\t\t\t\t\tprojekt.prevTermin = termin;\n\t\t\t\t\t}\n\t\t\t\t} else if (termin.diffMs > 0) {\n\t\t\t\t\tif (!projekt.nextTermin ||\n\t\t\t\t\t\ttermin.diffMs < projekt.nextTermin.diffMs // smaller positive = closer to now\n\t\t\t\t\t) {\n\t\t\t\t\t\tprojekt.nextTermin = termin;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\n\t\t\t// seperate check for quality gates\n\t\t\tthis.checkQualityGateStatus(projekt)\n\t\t},\n\t\tabgabterminFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\n\t\t\tif(val) {\n\t\t\t\tlet icon = ''\n\t\t\t\tswitch(val.dateStyle) {\n\t\t\t\t\tcase 'verspaetet':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'verpasst':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'abzugeben':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'standard':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'abgegeben':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'beurteilungerforderlich':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'bestanden':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'nichtbestanden':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t}\n\n\t\t\t\tconst bezeichnung = val.bezeichnung?.bezeichnung ?? val.bezeichnung\n\n\t\t\t\treturn '
    ' +\n\t\t\t\t\t'
    ' +\n\t\t\t\t\ticon +\n\t\t\t\t\t'
    ' +\n\t\t\t\t\t'
    ' +\n\t\t\t\t\t'

    '+bezeichnung+' - '+ this.formatDate(val.datum)+'

    ' +\n\t\t\t\t\t'
    '+\n\t\t\t\t\t'
    '\n\n\t\t\t} else {\n\t\t\t\treturn ''\n\t\t\t}\n\n\t\t},\n\t\tselectHandler(e, cell) {\n\t\t\tconst row = cell.getRow();\n\n\t\t\tif(row.isSelected()) {\n\t\t\t\trow.deselect();\n\t\t\t} else {\n\t\t\t\trow.select();\n\t\t\t}\n\n\t\t\t// stop built-in handler\n\t\t\te.stopPropagation();\n\t\t\treturn false;\n\t\t},\n\t\tselectAllHandler(e, cell) {\n\t\t\tconst table = cell.getTable();\n\t\t\tconst rows = table.getRows();\n\n\t\t\t// custom select all logic\n\t\t\tconst allowed = rows.filter(r => r.getData().selectable);\n\t\t\tconst selected = allowed.every(r => r.isSelected());\n\n\t\t\tif(selected) {\n\t\t\t\tallowed.forEach(r => r.deselect());\n\t\t\t} else {\n\t\t\t\tallowed.forEach(r => r.select());\n\t\t\t}\n\n\t\t\t// stop built-in handler\n\t\t\te.stopPropagation();\n\t\t\treturn false;\n\t\t},\n\t\thandleToggleFullscreenDetail() {\n\t\t\tthis.detailIsFullscreen = !this.detailIsFullscreen\n\t\t},\n\t\tgetOptionLabelAbgabetyp(option){\n\t\t\treturn option.bezeichnung\n\t\t},\n\t\tformatDate(dateParam) {\n\t\t\tconst date = new Date(dateParam)\n\t\t\t// handle missing leading 0\n\t\t\tconst padZero = (num) => String(num).padStart(2, '0');\n\n\t\t\tconst month = padZero(date.getMonth() + 1); // Months are zero-based\n\t\t\tconst day = padZero(date.getDate());\n\t\t\tconst year = date.getFullYear();\n\n\t\t\treturn `${day}.${month}.${year}`;\n\t\t},\n\t\tundoSelection(cell) {\n\t\t\t// checks if cells row is selected and unselects -> imitates columns which dont trigger row selection\n\t\t\t// but actually just revert it after the fact\n\n\t\t\tconst row = cell.getRow()\n\t\t\tif(row.isSelected()) {\n\t\t\t\trow.deselect();\n\t\t\t}\n\t\t},\n\t\tselectionCheck(row) {\n\t\t\tconst data = row.getData()\n\t\t\tif(data?.betreuerart_kurzbz == 'Zweitbegutachter') return false\n\t\t\treturn true\n\t\t},\n\t\tshowDeadlines(){\n\t\t\tconst link = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router\n\t\t\t\t+ '/Cis/Abgabetool/Deadlines'\n\t\t\twindow.open(link, '_blank')\n\t\t},\n\t\ttoggleShowAll(showall) {\n\t\t\tthis.showAll = showall\n\t\t\tthis.loading = true\n\t\t\tthis.loadProjektarbeiten(showall, () => {\n\t\t\t\tthis.$refs.abgabeTable?.tabulator.redraw(true)\n\t\t\t\tthis.$refs.abgabeTable?.tabulator.setSort([]);\n\t\t\t\tthis.loading = false\n\t\t\t})\n\t\t},\n\t\topenAddSeriesModal() {\n\t\t\tthis.$refs.modalContainerAddSeries.show()\n\t\t},\n\t\taddSeries() {\n\t\t\tthis.saving = true\n\t\t\tthis.$api.call(ApiAbgabe.postSerientermin(\n\t\t\t\tthis.serienTermin.datum.toISOString(),\n\t\t\t\tthis.serienTermin.bezeichnung.paabgabetyp_kurzbz,\n\t\t\t\tthis.serienTermin.bezeichnung.bezeichnung,\n\t\t\t\tthis.serienTermin.kurzbz,\n\t\t\t\tthis.serienTermin.upload_allowed,\n\t\t\t\tthis.selectedData?.map(projekt => projekt.projektarbeit_id),\n\t\t\t\tfalse\n\t\t\t)).then(res => {\n\t\t\t\tif (res.meta.status === \"success\" && res.data) {\n\t\t\t\t\tthis.$fhcAlert.alertSuccess(this.$p.t('abgabetool/serienTerminGespeichert'))\n\n\t\t\t\t\tconst oldScrollLeft = this.$refs.abgabeTable?.tabulator.rowManager.scrollLeft\n\t\t\t\t\tconst oldScrollTop = this.$refs.abgabeTable?.tabulator.rowManager.scrollTop\n\t\t\t\t\tthis.loading = true\n\t\t\t\t\tthis.loadProjektarbeiten(this.showAll, () => {\n\t\t\t\t\t\tthis.$refs.abgabeTable?.tabulator.redraw(true)\n\t\t\t\t\t\tthis.$refs.abgabeTable?.tabulator.setSort([]);\n\t\t\t\t\t\tthis.loading = false\n\n\t\t\t\t\t\tVue.nextTick(()=> {\n\t\t\t\t\t\t\tconst table = this.$refs.abgabeTable?.tabulator.element.querySelector('.tabulator-tableholder')\n\t\t\t\t\t\t\tif(table) {\n\t\t\t\t\t\t\t\ttable.scrollLeft = oldScrollLeft;\n\t\t\t\t\t\t\t\ttable.scrollTop = oldScrollTop;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\t\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\tthis.$fhcAlert.alertError(this.$p.t('abgabetool/errorSerienterminSpeichern'))\n\t\t\t\t}\n\t\t\t}).finally(()=>{\n\t\t\t\tthis.saving = false\n\t\t\t})\n\n\t\t\tthis.$refs.modalContainerAddSeries.hide()\n\t\t},\n\t\tcreateInfoString(data) {\n\t\t\tlet str = '';\n\t\t\t\n\t\t\tdata.forEach(name => {\n\t\t\t\tstr += name\n\t\t\t\tstr += '; '\n\t\t\t})\n\t\t\t\n\t\t\treturn str\n\t\t},\n\t\tisPastDate(date) {\n\t\t\tconst deadline = luxon.DateTime.fromISO(date, { zone: 'Europe/Vienna' }).endOf('day');\n\t\t\tconst nowInVienna = luxon.DateTime.now().setZone('Europe/Vienna');\n\t\t\treturn nowInVienna > deadline;\n\t\t},\n\t\tsetDetailComponent(details){\n\t\t\tthis.loading=true\n\n\t\t\tconst pa = this.projektarbeiten?.retval?.find(projekarbeit => projekarbeit.projektarbeit_id == details.projektarbeit_id)\n\n\t\t\tlet paIsBenotet = false\n\t\t\tif(pa.note !== undefined && pa.note !== null) {\n\t\t\t\t// check if the note is not defined as a non final projektarbeit note\n\t\t\t\tconst opt = this.notenOptionsNonFinal.find(opt => opt.note)\n\t\t\t\t// if thats the case allow further work\n\t\t\t\tif(opt) paIsBenotet = false\n\t\t\t\t// else the PA is to be considered finished\n\t\t\t\tpaIsBenotet = true\n\t\t\t}\n\n\t\t\tif(pa?.abgabetermine?.length) {\n\t\t\t\tthis.$api.call(ApiAbgabe.getSignaturStatusForProjektarbeitAbgaben(pa.abgabetermine.map(termin => termin.paabgabe_id), pa.student_uid))\n\t\t\t\t\t.then(res => {\n\t\t\t\t\t\tif(res.meta.status === 'success') {\n\t\t\t\t\t\t\tres.data.forEach(paabgabe => {\n\t\t\t\t\t\t\t\tconst termin = pa.abgabetermine.find(abgabe => abgabe.paabgabe_id == paabgabe.paabgabe_id)\n\t\t\t\t\t\t\t\tif(termin && paabgabe.signatur !== undefined) termin.signatur = paabgabe.signatur\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t}\n\n\t\t\tpa.abgabetermine.forEach(termin => {\n\t\t\t\tconst noteOpt = this.allowedNotenOptions.find(opt => opt.note == termin.note)\n\t\t\t\tif(noteOpt) termin.note = noteOpt\n\t\t\t\ttermin.file = []\n\t\t\t\t\n\t\t\t\t// only set this if it has not been set yet and abgabetermin has a note (qgate)\n\t\t\t\tif(!termin.noteBackend && noteOpt) {\n\t\t\t\t\ttermin.noteBackend = noteOpt\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// update 08-01-2026: everybody is allowed to do everything in client, critical checks happen at backend level\n\t\t\t\t// termin.allowedToSave = true\n\t\t\t\t\n\t\t\t\t// update 21-01-2026: actually blocking operations on finished projektarbeiten seems like a decent idea\n\t\t\t\ttermin.allowedToSave = paIsBenotet ? false : true\n\t\t\t\t\n\t\t\t\t// lektoren are not allowed to delete deadlines with existing submissions\n\t\t\t\ttermin.allowedToDelete = termin.allowedToSave && !termin.abgabedatum\n\t\t\t\t\n\t\t\t\ttermin.bezeichnung = this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz === termin.paabgabetyp_kurzbz)\n\n\t\t\t})\n\t\t\t\n\t\t\tpa.student_uid = details.student_uid\n\t\t\tpa.student = `${pa.vorname} ${pa.nachname}`\n\t\t\t\n\t\t\tthis.selectedProjektarbeit = pa\n\t\t\tthis.$refs.modalContainerAbgabeDetail.show()\n\t\t\n\t\t\n\t\t\tthis.loading = false\n\t\t\t\n\t\t},\n\t\tcenteredTextFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\t\t\tif(!val) return\n\t\t\t\n\t\t\treturn '
    ' +\n\t\t\t\t'

    '+val+'

    '\n\t\t},\n\t\tdetailFormatter(cell) {\n\t\t\treturn '
    ' +\n\t\t\t\t'
    '\n\t\t},\n\t\tbeurteilungFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\t\t\tif(val) {\n\t\t\t\treturn '
    ' +\n\t\t\t\t\t'
    '\n\t\t\t} else return '-'\n\t\t},\n\t\tpkzTextFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\n\t\t\treturn '
    ' +\n\t\t\t\t''+val+'
    '\n\t\t},\n\t\ttableResolve(resolve) {\n\t\t\tthis.tableBuiltResolve = resolve\n\t\t},\n\t\tbuildMailToLink(abgabe) {\n\t\t\treturn 'mailto:' + abgabe.uid +'@'+ this.domain\n\t\t},\n\t\tbuildPKZ(projekt) {\n\t\t\treturn `${projekt.uid} / ${projekt.matrikelnr}`\n\t\t},\n\t\tbuildStg(projekt) {\n\t\t\treturn (projekt.typ + projekt.kurzbz)?.toUpperCase()\t\n\t\t},\n\t\tsetupData(data){\n\t\t\t\n\t\t\t\n\t\t\tthis.projektarbeiten = data[0]\n\t\t\tthis.domain = data[1]\n\t\t\t\n\t\t\tthis.tableData = data[0]?.retval?.map(projekt => {\n\t\t\t\tthis.checkAbgabetermineProjektarbeit(projekt)\n\t\t\t\tprojekt.selectable = projekt.betreuerart_kurzbz !== 'Zweitbegutachter'\n\n\t\t\t\treturn {\n\t\t\t\t\t...projekt,\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\tstudent_uid: projekt.uid,\n\t\t\t\t\t\tprojektarbeit_id: projekt.projektarbeit_id,\n\t\t\t\t\t},\n\t\t\t\t\tpkz: this.buildPKZ(projekt),\n\t\t\t\t\tbeurteilung: projekt.beurteilungLink ?? null,\n\t\t\t\t\tsem: projekt.studiensemester_kurzbz,\n\t\t\t\t\tstg: this.buildStg(projekt),\n\t\t\t\t\tmail: this.buildMailToLink(projekt),\n\t\t\t\t\ttyp: projekt.projekttyp_kurzbz,\n\t\t\t\t\ttitel: projekt.titel\n\t\t\t\t}\n\t\t\t})\n\t\t\t\n\t\t\tthis.$refs.abgabeTable.tabulator.setColumns(this.abgabeTableOptions.columns)\n\t\t\tthis.$refs.abgabeTable.tabulator.setData(this.tableData);\n\t\t},\n\t\tloadProjektarbeiten(all = false, callback) {\n\t\t\tthis.$api.call(ApiAbgabe.getMitarbeiterProjektarbeiten(all))\n\t\t\t\t.then(res => {\n\t\t\t\t\tif(res?.data) this.setupData(res.data)\n\t\t\t\t}).finally(() => {\n\t\t\t\t\tif(callback) {\n\t\t\t\t\t\tcallback()\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t},\n\t\tloadAbgaben(details) {\n\t\t\treturn new Promise((resolve) => {\n\t\t\t\tthis.$api.call(ApiAbgabe.getStudentProjektabgaben(details))\n\t\t\t\t\t.then(res => {\n\t\t\t\t\t\tresolve(res)\n\t\t\t\t\t})\n\t\t\t})\n\t\t},\n\t\thandleUuidDefined(uuid) {\n\t\t\tthis.tabulatorUuid = uuid\n\t\t},\n\t\tcalcMaxTableHeight() {\n\t\t\tconst tableID = this.tabulatorUuid ? ('-' + this.tabulatorUuid) : ''\n\t\t\tconst tableDataSet = document.getElementById('filterTableDataset' + tableID);\n\t\t\tif(!tableDataSet) return\n\t\t\tconst rect = tableDataSet.getBoundingClientRect();\n\n\t\t\tthis.abgabeTableOptions.height = window.visualViewport.height - rect.top - 80\n\t\t\tthis.$refs.abgabeTable.tabulator.setHeight(this.abgabeTableOptions.height)\n\t\t},\n\t\tasync setupMounted() {\n\t\t\tthis.tableBuiltPromise = new Promise(this.tableResolve)\n\t\t\tawait this.tableBuiltPromise\n\n\t\t\tthis.loadProjektarbeiten()\n\n\t\t\tthis.calcMaxTableHeight()\n\n\t\t}\n\t},\n\twatch: {\n\t\t'serienTermin.bezeichnung'(newVal) {\n\t\t\tif(newVal?.paabgabetyp_kurzbz === 'qualgate1' || newVal?.paabgabetyp_kurzbz === 'qualgate2') {\n\t\t\t\tthis.serienTermin.kurzbz = newVal.bezeichnung\n\t\t\t}\n\n\t\t\tthis.serienTermin.upload_allowed = newVal.upload_allowed_default\n\t\t},\n\t},\n\tcomputed: {\n\t\temailItems() {\n\t\t\tconst menu = []\n\n\t\t\tif(this.BETREUER_SAMMELMAIL_BUTTON_STUDENT){\n\t\t\t\tmenu.push({\n\t\t\t\t\tlabel: this.$p.t('abgabetool/c4sendEmailStudierendev2', [this.uniqueStudentEmailCount]),\n\t\t\t\t\tcommand: this.sammelMailStudent\n\t\t\t\t})\n\t\t\t}\n\n\t\t\treturn menu\n\t\t},\n\t\tuniqueStudentEmailCount() {\n\t\t\tconst emails = new Set();\n\n\t\t\tthis.selectedData.forEach(row => {\n\t\t\t\tif (row.student_uid) {\n\t\t\t\t\temails.add(row.student_uid); // actually dont need domain for this\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn emails.size;\n\t\t},\n\t\tgetAllowedAbgabeTypeOptions() {\n\t\t\treturn this.abgabeTypeOptions.filter(opt => this.abgabetypenBetreuer.includes(opt.paabgabetyp_kurzbz))\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.phrasenPromise = this.$p.loadCategory(['abgabetool', 'global'])\n\t\tthis.phrasenPromise.then(()=> {this.phrasenResolved = true})\n\t\t// fetch config to avoid hard coded links\n\t\tthis.$api.call(ApiAbgabe.getConfig()).then(res => {\n\t\t\tthis.turnitin_link = res.data?.turnitin_link\n\t\t\tthis.old_abgabe_beurteilung_link = res.data?.old_abgabe_beurteilung_link\n\t\t\tthis.abgabetypenBetreuer = res.data?.abgabetypenBetreuer\n\t\t\tthis.BETREUER_SAMMELMAIL_BUTTON_STUDENT = res.data?.BETREUER_SAMMELMAIL_BUTTON_STUDENT\n\t\t}).catch(e => {\n\t\t\tthis.loading = false\n\t\t})\n\t\t\n\t\t// fetch noten options\n\t\t//TODO: SWITCH TO NOTEN API ONCE NOTENTOOL IS IN MASTER TO AVOID DUPLICATE API\n\t\tthis.$api.call(ApiAbgabe.getNoten()).then(res => {\n\t\t\tif(res.meta.status == 'success') {\n\t\t\t\tthis.notenOptions = res.data[0]\n\n\t\t\t\tthis.allowedNotenOptions = this.notenOptions.filter(\n\t\t\t\t\topt => res.data[1].includes(opt.note)\n\t\t\t\t)\n\t\t\t\t\n\t\t\t\tthis.notenOptionsNonFinal = this.notenOptions.filter(\n\t\t\t\t\topt => res.data[2].includes(opt.note)\n\t\t\t\t)\n\t\t\t}\n\t\t\t\n\t\t}).catch(e => {\n\t\t\tthis.loading = false\n\t\t})\n\t\t\n\t\t// fetch abgabetypen options\n\t\tthis.$api.call(ApiAbgabe.getPaAbgabetypen()).then(res => {\n\t\t\tthis.abgabeTypeOptions = res.data\n\t\t}).catch(e => {\n\t\t\tthis.loading = false\n\t\t})\n\t},\n\tmounted() {\n\t\tthis.setupMounted()\n\t},\n\ttemplate: `\n\t\n `,\n};\n\nexport default AbgabetoolMitarbeiter;\n","export default {\n\tname: 'BootstrapOffcanvas',\n\tdata: () => ({\n\t\toffcanvas: null\n\t}),\n\tprops: {\n\t\tbackdrop: {\n\t\t\ttype: [Boolean, String],\n\t\t\tdefault: true,\n\t\t\tvalidator(value) {\n\t\t\t\treturn ['static', true, false].includes(value);\n\t\t\t}\n\t\t},\n\t\tkeyboard: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true\n\t\t},\n\t\tscroll: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t},\n\t\tplacement: {\n\t\t\ttype: String,\n\t\t\tdefault: 'start', // start | end | top | bottom\n\t\t\tvalidator(value) {\n\t\t\t\treturn ['start', 'end', 'top', 'bottom'].includes(value);\n\t\t\t}\n\t\t},\n\t\tnoCloseBtn: Boolean,\n\t\theaderClass: {\n\t\t\ttype: [String, Array, Object],\n\t\t\tdefault: ''\n\t\t},\n\t\tbodyClass: {\n\t\t\ttype: [String, Array, Object],\n\t\t\tdefault: 'p-4'\n\t\t},\n\t\tfooterClass: {\n\t\t\ttype: [String, Array, Object],\n\t\t\tdefault: ''\n\t\t},\n\t\tdialogClass: [String, Array, Object]\n\t},\n\temits: [\n\t\t\"hideBsOffcanvas\",\n\t\t\"hiddenBsOffcanvas\",\n\t\t\"hidePreventedBsOffcanvas\",\n\t\t\"showBsOffcanvas\",\n\t\t\"shownBsOffcanvas\"\n\t],\n\tmethods: {\n\t\tdispose() {\n\t\t\treturn this.offcanvas?.dispose();\n\t\t},\n\t\thide() {\n\t\t\treturn this.offcanvas?.hide();\n\t\t},\n\t\tshow(relatedTarget) {\n\t\t\treturn this.offcanvas?.show(relatedTarget);\n\t\t},\n\t\ttoggle() {\n\t\t\treturn this.offcanvas?.toggle();\n\t\t},\n\t\tpopup(body, options, title, footer) {\n\t\t\tconst BsOffcanvas = this,\n\t\t\t\tslots = {};\n\n\t\t\tif (body !== undefined)\n\t\t\t\tslots.default = () => body;\n\t\t\tif (title !== undefined)\n\t\t\t\tslots.title = () => title;\n\t\t\tif (footer !== undefined)\n\t\t\t\tslots.footer = () => footer;\n\n\t\t\tlet includedPrimevue = false;\n\t\t\tif (typeof primevue !== 'undefined')\n\t\t\t\tincludedPrimevue = true;\n\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tconst instance = Vue.createApp({\n\t\t\t\t\tname: 'OffcanvasTmpApp',\n\t\t\t\t\tsetup() {\n\t\t\t\t\t\treturn () =>\n\t\t\t\t\t\t\tVue.h(BsOffcanvas, {\n\t\t\t\t\t\t\t\tclass: 'offcanvas-wrapper',\n\t\t\t\t\t\t\t\tref: 'offcanvas',\n\t\t\t\t\t\t\t\t...options\n\t\t\t\t\t\t\t}, slots);\n\t\t\t\t\t},\n\t\t\t\t\tmounted() {\n\t\t\t\t\t\tthis.$refs.offcanvas.show();\n\t\t\t\t\t},\n\t\t\t\t\tbeforeUnmount() {\n\t\t\t\t\t\tif (this.$refs.offcanvas)\n\t\t\t\t\t\t\tthis.$refs.offcanvas.result !== false ? resolve(this.$refs.offcanvas.result) : reject();\n\t\t\t\t\t},\n\t\t\t\t\tunmounted() {\n\t\t\t\t\t\twrapper.parentElement.removeChild(wrapper);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tconst wrapper = document.createElement('div');\n\n\t\t\t\tif (includedPrimevue) {\n\t\t\t\t\tinstance.use(primevue.config.default, { zIndex: { overlay: 9999 } });\n\t\t\t\t}\n\n\t\t\t\timport('../../plugins/Phrasen.js').then((Phrasen) => {\n\t\t\t\t\tinstance.use(Phrasen.default);\n\t\t\t\t\tinstance.mount(wrapper);\n\t\t\t\t\tdocument.body.appendChild(wrapper);\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t},\n\tmounted() {\n\t\tif (this.$refs.offcanvas) {\n\t\t\tthis.offcanvas = new bootstrap.Offcanvas(this.$refs.offcanvas, {\n\t\t\t\tbackdrop: this.backdrop,\n\t\t\t\tkeyboard: this.keyboard,\n\t\t\t\tscroll: this.scroll\n\t\t\t});\n\t\t}\n\t},\n\ttemplate: `\n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\t\t
    \n\t`\n}\n","/**\n * Copyright (C) 2025 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tgetAllStudiensemesterAndAktOrNext() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/organisation/Studiensemester/getAllStudiensemesterAndAktOrNext',\n\t\t};\n\t},\n\tgetAll(order = null, start = null)\n\t{\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: 'api/frontend/v1/organisation/studiensemester/getAll',\n\t\t\tparams: { order, start }\n\t\t};\n\t}\n};","export const AbgabeterminStatusLegende = {\n\tname: 'AbgabeterminStatusLegende',\n\ttemplate: `\t\n\t\t
    \n\t\t\t
    \n\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t('abgabetool/c4tooltipVerspaetet')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t('abgabetool/c4tooltipVerpasst')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t('abgabetool/c4tooltipAbzugeben')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t('abgabetool/c4tooltipStandardv2')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t('abgabetool/c4tooltipAbgegeben')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t('abgabetool/c4tooltipBeurteilungerforderlich')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t('abgabetool/c4tooltipBestanden')) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ $capitalize($p.t('abgabetool/c4tooltipNichtBestanden')) }}
    \n\t\t\t\t\t
    \t\n\t\t\t\t
    \n\n\t\t\t
    \n\t\t
    \t\n\t`\n};\nexport default AbgabeterminStatusLegende;","import {CoreFilterCmpt} from \"../../../components/filter/Filter.js\";\nimport AbgabeDetail from \"./AbgabeMitarbeiterDetail.js\";\nimport BsModal from '../../Bootstrap/Modal.js';\nimport BsOffcanvas from '../../Bootstrap/Offcanvas.js';\nimport VueDatePicker from '../../vueDatepicker.js.php';\nimport ApiAbgabe from '../../../api/factory/abgabe.js'\nimport ApiStudiensemester from '../../../api/factory/studiensemester.js';\nimport AbgabeterminStatusLegende from \"./StatusLegende.js\";\nimport FhcOverlay from \"../../Overlay/FhcOverlay.js\";\nimport { splitMailsHelper } from \"../../../helpers/EmailHelpers.js\"\nimport { getDateStyleClass} from \"./getDateStyleClass.js\";\nimport { dateFilter } from '../../../tabulator/filters/Dates.js';\n\nexport const AbgabetoolAssistenz = {\n\tname: \"AbgabetoolAssistenz\",\n\tcomponents: {\n\t\tAbgabeterminStatusLegende,\n\t\tBsModal,\n\t\tBsOffcanvas,\n\t\tCoreFilterCmpt,\n\t\tAbgabeDetail,\n\t\tCheckbox: primevue.checkbox,\n\t\tDropdown: primevue.dropdown,\n\t\tInplace: primevue.inplace,\n\t\tTextarea: primevue.textarea,\n\t\tTimeline: primevue.timeline,\n\t\tTieredMenu: primevue.tieredmenu,\n\t\tVueDatePicker,\n\t\tFhcOverlay\n\t},\n\tprovide() {\n\t\treturn {\n\t\t\tabgabeTypeOptions: Vue.computed(() => this.abgabeTypeOptions),\n\t\t\tallowedNotenOptions: Vue.computed(() => this.allowedNotenOptions),\n\t\t\tnotenOptionsNonFinal: Vue.computed(() => this.notenOptionsNonFinal),\n\t\t\tturnitin_link: Vue.computed(() => this.turnitin_link),\n\t\t\told_abgabe_beurteilung_link: Vue.computed(() => this.old_abgabe_beurteilung_link),\n\t\t\tabgabetypenBetreuer: Vue.computed(() => this.abgabeTypeOptions)\n\t\t}\n\t},\n\tprops: {\n\t\tstg_kz_prop: {\n\t\t\tdefault: null\n\t\t},\n\t\tviewData: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t\tdefault: () => ({name: '', uid: ''}),\n\t\t\tvalidator(value) {\n\t\t\t\treturn value && value.uid // && value.name -> extensive viewData use only for cis4 onwards\n\t\t\t}\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\ttableData: null,\n\t\t\tstudiensemesterOptions: null,\n\t\t\tallSem: null,\n\t\t\tcurSem: null,\n\t\t\tnotenOptionFilter: null,\n\t\t\tinplaceToggle: false,\n\t\t\theaderFiltersRestored: false,\n\t\t\tfiltersRestored: false,\n\t\t\tcolLayoutRestored: false,\n\t\t\tsortRestored: false,\n\t\t\tstateRestored: false,\n\t\t\ttimelineProjekt: null,\n\t\t\tselectedStudiengangOption: null,\n\t\t\tstudiengaengeOptions: null,\n\t\t\tdetailIsFullscreen: false,\n\t\t\tallConfigPromise: null,\n\t\t\tphrasenPromise: null,\n\t\t\tphrasenResolved: false,\n\t\t\tturnitin_link: null,\n\t\t\told_abgabe_beurteilung_link: null,\n\t\t\tASSISTENZ_SAMMELMAIL_BUTTON_STUDENT: null,\n\t\t\tASSISTENZ_SAMMELMAIL_BUTTON_BETREUER: null,\n\t\t\tsaving: false,\n\t\t\tloading: false,\n\t\t\tabgabeTypeOptions: null,\n\t\t\tnotenOptions: null,\n\t\t\tallowedNotenFilterOptions: null,\n\t\t\tallowedNotenOptions: null,\n\t\t\tnotenOptionsNonFinal: null,\n\t\t\tserienTermin: Vue.reactive({\n\t\t\t\tdatum: new Date(),\n\t\t\t\tbezeichnung: {\n\t\t\t\t\tpaabgabetyp_kurzbz: 'zwischen',\n\t\t\t\t\tbezeichnung: 'Zwischenabgabe'\n\t\t\t\t},\n\t\t\t\tkurzbz: '',\n\t\t\t\tfixtermin: false,\n\t\t\t\tinvertedFixtermin: true,\n\t\t\t\tupload_allowed: false\n\t\t\t}),\n\t\t\tshowAll: false,\n\t\t\ttabulatorUuid: Vue.ref(0),\n\t\t\tselectedData: [],\n\t\t\tdomain: '',\n\t\t\tstudent_uid: null,\n\t\t\tdetail: null,\n\t\t\tdetailOffset: 0,\n\t\t\tprojektarbeiten: null,\n\t\t\tselectedProjektarbeit: null,\n\t\t\ttableBuiltResolve: null,\n\t\t\ttableBuiltPromise: null,\n\t\t\tabgabeTableOptions: {\n\t\t\t\tminHeight: 250,\n\t\t\t\tindex: 'projektarbeit_id',\n\t\t\t\tlayout: 'fitData',\n\t\t\t\tplaceholder: Vue.computed(() => this.$capitalize(this.$p.t('global/noDataAvailable'))),\n\t\t\t\tselectable: true,\n\t\t\t\tselectableCheck: this.selectionCheck,\n\t\t\t\trowHeight: 40,\n\t\t\t\trenderVerticalBuffer: 2000,\n\t\t\t\tcolumns: [\n\t\t\t\t\t{\n\t\t\t\t\t\tformatter: function (cell, formatterParams, onRendered) {\n\t\t\t\t\t\t\t// create the built-in checkbox\n\t\t\t\t\t\t\tif(!cell.getRow().getData().selectable) return\n\t\t\t\t\t\t\tlet checkbox = document.createElement(\"input\");\n\t\t\t\t\t\t\tcheckbox.type = \"checkbox\";\n\n\t\t\t\t\t\t\t// Handle select manually\n\t\t\t\t\t\t\tcheckbox.addEventListener(\"click\", (e) => {\n\t\t\t\t\t\t\t\te.stopPropagation();\n\n\t\t\t\t\t\t\t\t// call our function\n\t\t\t\t\t\t\t\tif (formatterParams && formatterParams.handleClick) {\n\t\t\t\t\t\t\t\t\tformatterParams.handleClick(e, cell);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tcell.getRow().getData().checkbox = checkbox\n\n\t\t\t\t\t\t\tlet wrapper = document.createElement(\"div\");\n\t\t\t\t\t\t\twrapper.style.cssText = \"display: flex; justify-content: center; align-items: center; height: 100%; width: 100%;\";\n\n\t\t\t\t\t\t\twrapper.appendChild(checkbox);\n\n\t\t\t\t\t\t\treturn wrapper;\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttitleFormatter: function (cell, formatterParams, onRendered) {\n\t\t\t\t\t\t\t// create the built-in checkbox\n\t\t\t\t\t\t\tlet checkbox = document.createElement(\"input\");\n\t\t\t\t\t\t\tcheckbox.type = \"checkbox\";\n\n\t\t\t\t\t\t\t// Handle \"select all\" manually\n\t\t\t\t\t\t\tcheckbox.addEventListener(\"click\", (e) => {\n\t\t\t\t\t\t\t\te.stopPropagation();\n\n\t\t\t\t\t\t\t\t// call our function\n\t\t\t\t\t\t\t\tif (formatterParams && formatterParams.handleClick) {\n\t\t\t\t\t\t\t\t\tformatterParams.handleClick(e, cell);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\treturn checkbox;\n\t\t\t\t\t\t},\n\t\t\t\t\t\thozAlign: \"center\",\n\t\t\t\t\t\theaderSort: false,\n\t\t\t\t\t\tformatterParams: {\n\t\t\t\t\t\t\thandleClick: this.selectHandler\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttitleFormatterParams: {\n\t\t\t\t\t\t\thandleClick: this.selectAllHandler\n\t\t\t\t\t\t},\n\t\t\t\t\t\twidth: 50,\n\t\t\t\t\t\tcssClass: 'sticky-col'\n\t\t\t\t\t},\n\t\t\t\t// {\n\t\t\t\t\t// \tfield: 'rowSelection',\n\t\t\t\t\t// \tformatter: 'rowSelection',\n\t\t\t\t\t// \ttitleFormatter: 'rowSelection',\n\t\t\t\t\t// \ttitleFormatterParams: {\n\t\t\t\t\t// \t\trowRange: \"active\" // Only toggle the values of the active filtered rows\n\t\t\t\t\t// \t},\n\t\t\t\t\t// \thozAlign:\"center\",\n\t\t\t\t\t// \theaderSort: false,\n\t\t\t\t\t// \tfrozen: true,\n\t\t\t\t\t// \twidth: 40\n\t\t\t\t\t// },\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4details'))), field: 'details', headerFilter: false, headerSort: false, formatter: this.formAction, tooltip:false, minWidth: 150, cssClass: 'sticky-col'},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4personenkennzeichen'))), headerFilter: true, field: 'pkz', formatter: this.pkzTextFormatter, widthGrow: 1, tooltip: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4vorname'))), field: 'student_vorname', headerFilter: true, formatter: this.centeredTextFormatter,widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4nachname'))), field: 'student_nachname', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4studstatus'))), field: 'studienstatus', headerFilter: true, formatter: this.centeredTextFormatter,widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4orgform'))), field: 'orgform', headerFilter: true, formatter: this.centeredTextFormatter,widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4projekttyp'))), field: 'projekttyp_kurzbz', formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4stg'))), field: 'stg', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4note'))), field: 'note_bez', headerFilter: true,\n\t\t\t\t\t\t formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4sem'))), field: 'studiensemester_kurzbz', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4titel'))), field: 'titel', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4erstbetreuerv2'))), field: 'erstbetreuer', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4erstbetreuerTitelPre'))), field: 'betreuer_titelpre', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1, visible: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4erstbetreuerVorname'))), field: 'betreuer_vorname', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1, visible: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4erstbetreuerNachname'))), field: 'betreuer_nachname', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1, visible: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4erstbetreuerTitelPost'))), field: 'betreuer_titelpost', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1, visible: false},\n\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4zweitbetreuerv2'))), field: 'zweitbetreuer', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},\n\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4zweitbetreuerTitelPre'))), field: 'zweitbetreuer_titelpre', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1, visible: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4zweitbetreuerVorname'))), field: 'zweitbetreuer_vorname', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1, visible: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4zweitbetreuerNachname'))), field: 'zweitbetreuer_nachname', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1, visible: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4zweitbetreuerTitelPost'))), field: 'zweitbetreuer_titelpost', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1, visible: false},\n\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4prevAbgabetermin'))),\n\t\t\t\t\t\theaderFilter: dateFilter,\n\t\t\t\t\t\theaderFilterFunc: this.headerFilterTerminCol,\n\t\t\t\t\t\tsorter: this.sortFuncTerminCol,\n\t\t\t\t\t\tfield: 'prevTermin', formatter: this.abgabterminFormatter, widthGrow: 1, width: 250, tooltip: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4nextAbgabetermin'))), field: 'nextTermin',\n\t\t\t\t\t\theaderFilter: dateFilter,\n\t\t\t\t\t\theaderFilterFunc: this.headerFilterTerminCol,\n\t\t\t\t\t\tsorter: this.sortFuncTerminCol,\n\t\t\t\t\t\tformatter: this.abgabterminFormatter, widthGrow: 1, width: 250, tooltip: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4qgate1Status'))),\n\t\t\t\t\t\theaderFilter: 'list',\n\t\t\t\t\t\theaderFilterParams: { valuesLookup: this.getQGateStatusList },\n\t\t\t\t\t\tfield: 'qgate1Status', formatter: this.centeredTextFormatter, widthGrow: 1, width: 220, tooltip: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4qgate2Status'))),\n\t\t\t\t\t\theaderFilter: 'list',\n\t\t\t\t\t\theaderFilterParams: { valuesLookup: this.getQGateStatusList },\n\t\t\t\t\t\tfield: 'qgate2Status', formatter: this.centeredTextFormatter, widthGrow: 1, width: 220, tooltip: false},\n\t\t\t\t],\n\t\t\t\tpersistence: false,\n\t\t\t\tpersistenceID: \"abgabetool_2026_02_26\"\n\t\t\t},\n\t\t\tabgabeTableEventHandlers: [\n\t\t\t{\n\t\t\t\tevent: \"rowSelectionChanged\",\n\t\t\t\thandler: async(data) => \n\t\t\t\t{\n\t\t\t\t\tthis.selectedData.filter(sd => !data.includes(sd)).forEach(fsd => {\n\t\t\t\t\t\tif(fsd.checkbox) fsd.checkbox.checked = false\n\t\t\t\t\t})\n\n\t\t\t\t\tdata.forEach(d => {\n\t\t\t\t\t\tif(d.checkbox) d.checkbox.checked = true\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\tthis.selectedData = data\n\t\t\t\t}\n\t\t\t}\n\t\t\t]};\n\t},\n\tmethods: {\n\t\thandlePaUpdated(projektarbeit) {\n\t\t\tthis.checkAbgabetermineProjektarbeit(projektarbeit)\n\t\t\tthis.$refs.abgabeTable.tabulator.redraw(true)\n\t\t},\n\t\tgetQGateStatusList() {\n\t\t\treturn [\n\t\t\t\tthis.$p.t('abgabetool/c4keinTerminVorhanden'),\n\t\t\t\tthis.$p.t('abgabetool/c4positivBenotet'),\n\t\t\t\tthis.$p.t('abgabetool/c4negativBenotet'),\n\t\t\t\tthis.$p.t('abgabetool/c4notYetGraded'),\n\t\t\t\tthis.$p.t('abgabetool/c4notSubmitted'),\n\t\t\t\tthis.$p.t('abgabetool/c4notHappenedYet')\n\t\t\t]\t\n\t\t},\n\t\tsortFuncTerminCol(a, b, aRow, bRow, column, dir, params) {\n\t\t\tif (a === null || typeof a === \"undefined\") return 1;\n\t\t\tif (b === null || typeof b === \"undefined\") return -1;\n\t\t\t\n\t\t\t// try to handle the prev/next interpretation consistently\n\t\t\t// can only make this wrong UX whise so whatever\n\t\t\tif(column._column.field == 'prevTermin') {\n\t\t\t\treturn Math.abs(b.diffMs) - Math.abs(a.diffMs)\n\t\t\t} else if (column._column.field == 'nextTermin') {\n\t\t\t\treturn Math.abs(a.diffMs) - Math.abs(b.diffMs)\n\t\t\t}\n\t\t\t\n\t\t\t// just in case someone reuses this\n\t\t\treturn Math.abs(b.diffMs) - Math.abs(a.diffMs) \n\t\t},\n\t\theaderFilterTerminCol(filterVal, rowVal) {\n\t\t\tif (!rowVal || !rowVal.luxonDate || !rowVal.luxonDate.isValid) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst rowDate = rowVal.luxonDate;\n\n\t\t\tconst toLuxon = (val) => {\n\t\t\t\tif (!val) return null;\n\t\t\t\tlet dt;\n\t\t\t\tif (val instanceof Date) {\n\t\t\t\t\tdt = luxon.DateTime.fromJSDate(val);\n\t\t\t\t} else if (typeof val === \"string\") {\n\t\t\t\t\tdt = luxon.DateTime.fromISO(val);\n\t\t\t\t} else { // fallback\n\t\t\t\t\tdt = luxon.DateTime.fromMillis(Number(val));\n\t\t\t\t}\n\n\t\t\t\treturn dt.isValid ? dt : null;\n\t\t\t};\n\n\t\t\tconst von = toLuxon(filterVal[0]);\n\t\t\tconst bis = toLuxon(filterVal[1]);\n\n\t\t\t// specific day\n\t\t\tif (von && !bis) {\n\t\t\t\treturn rowDate.hasSame(von, \"day\");\n\t\t\t}\n\n\t\t\t// range case\n\t\t\tif (von && bis) {\n\t\t\t\treturn rowDate >= von.startOf(\"day\") && rowDate <= bis.endOf(\"day\");\n\t\t\t}\n\n\t\t\treturn false\n\t\t},\n\t\tsammelMailStudent(param) {\n\n\t\t\tconst recipientList = [];\n\t\t\tthis.selectedData.forEach(d => {\n\t\t\t\trecipientList.push(`${d.student_uid}@${this.domain}`)\n\t\t\t})\n\n\t\t\tconst uniqueRecipients = [...new Set(recipientList)];\n\t\t\tconst subject = this.$p.t('abgabetool/c4sammelmailStudentBetreff', [this.selectedStudiengangOption?.bezeichnung]);\n\t\t\tsplitMailsHelper(uniqueRecipients, param.originalEvent, subject, this.$fhcAlert, this.$p)\n\t\t},\n\t\tsammelMailBetreuer(param) {\n\t\t\t\n\t\t\tconst recipientList = [];\n\t\t\tthis.selectedData.forEach(row => {\n\t\t\t\tif (row.betreuer_mail) recipientList.push(row.betreuer_mail);\n\t\t\t\tif (row.zweitbetreuer_mail) recipientList.push(row.zweitbetreuer_mail);\n\t\t\t});\n\n\t\t\t// actually not necessary for email clients but looks better for assistenz if we avoid duplicates here\n\t\t\tconst uniqueRecipients = [...new Set(recipientList)];\n\t\t\tconst subject = this.$p.t('abgabetool/c4sammelmailBetreuerBetreff', [this.selectedStudiengangOption?.bezeichnung]);\n\t\t\tsplitMailsHelper(uniqueRecipients, param.originalEvent, subject, this.$fhcAlert, this.$p)\n\t\t},\n\t\tselectHandler(e, cell) {\n\t\t\tconst row = cell.getRow();\n\n\t\t\tif(row.isSelected()){\n\t\t\t\trow.deselect();\n\t\t\t} else {\n\t\t\t\trow.select();\n\t\t\t}\n\n\t\t\t// stop built-in handler\n\t\t\te.stopPropagation();\n\t\t\treturn false;\n\t\t},\n\t\tselectAllHandler(e, cell) {\n\t\t\tconst table = cell.getTable();\n\t\t\tconst rows = table.getRows();\n\n\t\t\t// custom select all logic\n\t\t\tconst allowed = rows.filter(r => r.getData().selectable);\n\t\t\tconst selected = allowed.every(r => r.isSelected());\n\n\t\t\tif(selected){\n\t\t\t\tallowed.forEach(r => r.deselect());\n\t\t\t} else {\n\t\t\t\tallowed.forEach(r => r.select());\n\t\t\t}\n\n\t\t\t// stop built-in handler\n\t\t\te.stopPropagation();\n\t\t\treturn false;\n\t\t},\n\t\tcheckQualityGateStatus(projekt) {\n\t\t\tconst qgate1Termine = []\n\t\t\tconst qgate2Termine = []\n\t\t\t\n\t\t\tprojekt.qgate1Status = this.$p.t('abgabetool/c4keinTerminVorhanden')// 'Kein Termin vorhanden'\n\t\t\tprojekt.qgate1StatusRank = 0\n\t\t\tprojekt.qgate2Status = this.$p.t('abgabetool/c4keinTerminVorhanden')\n\t\t\tprojekt.qgate2StatusRank = 0\n\t\t\t\n\t\t\tprojekt.abgabetermine.forEach(termin => {\n\t\t\t\tif(termin.paabgabetyp_kurzbz == 'qualgate1') qgate1Termine.push(termin)\n\t\t\t\tif(termin.paabgabetyp_kurzbz == 'qualgate2') qgate2Termine.push(termin)\n\t\t\t})\n\t\t\t\n\t\t\t// calculate qgateStatusRank and display the highest order status rank of all quality gate termine until one\n\t\t\t// counts as passed, which is just a positive note no matter if anything has been uploaded\n\t\t\t\n\t\t\t// reuse luxon calculated diffMs (termin.datum in relation to today) from previous datestyle check \n\t\t\tqgate1Termine.forEach(qgate => {\n\t\t\t\tif(qgate.note != null && projekt.qgate1StatusRank <= 5) {\n\t\t\t\t\tconst noteOpt = typeof qgate.note !== 'object' ? this.notenOptions.find(opt => opt.note == qgate.note) : qgate.note\n\t\t\t\t\tif(noteOpt.positiv) {\n\t\t\t\t\t\tprojekt.qgate1Status = this.$p.t('abgabetool/c4positivBenotet')\n\t\t\t\t\t\tprojekt.qgate1StatusRank = 5\n\t\t\t\t\t} else {\n\t\t\t\t\t\tprojekt.qgate1Status = this.$p.t('abgabetool/c4negativBenotet')\n\t\t\t\t\t\tprojekt.qgate1StatusRank = 4\n\t\t\t\t\t}\n\t\t\t\t} else if (qgate.note == null && projekt.qgate1StatusRank <= 3) {\n\t\t\t\t\tprojekt.qgate1Status = this.$p.t('abgabetool/c4notYetGraded')\n\t\t\t\t\tprojekt.qgate1StatusRank = 3\n\t\t\t\t} else if(qgate.upload_allowed == true && qgate.abgabedatum == null && projekt.qgate1StatusRank <= 2) {\n\t\t\t\t\tprojekt.qgate1Status = this.$p.t('abgabetool/c4notSubmitted')\n\t\t\t\t\tprojekt.qgate1StatusRank = 2\n\t\t\t\t} else if (qgate.upload_allowed == false && qgate.diffMs <= 0 && projekt.qgate1StatusRank <= 1) {\n\t\t\t\t\tprojekt.qgate1Status = this.$p.t('abgabetool/c4notHappenedYet')\n\t\t\t\t\tprojekt.qgate1StatusRank = 1\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tqgate2Termine.forEach(qgate => {\n\t\t\t\tif(qgate.note != null && projekt.qgate1StatusRank <= 5) {\n\t\t\t\t\tconst noteOpt = typeof qgate.note !== 'object' ? this.notenOptions.find(opt => opt.note == qgate.note) : qgate.note\n\t\t\t\t\tif(noteOpt.positiv) {\n\t\t\t\t\t\tprojekt.qgate2Status = this.$p.t('abgabetool/c4positivBenotet')\n\t\t\t\t\t\tprojekt.qgate2StatusRank = 5\n\t\t\t\t\t} else {\n\t\t\t\t\t\tprojekt.qgate2Status = this.$p.t('abgabetool/c4negativBenotet')\n\t\t\t\t\t\tprojekt.qgate2StatusRank = 4\n\t\t\t\t\t}\n\t\t\t\t} else if (qgate.note == null && projekt.qgate2StatusRank <= 3) {\n\t\t\t\t\tprojekt.qgate2Status = this.$p.t('abgabetool/c4notYetGraded')\n\t\t\t\t\tprojekt.qgate2StatusRank = 3\n\t\t\t\t} else if(qgate.upload_allowed == true && qgate.abgabedatum == null && projekt.qgate2StatusRank <= 2) {\n\t\t\t\t\tprojekt.qgate2Status = this.$p.t('abgabetool/c4notSubmitted')\n\t\t\t\t\tprojekt.qgate2StatusRank = 2\n\t\t\t\t} else if (qgate.upload_allowed == false && qgate.diffMs <= 0 && projekt.qgate2StatusRank <= 1) {\n\t\t\t\t\tprojekt.qgate2Status = this.$p.t('abgabetool/c4notHappenedYet')\n\t\t\t\t\tprojekt.qgate2StatusRank = 1\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\tgetItemBezeichnung(item){\n\t\t\tif(!item.bezeichnung) return ''\n\t\t\t\n\t\t\treturn item?.bezeichnung?.bezeichnung ?? item?.bezeichnung\n\t\t},\n\t\tgetItemNote(item) {\n\t\t\t// note can be just a number if it is coming from backend\n\t\t\t// if note was just set it is a note option\n\t\t\tif(!item?.note) return ''\n\t\t\tif(item.note?.bezeichnung) return item.note.bezeichnung\n\t\t\t\n\t\t\tconst notenOption = this.notenOptions.find(note => note.note == item.note)\n\t\t\tif(!notenOption) return item.note\n\t\t\t\n\t\t\treturn notenOption.bezeichnung\n\t\t},\n\t\thandleChangeAbgabetypSerientermin(termin) {\n\t\t\t// if paabgabetype qualgate is selected, fill out kurzbz textfield with bezeichnung of quality gate so users\n\t\t\t// are possibly less confused\n\t\t\tif(termin.bezeichnung?.paabgabetyp_kurzbz === 'qualgate1' || termin.bezeichnung?.paabgabetyp_kurzbz === 'qualgate2') {\n\t\t\t\ttermin.kurzbz = termin.bezeichnung.bezeichnung\n\t\t\t} else {\n\t\t\t\ttermin.kurzbz = ''\n\t\t\t}\n\t\t},\n\t\tsemesterChanged(e) {\n\t\t\tif(this.$refs.abgabeTable.tabulator) {\n\t\t\t\tconst table = this.$refs.abgabeTable.tabulator\n\n\t\t\t\t// TODO: maybe check if existing synergy really works with many filters\n\t\t\t\tconst existing = table.getFilters().filter(f => f.field != 'studiensemester_kurzbz');\n\n\t\t\t\tconst compVal = e.value.studiensemester_kurzbz == this.$p.t('abgabetool/c4all') ? '' : e.value.studiensemester_kurzbz\n\t\t\t\tconst compType = e.value.studiensemester_kurzbz == this.$p.t('abgabetool/c4all') ? '!=' : '='\n\t\t\t\tconst newFilter = { field: \"studiensemester_kurzbz\", type: compType, value: compVal };\n\n\t\t\t\t// merge and reapply\n\t\t\t\ttable.setFilter([...existing, newFilter]);\n\t\t\t}\n\t\t\t\n\t\t},\n\t\tcheckAbgabetermineProjektarbeit(projekt) {\n\t\t\tconst now = luxon.DateTime.now()\n\t\t\t\n\t\t\t// calculate Abgabetermin time diff to now and assign last and next to projekt\n\t\t\tprojekt.abgabetermine.forEach(termin => {\n\n\t\t\t\ttermin.bezeichnung = this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz === termin.paabgabetyp_kurzbz)\n\t\t\t\t\n\t\t\t\t// while already looping through each termin, calculate datestyle beforehand\n\t\t\t\ttermin.dateStyle = getDateStyleClass(termin, this.notenOptions)\n\n\t\t\t\tconst date = luxon.DateTime.fromISO(termin.datum).endOf('day')\n\t\t\t\ttermin.luxonDate = date\n\t\t\t\ttermin.diffMs = date.toMillis() - now.toMillis(); // positive = future, negative = past\n\n\t\t\t\tif (termin.diffMs < 0) {\n\t\t\t\t\tif (!projekt.prevTermin ||\n\t\t\t\t\t\ttermin.diffMs > projekt.prevTermin.diffMs // larger (less negative) = closer to now\n\t\t\t\t\t) {\n\t\t\t\t\t\tprojekt.prevTermin = termin;\n\t\t\t\t\t}\n\t\t\t\t} else if (termin.diffMs > 0) {\n\t\t\t\t\tif (!projekt.nextTermin ||\n\t\t\t\t\t\ttermin.diffMs < projekt.nextTermin.diffMs // smaller positive = closer to now\n\t\t\t\t\t) {\n\t\t\t\t\t\tprojekt.nextTermin = termin;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\n\t\t\t// seperate check for quality gates\n\t\t\tthis.checkQualityGateStatus(projekt)\n\t\t},\n\t\tloadState() {\n\t\t\treturn JSON.parse(localStorage.getItem(this.abgabeTableOptions.persistenceID) || \"null\");\n\t\t},\n\t\tsaveState(table) {\n\t\t\t// avoid storing state after first restore part happened\n\t\t\tif(!this.stateRestored) return\n\t\t\tconst rawLayout = table.getColumnLayout();\n\t\t\tconst state = {\n\t\t\t\tcolumns: rawLayout.map(col => ({\n\t\t\t\t\tfield: col.field,\n\t\t\t\t\tvisible: col.visible,\n\t\t\t\t\twidth: col.width,\n\t\t\t\t})),\n\t\t\t\tsort: table.getSorters().map(s => ({\n\t\t\t\t\tfield: s.field,\n\t\t\t\t\tdir: s.dir,\n\t\t\t\t})),\n\t\t\t\tfilters: table.getFilters(),\n\t\t\t\theaderFilters: table.getHeaderFilters()\n\t\t\t};\n\t\t\t\n\t\t\tlocalStorage.setItem(this.abgabeTableOptions.persistenceID, JSON.stringify(state));\n\t\t},\n\t\thandleTableBuilt() {\n\t\t\tconst table = this.$refs.abgabeTable.tabulator\n\n\t\t\tthis.tableBuiltResolve()\n\t\t\t\n\t\t\ttable.on(\"columnMoved\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"columnResized\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"columnVisibilityChanged\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"filterChanged\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"headerFilterChanged\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"dataSorted\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"columnSorted\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\ttable.on(\"sortersChanged\", () => {\n\t\t\t\tthis.saveState(table);\n\t\t\t});\n\n\t\t\tconst saved = this.loadState();\n\n\t\t\ttable.on(\"renderComplete\", () => {\n\t\t\t\tif(!this.stateRestored) {\n\n\t\t\t\t\tif (saved?.columns && !this.colLayoutRestored) {\n\t\t\t\t\t\tconst layout = saved.columns.map(col => ({\n\t\t\t\t\t\t\tfield: col.field,\n\t\t\t\t\t\t\twidth: col.width,\n\t\t\t\t\t\t\tvisible: col.visible,\n\t\t\t\t\t\t\t// add more if needed, but keep it simple\n\t\t\t\t\t\t}));\n\t\t\t\t\t\t\n\t\t\t\t\t\ttable.setColumnLayout(layout);\n\n\t\t\t\t\t\tthis.colLayoutRestored = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (saved?.filters && !this.filtersRestored) {\n\t\t\t\t\t\tthis.filtersRestored = true // instantly avoid retriggers\n\t\t\t\t\t\ttable.setFilter(saved.filters);\n\t\t\t\t\t}\n\t\t\t\t\tif (saved?.headerFilters && !this.headerFiltersRestored) {\n\t\t\t\t\t\tthis.headerFiltersRestored = true // instantly avoid retriggers\n\t\t\t\t\t\tfor (let hf of saved.headerFilters) {\n\t\t\t\t\t\t\ttable.setHeaderFilterValue(hf.field, hf.value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (saved?.sort?.length && !this.sortRestored) {\n\t\t\t\t\t\tthis.sortRestored = true;\n\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tconst sortList = saved.sort.map(s => {\n\t\t\t\t\t\t\t\tconst col = table.columnManager.findColumn(s.field);\n\t\t\t\t\t\t\t\tif (!col) {\n\t\t\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn { column: col, dir: s.dir };\n\t\t\t\t\t\t\t}).filter(Boolean);\n\n\t\t\t\t\t\t\ttable.setSort(sortList);\n\t\t\t\t\t\t}, 100);\n\t\t\t\t\t}\n\t\t\t\t\tthis.stateRestored = true\n\n\t\t\t\t}\n\n\t\t\t});\n\t\t},\n\t\thandleToggleFullscreenDetail() {\n\t\t\tthis.detailIsFullscreen = !this.detailIsFullscreen\n\t\t},\n\t\tgetOptionLabelAbgabetyp(option){\n\t\t\treturn option.bezeichnung\n\t\t},\n\t\tgetOptionLabelStg(option){\n\t\t\treturn option.kurzbzlang + ' ' + option.bezeichnung\n\t\t},\n\t\tgetOptionLabelStudiensemester(option){\n\t\t\treturn option.studiensemester_kurzbz\n\t\t},\n\t\tgetNotenFilterOptionLabel(option) {\n\t\t\treturn option.bezeichnung\t\n\t\t},\n\t\tformatDate(dateParam) {\n\t\t\tif(dateParam === null) return ''\n\t\t\tconst date = new Date(dateParam)\n\t\t\t// handle missing leading 0\n\t\t\tconst padZero = (num) => String(num).padStart(2, '0');\n\n\t\t\tconst month = padZero(date.getMonth() + 1); // Months are zero-based\n\t\t\tconst day = padZero(date.getDate());\n\t\t\tconst year = date.getFullYear();\n\n\t\t\treturn `${day}.${month}.${year}`;\n\t\t},\n\t\tformAction(cell) {\n\t\t\tconst actionButtons = document.createElement('div');\n\t\t\tactionButtons.className = \"d-flex gap-3\"; // you can keep Bootstrap gap if loaded\n\t\t\tactionButtons.style.display = \"flex\";\n\t\t\tactionButtons.style.alignItems = \"stretch\"; // buttons stretch to full height\n\t\t\tactionButtons.style.justifyContent = \"center\";\n\t\t\tactionButtons.style.height = \"100%\"; // full grid cell height\n\n\t\t\tconst val = cell.getValue();\n\n\t\t\tconst createButton = (iconClass, titleKey, clickHandler) => {\n\t\t\t\tconst btn = document.createElement('button');\n\t\t\t\tbtn.className = 'btn btn-outline-secondary';\n\t\t\t\tbtn.style.display = \"flex\";\n\t\t\t\tbtn.style.alignItems = \"center\"; // center icon vertically\n\t\t\t\tbtn.style.justifyContent = \"center\"; // center icon horizontally\n\t\t\t\tbtn.style.height = \"100%\"; // fill parent container height\n\t\t\t\tbtn.style.aspectRatio = \"1 / 1\"; // keep square shape (optional)\n\t\t\t\tbtn.style.padding = \"0\"; // remove extra padding for compactness\n\t\t\t\tif(iconClass == 'fa fa-timeline') btn.style.transform = \"rotate(90deg)\";\n\t\t\t\tbtn.innerHTML = ``;\n\t\t\t\tbtn.title = this.$capitalize(this.$p.t(titleKey));\n\t\t\t\tbtn.addEventListener('click', (e) => {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\te.stopImmediatePropagation();\n\t\t\t\t\tclickHandler();\n\t\t\t\t});\n\t\t\t\treturn btn;\n\t\t\t};\n\n\t\t\tactionButtons.append(\n\t\t\t\tcreateButton('fa fa-folder-open', 'abgabetool/c4details', () => this.setDetailComponent(val)),\n\t\t\t\tcreateButton('fa fa-timeline', 'abgabetool/c4termineTimeLine', () => this.openTimeline(val))\n\t\t\t);\n\n\t\t\treturn actionButtons;\n\t\t},\n\n\t\tundoSelection(cell) {\n\t\t\t// checks if cells row is selected and unselects -> imitates columns which dont trigger row selection\n\t\t\t// but actually just revert it after the fact\n\n\t\t\tconst row = cell.getRow()\n\t\t\tif(row.isSelected()) {\n\t\t\t\trow.deselect();\n\t\t\t}\n\t\t},\n\t\tselectionCheck(row) {\n\t\t\tconst data = row.getData()\n\t\t\tif(data?.betreuerart_kurzbz == 'Zweitbegutachter') return false\n\t\t\treturn true\n\t\t},\n\t\tshowDeadlines(){\n\t\t\tconst link = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router\n\t\t\t\t+ '/Cis/Abgabetool/Deadlines'\n\t\t\twindow.open(link, '_blank')\n\t\t},\n\t\topenAddSeriesModal() {\n\t\t\tthis.$refs.modalContainerAddSeries.show()\n\t\t},\n\t\taddSeries() {\n\t\t\tconst pids = this.selectedData?.map(projekt => projekt.projektarbeit_id)\n\t\t\t\n\t\t\tconst preserveSelected = [...this.selectedData]\n\t\t\t\n\t\t\tthis.saving = true\n\t\t\tthis.serienTermin.fixtermin = !this.serienTermin.invertedFixtermin\n\t\t\tthis.$api.call(ApiAbgabe.postSerientermin(\n\t\t\t\tthis.serienTermin.datum.toISOString(),\n\t\t\t\tthis.serienTermin.bezeichnung.paabgabetyp_kurzbz,\n\t\t\t\tthis.serienTermin.bezeichnung.bezeichnung,\n\t\t\t\tthis.serienTermin.kurzbz,\n\t\t\t\tthis.serienTermin.upload_allowed,\n\t\t\t\tpids,\n\t\t\t\tthis.serienTermin.fixtermin\n\t\t\t)).then(res => {\n\t\t\t\t\n\t\t\t\tif (res.meta.status === \"success\" && res.data) {\n\t\t\t\t\tthis.$fhcAlert.alertSuccess(this.$p.t('abgabetool/serienTerminGespeichert'))\n\t\t\t\t} else {\n\t\t\t\t\tthis.$fhcAlert.alertError(this.$p.t('abgabetool/errorSerienterminSpeichern'))\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// put new abgaben into projektarbeiten\n\t\t\t\tconst newAbgaben = res.data\n\t\t\t\tpids.forEach(pid => {\n\t\t\t\t\tconst abgabe = newAbgaben.find(abgabe => abgabe.projektarbeit_id == pid)\n\t\t\t\t\t\n\t\t\t\t\tconst pa = this.projektarbeiten.find(pa => pa.projektarbeit_id == pid)\n\t\t\t\t\n\t\t\t\t\tabgabe.bezeichnung = this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz == abgabe.paabgabetyp_kurzbz)\n\t\t\t\t\t\n\t\t\t\t\tpa.abgabetermine.push(abgabe)\n\t\t\t\t\tpa.abgabetermine.sort((a, b) => new Date(a.datum) - new Date(b.datum))\n\t\t\t\t})\n\t\t\t\t\n\t\t\t\t// reset selection to empty\n\t\t\t\t// this.$refs.abgabeTable.tabulator.deselectRow()\n\t\t\t\tconst table = this.$refs.abgabeTable.tabulator;\n\t\t\t\tconst scrollX = table.rowManager.scrollLeft;\n\t\t\t\tconst scrollY = table.rowManager.scrollTop;\n\t\t\t\t\n\t\t\t\tconst mappedData = this.mapProjekteToTableData(this.projektarbeiten)\n\n\t\t\t\ttable.setData(mappedData)\n\t\t\t\ttable.redraw(true)\n\n\t\t\t\tVue.nextTick(()=> {\n\t\t\t\t\tconst table = this.$refs.abgabeTable?.tabulator.element.querySelector('.tabulator-tableholder')\n\t\t\t\t\tif(table) {\n\t\t\t\t\t\ttable.scrollLeft = scrollX;\n\t\t\t\t\t\ttable.scrollTop = scrollY;\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t\n\t\t\t}).finally(()=>{\n\t\t\t\tthis.saving = false\n\t\t\t\tthis.selectedData = preserveSelected\n\t\t\t})\n\n\t\t\tthis.$refs.modalContainerAddSeries.hide()\n\t\t},\n\t\tmapProjekteToTableData(projekte) {\n\t\t\t// const now = luxon.DateTime.now();\n\t\t\treturn projekte.map(projekt => {\n\t\t\t\t\n\t\t\t\t// in assistenz context every projektarbeit should be allowed to be selected i guess\n\t\t\t\tprojekt.selectable = true;\n\t\t\t\t\n\t\t\t\tprojekt.prevTermin = null;\n\t\t\t\tprojekt.nextTermin = null;\n\n\t\t\t\tthis.checkAbgabetermineProjektarbeit(projekt)\n\n\t\t\t\tif(this.notenOptions && projekt.note) {\n\t\t\t\t\tconst opt = this.notenOptions.find(n => n.note == projekt.note)\n\t\t\t\t\n\t\t\t\t\t// TODO: mehrsprachig englisch\n\t\t\t\t\tprojekt.note_bez = opt.bezeichnung\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn {\n\t\t\t\t\t...projekt,\n\t\t\t\t\tabgabetermine: projekt.abgabetermine,\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\tstudent_uid: projekt.student_uid,\n\t\t\t\t\t\tprojektarbeit_id: projekt.projektarbeit_id,\n\t\t\t\t\t},\n\t\t\t\t\tpkz: this.buildPKZ(projekt),\n\t\t\t\t\tbeurteilung: projekt.beurteilungLink ?? null,\n\t\t\t\t\tsem: projekt.studiensemester_kurzbz,\n\t\t\t\t\tstg: this.buildStg(projekt),\n\t\t\t\t\tmail: this.buildMailToLink(projekt),\n\t\t\t\t\terstbetreuer: this.buildErstbetreuer(projekt),\n\t\t\t\t\tzweitbetreuer: this.buildZweitbetreuer(projekt),\n\t\t\t\t\ttyp: projekt.projekttyp_kurzbz,\n\t\t\t\t\ttitel: projekt.titel\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\tcreateInfoString(data) {\n\t\t\tlet str = '';\n\n\t\t\tdata.forEach(name => {\n\t\t\t\tstr += name\n\t\t\t\tstr += '; '\n\t\t\t})\n\n\t\t\treturn str\n\t\t},\n\t\tisPastDate(date) {\n\t\t\tconst deadline = luxon.DateTime.fromISO(date, { zone: 'Europe/Vienna' }).endOf('day');\n\t\t\tconst nowInVienna = luxon.DateTime.now().setZone('Europe/Vienna');\n\t\t\treturn nowInVienna > deadline;\n\t\t},\n\t\tsetDetailComponent(details){\n\t\t\tconst pa = this.projektarbeiten.find(projektarbeit => projektarbeit.projektarbeit_id == details.projektarbeit_id)\n\n\t\t\tif(pa?.abgabetermine?.length) {\n\t\t\t\tthis.$api.call(ApiAbgabe.getSignaturStatusForProjektarbeitAbgaben(pa.abgabetermine.map(termin => termin.paabgabe_id), pa.student_uid))\n\t\t\t\t\t.then(res => {\n\t\t\t\t\t\tif(res.meta.status === 'success') {\n\t\t\t\t\t\t\tres.data.forEach(paabgabe => {\n\t\t\t\t\t\t\t\tconst termin = pa.abgabetermine.find(abgabe => abgabe.paabgabe_id == paabgabe.paabgabe_id)\n\t\t\t\t\t\t\t\tif(termin && paabgabe.signatur !== undefined) termin.signatur = paabgabe.signatur\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t}\n\t\t\t\n\t\t\tconst paIsBenotet = pa.note !== null\n\t\t\t\n\t\t\tpa.abgabetermine.forEach(termin => {\n\t\t\t\tif(typeof termin.note !== 'object') {\n\t\t\t\t\ttermin.note = this.allowedNotenOptions.find(opt => opt.note == termin.note)\n\t\t\t\t}\n\n\t\t\t\t// only set this if it has not been set yet and abgabetermin has a note (qgate)\n\t\t\t\tif(!termin.noteBackend && termin.note) {\n\t\t\t\t\ttermin.noteBackend = termin.note\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\ttermin.file = []\n\n\t\t\t\t// assistenz should be able to edit every abgabe\n\t\t\t\t// update 21-01-2026: actually blocking operations on finished projektarbeiten seems like a decent idea\n\t\t\t\ttermin.allowedToSave = paIsBenotet ? false : true\n\n\t\t\t\t// assistenz are not allowed to delete deadlines with existing submissions\n\t\t\t\ttermin.allowedToDelete = paIsBenotet ? false : !termin.abgabedatum\n\t\t\t\t\n\t\t\t})\n\t\t\t\n\t\t\tconst vorname = pa.vorname ?? pa.student_vorname\n\t\t\tconst nachname = pa.nachname ?? pa.student_nachname\n\t\t\tpa.student = `${vorname} ${nachname}`\n\n\t\t\tthis.selectedProjektarbeit = pa\n\t\t\tthis.$refs.modalContainerAbgabeDetail.show()\n\t\t},\n\t\topenTimeline(val) {\n\t\t\tconst projekt = this.projektarbeiten.find(p => p.projektarbeit_id == val.projektarbeit_id)\n\t\t\tif(!projekt) {\n\n\t\t\t\tthis.$fhcAlert.alertInfo('Keine projektarbeit gefunden')\n\t\t\t\t\n\t\t\t\treturn\n\t\t\t}\n\t\t\tprojekt.abgabetermine.forEach(termin => {\n\t\t\t\t// show note only on termine with abgabetypen which are benotbar\n\t\t\t\tconst terminTypOpt = this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz == termin.paabgabetyp_kurzbz)\n\t\t\t\ttermin.benotbar = terminTypOpt.benotbar \n\t\t\t})\n\t\t\tthis.timelineProjekt = projekt\n\t\t\tthis.$refs.drawer.show()\n\t\t},\n\t\tcenteredTextFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\t\t\tif(!val) return\n\n\t\t\treturn '
    ' +\n\t\t\t\t'

    '+val+'

    '\n\t\t},\n\t\tdetailFormatter(cell) {\n\t\t\treturn '
    ' +\n\t\t\t\t'
    '\n\t\t},\n\t\tmailFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\t\t\treturn '
    ' +\n\t\t\t\t'
    '\n\t\t},\n\t\ttimelineFormatter() {\n\t\t\treturn '
    ' +\n\t\t\t\t'
    '\n\t\t},\n\t\tbeurteilungFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\t\t\tif(val) {\n\t\t\t\treturn '
    ' +\n\t\t\t\t\t'
    '\n\t\t\t} else return '-'\n\t\t},\n\t\tpkzTextFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\n\t\t\treturn '
    ' +\n\t\t\t\t''+val+'
    '\n\t\t},\n\t\tabgabterminFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\n\t\t\tif(val) {\n\t\t\t\tlet icon = ''\n\t\t\t\tswitch(val.dateStyle) {\n\t\t\t\t\tcase 'verspaetet':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'verpasst':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'abzugeben':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'standard':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'abgegeben':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'beurteilungerforderlich':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'bestanden':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'nichtbestanden':\n\t\t\t\t\t\ticon = ''\n\t\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tconst bezeichnung = val.bezeichnung?.bezeichnung ?? val.bezeichnung\n\t\t\t\t\n\t\t\t\treturn '
    ' +\n\t\t\t\t\t'
    ' +\n\t\t\t\t\t\ticon +\n\t\t\t\t\t'
    ' + \n\t\t\t\t\t'
    ' +\n\t\t\t\t\t\t'

    '+bezeichnung+' - '+ this.formatDate(val.datum)+'

    ' +\n\t\t\t\t\t'
    '+\n\t\t\t\t\t'
    '\n\n\t\t\t} else {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\t\n\t\t},\n\t\ttableResolve(resolve) {\n\t\t\tthis.tableBuiltResolve = resolve\n\t\t},\n\t\tbuildMailToLink(projekt) {\n\t\t\treturn 'mailto:' + projekt.student_uid +'@'+ this.domain\n\t\t},\n\t\tbuildPKZ(projekt) {\n\t\t\treturn `${projekt.student_uid} / ${projekt.matrikelnr}`\n\t\t},\n\t\tbuildStg(projekt) {\n\t\t\treturn (projekt.typ + projekt.kurzbz)?.toUpperCase()\n\t\t},\n\t\tbuildErstbetreuer(projekt) {\n\t\t\tif(projekt.erstbetreuer_full_name) return projekt.erstbetreuer_full_name\n\t\t\treturn projekt.betreuer_vorname + ' ' + projekt.betreuer_nachname\n\t\t},\n\t\tbuildZweitbetreuer(projekt) {\n\t\t\treturn projekt.zweitbetreuer_full_name ?? ''\n\t\t},\n\t\tasync setupData(data){\n\t\t\tthis.projektarbeiten = data[0]\n\t\t\tthis.domain = data[1]\n\t\t\t\n\t\t\tthis.tableData = this.mapProjekteToTableData(this.projektarbeiten)\n\n\t\t\tawait this.tableBuiltPromise\n\t\t\t\n\t\t\tthis.$refs.abgabeTable.tabulator.setData(this.tableData);\n\t\t},\n\t\tloadProjektarbeiten(all = false, callback) {\n\t\t\tthis.loading = true\n\t\t\tthis.$api.call(ApiAbgabe.getProjektarbeitenForStudiengang(\n\t\t\t\tthis.selectedStudiengangOption.studiengang_kz,\n\t\t\t\tthis.notenOptionFilter?.benotet ?? 0\n\t\t\t))\n\t\t\t\t.then(res => {\n\t\t\t\t\tif(res?.data) this.setupData(res.data)\n\t\t\t\t}).finally(() => {\n\t\t\t\tif(callback) {\n\t\t\t\t\tcallback()\n\t\t\t\t}\n\t\t\t}).finally(()=>{\n\t\t\t\tthis.loading=false\n\t\t\t})\n\t\t},\n\t\tloadAbgaben(details) {\n\t\t\treturn new Promise((resolve) => {\n\t\t\t\tthis.$api.call(ApiAbgabe.getStudentProjektabgaben(details))\n\t\t\t\t\t.then(res => {\n\t\t\t\t\t\tresolve(res)\n\t\t\t\t\t})\n\t\t\t})\n\t\t},\n\t\thandleUuidDefined(uuid) {\n\t\t\tthis.tabulatorUuid = uuid\n\t\t},\n\t\tcalcMaxTableHeight() {\n\t\t\tconst tableID = this.tabulatorUuid ? ('-' + this.tabulatorUuid) : ''\n\t\t\tconst tableDataSet = document.getElementById('filterTableDataset' + tableID);\n\t\t\tif(!tableDataSet) return\n\t\t\tconst rect = tableDataSet.getBoundingClientRect();\n\n\t\t\tthis.abgabeTableOptions.height = window.visualViewport.height - rect.top - 80\n\t\t\tthis.$refs.abgabeTable.tabulator.setHeight(this.abgabeTableOptions.height)\n\t\t},\n\t\tasync setupMounted() {\n\t\t\tthis.tableBuiltPromise = new Promise(this.tableResolve)\n\t\t\tawait this.tableBuiltPromise\n\t\t\t\n\t\t\tawait this.allConfigPromise\n\t\t\t\n\t\t\t// called through notenOptionFilter/selectedStudiengangOption watcher on startup\n\t\t\t// this.loadProjektarbeiten()\n\n\t\t\tthis.calcMaxTableHeight()\n\t\t},\n\t\tgetOptionDisabled(option) {\n\t\t\treturn !option.aktiv\n\t\t},\n\t},\n\tcomputed: {\n\t\temailItems() {\n\t\t\tconst menu = []\n\t\t\t\n\t\t\tif(this.ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT){\n\t\t\t\tmenu.push({\n\t\t\t\t\tlabel: this.$p.t('abgabetool/c4sendEmailStudierendev2', [this.uniqueStudentEmailCount]),\n\t\t\t\t\tcommand: this.sammelMailStudent\n\t\t\t\t})\n\t\t\t}\n\t\t\t\n\t\t\tif(this.ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER) {\n\t\t\t\tmenu.push({\n\t\t\t\t\tlabel: this.$p.t('abgabetool/c4sendEmailBetreuerv3', [this.uniqueBetreuerEmailCount]),\n\t\t\t\t\tcommand: this.sammelMailBetreuer\n\t\t\t\t})\n\t\t\t}\n\n\t\t\treturn menu\n\t\t},\n\t\tuniqueBetreuerEmailCount() {\n\t\t\tconst emails = new Set();\n\t\t\t\n\t\t\tthis.selectedData.forEach(row => {\n\t\t\t\tif (row.betreuer_mail) emails.add(row.betreuer_mail);\n\t\t\t\tif (row.zweitbetreuer_mail) emails.add(row.zweitbetreuer_mail);\n\t\t\t});\n\n\t\t\treturn emails.size;\n\t\t},\n\t\tuniqueStudentEmailCount() {\n\t\t\tconst emails = new Set();\n\n\t\t\tthis.selectedData.forEach(row => {\n\t\t\t\tif (row.student_uid) {\n\t\t\t\t\temails.add(row.student_uid); // actually dont need domain for this\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn emails.size;\n\t\t}\n\t},\n\twatch: {\n\t\t'serienTermin.bezeichnung'(newVal) {\n\t\t\tif(newVal?.paabgabetyp_kurzbz === 'qualgate1' || newVal?.paabgabetyp_kurzbz === 'qualgate2') {\n\t\t\t\tthis.serienTermin.kurzbz = newVal.bezeichnung\n\t\t\t}\n\n\t\t\tthis.serienTermin.upload_allowed = newVal.upload_allowed_default\n\t\t},\n\t\tselectedStudiengangOption(newVal, oldVal) {\n\t\t\t// implicitely avoids juggling around promises for created api calls,\n\t\t\t// since we need note & stg flags for loadProjektarbeiten\n\t\t\tif(this.notenOptionFilter !== null && this.selectedStudiengangOption !== null) {\n\t\t\t\tthis.loadProjektarbeiten()\n\t\t\t}\n\t\t},\n\t\tnotenOptionFilter(newVal) {\n\t\t\t// that single where clause is worth a decent load time so rather not filter tabulator but just \n\t\t\t// adapt the qry\n\t\t\tif(this.notenOptionFilter !== null && this.selectedStudiengangOption !== null) {\n\t\t\t\tthis.loadProjektarbeiten()\n\t\t\t}\n\t\t},\n\t\tselectedData(newVal) {\n\t\t\tconst table = this.$refs.abgabeTable?.tabulator\n\t\t\tif(!table) return\n\n\t\t\tconst allRows = table.getRows();\n\n\t\t\tnewVal.forEach(selected => {\n\t\t\t\tconst row = allRows.find(r => {\n\t\t\t\t\tconst data = r.getData()\n\t\t\t\t\tif (data.projektarbeit_id == selected.projektarbeit_id) return r\n\t\t\t\t}) \t\n\t\t\t\t\n\t\t\t\trow.select()\n\t\t\t\tconst cb = row.getElement().children[0]?.children[0]?.children[0]\n\t\t\t\tif(cb) cb.checked = true\n\t\t\t})\n\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.loading = true\n\t\tthis.phrasenPromise = this.$p.loadCategory(['abgabetool', 'global'])\n\t\tthis.phrasenPromise.then(()=> {this.phrasenResolved = true})\n\t\t\n\t\t//TODO: SWITCH TO NOTEN API ONCE NOTENTOOL IS IN MASTER TO AVOID DUPLICATE API\n\t\tconst requests = [\n\t\t\tthis.$api.call(ApiAbgabe.getConfig()),\n\t\t\tthis.$api.call(ApiAbgabe.getStudiengaenge()),\n\t\t\tthis.$api.call(ApiStudiensemester.getAllStudiensemesterAndAktOrNext()),\n\t\t\tthis.$api.call(ApiAbgabe.getNoten()),\n\t\t\tthis.$api.call(ApiAbgabe.getPaAbgabetypen())\n\t\t];\n\n\t\tthis.allConfigPromise = Promise.allSettled(requests)\n\t\t\t.then((results) => {\n\t\t\t\t// results is an array of { status: 'fulfilled'|'rejected', value?: any, reason?: any }\n\n\t\t\t\t// 1. Config\n\t\t\t\tif (results[0].status === 'fulfilled') {\n\t\t\t\t\tconst res = results[0].value;\n\t\t\t\t\tthis.turnitin_link = res.data?.turnitin_link;\n\t\t\t\t\tthis.old_abgabe_beurteilung_link = res.data?.old_abgabe_beurteilung_link;\n\t\t\t\t\tthis.ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT = res.data?.ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT;\n\t\t\t\t\tthis.ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER = res.data?.ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER;\n\t\t\t\t}\n\n\t\t\t\t// 2. Studiengänge\n\t\t\t\tif (results[1].status === 'fulfilled') {\n\t\t\t\t\tconst res = results[1].value;\n\t\t\t\t\tthis.studiengaengeOptions = res.data;\n\t\t\t\t\tif (this.studiengaengeOptions?.length) {\n\t\t\t\t\t\tthis.selectedStudiengangOption = this.stg_kz_prop\n\t\t\t\t\t\t\t? res.data.find(stgOpt => stgOpt.studiengang_kz == this.stg_kz_prop)\n\t\t\t\t\t\t\t: res.data[0];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// 3. Studiensemester\n\t\t\t\tif (results[2].status === 'fulfilled') {\n\t\t\t\t\tconst res = results[2].value;\n\t\t\t\t\tthis.allSem = res.data[0];\n\t\t\t\t\tconst all = { studiensemester_kurzbz: this.$p.t('abgabetool/c4all') };\n\t\t\t\t\tthis.curSem = all;\n\t\t\t\t\tthis.studiensemesterOptions = [all, ...this.allSem];\n\t\t\t\t}\n\n\t\t\t\t// 4. Noten\n\t\t\t\tif (results[3].status === 'fulfilled') {\n\t\t\t\t\tconst res = results[3].value;\n\t\t\t\t\tif (res.meta?.status === 'success') {\n\t\t\t\t\t\tthis.notenOptions = res.data[0];\n\t\t\t\t\t\tthis.allowedNotenOptions = this.notenOptions.filter(\n\t\t\t\t\t\t\topt => res.data[1].includes(opt.note)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tthis.notenOptionsNonFinal = this.notenOptions.filter(\n\t\t\t\t\t\t\topt => res.data[2].includes(opt.note)\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.allowedNotenFilterOptions = [\n\t\t\t\t\t\t{ bezeichnung: Vue.computed(() => this.$p.t('abgabetool/keineNoteEingetragen')), benotet: 0 },\n\t\t\t\t\t\t{ bezeichnung: Vue.computed(() => this.$p.t('abgabetool/c4benotet')), benotet: 1 },\n\t\t\t\t\t\t{ bezeichnung: Vue.computed(() => this.$p.t('abgabetool/showAll')), benotet: -1 }\n\t\t\t\t\t];\n\t\t\t\t\tthis.notenOptionFilter = this.allowedNotenFilterOptions[0];\n\t\t\t\t}\n\n\t\t\t\t// 5. Abgabetypen\n\t\t\t\tif (results[4].status === 'fulfilled') {\n\t\t\t\t\tconst res = results[4].value;\n\t\t\t\t\tthis.abgabeTypeOptions = res.data;\n\t\t\t\t}\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tthis.loading = false;\n\t\t\t});\n\t},\n\tmounted() {\n\t\tthis.setupMounted()\n\t},\n\ttemplate: `\n\t\n `,\n};\n\nexport default AbgabetoolAssistenz;\n","import {CoreFilterCmpt} from \"../../../components/filter/Filter.js\";\nimport ApiAbgabe from '../../../api/factory/abgabe.js'\n\nexport const DeadlineOverview = {\n\tname: \"DeadlineOverview\",\n\tcomponents: {\n\t\tCoreFilterCmpt,\n\t},\n\tprops: {\n\t\tperson_uid_prop: {\n\t\t\tdefault: null\t\n\t\t},\n\t\tviewData: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t\tdefault: () => ({name: '', uid: ''}),\n\t\t\tvalidator(value) {\n\t\t\t\treturn value && value.name && value.uid\n\t\t\t}\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tfullName: null, // TODO: fetch this somewhere\n\t\t\tdeadlines: null,\n\t\t\ttabulatorUuid: Vue.ref(0),\n\t\t\ttableBuiltResolve: null,\n\t\t\ttableBuiltPromise: null,\n\t\t\tphrasenPromise: null,\n\t\t\tphrasenResolved: false,\n\t\t\tdeadlineTableOptions: {\n\t\t\t\theight: 700,\n\t\t\t\tindex: 'projektarbeit_id',\n\t\t\t\tlayout: 'fitColumns',\n\t\t\t\tplaceholder: Vue.computed(() => this.$p.t('global/noDataAvailable')),\n\t\t\t\tcolumns: [\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4zieldatumv2'))), field: 'datum', formatter: this.centeredTextFormatter, widthGrow: 1, tooltip: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4fixterminv4'))), field: 'fixterminstring', formatter: this.centeredTextFormatter, widthGrow: 1, tooltip: false},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4abgabetyp'))), field: 'typ_bezeichnung', formatter: this.centeredTextFormatter, widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4abgabekurzbzv2'))), field: 'kurzbz', formatter: this.centeredTextFormatter, widthGrow: 3},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('person/studentIn'))), field: 'student', formatter: this.centeredTextFormatter, widthGrow: 2},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4stg'))), field: 'stg', formatter: this.centeredTextFormatter,widthGrow: 1},\n\t\t\t\t\t{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4sem'))), field: 'semester', formatter: this.centeredTextFormatter, widthGrow: 1}\n\t\t\t\t],\n\t\t\t\tpersistence: false,\n\t\t\t},\n\t\t\tdeadlineTableEventHandlers: [{\n\t\t\t\tevent: \"tableBuilt\",\n\t\t\t\thandler: async () => {\n\t\t\t\t\tthis.tableBuiltResolve()\n\t\t\t\t}\n\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tevent: \"cellClick\",\n\t\t\t\t\thandler: async (e, cell) => {\n\n\t\t\t\t\t\tif(cell.getColumn().getField() === \"details\") {\n\t\t\t\t\t\t\tconst val = cell.getValue()\n\n\t\t\t\t\t\t\tif(val.mode === 'detailTermine') {\n\t\t\t\t\t\t\t\tthis.setDetailComponent(cell.getValue())\n\t\t\t\t\t\t\t} else if (val.mode === 'beurteilungDownload') {\n\t\t\t\t\t\t\t\tconst pdfExportLink = FHC_JS_DATA_STORAGE_OBJECT.app_root + 'cis/private/pdfExport.php?xml=projektarbeitsbeurteilung.xml.php&xsl=Projektbeurteilung&betreuerart_kurzbz='+val.betreuerart_kurzbz+'&projektarbeit_id='+val.projektarbeit_id+'&person_id=' + val.betreuer_person_id\n\t\t\t\t\t\t\t\t// const pdfExportLink2 = FHC_JS_DATA_STORAGE_OBJECT.app_root + 'cis/private/lehre/projektbeurteilungDocumentExport.php?betreuerart_kurzbz='+val.betreuerart_kurzbz+'&projektarbeit_id='+val.projektarbeit_id+'&person_id=' + val.betreuer_person_id\n\t\t\t\t\t\t\t\twindow.open(pdfExportLink, '_blank')\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else if (cell.getColumn().getField() === \"beurteilung\") {\n\t\t\t\t\t\t\tconst val = cell.getValue()\n\n\t\t\t\t\t\t\tif(val != '-') window.open(val, '_blank')\n\t\t\t\t\t\t}\n\t\t\t\t\t\te.stopPropagation()\n\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]};\n\t},\n\tmethods: {\n\t\tcenteredTextFormatter(cell) {\n\t\t\tconst val = cell.getValue()\n\n\t\t\treturn '
    ' +\n\t\t\t\t'

    '+val+'

    '\n\t\t},\n\t\ttableResolve(resolve) {\n\t\t\tthis.tableBuiltResolve = resolve\n\t\t},\n\t\tloadDeadlines() {\n\t\t\tthis.$api.call(ApiAbgabe.fetchDeadlines(this.person_uid_prop ?? null))\n\t\t\t\t.then(res => {\n\t\t\t\t\tif(res?.data) this.setupData(res.data)\n\t\t\t\t})\n\t\t},\n\t\tsetupData(data) {\n\t\t\tthis.deadlines = data\n\t\t\t\n\t\t\tthis.deadlines.forEach(dl => {\n\t\t\t\tdl.student = (dl.stud_titelpre ? (dl.stud_titelpre + ' ') :'') + dl.stud_vorname + ' ' + dl.stud_nachname + (dl.stud_titelpost ? (' ' + dl.stud_titelpost) :'')\n\t\t\t\tdl.fixterminstring = dl.fixtermin ? this.$p.t('abgabetool/c4yes') : this.$p.t('abgabetool/c4no')\n\t\t\t})\n\n\t\t\tthis.$refs.deadlineTable.tabulator.setColumns(this.deadlineTableOptions.columns)\n\t\t\tthis.$refs.deadlineTable.tabulator.setData(this.deadlines);\n\t\t},\n\t\thandleUuidDefined(uuid) {\n\t\t\tthis.tabulatorUuid = uuid\n\t\t},\n\t\tcalcMaxTableHeight() {\n\t\t\tconst tableID = this.tabulatorUuid ? ('-' + this.tabulatorUuid) : ''\n\t\t\tconst tableDataSet = document.getElementById('filterTableDataset' + tableID);\n\t\t\tif(!tableDataSet) return\n\t\t\tconst rect = tableDataSet.getBoundingClientRect();\n\n\t\t\tthis.deadlineTableOptions.height = window.visualViewport.height - rect.top - 30\n\t\t\tthis.$refs.deadlineTable.tabulator.setHeight(this.deadlineTableOptions.height)\n\t\t},\n\t\tasync setupMounted() {\n\t\t\tthis.tableBuiltPromise = new Promise(this.tableResolve)\n\t\t\tawait this.tableBuiltPromise\n\n\t\t\tthis.loadDeadlines()\n\t\t\tthis.calcMaxTableHeight()\n\t\t}\n\t},\n\twatch: {\n\n\t},\n\tcomputed: {\n\n\t},\n\tcreated() {\n\t\tthis.phrasenPromise = this.$p.loadCategory(['abgabetool', 'global'])\n\t\tthis.phrasenPromise.then(()=> {this.phrasenResolved = true})\n\t},\n\tmounted() {\n\t\tthis.setupMounted()\n\t},\n\ttemplate: `\n\t\t

    {{$p.t('abgabetool/deadlinesTitle')}} {{ fullName ? ('-' + fullName) : ''}}

    \n\t\t
    \n\t\t\t\n\t\t \n `,\n};\n\nexport default DeadlineOverview;\n","import LvUebersicht from \"../Mylv/LvUebersicht.js\";\n\n\nexport default {\n\tdata(){\n\t\treturn {\n\t\t\tstudienSemester :[],\n\t\t\tselectedStudiensemester: null,\n\t\t\tstudiengaenge:[],\n\t\t\tselectedStudiengang:null,\n\t\t\tstudienOrdnung: [],\n\t\t\tselectedStudienordnung: null,\n\t\t\tsemester:[],\n\t\t\tselectedSemester:null,\n\t\t\tlehrveranstaltungen: [],\n\t\t\tselectedLehrveranstaltung: null,\n\t\t\tmenu:null,\n\t\t}\n\t},\n\tprovide(){\n\t\treturn {\n\t\t\tstudium_studiengang : Vue.computed(()=> this.selectedStudiengang),\n\t\t\tstudium_studiensemester: Vue.computed(() => this.selectedStudiensemester),\n\t\t\tstudium_semester: Vue.computed(() => this.selectedSemester),\n\t\t\tstudium_studienordnung: Vue.computed(() => this.selectedStudienordnung),\n\n\t\t}\n\t},\n\tcomponents: {\n\t\tLvUebersicht,\n\t},\n\twatch:{\n\t\tselectedStudiensemester: function(newVal, oldVal){\n\t\t\tif(newVal && newVal != oldVal){\n\t\t\t\tconst studiensemester =this.getDataFromLocalStorage(\"sudiensemester\");\n\t\t\t\tif (newVal && (!studiensemester || (studiensemester && studiensemester != newVal))){\n\t\t\t\t\tthis.storeDataToLocalStorage(\"sudiensemester\", newVal);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tselectedSemester: function (newVal, oldVal) {\n\t\t\tif (newVal && newVal != oldVal) {\n\t\t\t\tconst semester = this.getDataFromLocalStorage(\"semester\");\n\t\t\t\tif (!semester || (semester && semester != newVal)) {\n\t\t\t\t\tthis.storeDataToLocalStorage(\"semester\", newVal);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tselectedStudiengang: function (newVal, oldVal) {\n\t\t\tif (newVal && newVal != oldVal) {\n\t\t\t\tconst studiengang = this.getDataFromLocalStorage(\"studiengang\");\n\t\t\t\tif (!studiengang || (studiengang && studiengang != newVal)) {\n\t\t\t\t\tthis.storeDataToLocalStorage(\"studiengang\", JSON.stringify(newVal));\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tselectedStudienordnung: function (newVal, oldVal) {\n\t\t\tif (newVal && newVal != oldVal) {\n\t\t\t\tconst studienordnung = this.getDataFromLocalStorage(\"studienordnung\");\n\t\t\t\tif (!studienordnung || (studienordnung && studienordnung != newVal)) {\n\t\t\t\t\tthis.storeDataToLocalStorage(\"studienordnung\", JSON.stringify(newVal));\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t},\n\tmethods:{\n\t\tchangeStudiensemester(value){\n\t\t\tlet studiensemester = this.$refs.studiensemester;\n\t\t\tstudiensemester.selectedIndex = (studiensemester.selectedIndex + value + studiensemester.options.length) % studiensemester.options.length;\n\t\t\tthis.changeSelectedStudienSemester(studiensemester.value);\n\t\t},\n\t\tchangeStudiengang(value) {\n\t\t\tlet studiengang = this.$refs.studiengaenge;\n\t\t\tstudiengang.selectedIndex = (studiengang.selectedIndex + value + studiengang.options.length) % studiengang.options.length;\n\t\t\tthis.changeSelectedStudienGang(studiengang.value);\n\t\t},\n\t\tchangeSemester(value) {\n\t\t\tlet semester = this.$refs.semester;\n\t\t\tsemester.selectedIndex = (semester.selectedIndex + value + semester.options.length) % semester.options.length;\n\t\t\tthis.changeSelectedSemester(semester.value);\n\t\t},\n\t\tchangeStudienordnung(value) {\n\t\t\tlet studienordnung = this.$refs.studienordnung;\n\t\t\tlet newSelectIndex = (studienordnung.selectedIndex + value + studienordnung.options.length) % studienordnung.options.length;\n\t\t\tif(studienordnung.options[newSelectIndex].disabled){\n\t\t\t\tnewSelectIndex = (newSelectIndex + value + studienordnung.options.length) % studienordnung.options.length;\n\t\t\t}\n\t\t\tstudienordnung.selectedIndex = newSelectIndex;\n\t\t\tthis.changeSelectedStudienPlan(studienordnung.value);\n\t\t},\n\t\t\n\t\tstoreDataToLocalStorage(key,value){\n\t\t\tlocalStorage.setItem(key, value);\n\t\t},\n\t\tgetDataFromLocalStorage(key){\n\t\t\tconst value = localStorage.getItem(key);\n\t\t\treturn value;\n\t\t},\n\t\tchangeSelectedStudienSemester(studiensemester_kurzbz) {\n\t\t\tthis.$fhcApi.factory.studium.getAllStudienSemester(studiensemester_kurzbz, this.selectedStudiengang, this.selectedSemester, this.selectedStudienordnung)\n\t\t\t\t.then(data => data.data)\n\t\t\t\t.then(res => {\n\t\t\t\t\tthis.extractPropertyValues(res);\n\t\t\t\t})\n\t\t},\n\t\tchangeSelectedStudienGang(studiengang_kz) {\n\t\t\tthis.$fhcApi.factory.studium.getAllStudienSemester(this.selectedStudiensemester, studiengang_kz, this.selectedSemester, this.selectedStudienordnung)\n\t\t\t\t.then(data => data.data)\n\t\t\t\t.then(res => {\n\t\t\t\t\tthis.extractPropertyValues(res);\n\t\t\t\t})\n\t\t},\n\t\tchangeSelectedSemester(semester) {\n\t\t\tthis.$fhcApi.factory.studium.getAllStudienSemester(this.selectedStudiensemester, this.selectedStudiengang, semester, this.selectedStudienordnung)\n\t\t\t\t.then(data => data.data)\n\t\t\t\t.then(res => {\n\t\t\t\t\tthis.extractPropertyValues(res);\n\t\t\t\t})\n\t\t},\n\t\tchangeSelectedStudienPlan(studienplan_id) {\n\t\t\tthis.$fhcApi.factory.studium.getAllStudienSemester(this.selectedStudiensemester, this.selectedStudiengang, this.selectedSemester, studienplan_id)\n\t\t\t\t.then(data => data.data)\n\t\t\t\t.then(res => {\n\t\t\t\t\tthis.extractPropertyValues(res);\n\t\t\t\t})\n\t\t},\n\t\topenLvUebersicht(lehrveranstaltung) {\n\t\t\tthis.selectedLehrveranstaltung = lehrveranstaltung;\n\t\t\t//convert lehrveranstaltung properties for compatibility with LvPlan LvModal\n\t\t\tthis.selectedLehrveranstaltung.type =\"lehreinheit\";\n\t\t\tthis.selectedLehrveranstaltung.lehreinheit_id = this.selectedLehrveranstaltung.lehrveranstaltung_id;\n\t\t\tif(this.selectedLehrveranstaltung){\n\t\t\t\tVue.nextTick(()=>{\n\t\t\t\t\tthis.$refs.lvUebersicht.show();\n\t\t\t\t})\n\t\t\t}\n\t\t\t\n\t\t},\n\t\tsortStudienSemester(studienSemester){\n\t\t\tlet regex = new RegExp(/^(WS|SS)([0-9]{4})/);\n\t\t\tstudienSemester.sort((sem1,sem2)=>{\n\t\t\t\tlet [sem1Match, sem1Semester, sem1Year] = sem1.studiensemester_kurzbz.match(regex);\n\t\t\t\tlet [sem2Match, sem2Semester, sem2Year] = sem2.studiensemester_kurzbz.match(regex);\n\t\t\t\tif(sem1Year == sem2Year){\n\t\t\t\t\treturn sem1Semester > sem2Semester? -1:1;\n\t\t\t\t}\n\t\t\t\treturn sem1Year > sem2Year? -1:1;\n\t\t\t})\n\t\t},\n\t\tsetHash(val) {\n\t\t\t// TODO: make this a router param to enable history\n\t\t\tlocation.hash = val;\n\t\t},\n\t\textractPropertyValues(res){\n\t\t\tlet { studienSemester, studiengang, semester, studienplan, lehrveranstaltungen } = res;\n\t\t\tthis.sortStudienSemester(studienSemester.all);\n\t\t\tthis.studienSemester = studienSemester.all;\n\t\t\tthis.selectedStudiensemester = studienSemester.preselected.studiensemester_kurzbz;\n\n\t\t\tthis.studiengaenge = studiengang.all;\n\t\t\tthis.selectedStudiengang = studiengang.preselected?.studiengang_kz;\n\n\t\t\tthis.semester = semester.all;\n\t\t\tthis.selectedSemester = semester?.preselected;\n\n\t\t\tthis.studienOrdnung = studienplan.all;\n\t\t\tthis.selectedStudienordnung = studienplan.preselected?.studienplan_id;\n\n\t\t\tthis.lehrveranstaltungen = lehrveranstaltungen;\n\t\t\tthis.lehrveranstaltungen.sort((lv1, lv2) => {\n\t\t\t\tif (lv1.bezeichnung.toLowerCase() > lv2.bezeichnung.toLowerCase()) {\n\t\t\t\t\treturn 1;\n\t\t\t\t} else if (lv1.bezeichnung.toLowerCase() < lv2.bezeichnung.toLowerCase()) {\n\t\t\t\t\treturn -1;\n\t\t\t\t} else {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.lehrveranstaltungen.forEach((lehrveranstaltung)=>{\n\t\t\t\tlehrveranstaltung.lehrveranstaltungen.sort((lv1,lv2)=>{\n\t\t\t\t\tif (lv1.bezeichnung.toLowerCase() > lv2.bezeichnung.toLowerCase()) {\n\t\t\t\t\t\treturn 1;\n\t\t\t\t\t} else if (lv1.bezeichnung.toLowerCase() < lv2.bezeichnung.toLowerCase()) {\n\t\t\t\t\t\treturn -1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t\t},\n\t\tstudienordnungTitel(studienordnung){\n\t\t\tif(!studienordnung) return \"\";\n\t\t\treturn `${studienordnung?.bezeichnung}-${studienordnung?.orgform_kurzbz} ( ${studienordnung?.orgform_bezeichnung}, ${studienordnung?.sprache} )`;\n\t\t},\n\t\tstudiengangTitel(studiengang) {\n\t\t\tif (!studiengang) return \"\";\n\t\t\treturn `${studiengang?.kurzbzlang} (${studiengang?.bezeichnung})`;\n\t\t},\n\t\tstudiensemesterTitel(studiensemester){\n\t\t\tif (!studiensemester) return \"\";\n\t\t\tlet studiensemester_regex = new RegExp(/^(WS|SS)([0-9]{4})/);\n\t\t\tlet match = studiensemester.match(studiensemester_regex);\n\t\t\tswitch(match[1]){\n\t\t\t\tcase \"WS\":\n\t\t\t\t\treturn `Wintersemester ${match[2]}`;\n\t\t\t\tcase \"SS\":\n\t\t\t\t\treturn `Sommersemester ${match[2]}`;\t\n\t\t\t\tdefault:\n\t\t\t\t\treturn `${studiensemester}`;\n\t\t\t}\n\t\t}\n\t},\n\n\tcomputed:{\n\t\tselectedLehrveranstaltungTitel(){\n\t\t\tconst studiengang = this.studiengaenge.find((studiengang) => studiengang.studiengang_kz == this.selectedStudiengang);\n\t\t\treturn `${this.selectedLehrveranstaltung?.bezeichnung} ${this.selectedLehrveranstaltung?.lehrform_kurzbz} / ${studiengang.kurzbzlang}-${this.selectedSemester} ${this.selectedLehrveranstaltung?.orgform_kurzbz} (${this.selectedStudiensemester})`;\n\t\t},\n\t\tcomputedStudienOrdnung(){\n\t\t\tif(!this.studienOrdnung) return null;\n\t\t\treturn Object.values(this.studienOrdnung).reduce((carry, item)=>{\n\t\t\t\tif(!carry[item.bezeichnung]){\n\t\t\t\t\tcarry[item.bezeichnung] = [];\n\t\t\t\t}\n\t\t\t\tcarry[item.bezeichnung].push(item);\n\t\t\t\treturn carry;\n\t\t\t},{});\n\t\t},\n\t\tcomputedStudienOrdnungSelectValues() {\n\t\t\tif (!this.computedStudienOrdnung) return null;\n\t\t\tlet result = [];\n\t\t\tObject.entries(this.computedStudienOrdnung).forEach(([key,value])=>{\n\t\t\t\tresult.push({\n\t\t\t\t\tbezeichnung: `Studienordnung: ${key}`,\n\t\t\t\t\tdisabled: true,\n\t\t\t\t});\n\t\t\t\tvalue.forEach((studienplan)=>{\n\t\t\t\t\tresult.push({\n\t\t\t\t\t\tstudienplan:studienplan,\n\t\t\t\t\t\tdiabled: false,\n\t\t\t\t\t\tbezeichnung: `${studienplan?.bezeichnung}-${studienplan?.orgform_kurzbz} ( ${studienplan?.orgform_bezeichnung}, ${studienplan?.sprache} )`\n\t\t\t\t\t\t\t\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t});\n\t\t\treturn result;\n\t\t},\n\t},\n\t\n\tcreated(){\n\n\t\tconst studiensemester = this.getDataFromLocalStorage(\"sudiensemester\") ?? undefined;\n\t\tconst studiengang = JSON.parse(this.getDataFromLocalStorage(\"studiengang\")) ?? undefined;\n\t\tconst semester = this.getDataFromLocalStorage(\"semester\") ?? undefined;\n\t\tconst studienordnung = JSON.parse(this.getDataFromLocalStorage(\"studienordnung\")) ?? undefined;\n\n\t\t// only fetch default data if no data is stored in the local storage\n\t\t\n\t\tthis.$fhcApi.factory.studium.getAllStudienSemester(studiensemester, studiengang, semester, studienordnung)\n\t\t.then(data => data.data)\n\t\t.then(res => {\n\t\t\tthis.extractPropertyValues(res);\n\t\t})\n\n\t},\n\ttemplate: `\n\t
    \n\t

    Studium

    \n\t
    \n\t\n\t\t\n\t\n\t
    \n\t\t
    \n\t\t
    Studiensemester:
    \n\t\t
    \n\t\t\t\n\t\t\t\n\t\t\t\n\t\t
    \n\t\t
    \n\n\t\t
    \n\t\t
    Studiengang:
    \n\t\t
    \n\t\t\t\n\t\t\t\n\t\t\t\n\t\t
    \n\t\t
    \n\n\t\t
    \n\t\t
    Semester:
    \n\t\t
    \n\t\t\t\n\t\t\t\n\t\t\t\n\t\t
    \n\t\t
    \n\n\t\t
    \n\t\t
    Studienordnung:
    \n\t\t
    \n\t\t\t\n\t\t\t\n\t\t\t\n\t\t
    \n\t\t
    \n\t
    \n\n\t
    \n\n\t
    \n\t\n\t
    \n\n\n\t
    \n\t\n\t`\n};","\nexport default {\n\t\t\n\tloadRenderers() {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/RendererLoader/GetRenderers',\n\t\t\tparams: {\n\t\t\t}\n\t\t};\n\t},\n}","/**\n * Copyright (C) 2025 fhcomplete.org\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\nexport default {\n\tinfo(app, path) {\n\t\treturn {\n\t\t\tmethod: 'post',\n\t\t\turl: '/api/frontend/v1/RouteInfo/info',\n\t\t\tparams: {\n\t\t\t\tapp: app,\n\t\t\t\tpath: path\n\t\t\t}\n\t\t};\n\t}\n};","import FhcDashboard from '../../components/Dashboard/Dashboard.js';\nimport PluginsPhrasen from '../../plugins/Phrasen.js';\nimport Theme from '../../plugins/Theme.js';\nimport contrast from '../../directives/contrast.js';\nimport {setScrollbarWidth} from \"../../helpers/CssVarCalcHelpers.js\";\nimport LvPlan from \"../../components/Cis/LvPlan/Lehrveranstaltung.js\";\nimport MyLvPlan from \"../../components/Cis/LvPlan/Personal.js\";\nimport MylvStudent from \"../../components/Cis/Mylv/Student.js\";\nimport Profil from \"../../components/Cis/Profil/Profil.js\";\nimport Raumsuche from \"../../components/Cis/Raumsuche/Raumsuche.js\";\nimport CmsNews from \"../../components/Cis/Cms/News.js\";\nimport CmsContent from \"../../components/Cis/Cms/Content.js\";\nimport Info from \"../../components/Cis/Mylv/Semester/Studiengang/Lv/Info.js\";\nimport RoomInformation, {DEFAULT_MODE_RAUMINFO} from \"../../components/Cis/Mylv/RoomInformation.js\";\nimport AbgabetoolStudent from \"../../components/Cis/Abgabetool/AbgabetoolStudent.js\";\nimport AbgabetoolMitarbeiter from \"../../components/Cis/Abgabetool/AbgabetoolMitarbeiter.js\";\nimport AbgabetoolAssistenz from \"../../components/Cis/Abgabetool/AbgabetoolAssistenz.js\";\nimport DeadlineOverview from \"../../components/Cis/Abgabetool/DeadlineOverview.js\";\nimport Studium from \"../../components/Cis/Studium/Studium.js\";\n\nimport ApiRenderers from '../../api/factory/renderers.js';\nimport ApiRouteInfo from '../../api/factory/routeinfo.js';\nimport {capitalize} from \"../../helpers/StringHelpers.js\";\n\nconst ciPath = FHC_JS_DATA_STORAGE_OBJECT.app_root.replace(/(https:|)(^|\\/\\/)(.*?\\/)/g, '') + FHC_JS_DATA_STORAGE_OBJECT.ci_router;\n\nconst router = VueRouter.createRouter({\n\thistory: VueRouter.createWebHistory(`/${ciPath}`),\n\troutes: [\n\t\t{\n\t\t\tpath: `/Cis/Studium`,\n\t\t\tname: 'Studium',\n\t\t\tcomponent: Studium,\n\t\t\tprops: true\n\t\t},\n\t\t{\n\t\t\tpath: `/Cis/Profil/View/:uid`,\n\t\t\tname: 'ProfilView',\n\t\t\tcomponent: Profil,\n\t\t\tprops: true\n\t\t},\n\t\t{\n\t\t\tpath: `/Cis/Profil`,\n\t\t\tname: 'Profil',\n\t\t\tcomponent: Profil,\n\t\t\tprops: true\n\t\t},\n\t\t{\n\t\t\tpath: `/Cis/Abgabetool/Student/:student_uid_prop?`,\n\t\t\tname: 'AbgabetoolStudent',\n\t\t\tcomponent: AbgabetoolStudent,\n\t\t\tprops: true\n\t\t},\n\t\t{\n\t\t\tpath: `/Cis/Abgabetool/Mitarbeiter`,\n\t\t\tname: 'AbgabetoolMitarbeiter',\n\t\t\tcomponent: AbgabetoolMitarbeiter,\n\t\t\tprops: true\n\t\t},\n\t\t{\n\t\t\tpath: `/Cis/Abgabetool/Assistenz/:stg_kz_prop?`,\n\t\t\tname: 'AbgabetoolAssistenz',\n\t\t\tcomponent: AbgabetoolAssistenz,\n\t\t\tprops: true\n\t\t},\n\t\t{\n\t\t\tpath: `/Cis/Abgabetool/Deadlines/:person_uid_prop?`,\n\t\t\tname: 'DeadlineOverview',\n\t\t\tcomponent: DeadlineOverview,\n\t\t\tprops: true\n\t\t},\n\t\t{\n\t\t\tpath: `/Cis/Raumsuche`,\n\t\t\tname: 'Raumsuche',\n\t\t\tcomponent: Raumsuche,\n\t\t\tprops: true\n\t\t},\n\t\t// Redirect old links to new format\n\t\t{\n\t\t\tpath: \"/CisVue/Cms/getRoomInformation/:ort_kurzbz\",\n\t\t\tname: \"RoomInformationOld\",\n\t\t\tcomponent: RoomInformation,\n\t\t\tredirect: (to) => {\n\t\t\t\treturn { // redirect to longer Rauminfo url and map params\n\t\t\t\t\tname: \"RoomInformation\",\n\t\t\t\t\tparams: { // in this case always populate other params since they are not optional\n\t\t\t\t\t\tort_kurzbz: to.params.ort_kurzbz,\n\t\t\t\t\t\tmode: DEFAULT_MODE_RAUMINFO,\n\t\t\t\t\t\tfocus_date: new Date().toISOString().split(\"T\")[0]\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tpath: `/CisVue/Cms/getRoomInformation/:mode/:focus_date/:ort_kurzbz`,\n\t\t\tname: 'RoomInformation',\n\t\t\tcomponent: RoomInformation,\n\t\t\tprops: (route) => { // validate and set mode/focus date if for some reason missing\n\t\t\t\tconst validModes = [\"Month\", \"Week\", \"Day\"];\n\n\t\t\t\t// check mode string\n\t\t\t\tconst mode = route.params.mode &&\n\t\t\t\tvalidModes.includes(route.params.mode.charAt(0).toUpperCase() + route.params.mode.slice(1).toLowerCase())\n\t\t\t\t\t? route.params.mode.charAt(0).toUpperCase() + route.params.mode.slice(1).toLowerCase()\n\t\t\t\t\t: DEFAULT_MODE_RAUMINFO;\n\n\t\t\t\t// default to today date if not provided\n\t\t\t\tconst d = new Date(route.params.focus_date)\n\t\t\t\tconst focus_date = !isNaN(d) ? route.params.focus_date : new Date().toISOString().split(\"T\")[0];\n\n\t\t\t\t// for consistency reasons format the props into one object but actually use a new name to we dont collide with\n\t\t\t\t// existing viewData declaration written from codeigniter 3 into routerview tag\n\t\t\t\treturn {\n\t\t\t\t\tpropsViewData: {\n\t\t\t\t\t\tmode,\n\t\t\t\t\t\tfocus_date,\n\t\t\t\t\t\tort_kurzbz: route.params.ort_kurzbz\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t},\n\t\t\tbeforeEnter: (to, from, next) => {\n\t\t\t\t// missing mode or focus_date -> set defaults\n\t\t\t\tif (!to.params.mode || !to.params.focus_date) {\n\t\t\t\t\tnext({\n\t\t\t\t\t\tname: \"RoomInformation\",\n\t\t\t\t\t\tparams: {\n\t\t\t\t\t\t\tmode: to.params.mode || DEFAULT_MODE_RAUMINFO,\n\t\t\t\t\t\t\tfocus_date: to.params.focus_date || new Date().toISOString().split(\"T\")[0],\n\t\t\t\t\t\t\tort_kurzbz: route.params.ort_kurzbz\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tnext();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tpath: `/CisVue/Cms/Content/:content_id`,\n\t\t\tname: 'Content',\n\t\t\tcomponent: CmsContent,\n\t\t\tprops: true\n\t\t},\n\t\t{\n\t\t\tpath: `/CisVue/Cms/News`,\n\t\t\tname: 'News',\n\t\t\tcomponent: CmsNews,\n\t\t\tprops: true\n\t\t},\n\t\t{\n\t\t\tpath: `/Cis/MyLv/:studiensemester?`,\n\t\t\tname: 'MyLv',\n\t\t\tcomponent: MylvStudent,\n\t\t\tprops: true,\n\t\t},\n\t\t{\n\t\t\tpath: `/Cis/MyLv/Info/:studien_semester/:lehrveranstaltung_id`,\n\t\t\tname: 'LvInfo',\n\t\t\tcomponent: Info,\n\t\t\tprops: true\n\t\t},\n\t\t// Redirect old links to new format\n\t\t{\n\t\t\t// only trigger on first param being numeric to avoid paths like \"LvPlan/Month\" entering here\n\t\t\tpath: \"/Cis/LvPlan/:lv_id(\\\\d+)\", \n\t\t\tname: \"LvPlanOld\",\n\t\t\tcomponent: LvPlan,\n\t\t\tredirect(to) {\n\t\t\t\tconst route = Vue.unref(router.currentRoute);\n\t\t\t\tconst { mode, focus_date } = route.params; // keep mode and focus_date if available\n\t\t\t\treturn { // redirect to longer LvPlan url and map params\n\t\t\t\t\tname: \"LvPlan\",\n\t\t\t\t\tparams: {\n\t\t\t\t\t\tmode,\n\t\t\t\t\t\tfocus_date,\n\t\t\t\t\t\tlv_id: to.params.lv_id\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tpath: `/Cis/LvPlan/:mode?/:focus_date?/:lv_id?`,\n\t\t\tname: 'LvPlan',\n\t\t\tcomponent: LvPlan,\n\t\t\tprops(route) {\n\t\t\t\treturn {\n\t\t\t\t\tpropsViewData: route.params\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tpath: `/Cis/MyLvPlan/:mode?/:focus_date?`,\n\t\t\tname: 'MyLvPlan',\n\t\t\tcomponent: MyLvPlan,\n\t\t\tprops(route) {\n\t\t\t\treturn {\n\t\t\t\t\tpropsViewData: route.params\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tpath: `/Cis4`,\n\t\t\tname: 'Cis4',\n\t\t\tcomponent: FhcDashboard,\n\t\t\tprops: {dashboard: 'CIS'},\n\t\t},\n\t\t{\n\t\t\tpath: `/`,\n\t\t\tname: 'FhcDashboard',\n\t\t\tcomponent: FhcDashboard,\n\t\t\tprops: {dashboard: 'CIS'},\n\t\t},\n\t\t{\n\t\t\tpath: '/:pathMatch(.*)*',\n\t\t\tname: 'Fallback',\n\t\t\tcomponent: FhcDashboard,\n\t\t\tprops: {dashboard: 'CIS'},\n\t\t\tredirect: () => {\n\t\t\t\treturn {\n\t\t\t\t\tname: \"Cis4\",\n\t\t\t\t\tparams: {\n\t\t\t\t\t\tdashboard: 'CIS'\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t},\n\t\t},\n\t]\n})\n\nconst app = Vue.createApp({\n\tname: 'FhcApp',\n\tdata: () => ({\n\t\tappSideMenuEntries: {},\n\t\trenderers: null,\n\t}),\n\tcomponents: {},\n\tcomputed: {\n\t\tisMobile() {\n\t\t\tconst smallScreen = window.matchMedia(\"(max-width: 767px)\").matches;\n\t\t\tconst touchCapable = (\"ontouchstart\" in window) || navigator.maxTouchPoints > 0;\n\t\t\treturn smallScreen;// && touchCapable;\n\t\t}\t\n\t},\n\tprovide() {\n\t\treturn { // provide injectable & watchable language property\n\t\t\tlanguage: Vue.computed(() => this.$p.user_language),\n\t\t\trenderers: Vue.computed(() => this.renderers),\n\t\t\tisMobile: this.isMobile\n\t\t}\t\n\t},\n\tmethods: {\n\t\tisInternalRoute(href) {\n\t\t\tconst internalBase = window.location.origin\n\t\t\treturn href.startsWith(internalBase);\n\t\t},\n\t\thandleClick(event) {\n\t\t\tconst target = event.target.closest('a');\n\n\t\t\tif(target?.id == 'skiplink') return\n\t\t\tif (target && this.isInternalRoute(target.href)) {\n\t\t\t\tconst url = new URL(target.href)\n\t\t\t\t\n\t\t\t\tconst path = url.pathname\n\t\t\t\tconst base = this.$router.options.history.base\n\t\t\t\tconst route = path.replace(base, '') || '/'\n\n\t\t\t\t// let click event propagate normally if we dont route internally\n\t\t\t\tconst res = this.$router.resolve(route)\n\t\t\t\tif(!res?.matched?.length || res.name === 'Fallback') return\n\t\t\t\t\n\t\t\t\tevent.preventDefault(); // Prevent browser navigation\n\t\t\t\t\n\t\t\t\tif(this.isMobile) { // toggle the menu\n\t\t\t\t\tconst navMain = document.getElementById('nav-main');\n\t\t\t\t\t// fix unwanted toggle from off to on for some links on mobile\n\t\t\t\t\tif(navMain.classList.contains('show')){\n\t\t\t\t\t\tdocument.getElementById('nav-main-btn').click();\n\t\t\t\t\t} \n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.$router.push(route);\n\t\t\t\t\n\t\t\t}\n\t\t}\n\t},\n\tasync created(){\n\t\t\n\t\tawait this.$api\n\t\t\t.call(ApiRenderers.loadRenderers())\n\t\t\t.then(res => res.data)\n\t\t\t.then(data => {\n\t\t\t\tfor (let rendertype of Object.keys(data)) {\n\t\t\t\t\tlet modalTitle = null;\n\t\t\t\t\tlet modalContent = null;\n\t\t\t\t\tlet calendarEvent = null;\n\t\t\t\t\tif (data[rendertype].modalTitle)\n\t\t\t\t\t\tmodalTitle = Vue.markRaw(Vue.defineAsyncComponent(() => import(data[rendertype].modalTitle)));\n\t\t\t\t\tif (data[rendertype].modalContent) \t\n\t\t\t\t\t\tmodalContent = Vue.markRaw(Vue.defineAsyncComponent(() => import(data[rendertype].modalContent)));\n\t\t\t\t\tif (data[rendertype].calendarEvent) \t\n\t\t\t\t\t\tcalendarEvent = Vue.markRaw(Vue.defineAsyncComponent(() => import(data[rendertype].calendarEvent)));\n\n\t\t\t\t\tif (data[rendertype].calendarEventStyles){\n\t\t\t\t\t\tvar head = document.head;\n\t\t\t\t\t\tif(!head.querySelector(`link[href=\"${data[rendertype].calendarEventStyles}\"]`)){\n\t\t\t\t\t\t\tvar link = document.createElement(\"link\");\n\t\t\t\t\t\t\tlink.type = \"text/css\";\n\t\t\t\t\t\t\tlink.rel = \"stylesheet\";\n\t\t\t\t\t\t\tlink.href = data[rendertype].calendarEventStyles;\n\t\t\t\t\t\t\thead.appendChild(link);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif(this.renderers === null) {\n\t\t\t\t\t\tthis.renderers = {};\n\t\t\t\t\t}\n\t\t\t\t\tif (!this.renderers[rendertype]) {\n\t\t\t\t\t\tthis.renderers[rendertype] = {}\n\t\t\t\t\t}\n\t\t\t\t\tthis.renderers[rendertype].modalTitle = modalTitle;\n\t\t\t\t\tthis.renderers[rendertype].modalContent = modalContent;\n\t\t\t\t\tthis.renderers[rendertype].calendarEvent = calendarEvent;\n\t\t\t\t}\n\t\t\t});\n\t},\n\tmounted() {\n\t\tdocument.addEventListener('click', this.handleClick);\n\t\t\n\t},\n\tbeforeUnmount() {\n\t\tdocument.removeEventListener('click', this.handleClick);\n\t},\n});\n\n// kind of a bandaid for bad css on some pages to avoid horizontal scroll\nsetScrollbarWidth();\napp.config.globalProperties.$capitalize = capitalize;\napp.use(router);\napp.use(primevue.config.default, {\n\tzIndex: {\n\t\toverlay: 9000,\n\t\ttooltip: 8000\n\t}\n})\napp.directive('tooltip', primevue.tooltip);\napp.use(PluginsPhrasen);\napp.use(Theme);\napp.directive('contrast', contrast);\napp.mount('#fhccontent');\n\nrouter.afterEach((to, from, failure) => {\n\tapp.config.globalProperties.$api.call(ApiRouteInfo.info('cis4', to.fullPath));\n});","// Create a temporary div element, set styles to ensure it's scrollable and off-screen, get scrollbar width from that\nfunction getScrollbarWidth() {\n\tconst div = document.createElement('div');\n\n\tdiv.style.position = 'absolute';\n\tdiv.style.top = '-9999px';\n\tdiv.style.width = '100px';\n\tdiv.style.height = '100px';\n\tdiv.style.overflow = 'scroll';\n\n\tdocument.body.appendChild(div);\n\tconst scrollbarWidth = div.offsetWidth - div.clientWidth;\n\tdocument.body.removeChild(div);\n\n\treturn scrollbarWidth;\n}\n\n// Detect the browser and set a CSS variable for the scrollbar width since chrome scrollbars mess with 100vw/vh css\nexport function setScrollbarWidth() {\n\tconst isChromium = /Chrome/.test(navigator.userAgent);\n\tconst isFirefox = /Firefox/.test(navigator.userAgent);\n\n\tif (isChromium) {\n\t\tconst width = getScrollbarWidth() + 'px';\n\t\tdocument.body.style.setProperty('--scrollbar-width', width); // Set the value for Chrome\n\t} else if (isFirefox) {\n\t\tdocument.body.style.setProperty('--scrollbar-width', '0px'); // Set the value for Firefox or adjust as needed\n\t}\n}","export function capitalize(string) {\n\tif (!string) return '';\n\treturn string[0].toUpperCase() + string.slice(1);\n}"],"names":["BsModal","name","data","modal","fullscreen","props","backdrop","type","Boolean","String","default","validator","value","includes","focus","keyboard","noCloseBtn","dialogClass","Array","Object","headerClass","bodyClass","footerClass","allowFullscreenExpand","emits","methods","dispose","this","handleUpdate","hide","show","relatedTarget","toggle","toggleFullscreen","$emit","mounted","$refs","bootstrap","Modal","popup","body","options","title","footer","slots","undefined","includedPrimevue","primevue","Promise","resolve","reject","instance","Vue","createApp","setup","h","class","ref","unmount","beforeUnmount","result","unmounted","wrapper","parentElement","removeChild","document","createElement","use","config","zIndex","overlay","then","Phrasen$1","Phrasen","mount","appendChild","template","Alert","components","mixins","onHideBsModal","Function","onHiddenBsModal","onHidePreventedBsModal","onShowBsModal","onShownBsModal","modalContainer","msg","bind","BsConfirm$1","BsAlert","GridItem","inject","item","active","dragAction","dragging","computed","registerDragAction","evt","target","hasAttribute","getAttribute","parent","closest","tryDragStart","touchDragEnd","touchStart","event","touchMove","preventDefault","GridLogic","constructor","w","grid","isFreeSlot","x","y","i","getMaxY","reduce","acc","getFreeSlots","freeSlots","biggestY","totalSpaces","length","Math","floor","push","add","prefer","occupiers","getItemsInFrame","frame","forEach","f","index","max","intermGrid","possiblities","tryMoving","bestOption","sort","a","b","cost","moves","v","move","currItem","getItemFrame","remove","console","error","place","pinned","originalFrame","isArray","some","occupiersData","map","occupier","occupiersFrame","flat","replaceUpdate","newOccupierFrames","occ","shift","getSingleFramePosition","updates","resize","newPoss","possiblity","p","directions","weight","dir","res","tryMovingInDirection","filter","amount","targetframe","unshift","clearWeights","indexOf","j","debug","DropGrid","cols","Number","items","itemsSetup","resizeLimit","marginForExtraRow","additionalRow","clientX","clientY","mode","dragGrid","permUpdates","positionUpdates","fixedPositionUpdates","draggedOffset","draggedItem","draggedNode","reorderedItems","clonedWidget","sectionName","additionalRowComputed","get","set","items_hashmap","needsReordering","rearrangedPosition","widget","widgetid","pop","items_placeholders","placeholders","col_max","rows_max","rows","occupied","keys","current_item","max_x","max_y","occupied_y","occupied_x","placeholder","id","padStart","placedItems_withPlaceholders","placedItems","gridStyle","addH","indexedItems","prePlacedItems","mappedPlacedItems","height_diff","width_diff","temporaryResizeItems","newItem","resizeOverlay","blank","showEmptyTileHover","widgetSetup","widgetsSetup","ele","widget_id","watch","dragCancel","handler","immediate","updated","createNewGrid","deep","toggleDraggedItemOverlay","condition","firstElementChild","classList","containerRect","container","getBoundingClientRect","clonedWidgetRect","desiredTop","desiredLeft","minTop","maxTop","height","minLeft","maxLeft","width","constrainedTop","min","constrainedLeft","style","top","left","sortedItems","firstFreeSlot","targetX","targetW","convertGridResultToUpdate","input","output","baseArray","mouseLeave","updateCursor","rect","touches","gridX","clientWidth","gridY","clientHeight","_dragStart","dataTransfer","setDragImage","dropEffect","effectAllowed","startMove","setTimeout","clone","cloneNode","querySelector","removeProperty","startResize","dragOver","checkPinnedWidgetAnimation","checkWidgetSizeLimitAnimation","removeWidgetClones","dragEnd","getElementById","from","getElementsByClassName","_updateFixedPositions","additionalUpdates","emptyTileClicked","updateCursorOnMouseMove","itemAtPosition","pinNode","contains","draggedItemSetup","draggedItemMaxWidth","draggedItemMinWidth","draggedItemMaxHeight","draggedItemMinHeight","draggedItemNode","width_after_resize","height_after_resize","widgetClones","mouseDown","mouseUp","__widgets","__widgetsStarted","__path","FHC_JS_DATA_STORAGE_OBJECT","app_root","ci_router","CachedWidgetLoader","getWidget","loadWidget","axios","params","retval","catch","response","setPath","path","DashboardItem","HeightTransition","onEnter","el","done","scrollHeight","onLeave","component","arguments","tmpConfig","isLoading","hasConfig","sharedData","maxHeight","maxWidth","prototype","toString","call","minHeight","minWidth","isResizeable","isPinned","ready","unpin","editMode","item_data","pinItem","getWidgetC4Link","cis4link","handleShowBsModal","handleHideBsModal","e","startDrag","dragHandle","resizeHandle","openConfig","setConfig","changeConfig","sendChangeConfig","changeConfigManually","k","created","import","file","$options","WidgetIcon","required","src","DashboardSection","adminMode","configOpened","gridWidth","gridHeight","provide","editModeIsActive","computedWidgetsSetup","getSectionStyle","widgets","reorder","sectionNameTranslation","$p","t","showSectionInformation","handleConfigOpened","handleConfigClosed","checkResizeLimit","minmaxW","minmaxH","removeWidget","revert","custom","BsConfirm","update","hidden","updatePreset","saveConfig","payload","updatePositions","self","cont","parseInt","window","getComputedStyle","getPropertyValue","addEventListener","DashboardWidgetPicker","callbacks","close","pick","ObjectUtils","mergeDeep","objects","isObject","obj","prev","key","pVal","oVal","concat","ApiDashboard","getViewData","method","url","FhcDashboard","dashboard","viewData","uid","timezone","sections","viewDataInternal","apiurl","widgetAdd","section_name","db","JSON","parse","err","widgetpicker","Date","valueOf","loading","section","post","funktion_kurzbz","newId","splice","alert","widgetUpdate","wid","prop","_x","_y","_w","_h","preset","widgetRemove","loadCategory","section1","section2","beforeMount","$api","search","searchsettings","$fhcApi","searchAdvanced","searchdummy","phrasen$2","category","setLanguage","categories","language","getLanguage","getActiveDbLanguages","navigation","getHeader","navigation_page","getMenu","filter$1","saveCustomFilter","wsParams","filterUniqueId","filterType","customFilterName","removeCustomFilter","filterId","applyFilterFields","filterFields","addFilterField","filterField","removeFilterField","getFilterById","getFilter","studstatus","abmeldung","getDetails","antrag_id","prestudent_id","create","stdsem","grund","studiensemester","errorHandling","cancel","allSettled","antrag","studierendenantrag_id","errorHeader","unterbrechung","datum_wiedereinstieg","attachment","wiederholung","getLvs","saveLvs","forbiddenLvs","mandatoryLvs","leitung","getStgs","getAntraege","getHistory","getPrestudents","query","signal","timeout","approve","reopen","pause","unpause","object","approveObjection","denyObjection","profil","getView","fotoSperre","isStudent","isMitarbeiter","getZustellAdresse","getZustellKontakt","getGemeinden","nation","zip","getAllNationen","profilUpdate","getStatus","getTopic","acceptProfilRequest","profil_update_id","status_message","topic","requested_change","denyProfilRequest","insertFile","dms","replace","getProfilRequestFiles","requestID","selectProfilRequest","insertProfilRequest","fileID","updateProfilRequest","ID","deleteProfilRequest","lvPlan","getRoomInfo","ort_kurzbz","start_date","end_date","getStunden","getOrtReservierungen","getLvPlanReservierungen","getLehreinheitStudiensemester","lehreinheit_id","studiensemesterDateInterval","date","LvPlanEvents","lv_id","stv","verband","favorites","students","studiensemester_kurzbz","encodeURIComponent","getUri","prestudent","person","person_id","relative_path","getStg","setStg","studiengang_kz","konto","tabulatorConfig","ajaxURL","ajaxParams","modelValue","only_open","studiengang_kz_intern","stg_kz","ajaxRequestFunc","ajaxResponse","checkDoubles","form","confirmErrorHandler","insert","counter","edit","delete","buchungsnr","getBuchungstypen","group","getGruppen","deleteGroup","kontakt","getAdressen","addNewAddress","loadAddress","address_id","updateAddress","deleteAddress","getPlaces","plz","getFirmen","searchString","getNations","getAdressentypen","getBankverbindung","addNewBankverbindung","loadBankverbindung","bankverbindung_id","updateBankverbindung","deleteBankverbindung","getKontakte","addNewContact","loadContact","kontakt_id","updateContact","deleteContact","getStandorteByFirma","getKontakttypen","updatePrestudent","getBezeichnungZGV","getBezeichnungMZgv","getBezeichnungDZgv","getAusbildung","getAufmerksamdurch","getBerufstaetigkeit","getTypenStg","getBisstandort","getHistoryPrestudent","getMaxSem","studiengang_kzs","advanceStatus","status_kurzbz","ausbildungssemester","confirmStatus","isLastStatus","deleteStatus","getLastBismeldestichtag","getHistoryPrestudents","status","insertStatus","loadStatus","updateStatus","getStudienplaene","getStudiengang","getStatusgruende","getStati","addStudent","changeStatus","getStatusarray","details","save","exam","getPruefungen","loadPruefung","pruefung_id","getTypenPruefungen","getAllLehreinheiten","getLvsByStudent","getLvsandLesByStudent","semester","getLvsAndMas","getMitarbeiterLv","getNoten","checkZeugnisnoteLv","addPruefung","updatePruefung","deletePruefung","abschlusspruefung","getAbschlusspruefung","addNewAbschlusspruefung","loadAbschlusspruefung","updateAbschlusspruefung","deleteAbschlusspruefung","getTypenAbschlusspruefung","getTypenAntritte","getBeurteilungen","getAkadGrade","getTypStudiengang","getMitarbeiter","getPruefer","checkForExistingExams","uids","grades","list","getCertificate","getTeacherProposal","getRepeaterGrades","updateCertificate","lehrveranstaltung_id","student_uid","note","lehrveranstaltung_bezeichnung","deleteCertificate","copyTeacherProposalToCertificate","copyRepeaterGradeToCertificate","studierendenantrag_lehrveranstaltung_id","lv_bezeichnung","getGradeFromPoints","points","manualErrorHandling","mobility","getMobilitaeten","getProgramsMobility","addNewMobility","loadMobility","bisio_id","updateMobility","deleteMobility","getLVList","getPurposes","getSupports","getListPurposes","getListSupports","deleteMobilityPurpose","addMobilityPurpose","deleteMobilitySupport","addMobilitySupport","archiv","getArchivVorlagen","archive","archiveSigned","akte_id","documents","getDocumentsUnaccepted","getDocumentsAccepted","deleteZuordnung","dokument_kurzbz","createZuordnung","loadAkte","getDoktypen","updateFile","deleteFile","uploadFile","exemptions","getAnrechnungen","getLehrveranstaltungen","getBegruendungen","getLvsKompatibel","getLektoren","addNewAnrechnung","loadAnrechnung","anrechnung_id","editAnrechnung","deleteAnrechnung","jointstudies","getStudies","getTypenMobility","getStudiensemester","getStudyprograms","getListPartner","getStatiPrestudent","loadStudy","insertStudy","updateStudy","deleteStudy","courselist","getCourselist","group_consecutiveHours","dbStundenplanTable","configStudent","configStudents","notiz","getNotizen","getUid","addNewNotiz","formData","loadNotiz","notiz_id","loadDokumente","deleteNotiz","type_id","updateNotiz","isBerechtigt","betriebsmittel","getAllBetriebsmittel","addNewBetriebsmittel","loadBetriebsmittel","betriebsmittelperson_id","updateBetriebsmittel","deleteBetriebsmittel","getTypenBetriebsmittel","loadInventarliste","checkperson","updatePersonUnrulyStatus","unrulyParam","unruly","filterPerson","base","ort","getContentID","ort_kurbz","getRooms","datum","von","bis","typ","personenanzahl","getRoomTypes","cms","content","content_id","version","sprache","sichtbar","getNews","page","page_size","news","limit","getNewsRowCount","getNewsExtra","lehre","getStudentenMail","getLvInfo","getStudentPruefungen","addons","getLvMenu","lvid","messages","getMessages","size","getVorlagen","getMsgVarsLoggedInUser","getMessageVarsPerson","getMsgVarsPrestudent","getPersonId","getDataVorlage","vorlage_kurzbz","getNameOfDefaultRecipient","getPreviewText","getReplyData","messageId","sendMessageFromModalContext","sendMessage","deleteMessage","vorlagen","getVorlagenByLoggedInUser","studium","getAllStudienSemester","studiengang","studienplan","getStudiengaengeForStudienSemester","getStudienplaeneBySemester","getLvPlanForStudiensemester","getLvEvaluierungInfo","FhcApiFactory","phrasen","bookmark","getBookmarks","bookmark_id","tag","ampeln","open","all","confirm","ampel_id","studiengangInformation","getStudiengangByKz","menu","authinfo","getAuthUID","getAuthInfo","getAll","OldFhcApi","install","app","globalProperties","factory","warn","addEndpoints","_get_config","uri","TypeError","clearValidation","setFeedback","_clean_return_value","meta","fhcApiAxios","baseURL","interceptors","request","FormData","values","every","FileList","File","newData","entries","nd","append","jsondata","stringify","errors","_defaultErrorHandlers","code","handled","$fhcAlert","alertDefault","message","responseURL","alertError","validation","apply","general","php","filename","line","backtrace","function","severity","alertSystemError","exception","heading","sql","join","auth","controller","required_permissions","FhcApiFactoryWrapper","factorypart","root","defineProperty","noWarn","CORE_REST_CLIENT_ERROR","CORE_REST_CLIENT_RETVAL","CoreRESTClient","wsURL","wsParameters","axiosParameters","_axiosCall","isSuccess","hasOwnProperty","isError","hasData","trim","getData","getError","getErrorCode","_generateRouterURI","_printDebug","parameters","errorThrown","axiosCallObj","helperAppContainer","helperApp","PvToast","PvConfirm","mailToUrl","slotProps","systemerror_mailto","called_path","called_method","detail","openMessagecard","Collapse","getOrCreateInstance","showmaillink","PvConfig","PvConfirmationService","helperAppInstance","FhcAlert","FhcPhrasen","alertSuccess","toast","summary","life","alertInfo","alertWarning","confirmDelete","$confirm","require","header","acceptLabel","acceptClass","rejectLabel","rejectClass","accept","sticky","html","alertMultiple","messageArray","handleSystemError","toLowerCase","errMsg","toUpperCase","stack","handleSystemMessage","resetFormValidation","Event","querySelectorAll","dispatchEvent","handleFormValidation","nodeType","Node","ELEMENT_NODE","notFound","CustomEvent","arr","PluginsApi","_send_array_or_object","func","errs","DEFAULT_ERROR_CONFIG","success","fail","combine","async","_format_toast","_default","field","msgs","n_errors","n","get_config","clean_return_value","_merge_error_config","get_error_handler","formHandler","get_error_list","popHandleableErrors","copy","newType","newTypeCombinesType","newTypeHasHandler","errorConfig","remaining","configoverwrite","typedErrors","allowed","reason","errType","getErrorHandler","ApiPhrasen","reactive","loadingModules","user_language","user_locale","server_languages","find","LC_Time","catArray","row","phrase","text","elem","extractCategory","t_ref","split","val","match","p1","getValueForLoadedPhrase","PluginsPhrasen","cat","lang","theme_name","theme","theme_modes","modes","toggleTheme","documentElement","setAttribute","stylesheet","attributes","href","localStorage","setItem","Theme","initializeTheme","getItem","$theme","switchTheme","rgbToHex","hex","getContrastYIQ","hexcolor","substring","contrast","element","binding","bgColor","backgroundColor","rgbRegEx","RegExp","isRgb","r","g","hexColor","color","TYPE_DEFINITION","lehreinheit","dragIcon","extras","vevent","student","VALID_TYPES","isValidDragObject","substr","extra","getValidTransferData","allowedTypes","strict","getTransferData","_error","types","base_type","collection","DragAndDrop","isValidTransferData","convertToValidDragObject","converted","sorted","found","typedef","setTransferData","validDragObject","dragElements","icon","label","iconContainer","className","textContent","boxShadow","itemContainer","requestAnimationFrame","setData","eventHasTypes","bindDragEnterLeave","skipLeave","skipLeaveParent","init","globalDragenter","globalDragleave","globalDrop","removeEventListener","cleanup","wasDropped","CalDnd","vnode","arg","cancelable","bubbles","offsetX","offsetWidth","offsetY","offsetHeight","originalEvent","hitbox","pos","pageX","scrollLeft","pageY","scrollTop","modifiers","once","timestamp","prevVnode","BaseDraganddrop","directives","events","correctedEvents","backgrounds","dropAllowed","dropableEvents","draggedInternalEvent","draggedExternalEvent","targetTimestamp","targetGridEnds","shadowPreview","findIndex","previewEvent","toSpliced","correctedBackgrounds","start","end","orig","onDragstart","convertToTransferData","onDragend","onDragenter","isostart","luxon","DateTime","fromISO","setZone","local","isoend","onDragleave","onDragchange","ends","onDrop","BaseHeader","DatePicker","VueDatePicker","listLength","convertedDate","keepLocalTime","current","month","year","startOf","ts","plus","days","useLocaleWeeks","endOf","toLocaleString","localWeekYear","week","toFormat","DATE_FULL","weekStart","Info","getStartOfWeek","fromObject","setLocale","locale","fromJSDate","weekNumbers","localWeekNumber","modeOptions","btnMonth","btnWeek","btnDay","btnList","clickMode","defaultPrevented","BaseSlider","time","extrasAfter","extrasBefore","running","promiseResolve","itemsAfter","itemsBefore","styleSlider","position","transition","styleBefore","display","right","styleAfter","prevPage","slidePages","nextPage","newTarget","endSlide","clickListeners","saveAddClickListener","source","listener","stopPropagation","customEvent","CalClick","finalEvent","FhcCalendar$1","timeGrid","draggableEvents","hasDragoverFunc","onDragover","now","showBtns","internalView","internalDate","modalEvent","convertedEvents","convertedBackgrounds","bg","isInteger","fromMillis","zone","sDate","cDate","cMode","sMode","o","isValid","hasSame","clickPrev","clickNext","handleClickDefaults","number","zoneName","onDropItem","showEventModal","eventObj","hideEventModal","closeFn","onModalHidden","ApiLvPlan","getLvPlan","eventsPersonal","eventsLv","getLv","GridLineEvent","isHeaderOrFooter","draggable","classes","startsHere","endsHere","CalendarGrid","GridLine","LineEvent","LineBackground","flipAxis","background","styles","perc","border","diff","axisRow","eventsWithRowInfo","toMillis","originalEvents","originalBackgrounds","axisMain","axisParts","Duration","allDayEvents","axisMainCollapsible","snapToGrid","resizeObserver","mutationObserver","userScroll","axisCol","axisPartsWithBreaks","tu","lastTuEnd","slice","axisPartsSave","partsEnds","part","axisMainBorders","curr","eventsAllDay","mapIntoMainAxis","allDayEvent","eventsNormal","hasValidEvents","styleGridCols","styleGridRows","gridlines","mainIndex","day","laneStart","laneEnd","getPageTop","pageTop","offsetTop","offsetParent","getPageLeft","pageLeft","offsetLeft","getTimestampFromMouse","dayTimestamp","mouse","mouseFrac","main","enableAutoScroll","ResizeObserver","scrollToEarliestEvent","observe","MutationObserver","mutations","m","addedNodes","matches","subtree","childList","disableAutoScroll","disconnect","eventElements","scroller","earliestEventOffset","scrollIntoView","behavior","scrollTo","LabelDay","titleFull","titleLong","titleShort","titleNarrow","LabelDow","weekday","LabelTime","start_ok","end_ok","sanitizedTimestamps","formatTime","toISOTime","suppressSeconds","ModeDay","DayView","emptyMessage","emptyMessageDetails","chosenEvent","gridMainRef","fromISOTime","hours","currentEvent","first","isToday","compact","threshold","elementRef","isRef","$el","compareArray","updateResultVars","compare","observer","addObserver","removeObserver","onMounted","onUnmounted","watchEffect","useResizeObserver","currentDate","focusDate","rangeOffset","range","last","Interval","fromDateTimes","view","slider","updatePage","newFocusDate","viewAttrs","$attrs","ModeWeek","WeekView","collapseEmptyDays","weeks","ModeMonth","MonthView","LabelWeek","firstDay","lastDay","d","startdate","nextRangeStart","months","dayInWeek","FhcCalendar","getPromiseFunc","markRaw","teachingunits","includeOffset","eventStyle","farbe","updateRange","rangeInterval","context","lv","loading_id","loadingEvents","allEvents","eventsLoaded","mergePromiseArr","markEventsLoaded","indexIsLast","nStart","rStart","nEnd","toISODate","toValue","promises","results","useEventLoader","newValue","emit","stunde","beginn","ende","ApiAuthinfo","LvPlan","propsViewData","currentDay","focus_date","isNaN","currentMode","currentLv","lvTitle","bezeichnung_english","bezeichnung","handleChangeDate","newMode","handleChangeMode","$router","MyLvPlan","studiensemester_start","studiensemester_ende","downloadLinks","opts","toUnixInteger","download_link","link","LvPruefungen","pruefungenData","ApiLehre","infos","studien_semester","studiengang_kuerzel","orgform_kurzbz","ects","incoming","info","lektorNamesLinks","lektorenLinks","lektoren","titelpre","vorname","nachname","titelpost","lektorNames","lvLeitung","oe","organisationseinheittyp","oeLeitung","koordinator","currentLang","lastLang","lvinfo","lvinfoDefaultLang","assign","reloadRefs","triggerRef","initialval","FHC_JS_PHRASES_STORAGE_OBJECT","tmp_category","loadLazy","unref","LvMenu","containerStyles","rowStyles","hasLvPlanEintraege","c4_disabled","menuItem","c4_link","c4_moodle_links","c4_target","getMenuName","ApiAddons","LvUebersicht","titel","preselectedMenu","isMenuSelected","lvEvaluierungMessage","hiddenModal","showModal","studium_studiensemester","MylvSemester","MylvSemesterStudiengang","MylvSemesterStudiengangLv","bezeichnung_eng","module","benotung","lvnote","lvnotebez","znote","znotebez","positiv","note_index","preselectedMenuItem","gradeColor","is_organisatorische_einheit","emptyMenu","bodyStyle","grade","languageIndex","LvHasPruefungenInformation","fetchMenu","openLvOption","location","nextTick","lvUebersicht","openPruefungen","openInfos","LvInfo","pruefungen","kuerzel","lvs","sg_bezeichnung_eng","lehrveranstaltungen","Map","studiengaenge","sg_bezeichnung","lvsForStudiengang","MylvStudent","firstLoad","currentSemester","nearestSem","nearestSemDiff","sem","abs","currentIsFirst","currentIsLast","prevSem","selectedIndex","nextSem","updateRouter","routerStudiensemester","$route","s","beforeRouteUpdate","to","next","CoreFetchCmpt","refresh","apiFunction","apiFunctionParameters","oldValue","fetchData","errorMessage","apiFunctionResult","successHandler","errorHandler","finally","finallyHandler","setError","FILTER_COMPONENT_NEW_FILTER","FilterConfig","filters","columns","fields","switchFilter","applyFilterConfig","currentFields","c","currentTarget","filteredFields","addField","removeField","FilterColumns","selected","names","selectedFields","DEFAULT_ICONS","jsonLines","xlsx","pdf","json","csv","DEFAULT_LABELS","TableDownload","tabulator","iconClass","currentConfig","newConfig","stringToFileFormatter","formatter","validateFileFormatter","lcInput","XLSX","jspdf","jsPDF","autoTable","download","elementDataMap","WeakMap","collapseAutoClose","collapse","getInstance","collapsibleAutoHideFunc","Tabulator","extendModule","fitDataStretchFrozen","forced","colsWidth","tableWidth","table","rowManager","gap","lastCol","column","widthFixed","reinitializeWidth","responsiveLayout","modules","responsive","visible","definition","frozen","getWidth","modExists","setWidth","ApiFilter","_uuid","CoreFilterCmpt","onNwNewEntry","description","sideMenu","tabulatorOptions","tabulatorEvents","tableOnly","noColumnFilter","reload","reloadBtnInfotext","newBtnShow","newBtnClass","newBtnDisabled","newBtnLabel","uniqueId","idField","parentIdField","countOnly","useSelectionSpan","uuid","filterName","filterActive","dataset","datasetMetadata","availableFilters","selectedFilter","fetchCmptRefresh","fetchCmptApiFunction","fetchCmptApiFunctionParams","fetchCmptDataFetched","fetchResult","tableBuilt","tabulatorHasSelector","selectedData","persistence","headerFilter","notSelectedFields","filteredData","filteredColumns","col","resizable","fieldIdsForVisibilty","getColumns","def","getDefinition","getField","fieldNames","idExtra","columnsForFilter","filterTitles","reloadTable","initTabulator","hash","resolvePromiseFunc","setRenderData","startFetchCmpt","layout","movableColumns","columnDefaults","tooltip","selectable","dataTree","on","toDelete","childIdx","child","isVisible","_setHeaderFilter","updateTabulator","_updateTabulator","setColumns","clearFilters","getHeaderFilters","setHeaderFilterValue","clearFilter","render","setSideMenu","setDropDownMenu","personalFilters","filtersArray","filtersCount","filter_id","desc","onClickCall","handlerGetFilterById","subscriptDescription","subscriptLinkClass","subscriptLinkValue","onClickSubscriptCall","handlerRemoveCustomFilter","children","option","dataFetchedCallback","handlerSaveCustomFilter","attr","parentId","parentIdx","_children","beforeCreate","$props","Mailverteiler","AusweisStatus","QuickLinks","mobile","hideCollapse","collapseOpen","showCollapse","Adresse","withZustelladresse","Kontakt","ProfilEmails","RoleInformation","getLinkGruppeListe","gruppe","getLinkVerbandListe","getLinkSemesterListe","ApiProfil","profilViewData","Upload","DmsItem","preview","multiple","inputClass","noList","disabled","stringifyFile","lastModified","lastModifiedDate","addFiles","files","dt","DataTransfer","doubles","removeFile","fileToRemove","upload","dmsFile","ApiProfilUpdate","updateProfilbild","getProfilUpdateWithPermission","ImageUpload","dmsData","Dms","updateID","uploadImage","ProfilInformation","fotoStatus","FotoSperre","foto_sperre","imageUpload","sperre_foto_function","get_image_base64_src","foto","Vorname","Nachname","profilInfo","notIncludedProperties","EditProfilSelect","EditKontakt","originalValue","zustellKontakteCount","updateValue","checked","isChanged","getZustellkontakteCount","showZustellKontakteWarning","zustellung","kontakteOfSelectedType","kontakttyp","EditAdresse","AutoComplete","autocomplete","gemeinden","ortschaftnamen","selectedNation","nationenList","zustellAdressenCount","fileschanged","autocompleteSearchGemeinden","gemeinde","autocompleteSearchOrtschaftsnamen","ortschaft","getGemeinde","Set","ortschaftsname","updateFileID","getZustelladressenCount","deleteDmsData","showZustellAdressenWarning","zustelladresse","adresse_id","strasse","Status","getDocumentLink","dms_id","getComponentView","profilUpdateTopic","cardHeader","status_timestamp","TextInputDokument","withFiles","didFilesChange","didDataChange","emitChanges","toRaw","ariaLabel","breadcrumb","submit","select","breadcrumbItems","modal_topic","properties","addItem","anmerkung","deleteItem","profilUpdateEmit","updateOptions","Loading","state","clearTimeout","EditProfil","Loader","zustelladressenCount","zustellkontakteCount","editData","updateFileIDFunction","newFileID","handleFailedError","setLoading","submitProfilChange","fileData","uploadFiles","handleApiResponse","showFooter","FetchProfilUpdates","showUpdateModal","editProfilTitle","hideEditProfilModal","updateEditModal","showEditProfilModal","updateRequest","profilUpdateStates","deleteRequest","dateFilter","cell","onRendered","div","initialValue","getValue","PrimevueCalendar","calendar","dates","headerValue","rowValue","rowDate","startDate","endDate","setHours","toDateString","singleDate","StudentProfil","collapseIconBetriebsmittel","editDataFilter","preloadedPhrasen","zutrittsgruppen_table_options","persistenceID","zutrittsGruppenPhrase","betriebsmittel_table_options","responsiveLayoutCollapseUseFormatters","responsiveLayoutCollapseFormatter","$collapseFormatter","headerSort","headerClick","collapseFunction","entlehnteBetriebsmittelPhrase","inventarnummerPhrase","ausgabedatum","headerFilterFunc","formatterParams","datetimeFormatterParams","betriebsmittelTableBuilt","betriebsmittelTable","mittel","zutrittsgruppenTableBuilt","zutrittsgruppenTable","zuttritsgruppen","fetchProfilUpdates","profilUpdates","sortProfilUpdates","editModal","inputFormat","outputFormat","invalidPlaceholder","filteredEditData","profilInformation","Username","username","Anrede","anrede","Titel","Postnomen","postnomen","roleInformation","geburtsdatum","gebdatum","geburtsort","gebort","personenkennzeichen","loaded","newVal","MitarbeiterProfil","funktionen_table_options","bezeichnungPhrase","organisationseinheitPhrase","gueltigVonPhrase","gueltigBisPhrase","wochenstundenPhrase","Nummer","Ausgegeben_am","ausgabedatumPhrase","funktionenTableBuilt","funktionenTable","funktionen","setTableColumnTitles","getTelefonValue","standort_telefon","telefonklappe","kurzbz","telefon","office","ViewStudentProfil","personEmails","emails","ViewMitarbeiterProfil","collapseIconFunktionen","item2","innerHTML","Profil","notFoundUID","isEditable","editable","allClickableIcons","_column","cells","click","ele1","ele2","insertamum","reverse","load","profil_data","adressen","adressenArray","adresse","adr","kontakte","kontakteArray","kontant","kon","Personen_Informationen","Private_Kontakte","listview","Private_Adressen","loadingModalRef","oldVal","ApiOrt","Raumsuche","InputNumber","inputnumber","phrasenPromise","phrasenResolved","tabulatorUuid","tableBuiltResolve","tableBuiltPromise","roomtypes","defaultType","raumtyp_kurzbz","beschreibung","anzahl","selectedType","getHours","minutes","getMinutes","datepickerTextInputOptions","enterSubmit","tabSubmit","selectOnFocus","format","escClose","timepickerTextInputOptions","raumsucheTableOptions","widthGrow","linkFormatter","raumsucheTableEventHandlers","tableResolve","arialabel","roomPlanLink","room","roomInfoLink","getTimeString","setupData","nummer","planbezeichnung","personen","max_person","linkInfo","linkRes","raumsucheTable","loadRoomTypes","loadRooms","toISOString","handleUuidDefined","setRoute","dateFormat","getDate","getMonth","getFullYear","timeFormat","setupMounted","tableID","tableDataSet","visualViewport","setProperty","isDarkMode","Pagination","paginator","maxPageCount","newPageEvent","StudiengangPerson","telefoneklappe","email","displayWidget","formattedEmail","emailArray","fullname","phone","email_link","base64Image","profilViewLink","StudiengangVertretung","vertretungsList","showBezeichnung","vertretungFormatedName","vertretung","ApiStudiengang","StudiengangInformation","stg_ltg","gf_ltg","stv_ltg","ass","hochschulvertr","stdv","jahrgangsvertr","collection_array","returnData","moodleLink","studiengangInformationen","ApiCms","CmsNews","fetchNews","Axios","loadNewPageContent","raum_contentmittitel","imgContent","sanitizeLegacyTables","pElement","parentNode","replaceChild","u","li","scrollWidth","firstChild","TEXT_NODE","th","childNodes","cn","tables","getElementsByTagName","innerText","room_name","room_name_reg_exp","room_name_reg_exp_result","link_element","replaceWith","lvplanlinks","lvplanlink","img","DOMParser","parseFromString","imgAttributes","regexList","relative","priority","regex","replacement","group_replacement_strategy","absolute","relative_regex","replaceRelativeLegacyLink","relativeLegacyLink","new_link","query_parameter","prepareContent","new_href","CmsContent","news_content","iframe_content","srcUrl","iframe","content_type","content_id_internal","fetchContent","$nextTick","computeContentType","DEFAULT_MODE_RAUMINFO","RoomInformation","ApiAbgabe","getConfig","getConfigStudent","getStudentProjektarbeiten","getStudentProjektabgaben","projektarbeit_id","postStudentProjektarbeitEndupload","Headers","postStudentProjektarbeitZwischenabgabe","getMitarbeiterProjektarbeiten","showall","postProjektarbeitAbgabe","termin","dateString","paabgabe_id","paabgabetyp_kurzbz","note_pk","upload_allowed","beurteilungsnotiz","fixtermin","insertvon","betreuer_person_id","deleteProjektarbeitAbgabe","postSerientermin","projektarbeit_ids","fetchDeadlines","getPaAbgabetypen","getProjektarbeitenForStudiengang","benotet","getStudiengaenge","postStudentProjektarbeitZusatzdaten","getSignaturStatusForProjektarbeitAbgaben","paabgabe_ids","FhcOverlay","AbgabeStudentDetail","Checkbox","checkbox","Dropdown","dropdown","Textarea","textarea","Accordion","accordion","AccordionTab","accordiontab","Message","Inplace","inplace","projektarbeit","viewMode","eidAkzeptiert","enduploadTermin","allActiveLanguages","abstract","abstract_en","schlagwoerter","schlagwoerter_en","kontrollschlagwoerter","seitenanzahl","getNoteBezeichnung","noteOpt","notenOptions","opt","$capitalize","benotbar","validate","endupload","triggerEndupload","bperson_id","handleUploadRes","modalContainerEnduploadZusatzdaten","downloadAbgabe","formatDate","dateParam","padZero","num","abgabedatum","signatur","signaturInfo","getOptionLabel","getTerminNoteBezeichnung","getMoodleLink","moodle_link","getMessagePtStyle","margin","padding","getEid","allowedToSaveZusatzdaten","getAllowedToSendEndupload","qualityGateTerminAvailable","qgatefound","abgabetermine","abgabe","getTooltipVerspaetet","getTooltipVerpasst","getTooltipAbzugeben","getTooltipStandard","getTooltipAbgegeben","getTooltipFixtermin","getTooltipAbgabeDetected","getTooltipNotAllowedToUpload","isViewMode","getTooltipBeurteilungerforderlich","getTooltipBestanden","getTooltipNichtBestanden","today","getDateStyleClass","diffindays","isLate","nopt","AbgabetoolStudent","AbgabeDetail","student_uid_prop","activeTabIndex","abgabeTypeOptions","projektarbeiten","selectedProjektarbeit","checkQualityGatesStrict","termine","qgate1Passed","qgate2Passed","noteOption","checkQualityGatesOptional","qgate1found","qgate2found","qgate1positiv","qgate2positiv","isPastDate","deadline","setDetailComponent","loadAbgaben","pa","projekarbeit","paIsBenotet","allowedToUpload","inTime","dateStyle","betreuer","buildBetreuer","modalContainerAbgabeDetail","centeredTextFormatter","detailFormatter","mailFormatter","beurteilungFormatter","buildMailToLink","projekt","btitelpre","bvorname","bnachname","btitelpost","betreuerart_kurzbz","beurteilung1","downloadLink1","beurteilung2","downloadLink2","stg","kurzbzlang","mail","projekttypbezeichnung","loadProjektarbeiten","getAccTabHeaderForProjektarbeit","getMailLink","handleDownloadBeurteilung1","handleDownloadBeurteilung2","allowedNotenOptions","AbgabeMitarbeiterDetail","SpeedDial","speeddial","isFullscreen","assistenzMode","showAutomagicModalPhrase","speedDialItems","command","openCreateNewAbgabeModal","getAllowedToCreateNewTermin","openBenotung","openPlagiatcheck","openStudentPage","newTermin","noteBackend","getPlaceholderTermin","saveTermin","invertedFixtermin","newTerminRes","allowedToSave","allowedToDelete","existingTerminRes","abgabeOpt","noteOptExisting","savedNewWithNegative","savedExistingNoteAsNegativeAndWasNotNegativeBefore","modalContainerCreateNewAbgabe","openZusatzdatenModal","modalContainerZusatzdaten","saveZusatzdaten","validateZusatzdaten","paRes","handleDeleteTermin","deleteTermin","deletedTerminIndex","openBeurteilungLink","getOptionLabelSprache","getOptionLabelAbgabetyp","getOptionDisabled","aktiv","getNotenOptionLabel","turnitin_link","getSemesterBenotbar","beurteilungLinkNew","beurteilungLinkOld","upload_allowed_default","validateTermin","handleSaveNewAbgabe","handleChangeAbgabetyp","notenOptionsNonFinal","getAllowedAbgabeTypeOptions","abgabetypenBetreuer","getEnduploadErlaubt","isCurrent","endUploadVorhanden","getSpeedDialStyle","getSpeedDialWrapperStyle","getTooltipNotAllowedToSave","getTooltipNotAllowedToDelete","getProjektarbeitTitel","getProjektarbeitStudent","splitMailsHelper","mails","subject","alertPluginRef","phrasenPluginRef","maillist","mailto","subjectlength","firstrun","useBcc","ctrlKey","metaKey","splitposition","lastIndexOf","mailLink","AbgabetoolMitarbeiter","TieredMenu","tieredmenu","old_abgabe_beurteilung_link","tableData","detailIsFullscreen","BETREUER_SAMMELMAIL_BUTTON_STUDENT","saving","serienTermin","showAll","domain","detailOffset","abgabeTableOptions","selectableCheck","selectionCheck","rowHeight","getRow","handleClick","cssText","titleFormatter","hozAlign","selectHandler","titleFormatterParams","selectAllHandler","cssClass","pkzTextFormatter","headerFilterTerminCol","sorter","sortFuncTerminCol","abgabterminFormatter","headerFilterParams","valuesLookup","getQGateStatusList","abgabeTableEventHandlers","getColumn","undoSelection","sd","fsd","handlePaUpdated","checkAbgabetermineProjektarbeit","abgabeTable","redraw","sammelMailStudent","param","recipientList","aRow","bRow","diffMs","filterVal","rowVal","luxonDate","toLuxon","loadState","saveState","stateRestored","getColumnLayout","getSorters","getFilters","headerFilters","handleTableBuilt","saved","colLayoutRestored","setColumnLayout","filtersRestored","setFilter","headerFiltersRestored","hf","sortRestored","sortList","columnManager","findColumn","setSort","checkQualityGateStatus","qgate1Termine","qgate2Termine","qgate1Status","qgate1StatusRank","qgate2Status","qgate2StatusRank","qgate","prevTermin","nextTermin","isSelected","deselect","getTable","getRows","handleToggleFullscreenDetail","showDeadlines","toggleShowAll","openAddSeriesModal","modalContainerAddSeries","addSeries","oldScrollLeft","oldScrollTop","createInfoString","str","paabgabe","buildPKZ","matrikelnr","buildStg","pkz","beurteilung","beurteilungLink","projekttyp_kurzbz","callback","calcMaxTableHeight","setHeight","emailItems","uniqueStudentEmailCount","BsOffcanvas","offcanvas","scroll","placement","Offcanvas","ApiStudiensemester","getAllStudiensemesterAndAktOrNext","order","AbgabetoolAssistenz","AbgabeterminStatusLegende","Timeline","timeline","stg_kz_prop","studiensemesterOptions","allSem","curSem","notenOptionFilter","inplaceToggle","timelineProjekt","selectedStudiengangOption","studiengaengeOptions","allConfigPromise","ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT","ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER","allowedNotenFilterOptions","renderVerticalBuffer","formAction","uniqueRecipients","sammelMailBetreuer","betreuer_mail","zweitbetreuer_mail","getItemBezeichnung","getItemNote","notenOption","handleChangeAbgabetypSerientermin","semesterChanged","existing","compVal","newFilter","getOptionLabelStg","getOptionLabelStudiensemester","getNotenFilterOptionLabel","actionButtons","alignItems","justifyContent","createButton","titleKey","clickHandler","btn","aspectRatio","transform","stopImmediatePropagation","openTimeline","pids","preserveSelected","newAbgaben","pid","scrollX","scrollY","mappedData","mapProjekteToTableData","projekte","note_bez","erstbetreuer","buildErstbetreuer","zweitbetreuer","buildZweitbetreuer","student_vorname","student_nachname","terminTypOpt","drawer","timelineFormatter","erstbetreuer_full_name","betreuer_vorname","betreuer_nachname","zweitbetreuer_full_name","uniqueBetreuerEmailCount","allRows","cb","getElement","requests","stgOpt","DeadlineOverview","person_uid_prop","fullName","deadlines","deadlineTableOptions","deadlineTableEventHandlers","pdfExportLink","loadDeadlines","dl","stud_titelpre","stud_vorname","stud_nachname","stud_titelpost","fixterminstring","deadlineTable","Studium","studienSemester","selectedStudiensemester","selectedStudiengang","studienOrdnung","selectedStudienordnung","selectedSemester","selectedLehrveranstaltung","studium_studiengang","studium_semester","studium_studienordnung","getDataFromLocalStorage","storeDataToLocalStorage","studienordnung","changeStudiensemester","changeSelectedStudienSemester","changeStudiengang","changeSelectedStudienGang","changeSemester","changeSelectedSemester","changeStudienordnung","newSelectIndex","changeSelectedStudienPlan","extractPropertyValues","studienplan_id","openLvUebersicht","lehrveranstaltung","sortStudienSemester","sem1","sem2","sem1Match","sem1Semester","sem1Year","sem2Match","sem2Semester","sem2Year","setHash","preselected","lv1","lv2","studienordnungTitel","orgform_bezeichnung","studiengangTitel","studiensemesterTitel","studiensemester_regex","selectedLehrveranstaltungTitel","lehrform_kurzbz","computedStudienOrdnung","carry","computedStudienOrdnungSelectValues","diabled","ApiRenderers","loadRenderers","ApiRouteInfo","ciPath","router","VueRouter","createRouter","history","createWebHistory","routes","redirect","route","charAt","beforeEnter","currentRoute","appSideMenuEntries","renderers","isMobile","matchMedia","isInternalRoute","internalBase","origin","startsWith","URL","pathname","matched","rendertype","modalTitle","modalContent","calendarEvent","defineAsyncComponent","calendarEventStyles","head","rel","isChromium","test","navigator","userAgent","isFirefox","overflow","scrollbarWidth","getScrollbarWidth","setScrollbarWidth","string","directive","afterEach","failure","fullPath"],"mappings":"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"} \ No newline at end of file diff --git a/public/js/components/Cis/Abgabetool/AbgabeMitarbeiterDetail.js b/public/js/components/Cis/Abgabetool/AbgabeMitarbeiterDetail.js index 971783746..011e75145 100644 --- a/public/js/components/Cis/Abgabetool/AbgabeMitarbeiterDetail.js +++ b/public/js/components/Cis/Abgabetool/AbgabeMitarbeiterDetail.js @@ -1,8 +1,8 @@ import BsModal from '../../Bootstrap/Modal.js'; import VueDatePicker from '../../vueDatepicker.js.php'; import ApiAbgabe from '../../../api/factory/abgabe.js' +import { getDateStyleClass } from "./getDateStyleClass.js"; -const today = new Date() export const AbgabeMitarbeiterDetail = { name: "AbgabeMitarbeiterDetail", components: { @@ -17,6 +17,7 @@ export const AbgabeMitarbeiterDetail = { Message: primevue.message, VueDatePicker }, + emits: ['paUpdated'], inject: [ 'abgabeTypeOptions', 'abgabetypenBetreuer', @@ -81,9 +82,9 @@ export const AbgabeMitarbeiterDetail = { }, methods: { getNoteBezeichnung(termin){ - if(termin.note?.bezeichnung) { - return termin.note?.positiv ? this.$capitalize(this.$p.t('abgabetool/c4positivBenotet')) + ' ✅' : this.$capitalize(this.$p.t('abgabetool/c4negativBenotet')) + ' ❌' - } else if(termin.bezeichnung?.benotbar === true && !termin.note) { + if(termin.noteBackend?.bezeichnung) { + return termin.noteBackend?.positiv ? this.$capitalize(this.$p.t('abgabetool/c4positivBenotet')) + ' ✅' : this.$capitalize(this.$p.t('abgabetool/c4negativBenotet')) + ' ❌' + } else if(termin.bezeichnung?.benotbar === true && !termin.noteBackend) { return this.$capitalize(this.$p.t('abgabetool/c4notYetGraded')); } else { return '' @@ -109,7 +110,10 @@ export const AbgabeMitarbeiterDetail = { 'allowedToDelete': true, ...res.data[0] } - if(newTerminRes.note) newTerminRes.note = noteOpt + if(newTerminRes.note) { + newTerminRes.note = noteOpt + newTerminRes.noteBackend = noteOpt // certain UI elements should only reflect persisted state + } newTerminRes.invertedFixtermin = !newTerminRes.fixtermin const existingTerminRes = res.data[1] @@ -121,14 +125,17 @@ export const AbgabeMitarbeiterDetail = { benotbar: abgabeOpt.benotbar } - - // only insert new abgabe if we actually created a new one, not when saving/editing existing if(!existingTerminRes){ + newTerminRes.dateStyle = getDateStyleClass(newTerminRes, this.notenOptions) this.projektarbeit.abgabetermine.push(newTerminRes) } else { const noteOptExisting = this.allowedNotenOptions.find(opt => opt.note == existingTerminRes.note) existingTerminRes.note = noteOptExisting + + termin.paabgabetyp_kurzbz = newTerminRes.paabgabetyp_kurzbz + termin.noteBackend = noteOpt // do NOT take noteOptExisting -> should reflect the "yes the qgate grade is confirmed in backend ux behaviour" + termin.dateStyle = getDateStyleClass(termin, this.notenOptions) } this.projektarbeit.abgabetermine.sort((a, b) =>new Date(a.datum) - new Date(b.datum)) @@ -168,6 +175,8 @@ export const AbgabeMitarbeiterDetail = { } else { this.showAutomagicModalPhrase = false } + + this.$emit("paUpdated", this.projektarbeit) } else if(res?.meta?.status == 'error'){ this.$fhcAlert.alertError() } @@ -251,6 +260,7 @@ export const AbgabeMitarbeiterDetail = { // this.$p.t('global/tooltipLektorDeleteKontrolle', [this.$entryParams.permissions.kontrolleDeleteMaxReach ]) const deletedTerminIndex = this.projektarbeit.abgabetermine.findIndex(t => t.paabgabe_id === termin.paabgabe_id) this.projektarbeit.abgabetermine.splice(deletedTerminIndex, 1) + this.$emit("paUpdated", this.projektarbeit) } else if(res?.meta?.status == 'error'){ this.$fhcAlert.alertError() } @@ -270,75 +280,6 @@ export const AbgabeMitarbeiterDetail = { window.open(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + url) // this.$api.call(ApiAbgabe.getStudentProjektarbeitAbgabeFile(termin.paabgabe_id, this.projektarbeit.student_uid)) }, - convertDateToIsoString(date) { - // 1. Check if it is a Date object AND if the date value is valid (not 'Invalid Date') - if (param instanceof Date && !isNaN(param.getTime())) { - const year = param.getFullYear(); - // getMonth() is 0-indexed, so we add 1. - const month = param.getMonth() + 1; - const day = param.getDate(); - - // Helper to pad single-digit numbers with a leading zero - const pad = (num) => String(num).padStart(2, '0'); - - // Return the formatted string: YYYY-MM-DD - return `${year}-${pad(month)}-${pad(day)}`; - } - - // If it's not a valid Date, return the original parameter - return param; - }, - dateDiffInDays(datumParam){ - let datum = datumParam - if(datumParam instanceof Date && !isNaN(datum.getTime())) - { - const year = datumParam.getFullYear(); - const month = datumParam.getMonth() + 1; // getMonth() is 0-indexed - const day = datumParam.getDate(); - const pad = (num) => String(num).padStart(2, '0'); - datum = `${year}-${pad(month)}-${pad(day)}` - } - - const dateToday = luxon.DateTime.now().startOf('day'); - const dateDatum = luxon.DateTime.fromISO(datum).startOf('day'); - const duration = dateDatum.diff(dateToday, 'days'); - - return duration.values.days; - }, - getDateStyleClass(termin) { - const datum = new Date(termin.datum) - const abgabedatum = new Date(termin.abgabedatum) - - termin.diffindays = this.dateDiffInDays(termin.datum) - - const isLate = termin.abgabedatum && abgabedatum > datum; - - // GRADE STATUS - if (termin.note) { - if (termin.note.positiv) return 'bestanden'; - return 'nichtbestanden'; - } - - // ACTION REQUIRED FOR GRADE - if (termin.bezeichnung?.benotbar && datum < today) { - return 'beurteilungerforderlich'; - } - - // SUBMISSION STATUS - if (termin.upload_allowed) { - if (termin.abgabedatum) { - return isLate ? 'verspaetet' : 'abgegeben'; - } - - // no submission yet - if (datum < today) return 'verpasst'; - if (termin.diffindays <= 12) return 'abzugeben'; - return 'standard'; - } - - // GENERIC STATUS - return datum < today ? 'verpasst' : 'standard'; - }, openBeurteilungLink(link) { window.open(link, '_blank') }, @@ -396,6 +337,7 @@ export const AbgabeMitarbeiterDetail = { } }, formatDate(dateParam) { + // unsafe for datepickers, dont use there const date = new Date(dateParam) // handle missing leading 0 const padZero = (num) => String(num).padStart(2, '0'); @@ -476,7 +418,6 @@ export const AbgabeMitarbeiterDetail = { termin.kurzbz = '' } } - }, computed: { getAllowedToCreateNewTermin() { @@ -626,7 +567,6 @@ export const AbgabeMitarbeiterDetail = { return '' }, getProjektarbeitStudent(){ - if(this.projektarbeit?.student) return this.$capitalize(this.$p.t('person/student')) + ': ' + this.projektarbeit.student return '' @@ -671,7 +611,6 @@ export const AbgabeMitarbeiterDetail = { this.form.schlagwoerter_en = newVal.schlagwoerter_en ?? '' this.form.kontrollschlagwoerter = newVal.kontrollschlagwoerter ?? '' this.form.seitenanzahl = newVal.seitenanzahl ?? 1 - }, }, created() { @@ -709,13 +648,14 @@ export const AbgabeMitarbeiterDetail = {
    -
    {{ $capitalize( $p.t('abgabetool/c4zieldatum') )}}
    +
    {{ $capitalize( $p.t('abgabetool/c4zieldatumv2') )}}
    @@ -746,7 +686,7 @@ export const AbgabeMitarbeiterDetail = {
    -
    {{ $capitalize( $p.t('abgabetool/c4abgabekurzbz') )}}
    +
    {{ $capitalize( $p.t('abgabetool/c4abgabekurzbzv2') )}}
    @@ -766,8 +706,8 @@ export const AbgabeMitarbeiterDetail = {

    {{getProjektarbeitStudent}}

    {{getProjektarbeitTitel}}