I’d like to find a way to default the view for all users to display “none” rather than “all” subcategories, when in a category. “all” would be an option they could select. Is there any way to achieve this?
Generally, my community is finding “none” as an option to select unintuitive.
No - that’s totally different. When you display subcategories it looks more like a categories page. I like the list of topics, but just want to see the list of topics for the category (none), not for the category plus subcategories (all).
Fixed it via JS. You have to add this code to your head.
// For categories list
$(document).on('mouseover', 'td.category div.pull-left a', function() {
// do it only once
if ($(this).hasClass('link-fixed')) {
return;
}
// do it only if there's subcategories
if ($(this).parents('td.category').find('div.subcategories').length) {
var link = $(this).prop('href');
$(this).prop('href', link+'/none');
}
$(this).addClass('link-fixed');
});
// For dropdowns
$(document).on('click', 'ol.category-breadcrumb li', function() {
// do it only once
if ($(this).hasClass('links-fixed')) {
return;
}
// do it only for first dropdown
$(this).addClass('list-clicked');
if (!$('ol.category-breadcrumb li').slice(0, 1).hasClass('list-clicked')) {
$(this).removeClass('list-clicked');
return;
}
$(this).removeClass('list-clicked');
// you can't check subcategories from here, so doing it for all
$(this).find('section.category-dropdown-menu div.cat a').each(function() {
if (!$(this).hasClass('home')) {
var link = $(this).prop('href');
$(this).prop('href', link+'/none');
}
});
$(this).addClass('links-fixed');
});
// For breadcrumbs when reading a topic
$(document).on('mouseover', '.title-wrapper .ember-view a', function() {
// do it only once
if ($(this).hasClass('link-fixed')) {
return;
}
// do it only for first button
$(this).addClass('list-clicked');
if (!$('.title-wrapper .ember-view a').slice(0, 1).hasClass('list-clicked')) {
$(this).removeClass('list-clicked');
return;
}
$(this).removeClass('list-clicked');
var link = $(this).prop('href');
$(this).prop('href', link+'/none');
$(this).addClass('link-fixed');
});
I don’t think this will work on phones. There’s probably no such events as “mouseover”.
Wanted to say thanks for the JS fix Maestra, and make a small contribution:
The above JS works 99% of the time, but a user found that when they clicked on the little unread notification in the categories list, it took them to a page that doesn’t exist. E.g., for meta.discourse.org they’d end up here: https://meta.discourse.org/c/feature/l/unread/none.
The minor edit I used to fix this is to slap the following at the top of your first section of code for the categories list, right after the if: ‘link-fixed’ bit.
var ignore = /(unread|new|top)/
//ignore unread, new, top links
if(ignore.test(this.getAttribute('href'))){
return;
}
The ‘top’ part might not be necessary in retrospect, but whatever it doesn’t hurt anything.
edit - I suppose more sophisticated regex might be in order if one of your categories has “new”, “unread”, or “top” in the name, though.
For me the first part for the category list did not work. so here is my solution.
$(document).ready(function() {
// do it only once
$('td.category .ember-view a').each(function() {
if ($(this).hasClass('link-fixed')) {
return;
}
// do it only if there's subcategories
if ($(this).parents('td.category').find('div.subcategories').length) {
var link = $(this).prop('href');
$(this).prop('href', link+'/none');
}
$(this).addClass('link-fixed');
});
});
We’re using subcategories for discussions in different languages (one for English, one for Spanish etc.) so seeing a list of discussions in different languages on the parent category page is a bit confusing for people.
It would be really useful to be able to have ‘None’ as the default view for the category page (as in screenshot below) instead of ‘all in [category name]’
We’re on a hosted instance of Discourse, so unfortunately don’t have access to the source code. We’ll keep using the Javascript workarounds from above; they’re great, but we haven’t found a way to solve the issue described by Cataldo.
And that will give you the desired result for that category - the topic list for that category will only show topics in the parent category and will ignore topics in subcategories.
If you want other category pages to have the same behavior, repeat the process for those categories. Like I mentioned above. This is a per-category setting.