@hrforte/react-pivottable 2.2.2 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/TableRenderers.jsx"],"names":["applyCellFormatting","spanSize","arr","i","j","x","asc","end","noDraw","len","length","asc1","end1","stop","buildGroupLookup","rowGroupConfig","lookup","forEach","label","match","name","buildHeaderGroupSegments","attrs","map","group","span","groupLabelStyle","textAlign","redColorScaleGenerator","values","min","Math","apply","max","nonRed","round","backgroundColor","evaluateCondition","value","condition","type","conditionValue","numValue","parseFloat","numConditionValue","isNaN","undefined","trim","valueStr","String","conditionValueStr","toLowerCase","includes","valueStr2","conditionValueStr2","getConditionalFormattingStyle","conditionalFormatting","Array","isArray","rules","rule","style","Object","assign","mergeStyles","styles","filter","s","containsSpecialCharacters","str","trimmed","pureNumericPattern","test","shouldSkipFormattingForAggregation","aggregatorName","skipFormattingAggregations","cellFormatting","defaultFormatter","isNumeric","isFinite","hasFormattingRules","some","format","numericValue","matchingRule","formatter","digitsAfterDecimal","decimalPlaces","thousandsSep","decimalSep","prefix","suffix","showOriginal","makeRenderer","opts","TableRenderer","pivotData","PivotData","props","colAttrs","cols","rowAttrs","rows","aggregations","getAggregations","primaryAggregation","getPrimaryAggregation","hasMultipleAggregators","tableOptions","aggregationDisplayMode","isColumnAggregationMode","rowAttrsToRender","concat","colAttrsToRender","hasColumnAttributes","showTotalsColumn","shouldRenderRowHeaderPlaceholder","hasHeaderGroup","Boolean","groupLookup","headerGroupSegments","renderGroupSegments","seg","idx","rowSpan","showNumericalOrder","hasNumberColumn","numberColumnLabel","renderedAggregationHeaderRow","numberColumnHeaderRowSpan","numberColumnInGroupRow","renderNumberHeaderCell","rowKeys","getRowKeys","baseRowKeys","renderedRows","reduce","acc","rowKey","push","displayKey","agg","actualKey","aggregationKey","key","rowKeyValues","r","colKeys","getColKeys","baseColKeys","columnMeta","colKey","colKeyValues","col","renderAggregatorHeaderCells","colMeta","aggIndex","colSpan","valueCellColors","rowTotalColors","colTotalColors","heatmapMode","colorScaleGenerator","tableColorScaleGenerator","rowTotalValues","getAggregator","colTotalValues","allValues","c","colorScale","v","rowColorScales","rowValues","colColorScales","colValues","aggregationNameLookup","aggregationByKey","getAggregationGroup","vals","k","renderAggregatorGroupCells","getCellStyle","heatmapStyle","conditionalStyle","formatCellValue","aggregator","bind","formatLabel","txt","parsed","formatRowLabel","index","isLastElement","rowAttrsLength","getClickHandler","clickCallback","filters","keys","attr","e","handleColSort","stopPropagation","onColSort","currentSort","colSorts","nextSort","handleRowSort","onRowSort","rowSorts","getSortButton","isCol","handleSort","sortIcon","colSortIcons","DEFAULT","rowSortIcons","totalRowAggregations","totalsLabelText","formattedColLabel","isRowAttr","rowMeta","totalAggregator","formattedTxt","aggregationKeyForCell","grandTotalAggregator","totalLabel","totalValue","React","PureComponent","defaultProps","propTypes","PropTypes","func","object","objectOf","oneOf","arrayOf","shape","string","isRequired","ASC","DESC","node","bool","TSVExportRenderer","safeRowKeys","safeColKeys","rowEntries","headerRow","slice","join","result","row","entry","unshift","width","window","innerWidth","height","innerHeight","Table"],"mappings":";;;;;;;;;;QA6PgBA,mB,GAAAA,mB;;AA5PhB;;;;AACA;;;;AACA;;;;;;;;;;oMAHA;;;AAKA;AACA,IAAMC,WAAW,SAAXA,QAAW,CAASC,GAAT,EAAcC,CAAd,EAAiBC,CAAjB,EAAoB;AACnC,MAAIC,UAAJ;AACA,MAAIF,MAAM,CAAV,EAAa;AACX,QAAIG,YAAJ;AAAA,QAASC,YAAT;AACA,QAAIC,SAAS,IAAb;AACA,SACEH,IAAI,CAAJ,EAAOE,MAAMH,CAAb,EAAgBE,MAAMC,OAAO,CAD/B,EAEED,MAAMD,KAAKE,GAAX,GAAiBF,KAAKE,GAFxB,EAGED,MAAMD,GAAN,GAAYA,GAHd,EAIE;AACA,UAAIH,IAAIC,IAAI,CAAR,EAAWE,CAAX,MAAkBH,IAAIC,CAAJ,EAAOE,CAAP,CAAtB,EAAiC;AAC/BG,iBAAS,KAAT;AACD;AACF;AACD,QAAIA,MAAJ,EAAY;AACV,aAAO,CAAC,CAAR;AACD;AACF;AACD,MAAIC,MAAM,CAAV;AACA,SAAON,IAAIM,GAAJ,GAAUP,IAAIQ,MAArB,EAA6B;AAC3B,QAAIC,aAAJ;AAAA,QAAUC,aAAV;AACA,QAAIC,OAAO,KAAX;AACA,SACER,IAAI,CAAJ,EAAOO,OAAOR,CAAd,EAAiBO,OAAOC,QAAQ,CADlC,EAEED,OAAON,KAAKO,IAAZ,GAAmBP,KAAKO,IAF1B,EAGED,OAAON,GAAP,GAAaA,GAHf,EAIE;AACA,UAAIH,IAAIC,CAAJ,EAAOE,CAAP,MAAcH,IAAIC,IAAIM,GAAR,EAAaJ,CAAb,CAAlB,EAAmC;AACjCQ,eAAO,IAAP;AACD;AACF;AACD,QAAIA,IAAJ,EAAU;AACR;AACD;AACDJ;AACD;AACD,SAAOA,GAAP;AACD,CArCD;;AAuCA;AACA;AACA;AACA;AACA,SAASK,gBAAT,CAA0BC,cAA1B,EAA0C;AACxC,MAAMC,SAAS,EAAf;AACA,GAACD,kBAAkB,EAAnB,EAAuBE,OAAvB,CAA+B,gBAAoB;AAAA,QAAlBC,KAAkB,QAAlBA,KAAkB;AAAA,QAAXC,KAAW,QAAXA,KAAW;;AACjDA,UAAMF,OAAN,CAAc,gBAAQ;AACpBD,aAAOI,IAAP,IAAeF,KAAf;AACD,KAFD;AAGD,GAJD;AAKA,SAAOF,MAAP;AACD;;AAED;AACA,SAASK,wBAAT,CAAkCC,KAAlC,EAAyCP,cAAzC,EAAyD;AACvD,MAAMC,SAASF,iBAAiBC,cAAjB,CAAf;;AAEA;AACA;AACA,SAAOO,MAAMC,GAAN,CAAU;AAAA,WAAS,EAACC,OAAOR,OAAOI,IAAP,KAAgB,IAAxB,EAA8BK,MAAM,CAApC,EAAT;AAAA,GAAV,CAAP;AACD;;AAED;AACA,IAAMC,kBAAkB;AACtBC,aAAW;AADW,CAAxB;;AAIA,SAASC,sBAAT,CAAgCC,MAAhC,EAAwC;AACtC,MAAMC,MAAMC,KAAKD,GAAL,CAASE,KAAT,CAAeD,IAAf,EAAqBF,MAArB,CAAZ;AACA,MAAMI,MAAMF,KAAKE,GAAL,CAASD,KAAT,CAAeD,IAAf,EAAqBF,MAArB,CAAZ;AACA,SAAO,aAAK;AACV;AACA,QAAMK,SAAS,MAAMH,KAAKI,KAAL,CAAY,OAAO9B,IAAIyB,GAAX,CAAD,IAAqBG,MAAMH,GAA3B,CAAX,CAArB;AACA,WAAO,EAACM,8BAA4BF,MAA5B,SAAsCA,MAAtC,MAAD,EAAP;AACD,GAJD;AAKD;;AAED;AACA,SAASG,iBAAT,CAA2BC,KAA3B,EAAkCC,SAAlC,EAA6C;AAC3C,MAAI,CAACA,SAAD,IAAc,CAACA,UAAUC,IAA7B,EAAmC;AACjC,WAAO,KAAP;AACD;;AAH0C,MAKpCA,IALoC,GAKLD,SALK,CAKpCC,IALoC;AAAA,MAKvBC,cALuB,GAKLF,SALK,CAK9BD,KAL8B;;AAM3C,MAAMI,WAAW,OAAOJ,KAAP,KAAiB,QAAjB,GAA4BA,KAA5B,GAAoCK,WAAWL,KAAX,CAArD;AACA,MAAMM,oBACJ,OAAOH,cAAP,KAA0B,QAA1B,GACIA,cADJ,GAEIE,WAAWF,cAAX,CAHN;;AAKA,UAAQD,IAAR;AACE,SAAK,aAAL;AACE,aACE,CAACK,MAAMH,QAAN,CAAD,IACA,CAACG,MAAMD,iBAAN,CADD,IAEAF,WAAWE,iBAHb;AAKF,SAAK,UAAL;AACE,aACE,CAACC,MAAMH,QAAN,CAAD,IACA,CAACG,MAAMD,iBAAN,CADD,IAEAF,WAAWE,iBAHb;AAKF,SAAK,oBAAL;AACE,aACE,CAACC,MAAMH,QAAN,CAAD,IACA,CAACG,MAAMD,iBAAN,CADD,IAEAF,YAAYE,iBAHd;AAKF,SAAK,iBAAL;AACE,aACE,CAACC,MAAMH,QAAN,CAAD,IACA,CAACG,MAAMD,iBAAN,CADD,IAEAF,YAAYE,iBAHd;AAKF,SAAK,OAAL;AACE,UAAI,OAAON,KAAP,KAAiB,QAAjB,IAA6B,OAAOG,cAAP,KAA0B,QAA3D,EAAqE;AACnE,eAAOH,UAAUG,cAAjB;AACD;AACD,aACE,CAACI,MAAMH,QAAN,CAAD,IACA,CAACG,MAAMD,iBAAN,CADD,IAEAF,aAAaE,iBAHf;AAKF,SAAK,UAAL;AACE,UAAI,OAAON,KAAP,KAAiB,QAAjB,IAA6B,OAAOG,cAAP,KAA0B,QAA3D,EAAqE;AACnE,eAAOH,UAAUG,cAAjB;AACD;AACD,aACEI,MAAMH,QAAN,KACAG,MAAMD,iBAAN,CADA,IAEAF,aAAaE,iBAHf;AAKF,SAAK,OAAL;AACE;AACA;AACA,UAAIN,UAAU,IAAV,IAAkBA,UAAUQ,SAAhC,EAA2C;AACzC,eAAO,IAAP;AACD;AACD,UAAI,OAAOR,KAAP,KAAiB,QAArB,EAA+B;AAC7B,eAAOA,MAAMS,IAAN,OAAiB,EAAxB;AACD;AACD,UAAI,OAAOT,KAAP,KAAiB,QAArB,EAA+B;AAC7B,eAAOO,MAAMP,KAAN,CAAP;AACD;AACD,aAAO,KAAP;AACF,SAAK,UAAL;AACE;AACA;AACA,UAAIA,UAAU,IAAV,IAAkBA,UAAUQ,SAAhC,EAA2C;AACzC,eAAO,KAAP;AACD;AACD,UAAI,OAAOR,KAAP,KAAiB,QAArB,EAA+B;AAC7B,eAAOA,MAAMS,IAAN,OAAiB,EAAxB;AACD;AACD,UAAI,OAAOT,KAAP,KAAiB,QAArB,EAA+B;AAC7B,eAAO,CAACO,MAAMP,KAAN,CAAR;AACD;AACD;AACA,aAAO,IAAP;AACF;AACA,SAAK,UAAL;AACE;AACA;AACA,UAAMU,WAAWC,OAAOX,SAAS,EAAhB,CAAjB;AACA,UAAMY,oBAAoBD,OAAOR,kBAAkB,EAAzB,CAA1B;AACA,UAAIO,YAAYE,iBAAhB,EAAmC;AACjC,eAAOF,SAASG,WAAT,GAAuBC,QAAvB,CAAgCF,kBAAkBC,WAAlB,EAAhC,CAAP;AACD;AACD,aAAO,KAAP;AACF;AACA,SAAK,aAAL;AACE;AACA;AACA,UAAME,YAAYJ,OAAOX,SAAS,EAAhB,CAAlB;AACA,UAAMgB,qBAAqBL,OAAOR,kBAAkB,EAAzB,CAA3B;AACA,UAAIY,aAAaC,kBAAjB,EAAqC;AACnC,eAAO,CAACD,UACLF,WADK,GAELC,QAFK,CAEIE,mBAAmBH,WAAnB,EAFJ,CAAR;AAGD;AACD,aAAO,IAAP;AACF;AACE,aAAO,KAAP;AA7FJ;AA+FD;;AAED;AACA,SAASI,6BAAT,CAAuCjB,KAAvC,EAA8CkB,qBAA9C,EAAqE;AACnE,MAAI,CAACA,qBAAD,IAA0B,CAACC,MAAMC,OAAN,CAAcF,sBAAsBG,KAApC,CAA/B,EAA2E;AACzE,WAAO,EAAP;AACD;;AAED;AALmE;AAAA;AAAA;;AAAA;AAMnE,yBAAmBH,sBAAsBG,KAAzC,8HAAgD;AAAA,UAArCC,IAAqC;;AAC9C,UAAIvB,kBAAkBC,KAAlB,EAAyBsB,KAAKrB,SAA9B,CAAJ,EAA8C;AAC5C;AACA,eAAOqB,KAAKC,KAAL,GAAaC,OAAOC,MAAP,CAAc,EAAd,EAAkBH,KAAKC,KAAvB,CAAb,GAA6C,EAApD;AACD;AACF;AAXkE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAanE,SAAO,EAAP;AACD;;AAED;AACA,SAASG,WAAT,GAAgC;AAAA,oCAARC,MAAQ;AAARA,UAAQ;AAAA;;AAC9B,SAAOH,OAAOC,MAAP,gBAAc,EAAd,4BAAqBE,OAAOC,MAAP,CAAc;AAAA,WAAKC,KAAK,QAAOA,CAAP,yCAAOA,CAAP,OAAa,QAAvB;AAAA,GAAd,CAArB,GAAP;AACD;;AAED;AACA;AACA;AACA,SAASC,yBAAT,CAAmCC,GAAnC,EAAwC;AACtC,MAAI,OAAOA,GAAP,KAAe,QAAnB,EAA6B;AAC3B,WAAO,KAAP;AACD;AACD,MAAMC,UAAUD,IAAItB,IAAJ,EAAhB;AACA;AACA;AACA;AACA,MAAMwB,qBAAqB,eAA3B;AACA,SAAO,CAACA,mBAAmBC,IAAnB,CAAwBF,OAAxB,CAAR;AACD;;AAED;AACA;AACA;AACA,SAASG,kCAAT,CAA4CC,cAA5C,EAA4D;AAC1D,MAAI,CAACA,cAAL,EAAqB;AACnB,WAAO,KAAP;AACD;;AAED,MAAMtD,OAAOsD,eAAevB,WAAf,EAAb;AACA;AACA,MAAMwB,6BAA6B,CACjC,OADiC,EAEjC,qBAFiC,EAGjC,oBAHiC,EAIjC,OAJiC,EAKjC,MALiC,EAMjC,SANiC,EAOjC,SAPiC,CAAnC;AASA,SAAOA,2BAA2BvB,QAA3B,CAAoChC,IAApC,CAAP;AACD;;AAED;AACO,SAASpB,mBAAT,CACLsC,KADK,EAELsC,cAFK,EAGLC,gBAHK,EAKL;AAAA,MADAH,cACA,uEADiB,IACjB;;AACA;AACA;AACA,MAAMI,YACH,OAAOxC,KAAP,KAAiB,QAAjB,IAA6B,CAACO,MAAMP,KAAN,CAA9B,IAA8CyC,SAASzC,KAAT,CAA/C,IACC,OAAOA,KAAP,KAAiB,QAAjB,IACCA,MAAMS,IAAN,OAAiB,EADlB,IAEC,CAACqB,0BAA0B9B,KAA1B,CAFF,IAGC,CAACO,MAAMF,WAAWL,KAAX,CAAN,CAHF,IAICyC,SAASpC,WAAWL,KAAX,CAAT,CANJ;AAOA,MAAImC,mCAAmCC,cAAnC,CAAJ,EAAwD;AACtD,QAAII,aAAaD,gBAAjB,EAAmC;AACjC,aAAOA,iBAAiBvC,KAAjB,CAAP;AACD;AACD;AACA,WAAOA,KAAP;AACD;;AAED;AACA;AACA;AACA,MAAM0C,qBACJJ,kBACA,QAAOA,cAAP,yCAAOA,cAAP,OAA0B,QAD1B,IAEAnB,MAAMC,OAAN,CAAckB,eAAejB,KAA7B,CAFA,IAGAiB,eAAejB,KAAf,CAAqBjD,MAArB,GAA8B,CAH9B,IAIAkE,eAAejB,KAAf,CAAqBsB,IAArB,CAA0B;AAAA,WAAQrB,QAAQA,KAAKsB,MAArB;AAAA,GAA1B,CALF;;AAOA,MAAI,CAACF,kBAAL,EAAyB;AACvB;AACA;AACA;AACA,QAAIF,SAAJ,EAAe;AACb;AACA,UAAI,OAAOxC,KAAP,KAAiB,QAArB,EAA+B;AAC7B,eAAOA,KAAP;AACD;AACD;AACA,aAAOK,WAAWL,KAAX,CAAP;AACD;AACD;AACA,WAAOA,KAAP;AACD;;AAED;AACA;AACA,MAAI8B,0BAA0B9B,KAA1B,CAAJ,EAAsC;AACpC,WAAOuC,mBAAmBA,iBAAiBvC,KAAjB,CAAnB,GAA6CW,OAAOX,KAAP,CAApD;AACD;;AAED;AACA;AACA;AACA,MAAI6C,eAAe7C,KAAnB;;AAEA;AACA,MAAIwC,aAAa,OAAOxC,KAAP,KAAiB,QAAlC,EAA4C;AAC1C6C,mBAAexC,WAAWL,KAAX,CAAf;AACD;;AAED;AACA,MAAM8C,eAAeR,eAAejB,KAAf,CAAqB,CAArB,CAArB;;AAEA;AACA,MAAIyB,gBAAgBA,aAAaF,MAA7B,IAAuCJ,SAA3C,EAAsD;AACpD,QAAMI,SAASE,aAAaF,MAA5B;AACA,QAAMG,YAAY,6BAAa;AAC7BC,0BAAoB,mBAAmBJ,MAAnB,GAA4BA,OAAOK,aAAnC,GAAmD,CAD1C;AAE7BC,oBAAc,kBAAkBN,MAAlB,GAA2BA,OAAOM,YAAlC,GAAiD,GAFlC;AAG7BC,kBAAY,gBAAgBP,MAAhB,GAAyBA,OAAOO,UAAhC,GAA6C,GAH5B;AAI7BC,cAAQ,YAAYR,MAAZ,GAAqBA,OAAOQ,MAA5B,GAAqC,EAJhB;AAK7BC,cAAQ,YAAYT,MAAZ,GAAqBA,OAAOS,MAA5B,GAAqC,EALhB;AAM7BC,oBAAc,kBAAkBV,MAAlB,GAA2BA,OAAOU,YAAlC,GAAiD;AANlC,KAAb,CAAlB;AAQA,WAAOP,UAAUF,YAAV,CAAP;AACD;;AAED;AACA,SAAON,mBAAmBA,iBAAiBvC,KAAjB,CAAnB,GAA6CW,OAAOX,KAAP,CAApD;AACD;;AAED,SAASuD,YAAT,GAAiC;AAAA,MAAXC,IAAW,uEAAJ,EAAI;;AAAA,MACzBC,aADyB;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA,+BAEpB;AAAA;;AACP,YAAMC,YAAY,IAAIC,oBAAJ,CAAc,KAAKC,KAAnB,CAAlB;AACA,YAAMC,WAAWH,UAAUE,KAAV,CAAgBE,IAAjC;AACA,YAAMC,WAAWL,UAAUE,KAAV,CAAgBI,IAAjC;AACA,YAAMC,eAAeP,UAAUQ,eAAV,EAArB;AACA,YAAMC,qBAAqBT,UAAUU,qBAAV,EAA3B;AACA,YAAMC,yBAAyBJ,aAAa7F,MAAb,GAAsB,CAArD;AACA,YAAMkG,eAAe,KAAKV,KAAL,CAAWU,YAAX,IAA2B,EAAhD;AACA,YAAMC,yBACJD,aAAaC,sBAAb,KAAwC,QAAxC,GAAmD,QAAnD,GAA8D,KADhE;AAEA,YAAMC,0BACJD,2BAA2B,QAA3B,IAAuCF,sBADzC;AAEA,YAAMI,mBACJJ,0BAA0B,CAACG,uBAA3B,GACIT,SAASW,MAAT,CAAgB,CAAC,QAAD,CAAhB,CADJ,GAEIX,QAHN;AAIA,YAAMY,mBAAmBd,QAAzB;AACA,YAAMe,sBAAsBD,iBAAiBvG,MAAjB,GAA0B,CAAtD;AACA,YAAMyG,mBAAmB,CAACL,uBAA1B;AACA,YAAMM,mCAAmCL,iBAAiBrG,MAAjB,KAA4B,CAArE;;AAEA;AACA;AACA;AACA;AACA,YAAMK,iBAAiB,KAAKmF,KAAL,CAAWnF,cAAlC;AACA,YAAMsG,iBAAiBC,QAAQvG,kBAAkBA,eAAeL,MAAzC,CAAvB;AACA,YAAM6G,cAAczG,iBAAiBC,cAAjB,CAApB;AACA,YAAMyG,sBAAsBH,iBACxBhG,yBAAyB0F,gBAAzB,EAA2ChG,cAA3C,CADwB,GAExB,EAFJ;AAGA,YAAM0G,sBAAsB,SAAtBA,mBAAsB;AAAA,iBAC1BD,oBAAoBjG,GAApB,CAAwB,UAACmG,GAAD,EAAMC,GAAN;AAAA,mBACtB;AAAA;AAAA;AACE,+BAAaA,GADf;AAEE,yBAASD,IAAIjG,IAFf;AAGE,yBAASmG;AACT;AAJF,kBAKE,OAAOF,IAAIlG,KAAJ,GAAYE,eAAZ,GAA8BoB;AALvC;AAOG4E,kBAAIlG,KAAJ,IAAa;AAPhB,aADsB;AAAA,WAAxB,CAD0B;AAAA,SAA5B;AAYA;;AAEA;AACA;AACA;AACA,YAAMqG,qBAAqBP,QAAQ,KAAKpB,KAAL,CAAW2B,kBAAnB,CAA3B;AACA,YAAMC,kBACJD,uBACCd,iBAAiBrG,MAAjB,KAA4B,CAA5B,IAAiCuG,iBAAiBvG,MAAjB,KAA4B,CAD9D,CADF;AAGA,YAAMqH,oBAAoB,KAA1B;AACA,YAAMC,+BACJlB,2BAA2BI,mBAD7B;AAEA;AACA;AACA;AACA,YAAMe,4BACJhB,iBAAiBvG,MAAjB,IACCsH,+BAA+B,CAA/B,GAAmC,CADpC,KAECjB,iBAAiBrG,MAAjB,KAA4B,CAA5B,IAAiC,CAACsH,4BAAlC,GACG,CADH,GAEG,CAJJ,KAKCX,kBACDJ,iBAAiBvG,MAAjB,KAA4B,CAD3B,IAEDqG,iBAAiBrG,MAAjB,KAA4B,CAF3B,GAGG,CAHH,GAIG,CATJ,KAUCsH,gCAAgCX,cAAhC,GAAiD,CAAjD,GAAqD,CAVtD,CADF;AAYA,YAAMa,yBACJb,kBACAJ,iBAAiBvG,MAAjB,KAA4B,CAD5B,IAEAqG,iBAAiBrG,MAAjB,KAA4B,CAH9B;AAIA,YAAMyH,yBAAyB,SAAzBA,sBAAyB;AAAA,cAACP,OAAD,uEAAWK,yBAAX;AAAA,iBAC7B;AAAA;AAAA,cAAI,WAAU,2BAAd,EAA0C,SAASL,OAAnD;AACGG;AADH,WAD6B;AAAA,SAA/B;AAKA;;AAEA,YAAMK,UAAUpC,UAAUqC,UAAV,EAAhB;AACA,YAAMC,cACJ3B,0BACA,CAACG,uBADD,IAEAsB,QAAQ1H,MAAR,KAAmB,CAFnB,GAGI,CAAC,EAAD,CAHJ,GAII0H,OALN;AAMA,YAAMG,eACJ5B,0BAA0B,CAACG,uBAA3B,GACIwB,YAAYE,MAAZ,CAAmB,UAACC,GAAD,EAAMC,MAAN,EAAiB;AAClCnC,uBAAatF,OAAb,CAAqB,eAAO;AAC1BwH,gBAAIE,IAAJ,CAAS;AACPC,0BAAYF,OAAO1B,MAAP,CAAc,CAAC6B,IAAI3H,KAAJ,IAAa2H,IAAInE,cAAlB,CAAd,CADL;AAEPoE,yBAAWJ,MAFJ;AAGPK,8BAAgBF,IAAIG;AAHb,aAAT;AAKD,WAND;AAOA,iBAAOP,GAAP;AACD,SATD,EASG,EATH,CADJ,GAWIH,YAAY/G,GAAZ,CAAgB;AAAA,iBAAW;AACzBqH,wBAAYF,MADa;AAEzBI,uBAAWJ,MAFc;AAGzBK,4BAAgBtC,mBAAmBuC;AAHV,WAAX;AAAA,SAAhB,CAZN;AAiBA,YAAMC,eAAeV,aAAahH,GAAb,CAAiB;AAAA,iBAAK2H,EAAEN,UAAP;AAAA,SAAjB,CAArB;AACA,YAAMO,UAAUnD,UAAUoD,UAAV,EAAhB;AACA,YAAMC,cACJvC,2BAA2BqC,QAAQzI,MAAR,KAAmB,CAA9C,GAAkD,CAAC,EAAD,CAAlD,GAAyDyI,OAD3D;AAEA,YAAMG,aAAaxC,0BACfuC,YAAYb,MAAZ,CAAmB,UAACC,GAAD,EAAMc,MAAN,EAAiB;AAClChD,uBAAatF,OAAb,CAAqB,eAAO;AAC1BwH,gBAAIE,IAAJ,CAAS;AACPC,0BAAYW,OAAOvC,MAAP,CAAc,CAAC6B,IAAI3H,KAAJ,IAAa2H,IAAInE,cAAlB,CAAd,CADL;AAEPoE,yBAAWS,MAFJ;AAGPR,8BAAgBF,IAAIG;AAHb,aAAT;AAKD,WAND;AAOA,iBAAOP,GAAP;AACD,SATD,EASG,EATH,CADe,GAWfU,QAAQ5H,GAAR,CAAY;AAAA,iBAAW;AACrBqH,wBAAYW,MADS;AAErBT,uBAAWS,MAFU;AAGrBR,4BAAgBtC,mBAAmBuC;AAHd,WAAX;AAAA,SAAZ,CAXJ;AAgBA,YAAMQ,eAAeF,WAAW/H,GAAX,CAAe;AAAA,iBAAOkI,IAAIb,UAAX;AAAA,SAAf,CAArB;;AAEA,YAAMc,8BAA8B,SAA9BA,2BAA8B;AAAA,iBAClCJ,WAAW/H,GAAX,CAAe,UAACoI,OAAD,EAAUhC,GAAV,EAAkB;AAC/B,gBAAMzG,QAAQyI,QAAQf,UAAR,CAAmBe,QAAQf,UAAR,CAAmBlI,MAAnB,GAA4B,CAA/C,KAAqD,EAAnE;AACA;AACA;AACA,gBAAMkJ,WAAW3C,iBAAiBvG,MAAlC;AACA;AACA;AACA;AACA,gBAAImJ,gBAAJ;AACA,gBAAI3C,mBAAJ,EAAyB;AACvB;AACA;AACA;AACA2C,wBAAU,CAAV;AACD,aALD,MAKO;AACL;AACAA,wBAAU5J,SAASuJ,YAAT,EAAuB7B,GAAvB,EAA4BiC,QAA5B,CAAV;AACA;AACA,kBAAIC,YAAY,CAAC,CAAjB,EAAoB;AAClB,uBAAO,IAAP;AACD;AACF;;AAED;AACA;AACA,gBAAMjC,UACJV,uBAAuBH,iBAAiBrG,MAAjB,KAA4B,CAAnD,GAAuD,CAAvD,GAA2D,CAD7D;;AAGA,mBACE;AAAA;AAAA;AACE,2BAAU,aADZ;AAEE,oCAAkBiH,GAFpB;AAGE,yBAASkC,OAHX;AAIE,yBAASjC;AAJX;AAMG1G;AANH,aADF;AAUD,WAtCD,CADkC;AAAA,SAApC;;AAyCA,YAAI4I,kBAAkB,2BAAM,CAAE,CAA9B;AACA,YAAIC,iBAAiB,0BAAM,CAAE,CAA7B;AACA,YAAIC,iBAAiB,0BAAM,CAAE,CAA7B;AACA,YAAIlE,KAAKmE,WAAL,IAAoB,CAACtD,sBAAzB,EAAiD;AAC/C,cAAMuD,sBAAsB,KAAKhE,KAAL,CAAWiE,wBAAvC;AACA,cAAMC,iBAAiBjB,QAAQ5H,GAAR,CAAY;AAAA,mBACjCyE,UAAUqE,aAAV,CAAwB,EAAxB,EAA4BhK,CAA5B,EAA+BoG,mBAAmBuC,GAAlD,EAAuD1G,KAAvD,EADiC;AAAA,WAAZ,CAAvB;AAGAyH,2BAAiBG,oBAAoBE,cAApB,CAAjB;AACA,cAAME,iBAAiBlC,QAAQ7G,GAAR,CAAY;AAAA,mBACjCyE,UAAUqE,aAAV,CAAwBhK,CAAxB,EAA2B,EAA3B,EAA+BoG,mBAAmBuC,GAAlD,EAAuD1G,KAAvD,EADiC;AAAA,WAAZ,CAAvB;AAGA0H,2BAAiBE,oBAAoBI,cAApB,CAAjB;;AAEA,cAAIxE,KAAKmE,WAAL,KAAqB,MAAzB,EAAiC;AAC/B,gBAAMM,YAAY,EAAlB;AACAnC,oBAAQ7G,GAAR,CAAY;AAAA,qBACV4H,QAAQ5H,GAAR,CAAY;AAAA,uBACVgJ,UAAU5B,IAAV,CACE3C,UAAUqE,aAAV,CAAwBnB,CAAxB,EAA2BsB,CAA3B,EAA8B/D,mBAAmBuC,GAAjD,EAAsD1G,KAAtD,EADF,CADU;AAAA,eAAZ,CADU;AAAA,aAAZ;AAOA,gBAAMmI,aAAaP,oBAAoBK,SAApB,CAAnB;AACAT,8BAAkB,yBAACZ,CAAD,EAAIsB,CAAJ,EAAOE,CAAP;AAAA,qBAAaD,WAAWC,CAAX,CAAb;AAAA,aAAlB;AACD,WAXD,MAWO,IAAI5E,KAAKmE,WAAL,KAAqB,KAAzB,EAAgC;AACrC,gBAAMU,iBAAiB,EAAvB;AACAvC,oBAAQ7G,GAAR,CAAY,aAAK;AACf,kBAAMqJ,YAAYzB,QAAQ5H,GAAR,CAAY;AAAA,uBAC5ByE,UAAUqE,aAAV,CAAwBnB,CAAxB,EAA2B7I,CAA3B,EAA8BoG,mBAAmBuC,GAAjD,EAAsD1G,KAAtD,EAD4B;AAAA,eAAZ,CAAlB;AAGAqI,6BAAezB,CAAf,IAAoBgB,oBAAoBU,SAApB,CAApB;AACD,aALD;AAMAd,8BAAkB,yBAACZ,CAAD,EAAIsB,CAAJ,EAAOE,CAAP;AAAA,qBAAaC,eAAezB,CAAf,EAAkBwB,CAAlB,CAAb;AAAA,aAAlB;AACD,WATM,MASA,IAAI5E,KAAKmE,WAAL,KAAqB,KAAzB,EAAgC;AACrC,gBAAMY,iBAAiB,EAAvB;AACA1B,oBAAQ5H,GAAR,CAAY,aAAK;AACf,kBAAMuJ,YAAY1C,QAAQ7G,GAAR,CAAY;AAAA,uBAC5ByE,UAAUqE,aAAV,CAAwBhK,CAAxB,EAA2BmK,CAA3B,EAA8B/D,mBAAmBuC,GAAjD,EAAsD1G,KAAtD,EAD4B;AAAA,eAAZ,CAAlB;AAGAuI,6BAAeL,CAAf,IAAoBN,oBAAoBY,SAApB,CAApB;AACD,aALD;AAMAhB,8BAAkB,yBAACZ,CAAD,EAAIsB,CAAJ,EAAOE,CAAP;AAAA,qBAAaG,eAAeL,CAAf,EAAkBE,CAAlB,CAAb;AAAA,aAAlB;AACD;AACF;;AAED;AACA,YAAMlH,wBAAwBoD,aAAapD,qBAAb,IAAsC,IAApE;;AAEA;AACA,YAAMoB,iBAAiBgC,aAAahC,cAAb,IAA+B,IAAtD;;AAEA;AACA,YAAMmG,wBAAwB,EAA9B;AACAxE,qBAAatF,OAAb,CAAqB,eAAO;AAC1B8J,gCAAsBlC,IAAIG,GAA1B,IAAiCH,IAAInE,cAArC;AACD,SAFD;;AAIA;AACA,YAAMsG,mBAAmB,EAAzB;AACAzE,qBAAatF,OAAb,CAAqB,eAAO;AAC1B+J,2BAAiBnC,IAAIG,GAArB,IAA4BH,GAA5B;AACD,SAFD;;AAIA;AACA;AACA;AACA,YAAMoC,sBAAsB,SAAtBA,mBAAsB,iBAAkB;AAC5C,cAAMpC,MAAMmC,iBAAiBjC,cAAjB,CAAZ;AACA,cAAI,CAACF,GAAL,EAAU;AACR,mBAAO,IAAP;AACD;AACD,cAAMqC,OAAOzH,MAAMC,OAAN,CAAcmF,IAAIqC,IAAlB,IAA0BrC,IAAIqC,IAA9B,GAAqC,EAAlD;AACA,eAAK,IAAIC,IAAI,CAAb,EAAgBA,IAAID,KAAKxK,MAAzB,EAAiCyK,GAAjC,EAAsC;AACpC,gBAAI5D,YAAY2D,KAAKC,CAAL,CAAZ,CAAJ,EAA0B;AACxB,qBAAO5D,YAAY2D,KAAKC,CAAL,CAAZ,CAAP;AACD;AACF;AACD,iBACE5D,YAAYsB,IAAI3H,KAAhB,KAA0BqG,YAAYsB,IAAInE,cAAhB,CAA1B,IAA6D,IAD/D;AAGD,SAdD;;AAgBA;AACA;AACA,YAAM0G,6BAA6B,SAA7BA,0BAA6B;AAAA,iBACjC9B,WAAW/H,GAAX,CAAe,UAACoI,OAAD,EAAUhC,GAAV,EAAkB;AAC/B,gBAAMnG,QAAQyJ,oBAAoBtB,QAAQZ,cAA5B,CAAd;AACA,mBACE;AAAA;AAAA;AACE,gCAAcpB;AACd;AAFF,kBAGE,OAAOnG,QAAQE,eAAR,GAA0BoB;AAHnC;AAKGtB,uBAAS;AALZ,aADF;AASD,WAXD,CADiC;AAAA,SAAnC;;AAcA;AACA,YAAM6J,eAAe,SAAfA,YAAe,CAAC/I,KAAD,EAA8B;AAAA,cAAtBgJ,YAAsB,uEAAP,EAAO;;AACjD,cAAMC,mBAAmBhI,8BACvBjB,KADuB,EAEvBkB,qBAFuB,CAAzB;AAIA,iBAAOQ,YAAYsH,YAAZ,EAA0BC,gBAA1B,CAAP;AACD,SAND;;AAQA;AACA,YAAMC,kBAAkB,SAAlBA,eAAkB,CAAClJ,KAAD,EAAQmJ,UAAR,EAAoB1C,cAApB,EAAuC;AAC7D,cAAMrE,iBAAiBqE,iBACnBgC,sBAAsBhC,cAAtB,CADmB,GAEnB,IAFJ;;AAIA,iBAAO/I,oBACLsC,KADK,EAELsC,cAFK,EAGL6G,WAAWvG,MAAX,CAAkBwG,IAAlB,CAAuBD,UAAvB,CAHK,EAIL/G,cAJK,CAAP;AAMD,SAXD;;AAaA;AACA;AACA,YAAMiH,cAAc,SAAdA,WAAc,MAAO;AACzB;AACA;AACA,cAAIC,QAAQ,MAAR,IAAkBA,QAAQ,IAA1B,IAAkC,OAAOA,GAAP,KAAe,WAArD,EAAkE;AAChE,mBAAOA,GAAP;AACD;;AAED;AACA,cAAIxH,0BAA0BwH,GAA1B,CAAJ,EAAoC;AAClC,mBAAOA,GAAP;AACD;;AAED;AACA;AACA;AACA,cAAI9G,YAAY,KAAhB;AACA,cAAIK,eAAe,IAAnB;;AAEA,cAAI,OAAOyG,GAAP,KAAe,QAAnB,EAA6B;AAC3B9G,wBAAY,CAACjC,MAAM+I,GAAN,CAAD,IAAe7G,SAAS6G,GAAT,CAA3B;AACA,gBAAI9G,SAAJ,EAAe;AACbK,6BAAeyG,GAAf;AACD;AACF,WALD,MAKO,IACL,OAAOA,GAAP,KAAe,QAAf,IACAA,IAAI7I,IAAJ,OAAe,EADf,IAEA6I,QAAQ,MAFR,IAGA,CAACxH,0BAA0BwH,GAA1B,CAJI,EAKL;AACA,gBAAMC,SAASlJ,WAAWiJ,IAAI7I,IAAJ,EAAX,CAAf;AACA+B,wBAAY,CAACjC,MAAMgJ,MAAN,CAAD,IAAkB9G,SAAS8G,MAAT,CAA9B;AACA,gBAAI/G,SAAJ,EAAe;AACbK,6BAAe0G,MAAf;AACD;AACF;;AAED,cACE/G,aACAK,iBAAiB,IADjB,IAEAP,cAFA,IAGAnB,MAAMC,OAAN,CAAckB,eAAejB,KAA7B,CAHA,IAIAiB,eAAejB,KAAf,CAAqBjD,MAArB,GAA8B,CALhC,EAME;AACA,gBAAM0E,eAAeR,eAAejB,KAAf,CAAqB,CAArB,CAArB;AACA,gBAAIyB,gBAAgBA,aAAaF,MAAjC,EAAyC;AACvC,kBAAMA,SAASE,aAAaF,MAA5B;AACA,kBAAMG,YAAY,6BAAa;AAC7BC,oCACE,mBAAmBJ,MAAnB,GAA4BA,OAAOK,aAAnC,GAAmD,CAFxB;AAG7BC,8BACE,kBAAkBN,MAAlB,GAA2BA,OAAOM,YAAlC,GAAiD,GAJtB;AAK7BC,4BAAY,gBAAgBP,MAAhB,GAAyBA,OAAOO,UAAhC,GAA6C,GAL5B;AAM7BC,wBAAQ,YAAYR,MAAZ,GAAqBA,OAAOQ,MAA5B,GAAqC,EANhB;AAO7BC,wBAAQ,YAAYT,MAAZ,GAAqBA,OAAOS,MAA5B,GAAqC,EAPhB;AAQ7BC,8BACE,kBAAkBV,MAAlB,GAA2BA,OAAOU,YAAlC,GAAiD;AATtB,eAAb,CAAlB;AAWA,qBAAOP,UAAUF,YAAV,CAAP;AACD;AACF;;AAED;AACA,iBAAOyG,GAAP;AACD,SA/DD;;AAiEA;AACA;AACA,YAAME,iBAAiB,SAAjBA,cAAiB,CACrBF,GADqB,EAErBG,KAFqB,EAGrBC,aAHqB,EAIrBrF,sBAJqB,EAKrBsF,cALqB,EAMlB;AACH;AACA;AACA;AACA;AACA,cACEtF,0BACAqF,aADA,IAEAD,SAASE,cAHX,EAIE;AACA,mBAAOL,GAAP;AACD;;AAED,iBAAOD,YAAYC,GAAZ,CAAP;AACD,SApBD;;AAsBA,YAAMM,kBACJtF,gBAAgBA,aAAauF,aAA7B,GACI,UAAC7J,KAAD,EAAQsI,SAAR,EAAmBE,SAAnB,EAAiC;AAC/B,cAAMsB,UAAU,EAAhB;AAD+B;AAAA;AAAA;;AAAA;AAE/B,kCAAgBtI,OAAOuI,IAAP,CAAYlG,YAAY,EAAxB,CAAhB,mIAA6C;AAAA,kBAAlChG,CAAkC;;AAC3C,kBAAMmM,OAAOnG,SAAShG,CAAT,CAAb;AACA,kBAAI2K,UAAU3K,CAAV,MAAiB,IAArB,EAA2B;AACzBiM,wBAAQE,IAAR,IAAgBxB,UAAU3K,CAAV,CAAhB;AACD;AACF;AAP8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAQ/B,kCAAgB2D,OAAOuI,IAAP,CAAYhG,YAAY,EAAxB,CAAhB,mIAA6C;AAAA,kBAAlClG,EAAkC;;AAC3C,kBAAMmM,OAAOjG,SAASlG,EAAT,CAAb;AACA,kBAAIyK,UAAUzK,EAAV,MAAiB,IAArB,EAA2B;AACzBiM,wBAAQE,IAAR,IAAgB1B,UAAUzK,EAAV,CAAhB;AACD;AACF;AAb8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAc/B,iBAAO;AAAA,mBACLyG,aAAauF,aAAb,CAA2BI,CAA3B,EAA8BjK,KAA9B,EAAqC8J,OAArC,EAA8CpG,SAA9C,CADK;AAAA,WAAP;AAED,SAjBL,GAkBI,IAnBN;;AAqBA,YAAMwG,gBAAgB,SAAhBA,aAAgB,CAACF,IAAD,EAAOC,CAAP,EAAa;AACjCA,YAAEE,eAAF;AACA,cAAI,OAAKvG,KAAL,CAAWwG,SAAf,EAA0B;AACxB,gBAAMC,cAAc,OAAKzG,KAAL,CAAW0G,QAAX,IAAuB,OAAK1G,KAAL,CAAW0G,QAAX,CAAoBN,IAApB,CAA3C;AACA,gBAAIO,WAAW,KAAf;AACA,gBAAIF,gBAAgB,KAApB,EAA2B;AACzBE,yBAAW,MAAX;AACD,aAFD,MAEO,IAAIF,gBAAgB,MAApB,EAA4B;AACjCE,yBAAW,IAAX;AACD;AACD,mBAAK3G,KAAL,CAAWwG,SAAX,CAAqBJ,IAArB,EAA2BO,QAA3B;AACD;AACF,SAZD;;AAcA,YAAMC,gBAAgB,SAAhBA,aAAgB,CAACR,IAAD,EAAOC,CAAP,EAAa;AACjCA,YAAEE,eAAF;AACA,cAAI,OAAKvG,KAAL,CAAW6G,SAAf,EAA0B;AACxB,gBAAMJ,cAAc,OAAKzG,KAAL,CAAW8G,QAAX,IAAuB,OAAK9G,KAAL,CAAW8G,QAAX,CAAoBV,IAApB,CAA3C;AACA,gBAAIO,WAAW,KAAf;AACA,gBAAIF,gBAAgB,KAApB,EAA2B;AACzBE,yBAAW,MAAX;AACD,aAFD,MAEO,IAAIF,gBAAgB,MAApB,EAA4B;AACjCE,yBAAW,IAAX;AACD;AACD,mBAAK3G,KAAL,CAAW6G,SAAX,CAAqBT,IAArB,EAA2BO,QAA3B;AACD;AACF,SAZD;;AAcA,YAAMI,gBAAgB,SAAhBA,aAAgB,CAACX,IAAD,EAAOY,KAAP,EAAiB;AACrC,cAAMP,cAAcO,QAChB,OAAKhH,KAAL,CAAW0G,QAAX,IAAuB,OAAK1G,KAAL,CAAW0G,QAAX,CAAoBN,IAApB,CADP,GAEhB,OAAKpG,KAAL,CAAW8G,QAAX,IAAuB,OAAK9G,KAAL,CAAW8G,QAAX,CAAoBV,IAApB,CAF3B;AAGA,cAAMa,aAAaD,QAAQV,aAAR,GAAwBM,aAA3C;AACA,cAAIM,WAAW,EAAf;AACA,cAAIT,gBAAgB,IAApB,EAA0B;AACxB,gBAAIO,KAAJ,EAAW;AACTE,yBACE,OAAKlH,KAAL,CAAWmH,YAAX,CAAwBV,WAAxB,KACA,OAAKzG,KAAL,CAAWmH,YAAX,CAAwBC,OAF1B;AAGD,aAJD,MAIO;AACLF,yBACE,OAAKlH,KAAL,CAAWqH,YAAX,CAAwBZ,WAAxB,KACA,OAAKzG,KAAL,CAAWqH,YAAX,CAAwBD,OAF1B;AAGD;AACF;AACD,iBACE;AAAA;AAAA;AACE,oBAAK,QADP;AAEE,yBAAU,eAFZ;AAGE,uBAAS;AAAA,uBAAKH,WAAWb,IAAX,EAAiBC,CAAjB,CAAL;AAAA,eAHX;AAIE,qBACEI,gBAAgB,KAAhB,GACI,iBADJ,GAEIA,gBAAgB,MAAhB,GACA,YADA,GAEA;AATR;AAYGS;AAZH,WADF;AAgBD,SAjCD;;AAmCA,YAAMI,uBAAuB1G,0BACzB,CAACL,kBAAD,CADyB,GAEzBE,yBACAJ,YADA,GAEA,CAACE,kBAAD,CAJJ;AAKA,YAAMgH,kBAAkB,QAAxB;;AAEA,eACE;AAAA;AAAA,YAAO,WAAU,UAAjB;AACE;AAAA;AAAA;AACGxG,6BAAiB1F,GAAjB,CAAqB,UAASiJ,CAAT,EAAYpK,CAAZ,EAAe;AACnC,qBACE;AAAA;AAAA,kBAAI,iBAAeA,CAAnB;AACG0H,mCAAmB1H,MAAM,CAAzB,IAA8B+H,wBADjC;AAEGf,qDACEN,2BAA2B1G,MAAM,CADnC,KAEC,EACE0G,2BACAI,mBADA,IAEAH,iBAAiBrG,MAAjB,KAA4B,CAH9B,CAFD,KAOE2G,kBAAkBjH,MAAM,CAAxB,IAA6B,CAAC0G,uBAA9B,GACCW,oBAAoBR,iBAAiBvG,MAArC,CADD,GAGC;AACE,2BACEoG,2BAA2BI,mBAA3B,GACIH,iBAAiBrG,MAAjB,GAA0B,CAD9B,GAEIqG,iBAAiBrG,MAJzB;AAME,2BACEoG,2BAA2BI,mBAA3B,GACI,CADJ,GAEID,iBAAiBvG;AATzB,kBAVH,CAFH;AAyBG8J,oBACC;AAAA;AAAA,oBAAI,WAAU,cAAd;AACGA,mBADH;AAEGrE,2BAAS/C,QAAT,CAAkBoH,CAAlB,KAAwByC,cAAczC,CAAd,EAAiB,IAAjB;AAF3B,iBADD,GAKG,IA9BN;AA+BGhB,6BAAajI,GAAb,CAAiB,UAASgI,MAAT,EAAiBpJ,CAAjB,EAAoB;AACpC,sBAAME,IAAIJ,SAASuJ,YAAT,EAAuBrJ,CAAvB,EAA0BC,CAA1B,CAAV;;AAEA,sBAAIC,MAAM,CAAC,CAAX,EAAc;AACZ,2BAAO,IAAP;AACD;;AAED,sBAAMqN,oBAAoB/B,YAAYpC,OAAOnJ,CAAP,CAAZ,CAA1B;AACA,yBACE;AAAA;AAAA;AACE,iCAAU,aADZ;AAEE,sCAAcD,CAFhB;AAGE,+BAASE,CAHX;AAIE,+BACED,MAAM6G,iBAAiBvG,MAAjB,GAA0B,CAAhC,IACAqG,iBAAiBrG,MAAjB,KAA4B,CAD5B,IAEA,CAACoG,uBAFD,GAGI,CAHJ,GAII;AATR;AAYG4G;AAZH,mBADF;AAgBD,iBAxBA,CA/BH;AAyDGvG,oCAAoB/G,MAAM,CAA1B,IACC;AAAA;AAAA;AACE,+BAAU,eADZ;AAEE,6BACE6G,iBAAiBvG,MAAjB,IACCqG,iBAAiBrG,MAAjB,KAA4B,CAA5B,GAAgC,CAAhC,GAAoC,CADrC;AAHJ;AAOG+M;AAPH;AA1DJ,eADF;AAuED,aAxEA,CADH;AA6EG3G,uCAA2BI,mBAA3B,IAAkDG,cAAlD,IACC;AAAA;AAAA;AACGI,kCAAoB,CAApB,CADH;AAEG2D;AAFH,aA9EJ;AAqFG/D,8BACCJ,iBAAiBvG,MAAjB,KAA4B,CAD7B,IAECqG,iBAAiBrG,MAAjB,KAA4B,CAF7B,IAGG;AAAA;AAAA;AACGoH,iCAAmBK,wBADtB;AAEGV,kCAAoB,CAApB,CAFH;AAGGX,wCACCsE,4BADD,GAGC;AANJ,aAxFN;AAmGGtE,uCAA2BI,mBAA3B,IACC;AAAA;AAAA;AACGH,+BAAiBrG,MAAjB,KAA4B,CAA5B,IACCqG,iBAAiBxF,GAAjB,CAAqB,UAAC2H,CAAD,EAAI/I,CAAJ,EAAU;AAC7B,oBAAMwN,YAAYxN,IAAIkG,SAAS3F,MAA/B;AACA,oBAAM4L,OAAOqB,YAAYtH,SAASlG,CAAT,CAAZ,GAA0B,IAAvC;AACA,uBACE;AAAA;AAAA,oBAAI,WAAU,cAAd,EAA6B,sBAAoBA,CAAjD;AACG+I,mBADH;AAEGyE,+BAAarB,IAAb,IAAqBW,cAAcX,IAAd,EAAoB,KAApB;AAFxB,iBADF;AAMD,eATD,CAFJ;AAYG5C;AAZH,aApGJ;AAoHG3C,6BAAiBrG,MAAjB,KAA4B,CAA5B,IACC,EAAEoG,2BAA2BI,mBAA7B,CADD,IAEG;AAAA;AAAA;AACGY,iCACCb,iBAAiBvG,MAAjB,KAA4B,CAD7B,IAEC,CAACwH,sBAFF,IAGCC,wBAJJ;AAKGpB,+BAAiBxF,GAAjB,CAAqB,UAAC2H,CAAD,EAAI/I,CAAJ,EAAU;AAC9B,oBAAMwN,YAAYxN,IAAIkG,SAAS3F,MAA/B;AACA,oBAAM4L,OAAOqB,YAAYtH,SAASlG,CAAT,CAAZ,GAA0B,IAAvC;AACA,uBACE;AAAA;AAAA,oBAAI,WAAU,cAAd,EAA6B,iBAAeA,CAA5C;AACG+I,mBADH;AAEGyE,+BAAarB,IAAb,IAAqBW,cAAcX,IAAd,EAAoB,KAApB;AAFxB,iBADF;AAMD,eATA,CALH;AAeGxF,yCAA2B,CAACI,mBAA5B,GACGwC,6BADH,GAEG,IAjBN;AAkBGvC,kCACC;AAAA;AAAA,kBAAI,WAAU,eAAd;AACGhB,yBAASzF,MAAT,KAAoB,CAApB,GAAwB+M,eAAxB,GAA0C;AAD7C;AAnBJ;AAtHN,WADF;AAkJE;AAAA;AAAA;AACGlF,yBAAahH,GAAb,CAAiB,UAASqM,OAAT,EAAkBzN,CAAlB,EAAqB;AACrC,kBAAM0N,kBAAkB7H,UAAUqE,aAAV,CACtBuD,QAAQ9E,SADc,EAEtB,EAFsB,EAGtB8E,QAAQ7E,cAHc,CAAxB;AAKA,kBAAMH,aAAagF,QAAQhF,UAA3B;AACA,qBACE;AAAA;AAAA,kBAAI,mBAAiBzI,CAArB;AACG2H,mCACC;AAAA;AAAA,oBAAI,WAAU,cAAd,EAA6B,mBAAiB3H,CAA9C;AACGA,sBAAI;AADP,iBAFJ;AAMGyI,2BAAWrH,GAAX,CAAe,UAASqK,GAAT,EAAcxL,CAAd,EAAiB;AAC/B,sBAAMC,IAAIJ,SAASgJ,YAAT,EAAuB9I,CAAvB,EAA0BC,CAA1B,CAAV;AACA,sBAAIC,MAAM,CAAC,CAAX,EAAc;AACZ,2BAAO,IAAP;AACD;AACD,sBAAM2L,gBAAgB5L,MAAMwI,WAAWlI,MAAX,GAAoB,CAAhD;AACA,sBAAMoN,eAAehC,eACnBF,GADmB,EAEnBxL,CAFmB,EAGnB4L,aAHmB,EAInBrF,sBAJmB,EAKnBN,SAAS3F,MALU,CAArB;AAOA,yBACE;AAAA;AAAA;AACE,2CAAmBP,CAAnB,SAAwBC,CAD1B;AAEE,iCAAU,aAFZ;AAGE,+BAASC,CAHX;AAIE,+BACE8G,oBACA/G,MAAM2G,iBAAiBrG,MAAjB,GAA0B,CADhC,IAEAuG,iBAAiBvG,MAAjB,KAA4B,CAF5B,GAGI,CAHJ,GAII;AATR;AAYGoN;AAZH,mBADF;AAgBD,iBA7BA,CANH;AAoCGxE,2BAAW/H,GAAX,CAAe,UAASoI,OAAT,EAAkBvJ,CAAlB,EAAqB;AACnC,sBAAM2N,wBAAwBjH,0BAC1B6C,QAAQZ,cADkB,GAE1B6E,QAAQ7E,cAFZ;AAGA,sBAAM0C,aAAazF,UAAUqE,aAAV,CACjBuD,QAAQ9E,SADS,EAEjBa,QAAQb,SAFS,EAGjBiF,qBAHiB,CAAnB;AAKA,sBAAMzL,QAAQmJ,WAAWnJ,KAAX,EAAd;AACA,sBAAMgJ,eACJxB,gBACE8D,QAAQ9E,SADV,EAEEa,QAAQb,SAFV,EAGExG,KAHF,KAIK,EALP;AAMA,yBACE;AAAA;AAAA;AACE,iCAAU,QADZ;AAEE,sCAAcnC,CAAd,SAAmBC,CAFrB;AAGE,+BACE8L,mBACAA,gBACE5J,KADF,EAEEsL,QAAQ9E,SAFV,EAGEa,QAAQb,SAHV,CALJ;AAWE,6BAAOuC,aAAa/I,KAAb,EAAoBgJ,YAApB;AAXT;AAaGE,oCACClJ,KADD,EAECmJ,UAFD,EAGCsC,qBAHD;AAbH,mBADF;AAqBD,iBArCA,CApCH;AA0EG5G,oCACC;AAAA;AAAA;AACE,+BAAU,UADZ;AAEE,6BACE+E,mBACAA,gBACE2B,gBAAgBvL,KAAhB,EADF,EAEEsL,QAAQ9E,SAFV,EAGE,CAAC,IAAD,CAHF,CAJJ;AAUE,2BAAOuC,aACLwC,gBAAgBvL,KAAhB,EADK,EAEL0H,eAAe6D,gBAAgBvL,KAAhB,EAAf,KAA2C,EAFtC;AAVT;AAeGkJ,kCACCqC,gBAAgBvL,KAAhB,EADD,EAECuL,eAFD,EAGCD,QAAQ7E,cAHT;AAfH;AA3EJ,eADF;AAoGD,aA3GA,CADH;AA8GGyE,iCAAqBjM,GAArB,CAAyB,UAASsH,GAAT,EAAc;AACtC,kBAAMmF,uBAAuBhI,UAAUqE,aAAV,CAC3B,EAD2B,EAE3B,EAF2B,EAG3BvD,0BAA0BL,mBAAmBuC,GAA7C,GAAmDH,IAAIG,GAH5B,CAA7B;AAKA,kBAAMiF,aACJtH,0BAA0B,CAACG,uBAA3B,uBACgB+B,IAAI3H,KAAJ,IAAa2H,IAAInE,cADjC,IAEI+I,eAHN;AAIA,qBACE;AAAA;AAAA,kBAAI,mBAAiB5E,IAAIG,GAAzB;AACE;AAAA;AAAA;AACE,+BAAU,eADZ;AAEE,6BACEjC,iBAAiBrG,MAAjB,IACCyF,SAASzF,MAAT,KAAoB,CAApB,IACAoG,2BAA2BI,mBAD3B,GAEG,CAFH,GAGG,CAJJ,KAKCY,kBAAkB,CAAlB,GAAsB,CALvB;AAHJ;AAWGmG;AAXH,iBADF;AAeG3E,2BAAW/H,GAAX,CAAe,UAASoI,OAAT,EAAkBxJ,CAAlB,EAAqB;AACnC,sBAAM0N,kBAAkB7H,UAAUqE,aAAV,CACtB,EADsB,EAEtBV,QAAQb,SAFc,EAGtBhC,0BAA0B6C,QAAQZ,cAAlC,GAAmDF,IAAIG,GAHjC,CAAxB;AAKA,sBAAMkF,aAAaL,gBAAgBvL,KAAhB,EAAnB;AACA,yBACE;AAAA;AAAA;AACE,iCAAU,UADZ;AAEE,qCAAauG,IAAIG,GAAjB,SAAwB7I,CAF1B;AAGE,+BACE+L,mBACAA,gBAAgBgC,UAAhB,EAA4B,CAAC,IAAD,CAA5B,EAAoCvE,QAAQb,SAA5C,CALJ;AAOE,6BAAOuC,aACL6C,UADK,EAELnE,eAAemE,UAAf,KAA8B,EAFzB;AAPT;AAYG1C,oCAAgB0C,UAAhB,EAA4BL,eAA5B,EAA6ChF,IAAIG,GAAjD;AAZH,mBADF;AAgBD,iBAvBA,CAfH;AAwCG7B,oCACC;AAAA;AAAA;AACE,6BACE+E,mBACAA,gBACE8B,qBAAqB1L,KAArB,EADF,EAEE,CAAC,IAAD,CAFF,EAGE,CAAC,IAAD,CAHF,CAHJ;AASE,+BAAU,eATZ;AAUE,2BAAO+I,aAAa2C,qBAAqB1L,KAArB,EAAb,EAA2C,EAA3C;AAVT;AAYGkJ,kCACCwC,qBAAqB1L,KAArB,EADD,EAEC0L,oBAFD,EAGClH,0BACIL,mBAAmBuC,GADvB,GAEIH,IAAIG,GALT;AAZH;AAzCJ,eADF;AAiED,aA3EA;AA9GH;AAlJF,SADF;AAgVD;AA1yB4B;;AAAA;AAAA,IACHmF,gBAAMC,aADH;;AA6yB/BrI,gBAAcsI,YAAd,GAA6BpI,qBAAUoI,YAAvC;AACAtI,gBAAcuI,SAAd,GAA0BrI,qBAAUqI,SAApC;AACAvI,gBAAcsI,YAAd,CAA2BlE,wBAA3B,GAAsDvI,sBAAtD;AACAmE,gBAAcsI,YAAd,CAA2BzH,YAA3B,GAA0C,EAA1C;AACAb,gBAAcsI,YAAd,CAA2BzB,QAA3B,GAAsC,EAAtC;AACA7G,gBAAcsI,YAAd,CAA2BrB,QAA3B,GAAsC,EAAtC;AACAjH,gBAAcsI,YAAd,CAA2BtN,cAA3B,GAA4C,IAA5C;AACAgF,gBAAcuI,SAAd,CAAwBnE,wBAAxB,GAAmDoE,oBAAUC,IAA7D;AACAzI,gBAAcuI,SAAd,CAAwB1H,YAAxB,GAAuC2H,oBAAUE,MAAjD;AACA1I,gBAAcuI,SAAd,CAAwB1B,QAAxB,GAAmC2B,oBAAUG,QAAV,CACjCH,oBAAUI,KAAV,CAAgB,CAAC,KAAD,EAAQ,MAAR,CAAhB,CADiC,CAAnC;AAGA5I,gBAAcuI,SAAd,CAAwBtB,QAAxB,GAAmCuB,oBAAUG,QAAV,CACjCH,oBAAUI,KAAV,CAAgB,CAAC,KAAD,EAAQ,MAAR,CAAhB,CADiC,CAAnC;AAGA5I,gBAAcuI,SAAd,CAAwB5B,SAAxB,GAAoC6B,oBAAUC,IAA9C;AACAzI,gBAAcuI,SAAd,CAAwBvB,SAAxB,GAAoCwB,oBAAUC,IAA9C;AACAzI,gBAAcuI,SAAd,CAAwBvN,cAAxB,GAAyCwN,oBAAUK,OAAV,CACvCL,oBAAUM,KAAV,CAAgB;AACd3N,WAAOqN,oBAAUO,MAAV,CAAiBC,UADV;AAEd5N,WAAOoN,oBAAUK,OAAV,CAAkBL,oBAAUO,MAA5B,EAAoCC;AAF7B,GAAhB,CADuC,CAAzC;AAMAhJ,gBAAcsI,YAAd,CAA2BhB,YAA3B,GAA0C;AACxC2B,SAAK,GADmC;AAExCC,UAAM,GAFkC;AAGxC3B,aAAS;AAH+B,GAA1C;AAKAvH,gBAAcsI,YAAd,CAA2Bd,YAA3B,GAA0C;AACxCyB,SAAK,GADmC;AAExCC,UAAM,GAFkC;AAGxC3B,aAAS;AAH+B,GAA1C;AAKAvH,gBAAcuI,SAAd,CAAwBjB,YAAxB,GAAuCkB,oBAAUM,KAAV,CAAgB;AACrDG,SAAKT,oBAAUW,IADsC;AAErDD,UAAMV,oBAAUW,IAFqC;AAGrD5B,aAASiB,oBAAUW;AAHkC,GAAhB,CAAvC;AAKAnJ,gBAAcuI,SAAd,CAAwBf,YAAxB,GAAuCgB,oBAAUM,KAAV,CAAgB;AACrDG,SAAKT,oBAAUW,IADsC;AAErDD,UAAMV,oBAAUW,IAFqC;AAGrD5B,aAASiB,oBAAUW;AAHkC,GAAhB,CAAvC;AAKA;AACA;AACAnJ,gBAAcsI,YAAd,CAA2BxG,kBAA3B,GAAgD,KAAhD;AACA9B,gBAAcuI,SAAd,CAAwBzG,kBAAxB,GAA6C0G,oBAAUY,IAAvD;AACA,SAAOpJ,aAAP;AACD;;IAEKqJ,iB;;;;;;;;;;;6BACK;AACP,UAAMpJ,YAAY,IAAIC,oBAAJ,CAAc,KAAKC,KAAnB,CAAlB;AACA,UAAMG,WAAWL,UAAUE,KAAV,CAAgBI,IAAjC;AACA,UAAMC,eAAeP,UAAUQ,eAAV,EAArB;AACA,UAAMG,yBAAyBJ,aAAa7F,MAAb,GAAsB,CAArD;AACA,UAAM0H,UAAUpC,UAAUqC,UAAV,EAAhB;AACA,UAAMc,UAAUnD,UAAUoD,UAAV,EAAhB;AACA,UAAMiG,cAAcjH,QAAQ1H,MAAR,KAAmB,CAAnB,GAAuB,CAAC,EAAD,CAAvB,GAA8B0H,OAAlD;AACA,UAAMkH,cAAcnG,QAAQzI,MAAR,KAAmB,CAAnB,GAAuB,CAAC,EAAD,CAAvB,GAA8ByI,OAAlD;;AAEA,UAAMoG,aAAa5I,yBACf0I,YAAY7G,MAAZ,CAAmB,UAACC,GAAD,EAAMC,MAAN,EAAiB;AAClCnC,qBAAatF,OAAb,CAAqB,eAAO;AAC1BwH,cAAIE,IAAJ,CAAS,EAACD,cAAD,EAASK,gBAAgBF,IAAIG,GAA7B,EAAkC9H,OAAO2H,IAAI3H,KAA7C,EAAT;AACD,SAFD;AAGA,eAAOuH,GAAP;AACD,OALD,EAKG,EALH,CADe,GAOf4G,YAAY9N,GAAZ,CAAgB;AAAA,eAAW;AACzBmH,wBADyB;AAEzBK,0BAAgBxC,aAAa,CAAb,EAAgByC,GAFP;AAGzB9H,iBAAOqF,aAAa,CAAb,EAAgBrF,KAAhB,IAAyBqF,aAAa,CAAb,EAAgB7B;AAHvB,SAAX;AAAA,OAAhB,CAPJ;;AAaA,UAAM8K,YAAYnJ,SAASoJ,KAAT,EAAlB;AACA,UAAI9I,sBAAJ,EAA4B;AAC1B6I,kBAAU7G,IAAV,CAAe,QAAf;AACD;AACD,UAAI2G,YAAY5O,MAAZ,KAAuB,CAAvB,IAA4B4O,YAAY,CAAZ,EAAe5O,MAAf,KAA0B,CAA1D,EAA6D;AAC3D8O,kBAAU7G,IAAV,CACEhC,yBACI,OADJ,GAEIJ,aAAa,CAAb,EAAgBrF,KAAhB,IAAyBqF,aAAa,CAAb,EAAgB7B,cAH/C;AAKD,OAND,MAMO;AACL4K,oBAAY/N,GAAZ,CAAgB;AAAA,iBAAKiO,UAAU7G,IAAV,CAAe6B,EAAEkF,IAAF,CAAO,GAAP,CAAf,CAAL;AAAA,SAAhB;AACD;;AAED,UAAMC,SAASJ,WAAWhO,GAAX,CAAe,iBAAS;AACrC,YAAMqO,MAAMC,MAAMnH,MAAN,CAAanH,GAAb,CAAiB;AAAA,iBAAKlB,CAAL;AAAA,SAAjB,CAAZ;AACA,YAAIsG,sBAAJ,EAA4B;AAC1BiJ,cAAIjH,IAAJ,CAASkH,MAAM3O,KAAN,IAAe,EAAxB;AACD;AACDoO,oBAAY/N,GAAZ,CAAgB,kBAAU;AACxB,cAAMmJ,IAAI1E,UACPqE,aADO,CACOwF,MAAMnH,MADb,EACqBa,MADrB,EAC6BsG,MAAM9G,cADnC,EAEPzG,KAFO,EAAV;AAGAsN,cAAIjH,IAAJ,CAAS+B,IAAIA,CAAJ,GAAQ,EAAjB;AACD,SALD;AAMA,eAAOkF,GAAP;AACD,OAZc,CAAf;;AAcAD,aAAOG,OAAP,CAAeN,SAAf;;AAEA,aACE;AACE,eAAOG,OAAOpO,GAAP,CAAW;AAAA,iBAAK2H,EAAEwG,IAAF,CAAO,IAAP,CAAL;AAAA,SAAX,EAA8BA,IAA9B,CAAmC,IAAnC,CADT;AAEE,eAAO,EAACK,OAAOC,OAAOC,UAAP,GAAoB,CAA5B,EAA+BC,QAAQF,OAAOG,WAAP,GAAqB,CAA5D,EAFT;AAGE,kBAAU;AAHZ,QADF;AAOD;;;;EA7D6BhC,gBAAMC,a;;AAgEtCgB,kBAAkBf,YAAlB,GAAiCpI,qBAAUoI,YAA3C;AACAe,kBAAkBd,SAAlB,GAA8BrI,qBAAUqI,SAAxC;;kBAEe;AACb8B,SAAOvK,cADM;AAEb,mBAAiBA,aAAa,EAACoE,aAAa,MAAd,EAAb,CAFJ;AAGb,uBAAqBpE,aAAa,EAACoE,aAAa,KAAd,EAAb,CAHR;AAIb,uBAAqBpE,aAAa,EAACoE,aAAa,KAAd,EAAb,CAJR;AAKb,oBAAkBmF;AALL,C","file":"TableRenderers.js","sourcesContent":["/* eslint-disable no-inline-comments */\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {PivotData, numberFormat} from './Utilities';\n\n// helper function for setting row/col-span in pivotTableRenderer\nconst spanSize = function(arr, i, j) {\n let x;\n if (i !== 0) {\n let asc, end;\n let noDraw = true;\n for (\n x = 0, end = j, asc = end >= 0;\n asc ? x <= end : x >= end;\n asc ? x++ : x--\n ) {\n if (arr[i - 1][x] !== arr[i][x]) {\n noDraw = false;\n }\n }\n if (noDraw) {\n return -1;\n }\n }\n let len = 0;\n while (i + len < arr.length) {\n let asc1, end1;\n let stop = false;\n for (\n x = 0, end1 = j, asc1 = end1 >= 0;\n asc1 ? x <= end1 : x >= end1;\n asc1 ? x++ : x--\n ) {\n if (arr[i][x] !== arr[i + len][x]) {\n stop = true;\n }\n }\n if (stop) {\n break;\n }\n len++;\n }\n return len;\n};\n\n// ==> Build a lookup: name -> group label <==\n// `match` can contain row attribute names, the synthetic 'Values' column\n// (aggregations displayed as rows) and aggregation names/labels\n// (aggregations displayed as columns).\nfunction buildGroupLookup(rowGroupConfig) {\n const lookup = {};\n (rowGroupConfig || []).forEach(({label, match}) => {\n match.forEach(name => {\n lookup[name] = label;\n });\n });\n return lookup;\n}\n\n// ==> Calculate the positions for GroupSegments <==\nfunction buildHeaderGroupSegments(attrs, rowGroupConfig) {\n const lookup = buildGroupLookup(rowGroupConfig);\n\n // Mỗi attribute luôn là 1 segment riêng — không gộp colSpan nữa,\n // để label nhóm (vd \"AAA\") hiện lặp lại trên từng cột con.\n return attrs.map(name => ({group: lookup[name] || null, span: 1}));\n}\n\n// Style cho ô có nhãn nhóm trong group header\nconst groupLabelStyle = {\n textAlign: 'center',\n};\n\nfunction redColorScaleGenerator(values) {\n const min = Math.min.apply(Math, values);\n const max = Math.max.apply(Math, values);\n return x => {\n // eslint-disable-next-line no-magic-numbers\n const nonRed = 255 - Math.round((255 * (x - min)) / (max - min));\n return {backgroundColor: `rgb(255,${nonRed},${nonRed})`};\n };\n}\n\n// Conditional formatting evaluation function\nfunction evaluateCondition(value, condition) {\n if (!condition || !condition.type) {\n return false;\n }\n\n const {type, value: conditionValue} = condition;\n const numValue = typeof value === 'number' ? value : parseFloat(value);\n const numConditionValue =\n typeof conditionValue === 'number'\n ? conditionValue\n : parseFloat(conditionValue);\n\n switch (type) {\n case 'greaterThan':\n return (\n !isNaN(numValue) &&\n !isNaN(numConditionValue) &&\n numValue > numConditionValue\n );\n case 'lessThan':\n return (\n !isNaN(numValue) &&\n !isNaN(numConditionValue) &&\n numValue < numConditionValue\n );\n case 'greaterThanOrEqual':\n return (\n !isNaN(numValue) &&\n !isNaN(numConditionValue) &&\n numValue >= numConditionValue\n );\n case 'lessThanOrEqual':\n return (\n !isNaN(numValue) &&\n !isNaN(numConditionValue) &&\n numValue <= numConditionValue\n );\n case 'equal':\n if (typeof value === 'string' && typeof conditionValue === 'string') {\n return value === conditionValue;\n }\n return (\n !isNaN(numValue) &&\n !isNaN(numConditionValue) &&\n numValue === numConditionValue\n );\n case 'notEqual':\n if (typeof value === 'string' && typeof conditionValue === 'string') {\n return value !== conditionValue;\n }\n return (\n isNaN(numValue) ||\n isNaN(numConditionValue) ||\n numValue !== numConditionValue\n );\n case 'empty':\n // Check for null, undefined, empty string, whitespace-only strings, or NaN\n // eslint-disable-next-line no-undefined\n if (value === null || value === undefined) {\n return true;\n }\n if (typeof value === 'string') {\n return value.trim() === '';\n }\n if (typeof value === 'number') {\n return isNaN(value);\n }\n return false;\n case 'notEmpty':\n // Check that value is not null, undefined, empty/whitespace string, or NaN\n // eslint-disable-next-line no-undefined\n if (value === null || value === undefined) {\n return false;\n }\n if (typeof value === 'string') {\n return value.trim() !== '';\n }\n if (typeof value === 'number') {\n return !isNaN(value);\n }\n // Other types (boolean, object, etc.) are considered not empty\n return true;\n // eslint-disable-next-line no-case-declarations\n case 'contains':\n // Convert both values to strings for comparison\n // This handles cases where values are numbers (from aggregators) or conditionValue is parsed as number\n const valueStr = String(value || '');\n const conditionValueStr = String(conditionValue || '');\n if (valueStr && conditionValueStr) {\n return valueStr.toLowerCase().includes(conditionValueStr.toLowerCase());\n }\n return false;\n // eslint-disable-next-line no-case-declarations\n case 'notContains':\n // Convert both values to strings for comparison\n // This handles cases where values are numbers (from aggregators) or conditionValue is parsed as number\n const valueStr2 = String(value || '');\n const conditionValueStr2 = String(conditionValue || '');\n if (valueStr2 && conditionValueStr2) {\n return !valueStr2\n .toLowerCase()\n .includes(conditionValueStr2.toLowerCase());\n }\n return true;\n default:\n return false;\n }\n}\n\n// Apply conditional formatting rules to a value\nfunction getConditionalFormattingStyle(value, conditionalFormatting) {\n if (!conditionalFormatting || !Array.isArray(conditionalFormatting.rules)) {\n return {};\n }\n\n // Evaluate rules in order, return first matching rule's style\n for (const rule of conditionalFormatting.rules) {\n if (evaluateCondition(value, rule.condition)) {\n // Return a copy of the style object to avoid mutations\n return rule.style ? Object.assign({}, rule.style) : {};\n }\n }\n\n return {};\n}\n\n// Merge styles, with conditional formatting taking precedence\nfunction mergeStyles(...styles) {\n return Object.assign({}, ...styles.filter(s => s && typeof s === 'object'));\n}\n\n// Helper function to check if a string contains special characters (like -, /, etc.)\n// This prevents formatting of date strings or formatted strings\n// Only pure numeric strings (with optional decimal point and minus sign) should be formatted\nfunction containsSpecialCharacters(str) {\n if (typeof str !== 'string') {\n return false;\n }\n const trimmed = str.trim();\n // Check if string contains any special characters that indicate it's not a raw number\n // Allow: digits, decimal point, minus sign at start, plus sign at start, spaces\n // Disallow: hyphens in middle, slashes, and other special characters\n const pureNumericPattern = /^-?\\d*\\.?\\d+$/;\n return !pureNumericPattern.test(trimmed);\n}\n\n// Helper function to check if an aggregation should skip formatting\n// Aggregations like Count, First, Last should not be formatted\n// Aggregations like Sum, Average should be formatted\nfunction shouldSkipFormattingForAggregation(aggregatorName) {\n if (!aggregatorName) {\n return false;\n }\n\n const name = aggregatorName.toLowerCase();\n // Skip formatting for these aggregation types\n const skipFormattingAggregations = [\n 'count',\n 'count unique values',\n 'list unique values',\n 'first',\n 'last',\n 'minimum',\n 'maximum',\n ];\n return skipFormattingAggregations.includes(name);\n}\n\n// Apply cell formatting rules to a value\nexport function applyCellFormatting(\n value,\n cellFormatting,\n defaultFormatter,\n aggregatorName = null\n) {\n // Don't format if aggregation type should skip formatting (e.g., Count, First, Last)\n // Only use defaultFormatter if value is numeric, otherwise return as-is\n const isNumeric =\n (typeof value === 'number' && !isNaN(value) && isFinite(value)) ||\n (typeof value === 'string' &&\n value.trim() !== '' &&\n !containsSpecialCharacters(value) &&\n !isNaN(parseFloat(value)) &&\n isFinite(parseFloat(value)));\n if (shouldSkipFormattingForAggregation(aggregatorName)) {\n if (isNumeric && defaultFormatter) {\n return defaultFormatter(value);\n }\n // Return raw value for non-numeric values (dates, strings, etc.)\n return value;\n }\n\n // If no cellFormatting rules, always use default formatter to return to original format\n // This ensures values return to their original format when cellFormatting is cleared\n // Check for all possible cases: null, undefined, empty object, empty rules array\n const hasFormattingRules =\n cellFormatting &&\n typeof cellFormatting === 'object' &&\n Array.isArray(cellFormatting.rules) &&\n cellFormatting.rules.length > 0 &&\n cellFormatting.rules.some(rule => rule && rule.format);\n\n if (!hasFormattingRules) {\n // When cellFormatting rules are cleared, return the raw value (not formatted)\n // This ensures all cells (regular, Totals, Aggregation) return to their original unformatted state\n // Return the raw numeric value for numbers, or the value as-is for other types\n if (isNumeric) {\n // Return raw numeric value without any formatting\n if (typeof value === 'number') {\n return value;\n }\n // For string numbers, return the parsed numeric value\n return parseFloat(value);\n }\n // For non-numeric values (dates, strings, etc.), return as-is\n return value;\n }\n\n // Don't format if it contains special characters (dates, formatted strings, etc.)\n // Only check this when cellFormatting rules exist\n if (containsSpecialCharacters(value)) {\n return defaultFormatter ? defaultFormatter(value) : String(value);\n }\n\n // Check if value is a number - only apply custom formatting to raw numbers\n // Handle both number type and string numbers (e.g., \"123.45\")\n // Exclude strings with special characters from formatting\n let numericValue = value;\n\n // Convert string numbers to actual numbers for formatting\n if (isNumeric && typeof value === 'string') {\n numericValue = parseFloat(value);\n }\n\n // Use the first rule (all rules apply to all values)\n const matchingRule = cellFormatting.rules[0];\n\n // If we found a matching rule and value is numeric, apply its formatting\n if (matchingRule && matchingRule.format && isNumeric) {\n const format = matchingRule.format;\n const formatter = numberFormat({\n digitsAfterDecimal: 'decimalPlaces' in format ? format.decimalPlaces : 2,\n thousandsSep: 'thousandsSep' in format ? format.thousandsSep : ',',\n decimalSep: 'decimalSep' in format ? format.decimalSep : '.',\n prefix: 'prefix' in format ? format.prefix : '',\n suffix: 'suffix' in format ? format.suffix : '',\n showOriginal: 'showOriginal' in format ? format.showOriginal : false,\n });\n return formatter(numericValue);\n }\n\n // Not numeric or no matching rule, use default formatter\n return defaultFormatter ? defaultFormatter(value) : String(value);\n}\n\nfunction makeRenderer(opts = {}) {\n class TableRenderer extends React.PureComponent {\n render() {\n const pivotData = new PivotData(this.props);\n const colAttrs = pivotData.props.cols;\n const rowAttrs = pivotData.props.rows;\n const aggregations = pivotData.getAggregations();\n const primaryAggregation = pivotData.getPrimaryAggregation();\n const hasMultipleAggregators = aggregations.length > 1;\n const tableOptions = this.props.tableOptions || {};\n const aggregationDisplayMode =\n tableOptions.aggregationDisplayMode === 'column' ? 'column' : 'row';\n const isColumnAggregationMode =\n aggregationDisplayMode === 'column' && hasMultipleAggregators;\n const rowAttrsToRender =\n hasMultipleAggregators && !isColumnAggregationMode\n ? rowAttrs.concat(['Values'])\n : rowAttrs;\n const colAttrsToRender = colAttrs;\n const hasColumnAttributes = colAttrsToRender.length > 0;\n const showTotalsColumn = !isColumnAggregationMode;\n const shouldRenderRowHeaderPlaceholder = rowAttrsToRender.length !== 0;\n\n // --- Row group header (rowGroupConfig) ---\n // `match` may reference row attribute names, 'Values' (aggregations shown\n // as rows) and aggregation names/labels (aggregations shown as columns).\n // Every column gets its own <th>, so the group label is repeated on each.\n const rowGroupConfig = this.props.rowGroupConfig;\n const hasHeaderGroup = Boolean(rowGroupConfig && rowGroupConfig.length);\n const groupLookup = buildGroupLookup(rowGroupConfig);\n const headerGroupSegments = hasHeaderGroup\n ? buildHeaderGroupSegments(rowAttrsToRender, rowGroupConfig)\n : [];\n const renderGroupSegments = rowSpan =>\n headerGroupSegments.map((seg, idx) => (\n <th\n key={`hgSeg${idx}`}\n colSpan={seg.span}\n rowSpan={rowSpan}\n // eslint-disable-next-line no-undefined\n style={seg.group ? groupLabelStyle : undefined}\n >\n {seg.group || ''}\n </th>\n ));\n // --- End row group header ---\n\n // --- Optional \"No.\" column (showNumericalOrder) ---\n // When enabled every data row is prefixed with its 1-based index, in a\n // column labelled \"No.\" placed before the row attribute columns.\n const showNumericalOrder = Boolean(this.props.showNumericalOrder);\n const hasNumberColumn =\n showNumericalOrder &&\n (rowAttrsToRender.length !== 0 || colAttrsToRender.length !== 0);\n const numberColumnLabel = 'No.';\n const renderedAggregationHeaderRow =\n isColumnAggregationMode && hasColumnAttributes;\n // The \"No.\" header cell is rendered in the first header row and spans\n // every header row, so the repeated header rows (column attributes,\n // aggregator labels, row group labels) stay aligned with the body.\n const numberColumnHeaderRowSpan =\n colAttrsToRender.length +\n (renderedAggregationHeaderRow ? 1 : 0) +\n (rowAttrsToRender.length !== 0 && !renderedAggregationHeaderRow\n ? 1\n : 0) +\n (hasHeaderGroup &&\n colAttrsToRender.length === 0 &&\n rowAttrsToRender.length !== 0\n ? 1\n : 0) +\n (renderedAggregationHeaderRow && hasHeaderGroup ? 1 : 0);\n const numberColumnInGroupRow =\n hasHeaderGroup &&\n colAttrsToRender.length === 0 &&\n rowAttrsToRender.length !== 0;\n const renderNumberHeaderCell = (rowSpan = numberColumnHeaderRowSpan) => (\n <th className=\"pvtAxisLabel pvtRowNumber\" rowSpan={rowSpan}>\n {numberColumnLabel}\n </th>\n );\n // --- End \"No.\" column ---\n\n const rowKeys = pivotData.getRowKeys();\n const baseRowKeys =\n hasMultipleAggregators &&\n !isColumnAggregationMode &&\n rowKeys.length === 0\n ? [[]]\n : rowKeys;\n const renderedRows =\n hasMultipleAggregators && !isColumnAggregationMode\n ? baseRowKeys.reduce((acc, rowKey) => {\n aggregations.forEach(agg => {\n acc.push({\n displayKey: rowKey.concat([agg.label || agg.aggregatorName]),\n actualKey: rowKey,\n aggregationKey: agg.key,\n });\n });\n return acc;\n }, [])\n : baseRowKeys.map(rowKey => ({\n displayKey: rowKey,\n actualKey: rowKey,\n aggregationKey: primaryAggregation.key,\n }));\n const rowKeyValues = renderedRows.map(r => r.displayKey);\n const colKeys = pivotData.getColKeys();\n const baseColKeys =\n isColumnAggregationMode && colKeys.length === 0 ? [[]] : colKeys;\n const columnMeta = isColumnAggregationMode\n ? baseColKeys.reduce((acc, colKey) => {\n aggregations.forEach(agg => {\n acc.push({\n displayKey: colKey.concat([agg.label || agg.aggregatorName]),\n actualKey: colKey,\n aggregationKey: agg.key,\n });\n });\n return acc;\n }, [])\n : colKeys.map(colKey => ({\n displayKey: colKey,\n actualKey: colKey,\n aggregationKey: primaryAggregation.key,\n }));\n const colKeyValues = columnMeta.map(col => col.displayKey);\n\n const renderAggregatorHeaderCells = () =>\n columnMeta.map((colMeta, idx) => {\n const label = colMeta.displayKey[colMeta.displayKey.length - 1] || '';\n // Calculate colspan/rowspan so aggregator headers line up with column groups\n // aggregator index is the last element in displayKey (after column attrs)\n const aggIndex = colAttrsToRender.length;\n // When there are column attributes, each aggregator should appear once per column group,\n // so each aggregator header should have colSpan = 1.\n // When there are no column attributes, use spanSize to merge identical aggregator labels.\n let colSpan;\n if (hasColumnAttributes) {\n // Each aggregator appears once per column group, so colSpan is always 1\n // This ensures aggregator headers are listed in each column group and align\n // correctly with the column groups above (which have colSpan = number of aggregators)\n colSpan = 1;\n } else {\n // Use spanSize to merge identical aggregator labels when there are no column attributes\n colSpan = spanSize(colKeyValues, idx, aggIndex);\n // If spanSize returned -1 it means this cell is merged into a previous one\n if (colSpan === -1) {\n return null;\n }\n }\n\n // When there are column attributes, rowSpan should account for the row header row\n // When there are no column attributes, rowSpan is 1\n const rowSpan =\n hasColumnAttributes && rowAttrsToRender.length !== 0 ? 1 : 1;\n\n return (\n <th\n className=\"pvtColLabel\"\n key={`agg-label-${idx}`}\n colSpan={colSpan}\n rowSpan={rowSpan}\n >\n {label}\n </th>\n );\n });\n\n let valueCellColors = () => {};\n let rowTotalColors = () => {};\n let colTotalColors = () => {};\n if (opts.heatmapMode && !hasMultipleAggregators) {\n const colorScaleGenerator = this.props.tableColorScaleGenerator;\n const rowTotalValues = colKeys.map(x =>\n pivotData.getAggregator([], x, primaryAggregation.key).value()\n );\n rowTotalColors = colorScaleGenerator(rowTotalValues);\n const colTotalValues = rowKeys.map(x =>\n pivotData.getAggregator(x, [], primaryAggregation.key).value()\n );\n colTotalColors = colorScaleGenerator(colTotalValues);\n\n if (opts.heatmapMode === 'full') {\n const allValues = [];\n rowKeys.map(r =>\n colKeys.map(c =>\n allValues.push(\n pivotData.getAggregator(r, c, primaryAggregation.key).value()\n )\n )\n );\n const colorScale = colorScaleGenerator(allValues);\n valueCellColors = (r, c, v) => colorScale(v);\n } else if (opts.heatmapMode === 'row') {\n const rowColorScales = {};\n rowKeys.map(r => {\n const rowValues = colKeys.map(x =>\n pivotData.getAggregator(r, x, primaryAggregation.key).value()\n );\n rowColorScales[r] = colorScaleGenerator(rowValues);\n });\n valueCellColors = (r, c, v) => rowColorScales[r](v);\n } else if (opts.heatmapMode === 'col') {\n const colColorScales = {};\n colKeys.map(c => {\n const colValues = rowKeys.map(x =>\n pivotData.getAggregator(x, c, primaryAggregation.key).value()\n );\n colColorScales[c] = colorScaleGenerator(colValues);\n });\n valueCellColors = (r, c, v) => colColorScales[c](v);\n }\n }\n\n // Get conditional formatting from tableOptions\n const conditionalFormatting = tableOptions.conditionalFormatting || null;\n\n // Get cell formatting from tableOptions\n const cellFormatting = tableOptions.cellFormatting || null;\n\n // Create lookup map from aggregationKey to aggregatorName\n const aggregationNameLookup = {};\n aggregations.forEach(agg => {\n aggregationNameLookup[agg.key] = agg.aggregatorName;\n });\n\n // Lookup aggregationKey -> aggregation definition (to read `vals`)\n const aggregationByKey = {};\n aggregations.forEach(agg => {\n aggregationByKey[agg.key] = agg;\n });\n\n // Find the group label for an aggregation. rowGroupConfig `match` is\n // compared against the aggregation's `vals` (the field names it works\n // on, e.g. ['Employee Ref']). Falls back to label / aggregatorName.\n const getAggregationGroup = aggregationKey => {\n const agg = aggregationByKey[aggregationKey];\n if (!agg) {\n return null;\n }\n const vals = Array.isArray(agg.vals) ? agg.vals : [];\n for (let k = 0; k < vals.length; k++) {\n if (groupLookup[vals[k]]) {\n return groupLookup[vals[k]];\n }\n }\n return (\n groupLookup[agg.label] || groupLookup[agg.aggregatorName] || null\n );\n };\n\n // Group label cells for the aggregation columns (column aggregation mode).\n // Each column renders its own <th>, so the label repeats on every column.\n const renderAggregatorGroupCells = () =>\n columnMeta.map((colMeta, idx) => {\n const group = getAggregationGroup(colMeta.aggregationKey);\n return (\n <th\n key={`aggGrp${idx}`}\n // eslint-disable-next-line no-undefined\n style={group ? groupLabelStyle : undefined}\n >\n {group || ''}\n </th>\n );\n });\n\n // Helper function to get cell style with conditional formatting\n const getCellStyle = (value, heatmapStyle = {}) => {\n const conditionalStyle = getConditionalFormattingStyle(\n value,\n conditionalFormatting\n );\n return mergeStyles(heatmapStyle, conditionalStyle);\n };\n\n // Helper function to format cell value with cell formatting rules\n const formatCellValue = (value, aggregator, aggregationKey) => {\n const aggregatorName = aggregationKey\n ? aggregationNameLookup[aggregationKey]\n : null;\n\n return applyCellFormatting(\n value,\n cellFormatting,\n aggregator.format.bind(aggregator),\n aggregatorName\n );\n };\n\n // Helper function to format label text if it's numeric\n // Used for both row and column labels\n const formatLabel = txt => {\n // Check if txt is numeric (number or numeric string)\n // Also exclude 'null' string which is used for missing values\n if (txt === 'null' || txt === null || typeof txt === 'undefined') {\n return txt;\n }\n\n // Don't format if it contains special characters (dates, formatted strings, etc.)\n if (containsSpecialCharacters(txt)) {\n return txt;\n }\n\n // Check if txt is numeric (number or numeric string)\n // A string is numeric if it can be parsed as a finite number\n // Exclude strings with special characters from formatting\n let isNumeric = false;\n let numericValue = null;\n\n if (typeof txt === 'number') {\n isNumeric = !isNaN(txt) && isFinite(txt);\n if (isNumeric) {\n numericValue = txt;\n }\n } else if (\n typeof txt === 'string' &&\n txt.trim() !== '' &&\n txt !== 'null' &&\n !containsSpecialCharacters(txt)\n ) {\n const parsed = parseFloat(txt.trim());\n isNumeric = !isNaN(parsed) && isFinite(parsed);\n if (isNumeric) {\n numericValue = parsed;\n }\n }\n\n if (\n isNumeric &&\n numericValue !== null &&\n cellFormatting &&\n Array.isArray(cellFormatting.rules) &&\n cellFormatting.rules.length > 0\n ) {\n const matchingRule = cellFormatting.rules[0];\n if (matchingRule && matchingRule.format) {\n const format = matchingRule.format;\n const formatter = numberFormat({\n digitsAfterDecimal:\n 'decimalPlaces' in format ? format.decimalPlaces : 2,\n thousandsSep:\n 'thousandsSep' in format ? format.thousandsSep : ',',\n decimalSep: 'decimalSep' in format ? format.decimalSep : '.',\n prefix: 'prefix' in format ? format.prefix : '',\n suffix: 'suffix' in format ? format.suffix : '',\n showOriginal:\n 'showOriginal' in format ? format.showOriginal : false,\n });\n return formatter(numericValue);\n }\n }\n\n // Not numeric or no formatting rules, return as-is\n return txt;\n };\n\n // Helper function to format row label text if it's numeric\n // Only formats if it's a numeric value, not aggregation labels\n const formatRowLabel = (\n txt,\n index,\n isLastElement,\n hasMultipleAggregators,\n rowAttrsLength\n ) => {\n // Don't format the last element if it's an aggregation label (when multiple aggregators)\n // The last element is an aggregation label only if:\n // 1. There are multiple aggregators\n // 2. AND it's beyond the row attributes (index >= rowAttrsLength)\n if (\n hasMultipleAggregators &&\n isLastElement &&\n index >= rowAttrsLength\n ) {\n return txt;\n }\n\n return formatLabel(txt);\n };\n\n const getClickHandler =\n tableOptions && tableOptions.clickCallback\n ? (value, rowValues, colValues) => {\n const filters = {};\n for (const i of Object.keys(colAttrs || {})) {\n const attr = colAttrs[i];\n if (colValues[i] !== null) {\n filters[attr] = colValues[i];\n }\n }\n for (const i of Object.keys(rowAttrs || {})) {\n const attr = rowAttrs[i];\n if (rowValues[i] !== null) {\n filters[attr] = rowValues[i];\n }\n }\n return e =>\n tableOptions.clickCallback(e, value, filters, pivotData);\n }\n : null;\n\n const handleColSort = (attr, e) => {\n e.stopPropagation();\n if (this.props.onColSort) {\n const currentSort = this.props.colSorts && this.props.colSorts[attr];\n let nextSort = 'ASC';\n if (currentSort === 'ASC') {\n nextSort = 'DESC';\n } else if (currentSort === 'DESC') {\n nextSort = null;\n }\n this.props.onColSort(attr, nextSort);\n }\n };\n\n const handleRowSort = (attr, e) => {\n e.stopPropagation();\n if (this.props.onRowSort) {\n const currentSort = this.props.rowSorts && this.props.rowSorts[attr];\n let nextSort = 'ASC';\n if (currentSort === 'ASC') {\n nextSort = 'DESC';\n } else if (currentSort === 'DESC') {\n nextSort = null;\n }\n this.props.onRowSort(attr, nextSort);\n }\n };\n\n const getSortButton = (attr, isCol) => {\n const currentSort = isCol\n ? this.props.colSorts && this.props.colSorts[attr]\n : this.props.rowSorts && this.props.rowSorts[attr];\n const handleSort = isCol ? handleColSort : handleRowSort;\n let sortIcon = '';\n if (currentSort !== null) {\n if (isCol) {\n sortIcon =\n this.props.colSortIcons[currentSort] ||\n this.props.colSortIcons.DEFAULT;\n } else {\n sortIcon =\n this.props.rowSortIcons[currentSort] ||\n this.props.rowSortIcons.DEFAULT;\n }\n }\n return (\n <button\n type=\"button\"\n className=\"pvtSortButton\"\n onClick={e => handleSort(attr, e)}\n title={\n currentSort === 'ASC'\n ? 'Sort Descending'\n : currentSort === 'DESC'\n ? 'Clear Sort'\n : 'Sort Ascending'\n }\n >\n {sortIcon}\n </button>\n );\n };\n\n const totalRowAggregations = isColumnAggregationMode\n ? [primaryAggregation]\n : hasMultipleAggregators\n ? aggregations\n : [primaryAggregation];\n const totalsLabelText = 'Totals';\n\n return (\n <table className=\"pvtTable\">\n <thead>\n {colAttrsToRender.map(function(c, j) {\n return (\n <tr key={`colAttr${j}`}>\n {hasNumberColumn && j === 0 && renderNumberHeaderCell()}\n {shouldRenderRowHeaderPlaceholder &&\n (isColumnAggregationMode || j === 0) &&\n !(\n isColumnAggregationMode &&\n hasColumnAttributes &&\n rowAttrsToRender.length === 1\n ) &&\n (hasHeaderGroup && j === 0 && !isColumnAggregationMode ? (\n renderGroupSegments(colAttrsToRender.length)\n ) : (\n <th\n colSpan={\n isColumnAggregationMode && hasColumnAttributes\n ? rowAttrsToRender.length - 1\n : rowAttrsToRender.length\n }\n rowSpan={\n isColumnAggregationMode && hasColumnAttributes\n ? 1\n : colAttrsToRender.length\n }\n />\n ))}\n {c ? (\n <th className=\"pvtAxisLabel\">\n {c}\n {colAttrs.includes(c) && getSortButton(c, true)}\n </th>\n ) : null}\n {colKeyValues.map(function(colKey, i) {\n const x = spanSize(colKeyValues, i, j);\n\n if (x === -1) {\n return null;\n }\n\n const formattedColLabel = formatLabel(colKey[j]);\n return (\n <th\n className=\"pvtColLabel\"\n key={`colKey${i}`}\n colSpan={x}\n rowSpan={\n j === colAttrsToRender.length - 1 &&\n rowAttrsToRender.length !== 0 &&\n !isColumnAggregationMode\n ? 2\n : 1\n }\n >\n {formattedColLabel}\n </th>\n );\n })}\n\n {showTotalsColumn && j === 0 && (\n <th\n className=\"pvtTotalLabel\"\n rowSpan={\n colAttrsToRender.length +\n (rowAttrsToRender.length === 0 ? 0 : 1)\n }\n >\n {totalsLabelText}\n </th>\n )}\n </tr>\n );\n })}\n\n {/* Group row for the aggregation columns, placed right above the\n aggregator label row (column mode with column attributes) */}\n {isColumnAggregationMode && hasColumnAttributes && hasHeaderGroup && (\n <tr>\n {renderGroupSegments(1)}\n {renderAggregatorGroupCells()}\n </tr>\n )}\n\n {/* Group row when there are no column attributes */}\n {hasHeaderGroup &&\n colAttrsToRender.length === 0 &&\n rowAttrsToRender.length !== 0 && (\n <tr>\n {hasNumberColumn && renderNumberHeaderCell()}\n {renderGroupSegments(1)}\n {isColumnAggregationMode ? (\n renderAggregatorGroupCells()\n ) : (\n <th />\n )}\n </tr>\n )}\n\n {isColumnAggregationMode && hasColumnAttributes && (\n <tr>\n {rowAttrsToRender.length !== 0 &&\n rowAttrsToRender.map((r, i) => {\n const isRowAttr = i < rowAttrs.length;\n const attr = isRowAttr ? rowAttrs[i] : null;\n return (\n <th className=\"pvtAxisLabel\" key={`rowAttr-agg-${i}`}>\n {r}\n {isRowAttr && attr && getSortButton(attr, false)}\n </th>\n );\n })}\n {renderAggregatorHeaderCells()}\n </tr>\n )}\n\n {rowAttrsToRender.length !== 0 &&\n !(isColumnAggregationMode && hasColumnAttributes) && (\n <tr>\n {hasNumberColumn &&\n colAttrsToRender.length === 0 &&\n !numberColumnInGroupRow &&\n renderNumberHeaderCell()}\n {rowAttrsToRender.map((r, i) => {\n const isRowAttr = i < rowAttrs.length;\n const attr = isRowAttr ? rowAttrs[i] : null;\n return (\n <th className=\"pvtAxisLabel\" key={`rowAttr${i}`}>\n {r}\n {isRowAttr && attr && getSortButton(attr, false)}\n </th>\n );\n })}\n {isColumnAggregationMode && !hasColumnAttributes\n ? renderAggregatorHeaderCells()\n : null}\n {showTotalsColumn && (\n <th className=\"pvtTotalLabel\">\n {colAttrs.length === 0 ? totalsLabelText : null}\n </th>\n )}\n </tr>\n )}\n </thead>\n\n <tbody>\n {renderedRows.map(function(rowMeta, i) {\n const totalAggregator = pivotData.getAggregator(\n rowMeta.actualKey,\n [],\n rowMeta.aggregationKey\n );\n const displayKey = rowMeta.displayKey;\n return (\n <tr key={`rowKeyRow${i}`}>\n {hasNumberColumn && (\n <th className=\"pvtRowNumber\" key={`rowNumber${i}`}>\n {i + 1}\n </th>\n )}\n {displayKey.map(function(txt, j) {\n const x = spanSize(rowKeyValues, i, j);\n if (x === -1) {\n return null;\n }\n const isLastElement = j === displayKey.length - 1;\n const formattedTxt = formatRowLabel(\n txt,\n j,\n isLastElement,\n hasMultipleAggregators,\n rowAttrs.length\n );\n return (\n <th\n key={`rowKeyLabel${i}-${j}`}\n className=\"pvtRowLabel\"\n rowSpan={x}\n colSpan={\n showTotalsColumn &&\n j === rowAttrsToRender.length - 1 &&\n colAttrsToRender.length !== 0\n ? 2\n : 1\n }\n >\n {formattedTxt}\n </th>\n );\n })}\n {columnMeta.map(function(colMeta, j) {\n const aggregationKeyForCell = isColumnAggregationMode\n ? colMeta.aggregationKey\n : rowMeta.aggregationKey;\n const aggregator = pivotData.getAggregator(\n rowMeta.actualKey,\n colMeta.actualKey,\n aggregationKeyForCell\n );\n const value = aggregator.value();\n const heatmapStyle =\n valueCellColors(\n rowMeta.actualKey,\n colMeta.actualKey,\n value\n ) || {};\n return (\n <td\n className=\"pvtVal\"\n key={`pvtVal${i}-${j}`}\n onClick={\n getClickHandler &&\n getClickHandler(\n value,\n rowMeta.actualKey,\n colMeta.actualKey\n )\n }\n style={getCellStyle(value, heatmapStyle)}\n >\n {formatCellValue(\n value,\n aggregator,\n aggregationKeyForCell\n )}\n </td>\n );\n })}\n {showTotalsColumn && (\n <td\n className=\"pvtTotal\"\n onClick={\n getClickHandler &&\n getClickHandler(\n totalAggregator.value(),\n rowMeta.actualKey,\n [null]\n )\n }\n style={getCellStyle(\n totalAggregator.value(),\n colTotalColors(totalAggregator.value()) || {}\n )}\n >\n {formatCellValue(\n totalAggregator.value(),\n totalAggregator,\n rowMeta.aggregationKey\n )}\n </td>\n )}\n </tr>\n );\n })}\n\n {totalRowAggregations.map(function(agg) {\n const grandTotalAggregator = pivotData.getAggregator(\n [],\n [],\n isColumnAggregationMode ? primaryAggregation.key : agg.key\n );\n const totalLabel =\n hasMultipleAggregators && !isColumnAggregationMode\n ? `Totals – ${agg.label || agg.aggregatorName}`\n : totalsLabelText;\n return (\n <tr key={`totalRow-${agg.key}`}>\n <th\n className=\"pvtTotalLabel\"\n colSpan={\n rowAttrsToRender.length +\n (colAttrs.length === 0 ||\n (isColumnAggregationMode && hasColumnAttributes)\n ? 0\n : 1) +\n (hasNumberColumn ? 1 : 0)\n }\n >\n {totalLabel}\n </th>\n\n {columnMeta.map(function(colMeta, i) {\n const totalAggregator = pivotData.getAggregator(\n [],\n colMeta.actualKey,\n isColumnAggregationMode ? colMeta.aggregationKey : agg.key\n );\n const totalValue = totalAggregator.value();\n return (\n <td\n className=\"pvtTotal\"\n key={`total${agg.key}-${i}`}\n onClick={\n getClickHandler &&\n getClickHandler(totalValue, [null], colMeta.actualKey)\n }\n style={getCellStyle(\n totalValue,\n rowTotalColors(totalValue) || {}\n )}\n >\n {formatCellValue(totalValue, totalAggregator, agg.key)}\n </td>\n );\n })}\n\n {showTotalsColumn && (\n <td\n onClick={\n getClickHandler &&\n getClickHandler(\n grandTotalAggregator.value(),\n [null],\n [null]\n )\n }\n className=\"pvtGrandTotal\"\n style={getCellStyle(grandTotalAggregator.value(), {})}\n >\n {formatCellValue(\n grandTotalAggregator.value(),\n grandTotalAggregator,\n isColumnAggregationMode\n ? primaryAggregation.key\n : agg.key\n )}\n </td>\n )}\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n }\n }\n\n TableRenderer.defaultProps = PivotData.defaultProps;\n TableRenderer.propTypes = PivotData.propTypes;\n TableRenderer.defaultProps.tableColorScaleGenerator = redColorScaleGenerator;\n TableRenderer.defaultProps.tableOptions = {};\n TableRenderer.defaultProps.colSorts = {};\n TableRenderer.defaultProps.rowSorts = {};\n TableRenderer.defaultProps.rowGroupConfig = null;\n TableRenderer.propTypes.tableColorScaleGenerator = PropTypes.func;\n TableRenderer.propTypes.tableOptions = PropTypes.object;\n TableRenderer.propTypes.colSorts = PropTypes.objectOf(\n PropTypes.oneOf(['ASC', 'DESC'])\n );\n TableRenderer.propTypes.rowSorts = PropTypes.objectOf(\n PropTypes.oneOf(['ASC', 'DESC'])\n );\n TableRenderer.propTypes.onColSort = PropTypes.func;\n TableRenderer.propTypes.onRowSort = PropTypes.func;\n TableRenderer.propTypes.rowGroupConfig = PropTypes.arrayOf(\n PropTypes.shape({\n label: PropTypes.string.isRequired,\n match: PropTypes.arrayOf(PropTypes.string).isRequired,\n })\n );\n TableRenderer.defaultProps.colSortIcons = {\n ASC: '→',\n DESC: '←',\n DEFAULT: '↔',\n };\n TableRenderer.defaultProps.rowSortIcons = {\n ASC: '↑',\n DESC: '↓',\n DEFAULT: '⇅',\n };\n TableRenderer.propTypes.colSortIcons = PropTypes.shape({\n ASC: PropTypes.node,\n DESC: PropTypes.node,\n DEFAULT: PropTypes.node,\n });\n TableRenderer.propTypes.rowSortIcons = PropTypes.shape({\n ASC: PropTypes.node,\n DESC: PropTypes.node,\n DEFAULT: PropTypes.node,\n });\n // When true, a \"No.\" column with the 1-based index of each data row is\n // rendered before the row attribute columns.\n TableRenderer.defaultProps.showNumericalOrder = false;\n TableRenderer.propTypes.showNumericalOrder = PropTypes.bool;\n return TableRenderer;\n}\n\nclass TSVExportRenderer extends React.PureComponent {\n render() {\n const pivotData = new PivotData(this.props);\n const rowAttrs = pivotData.props.rows;\n const aggregations = pivotData.getAggregations();\n const hasMultipleAggregators = aggregations.length > 1;\n const rowKeys = pivotData.getRowKeys();\n const colKeys = pivotData.getColKeys();\n const safeRowKeys = rowKeys.length === 0 ? [[]] : rowKeys;\n const safeColKeys = colKeys.length === 0 ? [[]] : colKeys;\n\n const rowEntries = hasMultipleAggregators\n ? safeRowKeys.reduce((acc, rowKey) => {\n aggregations.forEach(agg => {\n acc.push({rowKey, aggregationKey: agg.key, label: agg.label});\n });\n return acc;\n }, [])\n : safeRowKeys.map(rowKey => ({\n rowKey,\n aggregationKey: aggregations[0].key,\n label: aggregations[0].label || aggregations[0].aggregatorName,\n }));\n\n const headerRow = rowAttrs.slice();\n if (hasMultipleAggregators) {\n headerRow.push('Values');\n }\n if (safeColKeys.length === 1 && safeColKeys[0].length === 0) {\n headerRow.push(\n hasMultipleAggregators\n ? 'Value'\n : aggregations[0].label || aggregations[0].aggregatorName\n );\n } else {\n safeColKeys.map(c => headerRow.push(c.join('-')));\n }\n\n const result = rowEntries.map(entry => {\n const row = entry.rowKey.map(x => x);\n if (hasMultipleAggregators) {\n row.push(entry.label || '');\n }\n safeColKeys.map(colKey => {\n const v = pivotData\n .getAggregator(entry.rowKey, colKey, entry.aggregationKey)\n .value();\n row.push(v ? v : '');\n });\n return row;\n });\n\n result.unshift(headerRow);\n\n return (\n <textarea\n value={result.map(r => r.join('\\t')).join('\\n')}\n style={{width: window.innerWidth / 2, height: window.innerHeight / 2}}\n readOnly={true}\n />\n );\n }\n}\n\nTSVExportRenderer.defaultProps = PivotData.defaultProps;\nTSVExportRenderer.propTypes = PivotData.propTypes;\n\nexport default {\n Table: makeRenderer(),\n 'Table Heatmap': makeRenderer({heatmapMode: 'full'}),\n 'Table Col Heatmap': makeRenderer({heatmapMode: 'col'}),\n 'Table Row Heatmap': makeRenderer({heatmapMode: 'row'}),\n 'Exportable TSV': TSVExportRenderer,\n};\n"]}
1
+ {"version":3,"sources":["../src/TableRenderers.jsx"],"names":["applyCellFormatting","pivotTablePropsByElement","WeakMap","getPivotTableProps","get","element","VIRTUAL_ROW_HEIGHT","VIRTUAL_ROW_OVERSCAN","VIRTUAL_ROW_BLOCK","VIRTUAL_COLUMN_WIDTH","VIRTUAL_COLUMN_OVERSCAN","VIRTUAL_COLUMN_BLOCK","VIRTUAL_LOADING_PAINT_MS","VIRTUAL_SCROLL_DEBOUNCE_MS","INITIAL_ROW_WINDOW_END","INITIAL_COLUMN_WINDOW_END","FLAT_KEY_SEPARATOR","String","fromCharCode","getViewportKeyForProps","precomputed","props","precomputedData","viewportKey","sorters","PivotLoadingContent","getScrollParent","parent","parentElement","document","body","window","getComputedStyle","overflowX","overflowY","spanSize","arr","i","j","x","asc","end","noDraw","len","length","asc1","end1","stop","buildGroupLookup","rowGroupConfig","lookup","forEach","label","match","name","buildHeaderGroupSegments","attrs","map","group","span","groupLabelStyle","textAlign","redColorScaleGenerator","values","min","Math","apply","max","nonRed","round","backgroundColor","evaluateCondition","value","condition","type","conditionValue","numValue","parseFloat","numConditionValue","isNaN","undefined","trim","valueStr","conditionValueStr","toLowerCase","includes","valueStr2","conditionValueStr2","getConditionalFormattingStyle","conditionalFormatting","Array","isArray","rules","rule","style","Object","assign","mergeStyles","styles","filter","s","containsSpecialCharacters","str","trimmed","pureNumericPattern","test","shouldSkipFormattingForAggregation","aggregatorName","skipFormattingAggregations","cellFormatting","defaultFormatter","isNumeric","isFinite","hasFormattingRules","some","format","numericValue","matchingRule","formatter","digitsAfterDecimal","decimalPlaces","thousandsSep","decimalSep","prefix","suffix","showOriginal","makeRenderer","opts","TableRenderer","state","start","rows","columnStart","columnEnd","columnTotals","sourceViewportKey","scrollPending","bodyRef","React","createRef","scrollParent","overlayBounds","frameId","scrollTimer","rowCount","columnCount","leadingColumnCount","leadingColumnWidth","pivotProps","pivotData","requestedWindow","viewportTimer","unmounted","scheduleUpdate","bind","handleScroll","attachScroll","updateWindow","prevProps","previousViewportKey","nextViewportKey","getViewportKey","invalidateViewportRequest","clearTimeout","removeEventListener","cancelAnimationFrame","virtualizeRows","current","updateOverlayBounds","addEventListener","passive","bounds","top","left","width","innerWidth","height","innerHeight","getBoundingClientRect","setState","setTimeout","schedule","requestAnimationFrame","callback","columnMode","tableOptions","aggregationDisplayMode","requestKey","catch","error","code","then","viewport","colTotals","table","firstColumn","querySelector","tableBounds","firstColumnBounds","leftSpacer","leftSpacerWidth","measuredWidth","Number","viewportTop","viewportHeight","clientHeight","viewportLeft","viewportWidth","clientWidth","bodyBounds","bodyTop","bodyLeft","measureLeadingColumnWidth","offset","requestedStart","floor","ceil","horizontalOffset","requestedColumnStart","VIRTUAL_ROW_THRESHOLD","VIRTUAL_COLUMN_THRESHOLD","requestViewportWindow","virtualized","PivotData","colAttrs","cols","rowAttrs","aggregations","getAggregations","primaryAggregation","getPrimaryAggregation","hasMultipleAggregators","isColumnAggregationMode","rowAttrsToRender","concat","colAttrsToRender","hasColumnAttributes","showTotalsColumn","shouldRenderRowHeaderPlaceholder","hasHeaderGroup","Boolean","groupLookup","headerGroupSegments","renderGroupSegments","seg","idx","rowSpan","showNumericalOrder","hasNumberColumn","numberColumnLabel","renderedAggregationHeaderRow","numberColumnHeaderRowSpan","numberColumnInGroupRow","renderNumberHeaderCell","rowKeys","getRowKeys","baseRowKeys","totalRowCount","totalRows","isRowVirtualized","colKeys","getColKeys","baseColKeys","totalColumnCount","isColumnVirtualized","isVirtualized","visibleColumnStart","visibleColumnEnd","columnMeta","columnIndex","colKey","aggregation","push","displayKey","actualKey","aggregationKey","key","absoluteIndex","colKeyValues","col","leftColumnSpacerWidth","rightColumnSpacerWidth","renderColumnSpacer","side","Cell","minWidth","maxWidth","renderAggregatorHeaderCells","colMeta","aggIndex","colSpan","valueCellColors","rowTotalColors","colTotalColors","heatmapMode","colorScaleGenerator","tableColorScaleGenerator","rowTotalValues","getAggregator","colTotalValues","allValues","r","c","colorScale","v","rowColorScales","rowValues","colColorScales","colValues","aggregationNameLookup","agg","aggregationByKey","getAggregationGroup","vals","k","renderAggregatorGroupCells","getCellStyle","heatmapStyle","conditionalStyle","formatCellValue","aggregator","formatLabel","txt","parsed","formatRowLabel","index","isLastElement","rowAttrsLength","getClickHandler","clickCallback","filters","keys","attr","e","handleColSort","stopPropagation","onColSort","currentSort","colSorts","nextSort","handleRowSort","onRowSort","rowSorts","getSortButton","isCol","handleSort","sortIcon","colSortIcons","DEFAULT","rowSortIcons","totalRowAggregations","totalsLabelText","visibleStart","visibleEnd","viewportReady","isViewportLoading","viewportColumnTotals","visibleRows","virtualColumnCount","set","formattedColLabel","isRowAttr","padding","border","rowMeta","visibleIndex","hasViewportValues","cells","totalAggregator","getPrecomputedAggregator","rowTotal","spans","formattedTxt","aggregationKeyForCell","join","grandTotalAggregator","totalLabel","flatColKey","totalValue","nextProps","previousState","PureComponent","defaultProps","propTypes","PropTypes","func","object","objectOf","oneOf","arrayOf","shape","string","isRequired","ASC","DESC","node","bool","TSVExportRenderer","safeRowKeys","safeColKeys","rowEntries","reduce","acc","rowKey","headerRow","slice","result","row","entry","unshift","Table"],"mappings":"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","file":"TableRenderers.js","sourcesContent":["/* eslint-disable no-inline-comments */\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport {PivotData, numberFormat} from './Utilities';\nimport {\n computePivotViewport,\n sortersHaveFunctions,\n VIRTUAL_COLUMN_THRESHOLD,\n VIRTUAL_ROW_THRESHOLD,\n} from './pivotCompute';\nimport {computePivotViewportInWorker} from './PivotDataWorker';\n\nconst pivotTablePropsByElement = new WeakMap();\n\nexport const getPivotTableProps = element =>\n pivotTablePropsByElement.get(element);\n\nconst VIRTUAL_ROW_HEIGHT = 32;\nconst VIRTUAL_ROW_OVERSCAN = 8;\nconst VIRTUAL_ROW_BLOCK = 32;\nconst VIRTUAL_COLUMN_WIDTH = 100;\nconst VIRTUAL_COLUMN_OVERSCAN = 4;\nconst VIRTUAL_COLUMN_BLOCK = 16;\nconst VIRTUAL_LOADING_PAINT_MS = 16;\nconst VIRTUAL_SCROLL_DEBOUNCE_MS = 500;\nconst INITIAL_ROW_WINDOW_END = 50;\nconst INITIAL_COLUMN_WINDOW_END = 32;\nconst FLAT_KEY_SEPARATOR = String.fromCharCode(0);\n\nconst getViewportKeyForProps = props => {\n const precomputed = props.precomputedData;\n return precomputed &&\n typeof precomputed.viewportKey === 'number' &&\n !sortersHaveFunctions(props.sorters)\n ? precomputed.viewportKey\n : null;\n};\n\nfunction PivotLoadingContent() {\n return (\n <React.Fragment>\n <div className=\"pvtLoadingSpinner\" aria-hidden=\"true\" />\n <div className=\"pvtLoadingText\">Processing</div>\n </React.Fragment>\n );\n}\n\nconst getScrollParent = element => {\n let parent = element.parentElement;\n while (parent && parent !== document.body) {\n const {overflowX, overflowY} = window.getComputedStyle(parent);\n if (\n overflowX === 'auto' ||\n overflowX === 'scroll' ||\n overflowY === 'auto' ||\n overflowY === 'scroll'\n ) {\n return parent;\n }\n parent = parent.parentElement;\n }\n return window;\n};\n\n// helper function for setting row/col-span in pivotTableRenderer\nconst spanSize = function(arr, i, j) {\n let x;\n if (i !== 0) {\n let asc, end;\n let noDraw = true;\n for (\n x = 0, end = j, asc = end >= 0;\n asc ? x <= end : x >= end;\n asc ? x++ : x--\n ) {\n if (arr[i - 1][x] !== arr[i][x]) {\n noDraw = false;\n }\n }\n if (noDraw) {\n return -1;\n }\n }\n let len = 0;\n while (i + len < arr.length) {\n let asc1, end1;\n let stop = false;\n for (\n x = 0, end1 = j, asc1 = end1 >= 0;\n asc1 ? x <= end1 : x >= end1;\n asc1 ? x++ : x--\n ) {\n if (arr[i][x] !== arr[i + len][x]) {\n stop = true;\n }\n }\n if (stop) {\n break;\n }\n len++;\n }\n return len;\n};\n\n// ==> Build a lookup: name -> group label <==\n// `match` can contain row attribute names, the synthetic 'Values' column\n// (aggregations displayed as rows) and aggregation names/labels\n// (aggregations displayed as columns).\nfunction buildGroupLookup(rowGroupConfig) {\n const lookup = {};\n (rowGroupConfig || []).forEach(({label, match}) => {\n match.forEach(name => {\n lookup[name] = label;\n });\n });\n return lookup;\n}\n\n// ==> Calculate the positions for GroupSegments <==\nfunction buildHeaderGroupSegments(attrs, rowGroupConfig) {\n const lookup = buildGroupLookup(rowGroupConfig);\n\n // Mỗi attribute luôn là 1 segment riêng — không gộp colSpan nữa,\n // để label nhóm (vd \"AAA\") hiện lặp lại trên từng cột con.\n return attrs.map(name => ({group: lookup[name] || null, span: 1}));\n}\n\n// Style cho ô có nhãn nhóm trong group header\nconst groupLabelStyle = {\n textAlign: 'center',\n};\n\nfunction redColorScaleGenerator(values) {\n const min = Math.min.apply(Math, values);\n const max = Math.max.apply(Math, values);\n return x => {\n // eslint-disable-next-line no-magic-numbers\n const nonRed = 255 - Math.round((255 * (x - min)) / (max - min));\n return {backgroundColor: `rgb(255,${nonRed},${nonRed})`};\n };\n}\n\n// Conditional formatting evaluation function\nfunction evaluateCondition(value, condition) {\n if (!condition || !condition.type) {\n return false;\n }\n\n const {type, value: conditionValue} = condition;\n const numValue = typeof value === 'number' ? value : parseFloat(value);\n const numConditionValue =\n typeof conditionValue === 'number'\n ? conditionValue\n : parseFloat(conditionValue);\n\n switch (type) {\n case 'greaterThan':\n return (\n !isNaN(numValue) &&\n !isNaN(numConditionValue) &&\n numValue > numConditionValue\n );\n case 'lessThan':\n return (\n !isNaN(numValue) &&\n !isNaN(numConditionValue) &&\n numValue < numConditionValue\n );\n case 'greaterThanOrEqual':\n return (\n !isNaN(numValue) &&\n !isNaN(numConditionValue) &&\n numValue >= numConditionValue\n );\n case 'lessThanOrEqual':\n return (\n !isNaN(numValue) &&\n !isNaN(numConditionValue) &&\n numValue <= numConditionValue\n );\n case 'equal':\n if (typeof value === 'string' && typeof conditionValue === 'string') {\n return value === conditionValue;\n }\n return (\n !isNaN(numValue) &&\n !isNaN(numConditionValue) &&\n numValue === numConditionValue\n );\n case 'notEqual':\n if (typeof value === 'string' && typeof conditionValue === 'string') {\n return value !== conditionValue;\n }\n return (\n isNaN(numValue) ||\n isNaN(numConditionValue) ||\n numValue !== numConditionValue\n );\n case 'empty':\n // Check for null, undefined, empty string, whitespace-only strings, or NaN\n // eslint-disable-next-line no-undefined\n if (value === null || value === undefined) {\n return true;\n }\n if (typeof value === 'string') {\n return value.trim() === '';\n }\n if (typeof value === 'number') {\n return isNaN(value);\n }\n return false;\n case 'notEmpty':\n // Check that value is not null, undefined, empty/whitespace string, or NaN\n // eslint-disable-next-line no-undefined\n if (value === null || value === undefined) {\n return false;\n }\n if (typeof value === 'string') {\n return value.trim() !== '';\n }\n if (typeof value === 'number') {\n return !isNaN(value);\n }\n // Other types (boolean, object, etc.) are considered not empty\n return true;\n // eslint-disable-next-line no-case-declarations\n case 'contains':\n // Convert both values to strings for comparison\n // This handles cases where values are numbers (from aggregators) or conditionValue is parsed as number\n const valueStr = String(value || '');\n const conditionValueStr = String(conditionValue || '');\n if (valueStr && conditionValueStr) {\n return valueStr.toLowerCase().includes(conditionValueStr.toLowerCase());\n }\n return false;\n // eslint-disable-next-line no-case-declarations\n case 'notContains':\n // Convert both values to strings for comparison\n // This handles cases where values are numbers (from aggregators) or conditionValue is parsed as number\n const valueStr2 = String(value || '');\n const conditionValueStr2 = String(conditionValue || '');\n if (valueStr2 && conditionValueStr2) {\n return !valueStr2\n .toLowerCase()\n .includes(conditionValueStr2.toLowerCase());\n }\n return true;\n default:\n return false;\n }\n}\n\n// Apply conditional formatting rules to a value\nfunction getConditionalFormattingStyle(value, conditionalFormatting) {\n if (!conditionalFormatting || !Array.isArray(conditionalFormatting.rules)) {\n return {};\n }\n\n // Evaluate rules in order, return first matching rule's style\n for (const rule of conditionalFormatting.rules) {\n if (evaluateCondition(value, rule.condition)) {\n // Return a copy of the style object to avoid mutations\n return rule.style ? Object.assign({}, rule.style) : {};\n }\n }\n\n return {};\n}\n\n// Merge styles, with conditional formatting taking precedence\nfunction mergeStyles(...styles) {\n return Object.assign({}, ...styles.filter(s => s && typeof s === 'object'));\n}\n\n// Helper function to check if a string contains special characters (like -, /, etc.)\n// This prevents formatting of date strings or formatted strings\n// Only pure numeric strings (with optional decimal point and minus sign) should be formatted\nfunction containsSpecialCharacters(str) {\n if (typeof str !== 'string') {\n return false;\n }\n const trimmed = str.trim();\n // Check if string contains any special characters that indicate it's not a raw number\n // Allow: digits, decimal point, minus sign at start, plus sign at start, spaces\n // Disallow: hyphens in middle, slashes, and other special characters\n const pureNumericPattern = /^-?\\d*\\.?\\d+$/;\n return !pureNumericPattern.test(trimmed);\n}\n\n// Helper function to check if an aggregation should skip formatting\n// Aggregations like Count, First, Last should not be formatted\n// Aggregations like Sum, Average should be formatted\nfunction shouldSkipFormattingForAggregation(aggregatorName) {\n if (!aggregatorName) {\n return false;\n }\n\n const name = aggregatorName.toLowerCase();\n // Skip formatting for these aggregation types\n const skipFormattingAggregations = [\n 'count',\n 'count unique values',\n 'list unique values',\n 'first',\n 'last',\n 'minimum',\n 'maximum',\n ];\n return skipFormattingAggregations.includes(name);\n}\n\n// Apply cell formatting rules to a value\nexport function applyCellFormatting(\n value,\n cellFormatting,\n defaultFormatter,\n aggregatorName = null\n) {\n // Don't format if aggregation type should skip formatting (e.g., Count, First, Last)\n // Only use defaultFormatter if value is numeric, otherwise return as-is\n const isNumeric =\n (typeof value === 'number' && !isNaN(value) && isFinite(value)) ||\n (typeof value === 'string' &&\n value.trim() !== '' &&\n !containsSpecialCharacters(value) &&\n !isNaN(parseFloat(value)) &&\n isFinite(parseFloat(value)));\n if (shouldSkipFormattingForAggregation(aggregatorName)) {\n if (isNumeric && defaultFormatter) {\n return defaultFormatter(value);\n }\n // Return raw value for non-numeric values (dates, strings, etc.)\n return value;\n }\n\n // If no cellFormatting rules, always use default formatter to return to original format\n // This ensures values return to their original format when cellFormatting is cleared\n // Check for all possible cases: null, undefined, empty object, empty rules array\n const hasFormattingRules =\n cellFormatting &&\n typeof cellFormatting === 'object' &&\n Array.isArray(cellFormatting.rules) &&\n cellFormatting.rules.length > 0 &&\n cellFormatting.rules.some(rule => rule && rule.format);\n\n if (!hasFormattingRules) {\n // When cellFormatting rules are cleared, return the raw value (not formatted)\n // This ensures all cells (regular, Totals, Aggregation) return to their original unformatted state\n // Return the raw numeric value for numbers, or the value as-is for other types\n if (isNumeric) {\n // Return raw numeric value without any formatting\n if (typeof value === 'number') {\n return value;\n }\n // For string numbers, return the parsed numeric value\n return parseFloat(value);\n }\n // For non-numeric values (dates, strings, etc.), return as-is\n return value;\n }\n\n // Don't format if it contains special characters (dates, formatted strings, etc.)\n // Only check this when cellFormatting rules exist\n if (containsSpecialCharacters(value)) {\n return defaultFormatter ? defaultFormatter(value) : String(value);\n }\n\n // Check if value is a number - only apply custom formatting to raw numbers\n // Handle both number type and string numbers (e.g., \"123.45\")\n // Exclude strings with special characters from formatting\n let numericValue = value;\n\n // Convert string numbers to actual numbers for formatting\n if (isNumeric && typeof value === 'string') {\n numericValue = parseFloat(value);\n }\n\n // Use the first rule (all rules apply to all values)\n const matchingRule = cellFormatting.rules[0];\n\n // If we found a matching rule and value is numeric, apply its formatting\n if (matchingRule && matchingRule.format && isNumeric) {\n const format = matchingRule.format;\n const formatter = numberFormat({\n digitsAfterDecimal: 'decimalPlaces' in format ? format.decimalPlaces : 2,\n thousandsSep: 'thousandsSep' in format ? format.thousandsSep : ',',\n decimalSep: 'decimalSep' in format ? format.decimalSep : '.',\n prefix: 'prefix' in format ? format.prefix : '',\n suffix: 'suffix' in format ? format.suffix : '',\n showOriginal: 'showOriginal' in format ? format.showOriginal : false,\n });\n return formatter(numericValue);\n }\n\n // Not numeric or no matching rule, use default formatter\n return defaultFormatter ? defaultFormatter(value) : String(value);\n}\n\nfunction makeRenderer(opts = {}) {\n class TableRenderer extends React.PureComponent {\n constructor(props) {\n super(props);\n this.state = {\n start: 0,\n end: INITIAL_ROW_WINDOW_END,\n rows: null,\n columnStart: 0,\n columnEnd: INITIAL_COLUMN_WINDOW_END,\n columnTotals: null,\n viewportKey: null,\n sourceViewportKey: getViewportKeyForProps(props),\n scrollPending: false,\n };\n this.bodyRef = React.createRef();\n this.scrollParent = null;\n this.overlayBounds = null;\n this.frameId = null;\n this.scrollTimer = null;\n this.scrollPending = false;\n this.rowCount = 0;\n this.columnCount = 0;\n this.leadingColumnCount = 0;\n this.leadingColumnWidth = 0;\n this.pivotProps = null;\n this.pivotData = null;\n this.requestedWindow = null;\n this.viewportTimer = null;\n this.unmounted = false;\n this.scheduleUpdate = this.scheduleUpdate.bind(this);\n this.handleScroll = this.handleScroll.bind(this);\n }\n\n static getDerivedStateFromProps(nextProps, previousState) {\n const nextViewportKey = getViewportKeyForProps(nextProps);\n if (nextViewportKey === previousState.sourceViewportKey) {\n return null;\n }\n return {\n start: 0,\n end: INITIAL_ROW_WINDOW_END,\n rows: null,\n columnStart: 0,\n columnEnd: INITIAL_COLUMN_WINDOW_END,\n columnTotals: null,\n viewportKey: null,\n sourceViewportKey: nextViewportKey,\n scrollPending: false,\n };\n }\n\n componentDidMount() {\n this.attachScroll();\n this.updateWindow();\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps === this.props) {\n return;\n }\n\n const previousViewportKey = this.getViewportKeyForProps(prevProps);\n const nextViewportKey = this.getViewportKey();\n if (previousViewportKey !== nextViewportKey) {\n this.invalidateViewportRequest();\n if (this.scrollTimer !== null) {\n clearTimeout(this.scrollTimer);\n this.scrollTimer = null;\n }\n this.scrollPending = false;\n }\n\n this.attachScroll();\n this.scheduleUpdate();\n }\n\n componentWillUnmount() {\n this.unmounted = true;\n if (this.viewportTimer !== null) {\n clearTimeout(this.viewportTimer);\n }\n if (this.scrollTimer !== null) {\n clearTimeout(this.scrollTimer);\n }\n if (this.scrollParent) {\n this.scrollParent.removeEventListener('scroll', this.handleScroll);\n }\n window.removeEventListener('resize', this.scheduleUpdate);\n if (this.frameId !== null) {\n if (typeof cancelAnimationFrame === 'function') {\n cancelAnimationFrame(this.frameId);\n } else {\n clearTimeout(this.frameId);\n }\n }\n }\n\n attachScroll() {\n if (!this.props.virtualizeRows) {\n if (this.scrollParent) {\n this.scrollParent.removeEventListener('scroll', this.handleScroll);\n this.scrollParent = null;\n window.removeEventListener('resize', this.scheduleUpdate);\n }\n if (this.scrollTimer !== null) {\n clearTimeout(this.scrollTimer);\n this.scrollTimer = null;\n }\n this.scrollPending = false;\n this.invalidateViewportRequest();\n return;\n }\n if (!this.bodyRef.current) {\n return;\n }\n const parent = getScrollParent(this.bodyRef.current);\n if (parent === this.scrollParent) {\n return;\n }\n if (this.scrollParent) {\n this.scrollParent.removeEventListener('scroll', this.handleScroll);\n }\n this.scrollParent = parent;\n this.updateOverlayBounds();\n parent.addEventListener('scroll', this.handleScroll, {passive: true});\n window.addEventListener('resize', this.scheduleUpdate);\n }\n\n updateOverlayBounds() {\n if (!this.scrollParent) {\n return;\n }\n const bounds =\n this.scrollParent === window\n ? {\n top: 0,\n left: 0,\n width: window.innerWidth,\n height: window.innerHeight,\n }\n : this.scrollParent.getBoundingClientRect();\n this.overlayBounds = {\n top: Math.max(0, bounds.top),\n left: Math.max(0, bounds.left),\n width: Math.max(\n 0,\n Math.min(window.innerWidth, bounds.left + bounds.width) -\n Math.max(0, bounds.left)\n ),\n height: Math.max(\n 0,\n Math.min(window.innerHeight, bounds.top + bounds.height) -\n Math.max(0, bounds.top)\n ),\n };\n }\n\n handleScroll() {\n if (this.scrollTimer !== null) {\n clearTimeout(this.scrollTimer);\n }\n if (!this.scrollPending) {\n this.scrollPending = true;\n this.updateOverlayBounds();\n this.setState({scrollPending: true});\n }\n this.scrollTimer = setTimeout(() => {\n this.scrollTimer = null;\n this.scrollPending = false;\n this.updateWindow();\n if (!this.unmounted) {\n this.setState({scrollPending: false});\n }\n }, VIRTUAL_SCROLL_DEBOUNCE_MS);\n }\n\n scheduleUpdate() {\n if (this.frameId !== null) {\n return;\n }\n const schedule =\n typeof requestAnimationFrame === 'function'\n ? requestAnimationFrame\n : callback => setTimeout(callback, 16);\n this.frameId = schedule(() => {\n this.frameId = null;\n this.updateOverlayBounds();\n if (!this.props.virtualizeRows && this.state.scrollPending) {\n this.setState({scrollPending: false});\n }\n if (!this.scrollPending) {\n this.updateWindow();\n }\n });\n }\n\n getViewportKeyForProps(props) {\n return getViewportKeyForProps(props);\n }\n\n getViewportKey() {\n return this.getViewportKeyForProps(this.props);\n }\n\n invalidateViewportRequest() {\n this.requestedWindow = null;\n if (this.viewportTimer !== null) {\n clearTimeout(this.viewportTimer);\n this.viewportTimer = null;\n }\n }\n\n requestViewportWindow(start, end, columnStart, columnEnd, viewportKey) {\n const columnMode =\n this.props.tableOptions &&\n this.props.tableOptions.aggregationDisplayMode === 'column';\n const requestKey =\n `${viewportKey}:${start}:${end}:` +\n `${columnStart}:${columnEnd}:${columnMode}`;\n if (requestKey === this.requestedWindow) {\n return;\n }\n this.requestedWindow = requestKey;\n if (this.viewportTimer !== null) {\n clearTimeout(this.viewportTimer);\n }\n this.setState({\n start,\n end,\n columnStart,\n columnEnd,\n rows: null,\n columnTotals: null,\n viewportKey,\n });\n // Give the browser a frame to paint the loading row before dispatching.\n this.viewportTimer = setTimeout(() => {\n this.viewportTimer = null;\n computePivotViewportInWorker(\n viewportKey,\n start,\n end,\n columnMode,\n columnStart,\n columnEnd\n )\n .catch(error => {\n if (error && error.code === 'PIVOT_VIEWPORT_CANCELLED') {\n return null;\n }\n return computePivotViewport(\n this.props.precomputedData,\n start,\n end,\n columnMode,\n columnStart,\n columnEnd\n );\n })\n .then(viewport => {\n if (\n !viewport ||\n this.unmounted ||\n this.requestedWindow !== requestKey\n ) {\n return;\n }\n this.setState({\n rows: viewport.rows,\n columnTotals: viewport.colTotals || {},\n });\n });\n }, VIRTUAL_LOADING_PAINT_MS);\n }\n\n measureLeadingColumnWidth() {\n const body = this.bodyRef.current;\n const table = body && body.parentElement;\n const firstColumn = table && table.querySelector('thead .pvtColLabel');\n if (!table || !firstColumn) {\n return;\n }\n const tableBounds = table.getBoundingClientRect();\n const firstColumnBounds = firstColumn.getBoundingClientRect();\n const leftSpacer = table.querySelector(\n 'thead .pvtVirtualColumnSpacer-left'\n );\n const leftSpacerWidth = leftSpacer\n ? leftSpacer.getBoundingClientRect().width\n : 0;\n const measuredWidth =\n firstColumnBounds.left - tableBounds.left - leftSpacerWidth;\n if (Number.isFinite(measuredWidth) && measuredWidth > 0) {\n this.leadingColumnWidth = measuredWidth;\n }\n }\n\n updateWindow() {\n if (\n !this.scrollParent ||\n !this.bodyRef.current ||\n !this.props.virtualizeRows\n ) {\n return;\n }\n const viewportTop =\n this.scrollParent === window\n ? 0\n : this.scrollParent.getBoundingClientRect().top;\n const viewportHeight =\n this.scrollParent === window\n ? window.innerHeight\n : this.scrollParent.clientHeight;\n const viewportLeft =\n this.scrollParent === window\n ? 0\n : this.scrollParent.getBoundingClientRect().left;\n const viewportWidth =\n this.scrollParent === window\n ? window.innerWidth\n : this.scrollParent.clientWidth;\n const bodyBounds = this.bodyRef.current.getBoundingClientRect();\n const bodyTop = Number.isFinite(bodyBounds.top) ? bodyBounds.top : 0;\n const bodyLeft = Number.isFinite(bodyBounds.left) ? bodyBounds.left : 0;\n this.measureLeadingColumnWidth();\n const offset = viewportTop - bodyTop;\n const requestedStart = Math.max(\n 0,\n Math.min(\n this.rowCount,\n Math.floor(offset / VIRTUAL_ROW_HEIGHT) - VIRTUAL_ROW_OVERSCAN\n )\n );\n const start =\n Math.floor(requestedStart / VIRTUAL_ROW_BLOCK) * VIRTUAL_ROW_BLOCK;\n const end = Math.min(\n this.rowCount,\n start +\n Math.ceil(viewportHeight / VIRTUAL_ROW_HEIGHT) +\n VIRTUAL_ROW_BLOCK +\n VIRTUAL_ROW_OVERSCAN * 2\n );\n const horizontalOffset = Math.max(\n 0,\n viewportLeft -\n bodyLeft -\n (this.leadingColumnWidth ||\n this.leadingColumnCount * VIRTUAL_COLUMN_WIDTH)\n );\n const requestedColumnStart = Math.max(\n 0,\n Math.min(\n this.columnCount,\n Math.floor(horizontalOffset / VIRTUAL_COLUMN_WIDTH) -\n VIRTUAL_COLUMN_OVERSCAN\n )\n );\n const columnStart =\n Math.floor(requestedColumnStart / VIRTUAL_COLUMN_BLOCK) *\n VIRTUAL_COLUMN_BLOCK;\n const columnEnd = Math.min(\n this.columnCount,\n columnStart +\n Math.ceil(viewportWidth / VIRTUAL_COLUMN_WIDTH) +\n VIRTUAL_COLUMN_BLOCK +\n VIRTUAL_COLUMN_OVERSCAN * 2\n );\n const viewportKey = this.getViewportKey();\n if (\n viewportKey !== null &&\n (this.rowCount > VIRTUAL_ROW_THRESHOLD ||\n this.columnCount > VIRTUAL_COLUMN_THRESHOLD)\n ) {\n this.requestViewportWindow(\n start,\n end,\n columnStart,\n columnEnd,\n viewportKey\n );\n return;\n }\n this.invalidateViewportRequest();\n if (\n start !== this.state.start ||\n end !== this.state.end ||\n columnStart !== this.state.columnStart ||\n columnEnd !== this.state.columnEnd\n ) {\n this.setState({start, end, columnStart, columnEnd});\n }\n }\n\n render() {\n if (this.pivotProps !== this.props) {\n const pivotProps =\n !this.props.virtualizeRows &&\n this.props.precomputedData &&\n this.props.precomputedData.virtualized\n ? Object.assign({}, this.props, {precomputedData: null})\n : this.props;\n this.pivotData = new PivotData(pivotProps);\n this.pivotProps = this.props;\n }\n const pivotData = this.pivotData;\n const colAttrs = pivotData.props.cols;\n const rowAttrs = pivotData.props.rows;\n const aggregations = pivotData.getAggregations();\n const primaryAggregation = pivotData.getPrimaryAggregation();\n const hasMultipleAggregators = aggregations.length > 1;\n const tableOptions = this.props.tableOptions || {};\n const aggregationDisplayMode =\n tableOptions.aggregationDisplayMode === 'column' ? 'column' : 'row';\n const isColumnAggregationMode =\n aggregationDisplayMode === 'column' && hasMultipleAggregators;\n const rowAttrsToRender =\n hasMultipleAggregators && !isColumnAggregationMode\n ? rowAttrs.concat(['Values'])\n : rowAttrs;\n const colAttrsToRender = colAttrs;\n const hasColumnAttributes = colAttrsToRender.length > 0;\n const showTotalsColumn = !isColumnAggregationMode;\n const shouldRenderRowHeaderPlaceholder = rowAttrsToRender.length !== 0;\n\n // --- Row group header (rowGroupConfig) ---\n // `match` may reference row attribute names, 'Values' (aggregations shown\n // as rows) and aggregation names/labels (aggregations shown as columns).\n // Every column gets its own <th>, so the group label is repeated on each.\n const rowGroupConfig = this.props.rowGroupConfig;\n const hasHeaderGroup = Boolean(rowGroupConfig && rowGroupConfig.length);\n const groupLookup = buildGroupLookup(rowGroupConfig);\n const headerGroupSegments = hasHeaderGroup\n ? buildHeaderGroupSegments(rowAttrsToRender, rowGroupConfig)\n : [];\n const renderGroupSegments = rowSpan =>\n headerGroupSegments.map((seg, idx) => (\n <th\n key={`hgSeg${idx}`}\n colSpan={seg.span}\n rowSpan={rowSpan}\n // eslint-disable-next-line no-undefined\n style={seg.group ? groupLabelStyle : undefined}\n >\n {seg.group || ''}\n </th>\n ));\n // --- End row group header ---\n\n // --- Optional \"No.\" column (showNumericalOrder) ---\n // When enabled every data row is prefixed with its 1-based index, in a\n // column labelled \"No.\" placed before the row attribute columns.\n const showNumericalOrder = Boolean(this.props.showNumericalOrder);\n const hasNumberColumn =\n showNumericalOrder &&\n (rowAttrsToRender.length !== 0 || colAttrsToRender.length !== 0);\n const numberColumnLabel = 'No.';\n const renderedAggregationHeaderRow =\n isColumnAggregationMode && hasColumnAttributes;\n // The \"No.\" header cell is rendered in the first header row and spans\n // every header row, so the repeated header rows (column attributes,\n // aggregator labels, row group labels) stay aligned with the body.\n const numberColumnHeaderRowSpan =\n colAttrsToRender.length +\n (renderedAggregationHeaderRow ? 1 : 0) +\n (rowAttrsToRender.length !== 0 && !renderedAggregationHeaderRow\n ? 1\n : 0) +\n (hasHeaderGroup &&\n colAttrsToRender.length === 0 &&\n rowAttrsToRender.length !== 0\n ? 1\n : 0) +\n (renderedAggregationHeaderRow && hasHeaderGroup ? 1 : 0);\n const numberColumnInGroupRow =\n hasHeaderGroup &&\n colAttrsToRender.length === 0 &&\n rowAttrsToRender.length !== 0;\n const renderNumberHeaderCell = (rowSpan = numberColumnHeaderRowSpan) => (\n <th className=\"pvtAxisLabel pvtRowNumber\" rowSpan={rowSpan}>\n {numberColumnLabel}\n </th>\n );\n // --- End \"No.\" column ---\n\n const rowKeys = pivotData.getRowKeys();\n const baseRowKeys =\n hasMultipleAggregators &&\n !isColumnAggregationMode &&\n rowKeys.length === 0\n ? [[]]\n : rowKeys;\n const totalRowCount =\n this.props.precomputedData &&\n this.props.precomputedData.virtualized &&\n typeof this.props.precomputedData.totalRows === 'number'\n ? this.props.precomputedData.totalRows\n : baseRowKeys.length *\n (hasMultipleAggregators && !isColumnAggregationMode\n ? aggregations.length\n : 1);\n const isRowVirtualized =\n Boolean(this.props.virtualizeRows) &&\n totalRowCount > VIRTUAL_ROW_THRESHOLD;\n const colKeys = pivotData.getColKeys();\n const baseColKeys =\n isColumnAggregationMode && colKeys.length === 0 ? [[]] : colKeys;\n const totalColumnCount = isColumnAggregationMode\n ? baseColKeys.length * aggregations.length\n : colKeys.length;\n const isColumnVirtualized =\n Boolean(this.props.virtualizeRows) &&\n totalColumnCount > VIRTUAL_COLUMN_THRESHOLD;\n const isVirtualized = isRowVirtualized || isColumnVirtualized;\n const visibleColumnStart = isColumnVirtualized\n ? Math.min(this.state.columnStart, totalColumnCount)\n : 0;\n const visibleColumnEnd = isColumnVirtualized\n ? Math.min(\n Math.max(this.state.columnEnd, visibleColumnStart),\n totalColumnCount\n )\n : totalColumnCount;\n const columnMeta = [];\n for (\n let columnIndex = visibleColumnStart;\n columnIndex < visibleColumnEnd;\n columnIndex++\n ) {\n if (isColumnAggregationMode) {\n const colKey =\n baseColKeys[Math.floor(columnIndex / aggregations.length)];\n const aggregation = aggregations[columnIndex % aggregations.length];\n columnMeta.push({\n displayKey: colKey.concat([\n aggregation.label || aggregation.aggregatorName,\n ]),\n actualKey: colKey,\n aggregationKey: aggregation.key,\n absoluteIndex: columnIndex,\n });\n } else {\n const colKey = colKeys[columnIndex];\n columnMeta.push({\n displayKey: colKey,\n actualKey: colKey,\n aggregationKey: primaryAggregation.key,\n absoluteIndex: columnIndex,\n });\n }\n }\n const colKeyValues = columnMeta.map(col => col.displayKey);\n const leftColumnSpacerWidth = isColumnVirtualized\n ? visibleColumnStart * VIRTUAL_COLUMN_WIDTH\n : 0;\n const rightColumnSpacerWidth = isColumnVirtualized\n ? (totalColumnCount - visibleColumnEnd) * VIRTUAL_COLUMN_WIDTH\n : 0;\n const renderColumnSpacer = (side, width, Cell = 'th') =>\n width > 0 ? (\n <Cell\n aria-hidden=\"true\"\n className={`pvtVirtualColumnSpacer pvtVirtualColumnSpacer-${side}`}\n key={`virtual-column-spacer-${side}`}\n style={{width, minWidth: width, maxWidth: width}}\n />\n ) : null;\n\n const renderAggregatorHeaderCells = () => (\n <React.Fragment>\n {renderColumnSpacer('left', leftColumnSpacerWidth)}\n {columnMeta.map((colMeta, idx) => {\n const label =\n colMeta.displayKey[colMeta.displayKey.length - 1] || '';\n // Calculate colspan/rowspan so aggregator headers line up with column groups\n // aggregator index is the last element in displayKey (after column attrs)\n const aggIndex = colAttrsToRender.length;\n // When there are column attributes, each aggregator should appear once per column group,\n // so each aggregator header should have colSpan = 1.\n // When there are no column attributes, use spanSize to merge identical aggregator labels.\n let colSpan;\n if (hasColumnAttributes) {\n // Each aggregator appears once per column group, so colSpan is always 1\n // This ensures aggregator headers are listed in each column group and align\n // correctly with the column groups above (which have colSpan = number of aggregators)\n colSpan = 1;\n } else {\n // Use spanSize to merge identical aggregator labels when there are no column attributes\n colSpan = spanSize(colKeyValues, idx, aggIndex);\n // If spanSize returned -1 it means this cell is merged into a previous one\n if (colSpan === -1) {\n return null;\n }\n }\n\n // When there are column attributes, rowSpan should account for the row header row\n // When there are no column attributes, rowSpan is 1\n const rowSpan =\n hasColumnAttributes && rowAttrsToRender.length !== 0 ? 1 : 1;\n\n return (\n <th\n className=\"pvtColLabel\"\n key={`agg-label-${colMeta.absoluteIndex}`}\n colSpan={colSpan}\n rowSpan={rowSpan}\n >\n {label}\n </th>\n );\n })}\n {renderColumnSpacer('right', rightColumnSpacerWidth)}\n </React.Fragment>\n );\n\n let valueCellColors = () => {};\n let rowTotalColors = () => {};\n let colTotalColors = () => {};\n if (opts.heatmapMode && !hasMultipleAggregators) {\n const colorScaleGenerator = this.props.tableColorScaleGenerator;\n const rowTotalValues = colKeys.map(x =>\n pivotData.getAggregator([], x, primaryAggregation.key).value()\n );\n rowTotalColors = colorScaleGenerator(rowTotalValues);\n const colTotalValues = rowKeys.map(x =>\n pivotData.getAggregator(x, [], primaryAggregation.key).value()\n );\n colTotalColors = colorScaleGenerator(colTotalValues);\n\n if (opts.heatmapMode === 'full') {\n const allValues = [];\n rowKeys.map(r =>\n colKeys.map(c =>\n allValues.push(\n pivotData.getAggregator(r, c, primaryAggregation.key).value()\n )\n )\n );\n const colorScale = colorScaleGenerator(allValues);\n valueCellColors = (r, c, v) => colorScale(v);\n } else if (opts.heatmapMode === 'row') {\n const rowColorScales = {};\n rowKeys.map(r => {\n const rowValues = colKeys.map(x =>\n pivotData.getAggregator(r, x, primaryAggregation.key).value()\n );\n rowColorScales[r] = colorScaleGenerator(rowValues);\n });\n valueCellColors = (r, c, v) => rowColorScales[r](v);\n } else if (opts.heatmapMode === 'col') {\n const colColorScales = {};\n colKeys.map(c => {\n const colValues = rowKeys.map(x =>\n pivotData.getAggregator(x, c, primaryAggregation.key).value()\n );\n colColorScales[c] = colorScaleGenerator(colValues);\n });\n valueCellColors = (r, c, v) => colColorScales[c](v);\n }\n }\n\n // Get conditional formatting from tableOptions\n const conditionalFormatting = tableOptions.conditionalFormatting || null;\n\n // Get cell formatting from tableOptions\n const cellFormatting = tableOptions.cellFormatting || null;\n\n // Create lookup map from aggregationKey to aggregatorName\n const aggregationNameLookup = {};\n aggregations.forEach(agg => {\n aggregationNameLookup[agg.key] = agg.aggregatorName;\n });\n\n // Lookup aggregationKey -> aggregation definition (to read `vals`)\n const aggregationByKey = {};\n aggregations.forEach(agg => {\n aggregationByKey[agg.key] = agg;\n });\n\n // Find the group label for an aggregation. rowGroupConfig `match` is\n // compared against the aggregation's `vals` (the field names it works\n // on, e.g. ['Employee Ref']). Falls back to label / aggregatorName.\n const getAggregationGroup = aggregationKey => {\n const agg = aggregationByKey[aggregationKey];\n if (!agg) {\n return null;\n }\n const vals = Array.isArray(agg.vals) ? agg.vals : [];\n for (let k = 0; k < vals.length; k++) {\n if (groupLookup[vals[k]]) {\n return groupLookup[vals[k]];\n }\n }\n return (\n groupLookup[agg.label] || groupLookup[agg.aggregatorName] || null\n );\n };\n\n // Group label cells for the aggregation columns (column aggregation mode).\n // Each column renders its own <th>, so the label repeats on every column.\n const renderAggregatorGroupCells = () => (\n <React.Fragment>\n {renderColumnSpacer('left', leftColumnSpacerWidth)}\n {columnMeta.map(colMeta => {\n const group = getAggregationGroup(colMeta.aggregationKey);\n return (\n <th\n key={`aggGrp${colMeta.absoluteIndex}`}\n // eslint-disable-next-line no-undefined\n style={group ? groupLabelStyle : undefined}\n >\n {group || ''}\n </th>\n );\n })}\n {renderColumnSpacer('right', rightColumnSpacerWidth)}\n </React.Fragment>\n );\n\n // Helper function to get cell style with conditional formatting\n const getCellStyle = (value, heatmapStyle = {}) => {\n const conditionalStyle = getConditionalFormattingStyle(\n value,\n conditionalFormatting\n );\n return mergeStyles(heatmapStyle, conditionalStyle);\n };\n\n // Helper function to format cell value with cell formatting rules\n const formatCellValue = (value, aggregator, aggregationKey) => {\n const aggregatorName = aggregationKey\n ? aggregationNameLookup[aggregationKey]\n : null;\n\n return applyCellFormatting(\n value,\n cellFormatting,\n aggregator.format.bind(aggregator),\n aggregatorName\n );\n };\n\n // Helper function to format label text if it's numeric\n // Used for both row and column labels\n const formatLabel = txt => {\n // Check if txt is numeric (number or numeric string)\n // Also exclude 'null' string which is used for missing values\n if (txt === 'null' || txt === null || typeof txt === 'undefined') {\n return txt;\n }\n\n // Don't format if it contains special characters (dates, formatted strings, etc.)\n if (containsSpecialCharacters(txt)) {\n return txt;\n }\n\n // Check if txt is numeric (number or numeric string)\n // A string is numeric if it can be parsed as a finite number\n // Exclude strings with special characters from formatting\n let isNumeric = false;\n let numericValue = null;\n\n if (typeof txt === 'number') {\n isNumeric = !isNaN(txt) && isFinite(txt);\n if (isNumeric) {\n numericValue = txt;\n }\n } else if (\n typeof txt === 'string' &&\n txt.trim() !== '' &&\n txt !== 'null' &&\n !containsSpecialCharacters(txt)\n ) {\n const parsed = parseFloat(txt.trim());\n isNumeric = !isNaN(parsed) && isFinite(parsed);\n if (isNumeric) {\n numericValue = parsed;\n }\n }\n\n if (\n isNumeric &&\n numericValue !== null &&\n cellFormatting &&\n Array.isArray(cellFormatting.rules) &&\n cellFormatting.rules.length > 0\n ) {\n const matchingRule = cellFormatting.rules[0];\n if (matchingRule && matchingRule.format) {\n const format = matchingRule.format;\n const formatter = numberFormat({\n digitsAfterDecimal:\n 'decimalPlaces' in format ? format.decimalPlaces : 2,\n thousandsSep:\n 'thousandsSep' in format ? format.thousandsSep : ',',\n decimalSep: 'decimalSep' in format ? format.decimalSep : '.',\n prefix: 'prefix' in format ? format.prefix : '',\n suffix: 'suffix' in format ? format.suffix : '',\n showOriginal:\n 'showOriginal' in format ? format.showOriginal : false,\n });\n return formatter(numericValue);\n }\n }\n\n // Not numeric or no formatting rules, return as-is\n return txt;\n };\n\n // Helper function to format row label text if it's numeric\n // Only formats if it's a numeric value, not aggregation labels\n const formatRowLabel = (\n txt,\n index,\n isLastElement,\n hasMultipleAggregators,\n rowAttrsLength\n ) => {\n // Don't format the last element if it's an aggregation label (when multiple aggregators)\n // The last element is an aggregation label only if:\n // 1. There are multiple aggregators\n // 2. AND it's beyond the row attributes (index >= rowAttrsLength)\n if (\n hasMultipleAggregators &&\n isLastElement &&\n index >= rowAttrsLength\n ) {\n return txt;\n }\n\n return formatLabel(txt);\n };\n\n const getClickHandler =\n tableOptions && tableOptions.clickCallback\n ? (value, rowValues, colValues) => {\n const filters = {};\n for (const i of Object.keys(colAttrs || {})) {\n const attr = colAttrs[i];\n if (colValues[i] !== null) {\n filters[attr] = colValues[i];\n }\n }\n for (const i of Object.keys(rowAttrs || {})) {\n const attr = rowAttrs[i];\n if (rowValues[i] !== null) {\n filters[attr] = rowValues[i];\n }\n }\n return e =>\n tableOptions.clickCallback(e, value, filters, pivotData);\n }\n : null;\n\n const handleColSort = (attr, e) => {\n e.stopPropagation();\n if (this.props.onColSort) {\n const currentSort = this.props.colSorts && this.props.colSorts[attr];\n let nextSort = 'ASC';\n if (currentSort === 'ASC') {\n nextSort = 'DESC';\n } else if (currentSort === 'DESC') {\n nextSort = null;\n }\n this.props.onColSort(attr, nextSort);\n }\n };\n\n const handleRowSort = (attr, e) => {\n e.stopPropagation();\n if (this.props.onRowSort) {\n const currentSort = this.props.rowSorts && this.props.rowSorts[attr];\n let nextSort = 'ASC';\n if (currentSort === 'ASC') {\n nextSort = 'DESC';\n } else if (currentSort === 'DESC') {\n nextSort = null;\n }\n this.props.onRowSort(attr, nextSort);\n }\n };\n\n const getSortButton = (attr, isCol) => {\n const currentSort = isCol\n ? this.props.colSorts && this.props.colSorts[attr]\n : this.props.rowSorts && this.props.rowSorts[attr];\n const handleSort = isCol ? handleColSort : handleRowSort;\n let sortIcon = '';\n if (currentSort !== null) {\n if (isCol) {\n sortIcon =\n this.props.colSortIcons[currentSort] ||\n this.props.colSortIcons.DEFAULT;\n } else {\n sortIcon =\n this.props.rowSortIcons[currentSort] ||\n this.props.rowSortIcons.DEFAULT;\n }\n }\n return (\n <button\n type=\"button\"\n className=\"pvtSortButton\"\n onClick={e => handleSort(attr, e)}\n title={\n currentSort === 'ASC'\n ? 'Sort Descending'\n : currentSort === 'DESC'\n ? 'Clear Sort'\n : 'Sort Ascending'\n }\n >\n {sortIcon}\n </button>\n );\n };\n\n const totalRowAggregations = isColumnAggregationMode\n ? [primaryAggregation]\n : hasMultipleAggregators\n ? aggregations\n : [primaryAggregation];\n const totalsLabelText = 'Totals';\n this.rowCount = totalRowCount;\n this.columnCount = totalColumnCount;\n this.leadingColumnCount =\n rowAttrsToRender.length +\n (hasNumberColumn ? 1 : 0) +\n (showTotalsColumn &&\n colAttrsToRender.length !== 0 &&\n rowAttrsToRender.length !== 0\n ? 1\n : 0);\n const visibleStart = isRowVirtualized\n ? Math.min(this.state.start, totalRowCount)\n : 0;\n const visibleEnd = isRowVirtualized\n ? Math.min(Math.max(this.state.end, visibleStart), totalRowCount)\n : totalRowCount;\n const viewportKey = isVirtualized ? this.getViewportKey() : null;\n const viewportReady =\n viewportKey !== null &&\n this.state.viewportKey === viewportKey &&\n this.state.start === visibleStart &&\n this.state.end === visibleEnd &&\n this.state.columnStart === visibleColumnStart &&\n this.state.columnEnd === visibleColumnEnd &&\n this.state.columnTotals !== null &&\n this.state.rows !== null;\n const isViewportLoading = viewportKey !== null && !viewportReady;\n const viewportColumnTotals = this.state.columnTotals || {};\n const visibleRows = isViewportLoading\n ? []\n : viewportKey !== null\n ? this.state.rows\n : computePivotViewport(\n {rowKeys: baseRowKeys, aggregations},\n visibleStart,\n visibleEnd,\n isColumnAggregationMode,\n visibleColumnStart,\n visibleColumnEnd\n ).rows;\n const virtualColumnCount =\n rowAttrsToRender.length +\n columnMeta.length +\n (leftColumnSpacerWidth > 0 ? 1 : 0) +\n (rightColumnSpacerWidth > 0 ? 1 : 0) +\n (hasNumberColumn ? 1 : 0) +\n (showTotalsColumn ? 1 : 0);\n\n return (\n <table\n className={\n `pvtTable${isVirtualized ? ' pvtVirtualized' : ''}` +\n `${isColumnVirtualized ? ' pvtVirtualColumns' : ''}`\n }\n data-pvt-virtualized={isVirtualized ? 'true' : null}\n ref={element => {\n if (element) {\n pivotTablePropsByElement.set(element, this.props);\n }\n }}\n >\n <thead>\n {colAttrsToRender.map(function(c, j) {\n return (\n <tr key={`colAttr${j}`}>\n {hasNumberColumn && j === 0 && renderNumberHeaderCell()}\n {shouldRenderRowHeaderPlaceholder &&\n (isColumnAggregationMode || j === 0) &&\n !(\n isColumnAggregationMode &&\n hasColumnAttributes &&\n rowAttrsToRender.length === 1\n ) &&\n (hasHeaderGroup && j === 0 && !isColumnAggregationMode ? (\n renderGroupSegments(colAttrsToRender.length)\n ) : (\n <th\n colSpan={\n isColumnAggregationMode && hasColumnAttributes\n ? rowAttrsToRender.length - 1\n : rowAttrsToRender.length\n }\n rowSpan={\n isColumnAggregationMode && hasColumnAttributes\n ? 1\n : colAttrsToRender.length\n }\n />\n ))}\n {c ? (\n <th className=\"pvtAxisLabel\">\n {c}\n {colAttrs.includes(c) && getSortButton(c, true)}\n </th>\n ) : null}\n {renderColumnSpacer('left', leftColumnSpacerWidth)}\n {colKeyValues.map(function(colKey, i) {\n const x = spanSize(colKeyValues, i, j);\n\n if (x === -1) {\n return null;\n }\n\n const formattedColLabel = formatLabel(colKey[j]);\n return (\n <th\n className=\"pvtColLabel\"\n key={`colKey${columnMeta[i].absoluteIndex}`}\n colSpan={x}\n rowSpan={\n j === colAttrsToRender.length - 1 &&\n rowAttrsToRender.length !== 0 &&\n !isColumnAggregationMode\n ? 2\n : 1\n }\n >\n {formattedColLabel}\n </th>\n );\n })}\n {renderColumnSpacer('right', rightColumnSpacerWidth)}\n\n {showTotalsColumn && j === 0 && (\n <th\n className=\"pvtTotalLabel\"\n rowSpan={\n colAttrsToRender.length +\n (rowAttrsToRender.length === 0 ? 0 : 1)\n }\n >\n {totalsLabelText}\n </th>\n )}\n </tr>\n );\n })}\n\n {/* Group row for the aggregation columns, placed right above the\n aggregator label row (column mode with column attributes) */}\n {isColumnAggregationMode && hasColumnAttributes && hasHeaderGroup && (\n <tr>\n {renderGroupSegments(1)}\n {renderAggregatorGroupCells()}\n </tr>\n )}\n\n {/* Group row when there are no column attributes */}\n {hasHeaderGroup &&\n colAttrsToRender.length === 0 &&\n rowAttrsToRender.length !== 0 && (\n <tr>\n {hasNumberColumn && renderNumberHeaderCell()}\n {renderGroupSegments(1)}\n {isColumnAggregationMode ? (\n renderAggregatorGroupCells()\n ) : (\n <th />\n )}\n </tr>\n )}\n\n {isColumnAggregationMode && hasColumnAttributes && (\n <tr>\n {rowAttrsToRender.length !== 0 &&\n rowAttrsToRender.map((r, i) => {\n const isRowAttr = i < rowAttrs.length;\n const attr = isRowAttr ? rowAttrs[i] : null;\n return (\n <th className=\"pvtAxisLabel\" key={`rowAttr-agg-${i}`}>\n {r}\n {isRowAttr && attr && getSortButton(attr, false)}\n </th>\n );\n })}\n {renderAggregatorHeaderCells()}\n </tr>\n )}\n\n {rowAttrsToRender.length !== 0 &&\n !(isColumnAggregationMode && hasColumnAttributes) && (\n <tr>\n {hasNumberColumn &&\n colAttrsToRender.length === 0 &&\n !numberColumnInGroupRow &&\n renderNumberHeaderCell()}\n {rowAttrsToRender.map((r, i) => {\n const isRowAttr = i < rowAttrs.length;\n const attr = isRowAttr ? rowAttrs[i] : null;\n return (\n <th className=\"pvtAxisLabel\" key={`rowAttr${i}`}>\n {r}\n {isRowAttr && attr && getSortButton(attr, false)}\n </th>\n );\n })}\n {isColumnAggregationMode && !hasColumnAttributes\n ? renderAggregatorHeaderCells()\n : null}\n {showTotalsColumn && (\n <th className=\"pvtTotalLabel\">\n {colAttrs.length === 0 ? totalsLabelText : null}\n </th>\n )}\n </tr>\n )}\n </thead>\n\n <tbody ref={this.bodyRef}>\n {isRowVirtualized && visibleStart > 0 && (\n <tr className=\"pvtVirtualSpacer\" aria-hidden=\"true\">\n <td\n colSpan={virtualColumnCount}\n style={{\n height: visibleStart * VIRTUAL_ROW_HEIGHT,\n padding: 0,\n border: 0,\n }}\n />\n </tr>\n )}\n {isViewportLoading && (\n <tr className=\"pvtVirtualLoading\" aria-hidden=\"true\">\n <td\n colSpan={virtualColumnCount}\n style={{\n height: (visibleEnd - visibleStart) * VIRTUAL_ROW_HEIGHT,\n }}\n />\n </tr>\n )}\n {isVirtualized &&\n this.overlayBounds &&\n (this.state.scrollPending || isViewportLoading) && (\n <tr className=\"pvtVirtualOverlayRow\">\n <td colSpan={virtualColumnCount}>\n <div\n className=\"pvtLoadingOverlay pvtVirtualScrollOverlay\"\n role=\"status\"\n style={this.overlayBounds}\n >\n <PivotLoadingContent />\n </div>\n </td>\n </tr>\n )}\n {visibleRows.map(function(rowMeta, visibleIndex) {\n const i = visibleStart + visibleIndex;\n const hasViewportValues = rowMeta.cells !== null;\n const totalAggregator = hasViewportValues\n ? pivotData.getPrecomputedAggregator(\n rowMeta.rowTotal,\n rowMeta.aggregationKey\n )\n : pivotData.getAggregator(\n rowMeta.actualKey,\n [],\n rowMeta.aggregationKey\n );\n const displayKey = rowMeta.displayKey;\n return (\n <tr className=\"pvtDataRow\" key={`rowKeyRow${i}`}>\n {hasNumberColumn && (\n <th className=\"pvtRowNumber\" key={`rowNumber${i}`}>\n {i + 1}\n </th>\n )}\n {displayKey.map(function(txt, j) {\n const x = rowMeta.spans[j];\n if (x === -1) {\n return null;\n }\n const isLastElement = j === displayKey.length - 1;\n const formattedTxt = formatRowLabel(\n txt,\n j,\n isLastElement,\n hasMultipleAggregators,\n rowAttrs.length\n );\n return (\n <th\n key={`rowKeyLabel${i}-${j}`}\n className=\"pvtRowLabel\"\n rowSpan={x}\n colSpan={\n showTotalsColumn &&\n j === rowAttrsToRender.length - 1 &&\n colAttrsToRender.length !== 0\n ? 2\n : 1\n }\n >\n {formattedTxt}\n </th>\n );\n })}\n {renderColumnSpacer('left', leftColumnSpacerWidth, 'td')}\n {columnMeta.map(function(colMeta) {\n const aggregationKeyForCell = isColumnAggregationMode\n ? colMeta.aggregationKey\n : rowMeta.aggregationKey;\n const aggregator = hasViewportValues\n ? pivotData.getPrecomputedAggregator(\n rowMeta.cells[\n colMeta.actualKey.join(FLAT_KEY_SEPARATOR)\n ],\n aggregationKeyForCell\n )\n : pivotData.getAggregator(\n rowMeta.actualKey,\n colMeta.actualKey,\n aggregationKeyForCell\n );\n const value = aggregator.value();\n const heatmapStyle =\n valueCellColors(\n rowMeta.actualKey,\n colMeta.actualKey,\n value\n ) || {};\n return (\n <td\n className=\"pvtVal\"\n key={`pvtVal${i}-${colMeta.absoluteIndex}`}\n onClick={\n getClickHandler &&\n getClickHandler(\n value,\n rowMeta.actualKey,\n colMeta.actualKey\n )\n }\n style={getCellStyle(value, heatmapStyle)}\n >\n {formatCellValue(\n value,\n aggregator,\n aggregationKeyForCell\n )}\n </td>\n );\n })}\n {renderColumnSpacer('right', rightColumnSpacerWidth, 'td')}\n {showTotalsColumn && (\n <td\n className=\"pvtTotal\"\n onClick={\n getClickHandler &&\n getClickHandler(\n totalAggregator.value(),\n rowMeta.actualKey,\n [null]\n )\n }\n style={getCellStyle(\n totalAggregator.value(),\n colTotalColors(totalAggregator.value()) || {}\n )}\n >\n {formatCellValue(\n totalAggregator.value(),\n totalAggregator,\n rowMeta.aggregationKey\n )}\n </td>\n )}\n </tr>\n );\n })}\n\n {isRowVirtualized && visibleEnd < totalRowCount && (\n <tr className=\"pvtVirtualSpacer\" aria-hidden=\"true\">\n <td\n colSpan={virtualColumnCount}\n style={{\n height: (totalRowCount - visibleEnd) * VIRTUAL_ROW_HEIGHT,\n padding: 0,\n border: 0,\n }}\n />\n </tr>\n )}\n\n {totalRowAggregations.map(function(agg) {\n const grandTotalAggregator = pivotData.getAggregator(\n [],\n [],\n isColumnAggregationMode ? primaryAggregation.key : agg.key\n );\n const totalLabel =\n hasMultipleAggregators && !isColumnAggregationMode\n ? `Totals – ${agg.label || agg.aggregatorName}`\n : totalsLabelText;\n return (\n <tr key={`totalRow-${agg.key}`}>\n <th\n className=\"pvtTotalLabel\"\n colSpan={\n rowAttrsToRender.length +\n (colAttrs.length === 0 ||\n (isColumnAggregationMode && hasColumnAttributes)\n ? 0\n : 1) +\n (hasNumberColumn ? 1 : 0)\n }\n >\n {totalLabel}\n </th>\n\n {renderColumnSpacer('left', leftColumnSpacerWidth, 'td')}\n {columnMeta.map(function(colMeta) {\n const flatColKey = colMeta.actualKey.join(\n FLAT_KEY_SEPARATOR\n );\n const totalAggregator =\n viewportKey !== null\n ? pivotData.getPrecomputedAggregator(\n viewportColumnTotals[flatColKey],\n isColumnAggregationMode\n ? colMeta.aggregationKey\n : agg.key\n )\n : pivotData.getAggregator(\n [],\n colMeta.actualKey,\n isColumnAggregationMode\n ? colMeta.aggregationKey\n : agg.key\n );\n const totalValue = totalAggregator.value();\n return (\n <td\n className=\"pvtTotal\"\n key={`total${agg.key}-${colMeta.absoluteIndex}`}\n onClick={\n getClickHandler &&\n getClickHandler(totalValue, [null], colMeta.actualKey)\n }\n style={getCellStyle(\n totalValue,\n rowTotalColors(totalValue) || {}\n )}\n >\n {formatCellValue(totalValue, totalAggregator, agg.key)}\n </td>\n );\n })}\n\n {renderColumnSpacer('right', rightColumnSpacerWidth, 'td')}\n\n {showTotalsColumn && (\n <td\n onClick={\n getClickHandler &&\n getClickHandler(\n grandTotalAggregator.value(),\n [null],\n [null]\n )\n }\n className=\"pvtGrandTotal\"\n style={getCellStyle(grandTotalAggregator.value(), {})}\n >\n {formatCellValue(\n grandTotalAggregator.value(),\n grandTotalAggregator,\n isColumnAggregationMode\n ? primaryAggregation.key\n : agg.key\n )}\n </td>\n )}\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n }\n }\n\n TableRenderer.defaultProps = PivotData.defaultProps;\n TableRenderer.propTypes = PivotData.propTypes;\n TableRenderer.defaultProps.tableColorScaleGenerator = redColorScaleGenerator;\n TableRenderer.defaultProps.tableOptions = {};\n TableRenderer.defaultProps.colSorts = {};\n TableRenderer.defaultProps.rowSorts = {};\n TableRenderer.defaultProps.rowGroupConfig = null;\n TableRenderer.propTypes.tableColorScaleGenerator = PropTypes.func;\n TableRenderer.propTypes.tableOptions = PropTypes.object;\n TableRenderer.propTypes.colSorts = PropTypes.objectOf(\n PropTypes.oneOf(['ASC', 'DESC'])\n );\n TableRenderer.propTypes.rowSorts = PropTypes.objectOf(\n PropTypes.oneOf(['ASC', 'DESC'])\n );\n TableRenderer.propTypes.onColSort = PropTypes.func;\n TableRenderer.propTypes.onRowSort = PropTypes.func;\n TableRenderer.propTypes.rowGroupConfig = PropTypes.arrayOf(\n PropTypes.shape({\n label: PropTypes.string.isRequired,\n match: PropTypes.arrayOf(PropTypes.string).isRequired,\n })\n );\n TableRenderer.defaultProps.colSortIcons = {\n ASC: '→',\n DESC: '←',\n DEFAULT: '↔',\n };\n TableRenderer.defaultProps.rowSortIcons = {\n ASC: '↑',\n DESC: '↓',\n DEFAULT: '⇅',\n };\n TableRenderer.propTypes.colSortIcons = PropTypes.shape({\n ASC: PropTypes.node,\n DESC: PropTypes.node,\n DEFAULT: PropTypes.node,\n });\n TableRenderer.propTypes.rowSortIcons = PropTypes.shape({\n ASC: PropTypes.node,\n DESC: PropTypes.node,\n DEFAULT: PropTypes.node,\n });\n // When true, a \"No.\" column with the 1-based index of each data row is\n // rendered before the row attribute columns.\n TableRenderer.defaultProps.showNumericalOrder = false;\n TableRenderer.propTypes.showNumericalOrder = PropTypes.bool;\n TableRenderer.defaultProps.virtualizeRows = false;\n TableRenderer.propTypes.virtualizeRows = PropTypes.bool;\n return TableRenderer;\n}\n\nclass TSVExportRenderer extends React.PureComponent {\n render() {\n const pivotData = new PivotData(this.props);\n const rowAttrs = pivotData.props.rows;\n const aggregations = pivotData.getAggregations();\n const hasMultipleAggregators = aggregations.length > 1;\n const rowKeys = pivotData.getRowKeys();\n const colKeys = pivotData.getColKeys();\n const safeRowKeys = rowKeys.length === 0 ? [[]] : rowKeys;\n const safeColKeys = colKeys.length === 0 ? [[]] : colKeys;\n\n const rowEntries = hasMultipleAggregators\n ? safeRowKeys.reduce((acc, rowKey) => {\n aggregations.forEach(agg => {\n acc.push({rowKey, aggregationKey: agg.key, label: agg.label});\n });\n return acc;\n }, [])\n : safeRowKeys.map(rowKey => ({\n rowKey,\n aggregationKey: aggregations[0].key,\n label: aggregations[0].label || aggregations[0].aggregatorName,\n }));\n\n const headerRow = rowAttrs.slice();\n if (hasMultipleAggregators) {\n headerRow.push('Values');\n }\n if (safeColKeys.length === 1 && safeColKeys[0].length === 0) {\n headerRow.push(\n hasMultipleAggregators\n ? 'Value'\n : aggregations[0].label || aggregations[0].aggregatorName\n );\n } else {\n safeColKeys.map(c => headerRow.push(c.join('-')));\n }\n\n const result = rowEntries.map(entry => {\n const row = entry.rowKey.map(x => x);\n if (hasMultipleAggregators) {\n row.push(entry.label || '');\n }\n safeColKeys.map(colKey => {\n const v = pivotData\n .getAggregator(entry.rowKey, colKey, entry.aggregationKey)\n .value();\n row.push(v ? v : '');\n });\n return row;\n });\n\n result.unshift(headerRow);\n\n return (\n <textarea\n value={result.map(r => r.join('\\t')).join('\\n')}\n style={{width: window.innerWidth / 2, height: window.innerHeight / 2}}\n readOnly={true}\n />\n );\n }\n}\n\nTSVExportRenderer.defaultProps = PivotData.defaultProps;\nTSVExportRenderer.propTypes = PivotData.propTypes;\n\nexport default {\n Table: makeRenderer(),\n 'Table Heatmap': makeRenderer({heatmapMode: 'full'}),\n 'Table Col Heatmap': makeRenderer({heatmapMode: 'col'}),\n 'Table Row Heatmap': makeRenderer({heatmapMode: 'row'}),\n 'Exportable TSV': TSVExportRenderer,\n};\n"]}