feat(members): add TTR sorting option and update related functionality
All checks were successful
Deploy tt-tagebuch / deploy (push) Successful in 55s

This commit is contained in:
Torsten Schulz (local)
2026-09-02 14:50:35 +02:00
parent 0dc746d1cb
commit d2d73e4548
17 changed files with 31 additions and 13 deletions

View File

@@ -187,6 +187,7 @@
<option value="firstName">{{ $t('members.sortFirstName') }}</option>
<option value="birthday">{{ $t('members.sortBirthday') }}</option>
<option value="age">{{ $t('members.sortAge') }}</option>
<option value="ttr">{{ $t('members.sortTtr') }}</option>
<option value="qttr">{{ $t('members.sortQttr') }}</option>
<option value="lastTraining">{{ $t('members.sortLastTraining') }}</option>
<option value="openTasks">{{ $t('members.sortOpenTasks') }}</option>

View File

@@ -486,6 +486,7 @@
"sortFirstName": "Ngalan",
"sortBirthday": "Adlawng natawhan",
"sortAge": "Edad",
"sortTtr": "TTR value",
"sortQttr": "QTTR value",
"ageRange": "Edad gikan - hangtod",
"ageFromPlaceholder": "gikan",

View File

@@ -485,6 +485,7 @@
"sortFirstName": "Vorname",
"sortBirthday": "Geburtstag",
"sortAge": "Alter",
"sortTtr": "TTR-Wert",
"sortQttr": "QTTR-Wert",
"ageRange": "Alter von - bis",
"ageFromPlaceholder": "von",

View File

@@ -504,6 +504,7 @@
"sortFirstName": "Vorname",
"sortBirthday": "Geburtstag",
"sortAge": "Alter",
"sortTtr": "TTR-Wert",
"sortQttr": "QTTR-Wert",
"ageRange": "Alter von - bis",
"ageFromPlaceholder": "von",

View File

@@ -494,6 +494,7 @@
"sortFirstName": "First name",
"sortBirthday": "Birthday",
"sortAge": "Age",
"sortTtr": "TTR value",
"sortQttr": "QTTR value",
"ageRange": "Age from - to",
"ageFromPlaceholder": "from",

View File

@@ -494,6 +494,7 @@
"sortFirstName": "First name",
"sortBirthday": "Birthday",
"sortAge": "Age",
"sortTtr": "TTR value",
"sortQttr": "QTTR value",
"ageRange": "Age from - to",
"ageFromPlaceholder": "from",

View File

@@ -494,6 +494,7 @@
"sortFirstName": "First name",
"sortBirthday": "Birthday",
"sortAge": "Age",
"sortTtr": "TTR value",
"sortQttr": "QTTR value",
"ageRange": "Age from - to",
"ageFromPlaceholder": "from",

View File

@@ -502,6 +502,7 @@
"sortFirstName": "Nombre",
"sortBirthday": "Fecha de nacimiento",
"sortAge": "Edad",
"sortTtr": "Valor TTR",
"sortQttr": "Valor QTTR",
"ageRange": "Edad de - a",
"ageFromPlaceholder": "de",

View File

@@ -501,6 +501,7 @@
"sortFirstName": "Pangalan",
"sortBirthday": "Birthday",
"sortAge": "Edad",
"sortTtr": "Halaga ng TTR",
"sortQttr": "Halaga ng QTTR",
"ageRange": "Edad mula - hanggang",
"ageFromPlaceholder": "mula",

View File

@@ -498,6 +498,7 @@
"sortFirstName": "Prénom",
"sortBirthday": "Date de naissance",
"sortAge": "Âge",
"sortTtr": "Valeur TTR",
"sortQttr": "Valeur QTTR",
"ageRange": "Âge de - à",
"ageFromPlaceholder": "de",

View File

@@ -500,6 +500,7 @@
"sortFirstName": "Nome",
"sortBirthday": "Data di nascita",
"sortAge": "Età",
"sortTtr": "Valore TTR",
"sortQttr": "Valore QTTR",
"ageRange": "Età da - a",
"ageFromPlaceholder": "da",

View File

@@ -502,6 +502,7 @@
"sortFirstName": "ファーストネーム",
"sortBirthday": "誕生日",
"sortAge": "年",
"sortTtr": "TTR値",
"sortQttr": "QTTR値",
"ageRange": "年齢範囲",
"ageFromPlaceholder": "から",

View File

@@ -499,6 +499,7 @@
"sortFirstName": "Imię",
"sortBirthday": "Data urodzenia",
"sortAge": "Wiek",
"sortTtr": "Wartość TTR",
"sortQttr": "Wartość QTTR",
"ageRange": "Wiek od - do",
"ageFromPlaceholder": "od",

View File

@@ -504,6 +504,7 @@
"sortFirstName": "ชื่อ",
"sortBirthday": "วันเกิด",
"sortAge": "อายุ",
"sortTtr": "ค่า TTR",
"sortQttr": "ค่า QTTR",
"ageRange": "ช่วงอายุ",
"ageFromPlaceholder": "จาก",

View File

@@ -500,6 +500,7 @@
"sortFirstName": "Pangalan",
"sortBirthday": "Birthday",
"sortAge": "Edad",
"sortTtr": "Halaga ng TTR",
"sortQttr": "Halaga ng QTTR",
"ageRange": "Edad mula - hanggang",
"ageFromPlaceholder": "mula",

View File

@@ -503,6 +503,7 @@
"sortFirstName": "名",
"sortBirthday": "生日",
"sortAge": "年龄",
"sortTtr": "TTR值",
"sortQttr": "QTTR值",
"ageRange": "年龄范围",
"ageFromPlaceholder": "从",

View File

@@ -1113,8 +1113,8 @@ 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);
const getRatingValue = (member, rating) => {
const parsed = Number.parseFloat(member?.[rating]);
return Number.isFinite(parsed) ? parsed : null;
};
const compareStrings = (a, b) => String(a || '').localeCompare(String(b || ''), 'de-DE');
@@ -1132,21 +1132,23 @@ export default {
case 'age':
result = getAgeValue(a) - getAgeValue(b) || compareStrings(a.lastName, b.lastName);
break;
case 'ttr':
case 'qttr': {
const qttrA = getQttrValue(a);
const qttrB = getQttrValue(b);
const hasQttrA = qttrA !== null;
const hasQttrB = qttrB !== null;
const rating = this.selectedSort;
const ratingA = getRatingValue(a, rating);
const ratingB = getRatingValue(b, rating);
const hasRatingA = ratingA !== null;
const hasRatingB = ratingB !== null;
// Fehlende QTTR-Werte immer nach unten sortieren, unabhängig von der Sortierrichtung.
if (!hasQttrA && hasQttrB) {
// Fehlende TTR-/QTTR-Werte immer nach unten sortieren, unabhängig von der Sortierrichtung.
if (!hasRatingA && hasRatingB) {
result = 1;
} else if (hasQttrA && !hasQttrB) {
} else if (hasRatingA && !hasRatingB) {
result = -1;
} else if (!hasQttrA && !hasQttrB) {
} else if (!hasRatingA && !hasRatingB) {
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);
result = (ratingA - ratingB) * direction || compareStrings(a.lastName, b.lastName) || compareStrings(a.firstName, b.firstName);
}
break;
}
@@ -1161,8 +1163,8 @@ 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') {
// TTR und QTTR berücksichtigen die Sortierrichtung bereits im Zweig selbst.
if (this.selectedSort === 'ttr' || this.selectedSort === 'qttr') {
return result;
}
return result * direction;