Source

Frameworks/AsyncTableTools/hooks/useTableView/views/rowsBuilder.js

import { emptyRows } from 'Utilities/hooks/useTableTools/Components/NoResultsTable';

const columnProp = (column) =>
  column.key || column.original?.toLowerCase() || column.title?.toLowerCase();

const itemRow = (item, columns) => ({
  ...item.rowProps,
  itemId: item.itemId || item.id,
  cells: columns.map((column) => ({
    title: column.renderFunc
      ? column.renderFunc(undefined, undefined, item)
      : item[columnProp(column)],
  })),
});

const applyTransformations = (row, transformers, selectedIds, index) => {
  return transformers.reduce(
    (currentRow, transformer) =>
      transformer ? transformer(currentRow, selectedIds, index) : currentRow,
    row
  );
};

/**
 * A function to compile a list of items and passed columns into rows for the Patternfly (v4) Table component within a `tableProps` object.
 *
 *  @param   {Array}  items               An array of items to render
 *  @param   {Array}  columns             An array of columns to render the rows with
 *  @param   {object} [options]           Options for rendering rows
 *  @param   {object} [options.emptyRows] A component to render when no items are to render. (`.length === 0`)
 *
 *  @returns {object}                     A object containing `tableProps`
 *
 *  @category AsyncTableTools
 *  @subcategory internal
 *
 */
const rowsBuilder = (items, columns, options = {}) => {
  const {
    selectedIds = [],
    expandable: { openItem } = {},
    bulkSelect: { markRowSelected } = {},
  } = options;
  const EmptyRowsComponent =
    options.emptyRows || emptyRows(undefined, columns.length);
  let runningIndex = 0;

  return (
    items &&
    (items.length > 0
      ? items
          .flatMap((item) => {
            const row = itemRow(item, columns);

            const transformedRow = applyTransformations(
              row,
              // TODO the order matters, but it shouldn't.
              // the issue is that openItems returns an array, which later markRowSelected can't process.
              [markRowSelected, openItem],
              selectedIds,
              runningIndex,
              item
            );
            runningIndex = runningIndex + (transformedRow?.length || 0);
            return transformedRow;
          })
          .filter((v) => !!v)
      : EmptyRowsComponent)
  );
};

export default rowsBuilder;