You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
151 lines
4.5 KiB
JavaScript
151 lines
4.5 KiB
JavaScript
'use strict';
|
|
|
|
define('forum/category', [
|
|
'forum/infinitescroll',
|
|
'share',
|
|
'navigator',
|
|
'topicList',
|
|
'sort',
|
|
'categorySelector',
|
|
'hooks',
|
|
'alerts',
|
|
], function (infinitescroll, share, navigator, topicList, sort, categorySelector, hooks, alerts) {
|
|
const Category = {};
|
|
|
|
$(window).on('action:ajaxify.start', function (ev, data) {
|
|
if (!String(data.url).startsWith('category/')) {
|
|
navigator.disable();
|
|
}
|
|
});
|
|
|
|
Category.init = function () {
|
|
const cid = ajaxify.data.cid;
|
|
|
|
app.enterRoom('category_' + cid);
|
|
|
|
share.addShareHandlers(ajaxify.data.name);
|
|
|
|
topicList.init('category', loadTopicsAfter);
|
|
|
|
sort.handleSort('categoryTopicSort', 'category/' + ajaxify.data.slug);
|
|
|
|
if (!config.usePagination) {
|
|
navigator.init('[component="category/topic"]', ajaxify.data.topic_count, Category.toTop, Category.toBottom);
|
|
} else {
|
|
navigator.disable();
|
|
}
|
|
|
|
handleScrollToTopicIndex();
|
|
|
|
handleIgnoreWatch(cid);
|
|
|
|
handleLoadMoreSubcategories();
|
|
|
|
categorySelector.init($('[component="category-selector"]'), {
|
|
privilege: 'find',
|
|
parentCid: ajaxify.data.cid,
|
|
onSelect: function (category) {
|
|
ajaxify.go('/category/' + category.cid);
|
|
},
|
|
});
|
|
|
|
hooks.fire('action:topics.loaded', { topics: ajaxify.data.topics });
|
|
hooks.fire('action:category.loaded', { cid: ajaxify.data.cid });
|
|
};
|
|
|
|
function handleScrollToTopicIndex() {
|
|
let topicIndex = ajaxify.data.topicIndex;
|
|
if (topicIndex && utils.isNumber(topicIndex)) {
|
|
topicIndex = Math.max(0, parseInt(topicIndex, 10));
|
|
if (topicIndex && window.location.search.indexOf('page=') === -1) {
|
|
navigator.scrollToElement($('[component="category/topic"][data-index="' + topicIndex + '"]'), true, 0);
|
|
}
|
|
}
|
|
}
|
|
|
|
function handleIgnoreWatch(cid) {
|
|
$('[component="category/watching"], [component="category/ignoring"], [component="category/notwatching"]').on('click', function () {
|
|
const $this = $(this);
|
|
const state = $this.attr('data-state');
|
|
|
|
socket.emit('categories.setWatchState', { cid: cid, state: state }, function (err) {
|
|
if (err) {
|
|
return alerts.error(err);
|
|
}
|
|
|
|
$('[component="category/watching/menu"]').toggleClass('hidden', state !== 'watching');
|
|
$('[component="category/watching/check"]').toggleClass('fa-check', state === 'watching');
|
|
|
|
$('[component="category/notwatching/menu"]').toggleClass('hidden', state !== 'notwatching');
|
|
$('[component="category/notwatching/check"]').toggleClass('fa-check', state === 'notwatching');
|
|
|
|
$('[component="category/ignoring/menu"]').toggleClass('hidden', state !== 'ignoring');
|
|
$('[component="category/ignoring/check"]').toggleClass('fa-check', state === 'ignoring');
|
|
|
|
alerts.success('[[category:' + state + '.message]]');
|
|
});
|
|
});
|
|
}
|
|
|
|
function handleLoadMoreSubcategories() {
|
|
$('[component="category/load-more-subcategories"]').on('click', function () {
|
|
const btn = $(this);
|
|
socket.emit('categories.loadMoreSubCategories', {
|
|
cid: ajaxify.data.cid,
|
|
start: ajaxify.data.nextSubCategoryStart,
|
|
}, function (err, data) {
|
|
if (err) {
|
|
return alerts.error(err);
|
|
}
|
|
btn.toggleClass('hidden', !data.length || data.length < ajaxify.data.subCategoriesPerPage);
|
|
if (!data.length) {
|
|
return;
|
|
}
|
|
app.parseAndTranslate('category', 'children', { children: data }, function (html) {
|
|
html.find('.timeago').timeago();
|
|
$('[component="category/subcategory/container"]').append(html);
|
|
utils.makeNumbersHumanReadable(html.find('.human-readable-number'));
|
|
ajaxify.data.nextSubCategoryStart += ajaxify.data.subCategoriesPerPage;
|
|
ajaxify.data.subCategoriesLeft -= data.length;
|
|
btn.toggleClass('hidden', ajaxify.data.subCategoriesLeft <= 0)
|
|
.translateText('[[category:x-more-categories, ' + ajaxify.data.subCategoriesLeft + ']]');
|
|
});
|
|
});
|
|
return false;
|
|
});
|
|
}
|
|
|
|
Category.toTop = function () {
|
|
navigator.scrollTop(0);
|
|
};
|
|
|
|
Category.toBottom = function () {
|
|
socket.emit('categories.getTopicCount', ajaxify.data.cid, function (err, count) {
|
|
if (err) {
|
|
return alerts.error(err);
|
|
}
|
|
|
|
navigator.scrollBottom(count - 1);
|
|
});
|
|
};
|
|
|
|
function loadTopicsAfter(after, direction, callback) {
|
|
callback = callback || function () {};
|
|
|
|
hooks.fire('action:topics.loading');
|
|
const params = utils.params();
|
|
infinitescroll.loadMore('categories.loadMore', {
|
|
cid: ajaxify.data.cid,
|
|
after: after,
|
|
direction: direction,
|
|
query: params,
|
|
categoryTopicSort: config.categoryTopicSort,
|
|
}, function (data, done) {
|
|
hooks.fire('action:topics.loaded', { topics: data.topics });
|
|
callback(data, done);
|
|
});
|
|
}
|
|
|
|
return Category;
|
|
});
|