CIS4: added Projektabgabe Uebersicht, enabled filtering by Abgabe data and person data

This commit is contained in:
Alexei Karpenko
2025-11-03 15:49:31 +01:00
parent b7ba740a3a
commit 601c6c53e7
6 changed files with 770 additions and 12 deletions
@@ -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.");
//~ }
//~ }
//~ }
}
+194 -1
View File
@@ -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'
};
}
};
+18 -11
View File
@@ -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('&amp;', '&'),
//~ 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;