Embedded Data Discovery Dashboard JavaScript Example

This applies to: Visual Data Discovery

The following JavaScript example uses methods, properties, and embedded events of the EmbedManager class to embed, refresh, reauthenticate, and remove a dashboard.

  • The createOrGetEmbedManager asynchronous function provides an initial access token using Trusted Access.

  • The addDashboard asynchronous function embeds a dashboard in the application. It uses the dashboard ID as input so it knows which dashboard to embed. It also specifies some properties for the dashboard.

  • The clearDashboard asynchronous function removes a dashboard from the application. It uses the dashboard ID as input so it knows which dashboard to remove.

  • The refreshDashboard asynchronous function refreshes the authorization token for the embedded dashboard using Trusted Access.

  • The application asynchronous function at the end combines the use of all the previous functions and uses embedded events to trigger some of them.

The Symphony EmbedManager class must be made available to your HTML application prior to using this sample in your application. See Embed Symphony Components Using JavaScript and Trusted Access.

Symphony provides a componentInstanceId provides a as part of event details for dashboard, source, and visual events.

async function createOrGetEmbedManager(<token>) {
   return window.initComposerEmbedManager({ //embed manager is a singleton and will be created only on the first call
      getToken: function () {
          // transform for the embed syntax
          return getToken().then((result) => {
              return {
                  "access_token": "result.token",
                  "expires_in": "result.expiresIn",
              };
          });
      }
   });
}

async function addDashboard(<id>) { // id of the composer dashboard
   const embedManager = await createOrGetEmbedManager();

   const dashboard = await embedManager.createComponent('dashboard', {
      "dashboardId": "<id>", // required
      "theme": "composer",
      "interactivityProfileName": "interactive",
      interactivityOverrides {
        "settings":{
           "CHANGE_LAYOUT": true,
        },
        "visualSettings":{
           "FILTER": false,
        },
     },
     "editor": {
         "placement": "dockRight" // use eve sidepanel
      },
      "header": {
         "visible": true,
         "showTitle": true,
         "showActions": false, // will hide actions bar
         "title": "Static custom title"
      }
   });

   dashboard.render(document.querySelector('#dashboard'), { width: '800px', height: '400px' });
   return dashboard;
}

async function clearDashboard(<id>) {
   const embedManager = await createOrGetEmbedManager();
   embedManager.removeComponent(<id>);
}

async function refreshDashboard(<newToken>) {
   const embedManager = await createOrGetEmbedManager();
   embedManager.updateToken(<newToken>).then(() => {
      embedManager.refresh();
   });
}

(async function application() {
   const token = await getComposerToken(); // some function of the 3rd party app that calls application API and return composer token retrieved via TA   
   const dashboards = await getUserDashboard(); // some function of the 3rd party app that retrieved dashboards for the user 
   createOrGetEmbedManager(token);
  
   // if token is expired composer will raise next event
   document.addEventListener('composer-unathorized', async () => {
      const token = await getComposerToken();
      const embedManager = createOrGetEmbedManager();
      refreshDashboard(token);  
   })
   // render first dashboard in the list   
   const embeddedDashboard = addDashboard(dashboards[0].id);

   // embedded component supports an ability to subscribe on the component specific events
   embeddedDashboard.addEventListener('composer-dashboard-ready', () => {
      // triggered when all charts are rendered. put custom logic here.  
   })
   document.querySelector('#clear-button').addEventListener('click', () => {
      clearDashboard(embeddedDashboard.componentInstanceId); // clears embedded dashboard when clicked on some button in the application
   })

})()