diff --git a/application/config/routes.php b/application/config/routes.php index eb4c267ce..798d29ad0 100644 --- a/application/config/routes.php +++ b/application/config/routes.php @@ -61,7 +61,7 @@ $route['api/v1/organisation/[O|o]rganisationseinheit/(:any)'] = 'api/v1/organisa $route['api/v1/ressource/[B|b]etriebsmittelperson/(:any)'] = 'api/v1/ressource/betriebsmittelperson2/$1'; $route['api/v1/system/[S|s]prache/(:any)'] = 'api/v1/system/sprache2/$1'; -$route['Cis/Stundenplan/.*'] = 'Cis/Stundenplan/index/$1'; +$route['Cis/LvPlan/.*'] = 'Cis/LvPlan/index/$1'; // load routes from extensions $subdir = 'application/config/extensions'; diff --git a/application/controllers/Cis/Stundenplan.php b/application/controllers/Cis/LvPlan.php similarity index 85% rename from application/controllers/Cis/Stundenplan.php rename to application/controllers/Cis/LvPlan.php index 71e01be8b..ea48f09f0 100644 --- a/application/controllers/Cis/Stundenplan.php +++ b/application/controllers/Cis/LvPlan.php @@ -5,7 +5,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** * */ -class Stundenplan extends Auth_Controller +class LvPlan extends Auth_Controller { /** * Constructor @@ -30,6 +30,6 @@ class Stundenplan extends Auth_Controller 'uid'=>getAuthUID(), ); - $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'Stundenplan']); + $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'LvPlan']); } } diff --git a/application/controllers/api/frontend/v1/Stundenplan.php b/application/controllers/api/frontend/v1/LvPlan.php similarity index 82% rename from application/controllers/api/frontend/v1/Stundenplan.php rename to application/controllers/api/frontend/v1/LvPlan.php index 11a8a7034..00183cce8 100644 --- a/application/controllers/api/frontend/v1/Stundenplan.php +++ b/application/controllers/api/frontend/v1/LvPlan.php @@ -20,7 +20,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); use CI3_Events as Events; -class Stundenplan extends FHCAPI_Controller +class LvPlan extends FHCAPI_Controller { /** @@ -33,10 +33,10 @@ class Stundenplan extends FHCAPI_Controller 'getRoomplan' => self::PERM_LOGGED, 'Stunden' => self::PERM_LOGGED, 'Reservierungen' => self::PERM_LOGGED, - 'StundenplanEvents' => self::PERM_LOGGED, + 'LvPlanEvents' => self::PERM_LOGGED, 'getLehreinheitStudiensemester' => self::PERM_LOGGED, 'studiensemesterDateInterval' => self::PERM_LOGGED, - 'getLvStundenplanForStudiensemester' => self::PERM_LOGGED, + 'getLvPlanForStudiensemester' => self::PERM_LOGGED, ]); $this->load->library('LogLib'); @@ -51,7 +51,7 @@ class Stundenplan extends FHCAPI_Controller $this->load->library('form_validation'); //load models - $this->load->model('ressource/Stundenplan_model', 'StundenplanModel'); + $this->load->model('ressource/Stundenplan_model', 'LvPlanModel'); $this->load->model('ressource/Reservierung_model', 'ReservierungModel'); @@ -61,12 +61,12 @@ class Stundenplan extends FHCAPI_Controller // Public methods /** - * fetches Stundenplan and Moodle events together + * fetches LvPlan and Moodle events together * @access public * */ - public function StundenplanEvents(){ - $this->load->library('StundenplanLib'); + public function LvPlanEvents(){ + $this->load->library('LvPlanLib'); // form validation $this->load->library('form_validation'); @@ -81,11 +81,12 @@ class Stundenplan extends FHCAPI_Controller $end_date = $this->input->get('end_date', TRUE); $lv_id = $this->input->get('lv_id', TRUE); - $stundenplan_events = $this->stundenplanlib->getStundenplan($start_date,$end_date,$lv_id); - if( is_null($stundenplan_events) || isEmptyArray($stundenplan_events) ) + $lvplan_events = $this->getDataOrTerminateWithError($this->lvplanlib->getLvPlan($start_date,$end_date,$lv_id)); + if( is_null($lvplan_events) || isEmptyArray($lvplan_events) ) { - $stundenplan_events = array(); + $lvplan_events = array(); } + // fetching moodle events $moodle_events = []; Events::trigger( @@ -101,7 +102,7 @@ class Stundenplan extends FHCAPI_Controller ] ); - $result = array_merge($stundenplan_events,$moodle_events); + $result = array_merge($lvplan_events,$moodle_events); // sort array with moodle events first usort($result, function($a, $b){ if ($a->type === 'moodle' && $b->type !== 'moodle') { @@ -123,16 +124,16 @@ class Stundenplan extends FHCAPI_Controller $this->terminateWithSuccess($studiensemester); } - public function getLvStundenplanForStudiensemester($studiensemester,$lvid){ - $this->load->library('StundenplanLib'); + public function getLvPlanForStudiensemester($studiensemester,$lvid){ + $this->load->library('LvPlanLib'); $this->load->model('organisation/Studiensemester_model','StudiensemesterModel'); $studiensemester_result = $this->StudiensemesterModel->loadWhere(["studiensemester_kurzbz"=>$studiensemester]); $studiensemester_result = current($this->getDataOrTerminateWithError($studiensemester_result)); $timespan_start = new DateTime($studiensemester_result->start); $timespan_ende = new DateTime($studiensemester_result->ende); - $stundenplan = $this->stundenplanlib->getStundenplan(date_format($timespan_start, 'Y-m-d'),date_format($timespan_ende, 'Y-m-d'), $lvid); - $this->terminateWithSuccess($stundenplan); + $lvplan = $this->lvplanlib->getLvPlan(date_format($timespan_start, 'Y-m-d'),date_format($timespan_ende, 'Y-m-d'), $lvid); + $this->terminateWithSuccess($lvplan); } @@ -160,7 +161,7 @@ class Stundenplan extends FHCAPI_Controller */ public function getRoomplan() { - $this->load->library('StundenplanLib'); + $this->load->library('LvPlanLib'); // form validation $this->load->library('form_validation'); $this->form_validation->set_data($_GET); @@ -174,19 +175,19 @@ class Stundenplan extends FHCAPI_Controller $start_date = $this->input->get('start_date', TRUE); $end_date = $this->input->get('end_date', TRUE); - $roomplan_data = $this->StundenplanModel->stundenplanGruppierung($this->StundenplanModel->getRoomQuery($ort_kurzbz, $start_date, $end_date)); + $roomplan_data = $this->LvPlan->lvPlanGruppierung($this->LvPlan->getRoomQuery($ort_kurzbz, $start_date, $end_date)); $roomplan_data = $this->getDataOrTerminateWithError($roomplan_data); - $this->stundenplanlib->expand_object_information($roomplan_data); + $this->lvplanlib->expand_object_information($roomplan_data); $this->terminateWithSuccess($roomplan_data); } - // gets the reservierungen of a room if the ort_kurzbz parameter is supplied otherwise gets the reservierungen of the stundenplan of a student + // gets the reservierungen of a room if the ort_kurzbz parameter is supplied otherwise gets the reservierungen of the lvplan of a student public function Reservierungen($ort_kurzbz = null) { - $this->load->library('StundenplanLib'); + $this->load->library('LvPlanLib'); //form validation $this->load->library('form_validation'); $this->form_validation->set_data($_GET); @@ -200,7 +201,7 @@ class Stundenplan extends FHCAPI_Controller $start_date = $this->input->get('start_date', TRUE); $end_date = $this->input->get('end_date', TRUE); - $result = $this->stundenplanlib->getReservierungen($start_date,$end_date,$ort_kurzbz); + $result = $this->lvplanlib->getReservierungen($start_date,$end_date,$ort_kurzbz); $result = $this->getDataOrTerminateWithError($result); $this->terminateWithSuccess($result); } diff --git a/application/controllers/api/frontend/v1/Profil.php b/application/controllers/api/frontend/v1/Profil.php index c52d8bae5..f234fc30e 100644 --- a/application/controllers/api/frontend/v1/Profil.php +++ b/application/controllers/api/frontend/v1/Profil.php @@ -75,10 +75,7 @@ class Profil extends FHCAPI_Controller // if parsing the URL did not found a UID then the UID of the logged in user is used if ($uid == "Profil" || $uid == $this->uid) { $isMitarbeiter = $this->MitarbeiterModel->isMitarbeiter($this->uid); - if (isError($isMitarbeiter)) { - show_error("error while checking if UID: " . $this->uid . " is a mitarbeiter"); - } - $isMitarbeiter = getData($isMitarbeiter); + $isMitarbeiter = $this->getDataOrTerminateWithError($isMitarbeiter); if ($isMitarbeiter) { $res->view = "MitarbeiterProfil"; $res->data = $this->mitarbeiterProfil(); @@ -95,18 +92,13 @@ class Profil extends FHCAPI_Controller else { $this->PersonModel->addSelect(["person_id"]); $pid = $this->PersonModel->getByUid($uid); - if (isError($pid)) { - show_error("error while trying to update table public.tbl_person while searching for a person with UID: " . $uid); - } - $pid = hasData($pid) ? getData($pid)[0] : null; + $pid = $this->getDataOrTerminateWithError($pid); + $pid = $pid ? $pid[0] : null; if (!$pid) { - show_error("Person with UID: " . $uid . " does not exist"); + $this->terminateWithError("Person with UID: " . $uid . " does not exist"); } $isMitarbeiter = $this->MitarbeiterModel->isMitarbeiter($uid); - if (isError($isMitarbeiter)) { - show_error("error while checking if UID: " . $uid . " is a mitarbeiter"); - } - $isMitarbeiter = getData($isMitarbeiter); + $isMitarbeiter = $this->getDataOrTerminateWithError($isMitarbeiter); if ($isMitarbeiter) { $res->view = "ViewMitarbeiterProfil"; $res->data = $this->viewMitarbeiterProfil($uid); @@ -134,14 +126,11 @@ class Profil extends FHCAPI_Controller $res = $this->PersonModel->update($this->pid, ["foto_sperre" => $value]); if (isError($res)) { - show_error("error while trying to update table public.tbl_person"); + $this->terminateWithError("error while trying to update table public.tbl_person"); } $this->PersonModel->addSelect("foto_sperre"); $res = $this->PersonModel->load($this->pid); - if (isError($res)) { - show_error("error while trying to query table public.tbl_person"); - } - + $res = $this->getDataOrTerminateWithError($res); $this->terminateWithSuccess(current($res)); @@ -232,8 +221,9 @@ class Profil extends FHCAPI_Controller $intern_email["email"] = $uid . "@" . DOMAIN; $extern_email = array(); $extern_email["type"] = "alias"; - $extern_email["email"] = $benutzer_res->alias . "@" . DOMAIN; - $res->emails = array($intern_email, $extern_email); + + $extern_email["email"] = $benutzer_res->alias ? ($benutzer_res->alias . "@" . DOMAIN) : null; + $res->emails = $extern_email?[$intern_email, $extern_email]:[$intern_email]; $res->funktionen = $benutzer_funktion_res; $res->mailverteiler = $mailverteiler_res; @@ -345,8 +335,9 @@ class Profil extends FHCAPI_Controller $intern_email["email"] = $this->uid . "@" . DOMAIN; $extern_email = array(); $extern_email["type"] = "alias"; - $extern_email["email"] = $mitarbeiter_res->alias . "@" . DOMAIN; - $res->emails = [$intern_email, $extern_email]; + + $extern_email["email"] = $mitarbeiter_res->alias? ($mitarbeiter_res->alias . "@" . DOMAIN) : null; + $res->emails = $extern_email["email"]?[$intern_email, $extern_email]:[$intern_email]; $res->funktionen = $benutzer_funktion_res; $res->standort_telefon = $telefon_res; @@ -418,10 +409,8 @@ class Profil extends FHCAPI_Controller $this->PersonModel->addJoin('tbl_gruppe', 'gruppe_kurzbz'); $mailverteiler_res = $this->PersonModel->loadWhere(array('mailgrp' => true, 'uid' => $uid)); - if (isError($mailverteiler_res)) { - show_error("was not able to query the table public.tbl_benutzer:" . getData($mailverteiler_res)); - } - $mailverteiler_res = hasData($mailverteiler_res) ? getData($mailverteiler_res) : null; + $mailverteiler_res = $this->getDataOrTerminateWithError($mailverteiler_res); + $mailverteiler_res = gettype($mailverteiler_res) === 'array' ? $mailverteiler_res : []; $mailverteiler_res = array_map(function ($element) { $element->mailto = "mailto:" . $element->gruppe_kurzbz . "@" . DOMAIN; return $element; @@ -441,10 +430,7 @@ class Profil extends FHCAPI_Controller $this->BenutzerfunktionModel->addJoin("tbl_organisationseinheit", "oe_kurzbz"); $benutzer_funktion_res = $this->BenutzerfunktionModel->loadWhere(array('uid' => $uid)); - if (isError($benutzer_funktion_res)) { - show_error("was not able to query the table public.tbl_benutzerfunktion:" . getData($benutzer_funktion_res)); - } - $benutzer_funktion_res = hasData($benutzer_funktion_res) ? getData($benutzer_funktion_res) : null; + $benutzer_funktion_res = $this->getDataOrTerminateWithError($benutzer_funktion_res); return $benutzer_funktion_res; } @@ -460,10 +446,7 @@ class Profil extends FHCAPI_Controller //? betriebsmittel are not needed in a view $betriebsmittelperson_res = $this->BetriebsmittelpersonModel->getBetriebsmittel($pid); - if (isError($betriebsmittelperson_res)) { - show_error("was not able to query the table public.tbl_betriebsmittelperson:" . getData($betriebsmittelperson_res)); - } - $betriebsmittelperson_res = hasData($betriebsmittelperson_res) ? getData($betriebsmittelperson_res) : null; + $betriebsmittelperson_res = $this->getDataOrTerminateWithError($betriebsmittelperson_res); return $betriebsmittelperson_res; } @@ -477,12 +460,9 @@ class Profil extends FHCAPI_Controller { $this->BenutzerModel->addSelect(["alias"]); $benutzer_res = $this->BenutzerModel->load([$uid]); - if (isError($benutzer_res)) { - show_error("was not able to query the table public.tbl_benutzer:" . getData($benutzer_res)); - } else { - $benutzer_res = hasData($benutzer_res) ? getData($benutzer_res)[0] : null; - } - + $benutzer_res = $this->getDataOrTerminateWithError($benutzer_res); + $benutzer_res = $benutzer_res ? current($benutzer_res) : null; + return $benutzer_res; } @@ -505,11 +485,8 @@ class Profil extends FHCAPI_Controller $this->BenutzerModel->addJoin("tbl_person", "person_id"); $person_res = $this->BenutzerModel->load([$uid]); - if (isError($person_res)) { - show_error("was not able to query the table public.tbl_benutzer:" . getData($person_res)); - } else { - $person_res = hasData($person_res) ? getData($person_res)[0] : null; - } + $person_res = $this->getDataOrTerminateWithError($person_res); + $person_res = $person_res ? current($person_res) : null; if( ($person_res->foto === null) || (($this->uid !== $uid) && ($person_res->foto_sperre !== false)) ) { @@ -531,11 +508,8 @@ class Profil extends FHCAPI_Controller $this->MitarbeiterModel->addSelect(["kurzbz", "telefonklappe", "alias", "ort_kurzbz"]); $this->MitarbeiterModel->addJoin("tbl_benutzer", "tbl_benutzer.uid = tbl_mitarbeiter.mitarbeiter_uid"); $mitarbeiter_res = $this->MitarbeiterModel->load($uid); - if (isError($mitarbeiter_res)) { - show_error("was not able to query the table public.tbl_mitarbeiter:" . getData($mitarbeiter_res)); - } else { - $mitarbeiter_res = hasData($mitarbeiter_res) ? getData($mitarbeiter_res)[0] : null; - } + $mitarbeiter_res = $this->getDataOrTerminateWithError($mitarbeiter_res); + $mitarbeiter_res = $mitarbeiter_res ? current($mitarbeiter_res) : null; return $mitarbeiter_res; } @@ -552,10 +526,8 @@ class Profil extends FHCAPI_Controller $this->MitarbeiterModel->addJoin("tbl_kontakt", "tbl_mitarbeiter.standort_id = tbl_kontakt.standort_id"); $this->MitarbeiterModel->addLimit(1); $telefon_res = $this->MitarbeiterModel->loadWhere(["mitarbeiter_uid" => $uid, "kontakttyp" => "telefon"]); - if (isError($telefon_res)) { - show_error("was not able to query the table public.tbl_mitarbeiter:" . getData($telefon_res)); - } - $telefon_res = hasData($telefon_res) ? getData($telefon_res)[0] : null; + $telefon_res = $this->getDataOrTerminateWithError($telefon_res); + $telefon_res = $telefon_res ? current($telefon_res) : null; return $telefon_res; } @@ -571,10 +543,9 @@ class Profil extends FHCAPI_Controller $this->StudentModel->addJoin('tbl_studiengang', "tbl_studiengang.studiengang_kz=tbl_student.studiengang_kz"); $student_res = $this->StudentModel->load([$uid]); - if (isError($student_res)) { - show_error("was not able to query the table public.tbl_student:" . getData($student_res)); - } - $student_res = hasData($student_res) ? getData($student_res)[0] : null; + + $student_res = $this->getDataOrTerminateWithError($student_res); + $student_res = $student_res ? current($student_res) : null; return $student_res; } @@ -587,10 +558,7 @@ class Profil extends FHCAPI_Controller private function getProfilUpdates($uid) { $profilUpdates = $this->ProfilUpdateModel->getProfilUpdatesWhere(['uid' => $uid]); - if (isError($profilUpdates)) { - show_error("was not able to query the table public.tbl_profil_update:" . getData($profilUpdates)); - } - $profilUpdates = hasData($profilUpdates) ? getData($profilUpdates) : null; + $profilUpdates = $this->getDataOrTerminateWithError($profilUpdates); return $profilUpdates; } @@ -606,10 +574,9 @@ class Profil extends FHCAPI_Controller $this->BenutzerModel->addJoin("tbl_person", "person_id"); $matr_res = $this->BenutzerModel->load([$uid]); - if (isError($matr_res)) { - show_error("was not able to query the table public.tbl_benutzer:" . getData($matr_res)); - } - $matr_res = hasData($matr_res) ? getData($matr_res)[0] : []; + + $matr_res = $this->getDataOrTerminateWithError($matr_res); + $matr_res = $matr_res ? current($matr_res) : []; return $matr_res; } @@ -625,10 +592,7 @@ class Profil extends FHCAPI_Controller $this->BenutzergruppeModel->addJoin('tbl_gruppe', 'gruppe_kurzbz'); $zutrittsgruppe_res = $this->BenutzergruppeModel->loadWhere(array("uid" => $uid, "zutrittssystem" => true)); - if (isError($zutrittsgruppe_res)) { - show_error("was not able to query the table public.tbl_benutzergruppe:" . getData($zutrittsgruppe_res)); - } - $zutrittsgruppe_res = hasData($zutrittsgruppe_res) ? getData($zutrittsgruppe_res) : null; + $zutrittsgruppe_res = $this->getDataOrTerminateWithError($zutrittsgruppe_res); return $zutrittsgruppe_res; } @@ -645,10 +609,7 @@ class Profil extends FHCAPI_Controller $adresse_res = $this->AdresseModel->addJoin("tbl_adressentyp", "typ=adressentyp_kurzbz"); $adresse_res = $this->AdresseModel->loadWhere(["person_id" => $pid]); - if (isError($adresse_res)) { - show_error("was not able to query the table public.tbl_adresse:" . getData($adresse_res)); - } - $adresse_res = hasData($adresse_res) ? getData($adresse_res) : null; + $adresse_res = $this->getDataOrTerminateWithError($adresse_res); return $adresse_res; } @@ -666,10 +627,7 @@ class Profil extends FHCAPI_Controller $this->KontaktModel->addOrder('kontakttyp, kontakt, tbl_kontakt.updateamum, tbl_kontakt.insertamum'); $kontakte_res = $this->KontaktModel->loadWhere(['person_id' => $pid]); - if (isError($kontakte_res)) { - show_error("was not able to query the table public.tbl_kontakt:" . getData($kontakte_res)); - } - $kontakte_res = hasData($kontakte_res) ? getData($kontakte_res) : null; + $kontakte_res = $this->getDataOrTerminateWithError($kontakte_res); return $kontakte_res; } @@ -682,11 +640,10 @@ class Profil extends FHCAPI_Controller private function getZutrittskarteDatum($uid) { $zutrittskarte_ausgegebenam = $this->BetriebsmittelpersonModel->getBetriebsmittelByUid($uid, "Zutrittskarte"); - if (isError($zutrittskarte_ausgegebenam)) { - show_error("was not able to query the table wavi.tbl_bentriebsmittelperson:" . getData($zutrittskarte_ausgegebenam)); - } - $zutrittskarte_ausgegebenam = hasData($zutrittskarte_ausgegebenam) ? getData($zutrittskarte_ausgegebenam)[0]->ausgegebenam : null; - + + $zutrittskarte_ausgegebenam = $this->getDataOrTerminateWithError($zutrittskarte_ausgegebenam); + $zutrittskarte_ausgegebenam = $zutrittskarte_ausgegebenam ? current($zutrittskarte_ausgegebenam)->ausgegebenam : null; + //? formats date from 01-01-2000 to 01.01.2000 $zutrittskarte_ausgegebenam = str_replace("-", ".", $zutrittskarte_ausgegebenam); return $zutrittskarte_ausgegebenam; diff --git a/application/controllers/api/frontend/v1/RendererLoader.php b/application/controllers/api/frontend/v1/RendererLoader.php new file mode 100644 index 000000000..dc16bb3fc --- /dev/null +++ b/application/controllers/api/frontend/v1/RendererLoader.php @@ -0,0 +1,72 @@ +. + */ + +if (! defined('BASEPATH')) exit('No direct script access allowed'); + +use CI3_Events as Events; + +class RendererLoader extends FHCAPI_Controller +{ + + /** + * Object initialization + */ + public function __construct() + { + + parent::__construct([ + 'GetRenderers' => self::PERM_LOGGED, + + ]); + + $this->load->library('LogLib'); + $this->loglib->setConfigs(array( + 'classIndex' => 5, + 'functionIndex' => 5, + 'lineIndex' => 4, + 'dbLogType' => 'API', // required + 'dbExecuteUser' => 'RESTful API' + )); + + + } + + //------------------------------------------------------------------------------------------------------------------ + // Public methods + + /** + * fetches Stundenplan and Moodle events together + * @access public + * + */ + public function GetRenderers(){ + $renderer_paths = []; + Events::trigger( + 'loadRenderers', + function & () use (&$renderer_paths) + { + return $renderer_paths; + } + ); + $this->terminateWithSuccess($renderer_paths); + } + + + + +} diff --git a/application/controllers/api/frontend/v1/Studium.php b/application/controllers/api/frontend/v1/Studium.php index b0be3cf41..116217a84 100644 --- a/application/controllers/api/frontend/v1/Studium.php +++ b/application/controllers/api/frontend/v1/Studium.php @@ -39,7 +39,7 @@ class Studium extends FHCAPI_Controller $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); $this->load->model('organisation/Studienordnung_model','StudienordnungModel'); $this->load->model('organisation/Studiensemester_model',"StudiensemesterModel"); - $this->load->model('organisation/Studienplan_model', 'StudienplanModel'); + $this->load->model('organisation/Studienplan_model', 'LvPlanModel'); $this->load->model('education/Studentlehrverband_model', 'StudentlehrverbandModel'); $this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel'); $this->load->model('codex/Orgform_model','OrgformModel'); @@ -143,8 +143,8 @@ class Studium extends FHCAPI_Controller if(!$aktuelles_studienplan){ $aktuelles_studienplan = null; } - if(isset($parameter_studienplan) && !empty(array_filter( $semester_studienplan, function($stundenplan) use($parameter_studienplan){ - return $stundenplan->studienplan_id == $parameter_studienplan->studienplan_id; + if(isset($parameter_studienplan) && !empty(array_filter( $semester_studienplan, function($lvplan) use($parameter_studienplan){ + return $lvplan->studienplan_id == $parameter_studienplan->studienplan_id; }))){ $aktuelles_studienplan = $parameter_studienplan ; } @@ -309,8 +309,8 @@ SELECT tbl_lehrveranstaltung.*, } private function computeLektorenFromLehrveranstaltung($lehreinheit_id, $semester, $studiengang, $studiensemester){ - $this->load->library('StundenplanLib'); - $lektoren = $this->stundenplanlib->getLektorenFromLehrveranstaltung($lehreinheit_id,$semester, $studiengang,$studiensemester); + $this->load->library('LvPlanLib'); + $lektoren = $this->lvplanlib->getLektorenFromLehrveranstaltung($lehreinheit_id,$semester, $studiengang,$studiensemester); if(!$lektoren){ return []; } diff --git a/application/controllers/api/v1/ressource/Stundenplan.php b/application/controllers/api/v1/ressource/LvPlan.php similarity index 59% rename from application/controllers/api/v1/ressource/Stundenplan.php rename to application/controllers/api/v1/ressource/LvPlan.php index 9a6614f21..06672c90b 100644 --- a/application/controllers/api/v1/ressource/Stundenplan.php +++ b/application/controllers/api/v1/ressource/LvPlan.php @@ -14,16 +14,16 @@ if (!defined('BASEPATH')) exit('No direct script access allowed'); -class Stundenplan extends API_Controller +class LvPlan extends API_Controller { /** - * Stundenplan API constructor. + * LvPlan API constructor. */ public function __construct() { parent::__construct(array('Stundenplan' => 'basis/stundenplan:rw')); - // Load model StundenplanModel - $this->load->model('ressource/stundenplan_model', 'StundenplanModel'); + // Load model LvPlanModel + $this->load->model('ressource/stundenplan_model', 'LvPlanModel'); } @@ -31,13 +31,13 @@ class Stundenplan extends API_Controller /** * @return void */ - public function getStundenplan() + public function getLvPlan() { - $stundenplanID = $this->get('stundenplan_id'); + $lvPlanID = $this->get('stundenplan_id'); - if (isset($stundenplanID)) + if (isset($lvPlanID)) { - $result = $this->StundenplanModel->load($stundenplanID); + $result = $this->LvPlanModel->load($lvPlanID); $this->response($result, REST_Controller::HTTP_OK); } @@ -50,17 +50,17 @@ class Stundenplan extends API_Controller /** * @return void */ - public function postStundenplan() + public function postLvPlan() { if ($this->_validate($this->post())) { if (isset($this->post()['stundenplan_id'])) { - $result = $this->StundenplanModel->update($this->post()['stundenplan_id'], $this->post()); + $result = $this->LvPlanModel->update($this->post()['stundenplan_id'], $this->post()); } else { - $result = $this->StundenplanModel->insert($this->post()); + $result = $this->LvPlanModel->insert($this->post()); } $this->response($result, REST_Controller::HTTP_OK); @@ -71,7 +71,7 @@ class Stundenplan extends API_Controller } } - private function _validate($stundenplan = NULL) + private function _validate($lvplan = NULL) { return true; } diff --git a/application/controllers/api/v1/ressource/Stundenplandev.php b/application/controllers/api/v1/ressource/LvPlandev.php similarity index 58% rename from application/controllers/api/v1/ressource/Stundenplandev.php rename to application/controllers/api/v1/ressource/LvPlandev.php index fa6e788c3..625e6038d 100644 --- a/application/controllers/api/v1/ressource/Stundenplandev.php +++ b/application/controllers/api/v1/ressource/LvPlandev.php @@ -14,16 +14,16 @@ if (!defined('BASEPATH')) exit('No direct script access allowed'); -class Stundenplandev extends API_Controller +class LvPlandev extends API_Controller { /** - * Stundenplandev API constructor. + * LvPlandev API constructor. */ public function __construct() { parent::__construct(array('Stundenplandev' => 'basis/stundenplandev:rw')); - // Load model StundenplandevModel - $this->load->model('ressource/stundenplandev_model', 'StundenplandevModel'); + // Load model LvPlandevModel + $this->load->model('ressource/stundenplandev_model', 'LvPlandevModel'); } @@ -31,13 +31,13 @@ class Stundenplandev extends API_Controller /** * @return void */ - public function getStundenplandev() + public function getLvPlandev() { - $stundenplandevID = $this->get('stundenplandev_id'); + $lvplandevID = $this->get('stundenplandev_id'); - if (isset($stundenplandevID)) + if (isset($lvplandevID)) { - $result = $this->StundenplandevModel->load($stundenplandevID); + $result = $this->LvPlandevModel->load($lvplandevID); $this->response($result, REST_Controller::HTTP_OK); } @@ -50,17 +50,17 @@ class Stundenplandev extends API_Controller /** * @return void */ - public function postStundenplandev() + public function postLvPlandev() { if ($this->_validate($this->post())) { if (isset($this->post()['stundenplandev_id'])) { - $result = $this->StundenplandevModel->update($this->post()['stundenplandev_id'], $this->post()); + $result = $this->LvPlandevModel->update($this->post()['stundenplandev_id'], $this->post()); } else { - $result = $this->StundenplandevModel->insert($this->post()); + $result = $this->LvPlandevModel->insert($this->post()); } $this->response($result, REST_Controller::HTTP_OK); @@ -71,7 +71,7 @@ class Stundenplandev extends API_Controller } } - private function _validate($stundenplandev = NULL) + private function _validate($lvplandev = NULL) { return true; } diff --git a/application/controllers/components/Cis/Stundenplan.php b/application/controllers/components/Cis/LvPlan.php similarity index 80% rename from application/controllers/components/Cis/Stundenplan.php rename to application/controllers/components/Cis/LvPlan.php index a9f35c651..083cde03e 100644 --- a/application/controllers/components/Cis/Stundenplan.php +++ b/application/controllers/components/Cis/LvPlan.php @@ -5,7 +5,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** * */ -class Stundenplan extends Auth_Controller +class LvPlan extends Auth_Controller { /** @@ -27,14 +27,14 @@ class Stundenplan extends Auth_Controller */ public function index() { - $this->load->model('ressource/Stundenplan_model', 'StundenplanModel'); + $this->load->model('ressource/Stundenplan_model', 'LvPlanModel'); - /* $result = $this->StundenplanModel->loadForUid(getAuthUID()); + /* $result = $this->LvPlanModel->loadForUid(getAuthUID()); if (isError($result)) return $this->outputJsonError(getError($result)); */ - $res = $this->StundenplanModel->stundenplanGruppierung($this->StundenplanModel->getStundenplanQuery(getAuthUID())); + $res = $this->LvPlanModel->lvPlanGruppierung($this->LvPlanModel->getLvPlanQuery(getAuthUID())); $res = getData($res); diff --git a/application/controllers/jobs/LVPlanJob.php b/application/controllers/jobs/LVPlanJob.php index c3fe5495a..14ed473fb 100644 --- a/application/controllers/jobs/LVPlanJob.php +++ b/application/controllers/jobs/LVPlanJob.php @@ -39,7 +39,7 @@ class LVPlanJob extends JOB_Controller $studiensemester_arr = array(); $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); - $this->load->model('ressource/Stundenplandev_model', 'StundenplandevModel'); + $this->load->model('ressource/Stundenplandev_model', 'LvPlandevModel'); $this->load->model('education/Lehreinheit_model', 'LehreinheitModel'); $this->load->model('education/Lehreinheitgruppe_model', 'LehreinheitgruppeModel'); @@ -70,7 +70,7 @@ class LVPlanJob extends JOB_Controller $fail = 0; // get all schedule entries where group is missing - $result = $this->StundenplandevModel->getMissingDirectGroups($studiensemester); + $result = $this->LvPlandevModel->getMissingDirectGroups($studiensemester); if(hasData($result)) { foreach($result->retval as $row) @@ -112,7 +112,7 @@ class LVPlanJob extends JOB_Controller } // add group to schedule - $result = $this->StundenplandevModel->insert( + $result = $this->LvPlandevModel->insert( array( 'lehreinheit_id' => $row->lehreinheit_id, 'unr' => $unr, @@ -159,7 +159,7 @@ class LVPlanJob extends JOB_Controller public function mailUpdatedZeitwuensche() { // Load models - $this->load->model('ressource/Stundenplandev_model', 'StundenplandevModel'); + $this->load->model('ressource/Stundenplandev_model', 'LvPlandevModel'); $this->load->model('organisation/Studiensemester_model', 'StundiensemesterModel'); $this->load->model('education/Lehreinheit_model', 'LehreinheitModel'); $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); diff --git a/application/core/CI3_Events.php b/application/core/CI3_Events.php index 37f6c3f21..e283230c9 100644 --- a/application/core/CI3_Events.php +++ b/application/core/CI3_Events.php @@ -49,6 +49,9 @@ require_once(APPPATH.'config/Events.php'); $active_addons_array = explode(";", ACTIVE_ADDONS); +// Load Events from FHC core +require_once APPPATH.'core/Events.php'; + foreach (scandir(APPPATH.'config/extensions') as $dir) if ($dir[0] != '.' && file_exists(APPPATH.'config/extensions/'.$dir.'/Events.php')) require_once APPPATH.'config/extensions/'.$dir.'/Events.php'; diff --git a/application/core/Events.php b/application/core/Events.php new file mode 100644 index 000000000..cc61cd509 --- /dev/null +++ b/application/core/Events.php @@ -0,0 +1,15 @@ + APP_ROOT.'public/js/components/Cis/Stundenplan/EventTypes/calendarEvent.js', + 'modalTitle' => APP_ROOT.'public/js/components/Cis/Mylv/modalTitle.js', + 'modalContent' => APP_ROOT.'public/js/components/Cis/Mylv/modalContent.js' + ); +}); + + diff --git a/application/libraries/StundenplanLib.php b/application/libraries/LvPlanLib.php similarity index 90% rename from application/libraries/StundenplanLib.php rename to application/libraries/LvPlanLib.php index b64fd226e..709762ddc 100644 --- a/application/libraries/StundenplanLib.php +++ b/application/libraries/LvPlanLib.php @@ -3,17 +3,17 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); -class StundenplanLib{ +class LvPlanLib{ private $_ci; // Code igniter instance /** - * fetches stundenplan events from a UID and start/end date + * fetches LvPlan events from a UID and start/end date * @access public * */ - public function getStundenplan($start_date, $end_date, $lv_id = null){ + public function getLvPlan($start_date, $end_date, $lv_id = null){ $this->_ci =& get_instance(); @@ -21,7 +21,7 @@ class StundenplanLib{ $this->_ci->load->model('organisation/Studiensemester_model','StudiensemesterModel'); $this->_ci->load->model('education/Studentlehrverband_model', 'StudentlehrverbandModel'); $this->_ci->load->model('person/Benutzergruppe_model','BenutzergruppeModel'); - $this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel'); + $this->_ci->load->model('ressource/Stundenplan_model', 'LvPlanModel'); $student_uid = getAuthUID(); @@ -42,20 +42,20 @@ class StundenplanLib{ return $function_error; } - if($lv_id) { // fetch Stundenplan for lva, irrelevant of who is requesting it (for now) + if($lv_id) { // fetch LvPlan for lva, irrelevant of who is requesting it (for now) - $stundenplan_data = $this->_ci->StundenplanModel->getStundenplanLVA($start_date, $end_date, $lv_id); - if(isError($stundenplan_data)) + $lvplan_data = $this->_ci->LvPlanModel->getLvPlanLVA($start_date, $end_date, $lv_id); + if(isError($lvplan_data)) { - return error(getData($stundenplan_data)); + return error(getData($lvplan_data)); } - $stundenplan_data = getData($stundenplan_data) ?? []; - $function_error = $this->expand_object_information($stundenplan_data); + $lvplan_data = getData($lvplan_data) ?? []; + $function_error = $this->expand_object_information($lvplan_data); if(!is_null($function_error)){ return $function_error; } - // query lv itself in case its Stundenplan is being queried and it has no entries + // query lv itself in case its LvPlan is being queried and it has no entries $this->_ci->load->model('education/Lehrveranstaltung_model','LehrveranstaltungModel'); $lv_result = $this->_ci->LehrveranstaltungModel->load($lv_id); if(isError($lv_result)) @@ -63,7 +63,7 @@ class StundenplanLib{ return error(getData($lv_result)); } $lv = getData($lv_result)[0]; - return $stundenplan_data; + return $lvplan_data; } @@ -71,17 +71,17 @@ class StundenplanLib{ if($is_mitarbeiter) { - $stundenplan_data = $this->_ci->StundenplanModel->getStundenplanMitarbeiter($start_date, $end_date, $student_uid); - if(isError($stundenplan_data)) + $lvplan_data = $this->_ci->LvPlanModel->getLvPlanMitarbeiter($start_date, $end_date, $student_uid); + if(isError($lvplan_data)) { - return error(getData($stundenplan_data)); + return error(getData($lvplan_data)); } - $stundenplan_data = getData($stundenplan_data) ?? []; - $function_error = $this->expand_object_information($stundenplan_data); + $lvplan_data = getData($lvplan_data) ?? []; + $function_error = $this->expand_object_information($lvplan_data); if(!is_null($function_error)){ return $function_error; } - return $stundenplan_data; + return $lvplan_data; } else { // getting the gruppen_kurzbz of the student in the different studiensemester $benutzer_gruppen = $this->fetchBenutzerGruppenFromStudiensemester($semester_range); @@ -99,26 +99,26 @@ class StundenplanLib{ } $student_lehrverband = getData($student_lehrverband); - $stundenplan_query = $this->_ci->StundenplanModel->getStundenplanQuery($start_date, $end_date, $semester_range, $benutzer_gruppen, $student_lehrverband); - if(!$stundenplan_query) + $lvplan_query = $this->_ci->LvPlanModel->getLvPlanQuery($start_date, $end_date, $semester_range, $benutzer_gruppen, $student_lehrverband); + if(!$lvplan_query) { return []; } - $stundenplan_data = $this->_ci->StundenplanModel->stundenplanGruppierung($stundenplan_query); - if(isError($stundenplan_data)) + $lvplan_data = $this->_ci->LvPlanModel->lvPlanGruppierung($lvplan_query); + if(isError($lvplan_data)) { - return error(getData($stundenplan_data)); + return error(getData($lvplan_data)); } - $stundenplan_data = getData($stundenplan_data) ?? []; + $lvplan_data = getData($lvplan_data) ?? []; - $function_error = $this->expand_object_information($stundenplan_data); + $function_error = $this->expand_object_information($lvplan_data); if(!is_null($function_error)){ return $function_error; } - return success($stundenplan_data); + return success($lvplan_data); } } @@ -147,7 +147,7 @@ class StundenplanLib{ public function getLektorenFromLehrveranstaltung($lehrveranstaltung_id, $semester, $studiengang_kz, $studiensemester_kurzbz){ $this->_ci =& get_instance(); - $this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel'); + $this->_ci->load->model('ressource/Stundenplan_model', 'LvPlanModel'); $this->_ci->load->model('organisation/Studiensemester_model','StudiensemesterModel'); $studiensemester = $this->_ci->StudiensemesterModel->loadWhere(["studiensemester_kurzbz"=>$studiensemester_kurzbz]); @@ -156,7 +156,7 @@ class StundenplanLib{ return error(getData($studiensemester)); } $studiensemester = current(getData($studiensemester)); - $lektoren = $this->_ci->StundenplanModel->execReadOnlyQuery(" + $lektoren = $this->_ci->LvPlanModel->execReadOnlyQuery(" SELECT DISTINCT uid FROM campus.vw_stundenplan WHERE lehrveranstaltung_id = ? AND @@ -190,8 +190,8 @@ class StundenplanLib{ // load lektor object foreach ($item->lektor as $lv_lektor) { - $this->_ci->StundenplanModel->addLimit(1); - $lektor_object = $this->_ci->StundenplanModel->execReadOnlyQuery(" + $this->_ci->LvPlanModel->addLimit(1); + $lektor_object = $this->_ci->LvPlanModel->execReadOnlyQuery(" SELECT mitarbeiter_uid, vorname, nachname, kurzbz FROM public.tbl_mitarbeiter JOIN public.tbl_benutzer benutzer ON benutzer.uid = mitarbeiter_uid @@ -233,7 +233,7 @@ class StundenplanLib{ if($item->ort_kurzbz) { - $ort_content_object = $this->_ci->StundenplanModel->execReadOnlyQuery(" + $ort_content_object = $this->_ci->LvPlanModel->execReadOnlyQuery(" SELECT content_id FROM public.tbl_ort WHERE ort_kurzbz = ?", [$item->ort_kurzbz]); diff --git a/application/models/ressource/Reservierung_model.php b/application/models/ressource/Reservierung_model.php index f635d0cb1..789ff3d9c 100644 --- a/application/models/ressource/Reservierung_model.php +++ b/application/models/ressource/Reservierung_model.php @@ -21,7 +21,7 @@ class Reservierung_model extends DB_Model public function getReservierungen($start_date, $end_date, $ort_kurzbz = null) { - $stundenplan_reservierungen_query="SELECT r.* , stund.beginn, stund.ende, + $lvplan_reservierungen_query="SELECT r.* , stund.beginn, stund.ende, CASE WHEN r.gruppe_kurzbz IS NOT NULL THEN r.gruppe_kurzbz ELSE CONCAT(UPPER(studg.typ),UPPER(studg.kurzbz),'-',COALESCE(CAST(r.semester AS varchar),'/'),COALESCE(CAST(r.verband AS varchar),'/')) @@ -46,7 +46,7 @@ class Reservierung_model extends DB_Model JOIN lehre.tbl_stunde ON lehre.tbl_stunde.stunde = res.stunde WHERE res.ort_kurzbz = ? AND datum >= ? AND datum <= ?"; - $subquery = is_null($ort_kurzbz)? $stundenplan_reservierungen_query:$raum_reservierungen_query; + $subquery = is_null($ort_kurzbz)? $lvplan_reservierungen_query:$raum_reservierungen_query; $query_result= $this->execReadOnlyQuery(" SELECT @@ -89,7 +89,7 @@ class Reservierung_model extends DB_Model JOIN lehre.tbl_stunde ON lehre.tbl_stunde.stunde = res.stunde WHERE res.uid = ? AND datum >= ? AND datum <= ?"; -// $subquery = is_null($ort_kurzbz)? $stundenplan_reservierungen_query:$raum_reservierungen_query; +// $subquery = is_null($ort_kurzbz)? $lvplan_reservierungen_query:$raum_reservierungen_query; $subquery = $raum_reservierungen_query; diff --git a/application/models/ressource/Stundenplan_model.php b/application/models/ressource/Stundenplan_model.php index 012ce0a57..92a42a1df 100644 --- a/application/models/ressource/Stundenplan_model.php +++ b/application/models/ressource/Stundenplan_model.php @@ -33,12 +33,12 @@ class Stundenplan_model extends DB_Model */ - $raum_stundenplan= $this->execReadOnlyQuery(" + $raum_lvplan= $this->execReadOnlyQuery(" SELECT CONCAT(UPPER(sp.stg_typ),UPPER(sp.stg_kurzbz),'-',COALESCE(CAST(sp.semester AS varchar),'/'),COALESCE(CAST(sp.verband AS varchar),'/')) AS stg, CONCAT(lehrfach,'-',lehrform) AS lv_info, * FROM lehre.vw_stundenplan sp WHERE ort_kurzbz = ? AND datum >= ? AND datum <= ? ", [$ort_kurzbz, $start_date, $end_date]); - return $raum_stundenplan; + return $raum_lvplan; } /** @@ -136,11 +136,11 @@ class Stundenplan_model extends DB_Model /** * groups rows of a subquery that fetches data from the lehre.vw_stundenplan table - * @param string $stundenplanViewQuery the subquery used to group the result + * @param string $lvplanViewQuery the subquery used to group the result * * @return stdClass */ - public function stundenplanGruppierung($stundenplanViewQuery) + public function lvPlanGruppierung($lvplanViewQuery) { $query_result = $this->execReadOnlyQuery(" SELECT @@ -173,7 +173,7 @@ class Stundenplan_model extends DB_Model )) as organisationseinheit, ort_kurzbz, studiengang_kz, titel,lehreinheit_id,lehrfach_id,anmerkung,fix,lehrveranstaltung_id,stg_kurzbzlang,stg_bezeichnung,stg_typ,fachbereich_kurzbz,lehrfach,lehrfach_bez,farbe,lehrform,anmerkung_lehreinheit,gruppe, verband, semester,stg_kurzbz - FROM (".$stundenplanViewQuery.") sp + FROM (".$lvplanViewQuery.") sp JOIN lehre.tbl_stunde ON lehre.tbl_stunde.stunde = sp.stunde ) as subquery @@ -187,11 +187,11 @@ class Stundenplan_model extends DB_Model } /** - * queries Stundenplan but for a whole lva, irrespective of who is requesting it + * queries LvPlan but for a whole lva, irrespective of who is requesting it * * @return void */ - public function getStundenplanLVA($start_date, $end_date, $lv_id) { + public function getLvPlanLVA($start_date, $end_date, $lv_id) { return $this->execReadOnlyQuery(" SELECT @@ -242,11 +242,11 @@ class Stundenplan_model extends DB_Model } /** - * queries Stundenplan and filters by assigned ma_kurzbz, very similar to get by LVA + * queries LvPlan and filters by assigned ma_kurzbz, very similar to get by LVA * * @return void */ - public function getStundenplanMitarbeiter($start_date, $end_date, $ma_uid) { + public function getLvPlanMitarbeiter($start_date, $end_date, $ma_uid) { return $this->execReadOnlyQuery(" SELECT @@ -302,7 +302,7 @@ class Stundenplan_model extends DB_Model * * @return mixed */ - public function getStundenplanQuery($start_date, $end_date,$semester,$gruppen,$studentlehrverbaende){ + public function getLvPlanQuery($start_date, $end_date,$semester,$gruppen,$studentlehrverbaende){ // helper function to check if either $gruppen or $studentlehrverbaende are empty for each semester $emptyCheck = function($toBeCheckedArray) use ($semester){ diff --git a/application/models/ressource/Stundenplandev_model.php b/application/models/ressource/Stundenplandev_model.php index 800540d60..1a74c6aa8 100644 --- a/application/models/ressource/Stundenplandev_model.php +++ b/application/models/ressource/Stundenplandev_model.php @@ -65,7 +65,7 @@ class Stundenplandev_model extends DB_Model } /** - * Get Stundenplan data. + * Get LvPlan data. * * @param null $lehrveranstaltung_id * @param null $studiensemester_kurzbz @@ -75,7 +75,7 @@ class Stundenplandev_model extends DB_Model * @param false $nurBevorstehende If true, only future data is retrieved. * @return array|false|stdClass|null */ - public function getStundenplanData($lehrveranstaltung_id=null, $studiensemester_kurzbz=null, $lehreinheit_id=null, $mitarbeiter_uid=null, $student_uid=null, $nurBevorstehende = false) + public function getLvPlanData($lehrveranstaltung_id=null, $studiensemester_kurzbz=null, $lehreinheit_id=null, $mitarbeiter_uid=null, $student_uid=null, $nurBevorstehende = false) { $params = array(); diff --git a/public/css/components/calendar.css b/public/css/components/calendar.css index 580e0becf..7eb6487dc 100644 --- a/public/css/components/calendar.css +++ b/public/css/components/calendar.css @@ -411,4 +411,79 @@ pointer-events: none; z-index: 2; opacity: 0.5; -} \ No newline at end of file +} + + +.dayPageContainer, .weekPageContainer{ + container-type: inline-size; +} + +.dayPageContainer .lehreinheitEventContent, +.weekPageContainer .lehreinheitEventContent { + display: flex; + flex-direction: column; +} + +.dayPageContainer .moodleEventContent, +.weekPageContainer .moodleEventContent{ + display: flex; + flex-direction: row; +} + +.dayPageContainer .lehreinheitEventContent{ + flex-grow:1; + align-items: center; + font-size: 0.875rem; + font-weight: 400; + line-height:1.25; +} + +.dayPageContainer .lehreinheitEventHeader { + display: flex; + flex-direction: column; + padding: 1rem; + border-right: 1px solid gray; +} + +.dayPageContainer .moodleEventContent { + align-items: center; + font-size: 0.875rem; + font-weight: 400; + line-height: 1.25; + width:100%; +} + +.weekPageContainer .moodleEventContent { + align-items: center; + font-size: 0.875rem; + font-weight: 400; + line-height: 1.25; + width: 100%; +} + +.weekPageContainer .lehreinheitEventHeader { + display: flex; + flex-direction: column; + padding: 1rem; + border-right: 1px solid gray; +} + +.weekPageContainer .lehreinheitEventContent { + flex-grow: 1; + align-items: center; + font-size: 0.875rem; + font-weight: 400; + line-height: 1.25; +} + + +@container( min-width: 500px){ + .dayPageContainer .lehreinheitEventContent, + .weekPageContainer .lehreinheitEventContent { + flex-direction: row; + } + + .dayPageContainer .lehreinheitEventContent{ + justify-content: space-evenly; + } +} diff --git a/public/js/api/factory/stundenplan.js b/public/js/api/factory/lvPlan.js similarity index 70% rename from public/js/api/factory/stundenplan.js rename to public/js/api/factory/lvPlan.js index c22071955..d8cad1c01 100644 --- a/public/js/api/factory/stundenplan.js +++ b/public/js/api/factory/lvPlan.js @@ -19,14 +19,14 @@ export default { getRoomInfo(ort_kurzbz, start_date, end_date) { return { method: 'get', - url: '/api/frontend/v1/Stundenplan/getRoomplan', + url: '/api/frontend/v1/LvPlan/getRoomplan', params: { ort_kurzbz, start_date, end_date } }; }, - getStundenplan(start_date, end_date, lv_id) { + getLvPlan(start_date, end_date, lv_id) { return { method: 'get', - url: '/api/frontend/v1/Stundenplan/getStundenplan', + url: '/api/frontend/v1/LvPlan/getLvPlan', params: { start_date, end_date, lv_id } }; }, @@ -34,39 +34,39 @@ export default { // TODO(chris): seems to be called from nowhere? return { method: 'get', - url: '/api/frontend/v1/Stundenplan/Stunden' + url: '/api/frontend/v1/LvPlan/Stunden' }; }, getOrtReservierungen(ort_kurzbz, start_date, end_date) { return { method: 'get', - url: `/api/frontend/v1/Stundenplan/Reservierungen/${ort_kurzbz}`, + url: `/api/frontend/v1/LvPlan/Reservierungen/${ort_kurzbz}`, params: { start_date, end_date } }; }, - getStundenplanReservierungen(start_date, end_date) { + getLvPlanReservierungen(start_date, end_date) { return { method: 'get', - url: '/api/frontend/v1/Stundenplan/Reservierungen', + url: '/api/frontend/v1/LvPlan/Reservierungen', params: { start_date, end_date } }; }, getLehreinheitStudiensemester(lehreinheit_id) { return { method: 'get', - url: `/api/frontend/v1/Stundenplan/getLehreinheitStudiensemester/${lehreinheit_id}` + url: `/api/frontend/v1/LvPlan/getLehreinheitStudiensemester/${lehreinheit_id}` }; }, studiensemesterDateInterval(date) { return { method: 'get', - url: `/api/frontend/v1/Stundenplan/studiensemesterDateInterval/${date}` + url: `/api/frontend/v1/LvPlan/studiensemesterDateInterval/${date}` }; }, - StundenplanEvents(start_date, end_date, lv_id) { + LvPlanEvents(start_date, end_date, lv_id) { return { method: 'get', - url: '/api/frontend/v1/Stundenplan/StundenplanEvents', + url: '/api/frontend/v1/LvPlan/LvPlanEvents', params: { start_date: start_date, end_date: end_date, diff --git a/public/js/api/factory/renderers.js b/public/js/api/factory/renderers.js new file mode 100644 index 000000000..fee81e4df --- /dev/null +++ b/public/js/api/factory/renderers.js @@ -0,0 +1,12 @@ + +export default { + + loadRenderers() { + return { + method: 'get', + url: '/api/frontend/v1/RendererLoader/GetRenderers', + params: { + } + }; + }, +} \ No newline at end of file diff --git a/public/js/api/fhcapifactory.js b/public/js/api/fhcapifactory.js index 0b7b6631c..1b34cd258 100644 --- a/public/js/api/fhcapifactory.js +++ b/public/js/api/fhcapifactory.js @@ -22,7 +22,7 @@ import filter from "./filter.js"; import studstatus from "./studstatus.js"; import profil from "./profil.js"; import profilUpdate from "./profilUpdate.js"; -import stundenplan from "./stundenplan.js"; +import lvPlan from "./lvPlan.js"; import bookmark from "./bookmark.js"; import stv from "./stv.js"; import notiz from "./notiz.js"; @@ -48,7 +48,7 @@ export default { studstatus, profil, profilUpdate, - stundenplan, + lvPlan, bookmark, stv, notiz, diff --git a/public/js/api/stundenplan.js b/public/js/api/lvPlan.js similarity index 55% rename from public/js/api/stundenplan.js rename to public/js/api/lvPlan.js index 9b831b77e..a1d34b37c 100644 --- a/public/js/api/stundenplan.js +++ b/public/js/api/lvPlan.js @@ -2,43 +2,43 @@ export default { getRoomInfo(ort_kurzbz, start_date, end_date) { return this.$fhcApi.get( - '/api/frontend/v1/Stundenplan/getRoomplan', + '/api/frontend/v1/LvPlan/getRoomplan', { ort_kurzbz, start_date, end_date} ); }, getStunden() { return this.$fhcApi.get( - '/api/frontend/v1/Stundenplan/Stunden', + '/api/frontend/v1/LvPlan/Stunden', {} ); }, getOrtReservierungen(ort_kurzbz, start_date, end_date) { return this.$fhcApi.get( - `/api/frontend/v1/Stundenplan/Reservierungen/${ort_kurzbz}`, + `/api/frontend/v1/LvPlan/Reservierungen/${ort_kurzbz}`, { start_date, end_date} ); }, - getStundenplanReservierungen(start_date, end_date) { + getLvPlanReservierungen(start_date, end_date) { return this.$fhcApi.get( - '/api/frontend/v1/Stundenplan/Reservierungen', + '/api/frontend/v1/LvPlan/Reservierungen', { start_date, end_date } ); }, getLehreinheitStudiensemester(lehreinheit_id) { return this.$fhcApi.get( - `/api/frontend/v1/Stundenplan/getLehreinheitStudiensemester/${lehreinheit_id}`, + `/api/frontend/v1/LvPlan/getLehreinheitStudiensemester/${lehreinheit_id}`, {} ); }, studiensemesterDateInterval(date) { return this.$fhcApi.get( - `/api/frontend/v1/Stundenplan/studiensemesterDateInterval/${date}`, + `/api/frontend/v1/LvPlan/studiensemesterDateInterval/${date}`, {} ); }, - StundenplanEvents(start_date, end_date, lv_id) { + LvPlanEvents(start_date, end_date, lv_id) { return this.$fhcApi.get( - '/api/frontend/v1/Stundenplan/StundenplanEvents', + '/api/frontend/v1/LvPlan/LvPlanEvents', { start_date, end_date, lv_id } ); }, diff --git a/public/js/api/studium.js b/public/js/api/studium.js index 92bb58698..f15ffdcf3 100644 --- a/public/js/api/studium.js +++ b/public/js/api/studium.js @@ -29,9 +29,9 @@ export default { } ); }, - getLvStundenplanForStudiensemester: function (studiensemester, lvid) { + getLvPlanForStudiensemester: function (studiensemester, lvid) { return this.$fhcApi.get( - `/api/frontend/v1/Stundenplan/getLvStundenplanForStudiensemester/${studiensemester}/${lvid}`, + `/api/frontend/v1/LvPlan/getLvPlanForStudiensemester/${studiensemester}/${lvid}`, { } ); diff --git a/public/js/apps/Dashboard/Fhc.js b/public/js/apps/Dashboard/Fhc.js index a7c88874e..a40d28193 100644 --- a/public/js/apps/Dashboard/Fhc.js +++ b/public/js/apps/Dashboard/Fhc.js @@ -3,7 +3,7 @@ import PluginsPhrasen from '../../plugins/Phrasen.js'; import Theme from '../../plugin/Theme.js'; import contrast from '../../directives/contrast.js'; import {setScrollbarWidth} from "../../helpers/CssVarCalcHelpers.js"; -import Stundenplan, {DEFAULT_MODE_STUNDENPLAN} from "../../components/Cis/Stundenplan/Stundenplan.js"; +import LvPlan, {DEFAULT_MODE_LVPLAN} from "../../components/Cis/LvPlan/LvPlan.js"; import MylvStudent from "../../components/Cis/Mylv/Student.js"; import Profil from "../../components/Cis/Profil/Profil.js"; import Raumsuche from "../../components/Cis/Raumsuche/Raumsuche.js"; @@ -16,6 +16,8 @@ import AbgabetoolMitarbeiter from "../../components/Cis/Abgabetool/AbgabetoolMit import DeadlineOverview from "../../components/Cis/Abgabetool/DeadlineOverview.js"; import Studium from "../../components/Cis/Studium/Studium.js"; +import ApiRenderers from '../../api/factory/renderers.js'; + const ciPath = FHC_JS_DATA_STORAGE_OBJECT.app_root.replace(/(https:|)(^|\/\/)(.*?\/)/g, '') + FHC_JS_DATA_STORAGE_OBJECT.ci_router; const router = VueRouter.createRouter({ @@ -148,13 +150,13 @@ const router = VueRouter.createRouter({ }, // Redirect old links to new format { - // only trigger on first param being numeric to avoid paths like "Stundenplan/Month" entering here - path: "/Cis/Stundenplan/:lv_id(\\d+)", - name: "StundenplanOld", - component: Stundenplan, + // only trigger on first param being numeric to avoid paths like "LvPlan/Month" entering here + path: "/Cis/LvPlan/:lv_id(\\d+)", + name: "LvPlanOld", + component: LvPlan, redirect: (to) => { - return { // redirect to longer Stundenplan url and map params - name: "Stundenplan", + return { // redirect to longer LvPlan url and map params + name: "LvPlan", params: { lv_id: to.params.lv_id }, @@ -162,9 +164,9 @@ const router = VueRouter.createRouter({ }, }, { - path: `/Cis/Stundenplan/:mode?/:focus_date?/:lv_id?`, - name: 'Stundenplan', - component: Stundenplan, + path: `/Cis/LvPlan/:mode?/:focus_date?/:lv_id?`, + name: 'LvPlan', + component: LvPlan, props: (route) => { // validate and set mode/focus date if for some reason missing const validModes = ["Month", "Week", "Day"]; @@ -172,7 +174,7 @@ const router = VueRouter.createRouter({ const mode = route.params.mode && validModes.includes(route.params.mode.charAt(0).toUpperCase() + route.params.mode.slice(1).toLowerCase()) ? route.params.mode.charAt(0).toUpperCase() + route.params.mode.slice(1).toLowerCase() - : DEFAULT_MODE_STUNDENPLAN; + : DEFAULT_MODE_LVPLAN; // default to today date if not provided or string forms invalid date const d = new Date(route.params.focus_date) @@ -191,9 +193,9 @@ const router = VueRouter.createRouter({ // missing mode or focus_date -> set defaults if (!to.params.mode || !to.params.focus_date) { next({ - name: "Stundenplan", + name: "LvPlan", params: { - mode: to.params.mode || DEFAULT_MODE_STUNDENPLAN, + mode: to.params.mode || DEFAULT_MODE_LVPLAN, focus_date: to.params.focus_date || new Date().toISOString().split("T")[0], lv_id: to.params.lv_id } @@ -235,7 +237,8 @@ const router = VueRouter.createRouter({ const app = Vue.createApp({ name: 'FhcApp', data: () => ({ - appSideMenuEntries: {} + appSideMenuEntries: {}, + renderers: null, }), components: {}, computed: { @@ -245,7 +248,8 @@ const app = Vue.createApp({ }, provide() { return { // provide injectable & watchable language property - language: Vue.computed(() => this.$p.user_language) + language: Vue.computed(() => this.$p.user_language), + renderers: Vue.computed(() => this.renderers), } }, methods: { @@ -283,6 +287,28 @@ const app = Vue.createApp({ } } }, + async created(){ + await this.$api + .call(ApiRenderers.loadRenderers()) + .then(res => res.data) + .then(data => { + for (let rendertype of Object.keys(data)) { + + let modalTitle = Vue.markRaw(Vue.defineAsyncComponent(() => import(data[rendertype].modalTitle))); + let modalContent = Vue.markRaw(Vue.defineAsyncComponent(() => import(data[rendertype].modalContent))); + let calendarEvent = Vue.markRaw(Vue.defineAsyncComponent(() => import(data[rendertype].calendarEvent))); + if(this.renderers === null) { + this.renderers = {}; + } + if (!this.renderers[rendertype]) { + this.renderers[rendertype] = {} + } + this.renderers[rendertype].modalTitle = modalTitle; + this.renderers[rendertype].modalContent = modalContent; + this.renderers[rendertype].calendarEvent = calendarEvent; + } + }); + }, mounted() { document.addEventListener('click', this.handleClick); }, diff --git a/public/js/components/Calendar/Calendar.js b/public/js/components/Calendar/Calendar.js index 5c2dc8bb0..0f53d5c04 100644 --- a/public/js/components/Calendar/Calendar.js +++ b/public/js/components/Calendar/Calendar.js @@ -78,7 +78,7 @@ export default { if (newValue?.scrollTime == oldValue?.scrollTime && newValue?.focusDate.d==oldValue?.focusDate.d) { return; } - // scroll the Stundenplan to the closest event + // scroll the LvPlan to the closest event let previousScrollAnchor = document.getElementById('scroll' + (newValue.scrollTime - 1) + this.focusDate.d + this.focusDate.w) let scrollAnchor = document.getElementById('scroll' + newValue.scrollTime + this.focusDate.d + this.focusDate.w); if (previousScrollAnchor) { diff --git a/public/js/components/Calendar/Day/Page.js b/public/js/components/Calendar/Day/Page.js index 0e730a1ec..ef2c6ada7 100644 --- a/public/js/components/Calendar/Day/Page.js +++ b/public/js/components/Calendar/Day/Page.js @@ -1,7 +1,7 @@ import CalendarDate from '../../../composables/CalendarDate.js'; import LvModal from "../../../components/Cis/Mylv/LvModal.js"; -import ApiStundenplan from '../../../api/factory/stundenplan.js'; +import ApiLvPlan from '../../../api/factory/lvPlan.js'; import ApiAddons from '../../../api/factory/addons.js'; function ggt(m, n) { @@ -279,7 +279,7 @@ export default { fetchLvMenu(event) { if (event && event.type == 'lehreinheit') { this.$api - .call(ApiStundenplan.getLehreinheitStudiensemester(event.lehreinheit_id[0])) + .call(ApiLvPlan.getLehreinheitStudiensemester(event.lehreinheit_id[0])) .then(res => res.data) .then(studiensemester_kurzbz => this.$api.call( ApiAddons.getLvMenu( diff --git a/public/js/components/Cis/Stundenplan/Stundenplan.js b/public/js/components/Cis/LvPlan/LvPlan.js similarity index 69% rename from public/js/components/Cis/Stundenplan/Stundenplan.js rename to public/js/components/Cis/LvPlan/LvPlan.js index efb8c06ea..3ddeaaa6f 100644 --- a/public/js/components/Cis/Stundenplan/Stundenplan.js +++ b/public/js/components/Cis/LvPlan/LvPlan.js @@ -1,21 +1,20 @@ import FhcCalendar from "../../Calendar/Calendar.js"; import CalendarDate from "../../../composables/CalendarDate.js"; import LvModal from "../Mylv/LvModal.js"; -import LvInfo from "../Mylv/LvInfo.js" import LvMenu from "../Mylv/LvMenu.js" -import moodleSvg from "../../../helpers/moodleSVG.js" +import lehreinheitEvent from "./EventTypes/calendarEvent.js" -import ApiStundenplan from '../../../api/factory/stundenplan.js'; +import ApiLvPlan from '../../../api/factory/lvPlan.js'; import ApiAuthinfo from '../../../api/factory/authinfo.js'; -export const DEFAULT_MODE_STUNDENPLAN = 'Week' +export const DEFAULT_MODE_LVPLAN = 'Week' -const Stundenplan = { - name: 'Stundenplan', +const LvPlan = { + name: 'LvPlan', data() { return { events: null, - calendarMode: this.propsViewData?.mode ?? DEFAULT_MODE_STUNDENPLAN, + calendarMode: this.propsViewData?.mode ?? DEFAULT_MODE_LVPLAN, calendarDate: new CalendarDate(new Date()), eventCalendarDate: new CalendarDate(new Date()), currentlySelectedEvent: null, @@ -25,7 +24,10 @@ const Stundenplan = { studiensemester_kurzbz: null, studiensemester_start: null, studiensemester_ende: null, - uid: null + uid: null, + renderComponents: {}, + isModalContentResolved: false, + isModalTitleResolved: false, } }, props: { @@ -46,7 +48,9 @@ const Stundenplan = { eventMaxHeight: this.eventMaxHeight } }, + inject:["renderers"], watch: { + weekFirstDay: { handler: async function (newValue) { let data = await this.fetchStudiensemesterDetails(newValue); @@ -57,7 +61,7 @@ const Stundenplan = { }, immediate: true, }, - // forward/backward on history entries happening in stundenplan + // forward/backward on history entries happening in lvplan 'propsViewData.lv_id'(newVal) { // relevant if lv_id can be changed from within this component }, @@ -69,9 +73,10 @@ const Stundenplan = { } }, components: { - FhcCalendar, LvModal, LvMenu, LvInfo, moodleSvg + FhcCalendar, LvModal, LvMenu, lehreinheitEvent, }, computed:{ + downloadLinks: function(){ if(!this.studiensemester_start || !this.studiensemester_ende || !this.uid )return; let start = new Date(this.studiensemester_start); @@ -105,17 +110,38 @@ const Stundenplan = { }, }, methods:{ - fetchStudiensemesterDetails: async function (date) { - return this.$api.call(ApiStundenplan.studiensemesterDateInterval(date)); + modalTitleResolved: function () { + this.isModalTitleResolved = true; + if(this.isModalContentResolved && this.isModalTitleResolved) + Vue.nextTick(() => { + if(this.$refs.lvmodal) + this.$refs.lvmodal.show(); + }); }, - convertTime: function([hour,minute]){ - let date = new Date(); - date.setHours(hour); - date.setMinutes(minute); - // returns date string as hh:mm - return date.toLocaleTimeString(this.$p.user_locale, { hour: '2-digit', minute: '2-digit', hour12:false}); + modalContentResolved: function () { + this.isModalContentResolved = true; + if (this.isModalContentResolved && this.isModalTitleResolved) + Vue.nextTick(() => { + if (this.$refs.lvmodal) + this.$refs.lvmodal.show(); + }); + }, + // component renderers fetches from different addons + modalTitleComponent(type){ + return this.renderers[type].modalTitle; + }, + modalContentComponent(type) { + return this.renderers[type].modalContent; + }, + calendarEventComponent(type){ + return this.renderers[type].calendarEvent; + }, + + fetchStudiensemesterDetails: async function (date) { + return this.$api.call(ApiLvPlan.studiensemesterDateInterval(date)); }, + setSelectedEvent: function (event) { this.currentlySelectedEvent = event; }, @@ -126,7 +152,7 @@ const Stundenplan = { const capitalizedMode = this.calendarMode[0].toUpperCase() + this.calendarMode.slice(1); this.$router.push({ - name: "Stundenplan", + name: "LvPlan", params: { mode: capitalizedMode, focus_date: date, @@ -148,7 +174,7 @@ const Stundenplan = { String(this.currentDay.getDate()).padStart(2, "0"); this.$router.push({ - name: "Stundenplan", + name: "LvPlan", params: { mode: this.calendarMode[0].toUpperCase() + this.calendarMode.slice(1), focus_date: date, @@ -166,7 +192,7 @@ const Stundenplan = { if (m == 'Weeks' || m == 'Years' || m == 'Months') return; this.$router.push({ - name: "Stundenplan", + name: "LvPlan", params: { mode: m, focus_date: date, @@ -177,9 +203,8 @@ const Stundenplan = { }, showModal: function(event){ this.currentlySelectedEvent = event; - Vue.nextTick(() => { - this.$refs.lvmodal.show(); - }); + this.isModalTitleResolved = false; + this.isModalContentResolved = false; }, updateRange: function ({start,end, mounted}) { let checkDate = (date) => { @@ -208,8 +233,8 @@ const Stundenplan = { }, loadEvents: function(){ Promise.allSettled([ - this.$api.call(ApiStundenplan.StundenplanEvents(this.monthFirstDay, this.monthLastDay, this.propsViewData.lv_id)), - this.$api.call(ApiStundenplan.getStundenplanReservierungen(this.monthFirstDay, this.monthLastDay)) + this.$api.call(ApiLvPlan.LvPlanEvents(this.monthFirstDay, this.monthLastDay, this.propsViewData.lv_id)), + this.$api.call(ApiLvPlan.getLvPlanReservierungen(this.monthFirstDay, this.monthLastDay)) ]).then((result) => { let promise_events = []; result.forEach((promise_result) => { @@ -242,25 +267,41 @@ const Stundenplan = { }, }, created() { + + this.$api .call(ApiAuthinfo.getAuthUID()) .then(res => res.data) .then(data => { this.uid = data.uid; }); + // this.loadEvents(); }, beforeUnmount() { if(this.$refs.lvmodal) this.$refs.lvmodal.hide() }, template:/*html*/` + ` } -export default Stundenplan \ No newline at end of file +export default LvPlan; diff --git a/public/js/components/Cis/Mylv/LvInfo.js b/public/js/components/Cis/Mylv/LvInfo.js index 7120c5821..4fdbb695d 100644 --- a/public/js/components/Cis/Mylv/LvInfo.js +++ b/public/js/components/Cis/Mylv/LvInfo.js @@ -10,13 +10,6 @@ export default { } }, computed: { - LV_TYPES: function () { - return { - lehreinheit: "lehreinheit", - reservierung: "reservierung", - moodle: "moodle", - }; - }, lektorenLinks: function () { if (!this.event || !Array.isArray(this.event.lektor) || !this.event.lektor.length) return "a"; @@ -56,49 +49,6 @@ export default { }, template:/*html*/` - -
` } diff --git a/public/js/components/Cis/Mylv/LvMenu.js b/public/js/components/Cis/Mylv/LvMenu.js index e7a96f6d8..5f25bff5d 100644 --- a/public/js/components/Cis/Mylv/LvMenu.js +++ b/public/js/components/Cis/Mylv/LvMenu.js @@ -7,7 +7,7 @@ export default { }, containerStyles: Array, rowStyles: Array, - hasLvStundenplanEintraege: { + hasLvPlanEintraege: { required:false, default:true, type:Boolean, @@ -23,7 +23,7 @@ export default { if (!this.c4_link(menuItem) && !menuItem.c4_moodle_links?.length) { return true; } - if (menuItem.id == "addon_fhtw_menu_lvplan_lva" && !this.hasLvStundenplanEintraege){ + if (menuItem.id == "addon_fhtw_menu_lvplan_lva" && !this.hasLvPlanEintraege){ return true; } return null; diff --git a/public/js/components/Cis/Mylv/LvModal.js b/public/js/components/Cis/Mylv/LvModal.js index 435caa97c..537012ee6 100644 --- a/public/js/components/Cis/Mylv/LvModal.js +++ b/public/js/components/Cis/Mylv/LvModal.js @@ -1,9 +1,8 @@ import BsModal from "../../Bootstrap/Modal.js"; import Alert from "../../Bootstrap/Alert.js"; import LvMenu from "./LvMenu.js" -import LvInfo from "./LvInfo.js" -import ApiStundenplan from '../../../api/factory/stundenplan.js'; +import ApiLvPlan from '../../../api/factory/lvPlan.js'; import ApiAddons from '../../../api/factory/addons.js'; export default { @@ -11,7 +10,6 @@ export default { BsModal, Alert, LvMenu, - LvInfo, }, mixins: [BsModal], props: { @@ -44,6 +42,9 @@ export default { }; }, methods:{ + onHideModal: function(){ + this.menu = null; + }, onModalShow: function() { // do not load the menu if the menu is not getting rendered @@ -51,7 +52,7 @@ export default { if (this.event.type == 'lehreinheit') { this.$api - .call(ApiStundenplan.getLehreinheitStudiensemester(Array.isArray(this.event.lehreinheit_id) ? this.event.lehreinheit_id[0] : this.event.lehreinheit_id)) + .call(ApiLvPlan.getLehreinheitStudiensemester(Array.isArray(this.event.lehreinheit_id) ? this.event.lehreinheit_id[0] : this.event.lehreinheit_id)) .then(res => res.data) .then(studiensemester_kurzbz => this.$api.call( ApiAddons.getLvMenu( @@ -74,22 +75,13 @@ export default { return BsModal.popup.bind(this)(null, options); }, template: /*html*/ ` - +