From 28e445440935e9de0fc5b4022e1458d199cd3a0a Mon Sep 17 00:00:00 2001 From: cgfhtw Date: Mon, 25 Nov 2024 11:20:44 +0100 Subject: [PATCH] Move Semester Filter to top component --- .../api/frontend/v1/stv/Grades.php | 4 +- ...dierendenantraglehrveranstaltung_model.php | 68 +++++++++++-------- public/js/api/stv/grades.js | 5 +- .../Stv/Studentenverwaltung/Details/Noten.js | 34 ++++++++-- .../Details/Noten/Teacher.js | 10 +-- .../Details/Noten/Zeugnis.js | 22 ++---- 6 files changed, 86 insertions(+), 57 deletions(-) diff --git a/application/controllers/api/frontend/v1/stv/Grades.php b/application/controllers/api/frontend/v1/stv/Grades.php index 990bbc113..284fadf9b 100644 --- a/application/controllers/api/frontend/v1/stv/Grades.php +++ b/application/controllers/api/frontend/v1/stv/Grades.php @@ -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); diff --git a/application/models/education/Studierendenantraglehrveranstaltung_model.php b/application/models/education/Studierendenantraglehrveranstaltung_model.php index 4318c773e..43083295d 100644 --- a/application/models/education/Studierendenantraglehrveranstaltung_model.php +++ b/application/models/education/Studierendenantraglehrveranstaltung_model.php @@ -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); } } diff --git a/public/js/api/stv/grades.js b/public/js/api/stv/grades.js index 8e3e00e28..efbb920c0 100644 --- a/public/js/api/stv/grades.js +++ b/public/js/api/stv/grades.js @@ -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); diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Noten.js b/public/js/components/Stv/Studentenverwaltung/Details/Noten.js index 1c00ef9d0..e7aae4c8c 100644 --- a/public/js/components/Stv/Studentenverwaltung/Details/Noten.js +++ b/public/js/components/Stv/Studentenverwaltung/Details/Noten.js @@ -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: ` -
+
+
+ +
- +
- + +
` diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Noten/Teacher.js b/public/js/components/Stv/Studentenverwaltung/Details/Noten/Teacher.js index f3c5223ba..c15381f88 100644 --- a/public/js/components/Stv/Studentenverwaltung/Details/Noten/Teacher.js +++ b/public/js/components/Stv/Studentenverwaltung/Details/Noten/Teacher.js @@ -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: ` -
+
+ { 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: `
Kein Student