mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-07-25 16:44:28 +00:00
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:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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>-->
|
||||
<!--<!– <p class="fhc-bullet" :class="{ 'fhc-bullet-red': termin.fixtermin, 'fhc-bullet-green': !termin.fixtermin }"></p>–>-->
|
||||
<!-- </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">
|
||||
|
||||
Reference in New Issue
Block a user