mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-06-01 12:19:28 +00:00
Move Semester Filter to top component
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user