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="pivotContainer"></div>

JavaScript

let layout = {};
let pivot = new Flexmonster({
  container: "#pivotContainer",
  componentFolder: "https://cdn.flexmonster.com/",
  width: "100%",
  height: 550,
  toolbar: true,
  report: {
    dataSource: {
      type: "api",
      url: "https://olap.flexmonster.com:9500",
      index: "fm-product-sales"
    },
    slice: {
      rows: [{
        "uniqueName": "Category"
      }, {
        "uniqueName": "Destination"
      }],
      columns: [{
          "uniqueName": "Business Type"
        },
        {
          "uniqueName": "[Measures]"
        }
      ],
      measures: [{
          "uniqueName": "priceUN",
          "formula": "sum('Price')",
          "caption": "Price"
        },
        {
          "uniqueName": "discountUN",
          "formula": "sum('Discount')",
          "caption": "Discount"
        }
      ],
      expands: {
        "rows": [{
          "tuple": [
            "category.[cars]"
          ]
        }]
      }
    },
    options: {
      grid: {
        showGrandTotals: "columns"
      }
    },
  }
});

  const pivotObserver = new MutationObserver(mutationCallback);

function mutationCallback(mutationsList, observer) {
  for (let mutation of mutationsList) {
    if (mutation.type === 'childList') {
      const newChildren = mutation.addedNodes;
      for (let i = 0; i < newChildren.length; i++) {
        const popup = newChildren[i];
        if (popup.nodeType === 1 && popup.matches('.fm-calculated-view')) {
          addMutationObserverToChild(popup);
          customizeList(popup);
          pivotObserver.disconnect();
        }
      }
    }
  }
}

function addMutationObserverToChild(popup) {
  const config = {
    attributes: true,
    attributeFilter: ['style']
  };
  const childObserver = new MutationObserver((mutationsList, observer) => {
    for (let mutation of mutationsList) {
      if (mutation.type === 'attributes' && mutation.attributeName === 'style') {
        const isOpened = mutation.target.style.display !==...