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: `