Skip to content

feat(web): 分野詳細に「この分野を設定している項目」逆参照を追加#10

Closed
kentalow wants to merge 2 commits into
feat/subject-uri-gin-indexfrom
feat/subject-reverse-items
Closed

feat(web): 分野詳細に「この分野を設定している項目」逆参照を追加#10
kentalow wants to merge 2 commits into
feat/subject-uri-gin-indexfrom
feat/subject-reverse-items

Conversation

@kentalow

Copy link
Copy Markdown
Member

概要

CFSubject(分野)詳細ページに、同一テナント内でこの分野を subjectURI で参照している CFItem の一覧を表示します(CFItem→CFSubject の逆引き)。上位20件を SSR、件数表示、「もっと見る」で次ページを HTMX で自己再帰的に追記(ツリーの遅延ロードと同じ作法・別ページに飛ばない案A)。

⚠️ ベースは #9(GIN 索引 PR)feat/subject-uri-gin-index に向けています。#9 マージ後に base を main へ切り替えてマージしてください。

実装

  • repository cf_item_repository: list_items_by_subject / count_items_by_subjectsubject_uri @> '[{"identifier": ...}]' 包含クエリ(GIN索引 ix_cf_items_subject_uri_gin を使用=EXPLAIN で Bitmap Index Scan 確認済み)、テナントスコープ、human_coding_scheme→full_statement→identifier の安定ソート、offset ページング。
  • router/service web.py: _detail_extrasCFSubject 分岐、subject_items_DETAIL_EXTRAS_KEYSpane_extras両方に追加(KeyError 回避)、GET /{tenant}/subject/{id}/items フラグメントルート(対象が当該テナントの CFSubject か検証、limit+1has_more 判定=再 COUNT 無し、Cache-Control: public, max-age=86400)。
  • template: 再利用フラグメント fragments/subject_items.html(SSR include と HTMX 応答の二刀流)、resource_detail.html の lookup 分岐に CFSubject ゲートで挿入。各行は項目の所属ドキュメントのツリーへリンク。
  • i18n: subject_items_label / subject_items_count / show_more(en/ja)。

スコープ

  • テナント内のみ(分野はテナント所有 → private/クロステナントの可視性ガード不要)。
  • subject 文字列のみ(subjectURI 無し)で参照する項目は対象外。
  • subject のみ(ItemType/Concept/License は今回対象外)。
  • ツリー右ペインでは非表示(ペインはドキュメントスコープ)。

テスト(計13件 / 全690 pass)

  • unit: 包含一致・除外、テナントスコープ(同一 subject id が2テナント)、ページング境界(25件→20/5・重複/抜け無し)、count、空。
  • integration: 分野ページ(上位N+件数+ボタン/1ページ以内はボタン無し/空はセクション非表示)、フラグメント(次ページ+自己再帰ボタン/最終ページはボタン無し)、検証(非CFSubject→404・bad UUID→400・未知subject→404)、Cache-Control。

ドキュメント

デモで実データを出すための subjectURI 付与は別途対応します(compeito 側テストは合成データで完結)。

🤖 Generated with Claude Code

kentalow and others added 2 commits June 20, 2026 17:31
CFSubject 詳細ページ(/uri/{subject})に、同一テナント内でこの分野を
subjectURI で参照している CFItem の一覧を表示する。上位20件をSSR、件数表示、
「もっと見る」で HTMX フラグメント(/{tenant}/subject/{id}/items)から次ページを
自己再帰的に追記(ツリーの遅延ロードと同作法)。

- cf_item_repository: list_items_by_subject / count_items_by_subject
  (subject_uri @> 包含・GIN索引利用・テナントスコープ・安定ソート・ページング)
- web.py: _detail_extras に CFSubject 分岐、subject_items を _DETAIL_EXTRAS_KEYS
  と pane_extras 両方に追加、subject_items_fragment ルート(CFSubject 検証・
  limit+1 で has_more 判定・Cache-Control フラグメント)
- 再利用フラグメント fragments/subject_items.html(SSR include と HTMX 両用)、
  resource_detail.html の lookup 分岐に CFSubject ゲートで挿入
- i18n: subject_items_label / subject_items_count / show_more
- tests: unit(包含/テナントスコープ/ページング/count/空)+ integration
  (分野ページ/フラグメント/検証404・400/cache/空状態)計13件
- docs: web-ui.md(分野逆参照節・フラグメントルート)

テナント内のみ(分野はテナント所有)。subject 文字列のみの参照は対象外。
GIN索引は先行PR、デモデータ(subjectURI付与)は別途対応。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XXFogp18twGiPFBAZcqJw2
CFSubject をツリーの Definitions からクリックして右ペインに開いたとき、
_pane_fragment_response が _detail_extras を普通に呼ぶため「この分野を設定して
いる項目」が出てしまっていた(初期SSRの pane_extras では空にしていたが、HTMX
ペイン更新経路が漏れていた)。

_detail_extras に include_subject_items 引数を追加し、ペイン経路(in_pane)では
False を渡して計算自体を抑止(テンプレ条件だけでなくクエリも走らせない)。
単独 /uri/ ページのみ表示する。

- 回帰テスト2件追加(_detail_extras のフラグ挙動 / ペインフラグメントで非表示)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XXFogp18twGiPFBAZcqJw2
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