workload_tag_training_id const subcontractTagTrainingId = subcontract_tag_training_id const workloadTagOnSite = workload_tag_on_site const workloadTagRemote = workload_tag_remote const subcontractTagOnSite = subcontract_tag_on_site const subcontractTagRemote = subcontract_tag_remote const workloadCancelledStatuses = [] const subcontractCancelledStatuses = [] // Cache SVG inline — fetch une seule fois par icône, synchrone ensuite const _iconCache = {} async function preloadIcons(names) { await Promise.all((names || []).filter(Boolean).map(async name => { if (_iconCache[name]) return try { const r = await fetch('/images/' + name + '.svg') _iconCache[name] = r.ok ? await r.text() : '' } catch(e) { _iconCache[name] = '' } })) } // Retourne le SVG inline avec class/style injectés function iconSrc(name, opts = {}) { let svg = _iconCache[name] || '' if (!svg) return '' const cls = opts.class !== undefined ? opts.class : 'w-5 h-5' if (cls) svg = svg.replace('
OU