Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
3177c6e
docs: redesign documentation site UI
devGregA Jul 10, 2026
8e0c27e
docs: fix active nav link contrast on navy header
devGregA Jul 10, 2026
a66e679
docs: remove baked-in canvas from dark-mode logo
devGregA Jul 10, 2026
54c60f8
stop os/pro switch flicker on page load
paulOsinski Jul 10, 2026
a6119e5
docs: let hero search button take its accessible name from visible text
paulOsinski Jul 10, 2026
bf7b4d3
docs: fix sidebar clipping and focus-ring artifacts
devGregA Jul 10, 2026
716bd86
docs: keep breadcrumbs on a single line
devGregA Jul 10, 2026
7b8bdcb
Update versions in application files
Jul 13, 2026
1d67a44
Merge pull request #15231 from DefectDojo/master-into-bugfix/3.1.100-…
rossops Jul 13, 2026
1435d43
docs: add Pro changelog entry for 3.1.100
Maffooch Jul 14, 2026
5adc58d
Merge pull request #15237 from DefectDojo/docs/pro-changelog-3.1.100
paulOsinski Jul 14, 2026
f386e52
chore(deps): bump django from 5.2.14 to 5.2.15 (#15230)
dependabot[bot] Jul 14, 2026
031e965
docs: add ServiceDesk Plus to the Pro Integrations tool reference (#1…
devGregA Jul 14, 2026
f1484fd
docs: add Zendesk to the Pro Integrations tool reference (#15215)
devGregA Jul 14, 2026
7d8eb5d
feat(search): add DD_WATSON_SEARCH_ENABLED toggle to gate watson inde…
blakeaowens Jul 14, 2026
c39467a
Merge pull request #15214 from devGregA/devgrega/docs-redesign
paulOsinski Jul 14, 2026
d75300d
add OS Findings documentation (#15235)
dangoelz Jul 15, 2026
d0a25f3
docs: use "DefectDojo, Inc." consistently in company name references …
devGregA Jul 15, 2026
85780ab
fix(forms): avoid DB access at import time in Import/ReImport forms (…
Maffooch Jul 15, 2026
31f6ab3
docs: add PagerDuty to the Pro Integrations tool reference (#15210)
devGregA Jul 15, 2026
21a7254
fix(shell): silence the shell model auto-import banner (docker + manu…
Maffooch Jul 15, 2026
ddeef33
Update versions in application files
Jul 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion components/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "defectdojo",
"version": "3.1.100",
"version": "3.1.101",
"license": "BSD-3-Clause",
"private": true,
"dependencies": {
Expand Down
11 changes: 8 additions & 3 deletions docker/entrypoint-first-boot.sh
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/bin/bash
# called from entrypoint-initializer.sh when no admin user exists (first boot)
cat <<EOD | python manage.py shell
cat <<EOD | python manage.py shell --no-imports
import os
from django.contrib.auth.models import User
User.objects.create_superuser(
Expand All @@ -27,8 +27,13 @@ EOD
python3 manage.py loaddata "${i%.*}"
done

echo "Installing watson search index"
python3 manage.py installwatson
watson_enabled=$(echo "${DD_WATSON_SEARCH_ENABLED:-True}" | tr '[:upper:]' '[:lower:]')
if [ "$watson_enabled" != "false" ] && [ "$watson_enabled" != "0" ] && [ "$watson_enabled" != "off" ] && [ "$watson_enabled" != "no" ]; then
echo "Installing watson search index"
python3 manage.py installwatson
else
echo "Skipping watson search index (DD_WATSON_SEARCH_ENABLED=${DD_WATSON_SEARCH_ENABLED})"
fi

# surveys fixture needs to be modified as it contains an instance dependant polymorphic content id
echo "Migration of textquestions for surveys"
Expand Down
2 changes: 1 addition & 1 deletion docker/reach_database.sh
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ wait_for_database_to_be_reachable() {
exit 1
fi
done
cat <<EOD | python manage.py shell
cat <<EOD | python manage.py shell --no-imports
from django.db import connections
connections['default'].cursor()
EOD
Expand Down
Binary file added docs/assets/images/osfindings_ss1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/assets/images/osfindings_ss2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/assets/images/osfindings_ss3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/assets/images/osfindings_ss4.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/assets/images/osfindings_ss5.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/assets/images/osfindings_ss6.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/assets/images/osfindings_ss7.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
123 changes: 90 additions & 33 deletions docs/assets/js/custom.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,27 @@
// custom js


// version toggler
// Mobile navigation: the site sets doks.bootstrapJavascript = false, so no
// Bootstrap plugins load and the header's offcanvas toggles are dead markup.
// Importing the Offcanvas plugin evaluates its module, which registers the
// data-bs-toggle="offcanvas" click handling; the window reference keeps the
// import (and its side effects) from being tree-shaken.
import { Offcanvas } from 'bootstrap';

window.ddOffcanvas = Offcanvas;


// Edition toggler (Open Source / Pro)
//
// The sidebar renders both edition menus (.version-opensource / .version-pro).
// Which menu shows — and which segmented-control button reads as selected —
// is pure CSS keyed off html[data-dd-version] (see _custom.scss). An inline
// script in custom-head.html stamps that attribute from localStorage before
// first paint, so every page load renders the stored edition immediately with
// no hide-then-reveal flicker. This module only handles toggling: update the
// attribute, persist the choice, sync aria-checked for assistive tech.
(() => {
"use strict";

console.log("[VersionToggle] custom.js loaded");

// Asset-modelling landing pages per edition. The top nav is otherwise
// static, so a single URL can't be correct for both editions: we keep the
// "Model Your Assets" nav link in sync with the selected version, and —
Expand All @@ -28,30 +43,21 @@
};

const setVersion = (version) => {
console.log("[VersionToggle] Setting version to:", version);
// CSS shows the matching menu and highlights the matching button
document.documentElement.dataset.ddVersion = version;

document.querySelectorAll(".version-opensource, .version-pro").forEach(el => {
el.style.display = el.classList.contains(`version-${version}`) ? "block" : "none";
});

localStorage.setItem("version", version);
console.log("[VersionToggle] localStorage updated:", localStorage.getItem("version"));
try {
localStorage.setItem("version", version);
} catch (e) {
// Storage blocked (private browsing) — toggle still works this page
}

// Update dropdown
const selects = document.querySelectorAll("#version-select");
selects.forEach(sel => {
sel.value = version;
sel.dataset.version = version;
sel.style.visibility = "visible";
// aria-checked is for assistive tech only; visuals come from the
// html[data-dd-version] attribute above
document.querySelectorAll(".dd-version-seg button[data-version-value]").forEach(btn => {
btn.setAttribute("aria-checked", btn.dataset.versionValue === version ? "true" : "false");
});

// unhide sidebar after version is applied
const sidebar = document.querySelector(".docs-sidebar");
if (sidebar) {
sidebar.style.visibility = "visible";
console.log("[VersionToggle] Sidebar revealed");
}

// Edition-aware top nav: route "Model Your Assets" to the page that
// matches the selected version (see assetNavUrls above).
document.querySelectorAll("a.nav-link").forEach(link => {
Expand All @@ -62,19 +68,20 @@
};

const initVersionToggle = () => {
const storedVersion = localStorage.getItem("version") || "opensource";
console.log("[VersionToggle] Stored version:", storedVersion);
setVersion(storedVersion);
// custom-head.html already stamped the stored edition on <html> before
// paint; re-applying it here syncs aria-checked and the nav link on
// freshly parsed (or dynamically replaced) markup.
setVersion(document.documentElement.dataset.ddVersion || "opensource");
};

// Delegated listener on body
document.body.addEventListener("change", (e) => {
if (e.target && e.target.id === "version-select") {
console.log("[VersionToggle] Dropdown changed to:", e.target.value);
setVersion(e.target.value);
// Delegated listener on body — catches every control instance
document.body.addEventListener("click", (e) => {
const btn = e.target.closest("button[data-version-value]");
if (btn) {
setVersion(btn.dataset.versionValue);
// Only on an explicit user toggle (not on load) follow the page to
// the matching edition when viewing an asset-modelling page.
switchAssetPageForVersion(e.target.value);
switchAssetPageForVersion(btn.dataset.versionValue);
}
});

Expand All @@ -91,6 +98,56 @@
})();


// Code block language labels — stamp the fence language onto each
// expressive-code frame's (empty) title span so CSS can render it in the
// header band via attr(data-lang). Frames whose fence "language" is really
// an editor artifact (paths, line ranges) get a generic "code" label.
(() => {
"use strict";

const CLEAN_LANG = /^[a-z0-9_+#.-]{1,16}$/i;

const init = () => {
document.querySelectorAll(".docs-content .expressive-code .frame").forEach(frame => {
const title = frame.querySelector(".header .title");
if (!title || title.textContent.trim() !== "" || title.dataset.lang) return;
const code = frame.querySelector("pre code[data-lang]");
let lang = code ? code.dataset.lang : "";
if (!lang || lang === "fallback" || !CLEAN_LANG.test(lang)) lang = "code";
title.dataset.lang = lang;
frame.classList.add("dd-has-lang");
});
};

if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", init);
} else {
init();
}
})();


// Homepage hero search field — forwards to the DocSearch modal
(() => {
"use strict";

const init = () => {
const trigger = document.getElementById("ddHomeSearch");
if (!trigger) return;
trigger.addEventListener("click", () => {
const btn = document.getElementsByClassName("DocSearch-Button")[0];
if (btn) btn.click();
});
};

if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", init);
} else {
init();
}
})();


// Scroll progress bar — shows reading progress on doc pages
(() => {
"use strict";
Expand Down
Loading
Loading