JSFiddle - React, Tailwind, and code Playground

by Flexmonster Pivot Table

HTML

<link rel="stylesheet" href="https://s3.amazonaws.com/flexmonster/2.3/demo.css">
<script src="https://cdn.flexmonster.com/flexmonster.js"></script>

<div id="pivot-container"></div>

JavaScript

let endpointUrl = "https://olap.flexmonster.com:9500/";
let index = "fm-product-sales";

var pivot = new Flexmonster({
  container: "#pivot-container",
  componentFolder: "https://cdn.flexmonster.com/",
  width: "100%",
  height: 550,
  toolbar: true,
  report: {
    "dataSource": {
      "type": "api",
      "url": pivotEndpoint,
      "index": index
    },
    slice: {
      reportFilters: [{
        uniqueName: "Color",
        filter: {
          members: ["green"]
        }
      }, {
        uniqueName: "Destination",
        filter: {
          members: ["Australia"]
        }
      }, {
        uniqueName: "Country",
        filter: {
          members: ["Germany"]
        }
      }],
      rows: [{
        uniqueName: "Category"
      }],
      columns: [{
        uniqueName: "[Measures]"
      }],
      measures: [{
        uniqueName: "Price",
        aggregation: "sum"
      }]
    }
  }
});

function pivotEndpoint(requestStringified, successCallback, errorCallback) {
  let request = JSON.parse(requestStringified);
  
  // Construct the request:
  const fmRequest = new Request(endpointUrl + request.type, {
    method: "POST",
    headers: {
      'Content-Type': 'application/json',
      'Data-Type': 'json'
    },
    body: requestStringified
  });
  
  // Send the request and handle the response:
  fetch(fmRequest)
    .then(response => {
      if (!response.ok) {
        throw new Error('Network response was not OK');
      }
      return response.json();
    })
    .then(JSONResponse => {
      // Pass the response to Flexmonster:
      successCallback(JSONResponse);

      // Handle empty data:
      if ((JSONResponse.aggs && JSONResponse.aggs.length === 0) ||
        (JSONResponse.hits && JSONResponse.hits.length === 0)) {
        handleEmptyData();
      }
    })
    .catch(error => {
      // Notify Flexmonster about the error:
      errorCallback(error);
    });
}

function handleEmptyData() {
  pivot.alert({
    title: "No data found",
   ...