diff --git a/application/config/Events.php b/application/config/Events.php index 3e0a5248f..80a8f03b3 100644 --- a/application/config/Events.php +++ b/application/config/Events.php @@ -6,30 +6,30 @@ use CI3_Events as Events; Events::on('loadRenderers', function ($renderers) { $fhc_core_renderers =& $renderers(); $fhc_core_renderers["lehreinheit"] = array( - 'calendarEvent' => APP_ROOT.'public/js/components/Cis/Renderer/Lehreinheit/calendarEvent.js', - 'modalTitle' => APP_ROOT.'public/js/components/Cis/Renderer/Lehreinheit/modalTitle.js', - 'modalContent' => APP_ROOT.'public/js/components/Cis/Renderer/Lehreinheit/modalContent.js', - 'calendarEventStyles' => APP_ROOT.'public/css/Cis4/CoreCalendarEvents.css' + 'calendarEvent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Lehreinheit/calendarEvent.js'), + 'modalTitle' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Lehreinheit/modalTitle.js'), + 'modalContent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Lehreinheit/modalContent.js'), + 'calendarEventStyles' => APP_ROOT . 'public/css/Cis4/CoreCalendarEvents.css' ); }); Events::on('loadRenderers', function ($renderers) { $fhc_core_renderers =& $renderers(); $fhc_core_renderers["reservierung"] = array( - 'calendarEvent' => APP_ROOT.'public/js/components/Cis/Renderer/Reservierungen/calendarEvent.js', - 'modalTitle' => APP_ROOT.'public/js/components/Cis/Renderer/Reservierungen/modalTitle.js', - 'modalContent' => APP_ROOT.'public/js/components/Cis/Renderer/Reservierungen/modalContent.js', - 'calendarEventStyles' => APP_ROOT.'public/css/Cis4/CoreCalendarEvents.css' + 'calendarEvent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Reservierungen/calendarEvent.js'), + 'modalTitle' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Reservierungen/modalTitle.js'), + 'modalContent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Reservierungen/modalContent.js'), + 'calendarEventStyles' => APP_ROOT . 'public/css/Cis4/CoreCalendarEvents.css' ); }); Events::on('loadRenderers', function ($renderers) { $fhc_core_renderers =& $renderers(); $fhc_core_renderers["ferien"] = array( - 'calendarEvent' => APP_ROOT.'public/js/components/Cis/Renderer/Feiertage/calendarEvent.js', - 'modalTitle' => APP_ROOT.'public/js/components/Cis/Renderer/Feiertage/modalTitle.js', - 'modalContent' => APP_ROOT.'public/js/components/Cis/Renderer/Feiertage/modalContent.js', - 'calendarEventStyles' => APP_ROOT.'public/css/Cis4/CoreCalendarEvents.css' + 'calendarEvent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Feiertage/calendarEvent.js'), + 'modalTitle' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Feiertage/modalTitle.js'), + 'modalContent' => absoluteJsImportUrl('public/js/components/Cis/Renderer/Feiertage/modalContent.js'), + 'calendarEventStyles' => APP_ROOT . 'public/css/Cis4/CoreCalendarEvents.css' ); }); diff --git a/application/config/abgabe.php b/application/config/abgabe.php new file mode 100644 index 000000000..82782b043 --- /dev/null +++ b/application/config/abgabe.php @@ -0,0 +1,43 @@ + cis4 +$config['URL_STUDENTS'] = 'cis.php/Cis/Abgabetool/Student'; +// used as APP_ROOT.URL_MITARBEITER -> old cis +$config['URL_MITARBEITER'] = 'index.ci.php/Cis/Abgabetool/Mitarbeiter'; +// used as APP_ROOT.URL_MITARBEITER -> old cis +$config['URL_ASSISTENZ'] = 'index.ci.php/Cis/Abgabetool/Assistenz'; + +// lehre.tbl_paabgabetyp bezeichnung +//$config['ALLOWED_ABGABETYPEN_BETREUER'] = ['Zwischenabgabe', 'Quality Gate 1', 'Quality Gate 2']; +$config['ALLOWED_ABGABETYPEN_BETREUER'] = ['abstract','zwischen', 'qualgate1', 'qualgate2']; // tbl_paabgabetyp pk +// paabgabetypen for which betreuer is benachrichtigt via sammelmail +$config['RELEVANT_PAABGABETYPEN_SAMMELMAIL_BETREUER'] = ['qualgate1', 'qualgate2', 'end']; +// paabgabetypen for which assistenz is benachrichtigt via sammelmail +$config['RELEVANT_PAABGABETYPEN_SAMMELMAIL_ASSISTENZ'] = ['end']; +// paabgabetypen for which student is benachrichtigt via sammelmail -> basically all of them but still defined for consistency +$config['RELEVANT_PAABGABETYPEN_SAMMELMAIL_STUDENT'] = ['qualgate1', 'qualgate2', 'zwischen', 'note', 'abstract', 'end', 'enda']; +//$config['ALLOWED_NOTEN_ABGABETOOL'] = ['Bestanden', 'Nicht bestanden']; +$config['ALLOWED_NOTEN_ABGABETOOL'] = [10, 14]; // tbl_note pk +// benotete projektarbeiten sperren weitere terminanlage & bearbeitung, diese noten sind ausnahmen dieser Regel +// wie zB "Nicht beurteilt" & "Noch nicht eingetragen" +$config['NONFINAL_NOTEN_ABGABETOOL'] = [9]; +$config['beurteilung_link_fallback'] = 'addons/fhtw/content/projektbeurteilung/projektbeurteilungDocumentExport.php?projektarbeit_id=?&betreuerart_kurzbz=?&person_id=?'; + +$config['PROJEKTARBEITSBEURTEILUNG_MAIL_BASELINK_ERSTBEGUTACHTER'] = 'index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/ProjektarbeitsbeurteilungErstbegutachter'; +$config['PROJEKTARBEITSBEURTEILUNG_MAIL_BASELINK_ZWEITBEGUTACHTER'] = 'index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/ProjektarbeitsbeurteilungErstbegutachter'; + +$config['SIGNATUR_CHECK_PAABGABETYPEN'] = ['end']; + +// to be used as "https://moodle.technikum-wien.at/course/view.php?idnumber=dl{$stg_kz}" for stg specific moodle routing +$config['STG_MOODLE_LINK'] = 'https://moodle.technikum-wien.at/course/view.php?idnumber=dl'; + +$config['ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT'] = true; +$config['ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER'] = true; diff --git a/application/config/cis.php b/application/config/cis.php index 8d3bc347e..430539392 100644 --- a/application/config/cis.php +++ b/application/config/cis.php @@ -4,7 +4,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); // CMS Content Id for CIS4 Menu Root -$config['cis_menu_root_content_id'] = 11087; +$config['cis_menu_root_content_id'] = 11091; // send Mails for ProfilUpdate $config['cis_send_profil_update_mails'] = true; // Vilesci CI BaseUrl diff --git a/application/config/javascript.php b/application/config/javascript.php index 6f82810e2..7b8342ef8 100644 --- a/application/config/javascript.php +++ b/application/config/javascript.php @@ -7,3 +7,6 @@ $config['use_vuejs_dev_version'] = false; $config['use_bundled_javascript'] = false; // systemerror_mailto use in FHC-Alert Plugin - if empty Link will not be rendered $config['systemerror_mailto'] = ''; +// use fhcomplete_build_version as path element after public (requires apache mod_rewrite) +// see /public/.htaccess_sample for details +$config['use_fhcomplete_build_version_in_path'] = false; diff --git a/application/config/routes.php b/application/config/routes.php index eba6688ff..aa4ba9db8 100644 --- a/application/config/routes.php +++ b/application/config/routes.php @@ -65,6 +65,13 @@ $route['Cis/LvPlan/.*'] = 'Cis/LvPlan/index/$1'; $route['Cis/MyLvPlan/.*'] = 'Cis/MyLvPlan/index/$1'; $route['Cis/MyLv/.*'] = 'Cis/MyLv/index/$1'; +$route['Abgabetool/Assistenz'] = 'Cis/Abgabetool/Assistenz'; +$route['Abgabetool/Assistenz/(:any)'] = 'Cis/Abgabetool/Assistenz/$1'; +$route['Abgabetool/Mitarbeiter'] = 'Cis/Abgabetool/Mitarbeiter'; +$route['Abgabetool/Student'] = 'Cis/Abgabetool/Student'; +$route['Abgabetool/Student/(:any)'] = 'Cis/Abgabetool/Student/$1'; +$route['Abgabetool/Deadlines'] = 'Cis/Abgabetool/Deadlines'; + // Studierendenverwaltung List Routes $route['api/frontend/v1/stv/[sS]tudents/inout'] = 'api/frontend/v1/stv/Students/index'; $route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})'] = 'api/frontend/v1/stv/Students/index'; diff --git a/application/config/stv.php b/application/config/stv.php index e03c00084..8942c35e6 100644 --- a/application/config/stv.php +++ b/application/config/stv.php @@ -61,7 +61,11 @@ $config['tabs'] = 'notes' => [ //if true, the count of Messages will be shown in the header of the Tab Messages 'showCountNotes' => true - ] + ], + 'combinePeople' => [ + //multitab should only be shown with this length of selection + 'validCountMulti' => 2, + ], ]; // List of fields to show when ZGV_DOKTOR_ANZEIGEN is defined @@ -84,9 +88,14 @@ if (!defined('ZGV_DOKTOR_ANZEIGEN') || !ZGV_DOKTOR_ANZEIGEN) { ); } -$config['tabs']['projektarbeit']['defaultProjektbetreuerStunden'] = '4.0'; -$config['tabs']['projektarbeit']['defaultProjektbetreuerStundenDiplom'] = '5.0'; -$config['tabs']['projektarbeit']['lvLektroinnenzuteilungFixangestelltStundensatz'] = true; +$config['tabs']['projektarbeit']['defaultProjektbetreuerStunden'] = + defined('FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_BACHELOR') + ? FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_BACHELOR + : '0.0'; +$config['tabs']['projektarbeit']['defaultProjektbetreuerStundenDiplom'] = + defined('FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_MASTER') + ? FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_MASTER + : '0.0'; $config['tabs']['projektarbeit']['defaultProjektbetreuerStundensatz'] = '80.0'; $config['student_tab_order'] = [ @@ -115,7 +124,9 @@ $config['student_tab_order'] = [ $config['students_tab_order'] = [ 'banking', 'status', + 'messages', 'groups', 'finalexam', + 'combinePeople', 'archive', ]; diff --git a/application/controllers/Cis/Abgabetool.php b/application/controllers/Cis/Abgabetool.php index 1895f7472..04338b1a9 100644 --- a/application/controllers/Cis/Abgabetool.php +++ b/application/controllers/Cis/Abgabetool.php @@ -14,10 +14,10 @@ class Abgabetool extends Auth_Controller { parent::__construct([ 'index' => self::PERM_LOGGED, - 'getStudentProjektarbeitAbgabeFile' => self::PERM_LOGGED, - 'Mitarbeiter' => self::PERM_LOGGED, - 'Student' => self::PERM_LOGGED, - 'Deadlines' => self::PERM_LOGGED + 'Mitarbeiter' => array('basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw'), + 'Assistenz' => array('basis/abgabe_assistenz:rw'), + 'Student' => array('basis/abgabe_student:rw', 'basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw'), + 'Deadlines' => array('basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw') ]); } @@ -29,80 +29,69 @@ class Abgabetool extends Auth_Controller */ public function index() { + // TODO: routing from index based on berechtigung? $viewData = array( 'uid'=>getAuthUID(), ); - $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'Abgabetool']); + if(defined('CIS4') && CIS4) { + $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'Abgabetool']); + } else { + $this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'Abgabetool']); + } } - public function Student() + public function Student($student_uid_prop = '') { - $viewData = array( 'uid'=>getAuthUID(), ); - - $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolStudent']); + + if(defined('CIS4') && CIS4) { + $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolStudent']); + } else { + $this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolStudent', 'student_uid_prop' => $student_uid_prop]); + } } public function Mitarbeiter() { - $viewData = array( 'uid'=>getAuthUID(), ); - $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolMitarbeiter']); + if(defined('CIS4') && CIS4) { + $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolMitarbeiter']); + } else { + $this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolMitarbeiter']); + } } + public function Assistenz($stg_kz_prop = '') + { + + $viewData = array( + 'uid'=>getAuthUID(), + ); + + if(defined('CIS4') && CIS4) { + $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolAssistenz']); + } else { + $this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolAssistenz', 'stg_kz_prop' => $stg_kz_prop]); + } + } + public function Deadlines() { - $viewData = array( 'uid'=>getAuthUID(), ); - $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'DeadlinesOverview']); - } - - - public function getStudentProjektarbeitAbgabeFile() - { - $this->_ci =& get_instance(); - $this->_ci->load->helper('download'); - - $paabgabe_id = $this->_ci->input->get('paabgabe_id'); - $student_uid = $this->_ci->input->get('student_uid'); - - if (!isset($paabgabe_id) || isEmptyString($paabgabe_id) || !isset($student_uid) || isEmptyString($student_uid)) - $this->terminateWithJsonError($this->p->t('global', 'wrongParameters'), 'general'); - - $this->_ci->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); - - $isZugeteilterBetreuer = count($this->_ci->ProjektarbeitModel->checkZuordnung($student_uid, getAuthUID())->retval) > 0; - - if(getAuthUID() == $student_uid || $isZugeteilterBetreuer) { - $file_path = PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf'; - if(file_exists($file_path)) { - - header('Content-Description: File Transfer'); - header('Content-Type: application/octet-stream'); - header('Expires: 0'); - header('Cache-Control: must-revalidate'); - header('Pragma: public'); - header('Content-Disposition: attachment; filename="'.basename($file_path).'"'); - header('Content-Length: ' . filesize($file_path)); - - flush(); // send headers first just in case - readfile($file_path); // read file content to output buffer - - } else { - $this->terminateWithJsonError('File not found'); - } + if(defined('CIS4') && CIS4) { + $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'DeadlinesOverview']); } else { - $this->terminateWithJsonError('Keine Zuordnung!'); + $this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'DeadlinesOverview']); } } } diff --git a/application/controllers/Cis/Pub.php b/application/controllers/Cis/Pub.php index bebc844ab..de456145b 100644 --- a/application/controllers/Cis/Pub.php +++ b/application/controllers/Cis/Pub.php @@ -14,7 +14,7 @@ class Pub extends Auth_Controller { parent::__construct( array( - 'bild' => ['basis/cis:r'] + 'bild' => ['basis/cis:r', 'assistenz:r'] ) ); } diff --git a/application/controllers/NeueNachricht.php b/application/controllers/NeueNachricht.php index 9b61b78ef..b0ff5c554 100644 --- a/application/controllers/NeueNachricht.php +++ b/application/controllers/NeueNachricht.php @@ -20,11 +20,18 @@ class NeueNachricht extends Auth_Controller */ public function _remap() { + $typeid = $this->input->post('typeid'); + $ids = ($this->input->post('ids') && strpos($this->input->post('ids'), ',')) + ? explode(',', $this->input->post('ids')) + : $this->input->post('ids'); + //now working $this->load->view('Nachrichten', [ 'permissions' => [ 'assistenz_schreibrechte' => $this->permissionlib->isBerechtigt('assistenz','suid'), - ] + ], + 'ids' => $ids, + 'typeid' => $typeid ]); } } diff --git a/application/controllers/Studentenverwaltung.php b/application/controllers/Studentenverwaltung.php index 2ce19c58a..36c91d5f6 100644 --- a/application/controllers/Studentenverwaltung.php +++ b/application/controllers/Studentenverwaltung.php @@ -32,6 +32,10 @@ class Studentenverwaltung extends Auth_Controller 'student/keine_studstatuspruefung' => $this->permissionlib->isBerechtigt('student/keine_studstatuspruefung'), 'lehre/reihungstestAufsicht' => $this->permissionlib->isBerechtigt('lehre/reihungstestAufsicht'), 'system/change_outputformat' => $this->permissionlib->getOE_isEntitledFor('system/change_outputformat'), + 'student/editBakkZgv' => $this->permissionlib->getSTG_isEntitledFor('student/editBakkZgv') ?: array(), + 'student/editMakkZgv' => $this->permissionlib->getSTG_isEntitledFor('student/editMakkZgv') ?: array(), + 'student/editDokZgv' => $this->permissionlib->getSTG_isEntitledFor('student/editDokZgv') ?: array(), + 'student/editBismelden' => $this->permissionlib->isBerechtigt('student/editBismelden') ], 'variables' => [ 'semester_aktuell' => $this->variablelib->getVar('semester_aktuell') diff --git a/application/controllers/api/frontend/v1/Abgabe.php b/application/controllers/api/frontend/v1/Abgabe.php new file mode 100644 index 000000000..b37c64713 --- /dev/null +++ b/application/controllers/api/frontend/v1/Abgabe.php @@ -0,0 +1,1339 @@ +. + */ + +if (! defined('BASEPATH')) exit('No direct script access allowed'); + +use CI3_Events as Events; + +class Abgabe extends FHCAPI_Controller +{ + + /** + * Object initialization + */ + public function __construct() + { + parent::__construct([ + 'getConfig' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'), + 'getConfigStudent' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_student:rw', 'basis/abgabe_lektor:rw'), + 'getStudentProjektarbeiten' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_student:rw', 'basis/abgabe_lektor:rw'), + 'getStudentProjektabgaben' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_student:rw', 'basis/abgabe_lektor:rw'), + 'postStudentProjektarbeitZwischenabgabe' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_student:rw'), + 'postStudentProjektarbeitEndupload' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_student:rw'), + 'getMitarbeiterProjektarbeiten' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'), + 'postProjektarbeitAbgabe' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'), + 'deleteProjektarbeitAbgabe' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'), + 'postSerientermin' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'), + 'fetchDeadlines' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'), + 'getPaAbgabetypen' => self::PERM_LOGGED, + 'getNoten' => self::PERM_LOGGED, + 'getProjektarbeitenForStudiengang' =>array('basis/abgabe_assistenz:rw'), + 'getStudiengaenge' => array('basis/abgabe_assistenz:rw'), + 'getStudentProjektarbeitAbgabeFile' => array('basis/abgabe_student:rw', 'basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw'), + 'postStudentProjektarbeitZusatzdaten' => array('basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw'), + 'getSignaturStatusForProjektarbeitAbgaben' => array('basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw') + ]); + + $this->load->library('PhrasesLib'); + $this->load->library('SignatureLib'); + + // Loads LogLib with different debug trace levels to get data of the job that extends this class + // It also specify parameters to set database fields + $this->load->library('LogLib', array( + 'classIndex' => 5, + 'functionIndex' => 5, + 'lineIndex' => 4, + 'dbLogType' => 'API', // required + 'dbExecuteUser' => 'RESTful API', + 'requestId' => 'API', + 'requestDataFormatter' => function ($data) { + return json_encode($data); + } + ), 'logLib'); + + $this->loadPhrases( + array( + 'global', + 'ui', + 'abgabetool' + ) + ); + $this->load->config('abgabe'); + $this->load->helper('hlp_sancho_helper'); + } + + //------------------------------------------------------------------------------------------------------------------ + // Public methods + + /** + * loads config related to abgabetool, found in application/config/abgabe + */ + public function getConfig() { + $old_abgabe_beurteilung_link =$this->config->item('old_abgabe_beurteilung_link'); + $turnitin_link = $this->config->item('turnitin_link'); + $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'); + + $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 + ); + + $this->terminateWithSuccess($ret); + } + + /** + * loads config related to abgabetool for students to avoid handing out links reserved for employees + */ + public function getConfigStudent() { + $moodle_link =$this->config->item('STG_MOODLE_LINK'); + + $ret = array( + 'moodle_link' => $moodle_link, + ); + + $this->terminateWithSuccess($ret); + } + + /** + * fetches all projektabgabetermine for a given projektarbeit_id used in cis4 student abgabetool & lektor abgabetool + */ + public function getStudentProjektabgaben() { + $projektarbeit_id = $this->input->get("projektarbeit_id",TRUE); + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + + if ($projektarbeit_id === NULL || trim((string)$projektarbeit_id) === '') { + $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); + } + + $result = $this->ProjektarbeitModel->load($projektarbeit_id); + $projektarbeitArr = $this->getDataOrTerminateWithError($result, 'general'); + + if(count($projektarbeitArr) > 0) { + $projektarbeit = $projektarbeitArr[0]; + } else { + $this->terminateWithError($this->p->t('abgabetool','c4projektarbeitNichtGefunden'), 'general'); + } + + $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id); + if(isError($res)) { + $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general'); + } + + if(!hasData($res)) { + $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general'); + } + $data = getData($res)[0]; + $student_uid = $data->uid; + + $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID()); + if(getAuthUID() == $student_uid || $zugeordnet) { + $projektarbeitIsCurrent = false; + $returnFunc = function ($result) use (&$projektarbeitIsCurrent) { + $projektarbeitIsCurrent = $result; + }; + Events::trigger('projektarbeit_is_current', $projektarbeit_id, $returnFunc); + + $ret = $this->ProjektarbeitModel->getProjektarbeitAbgabetermine($projektarbeit_id); + + foreach ($ret->retval as $termin) { + $this->checkAbgabeSignatur($termin, $projektarbeit->student_uid); + } + + $this->terminateWithSuccess(array($ret, $projektarbeitIsCurrent)); + } + } + + /** + * fetches all projektarbeiten and betreuer for a given student_uid used in cis4 student abgabetool + */ + public function getStudentProjektarbeiten() + { + $uid = $this->input->get("uid",TRUE); + + $this->load->model('person/Person_model', 'PersonModel'); + $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel'); + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + + // if uid is missing or empty, fall back to getAuthUID() + if ($uid === NULL || trim((string)$uid) === '') { + $uid = getAuthUID(); + } + + $isMitarbeiter = $this->MitarbeiterModel->isMitarbeiter(getAuthUID()); + if ($isMitarbeiter) { + $result = $this->ProjektarbeitModel->getStudentProjektarbeitenWithBetreuer($uid); + } else { + $result = $this->ProjektarbeitModel->getStudentProjektarbeitenWithBetreuer(getAuthUID()); + } + + $projektarbeiten = getData($result); + + if(count($projektarbeiten)) { + foreach($projektarbeiten as $pa) { + + $pa->student = getData($this->PersonModel->getFullName($uid)); + + $downloadPaFunc = function ($babgeschickt, $zweitbetreuer_abgeschickt) use ($pa) { + $pa->babgeschickt = $babgeschickt; + $pa->zweitbetreuer_abgeschickt = $zweitbetreuer_abgeschickt; + }; + + Events::trigger('projektbeurteilung_check_available', $pa->projektarbeit_id, $pa->bperson_id, $downloadPaFunc); + + if(isset($pa->babgeschickt) && $pa->babgeschickt) { + $downloadLink1 = ''; + $downloadLinkFunc1 = function ($link) use (&$downloadLink1) { + $downloadLink1 = $link; + }; + + Events::trigger('projektbeurteilung_download_link', $pa->projektarbeit_id, $pa->betreuerart_kurzbz, $pa->bperson_id, $downloadLinkFunc1); + + // use config fallback in case the event fails + if($downloadLink1 == '') { + $fallback = $this->config->item('beurteilung_link_fallback'); + + $search = array( + 'betreuerart_kurzbz=?', + 'projektarbeit_id=?', + 'person_id=?' + ); + + $replace = array( + 'betreuerart_kurzbz=' . $pa->betreuerart_kurzbz, + 'projektarbeit_id=' . $pa->projektarbeit_id, + 'person_id=' . $pa->bperson_id + ); + + $fallback = str_replace($search, $replace, $fallback); + $downloadLink1 = APP_ROOT.$fallback; + + } + $pa->downloadLink1 = $downloadLink1; + } + + $pa->email = $pa->mitarbeiter_uid.'@'.DOMAIN; + + if($pa->zweitbetreuer_person_id !== null) { + + if($pa->zweitbetreuer_abgeschickt) { + $downloadLink2 = ''; + $downloadLinkFunc2 = function ($link) use (&$downloadLink2) { + $downloadLink2 = $link; + }; + + Events::trigger('projektbeurteilung_download_link', $pa->projektarbeit_id, $pa->zweitbetreuer_betreuerart_kurzbz, $pa->zweitbetreuer_person_id, $downloadLinkFunc2); + + // use config fallback in case the event fails + if($downloadLink2 == '') { + $fallback = $this->config->item('beurteilung_link_fallback'); + + $search = array( + 'betreuerart_kurzbz=?', + 'projektarbeit_id=?', + 'person_id=?' + ); + + $replace = array( + 'betreuerart_kurzbz=' . $pa->zweitbetreuer_betreuerart_kurzbz, + 'projektarbeit_id=' . $pa->projektarbeit_id, + 'person_id=' . $pa->zweitbetreuer_person_id + ); + + $fallback = str_replace($search, $replace, $fallback); + $downloadLink2 = APP_ROOT.$fallback; + + } + + $pa->downloadLink2 = $downloadLink2; + } + + $result = $this->ProjektarbeitModel->getProjektbetreuerAnrede($pa->zweitbetreuer_person_id); + + $data = getData($result); + if(count($data) > 0) { + $pa->zweitbetreuer = $data[0]; + } + } + } + } + + $this->terminateWithSuccess(array($projektarbeiten)); + } + + + + /** + * projektarbeit - upload for zwischenabgaben in cis4 student abgabetool + */ + public function postStudentProjektarbeitZwischenabgabe() + { + $this->checkUploadSize(); + + $projektarbeit_id = $this->input->post('projektarbeit_id'); + $paabgabe_id = $this->input->post('paabgabe_id'); + $student_uid = $this->input->post('student_uid'); + $bperson_id = $this->input->post('bperson_id'); + $paabgabetyp_kurzbz = $this->input->post('paabgabetyp_kurzbz'); + + if ($projektarbeit_id === NULL || trim((string)$projektarbeit_id) === '' + || $paabgabe_id === NULL || trim((string)$paabgabe_id) === '' + || $student_uid === NULL || trim((string)$student_uid) === '' + || $paabgabetyp_kurzbz === NULL || trim((string)$paabgabetyp_kurzbz) === '') { + $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); + } + + $this->checkProjektarbeitForFinishedStatus($projektarbeit_id); + + $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID()); + if(getAuthUID() == $student_uid || $zugeordnet) { + + + $path = PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf'; + + if ((isset($_FILES) and isset($_FILES['file']) and ! $_FILES['file']['error'])) { + move_uploaded_file($_FILES['file']['tmp_name'], $path); + + if(file_exists($path)) { + + chmod($path, 0640); + + $this->load->model('education/Paabgabe_model', 'PaabgabeModel'); + $res = $this->PaabgabeModel->update($paabgabe_id, array( + 'abgabedatum' => date('Y-m-d'), + 'updatevon' => getAuthUID(), + 'updateamum' => date('Y-m-d H:i:s') + )); + + $this->logLib->logInfoDB(array('zwischenupload',$res, array( + 'abgabedatum' => date('Y-m-d'), + 'updatevon' => getAuthUID(), + 'updateamum' => date('Y-m-d H:i:s') + ), getAuthUID(), getAuthPersonId(), $student_uid)); + + $this->terminateWithSuccess($res); + } else { + $this->terminateWithError('Error moving File', 'general'); + } + + } else { + $this->terminateWithError('File missing', 'general'); + } + } else { + $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent')); + } + +} + + /** + * upload für finale abgaben aka Endupload in cis4 student abgabetool + */ + public function postStudentProjektarbeitEndupload() + { + $this->checkUploadSize(); + + $projektarbeit_id = $this->input->post('projektarbeit_id'); + $paabgabe_id = $this->input->post('paabgabe_id'); + $student_uid = $this->input->post('student_uid'); + $sprache = $this->input->post('sprache'); + $abstract = $this->input->post('abstract'); + $abstract_en = $this->input->post('abstract_en'); + $schlagwoerter = $this->input->post('schlagwoerter'); + $schlagwoerter_en = $this->input->post('schlagwoerter_en'); + $seitenanzahl = $this->input->post('seitenanzahl'); + $bperson_id = $this->input->post('bperson_id'); + $paabgabetyp_kurzbz = $this->input->post('paabgabetyp_kurzbz'); + + if ($projektarbeit_id === NULL || trim((string)$projektarbeit_id) === '' + || $paabgabe_id === NULL || trim((string)$paabgabe_id) === '' + || $student_uid === NULL || trim((string)$student_uid) === '' + || $paabgabetyp_kurzbz === NULL || trim((string)$paabgabetyp_kurzbz) === '' + || $abstract === NULL || $abstract_en === NULL + || $schlagwoerter === NULL || $schlagwoerter_en === NULL + || $seitenanzahl === NULL || $sprache === NULL) { + $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); + } + + $this->checkProjektarbeitForFinishedStatus($projektarbeit_id); + + $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID()); + if(getAuthUID() == $student_uid || $zugeordnet) { + if ((isset($_FILES) and isset($_FILES['file']) and !$_FILES['file']['error'])) { + move_uploaded_file($_FILES['file']['tmp_name'], PAABGABE_PATH . $paabgabe_id . '_' . $student_uid . '.pdf'); + + if (file_exists(PAABGABE_PATH . $paabgabe_id . '_' . $student_uid . '.pdf')) { + + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + + $result = $this->ProjektarbeitModel->load($projektarbeit_id); + $projektarbeitArr = $this->getDataOrTerminateWithError($result, 'general'); + + if (count($projektarbeitArr) > 0) { + $projektarbeit = $projektarbeitArr[0]; + } else { + $this->terminateWithError($this->p->t('abgabetool', 'c4projektarbeitNichtGefunden'), 'general'); + } + + $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'); + } + + $this->checkAbgabeSignatur($paabgabe, $projektarbeit->student_uid); + $signaturstatus = $paabgabe->signatur; + + // update projektarbeit cols + $this->ProjektarbeitModel->updateProjektarbeit($projektarbeit_id, $sprache, $abstract, $abstract_en + , $schlagwoerter, $schlagwoerter_en, $seitenanzahl); + + + // update paabgabe datum + $res = $this->PaabgabeModel->update($paabgabe_id, array( + 'abgabedatum' => date('Y-m-d'), + 'updatevon' => getAuthUID(), + 'updateamum' => date('Y-m-d H:i:s') + )); + + $res = $this->PaabgabeModel->load($res->retval); + $abgabe = getData($res)[0]; + $abgabe->signatur = $signaturstatus; + + $this->sendUploadEmail($bperson_id, $projektarbeit_id, $paabgabetyp_kurzbz, $student_uid); + + $this->logLib->logInfoDB(array('endupload', $res, array( + 'abgabedatum' => date('Y-m-d'), + 'updatevon' => getAuthUID(), + 'updateamum' => date('Y-m-d H:i:s') + ), getAuthUID(), getAuthPersonId(), array($projektarbeit_id, $sprache, $abstract, $abstract_en + , $schlagwoerter, $schlagwoerter_en, $seitenanzahl))); + + $this->terminateWithSuccess($abgabe); + } else { + $this->terminateWithError('Error moving File', 'general'); + } + + } else { + $this->terminateWithError('File missing', 'general'); + } + } else { + $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent')); + } + + } + + /** + * tabulator tabledata fetch for abgabetool/mitarbeiter + * initially fetches all currently active projektarbeiten with assigned mentorship + * showAll functionality also retrieves older finished projektarbeiten + */ + public function getMitarbeiterProjektarbeiten() { + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + + $boolParamStr = $this->input->get('showall'); + $trueStrings = ['true', '1']; + $falseStrings = ['false', '0']; + + // Handle missing or invalid parameter + if ($boolParamStr === null) { + $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); + } + $boolParamStrLower = strtolower($boolParamStr); + + $showAllBool = false; // fallback if input strings are anything else for whatever reason + if (in_array($boolParamStrLower, $trueStrings, true)) { + $showAllBool = true; + } elseif (in_array($boolParamStrLower, $falseStrings, true)) { + $showAllBool = false; + } + + $projektarbeiten = $this->ProjektarbeitModel->getMitarbeiterProjektarbeiten(getAuthUID(), $showAllBool); + + + forEach($projektarbeiten->retval as $pa) { + + $result = $this->ProjektarbeitModel->getProjektbetreuerAnrede($pa->betreuer_person_id); + $anredeArr = $this->getDataOrTerminateWithError($result, 'general'); + $pa->betreuer = $anredeArr[0]; + + $oldLink = ''; // show this when paIsCurrent == false -> moodle course template + $newLink = ''; // get curated path for betreuer type + $returnFunc = function ( $resultOld, $resultNew) use (&$oldLink, &$newLink) { + $newLink = $resultNew; + $oldLink = $resultOld; + }; + + Events::trigger('projektbeurteilung_formular_link', $pa->betreuerart_kurzbz, APP_ROOT, $pa->projektarbeit_id, $pa->student_uid, $returnFunc); + $pa->beurteilungLinkNew = $newLink; + $pa->beurteilungLinkOld = $oldLink; + } + + + $this->terminateWithSuccess(array($projektarbeiten, DOMAIN)); + } + + /** + * called by abgabetool/mitarbeiter in mitarbeiterdetail.js when adding a single new abgabetermin + * initially fetches all + */ + public function postProjektarbeitAbgabe() { + $projektarbeit_id = $this->input->post('projektarbeit_id'); + $paabgabe_id = $this->input->post('paabgabe_id'); + $paabgabetyp_kurzbz = $this->input->post('paabgabetyp_kurzbz'); + $datum = $this->input->post('datum'); + $fixtermin = $this->input->post('fixtermin'); + $kurzbz = $this->input->post('kurzbz'); + $note = $this->input->post('note'); + $beurteilungsnotiz = $this->input->post('beurteilungsnotiz'); + $upload_allowed = $this->input->post('upload_allowed'); + $betreuer_person_id = $this->input->post('betreuer_person_id'); + + if ($projektarbeit_id === NULL || trim((string)$projektarbeit_id) === '' + || $paabgabe_id === NULL || trim((string)$paabgabe_id) === '' + || $datum === NULL || trim((string)$datum) === '' + || $kurzbz === NULL + || $paabgabetyp_kurzbz === NULL || trim((string)$paabgabetyp_kurzbz) === '') { + $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); + } + + $this->checkProjektarbeitForFinishedStatus($projektarbeit_id); + + $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID()); + if(!$zugeordnet) { + $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent')); + } + + $this->load->model('education/Paabgabe_model', 'PaabgabeModel'); + + $existingPaabgabe = null; + if($paabgabe_id == -1) { + $result = $this->PaabgabeModel->insert( + 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') + ) + ); + $this->logLib->logInfoDB(array('paabgabe created',$result, getAuthUID(), getAuthPersonId())); + } else { + // load existing entry of paabgabe and check if note has changed to negativ, to avoid sending when + // only notiz has changed. + + // TODO: what if paabgabe is a qualgate1, is benotet negativ and then its type is changed to gate2? + + $existingResult = $this->PaabgabeModel->load($paabgabe_id); + $existingPaabgabeArr = getData($existingResult); + if(count($existingPaabgabeArr) > 0) $existingPaabgabe = $existingPaabgabeArr[0]; + + $result = $this->PaabgabeModel->update( + $paabgabe_id, + array( + 'paabgabetyp_kurzbz' => $paabgabetyp_kurzbz, + 'datum' => $datum, + 'kurzbz' => $kurzbz, + 'note' => $note, + 'fixtermin' => $fixtermin, + 'beurteilungsnotiz' => $beurteilungsnotiz, + 'upload_allowed' => $upload_allowed, + 'updatevon' => getAuthUID(), + 'updateamum' => date('Y-m-d H:i:s') + ) + ); + + $this->logLib->logInfoDB(array('paabgabe updated',$result, array( + 'paabgabetyp_kurzbz' => $paabgabetyp_kurzbz, + 'datum' => $datum, + 'kurzbz' => $kurzbz, + 'note' => $note, + 'fixtermin' => $fixtermin, + 'beurteilungsnotiz' => $beurteilungsnotiz, + 'upload_allowed' => $upload_allowed, + 'updatevon' => getAuthUID(), + 'updateamum' => date('Y-m-d H:i:s') + ), getAuthUID(), getAuthPersonId())); + } + + // check if $paaabgabe is a qual gate and its note is deemed negative + // -> send email to student with that info + $paabgabe_id = $this->getDataOrTerminateWithError($result, 'general'); + + $result = $this->PaabgabeModel->load($paabgabe_id); + $paabgabeArr = $this->getDataOrTerminateWithError($result, 'general'); + $paabgabe = $paabgabeArr[0]; + + // check if abgabe even has note + if($paabgabe->note) { + $this->load->model('education/Note_model', 'NoteModel'); + $result = $this->NoteModel->load($paabgabe->note); + $noteArr = $this->getDataOrTerminateWithError($result, 'general'); + $note = $noteArr[0]; + if($note->positiv === false) { + + if($existingPaabgabe && $existingPaabgabe->note) { + $result = $this->NoteModel->load($paabgabe->note); + $noteArr = $this->getDataOrTerminateWithError($result, 'general'); + $note = $noteArr[0]; + if($note->positiv === false) { + // do nothing since this means $beurteilungsnotiz change or smth else + } else { // benotung legitimately changed -> email + $this->sendQualGateNegativEmail($projektarbeit_id, $betreuer_person_id, $paabgabe); + } + } else { // nothing existing previously -> send that mail + $this->sendQualGateNegativEmail($projektarbeit_id, $betreuer_person_id, $paabgabe); + } + + } + } + + $this->terminateWithSuccess([$paabgabe, $existingPaabgabe]); + } + + /** + * called by abgabetool/mitarbeiter in mitarbeiterdetail.js when deleting an abgabetermin + * deletion is only possible if user is assistenz OR betreuer deletes their own custom termin + * none of these roles are allowed to delete if students uploaded something for that termin + */ + public function deleteProjektarbeitAbgabe() { + $paabgabe_id = $this->input->post('paabgabe_id'); + + if ($paabgabe_id === NULL || trim((string)$paabgabe_id) === '') { + $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); + } + + $this->checkProjektarbeitForFinishedStatus($this->getProjektarbeitIDForPaabgabeID($paabgabe_id)); + + $zugeordnet = $this->checkZuordnungByPaabgabe($paabgabe_id, getAuthUID()); + + if(!$zugeordnet) { + $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'), 'general'); + } + + $this->load->model('education/Paabgabe_model', 'PaabgabeModel'); + + $paabgabeResult = $this->PaabgabeModel->load($paabgabe_id); + $paabgabeArr = $this->getDataOrTerminateWithError($paabgabeResult, 'general'); + + if(count($paabgabeArr) == 0) { + $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); + } + + $result = $this->PaabgabeModel->delete($paabgabe_id); + $result = $this->getDataOrTerminateWithError($result, 'general'); + + // TODO: consider this in nightly email job + $this->logLib->logInfoDB(array($paabgabeArr[0], getAuthUID(), getAuthPersonId())); + $this->terminateWithSuccess($result); + } + + /** + * endpoint for adding the same paabgabe for multiple projektarbeiten + * can be slow for large n since it queries twice per projektarbeit_id + */ + public function postSerientermin() { + $projektarbeit_ids = $this->input->post('projektarbeit_ids'); + $datum = $this->input->post('datum'); + $paabgabetyp_kurzbz = $this->input->post('paabgabetyp_kurzbz'); + $bezeichnung = $this->input->post('bezeichnung'); + $kurzbz = $this->input->post('kurzbz'); + $fixtermin = $this->input->post('fixtermin'); + $upload_allowed = $this->input->post('upload_allowed'); + + if ($projektarbeit_ids === NULL || !is_array($projektarbeit_ids) || empty($projektarbeit_ids) + || $datum === NULL || trim((string)$datum) === '' + || $kurzbz === NULL + || $bezeichnung === NULL || trim((string)$bezeichnung) === '' + || $paabgabetyp_kurzbz === NULL || trim((string)$paabgabetyp_kurzbz) === '') { + $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); + } + + // old script checks if there already are tbl_paabgabe entries with exact date, type & kurzbz + // for each termin - good to check that in principle but should not matter in this place. if necessary + // duplicate abgabetermine can be easily deleted manually, also via cronjob@night. + + // since this entry includes the kurzbz string match, it should have only ever mattered when there were + // multiple users entering the exact same set of (date, type, kurzbz) - which is a much more narrow case than the + // general "saveMultiple" function should handle + + // old script afterwards again queries if user is not the zweitbetreuer of any id - this is blocked in the ui + // and should never unintentionally happen + $this->load->model('education/Paabgabe_model', 'PaabgabeModel'); + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + + $res = []; + $abgaben = []; + foreach ($projektarbeit_ids as $projektarbeit_id) { + + $this->checkProjektarbeitForFinishedStatus($projektarbeit_id); + + $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID()); + if(!$zugeordnet) { + $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'), 'general'); + } + + $result = $this->PaabgabeModel->insert( + 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') + ) + ); + + $dataAbgabe = $this->getDataOrTerminateWithError($result, 'general'); + + $abgaben[]= getData($this->PaabgabeModel->load($dataAbgabe))[0]; + } + + $this->logLib->logInfoDB(array('serientermin angelegt',$res, getAuthUID(), getAuthPersonId())); + + $this->terminateWithSuccess($abgaben); + } + + /** + * called by Abgabetool/Deadlines + * fetches the next upcoming abgabtermine for a given betreuer person_id + * resembles the legacy abgabetool functionality of "show deadlines" + */ + public function fetchDeadlines() { + $person_id = $this->input->post('person_id'); + + if ($person_id === NULL || trim((string)$person_id) === '') { + $person_id = getAuthPersonId(); + } + + if($person_id !== getAuthPersonId()) { + $this->load->library('PermissionLib'); + $isAdmin = $this->permissionlib->isBerechtigt('admin'); + if(!$isAdmin) $this->terminateWithError($this->p->t('ui', 'keineBerechtigung'), 'general'); + } + + $this->load->model('education/Paabgabe_model', 'PaabgabeModel'); + $result = $this->PaabgabeModel->getDeadlines($person_id); + $data = $this->getDataOrTerminateWithError($result, 'general'); + + $this->terminateWithSuccess($data); + } + + /** + * called by Abgabetool/Mitarbeiter & Abgabetool/Assistenz + * fetches all available paabgabetypen to enable a logical selection of them + * based on active status and role assistenz/betreuer + */ + public function getPaAbgabetypen() { + $this->load->model('education/Paabgabetyp_model', 'PaabgabetypModel'); + + $result = $this->PaabgabetypModel->getAll(); + $paabgabetypen = $this->getDataOrTerminateWithError($result, 'general'); + + + $this->terminateWithSuccess($paabgabetypen); + } + + /** + * helper function to fetch the correct email for a projektarbeits erstbetreuer + */ + private function getProjektbetreuerEmailByProjektarbeitID($projektarbeit_id) { + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + $result = $this->ProjektarbeitModel->getProjektbetreuerEmail($projektarbeit_id); + $email = $this->getDataOrTerminateWithError($result, 'general'); + + return $email[0]->uid ? $email[0]->uid.'@'.DOMAIN : $email[0]->private_email; + + } + + /** + * helper function to fetch the correct email for a projektarbeits zweitbetreuer by their person id + * can be used for erstbetreuer aswell if necessary + */ + private function getProjektbetreuerEmailByPersonID($person_id) { + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + $result = $this->ProjektarbeitModel->getProjektbetreuerEmailByPersonID($person_id); + $email = $this->getDataOrTerminateWithError($result, 'general'); + + return $email[0]->uid ? $email[0]->uid.'@'.DOMAIN : $email[0]->private_email; + } + + //TODO: SWITCH TO NOTEN API ONCE NOTENTOOL IS IN MASTER TO AVOID DUPLICATE API + + /** + * GET METHOD + * returns List of all available & active NotenOptions + */ + public function getNoten() { + $this->load->model('education/Note_model', 'NoteModel'); + + $result = $this->NoteModel->getAllActive(); + $noten = $this->getDataOrTerminateWithError($result, 'general'); + + $allowed_noten_abgabetool = $this->config->item('ALLOWED_NOTEN_ABGABETOOL'); + + $nonfinal_noten_abgabetool = $this->config->item('NONFINAL_NOTEN_ABGABETOOL'); + + + $this->terminateWithSuccess(array($noten, $allowed_noten_abgabetool, $nonfinal_noten_abgabetool)); + } + + /** + * helper function to send a sancho mail to students if a betreuer or assistenz grades a quality gate + * termin as negative (nicht bestanden) + */ + private function sendQualGateNegativEmail($projektarbeit_id, $betreuer_person_id, $paabgabe) { + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + + $result = $this->ProjektarbeitModel->load($projektarbeit_id); + $projektarbeitArr = $this->getDataOrTerminateWithError($result, 'general'); + $projektarbeit = $projektarbeitArr[0]; + + $result = $this->ProjektarbeitModel->getProjektbetreuerAnrede($betreuer_person_id); + $anredeArr = $this->getDataOrTerminateWithError($result, 'general'); + $anrede = $anredeArr[0]; + + $student_uid = $projektarbeit->student_uid; + + $this->load->model('education/Paabgabetyp_model', 'PaabgabetypModel'); + $result = $this->PaabgabetypModel->load($paabgabe->paabgabetyp_kurzbz); + $paabgabetyp_kurzbzArr = $this->getDataOrTerminateWithError($result, 'general'); + $paabgabetyp_kurzbz = $paabgabetyp_kurzbzArr[0]; + + // Mail an Student wenn Qualgate negativ beurteilt wurde + $this->load->model('crm/Student_model', 'StudentModel'); + $result = $this->StudentModel->load([$student_uid]); + $studentArr = $this->getDataOrTerminateWithError($result, 'general'); + $student = $studentArr[0]; + + if(!$student) { + $this->terminateWithError($this->p->t('abgabetool','c4userNichtGefunden'), 'general'); + } + + $subject = $this->p->t('abgabetool', 'c4qualgateNegativEmailSubjectv2'); + $tomail = $student_uid.'@'.DOMAIN; + + $datetime = new DateTime($paabgabe->datum); + $dateEmailFormatted = $datetime->format('d.m.Y'); + + $data = array( + 'betreuerfullname' => $anrede->first, + 'qualgatebezeichnung' => $paabgabetyp_kurzbz->bezeichnung, + 'datum' => $dateEmailFormatted, + 'projektarbeitname' => $projektarbeit->titel + ); + + // students still get theirs on event, since it is very unlikely that this + // leads to spam on their end + + $mailres = sendSanchoMail( + 'QualGateNegativ', + $data, + $tomail, + $subject + ); + + } + + /** + * tabulator tabledata fetch for abgabetool/assistenz + * initially fetches all ungraded projektarbeiten with all their abgabetermine + */ + public function getProjektarbeitenForStudiengang() { + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + + $studiengang_kz = $this->input->get("studiengang_kz", TRUE); + $benotet = $this->input->get("benotet", TRUE); + + if ($studiengang_kz === NULL || trim((string)$studiengang_kz) === '') { + $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); + } + + // TODO: recheck getSTGEntitlement here! + $stg_allowed = $this->permissionlib->getSTG_isEntitledFor('basis/abgabe_assistenz:rw'); + if($stg_allowed == false) { + $this->terminateWithError($this->p->t('ui', 'keineBerechtigung'), 'general'); + } + + // check if provided studiengang_kz is included in stg_allowed to proceed + if(!in_array($studiengang_kz, $stg_allowed)) { + $this->terminateWithError($this->p->t('ui', 'keineBerechtigung'), 'general'); + } + + $result = $this->ProjektarbeitModel->getProjektarbeitenForStudiengang($studiengang_kz, $benotet); + $projektarbeiten = $this->getDataOrTerminateWithError($result, 'general'); + + if(count($projektarbeiten) == 0) { // avoid further abgabetermin queries if the are no projektarbeiten + $this->terminateWithSuccess(array($projektarbeiten, DOMAIN)); + } + + $mapFunc = function($projektarbeit) { + return $projektarbeit->projektarbeit_id; + }; + $projektarbeiten_ids = array_map($mapFunc, $projektarbeiten); + + $ret = $this->ProjektarbeitModel->getProjektarbeitenAbgabetermine($projektarbeiten_ids); + $projektabgaben = $this->getDataOrTerminateWithError($ret, 'general'); + + // map the abgaben into projektarbeiten + foreach($projektarbeiten as $projektarbeit) { + $projektarbeit->betreuer_mail = $this->getProjektbetreuerEmailByProjektarbeitID($projektarbeit->projektarbeit_id); + + if($projektarbeit->zweitbetreuer_person_id !== null) { + $projektarbeit->zweitbetreuer_mail = $this->getProjektbetreuerEmailByPersonID($projektarbeit->zweitbetreuer_person_id); + } + + $filterFunc = function($projektabgabe) use ($projektarbeit) { + return $projektabgabe->projektarbeit_id == $projektarbeit->projektarbeit_id; + }; + + $projektarbeit->abgabetermine = array_values(array_filter($projektabgaben, $filterFunc)); + } + + $this->terminateWithSuccess(array($projektarbeiten, DOMAIN)); + } + + // TODO: this could be in a generic info controller and reused + /** + * GET METHOD + * returns List of all studiengang_kz a user has the assigned permission 'basis/abgabe_assistenz:rw' for + * used in Abgabetool/Assistenz to populate Studiengang Dropdown + */ + public function getStudiengaenge() { + $this->load->library('PermissionLib'); + + $stg_allowed = $this->permissionlib->getSTG_isEntitledFor('basis/abgabe_assistenz:rw'); + + if($stg_allowed == false) { + $this->terminateWithError($this->p->t('ui', 'keineBerechtigung'), 'general'); + } + + $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); + + $result = $this->StudiengangModel->getStudiengaengeFiltered($stg_allowed); + $data = $this->getDataOrTerminateWithError($result, 'general'); + + $this->terminateWithSuccess($data); + } + + /** + * GET METHOD + * endpoint to download the abgabe of a paabgabe termin zwischenabgabe or endupload + */ + public function getStudentProjektarbeitAbgabeFile() + { + $this->load->helper('download'); + + $projektarbeit_id = $this->input->get('projektarbeit_id'); + $paabgabe_id = $this->input->get('paabgabe_id'); + $student_uid = $this->input->get('student_uid'); + + if ($paabgabe_id === NULL || trim((string)$paabgabe_id) === '' + || $projektarbeit_id === NULL || trim((string)$projektarbeit_id) === '' + || $student_uid === NULL || trim((string)$student_uid) === '') { + $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); + } + + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + + // zuordnung function is supposed for mitarbeiter_uids, students should be allowed to download their own files + // without adapting zuordnung logic + $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID()); + if(getAuthUID() == $student_uid || $zugeordnet) { + $file_path = PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf'; + + + if(file_exists($file_path)) { + $this->terminateWithFileOutput('application/octet-stream', file_get_contents($file_path), basename($file_path)); + } else { + $this->terminateWithError('File not found', 'general'); + } + } else { + $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'), 'general'); + } + } + + /** + * POST METHOD + * endpoint to enable Assistenz/Betreuer to edit the zusatzdate of a projektarbeit, in case the student somehow + * can't do it themself + */ + public function postStudentProjektarbeitZusatzdaten(){ + $projektarbeit_id = $this->input->post('projektarbeit_id'); + $sprache = $this->input->post('sprache'); + $abstract = $this->input->post('abstract'); + $abstract_en = $this->input->post('abstract_en'); + $schlagwoerter = $this->input->post('schlagwoerter'); + $schlagwoerter_en = $this->input->post('schlagwoerter_en'); + $seitenanzahl = $this->input->post('seitenanzahl'); + + if ($projektarbeit_id === NULL || trim((string)$projektarbeit_id) === '' + || $sprache === NULL || trim((string)$sprache) === '' + || $seitenanzahl === NULL || trim((string)$seitenanzahl) === '' + || $abstract === NULL || trim((string)$abstract) === '' + || $abstract_en === NULL || trim((string)$abstract_en) === '' + || $schlagwoerter === NULL || trim((string)$schlagwoerter) === '' + || $schlagwoerter_en === NULL || trim((string)$schlagwoerter_en) === '') { + + $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); + } + + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + + + + $result = $this->ProjektarbeitModel->load($projektarbeit_id); + $projektarbeitArr = $this->getDataOrTerminateWithError($result, 'general'); + + if(count($projektarbeitArr) > 0) { + $projektarbeit = $projektarbeitArr[0]; + } else { + $this->terminateWithError($this->p->t('abgabetool','c4projektarbeitNichtGefunden'), 'general'); + } + + $this->checkProjektarbeitForFinishedStatus($projektarbeit_id); + + $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID()); + if(!$zugeordnet) { + $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'), 'general'); + } + + // update projektarbeit cols + $this->ProjektarbeitModel->updateProjektarbeit($projektarbeit_id,$sprache,$abstract,$abstract_en + ,$schlagwoerter, $schlagwoerter_en, $seitenanzahl); + + $this->logLib->logInfoDB(array('zusatzdatenEditMitarbeiter', array( + 'updatevon' => getAuthUID(), + 'updateamum' => date('Y-m-d H:i:s') + ), getAuthUID(), getAuthPersonId(), array($projektarbeit_id,$sprache,$abstract,$abstract_en + ,$schlagwoerter, $schlagwoerter_en, $seitenanzahl))); + + $result = $this->ProjektarbeitModel->load($projektarbeit_id); + + $this->terminateWithSuccess($result); + } + + // used to lazy load signatur status for assistenzen, since they could run into very long fetch times + // since they fetch the projektarbeiten with paabgaben included and could have a lot of huge endupload files + // in their stg resulting in huge loading times -> use this api call on opening detail component instead + public function getSignaturStatusForProjektarbeitAbgaben() { + $paabgabe_ids = $this->input->post('paabgabe_ids'); + $student_uid = $this->input->post('student_uid'); + + if ($paabgabe_ids === NULL || $student_uid === NULL || trim((string)$student_uid) === '') { + $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); + } + + $this->load->model('education/Paabgabe_model', 'PaabgabeModel'); + + $result = $this->PaabgabeModel->loadByIDs($paabgabe_ids); + $data = $this->getDataOrTerminateWithError($result); + + foreach($data as $paabgabetermin) { + $this->checkAbgabeSignatur($paabgabetermin, $student_uid); + } + + $this->terminateWithSuccess($data); + } + + /** + * 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; + } + } + + private function sendUploadEmail($bperson_id, $projektarbeit_id, $paabgabetyp_kurzbz, $student_uid) { + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + + $resBetr = $this->ProjektarbeitModel->getProjektbetreuerAnrede($bperson_id); + + + $result = $this->ProjektarbeitModel->load($projektarbeit_id); + $projektarbeitArr = $this->getDataOrTerminateWithError($result, 'general'); + + if(count($projektarbeitArr) > 0) { + $projektarbeit = $projektarbeitArr[0]; + } else { + $this->terminateWithError($this->p->t('abgabetool','c4projektarbeitNichtGefunden'), 'general'); + } + + $projektarbeitIsCurrent = false; + $returnFunc = function ($result) use (&$projektarbeitIsCurrent) { + $projektarbeitIsCurrent = $result; + }; + Events::trigger('projektarbeit_is_current', $projektarbeit_id, $returnFunc); + if(!$projektarbeitIsCurrent) { + $this->terminateWithError($this->p->t('abgabetool','c4fehlerAktualitaetProjektarbeit'), 'general'); + } + + // Link to Abgabetool + if (defined('CIS4') && CIS4) { + $ci3BootstrapFilePath = "cis.php"; + } else { + $ci3BootstrapFilePath = "index.ci.php"; + } + + $path = $this->config->item('URL_MITARBEITER'); + $url = APP_ROOT.$path; + + // getProjektbetreuerAnrede fetches distinct on person_id, so there should be one row. zweitbetreuer is handled seperately afterwards + foreach($resBetr->retval as $betreuerRow) { + + // query student benutzer view for every betreuer row + $studentUser = $this->ProjektarbeitModel->getProjektarbeitBenutzer($student_uid)->retval[0]; + + // 1. Begutachter mail ohne Token + $mail_baselink = APP_ROOT.$this->config->item('PROJEKTARBEITSBEURTEILUNG_MAIL_BASELINK_ERSTBEGUTACHTER'); +// $mail_baselink = APP_ROOT."index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/ProjektarbeitsbeurteilungErstbegutachter"; + $mail_fulllink = "$mail_baselink?projektarbeit_id=".$projektarbeit_id."&uid=".$studentUser->uid; + $projekttyp_kurzbz = $projektarbeit->projekttyp_kurzbz; + $subject = $projektarbeit->projekttyp_kurzbz == 'Diplom' ? 'Masterarbeitsbetreuung' : 'Bachelorarbeitsbetreuung'; + $abgabetyp = $paabgabetyp_kurzbz == 'end' ? 'Endabgabe' : 'Zwischenabgabe'; + + $maildata = array(); + $maildata['geehrt'] = "geehrte".($betreuerRow->anrede=="Herr"?"r":""); + $maildata['anrede'] = $betreuerRow->anrede; + $maildata['betreuer_voller_name'] = $betreuerRow->first; + $maildata['student_anrede'] = $studentUser->anrede; + $maildata['student_voller_name'] = trim($studentUser->titelpre." ".$studentUser->vorname." ".$studentUser->nachname." ".$studentUser->titelpost); + $maildata['abgabetyp'] = $abgabetyp; + $maildata['parbeituebersichtlink'] = "

Zur Projektarbeitsübersicht

"; + $maildata['bewertunglink'] = $projektarbeitIsCurrent && $paabgabetyp_kurzbz == 'end' ? "

Zur Beurteilung der Arbeit

" : ""; + $maildata['token'] = ""; + + $email = $this->getProjektbetreuerEmailByProjektarbeitID($projektarbeit_id); + + if(!$email) $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachter'), 'general'); + + $mailres = sendSanchoMail( + 'ParbeitsbeurteilungEndupload', + $maildata, + $email, + $subject, + 'sancho_header_min_bw.jpg', + 'sancho_footer_min_bw.jpg', + get_uid()."@".DOMAIN); + + if(!$mailres) + { + $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachter'), 'general'); + } + + // 2. Begutachter mail, wenn Endabgabe, mit Token wenn extern + if ($paabgabetyp_kurzbz == 'end') + { + // Zweitbegutachter holen + $this->load->model('education/Projektbetreuer_model', 'ProjektbetreuerModel'); + $zweitbegutachterRetval = getData($this->ProjektbetreuerModel->getZweitbegutachterWithToken($bperson_id, $projektarbeit_id, $studentUser->uid)); + + if ($zweitbegutachterRetval && count($zweitbegutachterRetval) > 0) + { + + foreach ($zweitbegutachterRetval as $begutachter) + { + // token generieren, wenn noch nicht vorhanden und notwendig (wird in methode überprüft) + $tokenGenRes = $this->ProjektbetreuerModel->generateZweitbegutachterToken($begutachter->person_id, $projektarbeit_id); + + if (!$tokenGenRes) + { + $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailZweitBegutachter'), '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'); + } + + $begutachterMitToken = $begutachterMitTokenRetval[0]; + + $path = $begutachterMitToken->betreuerart_kurzbz == 'Zweitbegutachter' ? 'ProjektarbeitsbeurteilungZweitbegutachter' : 'ProjektarbeitsbeurteilungErstbegutachter'; + $mail_baselink = APP_ROOT."index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/$path"; + $mail_fulllink = "$mail_baselink?projektarbeit_id=".$projektarbeit_id."&uid=".$studentUser->uid; + $intern = isset($begutachterMitToken->uid); + $mail_link = $intern ? $mail_fulllink : $mail_baselink; + + $zweitbetmaildata = array(); + $zweitbetmaildata['geehrt'] = "geehrte" . ($begutachterMitToken->anrede == "Herr" ? "r" : ""); + $zweitbetmaildata['anrede'] = $begutachterMitToken->anrede; + $zweitbetmaildata['betreuer_voller_name'] = $begutachterMitToken->voller_name; + $zweitbetmaildata['student_anrede'] = $maildata['student_anrede']; + $zweitbetmaildata['student_voller_name'] = $maildata['student_voller_name']; + $zweitbetmaildata['abgabetyp'] = $abgabetyp; + $zweitbetmaildata['parbeituebersichtlink'] = $intern ? $maildata['parbeituebersichtlink'] : ""; + $zweitbetmaildata['bewertunglink'] = $projektarbeitIsCurrent ? "

Zur Beurteilung der Arbeit

" : ""; + $zweitbetmaildata['token'] = $projektarbeitIsCurrent && isset($begutachterMitToken->zugangstoken) && !$intern ? "

Zugangstoken: " . $begutachterMitToken->zugangstoken . "

" : ""; + + $mailres = sendSanchoMail( + 'ParbeitsbeurteilungEndupload', + $zweitbetmaildata, + $begutachterMitToken->email, + $subject, + 'sancho_header_min_bw.jpg', + 'sancho_footer_min_bw.jpg', + get_uid()."@".DOMAIN + ); + + if (!$mailres) + { + $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachter'), 'general'); + } + + } + } + } + } + } + + private function checkZuordnung($projektarbeit_id, $betreuer_uid) { + // check if authenticated user is zugewiesen as betreuer to projektarbeit or has admin/assistenz berechtigung + // over the studiengang of the student working on that projektarbeit_id + + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + + $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id); + if(isError($res)) { + $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general'); + } + + if(!hasData($res)) { + $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general'); + } + $data = getData($res)[0]; + $student_uid = $data->uid; + $studiengang_kz = $data->studiengang_kz; + + $res = $this->ProjektarbeitModel->checkZuordnung($student_uid, $betreuer_uid); + if(isError($res)) { + $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingBetreuerStudentZuordnung'), 'general'); + } + + // if this is true betreuer has zuordnung to the given $projektarbeit_id and conversely the $student_uid + // assigned to that project + if(hasData($res)) { + return true; + } else { + $berechtigt = $this->ProjektarbeitModel->hasBerechtigungForProjektarbeit($projektarbeit_id); + if($berechtigt) { + return true; + } + + // otherwhise if there is no zuordnung via global admin or assistenz berechtigung, + // check if the given uid has permissions over the studiengang of the student + // via the abgabetool specific berechtigungen + // 'basis/abgabe_assistenz:rw' OR 'basis/abgabe_lektor:rw' + + if ($this->permissionlib->isBerechtigt('basis/abgabe_assistenz', 'suid', $studiengang_kz)) { + return true; + } + + if ($this->permissionlib->isBerechtigt('basis/abgabe_lektor', 'suid', $studiengang_kz)){ + return true; + } + } + + return false; + } + + private function getProjektarbeitIDForPaabgabeID($paabgabe_id) { + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + + $res = $this->ProjektarbeitModel->getProjektarbeitByPaabgabeID($paabgabe_id); + if(isError($res)) { + $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingProjektarbeitForPaabgabeID'), 'general'); + } + + if(!hasData($res)) { + $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedProjektarbeitForPaabgabeID'), 'general'); + } + $data = getData($res)[0]; + return $data->projektarbeit_id; + } + + private function checkZuordnungByPaabgabe($paabgabe_id, $betreuer_uid) { + $projektarbeit_id = $this->getProjektarbeitIDForPaabgabeID($paabgabe_id); + return $this->checkZuordnung($projektarbeit_id, $betreuer_uid); + } + + // loads a projektarbeit table row by id and looks if a note has been set. A non null note field + // currently indicates that a projektarbeit has been finished and should not accept further crud manipulation + private function checkProjektarbeitForFinishedStatus($projektarbeit_id) { + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + $res = $this->ProjektarbeitModel->load($projektarbeit_id); + + if(isError($res) || !hasData($res)) { + $this->terminateWithError($this->p->t('abgabetool','c4projektarbeitNichtGefunden'), 'general'); + } + + $data = getData($res)[0]; + if($data->note !== NULL) { + $this->terminateWithError($this->p->t('abgabetool','c4fehlerAktualitaetProjektarbeit'), 'general'); + } + } + +} \ No newline at end of file diff --git a/application/controllers/api/frontend/v1/Documents.php b/application/controllers/api/frontend/v1/Documents.php index 2d2c410cf..7b2fc4a15 100644 --- a/application/controllers/api/frontend/v1/Documents.php +++ b/application/controllers/api/frontend/v1/Documents.php @@ -442,6 +442,10 @@ class Documents extends FHCAPI_Controller 'betreuerart_kurzbz', 'studiensemester_kurzbz' ] as $key) { + if (in_array($xsl, array('Ausbildungsver', 'AusbVerEng')) && $key === 'uid') + { + continue; + } $value = $this->input->post_get($key); if ($value !== null) $params .= '&' . $key . '=' . urlencode($value); diff --git a/application/controllers/api/frontend/v1/Lehre.php b/application/controllers/api/frontend/v1/Lehre.php index d5d0282bd..10d945a3e 100644 --- a/application/controllers/api/frontend/v1/Lehre.php +++ b/application/controllers/api/frontend/v1/Lehre.php @@ -38,34 +38,9 @@ class Lehre extends FHCAPI_Controller parent::__construct([ 'lvStudentenMail' => self::PERM_LOGGED, 'LV' => self::PERM_LOGGED, - 'Pruefungen' => self::PERM_LOGGED, - 'getStudentProjektarbeiten' => self::PERM_LOGGED, // TODO: abgabetool berechtigung? - 'getStudentProjektabgaben' => self::PERM_LOGGED, - 'postStudentProjektarbeitZwischenabgabe' => self::PERM_LOGGED, - 'postStudentProjektarbeitEndupload' => self::PERM_LOGGED, - 'getMitarbeiterProjektarbeiten' => self::PERM_LOGGED, - 'postProjektarbeitAbgabe' => self::PERM_LOGGED, - 'deleteProjektarbeitAbgabe' => self::PERM_LOGGED, - 'postSerientermin' => self::PERM_LOGGED, - 'fetchDeadlines' => self::PERM_LOGGED // TODO: mitarbeiter recht prüfen + 'Pruefungen' => self::PERM_LOGGED ]); - - $this->load->library('PhrasesLib'); - - $this->loadPhrases( - array( - 'global', - 'ui', - 'abgabetool' - ) - ); - - $this->load->helper('hlp_sancho_helper'); - require_once(FHCPATH . 'include/studiengang.class.php'); - require_once(FHCPATH . 'include/student.class.php'); - require_once(FHCPATH . 'include/projektarbeit.class.php'); - require_once(FHCPATH . 'include/projektbetreuer.class.php'); } //------------------------------------------------------------------------------------------------------------------ @@ -125,557 +100,5 @@ class Lehre extends FHCAPI_Controller $this->terminateWithSuccess($result); } - - /** - * fetches all projektabgabetermine for a given projektarbeit_id used in cis4 student abgabetool - */ - public function getStudentProjektabgaben() { - $projektarbeit_id = $this->input->get("projektarbeit_id",TRUE); - - // TODO: error messages - - if (!isset($projektarbeit_id) || isEmptyString($projektarbeit_id)) - $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); - - $projektarbeit_obj = new projektarbeit(); - if($projektarbeit_id==-1) - $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); - - if(!$projektarbeit_obj->load($projektarbeit_id)) - $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); - - $paIsCurrent = $projektarbeit_obj->projektarbeitIsCurrent($projektarbeit_id); - - $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); - $ret = $this->ProjektarbeitModel->getProjektarbeitAbgabetermine($projektarbeit_id); - - // TODO: fetch zweitbetreuer - - $this->terminateWithSuccess(array($ret, $paIsCurrent)); - } - - /** - * fetches all projektarbeiten and betreuer for a given student_uid used in cis4 student abgabetool - */ - public function getStudentProjektarbeiten($uid) - { - $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel'); - $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); - - if (!isset($uid) || isEmptyString($uid)) - $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); - - $isZugeteilterBetreuer = count($this->ProjektarbeitModel->checkZuordnung($uid, getAuthUID())->retval) > 0; - $this->addMeta('isZugeteilterBetreuer', $isZugeteilterBetreuer); - $isMitarbeiter = $this->MitarbeiterModel->isMitarbeiter(getAuthUID()); - - if ($isMitarbeiter && $isZugeteilterBetreuer){ - $projektarbeiten = $this->ProjektarbeitModel->getStudentProjektarbeitenWithBetreuer($uid); - } else { - $projektarbeiten = $this->ProjektarbeitModel->getStudentProjektarbeitenWithBetreuer(getAuthUID()); - } - - $this->terminateWithSuccess(array($projektarbeiten, DOMAIN, $uid)); - } - - - - /** - * projektarbeit - upload for zwischenabgaben in cis4 student abgabetool - */ - public function postStudentProjektarbeitZwischenabgabe() - { - - $projektarbeit_id = $_POST['projektarbeit_id']; - $paabgabe_id = $_POST['paabgabe_id']; - $student_uid = $_POST['student_uid']; - $bperson_id = $_POST['bperson_id']; - $paabgabetyp_kurzbz = $_POST['paabgabetyp_kurzbz']; - - if (!isset($projektarbeit_id) || isEmptyString($projektarbeit_id) - || !isset($paabgabe_id) || isEmptyString($paabgabe_id) - || !isset($student_uid) || isEmptyString($student_uid) - || !isset($paabgabetyp_kurzbz) || isEmptyString($paabgabetyp_kurzbz)) - $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); - - if ((isset($_FILES) and isset($_FILES['file']) and ! $_FILES['file']['error'])) { - move_uploaded_file($_FILES['file']['tmp_name'], PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf'); - - if(file_exists(PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf')) { - - exec('chmod 640 "'.PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf'.'"'); - - $this->load->model('education/Paabgabe_model', 'PaabgabeModel'); - $res = $this->PaabgabeModel->update($paabgabe_id, array( - 'abgabedatum' => date('Y-m-d'), - 'updatevon' => getAuthUID(), - 'updateamum' => date('Y-m-d H:i:s') - )); - - $this->sendUploadEmail($bperson_id, $projektarbeit_id, $paabgabetyp_kurzbz, $student_uid); - $this->terminateWithSuccess($res); - } else { - $this->terminateWithError('Error moving File'); - } - - } else { - $this->terminateWithError('File missing'); - } - - } - - /** - * upload für finale abgaben aka Endupload in cis4 student abgabetool - */ - public function postStudentProjektarbeitEndupload() - { - - $projektarbeit_id = $_POST['projektarbeit_id']; - $paabgabe_id = $_POST['paabgabe_id']; - $student_uid = $_POST['student_uid']; - $sprache = $_POST['sprache']; - $abstract = $_POST['abstract']; - $abstract_en = $_POST['abstract_en']; - $schlagwoerter = $_POST['schlagwoerter']; - $schlagwoerter_en = $_POST['schlagwoerter_en']; - $seitenanzahl = $_POST['seitenanzahl']; - $bperson_id = $_POST['bperson_id']; - $paabgabetyp_kurzbz = $_POST['paabgabetyp_kurzbz']; - - if (!isset($projektarbeit_id) || isEmptyString($projektarbeit_id) - || !isset($paabgabe_id) || isEmptyString($paabgabe_id) - || !isset($student_uid) || isEmptyString($student_uid) - || !isset($paabgabetyp_kurzbz) || isEmptyString($paabgabetyp_kurzbz)) - $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); - - // TODO: maybe check for other params aswell? - - if ((isset($_FILES) and isset($_FILES['file']) and ! $_FILES['file']['error'])) { - move_uploaded_file($_FILES['file']['tmp_name'], PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf'); - - if(file_exists(PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf')) { - - // Loads Libraries - $this->load->library('SignatureLib'); - - // Check if the document is signed - $signaturVorhanden = true; - $signList = SignatureLib::list(PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf'); - if (is_array($signList) && count($signList) > 0) - { - // The document is signed - $uploadedDocumentSigned = 'The document is signed'; - } - elseif ($signList === null) - { - $uploadedDocumentSigned = 'WARNING: signature server error'; - } - else - { - $signaturVorhanden = false; - $uploadedDocumentSigned = 'No document signature found'; - } - $this->addMeta('signaturInfo', $uploadedDocumentSigned); - - if ($signaturVorhanden === false) - { - $this->signaturFehltEmail($student_uid); - } - - // TODO error handle get data has data the updates - // update projektarbeit cols - $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); - $this->ProjektarbeitModel->updateProjektarbeit($projektarbeit_id,$sprache,$abstract,$abstract_en - ,$schlagwoerter, $schlagwoerter_en, $seitenanzahl); - - - // update paabgabe datum - $this->load->model('education/Paabgabe_model', 'PaabgabeModel'); - $res = $this->PaabgabeModel->update($paabgabe_id, array( - 'abgabedatum' => date('Y-m-d'), - 'updatevon' => getAuthUID(), - 'updateamum' => date('Y-m-d H:i:s') - )); - - $this->sendUploadEmail($bperson_id, $projektarbeit_id, $paabgabetyp_kurzbz, $student_uid); - - $this->terminateWithSuccess($res); - } else { - $this->terminateWithError('Error moving File'); - } - - } else { - $this->terminateWithError('File missing'); - } - - } - - private function signaturFehltEmail($student_uid) { - - - // Mail an Studiengang wenn keine Signatur gefunden wurde - $student = new student(); - if(!$student->load($student_uid)) - $this->terminateWithError($this->p->t('global','userNichtGefunden'), 'general'); - - $stg_obj = new studiengang(); - if(!$stg_obj->load($student->studiengang_kz)) - $this->terminateWithError($this->p->t('global','fehlerBeimLesenAusDatenbank'), 'general'); - - $subject = 'Abgabe ohne Signatur'; - $tomail = $stg_obj->email; - $data = array( - 'vorname' => $student->vorname, - 'nachname' => $student->nachname, - 'studiengang' => $stg_obj->bezeichnung - ); - - $mailres = sendSanchoMail( - 'ParbeitsbeurteilungSiganturFehlt', - $data, - $tomail, - $subject, - 'sancho_header_min_bw.jpg', - 'sancho_footer_min_bw.jpg' - ); - } - - private function sendUploadEmail($bperson_id, $projektarbeit_id, $paabgabetyp_kurzbz, $student_uid) { - - $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); - - $resBetr = $this->ProjektarbeitModel->getProjektbetreuerAnrede($bperson_id); - - $projektarbeit_obj = new projektarbeit(); - - if(!$projektarbeit_obj->load($projektarbeit_id)) - $this->terminateWithError('Ungueltiger Eintrag'); - - $num_rows_sem = $projektarbeit_obj->projektarbeitIsCurrent($projektarbeit_id); - - if( null === $num_rows_sem || false === $num_rows_sem ) - { - $this->terminateWithError($this->p->t('abgabetool','fehlerAktualitaetProjektarbeit'), 'general'); - } - - foreach($resBetr->retval as $betreuerRow) { - - // query student benutzer view for every betreuer row - $studentUser = $this->ProjektarbeitModel->getProjektarbeitBenutzer($student_uid)->retval[0]; - - // TODO: hasdata, getData etc - - // 1. Begutachter mail ohne Token - $mail_baselink = APP_ROOT."index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/ProjektarbeitsbeurteilungErstbegutachter"; - $mail_fulllink = "$mail_baselink?projektarbeit_id=".$projektarbeit_id."&uid=".$studentUser->uid; - $projekttyp_kurzbz = $projektarbeit_obj->projekttyp_kurzbz; - $subject = $projektarbeit_obj->projekttyp_kurzbz == 'Diplom' ? 'Masterarbeitsbetreuung' : 'Bachelorarbeitsbetreuung'; - $abgabetyp = $paabgabetyp_kurzbz == 'end' ? 'Endabgabe' : 'Zwischenabgabe'; - - $maildata = array(); - $maildata['geehrt'] = "geehrte".($betreuerRow->anrede=="Herr"?"r":""); - $maildata['anrede'] = $betreuerRow->anrede; - $maildata['betreuer_voller_name'] = $betreuerRow->first; - $maildata['student_anrede'] = $studentUser->anrede; - $maildata['student_voller_name'] = trim($studentUser->titelpre." ".$studentUser->vorname." ".$studentUser->nachname." ".$studentUser->titelpost); - $maildata['abgabetyp'] = $abgabetyp; - $maildata['parbeituebersichtlink'] = "

Zur Projektarbeitsübersicht

"; - $maildata['bewertunglink'] = $num_rows_sem >= 1 && $paabgabetyp_kurzbz == 'end' ? "

Zur Beurteilung der Arbeit

" : ""; - $maildata['token'] = ""; - - $mailres = sendSanchoMail( - 'ParbeitsbeurteilungEndupload', - $maildata, - $betreuerRow->mitarbeiter_uid."@".DOMAIN, - $subject, - 'sancho_header_min_bw.jpg', - 'sancho_footer_min_bw.jpg', - get_uid()."@".DOMAIN); - - if(!$mailres) - { - $this->terminateWithError($this->p->t('abgabetool', 'fehlerMailBegutachter'), 'general'); - } - - // 2. Begutachter mail, wenn Endabgabe, mit Token wenn extern - if ($paabgabetyp_kurzbz == 'end') - { - // Zweitbegutachter holen - $zweitbegutachter = new projektbetreuer(); - $zweitbegutachterRes = $zweitbegutachter->getZweitbegutachterWithToken($bperson_id, $projektarbeit_id, $studentUser->uid); - - if ($zweitbegutachterRes) - { - $zweitbegutachterResults = $zweitbegutachter->result; - - foreach ($zweitbegutachterResults as $begutachter) - { - // token generieren, wenn noch nicht vorhanden und notwendig (wird in methode überprüft) - $tokenGenRes = $zweitbegutachter->generateZweitbegutachterToken($begutachter->person_id, $projektarbeit_id); - - if (!$tokenGenRes) - { - $this->terminateWithError($this->p->t('abgabetool', 'fehlerMailZweitBegutachter'), 'general'); - } - - // Zweitbegutachter (evtl. mit Token) holen - $zweitbegutachterMitToken = new projektbetreuer(); - $begutachterMitTokenRes = $zweitbegutachterMitToken->getZweitbegutachterWithToken($bperson_id, $projektarbeit_id, $studentUser->uid, $begutachter->person_id); - - if (!$begutachterMitTokenRes) - { - $this->terminateWithError($this->p->t('abgabetool', 'fehlerMailZweitBegutachter'), 'general'); - } - - // Email an Zweitbegutachter senden - if (isset($zweitbegutachterMitToken->result[0])) - { - $begutachterMitToken = $zweitbegutachterMitToken->result[0]; - - $path = $begutachterMitToken->betreuerart_kurzbz == 'Zweitbegutachter' ? 'ProjektarbeitsbeurteilungZweitbegutachter' : 'ProjektarbeitsbeurteilungErstbegutachter'; - $mail_baselink = APP_ROOT."index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/$path"; - $mail_fulllink = "$mail_baselink?projektarbeit_id=".$projektarbeit_id."&uid=".$studentUser->uid; - $intern = isset($begutachterMitToken->uid); - $mail_link = $intern ? $mail_fulllink : $mail_baselink; - - $zweitbetmaildata = array(); - $zweitbetmaildata['geehrt'] = "geehrte" . ($begutachterMitToken->anrede == "Herr" ? "r" : ""); - $zweitbetmaildata['anrede'] = $begutachterMitToken->anrede; - $zweitbetmaildata['betreuer_voller_name'] = $begutachterMitToken->voller_name; - $zweitbetmaildata['student_anrede'] = $maildata['student_anrede']; - $zweitbetmaildata['student_voller_name'] = $maildata['student_voller_name']; - $zweitbetmaildata['abgabetyp'] = $abgabetyp; - $zweitbetmaildata['parbeituebersichtlink'] = $intern ? $maildata['parbeituebersichtlink'] : ""; - $zweitbetmaildata['bewertunglink'] = $num_rows_sem >= 1 ? "

Zur Beurteilung der Arbeit

" : ""; - $zweitbetmaildata['token'] = $num_rows_sem >= 1 && isset($begutachterMitToken->zugangstoken) && !$intern ? "

Zugangstoken: " . $begutachterMitToken->zugangstoken . "

" : ""; - - $mailres = sendSanchoMail( - 'ParbeitsbeurteilungEndupload', - $zweitbetmaildata, - $begutachterMitToken->email, - $subject, - 'sancho_header_min_bw.jpg', - 'sancho_footer_min_bw.jpg', - get_uid()."@".DOMAIN - ); - - if (!$mailres) - { - $this->terminateWithError($this->p->t('abgabetool', 'fehlerMailBegutachter'), 'general'); - } - } - } - } - } - } - } - - public function getMitarbeiterProjektarbeiten() { - $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); - - $boolParamStr = $this->input->get('showall'); - $trueStrings = ['true', '1']; - $falseStrings = ['false', '0']; - - // Handle missing or invalid parameter - if ($boolParamStr === null) { - $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); - } - $boolParamStrLower = strtolower($boolParamStr); - - if (in_array($boolParamStrLower, $trueStrings, true)) { - $showAllBool = true; - } elseif (in_array($boolParamStrLower, $falseStrings, true)) { - $showAllBool = false; - } else { -// $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); - } - - $projektarbeiten = $this->ProjektarbeitModel->getMitarbeiterProjektarbeiten(getAuthUID(), $showAllBool); - - $this->terminateWithSuccess(array($projektarbeiten, DOMAIN)); - } - - public function postProjektarbeitAbgabe() { - $projektarbeit_id = $_POST['projektarbeit_id']; - $paabgabe_id = $_POST['paabgabe_id']; - $paabgabetyp_kurzbz = $_POST['paabgabetyp_kurzbz']; - $datum = $_POST['datum']; - $fixtermin = $_POST['fixtermin']; - $kurzbz = $_POST['kurzbz']; - - if (!isset($projektarbeit_id) || isEmptyString($projektarbeit_id) - || !isset($paabgabe_id) || isEmptyString($paabgabe_id) - || !isset($datum) || isEmptyString($datum) - || !isset($datum) || isEmptyString($datum) - || !isset($paabgabetyp_kurzbz) || isEmptyString($paabgabetyp_kurzbz)) - $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); - - $this->load->model('education/Paabgabe_model', 'PaabgabeModel'); - - if($paabgabe_id == -1) { - $result = $this->PaabgabeModel->insert( - array( - 'projektarbeit_id' => $projektarbeit_id, - 'paabgabetyp_kurzbz' => $paabgabetyp_kurzbz, - 'fixtermin' => $fixtermin, - 'datum' => $datum, - 'kurzbz' => $kurzbz, - 'insertvon' => getAuthUID(), - 'insertamum' => date('Y-m-d H:i:s') - ) - ); - - $this->terminateWithSuccess($result); - } else { - $result = $this->PaabgabeModel->update( - $paabgabe_id, - array( - 'paabgabetyp_kurzbz' => $paabgabetyp_kurzbz, - 'datum' => $datum, - 'kurzbz' => $kurzbz, - 'updatevon' => getAuthUID(), - 'updateamum' => date('Y-m-d H:i:s') - ) - ); - - $this->terminateWithSuccess($result); - } - } - - public function deleteProjektarbeitAbgabe() { - $paabgabe_id = $_POST['paabgabe_id']; - - if (!isset($paabgabe_id) || isEmptyString($paabgabe_id)) - $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); - - $this->load->model('education/Paabgabe_model', 'PaabgabeModel'); - - $result = $this->PaabgabeModel->load($paabgabe_id); - $result = $this->getDataOrTerminateWithError($result); - - if(count($result) == 0) - $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); - - // TODO: berechtigung? - if($result[0]->insertvon === getAuthUID()) { - $result = $this->PaabgabeModel->delete($paabgabe_id); - $result = $this->getDataOrTerminateWithError($result); - $this->terminateWithSuccess($result); - } - - $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); - } - - /** - * endpoint for adding the same paabgabe for multiple projektarbeiten - * can be slow for large n since it queries twice per projektarbeit_id - */ - public function postSerientermin() { - $projektarbeit_ids = $_POST['projektarbeit_ids']; - $datum = $_POST['datum']; - $paabgabetyp_kurzbz = $_POST['paabgabetyp_kurzbz']; - $bezeichnung = $_POST['bezeichnung']; - $kurzbz = $_POST['kurzbz']; - - if (!isset($projektarbeit_ids) || !is_array($projektarbeit_ids) || empty($projektarbeit_ids) - || !isset($datum) || isEmptyString($datum) - || !isset($kurzbz) || isEmptyString($kurzbz) - || !isset($bezeichnung) || isEmptyString($bezeichnung) - || !isset($paabgabetyp_kurzbz) || isEmptyString($paabgabetyp_kurzbz)) - $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); - - // old script checks if there already are tbl_paabgabe entries with exact date, type & kurzbz - // for each termin - good to check that in principle but should not matter in this place. if necessary - // duplicate abgabetermine can be easily deleted manually, also via cronjob@night. - - // since this entry includes the kurzbz string match, it should have only ever mattered when there were - // multiple users entering the exact same set of (date, type, kurzbz) - which is a much more narrow case than the - // general "saveMultiple" function should handle - - // old script afterwards again queries if user is not the zweitbetreuer of any id - this is blocked in the ui - // and should never unintentionally happen - - // TODO: check berechtigung &/|| zuordnung? - - $this->load->model('education/Paabgabe_model', 'PaabgabeModel'); - $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); - - $res = []; - foreach ($projektarbeit_ids as $projektarbeit_id) { - - $result = $this->PaabgabeModel->insert( - array( - 'projektarbeit_id' => $projektarbeit_id, - 'paabgabetyp_kurzbz' => $paabgabetyp_kurzbz, - 'fixtermin' => false, - 'datum' => $datum, - 'kurzbz' => $kurzbz, - 'insertvon' => getAuthUID(), - 'insertamum' => date('Y-m-d H:i:s') - ) - ); - - $data = $this->getDataOrTerminateWithError($result); - -// $res[] = $data; - - // send mail to student - $result = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id); - $data = $this->getDataOrTerminateWithError($result); - -// $this->addMeta('emaildata'.$projektarbeit_id, $data); - - $datetime = new DateTime($datum); - $dateEmailFormatted = $datetime->format('d.m.Y'); - - $anredeFillString = $data[0]->anrede=="Herr"?"r":""; - - $fullFormattedNameString = trim($data[0]->titelpre." ".$data[0]->vorname." ".$data[0]->nachname." ".$data[0]->titelpost); - $res[] = $fullFormattedNameString; - - // Prepare mail content - $body_fields = array( - 'anrede' => $data[0]->anrede, - 'anredeFillString' => $anredeFillString, - 'datum' => $dateEmailFormatted, - 'bezeichnung' => $bezeichnung, - 'fullFormattedNameString' => $fullFormattedNameString, - 'kurzbz' => $kurzbz - ); - - $email = $data[0]->uid."@".DOMAIN; - - sendSanchoMail( - 'neuerAbgabetermin', - $body_fields, - $email, - $this->p->t('abgabetool', 'neuerTerminBachelorMasterbetreuung') - ); - } - - $this->terminateWithSuccess($res); - - } - - public function fetchDeadlines() { - $person_id = $_POST['person_id']; - - if (!isset($person_id) || isEmptyString($person_id)) - $person_id = getAuthPersonId(); - - - if($person_id !== getAuthPersonId()) { - $this->load->library('PermissionLib'); - $isAdmin = $this->permissionlib->isBerechtigt('admin'); - if(!$isAdmin) $this->terminateWithError($this->p->t('ui', 'keineBerechtigung'), 'general'); - } - - $this->load->model('education/Paabgabe_model', 'PaabgabeModel'); - $result = $this->PaabgabeModel->getDeadlines($person_id); - $data = $this->getDataOrTerminateWithError($result); - - $this->terminateWithSuccess($data); - } } diff --git a/application/controllers/api/frontend/v1/lv/Setup.php b/application/controllers/api/frontend/v1/lv/Setup.php index a2c167dd6..eea4befa5 100644 --- a/application/controllers/api/frontend/v1/lv/Setup.php +++ b/application/controllers/api/frontend/v1/lv/Setup.php @@ -47,22 +47,22 @@ class Setup extends FHCAPI_Controller { $tabs['details'] = array ( 'title' => 'Details', - 'component' => APP_ROOT . 'public/js/components/LVVerwaltung/Tabs/Details.js', + 'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Details.js'), 'config' => [] ); $tabs['gruppen'] = array ( 'title' => 'Gruppen', - 'component' => APP_ROOT . 'public/js/components/LVVerwaltung/Tabs/Gruppen.js', + 'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Gruppen.js'), 'config' => [] ); $tabs['lektor'] = array ( 'title' => 'LektorInnenzuteilung', - 'component' => APP_ROOT . 'public/js/components/LVVerwaltung/Tabs/Lektor.js', + 'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Lektor.js'), 'config' => [] ); $tabs['notiz'] = array ( 'title' => 'Notizen', - 'component' => APP_ROOT . 'public/js/components/LVVerwaltung/Tabs/Notiz.js', + 'component' => absoluteJsImportUrl('public/js/components/LVVerwaltung/Tabs/Notiz.js'), 'config' => [] ); $this->terminateWithSuccess($tabs); diff --git a/application/controllers/api/frontend/v1/messages/Messages.php b/application/controllers/api/frontend/v1/messages/Messages.php index 355fe79a4..3035e532d 100644 --- a/application/controllers/api/frontend/v1/messages/Messages.php +++ b/application/controllers/api/frontend/v1/messages/Messages.php @@ -1,6 +1,5 @@ ['admin:r', 'assistenz:r'], 'getMsgVarsLoggedInUser' => ['admin:r', 'assistenz:r'], 'getNameOfDefaultRecipient' => ['admin:r', 'assistenz:r'], + 'getNameOfDefaultRecipients' => ['admin:r', 'assistenz:r'], 'sendMessage' => ['admin:r', 'assistenz:r'], 'deleteMessage' => ['admin:r', 'assistenz:r'], 'getDataVorlage' => ['admin:r', 'assistenz:r'], @@ -21,6 +21,7 @@ class Messages extends FHCAPI_Controller 'getReplyData' => ['admin:r', 'assistenz:r'], 'getPersonId' => ['admin:r', 'assistenz:r'], 'getUid' => ['admin:r', 'assistenz:r'], + 'getUids' => ['admin:r', 'assistenz:r'], ]); //Load Models @@ -37,7 +38,7 @@ class Messages extends FHCAPI_Controller // Load language phrases $this->loadPhrases([ - 'ui' + 'ui', 'messages' ]); } @@ -101,22 +102,49 @@ class Messages extends FHCAPI_Controller $this->terminateWithSuccess($vorlage); } - public function getMessageVarsPerson($id, $typeId) + public function getMessageVarsPerson($typeId) { - $person_id = ($typeId == 'mitarbeiter_uid') ? $this->_getPersonId($id, $typeId) : $id; - $result = $this->MessageModel->getMsgVarsDataByPersonId($person_id); - $data = $this->getDataOrTerminateWithError($result); + $ids = $this->input->post('ids'); + $messageVarsPerson = []; - $this->terminateWithSuccess($data); + foreach ($ids as $id) + { + $person_id = ($typeId == 'mitarbeiter_uid') ? $this->_getPersonId($id, $typeId) : $id; + $result = $this->MessageModel->getMsgVarsDataByPersonId($person_id); + $data = $this->getDataOrTerminateWithError($result); + $messageVarsPerson[] = current($data); + } + + $this->terminateWithSuccess($messageVarsPerson); } - public function getMsgVarsPrestudent($id, $typeId) + public function getMsgVarsPrestudent($typeId) { - $prestudent_id = ($typeId == 'uid') ? $this->_getPrestudentIdFromUid($id) : $id; - $result = $this->MessageModel->getMsgVarsDataByPrestudentId($prestudent_id); - $data = $this->getDataOrTerminateWithError($result); + $ids = $this->input->post('ids'); + if(!is_array($ids)) { + $ids = array($ids); + } + $messageVarsPrestudent = []; - $this->terminateWithSuccess($data); + if($typeId == 'uid') + { + $prestudent_ids = []; + foreach ($ids as $id) + { + $prestudent_ids[] = $this->_getPrestudentIdFromUid($id); + } + } + else + $prestudent_ids = $ids; + + foreach ($prestudent_ids as $prestudent_id) + { + $result = $this->MessageModel->getMsgVarsDataByPrestudentId($prestudent_id); + $data = $this->getDataOrTerminateWithError($result); + $messageVarsPrestudent[] = current($data); + } + + $this->terminateWithSuccess($messageVarsPrestudent); } public function getMsgVarsLoggedInUser() @@ -127,27 +155,45 @@ class Messages extends FHCAPI_Controller $this->terminateWithSuccess($data); } - public function getNameOfDefaultRecipient($id, $type_id) + public function getNameOfDefaultRecipients($type_id) { - $id = ($type_id != 'person_id') ? $this->_getPersonId($id, $type_id) : $id; + $ids = $this->input->post('ids'); + if(!is_array($ids)) { + $ids = array($ids); + } + $recipients = []; + + if (empty($ids)) { + + throw new InvalidArgumentException($this->p->t('ui', 'errorMissingOrInvalidParameters', ['parameter'=> 'Id(s)']), self::ERROR_TYPE_GENERAL); + } $this->load->model('person/Person_model', 'PersonModel'); + if($type_id != 'person_id'){ + foreach ($ids as $id) + { + $person_id = $this->_getPersonId($id, $type_id); + $result = $this->PersonModel->load($person_id); + $data = $this->getDataOrTerminateWithError($result); + $name = current($data); + $recipients[$id] = $name->vorname . " " . $name->nachname; + } + } + else { + foreach ($ids as $id) { + $result = $this->PersonModel->load($id); + $data = $this->getDataOrTerminateWithError($result); + $name = current($data); + $recipients[$id] = $name->vorname . " " . $name->nachname; + } + } - $result = $this->PersonModel->load($id); - $data = $this->getDataOrTerminateWithError($result); - $name = current($data); - - $this->terminateWithSuccess($name->vorname . " " . $name->nachname ); + $this->terminateWithSuccess($recipients); } - public function sendMessage($recipient_id) + public function sendMessage($typeId) { - //has to be uid - // $this->terminateWithError("uid", $recipient_id, self::ERROR_TYPE_GENERAL); - - //default setting - $receiversPersonId = $this->_getPersonId($recipient_id, 'uid'); - + $resultReturn = []; $uid = getAuthUID(); $this->load->model('person/Benutzer_model', 'BenutzerModel'); $result = $this->BenutzerModel->loadWhere( @@ -185,47 +231,61 @@ class Messages extends FHCAPI_Controller $body = $this->input->post('body'); $relationmessage_id = $this->input->post('relationmessage_id'); - $typeId = $this->input->post('type_id'); - $id = $this->input->post('id'); - - if($typeId == 'uid') + if (isset($_POST['ids'])) { - $prestudent_id = $this-> _getPrestudentIdFromUid($id); - - //parseMessagetext for variables Prestudent - $result = $this->MessagesModel->parseMessageTextPrestudent($prestudent_id, $body); - $bodyParsed = $this->getDataOrTerminateWithError($result); - } - if($typeId == 'mitarbeiter_uid') - { - $person_id = $this->_getPersonId($id, $typeId); - - $result = $this->MessagesModel->parseMessageTextPerson($person_id, $body); - $bodyParsed = $this->getDataOrTerminateWithError($result); - $this->terminateWithError($bodyParsed, self::ERROR_TYPE_GENERAL); - - } - elseif($typeId == 'person_id') - { - $result = $this->MessagesModel->parseMessageTextPerson($id, $body); - $bodyParsed = $this->getDataOrTerminateWithError($result); - } - elseif($typeId == 'prestudent_id') - { - $result = $this->MessagesModel->parseMessageTextPrestudent($id, $body); - $bodyParsed = $this->getDataOrTerminateWithError($result); - } - else - { - $this->terminateWithError("type_id " . $typeId . " not valid", self::ERROR_TYPE_GENERAL); + $ids = json_decode($_POST['ids']); + unset($_POST['ids']); + foreach ($data as $k => $v) { + $_POST[$k] = $v; + } } - $result = $this->messagelib->sendMessageUser($receiversPersonId, $subject, $bodyParsed, $benutzer->person_id, null, $relationmessage_id); + if (!is_array($ids)) { + $ids = [$ids]; + } - $this->terminateWithSuccess($result); + foreach ($ids as $id) + { + $receiversPersonId = $typeId == "person_id" ? $id : $this->_getPersonId($id, $typeId); + + if($typeId == 'uid') + { + $prestudent_id = $this-> _getPrestudentIdFromUid($id); + + $result = $this->MessagesModel->parseMessageTextPrestudent($prestudent_id, $body); + $bodyParsed = $this->getDataOrTerminateWithError($result); + } + if($typeId == 'mitarbeiter_uid') + { + $person_id = $this->_getPersonId($id, $typeId); + + $result = $this->MessagesModel->parseMessageTextPerson($person_id, $body); + $bodyParsed = $this->getDataOrTerminateWithError($result); + } + elseif($typeId == 'person_id') + { + $result = $this->MessagesModel->parseMessageTextPerson($id, $body); + $bodyParsed = $this->getDataOrTerminateWithError($result); + } + elseif($typeId == 'prestudent_id') + { + $result = $this->MessagesModel->parseMessageTextPrestudent($id, $body); + $bodyParsed = $this->getDataOrTerminateWithError($result); + } + else + { + $this->terminateWithError($this->p->t('messages', 'error_missingLogic', ['type'=> $typeId]), self::ERROR_TYPE_GENERAL); + } + + $result =$this->messagelib->sendMessageUser($receiversPersonId, $subject, $bodyParsed, $benutzer->person_id, null, $relationmessage_id); + $data = $this->getDataOrTerminateWithError($result); + $resultReturn[] = current($data); + + } + $this->terminateWithSuccess($resultReturn); } - public function getPreviewText($id, $type_id) + public function getPreviewText($type_id) { if (isset($_POST['data'])) { @@ -233,39 +293,60 @@ class Messages extends FHCAPI_Controller unset($_POST['data']); } else - $this->terminateWithError("Textbody missing ", self::ERROR_TYPE_GENERAL); + $this->terminateWithError($this->p->t('messages', 'errorMissingOrInvalidParameters', ['parameter'=> "Textbody"]), self::ERROR_TYPE_GENERAL); - switch($type_id) + if (isset($_POST['ids'])) { - case 'uid': - $prestudent_id = $this->_getPrestudentIdFromUid($id); - $result = $this->MessagesModel->parseMessageTextPrestudent($prestudent_id, $data); - break; - case 'prestudent_id': - $result = $this->MessagesModel->parseMessageTextPrestudent($id, $data); - break; - case 'person_id': - $result = $this->MessagesModel->parseMessageTextPerson($id, $data); - break; - case 'mitarbeiter_uid': - { - $person_id = $this->_getPersonId($id, $type_id); - $result = $this->MessagesModel->parseMessageTextPerson($person_id, $data); - } - break; - default: - $this->terminateWithError("MESSAGES::getPreviewText logic for type_id " . $type_id . " not defined yet", self::ERROR_TYPE_GENERAL); - break; + $ids = json_decode($_POST['ids']); + if(!is_array($ids)) + { + $ids = array($ids); + } + unset($_POST['ids']); } + else + $this->terminateWithError($this->p->t('ui', 'errorMissingOrInvalidParameters', ['parameter'=> 'Id(s)']), self::ERROR_TYPE_GENERAL); - $bodyParsed = $this->getDataOrTerminateWithError($result); + $bodyParsed = []; + + foreach ($ids as $id) + { + switch($type_id) + { + case 'uid': + $prestudent_id = $this->_getPrestudentIdFromUid($id); + $result = $this->MessagesModel->parseMessageTextPrestudent($prestudent_id, $data); + $bodyParsed[$id] = $this->getDataOrTerminateWithError($result); + break; + case 'prestudent_id': + $result = $this->MessagesModel->parseMessageTextPrestudent($id, $data); + $bodyParsed[$id] = $this->getDataOrTerminateWithError($result); + break; + case 'person_id': + $result = $this->MessagesModel->parseMessageTextPerson($id, $data); + $bodyParsed[$id] = $this->getDataOrTerminateWithError($result); + break; + case 'mitarbeiter_uid': + { + $person_id = $this->_getPersonId($id, $type_id); + $result = $this->MessagesModel->parseMessageTextPerson($person_id, $data); + $bodyParsed[$id] = $this->getDataOrTerminateWithError($result); + } + break; + default: + $this->terminateWithError($this->p->t('messages', 'error_missingLogic', ['type'=> $type_id]), self::ERROR_TYPE_GENERAL); + break; + } + } $this->terminateWithSuccess($bodyParsed); } public function getReplyData($messageId) { - //TODO(Manu) validation of messageId: if number + if (!is_numeric($messageId)) { + $this->terminateWithError($this->p->t('ui', 'error_valueNotNumeric', ['value'=> 'Message ID']), self::ERROR_TYPE_GENERAL); + } $this->MessageModel->addSelect('public.tbl_msg_message.*'); $this->MessageModel->addSelect('r.*'); @@ -288,7 +369,6 @@ class Messages extends FHCAPI_Controller $replyBody = $this->_getReplyBody($body, $dataMessage[0]->nachname, $dataMessage[0]->vorname, $dataMessage[0]->insertamum); $dataMessage[0]->replyBody = $replyBody; - $dataMessage[0]->rest = "Help Manu"; $dataMessage[0]->replySubject = $prefix . $subject; $this->terminateWithSuccess($dataMessage); @@ -336,6 +416,11 @@ class Messages extends FHCAPI_Controller ['prestudent_id' => $id] ); } + else + { + $this->terminateWithError($this->p->t('messages', 'error_missingLogic', ['type'=> $typeId]), self::ERROR_TYPE_GENERAL); + } + $data = $this->getDataOrTerminateWithError($result); $person = current($data); @@ -343,8 +428,11 @@ class Messages extends FHCAPI_Controller $this->terminateWithSuccess($person->person_id); } - public function getUid($id, $typeId) + public function getUids($typeId) { + $ids = $this->input->post('ids'); + $benutzerIds = []; + if (!$typeId) { $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Type ID']), self::ERROR_TYPE_GENERAL); @@ -352,39 +440,50 @@ class Messages extends FHCAPI_Controller elseif ($typeId == 'person_id') { $this->load->model('person/Benutzer_model', 'BenutzerModel'); - $result = $this->BenutzerModel->loadWhere( - ['person_id' => $id] - ); + foreach ($ids as $id) + { + $result = $this->BenutzerModel->loadWhere( + ['person_id' => $id] + ); + $data = $this->getDataOrTerminateWithError($result); + $benutzer = current($data); + + $benutzerIds[$id] = $benutzer->uid; + } } elseif($typeId == 'prestudent_id') { $this->load->model('crm/Prestudent_model', 'PrestudentModel'); - $result = $this->PrestudentModel->loadWhere( - ['prestudent_id' => $id] - ); + foreach ($ids as $id) + { + $result = $this->PrestudentModel->loadWhere( + ['prestudent_id' => $id] + ); - $data = $this->getDataOrTerminateWithError($result); - $person = current($data); - $person_id = $person->person_id; + $data = $this->getDataOrTerminateWithError($result); + $person = current($data); + $person_id = $person->person_id; - $this->load->model('person/Benutzer_model', 'BenutzerModel'); - $result = $this->BenutzerModel->loadWhere( - ['person_id' => $person_id] - ); + $this->load->model('person/Benutzer_model', 'BenutzerModel'); + $result = $this->BenutzerModel->loadWhere( + ['person_id' => $person_id] + ); + $data = $this->getDataOrTerminateWithError($result); + $benutzer = current($data); + + $benutzerIds[$id] = $benutzer->uid; + } } elseif($typeId == 'uid' || $typeId == 'mitarbeiter_uid') { - $this->terminateWithSuccess($id); + $this->terminateWithSuccess($ids); } else { - $this->terminateWithError("MESSAGES::getUID logic for type_id " . $typeId . " not defined yet", self::ERROR_TYPE_GENERAL); + $this->terminateWithError($this->p->t('messages', 'error_missingLogic', ['type'=> $typeId]), self::ERROR_TYPE_GENERAL); } - $data = $this->getDataOrTerminateWithError($result); - $benutzer = current($data); - - $this->terminateWithSuccess($benutzer->uid); + $this->terminateWithSuccess($benutzerIds); } private function _getPersonId($id, $typeId) @@ -403,11 +502,16 @@ class Messages extends FHCAPI_Controller ['prestudent_id' => $id] ); } + else + { + $this->terminateWithError($this->p->t('messages', 'error_missingLogic', ['type'=> $typeId]), self::ERROR_TYPE_GENERAL); + } + $data = $this->getDataOrTerminateWithError($result); if (count($data) < 1) { - $this->terminateWithError('Error: Messages API no person_id found.'); + $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person ID']), self::ERROR_TYPE_GENERAL); } $person = current($data); @@ -416,7 +520,6 @@ class Messages extends FHCAPI_Controller private function _getPrestudentIdFromUid($uid) { - // $this->terminateWithError($uid, self::ERROR_TYPE_GENERAL); $this->load->model('crm/Student_model', 'StudentModel'); $result = $this->StudentModel->loadWhere( ['student_uid' => $uid] @@ -425,7 +528,7 @@ class Messages extends FHCAPI_Controller $data = $this->getDataOrTerminateWithError($result); if (count($data) < 1) { - $this->terminateWithError('Error: Messages API no prestudent_id found.'); + $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Prestudent ID']), self::ERROR_TYPE_GENERAL); } $student = current($data); diff --git a/application/controllers/api/frontend/v1/organisation/Studienplan.php b/application/controllers/api/frontend/v1/organisation/Studienplan.php new file mode 100644 index 000000000..c5a69fdee --- /dev/null +++ b/application/controllers/api/frontend/v1/organisation/Studienplan.php @@ -0,0 +1,69 @@ + self::PERM_LOGGED + ]); + } + + public function getBySemester() + { + $this->load->model('organisation/Studienplan_model', 'StudienplanModel'); + + $studiengang_kz = $this->input->get('studiengang_kz'); + $studiensemester_kurzbz = $this->input->get('studiensemester_kurzbz'); + $ausbildungssemester = $this->input->get('ausbildungssemester') ?: null; + $orgform_kurzbz = $this->input->get('orgform_kurzbz') ?: null; + + if (!$studiengang_kz || !is_numeric($studiengang_kz)) + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Studiengangskennzahl']), self::ERROR_TYPE_GENERAL); + + if (!$studiensemester_kurzbz) + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Studiensemester']), self::ERROR_TYPE_GENERAL); + + if (isset($ausbildungssemester) && !is_numeric($ausbildungssemester)) + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Ausbildungssemester']), self::ERROR_TYPE_GENERAL); + + + //~ $this->load->library('form_validation'); + + //~ $this->form_validation->set_rules('studiengang_kz', 'StudiengangKz', 'required|numeric'); + //~ $this->form_validation->set_rules('studiensemester_kurzbz', 'StudiensemesterKurbz', 'required'); + //~ $this->form_validation->set_rules('ausbildungssemester', 'Ausbildungssemester', 'numeric'); + + //~ if (!$this->form_validation->run()) + //~ { + //~ $this->addMeta('fail2', 'fail2'); + //~ return $this->terminateWithValidationErrors($this->form_validation->error_array()); + //~ } + + + $this->addMeta('stg_kz', $studiengang_kz); + $this->addMeta('sem', $studiensemester_kurzbz); + $this->addMeta('sem2', $ausbildungssemester); + $this->addMeta('org', $orgform_kurzbz); + + $result = $this->StudienplanModel->getStudienplaeneBySemester($studiengang_kz, $studiensemester_kurzbz, $ausbildungssemester, $orgform_kurzbz); + if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_DB); + + $this->terminateWithSuccess(hasData($result) ? getData($result) : []); + } +} diff --git a/application/controllers/api/frontend/v1/organisation/Studiensemester.php b/application/controllers/api/frontend/v1/organisation/Studiensemester.php index bb56ea71a..3c6b72d2f 100644 --- a/application/controllers/api/frontend/v1/organisation/Studiensemester.php +++ b/application/controllers/api/frontend/v1/organisation/Studiensemester.php @@ -25,7 +25,8 @@ class Studiensemester extends FHCAPI_Controller array( 'getAll' => self::PERM_LOGGED, 'getAktNext' => self::PERM_LOGGED, - 'getStudienjahrByStudiensemester' => self::PERM_LOGGED + 'getStudienjahrByStudiensemester' => self::PERM_LOGGED, + 'getAllStudiensemesterAndAktOrNext' => self::PERM_LOGGED ) ); // Load model StudiensemesterModel @@ -152,4 +153,17 @@ class Studiensemester extends FHCAPI_Controller $this->terminateWithSuccess((getData(success($studienjahrObj)))); } + + public function getAllStudiensemesterAndAktOrNext() { + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + + $this->StudiensemesterModel->addOrder("start", "DESC"); + $result = $this->StudiensemesterModel->getAktOrNextSemester(); + $aktuell = getData($result)[0]; + $this->StudiensemesterModel->addSelect('*'); + $result = $this->StudiensemesterModel->load(); + $studiensemester = getData($result); + + $this->terminateWithSuccess(array($studiensemester, $aktuell)); + } } diff --git a/application/controllers/api/frontend/v1/stv/Aufnahmetermine.php b/application/controllers/api/frontend/v1/stv/Aufnahmetermine.php index 86b739c90..26033908d 100644 --- a/application/controllers/api/frontend/v1/stv/Aufnahmetermine.php +++ b/application/controllers/api/frontend/v1/stv/Aufnahmetermine.php @@ -298,7 +298,7 @@ class Aufnahmetermine extends FHCAPI_Controller $reihungstestangetreten = (isset($formData['reihungstestangetreten']) && !empty($formData['reihungstestangetreten'])) ? $formData['reihungstestangetreten'] - : null; + : false; $aufnahmegruppe_kurzbz = (isset($formData['aufnahmegruppe_kurzbz']) && !empty($formData['aufnahmegruppe_kurzbz'])) ? $formData['aufnahmegruppe_kurzbz'] diff --git a/application/controllers/api/frontend/v1/stv/Config.php b/application/controllers/api/frontend/v1/stv/Config.php index 97d626246..c787381f0 100644 --- a/application/controllers/api/frontend/v1/stv/Config.php +++ b/application/controllers/api/frontend/v1/stv/Config.php @@ -33,6 +33,8 @@ class Config extends FHCAPI_Controller { // TODO(chris): permissions parent::__construct([ + 'get' => ['admin:r', 'assistenz:r'], + 'set' => ['admin:r', 'assistenz:r'], 'filter' => ['admin:r', 'assistenz:r'], 'student' => ['admin:r', 'assistenz:r'], 'students' => ['admin:r', 'assistenz:r'] @@ -55,6 +57,95 @@ class Config extends FHCAPI_Controller } /** + * get App config + */ + public function get() + { + $this->load->model('system/Variable_model', 'VariableModel'); + $this->load->config('stv'); + + $config = []; + + #number_displayed_past_studiensemester + $result = $this->VariableModel->getVariables(getAuthUID(), ['number_displayed_past_studiensemester']); + $data = $this->getDataOrTerminateWithError($result); + + $number_displayed_past_studiensemester_default = $this->config->item('number_displayed_past_studiensemester_default'); + + $config['number_displayed_past_studiensemester'] = [ + "type" => "number", + "label" => $this->p->t('stv', 'settings_no_displayed_past_sem'), + "value" => $data['number_displayed_past_studiensemester'] + ?? $number_displayed_past_studiensemester_default + ]; + + #font_size + $result = $this->VariableModel->getVariables(getAuthUID(), ['stv_font_size']); + $data = $this->getDataOrTerminateWithError($result); + $config['font_size'] = [ + "type" => "select", + "label" => $this->p->t('stv', 'settings_fontsize'), + "value" => $data['stv_font_size'] ?? "fs_normal", + "options" => [ + "fs_xx-small" => $this->p->t('stv', 'settings_fontsize_xx-small'), + "fs_x-small" => $this->p->t('stv', 'settings_fontsize_x-small'), + "fs_small" => $this->p->t('stv', 'settings_fontsize_small'), + "fs_normal" => $this->p->t('stv', 'settings_fontsize_normal'), + "fs_big" => $this->p->t('stv', 'settings_fontsize_big'), + "fs_huge" => $this->p->t('stv', 'settings_fontsize_huge') + ] + ]; + + #others + Events::trigger('stv_config_get', function & () use (&$config) { + return $config; + }); + + $this->terminateWithSuccess($config); + } + + /** + * set App config + */ + public function set() + { + $this->load->model('system/Variable_model', 'VariableModel'); + $this->load->library('form_validation'); + + $this->form_validation->set_rules( + 'number_displayed_past_studiensemester', + $this->p->t('stv', 'settings_no_displayed_past_sem'), + 'required|integer' + ); + $this->form_validation->set_rules( + 'font_size', + $this->p->t('stv', 'settings_fontsize'), + 'required|in_list[fs_xx-small,fs_x-small,fs_small,fs_normal,fs_big,fs_huge]' + ); + + Events::trigger('stv_config_validation', $this->form_validation); + + if (!$this->form_validation->run()) + $this->terminateWithValidationErrors($this->form_validation->error_array()); + + + $this->VariableModel->setVariable( + getAuthUID(), + 'number_displayed_past_studiensemester', + $this->input->post('number_displayed_past_studiensemester') + ); + $this->VariableModel->setVariable( + getAuthUID(), + 'stv_font_size', + $this->input->post('font_size') + ); + + Events::trigger('stv_config_set', $this->input); + + $this->terminateWithSuccess(); + } + + /* * Get the config for the student filters * * @return void @@ -240,7 +331,10 @@ class Config extends FHCAPI_Controller ]; $result['status'] = [ 'title' => 'Status', - 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/MultiStatus.js') + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/MultiStatus.js'), + 'config' => [ + 'showStatusVorruecken' => defined('STATUS_VORRUECKEN_ANZEIGEN') ? STATUS_VORRUECKEN_ANZEIGEN : true, + ] ]; $result['documents'] = [ 'title' => $this->p->t('stv', 'tab_documents'), @@ -271,7 +365,6 @@ class Config extends FHCAPI_Controller $result['messages'] = [ 'title' => $this->p->t('stv', 'tab_messages'), 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Messages.js'), - 'showOnlyWithUid' => true ]; $result['grades'] = [ @@ -407,11 +500,25 @@ class Config extends FHCAPI_Controller ] ]; + if($this->permissionlib->isBerechtigt('basis/person')) + { + $result['combinePeople'] = [ + 'title' => $this->p->t('stv', 'tab_combine_people'), + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/CombinePeople.js'), + 'config' => $config['combinePeople'] + ]; + } + $result['kontaktieren'] = [ 'title' => $this->p->t('stv', 'tab_kontaktieren'), 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Kontaktieren.js'), ]; + $result['messages'] = [ + 'title' => $this->p->t('stv', 'tab_messages'), + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Messages.js'), + ]; + Events::trigger('stv_conf_students', function & () use (&$result) { return $result; }); diff --git a/application/controllers/api/frontend/v1/stv/Dokumente.php b/application/controllers/api/frontend/v1/stv/Dokumente.php index 4f33405ae..9f54d0aa4 100644 --- a/application/controllers/api/frontend/v1/stv/Dokumente.php +++ b/application/controllers/api/frontend/v1/stv/Dokumente.php @@ -590,14 +590,14 @@ class Dokumente extends FHCAPI_Controller $documents = [ buildDropdownEntryPrintArray("accountinfo", "Accountinfoblatt", "xml=accountinfoblatt.xml.php&xsl=AccountInfo&output=pdf", $uid, 10, null), - buildDropdownEntryPrintArray("ausbildungsvertrag", "Ausbildungsvertrag", "xml=ausbildungsvertrag.xml.php&xsl=Ausbildungsver&output=pdf", $uid, 20, null), - buildDropdownEntryPrintArray("ausbildungsvertrag_en", "Ausbildungsvertrag Zweisprachig", "xml=ausbildungsvertrag.xml.php&xsl=AusbVerEng&output=pdf", $uid, 21, null), + buildDropdownEntryPrintArray("ausbildungsvertrag", "Ausbildungsvertrag", "xml=ausbildungsvertrag.xml.php&xsl=Ausbildungsver&output=pdf&prestudent_id=$prestudent_id", null,20, null), + buildDropdownEntryPrintArray("ausbildungsvertrag_en", "Ausbildungsvertrag Zweisprachig", "xml=ausbildungsvertrag.xml.php&xsl=AusbVerEng&output=pdf&prestudent_id=$prestudent_id", null,21, null), buildDropdownEntryPrintArray("bescheid", "Bescheid (nur Voransicht)", "xml=abschlusspruefung.rdf.php&xsl_stg_kz=$studiengang_kz&xsl=Bescheid&output=pdf", $uid, 25, null), buildDropdownEntryPrintArray("diplomasupp", "Diploma Supplement (nur Voransicht)", "xml=diplomasupplement.xml.php&xsl_stg_kz=$studiengang_kz&xsl=DiplSupplement&output=pdf", $uid, 26, null), - buildDropdownEntryPrintArray("studienbestaetigung", "Studienbestätigung", "xml=student.rdf.php&xsl=Inskription&output=pdf", $uid, 50, null), - buildDropdownEntryPrintArray("studienbestaetigung_en", "Studienbestätigung Englisch", "xml=student.rdf.php&xsl=InskriptionEng&output=pdf", $uid, 51, null), + buildDropdownEntryPrintArray("studienbestaetigung", "Studienbestätigung", "xml=student.rdf.php&xsl=Inskription&output=pdf&ss=$studiensemester_kurzbz&xsl_stg_kz=$studiengang_kz", $uid, 50, null), + buildDropdownEntryPrintArray("studienbestaetigung_en", "Studienbestätigung Englisch", "xml=student.rdf.php&xsl=InskriptionEng&output=pdf&ss=$studiensemester_kurzbz&xsl_stg_kz=$studiengang_kz", $uid, 51, null), buildDropdownEntryPrintArray("zutrittskarte", "Zutrittskarte", "xsl=ZutrittskarteStud&output=pdf&data=$uid", $uid,200, "zutrittskarte.php"), buildDropdownEntryPrintArray("studienblatt", "Studienblatt", "xml=studienblatt.xml.php&xsl=Studienblatt&output=pdf&ss=$studiensemester_kurzbz", $uid, 60, null), buildDropdownEntryPrintArray("studienblatt_eng", "Studienblatt Englisch", "xml=studienblatt.xml.php&xsl=StudienblattEng&output=pdf&ss=$studiensemester_kurzbz", $uid, 61, null), @@ -686,8 +686,8 @@ class Dokumente extends FHCAPI_Controller buildDropdownEntryPrintArray("accountinfo", "Accountinfoblatt", "xml=accountinfoblatt.xml.php&xsl=AccountInfo&output=pdf", $uidString, 10, null), buildDropdownEntryPrintArray("ausbildungsvertrag", "Ausbildungsvertrag", "xml=ausbildungsvertrag.xml.php&xsl=Ausbildungsver&output=pdf", $uidString, 20, null), buildDropdownEntryPrintArray("ausbildungsvertrag_en", "Ausbildungsvertrag Englisch", "xml=ausbildungsvertrag.xml.php&xsl=AusbVerEng&output=pdf", $uidString, 21, null), - buildDropdownEntryPrintArray("studienbestaetigung", "Studienbestätigung", "xml=student.rdf.php&xsl=Inskription&output=pdf", $uidString, 50, null), - buildDropdownEntryPrintArray("studienbestaetigung_en", "Studienbestätigung Englisch", "xml=student.rdf.php&xsl=InskriptionEng&output=pdf", $uidString, 51, null), + buildDropdownEntryPrintArray("studienbestaetigung", "Studienbestätigung", "xml=student.rdf.php&xsl=Inskription&output=pdf&ss=$studiensemester_kurzbz&xsl_stg_kz=$studiengang_kz", $uidString, 50, null), + buildDropdownEntryPrintArray("studienbestaetigung_en", "Studienbestätigung Englisch", "xml=student.rdf.php&xsl=InskriptionEng&output=pdf&ss=$studiensemester_kurzbz&xsl_stg_kz=$studiengang_kz", $uidString, 51, null), buildDropdownEntryPrintArray("zutrittskarte", "Zutrittskarte", "xsl=ZutrittskarteStud&output=pdf&data=$uidString", $uidString,200, "zutrittskarte.php"), buildDropdownEntryPrintArray("studienblatt", "Studienblatt", "xml=studienblatt.xml.php&xsl=Studienblatt&output=pdf&ss=$studiensemester_kurzbz", $uidString, 60, null), buildDropdownEntryPrintArray("studienblatt_eng", "Studienblatt Englisch", "xml=studienblatt.xml.php&xsl=StudienblattEng&output=pdf&ss=$studiensemester_kurzbz", $uidString, 61, null), diff --git a/application/controllers/api/frontend/v1/stv/GemeinsameStudien.php b/application/controllers/api/frontend/v1/stv/GemeinsameStudien.php index 97dad48fd..8f3d6419a 100644 --- a/application/controllers/api/frontend/v1/stv/GemeinsameStudien.php +++ b/application/controllers/api/frontend/v1/stv/GemeinsameStudien.php @@ -83,7 +83,7 @@ class GemeinsameStudien extends FHCAPI_Controller { $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); - $this->StudiensemesterModel->addOrder('studienjahr_kurzbz', 'DESC'); + $this->StudiensemesterModel->addOrder('start', 'DESC'); $result = $this->StudiensemesterModel->load(); $data = $this->getDataOrTerminateWithError($result); $this->terminateWithSuccess($data); diff --git a/application/controllers/api/frontend/v1/stv/Grades.php b/application/controllers/api/frontend/v1/stv/Grades.php index dd8f53a27..128316d2b 100644 --- a/application/controllers/api/frontend/v1/stv/Grades.php +++ b/application/controllers/api/frontend/v1/stv/Grades.php @@ -60,7 +60,8 @@ class Grades extends FHCAPI_Controller { $this->load->model('codex/Note_model', 'NoteModel'); - $this->NoteModel->addOrder('note'); + $this->NoteModel->addOrder('notenwert', 'ASC'); + $this->NoteModel->addOrder('bezeichnung', 'ASC'); $result = $this->NoteModel->load(); diff --git a/application/controllers/api/frontend/v1/stv/Gruppen.php b/application/controllers/api/frontend/v1/stv/Gruppen.php index c45165b41..b10cfb328 100644 --- a/application/controllers/api/frontend/v1/stv/Gruppen.php +++ b/application/controllers/api/frontend/v1/stv/Gruppen.php @@ -147,7 +147,8 @@ class Gruppen extends FHCAPI_Controller 'lehre' => true, 'sichtbar' => true, 'aktiv' => true, - 'direktinskription' => false + 'direktinskription' => false, + 'generiert' => false ]); $data = $this->getDataOrTerminateWithError($result); diff --git a/application/controllers/api/frontend/v1/stv/Konto.php b/application/controllers/api/frontend/v1/stv/Konto.php index 384452f3e..ecd58671a 100644 --- a/application/controllers/api/frontend/v1/stv/Konto.php +++ b/application/controllers/api/frontend/v1/stv/Konto.php @@ -239,7 +239,7 @@ class Konto extends FHCAPI_Controller $data[$field] = $this->input->post($field); if (defined('FAS_BUCHUNGSTYP_FIXE_KOSTENSTELLE') && isset(unserialize(FAS_BUCHUNGSTYP_FIXE_KOSTENSTELLE)[$data['buchungstyp_kurzbz']])) { - $data['kostenstelle'] = unserialize(FAS_BUCHUNGSTYP_FIXE_KOSTENSTELLE)[$data['buchungstyp_kurzbz']]; + $data['studiengang_kz'] = unserialize(FAS_BUCHUNGSTYP_FIXE_KOSTENSTELLE)[$data['buchungstyp_kurzbz']]; } $result = []; diff --git a/application/controllers/api/frontend/v1/stv/Prestudent.php b/application/controllers/api/frontend/v1/stv/Prestudent.php index 7dc607d1a..d8c8d1ff2 100644 --- a/application/controllers/api/frontend/v1/stv/Prestudent.php +++ b/application/controllers/api/frontend/v1/stv/Prestudent.php @@ -43,7 +43,7 @@ class Prestudent extends FHCAPI_Controller // Load language phrases $this->loadPhrases([ - 'ui', 'studierendenantrag', 'lehre' + 'ui', 'studierendenantrag', 'lehre', 'global' ]); } @@ -98,11 +98,9 @@ class Prestudent extends FHCAPI_Controller 'person_id', 'berufstaetigkeit_code', 'ausbildungcode', - 'zgv_code', 'zgvort', 'zgvdatum', 'zgvnation', - 'zgvmas_code', 'zgvmaort', 'zgvmadatum', 'zgvmanation', @@ -110,7 +108,6 @@ class Prestudent extends FHCAPI_Controller 'bismelden', 'anmerkung', 'dual', - 'zgvdoktor_code', 'zgvdoktorort', 'zgvdoktordatum', 'zgvdoktornation', @@ -125,6 +122,57 @@ class Prestudent extends FHCAPI_Controller 'standort_code' ]; + // add zgv code fields only if user has permission + $this->load->library('PermissionLib'); + $prestudentres = $this->PrestudentModel->load($prestudent_id); + if(!hasData($prestudentres)) + { + $this->terminateWithError($this->p->t('ui', 'error_fieldNotFound', ['field' => 'Prestudent ' . $prestudent_id])); + } + $prestudent = (getData($prestudentres))[0]; + $bakkZgvStg = $this->permissionlib->getSTG_isEntitledFor('student/editBakkZgv') ?: array(); + $makkZgvStg = $this->permissionlib->getSTG_isEntitledFor('student/editMakkZgv') ?: array(); + $dokZgvStg = $this->permissionlib->getSTG_isEntitledFor('student/editDokZgv') ?: array(); + + if(in_array($prestudent->studiengang_kz, $bakkZgvStg)) + { + $array_allowed_props_prestudent[] = 'zgv_code'; + } + else if(!is_null($this->input->post('zgv_code'))) + { + $this->terminateWithError( + $this->p->t('global', 'zgv') + . ' - ' . + $this->p->t('ui', 'error_keineBerechtigungStg') + ); + } + + if(in_array($prestudent->studiengang_kz, $makkZgvStg)) + { + $array_allowed_props_prestudent[] = 'zgvmas_code'; + } + else if(!is_null($this->input->post('zgvmas_code'))) + { + $this->terminateWithError( + $this->p->t('lehre', 'zgvMaster') + . ' - ' . + $this->p->t('ui', 'error_keineBerechtigungStg') + ); + } + + if(in_array($prestudent->studiengang_kz, $dokZgvStg)) + { + $array_allowed_props_prestudent[] = 'zgvdoktor_code'; + } + else if(!is_null($this->input->post('zgvdoktor_code'))) + { + $this->terminateWithError( + $this->p->t('lehre', 'zgvDoktor') + . ' - ' . + $this->p->t('ui', 'error_keineBerechtigungStg') + ); + } + // add UDFs $result = $this->udflib->getDefinitionForModel($this->PrestudentModel); diff --git a/application/controllers/api/frontend/v1/stv/Projektarbeit.php b/application/controllers/api/frontend/v1/stv/Projektarbeit.php index 75478332f..8740ef3d6 100644 --- a/application/controllers/api/frontend/v1/stv/Projektarbeit.php +++ b/application/controllers/api/frontend/v1/stv/Projektarbeit.php @@ -17,7 +17,8 @@ class Projektarbeit extends FHCAPI_Controller 'getTypenProjektarbeit' => ['admin:r', 'assistenz:r'], 'getFirmen' => ['admin:r', 'assistenz:r'], 'getLehrveranstaltungen' => ['admin:r', 'assistenz:r'], - 'getNoten' => ['admin:r', 'assistenz:r'] + 'getNoten' => ['admin:r', 'assistenz:r'], + 'getStudiensemester' => ['admin:r', 'assistenz:r'] ]); // Load Libraries @@ -40,11 +41,15 @@ class Projektarbeit extends FHCAPI_Controller $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel'); $this->load->model('education/Note_model', 'NoteModel'); $this->load->model('education/Projektbetreuer_model', 'BetreuerModel'); + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); // load libraries $this->load->library('PermissionLib'); } + /** + * Get projekt works for a uid. + */ public function getProjektarbeit() { $student_uid = $this->input->get('uid'); @@ -53,10 +58,7 @@ class Projektarbeit extends FHCAPI_Controller $result = $this->ProjektarbeitModel->getProjektarbeit($student_uid); - if (isError($result)) - { - $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); - } + if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); if (!hasData($result)) $this->terminateWithSuccess([]); @@ -79,6 +81,9 @@ class Projektarbeit extends FHCAPI_Controller $this->terminateWithSuccess($projektarbeiten); } + /** + * Load a single Projektarbeit by id. + */ public function loadProjektarbeit() { $projektarbeit_id = $this->input->get('projektarbeit_id'); @@ -101,6 +106,9 @@ class Projektarbeit extends FHCAPI_Controller $this->terminateWithSuccess(current($data)); } + /** + * Inwert a Projektarbeit. + */ public function insertProjektarbeit() { $student_uid = $this->input->post('uid'); @@ -128,6 +136,9 @@ class Projektarbeit extends FHCAPI_Controller $this->terminateWithSuccess($data); } + /** + * Update a Projektarbeit by ID. + */ public function updateProjektarbeit() { $projektarbeit_id = $this->input->post('projektarbeit_id'); @@ -157,6 +168,9 @@ class Projektarbeit extends FHCAPI_Controller $this->terminateWithSuccess($data); } + /** + * Delete Projektarbeit by ID after validation. + */ public function deleteProjektarbeit() { $projektarbeit_id = $this->input->post('projektarbeit_id'); @@ -185,6 +199,9 @@ class Projektarbeit extends FHCAPI_Controller return $this->terminateWithSuccess(current(getData($result)) ? : null); } + /** + * Get all active projekt work types. + */ public function getTypenProjektarbeit() { $result = $this->ProjekttypModel->loadWhere(['aktiv' => true]); @@ -194,6 +211,9 @@ class Projektarbeit extends FHCAPI_Controller return $this->terminateWithSuccess(hasData($result) ? getData($result) : []); } + /** + * Gets companies by search string. + */ public function getFirmen() { $searchString = $this->input->get('searchString'); @@ -208,6 +228,9 @@ class Projektarbeit extends FHCAPI_Controller return $this->terminateWithSuccess(hasData($result) ? getData($result) : []); } + /** + * Get Lehrveranstaltungen by params, incling lehreinheiten for a specific Studiensemester.. + */ public function getLehrveranstaltungen() { $student_uid = $this->input->get('student_uid'); @@ -218,6 +241,7 @@ class Projektarbeit extends FHCAPI_Controller if (!isset($student_uid)) $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Student UID']), self::ERROR_TYPE_GENERAL); if (!isset($studiensemester_kurzbz)) $this->terminateWithError('Studiensemster missing', self::ERROR_TYPE_GENERAL); + // get Lvs $lvsResult = $this->LehrveranstaltungModel->getLvsForProjektarbeit($student_uid, $studiengang_kz, $additional_lehrveranstaltung_id); if (isError($lvsResult)) return $this->terminateWithError($lvsResult, self::ERROR_TYPE_GENERAL); @@ -226,6 +250,7 @@ class Projektarbeit extends FHCAPI_Controller foreach ($lvs as $lv) { + // add Lehreinheiten for each Lv for the semester $lehreinheiten = $this->LehreinheitModel->getLesForLv( $lv->lehrveranstaltung_id, $studiensemester_kurzbz ); @@ -250,8 +275,14 @@ class Projektarbeit extends FHCAPI_Controller return $this->terminateWithSuccess($lvs); } + /** + * Get all noten. + */ public function getNoten() { + $this->NoteModel->addOrder('notenwert', 'ASC'); + $this->NoteModel->addOrder('bezeichnung', 'ASC'); + $result = $this->NoteModel->load(); if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); @@ -260,18 +291,27 @@ class Projektarbeit extends FHCAPI_Controller } /** - * - * @param - * @return object success or error + * Get all Studiensemester, sorted. + */ + public function getStudiensemester() + { + $this->StudiensemesterModel->addOrder('start', 'DESC'); + $result = $this->StudiensemesterModel->load(); + + if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + + return $this->terminateWithSuccess(hasData($result) ? getData($result) : []); + } + + /** + * Validate Projektarbeit data. + * @param formData + * @return bool true if data valid */ private function _validate($formData) { $this->form_validation->set_data($formData); - $this->form_validation->set_rules('titel', 'Titel', 'required', [ - 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Titel']) - ]); - $this->form_validation->set_rules('projekttyp_kurzbz', 'Projekttyp', 'required', [ 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Projekttyp']) ]); @@ -297,9 +337,9 @@ class Projektarbeit extends FHCAPI_Controller } /** - * - * @param - * @return object success or error + * Extract Projektarbeit data from passed form data. + * @param formData + * @return array */ private function _getProjektarbeitArr($formData) { @@ -321,9 +361,9 @@ class Projektarbeit extends FHCAPI_Controller } /** - * - * @param - * @return object success or error + * Check if deletion of a Projektarbeit is possible. + * @param $projektarbeit_id + * @return object success if deletion possible, error otherwise. */ private function _validateDelete($projektarbeit_id) { @@ -344,6 +384,11 @@ class Projektarbeit extends FHCAPI_Controller return success(); } + /** + * Checks permissions for a student. + * @param $student_uid + * @return bool true if authorized + */ private function _hasBerechtigungForStudent($student_uid) { if (!$student_uid) diff --git a/application/controllers/api/frontend/v1/stv/Projektbetreuer.php b/application/controllers/api/frontend/v1/stv/Projektbetreuer.php index 98567ecde..904fa6167 100644 --- a/application/controllers/api/frontend/v1/stv/Projektbetreuer.php +++ b/application/controllers/api/frontend/v1/stv/Projektbetreuer.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); use \DateTime as DateTime; -use CI3_Events as Events; +use \CI3_Events as Events; class Projektbetreuer extends FHCAPI_Controller { @@ -43,6 +43,9 @@ class Projektbetreuer extends FHCAPI_Controller $this->load->library('PermissionLib'); } + /** + * Gets Projektbetreuer data for a Projektarbeit. + */ public function getProjektbetreuer() { $projektarbeit_id = $this->input->get('projektarbeit_id'); @@ -50,21 +53,30 @@ class Projektbetreuer extends FHCAPI_Controller if (!isset($projektarbeit_id)) $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Projektarbeit ID']), self::ERROR_TYPE_GENERAL); - $this->ProjektbetreuerModel->addSelect( - 'projektarbeit_id, person_id, nachname, vorname, note, punkte, round(stunden, 1) AS stunden, - stundensatz, betreuerart_kurzbz, vertrag_id, titelpre, titelpost' - ); - $this->ProjektbetreuerModel->addSelect("CASE - WHEN EXISTS - (SELECT 1 FROM public.tbl_benutzer JOIN public.tbl_mitarbeiter ON(uid=mitarbeiter_uid) WHERE person_id=pers.person_id) - THEN 'Mitarbeiter' - WHEN EXISTS - (SELECT 1 FROM public.tbl_benutzer JOIN public.tbl_student ON(uid=student_uid) WHERE person_id=pers.person_id) - THEN 'Student' - ELSE 'Person' - END AS status"); - $this->ProjektbetreuerModel->addJoin('public.tbl_person pers', 'person_id'); - $result = $this->ProjektbetreuerModel->loadWhere(['projektarbeit_id' => $projektarbeit_id]); + $qry = " + SELECT * FROM ( + SELECT + projektarbeit_id, person_id, nachname, vorname, note, punkte, round(stunden, 1) AS stunden, + stundensatz, betreuerart_kurzbz, vertrag_id, titelpre, titelpost, + CASE + WHEN EXISTS + (SELECT 1 FROM public.tbl_benutzer JOIN public.tbl_mitarbeiter ON(uid=mitarbeiter_uid) WHERE person_id=pers.person_id) + THEN 'Mitarbeiter' + WHEN EXISTS + (SELECT 1 FROM public.tbl_benutzer JOIN public.tbl_student ON(uid=student_uid) WHERE person_id=pers.person_id) + THEN 'Student' + ELSE 'Person' + END AS status + FROM + lehre.tbl_projektbetreuer + JOIN public.tbl_person pers USING (person_id) + WHERE + projektarbeit_id = ? + ) betreuer + ORDER BY + CASE WHEN status = 'Mitarbeiter' THEN 0 WHEN status = 'Person' THEN 1 ELSE 2 END"; + + $result = $this->ProjektbetreuerModel->execReadOnlyQuery($qry, [$projektarbeit_id]); if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); @@ -86,6 +98,7 @@ class Projektbetreuer extends FHCAPI_Controller //~ } //~ } + // add thesis download link (from external extension) foreach ($projektbetreuer as $pb) { $downloadLink = null; @@ -104,6 +117,9 @@ class Projektbetreuer extends FHCAPI_Controller $this->terminateWithSuccess($this->_addFullNameToBetreuer($projektbetreuer)); } + /** + * Saves (adds or updates) a single Projektbetreuer for a Projektarbeit. + */ public function saveProjektbetreuer() { $projektarbeit_id = $this->input->post('projektarbeit_id'); @@ -118,14 +134,36 @@ class Projektbetreuer extends FHCAPI_Controller if ($this->_validate($projektbetreuer) == false) $this->terminateWithValidationErrors($this->form_validation->error_array()); + // check if assessor has already been assigned + if (isset($projektbetreuer['person_id'])) + { + $this->ProjektbetreuerModel->addSelect('1'); + $betreuerRes = $this->ProjektbetreuerModel->loadWhere( + [ + 'person_id' => $projektbetreuer['person_id'], + 'projektarbeit_id' => $projektbetreuer['projektarbeit_id'], + 'betreuerart_kurzbz' => $projektbetreuer['betreuerart_kurzbz'] + ] + ); + + if (hasData($betreuerRes) + && (!isset($projektbetreuer['person_id_old']) || $projektbetreuer['person_id'] != $projektbetreuer['person_id_old'])) { + return $this->terminateWithError($this->p->t('projektarbeit', 'betreuerZugewiesen'), self::ERROR_TYPE_GENERAL); + } + } + $result = null; + $stunden = isset($projektbetreuer['stunden']) && !isEmptyString($projektbetreuer['stunden']) ? $projektbetreuer['stunden'] : null; + $stundensatz = + isset($projektbetreuer['stundensatz']) && !isEmptyString($projektbetreuer['stundensatz']) ? $projektbetreuer['stundensatz'] : null; + $betreuer = [ 'projektarbeit_id' => $projektarbeit_id, 'person_id' => $projektbetreuer['person_id'], 'note' => $projektbetreuer['note'], - 'stunden' => $projektbetreuer['stunden'], - 'stundensatz' => $projektbetreuer['stundensatz'], + 'stunden' => $stunden, + 'stundensatz' => $stundensatz, 'betreuerart_kurzbz' => $projektbetreuer['betreuerart_kurzbz'] ]; @@ -152,6 +190,9 @@ class Projektbetreuer extends FHCAPI_Controller $this->terminateWithSuccess(hasData($result) ? getData($result) : []); } + /** + * Delete a Projektbetreuer assignment to a Projektarbeit. + */ public function deleteProjektbetreuer() { $projektarbeit_id = $this->input->post('projektarbeit_id'); @@ -159,21 +200,44 @@ class Projektbetreuer extends FHCAPI_Controller $betreuerart_kurzbz = $this->input->post('betreuerart_kurzbz'); if (!isset($projektarbeit_id) || !is_numeric($projektarbeit_id)) - return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> $this->p->t('projektarbeit', 'projektarbeit').' ID'], self::ERROR_TYPE_GENERAL)); + { + return $this->terminateWithError( + $this->p->t('ui', 'error_missingId', ['id'=> $this->p->t('projektarbeit', 'projektarbeit').' ID'], self::ERROR_TYPE_GENERAL) + ); + } if (!isset($person_id) || !is_numeric($person_id)) return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person ID'], self::ERROR_TYPE_GENERAL)); if (!isset($betreuerart_kurzbz)) - return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> $this->p->t('projektarbeit', 'betreuerart')], self::ERROR_TYPE_GENERAL)); + { + return $this->terminateWithError( + $this->p->t('ui', 'error_missingId', ['id'=> $this->p->t('projektarbeit', 'betreuerart')], self::ERROR_TYPE_GENERAL) + ); + } + // check permission if (!$this->ProjektarbeitModel->hasBerechtigungForProjektarbeit($projektarbeit_id)) return $this->_outputAuthError([$this->router->method => ['admin:rw', 'assistenz:rw']]); - $validate = $this->_validateDelete($projektarbeit_id, $person_id); + $validate = $this->_validateDelete($projektarbeit_id, $person_id, $betreuerart_kurzbz); if (isError($validate)) return $this->terminateWithError(getError($validate), self::ERROR_TYPE_GENERAL); + // check if there is a Projektarbeitsbeurteilung - if yes, it is handled (possibly deleted) by external extension. + $beurteilungDeleteSuccess = true; + + Events::trigger( + 'projektarbeitsbeurteilung_delete', + $projektarbeit_id, + function ($value) use (&$beurteilungDeleteSuccess) { + $beurteilungDeleteSuccess = $value; + } + ); + + // if there is still a Beurteilung, Projektarbeit cannot be deleted - return with error + if (!$beurteilungDeleteSuccess) return $this->terminateWithError($this->p->t('projektarbeit', 'error_paarbeitHatBeurteilung')); + $result = $this->ProjektbetreuerModel->delete( ['projektarbeit_id' => $projektarbeit_id, 'person_id' => $person_id, 'betreuerart_kurzbz' => $betreuerart_kurzbz] ); @@ -185,9 +249,12 @@ class Projektbetreuer extends FHCAPI_Controller $this->outputJson($result); } - return $this->terminateWithSuccess(current(getData($result)) ? : null); + return $this->terminateWithSuccess(getData($result)); } + /** + * Get all active Betreuerarten. + */ public function getBetreuerarten() { $result = $this->BetreuerartModel->loadWhere(['aktiv' => true]); @@ -197,6 +264,9 @@ class Projektbetreuer extends FHCAPI_Controller return $this->terminateWithSuccess(hasData($result) ? getData($result) : []); } + /** + * Get all Noten. + */ public function getNoten() { $result = $this->NoteModel->load(); @@ -206,6 +276,9 @@ class Projektbetreuer extends FHCAPI_Controller return $this->terminateWithSuccess(hasData($result) ? getData($result) : []); } + /** + * Get default Stundensätze for an employee in a semester. + */ public function getDefaultStundensaetze() { $person_id = $this->input->get('person_id'); @@ -216,6 +289,9 @@ class Projektbetreuer extends FHCAPI_Controller return $this->terminateWithSuccess($result); } + /** + * Get all Projektbetreuer by search string. + */ public function getProjektbetreuerBySearchQuery() { $searchString = $this->input->get('searchString'); @@ -227,9 +303,23 @@ class Projektbetreuer extends FHCAPI_Controller if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); - return $this->terminateWithSuccess(hasData($result) ? $this->_addFullNameToBetreuer(getData($result)) : []); + if (!hasData($result)) $this->terminateWithSuccess([]); + + $persons = $this->_addFullNameToBetreuer(getData($result)); + + // sort persons by type (employees first) + usort($persons, function ($a, $b) { + $statusRanks = ['Mitarbeiter' => 0, 'Person' => 1, 'Student' => 2]; + return (isset($statusRanks[$a->status]) ? $statusRanks[$a->status] : count($statusRanks) + 1) + - (isset($statusRanks[$b->status]) ? $statusRanks[$b->status] : count($statusRanks) + 1); + }); + + return $this->terminateWithSuccess($persons); } + /** + * Get person info by Id. + */ public function getPerson() { $person_id = $this->input->get('person_id'); @@ -255,9 +345,7 @@ class Projektbetreuer extends FHCAPI_Controller } /** - * - * @param - * @return object success or error + * Validate list of Projektbetreuer. */ public function validateProjektbetreuer() { @@ -277,9 +365,9 @@ class Projektbetreuer extends FHCAPI_Controller } /** - * - * @param - * @return object success or error + * Validation funciton for checking Projektbetreuer input. + * @param $formData Betreuer data + * @return bool true when data is valid */ private function _validate($formData) { @@ -306,26 +394,32 @@ class Projektbetreuer extends FHCAPI_Controller } /** - * - * @param - * @return object success or error + * Check possibility of deletion of a Projektbetreuer. + * @param projektarbeit_id + * @param person_id + * @param betreuerart_kurzbz + * @return object success when delete possible, error otherwise */ - private function _validateDelete($projektarbeit_id, $person_id) + private function _validateDelete($projektarbeit_id, $person_id, $betreuerart_kurzbz) { + // check if contract exists $this->ProjektbetreuerModel->addSelect('vertrag_id'); - $result = $this->ProjektbetreuerModel->loadWhere(['projektarbeit_id' => $projektarbeit_id, 'person_id' => $person_id]); + $result = $this->ProjektbetreuerModel->loadWhere( + ['projektarbeit_id' => $projektarbeit_id, 'person_id' => $person_id, 'betreuerart_kurzbz' => $betreuerart_kurzbz] + ); if (isError($result)) return $result; + // if contract exists, no deletion is possible if (hasData($result) && getData($result)[0]->vertrag_id != null) return error($this->p->t('projektarbeit', 'error_betreuerHatVertrag')); return success(); } /** - * - * @param - * @return object success or error + * Add full name to array with Betreuer. + * @param $betreuerArr + * @return array including Betreuer with their full names */ private function _addFullNameToBetreuer($betreuerArr) { diff --git a/application/controllers/api/frontend/v1/stv/Pruefung.php b/application/controllers/api/frontend/v1/stv/Pruefung.php index e205c85b8..4521c2033 100644 --- a/application/controllers/api/frontend/v1/stv/Pruefung.php +++ b/application/controllers/api/frontend/v1/stv/Pruefung.php @@ -18,6 +18,8 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); +use \DateTime as DateTime; + /** * This controller operates between (interface) the JS (GUI) and the back-end * Provides data to the ajax get calls about addresses @@ -111,7 +113,7 @@ class Pruefung extends FHCAPI_Controller // Load language phrases $this->loadPhrases([ - 'global', 'ui','lehre' + 'global', 'ui', 'lehre', 'exam' ]); } @@ -172,174 +174,11 @@ class Pruefung extends FHCAPI_Controller * * @param lehrveranstaltung_id, student_uid, lehreinheit_id * - * @return values on success - * retval 0: pruefung inserted - * reval 1: pruefung and zeugnisnote inserted - * retval 2: pruefung inserted, no insert Zeugnisnote - * (change after date of examination) - * retval 3: pruefung of type Termin2 inserted - * and pruefung of type Termin1 as well - * retval 5: prueufungen Termin 2 and 1 inserted - * and no insert Zeugnisnote (change after date of examination) + * @return void */ public function insertPruefung() { - $authUID = getAuthUID(); - - $this->load->library('form_validation'); - - $this->form_validation->set_rules('lehrveranstaltung_id', $this->p->t('lehre', 'lehrveranstaltung'), 'required', [ - 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehrveranstaltung')]), - ]); - $this->form_validation->set_rules('lehreinheit_id', $this->p->t('lehre', 'lehreinheit'), 'required', [ - 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehreinheit')]), - ]); - $this->form_validation->set_rules('pruefungstyp_kurzbz', $this->p->t('lehre', 'pruefung'), 'required', [ - 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('global', 'typ')]), - ]); - $this->form_validation->set_rules( - 'datum', - $this->p->t('global', 'datum'), - ['is_valid_date'] - ); - - if ($this->form_validation->run() == false) - { - $this->terminateWithValidationErrors($this->form_validation->error_array()); - } - - //calculate studiensemester_kurzbz this from lehreinheit (case newPruefung) - $studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz'); - if (!$studiensemester_kurzbz) - { - $this->load->model('education/Lehreinheit_model', 'LehreinheitModel'); - - $result = $this->LehreinheitModel->load($this->input->post('lehreinheit_id')); - - $lehreinheit = $this->getDataOrTerminateWithError($result); - $studiensemester_kurzbz = current($lehreinheit)->studiensemester_kurzbz; - - if (isError($result)) - { - $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); - } - } - - $result = $this->PruefungModel->insert([ - 'lehreinheit_id' => $this->input->post('lehreinheit_id'), - 'student_uid' => $this->input->post('student_uid'), - 'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'), - 'datum' => $this->input->post('datum'), - 'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'), - 'note' => $this->input->post('note'), - 'anmerkung' => $this->input->post('anmerkung'), - 'insertamum' => date('c'), - 'insertvon' => $authUID, - ]); - - $this->getDataOrTerminateWithError($result); - - //check if existing zeugnisnote - $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel'); - - $result = $this->ZeugnisnoteModel->loadWhere(array( - 'lehrveranstaltung_id' => $this->input->post('lehrveranstaltung_id'), - 'student_uid' => $this->input->post('student_uid'), - 'studiensemester_kurzbz' => $studiensemester_kurzbz)); - - if (isError($result)) - { - $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); - } - - if (!hasData($result)) - { - //insert zeugnisnote, if not existing - $result = $this->ZeugnisnoteModel->insert(array( - 'lehrveranstaltung_id' => $this->input->post('lehrveranstaltung_id'), - 'student_uid' => $this->input->post('student_uid'), - 'studiensemester_kurzbz' => $studiensemester_kurzbz, - 'note' => $this->input->post('note'), - 'uebernahmedatum' => date('c'), - 'benotungsdatum' => $this->input->post('datum'), - 'insertamum' => date('c'), - 'insertvon' => $authUID - )); - - if (isError($result)) - { - $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); - } - $this->terminateWithSuccess(1); - } - - $return_code = 0; - - //handling Termin1 if not existing - if($this->input->post('pruefungstyp_kurzbz') == "Termin2") - { - $resultP = $this->PruefungModel->loadWhere(array( - 'lehreinheit_id' => $this->input->post('lehreinheit_id'), - 'student_uid' => $this->input->post('student_uid'), - 'pruefungstyp_kurzbz' => 'Termin1')); - - if (isError($resultP)) - { - $this->terminateWithError(getError($resultP), self::ERROR_TYPE_GENERAL); - } - if(!hasData($resultP)) - { - //check if existing Zeugnisnote - $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel'); - $this->ZeugnisnoteModel->addJoin('lehre.tbl_lehreinheit', 'lehrveranstaltung_id'); - - $resultP = $this->ZeugnisnoteModel->loadWhere(array( - 'lehrveranstaltung_id' => $this->input->post('lehrveranstaltung_id'), - 'student_uid' => $this->input->input->post('student_uid'), - 'lehre.tbl_zeugnisnote.studiensemester_kurzbz' => $studiensemester_kurzbz)); - if (isError($resultP)) - { - $this->terminateWithError(getError($resultP), self::ERROR_TYPE_GENERAL); - } - if (!hasData($resultP)) - { - $this->terminateWithError("Zeugnisnote existiert nicht", self::ERROR_TYPE_GENERAL); - } - $dataNote = current(getData($resultP)); - - $resultN = $this->PruefungModel->insert([ - 'lehreinheit_id' => $this->input->post('lehreinheit_id'), - 'student_uid' => $this->input->post('student_uid'), - 'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'), - 'datum' => $dataNote->benotungsdatum, - 'pruefungstyp_kurzbz' => 'Termin1', - 'note' => $dataNote->note, - 'punkte' => $dataNote->punkte, - 'anmerkung' => 'automatisiert aus Zeugnisnote erstellt', - 'insertamum' => date('c'), - 'insertvon' => $authUID, - ]); - - if (isError($resultN)) { - $this->terminateWithError(getError($resultN), self::ERROR_TYPE_GENERAL); - } - $return_code = 3; - } - } - - $note = current(getData($result)); - $uebernahmedatum = new DateTime($note->uebernahmedatum); - $benotungsdatum = new DateTime($note->benotungsdatum); - - $checkDate = $uebernahmedatum === '' || $benotungsdatum > $uebernahmedatum - ? $benotungsdatum - : $uebernahmedatum; - - if ($checkDate >= $this->input->post('datum') && $note !== $note->note) - { - $this->terminateWithSuccess($return_code + 2); - } - $this->terminateWithSuccess($return_code + 2); + $this->insertOrUpdatePruefung(); } /** @@ -348,8 +187,6 @@ class Pruefung extends FHCAPI_Controller * @param pruefung_id * * @return success or error - * - * no impact on lehre.tbl_zeugnisnote */ public function updatePruefung($pruefung_id) { @@ -359,48 +196,7 @@ class Pruefung extends FHCAPI_Controller if (!$oldpruefung) show_404(); // Pruefung that should be updated does not exist - $authUID = getAuthUID(); - - $this->load->library('form_validation'); - - $this->form_validation->set_rules('lehrveranstaltung_id', $this->p->t('lehre', 'lehrveranstaltung'), 'required', [ - 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehrveranstaltung')]), - ]); - $this->form_validation->set_rules('lehreinheit_id', $this->p->t('lehre', 'lehreinheit'), 'required', [ - 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehreinheit')]), - ]); - $this->form_validation->set_rules('pruefungstyp_kurzbz', $this->p->t('lehre', 'pruefung'), 'required', [ - 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('global', 'typ')]), - ]); - $this->form_validation->set_rules( - 'datum', - $this->p->t('global', 'datum'), - ['is_valid_date'] - ); - - if ($this->form_validation->run() == false) - { - $this->terminateWithValidationErrors($this->form_validation->error_array()); - } - - $result = $this->PruefungModel->update( - [ - 'pruefung_id' => $pruefung_id - ], - [ 'lehreinheit_id' => $this->input->post('lehreinheit_id'), - 'student_uid' => $this->input->post('student_uid'), - 'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'), - 'note' => $this->input->post('note'), - 'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'), - 'datum' => $this->input->post('datum'), - 'anmerkung' => $this->input->post('anmerkung'), - 'updatevon' => $authUID, - 'updateamum' => date('c'), - ] - ); - $this->getDataOrTerminateWithError($result); - - return $this->outputJsonSuccess(true); + $this->insertOrUpdatePruefung($pruefung_id); } /** @@ -574,4 +370,198 @@ class Pruefung extends FHCAPI_Controller return $this->terminateWithSuccess($data); } + + protected function insertOrUpdatePruefung($pruefung_id=null) + { + $authUID = getAuthUID(); + + $this->load->library('form_validation'); + + $this->form_validation->set_rules('lehreinheit_id', $this->p->t('lehre', 'lehreinheit'), 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehreinheit')]), + ]); + $this->form_validation->set_rules('pruefungstyp_kurzbz', $this->p->t('lehre', 'pruefung'), 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('global', 'typ')]), + ]); + $this->form_validation->set_rules( + 'datum', + $this->p->t('global', 'datum'), + ['is_valid_date'] + ); + + if ($this->form_validation->run() == false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel'); + + $this->PruefungModel->db->trans_start(); + + if ($this->input->post('pruefungstyp_kurzbz') == "Termin2") + { + //Wenn ein 2. Termin angelegt wird, und kein 1. Termin vorhanden ist, + //dann wird auch ein 1. Termin angelegt mit der derzeitigen Zeugnisnote + $resultP = $this->PruefungModel->loadWhere(array( + 'lehreinheit_id' => $this->input->post('lehreinheit_id'), + 'student_uid' => $this->input->post('student_uid'), + 'pruefungstyp_kurzbz' => 'Termin1')); + + $termin1 = $this->getDataOrTerminateWithError($resultP); + if (!$termin1) + { + //check if existing Zeugnisnote + $this->ZeugnisnoteModel->addJoin('lehre.tbl_lehreinheit', 'lehrveranstaltung_id'); + + $this->ZeugnisnoteModel->db->where( + 'lehre.tbl_zeugnisnote.studiensemester_kurzbz', + 'lehre.tbl_lehreinheit.studiensemester_kurzbz', + false + ); + $resultP = $this->ZeugnisnoteModel->loadWhere(array( + 'lehrveranstaltung_id' => $this->input->post('lehrveranstaltung_id'), + 'student_uid' => $this->input->post('student_uid') + )); + + $zeugnisnoten = $this->getDataOrTerminateWithError($resultP); + if ($zeugnisnoten) + { + $zeugnisnote = current($zeugnisnoten); + + $resultN = $this->PruefungModel->insert([ + 'lehreinheit_id' => $this->input->post('lehreinheit_id'), + 'student_uid' => $this->input->post('student_uid'), + 'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'), + 'datum' => $zeugnisnote->benotungsdatum, + 'pruefungstyp_kurzbz' => 'Termin1', + 'note' => $zeugnisnote->note, + 'punkte' => $zeugnisnote->punkte, + 'anmerkung' => 'automatisiert aus Zeugnisnote erstellt', + 'insertamum' => date('c'), + 'insertvon' => $authUID, + ]); + + $this->getDataOrTerminateWithError($resultN); + } + //Wenn keine Zeugnisnote vorhanden ist, dann wird kein + //1.Termin angelegt + } + } + + if(intval($pruefung_id) > 0) + { + $result = $this->PruefungModel->update( + [ + 'pruefung_id' => $pruefung_id + ], + [ 'lehreinheit_id' => $this->input->post('lehreinheit_id'), + 'student_uid' => $this->input->post('student_uid'), + 'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'), + 'note' => $this->input->post('note'), + 'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'), + 'datum' => $this->input->post('datum'), + 'anmerkung' => $this->input->post('anmerkung'), + 'updatevon' => $authUID, + 'updateamum' => date('c'), + ] + ); + } + else + { + $result = $this->PruefungModel->insert([ + 'lehreinheit_id' => $this->input->post('lehreinheit_id'), + 'student_uid' => $this->input->post('student_uid'), + 'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'), + 'datum' => $this->input->post('datum'), + 'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'), + 'note' => $this->input->post('note'), + 'anmerkung' => $this->input->post('anmerkung'), + 'insertamum' => date('c'), + 'insertvon' => $authUID, + 'punkte' => $this->input->post('punkte') ? str_replace(',', '.', $this->input->post('punkte')) : null + ]); + } + + $this->getDataOrTerminateWithError($result); + + //get studiensemester_kurzbz and lehreveranstaltung_id from lehreinheit + $this->load->model('education/Lehreinheit_model', 'LehreinheitModel'); + + $result = $this->LehreinheitModel->load($this->input->post('lehreinheit_id')); + + $lehreinheiten = $this->getDataOrTerminateWithError($result); + + if (!$lehreinheiten) { + $this->terminateWithValidationErrors([ + 'lehreinheit_id' => $this->p->t('ui', 'error_fieldNotFound', [ + 'field' => $this->p->t('lehre', 'lehreinheit') + ]) + ]); + } + $lehreinheit = current($lehreinheiten); + $studiensemester_kurzbz = $lehreinheit->studiensemester_kurzbz; + $lehrveranstaltung_id = $lehreinheit->lehrveranstaltung_id; + + //check if existing zeugnisnote + $result = $this->ZeugnisnoteModel->loadWhere(array( + 'lehrveranstaltung_id' => $lehrveranstaltung_id, + 'student_uid' => $this->input->post('student_uid'), + 'studiensemester_kurzbz' => $studiensemester_kurzbz + )); + + $zeugnisnoten = $this->getDataOrTerminateWithError($result); + + if (!$zeugnisnoten) + { + //insert zeugnisnote, if not existing + $result = $this->ZeugnisnoteModel->insert(array( + 'lehrveranstaltung_id' => $lehrveranstaltung_id, + 'student_uid' => $this->input->post('student_uid'), + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'note' => $this->input->post('note'), + 'uebernahmedatum' => date('c'), + 'benotungsdatum' => $this->input->post('datum'), + 'insertamum' => date('c'), + 'insertvon' => $authUID, + 'punkte' => $this->input->post('punkte') ? str_replace(',', '.', $this->input->post('punkte')) : null + )); + + $this->getDataOrTerminateWithError($result); + + $this->PruefungModel->db->trans_complete(); + $this->terminateWithSuccess(); + } + + $note = current($zeugnisnoten); + $uebernahmedatum = new DateTime($note->uebernahmedatum); + $benotungsdatum = new DateTime($note->benotungsdatum); + $pruefungsdatum = new DateTime($this->input->post('datum')); + + $checkDate = $note->uebernahmedatum === '' || $benotungsdatum > $uebernahmedatum + ? $benotungsdatum + : $uebernahmedatum; + + if ($checkDate > $pruefungsdatum && $this->input->post('note') !== $note->note) + { + $this->PruefungModel->db->trans_complete(); + $this->terminateWithSuccess($this->p->t('exam', 'hinweis_changeAfterExamDate')); + } + + //update zeugnisnote, if existing and valid datum + $result = $this->ZeugnisnoteModel->update([ + 'lehrveranstaltung_id' => $lehrveranstaltung_id, + 'student_uid' => $this->input->post('student_uid'), + 'studiensemester_kurzbz' => $studiensemester_kurzbz + ], [ + 'note' => $this->input->post('note'), + 'uebernahmedatum' => date('c'), + 'benotungsdatum' => $this->input->post('datum'), + 'updateamum' => date('c'), + 'updatevon' => $authUID, + 'punkte' => $this->input->post('punkte') ? str_replace(',', '.', $this->input->post('punkte')) : null + ]); + + $this->PruefungModel->db->trans_complete(); + $this->terminateWithSuccess(); + } } diff --git a/application/controllers/api/frontend/v1/stv/Status.php b/application/controllers/api/frontend/v1/stv/Status.php index e490772db..3c0a639cd 100644 --- a/application/controllers/api/frontend/v1/stv/Status.php +++ b/application/controllers/api/frontend/v1/stv/Status.php @@ -636,7 +636,7 @@ class Status extends FHCAPI_Controller $this->load->library('PrestudentLib'); - $this->prestudentlib->setFirstStudent( + $resFirstStudent = $this->prestudentlib->setFirstStudent( $prestudent_id, $lastAufgenommener->studiensemester_kurzbz, $lastAufgenommener->ausbildungssemester, @@ -645,9 +645,8 @@ class Status extends FHCAPI_Controller $this->input->post('statusgrund_id') ); - $this->getDataOrTerminateWithError($result); - - $this->db->trans_commit(); + $this->db->trans_complete(); + $this->getDataOrTerminateWithError($resFirstStudent); return $this->outputJsonSuccess(true); } @@ -1078,6 +1077,24 @@ class Status extends FHCAPI_Controller $this->terminateWithSuccess(true); } + protected function checkForCriticalChangesBis($oldstatus) + { + $changedFields = array(); + $allowedFields = array('anmerkung', 'statusgrund_id'); + $oldstatus_array = get_object_vars($oldstatus); + foreach($oldstatus_array as $key => $oldValue) + { + $newValue = $this->input->post($key); + if( $newValue !== $oldValue ) + { + $changedFields[] = $key; + } + } + $criticalFieldsChanged = array_diff($changedFields, $allowedFields); + $hasCriticalChangesBis = count($criticalFieldsChanged) > 0 ? true : false; + return $hasCriticalChangesBis; + } + /** * Updates a status entry * @@ -1102,6 +1119,7 @@ class Status extends FHCAPI_Controller $oldstatus = current($oldstatus); + $hasCriticalChangesBis = $this->checkForCriticalChangesBis($oldstatus); $isBerechtigtNoStudstatusCheck = $this->permissionlib->isBerechtigt('student/keine_studstatuspruefung'); $isBerechtigtBasisPrestudentstatus = $this->permissionlib->isBerechtigt('basis/prestudentstatus'); @@ -1112,7 +1130,6 @@ class Status extends FHCAPI_Controller $ausbildungssemester = $this->input->post('ausbildungssemester') ?: $oldstatus->ausbildungssemester; $datum = $this->input->post('datum') ?: $oldstatus->datum; - //Form Validation $this->load->library('form_validation'); @@ -1135,9 +1152,15 @@ class Status extends FHCAPI_Controller $this->p->t('global', 'datum'), [ 'is_valid_date', - ['meldestichtag_not_exceeded', function ($value) use ($isBerechtigtNoStudstatusCheck) { + ['meldestichtag_not_exceeded', function ($value) use ($isBerechtigtNoStudstatusCheck, $hasCriticalChangesBis){ if ($isBerechtigtNoStudstatusCheck) - return true; // Skip if access right says so + { + return true; // Skip if access right says so*/ + } + if (!$hasCriticalChangesBis) { + return true; // Skip if no critical changes were made + } + if (!$value) return true; // Error will be handled by the required statement above @@ -1341,6 +1364,7 @@ class Status extends FHCAPI_Controller 'updateamum' => date('c'), 'updatevon' => $authUID ]; + $nullableFields = ['statusgrund_id', 'anmerkung', 'rt_stufe']; foreach ([ 'orgform_kurzbz', 'anmerkung', @@ -1349,8 +1373,17 @@ class Status extends FHCAPI_Controller 'rt_stufe', 'statusgrund_id' ] as $key) - if ($this->input->post($key)) + { + if (in_array($key, $nullableFields)) + { + $updateData[$key] = ($this->input->post($key) === '') ? null : $this->input->post($key); + } + else if ($this->input->post($key)) + { $updateData[$key] = $this->input->post($key); + } + } + if ($this->input->post('bestaetigtam')) { $updateData['bestaetigtam'] = $this->input->post('bestaetigtam'); diff --git a/application/controllers/api/frontend/v1/stv/Student.php b/application/controllers/api/frontend/v1/stv/Student.php index f0172da8a..2721bbd6f 100644 --- a/application/controllers/api/frontend/v1/stv/Student.php +++ b/application/controllers/api/frontend/v1/stv/Student.php @@ -37,7 +37,7 @@ class Student extends FHCAPI_Controller 'get' => ['admin:r', 'assistenz:r'], 'save' => ['admin:rw', 'assistenz:rw'], 'saveStudent' => ['admin:rw', 'assistenz:rw'], - 'check' => ['admin:rw', 'assistenz:rw'], + 'getPerson' => ['admin:rw', 'assistenz:rw'], 'add' => ['admin:rw', 'assistenz:rw'] // TODO(chris): extra permissions ]); @@ -136,14 +136,9 @@ class Student extends FHCAPI_Controller ); } $this->PrestudentModel->addSelect( - "( - SELECT status_kurzbz - FROM public.tbl_prestudentstatus pss - WHERE pss.prestudent_id = public.tbl_prestudent.prestudent_id - AND pss.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . " - ORDER BY GREATEST(pss.datum, '0001-01-01') DESC - LIMIT 1 - ) AS statusofsemester" + "public.get_rolle_prestudent(public.tbl_prestudent.prestudent_id, " + . $this->PrestudentModel->escape($studiensemester_kurzbz) + . ") AS statusofsemester" ); $this->PrestudentModel->addJoin('public.tbl_student s', 'prestudent_id', 'LEFT'); @@ -159,9 +154,9 @@ class Student extends FHCAPI_Controller 'LEFT');*/ $result = $this->PrestudentModel->loadWhere(['tbl_prestudent.prestudent_id' => $prestudent_id]); - + $student = $this->getDataOrTerminateWithError($result); - + if (!$student) return show_404(); @@ -221,7 +216,7 @@ class Student extends FHCAPI_Controller ]); $this->load->library('UDFLib'); - + $result = $this->udflib->getCiValidations($this->PersonModel, $this->input->post()); $udf_field_validations = $this->getDataOrTerminateWithError($result); @@ -232,7 +227,7 @@ class Student extends FHCAPI_Controller $this->terminateWithValidationErrors($this->form_validation->error_array()); $result = $this->StudentModel->loadWhere(['prestudent_id' => $prestudent_id]); - + $student = $this->getDataOrTerminateWithError($result); $uid = $student ? current($student)->student_uid : null; @@ -245,7 +240,6 @@ class Student extends FHCAPI_Controller $person_id = $person ? current($person)->person_id : null; - $array_allowed_props_lehrverband = ['verband', 'semester', 'gruppe']; $update_lehrverband = array(); foreach ($array_allowed_props_lehrverband as $prop) { @@ -305,7 +299,7 @@ class Student extends FHCAPI_Controller } $array_allowed_props_student = ['matrikelnr']; - if($this->isLaufendesSemester($studiensemester_kurzbz)) + if($this->isLaufendesSemester($studiensemester_kurzbz)) { $array_allowed_props_student = ['matrikelnr', 'verband', 'semester', 'gruppe']; } @@ -322,6 +316,10 @@ class Student extends FHCAPI_Controller foreach ($array_allowed_props_benutzer as $prop) { $val = $this->input->post($prop); if ($val !== null) { + if($prop === 'alias' && $val === '') + { + $val = null; + } $update_benutzer[$prop] = $val; } } @@ -462,7 +460,7 @@ class Student extends FHCAPI_Controller return $this->save($student->prestudent_id, $studiensemester_kurzbz); } - public function check() + public function getPerson() { $this->load->library('form_validation'); @@ -480,21 +478,55 @@ class Student extends FHCAPI_Controller $this->load->model('person/Person_model', 'PersonModel'); + $this->PersonModel->addSelect( + 'person_id, vorname, nachname, vornamen, wahlname, gebdatum, staatsbuergerschaft, geburtsnation, sprache, anrede, + titelpost, titelpre, gebort, gebzeit, homepage, geschlecht, matr_nr, + aktiv, unruly, tbl_geschlecht.bezeichnung_mehrsprachig AS geschlecht_bezeichnung' + ); + $this->PersonModel->addJoin('public.tbl_geschlecht', 'geschlecht'); + if ($gebdatum) $this->PersonModel->db->where('gebdatum', (new DateTime($gebdatum))->format('Y-m-d')); if ($vorname && $nachname) { $this->PersonModel->db->or_group_start(); - $this->PersonModel->db->where('LOWER(nachname)', 'LOWER(' . $this->PersonModel->db->escape($nachname) . ')', false); - $this->PersonModel->db->where('LOWER(vorname)', 'LOWER(' . $this->PersonModel->db->escape($vorname) . ')', false); + $this->PersonModel->db->where('LOWER(nachname)', 'LOWER(' . $this->PersonModel->db->escape(trim($nachname)) . ')', false); + $this->PersonModel->db->where('LOWER(vorname)', 'LOWER(' . $this->PersonModel->db->escape(trim($vorname)) . ')', false); $this->PersonModel->db->group_end(); } elseif ($nachname) { - $this->PersonModel->db->or_where('LOWER(nachname)', 'LOWER(' . $this->PersonModel->escape($nachname) . ')', false); + $this->PersonModel->db->or_where('LOWER(nachname)', 'LOWER(' . $this->PersonModel->escape(trim($nachname)) . ')', false); } $result = $this->PersonModel->load(); $data = $this->getDataOrTerminateWithError($result); + $this->load->model('person/Adresse_model', 'AdresseModel'); + $this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel'); + + foreach ($data as $person) + { + // get adresses + $langIdx = $this->_getLanguageIndex() - 1; + $person->geschlecht_bezeichnung = isset($person->geschlecht_bezeichnung[$langIdx]) ? $person->geschlecht_bezeichnung[$langIdx] : ''; + + // get Adresse + $this->AdresseModel->addOrder('heimatadresse', 'DESC'); + $this->AdresseModel->addOrder('zustelladresse', 'DESC'); + $this->AdresseModel->addOrder('adresse_id', 'DESC'); + $result = $this->AdresseModel->loadWhere(['person_id' => $person->person_id]); + + $adressen = $this->getDataOrTerminateWithError($result); + + $person->adressen = $adressen; + + // get status + $result = $this->PrestudentstatusModel->getLastStatusPerson($person->person_id); + + $status = $this->getDataOrTerminateWithError($result); + + $person->status = $status; + } + $this->terminateWithSuccess($data); } @@ -508,71 +540,52 @@ class Student extends FHCAPI_Controller $_POST['ausbildungssemester'] = 0; } - $this->load->library('form_validation'); + $this->_validate(); - $this->form_validation->set_rules('nachname', 'Nachname', 'callback_requiredIfNotPersonId', [ - 'requiredIfNotPersonId' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'nachname')]) - ]); - $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('address[func]', 'Address', 'required|integer|less_than[2]|greater_than[-2]'); - $this->form_validation->set_rules('address[plz]', 'PLZ', 'callback_requiredIfAddressFunc', [ - 'requiredIfAddressFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'plz')]) - ]); - $this->form_validation->set_rules('address[gemeinde]', 'Gemeinde', 'callback_requiredIfAddressFunc', [ - 'requiredIfAddressFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'gemeinde')]) - ]); - $this->form_validation->set_rules('address[ort]', 'Ort', 'callback_requiredIfAddressFunc', [ - 'requiredIfAddressFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'ort')]) - ]); - $this->form_validation->set_rules('address[address]', 'Adresse', 'callback_requiredIfAddressFunc', [ - 'requiredIfAddressFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'adresse')]) - ]); - $this->form_validation->set_rules('email', 'E-Mail', 'valid_email'); - $this->form_validation->set_rules('studiengang_kz', 'Studiengang', 'callback_requiredIfStudentFunc', [ - 'requiredIfStudentFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'studiengang')]) - ]); - $this->form_validation->set_rules('studiensemester_kurzbz', 'Studiensemester', 'callback_requiredIfStudentFunc', [ - 'requiredIfStudentFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'studiensemester')]) - ]); - $this->form_validation->set_rules('ausbildungssemester', 'Ausbildungssemester', 'callback_requiredIfStudentFunc|integer|less_than[9]|greater_than[-1]', [ - 'requiredIfStudentFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'ausbildungssemester')]) - ]); - // TODO(chris): validate studienplan with studiengang, semester and orgform? - // TODO(chris): validate person_id, studiengang_kz, studiensemester_kurzbz, orgform_kurzbz, nation, gemeinde, ort, geschlecht? - - if (!$this->form_validation->run()) - $this->terminateWithValidationErrors($this->form_validation->error_array()); - - // 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'); + $this->load->model('organisation/Lehrverband_model', 'LehrverbandModel'); + $this->load->model('education/Studentlehrverband_model', 'StudentlehrverbandModel'); - $this->db->trans_start(); + $this->load->library('PrestudentLib'); - $result = $this->addInteressent(); + $errors = []; + $person_id = null; - $this->db->trans_complete(); + $this->db->trans_begin(); - if ($this->db->trans_status() === FALSE) - $this->terminateWithError('TODO(chris): TEXT', self::ERROR_TYPE_GENERAL); + $result = $this->_addPerson(); + if (isError($result)) $errors[] = getError($result); - $data = $this->getDataOrTerminateWithError($result); + if (hasData($result)) + { + $person_id = getData($result); + $result = $this->_addAdresse($person_id); + if (isError($result)) $errors[] = getError($result); + $result = $this->_addKontakt($person_id); + if (isError($result)) $errors[] = getError($result); + if (!$this->input->post('personOnly')) $result = $this->_addFirstPrestudentstatus($person_id); + if (isError($result)) $errors[] = getError($result); + } - $this->terminateWithSuccess($data); + if ($this->db->trans_status() === FALSE || !isEmptyArray($errors)) + { + $this->db->trans_rollback(); + $this->terminateWithError(isEmptyArray($errors) ? $this->p->t('stv', 'error_add_student') : $errors); + } + $this->db->trans_commit(); + + $this->terminateWithSuccess($person_id); } - protected function addInteressent() + private function _addPerson() { // Person anlegen wenn nötig $person_id = $this->input->post('person_id'); if (!$person_id) { $this->load->model('person/Person_model', 'PersonModel'); - + $data = [ 'nachname' => $this->input->post('nachname'), 'insertamum' => date('c'), @@ -595,19 +608,25 @@ class Student extends FHCAPI_Controller if ($this->input->post('geschlecht')) $data['geschlecht'] = $this->input->post('geschlecht'); if ($this->input->post('gebdatum')) - $data['gebdatum'] = (new DateTime($this->input->post('datum_obj')))->format('Y-m-d'); + $data['gebdatum'] = (new DateTime($this->input->post('gebdatum')))->format('Y-m-d'); if ($this->input->post('geburtsnation')) $data['geburtsnation'] = $this->input->post('geburtsnation'); if ($this->input->post('staatsbuergerschaft')) $data['staatsbuergerschaft'] = $this->input->post('staatsbuergerschaft'); - $result = $this->PersonModel->insert($data); - $person_id = $this->getDataOrTerminateWithError($result); + return $this->PersonModel->insert($data); } - // Addresse anlegen - $anlegen = $this->input->post('address[func]'); - if ($anlegen) { + return success($person_id); + } + + private function _addAdresse($person_id) + { + // Addresse anlegen? + $anlegen = $this->input->post('address[checked]'); + if ($anlegen === true) + { + // Adresse laden $this->load->model('person/Adresse_model', 'AdresseModel'); $data = [ @@ -619,52 +638,45 @@ class Student extends FHCAPI_Controller 'typ' => 'h', 'zustelladresse' => true, ]; - if ($anlegen < 0) { // Überschreiben + $this->AdresseModel->addSelect('adresse_id'); - $this->AdresseModel->addJoin('public.tbl_adressentyp', 'typ = adressentyp_kurzbz'); - $this->AdresseModel->addOrder('zustelladresse', 'DESC'); - $this->AdresseModel->addOrder('sort'); $result = $this->AdresseModel->loadWhere([ 'person_id' => $person_id ]); - $address = $this->getDataOrTerminateWithError($result); - if ($address) { - $address = current($address); - $data['updateamum'] = date('c'); - $data['updatevon'] = getAuthUID(); + if (isError($result)) return $result; + + // wenn neue Adresse, heimatadresse setzen + if (!hasData($result)) $data['heimatadresse'] = true; - $result = $this->AdresseModel->update($address->adresse_id, $data); - $this->getDataOrTerminateWithError($result); - } else { - //Wenn keine Adrese vorhanden ist dann eine neue Anlegen - $anlegen = 1; - $data['heimatadresse'] = true; - } - } - if ($anlegen > 0) { $data['person_id'] = $person_id; $data['insertamum'] = date('c'); $data['insertvon'] = getAuthUID(); - if (!isset($data['heimatadresse'])) - $data['heimatadresse'] = !$this->input->post('person_id'); - - $result = $this->AdresseModel->insert($data); - $this->getDataOrTerminateWithError($result); - } + + return $this->AdresseModel->insert($data); } - + + return success(null); + } + + private function _addKontakt($person_id) + { // Kontaktdaten $kontaktdaten = []; - foreach (['email', 'telefon', 'mobil'] as $k) { + + foreach (['email', 'telefon', 'mobil'] as $k) + { $v = $this->input->post($k); if ($v) $kontaktdaten[$k] = $v; } - if (count($kontaktdaten)) { + + if (count($kontaktdaten)) + { $this->load->model('person/Kontakt_model', 'KontaktModel'); - foreach ($kontaktdaten as $typ => $kontakt) { + foreach ($kontaktdaten as $typ => $kontakt) + { $data = [ 'person_id' => $person_id, 'kontakttyp' => $typ, @@ -674,87 +686,70 @@ class Student extends FHCAPI_Controller 'insertvon' => getAuthUID() ]; $result = $this->KontaktModel->insert($data); - $this->getDataOrTerminateWithError($result); + if (isError($result)) return $result; } } + return success(null); + } - $personOnly = $anlegen = $this->input->post('personOnly'); + private function _addFirstPrestudentstatus($person_id) + { + // Prestudent anlegen - if (!$personOnly) + // Anmerkung with Ausbildungsart + $studiengang_kz = $this->input->post('studiengang_kz'); + $studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz'); + $ausbildungsart = $this->input->post('ausbildungsart'); + $anmerkung = $this->input->post('anmerkungen'); + $foerderrelevant = null; + if ($ausbildungsart) + $anmerkung .= ' Ausbildungsart:' . $ausbildungsart; + + // Incomings und ausserordentliche sind bei Meldung nicht förderrelevant + $incoming = $this->input->post('incoming'); + if ($incoming || substr($studiengang_kz, 0, 1) == '9') + $foerderrelevant = false; + + // Prestudent speichern + $result = $this->prestudentlib->setPrestudent( + $person_id, + $studiengang_kz, + $this->input->post('letzteausbildung'), + $anmerkung, + $foerderrelevant + ); + if (isError($result)) return $result; + if (!hasData($result)) return error('Error when adding prestudent'); + + $prestudent_id = getData($result); + + // wenn Incoming, Incoming Daten hinzufügen + if ($incoming) { - // Prestudent anlegen - $data = [ - 'aufmerksamdurch_kurzbz' => 'k.A.', - 'person_id' => $person_id, - 'studiengang_kz' => $this->input->post('studiengang_kz'), - 'ausbildungcode' => $this->input->post('letzteausbildung'), - 'anmerkung' => $this->input->post('anmerkungen'), - 'reihungstestangetreten' => false, - 'bismelden' => true - ]; - $ausbildungsart = $this->input->post('ausbildungsart'); - if ($ausbildungsart) - $data['anmerkung'] .= ' Ausbildungsart:' . $ausbildungsart; - // Incomings und ausserordentliche sind bei Meldung nicht förderrelevant - $incoming = $this->input->post('incoming'); - if ($incoming || substr($data['studiengang_kz'], 0, 1) == '9') - $data['foerderrelevant'] = false; - // Wenn die Person schon im System erfasst ist, dann die ZGV des Datensatzes uebernehmen - $this->PrestudentModel->addOrder('zgvmas_code'); - $this->PrestudentModel->addOrder('zgv_code', 'DESC'); - $this->PrestudentModel->addLimit(1); - $result = $this->PrestudentModel->loadWhere([ - 'person_id' => $person_id - ]); - $prestudent = $this->getDataOrTerminateWithError($result); - if ($prestudent) { - $prestudent = current($prestudent); - if ($prestudent->zgv_code) { - $data['zgv_code'] = $prestudent->zgv_code; - $data['zgvort'] = $prestudent->zgvort; - $data['zgvdatum'] = $prestudent->zgvdatum; - - $data['zgvmas_code'] = $prestudent->zgvmas_code; - $data['zgvmaort'] = $prestudent->zgvmaort; - $data['zgvmadatum'] = $prestudent->zgvmadatum; - } - } - // Prestudent speichern - $result = $this->PrestudentModel->insert($data); - $prestudent_id = $this->getDataOrTerminateWithError($result); - - // Prestudent Rolle Anlegen - $data = [ - 'prestudent_id' => $prestudent_id, - 'status_kurzbz' => $incoming ? 'Incoming' : 'Interessent', - 'studiensemester_kurzbz' => $this->input->post('studiensemester_kurzbz'), - 'ausbildungssemester' => $this->input->post('ausbildungssemester') ?: 0, - 'orgform_kurzbz' => $this->input->post('orgform_kurzbz') ?: null, - 'studienplan_id' => $this->input->post('studienplan_id') ?: null, - 'datum' => date('Y-m-d'), - 'insertamum' => date('c'), - 'insertvon' => getAuthUID() - ]; - $result = $this->PrestudentstatusModel->insert($data); - $this->getDataOrTerminateWithError($result); - - if ($incoming) { - // TODO(chris): IMPLEMENT! - //Matrikelnummer und UID generieren - //Benutzerdatensatz anlegen - //Studentendatensatz anlegen - //StudentLehrverband anlegen - } + $statusResult = $this->prestudentlib->setFirstIncoming( + $prestudent_id, + $studiengang_kz, + $studiensemester_kurzbz, + $this->input->post('orgform_kurzbz'), + $this->input->post('studienplan_id') + ); } - // TODO(chris): DEBUG - /*$result = $this->PrestudentModel->loadWhere([ - 'pestudent_id' => 1 - ]); - if (isError($result)) { - return $result; - }*/ + else + { + // Prestudent Rolle Anlegen + $statusResult = $this->prestudentlib->setFirstStatus( + $prestudent_id, + $this->PrestudentstatusModel::STATUS_INTERESSENT, + $studiensemester_kurzbz, + $this->input->post('ausbildungssemester'), + $this->input->post('orgform_kurzbz'), + $this->input->post('studienplan_id') + ); + } + if (!hasData($statusResult)) return error('error when adding status'); + if (isError($statusResult)) return $statusResult; - return success($person_id); + return success($prestudent_id); } public function requiredIfNotPersonId($value) @@ -766,20 +761,84 @@ class Student extends FHCAPI_Controller public function requiredIfAddressFunc($value) { - if (!$_POST['address']['func'] || $_POST['address']['func'] == 0) + if (!isset($_POST['address']['checked']) || !$_POST['address']['checked']) return true; return !!$value; } public function requiredIfStudentFunc($value) { - if ($_POST['personOnly']) + if (isset($_POST['personOnly']) && $_POST['personOnly']) return true; return !!$value; } - public function isValidDate($value) + public function requiredIfStudentAndNotIncomingFunc($value) { - return isValidDate($value); + if ((isset($_POST['incoming']) && $_POST['incoming']) || $this->requiredIfStudentFunc($value)) + return true; + return !!$value; + } + + /** + * Validates input data. Terminates with validation errors, if invalid. + */ + private function _validate() + { + $this->load->library('form_validation'); + + $this->form_validation->set_rules('nachname', 'Nachname', 'callback_requiredIfNotPersonId', [ + 'requiredIfNotPersonId' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'nachname')]) + ]); + $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('address[checked]', 'Address', 'required'); + $this->form_validation->set_rules('address[plz]', 'PLZ', 'callback_requiredIfAddressFunc', [ + 'requiredIfAddressFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'plz')]) + ]); + $this->form_validation->set_rules('address[gemeinde]', 'Gemeinde', 'callback_requiredIfAddressFunc', [ + 'requiredIfAddressFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'gemeinde')]) + ]); + $this->form_validation->set_rules('address[ort]', 'Ort', 'callback_requiredIfAddressFunc', [ + 'requiredIfAddressFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'ort')]) + ]); + $this->form_validation->set_rules('address[address]', 'Adresse', 'callback_requiredIfAddressFunc', [ + 'requiredIfAddressFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'adresse')]) + ]); + $this->form_validation->set_rules('email', 'E-Mail', 'valid_email'); + $this->form_validation->set_rules('studiengang_kz', 'Studiengang', 'callback_requiredIfStudentFunc', [ + 'requiredIfStudentFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'studiengang')]) + ]); + $this->form_validation->set_rules('studiensemester_kurzbz', 'Studiensemester', 'callback_requiredIfStudentFunc', [ + 'requiredIfStudentFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'studiensemester')]) + ]); + $this->form_validation->set_rules( + 'ausbildungssemester', + 'Ausbildungssemester', + 'callback_requiredIfStudentAndNotIncomingFunc|integer|less_than[9]|greater_than[-1]', + [ + 'requiredIfStudentAndNotIncomingFunc' => + $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'ausbildungssemester')]), + ] + ); + // TODO(chris): validate studienplan with studiengang, semester and orgform? + // TODO(chris): validate person_id, studiengang_kz, studiensemester_kurzbz, orgform_kurzbz, nation, gemeinde, ort, geschlecht? + + if (!$this->form_validation->run()) + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + private function _getLanguageIndex() + { + $this->load->model('system/Sprache_model', 'SpracheModel'); + $this->SpracheModel->addSelect('index'); + $result = $this->SpracheModel->loadWhere(array('sprache' => getUserLanguage())); + $this->addMeta('lang', getUserLanguage()); + + return hasData($result) ? getData($result)[0]->index : 1; } } diff --git a/application/controllers/api/frontend/v1/stv/Students.php b/application/controllers/api/frontend/v1/stv/Students.php index 12440f036..acacca052 100644 --- a/application/controllers/api/frontend/v1/stv/Students.php +++ b/application/controllers/api/frontend/v1/stv/Students.php @@ -765,6 +765,81 @@ class Students extends FHCAPI_Controller $this->terminateWithSuccess($data); } + /** + * @param string $studiensemester_kurzbz + * + * @return void + */ + public function search($studiensemester_kurzbz) + { + $this->addMeta('ci_method', __FUNCTION__); + $this->addMeta('ci_params', array( + 'studiensemester_kurzbz' => $studiensemester_kurzbz + )); + + $this->load->library('SearchLib', [ 'config' => 'searchstv' ]); + $this->load->library('form_validation'); + + $this->form_validation->set_rules('searchstr', 'searchstr', 'required'); + $this->form_validation->set_rules('types[]', 'types', 'required'); + + if (!$this->form_validation->run()) + $this->terminateWithValidationErrors($this->form_validation->error_array()); + + $result = $this->searchlib->search($this->input->post('searchstr'), $this->input->post('types')); + + $data = $this->getDataOrTerminateWithError($result); + + + $this->load->model('crm/Prestudent_model', 'PrestudentModel'); + + $this->prepareQuery($studiensemester_kurzbz); + + $this->PrestudentModel->addSelect("COALESCE(v.semester::text, CASE WHEN public.get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL) IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent') THEN public.get_absem_prestudent(tbl_prestudent.prestudent_id, NULL)::text ELSE ''::text END) AS semester", false); + $this->PrestudentModel->addSelect('v.verband'); + $this->PrestudentModel->addSelect('v.gruppe'); + + //add status per semester + $this->PrestudentModel->addSelect( + "public.get_rolle_prestudent(public.tbl_prestudent.prestudent_id, " + . $this->PrestudentModel->escape($studiensemester_kurzbz) + . ") AS statusofsemester" + ); + + $this->addSelectPrioRel(); + + $this->addFilter($studiensemester_kurzbz); + + $prestudent_ids = []; + $student_uids = []; + $this->addMeta('data', $data); + foreach ($data as $row) { + $dataset = json_decode($row->data); + if ($row->type == 'prestudent') { + $prestudent_ids[] = $dataset->prestudent_id; + } elseif ($row->type == 'student') { + $student_uids[] = $dataset->uid; + } + } + + if ($prestudent_ids && $student_uids) { + $this->PrestudentModel->db->where_in('tbl_prestudent.prestudent_id', $prestudent_ids); + $this->PrestudentModel->db->or_where_in('s.student_uid', $student_uids); + } elseif ($prestudent_ids) { + $this->PrestudentModel->db->where_in('tbl_prestudent.prestudent_id', $prestudent_ids); + } elseif ($student_uids) { + $this->PrestudentModel->db->where_in('s.student_uid', $student_uids); + } else { + $this->terminateWithSuccess([]); + } + + $result = $this->PrestudentModel->load(); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + /** * @param string|null $studiensemester_kurzbz * @param string $type @@ -817,14 +892,9 @@ class Students extends FHCAPI_Controller //add status per semester $this->PrestudentModel->addSelect( - "( - SELECT status_kurzbz - FROM public.tbl_prestudentstatus pss - WHERE pss.prestudent_id = public.tbl_prestudent.prestudent_id - AND pss.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . " - ORDER BY GREATEST(pss.datum, '0001-01-01') DESC - LIMIT 1 - ) AS statusofsemester" + "public.get_rolle_prestudent(public.tbl_prestudent.prestudent_id, " + . $this->PrestudentModel->escape($studiensemester_kurzbz) + . ") AS statusofsemester" ); $this->PrestudentModel->addSelect('UPPER(stg.typ || stg.kurzbz) AS studiengang'); diff --git a/application/controllers/api/frontend/v1/stv/Verband.php b/application/controllers/api/frontend/v1/stv/Verband.php index 9fcd97c91..32ef30a45 100644 --- a/application/controllers/api/frontend/v1/stv/Verband.php +++ b/application/controllers/api/frontend/v1/stv/Verband.php @@ -165,7 +165,17 @@ class Verband extends FHCAPI_Controller $this->StudiengangModel->addDistinct(); $this->StudiengangModel->addSelect("CONCAT(" . $this->StudiengangModel->escape($link) . ", semester) AS link", false); - $this->StudiengangModel->addSelect("CONCAT(UPPER(CONCAT(typ, kurzbz)), '-', semester, (SELECT CASE WHEN bezeichnung IS NULL OR bezeichnung='' THEN ''::TEXT ELSE CONCAT(' (', bezeichnung, ')') END FROM public.tbl_lehrverband WHERE studiengang_kz=v.studiengang_kz AND semester=v.semester ORDER BY verband, gruppe LIMIT 1)) AS name", false); + $this->StudiengangModel->addSelect("CONCAT( + UPPER(CONCAT(typ, kurzbz)), + '-', + semester, + ( + SELECT CASE WHEN bezeichnung IS NULL OR bezeichnung='' THEN ''::TEXT ELSE CONCAT(' (', bezeichnung, ')') END + FROM public.tbl_lehrverband + WHERE studiengang_kz=v.studiengang_kz AND semester=v.semester + ORDER BY verband, gruppe LIMIT 1 + ) + ) AS name", false); $this->StudiengangModel->addSelect('semester'); $this->StudiengangModel->addSelect($this->StudiengangModel->escape($studiengang_kz) . '::integer AS stg_kz', false); @@ -173,6 +183,7 @@ class Verband extends FHCAPI_Controller $this->StudiengangModel->addOrder('semester'); if ($org_form !== null) { + $this->StudiengangModel->addSelect("v.orgform_kurzbz"); $this->StudiengangModel->db->group_start(); $this->StudiengangModel->db->where('v.semester', 0); $this->StudiengangModel->db->or_where('v.orgform_kurzbz', $org_form); @@ -188,6 +199,7 @@ class Verband extends FHCAPI_Controller array_unshift($list, [ 'name' => 'PreStudent', 'link' => $link . 'prestudent', + 'no_sem_reload' => true, 'stg_kz' => (int)$studiengang_kz, 'children' => $this->getStdSem($link . 'prestudent/', $studiengang_kz) ]); @@ -203,6 +215,7 @@ class Verband extends FHCAPI_Controller $this->StudienordnungModel->addDistinct(); $this->StudienordnungModel->addSelect("CONCAT(studiengang_kz, '/', p.orgform_kurzbz) AS link"); $this->StudienordnungModel->addSelect("p.orgform_kurzbz AS name"); + $this->StudienordnungModel->addSelect("studiengang_kz AS stg_kz"); $this->StudienordnungModel->addJoin('lehre.tbl_studienplan p', 'studienordnung_id'); @@ -216,7 +229,6 @@ class Verband extends FHCAPI_Controller $list = array_merge($list, $result); } } - } $this->terminateWithSuccess($list); } diff --git a/application/controllers/api/frontend/v1/stv/Vertrag.php b/application/controllers/api/frontend/v1/stv/Vertrag.php index f94fe795e..c2b0f713c 100644 --- a/application/controllers/api/frontend/v1/stv/Vertrag.php +++ b/application/controllers/api/frontend/v1/stv/Vertrag.php @@ -76,9 +76,7 @@ class Vertrag extends FHCAPI_Controller if (isError($allOe)) $this->terminateWithError(getError($allOe), self::ERROR_TYPE_GENERAL); - $allOe = hasData($allOe) ? getData($allOe) : []; - - $this->addMeta('oe', $allOe); + $allOe = hasData($allOe) ? array_column(getData($allOe), 'oe_kurzbz') : []; // * then check if the user has permissions to cancel the corresponding lv-organisational units if (!$this->permissionlib->isBerechtigtMultipleOe('admin', $allOe, 'suid') && diff --git a/application/controllers/api/v1/person/Person.php b/application/controllers/api/v1/person/Person.php index 6a373137f..935fbae62 100644 --- a/application/controllers/api/v1/person/Person.php +++ b/application/controllers/api/v1/person/Person.php @@ -233,10 +233,10 @@ class Person extends API_Controller //Quersumme bilden for ($i = 0; $i < 10; $i++) { - $erg += $gewichtung[$i] * $tmpSvnr{$i}; + $erg += $gewichtung[$i] * $tmpSvnr[$i]; } - if ($tmpSvnr{3} != ($erg % 11)) //Vergleichen der Pruefziffer mit Quersumme Modulo 11 + if ($tmpSvnr[3] != ($erg % 11)) //Vergleichen der Pruefziffer mit Quersumme Modulo 11 { return error('SVNR ist ungueltig'); } @@ -244,7 +244,7 @@ class Person extends API_Controller if (mb_strlen($person['svnr']) == 12) { $last = substr($person['svnr'], 10, 12); - if ($last{0} != 'v' || !is_numeric($last{1})) + if ($last[0] != 'v' || !is_numeric($last[1])) { return error('SVNR ist ungueltig'); } diff --git a/application/controllers/dashboard/Widget.php b/application/controllers/dashboard/Widget.php index 0da6fe8da..9966ddc12 100644 --- a/application/controllers/dashboard/Widget.php +++ b/application/controllers/dashboard/Widget.php @@ -33,19 +33,26 @@ class Widget extends Auth_Controller return $this->outputJsonSuccess([ "widget_id" => 0, "widget_kurzbz" => "notfound", - "arguments" => json_encode([ + "arguments" => [ "className" => 'alert-danger', "title" => 'Widget Not Found', "msg" => 'The widget with the id ' . $widget_id . ' could not be found' - ]), - "setup" => json_encode([ + ], + "setup" => [ "name" => 'Widget Not Found', - "file" => 'DashboardWidget/Default.js', + "file" => absoluteJsImportUrl('public/js/components/DashboardWidget/Default.js'), "width" => 1, "height" => 1 - ]) + ] ]); - return $this->outputJsonSuccess(current(getData($widget))); + + $widget = current(getData($widget)); + $widget->arguments = json_decode($widget->arguments); + $tmpsetup = json_decode($widget->setup); + $tmpsetup->file = absoluteJsImportUrl($tmpsetup->file); + $widget->setup = $tmpsetup; + + return $this->outputJsonSuccess($widget); } public function getAll() @@ -56,7 +63,16 @@ class Widget extends Auth_Controller if (isError($result)) return $this->outputJsonError(getError($result)); - $this->outputJsonSuccess(getData($result) ?: []); + $tmpwidgets = getData($result) ?: []; + $widgets = array_map(function($widget) { + $widget->arguments = json_decode($widget->arguments); + $tmpsetup = json_decode($widget->setup); + $tmpsetup->file = absoluteJsImportUrl($tmpsetup->file); + $widget->setup = $tmpsetup; + return $widget; + }, $tmpwidgets); + + $this->outputJsonSuccess($widgets); } public function getWidgetsForDashboard() @@ -71,7 +87,16 @@ class Widget extends Auth_Controller ]); } - $this->outputJsonSuccess(getData($result) ?: []); + $tmpwidgets = getData($result) ?: []; + $widgets = array_map(function($widget) { + $widget->arguments = json_decode($widget->arguments); + $tmpsetup = json_decode($widget->setup); + $tmpsetup->file = absoluteJsImportUrl($tmpsetup->file); + $widget->setup = $tmpsetup; + return $widget; + }, $tmpwidgets); + + $this->outputJsonSuccess($widgets); } public function setAllowed() diff --git a/application/controllers/jobs/AbgabetoolJob.php b/application/controllers/jobs/AbgabetoolJob.php new file mode 100644 index 000000000..51b2b4920 --- /dev/null +++ b/application/controllers/jobs/AbgabetoolJob.php @@ -0,0 +1,621 @@ +_ci =& get_instance(); + + $this->_ci->load->helper('hlp_sancho_helper'); + + $this->_ci->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + $this->_ci->load->model('education/Projektbetreuer_model', 'ProjektbetreuerModel'); + $this->_ci->load->model('education/Paabgabe_model', 'PaabgabeModel'); + $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->config('abgabe'); + $this->loadPhrases([ + 'abgabetool' + ]); + } + + public function notifyAssistenzAboutChangedAbgaben() { + + $this->_ci->logInfo('Start job FHC-Core->notifyAssistenzAboutChangedAbgaben'); + + $interval = $this->_ci->config->item('PAABGABE_EMAIL_JOB_INTERVAL'); + $relevantTypes = $this->_ci->config->item('RELEVANT_PAABGABETYPEN_SAMMELMAIL_ASSISTENZ'); + // 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 Assistenzen über neue oder veränderte Termine versandt"); + return; + } + + // group changed/new abgaben for projektarbeiten + $projektarbeiten = []; + foreach($retval as $newOrChangedAbgabe) { + // Check if the current item has a 'projektarbeit_id' field. + // Replace 'projektarbeit_id' with the actual key name if it's different. + if (isset($newOrChangedAbgabe->projektarbeit_id)) { + $projektarbeitId = $newOrChangedAbgabe->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] = []; + } + + // Add the current row to the array associated with its 'projektarbeit_id'. + $projektarbeiten[$projektarbeitId][] = $newOrChangedAbgabe; + } + } + + // 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 = '
'; + + foreach($tupelArr as $tupel) { + $projektarbeit_id = $tupel[0]; + $assistenzRow = $tupel[1]; + + $betreuerArray = $projektarbeitBetreuerMap[$projektarbeit_id] ?? []; + $changedAbgaben = $projektarbeiten[$projektarbeit_id]; + + $relevantAbgaben = array_values(array_filter($changedAbgaben, function($abgabetermin) use ($assistenzRow) { + if($abgabetermin->updatevon == null && $abgabetermin->insertvon != $assistenzRow->uid) { + return $abgabetermin; + } else if($abgabetermin->updatevon != null && $abgabetermin->updatevon != $assistenzRow->uid) { + return $abgabetermin; + } + })); + + if(count($relevantAbgaben) == 0) { + continue; + } + + // Format the Student Name + $s = $relevantAbgaben[0]; + $nameParts = []; + if (!empty($s->titelpre)) $nameParts[] = $s->titelpre; + $nameParts[] = $s->vorname; + $nameParts[] = $s->nachname; + if (!empty($s->titelpost)) $nameParts[] = $s->titelpost; + $studentFullName = implode(' ', $nameParts); + + // Format the Supervisors string + $betreuerStrings = []; + foreach($betreuerArray as $b) { + $bNameParts = []; + if (!empty($b->titelpre)) $bNameParts[] = $b->titelpre; + $bNameParts[] = $b->vorname; + $bNameParts[] = $b->nachname; + if (!empty($b->titelpost)) $bNameParts[] = $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 .= ' + + + + + + + + '; + + foreach ($relevantAbgaben as $abgabe) { + $dateEmailFormatted = (new DateTime($abgabe->datum))->format('d.m.Y'); + $abgabedatumFormatted = (new DateTime($abgabe->abgabedatum))->format('d.m.Y'); + $kurzbzLine = !empty($abgabe->kurzbz) ? "
{$abgabe->kurzbz}" : ""; + + $abgabenString .= " + + + + "; + } + + $abgabenString .= '
ZieldatumBezeichnung
{$dateEmailFormatted} + {$abgabe->bezeichnung}{$kurzbzLine} +
'; + } + + $abgabenString .= '
'; + + // done with building the change list, now send it + $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; + + // send email with bundled info + sendSanchoMail( + 'PAAChangesAssSM', + $body_fields, + $email, + $this->p->t('abgabetool', 'changedAbgabeterminev2') + ); + + $count++; + } + + $this->_ci->logInfo($count . " Emails erfolgreich versandt"); + $this->_ci->logInfo('End job FHC-Core->notifyAssistenzAboutChangedAbgaben'); + } + + public function notifyBetreuerAboutChangedAbgaben() { + + $this->_ci->logInfo('Start job FHC-Core->notifyBetreuerAboutChangedAbgaben'); + + $interval = $this->_ci->config->item('PAABGABE_EMAIL_JOB_INTERVAL'); + + $relevantTypes = $this->_ci->config->item('RELEVANT_PAABGABETYPEN_SAMMELMAIL_BETREUER'); + + // 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 = []; + foreach($retval as $newOrChangedAbgabe) { + // Check if the current item has a 'projektarbeit_id' field. + // Replace 'projektarbeit_id' with the actual key name if it's different. + if (isset($newOrChangedAbgabe->projektarbeit_id)) { + $projektarbeitId = $newOrChangedAbgabe->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] = []; + } + + // Add the current row to the array associated with its 'projektarbeit_id'. + $projektarbeiten[$projektarbeitId][] = $newOrChangedAbgabe; + } + } + + // 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) { + $betreuerResult = $this->_ci->ProjektbetreuerModel->getAllBetreuerOfProjektarbeit($projektarbeit_id); + + forEach($betreuerResult->retval as $betreuerRow) { + if (!isset($betreuerMap[$betreuerRow->person_id])) { + $betreuerMap[$betreuerRow->person_id] = []; + } + + // Add the current betreuerRow to the betreuerMap as an array associated with its projektarbeit_id. + $betreuerMap[$betreuerRow->person_id][] = [$projektarbeit_id, $betreuerRow]; + } + } + + $count = 0; + // now iterate over the betreuerMap and build 1 email about all projektarbeiten and their new/changed termine + // $tupel = [$projektarbeit_id, $betreuerRow], each betreuer has 0..n [projektarbeit_id, changedAbgaben] tupel + forEach($betreuerMap as $betreuer_person_id => $tupelArr) { + + // start the container + $abgabenString = '
'; + + $result = $this->_ci->ProjektarbeitModel->getProjektbetreuerAnrede($betreuer_person_id); + $data = getData($result)[0]; + + $anrede = $data->anrede; + $anredeFillString = $data->anrede == "Herr" ? "r" : ""; + $fullFormattedNameString = $data->first; + + forEach($tupelArr as $tupel) { + $projektarbeit_id = $tupel[0]; + $betreuerRow = $tupel[1]; + + $changedAbgaben = $projektarbeiten[$projektarbeit_id]; + + $relevantAbgaben = array_values(array_filter($changedAbgaben, function($abgabetermin) use ($betreuerRow) { + if($abgabetermin->updatevon == null && $abgabetermin->insertvon != $betreuerRow->uid) { + return $abgabetermin; + } else if($abgabetermin->updatevon != null && $abgabetermin->updatevon != $betreuerRow->uid) { + return $abgabetermin; + } + })); + + if(count($relevantAbgaben) == 0) { + continue; + } + + // format the Student Name + $s = $relevantAbgaben[0]; + $nameParts = []; + if (!empty($s->titelpre)) $nameParts[] = $s->titelpre; + $nameParts[] = $s->vorname; + $nameParts[] = $s->nachname; + if (!empty($s->titelpost)) $nameParts[] = $s->titelpost; + $studentFullName = implode(' ', $nameParts); + + $projektarbeit_titel = $s->titel ?? 'Kein Titel vergeben'; + + // project header section + $abgabenString .= " +
+ Projekt: {$projektarbeit_titel}
+
+ Studierende/r: {$studentFullName} +
+ + ID: {$projektarbeit_id} | Rolle: {$betreuerRow->betreuerart_kurzbz} | + Stg: {$s->stgtyp}{$s->stgkz} ({$s->studiensemester_kurzbz}) + +
"; + + // start table + $abgabenString .= ' + + + + + + + + '; + + foreach ($relevantAbgaben as $abgabe) { + $dateEmailFormatted = (new DateTime($abgabe->datum))->format('d.m.Y'); + $abgabedatumFormatted = (new DateTime($abgabe->abgabedatum))->format('d.m.Y'); + $kurzbzLine = !empty($abgabe->kurzbz) ? "
{$abgabe->kurzbz}" : ""; + + $abgabenString .= " + + + + "; + } + + $abgabenString .= '
ZieldatumBezeichnung
{$dateEmailFormatted} + {$abgabe->bezeichnung}{$kurzbzLine} +
'; + } + + // close container + $abgabenString .= '
'; + + // done with building the change list, now send it + $betreuerRow = $tupelArr[0][1]; + + $path = $this->_ci->config->item('URL_MITARBEITER'); + $url = CIS_ROOT.$path; + + $body_fields = array( + 'anrede' => $anrede, + 'anredeFillString' => $anredeFillString, + 'fullFormattedNameString' => $fullFormattedNameString, + 'abgabenString' => $abgabenString, + 'linkAbgabetool' => $url + ); + + $email = $betreuerRow->uid ? $betreuerRow->uid."@".DOMAIN : $betreuerRow->private_email; + + // send email with bundled info + sendSanchoMail( + 'PAAChangesBetSM', + $body_fields, + $email, + $this->p->t('abgabetool', 'changedAbgabeterminev2') + ); + + $count++; + } + + $this->_ci->logInfo($count . " Emails erfolgreich versandt"); + $this->_ci->logInfo('End job FHC-Core->notifyBetreuerAboutChangedAbgaben'); + } + + public function notifyBetreuerMail() { + // send all new projektarbeit abgabe UPLOADS since the last job run to the related betreuer + // this job gathers all new or changed file uploads via field 'abgabedatum', enduploads still + // send an email directly after happening since they are kind of important + + $this->_ci->logInfo('Start job FHC-Core->notifyBetreuerMail'); + + // dont filter for relevant types since this mail should gather all UPLOAD info + + $interval = $this->_ci->config->item('PAABGABE_EMAIL_JOB_INTERVAL'); + + $result = $this->_ci->PaabgabeModel->findAbgabenNewOrUpdatedSinceByAbgabedatum($interval); + $retval = getData($result); + + // retval are paabgaben joined with projektarbeit and betreuer + if(count($retval) == 0) { + $this->logInfo("Keine Emails über neue Paabgaben an Betreuer versandt"); + return; + } + + // group contents per betreuer person_id + $betreuer_uids = []; + forEach($retval as $paabgabe) { + if(!isset($betreuer_uids[$paabgabe->person_id])) { + $betreuer_uids[$paabgabe->person_id] = []; + } + + $betreuer_uids[$paabgabe->person_id][] = $paabgabe; + } + + $count = 0; + forEach ($betreuer_uids as $person_id => $abgaben) { + // $person_id is from betreuer + + $result = $this->_ci->ProjektarbeitModel->getProjektbetreuerAnrede($person_id); + $data = getData($result)[0]; + + $anrede = $data->anrede; + $anredeFillString = $data->anrede == "Herr" ? "r" : ""; + $fullFormattedNameString = $data->first; + + // sorting $abgaben array by datum + usort($abgaben, function ($a, $b) { + return strtotime($a->datum) <=> strtotime($b->datum); + }); + + $projektarbeit_titel = $abgaben[0]->titel; + + // initialize the table and headers + $abgabenString = ' + + + + + + + + + + '; + + foreach ($abgaben as $abgabe) { + // format the student name + $nameParts = []; + if (!empty($abgabe->titelpre)) $nameParts[] = $abgabe->titelpre; + $nameParts[] = $abgabe->vorname; + $nameParts[] = $abgabe->nachname; + if (!empty($abgabe->titelpost)) $nameParts[] = $abgabe->titelpost; + $studentFullName = implode(' ', $nameParts); + + // format dates inline + $dateEmailFormatted = (new DateTime($abgabe->datum))->format('d.m.Y'); + $abgabedatumFormatted = (new DateTime($abgabe->abgabedatum))->format('d.m.Y'); + + // handle the optional Kurzbezeichnung + $kurzbzLine = !empty($abgabe->kurzbz) ? "
{$abgabe->kurzbz}" : ""; + + $abgabenString .= " + + + + + + "; + } + + $abgabenString .= '
ZieldatumStudierende/rBezeichnungAbgabedatum
{$dateEmailFormatted}{$studentFullName} + {$abgabe->bezeichnung}{$kurzbzLine} + {$abgabedatumFormatted}
'; + + $path = $this->_ci->config->item('URL_MITARBEITER'); + $url = CIS_ROOT.$path; + + $body_fields = array( + 'anrede' => $anrede, + 'anredeFillString' => $anredeFillString, + 'fullFormattedNameString' => $fullFormattedNameString, + 'paTitel' => $projektarbeit_titel, + 'abgabenString' => $abgabenString, + 'linkAbgabetool' => $url + ); + + $result = $this->_ci->ProjektbetreuerModel->getBetreuerOfProjektarbeit($abgaben[0]->projektarbeit_id, $abgaben[0]->betreuerart_kurzbz); + $data = getData($result)[0]; + + $email = $data->uid ? $data->uid."@".DOMAIN : $data->private_email; + + // send email with bundled info + sendSanchoMail( + 'PaabgabeUpdatesBetSM', + $body_fields, + $email, + $this->p->t('abgabetool', 'changedAbgabeterminev2') + ); + + $count++; + } + + $this->_ci->logInfo($count . " Emails erfolgreich versandt"); + $this->_ci->logInfo('End job FHC-Core->notifyBetreuerMail'); + } + + public function notifyStudentMail() + { + // send all new projektarbeit abgabe since the last job run to the related student + + $this->_ci->logInfo('Start job FHC-Core->notifyStudentMail'); + + $interval = $this->_ci->config->item('PAABGABE_EMAIL_JOB_INTERVAL'); + + $relevantTypes = $this->_ci->config->item('RELEVANT_PAABGABETYPEN_SAMMELMAIL_STUDENT'); + + $result = $this->_ci->PaabgabeModel->findAbgabenNewOrUpdatedSince($interval, $relevantTypes); + $retval = getData($result); + + if(count($retval) == 0) { + $this->_ci->logInfo("Keine Emails an Studenten versandt"); + return; + } + + // group results per projektarbeit/student_uid + $student_uids = []; + forEach($retval as $paabgabe) { + if(!isset($student_uids[$paabgabe->student_uid])) { + $student_uids[$paabgabe->student_uid] = []; + } + + $student_uids[$paabgabe->student_uid][] = $paabgabe; + } + + $count = 0; + foreach ($student_uids as $uid => $abgaben) { + // $uid is the student's UID + $result = $this->_ci->StudentModel->getEmailAnredeForStudentUID($uid); + $data = getData($result)[0]; + + // $abgabe is the array of paabgabe objects + $anredeFillString = $data->anrede=="Herr"?"r":""; + $fullFormattedNameString = trim($data->titelpre." ".$data->vorname." ".$data->vornamen." ".$data->nachname." ".$data->titelpost); + + // https://www.php.net/manual/en/migration70.new-features.php#migration70.new-features.spaceship-op + // php has spaceships 🚀🚀🚀🚀🚀 + usort($abgaben, function($a, $b) { + return strtotime($a->datum) <=> strtotime($b->datum); + }); + + $projektarbeit_titel = $abgaben[0]->titel; + + // initialize the table and headers + $abgabenString = ' + + + + + + + + '; + + foreach ($abgaben as $abgabe) { + $dateEmailFormatted = (new DateTime($abgabe->datum))->format('d.m.Y'); + + // handle the optional Kurzbezeichnung + $kurzbzLine = !empty($abgabe->kurzbz) ? "
{$abgabe->kurzbz}" : ""; + + $abgabenString .= " + + + + "; + } + + $abgabenString .= '
ZieldatumBezeichnung / Hinweis
+ {$dateEmailFormatted} + + {$abgabe->bezeichnung}{$kurzbzLine} +
'; + + $route = $this->_ci->config->item('URL_STUDENTS'); + $url = CIS_ROOT.$route; + + $body_fields = array( + 'anrede' => $data->anrede, + 'anredeFillString' => $anredeFillString, + 'fullFormattedNameString' => $fullFormattedNameString, + 'paTitel' => $projektarbeit_titel, + 'abgabenString' => $abgabenString, + 'linkAbgabetool' => $url + ); + + // send email with bundled info + sendSanchoMail( + 'PaabgabeUpdatesSammelmail', + $body_fields, + $uid.'@'.DOMAIN, + $this->p->t('abgabetool', 'changedAbgabeterminev2') + ); + + $count++; + + } + + $this->_ci->logInfo($count . " Emails erfolgreich versandt"); + $this->_ci->logInfo('End job FHC-Core->notifyStudentMail'); + } +} \ No newline at end of file diff --git a/application/controllers/jobs/AntragJob.php b/application/controllers/jobs/AntragJob.php index debcfe391..8dc4870ea 100644 --- a/application/controllers/jobs/AntragJob.php +++ b/application/controllers/jobs/AntragJob.php @@ -200,13 +200,14 @@ class AntragJob extends JOB_Controller } /** - * Send reminder to Assistant for Wiedereinstieg Unterbrecher + * Send reminder to Assistant and to Student for Wiedereinstieg Unterbrecher * */ public function sendReminderWiedereinstieg() { $now = new DateTime(); $modifier = $this->config->item('unterbrechung_job_remind_wiedereinstieg_date_modifier'); + if (!$modifier) return $this->logError('Konnte Job nicht starten: Config "unterbrechung_job_remind_wiedereinstieg_date_modifiers" nicht gesetzt'); @@ -230,6 +231,7 @@ class AntragJob extends JOB_Controller $antraege = getData($result) ?: []; $count = 0; + $countReminderStudent = 0; foreach ($antraege as $antrag) { $res = $this->StudierendenantragModel->getStgAndSem($antrag->studierendenantrag_id); @@ -257,10 +259,92 @@ class AntragJob extends JOB_Controller $data['UID'] = $student->student_uid; } - // NOTE(chris): Sancho mail - if(sendSanchoMail('Sancho_Mail_Antrag_U_Reminder', $data, $antrag->email, 'Reminder: Unterbrechung Wiedereinstieg')) + //Data für Email Student + $result = $this->PrestudentModel->load($antrag->prestudent_id); + $dataPrestudent = current(getData($result)); + $person_id = $dataPrestudent->person_id; + + $this->KontaktModel->addSelect('kontakt'); + + $result = $this->KontaktModel->loadWhere([ + 'person_id'=> $person_id, + 'zustellung' => true, + 'kontakttyp' => 'email' + ]); + + $email_student_privat = null; + $dataKontakt = getData($result); + if ($dataKontakt) { + $stud_private_zustell_emails = array_map(function($kontakt) { + return $kontakt->kontakt; + }, $dataKontakt); + $email_student_privat = implode(', ', $stud_private_zustell_emails); + } + + $email_student_FH = $this->StudentModel->getEmailFH($this->StudentModel->getUID($antrag->prestudent_id)); + + //studiensemester + $result = $this->StudiensemesterModel->getByDate($datum->format('Y-m-d')); + if (hasData($result)) { + $dataSem = current(getData($result)); + } + + $studiensemester = $dataSem->studiensemester_kurzbz; + $studsemShort = substr($studiensemester, 0, 2); + + if($studsemShort == "SS") + { + $data['studSemShort_Eng'] = "summer semester"; + $data['meldenBis'] = "15.1."; + $data['meldenBis_Eng'] = "January 15"; + } + elseif ($studsemShort == "WS") { + $data['studSemShort_Eng'] = "winter semester"; + $data['meldenBis'] = "1.8."; + $data['meldenBis_Eng'] = "August 1"; + } + else + { + $studsemShort = "SS/WS"; + $data['studSemShort_Eng'] = "summer/winter semester"; + $data['meldenBis'] = "15.1. (bei Einstieg ins SS) / 1.8. (bei Einstieg ins WS)"; + $data['meldenBis_Eng'] = "January 15 (for sommer semester enrollment) / August 1 (for winter semester enrollment)"; + } + + $data['studSemShort'] = $studsemShort; + + // NOTE(chris): Sancho mail Assistant + $sancho_assistant_sent = sendSanchoMail('Sancho_Mail_Antrag_U_Reminder', $data, $antrag->email, 'Reminder: Unterbrechung Wiedereinstieg'); + if($sancho_assistant_sent) { $count++; + } + else + { + $this->logError('Error: failed to send Assistant Reminder studierendenantrag_id: ' . $antrag->studierendenantrag_id); + } + //Mail to Student + $sancho_student_sent = sendSanchoMail( + 'Sancho_Mail_Antrag_U_Remind_Stud', + $data, + $email_student_FH, + 'Reminder: Unterbrechung Wiedereinstieg', + '', + '', + '', + $email_student_privat); + + if($sancho_student_sent) + { + $countReminderStudent++; + } + else + { + $this->logError('Error: failed to send Student Reminder studierendenantrag_id: ' . $antrag->studierendenantrag_id); + } + + if($sancho_assistant_sent && $sancho_student_sent) + { $this->StudierendenantragstatusModel->insert([ 'studierendenantrag_id' => $antrag->studierendenantrag_id, 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_REMINDERSENT, @@ -268,7 +352,7 @@ class AntragJob extends JOB_Controller ]); } } - $this->logInfo($count . ' Reminder gesendet - Ende Job sendReminderWiedereinstieg'); + $this->logInfo($count . ' Reminder an Assistenz und ' . $countReminderStudent . ' Reminder an Student gesendet - Ende Job sendReminderWiedereinstieg'); } /** diff --git a/application/controllers/system/infocenter/InfoCenter.php b/application/controllers/system/infocenter/InfoCenter.php index 1a4f566e6..eaa207ff1 100644 --- a/application/controllers/system/infocenter/InfoCenter.php +++ b/application/controllers/system/infocenter/InfoCenter.php @@ -22,6 +22,7 @@ class InfoCenter extends Auth_Controller const REIHUNGSTESTABSOLVIERT_PAGE = 'reihungstestAbsolviert'; const ABGEWIESEN_PAGE = 'abgewiesen'; const AUFGENOMMEN_PAGE = 'aufgenommen'; + const ONBOARDING_PAGE = 'onboarding'; const SHOW_DETAILS_PAGE = 'showDetails'; const SHOW_ZGV_DETAILS_PAGE = 'showZGVDetails'; const ZGV_UBERPRUEFUNG_PAGE = 'ZGVUeberpruefung'; @@ -116,6 +117,7 @@ class InfoCenter extends Auth_Controller 'index' => 'infocenter:r', 'freigegeben' => 'infocenter:r', 'abgewiesen' => 'infocenter:r', + 'onboarding' => 'infocenter:r', 'aufgenommen' => 'infocenter:r', 'reihungstestAbsolviert' => 'infocenter:r', 'showDetails' => 'infocenter:r', @@ -230,6 +232,13 @@ class InfoCenter extends Auth_Controller $this->load->view('system/infocenter/infocenterAbgewiesen.php'); } + + public function onboarding() + { + $this->_setNavigationMenu(self::ONBOARDING_PAGE); // define the navigation menu for this page + + $this->load->view('system/infocenter/onboarding.php'); + } /** * Aufgenommene page of the InfoCenter tool @@ -1553,6 +1562,7 @@ class InfoCenter extends Auth_Controller $reihungstestAbsolviertLink = site_url(self::INFOCENTER_URI.'/'.self::REIHUNGSTESTABSOLVIERT_PAGE); $abgewiesenLink = site_url(self::INFOCENTER_URI.'/'.self::ABGEWIESEN_PAGE); $aufgenommenLink = site_url(self::INFOCENTER_URI.'/'.self::AUFGENOMMEN_PAGE); + $onboardingLink = site_url(self::INFOCENTER_URI.'/'.self::ONBOARDING_PAGE); $currentFilterId = $this->input->get(self::FILTER_ID); if (isset($currentFilterId)) @@ -1561,6 +1571,7 @@ class InfoCenter extends Auth_Controller $reihungstestAbsolviertLink .= '?'.self::PREV_FILTER_ID.'='.$currentFilterId; $abgewiesenLink .= '?'.self::PREV_FILTER_ID.'='.$currentFilterId; $aufgenommenLink .= '?'.self::PREV_FILTER_ID.'='.$currentFilterId; + $onboardingLink .= '?'.self::PREV_FILTER_ID.'='.$currentFilterId; } $this->navigationlib->setSessionMenu( @@ -1624,6 +1635,18 @@ class InfoCenter extends Auth_Controller '', // target 40 // sort ), + 'ohnePrestudent' => $this->navigationlib->oneLevel( + 'Electronic Onboarding', // description + $onboardingLink, // link + null, // children + 'users', // icon + null, // subscriptDescription + false, // expand + null, // subscriptLinkClass + null, // subscriptLinkValue + '', // target + 50 // sort + ), ) ); } @@ -1650,6 +1673,8 @@ class InfoCenter extends Auth_Controller $link = site_url(self::ZGV_UEBERPRUEFUNG_URI); if ($origin_page === self::ABGEWIESEN_PAGE) $link = site_url(self::INFOCENTER_URI.'/'.self::ABGEWIESEN_PAGE); + if ($origin_page === self::ONBOARDING_PAGE) + $link = site_url(self::INFOCENTER_URI.'/'.self::ONBOARDING_PAGE); if ($origin_page === self::AUFGENOMMEN_PAGE) $link = site_url(self::INFOCENTER_URI.'/'.self::AUFGENOMMEN_PAGE); @@ -1691,6 +1716,7 @@ class InfoCenter extends Auth_Controller $freigegebenLink = site_url(self::INFOCENTER_URI.'/'.self::FREIGEGEBEN_PAGE); $absolviertLink = site_url(self::INFOCENTER_URI.'/'.self::REIHUNGSTESTABSOLVIERT_PAGE); $abgewiesenLink = site_url(self::INFOCENTER_URI.'/'.self::ABGEWIESEN_PAGE); + $onboardingLink = site_url(self::INFOCENTER_URI.'/'.self::ONBOARDING_PAGE); $prevFilterId = $this->input->get(self::PREV_FILTER_ID); if (isset($prevFilterId)) { @@ -1767,6 +1793,24 @@ class InfoCenter extends Auth_Controller ) ); } + if($page == self::ONBOARDING_PAGE) + { + $this->navigationlib->setSessionElementMenu( + 'onboarding', + $this->navigationlib->oneLevel( + 'Electronic Onboarding', // description + $onboardingLink, // link + null, // children + 'users', // icon + null, // subscriptDescription + false, // expand + null, // subscriptLinkClass + null, // subscriptLinkValue + '', // target + 50 // sort + ) + ); + } } /** diff --git a/application/core/FHCAPI_Controller.php b/application/core/FHCAPI_Controller.php index dad56334d..e81506d4b 100644 --- a/application/core/FHCAPI_Controller.php +++ b/application/core/FHCAPI_Controller.php @@ -266,7 +266,7 @@ class FHCAPI_Controller extends Auth_Controller } // --------------------------------------------------------------- - // Security + // Security Begin // --------------------------------------------------------------- /** @@ -287,4 +287,31 @@ class FHCAPI_Controller extends Auth_Controller 'required_permissions' => $this->_rpsToString($requiredPermissions, $this->router->method) ], self::ERROR_TYPE_AUTH); } + + // --------------------------------------------------------------- + // Security End + // --------------------------------------------------------------- + + /** + * Checks the client's total request size (Content-Length) against the minimum + * effective PHP limit (min of upload_max_filesize, post_max_size, memory_limit). + * This preempts failures that result in vague "missing parameters" errors on large files. + * + * @return void + */ + protected function checkUploadSize() { + // this number represents bytes + $content_length_bytes = (int)$this->input->server('CONTENT_LENGTH'); + $content_length = $content_length_bytes / 1000000; + + //get max serverside size upload -> this comes in megabytes + $max_upload = (int)(ini_get('upload_max_filesize')); + $max_post = (int)(ini_get('post_max_size')); + $memory_limit = (int)(ini_get('memory_limit')); + $max_upload_mb = min($max_upload, $max_post, $memory_limit); // smallest of 3 config values + + if($content_length >= $max_upload_mb) { + $this->terminateWithError($this->p->t('global', 'filesizeExceeded'), 'general'); + } + } } diff --git a/application/helpers/hlp_header_helper.php b/application/helpers/hlp_header_helper.php index f642f405c..eb3ac712e 100644 --- a/application/helpers/hlp_header_helper.php +++ b/application/helpers/hlp_header_helper.php @@ -188,10 +188,20 @@ function generateJSModulesInclude($JSModules) for ($tmpJSsCounter = 0; $tmpJSsCounter < count($tmpJSs); $tmpJSsCounter++) { - $toPrint = sprintf($jsInclude, base_url($tmpJSs[$tmpJSsCounter].$cachetoken)).PHP_EOL; + $item = $tmpJSs[$tmpJSsCounter]; if($use_bundled_javascript) { - $toPrint = str_replace('/public/', '/public/dist/', $toPrint); + $item = preg_replace('#^public/#', 'public/dist/', $item); + } + echo "".PHP_EOL; + if($ci->config->item('use_fhcomplete_build_version_in_path')) + { + $relurl = preg_replace('#public/#', 'public/' . $ci->config->item('fhcomplete_build_version') . '/', $item); + $toPrint = sprintf($jsInclude, base_url($relurl)).PHP_EOL; + } + else + { + $toPrint = sprintf($jsInclude, base_url($item.$cachetoken)).PHP_EOL; } if ($tmpJSsCounter > 0) $toPrint = "\t\t".$toPrint; @@ -257,6 +267,14 @@ function generateSkipLink($skipID) function absoluteJsImportUrl($relurl) { $ci =& get_instance(); - $url = base_url($relurl) . '?'. $ci->config->item('fhcomplete_build_version'); + $ci->load->config('javascript'); + if($ci->config->item('use_fhcomplete_build_version_in_path')) + { + $url = base_url(preg_replace('#^public/#', 'public/' . $ci->config->item('fhcomplete_build_version') . '/', $relurl)); + } + else + { + $url = base_url($relurl) . '?'. $ci->config->item('fhcomplete_build_version'); + } return $url; -} \ No newline at end of file +} diff --git a/application/libraries/PrestudentLib.php b/application/libraries/PrestudentLib.php index 2d795369f..b1f2dc900 100644 --- a/application/libraries/PrestudentLib.php +++ b/application/libraries/PrestudentLib.php @@ -35,6 +35,90 @@ class PrestudentLib $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel'); } + /** + * Sets initial prestudent entry, no status yet. + * @return object success or error + */ + public function setPrestudent( + $person_id, + $studiengang_kz, + $ausbildungscode, + $anmerkung, + $foerderrelevant + ) + { + // Prestudent anlegen + $data = [ + 'aufmerksamdurch_kurzbz' => 'k.A.', + 'person_id' => $person_id, + 'studiengang_kz' => $studiengang_kz, + 'ausbildungcode' => $ausbildungscode, + 'anmerkung' => $anmerkung, + 'reihungstestangetreten' => false, + 'bismelden' => true, + 'foerderrelevant' => $foerderrelevant, + 'insertamum' => date('c'), + 'insertvon' => getAuthUID() + ]; + + // Wenn die Person schon im System erfasst ist, dann die ZGV des Datensatzes uebernehmen + $this->_ci->PrestudentModel->addSelect('public.tbl_prestudent.*, public.tbl_person.vorname, public.tbl_person.nachname'); + $this->_ci->PrestudentModel->addJoin('public.tbl_person', 'person_id'); + $this->_ci->PrestudentModel->addOrder('zgvmas_code'); + $this->_ci->PrestudentModel->addOrder('zgv_code', 'DESC'); + $this->_ci->PrestudentModel->addLimit(1); + $result = $this->_ci->PrestudentModel->loadWhere([ + 'person_id' => $person_id, + 'zgv_code IS NOT NULL' => null + ]); + + if (isError($result)) return $result; + + if (hasData($result)) { + $prestudent = getData($result)[0]; + if ($prestudent->zgv_code) { + $data['zgv_code'] = $prestudent->zgv_code; + $data['zgvort'] = $prestudent->zgvort; + $data['zgvdatum'] = $prestudent->zgvdatum; + + $data['zgvmas_code'] = $prestudent->zgvmas_code; + $data['zgvmaort'] = $prestudent->zgvmaort; + $data['zgvmadatum'] = $prestudent->zgvmadatum; + } + } + // Prestudent speichern + return $this->_ci->PrestudentModel->insert($data); + } + + /** + * Sets first status of a prestudent.! + * @return object success or error + */ + public function setFirstStatus( + $prestudent_id, + $status_kurzbz, + $studiensemester_kurzbz, + $ausbildungssemester = null, + $orgform_kurzbz = null, + $studienplan_id = null + ) + { + // Prestudent Rolle Anlegen + $data = [ + 'prestudent_id' => $prestudent_id, + 'status_kurzbz' => $status_kurzbz, + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'ausbildungssemester' => $ausbildungssemester ?: 0, + 'orgform_kurzbz' => $orgform_kurzbz ?: null, + 'studienplan_id' => $studienplan_id ?: null, + 'datum' => date('Y-m-d'), + 'insertamum' => date('c'), + 'insertvon' => getAuthUID() + ]; + + return $this->_ci->PrestudentstatusModel->insert($data); + } + public function setAbbrecher( $prestudent_id, $studiensemester_kurzbz, @@ -603,9 +687,6 @@ class PrestudentLib $now = date('c'); $today = date('Y-m-d'); - $jahr = mb_substr($studiensemester_kurzbz, 4, 2); - - // Genererate Personenkennzeichen $personenkennzeichen = $this->_ci->StudentModel->generateMatrikelnummer2( $student_data->studiengang_kz, @@ -615,8 +696,9 @@ class PrestudentLib if (isError($personenkennzeichen)) return $personenkennzeichen; $personenkennzeichen = getData($personenkennzeichen); - - + + $jahr = mb_substr($personenkennzeichen, 0, 2); + // Generate UID $uid = $this->_ci->StudentModel->generateUID( $student_data->kurzbz, @@ -641,7 +723,7 @@ class PrestudentLib // Generate Alias - $alias = ''; + $alias = null; if (!defined('GENERATE_ALIAS_STUDENT') || GENERATE_ALIAS_STUDENT === true ) { @@ -889,6 +971,155 @@ class PrestudentLib ); } + /** + * Creates an incoming, saves necessary data for an incoming. + * @param $prestudent_id existing prestudent, for which incoming entry is created + * @param $studiengang_kz Studiengang assigned to incoming + * @param $studiensemester_kurzbz start semester for incoming + * @return object success if incoming successfully saved, or error + */ + public function setFirstIncoming($prestudent_id, $studiengang_kz, $studiensemester_kurzbz, $orgform_kurzbz, $studienplan_id) + { + // Verband and Ausbildungssemester for incoming + $authUID = getAuthUID(); + $incomingVerband = 'I'; + $incomingAusbildungssemester = '0'; + + // get prestudent + $this->_ci->PrestudentModel->addJoin('public.tbl_person p', 'person_id'); + $this->_ci->PrestudentModel->addJoin('public.tbl_studiengang stg', 'studiengang_kz'); + $result = $this->_ci->PrestudentModel->load($prestudent_id); + + if (isError($result)) return $result; + if (!hasData($result)) return error('No prestudent'); + + $student_data = getData($result)[0]; + + $result = $this->setFirstStatus( + $prestudent_id, + $this->_ci->PrestudentstatusModel::STATUS_INCOMING, + $studiensemester_kurzbz, + $incomingAusbildungssemester, + $orgform_kurzbz, + $studienplan_id + ); + if (isError($result)) return $result; + if (!hasData($result)) return error('Error when adding prestudentstatus'); + + // generate Personenkennzeichen + $result = $this->_ci->StudentModel->generateMatrikelnummer2($studiengang_kz, $studiensemester_kurzbz); + if (isError($result)) return $result; + if (!hasData($result)) return error('No personenkennzeichen could be generated'); + + $personenkennzeichen = getData($result); + + $jahr = mb_substr($personenkennzeichen, 0, 2); + $stg = mb_substr($personenkennzeichen, 3, 4); + + $nachname_clean = mb_strtolower(sanitizeProblemChars($student_data->nachname)); + $vorname_clean = mb_strtolower(sanitizeProblemChars($student_data->vorname)); + $nachname_clean = str_replace(' ','_', $nachname_clean); + $vorname_clean = str_replace(' ','_', $vorname_clean); + + // get Studiengang data + $result = $this->_ci->StudiengangModel->load(ltrim($stg, '0')); + if (isError($result)) return $result; + if (!hasData($result)) return error('No Studiengang'); + + $stgObj = getData($result)[0]; + + // gernerate uid + $result = $this->_ci->StudentModel->generateUID($stgObj->kurzbz, $jahr, $stgObj->typ, $personenkennzeichen, $vorname_clean, $nachname_clean); + if (isError($result)) return $result; + if (!hasData($result)) return error("UID could not be generated"); + $uid = getData($result); + + //Benutzerdatensatz anlegen + $benutzer = [ + 'uid' => $uid, + 'person_id' => $student_data->person_id, + 'aktiv' => true, + 'aktivierungscode' => $this->_ci->BenutzerModel->generateActivationkey() + ]; + + // Generate Alias + $alias = ''; + if (!defined('GENERATE_ALIAS_STUDENT') || GENERATE_ALIAS_STUDENT === true) + { + $result = $this->_ci->BenutzerModel->generateAliasFromName($student_data->vorname, $student_data->nachname); + if (isError($result)) + return $result; + $alias = getData($result); + } + + $benutzer['alias'] = $alias; + $benutzer['insertamum'] = date('Y-m-d H:i:s'); + $benutzer['insertvon'] = $authUID; + + $result = $this->_ci->BenutzerModel->insert($benutzer); + + if (isError($result)) return $result; + + // Studentendatensatz anlegen + $student = [ + 'student_uid' => $uid, + 'matrikelnr' => $personenkennzeichen, + 'prestudent_id' => $prestudent_id, + 'studiengang_kz' => $studiengang_kz, + 'semester' => $incomingAusbildungssemester, + 'verband' => $incomingVerband, + 'gruppe' => ' ' + ]; + + $result = $this->_ci->LehrverbandModel->loadWhere([ + 'studiengang_kz' => $student['studiengang_kz'], + 'semester' => $student['semester'], + 'verband' => $student['verband'], + 'gruppe' => $student['gruppe'] + ]); + + if (isError($result)) return $result; + + if (!hasData($result)) + { + // Add Lehrverband if it does not exist + $result = $this->_ci->LehrverbandModel->insert([ + 'studiengang_kz' => $student_data->studiengang_kz, + 'semester' => $student['semester'], + 'verband' => $student['verband'], + 'gruppe' => $student['gruppe'], + 'bezeichnung' => 'Incoming', + 'aktiv' => true + ]); + + if (isError($result)) return $result; + } + + // add student + $student['insertamum'] = date('Y-m-d H:i:s'); + $student['insertvon'] = $authUID; + + $result = $this->_ci->StudentModel->insert($student); + if (isError($result)) return $result; + + // Add Studentlehrverband + $result = $this->_ci->StudentlehrverbandModel->insert([ + 'student_uid' => $uid, + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'studiengang_kz' => $student_data->studiengang_kz, + 'semester' => $incomingAusbildungssemester, + 'verband' => $incomingVerband, + 'gruppe' => ' ', + 'insertamum' => date('Y-m-d H:i:s'), + 'insertvon' => $authUID + ]); + + if (isError($result)) + return $result; + + return success($prestudent_id); + } + protected function setBasic($authUID, $now, $status_kurzbz, $prestudent_id, $studiensemester_kurzbz, $ausbildungssemester, $statusgrund_id = null) { $result = $this->_ci->PrestudentstatusModel->getLastStatus($prestudent_id); diff --git a/application/models/crm/Prestudentstatus_model.php b/application/models/crm/Prestudentstatus_model.php index de91319b9..c0ed8595e 100644 --- a/application/models/crm/Prestudentstatus_model.php +++ b/application/models/crm/Prestudentstatus_model.php @@ -290,7 +290,11 @@ class Prestudentstatus_model extends DB_Model */ public function getLastStatusPerson($person_id, $studiensemester_kurzbz = null) { - $query = 'SELECT * + $query = 'SELECT p.*, ps.*, s.*, + stg.kurzbz AS studiengang_kurzbz, stg.kurzbzlang AS studiengang_kurzbzlang, + UPPER(typ::varchar(1) || kurzbz) AS studiengang_kuerzel, + stg.typ AS studiengang_typ, stg.bezeichnung AS studiengang_bezeichnung, stg.english AS studiengang_bezeichnung_english, + stg.orgform_kurzbz AS studiengang_orgform FROM public.tbl_prestudent p JOIN ( SELECT DISTINCT ON(prestudent_id) * @@ -298,7 +302,8 @@ class Prestudentstatus_model extends DB_Model WHERE prestudent_id IN (SELECT prestudent_id FROM public.tbl_prestudent WHERE person_id = ?) ORDER BY prestudent_id, datum desc, insertamum desc ) ps USING(prestudent_id) - JOIN public.tbl_status USING(status_kurzbz)'; + JOIN public.tbl_status s USING(status_kurzbz) + JOIN public.tbl_studiengang stg USING (studiengang_kz)'; $parametersArray = array($person_id); diff --git a/application/models/crm/Student_model.php b/application/models/crm/Student_model.php index 539c3cf56..ab073996f 100644 --- a/application/models/crm/Student_model.php +++ b/application/models/crm/Student_model.php @@ -27,7 +27,7 @@ class Student_model extends DB_Model $this->addSelect('1'); $result = $this->loadWhere(array('student_uid' => $uid)); - + if(hasData($result)) { @@ -169,7 +169,7 @@ class Student_model extends DB_Model $max = 0; if ($matrikelnrres && hasData($matrikelnrres)) { - $max = mb_substr($matrikelnrres->retval[0]->matrikelnr, 7); + $max = mb_substr(trim(getData($matrikelnrres)[0]->matrikelnr), -3); if (!is_numeric($max)) { $max = (int)$max; } @@ -279,4 +279,12 @@ class Student_model extends DB_Model { return $student_uid . '@' . DOMAIN; } + + public function getEmailAnredeForStudentUID($student_uid) { + $qry = "SELECT anrede, titelpre, vorname, vornamen, nachname, titelpost + FROM campus.vw_student + WHERE uid = ?"; + + return $this->execReadOnlyQuery($qry, array($student_uid)); + } } diff --git a/application/models/education/Lehrveranstaltung_model.php b/application/models/education/Lehrveranstaltung_model.php index 7347cf2ca..ccac33bc7 100644 --- a/application/models/education/Lehrveranstaltung_model.php +++ b/application/models/education/Lehrveranstaltung_model.php @@ -316,8 +316,8 @@ class Lehrveranstaltung_model extends DB_Model (SELECT status_kurzbz FROM public.tbl_prestudentstatus WHERE prestudent_id=tbl_student.prestudent_id ORDER BY datum DESC, insertamum DESC, ext_id DESC LIMIT 1) as status, tbl_bisio.bisio_id, tbl_bisio.von, tbl_bisio.bis, tbl_student.studiengang_kz AS stg_kz_student, tbl_zeugnisnote.note, tbl_mitarbeiter.mitarbeiter_uid, tbl_person.matr_nr, tbl_benutzer.uid, - UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz) as kuerzel, tbl_studiengang.orgform_kurzbz, vw_student_lehrveranstaltung.semester, vw_student_lehrveranstaltung.studiensemester_kurzbz, vw_student_lehrveranstaltung.bezeichnung - + UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz) as kuerzel, tbl_studiengang.orgform_kurzbz, vw_student_lehrveranstaltung.semester, vw_student_lehrveranstaltung.studiensemester_kurzbz, vw_student_lehrveranstaltung.bezeichnung, + tbl_student.prestudent_id FROM campus.vw_student_lehrveranstaltung JOIN public.tbl_benutzer USING(uid) @@ -386,6 +386,37 @@ class Lehrveranstaltung_model extends DB_Model return $this->execQuery($query, array($lehrveranstaltung_id, $studiensemester_kurzbz)); } + + /** + * Get LV-Leitung of given Lehrveranstaltung ID and Studiensemester. + * + * @param $lehrveranstaltung_id + * @param $studiensemester + * @return array|stdClass|null + */ + public function getLvLeitung($lehrveranstaltung_id, $studiensemester) + { + $params = [$lehrveranstaltung_id, $studiensemester]; + + $qry = " + SELECT + vorname, nachname, mitarbeiter_uid, lehrfunktion_kurzbz + FROM + lehre.tbl_lehreinheit + JOIN lehre.tbl_lehreinheitmitarbeiter lema USING (lehreinheit_id) + JOIN public.tbl_benutzer b ON b.uid = lema.mitarbeiter_uid + JOIN public.tbl_person p using (person_id) + WHERE + tbl_lehreinheit.lehrveranstaltung_id= ? + AND tbl_lehreinheit.studiensemester_kurzbz = ? + AND lehrfunktion_kurzbz = 'LV-Leitung' + ORDER BY + lema.insertamum DESC + LIMIT 1 + "; + + return $this->execQuery($qry, $params); + } /** * Gets all Leiter of Lehrveranstaltungsorganisationseinheit * @param $lehrveranstaltung_id diff --git a/application/models/education/Note_model.php b/application/models/education/Note_model.php index 80b454398..87a1501e0 100644 --- a/application/models/education/Note_model.php +++ b/application/models/education/Note_model.php @@ -11,4 +11,12 @@ class Note_model extends DB_Model $this->dbTable = 'lehre.tbl_note'; $this->pk = 'note'; } + + public function getAllActive() { + $qry ="SELECT * + FROM lehre.tbl_note + WHERE aktiv = true"; + + return $this->execReadOnlyQuery($qry); + } } \ No newline at end of file diff --git a/application/models/education/Paabgabe_model.php b/application/models/education/Paabgabe_model.php index 343a86706..a883043d3 100644 --- a/application/models/education/Paabgabe_model.php +++ b/application/models/education/Paabgabe_model.php @@ -60,5 +60,58 @@ class Paabgabe_model extends DB_Model return $this->execReadOnlyQuery($qry, array($person_id)); } + + public function findAbgabenNewOrUpdatedSince($interval, $relevantTypes) + { + + $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, + 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_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 USING (person_id) + + WHERE (campus.tbl_paabgabe.insertamum >= NOW() - INTERVAL ? + OR campus.tbl_paabgabe.updateamum >= NOW() - INTERVAL ?) + AND campus.tbl_paabgabe.paabgabetyp_kurzbz IN ?"; + + 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 + + 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) + + WHERE campus.tbl_paabgabe.abgabedatum IS NOT NULL + AND campus.tbl_paabgabe.abgabedatum >= NOW() - INTERVAL ? + ORDER BY abgabedatum DESC + "; + + return $this->execQuery($query, [$interval]); + } + public function loadByIDs($paabgabe_ids) { + $qry = "SELECT * FROM campus.tbl_paabgabe WHERE paabgabe_id IN ?"; + + return $this->execReadOnlyQuery($qry, [$paabgabe_ids]); + } } diff --git a/application/models/education/Paabgabetyp_model.php b/application/models/education/Paabgabetyp_model.php index b672a3f0e..034daca44 100644 --- a/application/models/education/Paabgabetyp_model.php +++ b/application/models/education/Paabgabetyp_model.php @@ -11,4 +11,10 @@ class Paabgabetyp_model extends DB_Model $this->dbTable = 'campus.tbl_paabgabetyp'; $this->pk = 'paabgabetyp_kurzbz'; } + + public function getAll() { + $qry = "SELECT * FROM campus.tbl_paabgabetyp ORDER BY bezeichnung"; + + return $this->execReadOnlyQuery($qry); + } } diff --git a/application/models/education/Projektarbeit_model.php b/application/models/education/Projektarbeit_model.php index 1ca2a18a8..5e453056d 100644 --- a/application/models/education/Projektarbeit_model.php +++ b/application/models/education/Projektarbeit_model.php @@ -24,17 +24,28 @@ class Projektarbeit_model extends DB_Model public function getProjektarbeit($student_uid, $studiengang_kz = null, $studiensemester_kurzbz = null, $projekttyp = null, $final = null) { $qry = "SELECT - tbl_projektarbeit.*, tbl_projekttyp.bezeichnung, + pa.*, tbl_projekttyp.bezeichnung, tbl_lehreinheit.studiensemester_kurzbz, tbl_lehrveranstaltung.lehrveranstaltung_id, - tbl_firma.name AS firma_name + tbl_firma.name AS firma_name, + ( + SELECT + STRING_AGG(trim(COALESCE(titelpre,'')||' '||COALESCE(vorname,'')||' '||COALESCE(nachname,'')||' '||COALESCE(titelpost,'')), ', ') + FROM + lehre.tbl_projektbetreuer + JOIN public.tbl_person USING (person_id) + WHERE + projektarbeit_id = pa.projektarbeit_id + AND student_uid = pa.student_uid + GROUP BY projektarbeit_id + ) AS projektbetreuer FROM - lehre.tbl_projektarbeit + lehre.tbl_projektarbeit pa JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz) JOIN lehre.tbl_lehreinheit USING (lehreinheit_id) JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id) LEFT JOIN public.tbl_firma USING (firma_id) WHERE - tbl_projektarbeit.student_uid = ?"; + pa.student_uid = ?"; $params = array($student_uid); @@ -53,16 +64,16 @@ class Projektarbeit_model extends DB_Model if (isset($projekttyp)) { if (is_array($projekttyp)) - $qry .= ' AND tbl_projektarbeit.projekttyp_kurzbz IN ?'; + $qry .= ' AND pa.projekttyp_kurzbz IN ?'; else - $qry .= ' AND tbl_projektarbeit.projekttyp_kurzbz=?'; + $qry .= ' AND pa.projekttyp_kurzbz=?'; $params[] = $projekttyp; } if (isset($final)) { - $qry .= ' AND tbl_projektarbeit.final=?'; + $qry .= ' AND pa.final=?'; $params[] = $final; } @@ -98,36 +109,36 @@ class Projektarbeit_model extends DB_Model */ public function getStudentProjektarbeitenWithBetreuer($studentUID) { - $betreuerQuery = " - SELECT + $betreuerQuery = "SELECT * FROM (SELECT DISTINCT ON(projektarbeit_id) vorname as bvorname, nachname as bnachname, titelpre as btitelpre, titelpost AS btitelpost, - titelpost AS btitelpost, tbl_betreuerart.beschreibung AS betreuerart_beschreibung, - (SELECT person_id - FROM lehre.tbl_projektbetreuer + (SELECT person_id + FROM lehre.tbl_projektbetreuer WHERE projektarbeit_id=tbl_projektarbeit.projektarbeit_id - AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_person_id, - (SELECT betreuerart_kurzbz - FROM lehre.tbl_projektbetreuer + AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_person_id, + (SELECT betreuerart_kurzbz + FROM lehre.tbl_projektbetreuer WHERE projektarbeit_id=tbl_projektarbeit.projektarbeit_id - AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_betreuerart_kurzbz, - (SELECT tbl_betreuerart.beschreibung - FROM lehre.tbl_projektbetreuer JOIN lehre.tbl_betreuerart USING(betreuerart_kurzbz) + AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_betreuerart_kurzbz, + (SELECT tbl_betreuerart.beschreibung + FROM lehre.tbl_projektbetreuer JOIN lehre.tbl_betreuerart USING(betreuerart_kurzbz) WHERE projektarbeit_id=tbl_projektarbeit.projektarbeit_id - AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied') LIMIT 1) AS zweitbetreuer_betreuerart_beschreibung, - + AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied') LIMIT 1) AS zweitbetreuer_betreuerart_beschreibung, + tbl_betreuerart.betreuerart_kurzbz, person_id as bperson_id, projektarbeit_id, lehre.tbl_projekttyp.bezeichnung as projekttypbezeichnung, + lehre.tbl_projekttyp.projekttyp_kurzbz as projekttypkurzbz, lehre.tbl_lehreinheit.studiensemester_kurzbz, lehre.tbl_lehrveranstaltung.studiengang_kz, public.tbl_studiengang.kurzbzlang, - lehre.tbl_projektbetreuer.note as note, + lehre.tbl_projektarbeit.note as note, + lehre.tbl_note.bezeichnung as note_bezeichnung, public.tbl_mitarbeiter.mitarbeiter_uid, lehre.tbl_projektarbeit.titel as titel, lehre.tbl_projektarbeit.sprache as sprache, @@ -136,9 +147,8 @@ class Projektarbeit_model extends DB_Model lehre.tbl_projektarbeit.schlagwoerter as schlagwoerter, lehre.tbl_projektarbeit.schlagwoerter_en as schlagwoerter_en, lehre.tbl_projektarbeit.abstract as abstract, - lehre.tbl_projektarbeit.abstract_en as abstract_en, - (SELECT abgeschicktvon FROM extension.tbl_projektarbeitsbeurteilung WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id AND betreuer_person_id = tbl_projektbetreuer.person_id) AS babgeschickt, - (SELECT abgeschicktvon FROM extension.tbl_projektarbeitsbeurteilung WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_abgeschickt, + lehre.tbl_projektarbeit.abstract_en as abstract_en, + lehre.tbl_projektarbeit.insertamum as insertamum, (SELECT datum FROM campus.tbl_paabgabe WHERE paabgabetyp_kurzbz = 'end' AND abgabedatum IS NOT NULL AND projektarbeit_id = tbl_projektarbeit.projektarbeit_id LIMIT 1) AS abgegeben FROM lehre.tbl_projektarbeit @@ -147,15 +157,17 @@ class Projektarbeit_model extends DB_Model LEFT JOIN public.tbl_benutzer USING(person_id) LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz) LEFT JOIN lehre.tbl_betreuerart USING(betreuerart_kurzbz) - LEFT JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) - LEFT JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id) - LEFT JOIN public.tbl_mitarbeiter ON(public.tbl_mitarbeiter.mitarbeiter_uid = public.tbl_benutzer.uid) - LEFT JOIN public.tbl_studiengang USING(studiengang_kz) - WHERE - tbl_projektarbeit.student_uid = ? AND + LEFT JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) + LEFT JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id) + LEFT JOIN public.tbl_mitarbeiter ON(public.tbl_mitarbeiter.mitarbeiter_uid = public.tbl_benutzer.uid) + LEFT JOIN public.tbl_studiengang USING(studiengang_kz) + LEFT JOIN lehre.tbl_note ON(lehre.tbl_projektarbeit.note = lehre.tbl_note.note) + WHERE + tbl_projektarbeit.student_uid = ? AND mitarbeiter_uid IS NOT NULL AND (projekttyp_kurzbz='Bachelor' OR projekttyp_kurzbz='Diplom') - AND betreuerart_kurzbz IN ('Betreuer', 'Begutachter', 'Erstbegutachter', 'Senatsvorsitz')"; - + AND betreuerart_kurzbz IN ('Betreuer', 'Begutachter', 'Erstbegutachter', 'Senatsvorsitz')) as base + ORDER BY insertamum DESC"; + return $this->execReadOnlyQuery($betreuerQuery, array($studentUID)); } @@ -168,8 +180,12 @@ class Projektarbeit_model extends DB_Model campus.tbl_paabgabe.fixtermin, campus.tbl_paabgabe.kurzbz, campus.tbl_paabgabe.datum, + campus.tbl_paabgabe.note, + campus.tbl_paabgabe.upload_allowed, + campus.tbl_paabgabe.beurteilungsnotiz, campus.tbl_paabgabetyp.paabgabetyp_kurzbz, campus.tbl_paabgabetyp.bezeichnung, + campus.tbl_paabgabetyp.benotbar, campus.tbl_paabgabe.abgabedatum, campus.tbl_paabgabe.insertvon FROM campus.tbl_paabgabe JOIN campus.tbl_paabgabetyp USING(paabgabetyp_kurzbz) @@ -179,16 +195,76 @@ class Projektarbeit_model extends DB_Model return $this->execReadOnlyQuery($qry, array($projektarbeit_id)); } + public function getProjektarbeitenAbgabetermine($projektarbeiten_ids) { + $qry ="SELECT campus.tbl_paabgabe.paabgabe_id, + campus.tbl_paabgabe.projektarbeit_id, + campus.tbl_paabgabe.fixtermin, + campus.tbl_paabgabe.kurzbz, + campus.tbl_paabgabe.datum, + campus.tbl_paabgabe.note, + campus.tbl_paabgabe.upload_allowed, + campus.tbl_paabgabe.beurteilungsnotiz, + campus.tbl_paabgabetyp.paabgabetyp_kurzbz, + campus.tbl_paabgabetyp.bezeichnung, + campus.tbl_paabgabe.abgabedatum, + campus.tbl_paabgabe.insertvon + FROM campus.tbl_paabgabe JOIN campus.tbl_paabgabetyp USING(paabgabetyp_kurzbz) + WHERE campus.tbl_paabgabe.projektarbeit_id IN ? + ORDER BY campus.tbl_paabgabe.datum"; + + return $this->execReadOnlyQuery($qry, array($projektarbeiten_ids)); + } + public function getProjektbetreuerAnrede($bperson_id) { - $qry_betr="SELECT distinct trim(COALESCE(titelpre,'')||' '||COALESCE(vorname,'')||' '||COALESCE(nachname,'')||' '||COALESCE(titelpost,'')) as first, - public.tbl_mitarbeiter.mitarbeiter_uid, anrede - FROM public.tbl_person JOIN lehre.tbl_projektbetreuer ON(lehre.tbl_projektbetreuer.person_id=public.tbl_person.person_id) - JOIN public.tbl_benutzer ON(public.tbl_benutzer.person_id=public.tbl_person.person_id) - JOIN public.tbl_mitarbeiter ON(public.tbl_benutzer.uid=public.tbl_mitarbeiter.mitarbeiter_uid) - WHERE public.tbl_person.person_id= ?"; + $qry_betr="SELECT DISTINCT ON(public.tbl_person.person_id) trim(COALESCE(titelpre,'')||' '||COALESCE(vorname,'')||' '||COALESCE(nachname,'')||' '||COALESCE(titelpost,'')) as first, anrede + FROM public.tbl_person JOIN lehre.tbl_projektbetreuer ON(lehre.tbl_projektbetreuer.person_id=public.tbl_person.person_id) + WHERE public.tbl_person.person_id= ?"; return $this->execReadOnlyQuery($qry_betr, [$bperson_id]); + } + + public function getProjektbetreuerEmail($projektarbeit_id) { + $qry = "SELECT ( + SELECT kontakt + FROM public.tbl_kontakt + WHERE kontakttyp = 'email' + AND person_id = pers.person_id + ORDER BY + CASE WHEN zustellung THEN 0 ELSE 1 END, + insertamum DESC NULLS LAST + LIMIT 1 + ) AS private_email, mitarbeiter_uid as uid + FROM lehre.tbl_projektarbeit pa + JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id) + JOIN public.tbl_person pers USING (person_id) + LEFT JOIN public.tbl_benutzer ben USING (person_id) + LEFT JOIN public.tbl_mitarbeiter ma ON ben.uid = ma.mitarbeiter_uid + WHERE (ben.aktiv OR ben.aktiv IS NULL) + AND projektarbeit_id = ?"; + return $this->execReadOnlyQuery($qry, [$projektarbeit_id]); + } + + public function getProjektbetreuerEmailByPersonID($person_id) { + $qry = "SELECT ( + SELECT kontakt + FROM public.tbl_kontakt + WHERE kontakttyp = 'email' + AND person_id = pers.person_id + ORDER BY + CASE WHEN zustellung THEN 0 ELSE 1 END, + insertamum DESC NULLS LAST + LIMIT 1 + ) AS private_email, mitarbeiter_uid as uid + FROM lehre.tbl_projektarbeit pa + JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id) + JOIN public.tbl_person pers USING (person_id) + LEFT JOIN public.tbl_benutzer ben USING (person_id) + LEFT JOIN public.tbl_mitarbeiter ma ON ben.uid = ma.mitarbeiter_uid + WHERE (ben.aktiv OR ben.aktiv IS NULL) + AND person_id = ?"; + + return $this->execReadOnlyQuery($qry, [$person_id]); } public function getProjektarbeitBenutzer($uid) { @@ -223,9 +299,9 @@ class Projektarbeit_model extends DB_Model * FROM (SELECT tbl_person.vorname, tbl_person.nachname, tbl_studiengang.typ, tbl_studiengang.kurzbz, - tbl_projektarbeit.projekttyp_kurzbz, tbl_projekttyp.bezeichnung, tbl_projektarbeit.titel, tbl_projektarbeit.projektarbeit_id, - tbl_projektbetreuer.betreuerart_kurzbz, tbl_betreuerart.beschreibung AS betreuerart_beschreibung, - tbl_benutzer.uid, tbl_student.matrikelnr, tbl_lehreinheit.studiensemester_kurzbz + tbl_projektarbeit.projekttyp_kurzbz, tbl_projekttyp.bezeichnung, tbl_projektarbeit.titel, tbl_projektarbeit.projektarbeit_id, tbl_projektarbeit.note, + tbl_projektbetreuer.person_id as betreuer_person_id, tbl_projektbetreuer.betreuerart_kurzbz, tbl_betreuerart.beschreibung AS betreuerart_beschreibung, + tbl_benutzer.uid, tbl_student.matrikelnr, tbl_lehreinheit.studiensemester_kurzbz, public.tbl_student.student_uid FROM lehre.tbl_projektarbeit LEFT JOIN lehre.tbl_projektbetreuer using(projektarbeit_id) LEFT JOIN lehre.tbl_betreuerart using(betreuerart_kurzbz) @@ -262,7 +338,134 @@ class Projektarbeit_model extends DB_Model return $this->execReadOnlyQuery($qry, array($projektarbeit_id)); } - + + + public function getProjektarbeitenForStudiengang($studiengang_kz, $benotet) { + $new_qry = "SELECT DISTINCT ON(tmp.projektarbeit_id) *, campus.get_betreuer_details(tmp.zweitbetreuer_person_id) as zweitbetreuer_full_name, campus.get_betreuer_details(tmp.betreuer_person_id) as erstbetreuer_full_name + FROM( + SELECT + DISTINCT ON(tbl_projektarbeit.projektarbeit_id) + tbl_projektarbeit.projekttyp_kurzbz, + tbl_projektarbeit.titel, + tbl_projektarbeit.projektarbeit_id, + tbl_studiengang.typ, tbl_studiengang.kurzbz, + student_benutzer.uid as student_uid, + student_person.vorname as student_vorname, + student_person.nachname as student_nachname, + tbl_student.matrikelnr, tbl_lehreinheit.studiensemester_kurzbz, + betreuer_benutzer.uid as betreuer_benutzer_uid, + betreuer_person.vorname as betreuer_vorname, + betreuer_person.nachname as betreuer_nachname, + lehre.tbl_projektbetreuer.betreuerart_kurzbz as betreuerart, + lehre.tbl_projektbetreuer.person_id as betreuer_person_id, + lehre.tbl_projektarbeit.sprache as sprache, + lehre.tbl_projektarbeit.seitenanzahl as seitenanzahl, + lehre.tbl_projektarbeit.kontrollschlagwoerter as kontrollschlagwoerter, + lehre.tbl_projektarbeit.schlagwoerter as schlagwoerter, + lehre.tbl_projektarbeit.schlagwoerter_en as schlagwoerter_en, + lehre.tbl_projektarbeit.abstract as abstract, + lehre.tbl_projektarbeit.abstract_en as abstract_en, + lehre.tbl_projektarbeit.insertamum as insertamum, + lehre.tbl_projektarbeit.note as note, + ( + SELECT orgform_kurzbz + FROM tbl_prestudentstatus + WHERE prestudent_id = (SELECT prestudent_id + FROM tbl_student + WHERE student_uid = student_benutzer.uid + LIMIT 1) + ORDER BY datum DESC, insertamum DESC, ext_id DESC + LIMIT 1 + ) + as organisationsform, + ( + SELECT person_id + FROM lehre.tbl_projektbetreuer + WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id + AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied') + LIMIT 1 + ) + AS zweitbetreuer_person_id, + ( + SELECT betreuerart_kurzbz + FROM lehre.tbl_projektbetreuer + WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id + AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied') + LIMIT 1 + ) + AS zweitbetreuer_betreuerart_kurzbz, + ( + SELECT tbl_betreuerart.beschreibung + FROM lehre.tbl_projektbetreuer + JOIN lehre.tbl_betreuerart USING (betreuerart_kurzbz) + WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id + AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied') + LIMIT 1 + ) + AS zweitbetreuer_betreuerart_beschreibung, + ( + SELECT trim(COALESCE(titelpre, '') || ' ' || COALESCE(vorname, '') || ' ' || COALESCE(nachname, '') || ' ' || + COALESCE(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_full_name, + ( + SELECT + COALESCE(tbl_studienplan.orgform_kurzbz, + tbl_prestudentstatus.orgform_kurzbz, tbl_studiengang.orgform_kurzbz) as + orgform + FROM + public.tbl_prestudent + JOIN public.tbl_prestudentstatus USING(prestudent_id) + JOIN public.tbl_studiensemester USING(studiensemester_kurzbz) + JOIN public.tbl_studiengang USING(studiengang_kz) + LEFT JOIN lehre.tbl_studienplan USING(studienplan_id) + WHERE + prestudent_id=tbl_student.prestudent_id + ORDER BY tbl_prestudentstatus.datum DESC LIMIT 1 + ) as orgform, + (SELECT status_kurzbz FROM public.tbl_prestudentstatus + WHERE prestudent_id=tbl_student.prestudent_id + ORDER BY datum DESC, insertamum DESC, ext_id DESC LIMIT 1) as studienstatus + FROM lehre.tbl_projektarbeit + LEFT JOIN public.tbl_benutzer student_benutzer ON (student_benutzer.uid = lehre.tbl_projektarbeit.student_uid) + LEFT JOIN public.tbl_person student_person ON (student_benutzer.person_id = student_person.person_id) + LEFT JOIN public.tbl_student on(student_benutzer.uid = public.tbl_student.student_uid) + LEFT JOIN lehre.tbl_lehreinheit USING (lehreinheit_id) + LEFT JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id) + LEFT JOIN public.tbl_studiengang ON (public.tbl_student.studiengang_kz = public.tbl_studiengang.studiengang_kz) + LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz) + LEFT JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id) + LEFT JOIN public.tbl_person betreuer_person ON (betreuer_person.person_id = lehre.tbl_projektbetreuer.person_id) + LEFT JOIN public.tbl_benutzer betreuer_benutzer ON (betreuer_person.person_id = betreuer_benutzer.person_id) + WHERE (projekttyp_kurzbz = 'Bachelor' OR projekttyp_kurzbz = 'Diplom') + AND student_benutzer.aktiv AND ( + lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Erstbegutachter' + OR lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Begutachter' + OR lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Betreuer' + OR lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Erstbetreuer' + OR lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Senatsvorsitz' + ) + AND public.tbl_studiengang.studiengang_kz = ?"; + + if($benotet == 0) { + $new_qry .= " AND lehre.tbl_projektarbeit.note IS NULL "; + } else if ($benotet == 1) { + $new_qry .= " AND lehre.tbl_projektarbeit.note IS NOT NULL "; + } + + $new_qry .= " ORDER BY tbl_projektarbeit.projektarbeit_id DESC, student_person.nachname ASC + ) as tmp"; + + return $this->execReadOnlyQuery($new_qry, array($studiengang_kz)); + } + /** * * @param @@ -288,4 +491,17 @@ class Projektarbeit_model extends DB_Model return false; } + + public function getProjektarbeitByPaabgabeID($paabgabe_id) { + $qry = "SELECT + projektarbeit_id + FROM + campus.tbl_paabgabe + JOIN lehre.tbl_projektarbeit USING(projektarbeit_id) + WHERE + campus.tbl_paabgabe.paabgabe_id = ?; + "; + + return $this->execReadOnlyQuery($qry, [$paabgabe_id]); + } } diff --git a/application/models/education/Projektbetreuer_model.php b/application/models/education/Projektbetreuer_model.php index 02368ae21..47e0239d6 100644 --- a/application/models/education/Projektbetreuer_model.php +++ b/application/models/education/Projektbetreuer_model.php @@ -232,4 +232,41 @@ class Projektbetreuer_model extends DB_Model return $this->execQuery($qry, array($projektarbeit_id, $betreuer_person_id)); } + + /** + * Gets all Betreuer of a Projektarbeit. + * Returns one row for each person. + * @param int $projektarbeit_id + * @return array success with number of Betreuer or error + */ + public function getAllBetreuerOfProjektarbeit($projektarbeit_id) + { + $qry = "SELECT DISTINCT ON (pers.person_id) pers.person_id, betreuerart_kurzbz, vorname, nachname, + trim(COALESCE(titelpre,'')||' '||COALESCE(vorname,'')||' '||COALESCE(nachname,'')||' '||COALESCE(titelpost,'')) as voller_name, + anrede, titelpre, titelpost, gebdatum, geschlecht, pa.projekttyp_kurzbz, + ben.uid, ben.alias, ma.personalnummer, mitarbeiter_uid, student_uid, + ( + SELECT kontakt + FROM public.tbl_kontakt + WHERE kontakttyp = 'email' + AND person_id = pers.person_id + ORDER BY + CASE WHEN zustellung THEN 0 ELSE 1 END, + insertamum DESC NULLS LAST + LIMIT 1 + ) AS private_email + FROM lehre.tbl_projektarbeit pa + JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id) + JOIN public.tbl_person pers USING (person_id) + LEFT JOIN public.tbl_benutzer ben USING (person_id) + LEFT JOIN public.tbl_mitarbeiter ma ON ben.uid = ma.mitarbeiter_uid + WHERE (ben.aktiv OR ben.aktiv IS NULL) + AND projektarbeit_id = ? + ORDER BY pers.person_id, CASE WHEN ma.mitarbeiter_uid IS NULL THEN 1 ELSE 0 END, /*Mitarbeiter account first*/ + CASE WHEN ben.uid IS NULL THEN 1 ELSE 0 END, /*user with account first*/ + ben.insertamum"; + + return $this->execQuery($qry, array($projektarbeit_id)); + } + } diff --git a/application/models/organisation/Organisationseinheit_model.php b/application/models/organisation/Organisationseinheit_model.php index db56c1930..9f64580a9 100644 --- a/application/models/organisation/Organisationseinheit_model.php +++ b/application/models/organisation/Organisationseinheit_model.php @@ -243,4 +243,20 @@ class Organisationseinheit_model extends DB_Model return $this->execReadOnlyQuery($qry, array($oe_kurzbz)); } + + public function getAssistenzForOE($oe_kurzbz) { + $qry = " + SELECT person_id, uid, benutzerfunktion_id, funktion_kurzbz, oe_kurzbz, alias, + anrede, trim(COALESCE(titelpre,'')||' '||COALESCE(vorname,'')||' '||COALESCE(nachname,'')||' '||COALESCE(titelpost,'')) as first + FROM tbl_benutzerfunktion + JOIN public.tbl_benutzer USING(uid) + JOIN public.tbl_person USING(person_id) + WHERE funktion_kurzbz = 'ass' + AND oe_kurzbz = ? + AND (datum_bis IS NULL OR NOW() <= datum_bis) + AND public.tbl_benutzer.aktiv = true + "; + + return $this->execReadOnlyQuery($qry, array($oe_kurzbz)); + } } diff --git a/application/models/organisation/Studiengang_model.php b/application/models/organisation/Studiengang_model.php index 02f972690..131e1deb5 100644 --- a/application/models/organisation/Studiengang_model.php +++ b/application/models/organisation/Studiengang_model.php @@ -657,37 +657,7 @@ class Studiengang_model extends DB_Model $this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel'); $this->load->model('person/Person_model', 'PersonModel'); $this->load->model('crm/Student_model', 'StudentModel'); - - $addEmailProperty= function(&$benutzerfunktionen){ - if(count($benutzerfunktionen) && defined('DOMAIN')) - { - $benutzerfunktionen = array_map(function($benutzer) - { - $benutzer->email = $benutzer->alias."@".DOMAIN; - return $benutzer; - },$benutzerfunktionen) ; - } - - }; - $addFotoProperty= function(&$collection){ - $collection = array_map(function($item){ - $person_id = $this->PersonModel->getByUid($item->uid); - if(isError($person_id)) - return error($person_id); - $person_id = current(getData($person_id))->person_id; - $this->PersonModel->addSelect('foto'); - $foto = $this->PersonModel->loadWhere(array('person_id'=>$person_id)); - if(isError($foto)) - return error($foto); - $foto = current(getData($foto))->foto; - $item->foto = $foto; - return $item; - },$collection); - }; - - $this->load->model('crm/Student_model', 'StudentModel'); - $student = $this->StudentModel->loadWhere(['student_uid' => getAuthUID()]); if (isError($student)) return error($student); @@ -712,7 +682,7 @@ class Studiengang_model extends DB_Model $stg_ltg = array_values(array_filter($stg_ltg, function($stg_leitung){ return $stg_leitung->aktiv; })); - $addFotoProperty($stg_ltg); + $this->addFotoProperty($stg_ltg); $gf_ltg = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('gLtg', $stg_obj->oe_kurzbz); if (isError($gf_ltg)) @@ -721,8 +691,8 @@ class Studiengang_model extends DB_Model $gf_ltg = array_values(array_filter($gf_ltg, function($gf_leitung){ return $gf_leitung->aktiv; })); - $addEmailProperty($gf_ltg); - $addFotoProperty($gf_ltg); + $this->addEmailProperty($gf_ltg); + $this->addFotoProperty($gf_ltg); $stv_ltg = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('stvLtg', $stg_obj->oe_kurzbz); if (isError($stv_ltg)) @@ -731,8 +701,8 @@ class Studiengang_model extends DB_Model $stv_ltg = array_values(array_filter($stv_ltg, function($stv_leitung){ return $stv_leitung->aktiv; })); - $addEmailProperty($stv_ltg); - $addFotoProperty($stv_ltg); + $this->addEmailProperty($stv_ltg); + $this->addFotoProperty($stv_ltg); $ass = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('ass', $stg_obj->oe_kurzbz); if (isError($ass)) @@ -741,8 +711,8 @@ class Studiengang_model extends DB_Model $ass = array_values(array_filter($ass, function($assistenz){ return $assistenz->aktiv; })); - $addEmailProperty($ass); - $addFotoProperty($ass); + $this->addEmailProperty($ass); + $this->addFotoProperty($ass); $hochschulvertr = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('hsv'); if (isError($hochschulvertr)) @@ -751,7 +721,7 @@ class Studiengang_model extends DB_Model $hochschulvertr = array_values(array_filter($hochschulvertr, function($hochschul_vertreter){ return $hochschul_vertreter->aktiv; })); - $addEmailProperty($hochschulvertr); + $this->addEmailProperty($hochschulvertr); $stdv = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('stdv', $stg_obj->oe_kurzbz); @@ -761,7 +731,7 @@ class Studiengang_model extends DB_Model $stdv = array_values(array_filter($stdv, function($std_vertreter){ return $std_vertreter->aktiv; })); - $addEmailProperty($stdv); + $this->addEmailProperty($stdv); $jahrgangsvertr = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('jgv', $stg_obj->oe_kurzbz, $semester); @@ -771,7 +741,7 @@ class Studiengang_model extends DB_Model $jahrgangsvertr = array_values(array_filter($jahrgangsvertr, function($jahrgang_vertreter){ return $jahrgang_vertreter->aktiv; })); - $addEmailProperty($jahrgangsvertr); + $this->addEmailProperty($jahrgangsvertr); $result_object = new stdClass(); @@ -801,4 +771,141 @@ class Studiengang_model extends DB_Model return $this->execReadOnlyQuery($qry, array($studiengang_kz, $orgform_kurzbz, $studiensemester_kurzbz)); } + + /** + * Get active Studiengänge with Kuerzel by given Studiengang-Kennzahlen. + * Helpful to easily get Studiengänge the user is entitled for. + * + * @param $studiengang_kz_arr + * @param $studiensemester_kurzbz + * @return array|stdClass|null Returns one row per Studiengang. Not considering the Orgforms. + */ + public function getByStgs($studiengang_kz_arr, $studiensemester_kurzbz) + { + if (is_numeric($studiengang_kz_arr)) + { + $studiengang_kz_arr = [$studiengang_kz_arr]; + } + + $qry = ' + SELECT + DISTINCT stg.*, UPPER(typ::varchar(1) || kurzbz) AS kuerzel + FROM + public.tbl_studiengang stg + JOIN lehre.tbl_studienordnung sto USING(studiengang_kz) + JOIN lehre.tbl_studienplan stpl USING(studienordnung_id) + JOIN lehre.tbl_studienplan_semester stplsem USING(studienplan_id) + WHERE + stg.studiengang_kz IN ? + AND stplsem.studiensemester_kurzbz = ? + ORDER BY + stg.kurzbzlang + '; + + return $this->execQuery($qry, [$studiengang_kz_arr, $studiensemester_kurzbz]); + } + + /** + * Get OrgForms of given Studiengang and Studiensemester. + * + * @param $studiengang_kz + * @param $studiensemester_kurzbz + * @return array|stdClass|null + */ + public function getOrgformsByStg($studiengang_kz, $studiensemester_kurzbz) + { + $qry = ' + SELECT + stpl.orgform_kurzbz + FROM + public.tbl_studiengang stg + JOIN lehre.tbl_studienordnung sto USING(studiengang_kz) + JOIN lehre.tbl_studienplan stpl USING(studienordnung_id) + JOIN lehre.tbl_studienplan_semester stplsem USING(studienplan_id) + WHERE + stg.studiengang_kz = ? + AND stg.aktiv = TRUE + AND stplsem.studiensemester_kurzbz = ? + GROUP BY + stpl.orgform_kurzbz + ORDER BY + CASE stpl.orgform_kurzbz + WHEN \'VZ\' THEN 1 + WHEN \'BB\' THEN 2 + WHEN \'DUA\' THEN 3 + ELSE 4 + END, + stpl.orgform_kurzbz; + '; + + return $this->execQuery($qry, [$studiengang_kz, $studiensemester_kurzbz]); + } + + public function getStudiengaengeFiltered($allowed_stg) { + $query ="SELECT DISTINCT + public.tbl_studiengang.studiengang_kz, + public.tbl_studiengang.bezeichnung, + public.tbl_studiengang.kurzbzlang, + public.tbl_studiengang.orgform_kurzbz + FROM public.tbl_studiengang JOIN lehre.tbl_studienordnung USING(studiengang_kz) + JOIN lehre.tbl_studienplan USING(studienordnung_id) + JOIN lehre.tbl_studienplan_semester USING(studienplan_id) + WHERE public.tbl_studiengang.aktiv = true + + AND public.tbl_studiengang.studiengang_kz IN ? + ORDER BY public.tbl_studiengang.kurzbzlang"; + + return $this->execReadOnlyQuery($query, [$allowed_stg]); + } + + public function getAssistenzForStudiengangKZ($stg_kz) { + $this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel'); + + $stg_obj = $this->load($stg_kz); + if(isError($stg_obj)) + return error($stg_obj); + if(getData($stg_obj)) + { + $stg_obj = current(getData($stg_obj)); + } + + $ass = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('ass', $stg_obj->oe_kurzbz); + if (isError($ass)) + return $ass; + $ass = getData($ass) ?: []; + $ass = array_values(array_filter($ass, function($assistenz){ + return $assistenz->aktiv; + })); + + $this->addEmailProperty($ass); + + return success($ass); + } + + private function addEmailProperty(&$benutzerfunktionen) { + if(count($benutzerfunktionen) && defined('DOMAIN')) + { + $benutzerfunktionen = array_map(function($benutzer) + { + $benutzer->email = $benutzer->alias."@".DOMAIN; + return $benutzer; + },$benutzerfunktionen) ; + } + } + + private function addFotoProperty (&$collection) { + $collection = array_map(function($item){ + $person_id = $this->PersonModel->getByUid($item->uid); + if(isError($person_id)) + return error($person_id); + $person_id = current(getData($person_id))->person_id; + $this->PersonModel->addSelect('foto'); + $foto = $this->PersonModel->loadWhere(array('person_id'=>$person_id)); + if(isError($foto)) + return error($foto); + $foto = current(getData($foto))->foto; + $item->foto = $foto; + return $item; + },$collection); + } } diff --git a/application/models/person/Person_model.php b/application/models/person/Person_model.php index 233cfc751..e72b24de4 100644 --- a/application/models/person/Person_model.php +++ b/application/models/person/Person_model.php @@ -420,4 +420,17 @@ class Person_model extends DB_Model return success($result); } } + + public function loadAllStudentUIDSForPersonID($person_id) { + $qry = "SELECT + CONCAT(tp.vorname, ' ', tp.nachname) AS name, + ARRAY_AGG(DISTINCT b.uid ORDER BY b.uid) AS uids + FROM public.tbl_student s + JOIN public.tbl_benutzer b ON s.student_uid = b.uid + JOIN public.tbl_person tp ON b.person_id = tp.person_id + GROUP BY tp.vorname, tp.nachname, b.aktiv, b.person_id + HAVING b.person_id = ? AND b.aktiv IS TRUE;"; + + return $this->execReadOnlyQuery($qry, [$person_id]); + } } diff --git a/application/models/person/Profil_update_model.php b/application/models/person/Profil_update_model.php index 31005c4b7..039810537 100644 --- a/application/models/person/Profil_update_model.php +++ b/application/models/person/Profil_update_model.php @@ -135,7 +135,8 @@ class Profil_update_model extends DB_Model attachment_id, UPPER(public.tbl_studiengang.typ || public.tbl_studiengang.kurzbz) AS studiengang, COALESCE(of.orgform_kurzbz, public.tbl_studiengang.orgform_kurzbz) AS orgform, - NULL as oezuordnung + NULL as oezuordnung, + tbl_student.semester FROM public.tbl_profil_update JOIN public.tbl_profil_update_status ON public.tbl_profil_update_status.status_kurzbz = public.tbl_profil_update.status JOIN public.tbl_student ON public.tbl_student.student_uid=public.tbl_profil_update.uid diff --git a/application/models/ressource/Stundenplan_model.php b/application/models/ressource/Stundenplan_model.php index 389be582d..d0a97ed9d 100644 --- a/application/models/ressource/Stundenplan_model.php +++ b/application/models/ressource/Stundenplan_model.php @@ -470,12 +470,12 @@ class Stundenplan_model extends DB_Model } foreach($studentlehrverbaende[$sem_date] as $key=>$lehrverband) { - $query .= "((sp.studiengang_kz = ".$this->escape($lehrverband->studiengang_kz)." AND sp.semester = ".$this->escape($lehrverband->semester)." AND sp.verband = ".$this->escape($lehrverband->verband)." AND sp.gruppe = ".$this->escape($lehrverband->gruppe)." AND sp.datum BETWEEN ".$this->escape($sem_date_range->start)." AND ".$this->escape($sem_date_range->ende).")"; + $query .= "(((sp.studiengang_kz = ".$this->escape($lehrverband->studiengang_kz)." AND sp.semester = ".$this->escape($lehrverband->semester)." AND sp.verband = ".$this->escape($lehrverband->verband)." AND sp.gruppe = ".$this->escape($lehrverband->gruppe)." AND sp.datum BETWEEN ".$this->escape($sem_date_range->start)." AND ".$this->escape($sem_date_range->ende).")"; // Eintraege fuer den ganzen Verband $query .= "OR (sp.studiengang_kz = ".$this->escape($lehrverband->studiengang_kz)." AND sp.semester = ".$this->escape($lehrverband->semester)." AND sp.verband = ".$this->escape($lehrverband->verband)." AND (sp.gruppe is null OR sp.gruppe='') AND sp.datum BETWEEN ".$this->escape($sem_date_range->start)." AND ".$this->escape($sem_date_range->ende).")"; // Eintraege fuer das ganze Semester $query .= "OR (sp.studiengang_kz = ".$this->escape($lehrverband->studiengang_kz)." AND sp.semester = ".$this->escape($lehrverband->semester)." AND (sp.verband is null OR sp.verband='') AND sp.datum BETWEEN ".$this->escape($sem_date_range->start) - ." AND ".$this->escape($sem_date_range->ende).")". $stringGroupLv. ")"; + ." AND ".$this->escape($sem_date_range->ende).")) AND gruppe_kurzbz is null)"; $query .="OR"; } @@ -535,4 +535,53 @@ class Stundenplan_model extends DB_Model return $this->execQuery($query, [$uid, $uid]); } + + /** + * Get Stundenplantermine for given Lehreinheit. + * + * @param $lehreinheit_id + * @return array|stdClass|null + */ + public function getTermineByLe($lehreinheit_id) + { + $qry = ' + SELECT DISTINCT + datum + FROM + lehre.vw_stundenplan + WHERE + lehreinheit_id = ? + ORDER BY + datum ASC + '; + + return $this->execQuery($qry, [$lehreinheit_id]); + } + + /** + * Get Stundenplantermine for given Lehrveranstaltung of given Studiensemester. + * + * @param $lehrveranstaltung_id + * @param $studiensemester_kurzbz + * @return array|stdClass|null + */ + public function getTermineByLv($lehrveranstaltung_id, $studiensemester_kurzbz) + { + $qry = ' + SELECT DISTINCT + datum + FROM + lehre.vw_stundenplan + WHERE + lehreinheit_id IN ( + SELECT lehreinheit_id + FROM lehre.tbl_lehreinheit + WHERE lehrveranstaltung_id = ? + AND studiensemester_kurzbz = ? + ) + ORDER BY datum ASC + '; + + return $this->execQuery($qry, [$lehrveranstaltung_id, $studiensemester_kurzbz]); + } } diff --git a/application/models/ressource/Stundensatz_model.php b/application/models/ressource/Stundensatz_model.php index c8ee367d8..2a7418924 100644 --- a/application/models/ressource/Stundensatz_model.php +++ b/application/models/ressource/Stundensatz_model.php @@ -47,7 +47,6 @@ class Stundensatz_model extends DB_Model { $this->load->config('stv'); - $useFixangestelltStundensatz = $this->config->item('tabs')['projektarbeit']['lvLektroinnenzuteilungFixangestelltStundensatz']; $defaultStundensatz = $this->config->item('tabs')['projektarbeit']['defaultProjektbetreuerStundensatz']; $stundensatz = ''; @@ -63,7 +62,7 @@ class Stundensatz_model extends DB_Model { $studiensemester = getData($result)[0]; - if (isset($useFixangestelltStundensatz) && !$useFixangestelltStundensatz) + if (defined('FAS_LV_LEKTORINNENZUTEILUNG_FIXANGESTELLT_STUNDENSATZ') && !FAS_LV_LEKTORINNENZUTEILUNG_FIXANGESTELLT_STUNDENSATZ) { // load Mitarbeiter $params = [$person_id]; @@ -83,19 +82,30 @@ class Stundensatz_model extends DB_Model if (hasData($result)) { - foreach (getData($result) as $ma) - { - if (!$ma->fixangestellt) - { - $stundensatzRes = $this->getStundensatzByDatum( - $ma->mitarbeiter_uid, $studiensemester->start, $studiensemester->ende, 'lehre' - ); + $ma = getData($result)[0]; - if (hasData($stundensatzRes)) - $stundensatz = getData($stundensatzRes)[0]->stundensatz; - else - $stundensatz = '0.00'; - } + $this->load->model('vertragsbestandteil/Dienstverhaeltnis_model','DienstverhaeltnisModel'); + $echterdv_result = $this->DienstverhaeltnisModel->existsDienstverhaeltnis( + $ma->mitarbeiter_uid, + $studiensemester->start, + $studiensemester->ende, + 'echterdv' + ); + + if (hasData($echterdv_result)) + { + $stundensatz = null; + } + else + { + $stundensatzRes = $this->getStundensatzByDatum( + $ma->mitarbeiter_uid, $studiensemester->start, $studiensemester->ende, 'lehre' + ); + + if (hasData($stundensatzRes)) + $stundensatz = getData($stundensatzRes)[0]->stundensatz; + else + $stundensatz = '0.00'; } } else diff --git a/application/models/system/Message_model.php b/application/models/system/Message_model.php index e0a185f9b..19129b606 100644 --- a/application/models/system/Message_model.php +++ b/application/models/system/Message_model.php @@ -242,74 +242,89 @@ class Message_model extends DB_Model */ public function getMessagesForTable($person_id, $offset, $limit) { - $sql_base = " - SELECT + $sql = <<execQuery($sql, $parametersArray); - - if (isError($count)) - return $count; - - $count = ceil(current(getData($count))->count/$limit); - $sql = " - SELECT * FROM ( - " . $sql_base . " - ) a - ORDER BY insertamum DESC - LIMIT ? - OFFSET ? - "; + (COALESCE(ps.titelpre,'') || ' ' || COALESCE(ps.vorname,'') || ' ' || COALESCE(ps.nachname,'') || ' ' || COALESCE(ps.titelpost,'')) as sender, + (COALESCE(pr.titelpre,'') || ' ' || COALESCE(pr.vorname,'') || ' ' || COALESCE(pr.nachname,'') || ' ' || COALESCE(pr.titelpost,'')) as recipient, + fm.sender_id, + fm.recipient_id, + ms.status, + ms.insertamum as statusdatum + from + filtered_messages fm + join + public.tbl_msg_message m on fm.message_id = m.message_id + join + lastmsgstatus ms on fm.message_id = ms.message_id and fm.recipient_id = ms.person_id + left join + public.tbl_person ps on ps.person_id = fm.sender_id + left join + public.tbl_person pr on pr.person_id = fm.recipient_id + order by + m.insertamum DESC + limit ? + offset ?; +EOSQL; $parametersArray = array($person_id, $person_id, $limit, $offset); + $count = 0; $data = $this->execQuery($sql, $parametersArray); if (isError($data)) return $data; $data = getData($data); + if($data) + { + $count = ceil($data[0]->total_msgs / $limit); + } return success(['data' => $data, 'count' => $count]); } diff --git a/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php b/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php index c50627697..2669105a1 100644 --- a/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php +++ b/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php @@ -286,7 +286,13 @@ EOSQL; foreach( $rows as $row ) { $tmpgb = new Gehaltsbestandteil(); $tmpgb->hydrateByStdClass($row, true); - + + if ($row->betrag_valorisiert != null && $row->valorisierungsdatum != null + && $row->valorisierungsdatum == $row->von) { + // neuer Gehaltsbestandteil mit Valorisierungsdatum aber auch valorisiert + $tmpgb->setGrundbetrag($row->betrag_valorisiert); + } + // prevent duplication (caused by the join with historic values) if (!isset($lastRecords[(string)$row->gehaltsbestandteil_id])) { $gehaltsbestandteile[] = $tmpgb; diff --git a/application/views/Cis/Abgabetool.php b/application/views/Cis/Abgabetool.php new file mode 100644 index 000000000..86e8721f2 --- /dev/null +++ b/application/views/Cis/Abgabetool.php @@ -0,0 +1,47 @@ + 'Cis4', + 'axios027' => true, + 'bootstrap5' => true, + 'fontawesome6' => true, + 'tabulator5' => true, // TODO: upgrade to 6 when available + 'vue3' => true, + 'primevue3' => true, + 'skipID' => '#fhccontent', + 'vuedatepicker11' => true, + 'customCSSs' => array( + 'public/css/components/verticalsplit.css', + 'public/css/components/FilterComponent.css', + 'public/css/components/FormUnderline.css', + 'public/css/theme/default.css', + 'public/css/components/abgabetool/abgabe.css' + ), + 'customJSs' => array( + 'vendor/npm-asset/primevue/accordion/accordion.min.js', + 'vendor/npm-asset/primevue/accordiontab/accordiontab.min.js', + 'vendor/npm-asset/primevue/checkbox/checkbox.min.js', + 'vendor/npm-asset/primevue/inputnumber/inputnumber.min.js', + 'vendor/npm-asset/primevue/speeddial/speeddial.min.js', + 'vendor/npm-asset/primevue/textarea/textarea.min.js', + 'vendor/npm-asset/primevue/timeline/timeline.min.js', + 'vendor/npm-asset/primevue/inplace/inplace.min.js', + 'vendor/npm-asset/primevue/message/message.min.js', + 'vendor/npm-asset/primevue/tieredmenu/tieredmenu.js', + 'vendor/moment/luxonjs/luxon.min.js' + ), + 'customJSModules' => array( + 'public/js/apps/Abgabetool/Abgabetool.js', + ), + +); + +$this->load->view('templates/FHC-Header', $includesArray); +?> +
+ uid= + student_uid_prop="" + stg_kz_prop="" + > +
+load->view('templates/FHC-Footer', $includesArray); ?> diff --git a/application/views/CisRouterView/CisRouterView.php b/application/views/CisRouterView/CisRouterView.php index ab22fbb81..6ff428362 100644 --- a/application/views/CisRouterView/CisRouterView.php +++ b/application/views/CisRouterView/CisRouterView.php @@ -21,19 +21,25 @@ $includesArray = array( 'public/css/components/FilterComponent.css', 'public/css/components/Profil.css', 'public/css/components/FormUnderline.css', + 'public/css/components/abgabetool/abgabe.css', 'public/css/Cis4/Cms.css', 'public/css/Cis4/Studium.css', ), 'customJSs' => array( 'vendor/npm-asset/primevue/accordion/accordion.min.js', 'vendor/npm-asset/primevue/accordiontab/accordiontab.min.js', - 'vendor/npm-asset/primevue/inputnumber/inputnumber.min.js', - 'vendor/npm-asset/primevue/textarea/textarea.min.js', 'vendor/npm-asset/primevue/checkbox/checkbox.min.js', + 'vendor/npm-asset/primevue/inputnumber/inputnumber.min.js', + 'vendor/npm-asset/primevue/speeddial/speeddial.min.js', + 'vendor/npm-asset/primevue/textarea/textarea.min.js', + 'vendor/npm-asset/primevue/timeline/timeline.min.js', + 'vendor/npm-asset/primevue/inplace/inplace.min.js', + 'vendor/npm-asset/primevue/message/message.min.js', + 'vendor/npm-asset/primevue/tieredmenu/tieredmenu.js', 'vendor/moment/luxonjs/luxon.min.js' ), 'customJSModules' => array( - 'public/js/apps/Dashboard/Fhc.js' + 'public/js/apps/Dashboard/Fhc.js', ), ); diff --git a/application/views/Nachrichten.php b/application/views/Nachrichten.php index cf34bfd53..0d0e8e707 100644 --- a/application/views/Nachrichten.php +++ b/application/views/Nachrichten.php @@ -40,6 +40,10 @@ $configArray = [ cis-root="" :permissions="" :config="" + + :id ="" + type-id ="" + > diff --git a/application/views/Studentenverwaltung.php b/application/views/Studentenverwaltung.php index 01e611657..1cd28d735 100644 --- a/application/views/Studentenverwaltung.php +++ b/application/views/Studentenverwaltung.php @@ -22,7 +22,8 @@ 'public/css/components/function.css' ], 'customJSs' => [ - 'vendor/vuejs/vuedatepicker_js/vue-datepicker.iife.js' + 'vendor/vuejs/vuedatepicker_js/vue-datepicker.iife.js', + 'vendor/moment/luxonjs/luxon.min.js' #'vendor/npm-asset/primevue/tree/tree.min.js', #'vendor/npm-asset/primevue/toast/toast.min.js' ], @@ -53,6 +54,8 @@ $configArray = [ active-addons="" stv-root="" cis-root="" + avatar-url="" + logout-url="" :permissions="" :config="" > diff --git a/application/views/system/infocenter/onboarding.php b/application/views/system/infocenter/onboarding.php new file mode 100644 index 000000000..1f5bae847 --- /dev/null +++ b/application/views/system/infocenter/onboarding.php @@ -0,0 +1,47 @@ +load->view( + 'templates/FHC-Header', + array( + 'title' => 'Info Center', + 'jquery3' => true, + 'jqueryui1' => true, + 'jquerycheckboxes1' => true, + 'bootstrap3' => true, + 'fontawesome4' => true, + 'sbadmintemplate3' => true, + 'tablesorter2' => true, + 'ajaxlib' => true, + 'filterwidget' => true, + 'navigationwidget' => true, + 'dialoglib' => true, + 'phrases' => array( + 'person' => array('vorname', 'nachname'), + 'ui' => array('bitteEintragWaehlen') + ), + 'customCSSs' => array('public/css/sbadmin2/tablesort_bootstrap.css', 'public/css/infocenter/infocenterPersonDataset.css'), + 'customJSs' => array('public/js/bootstrapper.js', 'public/js/infocenter/rueckstellung.js', 'public/js/infocenter/infocenterPersonDataset.js') + ) + ); +?> + +
+ + widgetlib->widget('NavigationWidget'); ?> + +
+
+
+
+ +
+
+
+ load->view('system/infocenter/onboardingData.php'); ?> +
+
+
+
+ +load->view('templates/FHC-Footer'); ?> diff --git a/application/views/system/infocenter/onboardingData.php b/application/views/system/infocenter/onboardingData.php new file mode 100644 index 000000000..5ee66fdde --- /dev/null +++ b/application/views/system/infocenter/onboardingData.php @@ -0,0 +1,116 @@ +>0 as bezeichnung + FROM public.tbl_rueckstellung + JOIN public.tbl_rueckstellung_status USING(status_kurzbz) + JOIN public.tbl_person sp ON tbl_rueckstellung.person_id = sp.person_id + WHERE tbl_rueckstellung.rueckstellung_id = + ( + SELECT srueck.rueckstellung_id + FROM public.tbl_rueckstellung srueck + WHERE srueck.person_id = tbl_rueckstellung.person_id + AND datum_bis >= NOW() + ORDER BY srueck.datum_bis DESC LIMIT 1 + ) + ) rueck ON rueck.person_id = p.person_id + WHERE p.person_id NOT IN (SELECT person_id FROM public.tbl_prestudent)'; + + $filterWidgetArray = array( + 'query' => $query, + 'app' => InfoCenter::APP, + 'datasetName' => 'onboarding', + 'filter_id' => $this->input->get('filter_id'), + 'requiredPermissions' => 'infocenter', + 'datasetRepresentation' => 'tablesorter', + 'checkboxes' => 'PersonId', + 'additionalColumns' => array('Details'), + 'columnsAliases' => array( + 'PersonId', + ucfirst($this->p->t('person', 'vorname')) , + ucfirst($this->p->t('person', 'nachname')), + ucfirst($this->p->t('global', 'sperrdatum')), + ucfirst($this->p->t('global', 'gesperrtVon')), + ucfirst($this->p->t('infocenter', 'rueckstelldatum')), + ucfirst($this->p->t('infocenter', 'rueckstellgrund')), + ), + + 'formatRow' => function($datasetRaw) { + /* NOTE: Dont use $this here for PHP Version compatibility */ + $datasetRaw->{'Details'} = sprintf( + 'Details', + site_url('system/infocenter/InfoCenter/showDetails'), + $datasetRaw->{'PersonId'}, + 'onboarding', + (isset($_GET['fhc_controller_id']) ? $_GET['fhc_controller_id'] : ''), + (isset($_GET['filter_id']) ? $_GET['filter_id'] : '') + ); + + if ($datasetRaw->{'LockDate'} == null) + { + $datasetRaw->{'LockDate'} = '-'; + } + + if ($datasetRaw->{'LockUser'} == null) + { + $datasetRaw->{'LockUser'} = '-'; + } + + if ($datasetRaw->{'HoldDate'} == null) + { + $datasetRaw->{'HoldDate'} = '-'; + } + else + { + $datasetRaw->{'HoldDate'} = date_format(date_create($datasetRaw->{'HoldDate'}), 'Y-m-d H:i'); + } + + if ($datasetRaw->{'Rueckstellgrund'} === null) + { + $datasetRaw->{'Rueckstellgrund'} = '-'; + } + + return $datasetRaw; + }, + + 'markRow' => function($datasetRaw) { + + if ($datasetRaw->LockDate != null) + { + return FilterWidget::DEFAULT_MARK_ROW_CLASS; + } + } + + + + ); + + echo $this->widgetlib->widget('FilterWidget', $filterWidgetArray); +?> diff --git a/application/views/templates/CISVUE-Header.php b/application/views/templates/CISVUE-Header.php index 358fc75c9..804a43821 100644 --- a/application/views/templates/CISVUE-Header.php +++ b/application/views/templates/CISVUE-Header.php @@ -36,4 +36,4 @@ $this->load->view('templates/FHC-Header', $includesArray); > -
\ No newline at end of file +
\ No newline at end of file diff --git a/cis/public/testtool_test/MathML_Beispiel.png b/cis/public/testtool_test/MathML_Beispiel.png new file mode 100644 index 000000000..d6ef2403f Binary files /dev/null and b/cis/public/testtool_test/MathML_Beispiel.png differ diff --git a/cis/public/testtool_test/testseite.php b/cis/public/testtool_test/testseite.php index a200b95b2..34ea12818 100644 --- a/cis/public/testtool_test/testseite.php +++ b/cis/public/testtool_test/testseite.php @@ -86,67 +86,88 @@ echo '';

Formel / Formula

- - 5 - 3 - - - + - - 7 - 6 - - = - - - 10 - 6 - - + - - - 7 - 6 - - = - - 17 - - 6 - + + + 5 + 3 + + + + + 7 + 6 + + = + + 10 + 6 + + + + + 7 + 6 + + = + + 17 + 6 + +

- - - - k=1 - 5 - - - - (-1) - k+1 - - - - - - x - 2k + 1 - - - - (2k+1)! - - - - + + + + + k + = + 1 + + 5 + + + + + ( + - + 1 + ) + + + k + + + 1 + + + + + + x + + 2 + k + + + 1 + + + + + ( + 2 + k + + + 1 + ) + ! + + + +

Bild / Picture

- Beispielbild + Beispielbild
diff --git a/cis/testtool/admin/index.php b/cis/testtool/admin/index.php index 4f010784f..f8e8d36ed 100644 --- a/cis/testtool/admin/index.php +++ b/cis/testtool/admin/index.php @@ -1172,8 +1172,8 @@ if ($frage_id != '') echo ""; //Vorschau fuer das Text-Feld echo "Vorschau:
-
$frage->text
- Derzeit:
$frage->text
+
$frage->text
+ Derzeit:
$frage->text
"; echo ""; echo ''; @@ -1280,8 +1280,8 @@ if ($frage_id != '') echo "/>"; echo "".($vorschlag_id != ''?"frage_id'\" />":'').""; //Vorschau fuer das Text-Feld - echo "Vorschau:
$vorschlag->text
- Derzeit:
$vorschlag->text
"; + echo "Vorschau:
$vorschlag->text
+ Derzeit:
$vorschlag->text
"; echo ""; echo ""; echo ''; diff --git a/cis/testtool/externeueberwachung.js b/cis/testtool/externeueberwachung.js new file mode 100644 index 000000000..71951779f --- /dev/null +++ b/cis/testtool/externeueberwachung.js @@ -0,0 +1,15 @@ +(function () { + function sendMessage() { + let frame = window.frames['content']; + if (frame) + frame.postMessage({ type: "proctoringReady" }); + } + + window.addEventListener("message", function (e) + { + if (e.data.indexOf("proctoringReady_") === 0) + { + sendMessage(); + } + }); +})(); diff --git a/cis/testtool/frage.css b/cis/testtool/frage.css new file mode 100644 index 000000000..04024ae53 --- /dev/null +++ b/cis/testtool/frage.css @@ -0,0 +1,30 @@ +.proctoring-blocker +{ + position: fixed; + inset: 0; + z-index: 99999; + backdrop-filter: blur(6px); + pointer-events: all; + user-select: none; +} + +.proctoring-blocker.hidden +{ + display: none !important; +} + +.proctoring-text +{ + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + color: #fff; + font-size: 16px; + font-family: sans-serif; +} + +.proctoring-blur-fallback +{ + filter: blur(6px); +} diff --git a/cis/testtool/frage.php b/cis/testtool/frage.php index c38229cdf..a5f4100c9 100644 --- a/cis/testtool/frage.php +++ b/cis/testtool/frage.php @@ -45,7 +45,7 @@ if (!$db = new basis_db()) $PHP_SELF=$_SERVER["PHP_SELF"]; // Start session -session_start(); +require_once './session_init.php'; // If language is changed by language select menu, reset language variables if (isset($_GET['sprache_user']) && !empty($_GET['sprache_user'])) @@ -182,6 +182,12 @@ echo ' if(!isset($_SESSION['pruefling_id'])) die($p->t('testtool/bitteZuerstAnmelden')); +if (!empty($_SESSION['externe_ueberwachung']) && isset($_SESSION['externe_ueberwachung_verified'])): ?> + + + +load($_SESSION['pruefling_id']); @@ -575,14 +581,14 @@ if($frage->frage_id!='') else $value=$p->t('testtool/blaettern').' >>'; - echo " $value"; + echo "$value"; } else { if(!$demo) { //Wenns der letzte Eintrag ist, wieder zum ersten springen - echo " ".$p->t('testtool/blaettern')." >>"; + echo "".$p->t('testtool/blaettern')." >>"; } } } diff --git a/cis/testtool/frage_externe_ueberwachung.js b/cis/testtool/frage_externe_ueberwachung.js new file mode 100644 index 000000000..31a7b414f --- /dev/null +++ b/cis/testtool/frage_externe_ueberwachung.js @@ -0,0 +1,53 @@ +(function () { + let ok = false; + let blocker; + + function showBlocker() { + blocker = document.getElementById("proctoringBlocker"); + + if (!blocker) + { + blocker = document.createElement("div"); + blocker.id = "proctoringBlocker"; + blocker.className = "proctoring-blocker"; + blocker.innerHTML = '
Loading...
'; + document.body.appendChild(blocker); + } + document.documentElement.classList.add("proctoring-blur-fallback"); + } + + function block() { + showBlocker(); + blocker.classList.remove("hidden"); + } + + function unblock() { + document.documentElement.classList.remove("proctoring-blur-fallback"); + if (!blocker) return; + blocker.classList.add("hidden"); + } + + const blockTimer = setTimeout(function () { + if (!ok) + block(); + }, 1500); + + window.addEventListener("message", function (e) { + const data = e.data || {}; + + if (data.type === "proctoringReady") + { + ok = true; + clearTimeout(blockTimer); + unblock(); + } + }); + + setTimeout(function () { + if (!ok) { + top.location.href = "resetconnection.php"; + } + }, 3000); +})(); + + diff --git a/cis/testtool/index.php b/cis/testtool/index.php index d235e6ce9..6f2cfac26 100644 --- a/cis/testtool/index.php +++ b/cis/testtool/index.php @@ -1,16 +1,79 @@ TestTool - FH Technikum Wien + + + + @@ -26,3 +89,4 @@ if(isset($_GET['prestudent']) && is_numeric($_GET['prestudent'])) + diff --git a/cis/testtool/login.php b/cis/testtool/login.php index 5a2ae0dea..cfc1ba63b 100644 --- a/cis/testtool/login.php +++ b/cis/testtool/login.php @@ -40,8 +40,7 @@ if (!$db = new basis_db()) die('Fehler beim Oeffnen der Datenbankverbindung'); // Start session -session_start(); - +require_once './session_init.php'; // Logout (triggered by logout button in menu.php) if (isset($_GET['logout']) && $_GET['logout'] == true) { @@ -173,6 +172,12 @@ if (isset($_REQUEST['prestudent'])) else $reload_menu = true; } + + if ($rt->externe_ueberwachung && defined('TESTTOOL_EXTERNE_UEBERWACHUNG_ALLOWED') && TESTTOOL_EXTERNE_UEBERWACHUNG_ALLOWED) + { + $_SESSION['externe_ueberwachung'] = true; + $_SESSION['externe_ueberwachung_verified'] = false; + } } $pruefling = new pruefling(); @@ -335,11 +340,26 @@ else } } -if ((isset($_SESSION['prestudent_id']) && !isset($_SESSION['pruefling_id']) && - !isset($_SESSION['confirmation_needed']) && !isset($_SESSION['confirmed_code'])) || - (isset($_SESSION['confirmation_needed']) && $_SESSION['confirmation_needed'] === true && - isset($_SESSION['confirmed_code']) && $_SESSION['confirmed_code'] === true && - isset($_SESSION['prestudent_id']) && !isset($_SESSION['pruefling_id']))) +if ( + ( + isset($_SESSION['prestudent_id']) && !isset($_SESSION['pruefling_id']) && + !isset($_SESSION['confirmation_needed']) && !isset($_SESSION['confirmed_code']) && + !isset($_SESSION['externe_ueberwachung']) && !isset($_SESSION['externe_ueberwachung_verified']) + ) + || + ( + isset($_SESSION['confirmation_needed']) && $_SESSION['confirmation_needed'] === true && + isset($_SESSION['confirmed_code']) && $_SESSION['confirmed_code'] === true && + isset($_SESSION['prestudent_id']) && !isset($_SESSION['pruefling_id']) + ) + || + ( + isset($_SESSION['externe_ueberwachung']) && $_SESSION['externe_ueberwachung'] === true && + isset($_SESSION['externe_ueberwachung_verified']) && $_SESSION['externe_ueberwachung_verified'] === true && + isset($_SESSION['prestudent_id']) && !isset($_SESSION['pruefling_id']) + ) + +) { $pruefling = new pruefling(); @@ -447,14 +467,6 @@ if (isset($_POST['save']) && isset($_SESSION['prestudent_id'])) { e.preventDefault(); }); - // If Browser is any other than Mozilla Firefox and the test includes any MathML, - // show message to use Mozilla Firefox - var ua = navigator.userAgent; - if ((ua.indexOf("Firefox") > -1) == false) - { - $("#alertmsgdiv").html("
BITTE VERWENDEN SIE DEN MOZILLA FIREFOX BROWSER!
(Manche Prüfungsfragen werden sonst nicht korrekt dargestellt.

PLEASE USE MOZILLA FIREFOX BROWSER!
(Otherwise some exam items will not be displayed correctly
"); - //alert('BITTE VERWENDEN SIE DEN MOZILLA FIREFOX BROWSER!\n(Manche Prüfungsfragen werden sonst nicht korrekt dargestellt.\n\nPLEASE USE MOZILLA FIREFOX BROWSER!\n(Ohterwise some exam items will not be displayed correctly.)'); - } }); top.location.href = 'resetconnection.php';"; + exit; +} +else if (isset($_SESSION['confirmation_needed']) && $_SESSION['confirmation_needed'] === true && isset($_SESSION['confirmed_code']) && $_SESSION['confirmed_code'] === false) { echo ' @@ -660,10 +678,11 @@ elseif (isset($prestudent_id)) else { // Letzten Status für des Prestudenten einholen - $ps_master = new Prestudent(); + $ps_master = new Prestudent($prestudent_id); $ps_master->getLastStatus($prestudent_id); $sto = new Studienordnung(); $sto->getStudienordnungFromStudienplan($ps_master->studienplan_id); + $stg = new Studiengang($ps_master->studiengang_kz); // Name des Studiengangs aus Studienordnung laden, ansonsten Fallback auf Studiengang $stg_name = $sto->studiengangbezeichnung; $stg_name_eng = $sto->studiengangbezeichnung_englisch; @@ -726,7 +745,7 @@ else // LOGIN Site (vor Login) echo ''; echo '
@@ -736,6 +755,12 @@ else // LOGIN Site (vor Login) '.$p->t('testtool/confirmationText').'

+ + '.$p->t('testtool/dsgvoConfirmText').' +

+ + '.$p->t('testtool/procotoringConfirmText').' +

diff --git a/cis/testtool/menu.php b/cis/testtool/menu.php index 7c8b12b9d..11e032f0b 100644 --- a/cis/testtool/menu.php +++ b/cis/testtool/menu.php @@ -34,7 +34,7 @@ if (!$db = new basis_db()) die('Fehler beim Oeffnen der Datenbankverbindung'); // Start session -session_start(); +require_once './session_init.php'; // If language is changed by language select menu, reset language and session variables if(isset($_GET['sprache_user']) && !empty($_GET['sprache_user'])) @@ -61,8 +61,12 @@ $p = new phrasen($sprache_user); db_add_param($_SESSION['studiengang_kz'])." LIMIT 1"; @@ -73,7 +77,7 @@ if (isset($_SESSION['pruefling_id'])) // Link zur Startseite echo ' - '.$p->t('testtool/startseite').' + '.$p->t('testtool/startseite').' '; // Link zur Einleitung @@ -83,7 +87,7 @@ if (isset($_SESSION['pruefling_id'])) { echo ' - '.$p->t('testtool/einleitung').' + '.$p->t('testtool/einleitung').' '; } @@ -379,10 +383,13 @@ if (isset($_SESSION['pruefling_id'])) } } + echo ' + - '.$gebietbezeichnung.' + '.$gebietbezeichnung.' + '; @@ -401,7 +408,7 @@ if (isset($_SESSION['pruefling_id'])) // Link zum Logout echo ' - Logout + Logout '; echo ''; @@ -425,28 +432,6 @@ else e.preventDefault(); }); }); - // Get users Browser - var ua = navigator.userAgent; - - // If Browser is any other than Mozilla Firefox and the test includes any MathML, - // show message to use Mozilla Firefox - if ((ua.indexOf("Firefox") > -1) == false) - { - let hasMathML = ""; - let userLang = ""; - if (hasMathML == true) - { - if (userLang == 'German') - { - alert('BITTE VERWENDEN SIE DEN MOZILLA FIREFOX BROWSER!\n(Manche Prüfungsfragen werden sonst nicht korrekt dargestellt.)'); - } - else if(userLang == 'English') - { - alert('PLEASE USE MOZILLA FIREFOX BROWSER!\n(Ohterwise some exam items will not be displayed correctly.)'); - } - } - } - // Error massage if check_gebiet function returns false $(function() { var invalid_gebiete = ""; @@ -461,5 +446,22 @@ else ''); } }); + + function loadContent(url) + { + if (parent && typeof parent.loadInContent === 'function') + { + parent.loadInContent(url); + return false; + } + + let frame = parent?.frames?.["content"]; + if (frame) + { + frame.location.href = url; + return false; + } + } + diff --git a/cis/testtool/resetconnection.php b/cis/testtool/resetconnection.php new file mode 100644 index 000000000..ab2806a1f --- /dev/null +++ b/cis/testtool/resetconnection.php @@ -0,0 +1,18 @@ +start($_SESSION['prestudent_id'], $_SESSION['reihungstestID'], $_SESSION['sprache']); + $urlSafe = htmlspecialchars($url, ENT_QUOTES); + header("Location: $urlSafe"); + $_SESSION['externe_ueberwachung_verified'] = true; +} \ No newline at end of file diff --git a/cis/testtool/session_init.php b/cis/testtool/session_init.php new file mode 100644 index 000000000..fd7f0b5f3 --- /dev/null +++ b/cis/testtool/session_init.php @@ -0,0 +1,11 @@ +=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": ">=4.8 <=9" + }, + "suggest": { + "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" + }, + "type": "library", + "autoload": { + "psr-4": { + "Firebase\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Neuman Vong", + "email": "neuman+pear@twilio.com", + "role": "Developer" + }, + { + "name": "Anant Narayanan", + "email": "anant@php.net", + "role": "Developer" + } + ], + "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", + "homepage": "https://github.com/firebase/php-jwt", + "keywords": [ + "jwt", + "php" + ], + "support": { + "issues": "https://github.com/firebase/php-jwt/issues", + "source": "https://github.com/firebase/php-jwt/tree/v6.0.0" + }, + "time": "2022-01-24T15:18:34+00:00" + }, { "name": "fortawesome/font-awesome4", "version": "4.7.0", diff --git a/config/cis.config-default.inc.php b/config/cis.config-default.inc.php index 9985a90d4..5dba1cea8 100644 --- a/config/cis.config-default.inc.php +++ b/config/cis.config-default.inc.php @@ -301,4 +301,17 @@ define ('DEFAULT_ECHTER_DIENSTVERTRAG',[103,111]); // Weiterleiten zu CIS neu (wenn Rechte vorhanden) define('CIS_REDIRECT_TO_CIS4', false); + +//Externe Ueberwachung +define('EXTERNE_UEBERWACHUNG_PROTOCOL_URL', 'https://example.com'); +define('EXTERNE_UEBERWACHUNG_SECRET_KEY', null); +define('EXTERNE_UEBERWACHUNG_INTEGRATION_NAME', 'example'); +define('EXTERNE_UEBERWACHUNG_SESSION_URL', 'https://example.com'); +define('EXTERNE_UEBERWACHUNG_TRIAL_TEST', false); +define('EXTERNE_UEBERWACHUNG_EXAM_PARAMS', []); +define('EXTERNE_UEBERWACHUNG_EXAM_RULES', []); +define('EXTERNE_UEBERWACHUNG_EXAM_SCORE', []); +define('EXTERNE_UEBERWACHUNG_EXAM_WARNINGS', []); + + ?> diff --git a/config/global.config-default.inc.php b/config/global.config-default.inc.php index f24a302cc..c43cb38d1 100644 --- a/config/global.config-default.inc.php +++ b/config/global.config-default.inc.php @@ -28,11 +28,15 @@ define('CIS_LEHRVERANSTALTUNG_LEHRFACH_ANZEIGEN',false); define('CIS_LEHRVERANSTALTUNG_GESAMTNOTE_ANZEIGEN', true); define('CIS_LEHRVERANSTALTUNG_ANRECHNUNG_ANZEIGEN', true); define('CIS_LEHRVERANSTALTUNG_ANWESENHEIT_ANZEIGEN', true); +define('CIS_LEHRVERANSTALTUNG_EVALUIERUNG_ANZEIGEN', true); // Wenn gesetzt, werden die Digitale Anwesenheit-Icons nur fuer diese Studiengaenge angezeigt, sonst für alle // define('CIS_LEHRVERANSTALTUNG_ANWESENHEIT_ANZEIGEN_STG', serialize(array('257'))); // define('CIS_LEHRVERANSTALTUNG_ANWESENHEIT_ANZEIGEN_LVA', serialize(array('39455','39481','39480','41906','41905','41904','39459','39512','39454','39482','42230','42231','39458','41921','41922','39457','42896'))); +// Wenn gesetzt, werden die LV-Evaluierung-Icons nur für diese Studiengaenge angezeigt, sonst alle +define('CIS_EVALUIERUNG_ANZEIGEN_STG', serialize((array('335', '585', '914', '298')))); // BIW, MAI, BUB, MIO + // Im CIS Menue Links bei Modulen anzeigen wenn Lehrauftrag define('CIS_LEHRVERANSTALTUNG_MODULE_LINK',true); @@ -360,4 +364,11 @@ define('SANCHO_MAIL_HEADER_IMG', 'sancho_header_DEFAULT.jpg'); // footer image for eigene Mails define('SANCHO_MAIL_FOOTER_IMG', 'sancho_footer_DEFAULT.jpg'); + +// Gibt an, ob in der StudVW der Status vorgerueckt werden kann +define('STATUS_VORRUECKEN_ANZEIGEN', true); + +//externe Ueberwachung im Testtool erlauben +define('TESTTOOL_EXTERNE_UEBERWACHUNG_ALLOWED', false); + ?> diff --git a/content/statistik/notenspiegel.php b/content/statistik/notenspiegel.php index 1a7651296..0901b834f 100644 --- a/content/statistik/notenspiegel.php +++ b/content/statistik/notenspiegel.php @@ -62,6 +62,11 @@ if(!$rechte->isBerechtigt('student/noten',$studiengang_kz, 's')) $semester = isset($_GET['semester'])?$_GET['semester']:''; $typ = isset($_GET['typ'])?$_GET['typ']:''; +if(isset($_GET['studiensemester']) && preg_match('/[WS]S[0-9]{4}/', $_GET['studiensemester'])) +{ + $semester_aktuell = $_GET['studiensemester']; +} + if($semester=='') die('Bitte ein Semester auswaehlen'); diff --git a/content/statistik/notenspiegel_erweitert.php b/content/statistik/notenspiegel_erweitert.php index 2849a1895..67097ed22 100644 --- a/content/statistik/notenspiegel_erweitert.php +++ b/content/statistik/notenspiegel_erweitert.php @@ -64,6 +64,11 @@ if (!$rechte->isBerechtigt('student/noten', $studiengang_kz, 's')) $semester = isset($_GET['semester']) ? $_GET['semester'] : ''; $typ = isset($_GET['typ']) ? $_GET['typ'] : ''; +if(isset($_GET['studiensemester']) && preg_match('/[WS]S[0-9]{4}/', $_GET['studiensemester'])) +{ + $semester_aktuell = $_GET['studiensemester']; +} + if ($semester == '') die('Bitte ein Semester auswaehlen'); diff --git a/include/File/CSV.php b/include/File/CSV.php index c4c4d44ad..ea67181f1 100644 --- a/include/File/CSV.php +++ b/include/File/CSV.php @@ -178,7 +178,7 @@ class File_CSV return $field; } - if ($quote && $field{0} == $quote && $field{strlen($field)-1} == $quote) { + if ($quote && $field[0] == $quote && $field[strlen($field) - 1] == $quote) { return substr($field, 1, -1); } return $field; @@ -230,7 +230,7 @@ class File_CSV } elseif ($c == "\n" || $c == "\r") { $sub = ($prev == "\r") ? 2 : 1; if ((strlen($buff) >= $sub) && - ($buff{strlen($buff) - $sub} == $quote)) + ($buff[strlen($buff) - $sub] == $quote)) { $in_quote = false; } @@ -312,9 +312,9 @@ class File_CSV $last =& $fields[count($fields) - 1]; // Fallback to read the line with readQuoted when guess // that the simple explode won't work right - if (($last{strlen($last) - 1} == "\n" - && $last{0} == $conf['quote'] - && $last{strlen(rtrim($last)) - 1} != $conf['quote']) + if (($last[strlen($last) - 1] == "\n" + && $last[0] == $conf['quote'] + && $last[strlen(rtrim($last)) - 1] != $conf['quote']) || (count($fields) != $conf['fields']) // XXX perhaps there is a separator inside a quoted field @@ -511,4 +511,4 @@ class File_CSV return true; } } -?> \ No newline at end of file +?> diff --git a/include/File/Util.php b/include/File/Util.php index 941c61441..5474bc2a7 100644 --- a/include/File/Util.php +++ b/include/File/Util.php @@ -96,7 +96,7 @@ class File_Util { if (File_Util::isAbsolute($path)) { if (FILE_WIN32) { - return substr($path, $path{3} == '\\' ? 4 : 3); + return substr($path, $path[3] == '\\' ? 4 : 3); } return ltrim($path, '/'); } @@ -182,7 +182,7 @@ class File_Util if (FILE_WIN32) { return preg_match('/^[a-zA-Z]:(\\\|\/)/', $path); } - return ($path{0} == '/') || ($path{0} == '~'); + return ($path[0] == '/') || ($path[0] == '~'); } /** @@ -244,11 +244,11 @@ class File_Util } else { $cwd = getcwd(); $drive = substr($cwd, 0, 2); - if ($path{0} !== $separator{0}) { + if ($path[0] !== $separator[0]) { $path = substr($cwd, 3) . $separator . $path; } } - } elseif ($path{0} !== $separator) { + } elseif ($path[0] !== $separator) { $path = getcwd() . $separator . $path; } @@ -323,7 +323,7 @@ class File_Util $entries = array(); for ($dir = dir($path); false !== $entry = $dir->read(); ) { - if ($list & FILE_LIST_DOTS || $entry{0} !== '.') { + if ($list & FILE_LIST_DOTS || $entry[0] !== '.') { $isRef = ($entry === '.' || $entry === '..'); $isDir = $isRef || is_dir($path .'/'. $entry); if ( ((!$isDir && $list & FILE_LIST_FILES) || diff --git a/include/anwesenheit.class.php b/include/anwesenheit.class.php index 2b8389c79..9493a3d4b 100644 --- a/include/anwesenheit.class.php +++ b/include/anwesenheit.class.php @@ -479,91 +479,182 @@ class anwesenheit extends basis_db */ public function loadAnwesenheitStudiensemester($studiensemester_kurzbz, $student_uid=null, $lehrveranstaltung_id=null) { - $qry = "SELECT - lehrveranstaltung_id, vorname, nachname, wahlname, student_uid as uid, bezeichnung, - gesamt as gesamtstunden, anwesend, nichtanwesend, trunc(100-(nichtanwesend/gesamt)*100,2) as prozent - FROM - ( - SELECT - vorname, nachname, wahlname, lehrveranstaltung_id, bezeichnung, gruppe, student_uid, - count(stundenplan_id) as gesamt, - case when anwesend.summe is null then 0 else anwesend.summe end as anwesend, - case when nichtanwesend.summe is null then 0 else nichtanwesend.summe end as nichtanwesend + $qry = "SELECT + lehrveranstaltung_id, + vorname, + nachname, + wahlname, + student_uid AS uid, + bezeichnung, + gesamt AS gesamtstunden, + anwesend, + nichtanwesend, + CASE WHEN gesamt = 0 THEN 100.00 ELSE trunc(100-(nichtanwesend/(gesamt))*100,2) END AS prozent + + FROM( + SELECT + vorname, + nachname, + wahlname, + lehrveranstaltung_id, + bezeichnung, + student_uid, + --COUNT(stundenplan_id) AS gesamts, + COALESCE(anwesend.summe, 0) + COALESCE(nichtanwesend.summe, 0) AS gesamt, + COALESCE(anwesend.summe, 0) AS anwesend, + COALESCE(nichtanwesend.summe, 0) AS nichtanwesend + FROM ( - SELECT - sum(stundenplan_id) as stundenplan_id, datum, stunde, lehrveranstaltung_id, - bezeichnung, studiensemester_kurzbz, studiengang_kz, - TRIM( - CASE WHEN stp.gruppe_kurzbz is not null then stp.gruppe_kurzbz - else stp.semester||(case when verband is null then '' else stp.verband end)||(case when stp.gruppe is null then '' else stp.gruppe end) end) as gruppe + SELECT + SUM(stundenplan_id) AS stundenplan_id, + datum, + stunde, + lehrveranstaltung_id, + bezeichnung, + studiensemester_kurzbz, + studiengang_kz + FROM lehre.tbl_lehrveranstaltung lv - JOIN lehre.tbl_lehreinheit le using (lehrveranstaltung_id) - JOIN lehre.tbl_stundenplan stp using (lehreinheit_id,studiengang_kz) + JOIN + lehre.tbl_lehreinheit le USING (lehrveranstaltung_id) + JOIN + lehre.tbl_stundenplan stp USING (lehreinheit_id,studiengang_kz) + WHERE studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)." - AND (titel not like '%Nebenprüfung%' OR titel is null) - - group by datum, stunde, lehrveranstaltung_id, bezeichnung, studiensemester_kurzbz, studiengang_kz, stp.gruppe_kurzbz, stp.semester, stp.verband, stp.gruppe + AND (titel NOT LIKE '%Nebenprüfung%' OR titel IS NULL) + + GROUP BY + datum, + stunde, + lehrveranstaltung_id, + bezeichnung, + studiensemester_kurzbz, + studiengang_kz, + stp.gruppe_kurzbz, + stp.semester, + stp.verband, + stp.gruppe )x JOIN ( - SELECT semester::text as gruppe, public.tbl_studentlehrverband.studiensemester_kurzbz, student_uid, studiengang_kz - FROM - public.tbl_studentlehrverband - WHERE studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)." - - UNION - - SELECT semester||verband as gruppe, public.tbl_studentlehrverband.studiensemester_kurzbz, student_uid, studiengang_kz - FROM - public.tbl_studentlehrverband - WHERE - studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)." - - UNION - - SELECT semester||verband||gruppe as gruppe, public.tbl_studentlehrverband.studiensemester_kurzbz, student_uid, studiengang_kz - FROM - public.tbl_studentlehrverband - WHERE - studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)." - - UNION - - SELECT gruppe_kurzbz as gruppe, public.tbl_benutzergruppe.studiensemester_kurzbz, uid as student_uid, studiengang_kz - FROM - public.tbl_benutzergruppe - JOIN - public.tbl_gruppe using (gruppe_kurzbz) - WHERE studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)." - - )a using (gruppe, studiensemester_kurzbz, studiengang_kz) - JOIN public.tbl_benutzer b on b.uid = student_uid - JOIN public.tbl_person p using(person_id) - LEFT JOIN( SELECT - lehrveranstaltung_id, studiensemester_kurzbz, uid as student_uid, sum(einheiten) as summe - FROM - campus.tbl_anwesenheit a - JOIN lehre.tbl_lehreinheit le using (lehreinheit_id) - JOIN lehre.tbl_lehrveranstaltung lv using (lehrveranstaltung_id) - WHERE - anwesend = true AND studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)." + le.lehrveranstaltung_id, + slv.student_uid, + le.studiensemester_kurzbz, + st.prestudent_id + + FROM + public.tbl_studentlehrverband slv + JOIN + lehre.tbl_lehreinheitgruppe leg + ON slv.studiengang_kz = leg.studiengang_kz + AND slv.semester = leg.semester + AND ( + NULLIF(btrim(leg.verband::text), '') IS NULL + OR NULLIF(btrim(slv.verband::text), '') = NULLIF(btrim(leg.verband::text), '') + ) + AND ( + NULLIF(btrim(leg.gruppe::text), '') IS NULL + OR NULLIF(btrim(slv.gruppe::text), '') = NULLIF(btrim(leg.gruppe::text), '') + ) + JOIN + lehre.tbl_lehreinheit le USING (lehreinheit_id, studiensemester_kurzbz) + JOIN + public.tbl_student st USING(student_uid) + + WHERE + leg.gruppe_kurzbz IS NULL + AND le.studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)." + GROUP BY - lehrveranstaltung_id, bezeichnung, uid, studiensemester_kurzbz - )anwesend using(lehrveranstaltung_id, student_uid, studiensemester_kurzbz) + le.lehrveranstaltung_id, + slv.student_uid, + le.studiensemester_kurzbz, + st.prestudent_id + + UNION + + SELECT + le.lehrveranstaltung_id, + bg.uid AS student_uid, + bg.studiensemester_kurzbz, + st.prestudent_id + + FROM + public.tbl_benutzergruppe bg + JOIN + lehre.tbl_lehreinheitgruppe leg USING (gruppe_kurzbz) + JOIN + lehre.tbl_lehreinheit le USING(lehreinheit_id, studiensemester_kurzbz) + JOIN + public.tbl_student st ON bg.uid = st.student_uid + + WHERE + bg.studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)." + + GROUP BY + le.lehrveranstaltung_id, + bg.uid, + bg.studiensemester_kurzbz, + st.prestudent_id + + )a USING (lehrveranstaltung_id, studiensemester_kurzbz) + JOIN + public.tbl_benutzer b on b.uid = student_uid + JOIN + public.tbl_person p using(person_id) LEFT JOIN( - SELECT lehrveranstaltung_id, studiensemester_kurzbz, uid as student_uid, sum(einheiten) as summe + SELECT + lehrveranstaltung_id, + studiensemester_kurzbz, + uid AS student_uid, + SUM(einheiten) AS summe + FROM campus.tbl_anwesenheit a - JOIN lehre.tbl_lehreinheit le using (lehreinheit_id) - JOIN lehre.tbl_lehrveranstaltung lv using (lehrveranstaltung_id) + JOIN + lehre.tbl_lehreinheit le USING(lehreinheit_id) + JOIN + lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id) + WHERE - anwesend = false AND studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)." + anwesend = true + AND studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)." + GROUP BY - lehrveranstaltung_id, bezeichnung, uid, studiensemester_kurzbz - )nichtanwesend using(lehrveranstaltung_id, student_uid, studiensemester_kurzbz) + lehrveranstaltung_id, + bezeichnung, + uid, + studiensemester_kurzbz + + )anwesend USING(lehrveranstaltung_id, student_uid, studiensemester_kurzbz) + LEFT JOIN( + SELECT + lehrveranstaltung_id, + studiensemester_kurzbz, + uid AS student_uid, + SUM(einheiten) AS summe + + FROM + campus.tbl_anwesenheit a + JOIN + lehre.tbl_lehreinheit le USING (lehreinheit_id) + JOIN + lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id) + + WHERE + anwesend = false + AND studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)." + + GROUP BY + lehrveranstaltung_id, + bezeichnung, + uid, + studiensemester_kurzbz + )nichtanwesend USING(lehrveranstaltung_id, student_uid, studiensemester_kurzbz) + WHERE lehrveranstaltung_id > 0 "; @@ -573,8 +664,15 @@ class anwesenheit extends basis_db if(!is_null($lehrveranstaltung_id)) $qry.=" AND lehrveranstaltung_id=".$this->db_add_param($lehrveranstaltung_id); - $qry.="group by - vorname, nachname, wahlname, lehrveranstaltung_id, bezeichnung, gruppe, student_uid, anwesend.summe, nichtanwesend.summe + $qry.=" GROUP BY + vorname, + nachname, + wahlname, + lehrveranstaltung_id, + bezeichnung, + student_uid, + anwesend.summe, + nichtanwesend.summe )m"; if($lehrveranstaltung_id != '') diff --git a/include/externe_ueberwachung.class.php b/include/externe_ueberwachung.class.php new file mode 100644 index 000000000..17343669b --- /dev/null +++ b/include/externe_ueberwachung.class.php @@ -0,0 +1,221 @@ +getSessionByPrestudent($prestudent_id); + return $this->getSessionStatus($session_id); + } + public function start($prestudent_id, $reihungstest_id, $sprache) + { + $session_id = $this->getSessionByPrestudent($prestudent_id); + + if (!$session_id) + { + $session_id = $this->createSession($prestudent_id); + } + else + { + $status = $this->getSessionStatus($session_id); + + if (in_array($status, array('late_to_start', 'finished'))) + { + $session_id = $this->createSession($prestudent_id); + } + } + + $payload = $this->getPayload($session_id, $prestudent_id, $reihungstest_id, $sprache); + return $this->getStartUrl($payload); + } + + + private function createSession($prestudent_id) + { + if (is_null($prestudent_id)) + { + $this->errormsg = 'Falsche Parameterübergabe'; + return false; + } + + $uuid = $this->genereateUUID(); + + $qry = "INSERT INTO testtool.tbl_externe_ueberwachung (prestudent_id, session_id) + VALUES (". + $this->db_add_param($prestudent_id).",". + $this->db_add_param($uuid).")"; + + if($this->db_query($qry)) + { + return $uuid; + } + else + { + $this->errormsg = 'Fehler beim Speichern der Antwort'; + return false; + } + } + public function getSessionByPrestudent($prestudent_id) + { + if (is_null($prestudent_id)) + { + $this->errormsg = 'Falsche Parameterübergabe'; + return false; + } + + $qry = "SELECT session_id + FROM testtool.tbl_externe_ueberwachung + WHERE prestudent_id = ".$this->db_add_param($prestudent_id, FHC_INTEGER) . " + ORDER BY insertamum DESC + LIMIT 1"; + + if($result = $this->db_query($qry)) + { + if ($row = $this->db_fetch_object($result)) + { + return $row->session_id; + } + else + { + $this->errormsg = 'Daten konnten nicht geladen werden'; + return false; + } + } + else + { + $this->errormsg = 'Fehler bei einer Abfrage'; + return false; + } + } + + public function getSessionStatus($session_id) + { + $payload = $this->getSessionPayload($session_id); + $jwt = $this->createToken($payload); + + $url = $this->getSessionUrl($session_id); + + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_HTTPHEADER, [ + "Authorization: JWT {$jwt}", + "Content-Type: application/json", + ]); + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET'); + + $response = curl_exec($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + + curl_close($ch); + + $data = json_decode($response, true); + return isset($data['status']) ? $data['status'] : false; + } + + private function getSessionPayload($session_id) + { + return [ + "session_id" => $session_id, + "iat" => time(), + "exp" => time() + 120, + ]; + } + + private function getPayload($session_id, $prestudent_id, $reihungstest_id, $sprache) + { + $prestudent = new prestudent($prestudent_id); + $person = new Person($prestudent->person_id); + + $reihungstest = new Reihungstest($reihungstest_id); + + $datetime = new DateTime(); + $today = $datetime->format('Y-m-d'); + + $payload = [ + "userId" => $prestudent_id, + "lastName" => $person->nachname, + "firstName" => $person->vorname, + "language" => $sprache === 'German' ? 'de' : 'en', + "accountName" => "technikum_wien", + "accountId" => "technikum_wien", + "examId" => $reihungstest_id . '_' . $today, + "examName" => !is_null(trim($reihungstest->anmerkung)) ? ($reihungstest->anmerkung . '_' . $today) : ($reihungstest_id . '_' . $today), + "duration" => 1440, + "schedule" => false, + "trial" => EXTERNE_UEBERWACHUNG_TRIAL_TEST, + "proctoring" => "offline", + "startDate" => $reihungstest->datum . 'T00:00:00Z', + "endDate" => $reihungstest->datum . 'T23:59:59Z', + "sessionId" => $session_id, + "sessionUrl" => EXTERNE_UEBERWACHUNG_SESSION_URL + ]; + + if (defined('EXTERNE_UEBERWACHUNG_EXAM_PARAMS')) + { + $payload = array_merge($payload, EXTERNE_UEBERWACHUNG_EXAM_PARAMS); + } + + if (defined('EXTERNE_UEBERWACHUNG_EXAM_WARNINGS')) + { + $payload['visibleWarnings'] = EXTERNE_UEBERWACHUNG_EXAM_WARNINGS; + } + + if (defined('EXTERNE_UEBERWACHUNG_EXAM_RULES')) + { + $payload['rules'] = EXTERNE_UEBERWACHUNG_EXAM_RULES; + } + + if (defined('EXTERNE_UEBERWACHUNG_EXAM_SCORE')) + { + $payload['scoreConfig'] = EXTERNE_UEBERWACHUNG_EXAM_SCORE; + } + + return $payload; + } + + private function getSessionUrl($session_id) + { + return EXTERNE_UEBERWACHUNG_PROTOCOL_URL . "/api/v2/integration/simple/". EXTERNE_UEBERWACHUNG_INTEGRATION_NAME . "/sessions/". urlencode($session_id) ."/status/"; + } + + private function getStartUrl($payload) + { + $token = $this->createToken($payload); + $query = http_build_query(['token' => $token]); + + return EXTERNE_UEBERWACHUNG_PROTOCOL_URL . '/integration/simple/'. EXTERNE_UEBERWACHUNG_INTEGRATION_NAME .'/start?' . $query; + } + + private function createToken($payload) + { + return JWT::encode($payload, EXTERNE_UEBERWACHUNG_SECRET_KEY, 'HS256'); + } + + private function genereateUUID() + { + $data = openssl_random_pseudo_bytes(16); + + $data[6] = chr(ord($data[6]) & 0x0f | 0x40); + $data[8] = chr(ord($data[8]) & 0x3f | 0x80); + + return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4)); + } +} + +?> + + + diff --git a/include/filter.class.php b/include/filter.class.php index c3d1d6ac1..7100e6562 100644 --- a/include/filter.class.php +++ b/include/filter.class.php @@ -240,7 +240,7 @@ class filter extends basis_db { //$value->value = preg_replace('/(.*?)selected=.selected./', '$1', $value->value); //$value->value = preg_replace('/(.*?)\s*[selected=?selected?]/', '$1', $value->value); - //$value->value = preg_replace('/(.*?)\s*selected="selected"\s*/', '${1}', $value->value); + //$value->value = preg_replace('/(.*?)\s*selected="selected"\s*/', '$[1]', $value->value); //$value->value = preg_replace('/^\s*selected=.*?selected.*?\s*/', ' ', $value->value); //$value->value = str_replace('selected=', '', $value->value); diff --git a/include/gebiet.class.php b/include/gebiet.class.php index a4df72338..fd2bfd198 100644 --- a/include/gebiet.class.php +++ b/include/gebiet.class.php @@ -345,6 +345,7 @@ class gebiet extends basis_db } //Pruefen ob jede Fragen mindestens 2 Vorschlaege hat + //Angepasst am 28.01.2026 auf ein Warning. $qry = "SELECT frage_id, nummer FROM testtool.tbl_frage WHERE (SELECT count(*) as anzahl FROM testtool.tbl_vorschlag WHERE frage_id=tbl_frage.frage_id)<2 AND gebiet_id=".$this->db_add_param($gebiet_id, FHC_INTEGER)." AND NOT demo;"; @@ -352,7 +353,7 @@ class gebiet extends basis_db { while($row = $this->db_fetch_object()) { - $this->errormsg .= "Frage Nummer $row->nummer (ID: $row->frage_id) hat weniger als 2 Vorschlaege.\n"; + $this->warningmsg .= "Frage Nummer $row->nummer (ID: $row->frage_id) hat weniger als 2 Vorschlaege.\n"; } } @@ -448,6 +449,52 @@ class gebiet extends basis_db } } + //Pruefen ob es leere Fragen (ohne Text, Bild oder Audio) gibt + $qry = "SELECT + fr.frage_id, + fr.nummer, + fs.sprache + FROM + testtool.tbl_frage fr + JOIN testtool.tbl_frage_sprache fs + USING (frage_id) + WHERE + (fs.text IS NULL + OR fs.text = '') + AND fs.bild IS NULL + AND fs.audio IS NULL + AND demo = false + AND gebiet_id=".$this->db_add_param($gebiet_id, FHC_INTEGER)." + AND EXISTS ( + SELECT + 1 + FROM + testtool.tbl_frage fr2 + JOIN testtool.tbl_frage_sprache fs2 + USING (frage_id) + WHERE + fs2.sprache = fs.sprache + AND fr2.gebiet_id = fr.gebiet_id + AND fr2.frage_id != fr.frage_id + AND ( + (fs2.text IS NOT NULL + AND fs2.text != '') + OR fs2.bild IS NOT NULL + OR fs2.audio IS NOT NULL + ) + AND demo = false + ) + ORDER BY + fs.sprache, + fr.nummer;"; + if($this->db_query($qry)) + { + while($row = $this->db_fetch_object()) + { + $this->warningmsg .= "Frage Nummer $row->nummer (ID: $row->frage_id), Sprache $row->sprache hat keinen Text, Bild oder Audio.\n"; + } + } + if($this->errormsg=='') return true; else diff --git a/include/lehrveranstaltung.class.php b/include/lehrveranstaltung.class.php index 26f846f8e..cc89556c7 100644 --- a/include/lehrveranstaltung.class.php +++ b/include/lehrveranstaltung.class.php @@ -70,6 +70,7 @@ class lehrveranstaltung extends basis_db public $farbe; public $lehrauftrag=true; public $lehrveranstaltung_template_id; // integer + public $evaluierung=true; // boolean public $studienplan_lehrveranstaltung_id; @@ -170,6 +171,7 @@ class lehrveranstaltung extends basis_db $this->benotung = $this->db_parse_bool($row->benotung); $this->lvinfo = $this->db_parse_bool($row->lvinfo); $this->lehrauftrag = $this->db_parse_bool($row->lehrauftrag); + $this->evaluierung = $this->db_parse_bool($row->evaluierung); // FIXME: LV-Bezeichnung richtig mehrsprachig machen // Zwischenzeitlich 'Italian' zum bezeichnung_arr dazugegeben @@ -244,6 +246,7 @@ class lehrveranstaltung extends basis_db $lv_obj->benotung = $this->db_parse_bool($row->benotung); $lv_obj->lvinfo = $this->db_parse_bool($row->lvinfo); $lv_obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag); + $lv_obj->evaluierung = $this->db_parse_bool($row->evaluierung); $lv_obj->bezeichnung_arr['German'] = $row->bezeichnung; $lv_obj->bezeichnung_arr['English'] = $row->bezeichnung_english; @@ -394,6 +397,7 @@ class lehrveranstaltung extends basis_db $lv_obj->benotung = $this->db_parse_bool($row->benotung); $lv_obj->lvinfo = $this->db_parse_bool($row->lvinfo); $lv_obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag); + $lv_obj->evaluierung = $this->db_parse_bool($row->evaluierung); $lv_obj->bezeichnung_arr['German'] = $row->bezeichnung; $lv_obj->bezeichnung_arr['Italian'] = $row->bezeichnung; @@ -524,6 +528,7 @@ class lehrveranstaltung extends basis_db $lv_obj->benotung = $this->db_parse_bool($row->benotung); $lv_obj->lvinfo = $this->db_parse_bool($row->lvinfo); $lv_obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag); + $lv_obj->evaluierung = $this->db_parse_bool($row->evaluierung); $lv_obj->bezeichnung_arr['German'] = $row->bezeichnung; $lv_obj->bezeichnung_arr['English'] = $row->bezeichnung_english; @@ -607,6 +612,7 @@ class lehrveranstaltung extends basis_db $lv_obj->benotung = $this->db_parse_bool($row->benotung); $lv_obj->lvinfo = $this->db_parse_bool($row->lvinfo); $lv_obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag); + $lv_obj->evaluierung = $this->db_parse_bool($row->evaluierung); $lv_obj->bezeichnung_arr['German'] = $row->bezeichnung; $lv_obj->bezeichnung_arr['English'] = $row->bezeichnung_english; @@ -779,7 +785,7 @@ class lehrveranstaltung extends basis_db insertvon, planfaktor, planlektoren, planpersonalkosten, plankostenprolektor, updateamum, updatevon, sort, zeugnis, projektarbeit, sprache, koordinator, bezeichnung_english, orgform_kurzbz, incoming, lehrtyp_kurzbz, oe_kurzbz, raumtyp_kurzbz, anzahlsemester, semesterwochen, lvnr, semester_alternativ, farbe, lehrveranstaltung_template_id,sws,lvs,alvs,lvps,las,benotung,lvinfo, - lehrauftrag, lehrmodus_kurzbz) VALUES ('. + lehrauftrag, lehrmodus_kurzbz, evaluierung) VALUES ('. $this->db_add_param($this->studiengang_kz). ', '. $this->db_add_param($this->bezeichnung). ', '. $this->db_add_param($this->kurzbz). ', '. @@ -824,7 +830,8 @@ class lehrveranstaltung extends basis_db $this->db_add_param($this->benotung, FHC_BOOLEAN).','. $this->db_add_param($this->lvinfo, FHC_BOOLEAN).','. $this->db_add_param($this->lehrauftrag, FHC_BOOLEAN).','. - $this->db_add_param($this->lehrmodus_kurzbz) + $this->db_add_param($this->lehrmodus_kurzbz).','. + $this->db_add_param($this->evaluierung, FHC_BOOLEAN) .');'; } else @@ -880,7 +887,8 @@ class lehrveranstaltung extends basis_db 'las = '.$this->db_add_param($this->las).', '. 'benotung = '.$this->db_add_param($this->benotung, FHC_BOOLEAN).', '. 'lvinfo = '.$this->db_add_param($this->lvinfo, FHC_BOOLEAN).', '. - 'lehrauftrag = '.$this->db_add_param($this->lehrauftrag, FHC_BOOLEAN).' '. + 'lehrauftrag = '.$this->db_add_param($this->lehrauftrag, FHC_BOOLEAN).', '. + 'evaluierung = '.$this->db_add_param($this->evaluierung, FHC_BOOLEAN).' '. 'WHERE lehrveranstaltung_id = ' . $this->db_add_param($this->lehrveranstaltung_id, FHC_INTEGER, false) . ';'; } @@ -991,6 +999,7 @@ class lehrveranstaltung extends basis_db $lv_obj->benotung = $this->db_parse_bool($row->benotung); $lv_obj->lvinfo = $this->db_parse_bool($row->lvinfo); $lv_obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag); + $lv_obj->evaluierung = $this->db_parse_bool($row->evaluierung); $lv_obj->bezeichnung_arr['German'] = $row->bezeichnung; $lv_obj->bezeichnung_arr['English'] = $row->bezeichnung_english; @@ -1086,6 +1095,7 @@ class lehrveranstaltung extends basis_db $l->benotung = $this->db_parse_bool($row->benotung); $l->lvinfo = $this->db_parse_bool($row->lvinfo); $l->lehrauftrag = $this->db_parse_bool($row->lehrauftrag); + $l->evaluierung = $this->db_parse_bool($row->evaluierung); $l->bezeichnung_arr['German'] = $row->bezeichnung; $l->bezeichnung_arr['English'] = $row->bezeichnung_english; @@ -1170,6 +1180,7 @@ class lehrveranstaltung extends basis_db $lv_obj->benotung = $this->db_parse_bool($row->benotung); $lv_obj->lvinfo = $this->db_parse_bool($row->lvinfo); $lv_obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag); + $lv_obj->evaluierung = $this->db_parse_bool($row->evaluierung); $lv_obj->bezeichnung_arr['German'] = $row->bezeichnung; $lv_obj->bezeichnung_arr['English'] = $row->bezeichnung_english; @@ -1271,6 +1282,7 @@ class lehrveranstaltung extends basis_db $obj->benotung = $this->db_parse_bool($row->benotung); $obj->lvinfo = $this->db_parse_bool($row->lvinfo); $obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag); + $obj->evaluierung = $this->db_parse_bool($row->evaluierung); $obj->bezeichnung_arr['German'] = $row->bezeichnung; $obj->bezeichnung_arr['English'] = $row->bezeichnung_english; @@ -1396,6 +1408,7 @@ class lehrveranstaltung extends basis_db $obj->lvinfo =$this->db_parse_bool( $lv->lvinfo); $obj->zeugnis = $this->db_parse_bool($lv->zeugnis); $obj->lehrauftrag = $this->db_parse_bool($lv->lehrauftrag); + $obj->evaluierung = $this->db_parse_bool($lv->evaluierung); $values[] = $obj; @@ -1422,6 +1435,7 @@ class lehrveranstaltung extends basis_db $obj->lvinfo =$this->db_parse_bool( $this->lvinfo); $obj->zeugnis = $this->db_parse_bool($this->zeugnis); $obj->lehrauftrag = $this->db_parse_bool($this->lehrauftrag); + $obj->evaluierung = $this->db_parse_bool($this->evaluierung); $values[] = $obj; } @@ -1476,6 +1490,7 @@ class lehrveranstaltung extends basis_db $obj->export = $lv->export; $obj->genehmigung = $lv->genehmigung; $obj->lehrauftrag = $lv->lehrauftrag; + $obj->evaluierung = $lv->evaluierung; $obj->lehre = $lv->lehre; $obj->children = array(); if(count($lv->childs) > 0) @@ -1507,6 +1522,7 @@ class lehrveranstaltung extends basis_db $obj->zeugnis = $this->db_parse_bool($this->zeugnis); $obj->curriculum = $this->db_parse_bool($this->curriculum); $obj->lehrauftrag = $this->lehrauftrag; + $obj->evaluierung = $this->db_parse_bool($this->evaluierung); $values[] = $obj; } @@ -1613,6 +1629,7 @@ class lehrveranstaltung extends basis_db $lv_obj->benotung = $this->db_parse_bool($row->benotung); $lv_obj->lvinfo = $this->db_parse_bool($row->lvinfo); $lv_obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag); + $lv_obj->evaluierung = $this->db_parse_bool($row->evaluierung); $lv_obj->bezeichnung_arr['German'] = $row->bezeichnung; $lv_obj->bezeichnung_arr['English'] = $row->bezeichnung_english; @@ -1700,6 +1717,7 @@ class lehrveranstaltung extends basis_db $lv_obj->benotung = $this->db_parse_bool($row->benotung); $lv_obj->lvinfo = $this->db_parse_bool($row->lvinfo); $lv_obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag); + $lv_obj->evaluierung = $this->db_parse_bool($row->evaluierung); $lv_obj->bezeichnung_arr['German'] = $row->bezeichnung; $lv_obj->bezeichnung_arr['English'] = $row->bezeichnung_english; @@ -1873,6 +1891,7 @@ class lehrveranstaltung extends basis_db $lv_obj->benotung = $this->db_parse_bool($row->benotung); $lv_obj->lvinfo = $this->db_parse_bool($row->lvinfo); $lv_obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag); + $lv_obj->evaluierung = $this->db_parse_bool($row->evaluierung); $lv_obj->bezeichnung_arr['German'] = $row->bezeichnung; $lv_obj->bezeichnung_arr['English'] = $row->bezeichnung_english; @@ -2003,6 +2022,7 @@ class lehrveranstaltung extends basis_db $lv_obj->benotung = $this->db_parse_bool($row->benotung); $lv_obj->lvinfo = $this->db_parse_bool($row->lvinfo); $lv_obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag); + $lv_obj->evaluierung = $this->db_parse_bool($row->evaluierung); $lv_obj->studiengang_kurzbzlang = $row->studiengang_kurzbzlang; @@ -2131,6 +2151,7 @@ class lehrveranstaltung extends basis_db $lv_obj->benotung = $this->db_parse_bool($row->benotung); $lv_obj->lvinfo = $this->db_parse_bool($row->lvinfo); $lv_obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag); + $lv_obj->evaluierung = $this->db_parse_bool($row->evaluierung); $lv_obj->bezeichnung_arr['German'] = $row->bezeichnung; $lv_obj->bezeichnung_arr['English'] = $row->bezeichnung_english; @@ -2402,6 +2423,7 @@ class lehrveranstaltung extends basis_db $obj->benotung = $this->db_parse_bool($row->benotung); $obj->lvinfo = $this->db_parse_bool($row->lvinfo); $obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag); + $obj->evaluierung = $this->db_parse_bool($row->evaluierung); $obj->bezeichnung_arr['German'] = $row->bezeichnung; $obj->bezeichnung_arr['English'] = $row->bezeichnung_english; diff --git a/include/reihungstest.class.php b/include/reihungstest.class.php index df4134ebf..94d064c25 100644 --- a/include/reihungstest.class.php +++ b/include/reihungstest.class.php @@ -63,6 +63,7 @@ class reihungstest extends basis_db public $zugangs_ueberpruefung = false; //boolean public $zugangscode; //smallint + public $externe_ueberwachung = false; //boolean /** @@ -119,6 +120,7 @@ class reihungstest extends basis_db $this->aufnahmegruppe_kurzbz = $row->aufnahmegruppe_kurzbz; $this->zugangs_ueberpruefung = $this->db_parse_bool($row->zugangs_ueberpruefung); $this->zugangscode = $row->zugangscode; + $this->externe_ueberwachung = $this->db_parse_bool($row->externe_ueberwachung); return true; } @@ -234,7 +236,7 @@ class reihungstest extends basis_db $qry = 'BEGIN; INSERT INTO public.tbl_reihungstest (studiengang_kz, ort_kurzbz, anmerkung, datum, uhrzeit, insertamum, insertvon, updateamum, updatevon, max_teilnehmer, oeffentlich, freigeschaltet, - studiensemester_kurzbz, stufe, anmeldefrist, aufnahmegruppe_kurzbz, zugangs_ueberpruefung, zugangscode) VALUES('. + studiensemester_kurzbz, stufe, anmeldefrist, aufnahmegruppe_kurzbz, zugangs_ueberpruefung, zugangscode, externe_ueberwachung) VALUES('. $this->db_add_param($this->studiengang_kz, FHC_INTEGER).', '. $this->db_add_param($this->ort_kurzbz).', '. $this->db_add_param($this->anmerkung).', '. @@ -250,7 +252,8 @@ class reihungstest extends basis_db $this->db_add_param($this->anmeldefrist).','. $this->db_add_param($this->aufnahmegruppe_kurzbz). ',' . $this->db_add_param($this->zugangs_ueberpruefung, FHC_BOOLEAN).','. - $this->db_add_param($this->zugangscode) . ');'; + $this->db_add_param($this->zugangscode) . ','. + $this->db_add_param($this->externe_ueberwachung, FHC_BOOLEAN) . ');'; } else { @@ -270,7 +273,8 @@ class reihungstest extends basis_db 'anmeldefrist='.$this->db_add_param($this->anmeldefrist).', '. 'aufnahmegruppe_kurzbz='.$this->db_add_param($this->aufnahmegruppe_kurzbz).', '. 'zugangs_ueberpruefung='.$this->db_add_param($this->zugangs_ueberpruefung, FHC_BOOLEAN).', '. - 'zugangscode='.$this->db_add_param($this->zugangscode).' '. + 'zugangscode='.$this->db_add_param($this->zugangscode).', '. + 'externe_ueberwachung='.$this->db_add_param($this->externe_ueberwachung, FHC_BOOLEAN).' '. 'WHERE reihungstest_id='.$this->db_add_param($this->reihungstest_id, FHC_INTEGER, false).';'; } diff --git a/include/securimage/WavFile.php b/include/securimage/WavFile.php index 6d84fc725..d56dbd942 100644 --- a/include/securimage/WavFile.php +++ b/include/securimage/WavFile.php @@ -1532,7 +1532,7 @@ class WavFile } else { // replace for ($i = 0; $i < $sampleBytes; ++$i) { - $this->_samples{$offset + $i} = $sampleBinary{$i}; + $this->_samples[$offset + $i] = $sampleBinary[$i]; } } diff --git a/include/securimage/securimage.php b/include/securimage/securimage.php index 51d876672..820e8b92f 100644 --- a/include/securimage/securimage.php +++ b/include/securimage/securimage.php @@ -1435,7 +1435,7 @@ class Securimage $length = strlen($code['display']); for($i = 0; $i < $length; ++$i) { - $letter = $code['display']{$i}; + $letter = $code['display'][$i]; $letters[] = $letter; } } diff --git a/include/statistik.class.php b/include/statistik.class.php index fd48e7d28..364c6d1a0 100644 --- a/include/statistik.class.php +++ b/include/statistik.class.php @@ -513,6 +513,7 @@ class statistik extends basis_db $this->json=array(); $this->countRows=0; set_time_limit(600); + $parseHtml = (strpos($this->preferences, 'parseHTML: true') !== false); // In case a decryption function is used then perform password substitution $this->sql = $this->replaceSQLDecryptionPassword($this->sql); @@ -565,7 +566,13 @@ class statistik extends basis_db for($spalte=0;$spalte<$anzahl_spalten;$spalte++) { $name = $this->db_field_name($this->data,$spalte); - $this->html.= ''.$this->convert_html_chars($row->$name).''; + if ($parseHtml) { + // HTML direkt rendern + $this->html .= ''.($row->$name).''; + } else { + // wie bisher escapen + $this->html .= ''.$this->convert_html_chars($row->$name).''; + } // Umwandeln von Punkt in Komma bei Float-Werten if (is_numeric($row->$name)) { diff --git a/include/tw/cis_menu_lv.inc.php b/include/tw/cis_menu_lv.inc.php index 29ba54724..03ce016ca 100644 --- a/include/tw/cis_menu_lv.inc.php +++ b/include/tw/cis_menu_lv.inc.php @@ -500,6 +500,27 @@ if((!defined('CIS_LEHRVERANSTALTUNG_ANRECHNUNG_ANZEIGEN') || CIS_LEHRVERANSTALTU ); } +// LV-Evaluierung NEU +if(defined('CIS_LEHRVERANSTALTUNG_EVALUIERUNG_ANZEIGEN') + && CIS_LEHRVERANSTALTUNG_EVALUIERUNG_ANZEIGEN + && $angemeldet + && (!defined('CIS_EVALUIERUNG_ANZEIGEN_STG') || in_array($lv->studiengang_kz, unserialize(CIS_EVALUIERUNG_ANZEIGEN_STG))) + && ($rechte->isBerechtigt('extension/lvevaluierung_init'))) +{ + $text='(Pilotphase)'; + + $link= APP_ROOT. 'index.ci.php/extensions/FHC-Core-Evaluierung/Initiierung?lehrveranstaltung_id='. urlencode($lv->lehrveranstaltung_id).'&studiensemester_kurzbz='.urlencode($angezeigtes_stsem); + + $menu[]=array + ( + 'id'=>'extension_lvevaluierung_menu_initiierung', + 'position'=>'140', + 'name'=>$p->t('lvevaluierung/lvevaluierung'). ' - '. strtoupper($p->t('global/neu')), + 'icon'=>'../../../skin/images/button_lvevaluierung.png', + 'link'=> $link, + 'text'=>$text + ); +} //************* Menuepunkte anzeigen **************** diff --git a/locale/de-AT/testtool.php b/locale/de-AT/testtool.php index 6977704cc..33c46b0a7 100644 --- a/locale/de-AT/testtool.php +++ b/locale/de-AT/testtool.php @@ -53,6 +53,10 @@ $this->phrasen['testtool/fuerFolgendeStgAngemeldet']='Für folgende Studiengäng $this->phrasen['testtool/invalideGebiete']='Ein oder mehrere Fragengebiet/e inkorrekt!
Bitte melden Sie dies der Betreuungsperson.'; $this->phrasen['testtool/confirmationText']='Ich bestätige, den Online-Reihungstest persönlich, selbständig, ohne Hilfe einer zusätzlichen Person und ohne Hilfsmittel zu absolvieren.
I confirm that I will complete the online placement test personally, independently, without the help of an additional person and without any aids.
'; +$this->phrasen['testtool/dsgvoConfirmText']='Ich habe die Datenschutzerklärung gelesen.
+I have read the privacy policy.
'; +$this->phrasen['testtool/procotoringConfirmText']='Ich stimme der digitalen Beaufsichtigung beim Online-Reihungstest (Proctoring) zu.
+I agree to the digital supervision of the online placement test (proctoring).
'; $this->phrasen['testtool/loginNoetig']='Bitte beachten Sie, dass der Reihungstest erst unmittelbar vor Ihrem Reihungstesttermin von uns aktiviert wird.
Please note that the test will be activated by us immediately before your placement test date.'; $this->phrasen['testtool/start']='Reihungstest jetzt starten'; diff --git a/package.json b/package.json index 5c8cb24cf..d7e48cbb6 100644 --- a/package.json +++ b/package.json @@ -8,12 +8,6 @@ "watch": "rollup --watch -c" }, "dependencies": { - "@vuepic/vue-datepicker": "^7.2.0", - "axios": "^1.6.8", - "primevue": "^3.29.1", - "tabulator-tables": "^5.5.2", - "vue": "^3.3.8", - "vue-router": "^4.1.3" }, "devDependencies": { "@rollup/plugin-alias": "^5.1.0", @@ -24,7 +18,7 @@ "@rollup/plugin-replace": "^5.0.5", "@rollup/plugin-terser": "^0.4.4", "babel-plugin-transform-class-properties": "^6.24.1", - "glob": "^11.0.3", + "glob": "^13.0.6", "node-sass": "^9.0.0", "rollup": "^4.52.4", "rollup-plugin-postcss": "^4.0.2", diff --git a/public/.htaccess_sample b/public/.htaccess_sample new file mode 100644 index 000000000..e3f3485f6 --- /dev/null +++ b/public/.htaccess_sample @@ -0,0 +1,9 @@ + + RewriteEngine On + RewriteCond %{REQUEST_FILENAME} !-f + RewriteCond %{REQUEST_FILENAME} !-d + RewriteRule ^[0-9]{10}/(.*)$ $1 [L] + RewriteCond %{REQUEST_URI} ^(.*?)/public/index.ci.php/ + RewriteRule ^index.ci.php/(.*)$ %1/index.ci.php/$1 [R=303] + + diff --git a/public/css/Cis4/Cis.css b/public/css/Cis4/Cis.css index ff1b181dd..3056d36b6 100644 --- a/public/css/Cis4/Cis.css +++ b/public/css/Cis4/Cis.css @@ -854,4 +854,10 @@ html { #cis-main .modal-footer { background-color: var(--fhc-secondary); +} + +.bordered-modal { + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 0.5rem; + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.25); } \ No newline at end of file diff --git a/public/css/Studentenverwaltung.css b/public/css/Studentenverwaltung.css index 56e99b937..eb6becc15 100644 --- a/public/css/Studentenverwaltung.css +++ b/public/css/Studentenverwaltung.css @@ -11,6 +11,24 @@ html { font-size: .875em; } +html.fs_xx-small { + font-size: .5em; +} +html.fs_x-small { + font-size: .625em; +} +html.fs_small { + font-size: .75em; +} +html.fs_normal { + font-size: .875em; +} +html.fs_big { + font-size: 1em; +} +html.fs_huge { + font-size: 1.125em; +} #appMenu { width: 300px; @@ -43,6 +61,12 @@ html { flex: 1 1 auto; } +#nav-user-btn img { + object-fit: contain; + height: 2.5rem; + width: 2.5rem; +} + .tabulator-row.disabled.tabulator-row-odd .tabulator-cell { color: var(--gray-400); } @@ -160,4 +184,4 @@ html { .tiny-90 div.tox.tox-tinymce { height: 90% !important; -} \ No newline at end of file +} diff --git a/public/css/components/AppMenu.css b/public/css/components/AppMenu.css index b980c1efc..e142858f8 100644 --- a/public/css/components/AppMenu.css +++ b/public/css/components/AppMenu.css @@ -16,11 +16,15 @@ padding: .5rem 1rem; text-decoration: none; } +.fhc-app-menu li a.disabled { + --bs-link-opacity: .5; +} .fhc-app-menu li a.active, .fhc-app-menu li a:hover { --bs-link-color-rgb: var(--bs-link-hover-color-rgb); background: var(--surface-hover); } +.fhc-app-menu li a.disabled, .fhc-app-menu li a.active { pointer-events: none; } diff --git a/public/css/components/abgabetool/abgabe.css b/public/css/components/abgabetool/abgabe.css new file mode 100644 index 000000000..d70481805 --- /dev/null +++ b/public/css/components/abgabetool/abgabe.css @@ -0,0 +1,308 @@ +/* Base Header */ +.verpasst-header { + background-color: var(--fhc-red-70); + font-weight: 600; + border-radius: 6px; + padding: 0px 0px 0px 34px; + transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease; + box-shadow: 0 1px 2px rgba(0,0,0,0.08); +} + +/* Hover State */ +.verpasst-header:hover { + background-color: var(--fhc-red-60); + box-shadow: 0 2px 6px rgba(0,0,0,0.12); +} + +/* Active / Expanded State */ +.p-accordion-tab-active > .verpasst-header { + background-color: var(--fhc-red-50); + box-shadow: 0 2px 8px rgba(0,0,0,0.2); +} + +/* Hover State Active*/ +.p-accordion-tab-active > .verpasst-header:hover { + background-color: var(--fhc-red-60); + box-shadow: 0 2px 6px rgba(0,0,0,0.12); +} + +/* Base Header */ +.abzugeben-header { + background-color: var(--fhc-yellow-70); + font-weight: 600; + border-radius: 6px; + padding: 0px 0px 0px 34px; + transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease; + box-shadow: 0 1px 2px rgba(0,0,0,0.08); +} + +/* Hover State */ +.abzugeben-header:hover { + background-color: var(--fhc-yellow-60); + box-shadow: 0 2px 6px rgba(0,0,0,0.12); +} + +/* Active / Expanded State */ +.p-accordion-tab-active > .abzugeben-header { + background-color: var(--fhc-yellow-50); + box-shadow: 0 2px 8px rgba(0,0,0,0.2); +} + +/* Hover State Active*/ +.p-accordion-tab-active > .abzugeben-header:hover { + background-color: var(--fhc-yellow-60); + box-shadow: 0 2px 6px rgba(0,0,0,0.12); +} + +/* Base Header */ +.beurteilungerforderlich-header { + background-color: var(--fhc-orange-70); + font-weight: 600; + border-radius: 6px; + padding: 0px 0px 0px 34px; + transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease; + box-shadow: 0 1px 2px rgba(0,0,0,0.08); +} + + +/* Hover State */ +.beurteilungerforderlich-header:hover { + background-color: var(--fhc-orange-60); + box-shadow: 0 2px 6px rgba(0,0,0,0.12); +} + +/* Active / Expanded State */ +.p-accordion-tab-active > .beurteilungerforderlich-header { + background-color: var(--fhc-orange-50); + box-shadow: 0 2px 8px rgba(0,0,0,0.2); +} + +/* Hover State Active*/ +.p-accordion-tab-active > .beurteilungerforderlich-header:hover { + background-color: var(--fhc-orange-60); + box-shadow: 0 2px 6px rgba(0,0,0,0.12); +} + +/* Base Header */ +.verspaetet-header { + background-color: var(--fhc-pink-40); + font-weight: 600; + border-radius: 6px; + padding: 0px 0px 0px 34px; + transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease; + box-shadow: 0 1px 2px rgba(0,0,0,0.08); +} + +/* Hover State */ +.verspaetet-header:hover { + background-color: var(--fhc-pink-20); + box-shadow: 0 2px 6px rgba(0,0,0,0.12); +} + +/* Active / Expanded State */ +.p-accordion-tab-active > .verspaetet-header { + background-color: var(--fhc-pink-30); + box-shadow: 0 2px 8px rgba(0,0,0,0.2); +} + +/* Hover State Active*/ +.p-accordion-tab-active > .verspaetet-header:hover { + background-color: var(--fhc-pink-20); + box-shadow: 0 2px 6px rgba(0,0,0,0.12); +} + +/* Base Header */ +.abgegeben-header { + background-color: var(--fhc-green-70); + font-weight: 600; + border-radius: 6px; + padding: 0px 0px 0px 34px; + transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease; + box-shadow: 0 1px 2px rgba(0,0,0,0.08); +} + +/* Hover State */ +.abgegeben-header:hover { + background-color: var(--fhc-green-60); + box-shadow: 0 2px 6px rgba(0,0,0,0.12); +} + +/* Active / Expanded State */ +.p-accordion-tab-active > .abgegeben-header { + background-color: var(--fhc-green-50); + box-shadow: 0 2px 8px rgba(0,0,0,0.2); +} + +/* Hover State Active*/ +.p-accordion-tab-active > .abgegeben-header:hover { + background-color: var(--fhc-green-60); + box-shadow: 0 2px 6px rgba(0,0,0,0.12); +} + + +/* Base Header */ +.bestanden-header { + background-color: var(--fhc-green-70); + font-weight: 600; + border-radius: 6px; + padding: 0px 0px 0px 34px; + transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease; + box-shadow: 0 1px 2px rgba(0,0,0,0.08); +} + +/* Hover State */ +.bestanden-header:hover { + background-color: var(--fhc-green-60); + box-shadow: 0 2px 6px rgba(0,0,0,0.12); +} + +/* Active / Expanded State */ +.p-accordion-tab-active > .bestanden-header { + background-color: var(--fhc-green-50); + box-shadow: 0 2px 8px rgba(0,0,0,0.2); +} + +/* Hover State Active*/ +.p-accordion-tab-active > .bestanden-header:hover { + background-color: var(--fhc-green-60); + box-shadow: 0 2px 6px rgba(0,0,0,0.12); +} + + +/* Base Header */ +.nichtbestanden-header { + background-color: var(--fhc-red-70); + font-weight: 600; + border-radius: 6px; + padding: 0px 0px 0px 34px; + transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease; + box-shadow: 0 1px 2px rgba(0,0,0,0.08); +} + +/* Hover State */ +.nichtbestanden-header:hover { + background-color: var(--fhc-red-60); + box-shadow: 0 2px 6px rgba(0,0,0,0.12); +} + +/* Active / Expanded State */ +.p-accordion-tab-active > .nichtbestanden-header { + background-color: var(--fhc-red-50); + box-shadow: 0 2px 8px rgba(0,0,0,0.2); +} + +/* Hover State Active*/ +.p-accordion-tab-active > .nichtbestanden-header:hover { + background-color: var(--fhc-red-60); + box-shadow: 0 2px 6px rgba(0,0,0,0.12); +} + + +/* Base Header */ +.erledigt-header { + background-color: var(--fhc-red-70); + font-weight: 600; + border-radius: 6px; + padding: 0px 0px 0px 34px; + transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease; + box-shadow: 0 1px 2px rgba(0,0,0,0.08); +} + +/* Hover State */ +.erledigt-header:hover { + background-color: var(--fhc-red-60); + box-shadow: 0 2px 6px rgba(0,0,0,0.12); +} + +/* Active / Expanded State */ +.p-accordion-tab-active > .erledigt-header { + background-color: var(--fhc-red-50); + box-shadow: 0 2px 8px rgba(0,0,0,0.2); +} + +/* Hover State Active*/ +.p-accordion-tab-active > .erledigt-header:hover { + background-color: var(--fhc-red-60); + box-shadow: 0 2px 6px rgba(0,0,0,0.12); +} + + +/* Base Header */ +.standard-header { + background-color: var(--fhc-white-70); + font-weight: 600; + border-radius: 6px; + padding: 0px 0px 0px 34px; + transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease; + box-shadow: 0 1px 2px rgba(0,0,0,0.08); +} + +/* Hover State */ +.standard-header:hover { + background-color: var(--fhc-white-60); + box-shadow: 0 2px 6px rgba(0,0,0,0.12); +} + +/* Active / Expanded State */ +.p-accordion-tab-active > .standard-header { + background-color: var(--fhc-white-50); + box-shadow: 0 2px 8px rgba(0,0,0,0.2); +} + +/* Hover State Active*/ +.p-accordion-tab-active > .standard-header:hover { + background-color: var(--fhc-white-60); + box-shadow: 0 2px 6px rgba(0,0,0,0.12); +} + +#abgabetoolroot .modal-header{ + background-color: var(--fhc-blue-primary); + color: var(--fhc-white-50); +} + +#abgabetoolroot .modal-header .btn-close{ + filter: invert(1); +} + +#abgabetoolroot .modal-footer { + background-color: var(--fhc-white-20); + +} + +.bordered-modal { + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 0.5rem; + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.25); +} + +.bordered-modal .modal-body { + overflow-y: visible; +} + +.p-accordion .p-accordion-header .p-accordion-header-link { + padding: 12px!important; +} + +/* 1. Stick the Header */ +#abgabetable .tabulator-header .tabulator-col.sticky-col { + position: sticky; + left: 0; + z-index: 10; /* Must be higher than other headers */ + background-color: #fff; /* Opaque background is required */ + border-right: 2px solid #ddd; /* Optional: Separator line */ +} + +/* 2. Stick the Data Cells */ +#abgabetable .tabulator-tableholder .tabulator-row .tabulator-cell.sticky-col { + position: sticky; + left: 0; + z-index: 10; /* Ensure it floats above other cells */ + background-color: #fff; /* Match your row background color */ + border-right: 2px solid #ddd; /* Optional: Separator line */ +} + +/* 3. Fix for Hover Effects (Optional) */ +/* If you use hover rows, you need to ensure the sticky cell matches the hover color */ +#abgabetable .tabulator-row:hover .tabulator-cell.sticky-col { + background-color: #ccc; /* Match your existing hover color */ +} \ No newline at end of file diff --git a/public/css/tags.css b/public/css/tags.css index 9e0d7ee4b..e92f415b2 100644 --- a/public/css/tags.css +++ b/public/css/tags.css @@ -51,6 +51,14 @@ background-color: #6d4c41; } +.tag_dark_grey { + background-color: #595959; +} + +.tag_light_grey { + background-color: #9a9a9a; +} + .tag_blau { background-color: #508498; } diff --git a/public/css/theme/default.css b/public/css/theme/default.css index a0f366174..a4d197f07 100644 --- a/public/css/theme/default.css +++ b/public/css/theme/default.css @@ -38,15 +38,104 @@ --fhc-blue-primary: #006095; --fhc-blue-primary-highlight: #0086CB; - --fhc-red-10: #842029; - --fhc-red-20: #800000; + /* --- Green --- */ + --fhc-green-5: rgb(240, 250, 240); + --fhc-green-10: rgb(220, 245, 220); + --fhc-green-20: rgb(190, 235, 190); + --fhc-green-30: rgb(150, 220, 150); + --fhc-green-40: rgb(110, 200, 110); + --fhc-green-50: rgb(70, 170, 70); + --fhc-green-60: rgb(50, 145, 50); + --fhc-green-70: rgb(35, 120, 35); + --fhc-green-80: rgb(25, 95, 25); + --fhc-green-90: rgb(15, 70, 15); - --fhc-green-10: #008000; + /* --- Red --- */ + --fhc-red-5: rgb(255, 245, 246); + --fhc-red-10: rgb(255, 225, 228); + --fhc-red-20: rgb(250, 190, 195); + --fhc-red-30: rgb(240, 150, 160); + --fhc-red-40: rgb(225, 110, 120); + --fhc-red-50: rgb(200, 70, 85); + --fhc-red-60: rgb(170, 50, 65); + --fhc-red-70: rgb(140, 35, 50); + --fhc-red-80: rgb(110, 20, 35); + --fhc-red-90: rgb(85, 10, 25); + /* --- Yellow --- */ + --fhc-yellow-5: rgb(255, 255, 240); + --fhc-yellow-10: rgb(255, 250, 210); + --fhc-yellow-20: rgb(255, 240, 160); + --fhc-yellow-30: rgb(255, 225, 100); + --fhc-yellow-40: rgb(250, 210, 50); + --fhc-yellow-50: rgb(240, 190, 0); + --fhc-yellow-60: rgb(220, 165, 0); + --fhc-yellow-70: rgb(190, 135, 0); + --fhc-yellow-80: rgb(160, 105, 0); + --fhc-yellow-90: rgb(120, 75, 0); + + /* --- Pink --- */ + --fhc-pink-5: rgb(255, 245, 250); + --fhc-pink-10: rgb(255, 225, 235); + --fhc-pink-20: rgb(250, 195, 215); + --fhc-pink-30: rgb(245, 160, 190); + --fhc-pink-40: rgb(235, 120, 160); + --fhc-pink-50: rgb(220, 80, 130); + --fhc-pink-60: rgb(190, 60, 110); + --fhc-pink-70: rgb(160, 40, 90); + --fhc-pink-80: rgb(130, 25, 70); + --fhc-pink-90: rgb(100, 15, 50); + + /* --- Orange --- */ + --fhc-orange-5: rgb(255, 250, 240); + --fhc-orange-10: rgb(255, 235, 200); + --fhc-orange-20: rgb(255, 210, 140); + --fhc-orange-30: rgb(255, 185, 80); + --fhc-orange-40: rgb(255, 155, 40); + --fhc-orange-50: rgb(255, 128, 0); + --fhc-orange-60: rgb(230, 110, 0); + --fhc-orange-70: rgb(200, 90, 0); + --fhc-orange-80: rgb(170, 70, 0); + --fhc-orange-90: rgb(130, 50, 0); + --fhc-beige-10: rgba(245, 233, 215, 0.5); --fhc-beige-20: rgba(172, 153, 125, 0.5); + /* --- Purple --- */ + --fhc-purple-5: rgb(250, 245, 255); + --fhc-purple-10: rgb(240, 230, 255); + --fhc-purple-20: rgb(220, 200, 250); + --fhc-purple-30: rgb(190, 160, 245); + --fhc-purple-40: rgb(160, 120, 235); + --fhc-purple-50: rgb(130, 80, 220); + --fhc-purple-60: rgb(110, 60, 190); + --fhc-purple-70: rgb(90, 40, 160); + --fhc-purple-80: rgb(70, 25, 130); + --fhc-purple-90: rgb(50, 15, 100); + /* --- Teal --- */ + --fhc-teal-5: rgb(240, 252, 252); + --fhc-teal-10: rgb(220, 245, 245); + --fhc-teal-20: rgb(180, 235, 235); + --fhc-teal-30: rgb(130, 220, 220); + --fhc-teal-40: rgb(80, 200, 200); + --fhc-teal-50: rgb(30, 170, 170); + --fhc-teal-60: rgb(20, 140, 140); + --fhc-teal-70: rgb(15, 115, 115); + --fhc-teal-80: rgb(10, 90, 90); + --fhc-teal-90: rgb(5, 65, 65); + + /* --- Indigo --- */ + --fhc-indigo-5: rgb(245, 247, 255); + --fhc-indigo-10: rgb(230, 235, 255); + --fhc-indigo-20: rgb(200, 210, 250); + --fhc-indigo-30: rgb(160, 175, 245); + --fhc-indigo-40: rgb(120, 140, 235); + --fhc-indigo-50: rgb(80, 100, 220); + --fhc-indigo-60: rgb(60, 80, 190); + --fhc-indigo-70: rgb(45, 60, 160); + --fhc-indigo-80: rgb(30, 40, 130); + --fhc-indigo-90: rgb(20, 25, 100); } diff --git a/public/dist/js/apps/Abgabetool/Abgabetool.js b/public/dist/js/apps/Abgabetool/Abgabetool.js new file mode 100644 index 000000000..04569cef0 --- /dev/null +++ b/public/dist/js/apps/Abgabetool/Abgabetool.js @@ -0,0 +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\t\t\n\t\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"); +//# sourceMappingURL=Abgabetool.js.map diff --git a/public/dist/js/apps/Abgabetool/Abgabetool.js.map b/public/dist/js/apps/Abgabetool/Abgabetool.js.map new file mode 100644 index 000000000..ec37b4974 --- /dev/null +++ b/public/dist/js/apps/Abgabetool/Abgabetool.js.map @@ -0,0 +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 diff --git a/public/dist/js/apps/Bismeldestichtag/Bismeldestichtag.js b/public/dist/js/apps/Bismeldestichtag/Bismeldestichtag.js index 002c87c00..9e9e2652a 100644 --- a/public/dist/js/apps/Bismeldestichtag/Bismeldestichtag.js +++ b/public/dist/js/apps/Bismeldestichtag/Bismeldestichtag.js @@ -1,4 +1,4 @@ -import t from"../../../../../index.ci.php/public/js/components/primevue/config/config.esm.min.js?2025111701";import e from"../../../../../index.ci.php/public/js/components/primevue/toast/toast.esm.min.js?2025111701";import r from"../../../../../index.ci.php/public/js/components/primevue/confirmdialog/confirmdialog.esm.min.js?2025111701";import n from"../../../../../index.ci.php/public/js/components/primevue/confirmationservice/confirmationservice.esm.min.js?2025111701";const i=function(t){return t.replace(/(.*)-(.*)-(.*)/,"$3.$2.$1")},s={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'},a="Filter Component New Filter";var o={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 r=e.type.toLowerCase();return r.indexOf("int")>=0?t[e.name]="Numeric":r.indexOf("varchar")>=0||r.indexOf("text")>=0||r.indexOf("bpchar")>=0?t[e.name]="Text":r.indexOf("timestamp")>=0||r.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!=a);t.filter(t=>""==t.condition).length?alert("Please fill all the filter options"):this.$emit("applyFilterConfig",t)},addField(t){this.currentFields.push({name:a})},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'},l={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 d={jsonLines:"fa-file-lines",xlsx:"fa-file-excel",pdf:"fa-file-pdf",html:"fa-file-code",json:"fa-file",csv:"fa-file-csv"},u={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 p={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 r,n=t[e];n&&("[object String]"===Object.prototype.toString.call(n)?null!==(r=this.stringToFileFormatter(n))?i.push({icon:"fa-solid "+d[r],label:n===e?u[r]:e,formatter:r}):null!==(r=this.stringToFileFormatter(e))?i.push({icon:"fa-solid "+d[r],label:n,formatter:r}):alert("neither "+e+" nor "+n+" are supported download file types"):"object"!=typeof n||Array.isArray(n)?null!==(r=this.stringToFileFormatter(e))?i.push({icon:"fa-solid "+d[r],label:u[r],formatter:r}):alert(e+" is not a supported download file type"):null!==(r=this.stringToFileFormatter(e))?(void 0===n.formatter&&(n.formatter=r),void 0===n.label&&(n.label=u[r]),void 0===n.icon&&(n.icon=d[r]),i.push(n)):(void 0===n.label&&(n.label=e),i.push(n)))}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 "+d[e],label:u[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 c=new WeakMap;var f={mounted(t,e){let r=!1;c.set(t,e=>{if(!r)return;if(t.contains(e.target))return;const n=bootstrap.Collapse.getInstance(t);n&&n.hide()}),t.addEventListener("shown.bs.collapse",()=>{r=!0}),t.addEventListener("hide.bs.collapse",()=>{r=!1}),document.addEventListener("click",c.get(t),!0)},beforeUnmount(t,e){document.removeEventListener("click",c.get(t)),delete t.collapsibleAutoHideFunc}};window.Tabulator?.extendModule("layout","modes",{fitDataStretchFrozen(t,e){var r=0,n=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&&(r+=t.getWidth())}),s?(i=n-r+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 h={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}})},g=0;const m={components:{CoreFetchCmpt:s,FilterConfig:o,FilterColumns:l,TableDownload:p},directives:{collapseAutoClose:f},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))||[],r=null;if(this.tabulatorOptions&&this.tabulatorOptions.hasOwnProperty("columns")&&(r=this.tabulatorOptions.columns),!Array.isArray(r)||Array.isArray(r)&&r.length=0,r.push(t)}}else for(let n of r)n.visible=e.indexOf(n.field)>=0||-1==t.indexOf(n.field),n.hasOwnProperty("resizable")&&(n.resizable=n.visible);return r},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,r=e=>{this.setRenderData(e),t()};null===e?this.startFetchCmpt(t=>this.$api.call(h.getFilter(t)),null,r):this.startFetchCmpt(t=>this.$api.call(h.getFilterById(t)),{filterId:e},r)});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 r=0;r{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(h.getFilter(t)),null,this.render):this.startFetchCmpt(t=>this.$api.call(h.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(h.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(h.removeCustomFilter(t)),{filterId:e},this.getFilter)},handlerGetFilterById:function(t){let e=null,r=t.currentTarget.getAttribute("href");e=null==r?t.currentTarget.value:r.substring(1),this.switchFilter(e)},switchFilter(t){this.selectedFilter=t,this.getFilter()},applyFilterConfig(t){this.selectedFilter=null,this.startFetchCmpt(t=>this.$api.call(h.applyFilterFields(t)),{filterFields:t},this.getFilter)},appendChild(t,e){let r=e[this.parentIdField];for(let n=0;n{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 v={getHeader:t=>({method:"get",url:"/api/frontend/v1/navigation/header",params:{navigation_page:t}}),getMenu:t=>({method:"get",url:"/api/frontend/v1/navigation/menu",params:{navigation_page:t}})};const A={components:{CoreFetchCmpt:s},props:{addHeaderMenuEntries:Object,addSideMenuEntries:Object,hideTopMenu:Boolean,leftNavCssClasses:{type:String,default:"navbar navbar-left-side"}},data:()=>({headerMenu:{},sideMenu:{}}),computed:{headerMenuEntries(){let t=this.headerMenu?{...this.headerMenu}:{};return null!=this.headerMenu&&null!=this.addHeaderMenuEntries&&Object.keys(this.addHeaderMenuEntries).length>0&&(t[this.addHeaderMenuEntries.description]=this.addHeaderMenuEntries),t},sideMenuEntries(){let t=this.sideMenu?{...this.sideMenu}:{};return null!=this.sideMenu&&null!=this.addSideMenuEntries&&Object.keys(this.addSideMenuEntries).length>0&&(t[this.addSideMenuEntries.description]=this.addSideMenuEntries),t}},methods:{getNavigationPage:()=>FHC_JS_DATA_STORAGE_OBJECT.called_path+"/"+FHC_JS_DATA_STORAGE_OBJECT.called_method,fetchCmptApiFunctionHeader(){return this.$api.call(v.getHeader(this.getNavigationPage()))},fetchCmptApiFunctionSideMenu(){return this.$api.call(v.getMenu(this.getNavigationPage()))},fetchCmptDataFetchedHeader(t){this.headerMenu=t||{}},fetchCmptDataFetchedMenu(t){this.sideMenu=t||{}},getDataBsToggle:t=>t.children?"dropdown":null},template:'\n\t\t\x3c!-- Load head menu --\x3e\n\t\t\n\t\t\x3c!-- Load side menu --\x3e\n\t\t\n\n\t\t\x3c!-- Top menu --\x3e\n\t\t\n\n\t\t\x3c!-- Left side menu --\x3e\n\t\t\n\t'},b="error",_="retval",y={get:function(t,e,r=null){return y._axiosCall(t,e,"get",r)},post:function(t,e,r=null){return y._axiosCall(t,e,"post",r)},isSuccess:function(t){return!("object"!=typeof t||!t.hasOwnProperty(b)||!t.hasOwnProperty(_)||0!=t.error)},isError:function(t){return!y.isSuccess(t)},hasData:function(t){return!(!y.isSuccess(t)||!("object"==typeof t[_]&&Object.keys(t[_]).length>0||"array"==typeof t[_]&&t[_].length>0||"string"==typeof t[_]&&""!=t[_].trim()||"number"==typeof t[_]))},getData:function(t){return y.hasData(t)?t[_]:null},getError:function(t){return"object"==typeof t&&Object.keys(t).length>0&&t.hasOwnProperty(_)?t[_]:"Generic error"},getErrorCode:function(t){return"object"==typeof t&&t.hasOwnProperty(b)?t[b]: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,r){},_axiosCall:function(t,e,r,n){let i={method:r,url:y._generateRouterURI(t),timeout:5e3};if("get"==r?i.params=e:i.data=e,"object"==typeof n)for(var s in n)i[s]=n[s];return axios(i)}},F=2e3,$={getStudiensemester:function(){return y.get("codex/Bismeldestichtag/getStudiensemester",null,{timeout:F})},getBismeldestichtage:function(){return y.get("codex/Bismeldestichtag/getBismeldestichtage",null,{timeout:F})},addBismeldestichtag:function(t){return y.post("codex/Bismeldestichtag/addBismeldestichtag",{meldestichtag:t.meldestichtag,studiensemester_kurzbz:t.studiensemester_kurzbz},{timeout:F})},deleteBismeldestichtag:function(t){return y.post("codex/Bismeldestichtag/deleteBismeldestichtag",{meldestichtag_id:t.meldestichtag_id},{timeout:F})}};var C={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 r={categories:t,language:e};return this.$fhcApi.post("/api/frontend/v1/phrasen/setLanguage",r)},getLanguage(){return this.$fhcApi.get("/api/frontend/v1/phrasen/getLanguage",{})},getActiveDbLanguages(){return this.$fhcApi.get("/api/frontend/v1/phrasen/getAllLanguages",{})}},E={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})}},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})}},P={abmeldung:{getDetails(t,e){const r="/api/frontend/v1/studstatus/abmeldung/"+(void 0!==t?"getDetailsForAntrag/"+t:"getDetailsForNewAntrag/"+e);return this.$fhcApi.get(r)},create(t,e,r){return this.$fhcApi.post("/api/frontend/v1/studstatus/abmeldung/createAntrag",{studiensemester:t,prestudent_id:e,grund:r},{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 r="/api/frontend/v1/studstatus/unterbrechung/"+(void 0!==t?"getDetailsForAntrag/"+t:"getDetailsForNewAntrag/"+e);return this.$fhcApi.get(r)},create(t,e,r,n,i){return this.$fhcApi.post("/api/frontend/v1/studstatus/unterbrechung/createAntrag",{studiensemester:t,prestudent_id:e,grund:r,datum_wiedereinstieg:n,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,r){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)}}},k={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",{})}},D={ +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 r from"../../../../../index.ci.php/public/js/components/primevue/confirmationservice/confirmationservice.esm.min.js";const i=function(t){return t.replace(/(.*)-(.*)-(.*)/,"$3.$2.$1")},s={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'},a="Filter Component New Filter";var o={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!=a);t.filter(t=>""==t.condition).length?alert("Please fill all the filter options"):this.$emit("applyFilterConfig",t)},addField(t){this.currentFields.push({name:a})},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'},l={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 d={jsonLines:"fa-file-lines",xlsx:"fa-file-excel",pdf:"fa-file-pdf",html:"fa-file-code",json:"fa-file",csv:"fa-file-csv"},u={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 p={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,r=t[e];r&&("[object String]"===Object.prototype.toString.call(r)?null!==(n=this.stringToFileFormatter(r))?i.push({icon:"fa-solid "+d[n],label:r===e?u[n]:e,formatter:n}):null!==(n=this.stringToFileFormatter(e))?i.push({icon:"fa-solid "+d[n],label:r,formatter:n}):alert("neither "+e+" nor "+r+" are supported download file types"):"object"!=typeof r||Array.isArray(r)?null!==(n=this.stringToFileFormatter(e))?i.push({icon:"fa-solid "+d[n],label:u[n],formatter:n}):alert(e+" is not a supported download file type"):null!==(n=this.stringToFileFormatter(e))?(void 0===r.formatter&&(r.formatter=n),void 0===r.label&&(r.label=u[n]),void 0===r.icon&&(r.icon=d[n]),i.push(r)):(void 0===r.label&&(r.label=e),i.push(r)))}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 "+d[e],label:u[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 c=new WeakMap;var f={mounted(t,e){let n=!1;c.set(t,e=>{if(!n)return;if(t.contains(e.target))return;const r=bootstrap.Collapse.getInstance(t);r&&r.hide()}),t.addEventListener("shown.bs.collapse",()=>{n=!0}),t.addEventListener("hide.bs.collapse",()=>{n=!1}),document.addEventListener("click",c.get(t),!0)},beforeUnmount(t,e){document.removeEventListener("click",c.get(t)),delete t.collapsibleAutoHideFunc}};window.Tabulator?.extendModule("layout","modes",{fitDataStretchFrozen(t,e){var n=0,r=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=r-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 h={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}})},g=0;const m={components:{CoreFetchCmpt:s,FilterConfig:o,FilterColumns:l,TableDownload:p},directives:{collapseAutoClose:f},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 r of n)r.visible=e.indexOf(r.field)>=0||-1==t.indexOf(r.field),r.hasOwnProperty("resizable")&&(r.resizable=r.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(h.getFilter(t)),null,n):this.startFetchCmpt(t=>this.$api.call(h.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(h.getFilter(t)),null,this.render):this.startFetchCmpt(t=>this.$api.call(h.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(h.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(h.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(h.applyFilterFields(t)),{filterFields:t},this.getFilter)},appendChild(t,e){let n=e[this.parentIdField];for(let r=0;r{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 v={getHeader:t=>({method:"get",url:"/api/frontend/v1/navigation/header",params:{navigation_page:t}}),getMenu:t=>({method:"get",url:"/api/frontend/v1/navigation/menu",params:{navigation_page:t}})};const A={components:{CoreFetchCmpt:s},props:{addHeaderMenuEntries:Object,addSideMenuEntries:Object,hideTopMenu:Boolean,leftNavCssClasses:{type:String,default:"navbar navbar-left-side"}},data:()=>({headerMenu:{},sideMenu:{}}),computed:{headerMenuEntries(){let t=this.headerMenu?{...this.headerMenu}:{};return null!=this.headerMenu&&null!=this.addHeaderMenuEntries&&Object.keys(this.addHeaderMenuEntries).length>0&&(t[this.addHeaderMenuEntries.description]=this.addHeaderMenuEntries),t},sideMenuEntries(){let t=this.sideMenu?{...this.sideMenu}:{};return null!=this.sideMenu&&null!=this.addSideMenuEntries&&Object.keys(this.addSideMenuEntries).length>0&&(t[this.addSideMenuEntries.description]=this.addSideMenuEntries),t}},methods:{getNavigationPage:()=>FHC_JS_DATA_STORAGE_OBJECT.called_path+"/"+FHC_JS_DATA_STORAGE_OBJECT.called_method,fetchCmptApiFunctionHeader(){return this.$api.call(v.getHeader(this.getNavigationPage()))},fetchCmptApiFunctionSideMenu(){return this.$api.call(v.getMenu(this.getNavigationPage()))},fetchCmptDataFetchedHeader(t){this.headerMenu=t||{}},fetchCmptDataFetchedMenu(t){this.sideMenu=t||{}},getDataBsToggle:t=>t.children?"dropdown":null},template:'\n\t\t\x3c!-- Load head menu --\x3e\n\t\t\n\t\t\x3c!-- Load side menu --\x3e\n\t\t\n\n\t\t\x3c!-- Top menu --\x3e\n\t\t\n\n\t\t\x3c!-- Left side menu --\x3e\n\t\t\n\t'},b="error",_="retval",y={get:function(t,e,n=null){return y._axiosCall(t,e,"get",n)},post:function(t,e,n=null){return y._axiosCall(t,e,"post",n)},isSuccess:function(t){return!("object"!=typeof t||!t.hasOwnProperty(b)||!t.hasOwnProperty(_)||0!=t.error)},isError:function(t){return!y.isSuccess(t)},hasData:function(t){return!(!y.isSuccess(t)||!("object"==typeof t[_]&&Object.keys(t[_]).length>0||"array"==typeof t[_]&&t[_].length>0||"string"==typeof t[_]&&""!=t[_].trim()||"number"==typeof t[_]))},getData:function(t){return y.hasData(t)?t[_]:null},getError:function(t){return"object"==typeof t&&Object.keys(t).length>0&&t.hasOwnProperty(_)?t[_]:"Generic error"},getErrorCode:function(t){return"object"==typeof t&&t.hasOwnProperty(b)?t[b]: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,r){let i={method:n,url:y._generateRouterURI(t),timeout:5e3};if("get"==n?i.params=e:i.data=e,"object"==typeof r)for(var s in r)i[s]=r[s];return axios(i)}},F=2e3,$={getStudiensemester:function(){return y.get("codex/Bismeldestichtag/getStudiensemester",null,{timeout:F})},getBismeldestichtage:function(){return y.get("codex/Bismeldestichtag/getBismeldestichtage",null,{timeout:F})},addBismeldestichtag:function(t){return y.post("codex/Bismeldestichtag/addBismeldestichtag",{meldestichtag:t.meldestichtag,studiensemester_kurzbz:t.studiensemester_kurzbz},{timeout:F})},deleteBismeldestichtag:function(t){return y.post("codex/Bismeldestichtag/deleteBismeldestichtag",{meldestichtag_id:t.meldestichtag_id},{timeout:F})}};var C={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 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",{})}},E={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})}},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})}},P={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,r,i){return this.$fhcApi.post("/api/frontend/v1/studstatus/unterbrechung/createAntrag",{studiensemester:t,prestudent_id:e,grund:n,datum_wiedereinstieg:r,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)}}},k={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",{})}},D={ //! 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:r,topic:n,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:r,topic:n,requested_change:i})},denyProfilRequest:function({profil_update_id:t,uid:e,topic:r,status_message:n}){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:r,status_message:n})},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,r=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,...r?{fileID:r}:{}})},updateProfilRequest:function(t,e,r,n=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:r,...n?{fileID:n}:{}})},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})}},O={getRoomInfo(t,e,r){return this.$fhcApi.post("/api/frontend/v1/LvPlan/getRoomplan",{ort_kurzbz:t,start_date:e,end_date:r})},getStunden(){return this.$fhcApi.get("/api/frontend/v1/LvPlan/Stunden",{})},getOrtReservierungen(t,e,r){return this.$fhcApi.post(`/api/frontend/v1/LvPlan/getReservierungen/${t}`,{start_date:e,end_date:r})},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,r){return this.$fhcApi.get("/api/frontend/v1/LvPlan/LvPlanEvents",{start_date:t,end_date:e,lv_id:r})}},w={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 r="api/frontend/v1/stv/students/"+encodeURIComponent(e)+"/uid/"+encodeURIComponent(t);return this.$fhcApi.getUri(r)},prestudent(t,e){let r="api/frontend/v1/stv/students/"+encodeURIComponent(e)+"/prestudent/"+encodeURIComponent(t);return this.$fhcApi.getUri(r)},person(t,e){let r="api/frontend/v1/stv/students/"+encodeURIComponent(e)+"/person/"+encodeURIComponent(t);return this.$fhcApi.getUri(r)},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,r)=>this.$fhcApi.post(t,r,e),t.ajaxResponse=(t,e,r)=>r.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,r){return this.$fhcApi.get("api/frontend/v1/stv/Gruppen/getGruppen/"+r.id)},deleteGroup(t){return this.$fhcApi.post("api/frontend/v1/stv/Gruppen/deleteGruppe/",t)}},kontakt:{getAdressen(t,e,r){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getAdressen/"+r.id)},addNewAddress(t,e,r){return this.$fhcApi.post(t,"api/frontend/v1/stv/kontakt/addNewAddress/"+e,r)},loadAddress(t){return this.$fhcApi.post("api/frontend/v1/stv/kontakt/loadAddress/",{address_id:t})},updateAddress(t,e,r){return this.$fhcApi.post(t,"api/frontend/v1/stv/kontakt/updateAddress/"+e,r)},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,r){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getBankverbindung/"+r.id)},addNewBankverbindung(t,e,r){return this.$fhcApi.post(t,"api/frontend/v1/stv/kontakt/addNewBankverbindung/"+e,r)},loadBankverbindung(t){return this.$fhcApi.post("api/frontend/v1/stv/kontakt/loadBankverbindung/",{bankverbindung_id:t})},updateBankverbindung(t,e,r){return this.$fhcApi.post(t,"api/frontend/v1/stv/kontakt/updateBankverbindung/"+e,r)},deleteBankverbindung(t){return this.$fhcApi.post("api/frontend/v1/stv/kontakt/deleteBankverbindung/",{bankverbindung_id:t})},getKontakte(t,e,r){return this.$fhcApi.get("api/frontend/v1/stv/kontakt/getKontakte/"+r.id)},addNewContact(t,e,r){return this.$fhcApi.post(t,"api/frontend/v1/stv/kontakt/addNewContact/"+e,r)},loadContact(t){return this.$fhcApi.post("api/frontend/v1/stv/kontakt/loadContact/",{kontakt_id:t})},updateContact(t,e,r){return this.$fhcApi.post(t,"api/frontend/v1/stv/kontakt/updateContact/"+e,r)},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,r){return this.$fhcApi.post(t,"api/frontend/v1/stv/prestudent/updatePrestudent/"+e,r)},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,r){return this.$fhcApi.get("api/frontend/v1/stv/status/getHistoryPrestudent/"+r.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:r,ausbildungssemester:n}){return this.$fhcApi.post("api/frontend/v1/stv/status/advanceStatus/"+t+"/"+e+"/"+r+"/"+n)},confirmStatus({prestudent_id:t,status_kurzbz:e,studiensemester_kurzbz:r,ausbildungssemester:n}){return this.$fhcApi.post("api/frontend/v1/stv/status/confirmStatus/"+t+"/"+e+"/"+r+"/"+n)},isLastStatus(t){return this.$fhcApi.get("api/frontend/v1/stv/status/isLastStatus/"+t)},deleteStatus({prestudent_id:t,status_kurzbz:e,studiensemester_kurzbz:r,ausbildungssemester:n}){return this.$fhcApi.post("api/frontend/v1/stv/status/deleteStatus/"+t+"/"+e+"/"+r+"/"+n)},getLastBismeldestichtag(){return this.$fhcApi.get("api/frontend/v1/stv/status/getLastBismeldestichtag/")},getHistoryPrestudents(t,e,r){return this.$fhcApi.get("api/frontend/v1/stv/prestudent/getHistoryPrestudents/"+r.id)}},status:{insertStatus(t,e,r){return this.$fhcApi.post(t,"api/frontend/v1/stv/status/insertStatus/"+e,r)},loadStatus({prestudent_id:t,status_kurzbz:e,studiensemester_kurzbz:r,ausbildungssemester:n}){return this.$fhcApi.post("api/frontend/v1/stv/status/loadStatus/"+t+"/"+e+"/"+r+"/"+n)},updateStatus(t,{prestudent_id:e,status_kurzbz:r,studiensemester_kurzbz:n,ausbildungssemester:i},s){return this.$fhcApi.post(t,"api/frontend/v1/stv/status/updateStatus/"+e+"/"+r+"/"+n+"/"+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 r="api/frontend/v1/stv/student/get/"+encodeURIComponent(t)+"/"+encodeURIComponent(e);return this.$fhcApi.post(r)},save(t,e,r,n){let i="api/frontend/v1/stv/student/save/"+encodeURIComponent(e)+"/"+encodeURIComponent(r);return this.$fhcApi.post(t,i,n)}},exam:{getPruefungen(t,e,r){return this.$fhcApi.get("api/frontend/v1/stv/pruefung/getPruefungen/"+r.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,r){return this.$fhcApi.post(t,"api/frontend/v1/stv/pruefung/updatePruefung/"+e,r)},deletePruefung(t){return this.$fhcApi.post("api/frontend/v1/stv/pruefung/deletePruefung/"+t)}},abschlusspruefung:{getAbschlusspruefung(t,e,r){return this.$fhcApi.get("api/frontend/v1/stv/abschlusspruefung/getAbschlusspruefung/"+r.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 r="api/frontend/v1/stv/grades/getCertificate/"+encodeURIComponent(t);return e&&(r=r+"/"+encodeURIComponent(e)),this.$fhcApi.get(r)},getTeacherProposal(t,e){let r="api/frontend/v1/stv/grades/getTeacherProposal/"+encodeURIComponent(t);return e&&(r=r+"/"+encodeURIComponent(e)),this.$fhcApi.get(r)},getRepeaterGrades(t,e){let r="api/frontend/v1/stv/grades/getRepeaterGrades/"+encodeURIComponent(t);return e&&(r=r+"/"+encodeURIComponent(e)),this.$fhcApi.get(r)},updateCertificate({lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:r,note:n,lehrveranstaltung_bezeichnung:i}){return this.$fhcApi.post("api/frontend/v1/stv/grades/updateCertificate",{lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:r,note:n},{errorHeader:i})},deleteCertificate({lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:r,lehrveranstaltung_bezeichnung:n}){return this.$fhcApi.post("api/frontend/v1/stv/grades/deleteCertificate",{lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:r},{errorHeader:n})},copyTeacherProposalToCertificate({lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:r,lehrveranstaltung_bezeichnung:n}){return this.$fhcApi.post("api/frontend/v1/stv/grades/copyTeacherProposalToCertificate",{lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:r},{errorHeader:n})},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,r,n){const i=n?{errorHandling:!1}:{};return this.$fhcApi.post("api/frontend/v1/stv/grades/getGradeFromPoints",{points:t,lehrveranstaltung_id:e,studiensemester_kurzbz:r},i)}},mobility:{getMobilitaeten(t,e,r){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getMobilitaeten/"+r.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,r){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getPurposes/"+r.id)},getSupports(t,e,r){return this.$fhcApi.get("api/frontend/v1/stv/mobility/getSupports/"+r.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,r)=>this.$fhcApi.post(t,r,e),t.ajaxResponse=(t,e,r)=>r.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,r){return this.$fhcApi.get("api/frontend/v1/stv/dokumente/getDocumentsUnaccepted/"+r.id+"/"+r.studiengang_kz)},getDocumentsAccepted(t,e,r){return this.$fhcApi.get("api/frontend/v1/stv/dokumente/getDocumentsAccepted/"+r.id+"/"+r.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,r){return this.$fhcApi.get("api/frontend/v1/stv/anrechnungen/getAnrechnungen/"+r.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,r){return this.$fhcApi.get("api/frontend/v1/stv/GemeinsameStudien/getStudien/"+r.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,r){return this.$fhcApi.get("api/frontend/v1/stv/LvTermine/getStundenplan/"+r.student_uid+"/"+r.start_date+"/"+r.end_date+"/"+r.group_consecutiveHours+"/"+r.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,r){return this.$fhcApi.get("api/frontend/v1/notiz/notizPerson/getNotizen/"+r.id+"/"+r.type)},getUid(){return this.$fhcApi.get("api/frontend/v1/notiz/notizPerson/getUid/")},addNewNotiz(t,e,r){return this.$fhcApi.post(t,"api/frontend/v1/notiz/notizPerson/addNewNotiz/"+e,r)},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,r){return this.$fhcApi.post("api/frontend/v1/notiz/notizPerson/deleteNotiz/",{notiz_id:t,type_id:e,id:r})},updateNotiz(t,e,r){return this.$fhcApi.post(t,"api/frontend/v1/notiz/notizPerson/updateNotiz/"+e,r)},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,r){return this.$fhcApi.get("api/frontend/v1/betriebsmittel/betriebsmittelP/getAllBetriebsmittel/"+r.type+"/"+r.id)},addNewBetriebsmittel(t,e,r){return this.$fhcApi.post(t,"api/frontend/v1/betriebsmittel/betriebsmittelP/addNewBetriebsmittel/"+e,r)},loadBetriebsmittel(t){return this.$fhcApi.post("api/frontend/v1/betriebsmittel/betriebsmittelP/loadBetriebsmittel/"+t)},updateBetriebsmittel(t,e,r){return this.$fhcApi.post(t,"api/frontend/v1/betriebsmittel/betriebsmittelP/updateBetriebsmittel/"+e,r)},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)}}},L={updatePersonUnrulyStatus(t,e){try{const r={person_id:t,unruly:e},n="/api/frontend/v1/checkperson/CheckPerson/updatePersonUnrulyStatus";return this.$fhcApi.post(n,r,null)}catch(t){throw t}},filterPerson(t,e=""){try{const r=e+"/api/frontend/v1/checkperson/CheckPerson/filterPerson";return axios.post(r,t)}catch(t){throw t}}},R={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,r,n,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:r,typ:n,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")}},x={content(t,e=null,r=null,n=null){return this.$fhcApi.get("/api/frontend/v1/Cms/content",{content_id:t,...e?{version:e}:{},...r?{sprache:r}:{},...n?{sichtbar:n}:{}})},getNews(t=1,e=10,r){return this.$fhcApi.get("/api/frontend/v1/Cms/getNews",{page:t,page_size:e,sprache:r})},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",{})}},J={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}`,{})},getStudentProjektarbeiten(t){return this.$fhcApi.get(`/api/frontend/v1/Lehre/getStudentProjektarbeiten/${t}`,{})},getStudentProjektabgaben(t){return this.$fhcApi.get("/api/frontend/v1/Lehre/getStudentProjektabgaben",{projektarbeit_id:t.projektarbeit_id,student_uid:t.student_uid})},postStudentProjektarbeitEndupload(t){return this.$fhcApi.post("/api/frontend/v1/Lehre/postStudentProjektarbeitEndupload",t,{Headers:{"Content-Type":"multipart/form-data"}})},postStudentProjektarbeitZwischenabgabe(t){return this.$fhcApi.post("/api/frontend/v1/Lehre/postStudentProjektarbeitZwischenabgabe",t,{Headers:{"Content-Type":"multipart/form-data"}})},getStudentProjektarbeitAbgabeFile(t,e){const r=`/Cis/Abgabetool/getStudentProjektarbeitAbgabeFile?paabgabe_id=${t}&student_uid=${e}`;window.location=FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+r},getMitarbeiterProjektarbeiten(t,e){return this.$fhcApi.get(`/api/frontend/v1/Lehre/getMitarbeiterProjektarbeiten?showall=${e}`,{})},postProjektarbeitAbgabe(t){const e={paabgabe_id:t.paabgabe_id,paabgabetyp_kurzbz:t.bezeichnung.paabgabetyp_kurzbz,datum:t.datum,fixtermin:t.fixtermin,insertvon:t.insertvon,kurzbz:t.kurzbz,projektarbeit_id:t.projektarbeit_id};return this.$fhcApi.post("/api/frontend/v1/Lehre/postProjektarbeitAbgabe",e,null)},deleteProjektarbeitAbgabe(t){const e={paabgabe_id:t};return this.$fhcApi.post("/api/frontend/v1/Lehre/deleteProjektarbeitAbgabe",e,null)},postSerientermin(t,e,r,n,i){const s={datum:t,paabgabetyp_kurzbz:e,bezeichnung:r,kurzbz:n,projektarbeit_ids:i};return this.$fhcApi.post("/api/frontend/v1/Lehre/postSerientermin",s,null)},fetchDeadlines(t){const e={person_id:t};return this.$fhcApi.post("/api/frontend/v1/Lehre/fetchDeadlines",e,null)}},j={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}`,{})}},M={person:{getMessages(t,e,r){return this.$fhcApi.get("api/frontend/v1/messages/messages/getMessages/"+r.id+"/"+r.type+"/"+r.size+"/"+r.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,r){return this.$fhcApi.post(t,"api/frontend/v1/messages/messages/sendMessage/"+e,r)},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)}}},z={getVorlagen(){return this.$fhcApi.get("api/frontend/v1/vorlagen/vorlagen/getVorlagen/")},getVorlagenByLoggedInUser(){return this.$fhcApi.get("api/frontend/v1/vorlagen/vorlagen/getVorlagenByLoggedInUser/")}},I={getStudiensemester:function(){return this.$fhcApi.get("/components/Cis/Mylv/Studiensemester",{})},getAllStudienSemester:function(t=void 0,e=void 0,r=void 0,n=void 0){return this.$fhcApi.get("/api/frontend/v1/Studium/getStudienAllSemester",{studiensemester:t,studiengang:e,semester:r,studienplan:n})},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}`,{})}},N={search:C,phrasen:S,navigation:E,dashboard:{async getViewData(){return this.$fhcApi.get("/api/frontend/v1/Cis4FhcApi/getViewData",null,null)}},filter:T,studstatus:P,profil:k,profilUpdate:D,lvPlan:O,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:r,tag:n=null}){return this.$fhcApi.post(`/api/frontend/v1/Bookmark/update/${t}`,{url:e,title:r})},insert:function({url:t,title:e,tag:r}){return this.$fhcApi.post("/api/frontend/v1/Bookmark/insert",{url:t,title:e,tag:r})}},stv:w,notiz:B,betriebsmittel:H,checkperson:L,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:R,cms:x,lehre:J,addons:j,messages:M,vorlagen:z,addons:j,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:I,language:{getAll(){return this.$fhcApi.get("/api/frontend/v1/language/get")}}},G={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 r(t,e,r,n){if("string"==typeof t&&void 0===n)[e,r,n]=[t,e,r],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===r&&void 0===n&&(n=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},n?n.form=t:n={form:t}}return[e,r,n]}function n(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,r])=>{if(r instanceof FileList)for(const n of r)t.FormData.append(e+(r.length>1?"[]":""),n);else Array.isArray(r)?r.every(t=>!(t instanceof File))?t.jsondata[e]=r:r.forEach(n=>t.FormData.append(e+(r.length>1?"[]":""),n)):t.jsondata[e]=r;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(r=>(e.config[r.type+"ErrorHandler"]||t.config.globalProperties.$fhcApi._defaultErrorHandlers[r.type])(r,e.config))),n(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(r=>(e.config[r.type+"ErrorHandler"]||t.config.globalProperties.$fhcApi._defaultErrorHandlers[r.type])(r,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,n,s)=>(console.warn("$fhcApi.get is DEPRECATED! Use $api.get instead."),[e,n,s]=r(t,e,n,s),n&&(s?s.params=n:s={params:n}),i.get(e,s)),post:(t,e,n,s)=>(console.warn("$fhcApi.post is DEPRECATED! Use $api.post instead."),[e,n,s]=r(t,e,n,s),i.post(e,n,s)),_defaultErrorHandlers:{validation(e,r){const n=t.config.globalProperties.$fhcAlert;return r?.form?(r.form.clearValidation(),r.form.setFeedback(!1,e.messages),!1):Array.isArray(e.messages)?(e.messages.forEach(n.alertError),!1):"object"!=typeof e.messages||(r?.errorHeader?Object.values(e.messages).forEach(e=>n.alertDefault("error",Array.isArray(r.errorHeader)?t.config.globalProperties.$p.t.apply(null,r.errorHeader):r.errorHeader,e,!0)):Object.entries(e.messages).forEach(([t,e])=>n.alertDefault("error",t,e,!0)),!1)},general(e,r){const n=t.config.globalProperties.$fhcAlert;r?.form?r.form.setFeedback(!1,e.message):r?.errorHeader?n.alertDefault("error",Array.isArray(r.errorHeader)?t.config.globalProperties.$p.t.apply(null,r.errorHeader):r.errorHeader,e.message,!0):n.alertError(e.message)},php(e){const r=t.config.globalProperties.$fhcAlert;var n="";switch(n+="Message: "+e.message+"\n\n",n+="Filename: "+e.filename+"\n",n+="Line Number: "+e.line+"\n",e.backtrace&&e.backtrace.length&&(n+="\nBacktrace: ",e.backtrace.forEach(t=>{n+="\n\tFile: "+t.file+"\n",n+="\tLine: "+t.line+"\n",n+="\tFunction: "+t.function+"\n"})),e.severity){case"Warning":case"Core Warning":case"Compile Warning":case"User Warning":r.alertDefault("warn","PHP "+e.severity,n,!0);break;case"Notice":case"User Notice":case"Runtime Notice":r.alertDefault("info","PHP "+e.severity,n,!0);break;default:n="Type: PHP "+e.severity+"\n\n"+n,r.alertSystemError(n)}},exception(e){const r=t.config.globalProperties.$fhcAlert;var n="";n+="Type: "+e.class+"\n\n",n+="Message: "+e.message+"\n\n",n+="Filename: "+e.filename+"\n",n+="Line Number: "+e.line+"\n",e.backtrace&&e.backtrace.length&&(n+="\nBacktrace: ",e.backtrace.forEach(t=>{n+="\n\tFile: "+t.file+"\n",n+="\tLine: "+t.line+"\n",n+="\tFunction: "+t.function+"\n"})),r.alertSystemError(n)},db(e){const r=t.config.globalProperties.$fhcAlert;var n="";void 0!==e.heading&&(n+=e.heading+"\n\n"),void 0!==e.code&&(n+="Code: "+e.code+"\n\n"),void 0!==e.sql&&(n+="SQL: "+e.sql+"\n\n"),void 0!==e.message?n+="Message: "+e.message+"\n\n":void 0!==e.messages&&(n+="Messages: "+e.messages.join("\n\t")+"\n\n"),void 0!==e.filename&&(n+="Filename: "+e.filename+"\n"),void 0!==e.line&&(n+="Line Number: "+e.line+"\n"),r.alertSystemError(n)},auth(e,r){const n=t.config.globalProperties.$fhcAlert;var i="";i+="Controller name: "+e.controller+"\n",i+="Method name: "+e.method+"\n",i+="Required permissions: "+e.required_permissions,r?.errorHeader?n.alertDefault("error",Array.isArray(r.errorHeader)?t.config.globalProperties.$p.t.apply(null,r.errorHeader):r.errorHeader,e.message,!0):n.alertDefault("error",e.message,i)}}};class s{constructor(e,r){void 0===r?(this.$fhcApi={getUri:e=>(console.warn("$fhcApi.factory is DEPRECATED!"),t.config.globalProperties.$fhcApi.getUri(e)),get:(e,r,n,i)=>(console.warn("$fhcApi.factory is DEPRECATED!"),t.config.globalProperties.$fhcApi.get(e,r,n,i)),post:(e,r,n,i)=>(console.warn("$fhcApi.factory is DEPRECATED!"),t.config.globalProperties.$fhcApi.post(e,r,n,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(r||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 a=new s(N);e?.factory&&(console.warn("$fhcApi is DEPRECATED!"),a.addEndpoints(e.factory)),t.config.globalProperties.$fhcApi.factory=a,t.provide("$fhcApi",t.config.globalProperties.$fhcApi)}};const U=document.createElement("div"),q=Vue.createApp({name:"FhcAlertApp",components:{PvToast:e,PvConfirm:r},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(){U.parentElement.removeChild(U)},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'});q.use(t),q.use(n);const V=q.mount(U);document.body.appendChild(U);var W={install:(t,e)=>{t.config.globalProperties.$p||t.use(rt);const r={alertSuccess(t){if(Array.isArray(t))return t.forEach(this.alertSuccess);V.$refs.toast.add({severity:"success",summary:"Info",detail:t,life:1e3})},alertInfo(t){if(Array.isArray(t))return t.forEach(this.alertInfo);V.$refs.toast.add({severity:"info",summary:"Info",detail:t,life:3e3})},alertWarning(t){if(Array.isArray(t))return t.forEach(this.alertWarning);V.$refs.toast.add({severity:"warn",summary:"Achtung",detail:t})},alertError(t){if(Array.isArray(t))return t.forEach(this.alertError);V.$refs.toast.add({severity:"error",summary:"Achtung",detail:t})},alertSystemError(e){if(Array.isArray(e))return e.forEach(this.alertSystemError);V.$refs.alert.add({severity:"error",summary:Vue.computed(()=>t.config.globalProperties.$p.t("alert/systemerror")),detail:e})},confirmDelete:()=>new Promise((e,r)=>{V.$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((r,n)=>{V.$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(){r(!0)},reject(){r(!1)}})}),alertDefault(t,e,r,n=!1,i=!1){let s={severity:t,summary:e,detail:r,html:i};n||(s.life=3e3),V.$refs.toast.add(s)},alertMultiple(t,e="info",r="Info",n=!1,i=!1){return!!t.every(t=>"string"==typeof t)&&(t.forEach(t=>this.alertDefault(e,r,t,n,i)),!0)},handleSystemError(t){if(!t.hasOwnProperty("name")||t.name.toLowerCase()!=="AbortError".toLowerCase()){if("string"==typeof t)return r.alertSystemError(t);if(Array.isArray(t)&&t.every(t=>"string"==typeof t))return t.every(r.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,r.alertSystemError(e)}r.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 r.alertWarning(t);if(Array.isArray(t)){if(t.every(t=>"string"==typeof t))return t.every(r.alertWarning);if(t.every(t=>"object"==typeof t)&&null!==msg)return t.every(t=>{t.hasOwnProperty("data")&&t.data.hasOwnProperty("retval")?r.alertWarning(JSON.stringify(t.data.retval)):r.alertSystemError(JSON.stringify(t))})}"object"!=typeof t||null===t?r.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")?r.alertWarning(JSON.stringify(t.data.retval)):r.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=>r.handleFormValidation(e,t)}else if(400==t?.response?.status){let n=y.getError(t.response.data);"object"!=typeof n&&(n=t.response.data),r.resetFormValidation(e);const i=Object.entries(n).filter(([t,r])=>{const n=e.querySelector('[data-fhc-form-validate="'+t+'"]');return!n||(n.dispatchEvent(new CustomEvent("fhc-form-invalidate",{detail:r})),!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(r.alertError))}if(400==t?.response?.status){let e=y.getError(t.response.data);r.alertError("object"==typeof e?Object.values(e):e)}else r.handleSystemError(t)}};t.config.globalProperties.$fhcAlert=r,t.provide("$fhcAlert",t.config.globalProperties.$fhcAlert)}},Z={install:(t,e)=>{if(t.config.globalProperties.$api)return;function r(t,e){Array.isArray(t)?t.forEach(e):Object.entries(t).forEach(([t,r])=>r.forEach(r=>e(r,t)))}t.config.globalProperties.$fhcAlert||t.use(W);let n={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 r=t.config.globalProperties.$p;if(!r)return Promise.reject("Phrasen plugin not loaded!");async function n(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,r])=>{t[e]||(t[e]=[]),Array.isArray(r)?t[e].push(...r):t[e].push(r)})}return t},{});let e=0;const n=await Promise.all(Object.entries(t).sort((t,e)=>["_default"].indexOf(e[0])-["_default"].indexOf(t[0])).map(async([t,n])=>{if("_default"==t){await r.loadCategory("dashboard");t='
    '+r.t("dashboard/general")+"
    "}else t="
    "+t+"
    ";return e+=n.length,t+"
    "+n.join("
    ")+"
    "}));return{counter:e,msgs:n}}let i,s;Array.isArray(e)?({counter:i,msgs:s}=await n(e)):({counter:i,msgs:s}=await Object.entries(e).reduce(async(t,[e,r])=>{const i=await t,{counter:s,msgs:a}=await n(r);return i.counter+=s,i.msgs.push("
    "+e+"
    "+a.join("")+"
    "),i},Promise.resolve({counter:0,msgs:[]}))),await r.loadCategory("ui");const a=r.t("ui/n_errors",{n:i});t.config.globalProperties.$fhcAlert.alertDefault("error",a,"
    "+s.join("")+"
    ",!0,!0)},php(e){r(e,(e,r)=>{var n="";switch(n+="Message: "+e.message+"\n\n",n+="Filename: "+e.filename+"\n",n+="Line Number: "+e.line+"\n",e.backtrace&&e.backtrace.length&&(n+="\nBacktrace: ",e.backtrace.forEach(t=>{n+="\n\tFile: "+t.file+"\n",n+="\tLine: "+t.line+"\n",n+="\tFunction: "+t.function+"\n"})),e.severity){case"Warning":case"Core Warning":case"Compile Warning":case"User Warning":r?r+=": PHP "+e.severity:r="PHP "+e.severity,t.config.globalProperties.$fhcAlert.alertDefault("warn",r,n,!0);break;case"Notice":case"User Notice":case"Runtime Notice":r?r+=": PHP "+e.severity:r="PHP "+e.severity,t.config.globalProperties.$fhcAlert.alertDefault("info",r,n,!0);break;default:n="Type: PHP "+e.severity+"\n\n"+n,r&&(n=r+"\n\n"+n),t.config.globalProperties.$fhcAlert.alertSystemError(n)}})},exception(e){r(e,(e,r)=>{var n="";r&&(n+=r+"\n\n"),n+="Type: "+e.class+"\n\n",n+="Message: "+e.message+"\n\n",n+="Filename: "+e.filename+"\n",n+="Line Number: "+e.line+"\n",e.backtrace&&e.backtrace.length&&(n+="\nBacktrace: ",e.backtrace.forEach(t=>{n+="\n\tFile: "+t.file+"\n",n+="\tLine: "+t.line+"\n",n+="\tFunction: "+t.function+"\n"})),t.config.globalProperties.$fhcAlert.alertSystemError(n)})},db(e){r(e,(e,r)=>{var n="";r&&(n+=r+"\n\n"),void 0!==e.heading&&(n+=e.heading+"\n\n"),void 0!==e.code&&(n+="Code: "+e.code+"\n\n"),void 0!==e.sql&&(n+="SQL: "+e.sql+"\n\n"),void 0!==e.message?n+="Message: "+e.message+"\n\n":void 0!==e.messages&&(n+="Messages: "+e.messages.join("\n\t")+"\n\n"),void 0!==e.filename&&(n+="Filename: "+e.filename+"\n"),void 0!==e.line&&(n+="Line Number: "+e.line+"\n"),t.config.globalProperties.$fhcAlert.alertSystemError(n)})},auth(e){r(e,(e,r)=>{r?r+=": "+e.message:r=e.message;var n="";n+="Controller name: "+e.controller+"\n",n+="Method name: "+e.method+"\n",n+="Required permissions: "+e.required_permissions,t.config.globalProperties.$fhcAlert.alertDefault("error",r,n,!0)})}}};function i(t,e,r,n){if("string"==typeof t&&void 0===n)[e,r,n]=[t,e,r],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===r&&void 0===n&&(n=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},n?n.form=t:n={form:t}}return[e,r,n]}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 a(t){if(!1===t||"off"===t)return{...n,success:!1,fail:!1};if(!t||!0===t)return{...n};if("success"===t)return{...n,fail:!1};if("fail"===t)return{...n,success:!1};const{success:e,fail:r,handler:i,combine:s}=t;return t={...n},Object.entries({fail:r,success:e}).forEach(([e,r])=>{void 0!==r&&(t[e]=r)}),Object.entries({handler:i,combine:s}).forEach(([e,r])=>{void 0!==r&&(t[e]={...t[e],...r})}),t}function o(t){const e=a(t?.errorHandling);if(t?.form){const r=e.handler.form;e.handler={...e.handler,form:e=>r(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 r={},n=[];if(null==e)return{};for(;e.length;)n.push(e.pop());for(var i of n){let n=i.type,a=null;for(var s in t.combine){let e=t.combine[s].includes(n),r=t.handler[s];if(e&&r&&(a=s,"form"==a))break}a&&(n=a);t.handler[n]?(r[n]||(r[n]=[]),Array.isArray(i)?r[n].push(...i):r[n].push(i)):e.push(i)}return r}void 0!==e?.errorHandling&&(n=a(e.errorHandling));const u=axios.create({timeout:5e5,baseURL:FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/"});u.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,r])=>{if(r instanceof FileList)for(const n of r)t.FormData.append(e+(r.length>1?"[]":""),n);else Array.isArray(r)?r.every(t=>!(t instanceof File))?t.jsondata[e]=r:r.forEach(n=>t.FormData.append(e+(r.length>1?"[]":""),n)):t.jsondata[e]=r;return t},{FormData:new FormData,jsondata:{}});e.FormData.append("_jsondata",JSON.stringify(e.jsondata)),t.data=e.FormData}return t}),u.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(r=>(e.config[r.type+"ErrorHandler"]||t.config.globalProperties.$api._defaultErrorHandlers[r.type])(r,e.config))),s(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 r=l(t),n=d(e,r);for(var i in n)e.handler[i](n[i]);return r.length?Promise.reject(t):Promise.reject({handled:!0,...t})}),t.config.globalProperties.$api={getUri:t=>u.getUri({url:t}),get:(t,e,r,n)=>([e,r,n]=i(t,e,r,n),r&&(n?n.params=r:n={params:r}),u.get(e,n)),post:(t,e,r,n)=>([e,r,n]=i(t,e,r,n),u.post(e,r,n)),call(e,r,n){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(n,void 0,void 0,r||{}),s=o(e);if(!s.success&&!s.fail)return t;const a={};for(var u of t){const[t,e]="fulfilled"===u.status?[s.success,u.value]:[s.fail,u.reason];if(!t)return;const r=d(s,l(e));for(var p in r)a[p]?a[p][e.config.errorHeader]=r[p]:a[p]={[e.config.errorHeader]:r[p]}}for(var c in a)s.handler[c](a[c]);return t})}let{method:s,url:a,params:u,config:p}=e;return void 0!==r&&(p=r),s||(s="get"),s.toLowerCase&&(s=s.toLowerCase()),"get"==s?this.get(n,a,u,p):"post"==s?this.post(n,a,u,p):void console.error("FhcApi: method not allowed:",s)},getErrorHandler:t=>o(t)},t.provide("$api",t.config.globalProperties.$api)}},K={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 X=Vue.reactive({}),Q={};let Y=Vue.ref(FHC_JS_DATA_STORAGE_OBJECT.user_language),tt=Vue.computed(()=>Y.value?FHC_JS_DATA_STORAGE_OBJECT.server_languages.find(t=>t.sprache==Y.value).LC_Time:null);const et={user_language:Y,user_locale:tt,setLanguage(t){const e=Object.keys(X);return this.config.globalProperties.$api.call(K.setLanguage(e,t)).then(e=>(e.data.forEach(t=>{X[t.category][t.phrase]=t.text}),Y.value=t,e))},loadCategory(t){return Array.isArray(t)?Promise.all(t.map(this.config.globalProperties.$p.loadCategory)):(Q[t]||(Q[t]=this.config.globalProperties.$api.call(K.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=>{X[t]=e})),Q[t])},t_ref(t,e,r){return console.warn("deprecated"),Vue.computed(()=>this.t(t,e,r))},t(t,e,r){if(void 0===r&&(Array.isArray(t)&&2==t.length||t.split&&2==t.split("/").length)&&(r=e,[t,e]=t.split?t.split("/"):t),void 0===e)return console.error("invalid input",t,e,r),"";let n=Vue.computed(()=>X[t]?function(t,e,r){let n=X[t][e];return n?(r&&(n=n.replace(/\{([^}]*)\}/g,(t,e)=>void 0===r[e]?t:r[e])),n):"<< PHRASE "+e+">>"}(t,e,r):"");return X[t]||this.loadCategory(t),n.value}};var rt={install(t,e){t.config.globalProperties.$fhcApi||t.use(G),t.config.globalProperties.$api||t.use(Z),t.config.globalProperties.$p={t:et.t,loadCategory:e=>et.loadCategory.call(t,e),setLanguage:e=>et.setLanguage.call(t,e),user_language:Y,user_locale:tt,t_ref:et.t_ref},t.provide("$p",t.config.globalProperties.$p)}};Vue.createApp({data:function(){return{bismeldestichtagTabulatorOptions:{maxHeight:"100%",minHeight:50,layout:"fitColumns",index:"meldestichtag_id",initialSort:[{column:"meldestichtag",dir:"desc"}],columns:[{title:"Meldestichtag",field:"meldestichtag",headerFilter:!0,formatter:function(t){return i(t.getValue())}},{title:"Studiensemester",field:"studiensemester_kurzbz",headerFilter:!0,sorter:function(t,e,r,n,i,s,a){return new Date(r.getData().semester_start)-new Date(n.getData().semester_start)}},{title:"Semesterstart",field:"semester_start",headerFilter:!0,visible:!1,formatter:function(t){return i(t.getValue())}},{title:"ID",field:"meldestichtag_id",headerFilter:!0,visible:!1},{title:"Insertamum",field:"insertamum",headerFilter:!0,visible:!1},{title:"Insertvon",field:"insertvon",headerFilter:!0,visible:!1},{title:"Löschen",field:"loeschen",headerFilter:!1,formatter:function(t){return''}}]},bismeldestichtagTabulatorEventHandlers:[{event:"rowClick",handler:function(t,e){if("DIV"==t.target.nodeName){let t=e.getData();alert(t.studiensemester_kurzbz+": "+i(t.meldestichtag))}}},{event:"tableBuilt",handler:()=>{this.handlerStudiensemester()}}],meldestichtag:null,semList:null,currSem:null,fetchCmptApiFunction:{},fetchCmptApiFunctionParams:null,fetchCmptDataFetched:null,fetchCmptRefresh:!0}},components:{CoreNavigationCmpt:A,CoreFilterCmpt:m,BismeldestichtagAPIs:$,CoreFetchCmpt:s,datepicker:VueDatePicker},methods:{handlerStudiensemester:function(){this.startFetchCmpt($.getStudiensemester,null,this.fetchCmptDataFetchedStudiensemester)},handlerBismeldestichtage:function(){this.startFetchCmpt($.getBismeldestichtage,null,this.fetchCmptDataFetchedBismeldestichtage)},handlerAddBismeldestichtag:function(t){this.startFetchCmpt($.addBismeldestichtag,{meldestichtag:this.meldestichtag,studiensemester_kurzbz:this.currSem},this.fetchCmptDataFetchedAddBismeldestichtag)},handlerDeleteBismeldestichtag:function(t){this.startFetchCmpt($.deleteBismeldestichtag,{meldestichtag_id:t},this.fetchCmptDataFetchedDeleteBismeldestichtag)},fetchCmptDataFetchedStudiensemester:function(t){if(y.isError(t)&&alert(y.getError(t)),y.hasData(t)){let e=y.getData(t);this.semList=e.semList,this.currSem=e.currSem,this.handlerBismeldestichtage()}else alert("No Studiensemester data")},fetchCmptDataFetchedBismeldestichtage:function(t){if(y.isError(t)&&alert(y.getError(t)),y.hasData(t)){this.$refs.bismeldestichtageTable.tabulator.setData(y.getData(t));let e=this.handlerDeleteBismeldestichtag,r=document.getElementsByClassName("delete-btn");for(let t in r)r[t].addEventListener&&r[t].addEventListener("click",function(){e(r[t].getAttribute("data-meldestichtag-id"))})}else this.$refs.bismeldestichtageTable.tabulator.setData([])},fetchCmptDataFetchedAddBismeldestichtag:function(t){y.isError(t)?alert(y.getError(t)):y.hasData(t)?this.handlerBismeldestichtage():alert("No response data")},fetchCmptDataFetchedDeleteBismeldestichtag:function(t){y.isError(t)?alert(y.getError(t)):y.hasData(t)?this.handlerBismeldestichtage():alert("No response data")},startFetchCmpt:function(t,e,r){this.fetchCmptApiFunction=t,null==e&&(e={}),this.fetchCmptApiFunctionParams=e,this.fetchCmptDataFetched=r,!0===this.fetchCmptRefresh?this.fetchCmptRefresh=!1:this.fetchCmptRefresh=!0}}}).use(rt).mount("#main"); +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:r,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:r,requested_change:i})},denyProfilRequest:function({profil_update_id:t,uid:e,topic:n,status_message:r}){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:r})},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,r=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,...r?{fileID:r}:{}})},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})}},O={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})}},w={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:r}){return this.$fhcApi.post("api/frontend/v1/stv/status/advanceStatus/"+t+"/"+e+"/"+n+"/"+r)},confirmStatus({prestudent_id:t,status_kurzbz:e,studiensemester_kurzbz:n,ausbildungssemester:r}){return this.$fhcApi.post("api/frontend/v1/stv/status/confirmStatus/"+t+"/"+e+"/"+n+"/"+r)},isLastStatus(t){return this.$fhcApi.get("api/frontend/v1/stv/status/isLastStatus/"+t)},deleteStatus({prestudent_id:t,status_kurzbz:e,studiensemester_kurzbz:n,ausbildungssemester:r}){return this.$fhcApi.post("api/frontend/v1/stv/status/deleteStatus/"+t+"/"+e+"/"+n+"/"+r)},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:r}){return this.$fhcApi.post("api/frontend/v1/stv/status/loadStatus/"+t+"/"+e+"/"+n+"/"+r)},updateStatus(t,{prestudent_id:e,status_kurzbz:n,studiensemester_kurzbz:r,ausbildungssemester:i},s){return this.$fhcApi.post(t,"api/frontend/v1/stv/status/updateStatus/"+e+"/"+n+"/"+r+"/"+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,r){let i="api/frontend/v1/stv/student/save/"+encodeURIComponent(e)+"/"+encodeURIComponent(n);return this.$fhcApi.post(t,i,r)}},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:r,lehrveranstaltung_bezeichnung:i}){return this.$fhcApi.post("api/frontend/v1/stv/grades/updateCertificate",{lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:n,note:r},{errorHeader:i})},deleteCertificate({lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:n,lehrveranstaltung_bezeichnung:r}){return this.$fhcApi.post("api/frontend/v1/stv/grades/deleteCertificate",{lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:n},{errorHeader:r})},copyTeacherProposalToCertificate({lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:n,lehrveranstaltung_bezeichnung:r}){return this.$fhcApi.post("api/frontend/v1/stv/grades/copyTeacherProposalToCertificate",{lehrveranstaltung_id:t,student_uid:e,studiensemester_kurzbz:n},{errorHeader:r})},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,r){const i=r?{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")}},B={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/")}}},H={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)}}},R={updatePersonUnrulyStatus(t,e){try{const n={person_id:t,unruly:e},r="/api/frontend/v1/checkperson/CheckPerson/updatePersonUnrulyStatus";return this.$fhcApi.post(r,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}}},L={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,r,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:r,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")}},x={content(t,e=null,n=null,r=null){return this.$fhcApi.get("/api/frontend/v1/Cms/content",{content_id:t,...e?{version:e}:{},...n?{sprache:n}:{},...r?{sichtbar:r}:{}})},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",{})}},J={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}`,{})}},M={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}`,{})}},j={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)}}},I={getVorlagen(){return this.$fhcApi.get("api/frontend/v1/vorlagen/vorlagen/getVorlagen/")},getVorlagenByLoggedInUser(){return this.$fhcApi.get("api/frontend/v1/vorlagen/vorlagen/getVorlagenByLoggedInUser/")}},z={getStudiensemester:function(){return this.$fhcApi.get("/components/Cis/Mylv/Studiensemester",{})},getAllStudienSemester:function(t=void 0,e=void 0,n=void 0,r=void 0){return this.$fhcApi.get("/api/frontend/v1/Studium/getStudienAllSemester",{studiensemester:t,studiengang:e,semester:n,studienplan:r})},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}`,{})}},N={search:C,phrasen:S,navigation:E,dashboard:{async getViewData(){return this.$fhcApi.get("/api/frontend/v1/Cis4FhcApi/getViewData",null,null)}},filter:T,studstatus:P,profil:k,profilUpdate:D,lvPlan:O,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:r=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:w,notiz:B,betriebsmittel:H,checkperson:R,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:L,cms:x,lehre:J,addons:M,messages:j,vorlagen:I,addons:M,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:z,language:{getAll(){return this.$fhcApi.get("/api/frontend/v1/language/get")}}},G={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,r){if("string"==typeof t&&void 0===r)[e,n,r]=[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===r&&(r=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},r?r.form=t:r={form:t}}return[e,n,r]}function r(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 r of n)t.FormData.append(e+(n.length>1?"[]":""),r);else Array.isArray(n)?n.every(t=>!(t instanceof File))?t.jsondata[e]=n:n.forEach(r=>t.FormData.append(e+(n.length>1?"[]":""),r)):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))),r(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,r,s)=>(console.warn("$fhcApi.get is DEPRECATED! Use $api.get instead."),[e,r,s]=n(t,e,r,s),r&&(s?s.params=r:s={params:r}),i.get(e,s)),post:(t,e,r,s)=>(console.warn("$fhcApi.post is DEPRECATED! Use $api.post instead."),[e,r,s]=n(t,e,r,s),i.post(e,r,s)),_defaultErrorHandlers:{validation(e,n){const r=t.config.globalProperties.$fhcAlert;return n?.form?(n.form.clearValidation(),n.form.setFeedback(!1,e.messages),!1):Array.isArray(e.messages)?(e.messages.forEach(r.alertError),!1):"object"!=typeof e.messages||(n?.errorHeader?Object.values(e.messages).forEach(e=>r.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])=>r.alertDefault("error",t,e,!0)),!1)},general(e,n){const r=t.config.globalProperties.$fhcAlert;n?.form?n.form.setFeedback(!1,e.message):n?.errorHeader?r.alertDefault("error",Array.isArray(n.errorHeader)?t.config.globalProperties.$p.t.apply(null,n.errorHeader):n.errorHeader,e.message,!0):r.alertError(e.message)},php(e){const n=t.config.globalProperties.$fhcAlert;var r="";switch(r+="Message: "+e.message+"\n\n",r+="Filename: "+e.filename+"\n",r+="Line Number: "+e.line+"\n",e.backtrace&&e.backtrace.length&&(r+="\nBacktrace: ",e.backtrace.forEach(t=>{r+="\n\tFile: "+t.file+"\n",r+="\tLine: "+t.line+"\n",r+="\tFunction: "+t.function+"\n"})),e.severity){case"Warning":case"Core Warning":case"Compile Warning":case"User Warning":n.alertDefault("warn","PHP "+e.severity,r,!0);break;case"Notice":case"User Notice":case"Runtime Notice":n.alertDefault("info","PHP "+e.severity,r,!0);break;default:r="Type: PHP "+e.severity+"\n\n"+r,n.alertSystemError(r)}},exception(e){const n=t.config.globalProperties.$fhcAlert;var r="";r+="Type: "+e.class+"\n\n",r+="Message: "+e.message+"\n\n",r+="Filename: "+e.filename+"\n",r+="Line Number: "+e.line+"\n",e.backtrace&&e.backtrace.length&&(r+="\nBacktrace: ",e.backtrace.forEach(t=>{r+="\n\tFile: "+t.file+"\n",r+="\tLine: "+t.line+"\n",r+="\tFunction: "+t.function+"\n"})),n.alertSystemError(r)},db(e){const n=t.config.globalProperties.$fhcAlert;var r="";void 0!==e.heading&&(r+=e.heading+"\n\n"),void 0!==e.code&&(r+="Code: "+e.code+"\n\n"),void 0!==e.sql&&(r+="SQL: "+e.sql+"\n\n"),void 0!==e.message?r+="Message: "+e.message+"\n\n":void 0!==e.messages&&(r+="Messages: "+e.messages.join("\n\t")+"\n\n"),void 0!==e.filename&&(r+="Filename: "+e.filename+"\n"),void 0!==e.line&&(r+="Line Number: "+e.line+"\n"),n.alertSystemError(r)},auth(e,n){const r=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?r.alertDefault("error",Array.isArray(n.errorHeader)?t.config.globalProperties.$p.t.apply(null,n.errorHeader):n.errorHeader,e.message,!0):r.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,r,i)=>(console.warn("$fhcApi.factory is DEPRECATED!"),t.config.globalProperties.$fhcApi.get(e,n,r,i)),post:(e,n,r,i)=>(console.warn("$fhcApi.factory is DEPRECATED!"),t.config.globalProperties.$fhcApi.post(e,n,r,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 a=new s(N);e?.factory&&(console.warn("$fhcApi is DEPRECATED!"),a.addEndpoints(e.factory)),t.config.globalProperties.$fhcApi.factory=a,t.provide("$fhcApi",t.config.globalProperties.$fhcApi)}};const U=document.createElement("div"),q=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(){U.parentElement.removeChild(U)},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'});q.use(t),q.use(r);const V=q.mount(U);document.body.appendChild(U);var W={install:(t,e)=>{t.config.globalProperties.$p||t.use(nt);const n={alertSuccess(t){if(Array.isArray(t))return t.forEach(this.alertSuccess);V.$refs.toast.add({severity:"success",summary:"Info",detail:t,life:1e3})},alertInfo(t){if(Array.isArray(t))return t.forEach(this.alertInfo);V.$refs.toast.add({severity:"info",summary:"Info",detail:t,life:3e3})},alertWarning(t){if(Array.isArray(t))return t.forEach(this.alertWarning);V.$refs.toast.add({severity:"warn",summary:"Achtung",detail:t})},alertError(t){if(Array.isArray(t))return t.forEach(this.alertError);V.$refs.toast.add({severity:"error",summary:"Achtung",detail:t})},alertSystemError(e){if(Array.isArray(e))return e.forEach(this.alertSystemError);V.$refs.alert.add({severity:"error",summary:Vue.computed(()=>t.config.globalProperties.$p.t("alert/systemerror")),detail:e})},confirmDelete:()=>new Promise((e,n)=>{V.$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,r)=>{V.$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,r=!1,i=!1){let s={severity:t,summary:e,detail:n,html:i};r||(s.life=3e3),V.$refs.toast.add(s)},alertMultiple(t,e="info",n="Info",r=!1,i=!1){return!!t.every(t=>"string"==typeof t)&&(t.forEach(t=>this.alertDefault(e,n,t,r,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 r=y.getError(t.response.data);"object"!=typeof r&&(r=t.response.data),n.resetFormValidation(e);const i=Object.entries(r).filter(([t,n])=>{const r=e.querySelector('[data-fhc-form-validate="'+t+'"]');return!r||(r.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=y.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)}},Z={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(W);let r={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 r(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 r=await Promise.all(Object.entries(t).sort((t,e)=>["_default"].indexOf(e[0])-["_default"].indexOf(t[0])).map(async([t,r])=>{if("_default"==t){await n.loadCategory("dashboard");t='
    '+n.t("dashboard/general")+"
    "}else t="
    "+t+"
    ";return e+=r.length,t+"
    "+r.join("
    ")+"
    "}));return{counter:e,msgs:r}}let i,s;Array.isArray(e)?({counter:i,msgs:s}=await r(e)):({counter:i,msgs:s}=await Object.entries(e).reduce(async(t,[e,n])=>{const i=await t,{counter:s,msgs:a}=await r(n);return i.counter+=s,i.msgs.push("
    "+e+"
    "+a.join("")+"
    "),i},Promise.resolve({counter:0,msgs:[]}))),await n.loadCategory("ui");const a=n.t("ui/n_errors",{n:i});t.config.globalProperties.$fhcAlert.alertDefault("error",a,"
    "+s.join("")+"
    ",!0,!0)},php(e){n(e,(e,n)=>{var r="";switch(r+="Message: "+e.message+"\n\n",r+="Filename: "+e.filename+"\n",r+="Line Number: "+e.line+"\n",e.backtrace&&e.backtrace.length&&(r+="\nBacktrace: ",e.backtrace.forEach(t=>{r+="\n\tFile: "+t.file+"\n",r+="\tLine: "+t.line+"\n",r+="\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,r,!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,r,!0);break;default:r="Type: PHP "+e.severity+"\n\n"+r,n&&(r=n+"\n\n"+r),t.config.globalProperties.$fhcAlert.alertSystemError(r)}})},exception(e){n(e,(e,n)=>{var r="";n&&(r+=n+"\n\n"),r+="Type: "+e.class+"\n\n",r+="Message: "+e.message+"\n\n",r+="Filename: "+e.filename+"\n",r+="Line Number: "+e.line+"\n",e.backtrace&&e.backtrace.length&&(r+="\nBacktrace: ",e.backtrace.forEach(t=>{r+="\n\tFile: "+t.file+"\n",r+="\tLine: "+t.line+"\n",r+="\tFunction: "+t.function+"\n"})),t.config.globalProperties.$fhcAlert.alertSystemError(r)})},db(e){n(e,(e,n)=>{var r="";n&&(r+=n+"\n\n"),void 0!==e.heading&&(r+=e.heading+"\n\n"),void 0!==e.code&&(r+="Code: "+e.code+"\n\n"),void 0!==e.sql&&(r+="SQL: "+e.sql+"\n\n"),void 0!==e.message?r+="Message: "+e.message+"\n\n":void 0!==e.messages&&(r+="Messages: "+e.messages.join("\n\t")+"\n\n"),void 0!==e.filename&&(r+="Filename: "+e.filename+"\n"),void 0!==e.line&&(r+="Line Number: "+e.line+"\n"),t.config.globalProperties.$fhcAlert.alertSystemError(r)})},auth(e){n(e,(e,n)=>{n?n+=": "+e.message:n=e.message;var r="";r+="Controller name: "+e.controller+"\n",r+="Method name: "+e.method+"\n",r+="Required permissions: "+e.required_permissions,t.config.globalProperties.$fhcAlert.alertDefault("error",n,r,!0)})}}};function i(t,e,n,r){if("string"==typeof t&&void 0===r)[e,n,r]=[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===r&&(r=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},r?r.form=t:r={form:t}}return[e,n,r]}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 a(t){if(!1===t||"off"===t)return{...r,success:!1,fail:!1};if(!t||!0===t)return{...r};if("success"===t)return{...r,fail:!1};if("fail"===t)return{...r,success:!1};const{success:e,fail:n,handler:i,combine:s}=t;return t={...r},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 o(t){const e=a(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 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 n={},r=[];if(null==e)return{};for(;e.length;)r.push(e.pop());for(var i of r){let r=i.type,a=null;for(var s in t.combine){let e=t.combine[s].includes(r),n=t.handler[s];if(e&&n&&(a=s,"form"==a))break}a&&(r=a);t.handler[r]?(n[r]||(n[r]=[]),Array.isArray(i)?n[r].push(...i):n[r].push(i)):e.push(i)}return n}void 0!==e?.errorHandling&&(r=a(e.errorHandling));const u=axios.create({timeout:5e5,baseURL:FHC_JS_DATA_STORAGE_OBJECT.app_root+FHC_JS_DATA_STORAGE_OBJECT.ci_router+"/"});u.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 r of n)t.FormData.append(e+(n.length>1?"[]":""),r);else Array.isArray(n)?n.every(t=>!(t instanceof File))?t.jsondata[e]=n:n.forEach(r=>t.FormData.append(e+(n.length>1?"[]":""),r)):t.jsondata[e]=n;return t},{FormData:new FormData,jsondata:{}});e.FormData.append("_jsondata",JSON.stringify(e.jsondata)),t.data=e.FormData}return t}),u.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=o(t.config);if(!e.fail)return Promise.reject(t);const n=l(t),r=d(e,n);for(var i in r)e.handler[i](r[i]);return n.length?Promise.reject(t):Promise.reject({handled:!0,...t})}),t.config.globalProperties.$api={getUri:t=>u.getUri({url:t}),get:(t,e,n,r)=>([e,n,r]=i(t,e,n,r),n&&(r?r.params=n:r={params:n}),u.get(e,r)),post:(t,e,n,r)=>([e,n,r]=i(t,e,n,r),u.post(e,n,r)),call(e,n,r){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(r,void 0,void 0,n||{}),s=o(e);if(!s.success&&!s.fail)return t;const a={};for(var u of t){const[t,e]="fulfilled"===u.status?[s.success,u.value]:[s.fail,u.reason];if(!t)return;const n=d(s,l(e));for(var p in n)a[p]?a[p][e.config.errorHeader]=n[p]:a[p]={[e.config.errorHeader]:n[p]}}for(var c in a)s.handler[c](a[c]);return t})}let{method:s,url:a,params:u,config:p}=e;return void 0!==n&&(p=n),s||(s="get"),s.toLowerCase&&(s=s.toLowerCase()),"get"==s?this.get(r,a,u,p):"post"==s?this.post(r,a,u,p):void console.error("FhcApi: method not allowed:",s)},getErrorHandler:t=>o(t)},t.provide("$api",t.config.globalProperties.$api)}},K={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 X=Vue.reactive({}),Q={};let Y=Vue.ref(FHC_JS_DATA_STORAGE_OBJECT.user_language),tt=Vue.computed(()=>Y.value?FHC_JS_DATA_STORAGE_OBJECT.server_languages.find(t=>t.sprache==Y.value).LC_Time:null);const et={user_language:Y,user_locale:tt,setLanguage(t){const e=Object.keys(X);return this.config.globalProperties.$api.call(K.setLanguage(e,t)).then(e=>(e.data.forEach(t=>{X[t.category][t.phrase]=t.text}),Y.value=t,e))},loadCategory(t){return Array.isArray(t)?Promise.all(t.map(this.config.globalProperties.$p.loadCategory)):(Q[t]||(Q[t]=this.config.globalProperties.$api.call(K.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=>{X[t]=e})),Q[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 r=Vue.computed(()=>X[t]?function(t,e,n){let r=X[t][e];return r?(n&&(r=r.replace(/\{([^}]*)\}/g,(t,e)=>void 0===n[e]?t:n[e])),r):"<< PHRASE "+e+">>"}(t,e,n):"");return X[t]||this.loadCategory(t),r.value}};var nt={install(t,e){t.config.globalProperties.$fhcApi||t.use(G),t.config.globalProperties.$api||t.use(Z),t.config.globalProperties.$p={t:et.t,loadCategory:e=>et.loadCategory.call(t,e),setLanguage:e=>et.setLanguage.call(t,e),user_language:Y,user_locale:tt,t_ref:et.t_ref},t.provide("$p",t.config.globalProperties.$p)}};Vue.createApp({data:function(){return{bismeldestichtagTabulatorOptions:{maxHeight:"100%",minHeight:50,layout:"fitColumns",index:"meldestichtag_id",initialSort:[{column:"meldestichtag",dir:"desc"}],columns:[{title:"Meldestichtag",field:"meldestichtag",headerFilter:!0,formatter:function(t){return i(t.getValue())}},{title:"Studiensemester",field:"studiensemester_kurzbz",headerFilter:!0,sorter:function(t,e,n,r,i,s,a){return new Date(n.getData().semester_start)-new Date(r.getData().semester_start)}},{title:"Semesterstart",field:"semester_start",headerFilter:!0,visible:!1,formatter:function(t){return i(t.getValue())}},{title:"ID",field:"meldestichtag_id",headerFilter:!0,visible:!1},{title:"Insertamum",field:"insertamum",headerFilter:!0,visible:!1},{title:"Insertvon",field:"insertvon",headerFilter:!0,visible:!1},{title:"Löschen",field:"loeschen",headerFilter:!1,formatter:function(t){return''}}]},bismeldestichtagTabulatorEventHandlers:[{event:"rowClick",handler:function(t,e){if("DIV"==t.target.nodeName){let t=e.getData();alert(t.studiensemester_kurzbz+": "+i(t.meldestichtag))}}},{event:"tableBuilt",handler:()=>{this.handlerStudiensemester()}}],meldestichtag:null,semList:null,currSem:null,fetchCmptApiFunction:{},fetchCmptApiFunctionParams:null,fetchCmptDataFetched:null,fetchCmptRefresh:!0}},components:{CoreNavigationCmpt:A,CoreFilterCmpt:m,BismeldestichtagAPIs:$,CoreFetchCmpt:s,datepicker:VueDatePicker},methods:{handlerStudiensemester:function(){this.startFetchCmpt($.getStudiensemester,null,this.fetchCmptDataFetchedStudiensemester)},handlerBismeldestichtage:function(){this.startFetchCmpt($.getBismeldestichtage,null,this.fetchCmptDataFetchedBismeldestichtage)},handlerAddBismeldestichtag:function(t){this.startFetchCmpt($.addBismeldestichtag,{meldestichtag:this.meldestichtag,studiensemester_kurzbz:this.currSem},this.fetchCmptDataFetchedAddBismeldestichtag)},handlerDeleteBismeldestichtag:function(t){this.startFetchCmpt($.deleteBismeldestichtag,{meldestichtag_id:t},this.fetchCmptDataFetchedDeleteBismeldestichtag)},fetchCmptDataFetchedStudiensemester:function(t){if(y.isError(t)&&alert(y.getError(t)),y.hasData(t)){let e=y.getData(t);this.semList=e.semList,this.currSem=e.currSem,this.handlerBismeldestichtage()}else alert("No Studiensemester data")},fetchCmptDataFetchedBismeldestichtage:function(t){if(y.isError(t)&&alert(y.getError(t)),y.hasData(t)){this.$refs.bismeldestichtageTable.tabulator.setData(y.getData(t));let e=this.handlerDeleteBismeldestichtag,n=document.getElementsByClassName("delete-btn");for(let t in n)n[t].addEventListener&&n[t].addEventListener("click",function(){e(n[t].getAttribute("data-meldestichtag-id"))})}else this.$refs.bismeldestichtageTable.tabulator.setData([])},fetchCmptDataFetchedAddBismeldestichtag:function(t){y.isError(t)?alert(y.getError(t)):y.hasData(t)?this.handlerBismeldestichtage():alert("No response data")},fetchCmptDataFetchedDeleteBismeldestichtag:function(t){y.isError(t)?alert(y.getError(t)):y.hasData(t)?this.handlerBismeldestichtage():alert("No response data")},startFetchCmpt:function(t,e,n){this.fetchCmptApiFunction=t,null==e&&(e={}),this.fetchCmptApiFunctionParams=e,this.fetchCmptDataFetched=n,!0===this.fetchCmptRefresh?this.fetchCmptRefresh=!1:this.fetchCmptRefresh=!0}}}).use(nt).mount("#main"); //# sourceMappingURL=Bismeldestichtag.js.map diff --git a/public/dist/js/apps/Bismeldestichtag/Bismeldestichtag.js.map b/public/dist/js/apps/Bismeldestichtag/Bismeldestichtag.js.map index f931cd17c..1bc2971cf 100644 --- a/public/dist/js/apps/Bismeldestichtag/Bismeldestichtag.js.map +++ b/public/dist/js/apps/Bismeldestichtag/Bismeldestichtag.js.map @@ -1 +1 @@ -{"version":3,"file":"Bismeldestichtag.js","sources":["../../../../js/apps/Bismeldestichtag/BismeldestichtagHelper.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/api/factory/navigation.js","../../../../js/components/navigation/Navigation.js","../../../../js/RESTClient.js","../../../../js/apps/Bismeldestichtag/API.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/plugins/FhcAlert.js","../../../../js/plugins/Api.js","../../../../js/api/factory/phrasen.js","../../../../js/plugins/Phrasen.js","../../../../js/apps/Bismeldestichtag/Bismeldestichtag.js"],"sourcesContent":["/**\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\nexport const BismeldestichtagHelper = {\n\tformatDate: function(date) {\n\t\treturn date.replace(/(.*)-(.*)-(.*)/, '$3.$2.$1');\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\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","/**\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\tgetHeader(navigation_page) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/navigation/header',\n\t\t\tparams: { navigation_page }\n\t\t};\n\t},\n\tgetMenu(navigation_page) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/navigation/menu',\n\t\t\tparams: { navigation_page }\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\nimport {CoreFetchCmpt} from '../../components/Fetch.js';\nimport ApiNavigation from '../../api/factory/navigation.js';\n\n/**\n *\n */\nexport const CoreNavigationCmpt = {\n\tcomponents: {\n\t\tCoreFetchCmpt\n\t},\n\tprops: {\n\t\taddHeaderMenuEntries: Object, // property used to add new header menu entries from another app/component\n\t\taddSideMenuEntries: Object, // property used to add new side menu entries from another app/component\n\t\thideTopMenu: Boolean,\n\t\tleftNavCssClasses: {\n\t\t\ttype: String,\n\t\t\tdefault: 'navbar navbar-left-side'\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\theaderMenu: {}, // header menu entries\n\t\t\tsideMenu: {} // side menu entries\n\t\t};\n\t},\n\tcomputed: {\n\t\t/**\n\t\t *\n\t\t */\n\t\theaderMenuEntries() {\n\t\t\t//\n\t\t\tlet hm = this.headerMenu ? {...this.headerMenu} : {};\n\t\t\tif (this.headerMenu != null && this.addHeaderMenuEntries != null && Object.keys(this.addHeaderMenuEntries).length > 0)\n\t\t\t{\n\t\t\t\thm[this.addHeaderMenuEntries.description] = this.addHeaderMenuEntries;\n\t\t\t}\n\t\t\treturn hm;\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\tsideMenuEntries() {\n\t\t\t//\n\t\t\tlet sm = this.sideMenu ? {...this.sideMenu} : {};\n\t\t\tif (this.sideMenu != null && this.addSideMenuEntries != null && Object.keys(this.addSideMenuEntries).length > 0)\n\t\t\t{\n\t\t\t\tsm[this.addSideMenuEntries.description] = this.addSideMenuEntries;\n\t\t\t}\n\t\t\treturn sm;\n\t\t}\n\t},\n\tmethods: {\n\t\t/**\n\t\t *\n\t\t */\n\t\tgetNavigationPage() {\n\t\t\treturn FHC_JS_DATA_STORAGE_OBJECT.called_path + \"/\" + FHC_JS_DATA_STORAGE_OBJECT.called_method;\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\tfetchCmptApiFunctionHeader() {\n\t\t\treturn this.$api.call(ApiNavigation.getHeader(this.getNavigationPage()))\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\tfetchCmptApiFunctionSideMenu() {\n\t\t\treturn this.$api.call(ApiNavigation.getMenu(this.getNavigationPage()))\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\tfetchCmptDataFetchedHeader(data) {\n\t\t\tthis.headerMenu = data || {};\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\tfetchCmptDataFetchedMenu(data) {\n\t\t\tthis.sideMenu = data || {};\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\tgetDataBsToggle(header) {\n\t\t\treturn !header.children ? null : 'dropdown';\n\t\t}\n\t},\n\ttemplate: `\n\t\t\n\t\t\n\t\t\n\t\t\n\n\t\t\n\t\t\n\n\t\t\n\t\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// 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\nimport {CoreRESTClient} from '../../RESTClient.js';\n\n//\nconst CORE_BISMELDESTICHTAG_CMPT_TIMEOUT = 2000;\n\n/**\n *\n */\nexport const BismeldestichtagAPIs = {\n\t/**\n\t *\n\t */\n\tgetStudiensemester: function() {\n\t\treturn CoreRESTClient.get(\n\t\t\t'codex/Bismeldestichtag/getStudiensemester',\n\t\t\tnull,\n\t\t\t{\n\t\t\t\ttimeout: CORE_BISMELDESTICHTAG_CMPT_TIMEOUT\n\t\t\t}\n\t\t);\n\t},\n\tgetBismeldestichtage: function() {\n\t\treturn CoreRESTClient.get(\n\t\t\t'codex/Bismeldestichtag/getBismeldestichtage',\n\t\t\tnull,\n\t\t\t{\n\t\t\t\ttimeout: CORE_BISMELDESTICHTAG_CMPT_TIMEOUT\n\t\t\t}\n\t\t);\n\t},\n\taddBismeldestichtag: function(wsParams) {\n\t\treturn CoreRESTClient.post(\n\t\t\t'codex/Bismeldestichtag/addBismeldestichtag',\n\t\t\t{\n\t\t\t\tmeldestichtag: wsParams.meldestichtag,\n\t\t\t\tstudiensemester_kurzbz: wsParams.studiensemester_kurzbz\n\t\t\t},\n\t\t\t{\n\t\t\t\ttimeout: CORE_BISMELDESTICHTAG_CMPT_TIMEOUT\n\t\t\t}\n\t\t);\n\t},\n\tdeleteBismeldestichtag: function(wsParams) {\n\t\treturn CoreRESTClient.post(\n\t\t\t'codex/Bismeldestichtag/deleteBismeldestichtag',\n\t\t\t{\n\t\t\t\tmeldestichtag_id: wsParams.meldestichtag_id\n\t\t\t},\n\t\t\t{\n\t\t\t\ttimeout: CORE_BISMELDESTICHTAG_CMPT_TIMEOUT\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\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\tgetStudentProjektarbeiten(uid) {\n\t\treturn this.$fhcApi.get(\n\t\t\t`/api/frontend/v1/Lehre/getStudentProjektarbeiten/${uid}`\n\t\t\t, {}\n\t\t);\n\t},\n\tgetStudentProjektabgaben(detail) {\n\t\treturn this.$fhcApi.get(\n\t\t\t`/api/frontend/v1/Lehre/getStudentProjektabgaben`\n\t\t\t, {\n\t\t\t\tprojektarbeit_id: detail.projektarbeit_id,\n\t\t\t\tstudent_uid: detail.student_uid\n\t\t\t}\n\t\t);\n\t},\n\tpostStudentProjektarbeitEndupload(formData) {\n\t\tconst url = '/api/frontend/v1/Lehre/postStudentProjektarbeitEndupload';\n\t\tconst headers = {Headers: { \"Content-Type\": \"multipart/form-data\" }}\n\t\treturn this.$fhcApi.post(url, formData, headers)\n\t},\n\tpostStudentProjektarbeitZwischenabgabe(formData) {\n\t\tconst url = '/api/frontend/v1/Lehre/postStudentProjektarbeitZwischenabgabe';\n\t\tconst headers = {Headers: { \"Content-Type\": \"multipart/form-data\" }}\n\t\treturn this.$fhcApi.post(url, formData, headers)\n\t},\n\tgetStudentProjektarbeitAbgabeFile(paabgabe_id, student_uid) {\n\t\tconst url = `/Cis/Abgabetool/getStudentProjektarbeitAbgabeFile?paabgabe_id=${paabgabe_id}&student_uid=${student_uid}`;\n\n\t\twindow.location = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + url\n\t},\n\tgetMitarbeiterProjektarbeiten(uid, all) {\n\t\treturn this.$fhcApi.get(\n\t\t\t`/api/frontend/v1/Lehre/getMitarbeiterProjektarbeiten?showall=${all}`\n\t\t\t, {}\n\t\t);\n\t},\n\tpostProjektarbeitAbgabe(termin) {\n\t\tconst payload = {\n\t\t\tpaabgabe_id: termin.paabgabe_id,\n\t\t\tpaabgabetyp_kurzbz: termin.bezeichnung.paabgabetyp_kurzbz,\n\t\t\tdatum: termin.datum,\n\t\t\tfixtermin: termin.fixtermin,\n\t\t\tinsertvon: termin.insertvon,\n\t\t\tkurzbz: termin.kurzbz,\n\t\t\tprojektarbeit_id: termin.projektarbeit_id\n\t\t}\n\t\tconst url = '/api/frontend/v1/Lehre/postProjektarbeitAbgabe';\n\n\t\treturn this.$fhcApi.post(url, payload, null)\n\t\t\n\t},\n\tdeleteProjektarbeitAbgabe(paabgabe_id) {\n\t\tconst payload = {\n\t\t\tpaabgabe_id\n\t\t}\n\t\tconst url = '/api/frontend/v1/Lehre/deleteProjektarbeitAbgabe';\n\n\t\treturn this.$fhcApi.post(url, payload, null)\n\t},\n\tpostSerientermin(datum, paabgabetyp_kurzbz, bezeichnung, kurzbz, projektarbeit_ids) {\n\t\tconst payload = {\n\t\t\tdatum, paabgabetyp_kurzbz, bezeichnung, kurzbz, projektarbeit_ids\n\t\t}\n\t\tconst url = '/api/frontend/v1/Lehre/postSerientermin';\n\n\t\treturn this.$fhcApi.post(url, payload, null)\n\t},\n\tfetchDeadlines(person_id) {\n\t\tconst payload = {\n\t\t\tperson_id\n\t\t}\n\t\tconst url = '/api/frontend/v1/Lehre/fetchDeadlines';\n\n\t\treturn this.$fhcApi.post(url, payload, null)\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 * @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\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}","/**\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 {BismeldestichtagHelper} from './BismeldestichtagHelper.js';\n\nimport {CoreFilterCmpt} from '../../components/filter/Filter.js';\nimport {CoreNavigationCmpt} from '../../components/navigation/Navigation.js';\nimport {CoreRESTClient} from '../../RESTClient.js';\nimport {CoreFetchCmpt} from '../../components/Fetch.js';\nimport {BismeldestichtagAPIs} from './API.js';\n\nimport PluginsPhrasen from '../../plugins/Phrasen.js';\n\nconst bismeldestichtagApp = Vue.createApp({\n\tdata: function() {\n\t\treturn {\n\t\t\tbismeldestichtagTabulatorOptions: {\n\t\t\t\tmaxHeight: \"100%\",\n\t\t\t\tminHeight: 50,\n\t\t\t\tlayout: 'fitColumns',\n\t\t\t\tindex: 'meldestichtag_id',\n\t\t\t\tinitialSort:[\n\t\t\t\t\t{column:\"meldestichtag\", dir:\"desc\"}\n\t\t\t\t],\n\t\t\t\tcolumns: [\n\t\t\t\t\t{title: 'Meldestichtag', field: 'meldestichtag', headerFilter: true, formatter: function(cell){\n\t\t\t\t\t\t\treturn BismeldestichtagHelper.formatDate(cell.getValue());\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t{title: 'Studiensemester', field: 'studiensemester_kurzbz', headerFilter: true, sorter:function(a, b, aRow, bRow, column, dir, sorterParams) {\n\n\t\t\t\t\t\t\t//aRow, bRow - the row components for the values being compared\n\t\t\t\t\t\t\tlet semesterStartA = new Date(aRow.getData().semester_start);\n\t\t\t\t\t\t\tlet semesterStartB = new Date(bRow.getData().semester_start);\n\n\t\t\t\t\t\t\treturn semesterStartA - semesterStartB; // difference between studiensemester start dates\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t{title: 'Semesterstart',field: 'semester_start', headerFilter: true, visible: false, formatter: function(cell){\n\t\t\t\t\t\t\treturn BismeldestichtagHelper.formatDate(cell.getValue());\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t{title: 'ID', field: 'meldestichtag_id', headerFilter: true, visible: false},\n\t\t\t\t\t{title: 'Insertamum', field: 'insertamum', headerFilter: true, visible: false},\n\t\t\t\t\t{title: 'Insertvon', field: 'insertvon', headerFilter: true, visible: false},\n\t\t\t\t\t{title: 'Löschen', field: 'loeschen', headerFilter: false, formatter:function(cell){\n\t\t\t\t\t\t\treturn\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\tbismeldestichtagTabulatorEventHandlers: [\n\t\t\t\t{\n\t\t\t\t\tevent: \"rowClick\",\n\t\t\t\t\thandler: function(e, row) {\n\t\t\t\t\t\tif (e.target.nodeName == 'DIV') {\n\t\t\t\t\t\t\tlet data = row.getData();\n\t\t\t\t\t\t\talert(data.studiensemester_kurzbz + ': ' + BismeldestichtagHelper.formatDate(data.meldestichtag));\n\t\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\tevent: \"tableBuilt\",\n\t\t\t\t\thandler: () => {\n\t\t\t\t\t\tthis.handlerStudiensemester();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t],\n\t\t\tmeldestichtag: null, // date of Meldestichtag\n\t\t\tsemList: null, // all Studiensemester for dropdown\n\t\t\tcurrSem: null, // selected Studiensemester\n\t\t\tfetchCmptApiFunction: {}, // api function call\n\t\t\tfetchCmptApiFunctionParams: null, // parameters for api function call\n\t\t\tfetchCmptDataFetched: null, // function to execute after call\n\t\t\tfetchCmptRefresh: true // for refreshing\n\t\t};\n\t},\n\tcomponents: {\n\t\tCoreNavigationCmpt,\n\t\tCoreFilterCmpt,\n\t\tBismeldestichtagAPIs,\n\t\tCoreFetchCmpt,\n\t\t\"datepicker\": VueDatePicker\n\t},\n\tmethods: {\n\t\t/**\n\t\t * Define Studiensemester call and method to be executed after the call\n\t\t */\n\t\thandlerStudiensemester: function() {\n\t\t\tthis.startFetchCmpt(\n\t\t\t\tBismeldestichtagAPIs.getStudiensemester,\n\t\t\t\tnull,\n\t\t\t\tthis.fetchCmptDataFetchedStudiensemester\n\t\t\t);\n\t\t},\n\t\t/**\n\t\t * Define Studiensemester call and method to be executed after the call\n\t\t */\n\t\thandlerBismeldestichtage: function() {\n\t\t\tthis.startFetchCmpt(\n\t\t\t\tBismeldestichtagAPIs.getBismeldestichtage,\n\t\t\t\tnull,\n\t\t\t\tthis.fetchCmptDataFetchedBismeldestichtage\n\t\t\t);\n\t\t},\n\t\t/**\n\t\t * Define add Bismeldestichtag call and method to be executed after the call\n\t\t */\n\t\thandlerAddBismeldestichtag: function(event) {\n\t\t\tthis.startFetchCmpt(\n\t\t\t\tBismeldestichtagAPIs.addBismeldestichtag,\n\t\t\t\t{\n\t\t\t\t\tmeldestichtag: this.meldestichtag,\n\t\t\t\t\tstudiensemester_kurzbz: this.currSem\n\t\t\t\t},\n\t\t\t\tthis.fetchCmptDataFetchedAddBismeldestichtag\n\t\t\t);\n\t\t},\n\t\t/**\n\t\t * Define delete Bismeldestichtag call and method to be executed after the call\n\t\t */\n\t\thandlerDeleteBismeldestichtag: function(meldestichtag_id) {\n\t\t\tthis.startFetchCmpt(\n\t\t\t\tBismeldestichtagAPIs.deleteBismeldestichtag,\n\t\t\t\t{\n\t\t\t\t\tmeldestichtag_id: meldestichtag_id\n\t\t\t\t},\n\t\t\t\tthis.fetchCmptDataFetchedDeleteBismeldestichtag\n\t\t\t);\n\t\t},\n\t\t/**\n\t\t * Called after Studiensemester response is received\n\t\t */\n\t\tfetchCmptDataFetchedStudiensemester: function(data) {\n\t\t\tif (CoreRESTClient.isError(data)) alert(CoreRESTClient.getError(data));\n\t\t\tif (CoreRESTClient.hasData(data))\n\t\t\t{\n\t\t\t\tlet semRes = CoreRESTClient.getData(data);\n\t\t\t\tthis.semList = semRes.semList;\n\t\t\t\tthis.currSem = semRes.currSem;\n\t\t\t\tthis.handlerBismeldestichtage();\n\t\t\t}\n\t\t\telse\n\t\t\t\talert(\"No Studiensemester data\");\n\t\t},\n\t\t/**\n\t\t * Called after Bismeldestichtage response is received\n\t\t */\n\t\tfetchCmptDataFetchedBismeldestichtage: function(data) {\n\t\t\tif (CoreRESTClient.isError(data)) alert(CoreRESTClient.getError(data));\n\t\t\tif (CoreRESTClient.hasData(data))\n\t\t\t{\n\t\t\t\t// set the Meldestichtagedata\n\t\t\t\tthis.$refs.bismeldestichtageTable.tabulator.setData(CoreRESTClient.getData(data));\n\n\t\t\t\t// save delete Bismeldestichtag function\n\t\t\t\tlet funcDeleteBismeldestichtag = this.handlerDeleteBismeldestichtag;\n\n\t\t\t\tlet btns = document.getElementsByClassName('delete-btn');\n\n\t\t\t\t// add click events for deletion\n\t\t\t\tfor (let btn in btns)\n\t\t\t\t{\n\t\t\t\t\tif (btns[btn].addEventListener)\n\t\t\t\t\t{\n\t\t\t\t\t\tbtns[btn].addEventListener('click',\n\t\t\t\t\t\t\tfunction(){\n\t\t\t\t\t\t\t\tfuncDeleteBismeldestichtag(btns[btn].getAttribute('data-meldestichtag-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}\n\t\t\telse\n\t\t\t\tthis.$refs.bismeldestichtageTable.tabulator.setData([]);\n\t\t},\n\t\t/**\n\t\t * Called after Add Bismeldestichtag response is received\n\t\t */\n\t\tfetchCmptDataFetchedAddBismeldestichtag: function(data) {\n\t\t\tif (CoreRESTClient.isError(data))\n\t\t\t\talert(CoreRESTClient.getError(data));\n\t\t\telse if (CoreRESTClient.hasData(data))\n\t\t\t{\n\t\t\t\tthis.handlerBismeldestichtage();\n\t\t\t}\n\t\t\telse\n\t\t\t\talert(\"No response data\");\n\t\t},\n\t\t/**\n\t\t * Called after Add Bismeldestichtag response is received\n\t\t */\n\t\tfetchCmptDataFetchedDeleteBismeldestichtag: function(data) {\n\t\t\tif (CoreRESTClient.isError(data))\n\t\t\t\talert(CoreRESTClient.getError(data));\n\t\t\telse if (CoreRESTClient.hasData(data))\n\t\t\t{\n\t\t\t\tthis.handlerBismeldestichtage();\n\t\t\t}\n\t\t\telse\n\t\t\t\talert(\"No response data\");\n\t\t},\n\t\t/**\n\t\t * Used to start/refresh the FetchCmpt\n\t\t */\n\t\tstartFetchCmpt: function(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// 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\t}\n});\n\nbismeldestichtagApp.use(PluginsPhrasen).mount('#main');\n"],"names":["BismeldestichtagHelper","date","replace","CoreFetchCmpt","emits","props","refresh","type","Boolean","apiFunction","required","Function","apiFunctionParameters","watch","newValue","oldValue","this","fetchData","data","loading","error","errorMessage","created","methods","apiFunctionResult","Promise","then","successHandler","catch","errorHandler","finally","finallyHandler","setError","response","$emit","undefined","retval","message","template","FILTER_COMPONENT_NEW_FILTER","FilterConfig","filters","Array","default","columns","fields","switchFilter","applyFilterConfig","saveCustomFilter","currentFields","computed","types","reduce","a","c","toLowerCase","indexOf","name","n","evt","currentTarget","value","filteredFields","filter","el","condition","length","alert","addField","push","removeField","index","splice","FilterColumns","selected","names","Object","hide","show","selectedFields","toggle","field","DEFAULT_ICONS","jsonLines","xlsx","pdf","html","json","csv","DEFAULT_LABELS","TableDownload","tabulator","config","String","iconClass","currentConfig","prototype","toString","call","split","isArray","newConfig","k","v","stringToFileFormatter","icon","label","formatter","map","validateFileFormatter","input","lcInput","includes","window","XLSX","jspdf","jsPDF","autoTable","download","file","options","elementDataMap","WeakMap","collapseAutoClose","mounted","binding","open","set","contains","target","collapse","bootstrap","Collapse","getInstance","addEventListener","document","get","beforeUnmount","removeEventListener","collapsibleAutoHideFunc","Tabulator","extendModule","fitDataStretchFrozen","forced","colsWidth","tableWidth","table","rowManager","element","clientWidth","gap","lastCol","forEach","column","i","widthFixed","reinitializeWidth","responsiveLayout","modules","responsive","visible","definition","frozen","getWidth","modExists","setWidth","update","ApiFilter","wsParams","method","url","params","filterUniqueId","filterType","customFilterName","removeCustomFilter","filterId","applyFilterFields","filterFields","addFilterField","filterField","removeFilterField","getFilterById","getFilter","_uuid","CoreFilterCmpt","components","directives","onNwNewEntry","title","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","sort","headerFilter","group","page","notSelectedFields","x","filteredData","JSON","parse","stringify","filteredColumns","hasOwnProperty","col","resizable","fieldIdsForVisibilty","getColumns","def","getDefinition","getField","fieldNames","res","idExtra","columnsForFilter","filterTitles","reloadTable","setData","initTabulator","placeholder","$p","loadCategory","t","resolve","location","hash","slice","resolvePromiseFunc","setRenderData","startFetchCmpt","$api","layout","movableColumns","columnDefaults","tooltip","height","minHeight","maxHeight","selectable","dataTree","$refs","on","event","handler","toDelete","childIdx","child","appendChild","counter","cols","isVisible","_setHeaderFilter","updateTabulator","_updateTabulator","setColumns","clearFilters","getHeaderFilters","setHeaderFilterValue","clearFilter","render","j","setSideMenu","setDropDownMenu","personalFilters","filtersArray","filtersCount","link","id","filter_id","desc","onClickCall","handlerGetFilterById","subscriptDescription","subscriptLinkClass","subscriptLinkValue","onClickSubscriptCall","handlerRemoveCustomFilter","children","option","dataFetchedCallback","FHC_JS_DATA_STORAGE_OBJECT","called_path","called_method","handlerSaveCustomFilter","getAttribute","substring","attr","parentId","parentIdx","parent","_children","beforeCreate","$props","ApiNavigation","getHeader","navigation_page","getMenu","CoreNavigationCmpt","addHeaderMenuEntries","addSideMenuEntries","hideTopMenu","leftNavCssClasses","headerMenu","headerMenuEntries","hm","keys","sideMenuEntries","sm","getNavigationPage","fetchCmptApiFunctionHeader","fetchCmptApiFunctionSideMenu","fetchCmptDataFetchedHeader","fetchCmptDataFetchedMenu","getDataBsToggle","header","CORE_REST_CLIENT_ERROR","CORE_REST_CLIENT_RETVAL","CoreRESTClient","wsURL","wsParameters","axiosParameters","_axiosCall","post","isSuccess","isError","hasData","trim","getData","getError","getErrorCode","_generateRouterURI","uri","app_root","ci_router","_printDebug","parameters","errorThrown","axiosCallObj","timeout","prop","axios","CORE_BISMELDESTICHTAG_CMPT_TIMEOUT","BismeldestichtagAPIs","getStudiensemester","getBismeldestichtage","addBismeldestichtag","meldestichtag","studiensemester_kurzbz","deleteBismeldestichtag","meldestichtag_id","search","searchsettings","$fhcApi","searchAdvanced","searchdummy","phrasen$1","category","setLanguage","categories","language","payload","getLanguage","getActiveDbLanguages","navigation","filter$1","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","approve","reject","reopen","pause","unpause","object","approveObjection","denyObjection","profil","getView","uid","fotoSperre","isStudent","isMitarbeiter","getZustellAdresse","getZustellKontakt","getGemeinden","nation","zip","getAllNationen","profilUpdate","getStatus","getTopic","acceptProfilRequest","profil_update_id","status_message","topic","requested_change","denyProfilRequest","insertFile","dms","getProfilRequestFiles","requestID","selectProfilRequest","insertProfilRequest","fileID","updateProfilRequest","ID","deleteProfilRequest","lvPlan","getRoomInfo","ort_kurzbz","start_date","end_date","getStunden","getOrtReservierungen","getLvPlanReservierungen","getLehreinheitStudiensemester","lehreinheit_id","studiensemesterDateInterval","LvPlanEvents","lv_id","stv","verband","favorites","students","encodeURIComponent","getUri","prestudent","person","person_id","relative_path","getStg","setStg","studiengang_kz","konto","tabulatorConfig","self","ajaxURL","ajaxParams","modelValue","e","only_open","studiengang_kz_intern","stg_kz","ajaxRequestFunc","ajaxResponse","checkDoubles","form","confirmErrorHandler","insert","edit","delete","buchungsnr","getBuchungstypen","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","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_size","news","limit","getNewsRowCount","getNewsExtra","lehre","getStudentenMail","getLvInfo","getStudentPruefungen","getStudentProjektarbeiten","getStudentProjektabgaben","detail","projektarbeit_id","postStudentProjektarbeitEndupload","Headers","postStudentProjektarbeitZwischenabgabe","getStudentProjektarbeitAbgabeFile","paabgabe_id","getMitarbeiterProjektarbeiten","all","postProjektarbeitAbgabe","termin","paabgabetyp_kurzbz","bezeichnung","fixtermin","insertvon","kurzbz","deleteProjektarbeitAbgabe","postSerientermin","projektarbeit_ids","fetchDeadlines","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","tag","ampeln","confirm","ampel_id","studiengangInformation","getStudiengangByKz","menu","authinfo","getAuthUID","getAuthInfo","getAll","OldFhcApi","install","app","globalProperties","factory","console","warn","addEndpoints","_get_config","TypeError","clearValidation","setFeedback","_clean_return_value","result","meta","fhcApiAxios","baseURL","interceptors","request","use","FormData","values","every","item","FileList","File","newData","entries","nd","key","append","jsondata","errors","err","_defaultErrorHandlers","code","handled","$fhcAlert","alertDefault","responseURL","alertError","validation","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","bind","provide","helperAppContainer","createElement","helperApp","Vue","createApp","PvToast","PvConfirm","mailToUrl","slotProps","systemerror_mailto","openMessagecard","getOrCreateInstance","unmounted","parentElement","removeChild","showmaillink","PvConfig","PvConfirmationService","helperAppInstance","mount","body","FhcAlert","FhcPhrasen","alertSuccess","toast","add","summary","life","alertInfo","alertWarning","confirmDelete","$confirm","require","acceptLabel","acceptClass","rejectLabel","rejectClass","accept","sticky","alertMultiple","messageArray","handleSystemError","errMsg","toUpperCase","stack","handleSystemMessage","msg","resetFormValidation","Event","querySelectorAll","dispatchEvent","handleFormValidation","nodeType","Node","ELEMENT_NODE","notFound","querySelector","CustomEvent","arr","PluginsApi","_send_array_or_object","func","errs","DEFAULT_ERROR_CONFIG","success","fail","combine","async","_format_toast","_default","msgs","b","n_errors","get_config","clean_return_value","_merge_error_config","get_error_handler","formHandler","get_error_list","popHandleableErrors","copy","pop","newType","newTypeCombinesType","newTypeHasHandler","errorConfig","remaining","configoverwrite","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","val","match","p1","getValueForLoadedPhrase","PluginsPhrasen","cat","lang","bismeldestichtagTabulatorOptions","initialSort","dir","cell","getValue","sorter","aRow","bRow","sorterParams","Date","semester_start","getRow","getIndex","bismeldestichtagTabulatorEventHandlers","nodeName","handlerStudiensemester","semList","currSem","datepicker","VueDatePicker","fetchCmptDataFetchedStudiensemester","handlerBismeldestichtage","fetchCmptDataFetchedBismeldestichtage","handlerAddBismeldestichtag","fetchCmptDataFetchedAddBismeldestichtag","handlerDeleteBismeldestichtag","fetchCmptDataFetchedDeleteBismeldestichtag","semRes","bismeldestichtageTable","funcDeleteBismeldestichtag","btns","getElementsByClassName","btn"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"Bismeldestichtag.js","sources":["../../../../js/apps/Bismeldestichtag/BismeldestichtagHelper.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/api/factory/navigation.js","../../../../js/components/navigation/Navigation.js","../../../../js/RESTClient.js","../../../../js/apps/Bismeldestichtag/API.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/plugins/FhcAlert.js","../../../../js/plugins/Api.js","../../../../js/api/factory/phrasen.js","../../../../js/plugins/Phrasen.js","../../../../js/apps/Bismeldestichtag/Bismeldestichtag.js"],"sourcesContent":["/**\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\nexport const BismeldestichtagHelper = {\n\tformatDate: function(date) {\n\t\treturn date.replace(/(.*)-(.*)-(.*)/, '$3.$2.$1');\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\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","/**\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\tgetHeader(navigation_page) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/navigation/header',\n\t\t\tparams: { navigation_page }\n\t\t};\n\t},\n\tgetMenu(navigation_page) {\n\t\treturn {\n\t\t\tmethod: 'get',\n\t\t\turl: '/api/frontend/v1/navigation/menu',\n\t\t\tparams: { navigation_page }\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\nimport {CoreFetchCmpt} from '../../components/Fetch.js';\nimport ApiNavigation from '../../api/factory/navigation.js';\n\n/**\n *\n */\nexport const CoreNavigationCmpt = {\n\tcomponents: {\n\t\tCoreFetchCmpt\n\t},\n\tprops: {\n\t\taddHeaderMenuEntries: Object, // property used to add new header menu entries from another app/component\n\t\taddSideMenuEntries: Object, // property used to add new side menu entries from another app/component\n\t\thideTopMenu: Boolean,\n\t\tleftNavCssClasses: {\n\t\t\ttype: String,\n\t\t\tdefault: 'navbar navbar-left-side'\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\theaderMenu: {}, // header menu entries\n\t\t\tsideMenu: {} // side menu entries\n\t\t};\n\t},\n\tcomputed: {\n\t\t/**\n\t\t *\n\t\t */\n\t\theaderMenuEntries() {\n\t\t\t//\n\t\t\tlet hm = this.headerMenu ? {...this.headerMenu} : {};\n\t\t\tif (this.headerMenu != null && this.addHeaderMenuEntries != null && Object.keys(this.addHeaderMenuEntries).length > 0)\n\t\t\t{\n\t\t\t\thm[this.addHeaderMenuEntries.description] = this.addHeaderMenuEntries;\n\t\t\t}\n\t\t\treturn hm;\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\tsideMenuEntries() {\n\t\t\t//\n\t\t\tlet sm = this.sideMenu ? {...this.sideMenu} : {};\n\t\t\tif (this.sideMenu != null && this.addSideMenuEntries != null && Object.keys(this.addSideMenuEntries).length > 0)\n\t\t\t{\n\t\t\t\tsm[this.addSideMenuEntries.description] = this.addSideMenuEntries;\n\t\t\t}\n\t\t\treturn sm;\n\t\t}\n\t},\n\tmethods: {\n\t\t/**\n\t\t *\n\t\t */\n\t\tgetNavigationPage() {\n\t\t\treturn FHC_JS_DATA_STORAGE_OBJECT.called_path + \"/\" + FHC_JS_DATA_STORAGE_OBJECT.called_method;\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\tfetchCmptApiFunctionHeader() {\n\t\t\treturn this.$api.call(ApiNavigation.getHeader(this.getNavigationPage()))\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\tfetchCmptApiFunctionSideMenu() {\n\t\t\treturn this.$api.call(ApiNavigation.getMenu(this.getNavigationPage()))\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\tfetchCmptDataFetchedHeader(data) {\n\t\t\tthis.headerMenu = data || {};\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\tfetchCmptDataFetchedMenu(data) {\n\t\t\tthis.sideMenu = data || {};\n\t\t},\n\t\t/**\n\t\t *\n\t\t */\n\t\tgetDataBsToggle(header) {\n\t\t\treturn !header.children ? null : 'dropdown';\n\t\t}\n\t},\n\ttemplate: `\n\t\t\n\t\t\n\t\t\n\t\t\n\n\t\t\n\t\t\n\n\t\t\n\t\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// 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\nimport {CoreRESTClient} from '../../RESTClient.js';\n\n//\nconst CORE_BISMELDESTICHTAG_CMPT_TIMEOUT = 2000;\n\n/**\n *\n */\nexport const BismeldestichtagAPIs = {\n\t/**\n\t *\n\t */\n\tgetStudiensemester: function() {\n\t\treturn CoreRESTClient.get(\n\t\t\t'codex/Bismeldestichtag/getStudiensemester',\n\t\t\tnull,\n\t\t\t{\n\t\t\t\ttimeout: CORE_BISMELDESTICHTAG_CMPT_TIMEOUT\n\t\t\t}\n\t\t);\n\t},\n\tgetBismeldestichtage: function() {\n\t\treturn CoreRESTClient.get(\n\t\t\t'codex/Bismeldestichtag/getBismeldestichtage',\n\t\t\tnull,\n\t\t\t{\n\t\t\t\ttimeout: CORE_BISMELDESTICHTAG_CMPT_TIMEOUT\n\t\t\t}\n\t\t);\n\t},\n\taddBismeldestichtag: function(wsParams) {\n\t\treturn CoreRESTClient.post(\n\t\t\t'codex/Bismeldestichtag/addBismeldestichtag',\n\t\t\t{\n\t\t\t\tmeldestichtag: wsParams.meldestichtag,\n\t\t\t\tstudiensemester_kurzbz: wsParams.studiensemester_kurzbz\n\t\t\t},\n\t\t\t{\n\t\t\t\ttimeout: CORE_BISMELDESTICHTAG_CMPT_TIMEOUT\n\t\t\t}\n\t\t);\n\t},\n\tdeleteBismeldestichtag: function(wsParams) {\n\t\treturn CoreRESTClient.post(\n\t\t\t'codex/Bismeldestichtag/deleteBismeldestichtag',\n\t\t\t{\n\t\t\t\tmeldestichtag_id: wsParams.meldestichtag_id\n\t\t\t},\n\t\t\t{\n\t\t\t\ttimeout: CORE_BISMELDESTICHTAG_CMPT_TIMEOUT\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\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 * @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}","/**\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 {BismeldestichtagHelper} from './BismeldestichtagHelper.js';\n\nimport {CoreFilterCmpt} from '../../components/filter/Filter.js';\nimport {CoreNavigationCmpt} from '../../components/navigation/Navigation.js';\nimport {CoreRESTClient} from '../../RESTClient.js';\nimport {CoreFetchCmpt} from '../../components/Fetch.js';\nimport {BismeldestichtagAPIs} from './API.js';\n\nimport PluginsPhrasen from '../../plugins/Phrasen.js';\n\nconst bismeldestichtagApp = Vue.createApp({\n\tdata: function() {\n\t\treturn {\n\t\t\tbismeldestichtagTabulatorOptions: {\n\t\t\t\tmaxHeight: \"100%\",\n\t\t\t\tminHeight: 50,\n\t\t\t\tlayout: 'fitColumns',\n\t\t\t\tindex: 'meldestichtag_id',\n\t\t\t\tinitialSort:[\n\t\t\t\t\t{column:\"meldestichtag\", dir:\"desc\"}\n\t\t\t\t],\n\t\t\t\tcolumns: [\n\t\t\t\t\t{title: 'Meldestichtag', field: 'meldestichtag', headerFilter: true, formatter: function(cell){\n\t\t\t\t\t\t\treturn BismeldestichtagHelper.formatDate(cell.getValue());\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t{title: 'Studiensemester', field: 'studiensemester_kurzbz', headerFilter: true, sorter:function(a, b, aRow, bRow, column, dir, sorterParams) {\n\n\t\t\t\t\t\t\t//aRow, bRow - the row components for the values being compared\n\t\t\t\t\t\t\tlet semesterStartA = new Date(aRow.getData().semester_start);\n\t\t\t\t\t\t\tlet semesterStartB = new Date(bRow.getData().semester_start);\n\n\t\t\t\t\t\t\treturn semesterStartA - semesterStartB; // difference between studiensemester start dates\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t{title: 'Semesterstart',field: 'semester_start', headerFilter: true, visible: false, formatter: function(cell){\n\t\t\t\t\t\t\treturn BismeldestichtagHelper.formatDate(cell.getValue());\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t{title: 'ID', field: 'meldestichtag_id', headerFilter: true, visible: false},\n\t\t\t\t\t{title: 'Insertamum', field: 'insertamum', headerFilter: true, visible: false},\n\t\t\t\t\t{title: 'Insertvon', field: 'insertvon', headerFilter: true, visible: false},\n\t\t\t\t\t{title: 'Löschen', field: 'loeschen', headerFilter: false, formatter:function(cell){\n\t\t\t\t\t\t\treturn\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\tbismeldestichtagTabulatorEventHandlers: [\n\t\t\t\t{\n\t\t\t\t\tevent: \"rowClick\",\n\t\t\t\t\thandler: function(e, row) {\n\t\t\t\t\t\tif (e.target.nodeName == 'DIV') {\n\t\t\t\t\t\t\tlet data = row.getData();\n\t\t\t\t\t\t\talert(data.studiensemester_kurzbz + ': ' + BismeldestichtagHelper.formatDate(data.meldestichtag));\n\t\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\tevent: \"tableBuilt\",\n\t\t\t\t\thandler: () => {\n\t\t\t\t\t\tthis.handlerStudiensemester();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t],\n\t\t\tmeldestichtag: null, // date of Meldestichtag\n\t\t\tsemList: null, // all Studiensemester for dropdown\n\t\t\tcurrSem: null, // selected Studiensemester\n\t\t\tfetchCmptApiFunction: {}, // api function call\n\t\t\tfetchCmptApiFunctionParams: null, // parameters for api function call\n\t\t\tfetchCmptDataFetched: null, // function to execute after call\n\t\t\tfetchCmptRefresh: true // for refreshing\n\t\t};\n\t},\n\tcomponents: {\n\t\tCoreNavigationCmpt,\n\t\tCoreFilterCmpt,\n\t\tBismeldestichtagAPIs,\n\t\tCoreFetchCmpt,\n\t\t\"datepicker\": VueDatePicker\n\t},\n\tmethods: {\n\t\t/**\n\t\t * Define Studiensemester call and method to be executed after the call\n\t\t */\n\t\thandlerStudiensemester: function() {\n\t\t\tthis.startFetchCmpt(\n\t\t\t\tBismeldestichtagAPIs.getStudiensemester,\n\t\t\t\tnull,\n\t\t\t\tthis.fetchCmptDataFetchedStudiensemester\n\t\t\t);\n\t\t},\n\t\t/**\n\t\t * Define Studiensemester call and method to be executed after the call\n\t\t */\n\t\thandlerBismeldestichtage: function() {\n\t\t\tthis.startFetchCmpt(\n\t\t\t\tBismeldestichtagAPIs.getBismeldestichtage,\n\t\t\t\tnull,\n\t\t\t\tthis.fetchCmptDataFetchedBismeldestichtage\n\t\t\t);\n\t\t},\n\t\t/**\n\t\t * Define add Bismeldestichtag call and method to be executed after the call\n\t\t */\n\t\thandlerAddBismeldestichtag: function(event) {\n\t\t\tthis.startFetchCmpt(\n\t\t\t\tBismeldestichtagAPIs.addBismeldestichtag,\n\t\t\t\t{\n\t\t\t\t\tmeldestichtag: this.meldestichtag,\n\t\t\t\t\tstudiensemester_kurzbz: this.currSem\n\t\t\t\t},\n\t\t\t\tthis.fetchCmptDataFetchedAddBismeldestichtag\n\t\t\t);\n\t\t},\n\t\t/**\n\t\t * Define delete Bismeldestichtag call and method to be executed after the call\n\t\t */\n\t\thandlerDeleteBismeldestichtag: function(meldestichtag_id) {\n\t\t\tthis.startFetchCmpt(\n\t\t\t\tBismeldestichtagAPIs.deleteBismeldestichtag,\n\t\t\t\t{\n\t\t\t\t\tmeldestichtag_id: meldestichtag_id\n\t\t\t\t},\n\t\t\t\tthis.fetchCmptDataFetchedDeleteBismeldestichtag\n\t\t\t);\n\t\t},\n\t\t/**\n\t\t * Called after Studiensemester response is received\n\t\t */\n\t\tfetchCmptDataFetchedStudiensemester: function(data) {\n\t\t\tif (CoreRESTClient.isError(data)) alert(CoreRESTClient.getError(data));\n\t\t\tif (CoreRESTClient.hasData(data))\n\t\t\t{\n\t\t\t\tlet semRes = CoreRESTClient.getData(data);\n\t\t\t\tthis.semList = semRes.semList;\n\t\t\t\tthis.currSem = semRes.currSem;\n\t\t\t\tthis.handlerBismeldestichtage();\n\t\t\t}\n\t\t\telse\n\t\t\t\talert(\"No Studiensemester data\");\n\t\t},\n\t\t/**\n\t\t * Called after Bismeldestichtage response is received\n\t\t */\n\t\tfetchCmptDataFetchedBismeldestichtage: function(data) {\n\t\t\tif (CoreRESTClient.isError(data)) alert(CoreRESTClient.getError(data));\n\t\t\tif (CoreRESTClient.hasData(data))\n\t\t\t{\n\t\t\t\t// set the Meldestichtagedata\n\t\t\t\tthis.$refs.bismeldestichtageTable.tabulator.setData(CoreRESTClient.getData(data));\n\n\t\t\t\t// save delete Bismeldestichtag function\n\t\t\t\tlet funcDeleteBismeldestichtag = this.handlerDeleteBismeldestichtag;\n\n\t\t\t\tlet btns = document.getElementsByClassName('delete-btn');\n\n\t\t\t\t// add click events for deletion\n\t\t\t\tfor (let btn in btns)\n\t\t\t\t{\n\t\t\t\t\tif (btns[btn].addEventListener)\n\t\t\t\t\t{\n\t\t\t\t\t\tbtns[btn].addEventListener('click',\n\t\t\t\t\t\t\tfunction(){\n\t\t\t\t\t\t\t\tfuncDeleteBismeldestichtag(btns[btn].getAttribute('data-meldestichtag-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}\n\t\t\telse\n\t\t\t\tthis.$refs.bismeldestichtageTable.tabulator.setData([]);\n\t\t},\n\t\t/**\n\t\t * Called after Add Bismeldestichtag response is received\n\t\t */\n\t\tfetchCmptDataFetchedAddBismeldestichtag: function(data) {\n\t\t\tif (CoreRESTClient.isError(data))\n\t\t\t\talert(CoreRESTClient.getError(data));\n\t\t\telse if (CoreRESTClient.hasData(data))\n\t\t\t{\n\t\t\t\tthis.handlerBismeldestichtage();\n\t\t\t}\n\t\t\telse\n\t\t\t\talert(\"No response data\");\n\t\t},\n\t\t/**\n\t\t * Called after Add Bismeldestichtag response is received\n\t\t */\n\t\tfetchCmptDataFetchedDeleteBismeldestichtag: function(data) {\n\t\t\tif (CoreRESTClient.isError(data))\n\t\t\t\talert(CoreRESTClient.getError(data));\n\t\t\telse if (CoreRESTClient.hasData(data))\n\t\t\t{\n\t\t\t\tthis.handlerBismeldestichtage();\n\t\t\t}\n\t\t\telse\n\t\t\t\talert(\"No response data\");\n\t\t},\n\t\t/**\n\t\t * Used to start/refresh the FetchCmpt\n\t\t */\n\t\tstartFetchCmpt: function(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// 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\t}\n});\n\nbismeldestichtagApp.use(PluginsPhrasen).mount('#main');\n"],"names":["BismeldestichtagHelper","date","replace","CoreFetchCmpt","emits","props","refresh","type","Boolean","apiFunction","required","Function","apiFunctionParameters","watch","newValue","oldValue","this","fetchData","data","loading","error","errorMessage","created","methods","apiFunctionResult","Promise","then","successHandler","catch","errorHandler","finally","finallyHandler","setError","response","$emit","undefined","retval","message","template","FILTER_COMPONENT_NEW_FILTER","FilterConfig","filters","Array","default","columns","fields","switchFilter","applyFilterConfig","saveCustomFilter","currentFields","computed","types","reduce","a","c","toLowerCase","indexOf","name","n","evt","currentTarget","value","filteredFields","filter","el","condition","length","alert","addField","push","removeField","index","splice","FilterColumns","selected","names","Object","hide","show","selectedFields","toggle","field","DEFAULT_ICONS","jsonLines","xlsx","pdf","html","json","csv","DEFAULT_LABELS","TableDownload","tabulator","config","String","iconClass","currentConfig","prototype","toString","call","split","isArray","newConfig","k","v","stringToFileFormatter","icon","label","formatter","map","validateFileFormatter","input","lcInput","includes","window","XLSX","jspdf","jsPDF","autoTable","download","file","options","elementDataMap","WeakMap","collapseAutoClose","mounted","binding","open","set","contains","target","collapse","bootstrap","Collapse","getInstance","addEventListener","document","get","beforeUnmount","removeEventListener","collapsibleAutoHideFunc","Tabulator","extendModule","fitDataStretchFrozen","forced","colsWidth","tableWidth","table","rowManager","element","clientWidth","gap","lastCol","forEach","column","i","widthFixed","reinitializeWidth","responsiveLayout","modules","responsive","visible","definition","frozen","getWidth","modExists","setWidth","update","ApiFilter","wsParams","method","url","params","filterUniqueId","filterType","customFilterName","removeCustomFilter","filterId","applyFilterFields","filterFields","addFilterField","filterField","removeFilterField","getFilterById","getFilter","_uuid","CoreFilterCmpt","components","directives","onNwNewEntry","title","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","sort","headerFilter","group","page","notSelectedFields","x","filteredData","JSON","parse","stringify","filteredColumns","hasOwnProperty","col","resizable","fieldIdsForVisibilty","getColumns","def","getDefinition","getField","fieldNames","res","idExtra","columnsForFilter","filterTitles","reloadTable","setData","initTabulator","placeholder","$p","loadCategory","t","resolve","location","hash","slice","resolvePromiseFunc","setRenderData","startFetchCmpt","$api","layout","movableColumns","columnDefaults","tooltip","height","minHeight","maxHeight","selectable","dataTree","$refs","on","event","handler","toDelete","childIdx","child","appendChild","counter","cols","isVisible","_setHeaderFilter","updateTabulator","_updateTabulator","setColumns","clearFilters","getHeaderFilters","setHeaderFilterValue","clearFilter","render","j","setSideMenu","setDropDownMenu","personalFilters","filtersArray","filtersCount","link","id","filter_id","desc","onClickCall","handlerGetFilterById","subscriptDescription","subscriptLinkClass","subscriptLinkValue","onClickSubscriptCall","handlerRemoveCustomFilter","children","option","dataFetchedCallback","FHC_JS_DATA_STORAGE_OBJECT","called_path","called_method","handlerSaveCustomFilter","getAttribute","substring","attr","parentId","parentIdx","parent","_children","beforeCreate","$props","ApiNavigation","getHeader","navigation_page","getMenu","CoreNavigationCmpt","addHeaderMenuEntries","addSideMenuEntries","hideTopMenu","leftNavCssClasses","headerMenu","headerMenuEntries","hm","keys","sideMenuEntries","sm","getNavigationPage","fetchCmptApiFunctionHeader","fetchCmptApiFunctionSideMenu","fetchCmptDataFetchedHeader","fetchCmptDataFetchedMenu","getDataBsToggle","header","CORE_REST_CLIENT_ERROR","CORE_REST_CLIENT_RETVAL","CoreRESTClient","wsURL","wsParameters","axiosParameters","_axiosCall","post","isSuccess","isError","hasData","trim","getData","getError","getErrorCode","_generateRouterURI","uri","app_root","ci_router","_printDebug","parameters","errorThrown","axiosCallObj","timeout","prop","axios","CORE_BISMELDESTICHTAG_CMPT_TIMEOUT","BismeldestichtagAPIs","getStudiensemester","getBismeldestichtage","addBismeldestichtag","meldestichtag","studiensemester_kurzbz","deleteBismeldestichtag","meldestichtag_id","search","searchsettings","$fhcApi","searchAdvanced","searchdummy","phrasen$1","category","setLanguage","categories","language","payload","getLanguage","getActiveDbLanguages","navigation","filter$1","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","approve","reject","reopen","pause","unpause","object","approveObjection","denyObjection","profil","getView","uid","fotoSperre","isStudent","isMitarbeiter","getZustellAdresse","getZustellKontakt","getGemeinden","nation","zip","getAllNationen","profilUpdate","getStatus","getTopic","acceptProfilRequest","profil_update_id","status_message","topic","requested_change","denyProfilRequest","insertFile","dms","getProfilRequestFiles","requestID","selectProfilRequest","insertProfilRequest","fileID","updateProfilRequest","ID","deleteProfilRequest","lvPlan","getRoomInfo","ort_kurzbz","start_date","end_date","getStunden","getOrtReservierungen","getLvPlanReservierungen","getLehreinheitStudiensemester","lehreinheit_id","studiensemesterDateInterval","LvPlanEvents","lv_id","stv","verband","favorites","students","encodeURIComponent","getUri","prestudent","person","person_id","relative_path","getStg","setStg","studiengang_kz","konto","tabulatorConfig","self","ajaxURL","ajaxParams","modelValue","e","only_open","studiengang_kz_intern","stg_kz","ajaxRequestFunc","ajaxResponse","checkDoubles","form","confirmErrorHandler","insert","edit","delete","buchungsnr","getBuchungstypen","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","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_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","tag","ampeln","all","confirm","ampel_id","studiengangInformation","getStudiengangByKz","menu","authinfo","getAuthUID","getAuthInfo","getAll","OldFhcApi","install","app","globalProperties","factory","console","warn","addEndpoints","_get_config","TypeError","clearValidation","setFeedback","_clean_return_value","result","meta","fhcApiAxios","baseURL","interceptors","request","use","FormData","values","every","item","FileList","File","newData","entries","nd","key","append","jsondata","errors","err","_defaultErrorHandlers","code","handled","$fhcAlert","alertDefault","responseURL","alertError","validation","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","bind","provide","helperAppContainer","createElement","helperApp","Vue","createApp","PvToast","PvConfirm","mailToUrl","slotProps","systemerror_mailto","detail","openMessagecard","getOrCreateInstance","unmounted","parentElement","removeChild","showmaillink","PvConfig","PvConfirmationService","helperAppInstance","mount","body","FhcAlert","FhcPhrasen","alertSuccess","toast","add","summary","life","alertInfo","alertWarning","confirmDelete","$confirm","require","acceptLabel","acceptClass","rejectLabel","rejectClass","accept","sticky","alertMultiple","messageArray","handleSystemError","errMsg","toUpperCase","stack","handleSystemMessage","msg","resetFormValidation","Event","querySelectorAll","dispatchEvent","handleFormValidation","nodeType","Node","ELEMENT_NODE","notFound","querySelector","CustomEvent","arr","PluginsApi","_send_array_or_object","func","errs","DEFAULT_ERROR_CONFIG","success","fail","combine","async","_format_toast","_default","msgs","b","n_errors","get_config","clean_return_value","_merge_error_config","get_error_handler","formHandler","get_error_list","popHandleableErrors","copy","pop","newType","newTypeCombinesType","newTypeHasHandler","errorConfig","remaining","configoverwrite","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","val","match","p1","getValueForLoadedPhrase","PluginsPhrasen","cat","lang","bismeldestichtagTabulatorOptions","initialSort","dir","cell","getValue","sorter","aRow","bRow","sorterParams","Date","semester_start","getRow","getIndex","bismeldestichtagTabulatorEventHandlers","nodeName","handlerStudiensemester","semList","currSem","datepicker","VueDatePicker","fetchCmptDataFetchedStudiensemester","handlerBismeldestichtage","fetchCmptDataFetchedBismeldestichtage","handlerAddBismeldestichtag","fetchCmptDataFetchedAddBismeldestichtag","handlerDeleteBismeldestichtag","fetchCmptDataFetchedDeleteBismeldestichtag","semRes","bismeldestichtageTable","funcDeleteBismeldestichtag","btns","getElementsByClassName","btn"],"mappings":"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"} \ No newline at end of file diff --git a/public/dist/js/apps/Cis.js b/public/dist/js/apps/Cis.js index 03b62dcc7..ed8d81cec 100644 --- a/public/dist/js/apps/Cis.js +++ b/public/dist/js/apps/Cis.js @@ -1,4 +1,4 @@ -import t from"../../../../index.ci.php/public/js/components/primevue/config/config.esm.min.js?2025111701";import e from"../../../../index.ci.php/public/js/components/primevue/toast/toast.esm.min.js?2025111701";import r from"../../../../index.ci.php/public/js/components/primevue/confirmdialog/confirmdialog.esm.min.js?2025111701";import n from"../../../../index.ci.php/public/js/components/primevue/confirmationservice/confirmationservice.esm.min.js?2025111701";var s={name:"SearchbarResultTemplateAction",emits:["actionexecuted"],props:{res:Object,action:Object},computed:{actionHref(){return"link"!==this.action.type?"javascript:void(0);":"function"==typeof this.action.action?this.action.action(this.res):this.action.action}},methods:{actionFunc(){"function"===this.action.type&&this.action.action(this.res),this.$emit("actionexecuted")},renderif:function(){return void 0===this.action?.renderif||this.action.renderif(this.res)}},template:'\n\t\n\t'},a={name:"SearchbarResultTemplateFrame",components:{ResultAction:s,ResultActions:{name:"SearchbarResultTemplateActions",components:{ResultAction:s},emits:["actionexecuted"],props:{res:Object,actions:Array},methods:{renderif:function(t){return void 0===t?.renderif||t.renderif(this.res)}},template:'\n\t
    \n\t\t\n\t
    '}},emits:["actionexecuted"],props:{res:Object,actions:Object,title:String,image:String,imageFallback:String},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\t
    \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\t
    \n\t\t\t\t\n\t\t\t\t\t{{ title }}\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t
    \n\t
    '},i={name:"SearchbarResultPerson",components:{TemplateFrame:a},emits:["actionexecuted"],props:{res:Object,actions:Object},computed:{emails(){return new Set(this.res.email)}},template:'\n\t\n\t\t
    \n\t\t\t
    \n\t\t\t\t
    {{ $p.t(\'person/person_id\') }}
    \n\t\t\t\t
    \n\t\t\t\t\t{{ res.person_id }}\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    {{ $p.t(\'search/result_emails\') }}
    \n\t\t\t\t\n\t\t\t
    \n\t\t
    \n\t'},o={name:"SearchbarResultRoom",components:{TemplateFrame:a},emits:["actionexecuted"],props:{mode:String,res:Object,actions:Object},computed:{equipment(){return this.res.equipment?this.res.equipment.replace(new RegExp("
    ","ig"),""):""},address(){let t=this.res.zip||"";return this.res.city&&(t+=(t?" ":"")+this.res.city),this.res.street&&(t+=(t?", ":"")+this.res.street),this.res.floor&&(t+=(t?" / ":"")+this.$p.t("search/result_address_floor",this.res)),t||this.$p.t("search/result_address_none")}},template:'\n\t\n\t\t
    \n\t\t\t
    \n\t\t\t\t
    {{ $p.t(\'search/result_room_address\') }}
    \n\t\t\t\t
    \n\t\t\t\t\t{{ address }}\n\t\t\t\t
    \n\t\t\t
    \n\n\t\t\t
    \n\t\t\t\t
    {{ $p.t(\'search/result_workplaces\') }}
    \n\t\t\t\t
    \n\t\t\t\t\t{{ res.sitzplaetze }}\n\t\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\n\t\t\t
    \n\t\t\t\t
    {{ $p.t(\'search/result_building\') }}
    \n\t\t\t\t
    \n\t\t\t\t\t{{ res.building }}\n\t\t\t\t
    \n\t\t\t
    \n\n\t\t\t
    \n\t\t\t\t
    {{ $p.t(\'search/result_equipment\') }}
    \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
    \n\t'},l={name:"SearchbarResultEmployee",components:{TemplateFrame:a},emits:["actionexecuted"],props:{res:Object,actions:Object},template:'\n\t\n\t\t
    \n\t\t\t
    \n\t\t\t\t
    {{ $p.t(\'search/result_stdkst\') }}
    \n\t\t\t\t
    \n\t\t\t\t\t
      \n\t\t\t\t\t\t
    • {{ stdkst }}
    • \n\t\t\t\t\t
    \n\t\t\t\t\t{{ $p.t(\'search/result_stdkst_none\') }}\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    {{ $p.t(\'lehre/organisationseinheit\') }}
    \n\t\t\t\t
    \n\t\t\t\t\t
      \n\t\t\t\t\t\t
    • {{ oe }}
    • \n\t\t\t\t\t
    \n\t\t\t\t\t{{ $p.t(\'search/result_oe_none\') }}\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    {{ $p.t(\'search/result_emails\') }}
    \n\t\t\t\t\n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    {{ $p.t(\'person/telefon\') }}
    \n\t\t\t\t\n\t\t\t
    \n\t\t
    \n\t'},c={name:"SearchbarResultOrganistationunit",components:{TemplateFrame:a},emits:["actionexecuted"],props:{res:Object,actions:Object},template:'\n\t\n\t\t
    \n\t\t\t
    \n\t\t\t\t
    {{ $p.t(\'search/result_parent_oe\') }}
    \n\t\t\t\t
    \n\t\t\t\t\t{{ res.parentoe_name }}\n\t\t\t\t
    \n\t\t\t
    \n\n\t\t\t
    \n\t\t\t\t
    {{ $p.t(\'search/result_group_emails\') }}
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t{{ res.mailgroup }}\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\t\t\t\t
    {{ $p.t(\'search/result_leader\') }}
    \n\t\t\t\t
    \n\t\t\t\t\t
      \n\t\t\t\t\t\t
    • {{ leader.name }}
    • \n\t\t\t\t\t
    \n\t\t\t\t\t{{ $p.t(\'search/result_leader_none\') }}\n\t\t\t\t
    \n\t\t\t
    \n\n\t\t\t
    \n\t\t\t\t
    {{ $p.t(\'search/result_number_of_employees\') }}
    \n\t\t\t\t
    \n\t\t\t\t\t{{ res.number_of_people }}\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t'},d={name:"SearchbarResultStudent",components:{TemplateFrame:a},emits:["actionexecuted"],props:{mode:String,res:Object,actions:Object},computed:{photo_url(){return"simple"!=this.mode?this.res.photo_url:this.res.foto?"data:image/jpeg;base64,"+this.res.foto:null},emails(){return"simple"==this.mode?new Set([this.res.email]):new Set(this.res.email)}},template:'\n\t\n\t\t
    \n\t\t\t
    \n\t\t\t\t
    {{ $p.t(\'search/result_student_uid\') }}
    \n\t\t\t\t
    \n\t\t\t\t\t{{ res.uid }}\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    {{ $p.t(\'person/person_id\') }}
    \n\t\t\t\t
    \n\t\t\t\t\t{{ res.person_id }}\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    {{ $p.t(\'person/matrikelnummer\') }}
    \n\t\t\t\t
    \n\t\t\t\t\t{{ res.matrikelnr }}\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    {{ $p.t(\'search/result_emails\') }}
    \n\t\t\t\t\n\t\t\t
    \n\t\t
    \n\t'},u={name:"SearchbarResultPrestudent",components:{TemplateFrame:a},emits:["actionexecuted"],props:{mode:String,res:Object,actions:Object},computed:{title(){return"simple"==this.mode?this.res.name:this.res.name+" ("+this.res.status+" "+this.res.stg_kuerzel+")"},photo_url(){return"simple"!=this.mode?this.res.photo_url:this.res.foto?"data:image/jpeg;base64,"+this.res.foto:null},emails(){return"simple"==this.mode?new Set([this.res.email]):new Set(this.res.email)}},template:'\n\t\n\t\t
    \n\t\t\t
    \n\t\t\t\t
    {{ $p.t(\'person/person_id\') }}
    \n\t\t\t\t
    \n\t\t\t\t\t{{ res.person_id }}\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    {{ $p.t(\'search/result_emails\') }}
    \n\t\t\t\t\n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    {{ $p.t(\'search/result_student_uid\') }}
    \n\t\t\t\t
    \n\t\t\t\t\t{{ res.uid }}\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    {{ $p.t(\'person/matrikelnummer\') }}
    \n\t\t\t\t
    \n\t\t\t\t\t{{ res.matrikelnr }}\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    {{ $p.t(\'search/result_prestudent_id\') }}
    \n\t\t\t\t
    \n\t\t\t\t\t{{ res.prestudent_id }}\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    {{ $p.t(\'lehre/studiengang\') }}
    \n\t\t\t\t
    \n\t\t\t\t\t{{ res.bezeichnung }} {{ res.orgform ? \'(\' + res.orgform + \')\' : \'\' }}\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t'},p={name:"SearchbarResultDms",components:{TemplateFrame:a},emits:["actionexecuted"],props:{res:Object,actions:Object},computed:{icon(){switch(this.res.mimetype){case"application/pdf":return"file-pdf";case"application/vnd.openxmlformats-officedocument.wordprocessingml.document":case"application/msword":return"file-word";case"application/vnd.openxmlformats-officedocument.presentationml.presentation":case"application/mspowerpoint":return"file-powerpoint";case"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":case"application/vnd.ms-excel":return"file-excel";case"application/x-zip":case"application/zip":return"file-zipper";case"image/jpeg":case"image/gif":case"image/png":return"file-image";default:return"file"}}},template:'\n\t\n\t\t
    \n\t\t\t
    \n\t\t\t\t
    {{ $p.t(\'search/result_dms_id\') }}
    \n\t\t\t\t
    \n\t\t\t\t\t{{ res.dms_id }}\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    {{ $p.t(\'search/result_version\') }}
    \n\t\t\t\t
    \n\t\t\t\t\t{{ res.version }}\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    {{ $p.t(\'search/result_keywords\') }}
    \n\t\t\t\t
    \n\t\t\t\t\t{{ res.keywords }}\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    {{ $p.t(\'global/beschreibung\') }}
    \n\t\t\t\t
    \n\t\t\t\t\t{{ res.description }}\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t'},h={name:"SearchbarResultCms",components:{TemplateFrame:a},emits:["actionexecuted"],props:{res:Object,actions:Object},inject:["query"],computed:{preview(){if("redirect"!=this.res.template_kurzbz){let t=this.res.content.replace(//gi,"").replace(/<[^>]+>/gi,"").replace(/^\s+|\s+$/g,"");if(t.length>1e3){let e=t.toLowerCase(),r=Math.min(this.query.split(" ").reduce((t,r)=>{if("or"==r)return t;let n=r.indexOf(":");if(n<0||n>0&&["content","inhalt"].includes(r.split(":")[0])){let n=e.indexOf(r);n>=0&&t.push(n)}return t},[]));if(r){if(!(r+997>=t.length))return"..."+t.substr(r,994)+"...";if(r=t.length-997,r>0)return"..."+t.substr(r,997)}t=t.substr(0,997)+"..."}return t}let t=this.res.content_url;return"../index.ci.php/"==t.substr(0,16)?t=this.$fhcApi.getUri(t.substr(16)):"../"==t.substr(0,3)&&(t=FHC_JS_DATA_STORAGE_OBJECT.app_root.replace(/\/+$/,"")+t.substr(2)),''+t+""}},template:'\n\t\n\t\t
    \n\t\t
    \n\t\t\t{{ $p.t(\'search/result_content_none\') }}\n\t\t
    \n\t'},f={name:"SearchbarResultMergedstudent",components:{ResultPrestudent:u,ResultStudent:d},emits:["actionexecuted"],props:{mode:String,res:Object,actions:Object},computed:{prestudent(){return this.res.list.filter(t=>"prestudent"==t.type).pop()}},template:'\n\t\n\t'},g={name:"SearchbarResultMergedperson",components:{TemplateFrame:a,TemplateAction:s},emits:["actionexecuted"],props:{mode:String,res:Object,actions:Object},computed:{person(){const t=this.res.list.reduce((t,e)=>[...t,...Array.isArray(e.email)?e.email:[e.email]],[]),e=this.res.list.find(t=>"person"==t.type);if(e)return{...e,email:t};const{person_id:r,name:n}=this.res.list[0];let s;if("simple"==this.mode){let t=(this.students?this.students.find(t=>t.foto):null)?.foto;t&&(t="data:image/jpeg;base64,"+t),s=t||this.employee?.photo_url}else s=((this.students?this.students.find(t=>t.photo_url):null)||this.employee)?.photo_url;return{person_id:r,name:n,photo_url:s,email:t}},employee(){return this.res.list.find(t=>["employee","unassigned_employee","mitarbeiter","mitarbeiter_ohne_zuordnung"].includes(t.type))||null},students(){const t=this.res.list.filter(t=>["student","prestudent","studentcis","studentStv"].includes(t.type)).filter((t,e,r)=>{if("prestudent"===t.type)return!0;return!r.some(e=>e.uid===t.uid&&"prestudent"===e.type)}).sort((t,e)=>(t.sort||0)-(e.sort||0));return t.length?t:null},emails(){return new Set(this.person.email)},telurl(){return"tel:"+this.employee?.phone},inaktiv(){return this.res.list.some(t=>!1===t?.aktiv)}},template:'\n\t\n\t\t
    \n\t\t\t
    \n\t\t\t\t
    {{ $p.t(\'person/person_id\') }}
    \n\t\t\t\t
    \n\t\t\t\t\t{{ person.person_id }}\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    {{ $p.t(\'search/result_emails\') }}
    \n\t\t\t\t\n\t\t\t
    \n\n\t\t\t\n\n\t\t\t\n\t\t
    \n\t'},v={name:"FhcSearchbar",components:{person:i,room:o,employee:l,organisationunit:c,student:d,prestudent:u,dms:p,cms:h,mergedStudent:f,mergedPerson:g},props:["searchoptions","searchfunction"],provide(){return{query:Vue.computed(()=>this.lastQuery)}},data:function(){return{searchtimer:null,hidetimer:null,searchsettings:{searchstr:this.getSearchStr(),types:this.getInitiallySelectedTypes()},searchresult:[],searchmode:"",showresult:!1,searching:!1,error:null,abortController:null,settingsDropdown:null,lastQuery:""}},computed:{searchTypesPlaceholder(){return this.searchsettings.types.length?this.searchsettings.types.map(t=>this.typeLabels[t]).join(" / "):Object.values(this.typeLabels).join(" / ")},types(){return this.searchoptions.types?Array.isArray(this.searchoptions.types)?this.searchoptions.types:Object.keys(this.searchoptions.types):[]},typeLabels(){return this.searchoptions.types?Array.isArray(this.searchoptions.types)?this.searchoptions.types.reduce((t,e)=>(t[e]=e,t),{}):this.searchoptions.types:{}}},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 \n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n