HTML 82.1%
Python 14.6%
TypeScript 1.9%
CSS 1%
JavaScript 0.5%
1/**2 * =============================================================================3 * Job·Ka — Groupe KA4 * Auteur : Simon-Pierre Boucher5 * Contact : contact@spboucher.ai6 * Fichier : frontend/src/pages/Sources.tsx7 * Rôle : Registre public des employeurs connectés (traçabilité des sources)8 * Créé : 2026-08-17 Modifié : 2026-08-179 * =============================================================================10 */11import { useEffect, useState } from "react";12import { fetchSources, Source } from "../api";1314export default function Sources() {15 const [sources, setSources] = useState<Source[]>([]);1617 useEffect(() => { fetchSources().then((r) => setSources(r.sources)).catch(() => {}); }, []);1819 return (20 <main className="container">21 <h1 className="section-title" style={{ fontSize: 24, marginTop: 28 }}>Employeurs connectés</h1>22 <p className="muted">23 Chaque source est un connecteur automatisé vers la page carrière officielle24 de l'employeur, resynchronisé jour et nuit. Zéro saisie manuelle.25 </p>26 <table className="data" style={{ margin: "18px 0 40px" }}>27 <thead>28 <tr>29 <th>Employeur</th><th>Secteurs</th><th>Région</th><th>ATS</th>30 <th>Offres actives</th><th>Dernière synchro</th>31 </tr>32 </thead>33 <tbody>34 {sources.map((s) => (35 <tr key={s.id}>36 <td><a href={s.careers_url || s.url} target="_blank" rel="noopener noreferrer">{s.name}</a></td>37 <td>{s.sectors.join(", ")}</td>38 <td>{s.region}</td>39 <td>{s.connector}</td>40 <td>{s.active_jobs}</td>41 <td>42 {s.last_sync43 ? new Date(s.last_sync * 1000).toLocaleString("fr-CA", { dateStyle: "medium", timeStyle: "short" })44 : "—"}45 </td>46 </tr>47 ))}48 </tbody>49 </table>50 </main>51 );52}53