From a105143771f74b05509706be56229832797dfe77 Mon Sep 17 00:00:00 2001 From: ma0068 Date: Fri, 1 Dec 2023 12:18:42 +0100 Subject: [PATCH 1/2] =?UTF-8?q?=C3=9Cberarbeitung=20Tab=20Kontakt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/components/stv/Kontakt.php | 187 ++-- .../Studentenverwaltung/Details/Kontakt.js | 44 +- .../Details/Kontakt/Address.js | 797 ++++++------------ .../Details/Kontakt/Bankaccount.js | 167 ++-- .../Details/Kontakt/Contact.js | 211 ++--- 5 files changed, 488 insertions(+), 918 deletions(-) diff --git a/application/controllers/components/stv/Kontakt.php b/application/controllers/components/stv/Kontakt.php index c63c8c25a..5ed9bc9ef 100644 --- a/application/controllers/components/stv/Kontakt.php +++ b/application/controllers/components/stv/Kontakt.php @@ -23,7 +23,7 @@ class Kontakt extends FHC_Controller public function getAdressen($person_id) { $this->load->model('person/Adresse_model', 'AdresseModel'); - //TODO(manu) check name: in Adresse und firma + $this->AdresseModel->addSelect('public.tbl_adresse.*'); $this->AdresseModel->addSelect('t.*'); $this->AdresseModel->addSelect('f.firma_id'); @@ -42,10 +42,11 @@ class Kontakt extends FHC_Controller } } + //old version public function addNewAddress($person_id) { $this->load->library('form_validation'); - $_POST = json_decode(utf8_encode($this->input->raw_input_stream), true); + $_POST = json_decode($this->input->raw_input_stream, true); $this->form_validation->set_rules('plz', 'PLZ', 'required|numeric'); @@ -94,7 +95,6 @@ class Kontakt extends FHC_Controller ] ); - if (isError($result)) { $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR); @@ -103,6 +103,63 @@ class Kontakt extends FHC_Controller return $this->outputJsonSuccess(true); } + //Version mit input->post() TODO(Manu) check mit Chris, not working +/* public function addNewAddress($person_id) + { + $this->load->library('form_validation'); + //$_POST = json_decode($this->input->raw_input_stream, true); + + + $this->load->model('person/Adresse_model', 'AdresseModel'); + + $uid = getAuthUID(); + + $data = [ + 'insertvon' => $uid, + 'insertamum' => date('c'), + 'plz' => $this->input->post('plz'), + 'heimatadresse' => $this->input->post('heimatadresse'), + 'zustelladresse' => $this->input->post('zustelladresse'), + 'rechnungsadresse' => $this->input->post('rechnungsadresse') + ]; + + + $this->form_validation->set_rules('plz', 'PLZ', 'required|numeric'); + + if ($this->form_validation->run() == false) + { + return $this->outputJsonError($this->form_validation->error_array()); + } + + + if ($this->input->post('co_name')) + $data['co_name'] = $this->input->post('co_name'); + if ($this->input->post('strasse')) + $data['strasse'] = $this->input->post('strasse'); + if ($this->input->post('ort')) + $data['ort'] = $this->input->post('ort'); + if ($this->input->post('gemeinde')) + $data['gemeinde'] = $this->input->post('gemeinde'); + if ($this->input->post('nation')) + $data['nation'] = $this->input->post('nation'); + if ($this->input->post('name')) + $data['name'] = $this->input->post('name'); + if ($this->input->post('typ')) + $data['typ'] = $this->input->post('typ'); + if ($this->input->post('anmerkung')) + $data['anmerkung'] = $this->input->post('anmerkung'); + if ($this->input->post('firma')) + $data['firma_id'] = $this->input->post('firma_id'); + + $result = $this->AdresseModel->insert($data); + if (isError($result)) + { + $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR); + return $this->outputJson($result); + } + return $this->outputJsonSuccess(true); + }*/ + public function updateAddress($address_id) { $uid = getAuthUID(); @@ -140,9 +197,10 @@ class Kontakt extends FHC_Controller $typ = isset($_POST['typ']) ? $_POST['typ'] : null; $anmerkung = isset($_POST['anmerkung']) ? $_POST['anmerkung'] : null; - $result = $this->AdresseModel->update([ + $result = $this->AdresseModel->update( + [ 'adresse_id' => $address_id - ], + ], [ 'person_id' => $person_id, 'strasse' => $strasse, 'updatevon' => $uid, @@ -159,7 +217,8 @@ class Kontakt extends FHC_Controller 'name' => $name, 'rechnungsadresse' => $_POST['rechnungsadresse'], 'anmerkung' => $anmerkung - ]); + ] + ); if (isError($result)) { @@ -218,22 +277,6 @@ class Kontakt extends FHC_Controller return $this->outputJsonSuccess(current(getData($result))); } -/* TODO Manu bereits in Address.ph*/ - public function getNations() - { - $this->load->model('codex/Nation_model', 'NationModel'); - - $this->NationModel->addOrder('kurztext'); - - $result = $this->NationModel->load(); - if (isError($result)) { - $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR); - $this->outputJson(getError($result)); - } else { - $this->outputJson(getData($result) ?: []); - } - } - public function getAdressentypen() { $this->load->model('person/Adressentyp_model', 'AdressentypModel'); @@ -269,82 +312,6 @@ class Kontakt extends FHC_Controller $this->outputJson($result); } - public function getFirmenliste($searchString) //TODO (manu) DEPRECATED - { - $this->load->model('ressource/firma_model', 'FirmaModel'); - - $result = $this->FirmaModel->load(); - if (isError($result)) { - $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR); - $this->outputJson(getError($result)); - } else { - $this->outputJson(getData($result) ?: []); - } - } - - /** - * Get Array of Names of Ortschaften having plz - * @param string $plz Postleitzahl - * @return array $result[] - */ - public function getOrtschaften($plz, $gemeinde=null) - { - $this->load->model('person/Adresse_model', 'AdresseModel'); - - //$ort = isset($ortschaft) ? $ortschaft : null; - if(isset($gemeinde)) {var_dump($gemeinde); - $gemeinde = urldecode($gemeinde); - } - else - $gemeinde = null; - - $this->load->library('form_validation'); - - $this->form_validation->set_rules($plz, 'PLZ', 'numeric|less_than[10000]'); - if ($this->form_validation->run() == false) { - return $this->outputJsonError($this->form_validation->error_array()); -/* $this->output->set_status_header(REST_Controller::HTTP_BAD_REQUEST); - return $this->outputJsonError($this->form_validation->error_array());*/ - } - - $result = $this->AdresseModel->getOrtschaften($plz, $gemeinde); - if (isError($result)) { - $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR); - $this->outputJson($result); - } - elseif (!hasData($result)) { - $this->outputJson($result); - } - else - { - $this->outputJsonSuccess(getData($result)); - } - } - - /** - * Get Array of Names of Gemeinden having plz - * @param string $plz Postleitzahl - * @return array $result[] - */ - function getGemeinden($plz) - { - $this->load->model('person/Adresse_model', 'AdresseModel'); - - $result = $this->AdresseModel->getGemeinden($plz); - if (isError($result)) { - $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR); - $this->outputJson($result); - } - elseif (!hasData($result)) { - $this->outputJson($result); //success mit Wert null - // $this->outputJson(getData($result) ?: []); - } - else - { - $this->outputJsonSuccess(getData($result)); - } - } - public function getKontakte($person_id) { $this->load->model('person/Kontakt_model', 'KontaktModel'); @@ -492,9 +459,10 @@ class Kontakt extends FHC_Controller $ext_id = isset($_POST['ext_id']) ? $_POST['ext_id'] : null; $person_id = isset($_POST['person_id']) ? $_POST['person_id'] : null; - $result = $this->KontaktModel->update([ + $result = $this->KontaktModel->update( + [ 'kontakt_id' => $kontakt_id - ], + ], [ 'person_id' => $person_id, 'kontakttyp' => $kontakttyp, @@ -505,7 +473,8 @@ class Kontakt extends FHC_Controller 'insertamum' => date('c'), 'standort_id' => $standort_id, 'ext_id' => $ext_id - ]); + ] + ); if (isError($result)) { @@ -529,7 +498,7 @@ class Kontakt extends FHC_Controller $this->outputJson($result); } elseif (!hasData($result)) { - $this->outputJson($result); //success mit Wert null + $this->outputJson($result); } return $this->outputJsonSuccess(current(getData($result))); } @@ -630,7 +599,6 @@ class Kontakt extends FHC_Controller public function updateBankverbindung($bankverbindung_id) { - $this->load->library('form_validation'); $_POST = json_decode(utf8_encode($this->input->raw_input_stream), true); @@ -651,9 +619,10 @@ class Kontakt extends FHC_Controller $uid = getAuthUID(); - $result = $this->BankverbindungModel->update([ + $result = $this->BankverbindungModel->update( + [ 'bankverbindung_id' => $bankverbindung_id - ], + ], [ 'person_id' => $_POST['person_id'], 'name' => $_POST['name'], @@ -669,7 +638,8 @@ class Kontakt extends FHC_Controller 'ext_id' => $_POST['ext_id'], 'oe_kurzbz' => $_POST['oe_kurzbz'], 'orgform_kurzbz' => $_POST['orgform_kurzbz'] - ]); + ] + ); if (isError($result)) { @@ -693,11 +663,8 @@ class Kontakt extends FHC_Controller $this->outputJson($result); } elseif (!hasData($result)) { - $this->outputJson($result); //success mit Wert null + $this->outputJson($result); } return $this->outputJsonSuccess(current(getData($result))); } - - - } diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Kontakt.js b/public/js/components/Stv/Studentenverwaltung/Details/Kontakt.js index f8d30a5a6..cfd4eec03 100644 --- a/public/js/components/Stv/Studentenverwaltung/Details/Kontakt.js +++ b/public/js/components/Stv/Studentenverwaltung/Details/Kontakt.js @@ -1,4 +1,3 @@ -import {CoreRESTClient} from '../../../../RESTClient.js'; import AddressList from "./Kontakt/Address.js"; import ContactList from "./Kontakt/Contact.js"; import BankaccountList from "./Kontakt/Bankaccount.js"; @@ -10,8 +9,6 @@ export default { AddressList, ContactList, BankaccountList, - PvToast, - PvAutoComplete }, props: { student: Object @@ -23,57 +20,20 @@ export default { bankverbindungen: [] } }, - created(){ - CoreRESTClient - .get('components/stv/Kontakt/getAdressen/' + this.student.person_id) - .then(result => { - this.adressen = result.data; - }) - .catch(err => { - console.error(err.response.data || err.message); - }); - /* CoreRESTClient - .get('components/stv/Kontakt/getKontakte/' + this.student.person_id) - .then(result => { - this.kontakte = result.data; - }) - .catch(err => { - console.error(err.response.data || err.message); - }); - CoreRESTClient - .get('components/stv/Kontakt/getBankverbindung/' + this.student.person_id) - .then(result => { - this.bankverbindungen = result.data; - }) - .catch(err => { - console.error(err.response.data || err.message); - });*/ - }, template: `
- - - - Adressen - - - - - - + Adressen +

Kontakt -

Bankverbindungen -
` diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Kontakt/Address.js b/public/js/components/Stv/Studentenverwaltung/Details/Kontakt/Address.js index f3425cc5f..486e17fbe 100644 --- a/public/js/components/Stv/Studentenverwaltung/Details/Kontakt/Address.js +++ b/public/js/components/Stv/Studentenverwaltung/Details/Kontakt/Address.js @@ -2,18 +2,16 @@ import {CoreFilterCmpt} from "../../../../filter/Filter.js"; import {CoreRESTClient} from "../../../../../RESTClient"; import PvAutoComplete from "../../../../../../../index.ci.php/public/js/components/primevue/autocomplete/autocomplete.esm.min.js"; import FhcFormValidation from '../../../../Form/Validation.js'; -/*import PvToast from "../../../../../../index.ci.php/public/js/components/primevue/toast/toast.esm.min.js";*/ import BsModal from "../../../../Bootstrap/Modal.js"; -var editIcon = function(cell, formatterParams){ //plain text value +var editIcon = function (cell, formatterParams) { return ""; }; -var deleteIcon = function(cell, formatterParams){ //plain text value +var deleteIcon = function (cell, formatterParams) { return ""; }; - export default{ components: { CoreFilterCmpt, @@ -24,9 +22,6 @@ export default{ props: { uid: String }, -/* emits: [ - 'update:selected' - ],*/ data() { return{ tabulatorOptions: { @@ -42,11 +37,12 @@ export default{ {title:"Heimatadresse", field:"heimatadresse", formatter: (cell, formatterParams, onRendered) => { let output = cell.getValue() ? "ja" : "nein"; - return output;} + return output; + } }, {title:"Abweich.Empf", field:"co_name"}, {title:"Name", field:"name"}, - {title:"Firma", field:"firmenname"}, //TODO(manu) check in DB + {title:"Firma", field:"firmenname"}, {title:"Firma_id", field:"firma_id", visible:false}, {title:"Adresse_id", field:"adresse_id", visible:false}, {title:"Person_id", field:"person_id", visible:false}, @@ -55,21 +51,16 @@ export default{ {title:"Rechnungsadresse", field:"rechnungsadresse", visible:false, formatter: (cell, formatterParams, onRendered) => { let output = cell.getValue() ? "ja" : "nein"; - return output;} + return output; + } }, {title:"Anmerkung", field:"anmerkung", visible:false}, -/* {title: "Actions", - columns:[*/ - {formatter:editIcon, width:40, align:"center", cellClick: (e, cell) => { - this.actionEditAdress(cell.getData().adresse_id); - console.log(cell.getRow().getIndex(), cell.getData(), this); - }, width:50, headerSort:false}, - {formatter:deleteIcon, width:40, align:"center", cellClick: (e, cell) => { - this.actionDeleteAdress(cell.getData().adresse_id); - console.log(cell.getRow().getIndex(), cell.getData(), this); - }, width:50, headerSort:false }, -/* ], - },*/ + {formatter:editIcon, width:40, align:"center", cellClick: (e, cell) => { + this.actionEditAdress(cell.getData().adresse_id); + }, width:50, headerSort:false}, + {formatter:deleteIcon, width:40, align:"center", cellClick: (e, cell) => { + this.actionDeleteAdress(cell.getData().adresse_id); + }, width:50, headerSort:false }, ], layout: 'fitDataFill', layoutColumnsOnNewData: false, @@ -77,11 +68,8 @@ export default{ selectable: true, index: 'adresse_id', }, - tabulatorEvents: [ - - ], - addressData: {}, - formData: { + tabulatorEvents: [], + addressData: { zustelladresse: true, heimatadresse: true, rechnungsadresse: false, @@ -95,27 +83,37 @@ export default{ typ: 'h', nation: 'A' }, + places: [], + suggestions: {}, nations: [], adressentypen: [], firmen: [], - ortschaften: [], - gemeinden: [], - filteredFirmen: [] + filteredFirmen: [], + abortController: { + suggestions: null, + places: null + } } }, computed:{ - + orte() { + return this.places.filter(ort => ort.name == this.addressData.gemeinde); + }, + gemeinden() { + return Object.values(this.places.reduce((res,place) => { + res[place.name] = place; + return res; + }, {})); + } }, methods:{ actionNewAdress(){ - /*bootstrap.Modal.getOrCreateInstance(this.$refs.newAdressModal).show();*/ this.$refs.newAdressModal.show(); }, actionEditAdress(adress_id){ this.loadAdress(adress_id).then(() => { if(this.addressData.adresse_id) this.$refs.editAdressModal.show(); -/* bootstrap.Modal.getOrCreateInstance(this.$refs.editAdressModal).show();*/ }); }, actionDeleteAdress(adress_id){ @@ -125,12 +123,11 @@ export default{ this.$fhcAlert.alertError("Heimatadressen dürfen nicht gelöscht werden, da diese für die BIS-Meldung relevant sind. Um die Adresse dennoch zu löschen, entfernen sie das Häkchen bei Heimatadresse!"); else this.$refs.deleteAdressModal.show(); -/* bootstrap.Modal.getOrCreateInstance(this.$refs.deleteAdressModal).show();*/ }); }, - addNewAddress(formData) { + addNewAddress(addressData) { CoreRESTClient.post('components/stv/Kontakt/addNewAddress/' + this.uid, - this.formData + this.addressData ).then(response => { if (!response.data.error) { this.$fhcAlert.alertSuccess('Speichern erfolgreich'); @@ -140,41 +137,32 @@ export default{ const errorData = response.data.retval; Object.entries(errorData).forEach(entry => { const [key, value] = entry; - console.log(key, value); this.$fhcAlert.alertError(value); - /*this.$fhcAlert.handleFormValidation(error, this.$refs.newAdressModal);*/ }); } }).catch(error => { - console.log(error); - this.statusCode = 0; - this.statusMsg = 'Error in Catch'; - console.log('Speichern nicht erfolgreich ' + this.statusMsg); this.$fhcAlert.alertError('Fehler bei Speicherroutine aufgetreten'); }).finally(() => { window.scrollTo(0, 0); this.reload(); }); - - //this.formData = []; }, reload(){ this.$refs.table.reloadTable(); }, loadAdress(adress_id){ - return CoreRESTClient.get('components/stv/Kontakt/loadAddress/' + adress_id - ).then( - result => { - console.log(this.addressData, result); - if(result.data.retval) - this.addressData = result.data.retval; - else - { - this.addressData = {}; - this.$fhcAlert.alertError('Keine Adresse mit Id ' + adress_id + ' gefunden'); + return CoreRESTClient.get('components/stv/Kontakt/loadAddress/' + adress_id) + .then( + result => { + if(result.data.retval) + this.addressData = result.data.retval; + else + { + this.addressData = {}; + this.$fhcAlert.alertError('Keine Adresse mit Id ' + adress_id + ' gefunden'); + } + return result; } - return result; - } ); }, updateAddress(adress_id){ @@ -189,102 +177,62 @@ export default{ const errorData = response.data.retval; Object.entries(errorData).forEach(entry => { const [key, value] = entry; - console.log(key, value); this.$fhcAlert.alertError(value); }); } }).catch(error => { this.statusMsg = 'Error in Catch'; - console.log('Speichern nicht erfolgreich ' + this.statusMsg); this.$fhcAlert.alertError('Fehler bei Speicherroutine aufgetreten'); }).finally(() => { window.scrollTo(0, 0); - //hideModal(); this.reload(); }); }, deleteAddress(adress_id){ CoreRESTClient.post('components/stv/Kontakt/deleteAddress/' + adress_id) .then(response => { - console.log(response); if (!response.data.error) { - this.statusCode = 0; - this.statusMsg = 'success'; - console.log('Löschen erfolgreich: ' + this.statusMsg); this.$fhcAlert.alertSuccess('Löschen erfolgreich'); } else { - this.statusCode = 0; - this.statusMsg = 'Error'; - console.log('Löschen nicht erfolgreich: ' + this.statusMsg); this.$fhcAlert.alertError('Keine Adresse mit Id ' + adress_id + ' gefunden'); } }).catch(error => { - console.log(error); - this.statusCode = 0; - this.statusMsg = 'Error in Catch'; - console.log('Löschen nicht erfolgreich ' + this.statusMsg); - this.$fhcAlert.alertError('Fehler bei Löschroutine aufgetreten'); - }).finally(()=> { - window.scrollTo(0, 0); - this.hideModal('deleteAdressModal'); - this.reload(); - }); + this.$fhcAlert.alertError('Fehler bei Löschroutine aufgetreten'); + }).finally(()=> { + window.scrollTo(0, 0); + this.hideModal('deleteAdressModal'); + this.reload(); + }); }, - getGemeinden(searchString){ - return CoreRESTClient.get('components/stv/Kontakt/getGemeinden/' + searchString - ).then( - result => { - if(result.data.retval) - this.gemeinden = result.data.retval; - else - { - this.gemeinden = {}; - this.$fhcAlert.alertError('Keine Gemeinde mit PLZ ' + plz + ' gefunden'); - } - return result; - } - ); - }, - getOrtschaften(searchString){ - return CoreRESTClient.get('components/stv/Kontakt/getOrtschaften/' + searchString - ).then( - result => { - if(result.data.retval) - this.ortschaften = result.data.retval; - else - { - this.ortschaften = {}; - //this.$fhcAlert.alertError('Keine Ortschaft mit PLZ ' + plz + ' gefunden'); - } - return result; - } - ); - }, - getPlaces(plz){ + loadPlaces() { + if (this.abortController.places) + this.abortController.places.abort(); + if (this.addressData.nation != 'A' || !this.addressData.plz) + return; + + this.abortController.places = new AbortController(); CoreRESTClient - .get('components/stv/address/getPlaces/' + this.formData.address.plz, undefined, { + .get('components/stv/address/getPlaces/' + this.addressData.plz, undefined, { signal: this.abortController.places.signal }) .then(result => CoreRESTClient.getData(result.data) || []) .then(result => { this.places = result; - }) - .catch(error => { + }); +/* .catch(error => { if (error.code == 'ERR_BAD_REQUEST') { return this.$fhcAlert.handleFormValidation(error, this.$refs.form); } // NOTE(chris): repeat request if (error.code != "ERR_CANCELED") window.setTimeout(this.loadPlaces, 100); - }); + });*/ }, search(event) { - //console.log(event.query); return CoreRESTClient .get('components/stv/Kontakt/getFirmen/' + event.query) .then(result => { this.filteredFirmen = CoreRESTClient.getData(result.data); - //return firma.name.toLowerCase().startsWith(event.query.toLowerCase()); }); }, reload(){ @@ -294,20 +242,11 @@ export default{ this.$refs[modalRef].hide(); }, resetModal(){ - this.formData = {}; - this.formData = this.initData; this.addressData = {}; + this.addressData = this.initData; }, }, created(){ -/* CoreRESTClient - .get('components/stv/Address/getNations') - .then(result => { - this.nations = result.data[]; - }) - .catch(err => { - console.error(err.response.data || err.message); - });*/ CoreRESTClient .get('components/stv/Address/getNations') .then(result => CoreRESTClient.getData(result.data) || []) @@ -324,471 +263,267 @@ export default{ console.error(err.response.data || err.message); }); }, - template: ` + template: `
-
+
-
-
-
+
-
- +
+
-
+
-
-
-
- -
+
+ +
-
- -
-
- -
- -
- -
-
-
- -
-
-
- -
- -
- -
-
- -
-
-
- -
-
-
- -
- -
-
- -
-
-
- -
- -
-
- -
-
-
- -
- -
- -
-
- -
- -
-
- -
-
-
- -
- -
- -
-
- -
- -
- -
-
-
- -
- -
-
- - - - - - - - - - - - - + -
+
@@ -290,27 +252,27 @@ export default{
-
+
-
-
+
+
-
+
-
+
-
-
+
+
@@ -318,11 +280,11 @@ export default{
-
+
-
-
+
+ - - + + + - - - - ` -}; - +}; \ No newline at end of file From 4fb8bdd5d958eb523cc076e291089fac0c3b7d5c Mon Sep 17 00:00:00 2001 From: ma0068 Date: Fri, 1 Dec 2023 12:47:53 +0100 Subject: [PATCH 2/2] PV Autocomplete --- .../Stv/Studentenverwaltung/Details/Kontakt/Address.js | 2 +- .../Stv/Studentenverwaltung/Details/Kontakt/Contact.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Kontakt/Address.js b/public/js/components/Stv/Studentenverwaltung/Details/Kontakt/Address.js index 486e17fbe..3f6f5eb42 100644 --- a/public/js/components/Stv/Studentenverwaltung/Details/Kontakt/Address.js +++ b/public/js/components/Stv/Studentenverwaltung/Details/Kontakt/Address.js @@ -359,7 +359,7 @@ export default{
-
+
diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Kontakt/Contact.js b/public/js/components/Stv/Studentenverwaltung/Details/Kontakt/Contact.js index 7eca55692..27d84bc34 100644 --- a/public/js/components/Stv/Studentenverwaltung/Details/Kontakt/Contact.js +++ b/public/js/components/Stv/Studentenverwaltung/Details/Kontakt/Contact.js @@ -278,7 +278,7 @@ export default{
-
+