Leitungsansicht Autocomplete 1st draft

This commit is contained in:
cgfhtw
2023-07-05 08:30:33 +02:00
parent 3ca80904ea
commit 61856473ea
6 changed files with 86 additions and 35 deletions
@@ -167,9 +167,12 @@ class Abmeldung extends FHC_Controller
{
$this->load->library('PermissionLib');
$_POST = json_decode($this->input->raw_input_stream, true);
$query = $this->input->post('query');
$studiengaenge = $this->permissionlib->getSTG_isEntitledFor('student/studierendenantrag');
$result = $this->antraglib->getAbmeldeBerechtigtForStg($studiengaenge);
$result = $this->antraglib->getAktivePrestudentenInStgs($studiengaenge, $query);
if (isError($result)) {
return $this->outputJsonError(getError($result));
}
@@ -178,6 +181,8 @@ class Abmeldung extends FHC_Controller
return $this->outputJsonSuccess([]);
}
return $this->outputJsonSuccess($result);
$sortedStudents = [];
foreach ($result as $item) {
if (!isset($sortedStudents[$item->studiengang_kz]))
+6 -4
View File
@@ -1188,13 +1188,15 @@ class AntragLib
return $stsems;
}
public function getAbmeldeBerechtigtForStg($studiengaenge)
public function getAktivePrestudentenInStgs($studiengaenge, $query)
{
$blacklist = $this->_ci->config->item('stgkz_blacklist_abmeldung');
$studiengaenge = array_diff($studiengaenge, $blacklist);
return $this->_ci->StudiengangModel->getAktivePrestudenten($studiengaenge, [
Studierendenantrag_model::TYP_ABMELDUNG
]);
return $this->_ci->StudiengangModel->getAktivePrestudenten(
$studiengaenge,
[ Studierendenantrag_model::TYP_ABMELDUNG ],
$query
);
}
public function getFailedExamForPrestudent($prestudent_id)
@@ -532,7 +532,7 @@ class Studiengang_model extends DB_Model
*
* @return stdClass
*/
public function getAktivePrestudenten($studiengang_kzs, $not_antrag_typ = null)
public function getAktivePrestudenten($studiengang_kzs, $not_antrag_typ = null, $query = null)
{
$this->load->config('studierendenantrag');
@@ -571,6 +571,21 @@ class Studiengang_model extends DB_Model
$this->db->group_end();
}
if ($query) {
$query = explode(' ', $query);
$this->db->group_start();
foreach ($query as $q) {
$this->db->group_start();
$this->db->where('pers.vorname ILIKE', "%" . $q . "%");
$this->db->or_where('pers.nachname ILIKE', "%" . $q . "%");
$this->db->or_where($this->dbTable . '.bezeichnung ILIKE', "%" . $q . "%");
if (is_numeric($q))
$this->db->or_where('p.prestudent_id', $q);
$this->db->group_end();
}
$this->db->group_end();
}
return $this->load();
}
}
@@ -122,6 +122,7 @@
generateJSsInclude('vendor/npm-asset/primevue/column/column.min.js');
generateJSsInclude('vendor/npm-asset/primevue/calendar/calendar.min.js');
generateJSsInclude('vendor/npm-asset/primevue/skeleton/skeleton.min.js');
generateJSsInclude('vendor/npm-asset/primevue/autocomplete/autocomplete.min.js');
}
// --------------------------------------------------------------------------------------------------------
+1 -1
View File
@@ -5,4 +5,4 @@ const app = Vue.createApp({
StudierendenantragLeitung
}
});
app.mount('#wrapper');
app.use(primevue.config.default).mount('#wrapper');
@@ -4,7 +4,8 @@ import Phrasen from '../../../../mixins/Phrasen.js';
export default {
components: {
BsModal
BsModal,
AutoComplete: primevue.autocomplete
},
mixins: [
Phrasen
@@ -15,8 +16,7 @@ export default {
data() {
return {
data: [],
student: '',
stg: ''
student: ''
}
},
computed: {
@@ -24,13 +24,13 @@ export default {
return FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/lehre/Studierendenantrag/abmeldung/' + this.student;
},
students() {
if (!this.stg)
return [];
if (!this.data[this.stg])
return [];
return this.data[this.stg].studenten.sort(
return this.data.sort(
(a, b) => a.nachname == b.nachname ?
a.vorname > b.vorname :
(
a.vorname == b.vorname ?
a.bezeichnung > b.bezeichnung :
a.vorname > b.vorname
) :
a.nachname > b.nachname
);
},
@@ -47,15 +47,17 @@ export default {
}), {
dialogClass: 'modal-fullscreen'
}, this.p.t('studierendenantrag', 'antrag_header')).then(() => {
this.data = [];
this.loadSelects();
this.$emit('reload');
});
},
loadSelects() {
return axios.get(
loadData(evt) {
axios.post(
FHC_JS_DATA_STORAGE_OBJECT.app_root +
FHC_JS_DATA_STORAGE_OBJECT.ci_router +
'/components/Antrag/Abmeldung/getStudiengaengeAssistenz/'
'/components/Antrag/Abmeldung/getStudiengaengeAssistenz/',
evt
).then(
result => {
if (result.data.error) {
@@ -66,14 +68,30 @@ export default {
return result;
}
);
},
loadSelects() {
if (this.hasNoData) {
return axios.post(
FHC_JS_DATA_STORAGE_OBJECT.app_root +
FHC_JS_DATA_STORAGE_OBJECT.ci_router +
'/components/Antrag/Abmeldung/getStudiengaengeAssistenz/',
{query: 'felix'}
).then(
result => {
if (result.data.error) {
BsAlert.popup(result.data.retval, {dialogClass: 'alert alert-danger'});
} else {
this.data = result.data.retval;
}
return result;
}
);
}
}
},
created() {
return this.loadSelects();
},
template: `
<div class="studierendenantrag-leitung-actions-new" v-if="data">
<button type="button" class="btn btn-outline-secondary" data-bs-toggle="modal" data-bs-target="#newAntragModal" :disabled="hasNoData">
<button type="button" class="btn btn-outline-secondary" data-bs-toggle="modal" data-bs-target="#newAntragModal">
<i class="fa fa-plus"></i>
{{p.t('studierendenantrag','btn_new')}}
</button>
@@ -85,22 +103,32 @@ export default {
<button type="button" class="btn-close" data-bs-dismiss="modal" :aria-label="p.t('ui','schliessen')"></button>
</div>
<div class="modal-body">
<div class="mb-3">
<label for="newAntragModalStg">{{p.t('lehre','studiengang')}}</label>
<select id="newAntragModalStg" class="form-select" v-model="stg">
<option v-for="(stg, stg_kz) in data" :value="stg_kz" :key="stg_kz">
{{stg.bezeichnung}} ({{stg.orgform}})
</option>
</select>
<label for="newAntragModalAutoComplete">{{p.t('person','studentIn')}}</label>
<!-- TODO(chris): IMPLEMENT!! -->
<auto-complete
v-model="student"
:suggestions="data"
@complete="loadData"
inputId="newAntragModalAutoComplete"
dropdown
>
<template #option="slotProps">
<div>
{{slotProps.nachname}} {{slotProps.vorname}} ({{slotProps.bezeichnung}}) [{{slotProps.prestudent_id}}]
</div>
</template>
</auto-complete>
<!--div v-if="hasNoData">
loading...
</div>
<div class="mb-3">
<div v-else class="mb-3">
<label for="newAntragModalStudent">{{p.t('person','studentIn')}}</label>
<select v-model="student" id="newAntragModalStudent" class="form-select">
<option v-for="(stg, stg_kz) in students" :value="stg.prestudent_id" :key="stg.prestudent_id">
{{stg.nachname}} {{stg.vorname}}
<select id="newAntragModalStudent" class="form-select" v-model="student">
<option v-for="item in students" :value="item.prestudent_id" :key="item.prestudent_id">
{{item.nachname}} {{item.vorname}} ({{item.bezeichnung}}) [{{item.prestudent_id}}]
</option>
</select>
</div>
</div-->
</div>
<div class="modal-footer">
<a :href="newUrl"