feat(users): show last-access timestamp per user

Maps Navidrome's lastAccessAt onto NdUser and renders it in the
User Management row as a localized relative time (Intl.RelativeTimeFormat
with the current i18n language). Tooltip carries the absolute
timestamp. Navidrome returns 0001-01-01 for never-accessed users —
detected and shown as the localized "Never" label.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Psychotoxical
2026-04-20 22:26:58 +02:00
parent 459c9f688d
commit 2d3be10c8f
10 changed files with 39 additions and 2 deletions
+1
View File
@@ -489,6 +489,7 @@ export const deTranslation = {
userMgmtLibrariesValidation: 'Mindestens eine Bibliothek auswählen.',
userMgmtLibrariesUpdateError: 'Benutzer gespeichert, aber Bibliothekszuweisung fehlgeschlagen',
userMgmtNoLibraries: 'Keine Bibliotheken zugewiesen',
userMgmtNeverSeen: 'Nie',
userMgmtSave: 'Speichern',
userMgmtCancel: 'Abbrechen',
userMgmtDelete: 'Löschen',
+1
View File
@@ -491,6 +491,7 @@ export const enTranslation = {
userMgmtLibrariesValidation: 'Select at least one library.',
userMgmtLibrariesUpdateError: 'User saved, but library assignment failed',
userMgmtNoLibraries: 'No libraries assigned',
userMgmtNeverSeen: 'Never',
userMgmtSave: 'Save',
userMgmtCancel: 'Cancel',
userMgmtDelete: 'Delete',
+1
View File
@@ -482,6 +482,7 @@ export const esTranslation = {
userMgmtLibrariesValidation: 'Selecciona al menos una biblioteca.',
userMgmtLibrariesUpdateError: 'Usuario guardado, pero la asignación de bibliotecas falló',
userMgmtNoLibraries: 'Sin bibliotecas asignadas',
userMgmtNeverSeen: 'Nunca',
userMgmtSave: 'Guardar',
userMgmtCancel: 'Cancelar',
userMgmtDelete: 'Eliminar',
+1
View File
@@ -479,6 +479,7 @@ export const frTranslation = {
userMgmtLibrariesValidation: 'Sélectionnez au moins une bibliothèque.',
userMgmtLibrariesUpdateError: 'Utilisateur enregistré, mais l\u2019attribution des bibliothèques a échoué',
userMgmtNoLibraries: 'Aucune bibliothèque attribuée',
userMgmtNeverSeen: 'Jamais',
userMgmtSave: 'Enregistrer',
userMgmtCancel: 'Annuler',
userMgmtDelete: 'Supprimer',
+1
View File
@@ -479,6 +479,7 @@ export const nbTranslation = {
userMgmtLibrariesValidation: 'Velg minst ett bibliotek.',
userMgmtLibrariesUpdateError: 'Brukeren ble lagret, men bibliotekstilordning mislyktes',
userMgmtNoLibraries: 'Ingen biblioteker tilordnet',
userMgmtNeverSeen: 'Aldri',
userMgmtSave: 'Lagre',
userMgmtCancel: 'Avbryt',
userMgmtDelete: 'Slett',
+1
View File
@@ -478,6 +478,7 @@ export const nlTranslation = {
userMgmtLibrariesValidation: 'Selecteer ten minste één bibliotheek.',
userMgmtLibrariesUpdateError: 'Gebruiker opgeslagen, maar bibliotheektoewijzing mislukt',
userMgmtNoLibraries: 'Geen bibliotheken toegewezen',
userMgmtNeverSeen: 'Nooit',
userMgmtSave: 'Opslaan',
userMgmtCancel: 'Annuleren',
userMgmtDelete: 'Verwijderen',
+1
View File
@@ -496,6 +496,7 @@ export const ruTranslation = {
userMgmtLibrariesValidation: 'Выберите хотя бы одну библиотеку.',
userMgmtLibrariesUpdateError: 'Пользователь сохранён, но не удалось назначить библиотеки',
userMgmtNoLibraries: 'Библиотеки не назначены',
userMgmtNeverSeen: 'Никогда',
userMgmtSave: 'Сохранить',
userMgmtCancel: 'Отмена',
userMgmtDelete: 'Удалить',
+1
View File
@@ -474,6 +474,7 @@ export const zhTranslation = {
userMgmtLibrariesValidation: '请至少选择一个音乐库。',
userMgmtLibrariesUpdateError: '用户已保存,但音乐库分配失败',
userMgmtNoLibraries: '未分配音乐库',
userMgmtNeverSeen: '从未',
userMgmtSave: '保存',
userMgmtCancel: '取消',
userMgmtDelete: '删除',