DiscoTOC - automatic table of contents

Can you post a link to your site? I suspect the issue is due to styling in your theme.

2 Likes

Here My link:

https://whois.nhachinhchu.org/t/bang-gia-xem-data-nha-chinh-chu/63389

1 Like

Sorry to the interrupt the ongoing discussion. Found something that Iā€™m not sure if it has been reported already.

If the post has a link on a header, the number of clicks is also shown on the TOC entry:

image

image

2 Likes

Since this update, Iā€™m seeing an error on discourse-docs pages that have a table of contents. For example, on this page on Meta, the ToC isnā€™t displayed, and I see an error in my browser dev tools:

On my site, I also see a banner at the top of the page saying ā€œPosts may not display correctly because one of the post content decorators on your site raised an error. Check the browser developer tools for more information.ā€

3 Likes

Thanks @simonk, I just (2 minutes ago!) merged a fix for that issue. Please update the component on your site, and let me know if the banner on your own site is persisting.

3 Likes

Thanks for the reply! The error is gone, but the ToC is not displayed within the discourse-docs version of the page. Before yesterdayā€™s update, the ToC was displayed on the discourse-docs version of the page as well as the ā€œnormalā€ version.

(This isnā€™t urgent for me - I deployed the update on a staging site, not production, so it doesnā€™t matter that itā€™s not working properly)

Edit: Iā€™m running 2.8.0.beta11 (42c71789f9), if that makes any difference.

2 Likes

Yeah, I see what you mean. Unfortunately, my changes to TOC use an outlet in the topic view that is missing in docs. Will look into it.

3 Likes

Made a few more changes to the component today, they should address the issues raised by @mentalstring and @simonk. In your case, Simon, you need a full rebuild because you need to pull an update to the docs plugin as well.

@huynhthai824 itā€™s very likely that your issue will be fixed once you update the component.

4 Likes

Tks so much, Iā€™m so happy, My issue is solve.
Thank againā€¦

1 Like

After a full rebuild, I can confirm that the ToC appears correctly on the discourse-docs page - thanks a lot :+1:

I see youā€™ve also now restricted the ToC to 2 levels. Given the horizontal space, I think this is reasonable, but it means that third-level headings are displayed in the ToC at the same nesting level as their parents.

ie. at the moment, this text:

# First Heading
## First Subheading
### Child of First Subheading
### Child of First Subheading
## Second Subheading
### Child of Second Subheading
### Child of Second Subheading
# Second Heading

Produces this ToC:

image

I wonder if it would be better for third-level headings and below to be excluded from the ToC altogether?

Also, the DOM structure doesnā€™t look quite right - each second level item is a <ul> with a single <li> inside it:

image

4 Likes

Good catch. Iā€™m not sure how often we use 3+ levels, but itā€™s possible to reintroduce them, it shouldnā€™t be too complicated.

Good catch, again. This one was a small mistake, it should be fixed once this PR is merged.

3 Likes

If youā€™re in the mood for feature requests, perhaps the max depth could be controlled via a settingā€¦ :wink:

5 Likes

In my experience, the ToC feature only works on the first posting but not on subsequent postings. Is this correct? If so, could my remark be treated as a feature request therefore? BTW, the ToC, even on the first posting, is a really great addition.Ā R

Hello everyone, I have an issue since the last upgrade on this great theme component, but on mobile only. When I click on the table of contents button, the slider with the full toc is not opening.

If I use a very small window in Desktop, this button and slider works great. So it might be an issue on Android only.

Here is the log on my up-to-date (Discourse and TOC) forum:

Message

Uncaught TypeError: Cannot read properties of null (reading 'classList')
Url: https://iunctis.fr/theme-javascripts/671f772e071bd55050592ff8541b659afe421259.js?__ws=iunctis.fr
Line: 36
Column: 49
Window Location: https://iunctis.fr/t/le-mensuel-01-decembre-2021/9591

Backtrace

TypeError: Cannot read properties of null (reading 'classList')
    at n.showTOCOverlay (https://iunctis.fr/theme-javascripts/671f772e071bd55050592ff8541b659afe421259.js?__ws=iunctis.fr:36:49)
    at e.n._join (https://iunctis.fr/assets/vendor-96a5eaa8d436066b954c21ae5afb7f504310945c679465a2f1ba46b429a95edf.js:36:412333)
    at e.n.join (https://iunctis.fr/assets/vendor-96a5eaa8d436066b954c21ae5afb7f504310945c679465a2f1ba46b429a95edf.js:36:409358)
    at h (https://iunctis.fr/assets/vendor-96a5eaa8d436066b954c21ae5afb7f504310945c679465a2f1ba46b429a95edf.js:36:273784)
    at https://iunctis.fr/assets/vendor-96a5eaa8d436066b954c21ae5afb7f504310945c679465a2f1ba46b429a95edf.js:36:65110
    at a (https://iunctis.fr/assets/vendor-96a5eaa8d436066b954c21ae5afb7f504310945c679465a2f1ba46b429a95edf.js:36:260923)
    at https://iunctis.fr/assets/vendor-96a5eaa8d436066b954c21ae5afb7f504310945c679465a2f1ba46b429a95edf.js:36:65054
    at n._triggerAction (https://iunctis.fr/assets/application-945e3f0cb654a8c23b30e86f5e955be5599a8330d68ce75e97b8228ad45ff6fd.js:1:1254524)
    at n.click (https://iunctis.fr/assets/application-945e3f0cb654a8c23b30e86f5e955be5599a8330d68ce75e97b8228ad45ff6fd.js:1:1254160)

Env

HTTP HOSTS: iunctis.fr

If I use an android user agent in my firefox desktop version, I have this error if I click on the button in this forum:

Uncaught TypeError: document.querySelector(...) is null
    showTOCOverlay 4916e6ed2a984e00537fe797b799637f1a801ffe.js:374
    _join _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:4033
    join _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:3999
    p _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:2870
    An _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:1147
    o _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:2785
    An _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:1147
    _triggerAction _application-2646ad3bbed41e42bb77806dc41fbea2.js:489
    click _application-2646ad3bbed41e42bb77806dc41fbea2.js:488
    trigger _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:2560
    n _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:2422
    _run _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:4034
    _join _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:4033
    join _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:3999
    p _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:2870
    handleEvent _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:2574
    o _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:2785
    handleEvent _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:2574
    handleEvent _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:2499
    setupHandler _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:2524
    dispatch _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:347
    handle _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:342
    add _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:342
    Oe _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:339
    each _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:123
    each _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:116
    Oe _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:339
    on _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:358
    initialize _application-2646ad3bbed41e42bb77806dc41fbea2.js:3354
    initialize _application-2646ad3bbed41e42bb77806dc41fbea2.js:62
    runInstanceInitializers _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:2730
    each _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:4074
    walk _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:4064
    each _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:4056
    topsort _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:4056
    _runInitializer _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:2733
    runInstanceInitializers _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:2730
    _bootSync _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:2604
    didBecomeReady _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:2623
    invoke _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:3963
    flush _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:3955
    flush _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:3969
    _end _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:4032
    end _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:3988
    _run _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:4034
    _join _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:4033
    join _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:3999
    p _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:2870
    bind _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:2873
    u _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:272
    c _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:273
    setTimeout handler*a/< _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:274
    l _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:265
    fireWith _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:266
    fire _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:266
    l _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:265
    fireWith _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:266
    ready _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:283
    z _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:283
    EventListener.handleEvent* _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:283
    <anonymous> _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:109
    <anonymous> _vendor-64dba8b874ef11bbef3b2bce2fbcf6cc.js:109
4916e6ed2a984e00537fe797b799637f1a801ffe.js:374:18

On my phone, I have Chrome version 97.0.4692 if it helps

Am I the only one who experience this?

2 Likes

This is a recent regression due to a change in core, Iā€™ve got a fix ready in FIX: Restore outlet in mobile views by pmusaraj Ā· Pull Request #15683 Ā· discourse/discourse Ā· GitHub, once that is merged, you can rebuild your site and the issue should be fixed. Sorry about that.

Last week, I also added back the third indentation level for headings in the component, as mentioned by Simon above.

I am hesitating to add a setting here, the vast, vast majority of use-cases donā€™t need it. And, the component has classes for each level as well, so if you want to hide the 4th and 5th level, you can do so with this css:

li.d-toc-h4, li.d-toc-h5 {
  display:none;
}
7 Likes

Itā€™s merged and working fine, thanks!

5 Likes

I noticed that the <div data-theme-toc="true"> </div> at the top of a topic introduced extra margin. For example:

Iā€™ve added this to my theme, which seems to fix it:

// ToC elements at the top of the post introduce unwanted
// space. Discourse sets the top margin of the first child in the post
// to zero, but this doesn't work when the ToC is the first
// child. Instead we'll set the top margin of the element following
// the ToC to zero.
div[data-theme-toc="true"] + * {
    margin-top: 0px;
}

Perhaps something like that needs to be added to the component?

7 Likes

Good catch, Iā€™ve added that CSS rule in this PR: https://github.com/discourse/DiscoTOC/pull/30

4 Likes

I have addressed this issue in the past by moving the embed code to the bottom of the post. Does feel a bit hacky but it works.

1 Like

I have posts that have extra DIVs in their bodies. For example, On Storytelling - Public - Podcaster Community

The DIV which triggers the TOC generation is inside a DIVā€¦ and TOC notices that. But other headings, inside DIVs, donā€™t seem to get noticed by TOC.

ā€¦not the best screenshot. Thatā€™s an H2 in an arbitrary/just-for-styling DIV which does not appear in the TOC.

ā€¦not shown is the <div that triggers the TOC, which is inside the DIV with the crazy attribute/value pairā€¦


updated hours later to add: Maybe just ā€œ:scope h1,ā€ etc rather than requiring the headings be immediate children of the scope?

ā€¦also, this was mentioned in March '21, DiscoTOC - automatic table of contents - #255 by Ed_Bobkov

3 Likes