JSFiddle - React, Tailwind, and code Playground

by Flexmonster Pivot Table

HTML

<script src="https://cdn.flexmonster.com/flexmonster.js"></script>

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

JavaScript

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: "fm-product-sales",
      mapping: {
        Year: {
          preloadMemberCaptions: true,
        },
        Month: {
          preloadMemberCaptions: true,
        },
      },
    },
    slice: {
      rows: [
        {
          uniqueName: "Calendario",
        },
      ],
      columns: [
        {
          uniqueName: "[Measures]",
        },
      ],
      measures: [
        {
          uniqueName: "Price",
          aggregation: "sum",
        },
      ],
      drills: {
        rows: [
          {
            tuple: ["calendario.[202400]"],
          },
        ],
      },
    },
  },
});

function pivotEndpoint(requestStringified, successCallback, errorCallback) {
  let request = JSON.parse(requestStringified);
  var result = null;
  if (request.type == "handshake") {
    result = {
      version: "2.8.22",
    };
  } else if (request.type == "fields") {
    result = getFields();
  } else if (request.type == "members") {
    if (request.field.uniqueName == "Month") {
      result = getMonths();
    } else if (request.field.uniqueName == "Year") {
      result = getYears();
    }
  } else if (request.type == "select") {
    console.log(request);
    if (request.querytype == "select") {
      result = getSelectResult();
    } else if (request.querytype == "drillDown") {
      result = getDrillDownResult();
    }
  }
  successCallback(result);
}

function getFields() {
  return {
    fields: [
      { uniqueName: "Price", type: "number" },
      {
        uniqueName: "Year",
        type: "string",
        hierarchy: "Calendario",
        aggregations: ["none"],
        // preloadMemberCaptions: true,
        caption:...