From cecc59aead67e4e3ec03a4e94bff79a7e8180bcd Mon Sep 17 00:00:00 2001 From: Frank Stellmacher <171614930+Psychotoxical@users.noreply.github.com> Date: Fri, 24 Apr 2026 21:03:24 +0200 Subject: [PATCH] fix(playlists): surface bulk-delete button in header while multi-select is active (#290) Selecting playlists via the header toggle only exposed the delete action through the right-click context menu. Add a visible Delete-selected button next to Cancel that kicks off the same handleDeleteSelected flow, with a tooltip hint when some of the selected playlists aren't deletable (foreign owner). Button is only rendered when selection mode is on and at least one playlist is selected. Co-authored-by: Claude Opus 4.7 (1M context) --- src/locales/de.ts | 1 + src/locales/en.ts | 1 + src/locales/es.ts | 1 + src/locales/fr.ts | 1 + src/locales/nb.ts | 1 + src/locales/nl.ts | 1 + src/locales/ru.ts | 1 + src/locales/zh.ts | 1 + src/pages/Playlists.tsx | 17 +++++++++++++++++ 9 files changed, 25 insertions(+) diff --git a/src/locales/de.ts b/src/locales/de.ts index 5ddcf1d4..dc6482e4 100644 --- a/src/locales/de.ts +++ b/src/locales/de.ts @@ -1279,6 +1279,7 @@ export const deTranslation = { deleteSuccess: '{{count}} Playlists gelöscht', deleteFailed: 'Fehler beim Löschen von {{name}}', deleteSelected: 'Ausgewählte löschen', + deleteSelectedPartial: 'Nur {{n}} von {{total}} ausgewählten Playlists können gelöscht werden (die anderen gehören jemand anderem).', mergeSuccess: '{{count}} Songs in {{playlist}} zusammengeführt', mergeNoNewSongs: 'Keine neuen Songs zum Hinzufügen', mergeError: 'Fehler beim Zusammenführen von Playlists', diff --git a/src/locales/en.ts b/src/locales/en.ts index 19ea2901..5f10ab67 100644 --- a/src/locales/en.ts +++ b/src/locales/en.ts @@ -1282,6 +1282,7 @@ export const enTranslation = { deleteSuccess: '{{count}} playlists deleted', deleteFailed: 'Error deleting {{name}}', deleteSelected: 'Delete selected', + deleteSelectedPartial: 'Only {{n}} of {{total}} selected playlists can be deleted (the others belong to someone else).', mergeSuccess: '{{count}} songs merged into {{playlist}}', mergeNoNewSongs: 'No new songs to add', mergeError: 'Error merging playlists', diff --git a/src/locales/es.ts b/src/locales/es.ts index e62d61bd..10b6f0d1 100644 --- a/src/locales/es.ts +++ b/src/locales/es.ts @@ -1272,6 +1272,7 @@ export const esTranslation = { deleteSuccess: '{{count}} listas eliminadas', deleteFailed: 'Error al eliminar {{name}}', deleteSelected: 'Eliminar seleccionadas', + deleteSelectedPartial: 'Solo {{n}} de {{total}} listas seleccionadas pueden eliminarse (las demás pertenecen a otro usuario).', mergeSuccess: '{{count}} canciones unificadas en {{playlist}}', mergeNoNewSongs: 'No hay canciones nuevas para agregar', mergeError: 'Error al unificar listas', diff --git a/src/locales/fr.ts b/src/locales/fr.ts index 06183e9b..e6b73a3d 100644 --- a/src/locales/fr.ts +++ b/src/locales/fr.ts @@ -1267,6 +1267,7 @@ export const frTranslation = { deleteSuccess: '{{count}} playlists supprimées', deleteFailed: 'Erreur lors de la suppression de {{name}}', deleteSelected: 'Supprimer la sélection', + deleteSelectedPartial: 'Seulement {{n}} des {{total}} playlists sélectionnées peuvent être supprimées (les autres appartiennent à quelqu\'un d\'autre).', mergeSuccess: '{{count}} morceaux fusionnés dans {{playlist}}', mergeNoNewSongs: 'Aucun nouveau morceau à ajouter', mergeError: 'Erreur lors de la fusion des playlists', diff --git a/src/locales/nb.ts b/src/locales/nb.ts index 8253d1a2..89abc167 100644 --- a/src/locales/nb.ts +++ b/src/locales/nb.ts @@ -1266,6 +1266,7 @@ export const nbTranslation = { deleteSuccess: '{{count}} spillelister slettet', deleteFailed: 'Feil ved sletting av {{name}}', deleteSelected: 'Slett valgte', + deleteSelectedPartial: 'Bare {{n}} av {{total}} valgte spillelister kan slettes (de andre tilhører noen andre).', mergeSuccess: '{{count}} sanger slått sammen i {{playlist}}', mergeNoNewSongs: 'Ingen nye sanger å legge til', mergeError: 'Feil ved sammenslåing av spillelister', diff --git a/src/locales/nl.ts b/src/locales/nl.ts index 9c69d93d..409cc8b9 100644 --- a/src/locales/nl.ts +++ b/src/locales/nl.ts @@ -1266,6 +1266,7 @@ export const nlTranslation = { deleteSuccess: '{{count}} playlists verwijderd', deleteFailed: 'Fout bij verwijderen van {{name}}', deleteSelected: 'Geselecteerde verwijderen', + deleteSelectedPartial: 'Slechts {{n}} van de {{total}} geselecteerde playlists kunnen worden verwijderd (de andere zijn van iemand anders).', mergeSuccess: '{{count}} nummers samengevoegd in {{playlist}}', mergeNoNewSongs: 'Geen nieuwe nummers om toe te voegen', mergeError: 'Fout bij samenvoegen van playlists', diff --git a/src/locales/ru.ts b/src/locales/ru.ts index 60410969..bcb3c2b3 100644 --- a/src/locales/ru.ts +++ b/src/locales/ru.ts @@ -1346,6 +1346,7 @@ export const ruTranslation = { deleteSuccess: '{{count}} плейлистов удалено', deleteFailed: 'Ошибка при удалении {{name}}', deleteSelected: 'Удалить выбранные', + deleteSelectedPartial: 'Можно удалить только {{n}} из {{total}} выбранных плейлистов (остальные принадлежат другим пользователям).', mergeSuccess: '{{count}} треков объединено в {{playlist}}', mergeNoNewSongs: 'Нет новых треков для добавления', mergeError: 'Ошибка при объединении плейлистов', diff --git a/src/locales/zh.ts b/src/locales/zh.ts index 267ca776..c7c86446 100644 --- a/src/locales/zh.ts +++ b/src/locales/zh.ts @@ -1261,6 +1261,7 @@ export const zhTranslation = { deleteSuccess: '{{count}} 个播放列表已删除', deleteFailed: '删除 {{name}} 时出错', deleteSelected: '删除所选', + deleteSelectedPartial: '所选 {{total}} 个播放列表中只有 {{n}} 个可删除(其余属于他人)。', mergeSuccess: '{{count}} 首歌曲已合并到 {{playlist}}', mergeNoNewSongs: '没有新歌曲可添加', mergeError: '合并播放列表时出错', diff --git a/src/pages/Playlists.tsx b/src/pages/Playlists.tsx index 164fda9a..b14f7109 100644 --- a/src/pages/Playlists.tsx +++ b/src/pages/Playlists.tsx @@ -734,6 +734,23 @@ export default function Playlists() { )} )} + {selectionMode && selectedIds.size > 0 && (() => { + const deletableCount = selectedPlaylists.filter(isPlaylistDeletable).length; + return ( + + ); + })()}