JSFiddle - React, Tailwind, and code Playground
Data source
by Flexmonster Pivot Table
HTML
<script src="https://cdn.flexmonster.com/flexmonster.js"></script>
<div id="pivot-container"></div>
<style id="filterPosition"></style>
CSS
.fm-filter-view {
position: fixed !important;
}
JavaScript
const pivot = new Flexmonster({
container: "pivot-container",
componentFolder: "https://cdn.flexmonster.com/",
toolbar: true,
report: {
dataSource: {
data: getData(),
},
slice: {
reportFilters: [
{
uniqueName: "City",
},
],
rows: [
{
uniqueName: "Color",
},
],
columns: [
{
uniqueName: "Country",
},
{
uniqueName: "[Measures]",
},
],
measures: [
{
uniqueName: "Price",
aggregation: "sum",
},
],
},
},
});
pivot.on("filteropen", (params) => {
let fieldName = params.hierarchy.uniqueName;
let filterElement = getFilterHeaderByText(fieldName);
let filterCoords = filterElement.getBoundingClientRect();
document.getElementById("filterPosition").textContent = `
#pivot-container .fm-filter-view {
top: ${filterCoords.top + filterCoords.height}px !important;
left: ${filterCoords.left}px !important;
}
`;
});
//document.querySelector(".fm-filter-view")
function getFilterHeaderByText(text) {
return [...document.querySelectorAll(".fm-filter-header")].find((el) =>
el.textContent.trim().startsWith(text),
);
}
function getData() {
return [
{
Color: "green",
Country: "Canada",
State: "Ontario",
City: "Toronto",
Price: 174,
Quantity: 22,
},
{
Color: "red",
Country: "USA",
State: "California",
City: "Los Angeles",
Price: 166,
Quantity: 19,
},
{
Color: "blue",
Country: "USA",
State: "Florida",
City: "Tallahassee",
Price: 215,
Quantity: 25,
},
{
Color: "black",
Country: "Canada",
State: "Quebec",
City: "Montreal",
Price: 194,
Quantity: 15,
},
];
}