Il est possible d'exécuter du Javascript dans un article Joomla comme pour trier un tableau en cliquant sur les en-têtes de colonnes.
Attention, par défaut les scripts sont nettoyés lors de l'enregistrement. Il faut donc les autoriser dans l'éditeur ainsi que dans Joomla en allant dans Configuration GlobaleFiltres de textes → et mettre "Aucun filtre" pour le type d'utilisateur⋅rice.
Pour JCE, il faut aller sur son profil via ProfilesEditor Parameters :

  • Cleanup & Output → Validate HTMLInherit (pour avoir le même paramétrage général de Joomla ci-dessus) ou Non
  • Advanced → et Allow Javascript ainsi que Allow CSS

Voici un exemple permettant de trier par ordre alphabétique pour du texte et ordre croissant/décroissant pour des nombres à virgules (le code est utilisé dans cette page : https://ddcm11.org/index.php/dossiers/88-point-sur-les-differents-projets-photovoltaiques-du-territoire) :

Commune Surfaces (ha) Stade
Bages 52,3 En projet
Bizanet 19,0 En projet
Camplong/Fabrezan 200,0 En projet
Cavanac 15,5 En projet
Conilhac-Corbières 34,0 En projet

 

Code dans la page d'article :

<style>
  table {
    border-collapse: collapse;
    width: auto;
    margin-bottom: 1em;
  }
  th, td {
    border: 1px solid #ccc;
    padding: 8px;
    text-align: left;
    cursor: pointer;
  }
  th.sorted-asc::after {
    content: " ▲";
    font-size: 0.8em;
  }
  th.sorted-desc::after {
    content: " ▼";
    font-size: 0.8em;
  }
</style>
<table id="monTableau">
<thead style="background-color: #e8e3e3;">
<tr><th style="border: 1px solid #000000; text-align: center;" onclick="trierColonne(this, 0)">Commune</th><th style="border: 1px solid #000000; text-align: center;" onclick="trierColonne(this, 1)">Surfaces (ha)</th><th style="border: 1px solid #000000; text-align: center;" onclick="trierColonne(this, 2)">Stade</th></tr>
</thead>
<tbody>
<tr>
<td style="border: 1px solid #000000;">Bages</td>
<td style="border: 1px solid #000000; text-align: right;">52,3</td>
<td style="border: 1px solid #000000; text-align: center;">En projet</td>
</tr>
<tr>
<td style="border: 1px solid #000000;">Bizanet</td>
<td style="border: 1px solid #000000; text-align: right;">19,0</td>
<td style="border: 1px solid #000000; text-align: center;">En projet</td>
</tr>
<tr>
<td style="border: 1px solid #000000;">Camplong/Fabrezan</td>
<td style="border: 1px solid #000000; text-align: right;">200,0</td>
<td style="border: 1px solid #000000; text-align: center;">En projet</td>
</tr>
<tr>
<td style="border: 1px solid #000000;">Cavanac</td>
<td style="border: 1px solid #000000; text-align: right;">15,5</td>
<td style="border: 1px solid #000000; text-align: center;">En projet</td>
</tr>
<tr>
<td style="border: 1px solid #000000;">Conilhac-Corbières</td>
<td style="border: 1px solid #000000; text-align: right;">34,0</td>
<td style="border: 1px solid #000000; text-align: center;">En projet</td>
</tr>
</tbody>
</table>
<script>
  let dernierTri = { index: null, asc: true };

  function trierColonne(th, indexColonne) {
    const table = th.closest("table");
    const tbody = table.querySelector("tbody");
    const lignes = Array.from(tbody.rows);

    const asc = dernierTri.index === indexColonne ? !dernierTri.asc : true;
    dernierTri = { index: indexColonne, asc };

    lignes.sort((a, b) => {
      let valA = a.cells[indexColonne].textContent.trim();
      let valB = b.cells[indexColonne].textContent.trim();

      // Tentative de conversion en nombre
      valA = valA.replace(/\s| /g, '').replace(',', '.');
      valB = valB.replace(/\s| /g, '').replace(',', '.');

      valA = isNaN(valA) ? valA : parseFloat(valA);
      valB = isNaN(valB) ? valB : parseFloat(valB);

      return asc
        ? (valA > valB ? 1 : -1)
        : (valA < valB ? 1 : -1);
    });

    lignes.forEach(row => tbody.appendChild(row));

    // Réinitialise les flèches de tri
    table.querySelectorAll("th").forEach(th => {
      th.classList.remove("sorted-asc", "sorted-desc");
    });

    // Applique la bonne flèche
    th.classList.add(asc ? "sorted-asc" : "sorted-desc");
  }
</script>