From f3ca76e418ff4867e89b68e4019f10160bb46465 Mon Sep 17 00:00:00 2001 From: Kevin G Date: Mon, 22 Jan 2024 21:13:15 -0600 Subject: [PATCH 1/2] Add move to top and bottom context menu options After adding an item to a playlist, I often want to move it to the top and it's tedious to drag and drop if the playlist is large. This adds 'Move to Top' and 'Move to Bottom' options to a playlist item context menu. --- src/components/itemContextMenu.js | 32 +++++++++++++++++++++++++++++++ src/components/shortcuts.js | 13 +++++++++++++ src/strings/en-us.json | 2 ++ 3 files changed, 47 insertions(+) diff --git a/src/components/itemContextMenu.js b/src/components/itemContextMenu.js index 26c7770386..4bf5bf9b85 100644 --- a/src/components/itemContextMenu.js +++ b/src/components/itemContextMenu.js @@ -291,6 +291,22 @@ export function getCommands(options) { }); } + if (item.PlaylistItemId && options.playlistId && item.PlaylistIndex > 0) { + commands.push({ + name: globalize.translate('MoveToTop'), + id: 'movetotop', + icon: 'vertical_align_top' + }); + } + + if (item.PlaylistItemId && options.playlistId && item.PlaylistIndex < (item.PlaylistItems - 1)) { + commands.push({ + name: globalize.translate('MoveToBottom'), + id: 'movetobottom', + icon: 'vertical_align_bottom' + }); + } + if (options.collectionId) { commands.push({ name: globalize.translate('RemoveFromCollection'), @@ -559,6 +575,22 @@ function executeCommand(item, id, options) { getResolveFunction(resolve, id, true)(); }); break; + case 'movetotop': + apiClient.ajax({ + url: apiClient.getUrl('Playlists/' + options.playlistId + '/Items/' + item.PlaylistItemId + '/Move/0'), + type: 'POST' + }).then(function () { + getResolveFunction(resolve, id, true)(); + }); + break; + case 'movetobottom': + apiClient.ajax({ + url: apiClient.getUrl('Playlists/' + options.playlistId + '/Items/' + item.PlaylistItemId + '/Move/' + (item.PlaylistItems - 1)), + type: 'POST' + }).then(function () { + getResolveFunction(resolve, id, true)(); + }); + break; case 'removefromcollection': apiClient.ajax({ type: 'DELETE', diff --git a/src/components/shortcuts.js b/src/components/shortcuts.js index e4d144fb84..7de8ef2aa9 100644 --- a/src/components/shortcuts.js +++ b/src/components/shortcuts.js @@ -110,6 +110,19 @@ function showContextMenu(card, options = {}) { if (playlistId) { const elem = dom.parentWithAttribute(card, 'data-playlistitemid'); item.PlaylistItemId = elem ? elem.getAttribute('data-playlistitemid') : null; + + const itemsContainer = dom.parentWithAttribute(card, 'is', 'emby-itemscontainer'); + if (itemsContainer) { + let index = 0; + for (const listItem of itemsContainer.querySelectorAll('.listItem')) { + const playlistItemId = listItem.getAttribute('data-playlistitemid'); + if (playlistItemId == item.PlaylistItemId) { + item.PlaylistIndex = index; + } + index++; + } + item.PlaylistItems = index; + } } const apiClient = ServerConnections.getApiClient(item.ServerId); diff --git a/src/strings/en-us.json b/src/strings/en-us.json index d3ef132114..0ac300bf78 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1127,6 +1127,8 @@ "MoreUsersCanBeAddedLater": "More users can be added later from within the Dashboard.", "MoveLeft": "Move left", "MoveRight": "Move right", + "MoveToBottom": "Move to bottom", + "MoveToTop": "Move to top", "Movie": "Movie", "MovieLibraryHelp": "Review the {0}movie naming guide{1}.", "Movies": "Movies", From 40074c643356afa50c93794fcd32a85766fdc70e Mon Sep 17 00:00:00 2001 From: Kevin G Date: Mon, 24 Jun 2024 18:06:16 -0500 Subject: [PATCH 2/2] Fix playlist item count variable name Signed-off-by: Kevin G --- src/components/itemContextMenu.js | 4 ++-- src/components/shortcuts.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/itemContextMenu.js b/src/components/itemContextMenu.js index 4bf5bf9b85..ee70af15cf 100644 --- a/src/components/itemContextMenu.js +++ b/src/components/itemContextMenu.js @@ -299,7 +299,7 @@ export function getCommands(options) { }); } - if (item.PlaylistItemId && options.playlistId && item.PlaylistIndex < (item.PlaylistItems - 1)) { + if (item.PlaylistItemId && options.playlistId && item.PlaylistIndex < (item.PlaylistItemCount - 1)) { commands.push({ name: globalize.translate('MoveToBottom'), id: 'movetobottom', @@ -585,7 +585,7 @@ function executeCommand(item, id, options) { break; case 'movetobottom': apiClient.ajax({ - url: apiClient.getUrl('Playlists/' + options.playlistId + '/Items/' + item.PlaylistItemId + '/Move/' + (item.PlaylistItems - 1)), + url: apiClient.getUrl('Playlists/' + options.playlistId + '/Items/' + item.PlaylistItemId + '/Move/' + (item.PlaylistItemCount - 1)), type: 'POST' }).then(function () { getResolveFunction(resolve, id, true)(); diff --git a/src/components/shortcuts.js b/src/components/shortcuts.js index 7de8ef2aa9..d76fa0c811 100644 --- a/src/components/shortcuts.js +++ b/src/components/shortcuts.js @@ -121,7 +121,7 @@ function showContextMenu(card, options = {}) { } index++; } - item.PlaylistItems = index; + item.PlaylistItemCount = index; } }