Skip to content

Commit 936d9e0

Browse files
committed
Merge branch 'hide-changelog-sections' into 'master'
added a "hide sections" switch for changelog pages See merge request CodeScoring/docs!649
2 parents 269fa00 + aaf385e commit 936d9e0

5 files changed

Lines changed: 216 additions & 2 deletions

File tree

docs/changelog/on-premise-changelog.en.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -572,7 +572,7 @@ hide:
572572

573573
- Changed the version of the osa-api Alpine base image from 3.21 to 3.20 to support the latest versions of Dynatrace monitoring
574574

575-
### Fixed
575+
#### Fixed
576576

577577
- Fixed the lack of policy alerts in the PDF report download for the first SCA scan
578578
- Optimized database queries when calculating policy ignores

docs/changelog/on-premise-changelog.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -573,7 +573,7 @@ hide:
573573

574574
- Изменена версия базового образа osa-api Alpine c 3.21 до 3.20 для поддержки мониторинга Dynatrace последних версий
575575

576-
### Исправлено
576+
#### Исправлено
577577

578578
- Исправлено отсутствие алертов политик в выгрузке PDF-отчета по первому SCA-сканированию
579579
- Оптимизированы запросы к базе данных при рассчете игноров политик

docs/js/changelog-toc.js

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
(function () {
2+
function isChangelogPage() {
3+
const path = location.pathname || "";
4+
return /\/changelog\//.test(path);
5+
}
6+
7+
function getLang() {
8+
return /\.en\//.test(location.pathname) ? "en" : "ru";
9+
}
10+
11+
function initToggle() {
12+
if (!isChangelogPage()) return;
13+
14+
const toc = document.querySelector('.md-sidebar--secondary .md-nav--secondary');
15+
if (!toc) return;
16+
17+
const title = toc.querySelector('.md-nav__title');
18+
if (!title) return;
19+
20+
if (toc.querySelector('.cs-toc-toggle')) return;
21+
22+
const root = document.documentElement;
23+
const lang = getLang();
24+
25+
const btn = document.createElement('button');
26+
btn.type = 'button';
27+
btn.className = 'cs-toc-toggle';
28+
btn.setAttribute('aria-expanded', 'true');
29+
btn.setAttribute('aria-label', lang === 'en' ? 'Hide sections' : 'Скрыть секции');
30+
btn.innerHTML = '<span class="cs-toc-toggle__thumb" aria-hidden="true"></span>';
31+
32+
let tooltipEl = null;
33+
let tooltipText = lang === 'en' ? 'Hide\nsections' : 'Скрыть\nсекции';
34+
35+
function positionTooltip() {
36+
if (!tooltipEl) return;
37+
const rect = btn.getBoundingClientRect();
38+
const top = rect.top + rect.height / 2 - tooltipEl.offsetHeight / 2;
39+
const left = rect.right + 8;
40+
tooltipEl.style.top = `${Math.max(8, top)}px`;
41+
tooltipEl.style.left = `${left}px`;
42+
}
43+
44+
function showTooltip() {
45+
if (tooltipEl) return;
46+
tooltipEl = document.createElement('div');
47+
tooltipEl.className = 'cs-toc-tooltip';
48+
tooltipEl.textContent = tooltipText;
49+
document.body.appendChild(tooltipEl);
50+
positionTooltip();
51+
// Keep tooltip aligned on scroll/resize while hovering.
52+
window.addEventListener('scroll', positionTooltip, true);
53+
window.addEventListener('resize', positionTooltip);
54+
}
55+
56+
function hideTooltip() {
57+
if (!tooltipEl) return;
58+
tooltipEl.remove();
59+
tooltipEl = null;
60+
window.removeEventListener('scroll', positionTooltip, true);
61+
window.removeEventListener('resize', positionTooltip);
62+
}
63+
64+
btn.addEventListener('mouseenter', showTooltip);
65+
btn.addEventListener('focus', showTooltip);
66+
btn.addEventListener('mouseleave', hideTooltip);
67+
btn.addEventListener('blur', hideTooltip);
68+
69+
btn.addEventListener('click', () => {
70+
const collapsed = root.classList.toggle('cs-changelog-toc-collapsed');
71+
btn.classList.toggle('is-collapsed', collapsed);
72+
btn.setAttribute('aria-expanded', String(!collapsed));
73+
btn.setAttribute('aria-label', collapsed
74+
? (lang === 'en' ? 'Show sections' : 'Показать секции')
75+
: (lang === 'en' ? 'Hide sections' : 'Скрыть секции'));
76+
tooltipText = collapsed
77+
? (lang === 'en' ? 'Show\nsections' : 'Показать\nсекции')
78+
: (lang === 'en' ? 'Hide\nsections' : 'Скрыть\nсекции');
79+
if (tooltipEl) {
80+
tooltipEl.textContent = tooltipText;
81+
positionTooltip();
82+
}
83+
});
84+
85+
title.classList.add('cs-toc-title');
86+
title.appendChild(btn);
87+
}
88+
89+
if (document.readyState === 'loading') {
90+
document.addEventListener('DOMContentLoaded', initToggle);
91+
} else {
92+
initToggle();
93+
}
94+
})();

docs/stylesheets/extra.css

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,123 @@ body:not(.is-home) .md-content__inner {
206206
text-decoration: none !important;
207207
}
208208

209+
/* Changelog TOC toggle */
210+
.cs-toc-title {
211+
display: inline-flex;
212+
align-items: center;
213+
gap: 0.25rem;
214+
overflow: visible;
215+
position: relative;
216+
}
217+
218+
.md-nav__title.cs-toc-title {
219+
overflow: visible;
220+
}
221+
222+
.md-sidebar--secondary .md-nav--secondary {
223+
overflow: visible;
224+
}
225+
226+
.cs-toc-toggle {
227+
display: inline-flex;
228+
align-items: center;
229+
justify-content: flex-start;
230+
width: 24px;
231+
height: 10px;
232+
padding: 1px;
233+
border-radius: 999px;
234+
border: 1px solid rgba(255, 255, 255, 0.28);
235+
background: rgba(255, 255, 255, 0.12);
236+
cursor: pointer;
237+
position: relative;
238+
z-index: 2;
239+
pointer-events: auto;
240+
transition: background 0.2s ease, border-color 0.2s ease;
241+
}
242+
243+
.cs-toc-toggle__thumb {
244+
width: 6px;
245+
height: 6px;
246+
border-radius: 999px;
247+
background: #d6d6d6;
248+
transition: transform 0.2s ease, background 0.2s ease;
249+
}
250+
251+
.cs-toc-toggle:hover {
252+
background: rgba(255, 255, 255, 0.28);
253+
border-color: rgba(255, 255, 255, 0.5);
254+
}
255+
256+
.cs-toc-toggle:hover .cs-toc-toggle__thumb {
257+
background: #ffffff;
258+
}
259+
260+
.cs-toc-toggle.is-collapsed {
261+
background: rgba(255, 61, 108, 0.22);
262+
border-color: rgba(255, 61, 108, 0.9);
263+
box-shadow: inset 0 0 0 1px rgba(255, 61, 108, 0.12);
264+
}
265+
266+
.cs-toc-toggle.is-collapsed .cs-toc-toggle__thumb {
267+
transform: translateX(12px);
268+
background: #ffffff;
269+
}
270+
271+
.cs-toc-toggle.is-collapsed:hover {
272+
background: rgba(255, 61, 108, 0.32);
273+
border-color: #ff3d6c;
274+
}
275+
276+
.cs-toc-tooltip {
277+
position: fixed;
278+
padding: 0.25rem 0.5rem;
279+
border-radius: 6px;
280+
background: rgba(28, 29, 31, 0.95);
281+
color: #ffffff;
282+
font-size: 0.7rem;
283+
white-space: pre-line;
284+
line-height: 1.2;
285+
max-width: 90px;
286+
text-align: left;
287+
z-index: 1000;
288+
pointer-events: none;
289+
}
290+
291+
/* Hide nested TOC levels when collapsed (keep versions only) */
292+
.cs-changelog-toc-collapsed .md-sidebar--secondary .md-nav--secondary > .md-nav__list > .md-nav__item > .md-nav {
293+
display: none;
294+
}
295+
296+
.cs-changelog-toc-collapsed .md-sidebar--secondary .md-nav__list .md-nav__list {
297+
display: none;
298+
}
299+
300+
/* Normalize spacing for versions list when sections are hidden */
301+
.cs-changelog-toc-collapsed .md-sidebar--secondary .md-nav--secondary > .md-nav__list {
302+
padding-top: 0.2rem;
303+
}
304+
305+
.cs-changelog-toc-collapsed .md-sidebar--secondary .md-nav--secondary > .md-nav__list > .md-nav__item {
306+
margin: 0 !important;
307+
padding: 0 !important;
308+
}
309+
310+
.cs-changelog-toc-collapsed .md-sidebar--secondary .md-nav--secondary > .md-nav__list > .md-nav__item + .md-nav__item {
311+
margin-top: 0.45rem !important;
312+
}
313+
314+
.cs-changelog-toc-collapsed .md-sidebar--secondary .md-nav--secondary > .md-nav__list > .md-nav__item > .md-nav__link {
315+
margin: 0 !important;
316+
padding-top: 0.2rem !important;
317+
padding-bottom: 0.2rem !important;
318+
line-height: 1.35 !important;
319+
display: block;
320+
}
321+
322+
.cs-changelog-toc-collapsed .md-sidebar--secondary .md-nav--secondary > .md-nav__list > .md-nav__item > .md-nav__link .md-ellipsis {
323+
display: block;
324+
}
325+
209326
.md-nav__link:hover,
210327
.md-nav__item .md-nav__link:hover {
211328
text-decoration: underline !important;

mkdocs.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -767,8 +767,11 @@ extra_css:
767767
extra_javascript:
768768
- js/search.js
769769
- js/home.js
770+
- js/feedback.js
771+
- js/changelog-toc.js
770772

771773
extra:
774+
feedback_endpoint: "https://script.google.com/macros/s/AKfycbwK-c3VzYAAMBxg85FKaoA99EL32Lh-3-Bkcr1tWJUyRiVycR4K0r3qy4z0XnT6fpqicg/exec"
772775
social:
773776
- icon: fontawesome/brands/youtube
774777
link: https://www.youtube.com/@codescoring

0 commit comments

Comments
 (0)