Skip to content

Commit d370d36

Browse files
committed
feat: Implement collapsible sections for scan configuration and language selection in UI
1 parent 3b545af commit d370d36

File tree

1 file changed

+57
-12
lines changed

1 file changed

+57
-12
lines changed

src/providers/uiProvider.ts

Lines changed: 57 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2499,9 +2499,10 @@ export class UiProvider implements vscode.WebviewViewProvider {
24992499
</div>
25002500
</div>
25012501
2502-
<div class="section">
2503-
<h3>🔍 Scan Configuration</h3>
2504-
<div class="form-group">
2502+
<div class="section" id="scan-configuration">
2503+
<h3 class="collapsible-header collapsed" onclick="toggleScanConfigSection()">🔍 Scan Configuration <span class="toggle-icon">▼</span></h3>
2504+
<div id="scan-config-content" class="collapsible-content collapsed">
2505+
<div class="form-group">
25052506
<label for="suites">Query Suite:</label>
25062507
<div id="suitesContainer">
25072508
<div class="suite-radio">
@@ -2550,10 +2551,12 @@ export class UiProvider implements vscode.WebviewViewProvider {
25502551
</div>
25512552
<div class="help-text">Select the threat model to focus the analysis on specific security scenarios</div>
25522553
</div>
2554+
</div>
25532555
</div>
2554-
<div class="section scan-section">
2555-
<h3>🔤 Language Selection</h3>
2556-
<div class="form-group">
2556+
<div class="section" id="languages-selection">
2557+
<h3 class="collapsible-header collapsed" onclick="toggleLanguageSection()">🔤 Language Selection <span class="toggle-icon">▼</span></h3>
2558+
<div id="language-content" class="collapsible-content collapsed">
2559+
<div class="form-group">
25572560
<label for="languages">Programming Languages:</label>
25582561
<div id="languagesContainer">
25592562
<div id="languagesList" style="display: none;">
@@ -2567,6 +2570,7 @@ export class UiProvider implements vscode.WebviewViewProvider {
25672570
</div>
25682571
</div>
25692572
<div class="help-text">Select the programming languages to analyze. Languages are auto-detected from your CodeQL CLI installation.</div>
2573+
</div>
25702574
</div>
25712575
</div>
25722576
</div>
@@ -2855,10 +2859,17 @@ export class UiProvider implements vscode.WebviewViewProvider {
28552859
28562860
// Get references to the sections we need to show/hide
28572861
const scanSettings = document.getElementById('scanSettings');
2862+
const securityDashboard = document.getElementById('summarySection');
2863+
const scanConfiguration = document.getElementById('scan-configuration');
2864+
const scanConfigContent = document.getElementById('scan-config-content');
2865+
const scanConfigHeader = document.querySelector('#scan-configuration h3');
2866+
const languageSection = document.getElementById('languages-selection');
2867+
const languageContent = document.getElementById('language-content');
2868+
const languageHeader = document.querySelector('#languages-selection h3');
28582869
28592870
if (success) {
28602871
if (enabled) {
2861-
// CodeQL is enabled - collapse the repository section
2872+
// CodeQL is enabled
28622873
statusMessage.style.backgroundColor = 'rgba(40, 167, 69, 0.1)';
28632874
statusMessage.style.border = '1px solid #28a745';
28642875
statusMessage.style.color = '#28a745';
@@ -2870,19 +2881,27 @@ export class UiProvider implements vscode.WebviewViewProvider {
28702881
28712882
// Show all CodeQL-dependent sections
28722883
if (scanSettings) scanSettings.style.display = 'block';
2884+
if (securityDashboard) securityDashboard.style.display = 'block';
2885+
if (scanConfiguration) scanConfiguration.style.display = 'block';
2886+
if (languageSection) languageSection.style.display = 'block';
2887+
2888+
// Keep sections collapsed by default, but make them visible
2889+
if (scanConfigHeader) scanConfigHeader.classList.add('collapsed');
2890+
if (scanConfigContent) scanConfigContent.classList.add('collapsed');
2891+
if (languageHeader) languageHeader.classList.add('collapsed');
2892+
if (languageContent) languageContent.classList.add('collapsed');
28732893
} else {
2874-
// CodeQL is not enabled - expand the repository section
2894+
// CodeQL is not enabled
28752895
statusMessage.style.backgroundColor = 'rgba(255, 193, 7, 0.1)';
28762896
statusMessage.style.border = '1px solid #ffc107';
28772897
statusMessage.style.color = '#ffc107';
28782898
statusMessage.innerHTML = '⚠️ ' + message + '<br><small>You must enable CodeQL in repository settings before scanning.</small>';
28792899
2880-
// Expand the repository section to allow user to fix configuration
2881-
if (repoHeader) repoHeader.classList.remove('collapsed');
2882-
if (repoContent) repoContent.classList.remove('collapsed');
2883-
28842900
// Hide CodeQL-dependent sections
28852901
if (scanSettings) scanSettings.style.display = 'none';
2902+
if (securityDashboard) securityDashboard.style.display = 'none';
2903+
if (scanConfiguration) scanConfiguration.style.display = 'none';
2904+
if (languageSection) languageSection.style.display = 'none';
28862905
}
28872906
} else {
28882907
// Error checking CodeQL status
@@ -2891,6 +2910,12 @@ export class UiProvider implements vscode.WebviewViewProvider {
28912910
statusMessage.style.color = '#dc3545';
28922911
statusMessage.innerHTML = '❌ ' + message;
28932912
2913+
// Hide CodeQL-dependent sections on error
2914+
if (scanSettings) scanSettings.style.display = 'none';
2915+
if (securityDashboard) securityDashboard.style.display = 'none';
2916+
if (scanConfiguration) scanConfiguration.style.display = 'none';
2917+
if (languageSection) languageSection.style.display = 'none';
2918+
28942919
// Expand the repository section to allow user to fix configuration
28952920
if (repoHeader) repoHeader.classList.remove('collapsed');
28962921
if (repoContent) repoContent.classList.remove('collapsed');
@@ -2931,6 +2956,26 @@ export class UiProvider implements vscode.WebviewViewProvider {
29312956
}
29322957
}
29332958
2959+
function toggleScanConfigSection() {
2960+
const configHeader = document.querySelector('#scan-configuration h3');
2961+
const configContent = document.getElementById('scan-config-content');
2962+
2963+
if (configHeader && configContent) {
2964+
configHeader.classList.toggle('collapsed');
2965+
configContent.classList.toggle('collapsed');
2966+
}
2967+
}
2968+
2969+
function toggleLanguageSection() {
2970+
const langHeader = document.querySelector('#languages-selection h3');
2971+
const langContent = document.getElementById('language-content');
2972+
2973+
if (langHeader && langContent) {
2974+
langHeader.classList.toggle('collapsed');
2975+
langContent.classList.toggle('collapsed');
2976+
}
2977+
}
2978+
29342979
function runLocalScan() {
29352980
const scanButton = document.getElementById('scanButton');
29362981
scanButton.disabled = true;

0 commit comments

Comments
 (0)