-
Notifications
You must be signed in to change notification settings - Fork 58
Datatable Page Setup
In example code, replace foo
with the appropriate variable for the datatable.
url(r'^data/foo/$', views_datatables.foo),
def foo(request):
return render(request, 'datatable.jinja', {
'parent': 'data',
'result_type': 'foo',
'slug': 'foo',
'title': 'foo',
'columns': constants.table_columns['foo']
})
Find the OrderedDict
called table_columns
, and add the appropriate column names:
('foo', ['Column One', 'Column Two', 'Column Three', 'Column Four']),
Create a page in /fec/data/templates/partials/
called foo-filter.jinja
. This template specifies the filters for the datatable. Other filter templates that end with -filter.html
can be looked at for examples of how to use certain filters.
Create a new Handlebars template in /static/js/templates/[name of table].hbs
. These templates use a custom Handlebars helper to cut down on extra markup that goes like:
{{#panelRow "Label"}}
{{some_data_key}}
{{/panelRow}}
For schedules, the details template should include all the data from the schedule as well as information about the filing committee.
Create foo.js
in /static/js/pages/
.
'use strict';
var $ = require('jquery');
var tables = require('../modules/tables');
var columns = require('../modules/columns');
var someDetailsTemplate = require('../templates/example-template.hbs');
$(document).ready(function() {
var $table = $('#results');
new tables.DataTable($table, {
autoWidth: false,
title: 'Foo',
path: ['foo', 'bar'],
columns: columns.foo,
order: [[4, 'desc']],
useFilters: true,
useExport: true,
rowCallback: tables.modalRenderRow,
callbacks: {
afterRender: tables.modalRenderFactory(someDetailsTemplate)
}
});
});
The path
property is the path to the API (https://api.open.fec.gov/developers/). For example to connect to /candidates/totals, the path would be ['candidates', 'totals']
. The order
property refers to the column that the Datatable will be sorted by default. In the above sample code, it would be the fourth column in descending order.
In /static/js/modules/columns.js
, add a new variable:
var foo = [
{
data: 'committee',
orderable: false,
className: 'all column--large',
render: function (data, type, row) {
return row.committee.name;
}
},
{
data: 'description',
orderable: false,
className: 'all column--large',
},
dateColumn({data: 'end_date', orderable: true, className: 'min-tablet hide-panel column--med'}),
currencyColumn({data: 'contributions', className: 'min-desktop hide-panel column--number'}),
modalTriggerColumn
];
Each object represents a column, in order. Data
is the column parameter. If data
is an object, we can drill down to the specific property with passing a function to render
. In the function, row
would be object property. The size of columns are handled by class names, and dateColumn
and currencyColumn
are available to show column data in date or currency formats.
At the end of the file, don't forget to add the variable to module.exports
with foo: foo
.
Make sure changes to javascript and scss are compiled:
Run npm run watch
once, to watch for changes to .js and .scss.
-Or-
Run npm run build
after saving to compile the .js and .scss manually.