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;
...