From 3b7ed523b47a383a5091331876d7c85c3dae14a5 Mon Sep 17 00:00:00 2001 From: Johann Hoffmann Date: Fri, 21 Nov 2025 12:36:03 +0100 Subject: [PATCH] postStudentProjektarbeitZusatzdaten in detail view for Betreuer/Assistenz; --- .../controllers/api/frontend/v1/Abgabe.php | 51 +++- public/js/api/factory/abgabe.js | 8 + .../Cis/Abgabetool/AbgabeMitarbeiterDetail.js | 261 +++++++++++++++--- .../Cis/Abgabetool/AbgabeStudentDetail.js | 20 +- .../Cis/Abgabetool/AbgabetoolAssistenz.js | 4 +- .../Cis/Abgabetool/AbgabetoolMitarbeiter.js | 21 +- .../Cis/Abgabetool/DeadlineOverview.js | 2 +- system/phrasesupdate.php | 28 +- 8 files changed, 323 insertions(+), 72 deletions(-) diff --git a/application/controllers/api/frontend/v1/Abgabe.php b/application/controllers/api/frontend/v1/Abgabe.php index 349a60985..0cef197fe 100644 --- a/application/controllers/api/frontend/v1/Abgabe.php +++ b/application/controllers/api/frontend/v1/Abgabe.php @@ -41,9 +41,8 @@ class Abgabe extends FHCAPI_Controller 'getNoten' => self::PERM_LOGGED, 'getProjektarbeitenForStudiengang' =>array('basis/abgabe_assistenz:rw'), 'getStudiengaenge' => array('basis/abgabe_assistenz:rw'), - 'getStudentProjektarbeitAbgabeFile' => array('basis/abgabe_student:rw', 'basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw') -// 'notifyStudentMail' => self::PERM_LOGGED, -// 'notifyBetreuerMail' => self::PERM_LOGGED + 'getStudentProjektarbeitAbgabeFile' => array('basis/abgabe_student:rw', 'basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw'), + 'postStudentProjektarbeitZusatzdaten' => array('basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw') ]); $this->load->library('PhrasesLib'); @@ -254,7 +253,7 @@ class Abgabe extends FHCAPI_Controller || !isset($paabgabetyp_kurzbz) || isEmptyString($paabgabetyp_kurzbz) || !isset($abstract) || !isset($abstract_en) // endupload zusatzdaten can be empty but should never be null || !isset($schlagwoerter) || !isset($schlagwoerter_en) - || !isset($seitenanzahl)) + || !isset($seitenanzahl) || !isset($sprache)) $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); if ((isset($_FILES) and isset($_FILES['file']) and ! $_FILES['file']['error'])) { @@ -985,6 +984,50 @@ class Abgabe extends FHCAPI_Controller } } + public function postStudentProjektarbeitZusatzdaten(){ + $projektarbeit_id = $_POST['projektarbeit_id']; + + $sprache = $_POST['sprache']; + $abstract = $_POST['abstract']; + $abstract_en = $_POST['abstract_en']; + $schlagwoerter = $_POST['schlagwoerter']; + $schlagwoerter_en = $_POST['schlagwoerter_en']; + $seitenanzahl = $_POST['seitenanzahl']; + + + if (!isset($projektarbeit_id) || isEmptyString($projektarbeit_id) + || !isset($abstract) || !isset($abstract_en) // endupload zusatzdaten can be empty but should never be null + || !isset($schlagwoerter) || !isset($schlagwoerter_en) + || !isset($seitenanzahl) || !isset($sprache)) { + $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); + } + + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + + $result = $this->ProjektarbeitModel->load($projektarbeit_id); + $projektarbeitArr = $this->getDataOrTerminateWithError($result); + + if(count($projektarbeitArr) > 0) { + $projektarbeit = $projektarbeitArr[0]; + } else { + $this->terminateWithError($this->p->t('global','projektarbeitNichtGefunden'), 'general'); + } + + // update projektarbeit cols + $this->ProjektarbeitModel->updateProjektarbeit($projektarbeit_id,$sprache,$abstract,$abstract_en + ,$schlagwoerter, $schlagwoerter_en, $seitenanzahl); + + $this->logLib->logInfoDB(array('zusatzdatenEditMitarbeiter', array( + 'updatevon' => getAuthUID(), + 'updateamum' => date('Y-m-d H:i:s') + ), getAuthUID(), getAuthPersonId(), array($projektarbeit_id,$sprache,$abstract,$abstract_en + ,$schlagwoerter, $schlagwoerter_en, $seitenanzahl))); + + $result = $this->ProjektarbeitModel->load($projektarbeit_id); + + $this->terminateWithSuccess($result); + } + private function checkAbgabeSignatur($abgabe, $projektarbeit) { if($abgabe->paabgabetyp_kurzbz != 'end') { return; diff --git a/public/js/api/factory/abgabe.js b/public/js/api/factory/abgabe.js index 6f86939b5..21852349b 100644 --- a/public/js/api/factory/abgabe.js +++ b/public/js/api/factory/abgabe.js @@ -108,5 +108,13 @@ export default { method: 'get', url: '/api/frontend/v1/Abgabe/getStudiengaenge' }; + }, + postStudentProjektarbeitZusatzdaten(formData) { + return { + method: 'post', + url: '/api/frontend/v1/Abgabe/postStudentProjektarbeitZusatzdaten', + params: formData, + config: {Headers: { "Content-Type": "multipart/form-data" }} + }; } }; \ No newline at end of file diff --git a/public/js/components/Cis/Abgabetool/AbgabeMitarbeiterDetail.js b/public/js/components/Cis/Abgabetool/AbgabeMitarbeiterDetail.js index 8109bf05d..2acf9e719 100644 --- a/public/js/components/Cis/Abgabetool/AbgabeMitarbeiterDetail.js +++ b/public/js/components/Cis/Abgabetool/AbgabeMitarbeiterDetail.js @@ -64,7 +64,16 @@ export const AbgabeMitarbeiterDetail = { icon: "fa fa-eye", command: this.openStudentPage }], - newTermin: null + newTermin: null, + form: Vue.reactive({ + sprache: '', + abstract: '', + abstract_en: '', + schlagwoerter: '', + schlagwoerter_en: '', + kontrollschlagwoerter: '', + seitenanzahl: 1, + }) } }, methods: { @@ -89,6 +98,7 @@ export const AbgabeMitarbeiterDetail = { ...res.data[0] } if(newTerminRes.note) newTerminRes.note = noteOpt + newTerminRes.invertedFixtermin = !newTerminRes.fixtermin const existingTerminRes = res.data[1] const abgabeOpt = this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz == newTerminRes.paabgabetyp_kurzbz) @@ -148,6 +158,104 @@ export const AbgabeMitarbeiterDetail = { } }) }, + openZusatzdatenModal() { + this.$refs.modalContainerZusatzdaten.show() + }, + async saveZusatzdaten(){ + if (!await this.validateZusatzdaten()) + { + return false; + } + + const pa = this.projektarbeit + + // post endabgabe + const formData = new FormData(); + formData.append('projektarbeit_id', this.projektarbeit.projektarbeit_id); + + formData.append('sprache', this.form['sprache'].sprache) + formData.append('abstract', this.form['abstract']) + formData.append('abstract_en', this.form['abstract_en']) + formData.append('schlagwoerter', this.form['schlagwoerter']) + formData.append('schlagwoerter_en', this.form['schlagwoerter_en']) + formData.append('seitenanzahl', this.form['seitenanzahl']) + + this.loading = true + this.$api.call(ApiAbgabe.postStudentProjektarbeitZusatzdaten(formData)) + .then(res => { + if(res.meta.status == 'success') { + this.$fhcAlert.alertSuccess(this.$p.t('ui/gespeichert')) + if(!data?.retval?.[0]) return + const paRes = data.retval[0] + pa.seitenanzahl = paRes.seitenanzahl ?? 1 + pa.kontrollschlagwoerter = paRes.kontrollschlagwoerter ?? '' + pa.schlagwoerter = paRes.schlagwoerter ?? '' + pa.sprache = paRes.sprache ?? '' + pa.schlagwoerter_en = paRes.schlagwoerter_en ?? '' + pa.abstract = paRes.abstract ?? '' + pa.abstract_en = paRes.abstract_en ?? '' + } + + }).finally(()=> { + this.loading = false + }) + + this.$refs.modalContainerZusatzdaten.hide() + }, + async validateZusatzdaten() { + // check these input fields for length of entry + if(this.form['abstract'].length < 100 && await this.$fhcAlert.confirm({ + message: this.$p.t('abgabetool/warningShortAbstract'), + acceptLabel: this.$capitalize(this.$p.t('abgabetool/c4AcceptAndProceed')), + acceptClass: 'btn btn-danger', + rejectLabel: this.$capitalize(this.$p.t('abgabetool/c4Cancel')), + rejectClass: 'btn btn-outline-secondary' + }) === false) { + return false + } + + if(this.form['abstract_en'].length < 100 && await this.$fhcAlert.confirm({ + message: this.$capitalize(this.$p.t('abgabetool/warningShortAbstractEn')), + acceptLabel: this.$capitalize(this.$p.t('abgabetool/c4AcceptAndProceed')), + acceptClass: 'btn btn-danger', + rejectLabel: this.$capitalize(this.$p.t('abgabetool/c4Cancel')), + rejectClass: 'btn btn-outline-secondary' + }) === false) { + return false + } + + if(this.form['schlagwoerter'].length < 50 && await this.$fhcAlert.confirm({ + message: this.$capitalize(this.$p.t('abgabetool/warningShortSchlagwoerter')), + acceptLabel: this.$capitalize(this.$p.t('abgabetool/c4AcceptAndProceed')), + acceptClass: 'btn btn-danger', + rejectLabel: this.$capitalize(this.$p.t('abgabetool/c4Cancel')), + rejectClass: 'btn btn-outline-secondary' + }) === false) { + return false + } + + if(this.form['schlagwoerter_en'].length < 50 && await this.$fhcAlert.confirm({ + message: this.$capitalize(this.$p.t('abgabetool/warningShortSchlagwoerterEn')), + acceptLabel: this.$capitalize(this.$p.t('abgabetool/c4AcceptAndProceed')), + acceptClass: 'btn btn-danger', + rejectLabel: this.$capitalize(this.$p.t('abgabetool/c4Cancel')), + rejectClass: 'btn btn-outline-secondary' + }) === false) { + return false + } + + if(this.form['seitenanzahl'] <= 5 && await this.$fhcAlert.confirm({ + message: this.$capitalize(this.$p.t('abgabetool/warningSmallSeitenanzahl')), + acceptLabel: this.$capitalize(this.$p.t('abgabetool/c4AcceptAndProceed')), + acceptClass: 'btn btn-danger', + rejectLabel: this.$capitalize(this.$p.t('abgabetool/c4Cancel')), + rejectClass: 'btn btn-outline-secondary' + }) === false) { + return false + } + + return true + }, async handleDeleteTermin(termin){ if(await this.$fhcAlert.confirm({ message: this.$p.t('abgabetool/c4confirm_delete'), @@ -466,7 +574,17 @@ export const AbgabeMitarbeiterDetail = { // set invertedFixtermin field for UI/UX purposes -> avoid double negation in text newVal?.abgabetermine?.forEach(termin => termin.invertedFixtermin = !termin.fixtermin) - } + + // default select german if projektarbeit sprache was null + this.form.sprache = newVal.sprache ? this.allActiveLanguages.find(lang => lang.sprache == newVal.sprache) : this.allActiveLanguages.find(lang => lang.sprache == 'German') + this.form.abstract = newVal.abstract ?? '' + this.form.abstract_en = newVal.abstract_en ?? '' + this.form.schlagwoerter = newVal.schlagwoerter ?? '' + this.form.schlagwoerter_en = newVal.schlagwoerter_en ?? '' + this.form.kontrollschlagwoerter = newVal.kontrollschlagwoerter ?? '' + this.form.seitenanzahl = newVal.seitenanzahl ?? 1 + + }, }, created() { @@ -475,7 +593,7 @@ export const AbgabeMitarbeiterDetail = { }, template: ` -

{{$p.t('abgabetool/c4abgabeQualGateNegativAddNewAutomagisch')}}

-
{{$p.t('abgabetool/c4fixterminv4')}}
+
{{$p.t('abgabetool/c4fixterminv4')}}
-
{{ $capitalize( $p.t('abgabetool/c4zieldatum') )}}
+
{{ $capitalize( $p.t('abgabetool/c4zieldatum') )}}
-
{{ $capitalize( $p.t('abgabetool/c4abgabetypv2') )}}
+
{{ $capitalize( $p.t('abgabetool/c4abgabetyp') )}}
-
{{ $capitalize( $p.t('abgabetool/c4upload_allowed') )}}
+
{{ $capitalize( $p.t('abgabetool/c4upload_allowed') )}}
-
{{ $capitalize( $p.t('abgabetool/c4abgabekurzbz') )}}
+
{{ $capitalize( $p.t('abgabetool/c4abgabekurzbz') )}}
@@ -552,18 +670,6 @@ export const AbgabeMitarbeiterDetail = {
- - - - - - - - - - - -
{{$capitalize( $p.t('abgabetool/c4abgabeMitarbeiterbereich') )}}
@@ -573,7 +679,6 @@ export const AbgabeMitarbeiterDetail = {

{{projektarbeit?.zweitbegutachter}}

- -
@@ -597,6 +699,13 @@ export const AbgabeMitarbeiterDetail = { {{$capitalize( $p.t('abgabetool/c4newAbgabetermin') )}} + +
+
+
@@ -626,7 +735,7 @@ export const AbgabeMitarbeiterDetail = {
-
{{$capitalize( $p.t('abgabetool/c4fixterminv4') )}}
+
{{$capitalize( $p.t('abgabetool/c4fixterminv4') )}}
-
{{$capitalize( $p.t('abgabetool/c4zieldatum') )}}
+
{{$capitalize( $p.t('abgabetool/c4zieldatum') )}}
-
{{$capitalize( $p.t('abgabetool/c4abgabetyp') )}}
+
{{$capitalize( $p.t('abgabetool/c4abgabetyp') )}}
-
{{$capitalize( $p.t('abgabetool/c4upload_allowed') )}}
+
{{$capitalize( $p.t('abgabetool/c4upload_allowed') )}}
-
{{$capitalize( $p.t('abgabetool/c4note') )}}
+
{{$capitalize( $p.t('abgabetool/c4note') )}}
-
{{$capitalize( $p.t('abgabetool/c4notizQualGatev2') )}}
+
{{$capitalize( $p.t('abgabetool/c4notizQualGatev2') )}}
-
{{$capitalize( $p.t('abgabetool/c4abgabekurzbz') )}}
+
{{$capitalize( $p.t('abgabetool/c4abgabekurzbz') )}}
-
{{$capitalize( $p.t('abgabetool/c4abgabedatum') )}}
+
{{$capitalize( $p.t('abgabetool/c4abgabedatum') )}}