From 5c9e1b3fd36ac56238b352964e6d6e571d2c4a2c Mon Sep 17 00:00:00 2001 From: cgfhtw Date: Wed, 17 Jan 2024 15:28:39 +0100 Subject: [PATCH] Use new Form Components in Details --- .../controllers/components/stv/Student.php | 7 +- public/js/components/Form/Input.js | 20 +- public/js/components/Form/Upload/Image.js | 18 +- .../Studentenverwaltung/Details/Details.js | 512 ++++++++++-------- 4 files changed, 329 insertions(+), 228 deletions(-) diff --git a/application/controllers/components/stv/Student.php b/application/controllers/components/stv/Student.php index 88627ca03..ddfd95aed 100644 --- a/application/controllers/components/stv/Student.php +++ b/application/controllers/components/stv/Student.php @@ -77,6 +77,7 @@ class Student extends FHC_Controller $this->form_validation->set_rules('semester', 'Semester', 'integer'); if ($this->form_validation->run() == false) { + $this->output->set_status_header(REST_Controller::HTTP_BAD_REQUEST); return $this->outputJsonError($this->form_validation->error_array()); } @@ -202,7 +203,11 @@ class Student extends FHC_Controller } } - $this->outputJsonSuccess(true); + $this->outputJson(success(array_fill_keys(array_merge( + array_keys($update_lehrverband), + array_keys($update_person), + array_keys($update_student) + ), ''), 1)); } public function check() diff --git a/public/js/components/Form/Input.js b/public/js/components/Form/Input.js index 46ddbd3c5..8bdff639b 100644 --- a/public/js/components/Form/Input.js +++ b/public/js/components/Form/Input.js @@ -14,7 +14,8 @@ export default { bsFeedback: Boolean, noAutoClass: Boolean, type: String, - name: String + name: String, + containerClass: [String, Array, Object] }, data() { return { @@ -23,6 +24,13 @@ export default { } }, computed: { + hasContainer() { + if (!this.bsFeedback) + return true; + if (this.containerClass) + return true; + return false; + }, lcType() { if (!this.type) return 'text'; @@ -37,6 +45,8 @@ export default { return 'VueDatePicker'; case 'autocomplete': return 'PvAutocomplete'; + case 'uploadimage': + return 'UploadImage'; default: return 'input'; } @@ -133,7 +143,9 @@ export default { if (this.tag == 'VueDatePicker' && !this._.components.VueDatePicker) { this._.components.VueDatePicker = Vue.defineAsyncComponent(() => import("../vueDatepicker.js.php")); } else if (this.tag == 'PvAutocomplete' && !this._.components.PvAutocomplete) { - this._.components.PvAutocomplete = Vue.defineAsyncComponent(() => import(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + "/public/js/components/primevue/autocomplete/autocomplete.esm.min.js"));; + this._.components.PvAutocomplete = Vue.defineAsyncComponent(() => import(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + "/public/js/components/primevue/autocomplete/autocomplete.esm.min.js")); + } else if (this.tag == 'UploadImage' && !this._.components.UploadImage) { + this._.components.UploadImage = Vue.defineAsyncComponent(() => import("./Upload/Image.js")); } } }, @@ -149,7 +161,7 @@ export default { // TODO(chris): wrap check in div? }, template: ` - + @@ -197,7 +209,7 @@ export default { > -
+
- +
` } \ No newline at end of file diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Details.js b/public/js/components/Stv/Studentenverwaltung/Details/Details.js index ebbd68dd2..0c988179f 100644 --- a/public/js/components/Stv/Studentenverwaltung/Details/Details.js +++ b/public/js/components/Stv/Studentenverwaltung/Details/Details.js @@ -1,16 +1,14 @@ -import VueDatePicker from '../../../vueDatepicker.js.php'; -import FormUploadImage from '../../../Form/Upload/Image.js'; import {CoreRESTClient} from '../../../../RESTClient.js'; - - -import PvToast from "../../../../../../index.ci.php/public/js/components/primevue/toast/toast.esm.min.js"; +import FormForm from '../../../Form/Form.js'; +import FormInput from '../../../Form/Input.js'; +import FormUploadImage from '../../../Form/Upload/Image.js'; export default { components: { - VueDatePicker, - FormUploadImage, - PvToast + FormForm, + FormInput, + FormUploadImage }, inject: { showBpk: { @@ -62,6 +60,9 @@ export default { }, changedLength() { return Object.keys(this.changed).length; + }, + noImageSrc() { + return FHC_JS_DATA_STORAGE_OBJECT.app_root + 'skin/images/profilbild_dummy.jpg'; } }, watch: { @@ -69,6 +70,7 @@ export default { this.updateStudent(n); }, data: { + // TODO(chris): use @input instead? handler(n) { let res = {}; for (var k in this.original) { @@ -82,7 +84,6 @@ export default { } } this.changed = res; - this.resetErrors(); }, deep: true } @@ -98,213 +99,264 @@ export default { this.data.familienstand = ''; this.original = {...this.data}; }) - .catch(err => { - console.error(err.response.data || err.message); - }); + .catch(this.$fhcAlert.handleSystemError); }, save() { - CoreRESTClient - .post('components/stv/Student/save/' + this.modelValue.prestudent_id, this.changed) - .then(result => result.data) + this.$refs.form + .send(CoreRESTClient.post('components/stv/Student/save/' + this.modelValue.prestudent_id, this.changed)) .then(result => { - this.resetErrors(); - if (CoreRESTClient.isError(result)) { - let errors = CoreRESTClient.getError(result); - - if (errors === "Generic error") - console.error(errors, result); - else { - for (var k in errors) - this.addError(k, errors[k]); - } - } else { - for (var node of document.querySelectorAll(Object.keys(this.changed).map(el => '#stv-details-' + el).join(','))) - node.classList.add('is-valid'); - if (this.changed.gebdatum !== undefined) - this.gebDatumIsValid = true; - - // TODO(chris): phrase - this.$fhcAlert.alertSuccess('Gespeichert'); - //this.addToast('Gespeichert', '', 'success'); - - this.original = {...this.data}; - this.changed = {}; - } + this.original = {...this.data}; + this.changed = {}; }) - .catch(this.$fhcAlert.handleSystemError/*err => { - // TODO(chris): phrase - this.addToast('Error', err?.response?.data || err?.message, 'error'); - }*/); - }, - resetErrors() { - Array.from(this.$refs.form.getElementsByClassName('is-valid')).forEach(el => el.classList.remove('is-valid')); - Array.from(this.$refs.form.getElementsByClassName('is-invalid')).forEach(el => el.classList.remove('is-invalid')); - Array.from(this.$refs.form.getElementsByClassName('invalid-feedback')).forEach(el => el.remove()); - this.gebDatumIsValid = false; - this.gebDatumIsInvalid = false; - }, - addError(field, msg) { - let id = 'stv-details-' + field; - - let input = document.getElementById(id); - if (field === 'gebdatum') { - this.gebDatumIsInvalid = true; - input = document.getElementById('dp-input-' + id).parentNode; - } - - input.classList.add('is-invalid'); - - let feedback = document.createElement('div'); - feedback.classList.add('invalid-feedback'); - feedback.innerHTML = msg; - input.after(feedback); - /*}, - addToast(header, msg, severity) { - this.$refs.responseToast.add({ - severity: severity, - summary: header, - detail: msg, - life: 3000 - })*/ + .catch(this.$fhcAlert.handleSystemError); } }, created() { this.updateStudent(this.modelValue); }, + //TODO(chris): Phrasen //TODO(chris): Geburtszeit? Anzahl der Kinder? template: ` -
-
+ +
Person
@@ -315,47 +367,79 @@ export default { StudentIn
Loading...
- - ` +
` }; \ No newline at end of file