Développement pour Sidekick

L’objectif de ce document est d’expliquer comment les développeurs peuvent interagir avec le sidekick et comment le personnaliser au niveau du projet.

Événements

Le sidekick émet les événements suivants :

Nom de l’événement
Élément cible
Payload
Description
sidekick-ready
document
-
L’élément sidekick comporte les éléments suivants : a été ajouté au DOM et est prêt à l’emploi.
previewed
aem-sidekick
(chaîne) Le(s) chemin(s) d’accès de la ressource prévisualisée
Le bouton Aperçu a été a cliqué.
updated
aem-sidekick
(chaîne) Chemin d’accès de l’élément ressource mise à jour
Le bouton Recharger a été a cliqué.
published
aem-sidekick
(chaîne) Chemin d’accès de l’élément ressource publiée
Le bouton Publier a été a cliqué.
deleted
aem-sidekick
(chaîne) Chemin d’accès de l’élément ressource supprimée
Le bouton Supprimer a été a cliqué.
unpublished
aem-sidekick
(chaîne) Chemin d’accès de l’élément ressource dépubliée
Le bouton Dépublier comporte les éléments suivants : a été cliqué.
env-switched
aem-sidekick

(objet) Un objet avec propriétés suivantes :

  • (string) sourceUrl : la URL source
  • (string) targetUrl : la URL cible
L’utilisateur a changé de environnement.
plugin-used
aem-sidekick
(chaîne) Identifiant du plug-in
Un bouton de plug-in a été cliqué
logged-in
aem-sidekick
(objet) Objet profile
L'utilisateur s'est connecté.
logged-out
aem-sidekick
(objet) Objet profile
L’utilisateur s’est déconnecté.
status-fetched
aem-sidekick
(objet) L’objet status
Statut d’une ressource a été récupéré à partir de API Admin
custom:<name>
aem-sidekick

(objet) Un objet avec propriétés suivantes :

  • (objet) config : le configuration du sidekick
  • (objet) emplacement : le objet d’emplacement
  • (objet) statut : le objet status
Plug-in basé sur un événement personnalisé Un clic a été effectué sur le bouton .

La payload d’un événement se trouve dans la propriété event.detail .

Écoute des événements

Dans le code de votre projet (par exemple, dans /scripts/scripts.js), vous pouvez réagir aux événements du sidekick comme suit (remplacez foo par le nom de l’événement que vous souhaitez écouter) :

const doFoo = ({ detail: payload }) => {
  console.log('something happened', payload);
  // your custom code goes here
};

const sk = document.querySelector('aem-sidekick');
if (sk) {
  // sidekick already loaded
  sk.addEventListener('foo', doFoo);
} else {
  // wait for sidekick to be loaded
  document.addEventListener('sidekick-ready', () => {
    // sidekick now loaded
    document.querySelector('aem-sidekick')
      .addEventListener('foo', doFoo);
  }, { once: true });
}

Personnalisation du Sidekick

Vous pouvez personnaliser le sidekick pour votre projet. Vous pouvez ajouter un fichier de configuration /tools/sidekick/config.json au référentiel GitHub de votre projet ou utiliser le service de configuration.

{
  "project": "My project",
  "host": "www.mydomain.prod",
  "plugins": []
}

Pour toutes les options de configuration disponibles, consultez le schéma de configuration. Voici quelques principes de base pour commencer :

Modules externes

Les modules externes vous permettent d’ajouter des fonctionnalités personnalisées au sidekick, améliorant ainsi l’expérience de vos utilisateurs.

Propriétés communes du plug-in

Les propriétés suivantes s’appliquent à tous les types de plug-in :

  • id (chaîne) est obligatoire et doit être unique dans une configuration de sidekick.
  • title (chaîne) s’affiche sur le bouton du plug-in.
  • titleI18n (objet&lt;chaîne, chaîne>) définit les titres traduits de manière facultative.
  • pinned (booléen) détermine si le module externe est épinglé sur la barre d’outils (par défaut) ou s’il est plié dans le menu … .
  • environments (chaîne[]) indique l’emplacement où le module externe doit apparaître (développement, modification, administration, prévisualisation, dynamique ou production).
  • exclude_paths (chaîne[]) définit des modèles pour exclure le module externe en fonction du chemin d’accès dans l’URL de l’onglet actif.
  • include_paths (chaîne[]) définit des modèles pour inclure le module externe en fonction du chemin d’accès dans l’URL de l’onglet actif.

Plug-ins basés sur une URL

Vous pouvez spécifier un url qui s’ouvrira dans un nouvel onglet lorsque vous cliquerez sur le bouton du plug-in :

{
  "plugins": [
    {
      "id": "foo",
      "title": "Foo",
      "url": "/tools/sidekick/foo.html"
    }
  ]
}

Plug-ins basés sur un événement

Vous pouvez également spécifier le nom d’un event à déclencher lorsque vous cliquez sur le bouton du plug-in. Cela permet l’exécution de code JavaScript personnalisé dans le contexte de votre page en écoutant l’événement sur l’élément de sidekick. Les événements personnalisés comportent un préfixe custom:. Pour votre commodité, l’événement personnalisé distribué contient une copie de l’état actuel du sidekick.

Remarque : les modules externes basés sur des événements ne peuvent être utilisés que dans les environnements suivants : Développement, Aperçu, En direct et Production. L’exécution de code personnalisé n’est pas possible dans Modifier ou Admin.

{
  "plugins": [
    {
      "id": "foo",
      "title": "Foo",
      "event": "foo"
    }
  ]
}

Dans le code de votre projet (par exemple, dans /scripts/scripts.js), vous pouvez réagir à l’événement comme suit :

const doFoo = ({ detail: payload }) => {
  console.log('a custom event happened', payload);
  // your custom code goes here
};

const sk = document.querySelector('aem-sidekick');
if (sk) {
  // sidekick already loaded
    sk.addEventListener('custom:foo', doFoo);
} else {
  // wait for sidekick to be loaded
  document.addEventListener('sidekick-ready', () => {
    // sidekick now loaded
    document.querySelector('aem-sidekick')
      .addEventListener('custom:foo', doFoo);
  }, { once: true });
}

Types de plug-ins spéciaux

Plug-ins de palette

Les palettes sont des variantes de modules externes basés sur des URL qui chargent l’URL configurée en ligne au lieu d’ouvrir un nouvel onglet.

  • isPalette (booléen) ouvre la cible d’un module externe basé sur une URL dans une palette au lieu d’un nouvel onglet.
  • paletteRect (chaîne) définit éventuellement la taille et la position de la palette au format DOMRect.

L'exemple suivant crée une palette standard placée en bas à gauche de la fenêtre :

{
  "plugins": [
    {
      "id": "tools",
      "title": "Tools",
      "url": "/tools/sidekick/foo-palette.html",
      "isPalette": true
    }
  ]
}

Si vous souhaitez modifier la taille et le positionnement de votre palette, utilisez paletteRect :

{
  "plugins": [
    {
      "id": "tools",
      "title": "Tools",
      "url": "/tools/sidekick/foo-palette.html",
      "isPalette": true,
      "paletteRect": "top:150px;left:7%;height:675px;width:85vw;"
    }
  ]
}

Plug-ins de conteneur

Les conteneurs vous permettent de regrouper des modules externes et d’économiser de l’espace dans la barre d’outils. Cliquez sur un plug-in de conteneur pour simplement activer/désactiver sa liste déroulante. Il ne peut pas avoir sa propre URL ou action d’événement.

  • isContainer (booléen) effectue le rendu d’un module externe sous la forme d’une liste déroulante au lieu d’un bouton.
  • containerId (chaîne) ajoute un module externe à un module externe de conteneur avec l’ID spécifié.

L’exemple suivant crée un conteneur nommé « Tools » et y place un module externe « Foo » :

{
  "plugins": [
    {
      "id": "tools",
      "title": "Tools",
      "isContainer": true
    },
    {
      "id": "foo",
      "containerId": "tools",
      "title": "Foo",
      "event": "foo"
    }
  ]
}

Plug-ins de badge

Les badges vous permettent d’ajouter des libellés au sidekick sous certaines conditions. Ils sont rendus sur le côté droit de la barre d’outils. Les badges ont un simple objectif décoratif et ne peuvent pas être utilisés.

  • isBadge (booléen) effectue le rendu d’un module externe sous la forme d’un badge au lieu d’un bouton.
  • badgeVariant (chaîne) détermine éventuellement le jeu de couleurs du badge (gris, rouge, orange, jaune, chartreuse, céleri, vert, écume de mer, cyan, bleu, indigo, violet, fuchsia ou magenta)

L’exemple suivant ajoute un badge « Phase » au sidekick dans l’environnement de prévisualisation :

{
  "plugins": [
    {
      "id": "stage",
      "title": "Stage",
      "isBadge": true,
      "environments" ["preview"]
    }
  ]
}

URL de modification personnalisées

Si votre projet n’utilise pas SharePoint ou Google Drive comme source de contenu, vous pouvez indiquer au sidekick comment créer un lien vers votre environnement de modification personnalisé lorsque l’utilisateur clique sur Modifier.

Les deux options de configuration suivantes sont disponibles :

  • editUrlLabel (chaîne) définit le libellé visible par l’utilisateur
  • editUrlPattern (chaîne) définit un modèle d’URL pour l’environnement d’édition personnalisé. Prend en charge les espaces réservés tels que {{contentSourceUrl}} ou {{pathname}}.
{
  "editUrlLabel": "Your Editor",
  "editUrlPattern": "{{contentSourceUrl}}{{pathname}}?cmd=open"
}

Vues spéciales

Vous pouvez spécifier une vue spéciale vers laquelle le sidekick redirige lorsque l’URL de l’onglet actif correspond à un certain modèle. Cela peut vous aider à offrir une expérience utilisateur transparente sur différents types de médias et permet également l’exécution de code personnalisé (modules externes basés sur un événement). L’URL de la ressource d’origine sera disponible dans un paramètre de requête url.

Les propriétés path et viewer sont obligatoires. Si vous le souhaitez, vous pouvez spécifier une title qui s’affichera en haut et fournir des titres localisés dans un objet titleI18n :

{
  "specialViews": [
    {
      "title": "Custom JSON Viewer",
      "path" : "**.json",
      "viewer": "/tools/sidekick/custom-json-viewer/index.html"
    }
  ]
}

Au chemin d’accès spécifié par viewer, ajoutez un fichier HTML à votre référentiel GitHub, par exemple :

<html>
<head>
  <title>Custom JSON Viewer</title>
  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="./custom-json-viewer.css">
  <!-- add your custom code -->
  <script src="./custom-json-viewer.js"></script>
</head>
  <body>
  </body>
</html>

Ajoutez un fichier CSS facultatif dans le même répertoire et un fichier JS avec votre logique personnalisée, par exemple :

try {
  // get the resource URL from the url query parameter
  const url = new URL(window.location.href).searchParams.get('url');
  if (url) {
    const res = await fetch(url);
    if (res.ok) {
      const text = await res.text();
      const data = JSON.parse(text);
      // do something with the data, e.g.
      document.body.innerHTML = `
        <pre>
          ${JSON.stringify(data, null, 2)}
        </pre>
       `;
    } else {
      throw new Error(`failed to load ${url}: ${res.status}`);
    }
  }
} catch (e) {
  console.error('error rendering custom json view', e);
}

Workflow de développement

Les workflows suivants sont conçus pour le développement de sidekick détaché afin d’éviter toute perturbation involontaire des auteurs sur votre site de production :

Utilisation d’une copie de site

Si la configuration de votre site est stockée dans le Service de configuration, vous pouvez utiliser des copies de site temporaires pour le développement du sidekick :

  1. Créez une copie de votre site dans le service de configuration. Par exemple, si le nom de votre site d’origine est site1, vous pouvez créer un site1-dev en réutilisant le même code et le même contenu.
  2. Ouvrez l’URL d’aperçu pour site1-dev dans votre navigateur : https://main--site1-dev--org.aem.page.
  3. Apportez les modifications souhaitées à l’objet sidekick dans la configuration site1-dev.
  4. Actualisez l’onglet du navigateur après chaque modification pour tester vos modifications.
  5. Une fois cette opération terminée, copiez l’objet sidekick de site1-dev vers la configuration site1 pour déployer vos modifications sur tous les auteurs.

Remarque : lors de l’utilisation du sidekick dans un environnement d’éditeur (Google Drive ou Microsoft Sharepoint), il charge la configuration à partir du site d’origine par défaut. Si vous souhaitez que le sidekick vous permette de choisir la configuration à charger, commencez par ajouter le nouveau site à votre sidekick à partir de l’aperçu ou de l’URL active. Le sidekick affiche désormais un sélecteur avec tous les sites correspondants.

Utilisation d’une branche de référentiel

Si la configuration de votre site n’est pas stockée dans le Service de configuration, vous pouvez utiliser une branche dans GitHub pour le développement du sidekick :

  1. Sur le référentiel GitHub de votre site, créez une branche à partir de main. Pour cet exemple, nous utiliserons dev comme nom de branche.
  2. Ouvrez l’URL d’aperçu de la branche dev dans votre navigateur : https://dev--site1--org.aem.page.
  3. Ouvrez ou créez le fichier suivant dans votre référentiel : /tools/sidekick/config.json.
  4. Apportez les modifications souhaitées au fichier de configuration du sidekick et envoyez les modifications à la branche dev.
  5. Actualisez l’onglet du navigateur après chaque modification pour tester vos modifications.
  6. Une fois cette opération terminée, créez une demande d’extraction et fusionnez les modifications apportées à la branche main de votre référentiel.

Attention : ne validez jamais directement la branche main de votre référentiel d’origine. Créez toujours une branche et demandez une révision de vos modifications par le biais d’une demande d’extraction avant de fusionner dans main.

Remarque : lors de l’utilisation du sidekick dans un environnement d’éditeur (Google Drive ou Microsoft Sharepoint), il charge la configuration à partir du site d’origine par défaut. Si vous souhaitez que le sidekick vous permette de choisir la configuration à charger, commencez par ajouter le nouveau site à votre sidekick à partir de l’aperçu ou de l’URL active. Le sidekick affiche désormais un sélecteur avec tous les sites correspondants.

recommendation-more-help
10a6ce9d-c5c5-48d9-8ce1-9797d2f0f3ec