Compare commits

...
Author SHA1 Message Date
Harald Bamberger 8f48bc4992 Merge branch 'master' into feature-82230/StudVW_Finetuning 2026-10-02 15:07:01 +02:00
Manuela Thamer 95c3354886 refactor GroupTab: enable set Verband and Gruppe to null
backend: validation, if no selection for entries verband, group and Sem is made
list students: drag and drop: reset verband and sem if not chosen
2026-09-03 14:53:37 +02:00
Manuela Thamer 8d58bef718 refactor functions isJgv and getPrestudentsOfJgv
#
2026-08-27 12:30:50 +02:00
6 changed files with 91 additions and 25 deletions
@@ -215,6 +215,17 @@ class Student extends FHCAPI_Controller
] ]
); );
$this->form_validation->set_rules('verband', 'Verband', 'callback_validateDropdown', [
'validateDropdown' => $this->p->t('ui', 'error_fieldRequired', ['dropdown' => 'Verband'])
]);
$this->form_validation->set_rules('semester', 'Semester', 'callback_validateDropdown', [
'validateDropdown' => $this->p->t('ui', 'error_fieldRequired', ['dropdown' => 'Semester'])
]);
$this->form_validation->set_rules('gruppe', 'Gruppe', 'callback_validateDropdown', [
'validateDropdown' => $this->p->t('ui', 'error_fieldRequired', ['dropdown' => 'Gruppe'])
]);
$this->form_validation->set_rules('alias', 'Alias', 'regex_match[/^[-a-z0-9\_\.]*[a-z0-9]{1,}\.[-a-z0-9\_]{1,}$/]', $this->form_validation->set_rules('alias', 'Alias', 'regex_match[/^[-a-z0-9\_\.]*[a-z0-9]{1,}\.[-a-z0-9\_]{1,}$/]',
[ [
'regex_match' => $this->p->t('ui', 'error_fieldInvalidAlias') 'regex_match' => $this->p->t('ui', 'error_fieldInvalidAlias')
@@ -790,6 +801,13 @@ class Student extends FHCAPI_Controller
return !!$value; return !!$value;
} }
public function validateDropdown($value)
{
if ($value === false || $value === 'false')
return false;
return true;
}
/** /**
* Validates input data. Terminates with validation errors, if invalid. * Validates input data. Terminates with validation errors, if invalid.
*/ */
@@ -360,7 +360,8 @@ class Benutzerfunktion_model extends DB_Model
SELECT DISTINCT ps.prestudent_id, bf.datum_von, bf.datum_bis SELECT DISTINCT ps.prestudent_id, bf.datum_von, bf.datum_bis
FROM public.tbl_benutzerfunktion bf FROM public.tbl_benutzerfunktion bf
JOIN public.tbl_benutzer bn USING (uid) JOIN public.tbl_benutzer bn USING (uid)
JOIN public.tbl_prestudent ps USING (person_id) JOIN public.tbl_student stud ON (stud.student_uid = bn.uid)
JOIN public.tbl_prestudent ps USING (prestudent_id)
JOIN public.tbl_prestudentstatus pss ON (ps.prestudent_id = pss.prestudent_id) JOIN public.tbl_prestudentstatus pss ON (ps.prestudent_id = pss.prestudent_id)
JOIN public.tbl_studiensemester ss ON (pss.studiensemester_kurzbz = ss.studiensemester_kurzbz) JOIN public.tbl_studiensemester ss ON (pss.studiensemester_kurzbz = ss.studiensemester_kurzbz)
WHERE ss.studiensemester_kurzbz = ? WHERE ss.studiensemester_kurzbz = ?
@@ -387,10 +388,11 @@ class Benutzerfunktion_model extends DB_Model
public function isJgv($semester, $prestudent_id) public function isJgv($semester, $prestudent_id)
{ {
$query = " $query = "
SELECT ps.prestudent_id, ss.start as von, ss.ende as bis SELECT DISTINCT ps.prestudent_id, bf.datum_von, bf.datum_bis
FROM public.tbl_benutzerfunktion bf FROM public.tbl_benutzerfunktion bf
JOIN public.tbl_benutzer bn USING (uid) JOIN public.tbl_benutzer bn USING (uid)
JOIN public.tbl_prestudent ps USING (person_id) JOIN public.tbl_student stud ON (stud.student_uid = bn.uid)
JOIN public.tbl_prestudent ps USING (prestudent_id)
JOIN public.tbl_prestudentstatus pss ON (ps.prestudent_id = pss.prestudent_id) JOIN public.tbl_prestudentstatus pss ON (ps.prestudent_id = pss.prestudent_id)
JOIN public.tbl_studiensemester ss ON (pss.studiensemester_kurzbz = ss.studiensemester_kurzbz) JOIN public.tbl_studiensemester ss ON (pss.studiensemester_kurzbz = ss.studiensemester_kurzbz)
WHERE ss.studiensemester_kurzbz = ? WHERE ss.studiensemester_kurzbz = ?
@@ -115,11 +115,31 @@ export default {
this.$refs.newGroupModal.show() this.$refs.newGroupModal.show()
}, },
changeLvb(params) { changeLvb(params) {
let data = { semester: params.semester }; let data = {
if (params.verband && params.verband != " ") { semester: params.semester,
data.verband = params.verband; verband: params.verband,
if (params.gruppe && params.gruppe != " ") gruppe: params.gruppe
data.gruppe = params.gruppe; };
if (params.verband == null)
{
data.verband = "";
if (params.gruppe == null)
data.gruppe = "";
}
const dropdowns = {
semester: this.$p.t('lehre/semester'),
verband: this.$p.t('lehre/verband'),
gruppe: this.$p.t('lehre/gruppe')
};
for (const [key, label] of Object.entries(dropdowns)) {
if (params[key] === false) {
this.$fhcAlert.alertError(
this.$p.t('ui/alert_chooseEntry', { dropdown: label })
);
return;
}
} }
let endpoint; let endpoint;
@@ -17,8 +17,8 @@ export default {
return { return {
lvbList: [], lvbList: [],
selectedSemester: false, selectedSemester: false,
selectedVerband: false, selectedVerband: undefined, //to distinguish from null and false
selectedGruppe: false selectedGruppe: undefined //to distinguish from null and false
}; };
}, },
computed: { computed: {
@@ -63,11 +63,10 @@ export default {
get() { get() {
if (this.semester === false) if (this.semester === false)
return false; return false;
if (this.selectedVerband !== false) {
if (this.lvbListVerband.some(item => item.verband == this.selectedVerband)) if (this.selectedVerband !== undefined)
return this.selectedVerband; return this.selectedVerband;
return false;
}
if (Array.isArray(this.students)) { if (Array.isArray(this.students)) {
const first = this.students.find(Boolean); const first = this.students.find(Boolean);
if (this.lvbListVerband.every(item => item.verband != first.verband)) if (this.lvbListVerband.every(item => item.verband != first.verband))
@@ -86,13 +85,11 @@ export default {
}, },
gruppe: { gruppe: {
get() { get() {
if (this.verband === false) if (this.verband === false || this.verband === null)
return false; return null;
if (this.selectedGruppe !== false) { if (this.selectedGruppe !== undefined)
if (this.lvbListGruppe.some(item => item.gruppe == this.selectedGruppe)) return this.selectedGruppe;
return this.selectedGruppe;
return false;
}
if (Array.isArray(this.students)) { if (Array.isArray(this.students)) {
const first = this.students.find(Boolean); const first = this.students.find(Boolean);
if (this.lvbListGruppe.every(item => item.gruppe != first.gruppe)) if (this.lvbListGruppe.every(item => item.gruppe != first.gruppe))
@@ -195,6 +192,7 @@ export default {
v-model="semester" v-model="semester"
class="form-select" class="form-select"
> >
<option :value="false" disabled> -- {{ $p.t('exam/keineAuswahl') }} -- </option>
<option v-for="semester in stgSemester">{{ semester }}</option> <option v-for="semester in stgSemester">{{ semester }}</option>
</select> </select>
<span <span
@@ -208,25 +206,27 @@ export default {
class="form-select" class="form-select"
:disabled="semester === false" :disabled="semester === false"
> >
<option :value="false" disabled> -- {{ $p.t('exam/keineAuswahl') }} -- </option>
<option v-for="verband in semesterVerband">{{ verband }}</option> <option v-for="verband in semesterVerband">{{ verband }}</option>
<option :value="null"></option>
</select> </select>
<span <span
class="input-group-text" class="input-group-text"
:class="{'text-muted': verband === false}"
> >
{{ $p.t('lehre/gruppe') }} {{ $p.t('lehre/gruppe') }}
</span> </span>
<select <select
v-model="gruppe" v-model="gruppe"
class="form-select" class="form-select"
:disabled="verband === false"
> >
<option :value="false" disabled> -- {{ $p.t('exam/keineAuswahl') }} -- </option>
<option v-for="gruppe in verbandGruppe">{{ gruppe }}</option> <option v-for="gruppe in verbandGruppe">{{ gruppe }}</option>
<option :value="null"></option>
</select> </select>
<button <button
type="submit" type="submit"
class="btn btn-primary" class="btn btn-primary"
:disabled="gruppe === false && verband === false"
> >
{{ $p.t('ui/change') }} {{ $p.t('ui/change') }}
</button> </button>
@@ -65,6 +65,12 @@ export default {
} else { } else {
const { semester, verband, gruppe } = drop; const { semester, verband, gruppe } = drop;
const params = { semester, verband, gruppe }; const params = { semester, verband, gruppe };
//if the student is dragged into a parent category (eg.BEL-1), reset verband, gruppe to ""
if (!params.verband)
params.verband = "";
if (!params.gruppe)
params.gruppe = "";
endpoint = drag.map(student => [ endpoint = drag.map(student => [
this.getStudentAjaxId(student), this.getStudentAjaxId(student),
ApiStvDetails.saveStudent( ApiStvDetails.saveStudent(
+20
View File
@@ -62551,6 +62551,26 @@ I have been informed that I am under no obligation to consent to the transmissio
) )
) )
), ),
array(
'app' => 'core',
'category' => 'ui',
'phrase' => 'alert_chooseEntry',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Bitte einen Wert aus dem DropDown {dropdown} wählen!',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Please select a value of dropdown {dropdown}!',
'description' => '',
'insertvon' => 'system'
)
)
),
array( array(
'app' => 'core', 'app' => 'core',
'category' => 'lehre', 'category' => 'lehre',