Refactor configuration tabs and enhance seasonal section functionality
This commit is contained in:
@@ -22,15 +22,15 @@
|
|||||||
<hr style="max-width: 800px; margin: 1em 0;">
|
<hr style="max-width: 800px; margin: 1em 0;">
|
||||||
|
|
||||||
<div style="margin-bottom: 1.5em;">
|
<div style="margin-bottom: 1.5em;">
|
||||||
<button class="jellyfin-tab-button active" onclick="showTab('basic', this)"
|
<button class="jellyfin-tab-button active" onclick="showTab('media-bar-enhanced-basic', this)"
|
||||||
style="background: none; border: none; color: #fff; cursor: pointer; transition: color 0.3s, border-bottom 0.3s; padding: 0.5em 1em; border-bottom: 2px solid #00a4dc;">
|
style="background: none; border: none; color: #fff; cursor: pointer; transition: color 0.3s, border-bottom 0.3s; padding: 0.5em 1em; border-bottom: 2px solid #00a4dc;">
|
||||||
<h3>General Settings</h3>
|
<h3>General Settings</h3>
|
||||||
</button>
|
</button>
|
||||||
<button class="jellyfin-tab-button" onclick="showTab('custom', this)"
|
<button class="jellyfin-tab-button" onclick="showTab('media-bar-enhanced-custom', this)"
|
||||||
style="background: none; border: none; color: #ccc; cursor: pointer; transition: color 0.3s, border-bottom 0.3s; padding: 0.5em 1em; border-bottom: 2px solid transparent;">
|
style="background: none; border: none; color: #ccc; cursor: pointer; transition: color 0.3s, border-bottom 0.3s; padding: 0.5em 1em; border-bottom: 2px solid transparent;">
|
||||||
<h3>Custom Content</h3>
|
<h3>Custom Content</h3>
|
||||||
</button>
|
</button>
|
||||||
<button class="jellyfin-tab-button" onclick="showTab('advanced', this)"
|
<button class="jellyfin-tab-button" onclick="showTab('media-bar-enhanced-advanced', this)"
|
||||||
style="background: none; border: none; color: #ccc; cursor: pointer; transition: color 0.3s, border-bottom 0.3s; padding: 0.5em 1em; border-bottom: 2px solid transparent;">
|
style="background: none; border: none; color: #ccc; cursor: pointer; transition: color 0.3s, border-bottom 0.3s; padding: 0.5em 1em; border-bottom: 2px solid transparent;">
|
||||||
<h3>Advanced Settings</h3>
|
<h3>Advanced Settings</h3>
|
||||||
</button>
|
</button>
|
||||||
@@ -39,11 +39,11 @@
|
|||||||
<form id="mediaBarEnhancedConfigForm">
|
<form id="mediaBarEnhancedConfigForm">
|
||||||
|
|
||||||
<!-- BASIC TAB -->
|
<!-- BASIC TAB -->
|
||||||
<div id="basic" class="tab-content">
|
<div id="media-bar-enhanced-basic" class="tab-content">
|
||||||
<h2 class="sectionTitle">Main Plugin Settings</h2>
|
<h2 class="sectionTitle">Main Plugin Settings</h2>
|
||||||
<div class="checkboxContainer checkboxContainer-withDescription">
|
<div class="checkboxContainer checkboxContainer-withDescription">
|
||||||
<label>
|
<label>
|
||||||
<input is="emby-checkbox" type="checkbox" id="IsEnabled" name="IsEnabled" />
|
<input is="emby-checkbox" type="checkbox" id="MediaBarIsEnabled" name="MediaBarIsEnabled" />
|
||||||
<span>Enable Media Bar Enhanced Plugin</span>
|
<span>Enable Media Bar Enhanced Plugin</span>
|
||||||
</label>
|
</label>
|
||||||
<div class="fieldDescription">Enable or disable the entire plugin functionality.</div>
|
<div class="fieldDescription">Enable or disable the entire plugin functionality.</div>
|
||||||
@@ -101,7 +101,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- CUSTOM CONTENT TAB -->
|
<!-- CUSTOM CONTENT TAB -->
|
||||||
<div id="custom" class="tab-content" style="display:none;">
|
<div id="media-bar-enhanced-custom" class="tab-content" style="display:none;">
|
||||||
<!-- Default Custom Media IDs -->
|
<!-- Default Custom Media IDs -->
|
||||||
<h2 class="sectionTitle">Custom Media IDs</h2>
|
<h2 class="sectionTitle">Custom Media IDs</h2>
|
||||||
<div class="checkboxContainer checkboxContainer-withDescription">
|
<div class="checkboxContainer checkboxContainer-withDescription">
|
||||||
@@ -164,6 +164,12 @@
|
|||||||
during their active date ranges. If no season matches the current date, the default Custom Media IDs above or random selection are used as fallback.</div>
|
during their active date ranges. If no season matches the current date, the default Custom Media IDs above or random selection are used as fallback.</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="seasonalContentContainer" style="display: none;">
|
<div id="seasonalContentContainer" style="display: none;">
|
||||||
|
|
||||||
|
<div style="background-color: rgba(255, 255, 255, 0.05); border-left: 4px solid #00a4dc; border-radius: 4px; padding: 1em 1.5em; margin: 1.5em 0; display: flex; align-items: center; gap: 1em;">
|
||||||
|
<i class="material-icons" style="color: #00a4dc; font-size: 24px;">info</i>
|
||||||
|
<div>Define rules to automatically select a seasonal selection of items based on the date. Rules are evaluated from top to bottom. The first matching rule wins.</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div id="seasonalSectionsList"></div>
|
<div id="seasonalSectionsList"></div>
|
||||||
<button is="emby-button" type="button" id="addSeasonBtn" class="raised emby-button"
|
<button is="emby-button" type="button" id="addSeasonBtn" class="raised emby-button"
|
||||||
style="margin-top: 1em; display: inline-flex; align-items: center; gap: 0.4em;">
|
style="margin-top: 1em; display: inline-flex; align-items: center; gap: 0.4em;">
|
||||||
@@ -175,7 +181,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- ADVANCED TAB -->
|
<!-- ADVANCED TAB -->
|
||||||
<div id="advanced" class="tab-content" style="display:none;">
|
<div id="media-bar-enhanced-advanced" class="tab-content" style="display:none;">
|
||||||
<h2 class="sectionTitle">Features</h2>
|
<h2 class="sectionTitle">Features</h2>
|
||||||
<div class="checkboxContainer checkboxContainer-withDescription">
|
<div class="checkboxContainer checkboxContainer-withDescription">
|
||||||
<label>
|
<label>
|
||||||
@@ -443,7 +449,7 @@
|
|||||||
ApiClient.getPluginConfiguration(MediaBarEnhancedConfigurationPage.pluginId).then(function (config) {
|
ApiClient.getPluginConfiguration(MediaBarEnhancedConfigurationPage.pluginId).then(function (config) {
|
||||||
|
|
||||||
var keys = [
|
var keys = [
|
||||||
'IsEnabled', 'ShuffleInterval', 'RetryInterval', 'MinSwipeDistance',
|
'MediaBarIsEnabled', 'ShuffleInterval', 'RetryInterval', 'MinSwipeDistance',
|
||||||
'LoadingCheckInterval', 'MaxPlotLength', 'MaxMovies', 'MaxTvShows',
|
'LoadingCheckInterval', 'MaxPlotLength', 'MaxMovies', 'MaxTvShows',
|
||||||
'MaxItems', 'PreloadCount', 'FadeTransitionDuration', 'MaxPaginationDots',
|
'MaxItems', 'PreloadCount', 'FadeTransitionDuration', 'MaxPaginationDots',
|
||||||
'SlideAnimationEnabled', 'EnableVideoBackdrop', 'UseSponsorBlock',
|
'SlideAnimationEnabled', 'EnableVideoBackdrop', 'UseSponsorBlock',
|
||||||
@@ -534,7 +540,7 @@
|
|||||||
|
|
||||||
var config = {};
|
var config = {};
|
||||||
var keys = [
|
var keys = [
|
||||||
'IsEnabled', 'ShuffleInterval', 'RetryInterval', 'MinSwipeDistance',
|
'MediaBarIsEnabled', 'ShuffleInterval', 'RetryInterval', 'MinSwipeDistance',
|
||||||
'LoadingCheckInterval', 'MaxPlotLength', 'MaxMovies', 'MaxTvShows',
|
'LoadingCheckInterval', 'MaxPlotLength', 'MaxMovies', 'MaxTvShows',
|
||||||
'MaxItems', 'PreloadCount', 'FadeTransitionDuration', 'MaxPaginationDots',
|
'MaxItems', 'PreloadCount', 'FadeTransitionDuration', 'MaxPaginationDots',
|
||||||
'SlideAnimationEnabled', 'EnableVideoBackdrop', 'UseSponsorBlock',
|
'SlideAnimationEnabled', 'EnableVideoBackdrop', 'UseSponsorBlock',
|
||||||
@@ -612,14 +618,18 @@
|
|||||||
|
|
||||||
div.innerHTML =
|
div.innerHTML =
|
||||||
'<div class="inputContainer" style="margin-bottom: 0.5em;">' +
|
'<div class="inputContainer" style="margin-bottom: 0.5em;">' +
|
||||||
' <label class="inputLabel" style="font-size: 1.2em; font-weight: bold; margin-bottom:0.5em; display:block;">' + labelText + '</label>' +
|
' <div style="display: flex; align-items: center; justify-content: space-between;">' +
|
||||||
' <div style="display: flex; align-items: center;">' +
|
' <label class="inputLabel section-title" style="font-size: 1.2em; font-weight: bold; margin-bottom:0.5em; display:block;">' + labelText + '</label>' +
|
||||||
' <div style="flex-grow:1;">' +
|
' <div style="display: flex; gap: 0.5em;">' +
|
||||||
' <input is="emby-input" type="text" class="emby-input section-name" value="' + (data.Name || '') + '" />' +
|
' <button type="button" is="paper-icon-button-light" class="btn-move-up" title="Move Up"><i class="material-icons">arrow_upward</i></button>' +
|
||||||
|
' <button type="button" is="paper-icon-button-light" class="btn-move-down" title="Move Down"><i class="material-icons">arrow_downward</i></button>' +
|
||||||
|
' <button type="button" is="paper-icon-button-light" class="btn-remove" title="Remove" style="color: #a94442;"><i class="material-icons">delete</i></button>' +
|
||||||
' </div>' +
|
' </div>' +
|
||||||
' <button type="button" class="raised emby-button remove-section" style="background: #a94442; min-width: unset; margin-left: 1em;">Remove</button>' +
|
|
||||||
' </div>' +
|
' </div>' +
|
||||||
' <div class="fieldDescription">Name of the season</div>' +
|
' <div class="inputContainer">' +
|
||||||
|
' <input is="emby-input" type="text" class="emby-input section-name" value="' + (data.Name || '') + '" />' +
|
||||||
|
' <div class="fieldDescription">Name of the season</div>' +
|
||||||
|
' </div>' +
|
||||||
'</div>' +
|
'</div>' +
|
||||||
'<div class="inputContainer" style="margin-bottom: 1em;">' +
|
'<div class="inputContainer" style="margin-bottom: 1em;">' +
|
||||||
' <label class="inputLabel" style="margin-bottom:0.5em; display:block;">Active Period</label>' +
|
' <label class="inputLabel" style="margin-bottom:0.5em; display:block;">Active Period</label>' +
|
||||||
@@ -639,13 +649,38 @@
|
|||||||
' <div class="fieldDescription">Comma-separated or Newline separated list of Movie/Series/Collection IDs to show during this season.<br>Same options available as for the default media IDs.</div>' +
|
' <div class="fieldDescription">Comma-separated or Newline separated list of Movie/Series/Collection IDs to show during this season.<br>Same options available as for the default media IDs.</div>' +
|
||||||
'</div>';
|
'</div>';
|
||||||
|
|
||||||
div.querySelector('.remove-section').addEventListener('click', function() {
|
div.querySelector('.btn-remove').addEventListener('click', function() {
|
||||||
div.remove();
|
div.remove();
|
||||||
|
MediaBarEnhancedConfigurationPage.updateSectionTitles(container);
|
||||||
|
});
|
||||||
|
|
||||||
|
div.querySelector('.btn-move-up').addEventListener('click', function() {
|
||||||
|
if (div.previousElementSibling) {
|
||||||
|
container.insertBefore(div, div.previousElementSibling);
|
||||||
|
MediaBarEnhancedConfigurationPage.updateSectionTitles(container);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
div.querySelector('.btn-move-down').addEventListener('click', function() {
|
||||||
|
if (div.nextElementSibling) {
|
||||||
|
container.insertBefore(div.nextElementSibling, div);
|
||||||
|
MediaBarEnhancedConfigurationPage.updateSectionTitles(container);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
container.appendChild(div);
|
container.appendChild(div);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
updateSectionTitles: function(container) {
|
||||||
|
var sections = container.querySelectorAll('.seasonal-section');
|
||||||
|
sections.forEach(function(section, index) {
|
||||||
|
var title = section.querySelector('.section-title');
|
||||||
|
if (title) {
|
||||||
|
title.innerText = 'Season list #' + (index + 1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
getSeasonalSectionsFromUI: function(page) {
|
getSeasonalSectionsFromUI: function(page) {
|
||||||
var sections = [];
|
var sections = [];
|
||||||
var els = page.querySelectorAll('.seasonal-section');
|
var els = page.querySelectorAll('.seasonal-section');
|
||||||
|
|||||||
Reference in New Issue
Block a user