diff --git a/package.json b/package.json index f7fe6c3..4d2e6f0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "harheimertc-website", - "version": "1.1.2", + "version": "1.1.3", "description": "Moderne Webseite für den Harheimer Tischtennis Club", "private": true, "type": "module", diff --git a/pages/cms/benutzer.vue b/pages/cms/benutzer.vue index 28dce73..e7ad38b 100644 --- a/pages/cms/benutzer.vue +++ b/pages/cms/benutzer.vue @@ -106,9 +106,31 @@
-

- Aktive Benutzer ({{ activeUsers.length }}) -

+
+

+ Aktive Benutzer ({{ sortedActiveUsers.length }}) +

+
+ + +
+
@@ -135,13 +157,13 @@
- {{ user.name }} + {{ getDisplayName(user) }}
@@ -253,7 +275,7 @@ >

- Rollen bearbeiten: {{ editingUser.name }} + Rollen bearbeiten: {{ getDisplayName(editingUser) }}

@@ -350,6 +372,7 @@ const errorMessage = ref('') const showRoleModal = ref(false) const editingUser = ref(null) const selectedRoles = ref([]) +const nameSortMode = ref('firstLast') const pendingUsers = computed(() => { return allUsers.value @@ -364,6 +387,61 @@ const activeUsers = computed(() => { return allUsers.value.filter(u => u.active === true) }) +const splitNameParts = (name = '') => { + const trimmed = (name || '').trim() + if (!trimmed) { + return { firstName: '', lastName: '' } + } + + if (trimmed.includes(',')) { + const [lastNameRaw, ...firstNameRaw] = trimmed.split(',') + return { + firstName: firstNameRaw.join(',').trim(), + lastName: (lastNameRaw || '').trim() + } + } + + const parts = trimmed.split(/\s+/).filter(Boolean) + if (parts.length <= 1) { + return { firstName: parts[0] || '', lastName: '' } + } + + return { + firstName: parts[0], + lastName: parts.slice(1).join(' ') + } +} + +const getDisplayName = (user) => { + const { firstName, lastName } = splitNameParts(user?.name || '') + + if (nameSortMode.value === 'lastFirst') { + if (!lastName) { + return firstName + } + return `${lastName}, ${firstName}`.trim() + } + + return `${firstName} ${lastName}`.trim() +} + +const sortedActiveUsers = computed(() => { + return [...activeUsers.value].sort((a, b) => { + const nameA = splitNameParts(a.name) + const nameB = splitNameParts(b.name) + + if (nameSortMode.value === 'lastFirst') { + const lastNameCompare = nameA.lastName.localeCompare(nameB.lastName, 'de', { sensitivity: 'base' }) + if (lastNameCompare !== 0) return lastNameCompare + return nameA.firstName.localeCompare(nameB.firstName, 'de', { sensitivity: 'base' }) + } + + const firstNameCompare = nameA.firstName.localeCompare(nameB.firstName, 'de', { sensitivity: 'base' }) + if (firstNameCompare !== 0) return firstNameCompare + return nameA.lastName.localeCompare(nameB.lastName, 'de', { sensitivity: 'base' }) + }) +}) + const formatDate = (dateString) => { return new Date(dateString).toLocaleString('de-DE', { year: 'numeric',