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>
<div id="custom-filter-popup-wrap">
  <div id="custom-filter-popup-title"></div>
  <select id="custom-filter-popup-select" class=""></select>
  <div id="custom-filter-popup-buttons-wrap">
    <button onclick="closeFilterPopup()">Cancel</button>
    <button onclick="applyFilter()">Apply</button>
  </div>
</div>

CSS

html,
body {
  height: 100%;
  margin: 0;
}

fm-pivot>div {
  height: 100%;
}

div.fm-filter-view {
  display: none !important;
}

#custom-filter-popup-wrap {
  display: none;
  flex-flow: column;
  background-color: rgb(255, 255, 255);
  box-shadow: 0 0 20px rgb(0 0 0 / 10%);
  position: absolute;
  padding: 10px;
  width: 50%;
  height: min-content;
  left: 0;
  right: 0;
  margin-left: auto;
  margin-right: auto;
  top: 0;
  bottom: 0;
  margin-top: auto;
  margin-bottom: auto;
  z-index: 200;
}

#custom-filter-popup-title {
  padding: 10px;
  font-size: 24px;
  color: #111;
  font-family: Arial, sans-serif;
}

#custom-filter-popup-select {
  margin: 10px;
  padding: 7px 40px 7px 12px;
  border: 1px solid #E8EAED;
  border-radius: 5px;
  background: white;
  box-shadow: 0 1px 3px -2px #9098A9;
  cursor: pointer;
  font-family: inherit;
  font-size: 16px;
}

#custom-filter-popup-buttons-wrap {
  margin: 10px 5px 10px 5px;
  display: flex;
  flex-direction: row;
}

#custom-filter-popup-wrap button {
  display: block;
  flex-grow: 1;
  margin-left: 5px;
  margin-right: 5px;
}

JavaScript

let pivot = new Flexmonster({
  container: "#pivot-container",
  toolbar: true,
  componentFolder: "https://cdn.flexmonster.com/",
  report: {
    dataSource: {
      filename: "https://cdn.flexmonster.com/data/data.json"
    },
    slice: {
      rows: [{
        uniqueName: "Category"
      }],
      columns: [{
          uniqueName: "Business Type"
        },
        {
          uniqueName: "[Measures]"
        }
      ],
      measures: [{
        uniqueName: "Price",
        aggregation: "sum"
      }]
    }
  },
  width: "100%",
  height: "100%"
});

//Flexmonster-native elements
let pivotRef = document.getElementById("pivot-container");
let modalOverlayRef;

//Custom filter pop-up elements
let fpRef = document.getElementById("custom-filter-popup-wrap");
let fpTitleRef = document.getElementById("custom-filter-popup-title");
let fpSelectRef = document.getElementById("custom-filter-popup-select");

//uniqueName of the hierarchy to filter
let filterPopupHierarchyName;

flexmonster.on('filteropen', function(params) {
  openPivotPopup(params.hierarchy.dimensionUniqueName);
});

function openPivotPopup(hierarchyName) {
  pivotRef.setAttribute("style", "pointer-events: none; opacity: 0.85;");
  modalOverlayRef = document.querySelector('div[class="fm-ui-element fm-ui fm-ui-modal-overlay"]');

  fpRef.setAttribute("style", "display: block;");
  fpTitleRef.textContent = filterPopupHierarchyName = hierarchyName;
  fpSelectRef.innerHTML = "";

  flexmonster.getMembers(hierarchyName).forEach(member => {
    let option = document.createElement('option');
    option.value = member.uniqueName;
    option.innerHTML = member.caption;
    fpSelectRef.appendChild(option);
  })
}

function applyFilter() {
  flexmonster.setFilter(filterPopupHierarchyName, {
    "members": [fpSelectRef.options[fpSelectRef.selectedIndex].value]
  });
  closeFilterPopup();
}

function closeFilterPopup() {
  pivotRef.setAttribute("style", "pointer-events: auto; opacity: 1;");
 ...