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" />
<p>
Open Size pop-up to check custom filter
</p>
<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>
<div class="custom-popup-members-wrap">
<span> Members: </span><br />
<select id="custom-filter-popup-select"></select>
</div>
<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-popup-members-wrap {
margin: 10px 5px 10px 5px;
display: flex;
flex-direction: column;
align-items: flex-start;
}
.custom-popup-members-wrap span, .custom-popup-members-wrap select {
font-size: 16px !important;
padding: 7px !important;
border-radius: 5px !important;
}
#custom-filter-search-button, .custom-popup-search-wrap span {
font-size: 16px !important;
padding: 7px !important;
border-radius: 5px !important;
}
#custom-filter-popup-select{
margin-left: 7px !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",
mapping: {
Size: {
filters: {
members: false,
},
},
},
},
slice: {
rows: [
{
uniqueName: "Country",
},
{
uniqueName: "Size",
},
],
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 = ""
...