Here’s another example that I hope will be helpful to someone, based heavily off the above examples. This code doesn’t add an entirely new section, but instead adds additional links to the bottom of the “More” panel in the Community section (but before the FAQ and About links in the footer). It supports FontAwesome icons (assuming they’re added in the site settings) and external links. It handles edge cases where the sidebar is closed and re-opened, and/or the Community section is collapsed and re-expanded. It works on desktop and mobile.
I’m hardly a JavaScript expert, so I apologize for any bad or non-optimal code. On my site, at least, it seems to work as intended.
Just toss this code into the Header tab of a theme component and customize as needed:
<script>
const links = [
// FontAwesome icons may need to be added in the site settings if they don't correctly appear
{ title: "My Account", src: "/my/billing/subscriptions", icon: "file-invoice-dollar" },
{ title: "User Directory", src: "/u?asc=true&cards=yes&order=username&period=all", icon: "address-book" },
{ title: "Docs", src: "/docs", icon: "book-reader" },
{ title: "External Site", src: "https://google.com/", icon: "globe" }
]
$(document).ready(function () {
if (document.getElementById("toggle-hamburger-menu")) {
// We're in mobile view
addToggleListener(document.getElementById("toggle-hamburger-menu"))
} else {
// We're in desktop view
addToggleListener(document.getElementsByClassName("btn-sidebar-toggle")[0])
addHeaderListener()
addMoreListener()
}
function addToggleListener(toggleEl) {
if (toggleEl) {
toggleEl.addEventListener("click", function () {
// Wait a bit for the sidebar to load
setTimeout(function() {
let sidebar = document.getElementsByClassName("sidebar-section-header").length
if (sidebar) {
addHeaderListener()
addMoreListener()
}
}, 100)
})
}
}
function addHeaderListener() {
let communityHeader = document.getElementsByClassName("sidebar-section-header")[0]
if (communityHeader) {
communityHeader.addEventListener("click", function () {
// Wait a bit for the section to expand
setTimeout(function() {
let communitySection = document.getElementById("sidebar-section-content-community")
if (communitySection) {
addMoreListener()
}
}, 100)
})
}
}
function addMoreListener() {
let buttonMore = document.getElementsByClassName("sidebar-more-section-links-details")[0]
if (buttonMore) {
buttonMore.addEventListener("click", addCustomLinks)
}
}
function addCustomLinks() {
// Wait a bit until navigation has been loaded
setTimeout(function () {
const parentEl = document.getElementsByClassName("sidebar-more-section-links-details-content-main")[0]
let linksAlreadyAdded = document.getElementsByClassName("sidebar-section-custom-link").length
if (parentEl && !linksAlreadyAdded) {
links.filter(function (link) {
let linkDiv = document.createElement("li")
let linkTitleTrim = link.title.replace(/\s+/g, '')
linkDiv.className = "sidebar-section-link-wrapper sidebar-section-custom-link"
linkDiv.innerHTML = `<a href="${link.src}" class="sidebar-section-link sidebar-section-link-everything sidebar-row ember-view">
<span class="sidebar-section-link-prefix icon" id="link_${linkTitleTrim}"></span>
<span class="sidebar-section-link-content-text"> ${link.title} </span>
</a>
`
parentEl.append(linkDiv)
let linkIcon = document.getElementById("link_" + linkTitleTrim)
if (linkIcon && link.icon) {
linkIcon.innerHTML = `<svg viewBox="0 0 640 512" class="fa d-icon svg-icon prefix-icon svg-string d-icon-${link.icon}" xmlns="http://www.w3.org/2000/svg">
<use xlink:href="#${link.icon}"></use>
</svg>
`
}
})
}
}, 100)
}
})
</script>