Merge branch 'merge_C4_25999_61235_61730_testremerge' into merge_C4_25999_61235_61730

This commit is contained in:
Harald Bamberger
2025-06-11 15:00:48 +02:00
42 changed files with 683 additions and 428 deletions
+1 -1
View File
@@ -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';
@@ -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']);
}
}
@@ -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);
}
@@ -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;
@@ -0,0 +1,72 @@
<?php
/**
* Copyright (C) 2024 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
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);
}
}
@@ -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 [];
}
@@ -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;
}
@@ -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;
}
@@ -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);
+4 -4
View File
@@ -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');
+3
View File
@@ -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';
+15
View File
@@ -0,0 +1,15 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use CI3_Events as Events;
Events::on('loadRenderers', function ($renderers) {
$fhc_core_renderers =& $renderers();
$fhc_core_renderers["lehreinheit"] = array(
'calendarEvent' => APP_ROOT.'public/js/components/Cis/Stundenplan/EventTypes/calendarEvent.js',
'modalTitle' => APP_ROOT.'public/js/components/Cis/Mylv/modalTitle.js',
'modalContent' => APP_ROOT.'public/js/components/Cis/Mylv/modalContent.js'
);
});
@@ -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]);
@@ -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;
@@ -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){
@@ -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();
+76 -1
View File
@@ -411,4 +411,79 @@
pointer-events: none;
z-index: 2;
opacity: 0.5;
}
}
.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;
}
}
@@ -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,
+12
View File
@@ -0,0 +1,12 @@
export default {
loadRenderers() {
return {
method: 'get',
url: '/api/frontend/v1/RendererLoader/GetRenderers',
params: {
}
};
},
}
+2 -2
View File
@@ -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,
@@ -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 }
);
},
+2 -2
View File
@@ -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}`,
{
}
);
+41 -15
View File
@@ -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);
},
+1 -1
View File
@@ -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) {
+2 -2
View File
@@ -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(
@@ -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*/`
<template v-if="renderers">
<h2>
{{$p.t('lehre/stundenplan')}}
<span style="padding-left: 0.4em;" v-show="studiensemester_kurzbz">{{studiensemester_kurzbz}}</span>
<span style="padding-left: 0.5em;" v-show="propsViewData?.lv_id && lv"> {{ $p.user_language.value === 'German' ? lv?.bezeichnung : lv?.bezeichnung_english}}</span>
</h2>
<hr>
<lv-modal v-if="currentlySelectedEvent" :event="currentlySelectedEvent" ref="lvmodal" />
<lv-modal v-if="currentlySelectedEvent" :event="currentlySelectedEvent" ref="lvmodal" >
<template #modalTitle>
<Suspense @resolve="modalTitleResolved">
<component :is="modalTitleComponent(currentlySelectedEvent.type)" v-if="currentlySelectedEvent" :event="currentlySelectedEvent" ></component>
</Suspense>
</template>
<template #modalContent>
<Suspense @resolve="modalContentResolved">
<component :is="modalContentComponent(currentlySelectedEvent.type)" v-if="currentlySelectedEvent" :event="currentlySelectedEvent" ></component>
</Suspense>
</template>
</lv-modal>
<fhc-calendar
ref="calendar"
@selectedEvent="setSelectedEvent"
@@ -285,68 +326,23 @@ const Stundenplan = {
</div>
</template>
<template #monthPage="{event,day}">
<div class="p-1" v-if="event.type=='moodle'" @click="showModal(event)">
<div class="d-flex small w-100" >
<moodle-svg></moodle-svg>
<span class="flex-grow-1 text-center "><strong v-html="event.titel"></strong> - {{event.topic}}</span>
</div>
</div>
<div v-else @click="showModal(event)" class="p-1">
<span>{{event.topic}}</span>
<div @click="showModal(event)" class="p-1">
<component :is="calendarEventComponent(event.type)" :event="event" ></component>
</div>
</template>
<template #weekPage="{event,day}">
<div @click="showModal(event)" type="button"
class=" position-relative border border-secondary border d-flex flex-col align-items-center justify-content-evenly h-100"
:class="{'p-1':event.allDayEvent}"
style="overflow: auto;">
<div v-if="!event.allDayEvent && event?.beginn && event?.ende" class="d-none d-xl-block" >
<div class="d-flex flex-column p-4 p-xl-2 border-end border-secondary">
<span class="small">{{convertTime(event.beginn.split(":"))}}</span>
<span class="small">{{convertTime(event.ende.split(":"))}}</span>
</div>
</div>
<div v-if="event.type=='moodle'" class="d-flex small w-100" >
<moodle-svg></moodle-svg>
<span class="flex-grow-1 text-center"><strong v-html="event.titel"></strong> - {{event.topic}}</span>
</div>
<div v-else class="d-flex flex-column flex-grow-1 align-items-center small">
<span>{{event.topic}}</span>
<span v-for="lektor in event.lektor">{{lektor.kurzbz}}</span>
<span>{{event.ort_kurzbz}}</span>
</div>
<div @click="showModal(event)" type = "button"
class="weekPageContainer position-relative border border-secondary border d-flex flex-col align-items-center justify-content-evenly h-100"
:class="{'p-1':event.allDayEvent}"
style = "overflow: auto;" >
<component :is="calendarEventComponent(event.type)" :event="event" ></component>
</div>
</template>
<template #dayPage="{event,day,mobile}">
<div @click="mobile? showModal(event):null" type="button" class="fhc-entry border border-secondary border m-0 h-100 text-center">
<template v-if="event.type=='moodle'">
<div class="d-flex small align-items-center w-100 p-1" >
<moodle-svg></moodle-svg>
<span class="flex-grow-1 text-center"><strong v-html="event.titel"></strong> - {{event.topic}}</span>
</div>
</template>
<template v-else>
<div class="row justify-content-center align-items-center">
<div class="col-auto" v-if="!event.allDayEvent && event?.beginn && event?.ende" >
<div class="d-flex flex-column p-4 border-end border-secondary">
<span class="small">{{convertTime(event.beginn.split(":"))}}</span>
<span class="small">{{convertTime(event.ende.split(":"))}}</span>
</div>
</div>
<div class="col">
<p>{{ $p.t('lehre/lehrveranstaltung') }}:</p>
<p class="m-0">{{event?.topic}}</p>
</div>
<div class="col" :style="'max-height: ' + eventMaxHeight + '; overflow: auto;'">
<p>{{ $p.t('lehre/lektor') }}:</p>
<p class="m-0" v-for="lektor in event?.lektor">{{lektor.kurzbz}}</p>
</div>
<div class="col">
<p>{{ $p.t('profil/Ort') }}: </p>
<p class="m-0">{{event?.ort_kurzbz}}</p>
</div>
</div>
</template>
<div @click="mobile? showModal(event):null" type="button" class="dayPageContainer fhc-entry border border-secondary border m-0 h-100 text-center">
<div class="h-100 d-flex flex-col justify-content-evenly align-items-center">
<component :is="calendarEventComponent(event.type)" :event="event"></component>
</div>
</div>
</template>
<template #pageMobilContent="{lvMenu, event}">
@@ -362,7 +358,8 @@ const Stundenplan = {
<template #pageMobilContentEmpty >
<h3>{{ $p.t('lehre/noLvFound') }}</h3>
</template>
</fhc-calendar>`
</fhc-calendar>
</template>`
}
export default Stundenplan
export default LvPlan;
-51
View File
@@ -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*/`
<table class="table table-hover mb-4">
<template v-if="event.type == LV_TYPES.moodle">
<tbody>
<tr v-if="event?.datum">
<th>{{
$p.t('global','datum')?
$p.t('global','datum')+':'
:''
}}</th>
<td>{{methodFormatDate(event?.datum)}}</td>
</tr>
<tr>
<th>{{$p.t('global','aktivitaet')}}:</th>
<td v-html="event?.assignment"></td>
</tr>
<tr>
<th>{{$p.t('global','typ')}}:</th>
<td><img v-if="event?.activityIcon" class="me-1" :src="event?.activityIcon" />{{event?.purpose}}</td>
</tr>
<tr>
<th>{{$p.t('fristenmanagement','frist')}}:</th>
<td>{{start_time}}</td>
</tr>
<tr v-if="event?.actionname">
<th>{{$p.t('lvinfo','actionname')}}:</th>
<td>
{{event?.actionname}}
</td>
</tr>
<tr v-if="event?.overdue">
<th>{{$p.t('lvinfo','overdue')}}:</th>
<td>
{{$p.t('lvinfo','overdueEvent')}}
</td>
</tr>
<tr >
<th>{{$p.t('lvinfo','moodleLink')}}</th>
<td>
<a :href="event?.url" target="_blank"><i class="fa fa-arrow-up-right-from-square me-1"></i></a>
</td>
</tr>
</tbody>
</template>
<template v-else>
<tbody>
<tr v-if="event?.datum">
<th>{{
@@ -157,7 +107,6 @@ export default {
<td>{{event.organisationseinheit}}</td>
</tr>
</tbody>
</template>
</table>
`
}
+2 -2
View File
@@ -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;
+9 -17
View File
@@ -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*/ `
<bs-modal ref="modalContainer" @showBsModal="onModalShow" v-bind="$props" :bodyClass="''" dialogClass='modal-lg' class="bootstrap-alert" :backdrop="false" >
<bs-modal ref="modalContainer" @showBsModal="onModalShow" @hideBsModal="onHideModal" v-bind="$props" :bodyClass="''" dialogClass='modal-lg' class="bootstrap-alert" :backdrop="false" >
<template v-slot:title>
<template v-if="event?.type=='moodle'"><strong v-html="event.titel"></strong></template>
<template v-else-if="event.titel">{{ event.titel + ' - ' + event.lehrfach_bez + ' [' + event.ort_kurzbz+']'}}</template>
<template v-else>{{ event.lehrfach_bez + ' [' + event.ort_kurzbz+']'}}</template>
<slot name="modalTitle"></slot>
</template>
<template v-slot:default>
<h3>
<template v-if="event?.type =='moodle'">
{{$p.t('lvinfo','Moodleinformationen')}}
</template>
<template v-else>
{{$p.t('lvinfo','lehrveranstaltungsinformationen')}}
</template>
</h3>
<lv-info :event="event"></lv-info>
<slot name="modalContent"></slot>
<template v-if="showMenu && this.menu">
<h3>{{$p.t('lehre','lehrveranstaltungsmenue')}}</h3>
<lv-menu :menu="menu"></lv-menu>
@@ -33,7 +33,7 @@ export default {
result: false,
menu: [],
isMenuSelected:false,
hasLvStundenplanEintraege: true,
hasLvPlanEintraege: true,
lvEvaluierungMessage: "",
}
},
@@ -70,15 +70,15 @@ export default {
})
}
// check if the lv has stundenplan entries for this studiensemester
// check if the lv has lvplan entries for this studiensemester
if (this.studiensemester && this.event) {
return this.$fhcApi.factory.studium.getLvStundenplanForStudiensemester(this.studiensemester, this.event.lehreinheit_id ?? this.event.lehrveranstaltung_id)
return this.$fhcApi.factory.studium.getLvPlanForStudiensemester(this.studiensemester, this.event.lehreinheit_id ?? this.event.lehrveranstaltung_id)
.then(data => data.data)
.then(res => {
if (Array.isArray(res) && res.length > 0) {
this.hasLvStundenplanEintraege = true;
this.hasLvPlanEintraege = true;
} else {
this.hasLvStundenplanEintraege = false;
this.hasLvPlanEintraege = false;
}
});
}
@@ -107,7 +107,7 @@ export default {
<template #default>
<div class="mb-4" v-if="lvEvaluierungMessage" v-html="lvEvaluierungMessage"></div>
<slot name="content"></slot>
<lv-menu v-model:isMenuSelected="isMenuSelected" :hasLvStundenplanEintraege="hasLvStundenplanEintraege" :preselectedMenu="preselectedMenu" :menu="menu" @hideModal="hide"></lv-menu>
<lv-menu v-model:isMenuSelected="isMenuSelected" :hasLvPlanEintraege="hasLvPlanEintraege" :preselectedMenu="preselectedMenu" :menu="menu" @hideModal="hide"></lv-menu>
</template>
</bs-modal>
@@ -3,7 +3,7 @@ import CalendarDate from "../../../composables/CalendarDate.js";
import LvModal from "../../../components/Cis/Mylv/LvModal.js";
import LvInfo from "../../../components/Cis/Mylv/LvInfo.js"
import ApiStudenplan from '../../../api/factory/stundenplan.js';
import ApiStudenplan from '../../../api/factory/lvPlan.js';
export const DEFAULT_MODE_RAUMINFO = 'Week'
@@ -107,7 +107,7 @@ const RoomInformation = {
String(this.currentDay.getDate()).padStart(2, "0");
this.$router.push({
name: "Stundenplan",
name: "LvPlan",
params: {
mode: this.calendarMode,
focus_date: date,
@@ -0,0 +1,113 @@
import { numberPadding, formatDate } from "../../../helpers/DateHelpers.js"
export default {
props:{
event: {
type: Object,
required: true,
}
},
computed: {
lektorenLinks: function () {
if (!this.event || !Array.isArray(this.event.lektor) || !this.event.lektor.length) return "a";
let lektorenLinks = {};
this.event.lektor.forEach((lektor) => {
lektorenLinks[lektor.kurzbz] = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + `/Cis/Profil/View/${lektor.mitarbeiter_uid}`;
})
return lektorenLinks;
},
getOrtContentLink: function () {
if (!this.event || !this.event.ort_content_id) return "a";
return FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + `/CisVue/Cms/content/${this.event.ort_content_id}`
},
start_time: function () {
if (!this.event.start) return 'N/A';
if (!this.event.start instanceof Date) {
return this.event.start;
}
return numberPadding(this.event.start.getHours()) + ":" + numberPadding(this.event.start.getMinutes());
},
end_time: function () {
if (!this.event.end) return 'N/A';
if (!this.event.end instanceof Date) {
return this.event.end;
}
return numberPadding(this.event.end.getHours()) + ":" + numberPadding(this.event.end.getMinutes());
}
},
methods: {
mehtodNumberPadding: function (number) {
return numberPadding(number);
},
methodFormatDate: function (d) {
return formatDate(d);
},
},
template: `
<h3>
{{$p.t('lvinfo','lehrveranstaltungsinformationen')}}
</h3>
<table class="table table-hover mb-4">
<tbody>
<tr>
<th>{{
$p.t('global','datum')?
$p.t('global','datum')+':'
:''
}}</th>
<td>{{methodFormatDate(event.datum)}}</td>
</tr>
<tr>
<th>{{
$p.t('global','raum')?
$p.t('global','raum')+':'
:''
}}</th>
<td>
<a v-if="event.ort_content_id" :href="getOrtContentLink"><i class="fa fa-arrow-up-right-from-square me-1" style="color:#00649C"></i></a>
{{event.ort_kurzbz}}
</td>
</tr>
<tr>
<th>{{
$p.t('lehre','lehrveranstaltung')?
$p.t('lehre','lehrveranstaltung')+':'
:''
}}</th>
<td>{{'('+event.lehrform+') ' + event.lehrfach_bez}}</td>
</tr>
<tr>
<th>{{
$p.t('lehre','lektor')?
$p.t('lehre','lektor')+':'
:''
}}</th>
<td>
<div v-for="lektor in event.lektor" class="d-block">
<a v-if="lektorenLinks[lektor.kurzbz]" :href="lektorenLinks[lektor.kurzbz]"><i class="fa fa-arrow-up-right-from-square me-1" style="color:#00649C"></i></a>
{{lektor.kurzbz}}
</div>
</td>
</tr>
<tr>
<th>{{
$p.t('ui','zeitraum')?
$p.t('ui','zeitraum')+':'
:''
}}</th>
<td>{{start_time + ' - ' + end_time}}</td>
</tr>
<tr>
<th>{{
$p.t('lehre','organisationseinheit')?
$p.t('lehre','organisationseinheit')+':'
:''
}}</th>
<td>{{event.organisationseinheit}}</td>
</tr>
</tbody>
</table>`,
}
@@ -0,0 +1,12 @@
export default {
props:{
event: {
type: Object,
required: true,
}
},
template:`
<div v-if="event.titel">{{ event.titel + ' - ' + event.lehrfach_bez + ' [' + event.ort_kurzbz+']'}}</div>
<div v-else>{{ event.lehrfach_bez + ' [' + event.ort_kurzbz+']'}}</div>
`
}
@@ -12,6 +12,7 @@ export default{
},
template:/*html*/`
<template v-if="data.kontakt">
<div class="gy-2 row align-items-center justify-content-center">
<div class="col-1 text-center" >
<i class="fa-solid fhc-link-color" :class="{...(data.kontakt.includes('@')?{'fa-envelope':true}:{'fa-phone':true})}" ></i>
@@ -35,5 +36,6 @@ export default{
<i v-else="data.zustellung" class="fa-solid fa-xmark"></i>
</div>
</div>
</template>
`,
};
@@ -10,6 +10,7 @@ export default {
},
template: /*html*/`
<template v-if="Array.isArray(data) && data.length >0">
<div class="card">
<div class="card-header">
{{title}}
@@ -18,7 +19,7 @@ export default {
<h6 class="card-title">{{$p.t('profil','mailverteilerMitglied')}}</h6>
<div class="card-text row text-break mb-2" v-for="verteiler in data">
<div class="col-12 ">
<div class="row">
<div class="row">
<div class="col-1 ">
<i class="fa-solid fa-envelope fhc-link-color" ></i>
</div>
@@ -26,9 +27,10 @@ export default {
<a class="fhc-link-color" :href="verteiler.mailto"><b>{{verteiler.gruppe_kurzbz}}</b></a>
</div>
</div>
</div>
</div>
<div class="col-11 offset-1 ">{{verteiler.beschreibung}}</div>
</div>
</div>
</div>`,
</div>
</template>`,
};
@@ -20,17 +20,19 @@ export default {
<!-- HIER SIND DIE EMAILS -->
<div class="gy-3 row justify-content-center ">
<div v-for="email in data" class="col-12 ">
<div class="row align-items-center">
<div class="col-1 text-center">
<i class="fa-solid fa-envelope fhc-link-color" ></i>
</div>
<div class="col-11">
<div class="form-underline">
<div class="form-underline-titel">{{email.type}}</div>
<a :href="'mailto:'+email.email" class="form-underline-content">{{email.email}} </a>
</div>
</div>
</div>
<template v-if="email.email">
<div class="row align-items-center">
<div class="col-1 text-center">
<i class="fa-solid fa-envelope fhc-link-color" ></i>
</div>
<div class="col-11">
<div class="form-underline">
<div class="form-underline-titel">{{email?.type}}</div>
<a :href="'mailto:'+email?.email" class="form-underline-content">{{email?.email}} </a>
</div>
</div>
</div>
</template>
</div>
</div>
</div>
+1 -1
View File
@@ -126,7 +126,7 @@ export default {
},
openLvUebersicht(lehrveranstaltung) {
this.selectedLehrveranstaltung = lehrveranstaltung;
//convert lehrveranstaltung properties for compatibility with Stundenplan LvModal
//convert lehrveranstaltung properties for compatibility with LvPlan LvModal
this.selectedLehrveranstaltung.type ="lehreinheit";
this.selectedLehrveranstaltung.lehreinheit_id = this.selectedLehrveranstaltung.lehrveranstaltung_id;
if(this.selectedLehrveranstaltung){
@@ -0,0 +1,30 @@
export default {
methods:{
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 });
},
},
props:{
event: {
type:Object,
required:true,
},
},
template: `
<div class="lehreinheitEventHeader" v-if="!event.allDayEvent && event?.beginn && event?.ende" >
<span class="small">{{convertTime(event.beginn.split(":"))}}</span>
<span class="small">{{convertTime(event.ende.split(":"))}}</span>
</div>
<div class="lehreinheitEventContent">
<span>{{event.topic}}</span>
<span v-for="lektor in event.lektor">{{lektor.kurzbz}}</span>
<span>{{event.ort_kurzbz}}</span>
</div>
`,
}
@@ -6,11 +6,11 @@ import ContentModal from '../Cis/Cms/ContentModal.js'
import CalendarDate from '../../composables/CalendarDate.js';
import moodleSvg from "../../helpers/moodleSVG.js"
import ApiStundenplan from '../../api/factory/stundenplan.js';
import ApiLvPlan from '../../api/factory/lvPlan.js';
import ApiOrt from '../../api/factory/ort.js';
export default {
name: "WidgetsStundenplan",
name: "LvPlanWidget",
mixins: [
Phrasen,
AbstractWidget
@@ -128,8 +128,8 @@ export default {
loadEvents: function () {
Promise.allSettled([
this.$api.call(ApiStundenplan.StundenplanEvents(this.monthFirstDay, this.monthLastDay)),
this.$api.call(ApiStundenplan.getStundenplanReservierungen(this.monthFirstDay, this.monthLastDay))
this.$api.call(ApiLvPlan.LvPlanEvents(this.monthFirstDay, this.monthLastDay)),
this.$api.call(ApiLvPlan.getLvPlanReservierungen(this.monthFirstDay, this.monthLastDay))
]).then((result) => {
let promise_events = [];
result.forEach((promise_result) => {
@@ -170,7 +170,7 @@ export default {
this.loadEvents();
},
template: /*html*/`
<div class="dashboard-widget-stundenplan d-flex flex-column h-100">
<div class="dashboard-widget-lvplan d-flex flex-column h-100">
<lv-modal v-if="selectedEvent" ref="lvmodal" :event="selectedEvent" />
<content-modal :content_id="roomInfoContentID" dialogClass="modal-lg" ref="contentModal"/>
<fhc-calendar @change:range="updateRange" :initial-date="currentDay" class="border-0" class-header="p-0" @select:day="selectDay" :widget="true" v-model:minimized="minimized" :events="events" no-week-view :show-weeks="false" >
+5 -5
View File
@@ -198,7 +198,7 @@ export default {
</div>
</div>
<!--EDIT MODAL-->
<core-form draggable="true" @dragstart="stopDrag" @drag="stopDrag" @dragend="stopDrag" ref="editForm">
<teleport to="body">
<bs-modal @[\`hide.bs.modal\`]="bookmark_id=null; clearInputs();" ref="editModal">
<template #title>
<h2>{{$p.t('bookmark','editLink')}}</h2>
@@ -213,10 +213,9 @@ export default {
<button @click="editBookmark" class="btn btn-primary">{{$p.t('bookmark','saveLink')}}</button>
</template>
</bs-modal>
</core-form>
</teleport>
<!--CREATE MODAL-->
<core-form draggable="true" @dragstart="stopDrag" @drag="stopDrag" @dragend="stopDrag" ref="createForm">
<teleport to="body">
<bs-modal @[\`hide.bs.modal\`]="clearInputs();" ref="createModal">
<template #title>
<h2>{{$p.t('bookmark','newLink')}}</h2>
@@ -231,7 +230,8 @@ export default {
<button @click="insertBookmark" class="btn btn-primary">{{$p.t('bookmark','saveLink')}}</button>
</template>
</bs-modal>
</core-form>`,
</teleport>
`,
};
/*
+2 -2
View File
@@ -429,7 +429,7 @@ export default {
this._dragStart(evt);
},
dragOver(evt) {
if ((this.y + 1) > this.rows && this.mode == MODE_MOVE) {
if ((this.y + 1) > this.rows && (this.mode == MODE_MOVE || this.mode == MODE_RESIZE)) {
this.positionUpdates = this.positionUpdates?.filter(item => {
return item.widgetid == this.draggedItem.data.widgetid;
})
@@ -628,7 +628,7 @@ export default {
class="position-absolute"
:active="active"
:style="{
zIndex: item.resizeOverlay ? 1 : 2,
zIndex: item.resizeOverlay ? 1 : 'auto',
top: 'calc(' + item.y + ' * var(--fhc-dg-row-height))',
left: 'calc(' + item.x + ' * var(--fhc-dg-col-width))',
width: 'calc(' + item.w + ' * var(--fhc-dg-col-width))',
-5
View File
@@ -1,5 +0,0 @@
export default {
template:`
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 20 130 90" style="height:1.5em" ><radialGradient id="moodle-original-a" cx="532.855" cy="-537.557" r="209.76" gradientTransform="matrix(1 0 0 -1 -297.6 -460.9)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#FAAF40" /><stop offset=".043" stop-color="#F9A538" /><stop offset=".112" stop-color="#F89D31" /><stop offset=".227" stop-color="#F89A2F" /><stop offset=".528" stop-color="#F7922D" /><stop offset="1" stop-color="#F37B28" /></radialGradient><path fill="white" stroke="black" stroke-width="1" d="M106.259 105.754V66.975c0-8.164-3.397-12.244-10.034-12.244-6.629 0-10.034 4.08-10.034 12.244v38.779H66.294V66.975c0-8.164-3.228-12.244-9.862-12.244-6.633 0-10.036 4.08-10.036 12.244v38.779H26.667V64.768c0-8.504 2.891-14.801 8.844-19.223 5.102-3.91 12.246-5.777 20.92-5.777 9.015 0 15.478 2.207 19.727 6.801 3.57-4.594 10.207-6.801 19.897-6.801 8.844 0 15.819 1.867 20.922 5.777 5.951 4.422 8.843 10.719 8.843 19.223v41.152h-19.563v-.166z" /><path fill="black" d="M28.539 49.627l-2.041 10.207c18.708 6.291 36.395.166 45.751-16.158-13.778-9.522-26.535.17-43.71 5.951" /><linearGradient id="moodle-original-b" gradientUnits="userSpaceOnUse" x1="324.268" y1="-509.952" x2="368.932" y2="-509.952" gradientTransform="matrix(1 0 0 -1 -297.6 -460.9)"><stop offset="0" stop-color="#929497" /><stop offset=".124" stop-color="#757578" /><stop offset=".279" stop-color="#575658" /><stop offset=".44" stop-color="#403E3F" /><stop offset=".609" stop-color="#302D2E" /><stop offset=".788" stop-color="#262223" /><stop offset="1" stop-color="#231F20" /></linearGradient><path fill="black" d="M28.539 47.08c-.681 3.91-1.192 7.65-1.872 11.563 17.857 6.125 35.375.85 44.73-15.137-11.909-13.776-25.17-2.383-42.858 3.574" /><linearGradient id="moodle-original-c" gradientUnits="userSpaceOnUse" x1="332.834" y1="-495.051" x2="351.377" y2="-521.534" gradientTransform="matrix(1 0 0 -1 -297.6 -460.9)"><stop offset="0" stop-color="#231F20" /><stop offset="1" stop-color="#231F20" stop-opacity="0" /></linearGradient><path fill="none" d="M49.799 51.668c-8.164-1.701-17.009 2.555-23.131 6.975-3.912-28.57 13.777-27.893 36.903-20.75-1.529 6.975-4.083 16.33-8.502 21.941-.169-3.744-1.869-6.293-5.27-8.166" /><linearGradient id="moodle-original-d" gradientUnits="userSpaceOnUse" x1="299.778" y1="-495.802" x2="381.412" y2="-495.802" gradientTransform="matrix(1 0 0 -1 -297.6 -460.9)"><stop offset="0" stop-color="#929497" /><stop offset=".124" stop-color="#757578" /><stop offset=".279" stop-color="#575658" /><stop offset=".44" stop-color="#403E3F" /><stop offset=".609" stop-color="#302D2E" /><stop offset=".788" stop-color="#262223" /><stop offset="1" stop-color="#231F20" /></linearGradient><path fill="black" d="M2.178 47.08c29.932-18.031 46.77-21.43 81.634-25-40.478 31.969-41.499 25-81.634 25" /><path stroke="#4A4A4C" stroke-width=".5" fill="black" d="M83.812 22.246L51.667 45.545" /><path opacity=".23" fill="black" d="M45.545 34.66c.34 3.744-.511-3.572 0 0" /><path stroke="#4A4A4C" stroke-width=".5" fill="black" d="M2.178 47.08l49.489-1.535" /><path stroke="#F16922" stroke-width=".5" d="M42.484 35.002C33.98 37.383 6.09 43.506 5.747 47.08c-.849 6.631-.167 17.176-.167 17.176" fill="none" /><path fill="#F16922" d="M8.131 89.596c-3.063-7.652-6.804-16.158-2.384-26.703C8.64 72.756 8.131 80.24 8.131 89.596" /><path fill="#6D6E70" d="M41.076 33.844c.708-.25 1.384-.17 1.509.184.126.355-.344.846-1.052 1.096-.709.256-1.384.172-1.51-.184-.127-.352.344-.844 1.053-1.096z" /></svg>
`
}