exportTreeTableRows<T> function

TreeTableExportResult exportTreeTableRows<T>({
  1. required List<TreeTableRow<T>> rows,
  2. required List<DataTableColumn> columns,
  3. String? treeColumnId,
  4. TreeTableCellBuilder<T>? cellBuilder,
  5. TreeTableExportOptions options = const TreeTableExportOptions(),
})

Exports tree-table rows as sanitized TSV/CSV.

Implementation

TreeTableExportResult exportTreeTableRows<T>({
  required List<TreeTableRow<T>> rows,
  required List<DataTableColumn> columns,
  String? treeColumnId,
  TreeTableCellBuilder<T>? cellBuilder,
  TreeTableExportOptions options = const TreeTableExportOptions(),
}) {
  final start = options.startRow > rows.length ? rows.length : options.startRow;
  final available = rows.length - start;
  final limit = options.maxRows == null || options.maxRows! > available
      ? available
      : options.maxRows!;
  final output = StringBuffer();
  final delimiter = options.format == DataTableExportFormat.tsv ? '\t' : ',';

  void writeLine(List<String> fields) {
    if (output.isNotEmpty) output.write('\n');
    output.write(
      fields
          .map((field) => _encodeField(field, options.format))
          .join(delimiter),
    );
  }

  if (options.includeHeader) {
    writeLine([
      for (final column in columns) _sanitizeTreeTableText(column.title),
    ]);
  }
  final effectiveTreeColumnId = treeColumnId ?? _firstColumnId(columns);
  for (var offset = 0; offset < limit; offset++) {
    final row = rows[start + offset];
    writeLine([
      for (final column in columns)
        _cellText(
          row,
          column.id,
          effectiveTreeColumnId,
          cellBuilder,
          includeTreeIndent: options.includeTreeIndent,
          includeTreeMarker: false,
        ),
    ]);
  }

  return TreeTableExportResult(
    text: output.toString(),
    rowCount: limit,
    columnCount: columns.length,
    startRow: start,
    format: options.format,
    truncated: start + limit < rows.length,
  );
}