Table component with optional pagination
Features:
- Uses URL params to navigate between pages / set current page
- Accepts array to configure columns
- Cells can be displayed by a custom render function
- Each cell can be optionall aligned to left, center or right
- Every cell of a specific column can take additional classes, for styling or other purposes
- Dark / Light mode ready
- Pagination can be enabled / disabled, in the latter case all items will be displayed
- Current page and items per page can be passed on instantiation (when pagination is enabled)
- Optional click entire row, or pass a custom render function to provide a specific click element
- Ellipsis (...) are applied when text doesn't fit in a cell
- Option to sort rows, automatically or pass a custom sort function
- Define density (rows internal vertical padding)
- Define row spacing
Id
Name
State
Quantity
f211addc-8fe3-4e73-b12c-ee754020b2a0
Orange
Orange
162756867077
e00411aa-8dfd-44c1-ae08-ffce5917d5d6
Grape
Grape
93493788680
12ffef8a-7e52-4997-a2cb-e38d78904845
Banana
Banana
205003717696
9c103098-b834-498a-adc8-12da99fc9538
Strawberry
Strawberry
233559506538
9d99169e-93b0-4bf6-bca3-5ad4f7b62378
Pear
Pear
120109071563
1import { Table } from '@tempoplatform/tpds/components/table/Table'
2import { useSearchParams } from 'next/navigation'
3import { useRouter } from 'next/navigation'
4
5
6const searchParams = useSearchParams()
7const router = useRouter()
8let page = searchParams.get('page')
9if (page) {
10 page = parseInt(page)
11} else {
12 page = 1
13}
14
15<Table
16 columns={tableColumns}
17 data={data}
18 pagination={true}
19 rowsPerPage={5}
20 router={router}
21 density="medium"
22 rowSpacing="low"
23 rowClick={(item, index) => alert('clicked item with id: ' + item.id)}
24 page={page}
25/>
26
27const tableColumns = [
28 {
29 label: 'Id',
30 propName: 'id',
31 },
32 {
33 label: 'Name',
34 propName: 'name',
35 addClass: 'font-bold',
36 enableSort: true,
37 },
38 {
39 label: 'State',
40 propName: 'state',
41 enableSort: true,
42 render: (item, index) => {
43 return (
44 <Tag
45 key={index}
46 label={item.name}
47 variant={getTagVariant(item.state)}
48 className="inline-flex self-start"
49 />
50 )
51 },
52 },
53 {
54 label: 'Quantity',
55 propName: 'quantity',
56 enableSort: true,
57 },
58 {
59 label: 'Actions',
60 propName: null,
61 align: 'right',
62 render: (item, index) => (
63 <svg
64 xmlns="http://www.w3.org/2000/svg"
65 fill="none"
66 viewBox="0 0 24 24"
67 strokeWidth={1.5}
68 stroke="currentColor"
69 className="cursor-pointer w-6 h-6 text-primary"
70 key={index}
71 onClick={() => alert('click item: ' + item.name)}
72 >
73 <path
74 strokeLinecap="round"
75 strokeLinejoin="round"
76 d="M12 6.75a.75.75 0 110-1.5.75.75 0 010 1.5zM12 12.75a.75.75 0 110-1.5.75.75 0 010 1.5zM12 18.75a.75.75 0 110-1.5.75.75 0 010 1.5z"
77 />
78 </svg>
79 ),
80 },
81]
82
83const getTagVariant = campaignState => {
84 switch (campaignState) {
85 case 'ACTIVE':
86 return 'success'
87 case 'INACTIVE':
88 return 'warning'
89 case 'UPCOMING':
90 return 'info'
91 default:
92 return 'default'
93 }
94}
95
96const data = [
97 {
98 id: 'f211addc-8fe3-4e73-b12c-ee754020b2a0',
99 name: 'Orange',
100 quantity: 162756867077,
101 state: 'ACTIVE',
102 },
103 {
104 id: 'e00411aa-8dfd-44c1-ae08-ffce5917d5d6',
105 name: 'Grape',
106 quantity: 93493788680,
107 state: 'INACTIVE',
108 },
109 {
110 id: '12ffef8a-7e52-4997-a2cb-e38d78904845',
111 name: 'Banana',
112 quantity: 205003717696,
113 state: 'ACTIVE',
114 },
115 {
116 id: '9c103098-b834-498a-adc8-12da99fc9538',
117 name: 'Strawberry',
118 quantity: 233559506538,
119 state: 'ACTIVE',
120 },
121 {
122 id: '9d99169e-93b0-4bf6-bca3-5ad4f7b62378',
123 name: 'Pear',
124 quantity: 120109071563,
125 state: 'UPCOMING',
126 },
127 {
128 id: '00791166-8b69-4a5e-8c96-8af69e430210',
129 name: 'Pineapple',
130 quantity: 262939354976,
131 state: 'UPCOMING',
132 },
133 {
134 id: 'b4796640-664c-41ae-a3c1-de5cf29be387',
135 name: 'Blueberry',
136 quantity: 104208500516,
137 state: 'INACTIVE',
138 },
139 {
140 id: 'a5c5b832-088c-4220-a507-b5b184535c3f',
141 name: 'Apple',
142 quantity: 48856636279,
143 state: 'UPCOMING',
144 },
145 {
146 id: '4170b32a-e9c0-4822-b2a7-81aab51625af',
147 name: 'Mango',
148 quantity: 125426069604,
149 state: 'ACTIVE',
150 },
151 {
152 id: '7bd2984c-2da6-4567-8ed2-4542965c40cd',
153 name: 'Lemon',
154 quantity: 109314970672,
155 state: 'ACTIVE',
156 },
157 {
158 id: '66b98469-cf54-4f8d-b9bf-ff6a888edab2',
159 name: 'Kiwi',
160 quantity: 114027869935,
161 state: 'UPCOMING',
162 },
163 {
164 id: 'ee0e8f93-e9c2-4039-8ba8-b4ab2a899f6a',
165 name: 'Watermelon',
166 quantity: 195375309150,
167 state: 'INACTIVE',
168 },
169 {
170 id: '88e5af24-726c-4cbc-b240-c89d20cd0266',
171 name: 'Peach',
172 quantity: 228749120903,
173 state: 'ACTIVE',
174 },
175 {
176 id: '96f1319b-3106-4949-ae80-f61f5711acbd',
177 name: 'Maracuja',
178 quantity: 127008928254,
179 state: 'INACTIVE',
180 },
181 {
182 id: '58205bd1-d0b9-4641-9f0e-44a0566437f5',
183 name: 'Lime',
184 quantity: 246922784751,
185 state: 'ACTIVE',
186 },
187 {
188 id: '200949f4-1404-4c0d-b2b5-242385d67922',
189 name: 'Pomegrenate',
190 quantity: 98473295591,
191 state: 'ACTIVE',
192 },
193 {
194 id: 'caee91e1-8ec3-4c0a-8ea7-e35621a1fb5a',
195 name: 'Cranberry',
196 quantity: 139727530843,
197 state: 'UPCOMING',
198 },
199 {
200 id: '80aac484-b3e9-4f2a-980a-556479af47ae',
201 name: 'Raspberry',
202 quantity: 218871853404,
203 state: 'INACTIVE',
204 },
205 {
206 id: '66cd61ca-fb4d-475c-87b0-e204f5fade1c',
207 name: 'Blackberry',
208 quantity: 293278713861,
209 state: 'ACTIVE',
210 },
211 {
212 id: '331fb692-5476-4751-9f5c-ff47d4c42523',
213 name: 'Mandarin',
214 quantity: 276906705201,
215 state: 'INACTIVE',
216 },
217]
Table general props
Prop Name
Type
Default
Required
Description
columns
Array
null
yes
An array defining the columns of the table.
data
Array
null
yes
The items to be displayed in the table.
pagination
Boolean
true
no
If true, pagination will be enabled. If false, all items will be displayed.
router
Component
null
no
Only required when pagination is active. Used to navigate between pages.
rowsPerPage
Number
10
no
The number of items to be displayed per page. Only used when pagination is enabled.
rowClick
Boolean
null
no
If true, the entire row will be clickable. An hover effect will be added.
page
Number
1
no
The current page. Only used when pagination is enabled.
rowKey
String
null
yes
The key to be used as unique identifier for each row.
density
String
low
no
The density of the table. Can be 'low', 'medium' or 'high'. Defines vertical padding inside rows
rowSpacing
String
low
no
The spacing between rows. Can be 'none', 'low', 'medium' or 'high'. Defines vertical margin between rows
Table data items props
Prop Name
Type
Default
Required
Description
label
String
null
yes
The label to be displayed in the table header.
name
String
null
yes
The property name to get the value to display in the cell.
addClass
String
""
no
Additional classes to be added to every cell of this column.
enableSort
Boolean
false
no
If true, the column will be sortable.
sortFunction
Function
null
no
A custom sort function to be used when sorting this column. Otherwise falls to automatic sorting.