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

var pivot = new Flexmonster({
  container: "pivotContainer",
  componentFolder: "https://cdn.flexmonster.com/",
  toolbar: true,
  report: {
    "dataSource": {
      "type": "csv",
      "filename": "data/data.csv"
    },
    "slice": {
      "rows": [{
        "uniqueName": "Category"
      }],
      "columns": [{
        "uniqueName": "[Measures]"
      }],
      "measures": [{
          "uniqueName": "Price",
          "aggregation": "sum"
        },
        {
          "uniqueName": "Quantity",
          "aggregation": "sum"
        },
        {
          "uniqueName": "Editable",
          "formula": "sum(\"Quantity\") * sum(\"Price\")",
          "caption": "Editable"
        },
        {
          "uniqueName": "~#Not Editable",
          "formula": "sum(\"Quantity\") * sum(\"Price\")",
          "caption": "~#Not Editable"
        }
      ]
    },
    options: {
      showCalculatedValuesButton: false
    }
  }
});

pivot.on("fieldslistopen", () => {
  setTimeout(() => {
    let measuresList = document.querySelector("#fm-lst-measures").childNodes;
    for (let measure of measuresList)
      if (measure.childNodes[0].innerText.includes("~#"))
        measure.removeChild(measure.childNodes[1]);
  }, 0);
});

pivot.customizeContextMenu(function(items, data, viewType) {
  if (data.measure && data.measure.formula && data.measure.uniqueName.includes("~#"))
    items.splice(3, 1);
  return items;
});