Add sort order option for recently released home screen sections

This commit is contained in:
HighImKevin
2025-12-02 00:28:03 -05:00
parent 069fd2fdf5
commit 8f3ee87819
3 changed files with 43 additions and 63 deletions
+5
View File
@@ -176,4 +176,9 @@ summary.listItemBodyText {
.navMenuOption[data-name="configure"]:hover:not(.navMenuOption-selected) {
transform: none !important;
margin-top: 3em !important;
}
div#homeScreen_recentlyReleased_container .listItem:has(#homeScreen_recentlyReleased_movies_sortOrder),
div#homeScreen_recentlyReleased_container .listItem:has(#homeScreen_recentlyReleased_episodes_sortOrder) {
display: none;
}
+31 -44
View File
@@ -1442,7 +1442,8 @@
nameInputAttributes = {},
includeCardFormat = true,
includeItemLimit = true,
includeIsPlayed = false
includeIsPlayed = false,
includePremiereDays = false
} = options;
const nameValue = config.name ?? defaultName ?? '';
@@ -1557,6 +1558,26 @@
</div>`;
}
if (includePremiereDays) {
const minAgeInDays = config.minAgeInDays ?? 0;
const maxAgeInDays = config.maxAgeInDays ?? 30;
html += `
<div class="listItem" style="border: 1px solid rgba(255,255,255,0.1); border-radius: 4px; padding: 0.75em;">
<div class="listItemContent">
<div class="listItemBodyText" style="margin-bottom: 0.5em;">Minimum Age (Days)</div>
<input type="number" id="${prefix}_minAgeInDays" class="fld emby-input" value="${minAgeInDays}" style="width: 100%;">
<div class="fieldDescription" style="margin-top: 0.25em;">Optional. Days since release (e.g. 0 for today).</div>
</div>
</div>
<div class="listItem" style="border: 1px solid rgba(255,255,255,0.1); border-radius: 4px; padding: 0.75em;">
<div class="listItemContent">
<div class="listItemBodyText" style="margin-bottom: 0.5em;">Maximum Age (Days)</div>
<input type="number" id="${prefix}_maxAgeInDays" class="fld emby-input" value="${maxAgeInDays}" style="width: 100%;">
<div class="fieldDescription" style="margin-top: 0.25em;">Optional. Max days old (e.g. 30).</div>
</div>
</div>`;
}
if (includeIsPlayed) {
html += `
<div class="listItem" style="border: 1px solid rgba(255,255,255,0.1); border-radius: 4px; padding: 0.75em;">
@@ -1668,22 +1689,7 @@
${buildJellyfinCheckbox('homeScreen_recentlyReleased_movies_enabled', (recentlyReleased.movies || {}).enabled !== false, 'Enabled')}
</div>
<div class="listItemContent" style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 0.75em;">
${createSectionConfiguration('homeScreen_recentlyReleased_movies', recentlyReleased.movies || {}, { includeName: true, defaultName: 'Recently Released Movies', includeSortOrder: false, includeOrder: true, includeIsPlayed: true })}
<div class="listItem" style="border: 1px solid rgba(255,255,255,0.1); border-radius: 4px; padding: 0.75em;">
<div class="listItemContent">
<div class="listItemBodyText" style="margin-bottom: 0.5em;">Minimum Age (Days)</div>
<input type="number" id="homeScreen_recentlyReleased_movies_minAgeInDays" class="fld emby-input" value="${recentlyReleased.movies?.minAgeInDays ?? ''}" style="width: 100%;">
<div class="fieldDescription" style="margin-top: 0.25em;">Optional. Days since release (e.g. 0 for today).</div>
</div>
</div>
<div class="listItem" style="border: 1px solid rgba(255,255,255,0.1); border-radius: 4px; padding: 0.75em;">
<div class="listItemContent">
<div class="listItemBodyText" style="margin-bottom: 0.5em;">Maximum Age (Days)</div>
<input type="number" id="homeScreen_recentlyReleased_movies_maxAgeInDays" class="fld emby-input" value="${recentlyReleased.movies?.maxAgeInDays ?? ''}" style="width: 100%;">
<div class="fieldDescription" style="margin-top: 0.25em;">Optional. Max days old (e.g. 30).</div>
</div>
</div>
${createSectionConfiguration('homeScreen_recentlyReleased_movies', recentlyReleased.movies || {}, { includeName: true, defaultName: 'Recently Released Movies', includeSortOrder: true, includeOrder: true, includeIsPlayed: true, includePremiereDays: true })}
</div>
</div>
</details>
@@ -1700,22 +1706,7 @@
${buildJellyfinCheckbox('homeScreen_recentlyReleased_episodes_enabled', (recentlyReleased.episodes || {}).enabled !== false, 'Enabled')}
</div>
<div class="listItemContent" style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 0.75em;">
${createSectionConfiguration('homeScreen_recentlyReleased_episodes', recentlyReleased.episodes || {}, { includeName: true, defaultName: 'Recently Aired Episodes', includeSortOrder: false, includeOrder: true, includeIsPlayed: true })}
<div class="listItem" style="border: 1px solid rgba(255,255,255,0.1); border-radius: 4px; padding: 0.75em;">
<div class="listItemContent">
<div class="listItemBodyText" style="margin-bottom: 0.5em;">Minimum Age (Days)</div>
<input type="number" id="homeScreen_recentlyReleased_episodes_minAgeInDays" class="fld emby-input" value="${recentlyReleased.episodes?.minAgeInDays ?? ''}" style="width: 100%;">
<div class="fieldDescription" style="margin-top: 0.25em;">Optional. Days since release (e.g. 0 for today).</div>
</div>
</div>
<div class="listItem" style="border: 1px solid rgba(255,255,255,0.1); border-radius: 4px; padding: 0.75em;">
<div class="listItemContent">
<div class="listItemBodyText" style="margin-bottom: 0.5em;">Maximum Age (Days)</div>
<input type="number" id="homeScreen_recentlyReleased_episodes_maxAgeInDays" class="fld emby-input" value="${recentlyReleased.episodes?.maxAgeInDays ?? ''}" style="width: 100%;">
<div class="fieldDescription" style="margin-top: 0.25em;">Optional. Max days old (e.g. 7).</div>
</div>
</div>
${createSectionConfiguration('homeScreen_recentlyReleased_episodes', recentlyReleased.episodes || {}, { includeName: true, defaultName: 'Recently Aired Episodes', includeSortOrder: true, includeOrder: true, includeIsPlayed: true, includePremiereDays: true })}
</div>
</div>
</details>
@@ -5022,17 +5013,13 @@ window.KefinTweaksConfig = ${JSON.stringify(config, null, 2)};`;
enabled: document.getElementById('homeScreen_recentlyReleased_enabled')?.checked !== false,
movies: {
enabled: document.getElementById('homeScreen_recentlyReleased_movies_enabled')?.checked !== false,
...getSectionConfig('homeScreen_recentlyReleased_movies', { includeName: true, defaultName: 'Recently Released Movies', includeSortOrder: false, includeOrder: true }),
minPremiereDate: document.getElementById('homeScreen_recentlyReleased_movies_minPremiereDate')?.value || '',
maxPremiereDate: document.getElementById('homeScreen_recentlyReleased_movies_maxPremiereDate')?.value || ''
},
episodes: {
enabled: document.getElementById('homeScreen_recentlyReleased_episodes_enabled')?.checked !== false,
minPremiereDate: document.getElementById('homeScreen_recentlyReleased_episodes_minPremiereDate')?.value || '',
maxPremiereDate: document.getElementById('homeScreen_recentlyReleased_episodes_maxPremiereDate')?.value || '',
...getSectionConfig('homeScreen_recentlyReleased_episodes', { includeName: true, defaultName: 'Recently Aired Episodes', includeSortOrder: false, includeOrder: true })
}
},
...getSectionConfig('homeScreen_recentlyReleased_movies', { includeName: true, defaultName: 'Recently Released Movies', includeSortOrder: true, includeOrder: true, includeIsPlayed: true, includePremiereDays: true })
},
episodes: {
enabled: document.getElementById('homeScreen_recentlyReleased_episodes_enabled')?.checked !== false,
...getSectionConfig('homeScreen_recentlyReleased_episodes', { includeName: true, defaultName: 'Recently Aired Episodes', includeSortOrder: true, includeOrder: true, includeIsPlayed: true, includePremiereDays: true })
}
},
trending: {
enabled: document.getElementById('homeScreen_trending_enabled')?.checked === true,
...getSectionConfig('homeScreen_trending', { includeName: true, defaultName: 'Trending' })
+7 -19
View File
@@ -2611,9 +2611,7 @@
* Fetches newest movies from Jellyfin API
* @returns {Promise<Array>} - Array of newest movie items
*/
async function fetchNewMovies() {
const apiClient = window.ApiClient;
async function fetchNewMovies() {
// Calculate date range based on configuration
const minAgeInDays = newMoviesConfig.minAgeInDays !== null && newMoviesConfig.minAgeInDays !== undefined ? newMoviesConfig.minAgeInDays : 0;
const maxAgeInDays = newMoviesConfig.maxAgeInDays !== null && newMoviesConfig.maxAgeInDays !== undefined ? newMoviesConfig.maxAgeInDays : 30; // Default 30 days old max
@@ -2634,8 +2632,8 @@
const options = {
IncludeItemTypes: 'Movie',
SortBy: 'DateCreated',
SortOrder: 'Descending',
SortBy: 'PremiereDate',
SortOrder: newMoviesConfig.sortOrderDirection === 'Ascending' ? 'Ascending' : 'Descending',
Limit: 16,
Fields: 'PremiereDate',
Recursive: true,
@@ -2663,9 +2661,7 @@
* keeping only the episode with the lowest index number
* @returns {Promise<Array>} - Array of deduplicated newest episode items
*/
async function fetchNewEpisodes() {
const apiClient = window.ApiClient;
async function fetchNewEpisodes() {
// Calculate date range based on configuration
const minAgeInDays = newEpisodesConfig.minAgeInDays !== null && newEpisodesConfig.minAgeInDays !== undefined ? newEpisodesConfig.minAgeInDays : 0;
const maxAgeInDays = newEpisodesConfig.maxAgeInDays !== null && newEpisodesConfig.maxAgeInDays !== undefined ? newEpisodesConfig.maxAgeInDays : 7; // Default 7 days old max
@@ -2685,7 +2681,7 @@
LocationTypes: 'FileSystem',
Recursive: true,
SortBy: 'PremiereDate',
SortOrder: 'Descending',
SortOrder: newEpisodesConfig.sortOrderDirection === 'Ascending' ? 'Ascending' : 'Descending',
MinPremiereDate: minPremiereDate,
MaxPremiereDate: maxPremiereDate,
Limit: 100,
@@ -2792,8 +2788,6 @@
// Get config values
const itemLimit = newMoviesConfig.itemLimit ?? defaultItemLimit;
const sortOrder = newMoviesConfig.sortOrder ?? defaultSortOrder;
const sortOrderDirection = newMoviesConfig.sortOrderDirection ?? 'Descending';
const cardFormat = newMoviesConfig.cardFormat ?? defaultCardFormat;
const order = newMoviesConfig.order ?? 30;
const sectionName = newMoviesConfig.name || 'Recently Released Movies';
@@ -2807,9 +2801,7 @@
sectionName,
null,
true,
cardFormat,
sortOrder,
sortOrderDirection
cardFormat
);
// Add data attributes to track rendered sections
@@ -2849,8 +2841,6 @@
// Get config values
const itemLimit = newEpisodesConfig.itemLimit ?? defaultItemLimit;
const sortOrder = newEpisodesConfig.sortOrder ?? defaultSortOrder;
const sortOrderDirection = newEpisodesConfig.sortOrderDirection ?? 'Descending';
const cardFormat = newEpisodesConfig.cardFormat ?? defaultCardFormat;
const order = newEpisodesConfig.order ?? 31;
const sectionName = newEpisodesConfig.name || 'Recently Aired Episodes';
@@ -2865,9 +2855,7 @@
sectionName,
viewMoreUrl,
true,
cardFormat,
sortOrder,
sortOrderDirection
cardFormat
);
// Add data attributes to track rendered sections