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>
<link href="https://cdn.flexmonster.com/flexmonster.css" rel="stylesheet">


<div id="pivot-container"></div>
<div id="custom-filter-popup-wrap" class='hideCustomFilter'>
  <div id="custom-filter-popup-title"></div>
  <div class="custom-popup-search-wrap">
    <span>Search:</span>
    <input id='custom-filter-search-input' type="text" autocomplete="off" data-placeholder="Search" value='1'>
    <button id="custom-filter-search-button" onclick='searchMembers()'>🔎</button>
  </div>
  <select id="custom-filter-popup-select"></select>
  <div id="custom-filter-popup-buttons-wrap">
    <button onclick="applyFilter()">Apply</button>
    <button onclick="closeFilterPopup()">Cancel</button>
  </div>
</div>

CSS

div.fm-filter-view.hideDefaultFilter {
  z-index: -100 !important;
}

.hideCustomFilter {
  display: none !important;
}

#custom-filter-popup-wrap {
  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-popup-search-wrap {
  margin: 10px 5px 10px 5px;
  display: flex;
  flex-direction: row;
  align-items: center;
}

#custom-filter-search-button, .custom-popup-search-wrap span {
  font-size: 16px !important;

  padding: 7px !important;
  border-radius: 5px !important;
}

#custom-filter-popup-select,
#custom-filter-search-input {

  padding: 7px 12px 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;
  width: 60%;
}

#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

var pivot = new Flexmonster({
  container: "#pivot-container",
  componentFolder: "https://cdn.flexmonster.com/",
  toolbar: true,
  report: {
    "dataSource": {
      "type": "api",
      "url": "https://olap.flexmonster.com:9500",
      "index": "fm-product-sales",
    },
    "slice": {
      "reportFilters": [{
        "uniqueName": "Size"
      }],
      "rows": [{
        "uniqueName": "Country"
      }, ],
      "columns": [{
        "uniqueName": "Category"
      }, {
        "uniqueName": "[Measures]"
      }],
      "measures": [{
          "uniqueName": "Price",
          "aggregation": "sum"
        },
        {
          "uniqueName": "Quantity",
          "aggregation": "average"
        }
      ]
    },
    "formats": [{
      "name": "",
      "maxDecimalPlaces": 2
    }]
  },
  width: "100%"
});

const pivotContainer = document.getElementById("pivot-container");
const customFilterHierarchy = "Size";

pivot.on('filteropen', function(params) {
  const defaultFilterPopup = document.querySelector('div#fm-pivot-view div.fm-filter-view');
  const showCustomFilter = params.hierarchy.uniqueName == customFilterHierarchy;
  defaultFilterPopup.classList.toggle("hideDefaultFilter", showCustomFilter);
  if (showCustomFilter) {
    openPivotPopup();
  }
});


function openPivotPopup() {

  pivotContainer.setAttribute("style", "pointer-events: none; opacity: 0.85;");
  const filterPopup = document.getElementById("custom-filter-popup-wrap");
  const title = document.getElementById("custom-filter-popup-title");
  const search = document.getElementById("custom-filter-search-input");

  title.textContent = customFilterHierarchy;

  const select = document.getElementById("custom-filter-popup-select");
  //list of members from /members response
  const predefinedMembers = [];

  select.innerHTML = "";
  predefinedMembers.forEach(member => {
    let option = document.createElement('option');
    option.value = member.value;
    option.innerHTML = member.value;
   ...