Como criar um painel com guias usando componentes do Looker

Um exemplo simples de como os componentes da interface podem melhorar um aplicativo incorporado é usá-los para criar navegação com guias para painéis:

Um painel de amostra com uma interface com guias.

O exemplo a seguir adiciona painéis com guias a uma extensão básica do TypeScript criada usando a estrutura de extensão do Looker.

Para seguir este exemplo, verifique se a configuração atende aos requisitos e siga estas etapas:

  1. Crie uma extensão do TypeScript básica.
  2. Crie o arquivo src/Dashboards.tsx para conectar e armazenar painéis.
  3. Crie o arquivo src/Tabs.tsx para armazenar o componente Tabs.
  4. Substitua a referência HelloWorld em src/App.tsx.
  5. Atualize o arquivo manifest.lkml com o direito de incorporação.
  6. Publicar a extensão na sua instância do Looker.

Requisitos

Você precisa de alguns elementos antes de começar:

Etapa 1: criar uma extensão básica do TypeScript

Siga as instruções na página de documentação Introdução à criação de uma extensão do Looker para criar uma extensão. Para fazer com que a extensão seja uma extensão do TypeScript, use as seguintes modificações:

Etapa 2: criar o arquivo src/Dashboards.tsx para conectar e armazenar painéis

No diretório src da nova extensão, crie um arquivo Dashboards.tsx. Esse arquivo vai conectar e armazenar os dashboards que você criou no Looker.

No arquivo, cole o seguinte código. Esse código cria três objetos de painel e os especifica por ID. É possível criar mais ou menos objetos do dashboard, dependendo das suas necessidades.

Há três locais no código de um URL de instância, https://mycompany.looker.com. Mude para o URL da instância do 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%;
 }
`;

No exemplo de código anterior, as seguintes coisas estão acontecendo:

  • As instruções de importação trazem as dependências necessárias.

    import React, { useCallback } from "react";
    import { LookerEmbedSDK } from "@looker/embed-sdk";
    import styled from "styled-components";
    
  • O próximo bloco de código cria um objeto EmbeddedDashboard1, que é um objeto EmbedContainer que contém um iframe do painel. O iframe é gerado pelo SDK de incorporação do Looker usando o ID do painel transmitido a ele. Atualize https://mycompany.looker.com/ para o URL da instância do 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>;
    };
    
  • Os dois blocos de código a seguir repetem esse processo para EmbeddedDashboard2 e EmbeddedDashboard3. Mais uma vez, atualize https://mycompany.looker.com/ para o URL da instância do Looker.

  • O bloco final estiliza o EmbedContainer.

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

Etapa 3: criar o arquivo src/Tabs.tsx para armazenar o componente Tabs

No diretório src da nova extensão, crie um arquivo Tabs.tsx. Esse arquivo armazena o componente Tabs e faz referência ao ID do painel do Looker para cada painel.

Dentro desse arquivo, cole o seguinte código (a seção seguinte explica o que o código está fazendo):

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>
)

No exemplo de código anterior, o seguinte acontece:

  • As instruções de importação estão trazendo as dependências e os componentes necessários, além dos objetos EmbeddedDashboard que foram criados no arquivo Dashboards.tsx.

    import React from "react";
    import { ComponentsProvider, Tabs2, Tab2 } from "@looker/components";
    import { EmbeddedDashboard1, EmbeddedDashboard2, EmbeddedDashboard3,
    } from "./Dashboard";
    
  • A instrução de exportação disponibiliza o objeto Tabs para ser importado para outros componentes.

    export const Tabs = () => (
    
  • O ComponentsProvider une componentes individuais para ajudar na aplicação de temas.

    <ComponentsProvider>
    </ComponentsProvider>
    
  • O componente Tabs2 e o filho, Tab2, criam três guias e as vinculam aos painéis do 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>
    
    • A propriedade id de Tab2 aceita um ID de guia exclusivo. Atualize o ID conforme necessário para seu ambiente.
    • A propriedade label aceita o rótulo que aparecerá em cada guia. Atualize o ID conforme apropriado para o painel que você está usando.
    • Uma string colocada dentro das tags Tab2 aparecerá na parte superior da área de conteúdo dessa guia. Atualize ou remova a string conforme necessário.
    • Os objetos EmbeddedDashboard1, EmbeddedDashboard1 e EmbeddedDashboard1 são colocados na guia. As propriedades id aceitam o ID do painel a ser incorporado a essa guia. Ao criar seu próprio dashboard com guias, substitua esse valor pelo ID do dashboard que você quer usar. O ID numérico do painel pode ser encontrado no URL, depois de dashboards/. Por exemplo, se o URL for https://example.looker.com/dashboards/61?Recording+Date=10+weeks&Country=US, o ID do painel será 61.

Etapa 4: substituir a referência HelloWorld em src/App.tsx

Navegue até o arquivo App.tsx no diretório src. Remova a instrução de importação HelloWorld:

import { HelloWorld } from './HelloWorld'

e substitua por:

import { Tabs } from './Tabs'

Além disso, no arquivo src/App.tsx, substitua <HelloWorld/> por <Tabs/>.

Se quiser, você também pode excluir o arquivo HelloWorld.tsx desse diretório, já que não vai mais usá-lo.

Etapa 5: atualizar o arquivo manifest.lkml com o direito de incorporação

Adicione o seguinte direito à seção de direitos do arquivo manifest.lkml no projeto do LookML:

use_embeds: yes

O arquivo manifest.lkml vai ficar assim:

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
  }
}

Agora, navegue até sua extensão, que aparece na pasta Aplicativos no painel de navegação esquerdo. Se você iniciou o servidor de desenvolvimento local com yarn develop, pode ver os painéis incorporados com guias.

Etapa 6: publicar a extensão na sua instância do Looker

Para mostrar a extensão a outros usuários do Looker, publique a extensão na sua instância do Looker seguindo estas etapas:

  1. Com o servidor de desenvolvimento em execução, navegue até localhost:8080/bundle.js.
  2. Salve o conteúdo da janela do navegador localmente no computador como um arquivo .js.
  3. Verifique se você está no modo de desenvolvimento e arraste e solte o arquivo .js no projeto de extensão. Salve as alterações.
  4. No arquivo manifest.lkml, comente a linha url: "http://localhost:8080/bundle.js".
  5. No arquivo manifest.lkml, remova a marca de comentário da linha # file: "bundle.js" e verifique se o nome corresponde ao do arquivo .js enviado para o projeto. Salve as alterações.
  6. Confirme e implante suas mudanças.

Depois do deployment, não será mais necessário iniciar o servidor de desenvolvimento local para acessar a extensão. Os usuários na sua instância do Looker poderão acessar a extensão na pasta Applications no painel de navegação à esquerda.