diff --git a/app/Actions/Models/Wiki/Song/ManageSongPerformances.php b/app/Actions/Models/Wiki/Song/ManageSongPerformances.php index 720500077..de74433bc 100644 --- a/app/Actions/Models/Wiki/Song/ManageSongPerformances.php +++ b/app/Actions/Models/Wiki/Song/ManageSongPerformances.php @@ -148,12 +148,7 @@ class ManageSongPerformances } }); - // Update artist_member table to match memberships - ArtistMember::query()->upsert( - $memberships, - [ArtistMember::ATTRIBUTE_ARTIST, ArtistMember::ATTRIBUTE_MEMBER], - [ArtistMember::ATTRIBUTE_ALIAS, ArtistMember::ATTRIBUTE_AS], - ); + $this->syncArtistMembers($memberships); $this->syncSongArtist(); @@ -169,10 +164,28 @@ class ManageSongPerformances return $this; } + /** + * Update artist_member table to match memberships. + */ + protected function syncArtistMembers(array $memberships): void + { + foreach ($memberships as $index => $membership) { + ArtistMember::query() + ->updateOrCreate([ + ArtistMember::ATTRIBUTE_ARTIST => Arr::get($membership, Membership::ATTRIBUTE_ARTIST), + ArtistMember::ATTRIBUTE_MEMBER => Arr::get($membership, Membership::ATTRIBUTE_MEMBER), + ], [ + ArtistMember::ATTRIBUTE_ALIAS => Arr::get($membership, Membership::ATTRIBUTE_ALIAS), + ArtistMember::ATTRIBUTE_AS => Arr::get($membership, Membership::ATTRIBUTE_AS), + ArtistMember::ATTRIBUTE_RELEVANCE => $index + 1, + ]); + } + } + /** * Temporary function where the performances feature synchronizes with the artist_song pivot table. */ - public function syncSongArtist(): void + protected function syncSongArtist(): void { /** @var Song $song */ $song = Song::query() diff --git a/app/Events/Wiki/Song/Performance/PerformanceCreated.php b/app/Events/Wiki/Song/Performance/PerformanceCreated.php index 136417744..29d72484a 100644 --- a/app/Events/Wiki/Song/Performance/PerformanceCreated.php +++ b/app/Events/Wiki/Song/Performance/PerformanceCreated.php @@ -6,6 +6,7 @@ namespace App\Events\Wiki\Song\Performance; use App\Contracts\Events\UpdateRelatedIndicesEvent; use App\Events\Base\Wiki\WikiCreatedEvent; +use App\Models\Wiki\Song\Membership; use App\Models\Wiki\Song\Performance; /** @@ -18,7 +19,7 @@ class PerformanceCreated extends WikiCreatedEvent implements UpdateRelatedIndice $performance = $this->getModel(); $song = $performance->song; - $artist = $performance->artist; + $artist = $performance->artist instanceof Membership ? $performance->artist->group : $performance->artist; $artistName = $performance->alias ?? $artist->getName(); $artistName = filled($performance->as) ? "{$performance->as} (CV: {$artistName})" : $artistName; diff --git a/app/Events/Wiki/Song/Performance/PerformanceDeleted.php b/app/Events/Wiki/Song/Performance/PerformanceDeleted.php index f91f8ca54..9705f64c0 100644 --- a/app/Events/Wiki/Song/Performance/PerformanceDeleted.php +++ b/app/Events/Wiki/Song/Performance/PerformanceDeleted.php @@ -22,7 +22,7 @@ class PerformanceDeleted extends WikiDeletedEvent implements UpdateRelatedIndice $performance = $this->getModel(); $song = $performance->song; - $artist = $performance->artist; + $artist = $performance->artist instanceof Membership ? $performance->artist->group : $performance->artist; $artistName = $performance->alias ?? $artist->getName(); $artistName = filled($performance->as) ? "{$performance->as} (CV: {$artistName})" : $artistName; diff --git a/app/Filament/Actions/Models/Wiki/Song/Performance/LoadMembersAction.php b/app/Filament/Actions/Models/Wiki/Song/Performance/LoadMembersAction.php index e6f4db5b0..2282d628f 100644 --- a/app/Filament/Actions/Models/Wiki/Song/Performance/LoadMembersAction.php +++ b/app/Filament/Actions/Models/Wiki/Song/Performance/LoadMembersAction.php @@ -11,6 +11,7 @@ use App\Pivots\Wiki\ArtistMember; use Filament\Actions\Action; use Filament\Schemas\Components\Utilities\Get; use Filament\Schemas\Components\Utilities\Set; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Support\Arr; class LoadMembersAction extends Action @@ -36,7 +37,11 @@ class LoadMembersAction extends Action /** @var Artist $group */ $group = Artist::query() - ->with([Artist::RELATION_MEMBERS]) + ->with([ + Artist::RELATION_MEMBERS => function (BelongsToMany $relation): void { + $relation->orderBy(ArtistMember::ATTRIBUTE_RELEVANCE); + }, + ]) ->find($artistId); $set(PerformanceForm::REPEATER_MEMBERSHIPS, $group->members->map(fn (Artist $member): array => [ diff --git a/app/Filament/RelationManagers/Wiki/ImageRelationManager.php b/app/Filament/RelationManagers/Wiki/ImageRelationManager.php index 4a606550d..298d9e9be 100644 --- a/app/Filament/RelationManagers/Wiki/ImageRelationManager.php +++ b/app/Filament/RelationManagers/Wiki/ImageRelationManager.php @@ -32,7 +32,7 @@ class ImageRelationManager extends BaseRelationManager $table ->recordTitleAttribute(Image::ATTRIBUTE_PATH) ->reorderable(Imageable::ATTRIBUTE_DEPTH) - ->defaultSort(Image::TABLE.'.'.Image::ATTRIBUTE_ID, 'desc') + ->defaultSort(Imageable::ATTRIBUTE_DEPTH) ); } diff --git a/app/Filament/Resources/Wiki/Artist/RelationManagers/MemberArtistRelationManager.php b/app/Filament/Resources/Wiki/Artist/RelationManagers/MemberArtistRelationManager.php index 491932bff..40bd364f0 100644 --- a/app/Filament/Resources/Wiki/Artist/RelationManagers/MemberArtistRelationManager.php +++ b/app/Filament/Resources/Wiki/Artist/RelationManagers/MemberArtistRelationManager.php @@ -62,6 +62,8 @@ class MemberArtistRelationManager extends ArtistRelationManager $table ->inverseRelationship(Artist::RELATION_GROUPS) ) + ->reorderable(ArtistMember::ATTRIBUTE_RELEVANCE) + ->defaultSort(ArtistMember::ATTRIBUTE_RELEVANCE) ->heading(__('filament.resources.label.members')) ->modelLabel(__('filament.resources.singularLabel.member')); } diff --git a/app/Models/Wiki/Artist.php b/app/Models/Wiki/Artist.php index 104901214..d9b0df04a 100644 --- a/app/Models/Wiki/Artist.php +++ b/app/Models/Wiki/Artist.php @@ -246,7 +246,7 @@ class Artist extends BaseModel implements HasImages, HasResources, SoftDeletable { return $this->belongsToMany(Artist::class, ArtistMember::TABLE, ArtistMember::ATTRIBUTE_ARTIST, ArtistMember::ATTRIBUTE_MEMBER) ->using(ArtistMember::class) - ->withPivot([ArtistMember::ATTRIBUTE_ALIAS, ArtistMember::ATTRIBUTE_AS, ArtistMember::ATTRIBUTE_NOTES]) + ->withPivot([ArtistMember::ATTRIBUTE_ALIAS, ArtistMember::ATTRIBUTE_AS, ArtistMember::ATTRIBUTE_NOTES, ArtistMember::ATTRIBUTE_RELEVANCE]) ->as(ArtistMemberResource::$wrap) ->withTimestamps(); } diff --git a/app/Pivots/Wiki/ArtistMember.php b/app/Pivots/Wiki/ArtistMember.php index a03b2e7c6..b1a44d2c6 100644 --- a/app/Pivots/Wiki/ArtistMember.php +++ b/app/Pivots/Wiki/ArtistMember.php @@ -18,8 +18,9 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; * @property string|null $alias * @property string|null $as * @property Artist $member - * @property string|null $notes * @property int $member_id + * @property string|null $notes + * @property int|null $relevance * * @method static ArtistMemberFactory factory(...$parameters) */ @@ -32,6 +33,7 @@ class ArtistMember extends BasePivot final public const string ATTRIBUTE_ARTIST = 'artist_id'; final public const string ATTRIBUTE_MEMBER = 'member_id'; final public const string ATTRIBUTE_NOTES = 'notes'; + final public const string ATTRIBUTE_RELEVANCE = 'relevance'; final public const string RELATION_ARTIST = 'artist'; final public const string RELATION_MEMBER = 'member'; @@ -45,8 +47,9 @@ class ArtistMember extends BasePivot ArtistMember::ATTRIBUTE_ALIAS, ArtistMember::ATTRIBUTE_ARTIST, ArtistMember::ATTRIBUTE_AS, - ArtistMember::ATTRIBUTE_NOTES, ArtistMember::ATTRIBUTE_MEMBER, + ArtistMember::ATTRIBUTE_NOTES, + ArtistMember::ATTRIBUTE_RELEVANCE, ]; /** diff --git a/database/migrations/2025_10_30_204112_add_relevance_to_artist_members_table.php b/database/migrations/2025_10_30_204112_add_relevance_to_artist_members_table.php new file mode 100644 index 000000000..1084b7e09 --- /dev/null +++ b/database/migrations/2025_10_30_204112_add_relevance_to_artist_members_table.php @@ -0,0 +1,23 @@ +integer(ArtistMember::ATTRIBUTE_RELEVANCE)->nullable(); + }); + } + } +};