diff --git a/frontend/src/components/members/MembersOverviewSection.vue b/frontend/src/components/members/MembersOverviewSection.vue
index d4d137d8..f2c4c4ff 100644
--- a/frontend/src/components/members/MembersOverviewSection.vue
+++ b/frontend/src/components/members/MembersOverviewSection.vue
@@ -189,6 +189,7 @@
+
diff --git a/frontend/src/i18n/locales/de-CH.json b/frontend/src/i18n/locales/de-CH.json
index 94ca87e3..3f88b7e3 100644
--- a/frontend/src/i18n/locales/de-CH.json
+++ b/frontend/src/i18n/locales/de-CH.json
@@ -637,6 +637,7 @@
"sortFirstName": "Vorname",
"sortBirthday": "Geburtstag",
"sortAge": "Alter",
+ "sortQttr": "QTTR-Wert",
"ageRange": "Alter von - bis",
"ageFromPlaceholder": "von",
"ageToPlaceholder": "bis",
diff --git a/frontend/src/i18n/locales/de-extended.json b/frontend/src/i18n/locales/de-extended.json
index ef0bf687..b1969178 100644
--- a/frontend/src/i18n/locales/de-extended.json
+++ b/frontend/src/i18n/locales/de-extended.json
@@ -384,6 +384,7 @@
"sortFirstName": "Vorname",
"sortBirthday": "Geburtstag",
"sortAge": "Alter",
+ "sortQttr": "QTTR-Wert",
"ageRange": "Alter von - bis",
"ageFromPlaceholder": "von",
"ageToPlaceholder": "bis",
diff --git a/frontend/src/i18n/locales/de.json b/frontend/src/i18n/locales/de.json
index dad8cabf..b386180a 100644
--- a/frontend/src/i18n/locales/de.json
+++ b/frontend/src/i18n/locales/de.json
@@ -385,6 +385,7 @@
"sortFirstName": "Vorname",
"sortBirthday": "Geburtstag",
"sortAge": "Alter",
+ "sortQttr": "QTTR-Wert",
"ageRange": "Alter von - bis",
"ageFromPlaceholder": "von",
"ageToPlaceholder": "bis",
diff --git a/frontend/src/i18n/locales/en-AU.json b/frontend/src/i18n/locales/en-AU.json
index 4c7e0908..336cb0c3 100644
--- a/frontend/src/i18n/locales/en-AU.json
+++ b/frontend/src/i18n/locales/en-AU.json
@@ -636,6 +636,7 @@
"sortFirstName": "First name",
"sortBirthday": "Birthday",
"sortAge": "Age",
+ "sortQttr": "QTTR value",
"ageRange": "Age from - to",
"ageFromPlaceholder": "from",
"ageToPlaceholder": "to",
diff --git a/frontend/src/i18n/locales/en-GB.json b/frontend/src/i18n/locales/en-GB.json
index fba1b7c8..c0041c77 100644
--- a/frontend/src/i18n/locales/en-GB.json
+++ b/frontend/src/i18n/locales/en-GB.json
@@ -911,6 +911,7 @@
"sortFirstName": "First name",
"sortBirthday": "Birthday",
"sortAge": "Age",
+ "sortQttr": "QTTR value",
"ageRange": "Age from - to",
"ageFromPlaceholder": "from",
"ageToPlaceholder": "to",
diff --git a/frontend/src/i18n/locales/en-US.json b/frontend/src/i18n/locales/en-US.json
index 49a0db1a..cf19818e 100644
--- a/frontend/src/i18n/locales/en-US.json
+++ b/frontend/src/i18n/locales/en-US.json
@@ -636,6 +636,7 @@
"sortFirstName": "First name",
"sortBirthday": "Birthday",
"sortAge": "Age",
+ "sortQttr": "QTTR value",
"ageRange": "Age from - to",
"ageFromPlaceholder": "from",
"ageToPlaceholder": "to",
diff --git a/frontend/src/i18n/locales/es.json b/frontend/src/i18n/locales/es.json
index 2b4858e0..c4b99dc8 100644
--- a/frontend/src/i18n/locales/es.json
+++ b/frontend/src/i18n/locales/es.json
@@ -602,6 +602,7 @@
"sortFirstName": "Nombre",
"sortBirthday": "Fecha de nacimiento",
"sortAge": "Edad",
+ "sortQttr": "Valor QTTR",
"ageRange": "Edad de - a",
"ageFromPlaceholder": "de",
"ageToPlaceholder": "a",
diff --git a/frontend/src/i18n/locales/fil.json b/frontend/src/i18n/locales/fil.json
index 003f392a..5fe0a305 100644
--- a/frontend/src/i18n/locales/fil.json
+++ b/frontend/src/i18n/locales/fil.json
@@ -602,6 +602,7 @@
"sortFirstName": "First name",
"sortBirthday": "Birthday",
"sortAge": "Age",
+ "sortQttr": "Halaga ng QTTR",
"ageRange": "Edad mula - hanggang",
"ageFromPlaceholder": "mula",
"ageToPlaceholder": "hanggang",
diff --git a/frontend/src/i18n/locales/fr.json b/frontend/src/i18n/locales/fr.json
index 35e0c145..215441c7 100644
--- a/frontend/src/i18n/locales/fr.json
+++ b/frontend/src/i18n/locales/fr.json
@@ -602,6 +602,7 @@
"sortFirstName": "Prénom",
"sortBirthday": "Date de naissance",
"sortAge": "Âge",
+ "sortQttr": "Valeur QTTR",
"ageRange": "Âge de - à",
"ageFromPlaceholder": "de",
"ageToPlaceholder": "à",
diff --git a/frontend/src/i18n/locales/it.json b/frontend/src/i18n/locales/it.json
index 1340f523..ed1267cf 100644
--- a/frontend/src/i18n/locales/it.json
+++ b/frontend/src/i18n/locales/it.json
@@ -602,6 +602,7 @@
"sortFirstName": "Nome",
"sortBirthday": "Data di nascita",
"sortAge": "Età",
+ "sortQttr": "Valore QTTR",
"ageRange": "Età da - a",
"ageFromPlaceholder": "da",
"ageToPlaceholder": "a",
diff --git a/frontend/src/i18n/locales/ja.json b/frontend/src/i18n/locales/ja.json
index f82305b9..251e3ffc 100644
--- a/frontend/src/i18n/locales/ja.json
+++ b/frontend/src/i18n/locales/ja.json
@@ -602,6 +602,7 @@
"sortFirstName": "First name",
"sortBirthday": "Birthday",
"sortAge": "Age",
+ "sortQttr": "QTTR値",
"ageRange": "年齢範囲",
"ageFromPlaceholder": "から",
"ageToPlaceholder": "まで",
diff --git a/frontend/src/i18n/locales/pl.json b/frontend/src/i18n/locales/pl.json
index 162cd45f..d47fe619 100644
--- a/frontend/src/i18n/locales/pl.json
+++ b/frontend/src/i18n/locales/pl.json
@@ -602,6 +602,7 @@
"sortFirstName": "Imię",
"sortBirthday": "Data urodzenia",
"sortAge": "Wiek",
+ "sortQttr": "Wartość QTTR",
"ageRange": "Wiek od - do",
"ageFromPlaceholder": "od",
"ageToPlaceholder": "do",
diff --git a/frontend/src/i18n/locales/th.json b/frontend/src/i18n/locales/th.json
index 9b97a8ae..87f42b19 100644
--- a/frontend/src/i18n/locales/th.json
+++ b/frontend/src/i18n/locales/th.json
@@ -602,6 +602,7 @@
"sortFirstName": "First name",
"sortBirthday": "Birthday",
"sortAge": "Age",
+ "sortQttr": "ค่า QTTR",
"ageRange": "ช่วงอายุ",
"ageFromPlaceholder": "จาก",
"ageToPlaceholder": "ถึง",
diff --git a/frontend/src/i18n/locales/tl.json b/frontend/src/i18n/locales/tl.json
index 462c3919..38c2286f 100644
--- a/frontend/src/i18n/locales/tl.json
+++ b/frontend/src/i18n/locales/tl.json
@@ -602,6 +602,7 @@
"sortFirstName": "First name",
"sortBirthday": "Birthday",
"sortAge": "Age",
+ "sortQttr": "Halaga ng QTTR",
"ageRange": "Edad mula - hanggang",
"ageFromPlaceholder": "mula",
"ageToPlaceholder": "hanggang",
diff --git a/frontend/src/i18n/locales/zh.json b/frontend/src/i18n/locales/zh.json
index 17dc8cb2..778a18ee 100644
--- a/frontend/src/i18n/locales/zh.json
+++ b/frontend/src/i18n/locales/zh.json
@@ -602,6 +602,7 @@
"sortFirstName": "First name",
"sortBirthday": "Birthday",
"sortAge": "Age",
+ "sortQttr": "QTTR值",
"ageRange": "年龄范围",
"ageFromPlaceholder": "从",
"ageToPlaceholder": "到",
diff --git a/frontend/src/views/MembersView.vue b/frontend/src/views/MembersView.vue
index 845d2b8e..fc2e8f3c 100644
--- a/frontend/src/views/MembersView.vue
+++ b/frontend/src/views/MembersView.vue
@@ -916,6 +916,10 @@ export default {
const date = new Date(member.lastTraining);
return Number.isNaN(date.getTime()) ? Number.MAX_SAFE_INTEGER : date.getTime();
};
+ const getQttrValue = (member) => {
+ const parsed = Number.parseFloat(member?.qttr);
+ return Number.isFinite(parsed) ? parsed : null;
+ };
const compareStrings = (a, b) => String(a || '').localeCompare(String(b || ''), 'de-DE');
const direction = this.sortDirection === 'desc' ? -1 : 1;
@@ -931,6 +935,24 @@ export default {
case 'age':
result = getAgeValue(a) - getAgeValue(b) || compareStrings(a.lastName, b.lastName);
break;
+ case 'qttr': {
+ const qttrA = getQttrValue(a);
+ const qttrB = getQttrValue(b);
+ const hasQttrA = qttrA !== null;
+ const hasQttrB = qttrB !== null;
+
+ // Fehlende QTTR-Werte immer nach unten sortieren, unabhängig von der Sortierrichtung.
+ if (!hasQttrA && hasQttrB) {
+ result = 1;
+ } else if (hasQttrA && !hasQttrB) {
+ result = -1;
+ } else if (!hasQttrA && !hasQttrB) {
+ result = compareStrings(a.lastName, b.lastName) || compareStrings(a.firstName, b.firstName);
+ } else {
+ result = (qttrA - qttrB) * direction || compareStrings(a.lastName, b.lastName) || compareStrings(a.firstName, b.firstName);
+ }
+ break;
+ }
case 'lastTraining':
result = getLastTrainingValue(a) - getLastTrainingValue(b) || compareStrings(a.lastName, b.lastName);
break;
@@ -942,6 +964,10 @@ export default {
result = compareStrings(a.lastName, b.lastName) || compareStrings(a.firstName, b.firstName);
break;
}
+ // QTTR berücksichtigt die Sortierrichtung bereits im Zweig selbst.
+ if (this.selectedSort === 'qttr') {
+ return result;
+ }
return result * direction;
});