Create sorted, filtered and paginated table data from database. Can also be used to generate CSV data.
Install npm module:
$ adonis install adonis-datagrid
Once you have installed adonis-datagrid, make sure to register the provider inside start/app.js
in order to make use of it.
const providers = [
'adonis-datagrid/providers/DataGridProvider'
]
Send JSON response:
const DataGrid = use('DataGrid')
Route.get('/api/users', async () => {
const config = {
// base query
query () {
return use('App/Models/User').query()
},
// <GET param>:<DB column> for sortable columns
sortable: {
id: 'id',
username: 'username',
email: 'email',
created: 'created_at',
deleted (query, value) {
query[+value ? 'whereNotNull' : 'whereNull']('deleted_at')
}
},
// global searchable fields
searchable: ['username', 'email'],
// <GET param>:<DB column> for filterable columns
filterable: {
username: 'username',
},
// csv export options
exportOptions: {
fields: [
{label: 'ID', value: 'id'},
{label: 'Username', value: 'username'},
{label: 'Email', value: 'email'},
{label: 'Created', value: 'created_at'},
{
label: 'Deleted',
value: row => row.deleted_at ? 'YES' : 'NO',
},
]
}
}
// send JSON response
return DataGrid.paginate(config)
})
Send as CSV:
Route.get('/api/users/export', async ({response}) => {
const csv = await DataGrid.export(/* config here */)
response.header('content-type', 'text/csv')
response.header('content-disposition', `attachment; filename="export.csv"`)
// send CSV data
return csv
})
[GET] /users?search=simon&sort=-username
{
"total": 3,
"perPage": 10,
"page": 1,
"lastPage": 1,
"data": [
{
"id": 3,
"username": "timtam",
"email": "tim@wasussu.mh"
},
{
"id": 2,
"username": "simon",
"email": "simon@wasussu.mh"
},
{
"id": 4,
"username": "jamiesimons",
"email": "jamie@example.com"
},
]
}
[GET] /api/users?filter[username]=simon
{
"total": 1,
"perPage": 10,
"page": 1,
"lastPage": 1,
"data": [
{
"id": 2,
"username": "simon",
"email": "simon@wasussu.mh"
},
]
}
[GET] /api/users/export?search=simon&sort=id
"ID","Username","Email","Created","Deleted"
2,"simon","simon@wasussu.mh","2017-11-07 10:24:43","NO"
3,"timtam","tim@wasussu.mh","2017-05-04 11:14:13","NO"
4,"jamiesimons","jamie@example.com","2017-10-04 16:24:23","NO"
-
query
- (required) Base query. -
defaults
- Default options.-
page
- Initial page. Default:1
. -
perPageLimit
- Limits on rows per page.-
min
- Upper limit. Default:5
. -
max
- Lower limit. Default:100
.
-
-
search
- Search (forsearchable
fields). Default:''
. -
filters
- Fitlers (forfilterable
fields). Default :{}
. -
sorts
- Sorted (forsortable
fields). Default:{}
. -
queryParams
- GET params that appear in URL.-
page
- Current page. Default:'page'
. -
perPage
- Rows per page. Default:'perPage'
. -
search
- Search. Default:'search'
. -
filter
- Filters. Default:'filter'
. -
sort
- Sorted. Default:'sort'
.
-
-
-
sortable
- Simple object where key is the GET param and value is the database column. For more custom database queries you an pass a function as the value which receieves two arguments:query
,sortable
(GET param) anddescending
(boolean). -
searchable
- Array containing column names for global search. For more custom queries you can pass a function as one of the array items which receivessearch
as its argument. -
exportOptions
- Configuration options for CSV export. See json2csv for options. -
filterable
- Simple object where key is the GET param and value is the database column. For more custom database queries you an pass a function as the value which receieves two arguments:query
andvalue
(GET param value).
SemVer is used for versioning. For the versions available, see the tags on this repository.
- Simon Tong - Developer - simontong
This project is licensed under the MIT License - see the LICENSE file for details.