buildColumns() {
    this.buildColumnVisibility();
    let totalWidth = 0;
    let columns = this._columnVisibility.map(({ id, name, visible }) => {
      let width = visible ? this.getColumnWidth(id) : 0;
      totalWidth += width;
      return { width, id, name, visible };
    });
    // Fix percentage precision errors. If we only add it to the last column
    // the last column will slowly increase in size every time we visit this list.
    // So we distribute the extra pixels starting with the smallest column.
    if (columns.length > 0) {
      let diff = this.tableWidth - totalWidth;
      while (diff > 0) {
        columns
          .filter((col) => !!col.visible)
          .sort((a, b) => a.width - b.width)
          .forEach((column) => {
            if (diff > 0) {
              column.width++;
              diff--;
            }
          });
      }
    }
    this._columns = columns;
  }
Builds the `_columns` array which is a list of all columns
along with their calculated/cached widths. Call this method
whenever you need to recalculate the columns' widths.

@method buildColumns