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

let pivot = new Flexmonster({
  container: "pivot-container",
  componentFolder: "https://cdn.flexmonster.com/",
  toolbar: true,
  report: {
    dataSource: {
      filename: "data/data.csv",
    },
    slice: {
      rows: [{
          uniqueName: "Color"
        },
        {
          uniqueName: "Country"
        },
      ],
      columns: [{
        uniqueName: "[Measures]"
      }],
      measures: [{
          uniqueName: "Price",
          aggregation: "sum"
        },
        {
          uniqueName: "Formula #1",
          formula: "sum(\"Price\") * 2",
          caption: "Formula #1"
        }
      ],
      expands: {
        rows: [{
          tuple: [
            "color.[green]"
          ]
        }]
      }
    }
  }
});

let type = "compact";
let flatSlice = {
  rows: [{
      uniqueName: "Color"
    },
    {
      uniqueName: "Country"
    },
  ],
  measures: [{
    uniqueName: "Price"
  }]
};
let pivotSlice = {
  rows: [{
      uniqueName: "Color"
    },
    {
      uniqueName: "Country"
    },
  ],
  columns: [{
    uniqueName: "[Measures]"
  }],
  measures: [{
      uniqueName: "Price",
      aggregation: "sum"
    },
    {
      uniqueName: "Formula #1",
      formula: "sum(\"Price\") * 2",
      caption: "Formula #1"
    }
  ],
  expands: {
    rows: [{
      tuple: [
        "color.[green]"
      ]
    }]
  }
};

flexmonster.on("reportchange", () => {
  if (type != flexmonster.getOptions().grid.type) {
    if (flexmonster.getOptions().grid.type == "flat") {
      type = "flat";
      flexmonster.runQuery(flatSlice);
    } else if (flexmonster.getOptions().grid.type == "compact") {
      type = "compact";
      flexmonster.runQuery(pivotSlice);
    } else if (flexmonster.getOptions().grid.type == "classic") {
      type = "classic";
      flexmonster.runQuery(pivotSlice);
    }
  }
});