Créer un tableau de bord à onglets avec les composants Looker

Un exemple simple de la façon dont les composants d'interface utilisateur peuvent améliorer une application intégrée consiste à les utiliser pour créer une navigation par onglets pour les tableaux de bord:

Exemple de tableau de bord avec une interface à onglets

L'exemple suivant ajoute des tableaux de bord à onglets à une extension TypeScript de base créée à l'aide du framework d'extension de Looker.

Pour suivre cet exemple, assurez-vous que votre configuration respecte les conditions requises, puis procédez comme suit:

  1. Créez une extension TypeScript de base.
  2. Créez le fichier src/Dashboards.tsx pour associer et stocker des tableaux de bord.
  3. Créez le fichier src/Tabs.tsx pour stocker le composant Tabs.
  4. Remplacez la référence HelloWorld dans src/App.tsx.
  5. Mettez à jour le fichier manifest.lkml avec des droits d'accès intégrés.
  6. Publiez l'extension dans votre instance Looker.

Conditions requises

Vous aurez besoin de quelques éléments avant de commencer:

  • Vous devez avoir accès à une instance Looker sur laquelle Extension Framework est activé.
  • Vous devez disposer de l'autorisation develop.
  • Vous devez disposer de plusieurs tableaux de bord définis par l'utilisateur dans Looker à placer dans les onglets de l'interface utilisateur.
  • Que vous créiez dans le framework d'extension ou dans votre propre application React autonome, il est important de vous authentifier avec l'API de Looker et d'avoir accès à l'objet du SDK Looker. Pour en savoir plus, consultez la page sur l'authentification de l'API Looker ou notre framework d'extension.
  • Cet exemple utilise le SDK d'ingestion Looker. Pour autoriser l'exécution du SDK Embed sur votre instance, http://localhost:8080 doit être inclus dans la liste d'autorisation des domaines intégrés sur la page Intégration du panneau Administration.
  • Assurez-vous d'avoir installé le package NPM des composants Looker. Pour en savoir plus sur l'installation et l'utilisation du package de composants, consultez le document README, disponible sur GitHub et NPM.

Étape 1 : Créer une extension TypeScript de base

Suivez les instructions de la page de documentation Présentation de la création d'une extension Looker pour créer une extension. Pour transformer l'extension en extension TypeScript, appliquez les modifications suivantes:

  • Si vous utilisez l'outil create-looker-extension pour créer le modèle d'extension, sélectionnez TypeScript comme langage à utiliser à la deuxième étape.
  • Si vous clonez le dépôt Git pour créer le modèle d'extension, accédez au répertoire extension-examples/react/TypeScript/helloworld-ts à la deuxième étape.

Étape 2: Créez le fichier src/Dashboards.tsx pour associer et stocker les tableaux de bord

Dans le répertoire src de votre nouvelle extension, créez un fichier Dashboards.tsx. Ce fichier connectera et stockera les tableaux de bord que vous avez créés dans Looker.

Collez le code suivant dans le fichier. Ce code crée trois objets de tableau de bord et les spécifie par ID. Vous pouvez créer plus ou moins d'objets de tableau de bord, en fonction de vos besoins.

Le code d'une URL d'instance comporte trois emplacements : https://mycompany.looker.com. Remplacez-la par l'URL de votre instance Looker.

import React, { useCallback } from "react";
import { LookerEmbedSDK } from "@looker/embed-sdk";
import styled from "styled-components";

export const EmbeddedDashboard1 = (props: { id: number | string }) => {
 const [dashboard, setDashboard] = React.useState();
 const setupDashboard = (dashboard: any) => {
   setDashboard(dashboard);
 };
 const embedCtrRef = useCallback((el) => {
   const hostUrl = "https://mycompany.looker.com/";
   if (el && hostUrl) {
     el.innerHTML = "";
     LookerEmbedSDK.init(hostUrl);
     LookerEmbedSDK.createDashboardWithId(props.id)
       .withNext()
       .appendTo(el)
       .build()
       .connect()
       .then(setupDashboard)
       .catch((error) => {
         console.error("Connection error", error);
       });
   }
 }, []);
 return <EmbedContainer ref={embedCtrRef}></EmbedContainer>;
};

export const EmbeddedDashboard2 = (props: { id: number }) => {
 const [dashboard, setDashboard] = React.useState();
 const setupDashboard = (dashboard: any) => {
   setDashboard(dashboard);
 };
 const embedCtrRef = useCallback((el) => {
   const hostUrl = "https://mycompany.looker.com/";
   if (el && hostUrl) {
     el.innerHTML = "";
     LookerEmbedSDK.init(hostUrl);
     LookerEmbedSDK.createDashboardWithId(props.id)
       .withNext()
       .appendTo(el)
       .build()
       .connect()
       .then(setupDashboard)
       .catch((error) => {
         console.error("Connection error", error);
       });
   }
 }, []);
 return <EmbedContainer ref={embedCtrRef}></EmbedContainer>;
};

export const EmbeddedDashboard3 = (props: { id: number }) => {
 const [dashboard, setDashboard] = React.useState();
 const setupDashboard = (dashboard: any) => {
   setDashboard(dashboard);
 };
 const embedCtrRef = useCallback((el) => {
   const hostUrl = "https://mycompany.looker.com/";
   if (el && hostUrl) {
     el.innerHTML = "";
     LookerEmbedSDK.init(hostUrl);
     LookerEmbedSDK.createDashboardWithId(props.id)
       .withNext()
       .appendTo(el)
       .build()
       .connect()
       .then(setupDashboard)
       .catch((error) => {
         console.error("Connection error", error);
       });
   }
 }, []);

 return <EmbedContainer ref={embedCtrRef}></EmbedContainer>;
};

export const EmbedContainer = styled.div`
 width: 100%;
 height: 95vh;
 & > iframe {
   width: 100%;
   height: 100%;
 }
`;

Dans l'exemple de code précédent, les événements suivants se produisent :

  • Les instructions d'importation importent les dépendances nécessaires.

    import React, { useCallback } from "react";
    import { LookerEmbedSDK } from "@looker/embed-sdk";
    import styled from "styled-components";
    
  • Le bloc de code suivant crée un objet EmbeddedDashboard1, qui est un objet EmbedContainer contenant une iframe de tableau de bord. L'iframe est générée à partir du SDK d'ingestion Looker à l'aide de l'ID du tableau de bord qui lui est transmis. Veillez à remplacer https://mycompany.looker.com/ par l'URL de votre instance Looker.

    export const EmbeddedDashboard1 = (props: { id: number | string }) => {
    const [dashboard, setDashboard] = React.useState();
    const setupDashboard = (dashboard: any) => {
      setDashboard(dashboard);
    };
    const embedCtrRef = useCallback((el) => {
      const hostUrl = "https://mycompany.looker.com/";
      if (el && hostUrl) {
        el.innerHTML = "";
        LookerEmbedSDK.init(hostUrl);
        LookerEmbedSDK.createDashboardWithId(props.id)
          .withNext()
          .appendTo(el)
          .build()
          .connect()
          .then(setupDashboard)
          .catch((error) => {
            console.error("Connection error", error);
          });
      }
    }, []);
    return <EmbedContainer ref={embedCtrRef}></EmbedContainer>;
    };
    
  • Les deux blocs de code suivants répètent ce processus pour EmbeddedDashboard2 et EmbeddedDashboard3. Une fois encore, veillez à remplacer https://mycompany.looker.com/ par l'URL de votre instance Looker.

  • Le dernier bloc définit le style de EmbedContainer.

      export const EmbedContainer = styled.div`
        width: 100%;
        height: 95vh;
        & > iframe {
          width: 100%;
          height: 100%;
        }
    `;
    

Étape 3: Créez le fichier src/Tabs.tsx pour stocker le composant Tabs

Dans le répertoire src de votre nouvelle extension, créez un fichier Tabs.tsx. Ce fichier stocke le composant Tabs et référence l'ID de chaque tableau de bord Looker.

Dans ce fichier, collez le code suivant (la section qui suit explique ce que fait le code):

import React from "react";
import { ComponentsProvider, Tabs2, Tab2 } from "@looker/components";
import { EmbeddedDashboard1, EmbeddedDashboard2, EmbeddedDashboard3,
} from "./Dashboards";

export const Tabs = () => (
 <ComponentsProvider>
   <Tabs2>
     <Tab2 id="5" label="Order Analysis Dashboard">
      Order data from the last 12 months
       <EmbeddedDashboard1 id={5} />
     </Tab2>
     <Tab2 id="2" label="Inventory Dashboard">
       Current global inventory
       <EmbeddedDashboard2 id={2} />
     </Tab2>
     <Tab2 id="7" label="Customer Dashboard">
       Anonymized customer data
       <EmbeddedDashboard3 id={7} />
     </Tab2>
   </Tabs2>
 </ComponentsProvider>
)

Dans l'exemple de code précédent, voici ce qui se passe:

  • Les instructions d'importation importent les dépendances et les composants nécessaires, ainsi que les objets EmbeddedDashboard créés dans le fichier Dashboards.tsx.

    import React from "react";
    import { ComponentsProvider, Tabs2, Tab2 } from "@looker/components";
    import { EmbeddedDashboard1, EmbeddedDashboard2, EmbeddedDashboard3,
    } from "./Dashboard";
    
  • L'instruction d'exportation permet d'importer l'objet Tabs dans d'autres composants.

    export const Tabs = () => (
    
  • ComponentsProvider encapsule des composants individuels pour faciliter la thématisation.

    <ComponentsProvider>
    </ComponentsProvider>
    
  • Le composant Tabs2 et son composant enfant, Tab2, créent trois onglets et les associent aux tableaux de bord Looker.

     <Tabs2>
     <Tab2 id="5" label="Order Analysis Dashboard">
      Order data from the last 12 months
       <EmbeddedDashboard1 id={5} />
     </Tab2>
     <Tab2 id="2" label="Inventory Dashboard">
       Current global inventory
       <EmbeddedDashboard2 id={2} />
     </Tab2>
     <Tab2 id="7" label="Customer Dashboard">
       Anonymized customer data
       <EmbeddedDashboard3 id={7} />
     </Tab2>
    </Tabs2>
    
    • La propriété id de Tab2 accepte un ID d'onglet unique. Modifiez l'ID si nécessaire pour votre environnement.
    • L'objet label accepte le libellé qui apparaîtra dans chaque onglet. Modifiez l'ID en fonction du tableau de bord que vous utilisez.
    • Une chaîne placée à l'intérieur des balises Tab2 apparaîtra en haut de la zone de contenu de cet onglet. Mettez à jour ou supprimez la chaîne, si nécessaire.
    • Les objets EmbeddedDashboard1, EmbeddedDashboard1 et EmbeddedDashboard1 sont placés dans l'onglet. Les propriétés id acceptent l'ID du tableau de bord à intégrer dans cet onglet. Lorsque vous créez votre propre tableau de bord à onglets, remplacez cette valeur par l'ID du tableau de bord que vous souhaitez utiliser. L'ID numérique du tableau de bord se trouve dans l'URL après dashboards/. Par exemple, si l'URL est https://example.looker.com/dashboards/61?Recording+Date=10+weeks&Country=US, l'ID du tableau de bord sera 61.

Étape 4 : Remplacez la référence HelloWorld dans src/App.tsx

Accédez à votre fichier App.tsx dans le répertoire src. Supprimez l'instruction d'importation HelloWorld :

import { HelloWorld } from './HelloWorld'

et remplacez-le par :

import { Tabs } from './Tabs'

De plus, dans le fichier src/App.tsx, remplacez <HelloWorld/> par <Tabs/>.

Vous pouvez également supprimer le fichier HelloWorld.tsx de ce répertoire, car vous ne l'utiliserez plus.

Étape 5 : Mettez à jour le fichier manifest.lkml avec le droit d'intégration

Ajoutez le droit suivant à la section des droits du fichier manifest.lkml de votre projet LookML:

use_embeds: yes

Le fichier manifest.lkml devrait se présenter comme suit:

application: name {
  label: "label"
  url: "http://localhost:8080/bundle.js"
  # file: "bundle.js
  entitlements: {
    core_api_methods: ["me"] #Add more entitlements here as you develop new functionality
    use_embeds: yes
  }
}

Vous pouvez maintenant accéder à votre extension, qui apparaît dans le dossier Applications du panneau de navigation de gauche. Si vous avez démarré votre serveur de développement local avec yarn develop, vous pouvez voir les tableaux de bord intégrés sous forme d'onglets.

Étape 6 : Publiez l'extension dans votre instance Looker

Pour afficher l'extension aux autres utilisateurs de Looker, publiez-la dans votre instance Looker en procédant comme suit :

  1. Une fois le serveur de développement en cours d'exécution, accédez à localhost:8080/bundle.js.
  2. Enregistrez le contenu de la fenêtre du navigateur localement sur votre ordinateur dans un fichier .js.
  3. Assurez-vous d'être en mode Développement, puis glissez-déposez le fichier .js dans votre projet d'extension. Enregistrez les modifications.
  4. Dans le fichier manifest.lkml, commentez la ligne url: "http://localhost:8080/bundle.js".
  5. Dans le fichier manifest.lkml, supprimez le commentaire de la ligne # file: "bundle.js" et assurez-vous que le nom du fichier correspond à celui du fichier .js que vous avez importé dans votre projet. Enregistrez les modifications.
  6. Validez et déployez vos modifications.

Une fois l'extension déployée, vous n'aurez plus besoin de démarrer votre serveur de développement local pour la voir. De plus, les utilisateurs de votre instance Looker devraient pouvoir voir l'extension s'ils y accèdent dans le dossier Applications du panneau de navigation de gauche.