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" class='hideCustomFilter'>
<div id="custom-filter-popup-title"></div>
<select id="custom-filter-popup-select" class=""></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-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"
}]
}
}
});
const pivotContainer = document.getElementById("pivot-container");
const customFilterHierarchy = "Category";
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 select = document.getElementById("custom-filter-popup-select");
title.textContent = customFilterHierarchy;
select.innerHTML = "";
pivot.getMembers(customFilterHierarchy).forEach(member => {
let option = document.createElement('option');
option.value = member.uniqueName;
option.innerHTML = member.caption;
select.appendChild(option);
})
if (pivot.getFilter(customFilterHierarchy)) {
select.value = pivot.getFilter(customFilterHierarchy).members[0];
}
filterPopup.classList.remove("hideCustomFilter");
}
function applyFilter(hierarchyName) {
const select = document.getElementById("custom-filter-popup-select");
flexmonster.setFilter(customFilterHierarchy, {
"members": [select.value]
});
...