Skip to content

Widget par CDN ​

En bref

Objectif — afficher un plan de salle interactif sur une page web, sans outillage. Prérequis — une clé publique pk_live_…, un événement dont le plan est publié. Temps — 5 minutes.

Le widget se charge par une balise <script> et expose l'objet global Mitoera. Pas de bundler, pas de build : c'est la voie à privilégier pour un site WordPress, un template serveur ou une page statique.

Intégration minimale ​

html
<div id="mitoera-chart" style="width:100%;height:600px"></div>

<script src="https://bo.mitoera.com/mitoera-widget.js"></script>
<script>
  new Mitoera.SeatingChart({
    divId:        'mitoera-chart',
    workspaceKey: 'pk_live_xxxxxxxx',
    event:        'concert-12-mars',
  }).render();
</script>

Trois options suffisent : où afficher, avec quelle clé, quel événement. Le reste a des valeurs par défaut raisonnables.

Le conteneur doit avoir une hauteur

Le widget remplit son <div>. Un conteneur sans hauteur explicite s'affiche donc… vide. height:600px, height:70vh ou une hauteur héritée d'une grille : au choix, mais quelque chose.

Réagir aux actions de l'utilisateur ​

html
<div id="mitoera-chart" style="width:100%;height:600px"></div>
<p id="resume">Aucun siège sélectionné</p>

<script src="https://bo.mitoera.com/mitoera-widget.js"></script>
<script>
  const chart = new Mitoera.SeatingChart({
    divId:        'mitoera-chart',
    workspaceKey: 'pk_live_xxxxxxxx',
    event:        'concert-12-mars',
    showLegend:   true,
    showResume:   true,

    onReady: ({ sessionToken, holdToken, eventId }) => {
      // Le plan est chargé et la session ouverte
    },

    onSelectionChange: (seats) => {
      document.getElementById('resume').textContent =
        seats.length ? `${seats.length} siège(s) : ${seats.map(s => s.seatKey).join(', ')}`
                     : 'Aucun siège sélectionné';
    },

    onCheckout: (seats) => {
      // L'utilisateur valide → on passe au paiement
      fetch('/api/panier', {
        method:  'POST',
        headers: { 'Content-Type': 'application/json' },
        body:    JSON.stringify({ seats: seats.map(s => s.seatKey) }),
      }).then(() => location.href = '/paiement');
    },
  });

  chart.render();
</script>

La liste complète des options, callbacks et méthodes est sur SeatingChart — elle vaut pour le CDN comme pour npm.

Passer en sandbox ​

Une seule chose change : la clé.

js
workspaceKey: 'pk_test_xxxxxxxx',   // au lieu de pk_live_

Dépannage ​

SymptômeCause probableCorrectif
Le conteneur reste vide<div> sans hauteurDonner une hauteur CSS explicite
Mitoera is not definedLe script s'exécute avant le CDNPlacer votre <script> après celui du widget, ou l'envelopper dans DOMContentLoaded
« Événement introuvable »Slug erroné, ou événement d'un autre workspaceVérifier l'identifier et que la clé appartient au bon workspace
Le plan s'affiche vide, sans siègesPlan non publiéPublier le plan : POST /api/charts/{chartId}/publish
Les sièges ne se sélectionnent pasSièges canceled, ou événement sans plan liéVérifier GET /api/events/{eventId}/seats
Clé refuséeClé secrète utilisée à la place de la publiqueLe widget attend pk_live_… / pk_test_…, jamais keyId:secret

Bonnes pratiques ​

Ne mettez jamais la clé secrète dans cette page. Le widget n'en a pas besoin : il ne fait que lire et poser des holds.

Appelez render() une seule fois. Pour recharger un autre événement, appelez destroy() puis construisez une nouvelle instance.

En navigation SPA, nettoyez. chart.destroy() au démontage du composant supprime l'iframe et les écouteurs postMessage.

Suite ​

API, SDK et widget de plans de salle.