<!--Начало Первые N тем в описании разделов форума (Fover + Reysler + Merlin777) v3.1-->
<!-- Пример работы: https://kuban.mybb.ru -->
<style>
.topicslist {
position: absolute;
background-color: #fff;
border: 1px solid rgba(0, 0, 0, .35);
margin-top: 5px;
padding: 10px;
box-shadow: 0 4px 4px -2px rgba(0, 0, 0, .35);
border-radius: 3px;
max-width: 80vw;
z-index: 999;
.sticky a {
font-weight: bold;
color: blue; /* Цвет для выделенных тем */
}
.closed a {
color: #cb8787; /* Цвет для закрытых тем */
}
}
.clickt {
cursor: pointer;
user-select: none;
font-size: 15px; /* Размер для стрелочки ">" */
color: #22229C; /* Цвет для стрелочки ">" */
}
.icon-download-themes {
display: inline-block;
background-image: url("https://forumupload.ru/uploads/001a/f0/7d/2/12211.png");
background-size: cover;
border: 0;
line-height: 1;
vertical-align: middle;
width: 16px;
height: 16px;
}
@media (max-width: 540px) {
.icon-download-themes {
background-image: none;
}
.icon-download-themes:after {
content: ">";
}
}
</style>
<script>
(function() {
let count = 7; // Максимальное количество выводимых тем форума
let selectAct = 'click'; // Вариант показа блока: 'click' (нажатие по символу рядом с названием темы) или 'hover' (наведение курсором на название темы)
let useSession = 1; // 1 - включить использование sessionStorage, 0 - выключить
function loadTopics(t, s) {
const cacheTime = 10 * 60 * 1000; // 10 минут кэширования данных
const now = Date.now();
// Проверяем, есть ли данные в sessionStorage
const cachedData = sessionStorage.getItem(s);
if (useSession && cachedData) {
const parsedData = JSON.parse(cachedData);
// Проверяем, не устарели ли данные (кэш храним не дольше 10 минут)
if (now - parsedData.timestamp < cacheTime) {
t.find("ul").empty();
parsedData.data.forEach(function (item) {
t.find("ul").append('<li class="' + item.class + '"><a href="' + item.url + '">' + item.subject + "</a></li>");
});
return;
} else {
sessionStorage.removeItem(s); // Удаляем устаревшие данные
}
}
// Если данных нет или они устарели, делаем запрос к API
$.getJSON("/api.php?method=topic.get&forum_id=" + s + "&sort_by=last_post&sort_dir=desc&limit=100", function (response) {
t.find("ul").empty();
if (response && response.response && response.response.length > 0) {
response.response.forEach(function (topic) {
topic.sticky = parseInt(topic.sticky, 10);
topic.closed = parseInt(topic.closed, 10);
});
// Сортировка закрепленных и обычных тем
const stickyTopics = response.response.filter(function (topic) {
return topic.sticky === 1;
}).sort(function (a, b) {
return b.last_post_date - a.last_post_date;
});
const nonStickyTopics = response.response.filter(function (topic) {
return topic.sticky !== 1;
}).sort(function (a, b) {
return b.last_post_date - a.last_post_date;
});
// Объединение тем и создание списка
const topics = stickyTopics.concat(nonStickyTopics).slice(0, count).map(function (topic) {
let className = "";
if (topic.sticky === 1) className += "sticky ";
if (topic.closed === 1) className += "closed";
return {
subject: topic.subject,
url: "/viewtopic.php?id=" + topic.id,
class: className.trim(),
last_post_date: topic.last_post_date
};
});
// Отображаем темы
topics.forEach(function (item) {
t.find("ul").append('<li class="' + item.class + '"><a href="' + item.url + '">' + item.subject + "</a></li>");
});
// Сохраняем данные в sessionStorage с меткой времени
if (useSession) {
sessionStorage.setItem(s, JSON.stringify({
data: topics,
timestamp: now // Сохраняем текущее время
}));
}
} else {
t.find("ul").append("<li>В этом форуме нет тем.</li>");
}
}).fail(function (xhr, status, error) {
t.find("ul").empty();
console.log("Ошибка при загрузке данных.");
if (GroupID === 1) {
console.log('Произошла ошибка в скрипте. Код ошибки: ' + error, { sticky: true });
}
});
}
function showTopics(t) {
const s = t.parents("tr").attr("id").match(/\d+/)[0];
const topicsList = t.closest("tr").find(".topicslist");
if (currentForumId !== s || !topicsList.length) {
$(".topicslist").remove();
t.closest("tr").find("h3").after('<div class="topicslist"><ul><li>Загружаю список тем...</li></ul></div>');
loadTopics(t.closest("tr").find(".topicslist"), s);
currentForumId = s;
if (selectAct === "hover") {
resetCloseTimeout(t.closest("tr").find(".topicslist"));
}
}
}
function resetCloseTimeout(t) {
clearTimeout(closeTimeout);
closeTimeout = setTimeout(function () {
t.remove();
currentForumId = null;
}, 2000);
}
currentForumId = null;
closeTimeout = null;
if (selectAct === "hover") {
$(".tclcon h3 a").on("mouseenter", function () {
const s = $(this).parents("tr").attr("id").match(/\d+/)[0];
if (currentForumId !== s) {
showTopics($(this));
}
});
$(document).on("mouseenter", ".topicslist, .tclcon h3 a", function () {
clearTimeout(closeTimeout);
});
$(document).on("mouseleave", ".topicslist, .tclcon h3 a", function () {
resetCloseTimeout($(".topicslist"));
});
} else {
$(".tclcon h3 a").each(function () {
$(this).after(' <span class="clickt" title="Показать список тем этого форума"><div class="icon-download-themes"></div></span>');
});
$(".clickt").on("click", function (e) {
e.stopPropagation();
const s = $(this).closest("tr").attr("id").match(/\d+/)[0];
const topicsList = $(this).closest("tr").find(".topicslist");
if (currentForumId === s && topicsList.length) {
topicsList.remove();
currentForumId = null;
} else {
showTopics($(this));
}
});
}
$(document).click(function (e) {
if (!$(e.target).closest(".topicslist").length && !$(e.target).closest(".clickt").length) {
$(".topicslist").remove();
currentForumId = null;
}
});
})();
</script>
<!-- Конец Первые N тем в описании разделов форума -->