# Custom Content

ProTable is fully customizable. You can change many things to match your preferences. This guide will show you how to customize your ProTable.

# Custom Column

There are two ways to instantiate a ProTable instance. Either using fromArray() helper to build a rich HTML table from an array, or using fromTable() helper to build from an existing HTML table.

By default, ProTable will use the attribute JSON as the lable of columns.

For example, by using this data:

const data = [
  {
    name: 'Fulan bin Fulan',
    city: 'Surabaya',
    gender: 'Male'
  },
  {
    name: 'Fulanah binti Fulan',
    city: 'Jakarta',
    gender: 'Female'
  }
]

ProTable will then generate two columns with label Name and City.

ProTable Output:

You can change the label by passing columns options.

fromArray('#table-container', data, {
  columns: {
    name: {
      label: 'Full Name'
    },
    city: {
      label: 'Address'
    }
  }
})

ProTable Output:

# Display Only Some Columns

If you only want to display some columns of your data, you can do that as follows:

fromArray('#protable-3', {
  columns: ['name', 'gender'],
  rows: data
})

ProTable Output:

# Custom Cell

You can also custom your cell content by passing a callback to options.contents.

ProTable will render the return of your callback as a content to specific cell. The return of your callback can be a string or HTMLElement.

fromArray('#protable-4', data, {
  contents: {
    name: content => content.toUpperCase(),
    city: content => content.split('').join('-'),
    gender: content => {
      const span = document.createElement('span')

      span.innerText = content
      span.style.color = content === 'Male' ? '#3eaf7c' : '#ff7675'

      return span
    }
  }
})

ProTable Output:

# Working With Existing HTML

Let's say you have this table as an input:

Company Contact Person Country
Genta Soft Agus Priyono Indonesia
Alfreds Futterkiste Maria Anders Germany
Centro comercial Moctezuma Francisco Chang Mexico
Ernst Handel Roland Mendel Austria
Jago Ngoding Nurul Huda Indonesia
Island Trading Helen Bennett UK
Kopi Dingin Lendis Fabri Indonesia
Laughing Bacchus Winecellars Yoshi Tannamuri Canada
Aksamedia Rizal Jundi Indonesia
Magazzini Alimentari Riuniti Giovanni Rovelli Italy
Indev Id Hengky Indonesia

ProTable will use the innerText of every th as column keys.

So if you want to change the Contact Person cell content, you have to pass ['Contact Person']() as callback.

import { fromTable } from 'protable'

fromTable('#protable-5', {
  contents: {
    ['Contact Person']: content => {
      return `${content}`
    },
    Country: content => {
      const span = document.createElement('span')

      span.innerText = content
      span.style.fontWeight = 600
      // random color
      span.style.color = `#` + ((1<<24)*Math.random()|0).toString(16)

      return span
    }
  }
})

ProTable Output:

Company Contact Person Country
Genta Soft Agus Priyono Indonesia
Alfreds Futterkiste Maria Anders Germany
Centro comercial Moctezuma Francisco Chang Mexico
Ernst Handel Roland Mendel Austria
Jago Ngoding Nurul Huda Indonesia
Island Trading Helen Bennett UK
Kopi Dingin Lendis Fabri Indonesia
Laughing Bacchus Winecellars Yoshi Tannamuri Canada
Aksamedia Rizal Jundi Indonesia
Magazzini Alimentari Riuniti Giovanni Rovelli Italy
Indev Id Hengky Indonesia