diff --git a/application/controllers/components/stv/Verband.php b/application/controllers/components/stv/Verband.php index f08419328..18ce5c999 100644 --- a/application/controllers/components/stv/Verband.php +++ b/application/controllers/components/stv/Verband.php @@ -68,6 +68,7 @@ class Verband extends FHC_Controller $this->StudiengangModel->addSelect('typ'); $this->StudiengangModel->addSelect('kurzbz'); $this->StudiengangModel->addSelect('studiengang_kz'); + $this->StudiengangModel->addSelect('studiengang_kz AS stg_kz'); $this->StudiengangModel->addOrder('erhalter_kz'); $this->StudiengangModel->addOrder('typ'); @@ -123,6 +124,7 @@ class Verband extends FHC_Controller $this->StudiengangModel->addSelect("CONCAT(UPPER(CONCAT(typ, kurzbz)), '-', semester, (SELECT CASE WHEN bezeichnung IS NULL OR bezeichnung='' THEN ''::TEXT ELSE CONCAT(' (', bezeichnung, ')') END FROM public.tbl_lehrverband WHERE studiengang_kz=v.studiengang_kz AND semester=v.semester ORDER BY verband, gruppe LIMIT 1)) AS name", false); $this->StudiengangModel->addSelect('semester'); + $this->StudiengangModel->addSelect($this->StudiengangModel->escape($studiengang_kz) . ' AS stg_kz', false); $this->StudiengangModel->addOrder('semester'); @@ -146,7 +148,7 @@ class Verband extends FHC_Controller array_unshift($list, [ 'name' => 'PreStudent', 'link' => $link . 'prestudent', - 'children' => $this->getStdSem($link . 'prestudent/') + 'children' => $this->getStdSem($link . 'prestudent/', $studiengang_kz) ]); if ($org_form === null) { @@ -211,6 +213,7 @@ class Verband extends FHC_Controller $this->GruppeModel->addSelect('sort'); $this->GruppeModel->addSelect('gruppe_kurzbz'); + $this->GruppeModel->addSelect($this->GruppeModel->escape($studiengang_kz) . ' AS stg_kz', false); $this->GruppeModel->addOrder('sort'); $this->GruppeModel->addOrder('gruppe_kurzbz'); @@ -243,6 +246,7 @@ class Verband extends FHC_Controller $this->StudiengangModel->addSelect("CASE WHEN MAX(gruppe)='' OR MAX(gruppe)=' ' THEN TRUE ELSE FALSE END AS leaf"); $this->StudiengangModel->addSelect('verband'); + $this->StudiengangModel->addSelect($this->StudiengangModel->escape($studiengang_kz) . ' AS stg_kz', false); $this->StudiengangModel->addOrder('verband'); @@ -293,6 +297,7 @@ class Verband extends FHC_Controller $this->StudiengangModel->addSelect("TRUE AS leaf", false); $this->StudiengangModel->addSelect('gruppe'); + $this->StudiengangModel->addSelect($this->StudiengangModel->escape($studiengang_kz) . ' AS stg_kz', false); $this->StudiengangModel->addOrder('gruppe'); @@ -320,10 +325,11 @@ class Verband extends FHC_Controller /** * @param string $link + * @param integer $studiengang_kz * * @return array */ - protected function getStdSem($link) + protected function getStdSem($link, $studiengang_kz) { $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); @@ -350,29 +356,35 @@ class Verband extends FHC_Controller $result[] = [ 'name' => $sem->studiensemester_kurzbz, 'link' => $semlink, + 'stg_kz' => $studiengang_kz, 'children' => [ [ 'name' => 'Interessenten', 'link' => $intlink, + 'stg_kz' => $studiengang_kz, 'children' => [ [ 'name' => 'Bewerbung nicht abgeschickt', 'link' => $intlink . '/bewerbungnichtabgeschickt', + 'stg_kz' => $studiengang_kz, 'leaf' => true ], [ 'name' => 'Bewerbung abgeschickt, Status unbestätigt', 'link' => $intlink . '/bewerbungabgeschickt', + 'stg_kz' => $studiengang_kz, 'leaf' => true ], [ 'name' => 'ZGV erfüllt', 'link' => $intlink . '/zgv', + 'stg_kz' => $studiengang_kz, 'leaf' => true ], [ 'name' => 'Status bestätigt', 'link' => $intlink . '/statusbestaetigt', + 'stg_kz' => $studiengang_kz, 'children' => [ [ 'name' => 'Nicht zum Reihungstest angemeldet', @@ -389,11 +401,13 @@ class Verband extends FHC_Controller [ 'name' => 'Nicht zum Reihungstest angemeldet', 'link' => $intlink . '/reihungstestnichtangemeldet', + 'stg_kz' => $studiengang_kz, 'leaf' => true ], [ 'name' => 'Reihungstest angemeldet', 'link' => $intlink . '/reihungstestangemeldet', + 'stg_kz' => $studiengang_kz, 'leaf' => true ] ] @@ -401,26 +415,31 @@ class Verband extends FHC_Controller [ 'name' => 'Bewerber', 'link' => $semlink . '/bewerber', + 'stg_kz' => $studiengang_kz, 'leaf' => true ], [ 'name' => 'Aufgenommen', 'link' => $semlink . '/aufgenommen', + 'stg_kz' => $studiengang_kz, 'leaf' => true ], [ 'name' => 'Warteliste', 'link' => $semlink . '/warteliste', + 'stg_kz' => $studiengang_kz, 'leaf' => true ], [ 'name' => 'Absage', 'link' => $semlink . '/absage', + 'stg_kz' => $studiengang_kz, 'leaf' => true ], [ 'name' => 'Incoming', 'link' => $semlink . '/incoming', + 'stg_kz' => $studiengang_kz, 'leaf' => true ] ] diff --git a/public/js/RESTClient.js b/public/js/RESTClient.js index 66e046af9..64949eee9 100644 --- a/public/js/RESTClient.js +++ b/public/js/RESTClient.js @@ -121,8 +121,8 @@ export const CoreRESTClient = { */ getError: function(response) { - if (typeof response[CORE_REST_CLIENT_RETVAL] === "object" - && Object.keys(response[CORE_REST_CLIENT_RETVAL]).length > 0 + if (typeof response === "object" + && Object.keys(response).length > 0 && response.hasOwnProperty(CORE_REST_CLIENT_RETVAL)) { return response[CORE_REST_CLIENT_RETVAL]; @@ -136,7 +136,7 @@ export const CoreRESTClient = { */ getErrorCode: function(response) { - if (typeof response[CORE_REST_CLIENT_RETVAL] === "object" && response.hasOwnProperty(CORE_REST_CLIENT_ERROR)) + if (typeof response === "object" && response.hasOwnProperty(CORE_REST_CLIENT_ERROR)) { return response[CORE_REST_CLIENT_ERROR]; } diff --git a/public/js/components/Form/Validation.js b/public/js/components/Form/Validation.js new file mode 100644 index 000000000..78408e8e8 --- /dev/null +++ b/public/js/components/Form/Validation.js @@ -0,0 +1,69 @@ +export default { + props: { + name: String + }, + data() { + return { + isValid: false, + isInvalid: false, + invalidFeedback: '' + }; + }, + methods: { + reset() { + this.isValid = false; + this.isInvalid = false; + this.invalidFeedback = ''; + }, + setValid() { + this.isValid = true; + }, + setInvalid(feedback) { + this.invalidFeedback = feedback?.detail || ''; + this.isInvalid = true; + } + }, + render() { + if (!this.$slots.default) + return Vue.h('div', { + 'data-fhc-form-error': true, + class: { + 'alert': true, + 'alert-danger': true, + 'd-none': !this.isInvalid + }, + role: 'alert', + onFhcFormReset: this.reset, + onFhcFormError: this.setInvalid + }, (this.invalidFeedback || []).map((txt, i) => Vue.h('p', { + key: i, + class: i+1 == (this.invalidFeedback || []).length ? 'mb-0' : '' + }, txt))); + + const res = this.$slots.default(); + const orig = res.shift(); + let options = { + 'data-fhc-form-validate': this.name, + onFhcFormReset: this.reset, + onFhcFormValidate: this.setValid, + onFhcFormInvalidate: this.setInvalid, + class: { + 'form-control': true, + 'is-valid': this.isValid, + 'is-invalid': this.isInvalid + } + }; + if (orig.type.__name == 'VueDatePicker') { + options.class['p-0'] = true; + options.inputClassName = 'border-0'; + } + res.unshift(Vue.cloneVNode(orig, options)); + + if (this.isInvalid && this.invalidFeedback && this.$slots.default) + res.push(Vue.h('div', { + class: 'invalid-feedback' + }, this.invalidFeedback)); + + return res; + }, +}; \ No newline at end of file diff --git a/public/js/components/Stv/Studentenverwaltung.js b/public/js/components/Stv/Studentenverwaltung.js index 0d1556f45..f2fd2ac36 100644 --- a/public/js/components/Stv/Studentenverwaltung.js +++ b/public/js/components/Stv/Studentenverwaltung.js @@ -80,6 +80,7 @@ export default { } } }, + studiengangKz: undefined, } }, computed: { @@ -88,7 +89,8 @@ export default { } }, methods: { - onSelectVerband(link) { + onSelectVerband({link, studiengang_kz}) { + this.studiengangKz = studiengang_kz; this.$refs.stvList.updateUrl(link); }, searchfunction(searchsettings) { @@ -124,7 +126,7 @@ export default {