Cyber Search

Annuaire des Solutions Cybersécurité

1048 solutions référencées • Filtres intelligents • Qualification assistée par IA

Solutions Services Conformité Tendances

Trouvez votre solution

Filtres avancés, comparaison intelligente

CC

Assistant CCIA

Intelligence Artificielle pour trouver la solution cyber adaptée à vos besoins

💡 Exemple de besoin :

"Je cherche un EDR avec un budget de 150K€ pour une PME de 50 personnes dans le Nord de la France"

Filtres Rapides

Type :

1048 solutions trouvées

🔍 Chargement des solutions...

Analyse de 1048 fournisseurs cybersécurité

⚡ Trouvez une solution en moins de 30 secondes

Votez rapidement :

`).join(''); // Render pagination renderPagination(); } // Render pagination function renderPagination() { const totalPages = Math.ceil(filteredCompanies.length / itemsPerPage); const pagination = document.getElementById('pagination'); if (!pagination) return; // Générer le HTML de pagination if (totalPages <= 1) { pagination.innerHTML = '

Page unique

'; return; } const html = ` ${currentPage} / ${totalPages} `; pagination.innerHTML = html; } // Change page function changePage(page) { const totalPages = Math.ceil(filteredCompanies.length / itemsPerPage); if (page < 1 || page > totalPages) return; currentPage = page; renderResults(); window.scrollTo({ top: 0, behavior: 'smooth' }); } // Open company modal function openCompanyModal(id) { const company = allCompanies.find(c => c.id === id); if (!company) return; // Créer une modal détaillée const modal = document.createElement('div'); modal.className = 'fixed inset-0 bg-black/80 backdrop-blur-sm flex items-center justify-center z-[10000] p-4'; modal.innerHTML = `

${company.name}

Description

${company.longDescription || company.description}

${company.solutions ? `

Solutions

${company.solutions.map(s => `${s}`).join('')}
` : ''} ${company.services ? `

Services

${company.services.map(s => `${s}`).join('')}
` : ''} ${company.website && localStorage.getItem('userRole') === 'admin' ? ` ` : ''}
`; document.body.appendChild(modal); } // Open review modal - Redirect to review form function openReviewModal(id) { const userStatus = getUserStatus(); // Vérifier si l'utilisateur peut laisser un avis vérifié if (!hasAccess('LEAVE_VERIFIED_REVIEW', userStatus)) { showAccessRestrictionMessage('LEAVE_VERIFIED_REVIEW'); return; } const company = allCompanies.find(c => c.id === id); if (company) { // Redirection vers le formulaire d'avis avec ID et nom du fournisseur window.location.href = `laisser-avis.html?id=${id}&name=${encodeURIComponent(company.name)}`; } } // Request contact function requestContact(id) { const userStatus = getUserStatus(); // Vérifier si l'utilisateur peut contacter directement if (!hasAccess('DIRECT_CONTACT_SUPPLIERS', userStatus)) { showAccessRestrictionMessage('DIRECT_CONTACT_SUPPLIERS'); return; } const company = allCompanies.find(c => c.id === id); if (company) { // Redirection vers page de contact avec ID fournisseur window.location.href = `contact.html?provider=${id}&name=${encodeURIComponent(company.name)}`; } } // Request Demo - Ouvre la modal let currentDemoCompanyId = null; function requestDemo(id, name) { currentDemoCompanyId = id; document.getElementById('demo-company-name').textContent = name; document.getElementById('demo-company-name-2').textContent = name; document.getElementById('demo-modal').classList.remove('hidden'); // Focus sur le premier champ setTimeout(() => { document.getElementById('demo-name').focus(); }, 100); } function closeDemoModal() { document.getElementById('demo-modal').classList.add('hidden'); currentDemoCompanyId = null; // Reset form document.getElementById('demo-name').value = ''; document.getElementById('demo-email').value = ''; document.getElementById('demo-company').value = ''; document.getElementById('demo-phone').value = ''; document.getElementById('demo-message').value = ''; } function submitDemoRequest() { const name = document.getElementById('demo-name').value.trim(); const email = document.getElementById('demo-email').value.trim(); const company = document.getElementById('demo-company').value.trim(); const message = document.getElementById('demo-message').value.trim(); // Validation if (!name || !email || !company || !message) { alert('⚠️ Veuillez remplir tous les champs obligatoires'); return; } // Email validation const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (!emailRegex.test(email)) { alert('⚠️ Veuillez entrer une adresse email valide'); return; } // VÉRIFICATION PREMIUM const isPremium = false; // TODO: Récupérer le statut Premium de l'utilisateur if (!isPremium) { // ❌ PAS PREMIUM → Bloquer et proposer upgrade closeDemoModal(); const choice = confirm( 'FONCTIONNALITÉ PREMIUM REQUISE\n\n' + ' Avec un compte Premium, vous pouvez contacter directement les fournisseurs et demander des démos !\n\n' + 'Avantages Premium :\n' + '• Contact direct avec les fournisseurs\n' + '• Demandes de démo illimitées\n' + '• Accès aux RETEX et avis clients\n' + '• Filtres avancés et recherche prioritaire\n\n' + '👉 Voulez-vous découvrir nos offres Premium ?\n\n' + '✅ OK = Voir les offres Premium\n' + '❌ Annuler = Nous contacter' ); if (choice) { window.location.href = 'cyber-premium.html'; } else { window.location.href = 'contact.html'; } return; } // ✅ UTILISATEUR PREMIUM → Envoyer la demande const companyData = allCompanies.find(c => c.id === currentDemoCompanyId); alert( '✅ DEMANDE ENVOYÉE AVEC SUCCÈS !\n\n' + `Votre demande de démo a été transmise à ${companyData.name}.\n\n` + '📧 Vous recevrez une confirmation par email.\n' + '📞 Le fournisseur vous contactera sous 48h ouvrées.\n\n' + 'Merci d\'utiliser CyberConnect !' ); closeDemoModal(); // TODO: Envoyer réellement la demande au backend console.log('Demo request:', { providerId: currentDemoCompanyId, providerName: companyData.name, userName: name, userEmail: email, userCompany: company, message: message }); } // Deposit need function depositNeed(id) { const company = allCompanies.find(c => c.id === id); if (company) { // Redirection vers la page de dépôt de besoin window.location.href = `create-problematique.html?provider=${id}&name=${encodeURIComponent(company.name)}`; } } // View RETEX (feedbacks) function viewRetex(id) { const company = allCompanies.find(c => c.id === id); if (company) { // Redirection vers section RETEX sur la page communauté window.location.href = `community.html?view=retex&provider=${id}&name=${encodeURIComponent(company.name)}`; } } // Get solution emoji function getSolutionEmoji(solution) { const emojiMap = { // Protection & Sécurité 'Antivirus': '', 'EDR': '', 'XDR': '', 'Firewall': '🧱', 'WAF': '', 'SIEM': '', 'SOC': '', 'IDS/IPS': '🚨', 'DLP': '📁', 'Endpoint': '', // Identité & Accès 'IAM': '', 'PAM': '👤', 'MFA': '', 'SSO': '🎫', 'Zero Trust': '', // Cloud & Réseau 'Cloud Security': '', 'CASB': '', 'SD-WAN': '', 'VPN': '', 'Network Security': '', // Email & Messagerie 'Email Security': '📧', 'Anti-phishing': '🎣', 'Anti-spam': '🚫', // Sauvegarde & Résilience 'Backup': '', 'DR': '🔄', 'BCP': '📋', // Conformité & Audit 'GRC': '', 'Compliance': '✅', 'Audit': '', 'RGPD': '⚖️', // Formation & Sensibilisation 'Formation': '', 'Sensibilisation': '', 'E-learning': '', // Pentest & Audit 'Pentest': '🔬', 'Red Team': '', 'Blue Team': '', 'Purple Team': '💜', // Threat Intelligence 'Threat Intel': '🔮', 'CTI': '📡', 'OSINT': '', // Autres 'Consulting': '', 'MSSP': '', 'Managed Services': '⚙️' }; // Cherche une correspondance partielle for (const [key, emoji] of Object.entries(emojiMap)) { if (solution.includes(key) || key.includes(solution)) { return emoji; } } return ''; // Emoji par défaut } // Get country emoji function getCountryEmoji(country) { const emojiMap = { 'France': '🇫🇷', 'United States': '🇺🇸', 'USA': '🇺🇸', 'Canada': '🇨🇦', 'United Kingdom': '🇬🇧', 'UK': '🇬🇧', 'Germany': '🇩🇪', 'Allemagne': '🇩🇪', 'Spain': '🇪🇸', 'Espagne': '🇪🇸', 'Italy': '🇮🇹', 'Italie': '🇮🇹', 'Switzerland': '🇨🇭', 'Suisse': '🇨🇭', 'Belgium': '🇧🇪', 'Belgique': '🇧🇪', 'Netherlands': '🇳🇱', 'Pays-Bas': '🇳🇱', 'Israel': '🇮🇱', 'Israël': '🇮🇱', 'Japan': '🇯🇵', 'Japon': '🇯🇵', 'China': '🇨🇳', 'Chine': '🇨🇳', 'India': '🇮🇳', 'Inde': '🇮🇳', 'Australia': '🇦🇺', 'Australie': '🇦🇺', 'Singapore': '🇸🇬', 'Singapour': '🇸🇬' }; return emojiMap[country] || ''; } // Escape HTML function escapeHtml(text) { const div = document.createElement('div'); div.textContent = text; return div.innerHTML; } // ===== GESTION DU STATUT PREMIUM ===== function checkUserPremiumStatus() { // Récupérer le statut Premium depuis localStorage const userData = JSON.parse(localStorage.getItem('userData') || '{}'); const isPremium = userData.isPremium || false; console.log('👤 Statut utilisateur:', isPremium ? 'PREMIUM ⭐' : 'GRATUIT'); const premiumColumn = document.querySelector('#search-layout-container > div > div:first-child > div:nth-child(2)'); if (!premiumColumn) { console.warn('⚠️ Colonne Premium non trouvée'); return; } if (!isPremium) { // ❌ NON PREMIUM : Masquer la colonne Premium premiumColumn.style.display = 'none'; console.log('🔒 Colonne Premium masquée (non premium)'); } else { // ✅ PREMIUM : Les filtres sont déjà affichés console.log('⭐ Filtres Premium accessibles'); } } // Init on page load document.addEventListener('DOMContentLoaded', () => { console.log('Initialisation Cyber Search (Vanilla JS)...'); // ✅ VÉRIFIER LE STATUT PREMIUM DE L'UTILISATEUR checkUserPremiumStatus(); loadCompanies(); // ✅ OUVRIR TOUTES LES SECTIONS DE FILTRES PAR DÉFAUT const allFilterSections = document.querySelectorAll('.filter-section'); allFilterSections.forEach(section => { section.classList.add('open'); }); // Mettre à jour les icônes des toggles const allIcons = document.querySelectorAll('.toggle-icon'); allIcons.forEach(icon => { icon.textContent = '▼'; }); console.log(`✅ ${allFilterSections.length} sections de filtres ouvertes par défaut`); // ✅ DÉTECTER LE NIVEAU DE MATURITÉ DEPUIS L'URL (APRÈS que tout soit chargé) setTimeout(() => { const urlParams = new URLSearchParams(window.location.search); const levelParam = urlParams.get('level'); if (levelParam) { console.log('🔗 Niveau détecté depuis URL:', levelParam); const maturitySelect = document.getElementById('maturity-level'); if (maturitySelect) { maturitySelect.value = levelParam; // Déclencher le changement handleMaturityChange(levelParam); } } else { // Par défaut : mode Débutant console.log('📍 Mode par défaut : Débutant'); const maturitySelect = document.getElementById('maturity-level'); if (maturitySelect && maturitySelect.value === 'beginner') { handleMaturityChange('beginner'); } } }, 500); // Attendre 500ms que les filtres soient générés // Mettre à jour les compteurs de votes après le rendu setTimeout(() => { updateAllReactionCounts(); }, 500); }); // ===== GESTION MOBILE FILTERS ===== function toggleMobileFilters() { const filtersSection = document.querySelector('#search-layout-container > div > div:first-child'); if (filtersSection) { filtersSection.classList.toggle('active'); // Pas d'overlay, juste le drawer document.body.style.overflow = filtersSection.classList.contains('active') ? 'hidden' : 'auto'; } } // ===== SYSTÈME DE VOTES AVEC EMOJIS (API BACKEND) ===== const VOTES_API_URL = 'https://5559-i9yu1iqf5k4iv0tgasynt-5c13a017.sandbox.novita.ai/api'; // Générer un ID utilisateur unique (basé sur le navigateur) function getUserId() { let userId = localStorage.getItem('userId'); if (!userId) { userId = 'user-' + Date.now() + '-' + Math.random().toString(36).substr(2, 9); localStorage.setItem('userId', userId); } return userId; } async function addReaction(companyId, emoji) { try { const response = await fetch(`${VOTES_API_URL}/votes`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ company_id: companyId, emoji: emoji, user_id: getUserId(), user_name: 'Anonyme' }) }); const data = await response.json(); if (data.success) { console.log(`✅ Vote ${emoji} enregistré pour company ${companyId}`); // Mettre à jour l'affichage await updateReactionCounts(companyId); } else { // Si l'utilisateur a déjà voté, afficher un message if (data.error && data.error.includes('déjà voté')) { console.log(`ℹ️ Vous avez déjà voté avec ${emoji} pour cette société`); } else { console.error('❌ Erreur vote:', data.error); } } } catch (error) { console.error('❌ Erreur API votes:', error); } } async function updateReactionCounts(companyId) { try { const response = await fetch(`${VOTES_API_URL}/votes/stats/${companyId}`); const data = await response.json(); if (data.success) { const likeCount = data.stats['👍'] || 0; const workCount = data.stats['🤝'] || 0; const likeEl = document.getElementById(`count-${companyId}-like`); const workEl = document.getElementById(`count-${companyId}-work`); if (likeEl) likeEl.textContent = likeCount; if (workEl) workEl.textContent = workCount; } } catch (error) { console.error('❌ Erreur API stats:', error); } } // Mettre à jour tous les compteurs au chargement async function updateAllReactionCounts() { // Récupérer tous les IDs de sociétés affichées const companyElements = document.querySelectorAll('[id^="count-"][id$="-like"]'); const companyIds = Array.from(companyElements).map(el => { const match = el.id.match(/count-(\d+)-like/); return match ? match[1] : null; }).filter(id => id !== null); // Mettre à jour les compteurs pour chaque société for (const companyId of companyIds) { await updateReactionCounts(companyId); } } // Ouvrir le dialogue de qualification function openQualificationModal(companyId) { const company = allCompanies.find(c => c.id === parseInt(companyId)); if (!company) return; // Pour l'instant, simple alert (on peut améliorer avec un vrai modal) const response = confirm(` DIALOGUE DE QUALIFICATION\n\nEntreprise : ${company.name}\n\nVoulez-vous démarrer le dialogue de qualification interactif ?\n\nNous allons vous poser quelques questions sur :\n• Votre entreprise\n• Votre besoin\n• Votre budget\n• Votre timeline\n• Vos contraintes`); if (response) { alert(`Dialogue de qualification démarré !\n\nVous allez être redirigé vers le formulaire de qualification pour ${company.name}.`); // Redirection vers le formulaire window.location.href = `create-problematique.html?provider=${companyId}&name=${encodeURIComponent(company.name)}`; } } // Gestion du menu Maturité function handleMaturityChange(level) { console.log('🔄 Changement de niveau de maturité:', level); // Récupérer les conteneurs de filtres const beginnerFilters = document.getElementById('beginner-filters'); const intermediateFilters = document.getElementById('intermediate-filters'); const expertsSection = document.getElementById('experts-section'); // Masquer/afficher la bannière audit novice const auditBanner = document.getElementById('novice-audit-banner'); if (auditBanner) { auditBanner.style.display = level === 'beginner' ? 'block' : 'none'; } // Récupérer les sections de filtres intermédiaires const conformiteDetails = document.querySelector('#intermediate-filters details:has(#conformite-container)'); const environnementsDetails = document.querySelector('#intermediate-filters details:has(#environnements-container)'); const tendancesDetails = document.querySelector('#intermediate-filters details:has(#tendances-container)'); const premiumSection = document.querySelector('.border-orange-500\\/50')?.closest('.space-y-3')?.parentElement; // Adapter l'affichage selon le niveau if (level === 'beginner') { // DÉBUTANT : Filtres Basiques Débutant + Filtres Intermédiaires (Solutions/Services seulement) document.getElementById('maturity-description').textContent = '🌱 Filtres simplifiés pour débuter en cybersécurité'; if (beginnerFilters) beginnerFilters.style.display = 'block'; if (intermediateFilters) intermediateFilters.style.display = 'block'; if (expertsSection) expertsSection.style.display = 'none'; // Masquer Conformité, Environnements, Tendances pour les débutants if (conformiteDetails) conformiteDetails.style.display = 'none'; if (environnementsDetails) environnementsDetails.style.display = 'none'; if (tendancesDetails) tendancesDetails.style.display = 'none'; if (premiumSection) premiumSection.style.display = 'none'; } else if (level === 'intermediate') { // INTERMÉDIAIRE : Filtres Intermédiaires UNIQUEMENT (tous affichés) document.getElementById('maturity-description').textContent = '🎓 Filtres avancés pour approfondir vos connaissances'; if (beginnerFilters) beginnerFilters.style.display = 'none'; if (intermediateFilters) intermediateFilters.style.display = 'block'; if (expertsSection) expertsSection.style.display = 'none'; // Afficher tous les filtres intermédiaires if (conformiteDetails) conformiteDetails.style.display = 'block'; if (environnementsDetails) environnementsDetails.style.display = 'block'; if (tendancesDetails) tendancesDetails.style.display = 'block'; if (premiumSection) premiumSection.style.display = 'block'; } else if (level === 'expert') { // EXPERT : Filtres Expert UNIQUEMENT (frameworks techniques) document.getElementById('maturity-description').textContent = '🔬 Filtres techniques basés sur les frameworks (NIST CSF, ECSF)'; if (beginnerFilters) beginnerFilters.style.display = 'none'; if (intermediateFilters) intermediateFilters.style.display = 'none'; if (expertsSection) expertsSection.style.display = 'block'; // Masquer les filtres intermédiaires (pas besoin en mode expert) if (conformiteDetails) conformiteDetails.style.display = 'none'; if (environnementsDetails) environnementsDetails.style.display = 'none'; if (tendancesDetails) tendancesDetails.style.display = 'none'; if (premiumSection) premiumSection.style.display = 'none'; // Ajouter des badges "Framework" aux labels pertinents addExpertLabels(); } // Réinitialiser les filtres actifs resetAllFilters(); } function addExpertLabels() { // Ajouter des badges techniques aux filtres pour les experts const conformiteContainer = document.getElementById('conformite-container'); if (conformiteContainer && !conformiteContainer.querySelector('.expert-badge')) { const labels = conformiteContainer.querySelectorAll('label'); labels.forEach(label => { const text = label.textContent; if (text.includes('ISO 27001')) { label.innerHTML = label.innerHTML.replace('ISO 27001', 'ISO 27001 NIST'); } else if (text.includes('RGPD') || text.includes('GDPR')) { label.innerHTML = label.innerHTML.replace(/RGPD|GDPR/, '$& EU'); } else if (text.includes('SOC')) { label.innerHTML = label.innerHTML.replace('SOC', 'SOC Audit'); } }); } } // Fonction pour toggle les sections function toggleSection(sectionId) { const section = document.getElementById('filter-' + sectionId); if (!section) { console.warn('⚠️ Section non trouvée:', 'filter-' + sectionId); return; } const button = section.previousElementSibling; if (!button) { console.warn('⚠️ Bouton non trouvé pour:', sectionId); return; } const icon = button.querySelector('.toggle-icon'); if (section.style.display === 'none' || section.style.display === '') { section.style.display = 'block'; if (icon) icon.textContent = '▼'; } else { section.style.display = 'none'; if (icon) icon.textContent = '▶'; } } // =============================== // QUICK FILTERS // =============================== let currentQuickFilter = 'all'; function setQuickFilter(type) { currentQuickFilter = type; // Update button states document.querySelectorAll('.quick-filter-btn').forEach(btn => { btn.classList.remove('active'); }); document.getElementById('quick-' + type).classList.add('active'); // Update active filter indicator const indicator = document.getElementById('active-quick-filters'); const filterText = document.getElementById('active-filter-text'); if (type === 'all') { indicator.classList.add('hidden'); } else { indicator.classList.remove('hidden'); const labels = { 'solution': 'Solutions uniquement', 'service': ' Services uniquement', 'services': ' Services uniquement', 'integrator': 'Intégrateurs uniquement', 'school': 'Écoles uniquement', 'association': 'Associations uniquement', 'campus': 'Campus Cyber uniquement' }; filterText.textContent = labels[type] || type; } // Re-apply all filters applyAllFilters(); } function clearQuickFilters() { setQuickFilter('all'); } function openTagsSearch() { // Créer une modale de recherche par tags const modal = document.createElement('div'); modal.className = 'fixed inset-0 bg-black/80 backdrop-blur-sm flex items-center justify-center z-[10000] p-4'; modal.innerHTML = `

Recherche par Tags

Associations, Certifications, Partenariats

Tags populaires

Commencez à taper pour voir les suggestions...

`; document.body.appendChild(modal); document.getElementById('tag-search-input').focus(); } function selectTag(tag) { // Ajouter le tag aux filtres actifs document.getElementById('search-input').value = tag; applyAllFilters(); // Fermer la modale document.querySelector('.fixed.inset-0').remove(); console.log('Tag sélectionné:', tag); } function filterTagList(query) { // TODO: Implémenter la recherche dans les tags const list = document.getElementById('all-tags-list'); if (!query) { list.innerHTML = '

Commencez à taper pour voir les suggestions...

'; return; } // Collecter tous les tags uniques const allTags = new Set(); allCompanies.forEach(c => { c.tags.forEach(t => allTags.add(t)); c.solutions.forEach(s => allTags.add(s)); c.services.forEach(s => allTags.add(s)); }); // Filtrer par recherche const filtered = Array.from(allTags) .filter(t => t.toLowerCase().includes(query.toLowerCase())) .slice(0, 20); // Limiter à 20 résultats if (filtered.length === 0) { list.innerHTML = '

Aucun tag trouvé

'; return; } list.innerHTML = filtered.map(tag => ` `).join(''); } // =============================== // MOBILE FILTER DRAWER // =============================== document.addEventListener('DOMContentLoaded', function() { const mobileToggle = document.getElementById('mobile-filter-toggle'); const filtersContainer = document.querySelector('#search-layout-container > div > div:first-child'); if (mobileToggle && filtersContainer) { // Ouvrir/fermer le drawer mobileToggle.addEventListener('click', function() { filtersContainer.classList.toggle('active'); // Créer/supprimer l'overlay let overlay = document.getElementById('mobile-filter-overlay'); if (filtersContainer.classList.contains('active')) { if (!overlay) { overlay = document.createElement('div'); overlay.id = 'mobile-filter-overlay'; overlay.style.cssText = 'position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; background: rgba(0,0,0,0.7); z-index: 9998;'; document.body.appendChild(overlay); // Fermer au clic sur overlay overlay.addEventListener('click', function() { filtersContainer.classList.remove('active'); overlay.remove(); }); } } else if (overlay) { overlay.remove(); } }); } });