diff --git a/module.json b/module.json
index 383b0f4..3a859e4 100644
--- a/module.json
+++ b/module.json
@@ -2,7 +2,7 @@
"id": "kosmos-storage-audit",
"title": "Kosmos Storage Audit",
"description": "Analyzes media references and risky storage locations across Foundry data and public roots.",
- "version": "0.0.10",
+ "version": "0.0.11",
"compatibility": {
"minimum": "13",
"verified": "13"
diff --git a/scripts/apps/audit-report-app.js b/scripts/apps/audit-report-app.js
index b6891ff..9eda157 100644
--- a/scripts/apps/audit-report-app.js
+++ b/scripts/apps/audit-report-app.js
@@ -442,7 +442,7 @@ function groupByTarget(findings) {
current.count += 1;
if (finding.severity === "high") current.severity = "high";
if (finding.source?.sourceLabel) {
- const key = finding.source.sourceUuid ?? finding.source.sourceLabel;
+ const key = buildSourceKey(finding.source);
current.sources.set(key, {
sourceLabel: finding.source.sourceLabel,
sourceName: finding.source.sourceName ?? null,
@@ -553,7 +553,7 @@ function renderLocalizedCodeText(key, data, codeValues) {
function renderSourceLink(source) {
const trail = Array.isArray(source.sourceTrail) && source.sourceTrail.length ? source.sourceTrail : null;
if (trail) {
- return trail.map(renderTrailNode).join(' -> ');
+ return `${trail.map(renderTrailNode).join('->')}`;
}
const label = source.sourceName ? `${source.sourceLabel} (${source.sourceName})` : source.sourceLabel;
@@ -583,3 +583,10 @@ function renderTrailNode(node) {
function renderUuidLink(uuid, label) {
return `${escapeHtml(label)}`;
}
+
+function buildSourceKey(source) {
+ const trailKey = Array.isArray(source.sourceTrail) && source.sourceTrail.length
+ ? source.sourceTrail.map(node => node.uuid ?? node.label ?? "").join(">")
+ : "";
+ return `${source.sourceUuid ?? ""}|${trailKey}|${source.sourceLabel ?? ""}`;
+}
diff --git a/styles/audit.css b/styles/audit.css
index 08321d9..c1a30bf 100644
--- a/styles/audit.css
+++ b/styles/audit.css
@@ -277,9 +277,19 @@
overflow-wrap: anywhere;
}
+.storage-audit__trail {
+ display: inline-flex;
+ align-items: center;
+ flex-wrap: wrap;
+ gap: 0.2rem;
+}
+
+.storage-audit__trail .content-link {
+ white-space: nowrap;
+}
+
.storage-audit__trail-separator {
opacity: 0.65;
- margin: 0 0.25rem;
}
@media (max-width: 1100px) {