mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
Changed from using sortOptions to using already implemented queryOptions
Null verification for parentid on shortcuts.js itemContextMenu is now obeying to sorting
This commit is contained in:
parent
580ad5f1a8
commit
ee791f9d0d
5 changed files with 70 additions and 47 deletions
|
@ -9,6 +9,8 @@ import itemHelper from './itemHelper';
|
||||||
import { playbackManager } from './playback/playbackmanager';
|
import { playbackManager } from './playback/playbackmanager';
|
||||||
import ServerConnections from './ServerConnections';
|
import ServerConnections from './ServerConnections';
|
||||||
import toast from './toast/toast';
|
import toast from './toast/toast';
|
||||||
|
import * as userSettings from '../scripts/settings/userSettings';
|
||||||
|
import libraryMenu from '../scripts/libraryMenu';
|
||||||
|
|
||||||
export function getCommands(options) {
|
export function getCommands(options) {
|
||||||
const item = options.item;
|
const item = options.item;
|
||||||
|
@ -567,6 +569,29 @@ function deleteSeriesTimer(apiClient, item, resolve, command) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getSettingsKey(item) {
|
||||||
|
if (item.IsFolder) {
|
||||||
|
return 'Folder';
|
||||||
|
}
|
||||||
|
const itemType = item.MediaType;
|
||||||
|
switch (itemType) {
|
||||||
|
case 'Movie':
|
||||||
|
case 'BoxSet':
|
||||||
|
case 'Video':
|
||||||
|
return 'movies';
|
||||||
|
case 'Audio':
|
||||||
|
return 'songs';
|
||||||
|
case 'MusicAlbum':
|
||||||
|
return 'musicalbums';
|
||||||
|
case 'MusicArtist':
|
||||||
|
return 'musicartists';
|
||||||
|
case 'MusicGenre':
|
||||||
|
return 'genres';
|
||||||
|
case 'MusicPlaylist':
|
||||||
|
return 'musicplaylists';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function play(item, resume, queue, queueNext) {
|
function play(item, resume, queue, queueNext) {
|
||||||
let method = 'play';
|
let method = 'play';
|
||||||
if (queue) {
|
if (queue) {
|
||||||
|
@ -589,9 +614,12 @@ function play(item, resume, queue, queueNext) {
|
||||||
serverId: item.ServerId
|
serverId: item.ServerId
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
const sortParentId = item.IsFolder ? ('items-' + item.Id) : libraryMenu.getTopParentId() + '-' + getSettingsKey(item);
|
||||||
|
const sortValues = userSettings.getSortValues(sortParentId);
|
||||||
playbackManager[method]({
|
playbackManager[method]({
|
||||||
items: [item],
|
items: [item],
|
||||||
startPositionTicks: startPosition
|
startPositionTicks: startPosition,
|
||||||
|
queryOptions: sortValues
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -145,7 +145,10 @@ function createStreamInfoFromUrlItem(item) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function mergePlaybackQueries(obj1, obj2) {
|
function mergePlaybackQueries(obj1, obj2) {
|
||||||
const query = Object.assign(obj1, obj2);
|
const query = obj1;
|
||||||
|
for (const key in obj2) {
|
||||||
|
if (obj2[key] !== undefined) query[key] = obj2[key];
|
||||||
|
}
|
||||||
|
|
||||||
const filters = query.Filters ? query.Filters.split(',') : [];
|
const filters = query.Filters ? query.Filters.split(',') : [];
|
||||||
if (filters.indexOf('IsNotFolder') === -1) {
|
if (filters.indexOf('IsNotFolder') === -1) {
|
||||||
|
@ -1773,18 +1776,6 @@ class PlaybackManager {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function getSortOptions(options) {
|
|
||||||
const sortOptions = options.sortOptions || {};
|
|
||||||
let sortByValue = options.shuffle ? 'Random' : sortOptions.sortBy;
|
|
||||||
if (sortByValue == null) {
|
|
||||||
sortByValue = 'SortName';
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
sortBy: sortByValue,
|
|
||||||
sortOrder: sortOptions.sortOrder
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function translateItemsForPlayback(items, options) {
|
function translateItemsForPlayback(items, options) {
|
||||||
if (items.length > 1 && options && options.ids) {
|
if (items.length > 1 && options && options.ids) {
|
||||||
// Use the original request id array for sorting the result in the proper order
|
// Use the original request id array for sorting the result in the proper order
|
||||||
|
@ -1800,8 +1791,6 @@ class PlaybackManager {
|
||||||
|
|
||||||
const queryOptions = options.queryOptions || {};
|
const queryOptions = options.queryOptions || {};
|
||||||
|
|
||||||
const sortOptions = getSortOptions(options);
|
|
||||||
|
|
||||||
if (firstItem.Type === 'Program') {
|
if (firstItem.Type === 'Program') {
|
||||||
promise = getItemsForPlayback(serverId, {
|
promise = getItemsForPlayback(serverId, {
|
||||||
Ids: firstItem.ChannelId
|
Ids: firstItem.ChannelId
|
||||||
|
@ -1812,25 +1801,23 @@ class PlaybackManager {
|
||||||
SortBy: options.shuffle ? 'Random' : null
|
SortBy: options.shuffle ? 'Random' : null
|
||||||
});
|
});
|
||||||
} else if (firstItem.Type === 'MusicArtist') {
|
} else if (firstItem.Type === 'MusicArtist') {
|
||||||
promise = getItemsForPlayback(serverId, {
|
promise = getItemsForPlayback(serverId, mergePlaybackQueries({
|
||||||
ArtistIds: firstItem.Id,
|
ArtistIds: firstItem.Id,
|
||||||
Filters: 'IsNotFolder',
|
Filters: 'IsNotFolder',
|
||||||
Recursive: true,
|
Recursive: true,
|
||||||
SortBy: sortOptions.sortBy,
|
SortBy: options.shuffle ? 'Random' : 'SortName',
|
||||||
SortOrder: sortOptions.sortOrder,
|
|
||||||
MediaTypes: 'Audio'
|
MediaTypes: 'Audio'
|
||||||
});
|
}, queryOptions));
|
||||||
} else if (firstItem.MediaType === 'Photo') {
|
} else if (firstItem.MediaType === 'Photo') {
|
||||||
promise = getItemsForPlayback(serverId, {
|
promise = getItemsForPlayback(serverId, mergePlaybackQueries({
|
||||||
ParentId: firstItem.ParentId,
|
ParentId: firstItem.ParentId,
|
||||||
Filters: 'IsNotFolder',
|
Filters: 'IsNotFolder',
|
||||||
// Setting this to true may cause some incorrect sorting
|
// Setting this to true may cause some incorrect sorting
|
||||||
Recursive: false,
|
Recursive: false,
|
||||||
SortBy: sortOptions.sortBy,
|
|
||||||
SortOrder: sortOptions.sortOrder,
|
|
||||||
MediaTypes: 'Photo,Video',
|
MediaTypes: 'Photo,Video',
|
||||||
|
sortBy: options.shuffle ? 'Random' : 'SortName',
|
||||||
Limit: UNLIMITED_ITEMS
|
Limit: UNLIMITED_ITEMS
|
||||||
}).then(function (result) {
|
}, queryOptions)).then(function (result) {
|
||||||
const playbackItems = result.Items;
|
const playbackItems = result.Items;
|
||||||
|
|
||||||
let index = playbackItems.map(function (i) {
|
let index = playbackItems.map(function (i) {
|
||||||
|
@ -1846,45 +1833,40 @@ class PlaybackManager {
|
||||||
return Promise.resolve(result);
|
return Promise.resolve(result);
|
||||||
});
|
});
|
||||||
} else if (firstItem.Type === 'PhotoAlbum') {
|
} else if (firstItem.Type === 'PhotoAlbum') {
|
||||||
promise = getItemsForPlayback(serverId, {
|
promise = getItemsForPlayback(serverId, mergePlaybackQueries({
|
||||||
ParentId: firstItem.Id,
|
ParentId: firstItem.Id,
|
||||||
Filters: 'IsNotFolder',
|
Filters: 'IsNotFolder',
|
||||||
// Setting this to true may cause some incorrect sorting
|
// Setting this to true may cause some incorrect sorting
|
||||||
Recursive: false,
|
Recursive: false,
|
||||||
SortBy: sortOptions.sortBy,
|
SortBy: options.shuffle ? 'Random' : 'SortName',
|
||||||
SortOrder: sortOptions.sortOrder,
|
|
||||||
// Only include Photos because we do not handle mixed queues currently
|
// Only include Photos because we do not handle mixed queues currently
|
||||||
MediaTypes: 'Photo',
|
MediaTypes: 'Photo',
|
||||||
Limit: UNLIMITED_ITEMS
|
Limit: UNLIMITED_ITEMS
|
||||||
});
|
}, queryOptions));
|
||||||
} else if (firstItem.Type === 'MusicGenre') {
|
} else if (firstItem.Type === 'MusicGenre') {
|
||||||
promise = getItemsForPlayback(serverId, {
|
promise = getItemsForPlayback(serverId, mergePlaybackQueries({
|
||||||
GenreIds: firstItem.Id,
|
GenreIds: firstItem.Id,
|
||||||
Filters: 'IsNotFolder',
|
Filters: 'IsNotFolder',
|
||||||
Recursive: true,
|
Recursive: true,
|
||||||
SortBy: sortOptions.sortBy,
|
SortBy: options.shuffle ? 'Random' : 'SortName',
|
||||||
SortOrder: sortOptions.sortOrder,
|
|
||||||
MediaTypes: 'Audio'
|
MediaTypes: 'Audio'
|
||||||
});
|
}));
|
||||||
} else if (firstItem.IsFolder && firstItem.CollectionType === 'homevideos') {
|
} else if (firstItem.IsFolder && firstItem.CollectionType === 'homevideos') {
|
||||||
promise = getItemsForPlayback(serverId, mergePlaybackQueries({
|
promise = getItemsForPlayback(serverId, mergePlaybackQueries({
|
||||||
ParentId: firstItem.Id,
|
ParentId: firstItem.Id,
|
||||||
Filters: 'IsNotFolder',
|
Filters: 'IsNotFolder',
|
||||||
Recursive: true,
|
Recursive: true,
|
||||||
SortBy: sortOptions.sortBy,
|
SortBy: options.shuffle ? 'Random' : 'SortName',
|
||||||
SortOrder: sortOptions.sortOrder,
|
|
||||||
// Only include Photos because we do not handle mixed queues currently
|
// Only include Photos because we do not handle mixed queues currently
|
||||||
MediaTypes: 'Photo',
|
MediaTypes: 'Photo',
|
||||||
Limit: UNLIMITED_ITEMS
|
Limit: UNLIMITED_ITEMS
|
||||||
}, queryOptions));
|
}, queryOptions));
|
||||||
} else if (firstItem.IsFolder) {
|
} else if (firstItem.IsFolder) {
|
||||||
let sortBy = null;
|
let sortBy = null;
|
||||||
let sortOrder = null;
|
|
||||||
if (options.shuffle) {
|
if (options.shuffle) {
|
||||||
sortBy = 'Random';
|
sortBy = 'Random';
|
||||||
} else if (firstItem.Type !== 'BoxSet') {
|
} else if (firstItem.Type !== 'BoxSet') {
|
||||||
sortBy = sortOptions.sortBy;
|
sortBy = 'SortName';
|
||||||
sortOrder = sortOptions.sortOrder;
|
|
||||||
}
|
}
|
||||||
promise = getItemsForPlayback(serverId, mergePlaybackQueries({
|
promise = getItemsForPlayback(serverId, mergePlaybackQueries({
|
||||||
ParentId: firstItem.Id,
|
ParentId: firstItem.Id,
|
||||||
|
@ -1892,7 +1874,6 @@ class PlaybackManager {
|
||||||
Recursive: true,
|
Recursive: true,
|
||||||
// These are pre-sorted
|
// These are pre-sorted
|
||||||
SortBy: sortBy,
|
SortBy: sortBy,
|
||||||
SortOrder: sortOrder,
|
|
||||||
MediaTypes: 'Audio,Video'
|
MediaTypes: 'Audio,Video'
|
||||||
}, queryOptions));
|
}, queryOptions));
|
||||||
} else if (firstItem.Type === 'Episode' && items.length === 1 && getPlayer(firstItem, options).supportsProgress !== false) {
|
} else if (firstItem.Type === 'Episode' && items.length === 1 && getPlayer(firstItem, options).supportsProgress !== false) {
|
||||||
|
|
|
@ -180,7 +180,7 @@ function executeAction(card, target, action) {
|
||||||
|
|
||||||
const itemsContainer = dom.parentWithClass(card, 'itemsContainer');
|
const itemsContainer = dom.parentWithClass(card, 'itemsContainer');
|
||||||
|
|
||||||
const sortParentId = 'items-' + (item.IsFolder ? item.Id : itemsContainer.getAttribute('data-parentid')) + '-Folder';
|
const sortParentId = 'items-' + (item.IsFolder ? item.Id : itemsContainer?.getAttribute('data-parentid')) + '-Folder';
|
||||||
|
|
||||||
const serverId = item.ServerId;
|
const serverId = item.ServerId;
|
||||||
const type = item.Type;
|
const type = item.Type;
|
||||||
|
@ -211,7 +211,7 @@ function executeAction(card, target, action) {
|
||||||
ids: [playableItemId],
|
ids: [playableItemId],
|
||||||
startPositionTicks: startPositionTicks,
|
startPositionTicks: startPositionTicks,
|
||||||
serverId: serverId,
|
serverId: serverId,
|
||||||
sortOptions: userSettings.getSortValues(sortParentId)
|
queryOptions: userSettings.getSortValuesLegacy(sortParentId, 'SortName')
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
console.warn('Unable to play item', item);
|
console.warn('Unable to play item', item);
|
||||||
|
|
|
@ -728,7 +728,7 @@ class ItemsView {
|
||||||
playbackManager.play({
|
playbackManager.play({
|
||||||
items: [currentItem],
|
items: [currentItem],
|
||||||
autoplay: true,
|
autoplay: true,
|
||||||
sortOptions: values
|
queryOptions: values
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
getItems(self, self.params, currentItem, null, 0, 300).then(function (result) {
|
getItems(self, self.params, currentItem, null, 0, 300).then(function (result) {
|
||||||
|
@ -962,7 +962,7 @@ class ItemsView {
|
||||||
|
|
||||||
getSortValues() {
|
getSortValues() {
|
||||||
const basekey = this.getSettingsKey();
|
const basekey = this.getSettingsKey();
|
||||||
return userSettings.getSortValues(basekey);
|
return userSettings.getSortValuesLegacy(basekey, this.getDefaultSortBy());
|
||||||
}
|
}
|
||||||
|
|
||||||
getDefaultSortBy() {
|
getDefaultSortBy() {
|
||||||
|
|
|
@ -624,15 +624,28 @@ export class UserSettings {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the current sort values
|
* Gets the current sort values (Legacy - Non-JSON)
|
||||||
|
* (old views such as list.js [Photos] will
|
||||||
|
* use this one)
|
||||||
|
* @param {string} key - Filter key.
|
||||||
|
* @return {Object} sortOptions object
|
||||||
|
*/
|
||||||
|
getSortValuesLegacy(key, defaultSortBy) {
|
||||||
|
return {
|
||||||
|
sortBy: this.getFilter(key + '-sortby') || defaultSortBy,
|
||||||
|
sortOrder: this.getFilter(key + '-sortorder') === 'Descending' ? 'Descending' : 'Ascending'
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the current sort values (JSON)
|
||||||
|
* (new views such as MoviesView will use
|
||||||
|
* this one)
|
||||||
* @param {string} key - Filter key.
|
* @param {string} key - Filter key.
|
||||||
* @return {Object} sortOptions object
|
* @return {Object} sortOptions object
|
||||||
*/
|
*/
|
||||||
getSortValues(key) {
|
getSortValues(key) {
|
||||||
return {
|
return this.loadQuerySettings(key, {});
|
||||||
sortBy: this.getFilter(key + '-sortby'),
|
|
||||||
sortOrder: this.getFilter(key + '-sortorder') === 'Descending' ? 'Descending' : 'Ascending'
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -684,4 +697,5 @@ export const customCss = currentSettings.customCss.bind(currentSettings);
|
||||||
export const disableCustomCss = currentSettings.disableCustomCss.bind(currentSettings);
|
export const disableCustomCss = currentSettings.disableCustomCss.bind(currentSettings);
|
||||||
export const getSavedView = currentSettings.getSavedView.bind(currentSettings);
|
export const getSavedView = currentSettings.getSavedView.bind(currentSettings);
|
||||||
export const saveViewSetting = currentSettings.saveViewSetting.bind(currentSettings);
|
export const saveViewSetting = currentSettings.saveViewSetting.bind(currentSettings);
|
||||||
|
export const getSortValuesLegacy = currentSettings.getSortValuesLegacy.bind(currentSettings);
|
||||||
export const getSortValues = currentSettings.getSortValues.bind(currentSettings);
|
export const getSortValues = currentSettings.getSortValues.bind(currentSettings);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue