From 0f43e8eb7aea87235c8b22dfc0d191d19f0b4691 Mon Sep 17 00:00:00 2001 From: ma0048 Date: Wed, 24 Sep 2025 14:27:01 +0200 Subject: [PATCH] autocomplete auf backend umgestellt textarea formattedAnmerkung rausgenommen ui angepasst --- .../controllers/api/frontend/v1/lv/Gruppe.php | 70 +++++- .../controllers/api/frontend/v1/lv/Lektor.php | 26 ++- .../controllers/api/frontend/v1/lv/Tags.php | 2 +- application/libraries/LektorLib.php | 12 +- .../education/Lehreinheitgruppe_model.php | 4 +- public/js/api/lehrveranstaltung/gruppe.js | 10 +- public/js/api/lehrveranstaltung/lektor.js | 5 +- .../LVVerwaltung/Details/Direktinskription.js | 44 ++-- .../components/LVVerwaltung/Details/Form.js | 12 +- .../LVVerwaltung/Details/Gruppen.js | 50 +++-- .../components/LVVerwaltung/LVVerwaltung.js | 49 +++-- .../components/LVVerwaltung/Lektor/Daten.js | 89 +++++--- .../components/LVVerwaltung/Lektor/Table.js | 44 ++-- .../components/LVVerwaltung/Lektor/Vertrag.js | 57 ++--- .../js/components/LVVerwaltung/Setup/Table.js | 4 +- .../Stv/Studentenverwaltung/Verband.js | 3 + system/phrasesupdate.php | 200 ++++++++++++++++++ 17 files changed, 509 insertions(+), 172 deletions(-) diff --git a/application/controllers/api/frontend/v1/lv/Gruppe.php b/application/controllers/api/frontend/v1/lv/Gruppe.php index 83a4fb696..a573c3ea3 100644 --- a/application/controllers/api/frontend/v1/lv/Gruppe.php +++ b/application/controllers/api/frontend/v1/lv/Gruppe.php @@ -12,8 +12,8 @@ class Gruppe extends FHCAPI_Controller 'add' => ['admin:rw', 'assistenz:rw'], 'delete' => ['admin:rw', 'assistenz:rw'], 'deleteFromLVPlan' => ['admin:rw', 'assistenz:rw'], - 'getBenutzer' => ['admin:r', 'assistenz:r'], - 'getAll' => ['admin:r', 'assistenz:r'], + 'getBenutzerSearch' => ['admin:r', 'assistenz:r'], + 'getAllSearch' => ['admin:r', 'assistenz:r'], 'getByLehreinheit' => ['admin:r', 'assistenz:r'], ]); @@ -22,7 +22,8 @@ class Gruppe extends FHCAPI_Controller $this->_ci->load->library('PhrasesLib'); $this->loadPhrases( array( - 'ui' + 'ui', + 'lehre' ) ); @@ -91,11 +92,11 @@ class Gruppe extends FHCAPI_Controller $lehreinheitgruppe_id = $this->input->post('lehreinheitgruppe_id'); if (is_null($lehreinheit_id) || !ctype_digit((string)$lehreinheit_id) || is_null($lehreinheitgruppe_id) || !ctype_digit((string)$lehreinheitgruppe_id)) - $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); $lehreinheitgruppe_result = $this->_ci->LehreinheitgruppeModel->loadWhere(array('lehreinheitgruppe_id' => $lehreinheitgruppe_id)); if (!hasData($lehreinheitgruppe_result) || isError($lehreinheitgruppe_result)) - $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); $this->checkPermission($lehreinheit_id); @@ -108,15 +109,30 @@ class Gruppe extends FHCAPI_Controller } - public function getAll() + public function getAllSearch($query = null) { + if (is_null($query)) + $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + $query_words = explode(' ', urldecode($query)); + $this->_ci->GruppeModel->addSelect('gruppe_kurzbz, studiengang_kz, semester, bezeichnung, gid, \'false\' as lehrverband'); - $gruppen_result = $this->_ci->GruppeModel->loadWhere(array('sichtbar' => true, 'aktiv' => true, 'lehre' => true, 'direktinskription' => false, 'semester IS NOT NULL' => null)); + $this->_ci->GruppeModel->db->where(array('sichtbar' => true, 'aktiv' => true, 'lehre' => true, 'direktinskription' => false, 'semester IS NOT NULL' => null)); + $this->_ci->GruppeModel->db->group_start(); + foreach ($query_words as $word) + { + $this->_ci->GruppeModel->db->group_start(); + $this->_ci->GruppeModel->db->where('gruppe_kurzbz ILIKE', "%" . $word . "%"); + $this->_ci->GruppeModel->db->or_where('bezeichnung ILIKE', "%" . $word . "%"); + $this->_ci->GruppeModel->db->group_end(); + } + $this->_ci->GruppeModel->db->group_end(); + + $gruppen_result = $this->_ci->GruppeModel->load(); $gruppen_array = array(); @@ -135,7 +151,18 @@ class Gruppe extends FHCAPI_Controller $this->_ci->LehrverbandModel->addJoin('public.tbl_studiengang', 'studiengang_kz'); $this->_ci->LehrverbandModel->addOrder('verband'); $this->_ci->LehrverbandModel->addOrder('gruppe'); - $lehrverband_result = $this->_ci->LehrverbandModel->loadWhere(array('tbl_lehrverband.aktiv' => true)); + $this->_ci->LehrverbandModel->db->where(array('tbl_lehrverband.aktiv' => true)); + + $this->_ci->LehrverbandModel->db->group_start(); + foreach ($query_words as $word) + { + $this->_ci->LehrverbandModel->db->group_start(); + $this->_ci->LehrverbandModel->db->where('CONCAT(CONCAT(typ, kurzbz), \'\', semester, verband, COALESCE(gruppe,\'\')) ILIKE', "%" . $word . "%"); + $this->_ci->LehrverbandModel->db->or_where('tbl_lehrverband.bezeichnung ILIKE', "%" . $word . "%"); + $this->_ci->LehrverbandModel->db->group_end(); + } + $this->_ci->LehrverbandModel->db->group_end(); + $lehrverband_result = $this->_ci->LehrverbandModel->load(); $lehrverband_array = array(); @@ -150,15 +177,38 @@ class Gruppe extends FHCAPI_Controller $this->terminateWithSuccess($all_gruppen); } - public function getBenutzer() + public function getBenutzerSearch($query = null) { + if (is_null($query)) + $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + $query_words = explode(' ', urldecode($query)); + $this->_ci->PersonModel->addSelect('vorname, nachname, uid, semester, UPPER(CONCAT(tbl_studiengang.typ, tbl_studiengang.kurzbz)) as studiengang'); $this->_ci->PersonModel->addJoin('public.tbl_benutzer', 'person_id'); $this->_ci->PersonModel->addJoin('public.tbl_mitarbeiter', 'uid = mitarbeiter_uid', 'LEFT'); $this->_ci->PersonModel->addJoin('public.tbl_student', 'uid = student_uid', 'LEFT'); $this->_ci->PersonModel->addJoin('public.tbl_studiengang', 'studiengang_kz', 'LEFT'); - $personen = $this->_ci->PersonModel->loadWhere(array('tbl_benutzer.aktiv' => true)); + $this->_ci->PersonModel->db->where(array('tbl_benutzer.aktiv' => true)); + + $this->_ci->PersonModel->db->group_start(); + foreach ($query_words as $word) + { + $this->_ci->PersonModel->db->group_start(); + $this->_ci->PersonModel->db->where('tbl_person.vorname ILIKE', "%" . $word . "%"); + $this->_ci->PersonModel->db->or_where('tbl_person.nachname ILIKE', "%" . $word . "%"); + $this->_ci->PersonModel->db->or_where('uid ILIKE', "%" . $word . "%"); + $this->_ci->PersonModel->db->or_where('CONCAT(tbl_studiengang.typ, tbl_studiengang.kurzbz) ILIKE', "%" . $word . "%"); + + if (is_numeric($word)) + { + $this->_ci->PersonModel->db->or_where('semester', $word); + } + $this->_ci->PersonModel->db->group_end(); + } + $this->_ci->PersonModel->db->group_end(); + $personen = $this->_ci->PersonModel->load(); $this->terminateWithSuccess(hasData($personen) ? getData($personen) : array()); } diff --git a/application/controllers/api/frontend/v1/lv/Lektor.php b/application/controllers/api/frontend/v1/lv/Lektor.php index 68bec1bc4..ccdc79133 100644 --- a/application/controllers/api/frontend/v1/lv/Lektor.php +++ b/application/controllers/api/frontend/v1/lv/Lektor.php @@ -15,7 +15,7 @@ class Lektor extends FHCAPI_Controller 'deleteLVPlan' => ['admin:rw', 'assistenz:rw'], 'deletePerson' => ['admin:rw', 'assistenz:rw'], 'getLehrfunktionen' => ['admin:r', 'assistenz:r'], - 'getLektoren' => ['admin:r', 'assistenz:r'], + 'getLektorenSearch' => ['admin:r', 'assistenz:r'], 'getLektorenByLE' => ['admin:r', 'assistenz:r'], 'getLektorDaten' => ['admin:r', 'assistenz:r'], 'getLektorVertrag' => ['admin:r', 'assistenz:r'], @@ -208,12 +208,32 @@ class Lektor extends FHCAPI_Controller $this->terminateWithSuccess(getData($this->_ci->LehrfunktionModel->load())); } - public function getLektoren() + public function getLektorenSearch($query = null) { + if (is_null($query)) + $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + $query_words = explode(' ', urldecode($query)); + $this->_ci->MitarbeiterModel->addSelect('uid, person_id, vorname, nachname'); $this->_ci->MitarbeiterModel->addJoin('public.tbl_benutzer', 'uid = mitarbeiter_uid'); $this->_ci->MitarbeiterModel->addJoin('public.tbl_person', 'person_id'); - $this->terminateWithSuccess(getData($this->_ci->MitarbeiterModel->loadWhere(array('public.tbl_benutzer.aktiv' => true)))); + + $this->_ci->MitarbeiterModel->db->where('public.tbl_benutzer.aktiv', true); + + $this->_ci->MitarbeiterModel->db->group_start(); + foreach ($query_words as $word) + { + $this->_ci->MitarbeiterModel->db->group_start(); + $this->_ci->MitarbeiterModel->db->where('tbl_person.vorname ILIKE', "%" . $word . "%"); + $this->_ci->MitarbeiterModel->db->or_where('tbl_person.nachname ILIKE', "%" . $word . "%"); + $this->_ci->MitarbeiterModel->db->or_where('uid ILIKE', "%" . $word . "%"); + $this->_ci->MitarbeiterModel->db->group_end(); + } + $this->_ci->MitarbeiterModel->db->group_end(); + $this->_ci->MitarbeiterModel->addOrder('nachname'); + $this->_ci->MitarbeiterModel->addOrder('vorname'); + $result = $this->_ci->MitarbeiterModel->load(); + $this->terminateWithSuccess(hasData($result) ? getData($result) : array()); } private function checkLehreinheit($lehreinheit_id) diff --git a/application/controllers/api/frontend/v1/lv/Tags.php b/application/controllers/api/frontend/v1/lv/Tags.php index a22a4c82e..34c42bc32 100644 --- a/application/controllers/api/frontend/v1/lv/Tags.php +++ b/application/controllers/api/frontend/v1/lv/Tags.php @@ -5,7 +5,7 @@ if (!defined('BASEPATH')) class Tags extends Tag_Controller { - const BERECHTIGUNG_KURZBZ = ['admin:rw', 'assistenz:rw']; + const BERECHTIGUNG_KURZBZ = ['admin:rw', 'assistenz:r']; public function __construct() { diff --git a/application/libraries/LektorLib.php b/application/libraries/LektorLib.php index e06e2b728..bbe630eaf 100644 --- a/application/libraries/LektorLib.php +++ b/application/libraries/LektorLib.php @@ -17,6 +17,7 @@ class LektorLib $this->_ci->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel'); $this->_ci->load->model('ressource/mitarbeiter_model', 'MitarbeiterModel'); $this->_ci->load->model('person/Benutzer_model', 'BenutzerModel'); + $this->_ci->load->library('PhrasesLib', array('lehre')); } public function addLektorToLehreinheit($lehreinheit_id, $mitarbeiter_uid) @@ -35,7 +36,7 @@ class LektorLib if (isError($already_assigned)) return $already_assigned; - if (hasData($already_assigned)) return error('Lektor already assigned'); + if (hasData($already_assigned)) return error($this->_ci->phraseslib->t("lehre", "bereitzugeteilt")); $studiensemester_result = $this->_ci->StudiensemesterModel->loadWhere(array('studiensemester_kurzbz' => $lehreinheit->studiensemester_kurzbz)); if (isError($studiensemester_result)) return $studiensemester_result; @@ -88,6 +89,7 @@ class LektorLib $lehreinheit = getData($lehreinheit_result)[0]; + //TODO kollision check, wird vorerst nicht implementiert -> nur über das FAS möglich if (isset($new_data['mitarbeiter_uid']) && $new_data['mitarbeiter_uid'] !== $mitarbeiter_uid) { @@ -98,7 +100,13 @@ class LektorLib $verplant = $this->_ci->StundenplandevModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid)); if (hasData($verplant)) - return error('Wechsel vom Mitarbeiter nicht möglich da er bereits verplant ist!'); + return error($this->_ci->phraseslib->t("lehre", "lektorbereitsverplant")); + + $lehreinheit_data = $this->_ci->LehreinheitmitarbeiterModel->loadWhere(array('mitarbeiter_uid' => $new_data['mitarbeiter_uid'], 'lehreinheit_id' => $lehreinheit_id)); + + if (hasData($lehreinheit_data)) + return error($this->_ci->phraseslib->t("lehre", "bereitzugeteilt")); + } $warning = ''; if (isset($new_data['semesterstunden'])) diff --git a/application/models/education/Lehreinheitgruppe_model.php b/application/models/education/Lehreinheitgruppe_model.php index bca395f31..dee8bbfe1 100644 --- a/application/models/education/Lehreinheitgruppe_model.php +++ b/application/models/education/Lehreinheitgruppe_model.php @@ -374,7 +374,7 @@ class Lehreinheitgruppe_model extends DB_Model return success('Group assigned successfully to Lehreinheit'); } else - return error('Group already assigned'); + return error($this->p->t('lehre', 'grpbereitszugeteilt')); } public function deleteGroup($lehreinheit_id, $lehreinheitgruppe_id) @@ -401,7 +401,7 @@ class Lehreinheitgruppe_model extends DB_Model $stundenplan_result = $this->loadWhere(array('tbl_lehreinheitgruppe.lehreinheitgruppe_id' => $lehreinheitgruppe_id)); if (hasData($stundenplan_result)) - return error('Gruppe already verplant'); + return error($this->p->t('lehre', 'grpbereitsverplant')); $delete_result = $this->delete($lehreinheitgruppe_id); diff --git a/public/js/api/lehrveranstaltung/gruppe.js b/public/js/api/lehrveranstaltung/gruppe.js index e22fdd847..386938160 100644 --- a/public/js/api/lehrveranstaltung/gruppe.js +++ b/public/js/api/lehrveranstaltung/gruppe.js @@ -37,20 +37,20 @@ export default { /*------------- details -------- */ - getAll() + getBenutzerSearch(query) { return { method: 'get', - url: '/api/frontend/v1/lv/gruppe/getAll/' + url: '/api/frontend/v1/lv/gruppe/getBenutzerSearch/' + encodeURIComponent(query) }; }, - getBenutzer() + getAllSearch(query) { return { method: 'get', - url: '/api/frontend/v1/lv/gruppe/getBenutzer/' + url: '/api/frontend/v1/lv/gruppe/getAllSearch/' + encodeURIComponent(query) }; - } + }, } diff --git a/public/js/api/lehrveranstaltung/lektor.js b/public/js/api/lehrveranstaltung/lektor.js index e8c2fb673..9539315aa 100644 --- a/public/js/api/lehrveranstaltung/lektor.js +++ b/public/js/api/lehrveranstaltung/lektor.js @@ -8,12 +8,11 @@ export default { }; }, - - getLektoren() + getLektorenSearch(query) { return { method: 'get', - url: '/api/frontend/v1/lv/lektor/getLektoren/' + url: '/api/frontend/v1/lv/lektor/getLektorenSearch/' + encodeURIComponent(query) }; }, diff --git a/public/js/components/LVVerwaltung/Details/Direktinskription.js b/public/js/components/LVVerwaltung/Details/Direktinskription.js index c7b8e5894..268b1bf28 100644 --- a/public/js/components/LVVerwaltung/Details/Direktinskription.js +++ b/public/js/components/LVVerwaltung/Details/Direktinskription.js @@ -2,6 +2,7 @@ import {CoreFilterCmpt} from "../../filter/Filter.js"; import FormForm from '../../Form/Form.js'; import FormInput from '../../Form/Input.js'; import ApiDirektGruppe from "../../../api/lehrveranstaltung/direktgruppe.js"; +import ApiGruppe from "../../../api/lehrveranstaltung/gruppe.js"; export default{ name: "LVDirektGruppen", components: { @@ -65,7 +66,6 @@ export default{ selectedUser: null, filteredUsers: [], abortController: null, - searchTimeout: null, } }, watch: { @@ -97,18 +97,36 @@ export default{ }, searchUser(event) { - const query = event.query.toLowerCase().trim(); - this.filteredUsers = this.dropdowns.benutzer_array.filter(user => { + const query = event.query.trim(); + if (!query) + { + this.filteredUsers = []; + return; + } - const fullName = `${user.vorname.toLowerCase()} ${user.nachname.toLowerCase()}`; - const reverseFullName = `${user.nachname.toLowerCase()} ${user.vorname.toLowerCase()}`; - return fullName.includes(query) || reverseFullName.includes(query) || user.uid.toLowerCase().includes(query) || user.studiengang.toLowerCase().includes(query); - }).map(user => ({ - label: user.studiengang - ? `${user.nachname} ${user.vorname} ${user.uid} ${user.studiengang} ${user.semester}` - : `${user.nachname} ${user.vorname} ${user.uid}`, - uid: user.uid - })); + if (query.length < 2) + { + return; + } + + if (this.abortController) + { + this.abortController.abort(); + } + + this.abortController = new AbortController(); + const signal = this.abortController.signal; + + this.$api.call(ApiGruppe.getBenutzerSearch(query), { signal }) + .then(result => { + this.filteredUsers = result.data.map(user => ({ + label: user.studiengang + ? `${user.nachname} ${user.vorname} ${user.uid} ${user.studiengang} ${user.semester}` + : `${user.nachname} ${user.vorname} ${user.uid}`, + uid: user.uid + }) + )}) + .catch(this.$fhcAlert.handleSystemError) }, addUser() { @@ -144,7 +162,7 @@ export default{ :placeholder="$p.t('lehre', 'assignPerson')" v-model="selectedUser" field="label" - :minLength="3" + :minLength="2" @item-select="addUser" @complete="searchUser" > diff --git a/public/js/components/LVVerwaltung/Details/Form.js b/public/js/components/LVVerwaltung/Details/Form.js index 5908512d7..d8299e4fa 100644 --- a/public/js/components/LVVerwaltung/Details/Form.js +++ b/public/js/components/LVVerwaltung/Details/Form.js @@ -26,16 +26,6 @@ export default { default: true } }, - computed: { - formattedAnmerkung: { - get() { - return (this.data.anmerkung || '').replace(/\\n/g, '\n'); - }, - set(value) { - this.data.anmerkung = (value || '').replace(/\n/g, '\\n'); - } - } - }, template: `
@@ -74,7 +64,7 @@ export default { :label="$p.t('lehre', 'detailanmerkung')" type="textarea" container-class="col-3" - v-model="formattedAnmerkung" + v-model="data.anmerkung" name="anmerkung" id="anmerkung" rows="10" diff --git a/public/js/components/LVVerwaltung/Details/Gruppen.js b/public/js/components/LVVerwaltung/Details/Gruppen.js index a6f9df005..57dc49728 100644 --- a/public/js/components/LVVerwaltung/Details/Gruppen.js +++ b/public/js/components/LVVerwaltung/Details/Gruppen.js @@ -90,7 +90,8 @@ export default{ tabulatorEvents: [], showAutocomplete: false, filteredGroups: [], - selectedGroup: null + selectedGroup: null, + abortController: null } }, watch: { @@ -99,19 +100,42 @@ export default{ } }, methods:{ - searchGroup(event) + + async searchGroup(event) { - const query = event.query.toLowerCase().trim(); - this.filteredGroups = this.dropdowns.gruppen_array.filter(gruppe => { - return gruppe.gruppe_kurzbz.toLowerCase().includes(query) || gruppe?.bezeichnung?.toLowerCase().includes(query); - }).map(gruppe => ({ - label: gruppe.bezeichnung - ? `${gruppe.gruppe_kurzbz.trim()} (${gruppe.bezeichnung})` - : gruppe.gruppe_kurzbz.trim(), - gid: gruppe.gid, - gruppe_kurzbz: gruppe.gruppe_kurzbz.trim(), - lehrverband: gruppe.lehrverband, - })); + const query = event.query.trim(); + + if (!query) + { + this.filteredLektor = []; + return; + } + + if (query.length < 2) + { + return; + } + + if (this.abortController) + { + this.abortController.abort(); + } + + this.abortController = new AbortController(); + const signal = this.abortController.signal; + + this.$api.call(ApiGruppe.getAllSearch(query), { signal }) + .then(result => { + this.filteredGroups = result.data.map(gruppe => ({ + label: gruppe.bezeichnung + ? `${gruppe.gruppe_kurzbz.trim()} (${gruppe.bezeichnung})` + : gruppe.gruppe_kurzbz.trim(), + gid: gruppe.gid, + gruppe_kurzbz: gruppe.gruppe_kurzbz.trim(), + lehrverband: gruppe.lehrverband, + }) + )}) + .catch(this.$fhcAlert.handleSystemError) }, reload() { this.$refs.table.reloadTable(); diff --git a/public/js/components/LVVerwaltung/LVVerwaltung.js b/public/js/components/LVVerwaltung/LVVerwaltung.js index c03e7c84c..840d7b406 100644 --- a/public/js/components/LVVerwaltung/LVVerwaltung.js +++ b/public/js/components/LVVerwaltung/LVVerwaltung.js @@ -80,9 +80,6 @@ export default { sprachen_array: [], lehrform_array: [], raumtyp_array: [], - lektor_array: [], - gruppen_array: [], - benutzer_array: [], }, selectedStudiengang: '', searchbaroptions: { @@ -185,6 +182,13 @@ export default { this.$router.replace({ name: 'byStg', params: newParams }); } }, + resetStgFilter() + { + const newParams = { ...this.filter, activeFilter: 'emp' }; + delete newParams.stg; + this.selectedStudiengang = ''; + this.$router.replace({ name: 'byEmp', params: newParams }); + }, searchfunction(params) { return this.$api.call(ApiSearchbar.search(params)); }, @@ -227,24 +231,6 @@ export default { this.dropdowns.lehrfunktion_array = result.data; }) .catch(this.$fhcAlert.handleSystemError); - - this.$api.call(ApiLektor.getLektoren()) - .then(result => { - this.dropdowns.lektor_array = result.data; - }) - .catch(this.$fhcAlert.handleSystemError); - - this.$api.call(ApiGruppe.getAll()) - .then(result => { - this.dropdowns.gruppen_array = result.data; - }) - .catch(this.$fhcAlert.handleSystemError); - - this.$api.call(ApiGruppe.getBenutzer()) - .then(result => { - this.dropdowns.benutzer_array = result.data; - }) - .catch(this.$fhcAlert.handleSystemError); }, template: ` @@ -272,12 +258,25 @@ export default { :filter="filter" > diff --git a/public/js/components/LVVerwaltung/Lektor/Daten.js b/public/js/components/LVVerwaltung/Lektor/Daten.js index a9c7e53be..21e5dc196 100644 --- a/public/js/components/LVVerwaltung/Lektor/Daten.js +++ b/public/js/components/LVVerwaltung/Lektor/Daten.js @@ -31,6 +31,8 @@ export default{ changed: {}, internal_mitarbeiter_uid: null, filteredLektor: [], + abortController: null, + selectedLektorLabel: '' } }, computed: { @@ -63,7 +65,10 @@ export default{ this.internal_mitarbeiter_uid = newVal; if (newVal === null) + { this.data = null; + this.selectedLektorLabel = ''; + } else if (newVal !== undefined && this.lehreinheit_id !== undefined) this.getLektorData(); } @@ -99,10 +104,15 @@ export default{ return this.$api.call(ApiLektor.getLektorDaten(this.lehreinheit_id, this.internal_mitarbeiter_uid)) .then(result => { this.data = result.data; + this.selectedLektorLabel = `${this.data.nachname} ${this.data.vorname} (${this.data.mitarbeiter_uid})`, this.original = { ...this.data }; }) .catch(this.$fhcAlert.handleSystemError); }, + onLektorSelected(selectedLektor) + { + this.data.mitarbeiter_uid = selectedLektor.value.uid; + }, updateDaten() { if (!this.changedLength) @@ -139,17 +149,37 @@ export default{ }) .catch(this.$fhcAlert.handleSystemError); }, - searchLektor(event) + async searchLektor(event) { - const query = event.query.toLowerCase().trim(); - this.filteredLektor = this.dropdowns.lektor_array.filter(lektor => { - const fullName = `${lektor.vorname.toLowerCase()} ${lektor.nachname.toLowerCase()}`; - const reverseFullName = `${lektor.nachname.toLowerCase()} ${lektor.vorname.toLowerCase()}`; - return fullName.includes(query) || reverseFullName.includes(query) || lektor.uid.toLowerCase().includes(query); - }).map(lektor => ({ - label: `${lektor.nachname} ${lektor.vorname} (${lektor.uid})`, - uid: lektor.uid - })); + const query = event.query.trim(); + + if (!query) + { + this.filteredLektor = []; + return; + } + + if (query.length < 2) + { + return; + } + + if (this.abortController) + { + this.abortController.abort(); + } + + this.abortController = new AbortController(); + const signal = this.abortController.signal; + + this.$api.call(ApiLektor.getLektorenSearch(query), { signal }) + .then(result => { + this.filteredLektor = result.data.map(lektor => ({ + label: `${lektor.nachname} ${lektor.vorname} (${lektor.uid})`, + uid: lektor.uid + }) + )}) + .catch(this.$fhcAlert.handleSystemError) }, }, @@ -187,11 +217,12 @@ export default{ :disabled="data.vertrag_id !== null" :suggestions="filteredLektor" placeholder="Mitarbeiter hinzufügen" - v-model="data.mitarbeiter_uid" + v-model="selectedLektorLabel" field="label" container-class="col-3" dropdown @complete="searchLektor" + @item-select="onLektorSelected" name="lektorautocomplete" > @@ -231,7 +262,6 @@ export default{
- - +
+ + +
-
- - - +
+ {{ $p.t('lehre', 'gesamtkosten') }}: + + {{ berechneteGesamtkosten }} € +
- diff --git a/public/js/components/LVVerwaltung/Lektor/Table.js b/public/js/components/LVVerwaltung/Lektor/Table.js index 4e568f9db..461d782ed 100644 --- a/public/js/components/LVVerwaltung/Lektor/Table.js +++ b/public/js/components/LVVerwaltung/Lektor/Table.js @@ -3,7 +3,6 @@ import FormForm from '../../Form/Form.js'; import FormInput from '../../Form/Input.js'; import ApiLektor from "../../../api/lehrveranstaltung/lektor.js"; - export default{ name: "LVLektorTable", components: { @@ -36,7 +35,8 @@ export default{ ], showAutocomplete: false, filteredLektor: [], - selectedLektor: '' + selectedLektor: '', + abortController: null } }, computed: { @@ -163,17 +163,37 @@ export default{ }) }, - searchLektor(event) + async searchLektor(event) { - const query = event.query.toLowerCase().trim(); - this.filteredLektor = this.dropdowns.lektor_array.filter(lektor => { - const fullName = `${lektor.vorname.toLowerCase()} ${lektor.nachname.toLowerCase()}`; - const reverseFullName = `${lektor.nachname.toLowerCase()} ${lektor.vorname.toLowerCase()}`; - return fullName.includes(query) || reverseFullName.includes(query) || lektor.uid.toLowerCase().includes(query); - }).map(lektor => ({ - label: `${lektor.nachname} ${lektor.vorname} (${lektor.uid})`, - uid: lektor.uid - })); + const query = event.query.trim(); + + if (!query) + { + this.filteredLektor = []; + return; + } + + if (query.length < 2) + { + return; + } + + if (this.abortController) + { + this.abortController.abort(); + } + + this.abortController = new AbortController(); + const signal = this.abortController.signal; + + this.$api.call(ApiLektor.getLektorenSearch(query), { signal }) + .then(result => { + this.filteredLektor = result.data.map(lektor => ({ + label: `${lektor.nachname} ${lektor.vorname} (${lektor.uid})`, + uid: lektor.uid + }) + )}) + .catch(this.$fhcAlert.handleSystemError) }, addLektor() { diff --git a/public/js/components/LVVerwaltung/Lektor/Vertrag.js b/public/js/components/LVVerwaltung/Lektor/Vertrag.js index 095e92f7c..2c30a41c6 100644 --- a/public/js/components/LVVerwaltung/Lektor/Vertrag.js +++ b/public/js/components/LVVerwaltung/Lektor/Vertrag.js @@ -113,23 +113,16 @@ export default{
{{$p.t('lehre', 'vertragsdetails')}} - {{ data === null ? ' – Noch kein Vertrag' : '' }} - + {{ data?.vertrag === null ? ' – ' + $p.t('lehre', 'keinvertrag') : '' }} +
diff --git a/public/js/components/LVVerwaltung/Setup/Table.js b/public/js/components/LVVerwaltung/Setup/Table.js index 309960f54..73511a94f 100644 --- a/public/js/components/LVVerwaltung/Setup/Table.js +++ b/public/js/components/LVVerwaltung/Setup/Table.js @@ -663,6 +663,8 @@ export default { @click:new="showLehreinheitModal">