Merge branch 'feature-40309/Cis_News_widget' into feature-25999/C4

This commit is contained in:
Harald Bamberger
2024-09-09 13:03:47 +02:00
35 changed files with 975 additions and 338 deletions
+13 -46
View File
@@ -69,12 +69,21 @@ class Cms extends Auth_Controller
*/
public function content($content_id, $version = null, $sprache = null, $sichtbar = true)
{
$content = $this->cmslib->getContent($content_id, $version, $sprache, $sichtbar);
// return early if the content_id for the content is missing
if(!isset($content_id))
$this->terminateWithError("content_id is missing");
$content = $this->ContentModel->load($content_id);
if (isError($content))
return $this->load->view('CisHmvc/Error', ['error' => getError($content)]);
$this->terminateWithError(getError($content));
$this->load->view('CisHmvc/Cms/Content', ['content' => getData($content)]);
$content = getData($content);
if(NULL === $content)
$this->terminateWithError("Content not found");
$content = current($content);
$this->load->view('CisVue/Cms/Content', ['content_id' => $content_id, 'template_kurzbz'=>$content->template_kurzbz , 'version' => $version, 'sprache' => $sprache, 'sichtbar' => $sichtbar]);
}
/**
@@ -101,48 +110,6 @@ class Cms extends Auth_Controller
*/
public function news($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true)
{
$this->load->view('CisHtml/Cms/Content', ['infoscreen' => $infoscreen, 'studiengang_kz' => $studiengang_kz, 'semester' => $semester, 'mischen' => $mischen, 'titel' => $titel, 'edit' => $edit, 'sichtbar' => $sichtbar]);
}
public function getNews($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true)
{
$get_page = intval($this->input->get('page', true));
$get_page_size = intval($this->input->get('page_size', true));
if ($get_page) {
$page = $get_page;
}
if ($get_page_size) {
$page_size = $get_page_size;
} else {
$page_size = $this->page_size;
}
$news = $this->cmslib->getNews($infoscreen, $studiengang_kz, $semester, $mischen, $titel, $edit, $sichtbar, $page, $page_size);
if (isError($news)) {
$this->terminateWithJsonError(getError($news));
}
$news = hasData($news) ? getData($news) : null;
if ($news) {
echo json_encode($news);
} else {
show_error("News: No data found");
}
}
public function getNewsRowCount($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $fachbereich_kurzbz = null, $maxalter = 0, $edit = false, $sichtbar = true, $page = 1, $page_size = 10)
{
list($studiengang_kz, $semester) = $this->cmslib->getStgAndSem($studiengang_kz, $semester);
$all = $edit;
$num_rows = $this->NewsModel->countNewsWithContent(getSprache(), $studiengang_kz, $semester, $fachbereich_kurzbz, $sichtbar, $maxalter, $page, $this->page_size, $all, $mischen);
if (isError($num_rows)) {
$this->terminateWithJsonError(getError($num_rows));
}
$num_rows = hasData($num_rows) ? getData($num_rows) : null;
if ($num_rows) {
echo json_encode($num_rows);
} else {
show_error("News number rows: No data found");
}
$this->load->view('CisHtml/Cms/Content', ['infoscreen' => $infoscreen, 'studiengang_kz' => $studiengang_kz, 'semester' => $semester, 'mischen' => $mischen, 'titel' => $titel, 'edit' => $edit, 'sichtbar' => $sichtbar, "template_kurzbz"=>"news"]);
}
}
+13 -49
View File
@@ -26,10 +26,6 @@ class Cms extends FHC_Controller
'global'
]);
$this->load->model('content/News_model', 'NewsModel');
// setting up the papgination_size
$this->page_size = 10;
}
// -----------------------------------------------------------------------------------------------------------------
@@ -45,12 +41,21 @@ class Cms extends FHC_Controller
*/
public function content($content_id, $version = null, $sprache = null, $sichtbar = true)
{
$content = $this->cmslib->getContent($content_id, $version, $sprache, $sichtbar);
// return early if the content_id for the content is missing
if(!isset($content_id))
$this->terminateWithError("content_id is missing");
$content = $this->ContentModel->load($content_id);
if (isError($content))
return $this->load->view('CisHtml/Error', ['error' => getError($content)]);
$this->terminateWithError(getError($content));
$this->load->view('CisHtml/Cms/Content', ['content' => getData($content)]);
$content = getData($content);
if(NULL === $content)
$this->terminateWithError("Content not found");
$content = current($content);
$this->load->view('CisVue/Cms/Content', ['content_id' => $content_id, 'template_kurzbz'=>$content->template_kurzbz , 'version' => $version, 'sprache' => $sprache, 'sichtbar' => $sichtbar]);
}
/**
@@ -66,48 +71,7 @@ class Cms extends FHC_Controller
*/
public function news($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true)
{
$this->load->view('CisHtml/Cms/Content', ['infoscreen' => $infoscreen, 'studiengang_kz' => $studiengang_kz, 'semester' => $semester, 'mischen' => $mischen, 'titel' => $titel, 'edit' => $edit, 'sichtbar' => $sichtbar]);
$this->load->view('CisHtml/Cms/Content', ['infoscreen' => $infoscreen, 'studiengang_kz' => $studiengang_kz, 'semester' => $semester, 'mischen' => $mischen, 'titel' => $titel, 'edit' => $edit, 'sichtbar' => $sichtbar, "template_kurzbz"=>"news"]);
}
public function getNews($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true)
{
$get_page = intval($this->input->get('page', true));
$get_page_size = intval($this->input->get('page_size', true));
if ($get_page) {
$page = $get_page;
}
if ($get_page_size) {
$page_size = $get_page_size;
} else {
$page_size = $this->page_size;
}
$news = $this->cmslib->getNews($infoscreen, $studiengang_kz, $semester, $mischen, $titel, $edit, $sichtbar, $page, $page_size);
if (isError($news)) {
$this->terminateWithJsonError(getError($news));
}
$news = hasData($news) ? getData($news) : null;
if ($news) {
echo json_encode($news);
} else {
show_error("News: No data found");
}
}
public function getNewsRowCount($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $fachbereich_kurzbz = null, $maxalter = 0, $edit = false, $sichtbar = true, $page = 1, $page_size = 10)
{
list($studiengang_kz, $semester) = $this->cmslib->getStgAndSem($studiengang_kz, $semester);
$all = $edit;
$num_rows = $this->NewsModel->countNewsWithContent(getSprache(), $studiengang_kz, $semester, $fachbereich_kurzbz, $sichtbar, $maxalter, $page, $this->page_size, $all, $mischen);
if (isError($num_rows)) {
$this->terminateWithJsonError(getError($num_rows));
}
$num_rows = hasData($num_rows) ? getData($num_rows) : null;
if ($num_rows) {
echo json_encode($num_rows);
} else {
show_error("News number rows: No data found");
}
}
}
+8 -58
View File
@@ -24,6 +24,7 @@ class Cms extends FHC_Controller
$this->loadPhrases([
'global'
]);
}
// -----------------------------------------------------------------------------------------------------------------
@@ -39,25 +40,15 @@ class Cms extends FHC_Controller
*/
public function content($content_id, $version = null, $sprache = null, $sichtbar = true)
{
$content = $this->cmslib->getContent($content_id, $version, $sprache, $sichtbar);
$content = $this->ContentModel->load($content_id);
$content = $this->getDataOrTerminateWithError($content);
$content = current($content);
if (isError($content))
return $this->load->view('CisHtml/Error', ['error' => getError($content)]);
$this->load->view('CisHtml/Cms/Content', ['content' => getData($content)]);
$this->load->view('CisVue/Cms/Content', ['content_id' => $content_id, 'template_kurzbz'=>$content->template_kurzbz , 'version' => $version, 'sprache' => $sprache, 'sichtbar' => $sichtbar]);
}
/**
* @param boolean $infoscreen
* @param string | null $studiengang_kz
* @param int | null $semester
* @param boolean $mischen
* @param string $titel
* @param boolean $edit
* @param boolean $sichtbar
*
* @return void
*/
/**
* @param boolean $infoscreen
* @param string | null $studiengang_kz
@@ -71,48 +62,7 @@ class Cms extends FHC_Controller
*/
public function news($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true)
{
$this->load->view('CisHtml/Cms/Content', ['infoscreen' => $infoscreen, 'studiengang_kz' => $studiengang_kz, 'semester' => $semester, 'mischen' => $mischen, 'titel' => $titel, 'edit' => $edit, 'sichtbar' => $sichtbar]);
$this->load->view('CisHtml/Cms/Content', ['infoscreen' => $infoscreen, 'studiengang_kz' => $studiengang_kz, 'semester' => $semester, 'mischen' => $mischen, 'titel' => $titel, 'edit' => $edit, 'sichtbar' => $sichtbar, "template_kurzbz"=>"news"]);
}
public function getNews($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true)
{
$get_page = intval($this->input->get('page', true));
$get_page_size = intval($this->input->get('page_size', true));
if ($get_page) {
$page = $get_page;
}
if ($get_page_size) {
$page_size = $get_page_size;
} else {
$page_size = $this->page_size;
}
$news = $this->cmslib->getNews($infoscreen, $studiengang_kz, $semester, $mischen, $titel, $edit, $sichtbar, $page, $page_size);
if (isError($news)) {
$this->terminateWithJsonError(getError($news));
}
$news = hasData($news) ? getData($news) : null;
if ($news) {
echo json_encode($news);
} else {
show_error("News: No data found");
}
}
public function getNewsRowCount($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $fachbereich_kurzbz = null, $maxalter = 0, $edit = false, $sichtbar = true, $page = 1, $page_size = 10)
{
list($studiengang_kz, $semester) = $this->cmslib->getStgAndSem($studiengang_kz, $semester);
$all = $edit;
$num_rows = $this->NewsModel->countNewsWithContent(getSprache(), $studiengang_kz, $semester, $fachbereich_kurzbz, $sichtbar, $maxalter, $page, $this->page_size, $all, $mischen);
if (isError($num_rows)) {
$this->terminateWithJsonError(getError($num_rows));
}
$num_rows = hasData($num_rows) ? getData($num_rows) : null;
if ($num_rows) {
echo json_encode($num_rows);
} else {
show_error("News number rows: No data found");
}
}
}
@@ -0,0 +1,181 @@
<?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');
/**
* This controller operates between (interface) the JS (GUI) and the SearchBarLib (back-end)
* Provides data to the ajax get calls about the searchbar component
* This controller works with JSON calls on the HTTP GET and the output is always JSON
*/
class Cms extends FHCAPI_Controller
{
/**
* Object initialization
*/
public function __construct()
{
// NOTE(chris): additional permission checks will be done in SearchBarLib
parent::__construct([
'ContentID' => self::PERM_LOGGED,
'getOrtKurzbzContent' => self::PERM_LOGGED,
'content' => self::PERM_LOGGED,
'news' => self::PERM_LOGGED,
'getNewsRowCount' => self::PERM_LOGGED,
'getNews' => self::PERM_LOGGED,
]);
$this->load->model('content/News_model', 'NewsModel');
// setting up the papgination_size
$this->page_size = 10;
$this->load->library('CmsLib');
}
//------------------------------------------------------------------------------------------------------------------
// Private methods
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* fetches the content with the content_id and additional parameters
*/
public function content()
{
// form validation
$this->load->library('form_validation');
$this->form_validation->set_data($_GET);
$this->form_validation->set_rules('content_id','Content ID','required|is_natural');
if($this->form_validation->run() == FALSE) $this->terminateWithValidationErrors($this->form_validation->error_array());
// getting the get parameters
$content_id = $this->input->get("content_id",TRUE);
$version = $this->input->get("version",TRUE);
$sprache = $this->input->get("sprache",TRUE);
$sichtbar = $this->input->get("sichtbar",TRUE);
$content = $this->cmslib->getContent($content_id);
$content = $this->getDataOrTerminateWithError($content);
$this->terminateWithSuccess($content);
}
/**
* Gets a JSON body via HTTP POST and provides the parameters
*/
public function ContentID()
{
// form validation
$this->load->library('form_validation');
$this->form_validation->set_data($_GET);
$this->form_validation->set_rules('ort_kurzbz', 'Ort', 'required');
if ($this->form_validation->run() == FALSE) $this->terminateWithValidationErrors($this->form_validation->error_array());
$ort_kurzbz = $this->input->get('ort_kurzbz',TRUE);
$content_id = $this->OrtModel->getContentID($ort_kurzbz);
$content_id = current($this->getDataOrTerminateWithError($content_id))->content_id;
$this->terminateWithSuccess($content_id);
}
//todo: there is the method news and getNews but only one should exist
public function news()
{
// form validation
$this->load->library('form_validation');
$this->form_validation->set_data($_GET);
$this->form_validation->set_rules('limit','Limit','required|is_natural_no_zero');
if($this->form_validation->run() == FALSE) $this->terminateWithValidationErrors($this->form_validation->error_array());
$this->load->model('content/news_model', 'NewsModel');
$limit = $this->input->get('limit',TRUE);
//query the news
$news = $this->NewsModel->getAll($limit);
//get the data or terminate with error
$news = $this->getDataOrTerminateWithError($news);
// collect the content of the news
foreach($news as $news_element){
$this->addMeta("content_id",$news_element->content_id);
$content = $this->cmslib->getContent($news_element->content_id);
$content = $this->getDataOrTerminateWithError($content);
$news_element->content_obj = $content;
}
$this->terminateWithSuccess($news);
}
public function getNewsRowCount($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $fachbereich_kurzbz = null, $maxalter = 0, $edit = false, $sichtbar = true, $page = 1, $page_size = 10)
{
list($studiengang_kz, $semester) = $this->cmslib->getStgAndSem($studiengang_kz, $semester);
$all = $edit;
$this->load->model('content/News_model','NewsModel');
$num_rows = $this->NewsModel->countNewsWithContent(getSprache(), $studiengang_kz, $semester, $fachbereich_kurzbz, $sichtbar, $maxalter, $page, $page_size, $all, $mischen);
$num_rows = $this->getDataOrTerminateWithError($num_rows);
$this->terminateWithSuccess($num_rows);
}
public function getNews($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true)
{
//form validation
$this->load->library('form_validation');
$this->form_validation->set_data($_GET);
$this->form_validation->set_rules('page','Page','required|is_natural');
$this->form_validation->set_rules('page_size', 'PageSize', 'is_natural');
if($this->form_validation->run() == FALSE) $this->terminateWithValidationErrors($this->form_validation->error_array());
// getting the GET parameters
$page = intval($this->input->get('page', true));
$page_size = intval($this->input->get('page_size', true));
// default value for the page_size is 10
$page_size = $page_size ?? 10;
$news = $this->cmslib->getNews($infoscreen, $studiengang_kz, $semester, $mischen, $titel, $edit, $sichtbar, $page, $page_size);
$news = $this->getDataOrTerminateWithError($news);
$this->terminateWithSuccess($news);
}
}
@@ -0,0 +1,95 @@
<?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');
/**
* This controller operates between (interface) the JS (GUI) and the SearchBarLib (back-end)
* Provides data to the ajax get calls about the searchbar component
* This controller works with JSON calls on the HTTP GET and the output is always JSON
*/
class Ort extends FHCAPI_Controller
{
/**
* Object initialization
*/
public function __construct()
{
// NOTE(chris): additional permission checks will be done in SearchBarLib
parent::__construct([
'ContentID' => self::PERM_LOGGED,
'getOrtKurzbzContent' => self::PERM_LOGGED,
]);
$this->load->model('ressource/Ort_model', 'OrtModel');
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* Gets a JSON body via HTTP POST and provides the parameters
*/
public function ContentID()
{
// if error
//$this->terminateWithError(SearchBarLib::ERROR_WRONG_JSON, self::ERROR_TYPE_GENERAL);
$ort_kurzbz = $this->input->get('ort_kurzbz',TRUE);
if(!$ort_kurzbz){
$this->terminateWithError("missing ort_kurzbz parameter", self::ERROR_TYPE_GENERAL);
}
$result = $this->OrtModel->getContentID($ort_kurzbz);
if(isError($result)){
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
$result = hasData($result) ? current(getData($result)) : null;
$this->terminateWithSuccess($result->content_id ?? NULL);
}
/**
* @param int $version
* @param string $sprache
* @param boolean $sichtbar
*
* @return $content
*/
public function getOrtKurzbzContent($version = null, $sprache = null, $sichtbar = true)
{
$content_id = $this->input->get("content_id",TRUE);
$this->load->library('CmsLib');
$content = $this->cmslib->getContent($content_id, $version, $sprache, $sichtbar);
if (isError($content))
$this->terminateWithError(getError($content), self::ERROR_TYPE_GENERAL);
$content = hasData($content) ? getData($content) : null;
$this->terminateWithSuccess($content);
}
}
+14 -4
View File
@@ -66,7 +66,6 @@ class CmsLib
if (!getData($isberechtigt))
return error('global/keineBerechtigungFuerDieseSeite');
}
#$this->load->model('content/Content_model', 'ContentModel');
$content = $this->ci->ContentModel->getContent($content_id, $sprache, $version, $sichtbar, true);
if (isError($content))
@@ -103,6 +102,12 @@ class CmsLib
$XML = new DOMDocument();
$XML->loadXML($content->content);
if($content->titel){
$betreff = $content->titel;
}else{
$betreff = $XML->getElementsByTagName('betreff');
}
$xsltemplate = new DOMDocument();
$xsltemplate->loadXML($template->xslt_xhtml_c4);
@@ -110,10 +115,15 @@ class CmsLib
$processor = new XSLTProcessor();
$processor->importStylesheet($xsltemplate);
$content = $processor->transformToXML($XML);
$content = str_replace('dms.php', APP_ROOT . 'cms/dms.php', $content);
$transformed_content = $processor->transformToXML($XML);
$transformed_content = str_replace('dms.php', APP_ROOT . 'cms/dms.php', $transformed_content);
return success($content);
return success([
"betreff"=>$betreff,
"type"=>$content->template_kurzbz,
"content"=>$transformed_content
]);
}
/**
+16 -3
View File
@@ -19,14 +19,27 @@ class News_model extends DB_Model
*/
public function getAll($limit = null)
{
return $this->loadWhere('
text IS NOT NULL
AND datum <= NOW() AND (datum_bis IS NULL OR datum_bis >= now()::date)
$this->addJoin("campus.tbl_content","content_id");
return $this->execReadOnlyQuery('
SELECT *
FROM campus.tbl_news
JOIN campus.tbl_content content ON content.content_id = campus.tbl_news.content_id
WHERE
--text IS NOT NULL AND
datum <= NOW() AND (datum_bis IS NULL OR datum_bis >= now()::date)
ORDER BY datum DESC
LIMIT ' . $this->escape($limit)
);
}
public function getNewsContentIDs($limit=10){
$this->addSelect(['content_id']);
return $this->loadWhere("datum <= NOW() AND (datum_bis IS NULL OR datum_bis >= now()::date)
ORDER BY datum DESC
LIMIT " . $this->escape($limit));
}
/**
@@ -20,4 +20,16 @@ class Ort_model extends DB_Model
return $this->OrtModel->loadWhere(array("raumtyp_kurzbz" => $raumtyp_kurzbz));
}
public function getContentID($ort_kurzbz)
{
return $this->execReadOnlyQuery("
SELECT content_id
FROM public.tbl_ort
WHERE ort_kurzbz = ?;
",[$ort_kurzbz]);
}
}
+2 -2
View File
@@ -8,10 +8,10 @@ $includesArray = array(
$this->load->view('templates/CISHTML-Header', $includesArray);
?>
<div id="content">
<div >
<h2>Stundenplan</h2>
<hr>
<fhc-calendar :events="events" initial-mode="week" show-weeks></fhc-calendar>
<div id="content"></div>
</div>
<?php $this->load->view('templates/CISHTML-Footer', $includesArray); ?>
+13 -4
View File
@@ -1,20 +1,29 @@
<?php
$includesArray = array(
'title' => 'FH-Complete',
'customJSModules' => ['public/js/apps/Cis/Cms.js'],
'primevue3'=>true,
'customCSSs' => [
'public/css/Cis4/Cms.css',
#'skin/style.css.php'
]
);
$this->load->view('templates/FHC-Header', $includesArray);
switch($template_kurzbz){
case 'raum_contentmittitel':
$includesArray['tabulator5'] = true;
break;
}
$this->load->view('templates/CISVUE-Header', $includesArray);
?>
<h2 ><?php echo isset($content_id)? "Content" : "News" ?></h2>
<hr/>
<div id="cms">
<?php echo (isset($content) ? $content : '<content/>'); ?>
<?php echo (isset($content_id) ? '<cms-content :content_id="'.$content_id.'" :version="'.$version.'" :sprache="'.$sprache.'" :sichtbar="'.$sichtbar.'" />' : '<cms-news/>'); ?>
</div>
<?php $this->load->view('templates/FHC-Footer', $includesArray); ?>
<?php $this->load->view('templates/CISVUE-Footer', $includesArray); ?>
+13 -4
View File
@@ -1,19 +1,28 @@
<?php
$includesArray = array(
'primevue3' => true,
'customJSModules' => ['public/js/apps/Cis/Cms.js'],
'primevue3'=>true,
'customCSSs' => [
'public/css/Cis4/Cms.css',
#'skin/style.css.php'
]
);
switch($template_kurzbz){
case 'raum_contentmittitel':
$includesArray['tabulator5'] = true;
break;
}
$this->load->view('templates/CISHTML-Header', $includesArray);
?>
<h2><?php echo isset($content_id)? "Content" : "News" ?></h2>
<hr/>
<div id="cms">
<?php echo (isset($content) ? $content : '<content/>'); ?>
<?php echo (isset($content_id) ? '<cms-content :content_id="'.$content_id.'" :version="'.$version.'" :sprache="'.$sprache.'" :sichtbar="'.$sichtbar.'" />' : '<cms-news/>'); ?>
</div>
<?php $this->load->view('templates/CISHTML-Footer', $includesArray); ?>
<?php $this->load->view('templates/CISHTML-Footer', $includesArray); ?>
+12 -1
View File
@@ -1,17 +1,28 @@
<?php
$includesArray = array(
'customJSModules' => ['public/js/apps/Cis/Cms.js'],
'primevue3'=>true,
'customCSSs' => [
'public/css/Cis4/Cms.css',
#'skin/style.css.php'
]
);
switch($template_kurzbz){
case 'raum_contentmittitel':
$includesArray['tabulator5'] = true;
break;
}
$this->load->view('templates/CISVUE-Header', $includesArray);
?>
<h2 ><?php echo isset($content_id)? "Content" : "News" ?></h2>
<hr/>
<div id="cms">
<?php echo (isset($content) ? $content : '<content/>'); ?>
<?php echo (isset($content_id) ? '<cms-content :content_id="'.$content_id.'" :version="'.$version.'" :sprache="'.$sprache.'" :sichtbar="'.$sichtbar.'" />' : '<cms-news/>'); ?>
</div>
<?php $this->load->view('templates/CISVUE-Footer', $includesArray); ?>
+2
View File
@@ -1,4 +1,6 @@
@import './calendar.css';
@import './dashboard/news.css';
.empty-tile-hover {
height: 100%;
width: 100%;
+24
View File
@@ -0,0 +1,24 @@
.widgets-news .card-header {
flex-direction: column;
align-items: flex-start !important;
}
:root{
--news-widget-height: 1;
}
.widgets-news .news-content > div,
.widgets-news .news-content .row:nth-child(1),
.widgets-news .news-content .news-list,
.widgets-news .news-content .news-list-item,
.widgets-news .news-content .card-body
{
height: 100%;
}
.widgets-news .card-body{
/*max-height: calc(var(--news-widget-height)*var(--fhc-dg-row-height)); */
overflow:scroll;
}
+40
View File
@@ -0,0 +1,40 @@
export default {
content(content_id, version=null, sprache=null, sichtbar=null) {
return this.$fhcApi.get(
"/api/frontend/v1/Cms/content",
{
content_id: content_id,
...(version?{version}:{}),
...(sprache?{sprache}:{}),
...(sichtbar?{sichtbar}:{}),
}
);
},
news(limit) {
return this.$fhcApi.get(
"/api/frontend/v1/Cms/news",
{
limit: limit
}
);
},
getNews(page = 1, page_size = 10) {
return this.$fhcApi.get(
"/api/frontend/v1/Cms/getNews",
{
page,
page_size,
},
);
},
getNewsRowCount: function () {
return this.$fhcApi.get(
"/api/frontend/v1/Cms/getNewsRowCount",
{}
);
},
}
+4
View File
@@ -27,6 +27,8 @@ import stv from "./stv.js";
import notiz from "./notiz.js";
import betriebsmittel from "./betriebsmittel.js";
import ampeln from "./ampeln.js";
import ort from "./ort.js";
import cms from "./cms.js";
export default {
search,
@@ -41,4 +43,6 @@ export default {
notiz,
betriebsmittel
ampeln,
ort,
cms,
};
+10
View File
@@ -0,0 +1,10 @@
export default {
getContentID(ort_kurbz) {
return this.$fhcApi.get(
FHC_JS_DATA_STORAGE_OBJECT.app_root +
FHC_JS_DATA_STORAGE_OBJECT.ci_router +
"/api/frontend/v1/Ort/ContentID",
{ ort_kurzbz: ort_kurbz }
);
},
}
+6 -4
View File
@@ -1,13 +1,14 @@
import BsConfirm from "../../components/Bootstrap/Confirm.js";
//import Pagination from "../../components/Pagination/Pagination.js";
import Content from "../../components/Cis/Cms/Content.js";
import Fhcapi from "../api/fhcapifactory.js";
import CmsNews from "../../components/Cis/Cms/News.js";
import CmsContent from "../../components/Cis/Cms/Content.js";
import Phrasen from "../../plugin/Phrasen.js";
Vue.$fhcapi = Fhcapi;
const app = Vue.createApp({
components: {
Content,
CmsNews,
CmsContent,
},
mounted() {
document.querySelectorAll("#cms [data-confirm]").forEach((el) => {
@@ -34,5 +35,6 @@ const app = Vue.createApp({
},
});
app.use(primevue.config.default, { zIndex: { overlay: 9999 } });
app.use(Phrasen);
app.mount("#cms");
//#cms [data-confirm], #cms [data-href]
+18 -3
View File
@@ -1,16 +1,28 @@
import FhcCalendar from "../../components/Calendar/Calendar.js";
import CalendarModal from '../../components/Calendar/CalendarModal.js';
import Phrasen from "../../plugin/Phrasen.js";
const app = Vue.createApp({
components: {
FhcCalendar
FhcCalendar,
CalendarModal
},
data() {
return {
stunden: [],
events: null
events: null,
currentlySelectedEvent:null,
}
},
methods:{
selectEvent: function(event){
this.currentlySelectedEvent = event;
Vue.nextTick(()=>{
this.$refs.calendarModal.show();
})
},
},
created() {
axios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Cis/Stundenplan/Stunden').then(res => {
res.data.retval.forEach(std => {
@@ -48,7 +60,10 @@ const app = Vue.createApp({
});
});
});
}
},
template:`
<calendar-modal v-if="currentlySelectedEvent" :event="currentlySelectedEvent" ref="calendarModal" ></calendar-modal>
<fhc-calendar @select:event="selectEvent" :events="events" initial-mode="week" show-weeks></fhc-calendar>`
});
app.config.unwrapInjectedRef = true;
app.use(Phrasen);
+3 -1
View File
@@ -1,6 +1,7 @@
import {CoreNavigationCmpt} from '../../components/navigation/Navigation.js';
import DashboardAdmin from '../../components/Dashboard/Admin.js';
import Phrasen from "../../plugin/Phrasen.js";
import FhcApi from '../../plugin/FhcApi.js';
import Phrasen from '../../plugin/Phrasen.js';
const app = Vue.createApp({
data: () => ({
@@ -12,5 +13,6 @@ const app = Vue.createApp({
}
});
app.config.unwrapInjectedRef = true;
app.use(FhcApi);
app.use(Phrasen);
app.mount('#main');
+3 -1
View File
@@ -1,5 +1,6 @@
import FhcDashboard from '../../components/Dashboard/Dashboard.js';
import Phrasen from "../../plugin/Phrasen.js";
import FhcApi from '../../plugin/FhcApi.js';
import Phrasen from '../../plugin/Phrasen.js';
const app = Vue.createApp({
data: () => ({
@@ -10,5 +11,6 @@ const app = Vue.createApp({
}
});
app.config.unwrapInjectedRef = true;
app.use(FhcApi);
app.use(Phrasen);
app.mount('#content');
-21
View File
@@ -1,21 +0,0 @@
export default {
getNews: function (page = 1, page_size = 10) {
const url =
FHC_JS_DATA_STORAGE_OBJECT.app_root +
FHC_JS_DATA_STORAGE_OBJECT.ci_router +
"/CisHtml/Cms/getNews";
return axios.get(url, {
params: {
page,
page_size,
},
});
},
getNewsRowCount: function () {
const url =
FHC_JS_DATA_STORAGE_OBJECT.app_root +
FHC_JS_DATA_STORAGE_OBJECT.ci_router +
"/CisHtml/Cms/getNewsRowCount";
return axios.get(url);
},
};
-2
View File
@@ -1,7 +1,5 @@
import Search from "./search.js";
import Cms from "./cms.js";
export default {
"Search": Search,
"Cms": Cms,
};
+1 -1
View File
@@ -109,7 +109,7 @@ export default {
document.body.appendChild(wrapper);
});
},
template: `<div ref="modal" class="bootstrap-modal modal" tabindex="-1" @[\`hide.bs.modal\`]="$emit('hideBsModal', $event)" @[\`hidden.bs.modal\`]="$emit('hiddenBsModal', $event)" @[\`hidePrevented.bs.modal\`]="$emit('hidePreventedBsModal', $event)" @[\`show.bs.modal\`]="$emit('showBsModal', $event)" @[\`shown.bs.modal\`]="$emit('shownBsModal', $event)">
template: `<div ref="modal" class="bootstrap-modal modal" tabindex="-1" @[\`hide.bs.modal\`]="$emit('hideBsModal')" @[\`hidden.bs.modal\`]="$emit('hiddenBsModal')" @[\`hidePrevented.bs.modal\`]="$emit('hidePreventedBsModal')" @[\`show.bs.modal\`]="$emit('showBsModal')" >
<div class="modal-dialog" :class="dialogClass">
<div class="modal-content">
<div v-if="$slots.title" class="modal-header">
+2 -13
View File
@@ -5,7 +5,7 @@ import CalendarWeek from './Week.js';
import CalendarWeeks from './Weeks.js';
import CalendarMinimized from './Minimized.js';
import CalendarDate from '../../composables/CalendarDate.js';
import CalendarModal from './CalendarModal.js';
// TODO(chris): week/month toggle
@@ -17,7 +17,6 @@ export default {
CalendarWeek,
CalendarWeeks,
CalendarMinimized,
CalendarModal
},
provide() {
return {
@@ -105,15 +104,6 @@ export default {
},
methods: {
handleInput(day) {
// set the event when clicking on the lernveranstaltung in the data
this.currentlySelectedEvent = day[1];
console.log(this.currentlySelectedEvent)
// showing the modal
Vue.nextTick(()=>{
this.$refs.calendarModal.show();
})
console.log(day,"this is the day")
this.$emit(day[0], day[1]);
}
},
@@ -145,9 +135,8 @@ export default {
}).observe(this.$refs.container);
}
},
template: `
template: /*html*/`
<div ref="container" class="fhc-calendar card" :class="sizeClass">
<calendar-modal v-if="currentlySelectedEvent" :event="currentlySelectedEvent" ref="calendarModal" />
<component v-slot="{event}" :is="'calendar-' + mode" @update:mode="mode=$event" @change:range="$emit('change:range',$event)" @input="handleInput" >
<!--Week Page layout-->
<slot :event="event">
+47 -19
View File
@@ -1,34 +1,62 @@
import Pagination from "../../Pagination/Pagination.js";
import raum_contentmittitel from './Content_types/Raum_contentmittitel.js'
import general from './Content_types/General.js'
export default {
components: {
Pagination,
props:{
content_id:{
type:Number,
required:true,
},
version:{
type:[String, Number],
default: null,
},
sprache:{
type:[String, Number],
default: null,
},
sichtbar:{
type:[String, Number],
default: null,
}
},
components:{
raum_contentmittitel,
general,
},
data() {
return {
content: null,
maxPageCount: 0,
page_size: 10,
};
},
methods: {
loadNewPageContent: function (data) {
Vue.$fhcapi.Cms.getNews(data.page, data.rows).then((result) => {
this.content = result.data;
});
computed:{
computeContentType: function(){
switch(this.content_type){
case "raum_contentmittitel":
return "raum_contentmittitel";
default:
return "general";
};
},
},
created() {
Vue.$fhcapi.Cms.getNews(1, this.page_size).then((result) => {
this.content = result.data;
});
Vue.$fhcapi.Cms.getNewsRowCount().then((result) => {
this.maxPageCount = result.data;
this.$fhcApi.factory.cms.content(this.content_id,this.version, this.sprache, this.sichtbar).then(res =>{
this.content = res.data.content;
this.content_type=res.data.type;
});
},
mounted(){
},
template: /*html*/ `
<pagination :page_size="page_size" @page="loadNewPageContent" :maxPageCount="maxPageCount">
<div v-html="content"></div>
</pagination>`,
<!-- div that contains the content -->
<component :is="computeContentType" v-if="content" :content="content" />
<p v-else>No content is available to display</p>
`,
};
@@ -0,0 +1,65 @@
import BsModal from "../../Bootstrap/Modal";
export default {
mixins:[BsModal],
components:{
BsModal,
},
props:{
contentID:{
type: Number,
required: true,
},
ort_kurzbz:{
type: String,
required: true,
}
},
data(){
return{
result: false,
content: null,
};
},
methods:{
modalHidden: function(){
// reseting the content of the modal
this.content = null;
},
// this method is always called when the modal is shown
modalShown: function(){
if(this.contentID){
this.$fhcApi.factory.cms.content(this.contentID).then(res =>{
this.content = res.data;
})
}
},
},
mounted(){
this.modal = this.$refs.modalContainer;
},
template:/*html*/`
<bs-modal @hideBsModal="modalHidden" @showBsModal="modalShown" ref="modalContainer" dialogClass="modal-lg">
<template #title>
<span v-if="ort_kurzbz">{{ort_kurzbz}}</span>
<span v-else>Raum Informationen</span>
</template>
<template #default>
<div v-if="content" v-html="content"></div>
<div v-else>Der Content für diesen Raum konnte nicht geladen werden</div>
</template>
<template #footer>
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
</template>
</bs-modal>
`
};
@@ -0,0 +1,38 @@
export default {
props:{
content:{
type:String,
required:true,
},
},
mounted(){
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
);
});
},
template: /*html*/ `
<!-- div that contains the content -->
<div v-html="content" v-if="content" :content="content" />
<p v-else>Content was not found</p>
`,
};
@@ -0,0 +1,33 @@
export default {
props:{
content:{
type:String,
required:true,
},
},
mounted(){
let tables = document.getElementsByClassName("tablesorter");
for(let table of tables){
new Tabulator(table, {
layout:"fitDataStretch",
columnDefaults:{
formatter:"html",
resizable:false,
minWidth: "100px",
}
})
table.classList.add("mx-auto");
table.style.width="30em";
}
},
template: /*html*/ `
<!-- div that contains the content -->
<div v-html="content" v-if="content" :content="content" />
<p v-else>Content was not found</p>
`,
};
+41
View File
@@ -0,0 +1,41 @@
import Pagination from "../../Pagination/Pagination.js";
export default {
components: {
Pagination,
},
data() {
return {
content: null,
maxPageCount: 0,
page_size: 10,
};
},
methods: {
loadNewPageContent: function (data) {
this.$fhcApi.factory.cms.getNews(data.page, data.rows)
.then(res => res.data)
.then(result => {
this.content = result;
});
},
},
created() {
this.$fhcApi.factory.cms.getNews(1, this.page_size)
.then(res => res.data)
.then(result => {
this.content = result;
});
this.$fhcApi.factory.cms.getNewsRowCount()
.then(res => res.data)
.then(result => {
this.maxPageCount = result;
});
},
template: /*html*/ `
<pagination :page_size="page_size" @page="loadNewPageContent" :maxPageCount="maxPageCount">
<div v-html="content"></div>
</pagination>`,
};
@@ -0,0 +1,47 @@
import BsModal from "../../Bootstrap/Modal";
export default {
data(){
return {
// reactive data
items:["lehrveranstaltungsInformationen","Notenlisten","Moodle","Gesamtnote","E-mail","Pinboard","Alle Termine der LV","Anrechnung","Evaluierung","Neue Einmeldung"],
lehreinheit:null,
stg:null,
lv:null,
result: false,
}
},
mixins:[BsModal],
components:{
BsModal,
},
mounted(){
this.modal = this.$refs.modalContainer;
},
template:/*html*/`
<bs-modal ref="modalContainer" dialogClass="modal-lg">
<template #title>
<span v-if="lv ">
{{lv + (stg?' / ' + stg:'')}}
</span>
<span v-else>
Lehrveranstaltungs Übersicht
</span>
</template>
<template #default>
<div :style="{'display':'grid', 'row-gap':'10px', 'column-gap':'10px', 'grid-template-columns':'repeat(3,minmax(100px,1fr))', 'grid-template-rows':'repeat('+Math.ceil(items.length / 3)+',minmax(100px,1fr))'} ">
<div class="d-flex flex-column align-items-center justify-content-center" v-for="item in items" :key="item">
<span>{{item}}</span>
<i class="fa fa-file"></i>
</div>
</div>
</template>
<template #footer>
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
</template>
</bs-modal>
`,
};
@@ -154,7 +154,8 @@ export default {
this.modal = this.$refs.modalContainer.modal;
},
popup(options) {
return BsModal.popup.bind(this)(null, options);
BsModal.popup.bind(this);
return BsModal.popup(null, options);
},
template: /*html*/ `
<bs-modal v-show="!loading" ref="modalContainer" v-bind="$props" body-class="" dialog-class="modal-lg" class="bootstrap-alert" backdrop="false" >
+77 -96
View File
@@ -3,116 +3,97 @@ import BsModal from '../Bootstrap/Modal';
const MAX_LOADED_NEWS = 10;
export default {
name: 'WidgetsNews',
components: { BsModal },
data: () => ({
allNewsList: [],
singleNews: {}
}),
mixins: [
AbstractWidget
],
computed: {
newsList(){
//Return news amount depending on widget width and size
let quantity = this.width;
name: "WidgetsNews",
components: { BsModal },
data: () => ({
allNewsList: [],
singleNews: {},
}),
mixins: [AbstractWidget],
computed: {
newsList() {
//Return news amount depending on widget width and size
let quantity = this.width;
if (this.width === 1) {
quantity = this.height === 1 ? 4 : 10;
}
if (this.width === 1) {
quantity = this.height === 1 ? 4 : 10;
}
return this.allNewsList.slice(0, quantity);
},
placeHolderImgURL: function() {
return FHC_JS_DATA_STORAGE_OBJECT.app_root + 'skin/images/fh_technikum_wien_illustration_klein.png';
}
},
created(){
axios
.get(this.apiurl + '/dashboard/Api/getNews', {params: {limit: MAX_LOADED_NEWS}})
.then(res => { this.allNewsList = res.data })
.catch(err => { console.error('ERROR: ', err.response.data) });
return this.allNewsList.slice(0, quantity);
},
placeHolderImgURL: function () {
return (
FHC_JS_DATA_STORAGE_OBJECT.app_root +
"skin/images/fh_technikum_wien_illustration_klein.png"
);
},
},
created() {
this.$fhcApi.factory.cms
.news(MAX_LOADED_NEWS)
.then((res) => {
this.allNewsList = res.data;
})
.catch((err) => {
console.error("ERROR: ", err.response.data);
});
this.$emit('setConfig', false);
},
methods: {
setSingleNews(singleNews){
this.singleNews = singleNews;
this.$refs.newsModal.show();
}
},
template: `<div class="widgets-news w-100 h-100">
<div class="d-flex flex-column h-100">
this.$emit("setConfig", false);
},
methods: {
contentURI: function (content_id) {
return (
FHC_JS_DATA_STORAGE_OBJECT.app_root +
FHC_JS_DATA_STORAGE_OBJECT.ci_router +
"/CisVue/Cms/content/" +
content_id
);
},
allNewsURI: function () {
return (
FHC_JS_DATA_STORAGE_OBJECT.app_root +
FHC_JS_DATA_STORAGE_OBJECT.ci_router +
"/CisVue/Cms/news"
);
},
setSingleNews(singleNews) {
this.singleNews = singleNews;
this.$refs.newsModal.show();
},
},
template: /*html*/ `<div class="widgets-news w-100 h-100">
<div class="d-flex flex-column h-100 ">
<div class="d-flex">
<header><b>Top News</b></header>
<a href="#allNewsModal" data-bs-toggle="modal" class="ms-auto mb-2">
<i class="fa fa-arrow-up-right-from-square me-1"></i>Alle News</a>
<header><b>{{$p.t('news','topNews')}}</b></header>
<a :href="allNewsURI()" class="ms-auto mb-2">
<i class="fa fa-arrow-up-right-from-square me-1"></i>{{$p.t('news','allNews')}}</a>
</div>
<div v-if="width == 1">
<div v-for="news in newsList" :key="news.id" class="mt-2">
<div class="card">
<div class="card-body">
<a href="#newsModal" class="stretched-link" @click="setSingleNews(news)">{{ news.betreff }}</a><br>
<div class="h-100 overflow-scroll" v-if="width == 1">
<div v-for="news in newsList" :key="news.id" class="mt-2">
<div class="card">
<div class=" card-body">
<a :href="contentURI(news.content_id)" class="stretched-link" >{{ news.content_obj.betreff?news.content_obj.betreff:getDate(news.insertamum) }}</a><br>
<span class="small text-muted">{{ formatDateTime(news.insertamum) }}</span>
</div>
</div>
</div>
</div>
<div v-else-if="width > 1 && height === 1" class="h-100" :class="'row row-cols-' + width">
<div v-for="news in newsList" :key="news.id">
<div class="card h-100">
<div class="card-body">
<a href="#newsModal" class="card-title h5 stretched-link" @click="setSingleNews(news)">{{ news.betreff }}</a><br>
<span class="small text-muted">{{ formatDateTime(news.insertamum) }} </span>
<p class="card-text pt-3" style="overflow: hidden; display: -webkit-box; -webkit-line-clamp: 5; -webkit-box-orient: vertical;">{{ news.text }}</p>
</div>
</div>
<div class="h-100" v-for="news in newsList" :key="news.id">
<div class="news-content h-100" :style="'--news-widget-height: '+height" ref="htmlContent" v-html="news.content_obj.content"></div>
</div>
</div>
<div v-else class="h-100" :class="'row row-cols-' + width">
<div v-for="news in newsList" :key="news.id">
<div class="card h-100">
<img :src="placeHolderImgURL" class="card-img-top">
<div class="card-footer"><span class="card-subtitle small text-muted">{{ formatDateTime(news.insertamum) }}</span></div>
<div class="card-body">
<a href="#newsModal" class="card-title h5 stretched-link" @click="setSingleNews(news)">{{ news.betreff }}</a><br>
<p class="card-text pt-3">{{ news.text }}</p>
</div>
</div>
<div class="h-100" v-for="news in newsList" :key="news.id">
<div class="news-content h-100" :style="'--news-widget-height: '+height" ref="htmlContent" v-html="news.content_obj.content"></div>
</div>
</div>
</div>
</div>
<!-- News Modal -->
<BsModal ref="newsModal" id="newsModal" dialog-class="modal-lg">
<template #title>
<div class="row">
<div class="col-5"><img :src="placeHolderImgURL" class="img-fluid rounded-start"></div>
<div class="col-7 d-flex align-items-end">
<p>{{ singleNews.betreff }}<br><small class="text-muted">{{ formatDateTime(singleNews.insertamum) }}</small></p>
</div>
</div>
</template>
<template #default>{{ singleNews.text }}</template>
</BsModal>
<!-- All News Modal -->
<BsModal ref="allNewsModal" id="allNewsModal" dialog-class="modal-fullscreen">
<template #title>Alle News</template>
<template #default>
<div class="row row-cols-md-2 row-cols-lg-3 row-cols-xl-5 g-4 h-100 px-5">
<div v-for="news in allNewsList" :key="news.id">
<div class="card h-100">
<img :src="placeHolderImgURL" class="card-img-top">
<div class="card-footer"><span class="card-subtitle small">{{ formatDateTime(news.insertamum) }}</span></div>
<div class="card-body">
<a href="" class="card-title h5 stretched-link" @click="setSingleNews1(news)">{{ news.betreff }}</a><br>
<p class="card-text">{{ news.text }}</p>
</div>
</div>
</div>
</div>
</template>
</BsModal>`
}
</div>`,
};
@@ -1,6 +1,8 @@
import Phrasen from '../../mixins/Phrasen.js';
import AbstractWidget from './Abstract.js';
import FhcCalendar from '../Calendar/Calendar.js';
import LvUebersicht from '../Cis/Mylv/LvUebersicht.js';
import ContentModal from '../Cis/Cms/ContentModal.js';
export default {
mixins: [
@@ -8,17 +10,23 @@ export default {
AbstractWidget
],
components: {
FhcCalendar
FhcCalendar,
LvUebersicht,
ContentModal,
},
data() {
return {
stunden: [],
minimized: true,
events: null,
currentDay: new Date()
currentDay: new Date(),
roomInfoContentID: null,
ort_kurzbz: null,
}
},
computed: {
currentEvents() {
return (this.events || []).filter(evt => evt.end < this.dayAfterCurrentDay && evt.start >= this.currentDay);
},
@@ -29,12 +37,54 @@ export default {
}
},
methods: {
showRoomInfoModal: function(ort_kurzbz){
// getting the content_id of the ort_kurzbz
this.$fhcApi.factory.ort.getContentID(ort_kurzbz).then(res =>{
this.roomInfoContentID = res.data;
this.ort_kurzbz = ort_kurzbz;
// only showing the modal after vue was able to set the reactive data
Vue.nextTick(()=>{this.$refs.contentModal.show();});
}).catch(err =>{
console.err(err);
this.ort_kurzbz = null;
this.roomInfoContentID = null;
});
},
showLvUebersicht: function (event){
this.$refs.lvUebersicht.lehreinheit = event.lehreinheit_id;
this.$refs.lvUebersicht.lv = event.title;
this.$refs.lvUebersicht.stg = event.stg_typ + event.stg_kurzbz + (event.verband?'-' + event.verband:'' );
this.$refs.lvUebersicht.show();
},
selectDay(day) {
this.currentDay = day;
this.minimized = true;
},
// this function was the alternative of showing the room information in the content component instead of showing the room information inside a modal
showRoomInfo: function($ort_kurzbz){
this.$fhcApi.factory.ort.getContentID($ort_kurzbz).then(res =>{
window.location.href = FHC_JS_DATA_STORAGE_OBJECT.app_root +
FHC_JS_DATA_STORAGE_OBJECT.ci_router +
"/CisHtml/Cms/content/" + res.data;
})
}
},
created() {
this.$emit('setConfig', false);
axios
.get(this.apiurl + '/components/Cis/Stundenplan/Stunden').then(res => {
@@ -59,19 +109,23 @@ export default {
})
.catch(err => { console.error('ERROR: ', err.response.data) });
},
template: `
template: /*html*/`
<div class="dashboard-widget-stundenplan d-flex flex-column h-100">
<lv-uebersicht ref="lvUebersicht" />
<content-modal :contentID="roomInfoContentID" :ort_kurzbz="" dialogClass="modal-lg" ref="contentModal"/>
<fhc-calendar :initial-date="currentDay" class="border-0" class-header="p-0" @select:day="selectDay" v-model:minimized="minimized" :events="events" no-week-view :show-weeks="false" />
<div v-show="minimized" class="flex-grow-1 overflow-scroll">
<div v-if="events === null" class="d-flex h-100 justify-content-center align-items-center">
<i class="fa-solid fa-spinner fa-pulse fa-3x"></i>
</div>
<div v-else-if="currentEvents.length" class="list-group list-group-flush">
<div class="" v-for="evt in currentEvents" :key="evt.id" class="list-group-item small" :style="{'background-color':evt.color}">
<div role="button" @click="showLvUebersicht(evt)" class="" v-for="evt in currentEvents" :key="evt.id" class="list-group-item small" :style="{'background-color':evt.color}">
<b>{{evt.title}}</b>
<br>
<small class="d-flex w-100 justify-content-between">
<span>{{evt.ort_kurzbz}}</span>
<!-- event modifier stop to prevent opening the modal for the lv Uebersicht when clicking on the ort_kurzbz -->
<!-- old event: showRoomInfo(evt.ort_kurzbz) -->
<span @click.stop="showRoomInfoModal(evt.ort_kurzbz)" style="text-decoration:underline" type="button">{{evt.ort_kurzbz}}</span>
<span>{{evt.start.toLocaleTimeString(undefined, {hour:'numeric',minute:'numeric'})}}-{{evt.end.toLocaleTimeString(undefined, {hour:'numeric',minute:'numeric'})}}</span>
</small>
</div>
Executable → Regular
+61
View File
@@ -33313,6 +33313,67 @@ array(
)
)
),
// NEWS PHRASEN ---------------------------------------------------------------------------
array(
'app' => 'core',
'category' => 'news',
'phrase' => 'allNews',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Alle News',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'All News',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'news',
'phrase' => 'topNews',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Top Nachrichten',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Top News',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'news',
'phrase' => 'noSubject',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Kein Betreff vorhanden',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'No Subject available',
'description' => '',
'insertvon' => 'system'
)
)
),
);