diff --git a/application/controllers/Cis/ProjektabgabeUebersicht.php b/application/controllers/Cis/ProjektabgabeUebersicht.php new file mode 100644 index 000000000..62c46dd5f --- /dev/null +++ b/application/controllers/Cis/ProjektabgabeUebersicht.php @@ -0,0 +1,36 @@ + ['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']); + } +} diff --git a/application/controllers/api/frontend/v1/education/PaabgabeUebersicht.php b/application/controllers/api/frontend/v1/education/PaabgabeUebersicht.php new file mode 100644 index 000000000..c00f5a411 --- /dev/null +++ b/application/controllers/api/frontend/v1/education/PaabgabeUebersicht.php @@ -0,0 +1,176 @@ + 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."); + //~ } + //~ } + //~ } +} diff --git a/application/models/education/Paabgabe_model.php b/application/models/education/Paabgabe_model.php index 343a86706..e5d5b6571 100644 --- a/application/models/education/Paabgabe_model.php +++ b/application/models/education/Paabgabe_model.php @@ -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); + //~ } } diff --git a/public/js/api/factory/paabgabeUebersicht.js b/public/js/api/factory/paabgabeUebersicht.js new file mode 100644 index 000000000..d11aad6bd --- /dev/null +++ b/public/js/api/factory/paabgabeUebersicht.js @@ -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' + }; + } +}; \ No newline at end of file diff --git a/public/js/apps/Dashboard/Fhc.js b/public/js/apps/Dashboard/Fhc.js index 093ad815b..9cd7573c1 100644 --- a/public/js/apps/Dashboard/Fhc.js +++ b/public/js/apps/Dashboard/Fhc.js @@ -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){ diff --git a/public/js/components/Cis/ProjektabgabeUebersicht/ProjektabgabeUebersicht.js b/public/js/components/Cis/ProjektabgabeUebersicht/ProjektabgabeUebersicht.js new file mode 100644 index 000000000..dcdc9bdc0 --- /dev/null +++ b/public/js/components/Cis/ProjektabgabeUebersicht/ProjektabgabeUebersicht.js @@ -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 = ''; + 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 = ''; + 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: ` +