diff --git a/application/config/cis.php b/application/config/cis.php index 028e9899a..b7330ef29 100644 --- a/application/config/cis.php +++ b/application/config/cis.php @@ -5,3 +5,5 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); // CMS Content Id for CIS4 Menu Root $config['cis_menu_root_content_id'] = 11066; +// send Mails for ProfilUpdate +$config['cis_send_profil_update_mails'] = true; diff --git a/application/config/javascript.php b/application/config/javascript.php new file mode 100644 index 000000000..5e9aa270a --- /dev/null +++ b/application/config/javascript.php @@ -0,0 +1,7 @@ + ['basis/cis:r'], ]); + $this->load->config('cis'); $this->load->model('person/Profil_update_model', 'ProfilUpdateModel'); $this->load->model('person/Kontakt_model', 'KontaktModel'); @@ -111,6 +112,10 @@ class ProfilUpdate extends Auth_Controller private function sendEmail_onProfilUpdate_response($uid, $topic, $status) { + if($this->config->item('cis_send_profil_update_mails') === false) + { + return; + } $this->load->helper('hlp_sancho_helper'); $email = $uid . "@" . DOMAIN; @@ -138,6 +143,10 @@ class ProfilUpdate extends Auth_Controller private function sendEmail_onProfilUpdate_insertion($uid, $profil_update_id, $topic) { + if($this->config->item('cis_send_profil_update_mails') === false) + { + return; + } $this->load->helper('hlp_sancho_helper'); $emails = []; diff --git a/application/controllers/Cis4.php b/application/controllers/Cis4.php index 84aedc5f2..9197fd388 100644 --- a/application/controllers/Cis4.php +++ b/application/controllers/Cis4.php @@ -28,14 +28,12 @@ class Cis4 extends Auth_Controller public function index() { $this->load->model('person/Person_model','PersonModel'); - $begruesung = $this->PersonModel->getFirstName(getAuthUID()); - if(isError($begruesung)) - { - show_error("name couldn't be loaded for username ".getAuthUID()); - } - $begruesung = getData($begruesung); + $personData = getData($this->PersonModel->getByUid(getAuthUID()))[0]; + $viewData = array( - 'name' => $begruesung + 'uid' => getAuthUID(), + 'name' => $personData->vorname, + 'person_id' => $personData->person_id ); $this->load->view('CisVue/Dashboard.php',['viewData' => $viewData]); diff --git a/application/controllers/api/frontend/v1/Cms.php b/application/controllers/api/frontend/v1/Cms.php index 16142532b..e41196f45 100644 --- a/application/controllers/api/frontend/v1/Cms.php +++ b/application/controllers/api/frontend/v1/Cms.php @@ -125,7 +125,7 @@ class Cms extends FHCAPI_Controller //get the data or terminate with error $news = $this->getDataOrTerminateWithError($news); - + // collect the content of the news foreach($news as $news_element){ $this->addMeta("content_id",$news_element->content_id); @@ -134,12 +134,17 @@ class Cms extends FHCAPI_Controller $this->NewsModel->resetQuery(); $content = $this->cmslib->getContent($news_element->content_id); - $content = $this->getDataOrTerminateWithError($content); + $content = getData($content); $news_element->content_obj = $content; } + $withContent = function($news) { + return $news->content_obj != null; + }; + + $newsWithContent = array_filter($news, $withContent); - $this->terminateWithSuccess($news); + $this->terminateWithSuccess($newsWithContent); } diff --git a/application/controllers/api/frontend/v1/Phrasen.php b/application/controllers/api/frontend/v1/Phrasen.php index 317f515e0..3509e6630 100644 --- a/application/controllers/api/frontend/v1/Phrasen.php +++ b/application/controllers/api/frontend/v1/Phrasen.php @@ -29,7 +29,9 @@ class Phrasen extends FHCAPI_Controller { parent::__construct([ 'loadModule' => self::PERM_ANONYMOUS, - 'setLanguage' => self::PERM_ANONYMOUS + 'setLanguage' => self::PERM_ANONYMOUS, + 'getLanguage' => self::PERM_ANONYMOUS, + 'getAllLanguages' => self::PERM_ANONYMOUS, ]); $this->load->helper('hlp_language'); @@ -60,4 +62,23 @@ class Phrasen extends FHCAPI_Controller $phrases = $this->p->setPhrases($categories, $language); $this->terminateWithSuccess($phrases); } + + // gets the langauge of the currently logged in user session and otherwhise the system language + public function getLanguage() + { + $lang = getUserLanguage(); + $this->terminateWithSuccess($lang); + } + + // gets all languages that are set as active in the database + public function getAllLanguages() + { + $langs = getDBActiveLanguages(); + $langs = $this->getDataOrTerminateWithError($langs); + $langs = array_map(function($lang){ + return $lang->sprache; + }, $langs); + $this->terminateWithSuccess($langs); + } + } \ No newline at end of file diff --git a/application/controllers/api/frontend/v1/Profil.php b/application/controllers/api/frontend/v1/Profil.php index a82b3ddfc..576a2a8ed 100644 --- a/application/controllers/api/frontend/v1/Profil.php +++ b/application/controllers/api/frontend/v1/Profil.php @@ -88,7 +88,7 @@ class Profil extends FHCAPI_Controller $res->data = $this->studentProfil(); $res->data->pid = $this->pid; } - + // editing your own profil - true $editAllowed = true; } // UID is availabe when accessing Profil/View/:uid @@ -495,12 +495,11 @@ class Profil extends FHCAPI_Controller */ private function getPersonInfo($uid, $geburtsInfo = null) { - $selectClause = ["foto", "anrede", "titelpost as postnomen", "titelpre as titel", "vorname", "nachname"]; + $selectClause = ["foto", "foto_sperre", "anrede", "titelpost as postnomen", "titelpre as titel", "vorname", "nachname"]; /** @param integer $geburtsInfo */ if ($geburtsInfo) { array_push($selectClause, "gebort"); array_push($selectClause, "gebdatum"); - array_push($selectClause, "foto_sperre"); } $this->BenutzerModel->addSelect($selectClause); $this->BenutzerModel->addJoin("tbl_person", "person_id"); @@ -512,6 +511,12 @@ class Profil extends FHCAPI_Controller $person_res = hasData($person_res) ? getData($person_res)[0] : null; } + if( ($person_res->foto === null) || (($this->uid !== $uid) && ($person_res->foto_sperre !== false)) ) + { + $dummy_foto = base64_encode(file_get_contents(DOC_ROOT.'skin/images/profilbild_dummy.jpg')); + $person_res->foto = $dummy_foto; + } + return $person_res; } diff --git a/application/controllers/api/frontend/v1/ProfilUpdate.php b/application/controllers/api/frontend/v1/ProfilUpdate.php index 35b7e4e64..827654d21 100644 --- a/application/controllers/api/frontend/v1/ProfilUpdate.php +++ b/application/controllers/api/frontend/v1/ProfilUpdate.php @@ -47,6 +47,8 @@ class ProfilUpdate extends FHCAPI_Controller 'show' => self::PERM_LOGGED, ]); + $this->load->config('cis'); + // Load language phrases $this->loadPhrases( array( @@ -504,6 +506,10 @@ class ProfilUpdate extends FHCAPI_Controller private function sendEmail_onProfilUpdate_insertion($uid, $profil_update_id, $topic) { + if($this->config->item('cis_send_profil_update_mails') === false) + { + return; + } $this->load->helper('hlp_sancho_helper'); $emails = []; @@ -573,6 +579,11 @@ class ProfilUpdate extends FHCAPI_Controller private function sendEmail_onProfilUpdate_response($uid, $topic, $status) { + if($this->config->item('cis_send_profil_update_mails') === false) + { + return; + } + $this->load->helper('hlp_sancho_helper'); $email = $uid . "@" . DOMAIN; diff --git a/application/controllers/api/frontend/v1/Stundenplan.php b/application/controllers/api/frontend/v1/Stundenplan.php index 116854930..c14ea4315 100644 --- a/application/controllers/api/frontend/v1/Stundenplan.php +++ b/application/controllers/api/frontend/v1/Stundenplan.php @@ -151,7 +151,12 @@ class Stundenplan extends FHCAPI_Controller // getting the student_lehrverbaende of the student in the different studiensemester $student_lehrverband = $this->fetchStudentlehrverbandFromStudiensemester($semester_range); - $stundenplan_data = $this->StundenplanModel->stundenplanGruppierung($this->StundenplanModel->getStundenplanQuery($start_date, $end_date, $semester_range, $benutzer_gruppen, $student_lehrverband)); + $stundenplan_query = $this->StundenplanModel->getStundenplanQuery($start_date, $end_date, $semester_range, $benutzer_gruppen, $student_lehrverband); + if(!$stundenplan_query) + { + $this->terminateWithSuccess([]); + } + $stundenplan_data = $this->StundenplanModel->stundenplanGruppierung($stundenplan_query); $stundenplan_data = $this->getDataOrTerminateWithError($stundenplan_data) ?? []; $this->expand_object_information($stundenplan_data); diff --git a/application/controllers/jobs/AnrechnungJob.php b/application/controllers/jobs/AnrechnungJob.php index 5784830b6..52bf972e3 100644 --- a/application/controllers/jobs/AnrechnungJob.php +++ b/application/controllers/jobs/AnrechnungJob.php @@ -195,10 +195,10 @@ class AnrechnungJob extends JOB_Controller $studiengang_bezeichnung = $this->StudiengangModel->load($studiengang_kz)->retval[0]->stg_bezeichnung; // Get STGL mail address - $stglMailReceiver_arr = self::_getSTGLMailAddress($studiengang_kz); + $stglMailReceiver_arr = $this->_getSTGLMailAddress($studiengang_kz); // Get HTML table with new Anrechnungen of that STG plus amount of them - list ($anrechnungen_amount, $anrechnungen_table) = self::_getSTGLMailDataTable($studiengang_kz, $anrechnungen); + list ($anrechnungen_amount, $anrechnungen_table) = $this->_getSTGLMailDataTable($studiengang_kz, $anrechnungen); // Link to Antrag genehmigen dashboard $url = @@ -514,8 +514,6 @@ html; 'vorname' => $stgl->vorname ); } - - return $stglMailAdress_arr; } // If not available, get assistance mail address else @@ -524,12 +522,13 @@ html; if (hasData($result)) { - return array( - $result->retval[0]->email, - '' + $stglMailAdress_arr[]= array( + 'to' => $result->retval[0]->email, + 'vorname' => '' ); } } + return $stglMailAdress_arr; } // Build HTML table with yesterdays new Anrechnungen of the given STG diff --git a/application/controllers/jobs/AntragJob.php b/application/controllers/jobs/AntragJob.php index 46a31f3d6..11b950174 100644 --- a/application/controllers/jobs/AntragJob.php +++ b/application/controllers/jobs/AntragJob.php @@ -183,8 +183,8 @@ class AntragJob extends JOB_Controller $data, $to, 'Anträge - Aktion(en) erforderlich', - DEFAULT_SANCHO_HEADER_IMG, - DEFAULT_SANCHO_FOOTER_IMG, + '', + '', '', $cc )) diff --git a/application/controllers/jobs/ReihungstestJob.php b/application/controllers/jobs/ReihungstestJob.php index b55287439..996354bb5 100644 --- a/application/controllers/jobs/ReihungstestJob.php +++ b/application/controllers/jobs/ReihungstestJob.php @@ -431,8 +431,8 @@ class ReihungstestJob extends JOB_Controller $mailcontent_data_arr, $applicant->email, 'Ihre Anmeldung zum Reihungstest - Reminder / Your registration for the placement test - Reminder', - DEFAULT_SANCHO_HEADER_IMG, - DEFAULT_SANCHO_FOOTER_IMG, + '', + '', $from, '', $bcc); diff --git a/application/controllers/person/Gruppenmanagement.php b/application/controllers/person/Gruppenmanagement.php index 1a4c341a4..099871676 100644 --- a/application/controllers/person/Gruppenmanagement.php +++ b/application/controllers/person/Gruppenmanagement.php @@ -29,6 +29,7 @@ class Gruppenmanagement extends Auth_Controller $this->load->model('person/benutzer_model', 'BenutzerModel'); $this->load->model('ressource/mitarbeiter_model', 'MitarbeiterModel'); $this->load->model('person/benutzergruppe_model', 'BenutzergruppeModel'); + $this->load->model('person/gruppe_manager_model', 'GruppemanagerModel'); $this->load->model('system/Log_model', 'LogModel'); $this->load->library('WidgetLib'); @@ -117,6 +118,27 @@ class Gruppenmanagement extends Auth_Controller $result = error('Uid missing'); else { + $this->GruppemanagerModel->addSelect('1'); + $isManagerRes = $this->GruppemanagerModel->loadWhere( + array( + 'uid' => $this->_uid, + 'gruppe_kurzbz' => $gruppe_kurzbz + ) + ); + + if (isError($isManagerRes)) + { + $this->outputJsonError(getError($isManagerRes)); + return; + } + + if (!hasData($isManagerRes)) + { + $this->outputJsonError($this->p->t('gruppenmanagement', 'nichtZumEditierenDerGruppeBerechtigt')); + return; + } + + $this->BenutzergruppeModel->addSelect('1'); $benutzerExistsRes = $this->BenutzergruppeModel->loadWhere( array( 'uid' => $uid, @@ -170,6 +192,26 @@ class Gruppenmanagement extends Auth_Controller $result = error('Uid missing'); else { + $this->GruppemanagerModel->addSelect('1'); + $isManagerRes = $this->GruppemanagerModel->loadWhere( + array( + 'uid' => $this->_uid, + 'gruppe_kurzbz' => $gruppe_kurzbz + ) + ); + + if (isError($isManagerRes)) + { + $this->outputJsonError(getError($isManagerRes)); + return; + } + + if (!hasData($isManagerRes)) + { + $this->outputJsonError($this->p->t('gruppenmanagement', 'nichtZumEditierenDerGruppeBerechtigt')); + return; + } + $result = $this->BenutzergruppeModel->delete( array( 'uid' => $uid, diff --git a/application/core/DB_Model.php b/application/core/DB_Model.php index 36de01a4a..c3a609f3d 100644 --- a/application/core/DB_Model.php +++ b/application/core/DB_Model.php @@ -991,8 +991,8 @@ class DB_Model extends CI_Model // Find and replace all the occurrences of the provided encrypted columns // with the postgresql decryption function - $query = str_replace( - $encryptedColumn, + $query = preg_replace( + '/\b' . $encryptedColumn . '\b/', sprintf( self::CRYPT_WHERE_TEMPLATE, $encryptedColumn, @@ -1106,8 +1106,8 @@ class DB_Model extends CI_Model { // Find and replace all the occurrences of the provided encrypted columns // with the postgresql decryption function - $where = str_replace( - $encryptedColumn, + $where = preg_replace( + '/\b' . $encryptedColumn . '\b/', sprintf( self::CRYPT_WHERE_TEMPLATE, $encryptedColumn, diff --git a/application/core/Tag_Controller.php b/application/core/Tag_Controller.php new file mode 100644 index 000000000..6f6cef31b --- /dev/null +++ b/application/core/Tag_Controller.php @@ -0,0 +1,187 @@ + self::BERECHTIGUNG_KURZBZ, + 'getTags' => self::BERECHTIGUNG_KURZBZ, + 'addTag' => self::BERECHTIGUNG_KURZBZ, + + 'updateTag' => self::BERECHTIGUNG_KURZBZ, + 'doneTag' => self::BERECHTIGUNG_KURZBZ, + 'deleteTag' => self::BERECHTIGUNG_KURZBZ, + ]; + + $merged_permissions = array_merge($default_permissions, $permissions); + + parent::__construct($merged_permissions); + + $this->_setAuthUID(); + $this->load->model('person/Notiz_model', 'NotizModel'); + $this->load->model('system/Notiztyp_model', 'NotiztypModel'); + $this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel'); + } + + public function getTag() + { + $id = $this->input->get('id'); + + $this->NotizModel->addSelect( + 'tbl_notiz.titel, + tbl_notiz.text, + array_to_json(bezeichnung_mehrsprachig::varchar[])->>0 as bezeichnung, + tbl_notiz.notiz_id, + tbl_notiz_typ.style, + tbl_notiz.erledigt as done, + tbl_notiz.insertamum, + tbl_notiz.updateamum, + tbl_notiz.insertvon, + tbl_notiz.updatevon + ' + ); + $this->NotizModel->addJoin('public.tbl_notiz_typ', 'public.tbl_notiz.typ = public.tbl_notiz_typ.typ_kurzbz'); + $notiz = $this->NotizModel->loadWhere(array('notiz_id' => $id)); + + $this->terminateWithSuccess(hasData($notiz) ? getData($notiz)[0] : array()); + } + + public function getTags() + { + $this->NotiztypModel->addSelect( + 'typ_kurzbz as tag_typ_kurzbz, + array_to_json(bezeichnung_mehrsprachig::varchar[])->>0 as bezeichnung, + style, + beschreibung, + tag + ' + ); + $this->NotiztypModel->addOrder('prioritaet'); + $notiztypen = $this->NotiztypModel->loadWhere(array('aktiv' => true)); + $this->terminateWithSuccess(hasData($notiztypen) ? getData($notiztypen) : array()); + } + + public function addTag($withZuordnung = true) + { + $postData = $this->getPostJson(); + + $checkTyp = $this->NotiztypModel->loadWhere(array('typ_kurzbz' => $postData->tag_typ_kurzbz)); + + if (!hasData($checkTyp)) + $this->terminateWithError('Error occurred', self::ERROR_TYPE_GENERAL); + + + if ($withZuordnung) + { + $return = array(); + $checkZuordnungType = $this->NotizzuordnungModel->isValidType($postData->zuordnung_typ); + if (!isSuccess($checkZuordnungType)) + $this->terminateWithError('Error occurred', self::ERROR_TYPE_GENERAL); + + $values = array_unique($postData->values); + + foreach ($values as $value) + { + $insertResult = $this->addNotiz($postData); + + if (isError($insertResult)) + $this->terminateWithError('Error occurred', self::ERROR_TYPE_GENERAL); + + $insertZuordnung = $this->NotizzuordnungModel->insert(array( + 'notiz_id' => $insertResult->retval, + $postData->zuordnung_typ => $value + )); + + if (isError($insertZuordnung)) + $this->terminateWithError('Error occurred', self::ERROR_TYPE_GENERAL); + + $return[] = [$postData->zuordnung_typ => $value, 'id' => $insertResult->retval]; + } + $this->terminateWithSuccess($return); + } + else + { + $insertResult = $this->addNotiz($postData); + if (isError($insertResult)) + $this->terminateWithError('Error occurred', self::ERROR_TYPE_GENERAL); + + return $insertResult->retval; + } + } + + private function addNotiz($postData) + { + return $this->NotizModel->insert(array( + 'titel' => 'TAG', //TODO klären + 'text' => $postData->notiz, + 'verfasser_uid' => $this->_uid, + 'erledigt' => false, + 'insertamum' => date('Y-m-d H:i:s'), + 'insertvon' => $this->_uid, + 'typ' => $postData->tag_typ_kurzbz + )); + + } + public function updateTag() + { + $postData = $this->getPostJson(); + $updateData = $this->NotizModel->update(array('notiz_id' => $postData->id), + array('text' => $postData->notiz) + ); + $this->terminateWithSuccess($updateData); + } + public function doneTag() + { + $postData = $this->getPostJson(); + $updateData = $this->NotizModel->update(array('notiz_id' => $postData->id), + array('erledigt' => !$postData->done) + ); + + $this->terminateWithSuccess($updateData); + } + + public function deleteTag($withZuordnung = true) + { + $postData = $this->getPostJson(); + + $deleteNotiz = ""; + if ($withZuordnung) + { + $deleteZuordnung = $this->NotizzuordnungModel->delete(array( + 'notiz_id' => $postData->id + )); + + if (isSuccess($deleteZuordnung)) + { + $deleteNotiz = $this->NotizModel->delete(array( + 'notiz_id' => $postData->id + )); + } + } + else + { + $deleteNotiz = $this->NotizModel->delete(array( + 'notiz_id' => $postData->id + )); + } + $this->terminateWithSuccess($deleteNotiz); + } + + private function _setAuthUID() + { + $this->_uid = getAuthUID(); + + if (!$this->_uid) + show_error('User authentification failed'); + } + + +} \ No newline at end of file diff --git a/application/helpers/hlp_sancho_helper.php b/application/helpers/hlp_sancho_helper.php index d599e40bc..9a32f5e1a 100644 --- a/application/helpers/hlp_sancho_helper.php +++ b/application/helpers/hlp_sancho_helper.php @@ -23,9 +23,6 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); // Functions needed in the view FHC-Header // ------------------------------------------------------------------------ -const DEFAULT_SANCHO_HEADER_IMG = 'sancho_header_DEFAULT.jpg'; -const DEFAULT_SANCHO_FOOTER_IMG = 'sancho_footer_DEFAULT.jpg'; - /** * Send single Mail with Sancho Design and Layout. * @param string $vorlage_kurzbz Name of the template for specific mail content. @@ -38,27 +35,88 @@ const DEFAULT_SANCHO_FOOTER_IMG = 'sancho_footer_DEFAULT.jpg'; * @param string $bcc Sets BCC of mail. * @return void */ -function sendSanchoMail($vorlage_kurzbz, $vorlage_data, $to, $subject, $headerImg = DEFAULT_SANCHO_HEADER_IMG, $footerImg = DEFAULT_SANCHO_FOOTER_IMG, $from = null, $cc = null, $bcc = null) +function sendSanchoMail( + $vorlage_kurzbz, + $vorlage_data, + $to, + $subject, + $headerImg = '', + $footerImg = '', + $from = null, + $cc = null, + $bcc = null +) { $ci =& get_instance(); $ci->load->library('email'); $ci->load->library('MailLib'); - $sanchoHeader_img = 'skin/images/sancho/'. $headerImg; - $sanchoFooter_img = 'skin/images/sancho/'. $footerImg; + $sancho_mail_config = $ci->config->item('mail'); + if ($from == '') { - $from = 'sancho@'.DOMAIN; + $from = ((isset($sancho_mail_config['sancho_mail_default_sender']) + && $sancho_mail_config['sancho_mail_default_sender']) + ? $sancho_mail_config['sancho_mail_default_sender'] + : 'noreply') + . '@' . DOMAIN; } // Embed sancho header and footer image // reset important to ensure embedding of images when called in a loop $ci->email->clear(true); // clear vars and attachments - $ci->email->attach($sanchoHeader_img); - $ci->email->attach($sanchoFooter_img); - $cid_header = $ci->email->attachment_cid($sanchoHeader_img); // sets unique content id for embedding - $cid_footer = $ci->email->attachment_cid($sanchoFooter_img); // sets unique content id for embedding + + $cid_header = ''; + $cid_footer = ''; + + if (isset($sancho_mail_config['sancho_mail_use_images']) && $sancho_mail_config['sancho_mail_use_images']) + { + $sanchoHeader_img = ''; + $sanchoFooter_img = ''; + + if (isset($headerImg) && $headerImg != '') + { + // use provided header image + $sanchoHeader_img = $headerImg; + } + elseif (isset($sancho_mail_config['sancho_mail_header_img']) && $sancho_mail_config['sancho_mail_header_img']) + { + // use default header image + $sanchoHeader_img = $sancho_mail_config['sancho_mail_header_img']; + } + + if (isset($footerImg) && $footerImg != '') + { + // use provided footer image + $sanchoFooter_img = $footerImg; + } + elseif (isset($sancho_mail_config['sancho_mail_footer_img']) && $sancho_mail_config['sancho_mail_footer_img']) + { + // use default footer image + $sanchoFooter_img = $sancho_mail_config['sancho_mail_footer_img']; + } + + // add image file paths + if (isset($sancho_mail_config['sancho_mail_img_path'])) + { + if ($sanchoHeader_img != '') + { + $sanchoHeader_img = $sancho_mail_config['sancho_mail_img_path'].$sanchoHeader_img; + } + + if ($sanchoFooter_img != '') + { + $sanchoFooter_img = $sancho_mail_config['sancho_mail_img_path'].$sanchoFooter_img; + } + } + + // attach header and footer + $ci->email->attach($sanchoHeader_img, 'inline'); + $ci->email->attach($sanchoFooter_img, 'inline'); + $cid_header = $ci->email->attachment_cid($sanchoHeader_img); // sets unique content id for embedding + $cid_footer = $ci->email->attachment_cid($sanchoFooter_img); // sets unique content id for embedding + } // Set specific mail content into specific content template $content = _parseMailContent($vorlage_kurzbz, $vorlage_data); @@ -74,7 +132,18 @@ function sendSanchoMail($vorlage_kurzbz, $vorlage_data, $to, $subject, $headerIm $body = _parseMailContent('Sancho_Mail_Template', $layout); // Send mail - return $ci->maillib->send($from, $to, $subject, $body, $alias = '', $cc, $bcc, $altMessage = '', $bulk = true, $autogenerated = true); + return $ci->maillib->send( + $from, + $to, + $subject, + $body, + '', // alias + $cc, + $bcc, + '', // altMessage + true, // bulk + true // autogenerated + ); } /** diff --git a/application/libraries/SearchBarLib.php b/application/libraries/SearchBarLib.php index 573bd7451..13b0efdbb 100644 --- a/application/libraries/SearchBarLib.php +++ b/application/libraries/SearchBarLib.php @@ -33,7 +33,7 @@ class SearchBarLib const ERROR_NOT_AUTH = 'ERR005'; // List of allowed types of search - const ALLOWED_TYPES = ['mitarbeiter', 'mitarbeiter_ohne_zuordnung', 'organisationunit', 'raum', 'person', 'student', 'prestudent', 'document', 'cms']; + const ALLOWED_TYPES = ['mitarbeiter', 'mitarbeiter_ohne_zuordnung', 'organisationunit', 'raum', 'person', 'student','studentStv', 'prestudent', 'document', 'cms']; const PHOTO_IMG_URL = '/cis/public/bild.php?src=person&person_id='; @@ -362,17 +362,26 @@ EOSC; private function _student($searchstr, $type) { $dbModel = new DB_Model(); - + $gesperrtes_foto = base64_encode(file_get_contents(DOC_ROOT.'skin/images/profilbild_dummy.jpg')); $students = $dbModel->execReadOnlyQuery(' SELECT \''.$type.'\' AS type, s.student_uid AS uid, + CONCAT(s.student_uid,\'@'.DOMAIN.'\') AS email, s.matrikelnr, + CONCAT(UPPER(stg.typ),UPPER(stg.kurzbz),\'-\',s.semester,s.verband) as verband, + stg.bezeichnung AS studiengang, p.person_id AS person_id, p.vorname || \' \' || p.nachname AS name, - k.kontakt as email , - p.foto + CASE + when s.student_uid = \''.getAuthUID().'\' then p.foto + when p.foto IS NULL then \''.$gesperrtes_foto.'\' + when p.foto_sperre = false then p.foto + else \''.$gesperrtes_foto.'\' + end as foto, + b.aktiv FROM public.tbl_student s + JOIN public.tbl_studiengang stg USING(studiengang_kz) JOIN public.tbl_benutzer b ON(b.uid = s.student_uid) JOIN public.tbl_person p USING(person_id) LEFT JOIN ( @@ -380,10 +389,57 @@ EOSC; FROM public.tbl_kontakt WHERE kontakttyp = \'email\' ) as k USING(person_id) - WHERE b.uid ILIKE \'%'.$dbModel->escapeLike($searchstr).'%\' + WHERE + b.aktiv = TRUE + AND (b.uid ILIKE \'%'.$dbModel->escapeLike($searchstr).'%\' + OR p.vorname ILIKE \'%'.$dbModel->escapeLike($searchstr).'%\' + OR p.nachname ILIKE \'%'.$dbModel->escapeLike($searchstr).'%\') + GROUP BY type, s.student_uid, s.matrikelnr, p.person_id, name, + email, p.foto, s.verband, s.semester, stg.bezeichnung, + stg.typ, stg.kurzbz, b.aktiv + ORDER BY b.aktiv DESC, p.nachname ASC, p.vorname ASC + '); + + // If something has been found then return it + if (hasData($students)) return getData($students); + + // Otherwise return an empty array + return array(); + } + + private function _studentStv($searchstr, $type) + { + $dbModel = new DB_Model(); + + $students = $dbModel->execReadOnlyQuery(' + SELECT + \''.$type.'\' AS type, + s.student_uid AS uid, + s.matrikelnr, + CONCAT(UPPER(stg.typ),UPPER(stg.kurzbz),\'-\',s.semester,s.verband) as verband, + stg.bezeichnung AS studiengang, + p.person_id AS person_id, + p.vorname || \' \' || p.nachname AS name, + k.kontakt AS email, + p.foto, + b.aktiv + FROM public.tbl_student s + JOIN public.tbl_studiengang stg USING(studiengang_kz) + JOIN public.tbl_benutzer b ON(b.uid = s.student_uid) + JOIN public.tbl_person p USING(person_id) + LEFT JOIN ( + SELECT kontakt, person_id + FROM public.tbl_kontakt + WHERE kontakttyp = \'email\' + ) as k USING(person_id) + WHERE + b.uid ILIKE \'%'.$dbModel->escapeLike($searchstr).'%\' OR p.vorname ILIKE \'%'.$dbModel->escapeLike($searchstr).'%\' OR p.nachname ILIKE \'%'.$dbModel->escapeLike($searchstr).'%\' - GROUP BY type, s.student_uid, s.matrikelnr, p.person_id, name, email, p.foto + GROUP BY type, s.student_uid, s.matrikelnr, p.person_id, name, + k.kontakt, p.foto, s.verband, s.semester, stg.bezeichnung, + stg.typ, stg.kurzbz, b.aktiv + ORDER BY b.aktiv DESC, p.nachname ASC, p.vorname ASC '); // If something has been found then return it diff --git a/application/models/education/LehrveranstaltungFaktor_model.php b/application/models/education/LehrveranstaltungFaktor_model.php new file mode 100644 index 000000000..c8a0c8aa8 --- /dev/null +++ b/application/models/education/LehrveranstaltungFaktor_model.php @@ -0,0 +1,14 @@ +dbTable = 'lehre.tbl_lehrveranstaltung_faktor'; + $this->pk = 'lehrveranstaltung_faktor_id'; + } +} diff --git a/application/models/person/Gruppe_manager_model.php b/application/models/person/Gruppe_manager_model.php new file mode 100644 index 000000000..93d45bd1f --- /dev/null +++ b/application/models/person/Gruppe_manager_model.php @@ -0,0 +1,14 @@ +dbTable = 'public.tbl_gruppe_manager'; + $this->pk = 'gruppe_manager_id'; + } +} diff --git a/application/models/person/Notiz_model.php b/application/models/person/Notiz_model.php index 349eaac60..2d1e054c3 100644 --- a/application/models/person/Notiz_model.php +++ b/application/models/person/Notiz_model.php @@ -142,7 +142,7 @@ class Notiz_model extends DB_Model $this->addSelect('public.tbl_notiz.*'); $this->addJoin('public.tbl_notizzuordnung', 'notiz_id'); - return $this->loadWhere(array('person_id' => $person_id)); + return $this->loadWhere(array('person_id' => $person_id, 'tbl_notiz.typ' => NULL)); } /** diff --git a/application/models/project/Projects_employees_model.php b/application/models/project/Projects_employees_model.php new file mode 100644 index 000000000..a12e3961c --- /dev/null +++ b/application/models/project/Projects_employees_model.php @@ -0,0 +1,22 @@ +dbTable = 'sync.tbl_projects_employees'; + $this->pk = 'projects_employees_id'; + } + + public function deleteByProjectTaskId($ids) + { + $qry = "DELETE FROM " . $this->dbTable . " + WHERE project_task_id IN ?"; + + return $this->execQuery($qry, array($ids)); + } +} diff --git a/application/models/ressource/Stundenplan_model.php b/application/models/ressource/Stundenplan_model.php index 01d8dd792..8cb07a3bb 100644 --- a/application/models/ressource/Stundenplan_model.php +++ b/application/models/ressource/Stundenplan_model.php @@ -135,7 +135,7 @@ class Stundenplan_model extends DB_Model /** - * function that takes a query that fetches lehre.vw_stundenplan rows and groups them so that they can be displayed in a calendar + * groups rows of a subquery that fetches data from the lehre.vw_stundenplan table * @param string $stundenplanViewQuery the subquery used to group the result * * @return stdClass @@ -190,7 +190,7 @@ class Stundenplan_model extends DB_Model * NO STANDALONE FUNCTION - Generates a SQL query string to fetch 'stundenplan' events for a specific student within the current semester. * @param string $uid the user id that is used to fetch the stundenplan rows from the lehre.vw_stundenplan table * - * @return string + * @return mixed */ public function getStundenplanQuery($start_date, $end_date,$semester,$gruppen,$studentlehrverbaende){ @@ -206,7 +206,13 @@ class Stundenplan_model extends DB_Model } return $result; }; - + + // if both the gruppen and the studentlehrverbaende are empty we early return + if($emptyCheck($gruppen) && $emptyCheck($studentlehrverbaende)) + { + return false; + } + $query = "select sp.* from lehre.vw_stundenplan sp @@ -233,15 +239,15 @@ class Stundenplan_model extends DB_Model // converts the array of gruppen strings into a sql IN (_,_,_) chain $query .="(sp.gruppe_kurzbz IN (" .implode(',',$gruppen[$sem_date]).") AND sp.datum BETWEEN ".$this->escape($sem_date_range->start)." AND ".$this->escape($sem_date_range->ende)." )"; - // adds the OR sql chain only if the $studentlehrverbaende array is not empty - // DOES not include the sql OR if the $studentlehrverbaende are empty and it is the last gruppen element in the iteration - if(key($semester) != $sem || !$emptyCheck($studentlehrverbaende)) - { - $query .="OR"; - } - + $query .="OR"; } } + + // if there are no studentlehrverbaende and the gruppen are not empty, we can remove the last OR added after the groups + if($emptyCheck($studentlehrverbaende) && !$emptyCheck($gruppen)) + { + $query = substr($query, 0, -2); + } foreach($semester as $sem=>$semester_date_range) { @@ -253,20 +259,24 @@ class Stundenplan_model extends DB_Model } foreach($studentlehrverbaende[$sem_date] as $key=>$lehrverband) { - // adds the OR sql chain only if its not the first element in the first semester of the $studentlehrverbaende array - if($sem != array_keys($semester)[0] || $key != array_keys($semester)[0]) - { - $query .="OR"; - } $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).") AND gruppe_kurzbz is null)"; + + $query .="OR"; + } } } + // if the studentlehrverbaende is not empty we can remove the last OR that was added to the query + if(!$emptyCheck($studentlehrverbaende)) + { + $query = substr($query, 0, -2); + } + // closes the AND sql chain only if it was opened previously if(!$emptyCheck($gruppen) || !$emptyCheck($studentlehrverbaende)) { diff --git a/application/models/ressource/Stundensatz_model.php b/application/models/ressource/Stundensatz_model.php index c397d8573..10f5a6aa1 100644 --- a/application/models/ressource/Stundensatz_model.php +++ b/application/models/ressource/Stundensatz_model.php @@ -13,5 +13,33 @@ class Stundensatz_model extends DB_Model $this->pk = 'stundensatz_id'; $this->hasSequence = true; } - + + public function getStundensatzByDatum($uid, $beginn, $ende = null, $typ = null) + { + $qry = "SELECT + * + FROM + hr.tbl_stundensatz + WHERE + uid = ? + AND (gueltig_bis >= ? OR gueltig_bis is null)"; + + $params = array($uid, $beginn); + + if (!is_null($ende)) + { + $qry .= " AND (gueltig_von <= ?)"; + $params[] = $ende; + } + + if (!is_null($typ)) + { + $qry .= " AND stundensatztyp = ?"; + $params[] = $typ; + } + + $qry .= " ORDER BY gueltig_bis DESC NULLS FIRST, gueltig_von DESC NULLS LAST LIMIT 1;"; + + return $this->execQuery($qry, $params); + } } \ No newline at end of file diff --git a/application/models/system/Notiztyp_model.php b/application/models/system/Notiztyp_model.php new file mode 100644 index 000000000..b173377e6 --- /dev/null +++ b/application/models/system/Notiztyp_model.php @@ -0,0 +1,14 @@ +dbTable = 'public.tbl_notiz_typ'; + $this->pk = 'typ_kurzbz'; + } +} diff --git a/application/models/vertragsbestandteil/Vertragsbestandteil_model.php b/application/models/vertragsbestandteil/Vertragsbestandteil_model.php index 6d8c18859..cbc529d83 100644 --- a/application/models/vertragsbestandteil/Vertragsbestandteil_model.php +++ b/application/models/vertragsbestandteil/Vertragsbestandteil_model.php @@ -19,12 +19,17 @@ class Vertragsbestandteil_model extends DB_Model protected function getVertragsbestandteilSQL() { + $sapInstalled = $this->_checkIfSAPSyncTableExists(); + + $oe_kurzbz_sap = $sapInstalled ? 'sap.oe_kurzbz_sap' : 'NULL AS oe_kurzbz_sap'; + $sap_join = $sapInstalled ? 'LEFT JOIN sync.tbl_sap_organisationsstruktur sap USING(oe_kurzbz)' : ''; + $sql = <<overlappingvbs; } + + /** + * Checks if sap sync table exists. + * @return bool + */ + private function _checkIfSAPSyncTableExists() + { + $params = array( + DB_NAME, + 'sync', + 'tbl_sap_organisationsstruktur' + ); + + $sql = "SELECT + 1 AS exists + FROM + information_schema.tables + WHERE + table_catalog = ? AND + table_schema = ? AND + table_name = ?"; + + $res = $this->execReadOnlyQuery($sql, $params); + + return hasData($res); + } } diff --git a/application/views/system/infocenter/infocenterData.php b/application/views/system/infocenter/infocenterData.php index 61dc5a575..956ad80d4 100644 --- a/application/views/system/infocenter/infocenterData.php +++ b/application/views/system/infocenter/infocenterData.php @@ -7,6 +7,7 @@ $STUDIENGANG_TYP = '\''.$this->variablelib->getVar('infocenter_studiensgangtyp').'\''; $TAETIGKEIT_KURZBZ = '\'bewerbung\', \'kommunikation\''; $LOGDATA_NAME = '\'Login with code\', \'Login with user\', \'Interessent rejected\', \'Attempt to register with existing mailadress\', \'Access code sent\', \'Personal data saved\''; + $LOGDATA_DELETED_BY_USER = '\'% deleted by user\''; $POSTPONE_STATUS_PARKED = '\'parked\''; $STATUS_KURZBZ = '\'Wartender\', \'Bewerber\', \'Aufgenommener\', \'Student\''; $ADDITIONAL_STG = $this->config->item('infocenter_studiengang_kz'); @@ -283,6 +284,7 @@ FROM system.tbl_log l WHERE l.taetigkeit_kurzbz IN ('.$TAETIGKEIT_KURZBZ.') AND l.logdata->>\'name\' NOT IN ('.$LOGDATA_NAME.') + AND l.logdata->>\'message\' NOT LIKE ('.$LOGDATA_DELETED_BY_USER.') AND l.person_id = p.person_id ORDER BY l.log_id DESC LIMIT 1 diff --git a/application/views/templates/FHC-Common.php b/application/views/templates/FHC-Common.php index dd399f354..245432f46 100644 --- a/application/views/templates/FHC-Common.php +++ b/application/views/templates/FHC-Common.php @@ -45,3 +45,4 @@ $tablewidget = isset($tablewidget) ? $tablewidget : false; $udfs = isset($udfs) ? $udfs : false; $widgets = isset($widgets) ? $widgets : false; + $tags = isset($tags) ? $tags : false; diff --git a/application/views/templates/FHC-Footer.php b/application/views/templates/FHC-Footer.php index bf3475a04..9387cf92c 100644 --- a/application/views/templates/FHC-Footer.php +++ b/application/views/templates/FHC-Footer.php @@ -13,6 +13,9 @@ $calledPath = $this->router->directory.$this->router->class; $calledMethod = $this->router->method; + $this->load->config('javascript'); + $use_vuejs_dev_version = $this->config->item('use_vuejs_dev_version'); + // By default set the parameters to null $customJSs = isset($customJSs) ? $customJSs : null; $customJSModules = isset($customJSModules) ? $customJSModules : null; @@ -110,7 +113,14 @@ // Vue 3 JS if ($vue3 === true) { - generateJSsInclude('vendor/vuejs/vuejs3/vue.global.prod.js'); + if($use_vuejs_dev_version && $use_vuejs_dev_version === true) + { + generateJSsInclude('vendor/vuejs/vuejs3_dev/vue.global.js'); + } + else + { + generateJSsInclude('vendor/vuejs/vuejs3/vue.global.prod.js'); + } generateJSsInclude('vendor/vuejs/vuerouter4/vue-router.global.js'); } diff --git a/application/views/templates/FHC-Header.php b/application/views/templates/FHC-Header.php index 3ad161ef2..bca75512f 100644 --- a/application/views/templates/FHC-Header.php +++ b/application/views/templates/FHC-Header.php @@ -119,6 +119,9 @@ // CIS if ($cis === true) generateCSSsInclude(defined('CIS4') ? 'public/css/cis4.css' : 'public/css/cis_bs5.css'); + //Tags + if ($tags === true) generateCSSsInclude('public/css/tags.css'); + // Eventually required CSS generateCSSsInclude($customCSSs); // Eventually required CSS ?> diff --git a/cis/private/lvplan/index.php b/cis/private/lvplan/index.php index 7e7e8e28e..5af3c1b51 100644 --- a/cis/private/lvplan/index.php +++ b/cis/private/lvplan/index.php @@ -98,6 +98,7 @@ if(!$result_ort) die("ort not found!"); $num_rows_ort=$db->db_num_rows($result_ort); + /*$sql_query="SELECT student_uid FROM public.tbl_student ORDER BY student_uid"; $result_lektor=$db->db_query($sql_query); if(!$result_lektor) @@ -531,7 +532,6 @@ if(!defined('CIS_LVPLAN_ZUSATZMENUE_ANZEIGEN') || CIS_LVPLAN_ZUSATZMENUE_ANZEIGE echo '

'.$p->t('lvplan/raumsuche').'

-

'.$p->t('lvplan/fehlerUndFeedback').'

'.$p->t('global/hilfe').'

'; } diff --git a/cis/private/lvplan/stpl_detail.php b/cis/private/lvplan/stpl_detail.php index 87d4a70ff..14446d5b4 100644 --- a/cis/private/lvplan/stpl_detail.php +++ b/cis/private/lvplan/stpl_detail.php @@ -37,8 +37,8 @@ require_once('../../../include/datum.class.php'); require_once('../../../include/phrasen.class.php'); require_once('../../../include/mitarbeiter.class.php'); -$sprache = getSprache(); -$p = new phrasen($sprache); +$sprache = getSprache(); +$p = new phrasen($sprache); if (!$db = new basis_db()) die($p->t('global/fehlerBeimOeffnenDerDatenbankverbindung')); @@ -46,7 +46,7 @@ if (!$db = new basis_db()) // Variablen uebernehmen if (isset($_GET['type'])) $type=$_GET['type']; -else +else $type=''; if (isset($_GET['datum'])) @@ -61,7 +61,7 @@ if (isset($_GET['stg_kz'])) $stg_kz=$_GET['stg_kz']; if (isset($_GET['sem'])) $sem=$_GET['sem']; - + if($sem!='' && !is_numeric($sem)) die($p->t('lvplan/semesterIstUngueltig')); @@ -70,7 +70,7 @@ if($stunde!='' && !is_numeric($stunde)) if (isset($_GET['ver'])) $ver=$_GET['ver']; - + if (isset($_GET['grp'])) $grp=$_GET['grp']; if (isset($_GET['gruppe_kurzbz'])) @@ -83,32 +83,32 @@ if(!$datum_obj->checkDatum($datum)) $stsem = getStudiensemesterFromDatum($datum); //Stundenplan $sql_query=" -SELECT - campus.vw_stundenplan.*, lehrfach.bezeichnung, vw_mitarbeiter.titelpre, +SELECT + campus.vw_stundenplan.*, lehrfach.bezeichnung, vw_mitarbeiter.titelpre, vw_mitarbeiter.titelpost, vw_mitarbeiter.nachname, vw_mitarbeiter.vorname, - (SELECT - count(*) - FROM - public.tbl_studentlehrverband - WHERE - studiengang_kz=vw_stundenplan.studiengang_kz + (SELECT + count(*) + FROM + public.tbl_studentlehrverband + WHERE + studiengang_kz=vw_stundenplan.studiengang_kz AND semester=vw_stundenplan.semester AND (verband=vw_stundenplan.verband OR vw_stundenplan.verband is null OR trim(vw_stundenplan.verband)='') AND (gruppe=vw_stundenplan.gruppe OR vw_stundenplan.gruppe is null OR trim(vw_stundenplan.gruppe)='') - AND studiensemester_kurzbz=".$db->db_add_param($stsem).") as anzahl_lvb, - (SELECT - count(*) - FROM - public.tbl_benutzergruppe - WHERE - gruppe_kurzbz=vw_stundenplan.gruppe_kurzbz + AND studiensemester_kurzbz=".$db->db_add_param($stsem).") as anzahl_lvb, + (SELECT + count(*) + FROM + public.tbl_benutzergruppe + WHERE + gruppe_kurzbz=vw_stundenplan.gruppe_kurzbz AND studiensemester_kurzbz=".$db->db_add_param($stsem).") as anzahl_grp -FROM - campus.vw_stundenplan +FROM + campus.vw_stundenplan JOIN lehre.tbl_lehrveranstaltung as lehrfach ON (vw_stundenplan.lehrfach_id=lehrfach.lehrveranstaltung_id) JOIN campus.vw_mitarbeiter USING (uid) -WHERE - datum=".$db->db_add_param($datum)." +WHERE + datum=".$db->db_add_param($datum)." AND stunde=".$db->db_add_param($stunde); if ($type=='lektor') @@ -121,7 +121,7 @@ else { if($stg_kz=='' || $sem=='') die('Fehlerhafte Parameteruebergabe'); - + if($type=="verband" && $stg_kz!='' && $sem!='') { // Studiengangsansicht @@ -133,7 +133,7 @@ else else { // Pers. Ansicht - $sql_query.=" AND EXISTS (SELECT 1 FROM campus.vw_student_lehrveranstaltung + $sql_query.=" AND EXISTS (SELECT 1 FROM campus.vw_student_lehrveranstaltung WHERE lehreinheit_id=vw_stundenplan.lehreinheit_id AND uid=".$db->db_add_param($pers_uid).")"; } // Manfred weiss nicht mehr warum, aber wir aktivieren 23-09-2009 @@ -154,16 +154,16 @@ $num_rows_stpl = $db->db_num_rows($erg_stpl); //Reservierungen $sql_query=" -SELECT - vw_reservierung.*, vw_mitarbeiter.titelpre, vw_mitarbeiter.titelpost, - vw_mitarbeiter.vorname, vw_mitarbeiter.nachname, reserviert_von.titelpre AS titelpre_reserviertvon, reserviert_von.titelpost AS titelpost_reserviertvon, - reserviert_von.vorname AS vorname_reserviertvon, reserviert_von.nachname AS nachname_reserviertvon -FROM +SELECT + vw_reservierung.*, vw_mitarbeiter.titelpre, vw_mitarbeiter.titelpost, + vw_mitarbeiter.vorname, vw_mitarbeiter.nachname, reserviert_von.titelpre AS titelpre_reserviertvon, reserviert_von.titelpost AS titelpost_reserviertvon, + reserviert_von.vorname AS vorname_reserviertvon, reserviert_von.nachname AS nachname_reserviertvon +FROM campus.vw_reservierung JOIN campus.vw_mitarbeiter ON vw_reservierung.uid=vw_mitarbeiter.uid LEFT JOIN campus.vw_mitarbeiter reserviert_von ON vw_reservierung.insertvon=reserviert_von.uid -WHERE - datum=".$db->db_add_param($datum)." +WHERE + datum=".$db->db_add_param($datum)." AND stunde=".$db->db_add_param($stunde); if (isset($ort_kurzbz) && $type=='ort') @@ -172,7 +172,7 @@ if ($type=='lektor') $sql_query.=" AND vw_reservierung.uid=".$db->db_add_param($pers_uid); if ($type=='verband' || $type=='student') { - $sql_query.=" AND studiengang_kz=".$db->db_add_param($stg_kz)." + $sql_query.=" AND studiengang_kz=".$db->db_add_param($stg_kz)." AND (semester=".$db->db_add_param($sem)." OR semester=0 OR semester IS NULL)"; } $sql_query.=' ORDER BY titel LIMIT 100'; @@ -258,12 +258,12 @@ if ($num_rows_stpl>0) echo (!is_null($semester) && !empty($semester)?'':''); echo ' - + '.$db->convert_html_chars($gruppe_kurzbz).' '.$db->convert_html_chars($titel).' - - '; + + '; } echo '
'; } @@ -294,7 +294,7 @@ if ($num_rows_repl>0) $pers_nachname_reserviertvon=$row->nachname_reserviertvon; $ort->load($ortkurzbz); - + echo ''; echo ''.$db->convert_html_chars($titel).''; echo ''.(!empty($ortkurzbz)?($ort->content_id!=''?''.$db->convert_html_chars($ortkurzbz).'':$db->convert_html_chars($ortkurzbz)):$db->convert_html_chars($ortkurzbz)).''; @@ -304,6 +304,6 @@ if ($num_rows_repl>0) } echo '
'; } -echo '

'.$p->t('lvplan/fehlerUndFeedback').' '.$p->t('lvplan/lvKoordinationsstelle').'.

+echo '

'.$p->t('lvplan/FragenZuLvPlan', array(MAIL_LVPLAN)).'

'; ?> diff --git a/cis/private/lvplan/stpl_kalender.php b/cis/private/lvplan/stpl_kalender.php index 16ea2e48f..6b0f452cd 100644 --- a/cis/private/lvplan/stpl_kalender.php +++ b/cis/private/lvplan/stpl_kalender.php @@ -341,7 +341,7 @@ elseif($format=='excel') // Print in HTML-File else { - echo '

'.$p->t('lvplan/fehlerUndFeedback').' '.$p->t('lvplan/lvKoordinationsstelle').'

'; + echo '

'.$p->t('lvplan/FragenZuLvPlan', array(MAIL_LVPLAN)).'

'; echo ''; } diff --git a/cis/private/lvplan/stpl_week.php b/cis/private/lvplan/stpl_week.php index f600c6db5..323eb89eb 100644 --- a/cis/private/lvplan/stpl_week.php +++ b/cis/private/lvplan/stpl_week.php @@ -524,6 +524,6 @@ if (isset($reservdelcount)) echo "Es wurde".($reservdelcount!=1?'n':'')." $reservdelcount Stunde".($reservdelcount!=1?'n':'')." gelöscht!
"; ?> -


t('lvplan/fehlerUndFeedback');?> t('lvplan/lvKoordinationsstelle');?>.

+


t('lvplan/FragenZuLvPlan', array(MAIL_LVPLAN)); ?>.

diff --git a/composer.json b/composer.json index 9e0c0fb7c..216d315d9 100644 --- a/composer.json +++ b/composer.json @@ -326,6 +326,17 @@ } } }, + { + "type": "package", + "package": { + "name": "vuejs/vuejs3_dev", + "version": "3.3.8", + "dist": { + "url": "https://unpkg.com/vue@3.3.8/dist/vue.global.js", + "type": "file" + } + } + }, { "type": "package", "package": { @@ -439,6 +450,7 @@ }, "require-dev": { + "vuejs/vuejs3_dev": "3.3.8", "squizlabs/php_codesniffer": "3.6.*", "phpmd/phpmd": "2.*", "phpmetrics/phpmetrics": "2.*", diff --git a/composer.lock b/composer.lock index 6eb3e0383..27132ecff 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "eedcd2abe226d372ff8d735498eb3b0a", + "content-hash": "01ea35652d88680f8262c5365828eb46", "packages": [ { "name": "afarkas/html5shiv", @@ -4680,6 +4680,15 @@ }, "time": "2019-06-13T22:48:21+00:00" }, + { + "name": "vuejs/vuejs3_dev", + "version": "3.3.8", + "dist": { + "type": "file", + "url": "https://unpkg.com/vue@3.3.8/dist/vue.global.js" + }, + "type": "library" + }, { "name": "webmozart/assert", "version": "1.9.1", diff --git a/config/global.config-default.inc.php b/config/global.config-default.inc.php index 64d6d3a60..0d4158b48 100644 --- a/config/global.config-default.inc.php +++ b/config/global.config-default.inc.php @@ -338,4 +338,19 @@ define('DIENSTVERHAELTNIS_SUPPORT', false); // Falls Studstatus (Abmeldung, AbmeldungStg, Unterbrechung, Wiederholung) verwendet wird zeige Hinweistext bei Eingabe einer kommissionellen oder zusaetzlichen kommissionellen Pruefung define('FAS_STUDSTATUS_SHOW_KOMM_PRFG_HINT', false); + +// default absender (@DOMAIN wird hinzugefuegt daher ohne angeben) +define('SANCHO_MAIL_DEFAULT_SENDER', 'noreply'); + +// header und footer Bilder für eigene Mails verwenden +define('SANCHO_MAIL_USE_IMAGES', true); + +// Pfad für Bilder für eigene Mails, relativ zu document root +define('SANCHO_MAIL_IMG_PATH', 'skin/images/sancho/'); + +// header Bild für eigene Mails +define('SANCHO_MAIL_HEADER_IMG', 'sancho_header_DEFAULT.jpg'); + +// footer image for eigene Mails +define('SANCHO_MAIL_FOOTER_IMG', 'sancho_footer_DEFAULT.jpg'); ?> diff --git a/content/statistik/studentenexportextended.xls.php b/content/statistik/studentenexportextended.xls.php index 81e51b53a..89acbe18f 100644 --- a/content/statistik/studentenexportextended.xls.php +++ b/content/statistik/studentenexportextended.xls.php @@ -127,6 +127,8 @@ $worksheet->write($zeile, ++$i, "STAATSBÜRGERSCHAFT", $format_bold); $maxlength[$i] = 16; $worksheet->write($zeile, ++$i, "SVNR", $format_bold); $maxlength[$i] = 4; +$worksheet->write($zeile, ++$i, "PERSON_ID", $format_bold); +$maxlength[$i] = 6; $worksheet->write($zeile, ++$i, "ERSATZKENNZEICHEN", $format_bold); $maxlength[$i] = 17; $worksheet->write($zeile, ++$i, "GESCHLECHT", $format_bold); @@ -399,6 +401,12 @@ function draw_content($row) $maxlength[$i] = mb_strlen($row->svnr); $worksheet->write($zeile, $i, $row->svnr); $i++; + + //Person_id + if (mb_strlen($row->person_id) > $maxlength[$i]) + $maxlength[$i] = mb_strlen($row->person_id); + $worksheet->write($zeile, $i, $row->person_id); + $i++; //Ersatzkennzeichen if (mb_strlen($row->ersatzkennzeichen) > $maxlength[$i]) diff --git a/content/student/studentenoverlay.xul.php b/content/student/studentenoverlay.xul.php index cdaa2e69b..739cde39c 100644 --- a/content/student/studentenoverlay.xul.php +++ b/content/student/studentenoverlay.xul.php @@ -208,6 +208,7 @@ else + diff --git a/include/lehrveranstaltung_faktor.class.php b/include/lehrveranstaltung_faktor.class.php new file mode 100644 index 000000000..49459321b --- /dev/null +++ b/include/lehrveranstaltung_faktor.class.php @@ -0,0 +1,258 @@ +load($lehrveranstaltung_faktor_id); + } + + + public function load($lehrveranstaltung_faktor_id) + { + if (!is_numeric($lehrveranstaltung_faktor_id)) + { + $this->errormsg = 'Lehrveranstaltung_faktor_id muss eine gueltige Zahl sein'; + return false; + } + + $qry = "SELECT * FROM lehre.tbl_lehrveranstaltung_faktor + WHERE lehrveranstaltung_faktor_id=".$this->db_add_param($lehrveranstaltung_faktor_id, FHC_INTEGER); + + if (!$this->db_query($qry)) { + $this->errormsg = 'Datensatz konnte nicht geladen werden'; + return false; + } + + if ($row = $this->db_fetch_object()) + { + $this->lehrveranstaltung_faktor_id = $row->lehrveranstaltung_faktor_id; + $this->lehrveranstaltung_id = $row->lehrveranstaltung_id; + $this->faktor = $row->faktor; + $this->studiensemester_kurzbz_von = $row->studiensemester_kurzbz_von; + $this->studiensemester_kurzbz_bis = $row->studiensemester_kurzbz_bis; + } + + return true; + } + + public function loadByLV($lv_id, $von = null, $bis = null, $id = null) + { + + if (!is_numeric($lv_id)) + { + $this->errormsg = 'Lehrveranstaltung_faktor_id muss eine gueltige Zahl sein'; + return false; + } + $qry = "SELECT * + FROM lehre.tbl_lehrveranstaltung_faktor + LEFT JOIN public.tbl_studiensemester vonstsem + ON tbl_lehrveranstaltung_faktor.studiensemester_kurzbz_von = vonstsem.studiensemester_kurzbz + LEFT JOIN public.tbl_studiensemester bisstem + ON tbl_lehrveranstaltung_faktor.studiensemester_kurzbz_bis = bisstem.studiensemester_kurzbz + WHERE lehrveranstaltung_id = ".$this->db_add_param($lv_id, FHC_INTEGER); + + if(!empty($von)) + { + $qry .= " + AND (bisstem.ende >= ( + SELECT start + FROM public.tbl_studiensemester + WHERE studiensemester_kurzbz = " . $this->db_add_param($von, FHC_STRING) . " + ) + OR bisstem.ende IS NULL + )"; + } + + if(!empty($bis) && $bis !== "") + { + $qry .= " + AND + (vonstsem.start <= ( + SELECT ende + FROM public.tbl_studiensemester + WHERE studiensemester_kurzbz = " . $this->db_add_param($bis, FHC_STRING) . " + )) + "; + } + + if (!empty($id) && $id !== "") + { + $qry .= " + AND + lehrveranstaltung_faktor_id != ". $this->db_add_param($id, FHC_INTEGER); + } + + if (!$result = $this->db_query($qry)) { + $this->errormsg = 'Datensatz konnte nicht geladen werden'; + return false; + } + + while ($row = $this->db_fetch_object($result)) + { + $lv_faktor_objekt = new lehrveranstaltung_faktor(); + + $lv_faktor_objekt->lehrveranstaltung_faktor_id = $row->lehrveranstaltung_faktor_id; + $lv_faktor_objekt->lehrveranstaltung_id = $row->lehrveranstaltung_id; + $lv_faktor_objekt->faktor = $row->faktor; + $lv_faktor_objekt->studiensemester_kurzbz_von = $row->studiensemester_kurzbz_von; + $lv_faktor_objekt->studiensemester_kurzbz_bis = $row->studiensemester_kurzbz_bis; + + $this->lv_faktoren[] = $lv_faktor_objekt; + } + + return true; + } + + public function addFaktor($lv_id, $faktor, $von, $bis = NULL) + { + $qry = 'INSERT INTO lehre.tbl_lehrveranstaltung_faktor (lehrveranstaltung_id, faktor, studiensemester_kurzbz_von, studiensemester_kurzbz_bis) + VALUES ('. $this->db_add_param($lv_id, FHC_INTEGER) . ', '. + $this->db_add_param($faktor, FHC_INTEGER) . ', '. + $this->db_add_param($von, FHC_STRING) . ', '. + $this->db_add_param($bis, FHC_STRING) . ');'; + + if ($this->db_query($qry)) + { + $qry_id = "SELECT currval('lehre.lehrveranstaltung_faktor_id_seq') as id;"; + if($this->db_query($qry_id)) + { + if($row = $this->db_fetch_object()) + { + $this->db_query('COMMIT'); + return [ + 'id' => $row->id, + 'lv_id' => $lv_id, + 'faktor' => $faktor, + 'von' => $von, + 'bis' => $bis + ]; + } + else + { + $this->db_query('ROLLBACK'); + return [ + 'status' => 'error', + 'message' => 'Fehler beim Einfügen in die Datenbank:' + ]; + } + } + else + { + $this->db_query('ROLLBACK'); + return [ + 'status' => 'error', + 'message' => 'Fehler beim Einfügen in die Datenbank:' + ]; + } + } + else + { + return [ + 'status' => 'error', + 'message' => 'Fehler beim Einfügen in die Datenbank:' + ]; + } + } + + public function updateFaktor($id, $faktor, $von, $bis) + { + $qry = "UPDATE lehre.tbl_lehrveranstaltung_faktor + SET faktor = ". $this->db_add_param($faktor) ." , + studiensemester_kurzbz_von = ". $this->db_add_param($von) .", + studiensemester_kurzbz_bis = ". $this->db_add_param($bis) ." + WHERE lehrveranstaltung_faktor_id = ". $this->db_add_param($id, FHC_INTEGER); + + if ($this->db_query($qry)) + { + return true; + } + else + { + return [ + 'status' => 'error', + 'message' => 'Fehler beim Einfügen in die Datenbank:' + ]; + } + } + + public function getAkt($lv_id) + { + if (!is_numeric($lv_id)) + { + $this->errormsg = 'Lehrveranstaltung_id muss eine gueltige Zahl sein'; + return false; + } + + $qry = "SELECT * + FROM lehre.tbl_lehrveranstaltung_faktor + LEFT JOIN public.tbl_studiensemester vonstsem + ON tbl_lehrveranstaltung_faktor.studiensemester_kurzbz_von = vonstsem.studiensemester_kurzbz + LEFT JOIN public.tbl_studiensemester bisstem + ON tbl_lehrveranstaltung_faktor.studiensemester_kurzbz_bis = bisstem.studiensemester_kurzbz + WHERE lehrveranstaltung_id = ".$this->db_add_param($lv_id, FHC_INTEGER) . " + AND (vonstsem.start <= now() OR vonstsem.start IS NULL) + AND (bisstem.ende >= now() OR bisstem.ende IS NULL) + ORDER BY vonstsem.start DESC LIMIT 1 + "; + + + if (!$this->db_query($qry)) { + $this->errormsg = 'Datensatz konnte nicht geladen werden'; + return false; + } + + if ($row = $this->db_fetch_object()) + { + $this->lehrveranstaltung_faktor_id = $row->lehrveranstaltung_faktor_id; + $this->lehrveranstaltung_id = $row->lehrveranstaltung_id; + $this->faktor = $row->faktor; + $this->studiensemester_kurzbz_von = $row->studiensemester_kurzbz_von; + $this->studiensemester_kurzbz_bis = $row->studiensemester_kurzbz_bis; + } + + return true; + } + + + public function deleteFaktor($id) + { + $qry = "DELETE FROM lehre.tbl_lehrveranstaltung_faktor + WHERE lehrveranstaltung_faktor_id = ". $this->db_add_param($id, FHC_INTEGER); + + if ($this->db_query($qry)) + { + return true; + } + else + { + return [ + 'status' => 'error', + 'message' => 'Fehler beim Löschen aus der Datenbank:' + ]; + } + } +} +?> diff --git a/include/mitarbeiter.class.php b/include/mitarbeiter.class.php index 836e2e6a7..1517122c2 100644 --- a/include/mitarbeiter.class.php +++ b/include/mitarbeiter.class.php @@ -1237,7 +1237,7 @@ class mitarbeiter extends benutzer ".$this->db_add_param($datumvon)." BETWEEN COALESCE(vbskarenz.von, '1970-01-01') AND COALESCE(vbskarenz.bis, '2170-12-31') OR ".$this->db_add_param($datumbis)." BETWEEN COALESCE(vbskarenz.von, '1970-01-01') AND COALESCE(vbskarenz.bis, '2170-12-31') - ) + ) LIMIT 1 ) NULLS FIRST LIMIT 1 ) diff --git a/include/notiz.class.php b/include/notiz.class.php index 5d237e2b8..c2e4c4ebf 100644 --- a/include/notiz.class.php +++ b/include/notiz.class.php @@ -325,7 +325,7 @@ class notiz extends basis_db FROM public.tbl_notiz LEFT JOIN public.tbl_notizzuordnung USING(notiz_id) - WHERE 1=1"; + WHERE 1=1 AND tbl_notiz.typ IS NULL "; if(!is_null($erledigt)) { @@ -523,7 +523,7 @@ class notiz extends basis_db FROM public.tbl_notiz LEFT JOIN public.tbl_notizzuordnung USING(notiz_id) - WHERE 1=1"; + WHERE 1=1 AND tbl_notiz.typ IS NULL "; if(!is_null($erledigt)) { diff --git a/include/sancho.inc.php b/include/sancho.inc.php index 5fc6fcdab..4da3768b5 100644 --- a/include/sancho.inc.php +++ b/include/sancho.inc.php @@ -18,12 +18,13 @@ * * Authors: Cristina Hainberger */ + +require_once(dirname(__FILE__).'/../config/global.config.inc.php'); require_once(dirname(__FILE__).'/basis_db.class.php'); require_once(dirname(__FILE__).'/mail.class.php'); require_once(dirname(__FILE__).'/vorlage.class.php'); -const DEFAULT_SANCHO_HEADER_IMG = 'sancho_header_DEFAULT.jpg'; -const DEFAULT_SANCHO_FOOTER_IMG = 'sancho_footer_DEFAULT.jpg'; +const FALLBACK_SENDER = 'noreply'; /** * Send single Mail with Sancho Design and Layout. @@ -32,22 +33,66 @@ const DEFAULT_SANCHO_FOOTER_IMG = 'sancho_footer_DEFAULT.jpg'; * to be replaced in the content template. * @param string $to Email-adress. * @param string $subject Subject of mail. - * @param string $headerImg Filename of the specific Sancho header image. - * @param string $footerImg + * @param string $headerImg Filename of the specific Sancho header image, false if no header image + * @param string $footerImg - false if no footer image * @param string $replyTo default Email-adress for reply. * @param string | array $cc * @return boolean True, if succeeded. */ -function sendSanchoMail($vorlage_kurzbz, $vorlage_data, $to, $subject, $headerImg = DEFAULT_SANCHO_HEADER_IMG, $footerImg = DEFAULT_SANCHO_FOOTER_IMG, $replyTo = '', $cc = '') -{ - $from = 'sancho@'. DOMAIN; - $sanchoHeader_img = dirname(__FILE__). '/../skin/images/sancho/'. $headerImg; - $sanchoFooter_img = dirname(__FILE__). '/../skin/images/sancho/'. $footerImg; +function sendSanchoMail($vorlage_kurzbz, $vorlage_data, $to, $subject, $headerImg = '', $footerImg = '', $replyTo = '', $cc = '') +{ + $from = ((defined('SANCHO_MAIL_DEFAULT_SENDER') && SANCHO_MAIL_DEFAULT_SENDER != '') + ? SANCHO_MAIL_DEFAULT_SENDER + : FALLBACK_SENDER) + . '@' . DOMAIN; + + $image_path_prefix = dirname(__DIR__).'/'.(defined('SANCHO_MAIL_IMG_PATH') ? SANCHO_MAIL_IMG_PATH : ''); + $sanchoHeader_img = ''; + $sanchoFooter_img = ''; + $cid_header = ''; + $cid_footer = ''; + + if (!defined('SANCHO_MAIL_USE_IMAGES') || SANCHO_MAIL_USE_IMAGES) + { + if (isset($headerImg) && $headerImg != '') + { + // use provided header image + $sanchoHeader_img = $headerImg; + } + elseif (defined('SANCHO_MAIL_HEADER_IMG') && SANCHO_MAIL_HEADER_IMG != '') + { + // use default header image + $sanchoHeader_img = SANCHO_MAIL_HEADER_IMG; + } + + if ($sanchoHeader_img != '') + { + // set full image path + $sanchoHeader_img = $image_path_prefix.$sanchoHeader_img; + } + + if (isset($footerImg) && $footerImg != '') + { + // use provided footer image + $sanchoFooter_img = $footerImg; + } + elseif (defined('SANCHO_MAIL_FOOTER_IMG') && SANCHO_MAIL_FOOTER_IMG != '') + { + // use default footer image + $sanchoFooter_img = SANCHO_MAIL_FOOTER_IMG; + } + + if ($sanchoFooter_img !== '') + { + // set full image path + $sanchoFooter_img = $image_path_prefix.$sanchoFooter_img; + } + + // Set unique content id for embedding header and footer image + $cid_header = uniqid(); + $cid_footer = uniqid(); + } - // Set unique content id for embedding header and footer image - $cid_header = uniqid(); - $cid_footer = uniqid(); - // Set specific mail content into specific content template $content = parseMailContent($vorlage_kurzbz, $vorlage_data); @@ -63,22 +108,22 @@ function sendSanchoMail($vorlage_kurzbz, $vorlage_data, $to, $subject, $headerIm // Send mail $mail = new Mail($to, $from, $subject, $body); - - // * embed the images - $mail->addEmbeddedImage($sanchoHeader_img, 'image/jpg', '', $cid_header); - $mail->addEmbeddedImage($sanchoFooter_img, 'image/jpg', '', $cid_footer); + + // * embed the images if needed + if ($sanchoHeader_img != '') $mail->addEmbeddedImage($sanchoHeader_img, 'image/jpg', '', $cid_header); + if ($sanchoFooter_img != '') $mail->addEmbeddedImage($sanchoFooter_img, 'image/jpg', '', $cid_footer); // * Set reply-to if (isset($replyTo) && $replyTo != '') $mail->setReplyTo($replyTo); - + // * Set cc if (isset($cc) && $cc != '') $mail->setCCRecievers($cc); // * embed the html content $mail->setHTMLContent($body); - + return $mail->send(); } @@ -95,7 +140,7 @@ function parseMailContent($vorlage_kurzbz, $vorlage_data) { $vorlage = new Vorlage(); $vorlage->getAktuelleVorlage('etw', $vorlage_kurzbz); - + // If the text and the subject of the template are not empty if (!empty($vorlage->text)) { diff --git a/locale/de-AT/lvplan.php b/locale/de-AT/lvplan.php index 59fd5169a..a7fa69cb1 100644 --- a/locale/de-AT/lvplan.php +++ b/locale/de-AT/lvplan.php @@ -101,4 +101,5 @@ $this->phrasen['lvplan/folgendeAenderungen']='Es haben sich folgende Aenderungen $this->phrasen['lvplan/reserviertInDev']='reserviert
für
lehre'; $this->phrasen['lvplan/raumNichtReservierbar']='Die Möglichkeit der Reservierung ist für diesen Raum deaktiviert.'; $this->phrasen['lvplan/reserviertVon']='Reserviert von'; -?> \ No newline at end of file +$this->phrasen['lvplan/FragenZuLvPlan']='Für Fragen zu Ihrem LV-Plan wenden Sie sich bitte an Ihre LV-Koordinationsstelle'; +?> diff --git a/locale/en-US/lvplan.php b/locale/en-US/lvplan.php index 1a8c865bf..906784b64 100644 --- a/locale/en-US/lvplan.php +++ b/locale/en-US/lvplan.php @@ -100,4 +100,5 @@ $this->phrasen['lvplan/folgendeAenderungen']='There have been the following chan $this->phrasen['lvplan/reserviertInDev']='not
available'; $this->phrasen['lvplan/raumNichtReservierbar']='Reservation is disabled for this room.'; $this->phrasen['lvplan/reserviertVon']='Reserved by'; +$this->phrasen['lvplan/FragenZuLvPlan']='For questions about your personal schedule, please contact the Course-Coordination Office'; ?> diff --git a/public/css/Cis4/Cis.css b/public/css/Cis4/Cis.css index 2762e2235..78d9215f1 100644 --- a/public/css/Cis4/Cis.css +++ b/public/css/Cis4/Cis.css @@ -182,6 +182,10 @@ html { transform: rotate(-90deg); } +#nav-sprachen{ + transition: none; +} + /* searchbar */ #nav-search { z-index: 1; @@ -478,15 +482,28 @@ html { } .fhc-entry:hover{ - background-color:#0088d6 !important; + background-color:#005585 !important; color:white !important; } +.fhc-entry.btn:focus { + box-shadow: none !important; +} + +.fhc-entry.btn { + border-radius: 0 !important; +} + .fhc-entry { transition-property: background,color; transition-duration: 0.3s,0.2s; transition-timing-function: ease-out,ease-out; } + +[selected].fhc-entry { + background-color: #00649C !important; +} + @media screen and ( max-width: 767px ) { #nav-search { position: static; @@ -527,4 +544,25 @@ html { padding-left: 2.5rem; overflow-wrap: anywhere; } +} + +/* classes used for the Vue component*/ +.v-enter-active, +.v-leave-active { + transition: opacity 0.2s ease-out; +} + +.v-enter-from, +.v-leave-to { + opacity: 0; +} + +.height-enter-active, +.height-leave-active { + transition: height 0.3s ease-out; +} + +.height-enter-from, +.height-leave-to { + height: 0px; } \ No newline at end of file diff --git a/public/css/components/dashboard/news.css b/public/css/components/dashboard/news.css index 366542969..742884371 100644 --- a/public/css/components/dashboard/news.css +++ b/public/css/components/dashboard/news.css @@ -1,27 +1,72 @@ -.widgets-news .card-header { - flex-direction: column; - align-items: flex-start !important; - -} - :root{ --news-widget-height: 1; } -.widgets-news .news-content > div, -.widgets-news .news-content .row:nth-child(1), -.widgets-news .news-content .news-list, -.widgets-news .news-content .news-list-item, -.widgets-news .news-content .card-body -{ - height: 100%; -} - .widgets-news img { max-width: 100%; } -.widgets-news .card-body{ - overflow: hidden; -} \ No newline at end of file +.fhc-news-menu-item { + padding: 0.375rem; + color: var(--fhc-cis-menu-lvl-1-color); + min-height: 5%; + max-height: 30%; + width: 100%; + justify-content: space-between; + align-items: center; + background-color: #00649c; + border: 1px solid #f1f1f1; + font-size: 16px; + cursor: pointer; + transition: background-color 0.2s ease, border-color 0.2s ease; /* Smooth transition */ +} + +.fhc-news-menu-item:hover { + background-color: var(--fhc-cis-menu-lvl-1-bg-hover); + border-color: #f1f1f1; +} + +.fhc-news-menu-item:active { + background-color: var(--fhc-cis-menu-lvl-1-color-hover); + border-color: #f1f1f1; +} + +.fhc-news-menu-item.selected { + background-color: var(--fhc-cis-menu-lvl-1-bg-hover); + border-right: 2px solid #fff; + +} + +.fhc-news-menu-item:focus { + outline: none; +} + +.fhc-news-menu-item-betreff +{ + width: 100%; + text-align: center; + max-height: 100%; + height: 100%; +} + +.fhc-news-menu-item-date { + text-align: end; + width: 100%; + max-height: 100%; + height: 100%; +} + +.fhc-carousel .carousel-item { + transition: transform 0.375s ease-in-out, opacity 0.75s ease-in-out; +} + +.fhc-carousel .carousel-item-next, +.fhc-carousel .carousel-item-prev { + transition: transform 0.44s ease-in-out, opacity 0.8s ease-in-out; +} + +.fhc-carousel .carousel-item-start, +.fhc-carousel .carousel-item-end { + transition: transform 0.44s ease-in-out, opacity 0.8s ease-in-out; +} diff --git a/public/css/components/searchbar/searchbar.css b/public/css/components/searchbar/searchbar.css index a4476e7c5..3250a20c7 100644 --- a/public/css/components/searchbar/searchbar.css +++ b/public/css/components/searchbar/searchbar.css @@ -26,6 +26,7 @@ width: 100%; left: 0; right: 0; + box-shadow: 2px 2px 4px rgba(0, 0, 0, .4); } .searchbar_results_scroller { @@ -109,3 +110,7 @@ -moz-user-select: none; /* Firefox */ -ms-user-select: none; /* IE/Edge */ } + +.searchbar_inaktiv { + opacity: .6; +} \ No newline at end of file diff --git a/public/css/tags.css b/public/css/tags.css new file mode 100644 index 000000000..8cf306626 --- /dev/null +++ b/public/css/tags.css @@ -0,0 +1,100 @@ +.tag { + display: inline-block; + padding: 5px 10px; + margin-right: 5px; + border-radius: 3px; + color: white; + font-size: .75em; + font-weight: 700; + line-height: 1; + text-align: center; + white-space: nowrap; + vertical-align: baseline; +} + +.tag:hover +{ + transform: scale(1.15); +} + +.tag_rot { + background-color: #ff0000ff; +} + +.tag_gelb { + background-color: #ffff00ff; + color: black; +} +.tag_gruen { + background-color: #008000ff; +} + +.tag_rosa { + background-color: #FFC1C1; + color: black; +} + +.tag_aprikose { + background-color: #4f7596; +} + +.tag_pfirsich { + background-color: #a15f95; +} + +.tag_orange { + background-color: #ffA500ff; +} + + +.tag_braun { + background-color: #6d4c41; +} + +.tag_blau { + background-color: #508498; +} + +.tag_lavendel { + background-color: #C7A3FF; +} + +.tag_limette { + background-color: #D3FFCE; +} + +.tag_done { + text-decoration: line-through; +} + +.display_all { + background-color: darkgrey !important; + border: none; +} + +.dropdown_list { + list-style: none; + background-color: white; + border: 1px solid #ccc; + border-radius: 5px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); + z-index: 1000; + position: absolute; + padding: 10px 10px 10px; + max-width: 200px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + cursor: pointer; +} + +.plus_button_container.disabled { + pointer-events: none; + opacity: 0.5; +} + +.modificationdate { + font-style: italic; + font-size: 0.7em; + text-align: left; +} diff --git a/public/js/api/phrasen.js b/public/js/api/phrasen.js index c5994ea9b..769686447 100644 --- a/public/js/api/phrasen.js +++ b/public/js/api/phrasen.js @@ -22,5 +22,11 @@ export default { setLanguage(categories,language) { const payload = {categories, language} return this.$fhcApi.post('/api/frontend/v1/phrasen/setLanguage', payload); + }, + getLanguage() { + return this.$fhcApi.get('/api/frontend/v1/phrasen/getLanguage', {}); + }, + getActiveDbLanguages() { + return this.$fhcApi.get('/api/frontend/v1/phrasen/getAllLanguages', {}); } }; \ No newline at end of file diff --git a/public/js/apps/Cis.js b/public/js/apps/Cis.js index c9d322e07..6499bd382 100644 --- a/public/js/apps/Cis.js +++ b/public/js/apps/Cis.js @@ -18,6 +18,7 @@ const app = Vue.createApp({ calcheightonly: true, types: [ "mitarbeiter", + "student", "raum", "organisationunit" ], @@ -33,6 +34,17 @@ const app = Vue.createApp({ }, childactions: [] }, + student: { + defaultaction: { + type: "link", + action: function (data) { + return FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + + "/Cis/Profil/View/" + data.uid; + + } + }, + childactions: [] + }, raum: { defaultaction: { type: "link", diff --git a/public/js/apps/Cis/Stundenplan.js b/public/js/apps/Cis/Stundenplan.js index 441d83f35..afe400c82 100644 --- a/public/js/apps/Cis/Stundenplan.js +++ b/public/js/apps/Cis/Stundenplan.js @@ -2,6 +2,8 @@ import FhcCalendar from "../../components/Calendar/Calendar.js"; import Phrasen from "../../plugin/Phrasen.js"; import CalendarDate from "../../composables/CalendarDate.js"; import LvModal from "../../components/Cis/Mylv/LvModal.js"; +import LvInfo from "../../components/Cis/Mylv/LvInfo.js" +import LvMenu from "../../components/Cis/Mylv/LvMenu.js" const app = Vue.createApp({ @@ -17,7 +19,7 @@ const app = Vue.createApp({ } }, components: { - FhcCalendar, LvModal + FhcCalendar, LvModal, LvMenu, LvInfo }, computed:{ weekFirstDay: function () { @@ -35,6 +37,9 @@ const app = Vue.createApp({ }, methods:{ + setSelectedEvent: function (event) { + this.currentlySelectedEvent = event; + }, getLvID: function () { this.lv_id = window.location.pathname }, @@ -111,7 +116,7 @@ const app = Vue.createApp({

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


- + -