diff --git a/public/css/components/abgabetool/abgabe.css b/public/css/components/abgabetool/abgabe.css
index d70481805..7c22d8e7f 100644
--- a/public/css/components/abgabetool/abgabe.css
+++ b/public/css/components/abgabetool/abgabe.css
@@ -305,4 +305,23 @@
/* If you use hover rows, you need to ensure the sticky cell matches the hover color */
#abgabetable .tabulator-row:hover .tabulator-cell.sticky-col {
background-color: #ccc; /* Match your existing hover color */
+}
+
+.tabulator-cell {
+ container-type: inline-size;
+}
+
+.tabulator-col-title {
+ container-type: inline-size;
+}
+
+@container (max-width: 100px) {
+ .full-text {
+ display: none !important;
+ }
+
+ .short-text {
+ display: inline-block !important;
+ width: 100%;
+ }
}
\ No newline at end of file
diff --git a/public/js/components/Cis/Abgabetool/AbgabetoolAssistenz.js b/public/js/components/Cis/Abgabetool/AbgabetoolAssistenz.js
index bb5c6a710..72b764931 100644
--- a/public/js/components/Cis/Abgabetool/AbgabetoolAssistenz.js
+++ b/public/js/components/Cis/Abgabetool/AbgabetoolAssistenz.js
@@ -53,7 +53,6 @@ export const AbgabetoolAssistenz = {
},
data() {
return {
- tableData: null,
studiensemesterOptions: null,
allSem: null,
curSem: null,
@@ -185,7 +184,7 @@ export const AbgabetoolAssistenz = {
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4vorname'))), field: 'student_vorname', headerFilter: true, formatter: this.centeredTextFormatter,widthGrow: 1},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4nachname'))), field: 'student_nachname', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4studstatus'))), field: 'studienstatus', headerFilter: true, formatter: this.centeredTextFormatter,widthGrow: 1},
- {title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4orgform'))), field: 'orgform', headerFilter: true, formatter: this.centeredTextFormatter,widthGrow: 1},
+ {title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4orgformv2'))), field: 'orgform', headerFilter: true, formatter: this.centeredTextFormatter,widthGrow: 1},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4projekttyp'))), field: 'projekttyp_kurzbz', formatter: this.centeredTextFormatter, widthGrow: 1},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4stg'))), field: 'stg', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4note'))), field: 'note_bez', headerFilter: true,
@@ -210,20 +209,34 @@ export const AbgabetoolAssistenz = {
headerFilter: dateFilter,
headerFilterFunc: this.headerFilterTerminCol,
sorter: this.sortFuncTerminCol,
- field: 'prevTermin', formatter: this.abgabterminFormatter, widthGrow: 1, width: 250, tooltip: false},
+ tooltip: this.toolTipFuncPrevTermin,
+ field: 'prevTermin', formatter: this.abgabterminFormatter, widthGrow: 1, width: 250},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4nextAbgabetermin'))), field: 'nextTermin',
headerFilter: dateFilter,
headerFilterFunc: this.headerFilterTerminCol,
sorter: this.sortFuncTerminCol,
- formatter: this.abgabterminFormatter, widthGrow: 1, width: 250, tooltip: false},
+ tooltip: this.toolTipFuncNextTermin,
+ formatter: this.abgabterminFormatter, widthGrow: 1, width: 250},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4qgate1Status'))),
headerFilter: 'list',
headerFilterParams: { valuesLookup: this.getQGateStatusList },
- field: 'qgate1Status', formatter: this.centeredTextFormatter, widthGrow: 1, width: 220, tooltip: false},
+ field: 'qgate1Status',
+ formatter: this.centeredTextFormatter,
+ titleFormatter: this.shortLongTitleFormatter,
+ titleFormatterParams: {
+ shortForm: 'QG1'
+ },
+ widthGrow: 1, width: 220, tooltip: false},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4qgate2Status'))),
headerFilter: 'list',
headerFilterParams: { valuesLookup: this.getQGateStatusList },
- field: 'qgate2Status', formatter: this.centeredTextFormatter, widthGrow: 1, width: 220, tooltip: false},
+ field: 'qgate2Status',
+ formatter: this.centeredTextFormatter,
+ titleFormatter: this.shortLongTitleFormatter,
+ titleFormatterParams: {
+ shortForm: 'QG2'
+ },
+ widthGrow: 1, width: 220, tooltip: false},
],
persistence: false,
persistenceID: "abgabetool_2026_03_16"
@@ -247,6 +260,61 @@ export const AbgabetoolAssistenz = {
]};
},
methods: {
+ shortLongTitleFormatter(cell, formatterParams, onRendered) {
+ const longForm = cell.getValue()
+ const shortForm = formatterParams?.shortForm
+
+ if(longForm && shortForm) {
+ return `
+ ${longForm}
+
+
+ ${shortForm}
+ `
+ } else {
+ return `
+ ${longForm}
+ `
+ }
+
+ },
+ toolTipFuncPrevTermin(e, cell, onRendered) {
+ const data = cell.getData();
+ return this.mapDateStyleToTabulatorTooltip(data.prevTermin.dateStyle);
+ },
+ toolTipFuncNextTermin(e, cell, onRendered) {
+ const data = cell.getData();
+ return this.mapDateStyleToTabulatorTooltip(data.nextTermin.dateStyle);
+ },
+ mapDateStyleToTabulatorTooltip(dateStyleString) {
+ switch(dateStyleString) {
+ case 'bestanden':
+ return this.$p.t('abgabetool/c4tooltipBestanden')
+ break;
+ case 'nichtbestanden':
+ return this.$p.t('abgabetool/c4tooltipNichtBestanden')
+ break;
+ case 'beurteilungerforderlich':
+ return this.$p.t('abgabetool/c4tooltipBeurteilungerforderlich')
+ break;
+ case 'verspaetet':
+ return this.$p.t('abgabetool/c4tooltipVerspaetet')
+ break;
+ case 'abgegeben':
+ return this.$p.t('abgabetool/c4tooltipAbgegeben')
+ break;
+ case 'verpasst':
+ return this.$p.t('abgabetool/c4tooltipVerpasst')
+ break;
+ case 'abzugeben':
+ return this.$p.t('abgabetool/c4tooltipAbzugeben')
+ break;
+ case 'standard':
+ return this.$p.t('abgabetool/c4tooltipStandardv2')
+ break;
+ default: return ''
+ }
+ },
handlePaUpdated(projektarbeit) {
this.checkAbgabetermineProjektarbeit(projektarbeit)
this.$refs.abgabeTable.tabulator.redraw(true)
@@ -428,6 +496,32 @@ export const AbgabetoolAssistenz = {
projekt.qgate2StatusRank = 1
}
})
+
+ // set shorthand statuscode once real status has been determined
+ projekt.qgate1StatusShort = this.mapRankToShortStatus(projekt.qgate1StatusRank)
+ projekt.qgate2StatusShort = this.mapRankToShortStatus(projekt.qgate2StatusRank)
+ },
+ mapRankToShortStatus(rank) {
+ switch(rank){
+ case 0: // kein termin vorhanden
+ return '--'
+ break;
+ case 1: // noch nicht stattgefunden
+ return 'o'
+ break;
+ case 2: // noch nicht abgegeben
+ return '?'
+ break;
+ case 3: // noch nicht benotet
+ return '~'
+ break;
+ case 4: // negativ benotet
+ return '-'
+ break;
+ case 5: // positiv benotet
+ return '+'
+ break;
+ }
},
getItemBezeichnung(item){
if(!item.bezeichnung) return ''
@@ -901,37 +995,37 @@ export const AbgabetoolAssistenz = {
this.$refs.drawer.show()
},
centeredTextFormatter(cell) {
- const val = cell.getValue()
- if(!val) return
+ const longForm = cell.getValue()
+ if(!longForm) return
+ const data = cell.getData()
+ const entry = Object.entries(data).find(entry => entry[1] == longForm)
- return '
'
+ // shortFormKey must have same keyname as longForm but with 'Short' appended
+ const shortForm = data[entry[0]+'Short']
+
+ if(shortForm && longForm) {
+ return `
+
+ ${longForm}
+
+
+ ${shortForm}
+
+
`;
+ } else {
+ return ''
+ }
},
detailFormatter(cell) {
- return '' +
+ return '
'
},
- mailFormatter(cell) {
- const val = cell.getValue()
- return '
'
- },
- timelineFormatter() {
- return '
'
- },
- beurteilungFormatter(cell) {
- const val = cell.getValue()
- if(val) {
- return '
'
- } else return '-'
- },
pkzTextFormatter(cell) {
const val = cell.getValue()
- return '
'
+ return '
'
},
abgabterminFormatter(cell) {
const val = cell.getValue()
@@ -968,14 +1062,14 @@ export const AbgabetoolAssistenz = {
const bezeichnung = val.bezeichnung?.bezeichnung ?? val.bezeichnung
return '
' +
- ''
-
+
} else {
return ''
}
@@ -1001,14 +1095,13 @@ export const AbgabetoolAssistenz = {
return projekt.zweitbetreuer_full_name ?? ''
},
async setupData(data){
- this.projektarbeiten = data[0]
this.domain = data[1]
-
- this.tableData = this.mapProjekteToTableData(this.projektarbeiten)
+
+ this.projektarbeiten = this.mapProjekteToTableData(data[0])
await this.tableBuiltPromise
- this.$refs.abgabeTable.tabulator.setData(this.tableData);
+ this.$refs.abgabeTable.tabulator.setData(this.projektarbeiten);
},
loadProjektarbeiten(all = false, callback) {
this.loading = true
diff --git a/public/js/components/Cis/Abgabetool/AbgabetoolMitarbeiter.js b/public/js/components/Cis/Abgabetool/AbgabetoolMitarbeiter.js
index 6791d31aa..8f8a224d0 100644
--- a/public/js/components/Cis/Abgabetool/AbgabetoolMitarbeiter.js
+++ b/public/js/components/Cis/Abgabetool/AbgabetoolMitarbeiter.js
@@ -43,7 +43,6 @@ export const AbgabetoolMitarbeiter = {
},
data() {
return {
- tableData: null,
abgabetypenBetreuer: null,
detailIsFullscreen: false,
phrasenPromise: null,
@@ -153,19 +152,29 @@ export const AbgabetoolMitarbeiter = {
headerFilter: dateFilter,
headerFilterFunc: this.headerFilterTerminCol,
sorter: this.sortFuncTerminCol,
- formatter: this.abgabterminFormatter, widthGrow: 1, width: 250, tooltip: false},
+ tooltip: this.toolTipFuncPrevTermin,
+ formatter: this.abgabterminFormatter, widthGrow: 1, width: 250},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4nextAbgabetermin'))), field: 'nextTermin',
headerFilter: dateFilter,
headerFilterFunc: this.headerFilterTerminCol,
sorter: this.sortFuncTerminCol,
- formatter: this.abgabterminFormatter, widthGrow: 1, width: 250, tooltip: false},
+ tooltip: this.toolTipFuncNextTermin,
+ formatter: this.abgabterminFormatter, widthGrow: 1, width: 250},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4qgate1Status'))),
headerFilter: 'list',
- headerFilterParams: { valuesLookup: this.getQGateStatusList },
+ headerFilterParams: { valuesLookup: this.getQGateStatusList },
+ titleFormatter: this.shortLongTitleFormatter,
+ titleFormatterParams: {
+ shortForm: 'QG1'
+ },
field: 'qgate1Status', formatter: this.centeredTextFormatter, widthGrow: 1, width: 220, tooltip: false},
{title: Vue.computed(() => this.$capitalize(this.$p.t('abgabetool/c4qgate2Status'))),
headerFilter: 'list',
- headerFilterParams: { valuesLookup: this.getQGateStatusList },
+ headerFilterParams: { valuesLookup: this.getQGateStatusList },
+ titleFormatter: this.shortLongTitleFormatter,
+ titleFormatterParams: {
+ shortForm: 'QG2'
+ },
field: 'qgate2Status', formatter: this.centeredTextFormatter, widthGrow: 1, width: 220, tooltip: false}
],
persistence: false,
@@ -205,6 +214,61 @@ export const AbgabetoolMitarbeiter = {
]};
},
methods: {
+ shortLongTitleFormatter(cell, formatterParams, onRendered) {
+ const longForm = cell.getValue()
+ const shortForm = formatterParams?.shortForm
+
+ if(longForm && shortForm) {
+ return `
+ ${longForm}
+
+
+ ${shortForm}
+ `
+ } else {
+ return `
+ ${longForm}
+ `
+ }
+
+ },
+ toolTipFuncPrevTermin(e, cell, onRendered) {
+ const data = cell.getData();
+ return this.mapDateStyleToTabulatorTooltip(data.prevTermin.dateStyle);
+ },
+ toolTipFuncNextTermin(e, cell, onRendered) {
+ const data = cell.getData();
+ return this.mapDateStyleToTabulatorTooltip(data.nextTermin.dateStyle);
+ },
+ mapDateStyleToTabulatorTooltip(dateStyleString) {
+ switch(dateStyleString) {
+ case 'bestanden':
+ return this.$p.t('abgabetool/c4tooltipBestanden')
+ break;
+ case 'nichtbestanden':
+ return this.$p.t('abgabetool/c4tooltipNichtBestanden')
+ break;
+ case 'beurteilungerforderlich':
+ return this.$p.t('abgabetool/c4tooltipBeurteilungerforderlich')
+ break;
+ case 'verspaetet':
+ return this.$p.t('abgabetool/c4tooltipVerspaetet')
+ break;
+ case 'abgegeben':
+ return this.$p.t('abgabetool/c4tooltipAbgegeben')
+ break;
+ case 'verpasst':
+ return this.$p.t('abgabetool/c4tooltipVerpasst')
+ break;
+ case 'abzugeben':
+ return this.$p.t('abgabetool/c4tooltipAbzugeben')
+ break;
+ case 'standard':
+ return this.$p.t('abgabetool/c4tooltipStandardv2')
+ break;
+ default: return ''
+ }
+ },
handlePaUpdated(projektarbeit) {
this.checkAbgabetermineProjektarbeit(projektarbeit)
this.$refs.abgabeTable.tabulator.redraw(true)
@@ -451,6 +515,32 @@ export const AbgabetoolMitarbeiter = {
projekt.qgate2StatusRank = 1
}
})
+
+ // set shorthand statuscode once real status has been determined
+ projekt.qgate1StatusShort = this.mapRankToShortStatus(projekt.qgate1StatusRank)
+ projekt.qgate2StatusShort = this.mapRankToShortStatus(projekt.qgate2StatusRank)
+ },
+ mapRankToShortStatus(rank) {
+ switch(rank){
+ case 0: // kein termin vorhanden
+ return '--'
+ break;
+ case 1: // noch nicht stattgefunden
+ return 'o'
+ break;
+ case 2: // noch nicht abgegeben
+ return '?'
+ break;
+ case 3: // noch nicht benotet
+ return '~'
+ break;
+ case 4: // negativ benotet
+ return '-'
+ break;
+ case 5: // positiv benotet
+ return '+'
+ break;
+ }
},
checkAbgabetermineProjektarbeit(projekt) {
const now = luxon.DateTime.now()
@@ -517,11 +607,11 @@ export const AbgabetoolMitarbeiter = {
const bezeichnung = val.bezeichnung?.bezeichnung ?? val.bezeichnung
return '
' +
- ''
@@ -727,28 +817,37 @@ export const AbgabetoolMitarbeiter = {
},
centeredTextFormatter(cell) {
- const val = cell.getValue()
- if(!val) return
-
- return '
'
+ const longForm = cell.getValue()
+ if(!longForm) return
+ const data = cell.getData()
+ const entry = Object.entries(data).find(entry => entry[1] == longForm)
+
+ // shortFormKey must have same keyname as longForm but with 'Short' appended
+ const shortForm = data[entry[0]+'Short']
+
+ if(shortForm && longForm) {
+ return `
+
+ ${longForm}
+
+
+ ${shortForm}
+
+
`;
+ } else {
+ return '
'
+ }
},
detailFormatter(cell) {
- return '
' +
+ return '
'
},
- beurteilungFormatter(cell) {
- const val = cell.getValue()
- if(val) {
- return '
'
- } else return '-'
- },
pkzTextFormatter(cell) {
const val = cell.getValue()
- return '
'
+ return '
'
},
tableResolve(resolve) {
this.tableBuiltResolve = resolve
@@ -765,10 +864,9 @@ export const AbgabetoolMitarbeiter = {
setupData(data){
- this.projektarbeiten = data[0]
this.domain = data[1]
- this.tableData = data[0]?.retval?.map(projekt => {
+ this.projektarbeiten = data[0]?.retval?.map(projekt => {
this.checkAbgabetermineProjektarbeit(projekt)
projekt.selectable = projekt.betreuerart_kurzbz !== 'Zweitbegutachter'
@@ -789,7 +887,7 @@ export const AbgabetoolMitarbeiter = {
})
this.$refs.abgabeTable.tabulator.setColumns(this.abgabeTableOptions.columns)
- this.$refs.abgabeTable.tabulator.setData(this.tableData);
+ this.$refs.abgabeTable.tabulator.setData(this.projektarbeiten);
},
loadProjektarbeiten(all = false, callback) {
this.$api.call(ApiAbgabe.getMitarbeiterProjektarbeiten(all))
diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php
index 3b3b6f995..0903e7fe0 100644
--- a/system/phrasesupdate.php
+++ b/system/phrasesupdate.php
@@ -43767,18 +43767,18 @@ array(
array(
'app' => 'core',
'category' => 'abgabetool',
- 'phrase' => 'c4orgform',
+ 'phrase' => 'c4orgformv2',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
- 'text' => "Organisationseinheit",
+ 'text' => "Organisationsform",
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
- 'text' => "organization unit",
+ 'text' => "organization form",
'description' => '',
'insertvon' => 'system'
)