mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-06-01 20:29:29 +00:00
Compare commits
36 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2f90112e4d | |||
| 774eb90bcc | |||
| 1def930147 | |||
| 30b8a406a5 | |||
| 093842274e | |||
| fd2f4187fa | |||
| b2bebb7fa3 | |||
| e32cce57fe | |||
| cb7a0f7669 | |||
| 68d97a5e97 | |||
| d27071528f | |||
| 17772c3738 | |||
| bbb4f8a01c | |||
| bf5ab6b7dd | |||
| fdbb93a5c5 | |||
| b7e48633ab | |||
| 04dc1eb07b | |||
| 50b229090b | |||
| 2d27a998c4 | |||
| 090e535466 | |||
| c4d35181db | |||
| 0ac6ef4599 | |||
| 7f13c128f1 | |||
| cb60ddcc94 | |||
| bd4ced9559 | |||
| a04d2acb86 | |||
| de2aabf00b | |||
| 685fc69e5d | |||
| 58a921b500 | |||
| 26db4a5e7a | |||
| 13e8a1a9f6 | |||
| 21d80905a2 | |||
| 298dbbf400 | |||
| 36beb927f1 | |||
| ee41b2b68d | |||
| ba6224bc78 |
@@ -64,9 +64,6 @@ $route['api/v1/system/[S|s]prache/(:any)'] = 'api/v1/system/sprache2/$1';
|
|||||||
$route['Cis/LvPlan/.*'] = 'Cis/LvPlan/index/$1';
|
$route['Cis/LvPlan/.*'] = 'Cis/LvPlan/index/$1';
|
||||||
$route['Cis/MyLvPlan/.*'] = 'Cis/MyLvPlan/index/$1';
|
$route['Cis/MyLvPlan/.*'] = 'Cis/MyLvPlan/index/$1';
|
||||||
$route['Cis/MyLv/.*'] = 'Cis/MyLv/index/$1';
|
$route['Cis/MyLv/.*'] = 'Cis/MyLv/index/$1';
|
||||||
$route['Cis/OtherLvPlan/.*'] = 'Cis/OtherLvPlan/index/$1';
|
|
||||||
//Route for LV Plan Stg/Semester/Verband/Gruppe
|
|
||||||
$route['Cis/StgOrgLvPlan/.*'] = 'Cis/StgOrgLvPlan/index/$1';
|
|
||||||
|
|
||||||
$route['Abgabetool/Assistenz'] = 'Cis/Abgabetool/Assistenz';
|
$route['Abgabetool/Assistenz'] = 'Cis/Abgabetool/Assistenz';
|
||||||
$route['Abgabetool/Assistenz/(:any)'] = 'Cis/Abgabetool/Assistenz/$1';
|
$route['Abgabetool/Assistenz/(:any)'] = 'Cis/Abgabetool/Assistenz/$1';
|
||||||
|
|||||||
@@ -31,8 +31,12 @@ class Abgabetool extends Auth_Controller
|
|||||||
{
|
{
|
||||||
// TODO: routing from index based on berechtigung?
|
// TODO: routing from index based on berechtigung?
|
||||||
|
|
||||||
|
$viewData = array(
|
||||||
|
'uid'=>getAuthUID(),
|
||||||
|
);
|
||||||
|
|
||||||
if(defined('CIS4') && CIS4) {
|
if(defined('CIS4') && CIS4) {
|
||||||
$this->load->view('CisRouterView/CisRouterView.php', ['route' => 'Abgabetool']);
|
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'Abgabetool']);
|
||||||
} else {
|
} else {
|
||||||
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'Abgabetool']);
|
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'Abgabetool']);
|
||||||
}
|
}
|
||||||
@@ -40,8 +44,12 @@ class Abgabetool extends Auth_Controller
|
|||||||
|
|
||||||
public function Student($student_uid_prop = '')
|
public function Student($student_uid_prop = '')
|
||||||
{
|
{
|
||||||
|
$viewData = array(
|
||||||
|
'uid'=>getAuthUID(),
|
||||||
|
);
|
||||||
|
|
||||||
if(defined('CIS4') && CIS4) {
|
if(defined('CIS4') && CIS4) {
|
||||||
$this->load->view('CisRouterView/CisRouterView.php', ['route' => 'AbgabetoolStudent']);
|
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolStudent']);
|
||||||
} else {
|
} else {
|
||||||
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolStudent', 'student_uid_prop' => $student_uid_prop]);
|
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolStudent', 'student_uid_prop' => $student_uid_prop]);
|
||||||
}
|
}
|
||||||
@@ -49,8 +57,12 @@ class Abgabetool extends Auth_Controller
|
|||||||
|
|
||||||
public function Mitarbeiter()
|
public function Mitarbeiter()
|
||||||
{
|
{
|
||||||
|
$viewData = array(
|
||||||
|
'uid'=>getAuthUID(),
|
||||||
|
);
|
||||||
|
|
||||||
if(defined('CIS4') && CIS4) {
|
if(defined('CIS4') && CIS4) {
|
||||||
$this->load->view('CisRouterView/CisRouterView.php', ['route' => 'AbgabetoolMitarbeiter']);
|
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolMitarbeiter']);
|
||||||
} else {
|
} else {
|
||||||
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolMitarbeiter']);
|
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolMitarbeiter']);
|
||||||
}
|
}
|
||||||
@@ -58,8 +70,13 @@ class Abgabetool extends Auth_Controller
|
|||||||
|
|
||||||
public function Assistenz($stg_kz_prop = '')
|
public function Assistenz($stg_kz_prop = '')
|
||||||
{
|
{
|
||||||
|
|
||||||
|
$viewData = array(
|
||||||
|
'uid'=>getAuthUID(),
|
||||||
|
);
|
||||||
|
|
||||||
if(defined('CIS4') && CIS4) {
|
if(defined('CIS4') && CIS4) {
|
||||||
$this->load->view('CisRouterView/CisRouterView.php', ['route' => 'AbgabetoolAssistenz']);
|
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolAssistenz']);
|
||||||
} else {
|
} else {
|
||||||
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolAssistenz', 'stg_kz_prop' => $stg_kz_prop]);
|
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolAssistenz', 'stg_kz_prop' => $stg_kz_prop]);
|
||||||
}
|
}
|
||||||
@@ -67,8 +84,12 @@ class Abgabetool extends Auth_Controller
|
|||||||
|
|
||||||
public function Deadlines()
|
public function Deadlines()
|
||||||
{
|
{
|
||||||
|
$viewData = array(
|
||||||
|
'uid'=>getAuthUID(),
|
||||||
|
);
|
||||||
|
|
||||||
if(defined('CIS4') && CIS4) {
|
if(defined('CIS4') && CIS4) {
|
||||||
$this->load->view('CisRouterView/CisRouterView.php', ['route' => 'DeadlinesOverview']);
|
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'DeadlinesOverview']);
|
||||||
} else {
|
} else {
|
||||||
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'DeadlinesOverview']);
|
$this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'DeadlinesOverview']);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ class Auth extends FHC_Controller
|
|||||||
|
|
||||||
if ($this->form_validation->run())
|
if ($this->form_validation->run())
|
||||||
{
|
{
|
||||||
redirect($this->authlib->getLandingPage('/Cis4'));
|
redirect($this->authlib->getLandingPage('/CisVue/Dashboard'));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -28,6 +28,12 @@ class LvPlan extends Auth_Controller
|
|||||||
*/
|
*/
|
||||||
public function index()
|
public function index()
|
||||||
{
|
{
|
||||||
$this->load->view('CisRouterView/CisRouterView.php', ['route' => 'LvPlan']);
|
|
||||||
|
$viewData = array(
|
||||||
|
'uid'=>getAuthUID(),
|
||||||
|
'timezone' => $this->config->item('timezone')
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'LvPlan']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,6 +26,11 @@ class MyLv extends Auth_Controller
|
|||||||
*/
|
*/
|
||||||
public function index()
|
public function index()
|
||||||
{
|
{
|
||||||
$this->load->view('CisRouterView/CisRouterView.php', ['route' => 'MyLv']);
|
|
||||||
|
$viewData = array(
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'MyLv']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,7 +27,13 @@ class MyLvPlan extends Auth_Controller
|
|||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function index()
|
public function index()
|
||||||
{
|
{
|
||||||
$this->load->view('CisRouterView/CisRouterView.php', ['route' => 'MyLvPlan']);
|
|
||||||
|
$viewData = array(
|
||||||
|
'uid'=>getAuthUID(),
|
||||||
|
'timezone' => $this->config->item('timezone')
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'MyLvPlan']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,34 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
if (!defined('BASEPATH'))
|
|
||||||
exit('No direct script access allowed');
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
class OtherLvPlan extends Auth_Controller
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Constructor
|
|
||||||
*/
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
parent::__construct([
|
|
||||||
'index' => ['basis/other_lv_plan:r']
|
|
||||||
]);
|
|
||||||
|
|
||||||
// Load Config
|
|
||||||
$this->load->config('calendar');
|
|
||||||
}
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------------------------------------------
|
|
||||||
// Public methods
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function index()
|
|
||||||
{
|
|
||||||
$this->load->view('CisRouterView/CisRouterView.php', ['route' => 'OtherLvPlan']);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -55,7 +55,15 @@ class Profil extends Auth_Controller
|
|||||||
*/
|
*/
|
||||||
public function index()
|
public function index()
|
||||||
{
|
{
|
||||||
$this->load->view('CisRouterView/CisRouterView.php', ['route' => 'profilIndex']);
|
|
||||||
|
$this->load->library('ProfilLib');
|
||||||
|
$profil_data = $this->profillib->getView(getAuthUID());
|
||||||
|
$profil_data = hasData($profil_data) ? getData($profil_data) : null;
|
||||||
|
$viewData = array(
|
||||||
|
'editable'=>true,
|
||||||
|
'profil_data' => $profil_data,
|
||||||
|
);
|
||||||
|
$this->load->view('CisRouterView/CisRouterView.php',['viewData' => $viewData, 'route' => 'profilIndex']);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -65,13 +73,23 @@ class Profil extends Auth_Controller
|
|||||||
*/
|
*/
|
||||||
public function View($uid)
|
public function View($uid)
|
||||||
{
|
{
|
||||||
$this->load->view('CisRouterView/CisRouterView.php', ['route' => 'profilViewUid']);
|
$this->load->library('ProfilLib');
|
||||||
|
$profil_data = $this->profillib->getView($uid);
|
||||||
|
$profil_data = hasData($profil_data) ? getData($profil_data) : null;
|
||||||
|
$viewData = array (
|
||||||
|
'uid' => $uid,
|
||||||
|
'profil_data'=>$profil_data,
|
||||||
|
);
|
||||||
|
if($uid == getAuthUID()){
|
||||||
|
$viewData['editable'] = true;
|
||||||
|
}
|
||||||
|
$this->load->view('CisRouterView/CisRouterView.php',['viewData' => $viewData, 'route' => 'profilViewUid']);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* checks whether a specific userID is a student or not (foreword declaration of the function isStudent in Student_model.php)
|
* checks whether a specific userID is a mitarbeiter or not (foreword declaration of the function isMitarbeiter in Mitarbeiter_model.php)
|
||||||
* @access public
|
* @access public
|
||||||
* @param $uid the userID used to check if it is a student
|
* @param $uid the userID used to check if it is a mitarbeiter
|
||||||
* @return boolean
|
* @return boolean
|
||||||
*/
|
*/
|
||||||
public function isStudent($uid)
|
public function isStudent($uid)
|
||||||
@@ -101,7 +119,7 @@ class Profil extends Auth_Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gets the adressen that are marked as zustell from the currently logged in user
|
* gets the adressen that are marked as zustell from the currenlty logged in user
|
||||||
* @access public
|
* @access public
|
||||||
* @return array a list of adresse_id's
|
* @return array a list of adresse_id's
|
||||||
*/
|
*/
|
||||||
@@ -244,23 +262,23 @@ class Profil extends Auth_Controller
|
|||||||
$this->GemeindeModel->addDistinct();
|
$this->GemeindeModel->addDistinct();
|
||||||
$this->GemeindeModel->addSelect(["name"]);
|
$this->GemeindeModel->addSelect(["name"]);
|
||||||
if ($nation == "A") {
|
if ($nation == "A") {
|
||||||
if (isset($zip) && $zip > 999 && $zip < 32000) {
|
if (isset($zip) && $zip > 999 && $zip < 32000) {
|
||||||
|
|
||||||
$gemeinde_res = $this->GemeindeModel->loadWhere(['plz' => $zip]);
|
$gemeinde_res = $this->GemeindeModel->loadWhere(['plz' => $zip]);
|
||||||
if (isError($gemeinde_res)) {
|
if (isError($gemeinde_res)) {
|
||||||
show_error("error while trying to query bis.tbl_gemeinde");
|
show_error("error while trying to query bis.tbl_gemeinde");
|
||||||
|
}
|
||||||
|
$gemeinde_res = hasData($gemeinde_res) ? getData($gemeinde_res) : null;
|
||||||
|
$gemeinde_res = array_map(function ($obj) {
|
||||||
|
return $obj->name;
|
||||||
|
}, $gemeinde_res);
|
||||||
|
echo json_encode($gemeinde_res);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
echo json_encode(error("ortschaftskennziffer code was not valid"));
|
||||||
}
|
}
|
||||||
$gemeinde_res = hasData($gemeinde_res) ? getData($gemeinde_res) : null;
|
|
||||||
$gemeinde_res = array_map(function ($obj) {
|
|
||||||
return $obj->name;
|
|
||||||
}, $gemeinde_res);
|
|
||||||
echo json_encode($gemeinde_res);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
echo json_encode(error("ortschaftskennziffer code was not valid"));
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
echo json_encode(error("Nation was not 'A' (Austria)"));
|
echo json_encode(error("Nation was not 'A' (Austria)"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -732,4 +750,6 @@ class Profil extends Auth_Controller
|
|||||||
$zutrittskarte_ausgegebenam = str_replace("-", ".", $zutrittskarte_ausgegebenam);
|
$zutrittskarte_ausgegebenam = str_replace("-", ".", $zutrittskarte_ausgegebenam);
|
||||||
return $zutrittskarte_ausgegebenam;
|
return $zutrittskarte_ausgegebenam;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,6 +25,11 @@ class Raumsuche extends Auth_Controller
|
|||||||
*/
|
*/
|
||||||
public function index()
|
public function index()
|
||||||
{
|
{
|
||||||
$this->load->view('CisRouterView/CisRouterView.php', ['route' => 'Raumsuche']);
|
|
||||||
|
$viewData = array(
|
||||||
|
'uid'=>getAuthUID(),
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'Raumsuche']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,33 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
class StgOrgLvPlan extends Auth_Controller
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Constructor
|
|
||||||
*/
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
parent::__construct([
|
|
||||||
'index' => ['basis/cis:r']
|
|
||||||
]);
|
|
||||||
|
|
||||||
// Load Config
|
|
||||||
$this->load->config('calendar');
|
|
||||||
}
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------------------------------------------
|
|
||||||
// Public methods
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function index()
|
|
||||||
{
|
|
||||||
$this->load->view('CisRouterView/CisRouterView.php', ['route' => 'StgOrgLvPlan']);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -29,7 +29,10 @@ class Studium extends Auth_Controller
|
|||||||
*/
|
*/
|
||||||
public function index()
|
public function index()
|
||||||
{
|
{
|
||||||
$this->load->view('CisRouterView/CisRouterView.php',['route' => 'studium']);
|
$viewData = array(
|
||||||
|
|
||||||
|
);
|
||||||
|
$this->load->view('CisRouterView/CisRouterView.php',['viewData' => $viewData, 'route' => 'studium']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
if (!defined('BASEPATH'))
|
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
exit('No direct script access allowed');
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@@ -14,9 +13,9 @@ class Cis4 extends Auth_Controller
|
|||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
parent::__construct(
|
parent::__construct(
|
||||||
array(
|
array(
|
||||||
'index' => 'basis/cis:r'
|
'index' => 'basis/cis:r'
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
// Load Config
|
// Load Config
|
||||||
@@ -31,6 +30,16 @@ class Cis4 extends Auth_Controller
|
|||||||
*/
|
*/
|
||||||
public function index()
|
public function index()
|
||||||
{
|
{
|
||||||
$this->load->view('CisRouterView/CisRouterView.php', ['route' => 'FhcDashboard']);
|
$this->load->model('person/Person_model', 'PersonModel');
|
||||||
|
$personData = getData($this->PersonModel->getByUid(getAuthUID()))[0];
|
||||||
|
|
||||||
|
$viewData = array(
|
||||||
|
'uid' => getAuthUID(),
|
||||||
|
'name' => $personData->vorname,
|
||||||
|
'person_id' => $personData->person_id,
|
||||||
|
'timezone' => $this->config->item('timezone')
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'FhcDashboard']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class Dashboard extends Auth_Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct(
|
||||||
|
array(
|
||||||
|
'index' => 'dashboard/benutzer:r'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------------------------------------------
|
||||||
|
// Public methods
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
|
||||||
|
$this->load->model('person/Person_model','PersonModel');
|
||||||
|
$personData = getData($this->PersonModel->getByUid(getAuthUID()))[0];
|
||||||
|
|
||||||
|
$viewData = array(
|
||||||
|
'uid' => getAuthUID(),
|
||||||
|
'name' => $personData->vorname,
|
||||||
|
'person_id' => $personData->person_id
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData]);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -18,8 +18,6 @@
|
|||||||
|
|
||||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
|
||||||
use \DateTime as DateTime;
|
|
||||||
|
|
||||||
class Bookmark extends FHCAPI_Controller
|
class Bookmark extends FHCAPI_Controller
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -30,162 +28,111 @@ class Bookmark extends FHCAPI_Controller
|
|||||||
{
|
{
|
||||||
parent::__construct([
|
parent::__construct([
|
||||||
'getBookmarks' => self::PERM_LOGGED,
|
'getBookmarks' => self::PERM_LOGGED,
|
||||||
'delete' => self::PERM_LOGGED,
|
'delete' => self::PERM_LOGGED,
|
||||||
'insert' => self::PERM_LOGGED,
|
'insert' => self::PERM_LOGGED,
|
||||||
'update' => self::PERM_LOGGED,
|
'update' => self::PERM_LOGGED,
|
||||||
'changeOrder' => self::PERM_LOGGED
|
]);
|
||||||
]);
|
|
||||||
|
|
||||||
$this->load->model('dashboard/Bookmark_model', 'BookmarkModel');
|
$this->load->model('dashboard/Bookmark_model', 'BookmarkModel');
|
||||||
|
|
||||||
$this->uid = getAuthUID();
|
$this->uid = getAuthUID();
|
||||||
$this->pid = getAuthPersonID();
|
$this->pid = getAuthPersonID();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------------------------------
|
||||||
// Public methods
|
// Public methods
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gets the bookmarks associated to a user
|
* gets the bookmarks associated to a user
|
||||||
* @access public
|
* @access public
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function getBookmarks()
|
public function getBookmarks()
|
||||||
{
|
{
|
||||||
$this->BookmarkModel->addOrder("sort");
|
$this->BookmarkModel->addOrder("bookmark_id");
|
||||||
$bookmarks = $this->BookmarkModel->loadWhere(["uid"=>$this->uid]);
|
$bookmarks = $this->BookmarkModel->loadWhere(["uid"=>$this->uid]);
|
||||||
|
|
||||||
$bookmarks = $this->getDataOrTerminateWithError($bookmarks);
|
$bookmarks = $this->getDataOrTerminateWithError($bookmarks);
|
||||||
|
|
||||||
$this->terminateWithSuccess($bookmarks);
|
$this->terminateWithSuccess($bookmarks);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* deletes bookmark from associated user
|
* deletes bookmark from associated user
|
||||||
* @access public
|
* @access public
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function delete($bookmark_id)
|
public function delete($bookmark_id)
|
||||||
{
|
{
|
||||||
$bookmark = $this->BookmarkModel->load($bookmark_id);
|
$bookmark = $this->BookmarkModel->load($bookmark_id);
|
||||||
|
|
||||||
$bookmark = current($this->getDataOrTerminateWithError($bookmark));
|
$bookmark = current($this->getDataOrTerminateWithError($bookmark));
|
||||||
|
|
||||||
// only delete bookmark if the user is the owner of the bookmark
|
// only delete bookmark if the user is the owner of the bookmark
|
||||||
if ($bookmark->uid == $this->uid || $this->permissionlib->isBerechtigt('admin')) {
|
if($bookmark->uid == $this->uid || $this->permissionlib->isBerechtigt('admin')){
|
||||||
$delete_result = $this->BookmarkModel->delete($bookmark_id);
|
|
||||||
|
|
||||||
$delete_result = $this->getDataOrTerminateWithError($delete_result);
|
$delete_result = $this->BookmarkModel->delete($bookmark_id);
|
||||||
|
|
||||||
$this->terminateWithSuccess($delete_result);
|
$delete_result = $this->getDataOrTerminateWithError($delete_result);
|
||||||
} else {
|
|
||||||
$this->_outputAuthError(['delete' => ['admin:rw']]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
$this->terminateWithSuccess($delete_result);
|
||||||
* inserts new bookmark into the bookmark table
|
}else{
|
||||||
|
$this->_outputAuthError(['delete' => ['admin:rw']]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* inserts new bookmark into the bookmark table
|
||||||
* @access public
|
* @access public
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function insert()
|
public function insert()
|
||||||
{
|
{
|
||||||
// form validation
|
// form validation
|
||||||
$this->load->library('form_validation');
|
$this->load->library('form_validation');
|
||||||
$this->form_validation->set_rules('url', 'URL', 'required|valid_url|max_length[511]');
|
$this->form_validation->set_rules('url', 'URL', 'required|valid_url|max_length[511]');
|
||||||
$this->form_validation->set_rules('title', 'Title', 'required|max_length[255]');
|
$this->form_validation->set_rules('title', 'Title', 'required|max_length[255]');
|
||||||
if (!$this->form_validation->run())
|
if($this->form_validation->run() == FALSE) $this->terminateWithValidationErrors($this->form_validation->error_array());
|
||||||
$this->terminateWithValidationErrors($this->form_validation->error_array());
|
|
||||||
|
|
||||||
$url = $this->input->post('url', true);
|
$url = $this->input->post('url',true);
|
||||||
$title = $this->input->post('title', true);
|
$title = $this->input->post('title',true);
|
||||||
$tag = $this->input->post('tag', true);
|
$tag = $this->input->post('tag', true);
|
||||||
if (is_array($tag)) {
|
|
||||||
$tag = json_encode($tag); // convert PHP array to JSON string
|
|
||||||
}
|
|
||||||
$sort = $this->input->post('sort', true);
|
|
||||||
|
|
||||||
$insert_into_result = $this->BookmarkModel->insert([
|
$insert_into_result = $this->BookmarkModel->insert(['uid'=>$this->uid, 'url'=>$url, 'title'=>$title,'tag'=>$tag, 'insertvon'=>$this->uid, 'updateamum'=>NULL, 'updatevon'=>NULL]);
|
||||||
'uid' => $this->uid,
|
|
||||||
'url' => $url,
|
|
||||||
'title' => $title,
|
|
||||||
'tag' => $tag,
|
|
||||||
'insertvon' => $this->uid,
|
|
||||||
'updateamum' => null,
|
|
||||||
'updatevon' => null,
|
|
||||||
'sort' => $sort
|
|
||||||
]);
|
|
||||||
|
|
||||||
$insert_into_result = $this->getDataOrTerminateWithError($insert_into_result);
|
$insert_into_result = $this->getDataOrTerminateWithError($insert_into_result);
|
||||||
|
|
||||||
$this->terminateWithSuccess($insert_into_result);
|
$this->terminateWithSuccess($insert_into_result);
|
||||||
}
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* updates bookmark in the bookmark table
|
* updates bookmark in the bookmark table
|
||||||
* @access public
|
* @access public
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function update($bookmark_id)
|
public function update($bookmark_id)
|
||||||
{
|
{
|
||||||
// form validation
|
// form validation
|
||||||
$this->load->library('form_validation');
|
$this->load->library('form_validation');
|
||||||
$this->form_validation->set_rules('url', 'URL', 'required|valid_url|max_length[511]');
|
$this->form_validation->set_rules('url', 'URL', 'required|valid_url|max_length[511]');
|
||||||
$this->form_validation->set_rules('title', 'Title', 'required|max_length[255]');
|
$this->form_validation->set_rules('title', 'Title', 'required|max_length[255]');
|
||||||
if (!$this->form_validation->run())
|
if($this->form_validation->run() == FALSE) $this->terminateWithValidationErrors($this->form_validation->error_array());
|
||||||
$this->terminateWithValidationErrors($this->form_validation->error_array());
|
|
||||||
|
|
||||||
$url = $this->input->post('url', true);
|
$url = $this->input->post('url',true);
|
||||||
$title = $this->input->post('title', true);
|
$title = $this->input->post('title',true);
|
||||||
$tag = $this->input->post('tag', true);
|
|
||||||
if (is_array($tag)) {
|
|
||||||
$tag = json_encode($tag);
|
|
||||||
}
|
|
||||||
|
|
||||||
$now = new DateTime();
|
$now = new DateTime();
|
||||||
$now = $now->format('Y-m-d H:i:s');
|
$now = $now->format('Y-m-d H:i:s');
|
||||||
|
|
||||||
$update_result = $this->BookmarkModel->update($bookmark_id, [
|
$update_result = $this->BookmarkModel->update($bookmark_id,['url'=>$url, 'title'=>$title,'updateamum'=>$now]);
|
||||||
'url' => $url,
|
|
||||||
'title' => $title,
|
|
||||||
'tag' => $tag,
|
|
||||||
'updateamum' => $now
|
|
||||||
]);
|
|
||||||
|
|
||||||
$update_result = $this->getDataOrTerminateWithError($update_result);
|
$update_result = $this->getDataOrTerminateWithError($update_result);
|
||||||
|
|
||||||
$this->terminateWithSuccess($update_result);
|
$this->terminateWithSuccess($update_result);
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
}
|
||||||
* changes sort of two bookmarks in the bookmark table
|
|
||||||
* @access public
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function changeOrder($bookmark_id1, $bookmark_id2)
|
|
||||||
{
|
|
||||||
$update_result = [];
|
|
||||||
|
|
||||||
$result1 = $this->BookmarkModel->load($bookmark_id1);
|
|
||||||
$data1 = $this->getDataOrTerminateWithError($result1);
|
|
||||||
$sort1 = current($data1)->sort;
|
|
||||||
|
|
||||||
$result2 = $this->BookmarkModel->load(["bookmark_id"=>$bookmark_id2]);
|
|
||||||
$data2 = $this->getDataOrTerminateWithError($result2);
|
|
||||||
$sort2 = current($data2)->sort;
|
|
||||||
|
|
||||||
$update_result1 = $this->BookmarkModel->update($bookmark_id1, [
|
|
||||||
'sort' => $sort2
|
|
||||||
]);
|
|
||||||
$update_result[] = $this->getDataOrTerminateWithError($update_result1);
|
|
||||||
|
|
||||||
$update_result2 = $this->BookmarkModel->update($bookmark_id2, [
|
|
||||||
'sort' => $sort1
|
|
||||||
]);
|
|
||||||
$update_result[] = $this->getDataOrTerminateWithError($update_result2);
|
|
||||||
|
|
||||||
$this->terminateWithSuccess($update_result);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ class Cis4FhcApi extends FHCAPI_Controller
|
|||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
parent::__construct([
|
parent::__construct([
|
||||||
'dashboardViewData' => self::PERM_LOGGED,
|
'getViewData' => self::PERM_LOGGED,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -36,22 +36,17 @@ class Cis4FhcApi extends FHCAPI_Controller
|
|||||||
// Public methods
|
// Public methods
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* retrieves view data for dashboard view
|
* fetches ViewData
|
||||||
* @access public
|
*/
|
||||||
* @param $uid the userID for which profile is being viewed, null or missing value implies one's own profile
|
public function getViewData()
|
||||||
*/
|
|
||||||
public function dashboardViewData()
|
|
||||||
{
|
{
|
||||||
$this->load->model('person/Person_model','PersonModel');
|
$this->load->model('person/Person_model','PersonModel');
|
||||||
$personData = getData($this->PersonModel->getByUid(getAuthUID()))[0];
|
$personData = getData($this->PersonModel->getByUid(getAuthUID()))[0];
|
||||||
|
|
||||||
$this->load->config('calendar');
|
|
||||||
|
|
||||||
$viewData = array(
|
$viewData = array(
|
||||||
'uid' => getAuthUID(),
|
'uid' => getAuthUID(),
|
||||||
'name' => $personData->vorname,
|
'name' => $personData->vorname,
|
||||||
'person_id' => $personData->person_id,
|
'person_id' => $personData->person_id
|
||||||
'timezone' => $this->config->item('timezone'),
|
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->terminateWithSuccess($viewData);
|
$this->terminateWithSuccess($viewData);
|
||||||
|
|||||||
@@ -16,13 +16,12 @@
|
|||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!defined('BASEPATH'))
|
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
exit('No direct script access allowed');
|
|
||||||
|
|
||||||
|
|
||||||
class CisMenu extends FHCAPI_Controller
|
class CisMenu extends FHCAPI_Controller
|
||||||
{
|
{
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Object initialization
|
* Object initialization
|
||||||
*/
|
*/
|
||||||
@@ -32,95 +31,28 @@ class CisMenu extends FHCAPI_Controller
|
|||||||
'getMenu' => self::PERM_LOGGED,
|
'getMenu' => self::PERM_LOGGED,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------------------------------
|
||||||
// Public methods
|
// Public methods
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fetches the menu for CIS from the database based on the userLanguage
|
* fetches the menu for CIS from the database based on the userLanguage
|
||||||
*/
|
*/
|
||||||
public function getMenu()
|
public function getMenu()
|
||||||
{
|
{
|
||||||
$this->load->model('content/Content_model', 'ContentModel');
|
$this->load->model('content/Content_model', 'ContentModel');
|
||||||
$this->load->config('cis');
|
$this->load->config('cis');
|
||||||
$cis4_content_id = $this->config->item('cis_menu_root_content_id');
|
$cis4_content_id =$this->config->item('cis_menu_root_content_id');
|
||||||
$result = $this->ContentModel->getMenu($cis4_content_id, getAuthUID(), getUserLanguage());
|
$result = $this->ContentModel->getMenu($cis4_content_id, getAuthUID(),getUserLanguage());
|
||||||
$result = $this->getDataOrTerminateWithError($result);
|
$result = $this->getDataOrTerminateWithError($result);
|
||||||
$menu = $result->childs ?? [];
|
$menu = $result->childs ?? [];
|
||||||
|
|
||||||
$menu = $this->generateUrlsForMenuItems($menu);
|
|
||||||
$this->terminateWithSuccess($menu);
|
$this->terminateWithSuccess($menu);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function generateUrlsForMenuItems($menuItems)
|
|
||||||
{
|
|
||||||
return array_map(
|
|
||||||
function ($menuItem) {
|
|
||||||
return $this->generateUrlForMenuItem($menuItem);
|
|
||||||
},
|
|
||||||
$menuItems
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
private function generateUrlForMenuItem($menuItem)
|
|
||||||
{
|
|
||||||
$menuItem->url = $this->menuItemUrlHelper($menuItem);
|
|
||||||
unset($menuItem->content);
|
|
||||||
|
|
||||||
if ($menuItem->childs && count($menuItem->childs)) {
|
|
||||||
$menuItem->childs = $this->generateUrlsForMenuItems($menuItem->childs);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $menuItem;
|
|
||||||
}
|
|
||||||
|
|
||||||
private function menuItemUrlHelper($menuItem)
|
|
||||||
{
|
|
||||||
if ($menuItem->template_kurzbz !== 'redirect') {
|
|
||||||
return site_url("/CisVue/Cms/content/" . $menuItem->content_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$menuItem->content || !mb_strlen($menuItem->content)) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
$doc = new DOMDocument();
|
|
||||||
$doc->loadXML($menuItem->content);
|
|
||||||
$urlElem = $doc->getElementsByTagName('url')->item(0);
|
|
||||||
|
|
||||||
if (!$urlElem) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
$url = $urlElem->textContent;
|
|
||||||
|
|
||||||
if (strpos($url, '../cms/news.php') !== false) {
|
|
||||||
$newsRegex = '/^\.\.\/cms\/news\.php/';
|
|
||||||
$url = preg_replace($newsRegex, site_url("/CisVue/Cms/news"), $url);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strpos($url, '../cms/content.php?') !== false) {
|
|
||||||
$contentRegex = '/^\.\.\/cms\/content\.php\?content_id=([0-9]+)/';
|
|
||||||
$matches = [];
|
|
||||||
preg_match($contentRegex, $url, $matches);
|
|
||||||
$url = site_url('/CisVue/Cms/content/' . $matches[1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strpos($url, '../index.ci.php') !== false) {
|
|
||||||
$indexRegex = '/^\.\.\/index\.ci\.php/';
|
|
||||||
$url = preg_replace($indexRegex, site_url(), $url);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strpos($url, '../') !== false) {
|
|
||||||
$relativeRegex = '/^\.\.\//';
|
|
||||||
$url = preg_replace($relativeRegex, base_url(), $url);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $url;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,8 +16,7 @@
|
|||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!defined('BASEPATH'))
|
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
exit('No direct script access allowed');
|
|
||||||
|
|
||||||
use CI3_Events as Events;
|
use CI3_Events as Events;
|
||||||
use \DateTime as DateTime;
|
use \DateTime as DateTime;
|
||||||
@@ -34,25 +33,19 @@ class LvPlan extends FHCAPI_Controller
|
|||||||
|
|
||||||
parent::__construct([
|
parent::__construct([
|
||||||
'getRoomplan' => self::PERM_LOGGED,
|
'getRoomplan' => self::PERM_LOGGED,
|
||||||
'Stunden' => self::PERM_LOGGED,
|
'Stunden' => self::PERM_LOGGED,
|
||||||
'getReservierungen' => self::PERM_LOGGED,
|
'getReservierungen' => self::PERM_LOGGED,
|
||||||
'LvPlanEvents' => self::PERM_LOGGED,
|
'LvPlanEvents' => self::PERM_LOGGED,
|
||||||
'eventsPersonal' => self::PERM_LOGGED,
|
'eventsPersonal' => self::PERM_LOGGED,
|
||||||
'eventsLv' => self::PERM_LOGGED,
|
'eventsLv' => self::PERM_LOGGED,
|
||||||
'getLehreinheitStudiensemester' => self::PERM_LOGGED,
|
'getLehreinheitStudiensemester' => self::PERM_LOGGED,
|
||||||
'studiensemesterDateInterval' => self::PERM_LOGGED,
|
'studiensemesterDateInterval' => self::PERM_LOGGED,
|
||||||
'getLvPlanForStudiensemester' => self::PERM_LOGGED,
|
'getLvPlanForStudiensemester' => self::PERM_LOGGED,
|
||||||
'getLv' => self::PERM_LOGGED,
|
'getLv' => self::PERM_LOGGED
|
||||||
'eventsStgOrg' => self::PERM_LOGGED,
|
|
||||||
'fetchFerienEvents' => self::PERM_LOGGED,
|
|
||||||
'getStudiengaenge' => self::PERM_LOGGED,
|
|
||||||
'getLehrverband' => self::PERM_LOGGED,
|
|
||||||
'permissionOtherLvPlan' => self::PERM_LOGGED,
|
|
||||||
'compactibleEventTypes' => self::PERM_LOGGED,
|
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$this->load->library('LogLib');
|
$this->load->library('LogLib');
|
||||||
$this->loglib->setConfigs(array(
|
$this->loglib->setConfigs(array(
|
||||||
'classIndex' => 5,
|
'classIndex' => 5,
|
||||||
'functionIndex' => 5,
|
'functionIndex' => 5,
|
||||||
'lineIndex' => 4,
|
'lineIndex' => 4,
|
||||||
@@ -60,17 +53,17 @@ class LvPlan extends FHCAPI_Controller
|
|||||||
'dbExecuteUser' => 'RESTful API'
|
'dbExecuteUser' => 'RESTful API'
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->load->library('form_validation');
|
$this->load->library('form_validation');
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------------------------------
|
||||||
// Public methods
|
// Public methods
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fetches LvPlan and Moodle events together
|
* fetches LvPlan and Moodle events together
|
||||||
* @access public
|
* @access public
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public function LvPlanEvents()
|
public function LvPlanEvents()
|
||||||
{
|
{
|
||||||
$hasLv = $this->input->post('lv_id');
|
$hasLv = $this->input->post('lv_id');
|
||||||
@@ -90,30 +83,24 @@ class LvPlan extends FHCAPI_Controller
|
|||||||
// form validation
|
// form validation
|
||||||
$this->form_validation->set_rules('start_date', "start_date", "required");
|
$this->form_validation->set_rules('start_date', "start_date", "required");
|
||||||
$this->form_validation->set_rules('end_date', "end_date", "required");
|
$this->form_validation->set_rules('end_date', "end_date", "required");
|
||||||
|
|
||||||
if (!$this->form_validation->run())
|
if (!$this->form_validation->run())
|
||||||
$this->terminateWithValidationErrors($this->form_validation->error_array());
|
$this->terminateWithValidationErrors($this->form_validation->error_array());
|
||||||
|
|
||||||
// storing the post parameter in local variables
|
// storing the post parameter in local variables
|
||||||
$start_date = $this->input->post('start_date', true);
|
$start_date = $this->input->post('start_date', true);
|
||||||
$end_date = $this->input->post('end_date', true);
|
$end_date = $this->input->post('end_date', true);
|
||||||
$uid = $this->input->post('uid', true);
|
|
||||||
|
|
||||||
// disallow accessing other user's lv plan if missing permission
|
|
||||||
if ($uid && $uid !== getAuthUID() && !$this->permissionlib->isBerechtigt('basis/other_lv_plan')) {
|
|
||||||
$this->terminateWithError("Missing permission to view other users' timetables!");
|
|
||||||
}
|
|
||||||
|
|
||||||
// fetching lvplan events
|
// fetching lvplan events
|
||||||
$result = $this->stundenplanlib->getEventsUser($start_date, $end_date, $uid);
|
$result = $this->stundenplanlib->getEventsUser($start_date, $end_date);
|
||||||
$lvplanEvents = $this->getDataOrTerminateWithError($result);
|
$lvplanEvents = $this->getDataOrTerminateWithError($result);
|
||||||
|
|
||||||
// fetching moodle events
|
// fetching moodle events
|
||||||
$moodleEvents = $uid ? [] : $this->fetchMoodleEvents($start_date, $end_date);
|
$moodleEvents = $this->fetchMoodleEvents($start_date, $end_date);
|
||||||
|
|
||||||
// fetching ferien events
|
// fetching ferien events
|
||||||
$ferienEvents = $this->fetchFerienEvents($start_date, $end_date, $uid);
|
$ferienEvents = $this->fetchFerienEvents($start_date, $end_date);
|
||||||
|
|
||||||
|
|
||||||
$this->terminateWithSuccess(array_merge(
|
$this->terminateWithSuccess(array_merge(
|
||||||
$lvplanEvents,
|
$lvplanEvents,
|
||||||
@@ -122,45 +109,6 @@ class LvPlan extends FHCAPI_Controller
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* fetches LvPlan for studiengang / semester / verband / gruppe
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*/
|
|
||||||
public function eventsStgOrg()
|
|
||||||
{
|
|
||||||
$this->load->library('StundenplanLib');
|
|
||||||
|
|
||||||
// form validation
|
|
||||||
$this->form_validation->set_rules('start_date', "start_date", "required");
|
|
||||||
$this->form_validation->set_rules('end_date', "end_date", "required");
|
|
||||||
//$this->form_validation->set_rules('stg_kz', "stg_kz", "required"); //no validation show empty calendar
|
|
||||||
|
|
||||||
if (!$this->form_validation->run()) {
|
|
||||||
$this->terminateWithValidationErrors($this->form_validation->error_array());
|
|
||||||
$stgOrgEvents = [];
|
|
||||||
$ferienEvents = [];
|
|
||||||
} else {
|
|
||||||
$start_date = $this->input->post('start_date', true);
|
|
||||||
$end_date = $this->input->post('end_date', true);
|
|
||||||
$stg_kz = $this->input->post('stg_kz', true);
|
|
||||||
$sem = $this->input->post('sem', true);
|
|
||||||
$verband = $this->input->post('verband', true);
|
|
||||||
$gruppe = $this->input->post('gruppe', true);
|
|
||||||
|
|
||||||
$result = $this->stundenplanlib->getEventsStgOrg($start_date, $end_date, $stg_kz, $sem, $verband, $gruppe);
|
|
||||||
$stgOrgEvents = $this->getDataOrTerminateWithError($result);
|
|
||||||
|
|
||||||
$result = $this->stundenplanlib->fetchFerienTageEvents($start_date, $end_date, $stg_kz);
|
|
||||||
$ferienEvents = $this->getDataOrTerminateWithError($result);
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->terminateWithSuccess(array_merge(
|
|
||||||
$stgOrgEvents,
|
|
||||||
$ferienEvents
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fetches LvPlan and Ferien events together for the lv
|
* fetches LvPlan and Ferien events together for the lv
|
||||||
*
|
*
|
||||||
@@ -174,7 +122,7 @@ class LvPlan extends FHCAPI_Controller
|
|||||||
$this->form_validation->set_rules('start_date', "start_date", "required");
|
$this->form_validation->set_rules('start_date', "start_date", "required");
|
||||||
$this->form_validation->set_rules('end_date', "end_date", "required");
|
$this->form_validation->set_rules('end_date', "end_date", "required");
|
||||||
$this->form_validation->set_rules('lv_id', "lv_id", "required|integer");
|
$this->form_validation->set_rules('lv_id', "lv_id", "required|integer");
|
||||||
|
|
||||||
if (!$this->form_validation->run())
|
if (!$this->form_validation->run())
|
||||||
$this->terminateWithValidationErrors($this->form_validation->error_array());
|
$this->terminateWithValidationErrors($this->form_validation->error_array());
|
||||||
|
|
||||||
@@ -189,6 +137,7 @@ class LvPlan extends FHCAPI_Controller
|
|||||||
|
|
||||||
// fetching ferien events
|
// fetching ferien events
|
||||||
$ferienEvents = $this->fetchFerienEvents($start_date, $end_date);
|
$ferienEvents = $this->fetchFerienEvents($start_date, $end_date);
|
||||||
|
|
||||||
|
|
||||||
$this->terminateWithSuccess(array_merge(
|
$this->terminateWithSuccess(array_merge(
|
||||||
$lvplanEvents,
|
$lvplanEvents,
|
||||||
@@ -197,42 +146,40 @@ class LvPlan extends FHCAPI_Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
//TODO: delete this function if we don't use the old calendar export endpoints anymore
|
//TODO: delete this function if we don't use the old calendar export endpoints anymore
|
||||||
public function studiensemesterDateInterval($date)
|
public function studiensemesterDateInterval($date){
|
||||||
{
|
$this->load->model('organisation/Studiensemester_model','StudiensemesterModel');
|
||||||
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
$studiensemester =$this->StudiensemesterModel->getByDate(date_format(date_create($date),'Y-m-d'));
|
||||||
$studiensemester = $this->StudiensemesterModel->getByDate(date_format(date_create($date), 'Y-m-d'));
|
$studiensemester =current($this->getDataOrTerminateWithError($studiensemester));
|
||||||
$studiensemester = current($this->getDataOrTerminateWithError($studiensemester));
|
|
||||||
$this->terminateWithSuccess($studiensemester);
|
$this->terminateWithSuccess($studiensemester);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getLvPlanForStudiensemester($studiensemester, $lvid)
|
public function getLvPlanForStudiensemester($studiensemester,$lvid){
|
||||||
{
|
|
||||||
$this->load->library('StundenplanLib');
|
$this->load->library('StundenplanLib');
|
||||||
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
$this->load->model('organisation/Studiensemester_model','StudiensemesterModel');
|
||||||
|
|
||||||
$studiensemester_result = $this->StudiensemesterModel->loadWhere(["studiensemester_kurzbz" => $studiensemester]);
|
$studiensemester_result = $this->StudiensemesterModel->loadWhere(["studiensemester_kurzbz"=>$studiensemester]);
|
||||||
$studiensemester_result = current($this->getDataOrTerminateWithError($studiensemester_result));
|
$studiensemester_result = current($this->getDataOrTerminateWithError($studiensemester_result));
|
||||||
$timespan_start = new DateTime($studiensemester_result->start);
|
$timespan_start = new DateTime($studiensemester_result->start);
|
||||||
$timespan_ende = new DateTime($studiensemester_result->ende);
|
$timespan_ende = new DateTime($studiensemester_result->ende);
|
||||||
$lvplan = $this->stundenplanlib->getStundenplan(date_format($timespan_start, 'Y-m-d'), date_format($timespan_ende, 'Y-m-d'), $lvid);
|
$lvplan = $this->stundenplanlib->getStundenplan(date_format($timespan_start, 'Y-m-d'),date_format($timespan_ende, 'Y-m-d'), $lvid);
|
||||||
$this->terminateWithSuccess($lvplan);
|
$this->terminateWithSuccess($lvplan);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
/**
|
* fetches Stunden layout from database
|
||||||
* fetches Stunden layout from database
|
* @access public
|
||||||
* @access public
|
*
|
||||||
*
|
*/
|
||||||
*/
|
public function Stunden()
|
||||||
public function Stunden()
|
|
||||||
{
|
{
|
||||||
$this->load->model('ressource/Stunde_model', 'StundeModel');
|
$this->load->model('ressource/Stunde_model', 'StundeModel');
|
||||||
|
|
||||||
$this->StundeModel->addOrder('stunde', 'ASC');
|
$this->StundeModel->addOrder('stunde', 'ASC');
|
||||||
$stunden = $this->StundeModel->load();
|
$stunden = $this->StundeModel->load();
|
||||||
|
|
||||||
$stunden = $this->getDataOrTerminateWithError($stunden);
|
$stunden = $this->getDataOrTerminateWithError($stunden);
|
||||||
|
|
||||||
$this->terminateWithSuccess($stunden);
|
$this->terminateWithSuccess($stunden);
|
||||||
}
|
}
|
||||||
@@ -263,10 +210,10 @@ class LvPlan extends FHCAPI_Controller
|
|||||||
$roomplan_data = $this->stundenplanlib->getRoomplan($ort_kurzbz, $start_date, $end_date);
|
$roomplan_data = $this->stundenplanlib->getRoomplan($ort_kurzbz, $start_date, $end_date);
|
||||||
|
|
||||||
$roomplan_data = $this->getDataOrTerminateWithError($roomplan_data);
|
$roomplan_data = $this->getDataOrTerminateWithError($roomplan_data);
|
||||||
|
|
||||||
$this->terminateWithSuccess($roomplan_data);
|
$this->terminateWithSuccess($roomplan_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gets the reservierungen of a room if the ort_kurzbz parameter is
|
* gets the reservierungen of a room if the ort_kurzbz parameter is
|
||||||
* supplied otherwise gets the reservierungen of the lvplan of a student
|
* supplied otherwise gets the reservierungen of the lvplan of a student
|
||||||
@@ -279,27 +226,25 @@ class LvPlan extends FHCAPI_Controller
|
|||||||
{
|
{
|
||||||
$this->form_validation->set_rules('start_date', "StartDate", "required");
|
$this->form_validation->set_rules('start_date', "StartDate", "required");
|
||||||
$this->form_validation->set_rules('end_date', "EndDate", "required");
|
$this->form_validation->set_rules('end_date', "EndDate", "required");
|
||||||
|
|
||||||
if (!$this->form_validation->run())
|
if (!$this->form_validation->run())
|
||||||
$this->terminateWithValidationErrors($this->form_validation->error_array());
|
$this->terminateWithValidationErrors($this->form_validation->error_array());
|
||||||
|
|
||||||
// storing the post parameter in local variables
|
// storing the post parameter in local variables
|
||||||
$start_date = $this->input->post('start_date', true);
|
$start_date = $this->input->post('start_date', true);
|
||||||
$end_date = $this->input->post('end_date', true);
|
$end_date = $this->input->post('end_date', true);
|
||||||
$uid = $this->input->post('uid', true);
|
|
||||||
|
|
||||||
// get data
|
// get data
|
||||||
$this->load->library('StundenplanLib');
|
$this->load->library('StundenplanLib');
|
||||||
|
|
||||||
$result = $this->stundenplanlib->getReservierungen($start_date, $end_date, $ort_kurzbz, $uid);
|
$result = $this->stundenplanlib->getReservierungen($start_date, $end_date, $ort_kurzbz);
|
||||||
|
|
||||||
$result = $this->getDataOrTerminateWithError($result);
|
$result = $this->getDataOrTerminateWithError($result);
|
||||||
|
|
||||||
$this->terminateWithSuccess($result);
|
$this->terminateWithSuccess($result);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getLehreinheitStudiensemester($lehreinheit_id)
|
public function getLehreinheitStudiensemester($lehreinheit_id){
|
||||||
{
|
|
||||||
$this->load->model('education/Lehreinheit_model', 'LehreinheitModel');
|
$this->load->model('education/Lehreinheit_model', 'LehreinheitModel');
|
||||||
$this->LehreinheitModel->addSelect(["studiensemester_kurzbz"]);
|
$this->LehreinheitModel->addSelect(["studiensemester_kurzbz"]);
|
||||||
$result = $this->LehreinheitModel->load($lehreinheit_id);
|
$result = $this->LehreinheitModel->load($lehreinheit_id);
|
||||||
@@ -342,68 +287,6 @@ class LvPlan extends FHCAPI_Controller
|
|||||||
return $this->terminateWithSuccess(current($result));
|
return $this->terminateWithSuccess(current($result));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getStudiengaenge()
|
|
||||||
{
|
|
||||||
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
|
|
||||||
|
|
||||||
$this->StudiengangModel->addOrder('typ');
|
|
||||||
$this->StudiengangModel->addOrder('kurzbz');
|
|
||||||
$result = $this->StudiengangModel->loadWhere([
|
|
||||||
'aktiv' => true
|
|
||||||
]);
|
|
||||||
|
|
||||||
$data = $this->getDataOrTerminateWithError($result);
|
|
||||||
|
|
||||||
return $this->terminateWithSuccess($data);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getLehrverband($studiengang_kz, $semester = null, $verband = null)
|
|
||||||
{
|
|
||||||
$this->load->model('organisation/Lehrverband_model', 'LehrverbandModel');
|
|
||||||
|
|
||||||
$where = [
|
|
||||||
'aktiv' => true,
|
|
||||||
'studiengang_kz' => $studiengang_kz,
|
|
||||||
];
|
|
||||||
|
|
||||||
if ($semester !== null && $semester !== 'null' && $semester !== 'undefined') {
|
|
||||||
$where['semester'] = $semester;
|
|
||||||
}
|
|
||||||
if ($verband !== null && $verband !== 'null' && $verband !== 'undefined') {
|
|
||||||
$where['verband'] = $verband;
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->LehrverbandModel->addOrder('studiengang_kz');
|
|
||||||
$this->LehrverbandModel->addOrder('semester');
|
|
||||||
$this->LehrverbandModel->addOrder('verband');
|
|
||||||
$this->LehrverbandModel->addOrder('gruppe');
|
|
||||||
$result = $this->LehrverbandModel->loadWhere($where);
|
|
||||||
|
|
||||||
$data = $this->getDataOrTerminateWithError($result);
|
|
||||||
|
|
||||||
return $this->terminateWithSuccess($data);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if the current user has permission to view other users' timetables
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function permissionOtherLvPlan()
|
|
||||||
{
|
|
||||||
$this->terminateWithSuccess($this->permissionlib->isBerechtigt('basis/other_lv_plan'));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* get event types which can be compacted in lv plan display
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function compactibleEventTypes()
|
|
||||||
{
|
|
||||||
$this->terminateWithSuccess(["lehreinheit", "reservierung"]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fetch moodle events
|
* fetch moodle events
|
||||||
*
|
*
|
||||||
@@ -416,19 +299,19 @@ class LvPlan extends FHCAPI_Controller
|
|||||||
$this->load->config('calendar');
|
$this->load->config('calendar');
|
||||||
|
|
||||||
$tz = new DateTimeZone($this->config->item('timezone'));
|
$tz = new DateTimeZone($this->config->item('timezone'));
|
||||||
|
|
||||||
$start = new DateTime($start_date);
|
$start = new DateTime($start_date);
|
||||||
$start->setTimezone($tz);
|
$start->setTimezone($tz);
|
||||||
|
|
||||||
$end = new DateTime($end_date);
|
$end = new DateTime($end_date);
|
||||||
$end->setTimezone($tz);
|
$end->setTimezone($tz);
|
||||||
$end->modify('+1 day -1 second');
|
$end->modify('+1 day -1 second');
|
||||||
|
|
||||||
$moodle_events = [];
|
$moodle_events = [];
|
||||||
|
|
||||||
Events::trigger(
|
Events::trigger(
|
||||||
'moodleCalendarEvents',
|
'moodleCalendarEvents',
|
||||||
function &() use (&$moodle_events) {
|
function & () use (&$moodle_events) {
|
||||||
return $moodle_events;
|
return $moodle_events;
|
||||||
},
|
},
|
||||||
[
|
[
|
||||||
@@ -448,23 +331,23 @@ class LvPlan extends FHCAPI_Controller
|
|||||||
* @param string $end_date
|
* @param string $end_date
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
private function fetchFerienEvents($start_date, $end_date, $uid = null)
|
private function fetchFerienEvents($start_date, $end_date)
|
||||||
{
|
{
|
||||||
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||||
$this->load->model('education/Studentlehrverband_model', 'StudentLehrverbandModel');
|
$this->load->model('education/Studentlehrverband_model', 'StudentLehrverbandModel');
|
||||||
|
|
||||||
$currentStudiensemester = $this->StudiensemesterModel->getByDate($start_date);
|
$currentStudiensemester = $this->StudiensemesterModel->getByDate($start_date);
|
||||||
$currentStudiensemester = $this->getDataOrTerminateWithError($currentStudiensemester);
|
$currentStudiensemester = $this->getDataOrTerminateWithError($currentStudiensemester);
|
||||||
|
|
||||||
if ($currentStudiensemester) {
|
if ($currentStudiensemester) {
|
||||||
$studentsemester_kurzbz = current($currentStudiensemester)->studiensemester_kurzbz;
|
$studentsemester_kurzbz = current($currentStudiensemester)->studiensemester_kurzbz;
|
||||||
|
|
||||||
$studiengang = $this->StudentLehrverbandModel->loadWhere([
|
$studiengang = $this->StudentLehrverbandModel->loadWhere([
|
||||||
"student_uid" => $uid ?? getAuthUID(),
|
"student_uid" => getAuthUID(),
|
||||||
"studiensemester_kurzbz" => $studentsemester_kurzbz
|
"studiensemester_kurzbz" => $studentsemester_kurzbz
|
||||||
]);
|
]);
|
||||||
$studiengang = $this->getDataOrTerminateWithError($studiengang);
|
$studiengang = $this->getDataOrTerminateWithError($studiengang);
|
||||||
|
|
||||||
if ($studiengang)
|
if ($studiengang)
|
||||||
$studiengang_kz = current($studiengang)->studiengang_kz;
|
$studiengang_kz = current($studiengang)->studiengang_kz;
|
||||||
else
|
else
|
||||||
@@ -474,7 +357,7 @@ class LvPlan extends FHCAPI_Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
$ferienEvents = $this->stundenplanlib->fetchFerienTageEvents($start_date, $end_date, $studiengang_kz);
|
$ferienEvents = $this->stundenplanlib->fetchFerienTageEvents($start_date, $end_date, $studiengang_kz);
|
||||||
|
|
||||||
return $this->getDataOrTerminateWithError($ferienEvents);
|
return $this->getDataOrTerminateWithError($ferienEvents);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,76 +0,0 @@
|
|||||||
<?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');
|
|
||||||
|
|
||||||
class OtherLvPlan extends FHCAPI_Controller
|
|
||||||
{
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Object initialization
|
|
||||||
*/
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
parent::__construct([
|
|
||||||
'otherLvPlanViewData' => ['basis/other_lv_plan:r'],
|
|
||||||
]);
|
|
||||||
|
|
||||||
$this->load->model('ressource/mitarbeiter_model', 'MitarbeiterModel');
|
|
||||||
$this->load->model('person/Benutzer_model', 'BenutzerModel');
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------------------------------
|
|
||||||
// Public methods
|
|
||||||
|
|
||||||
/**
|
|
||||||
* retrieves viewData for other lv plan view
|
|
||||||
* @access public
|
|
||||||
* @param $uid the userID for which the other lv plan is being viewed
|
|
||||||
*/
|
|
||||||
public function otherLvPlanViewData($uid)
|
|
||||||
{
|
|
||||||
$isMitarbeiterResult = $this->MitarbeiterModel->isMitarbeiter($uid);
|
|
||||||
$isMitarbeiter = getData($isMitarbeiterResult);
|
|
||||||
$isStudent = !$isMitarbeiter;
|
|
||||||
|
|
||||||
$this->BenutzerModel->addSelect(["foto", "vorname", "nachname"]);
|
|
||||||
$this->BenutzerModel->addJoin("tbl_person", "person_id");
|
|
||||||
$personResult = $this->BenutzerModel->load([$uid]);
|
|
||||||
$person = hasData($personResult) ? getData($personResult) : null;
|
|
||||||
|
|
||||||
$viewData = [
|
|
||||||
"user_data" => [
|
|
||||||
"username" => $uid,
|
|
||||||
"is_student" => $isStudent,
|
|
||||||
"is_mitarbeiter" => $isMitarbeiter,
|
|
||||||
"foto" => $person[0]->foto,
|
|
||||||
"vorname" => $person[0]->vorname,
|
|
||||||
"nachname" => $person[0]->nachname,
|
|
||||||
],
|
|
||||||
];
|
|
||||||
|
|
||||||
$this->terminateWithSuccess($viewData);
|
|
||||||
}
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------------------------------------------
|
|
||||||
// Private methods
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -16,8 +16,7 @@
|
|||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!defined('BASEPATH'))
|
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
exit('No direct script access allowed');
|
|
||||||
|
|
||||||
class Profil extends FHCAPI_Controller
|
class Profil extends FHCAPI_Controller
|
||||||
{
|
{
|
||||||
@@ -28,13 +27,13 @@ class Profil extends FHCAPI_Controller
|
|||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
parent::__construct([
|
parent::__construct([
|
||||||
'fotoSperre' => self::PERM_LOGGED,
|
'fotoSperre' => self::PERM_LOGGED,
|
||||||
'getGemeinden' => self::PERM_LOGGED,
|
'getGemeinden' => self::PERM_LOGGED,
|
||||||
'getAllNationen' => self::PERM_LOGGED,
|
'getAllNationen' => self::PERM_LOGGED,
|
||||||
'isMitarbeiter' => self::PERM_LOGGED,
|
'isMitarbeiter' => self::PERM_LOGGED,
|
||||||
'profilViewData' => self::PERM_LOGGED,
|
'profilViewData' => self::PERM_LOGGED,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$this->load->library('PermissionLib');
|
$this->load->library('PermissionLib');
|
||||||
|
|
||||||
$this->load->model('ressource/mitarbeiter_model', 'MitarbeiterModel');
|
$this->load->model('ressource/mitarbeiter_model', 'MitarbeiterModel');
|
||||||
@@ -49,37 +48,28 @@ class Profil extends FHCAPI_Controller
|
|||||||
|
|
||||||
//------------------------------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------------------------------
|
||||||
// Public methods
|
// Public methods
|
||||||
|
public function profilViewData($uid=null){
|
||||||
/**
|
|
||||||
* retrieves view data for profile view
|
|
||||||
* @access public
|
|
||||||
* @param $uid the userID for which profile is being viewed, null or missing value implies one's own profile
|
|
||||||
*/
|
|
||||||
public function profilViewData($uid = null)
|
|
||||||
{
|
|
||||||
$authUid = getAuthUID();
|
|
||||||
$isProfilOfAuthUser = !$uid || $uid === $authUid;
|
|
||||||
|
|
||||||
$this->load->library('ProfilLib');
|
$this->load->library('ProfilLib');
|
||||||
$profileData = $this->profillib->getView($uid ?? $authUid);
|
$editable = false;
|
||||||
$profileData = hasData($profileData) ? getData($profileData) : null;
|
if(isset($uid) && $uid != null){
|
||||||
|
$profil_data = $this->profillib->getView($uid);
|
||||||
$viewData = [
|
if($uid == getAuthUID()){
|
||||||
'editable' => $isProfilOfAuthUser,
|
$editable = true;
|
||||||
'profil_data' => $profileData,
|
}
|
||||||
'permissions' => [
|
}else{
|
||||||
'basis/other_lv_plan' => $this->permissionlib->isBerechtigt(('basis/other_lv_plan'))
|
$editable = true;
|
||||||
]
|
$profil_data = $this->profillib->getView(getAuthUID());
|
||||||
];
|
|
||||||
|
|
||||||
if ($isProfilOfAuthUser) {
|
|
||||||
$viewData['calendar_sync_urls'] = $this->getCalendarSyncUrlData();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$profil_data = hasData($profil_data) ? getData($profil_data) : null;
|
||||||
|
$viewData = array(
|
||||||
|
'editable'=>$editable,
|
||||||
|
'profil_data' => $profil_data,
|
||||||
|
);
|
||||||
$this->terminateWithSuccess($viewData);
|
$this->terminateWithSuccess($viewData);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* update column foto_sperre in public.tbl_person
|
* update column foto_sperre in public.tbl_person
|
||||||
* @access public
|
* @access public
|
||||||
* @param boolean $value new value for the column
|
* @param boolean $value new value for the column
|
||||||
@@ -87,9 +77,9 @@ class Profil extends FHCAPI_Controller
|
|||||||
*/
|
*/
|
||||||
public function fotoSperre($value)
|
public function fotoSperre($value)
|
||||||
{
|
{
|
||||||
if (!isset($value)) {
|
if(!isset($value)){
|
||||||
$this->terminateWithError("Missing parameter", self::ERROR_TYPE_GENERAL);
|
$this->terminateWithError("Missing parameter", self::ERROR_TYPE_GENERAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
$res = $this->PersonModel->update($this->pid, ["foto_sperre" => $value]);
|
$res = $this->PersonModel->update($this->pid, ["foto_sperre" => $value]);
|
||||||
if (isError($res)) {
|
if (isError($res)) {
|
||||||
@@ -97,10 +87,10 @@ class Profil extends FHCAPI_Controller
|
|||||||
}
|
}
|
||||||
$this->PersonModel->addSelect("foto_sperre");
|
$this->PersonModel->addSelect("foto_sperre");
|
||||||
$res = $this->PersonModel->load($this->pid);
|
$res = $this->PersonModel->load($this->pid);
|
||||||
|
|
||||||
$res = $this->getDataOrTerminateWithError($res);
|
$res = $this->getDataOrTerminateWithError($res);
|
||||||
|
|
||||||
$this->terminateWithSuccess(current($res));
|
$this->terminateWithSuccess(current($res));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -119,7 +109,7 @@ class Profil extends FHCAPI_Controller
|
|||||||
if (isError($nation_res)) {
|
if (isError($nation_res)) {
|
||||||
$this->terminateWithError("error while trying to query table codex.tbl_nation", self::ERROR_TYPE_GENERAL);
|
$this->terminateWithError("error while trying to query table codex.tbl_nation", self::ERROR_TYPE_GENERAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
$nation_res = $this->getDataOrTerminateWithError($nation_res);
|
$nation_res = $this->getDataOrTerminateWithError($nation_res);
|
||||||
|
|
||||||
$this->terminateWithSuccess($nation_res);
|
$this->terminateWithSuccess($nation_res);
|
||||||
@@ -127,30 +117,30 @@ class Profil extends FHCAPI_Controller
|
|||||||
|
|
||||||
public function getGemeinden($nation, $zip)
|
public function getGemeinden($nation, $zip)
|
||||||
{
|
{
|
||||||
if (!isset($nation) || !isset($zip)) {
|
if(!isset($nation) || !isset($zip)){
|
||||||
echo json_encode(error("Missing parameters"));
|
echo json_encode(error("Missing parameters"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->load->model('codex/Gemeinde_model', "GemeindeModel");
|
$this->load->model('codex/Gemeinde_model', "GemeindeModel");
|
||||||
|
|
||||||
|
|
||||||
$gemeinde_res = $this->GemeindeModel->getGemeindeByPlz($zip);
|
$gemeinde_res = $this->GemeindeModel->getGemeindeByPlz($zip);
|
||||||
|
|
||||||
if (isError($gemeinde_res)) {
|
if (isError($gemeinde_res)) {
|
||||||
$this->terminateWithError(getError($gemeinde_res), self::ERROR_TYPE_GENERAL);
|
$this->terminateWithError(getError($gemeinde_res),self::ERROR_TYPE_GENERAL);
|
||||||
}
|
}
|
||||||
$gemeinde_res = $this->getDataOrTerminateWithError($gemeinde_res);
|
$gemeinde_res = $this->getDataOrTerminateWithError($gemeinde_res);
|
||||||
|
|
||||||
/* $gemeinde_res = array_map(function ($obj) {
|
/* $gemeinde_res = array_map(function ($obj) {
|
||||||
return $obj->ortschaftsname;
|
return $obj->ortschaftsname;
|
||||||
}, $gemeinde_res); */
|
}, $gemeinde_res); */
|
||||||
|
|
||||||
$this->terminateWithSuccess($gemeinde_res);
|
$this->terminateWithSuccess($gemeinde_res);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* checks whether a specific userID is a mitarbeiter or not (foreword declaration of the function isMitarbeiter in Mitarbeiter_model.php)
|
* checks whether a specific userID is a mitarbeiter or not (foreword declaration of the function isMitarbeiter in Mitarbeiter_model.php)
|
||||||
* @access public
|
* @access public
|
||||||
@@ -160,48 +150,23 @@ class Profil extends FHCAPI_Controller
|
|||||||
public function isMitarbeiter($uid)
|
public function isMitarbeiter($uid)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (!$uid)
|
if(!$uid) $this->terminateWithError("No uid provided", self::ERROR_TYPE_GENERAL);
|
||||||
$this->terminateWithError("No uid provided", self::ERROR_TYPE_GENERAL);
|
|
||||||
|
|
||||||
|
|
||||||
$result = $this->MitarbeiterModel->isMitarbeiter($uid);
|
$result = $this->MitarbeiterModel->isMitarbeiter($uid);
|
||||||
|
|
||||||
if (isError($result)) {
|
if (isError($result)) {
|
||||||
$this->terminateWithError("error when calling Mitarbeiter_model function isMitarbeiter with uid " . $uid, self::ERROR_TYPE_GENERAL);
|
$this->terminateWithError("error when calling Mitarbeiter_model function isMitarbeiter with uid " . $uid, self::ERROR_TYPE_GENERAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
$result = $this->getDataOrTerminateWithError($result);
|
$result = $this->getDataOrTerminateWithError($result);
|
||||||
|
|
||||||
$this->terminateWithSuccess($result);
|
$this->terminateWithSuccess($result);
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------------------------------------------
|
||||||
// Private methods
|
// Private methods
|
||||||
|
|
||||||
/**
|
|
||||||
* gets the identifier, phrase, and url for each calendar sync option
|
|
||||||
* @access private
|
|
||||||
* @return array array of arrays, where each child array is a sync option
|
|
||||||
*/
|
|
||||||
private function getCalendarSyncUrlData()
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
[
|
|
||||||
"identifier" => "cal_dav",
|
|
||||||
"labelPhrase" => "profil/calendar_sync_cal_dav",
|
|
||||||
"url" => APP_ROOT . "webdav/lvplan.php/calendars/" . $this->uid . "/LVPlan-" . $this->uid,
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"identifier" => "cal_dav_principal",
|
|
||||||
"labelPhrase" => "profil/calendar_sync_cal_dav_principal",
|
|
||||||
"url" => APP_ROOT . "webdav/lvplan.php/principals/" . $this->uid,
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"identifier" => "i_cal",
|
|
||||||
"labelPhrase" => "profil/calendar_sync_i_cal",
|
|
||||||
"url" => APP_ROOT . "webdav/google.php?cal=" . encryptData($this->uid, LVPLAN_CYPHER_KEY) . "&" . microtime(true),
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,64 +0,0 @@
|
|||||||
<?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');
|
|
||||||
|
|
||||||
class StgOrgLvPlan extends FHCAPI_Controller
|
|
||||||
{
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Object initialization
|
|
||||||
*/
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
parent::__construct([
|
|
||||||
'stgOrgLvPlanViewData' => self::PERM_LOGGED,
|
|
||||||
]);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------------------------------
|
|
||||||
// Public methods
|
|
||||||
|
|
||||||
/**
|
|
||||||
* fetches view data for stg org lv plan
|
|
||||||
* @access public
|
|
||||||
*/
|
|
||||||
public function stgOrgLvPlanViewData()
|
|
||||||
{
|
|
||||||
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
|
|
||||||
$this->StudiengangModel->addOrder('typ');
|
|
||||||
$this->StudiengangModel->addOrder('kurzbz');
|
|
||||||
$result = $this->StudiengangModel->loadWhere([
|
|
||||||
'aktiv' => true
|
|
||||||
]);
|
|
||||||
$studiengaenge = $this->getDataOrTerminateWithError($result);
|
|
||||||
|
|
||||||
$viewData = array(
|
|
||||||
'studiengaenge' => $studiengaenge,
|
|
||||||
);
|
|
||||||
|
|
||||||
$this->terminateWithSuccess($viewData);
|
|
||||||
}
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------------------------------------------
|
|
||||||
// Private methods
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -62,36 +62,21 @@ class Studium extends FHCAPI_Controller
|
|||||||
|
|
||||||
if($this->getDataOrTerminateWithError($this->StudentModel->isStudent(getAuthUID()))){
|
if($this->getDataOrTerminateWithError($this->StudentModel->isStudent(getAuthUID()))){
|
||||||
$studentLehrverband =$this->StudentlehrverbandModel->loadWhere(["student_uid" => getAuthUID(), "studiensemester_kurzbz" => $aktuelles_studiensemester->studiensemester_kurzbz]);
|
$studentLehrverband =$this->StudentlehrverbandModel->loadWhere(["student_uid" => getAuthUID(), "studiensemester_kurzbz" => $aktuelles_studiensemester->studiensemester_kurzbz]);
|
||||||
|
$studentLehrverband = current($this->getDataOrTerminateWithError($studentLehrverband));
|
||||||
//TODO(Manu) check if use Fallback or just comment out all paramschecks?
|
|
||||||
//add Fallback: if no LehrverbandData of actual semester, get Data of previous one
|
$student_studiensemester = $studentLehrverband->studiensemester_kurzbz;
|
||||||
if(!hasData($studentLehrverband))
|
$student_studiengang = $studentLehrverband->studiengang_kz;
|
||||||
{
|
$student_semester = $studentLehrverband->semester;
|
||||||
$result= $this->StudiensemesterModel->getPreviousFrom($aktuelles_studiensemester->studiensemester_kurzbz);
|
|
||||||
|
|
||||||
$data = $this->getDataOrTerminateWithError($result);
|
|
||||||
$vorheriges_studiensemester = current($data)->studiensemester_kurzbz;
|
|
||||||
$studentLehrverband =$this->StudentlehrverbandModel->loadWhere(["student_uid" => getAuthUID(), "studiensemester_kurzbz" => $vorheriges_studiensemester]);
|
|
||||||
}
|
|
||||||
$studentLehrverband = current(getData($studentLehrverband));
|
|
||||||
|
|
||||||
$student_studienplan = $this->getStudienPlanFromPrestudentStatus(getAuthPersonId())->studienplan_id;
|
$student_studienplan = $this->getStudienPlanFromPrestudentStatus(getAuthPersonId())->studienplan_id;
|
||||||
|
|
||||||
if(!isset($parameter_studiensemester)) {
|
if(!isset($parameter_studiensemester))
|
||||||
$student_studiensemester = $studentLehrverband->studiensemester_kurzbz;
|
$parameter_studiensemester = $student_studiensemester;
|
||||||
$parameter_studiensemester = $student_studiensemester;
|
if(!isset($parameter_studiengang))
|
||||||
}
|
$parameter_studiengang = $student_studiengang;
|
||||||
if(!isset($parameter_studiengang)) {
|
if(!isset($parameter_semester))
|
||||||
$student_studiengang = $studentLehrverband->studiengang_kz;
|
$parameter_semester = $student_semester;
|
||||||
$parameter_studiengang = $student_studiengang;
|
|
||||||
}
|
|
||||||
if(!isset($parameter_semester)) {
|
|
||||||
$student_semester = $studentLehrverband->semester;
|
|
||||||
$parameter_semester = $student_semester;
|
|
||||||
}
|
|
||||||
if(!isset($parameter_studienplan))
|
if(!isset($parameter_studienplan))
|
||||||
$parameter_studienplan = $student_studienplan;
|
$parameter_studienplan = $student_studienplan;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(isset($parameter_studiensemester)){
|
if(isset($parameter_studiensemester)){
|
||||||
@@ -111,7 +96,8 @@ class Studium extends FHCAPI_Controller
|
|||||||
|
|
||||||
// fetch studiensemester
|
// fetch studiensemester
|
||||||
$allStudienSemester = $this->getDataOrTerminateWithError($this->StudiensemesterModel->load());
|
$allStudienSemester = $this->getDataOrTerminateWithError($this->StudiensemesterModel->load());
|
||||||
|
|
||||||
|
|
||||||
if(isset($parameter_studiensemester) && !empty(array_filter($allStudienSemester, function($studiensemester) use($parameter_studiensemester){
|
if(isset($parameter_studiensemester) && !empty(array_filter($allStudienSemester, function($studiensemester) use($parameter_studiensemester){
|
||||||
return $studiensemester->studiensemester_kurzbz == $parameter_studiensemester->studiensemester_kurzbz;
|
return $studiensemester->studiensemester_kurzbz == $parameter_studiensemester->studiensemester_kurzbz;
|
||||||
}))){
|
}))){
|
||||||
@@ -230,8 +216,6 @@ class Studium extends FHCAPI_Controller
|
|||||||
$studienplaene = array_map(function($studienplan){
|
$studienplaene = array_map(function($studienplan){
|
||||||
$orgform = current($this->getDataOrTerminateWithError($this->OrgformModel->loadWhere(["orgform_kurzbz" => $studienplan->orgform_kurzbz])));
|
$orgform = current($this->getDataOrTerminateWithError($this->OrgformModel->loadWhere(["orgform_kurzbz" => $studienplan->orgform_kurzbz])));
|
||||||
$studienplan->orgform_bezeichnung = $orgform->bezeichnung;
|
$studienplan->orgform_bezeichnung = $orgform->bezeichnung;
|
||||||
// bezeichnung_mehrsprachig
|
|
||||||
$studienplan->orgform_bezeichnung_english = $orgform->bezeichnung_mehrsprachig[1];
|
|
||||||
return $studienplan;
|
return $studienplan;
|
||||||
},$studienplaene);
|
},$studienplaene);
|
||||||
return $studienplaene;
|
return $studienplaene;
|
||||||
|
|||||||
@@ -40,32 +40,11 @@ class Board extends FHCAPI_Controller
|
|||||||
|
|
||||||
public function list()
|
public function list()
|
||||||
{
|
{
|
||||||
$this->DashboardModel->addSelect('dashboard_id');
|
|
||||||
$this->DashboardModel->addSelect('dashboard_kurzbz');
|
|
||||||
$this->DashboardModel->addSelect('tbl_dashboard.beschreibung');
|
|
||||||
$this->DashboardModel->addSelect("(
|
|
||||||
SELECT json_agg(w.*)
|
|
||||||
FROM dashboard.tbl_widget w
|
|
||||||
JOIN dashboard.tbl_dashboard_widget dw
|
|
||||||
USING(widget_id)
|
|
||||||
WHERE dw.dashboard_id=tbl_dashboard.dashboard_id
|
|
||||||
) AS \"widgetSetup\"");
|
|
||||||
|
|
||||||
$result = $this->DashboardModel->load();
|
$result = $this->DashboardModel->load();
|
||||||
|
|
||||||
$data = $this->getDataOrTerminateWithError($result);
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
|
|
||||||
$data = array_map(function ($dashboard) {
|
$this->terminateWithSuccess($result);
|
||||||
$tmpSetups = json_decode($dashboard->widgetSetup);
|
|
||||||
$tmpSetups = array_map(function ($widget) {
|
|
||||||
$widget->setup->file = absoluteJsImportUrl($widget->setup->file);
|
|
||||||
return $widget;
|
|
||||||
}, $tmpSetups);
|
|
||||||
$dashboard->widgetSetup = $tmpSetups;
|
|
||||||
return $dashboard;
|
|
||||||
}, $data);
|
|
||||||
|
|
||||||
$this->terminateWithSuccess($data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function create()
|
public function create()
|
||||||
@@ -103,7 +82,7 @@ class Board extends FHCAPI_Controller
|
|||||||
|
|
||||||
$data = $this->getDataOrTerminateWithError($result);
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
|
|
||||||
$this->terminateWithSuccess($data);
|
$this->terminateWithSuccess($result);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function delete()
|
public function delete()
|
||||||
@@ -137,6 +116,6 @@ class Board extends FHCAPI_Controller
|
|||||||
|
|
||||||
$data = $this->getDataOrTerminateWithError($result);
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
|
|
||||||
$this->terminateWithSuccess($data);
|
$this->terminateWithSuccess($result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -120,7 +120,10 @@ class Preset extends FHCAPI_Controller
|
|||||||
$conf = $this->dashboardlib->getPreset($db, $funktion);
|
$conf = $this->dashboardlib->getPreset($db, $funktion);
|
||||||
if ($conf) {
|
if ($conf) {
|
||||||
$preset = json_decode($conf->preset, true);
|
$preset = json_decode($conf->preset, true);
|
||||||
$result[$funktion] = $preset;
|
if (!isset($preset[$funktion]) || !isset($preset[$funktion]['widgets']))
|
||||||
|
$result[$funktion] = [];
|
||||||
|
else
|
||||||
|
$result[$funktion] = $preset[$funktion]['widgets'];
|
||||||
} else {
|
} else {
|
||||||
$result[$funktion] = [];
|
$result[$funktion] = [];
|
||||||
}
|
}
|
||||||
@@ -151,7 +154,7 @@ class Preset extends FHCAPI_Controller
|
|||||||
|
|
||||||
$preset_decoded = json_decode($preset->preset, true);
|
$preset_decoded = json_decode($preset->preset, true);
|
||||||
|
|
||||||
$preset_decoded[$widget['widgetid']] = $widget;
|
$this->dashboardlib->addWidgetsToWidgets($preset_decoded, $dashboard_kurzbz, $funktion_kurzbz, [$widget]);
|
||||||
|
|
||||||
$preset->preset = json_encode($preset_decoded);
|
$preset->preset = json_encode($preset_decoded);
|
||||||
|
|
||||||
@@ -183,10 +186,8 @@ class Preset extends FHCAPI_Controller
|
|||||||
|
|
||||||
$preset_decoded = json_decode($preset->preset, true);
|
$preset_decoded = json_decode($preset->preset, true);
|
||||||
|
|
||||||
if (!isset($preset_decoded[$widgetid]))
|
if (!$this->dashboardlib->removeWidgetFromWidgets($preset_decoded, $funktion_kurzbz, $widgetid))
|
||||||
show_404();
|
show_404();
|
||||||
|
|
||||||
unset($preset_decoded[$widgetid]);
|
|
||||||
|
|
||||||
$preset->preset = json_encode($preset_decoded);
|
$preset->preset = json_encode($preset_decoded);
|
||||||
|
|
||||||
|
|||||||
@@ -48,9 +48,25 @@ class User extends FHCAPI_Controller
|
|||||||
|
|
||||||
$uid = $this->authlib->getAuthObj()->username;
|
$uid = $this->authlib->getAuthObj()->username;
|
||||||
|
|
||||||
$mergedconfig = $this->dashboardlib->getMergedUserConfig($dashboard->dashboard_id, $uid);
|
/*$mergedconfig = $this->dashboardlib->getMergedConfig($dashboard->dashboard_id, $uid);
|
||||||
|
|
||||||
$this->terminateWithSuccess($mergedconfig);
|
$this->terminateWithSuccess([
|
||||||
|
'general' => call_user_func_array(
|
||||||
|
'array_merge_recursive',
|
||||||
|
$mergedconfig
|
||||||
|
)
|
||||||
|
]);*/
|
||||||
|
$defaultconfig = $this->dashboardlib->getDefaultConfig($dashboard->dashboard_id);
|
||||||
|
$userconfig = $this->dashboardlib->getUserConfig($dashboard->dashboard_id, $uid);
|
||||||
|
|
||||||
|
$defaultconfig_squashed = $defaultconfig ? call_user_func_array('array_replace_recursive', $defaultconfig) : [];
|
||||||
|
$userconfig_squashed = $userconfig ? call_user_func_array('array_replace_recursive', $userconfig) : [];
|
||||||
|
|
||||||
|
$mergedconfig = array_replace_recursive($defaultconfig_squashed, $userconfig_squashed);
|
||||||
|
|
||||||
|
$this->terminateWithSuccess([
|
||||||
|
DashboardLib::SECTION_IF_FUNKTION_KURZBZ_IS_NULL => $mergedconfig
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addWidget()
|
public function addWidget()
|
||||||
@@ -70,15 +86,26 @@ class User extends FHCAPI_Controller
|
|||||||
if (!isset($widget['widgetid']))
|
if (!isset($widget['widgetid']))
|
||||||
$widget['widgetid'] = $this->dashboardlib->generateWidgetId($dashboard_kurzbz);
|
$widget['widgetid'] = $this->dashboardlib->generateWidgetId($dashboard_kurzbz);
|
||||||
|
|
||||||
if (isset($widget['source']))
|
|
||||||
unset($widget['source']);
|
|
||||||
|
|
||||||
$override = $this->dashboardlib->getOverrideOrCreateEmptyOverride($dashboard_kurzbz, $uid);
|
$override = $this->dashboardlib->getOverrideOrCreateEmptyOverride($dashboard_kurzbz, $uid);
|
||||||
|
|
||||||
$override_decoded = json_decode($override->override, true);
|
$override_decoded = json_decode($override->override, true);
|
||||||
|
|
||||||
$override_decoded[$widget['widgetid']] = $widget;
|
if (!isset($override_decoded['general']) || !is_array($override_decoded['general']))
|
||||||
|
$override_decoded['general'] = [];
|
||||||
|
|
||||||
|
if (!isset($override_decoded['general']['widgets']))
|
||||||
|
$override_decoded['general']['widgets'] = [];
|
||||||
|
|
||||||
|
$override_decoded['general']['widgets'][$widget['widgetid']] = $widget;
|
||||||
|
|
||||||
|
// NOTE(chris): remove doubles in other funktionen
|
||||||
|
foreach ($override_decoded as $funktion => $array) {
|
||||||
|
if ($funktion == 'general')
|
||||||
|
continue;
|
||||||
|
if (isset($array['widgets']) && isset($array['widgets'][$widget['widgetid']]))
|
||||||
|
unset($override_decoded[$funktion]['widgets'][$widget['widgetid']]);
|
||||||
|
}
|
||||||
|
|
||||||
$override->override = json_encode($override_decoded);
|
$override->override = json_encode($override_decoded);
|
||||||
|
|
||||||
$result = $this->dashboardlib->insertOrUpdateOverride($override);
|
$result = $this->dashboardlib->insertOrUpdateOverride($override);
|
||||||
@@ -108,10 +135,18 @@ class User extends FHCAPI_Controller
|
|||||||
|
|
||||||
$override_decoded = json_decode($override->override, true);
|
$override_decoded = json_decode($override->override, true);
|
||||||
|
|
||||||
if (!isset($override_decoded[$widget_id]))
|
foreach (array_keys($override_decoded) as $k) {
|
||||||
show_404();
|
if (!isset($override_decoded[$k]["widgets"])) {
|
||||||
|
unset($override_decoded[$k]);
|
||||||
unset($override_decoded[$widget_id]);
|
continue;
|
||||||
|
}
|
||||||
|
if (isset($override_decoded[$k]["widgets"][$widget_id])) {
|
||||||
|
unset($override_decoded[$k]["widgets"][$widget_id]);
|
||||||
|
}
|
||||||
|
if (!$override_decoded[$k]["widgets"]) {
|
||||||
|
unset($override_decoded[$k]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$override->override = json_encode($override_decoded);
|
$override->override = json_encode($override_decoded);
|
||||||
|
|
||||||
|
|||||||
@@ -78,52 +78,32 @@ class Dokumente extends FHCAPI_Controller
|
|||||||
$this->terminateWithError($this->p->t('ui', 'errorMissingValue', ['value' => 'Studiengang_kz']), self::ERROR_TYPE_GENERAL);
|
$this->terminateWithError($this->p->t('ui', 'errorMissingValue', ['value' => 'Studiengang_kz']), self::ERROR_TYPE_GENERAL);
|
||||||
|
|
||||||
$resultPreDoc = $this->_getPrestudentDokumente($prestudent_id);
|
$resultPreDoc = $this->_getPrestudentDokumente($prestudent_id);
|
||||||
|
|
||||||
$arrayAccepted = [];
|
|
||||||
$person_id = $this->_getPersonId($prestudent_id);
|
$person_id = $this->_getPersonId($prestudent_id);
|
||||||
|
|
||||||
$docNames = array_map(function ($item) {
|
$mergedArray = [];
|
||||||
return $item->dokument_kurzbz;
|
|
||||||
}, $resultPreDoc);
|
|
||||||
|
|
||||||
foreach($docNames as $doc)
|
foreach ($resultPreDoc as $pre)
|
||||||
{
|
{
|
||||||
$result = $this->AkteModel->getAktenFAS($person_id, $doc, $studiengang_kz, $prestudent_id, true);
|
$result = $this->AkteModel->getAktenFAS($person_id, $pre->dokument_kurzbz, $studiengang_kz, $prestudent_id, true);
|
||||||
|
|
||||||
if (isError($result))
|
if (isError($result))
|
||||||
{
|
|
||||||
return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
||||||
}
|
|
||||||
if (hasData($result))
|
if (hasData($result))
|
||||||
{
|
{
|
||||||
$data = getData($result);
|
foreach (getData($result) as $doc)
|
||||||
foreach ($data as $value)
|
|
||||||
{
|
{
|
||||||
array_push($arrayAccepted, $value);
|
$merged = clone $doc;
|
||||||
|
$merged->docdatum = $pre->docdatum;
|
||||||
|
$merged->insertvonma = $pre->insertvonma;
|
||||||
|
$merged->bezeichnung = $pre->bezeichnung;
|
||||||
|
$mergedArray[] = $merged;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
else
|
||||||
|
{
|
||||||
//Mapping with document_kurzbz
|
$mergedArray[] = $pre;
|
||||||
$preDocMap = [];
|
|
||||||
foreach ($resultPreDoc as $pre) {
|
|
||||||
$preDocMap[$pre->dokument_kurzbz] = $pre;
|
|
||||||
}
|
|
||||||
|
|
||||||
$mergedArray = [];
|
|
||||||
foreach ($arrayAccepted as $doc) {
|
|
||||||
$merged = clone $doc;
|
|
||||||
|
|
||||||
if (isset($preDocMap[$doc->dokument_kurzbz])) {
|
|
||||||
$merged->docdatum = $preDocMap[$doc->dokument_kurzbz]->docdatum;
|
|
||||||
$merged->insertvonma = $preDocMap[$doc->dokument_kurzbz]->insertvonma;
|
|
||||||
$merged->bezeichnung = $preDocMap[$doc->dokument_kurzbz]->bezeichnung;
|
|
||||||
} else {
|
|
||||||
$merged->akzeptiertdatum = null;
|
|
||||||
$merged->akzeptiertvon = null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$mergedArray[] = $merged;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->terminateWithSuccess($mergedArray);
|
$this->terminateWithSuccess($mergedArray);
|
||||||
|
|||||||
@@ -48,7 +48,8 @@ class Konto extends FHCAPI_Controller
|
|||||||
|
|
||||||
// Load language phrases
|
// Load language phrases
|
||||||
$this->loadPhrases([
|
$this->loadPhrases([
|
||||||
'konto'
|
'konto',
|
||||||
|
'lehre'
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -112,7 +113,7 @@ class Konto extends FHCAPI_Controller
|
|||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function getBuchungstypen()
|
public function getBuchungstypen($studiensemester_kurzbz = null)
|
||||||
{
|
{
|
||||||
$this->load->model('crm/Buchungstyp_model', 'BuchungstypModel');
|
$this->load->model('crm/Buchungstyp_model', 'BuchungstypModel');
|
||||||
|
|
||||||
@@ -122,6 +123,7 @@ class Konto extends FHCAPI_Controller
|
|||||||
|
|
||||||
$data = $this->getDataOrTerminateWithError($result);
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
|
|
||||||
|
$this->_getOEHBeitrag($data, $studiensemester_kurzbz);
|
||||||
$this->terminateWithSuccess($data);
|
$this->terminateWithSuccess($data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -494,4 +496,43 @@ class Konto extends FHCAPI_Controller
|
|||||||
|
|
||||||
$this->terminateWithSuccess();
|
$this->terminateWithSuccess();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function _getOEHBeitrag(&$data, $studiensemester_kurzbz = null)
|
||||||
|
{
|
||||||
|
if (is_null($studiensemester_kurzbz))
|
||||||
|
{
|
||||||
|
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
|
||||||
|
$studiensemester_akt = $this->variablelib->getVar('semester_aktuell');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||||
|
if ($this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz))
|
||||||
|
$studiensemester_akt = $studiensemester_kurzbz;
|
||||||
|
else
|
||||||
|
$this->terminateWithError($this->p->t('lehre', 'error_noStudiensemester'));
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->load->model('codex/Oehbeitrag_model', 'OehbeitragModel');
|
||||||
|
$oehBeitrag = $this->OehbeitragModel->getByStudiensemester($studiensemester_akt);
|
||||||
|
|
||||||
|
$oehStandardbetrag = null;
|
||||||
|
if (hasData($oehBeitrag))
|
||||||
|
{
|
||||||
|
$oeh = getData($oehBeitrag)[0];
|
||||||
|
$summe = ($oeh->studierendenbeitrag + $oeh->versicherung) * -1;
|
||||||
|
$oehStandardbetrag = number_format((float)$summe, 2, '.', '');
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($oehStandardbetrag !== null)
|
||||||
|
{
|
||||||
|
$data = array_map(function ($buchungstyp) use ($oehStandardbetrag) {
|
||||||
|
if (isset($buchungstyp->buchungstyp_kurzbz) && (strtolower($buchungstyp->buchungstyp_kurzbz) === 'oeh'))
|
||||||
|
{
|
||||||
|
$buchungstyp->standardbetrag = $oehStandardbetrag;
|
||||||
|
}
|
||||||
|
return $buchungstyp;
|
||||||
|
}, $data);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -417,6 +417,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
|
|||||||
$notiz_id = $this->input->post('notiz_id');
|
$notiz_id = $this->input->post('notiz_id');
|
||||||
|
|
||||||
$this->NotizModel->addSelect('campus.tbl_dms_version.*');
|
$this->NotizModel->addSelect('campus.tbl_dms_version.*');
|
||||||
|
$this->NotizModel->addSelect($this->NotizModel->escape(base_url('content/notizdokdownload.php?id=')) . ' || public.tbl_notiz_dokument.dms_id AS preview');
|
||||||
|
|
||||||
$this->NotizModel->addJoin('public.tbl_notiz_dokument', 'ON (public.tbl_notiz_dokument.notiz_id = public.tbl_notiz.notiz_id)');
|
$this->NotizModel->addJoin('public.tbl_notiz_dokument', 'ON (public.tbl_notiz_dokument.notiz_id = public.tbl_notiz.notiz_id)');
|
||||||
$this->NotizModel->addJoin('campus.tbl_dms_version', 'ON (public.tbl_notiz_dokument.dms_id = campus.tbl_dms_version.dms_id)');
|
$this->NotizModel->addJoin('campus.tbl_dms_version', 'ON (public.tbl_notiz_dokument.dms_id = campus.tbl_dms_version.dms_id)');
|
||||||
|
|||||||
@@ -1,517 +0,0 @@
|
|||||||
<?php
|
|
||||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Base Site URL
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| URL to your CodeIgniter root. Typically this will be your base URL,
|
|
||||||
| WITH a trailing slash:
|
|
||||||
|
|
|
||||||
| http://example.com/
|
|
||||||
|
|
|
||||||
| If this is not set then CodeIgniter will try guess the protocol, domain
|
|
||||||
| and path to your installation. However, you should always configure this
|
|
||||||
| explicitly and never rely on auto-guessing, especially in production
|
|
||||||
| environments.
|
|
||||||
|
|
|
||||||
*/
|
|
||||||
$config['base_url'] = 'https://c3p0.dev.technikum-wien.at/ma1434/core/FHC-Core/';
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Index File
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| Typically this will be your index.php file, unless you've renamed it to
|
|
||||||
| something else. If you are using mod_rewrite to remove the page set this
|
|
||||||
| variable so that it is blank.
|
|
||||||
|
|
|
||||||
*/
|
|
||||||
$config['index_page'] = 'index.ci.php';
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| URI PROTOCOL
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| This item determines which server global should be used to retrieve the
|
|
||||||
| URI string. The default setting of 'REQUEST_URI' works for most servers.
|
|
||||||
| If your links do not seem to work, try one of the other delicious flavors:
|
|
||||||
|
|
|
||||||
| 'REQUEST_URI' Uses $_SERVER['REQUEST_URI']
|
|
||||||
| 'QUERY_STRING' Uses $_SERVER['QUERY_STRING']
|
|
||||||
| 'PATH_INFO' Uses $_SERVER['PATH_INFO']
|
|
||||||
|
|
|
||||||
| WARNING: If you set this to 'PATH_INFO', URIs will always be URL-decoded!
|
|
||||||
*/
|
|
||||||
$config['uri_protocol'] = 'REQUEST_URI';
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| URL suffix
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| This option allows you to add a suffix to all URLs generated by CodeIgniter.
|
|
||||||
| For more information please see the user guide:
|
|
||||||
|
|
|
||||||
| http://codeigniter.com/user_guide/general/urls.html
|
|
||||||
*/
|
|
||||||
$config['url_suffix'] = '';
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Default Language
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| This determines which set of language files should be used. Make sure
|
|
||||||
| there is an available translation if you intend to use something other
|
|
||||||
| than english.
|
|
||||||
|
|
|
||||||
*/
|
|
||||||
$config['language'] = '';
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Default Character Set
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| This determines which character set is used by default in various methods
|
|
||||||
| that require a character set to be provided.
|
|
||||||
|
|
|
||||||
| See http://php.net/htmlspecialchars for a list of supported charsets.
|
|
||||||
|
|
|
||||||
*/
|
|
||||||
$config['charset'] = 'UTF-8';
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Enable/Disable System Hooks
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| If you would like to use the 'hooks' feature you must enable it by
|
|
||||||
| setting this variable to TRUE (boolean). See the user guide for details.
|
|
||||||
|
|
|
||||||
*/
|
|
||||||
$config['enable_hooks'] = FALSE;
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Class Extension Prefix
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| This item allows you to set the filename/classname prefix when extending
|
|
||||||
| native libraries. For more information please see the user guide:
|
|
||||||
|
|
|
||||||
| http://codeigniter.com/user_guide/general/core_classes.html
|
|
||||||
| http://codeigniter.com/user_guide/general/creating_libraries.html
|
|
||||||
|
|
|
||||||
*/
|
|
||||||
$config['subclass_prefix'] = 'FHC_';
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Composer auto-loading
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| Enabling this setting will tell CodeIgniter to look for a Composer
|
|
||||||
| package auto-loader script in application/vendor/autoload.php.
|
|
||||||
|
|
|
||||||
| $config['composer_autoload'] = TRUE;
|
|
||||||
|
|
|
||||||
| Or if you have your vendor/ directory located somewhere else, you
|
|
||||||
| can opt to set a specific path as well:
|
|
||||||
|
|
|
||||||
| $config['composer_autoload'] = '/path/to/vendor/autoload.php';
|
|
||||||
|
|
|
||||||
| For more information about Composer, please visit http://getcomposer.org/
|
|
||||||
|
|
|
||||||
| Note: This will NOT disable or override the CodeIgniter-specific
|
|
||||||
| autoloading (application/config/autoload.php)
|
|
||||||
*/
|
|
||||||
$config['composer_autoload'] = FALSE;
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Allowed URL Characters
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| This lets you specify which characters are permitted within your URLs.
|
|
||||||
| When someone tries to submit a URL with disallowed characters they will
|
|
||||||
| get a warning message.
|
|
||||||
|
|
|
||||||
| As a security measure you are STRONGLY encouraged to restrict URLs to
|
|
||||||
| as few characters as possible. By default only these are allowed: a-z 0-9~%.:_-
|
|
||||||
|
|
|
||||||
| Leave blank to allow all characters -- but only if you are insane.
|
|
||||||
|
|
|
||||||
| The configured value is actually a regular expression character group
|
|
||||||
| and it will be executed as: ! preg_match('/^[<permitted_uri_chars>]+$/i
|
|
||||||
|
|
|
||||||
| DO NOT CHANGE THIS UNLESS YOU FULLY UNDERSTAND THE REPERCUSSIONS!!
|
|
||||||
|
|
|
||||||
*/
|
|
||||||
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Enable Query Strings
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| By default CodeIgniter uses search-engine friendly segment based URLs:
|
|
||||||
| example.com/who/what/where/
|
|
||||||
|
|
|
||||||
| By default CodeIgniter enables access to the $_GET array. If for some
|
|
||||||
| reason you would like to disable it, set 'allow_get_array' to FALSE.
|
|
||||||
|
|
|
||||||
| You can optionally enable standard query string based URLs:
|
|
||||||
| example.com?who=me&what=something&where=here
|
|
||||||
|
|
|
||||||
| Options are: TRUE or FALSE (boolean)
|
|
||||||
|
|
|
||||||
| The other items let you set the query string 'words' that will
|
|
||||||
| invoke your controllers and its functions:
|
|
||||||
| example.com/index.php?c=controller&m=function
|
|
||||||
|
|
|
||||||
| Please note that some of the helpers won't work as expected when
|
|
||||||
| this feature is enabled, since CodeIgniter is designed primarily to
|
|
||||||
| use segment based URLs.
|
|
||||||
|
|
|
||||||
*/
|
|
||||||
$config['allow_get_array'] = TRUE;
|
|
||||||
$config['enable_query_strings'] = FALSE;
|
|
||||||
$config['controller_trigger'] = 'c';
|
|
||||||
$config['function_trigger'] = 'm';
|
|
||||||
$config['directory_trigger'] = 'd';
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Error Logging Threshold
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| You can enable error logging by setting a threshold over zero. The
|
|
||||||
| threshold determines what gets logged. Threshold options are:
|
|
||||||
|
|
|
||||||
| 0 = Disables logging, Error logging TURNED OFF
|
|
||||||
| 1 = Error Messages (including PHP errors)
|
|
||||||
| 2 = Debug Messages
|
|
||||||
| 3 = Informational Messages
|
|
||||||
| 4 = All Messages
|
|
||||||
|
|
|
||||||
| You can also pass an array with threshold levels to show individual error types
|
|
||||||
|
|
|
||||||
| array(2) = Debug Messages, without Error Messages
|
|
||||||
|
|
|
||||||
| For a live site you'll usually only enable Errors (1) to be logged otherwise
|
|
||||||
| your log files will fill up very fast.
|
|
||||||
|
|
|
||||||
*/
|
|
||||||
$config['log_threshold'] = 1;
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Error Logging Directory Path
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| Leave this BLANK unless you would like to set something other than the default
|
|
||||||
| application/logs/ directory. Use a full server path with trailing slash.
|
|
||||||
|
|
|
||||||
*/
|
|
||||||
$config['log_path'] = '';
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Log File Extension
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| The default filename extension for log files. The default 'php' allows for
|
|
||||||
| protecting the log files via basic scripting, when they are to be stored
|
|
||||||
| under a publicly accessible directory.
|
|
||||||
|
|
|
||||||
| Note: Leaving it blank will default to 'php'.
|
|
||||||
|
|
|
||||||
*/
|
|
||||||
$config['log_file_extension'] = 'log';
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Log File Permissions
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| The file system permissions to be applied on newly created log files.
|
|
||||||
|
|
|
||||||
| IMPORTANT: This MUST be an integer (no quotes) and you MUST use octal
|
|
||||||
| integer notation (i.e. 0700, 0644, etc.)
|
|
||||||
*/
|
|
||||||
$config['log_file_permissions'] = 0644;
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Date Format for Logs
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| Each item that is logged has an associated date. You can use PHP date
|
|
||||||
| codes to set your own date formatting
|
|
||||||
|
|
|
||||||
*/
|
|
||||||
$config['log_date_format'] = 'Y-m-d H:i:s';
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Error Views Directory Path
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| Leave this BLANK unless you would like to set something other than the default
|
|
||||||
| application/views/errors/ directory. Use a full server path with trailing slash.
|
|
||||||
|
|
|
||||||
*/
|
|
||||||
$config['error_views_path'] = '';
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Cache Directory Path
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| Leave this BLANK unless you would like to set something other than the default
|
|
||||||
| application/cache/ directory. Use a full server path with trailing slash.
|
|
||||||
|
|
|
||||||
*/
|
|
||||||
$config['cache_path'] = '';
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Cache Include Query String
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| Whether to take the URL query string into consideration when generating
|
|
||||||
| output cache files. Valid options are:
|
|
||||||
|
|
|
||||||
| FALSE = Disabled
|
|
||||||
| TRUE = Enabled, take all query parameters into account.
|
|
||||||
| Please be aware that this may result in numerous cache
|
|
||||||
| files generated for the same page over and over again.
|
|
||||||
| array('q') = Enabled, but only take into account the specified list
|
|
||||||
| of query parameters.
|
|
||||||
|
|
|
||||||
*/
|
|
||||||
$config['cache_query_string'] = FALSE;
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Encryption Key
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| If you use the Encryption class, you must set an encryption key.
|
|
||||||
| See the user guide for more info.
|
|
||||||
|
|
|
||||||
| http://codeigniter.com/user_guide/libraries/encryption.html
|
|
||||||
|
|
|
||||||
*/
|
|
||||||
$config['encryption_key'] = '';
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Session Variables
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| 'sess_driver'
|
|
||||||
|
|
|
||||||
| The storage driver to use: files, database, redis, memcached
|
|
||||||
|
|
|
||||||
| 'sess_cookie_name'
|
|
||||||
|
|
|
||||||
| The session cookie name, must contain only [0-9a-z_-] characters
|
|
||||||
|
|
|
||||||
| 'sess_expiration'
|
|
||||||
|
|
|
||||||
| The number of SECONDS you want the session to last.
|
|
||||||
| Setting to 0 (zero) means expire when the browser is closed.
|
|
||||||
|
|
|
||||||
| 'sess_save_path'
|
|
||||||
|
|
|
||||||
| The location to save sessions to, driver dependent.
|
|
||||||
|
|
|
||||||
| For the 'files' driver, it's a path to a writable directory.
|
|
||||||
| WARNING: Only absolute paths are supported!
|
|
||||||
|
|
|
||||||
| For the 'database' driver, it's a table name.
|
|
||||||
| Please read up the manual for the format with other session drivers.
|
|
||||||
|
|
|
||||||
| IMPORTANT: You are REQUIRED to set a valid save path!
|
|
||||||
|
|
|
||||||
| 'sess_match_ip'
|
|
||||||
|
|
|
||||||
| Whether to match the user's IP address when reading the session data.
|
|
||||||
|
|
|
||||||
| 'sess_time_to_update'
|
|
||||||
|
|
|
||||||
| How many seconds between CI regenerating the session ID.
|
|
||||||
| NOTE: Keep it as it is to prevent security issues (https://en.wikipedia.org/wiki/Session_fixation)
|
|
||||||
|
|
|
||||||
| 'sess_regenerate_destroy'
|
|
||||||
|
|
|
||||||
| Whether to destroy session data associated with the old session ID
|
|
||||||
| when auto-regenerating the session ID. When set to FALSE, the data
|
|
||||||
| will be later deleted by the garbage collector.
|
|
||||||
|
|
|
||||||
| Other session cookie settings are shared with the rest of the application,
|
|
||||||
| except for 'cookie_prefix' and 'cookie_httponly', which are ignored here.
|
|
||||||
|
|
|
||||||
*/
|
|
||||||
$config['sess_driver'] = 'files';
|
|
||||||
$config['sess_cookie_name'] = 'sess_ci_session';
|
|
||||||
$config['sess_expiration'] = 1800; // Session expires every 30 minutes
|
|
||||||
$config['sess_save_path'] = NULL;
|
|
||||||
$config['sess_match_ip'] = FALSE;
|
|
||||||
$config['sess_time_to_update'] = 300;
|
|
||||||
$config['sess_regenerate_destroy'] = FALSE;
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Cookie Related Variables
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| 'cookie_prefix' = Set a cookie name prefix if you need to avoid collisions
|
|
||||||
| 'cookie_domain' = Set to .your-domain.com for site-wide cookies
|
|
||||||
| 'cookie_path' = Typically will be a forward slash
|
|
||||||
| 'cookie_secure' = Cookie will only be set if a secure HTTPS connection exists.
|
|
||||||
| 'cookie_httponly' = Cookie will only be accessible via HTTP(S) (no javascript)
|
|
||||||
|
|
|
||||||
| Note: These settings (with the exception of 'cookie_prefix' and
|
|
||||||
| 'cookie_httponly') will also affect sessions.
|
|
||||||
|
|
|
||||||
*/
|
|
||||||
$config['cookie_prefix'] = '';
|
|
||||||
$config['cookie_domain'] = '';
|
|
||||||
$config['cookie_path'] = '/';
|
|
||||||
$config['cookie_secure'] = FALSE;
|
|
||||||
$config['cookie_httponly'] = FALSE;
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Standardize newlines
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| Determines whether to standardize newline characters in input data,
|
|
||||||
| meaning to replace \r\n, \r, \n occurrences with the PHP_EOL value.
|
|
||||||
|
|
|
||||||
| This is particularly useful for portability between UNIX-based OSes,
|
|
||||||
| (usually \n) and Windows (\r\n).
|
|
||||||
|
|
|
||||||
*/
|
|
||||||
$config['standardize_newlines'] = FALSE;
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Global XSS Filtering
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| Determines whether the XSS filter is always active when GET, POST or
|
|
||||||
| COOKIE data is encountered
|
|
||||||
|
|
|
||||||
| WARNING: This feature is DEPRECATED and currently available only
|
|
||||||
| for backwards compatibility purposes!
|
|
||||||
|
|
|
||||||
*/
|
|
||||||
$config['global_xss_filtering'] = FALSE;
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Cross Site Request Forgery
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Enables a CSRF cookie token to be set. When set to TRUE, token will be
|
|
||||||
| checked on a submitted form. If you are accepting user data, it is strongly
|
|
||||||
| recommended CSRF protection be enabled.
|
|
||||||
|
|
|
||||||
| 'csrf_token_name' = The token name
|
|
||||||
| 'csrf_cookie_name' = The cookie name
|
|
||||||
| 'csrf_expire' = The number in seconds the token should expire.
|
|
||||||
| 'csrf_regenerate' = Regenerate token on every submission
|
|
||||||
| 'csrf_exclude_uris' = Array of URIs which ignore CSRF checks
|
|
||||||
*/
|
|
||||||
$config['csrf_protection'] = FALSE;
|
|
||||||
$config['csrf_token_name'] = 'csrf_test_name';
|
|
||||||
$config['csrf_cookie_name'] = 'csrf_cookie_name';
|
|
||||||
$config['csrf_expire'] = 7200;
|
|
||||||
$config['csrf_regenerate'] = TRUE;
|
|
||||||
$config['csrf_exclude_uris'] = array();
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Output Compression
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| Enables Gzip output compression for faster page loads. When enabled,
|
|
||||||
| the output class will test whether your server supports Gzip.
|
|
||||||
| Even if it does, however, not all browsers support compression
|
|
||||||
| so enable only if you are reasonably sure your visitors can handle it.
|
|
||||||
|
|
|
||||||
| Only used if zlib.output_compression is turned off in your php.ini.
|
|
||||||
| Please do not use it together with httpd-level output compression.
|
|
||||||
|
|
|
||||||
| VERY IMPORTANT: If you are getting a blank page when compression is enabled it
|
|
||||||
| means you are prematurely outputting something to your browser. It could
|
|
||||||
| even be a line of whitespace at the end of one of your scripts. For
|
|
||||||
| compression to work, nothing can be sent before the output buffer is called
|
|
||||||
| by the output class. Do not 'echo' any values with compression enabled.
|
|
||||||
|
|
|
||||||
*/
|
|
||||||
$config['compress_output'] = FALSE;
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Master Time Reference
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| Options are 'local' or any PHP supported timezone. This preference tells
|
|
||||||
| the system whether to use your server's local time as the master 'now'
|
|
||||||
| reference, or convert it to the configured one timezone. See the 'date
|
|
||||||
| helper' page of the user guide for information regarding date handling.
|
|
||||||
|
|
|
||||||
*/
|
|
||||||
$config['time_reference'] = 'local';
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Rewrite PHP Short Tags
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| If your PHP installation does not have short tag support enabled CI
|
|
||||||
| can rewrite the tags on-the-fly, enabling you to utilize that syntax
|
|
||||||
| in your view files. Options are TRUE or FALSE (boolean)
|
|
||||||
|
|
|
||||||
| Note: You need to have eval() enabled for this to work.
|
|
||||||
|
|
|
||||||
*/
|
|
||||||
$config['rewrite_short_tags'] = FALSE;
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Reverse Proxy IPs
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| If your server is behind a reverse proxy, you must whitelist the proxy
|
|
||||||
| IP addresses from which CodeIgniter should trust headers such as
|
|
||||||
| HTTP_X_FORWARDED_FOR and HTTP_CLIENT_IP in order to properly identify
|
|
||||||
| the visitor's IP address.
|
|
||||||
|
|
|
||||||
| You can use both an array or a comma-separated list of proxy addresses,
|
|
||||||
| as well as specifying whole subnets. Here are a few examples:
|
|
||||||
|
|
|
||||||
| Comma-separated: '10.0.1.200,192.168.5.0/24'
|
|
||||||
| Array: array('10.0.1.200', '192.168.5.0/24')
|
|
||||||
*/
|
|
||||||
$config['proxy_ips'] = '';
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| FHComplete Build Version
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| Version Number of the Current Build
|
|
||||||
| This is used to invalidate Cache for JS and CSS Files
|
|
||||||
|
|
|
||||||
| Example: 2019102901
|
|
||||||
*/
|
|
||||||
$config['fhcomplete_build_version'] = '2019102903';
|
|
||||||
@@ -1,122 +0,0 @@
|
|||||||
<?php
|
|
||||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
|
||||||
defined('DB_HOST') OR require_once './config/system.config.inc.php'; // For CLI-Migrations
|
|
||||||
|
|
||||||
/*
|
|
||||||
| -------------------------------------------------------------------
|
|
||||||
| DATABASE CONNECTIVITY SETTINGS
|
|
||||||
| -------------------------------------------------------------------
|
|
||||||
| This file will contain the settings needed to access your database.
|
|
||||||
|
|
|
||||||
| For complete instructions please consult the 'Database Connection'
|
|
||||||
| page of the User Guide.
|
|
||||||
|
|
|
||||||
| -------------------------------------------------------------------
|
|
||||||
| EXPLANATION OF VARIABLES
|
|
||||||
| -------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| ['dsn'] The full DSN string describe a connection to the database.
|
|
||||||
| ['hostname'] The hostname of your database server.
|
|
||||||
| ['username'] The username used to connect to the database
|
|
||||||
| ['password'] The password used to connect to the database
|
|
||||||
| ['database'] The name of the database you want to connect to
|
|
||||||
| ['dbdriver'] The database driver. e.g.: mysqli.
|
|
||||||
| Currently supported:
|
|
||||||
| cubrid, ibase, mssql, mysql, mysqli, oci8,
|
|
||||||
| odbc, pdo, postgre, sqlite, sqlite3, sqlsrv
|
|
||||||
| ['dbprefix'] You can add an optional prefix, which will be added
|
|
||||||
| to the table name when using the Query Builder class
|
|
||||||
| ['pconnect'] TRUE/FALSE - Whether to use a persistent connection
|
|
||||||
| ['db_debug'] TRUE/FALSE - Whether database errors should be displayed.
|
|
||||||
| ['cache_on'] TRUE/FALSE - Enables/disables query caching
|
|
||||||
| ['cachedir'] The path to the folder where cache files should be stored
|
|
||||||
| ['char_set'] The character set used in communicating with the database
|
|
||||||
| ['dbcollat'] The character collation used in communicating with the database
|
|
||||||
| NOTE: For MySQL and MySQLi databases, this setting is only used
|
|
||||||
| as a backup if your server is running PHP < 5.2.3 or MySQL < 5.0.7
|
|
||||||
| (and in table creation queries made with DB Forge).
|
|
||||||
| There is an incompatibility in PHP with mysql_real_escape_string() which
|
|
||||||
| can make your site vulnerable to SQL injection if you are using a
|
|
||||||
| multi-byte character set and are running versions lower than these.
|
|
||||||
| Sites using Latin-1 or UTF-8 database character set and collation are unaffected.
|
|
||||||
| ['swap_pre'] A default table prefix that should be swapped with the dbprefix
|
|
||||||
| ['encrypt'] Whether or not to use an encrypted connection.
|
|
||||||
|
|
|
||||||
| 'mysql' (deprecated), 'sqlsrv' and 'pdo/sqlsrv' drivers accept TRUE/FALSE
|
|
||||||
| 'mysqli' and 'pdo/mysql' drivers accept an array with the following options:
|
|
||||||
|
|
|
||||||
| 'ssl_key' - Path to the private key file
|
|
||||||
| 'ssl_cert' - Path to the public key certificate file
|
|
||||||
| 'ssl_ca' - Path to the certificate authority file
|
|
||||||
| 'ssl_capath' - Path to a directory containing trusted CA certificats in PEM format
|
|
||||||
| 'ssl_cipher' - List of *allowed* ciphers to be used for the encryption, separated by colons (':')
|
|
||||||
| 'ssl_verify' - TRUE/FALSE; Whether verify the server certificate or not ('mysqli' only)
|
|
||||||
|
|
|
||||||
| ['compress'] Whether or not to use client compression (MySQL only)
|
|
||||||
| ['stricton'] TRUE/FALSE - forces 'Strict Mode' connections
|
|
||||||
| - good for ensuring strict SQL while developing
|
|
||||||
| ['ssl_options'] Used to set various SSL options that can be used when making SSL connections.
|
|
||||||
| ['failover'] array - A array with 0 or more data for connections if the main should fail.
|
|
||||||
| ['save_queries'] TRUE/FALSE - Whether to "save" all executed queries.
|
|
||||||
| NOTE: Disabling this will also effectively disable both
|
|
||||||
| $this->db->last_query() and profiling of DB queries.
|
|
||||||
| When you run a query, with this setting set to TRUE (default),
|
|
||||||
| CodeIgniter will store the SQL statement for debugging purposes.
|
|
||||||
| However, this may cause high memory usage, especially if you run
|
|
||||||
| a lot of SQL queries ... disable this to avoid that problem.
|
|
||||||
|
|
|
||||||
| The $active_group variable lets you choose which connection group to
|
|
||||||
| make active. By default there is only one group (the 'default' group).
|
|
||||||
|
|
|
||||||
| The $query_builder variables lets you determine whether or not to load
|
|
||||||
| the query builder class.
|
|
||||||
*/
|
|
||||||
$active_group = 'default';
|
|
||||||
$query_builder = TRUE;
|
|
||||||
|
|
||||||
$db['default'] = array(
|
|
||||||
'dsn' => '',
|
|
||||||
'hostname' => DB_HOST,
|
|
||||||
'username' => DB_USER,
|
|
||||||
'password' => DB_PASSWORD,
|
|
||||||
'port' => DB_PORT,
|
|
||||||
'database' => DB_NAME,
|
|
||||||
'dbdriver' => 'postgre',
|
|
||||||
'dbprefix' => '',
|
|
||||||
'pconnect' => DB_CONNECT_PERSISTENT,
|
|
||||||
'db_debug' => (ENVIRONMENT !== 'production'),
|
|
||||||
'cache_on' => FALSE,
|
|
||||||
'cachedir' => '',
|
|
||||||
'char_set' => 'utf8',
|
|
||||||
'dbcollat' => 'utf8_general_ci',
|
|
||||||
'swap_pre' => '',
|
|
||||||
'encrypt' => FALSE,
|
|
||||||
'compress' => FALSE,
|
|
||||||
'stricton' => FALSE,
|
|
||||||
'failover' => array(),
|
|
||||||
'save_queries' => TRUE
|
|
||||||
);
|
|
||||||
|
|
||||||
$db['system'] = array(
|
|
||||||
'dsn' => '',
|
|
||||||
'hostname' => DB_HOST,
|
|
||||||
'username' => 'fhcomplete',
|
|
||||||
'password' => 'Fhcomplet3Onc4p1',
|
|
||||||
'database' => DB_NAME,
|
|
||||||
'port' => DB_PORT,
|
|
||||||
'dbschema' => 'public',
|
|
||||||
'dbdriver' => 'postgre',
|
|
||||||
'dbprefix' => '',
|
|
||||||
'pconnect' => DB_CONNECT_PERSISTENT,
|
|
||||||
'db_debug' => (ENVIRONMENT !== 'production'),
|
|
||||||
'cache_on' => FALSE,
|
|
||||||
'cachedir' => '',
|
|
||||||
'char_set' => 'utf8',
|
|
||||||
'dbcollat' => 'utf8_general_ci',
|
|
||||||
'swap_pre' => '',
|
|
||||||
'encrypt' => FALSE,
|
|
||||||
'compress' => FALSE,
|
|
||||||
'stricton' => FALSE,
|
|
||||||
'failover' => array(),
|
|
||||||
'save_queries' => TRUE
|
|
||||||
);
|
|
||||||
@@ -40,16 +40,13 @@ class StundenplanLib
|
|||||||
* @return stdClass
|
* @return stdClass
|
||||||
* @access public
|
* @access public
|
||||||
*/
|
*/
|
||||||
public function getEventsUser($start, $end, $uid = null)
|
public function getEventsUser($start, $end)
|
||||||
{
|
{
|
||||||
$this->_ci =& get_instance();
|
$this->_ci =& get_instance();
|
||||||
|
|
||||||
$this->_ci->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
|
$this->_ci->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
|
||||||
|
|
||||||
if (!$uid) {
|
$uid = getAuthUID();
|
||||||
$uid = getAuthUID();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is_null($uid))
|
if (is_null($uid))
|
||||||
return error("No UID");
|
return error("No UID");
|
||||||
|
|
||||||
@@ -220,7 +217,7 @@ class StundenplanLib
|
|||||||
* @param string $ort_kurzbz
|
* @param string $ort_kurzbz
|
||||||
* @return stdClass
|
* @return stdClass
|
||||||
*/
|
*/
|
||||||
public function getReservierungen($start_date, $end_date, $ort_kurzbz = '', $uid = null)
|
public function getReservierungen($start_date, $end_date, $ort_kurzbz = '')
|
||||||
{
|
{
|
||||||
$this->_ci =& get_instance();
|
$this->_ci =& get_instance();
|
||||||
|
|
||||||
@@ -231,14 +228,14 @@ class StundenplanLib
|
|||||||
$this->_ci->load->model('ressource/Reservierung_model', 'ReservierungModel');
|
$this->_ci->load->model('ressource/Reservierung_model', 'ReservierungModel');
|
||||||
$this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel');
|
$this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel');
|
||||||
|
|
||||||
$is_mitarbeiter = getData($this->_ci->MitarbeiterModel->isMitarbeiter($uid ?? getAuthUID()));
|
$is_mitarbeiter = getData($this->_ci->MitarbeiterModel->isMitarbeiter(getAuthUID()));
|
||||||
|
|
||||||
if ($is_mitarbeiter && empty($ort_kurzbz)) {
|
if ($is_mitarbeiter && empty($ort_kurzbz)) {
|
||||||
// request for personal lvplan show only reservations of logged in user
|
// request for personal lvplan show only reservations of logged in user
|
||||||
$reservierungen = $this->_ci->ReservierungModel->getReservierungenMitarbeiter($start_date, $end_date, $uid);
|
$reservierungen = $this->_ci->ReservierungModel->getReservierungenMitarbeiter($start_date, $end_date);
|
||||||
} else {
|
} else {
|
||||||
// querying the reservierungen
|
// querying the reservierungen
|
||||||
$reservierungen = $this->_ci->ReservierungModel->getReservierungen($start_date, $end_date, $ort_kurzbz, $uid);
|
$reservierungen = $this->_ci->ReservierungModel->getReservierungen($start_date, $end_date, $ort_kurzbz);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isError($reservierungen))
|
if (isError($reservierungen))
|
||||||
@@ -448,24 +445,6 @@ class StundenplanLib
|
|||||||
return success($ferienEventsFlattened);
|
return success($ferienEventsFlattened);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getEventsStgOrg( $start, $end, $stg_kz, $sem, $verband, $gruppe)
|
|
||||||
{
|
|
||||||
$this->_ci =& get_instance();
|
|
||||||
|
|
||||||
$this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel');
|
|
||||||
|
|
||||||
$stundenplan_data = $this->_ci->StundenplanModel->getStundenplanStudiengang($start, $end, $stg_kz, $sem, $verband, $gruppe);
|
|
||||||
if (isError($stundenplan_data))
|
|
||||||
return $stundenplan_data;
|
|
||||||
$stundenplan_data = getData($stundenplan_data) ?? [];
|
|
||||||
|
|
||||||
$function_error = $this->expandObjectInformation($stundenplan_data);
|
|
||||||
if ($function_error)
|
|
||||||
return $function_error;
|
|
||||||
|
|
||||||
return success($stundenplan_data);
|
|
||||||
}
|
|
||||||
|
|
||||||
// start of the private functions ########################################################################################################
|
// start of the private functions ########################################################################################################
|
||||||
|
|
||||||
// function used to sort an array of studiensemester strings
|
// function used to sort an array of studiensemester strings
|
||||||
|
|||||||
@@ -37,9 +37,7 @@ class DashboardLib
|
|||||||
|
|
||||||
public function getDashboardByKurzbz($dashboard_kurzbz)
|
public function getDashboardByKurzbz($dashboard_kurzbz)
|
||||||
{
|
{
|
||||||
$result = $this->_ci->DashboardModel->loadWhere([
|
$result = $this->_ci->DashboardModel->getDashboardByKurzbz($dashboard_kurzbz);
|
||||||
'dashboard_kurzbz' => $dashboard_kurzbz
|
|
||||||
]);
|
|
||||||
|
|
||||||
if (hasData($result))
|
if (hasData($result))
|
||||||
{
|
{
|
||||||
@@ -49,21 +47,17 @@ class DashboardLib
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getMergedUserConfig($dashboard_id, $uid)
|
public function getMergedConfig($dashboard_id, $uid)
|
||||||
{
|
{
|
||||||
$defaultconfig = $this->getUserBaseConfig($dashboard_id);
|
$defaultconfig = $this->getDefaultConfig($dashboard_id);
|
||||||
$userconfig = $this->getUserOverrideConfig($dashboard_id, $uid);
|
$userconfig = $this->getUserConfig($dashboard_id, $uid);
|
||||||
|
|
||||||
$sourceconfig = array_map(function ($value) {
|
$mergedconfig = array_replace_recursive($defaultconfig, $userconfig);
|
||||||
return ['source' => $value['source']];
|
|
||||||
}, $defaultconfig);
|
|
||||||
|
|
||||||
$mergedconfig = array_replace_recursive($defaultconfig, $userconfig, $sourceconfig);
|
|
||||||
|
|
||||||
return $mergedconfig;
|
return $mergedconfig;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function getUserBaseConfig($dashboard_id)
|
public function getDefaultConfig($dashboard_id)
|
||||||
{
|
{
|
||||||
$funktion_kurzbzs = [];
|
$funktion_kurzbzs = [];
|
||||||
$rights = $this->_ci->permissionlib->getAccessRights();
|
$rights = $this->_ci->permissionlib->getAccessRights();
|
||||||
@@ -93,11 +87,7 @@ class DashboardLib
|
|||||||
$preset = json_decode($presetobj->preset, true);
|
$preset = json_decode($presetobj->preset, true);
|
||||||
if (null !== $preset)
|
if (null !== $preset)
|
||||||
{
|
{
|
||||||
$preset = array_map(function ($value) use ($presetobj) {
|
$defaultconfig = array_replace_recursive($defaultconfig, $preset);
|
||||||
$value['source'] = $presetobj->funktion_kurzbz ?: self::SECTION_IF_FUNKTION_KURZBZ_IS_NULL;
|
|
||||||
return $value;
|
|
||||||
}, $preset);
|
|
||||||
$defaultconfig = array_merge_recursive($defaultconfig, $preset);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -105,7 +95,7 @@ class DashboardLib
|
|||||||
return $defaultconfig;
|
return $defaultconfig;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function getUserOverrideConfig($dashboard_id, $uid)
|
public function getUserConfig($dashboard_id, $uid)
|
||||||
{
|
{
|
||||||
$res_userconfig = $this->_ci->DashboardOverrideModel->getOverride($dashboard_id, $uid);
|
$res_userconfig = $this->_ci->DashboardOverrideModel->getOverride($dashboard_id, $uid);
|
||||||
|
|
||||||
@@ -134,7 +124,7 @@ class DashboardLib
|
|||||||
$emptyoverride = new stdClass();
|
$emptyoverride = new stdClass();
|
||||||
$emptyoverride->dashboard_id = $dashboard->dashboard_id;
|
$emptyoverride->dashboard_id = $dashboard->dashboard_id;
|
||||||
$emptyoverride->uid = $uid;
|
$emptyoverride->uid = $uid;
|
||||||
$emptyoverride->override = '[]';
|
$emptyoverride->override = '{"' . self::USEROVERRIDE_SECTION . '": {"widgets":{}}, "custom": { "widgets" : {}}}';
|
||||||
|
|
||||||
return $emptyoverride;
|
return $emptyoverride;
|
||||||
}
|
}
|
||||||
@@ -153,7 +143,8 @@ class DashboardLib
|
|||||||
$emptypreset = new stdClass();
|
$emptypreset = new stdClass();
|
||||||
$emptypreset->dashboard_id = $dashboard->dashboard_id;
|
$emptypreset->dashboard_id = $dashboard->dashboard_id;
|
||||||
$emptypreset->funktion_kurzbz = $funktion_kurzbz;
|
$emptypreset->funktion_kurzbz = $funktion_kurzbz;
|
||||||
$emptypreset->preset = '[]';
|
$section = ($funktion_kurzbz !== null) ? $funktion_kurzbz : self::SECTION_IF_FUNKTION_KURZBZ_IS_NULL;
|
||||||
|
$emptypreset->preset = '{"' . $section . '": { "widgets" : {}},"custom": { "widgets" : {}}}';
|
||||||
|
|
||||||
return $emptypreset;
|
return $emptypreset;
|
||||||
}
|
}
|
||||||
@@ -218,4 +209,44 @@ class DashboardLib
|
|||||||
|
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function addWidgetsToWidgets(&$widgets, $dashboard_kurzbz, $section, $addwigets)
|
||||||
|
{
|
||||||
|
foreach ($addwigets as $widget)
|
||||||
|
{
|
||||||
|
if(!isset($widget['widgetid']))
|
||||||
|
{
|
||||||
|
$widget['widgetid'] = $this->generateWidgetId($dashboard_kurzbz);
|
||||||
|
}
|
||||||
|
$this->addWidgetToWidgets($widgets, $section, $widget, $widget['widgetid']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function addWidgetToWidgets(&$widgets, $section, $widget, $widgetid)
|
||||||
|
{
|
||||||
|
$section = ($section !== null) ? $section : self::SECTION_IF_FUNKTION_KURZBZ_IS_NULL;
|
||||||
|
if (!isset($widgets[$section]) || !isset($widgets[$section]["widgets"]) || !is_array($widgets[$section]))
|
||||||
|
{
|
||||||
|
$widgets[$section] = array();
|
||||||
|
$widgets[$section]["widgets"] = array();
|
||||||
|
}
|
||||||
|
|
||||||
|
$widgets[$section]["widgets"][$widgetid] = $widget;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function removeWidgetFromWidgets(&$widgets, $section, $widgetid)
|
||||||
|
{
|
||||||
|
$section = ($section !== null) ? $section : self::SECTION_IF_FUNKTION_KURZBZ_IS_NULL;
|
||||||
|
if (isset($widgets[$section]) && isset($widgets[$section]["widgets"][$widgetid]))
|
||||||
|
{
|
||||||
|
unset($widgets[$section]["widgets"][$widgetid]);
|
||||||
|
if(empty($widgets[$section]["widgets"]) && $section !== self::USEROVERRIDE_SECTION) {
|
||||||
|
unset($widgets[$section]);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,7 +40,9 @@ abstract class AbstractBestandteil implements IValidation
|
|||||||
|
|
||||||
if( is_bool($new_value) && ($old_value !== $new_value) ) {
|
if( is_bool($new_value) && ($old_value !== $new_value) ) {
|
||||||
$this->modifiedcolumns[$columnname] = $columnname;
|
$this->modifiedcolumns[$columnname] = $columnname;
|
||||||
} else if($old_value != $new_value) {
|
} else if(is_null($old_value) xor is_null($new_value)) {
|
||||||
|
$this->modifiedcolumns[$columnname] = $columnname;
|
||||||
|
} else if($old_value != $new_value) {
|
||||||
$this->modifiedcolumns[$columnname] = $columnname;
|
$this->modifiedcolumns[$columnname] = $columnname;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -137,19 +137,25 @@ EOTXT;
|
|||||||
return parent::__toString() . $txt;
|
return parent::__toString() . $txt;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* public function validate()
|
public function validate()
|
||||||
{
|
{
|
||||||
if( !(filter_var($this->tage, FILTER_VALIDATE_INT,
|
$value = $this->vordienstzeit;
|
||||||
array(
|
|
||||||
'options' => array(
|
if ($value === null || $value === '') {
|
||||||
'min_range' => 1,
|
$result = null; // allow null value
|
||||||
'max_range' => 50
|
} else {
|
||||||
)
|
$result = filter_var($value, FILTER_VALIDATE_INT, [
|
||||||
)
|
'options' => [
|
||||||
)) ) {
|
'min_range' => 0,
|
||||||
$this->validationerrors[] = 'Urlaubsanspruch muss eine Tagesanzahl im Bereich 1 bis 50 sein.';
|
'max_range' => 100
|
||||||
|
]
|
||||||
|
]);
|
||||||
|
|
||||||
|
if ($result === false) {
|
||||||
|
$this->validationerrors[] = 'Vordienstjahre muss eine ganze Zahl (0 bis 100) enthalten oder leer sein.';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return parent::validate();
|
return parent::validate();
|
||||||
} */
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -234,9 +234,9 @@ class Content_model extends DB_Model
|
|||||||
FROM
|
FROM
|
||||||
campus.tbl_content c1
|
campus.tbl_content c1
|
||||||
LEFT JOIN
|
LEFT JOIN
|
||||||
campus.tbl_contentsprache s1 ON c1.content_id=s1.content_id AND s1.sprache=? AND sichtbar=true
|
campus.tbl_contentsprache s1 ON c1.content_id=s1.content_id AND s1.sprache=?
|
||||||
WHERE
|
WHERE
|
||||||
c1.aktiv = true
|
sichtbar=true
|
||||||
) s2
|
) s2
|
||||||
LEFT JOIN
|
LEFT JOIN
|
||||||
campus.tbl_contentsprache s3 USING(content_id, sprache)
|
campus.tbl_contentsprache s3 USING(content_id, sprache)
|
||||||
@@ -277,7 +277,7 @@ class Content_model extends DB_Model
|
|||||||
JOIN
|
JOIN
|
||||||
campus.tbl_contentsprache s USING(contentsprache_id)
|
campus.tbl_contentsprache s USING(contentsprache_id)
|
||||||
LEFT JOIN
|
LEFT JOIN
|
||||||
campus.tbl_contentchild k ON(m.content_id=k.content_id) and c.aktiv = true
|
campus.tbl_contentchild k ON(m.content_id=k.content_id)
|
||||||
WHERE EXISTS (
|
WHERE EXISTS (
|
||||||
SELECT 1
|
SELECT 1
|
||||||
FROM campus.tbl_contentgruppe
|
FROM campus.tbl_contentgruppe
|
||||||
|
|||||||
@@ -11,4 +11,8 @@ class Bookmark_model extends DB_Model
|
|||||||
$this->dbTable = 'dashboard.tbl_bookmark';
|
$this->dbTable = 'dashboard.tbl_bookmark';
|
||||||
$this->pk = 'bookmark_id';
|
$this->pk = 'bookmark_id';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,4 +11,15 @@ class Dashboard_model extends DB_Model
|
|||||||
$this->dbTable = 'dashboard.tbl_dashboard';
|
$this->dbTable = 'dashboard.tbl_dashboard';
|
||||||
$this->pk = 'dashboard_id';
|
$this->pk = 'dashboard_id';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Dashboard by kurzbz.
|
||||||
|
* @param string dashboard_kurzbz
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getDashboardByKurzbz($dashboard_kurzbz)
|
||||||
|
{
|
||||||
|
return $this->loadWhere(array('dashboard_kurzbz' => $dashboard_kurzbz));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,10 +18,10 @@ class Reservierung_model extends DB_Model
|
|||||||
*
|
*
|
||||||
* @return stdClass
|
* @return stdClass
|
||||||
*/
|
*/
|
||||||
public function getReservierungen($start_date, $end_date, $ort_kurzbz = null, $uid = null)
|
public function getReservierungen($start_date, $end_date, $ort_kurzbz = null)
|
||||||
{
|
{
|
||||||
|
|
||||||
$lvplan_reservierungen_query = "SELECT r.* , stund.beginn, stund.ende,
|
$lvplan_reservierungen_query="SELECT r.* , stund.beginn, stund.ende,
|
||||||
CASE
|
CASE
|
||||||
WHEN r.gruppe_kurzbz IS NOT NULL THEN r.gruppe_kurzbz
|
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),'/'))
|
ELSE CONCAT(UPPER(studg.typ),UPPER(studg.kurzbz),'-',COALESCE(CAST(r.semester AS varchar),'/'),COALESCE(CAST(r.verband AS varchar),'/'))
|
||||||
@@ -35,7 +35,7 @@ class Reservierung_model extends DB_Model
|
|||||||
LEFT JOIN public.tbl_studiensemester ss2 ON slv.studiensemester_kurzbz = ss2.studiensemester_kurzbz AND ss2.start <=r.datum AND ss2.ende >= r.datum
|
LEFT JOIN public.tbl_studiensemester ss2 ON slv.studiensemester_kurzbz = ss2.studiensemester_kurzbz AND ss2.start <=r.datum AND ss2.ende >= r.datum
|
||||||
WHERE datum >= ? AND datum <= ? AND (ss1.studiensemester_kurzbz IS NOT NULL
|
WHERE datum >= ? AND datum <= ? AND (ss1.studiensemester_kurzbz IS NOT NULL
|
||||||
OR ss2.studiensemester_kurzbz IS NOT NULL)";
|
OR ss2.studiensemester_kurzbz IS NOT NULL)";
|
||||||
|
|
||||||
$raum_reservierungen_query = "SELECT res.*, beginn, ende,
|
$raum_reservierungen_query = "SELECT res.*, beginn, ende,
|
||||||
CASE
|
CASE
|
||||||
WHEN res.gruppe_kurzbz IS NOT NULL THEN res.gruppe_kurzbz
|
WHEN res.gruppe_kurzbz IS NOT NULL THEN res.gruppe_kurzbz
|
||||||
@@ -46,9 +46,9 @@ class Reservierung_model extends DB_Model
|
|||||||
JOIN lehre.tbl_stunde ON lehre.tbl_stunde.stunde = res.stunde
|
JOIN lehre.tbl_stunde ON lehre.tbl_stunde.stunde = res.stunde
|
||||||
WHERE res.ort_kurzbz = ? AND datum >= ? AND datum <= ?";
|
WHERE res.ort_kurzbz = ? AND datum >= ? AND datum <= ?";
|
||||||
|
|
||||||
$subquery = is_null($ort_kurzbz) ? $lvplan_reservierungen_query : $raum_reservierungen_query;
|
$subquery = is_null($ort_kurzbz)? $lvplan_reservierungen_query:$raum_reservierungen_query;
|
||||||
|
|
||||||
$query_result = $this->execReadOnlyQuery("
|
$query_result= $this->execReadOnlyQuery("
|
||||||
SELECT
|
SELECT
|
||||||
'reservierung' as type, beginn, ende, datum,
|
'reservierung' as type, beginn, ende, datum,
|
||||||
COALESCE(titel, beschreibung) as topic,
|
COALESCE(titel, beschreibung) as topic,
|
||||||
@@ -59,15 +59,15 @@ class Reservierung_model extends DB_Model
|
|||||||
|
|
||||||
FROM
|
FROM
|
||||||
(
|
(
|
||||||
" . $subquery . "
|
". $subquery ."
|
||||||
) AS subquery
|
) AS subquery
|
||||||
|
|
||||||
GROUP BY datum, beginn, ende, ort_kurzbz, titel, beschreibung
|
GROUP BY datum, beginn, ende, ort_kurzbz, titel, beschreibung
|
||||||
|
|
||||||
ORDER BY datum, beginn
|
ORDER BY datum, beginn
|
||||||
", is_null($ort_kurzbz) ? [$uid ?? getAuthUID(), $uid ?? getAuthUID(), $start_date, $end_date] : [$ort_kurzbz, $start_date, $end_date]);
|
", is_null($ort_kurzbz) ?[getAuthUID(), getAuthUID(),$start_date,$end_date]: [$ort_kurzbz, $start_date, $end_date]);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return $query_result;
|
return $query_result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -76,7 +76,7 @@ class Reservierung_model extends DB_Model
|
|||||||
*
|
*
|
||||||
* @return stdClass
|
* @return stdClass
|
||||||
*/
|
*/
|
||||||
public function getReservierungenMitarbeiter($start_date, $end_date, $uid = null)
|
public function getReservierungenMitarbeiter($start_date, $end_date)
|
||||||
{
|
{
|
||||||
|
|
||||||
$raum_reservierungen_query = "SELECT res.*, beginn, ende,
|
$raum_reservierungen_query = "SELECT res.*, beginn, ende,
|
||||||
@@ -91,8 +91,8 @@ class Reservierung_model extends DB_Model
|
|||||||
|
|
||||||
$subquery = $raum_reservierungen_query;
|
$subquery = $raum_reservierungen_query;
|
||||||
|
|
||||||
|
|
||||||
$query_result = $this->execReadOnlyQuery("
|
$query_result= $this->execReadOnlyQuery("
|
||||||
SELECT
|
SELECT
|
||||||
'reservierung' as type, beginn, ende, datum,
|
'reservierung' as type, beginn, ende, datum,
|
||||||
COALESCE(titel, beschreibung) as topic,
|
COALESCE(titel, beschreibung) as topic,
|
||||||
@@ -103,13 +103,13 @@ class Reservierung_model extends DB_Model
|
|||||||
|
|
||||||
FROM
|
FROM
|
||||||
(
|
(
|
||||||
" . $subquery . "
|
". $subquery ."
|
||||||
) AS subquery
|
) AS subquery
|
||||||
|
|
||||||
GROUP BY datum, beginn, ende, ort_kurzbz, titel, beschreibung
|
GROUP BY datum, beginn, ende, ort_kurzbz, titel, beschreibung
|
||||||
|
|
||||||
ORDER BY datum, beginn
|
ORDER BY datum, beginn
|
||||||
", [$uid ?? getAuthUID(), $start_date, $end_date]);
|
", [getAuthUID(), $start_date, $end_date]);
|
||||||
|
|
||||||
|
|
||||||
return $query_result;
|
return $query_result;
|
||||||
@@ -129,9 +129,9 @@ class Reservierung_model extends DB_Model
|
|||||||
$this->addJoin('public.tbl_studiensemester ss2', 'slv.studiensemester_kurzbz=ss2.studiensemester_kurzbz AND ss2.start<=r.datum AND ss2.ende>=r.datum', 'LEFT');
|
$this->addJoin('public.tbl_studiensemester ss2', 'slv.studiensemester_kurzbz=ss2.studiensemester_kurzbz AND ss2.start<=r.datum AND ss2.ende>=r.datum', 'LEFT');
|
||||||
$this->db->or_where('ss1.studiensemester_kurzbz IS NOT NULL', null, false);
|
$this->db->or_where('ss1.studiensemester_kurzbz IS NOT NULL', null, false);
|
||||||
$this->db->or_where('ss2.studiensemester_kurzbz IS NOT NULL', null, false);
|
$this->db->or_where('ss2.studiensemester_kurzbz IS NOT NULL', null, false);
|
||||||
|
|
||||||
$query = $this->db->get_compiled_select('campus.vw_reservierung r');
|
$query = $this->db->get_compiled_select('campus.vw_reservierung r');
|
||||||
|
|
||||||
return $this->execQuery($query, [$uid, $uid]);
|
return $this->execQuery($query, [$uid, $uid]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -388,84 +388,6 @@ class Stundenplan_model extends DB_Model
|
|||||||
|
|
||||||
ORDER BY datum, beginn", [$start_date, $end_date, $ma_uid]);
|
ORDER BY datum, beginn", [$start_date, $end_date, $ma_uid]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* queries Stundenplan and filters by studiengang, semester, verband gruppe
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function getStundenplanStudiengang($start_date, $end_date, $stg_kz, $sem, $verband, $gruppe) {
|
|
||||||
|
|
||||||
$qry_params = [$start_date, $end_date, $stg_kz];
|
|
||||||
|
|
||||||
$qry = "
|
|
||||||
SELECT
|
|
||||||
'lehreinheit' as type, beginn, ende, datum,
|
|
||||||
CONCAT(lehrfach,'-',lehrform) as topic,
|
|
||||||
array_agg(DISTINCT lektor) as lektor,
|
|
||||||
array_agg(DISTINCT (gruppe,verband,semester,studiengang_kz,gruppen_kuerzel)) as gruppe,
|
|
||||||
string_agg(DISTINCT ort_kurzbz, '/') as ort_kurzbz,
|
|
||||||
array_agg(DISTINCT lehreinheit_id) as lehreinheit_id,
|
|
||||||
titel, lehrfach, lehrform, lehrfach_bez, organisationseinheit, farbe, lehrveranstaltung_id
|
|
||||||
FROM
|
|
||||||
(
|
|
||||||
SELECT unr,datum,beginn, ende,
|
|
||||||
CASE
|
|
||||||
WHEN sp.mitarbeiter_kurzbz IS NOT NULL THEN sp.mitarbeiter_kurzbz
|
|
||||||
ELSE sp.lektor
|
|
||||||
END as lektor,
|
|
||||||
CASE
|
|
||||||
WHEN gruppe_kurzbz IS NOT NULL THEN gruppe_kurzbz
|
|
||||||
ELSE CONCAT(UPPER(sp.stg_typ),UPPER(sp.stg_kurzbz),'-',COALESCE(CAST(sp.semester AS varchar),'/'),COALESCE(CAST(sp.verband AS varchar),'/'))
|
|
||||||
END as gruppen_kuerzel,
|
|
||||||
(SELECT bezeichnung
|
|
||||||
FROM public.tbl_organisationseinheit
|
|
||||||
WHERE oe_kurzbz IN(
|
|
||||||
SELECT oe_kurzbz
|
|
||||||
FROM lehre.tbl_lehrveranstaltung
|
|
||||||
WHERE lehrveranstaltung_id = sp.lehrveranstaltung_id
|
|
||||||
)) as organisationseinheit,
|
|
||||||
sp.ort_kurzbz, sp.studiengang_kz, sp.titel,sp.lehreinheit_id,sp.lehrfach_id,sp.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 (
|
|
||||||
SELECT sp.*
|
|
||||||
FROM lehre.vw_stundenplan sp
|
|
||||||
WHERE
|
|
||||||
sp.datum >= ?
|
|
||||||
AND sp.datum <= ?
|
|
||||||
) sp
|
|
||||||
JOIN lehre.tbl_stunde ON lehre.tbl_stunde.stunde = sp.stunde
|
|
||||||
WHERE studiengang_kz = ? ";
|
|
||||||
|
|
||||||
if($sem != NULL)
|
|
||||||
{
|
|
||||||
$qry_params[] = $sem;
|
|
||||||
$qry .= " AND (semester = ? OR semester IS NULL)";
|
|
||||||
}
|
|
||||||
if($verband != NULL)
|
|
||||||
{
|
|
||||||
$qry_params[] = $verband;
|
|
||||||
$qry .= " AND (verband = ? OR verband IS NULL OR verband = '0' OR verband = '')";
|
|
||||||
}
|
|
||||||
if($gruppe != NULL)
|
|
||||||
{
|
|
||||||
$qry_params[] = $gruppe;
|
|
||||||
$qry .= " AND (gruppe = ? OR gruppe IS NULL OR gruppe = '0' OR gruppe = '') ";
|
|
||||||
}
|
|
||||||
$qry.= " AND (
|
|
||||||
gruppe_kurzbz is null OR EXISTS(
|
|
||||||
SELECT 1
|
|
||||||
FROM
|
|
||||||
public.tbl_gruppe WHERE gruppe_kurzbz = sp.gruppe_kurzbz AND direktinskription = false
|
|
||||||
)
|
|
||||||
)";
|
|
||||||
|
|
||||||
$qry.= " ) as subquery
|
|
||||||
|
|
||||||
GROUP BY unr, datum, beginn, ende, titel, lehrform, lehrfach, lehrfach_bez, organisationseinheit, farbe, lehrveranstaltung_id
|
|
||||||
ORDER BY datum, beginn; ";
|
|
||||||
|
|
||||||
return $this->execReadOnlyQuery($qry, $qry_params);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* NO STANDALONE FUNCTION - Generates a SQL query string to fetch 'stundenplan' events for a specific student within the current semester.
|
* NO STANDALONE FUNCTION - Generates a SQL query string to fetch 'stundenplan' events for a specific student within the current semester.
|
||||||
|
|||||||
@@ -23,14 +23,12 @@ $includesArray = array(
|
|||||||
'public/css/components/FormUnderline.css',
|
'public/css/components/FormUnderline.css',
|
||||||
'public/css/components/abgabetool/abgabe.css',
|
'public/css/components/abgabetool/abgabe.css',
|
||||||
'public/css/Cis4/Cms.css',
|
'public/css/Cis4/Cms.css',
|
||||||
'public/css/Cis4/Studium.css'
|
'public/css/Cis4/Studium.css',
|
||||||
),
|
),
|
||||||
'customJSs' => array(
|
'customJSs' => array(
|
||||||
'vendor/npm-asset/primevue/accordion/accordion.min.js',
|
'vendor/npm-asset/primevue/accordion/accordion.min.js',
|
||||||
'vendor/npm-asset/primevue/accordiontab/accordiontab.min.js',
|
'vendor/npm-asset/primevue/accordiontab/accordiontab.min.js',
|
||||||
'vendor/npm-asset/primevue/checkbox/checkbox.min.js',
|
'vendor/npm-asset/primevue/checkbox/checkbox.min.js',
|
||||||
'vendor/npm-asset/primevue/chips/chips.min.js',
|
|
||||||
'vendor/npm-asset/primevue/multiselect/multiselect.min.js',
|
|
||||||
'vendor/npm-asset/primevue/inputnumber/inputnumber.min.js',
|
'vendor/npm-asset/primevue/inputnumber/inputnumber.min.js',
|
||||||
'vendor/npm-asset/primevue/speeddial/speeddial.min.js',
|
'vendor/npm-asset/primevue/speeddial/speeddial.min.js',
|
||||||
'vendor/npm-asset/primevue/textarea/textarea.min.js',
|
'vendor/npm-asset/primevue/textarea/textarea.min.js',
|
||||||
@@ -41,7 +39,7 @@ $includesArray = array(
|
|||||||
'vendor/moment/luxonjs/luxon.min.js'
|
'vendor/moment/luxonjs/luxon.min.js'
|
||||||
),
|
),
|
||||||
'customJSModules' => array(
|
'customJSModules' => array(
|
||||||
'public/js/apps/Cis/Cis.js',
|
'public/js/apps/Dashboard/Fhc.js',
|
||||||
),
|
),
|
||||||
|
|
||||||
);
|
);
|
||||||
@@ -49,6 +47,8 @@ $includesArray = array(
|
|||||||
$this->load->view('templates/CISVUE-Header', $includesArray);
|
$this->load->view('templates/CISVUE-Header', $includesArray);
|
||||||
?>
|
?>
|
||||||
<div id="fhccontent" class="h-100" route=<?php echo $route ?>>
|
<div id="fhccontent" class="h-100" route=<?php echo $route ?>>
|
||||||
<router-view></router-view>
|
<router-view
|
||||||
|
:view-data='<?php echo json_encode($viewData) ?>'
|
||||||
|
></router-view>
|
||||||
</div>
|
</div>
|
||||||
<?php $this->load->view('templates/CISVUE-Footer', $includesArray); ?>
|
<?php $this->load->view('templates/CISVUE-Footer', $includesArray); ?>
|
||||||
|
|||||||
@@ -315,22 +315,15 @@
|
|||||||
WHERE tpl.app = '.$APP.'
|
WHERE tpl.app = '.$APP.'
|
||||||
) pl USING(person_id)
|
) pl USING(person_id)
|
||||||
LEFT JOIN (
|
LEFT JOIN (
|
||||||
SELECT
|
SELECT DISTINCT ON (tbl_rueckstellung.person_id)
|
||||||
tbl_rueckstellung.person_id,
|
tbl_rueckstellung.person_id,
|
||||||
tbl_rueckstellung.datum_bis,
|
tbl_rueckstellung.datum_bis,
|
||||||
tbl_rueckstellung.status_kurzbz,
|
tbl_rueckstellung.status_kurzbz,
|
||||||
array_to_json(bezeichnung_mehrsprachig::varchar[])->>0 as bezeichnung
|
array_to_json(bezeichnung_mehrsprachig::varchar[])->>0 as bezeichnung
|
||||||
FROM public.tbl_rueckstellung
|
FROM public.tbl_rueckstellung
|
||||||
JOIN public.tbl_rueckstellung_status USING(status_kurzbz)
|
JOIN public.tbl_rueckstellung_status USING(status_kurzbz)
|
||||||
JOIN public.tbl_person sp ON tbl_rueckstellung.person_id = sp.person_id
|
WHERE tbl_rueckstellung.datum_bis >= NOW()
|
||||||
WHERE tbl_rueckstellung.rueckstellung_id =
|
ORDER BY tbl_rueckstellung.person_id, tbl_rueckstellung.datum_bis DESC
|
||||||
(
|
|
||||||
SELECT srueck.rueckstellung_id
|
|
||||||
FROM public.tbl_rueckstellung srueck
|
|
||||||
WHERE srueck.person_id = tbl_rueckstellung.person_id
|
|
||||||
AND datum_bis >= NOW()
|
|
||||||
ORDER BY srueck.datum_bis DESC LIMIT 1
|
|
||||||
)
|
|
||||||
) rueck ON rueck.person_id = p.person_id
|
) rueck ON rueck.person_id = p.person_id
|
||||||
WHERE
|
WHERE
|
||||||
EXISTS (
|
EXISTS (
|
||||||
|
|||||||
@@ -24,22 +24,15 @@ $query = '
|
|||||||
WHERE tpl.app = '.$APP.'
|
WHERE tpl.app = '.$APP.'
|
||||||
) pl ON p.person_id = pl.person_id
|
) pl ON p.person_id = pl.person_id
|
||||||
LEFT JOIN (
|
LEFT JOIN (
|
||||||
SELECT
|
SELECT DISTINCT ON (tbl_rueckstellung.person_id)
|
||||||
tbl_rueckstellung.person_id,
|
tbl_rueckstellung.person_id,
|
||||||
tbl_rueckstellung.datum_bis,
|
tbl_rueckstellung.datum_bis,
|
||||||
tbl_rueckstellung.status_kurzbz,
|
tbl_rueckstellung.status_kurzbz,
|
||||||
array_to_json(bezeichnung_mehrsprachig::varchar[])->>0 as bezeichnung
|
array_to_json(bezeichnung_mehrsprachig::varchar[])->>0 as bezeichnung
|
||||||
FROM public.tbl_rueckstellung
|
FROM public.tbl_rueckstellung
|
||||||
JOIN public.tbl_rueckstellung_status USING(status_kurzbz)
|
JOIN public.tbl_rueckstellung_status USING(status_kurzbz)
|
||||||
JOIN public.tbl_person sp ON tbl_rueckstellung.person_id = sp.person_id
|
WHERE tbl_rueckstellung.datum_bis >= NOW()
|
||||||
WHERE tbl_rueckstellung.rueckstellung_id =
|
ORDER BY tbl_rueckstellung.person_id, tbl_rueckstellung.datum_bis DESC
|
||||||
(
|
|
||||||
SELECT srueck.rueckstellung_id
|
|
||||||
FROM public.tbl_rueckstellung srueck
|
|
||||||
WHERE srueck.person_id = tbl_rueckstellung.person_id
|
|
||||||
AND datum_bis >= NOW()
|
|
||||||
ORDER BY srueck.datum_bis DESC LIMIT 1
|
|
||||||
)
|
|
||||||
) rueck ON rueck.person_id = p.person_id
|
) rueck ON rueck.person_id = p.person_id
|
||||||
WHERE p.person_id NOT IN (SELECT person_id FROM public.tbl_prestudent)';
|
WHERE p.person_id NOT IN (SELECT person_id FROM public.tbl_prestudent)';
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ $includesArray = array(
|
|||||||
'fontawesome6' => true,
|
'fontawesome6' => true,
|
||||||
'axios027' => true,
|
'axios027' => true,
|
||||||
'customJSModules' => array_merge([
|
'customJSModules' => array_merge([
|
||||||
'public/js/apps/Cis/Menu.js'
|
'public/js/apps/Cis.js'
|
||||||
], $customJSModules ?? []),
|
], $customJSModules ?? []),
|
||||||
'customCSSs' => array_merge([
|
'customCSSs' => array_merge([
|
||||||
'public/css/Cis4/Cis.css'
|
'public/css/Cis4/Cis.css'
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ $includesArray = array(
|
|||||||
'axios027' => true,
|
'axios027' => true,
|
||||||
'primevue3' => true,
|
'primevue3' => true,
|
||||||
'customJSModules' => array_merge([
|
'customJSModules' => array_merge([
|
||||||
'public/js/apps/Cis/Menu.js'
|
'public/js/apps/Cis.js'
|
||||||
], $customJSModules ?? []),
|
], $customJSModules ?? []),
|
||||||
'customCSSs' => array_merge([
|
'customCSSs' => array_merge([
|
||||||
'public/css/Cis4/Cis.css',
|
'public/css/Cis4/Cis.css',
|
||||||
|
|||||||
+75
-11
@@ -80,9 +80,17 @@ echo '
|
|||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/xhtml; charset=UTF-8" />
|
<meta http-equiv="Content-Type" content="text/xhtml; charset=UTF-8" />
|
||||||
|
<link rel="stylesheet" href="../../vendor/components/jqueryui/themes/base/jquery-ui.min.css" type="text/css" />
|
||||||
<link rel="stylesheet" href="../../vendor/twbs/bootstrap3/dist/css/bootstrap.min.css" type="text/css"/>
|
<link rel="stylesheet" href="../../vendor/twbs/bootstrap3/dist/css/bootstrap.min.css" type="text/css"/>
|
||||||
<link href="../../skin/style.css.php" rel="stylesheet" type="text/css" />
|
<link href="../../skin/style.css.php" rel="stylesheet" type="text/css" />
|
||||||
|
<style>
|
||||||
|
.ui-dialog-titlebar-close
|
||||||
|
{
|
||||||
|
visibility: hidden !important;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
<script type="text/javascript" src="../../vendor/components/jquery/jquery.min.js"></script>
|
<script type="text/javascript" src="../../vendor/components/jquery/jquery.min.js"></script>
|
||||||
|
<script type="text/javascript" src="../../vendor/components/jqueryui/jquery-ui.min.js"></script>
|
||||||
<script type="text/javascript" src="../../vendor/twbs/bootstrap3/dist/js/bootstrap.min.js"></script>
|
<script type="text/javascript" src="../../vendor/twbs/bootstrap3/dist/js/bootstrap.min.js"></script>
|
||||||
<script language="Javascript" type="text/javascript">
|
<script language="Javascript" type="text/javascript">
|
||||||
//<![CDATA[
|
//<![CDATA[
|
||||||
@@ -131,22 +139,78 @@ echo '
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function GebietStarten(bezeichnung,stunde,minute,sekunde,gebiet_id)
|
function GebietStarten(bezeichnung, stunde, minute, sekunde, gebiet_id)
|
||||||
{
|
{
|
||||||
var check = confirm(<?php echo "'".$p->t('testtool/okKlickenUmZuStarten')."'"?>+' '+stunde+'h '+minute+'m '+sekunde+'s');
|
let message = <?php echo "'".$p->t('testtool/okKlickenUmZuStarten')."'"?> + ' ' + stunde + 'h ' + minute + 'm ' + sekunde + 's';
|
||||||
if (check == true) {
|
let title = <?php echo "'".$p->t('testtool/startGebiet')."'"?>;
|
||||||
var sprache_user = <?php echo "'".$sprache_user."'"?>;
|
let abbrechen = <?php echo "'".$p->t('testtool/abbrechen')."'"?>;
|
||||||
document.location.href = 'frage.php?gebiet_id='+gebiet_id+'&start=true';
|
|
||||||
}
|
if ($('#gebiet-dialog').length === 0)
|
||||||
else {
|
{
|
||||||
return false;
|
$('body').append(
|
||||||
|
'<div id="gebiet-dialog" title="' + title + '">' +
|
||||||
|
'<p id="gebiet-dialog-msg">' + message + '</p>' +
|
||||||
|
'</div>'
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$('#gebiet-dialog').dialog({
|
||||||
|
modal: true,
|
||||||
|
width: 400,
|
||||||
|
resizable: false,
|
||||||
|
buttons: [
|
||||||
|
{
|
||||||
|
text: 'OK',
|
||||||
|
click: function() {
|
||||||
|
$(this).dialog('close');
|
||||||
|
document.location.href = 'frage.php?gebiet_id=' + gebiet_id + '&start=true';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: abbrechen,
|
||||||
|
click: function() {
|
||||||
|
$(this).dialog('close');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let letzteFrageBestaetigt = false;
|
||||||
|
|
||||||
function letzteFrage()
|
function letzteFrage()
|
||||||
{
|
{
|
||||||
alert(<?php echo "'".$p->t("testtool/alleFragenBeantwortet")."'"?>);
|
if (letzteFrageBestaetigt)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
let message = <?php echo "'".$p->t("testtool/alleFragenBeantwortet")."'"?>;
|
||||||
|
|
||||||
|
if ($('#fertig-dialog').length === 0)
|
||||||
|
{
|
||||||
|
$('body').append(
|
||||||
|
'<div id="fertig-dialog">' +
|
||||||
|
'<p>' + message + '</p>' +
|
||||||
|
'</div>'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#fertig-dialog').dialog({
|
||||||
|
modal: true,
|
||||||
|
width: 400,
|
||||||
|
resizable: false,
|
||||||
|
buttons: [
|
||||||
|
{
|
||||||
|
text: 'OK',
|
||||||
|
click: function() {
|
||||||
|
$(this).dialog('close');
|
||||||
|
letzteFrageBestaetigt = true;
|
||||||
|
$('[name="submitantwort"]').click();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
});
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
@@ -647,7 +711,7 @@ if($frage->frage_id!='')
|
|||||||
}
|
}
|
||||||
|
|
||||||
$letzte = $frage->getNextFrage($gebiet_id, $_SESSION['pruefling_id'], $frage_id, $demo);
|
$letzte = $frage->getNextFrage($gebiet_id, $_SESSION['pruefling_id'], $frage_id, $demo);
|
||||||
echo "<form action=\"$PHP_SELF?gebiet_id=$gebiet_id&frage_id=$frage->frage_id\" method=\"POST\" ".(!$letzte && !$levelgebiet?"onsubmit=\"letzteFrage()\"":"").">";
|
echo "<form action=\"$PHP_SELF?gebiet_id=$gebiet_id&frage_id=$frage->frage_id\" method=\"POST\" ".(!$letzte && !$levelgebiet?"onsubmit=\"return letzteFrage()\"":"").">";
|
||||||
echo '
|
echo '
|
||||||
<div class="row text-center">
|
<div class="row text-center">
|
||||||
<table class="table" style="width: 600px; margin-left: auto; margin-right: auto;">
|
<table class="table" style="width: 600px; margin-left: auto; margin-right: auto;">
|
||||||
|
|||||||
@@ -44,6 +44,27 @@ if (isset($_GET['sprache_user']) && !empty($_GET['sprache_user']))
|
|||||||
$sprache_user = (isset($_SESSION['sprache_user']) && !empty($_SESSION['sprache_user'])) ? $_SESSION['sprache_user'] : DEFAULT_LANGUAGE;
|
$sprache_user = (isset($_SESSION['sprache_user']) && !empty($_SESSION['sprache_user'])) ? $_SESSION['sprache_user'] : DEFAULT_LANGUAGE;
|
||||||
$p = new phrasen($sprache_user);
|
$p = new phrasen($sprache_user);
|
||||||
|
|
||||||
|
$showInfo = false;
|
||||||
|
if (isset($_SESSION['alleGebiete']))
|
||||||
|
{
|
||||||
|
$alleGebiete = array_map('intval', $_SESSION['alleGebiete']);
|
||||||
|
$pruefling_id = $_SESSION['pruefling_id'];
|
||||||
|
|
||||||
|
$qry = "SELECT COUNT(DISTINCT gebiet_id) as anzahl
|
||||||
|
FROM testtool.tbl_pruefling_frage
|
||||||
|
JOIN testtool.tbl_frage USING(frage_id)
|
||||||
|
WHERE gebiet_id IN (". implode(',', $alleGebiete) .")
|
||||||
|
AND pruefling_id = ". $pruefling_id ."
|
||||||
|
";
|
||||||
|
|
||||||
|
$result = $db->db_query($qry);
|
||||||
|
$anzahlGebiete = $db->db_fetch_object($result);
|
||||||
|
|
||||||
|
|
||||||
|
if ((int)$anzahlGebiete->anzahl === count($alleGebiete))
|
||||||
|
$showInfo = true;
|
||||||
|
}
|
||||||
|
|
||||||
?>
|
?>
|
||||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||||
<html>
|
<html>
|
||||||
@@ -69,6 +90,7 @@ $p = new phrasen($sprache_user);
|
|||||||
<body>
|
<body>
|
||||||
<br><br><br><br><br>
|
<br><br><br><br><br>
|
||||||
<center><h2><?php echo $p->t('testtool/zeitAbgelaufen');?></h2>
|
<center><h2><?php echo $p->t('testtool/zeitAbgelaufen');?></h2>
|
||||||
|
<h3><?php echo ($showInfo ? ($p->t('testtool/alleGebietGestartet') . "<br />" . $p->t('testtool/alleGebieteGestartetInfo')) : ''); ?></h3>
|
||||||
</center>
|
</center>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+11
-2
@@ -142,7 +142,9 @@ if (isset($_REQUEST['prestudent']))
|
|||||||
}
|
}
|
||||||
if ($reihungstest_id != '' && $rt->load($reihungstest_id))
|
if ($reihungstest_id != '' && $rt->load($reihungstest_id))
|
||||||
{
|
{
|
||||||
if ($rt->freigeschaltet)
|
$pruefling_exist = new Pruefling();
|
||||||
|
$alreadyInRT = $pruefling_exist->personAlreadyInRT($ps->person_id, $rt->reihungstest_id, $ps->prestudent_id);
|
||||||
|
if ($rt->freigeschaltet && !$alreadyInRT)
|
||||||
{
|
{
|
||||||
// regenerate Session ID after Login
|
// regenerate Session ID after Login
|
||||||
session_regenerate_id();
|
session_regenerate_id();
|
||||||
@@ -282,7 +284,14 @@ if (isset($_REQUEST['prestudent']))
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$alertmsg .= '<div class="alert alert-danger">'.$p->t('testtool/reihungstestNichtFreigeschalten').'</div>';
|
if ($alreadyInRT)
|
||||||
|
{
|
||||||
|
$alertmsg .= '<div class="alert alert-danger">'.$p->t('testtool/reihungstestNichtRegistriert').'</div>';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$alertmsg .= '<div class="alert alert-danger">'.$p->t('testtool/reihungstestNichtFreigeschalten').'</div>';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -187,6 +187,7 @@ else if (isset($_SESSION['pruefling_id']))
|
|||||||
}
|
}
|
||||||
|
|
||||||
$qry .= "
|
$qry .= "
|
||||||
|
AND ps_status.bewerbung_abgeschicktamum IS NOT NULL
|
||||||
|
|
||||||
/* Order to get last semester when using distinct on */
|
/* Order to get last semester when using distinct on */
|
||||||
ORDER BY
|
ORDER BY
|
||||||
@@ -405,6 +406,29 @@ else if (isset($_SESSION['pruefling_id']))
|
|||||||
echo '</table>';
|
echo '</table>';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isset($_SESSION['pruefling_id']) && !empty($_SESSION['alleGebiete']))
|
||||||
|
{
|
||||||
|
$alleGebiete = array_map('intval', $_SESSION['alleGebiete']);
|
||||||
|
$pruefling_id = (int)$_SESSION['pruefling_id'];
|
||||||
|
|
||||||
|
$qry = "SELECT COUNT(DISTINCT gebiet_id) AS anzahl
|
||||||
|
FROM testtool.tbl_pruefling_frage
|
||||||
|
JOIN testtool.tbl_frage USING(frage_id)
|
||||||
|
WHERE gebiet_id IN (". implode(',', $alleGebiete) .")
|
||||||
|
AND pruefling_id = ". $pruefling_id;
|
||||||
|
|
||||||
|
$result_check = $db->db_query($qry);
|
||||||
|
$row_check = $db->db_fetch_object($result_check);
|
||||||
|
|
||||||
|
if ((int)$row_check->anzahl === count($alleGebiete))
|
||||||
|
{
|
||||||
|
echo '<tr><td>
|
||||||
|
<div class="alert alert-success small" style="margin-left: 20px; width: 170px; margin-top: 3px;" role="alert">
|
||||||
|
<strong>'.$p->t('testtool/alleGebietGestartet').'</strong>
|
||||||
|
</div>
|
||||||
|
</td></tr>';
|
||||||
|
}
|
||||||
|
}
|
||||||
// Link zum Logout
|
// Link zum Logout
|
||||||
|
|
||||||
echo '<tr><td class="ItemTesttool" style="margin-left: 20px;" nowrap>
|
echo '<tr><td class="ItemTesttool" style="margin-left: 20px;" nowrap>
|
||||||
|
|||||||
@@ -70,18 +70,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"type": "package",
|
|
||||||
"package": {
|
|
||||||
"name": "drag-drop-touch-js/dragdroptouch",
|
|
||||||
"version": "2.0.3",
|
|
||||||
"source": {
|
|
||||||
"url": "https://github.com/drag-drop-touch-js/dragdroptouch.git",
|
|
||||||
"type": "git",
|
|
||||||
"reference": "master"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"type": "package",
|
"type": "package",
|
||||||
"package": {
|
"package": {
|
||||||
@@ -464,8 +452,6 @@
|
|||||||
|
|
||||||
"easyrdf/easyrdf": "0.9.*",
|
"easyrdf/easyrdf": "0.9.*",
|
||||||
|
|
||||||
"drag-drop-touch-js/dragdroptouch": "*",
|
|
||||||
|
|
||||||
"fgelinas/timepicker": "0.3.3",
|
"fgelinas/timepicker": "0.3.3",
|
||||||
"fortawesome/font-awesome4": "4.7.*",
|
"fortawesome/font-awesome4": "4.7.*",
|
||||||
"fortawesome/font-awesome6": "6.1.*",
|
"fortawesome/font-awesome6": "6.1.*",
|
||||||
|
|||||||
Generated
+1
-11
@@ -4,7 +4,7 @@
|
|||||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||||
"This file is @generated automatically"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"content-hash": "869cbc35bd1ba90ab90934fcb41b0f51",
|
"content-hash": "f4f0af4586f46f97d8b6092c1ac0fb3a",
|
||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "afarkas/html5shiv",
|
"name": "afarkas/html5shiv",
|
||||||
@@ -804,16 +804,6 @@
|
|||||||
"abandoned": true,
|
"abandoned": true,
|
||||||
"time": "2018-03-09T06:07:41+00:00"
|
"time": "2018-03-09T06:07:41+00:00"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "drag-drop-touch-js/dragdroptouch",
|
|
||||||
"version": "2.0.3",
|
|
||||||
"source": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/drag-drop-touch-js/dragdroptouch.git",
|
|
||||||
"reference": "master"
|
|
||||||
},
|
|
||||||
"type": "library"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "easyrdf/easyrdf",
|
"name": "easyrdf/easyrdf",
|
||||||
"version": "0.9.1",
|
"version": "0.9.1",
|
||||||
|
|||||||
+49
-1
@@ -25,6 +25,7 @@
|
|||||||
*/
|
*/
|
||||||
require_once(dirname(__FILE__).'/basis_db.class.php');
|
require_once(dirname(__FILE__).'/basis_db.class.php');
|
||||||
require_once(dirname(__FILE__).'/'.EXT_FKT_PATH.'/generateZahlungsreferenz.inc.php');
|
require_once(dirname(__FILE__).'/'.EXT_FKT_PATH.'/generateZahlungsreferenz.inc.php');
|
||||||
|
require_once(dirname(__FILE__).'/variable.class.php');
|
||||||
|
|
||||||
class konto extends basis_db
|
class konto extends basis_db
|
||||||
{
|
{
|
||||||
@@ -432,6 +433,8 @@ class konto extends basis_db
|
|||||||
|
|
||||||
$qry.=" ORDER BY beschreibung";
|
$qry.=" ORDER BY beschreibung";
|
||||||
|
|
||||||
|
$oehBeitrag = $this->_getOEHBeitrag();
|
||||||
|
|
||||||
if($this->db_query($qry))
|
if($this->db_query($qry))
|
||||||
{
|
{
|
||||||
while($row = $this->db_fetch_object())
|
while($row = $this->db_fetch_object())
|
||||||
@@ -440,7 +443,15 @@ class konto extends basis_db
|
|||||||
|
|
||||||
$typ->buchungstyp_kurzbz = $row->buchungstyp_kurzbz;
|
$typ->buchungstyp_kurzbz = $row->buchungstyp_kurzbz;
|
||||||
$typ->beschreibung = $row->beschreibung;
|
$typ->beschreibung = $row->beschreibung;
|
||||||
$typ->standardbetrag = $row->standardbetrag;
|
if (strtolower($typ->buchungstyp_kurzbz) === 'oeh' && $oehBeitrag)
|
||||||
|
{
|
||||||
|
$typ->standardbetrag = $oehBeitrag;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$typ->standardbetrag = $row->standardbetrag;
|
||||||
|
}
|
||||||
|
|
||||||
$typ->standardtext = $row->standardtext;
|
$typ->standardtext = $row->standardtext;
|
||||||
$typ->credit_points = $row->credit_points;
|
$typ->credit_points = $row->credit_points;
|
||||||
$typ->aktiv = $this->db_parse_bool($row->aktiv);
|
$typ->aktiv = $this->db_parse_bool($row->aktiv);
|
||||||
@@ -990,6 +1001,43 @@ class konto extends basis_db
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function _getOEHBeitrag()
|
||||||
|
{
|
||||||
|
if(!is_user_logged_in())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$variablen_obj = new variable();
|
||||||
|
$variablen_obj->loadVariables(get_uid());
|
||||||
|
|
||||||
|
$qry = "WITH semstart AS (
|
||||||
|
SELECT start FROM public.tbl_studiensemester
|
||||||
|
WHERE studiensemester_kurzbz = '". $this->db_escape($variablen_obj->variable->semester_aktuell) . "'
|
||||||
|
)
|
||||||
|
SELECT * FROM bis.tbl_oehbeitrag oehb
|
||||||
|
JOIN public.tbl_studiensemester semvon ON oehb.von_studiensemester_kurzbz = semvon.studiensemester_kurzbz
|
||||||
|
LEFT JOIN public.tbl_studiensemester sembis ON oehb.bis_studiensemester_kurzbz = sembis.studiensemester_kurzbz
|
||||||
|
JOIN semstart ON semstart.start::date >= semvon.start::date AND (sembis.studiensemester_kurzbz IS NULL OR semstart.start::date <= sembis.start::date)
|
||||||
|
ORDER BY semvon.start
|
||||||
|
LIMIT 1";
|
||||||
|
|
||||||
|
if ($this->db_query($qry))
|
||||||
|
{
|
||||||
|
if($row = $this->db_fetch_object())
|
||||||
|
{
|
||||||
|
$summe = ($row->studierendenbeitrag + $row->versicherung) * -1;
|
||||||
|
return number_format((float)$summe, 2, '.', '');
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->errormsg = 'Fehler bei der Abfrage aufgetreten';
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
|||||||
@@ -584,6 +584,32 @@ class pruefling extends basis_db
|
|||||||
|
|
||||||
$qry .= " LIMIT 1";
|
$qry .= " LIMIT 1";
|
||||||
|
|
||||||
|
if($result = $this->db_query($qry))
|
||||||
|
{
|
||||||
|
if ($this->db_num_rows($result) == 0)
|
||||||
|
return false;
|
||||||
|
else
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->errormsg = 'Fehler bei einer Abfrage';
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public function personAlreadyInRT($person_id, $reihungstest_id, $prestudent_id)
|
||||||
|
{
|
||||||
|
$qry = "SELECT tbl_prestudent.prestudent_id
|
||||||
|
FROM public.tbl_rt_person
|
||||||
|
JOIN public.tbl_prestudent ON tbl_prestudent.person_id = tbl_rt_person.person_id
|
||||||
|
JOIN public.tbl_prestudentstatus ON tbl_prestudent.prestudent_id = tbl_prestudentstatus.prestudent_id AND status_kurzbz = 'Bewerber'
|
||||||
|
AND tbl_prestudentstatus.studienplan_id = tbl_rt_person.studienplan_id
|
||||||
|
WHERE tbl_rt_person.person_id = " . $this->db_add_param($person_id) . "
|
||||||
|
AND tbl_rt_person.rt_id = " . $this->db_add_param($reihungstest_id) . "
|
||||||
|
AND tbl_prestudent.prestudent_id != " . $this->db_add_param($prestudent_id) . "
|
||||||
|
AND get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL) = 'Bewerber'
|
||||||
|
LIMIT 1";
|
||||||
|
|
||||||
if($result = $this->db_query($qry))
|
if($result = $this->db_query($qry))
|
||||||
{
|
{
|
||||||
if ($this->db_num_rows($result) == 0)
|
if ($this->db_num_rows($result) == 0)
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ $this->phrasen['testtool/basic']='Basic';
|
|||||||
$this->phrasen['testtool/basisgebiete']='Basisgebiete';
|
$this->phrasen['testtool/basisgebiete']='Basisgebiete';
|
||||||
$this->phrasen['testtool/semester']='Semester';
|
$this->phrasen['testtool/semester']='Semester';
|
||||||
$this->phrasen['testtool/reihungstestNichtFreigeschalten']='Der zuteilte Reihungstest ist noch nicht freigeschaltet';
|
$this->phrasen['testtool/reihungstestNichtFreigeschalten']='Der zuteilte Reihungstest ist noch nicht freigeschaltet';
|
||||||
|
$this->phrasen['testtool/reihungstestNichtRegistriert']='Sie sind für den Reihungstest nicht registriert';
|
||||||
$this->phrasen['testtool/reihungstestKannNichtGeladenWerden']='Der Reihungstest dem Sie zugeteilt sind, kann nicht geladen werden. Melden Sie sich bitte bei der Reihungstestaufsicht.';
|
$this->phrasen['testtool/reihungstestKannNichtGeladenWerden']='Der Reihungstest dem Sie zugeteilt sind, kann nicht geladen werden. Melden Sie sich bitte bei der Reihungstestaufsicht.';
|
||||||
$this->phrasen['testtool/geburtsdatumStimmtNichtUeberein']='Ihr Geburtsdatum stimmt nicht mit unseren Daten überein. Bitte wenden Sie sich an die Aufsichtsperson';
|
$this->phrasen['testtool/geburtsdatumStimmtNichtUeberein']='Ihr Geburtsdatum stimmt nicht mit unseren Daten überein. Bitte wenden Sie sich an die Aufsichtsperson';
|
||||||
$this->phrasen['testtool/home']='Home';
|
$this->phrasen['testtool/home']='Home';
|
||||||
@@ -31,10 +32,14 @@ $this->phrasen['testtool/keineAntwort']='Keine Antwort';
|
|||||||
$this->phrasen['testtool/speichernUndWeiter']='Speichern und weiter';
|
$this->phrasen['testtool/speichernUndWeiter']='Speichern und weiter';
|
||||||
$this->phrasen['testtool/alleFragenBeantwortet']='GLÜCKWUNSCH! \n\nSie haben alle Fragen in der zur Verfügung stehenden Zeit beantwortet. \nNutzen Sie die verbleibende Zeit, um Ihre Antworten zu kontrollieren oder fahren Sie mit dem nächsten Teilgebiet fort.';
|
$this->phrasen['testtool/alleFragenBeantwortet']='GLÜCKWUNSCH! \n\nSie haben alle Fragen in der zur Verfügung stehenden Zeit beantwortet. \nNutzen Sie die verbleibende Zeit, um Ihre Antworten zu kontrollieren oder fahren Sie mit dem nächsten Teilgebiet fort.';
|
||||||
$this->phrasen['testtool/zeitAbgelaufen']='Die Maximalzeit für dieses Gebiet ist abgelaufen, oder alle Fragen wurden beantwortet';
|
$this->phrasen['testtool/zeitAbgelaufen']='Die Maximalzeit für dieses Gebiet ist abgelaufen, oder alle Fragen wurden beantwortet';
|
||||||
|
$this->phrasen['testtool/alleGebietGestartet']='Sie haben alle Gebiete bearbeitet.';
|
||||||
|
$this->phrasen['testtool/alleGebieteGestartetInfo']='Sie können sich nun ausloggen und den Browser schließen.';
|
||||||
$this->phrasen['testtool/spracheDerTestfragen']='Gewünschte Sprache der Testfragen';
|
$this->phrasen['testtool/spracheDerTestfragen']='Gewünschte Sprache der Testfragen';
|
||||||
$this->phrasen['testtool/einleitung']='Einleitung';
|
$this->phrasen['testtool/einleitung']='Einleitung';
|
||||||
$this->phrasen['testtool/blaettern']='Blättern';
|
$this->phrasen['testtool/blaettern']='Blättern';
|
||||||
$this->phrasen['testtool/demo']='Demobeispiel ansehen';
|
$this->phrasen['testtool/demo']='Demobeispiel ansehen';
|
||||||
|
$this->phrasen['testtool/abbrechen']='Abbrechen';
|
||||||
|
$this->phrasen['testtool/startGebiet']='Gebiet starten';
|
||||||
$this->phrasen['testtool/okKlickenUmZuStarten']='Klicken Sie OK um dieses Gebiet zu starten. \nSie haben für die Bearbeitung ein Zeitlimit von';
|
$this->phrasen['testtool/okKlickenUmZuStarten']='Klicken Sie OK um dieses Gebiet zu starten. \nSie haben für die Bearbeitung ein Zeitlimit von';
|
||||||
$this->phrasen['testtool/bitteZuerstAnmelden']='Bitte zuerst anmelden!';
|
$this->phrasen['testtool/bitteZuerstAnmelden']='Bitte zuerst anmelden!';
|
||||||
$this->phrasen['testtool/fehlerBeimGenerierenDesFragenpools']='Fehler beim generieren des Fragenpools';
|
$this->phrasen['testtool/fehlerBeimGenerierenDesFragenpools']='Fehler beim generieren des Fragenpools';
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ $this->phrasen['testtool/basic']='Basic';
|
|||||||
$this->phrasen['testtool/basisgebiete']='Basic test';
|
$this->phrasen['testtool/basisgebiete']='Basic test';
|
||||||
$this->phrasen['testtool/semester']='Semester';
|
$this->phrasen['testtool/semester']='Semester';
|
||||||
$this->phrasen['testtool/reihungstestNichtFreigeschalten']='The entrance examination assigned has not yet been activated.';
|
$this->phrasen['testtool/reihungstestNichtFreigeschalten']='The entrance examination assigned has not yet been activated.';
|
||||||
|
$this->phrasen['testtool/reihungstestNichtRegistriert']='You are not registered for the placement test.';
|
||||||
$this->phrasen['testtool/reihungstestKannNichtGeladenWerden']='The placement test you are assigned to could not be loaded. Please contact the placement test supervisior.';
|
$this->phrasen['testtool/reihungstestKannNichtGeladenWerden']='The placement test you are assigned to could not be loaded. Please contact the placement test supervisior.';
|
||||||
$this->phrasen['testtool/geburtsdatumStimmtNichtUeberein']='Your date of birth does not correspond to the data we have. Please speak to the supervisor. ';
|
$this->phrasen['testtool/geburtsdatumStimmtNichtUeberein']='Your date of birth does not correspond to the data we have. Please speak to the supervisor. ';
|
||||||
$this->phrasen['testtool/home']='Home';
|
$this->phrasen['testtool/home']='Home';
|
||||||
@@ -31,10 +32,14 @@ $this->phrasen['testtool/keineAntwort']='No Answer';
|
|||||||
$this->phrasen['testtool/speichernUndWeiter']='Save and next';
|
$this->phrasen['testtool/speichernUndWeiter']='Save and next';
|
||||||
$this->phrasen['testtool/alleFragenBeantwortet']='CONGRATULATIONS!\n\nYou have answered all the questions in the time allowed.\n Use the remaining time to check your answers or continue to the next section.';
|
$this->phrasen['testtool/alleFragenBeantwortet']='CONGRATULATIONS!\n\nYou have answered all the questions in the time allowed.\n Use the remaining time to check your answers or continue to the next section.';
|
||||||
$this->phrasen['testtool/zeitAbgelaufen']='The time for this part has expired or you have answered all the questions.';
|
$this->phrasen['testtool/zeitAbgelaufen']='The time for this part has expired or you have answered all the questions.';
|
||||||
|
$this->phrasen['testtool/alleGebietGestartet']='You have worked on all sections.';
|
||||||
|
$this->phrasen['testtool/alleGebieteGestartetInfo']='You can now log out and close the browser.';
|
||||||
$this->phrasen['testtool/spracheDerTestfragen']='Desired language of questions';
|
$this->phrasen['testtool/spracheDerTestfragen']='Desired language of questions';
|
||||||
$this->phrasen['testtool/einleitung']='Introduction';
|
$this->phrasen['testtool/einleitung']='Introduction';
|
||||||
$this->phrasen['testtool/blaettern']='Browse';
|
$this->phrasen['testtool/blaettern']='Browse';
|
||||||
$this->phrasen['testtool/demo']='See an example';
|
$this->phrasen['testtool/demo']='See an example';
|
||||||
|
$this->phrasen['testtool/abbrechen']='Cancel';
|
||||||
|
$this->phrasen['testtool/startGebiet']='Start the section';
|
||||||
$this->phrasen['testtool/okKlickenUmZuStarten']='Click OK to start this section. \nYou have a timelimit of';
|
$this->phrasen['testtool/okKlickenUmZuStarten']='Click OK to start this section. \nYou have a timelimit of';
|
||||||
$this->phrasen['testtool/bitteZuerstAnmelden']='Please log in first!';
|
$this->phrasen['testtool/bitteZuerstAnmelden']='Please log in first!';
|
||||||
$this->phrasen['testtool/fehlerBeimGenerierenDesFragenpools']='Error in generating the pool of questions.';
|
$this->phrasen['testtool/fehlerBeimGenerierenDesFragenpools']='Error in generating the pool of questions.';
|
||||||
|
|||||||
Generated
-6
@@ -1,6 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "FHC-Core",
|
|
||||||
"lockfileVersion": 3,
|
|
||||||
"requires": true,
|
|
||||||
"packages": {}
|
|
||||||
}
|
|
||||||
+1
-11
@@ -147,8 +147,6 @@ html {
|
|||||||
--fhc-cis-menu-lvl-5-color-hover: var(--fhc-text);
|
--fhc-cis-menu-lvl-5-color-hover: var(--fhc-text);
|
||||||
--fhc-cis-grade-positive: var(--fhc-success);
|
--fhc-cis-grade-positive: var(--fhc-success);
|
||||||
--fhc-cis-grade-negative: var(--fhc-danger);
|
--fhc-cis-grade-negative: var(--fhc-danger);
|
||||||
|
|
||||||
--fhc-offcanvas-zindex: 1045;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#themeSwitch i{
|
#themeSwitch i{
|
||||||
@@ -377,7 +375,7 @@ html {
|
|||||||
/* searchbar */
|
/* searchbar */
|
||||||
#nav-search {
|
#nav-search {
|
||||||
background-color: var(--fhc-primary);
|
background-color: var(--fhc-primary);
|
||||||
z-index: calc(var(--fhc-offcanvas-zindex) + 1) !important;
|
z-index: 1;
|
||||||
}
|
}
|
||||||
#nav-search.me-3 {
|
#nav-search.me-3 {
|
||||||
margin: 0 !important;
|
margin: 0 !important;
|
||||||
@@ -415,18 +413,10 @@ html {
|
|||||||
color: var(--fhc-link) !important;
|
color: var(--fhc-link) !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
#nav-main {
|
|
||||||
z-index: var(--fhc-offcanvas-zindex);
|
|
||||||
}
|
|
||||||
|
|
||||||
#nav-main-sticky {
|
#nav-main-sticky {
|
||||||
max-height: calc(100vh - var(--fhc-cis-header-height));
|
max-height: calc(100vh - var(--fhc-cis-header-height));
|
||||||
}
|
}
|
||||||
|
|
||||||
#nav-user-menu {
|
|
||||||
z-index: calc(var(--fhc-offcanvas-zindex) + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
#nav-user-menu img {
|
#nav-user-menu img {
|
||||||
object-fit: cover;
|
object-fit: cover;
|
||||||
height: calc( 3 * var(--fhc-cis-header-py));
|
height: calc( 3 * var(--fhc-cis-header-py));
|
||||||
|
|||||||
@@ -197,10 +197,6 @@ html.fs_huge {
|
|||||||
margin-bottom: -1px;
|
margin-bottom: -1px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tiny-90 div.tox.tox-tinymce {
|
|
||||||
height: 90% !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* slim begin */
|
/* slim begin */
|
||||||
.stv .form-label {
|
.stv .form-label {
|
||||||
margin-bottom: .15rem;
|
margin-bottom: .15rem;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
@import './dashboard/news.css';
|
@import './dashboard/news.css';
|
||||||
@import './dashboard/LvPlan.css';
|
@import './dashboard/LvPlan.css';
|
||||||
|
|
||||||
:root {
|
:root{
|
||||||
--fhc-dashboard-danger: var(--fhc-danger, #842029);
|
--fhc-dashboard-danger: var(--fhc-danger, #842029);
|
||||||
--fhc-dashboard-grid-size: 4;
|
--fhc-dashboard-grid-size: 4;
|
||||||
--fhc-dashboard-link: var(--fhc-link, #0a57ca);
|
--fhc-dashboard-link: var(--fhc-link, #0a57ca);
|
||||||
@@ -17,16 +17,22 @@
|
|||||||
--fhc-dashboard-section-info-color-hover: var(--fhc-primary-highlight, #005585);
|
--fhc-dashboard-section-info-color-hover: var(--fhc-primary-highlight, #005585);
|
||||||
}
|
}
|
||||||
|
|
||||||
.core-dashboard a {
|
@media(max-width: 577px) {
|
||||||
|
:root {
|
||||||
|
--fhc-dashboard-grid-size: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.core-dashboard a{
|
||||||
color: var(--fhc-dashboard-link);
|
color: var(--fhc-dashboard-link);
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: 576px) {
|
@media (max-width: 576px){
|
||||||
.widget-icon {
|
.widget-icon {
|
||||||
max-height: 250px;
|
max-height: 250px;
|
||||||
object-fit: cover;
|
object-fit: cover;
|
||||||
}
|
}
|
||||||
.widget-icon-container {
|
.widget-icon-container{
|
||||||
max-width: 250px;
|
max-width: 250px;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
margin-right: auto;
|
margin-right: auto;
|
||||||
@@ -40,36 +46,27 @@
|
|||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
background-position: center;
|
background-position: center;
|
||||||
background-size: cover;
|
background-size: cover;
|
||||||
cursor: pointer;
|
cursor:pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dashboard-section.edit-active {
|
.dashboard-section > .newGridRow{
|
||||||
/**
|
position:absolute;
|
||||||
* replaces margin for extra row
|
width:20px;
|
||||||
* 10% equals 0.1 of 100%
|
height:20px;
|
||||||
* 1rem equals the padding of pb-3 that is overwritten here
|
padding:0;
|
||||||
*/
|
bottom:0;
|
||||||
padding-bottom: calc(10% / var(--fhc-dashboard-grid-size) + 1rem) !important;
|
left:50%;
|
||||||
}
|
transform:translate(-50%, 50%);
|
||||||
|
|
||||||
.dashboard-section > .newGridRow {
|
|
||||||
position: absolute;
|
|
||||||
width: 20px;
|
|
||||||
height: 20px;
|
|
||||||
padding: 0;
|
|
||||||
bottom: 0;
|
|
||||||
left: 50%;
|
|
||||||
transform: translate(-50%, 50%);
|
|
||||||
background-color: var(--fhc-dashboard-gridrow-background);
|
background-color: var(--fhc-dashboard-gridrow-background);
|
||||||
}
|
}
|
||||||
|
|
||||||
.newGridRow:hover {
|
.newGridRow:hover {
|
||||||
color: white;
|
color:white;
|
||||||
background-color: var(--fhc-dashboard-gridrow-background-highlight);
|
background-color: var(--fhc-dashboard-gridrow-background-highlight);
|
||||||
}
|
}
|
||||||
|
|
||||||
.empty-tile-hover:hover {
|
.empty-tile-hover:hover {
|
||||||
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="-500 -500 1448 1512"><path fill="rgb(211, 211, 211)" d="M64 32C28.7 32 0 60.7 0 96V416c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V96c0-35.3-28.7-64-64-64H64zM200 344V280H136c-13.3 0-24-10.7-24-24s10.7-24 24-24h64V168c0-13.3 10.7-24 24-24s24 10.7 24 24v64h64c13.3 0 24 10.7 24 24s-10.7 24-24 24H248v64c0 13.3-10.7 24-24 24s-24-10.7-24-24z"/></svg>');
|
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="-500 -500 1448 1512"><path fill="rgb(211, 211, 211)" d="M64 32C28.7 32 0 60.7 0 96V416c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V96c0-35.3-28.7-64-64-64H64zM200 344V280H136c-13.3 0-24-10.7-24-24s10.7-24 24-24h64V168c0-13.3 10.7-24 24-24s24 10.7 24 24v64h64c13.3 0 24 10.7 24 24s-10.7 24-24 24H248v64c0 13.3-10.7 24-24 24s-24-10.7-24-24z"/></svg>');
|
||||||
}
|
}
|
||||||
|
|
||||||
.alert-danger .form-check-input:checked {
|
.alert-danger .form-check-input:checked {
|
||||||
@@ -77,6 +74,16 @@
|
|||||||
background-color: var(--fhc-dashboard-danger);
|
background-color: var(--fhc-dashboard-danger);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
:root {
|
||||||
|
--fhc-dashboard-grid-size: 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media(max-width: 1400px) {
|
||||||
|
:root {
|
||||||
|
--fhc-dashboard-grid-size: 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@media(max-width: 1200px) {
|
@media(max-width: 1200px) {
|
||||||
:root {
|
:root {
|
||||||
--fhc-dashboard-grid-size: 3;
|
--fhc-dashboard-grid-size: 3;
|
||||||
@@ -98,7 +105,6 @@
|
|||||||
@media(max-width: 577px) {
|
@media(max-width: 577px) {
|
||||||
:root {
|
:root {
|
||||||
--fhc-dashboard-grid-size: 1;
|
--fhc-dashboard-grid-size: 1;
|
||||||
--fhc-dg-item-py: .75rem;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -126,64 +132,50 @@
|
|||||||
cursor: move !important;
|
cursor: move !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.drop-grid-item-resize > .dashboard-item,
|
.draggedItem {
|
||||||
.drop-grid-item-move > .dashboard-item {
|
|
||||||
height: 100%;
|
height: 100%;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
background-color: var(--fhc-dashboard-draggeditem-background);
|
background-color: var(--fhc-dashboard-draggeditem-background);
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
.drop-grid-item-resize > .dashboard-item > *,
|
.dashboard-item-overlay{
|
||||||
.drop-grid-item-move > .dashboard-item > * {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.drop-grid-item-sizechanged > .dashboard-item,
|
|
||||||
.drop-grid-item-move > .dashboard-item {
|
|
||||||
background-color: var(--fhc-dashboard-item-overlay-background);
|
background-color: var(--fhc-dashboard-item-overlay-background);
|
||||||
}
|
}
|
||||||
|
|
||||||
.drop-grid-item-sizechanged > .dashboard-item::before,
|
.dashboard-item-overlay::before{
|
||||||
.drop-grid-item-move > .dashboard-item::before {
|
position:absolute;
|
||||||
position: absolute;
|
content:"";
|
||||||
content: "";
|
top:0.25rem;
|
||||||
top: .25rem;
|
left:0.25rem;
|
||||||
left: .25rem;
|
right:0.25rem;
|
||||||
right: .25rem;
|
bottom:0.25rem;
|
||||||
bottom: .25rem;
|
border:4px dashed var(--fhc-dashboard-item-overly-border-color);
|
||||||
border: 4px dashed var(--fhc-dashboard-item-overly-border-color);
|
opacity: 0.5;
|
||||||
opacity: .5;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.drop-grid-item-oversized > .dashboard-item {
|
#deleteBookmark i{
|
||||||
/* Bootstrap: border-danger */
|
|
||||||
--bs-border-opacity: 1;
|
|
||||||
border-color: rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
#deleteBookmark i {
|
|
||||||
color: var(--fhc-dashboard-danger);
|
color: var(--fhc-dashboard-danger);
|
||||||
}
|
}
|
||||||
|
|
||||||
.pin:hover {
|
.pin:hover{
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
.pin[pinned]:hover {
|
.pin[pinned]:hover{
|
||||||
color: var(--fhc-dashboard-pin-pinned-hover-color);
|
color: var(--fhc-dashboard-pin-pinned-hover-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
.section-info {
|
.section-info{
|
||||||
color: var(--fhc-dashboard-section-info-color);
|
color: var(--fhc-dashboard-section-info-color);
|
||||||
cursor: pointer;
|
cursor:pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
.section-info:hover {
|
.section-info:hover {
|
||||||
color: var(--fhc-dashboard-section-info-color-hover);
|
color: var(--fhc-dashboard-section-info-color-hover);
|
||||||
}
|
}
|
||||||
|
|
||||||
.drop-grid-item-blocker [pinned='true'] {
|
.denied-dragging-animation {
|
||||||
animation: wiggle 0.5s linear;
|
animation: wiggle 0.5s linear;
|
||||||
color: var(--fhc-dashboard-denied-dragging-animation-color) !important;
|
color: var(--fhc-dashboard-denied-dragging-animation-color) !important;
|
||||||
}
|
}
|
||||||
@@ -212,13 +204,13 @@
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.hidden-widget {
|
.hiddenWidget{
|
||||||
background: var(--fhc-disabled-background);
|
background: var(--fhc-disabled-background);
|
||||||
opacity: 40%;
|
opacity: 40%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.hidden-widget .card,
|
.hiddenWidget .card,
|
||||||
.hidden-widget .card-body,
|
.hiddenWidget .card-body,
|
||||||
.hidden-widget .card-body * {
|
.hiddenWidget .card-body *{
|
||||||
background: inherit !important;
|
background: inherit !important;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export default {
|
|||||||
getViewData() {
|
getViewData() {
|
||||||
return {
|
return {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/api/frontend/v1/Cis4FhcApi/dashboardViewData'
|
url: '/api/frontend/v1/Cis4FhcApi/getViewData'
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (C) 2026 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/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
export default {
|
|
||||||
getAllStudienSemester(studiensemester, studiengang, semester, studienplan) {
|
|
||||||
return {
|
|
||||||
method: 'get',
|
|
||||||
url: 'api/frontend/v1/Studium/getStudienAllSemester/',
|
|
||||||
params: {studiensemester, studiengang, semester, studienplan}
|
|
||||||
};
|
|
||||||
},
|
|
||||||
}
|
|
||||||
@@ -16,12 +16,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
getMyLvPlanViewData() {
|
|
||||||
return {
|
|
||||||
method: 'get',
|
|
||||||
url: `/api/frontend/v1/LvPlan/myLvPlanViewData`,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
getRoomInfo(ort_kurzbz, start_date, end_date) {
|
getRoomInfo(ort_kurzbz, start_date, end_date) {
|
||||||
return {
|
return {
|
||||||
method: 'post',
|
method: 'post',
|
||||||
@@ -36,11 +30,11 @@ export default {
|
|||||||
params: { start_date, end_date, lv_id }
|
params: { start_date, end_date, lv_id }
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
eventsPersonal(start_date, end_date, uid = null) {
|
eventsPersonal(start_date, end_date) {
|
||||||
return {
|
return {
|
||||||
method: 'post',
|
method: 'post',
|
||||||
url: '/api/frontend/v1/lvPlan/eventsPersonal',
|
url: '/api/frontend/v1/lvPlan/eventsPersonal',
|
||||||
params: { start_date, end_date, uid }
|
params: { start_date, end_date }
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
eventsLv(lv_id, start_date, end_date) {
|
eventsLv(lv_id, start_date, end_date) {
|
||||||
@@ -63,11 +57,11 @@ export default {
|
|||||||
params: { start_date, end_date }
|
params: { start_date, end_date }
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
getLvPlanReservierungen(start_date, end_date, uid = null) {
|
getLvPlanReservierungen(start_date, end_date) {
|
||||||
return {
|
return {
|
||||||
method: 'post',
|
method: 'post',
|
||||||
url: '/api/frontend/v1/LvPlan/getReservierungen',
|
url: '/api/frontend/v1/LvPlan/getReservierungen',
|
||||||
params: { start_date, end_date, uid }
|
params: { start_date, end_date }
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
getLehreinheitStudiensemester(lehreinheit_id) {
|
getLehreinheitStudiensemester(lehreinheit_id) {
|
||||||
@@ -98,42 +92,5 @@ export default {
|
|||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/api/frontend/v1/LvPlan/getLv/' + lehrveranstaltung_id
|
url: '/api/frontend/v1/LvPlan/getLv/' + lehrveranstaltung_id
|
||||||
};
|
};
|
||||||
},
|
}
|
||||||
eventsStgOrg(start_date, end_date, stg_kz, sem, verband, gruppe) {
|
|
||||||
return {
|
|
||||||
method: 'post',
|
|
||||||
url: '/api/frontend/v1/lvPlan/eventsStgOrg',
|
|
||||||
params: { start_date, end_date, stg_kz, sem, verband, gruppe }
|
|
||||||
};
|
|
||||||
},
|
|
||||||
getStudiengaenge(){
|
|
||||||
return {
|
|
||||||
method: 'get',
|
|
||||||
url: '/api/frontend/v1/lvPlan/getStudiengaenge'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
getLehrverband(stg_kz, sem){
|
|
||||||
return {
|
|
||||||
method: 'get',
|
|
||||||
url: `/api/frontend/v1/lvPlan/getLehrverband/${stg_kz}/${sem}`
|
|
||||||
}
|
|
||||||
},
|
|
||||||
getGruppe(stg_kz, sem, verband){
|
|
||||||
return {
|
|
||||||
method: 'get',
|
|
||||||
url: `/api/frontend/v1/lvPlan/getLehrverband/${stg_kz}/${sem}/${verband}`
|
|
||||||
}
|
|
||||||
},
|
|
||||||
checkPermissionOtherLvPlan(){
|
|
||||||
return {
|
|
||||||
method: 'get',
|
|
||||||
url: '/api/frontend/v1/lvPlan/permissionOtherLvPlan',
|
|
||||||
}
|
|
||||||
},
|
|
||||||
getCompactibleEventTypes(){
|
|
||||||
return {
|
|
||||||
method: 'get',
|
|
||||||
url: '/api/frontend/v1/lvPlan/compactibleEventTypes',
|
|
||||||
}
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (C) 2025 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/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
export default {
|
|
||||||
getOtherLvPlanViewData(uid) {
|
|
||||||
return {
|
|
||||||
method: 'get',
|
|
||||||
url: `/api/frontend/v1/OtherLvPlan/otherLvPlanViewData/${uid}`,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
};
|
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
|
||||||
getProfilViewData(uid = null) {
|
profilViewData(uid) {
|
||||||
let url = "/api/frontend/v1/Profil/profilViewData";
|
let url = "/api/frontend/v1/Profil/profilViewData";
|
||||||
if(uid){
|
if(uid){
|
||||||
url += `/${uid}`;
|
url += `/${uid}`;
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (C) 2025 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/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
export default {
|
|
||||||
getStgOrgLvPlanViewData(uid) {
|
|
||||||
return {
|
|
||||||
method: 'get',
|
|
||||||
url: `/api/frontend/v1/StgOrgLvPlan/stgOrgLvPlanViewData`,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
};
|
|
||||||
@@ -38,6 +38,10 @@ export default {
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
insert(params) {
|
insert(params) {
|
||||||
|
if(params.betrag)
|
||||||
|
{
|
||||||
|
params.betrag = params.betrag.replace(',', '.');
|
||||||
|
}
|
||||||
return {
|
return {
|
||||||
method: 'post',
|
method: 'post',
|
||||||
url: 'api/frontend/v1/stv/konto/insert',
|
url: 'api/frontend/v1/stv/konto/insert',
|
||||||
@@ -52,6 +56,10 @@ export default {
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
edit(params) {
|
edit(params) {
|
||||||
|
if(params.betrag)
|
||||||
|
{
|
||||||
|
params.betrag = params.betrag.replace(',', '.');
|
||||||
|
}
|
||||||
return {
|
return {
|
||||||
method: 'post',
|
method: 'post',
|
||||||
url: 'api/frontend/v1/stv/konto/update',
|
url: 'api/frontend/v1/stv/konto/update',
|
||||||
@@ -65,10 +73,14 @@ export default {
|
|||||||
params: { buchungsnr }
|
params: { buchungsnr }
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
getBuchungstypen() {
|
getBuchungstypen(studiensemester_kurzbz) {
|
||||||
|
let url = 'api/frontend/v1/stv/konto/getBuchungstypen'
|
||||||
|
if (!!studiensemester_kurzbz)
|
||||||
|
url = url + '/' + encodeURIComponent(studiensemester_kurzbz);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: 'api/frontend/v1/stv/konto/getBuchungstypen'
|
url: url
|
||||||
};
|
};
|
||||||
}
|
},
|
||||||
};
|
};
|
||||||
@@ -17,7 +17,6 @@
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
getBookmarks() {
|
getBookmarks() {
|
||||||
|
|
||||||
return {
|
return {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/api/frontend/v1/Bookmark/getBookmarks'
|
url: '/api/frontend/v1/Bookmark/getBookmarks'
|
||||||
@@ -29,24 +28,18 @@ export default {
|
|||||||
url: `/api/frontend/v1/Bookmark/delete/${bookmark_id}`
|
url: `/api/frontend/v1/Bookmark/delete/${bookmark_id}`
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
update({ bookmark_id, url, title, tag }) {
|
update({ bookmark_id, url, title, tag=null }) {
|
||||||
return {
|
return {
|
||||||
method: 'post',
|
method: 'post',
|
||||||
url: `/api/frontend/v1/Bookmark/update/${bookmark_id}`,
|
url: `/api/frontend/v1/Bookmark/update/${bookmark_id}`,
|
||||||
params: { url, title, tag }
|
params: { url, title }
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
insert({ url, title, tag, sort }) {
|
insert({ url, title, tag }) {
|
||||||
return {
|
return {
|
||||||
method: 'post',
|
method: 'post',
|
||||||
url: `/api/frontend/v1/Bookmark/insert`,
|
url: `/api/frontend/v1/Bookmark/insert`,
|
||||||
params: { url, title, tag, sort }
|
params: { url, title, tag }
|
||||||
};
|
};
|
||||||
},
|
|
||||||
changeOrder(bookmark_id1, bookmark_id2) {
|
|
||||||
return {
|
|
||||||
method: 'post',
|
|
||||||
url: `/api/frontend/v1/Bookmark/changeOrder/${bookmark_id1}/${bookmark_id2}`,
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -1,12 +1,11 @@
|
|||||||
import FhcSearchbar from "../../components/searchbar/searchbar.js";
|
import FhcSearchbar from "../components/searchbar/searchbar.js";
|
||||||
import CisMenu from "../../components/Cis/Menu.js";
|
import CisMenu from "../components/Cis/Menu.js";
|
||||||
import PluginsPhrasen from '../../plugins/Phrasen.js';
|
import PluginsPhrasen from '../plugins/Phrasen.js';
|
||||||
import Theme from "../../plugins/Theme.js";
|
import ApiSearchbar from '../api/factory/searchbar.js';
|
||||||
import ApiSearchbar from '../../api/factory/searchbar.js';
|
import Theme from "../plugins/Theme.js";
|
||||||
import ApiLvPlan from "../../api/factory/lvPlan.js";
|
|
||||||
|
|
||||||
const app = Vue.createApp({
|
const app = Vue.createApp({
|
||||||
name: 'CisMenuApp',
|
name: 'CisApp',
|
||||||
components: {
|
components: {
|
||||||
FhcSearchbar,
|
FhcSearchbar,
|
||||||
CisMenu
|
CisMenu
|
||||||
@@ -137,53 +136,11 @@ const app = Vue.createApp({
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
|
||||||
isMobile() {
|
|
||||||
const smallScreen = window.matchMedia("(max-width: 767px)").matches;
|
|
||||||
const touchCapable = ("ontouchstart" in window) || navigator.maxTouchPoints > 0;
|
|
||||||
return smallScreen;// && touchCapable;
|
|
||||||
},
|
|
||||||
},
|
|
||||||
provide() {
|
|
||||||
return {
|
|
||||||
isMobile: this.isMobile
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
methods: {
|
||||||
searchfunction: function(searchsettings) {
|
searchfunction: function(searchsettings) {
|
||||||
return this.$api.call(ApiSearchbar.searchCis(searchsettings));
|
return this.$api.call(ApiSearchbar.searchCis(searchsettings));
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
async mounted() {
|
|
||||||
const openOtherLvPlanAction = {
|
|
||||||
label: Vue.computed(() => this.$p.t("lehre/stundenplan")),
|
|
||||||
icon: "fas fa-calendar-days",
|
|
||||||
type: "link",
|
|
||||||
action: function (data) {
|
|
||||||
const uid = JSON.parse(data.data).uid;
|
|
||||||
const link =
|
|
||||||
FHC_JS_DATA_STORAGE_OBJECT.app_root +
|
|
||||||
FHC_JS_DATA_STORAGE_OBJECT.ci_router +
|
|
||||||
"/Cis/OtherLvPlan/" +
|
|
||||||
uid;
|
|
||||||
return link;
|
|
||||||
},
|
|
||||||
};
|
|
||||||
let checkPermissionOtherLvPlanResult = await this.$api.call(
|
|
||||||
ApiLvPlan.checkPermissionOtherLvPlan(),
|
|
||||||
);
|
|
||||||
if (
|
|
||||||
checkPermissionOtherLvPlanResult.meta.status === "success" &&
|
|
||||||
checkPermissionOtherLvPlanResult.data
|
|
||||||
) {
|
|
||||||
this.searchbaroptions.actions.employee.childactions.push(
|
|
||||||
openOtherLvPlanAction,
|
|
||||||
);
|
|
||||||
this.searchbaroptions.actions.student.childactions.push(
|
|
||||||
openOtherLvPlanAction,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
|
|
||||||
FhcApps.makeExtendable(app);
|
FhcApps.makeExtendable(app);
|
||||||
@@ -3,10 +3,13 @@ import DashboardAdmin from '../../components/Dashboard/Admin.js';
|
|||||||
|
|
||||||
import PluginsPhrasen from '../../plugins/Phrasen.js';
|
import PluginsPhrasen from '../../plugins/Phrasen.js';
|
||||||
|
|
||||||
|
import ApiRenderers from '../../api/factory/renderers.js';
|
||||||
|
|
||||||
const app = Vue.createApp({
|
const app = Vue.createApp({
|
||||||
name: 'DashboardAdminApp',
|
name: 'DashboardAdminApp',
|
||||||
data: () => ({
|
data: () => ({
|
||||||
appSideMenuEntries: {}
|
appSideMenuEntries: {},
|
||||||
|
renderers: null
|
||||||
}),
|
}),
|
||||||
components: {
|
components: {
|
||||||
CoreNavigationCmpt,
|
CoreNavigationCmpt,
|
||||||
@@ -14,16 +17,51 @@ const app = Vue.createApp({
|
|||||||
},
|
},
|
||||||
provide() {
|
provide() {
|
||||||
return {
|
return {
|
||||||
|
// TODO(chris): move those two into the components that need it
|
||||||
|
renderers: Vue.computed(() => this.renderers),
|
||||||
timezone: FHC_JS_DATA_STORAGE_OBJECT.timezone
|
timezone: FHC_JS_DATA_STORAGE_OBJECT.timezone
|
||||||
};
|
};
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.$api
|
||||||
|
.call(ApiRenderers.loadRenderers())
|
||||||
|
.then(res => {
|
||||||
|
for (let rendertype of Object.keys(res.data)) {
|
||||||
|
let modalTitle = null;
|
||||||
|
let modalContent = null;
|
||||||
|
let calendarEvent = null;
|
||||||
|
if (res.data[rendertype].modalTitle)
|
||||||
|
modalTitle = Vue.markRaw(Vue.defineAsyncComponent(() => import(res.data[rendertype].modalTitle)));
|
||||||
|
if (res.data[rendertype].modalContent)
|
||||||
|
modalContent = Vue.markRaw(Vue.defineAsyncComponent(() => import(res.data[rendertype].modalContent)));
|
||||||
|
if (res.data[rendertype].calendarEvent)
|
||||||
|
calendarEvent = Vue.markRaw(Vue.defineAsyncComponent(() => import(res.data[rendertype].calendarEvent)));
|
||||||
|
|
||||||
|
if (res.data[rendertype].calendarEventStyles) {
|
||||||
|
var head = document.head;
|
||||||
|
if (!head.querySelector(`link[href="${res.data[rendertype].calendarEventStyles}"]`)) {
|
||||||
|
var link = document.createElement("link");
|
||||||
|
link.type = "text/css";
|
||||||
|
link.rel = "stylesheet";
|
||||||
|
link.href = res.data[rendertype].calendarEventStyles;
|
||||||
|
head.appendChild(link);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(this.$fhcAlert.handleSystemErrors);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
app.use(primevue.config.default, {
|
|
||||||
zIndex: {
|
|
||||||
overlay: 9000,
|
|
||||||
tooltip: 8000
|
|
||||||
}
|
|
||||||
})
|
|
||||||
app.use(PluginsPhrasen);
|
app.use(PluginsPhrasen);
|
||||||
app.directive('tooltip', primevue.tooltip);
|
app.directive('tooltip', primevue.tooltip);
|
||||||
app.mount('#main');
|
app.mount('#main');
|
||||||
@@ -4,27 +4,25 @@ import Theme from '../../plugins/Theme.js';
|
|||||||
import contrast from '../../directives/contrast.js';
|
import contrast from '../../directives/contrast.js';
|
||||||
import {setScrollbarWidth} from "../../helpers/CssVarCalcHelpers.js";
|
import {setScrollbarWidth} from "../../helpers/CssVarCalcHelpers.js";
|
||||||
import LvPlan from "../../components/Cis/LvPlan/Lehrveranstaltung.js";
|
import LvPlan from "../../components/Cis/LvPlan/Lehrveranstaltung.js";
|
||||||
import MyLvPlan from "../../components/Cis/LvPlan/MyLvPlan.js";
|
import MyLvPlan from "../../components/Cis/LvPlan/Personal.js";
|
||||||
import MylvStudent from "../../components/Cis/Mylv/Student.js";
|
import MylvStudent from "../../components/Cis/Mylv/Student.js";
|
||||||
import Profil from "../../components/Cis/Profil/Profil.js";
|
import Profil from "../../components/Cis/Profil/Profil.js";
|
||||||
import Raumsuche from "../../components/Cis/Raumsuche/Raumsuche.js";
|
import Raumsuche from "../../components/Cis/Raumsuche/Raumsuche.js";
|
||||||
import CmsNews from "../../components/Cis/Cms/News.js";
|
import CmsNews from "../../components/Cis/Cms/News.js";
|
||||||
import CmsContent from "../../components/Cis/Cms/Content.js";
|
import CmsContent from "../../components/Cis/Cms/Content.js";
|
||||||
import Info from "../../components/Cis/Mylv/Semester/Studiengang/Lv/Info.js";
|
import Info from "../../components/Cis/Mylv/Semester/Studiengang/Lv/Info.js";
|
||||||
import RoomInformation, {DEFAULT_MODE_RAUMINFO_DESKTOP, DEFAULT_MODE_RAUMINFO_MOBILE} from "../../components/Cis/Mylv/RoomInformation.js";
|
import RoomInformation, {DEFAULT_MODE_RAUMINFO} from "../../components/Cis/Mylv/RoomInformation.js";
|
||||||
import AbgabetoolStudent from "../../components/Cis/Abgabetool/AbgabetoolStudent.js";
|
import AbgabetoolStudent from "../../components/Cis/Abgabetool/AbgabetoolStudent.js";
|
||||||
import AbgabetoolMitarbeiter from "../../components/Cis/Abgabetool/AbgabetoolMitarbeiter.js";
|
import AbgabetoolMitarbeiter from "../../components/Cis/Abgabetool/AbgabetoolMitarbeiter.js";
|
||||||
import AbgabetoolAssistenz from "../../components/Cis/Abgabetool/AbgabetoolAssistenz.js";
|
import AbgabetoolAssistenz from "../../components/Cis/Abgabetool/AbgabetoolAssistenz.js";
|
||||||
import DeadlineOverview from "../../components/Cis/Abgabetool/DeadlineOverview.js";
|
import DeadlineOverview from "../../components/Cis/Abgabetool/DeadlineOverview.js";
|
||||||
import Studium from "../../components/Cis/Studium/Studium.js";
|
import Studium from "../../components/Cis/Studium/Studium.js";
|
||||||
import StgOrgLvPlan from "../../components/Cis/LvPlan/StgOrg.js";
|
|
||||||
import OtherLvPlan from "../../components/Cis/LvPlan/OtherLvPlan.js";
|
|
||||||
|
|
||||||
|
import ApiRenderers from '../../api/factory/renderers.js';
|
||||||
import ApiRouteInfo from '../../api/factory/routeinfo.js';
|
import ApiRouteInfo from '../../api/factory/routeinfo.js';
|
||||||
import {capitalize} from "../../helpers/StringHelpers.js";
|
import {capitalize} from "../../helpers/StringHelpers.js";
|
||||||
|
|
||||||
const ciPath = FHC_JS_DATA_STORAGE_OBJECT.app_root.replace(/(https:|)(^|\/\/)(.*?\/)/g, '') + FHC_JS_DATA_STORAGE_OBJECT.ci_router;
|
const ciPath = FHC_JS_DATA_STORAGE_OBJECT.app_root.replace(/(https:|)(^|\/\/)(.*?\/)/g, '') + FHC_JS_DATA_STORAGE_OBJECT.ci_router;
|
||||||
const isMobile = window.matchMedia("(max-width: 767px)").matches;
|
|
||||||
|
|
||||||
const router = VueRouter.createRouter({
|
const router = VueRouter.createRouter({
|
||||||
history: VueRouter.createWebHistory(`/${ciPath}`),
|
history: VueRouter.createWebHistory(`/${ciPath}`),
|
||||||
@@ -87,7 +85,7 @@ const router = VueRouter.createRouter({
|
|||||||
name: "RoomInformation",
|
name: "RoomInformation",
|
||||||
params: { // in this case always populate other params since they are not optional
|
params: { // in this case always populate other params since they are not optional
|
||||||
ort_kurzbz: to.params.ort_kurzbz,
|
ort_kurzbz: to.params.ort_kurzbz,
|
||||||
mode: isMobile ? DEFAULT_MODE_RAUMINFO_MOBILE : DEFAULT_MODE_RAUMINFO_DESKTOP,
|
mode: DEFAULT_MODE_RAUMINFO,
|
||||||
focus_date: new Date().toISOString().split("T")[0]
|
focus_date: new Date().toISOString().split("T")[0]
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@@ -104,7 +102,7 @@ const router = VueRouter.createRouter({
|
|||||||
const mode = route.params.mode &&
|
const mode = route.params.mode &&
|
||||||
validModes.includes(route.params.mode.charAt(0).toUpperCase() + route.params.mode.slice(1).toLowerCase())
|
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()
|
? route.params.mode.charAt(0).toUpperCase() + route.params.mode.slice(1).toLowerCase()
|
||||||
: (isMobile ? DEFAULT_MODE_RAUMINFO_MOBILE : DEFAULT_MODE_RAUMINFO_DESKTOP);
|
: DEFAULT_MODE_RAUMINFO;
|
||||||
|
|
||||||
// default to today date if not provided
|
// default to today date if not provided
|
||||||
const d = new Date(route.params.focus_date)
|
const d = new Date(route.params.focus_date)
|
||||||
@@ -199,26 +197,6 @@ const router = VueRouter.createRouter({
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
path: `/Cis/StgOrgLvPlan/:mode?/:focus_date?/:stgkz?/:sem?/:verband?/:gruppe?`,
|
|
||||||
name: 'StgOrgLvPlan',
|
|
||||||
component: StgOrgLvPlan,
|
|
||||||
props(route) {
|
|
||||||
return {
|
|
||||||
propsViewData: route.params
|
|
||||||
};
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: `/Cis/OtherLvPlan/:otherUid/:mode?/:focus_date?`,
|
|
||||||
name: "OtherLvPlan",
|
|
||||||
component: OtherLvPlan,
|
|
||||||
props(route) {
|
|
||||||
return {
|
|
||||||
propsViewData: route.params
|
|
||||||
};
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
path: `/Cis4`,
|
path: `/Cis4`,
|
||||||
name: 'Cis4',
|
name: 'Cis4',
|
||||||
@@ -249,7 +227,7 @@ const router = VueRouter.createRouter({
|
|||||||
})
|
})
|
||||||
|
|
||||||
const app = Vue.createApp({
|
const app = Vue.createApp({
|
||||||
name: 'CisApp',
|
name: 'FhcApp',
|
||||||
data: () => ({
|
data: () => ({
|
||||||
appSideMenuEntries: {},
|
appSideMenuEntries: {},
|
||||||
renderers: null,
|
renderers: null,
|
||||||
@@ -260,12 +238,13 @@ const app = Vue.createApp({
|
|||||||
const smallScreen = window.matchMedia("(max-width: 767px)").matches;
|
const smallScreen = window.matchMedia("(max-width: 767px)").matches;
|
||||||
const touchCapable = ("ontouchstart" in window) || navigator.maxTouchPoints > 0;
|
const touchCapable = ("ontouchstart" in window) || navigator.maxTouchPoints > 0;
|
||||||
return smallScreen;// && touchCapable;
|
return smallScreen;// && touchCapable;
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
provide() {
|
provide() {
|
||||||
return { // provide injectable & watchable language property
|
return { // provide injectable & watchable language property
|
||||||
language: Vue.computed(() => this.$p.user_language),
|
language: Vue.computed(() => this.$p.user_language),
|
||||||
isMobile: this.isMobile,
|
renderers: Vue.computed(() => this.renderers),
|
||||||
|
isMobile: this.isMobile
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
@@ -303,6 +282,46 @@ 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 = null;
|
||||||
|
let modalContent = null;
|
||||||
|
let calendarEvent = null;
|
||||||
|
if (data[rendertype].modalTitle)
|
||||||
|
modalTitle = Vue.markRaw(Vue.defineAsyncComponent(() => import(data[rendertype].modalTitle)));
|
||||||
|
if (data[rendertype].modalContent)
|
||||||
|
modalContent = Vue.markRaw(Vue.defineAsyncComponent(() => import(data[rendertype].modalContent)));
|
||||||
|
if (data[rendertype].calendarEvent)
|
||||||
|
calendarEvent = Vue.markRaw(Vue.defineAsyncComponent(() => import(data[rendertype].calendarEvent)));
|
||||||
|
|
||||||
|
if (data[rendertype].calendarEventStyles){
|
||||||
|
var head = document.head;
|
||||||
|
if(!head.querySelector(`link[href="${data[rendertype].calendarEventStyles}"]`)){
|
||||||
|
var link = document.createElement("link");
|
||||||
|
link.type = "text/css";
|
||||||
|
link.rel = "stylesheet";
|
||||||
|
link.href = data[rendertype].calendarEventStyles;
|
||||||
|
head.appendChild(link);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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() {
|
mounted() {
|
||||||
document.addEventListener('click', this.handleClick);
|
document.addEventListener('click', this.handleClick);
|
||||||
|
|
||||||
@@ -334,4 +353,4 @@ app.mount('#fhccontent');
|
|||||||
|
|
||||||
router.afterEach((to, from, failure) => {
|
router.afterEach((to, from, failure) => {
|
||||||
app.config.globalProperties.$api.call(ApiRouteInfo.info('cis4', to.fullPath));
|
app.config.globalProperties.$api.call(ApiRouteInfo.info('cis4', to.fullPath));
|
||||||
});
|
});
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
import {CoreNavigationCmpt} from '../components/navigation/Navigation.js';
|
||||||
|
import DashboardAdmin from '../components/Dashboard/Admin.js';
|
||||||
|
import Phrases from "../plugin/Phrasen.js"
|
||||||
|
|
||||||
|
Vue.createApp({
|
||||||
|
name: 'DashboardAdminApp',
|
||||||
|
data: () => ({
|
||||||
|
appSideMenuEntries: {}
|
||||||
|
}),
|
||||||
|
components: {
|
||||||
|
CoreNavigationCmpt,
|
||||||
|
DashboardAdmin
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
}
|
||||||
|
}).use(Phrases).mount('#main');
|
||||||
@@ -20,8 +20,7 @@ export default {
|
|||||||
},
|
},
|
||||||
inject: {
|
inject: {
|
||||||
mode: "mode",
|
mode: "mode",
|
||||||
dropableEvents: "dropableEvents",
|
dropableEvents: "dropableEvents"
|
||||||
timezone: "timezone"
|
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
events: Array,
|
events: Array,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import LineEvent from "./Line/Event.js";
|
import LineEvent from './Line/Event.js';
|
||||||
import LineBackground from "./Line/Background.js";
|
import LineBackground from './Line/Background.js';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO(chris):
|
* TODO(chris):
|
||||||
@@ -10,117 +10,54 @@ export default {
|
|||||||
name: "GridLine",
|
name: "GridLine",
|
||||||
components: {
|
components: {
|
||||||
LineEvent,
|
LineEvent,
|
||||||
LineBackground,
|
LineBackground
|
||||||
|
},
|
||||||
|
inject: {
|
||||||
|
axisRow: "axisRow"
|
||||||
},
|
},
|
||||||
inject: ["axisRow", "shouldCompactEvents", "compactibleEventTypes"],
|
|
||||||
props: {
|
props: {
|
||||||
date: {
|
date: {
|
||||||
type: luxon.DateTime,
|
type: luxon.DateTime,
|
||||||
required: true,
|
required: true
|
||||||
},
|
},
|
||||||
start: {
|
start: {
|
||||||
type: luxon.DateTime,
|
type: luxon.DateTime,
|
||||||
required: true,
|
required: true
|
||||||
},
|
},
|
||||||
end: {
|
end: {
|
||||||
type: luxon.DateTime,
|
type: luxon.DateTime,
|
||||||
required: true,
|
required: true
|
||||||
},
|
},
|
||||||
events: {
|
events: {
|
||||||
type: Array,
|
type: Array,
|
||||||
default: [],
|
default: []
|
||||||
},
|
},
|
||||||
backgrounds: {
|
backgrounds: {
|
||||||
type: Array,
|
type: Array,
|
||||||
default: [],
|
default: []
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
formattedEvents() {
|
eventsWithRowInfo() {
|
||||||
let formattedEvents = this.events.map((event) => {
|
const events = [];
|
||||||
event.rows = [1, -1];
|
this.events.forEach(event => {
|
||||||
|
const rows = [1, -1];
|
||||||
if (event.startsHere) {
|
if (event.startsHere) {
|
||||||
event.rows[0] =
|
rows[0] = 't_' + event.start.diff(this.date).toMillis();
|
||||||
"t_" + event.start.diff(this.date).toMillis();
|
|
||||||
}
|
}
|
||||||
if (event.endsHere) {
|
if (event.endsHere) {
|
||||||
event.rows[1] = "t_" + event.end.diff(this.date).toMillis();
|
rows[1] = 't_' + event.end.diff(this.date).toMillis();
|
||||||
}
|
}
|
||||||
|
|
||||||
return event;
|
events.push({
|
||||||
});
|
...event,
|
||||||
|
rows
|
||||||
if (this.shouldCompactEvents && this.compactibleEventTypes?.length) {
|
|
||||||
formattedEvents =
|
|
||||||
this.compactEvents(formattedEvents, this.compactibleEventTypes);
|
|
||||||
}
|
|
||||||
|
|
||||||
return formattedEvents;
|
|
||||||
},
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
compactEvents(events, compactibleEventTypes) {
|
|
||||||
let formattedEvents = events
|
|
||||||
.filter(
|
|
||||||
(event) =>
|
|
||||||
!compactibleEventTypes.includes(event.type),
|
|
||||||
)
|
|
||||||
.map((event) => {
|
|
||||||
event.display = "default";
|
|
||||||
return event;
|
|
||||||
});
|
});
|
||||||
let eventsToBeCompacted = events.filter((event) =>
|
|
||||||
compactibleEventTypes.includes(event.type),
|
|
||||||
);
|
|
||||||
let compactedEvents = [];
|
|
||||||
|
|
||||||
eventsToBeCompacted.forEach((event) => {
|
|
||||||
let existingCompactedEvent = compactedEvents.find(
|
|
||||||
(compactedEvent) =>
|
|
||||||
event.rows[0] === compactedEvent.rows[0] &&
|
|
||||||
event.rows[1] === compactedEvent.rows[1],
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!existingCompactedEvent) {
|
|
||||||
compactedEvents.push({
|
|
||||||
events: [
|
|
||||||
{
|
|
||||||
farbe: event.orig.farbe,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
rows: event.rows,
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
existingCompactedEvent.events.push({
|
|
||||||
farbe: event.orig.farbe,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
return events;
|
||||||
compactedEvents.forEach((compactedEvent) => {
|
}
|
||||||
if (compactedEvent.events.length < 4) {
|
|
||||||
formattedEvents.push({
|
|
||||||
display: "compacted",
|
|
||||||
...compactedEvent,
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
formattedEvents.push({
|
|
||||||
display: "compacted",
|
|
||||||
events: compactedEvent.events.slice(0, 3),
|
|
||||||
rows: compactedEvent.rows,
|
|
||||||
});
|
|
||||||
formattedEvents.push({
|
|
||||||
display: "compactedExtra",
|
|
||||||
events: compactedEvent.events.slice(3),
|
|
||||||
rows: compactedEvent.rows,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return formattedEvents;
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
template: /* html */ `
|
template: /* html */`
|
||||||
<div
|
<div
|
||||||
class="fhc-calendar-base-grid-line"
|
class="fhc-calendar-base-grid-line"
|
||||||
style="position:relative;display:grid;grid-auto-flow:dense"
|
style="position:relative;display:grid;grid-auto-flow:dense"
|
||||||
@@ -132,37 +69,17 @@ export default {
|
|||||||
:end="end"
|
:end="end"
|
||||||
:background="bg"
|
:background="bg"
|
||||||
></line-background>
|
></line-background>
|
||||||
<template v-for="(event, i) in formattedEvents" :key="i">
|
<line-event
|
||||||
<line-event
|
v-for="(event, i) in eventsWithRowInfo"
|
||||||
v-if="!event.display || event.display === 'default'"
|
:key="i"
|
||||||
:style="'grid-' + axisRow + ': ' + event.rows.join('/')"
|
:style="'grid-' + axisRow + ': ' + event.rows.join('/')"
|
||||||
:event="event"
|
:event="event"
|
||||||
>
|
>
|
||||||
<template v-slot="slot">
|
<template v-slot="slot">
|
||||||
<slot name="event" v-bind="slot" />
|
<slot name="event" v-bind="slot" />
|
||||||
</template>
|
</template>
|
||||||
</line-event>
|
</line-event>
|
||||||
<div
|
|
||||||
v-else-if="event.display === 'compacted'"
|
|
||||||
:style="'grid-' + axisRow + ': ' + event.rows.join('/')"
|
|
||||||
class="d-flex flex-row justify-content-center gap-1 align-items-center"
|
|
||||||
>
|
|
||||||
<i
|
|
||||||
v-for="(subEvent, subEventIndex) in event.events"
|
|
||||||
:key="subEventIndex"
|
|
||||||
class="fa-solid fa-circle fa-2xs"
|
|
||||||
:style="subEvent.farbe ? {color: '#' + subEvent.farbe} : {}"
|
|
||||||
></i>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
v-else-if="event.display === 'compactedExtra'"
|
|
||||||
:style="'grid-' + axisRow + ': ' + event.rows.join('/')"
|
|
||||||
class="w-100 d-flex flex-row justify-content-center"
|
|
||||||
>
|
|
||||||
{{"+" + event.events.length}}
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<slot name="dropzone" />
|
<slot name="dropzone" />
|
||||||
</div>
|
</div>
|
||||||
`,
|
`
|
||||||
};
|
}
|
||||||
|
|||||||
@@ -3,20 +3,24 @@ import FhcCalendar from "./Base.js";
|
|||||||
import ApiLvPlan from '../../api/factory/lvPlan.js';
|
import ApiLvPlan from '../../api/factory/lvPlan.js';
|
||||||
|
|
||||||
import { useEventLoader } from '../../composables/EventLoader.js';
|
import { useEventLoader } from '../../composables/EventLoader.js';
|
||||||
import { useRenderers } from '../../composables/Renderers.js';
|
|
||||||
|
|
||||||
import ModeDay from './Mode/Day.js';
|
import ModeDay from './Mode/Day.js';
|
||||||
import ModeWeek from './Mode/Week.js';
|
import ModeWeek from './Mode/Week.js';
|
||||||
import ModeMonth from './Mode/Month.js';
|
import ModeMonth from './Mode/Month.js';
|
||||||
import ModeList from './Mode/List.js';
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "CalendarLvPlan",
|
name: "CalendarLvPlan",
|
||||||
components: {
|
components: {
|
||||||
FhcCalendar
|
FhcCalendar
|
||||||
},
|
},
|
||||||
inject: ["isMobile"],
|
inject: [
|
||||||
|
"renderers"
|
||||||
|
],
|
||||||
props: {
|
props: {
|
||||||
|
timezone: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
date: {
|
date: {
|
||||||
type: [Date, String, Number, luxon.DateTime],
|
type: [Date, String, Number, luxon.DateTime],
|
||||||
default: luxon.DateTime.local()
|
default: luxon.DateTime.local()
|
||||||
@@ -30,16 +34,6 @@ export default {
|
|||||||
required: true
|
required: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
provide() {
|
|
||||||
return {
|
|
||||||
shouldCompactEvents: Vue.computed(
|
|
||||||
() => this.$props.mode === "Month" && this.isMobile,
|
|
||||||
),
|
|
||||||
compactibleEventTypes: Vue.computed(
|
|
||||||
() => this.compactibleEventTypes,
|
|
||||||
),
|
|
||||||
};
|
|
||||||
},
|
|
||||||
emits: [
|
emits: [
|
||||||
"update:date",
|
"update:date",
|
||||||
"update:mode",
|
"update:mode",
|
||||||
@@ -47,7 +41,11 @@ export default {
|
|||||||
],
|
],
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
timezone: FHC_JS_DATA_STORAGE_OBJECT.timezone,
|
modes: {
|
||||||
|
day: Vue.markRaw(ModeDay),
|
||||||
|
week: Vue.markRaw(ModeWeek),
|
||||||
|
month: Vue.markRaw(ModeMonth)
|
||||||
|
},
|
||||||
modeOptions: {
|
modeOptions: {
|
||||||
day: {
|
day: {
|
||||||
emptyMessage: Vue.computed(() => this.$p.t('lehre/noLvFound')),
|
emptyMessage: Vue.computed(() => this.$p.t('lehre/noLvFound')),
|
||||||
@@ -55,13 +53,9 @@ export default {
|
|||||||
},
|
},
|
||||||
week: {
|
week: {
|
||||||
collapseEmptyDays: false
|
collapseEmptyDays: false
|
||||||
},
|
}
|
||||||
list: {
|
|
||||||
length: 7,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
teachingunits: null,
|
teachingunits: null
|
||||||
compactibleEventTypes: [],
|
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
@@ -83,20 +77,7 @@ export default {
|
|||||||
label: now.startOf('minute').toISOTime({ suppressSeconds: true, includeOffset: false })
|
label: now.startOf('minute').toISOTime({ suppressSeconds: true, includeOffset: false })
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
},
|
}
|
||||||
modes() {
|
|
||||||
let modes = {
|
|
||||||
day: Vue.markRaw(ModeDay),
|
|
||||||
month: Vue.markRaw(ModeMonth),
|
|
||||||
};
|
|
||||||
if (this.isMobile) {
|
|
||||||
modes.list = Vue.markRaw(ModeList);
|
|
||||||
} else {
|
|
||||||
modes.week = Vue.markRaw(ModeWeek);
|
|
||||||
}
|
|
||||||
|
|
||||||
return modes;
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
eventStyle(event) {
|
eventStyle(event) {
|
||||||
@@ -107,47 +88,33 @@ export default {
|
|||||||
updateRange(rangeInterval) {
|
updateRange(rangeInterval) {
|
||||||
this.rangeInterval = rangeInterval;
|
this.rangeInterval = rangeInterval;
|
||||||
this.$emit('update:range', rangeInterval);
|
this.$emit('update:range', rangeInterval);
|
||||||
},
|
}
|
||||||
resetEventLoader() {
|
|
||||||
this.reset();
|
|
||||||
},
|
|
||||||
async getStunden() {
|
|
||||||
let stundenResponse = await this.$api.call(ApiLvPlan.getStunden());
|
|
||||||
this.teachingunits = stundenResponse.data.map((el) => ({
|
|
||||||
id: el.stunde,
|
|
||||||
start: el.beginn,
|
|
||||||
end: el.ende,
|
|
||||||
}));
|
|
||||||
},
|
|
||||||
async getCompactibleEventTypes() {
|
|
||||||
let compactibleEventTypesResponse = await this.$api.call(
|
|
||||||
ApiLvPlan.getCompactibleEventTypes(),
|
|
||||||
);
|
|
||||||
this.compactibleEventTypes = compactibleEventTypesResponse.data;
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
setup(props, context) {
|
setup(props, context) {
|
||||||
const rangeInterval = Vue.ref(null);
|
const rangeInterval = Vue.ref(null);
|
||||||
|
|
||||||
const { events, lv, reset } = useEventLoader(rangeInterval, props.getPromiseFunc);
|
const { events, lv } = useEventLoader(rangeInterval, props.getPromiseFunc);
|
||||||
|
|
||||||
Vue.watch(lv, newValue => {
|
Vue.watch(lv, newValue => {
|
||||||
context.emit('update:lv', newValue);
|
context.emit('update:lv', newValue);
|
||||||
});
|
});
|
||||||
|
|
||||||
const { renderers } = useRenderers();
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
rangeInterval,
|
rangeInterval,
|
||||||
events,
|
events,
|
||||||
lv,
|
lv
|
||||||
reset,
|
|
||||||
renderers
|
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
async created() {
|
created() {
|
||||||
await this.getStunden();
|
this.$api
|
||||||
await this.getCompactibleEventTypes();
|
.call(ApiLvPlan.getStunden())
|
||||||
|
.then(res => {
|
||||||
|
return this.teachingunits = res.data.map(el => ({
|
||||||
|
id: el.stunde,
|
||||||
|
start: el.beginn,
|
||||||
|
end: el.ende
|
||||||
|
}));
|
||||||
|
});
|
||||||
},
|
},
|
||||||
template: /* html */`
|
template: /* html */`
|
||||||
<fhc-calendar
|
<fhc-calendar
|
||||||
@@ -169,13 +136,6 @@ export default {
|
|||||||
>
|
>
|
||||||
<template v-slot="{ event, mode }">
|
<template v-slot="{ event, mode }">
|
||||||
<div
|
<div
|
||||||
v-if="!event"
|
|
||||||
class="h-100 d-flex justify-content-center align-items-center"
|
|
||||||
>
|
|
||||||
{{ $p.t('lehre/noLvFound') }}
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
v-else
|
|
||||||
:class="'event-type-' + event.type + ' ' + mode + 'PageContainer'"
|
:class="'event-type-' + event.type + ' ' + mode + 'PageContainer'"
|
||||||
:type="mode == 'day' ? 'button' : undefined"
|
:type="mode == 'day' ? 'button' : undefined"
|
||||||
:style="eventStyle(event)"
|
:style="eventStyle(event)"
|
||||||
|
|||||||
@@ -93,7 +93,7 @@ export default {
|
|||||||
mounted() {
|
mounted() {
|
||||||
this.$emit('update:range', this.range);
|
this.$emit('update:range', this.range);
|
||||||
},
|
},
|
||||||
template: /*html*/ `
|
template: `
|
||||||
<div
|
<div
|
||||||
class="fhc-calendar-mode-list flex-grow-1 position-relative"
|
class="fhc-calendar-mode-list flex-grow-1 position-relative"
|
||||||
@cal-click-default.capture="handleClickDefaults"
|
@cal-click-default.capture="handleClickDefaults"
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import FhcCalendar from "./Base.js";
|
import FhcCalendar from "./Base.js";
|
||||||
|
|
||||||
import { useEventLoader } from '../../composables/EventLoader.js';
|
import { useEventLoader } from '../../composables/EventLoader.js';
|
||||||
import { useRenderers } from '../../composables/Renderers.js';
|
|
||||||
|
|
||||||
import ModeList from '../Calendar/Mode/List.js';
|
import ModeList from '../Calendar/Mode/List.js';
|
||||||
|
|
||||||
@@ -10,17 +9,22 @@ export default {
|
|||||||
components: {
|
components: {
|
||||||
FhcCalendar
|
FhcCalendar
|
||||||
},
|
},
|
||||||
|
inject: [
|
||||||
|
"renderers"
|
||||||
|
],
|
||||||
props: {
|
props: {
|
||||||
|
timezone: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
getPromiseFunc: {
|
getPromiseFunc: {
|
||||||
type: Function,
|
type: Function,
|
||||||
required: true
|
required: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
const timezone = FHC_JS_DATA_STORAGE_OBJECT.timezone;
|
|
||||||
return {
|
return {
|
||||||
timezone,
|
now: luxon.DateTime.now().setZone(this.timezone),
|
||||||
now: luxon.DateTime.now().setZone(timezone),
|
|
||||||
modes: {
|
modes: {
|
||||||
list: Vue.markRaw(ModeList)
|
list: Vue.markRaw(ModeList)
|
||||||
},
|
},
|
||||||
@@ -55,12 +59,10 @@ export default {
|
|||||||
const rangeInterval = Vue.ref(null);
|
const rangeInterval = Vue.ref(null);
|
||||||
|
|
||||||
const { events } = useEventLoader(rangeInterval, props.getPromiseFunc);
|
const { events } = useEventLoader(rangeInterval, props.getPromiseFunc);
|
||||||
const { renderers } = useRenderers();
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
rangeInterval,
|
rangeInterval,
|
||||||
events,
|
events
|
||||||
renderers
|
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
template: /* html */`
|
template: /* html */`
|
||||||
|
|||||||
@@ -42,6 +42,14 @@ export const AbgabetoolAssistenz = {
|
|||||||
stg_kz_prop: {
|
stg_kz_prop: {
|
||||||
default: null
|
default: null
|
||||||
},
|
},
|
||||||
|
viewData: {
|
||||||
|
type: Object,
|
||||||
|
required: true,
|
||||||
|
default: () => ({name: '', uid: ''}),
|
||||||
|
validator(value) {
|
||||||
|
return value && value.uid // && value.name -> extensive viewData use only for cis4 onwards
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
|||||||
@@ -31,6 +31,16 @@ export const AbgabetoolMitarbeiter = {
|
|||||||
old_abgabe_beurteilung_link: Vue.computed(() => this.old_abgabe_beurteilung_link)
|
old_abgabe_beurteilung_link: Vue.computed(() => this.old_abgabe_beurteilung_link)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
props: {
|
||||||
|
viewData: {
|
||||||
|
type: Object,
|
||||||
|
required: true,
|
||||||
|
default: () => ({name: '', uid: ''}),
|
||||||
|
validator(value) {
|
||||||
|
return value && value.uid // && value.name -> extensive viewData use only for cis4 onwards
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
tableData: null,
|
tableData: null,
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import ApiAbgabe from '../../../api/factory/abgabe.js'
|
|||||||
import BsModal from "../../Bootstrap/Modal.js";
|
import BsModal from "../../Bootstrap/Modal.js";
|
||||||
import FhcOverlay from "../../Overlay/FhcOverlay.js";
|
import FhcOverlay from "../../Overlay/FhcOverlay.js";
|
||||||
import { getDateStyleClass} from "./getDateStyleClass.js";
|
import { getDateStyleClass} from "./getDateStyleClass.js";
|
||||||
import ApiAuthinfo from "../../../api/factory/authinfo.js";
|
|
||||||
|
|
||||||
export const AbgabetoolStudent = {
|
export const AbgabetoolStudent = {
|
||||||
name: "AbgabetoolStudent",
|
name: "AbgabetoolStudent",
|
||||||
@@ -25,6 +24,14 @@ export const AbgabetoolStudent = {
|
|||||||
student_uid_prop: {
|
student_uid_prop: {
|
||||||
default: null
|
default: null
|
||||||
},
|
},
|
||||||
|
viewData: {
|
||||||
|
type: Object,
|
||||||
|
required: true,
|
||||||
|
default: () => ({uid: ''}),
|
||||||
|
validator(value) {
|
||||||
|
return value && value.uid
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
@@ -37,18 +44,9 @@ export const AbgabetoolStudent = {
|
|||||||
detail: null,
|
detail: null,
|
||||||
projektarbeiten: null,
|
projektarbeiten: null,
|
||||||
selectedProjektarbeit: null,
|
selectedProjektarbeit: null,
|
||||||
moodle_link: null,
|
moodle_link: null
|
||||||
uid: null,
|
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
|
||||||
isViewMode() {
|
|
||||||
return this.student_uid !== this.uid
|
|
||||||
},
|
|
||||||
student_uid() {
|
|
||||||
return this.student_uid_prop || this.uid || null
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
methods: {
|
||||||
checkQualityGatesStrict(termine) {
|
checkQualityGatesStrict(termine) {
|
||||||
let qgate1Passed = false
|
let qgate1Passed = false
|
||||||
@@ -260,11 +258,18 @@ export const AbgabetoolStudent = {
|
|||||||
},
|
},
|
||||||
handleDownloadBeurteilung2(projektarbeit) {
|
handleDownloadBeurteilung2(projektarbeit) {
|
||||||
window.open(projektarbeit.beurteilung2)
|
window.open(projektarbeit.beurteilung2)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
isViewMode() {
|
||||||
|
return this.student_uid !== this.viewData.uid
|
||||||
},
|
},
|
||||||
async fetchAuthUID() {
|
student_uid() {
|
||||||
const authIdResponse = await this.$api.call(ApiAuthinfo.getAuthUID());
|
return this.student_uid_prop || this.viewData?.uid || null
|
||||||
this.uid = authIdResponse.data.uid;
|
}
|
||||||
},
|
|
||||||
},
|
},
|
||||||
async created() {
|
async created() {
|
||||||
this.phrasenPromise = this.$p.loadCategory(['abgabetool', 'global'])
|
this.phrasenPromise = this.$p.loadCategory(['abgabetool', 'global'])
|
||||||
@@ -297,8 +302,6 @@ export const AbgabetoolStudent = {
|
|||||||
}).catch(e => {
|
}).catch(e => {
|
||||||
this.loading = false
|
this.loading = false
|
||||||
})
|
})
|
||||||
|
|
||||||
await this.fetchAuthUID();
|
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.setupMounted()
|
this.setupMounted()
|
||||||
|
|||||||
@@ -10,6 +10,14 @@ export const DeadlineOverview = {
|
|||||||
person_uid_prop: {
|
person_uid_prop: {
|
||||||
default: null
|
default: null
|
||||||
},
|
},
|
||||||
|
viewData: {
|
||||||
|
type: Object,
|
||||||
|
required: true,
|
||||||
|
default: () => ({name: '', uid: ''}),
|
||||||
|
validator(value) {
|
||||||
|
return value && value.name && value.uid
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
|||||||
@@ -2,137 +2,115 @@ import Pagination from "../../Pagination/Pagination.js";
|
|||||||
import StudiengangInformation from "./StudiengangInformation/StudiengangInformation.js";
|
import StudiengangInformation from "./StudiengangInformation/StudiengangInformation.js";
|
||||||
import BsConfirm from "../../Bootstrap/Confirm.js";
|
import BsConfirm from "../../Bootstrap/Confirm.js";
|
||||||
|
|
||||||
import ApiCms from "../../../api/factory/cms.js";
|
import ApiCms from '../../../api/factory/cms.js';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "NewsComponent",
|
name: "NewsComponent",
|
||||||
components: {
|
components: {
|
||||||
Pagination,
|
Pagination,
|
||||||
StudiengangInformation,
|
StudiengangInformation,
|
||||||
},
|
},
|
||||||
inject: ["isMobile"],
|
data() {
|
||||||
data() {
|
return {
|
||||||
return {
|
content: null,
|
||||||
content: null,
|
maxPageCount: 0,
|
||||||
maxPageCount: 0,
|
page_size: 10,
|
||||||
page_size: 10,
|
page:1,
|
||||||
page: 1,
|
};
|
||||||
};
|
},
|
||||||
},
|
watch:{
|
||||||
watch: {
|
'$p.user_language.value':function(sprache){
|
||||||
"$p.user_language.value": function (sprache) {
|
|
||||||
this.fetchNews();
|
|
||||||
},
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
sprache: function () {
|
|
||||||
return this.$p.user_language.value;
|
|
||||||
},
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
async fetchNews() {
|
|
||||||
let newsResponse = await this.$api.call(
|
|
||||||
ApiCms.getNews(this.page, this.page_size, this.sprache),
|
|
||||||
);
|
|
||||||
this.content = newsResponse.data;
|
|
||||||
|
|
||||||
document.querySelectorAll("#cms [data-confirm]").forEach((el) => {
|
|
||||||
el.addEventListener("click", (evt) => {
|
|
||||||
evt.preventDefault();
|
|
||||||
BsConfirm.popup(el.dataset.confirm)
|
|
||||||
.then(() => {
|
|
||||||
Axios.get(el.href)
|
|
||||||
.then((res) => {
|
|
||||||
// TODO(chris): check for success then show message and/or reload
|
|
||||||
location = location;
|
|
||||||
})
|
|
||||||
.catch((err) => console.error("ERROR:", err));
|
|
||||||
})
|
|
||||||
.catch(() => {});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
document.querySelectorAll("#cms [data-href]").forEach((el) => {
|
|
||||||
el.href = el.dataset.href.replace(
|
|
||||||
/^ROOT\//,
|
|
||||||
FHC_JS_DATA_STORAGE_OBJECT.app_root,
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
await this.$nextTick();
|
|
||||||
this.formatExternalHtml();
|
|
||||||
},
|
|
||||||
async loadNewPageContent(data) {
|
|
||||||
let newsResponse = await this.$api.call(
|
|
||||||
ApiCms.getNews(data.page, data.rows),
|
|
||||||
);
|
|
||||||
this.content = newsResponse.data;
|
|
||||||
|
|
||||||
await this.$nextTick();
|
|
||||||
|
|
||||||
this.formatExternalHtml();
|
|
||||||
},
|
|
||||||
formatExternalHtml() {
|
|
||||||
document
|
|
||||||
.querySelectorAll(".news-list-item .card-header")
|
|
||||||
.forEach((el) => {
|
|
||||||
el.classList.add("fhc-primary");
|
|
||||||
});
|
|
||||||
document.querySelectorAll(".news-list-item .row").forEach((el) => {
|
|
||||||
el.classList.add("w-100");
|
|
||||||
el.classList.add("align-items-center");
|
|
||||||
});
|
|
||||||
document
|
|
||||||
.querySelectorAll(".news-list-item .row h2")
|
|
||||||
.forEach((el) => {
|
|
||||||
el.classList.add("mb-0");
|
|
||||||
});
|
|
||||||
},
|
|
||||||
afterPageUpdated(event) {
|
|
||||||
this.page = event.page;
|
|
||||||
this.page_size = event.rows;
|
|
||||||
this.$refs.newsPageHeading.scrollIntoView({block: 'end'});
|
|
||||||
this.loadNewPageContent(event);
|
|
||||||
},
|
|
||||||
},
|
|
||||||
created() {
|
|
||||||
this.fetchNews();
|
this.fetchNews();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed:{
|
||||||
|
sprache: function(){
|
||||||
|
return this.$p.user_language.value;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
fetchNews() {
|
||||||
|
return this.$api
|
||||||
|
.call(ApiCms.getNews(this.page, this.page_size, this.sprache))
|
||||||
|
.then(res => res.data)
|
||||||
|
.then(result => {
|
||||||
|
this.content = result;
|
||||||
|
|
||||||
|
document.querySelectorAll("#cms [data-confirm]").forEach((el) => {
|
||||||
|
el.addEventListener("click", (evt) => {
|
||||||
|
evt.preventDefault();
|
||||||
|
BsConfirm.popup(el.dataset.confirm)
|
||||||
|
.then(() => {
|
||||||
|
Axios.get(el.href)
|
||||||
|
.then((res) => {
|
||||||
|
// TODO(chris): check for success then show message and/or reload
|
||||||
|
location = location;
|
||||||
|
})
|
||||||
|
.catch((err) => console.error("ERROR:", err));
|
||||||
|
})
|
||||||
|
.catch(() => {
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
document.querySelectorAll("#cms [data-href]").forEach((el) => {
|
||||||
|
el.href = el.dataset.href.replace(
|
||||||
|
/^ROOT\//,
|
||||||
|
FHC_JS_DATA_STORAGE_OBJECT.app_root
|
||||||
|
);
|
||||||
|
});
|
||||||
|
Vue.nextTick(()=>{
|
||||||
|
document.querySelectorAll(".card-header").forEach((el) => {
|
||||||
|
el.classList.add("fhc-primary");
|
||||||
|
});
|
||||||
|
document.querySelectorAll(".row").forEach((el) => {
|
||||||
|
el.classList.add("w-100");
|
||||||
|
el.classList.add("align-items-center");
|
||||||
|
|
||||||
|
});
|
||||||
|
document.querySelectorAll(".row h2").forEach((el) => {
|
||||||
|
el.classList.add("mb-0");
|
||||||
|
});
|
||||||
|
|
||||||
|
})
|
||||||
|
});
|
||||||
|
},
|
||||||
|
loadNewPageContent(data) {
|
||||||
|
this.$api
|
||||||
|
.call(ApiCms.getNews(data.page, data.rows))
|
||||||
|
.then(res => res.data)
|
||||||
|
.then(result => {
|
||||||
|
this.content = result;
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.fetchNews();
|
||||||
|
|
||||||
this.$api
|
this.$api
|
||||||
.call(ApiCms.getNewsRowCount())
|
.call(ApiCms.getNewsRowCount())
|
||||||
.then((res) => res.data)
|
.then(res => res.data)
|
||||||
.then((result) => {
|
.then(result => {
|
||||||
this.maxPageCount = result;
|
this.maxPageCount = result;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
template: /*html*/ `
|
template: /*html*/ `
|
||||||
<div :class="{'pb-3': isMobile}" class="overflow-x-hidden">
|
<h2 class="fhc-primary-color">News</h2>
|
||||||
<h2 ref="newsPageHeading" class="fhc-primary-color">News</h2>
|
<hr/>
|
||||||
<hr/>
|
<pagination v-show="content?true:false" :page_size="page_size" @page="page=$event.page; loadNewPageContent($event)" :maxPageCount="maxPageCount">
|
||||||
<pagination
|
</pagination>
|
||||||
v-show="content?true:false"
|
<div class="container-fluid mt-4">
|
||||||
:page="page"
|
<div class="row">
|
||||||
:page_size="page_size"
|
<div class="col" v-html="content">
|
||||||
@pageUpdated="afterPageUpdated($event)"
|
</div>
|
||||||
:maxPageCount="maxPageCount"
|
<div class="col-auto">
|
||||||
></pagination>
|
<div style="width:15rem">
|
||||||
<div class="container-fluid mt-4">
|
<studiengang-information></studiengang-information>
|
||||||
<div class="row">
|
|
||||||
<div class="col" v-html="content">
|
|
||||||
</div>
|
|
||||||
<div class="col-auto">
|
|
||||||
<div style="width:15rem">
|
|
||||||
<studiengang-information></studiengang-information>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<pagination
|
|
||||||
v-show="content?true:false"
|
|
||||||
:page="page"
|
|
||||||
:page_size="page_size"
|
|
||||||
@pageUpdated="afterPageUpdated($event)"
|
|
||||||
:maxPageCount="maxPageCount"
|
|
||||||
></pagination>
|
|
||||||
</div>
|
</div>
|
||||||
|
<pagination v-show="content?true:false" :page_size="page_size" @page="loadNewPageContent" :maxPageCount="maxPageCount">
|
||||||
|
</pagination>
|
||||||
`,
|
`,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -3,8 +3,7 @@ import FhcCalendar from "../../Calendar/LvPlan.js";
|
|||||||
import ApiLvPlan from '../../../api/factory/lvPlan.js';
|
import ApiLvPlan from '../../../api/factory/lvPlan.js';
|
||||||
import ApiAuthinfo from '../../../api/factory/authinfo.js';
|
import ApiAuthinfo from '../../../api/factory/authinfo.js';
|
||||||
|
|
||||||
export const DEFAULT_MODE_LVPLAN_MOBILE = 'List';
|
export const DEFAULT_MODE_LVPLAN = 'Week'
|
||||||
export const DEFAULT_MODE_LVPLAN_DESKTOP = 'Week';
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'LvPlanLehrveranstaltung',
|
name: 'LvPlanLehrveranstaltung',
|
||||||
@@ -20,21 +19,15 @@ export default {
|
|||||||
lv: null
|
lv: null
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
inject: ["isMobile"],
|
|
||||||
computed:{
|
computed:{
|
||||||
currentDay() {
|
currentDay() {
|
||||||
if (!this.propsViewData?.focus_date || isNaN(new Date(this.propsViewData?.focus_date)))
|
if (!this.propsViewData?.focus_date || isNaN(new Date(this.propsViewData?.focus_date)))
|
||||||
return luxon.DateTime.now().setZone(FHC_JS_DATA_STORAGE_OBJECT.timezone).toISODate();
|
return luxon.DateTime.now().setZone(this.viewData.timezone).toISODate();
|
||||||
return this.propsViewData?.focus_date;
|
return this.propsViewData?.focus_date;
|
||||||
},
|
},
|
||||||
currentMode() {
|
currentMode() {
|
||||||
let validModes = ['day', 'month'];
|
if (!this.propsViewData?.mode || !['day', 'week', 'month'].includes(this.propsViewData?.mode.toLowerCase()))
|
||||||
validModes.push(this.isMobile ? 'list' : 'week');
|
return DEFAULT_MODE_LVPLAN;
|
||||||
|
|
||||||
const defaultMode = this.isMobile ? DEFAULT_MODE_LVPLAN_MOBILE : DEFAULT_MODE_LVPLAN_DESKTOP;
|
|
||||||
|
|
||||||
if (!this.propsViewData?.mode || !validModes.includes(this.propsViewData?.mode.toLowerCase()))
|
|
||||||
return defaultMode;
|
|
||||||
return this.propsViewData?.mode;
|
return this.propsViewData?.mode;
|
||||||
},
|
},
|
||||||
currentLv() {
|
currentLv() {
|
||||||
@@ -102,6 +95,7 @@ export default {
|
|||||||
<fhc-calendar
|
<fhc-calendar
|
||||||
v-else-if="lv"
|
v-else-if="lv"
|
||||||
ref="calendar"
|
ref="calendar"
|
||||||
|
:timezone="viewData.timezone"
|
||||||
:get-promise-func="getPromiseFunc"
|
:get-promise-func="getPromiseFunc"
|
||||||
:date="currentDay"
|
:date="currentDay"
|
||||||
:mode="currentMode"
|
:mode="currentMode"
|
||||||
|
|||||||
@@ -3,8 +3,7 @@ import FhcCalendar from "../../Calendar/LvPlan.js";
|
|||||||
import ApiLvPlan from '../../../api/factory/lvPlan.js';
|
import ApiLvPlan from '../../../api/factory/lvPlan.js';
|
||||||
import ApiAuthinfo from '../../../api/factory/authinfo.js';
|
import ApiAuthinfo from '../../../api/factory/authinfo.js';
|
||||||
|
|
||||||
export const DEFAULT_MODE_LVPLAN_MOBILE = 'List';
|
export const DEFAULT_MODE_LVPLAN = 'Week'
|
||||||
export const DEFAULT_MODE_LVPLAN_DESKTOP = 'Week';
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'LvPlan',
|
name: 'LvPlan',
|
||||||
@@ -12,32 +11,31 @@ export default {
|
|||||||
FhcCalendar
|
FhcCalendar
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
|
viewData: Object, // NOTE(chris): this is inherited from router-view
|
||||||
propsViewData: Object
|
propsViewData: Object
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
|
const now = luxon.DateTime.now().setZone(this.viewData.timezone);
|
||||||
return {
|
return {
|
||||||
studiensemester_kurzbz: null,
|
studiensemester_kurzbz: null,
|
||||||
studiensemester_start: null,
|
studiensemester_start: null,
|
||||||
studiensemester_ende: null,
|
studiensemester_ende: null,
|
||||||
uid: null,
|
uid: null,
|
||||||
lv: null,
|
lv: null
|
||||||
timezone: FHC_JS_DATA_STORAGE_OBJECT.timezone,
|
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
inject: ["isMobile"],
|
|
||||||
computed:{
|
computed:{
|
||||||
currentDay() {
|
currentDay() {
|
||||||
return this.propsViewData?.focus_date || luxon.DateTime.now().setZone(this.timezone).toISODate();
|
return this.propsViewData?.focus_date || luxon.DateTime.now().setZone(this.viewData.timezone).toISODate();
|
||||||
},
|
},
|
||||||
currentMode() {
|
currentMode() {
|
||||||
const defaultMode = this.isMobile ? DEFAULT_MODE_LVPLAN_MOBILE : DEFAULT_MODE_LVPLAN_DESKTOP;
|
return this.propsViewData?.mode || DEFAULT_MODE_LVPLAN;
|
||||||
return this.propsViewData?.mode || defaultMode;
|
|
||||||
},
|
},
|
||||||
downloadLinks() {
|
downloadLinks() {
|
||||||
if (!this.studiensemester_start || !this.studiensemester_ende || !this.uid)
|
if (!this.studiensemester_start || !this.studiensemester_ende || !this.uid)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
const opts = { zone: this.timezone };
|
const opts = { zone: this.viewData.timezone };
|
||||||
const start = luxon.DateTime
|
const start = luxon.DateTime
|
||||||
.fromISO(this.studiensemester_start, opts)
|
.fromISO(this.studiensemester_start, opts)
|
||||||
.toUnixInteger();
|
.toUnixInteger();
|
||||||
@@ -117,7 +115,7 @@ export default {
|
|||||||
<fhc-calendar
|
<fhc-calendar
|
||||||
ref="calendar"
|
ref="calendar"
|
||||||
v-model:lv="lv"
|
v-model:lv="lv"
|
||||||
:timezone="timezone"
|
:timezone="viewData.timezone"
|
||||||
:get-promise-func="getPromiseFunc"
|
:get-promise-func="getPromiseFunc"
|
||||||
:date="currentDay"
|
:date="currentDay"
|
||||||
:mode="currentMode"
|
:mode="currentMode"
|
||||||
|
|||||||
@@ -1,269 +0,0 @@
|
|||||||
import FormForm from "../../Form/Form.js";
|
|
||||||
import FormInput from "../../Form/Input.js";
|
|
||||||
import FhcCalendar from "../../Calendar/LvPlan.js";
|
|
||||||
|
|
||||||
import ApiLvPlan from "../.././../api/factory/lvPlan.js";
|
|
||||||
import ApiOtherLvPlan from "../.././../api/factory/otherLvPlan.js";
|
|
||||||
import ApiAuthinfo from "../../../api/factory/authinfo.js";
|
|
||||||
|
|
||||||
export const DEFAULT_MODE_LVPLAN_DESKTOP = "Week";
|
|
||||||
export const DEFAULT_MODE_LVPLAN_MOBILE = "List";
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: "OtherLvPlan",
|
|
||||||
components: {
|
|
||||||
FormForm,
|
|
||||||
FormInput,
|
|
||||||
FhcCalendar,
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
propsViewData: Object,
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
localProps: {},
|
|
||||||
studiensemester_kurzbz: null,
|
|
||||||
studiensemester_start: null,
|
|
||||||
studiensemester_ende: null,
|
|
||||||
isOtherPersonMitarbeiter: false,
|
|
||||||
isOtherPersonStudent: false,
|
|
||||||
currentStgBezeichnung: null,
|
|
||||||
listVerband: [],
|
|
||||||
listGroup: [],
|
|
||||||
rangeIntervalFirst: null,
|
|
||||||
otherPersonData: {
|
|
||||||
fullName: "",
|
|
||||||
photo: "",
|
|
||||||
},
|
|
||||||
timezone: FHC_JS_DATA_STORAGE_OBJECT.timezone,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
inject: ["isMobile"],
|
|
||||||
computed: {
|
|
||||||
currentDay() {
|
|
||||||
if (
|
|
||||||
!this.propsViewData?.focus_date ||
|
|
||||||
isNaN(new Date(this.propsViewData?.focus_date))
|
|
||||||
)
|
|
||||||
return luxon.DateTime.now().setZone(this.timezone).toISODate();
|
|
||||||
return this.propsViewData?.focus_date;
|
|
||||||
},
|
|
||||||
currentMode() {
|
|
||||||
let validModes = ["day", "month"];
|
|
||||||
validModes.push(this.isMobile ? "list" : "week");
|
|
||||||
|
|
||||||
const defaultMode = this.isMobile
|
|
||||||
? DEFAULT_MODE_LVPLAN_MOBILE
|
|
||||||
: DEFAULT_MODE_LVPLAN_DESKTOP;
|
|
||||||
|
|
||||||
if (
|
|
||||||
!this.propsViewData?.mode ||
|
|
||||||
!validModes.includes(this.propsViewData?.mode.toLowerCase())
|
|
||||||
)
|
|
||||||
return defaultMode;
|
|
||||||
return this.propsViewData?.mode;
|
|
||||||
},
|
|
||||||
downloadLinks() {
|
|
||||||
if (
|
|
||||||
!this.studiensemester_start ||
|
|
||||||
!this.studiensemester_ende ||
|
|
||||||
!this.propsViewData.otherUid
|
|
||||||
)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
const type = this.isOtherPersonStudent
|
|
||||||
? "student"
|
|
||||||
: this.isOtherPersonMitarbeiter
|
|
||||||
? "lektor"
|
|
||||||
: null;
|
|
||||||
|
|
||||||
if (!type) return;
|
|
||||||
|
|
||||||
const opts = { zone: this.timezone };
|
|
||||||
const start = luxon.DateTime.fromISO(
|
|
||||||
this.studiensemester_start,
|
|
||||||
opts,
|
|
||||||
).toUnixInteger();
|
|
||||||
const ende = luxon.DateTime.fromISO(
|
|
||||||
this.studiensemester_ende,
|
|
||||||
opts,
|
|
||||||
).toUnixInteger();
|
|
||||||
|
|
||||||
const download_link =
|
|
||||||
FHC_JS_DATA_STORAGE_OBJECT.app_root +
|
|
||||||
"cis/private/lvplan/stpl_kalender.php" +
|
|
||||||
"?type=" +
|
|
||||||
type +
|
|
||||||
"&pers_uid=" +
|
|
||||||
this.propsViewData.otherUid +
|
|
||||||
"&begin=" +
|
|
||||||
start +
|
|
||||||
"&ende=" +
|
|
||||||
ende;
|
|
||||||
|
|
||||||
return [
|
|
||||||
{
|
|
||||||
title: "excel",
|
|
||||||
icon: "fa-solid fa-file-excel",
|
|
||||||
link: download_link + "&format=excel",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "csv",
|
|
||||||
icon: "fa-solid fa-file-csv",
|
|
||||||
link: download_link + "&format=csv",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "ical1",
|
|
||||||
icon: "fa-regular fa-calendar",
|
|
||||||
link: download_link + "&format=ical&version=1&target=ical",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "ical2",
|
|
||||||
icon: "fa-regular fa-calendar",
|
|
||||||
link: download_link + "&format=ical&version=2&target=ical",
|
|
||||||
},
|
|
||||||
];
|
|
||||||
},
|
|
||||||
get_image_base64_src: function () {
|
|
||||||
if (!this.otherPersonData.photo?.length) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
return "data:image/jpeg;base64," + this.otherPersonData.photo;
|
|
||||||
},
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
"propsViewData.otherUid": {
|
|
||||||
handler() {
|
|
||||||
this.$router.go();
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
handleChangeDate(day, newMode) {
|
|
||||||
return this.handleChangeMode(newMode, day);
|
|
||||||
},
|
|
||||||
handleChangeMode(newMode, day) {
|
|
||||||
const mode = newMode[0].toUpperCase() + newMode.slice(1);
|
|
||||||
const focus_date = day.toISODate();
|
|
||||||
|
|
||||||
this.$router.push({
|
|
||||||
name: "OtherLvPlan",
|
|
||||||
params: {
|
|
||||||
mode,
|
|
||||||
focus_date,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
},
|
|
||||||
updateRange(rangeInterval) {
|
|
||||||
this.$api
|
|
||||||
.call(
|
|
||||||
ApiLvPlan.studiensemesterDateInterval(
|
|
||||||
rangeInterval.end.startOf("week").toISODate(),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
.then((res) => {
|
|
||||||
this.studiensemester_kurzbz =
|
|
||||||
res.data.studiensemester_kurzbz;
|
|
||||||
this.studiensemester_start = res.data.start;
|
|
||||||
this.studiensemester_ende = res.data.ende;
|
|
||||||
});
|
|
||||||
},
|
|
||||||
getPromiseFunc(start, end) {
|
|
||||||
return [
|
|
||||||
this.$api.call(
|
|
||||||
ApiLvPlan.eventsPersonal(
|
|
||||||
start.toISODate(),
|
|
||||||
end.toISODate(),
|
|
||||||
this.propsViewData.otherUid,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
this.$api.call(
|
|
||||||
ApiLvPlan.getLvPlanReservierungen(
|
|
||||||
start.toISODate(),
|
|
||||||
end.toISODate(),
|
|
||||||
this.propsViewData.otherUid,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
];
|
|
||||||
},
|
|
||||||
async fetchViewData() {
|
|
||||||
const viewDataResponse = await this.$api.call(
|
|
||||||
ApiOtherLvPlan.getOtherLvPlanViewData(
|
|
||||||
this.propsViewData.otherUid,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
const viewData = viewDataResponse.data;
|
|
||||||
|
|
||||||
this.isOtherPersonMitarbeiter =
|
|
||||||
!!viewData?.user_data?.is_mitarbeiter;
|
|
||||||
this.isOtherPersonStudent = !!viewData?.user_data?.is_student;
|
|
||||||
this.otherPersonData.fullName =
|
|
||||||
viewData?.user_data?.vorname +
|
|
||||||
" " +
|
|
||||||
viewData?.user_data?.nachname;
|
|
||||||
this.otherPersonData.photo = viewData?.user_data?.foto;
|
|
||||||
},
|
|
||||||
async redirectToMyLvPlanIfAuthUid() {
|
|
||||||
const authInfoResponse = await this.$api.call(
|
|
||||||
ApiAuthinfo.getAuthInfo(),
|
|
||||||
);
|
|
||||||
const authId = authInfoResponse.data.uid;
|
|
||||||
if (authId === this.propsViewData.otherUid) {
|
|
||||||
this.$router.push({ name: "MyLvPlan" });
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
async created() {
|
|
||||||
await this.redirectToMyLvPlanIfAuthUid();
|
|
||||||
await this.fetchViewData();
|
|
||||||
},
|
|
||||||
template: `
|
|
||||||
<div class="d-flex flex-column h-100">
|
|
||||||
<h2>
|
|
||||||
<div class="d-flex flex-row justify-content-between align-items-center">
|
|
||||||
<span>
|
|
||||||
{{ $p.t('lehre/stundenplan') + (studiensemester_kurzbz ? " " + studiensemester_kurzbz : "") }}
|
|
||||||
</span>
|
|
||||||
<div @click="this.$router.push({name: 'ProfilView', params: {uid: propsViewData.otherUid}})" type="button" class="d-flex flex-row align-items-center gap-3">
|
|
||||||
<span v-if="otherPersonData.fullName?.length">
|
|
||||||
{{ otherPersonData.fullName }}
|
|
||||||
</span>
|
|
||||||
<img v-if="otherPersonData.photo?.length" alt="profile picture" class=" img-thumbnail " style=" max-height:60px; " :src="get_image_base64_src"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</h2>
|
|
||||||
<hr>
|
|
||||||
<fhc-calendar
|
|
||||||
v-if="timezone"
|
|
||||||
ref="calendar"
|
|
||||||
:timezone="timezone"
|
|
||||||
:get-promise-func="getPromiseFunc"
|
|
||||||
:date="currentDay"
|
|
||||||
:mode="currentMode"
|
|
||||||
@update:date="handleChangeDate"
|
|
||||||
@update:mode="handleChangeMode"
|
|
||||||
@update:range="updateRange"
|
|
||||||
class="responsive-calendar"
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
v-if="downloadLinks"
|
|
||||||
class="d-flex gap-1 justify-items-start"
|
|
||||||
>
|
|
||||||
<div v-for="{ title, icon, link } in downloadLinks">
|
|
||||||
<a
|
|
||||||
:href="link"
|
|
||||||
:aria-label="title"
|
|
||||||
class="py-1 btn btn-outline-secondary"
|
|
||||||
>
|
|
||||||
<div class="d-flex flex-column">
|
|
||||||
<i aria-hidden="true" :class="icon"></i>
|
|
||||||
<span style="font-size:.5rem">{{ title }}</span>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</fhc-calendar>
|
|
||||||
</div>
|
|
||||||
`,
|
|
||||||
};
|
|
||||||
+17
-32
@@ -3,8 +3,7 @@ import FhcCalendar from "../../Calendar/LvPlan.js";
|
|||||||
import ApiLvPlan from '../../../api/factory/lvPlan.js';
|
import ApiLvPlan from '../../../api/factory/lvPlan.js';
|
||||||
import ApiAuthinfo from '../../../api/factory/authinfo.js';
|
import ApiAuthinfo from '../../../api/factory/authinfo.js';
|
||||||
|
|
||||||
export const DEFAULT_MODE_LVPLAN_DESKTOP = "Week";
|
export const DEFAULT_MODE_LVPLAN = 'Week'
|
||||||
export const DEFAULT_MODE_LVPLAN_MOBILE = "List";
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'LvPlanPersonal',
|
name: 'LvPlanPersonal',
|
||||||
@@ -12,6 +11,7 @@ export default {
|
|||||||
FhcCalendar
|
FhcCalendar
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
|
viewData: Object, // NOTE(chris): this is inherited from router-view
|
||||||
propsViewData: Object
|
propsViewData: Object
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
@@ -21,30 +21,18 @@ export default {
|
|||||||
studiensemester_ende: null,
|
studiensemester_ende: null,
|
||||||
uid: null,
|
uid: null,
|
||||||
isMitarbeiter: false,
|
isMitarbeiter: false,
|
||||||
isStudent: false,
|
isStudent: false
|
||||||
timezone: FHC_JS_DATA_STORAGE_OBJECT.timezone,
|
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
inject: ["isMobile"],
|
|
||||||
computed:{
|
computed:{
|
||||||
currentDay() {
|
currentDay() {
|
||||||
if (!this.propsViewData?.focus_date || isNaN(new Date(this.propsViewData?.focus_date)))
|
if (!this.propsViewData?.focus_date || isNaN(new Date(this.propsViewData?.focus_date)))
|
||||||
return luxon.DateTime.now().setZone(this.timezone).toISODate();
|
return luxon.DateTime.now().setZone(this.viewData.timezone).toISODate();
|
||||||
return this.propsViewData?.focus_date;
|
return this.propsViewData?.focus_date;
|
||||||
},
|
},
|
||||||
currentMode() {
|
currentMode() {
|
||||||
let validModes = ["day", "month"];
|
if (!this.propsViewData?.mode || !['day', 'week', 'month'].includes(this.propsViewData?.mode.toLowerCase()))
|
||||||
validModes.push(this.isMobile ? "list" : "week");
|
return DEFAULT_MODE_LVPLAN;
|
||||||
|
|
||||||
const defaultMode = this.isMobile
|
|
||||||
? DEFAULT_MODE_LVPLAN_MOBILE
|
|
||||||
: DEFAULT_MODE_LVPLAN_DESKTOP;
|
|
||||||
|
|
||||||
if (
|
|
||||||
!this.propsViewData?.mode ||
|
|
||||||
!validModes.includes(this.propsViewData?.mode.toLowerCase())
|
|
||||||
)
|
|
||||||
return defaultMode;
|
|
||||||
return this.propsViewData?.mode;
|
return this.propsViewData?.mode;
|
||||||
},
|
},
|
||||||
downloadLinks() {
|
downloadLinks() {
|
||||||
@@ -59,7 +47,7 @@ export default {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const opts = { zone: this.timezone };
|
const opts = { zone: this.viewData.timezone };
|
||||||
const start = luxon.DateTime
|
const start = luxon.DateTime
|
||||||
.fromISO(this.studiensemester_start, opts)
|
.fromISO(this.studiensemester_start, opts)
|
||||||
.toUnixInteger();
|
.toUnixInteger();
|
||||||
@@ -114,18 +102,16 @@ export default {
|
|||||||
this.$api.call(ApiLvPlan.eventsPersonal(start.toISODate(), end.toISODate())),
|
this.$api.call(ApiLvPlan.eventsPersonal(start.toISODate(), end.toISODate())),
|
||||||
this.$api.call(ApiLvPlan.getLvPlanReservierungen(start.toISODate(), end.toISODate()))
|
this.$api.call(ApiLvPlan.getLvPlanReservierungen(start.toISODate(), end.toISODate()))
|
||||||
];
|
];
|
||||||
},
|
}
|
||||||
async fetchAuthInfo() {
|
|
||||||
const authInfoResponse = await this.$api.call(ApiAuthinfo.getAuthInfo());
|
|
||||||
|
|
||||||
const authInfo = authInfoResponse.data;
|
|
||||||
this.uid = authInfo.uid;
|
|
||||||
this.isMitarbeiter = authInfo.isMitarbeiter;
|
|
||||||
this.isStudent = authInfo.isStudent;
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
async created() {
|
created() {
|
||||||
await this.fetchAuthInfo();
|
this.$api
|
||||||
|
.call(ApiAuthinfo.getAuthInfo())
|
||||||
|
.then(res => {
|
||||||
|
this.uid = res.data.uid;
|
||||||
|
this.isMitarbeiter = res.data.isMitarbeiter;
|
||||||
|
this.isStudent = res.data.isStudent;
|
||||||
|
});
|
||||||
},
|
},
|
||||||
template: /*html*/`
|
template: /*html*/`
|
||||||
<div class="cis-lvplan-personal d-flex flex-column h-100">
|
<div class="cis-lvplan-personal d-flex flex-column h-100">
|
||||||
@@ -137,9 +123,8 @@ export default {
|
|||||||
</h2>
|
</h2>
|
||||||
<hr>
|
<hr>
|
||||||
<fhc-calendar
|
<fhc-calendar
|
||||||
v-if="timezone"
|
|
||||||
ref="calendar"
|
ref="calendar"
|
||||||
:timezone="timezone"
|
:timezone="viewData.timezone"
|
||||||
:get-promise-func="getPromiseFunc"
|
:get-promise-func="getPromiseFunc"
|
||||||
:date="currentDay"
|
:date="currentDay"
|
||||||
:mode="currentMode"
|
:mode="currentMode"
|
||||||
@@ -1,413 +0,0 @@
|
|||||||
import FormForm from "../../Form/Form.js";
|
|
||||||
import FormInput from "../../Form/Input.js";
|
|
||||||
import FhcCalendar from "../../Calendar/LvPlan.js";
|
|
||||||
|
|
||||||
import ApiLvPlan from '../.././../api/factory/lvPlan.js';
|
|
||||||
import ApiStgOrgLvPlan from '../.././../api/factory/stgOrgLvPlan.js';
|
|
||||||
import ApiAuthinfo from '../../../api/factory/authinfo.js';
|
|
||||||
|
|
||||||
export const DEFAULT_MODE_LVPLAN_DESKTOP = "Week";
|
|
||||||
export const DEFAULT_MODE_LVPLAN_MOBILE = "List";
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: "LvPlanStgOrg",
|
|
||||||
components: {
|
|
||||||
FormForm,
|
|
||||||
FormInput,
|
|
||||||
FhcCalendar,
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
propsViewData: Object
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
localProps: {},
|
|
||||||
studiensemester_kurzbz: null,
|
|
||||||
studiensemester_start: null,
|
|
||||||
studiensemester_ende: null,
|
|
||||||
uid: null,
|
|
||||||
isMitarbeiter: false,
|
|
||||||
isStudent: false,
|
|
||||||
currentStgBezeichnung: null,
|
|
||||||
formData: {
|
|
||||||
stgkz: null,
|
|
||||||
sem: null,
|
|
||||||
verband: null,
|
|
||||||
gruppe: null,
|
|
||||||
},
|
|
||||||
listStg: [],
|
|
||||||
listSem: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
|
|
||||||
listVerband: [],
|
|
||||||
listGroup: [],
|
|
||||||
rangeIntervalFirst: null,
|
|
||||||
timezone: FHC_JS_DATA_STORAGE_OBJECT.timezone,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
inject: ["isMobile"],
|
|
||||||
computed: {
|
|
||||||
maxSemester() {
|
|
||||||
const currentStg = this.listStg.find(
|
|
||||||
(item) => item.studiengang_kz === this.formData.stgkz,
|
|
||||||
);
|
|
||||||
return currentStg?.max_semester;
|
|
||||||
},
|
|
||||||
currentDay() {
|
|
||||||
if (!this.propsViewData?.focus_date || isNaN(new Date(this.propsViewData?.focus_date)))
|
|
||||||
return luxon.DateTime.now().setZone(this.timezone).toISODate();
|
|
||||||
return this.propsViewData?.focus_date;
|
|
||||||
},
|
|
||||||
currentMode() {
|
|
||||||
let validModes = ["day", "month"];
|
|
||||||
validModes.push(this.isMobile ? "list" : "week");
|
|
||||||
|
|
||||||
const defaultMode = this.isMobile
|
|
||||||
? DEFAULT_MODE_LVPLAN_MOBILE
|
|
||||||
: DEFAULT_MODE_LVPLAN_DESKTOP;
|
|
||||||
|
|
||||||
if (
|
|
||||||
!this.propsViewData?.mode ||
|
|
||||||
!validModes.includes(this.propsViewData?.mode.toLowerCase())
|
|
||||||
)
|
|
||||||
return defaultMode;
|
|
||||||
return this.propsViewData?.mode;
|
|
||||||
},
|
|
||||||
downloadLinks() {
|
|
||||||
if (
|
|
||||||
!this.studiensemester_start ||
|
|
||||||
!this.studiensemester_ende ||
|
|
||||||
!this.uid
|
|
||||||
)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
let type = false;
|
|
||||||
type = this.isStudent ? "student" : type;
|
|
||||||
type = this.isMitarbeiter ? "lektor" : type;
|
|
||||||
if (false === type) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const opts = { zone: this.timezone };
|
|
||||||
const start = luxon.DateTime
|
|
||||||
.fromISO(this.studiensemester_start, opts)
|
|
||||||
.toUnixInteger();
|
|
||||||
const ende = luxon.DateTime
|
|
||||||
.fromISO(this.studiensemester_ende, opts)
|
|
||||||
.toUnixInteger();
|
|
||||||
|
|
||||||
const download_link =
|
|
||||||
FHC_JS_DATA_STORAGE_OBJECT.app_root +
|
|
||||||
"cis/private/lvplan/stpl_kalender.php" +
|
|
||||||
"?type=" +
|
|
||||||
type +
|
|
||||||
"&pers_uid=" +
|
|
||||||
this.uid +
|
|
||||||
"&begin=" +
|
|
||||||
start +
|
|
||||||
"&ende=" +
|
|
||||||
ende;
|
|
||||||
|
|
||||||
return [
|
|
||||||
{
|
|
||||||
title: "excel",
|
|
||||||
icon: "fa-solid fa-file-excel",
|
|
||||||
link: download_link + "&format=excel",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "csv",
|
|
||||||
icon: "fa-solid fa-file-csv",
|
|
||||||
link: download_link + "&format=csv",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "ical1",
|
|
||||||
icon: "fa-regular fa-calendar",
|
|
||||||
link: download_link + "&format=ical&version=1&target=ical",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "ical2",
|
|
||||||
icon: "fa-regular fa-calendar",
|
|
||||||
link: download_link + "&format=ical&version=2&target=ical",
|
|
||||||
},
|
|
||||||
];
|
|
||||||
},
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
loadLvPlan() {
|
|
||||||
if (!this.formData.stgkz) {
|
|
||||||
this.$fhcAlert.alertError(this.$p.t("LvPlan", "chooseStg"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (
|
|
||||||
!this.formData.sem &&
|
|
||||||
(this.formData.verband || this.formData.gruppe)
|
|
||||||
) {
|
|
||||||
this.$fhcAlert.alertError(
|
|
||||||
this.$p.t("LvPlan", "error_SemMissing"),
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!this.formData.verband && this.formData.gruppe) {
|
|
||||||
this.$fhcAlert.alertError(
|
|
||||||
this.$p.t("LvPlan", "error_VerbandMissing"),
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const params = {
|
|
||||||
mode: this.currentMode,
|
|
||||||
focus_date: this.currentDay,
|
|
||||||
stgkz: this.formData.stgkz,
|
|
||||||
sem: this.formData.sem,
|
|
||||||
verband: this.formData.verband,
|
|
||||||
gruppe: this.formData.gruppe,
|
|
||||||
};
|
|
||||||
|
|
||||||
//ensure logic: no value after a null value in route
|
|
||||||
if (params.sem == null) {
|
|
||||||
params.verband = null;
|
|
||||||
params.gruppe = null;
|
|
||||||
}
|
|
||||||
if (params.verband == null) {
|
|
||||||
params.gruppe = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
//delete all null values to avoid null in router
|
|
||||||
Object.keys(params).forEach(
|
|
||||||
(key) => params[key] == null && delete params[key],
|
|
||||||
);
|
|
||||||
|
|
||||||
this.$router.push({
|
|
||||||
name: "StgOrgLvPlan",
|
|
||||||
params,
|
|
||||||
});
|
|
||||||
|
|
||||||
this.$refs['calendar']?.resetEventLoader();
|
|
||||||
},
|
|
||||||
loadListSem(){
|
|
||||||
if(!this.listSem)
|
|
||||||
this.listSem = [...Array(this.maxSemester).keys()].map(i => i + 1);
|
|
||||||
},
|
|
||||||
loadListVerband() {
|
|
||||||
this.$api
|
|
||||||
.call(ApiLvPlan.getLehrverband(this.formData.stgkz, this.formData.sem, this.formData.verband))
|
|
||||||
.then(result => {
|
|
||||||
const data = result.data;
|
|
||||||
const mappedData = data.map((item) => item.verband);
|
|
||||||
this.listVerband = [
|
|
||||||
...new Set(
|
|
||||||
mappedData.filter(
|
|
||||||
(v) =>
|
|
||||||
v !== null &&
|
|
||||||
v !== undefined &&
|
|
||||||
String(v).trim() !== "",
|
|
||||||
),
|
|
||||||
),
|
|
||||||
].sort();
|
|
||||||
})
|
|
||||||
.catch(this.$fhcAlert.handleSystemError);
|
|
||||||
},
|
|
||||||
loadListGroup() {
|
|
||||||
this.$api
|
|
||||||
.call(ApiLvPlan.getGruppe(this.formData.stgkz, this.formData.sem, this.formData.verband))
|
|
||||||
.then(result => {
|
|
||||||
const data = result.data;
|
|
||||||
const mappedData = data.map((item) => item.gruppe);
|
|
||||||
this.listGroup = [
|
|
||||||
...new Set(
|
|
||||||
mappedData.filter(
|
|
||||||
(v) =>
|
|
||||||
v !== null &&
|
|
||||||
v !== undefined &&
|
|
||||||
String(v).trim() !== "",
|
|
||||||
),
|
|
||||||
),
|
|
||||||
].sort();
|
|
||||||
})
|
|
||||||
.catch(this.$fhcAlert.handleSystemError);
|
|
||||||
},
|
|
||||||
handleChangeDate(day, newMode) {
|
|
||||||
return this.handleChangeMode(newMode, day);
|
|
||||||
},
|
|
||||||
handleChangeMode(newMode, day) {
|
|
||||||
const mode = newMode[0].toUpperCase() + newMode.slice(1);
|
|
||||||
const focus_date = day.toISODate();
|
|
||||||
|
|
||||||
this.$router.push({
|
|
||||||
name: "StgOrgLvPlan",
|
|
||||||
params: {
|
|
||||||
mode,
|
|
||||||
focus_date,
|
|
||||||
stgkz: this.formData.stgkz,
|
|
||||||
sem: this.formData.sem,
|
|
||||||
verband: this.formData.verband,
|
|
||||||
gruppe: this.formData.gruppe,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
},
|
|
||||||
updateRange(rangeInterval) {
|
|
||||||
this.$api
|
|
||||||
.call(
|
|
||||||
ApiLvPlan.studiensemesterDateInterval(
|
|
||||||
rangeInterval.end.startOf("week").toISODate(),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
.then((res) => {
|
|
||||||
this.studiensemester_kurzbz =
|
|
||||||
res.data.studiensemester_kurzbz;
|
|
||||||
this.studiensemester_start = res.data.start;
|
|
||||||
this.studiensemester_ende = res.data.ende;
|
|
||||||
});
|
|
||||||
},
|
|
||||||
getPromiseFunc(start, end) {
|
|
||||||
return [
|
|
||||||
this.$api.call(
|
|
||||||
ApiLvPlan.eventsStgOrg(
|
|
||||||
start,
|
|
||||||
end,
|
|
||||||
this.formData.stgkz,
|
|
||||||
this.formData.sem,
|
|
||||||
this.formData.verband,
|
|
||||||
this.formData.gruppe,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
];
|
|
||||||
},
|
|
||||||
async fetchAuthInfo() {
|
|
||||||
const authInfoResponse = await this.$api.call(ApiAuthinfo.getAuthInfo());
|
|
||||||
|
|
||||||
const authInfo = authInfoResponse.data;
|
|
||||||
this.uid = authInfo.uid;
|
|
||||||
this.isMitarbeiter = authInfo.isMitarbeiter;
|
|
||||||
this.isStudent = authInfo.isStudent;
|
|
||||||
},
|
|
||||||
async fetchViewData() {
|
|
||||||
const viewDataResponse = await this.$api.call(ApiStgOrgLvPlan.getStgOrgLvPlanViewData());
|
|
||||||
|
|
||||||
const viewData = viewDataResponse.data;
|
|
||||||
this.listStg = viewData.studiengaenge;
|
|
||||||
},
|
|
||||||
},
|
|
||||||
async created(){
|
|
||||||
await this.fetchAuthInfo();
|
|
||||||
await this.fetchViewData();
|
|
||||||
|
|
||||||
if (this.propsViewData) {
|
|
||||||
this.formData.stgkz = this.propsViewData.stgkz ? this.propsViewData.stgkz: null;
|
|
||||||
this.formData.sem = this.propsViewData.sem ? this.propsViewData.sem: null;
|
|
||||||
this.formData.verband = this.propsViewData.verband ? this.propsViewData.verband: null;
|
|
||||||
this.formData.gruppe = this.propsViewData.gruppe ? this.propsViewData.gruppe: null;
|
|
||||||
|
|
||||||
//ensure loading dropdown arrays for version propsView
|
|
||||||
if(!this.listVerband.length && this.formData.sem)
|
|
||||||
{
|
|
||||||
this.loadListVerband();
|
|
||||||
}
|
|
||||||
if(!this.listGroup.length && this.formData.verband)
|
|
||||||
{
|
|
||||||
this.loadListGroup();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
template: `
|
|
||||||
<div class="cis-lvplan-stg-org d-flex flex-column h-100">
|
|
||||||
|
|
||||||
<div class="mt-3">
|
|
||||||
<form-form class="row row-cols-1 row-cols-md-2 row-cols-lg-4 row-cols-xl-5 g-3 mb-3">
|
|
||||||
<form-input
|
|
||||||
type="select"
|
|
||||||
v-model="formData.stgkz"
|
|
||||||
@change="loadListSem(formData.stgkz)"
|
|
||||||
>
|
|
||||||
<option :value="null" selected>{{ $p.t('LvPlan/chooseStg') }}</option>
|
|
||||||
<option
|
|
||||||
v-for="stg in listStg"
|
|
||||||
:key="stg.studiengang_kz"
|
|
||||||
:value="stg.studiengang_kz"
|
|
||||||
>
|
|
||||||
{{ stg.kurzbzlang }} ({{ stg.bezeichnung }})
|
|
||||||
</option>
|
|
||||||
</form-input>
|
|
||||||
<form-input
|
|
||||||
type="select"
|
|
||||||
v-model="formData.sem"
|
|
||||||
@change="loadListVerband()"
|
|
||||||
@click="loadListSem(formData.stgkz)"
|
|
||||||
>
|
|
||||||
<option :value="null" selected>Semester</option>
|
|
||||||
<option
|
|
||||||
v-for="sem in listSem"
|
|
||||||
:key="sem"
|
|
||||||
:value="sem"
|
|
||||||
>
|
|
||||||
{{ sem }}
|
|
||||||
</option>
|
|
||||||
</form-input>
|
|
||||||
<form-input
|
|
||||||
type="select"
|
|
||||||
v-model="formData.verband"
|
|
||||||
@change="loadListGroup()"
|
|
||||||
>
|
|
||||||
<option :value="null" selected>{{ $p.t('lehre/verband') }} </option>
|
|
||||||
<option
|
|
||||||
v-for="verband in listVerband"
|
|
||||||
:key="verband"
|
|
||||||
:value="verband"
|
|
||||||
>
|
|
||||||
{{ verband }}
|
|
||||||
</option>
|
|
||||||
</form-input>
|
|
||||||
<form-input
|
|
||||||
type="select"
|
|
||||||
v-model="formData.gruppe"
|
|
||||||
>
|
|
||||||
<option :value="null" selected>{{ $p.t('gruppenmanagement/gruppe') }}</option>
|
|
||||||
<option
|
|
||||||
v-for="group in listGroup"
|
|
||||||
:key="group"
|
|
||||||
:value="group"
|
|
||||||
>
|
|
||||||
{{ group }}
|
|
||||||
</option>
|
|
||||||
</form-input>
|
|
||||||
<button type="button" class="btn btn-secondary" @click="loadLvPlan">{{ $p.t('LvPlan/loadLvPlan') }}</button>
|
|
||||||
|
|
||||||
</form-form>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<template v-if="timezone">
|
|
||||||
<fhc-calendar
|
|
||||||
v-if="propsViewData && propsViewData.stgkz"
|
|
||||||
ref="calendar"
|
|
||||||
v-model:lv="formData"
|
|
||||||
:timezone="timezone"
|
|
||||||
:get-promise-func="getPromiseFunc"
|
|
||||||
:date="currentDay"
|
|
||||||
:mode="currentMode"
|
|
||||||
@update:date="handleChangeDate"
|
|
||||||
@update:mode="handleChangeMode"
|
|
||||||
@update:range="updateRange"
|
|
||||||
class="responsive-calendar"
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
v-if="downloadLinks"
|
|
||||||
class="d-flex gap-1 justify-items-start"
|
|
||||||
>
|
|
||||||
<div v-for="{ title, icon, link } in downloadLinks">
|
|
||||||
<a
|
|
||||||
:href="link"
|
|
||||||
:aria-label="title"
|
|
||||||
class="py-1 btn btn-outline-secondary"
|
|
||||||
>
|
|
||||||
<div class="d-flex flex-column">
|
|
||||||
<i aria-hidden="true" :class="icon"></i>
|
|
||||||
<span style="font-size:.5rem">{{ title }}</span>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</fhc-calendar>
|
|
||||||
</template>
|
|
||||||
</div>
|
|
||||||
`,
|
|
||||||
};
|
|
||||||
@@ -1,187 +0,0 @@
|
|||||||
import FhcCalendar from "../../Calendar/LvPlan.js";
|
|
||||||
|
|
||||||
import ApiLvPlan from '../.././../api/factory/lvPlan.js';
|
|
||||||
import ApiAuthinfo from '../../../api/factory/authinfo.js';
|
|
||||||
|
|
||||||
export const DEFAULT_MODE_LVPLAN = 'Week';
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'LvPlanStgOrg',
|
|
||||||
inject: {
|
|
||||||
cisRoot: {
|
|
||||||
from: 'cisRoot'
|
|
||||||
},
|
|
||||||
},
|
|
||||||
components: {
|
|
||||||
FhcCalendar,
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
viewData: Object,
|
|
||||||
propsViewData: Object
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
studiensemester_kurzbz: null,
|
|
||||||
studiensemester_start: null,
|
|
||||||
studiensemester_ende: null,
|
|
||||||
uid: null,
|
|
||||||
isMitarbeiter: false,
|
|
||||||
isStudent: false,
|
|
||||||
listStg: [],
|
|
||||||
currentStgBezeichnung: null
|
|
||||||
};
|
|
||||||
},
|
|
||||||
computed:{
|
|
||||||
currentDay() {
|
|
||||||
if (!this.propsViewData?.focus_date || isNaN(new Date(this.propsViewData?.focus_date)))
|
|
||||||
return luxon.DateTime.now().setZone(this.viewData.timezone).toISODate();
|
|
||||||
return this.propsViewData?.focus_date;
|
|
||||||
},
|
|
||||||
currentMode() {
|
|
||||||
if (!this.propsViewData?.mode || !['day', 'week', 'month'].includes(this.propsViewData?.mode.toLowerCase()))
|
|
||||||
return DEFAULT_MODE_LVPLAN;
|
|
||||||
return this.propsViewData?.mode;
|
|
||||||
},
|
|
||||||
downloadLinks() {
|
|
||||||
if (!this.studiensemester_start || !this.studiensemester_ende || !this.uid)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
let type = false;
|
|
||||||
type = this.isStudent ? 'student' : type;
|
|
||||||
type = this.isMitarbeiter ? 'lektor' : type;
|
|
||||||
if (false === type)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const opts = { zone: this.viewData.timezone };
|
|
||||||
const start = luxon.DateTime
|
|
||||||
.fromISO(this.studiensemester_start, opts)
|
|
||||||
.toUnixInteger();
|
|
||||||
const ende = luxon.DateTime
|
|
||||||
.fromISO(this.studiensemester_ende, opts)
|
|
||||||
.toUnixInteger();
|
|
||||||
|
|
||||||
const download_link = FHC_JS_DATA_STORAGE_OBJECT.app_root
|
|
||||||
+ 'cis/private/lvplan/stpl_kalender.php'
|
|
||||||
+ '?type=' + type
|
|
||||||
+ '&pers_uid=' + this.uid
|
|
||||||
+ '&begin=' + start
|
|
||||||
+ '&ende=' + ende;
|
|
||||||
|
|
||||||
return [
|
|
||||||
{ title: "excel", icon: 'fa-solid fa-file-excel', link: download_link + '&format=excel' },
|
|
||||||
{ title: "csv", icon: 'fa-solid fa-file-csv', link: download_link + '&format=csv' },
|
|
||||||
{ title: "ical1", icon: 'fa-regular fa-calendar', link: download_link + '&format=ical&version=1&target=ical' },
|
|
||||||
{ title: "ical2", icon: 'fa-regular fa-calendar', link: download_link + '&format=ical&version=2&target=ical' }
|
|
||||||
];
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
handleChangeDate(day, newMode) {
|
|
||||||
return this.handleChangeMode(newMode, day);
|
|
||||||
},
|
|
||||||
handleChangeMode(newMode, day) {
|
|
||||||
const mode = newMode[0].toUpperCase() + newMode.slice(1)
|
|
||||||
const focus_date = day.toISODate();
|
|
||||||
|
|
||||||
this.$router.push({
|
|
||||||
name: "StgOrgLvPlan",
|
|
||||||
params: {
|
|
||||||
mode,
|
|
||||||
focus_date,
|
|
||||||
stgkz: this.propsViewData.stgkz,
|
|
||||||
sem: this.propsViewData.sem,
|
|
||||||
verband: this.propsViewData.verband,
|
|
||||||
gruppe: this.propsViewData.gruppe,
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
updateRange(rangeInterval) {
|
|
||||||
this.$api
|
|
||||||
.call(ApiLvPlan.studiensemesterDateInterval(
|
|
||||||
rangeInterval.end.startOf('week').toISODate()
|
|
||||||
))
|
|
||||||
.then(res => {
|
|
||||||
this.studiensemester_kurzbz = res.data.studiensemester_kurzbz;
|
|
||||||
this.studiensemester_start = res.data.start;
|
|
||||||
this.studiensemester_ende = res.data.ende;
|
|
||||||
});
|
|
||||||
},
|
|
||||||
getPromiseFunc(start, end) {
|
|
||||||
return [
|
|
||||||
this.$api.call(ApiLvPlan.eventsStgOrg(start.toISODate(), end.toISODate(), this.propsViewData.stgkz, this.propsViewData.sem, this.propsViewData.verband, this.propsViewData.gruppe)),
|
|
||||||
//local for test
|
|
||||||
/* this.$api.call(ApiLvPlan.eventsStgOrg(start.toISODate(), end.toISODate(), this.stgkz, this.sem, this.verband, this.gruppe))*/
|
|
||||||
];
|
|
||||||
},
|
|
||||||
backToDropdown(){
|
|
||||||
this.$router.push({
|
|
||||||
name: "OverviewLvPlan",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
created(){
|
|
||||||
this.$api
|
|
||||||
.call(ApiAuthinfo.getAuthInfo())
|
|
||||||
.then(res => {
|
|
||||||
this.uid = res.data.uid;
|
|
||||||
this.isMitarbeiter = res.data.isMitarbeiter;
|
|
||||||
this.isStudent = res.data.isStudent;
|
|
||||||
});
|
|
||||||
|
|
||||||
if(this.propsViewData.stgkz) {
|
|
||||||
this.$api
|
|
||||||
.call(ApiLvPlan.getStudiengaenge())
|
|
||||||
.then(result => {
|
|
||||||
const currentStg = result.data.find(
|
|
||||||
item => item.studiengang_kz == this.propsViewData.stgkz
|
|
||||||
);
|
|
||||||
this.currentStgBezeichnung = currentStg.kurzbzlang + " - " + currentStg.bezeichnung;
|
|
||||||
})
|
|
||||||
.catch(this.$fhcAlert.handleSystemError);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
template: `
|
|
||||||
<div class="cis-lvplan-stg-org d-flex flex-column h-100">
|
|
||||||
<h2>{{ $p.t('LvPlan/headerLvPlanLvVerband') }}</h2>
|
|
||||||
<p v-if="propsViewData.stgkz"><span><strong>{{currentStgBezeichnung}}</strong></span>
|
|
||||||
<span v-if="propsViewData.sem" style="margin-left:10px;"> Semester: {{propsViewData.sem}} </span>
|
|
||||||
<span v-if="propsViewData.verband" style="margin-left:10px;"> Verband: {{propsViewData.verband}} </span>
|
|
||||||
<span v-if="propsViewData.gruppe" style="margin-left:10px;"> Gruppe: {{propsViewData.gruppe}} </span>
|
|
||||||
<button class="py-1 btn btn-outline-secondary" :title="this.$p.t('LvPlan', 'backToDropdown')" style="margin-left:10px;"> <i class="fa fa-arrow-left fa-xs" @click="backToDropdown"></i></button>
|
|
||||||
</p>
|
|
||||||
<p v-else>{{ $p.t('LvPlan/noStgProvided') }}</p>
|
|
||||||
|
|
||||||
<fhc-calendar
|
|
||||||
ref="calendar"
|
|
||||||
:timezone="viewData.timezone"
|
|
||||||
:get-promise-func="getPromiseFunc"
|
|
||||||
:date="currentDay"
|
|
||||||
:mode="currentMode"
|
|
||||||
@update:date="handleChangeDate"
|
|
||||||
@update:mode="handleChangeMode"
|
|
||||||
@update:range="updateRange"
|
|
||||||
class="responsive-calendar"
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
v-if="downloadLinks"
|
|
||||||
class="d-flex gap-1 justify-items-start"
|
|
||||||
>
|
|
||||||
<div v-for="{ title, icon, link } in downloadLinks">
|
|
||||||
<a
|
|
||||||
:href="link"
|
|
||||||
:aria-label="title"
|
|
||||||
class="py-1 btn btn-outline-secondary"
|
|
||||||
>
|
|
||||||
<div class="d-flex flex-column">
|
|
||||||
<i aria-hidden="true" :class="icon"></i>
|
|
||||||
<span style="font-size:.5rem">{{ title }}</span>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</fhc-calendar>
|
|
||||||
</div>
|
|
||||||
`,
|
|
||||||
};
|
|
||||||
@@ -30,7 +30,6 @@ export default {
|
|||||||
menuOpen:true,
|
menuOpen:true,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
inject: ["isMobile"],
|
|
||||||
provide(){
|
provide(){
|
||||||
return{
|
return{
|
||||||
setActiveEntry: this.setActiveEntry,
|
setActiveEntry: this.setActiveEntry,
|
||||||
@@ -59,7 +58,7 @@ export default {
|
|||||||
},
|
},
|
||||||
site_url(){
|
site_url(){
|
||||||
return FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router;
|
return FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router;
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
fetchMenu() {
|
fetchMenu() {
|
||||||
@@ -113,26 +112,10 @@ export default {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
template: /*html*/`
|
template: /*html*/`
|
||||||
<div
|
<button id="nav-main-btn" class="navbar-toggler rounded-0" type="button" data-bs-toggle="offcanvas" data-bs-target="#nav-main" aria-controls="nav-main" aria-expanded="false" aria-label="Toggle navigation">
|
||||||
id="header-options-collapsible"
|
<span class="navbar-toggler-icon"></span>
|
||||||
class="collapse multi-collapse collapse-horizontal show"
|
</button>
|
||||||
>
|
<fhc-searchbar ref="searchbar" id="nav-search" class="fhc-searchbar w-100 py-1 py-lg-2" :searchoptions="searchbaroptions" :searchfunction="searchfunction"></fhc-searchbar>
|
||||||
<div class="d-flex flex-row align-items-center gap-2 h-100" style="width: 79px">
|
|
||||||
<button id="nav-main-btn" class="navbar-toggler rounded-0 px-2 border-0" type="button" data-bs-toggle="offcanvas" data-bs-target="#nav-main" aria-controls="nav-main" aria-expanded="false" aria-label="Toggle navigation">
|
|
||||||
<span class="navbar-toggler-icon"></span>
|
|
||||||
</button>
|
|
||||||
<span v-if="isMobile" class="d-flex flex-row align-items-center">
|
|
||||||
<theme-switch></theme-switch>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<fhc-searchbar
|
|
||||||
:searchoptions="searchbaroptions"
|
|
||||||
:searchfunction="searchfunction"
|
|
||||||
ref="searchbar"
|
|
||||||
id="nav-search"
|
|
||||||
class="fhc-searchbar w-100 py-1 py-lg-2"
|
|
||||||
></fhc-searchbar>
|
|
||||||
<div id="nav-logo" class="d-none d-lg-block">
|
<div id="nav-logo" class="d-none d-lg-block">
|
||||||
<div class="d-flex h-100 justify-content-between">
|
<div class="d-flex h-100 justify-content-between">
|
||||||
<a :href="rootUrl">
|
<a :href="rootUrl">
|
||||||
@@ -141,32 +124,22 @@ export default {
|
|||||||
<theme-switch></theme-switch>
|
<theme-switch></theme-switch>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div id="nav-user">
|
||||||
<div
|
<button id="nav-user-btn" class="btn btn-link rounded-0" type="button" data-bs-toggle="collapse" data-bs-target="#nav-user-menu" aria-expanded="false" aria-controls="nav-user-menu">
|
||||||
id="header-usermenu-collapsible"
|
<img :src="avatarUrl" :alt="$p.t('profilUpdate/profilBild')" class="bg-dark avatar rounded-circle border border-dark"/>
|
||||||
class="collapse multi-collapse collapse-horizontal show"
|
</button>
|
||||||
>
|
<ul ref="navUserDropdown"
|
||||||
<div
|
@[\`shown.bs.collapse\`]="handleShowNavUser"
|
||||||
:style="!isMobile ? '' : 'width: 51px'"
|
@[\`hide.bs.collapse\`]="handleHideNavUser"
|
||||||
id="nav-user"
|
id="nav-user-menu" class="top-100 end-0 collapse list-unstyled" aria-labelledby="nav-user-btn">
|
||||||
>
|
<li><a class="fhc-dark-bg btn rounded-0 d-block" :href="site_url + '/Cis/Profil'" id="menu-profil">Profil</a></li>
|
||||||
<button id="nav-user-btn" class="btn btn-link rounded-0" type="button" data-bs-toggle="collapse" data-bs-target="#nav-user-menu" aria-expanded="false" aria-controls="nav-user-menu">
|
<li >
|
||||||
<img :src="avatarUrl" :alt="$p.t('profilUpdate/profilBild')" class="bg-dark avatar rounded-circle border border-dark"/>
|
<cis-sprachen @languageChanged="fetchMenu"></cis-sprachen>
|
||||||
</button>
|
</li>
|
||||||
<ul ref="navUserDropdown"
|
<li><hr class="dropdown-divider m-0 "></li>
|
||||||
@[\`shown.bs.collapse\`]="handleShowNavUser"
|
<li ><a class="fhc-dark-bg btn rounded-0 d-block" :href="logoutUrl">Logout</a></li>
|
||||||
@[\`hide.bs.collapse\`]="handleHideNavUser"
|
</ul>
|
||||||
id="nav-user-menu" class="top-100 end-0 collapse list-unstyled" aria-labelledby="nav-user-btn">
|
|
||||||
<li><a class="fhc-dark-bg btn rounded-0 d-block" :href="site_url + '/Cis/Profil'" id="menu-profil">Profil</a></li>
|
|
||||||
<li >
|
|
||||||
<cis-sprachen @languageChanged="fetchMenu"></cis-sprachen>
|
|
||||||
</li>
|
|
||||||
<li><hr class="dropdown-divider m-0 "></li>
|
|
||||||
<li ><a class="fhc-dark-bg btn rounded-0 d-block" :href="logoutUrl">Logout</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<nav id="nav-main" class="offcanvas offcanvas-start" tabindex="-1" aria-labelledby="nav-main-btn" data-bs-backdrop="false">
|
<nav id="nav-main" class="offcanvas offcanvas-start" tabindex="-1" aria-labelledby="nav-main-btn" data-bs-backdrop="false">
|
||||||
<div id="nav-main-sticky">
|
<div id="nav-main-sticky">
|
||||||
<div id="nav-main-toggle" class="position-static d-none d-lg-block ">
|
<div id="nav-main-toggle" class="position-static d-none d-lg-block ">
|
||||||
|
|||||||
@@ -68,8 +68,41 @@ export default {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
link() {
|
||||||
|
if (this.entry.template_kurzbz == 'redirect') {
|
||||||
|
if (!this.entry.content)
|
||||||
|
return '';
|
||||||
|
let xmlDoc = (new DOMParser()).parseFromString(this.entry.content,"text/xml");
|
||||||
|
let url = xmlDoc.getElementsByTagName('url')[0];
|
||||||
|
|
||||||
|
if (!url)
|
||||||
|
return '';
|
||||||
|
// TODO(chris): replace get params
|
||||||
|
url = url.childNodes[0].nodeValue + "";
|
||||||
|
if (url.includes("../cms/news.php")) {
|
||||||
|
let news_regex = new RegExp("^\.\./cms/news\.php");
|
||||||
|
url = url.replace(news_regex, FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/CisVue/Cms/news');
|
||||||
|
}
|
||||||
|
else if (url.includes("../cms/content.php?")) {
|
||||||
|
let content_regex = new RegExp("^\.\./cms/content.php\\?content_id=([0-9]+)");
|
||||||
|
let content_regex_result = content_regex.exec(url);
|
||||||
|
// content_regex_result[1] will be the first matched group
|
||||||
|
return FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/CisVue/Cms/content/' + content_regex_result[1];
|
||||||
|
}
|
||||||
|
else if(url.includes("../index.ci.php")){
|
||||||
|
let index_regex = new RegExp("^\.\./index\.ci\.php");
|
||||||
|
url = url.replace(index_regex, FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router);
|
||||||
|
}
|
||||||
|
else if (url.includes("../")) {
|
||||||
|
let relative_regex = new RegExp("^\.\./");
|
||||||
|
url = url.replace(relative_regex, FHC_JS_DATA_STORAGE_OBJECT.app_root);
|
||||||
|
}
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
return FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/CisVue/Cms/content/' + this.entry.content_id;
|
||||||
|
},
|
||||||
hasFullLink() {
|
hasFullLink() {
|
||||||
return this.entry.url.startsWith(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router)
|
return this.link.startsWith(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router)
|
||||||
},
|
},
|
||||||
target() {
|
target() {
|
||||||
if (this.entry.template_kurzbz == 'redirect') {
|
if (this.entry.template_kurzbz == 'redirect') {
|
||||||
@@ -112,7 +145,7 @@ export default {
|
|||||||
this.addUrlCount(count);
|
this.addUrlCount(count);
|
||||||
},
|
},
|
||||||
checkActiveUrl(url){
|
checkActiveUrl(url){
|
||||||
this.getUrlMatchPoints(url,this.entry.url);
|
this.getUrlMatchPoints(url,this.link);
|
||||||
|
|
||||||
let url_hash_spaceSymbol_regex = new RegExp("%20","gi");
|
let url_hash_spaceSymbol_regex = new RegExp("%20","gi");
|
||||||
let url_hash_sharpSymbol_regex = new RegExp("^#");
|
let url_hash_sharpSymbol_regex = new RegExp("^#");
|
||||||
@@ -122,7 +155,7 @@ export default {
|
|||||||
// if the url hash contains the titel of the menu
|
// if the url hash contains the titel of the menu
|
||||||
// or if the url equals the link of a menu
|
// or if the url equals the link of a menu
|
||||||
// then set the menu active
|
// then set the menu active
|
||||||
if (url_hash == this.entry.titel || url.href == this.entry.url) {
|
if (url_hash == this.entry.titel || url.href == this.link) {
|
||||||
this.setActiveEntry(this.entry.content_id);
|
this.setActiveEntry(this.entry.content_id);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -171,7 +204,7 @@ export default {
|
|||||||
<template v-if="hasChilds">
|
<template v-if="hasChilds">
|
||||||
<div class="btn-group w-100">
|
<div class="btn-group w-100">
|
||||||
<a :target="target"
|
<a :target="target"
|
||||||
:href="(entry.menu_open && hasFullLink) ? entry.url : null"
|
:href="(entry.menu_open && hasFullLink)?link:null"
|
||||||
@click="toggleCollapse"
|
@click="toggleCollapse"
|
||||||
:class="{
|
:class="{
|
||||||
'btn btn-default rounded-0 text-start': true,
|
'btn btn-default rounded-0 text-start': true,
|
||||||
@@ -194,7 +227,7 @@ export default {
|
|||||||
</ul>
|
</ul>
|
||||||
</template>
|
</template>
|
||||||
<a v-else
|
<a v-else
|
||||||
:href="entry.url"
|
:href="link"
|
||||||
:target="target"
|
:target="target"
|
||||||
:class="{
|
:class="{
|
||||||
'btn btn-default rounded-0 w-100 text-start': true,
|
'btn btn-default rounded-0 w-100 text-start': true,
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ export default {
|
|||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<span v-if="event?.lehrfach_bez ">{{event?.lehrfach_bez + (event?.stg_kurzbzlang?' / ' + event?.stg_kurzbzlang:'')}}</span>
|
<span v-if="event?.lehrfach_bez ">{{event?.lehrfach_bez + (event?.stg_kurzbzlang?' / ' + event?.stg_kurzbzlang:'')}}</span>
|
||||||
<span v-else>{{$p.t('lehre','lvUebersicht')}}</span>
|
<span v-else>Lehrveranstaltungs Übersicht</span>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -2,8 +2,7 @@ import FhcCalendar from "../../Calendar/LvPlan.js";
|
|||||||
|
|
||||||
import ApiLvPlan from '../../../api/factory/lvPlan.js';
|
import ApiLvPlan from '../../../api/factory/lvPlan.js';
|
||||||
|
|
||||||
export const DEFAULT_MODE_RAUMINFO_MOBILE = 'List';
|
export const DEFAULT_MODE_RAUMINFO = 'Week'
|
||||||
export const DEFAULT_MODE_RAUMINFO_DESKTOP = 'Week';
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "RoomInformation",
|
name: "RoomInformation",
|
||||||
@@ -14,14 +13,12 @@ export default {
|
|||||||
viewData: Object, // NOTE(chris): this is inherited from router-view
|
viewData: Object, // NOTE(chris): this is inherited from router-view
|
||||||
propsViewData: Object
|
propsViewData: Object
|
||||||
},
|
},
|
||||||
inject: ["isMobile"],
|
|
||||||
computed: {
|
computed: {
|
||||||
currentDay() {
|
currentDay() {
|
||||||
return this.propsViewData?.focus_date || luxon.DateTime.now().setZone(FHC_JS_DATA_STORAGE_OBJECT.timezone).toISODate();
|
return this.propsViewData?.focus_date || luxon.DateTime.now().setZone(this.viewData.timezone).toISODate();
|
||||||
},
|
},
|
||||||
currentMode() {
|
currentMode() {
|
||||||
const defaultMode = this.isMobile ? DEFAULT_MODE_RAUMINFO_MOBILE : DEFAULT_MODE_RAUMINFO_DESKTOP;
|
return this.propsViewData?.mode || DEFAULT_MODE_RAUMINFO;
|
||||||
return this.propsViewData?.mode || defaultMode;
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods:{
|
methods:{
|
||||||
@@ -54,6 +51,7 @@ export default {
|
|||||||
<hr>
|
<hr>
|
||||||
<fhc-calendar
|
<fhc-calendar
|
||||||
ref="calendar"
|
ref="calendar"
|
||||||
|
:timezone="viewData.timezone"
|
||||||
:get-promise-func="getPromiseFunc"
|
:get-promise-func="getPromiseFunc"
|
||||||
:date="currentDay"
|
:date="currentDay"
|
||||||
:mode="currentMode"
|
:mode="currentMode"
|
||||||
|
|||||||
@@ -1,11 +1,9 @@
|
|||||||
import MylvSemesterStudiengangLv from "./Studiengang/Lv.js";
|
import MylvSemesterStudiengangLv from "./Studiengang/Lv.js";
|
||||||
import MylvSemesterStudiengangAverageGrade from "./Studiengang/AverageGrade.js";
|
|
||||||
import Phrasen from "../../../../mixins/Phrasen.js";
|
import Phrasen from "../../../../mixins/Phrasen.js";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
MylvSemesterStudiengangLv,
|
MylvSemesterStudiengangLv
|
||||||
MylvSemesterStudiengangAverageGrade
|
|
||||||
},
|
},
|
||||||
mixins: [
|
mixins: [
|
||||||
Phrasen
|
Phrasen
|
||||||
@@ -31,10 +29,9 @@ export default {
|
|||||||
methods: {
|
methods: {
|
||||||
note(lv) {
|
note(lv) {
|
||||||
return lv.benotung ? lv.znote || lv.lvnote || null : null;
|
return lv.benotung ? lv.znote || lv.lvnote || null : null;
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
template: `<div class="card mb-3">
|
template: `<div class="card mb-3">
|
||||||
|
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<h4 class="card-title mb-3">{{$p.user_language.value === 'English' ? sg_bezeichnung_eng : bezeichnung}} - {{kuerzel}}
|
<h4 class="card-title mb-3">{{$p.user_language.value === 'English' ? sg_bezeichnung_eng : bezeichnung}} - {{kuerzel}}
|
||||||
<small>{{semester}}.{{$p.t('lehre/semester')}}</small>
|
<small>{{semester}}.{{$p.t('lehre/semester')}}</small>
|
||||||
@@ -44,7 +41,6 @@ export default {
|
|||||||
<mylv-semester-studiengang-lv v-bind="lv" class="text-center h-100"></mylv-semester-studiengang-lv>
|
<mylv-semester-studiengang-lv v-bind="lv" class="text-center h-100"></mylv-semester-studiengang-lv>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<mylv-semester-studiengang-average-grade :lvs="lvs" />
|
|
||||||
</div>
|
</div>
|
||||||
</div>`
|
</div>`
|
||||||
};
|
};
|
||||||
@@ -1,94 +0,0 @@
|
|||||||
import Phrasen from "../../../../../mixins/Phrasen.js";
|
|
||||||
|
|
||||||
export default {
|
|
||||||
mixins: [
|
|
||||||
Phrasen
|
|
||||||
],
|
|
||||||
props: {
|
|
||||||
lvs: Array,
|
|
||||||
},
|
|
||||||
data: ( ) =>{
|
|
||||||
return {
|
|
||||||
gradeAverage: null,
|
|
||||||
gradeWeightedAverage: null,
|
|
||||||
existingGrades: false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
calculateAverages(){
|
|
||||||
let sum = 0;
|
|
||||||
let count = 0;
|
|
||||||
let sumWeighted = 0;
|
|
||||||
let sumEcts = 0;
|
|
||||||
|
|
||||||
this.lvs.forEach((lv) => {
|
|
||||||
if ((lv.znote >= 1 && lv.znote <= 5) && lv.znote!= null) {
|
|
||||||
this.existingGrades = true;
|
|
||||||
sum+= lv.znote;
|
|
||||||
count++;
|
|
||||||
sumWeighted += lv.znote * Number(lv.ects);
|
|
||||||
sumEcts += Number(lv.ects);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.gradeAverage = (sum/count).toFixed(2);
|
|
||||||
this.gradeWeightedAverage = (sumWeighted/sumEcts).toFixed(2);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
lvs: {
|
|
||||||
handler() {
|
|
||||||
this.calculateAverages();
|
|
||||||
},
|
|
||||||
deep: true,
|
|
||||||
immediate: true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mounted(){
|
|
||||||
this.calculateAverages();
|
|
||||||
},
|
|
||||||
template: /*html*/`
|
|
||||||
<div class="card mylv-semester-studiengang-grades">
|
|
||||||
|
|
||||||
<div class="card-header text-center">
|
|
||||||
<h6>{{$p.t('lehre/notenstatistik')}}</h6>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div v-if="existingGrades">
|
|
||||||
<table class="card-body table w-auto mx-auto">
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td class="text-end">
|
|
||||||
{{$p.t('lehre/headerAverage')}}
|
|
||||||
</td>
|
|
||||||
<td class="text-start">
|
|
||||||
{{ gradeAverage }}
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td class="text-end">
|
|
||||||
{{$p.t('lehre/headerWeightedAverage')}}
|
|
||||||
</td>
|
|
||||||
<td class="text-start">
|
|
||||||
{{ gradeWeightedAverage }}
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
<div v-else class="card-body text-center">
|
|
||||||
<p>{{$p.t('lehre/info_noGradesYet')}}</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div v-if="existingGrades" class="card-footer d-flex align-items-start text-muted small">
|
|
||||||
<i class="fa fa-circle-info me-2 mt-1"></i>
|
|
||||||
<div>
|
|
||||||
<strong>{{$p.t('ui', 'hinweis')}}</strong><br>
|
|
||||||
* {{$p.t('lehre/noticeAverage')}}
|
|
||||||
<br>
|
|
||||||
** {{$p.t('lehre/noticeWeightedAverage')}}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
`
|
|
||||||
}
|
|
||||||
@@ -73,11 +73,11 @@ export default {
|
|||||||
},
|
},
|
||||||
grade() {
|
grade() {
|
||||||
const languageIndex = this.$p.user_language.value === 'English' ? 1 : 0
|
const languageIndex = this.$p.user_language.value === 'English' ? 1 : 0
|
||||||
// no more showing of grade LV, if grade Zeugnis is not existing yet
|
|
||||||
if(this.benotung && this.znotebez?.length) {
|
if(this.benotung && this.znotebez?.length) {
|
||||||
return this.znotebez[languageIndex]
|
return this.znotebez[languageIndex]
|
||||||
}
|
} else if(this.benotung && this.lvnotebez?.length) {
|
||||||
else return null
|
return this.lvnotebez[languageIndex]
|
||||||
|
} else return null
|
||||||
},
|
},
|
||||||
LvHasPruefungenInformation(){
|
LvHasPruefungenInformation(){
|
||||||
return this.pruefungenData && this.pruefungenData.length > 0;
|
return this.pruefungenData && this.pruefungenData.length > 0;
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import QuickLinks from "./ProfilComponents/QuickLinks.js";
|
|||||||
import ProfilEmails from "./ProfilComponents/ProfilEmails.js";
|
import ProfilEmails from "./ProfilComponents/ProfilEmails.js";
|
||||||
import RoleInformation from "./ProfilComponents/RoleInformation.js";
|
import RoleInformation from "./ProfilComponents/RoleInformation.js";
|
||||||
import ProfilInformation from "./ProfilComponents/ProfilInformation.js";
|
import ProfilInformation from "./ProfilComponents/ProfilInformation.js";
|
||||||
import CalendarSync from "./ProfilComponents/CalendarSync.js";
|
|
||||||
|
|
||||||
import ApiProfilUpdate from '../../../api/factory/profilUpdate.js';
|
import ApiProfilUpdate from '../../../api/factory/profilUpdate.js';
|
||||||
import { dateFilter } from '../../../tabulator/filters/Dates.js';
|
import { dateFilter } from '../../../tabulator/filters/Dates.js';
|
||||||
@@ -27,7 +26,6 @@ export default {
|
|||||||
ProfilEmails,
|
ProfilEmails,
|
||||||
RoleInformation,
|
RoleInformation,
|
||||||
ProfilInformation,
|
ProfilInformation,
|
||||||
CalendarSync,
|
|
||||||
},
|
},
|
||||||
|
|
||||||
inject: ["sortProfilUpdates", "collapseFunction", "language","isEditable"],
|
inject: ["sortProfilUpdates", "collapseFunction", "language","isEditable"],
|
||||||
@@ -105,6 +103,7 @@ export default {
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|
||||||
betriebsmittel_table_options: {
|
betriebsmittel_table_options: {
|
||||||
persistenceID: "filterTableMaProfilBetriebsmittel",
|
persistenceID: "filterTableMaProfilBetriebsmittel",
|
||||||
persistence: {
|
persistence: {
|
||||||
@@ -161,7 +160,6 @@ export default {
|
|||||||
props: {
|
props: {
|
||||||
data: Object,
|
data: Object,
|
||||||
editData: Object,
|
editData: Object,
|
||||||
calendarSyncUrls: Array,
|
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
@@ -298,11 +296,6 @@ export default {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
quickLinks() {
|
|
||||||
let quickLinks = [];
|
|
||||||
//
|
|
||||||
return quickLinks;
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
|
|
||||||
created() {
|
created() {
|
||||||
@@ -320,6 +313,7 @@ export default {
|
|||||||
});
|
});
|
||||||
//? sorts the profil Updates: pending -> accepted -> rejected
|
//? sorts the profil Updates: pending -> accepted -> rejected
|
||||||
this.data.profilUpdates?.sort(this.sortProfilUpdates);
|
this.data.profilUpdates?.sort(this.sortProfilUpdates);
|
||||||
|
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
'data.funktionen'(newVal) {
|
'data.funktionen'(newVal) {
|
||||||
@@ -337,6 +331,12 @@ export default {
|
|||||||
<edit-profil v-if="showModal" ref="editModal" :isMitarbeiter="true" @hideBsModal="hideEditProfilModal" :value="JSON.parse(JSON.stringify(filteredEditData))" :titel="$p.t('profil','profilBearbeiten')"></edit-profil>
|
<edit-profil v-if="showModal" ref="editModal" :isMitarbeiter="true" @hideBsModal="hideEditProfilModal" :value="JSON.parse(JSON.stringify(filteredEditData))" :titel="$p.t('profil','profilBearbeiten')"></edit-profil>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="d-md-none col-12 ">
|
<div class="d-md-none col-12 ">
|
||||||
|
<!--TODO: uncomment when implemented
|
||||||
|
<div class="row mb-3">
|
||||||
|
<div class="col">
|
||||||
|
<quick-links :title="$p.t('profil','quickLinks')" :mobile="true"></quick-links>
|
||||||
|
</div>
|
||||||
|
</div>-->
|
||||||
<!-- Bearbeiten Button -->
|
<!-- Bearbeiten Button -->
|
||||||
<div v-if="isEditable" class="row mb-3 ">
|
<div v-if="isEditable" class="row mb-3 ">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
@@ -465,11 +465,17 @@ export default {
|
|||||||
</div>
|
</div>
|
||||||
<!-- START OF SIDE PANEL -->
|
<!-- START OF SIDE PANEL -->
|
||||||
<div class="col-md-4 col-xxl-3 col-sm-12 text-break" >
|
<div class="col-md-4 col-xxl-3 col-sm-12 text-break" >
|
||||||
<div v-if="quickLinks.length" class="row mb-4">
|
<!--TODO: uncomment when implemented
|
||||||
<div class="col">
|
<div class="row d-none d-md-block mb-3">
|
||||||
<quick-links :title="$p.t('profil/quickLinks')" :links="quickLinks" />
|
|
||||||
</div>
|
<div class="col">
|
||||||
</div>
|
|
||||||
|
<quick-links :title="$p.t('profil','quickLinks')"></quick-links>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>-->
|
||||||
<!-- Bearbeiten Button -->
|
<!-- Bearbeiten Button -->
|
||||||
<div class="row d-none d-md-block ">
|
<div class="row d-none d-md-block ">
|
||||||
<div class="col mb-3">
|
<div class="col mb-3">
|
||||||
@@ -495,17 +501,12 @@ export default {
|
|||||||
<ausweis-status :data="data.zutrittsdatum"></ausweis-status>
|
<ausweis-status :data="data.zutrittsdatum"></ausweis-status>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row mb-3">
|
<div class="row">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<!-- MAILVERTEILER -->
|
<!-- MAILVERTEILER -->
|
||||||
<mailverteiler :data="data?.mailverteiler" :title="$p.t('profil','mailverteiler')"></mailverteiler>
|
<mailverteiler :data="data?.mailverteiler" :title="$p.t('profil','mailverteiler')"></mailverteiler>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
|
||||||
<div class="col">
|
|
||||||
<calendar-sync :uid="$props.data.username" :calendarSyncUrls="$props.calendarSyncUrls"></calendar-sync>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,30 +1,30 @@
|
|||||||
import { CoreFilterCmpt } from "../../../components/filter/Filter.js";
|
import {CoreFilterCmpt} from "../../../components/filter/Filter.js";
|
||||||
import Mailverteiler from "./ProfilComponents/Mailverteiler.js";
|
import Mailverteiler from "./ProfilComponents/Mailverteiler.js";
|
||||||
|
import QuickLinks from "./ProfilComponents/QuickLinks.js";
|
||||||
import RoleInformation from "./ProfilComponents/RoleInformation.js";
|
import RoleInformation from "./ProfilComponents/RoleInformation.js";
|
||||||
import ProfilEmails from "./ProfilComponents/ProfilEmails.js";
|
import ProfilEmails from "./ProfilComponents/ProfilEmails.js";
|
||||||
import ProfilInformation from "./ProfilComponents/ProfilInformation.js";
|
import ProfilInformation from "./ProfilComponents/ProfilInformation.js";
|
||||||
import QuickLinks from "./ProfilComponents/QuickLinks.js";
|
|
||||||
|
|
||||||
import { dateFilter } from "../../../tabulator/filters/Dates.js";
|
import { dateFilter } from '../../../tabulator/filters/Dates.js';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
CoreFilterCmpt,
|
CoreFilterCmpt,
|
||||||
Mailverteiler,
|
Mailverteiler,
|
||||||
|
QuickLinks,
|
||||||
RoleInformation,
|
RoleInformation,
|
||||||
ProfilEmails,
|
ProfilEmails,
|
||||||
ProfilInformation,
|
ProfilInformation,
|
||||||
QuickLinks,
|
|
||||||
},
|
},
|
||||||
inject: ["collapseFunction", "language"],
|
inject: ["collapseFunction", "language"],
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
collapseIconFunktionen: true,
|
collapseIconFunktionen: true,
|
||||||
preloadedPhrasen: {},
|
preloadedPhrasen:{},
|
||||||
funktionen_table_options: {
|
funktionen_table_options: {
|
||||||
persistenceID: "filterTableMaViewProfilFunktionen",
|
persistenceID: "filterTableMaViewProfilFunktionen",
|
||||||
persistence: {
|
persistence: {
|
||||||
columns: false,
|
columns: false
|
||||||
},
|
},
|
||||||
minHeight: 300,
|
minHeight: 300,
|
||||||
layout: "fitColumns",
|
layout: "fitColumns",
|
||||||
@@ -35,65 +35,58 @@ export default {
|
|||||||
//? option when wanting to hide the collapsed list
|
//? option when wanting to hide the collapsed list
|
||||||
|
|
||||||
{
|
{
|
||||||
title: "<i id='collapseIconFunktionen' role='button' class='fa-solid fa-angle-down '></i>",
|
title:
|
||||||
|
"<i id='collapseIconFunktionen' role='button' class='fa-solid fa-angle-down '></i>",
|
||||||
field: "collapse",
|
field: "collapse",
|
||||||
headerSort: false,
|
headerSort: false,
|
||||||
headerFilter: false,
|
headerFilter: false,
|
||||||
formatter: "responsiveCollapse",
|
formatter: "responsiveCollapse",
|
||||||
maxWidth: 40,
|
maxWidth: 40,
|
||||||
headerClick: this.collapseFunction,
|
headerClick: this.collapseFunction,
|
||||||
visible: true,
|
visible: true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: Vue.computed(() => this.$p.t("ui/bezeichnung")),
|
title: Vue.computed(() => this.$p.t('ui/bezeichnung')),
|
||||||
field: "Bezeichnung",
|
field: "Bezeichnung",
|
||||||
headerFilter: true,
|
headerFilter: true,
|
||||||
minWidth: 200,
|
minWidth: 200,
|
||||||
visible: true,
|
visible: true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: Vue.computed(() =>
|
title: Vue.computed(() => this.$p.t('lehre/organisationseinheit')),
|
||||||
this.$p.t("lehre/organisationseinheit"),
|
|
||||||
),
|
|
||||||
field: "Organisationseinheit",
|
field: "Organisationseinheit",
|
||||||
headerFilter: true,
|
headerFilter: true,
|
||||||
minWidth: 200,
|
minWidth: 200,
|
||||||
visible: true,
|
visible: true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: Vue.computed(() =>
|
title: Vue.computed(() => this.$p.t('global/gueltigVon')),
|
||||||
this.$p.t("global/gueltigVon"),
|
|
||||||
),
|
|
||||||
field: "Gültig_von",
|
field: "Gültig_von",
|
||||||
headerFilterFunc: "dates",
|
headerFilterFunc: 'dates',
|
||||||
headerFilter: dateFilter,
|
headerFilter: dateFilter,
|
||||||
resizable: true,
|
resizable: true,
|
||||||
minWidth: 200,
|
minWidth: 200,
|
||||||
visible: true,
|
visible: true,
|
||||||
formatter: "datetime",
|
formatter:"datetime",
|
||||||
formatterParams: this.datetimeFormatterParams(),
|
formatterParams: this.datetimeFormatterParams()
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: Vue.computed(() =>
|
title: Vue.computed(() => this.$p.t('global/gueltigBis')),
|
||||||
this.$p.t("global/gueltigBis"),
|
|
||||||
),
|
|
||||||
field: "Gültig_bis",
|
field: "Gültig_bis",
|
||||||
headerFilterFunc: "dates",
|
headerFilterFunc: 'dates',
|
||||||
headerFilter: dateFilter,
|
headerFilter: dateFilter,
|
||||||
resizable: true,
|
resizable: true,
|
||||||
minWidth: 200,
|
minWidth: 200,
|
||||||
visible: true,
|
visible: true,
|
||||||
formatter: "datetime",
|
formatter:"datetime",
|
||||||
formatterParams: this.datetimeFormatterParams(),
|
formatterParams: this.datetimeFormatterParams()
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: Vue.computed(() =>
|
title: Vue.computed(() => this.$p.t('profil/wochenstunden')),
|
||||||
this.$p.t("profil/wochenstunden"),
|
|
||||||
),
|
|
||||||
field: "Wochenstunden",
|
field: "Wochenstunden",
|
||||||
headerFilter: true,
|
headerFilter: true,
|
||||||
minWidth: 200,
|
minWidth: 200,
|
||||||
visible: true,
|
visible: true
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
@@ -101,56 +94,47 @@ export default {
|
|||||||
},
|
},
|
||||||
|
|
||||||
//? this is the prop passed to the dynamic component with the custom data of the view
|
//? this is the prop passed to the dynamic component with the custom data of the view
|
||||||
props: ["data", "permissions"],
|
props: ["data"],
|
||||||
methods: {
|
methods: {
|
||||||
funktionenTableBuilt: function () {
|
funktionenTableBuilt: function () {
|
||||||
this.$refs.funktionenTable.tabulator.setData(this.data.funktionen);
|
this.$refs.funktionenTable.tabulator.setData(this.data.funktionen);
|
||||||
},
|
},
|
||||||
datetimeFormatterParams: function () {
|
datetimeFormatterParams: function() {
|
||||||
const params = {
|
const params = {
|
||||||
inputFormat: "yyyy-MM-dd",
|
inputFormat:"yyyy-MM-dd",
|
||||||
outputFormat: "dd.MM.yyyy",
|
outputFormat:"dd.MM.yyyy",
|
||||||
invalidPlaceholder: "(invalid date)",
|
invalidPlaceholder:"(invalid date)",
|
||||||
timezone: FHC_JS_DATA_STORAGE_OBJECT.timezone,
|
timezone:FHC_JS_DATA_STORAGE_OBJECT.timezone
|
||||||
};
|
};
|
||||||
return params;
|
return params;
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
"data.funktionen"(newVal) {
|
'data.funktionen'(newVal) {
|
||||||
if (this.$refs.funktionenTable)
|
if(this.$refs.funktionenTable) this.$refs.funktionenTable.tabulator.setData(newVal);
|
||||||
this.$refs.funktionenTable.tabulator.setData(newVal);
|
|
||||||
},
|
|
||||||
"language.value"(newVal) {
|
|
||||||
// reevaluates computed phrasen
|
|
||||||
if (this.$refs.funktionenTable)
|
|
||||||
this.$refs.funktionenTable.tabulator.setColumns(
|
|
||||||
this.funktionen_table_options.columns,
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
|
'language.value'(newVal) { // reevaluates computed phrasen
|
||||||
|
if(this.$refs.funktionenTable) this.$refs.funktionenTable.tabulator.setColumns(this.funktionen_table_options.columns)
|
||||||
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
getTelefonValue() {
|
getTelefonValue() {
|
||||||
if (this.data.standort_telefon?.kontakt) {
|
if(this.data.standort_telefon?.kontakt) {
|
||||||
return (
|
return this.data.standort_telefon.kontakt + " " + this.data.telefonklappe
|
||||||
this.data.standort_telefon.kontakt +
|
} else if(this.data.standort_telefon) {
|
||||||
" " +
|
return this.data.standort_telefon + " " + this.data.telefonklappe
|
||||||
this.data.telefonklappe
|
|
||||||
);
|
|
||||||
} else if (this.data.standort_telefon) {
|
|
||||||
return (
|
|
||||||
this.data.standort_telefon + " " + this.data.telefonklappe
|
|
||||||
);
|
|
||||||
} else {
|
} else {
|
||||||
return this.data.telefonklappe;
|
return this.data.telefonklappe
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
fotoStatus() {
|
fotoStatus() {
|
||||||
return this.data?.fotoStatus ?? null;
|
return this.data?.fotoStatus ?? null;
|
||||||
},
|
},
|
||||||
|
|
||||||
personEmails() {
|
personEmails() {
|
||||||
return this.data?.emails ? this.data.emails : [];
|
return this.data?.emails ? this.data.emails : [];
|
||||||
},
|
},
|
||||||
|
|
||||||
profilInformation() {
|
profilInformation() {
|
||||||
if (!this.data) {
|
if (!this.data) {
|
||||||
return {};
|
return {};
|
||||||
@@ -167,67 +151,42 @@ export default {
|
|||||||
foto: this.data.foto,
|
foto: this.data.foto,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
roleInformation() {
|
roleInformation() {
|
||||||
if (!this.data) {
|
if (!this.data) {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
geburtsdatum: {
|
geburtsdatum: {
|
||||||
label: `${this.$p.t("profil", "Geburtsdatum")}`,
|
label: `${this.$p.t('profil','Geburtsdatum')}`,
|
||||||
value: this.data.gebdatum,
|
value: this.data.gebdatum
|
||||||
},
|
},
|
||||||
geburtsort: {
|
geburtsort: {
|
||||||
label: `${this.$p.t("profil", "Geburtsort")}`,
|
label: `${this.$p.t('profil','Geburtsort')}`,
|
||||||
value: this.data.gebort,
|
value: this.data.gebort
|
||||||
},
|
},
|
||||||
personenkennzeichen: {
|
personenkennzeichen: {
|
||||||
label: `${this.$p.t("profil", "Kurzzeichen")}`,
|
label: `${this.$p.t('profil','Kurzzeichen')}`,
|
||||||
value: this.data.kurzbz,
|
value: this.data.kurzbz
|
||||||
},
|
},
|
||||||
telefon: {
|
telefon: {
|
||||||
label: `${this.$p.t("profil", "Telefon")}`,
|
label: `${this.$p.t('profil','Telefon')}`,
|
||||||
value: this.getTelefonValue,
|
value: this.getTelefonValue
|
||||||
},
|
},
|
||||||
office: {
|
office: {
|
||||||
label: `${this.$p.t("profil", "Büro")}`,
|
label: `${this.$p.t('profil','Büro')}`,
|
||||||
value: this.data.ort_kurzbz,
|
value: this.data.ort_kurzbz
|
||||||
},
|
}
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
quickLinks() {
|
|
||||||
let quickLinks = [];
|
|
||||||
if (
|
|
||||||
this.$props.permissions &&
|
|
||||||
this.$props.permissions["basis/other_lv_plan"]
|
|
||||||
) {
|
|
||||||
quickLinks.push({
|
|
||||||
icon: "fa-calendar-days",
|
|
||||||
phrase: "lehre/stundenplan",
|
|
||||||
action: () => {
|
|
||||||
this.$router.push({
|
|
||||||
name: "OtherLvPlan",
|
|
||||||
params: { otherUid: this.$props.data.username },
|
|
||||||
});
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return quickLinks;
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
created() {
|
created(){
|
||||||
this.$p.loadCategory(["ui", "lehre", "global", "profil"]).then(() => {
|
this.$p.loadCategory(["ui", "lehre", "global", "profil"]).then(() => {
|
||||||
this.preloadedPhrasen.bezeichnungPhrase =
|
this.preloadedPhrasen.bezeichnungPhrase = this.$p.t('ui/bezeichnung');
|
||||||
this.$p.t("ui/bezeichnung");
|
this.preloadedPhrasen.organisationseinheitPhrase = this.$p.t('lehre/organisationseinheit');
|
||||||
this.preloadedPhrasen.organisationseinheitPhrase = this.$p.t(
|
this.preloadedPhrasen.gueltigVonPhrase = this.$p.t('global/gueltigVon');
|
||||||
"lehre/organisationseinheit",
|
this.preloadedPhrasen.gueltigBisPhrase = this.$p.t('global/gueltigBis');
|
||||||
);
|
this.preloadedPhrasen.wochenstundenPhrase = this.$p.t('profil/wochenstunden');
|
||||||
this.preloadedPhrasen.gueltigVonPhrase =
|
|
||||||
this.$p.t("global/gueltigVon");
|
|
||||||
this.preloadedPhrasen.gueltigBisPhrase =
|
|
||||||
this.$p.t("global/gueltigBis");
|
|
||||||
this.preloadedPhrasen.wochenstundenPhrase = this.$p.t(
|
|
||||||
"profil/wochenstunden",
|
|
||||||
);
|
|
||||||
this.preloadedPhrasen.loaded = true;
|
this.preloadedPhrasen.loaded = true;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@@ -283,7 +242,7 @@ export default {
|
|||||||
</div>
|
</div>
|
||||||
<!-- START OF THE SECOND PROFIL INFORMATION ROW -->
|
<!-- START OF THE SECOND PROFIL INFORMATION ROW -->
|
||||||
<!-- ROW WITH PROFIL IMAGE AND INFORMATION END -->
|
<!-- ROW WITH PROFIL IMAGE AND INFORMATION END -->
|
||||||
</div>
|
</div >
|
||||||
<!-- SECOND ROW UNDER THE PROFIL IMAGE AND INFORMATION WITH THE TABLES -->
|
<!-- SECOND ROW UNDER THE PROFIL IMAGE AND INFORMATION WITH THE TABLES -->
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<!-- FIRST TABLE -->
|
<!-- FIRST TABLE -->
|
||||||
@@ -297,22 +256,26 @@ export default {
|
|||||||
<!-- START OF SIDE PANEL -->
|
<!-- START OF SIDE PANEL -->
|
||||||
<div class="col-md-4 col-xxl-3 col-sm-12 text-break" >
|
<div class="col-md-4 col-xxl-3 col-sm-12 text-break" >
|
||||||
<!-- VISIBLE UNTIL VIEWPORT MD -->
|
<!-- VISIBLE UNTIL VIEWPORT MD -->
|
||||||
<div v-if="quickLinks.length" class="row mb-4">
|
<!--TODO: uncomment when implemented
|
||||||
<div class="col">
|
<div class="row d-none d-md-block mb-3">
|
||||||
<quick-links :title="$p.t('profil/quickLinks')" :links="quickLinks" />
|
<div class="col">
|
||||||
</div>
|
|
||||||
</div>
|
<quick-links :title="$p.t('profil','quickLinks')" ></quick-links>
|
||||||
<div class="row">
|
|
||||||
<div class="col">
|
</div>
|
||||||
<!-- MAILVERTEILER -->
|
</div>
|
||||||
<mailverteiler :data="data?.mailverteiler" :title="$p.t('profil','mailverteiler')"></mailverteiler>
|
-->
|
||||||
</div>
|
<div class="row">
|
||||||
</div>
|
<div class="col">
|
||||||
<!-- END OF SIDE PANEL -->
|
<!-- MAILVERTEILER -->
|
||||||
</div>
|
<mailverteiler :data="data?.mailverteiler" :title="$p.t('profil','mailverteiler')"></mailverteiler>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- END OF SIDE PANEL -->
|
||||||
|
</div>
|
||||||
<!-- END OF CONTAINER ROW-->
|
<!-- END OF CONTAINER ROW-->
|
||||||
</div>
|
</div>
|
||||||
<!-- END OF CONTAINER -->
|
<!-- END OF CONTAINER -->
|
||||||
</div>
|
</div>
|
||||||
`,
|
`,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ import ViewStudentProfil from "./StudentViewProfil.js";
|
|||||||
import ViewMitarbeiterProfil from "./MitarbeiterViewProfil.js";
|
import ViewMitarbeiterProfil from "./MitarbeiterViewProfil.js";
|
||||||
import Loading from "../../Loader.js";
|
import Loading from "../../Loader.js";
|
||||||
|
|
||||||
import ApiProfil from "../../../api/factory/profil.js";
|
import ApiProfil from '../../../api/factory/profil.js';
|
||||||
import ApiProfilUpdate from "../../../api/factory/profilUpdate.js";
|
import ApiProfilUpdate from '../../../api/factory/profilUpdate.js';
|
||||||
|
|
||||||
Vue.$collapseFormatter = function (data) {
|
Vue.$collapseFormatter = function (data) {
|
||||||
//data - an array of objects containing the column title and value for each cell
|
//data - an array of objects containing the column title and value for each cell
|
||||||
@@ -35,7 +35,7 @@ Vue.$collapseFormatter = function (data) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const Profil = {
|
export const Profil = {
|
||||||
name: "Profil",
|
name: 'Profil',
|
||||||
components: {
|
components: {
|
||||||
StudentProfil,
|
StudentProfil,
|
||||||
MitarbeiterProfil,
|
MitarbeiterProfil,
|
||||||
@@ -46,8 +46,11 @@ export const Profil = {
|
|||||||
props: {
|
props: {
|
||||||
uid: {
|
uid: {
|
||||||
type: String,
|
type: String,
|
||||||
required: false,
|
required:false,
|
||||||
},
|
},
|
||||||
|
viewData: {
|
||||||
|
type: Object,
|
||||||
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
@@ -59,19 +62,17 @@ export const Profil = {
|
|||||||
data: null,
|
data: null,
|
||||||
// notfound is null by default, but contains an UID if no user exists with that UID
|
// notfound is null by default, but contains an UID if no user exists with that UID
|
||||||
notFoundUID: null,
|
notFoundUID: null,
|
||||||
isEditable: false,
|
isEditable: this.viewData.editable ?? false,
|
||||||
authPermissions: null,
|
|
||||||
calendarSyncUrls: [],
|
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
provide() {
|
provide() {
|
||||||
return {
|
return {
|
||||||
isEditable: Vue.computed(() => this.isEditable),
|
isEditable: Vue.computed(()=>this.isEditable),
|
||||||
profilUpdateStates: Vue.computed(() =>
|
profilUpdateStates: Vue.computed(() =>
|
||||||
this.profilUpdateStates ? this.profilUpdateStates : false,
|
this.profilUpdateStates ? this.profilUpdateStates : false
|
||||||
),
|
),
|
||||||
profilUpdateTopic: Vue.computed(() =>
|
profilUpdateTopic: Vue.computed(() =>
|
||||||
this.profilUpdateTopic ? this.profilUpdateTopic : false,
|
this.profilUpdateTopic ? this.profilUpdateTopic : false
|
||||||
),
|
),
|
||||||
setLoading: (newValue) => {
|
setLoading: (newValue) => {
|
||||||
this.loading = newValue;
|
this.loading = newValue;
|
||||||
@@ -129,12 +130,8 @@ export const Profil = {
|
|||||||
//? if they have the same status the insert date is used for ordering
|
//? if they have the same status the insert date is used for ordering
|
||||||
if (ele1.status === ele2.status) {
|
if (ele1.status === ele2.status) {
|
||||||
result =
|
result =
|
||||||
new Date(
|
new Date(ele2.insertamum.split(".").reverse().join("-")) -
|
||||||
ele2.insertamum.split(".").reverse().join("-"),
|
new Date(ele1.insertamum.split(".").reverse().join("-"));
|
||||||
) -
|
|
||||||
new Date(
|
|
||||||
ele1.insertamum.split(".").reverse().join("-"),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
@@ -142,8 +139,6 @@ export const Profil = {
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
async load() {
|
async load() {
|
||||||
await this.fetchViewData();
|
|
||||||
|
|
||||||
// fetch profilUpdateStates to provide them to children components
|
// fetch profilUpdateStates to provide them to children components
|
||||||
await this.$api
|
await this.$api
|
||||||
.call(ApiProfilUpdate.getStatus())
|
.call(ApiProfilUpdate.getStatus())
|
||||||
@@ -162,20 +157,20 @@ export const Profil = {
|
|||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
});
|
});
|
||||||
},
|
|
||||||
async fetchViewData() {
|
|
||||||
let viewDataResult = await this.$api.call(
|
this.$api
|
||||||
ApiProfil.getProfilViewData(this.$route.params.uid ?? null),
|
.call(ApiProfil.profilViewData(this.$route.params.uid??null))
|
||||||
);
|
.then((response) => response.data).then(data=>{
|
||||||
|
this.view = data?.profil_data.view;
|
||||||
const data = viewDataResult.data;
|
this.data = data?.profil_data.data;
|
||||||
if (!data) return;
|
this.isEditable = data?.editable ?? false;
|
||||||
|
})
|
||||||
this.view = data.profil_data.view;
|
.catch((error) => {
|
||||||
this.isEditable = data.profil_data.editable;
|
console.error(error);
|
||||||
this.data = data.profil_data.data;
|
});
|
||||||
this.calendarSyncUrls = data.calendar_sync_urls ?? [];
|
|
||||||
this.authPermissions = data.permissions;
|
|
||||||
},
|
},
|
||||||
zustellAdressenCount() {
|
zustellAdressenCount() {
|
||||||
if (!this.data || !this.data.adressen) {
|
if (!this.data || !this.data.adressen) {
|
||||||
@@ -191,7 +186,7 @@ export const Profil = {
|
|||||||
})
|
})
|
||||||
.map((adresse) => {
|
.map((adresse) => {
|
||||||
return adresse.requested_change.adresse_id;
|
return adresse.requested_change.adresse_id;
|
||||||
}),
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -202,9 +197,8 @@ export const Profil = {
|
|||||||
.every((adresse) =>
|
.every((adresse) =>
|
||||||
this.data.profilUpdates.some(
|
this.data.profilUpdates.some(
|
||||||
(update) =>
|
(update) =>
|
||||||
update.requested_change.adresse_id ==
|
update.requested_change.adresse_id == adresse.adresse_id
|
||||||
adresse.adresse_id,
|
)
|
||||||
),
|
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
adressenArray = adressenArray.concat(
|
adressenArray = adressenArray.concat(
|
||||||
@@ -214,11 +208,12 @@ export const Profil = {
|
|||||||
})
|
})
|
||||||
.map((adr) => {
|
.map((adr) => {
|
||||||
return adr.adresse_id;
|
return adr.adresse_id;
|
||||||
}),
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return [...new Set(adressenArray)];
|
return [...new Set(adressenArray)];
|
||||||
|
|
||||||
},
|
},
|
||||||
zustellKontakteCount() {
|
zustellKontakteCount() {
|
||||||
if (!this.data || !this.data.kontakte) {
|
if (!this.data || !this.data.kontakte) {
|
||||||
@@ -231,17 +226,14 @@ export const Profil = {
|
|||||||
kontakteArray = kontakteArray.concat(
|
kontakteArray = kontakteArray.concat(
|
||||||
this.data.profilUpdates
|
this.data.profilUpdates
|
||||||
.filter((update) => {
|
.filter((update) => {
|
||||||
return (
|
return update.status === 'Pending' && update.requested_change.zustellung;
|
||||||
update.status === "Pending" &&
|
|
||||||
update.requested_change.zustellung
|
|
||||||
);
|
|
||||||
})
|
})
|
||||||
.map((kontant) => {
|
.map((kontant) => {
|
||||||
return {
|
return {
|
||||||
kontakt_id: kontant.requested_change.kontakt_id,
|
kontakt_id: kontant.requested_change.kontakt_id,
|
||||||
kontakttyp: kontant.requested_change.kontakttyp,
|
kontakttyp: kontant.requested_change.kontakttyp
|
||||||
};
|
};
|
||||||
}),
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -252,10 +244,8 @@ export const Profil = {
|
|||||||
.every((kontakt) =>
|
.every((kontakt) =>
|
||||||
this.data.profilUpdates.some(
|
this.data.profilUpdates.some(
|
||||||
(update) =>
|
(update) =>
|
||||||
update.status === "Pending" &&
|
update.status === 'Pending' && update.requested_change.kontakt_id == kontakt.kontakt_id
|
||||||
update.requested_change.kontakt_id ==
|
)
|
||||||
kontakt.kontakt_id,
|
|
||||||
),
|
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
kontakteArray = kontakteArray.concat(
|
kontakteArray = kontakteArray.concat(
|
||||||
@@ -265,10 +255,10 @@ export const Profil = {
|
|||||||
})
|
})
|
||||||
.map((kon) => {
|
.map((kon) => {
|
||||||
return {
|
return {
|
||||||
kontakt_id: kon.kontakt_id,
|
kontakt_id: kon.kontakt_id,
|
||||||
kontakttyp: kon.kontakttyp,
|
kontakttyp: kon.kontakttyp
|
||||||
};
|
};
|
||||||
}),
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -276,6 +266,7 @@ export const Profil = {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
|
||||||
filteredEditData() {
|
filteredEditData() {
|
||||||
if (!this.data) {
|
if (!this.data) {
|
||||||
return;
|
return;
|
||||||
@@ -339,12 +330,8 @@ export const Profil = {
|
|||||||
// excludes all contacts that are already used in pending profil update requests
|
// excludes all contacts that are already used in pending profil update requests
|
||||||
return !this.data.profilUpdates?.some(
|
return !this.data.profilUpdates?.some(
|
||||||
(update) =>
|
(update) =>
|
||||||
update.status ===
|
update.status === this.profilUpdateStates["Pending"] &&
|
||||||
this.profilUpdateStates[
|
update.requested_change?.kontakt_id === item.kontakt_id
|
||||||
"Pending"
|
|
||||||
] &&
|
|
||||||
update.requested_change?.kontakt_id ===
|
|
||||||
item.kontakt_id,
|
|
||||||
);
|
);
|
||||||
})
|
})
|
||||||
.map((kontakt) => {
|
.map((kontakt) => {
|
||||||
@@ -360,18 +347,12 @@ export const Profil = {
|
|||||||
topic: this.profilUpdateTopic?.["Private Adressen"],
|
topic: this.profilUpdateTopic?.["Private Adressen"],
|
||||||
data: this.data.adressen
|
data: this.data.adressen
|
||||||
?.filter((item) => {
|
?.filter((item) => {
|
||||||
return !this.data.profilUpdates?.some(
|
return !this.data.profilUpdates?.some((update) => {
|
||||||
(update) => {
|
return (
|
||||||
return (
|
update.status === this.profilUpdateStates["Pending"] &&
|
||||||
update.status ===
|
update.requested_change?.adresse_id == item.adresse_id
|
||||||
this.profilUpdateStates[
|
);
|
||||||
"Pending"
|
});
|
||||||
] &&
|
|
||||||
update.requested_change
|
|
||||||
?.adresse_id == item.adresse_id
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
})
|
})
|
||||||
.map((adresse) => {
|
.map((adresse) => {
|
||||||
return {
|
return {
|
||||||
@@ -393,28 +374,23 @@ export const Profil = {
|
|||||||
this.$refs.loadingModalRef.hide();
|
this.$refs.loadingModalRef.hide();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
uid(newVal, oldVal) {
|
uid (newVal, oldVal) {
|
||||||
this.load();
|
this.load()
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
this.load();
|
this.load()
|
||||||
},
|
},
|
||||||
template: `
|
template: `
|
||||||
<div class="pb-4">
|
<div>
|
||||||
<div v-if="notFoundUID">
|
<div v-if="notFoundUID">
|
||||||
<h3>Es wurde keine Person mit der UID {{this.notFoundUID}} gefunden</h3>
|
<h3>Es wurde keine Person mit der UID {{this.notFoundUID}} gefunden</h3>
|
||||||
</div>
|
</div>
|
||||||
<div v-else>
|
<div v-else>
|
||||||
<loading ref="loadingModalRef" :timeout="0"></loading>
|
<loading ref="loadingModalRef" :timeout="0"></loading>
|
||||||
<component
|
<component :is="view" :data="data" :editData="filteredEditData" ></component>
|
||||||
:is="view"
|
|
||||||
:data="data"
|
|
||||||
:editData="filteredEditData"
|
|
||||||
:permissions="authPermissions"
|
|
||||||
:calendarSyncUrls="calendarSyncUrls"></component>
|
|
||||||
</div>
|
</div>
|
||||||
</div>`,
|
</div>`,
|
||||||
};
|
}
|
||||||
|
|
||||||
export default Profil;
|
export default Profil
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
export default {
|
|
||||||
name: "CalendarSync",
|
|
||||||
props: { uid: String, calendarSyncUrls: Array },
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
syncInstructionsUrlWithoutParam:
|
|
||||||
FHC_JS_DATA_STORAGE_OBJECT.app_root +
|
|
||||||
"cms/content.php?content_id=",
|
|
||||||
};
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
copyUrlToClipboard(url) {
|
|
||||||
navigator.clipboard.writeText(url);
|
|
||||||
this.$fhcAlert.alertSuccess(
|
|
||||||
this.$p.t("profil/calendar_sync_clipboard_copy_confirmation"),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
},
|
|
||||||
template: `
|
|
||||||
<div class="card">
|
|
||||||
<div class="card-header">
|
|
||||||
{{ $p.t("profil/calendar_sync") }}
|
|
||||||
</div>
|
|
||||||
<div class="card-body">
|
|
||||||
<div class="d-flex flex-column gap-3">
|
|
||||||
<a
|
|
||||||
target="_blank"
|
|
||||||
:href="syncInstructionsUrlWithoutParam + $p.t('DMS-Link/lvplanSyncFAQ')"
|
|
||||||
class="fhc-link-color d-flex flex-row gap-2 align-items-center"
|
|
||||||
>
|
|
||||||
<span>
|
|
||||||
<i class="fa-solid fa-up-right-from-square ms-2"></i>
|
|
||||||
</span>
|
|
||||||
<span>
|
|
||||||
{{ $p.t("profil/calendar_sync_instructions") }}
|
|
||||||
</span>
|
|
||||||
</a>
|
|
||||||
<a
|
|
||||||
v-for="syncUrl in $props.calendarSyncUrls"
|
|
||||||
:key="syncUrl.identifier"
|
|
||||||
@click.prevent="copyUrlToClipboard(syncUrl.url)"
|
|
||||||
@contextmenu.prevent="copyUrlToClipboard(syncUrl.url)"
|
|
||||||
href="#"
|
|
||||||
class="fhc-link-color d-flex flex-row gap-2 align-items-center"
|
|
||||||
>
|
|
||||||
<span>
|
|
||||||
<i class="fa-regular fa-copy ms-2 text-decoration-none"></i>
|
|
||||||
</span>
|
|
||||||
{{ $p.t(syncUrl.labelPhrase) }}
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>`,
|
|
||||||
};
|
|
||||||
@@ -1,31 +1,53 @@
|
|||||||
export default {
|
export default {
|
||||||
name: "QuickLinks",
|
//TODO: To be implemented
|
||||||
data() {
|
props: {
|
||||||
return {};
|
data: {
|
||||||
},
|
type: String,
|
||||||
props: {
|
},
|
||||||
title: {
|
title: {
|
||||||
type: String,
|
type: String,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
links: {
|
mobile: {
|
||||||
type: Array,
|
type: Boolean,
|
||||||
required: true,
|
default: false,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
template: `
|
methods: {
|
||||||
|
hideCollapse: function () {
|
||||||
|
this.collapseOpen = false;
|
||||||
|
},
|
||||||
|
showCollapse: function () {
|
||||||
|
this.collapseOpen = true;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
collapseOpen: false,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
template: /*html*/ `
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-header">
|
<template v-if="mobile">
|
||||||
{{title}}
|
<button class="btn btn-outline-primary" data-bs-toggle="collapse" data-bs-target="#quickLinks" :aria-expanded="collapseOpen" aria-controls="quickLinks" >
|
||||||
</div>
|
{{title}}
|
||||||
<div class="card-body">
|
<i class="fa " :class="collapseOpen?'fa-chevron-up':'fa-chevron-down'"></i>
|
||||||
<div class="d-flex flex-row align-items-center gap-3 flex-wrap">
|
</button>
|
||||||
<div v-for="link in links" @click="link.action()" type="button" class="d-flex flex-row gap-2 px-3 py-2 border fhc-primary">
|
<div @[\`show.bs.collapse\`]="collapseOpen=true;" @[\`hide.bs.collapse\`]="collapseOpen=false;" class="mt-1 collapse" id="quickLinks">
|
||||||
<div><i class="fa" :class="link.icon"></i></div>
|
<div class="list-group">
|
||||||
{{ $p.t(link.phrase) }}
|
<a href="#" class="list-group-item list-group-item-action">{{$p.t('profil','zeitwuensche')}}</a>
|
||||||
<div><i class="fa fa-arrow-up-right-from-square" style="color:var(--fhc-light) !important"></i></div>
|
<a href="#" class="list-group-item list-group-item-action">{{$p.t('profil','lehrveranstaltungen')}}</a>
|
||||||
|
<a href="#" class="list-group-item list-group-item-action ">{{$p.t('profil','zeitsperren')}}</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<div class="card-header">{{title}}</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<a style="text-decoration:none" class="my-1 d-block" href="#">{{$p.t('profil','zeitwuensche')}}</a>
|
||||||
|
<a style="text-decoration:none" class="my-1 d-block" href="#">{{$p.t('profil','lehrveranstaltungen')}}</a>
|
||||||
|
<a style="text-decoration:none" class="my-1 d-block" href="#">{{$p.t('profil','zeitsperren')}}</a>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
</div>`,
|
</div>`,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import {CoreFilterCmpt} from "../../../components/filter/Filter.js";
|
import {CoreFilterCmpt} from "../../../components/filter/Filter.js";
|
||||||
import Mailverteiler from "./ProfilComponents/Mailverteiler.js";
|
import Mailverteiler from "./ProfilComponents/Mailverteiler.js";
|
||||||
import AusweisStatus from "./ProfilComponents/FhAusweisStatus.js";
|
import AusweisStatus from "./ProfilComponents/FhAusweisStatus.js";
|
||||||
|
import QuickLinks from "./ProfilComponents/QuickLinks.js";
|
||||||
import Adresse from "./ProfilComponents/Adresse.js";
|
import Adresse from "./ProfilComponents/Adresse.js";
|
||||||
import Kontakt from "./ProfilComponents/Kontakt.js";
|
import Kontakt from "./ProfilComponents/Kontakt.js";
|
||||||
import ProfilEmails from "./ProfilComponents/ProfilEmails.js";
|
import ProfilEmails from "./ProfilComponents/ProfilEmails.js";
|
||||||
@@ -8,8 +9,6 @@ import RoleInformation from "./ProfilComponents/RoleInformation.js";
|
|||||||
import ProfilInformation from "./ProfilComponents/ProfilInformation.js";
|
import ProfilInformation from "./ProfilComponents/ProfilInformation.js";
|
||||||
import FetchProfilUpdates from "./ProfilComponents/FetchProfilUpdates.js";
|
import FetchProfilUpdates from "./ProfilComponents/FetchProfilUpdates.js";
|
||||||
import EditProfil from "./ProfilModal/EditProfil.js";
|
import EditProfil from "./ProfilModal/EditProfil.js";
|
||||||
import QuickLinks from "./ProfilComponents/QuickLinks.js";
|
|
||||||
import CalendarSync from "./ProfilComponents/CalendarSync.js";
|
|
||||||
|
|
||||||
import ApiProfilUpdate from '../../../api/factory/profilUpdate.js';
|
import ApiProfilUpdate from '../../../api/factory/profilUpdate.js';
|
||||||
import { dateFilter } from '../../../tabulator/filters/Dates.js';
|
import { dateFilter } from '../../../tabulator/filters/Dates.js';
|
||||||
@@ -19,6 +18,7 @@ export default {
|
|||||||
CoreFilterCmpt,
|
CoreFilterCmpt,
|
||||||
Mailverteiler,
|
Mailverteiler,
|
||||||
AusweisStatus,
|
AusweisStatus,
|
||||||
|
QuickLinks,
|
||||||
Adresse,
|
Adresse,
|
||||||
Kontakt,
|
Kontakt,
|
||||||
ProfilEmails,
|
ProfilEmails,
|
||||||
@@ -26,8 +26,6 @@ export default {
|
|||||||
ProfilInformation,
|
ProfilInformation,
|
||||||
FetchProfilUpdates,
|
FetchProfilUpdates,
|
||||||
EditProfil,
|
EditProfil,
|
||||||
QuickLinks,
|
|
||||||
CalendarSync,
|
|
||||||
},
|
},
|
||||||
inject: ["sortProfilUpdates", "collapseFunction", "language","isEditable"],
|
inject: ["sortProfilUpdates", "collapseFunction", "language","isEditable"],
|
||||||
data() {
|
data() {
|
||||||
@@ -103,7 +101,6 @@ export default {
|
|||||||
props: {
|
props: {
|
||||||
data: Object,
|
data: Object,
|
||||||
editData: Object,
|
editData: Object,
|
||||||
calendarSyncUrls: Array,
|
|
||||||
},
|
},
|
||||||
provide() {
|
provide() {
|
||||||
return {
|
return {
|
||||||
@@ -243,11 +240,6 @@ export default {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
quickLinks() {
|
|
||||||
let quickLinks = [];
|
|
||||||
//
|
|
||||||
return quickLinks;
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
// preload phrasen
|
// preload phrasen
|
||||||
@@ -273,7 +265,15 @@ export default {
|
|||||||
:value="JSON.parse(JSON.stringify(filteredEditData))" :titel="$p.t('profil','profilBearbeiten')"></edit-profil>
|
:value="JSON.parse(JSON.stringify(filteredEditData))" :titel="$p.t('profil','profilBearbeiten')"></edit-profil>
|
||||||
<!-- ROW -->
|
<!-- ROW -->
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
<!-- HIDDEN QUICK LINKS -->
|
||||||
<div class="d-md-none col-12 ">
|
<div class="d-md-none col-12 ">
|
||||||
|
<!--TODO: uncomment when implemented
|
||||||
|
<div class="row py-2">
|
||||||
|
<div class="col">
|
||||||
|
<quick-links :title="$p.t('profil','quickLinks')" :mobile="true"></quick-links>
|
||||||
|
</div>
|
||||||
|
</div>-->
|
||||||
|
|
||||||
<!-- Bearbeiten Button -->
|
<!-- Bearbeiten Button -->
|
||||||
<div v-if="isEditable" class="row ">
|
<div v-if="isEditable" class="row ">
|
||||||
<div class="col mb-3">
|
<div class="col mb-3">
|
||||||
@@ -403,11 +403,12 @@ export default {
|
|||||||
</div>
|
</div>
|
||||||
<!-- START OF SIDE PANEL -->
|
<!-- START OF SIDE PANEL -->
|
||||||
<div class="col-md-4 col-xxl-3 col-sm-12 text-break" >
|
<div class="col-md-4 col-xxl-3 col-sm-12 text-break" >
|
||||||
<div v-if="quickLinks.length" class="row mb-4">
|
<!--TODO: uncomment when implemented
|
||||||
|
<div class="row d-none d-md-block mb-3">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<quick-links :title="$p.t('profil/quickLinks')" :links="quickLinks" />
|
<quick-links :title="$p.t('profil','quickLinks')"></quick-links>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>-->
|
||||||
<!-- Bearbeiten Button -->
|
<!-- Bearbeiten Button -->
|
||||||
<div class="row d-none d-md-block">
|
<div class="row d-none d-md-block">
|
||||||
<div class="col mb-3">
|
<div class="col mb-3">
|
||||||
@@ -433,18 +434,13 @@ export default {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- START OF THE SECOND ROW IN THE SIDE PANEL -->
|
<!-- START OF THE SECOND ROW IN THE SIDE PANEL -->
|
||||||
<div class="row mb-3">
|
<div class="row">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<!-- HIER SIND DIE MAILVERTEILER -->
|
<!-- HIER SIND DIE MAILVERTEILER -->
|
||||||
<mailverteiler :title="$p.t('profil','mailverteiler')" :data="data?.mailverteiler"></mailverteiler>
|
<mailverteiler :title="$p.t('profil','mailverteiler')" :data="data?.mailverteiler"></mailverteiler>
|
||||||
</div>
|
</div>
|
||||||
<!-- END OF THE SECOND ROW IN THE SIDE PANEL -->
|
<!-- END OF THE SECOND ROW IN THE SIDE PANEL -->
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
|
||||||
<div class="col">
|
|
||||||
<calendar-sync :uid="$props.data.username" :calendarSyncUrls="$props.calendarSyncUrls"></calendar-sync>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- END OF SIDE PANEL -->
|
<!-- END OF SIDE PANEL -->
|
||||||
</div>
|
</div>
|
||||||
<!-- END OF CONTAINER ROW-->
|
<!-- END OF CONTAINER ROW-->
|
||||||
|
|||||||
@@ -1,28 +1,30 @@
|
|||||||
|
import QuickLinks from "./ProfilComponents/QuickLinks.js";
|
||||||
import Mailverteiler from "./ProfilComponents/Mailverteiler.js";
|
import Mailverteiler from "./ProfilComponents/Mailverteiler.js";
|
||||||
import ProfilEmails from "./ProfilComponents/ProfilEmails.js";
|
import ProfilEmails from "./ProfilComponents/ProfilEmails.js";
|
||||||
import RoleInformation from "./ProfilComponents/RoleInformation.js";
|
import RoleInformation from "./ProfilComponents/RoleInformation.js";
|
||||||
import ProfilInformation from "./ProfilComponents/ProfilInformation.js";
|
import ProfilInformation from "./ProfilComponents/ProfilInformation.js";
|
||||||
import QuickLinks from "./ProfilComponents/QuickLinks.js";
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
data() {
|
||||||
|
return {};
|
||||||
|
},
|
||||||
components: {
|
components: {
|
||||||
|
QuickLinks,
|
||||||
Mailverteiler,
|
Mailverteiler,
|
||||||
ProfilEmails,
|
ProfilEmails,
|
||||||
RoleInformation,
|
RoleInformation,
|
||||||
ProfilInformation,
|
ProfilInformation,
|
||||||
QuickLinks,
|
|
||||||
},
|
|
||||||
props: ["data", "permissions"],
|
|
||||||
data() {
|
|
||||||
return {};
|
|
||||||
},
|
},
|
||||||
|
|
||||||
|
props: ["data"],
|
||||||
provide() {
|
provide() {
|
||||||
return {
|
return {
|
||||||
studiengang_kz: Vue.computed({
|
studiengang_kz: Vue.computed({ get: () => this.data.studiengang_kz }),
|
||||||
get: () => this.data.studiengang_kz,
|
}
|
||||||
}),
|
|
||||||
};
|
|
||||||
},
|
},
|
||||||
|
|
||||||
|
methods: {},
|
||||||
|
|
||||||
computed: {
|
computed: {
|
||||||
fotoStatus() {
|
fotoStatus() {
|
||||||
return this.data?.fotoStatus ?? null;
|
return this.data?.fotoStatus ?? null;
|
||||||
@@ -43,67 +45,66 @@ export default {
|
|||||||
foto: this.data.foto,
|
foto: this.data.foto,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
personEmails() {
|
personEmails() {
|
||||||
return this.data?.emails ? this.data.emails : [];
|
return this.data?.emails ? this.data.emails : [];
|
||||||
},
|
},
|
||||||
|
|
||||||
roleInformation() {
|
roleInformation() {
|
||||||
if (!this.data) {
|
if (!this.data) {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
geburtsdatum: {
|
geburtsdatum: {
|
||||||
label: `${this.$p.t("profil", "Geburtsdatum")}`,
|
label: `${this.$p.t('profil','Geburtsdatum')}`,
|
||||||
value: this.data.gebdatum,
|
value: this.data.gebdatum
|
||||||
},
|
},
|
||||||
geburtsort: {
|
geburtsort: {
|
||||||
label: `${this.$p.t("profil", "Geburtsort")}`,
|
label: `${this.$p.t('profil','Geburtsort')}`,
|
||||||
value: this.data.gebort,
|
value: this.data.gebort
|
||||||
},
|
},
|
||||||
personenkennzeichen: {
|
personenkennzeichen: {
|
||||||
label: `${this.$p.t("person", "personenkennzeichen")}`,
|
label: `${this.$p.t('person','personenkennzeichen')}`,
|
||||||
value: this.data.personenkennzeichen,
|
value: this.data.personenkennzeichen
|
||||||
},
|
},
|
||||||
studiengang: {
|
studiengang: {
|
||||||
label: `${this.$p.t("lehre", "studiengang")}`,
|
label: `${this.$p.t('lehre','studiengang')}`,
|
||||||
value: this.data.studiengang,
|
value: this.data.studiengang
|
||||||
},
|
},
|
||||||
semester: {
|
semester: {
|
||||||
label: `${this.$p.t("lehre", "semester")}`,
|
label: `${this.$p.t('lehre','semester')}`,
|
||||||
value: this.data.semester,
|
value: this.data.semester
|
||||||
},
|
},
|
||||||
verband: {
|
verband: {
|
||||||
label: `${this.$p.t("lehre", "lehrverband")}`,
|
label: `${this.$p.t('lehre','lehrverband')}`,
|
||||||
value: this.data.verband,
|
value: this.data.verband
|
||||||
},
|
},
|
||||||
gruppe: {
|
gruppe: {
|
||||||
label: `${this.$p.t("lehre", "gruppe")}`,
|
label: `${this.$p.t('lehre','gruppe')}`,
|
||||||
value: this.data.gruppe.trim(),
|
value: this.data.gruppe.trim()
|
||||||
},
|
}
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
quickLinks() {
|
|
||||||
let quickLinks = [];
|
|
||||||
if (this.$props.permissions && this.$props.permissions["basis/other_lv_plan"]) {
|
|
||||||
quickLinks.push({
|
|
||||||
icon: "fa-calendar-days",
|
|
||||||
phrase: "lehre/stundenplan",
|
|
||||||
action: () => {
|
|
||||||
this.$router.push({
|
|
||||||
name: "OtherLvPlan",
|
|
||||||
params: { otherUid: this.$props.data.username },
|
|
||||||
});
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return quickLinks;
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
},
|
||||||
|
|
||||||
template: /*html*/ `
|
template: /*html*/ `
|
||||||
|
|
||||||
<div class="container-fluid text-break fhc-form" >
|
<div class="container-fluid text-break fhc-form" >
|
||||||
<!-- ROW -->
|
<!-- ROW -->
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
<!-- HIDDEN QUICK LINKS -->
|
||||||
|
<!-- uncomment when implemented
|
||||||
|
<div class="d-md-none col-12 ">
|
||||||
|
|
||||||
|
<quick-links :title="$p.t('profil','quickLinks')" :mobile="true"></quick-links>
|
||||||
|
|
||||||
|
</div>-->
|
||||||
|
<!-- END OF HIDDEN QUCK LINKS -->
|
||||||
<!-- MAIN PANNEL -->
|
<!-- MAIN PANNEL -->
|
||||||
<div class="col-sm-12 col-md-8 col-xxl-9 ">
|
<div class="col-sm-12 col-md-8 col-xxl-9 ">
|
||||||
<!-- ROW WITH PROFIL IMAGE AND INFORMATION -->
|
<!-- ROW WITH PROFIL IMAGE AND INFORMATION -->
|
||||||
@@ -111,18 +112,12 @@ export default {
|
|||||||
<!-- ROW WITH THE PROFIL INFORMATION -->
|
<!-- ROW WITH THE PROFIL INFORMATION -->
|
||||||
<div class="row mb-4">
|
<div class="row mb-4">
|
||||||
<!-- FIRST KAESTCHEN -->
|
<!-- FIRST KAESTCHEN -->
|
||||||
<div class="col-lg-12 col-xl-6 ">
|
<div class="col-lg-12 col-xl-6 ">
|
||||||
<div class="row mb-4">
|
<div class="row mb-4">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<profil-information :data="profilInformation" :title="$p.t('profil','studentIn')" :fotoStatus="fotoStatus"></profil-information>
|
<profil-information :data="profilInformation" :title="$p.t('profil','studentIn')" :fotoStatus="fotoStatus"></profil-information>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- SECOND ROW OF FIRST COLUMN -->
|
|
||||||
<div class="row mb-4">
|
|
||||||
<div class="col">
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- START OF SECOND PROFIL INFORMATION COLUMN -->
|
<!-- START OF SECOND PROFIL INFORMATION COLUMN -->
|
||||||
<!-- END OF PROFIL INFORMATION ROW -->
|
<!-- END OF PROFIL INFORMATION ROW -->
|
||||||
<!-- INFORMATION CONTENT END -->
|
<!-- INFORMATION CONTENT END -->
|
||||||
@@ -150,12 +145,17 @@ export default {
|
|||||||
</div>
|
</div>
|
||||||
<!-- START OF SIDE PANEL -->
|
<!-- START OF SIDE PANEL -->
|
||||||
<div class="col-md-4 col-xxl-3 col-sm-12 text-break" >
|
<div class="col-md-4 col-xxl-3 col-sm-12 text-break" >
|
||||||
<!-- START OF THE FIRST ROW IN THE SIDE PANEL -->
|
<!-- SRART OF QUICK LINKS IN THE SIDE PANEL -->
|
||||||
<div v-if="quickLinks.length" class="row mb-4">
|
<!-- START OF THE FIRDT ROW IN THE SIDE PANEL -->
|
||||||
<div class="col">
|
<!-- THESE QUCK LINKS ARE ONLY VISIBLE UNTIL VIEWPORT MD -->
|
||||||
<quick-links :title="$p.t('profil/quickLinks')" :links="quickLinks" />
|
<!--TODO: uncomment when implemented
|
||||||
</div>
|
<div class="row d-none d-md-block mb-3">
|
||||||
</div>
|
<div class="col">
|
||||||
|
|
||||||
|
<quick-links :title="$p.t('profil','quickLinks')"></quick-links>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>-->
|
||||||
<!-- START OF THE SECOND ROW IN THE SIDE PANEL -->
|
<!-- START OF THE SECOND ROW IN THE SIDE PANEL -->
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
|
|||||||
@@ -3,12 +3,14 @@ import VueDatePicker from '../../vueDatepicker.js.php';
|
|||||||
import ApiOrt from '../../../api/factory/ort.js'
|
import ApiOrt from '../../../api/factory/ort.js'
|
||||||
export const Raumsuche = {
|
export const Raumsuche = {
|
||||||
name: "Raumsuche",
|
name: "Raumsuche",
|
||||||
|
props: {
|
||||||
|
|
||||||
|
},
|
||||||
components: {
|
components: {
|
||||||
VueDatePicker,
|
VueDatePicker,
|
||||||
CoreFilterCmpt,
|
CoreFilterCmpt,
|
||||||
InputNumber: primevue.inputnumber,
|
InputNumber: primevue.inputnumber,
|
||||||
},
|
},
|
||||||
inject: ["isMobile"],
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
phrasenPromise: null,
|
phrasenPromise: null,
|
||||||
@@ -192,9 +194,8 @@ export const Raumsuche = {
|
|||||||
<h1 class="h3">{{$p.t('rauminfo/roomSearch')}}</h1>
|
<h1 class="h3">{{$p.t('rauminfo/roomSearch')}}</h1>
|
||||||
<hr>
|
<hr>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div :class="{'pb-1': isMobile}" class="col-12 col-lg-2">
|
<div class="col-12 col-lg-2">
|
||||||
<VueDatePicker
|
<VueDatePicker
|
||||||
@contextmenu="(e) => {if (isMobile) {e.preventDefault();}}"
|
|
||||||
:dark="isDarkMode"
|
:dark="isDarkMode"
|
||||||
v-model="datum"
|
v-model="datum"
|
||||||
:clearable="false"
|
:clearable="false"
|
||||||
@@ -206,9 +207,8 @@ export const Raumsuche = {
|
|||||||
auto-apply>
|
auto-apply>
|
||||||
</VueDatePicker>
|
</VueDatePicker>
|
||||||
</div>
|
</div>
|
||||||
<div :class="{'pb-1': isMobile}" class="col-12 col-lg-1">
|
<div class="col-12 col-lg-1">
|
||||||
<VueDatePicker
|
<VueDatePicker
|
||||||
@contextmenu="(e) => {if (isMobile) {e.preventDefault();}}"
|
|
||||||
:dark="isDarkMode"
|
:dark="isDarkMode"
|
||||||
v-model="von"
|
v-model="von"
|
||||||
:clearable="false"
|
:clearable="false"
|
||||||
@@ -220,9 +220,8 @@ export const Raumsuche = {
|
|||||||
>
|
>
|
||||||
</VueDatePicker>
|
</VueDatePicker>
|
||||||
</div>
|
</div>
|
||||||
<div :class="{'pb-1': isMobile}" class="col-12 col-lg-1">
|
<div class="col-12 col-lg-1">
|
||||||
<VueDatePicker
|
<VueDatePicker
|
||||||
@contextmenu="(e) => {if (isMobile) {e.preventDefault();}}"
|
|
||||||
:dark="isDarkMode"
|
:dark="isDarkMode"
|
||||||
v-model="bis"
|
v-model="bis"
|
||||||
:clearable="false"
|
:clearable="false"
|
||||||
@@ -234,7 +233,7 @@ export const Raumsuche = {
|
|||||||
</VueDatePicker>
|
</VueDatePicker>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div :class="{'pb-1': isMobile}" class="col-12 col-lg-3">
|
<div class="col-12 col-lg-3">
|
||||||
<select ref="raumtyp" id="raumtypSelect" v-model="selectedType" class="form-select"
|
<select ref="raumtyp" id="raumtypSelect" v-model="selectedType" class="form-select"
|
||||||
:aria-label="$p.t('global/studiensemester_auswaehlen')" @change="setRoute($event.target.value)">
|
:aria-label="$p.t('global/studiensemester_auswaehlen')" @change="setRoute($event.target.value)">
|
||||||
<option :key="defaultType" selected :value="defaultType">{{defaultType.beschreibung}}</option>
|
<option :key="defaultType" selected :value="defaultType">{{defaultType.beschreibung}}</option>
|
||||||
@@ -243,7 +242,7 @@ export const Raumsuche = {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div :class="{'pb-2': isMobile}" class="col-12 col-lg-3">
|
<div class="col-12 col-lg-3">
|
||||||
<InputNumber v-model="anzahl"
|
<InputNumber v-model="anzahl"
|
||||||
:prefix="$p.t('rauminfo/minCapacity') + ': '"
|
:prefix="$p.t('rauminfo/minCapacity') + ': '"
|
||||||
inputId="anzahlInput" :min="1" :max="1000"
|
inputId="anzahlInput" :min="1" :max="1000"
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user