diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4ad54157..26dda362 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,27 @@
# Changelog
+## v2.14.6 (2024-10-12)
+
+* Newsletters:
+ * Fix: Allow formatting newsletter date parameters.
+ * Change: Support apscheduler compatible cron expressions.
+* UI:
+ * Fix: Round runtime before converting to human duration.
+ * Fix: Make recently added/watched rows touch scrollable.
+* Other:
+ * Fix: Auto-updater not running.
+
+
+## v2.14.5 (2024-09-20)
+
+* Activity:
+ * Fix: Display of 2k resolution on activity card.
+* Notifications:
+ * Fix: ntfy notifications with special characters failing to send.
+* Other:
+ * Fix: Memory leak with database closing. (#2404)
+
+
## v2.14.4 (2024-08-10)
* Notifications:
@@ -8,7 +30,7 @@
* UI:
* Fix: macOS platform capitalization.
* Other:
- * Fix: Remove deprecated getdefaultlocale (Thanks @teodorstelian) (#2364, #2345)
+ * Fix: Remove deprecated getdefaultlocale. (Thanks @teodorstelian) (#2364, #2345)
## v2.14.3 (2024-06-19)
diff --git a/data/interfaces/default/css/tautulli.css b/data/interfaces/default/css/tautulli.css
index f8b15890..2835488d 100644
--- a/data/interfaces/default/css/tautulli.css
+++ b/data/interfaces/default/css/tautulli.css
@@ -1478,7 +1478,8 @@ a:hover .dashboard-stats-square {
text-align: center;
position: relative;
z-index: 0;
- overflow: hidden;
+ overflow: auto;
+ scrollbar-width: none;
}
.dashboard-recent-media {
width: 100%;
diff --git a/data/interfaces/default/index.html b/data/interfaces/default/index.html
index 6e4818c7..582ac93f 100644
--- a/data/interfaces/default/index.html
+++ b/data/interfaces/default/index.html
@@ -92,10 +92,10 @@
Recently Added
@@ -936,10 +936,14 @@
count: recently_added_count,
media_type: recently_added_type
},
+ beforeSend: function () {
+ $(".dashboard-recent-media-row").animate({ scrollLeft: 0 }, 1000);
+ },
complete: function (xhr, status) {
$("#recentlyAdded").html(xhr.responseText);
$('#ajaxMsg').fadeOut();
- highlightAddedScrollerButton();
+ highlightScrollerButton("#recently-added");
+ paginateScroller("#recently-added", ".paginate-added");
}
});
}
@@ -955,57 +959,11 @@
recentlyAdded(recently_added_count, recently_added_type);
}
- function highlightAddedScrollerButton() {
- var scroller = $("#recently-added-row-scroller");
- var numElems = scroller.find("li:visible").length;
- scroller.width(numElems * 175);
- if (scroller.width() > $("body").find(".container-fluid").width()) {
- $("#recently-added-page-right").removeClass("disabled");
- } else {
- $("#recently-added-page-right").addClass("disabled");
- }
- }
-
- $(window).resize(function () {
- highlightAddedScrollerButton();
- });
-
- function resetScroller() {
- leftTotal = 0;
- $("#recently-added-row-scroller").animate({ left: leftTotal }, 1000);
- $("#recently-added-page-left").addClass("disabled").blur();
- }
-
- var leftTotal = 0;
- $(".paginate").click(function (e) {
- e.preventDefault();
- var scroller = $("#recently-added-row-scroller");
- var containerWidth = $("body").find(".container-fluid").width();
- var scrollAmount = $(this).data("id") * parseInt((containerWidth - 15) / 175) * 175;
- var leftMax = Math.min(-parseInt(scroller.width()) + Math.abs(scrollAmount), 0);
-
- leftTotal = Math.max(Math.min(leftTotal + scrollAmount, 0), leftMax);
- scroller.animate({ left: leftTotal }, 250);
-
- if (leftTotal === 0) {
- $("#recently-added-page-left").addClass("disabled").blur();
- } else {
- $("#recently-added-page-left").removeClass("disabled");
- }
-
- if (leftTotal === leftMax) {
- $("#recently-added-page-right").addClass("disabled").blur();
- } else {
- $("#recently-added-page-right").removeClass("disabled");
- }
- });
-
$('#recently-added-toggles').on('change', function () {
$('#recently-added-toggles > label').removeClass('active');
selected_filter = $('input[name=recently-added-toggle]:checked', '#recently-added-toggles');
$(selected_filter).closest('label').addClass('active');
recently_added_type = $(selected_filter).val();
- resetScroller();
setLocalStorage('home_stats_recently_added_type', recently_added_type);
recentlyAdded(recently_added_count, recently_added_type);
});
@@ -1013,7 +971,6 @@
$('#recently-added-count').change(function () {
forceMinMax($(this));
recently_added_count = $(this).val();
- resetScroller();
setLocalStorage('home_stats_recently_added_count', recently_added_count);
recentlyAdded(recently_added_count, recently_added_type);
});
diff --git a/data/interfaces/default/js/script.js b/data/interfaces/default/js/script.js
index 2df5daeb..5d75c69d 100644
--- a/data/interfaces/default/js/script.js
+++ b/data/interfaces/default/js/script.js
@@ -360,7 +360,8 @@ function humanDuration(ms, sig='dhm', units='ms', return_seconds=300000) {
sig = 'dhms'
}
- ms = ms * factors[units];
+ r = factors[sig.slice(-1)];
+ ms = Math.round(ms * factors[units] / r) * r;
h = ms % factors['d'];
d = Math.trunc(ms / factors['d']);
@@ -929,3 +930,50 @@ $('.modal').on('hide.bs.modal', function (e) {
$.fn.hasScrollBar = function() {
return this.get(0).scrollHeight > this.get(0).clientHeight;
}
+
+function paginateScroller(scrollerId, buttonClass) {
+ $(buttonClass).click(function (e) {
+ e.preventDefault();
+ var scroller = $(scrollerId + "-row-scroller");
+ var scrollerParent = scroller.parent();
+ var containerWidth = scrollerParent.width();
+ var scrollCurrent = scrollerParent.scrollLeft();
+ var scrollAmount = $(this).data("id") * parseInt(containerWidth / 175) * 175;
+ var scrollMax = scroller.width() - Math.abs(scrollAmount);
+ var scrollTotal = Math.min(parseInt(scrollCurrent / 175) * 175 + scrollAmount, scrollMax);
+ scrollerParent.animate({ scrollLeft: scrollTotal }, 250);
+ });
+}
+
+function highlightScrollerButton(scrollerId) {
+ var scroller = $(scrollerId + "-row-scroller");
+ var scrollerParent = scroller.parent();
+ var buttonLeft = $(scrollerId + "-page-left");
+ var buttonRight = $(scrollerId + "-page-right");
+
+ var numElems = scroller.find("li").length;
+ scroller.width(numElems * 175);
+ $(buttonLeft).addClass("disabled").blur();
+ if (scroller.width() > scrollerParent.width()) {
+ $(buttonRight).removeClass("disabled");
+ } else {
+ $(buttonRight).addClass("disabled");
+ }
+
+ scrollerParent.scroll(function () {
+ var scrollCurrent = $(this).scrollLeft();
+ var scrollMax = scroller.width() - $(this).width();
+
+ if (scrollCurrent == 0) {
+ $(buttonLeft).addClass("disabled").blur();
+ } else {
+ $(buttonLeft).removeClass("disabled");
+ }
+
+ if (scrollCurrent >= scrollMax) {
+ $(buttonRight).addClass("disabled").blur();
+ } else {
+ $(buttonRight).removeClass("disabled");
+ }
+ });
+}
diff --git a/data/interfaces/default/library.html b/data/interfaces/default/library.html
index b1fe8b6f..ba61153d 100644
--- a/data/interfaces/default/library.html
+++ b/data/interfaces/default/library.html
@@ -149,10 +149,10 @@ DOCUMENTATION :: END