From 1ac09ad02d01d0e44504d71caa273cf3d0f563ee Mon Sep 17 00:00:00 2001 From: oetrb <oetrb@github.com> Date: Sun, 11 Oct 2020 22:58:56 +0200 Subject: [PATCH] added student --- package-lock.json | 173 +++++++-------- src/components/SideMenu.vue | 3 + src/components/Student.vue | 361 ++++++++++++++++++++++++++++++++ src/models/student.js | 19 ++ src/router.js | 6 + src/services/student.service.js | 111 ++++++++++ src/store/student.module.js | 98 +++++++++ src/store/teacher.module.js | 1 - 8 files changed, 687 insertions(+), 85 deletions(-) create mode 100644 src/components/Student.vue create mode 100644 src/models/student.js create mode 100644 src/services/student.service.js create mode 100644 src/store/student.module.js diff --git a/package-lock.json b/package-lock.json index 6c4e69a..2f1eb88 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1777,16 +1777,6 @@ "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", "dev": true }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "optional": true, - "requires": { - "color-convert": "^2.0.1" - } - }, "cacache": { "version": "13.0.1", "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", @@ -1813,34 +1803,6 @@ "unique-filename": "^1.1.1" } }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "optional": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "optional": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "optional": true - }, "find-cache-dir": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", @@ -1862,25 +1824,6 @@ "path-exists": "^4.0.0" } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "optional": true - }, - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "optional": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -1945,16 +1888,6 @@ "minipass": "^3.1.1" } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "optional": true, - "requires": { - "has-flag": "^4.0.0" - } - }, "terser-webpack-plugin": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.8.tgz", @@ -1971,18 +1904,6 @@ "terser": "^4.6.12", "webpack-sources": "^1.4.3" } - }, - "vue-loader-v16": { - "version": "npm:vue-loader@16.0.0-beta.8", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.0.0-beta.8.tgz", - "integrity": "sha512-oouKUQWWHbSihqSD7mhymGPX1OQ4hedzAHyvm8RdyHh6m3oIvoRF+NM45i/bhNOlo8jCnuJhaSUf/6oDjv978g==", - "dev": true, - "optional": true, - "requires": { - "chalk": "^4.1.0", - "hash-sum": "^2.0.0", - "loader-utils": "^2.0.0" - } } } }, @@ -9249,11 +9170,6 @@ "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", "dev": true }, - "qs": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", - "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==" - }, "query-string": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", @@ -9584,6 +9500,14 @@ "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + } } }, "require-directory": { @@ -11467,6 +11391,87 @@ } } }, + "vue-loader-v16": { + "version": "npm:vue-loader@16.0.0-beta.8", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.0.0-beta.8.tgz", + "integrity": "sha512-oouKUQWWHbSihqSD7mhymGPX1OQ4hedzAHyvm8RdyHh6m3oIvoRF+NM45i/bhNOlo8jCnuJhaSUf/6oDjv978g==", + "dev": true, + "optional": true, + "requires": { + "chalk": "^4.1.0", + "hash-sum": "^2.0.0", + "loader-utils": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "optional": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "optional": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "optional": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "optional": true + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "optional": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "optional": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "vue-password": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/vue-password/-/vue-password-3.0.0.tgz", diff --git a/src/components/SideMenu.vue b/src/components/SideMenu.vue index 4711ac5..5e81e2e 100644 --- a/src/components/SideMenu.vue +++ b/src/components/SideMenu.vue @@ -4,6 +4,9 @@ <img class="natlab-logo col-md-12" id="natlab-logo" src="../assets/natlab-logo.png" alt="NatLab Logo"> <br> <div> + <li :class="[currentPage.includes('students') ? activeClass: '', 'navButton']"> + <router-link style="margin-bottom: -25px;" to="/students" class="navA">Studentenübersicht</router-link><br> + </li> <li style="margin-top: 50px;" :class="[currentPage.includes('courses') ? activeClass: '', 'navButton']"> <router-link style="margin-bottom: -25px;" to="/courses" class="navA">Kursübersicht</router-link><br> </li> diff --git a/src/components/Student.vue b/src/components/Student.vue new file mode 100644 index 0000000..d3fc5d2 --- /dev/null +++ b/src/components/Student.vue @@ -0,0 +1,361 @@ +<template> + <div class="card"> + <div class="content col-md-12"> + <div id="search_box" class="search_box col-md-4"> + <div class="entry_box-inner"> + {{checkedBoxes}} + <a id="editbutton" class="button" href="./editstudent" style="visibility: hidden">Eintrag bearbeiten</a> + <a id="addbutton" class="button" href="./createstudent">neuen Eintrag hinzufügen</a> + <a id="deletebutton" class="button" @click="deleterows">ausgewählte Einträge löschen</a> + <a id="exportbutton" class="button" @click="exportExcel">Tabelle exportieren</a> + </div> + <div class="search_box-inner"> + <i><img src="../assets/search.svg"></i> + <input id="inpt_search" v-model="filter" type="text" class="search__input" placeholder="Suchen..." /> + </div> + </div> + <table id="Table"> + <tr> + <th scope="row"> + <div class="form-check"> + <input name="checkbox" type="checkbox" class="form-check-input" id="checkbox_headerline" @click="checkAllBoxes"> + <label class="form-check-label" for="checkbox_headerline"></label> + </div> + </th> + <th v-on:click="sortTable('imgsortanrede')"><img id="imgsortanrede" :src="require('../assets/'+sortImg)">Anrede</th> + <th v-on:click="sortTable('imgsortfirstname')"><img id="imgsortcoursename" :src="require('../assets/'+sortImg)">Vorname</th> + <th v-on:click="sortTable('imgsortlastname')"><img id="imgsorteventtype" :src="require('../assets/'+sortImg)">Nachname</th> + <th v-on:click="sortTable('imgsortstreet')"><img id="imgsortcoursedate" :src="require('../assets/'+sortImg)">Straße</th> + <th v-on:click="sortTable('imgsortzip')"><img id="imgsorttopic" :src="require('../assets/'+sortImg)">Postleitzahl</th> + <th v-on:click="sortTable('imgsortcity')"><img id="imgsortcourselocation" :src="require('../assets/'+sortImg)">Ort</th> + <th v-on:click="sortTable('imgsortsommeruni_17')"><img id="imgsortsommeruni_17" :src="require('../assets/'+sortImg)">SommerUni 17</th> + <th v-on:click="sortTable('imgsortsommeruni_18')"><img id="imgsortsommeruni_18" :src="require('../assets/'+sortImg)">SommerUni 18</th> + <th v-on:click="sortTable('imgsortsommeruni_19')"><img id="imgsortsommeruni_19" :src="require('../assets/'+sortImg)">SommerUni 19</th> + <th v-on:click="sortTable('imgsortsommeruni_20')"><img id="imgsortsommeruni_20" :src="require('../assets/'+sortImg)">SommerUni 20</th> + <th v-on:click="sortTable('imgsortnatuerlich_20')"><img id="imgsortnatuerlich_20" :src="require('../assets/'+sortImg)">Natürlich 20</th> + <th v-on:click="sortTable('imgsortstatus')"><img id="imgsortstatus" :src="require('../assets/'+sortImg)">Status</th> + </tr> + <tr v-for="row in filteredRows" :key="row.id"> + <td scope="row"> + <div class="form-check"> + <input type="checkbox" class="form-check-input" name="checkbox_tablerow" id="checkbox_tablerow" v-model="checkedBoxes" :value="row.id"> + <label class="form-check-label" for="checkbox_tablerow"></label> + </div> + </td> + <td>{{row.anrede}}</td> + <td>{{row.firstname}}</td> + <td>{{row.lastname}}</td> + <td>{{row.street}}</td> + <td>{{row.zip}}</td> + <td>{{row.city}}</td> + <td>{{row.sommeruni17}}</td> + <td>{{row.sommeruni18}}</td> + <td>{{row.sommeruni19}}</td> + <td>{{row.sommeruni20}}</td> + <td>{{row.natuerlich20}}</td> + <td>{{row.status}}</td> + </tr> + </table> + </div> + </div> +</template> + +<script> +export default { + name: "Student", + data: function() { + return { + rows: [], + checkedBoxes: [], + rowIDs: ['imgsortanrede','imgsortfirstname','imgsortlastname','imgsortstreet','imgsortzip','imgsortcity','imgsortsommeruni_17','imgsortsommeruni_18','imgsortsommeruni_19','imgsortsommeruni_20','imgsortnatuerlich_20','imgsortstatus'], + filter:'', + currentSort:'imgsortlastname', + currentSortDir:'asc', + sortImg: 'sort_def.svg', + } + }, + + created() { + localStorage.setItem('checkedBoxID', 0); + this.loadData(); + }, + + methods: { + + deleterows(){ + let x = 0; + for (x; x < this.checkedBoxes.length; x++){ + this.$store.dispatch('student/delete', this.checkedBoxes[x]).then( + data => { + this.message = data.message; + this.successful = true; + }, + error => { + this.message = (error.response && error.response.data) || error.message || error.toString(); + this.successful = false; + } + ); + } + this.rows = []; + this.loadData(); + }, + + checkAllBoxes(){ + var headercheckbox = document.getElementById('checkbox_headerline'); + var headercheckboxvalue = headercheckbox.checked; + + let checkboxes = document.getElementsByName('checkbox_tablerow'); + this.checkedBoxes = []; + for(var i=0, n = checkboxes.length;i<n;i++) { + if (headercheckboxvalue){ + this.checkedBoxes.push(this.rows[i].id); + } + checkboxes[i].checked = headercheckboxvalue; + } + }, + + async loadData(){ + await this.$store.dispatch('student/getAll').then( + (data) => { + let x; + for(x = 0; x < data.length; x++){ + this.rows.push({id: data[x].id, coursenumber: data[x].course_number, courseoffer: data[x].course_offer, coursename: data[x].course_name, eventtype: data[x].event_type, coursedate: data[x].course_datetime, topic: data[x].course_topic, courselocation: data[x].course_location, accompanyingteacher: data[x].accompanyingTeacher, supervisingstudents: data[x].supervisingStudents, presentstudents: data[x].presentStudents, registeredstudents: data[x].registeredStudents, instructor: data[x].instructor, notefield: data[x].noteField, anzahlung: data[x].anzahlung, honorar: data[x].honorar, status: data[x].status}); + } + }, + error => { + this.message = (error.response && error.response.data) || error.message || error.toString(); + this.successful = false; + } + ); + }, + + exportExcel(){ + this.$store.dispatch('student/exportExcel', this.checkedBoxes); + }, + + "sortTable": function sortTable(col) { + this.currentSort = col; + if (this.currentSortDir === 'asc') { + this.currentSortDir = 'desc'; + + this.rowIDs.forEach(element =>{ + console.log(this.currentSort); + if(this.currentSort === element){ + document.getElementById(element).src = require('../assets/sort_asc.svg') + } else { + document.getElementById(element).src = require('../assets/sort_def.svg') + } + }); + + col = col.toString().replace("imgsort",""); + this.rows.sort(function (a, b) { + if (typeof(a[col]) === 'number' && typeof(b[col]) === 'number'){ + if (a[col] < b[col]) { + return 1; + } else if (a[col] > b[col]) { + return -1; + } + } else if (typeof(a[col]) === 'string' && typeof(b[col]) === 'string'){ + if (a[col].toLowerCase() < b[col].toLowerCase()) { + return 1; + } else if (a[col].toLowerCase() > b[col].toLowerCase()) { + return -1; + } + } + return 0; + }) + } else { + this.currentSortDir = 'asc'; + + this.rowIDs.forEach(element =>{ + if(this.currentSort === element){ + document.getElementById(element.toString()).src = require('../assets/sort_desc.svg'); + } else { + document.getElementById(element.toString()).src = require('../assets/sort_def.svg'); + } + }); + + col = col.toString().replace("imgsort",""); + this.rows.sort(function (a, b) { + if (typeof(a[col]) === 'number' && typeof(b[col]) === 'number'){ + if (a[col] > b[col]) { + return 1; + } else if (a[col]< b[col]) { + return -1; + } + } else if (a[col].toLowerCase() < b[col].toLowerCase()) { + if (a[col].toLowerCase() > b[col].toLowerCase()) { + return 1; + } else if (a[col].toLowerCase() < b[col].toLowerCase()) { + return -1; + } + } + return 0; + }) + } + } + }, + + watch: { + checkedBoxes(){ + if (this.checkedBoxes.length > 1 || this.checkedBoxes.length < 1){ + document.getElementById("editbutton").style.visibility = "hidden"; + // EXPORT & DELETE + } else { + document.getElementById("editbutton").style.visibility = "visible"; + } + localStorage.setItem('checkedBoxID', this.checkedBoxes[0]); + } + }, + + computed: { + "columns": function columns() { + if (this.rows.length === 0) { + return []; + } + return Object.keys(this.rows[0]) + }, + filteredRows() { + return this.rows.filter(() => { + return true; + /* + const angebotsnummer = row.coursenumber.toLowerCase(); + const angebot = row.courseoffer.toLowerCase(); + const kursname = row.coursename.toLowerCase(); + const veranstaltungsart = row.eventtype.toLowerCase(); + const kursdatum = row.coursedate.toLowerCase(); + const thema = row.topic.toLowerCase(); + const kursort = row.courselocation.toLowerCase(); + const begleitendeLehrkraft = row.accompanyingteacher.toLowerCase(); + const betreuendeStudenten = row.supervisingstudents.toLowerCase(); + const anzahlderAnwesenden = row.presentstudents.toString(); + const anzahlderAngemeldeten = row.registeredstudents.toString(); + const kursleiter = row.instructor.toLowerCase(); + const anzahlung = row.anzahlung.toLowerCase(); + const honorar = row.honorar.toLowerCase(); + const status = row.status.toString().toLowerCase(); + const notiz = row.notefield.toLowerCase(); + const searchTerm = this.filter.toLowerCase(); + + return angebotsnummer.includes(searchTerm) || angebot.includes(searchTerm) || kursname.includes(searchTerm) || veranstaltungsart.includes(searchTerm) || kursdatum.includes(searchTerm) || thema.includes(searchTerm) || kursort.includes(searchTerm) || begleitendeLehrkraft.includes(searchTerm) || betreuendeStudenten.includes(searchTerm) || betreuendeStudenten.includes(searchTerm) || anzahlderAnwesenden.includes(searchTerm) || anzahlderAngemeldeten.includes(searchTerm) || kursleiter.includes(searchTerm) || notiz.includes(searchTerm) || anzahlung.includes(searchTerm) || honorar.includes(searchTerm) || status.includes(searchTerm); + */ }); + }, + } +} +</script> + +<style scoped> + +.content{ + background-color: transparent; + width: 100%; + height: 100vh; + overflow: auto; + white-space: nowrap; +} + +.search_box{ + width: 100%; + margin-top: 50px; + text-align:left; + position: relative; +} + +.search_box-inner { + display:inline; + font-size:1em; + border-radius: 8em; + border:0.1em solid rgba(218, 208, 190, 1); + box-shadow:0 0 0.3em rgba(60, 60, 60, 0.4); + padding:0.3em; + background:white; +} + +.entry_box-inner { + position: relative; + display:inline; +} + +#exportbutton, #addbutton, #editbutton, #deletebutton { + margin-right: 25px; + display:inline-block; + padding:0.3em 1.2em; + border-radius:2em; + box-sizing: border-box; + text-decoration:none; + font-weight:300; + color:#FFFFFF; + background-color:#528fff; + text-align:center; + transition: all 0.2s; +} + +#exportbutton:hover, #deletebutton:hover, #addbutton:hover , #editbutton:hover{ + background-color:#9fc1ff; +} + +.search_box-inner i img { + width: 5%; + text-align: center; + margin: 5px; +} + +#inpt_search{ + transition:all 0.2s ease-out; + width:15px; + border-radius:0; + box-shadow:none; + outline: none; + padding:0; + margin:0; + border:0; + background-color: transparent; + opacity:0; +} +#inpt_search:focus { + width: 10em; + opacity: 1; +} + +.content table { + margin-top: 10px; + display: inline-block; + font-family: arial, sans-serif; + border-collapse: collapse; + width: 100%; +} + +.content table th { + text-transform: uppercase; + text-align: left; + background: #9fc1ff; + color: #000000; + padding: 8px; + min-width: 30px; +} + +.content table td { + text-align: left; + padding: 8px; + border-right: 2px solid #9fc1ff; +} +.content table td:last-child { + border-right: none; +} + +.content table tbody tr:nth-child(2n) td { + background: #8f0c4f; +} + +.card { + /* Add shadows to create the "card" effect */ + box-shadow: 0 4px 30px 0 rgba(0,0,0,0.1); + transition: 0.2s; + margin-top: 20px; + margin-right: 10px; + height: 95vh; + border-radius: 20px; + border-color: transparent; +} + +</style> \ No newline at end of file diff --git a/src/models/student.js b/src/models/student.js new file mode 100644 index 0000000..adacc01 --- /dev/null +++ b/src/models/student.js @@ -0,0 +1,19 @@ +export default class Student { + + constructor(id, anrede, firstname, lastname, street, zip, ctiy, sommeruni17, sommeruni18, sommeruni19, sommeruni20, natuerlich20, status) { + this.id = id; + this.anrede = anrede; + this.firstname = firstname; + this.lastname = lastname; + this.street = street; + this.zip = zip; + this.city = city; + this.sommeruni17 = sommeruni17; + this.sommeruni18 = sommeruni18; + this.sommeruni19 = sommeruni19; + this.sommeruni20 = sommeruni20; + this.natuerlich20 = natuerlich20; + this.status = status; + + } +} diff --git a/src/router.js b/src/router.js index 5f70384..6490528 100644 --- a/src/router.js +++ b/src/router.js @@ -16,6 +16,7 @@ import EditTeacher from "@/components/CreateEditComponents/EditTeacher"; import Certifications from "@/components/Certifications"; import CreateCertification from "@/components/CreateEditComponents/CreateCertification"; import EditCertificate from "@/components/CreateEditComponents/EditCertificate"; +import Student from "@/components/Student"; Vue.use(Router) @@ -85,6 +86,11 @@ const router = new Router({ path: '/home', component: Home }, + { + path: '/students', + name: 'students', + component: Student, + }, { path: '/courses', name: 'courses', diff --git a/src/services/student.service.js b/src/services/student.service.js new file mode 100644 index 0000000..b837279 --- /dev/null +++ b/src/services/student.service.js @@ -0,0 +1,111 @@ +import axios from 'axios'; +import authHeader from "@/services/auth-header"; +import fileDownload from 'js-file-download'; + +const API_URL = 'http://localhost:9192/'; + +class StudentService { + + insert(student) { + return axios + .post(API_URL + 'insertStudent', { + id: student.id, + anrede: student.anrede, + firstname: student.firstname, + lastname: student.lastname, + street: student.street, + postcode: student.zip, + ort: student.city, + sommeruni_17: student.sommeruni17, + sommeruni_18: student.sommeruni18, + sommeruni_19: student.sommeruni19, + sommeruni_20: student.sommeruni20, + natuerlich_2020: student.natuerlich20, + } + + ,{headers: authHeader() }) + .then(response => { + return response.data; + }); + } + + update(student) { + return axios + .post(API_URL + 'updateStudent', { + id: student.id, + anrede: student.anrede, + firstname: student.firstname, + lastname: student.lastname, + street: student.street, + postcode: student.zip, + ort: student.city, + sommeruni_17: student.sommeruni17, + sommeruni_18: student.sommeruni18, + sommeruni_19: student.sommeruni19, + sommeruni_20: student.sommeruni20, + natuerlich_2020: student.natuerlich20, + } + ,{headers: authHeader() }) + .then(response => { + return response.data; + }); + } + + delete(id) { + return axios + .post(API_URL + 'deleteStudent', { + id: id + } + ,{headers: authHeader() }) + .then(response => { + return response.data; + }); + } + + getAll() { + return axios + .get(API_URL + 'getStudent', { + headers: authHeader() + }) + .then(response => { + return response.data; + }); + } + + getByID(idValue) { + return axios + .get(API_URL + 'getStudentsByID/'+idValue, { + headers: authHeader() + }) + .then(response => { + return response.data; + }); + } + + exportExcel(ids) { + let idsArray = "" + if (ids.length > 0) + idsArray = "/"; + + for (let i = 0; i < ids.length; i++) { + if (i === ids.length-1) + idsArray += ids[i]; + else + idsArray += ids[i]+","; + } + + return axios + .get(API_URL + 'exportStudentExcel' + idsArray, { + headers: authHeader(), + responseType: 'blob', + }) + .then(response => { + fileDownload(response.data, "Student.xlsx"); + return response.data; + }); + } + +} + + +export default new StudentService(); \ No newline at end of file diff --git a/src/store/student.module.js b/src/store/student.module.js new file mode 100644 index 0000000..edd8d4b --- /dev/null +++ b/src/store/student.module.js @@ -0,0 +1,98 @@ +import StudentService from '../services/student.service'; + +const initialState = null; + +export const student = { + + namespaced: true, + state: initialState, + actions: { + + insert({ commit }, student) { + return StudentService.insert(student).then( + response => { + commit('insertSuccess', response); + return Promise.resolve(response); + }, + error => { + commit('insertFailure'); + return Promise.reject(error); + } + ); + }, + + update({ commit }, student) { + return StudentService.update(student).then( + response => { + commit('insertSuccess', response); + return Promise.resolve(response); + }, + error => { + commit('insertFailure'); + return Promise.reject(error); + } + ); + }, + + delete({ commit }, id) { + return StudentService.delete(id).then( + response => { + commit('insertSuccess', response); + return Promise.resolve(response); + }, + error => { + commit('insertFailure'); + return Promise.reject(error); + } + ); + }, + + getAll({ commit }) { + return StudentService.getAll().then( + response => { + commit('insertSuccess', response); + return Promise.resolve(response); + }, + error => { + commit('insertFailure'); + return Promise.reject(error); + } + ); + }, + + getByID({ commit }, id) { + return StudentService.getByID(id).then( + response => { + commit('insertSuccess', response); + return Promise.resolve(response); + }, + error => { + commit('insertFailure'); + return Promise.reject(error); + } + ); + }, + + exportExcel({ commit },ids) { + return StudentService.exportExcel(ids).then( + response => { + commit('insertSuccess', response); + return Promise.resolve(response); + }, + error => { + commit('insertFailure'); + return Promise.reject(error); + } + ); + } + }, + + mutations: { + insertSuccess(state, response) { + state.response = response; + }, + insertFailure(state, response) { + state.response = response; + } + } +}; \ No newline at end of file diff --git a/src/store/teacher.module.js b/src/store/teacher.module.js index fea7f1d..24d890a 100644 --- a/src/store/teacher.module.js +++ b/src/store/teacher.module.js @@ -1,5 +1,4 @@ import TeacherService from '../services/teacher.service'; -import CourseService from "@/services/course.service"; const initialState = null; -- GitLab