mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-07-23 18:02:18 +00:00
CIS4: added Projektabgabe Uebersicht, enabled filtering by Abgabe data and person data
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
class ProjektabgabeUebersicht extends Auth_Controller
|
||||
{
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'index' => ['basis/cis:r']
|
||||
]);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Public methods
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
// TODO create permission
|
||||
$viewData = array(
|
||||
'uid' => getAuthUID(),
|
||||
'showEdit' => true
|
||||
);
|
||||
|
||||
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'ProjektabgabeUebersicht']);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,176 @@
|
||||
<?php
|
||||
/**
|
||||
* FH-Complete
|
||||
*
|
||||
* @package FHC-API
|
||||
* @author FHC-Team
|
||||
* @copyright Copyright (c) 2016, fhcomplete.org
|
||||
* @license GPLv3
|
||||
* @link http://fhcomplete.org
|
||||
* @since Version 1.0
|
||||
* @filesource
|
||||
*/
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
if (!defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
|
||||
class PaabgabeUebersicht extends FHCAPI_Controller
|
||||
{
|
||||
const DOWNLOAD_PERMISSION = 'lehre/abgabetool:download';
|
||||
const ABGABE_TYPES = ['Bachelor', 'Diplom'];
|
||||
|
||||
/**
|
||||
* PaabgabeUebersicht API constructor.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'getStudiengaenge' => array('lehre/abgabetool:r'),
|
||||
'getPaAbgaben' => array('lehre/abgabetool:r'),
|
||||
'getTermine' => array('lehre/abgabetool:r'),
|
||||
'getPaAbgabetypen' => array('lehre/abgabetool:r')
|
||||
//'downloadProjektarbeit' => array('lehre/abgabetool:r')
|
||||
]);
|
||||
|
||||
$this->load->model('education/Paabgabe_model', 'PaabgabeModel');
|
||||
|
||||
$this->load->library('PermissionLib');
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @return array|stdClass|null
|
||||
*/
|
||||
public function getPaAbgaben()
|
||||
{
|
||||
$studiengang_kz = $this->input->get('studiengang_kz');
|
||||
$abgabetyp_kurzbz = $this->input->get('abgabetyp_kurzbz');
|
||||
$abgabedatum = $this->input->get('abgabedatum');
|
||||
$personSearchString = $this->input->get('personSearchString');
|
||||
|
||||
|
||||
$result = $this->PaabgabeModel->getPaAbgaben(self::ABGABE_TYPES, $studiengang_kz, $abgabetyp_kurzbz, $abgabedatum, $personSearchString);
|
||||
$this->addMeta('res', $result);
|
||||
|
||||
if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_DB);
|
||||
|
||||
$this->terminateWithSuccess(getData($result) ?: []);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @return array|stdClass|null
|
||||
*/
|
||||
//~ public function searchPaAbgabenByPerson()
|
||||
//~ {
|
||||
//~ $searchString = $this->input->get('searchString');
|
||||
|
||||
//~ $result = $this->PaabgabeModel->searchPaAbgabenByPerson(self::ABGABE_TYPES, $searchString);
|
||||
//~ $this->addMeta('res', $result);
|
||||
|
||||
//~ if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_DB);
|
||||
|
||||
//~ $this->terminateWithSuccess(getData($result) ?: []);
|
||||
//~ }
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @return array|stdClass|null
|
||||
*/
|
||||
public function getStudiengaenge()
|
||||
{
|
||||
$studiengang_kz_arr = $this->permissionlib->getSTG_isEntitledFor(self::DOWNLOAD_PERMISSION);
|
||||
|
||||
if (!$studiengang_kz_arr) $this->terminateWithSuccess([]);
|
||||
|
||||
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
|
||||
|
||||
$this->StudiengangModel->addSelect('tbl_studiengang.*, UPPER(tbl_studiengang.typ || tbl_studiengang.kurzbz) AS kuerzel', $studiengang_kz_arr);
|
||||
$this->StudiengangModel->db->where_in('studiengang_kz', $studiengang_kz_arr);
|
||||
$this->StudiengangModel->addOrder('typ, kurzbz');
|
||||
$result = $this->StudiengangModel->load();
|
||||
|
||||
if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_DB);
|
||||
|
||||
$this->terminateWithSuccess((getData($result) ?: []));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @return array|stdClass|null
|
||||
*/
|
||||
public function getTermine()
|
||||
{
|
||||
$studiengang_kz = $this->input->get('studiengang_kz');
|
||||
$abgabetyp_kurzbz = $this->input->get('abgabetyp_kurzbz');
|
||||
|
||||
$result = $this->PaabgabeModel->getTermine(self::ABGABE_TYPES, $studiengang_kz, $abgabetyp_kurzbz);
|
||||
|
||||
if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_DB);
|
||||
|
||||
$this->terminateWithSuccess((getData($result) ?: []));
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @return array|stdClass|null
|
||||
*/
|
||||
public function getPaAbgabetypen()
|
||||
{
|
||||
// Load model PaabgabetypModel
|
||||
$this->load->model('education/Paabgabetyp_model', 'PaabgabetypModel');
|
||||
|
||||
$result = $this->PaabgabetypModel->load();
|
||||
|
||||
if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_DB);
|
||||
|
||||
$this->terminateWithSuccess((getData($result) ?: []));
|
||||
}
|
||||
|
||||
/**
|
||||
* Download Projektarbeit document.
|
||||
*/
|
||||
//~ public function downloadProjektarbeit()
|
||||
//~ {
|
||||
//~ $paabgabe_id = $this->input->get('paabgabe_id');
|
||||
|
||||
//~ if (!is_numeric($paabgabe_id))
|
||||
//~ $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id' => 'Abgabe ID']), self::ERROR_TYPE_GENERAL);
|
||||
|
||||
//~ //$abgabeRes = $this->PaabgabeModel->getEndabgabe($projektarbeit_id);
|
||||
//~ $this->PaabgabeModel->addSelect("paabgabe_id, student_uid, tbl_paabgabe.datum, tbl_paabgabe.abgabedatum, projekttyp_kurzbz, titel, titel_english,
|
||||
//~ paabgabe_id || '_' || student_uid || '.pdf' AS filename");
|
||||
//~ $this->PaabgabeModel->addJoin('lehre.tbl_projektarbeit', 'projektarbeit_id');
|
||||
//~ $abgabeRes = $this->PaabgabeModel->load($paabgabe_id);
|
||||
|
||||
//~ if (isError($abgabeRes))
|
||||
//~ show_error(getError($abgabeRes));
|
||||
|
||||
//~ if (hasData($abgabeRes))
|
||||
//~ {
|
||||
//~ $endabgabe = getData($abgabeRes)[0];
|
||||
//~ $filepath = PAABGABE_PATH.$endabgabe->filename;
|
||||
|
||||
//~ if (file_exists($filepath))
|
||||
//~ {
|
||||
//~ $this->output
|
||||
//~ ->set_status_header(200)
|
||||
//~ ->set_content_type('application/pdf', 'utf-8')
|
||||
//~ ->set_header('Content-Disposition: attachment; filename="'.$endabgabe->filename.'"')
|
||||
//~ ->set_output(file_get_contents($filepath))
|
||||
//~ ->_display();
|
||||
//~ }
|
||||
//~ else
|
||||
//~ {
|
||||
//~ show_error("File does not exist.");
|
||||
//~ }
|
||||
//~ }
|
||||
//~ }
|
||||
}
|
||||
@@ -60,5 +60,198 @@ class Paabgabe_model extends DB_Model
|
||||
|
||||
return $this->execReadOnlyQuery($qry, array($person_id));
|
||||
}
|
||||
|
||||
|
||||
public function getPaAbgaben(
|
||||
$projekttyp_kurzbz_arr,
|
||||
$studiengang_kz = null,
|
||||
$abgabetyp_kurzbz = null,
|
||||
$abgabedatum = null,
|
||||
$personSearchString = null,
|
||||
$limit = 100
|
||||
) {
|
||||
// convert search string
|
||||
if (is_numeric($personSearchString))
|
||||
{
|
||||
$personSearchString = (int) $personSearchString;
|
||||
}
|
||||
else
|
||||
{
|
||||
// remove empty spaces and lowercase
|
||||
$personSearchString = strtolower(str_replace(' ', '', $personSearchString));
|
||||
}
|
||||
|
||||
$params = [];
|
||||
|
||||
$qry = "
|
||||
SELECT
|
||||
tbl_studiengang.bezeichnung AS stgbez, tbl_paabgabe.datum AS termin,
|
||||
tbl_paabgabe.*, abgabetyp.bezeichnung AS paabgabetyp_bezeichnung, ben.uid, pers.vorname, pers.nachname, pa.projekttyp_kurzbz, pa.titel
|
||||
FROM
|
||||
lehre.tbl_projektarbeit pa
|
||||
JOIN campus.tbl_paabgabe USING(projektarbeit_id)
|
||||
JOIN campus.tbl_paabgabetyp abgabetyp USING(paabgabetyp_kurzbz)
|
||||
LEFT JOIN public.tbl_benutzer ben ON(uid=student_uid)
|
||||
LEFT JOIN public.tbl_person pers ON(ben.person_id=pers.person_id)
|
||||
LEFT JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
|
||||
LEFT JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id)
|
||||
LEFT JOIN public.tbl_studiengang USING(studiengang_kz)
|
||||
WHERE
|
||||
TRUE";
|
||||
|
||||
if (isset($projekttyp_kurzbz_arr) && !isEmptyArray($projekttyp_kurzbz_arr))
|
||||
{
|
||||
$qry .= " AND projekttyp_kurzbz IN ?";
|
||||
$params[] = $projekttyp_kurzbz_arr;
|
||||
}
|
||||
|
||||
if (isset($studiengang_kz) && is_numeric($studiengang_kz))
|
||||
{
|
||||
$qry .= " AND public.tbl_studiengang.studiengang_kz=?";
|
||||
$params[] = $studiengang_kz;
|
||||
}
|
||||
|
||||
if (isset($abgabetyp_kurzbz))
|
||||
{
|
||||
$qry .= " AND campus.tbl_paabgabe.paabgabetyp_kurzbz=?";
|
||||
$params[] = $abgabetyp_kurzbz;
|
||||
}
|
||||
|
||||
if (isset($abgabedatum))
|
||||
{
|
||||
$qry .= " AND campus.tbl_paabgabe.datum=?";
|
||||
$params[] = $abgabedatum;
|
||||
}
|
||||
|
||||
if (is_integer($personSearchString))
|
||||
{
|
||||
$params = array_merge($params, [$personSearchString, $personSearchString]);
|
||||
$qry .= " AND (
|
||||
pers.person_id = ?
|
||||
OR EXISTS (SELECT 1 FROM public.tbl_prestudent WHERE person_id = pers.person_id AND prestudent_id = ?)
|
||||
)";
|
||||
}
|
||||
elseif (is_string($personSearchString))
|
||||
{
|
||||
$qry .= " AND (
|
||||
LOWER(REPLACE(pers.nachname || pers.vorname || pers.nachname, ' ', '')) LIKE ".$this->db->escape('%'.$personSearchString.'%')."
|
||||
OR ben.uid LIKE ".$this->db->escape('%'.$personSearchString.'%')."
|
||||
)";
|
||||
}
|
||||
|
||||
$qry .= " ORDER BY nachname";
|
||||
|
||||
if (isset($limit) && is_numeric($limit)
|
||||
&& (!isset($studiengang_kz) || !is_numeric($studiengang_kz))
|
||||
&& !isset($abgabetyp_kurzbz) && !isset($abgabedatum))
|
||||
{
|
||||
$qry .= " LIMIT ?";
|
||||
$params[] = $limit;
|
||||
}
|
||||
|
||||
return $this->execReadOnlyQuery($qry, $params);
|
||||
}
|
||||
|
||||
public function getTermine($projekttyp_kurzbz_arr, $studiengang_kz, $abgabetyp_kurzbz)
|
||||
{
|
||||
$params = [];
|
||||
|
||||
$qry = "
|
||||
SELECT
|
||||
DISTINCT campus.tbl_paabgabe.datum as termin, to_char(campus.tbl_paabgabe.datum, 'DD.MM.YYYY') as termin_anzeige
|
||||
FROM
|
||||
lehre.tbl_projektarbeit
|
||||
JOIN campus.tbl_paabgabe USING(projektarbeit_id)
|
||||
LEFT JOIN public.tbl_benutzer ON(uid=student_uid)
|
||||
LEFT JOIN public.tbl_person ON(tbl_benutzer.person_id=tbl_person.person_id)
|
||||
LEFT JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
|
||||
LEFT JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id)
|
||||
LEFT JOIN public.tbl_studiengang USING(studiengang_kz)
|
||||
WHERE
|
||||
TRUE";
|
||||
|
||||
if (isset($projekttyp_kurzbz_arr) && !isEmptyArray($projekttyp_kurzbz_arr))
|
||||
{
|
||||
$qry .= " AND projekttyp_kurzbz IN ?";
|
||||
$params[] = $projekttyp_kurzbz_arr;
|
||||
}
|
||||
|
||||
if (isset($studiengang_kz) && is_numeric($studiengang_kz))
|
||||
{
|
||||
$qry .= " AND public.tbl_studiengang.studiengang_kz=?";
|
||||
$params[] = $studiengang_kz;
|
||||
}
|
||||
|
||||
if (isset($abgabetyp_kurzbz))
|
||||
{
|
||||
$qry .= " AND campus.tbl_paabgabe.paabgabetyp_kurzbz=?";
|
||||
$params[] = $abgabetyp_kurzbz;
|
||||
}
|
||||
|
||||
$qry .= " ORDER BY termin DESC";
|
||||
|
||||
return $this->execReadOnlyQuery($qry, $params);
|
||||
}
|
||||
|
||||
//~ public function searchPaAbgabenByPerson($projekttyp_kurzbz_arr, $searchString, $limit = 100)
|
||||
//~ {
|
||||
//~ if (is_numeric($searchString))
|
||||
//~ {
|
||||
//~ $searchString = (int) $searchString;
|
||||
//~ }
|
||||
//~ else
|
||||
//~ {
|
||||
//~ $searchString = strtolower(str_replace(' ', '', $searchString));
|
||||
//~ }
|
||||
|
||||
//~ $params = [];
|
||||
|
||||
//~ $qry = "
|
||||
//~ SELECT
|
||||
//~ tbl_studiengang.bezeichnung AS stgbez, tbl_paabgabe.datum AS termin,
|
||||
//~ tbl_paabgabe.*, abgabetyp.bezeichnung AS paabgabetyp_bezeichnung, ben.uid, pers.vorname, pers.nachname, pa.projekttyp_kurzbz, pa.titel
|
||||
//~ FROM
|
||||
//~ lehre.tbl_projektarbeit pa
|
||||
//~ JOIN campus.tbl_paabgabe USING(projektarbeit_id)
|
||||
//~ JOIN campus.tbl_paabgabetyp abgabetyp USING(paabgabetyp_kurzbz)
|
||||
//~ LEFT JOIN public.tbl_benutzer ben ON(uid=student_uid)
|
||||
//~ LEFT JOIN public.tbl_person pers ON(ben.person_id=pers.person_id)
|
||||
//~ LEFT JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
|
||||
//~ LEFT JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id)
|
||||
//~ LEFT JOIN public.tbl_studiengang USING(studiengang_kz)
|
||||
//~ WHERE
|
||||
//~ TRUE";
|
||||
|
||||
//~ if (isset($projekttyp_kurzbz_arr) && !isEmptyArray($projekttyp_kurzbz_arr))
|
||||
//~ {
|
||||
//~ $qry .= " AND projekttyp_kurzbz IN ?";
|
||||
//~ $params[] = $projekttyp_kurzbz_arr;
|
||||
//~ }
|
||||
|
||||
|
||||
//~ if (is_integer($searchString))
|
||||
//~ {
|
||||
//~ $params = array_merge($params, [$searchString, $searchString]);
|
||||
//~ $qry .= " AND (
|
||||
//~ pers.person_id = ?
|
||||
//~ OR EXISTS (SELECT 1 FROM public.tbl_prestudent WHERE person_id = pers.person_id AND prestudent_id = ?)
|
||||
//~ )";
|
||||
//~ }
|
||||
//~ else
|
||||
//~ {
|
||||
//~ $qry .= " AND (
|
||||
//~ LOWER(REPLACE(pers.nachname || pers.vorname || pers.nachname, ' ', '')) LIKE ".$this->db->escape('%'.$searchString.'%')."
|
||||
//~ OR ben.uid LIKE ".$this->db->escape('%'.$searchString.'%')."
|
||||
//~ )";
|
||||
//~ }
|
||||
|
||||
//~ $qry .= " ORDER BY nachname";
|
||||
|
||||
//~ if (isset($limit) && is_numeric($limit))
|
||||
//~ {
|
||||
//~ $qry .= " LIMIT ?";
|
||||
//~ $params[] = $limit;
|
||||
//~ }
|
||||
|
||||
//~ return $this->execReadOnlyQuery($qry, $params);
|
||||
//~ }
|
||||
}
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
export default {
|
||||
getPaAbgaben(studiengang_kz, abgabetyp_kurzbz, abgabedatum, personSearchString) {
|
||||
return {
|
||||
method: 'get',
|
||||
url: '/api/frontend/v1/education/PaabgabeUebersicht/getPaAbgaben',
|
||||
params: {
|
||||
studiengang_kz: studiengang_kz, abgabetyp_kurzbz: abgabetyp_kurzbz, abgabedatum: abgabedatum, personSearchString: personSearchString
|
||||
}
|
||||
};
|
||||
},
|
||||
//~ searchPaAbgabenByPerson(searchString) {
|
||||
//~ return {
|
||||
//~ method: 'get',
|
||||
//~ url: '/api/frontend/v1/education/PaabgabeUebersicht/searchPaAbgabenByPerson',
|
||||
//~ params: { searchString: searchString }
|
||||
//~ };
|
||||
//~ },
|
||||
getStudiengaenge() {
|
||||
return {
|
||||
method: 'get',
|
||||
url: '/api/frontend/v1/education/PaabgabeUebersicht/getStudiengaenge'
|
||||
};
|
||||
},
|
||||
getTermine(studiengang_kz, abgabetyp_kurzbz) {
|
||||
return {
|
||||
method: 'get',
|
||||
url: '/api/frontend/v1/education/PaabgabeUebersicht/getTermine',
|
||||
params: { studiengang_kz: studiengang_kz, abgabetyp_kurzbz: abgabetyp_kurzbz }
|
||||
};
|
||||
},
|
||||
getPaAbgabetypen() {
|
||||
return {
|
||||
method: 'get',
|
||||
url: '/api/frontend/v1/education/PaabgabeUebersicht/getPaAbgabetypen'
|
||||
};
|
||||
}
|
||||
};
|
||||
@@ -16,6 +16,7 @@ import AbgabetoolStudent from "../../components/Cis/Abgabetool/AbgabetoolStudent
|
||||
import AbgabetoolMitarbeiter from "../../components/Cis/Abgabetool/AbgabetoolMitarbeiter.js";
|
||||
import DeadlineOverview from "../../components/Cis/Abgabetool/DeadlineOverview.js";
|
||||
import Studium from "../../components/Cis/Studium/Studium.js";
|
||||
import PaabgabeUebersicht from "../../components/Cis/ProjektabgabeUebersicht/ProjektabgabeUebersicht.js";
|
||||
|
||||
import ApiRenderers from '../../api/factory/renderers.js';
|
||||
import ApiRouteInfo from '../../api/factory/routeinfo.js';
|
||||
@@ -67,6 +68,12 @@ const router = VueRouter.createRouter({
|
||||
component: Raumsuche,
|
||||
props: true
|
||||
},
|
||||
{
|
||||
path: `/Cis/ProjektabgabeUebersicht`,
|
||||
name: 'PaabgabeUebersicht',
|
||||
component: PaabgabeUebersicht,
|
||||
props: true
|
||||
},
|
||||
// Redirect old links to new format
|
||||
{
|
||||
path: "/CisVue/Cms/getRoomInformation/:ort_kurzbz",
|
||||
@@ -153,7 +160,7 @@ const router = VueRouter.createRouter({
|
||||
// Redirect old links to new format
|
||||
{
|
||||
// only trigger on first param being numeric to avoid paths like "LvPlan/Month" entering here
|
||||
path: "/Cis/LvPlan/:lv_id(\\d+)",
|
||||
path: "/Cis/LvPlan/:lv_id(\\d+)",
|
||||
name: "LvPlanOld",
|
||||
component: LvPlan,
|
||||
redirect(to) {
|
||||
@@ -228,13 +235,13 @@ const app = Vue.createApp({
|
||||
computed: {
|
||||
isMobile() {
|
||||
return /Mobi|Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
|
||||
}
|
||||
}
|
||||
},
|
||||
provide() {
|
||||
return { // provide injectable & watchable language property
|
||||
language: Vue.computed(() => this.$p.user_language),
|
||||
renderers: Vue.computed(() => this.renderers),
|
||||
}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
isInternalRoute(href) {
|
||||
@@ -247,7 +254,7 @@ const app = Vue.createApp({
|
||||
if(target?.id == 'skiplink') return
|
||||
if (target && this.isInternalRoute(target.href)) {
|
||||
const url = new URL(target.href)
|
||||
|
||||
|
||||
const path = url.pathname
|
||||
const base = this.$router.options.history.base
|
||||
const route = path.replace(base, '') || '/'
|
||||
@@ -255,19 +262,19 @@ const app = Vue.createApp({
|
||||
// let click event propagate normally if we dont route internally
|
||||
const res = this.$router.resolve(route)
|
||||
if(!res?.matched?.length || res.name === 'Fallback') return
|
||||
|
||||
|
||||
event.preventDefault(); // Prevent browser navigation
|
||||
|
||||
|
||||
if(this.isMobile) { // toggle the menu
|
||||
const navMain = document.getElementById('nav-main');
|
||||
// fix unwanted toggle from off to on for some links on mobile
|
||||
if(navMain.classList.contains('show')){
|
||||
document.getElementById('nav-main-btn').click();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
this.$router.push(route);
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -282,9 +289,9 @@ const app = Vue.createApp({
|
||||
let calendarEvent = null;
|
||||
if (data[rendertype].modalTitle)
|
||||
modalTitle = Vue.markRaw(Vue.defineAsyncComponent(() => import(data[rendertype].modalTitle)));
|
||||
if (data[rendertype].modalContent)
|
||||
if (data[rendertype].modalContent)
|
||||
modalContent = Vue.markRaw(Vue.defineAsyncComponent(() => import(data[rendertype].modalContent)));
|
||||
if (data[rendertype].calendarEvent)
|
||||
if (data[rendertype].calendarEvent)
|
||||
calendarEvent = Vue.markRaw(Vue.defineAsyncComponent(() => import(data[rendertype].calendarEvent)));
|
||||
|
||||
if (data[rendertype].calendarEventStyles){
|
||||
|
||||
@@ -0,0 +1,309 @@
|
||||
import {CoreFilterCmpt} from "../../../components/filter/Filter.js";
|
||||
import VueDatePicker from '../../vueDatepicker.js.php';
|
||||
import ApiPaabgabe from '../../../api/factory/paabgabeUebersicht.js'
|
||||
import Loader from "../../Loader.js";
|
||||
|
||||
export const ProjektabgabeUebersicht = {
|
||||
name: "ProjektabgabeUebersicht",
|
||||
props: {
|
||||
viewData: Object // NOTE: this is inherited from router-view
|
||||
},
|
||||
components: {
|
||||
VueDatePicker,
|
||||
CoreFilterCmpt,
|
||||
Loader
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
phrasenPromise: null,
|
||||
phrasenResolved: false,
|
||||
tabulatorUuid: Vue.ref(0),
|
||||
tableBuiltResolve: null,
|
||||
tableBuiltPromise: null,
|
||||
studiengaenge: null,
|
||||
abgabetypen: null,
|
||||
termine: null,
|
||||
abgaben: null,
|
||||
defaultStudiengang: {
|
||||
studiengang_kz: null,
|
||||
kuerzel: Vue.computed(() => this.$p.t('abgabetool/studiengangWaehlen'))
|
||||
},
|
||||
defaultTyp: {
|
||||
paabgabetyp_kurzbz: null,
|
||||
bezeichnung: Vue.computed(() => this.$p.t('abgabetool/abgabetypWaehlen'))
|
||||
},
|
||||
defaultTermin: {
|
||||
termin: null,
|
||||
termin_anzeige: Vue.computed(() => this.$p.t('abgabetool/terminWaehlen'))
|
||||
},
|
||||
selectedStudiengang: null,
|
||||
selectedAbgabetyp: null,
|
||||
selectedTermin: null,
|
||||
personSearchString: null,
|
||||
paabgabeTableOptions: {
|
||||
height: Vue.ref(400),
|
||||
index: 'paabgabe_id',
|
||||
layout: 'fitColumns',
|
||||
//~ placeholder: this.$p.t('global/noDataAvailable'),
|
||||
columns: [
|
||||
{
|
||||
title: Vue.computed(() => this.$p.t('global/aktionen')), field: 'actions',
|
||||
formatter: (cell, formatterParams, onRendered) => {
|
||||
let container = document.createElement('div');
|
||||
container.className = "d-flex gap-2";
|
||||
|
||||
let downloadButton = document.createElement('button');
|
||||
downloadButton.className = 'btn btn-outline-secondary';
|
||||
downloadButton.innerHTML = '<i class="fa fa-download"></i>';
|
||||
downloadButton.title = this.$p.t('ui', 'downloadDok');
|
||||
downloadButton.addEventListener('click', evt => {
|
||||
evt.stopPropagation();
|
||||
this.actionDownload(cell.getData().paabgabe_id);
|
||||
});
|
||||
container.append(downloadButton);
|
||||
|
||||
if (this.viewData.showEdit)
|
||||
{
|
||||
let editButton = document.createElement('button');
|
||||
editButton.className = 'btn btn-outline-secondary';
|
||||
editButton.innerHTML = '<i class="fa fa-edit"></i>';
|
||||
editButton.addEventListener('click', () =>
|
||||
this.$refs.edit.open(cell.getData())
|
||||
);
|
||||
container.append(editButton);
|
||||
}
|
||||
|
||||
return container;
|
||||
}
|
||||
},
|
||||
{title: Vue.computed(() => this.$p.t('abgabetool/paabgabeid')), field: 'paabgabe_id', widthGrow: 1, visible: false},
|
||||
{
|
||||
title: Vue.computed(() => this.$p.t('abgabetool/termin')),
|
||||
field: "termin",
|
||||
widthGrow: 1,
|
||||
formatter: function (cell) {
|
||||
const dateStr = cell.getValue();
|
||||
if (!dateStr) return "";
|
||||
|
||||
const date = new Date(dateStr);
|
||||
return date.toLocaleString("de-DE", {
|
||||
day: "2-digit",
|
||||
month: "2-digit",
|
||||
year: "numeric",
|
||||
hour12: false
|
||||
});
|
||||
}
|
||||
},
|
||||
{title: Vue.computed(() => this.$p.t('abgabetool/c4abgabetyp')), field: 'paabgabetyp_bezeichnung', widthGrow: 1},
|
||||
{title: Vue.computed(() => this.$p.t('person/uid')), field: 'uid', widthGrow: 1},
|
||||
{title: Vue.computed(() => this.$p.t('person/vorname')), field: 'vorname', widthGrow: 1},
|
||||
{title: Vue.computed(() => this.$p.t('person/nachname')), field: 'nachname', widthGrow: 1},
|
||||
{title: Vue.computed(() => this.$p.t('abgabetool/typ')), field: 'projekttyp_kurzbz', widthGrow: 1},
|
||||
{title: Vue.computed(() => this.$p.t('abgabetool/titel')), field: 'titel', widthGrow: 1}
|
||||
],
|
||||
persistence: false,
|
||||
},
|
||||
paabgabeTableEventHandlers: [{
|
||||
event: "tableBuilt",
|
||||
handler: async () => {
|
||||
this.tableBuiltResolve()
|
||||
}
|
||||
}
|
||||
]};
|
||||
},
|
||||
methods: {
|
||||
tableResolve(resolve) {
|
||||
this.tableBuiltResolve = resolve
|
||||
},
|
||||
setupData(data){
|
||||
//~ const d = data.map(paabgabe => {
|
||||
//~ return {
|
||||
//~ ort_kurzbz: paabgabe.ort_kurzbz,
|
||||
//~ bezeichnung: paabgabe.bezeichnung.replace('&', '&'),
|
||||
//~ nummer: paabgabe.planbezeichnung,
|
||||
//~ personen: paabgabe.max_person
|
||||
//~ }
|
||||
//~ })
|
||||
|
||||
this.$refs.paabgabeTable.tabulator.setData(data);
|
||||
},
|
||||
setNoDataPlaceholder() {
|
||||
this.$refs.paabgabeTable.tabulatorOptions.placeholder = this.$p.t('global/noDataAvailable');
|
||||
},
|
||||
loadStudiengaenge() {
|
||||
this.$api.call(ApiPaabgabe.getStudiengaenge())
|
||||
.then(res => {
|
||||
this.studiengaenge = res?.data ?? []
|
||||
})
|
||||
},
|
||||
loadPaabgabeTypes() {
|
||||
this.$api.call(ApiPaabgabe.getPaAbgabetypen())
|
||||
.then(res => {
|
||||
this.abgabetypen = res?.data ?? []
|
||||
})
|
||||
},
|
||||
loadTermine() {
|
||||
this.$api.call(ApiPaabgabe.getTermine(this.selectedStudiengang, this.selectedAbgabetyp))
|
||||
.then(res => {
|
||||
this.termine = res?.data ?? []
|
||||
})
|
||||
},
|
||||
loadPaAbgaben() {
|
||||
this.$refs.loader.show();
|
||||
//~ const func =
|
||||
//~ this.personSearchString && this.personSearchString != ''
|
||||
//~ ? ApiPaabgabe.searchPaAbgabenByPerson(this.personSearchString)
|
||||
//~ : ApiPaabgabe.getPaAbgaben(this.selectedStudiengang, this.selectedAbgabetyp, this.selectedTermin);
|
||||
|
||||
this.$api.call(
|
||||
ApiPaabgabe.getPaAbgaben(this.selectedStudiengang, this.selectedAbgabetyp, this.selectedTermin, this.personSearchString)
|
||||
)
|
||||
.then(res => {
|
||||
this.$refs.loader.hide();
|
||||
this.setupData(res?.data ?? []);
|
||||
});
|
||||
},
|
||||
handleUuidDefined(uuid) {
|
||||
this.tabulatorUuid = uuid
|
||||
},
|
||||
searchPaAbgabenByPerson(){
|
||||
this.$api.call(ApiPaabgabe.getPaAbgaben(this.selectedStudiengang, this.selectedAbgabetyp, this.selectedTermin))
|
||||
.then(res => {
|
||||
this.setupData(res?.data ?? []);
|
||||
//this.abgaben = res?.data ?? []
|
||||
});
|
||||
},
|
||||
//~ setRoute(val) {
|
||||
//~ // TODO: router push
|
||||
//~ },
|
||||
async setupMounted() {
|
||||
this.tableBuiltPromise = new Promise(this.tableResolve);
|
||||
await this.tableBuiltPromise;
|
||||
|
||||
this.setNoDataPlaceholder();
|
||||
this.loadStudiengaenge();
|
||||
this.loadPaabgabeTypes();
|
||||
this.loadTermine();
|
||||
//this.loadPaAbgaben();
|
||||
|
||||
|
||||
//~ const tableID = this.tabulatorUuid ? ('-' + this.tabulatorUuid) : ''
|
||||
//~ const tableDataSet = document.getElementById('filterTableDataset' + tableID);
|
||||
//~ if(!tableDataSet) return
|
||||
//~ const rect = tableDataSet.getBoundingClientRect();
|
||||
|
||||
//~ const h = window.visualViewport.height - rect.top - 100
|
||||
//~ if(this.$refs.raumsucheTable) {
|
||||
//~ this.$refs.raumsucheTable.$refs.table.style.setProperty('height', h+'px')
|
||||
//~ }
|
||||
|
||||
},
|
||||
actionDownload(paabgabe_id) {
|
||||
//~ window.open(
|
||||
//~ FHC_JS_DATA_STORAGE_OBJECT.app_root
|
||||
//~ + FHC_JS_DATA_STORAGE_OBJECT.ci_router
|
||||
//~ +'/api/frontend/v1/education/paabgabe/downloadProjektarbeit?paabgabe_id=' + encodeURIComponent(paabgabe_id),
|
||||
//~ '_blank'
|
||||
//~ );
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
isDarkMode(){
|
||||
return this.$theme.theme_name.value == 'dark';
|
||||
},
|
||||
personSearchEnabled() {
|
||||
this.loadTermine();
|
||||
return this.selectedStudiengang == null && this.selectedTermin == null && this.selectedAbgabetyp == null;
|
||||
},
|
||||
abgabeSearchEnabled() {
|
||||
return this.personSearchString == '' || this.personSearchString == null;
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.phrasenPromise = this.$p.loadCategory(['abgabetool', 'global', 'person', 'ui']);
|
||||
this.phrasenPromise.then(()=> {this.phrasenResolved = true});
|
||||
},
|
||||
mounted() {
|
||||
this.setupMounted();
|
||||
},
|
||||
template: `
|
||||
<h1 class="h3">{{$p.t('abgabetool/projektabgabeUebersicht')}}</h1>
|
||||
<hr>
|
||||
<div class="row">
|
||||
|
||||
<div class="col-12 col-lg-2">
|
||||
<select
|
||||
ref="studiengang"
|
||||
id="studiengangSelect"
|
||||
v-model="selectedStudiengang"
|
||||
class="form-select"
|
||||
:aria-label="$p.t('abgabetool/studiengang_auswaehlen')"
|
||||
:disabled="!abgabeSearchEnabled"
|
||||
@change="loadTermine();"
|
||||
>
|
||||
<option :key="defaultStudiengang.studiengang_kz" selected :value="defaultStudiengang.studiengang_kz">{{defaultStudiengang.kuerzel}}</option>
|
||||
<option v-for="stg in studiengaenge" :key="stg.studiengang_kz" :value="stg.studiengang_kz">{{stg.kuerzel}}</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="col-12 col-lg-2">
|
||||
<select
|
||||
ref="abgabetyp"
|
||||
id="abgabetypSelect"
|
||||
v-model="selectedAbgabetyp"
|
||||
class="form-select"
|
||||
:aria-label="$p.t('abgabetool/termin_auswaehlen')"
|
||||
:disabled="!abgabeSearchEnabled"
|
||||
@change="loadTermine();"
|
||||
>
|
||||
<option :key="defaultTyp.paabgabetyp_kurzbz" selected :value="defaultTyp.paabgabetyp_kurzbz">{{defaultTyp.bezeichnung}}</option>
|
||||
<option v-for="typ in abgabetypen" :key="typ.paabgabetyp_kurzbz" :value="typ.paabgabetyp_kurzbz">{{typ.bezeichnung}}</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="col-12 col-lg-2">
|
||||
<select
|
||||
ref="termin"
|
||||
id="terminSelect"
|
||||
v-model="selectedTermin"
|
||||
class="form-select"
|
||||
:aria-label="$p.t('abgabetool/abgabetyp_auswaehlen')"
|
||||
:disabled="!abgabeSearchEnabled"
|
||||
>
|
||||
<option :key="defaultTermin.termin" selected :value="defaultTermin.termin">{{defaultTermin.termin_anzeige}}</option>
|
||||
<option v-for="termin in termine" :key="termin.termin" :value="termin.termin">{{termin.termin_anzeige}}</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="col-12 col-lg-2">
|
||||
<input
|
||||
type="text"
|
||||
name="person-search"
|
||||
class="form-control"
|
||||
:placeholder="$p.t('abgabetool/nach_person_suchen')"
|
||||
:disabled="!personSearchEnabled"
|
||||
v-on:keyup.enter="loadPaAbgaben"
|
||||
v-model="personSearchString"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="col-12 col-lg-2">
|
||||
<button class="btn btn-primary border-0" @click="loadPaAbgaben">{{ $p.t('abgabetool/anzeigen') }}</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<core-filter-cmpt
|
||||
v-if="phrasenResolved"
|
||||
@uuidDefined="handleUuidDefined"
|
||||
ref="paabgabeTable"
|
||||
:tabulator-options="paabgabeTableOptions"
|
||||
:tabulator-events="paabgabeTableEventHandlers"
|
||||
tableOnly
|
||||
:sideMenu="false"
|
||||
/>
|
||||
|
||||
<loader ref="loader" :timeout="0"></loader>
|
||||
`
|
||||
};
|
||||
|
||||
export default ProjektabgabeUebersicht;
|
||||
Reference in New Issue
Block a user