@hrforte/react-pivottable 1.1.0 → 2.1.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.
- package/README.md +134 -0
- package/dist/PivotDataWorker.js +264 -0
- package/dist/PivotDataWorker.js.map +1 -0
- package/dist/PivotTableUI.js +1742 -1612
- package/dist/PivotTableUI.js.map +1 -1
- package/dist/PlotlyRenderers.js +3 -1
- package/dist/PlotlyRenderers.js.map +1 -1
- package/dist/Utilities.js +134 -24
- package/dist/Utilities.js.map +1 -1
- package/dist/__tests__/PivotDataWorker-test.js +170 -0
- package/dist/__tests__/PivotDataWorker-test.js.map +1 -0
- package/dist/__tests__/PivotTableUI-processing-test.js +114 -0
- package/dist/__tests__/PivotTableUI-processing-test.js.map +1 -0
- package/dist/__tests__/pivotCompute-test.js +215 -0
- package/dist/__tests__/pivotCompute-test.js.map +1 -0
- package/dist/pivot-worker.js +3397 -0
- package/dist/pivotCompute.js +274 -0
- package/dist/pivotCompute.js.map +1 -0
- package/dist/pivotWorker.js +101 -0
- package/dist/pivotWorker.js.map +1 -0
- package/dist/pivottable.css +74 -0
- package/package.json +4 -3
|
@@ -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
|
-
|
|
859
|
-
|
|
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
|
|
986
|
+
var _this4 = this;
|
|
880
987
|
|
|
881
988
|
return PivotData.forEachRecord(this.props.data, this.props.derivedAttributes, function (record) {
|
|
882
|
-
if (!
|
|
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
|
|
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(
|
|
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
|
|
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
|
|
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 <
|
|
979
|
-
var attr =
|
|
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(
|
|
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
|
|
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 <
|
|
1016
|
-
var attr =
|
|
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(
|
|
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
|
|
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
|
|
1378
|
+
var _this7 = this;
|
|
1272
1379
|
|
|
1273
1380
|
var factories = {};
|
|
1274
1381
|
this.aggregations.forEach(function (agg) {
|
|
1275
|
-
if (!(agg.aggregatorName in
|
|
1382
|
+
if (!(agg.aggregatorName in _this7.props.aggregators)) {
|
|
1276
1383
|
throw new Error('unknown aggregator ' + agg.aggregatorName);
|
|
1277
1384
|
}
|
|
1278
|
-
factories[agg.key] =
|
|
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
|
|
1392
|
+
var _this8 = this;
|
|
1286
1393
|
|
|
1287
1394
|
var instances = {};
|
|
1288
1395
|
this.aggregations.forEach(function (agg) {
|
|
1289
|
-
instances[agg.key] =
|
|
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
|