/* Barre d'apps commune dracodev — comportement (v0.1.0, ACC-0.2) * * Aucun gestionnaire inline : un seul écouteur délégué sur le document * (patron validé par le prototype — les onclick du HTML généré sont * proscrits dans tout le programme). * * Configuration attendue avant le chargement : * window.DRACO_BAR_CONFIG = { * current: "tiktak", // app courante * domain: "pro", // domaine actif * counts: { tiktak: 3, kanbante: 3, alertes: 3, spark: 0 }, * onAction: function (act, el) { … } // l'app relaie les actions * } // qu'elle ne connaît pas * Actions émises (data-act) : rail, palette, domaine (data-dom), * alertes, spark, menu, rappel-entete. L'app intégratrice décide de * chacune (ouvrir la palette, le panneau Spark, changer de domaine…). */ (function () { "use strict"; var cfg = window.DRACO_BAR_CONFIG || {}; function setCounts(counts) { Object.keys(counts || {}).forEach(function (k) { var b = document.querySelector('.draco-badge[data-badge="' + k + '"]'); if (!b) return; b.textContent = counts[k]; b.hidden = !(counts[k] > 0); }); } function setCurrent(app) { document.querySelectorAll(".draco-apptab").forEach(function (t) { t.dataset.active = t.dataset.app === app ? "true" : "false"; }); } function setDomain(dom) { document.querySelectorAll('.draco-domaines [data-dom]').forEach(function (b) { b.dataset.on = b.dataset.dom === dom ? "true" : "false"; }); } document.addEventListener("click", function (ev) { var el = ev.target.closest("[data-act]"); if (!el) return; var act = el.dataset.act; if (act === "domaine") setDomain(el.dataset.dom); if (typeof cfg.onAction === "function") cfg.onAction(act, el, ev); else document.dispatchEvent(new CustomEvent("draco:bar", { detail: { act: act, el: el } })); }); /* API publique : l'app met les compteurs à jour sans recharger. */ window.DRACO_BAR = { setCounts: setCounts, setCurrent: setCurrent, setDomain: setDomain }; if (cfg.current) setCurrent(cfg.current); if (cfg.domain) setDomain(cfg.domain); if (cfg.counts) setCounts(cfg.counts); })();