Skip to content

feat: タスク一覧のラベルフィルタ - #535

Open
yupix wants to merge 5 commits into
feat/task-labels-uifrom
feat/task-label-filter
Open

feat: タスク一覧のラベルフィルタ#535
yupix wants to merge 5 commits into
feat/task-labels-uifrom
feat/task-label-filter

Conversation

@yupix

@yupix yupix commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

Stacked on #534

概要

#534 でタスクにラベルを付与できるようになったのに続き、タスク一覧を指定ラベルで絞り込めるようにする。

変更内容

backend

  • GET /tasksListTasksQuerylabel_id(単一 UUID・任意)を追加。既存の assignee_id と同じ EXISTS サブクエリで絞り込む
  • 仕様書 docs/features/tasks/1.core.md §4.1 のクエリパラメータ表に追記
  • openapi.json / CLI 型を再生成

frontend

  • 一覧ページのツールバーにラベルフィルタを追加(ラジオ選択、「すべて」で解除、選択中はボタンをハイライト)。ラベルが 0 件のプロジェクトでは出さない
  • フィルタ変更・プロジェクト切替で先頭ページへリセット。検索中は「列」ドロップダウンと同様に非表示(検索はリストフィルタを無視するため)
  • 一覧ページが labels API を叩くようになったため、TaskTable ストーリーの fetch モックに /labels 分岐を追加し、タスクフィクスチャに labels を補完

挙動の変化

  • GET /tasks?label_id=<uuid> で該当ラベルが付いたタスクのみ返る(未指定時は従来どおり)
  • 一覧画面でラベルによる絞り込みができる

テスト

  • 統合テスト(task_labels_integration.rs): label_id フィルタで対象タスクのみ返ること / 付与実績のないラベルでは 0 件になること
  • cargo fmt / check / clippy / test --lib / 対象統合テスト、frontend pnpm verify / test:unit(258 件)すべて PASS

@github-actions

github-actions Bot commented Aug 13, 2026

Copy link
Copy Markdown

OpenAPI diff (apps/frontend/openapi.json)

diff --git a/apps/frontend/openapi.json b/apps/frontend/openapi.json
index 7c01da0..d2a286c 100644
--- a/apps/frontend/openapi.json
+++ b/apps/frontend/openapi.json
@@ -12555,6 +12555,15 @@
               "format": "uuid"
             }
           },
+          {
+            "name": "label_id",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
           {
             "name": "milestone_id",
             "in": "query",
@@ -20088,6 +20097,7 @@
           "progress_pct",
           "is_archived",
           "assignees",
+          "labels",
           "created_at",
           "updated_at"
         ],
@@ -20139,6 +20149,12 @@
           "is_archived": {
             "type": "boolean"
           },
+          "labels": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/LabelResponse"
+            }
+          },
           "milestone_id": {
             "type": ["string", "null"],
             "format": "uuid"
@@ -20604,6 +20620,14 @@
           "is_archived": {
             "type": ["boolean", "null"]
           },
+          "label_ids": {
+            "type": ["array", "null"],
+            "items": {
+              "type": "string",
+              "format": "uuid"
+            },
+            "description": "タスクのラベルをこの ID 集合で置き換える(`Some(vec![])` で全解除)。None は変更なし"
+          },
           "milestone_id": {
             "type": ["string", "null"],
             "format": "uuid"

@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Aug 13, 2026

Copy link
Copy Markdown

Deploying koyori with  Cloudflare Pages  Cloudflare Pages

Latest commit: 0e64519
Status: ✅  Deploy successful!
Preview URL: https://6c176640.koyori.pages.dev
Branch Preview URL: https://feat-task-label-filter.koyori.pages.dev

View logs

@github-actions

github-actions Bot commented Aug 13, 2026

Copy link
Copy Markdown

📦 Frontend bundle diagnostics

Metric Before After Δ Δ (%)
Raw 2.21 MB 2.23 MB +15.9 KB +0.7%
Gzip 720.8 KB 727.1 KB +6.3 KB +0.9%
Brotli 624.8 KB 630.2 KB +5.4 KB +0.9%
Zstd 756.2 KB 762.7 KB +6.5 KB +0.9%

zstd (and gzip/brotli) are per-part compression sums, not one-shot compressed sizes for whole chunks. Suitable for before/after deltas; absolute values overstate real delivery size.

Chunk changes

Chunk Status Raw Δ Raw Δ (%) Gzip Δ Gzip Δ (%) Brotli Δ Brotli Δ (%) Zstd Δ Zstd Δ (%)
assets/entries/src_pages_-tenant_projects_-projectKey_tasks.[hash].js changed +10.4 KB +6.0% +3.7 KB +8.9% +3.1 KB +8.9% +3.8 KB +8.6%
assets/chunks/chunk-[hash].js changed +5.5 KB +0.3% +2.6 KB +0.4% +2.3 KB +0.4% +2.7 KB +0.4%

Open interactive treemap

@github-actions

github-actions Bot commented Aug 13, 2026

Copy link
Copy Markdown

Coverage Report for apps/frontend

Status Category Percentage Covered / Total
🟢 Lines 87.3% 1327 / 1520
🟢 Statements 84.21% 1462 / 1736
🟢 Functions 85.14% 573 / 673
🟡 Branches 76.53% 1073 / 1402
File Coverage
File Stmts Branches Functions Lines Uncovered Lines
Changed Files
apps/frontend/src/pages/@tenant/projects/@projectKey/tasks/task-list-label-filter.ts 100% 78.57% 100% 100%
Generated in workflow #2087 for commit 0e64519 by the Vitest Coverage Report Action

yupix added a commit that referenced this pull request Aug 13, 2026
PR #535 レビュー指摘対応:

- 指摘1: tasksQuery の placeholderData が label_id を比較しておらず、
  フィルタ切替中も旧条件のタスクが表示され続けていた。前クエリの
  label_id と現在の選択が一致する場合(=ページング時)のみ
  keepPreviousData を返すよう修正
- 指摘2: createProjectSwitchMockFetch のプロジェクト一覧分岐が
  /labels を除外しておらず、ラベル一覧にプロジェクトを返していた。
  /labels 分岐をプロジェクト別 fixture で追加
- 指摘3: ラベル一覧の取得失敗時にフィルタが無言で消えていた。
  ツールバー内にエラー表示と再試行ボタンを追加(タスク一覧は
  ブロックしない)

回帰テスト:

- story「ラベルフィルタで旧条件タスク非表示」: 絞り込みレスポンスを
  保留し、旧条件タスクが表示されないことを検証(修正前は fail を確認)
- story「ラベル取得エラー」: labels API 500 時のエラー表示・再試行
  ボタン・タスク一覧非ブロックを検証
- story「プロジェクト切替で旧タスク非表示」: 切替後のドロップダウンに
  切替先プロジェクトのラベルのみが並ぶ検証を追加
yupix added a commit that referenced this pull request Aug 13, 2026
PR #535 レビュー指摘対応:

- 指摘1: tasksQuery の placeholderData が label_id を比較しておらず、
  フィルタ切替中も旧条件のタスクが表示され続けていた。前クエリの
  label_id と現在の選択が一致する場合(=ページング時)のみ
  keepPreviousData を返すよう修正
- 指摘2: createProjectSwitchMockFetch のプロジェクト一覧分岐が
  /labels を除外しておらず、ラベル一覧にプロジェクトを返していた。
  /labels 分岐をプロジェクト別 fixture で追加
- 指摘3: ラベル一覧の取得失敗時にフィルタが無言で消えていた。
  ツールバー内にエラー表示と再試行ボタンを追加(タスク一覧は
  ブロックしない)

回帰テスト:

- story「ラベルフィルタで旧条件タスク非表示」: 絞り込みレスポンスを
  保留し、旧条件タスクが表示されないことを検証(修正前は fail を確認)
- story「ラベル取得エラー」: labels API 500 時のエラー表示・再試行
  ボタン・タスク一覧非ブロックを検証
- story「プロジェクト切替で旧タスク非表示」: 切替後のドロップダウンに
  切替先プロジェクトのラベルのみが並ぶ検証を追加
@yupix
yupix force-pushed the feat/task-label-filter branch from 23bb78d to e9840e9 Compare August 13, 2026 14:34
@yupix
yupix force-pushed the feat/task-label-filter branch from e9840e9 to fd5b6c4 Compare August 13, 2026 16:26
yupix added a commit that referenced this pull request Aug 13, 2026
PR #535 レビュー指摘対応:

- 指摘1: tasksQuery の placeholderData が label_id を比較しておらず、
  フィルタ切替中も旧条件のタスクが表示され続けていた。前クエリの
  label_id と現在の選択が一致する場合(=ページング時)のみ
  keepPreviousData を返すよう修正
- 指摘2: createProjectSwitchMockFetch のプロジェクト一覧分岐が
  /labels を除外しておらず、ラベル一覧にプロジェクトを返していた。
  /labels 分岐をプロジェクト別 fixture で追加
- 指摘3: ラベル一覧の取得失敗時にフィルタが無言で消えていた。
  ツールバー内にエラー表示と再試行ボタンを追加(タスク一覧は
  ブロックしない)

回帰テスト:

- story「ラベルフィルタで旧条件タスク非表示」: 絞り込みレスポンスを
  保留し、旧条件タスクが表示されないことを検証(修正前は fail を確認)
- story「ラベル取得エラー」: labels API 500 時のエラー表示・再試行
  ボタン・タスク一覧非ブロックを検証
- story「プロジェクト切替で旧タスク非表示」: 切替後のドロップダウンに
  切替先プロジェクトのラベルのみが並ぶ検証を追加
@yupix
yupix force-pushed the feat/task-label-filter branch from fd5b6c4 to 7882f3b Compare August 13, 2026 17:24
yupix added a commit that referenced this pull request Aug 13, 2026
PR #535 レビュー指摘対応:

- 指摘1: tasksQuery の placeholderData が label_id を比較しておらず、
  フィルタ切替中も旧条件のタスクが表示され続けていた。前クエリの
  label_id と現在の選択が一致する場合(=ページング時)のみ
  keepPreviousData を返すよう修正
- 指摘2: createProjectSwitchMockFetch のプロジェクト一覧分岐が
  /labels を除外しておらず、ラベル一覧にプロジェクトを返していた。
  /labels 分岐をプロジェクト別 fixture で追加
- 指摘3: ラベル一覧の取得失敗時にフィルタが無言で消えていた。
  ツールバー内にエラー表示と再試行ボタンを追加(タスク一覧は
  ブロックしない)

回帰テスト:

- story「ラベルフィルタで旧条件タスク非表示」: 絞り込みレスポンスを
  保留し、旧条件タスクが表示されないことを検証(修正前は fail を確認)
- story「ラベル取得エラー」: labels API 500 時のエラー表示・再試行
  ボタン・タスク一覧非ブロックを検証
- story「プロジェクト切替で旧タスク非表示」: 切替後のドロップダウンに
  切替先プロジェクトのラベルのみが並ぶ検証を追加
@yupix
yupix force-pushed the feat/task-label-filter branch from 7882f3b to a707722 Compare August 13, 2026 17:49
yupix added 5 commits August 17, 2026 00:42
- ListTasksQuery に label_id を追加し、assignee_id と同じ EXISTS サブクエリで
  指定ラベルが付与されたタスクのみに絞り込む
- 一覧ページのツールバーにラベルフィルタ(ラジオ選択・「すべて」で解除)を追加。
  検索中は他のリスト操作と同様に非表示。切替時は先頭ページへ戻す
- 仕様書 §4.1 のクエリパラメータ表に label_id を追記、openapi.json / CLI 型を再生成
- 一覧ページが labels API を叩くようになったため、TaskTable ストーリーの fetch
  モックに /labels 分岐を追加(従来はプロジェクト一覧の分岐に吸われていた)。
  タスクフィクスチャにも labels を補完
- 統合テスト: label_id フィルタで対象タスクのみ返ること・非対象ラベルで 0 件に
  なることを追加
PR #535 レビュー指摘対応:

- 指摘1: tasksQuery の placeholderData が label_id を比較しておらず、
  フィルタ切替中も旧条件のタスクが表示され続けていた。前クエリの
  label_id と現在の選択が一致する場合(=ページング時)のみ
  keepPreviousData を返すよう修正
- 指摘2: createProjectSwitchMockFetch のプロジェクト一覧分岐が
  /labels を除外しておらず、ラベル一覧にプロジェクトを返していた。
  /labels 分岐をプロジェクト別 fixture で追加
- 指摘3: ラベル一覧の取得失敗時にフィルタが無言で消えていた。
  ツールバー内にエラー表示と再試行ボタンを追加(タスク一覧は
  ブロックしない)

回帰テスト:

- story「ラベルフィルタで旧条件タスク非表示」: 絞り込みレスポンスを
  保留し、旧条件タスクが表示されないことを検証(修正前は fail を確認)
- story「ラベル取得エラー」: labels API 500 時のエラー表示・再試行
  ボタン・タスク一覧非ブロックを検証
- story「プロジェクト切替で旧タスク非表示」: 切替後のドロップダウンに
  切替先プロジェクトのラベルのみが並ぶ検証を追加
@yupix
yupix force-pushed the feat/task-label-filter branch from 6268aa2 to 0e64519 Compare August 16, 2026 15:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant