Merge remote-tracking branch 'origin/master' into feature-60873/GesamtnoteneingabeCis4

This commit is contained in:
Johann Hoffmann
2025-07-15 09:51:11 +02:00
42 changed files with 1336 additions and 191 deletions
+1
View File
@@ -119,6 +119,7 @@ export default {
<div class="modal-content">
<div v-if="$slots.title" class="modal-header">
<h5 class="modal-title"><slot name="title"/></h5>
<slot name="popoutButton"></slot>
<button v-if="!noCloseBtn" type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body" :class="bodyClass">
+1 -1
View File
@@ -318,7 +318,7 @@ export default {
>
<slot></slot>
</component>
<label v-if="label && (lcType == 'radio' || lcType == 'checkbox')" :for="idCmp" :class="!noAutoClass && 'form-check-label'">{{label}}</label>
<label v-if="label && (lcType == 'radio' || lcType == 'checkbox')" :for="idCmp" :class="!noAutoClass && 'form-check-label'" v-html="label"></label>
<div v-if="valid !== undefined && feedback.length && !noFeedback" :class="feedbackClass">
<template v-for="(msg, i) in feedback" :key="i">
<hr v-if="i" class="m-0">
+5 -1
View File
@@ -20,6 +20,10 @@ export default {
accept: {
type: String,
default: ''
},
disabled: {
type: Boolean,
default: false
}
},
methods: {
@@ -88,7 +92,7 @@ export default {
},
template: `
<div class="form-upload-dms">
<input ref="upload" class="form-control" :accept="accept" :class="inputClass" :id="id" :name="name" :multiple="multiple" type="file" @change="addFiles">
<input ref="upload" class="form-control" :disabled="disabled" :accept="accept" :class="inputClass" :id="id" :name="name" :multiple="multiple" type="file" @change="addFiles">
<ul v-if="modelValue.length && multiple && !noList" :accept="accept" class="list-unstyled m-0">
<dms-item
v-for="(file, index) in modelValue"
+11 -6
View File
@@ -75,7 +75,7 @@ export const CoreFilterCmpt = {
newBtnDisabled: Boolean,
newBtnLabel: String,
uniqueId: String,
// TODO soll im master kommen?
idField: String,
parentIdField: String,
countOnly: Boolean
@@ -216,17 +216,22 @@ export const CoreFilterCmpt = {
}
// Define a default tabulator options in case it was not provided
let tabulatorOptions = {...{
height: 500,
layout: "fitDataStretchFrozen",
movableColumns: true,
columnDefaults:{
tooltip: true
},
placeholder,
reactiveData: true,
persistence: this.persistence,
}, ...(this.tabulatorOptions || {})};
// set default height if no height property is set
if (tabulatorOptions.height === undefined &&
tabulatorOptions.minHeight === undefined &&
tabulatorOptions.maxHeight === undefined) {
tabulatorOptions.height = 500;
}
if (!this.tableOnly) {
tabulatorOptions.data = this.filteredData;
tabulatorOptions.columns = this.filteredColumns;
@@ -234,7 +239,7 @@ export const CoreFilterCmpt = {
if (tabulatorOptions.selectable || (tabulatorOptions.columns && tabulatorOptions.columns.filter(el => el.formatter == 'rowSelection').length))
this.tabulatorHasSelector = true;
// TODO check ob im core bleiben soll
if (this.idField) {
// enable nested tabulator if parent Id given
if (this.parentIdField) tabulatorOptions.dataTree = true;
@@ -258,7 +263,7 @@ export const CoreFilterCmpt = {
this.tabulator.on("rowSelectionChanged", data => {
this.selectedData = data;
});
// TODO check ob im core so bleiben soll
// if nested tabulator, restructure data
if (this.parentIdField && this.idField) {
this.tabulator.on("dataLoading", data => {
@@ -575,7 +580,7 @@ export const CoreFilterCmpt = {
this.getFilter
);
},
// TODO check ob im core so bleiben soll
// append child to it's parent
appendChild(data, child) {
// get parent id
@@ -50,12 +50,21 @@ var InfocenterPersonDataset = {
'</select>' +
'<select class="form-control auswahlAbsageAbgeschickt" style="width:auto; float:left;">' +
'<option value="null" selected="selected"> Bewerbung abgeschickt? </option>' +
'<option value="all"> Beide </option>' +
'<option value="true"> Ja </option>' +
'<option value="false"> Nein </option>' +
'</select>' +
'<button class="btn btn-default auswahlAbsageBtn" style="float:left"> Absage </button>';
let rueckstellung = '<br />' +
'<select id="rueckstellungtype" class="form-control" style="width:auto; float:left;">' +
'<option disabled value="null" selected>' + FHC_PhrasesLib.t('infocenter', 'statusAuswahl') + '</option>' +
'</select>' +
'<input id="rueckstellungdate" type="text" class="form-control" style="width:auto; float:left;" placeholder="Parkdatum">' +
'<button class="form-control btn btn-default rueckstellBtn" style="width:auto; float:left"> Zurückstellen </button>';
InfocenterPersonDataset.getAbsageData();
Rueckstellung.getStatus()
var studienSemesterHtml = '<button class="btn btn-default btn-xs decStudiensemester">' +
'<i class="fa fa-chevron-left"></i>' +
@@ -98,10 +107,22 @@ var InfocenterPersonDataset = {
"<div class='row'>"+
"<div class='col-xs-12'>"+auswahlAbsageToggle+"</div>"+
"<div class='col-xs-12' id='absagePunkte' style='display:none'>"+auswahlAbsage+"</div>"+
"<div class='col-xs-12' id='rueckstellung' style='display:none'>"+rueckstellung+"</div>"+
"</div>" +
"<div class='h-divider'></div>" +
"<hr class='studiensemesterline'>"
)
let rueckstelldate = new Date();
rueckstelldate.setDate(rueckstelldate.getDate() + 14);
$('#rueckstellungdate').attr("value", $.datepicker.formatDate("dd.mm.yy", rueckstelldate));
$("#rueckstellungdate").datepicker({
"dateFormat": "dd.mm.yy",
"minDate": 1
});
$("button.incStudiensemester").click(function() {
InfocenterPersonDataset.changeStudiensemesterUservar(1);
});
@@ -123,6 +144,29 @@ var InfocenterPersonDataset = {
$(".absageModalForAll").modal("show");
});
$('button.rueckstellBtn').click(function()
{
let idsel = $("#filterTableDataset input:checked[name=PersonId\\[\\]]");
if(idsel.length <= 0)
return FHC_DialogLib.alertInfo("Bitte wählen Sie die Personen aus.");
let type = $('#rueckstellungtype').val()
if (type === null)
return FHC_DialogLib.alertInfo("Bitte ein Rückstellgrund auswählen.");
let personen = [];
for (let i = 0; i < idsel.length; i++)
{
personen.push($(idsel[i]).val());
}
let date = $("#rueckstellungdate").val();
Rueckstellung.setForPersons(personen, type, date)
});
$('#saveAbsageForAll').click(function()
{
InfocenterPersonDataset.saveAbsageForAll();
@@ -131,6 +175,7 @@ var InfocenterPersonDataset = {
$('a.absageToggle').click(function()
{
$('#absagePunkte').toggle();
$('#rueckstellung').toggle();
})
var personcount = 0;
@@ -356,6 +401,11 @@ var InfocenterPersonDataset = {
text: value.bezeichnung_mehrsprachig[0]
}))
})
$('.auswahlAbsageStg').append($("<option/>", {
value: 'all',
text: 'Alle'
}))
$.each(data.studiengaenge, function(key, value){
$('.auswahlAbsageStg').append($("<option/>", {
value: value.studiengang,
+27
View File
@@ -87,6 +87,33 @@ var Rueckstellung = {
}
);
},
setForPersons: function(personen, type, date)
{
if (type === null)
return false;
FHC_AjaxClient.ajaxCallPost(
CONTROLLER_RUECKSTELLUNG_URL + '/setForPersonen',
{
"personen": personen,
"datum_bis": date,
"status_kurzbz": type,
},
{
successCallback: function(data, textStatus, jqXHR) {
if (FHC_AjaxClient.isError(data))
FHC_DialogLib.alertError(FHC_AjaxClient.getError(data));
if (FHC_AjaxClient.hasData(data))
FHC_DialogLib.alertSuccess("Erfolgreich gespeichert.")
},
errorCallback: function(jqXHR, textStatus, errorThrown) {
FHC_DialogLib.alertError(textStatus);
},
veilTimeout: 0
}
);
},
delete: function(personid, status = null)
{
FHC_AjaxClient.ajaxCallPost(
+7 -1
View File
@@ -117,7 +117,7 @@ const helperApp = Vue.createApp({
},
methods: {
mailToUrl(slotProps) {
let mailTo = '[email protected]'; // TODO domain anpassen
let mailTo = FHC_JS_DATA_STORAGE_OBJECT.systemerror_mailto;
let subject = 'Meldung%20Systemfehler';
let body = `
Danke, dass Sie uns den Fehler melden. %0D%0A %0D%0A
@@ -141,6 +141,11 @@ const helperApp = Vue.createApp({
unmounted() {
helperAppContainer.parentElement.removeChild(helperAppContainer);
},
computed: {
showmaillink: function() {
return FHC_JS_DATA_STORAGE_OBJECT.systemerror_mailto !== '';
}
},
template: `
<pv-toast ref="toast" class="fhc-alert" :base-z-index="99999"></pv-toast>
<pv-toast ref="alert" class="fhc-alert" :base-z-index="99999" position="center">
@@ -162,6 +167,7 @@ const helperApp = Vue.createApp({
Fehler anzeigen
</a>
<a
v-if="showmaillink"
class="btn btn-primary flex-fill"
target="_blank"
:href="mailToUrl(slotProps)"
+7 -1
View File
@@ -109,7 +109,7 @@ const helperApp = Vue.createApp({
},
methods: {
mailToUrl(slotProps) {
let mailTo = '[email protected]'; // TODO domain anpassen
let mailTo = FHC_JS_DATA_STORAGE_OBJECT.systemerror_mailto;
let subject = 'Meldung%20Systemfehler';
let body = `
Danke, dass Sie uns den Fehler melden. %0D%0A %0D%0A
@@ -133,6 +133,11 @@ const helperApp = Vue.createApp({
unmounted() {
helperAppContainer.parentElement.removeChild(helperAppContainer);
},
computed: {
showmaillink: function() {
return FHC_JS_DATA_STORAGE_OBJECT.systemerror_mailto !== '';
}
},
template: `
<pv-toast ref="toast" class="fhc-alert" :base-z-index="99999"></pv-toast>
<pv-toast ref="alert" class="fhc-alert" :base-z-index="99999" position="center">
@@ -154,6 +159,7 @@ const helperApp = Vue.createApp({
Fehler anzeigen
</a>
<a
v-if="showmaillink"
class="btn btn-primary flex-fill"
target="_blank"
:href="mailToUrl(slotProps)"