mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-06-01 12:19:28 +00:00
autocomplete auf backend umgestellt
textarea formattedAnmerkung rausgenommen ui angepasst
This commit is contained in:
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
@@ -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']))
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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)
|
||||
};
|
||||
}
|
||||
},
|
||||
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
};
|
||||
},
|
||||
|
||||
|
||||
@@ -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"
|
||||
></form-input>
|
||||
|
||||
@@ -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: `
|
||||
<div>
|
||||
<div class="row mb-3">
|
||||
@@ -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"
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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"
|
||||
>
|
||||
<template #filterzuruecksetzen v-if="filter.activeFilter === 'employee'">
|
||||
<button type="button"
|
||||
class="btn btn-outline-secondary btn-action"
|
||||
title="Mitarbeiter Filter entfernen"
|
||||
@click="resetEmployeeFilter">
|
||||
<span class="fw-bold small">
|
||||
[{{ $p.t('lehre', 'lektor') }}: {{ filter.emp || '' }}
|
||||
<button type="button"
|
||||
class="btn btn-outline-secondary btn-action btn-sm ms-1"
|
||||
:title="$p.t('ui', 'filterdelete')"
|
||||
@click="resetEmployeeFilter">
|
||||
<i class="fa fa-xmark"></i>
|
||||
</button>
|
||||
<template v-if="filter.stg">
|
||||
| Stg: {{ filter.stg }}
|
||||
<button type="button"
|
||||
class="btn btn-outline-secondary btn-action btn-sm ms-1"
|
||||
:title="$p.t('ui', 'filterdelete')"
|
||||
@click="resetStgFilter">
|
||||
<i class="fa fa-xmark"></i>
|
||||
</button>
|
||||
</template>
|
||||
]
|
||||
</span>
|
||||
</template>
|
||||
</lv-table>
|
||||
</template>
|
||||
|
||||
@@ -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"
|
||||
></form-input>
|
||||
|
||||
@@ -231,7 +262,6 @@ export default{
|
||||
|
||||
</div>
|
||||
<div class="row mb-3 d-flex align-items-end">
|
||||
|
||||
<form-input
|
||||
:label="data.default_stundensatz !== null
|
||||
? $p.t('lehre', 'stundensatz') + ' (' + $p.t('lehre', 'default') + ': ' + data.default_stundensatz + ')'
|
||||
@@ -246,30 +276,23 @@ export default{
|
||||
>
|
||||
</form-input>
|
||||
|
||||
<form-input
|
||||
:label="$p.t('lehre', 'bismelden')"
|
||||
type="checkbox"
|
||||
container-class="col-3"
|
||||
v-model="data.bismelden"
|
||||
name="bismelden"
|
||||
>
|
||||
</form-input>
|
||||
<div class="col-3 d-flex align-items-end">
|
||||
<form-input
|
||||
:label="$p.t('lehre', 'bismelden')"
|
||||
type="checkbox"
|
||||
v-model="data.bismelden"
|
||||
name="bismelden"
|
||||
>
|
||||
</form-input>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row mb-3">
|
||||
<form-input
|
||||
:label="$p.t('lehre', 'gesamtkosten')"
|
||||
type="number"
|
||||
name="gesamtkosten"
|
||||
container-class="col-3"
|
||||
readonly
|
||||
v-model="berechneteGesamtkosten"
|
||||
:style="{ color: berechneteGesamtkosten <= 0 ? 'red' : 'black' }"
|
||||
>
|
||||
</form-input>
|
||||
|
||||
<div class="d-flex mb-2 gap-2">
|
||||
<span class="fw-bold">{{ $p.t('lehre', 'gesamtkosten') }}:</span>
|
||||
<span :style="{ color: berechneteGesamtkosten <= 0 ? 'red' : 'black' }">
|
||||
{{ berechneteGesamtkosten }} €
|
||||
</span>
|
||||
</div>
|
||||
|
||||
</template>
|
||||
|
||||
</fieldset>
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
@@ -113,23 +113,16 @@ export default{
|
||||
<core-form ref="form">
|
||||
<fieldset class="overflow-hidden" v-if="showVertragsdetails">
|
||||
<legend> {{$p.t('lehre', 'vertragsdetails')}}
|
||||
{{ data === null ? ' – Noch kein Vertrag' : '' }}
|
||||
</legend>
|
||||
{{ data?.vertrag === null ? ' – ' + $p.t('lehre', 'keinvertrag') : '' }}
|
||||
</legend>
|
||||
<template v-if="data?.vertrag">
|
||||
<div class="row align-items-end mb-3">
|
||||
<form-input
|
||||
:label="$p.t('lehre', 'vertragsstatus')"
|
||||
type="text"
|
||||
readonly
|
||||
container-class="col-3"
|
||||
v-model="vertragsstatus"
|
||||
:style="{fontWeight: vertragsstatus === 'Geändert' ? 'bold' : 'normal'}"
|
||||
name="vertragsstatus"
|
||||
/>
|
||||
<div class="col-3 d-flex align-items-end">
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-outline-secondary w-100"
|
||||
<div class="d-flex justify-content-between align-items-center mb-3 flex-wrap">
|
||||
<div class="d-flex align-items-center flex-wrap gap-2">
|
||||
<span class="fw-bold">{{ $p.t('lehre', 'vertragsstatus') }}:</span>
|
||||
<span :class="{ 'fw-bold': vertragsstatus === 'Geändert' }">{{ vertragsstatus }}</span>
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-outline-secondary btn-sm"
|
||||
@click="cancelVertrag"
|
||||
:title="$p.t('lehre', 'cancelvertrag')"
|
||||
>
|
||||
@@ -137,28 +130,18 @@ export default{
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
{{$p.t('lehre', 'vertragurfassung')}}
|
||||
<div class="row mb-3">
|
||||
<form-input
|
||||
:label="$p.t('lehre', 'semesterstunden')"
|
||||
type="text"
|
||||
container-class="col-3"
|
||||
readonly
|
||||
v-model="data.vertrag.vertragsstunden"
|
||||
name="vertragsstunden"
|
||||
>
|
||||
</form-input>
|
||||
<div class="mb-2 fw-bold text-decoration-underline">
|
||||
{{ $p.t('lehre', 'vertragurfassung') }}
|
||||
</div>
|
||||
<div class="row mb-3">
|
||||
<form-input
|
||||
:label="$p.t('lehre', 'studiensemester')"
|
||||
type="text"
|
||||
container-class="col-3"
|
||||
readonly
|
||||
v-model="data.vertrag.vertragsstunden_studiensemester_kurzbz"
|
||||
name="vertragsstunden_studiensemester_kurzbz"
|
||||
>
|
||||
</form-input>
|
||||
<div class="ps-4">
|
||||
<div class="d-flex mb-2 gap-2">
|
||||
<span class="fw-bold">{{ $p.t('lehre', 'semesterstunden') }}:</span>
|
||||
<span>{{ data.vertrag.vertragsstunden }}</span>
|
||||
</div>
|
||||
<div class="d-flex mb-2 gap-2">
|
||||
<span class="fw-bold">{{ $p.t('lehre', 'studiensemester') }}:</span>
|
||||
<span>{{ data.vertrag.vertragsstunden_studiensemester_kurzbz }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</fieldset>
|
||||
|
||||
@@ -663,6 +663,8 @@ export default {
|
||||
@click:new="showLehreinheitModal">
|
||||
|
||||
<template #actions>
|
||||
<button @click="expandTree" class="btn btn-outline-secondary" type="button" :title="$p.t('lehre', 'aufklappen')"><i class="fa-solid fa-maximize"></i></button>
|
||||
<button @click="resetTree" class="btn btn-outline-secondary" type="button" :title="$p.t('lehre', 'zuklappen')"><i id="togglegroup" class="fa-solid fa-minimize"></i></button>
|
||||
<core-tag ref="tagComponent"
|
||||
:endpoint="tagEndpoint"
|
||||
:values="selectedColumnValues"
|
||||
@@ -671,8 +673,6 @@ export default {
|
||||
@updated="updatedTag"
|
||||
zuordnung_typ="lehreinheit_id"
|
||||
></core-tag>
|
||||
<button @click="expandTree" class="btn btn-outline-secondary" type="button"><i class="fa-solid fa-maximize"></i></button>
|
||||
<button @click="resetTree" class="btn btn-outline-secondary" type="button"><i id="togglegroup" class="fa-solid fa-minimize"></i></button>
|
||||
</template>
|
||||
<template #search>
|
||||
<slot name="filterzuruecksetzen"></slot>
|
||||
|
||||
@@ -176,7 +176,10 @@ export default {
|
||||
async setPreselection()
|
||||
{
|
||||
if (!this.preselectedKey)
|
||||
{
|
||||
this.selectedKey = null;
|
||||
return;
|
||||
}
|
||||
|
||||
let rawKey = this.preselectedKey
|
||||
|
||||
|
||||
@@ -3504,6 +3504,166 @@ $phrases = array(
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'lehre',
|
||||
'phrase' => 'bereitzugeteilt',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Lektor bereits zugewiesen',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Lektor already assigned',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'lehre',
|
||||
'phrase' => 'grpbereitszugeteilt',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Gruppe bereits zugewiesen',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Group already assigned',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'lehre',
|
||||
'phrase' => 'grpbereitsverplant',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Gruppe ist bereits verplant',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Group is already scheduled',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'lehre',
|
||||
'phrase' => 'lektorbereitsverplant',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Wechsel vom Mitarbeiter nicht möglich da er bereits verplant ist.',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Changing the employee is not possible because they are already scheduled.',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'lehre',
|
||||
'phrase' => 'keinvertrag',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Noch kein Vertrag',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'No contract yet',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'pep',
|
||||
'category' => 'ui',
|
||||
'phrase' => 'readonlycategory',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Die Kategorie ist deaktiviert und kann nur im Lesemodus angezeigt werden.',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'The category is deactivated and can only be viewed in read-only mode.',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'pep',
|
||||
'category' => 'ui',
|
||||
'phrase' => 'werksvertragsects',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Werkvertragsvolumen in ECTS',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Work contract volume in ECTS',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'pep',
|
||||
'category' => 'ui',
|
||||
'phrase' => 'lv_entwicklung_rolle',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Rolle',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Role',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'lehre',
|
||||
@@ -45606,6 +45766,46 @@ and represent the current state of research on the topic. The prescribed citatio
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'lehre',
|
||||
'phrase' => 'aufklappen',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Aufklappen',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Expand',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'lehre',
|
||||
'phrase' => 'zuklappen',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Zuklappen',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Collapse',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'lehre',
|
||||
|
||||
Reference in New Issue
Block a user