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="pivotContainer"></div>
JavaScript
let layout = {};
let pivot = new Flexmonster({
container: "#pivotContainer",
componentFolder: "https://cdn.flexmonster.com/",
width: "100%",
height: 550,
toolbar: true,
report: {
dataSource: {
type: "api",
url: "https://olap.flexmonster.com:9500",
index: "fm-product-sales"
},
slice: {
rows: [{
"uniqueName": "Category"
}, {
"uniqueName": "Destination"
}],
columns: [{
"uniqueName": "Business Type"
},
{
"uniqueName": "[Measures]"
}
],
measures: [{
"uniqueName": "priceUN",
"formula": "sum('Price')",
"caption": "Price"
},
{
"uniqueName": "discountUN",
"formula": "sum('Discount')",
"caption": "Discount"
}
],
expands: {
"rows": [{
"tuple": [
"category.[cars]"
]
}]
}
},
options: {
grid: {
showGrandTotals: "columns"
}
},
}
});
const pivotObserver = new MutationObserver(mutationCallback);
function mutationCallback(mutationsList, observer) {
for (let mutation of mutationsList) {
if (mutation.type === 'childList') {
const newChildren = mutation.addedNodes;
for (let i = 0; i < newChildren.length; i++) {
const popup = newChildren[i];
if (popup.nodeType === 1 && popup.matches('.fm-calculated-view')) {
addMutationObserverToChild(popup);
customizeList(popup);
pivotObserver.disconnect();
}
}
}
}
}
function addMutationObserverToChild(popup) {
const config = {
attributes: true,
attributeFilter: ['style']
};
const childObserver = new MutationObserver((mutationsList, observer) => {
for (let mutation of mutationsList) {
if (mutation.type === 'attributes' && mutation.attributeName === 'style') {
const isOpened = mutation.target.style.display !==...