Move Semester Filter to top component

This commit is contained in:
cgfhtw
2024-11-25 11:20:44 +01:00
parent 334fc870d0
commit 28e4454409
6 changed files with 86 additions and 57 deletions
@@ -113,11 +113,11 @@ class Grades extends FHCAPI_Controller
$this->terminateWithSuccess($grades);
}
public function getRepeaterGrades($prestudent_id)
public function getRepeaterGrades($prestudent_id, $all = null)
{
$this->load->library('AntragLib');
$studiensemester_kurzbz = $this->variablelib->getVar('semester_aktuell');
$studiensemester_kurzbz = ($all === null) ? $this->variablelib->getVar('semester_aktuell') : false;
$result = $this->antraglib->getLvsForPrestudent($prestudent_id, $studiensemester_kurzbz);
@@ -66,39 +66,53 @@ class Studierendenantraglehrveranstaltung_model extends DB_Model
);
$this->addJoin('public.tbl_student s', 'prestudent_id');
// NOTE(chris): last offizell note
$this->addJoin('(
SELECT z.*
FROM lehre.tbl_zeugnisnote z
LEFT JOIN public.tbl_studiensemester zs
USING(studiensemester_kurzbz)
JOIN (
SELECT zi.lehrveranstaltung_id, zi.student_uid, MAX(zis.start) AS start
FROM lehre.tbl_zeugnisnote zi
LEFT JOIN lehre.tbl_note zin
USING(note)
LEFT JOIN public.tbl_studiensemester zis
USING(studiensemester_kurzbz)
WHERE zin.aktiv AND zin.offiziell
GROUP BY zi.lehrveranstaltung_id, zi.student_uid
) zx
ON (
z.lehrveranstaltung_id=zx.lehrveranstaltung_id
AND z.student_uid=zx.student_uid
AND zs.start = zx.start
)) z', 'z.lehrveranstaltung_id=lv.lehrveranstaltung_id AND z.student_uid=s.student_uid', 'LEFT');
$this->addJoin('lehre.tbl_note zn', 'z.note = zn.note', 'LEFT');
$this->load->config('studierendenantrag');
$note_intern_angerechntet = $this->config->item('wiederholung_note_angerechnet');
return $this->loadWhere([
$where = [
'ps.prestudent_id' => $prestudent_id,
'a.typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG,
'stat.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED,
'n.note <> ' => 0,
$this->dbTable . '.studiensemester_kurzbz' => $studiensemester_kurzbz,
'(n.note<>' . $this->db->escape($note_intern_angerechntet) . ' OR (z.note IS NOT NULL AND zn.positiv))' => null
]);
// NOTE(chris): grade "intern angerechnet" needs an official grade beforehand (the subquery gets the last positive offical grade)
"(n.note<>" . $this->db->escape($note_intern_angerechntet) . " OR EXISTS (
SELECT
1
FROM
lehre.tbl_zeugnisnote z
LEFT JOIN public.tbl_studiensemester zs USING(studiensemester_kurzbz)
JOIN (
SELECT
zi.lehrveranstaltung_id,
zi.student_uid,
MAX(zis.start) AS start
FROM
lehre.tbl_zeugnisnote zi
LEFT JOIN lehre.tbl_note zin USING(note)
LEFT JOIN public.tbl_studiensemester zis USING(studiensemester_kurzbz)
WHERE
zin.aktiv
AND zin.offiziell
GROUP BY
zi.lehrveranstaltung_id,
zi.student_uid
) zx ON (
z.lehrveranstaltung_id = zx.lehrveranstaltung_id
AND z.student_uid = zx.student_uid
AND zs.start = zx.start
)
JOIN lehre.tbl_note zn USING (note)
WHERE
z.lehrveranstaltung_id = lv.lehrveranstaltung_id
AND z.student_uid = s.student_uid
AND zn.positiv
))" => null
];
if ($studiensemester_kurzbz !== false)
$where[$this->dbTable . '.studiensemester_kurzbz'] = $studiensemester_kurzbz;
return $this->loadWhere($where);
}
}
+3 -2
View File
@@ -10,8 +10,9 @@ export default {
all = all ? '/all' : '';
return this.$fhcApi.get('api/frontend/v1/stv/grades/getTeacherProposal/' + prestudent_id + all);
},
getRepeaterGrades(prestudent_id) {
return this.$fhcApi.get('api/frontend/v1/stv/grades/getRepeaterGrades/' + prestudent_id);
getRepeaterGrades(prestudent_id, all) {
all = all ? '/all' : '';
return this.$fhcApi.get('api/frontend/v1/stv/grades/getRepeaterGrades/' + prestudent_id + all);
},
updateCertificate(data) {
return this.$fhcApi.post('api/frontend/v1/stv/grades/updateCertificate', data);
@@ -1,27 +1,53 @@
import NotenZeugnis from './Noten/Zeugnis.js';
import NotenTeacher from './Noten/Teacher.js';
import NotenRepeater from './Noten/Repeater.js';
const LOCAL_STORAGE_ID = 'stv_details_noten_2024-11-25_stdsem_all';
export default {
components: {
NotenZeugnis,
NotenTeacher
NotenTeacher,
NotenRepeater
},
props: {
modelValue: Object
},
data() {
return {
stdsem: ''
};
},
methods: {
reload() {
this.$refs.zeugnis.$refs.table.reloadTable();
this.$refs.teacher.$refs.table.reloadTable();
this.$refs.repeater.$refs.table.reloadTable();
},
saveStdsem(event) {
window.localStorage.setItem(LOCAL_STORAGE_ID, event.target.value);
}
},
created() {
const savedPath = window.localStorage.getItem(LOCAL_STORAGE_ID);
this.stdsem = savedPath || '';
},
// TODO(chris): phrasen
template: `
<div class="stv-details-noten h-100 d-flex flex-column overflow-hidden">
<div class="stv-details-noten d-flex flex-column overflow-hidden">
<div class="mb-3">
<select class="form-select" v-model="stdsem" @input="saveStdsem">
<option value="">Aktuelles Semester</option>
<option value="true">Alle Semester</option>
</select>
</div>
<div class="row">
<div class="col-8">
<noten-zeugnis ref="zeugnis" :student="modelValue"></noten-zeugnis>
<noten-zeugnis ref="zeugnis" :student="modelValue" :all-semester="!!stdsem"></noten-zeugnis>
</div>
<div class="col-4">
<noten-teacher ref="teacher" :student="modelValue" @copied="reload"></noten-teacher>
<noten-teacher ref="teacher" :student="modelValue" :all-semester="!!stdsem" @copied="reload"></noten-teacher>
<noten-repeater class="mt-4" ref="repeater" :student="modelValue" :all-semester="!!stdsem" @copied="reload"></noten-repeater>
</div>
</div>
</div>`
@@ -9,7 +9,7 @@ export default {
],
props: {
student: Object,
stdsem: String
allSemester: Boolean
},
data() {
return {
@@ -26,7 +26,7 @@ export default {
ajaxParams: () => {
return {
prestudent_id: this.student.prestudent_id,
stdsem: this.stdsem
stdsem: this.allSemester
};
},
ajaxResponse: (url, params, response) => {
@@ -57,7 +57,7 @@ export default {
student(n) {
this.$refs.table.reloadTable();
},
stdsem(n) {
allSemester(n) {
this.$refs.table.reloadTable();
}
},
@@ -82,9 +82,11 @@ export default {
}
},
template: `
<div class="stv-details-noten-teacher h-100 d-flex flex-column">
<div class="stv-details-noten-teacher d-flex flex-column">
<!-- TODO(chris): phrase -->
<core-filter-cmpt
ref="table"
title="Teacher Proposals"
:tabulator-options="tabulatorOptions"
:tabulator-events="tabulatorEvents"
table-only
@@ -1,15 +1,14 @@
import {CoreFilterCmpt} from "../../../../filter/Filter.js";
import ZeugnisActions from './Zeugnis/Actions.js';
const LOCAL_STORAGE_ID = 'stv_details_noten_zeugnis_2024-01-11_stdsem_all';
export default {
components: {
CoreFilterCmpt,
ZeugnisActions
},
props: {
student: Object
student: Object,
allSemester: Boolean
},
data() {
return {
@@ -28,7 +27,7 @@ export default {
ajaxParams: () => {
return {
prestudent_id: this.student.prestudent_id,
stdsem: this.stdsem
stdsem: this.allSemester
};
},
ajaxResponse: (url, params, response) => {
@@ -71,7 +70,7 @@ export default {
student(n) {
this.$refs.table.reloadTable();
},
stdsem(n) {
allSemester(n) {
this.$refs.table.reloadTable();
}
},
@@ -81,26 +80,13 @@ export default {
.stv.grades.updateCertificate(selected)
.then(this.$refs.table.reloadTable)
.catch(this.$fhcAlert.handleFormValidation);
},
saveStdsem(event) {
window.localStorage.setItem(LOCAL_STORAGE_ID, event.target.value ? 'true' : '');
}
},
created() {
const savedPath = window.localStorage.getItem(LOCAL_STORAGE_ID);
this.stdsem = savedPath ? '/all' : '';
},
// TODO(chris): phrasen
template: `
<div class="stv-details-noten-zeugnis h-100 d-flex flex-column">
<div v-if="!validStudent">Kein Student</div>
<template v-else>
<div class="mb-3">
<select class="form-select" v-model="stdsem" @input="saveStdsem">
<option value="">Aktuelles Semester</option>
<option value="/all">Alle Semester</option>
</select>
</div>
<core-filter-cmpt
ref="table"
:tabulator-options="tabulatorOptions"