klickibunti farben in accordion headers je nach datum/abgabedatum combo; more color definitions cis4 default.css; nomore legacy classes in Abgabe.php, CI3 models only; confirm delete Termin prompt; endupload validation stub, not sure about the technical min requirements here; mitarbeiter table format fix; show noten in projektarbeit view for students so there is some distinction; fhc isMobile computed revamp; order projektarbeiten by insertamum DESC to get most recent ones at the top of lists;

This commit is contained in:
Johann Hoffmann
2025-10-02 16:53:41 +02:00
parent c796536417
commit dab34eff35
10 changed files with 494 additions and 407 deletions
+39 -12
View File
@@ -1,6 +1,6 @@
/* Base Header */
.verpasst-header {
background-color: var(--fhc-red-40);
background-color: var(--fhc-red-70);
font-weight: 600;
border-radius: 6px;
padding: 0px 0px 0px 32px;
@@ -10,7 +10,7 @@
/* Hover State */
.verpasst-header:hover {
background-color: var(--fhc-red-30);
background-color: var(--fhc-red-60);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
@@ -22,13 +22,13 @@
/* Hover State Active*/
.p-accordion-tab-active > .verpasst-header:hover {
background-color: var(--fhc-red-40);
background-color: var(--fhc-red-60);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
/* Base Header */
.abzugeben-header {
background-color: var(--fhc-yellow-40);
background-color: var(--fhc-yellow-70);
font-weight: 600;
border-radius: 6px;
padding: 0px 0px 0px 32px;
@@ -38,7 +38,7 @@
/* Hover State */
.abzugeben-header:hover {
background-color: var(--fhc-yellow-30);
background-color: var(--fhc-yellow-60);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
@@ -50,13 +50,13 @@
/* Hover State Active*/
.p-accordion-tab-active > .abzugeben-header:hover {
background-color: var(--fhc-yellow-40);
background-color: var(--fhc-yellow-60);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
/* Base Header */
.verspaetet-header {
background-color: var(--fhc-pink-40);
background-color: var(--fhc-pink-70);
font-weight: 600;
border-radius: 6px;
padding: 0px 0px 0px 32px;
@@ -66,7 +66,7 @@
/* Hover State */
.verspaetet-header:hover {
background-color: var(--fhc-pink-30);
background-color: var(--fhc-pink-60);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
@@ -78,13 +78,13 @@
/* Hover State Active*/
.p-accordion-tab-active > .verspaetet-header:hover {
background-color: var(--fhc-pink-40);
background-color: var(--fhc-pink-60);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
/* Base Header */
.abgegeben-header {
background-color: var(--fhc-green-40);
background-color: var(--fhc-green-70);
font-weight: 600;
border-radius: 6px;
padding: 0px 0px 0px 32px;
@@ -94,7 +94,7 @@
/* Hover State */
.abgegeben-header:hover {
background-color: var(--fhc-green-30);
background-color: var(--fhc-green-60);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
@@ -106,8 +106,35 @@
/* Hover State Active*/
.p-accordion-tab-active > .abgegeben-header:hover {
background-color: var(--fhc-green-40);
background-color: var(--fhc-green-60);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
/* Base Header */
.standard-header {
background-color: var(--fhc-white-70);
font-weight: 600;
border-radius: 6px;
padding: 0px 0px 0px 32px;
transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease;
box-shadow: 0 1px 2px rgba(0,0,0,0.08);
}
/* Hover State */
.standard-header:hover {
background-color: var(--fhc-white-60);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
/* Active / Expanded State */
.p-accordion-tab-active > .standard-header {
background-color: var(--fhc-white-50);
box-shadow: 0 2px 8px rgba(0,0,0,0.2);
}
/* Hover State Active*/
.p-accordion-tab-active > .standard-header:hover {
background-color: var(--fhc-white-60);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
+41 -21
View File
@@ -39,33 +39,53 @@
--fhc-blue-primary-highlight: #0086CB;
/* --- Green --- */
--fhc-green-10: #dff4df;
--fhc-green-20: #a8e0a2;
--fhc-green-30: #008000;
--fhc-green-40: #006600;
--fhc-green-50: #004d00;
--fhc-green-5: rgb(240, 250, 240);
--fhc-green-10: rgb(220, 245, 220);
--fhc-green-20: rgb(190, 235, 190);
--fhc-green-30: rgb(150, 220, 150);
--fhc-green-40: rgb(110, 200, 110);
--fhc-green-50: rgb(70, 170, 70);
--fhc-green-60: rgb(50, 145, 50);
--fhc-green-70: rgb(35, 120, 35);
--fhc-green-80: rgb(25, 95, 25);
--fhc-green-90: rgb(15, 70, 15);
/* --- Red --- */
--fhc-red-10: #fde6e8;
--fhc-red-20: #f5a3a8;
--fhc-red-30: #842029;
--fhc-red-40: #600018;
--fhc-red-50: #400010;
--fhc-red-5: rgb(255, 245, 246);
--fhc-red-10: rgb(255, 225, 228);
--fhc-red-20: rgb(250, 190, 195);
--fhc-red-30: rgb(240, 150, 160);
--fhc-red-40: rgb(225, 110, 120);
--fhc-red-50: rgb(200, 70, 85);
--fhc-red-60: rgb(170, 50, 65);
--fhc-red-70: rgb(140, 35, 50);
--fhc-red-80: rgb(110, 20, 35);
--fhc-red-90: rgb(85, 10, 25);
/* --- Yellow --- */
--fhc-yellow-10: #fff9e6;
--fhc-yellow-20: #fff0b3;
--fhc-yellow-30: #ffeb3b;
--fhc-yellow-40: #f5d600;
--fhc-yellow-50: #c8aa00;
--fhc-yellow-5: rgb(255, 255, 240);
--fhc-yellow-10: rgb(255, 250, 210);
--fhc-yellow-20: rgb(255, 240, 160);
--fhc-yellow-30: rgb(255, 225, 100);
--fhc-yellow-40: rgb(250, 210, 50);
--fhc-yellow-50: rgb(240, 190, 0);
--fhc-yellow-60: rgb(220, 165, 0);
--fhc-yellow-70: rgb(190, 135, 0);
--fhc-yellow-80: rgb(160, 105, 0);
--fhc-yellow-90: rgb(120, 75, 0);
/* --- Pink --- */
--fhc-pink-10: #ffe6f0;
--fhc-pink-20: #f8c1d6;
--fhc-pink-30: #e91e63;
--fhc-pink-40: #c2185b;
--fhc-pink-50: #8b1050;
--fhc-pink-5: rgb(255, 245, 250);
--fhc-pink-10: rgb(255, 225, 235);
--fhc-pink-20: rgb(250, 195, 215);
--fhc-pink-30: rgb(245, 160, 190);
--fhc-pink-40: rgb(235, 120, 160);
--fhc-pink-50: rgb(220, 80, 130);
--fhc-pink-60: rgb(190, 60, 110);
--fhc-pink-70: rgb(160, 40, 90);
--fhc-pink-80: rgb(130, 25, 70);
--fhc-pink-90: rgb(100, 15, 50);
--fhc-beige-10: rgba(245, 233, 215, 0.5);
--fhc-beige-20: rgba(172, 153, 125, 0.5);
+3 -1
View File
@@ -227,7 +227,9 @@ const app = Vue.createApp({
components: {},
computed: {
isMobile() {
return /Mobi|Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
const smallScreen = window.matchMedia("(max-width: 767px)").matches;
const touchCapable = ("ontouchstart" in window) || navigator.maxTouchPoints > 0;
return smallScreen;// && touchCapable;
}
},
provide() {
@@ -102,7 +102,7 @@ export const AbgabeMitarbeiterDetail = {
'paabgabe_id': -1,
'projektarbeit_id': this.projektarbeit.projektarbeit_id,
'fixtermin': false,
'kurzbz': '',
'kurzbz': '', // todo kurzbz textfield value vorschlag für qualgates
'datum': new Date().toISOString().split('T')[0],
'note': this.allowedNotenOptions.find(opt => opt.note == 9),
'beurteilungsnotiz': '',
@@ -114,12 +114,27 @@ export const AbgabeMitarbeiterDetail = {
}
this.showAutomagicModalPhrase = true
} else {
this.showAutomagicModalPhrase = false
}
} else if(res?.meta?.status == 'error'){
this.$fhcAlert.alertError()
}
})
},
async handleDeleteTermin(termin){
if(await this.$fhcAlert.confirm({
message: this.$p.t('abgabetool/c4confirm_delete'),
acceptLabel: 'Löschen',
acceptClass: 'btn btn-danger',
rejectLabel: 'Zurück',
rejectClass: 'btn btn-outline-secondary'
}) === false) {
return false
} else {
this.deleteTermin(termin)
}
},
deleteTermin(termin) {
this.$api.call(ApiAbgabe.deleteProjektarbeitAbgabe(termin.paabgabe_id)).then( (res) => {
if(res?.meta?.status == 'success') {
@@ -151,34 +166,19 @@ export const AbgabeMitarbeiterDetail = {
const datum = new Date(termin.datum)
const abgabedatum = new Date(termin.abgabedatum)
// todo: rework styling but keep the color pattern logic
// https://wiki.fhcomplete.info/doku.php?id=cis:abgabetool_fuer_studierende
let color = 'white'
let fontColor = 'black'
let icon = '';
if (termin.abgabedatum === null) {
if(datum < today) {
color = 'red'
fontColor = 'white'
icon = 'fa-triangle-exclamation'
return 'verpasst-header'
} else if (datum > today && this.dateDiffInDays(datum, today) <= 12) {
color = 'yellow'
icon = 'fa-circle-exclamation'
}
return 'abzugeben-header'
} else {
return 'standard-header'
}
} else if(abgabedatum > datum) {
color = 'pink' // aka "hellrot"
fontColor = 'white'
icon = 'fa-circle-question'
return 'verspaetet-header'
} else {
color = 'green'
icon = 'fa-square-check'
}
//return `font-color: ${fontColor} ; background-color: ${color}; border-radius: 50%;`
if( typeof mode !== 'undefined' || mode === 'icon') {
return icon;
} else {
return 'abgabe-zieldatum-border-' + color;
return 'abgegeben-header'
}
},
openBeurteilungLink(link) {
@@ -246,8 +246,18 @@ export const AbgabeMitarbeiterDetail = {
console.log(this.$refs.modalContainerCreateNewAbgabe)
this.$refs.modalContainerCreateNewAbgabe.show()
},
validateTermin(termin) {
// compare new termin to existing ones to block illegal termin constellations, if they exist
return true
},
async handleSaveNewAbgabe(termin) {
// TODO: validate termin type & date
if(!this.validateTermin(termin)) {
this.$fhcAlert.alertWarning('invalid termin')
return false
}
await this.saveTermin(termin)
@@ -368,7 +378,8 @@ export const AbgabeMitarbeiterDetail = {
v-model="newTermin.bezeichnung"
@change="handleChangeAbgabetyp(newTermin)"
:options="abgabeTypeOptions"
:optionLabel="getOptionLabelAbgabetyp">
:optionLabel="getOptionLabelAbgabetyp"
scrollHeight="300px">
</Dropdown>
</div>
</div>
@@ -430,53 +441,21 @@ export const AbgabeMitarbeiterDetail = {
<h5>{{$p.t('abgabetool/c4abgabeMitarbeiterbereich')}}</h5>
<div class="row">
<div class="col-8">
<div class="col-6">
<p> {{projektarbeit?.student}}</p>
<p> {{projektarbeit?.titel}}</p>
<p v-if="projektarbeit?.zweitbegutachter"> {{projektarbeit?.zweitbegutachter}}</p>
</div>
<div class="col-4 d-flex">
<div class="col">
<div class="row">
<button :disabled="!getSemesterBenotbar || !endUploadVorhanden" class="btn btn-secondary border-0" @click="openBenotung" style="width: 80%;">
{{ $p.t('abgabetool/c4benoten') }}
<i class="fa-solid fa-user-check"></i>
</button>
</div>
<div class="row" style="width: 90%;">
<span v-if="!getSemesterBenotbar" v-html="$p.t('abgabetool/c4aeltereParbeitBenoten', oldPaBeurteilungLink)"></span>
<span v-else-if="!endUploadVorhanden">{{ $p.t('abgabetool/c4noEnduploadFound') }}</span>
</div>
</div>
<div class="col">
<div class="row">
<button v-if="projektarbeit?.betreuerart_kurzbz !== 'Zweitbegutachter'" class="btn btn-secondary border-0" @click="openPlagiatcheck" style="width: 80%;">
{{ $p.t('abgabetool/c4plagiatcheck_link')}}
<i class="fa-solid fa-user-check"></i>
</button>
</div>
</div>
<div class="col">
<div class="row">
<button class="btn btn-secondary border-0" @click="openStudentPage" style="width: 80%;">
{{ $p.t('abgabetool/c4student_perspective')}}
<i class="fa-solid fa-eye"></i>
</button>
</div>
</div>
</div>
</div>
<Accordion :multiple="true" :activeIndex="[0]">
<template v-for="termin in this.projektarbeit?.abgabetermine">
<AccordionTab :header="getAccTabHeaderForTermin(termin)">
<AccordionTab :header="getAccTabHeaderForTermin(termin)" :headerClass="getDateStyle(termin)">
<div class="row">
<div class="col-4 col-md-3 fw-bold">{{$p.t('abgabetool/c4fixtermin')}}</div>
<div class="col-8 col-md-9">
<!-- always keep fixtermin checkbox disabled for mitarbeiter tool -->
<!-- always keep fixtermin checkbox disabled for mitarbeiter tool -->
<Checkbox
v-model="termin.fixtermin"
disabled
@@ -569,7 +548,7 @@ export const AbgabeMitarbeiterDetail = {
</button>
</div>
<div class="col-4">
<button v-if="termin.allowedToDelete && termin.paabgabe_id > 0" style="max-height: 40px;" class="btn btn-primary border-0" @click="deleteTermin(termin)">
<button v-if="termin.allowedToDelete && termin.paabgabe_id > 0" style="max-height: 40px;" class="btn btn-danger border-0" @click="handleDeleteTermin(termin)">
{{ $p.t('abgabetool/c4delete') }}
<i class="fa-solid fa-trash"></i>
</button>
@@ -580,94 +559,6 @@ export const AbgabeMitarbeiterDetail = {
</AccordionTab>
</template>
</Accordion>
<!-- <div id="uploadWrapper">-->
<!-- <div class="row" style="margin-bottom: 12px;">-->
<!-- <div class="fw-bold" style="width: 100px">{{$p.t('abgabetool/c4fixtermin')}}</div>-->
<!-- <div class="row" style="max-width: calc(100% - 100px)">-->
<!-- <div class="col-2 fw-bold">{{$p.t('abgabetool/c4zieldatum')}}</div>-->
<!-- <div class="col-2 fw-bold">{{$p.t('abgabetool/c4abgabetyp')}}</div>-->
<!-- <div v-show="qualityGateTerminAvailable" class="col-2 fw-bold">{{$p.t('abgabetool/c4note')}}</div>-->
<!-- <div v-show="qualityGateTerminAvailable" class="col-1 fw-bold">{{$p.t('abgabetool/c4upload_allowed')}}</div>-->
<!-- <div class="col-2 fw-bold">{{$p.t('abgabetool/c4abgabekurzbz')}}</div>-->
<!-- <div class="col-1 fw-bold">{{$p.t('abgabetool/c4abgabedatum')}}</div>-->
<!-- <div class="col">-->
<!-- -->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <div v-if="!projektarbeit?.abgabetermine?.length">keine Termine gefunden!</div>-->
<!-- <div class="row" v-for="termin in projektarbeit.abgabetermine">-->
<!-- <div style="width: 100px" class="d-flex justify-content-center align-items-center">-->
<!-- <i v-if="termin.fixtermin" class="fa-solid fa-2x fa-circle-check fhc-bullet-red"></i>-->
<!-- <i v-else="" class="fa-solid fa-2x fa-circle-xmark fhc-bullet-green"></i>-->
<!--&lt;!&ndash; <p class="fhc-bullet" :class="{ 'fhc-bullet-red': termin.fixtermin, 'fhc-bullet-green': !termin.fixtermin }"></p>&ndash;&gt;-->
<!-- </div>-->
<!-- <div class="row" style="max-width: calc(100% - 100px)">-->
<!-- <div class="col-2 d-flex justify-content-center align-items-center">-->
<!-- <div class="position-relative" :class="getDateStyle(termin)">-->
<!-- <VueDatePicker-->
<!-- style="width: 95%;"-->
<!-- v-model="termin.datum"-->
<!-- :clearable="false"-->
<!-- :disabled="!termin.allowedToSave"-->
<!-- :enable-time-picker="false"-->
<!-- :format="formatDate"-->
<!-- :text-input="true"-->
<!-- auto-apply>-->
<!-- </VueDatePicker>-->
<!-- <i class="position-absolute abgabe-zieldatum-overlay fa-solid fa-2x" :class="getDateStyle(termin, 'icon')"></i>-->
<!-- </div> -->
<!-- </div>-->
<!-- <div class="col-2 d-flex justify-content-center align-items-center">-->
<!-- <Dropdown -->
<!-- :style="{'width': '100%'}"-->
<!-- :disabled="!termin.allowedToSave"-->
<!-- v-model="termin.bezeichnung"-->
<!-- :options="abgabeTypeOptions"-->
<!-- :optionLabel="getOptionLabelAbgabetyp">-->
<!-- </Dropdown>-->
<!-- </div>-->
<!-- <div v-if="qualityGateTerminAvailable || termin.bezeichnung?.paabgabetyp_kurzbz === 'qualgate1' || termin.bezeichnung?.paabgabetyp_kurzbz === 'qualgate2'" class="col-2 d-flex justify-content-center align-items-center">-->
<!-- <Dropdown -->
<!-- v-if="termin.bezeichnung?.paabgabetyp_kurzbz === 'qualgate1' || termin.bezeichnung?.paabgabetyp_kurzbz === 'qualgate2'"-->
<!-- :style="{'width': '100%'}"-->
<!-- v-model="termin.note"-->
<!-- :options="allowedNotenOptions"-->
<!-- :optionLabel="getNotenOptionLabel">-->
<!-- </Dropdown>-->
<!-- </div>-->
<!-- <div v-if="qualityGateTerminAvailable || termin.bezeichnung?.paabgabetyp_kurzbz === 'qualgate1' || termin.bezeichnung?.paabgabetyp_kurzbz === 'qualgate2'" class="col-1 d-flex justify-content-center align-items-center">-->
<!-- <Checkbox -->
<!-- v-if="termin.bezeichnung?.paabgabetyp_kurzbz === 'qualgate1' || termin.bezeichnung?.paabgabetyp_kurzbz === 'qualgate2'"-->
<!-- v-model="termin.upload_allowed"-->
<!-- :binary="true" -->
<!-- :pt="{ root: { class: 'ml-auto' }}"-->
<!-- >-->
<!-- </Checkbox>-->
<!-- </div>-->
<!-- <div class="col-2 d-flex justify-content-center align-items-center">-->
<!-- <Textarea style="margin-bottom: 4px;" v-model="termin.kurzbz" rows="1" cols="20" :disabled="!termin.allowedToSave"></Textarea>-->
<!-- </div>-->
<!-- <div class="col-1 d-flex justify-content-center align-items-center">-->
<!-- {{ termin.abgabedatum?.split("-").reverse().join(".") }}-->
<!-- <a v-if="termin?.abgabedatum" @click="downloadAbgabe(termin)" style="margin-left:4px; cursor: pointer;">-->
<!-- <i class="fa-solid fa-2x fa-file-pdf"></i>-->
<!-- </a>-->
<!-- </div>-->
<!-- <div class="col-2 align-content-center">-->
<!-- <button v-if="termin.allowedToSave" style="max-height: 40px;" class="btn btn-primary border-0" @click="saveTermin(termin)">-->
<!-- {{ $p.t('abgabetool/c4save') }}-->
<!-- <i class="fa-solid fa-floppy-disk"></i>-->
<!-- </button>-->
<!-- <button v-if="termin.allowedToDelete && termin.paabgabe_id > 0" style="max-height: 40px;" class="btn btn-primary border-0" @click="deleteTermin(termin)">-->
<!-- {{ $p.t('abgabetool/c4delete') }}-->
<!-- <i class="fa-solid fa-trash"></i>-->
<!-- </button>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
</div>
`,
};
@@ -182,45 +182,20 @@ export const AbgabeStudentDetail = {
const datum = new Date(termin.datum)
const abgabedatum = new Date(termin.abgabedatum)
// todo: rework styling but keep the color pattern logic
// https://wiki.fhcomplete.info/doku.php?id=cis:abgabetool_fuer_studierende
let color = 'white'
let fontColor = 'black'
let icon = '';
if (termin.abgabedatum === null) {
if(datum < today) {
return 'verpasst-header'
// color = 'red'
// fontColor = 'white'
// icon = 'fa-triangle-exclamation'
} else if (datum > today && this.dateDiffInDays(datum, today) <= 12) {
return 'abzugeben-header'
// color = 'yellow'
// icon = 'fa-circle-exclamation'
} else {
return 'standard-header'
}
} else if(abgabedatum > datum) {
return 'verspaetet-header'
// color = 'pink' // aka "hellrot"
// fontColor = 'white'
// icon = 'fa-circle-question'
} else {
return 'abgegeben-header'
// color = 'green'
// icon = 'fa-square-check'
}
// return 'background-color: ' + color;
//
// //return `font-color: ${fontColor} ; background-color: ${color}; border-radius: 50%;`
// if( typeof mode !== 'undefined' || mode === 'icon') {
// return icon;
// } else {
// return 'abgabe-zieldatum-border-' + color;
// }
},
openBeurteilungLink(link) {
window.open(link, '_blank')
@@ -308,6 +283,7 @@ export const AbgabeStudentDetail = {
<!-- <i v-else="" class="fa-solid fa-2x fa-circle-xmark fhc-bullet-green"></i>-->
</div>
</div>
<div class="row mt-2">
<div class="col-4 col-md-3 fw-bold">{{$p.t('abgabetool/c4zieldatum')}}</div>
<div class="col-8 col-md-9">
@@ -323,12 +299,14 @@ export const AbgabeStudentDetail = {
<!-- <i class="position-absolute abgabe-zieldatum-overlay fa-solid fa-2x" :class="getDateStyle(termin, 'icon')"></i>-->
</div>
</div>
<div class="row mt-2">
<div class="col-4 col-md-3 fw-bold">{{$p.t('abgabetool/c4abgabetyp')}}</div>
<div class="col-8 col-md-9">
{{ termin.bezeichnung }}
</div>
</div>
<div class="row mt-2" v-if="termin.paabgabetyp_kurzbz === 'qualgate1' || termin.paabgabetyp_kurzbz === 'qualgate2'">
<div class="col-4 col-md-3 fw-bold">{{$p.t('abgabetool/c4note')}}</div>
<div class="col-8 col-md-9">
@@ -337,12 +315,14 @@ export const AbgabeStudentDetail = {
</div>
</div>
</div>
<div class="row mt-2">
<div class="col-4 col-md-3 fw-bold">{{$p.t('abgabetool/c4abgabekurzbz')}}</div>
<div class="col-8 col-md-9">
<Textarea style="margin-bottom: 4px;" v-model="termin.kurzbz" :rows=" isMobile ? 2 : 4" :cols=" isMobile ? 30 : 90" :disabled="true"></Textarea>
<Textarea style="margin-bottom: 4px;" v-model="termin.kurzbz" :rows=" isMobile ? 2 : 4" :cols=" isMobile ? 25 : 90" :disabled="true"></Textarea>
</div>
</div>
<div class="row mt-2">
<div class="col-4 col-md-3 fw-bold">{{$p.t('abgabetool/c4abgabedatum')}}</div>
<div class="col-8 col-md-9">
@@ -352,6 +332,7 @@ export const AbgabeStudentDetail = {
</a>
</div>
</div>
<div class="row mt-2" v-if="termin.upload_allowed">
<div class="col-4 col-md-3 fw-bold">{{$p.t('abgabetool/c4fileupload')}}</div>
<div class="col-8 col-md-9">
@@ -376,7 +357,6 @@ export const AbgabeStudentDetail = {
</div>
</div>
</div>
</div>
</AccordionTab>
</template>
</Accordion>
@@ -65,10 +65,11 @@ export const AbgabetoolMitarbeiter = {
abgabeTableOptions: {
minHeight: 250,
index: 'projektarbeit_id',
layout: 'fitColumns',
layout: 'fitDataStretch',
placeholder: this.$p.t('global/noDataAvailable'),
selectable: true,
selectableCheck: this.selectionCheck,
rowHeight: 80,
columns: [
{
formatter: 'rowSelection',
@@ -82,14 +83,14 @@ export const AbgabetoolMitarbeiter = {
width: 70
},
{title: Vue.computed(() => this.$p.t('abgabetool/c4details')), field: 'details', formatter: this.detailFormatter, widthGrow: 1, tooltip: false},
{title: Vue.computed(() => this.$p.t('abgabetool/c4personenkennzeichen')), field: 'pkz', formatter: this.pkzTextFormatter, widthGrow: 1, tooltip: false},
{title: Vue.computed(() => this.$p.t('abgabetool/c4personenkennzeichen')), headerFilter: true, field: 'pkz', formatter: this.pkzTextFormatter, widthGrow: 1, tooltip: false},
{title: Vue.computed(() => this.$p.t('abgabetool/c4kontakt')), field: 'mail', formatter: this.mailFormatter, widthGrow: 1, tooltip: false},
{title: Vue.computed(() => this.$p.t('abgabetool/c4vorname')), field: 'vorname', formatter: this.centeredTextFormatter,widthGrow: 1},
{title: Vue.computed(() => this.$p.t('abgabetool/c4nachname')), field: 'nachname', formatter: this.centeredTextFormatter, widthGrow: 1},
{title: Vue.computed(() => this.$p.t('abgabetool/c4vorname')), field: 'vorname', headerFilter: true, formatter: this.centeredTextFormatter,widthGrow: 1},
{title: Vue.computed(() => this.$p.t('abgabetool/c4nachname')), field: 'nachname', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},
{title: Vue.computed(() => this.$p.t('abgabetool/c4projekttyp')), field: 'projekttyp_kurzbz', formatter: this.centeredTextFormatter, widthGrow: 1},
{title: Vue.computed(() => this.$p.t('abgabetool/c4stg')), field: 'stg', formatter: this.centeredTextFormatter, widthGrow: 1},
{title: Vue.computed(() => this.$p.t('abgabetool/c4sem')), field: 'studiensemester_kurzbz', formatter: this.centeredTextFormatter, widthGrow: 1},
{title: Vue.computed(() => this.$p.t('abgabetool/c4titel')), field: 'titel', formatter: this.centeredTextFormatter, maxWidth: 500, widthGrow: 8},
{title: Vue.computed(() => this.$p.t('abgabetool/c4stg')), field: 'stg', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},
{title: Vue.computed(() => this.$p.t('abgabetool/c4sem')), field: 'studiensemester_kurzbz', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},
{title: Vue.computed(() => this.$p.t('abgabetool/c4titel')), field: 'titel', headerFilter: true, formatter: this.centeredTextFormatter, maxWidth: 500, widthGrow: 8},
{title: Vue.computed(() => this.$p.t('abgabetool/c4betreuerart')), field: 'betreuerart_beschreibung',formatter: this.centeredTextFormatter, widthGrow: 1}
],
persistence: false,
@@ -442,7 +443,6 @@ export const AbgabetoolMitarbeiter = {
</template>
</bs-modal>
<bs-modal ref="modalContainerAbgabeDetail" class="bootstrap-prompt"
dialogClass="modal-fullscreen">
<template v-slot:title>
@@ -39,108 +39,7 @@ export const AbgabetoolStudent = {
student_uid: null,
detail: null,
projektarbeiten: null,
selectedProjektarbeit: null,
// abgabeTableOptions: {
// minHeight: 250,
// index: 'projektarbeit_id',
// layout: 'fitColumns',
// responsiveLayout: "collapse",
// placeholder: this.$p.t('global/noDataAvailable'),
// columns: [
// {
// formatter:"responsiveCollapse",
// width:30, minWidth:30, hozAlign:"center", resizable:false, headerSort:false
// },
// {
// title: Vue.computed(() => this.$p.t('abgabetool/c4details')), field: 'details',
// formatter: this.detailFormatter,
// widthGrow: 1, tooltip: false
// , responsive: 0, minWidth: 80
// },
// {
// title: Vue.computed(() => this.$p.t('abgabetool/c4beurteilung')), field: 'beurteilung',
// formatter: this.beurteilungFormatter,
// widthGrow: 1, tooltip: false
// , responsive: 0, minWidth: 80
// },
// {
// title: Vue.computed(() => this.$p.t('abgabetool/c4sem')), field: 'sem',
// formatter: this.centeredTextFormatter,
// widthGrow: 1
// , responsive: 5, minWidth: 120
// },
// {
// title: Vue.computed(() => this.$p.t('abgabetool/c4stg')), field: 'stg',
// formatter: this.centeredTextFormatter,
// widthGrow: 1
// , responsive: 6, minWidth: 120
// },
// {
// title: Vue.computed(() => this.$p.t('abgabetool/c4kontakt')), field: 'mail',
// formatter: this.mailFormatter,
// widthGrow: 1
// , responsive: 0, minWidth: 80
// },
// {
// title: Vue.computed(() => this.$p.t('abgabetool/c4betreuer')), field: 'betreuer',
// formatter: this.centeredTextFormatter,
// widthGrow: 2
// , responsive: 7, minWidth: 300
// },
// {
// title: Vue.computed(() => this.$p.t('abgabetool/c4projekttyp')), field: 'typ',
// formatter: this.centeredTextFormatter,
// widthGrow: 1
// , responsive: 8, minWidth: 200
// },
// {
// title: Vue.computed(() => this.$p.t('abgabetool/c4titel')), field: 'titel',
// formatter: this.centeredTextFormatter,
// widthGrow: 8
// , responsive: 1, minWidth: 420
// }
// ],
// persistence: false,
// },
// abgabeTableEventHandlers: [
// {
// event: "tableBuilt",
// handler: async () => {
// this.tableBuiltResolve()
// }
// },
// {
// event: "dataProcessed",
// handler: async () => {
// console.log('dataProcessed event')
// this.dataProcessedResolve()
// }
// },
// {
// event: "cellClick",
// handler: async (e, cell) => {
//
// if(cell.getColumn().getField() === "details") {
// const val = cell.getValue()
//
// if(val.mode === 'detailTermine') {
// this.setDetailComponent(cell.getValue())
// } else if (val.mode === 'beurteilungDownload') {
// const pdfExportLink = FHC_JS_DATA_STORAGE_OBJECT.app_root + 'cis/private/pdfExport.php?xml=projektarbeitsbeurteilung.xml.php&xsl=Projektbeurteilung&betreuerart_kurzbz='+val.betreuerart_kurzbz+'&projektarbeit_id='+val.projektarbeit_id+'&person_id=' + val.betreuer_person_id
// // const pdfExportLink2 = FHC_JS_DATA_STORAGE_OBJECT.app_root + 'cis/private/lehre/projektbeurteilungDocumentExport.php?betreuerart_kurzbz='+val.betreuerart_kurzbz+'&projektarbeit_id='+val.projektarbeit_id+'&person_id=' + val.betreuer_person_id
// window.open(pdfExportLink, '_blank')
// }
//
// } else if (cell.getColumn().getField() === "beurteilung") {
// const val = cell.getValue()
//
// if(val != '-') window.open(val, '_blank')
// }
// e.stopPropagation()
//
// }
// }
// ]
selectedProjektarbeit: null
};
},
methods: {
@@ -236,7 +135,9 @@ export const AbgabetoolStudent = {
// this.projektarbeiten = data[0]
this.domain = data[1]
this.student_uid = data[2]
this.projektarbeiten = data[0]?.map(projekt => {
this.projektarbeiten = data[0] ?? null
if(!this.projektarbeiten) return
this.projektarbeiten = this.projektarbeiten.map(projekt => {
let mode = 'detailTermine'
if (projekt.babgeschickt || projekt.zweitbetreuer_abgeschickt) {
@@ -288,6 +189,19 @@ export const AbgabetoolStudent = {
title += projektarbeit.titel
return title
},
getMailLink(projektarbeit) {
if(projektarbeit.email) {
return 'mailto:'+projektarbeit.email
} else return ''
},
getNoteBezeichnung(projektarbeit) {
if(projektarbeit.note) {
const noteOpt = this.notenOptions.find(opt => opt.note == projektarbeit.note)
return noteOpt?.bezeichnung
} else {
return ''
}
}
},
watch: {
@@ -328,19 +242,30 @@ export const AbgabetoolStudent = {
<h2>{{$p.t('abgabetool/abgabetoolTitle')}}</h2>
<hr>
<div v-if="projektarbeiten === null || projektarbeiten === []">
<div v-if="projektarbeiten === null">
{{$p.t('abgabetool/c4abgabeStudentNoProjectsFound')}}
</div>
<Accordion :multiple="true" :activeIndex="[0]">
<template v-for="projektarbeit in projektarbeiten">
<AccordionTab :header="getAccTabHeaderForProjektarbeit(projektarbeit)">
<AccordionTab>
<template #header>
<div class="d-flex row w-100">
<div class="col-6 text-start">
<span>{{getAccTabHeaderForProjektarbeit(projektarbeit)}}</span>
</div>
<div class="col-6 text-end">
<span>{{getNoteBezeichnung(projektarbeit)}}</span>
</div>
</div>
</template>
<div class="row">
<div class="col-4 col-md-3 fw-bold">{{$p.t('abgabetool/c4details')}}</div>
<div class="col-8 col-md-9">
<button @click="setDetailComponent(projektarbeit.details)" class="btn btn-primary">
Projektdetails öffnen <a><i class="fa fa-folder-open"></i></a>
{{$p.t('abgabetool/c4projektdetailsOeffnen')}} <a><i class="fa fa-folder-open"></i></a>
</button>
</div>
</div>
@@ -348,7 +273,7 @@ export const AbgabetoolStudent = {
<div class="col-4 col-md-3 fw-bold">{{$p.t('abgabetool/c4beurteilung')}}</div>
<div class="col-8 col-md-9">
<a v-if="projektarbeit.beurteilung"><i class="fa fa-file-pdf" style="color:#00649C"></i></a>
<a v-else>Keine Beurteilung vorhanden</a>
<a v-else>{{$p.t('abgabetool/c4nobeurteilungVorhanden')}}</a>
</div>
</div>
<div class="row mt-2">
@@ -371,6 +296,18 @@ export const AbgabetoolStudent = {
{{ projektarbeit.betreuer }}
</div>
</div>
<div class="row mt-2">
<div class="col-4 col-md-3 fw-bold">{{$p.t('abgabetool/c4betreuerEmailKontakt')}}</div>
<div class="col-8 col-md-9">
<a :href="getMailLink(projektarbeit)"><i class="fa fa-envelope" style="color:#00649C"></i></a>
</div>
</div>
<div v-if="projektarbeit.zweitbetreuer" class="row mt-2">
<div class="col-4 col-md-3 fw-bold">{{ projektarbeit.zweitbetreuer_betreuerart_kurzbz}}</div>
<div class="col-8 col-md-9">
{{ projektarbeit.zweitbetreuer_betreuerart_beschreibung}}: {{ projektarbeit.zweitbetreuer?.first }}
</div>
</div>
<div class="row mt-2">
<div class="col-4 col-md-3 fw-bold">{{$p.t('abgabetool/c4projekttyp')}}</div>
<div class="col-8 col-md-9">