function DataTableModalFactory()

in src/components/modals/data-table-modal.js [89:193]


function DataTableModalFactory(DataTable) {
  class DataTableModal extends React.Component {
    datasetCellSizeCache = {};
    dataId = props => props.dataId;
    datasets = props => props.datasets;
    fields = props => (props.datasets[props.dataId] || {}).fields;
    columns = createSelector(this.fields, fields => fields.map(f => f.name));
    colMeta = createSelector(this.fields, fields =>
      fields.reduce(
        (acc, {name, type}) => ({
          ...acc,
          [name]: type
        }),
        {}
      )
    );
    cellSizeCache = createSelector(this.dataId, this.datasets, (dataId, datasets) => {
      if (!this.props.datasets[dataId]) {
        return {};
      }
      const {fields, allData} = this.props.datasets[dataId];

      let showCalculate = null;
      if (!this.datasetCellSizeCache[dataId]) {
        showCalculate = true;
      } else if (
        this.datasetCellSizeCache[dataId].fields !== fields ||
        this.datasetCellSizeCache[dataId].allData !== allData
      ) {
        showCalculate = true;
      }

      if (!showCalculate) {
        return this.datasetCellSizeCache[dataId].cellSizeCache;
      }

      const cellSizeCache = fields.reduce(
        (acc, field, colIdx) => ({
          ...acc,
          [field.name]: renderedSize({
            text: {
              rows: allData,
              column: field.name
            },
            colIdx,
            type: field.type,
            fontSize: this.props.theme.cellFontSize,
            font: this.props.theme.fontFamily
          })
        }),
        {}
      );
      // save it to cache
      this.datasetCellSizeCache[dataId] = {
        cellSizeCache,
        fields,
        allData
      };
      return cellSizeCache;
    });

    render() {
      const {datasets, dataId, showDatasetTable} = this.props;
      if (!datasets || !dataId) {
        return null;
      }

      const activeDataset = datasets[dataId];
      const columns = this.columns(this.props);
      const colMeta = this.colMeta(this.props);
      const cellSizeCache = this.cellSizeCache(this.props);

      return (
        <StyledModal className="dataset-modal" id="dataset-modal">
          <CanvasHack />
          <TableContainer>
            <DatasetTabs
              activeDataset={activeDataset}
              datasets={datasets}
              showDatasetTable={showDatasetTable}
            />
            {datasets[dataId] ? (
              <DataTable
                key={dataId}
                dataId={dataId}
                columns={columns}
                colMeta={colMeta}
                cellSizeCache={cellSizeCache}
                rows={activeDataset.allData}
                pinnedColumns={activeDataset.pinnedColumns}
                sortOrder={activeDataset.sortOrder}
                sortColumn={activeDataset.sortColumn}
                copyTableColumn={this.props.copyTableColumn}
                pinTableColumn={this.props.pinTableColumn}
                sortTableColumn={this.props.sortTableColumn}
              />
            ) : null}
          </TableContainer>
        </StyledModal>
      );
    }
  }

  return withTheme(DataTableModal);
}