上映会タグ表示バグ修正 (#360) #384

マージ済み
みてるぞ が 3 個のコミットを feature/360 から main へマージ 2026-07-02 01:37:49 +09:00
2個のファイルの変更32行の追加12行の削除
コミット 43c4b52280 の変更だけを表示してゐます - すべてのコミットを表示
+2 -3
ファイルの表示
@@ -277,10 +277,9 @@ describe ('TheatreDetailPage', () => {
.toBeInTheDocument () .toBeInTheDocument ()
expect (within (tagSection ()).getByRole ('link', { name: '別親タグ' })) expect (within (tagSection ()).getByRole ('link', { name: '別親タグ' }))
.toBeInTheDocument () .toBeInTheDocument ()
expect (within (tagSection ()).getByRole ('link', { name: '子タグ' })) expect (within (tagSection ()).getAllByRole ('link', { name: '子タグ' })[0])
.toBeInTheDocument () .toBeInTheDocument ()
expect (within (tagSection ()).getAllByRole ('link', { name: '子タグ' })) expect (within (tagSection ()).getAllByText ('↳').length).toBeGreaterThan (0)
.toHaveLength (1)
fireEvent.click (screen.getByRole ('button', { name: '2 列 A 型' })) fireEvent.click (screen.getByRole ('button', { name: '2 列 A 型' }))
fireEvent.click (screen.getAllByRole ('button', { name: '横並び' })[0]) fireEvent.click (screen.getAllByRole ('button', { name: '横並び' })[0])
+30 -9
ファイルの表示
@@ -125,10 +125,9 @@ const flattenTags = (tags: Tag[]): Tag[] => {
const tagsByCategory = (tags: Tag[]): Partial<Record<Category, Tag[]>> => { const tagsByCategory = (tags: Tag[]): Partial<Record<Category, Tag[]>> => {
const flattenedTags = flattenTags (tags)
const grouped: Partial<Record<Category, Tag[]>> = { } const grouped: Partial<Record<Category, Tag[]>> = { }
for (const tag of flattenedTags) for (const tag of tags)
{ {
grouped[tag.category] ??= [] grouped[tag.category] ??= []
grouped[tag.category]!.push (tag) grouped[tag.category]!.push (tag)
@@ -141,15 +140,39 @@ const tagsByCategory = (tags: Tag[]): Partial<Record<Category, Tag[]>> => {
} }
const renderReadonlyTagTree = (
tag: Tag,
nestLevel: number,
path: string,
ancestors: Set<number> = new Set<number> (),
): ReactNode[] => {
const key = `${ path }-${ tag.id }`
const nextAncestors = new Set (ancestors)
nextAncestors.add (tag.id)
return [
(
<li key={key} className="text-left leading-tight">
<TagLink tag={tag} nestLevel={nestLevel} withCount={false}/>
</li>),
...((tag.children ?? [])
.filter (child => !(nextAncestors.has (child.id)))
.sort (compareTagName)
.flatMap (child =>
renderReadonlyTagTree (child, nestLevel + 1, key, nextAncestors)))]
}
const TagList: FC<{ tags: Tag[]; compact?: boolean; flow?: TagFlow }> = ( const TagList: FC<{ tags: Tag[]; compact?: boolean; flow?: TagFlow }> = (
{ tags, compact, flow = 'vertical' }) => { { tags, compact, flow = 'vertical' }) => {
const grouped = tagsByCategory (tags) const horizontalGrouped = tagsByCategory (flattenTags (tags))
const verticalGrouped = tagsByCategory (tags)
if (flow === 'horizontal') if (flow === 'horizontal')
{ {
return ( return (
<ul className={cn ('flex flex-wrap gap-x-3 gap-y-1', compact && 'text-sm')}> <ul className={cn ('flex flex-wrap gap-x-3 gap-y-1', compact && 'text-sm')}>
{CATEGORIES.flatMap (cat => grouped[cat] ?? []).map (tag => ( {CATEGORIES.flatMap (cat => horizontalGrouped[cat] ?? []).map (tag => (
<li key={tag.id} className="text-left leading-tight"> <li key={tag.id} className="text-left leading-tight">
<TagLink tag={tag} withCount={false}/> <TagLink tag={tag} withCount={false}/>
</li>))} </li>))}
@@ -159,7 +182,7 @@ const TagList: FC<{ tags: Tag[]; compact?: boolean; flow?: TagFlow }> = (
return ( return (
<div className="space-y-3"> <div className="space-y-3">
{CATEGORIES.map (cat => { {CATEGORIES.map (cat => {
const rows = grouped[cat] ?? [] const rows = verticalGrouped[cat] ?? []
if (rows.length === 0) if (rows.length === 0)
return null return null
@@ -169,10 +192,8 @@ const TagList: FC<{ tags: Tag[]; compact?: boolean; flow?: TagFlow }> = (
{CATEGORY_NAMES[cat]} {CATEGORY_NAMES[cat]}
</div> </div>
<ul className={cn ('space-y-1', compact && 'text-sm')}> <ul className={cn ('space-y-1', compact && 'text-sm')}>
{rows.map (tag => ( {rows.flatMap (tag =>
<li key={tag.id} className="text-left leading-tight"> renderReadonlyTagTree (tag, 0, `cat-${ cat }`))}
<TagLink tag={tag} withCount={false}/>
</li>))}
</ul> </ul>
</div>) </div>)
})} })}