auto-claude: subtask-4-2 - Add form sections 4-6 (Endpoints, Security, Backup & DR)

Added three new form sections to IT audit form:
- Section 4: Endpoints (Workstations) - device types, OS, MDM, encryption
- Section 5: Security - antivirus/EDR, VPN, MFA, password policy, training
- Section 6: Backup & DR - backup solutions, targets, frequency, retention, DR plan

Features:
- Dropdowns for single-select options (MDM solution, VPN, antivirus, etc.)
- Chip-select for multi-select options (endpoint types, OS, MFA methods, etc.)
- Toggle switches for yes/no questions with conditional fields
- Full JavaScript support for new chip selections and conditional mappings
- Initialization support for editing existing audits
This commit is contained in:
Maciej Pienczyn 2026-01-09 08:49:48 +01:00
parent b9a7f4640c
commit 7231428fa7
2 changed files with 553 additions and 14 deletions

View File

@ -3,7 +3,7 @@
"spec": "001-audyt-it",
"state": "building",
"subtasks": {
"completed": 12,
"completed": 13,
"total": 28,
"in_progress": 1,
"failed": 0
@ -18,8 +18,8 @@
"max": 1
},
"session": {
"number": 13,
"number": 14,
"started_at": "2026-01-09T08:11:54.054044"
},
"last_update": "2026-01-09T08:43:09.576688"
"last_update": "2026-01-09T08:46:49.643994"
}

View File

@ -962,12 +962,17 @@
</div>
</div>
<!-- Placeholder sections 4-9 (to be implemented in next subtask) -->
<!-- Section 4: Endpoints (Workstations) -->
<div class="form-section" data-section="4">
<div class="section-header collapsed" onclick="toggleSection(4)">
<div class="section-number" id="sectionNumber4">4</div>
<div class="section-title-group">
<div class="section-title">Stacje Robocze</div>
<div class="section-title">
<svg class="section-icon" style="display: inline; vertical-align: middle; margin-right: 8px;" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"/>
</svg>
Stacje Robocze
</div>
<div class="section-subtitle">Komputery pracownikow, systemy operacyjne, MDM</div>
</div>
<svg class="section-toggle" fill="none" stroke="currentColor" viewBox="0 0 24 24">
@ -975,15 +980,124 @@
</svg>
</div>
<div class="section-content collapsed" id="sectionContent4">
<p style="color: var(--text-secondary); padding: var(--spacing-lg);">Ta sekcja zostanie dodana wkrotce...</p>
<div class="form-grid">
<div class="form-group">
<label class="form-label">
Liczba stacji roboczych (komputerow)
</label>
<select class="form-select" name="endpoint_count" id="endpointCount">
<option value="">Wybierz przedzial</option>
<option value="1-10">1-10 komputerow</option>
<option value="11-25">11-25 komputerow</option>
<option value="26-50">26-50 komputerow</option>
<option value="51-100">51-100 komputerow</option>
<option value="101-250">101-250 komputerow</option>
<option value="250+">Ponad 250 komputerow</option>
</select>
</div>
<div class="form-group full-width">
<label class="form-label">
Typy urzadzen koncowych (wybierz wszystkie)
</label>
<div class="chip-select" id="endpointTypesChips">
<div class="chip-option" data-value="desktop_pc" onclick="toggleChip(this, 'endpointTypes')">Komputery stacjonarne (PC)</div>
<div class="chip-option" data-value="laptop" onclick="toggleChip(this, 'endpointTypes')">Laptopy</div>
<div class="chip-option" data-value="workstation" onclick="toggleChip(this, 'endpointTypes')">Stacje robocze (CAD/grafika)</div>
<div class="chip-option" data-value="thin_client" onclick="toggleChip(this, 'endpointTypes')">Thin clienty / terminale</div>
<div class="chip-option" data-value="mac" onclick="toggleChip(this, 'endpointTypes')">Komputery Mac</div>
<div class="chip-option" data-value="tablet" onclick="toggleChip(this, 'endpointTypes')">Tablety</div>
<div class="chip-option" data-value="mobile" onclick="toggleChip(this, 'endpointTypes')">Smartfony sluzbowe</div>
</div>
<input type="hidden" name="endpoint_types" id="endpointTypes" value="">
</div>
<div class="form-group full-width">
<label class="form-label">
Systemy operacyjne stacji roboczych (wybierz wszystkie)
</label>
<div class="chip-select" id="endpointOsChips">
<div class="chip-option" data-value="windows_11" onclick="toggleChip(this, 'endpointOs')">Windows 11</div>
<div class="chip-option" data-value="windows_10" onclick="toggleChip(this, 'endpointOs')">Windows 10</div>
<div class="chip-option" data-value="windows_older" onclick="toggleChip(this, 'endpointOs')">Windows 7/8 (starszy)</div>
<div class="chip-option" data-value="macos" onclick="toggleChip(this, 'endpointOs')">macOS</div>
<div class="chip-option" data-value="linux" onclick="toggleChip(this, 'endpointOs')">Linux (Ubuntu/inny)</div>
<div class="chip-option" data-value="chromeos" onclick="toggleChip(this, 'endpointOs')">Chrome OS</div>
<div class="chip-option" data-value="ios" onclick="toggleChip(this, 'endpointOs')">iOS/iPadOS</div>
<div class="chip-option" data-value="android" onclick="toggleChip(this, 'endpointOs')">Android</div>
</div>
<input type="hidden" name="endpoint_os" id="endpointOs" value="">
</div>
<div class="form-group">
<label class="form-label">
Czy firma korzysta z MDM (Mobile Device Management)?
</label>
<div class="form-toggle">
<div class="toggle-switch" id="toggleHasMdm" onclick="toggleSwitch('hasMdm')"></div>
<span class="toggle-label" id="labelHasMdm">Nie</span>
<input type="hidden" name="has_mdm" id="hasMdm" value="false">
</div>
</div>
<div class="form-group conditional-fields hidden" id="mdmSolutionField">
<label class="form-label">
Rozwiazanie MDM
</label>
<select class="form-select" name="mdm_solution" id="mdmSolution">
<option value="">Wybierz rozwiazanie</option>
<option value="intune">Microsoft Intune</option>
<option value="jamf">Jamf (dla macOS/iOS)</option>
<option value="workspace_one">VMware Workspace ONE</option>
<option value="mobileiron">MobileIron / Ivanti</option>
<option value="kandji">Kandji</option>
<option value="hexnode">Hexnode</option>
<option value="other">Inne rozwiazanie</option>
</select>
</div>
<div class="form-group">
<label class="form-label">
Czy urzadzenia sa centralne zarzadzane (GPO/Intune)?
</label>
<div class="form-toggle">
<div class="toggle-switch" id="toggleHasCentralManagement" onclick="toggleSwitch('hasCentralManagement')"></div>
<span class="toggle-label" id="labelHasCentralManagement">Nie</span>
<input type="hidden" name="has_central_management" id="hasCentralManagement" value="false">
</div>
<span class="form-hint">Group Policy, Intune, SCCM, inne narzedzia do zarzadzania konfiguracjami</span>
</div>
<div class="form-group">
<label class="form-label">
Czy dyski twarde sa szyfrowane?
</label>
<select class="form-select" name="disk_encryption" id="diskEncryption">
<option value="">Wybierz opcje</option>
<option value="none">Brak szyfrowania</option>
<option value="partial">Czesciowo (niektore urzadzenia)</option>
<option value="bitlocker">BitLocker (Windows)</option>
<option value="filevault">FileVault (macOS)</option>
<option value="veracrypt">VeraCrypt</option>
<option value="other">Inne rozwiazanie</option>
</select>
<span class="form-hint">Szyfrowanie chroni dane w przypadku kradziezy urzadzenia</span>
</div>
</div>
</div>
</div>
<!-- Section 5: Security -->
<div class="form-section" data-section="5">
<div class="section-header collapsed" onclick="toggleSection(5)">
<div class="section-number" id="sectionNumber5">5</div>
<div class="section-title-group">
<div class="section-title">Bezpieczenstwo</div>
<div class="section-title">
<svg class="section-icon" style="display: inline; vertical-align: middle; margin-right: 8px;" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"/>
</svg>
Bezpieczenstwo
</div>
<div class="section-subtitle">Antywirus, EDR, VPN, MFA, firewall</div>
</div>
<svg class="section-toggle" fill="none" stroke="currentColor" viewBox="0 0 24 24">
@ -991,15 +1105,170 @@
</svg>
</div>
<div class="section-content collapsed" id="sectionContent5">
<p style="color: var(--text-secondary); padding: var(--spacing-lg);">Ta sekcja zostanie dodana wkrotce...</p>
<div class="form-grid">
<div class="form-group">
<label class="form-label">
Rozwiazanie antywirusowe / EDR
</label>
<select class="form-select" name="antivirus_solution" id="antivirusSolution">
<option value="">Wybierz rozwiazanie</option>
<option value="none">Brak (tylko Windows Defender)</option>
<option value="defender_atp">Microsoft Defender for Endpoint (ATP)</option>
<option value="crowdstrike">CrowdStrike Falcon</option>
<option value="sentinelone">SentinelOne</option>
<option value="eset">ESET Endpoint Security</option>
<option value="kaspersky">Kaspersky</option>
<option value="sophos">Sophos Endpoint</option>
<option value="bitdefender">Bitdefender GravityZone</option>
<option value="trendmicro">Trend Micro</option>
<option value="norton">Norton / Symantec</option>
<option value="malwarebytes">Malwarebytes</option>
<option value="other">Inne rozwiazanie</option>
</select>
</div>
<div class="form-group">
<label class="form-label">
Czy firma korzysta z VPN dla pracownikow zdalnych?
</label>
<div class="form-toggle">
<div class="toggle-switch" id="toggleHasVpn" onclick="toggleSwitch('hasVpn')"></div>
<span class="toggle-label" id="labelHasVpn">Nie</span>
<input type="hidden" name="has_vpn" id="hasVpn" value="false">
</div>
</div>
<div class="form-group conditional-fields hidden" id="vpnSolutionField">
<label class="form-label">
Rozwiazanie VPN
</label>
<select class="form-select" name="vpn_solution" id="vpnSolution">
<option value="">Wybierz rozwiazanie</option>
<option value="forticlient">FortiClient VPN</option>
<option value="cisco_anyconnect">Cisco AnyConnect</option>
<option value="globalprotect">Palo Alto GlobalProtect</option>
<option value="openvpn">OpenVPN</option>
<option value="wireguard">WireGuard</option>
<option value="azure_vpn">Azure VPN Gateway</option>
<option value="sophos_vpn">Sophos VPN</option>
<option value="pulse">Pulse Secure / Ivanti</option>
<option value="mikrotik_vpn">MikroTik VPN</option>
<option value="other">Inne rozwiazanie</option>
</select>
</div>
<div class="form-group">
<label class="form-label">
Czy firma korzysta z MFA (uwierzytelnianie wieloskladnikowe)?
</label>
<div class="form-toggle">
<div class="toggle-switch" id="toggleHasMfa" onclick="toggleSwitch('hasMfa')"></div>
<span class="toggle-label" id="labelHasMfa">Nie</span>
<input type="hidden" name="has_mfa" id="hasMfa" value="false">
</div>
</div>
<div class="form-group full-width conditional-fields hidden" id="mfaMethodsField">
<label class="form-label">
Metody MFA (wybierz wszystkie stosowane)
</label>
<div class="chip-select" id="mfaMethodsChips">
<div class="chip-option" data-value="authenticator_app" onclick="toggleChip(this, 'mfaMethods')">Aplikacja Authenticator (TOTP)</div>
<div class="chip-option" data-value="sms" onclick="toggleChip(this, 'mfaMethods')">SMS</div>
<div class="chip-option" data-value="phone_call" onclick="toggleChip(this, 'mfaMethods')">Polaczenie telefoniczne</div>
<div class="chip-option" data-value="hardware_key" onclick="toggleChip(this, 'mfaMethods')">Klucz sprzetowy (YubiKey, FIDO2)</div>
<div class="chip-option" data-value="push" onclick="toggleChip(this, 'mfaMethods')">Powiadomienia push</div>
<div class="chip-option" data-value="biometric" onclick="toggleChip(this, 'mfaMethods')">Biometria (Windows Hello)</div>
<div class="chip-option" data-value="email" onclick="toggleChip(this, 'mfaMethods')">Kod email</div>
</div>
<input type="hidden" name="mfa_methods" id="mfaMethods" value="">
</div>
<div class="form-group full-width">
<label class="form-label">
Zakres stosowania MFA (wybierz wszystkie)
</label>
<div class="chip-select" id="mfaScopeChips">
<div class="chip-option" data-value="cloud_apps" onclick="toggleChip(this, 'mfaScope')">Aplikacje chmurowe (M365, Google)</div>
<div class="chip-option" data-value="vpn" onclick="toggleChip(this, 'mfaScope')">VPN</div>
<div class="chip-option" data-value="windows_login" onclick="toggleChip(this, 'mfaScope')">Logowanie do Windows</div>
<div class="chip-option" data-value="privileged" onclick="toggleChip(this, 'mfaScope')">Konta uprzywilejowane (admin)</div>
<div class="chip-option" data-value="all_users" onclick="toggleChip(this, 'mfaScope')">Wszyscy uzytkownicy</div>
<div class="chip-option" data-value="external" onclick="toggleChip(this, 'mfaScope')">Dostep zewnetrzny</div>
</div>
<input type="hidden" name="mfa_scope" id="mfaScope" value="">
</div>
<div class="form-group">
<label class="form-label">
Czy firma ma polityki haseł (password policy)?
</label>
<select class="form-select" name="password_policy" id="passwordPolicy">
<option value="">Wybierz opcje</option>
<option value="none">Brak formalnej polityki</option>
<option value="basic">Podstawowa (min. dlugosc, zlozonosc)</option>
<option value="advanced">Zaawansowana (rotacja, historia, blokada)</option>
<option value="passwordless">Passwordless (bez hasel)</option>
</select>
</div>
<div class="form-group">
<label class="form-label">
Czy przeprowadzane sa szkolenia z cyberbezpieczenstwa?
</label>
<select class="form-select" name="security_training" id="securityTraining">
<option value="">Wybierz opcje</option>
<option value="none">Brak szkolen</option>
<option value="onboarding">Tylko przy zatrudnieniu</option>
<option value="annual">Raz w roku</option>
<option value="quarterly">Kwartalnie</option>
<option value="continuous">Ciagle (platforma e-learning)</option>
</select>
<span class="form-hint">Szkolenia dot. phishingu, bezpieczenstwa hasel, etc.</span>
</div>
<div class="form-group">
<label class="form-label">
Czy firma posiada ubezpieczenie cyber (cyber insurance)?
</label>
<div class="form-toggle">
<div class="toggle-switch" id="toggleHasCyberInsurance" onclick="toggleSwitch('hasCyberInsurance')"></div>
<span class="toggle-label" id="labelHasCyberInsurance">Nie</span>
<input type="hidden" name="has_cyber_insurance" id="hasCyberInsurance" value="false">
</div>
</div>
<div class="form-group full-width">
<label class="form-label">
Dodatkowe srodki bezpieczenstwa (wybierz wszystkie)
</label>
<div class="chip-select" id="securityMeasuresChips">
<div class="chip-option" data-value="siem" onclick="toggleChip(this, 'securityMeasures')">SIEM / centralne logi</div>
<div class="chip-option" data-value="dlp" onclick="toggleChip(this, 'securityMeasures')">DLP (Data Loss Prevention)</div>
<div class="chip-option" data-value="email_security" onclick="toggleChip(this, 'securityMeasures')">Zabezpieczenia poczty (anti-phishing)</div>
<div class="chip-option" data-value="web_filter" onclick="toggleChip(this, 'securityMeasures')">Filtrowanie WWW</div>
<div class="chip-option" data-value="pam" onclick="toggleChip(this, 'securityMeasures')">PAM (Privileged Access Management)</div>
<div class="chip-option" data-value="vulnerability_scan" onclick="toggleChip(this, 'securityMeasures')">Skanowanie podatnosci</div>
<div class="chip-option" data-value="pentest" onclick="toggleChip(this, 'securityMeasures')">Testy penetracyjne</div>
<div class="chip-option" data-value="soc" onclick="toggleChip(this, 'securityMeasures')">SOC (zewnetrzny lub wewnetrzny)</div>
</div>
<input type="hidden" name="security_measures" id="securityMeasures" value="">
</div>
</div>
</div>
</div>
<!-- Section 6: Backup & Disaster Recovery -->
<div class="form-section" data-section="6">
<div class="section-header collapsed" onclick="toggleSection(6)">
<div class="section-number" id="sectionNumber6">6</div>
<div class="section-title-group">
<div class="section-title">Backup i Disaster Recovery</div>
<div class="section-title">
<svg class="section-icon" style="display: inline; vertical-align: middle; margin-right: 8px;" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4"/>
</svg>
Backup i Disaster Recovery
</div>
<div class="section-subtitle">Rozwiazania backupowe, cele, czestotliwosc, plan DR</div>
</div>
<svg class="section-toggle" fill="none" stroke="currentColor" viewBox="0 0 24 24">
@ -1007,7 +1276,180 @@
</svg>
</div>
<div class="section-content collapsed" id="sectionContent6">
<p style="color: var(--text-secondary); padding: var(--spacing-lg);">Ta sekcja zostanie dodana wkrotce...</p>
<div class="form-grid">
<div class="form-group">
<label class="form-label">
Czy firma ma wdrozony backup?
</label>
<div class="form-toggle">
<div class="toggle-switch" id="toggleHasBackup" onclick="toggleSwitch('hasBackup')"></div>
<span class="toggle-label" id="labelHasBackup">Nie</span>
<input type="hidden" name="has_backup" id="hasBackup" value="false">
</div>
</div>
<div class="form-group conditional-fields hidden" id="backupSolutionField">
<label class="form-label">
Glowne rozwiazanie backupowe
</label>
<select class="form-select" name="backup_solution" id="backupSolution">
<option value="">Wybierz rozwiazanie</option>
<option value="veeam">Veeam Backup & Replication</option>
<option value="acronis">Acronis Cyber Protect</option>
<option value="commvault">Commvault</option>
<option value="veritas">Veritas NetBackup / Backup Exec</option>
<option value="nakivo">NAKIVO</option>
<option value="azure_backup">Azure Backup</option>
<option value="aws_backup">AWS Backup</option>
<option value="proxmox_backup">Proxmox Backup Server</option>
<option value="synology">Synology Hyper Backup</option>
<option value="qnap">QNAP Backup</option>
<option value="windows_backup">Windows Server Backup</option>
<option value="bacula">Bacula / Bareos</option>
<option value="restic">Restic / BorgBackup</option>
<option value="other">Inne rozwiazanie</option>
</select>
</div>
<div class="form-group full-width conditional-fields hidden" id="backupTargetsField">
<label class="form-label">
Co jest backupowane? (wybierz wszystkie)
</label>
<div class="chip-select" id="backupTargetsChips">
<div class="chip-option" data-value="servers" onclick="toggleChip(this, 'backupTargets')">Serwery (VM/fizyczne)</div>
<div class="chip-option" data-value="databases" onclick="toggleChip(this, 'backupTargets')">Bazy danych</div>
<div class="chip-option" data-value="file_shares" onclick="toggleChip(this, 'backupTargets')">Udzialy plikowe</div>
<div class="chip-option" data-value="endpoints" onclick="toggleChip(this, 'backupTargets')">Stacje robocze</div>
<div class="chip-option" data-value="m365" onclick="toggleChip(this, 'backupTargets')">Microsoft 365 (mail, OneDrive, SharePoint)</div>
<div class="chip-option" data-value="google_workspace" onclick="toggleChip(this, 'backupTargets')">Google Workspace</div>
<div class="chip-option" data-value="applications" onclick="toggleChip(this, 'backupTargets')">Aplikacje biznesowe (ERP, CRM)</div>
<div class="chip-option" data-value="config" onclick="toggleChip(this, 'backupTargets')">Konfiguracje (sieci, firewalle)</div>
</div>
<input type="hidden" name="backup_targets" id="backupTargets" value="">
</div>
<div class="form-group conditional-fields hidden" id="backupFrequencyField">
<label class="form-label">
Czestotliwosc backupu
</label>
<select class="form-select" name="backup_frequency" id="backupFrequency">
<option value="">Wybierz czestotliwosc</option>
<option value="continuous">Ciagle (CDP)</option>
<option value="hourly">Co godzine</option>
<option value="daily">Codziennie</option>
<option value="weekly">Co tydzien</option>
<option value="monthly">Co miesiac</option>
<option value="irregular">Nieregularnie / reczne</option>
</select>
</div>
<div class="form-group full-width conditional-fields hidden" id="backupStorageField">
<label class="form-label">
Gdzie przechowywane sa kopie backupowe? (wybierz wszystkie)
</label>
<div class="chip-select" id="backupStorageChips">
<div class="chip-option" data-value="local_nas" onclick="toggleChip(this, 'backupStorage')">Lokalny NAS / storage</div>
<div class="chip-option" data-value="local_tape" onclick="toggleChip(this, 'backupStorage')">Tasmy LTO (local)</div>
<div class="chip-option" data-value="offsite_nas" onclick="toggleChip(this, 'backupStorage')">NAS w innej lokalizacji</div>
<div class="chip-option" data-value="cloud_azure" onclick="toggleChip(this, 'backupStorage')">Azure Blob Storage</div>
<div class="chip-option" data-value="cloud_aws" onclick="toggleChip(this, 'backupStorage')">AWS S3 / Glacier</div>
<div class="chip-option" data-value="cloud_gcp" onclick="toggleChip(this, 'backupStorage')">Google Cloud Storage</div>
<div class="chip-option" data-value="cloud_backblaze" onclick="toggleChip(this, 'backupStorage')">Backblaze B2</div>
<div class="chip-option" data-value="cloud_wasabi" onclick="toggleChip(this, 'backupStorage')">Wasabi</div>
<div class="chip-option" data-value="datacenter" onclick="toggleChip(this, 'backupStorage')">Zewnetrzne data center</div>
</div>
<input type="hidden" name="backup_storage" id="backupStorage" value="">
</div>
<div class="form-group conditional-fields hidden" id="backupRetentionField">
<label class="form-label">
Retencja backupow (jak dlugo przechowywane)
</label>
<select class="form-select" name="backup_retention" id="backupRetention">
<option value="">Wybierz okres</option>
<option value="7days">7 dni</option>
<option value="14days">14 dni</option>
<option value="30days">30 dni</option>
<option value="90days">90 dni</option>
<option value="1year">1 rok</option>
<option value="3years">3 lata</option>
<option value="7years">7 lat (wymagania prawne)</option>
<option value="gfs">GFS (Grandfather-Father-Son)</option>
</select>
</div>
<div class="form-group">
<label class="form-label">
Czy testy odzyskiwania backupow sa przeprowadzane regularnie?
</label>
<select class="form-select" name="backup_test_frequency" id="backupTestFrequency">
<option value="">Wybierz opcje</option>
<option value="never">Nigdy nie testowane</option>
<option value="yearly">Raz w roku</option>
<option value="quarterly">Kwartalnie</option>
<option value="monthly">Miesiecznie</option>
<option value="automated">Automatyczne testy</option>
</select>
<span class="form-hint">Testowanie odzyskiwania to klucz do pewnosci, ze backup dziala</span>
</div>
<div class="form-group">
<label class="form-label">
Czy firma ma plan Disaster Recovery (DR)?
</label>
<div class="form-toggle">
<div class="toggle-switch" id="toggleHasDrPlan" onclick="toggleSwitch('hasDrPlan')"></div>
<span class="toggle-label" id="labelHasDrPlan">Nie</span>
<input type="hidden" name="has_dr_plan" id="hasDrPlan" value="false">
</div>
</div>
<div class="form-group conditional-fields hidden" id="rtoField">
<label class="form-label">
RTO (Recovery Time Objective)
</label>
<select class="form-select" name="rto" id="rto">
<option value="">Wybierz docelowy czas odzyskiwania</option>
<option value="1hour">Do 1 godziny</option>
<option value="4hours">Do 4 godzin</option>
<option value="8hours">Do 8 godzin (1 dzien roboczy)</option>
<option value="24hours">Do 24 godzin</option>
<option value="48hours">Do 48 godzin</option>
<option value="1week">Do 1 tygodnia</option>
<option value="undefined">Nie zdefiniowany</option>
</select>
<span class="form-hint">Maksymalny akceptowalny czas niedostepnosci systemow</span>
</div>
<div class="form-group conditional-fields hidden" id="rpoField">
<label class="form-label">
RPO (Recovery Point Objective)
</label>
<select class="form-select" name="rpo" id="rpo">
<option value="">Wybierz akceptowalna utrate danych</option>
<option value="0">Zero (bez utraty danych)</option>
<option value="1hour">Do 1 godziny</option>
<option value="4hours">Do 4 godzin</option>
<option value="24hours">Do 24 godzin</option>
<option value="48hours">Do 48 godzin</option>
<option value="1week">Do 1 tygodnia</option>
<option value="undefined">Nie zdefiniowany</option>
</select>
<span class="form-hint">Maksymalna akceptowalna ilosc utraconych danych (od ostatniego backupu)</span>
</div>
<div class="form-group">
<label class="form-label">
Czy firma ma zapasowa lokalizacje (DR site)?
</label>
<div class="form-toggle">
<div class="toggle-switch" id="toggleHasDrSite" onclick="toggleSwitch('hasDrSite')"></div>
<span class="toggle-label" id="labelHasDrSite">Nie</span>
<input type="hidden" name="has_dr_site" id="hasDrSite" value="false">
</div>
<span class="form-hint">Druga lokalizacja, gdzie mozna przeniesc operacje w razie awarii</span>
</div>
</div>
</div>
</div>
@ -1123,7 +1565,14 @@ const chipSelections = {
m365Plans: [],
teamsUsage: [],
serverTypes: [],
serverOs: []
serverOs: [],
endpointTypes: [],
endpointOs: [],
mfaMethods: [],
mfaScope: [],
securityMeasures: [],
backupTargets: [],
backupStorage: []
};
// Toggle switch functionality
@ -1147,7 +1596,12 @@ function handleConditionalFields(fieldId, isActive) {
'itOutsourced': ['itProviderFields'],
'hasAzureAd': ['azureAdFields', 'azureUserCountField'],
'hasM365': ['m365PlansField', 'teamsUsageField'],
'hasLocalAd': ['localAdFields', 'adSyncField']
'hasLocalAd': ['localAdFields', 'adSyncField'],
'hasMdm': ['mdmSolutionField'],
'hasVpn': ['vpnSolutionField'],
'hasMfa': ['mfaMethodsField'],
'hasBackup': ['backupSolutionField', 'backupTargetsField', 'backupFrequencyField', 'backupStorageField', 'backupRetentionField'],
'hasDrPlan': ['rtoField', 'rpoField']
};
const fieldsToToggle = conditionalMappings[fieldId];
@ -1328,13 +1782,15 @@ document.getElementById('infoModal')?.addEventListener('click', (e) => {
// Initialize form with existing data if editing
{% if audit %}
function initializeForm() {
// Initialize toggle switches
// Initialize toggle switches - Section 1 (IT Contact)
{% if audit.has_it_manager %}
toggleSwitch('hasItManager');
{% endif %}
{% if audit.it_outsourced %}
toggleSwitch('itOutsourced');
{% endif %}
// Section 2 (Cloud & Identity)
{% if audit.has_azure_ad %}
toggleSwitch('hasAzureAd');
{% endif %}
@ -1351,7 +1807,37 @@ function initializeForm() {
toggleSwitch('hasAdAzureSync');
{% endif %}
// Initialize chip selections
// Section 4 (Endpoints)
{% if audit.has_mdm %}
toggleSwitch('hasMdm');
{% endif %}
{% if audit.has_central_management %}
toggleSwitch('hasCentralManagement');
{% endif %}
// Section 5 (Security)
{% if audit.has_vpn %}
toggleSwitch('hasVpn');
{% endif %}
{% if audit.has_mfa %}
toggleSwitch('hasMfa');
{% endif %}
{% if audit.has_cyber_insurance %}
toggleSwitch('hasCyberInsurance');
{% endif %}
// Section 6 (Backup & DR)
{% if audit.has_backup %}
toggleSwitch('hasBackup');
{% endif %}
{% if audit.has_dr_plan %}
toggleSwitch('hasDrPlan');
{% endif %}
{% if audit.has_dr_site %}
toggleSwitch('hasDrSite');
{% endif %}
// Initialize chip selections - Section 2
{% if audit.m365_plans %}
'{{ audit.m365_plans | join(",") }}'.split(',').forEach(value => {
const chip = document.querySelector('#m365PlansChips .chip-option[data-value="' + value + '"]');
@ -1366,6 +1852,7 @@ function initializeForm() {
});
{% endif %}
// Section 3 (Servers)
{% if audit.server_types %}
'{{ audit.server_types | join(",") }}'.split(',').forEach(value => {
const chip = document.querySelector('#serverTypesChips .chip-option[data-value="' + value + '"]');
@ -1380,6 +1867,58 @@ function initializeForm() {
});
{% endif %}
// Section 4 (Endpoints)
{% if audit.endpoint_types %}
'{{ audit.endpoint_types | join(",") }}'.split(',').forEach(value => {
const chip = document.querySelector('#endpointTypesChips .chip-option[data-value="' + value + '"]');
if (chip) toggleChip(chip, 'endpointTypes');
});
{% endif %}
{% if audit.endpoint_os %}
'{{ audit.endpoint_os | join(",") }}'.split(',').forEach(value => {
const chip = document.querySelector('#endpointOsChips .chip-option[data-value="' + value + '"]');
if (chip) toggleChip(chip, 'endpointOs');
});
{% endif %}
// Section 5 (Security)
{% if audit.mfa_methods %}
'{{ audit.mfa_methods | join(",") }}'.split(',').forEach(value => {
const chip = document.querySelector('#mfaMethodsChips .chip-option[data-value="' + value + '"]');
if (chip) toggleChip(chip, 'mfaMethods');
});
{% endif %}
{% if audit.mfa_scope %}
'{{ audit.mfa_scope | join(",") }}'.split(',').forEach(value => {
const chip = document.querySelector('#mfaScopeChips .chip-option[data-value="' + value + '"]');
if (chip) toggleChip(chip, 'mfaScope');
});
{% endif %}
{% if audit.security_measures %}
'{{ audit.security_measures | join(",") }}'.split(',').forEach(value => {
const chip = document.querySelector('#securityMeasuresChips .chip-option[data-value="' + value + '"]');
if (chip) toggleChip(chip, 'securityMeasures');
});
{% endif %}
// Section 6 (Backup & DR)
{% if audit.backup_targets %}
'{{ audit.backup_targets | join(",") }}'.split(',').forEach(value => {
const chip = document.querySelector('#backupTargetsChips .chip-option[data-value="' + value + '"]');
if (chip) toggleChip(chip, 'backupTargets');
});
{% endif %}
{% if audit.backup_storage %}
'{{ audit.backup_storage | join(",") }}'.split(',').forEach(value => {
const chip = document.querySelector('#backupStorageChips .chip-option[data-value="' + value + '"]');
if (chip) toggleChip(chip, 'backupStorage');
});
{% endif %}
updateProgress();
}