Studierendenverwaltung Projektarbeit improvements: tabulator (supposedly) stores column changes, changed some phrases, projektarbeit download button is now shown when Projektbeurteilung extension is not installted, errors are displayed near input fields not in pop up, changed modal layout, Vertrag fields are now just text fields, validation errors are cleared

This commit is contained in:
Alexei Karpenko
2025-07-10 16:59:58 +02:00
parent abbeec11fc
commit 1c8ffa786e
6 changed files with 48 additions and 51 deletions
@@ -168,13 +168,13 @@ class Projektbetreuer extends FHCAPI_Controller
$betreuerart_kurzbz = $this->input->post('betreuerart_kurzbz');
if (!isset($projektarbeit_id) || !is_numeric($projektarbeit_id))
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Projektarbeit ID'], self::ERROR_TYPE_GENERAL));
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> $this->p->t('projektarbeit', 'projektarbeit').' ID'], self::ERROR_TYPE_GENERAL));
if (!isset($person_id) || !is_numeric($person_id))
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person ID'], self::ERROR_TYPE_GENERAL));
if (!isset($betreuerart_kurzbz))
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Betreuerart'], self::ERROR_TYPE_GENERAL));
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> $this->p->t('projektarbeit', 'betreuerart')], self::ERROR_TYPE_GENERAL));
if (!$this->ProjektarbeitModel->hasBerechtigungForProjektarbeit($projektarbeit_id))
return $this->_outputAuthError([$this->router->method => ['admin:rw', 'assistenz:rw']]);
@@ -295,19 +295,19 @@ class Projektbetreuer extends FHCAPI_Controller
$this->form_validation->set_data($formData);
$this->form_validation->set_rules('betreuerart_kurzbz', 'Betreuerart', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Betreuerart'])
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('projektarbeit', 'betreuerart')])
]);
$this->form_validation->set_rules('person_id', 'Person', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Person ID'])
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('projektarbeit', 'betreuer')])
]);
$this->form_validation->set_rules('stunden', 'Stunden', 'numeric', [
'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Stunden'])
'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => $this->p->t('projektarbeit', 'stunden')])
]);
$this->form_validation->set_rules('stundensatz', 'Stundensatz', 'numeric', [
'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Stundensatz'])
'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => $this->p->t('projektarbeit', 'stundensatz')])
]);
@@ -102,6 +102,7 @@ export default {
this.formData.note = null;
this.formData.final = true;
this.formData.anmerkung = null;
this.$refs.formDetails.clearValidation();
},
getFormData(statusNew, studiensemester_kurzbz, additional_lehrveranstaltung_id/*, successCallback*/) {
@@ -175,15 +175,14 @@ export default {
frozen: true
},
],
layout: 'fitDataFill',
//layout: 'fitDataFill',
height: 'auto',
minHeight: '200',
selectable: 1,
index: 'projektarbeit_id',
//persistenceMode:"cookie",
//~ persistence:{
//~ columns: true, //persist column layout
//~ },
persistence:{
columns: true, //persist column layout
},
persistenceID: 'stv-details-projektarbeit'
},
tabulatorEvents: [
@@ -356,11 +355,11 @@ export default {
</template>
<div class="row">
<div class="col-6">
<div class="col-5">
<projektarbeit-details ref="projektarbeitDetails" :student="student" @projekttyp-changed="setDefaultStunden">
</projektarbeit-details>
</div>
<div class="col-6">
<div class="col-7">
<projektbetreuer ref="projektbetreuer" :config="config"></projektbetreuer>
</div>
</div>
@@ -84,13 +84,16 @@ export default {
frozen: true
},
],
layout: 'fitDataFill',
//layout: 'fitDataFill',
layoutColumnsOnNewData: false,
height: 'auto',
minHeight: '100',
selectable: true,
selectable: 1,
index: 'betreuer_id',
persistence:{
columns: true, //persist column layout
},
persistenceID: 'stv-details-projektbetreuer'
},
tabulatorEvents: [
@@ -99,6 +102,13 @@ export default {
handler: async() => {
await this.$p.loadCategory(['global', 'person', 'stv', 'projektarbeit', 'ui']);
}
},
{
event: 'rowSelected',
handler: row => {
let data = row.getData();
this.actionEditProjektbetreuer(data.projektarbeit_id, data.person_id, data.betreuerart_kurzbz);
}
}
],
formData: {
@@ -156,7 +166,7 @@ export default {
this.formData = betreuer;
// set download link
if (betreuer.beurteilungDownloadLink) this.beurteilungDownloadLink = betreuer.beurteilungDownloadLink
if (betreuer.beurteilungDownloadLink !== null) this.beurteilungDownloadLink = betreuer.beurteilungDownloadLink;
// set betreuer for autocomplete field
this.autocompleteSelectedBetreuer = {
@@ -279,15 +289,16 @@ export default {
alleBetreuer.push(this.addAutoCompleteBetreuerToFormData(this.formData));
}
return this.$api.call(ApiStvProjektbetreuer.validateProjektbetreuer(alleBetreuer));
return this.$refs.formProjektbetreuer.call(ApiStvProjektbetreuer.validateProjektbetreuer(alleBetreuer));
},
resetForm() {
this.formData = this.getDefaultFormData();
this.beurteilungDownloadLink = null;
if (this.beurteilungDownloadLink !== null) this.beurteilungDownloadLink = '';
this.autocompleteSelectedBetreuer = null;
this.initialFormData = null;
if (this.projekttyp_kurzbz) this.setDefaultStunden(this.projekttyp_kurzbz);
this.disableVertragFields(false);
this.$refs.formProjektbetreuer.clearValidation();
},
resetModes() {
this.newMode = false;
@@ -417,7 +428,7 @@ export default {
type="autocomplete"
optionLabel="name"
v-model="autocompleteSelectedBetreuer"
name="betreuer"
name="person_id"
:suggestions="filteredBetreuer"
@complete="searchBetreuer"
:min-length="3"
@@ -501,13 +512,13 @@ export default {
<button class="btn btn-primary" v-show="betreuerFormOpened" @click="confirmProjektbetreuerAfterValidation">
{{ $p.t('projektarbeit', 'betreuerBestaetigen') }}
</button>
<div class = "mt-5">
<div class = "mt-5" v-if="beurteilungDownloadLink !== null">
<div class="mb-1">
<a :href="beurteilungDownloadLink" class="btn btn-primary d-block" :class="{ 'disabled' : !beurteilungDownloadLink || beurteilungDownloadLink == ''}">
<a :href="beurteilungDownloadLink" class="btn btn-primary d-block" :class="{ 'disabled' : beurteilungDownloadLink === ''}">
{{ $p.t('projektarbeit', 'projektbeurteilungErstellen') }}
</a>
</div>
{{ autocompleteSelectedBetreuer?.person_id && (!beurteilungDownloadLink || beurteilungDownloadLink == '') ? $p.t('projektarbeit', 'projektarbeitNochNichtBeurteilt') : ''}}
{{ autocompleteSelectedBetreuer?.person_id && beurteilungDownloadLink === '' ? $p.t('projektarbeit', 'projektarbeitNochNichtBeurteilt') : ''}}
</div>
</div>
@@ -125,36 +125,22 @@ export default{
<div class="mb-3">
{{ betreuerProjektarbeit?.betreuerart_kurzbz && betreuerProjektarbeit?.vertrag_id == null ? ' '+$p.t('lehre', 'nochKeinVertrag') : '' }}
</div>
<div class="row align-items-end mb-3">
<form-input
:label="$p.t('lehre', 'vertragsstatus')"
type="text"
readonly
v-model="vertragsstatus"
:style="{fontWeight: vertragsstatus === this.vertragsstatus_geaendert ? 'bold' : 'normal'}"
name="vertragsstatus"
/>
</div>
{{$p.t('lehre', 'vertragurfassung')}}
<div class="row mb-3">
<form-input
:label="$p.t('lehre', 'semesterstunden')"
type="text"
readonly
v-model="data.vertragsstunden"
name="vertragsstunden"
>
</form-input>
<div class="col-12">
{{ $p.t('lehre', 'vertragsstatus') }}: {{ vertragsstatus }}
</div>
</div>
<div class="row mb-3">
<form-input
:label="$p.t('lehre', 'studiensemester')"
type="text"
readonly
v-model="data.vertragsstunden_studiensemester_kurzbz"
name="vertragsstunden_studiensemester_kurzbz"
>
</form-input>
<div class="col-12">
{{$p.t('lehre', 'vertragurfassung')}}
</div>
</div>
<div class="row mb-3">
<div class="col-12">
{{ $p.t('lehre', 'semesterstunden') }}: {{ data.vertragsstunden }}
<br>
<span class="text-capitalize">{{ $p.t('lehre', 'studiensemester') }}</span>: {{ data.vertragsstunden_studiensemester_kurzbz }}
</div>
</div>
<div class="row mb-3" v-if="data?.vertragsstatus">
<div class="col-12">
@@ -164,7 +150,7 @@ export default{
:disabled="vertragsstatus == vertragsstatus_storniert"
@click="cancelVertrag"
>
{{ $p.t('lehre', 'stornieren') }}
{{ $p.t('lehre', 'vertragStornieren') }}
</button>
</div>
</div>
+2 -2
View File
@@ -43778,7 +43778,7 @@ and represent the current state of research on the topic. The prescribed citatio
array(
'app' => 'core',
'category' => 'lehre',
'phrase' => 'stornieren',
'phrase' => 'vertragStornieren',
'insertvon' => 'system',
'phrases' => array(
array(
@@ -43789,7 +43789,7 @@ and represent the current state of research on the topic. The prescribed citatio
),
array(
'sprache' => 'English',
'text' => 'Cancel',
'text' => 'Cancel contract',
'description' => '',
'insertvon' => 'system'
)