DEV: Introduce a service for storing data
This commit is contained in:
parent
61b867aa34
commit
16c0de60f5
|
@ -1,8 +1,11 @@
|
||||||
import Component from "@glimmer/component";
|
import Component from "@glimmer/component";
|
||||||
import { action } from "@ember/object";
|
import { action } from "@ember/object";
|
||||||
import { headerOffset } from "discourse/lib/offset-calculator";
|
import { headerOffset } from "discourse/lib/offset-calculator";
|
||||||
|
import { inject as service } from "@ember/service";
|
||||||
|
|
||||||
export default class TableOfContents extends Component {
|
export default class TableOfContents extends Component {
|
||||||
|
@service("tableOfContentsData") data;
|
||||||
|
|
||||||
@action
|
@action
|
||||||
scrollToBottom(e) {
|
scrollToBottom(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
import domUtils from "discourse-common/utils/dom-utils";
|
import domUtils from "discourse-common/utils/dom-utils";
|
||||||
import { headerOffset } from "discourse/lib/offset-calculator";
|
import { headerOffset } from "discourse/lib/offset-calculator";
|
||||||
import { later } from "@ember/runloop";
|
|
||||||
import { slugify } from "discourse/lib/utilities";
|
import { slugify } from "discourse/lib/utilities";
|
||||||
import { withPluginApi } from "discourse/lib/plugin-api";
|
import { withPluginApi } from "discourse/lib/plugin-api";
|
||||||
import { bind } from "discourse-common/utils/decorators";
|
import { bind } from "discourse-common/utils/decorators";
|
||||||
|
@ -10,6 +9,8 @@ export default {
|
||||||
|
|
||||||
initialize() {
|
initialize() {
|
||||||
withPluginApi("1.0.0", (api) => {
|
withPluginApi("1.0.0", (api) => {
|
||||||
|
this.tocService = api.container.lookup("service:table-of-contents-data");
|
||||||
|
|
||||||
api.decorateCookedElement(this.decorate, {
|
api.decorateCookedElement(this.decorate, {
|
||||||
id: "disco-toc",
|
id: "disco-toc",
|
||||||
onlyStream: true,
|
onlyStream: true,
|
||||||
|
@ -89,20 +90,8 @@ export default {
|
||||||
|
|
||||||
el.classList.add("d-toc-cooked");
|
el.classList.add("d-toc-cooked");
|
||||||
|
|
||||||
if (document.querySelector(".d-toc-wrapper")) {
|
this.buildTOC(Array.from(headings));
|
||||||
this.buildTOC(Array.from(headings));
|
document.addEventListener("click", this.clickTOC, false);
|
||||||
document.addEventListener("click", this.clickTOC, false);
|
|
||||||
} else {
|
|
||||||
// try again if decoration happens while outlet is not rendered
|
|
||||||
// this is due to core resetting `canRender` for topic-navigation
|
|
||||||
// when transitioning between topics
|
|
||||||
later(() => {
|
|
||||||
if (document.querySelector(".d-toc-wrapper")) {
|
|
||||||
this.buildTOC(Array.from(headings));
|
|
||||||
document.addEventListener("click", this.clickTOC, false);
|
|
||||||
}
|
|
||||||
}, 300);
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
updateTOCSidebar() {
|
updateTOCSidebar() {
|
||||||
|
@ -191,10 +180,10 @@ export default {
|
||||||
},
|
},
|
||||||
|
|
||||||
buildTOC(headings) {
|
buildTOC(headings) {
|
||||||
const toc = document.querySelector("#d-toc");
|
|
||||||
const primaryH = headings[0].tagName;
|
const primaryH = headings[0].tagName;
|
||||||
const primaryHeadings = headings.filter((n) => n.tagName === primaryH);
|
const primaryHeadings = headings.filter((n) => n.tagName === primaryH);
|
||||||
let nextIndex = headings.length;
|
let nextIndex = headings.length;
|
||||||
|
let result = "";
|
||||||
|
|
||||||
primaryHeadings.forEach((primaryHeading, index) => {
|
primaryHeadings.forEach((primaryHeading, index) => {
|
||||||
const ul = document.createElement("ul");
|
const ul = document.createElement("ul");
|
||||||
|
@ -224,10 +213,10 @@ export default {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
toc.appendChild(ul);
|
result += ul.outerHTML;
|
||||||
});
|
});
|
||||||
|
|
||||||
return toc;
|
this.tocService.html = result;
|
||||||
},
|
},
|
||||||
|
|
||||||
buildItem(node) {
|
buildItem(node) {
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
import Service from "@ember/service";
|
||||||
|
import { tracked } from "@glimmer/tracking";
|
||||||
|
|
||||||
|
export default class TableOfContentsData extends Service {
|
||||||
|
@tracked html = "";
|
||||||
|
}
|
|
@ -14,5 +14,6 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="d-toc">
|
<div id="d-toc">
|
||||||
|
{{{this.data.html}}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Reference in New Issue