diff --git a/backend/endpoints/responses/client_token.py b/backend/endpoints/responses/client_token.py index 5107e060c..c12688dec 100644 --- a/backend/endpoints/responses/client_token.py +++ b/backend/endpoints/responses/client_token.py @@ -21,6 +21,8 @@ class ClientTokenCreateSchema(ClientTokenSchema): class ClientTokenAdminSchema(ClientTokenSchema): username: str + user_avatar_path: str + user_updated_at: UTCDatetime class ClientTokenPairSchema(BaseModel): diff --git a/backend/utils/client_tokens.py b/backend/utils/client_tokens.py index 7804b0c75..6a28d5d41 100644 --- a/backend/utils/client_tokens.py +++ b/backend/utils/client_tokens.py @@ -105,6 +105,8 @@ def build_admin_schema(token: ClientToken) -> ClientTokenAdminSchema: created_at=token.created_at, user_id=token.user_id, username=token.user.username, + user_avatar_path=token.user.avatar_path, + user_updated_at=token.user.updated_at, ) diff --git a/frontend/src/locales/en_US/settings.json b/frontend/src/locales/en_US/settings.json index f0032d8f4..a773bf3c4 100644 --- a/frontend/src/locales/en_US/settings.json +++ b/frontend/src/locales/en_US/settings.json @@ -107,6 +107,7 @@ "mapping-types": "Mapping types", "metadata-catalogs": "General metadata", "metadata-get-key": "Get API key", + "metadata-proxies": "Match proxies", "metadata-specialised": "Specialised sources", "metadata-subtitle-achievements": "Achievements", "metadata-subtitle-completion": "Completion times", diff --git a/frontend/src/services/api/client-token.ts b/frontend/src/services/api/client-token.ts index b7a9446c1..260bf1439 100644 --- a/frontend/src/services/api/client-token.ts +++ b/frontend/src/services/api/client-token.ts @@ -16,6 +16,8 @@ export interface ClientTokenCreateSchema extends ClientTokenSchema { export interface ClientTokenAdminSchema extends ClientTokenSchema { username: string; + user_avatar_path: string; + user_updated_at: string; } export interface ClientTokenPairSchema { diff --git a/frontend/src/v2/components/Settings/AdminTokensSection.vue b/frontend/src/v2/components/Settings/AdminTokensSection.vue index cbbad4e58..47e6dd1cc 100644 --- a/frontend/src/v2/components/Settings/AdminTokensSection.vue +++ b/frontend/src/v2/components/Settings/AdminTokensSection.vue @@ -22,7 +22,7 @@ import { useI18n } from "vue-i18n"; import clientTokenApi, { type ClientTokenAdminSchema, } from "@/services/api/client-token"; -import { formatTimestamp } from "@/utils"; +import { defaultAvatarPath, formatTimestamp } from "@/utils"; import ScopeCell from "@/v2/components/Settings/ScopeCell.vue"; import { useConfirm } from "@/v2/composables/useConfirm"; import { useSnackbar } from "@/v2/composables/useSnackbar"; @@ -41,6 +41,12 @@ type SortKey = "username" | "name" | "expires_at" | "last_used_at"; const sortKey = ref("username"); const sortDir = ref<"asc" | "desc">("asc"); +function avatarSrc(token: ClientTokenAdminSchema) { + return token.user_avatar_path + ? `/assets/romm/assets/${token.user_avatar_path}?ts=${token.user_updated_at}` + : defaultAvatarPath; +} + function compareNullable(a: string | null, b: string | null, asc: boolean) { if (!a && !b) return 0; if (!a) return asc ? 1 : -1; @@ -54,15 +60,11 @@ const sortedTokens = computed(() => { list.sort((a, b) => { if (sortKey.value === "username") { return asc - ? a.username.localeCompare(b.username) || - a.name.localeCompare(b.name) - : b.username.localeCompare(a.username) || - b.name.localeCompare(a.name); + ? a.username.localeCompare(b.username) || a.name.localeCompare(b.name) + : b.username.localeCompare(a.username) || b.name.localeCompare(a.name); } if (sortKey.value === "name") { - return asc - ? a.name.localeCompare(b.name) - : b.name.localeCompare(a.name); + return asc ? a.name.localeCompare(b.name) : b.name.localeCompare(a.name); } return compareNullable(a[sortKey.value], b[sortKey.value], asc); }); @@ -208,9 +210,14 @@ onMounted(fetchTokens); @update:sort="onSort" >