fix(musicbrainz): don't separate members by ended status

- All band members go to single 'Members' list
- Show ended status with muted color
- Tooltip shows roles + period (e.g. 'guitar (1981 - 2003)')
- Remove separate 'Former Members' section

cc
This commit is contained in:
vicrodh committed 2026-01-25 20:38:44 -06:00
1 parent 77d3d21882
commit 8271cb2436
5 files changed
+40 -29

No files matched your search

+3 -5
View File
@@ -402,17 +402,15 @@ fn extract_relationships(artist: &ArtistFullResponse) -> ArtistRelationships {
begin: relation.begin.clone(), begin: relation.begin.clone(),
end: relation.end.clone(), end: relation.end.clone(),
}), }),
ended: relation.ended.unwrap_or(false),
}; };
match relation.relation_type.as_str() { match relation.relation_type.as_str() {
"member of band" => { "member of band" => {
if relation.direction.as_deref() == Some("backward") { if relation.direction.as_deref() == Some("backward") {
// We're viewing a BAND, the related artist is a MEMBER // We're viewing a BAND, the related artist is a MEMBER
if relation.ended == Some(true) { // All members go to the same list - don't separate by ended status
past_members.push(related); members.push(related);
} else {
members.push(related);
}
} else { } else {
// We're viewing a PERSON, the related artist is a BAND/GROUP // We're viewing a PERSON, the related artist is a BAND/GROUP
groups.push(related); groups.push(related);
+1
View File
@@ -328,6 +328,7 @@ pub struct RelatedArtist {
pub name: String, pub name: String,
pub role: Option<String>, pub role: Option<String>,
pub period: Option<Period>, pub period: Option<Period>,
pub ended: bool,
} }
/// Time period for a relationship /// Time period for a relationship
@@ -128,6 +128,7 @@
name: string; name: string;
role?: string; role?: string;
period?: { begin?: string; end?: string }; period?: { begin?: string; end?: string };
ended: boolean;
} }
interface ArtistRelationships { interface ArtistRelationships {
members: RelatedArtist[]; members: RelatedArtist[];
@@ -140,6 +141,7 @@
name: string; name: string;
roles: string[]; roles: string[];
period?: { begin?: string; end?: string }; period?: { begin?: string; end?: string };
ended: boolean;
} }
let mbRelationships = $state<ArtistRelationships | null>(null); let mbRelationships = $state<ArtistRelationships | null>(null);
let mbRelationshipsLoading = $state(false); let mbRelationshipsLoading = $state(false);
@@ -562,8 +564,8 @@
let hasRelationships = $derived( let hasRelationships = $derived(
mbRelationships && mbRelationships &&
(mbRelationships.members.length > 0 || (mbRelationships.members.length > 0 ||
mbRelationships.pastMembers.length > 0 || mbRelationships.groups.length > 0 ||
mbRelationships.groups.length > 0) mbRelationships.collaborators.length > 0)
); );
// Group members by MBID, combining their roles // Group members by MBID, combining their roles
@@ -575,12 +577,17 @@
if (member.role && !existing.roles.includes(member.role)) { if (member.role && !existing.roles.includes(member.role)) {
existing.roles.push(member.role); existing.roles.push(member.role);
} }
// If any entry is ended, mark as ended
if (member.ended) {
existing.ended = true;
}
} else { } else {
grouped.set(member.mbid, { grouped.set(member.mbid, {
mbid: member.mbid, mbid: member.mbid,
name: member.name, name: member.name,
roles: member.role ? [member.role] : [], roles: member.role ? [member.role] : [],
period: member.period period: member.period,
ended: member.ended
}); });
} }
} }
@@ -590,9 +597,6 @@
let groupedMembers = $derived( let groupedMembers = $derived(
mbRelationships ? groupMembersByMbid(mbRelationships.members) : [] mbRelationships ? groupMembersByMbid(mbRelationships.members) : []
); );
let groupedPastMembers = $derived(
mbRelationships ? groupMembersByMbid(mbRelationships.pastMembers) : []
);
let groupedGroups = $derived( let groupedGroups = $derived(
mbRelationships ? groupMembersByMbid(mbRelationships.groups) : [] mbRelationships ? groupMembersByMbid(mbRelationships.groups) : []
); );
@@ -1946,25 +1950,18 @@
<div class="relationship-group"> <div class="relationship-group">
<span class="relationship-label">Members</span> <span class="relationship-label">Members</span>
{#each groupedMembers as member} {#each groupedMembers as member}
{@const periodStr = member.period?.begin || member.period?.end
? `${member.period.begin || '?'} - ${member.period.end || 'present'}`
: ''}
{@const tooltipParts = [...member.roles]}
{@const tooltip = tooltipParts.length > 0
? (periodStr ? `${tooltipParts.join(', ')} (${periodStr})` : tooltipParts.join(', '))
: (periodStr || member.name)}
<button <button
class="sidebar-artist-link" class="sidebar-artist-link"
class:ended={member.ended}
onclick={() => navigateToRelatedArtist(member.name)} onclick={() => navigateToRelatedArtist(member.name)}
title={member.roles.length > 0 ? member.roles.join(', ') : member.name} title={tooltip}
>
<User size={12} />
{member.name}
</button>
{/each}
</div>
{/if}
{#if groupedPastMembers.length > 0}
<div class="relationship-group">
<span class="relationship-label">Former Members</span>
{#each groupedPastMembers as member}
<button
class="sidebar-artist-link past-member"
onclick={() => navigateToRelatedArtist(member.name)}
title={member.roles.length > 0 ? member.roles.join(', ') : member.name}
> >
<User size={12} /> <User size={12} />
{member.name} {member.name}
@@ -2140,11 +2137,11 @@
color: var(--text-primary); color: var(--text-primary);
} }
.sidebar-artist-link.past-member { .sidebar-artist-link.ended {
color: var(--text-muted); color: var(--text-muted);
} }
.sidebar-artist-link.past-member:hover { .sidebar-artist-link.ended:hover {
color: var(--text-primary); color: var(--text-primary);
} }
+13
View File
@@ -0,0 +1,13 @@
<?xml version="1.0" ?>
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg width="800px" height="800px" viewBox="0 0 512 512" id="svg2793" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;" version="1.1" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:serif="http://www.serif.com/" xmlns:svg="http://www.w3.org/2000/svg">
<defs id="defs2797"/>
<g id="_24-Connect" style="display:inline" transform="translate(-3072,-4096)">
<g id="g2211" transform="translate(3339.32,4267.43)">
<path d="m 0,169.14 c -44.818,0 -81.28,-36.462 -81.28,-81.28 0,-44.818 36.462,-81.28 81.28,-81.28 44.817,0 81.279,36.462 81.279,81.28 0,44.818 -36.462,81.28 -81.279,81.28 m -149.2,141.43 c -24.587,0 -44.59,-20.003 -44.59,-44.59 0,-24.587 20.003,-44.59 44.59,-44.59 24.587,0 44.59,20.003 44.59,44.59 0,24.587 -20.003,44.59 -44.59,44.59 m -83.91,-398.5 c 0,-29.5 24,-53.5 53.5,-53.5 29.494,0 53.49,24 53.49,53.5 0,29.494 -23.996,53.49 -53.49,53.49 -29.5,0 -53.5,-23.996 -53.5,-53.49 m 412.099,37 c 17.364,0 31.49,14.126 31.49,31.49 0,17.369 -14.126,31.5 -31.49,31.5 -17.369,0 -31.5,-14.131 -31.5,-31.5 0,-17.364 14.131,-31.49 31.5,-31.49 m -44.46,73.915 c 11.207,11.739 26.989,19.075 44.46,19.075 33.907,0 61.49,-27.589 61.49,-61.5 0,-33.906 -27.583,-61.49 -61.49,-61.49 -33.911,0 -61.5,27.584 -61.5,61.49 0,5.628 0.776,11.076 2.198,16.259 L 87.091,18.672 C 66.687,-6.959 35.231,-23.42 0,-23.42 c -26.243,0 -50.388,9.137 -69.436,24.388 l -44.024,-38.046 c 10.859,-14.093 17.34,-31.725 17.34,-50.852 0,-46.042 -37.453,-83.5 -83.49,-83.5 -46.042,0 -83.5,37.458 -83.5,83.5 0,46.036 37.458,83.49 83.5,83.49 16.012,0 30.98,-4.54 43.702,-12.388 l 45.751,39.538 c -13.281,18.326 -21.123,40.838 -21.123,65.15 0,27.971 10.377,53.562 27.478,73.133 l -30.6,39.04 c -10.397,-5.508 -22.236,-8.643 -34.798,-8.643 -41.129,0 -74.59,33.461 -74.59,74.59 0,41.129 33.461,74.59 74.59,74.59 41.129,0 74.59,-33.461 74.59,-74.59 0,-17.745 -6.24,-34.055 -16.625,-46.873 l 30.054,-38.343 c 17.567,11.607 38.596,18.376 61.181,18.376 61.359,0 111.279,-49.92 111.279,-111.28 0,-15.382 -3.138,-30.045 -8.806,-43.383 z" id="path2209" style="fill-rule:nonzero"/>
</g>
<g id="g2215" transform="translate(3521.08,4502.59)">
<path d="M 0,57.45 C -15.842,57.45 -28.73,44.562 -28.73,28.72 -28.73,12.884 -15.842,0 0,0 15.836,0 28.72,12.884 28.72,28.72 28.72,44.562 15.836,57.45 0,57.45 M 0,-30 c -32.384,0 -58.73,26.342 -58.73,58.72 0,32.384 26.346,58.73 58.73,58.73 32.378,0 58.72,-26.346 58.72,-58.73 C 58.72,-3.658 32.378,-30 0,-30" id="path2213" style="fill-rule:nonzero"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

+2
View File
@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg width="800px" height="800px" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20.5 9a3.49 3.49 0 0 0-3.45 3h-1.1a2.49 2.49 0 0 0-4.396-1.052L8.878 9.731l3.143-4.225a2.458 2.458 0 0 0 2.98-.019L17.339 8H16v1h3V6h-1v1.243l-2.336-2.512A2.473 2.473 0 0 0 16 3.5a2.5 2.5 0 0 0-5 0 2.474 2.474 0 0 0 .343 1.243L7.947 9.308 4.955 7.947a2.404 2.404 0 0 0-.161-1.438l3.704-1.385-.44 1.371.942.333L10 4 7.172 3l-.334.943 1.01.357-3.659 1.368a2.498 2.498 0 1 0-.682 4.117l2.085 2.688-2.053 2.76a2.5 2.5 0 1 0 .87 3.864l3.484 1.587-1.055.373.334.943L10 21l-1-2.828-.943.333.435 1.354-3.608-1.645A2.471 2.471 0 0 0 5 17.5a2.5 2.5 0 0 0-.058-.527l3.053-1.405 3.476 4.48a2.498 2.498 0 1 0 4.113.075L18 17.707V19h1v-3h-3v1h1.293l-2.416 2.416a2.466 2.466 0 0 0-2.667-.047l-3.283-4.23 2.554-1.176A2.494 2.494 0 0 0 15.95 13h1.1a3.493 3.493 0 1 0 3.45-4zm-7-7A1.5 1.5 0 1 1 12 3.5 1.502 1.502 0 0 1 13.5 2zm0 18a1.5 1.5 0 1 1-1.5 1.5 1.502 1.502 0 0 1 1.5-1.5zM1 7.5a1.5 1.5 0 1 1 2.457 1.145l-.144.112A1.496 1.496 0 0 1 1 7.5zm3.32 1.703a2.507 2.507 0 0 0 .264-.326l2.752 1.251-1.124 1.512zM2.5 19A1.5 1.5 0 1 1 4 17.5 1.502 1.502 0 0 1 2.5 19zm2.037-2.941a2.518 2.518 0 0 0-.193-.234l1.885-2.532 1.136 1.464zm3.76-1.731L6.849 12.46l1.42-1.908L11.1 11.84a2.29 2.29 0 0 0-.033 1.213zM13.5 14a1.5 1.5 0 1 1 1.5-1.5 1.502 1.502 0 0 1-1.5 1.5zm7 1a2.5 2.5 0 1 1 2.5-2.5 2.502 2.502 0 0 1-2.5 2.5zm1.5-2.5a1.5 1.5 0 1 1-1.5-1.5 1.502 1.502 0 0 1 1.5 1.5z"/><path fill="none" d="M0 0h24v24H0z"/></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB