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"
+ />
-
+
+
{{ user?.username }}
@@ -43,7 +45,7 @@ defineProps<{
const auth = useAuthStore()
const ui = useUiStore()
-const handleLogout = async () => {
+async function handleLogout() {
await auth.logout()
await navigateTo('/login')
}
diff --git a/frontend/pages/projects/[id]/archives.vue b/frontend/pages/projects/[id]/archives.vue
index 60360ec..703bc82 100644
--- a/frontend/pages/projects/[id]/archives.vue
+++ b/frontend/pages/projects/[id]/archives.vue
@@ -46,13 +46,11 @@
>
{{ task.group.title }}
-
- {{ task.assignee.username.substring(0, 2).toUpperCase() }}
-
+ :user="task.assignee"
+ size="xs"
+ />
@@ -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(),
|