This example shows a few ways to configure your columns to populate cells with formatted values.
Formatting with Template Strings
Note: be sure to add the yui3-skin-sam
classname to the
page's <body>
element or to a parent element of the widget in order to apply
the default CSS skin. See Understanding Skinning.
<body class="yui3-skin-sam"> <!-- You need this skin class -->
Data can be stored in one format but displayed in a different format. For instance, prices can be stored as numbers but displayed as "$2.99", and birthdays can be stored as Date objects but displayed as "12/9/2009".
Simple formatting can be defined with a string template on the column definition.
YUI().use("datatable", function (Y) { var table = new Y.DataTable({ columns: ["id", "name", { key: "price", formatter: "${value}" }], data: [ { id: "ga-3475", name: "gadget", price: 6.99 }, { id: "sp-9980", name: "sprocket", price: 3.75 }, { id: "wi-0650", name: "widget", price: 4.25 } ], caption:"Data formatting with string template" }).render('#template'); });
Formatting with Functions
When a calculation is needed, define a custom function that generates
markup for the data cell. The custom formatter function receives an object
with the properties listed in Appendix
B in the DataTable user guide. Also see the section on
setting content with formatter
functions.
YUI().use("datatype-date", "datatable", function (Y) { function calculate(o) { return "$" + (o.data.price - o.data.cost).toFixed(2); } var table = new Y.DataTable({ columns: ["id", "name", { label: "profit", formatter: calculate }], data: [ { id: "ga-3475", name: "gadget", price: 6.99, cost: 4.99 }, { id: "sp-9980", name: "sprocket", price: 3.75, cost: 2.75 }, { id: "wi-0650", name: "widget", price: 4.25, cost: 3.25 } ], caption:"Data formatting with custom function" }).render("#function"); });
Populating Cells with HTML
By default, DataTable will HTML escape cell values (regardless of
formatters). If you want HTML to be preserved, include allowHTML: true
in the column configuration.
YUI().use('datatable', function (Y) { var table = new Y.DataTable({ columns: [ { key: "id", formatter: '<input type="checkbox" name="item" value="{value}">', label: '<input type="checkbox" id="id-all" value="all">', allowHTML: true }, "name", { key: "price", formatter: '${value}' } ], data: [ { id: "ga-3475", name: "gadget", price: 6.99 }, { id: "sp-9980", name: "sprocket", price: 3.75 }, { id: "wi-0650", name: "widget", price: 4.25 } ], caption: "Allowing HTML content in cells" }).render("#allowhtml"); // Delegated because the table header might be re-rendered table.delegate('click', function (e) { this.get('contentBox').all('input[name]') .set('checked', e.currentTarget.get('checked')); }, '#id-all', table); table.delegate('click', function (e) { Y.one('#id-all').set('checked', false); }, '.yui3-datatable-data input', table); });
Using emptyCellValue
for Missing Data
Use the emptyCellValue
column configuration to supply a custom cell value
in the case of missing data. If the emptyCellValue
includes HTML
formatting, be sure to also set allowHTML: true
for the column. Note,
the DataType utility is also used by the formatter in this example.
YUI().use("datatype-date", "datatable-base", function (Y) { function formatDates(o) { return o.value && Y.DataType.Date.format(o.value, { format: "%m/%d/%Y" }); } var table = new Y.DataTable({ columns: [ "id", "name", { key: "date", formatter: formatDates, emptyCellValue: "(unknown)" } ], data: [ { id: "ga-3475", name: "gadget", date: new Date(2006, 5, 1) }, { id: "sp-9980", name: "sprocket", date: new Date(2004, 8, 16) }, { id: "wi-0650", name: "widget" } // No date, uses emptyCellValue ], caption: "Data formatting with DataType.Date" }).render("#dates"); });