diff --git a/application/config/stv.php b/application/config/stv.php
index e03c00084..84b148362 100644
--- a/application/config/stv.php
+++ b/application/config/stv.php
@@ -61,7 +61,11 @@ $config['tabs'] =
'notes' => [
//if true, the count of Messages will be shown in the header of the Tab Messages
'showCountNotes' => true
- ]
+ ],
+ 'combinePeople' => [
+ //multitab should only be shown with this length of selection
+ 'validCountMulti' => 2,
+ ],
];
// List of fields to show when ZGV_DOKTOR_ANZEIGEN is defined
@@ -117,5 +121,6 @@ $config['students_tab_order'] = [
'status',
'groups',
'finalexam',
+ 'combinePeople',
'archive',
];
diff --git a/application/controllers/api/frontend/v1/stv/Config.php b/application/controllers/api/frontend/v1/stv/Config.php
index 97d626246..922c6a8e7 100644
--- a/application/controllers/api/frontend/v1/stv/Config.php
+++ b/application/controllers/api/frontend/v1/stv/Config.php
@@ -406,6 +406,11 @@ class Config extends FHCAPI_Controller
'showEdit' => $this->permissionlib->isBerechtigt('admin')
]
];
+ $result['combinePeople'] = [
+ 'title' => $this->p->t('stv', 'tab_combine_people'),
+ 'component' => './Stv/Studentenverwaltung/Details/CombinePeople.js',
+ 'config' => $config['combinePeople']
+ ];
$result['kontaktieren'] = [
'title' => $this->p->t('stv', 'tab_kontaktieren'),
diff --git a/application/controllers/api/frontend/v1/stv/Students.php b/application/controllers/api/frontend/v1/stv/Students.php
index 12440f036..9dbea65f2 100644
--- a/application/controllers/api/frontend/v1/stv/Students.php
+++ b/application/controllers/api/frontend/v1/stv/Students.php
@@ -765,6 +765,86 @@ class Students extends FHCAPI_Controller
$this->terminateWithSuccess($data);
}
+ /**
+ * @param string $studiensemester_kurzbz
+ *
+ * @return void
+ */
+ public function search($studiensemester_kurzbz)
+ {
+ $this->addMeta('ci_method', __FUNCTION__);
+ $this->addMeta('ci_params', array(
+ 'studiensemester_kurzbz' => $studiensemester_kurzbz
+ ));
+
+ $this->load->library('SearchLib', [ 'config' => 'searchstv' ]);
+ $this->load->library('form_validation');
+
+ $this->form_validation->set_rules('searchstr', 'searchstr', 'required');
+ $this->form_validation->set_rules('types[]', 'types', 'required');
+
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $result = $this->searchlib->search($this->input->post('searchstr'), $this->input->post('types'));
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+
+ $this->load->model('crm/Prestudent_model', 'PrestudentModel');
+
+ $this->prepareQuery($studiensemester_kurzbz);
+
+ $this->PrestudentModel->addSelect("COALESCE(v.semester::text, CASE WHEN public.get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL) IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent') THEN public.get_absem_prestudent(tbl_prestudent.prestudent_id, NULL)::text ELSE ''::text END) AS semester", false);
+ $this->PrestudentModel->addSelect('v.verband');
+ $this->PrestudentModel->addSelect('v.gruppe');
+
+ //add status per semester
+ $this->PrestudentModel->addSelect(
+ "(
+ SELECT status_kurzbz
+ FROM public.tbl_prestudentstatus pss
+ WHERE pss.prestudent_id = public.tbl_prestudent.prestudent_id
+ AND pss.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
+ ORDER BY GREATEST(pss.datum, '0001-01-01') DESC
+ LIMIT 1
+ ) AS statusofsemester"
+ );
+
+ $this->addSelectPrioRel();
+
+ $this->addFilter($studiensemester_kurzbz);
+
+ $prestudent_ids = [];
+ $student_uids = [];
+ $this->addMeta('data', $data);
+ foreach ($data as $row) {
+ $dataset = json_decode($row->data);
+ if ($row->type == 'prestudent') {
+ $prestudent_ids[] = $dataset->prestudent_id;
+ } elseif ($row->type == 'student') {
+ $student_uids[] = $dataset->uid;
+ }
+ }
+
+ if ($prestudent_ids && $student_uids) {
+ $this->PrestudentModel->db->where_in('tbl_prestudent.prestudent_id', $prestudent_ids);
+ $this->PrestudentModel->db->or_where_in('s.student_uid', $student_uids);
+ } elseif ($prestudent_ids) {
+ $this->PrestudentModel->db->where_in('tbl_prestudent.prestudent_id', $prestudent_ids);
+ } elseif ($student_uids) {
+ $this->PrestudentModel->db->where_in('s.student_uid', $student_uids);
+ } else {
+ $this->terminateWithSuccess([]);
+ }
+
+ $result = $this->PrestudentModel->load();
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
+ }
+
/**
* @param string|null $studiensemester_kurzbz
* @param string $type
diff --git a/public/js/api/factory/stv/students.js b/public/js/api/factory/stv/students.js
index 07d4453d8..cae2f31b2 100644
--- a/public/js/api/factory/stv/students.js
+++ b/public/js/api/factory/stv/students.js
@@ -46,6 +46,14 @@ export default {
url: url
};
},
+ search(params, studiensemester_kurzbz) {
+ return {
+ method: 'post',
+ url: 'api/frontend/v1/stv/students/search/'
+ + encodeURIComponent(studiensemester_kurzbz),
+ params
+ };
+ },
verband(relative_path) {
return {
method: 'get',
diff --git a/public/js/apps/Studentenverwaltung.js b/public/js/apps/Studentenverwaltung.js
index 5eda16dd6..e6f77d5f5 100644
--- a/public/js/apps/Studentenverwaltung.js
+++ b/public/js/apps/Studentenverwaltung.js
@@ -148,6 +148,44 @@ const router = VueRouter.createRouter({
next();
}
},
+ {
+ name: 'search',
+ path: `/${ciPath}/studentenverwaltung/:studiensemester_kurzbz/search/:searchstr`,
+ component: FhcStudentenverwaltung,
+ props(route) {
+ return {
+ url_studiensemester_kurzbz: route.params.studiensemester_kurzbz,
+ url_mode: 'search',
+ url_prestudent_id: route.params.searchstr
+ };
+ },
+ beforeEnter(to, from, next) {
+ const isSemester = /^[WS]S\d{4}$/.test(to.params.studiensemester_kurzbz);
+ if (!isSemester) {
+ return next({name: 'index'});
+ }
+ next();
+ }
+ },
+ {
+ name: 'search_w_types',
+ path: `/${ciPath}/studentenverwaltung/:studiensemester_kurzbz/search/:types/:searchstr`,
+ component: FhcStudentenverwaltung,
+ props(route) {
+ return {
+ url_studiensemester_kurzbz: route.params.studiensemester_kurzbz,
+ url_mode: 'search',
+ url_prestudent_id: route.params.type + '/' + route.params.searchstr
+ };
+ },
+ beforeEnter(to, from, next) {
+ const isSemester = /^[WS]S\d{4}$/.test(to.params.studiensemester_kurzbz);
+ if (!isSemester) {
+ return next({name: 'index'});
+ }
+ next();
+ }
+ },
{
path: '/:pathMatch(.*)*',
redirect: {
diff --git a/public/js/components/Stv/Studentenverwaltung.js b/public/js/components/Stv/Studentenverwaltung.js
index a1e38875d..fc0430454 100644
--- a/public/js/components/Stv/Studentenverwaltung.js
+++ b/public/js/components/Stv/Studentenverwaltung.js
@@ -146,6 +146,9 @@ export default {
},
'url_mode': function () {
this.handlePersonUrl();
+ },
+ url_prestudent_id() {
+ this.handlePersonUrl();
}
},
methods: {
@@ -159,7 +162,7 @@ export default {
}
},
buildPrestudentSearchResultLink(data) {
- return this.$fhcApi.getUri(
+ return this.$api.getUri(
'/studentenverwaltung'
+ '/' + this.studiensemesterKurzbz
+ '/prestudent/'
@@ -167,7 +170,7 @@ export default {
);
},
buildStudentSearchResultLink(data) {
- return this.$fhcApi.getUri(
+ return this.$api.getUri(
'/studentenverwaltung'
+ '/' + this.studiensemesterKurzbz
+ '/student/'
@@ -175,7 +178,7 @@ export default {
);
},
buildPersonSearchResultLink(data) {
- return this.$fhcApi.getUri(
+ return this.$api.getUri(
'/studentenverwaltung'
+ '/' + this.studiensemesterKurzbz
+ '/person/'
@@ -249,6 +252,21 @@ export default {
ApiStv.students.person(this.$route.params.person_id, 'CURRENT_SEMESTER'),
true
);
+ } else if (this.$route.params.searchstr) {
+ const searchsettings = {
+ searchstr: this.$route.params.searchstr,
+ types: this.$route.params.types?.split('+') || []
+ };
+
+ // init into student list
+ this.$refs.stvList.updateUrl(
+ ApiStv.students.search(searchsettings, this.studiensemesterKurzbz)
+ );
+
+ // init into searchbar
+ this.$refs.searchbar.searchsettings.searchstr = searchsettings.searchstr;
+ this.$refs.searchbar.searchsettings.types = searchsettings.types;
+ this.$nextTick(this.blurSearchbar);
}
},
checkUrlStudiengang() {
@@ -269,6 +287,36 @@ export default {
});
}
}
+ },
+ onSearch(e) {
+ const searchsettings = { ...this.$refs.searchbar.searchsettings };
+ if (searchsettings.searchstr.length >= 2) {
+ this.blurSearchbar();
+
+ if (!searchsettings.types.length || searchsettings.types.length == this.$refs.searchbar.types.length) {
+ this.$router.push({
+ name: 'search',
+ params: {
+ studiensemester_kurzbz: this.studiensemesterKurzbz,
+ searchstr: searchsettings.searchstr
+ }
+ });
+ } else {
+ this.$router.push({
+ name: 'search_w_types',
+ params: {
+ studiensemester_kurzbz: this.studiensemesterKurzbz,
+ searchstr: searchsettings.searchstr,
+ types: searchsettings.types.join('+')
+ }
+ });
+ }
+ }
+ },
+ blurSearchbar() {
+ this.$refs.searchbar.$refs.input.blur();
+ this.$refs.searchbar.abort();
+ this.$refs.searchbar.hideresult();
}
},
created() {
@@ -376,9 +424,12 @@ export default {
{{$p.t('stv', 'question_combine_people', { person1: detailStringPerson1, person2: detailStringPerson2 })}}
+ +