From b5f0215bebebaa7c5b140d557821772835dc793d Mon Sep 17 00:00:00 2001 From: Zhicheng Han <43314240+hanzckernel@users.noreply.github.com> Date: Fri, 22 May 2026 02:20:45 +0200 Subject: [PATCH] fix: improve kanban board filtering (#919) - Render only the selected status column when status chips are active - Add status color treatments and default assignee normalization - Reuse profile avatars for Kanban card assignee tags - Cover status filtering, default assignee labels, and avatar rendering --- .../hermes/kanban/KanbanCreateForm.vue | 7 +- .../hermes/kanban/KanbanTaskCard.vue | 36 ++++- .../hermes/kanban/KanbanTaskDrawer.vue | 45 +++--- .../src/utils/hermes/kanban-assignees.ts | 27 ++++ .../client/src/views/hermes/KanbanView.vue | 141 +++++++++++++++--- tests/client/kanban-create-form.test.ts | 8 + tests/client/kanban-task-card.test.ts | 14 ++ tests/client/kanban-view.test.ts | 72 +++++++-- 8 files changed, 298 insertions(+), 52 deletions(-) create mode 100644 packages/client/src/utils/hermes/kanban-assignees.ts diff --git a/packages/client/src/components/hermes/kanban/KanbanCreateForm.vue b/packages/client/src/components/hermes/kanban/KanbanCreateForm.vue index bfbe154..647999a 100644 --- a/packages/client/src/components/hermes/kanban/KanbanCreateForm.vue +++ b/packages/client/src/components/hermes/kanban/KanbanCreateForm.vue @@ -3,6 +3,7 @@ import { ref, computed } from 'vue' import { NModal, NForm, NFormItem, NInput, NSelect, NButton, useMessage } from 'naive-ui' import { useI18n } from 'vue-i18n' import { useKanbanStore } from '@/stores/hermes/kanban' +import { withDefaultAssignee } from '@/utils/hermes/kanban-assignees' const emit = defineEmits<{ close: [] @@ -26,10 +27,8 @@ const priorityOptions = computed(() => [ ]) const assigneeOptions = computed(() => { - return kanbanStore.assignees.map(a => { - const total = Object.values(a.counts || {}).reduce((s, c) => s + c, 0) - return { label: `${a.name} · ${t('kanban.stats.tasks')}: ${total}`, value: a.name } - }) + return withDefaultAssignee(kanbanStore.assignees, kanbanStore.stats?.by_assignee || {}) + .map(a => ({ label: a.name, value: a.name })) }) async function handleSubmit() { diff --git a/packages/client/src/components/hermes/kanban/KanbanTaskCard.vue b/packages/client/src/components/hermes/kanban/KanbanTaskCard.vue index 9e0e0a1..ebfaaf5 100644 --- a/packages/client/src/components/hermes/kanban/KanbanTaskCard.vue +++ b/packages/client/src/components/hermes/kanban/KanbanTaskCard.vue @@ -2,10 +2,13 @@ import { computed } from 'vue' import { NTooltip } from 'naive-ui' import { useI18n } from 'vue-i18n' +import ProfileAvatar from '@/components/hermes/profiles/ProfileAvatar.vue' import type { KanbanTask } from '@/api/hermes/kanban' +import type { ProfileAvatar as ProfileAvatarData } from '@/api/hermes/profiles' const props = defineProps<{ task: KanbanTask + assigneeAvatar?: ProfileAvatarData | null }>() const emit = defineEmits<{ @@ -34,12 +37,21 @@ const priorityText = computed(() => {