@hrforte/react-pivottable 1.1.0 → 2.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/PlotlyRenderers.jsx"],"names":["createPlotlyRenderers","CHART_WIDTH_RATIO","CHART_HEIGHT_RATIO","CHART_HEIGHT_OFFSET","ensureNonEmptyKeys","keys","length","combineCategoryLabels","categoryKey","datumKey","categoryLabel","join","datumLabel","buildAxisTitle","categoryTitle","datumTitle","defaultTitle","collectAggregationData","pivotData","categoryKeys","datumKeys","aggregationKey","values","labels","val","parseFloat","getAggregator","value","push","isFinite","getChartDimensions","rowMultiplier","width","window","innerWidth","height","innerHeight","createRendererProps","defaultProps","Object","assign","PivotData","plotlyOptions","plotlyConfig","propTypes","PropTypes","object","onRendererUpdate","func","getChartRenderingStrategy","traceOptions","type","mode","includes","makeRenderer","PlotlyComponent","layoutOptions","transpose","Renderer","props","rowKeys","getRowKeys","colKeys","getColKeys","traceKeys","primaryAggregation","getPrimaryAggregation","fallbackAggregator","aggregators","aggregatorName","aggregationVals","vals","fullAggName","label","data","map","textValues","aggregator","traceKey","cellFormatting","finalFormattedValue","format","bind","trace","name","text","hovertemplate","textinfo","textposition","x","y","orientation","textmode","stackgroup","titleText","hAxisTitle","rows","cols","groupByTitle","dimensions","layout","title","hovermode","columns","Math","ceil","sqrt","grid","forEach","d","i","domain","row","floor","column","showlegend","xaxis","automargin","yaxis","React","PureComponent","rendererProps","createPieCategoryTrace","aggregation","subplotIndex","key","mergedTrace","createCategoryDataTraces","aggregations","groupIndex","traces","displayText","createGroupedSubplotAxes","rowsTitle","colsTitle","showXAxisTitle","primaryAgg","aggName","xAxisTitle","showticklabels","makeGroupedRenderer","renderingStrategy","allAggregations","getAggregations","pattern","index","groupedAggregations","groupAggregationsByType","groupNames","groupName","makeScatterRenderer","rowKey","colKey","v","barmode","scalegroup","hoverinfo"],"mappings":"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","file":"PlotlyRenderers.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { PivotData } from './Utilities';\nimport { applyCellFormatting } from './TableRenderers';\n\nconst CHART_WIDTH_RATIO = 1.5; // Ratio to scale down from full window width\nconst CHART_HEIGHT_RATIO = 1.4; // Ratio to scale down from full window height\nconst CHART_HEIGHT_OFFSET = 50; // Fixed offset to subtract from height calculation\n\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Ensures keys array is not empty by adding an empty array if needed\n */\nfunction ensureNonEmptyKeys(keys) {\n return keys.length > 0 ? keys : [[]];\n}\n\n/**\n * Combines category and datum labels into a single display label\n */\nfunction combineCategoryLabels(categoryKey, datumKey) {\n const categoryLabel = categoryKey.join(' ') || '';\n const datumLabel = datumKey.join(' ') || '';\n\n // if (categoryLabel && datumLabel) {\n // return `${categoryLabel} - ${datumLabel}`;\n // }\n return categoryLabel || datumLabel || ' ';\n}\n\n/**\n * Builds axis title from row and column titles\n */\nfunction buildAxisTitle(categoryTitle, datumTitle, defaultTitle = 'Categories') {\n if (categoryTitle && datumTitle) {\n return `${categoryTitle} - ${datumTitle}`;\n }\n return categoryTitle || datumTitle || defaultTitle;\n}\n\n/**\n * Collects aggregation values and labels across all categories\n */\nfunction collectAggregationData(pivotData, categoryKeys, datumKeys, aggregationKey) {\n const values = [];\n const labels = [];\n\n for (const categoryKey of categoryKeys) {\n for (const datumKey of datumKeys) {\n const val = parseFloat(\n pivotData\n .getAggregator(categoryKey, datumKey, aggregationKey)\n .value()\n );\n values.push(isFinite(val) ? val : null);\n labels.push(combineCategoryLabels(categoryKey, datumKey));\n }\n }\n\n return { values, labels };\n}\n\n/**\n * Calculates chart dimensions\n */\nfunction getChartDimensions(rowMultiplier = 1) {\n return {\n width: window.innerWidth / CHART_WIDTH_RATIO,\n height: (window.innerHeight / CHART_HEIGHT_RATIO - CHART_HEIGHT_OFFSET) * rowMultiplier,\n };\n}\n\n/**\n * Creates common renderer props\n */\nfunction createRendererProps() {\n return {\n defaultProps: Object.assign({}, PivotData.defaultProps, {\n plotlyOptions: {},\n plotlyConfig: {},\n }),\n propTypes: Object.assign({}, PivotData.propTypes, {\n plotlyOptions: PropTypes.object,\n plotlyConfig: PropTypes.object,\n onRendererUpdate: PropTypes.func,\n }),\n };\n}\n\n/**\n * Determines chart rendering strategy based on trace options\n */\nfunction getChartRenderingStrategy(traceOptions) {\n if (traceOptions.type === 'pie') {\n return 'pie-totals';\n }\n if (traceOptions.mode && traceOptions.mode.includes('lines')) {\n return 'category-data';\n }\n // Bar, area, scatter charts also need category data\n return 'category-data';\n}\n\n// ============================================================================\n// Renderer Factory Functions\n// ============================================================================\n\nfunction makeRenderer(\n PlotlyComponent,\n traceOptions = {},\n layoutOptions = {},\n transpose = false\n) {\n class Renderer extends React.PureComponent {\n render() {\n const pivotData = new PivotData(this.props);\n const rowKeys = pivotData.getRowKeys();\n const colKeys = pivotData.getColKeys();\n const traceKeys = ensureNonEmptyKeys(transpose ? colKeys : rowKeys);\n const datumKeys = ensureNonEmptyKeys(transpose ? rowKeys : colKeys);\n\n const primaryAggregation = pivotData.getPrimaryAggregation();\n const fallbackAggregator =\n Object.keys(this.props.aggregators)[0] || 'Value';\n const aggregatorName =\n (primaryAggregation && primaryAggregation.aggregatorName) ||\n fallbackAggregator;\n const aggregationVals =\n (primaryAggregation && primaryAggregation.vals) || [];\n const fullAggName =\n (primaryAggregation && primaryAggregation.label) ||\n (aggregationVals.length\n ? `${aggregatorName} of ${aggregationVals.join(', ')}`\n : aggregatorName);\n\n const data = traceKeys.map(traceKey => {\n const values = [];\n const labels = [];\n const textValues = [];\n\n for (const datumKey of datumKeys) {\n const aggregator = pivotData.getAggregator(\n transpose ? datumKey : traceKey,\n transpose ? traceKey : datumKey\n );\n const val = parseFloat(aggregator.value());\n // Get cell formatting from plotlyOptions (similar to tableOptions)\n const cellFormatting = (this.props.plotlyOptions && this.props.plotlyOptions.cellFormatting) || null;\n\n // Apply cell formatting to the formatted value\n const finalFormattedValue = applyCellFormatting(\n aggregator.value(),\n cellFormatting,\n aggregator.format.bind(aggregator),\n aggregatorName\n );\n values.push(isFinite(val) ? val : null);\n labels.push(datumKey.join('-') || ' ');\n textValues.push(finalFormattedValue);\n }\n\n const trace = {\n name: traceKey.join('-') || fullAggName,\n text: textValues,\n };\n\n if (traceOptions.type === 'pie') {\n trace.values = values;\n trace.labels = labels.length > 1 ? labels : [fullAggName];\n trace.hovertemplate = '<b>%{label}</b><br>' + fullAggName + '<br><b>%{value}</b><extra></extra>';\n trace.textinfo = 'value';\n trace.textposition = 'inside';\n } else {\n trace.x = transpose ? values : labels;\n trace.y = transpose ? labels : values;\n trace.hovertemplate = transpose\n ? '<b>%{y}</b><br>' + fullAggName + '<br><b>%{x}</b><extra></extra>'\n : '<b>%{x}</b><br>' + fullAggName + '<br><b>%{y}</b><extra></extra>';\n\n // Configure text display based on chart type\n if (traceOptions.type === 'bar') {\n trace.textposition = traceOptions.orientation === 'h' ? 'middle right' : 'outside';\n trace.textmode = 'text';\n } else if (traceOptions.mode && traceOptions.mode.includes('lines')) {\n trace.textposition = 'top center';\n trace.textmode = 'lines+markers+text'; // Show text on markers for line charts\n } else if (traceOptions.mode === 'markers') {\n trace.textposition = 'middle right';\n trace.textmode = 'text+markers'; // Show text with markers\n } else if (traceOptions.stackgroup) {\n trace.textposition = 'middle center';\n trace.textmode = 'text';\n } else {\n trace.textposition = 'outside';\n trace.textmode = 'text';\n }\n }\n\n return Object.assign(trace, traceOptions);\n });\n\n let titleText = fullAggName;\n const hAxisTitle = transpose\n ? this.props.rows.join('-')\n : this.props.cols.join('-');\n const groupByTitle = transpose\n ? this.props.cols.join('-')\n : this.props.rows.join('-');\n if (hAxisTitle !== '') {\n titleText += ` vs ${hAxisTitle}`;\n }\n if (groupByTitle !== '') {\n titleText += ` by ${groupByTitle}`;\n }\n\n const dimensions = getChartDimensions();\n const layout = {\n title: titleText,\n hovermode: 'closest',\n width: dimensions.width,\n height: dimensions.height,\n };\n\n if (traceOptions.type === 'pie') {\n const columns = Math.ceil(Math.sqrt(data.length));\n const rows = Math.ceil(data.length / columns);\n layout.grid = { columns, rows };\n data.forEach((d, i) => {\n d.domain = {\n row: Math.floor(i / columns),\n column: i - columns * Math.floor(i / columns),\n };\n if (data.length > 1) {\n d.title = d.name;\n }\n });\n if (data[0].labels.length === 1) {\n layout.showlegend = false;\n }\n } else {\n layout.xaxis = {\n title: transpose ? fullAggName : null,\n automargin: true,\n };\n layout.yaxis = {\n title: transpose ? null : fullAggName,\n automargin: true,\n };\n }\n\n return (\n <PlotlyComponent\n data={data}\n layout={Object.assign(\n layout,\n layoutOptions,\n this.props.plotlyOptions\n )}\n config={this.props.plotlyConfig}\n onUpdate={this.props.onRendererUpdate}\n />\n );\n }\n }\n\n const rendererProps = createRendererProps();\n Renderer.defaultProps = rendererProps.defaultProps;\n Renderer.propTypes = rendererProps.propTypes;\n\n return Renderer;\n}\n\n/**\n * Creates a pie chart trace showing category-level breakdown for a single aggregation\n */\nfunction createPieCategoryTrace(\n pivotData,\n aggregation,\n categoryKeys,\n datumKeys,\n subplotIndex,\n traceOptions,\n cellFormatting = null\n) {\n const values = [];\n const labels = [];\n\n for (const categoryKey of categoryKeys) {\n for (const datumKey of datumKeys) {\n const aggregator = pivotData.getAggregator(categoryKey, datumKey, aggregation.key);\n const val = parseFloat(aggregator.value());\n if (isFinite(val) && val !== null) {\n values.push(val);\n labels.push(combineCategoryLabels(categoryKey, datumKey));\n }\n }\n }\n\n const textValues = [];\n for (const categoryKey of categoryKeys) {\n for (const datumKey of datumKeys) {\n const aggregator = pivotData.getAggregator(categoryKey, datumKey, aggregation.key);\n\n const finalFormattedValue = applyCellFormatting(\n aggregator.value(),\n cellFormatting,\n aggregator.format.bind(aggregator),\n aggregation.aggregatorName\n );\n\n textValues.push(finalFormattedValue);\n }\n }\n\n const trace = {\n name: aggregation.label || aggregation.key,\n values: values.length > 0 ? values : [0],\n labels: labels.length > 0 ? labels : ['No Data'],\n text: textValues.length > 0 ? textValues : ['No Data'],\n title: {\n text: aggregation.label || aggregation.key,\n },\n hovertemplate: '<b>%{label}</b><br>' + (aggregation.label || aggregation.key) + '<br><b>%{text}</b><extra></extra>',\n };\n\n const mergedTrace = Object.assign({}, traceOptions, trace);\n mergedTrace.textinfo = 'text';\n mergedTrace.textposition = 'inside';\n\n return mergedTrace;\n}\n\n/**\n * Creates traces for charts showing category-level data\n */\nfunction createCategoryDataTraces(\n pivotData,\n aggregations,\n categoryKeys,\n datumKeys,\n groupIndex,\n traceOptions,\n plotlyOptions\n) {\n const traces = [];\n\n aggregations.forEach((aggregation) => {\n const { values, labels } = collectAggregationData(\n pivotData,\n categoryKeys,\n datumKeys,\n aggregation.key\n );\n\n // Get formatted text values for display\n const textValues = [];\n for (const categoryKey of categoryKeys) {\n for (const datumKey of datumKeys) {\n const aggregator = pivotData.getAggregator(categoryKey, datumKey, aggregation.key);\n const finalFormattedValue = applyCellFormatting(\n aggregator.value(),\n plotlyOptions && plotlyOptions.cellFormatting,\n aggregator.format.bind(aggregator),\n aggregation.aggregatorName\n );\n textValues.push(finalFormattedValue);\n }\n }\n\n const trace = {\n name: aggregation.label || aggregation.key,\n xaxis: `x${groupIndex + 1}`,\n yaxis: `y${groupIndex + 1}`,\n x: labels,\n y: values,\n text: textValues,\n hovertemplate: `<b>%{x}</b><br>${aggregation.label || aggregation.key}<br><b>%{text}</b><extra></extra>`,\n };\n\n if (plotlyOptions && plotlyOptions.displayText) {\n \n if (traceOptions.type === 'bar') {\n trace.textposition = traceOptions.orientation === 'h' ? 'middle right' : 'outside';\n traceOptions.mode = 'text';\n } else if (traceOptions.mode && traceOptions.mode.includes('lines')) {\n trace.textposition = 'top';\n traceOptions.mode = 'lines+markers+text';\n } else if (traceOptions.mode && traceOptions.mode.includes('markers')) {\n trace.textposition = 'top center';\n traceOptions.mode = 'markers+text';\n } else {\n trace.textposition = 'top center';\n traceOptions.mode = 'text';\n }\n }\n \n\n traces.push(Object.assign(trace, traceOptions));\n });\n\n return traces;\n}\n\n/**\n * Creates axis configuration for a subplot group\n */\nfunction createGroupedSubplotAxes(\n groupIndex,\n aggregations,\n rowsTitle,\n colsTitle,\n showXAxisTitle = true\n) {\n const primaryAgg = aggregations[0];\n const aggName = primaryAgg.aggregatorName;\n const xAxisTitle = showXAxisTitle\n ? buildAxisTitle(rowsTitle, colsTitle)\n : null;\n\n return {\n [`xaxis${groupIndex + 1}`]: {\n title: xAxisTitle,\n showticklabels: false,\n automargin: true,\n },\n [`yaxis${groupIndex + 1}`]: {\n title: aggName,\n automargin: true,\n },\n };\n}\n\nfunction makeGroupedRenderer(\n PlotlyComponent,\n traceOptions = {},\n layoutOptions = {}\n) {\n class Renderer extends React.PureComponent {\n render() {\n const pivotData = new PivotData(this.props);\n const renderingStrategy = getChartRenderingStrategy(traceOptions);\n\n // For pie charts, treat each aggregation as a separate subplot\n if (renderingStrategy === 'pie-totals') {\n const allAggregations = pivotData.getAggregations();\n\n if (allAggregations.length === 0) {\n return <div>No aggregations to display</div>;\n }\n\n const rowKeys = pivotData.getRowKeys();\n const colKeys = pivotData.getColKeys();\n const categoryKeys = ensureNonEmptyKeys(rowKeys);\n const datumKeys = ensureNonEmptyKeys(colKeys);\n\n const data = [];\n const columns = Math.ceil(Math.sqrt(allAggregations.length));\n const rows = Math.ceil(allAggregations.length / columns);\n const dimensions = getChartDimensions(rows);\n\n const layout = {\n title: 'Aggregations',\n grid: { rows, columns, pattern: 'independent' },\n width: dimensions.width,\n height: dimensions.height,\n showlegend: true,\n hovermode: 'closest',\n };\n\n // Create a separate subplot for each aggregation\n allAggregations.forEach((aggregation, index) => {\n const trace = createPieCategoryTrace(\n pivotData,\n aggregation,\n categoryKeys,\n datumKeys,\n index,\n traceOptions,\n this.props.plotlyOptions && this.props.plotlyOptions.cellFormatting\n );\n\n trace.domain = {\n row: Math.floor(index / columns),\n column: index % columns,\n };\n\n data.push(trace);\n });\n\n return (\n <PlotlyComponent\n data={data}\n layout={Object.assign(\n layout,\n layoutOptions,\n this.props.plotlyOptions\n )}\n config={this.props.plotlyConfig}\n onUpdate={this.props.onRendererUpdate}\n />\n );\n }\n\n // For non-pie charts, group by aggregation type\n const groupedAggregations = pivotData.groupAggregationsByType();\n const groupNames = Object.keys(groupedAggregations);\n\n if (groupNames.length === 0) {\n return <div>No aggregations to display</div>;\n }\n\n const rows = groupNames.length;\n\n const data = [];\n const dimensions = getChartDimensions(rows);\n const layout = {\n title: 'Grouped Aggregations by Type',\n grid: { rows, columns: 1, pattern: 'independent' },\n width: dimensions.width,\n height: dimensions.height,\n hovermode: 'closest',\n };\n\n const rowKeys = pivotData.getRowKeys();\n const colKeys = pivotData.getColKeys();\n const categoryKeys = ensureNonEmptyKeys(rowKeys);\n const datumKeys = ensureNonEmptyKeys(colKeys);\n\n groupNames.forEach((groupName, groupIndex) => {\n const aggregations = groupedAggregations[groupName];\n\n const traces = createCategoryDataTraces(\n pivotData,\n aggregations,\n categoryKeys,\n datumKeys,\n groupIndex,\n traceOptions,\n this.props.plotlyOptions\n );\n data.push(...traces);\n\n Object.assign(\n layout,\n createGroupedSubplotAxes(\n groupIndex,\n aggregations,\n this.props.rows.join('-'),\n this.props.cols.join('-'),\n false\n )\n );\n });\n\n return (\n <PlotlyComponent\n data={data}\n layout={Object.assign(\n layout,\n layoutOptions,\n this.props.plotlyOptions\n )}\n config={this.props.plotlyConfig}\n onUpdate={this.props.onRendererUpdate}\n />\n );\n }\n }\n\n const rendererProps = createRendererProps();\n Renderer.defaultProps = rendererProps.defaultProps;\n Renderer.propTypes = rendererProps.propTypes;\n\n return Renderer;\n}\n\nfunction makeScatterRenderer(PlotlyComponent) {\n class Renderer extends React.PureComponent {\n render() {\n const pivotData = new PivotData(this.props);\n const rowKeys = ensureNonEmptyKeys(pivotData.getRowKeys());\n const colKeys = ensureNonEmptyKeys(pivotData.getColKeys());\n\n const data = {\n x: [],\n y: [],\n text: [],\n type: 'scatter',\n mode: 'markers+text',\n textposition: 'middle right',\n hovertemplate: '<b>%{x}</b><br>%{y}<br><b>%{text}</b><extra></extra>',\n };\n\n // Use forEach instead of map since we're not returning values\n rowKeys.forEach(rowKey => {\n colKeys.forEach(colKey => {\n const aggregator = pivotData.getAggregator(rowKey, colKey);\n const v = aggregator.value();\n if (v !== null) {\n data.x.push(colKey.join('-'));\n data.y.push(rowKey.join('-'));\n data.text.push(aggregator.format(v));\n }\n });\n });\n\n const dimensions = getChartDimensions();\n const layout = {\n title: `${this.props.rows.join('-')} vs ${this.props.cols.join('-')}`,\n hovermode: 'closest',\n xaxis: { title: this.props.cols.join('-'), automargin: true },\n yaxis: { title: this.props.rows.join('-'), automargin: true },\n width: dimensions.width,\n height: dimensions.height,\n };\n\n return (\n <PlotlyComponent\n data={[data]}\n layout={Object.assign(layout, this.props.plotlyOptions)}\n config={this.props.plotlyConfig}\n onUpdate={this.props.onRendererUpdate}\n />\n );\n }\n }\n\n const rendererProps = createRendererProps();\n Renderer.defaultProps = rendererProps.defaultProps;\n Renderer.propTypes = rendererProps.propTypes;\n\n return Renderer;\n}\n\nexport default function createPlotlyRenderers(PlotlyComponent) {\n return {\n 'Grouped Column Chart': makeRenderer(\n PlotlyComponent,\n { type: 'bar' },\n { barmode: 'group' }\n ),\n 'Stacked Column Chart': makeRenderer(\n PlotlyComponent,\n { type: 'bar' },\n { barmode: 'relative' }\n ),\n 'Grouped Bar Chart': makeRenderer(\n PlotlyComponent,\n { type: 'bar', orientation: 'h' },\n { barmode: 'group' },\n true\n ),\n 'Stacked Bar Chart': makeRenderer(\n PlotlyComponent,\n { type: 'bar', orientation: 'h' },\n { barmode: 'relative' },\n true\n ),\n 'Line Chart': makeRenderer(PlotlyComponent),\n 'Dot Chart': makeRenderer(PlotlyComponent, { mode: 'markers' }, {}, true),\n 'Area Chart': makeRenderer(PlotlyComponent, { stackgroup: 1 }),\n 'Scatter Chart': makeScatterRenderer(PlotlyComponent),\n 'Multiple Pie Chart': makeRenderer(\n PlotlyComponent,\n { type: 'pie', scalegroup: 1, hoverinfo: 'label+value', textinfo: 'none' },\n {},\n true\n ),\n 'Grouped Bars by Type': makeGroupedRenderer(\n PlotlyComponent,\n { type: 'bar', orientation: 'h' },\n { barmode: 'group', }\n ),\n 'Grouped Columns by Type': makeGroupedRenderer(\n PlotlyComponent,\n { type: 'bar' },\n { barmode: 'group' }\n ),\n 'Grouped Lines by Type': makeGroupedRenderer(\n PlotlyComponent,\n { mode: 'lines+markers' }\n ),\n 'Grouped Areas by Type': makeGroupedRenderer(\n PlotlyComponent,\n { stackgroup: 1 }\n ),\n 'Grouped Scatters by Type': makeGroupedRenderer(\n PlotlyComponent,\n { mode: 'markers' }\n ),\n 'Grouped Pies by Type': makeGroupedRenderer(\n PlotlyComponent,\n { type: 'pie' }\n ),\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/PlotlyRenderers.jsx"],"names":["createPlotlyRenderers","CHART_WIDTH_RATIO","CHART_HEIGHT_RATIO","CHART_HEIGHT_OFFSET","ensureNonEmptyKeys","keys","length","combineCategoryLabels","categoryKey","datumKey","categoryLabel","join","datumLabel","buildAxisTitle","categoryTitle","datumTitle","defaultTitle","collectAggregationData","pivotData","categoryKeys","datumKeys","aggregationKey","values","labels","val","parseFloat","getAggregator","value","push","isFinite","getChartDimensions","rowMultiplier","width","window","innerWidth","height","innerHeight","createRendererProps","defaultProps","Object","assign","PivotData","plotlyOptions","plotlyConfig","propTypes","PropTypes","object","onRendererUpdate","func","getChartRenderingStrategy","traceOptions","type","mode","includes","makeRenderer","PlotlyComponent","layoutOptions","transpose","Renderer","props","rowKeys","getRowKeys","colKeys","getColKeys","traceKeys","primaryAggregation","getPrimaryAggregation","fallbackAggregator","aggregators","aggregatorName","aggregationVals","vals","fullAggName","label","data","map","textValues","aggregator","traceKey","cellFormatting","finalFormattedValue","format","bind","trace","name","text","hovertemplate","textinfo","textposition","x","y","orientation","textmode","stackgroup","titleText","hAxisTitle","rows","cols","groupByTitle","dimensions","layout","title","hovermode","columns","Math","ceil","sqrt","grid","forEach","d","i","domain","row","floor","column","showlegend","xaxis","automargin","yaxis","React","PureComponent","rendererProps","createPieCategoryTrace","aggregation","subplotIndex","key","mergedTrace","createCategoryDataTraces","aggregations","groupIndex","traces","displayText","createGroupedSubplotAxes","rowsTitle","colsTitle","showXAxisTitle","primaryAgg","aggName","xAxisTitle","showticklabels","makeGroupedRenderer","renderingStrategy","allAggregations","getAggregations","pattern","index","groupedAggregations","groupAggregationsByType","groupNames","groupName","makeScatterRenderer","rowKey","colKey","v","barmode","scalegroup","hoverinfo"],"mappings":"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","file":"PlotlyRenderers.js","sourcesContent":["/* eslint-disable valid-jsdoc */\n/* eslint-disable no-inline-comments */\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport { PivotData } from './Utilities';\nimport { applyCellFormatting } from './TableRenderers';\n\nconst CHART_WIDTH_RATIO = 1.5; // Ratio to scale down from full window width\nconst CHART_HEIGHT_RATIO = 1.4; // Ratio to scale down from full window height\nconst CHART_HEIGHT_OFFSET = 50; // Fixed offset to subtract from height calculation\n\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Ensures keys array is not empty by adding an empty array if needed\n */\nfunction ensureNonEmptyKeys(keys) {\n return keys.length > 0 ? keys : [[]];\n}\n\n/**\n * Combines category and datum labels into a single display label\n */\nfunction combineCategoryLabels(categoryKey, datumKey) {\n const categoryLabel = categoryKey.join(' ') || '';\n const datumLabel = datumKey.join(' ') || '';\n\n // if (categoryLabel && datumLabel) {\n // return `${categoryLabel} - ${datumLabel}`;\n // }\n return categoryLabel || datumLabel || ' ';\n}\n\n/**\n * Builds axis title from row and column titles\n */\nfunction buildAxisTitle(categoryTitle, datumTitle, defaultTitle = 'Categories') {\n if (categoryTitle && datumTitle) {\n return `${categoryTitle} - ${datumTitle}`;\n }\n return categoryTitle || datumTitle || defaultTitle;\n}\n\n/**\n * Collects aggregation values and labels across all categories\n */\nfunction collectAggregationData(pivotData, categoryKeys, datumKeys, aggregationKey) {\n const values = [];\n const labels = [];\n\n for (const categoryKey of categoryKeys) {\n for (const datumKey of datumKeys) {\n const val = parseFloat(\n pivotData\n .getAggregator(categoryKey, datumKey, aggregationKey)\n .value()\n );\n values.push(isFinite(val) ? val : null);\n labels.push(combineCategoryLabels(categoryKey, datumKey));\n }\n }\n\n return { values, labels };\n}\n\n/**\n * Calculates chart dimensions\n */\nfunction getChartDimensions(rowMultiplier = 1) {\n return {\n width: window.innerWidth / CHART_WIDTH_RATIO,\n height: (window.innerHeight / CHART_HEIGHT_RATIO - CHART_HEIGHT_OFFSET) * rowMultiplier,\n };\n}\n\n/**\n * Creates common renderer props\n */\nfunction createRendererProps() {\n return {\n defaultProps: Object.assign({}, PivotData.defaultProps, {\n plotlyOptions: {},\n plotlyConfig: {},\n }),\n propTypes: Object.assign({}, PivotData.propTypes, {\n plotlyOptions: PropTypes.object,\n plotlyConfig: PropTypes.object,\n onRendererUpdate: PropTypes.func,\n }),\n };\n}\n\n/**\n * Determines chart rendering strategy based on trace options\n */\nfunction getChartRenderingStrategy(traceOptions) {\n if (traceOptions.type === 'pie') {\n return 'pie-totals';\n }\n if (traceOptions.mode && traceOptions.mode.includes('lines')) {\n return 'category-data';\n }\n // Bar, area, scatter charts also need category data\n return 'category-data';\n}\n\n// ============================================================================\n// Renderer Factory Functions\n// ============================================================================\n\nfunction makeRenderer(\n PlotlyComponent,\n traceOptions = {},\n layoutOptions = {},\n transpose = false\n) {\n class Renderer extends React.PureComponent {\n render() {\n const pivotData = new PivotData(this.props);\n const rowKeys = pivotData.getRowKeys();\n const colKeys = pivotData.getColKeys();\n const traceKeys = ensureNonEmptyKeys(transpose ? colKeys : rowKeys);\n const datumKeys = ensureNonEmptyKeys(transpose ? rowKeys : colKeys);\n\n const primaryAggregation = pivotData.getPrimaryAggregation();\n const fallbackAggregator =\n Object.keys(this.props.aggregators)[0] || 'Value';\n const aggregatorName =\n (primaryAggregation && primaryAggregation.aggregatorName) ||\n fallbackAggregator;\n const aggregationVals =\n (primaryAggregation && primaryAggregation.vals) || [];\n const fullAggName =\n (primaryAggregation && primaryAggregation.label) ||\n (aggregationVals.length\n ? `${aggregatorName} of ${aggregationVals.join(', ')}`\n : aggregatorName);\n\n const data = traceKeys.map(traceKey => {\n const values = [];\n const labels = [];\n const textValues = [];\n\n for (const datumKey of datumKeys) {\n const aggregator = pivotData.getAggregator(\n transpose ? datumKey : traceKey,\n transpose ? traceKey : datumKey\n );\n const val = parseFloat(aggregator.value());\n // Get cell formatting from plotlyOptions (similar to tableOptions)\n const cellFormatting = (this.props.plotlyOptions && this.props.plotlyOptions.cellFormatting) || null;\n\n // Apply cell formatting to the formatted value\n const finalFormattedValue = applyCellFormatting(\n aggregator.value(),\n cellFormatting,\n aggregator.format.bind(aggregator),\n aggregatorName\n );\n values.push(isFinite(val) ? val : null);\n labels.push(datumKey.join('-') || ' ');\n textValues.push(finalFormattedValue);\n }\n\n const trace = {\n name: traceKey.join('-') || fullAggName,\n text: textValues,\n };\n\n if (traceOptions.type === 'pie') {\n trace.values = values;\n trace.labels = labels.length > 1 ? labels : [fullAggName];\n trace.hovertemplate = '<b>%{label}</b><br>' + fullAggName + '<br><b>%{value}</b><extra></extra>';\n trace.textinfo = 'value';\n trace.textposition = 'inside';\n } else {\n trace.x = transpose ? values : labels;\n trace.y = transpose ? labels : values;\n trace.hovertemplate = transpose\n ? '<b>%{y}</b><br>' + fullAggName + '<br><b>%{x}</b><extra></extra>'\n : '<b>%{x}</b><br>' + fullAggName + '<br><b>%{y}</b><extra></extra>';\n\n // Configure text display based on chart type\n if (traceOptions.type === 'bar') {\n trace.textposition = traceOptions.orientation === 'h' ? 'middle right' : 'outside';\n trace.textmode = 'text';\n } else if (traceOptions.mode && traceOptions.mode.includes('lines')) {\n trace.textposition = 'top center';\n trace.textmode = 'lines+markers+text'; // Show text on markers for line charts\n } else if (traceOptions.mode === 'markers') {\n trace.textposition = 'middle right';\n trace.textmode = 'text+markers'; // Show text with markers\n } else if (traceOptions.stackgroup) {\n trace.textposition = 'middle center';\n trace.textmode = 'text';\n } else {\n trace.textposition = 'outside';\n trace.textmode = 'text';\n }\n }\n\n return Object.assign(trace, traceOptions);\n });\n\n let titleText = fullAggName;\n const hAxisTitle = transpose\n ? this.props.rows.join('-')\n : this.props.cols.join('-');\n const groupByTitle = transpose\n ? this.props.cols.join('-')\n : this.props.rows.join('-');\n if (hAxisTitle !== '') {\n titleText += ` vs ${hAxisTitle}`;\n }\n if (groupByTitle !== '') {\n titleText += ` by ${groupByTitle}`;\n }\n\n const dimensions = getChartDimensions();\n const layout = {\n title: titleText,\n hovermode: 'closest',\n width: dimensions.width,\n height: dimensions.height,\n };\n\n if (traceOptions.type === 'pie') {\n const columns = Math.ceil(Math.sqrt(data.length));\n const rows = Math.ceil(data.length / columns);\n layout.grid = { columns, rows };\n data.forEach((d, i) => {\n d.domain = {\n row: Math.floor(i / columns),\n column: i - columns * Math.floor(i / columns),\n };\n if (data.length > 1) {\n d.title = d.name;\n }\n });\n if (data[0].labels.length === 1) {\n layout.showlegend = false;\n }\n } else {\n layout.xaxis = {\n title: transpose ? fullAggName : null,\n automargin: true,\n };\n layout.yaxis = {\n title: transpose ? null : fullAggName,\n automargin: true,\n };\n }\n\n return (\n <PlotlyComponent\n data={data}\n layout={Object.assign(\n layout,\n layoutOptions,\n this.props.plotlyOptions\n )}\n config={this.props.plotlyConfig}\n onUpdate={this.props.onRendererUpdate}\n />\n );\n }\n }\n\n const rendererProps = createRendererProps();\n Renderer.defaultProps = rendererProps.defaultProps;\n Renderer.propTypes = rendererProps.propTypes;\n\n return Renderer;\n}\n\n/**\n * Creates a pie chart trace showing category-level breakdown for a single aggregation\n */\nfunction createPieCategoryTrace(\n pivotData,\n aggregation,\n categoryKeys,\n datumKeys,\n subplotIndex,\n traceOptions,\n cellFormatting = null\n) {\n const values = [];\n const labels = [];\n\n for (const categoryKey of categoryKeys) {\n for (const datumKey of datumKeys) {\n const aggregator = pivotData.getAggregator(categoryKey, datumKey, aggregation.key);\n const val = parseFloat(aggregator.value());\n if (isFinite(val) && val !== null) {\n values.push(val);\n labels.push(combineCategoryLabels(categoryKey, datumKey));\n }\n }\n }\n\n const textValues = [];\n for (const categoryKey of categoryKeys) {\n for (const datumKey of datumKeys) {\n const aggregator = pivotData.getAggregator(categoryKey, datumKey, aggregation.key);\n\n const finalFormattedValue = applyCellFormatting(\n aggregator.value(),\n cellFormatting,\n aggregator.format.bind(aggregator),\n aggregation.aggregatorName\n );\n\n textValues.push(finalFormattedValue);\n }\n }\n\n const trace = {\n name: aggregation.label || aggregation.key,\n values: values.length > 0 ? values : [0],\n labels: labels.length > 0 ? labels : ['No Data'],\n text: textValues.length > 0 ? textValues : ['No Data'],\n title: {\n text: aggregation.label || aggregation.key,\n },\n hovertemplate: '<b>%{label}</b><br>' + (aggregation.label || aggregation.key) + '<br><b>%{text}</b><extra></extra>',\n };\n\n const mergedTrace = Object.assign({}, traceOptions, trace);\n mergedTrace.textinfo = 'text';\n mergedTrace.textposition = 'inside';\n\n return mergedTrace;\n}\n\n/**\n * Creates traces for charts showing category-level data\n */\nfunction createCategoryDataTraces(\n pivotData,\n aggregations,\n categoryKeys,\n datumKeys,\n groupIndex,\n traceOptions,\n plotlyOptions\n) {\n const traces = [];\n\n aggregations.forEach((aggregation) => {\n const { values, labels } = collectAggregationData(\n pivotData,\n categoryKeys,\n datumKeys,\n aggregation.key\n );\n\n // Get formatted text values for display\n const textValues = [];\n for (const categoryKey of categoryKeys) {\n for (const datumKey of datumKeys) {\n const aggregator = pivotData.getAggregator(categoryKey, datumKey, aggregation.key);\n const finalFormattedValue = applyCellFormatting(\n aggregator.value(),\n plotlyOptions && plotlyOptions.cellFormatting,\n aggregator.format.bind(aggregator),\n aggregation.aggregatorName\n );\n textValues.push(finalFormattedValue);\n }\n }\n\n const trace = {\n name: aggregation.label || aggregation.key,\n xaxis: `x${groupIndex + 1}`,\n yaxis: `y${groupIndex + 1}`,\n x: labels,\n y: values,\n text: textValues,\n hovertemplate: `<b>%{x}</b><br>${aggregation.label || aggregation.key}<br><b>%{text}</b><extra></extra>`,\n };\n\n if (plotlyOptions && plotlyOptions.displayText) {\n \n if (traceOptions.type === 'bar') {\n trace.textposition = traceOptions.orientation === 'h' ? 'middle right' : 'outside';\n traceOptions.mode = 'text';\n } else if (traceOptions.mode && traceOptions.mode.includes('lines')) {\n trace.textposition = 'top';\n traceOptions.mode = 'lines+markers+text';\n } else if (traceOptions.mode && traceOptions.mode.includes('markers')) {\n trace.textposition = 'top center';\n traceOptions.mode = 'markers+text';\n } else {\n trace.textposition = 'top center';\n traceOptions.mode = 'text';\n }\n }\n \n\n traces.push(Object.assign(trace, traceOptions));\n });\n\n return traces;\n}\n\n/**\n * Creates axis configuration for a subplot group\n */\nfunction createGroupedSubplotAxes(\n groupIndex,\n aggregations,\n rowsTitle,\n colsTitle,\n showXAxisTitle = true\n) {\n const primaryAgg = aggregations[0];\n const aggName = primaryAgg.aggregatorName;\n const xAxisTitle = showXAxisTitle\n ? buildAxisTitle(rowsTitle, colsTitle)\n : null;\n\n return {\n [`xaxis${groupIndex + 1}`]: {\n title: xAxisTitle,\n showticklabels: false,\n automargin: true,\n },\n [`yaxis${groupIndex + 1}`]: {\n title: aggName,\n automargin: true,\n },\n };\n}\n\nfunction makeGroupedRenderer(\n PlotlyComponent,\n traceOptions = {},\n layoutOptions = {}\n) {\n class Renderer extends React.PureComponent {\n render() {\n const pivotData = new PivotData(this.props);\n const renderingStrategy = getChartRenderingStrategy(traceOptions);\n\n // For pie charts, treat each aggregation as a separate subplot\n if (renderingStrategy === 'pie-totals') {\n const allAggregations = pivotData.getAggregations();\n\n if (allAggregations.length === 0) {\n return <div>No aggregations to display</div>;\n }\n\n const rowKeys = pivotData.getRowKeys();\n const colKeys = pivotData.getColKeys();\n const categoryKeys = ensureNonEmptyKeys(rowKeys);\n const datumKeys = ensureNonEmptyKeys(colKeys);\n\n const data = [];\n const columns = Math.ceil(Math.sqrt(allAggregations.length));\n const rows = Math.ceil(allAggregations.length / columns);\n const dimensions = getChartDimensions(rows);\n\n const layout = {\n title: 'Aggregations',\n grid: { rows, columns, pattern: 'independent' },\n width: dimensions.width,\n height: dimensions.height,\n showlegend: true,\n hovermode: 'closest',\n };\n\n // Create a separate subplot for each aggregation\n allAggregations.forEach((aggregation, index) => {\n const trace = createPieCategoryTrace(\n pivotData,\n aggregation,\n categoryKeys,\n datumKeys,\n index,\n traceOptions,\n this.props.plotlyOptions && this.props.plotlyOptions.cellFormatting\n );\n\n trace.domain = {\n row: Math.floor(index / columns),\n column: index % columns,\n };\n\n data.push(trace);\n });\n\n return (\n <PlotlyComponent\n data={data}\n layout={Object.assign(\n layout,\n layoutOptions,\n this.props.plotlyOptions\n )}\n config={this.props.plotlyConfig}\n onUpdate={this.props.onRendererUpdate}\n />\n );\n }\n\n // For non-pie charts, group by aggregation type\n const groupedAggregations = pivotData.groupAggregationsByType();\n const groupNames = Object.keys(groupedAggregations);\n\n if (groupNames.length === 0) {\n return <div>No aggregations to display</div>;\n }\n\n const rows = groupNames.length;\n\n const data = [];\n const dimensions = getChartDimensions(rows);\n const layout = {\n title: 'Grouped Aggregations by Type',\n grid: { rows, columns: 1, pattern: 'independent' },\n width: dimensions.width,\n height: dimensions.height,\n hovermode: 'closest',\n };\n\n const rowKeys = pivotData.getRowKeys();\n const colKeys = pivotData.getColKeys();\n const categoryKeys = ensureNonEmptyKeys(rowKeys);\n const datumKeys = ensureNonEmptyKeys(colKeys);\n\n groupNames.forEach((groupName, groupIndex) => {\n const aggregations = groupedAggregations[groupName];\n\n const traces = createCategoryDataTraces(\n pivotData,\n aggregations,\n categoryKeys,\n datumKeys,\n groupIndex,\n traceOptions,\n this.props.plotlyOptions\n );\n data.push(...traces);\n\n Object.assign(\n layout,\n createGroupedSubplotAxes(\n groupIndex,\n aggregations,\n this.props.rows.join('-'),\n this.props.cols.join('-'),\n false\n )\n );\n });\n\n return (\n <PlotlyComponent\n data={data}\n layout={Object.assign(\n layout,\n layoutOptions,\n this.props.plotlyOptions\n )}\n config={this.props.plotlyConfig}\n onUpdate={this.props.onRendererUpdate}\n />\n );\n }\n }\n\n const rendererProps = createRendererProps();\n Renderer.defaultProps = rendererProps.defaultProps;\n Renderer.propTypes = rendererProps.propTypes;\n\n return Renderer;\n}\n\nfunction makeScatterRenderer(PlotlyComponent) {\n class Renderer extends React.PureComponent {\n render() {\n const pivotData = new PivotData(this.props);\n const rowKeys = ensureNonEmptyKeys(pivotData.getRowKeys());\n const colKeys = ensureNonEmptyKeys(pivotData.getColKeys());\n\n const data = {\n x: [],\n y: [],\n text: [],\n type: 'scatter',\n mode: 'markers+text',\n textposition: 'middle right',\n hovertemplate: '<b>%{x}</b><br>%{y}<br><b>%{text}</b><extra></extra>',\n };\n\n // Use forEach instead of map since we're not returning values\n rowKeys.forEach(rowKey => {\n colKeys.forEach(colKey => {\n const aggregator = pivotData.getAggregator(rowKey, colKey);\n const v = aggregator.value();\n if (v !== null) {\n data.x.push(colKey.join('-'));\n data.y.push(rowKey.join('-'));\n data.text.push(aggregator.format(v));\n }\n });\n });\n\n const dimensions = getChartDimensions();\n const layout = {\n title: `${this.props.rows.join('-')} vs ${this.props.cols.join('-')}`,\n hovermode: 'closest',\n xaxis: { title: this.props.cols.join('-'), automargin: true },\n yaxis: { title: this.props.rows.join('-'), automargin: true },\n width: dimensions.width,\n height: dimensions.height,\n };\n\n return (\n <PlotlyComponent\n data={[data]}\n layout={Object.assign(layout, this.props.plotlyOptions)}\n config={this.props.plotlyConfig}\n onUpdate={this.props.onRendererUpdate}\n />\n );\n }\n }\n\n const rendererProps = createRendererProps();\n Renderer.defaultProps = rendererProps.defaultProps;\n Renderer.propTypes = rendererProps.propTypes;\n\n return Renderer;\n}\n\nexport default function createPlotlyRenderers(PlotlyComponent) {\n return {\n 'Grouped Column Chart': makeRenderer(\n PlotlyComponent,\n { type: 'bar' },\n { barmode: 'group' }\n ),\n 'Stacked Column Chart': makeRenderer(\n PlotlyComponent,\n { type: 'bar' },\n { barmode: 'relative' }\n ),\n 'Grouped Bar Chart': makeRenderer(\n PlotlyComponent,\n { type: 'bar', orientation: 'h' },\n { barmode: 'group' },\n true\n ),\n 'Stacked Bar Chart': makeRenderer(\n PlotlyComponent,\n { type: 'bar', orientation: 'h' },\n { barmode: 'relative' },\n true\n ),\n 'Line Chart': makeRenderer(PlotlyComponent),\n 'Dot Chart': makeRenderer(PlotlyComponent, { mode: 'markers' }, {}, true),\n 'Area Chart': makeRenderer(PlotlyComponent, { stackgroup: 1 }),\n 'Scatter Chart': makeScatterRenderer(PlotlyComponent),\n 'Multiple Pie Chart': makeRenderer(\n PlotlyComponent,\n { type: 'pie', scalegroup: 1, hoverinfo: 'label+value', textinfo: 'none' },\n {},\n true\n ),\n 'Grouped Bars by Type': makeGroupedRenderer(\n PlotlyComponent,\n { type: 'bar', orientation: 'h' },\n { barmode: 'group', }\n ),\n 'Grouped Columns by Type': makeGroupedRenderer(\n PlotlyComponent,\n { type: 'bar' },\n { barmode: 'group' }\n ),\n 'Grouped Lines by Type': makeGroupedRenderer(\n PlotlyComponent,\n { mode: 'lines+markers' }\n ),\n 'Grouped Areas by Type': makeGroupedRenderer(\n PlotlyComponent,\n { stackgroup: 1 }\n ),\n 'Grouped Scatters by Type': makeGroupedRenderer(\n PlotlyComponent,\n { mode: 'markers' }\n ),\n 'Grouped Pies by Type': makeGroupedRenderer(\n PlotlyComponent,\n { type: 'pie' }\n ),\n };\n}\n"]}
package/dist/Utilities.js CHANGED
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.PivotData = exports.createSorterByType = exports.detectDataType = exports.builtInSorters = exports.sortAs = exports.getSort = exports.numberFormat = exports.naturalSort = exports.locales = exports.derivers = exports.aggregators = exports.aggregatorTemplates = undefined;
6
+ exports.PivotData = exports.sortersHaveFunctions = exports.createSorterByType = exports.detectDataType = exports.builtInSorters = exports.sortAs = exports.getSort = exports.numberFormat = exports.naturalSort = exports.locales = exports.derivers = exports.aggregators = exports.aggregatorTemplates = undefined;
7
7
 
8
8
  var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
9
9
 
@@ -391,6 +391,25 @@ var usFmtPct = numberFormat({
391
391
  suffix: '%'
392
392
  });
393
393
 
394
+ // Emit a progress callback every N processed records without adding
395
+ // measurable overhead to the per-record loop.
396
+ var RECORD_PROGRESS_BATCH_SIZE = 25000;
397
+
398
+ // Returns true when the sorters prop itself, or any of its entries, is a
399
+ // function. Function-based sorters cannot be transferred to a Web Worker, so
400
+ // PivotData re-applies them on the main thread after worker hydration.
401
+ var sortersHaveFunctions = function sortersHaveFunctions(sorters) {
402
+ if (typeof sorters === 'function') {
403
+ return true;
404
+ }
405
+ if (!sorters || (typeof sorters === 'undefined' ? 'undefined' : _typeof(sorters)) !== 'object') {
406
+ return false;
407
+ }
408
+ return Object.keys(sorters).some(function (attr) {
409
+ return typeof sorters[attr] === 'function';
410
+ });
411
+ };
412
+
394
413
  var aggregatorTemplates = {
395
414
  count: function count() {
396
415
  var formatter = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : usFmtInt;
@@ -855,15 +874,103 @@ var PivotData = function () {
855
874
  this.allTotal = this.createAggregatorCell([], []);
856
875
  this.sorted = false;
857
876
 
858
- // iterate through input, accumulating data for cells
859
- PivotData.forEachRecord(this.props.data, this.props.derivedAttributes, function (record) {
877
+ if (this.props.precomputedData) {
878
+ // Results computed by the Web Worker (or any previous pass) are
879
+ // hydrated instead of re-scanning every record on the main thread.
880
+ this.hydrateFromPrecomputed(this.props.precomputedData);
881
+ return;
882
+ }
883
+
884
+ var progressHook = this.props.onRecordProcessed;
885
+ var recordHandler = function recordHandler(record) {
860
886
  if (_this2.filter(record)) {
861
887
  _this2.processRecord(record);
862
888
  }
863
- });
889
+ };
890
+ if (typeof progressHook === 'function') {
891
+ var recordsProcessed = 0;
892
+ PivotData.forEachRecord(this.props.data, this.props.derivedAttributes, function (record) {
893
+ recordHandler(record);
894
+ recordsProcessed++;
895
+ if (recordsProcessed % RECORD_PROGRESS_BATCH_SIZE === 0) {
896
+ progressHook(recordsProcessed);
897
+ }
898
+ });
899
+ } else {
900
+ PivotData.forEachRecord(this.props.data, this.props.derivedAttributes, recordHandler);
901
+ }
864
902
  }
865
903
 
904
+ /*
905
+ * Rebuilds tree/totals from a serialized PivotData payload (as produced by
906
+ * `serializePivotData` inside the worker). Aggregated values are final, so
907
+ * only lightweight stub aggregators with the correct `value()` and
908
+ * `format()` behavior are created per cell.
909
+ */
910
+
911
+
866
912
  _createClass(PivotData, [{
913
+ key: 'hydrateFromPrecomputed',
914
+ value: function hydrateFromPrecomputed(precomputed) {
915
+ var _this3 = this;
916
+
917
+ // One real aggregator instance per aggregation provides `format()` and
918
+ // `numInputs` for every hydrated stub cell.
919
+ var formatSources = {};
920
+ this.aggregations.forEach(function (agg) {
921
+ formatSources[agg.key] = _this3.aggregatorFactories[agg.key](_this3, [], []);
922
+ });
923
+
924
+ var makeCell = function makeCell(serializedCell) {
925
+ var values = serializedCell && serializedCell.values || {};
926
+ var instances = {};
927
+ _this3.aggregations.forEach(function (agg) {
928
+ var source = formatSources[agg.key];
929
+ var _value = values[agg.key];
930
+ instances[agg.key] = {
931
+ push: function push() {},
932
+ value: function value() {
933
+ return _value;
934
+ },
935
+ format: function format(x) {
936
+ return source.format(x);
937
+ },
938
+
939
+ numInputs: source.numInputs,
940
+ outlet: source.outlet
941
+ };
942
+ });
943
+ return new AggregatorCell(instances, _this3.primaryAggregation.key);
944
+ };
945
+
946
+ var hydrateTotals = function hydrateTotals(source, target) {
947
+ Object.keys(source || {}).forEach(function (flatKey) {
948
+ target[flatKey] = makeCell(source[flatKey]);
949
+ });
950
+ };
951
+
952
+ this.rowKeys = (precomputed.rowKeys || []).map(function (key) {
953
+ return key.slice();
954
+ });
955
+ this.colKeys = (precomputed.colKeys || []).map(function (key) {
956
+ return key.slice();
957
+ });
958
+ this.rowTotals = {};
959
+ hydrateTotals(precomputed.rowTotals, this.rowTotals);
960
+ this.colTotals = {};
961
+ hydrateTotals(precomputed.colTotals, this.colTotals);
962
+ this.tree = {};
963
+ Object.keys(precomputed.tree || {}).forEach(function (flatRowKey) {
964
+ _this3.tree[flatRowKey] = {};
965
+ hydrateTotals(precomputed.tree[flatRowKey], _this3.tree[flatRowKey]);
966
+ });
967
+ this.allTotal = makeCell(precomputed.allTotal);
968
+
969
+ // Keys were already sorted inside the worker; only re-sort on the main
970
+ // thread when a sorter could not cross the worker boundary (functions).
971
+ this.sorted = !sortersHaveFunctions(this.props.sorters);
972
+ }
973
+ }, {
867
974
  key: 'filter',
868
975
  value: function filter(record) {
869
976
  for (var k in this.props.valueFilter) {
@@ -876,10 +983,10 @@ var PivotData = function () {
876
983
  }, {
877
984
  key: 'forEachMatchingRecord',
878
985
  value: function forEachMatchingRecord(criteria, callback) {
879
- var _this3 = this;
986
+ var _this4 = this;
880
987
 
881
988
  return PivotData.forEachRecord(this.props.data, this.props.derivedAttributes, function (record) {
882
- if (!_this3.filter(record)) {
989
+ if (!_this4.filter(record)) {
883
990
  return;
884
991
  }
885
992
  for (var k in criteria) {
@@ -894,7 +1001,7 @@ var PivotData = function () {
894
1001
  }, {
895
1002
  key: 'arrSort',
896
1003
  value: function arrSort(attrs) {
897
- var _this4 = this;
1004
+ var _this5 = this;
898
1005
 
899
1006
  var a = void 0;
900
1007
  var sortersArr = function () {
@@ -907,7 +1014,7 @@ var PivotData = function () {
907
1014
  for (var _iterator2 = Array.from(attrs)[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
908
1015
  a = _step2.value;
909
1016
 
910
- result.push(getSort(_this4.props.sorters, a));
1017
+ result.push(getSort(_this5.props.sorters, a));
911
1018
  }
912
1019
  } catch (err) {
913
1020
  _didIteratorError2 = true;
@@ -962,12 +1069,12 @@ var PivotData = function () {
962
1069
  }, {
963
1070
  key: 'sortKeys',
964
1071
  value: function sortKeys() {
965
- var _this5 = this;
1072
+ var _this6 = this;
966
1073
 
967
1074
  if (!this.sorted) {
968
1075
  this.sorted = true;
969
1076
  var v = function v(r, c) {
970
- return _this5.getAggregator(r, c).value();
1077
+ return _this6.getAggregator(r, c).value();
971
1078
  };
972
1079
 
973
1080
  // Handle per-row sorting
@@ -975,11 +1082,11 @@ var PivotData = function () {
975
1082
  var rowSorts = this.props.rowSorts;
976
1083
  this.rowKeys.sort(function (a, b) {
977
1084
  // First, check if any sorted attribute has a difference
978
- for (var i = 0; i < _this5.props.rows.length; i++) {
979
- var attr = _this5.props.rows[i];
1085
+ for (var i = 0; i < _this6.props.rows.length; i++) {
1086
+ var attr = _this6.props.rows[i];
980
1087
  if (attr && rowSorts[attr]) {
981
1088
  var sortDir = rowSorts[attr] === 'ASC' ? 1 : -1;
982
- var sorter = getSort(_this5.props.sorters, attr);
1089
+ var sorter = getSort(_this6.props.sorters, attr);
983
1090
  var comparison = sorter(a[i] || '', b[i] || '');
984
1091
  if (comparison !== 0) {
985
1092
  return sortDir * comparison;
@@ -987,7 +1094,7 @@ var PivotData = function () {
987
1094
  }
988
1095
  }
989
1096
  // If sorted attributes are equal, use default sorting for remaining attributes
990
- return _this5.arrSort(_this5.props.rows)(a, b);
1097
+ return _this6.arrSort(_this6.props.rows)(a, b);
991
1098
  });
992
1099
  } else {
993
1100
  // Use global row order
@@ -1012,11 +1119,11 @@ var PivotData = function () {
1012
1119
  var colSorts = this.props.colSorts;
1013
1120
  this.colKeys.sort(function (a, b) {
1014
1121
  // First, check if any sorted attribute has a difference
1015
- for (var i = 0; i < _this5.props.cols.length; i++) {
1016
- var attr = _this5.props.cols[i];
1122
+ for (var i = 0; i < _this6.props.cols.length; i++) {
1123
+ var attr = _this6.props.cols[i];
1017
1124
  if (attr && colSorts[attr]) {
1018
1125
  var sortDir = colSorts[attr] === 'ASC' ? 1 : -1;
1019
- var sorter = getSort(_this5.props.sorters, attr);
1126
+ var sorter = getSort(_this6.props.sorters, attr);
1020
1127
  var comparison = sorter(a[i] || '', b[i] || '');
1021
1128
  if (comparison !== 0) {
1022
1129
  return sortDir * comparison;
@@ -1024,7 +1131,7 @@ var PivotData = function () {
1024
1131
  }
1025
1132
  }
1026
1133
  // If sorted attributes are equal, use default sorting for remaining attributes
1027
- return _this5.arrSort(_this5.props.cols)(a, b);
1134
+ return _this6.arrSort(_this6.props.cols)(a, b);
1028
1135
  });
1029
1136
  } else {
1030
1137
  // Use global col order
@@ -1268,25 +1375,25 @@ var PivotData = function () {
1268
1375
  }, {
1269
1376
  key: 'buildAggregatorFactories',
1270
1377
  value: function buildAggregatorFactories() {
1271
- var _this6 = this;
1378
+ var _this7 = this;
1272
1379
 
1273
1380
  var factories = {};
1274
1381
  this.aggregations.forEach(function (agg) {
1275
- if (!(agg.aggregatorName in _this6.props.aggregators)) {
1382
+ if (!(agg.aggregatorName in _this7.props.aggregators)) {
1276
1383
  throw new Error('unknown aggregator ' + agg.aggregatorName);
1277
1384
  }
1278
- factories[agg.key] = _this6.props.aggregators[agg.aggregatorName](agg.vals);
1385
+ factories[agg.key] = _this7.props.aggregators[agg.aggregatorName](agg.vals);
1279
1386
  });
1280
1387
  return factories;
1281
1388
  }
1282
1389
  }, {
1283
1390
  key: 'createAggregatorCell',
1284
1391
  value: function createAggregatorCell(rowKey, colKey) {
1285
- var _this7 = this;
1392
+ var _this8 = this;
1286
1393
 
1287
1394
  var instances = {};
1288
1395
  this.aggregations.forEach(function (agg) {
1289
- instances[agg.key] = _this7.aggregatorFactories[agg.key](_this7, rowKey, colKey);
1396
+ instances[agg.key] = _this8.aggregatorFactories[agg.key](_this8, rowKey, colKey);
1290
1397
  });
1291
1398
  return new AggregatorCell(instances, this.primaryAggregation.key);
1292
1399
  }
@@ -1453,8 +1560,10 @@ PivotData.propTypes = {
1453
1560
  rows: _propTypes2.default.arrayOf(_propTypes2.default.string),
1454
1561
  vals: _propTypes2.default.arrayOf(_propTypes2.default.string),
1455
1562
  valueFilter: _propTypes2.default.objectOf(_propTypes2.default.objectOf(_propTypes2.default.bool)),
1456
- sorters: _propTypes2.default.oneOfType([_propTypes2.default.func, _propTypes2.default.objectOf(_propTypes2.default.func)]),
1563
+ sorters: _propTypes2.default.oneOfType([_propTypes2.default.func, _propTypes2.default.objectOf(_propTypes2.default.oneOfType([_propTypes2.default.func, _propTypes2.default.string, _propTypes2.default.array]))]),
1457
1564
  derivedAttributes: _propTypes2.default.objectOf(_propTypes2.default.func),
1565
+ precomputedData: _propTypes2.default.object,
1566
+ onRecordProcessed: _propTypes2.default.func,
1458
1567
  rowOrder: _propTypes2.default.oneOf(['key_a_to_z', 'value_a_to_z', 'value_z_to_a']),
1459
1568
  colOrder: _propTypes2.default.oneOf(['key_a_to_z', 'value_a_to_z', 'value_z_to_a']),
1460
1569
  rowSorts: _propTypes2.default.objectOf(_propTypes2.default.oneOf(['ASC', 'DESC'])),
@@ -1472,5 +1581,6 @@ exports.sortAs = sortAs;
1472
1581
  exports.builtInSorters = builtInSorters;
1473
1582
  exports.detectDataType = detectDataType;
1474
1583
  exports.createSorterByType = createSorterByType;
1584
+ exports.sortersHaveFunctions = sortersHaveFunctions;
1475
1585
  exports.PivotData = PivotData;
1476
1586
  //# sourceMappingURL=Utilities.js.map