From afd4baed92ae3012ca90749284beb36f687243aa Mon Sep 17 00:00:00 2001 From: matthieu Date: Sun, 15 Mar 2026 21:58:46 +0100 Subject: [PATCH] feat(avatar) : replace initials with UserAvatar component everywhere Co-Authored-By: Claude Opus 4.6 (1M context) --- .../components/admin/AdminClientTicketTab.vue | 35 +++++++++++-------- frontend/components/task/TaskCard.vue | 11 +++--- frontend/components/ui/AppTopNav.vue | 6 ++-- frontend/pages/projects/[id]/archives.vue | 12 +++---- 4 files changed, 34 insertions(+), 30 deletions(-) diff --git a/frontend/components/admin/AdminClientTicketTab.vue b/frontend/components/admin/AdminClientTicketTab.vue index 940f490..64401a5 100644 --- a/frontend/components/admin/AdminClientTicketTab.vue +++ b/frontend/components/admin/AdminClientTicketTab.vue @@ -79,7 +79,16 @@ {{ getProjectName(ticket.project) }} - {{ getSubmitterName(ticket.submittedBy) }} + +
+ + {{ getSubmitterName(ticket.submittedBy) }} +
+ {{ formatDate(ticket.createdAt) }}
@@ -216,7 +225,7 @@ const { t } = useI18n() const clientTicketService = useClientTicketService() const projectService = useProjectService() const userService = useUserService() -const { typeBadgeClass, statusBadgeClass, formatDate } = useClientTicketHelpers() +const { typeBadgeClass, statusBadgeClass, formatDate, getAvailableStatusTransitions } = useClientTicketHelpers() const tickets = ref([]) const projects = ref([]) @@ -261,19 +270,7 @@ const detailTicket = ref(null) const availableStatusTransitions = computed(() => { if (!statusTarget.value) return [] - const current = statusTarget.value.status - const allStatuses: { label: string; value: ClientTicketStatus }[] = [ - { label: t('clientTicket.status.new'), value: 'new' }, - { label: t('clientTicket.status.in_progress'), value: 'in_progress' }, - { label: t('clientTicket.status.done'), value: 'done' }, - { label: t('clientTicket.status.rejected'), value: 'rejected' }, - ] - // Filter out forbidden transitions - return allStatuses.filter(s => { - if (s.value === current) return false - if ((current === 'done' || current === 'rejected') && s.value === 'new') return false - return true - }) + return getAvailableStatusTransitions(statusTarget.value.status, t) }) function getProjectName(iri: string): string { @@ -291,6 +288,14 @@ function getSubmitterName(iri: string | null): string { return users.value.find(u => u.id === id)?.username ?? '' } +function getSubmitterUser(iri: string | null): UserData | undefined { + if (!iri) return undefined + const match = iri.match(/\/api\/users\/(\d+)/) + if (!match) return undefined + const id = Number(match[1]) + return users.value.find(u => u.id === id) +} + function openDetail(ticket: ClientTicket) { detailTicket.value = ticket detailOpen.value = true diff --git a/frontend/components/task/TaskCard.vue b/frontend/components/task/TaskCard.vue index de1df03..2147d59 100644 --- a/frontend/components/task/TaskCard.vue +++ b/frontend/components/task/TaskCard.vue @@ -44,13 +44,12 @@ > {{ tag.label }} - - {{ task.assignee.username.substring(0, 2).toUpperCase() }} - + :user="task.assignee" + size="xs" + class="ml-auto" + />
- + +
@@ -130,7 +128,7 @@ const filteredTasks = computed(() => { async function loadData() { const [p, t, s, e, pr, ty, g, u] = await Promise.all([ projectService.getById(projectId.value), - taskService.getByProjectArchived(projectId.value), + taskService.getByProject(projectId.value, true), statusService.getAll(), effortService.getAll(), priorityService.getAll(),