2021-04-30 12:40:29 +02:00
|
|
|
(function ($) {
|
|
|
|
|
|
|
|
|
|
document.addEventListener('DOMContentLoaded', function () {
|
|
|
|
|
const content = document.getElementById('o_content');
|
|
|
|
|
|
2022-03-10 17:00:49 +00:00
|
|
|
let imageModalId = 0;
|
2021-04-30 12:40:29 +02:00
|
|
|
content.querySelectorAll('img').forEach(image => {
|
2022-03-10 17:00:49 +00:00
|
|
|
// Enforce the presence of the `img-fluid` class on all images.
|
2022-12-16 11:29:02 +01:00
|
|
|
image.classList.add('img-fluid', 'img-thumbnail');
|
2022-03-10 17:00:49 +00:00
|
|
|
|
2022-07-11 15:00:05 +00:00
|
|
|
// Add a modal to each image that does not explicitly block it and has no target.
|
|
|
|
|
if (!image.classList.contains('o-no-modal') && image.parentElement.tagName !== 'A') {
|
|
|
|
|
const modalContainer = document.createElement('div');
|
|
|
|
|
modalContainer.innerHTML = `<div class="modal fade" id="modal-${imageModalId}">
|
|
|
|
|
<div class="modal-dialog modal-dialog-centered">
|
|
|
|
|
<div class="modal-content">
|
2022-12-16 11:29:02 +01:00
|
|
|
<div class="modal-header">
|
2022-12-29 10:45:12 +01:00
|
|
|
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Close"></button>
|
2022-12-16 11:29:02 +01:00
|
|
|
</div>
|
2022-07-11 15:00:05 +00:00
|
|
|
<div class="modal-body">
|
2022-12-29 10:45:12 +01:00
|
|
|
<img src="${image.src}" alt="${image.alt}" class="o-no-modal img-fluid img-thumbnail"/>
|
2022-07-11 15:00:05 +00:00
|
|
|
</div>
|
|
|
|
|
</div>
|
2022-03-10 17:00:49 +00:00
|
|
|
</div>
|
|
|
|
|
</div>
|
2022-07-11 15:00:05 +00:00
|
|
|
`;
|
|
|
|
|
image.parentNode.append(modalContainer);
|
|
|
|
|
image.setAttribute('data-bs-toggle', 'modal');
|
|
|
|
|
image.setAttribute('data-bs-target', `#modal-${imageModalId}`);
|
|
|
|
|
imageModalId++;
|
|
|
|
|
}
|
2021-04-30 12:40:29 +02:00
|
|
|
});
|
2022-06-08 10:09:10 +00:00
|
|
|
|
|
|
|
|
// Make all external links open in a new tab by default.
|
|
|
|
|
content.querySelectorAll('a.external').forEach(externalLink => {
|
|
|
|
|
externalLink.setAttribute('target', '_blank');
|
2023-06-06 15:14:32 +02:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
let canAccessAllL1Toctrees = true; // Whether all direct children have a ref.
|
|
|
|
|
const toctreeWrapper = document.querySelector('.toctree-wrapper');
|
|
|
|
|
toctreeWrapper?.querySelectorAll('.toctree-l1').forEach(l1Toctree => {
|
|
|
|
|
// Flag L2 toctrees that have L3 children.
|
|
|
|
|
if (l1Toctree.querySelector('.toctree-l3')) {
|
|
|
|
|
l1Toctree.querySelectorAll('.toctree-l2').forEach (l2Toctree => {
|
|
|
|
|
l2Toctree.classList.add('o_toc_contains_l3');
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
if (l1Toctree.querySelector('a').getAttribute('href') === '#') {
|
|
|
|
|
canAccessAllL1Toctrees = false;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
if (canAccessAllL1Toctrees) {
|
|
|
|
|
// Use the style of L2 toctrees on L1 toctrees.
|
|
|
|
|
toctreeWrapper?.classList.add('o_toc_l1_to_l2');
|
|
|
|
|
}
|
2021-04-30 12:40:29 +02:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
})();
|