cli-table / cli-table3

Pretty unicode tables for the command line
MIT License
515 stars 44 forks source link

Support for multiple header rows #328

Open JonathanCoxLRS opened 1 year ago

JonathanCoxLRS commented 1 year ago

Hello,

Does cli-table3 support multiple header rows? For example:

image

If so, can you point me to some documentation for this?

Thanks!

speedytwenty commented 1 year ago

This is supported presently as it's merely a matter of adding a row at the beginning and optionally customizing the style.

This isn't well documented, so I'll leave this open as something that can be added to the docs.

For now, here is an example:

const Table = require('.');
const colors = require('@colors/colors');

const table = new Table({
  head: [{ content: 'Users', colSpan: 4, hAlign: 'center' }],
});
table.push(
  // Subhead row with custom style
  ['First', 'Last', 'Email',  'Phone'].map((content) => ({ content: colors.bold(content) })),
  ['Jane', 'Doe', 'Jane.Doe@example.com', '555-867-5309'],
  ['John', 'Doe', 'John.Doe@example.com', '555-867-5310'],
);
console.log(table.toString());

Outputs:

image

speedytwenty commented 1 year ago

The downside to the above example is that it requires adding @colors/colors as an additional dependency (to optionally use it to customize styles) which should therefore be a peerDependency.

It would be ideal if colors was exposed through the Table interface so that it could be used directly: Eg.

['First', 'Last', 'Email',  'Phone'].map((content) => ({ content: Table.colors.bold(content) })),

Note: This doesn't presently work. @colors/colors has to be added as a dependency and specifically included.

JonathanCoxLRS commented 1 year ago

Gotcha. I'm already using chalk so I can use that for styles. This approach does seem to work for my use case, even though it's a bit clunky. table.push seems like it should only be for body rows. It'd be nice if this supported something like one of the following:

Perhaps table.body.push and table.head.push for managing body vs head rows.

Updating the constructor to allow specifying additional head rows at time of instantiation.

const table = new Table(
  {
    head: [
      { content: 'Users', colSpan: 4, hAlign: 'center' }, // row 1
      ['First', 'Last', 'Email', 'Phone'] // row 2
    ],
  }
);

Thanks for the help!