1110 lines
37 KiB
HTML
1110 lines
37 KiB
HTML
|
<!DOCTYPE html>
|
||
|
<html>
|
||
|
<head>
|
||
|
<meta charset="utf-8">
|
||
|
<link rel="shortcut icon" type="image/ico" href="https://www.datatables.net/favicon.ico">
|
||
|
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1.0, user-scalable=no">
|
||
|
<title>StateRestore example - Ajax Function</title>
|
||
|
<link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css">
|
||
|
<link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css">
|
||
|
<style type="text/css" class="init">
|
||
|
|
||
|
</style>
|
||
|
<script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script>
|
||
|
<script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script>
|
||
|
<script defer class="init">
|
||
|
dt_demo.init({
|
||
|
libs: {"targetFramework":"","js":["jquery","datatables","staterestore","buttons","scroller","\/\/cdnjs.cloudflare.com\/ajax\/libs\/idbwrapper\/1.7.2\/idbstore.min.js"],"css":["datatables","buttons","staterestore","scroller"],"components":{"datatables":{"css":"..\/..\/..\/..\/css","js":"..\/..\/..\/..\/js","resolve":true},"autofill":{"css":"..\/..\/..\/..\/..\/extensions\/AutoFill\/css","js":"..\/..\/..\/..\/..\/extensions\/AutoFill\/js","resolve":true},"buttons":{"css":"..\/..\/..\/..\/..\/extensions\/Buttons\/css","js":"..\/..\/..\/..\/..\/extensions\/Buttons\/js","resolve":true},"colreorder":{"css":"..\/..\/..\/..\/..\/extensions\/ColReorder\/css","js":"..\/..\/..\/..\/..\/extensions\/ColReorder\/js","resolve":true},"editor":{"css":"..\/..\/..\/..\/..\/extensions\/Editor\/css","js":"..\/..\/..\/..\/..\/extensions\/Editor\/js","resolve":true},"fixedcolumns":{"css":"..\/..\/..\/..\/..\/extensions\/FixedColumns\/css","js":"..\/..\/..\/..\/..\/extensions\/FixedColumns\/js","resolve":true},"fixedheader":{"css":"..\/..\/..\/..\/..\/extensions\/FixedHeader\/css","js":"..\/..\/..\/..\/..\/extensions\/FixedHeader\/js","resolve":true},"keytable":{"css":"..\/..\/..\/..\/..\/extensions\/KeyTable\/css","js":"..\/..\/..\/..\/..\/extensions\/KeyTable\/js","resolve":true},"responsive":{"css":"..\/..\/..\/..\/..\/extensions\/Responsive\/css","js":"..\/..\/..\/..\/..\/extensions\/Responsive\/js","resolve":true},"rowgroup":{"css":"..\/..\/..\/..\/..\/extensions\/RowGroup\/css","js":"..\/..\/..\/..\/..\/extensions\/RowGroup\/js","resolve":true},"rowreorder":{"css":"..\/..\/..\/..\/..\/extensions\/RowReorder\/css","js":"..\/..\/..\/..\/..\/extensions\/RowReorder\/js","resolve":true},"scroller":{"css":"..\/..\/..\/..\/..\/extensions\/Scroller\/css","js":"..\/..\/..\/..\/..\/extensions\/Scroller\/js","resolve":true},"select":{"css":"..\/..\/..\/..\/..\/extensions\/Select\/css","js":"..\/..\/..\/..\/..\/extensions\/Select\/js","resolve":true},"searchbuilder":{"css":"..\/..\/..\/..\/..\/extensions\/SearchBuilder\/css","js":"..\/..\/..\/..\/..\/extensions\/SearchBuilder\/js","resolve":true},"searchpanes":{"css":"..\/..\/..\/..\/..\/extensions\/SearchPanes\/css","js":"..\/..\/..\/..\/..\/extensions\/SearchPanes\/js","resolve":true},"staterestore":{"css":"..\/..\/..\/..\/..\/extensions\/StateRestore\/css","js":"..\/..\/..\/..\/..\/extensions\/StateRestore\/js","resolve":true},"datetime":{"css":"..\/..\/..\/..\/..\/extensions\/DateTime\/css\/dataTables.dateTime.css","js":"..\/..\/..\/..\/..\/extensions\/DateTime\/js\/dataTables.dateTime.js"},"bootstrap":{"css":"https:\/\/maxcdn.bootstrapcdn.com\/bootstrap\/3.3.7\/css\/bootstrap.min.css","js":"https:\/\/maxcdn.bootstrapcdn.com\/bootstrap\/3.3.7\/js\/bootstrap.min.js"},"bootstrap4":{"css":"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/twitter-bootstrap\/4.5.2\/css\/bootstrap.css","js":"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/popper.js\/1.14.3\/umd\/popper.min.js|https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/twitter-bootstrap\/4.5.2\/js\/bootstrap.min.js"},"bootstrap5":{"css":"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/twitter-bootstrap\/5.3.0\/css\/bootstrap.min.css","js":"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/twitter-bootstrap\/5.3.0\/js\/bootstrap.bundle.min.js"},"bulma":{"css":"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/bulma\/0.9.3\/css\/bulma.min.css"},"foundation":{"css":"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/foundation\/6.4.3\/css\/foundation.min.css","js":"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/foundation\/6.4.3\/js\/foundation.min.js"},"jqueryui":{"css":"https:\/\/code.jquery.com\/ui\/1.13.2\/themes\/base\/jquery-ui.css","js":"https:\/\/code.jquery.com\/ui\/1.13.2\/jquery-ui.js"},"material":{"css":"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/material-components-web\/14.0.0\/material-components-web.min.css","js":"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/material-components-web\/14.0.0\/material-components-web.min.js"},"semanticui":{"css":"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/fomantic-ui\/2.9.2\/semantic.min.css","js":"https:\/\/cdnjs.cloudflare.com\/ajax\/libs
|
||
|
jquery: function () {
|
||
|
|
||
|
|
||
|
|
||
|
var states = new IDBStore({
|
||
|
dbVersion: 1,
|
||
|
storeName: 'states',
|
||
|
keyPath: 'identifier',
|
||
|
onStoreReady: function () {
|
||
|
initDataTable();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
function initDataTable() {
|
||
|
// We need to wait for the database to be ready as the load will run straight away
|
||
|
$('#example').DataTable({
|
||
|
layout: {
|
||
|
topStart: {
|
||
|
buttons: [
|
||
|
'createState',
|
||
|
{
|
||
|
extend: 'savedStates',
|
||
|
config: {
|
||
|
ajax: function (data, callback) {
|
||
|
// Action to take if loading states into staterestore
|
||
|
if (data.action === 'load') {
|
||
|
var reloadStates = (loadData) => {
|
||
|
// Manipulate the data into the structure expected by the callback
|
||
|
var cbData = {};
|
||
|
for (var i = 0; i < loadData.length; i++) {
|
||
|
// Convert back from the string created when saving
|
||
|
cbData[loadData[i].identifier] = JSON.parse(
|
||
|
loadData[i].state
|
||
|
);
|
||
|
}
|
||
|
|
||
|
// Load states into StateRestore
|
||
|
callback(cbData);
|
||
|
};
|
||
|
|
||
|
states.getAll(reloadStates);
|
||
|
}
|
||
|
// Action to take if renaming states
|
||
|
else if (data.action === 'rename') {
|
||
|
// Get all of the state identifiers
|
||
|
var ids = Object.keys(data.stateRestore);
|
||
|
for (var i = 0; i < ids.length; i++) {
|
||
|
var savesuccess = (saveData) => {
|
||
|
// Remove the record with the current identifier
|
||
|
states.remove(saveData.identifier);
|
||
|
// Add a new record with the updated identifier that uses the old state
|
||
|
states.put({
|
||
|
identifier: data.stateRestore[saveData.identifier],
|
||
|
state: saveData.state
|
||
|
});
|
||
|
};
|
||
|
|
||
|
states.get(ids[i], savesuccess);
|
||
|
}
|
||
|
callback();
|
||
|
}
|
||
|
// Action to take if removing states
|
||
|
else if (data.action === 'remove') {
|
||
|
var ids = Object.keys(data.stateRestore);
|
||
|
for (var i = 0; i < ids.length; i++) {
|
||
|
// Remove all of the states listed in the object
|
||
|
states.remove(ids[i]);
|
||
|
}
|
||
|
callback();
|
||
|
}
|
||
|
// Action to take if saving states
|
||
|
else if (data.action === 'save') {
|
||
|
var ids = Object.keys(data.stateRestore);
|
||
|
for (var i = 0; i < ids.length; i++) {
|
||
|
// Add all of the states listed in the object
|
||
|
// Important to convert state to a string as it is too complex for IndexedDB to handle
|
||
|
states.put({
|
||
|
identifier: ids[i],
|
||
|
state: JSON.stringify(data.stateRestore[ids[i]])
|
||
|
});
|
||
|
}
|
||
|
callback();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
},
|
||
|
vanilla: function () {
|
||
|
|
||
|
|
||
|
|
||
|
var states = new IDBStore({
|
||
|
dbVersion: 1,
|
||
|
storeName: 'states',
|
||
|
keyPath: 'identifier',
|
||
|
onStoreReady: function () {
|
||
|
initDataTable();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
function initDataTable() {
|
||
|
// We need to wait for the database to be ready as the load will run straight away
|
||
|
new DataTable('#example', {
|
||
|
layout: {
|
||
|
topStart: {
|
||
|
buttons: [
|
||
|
'createState',
|
||
|
{
|
||
|
extend: 'savedStates',
|
||
|
config: {
|
||
|
ajax: function (data, callback) {
|
||
|
// Action to take if loading states into staterestore
|
||
|
if (data.action === 'load') {
|
||
|
var reloadStates = (loadData) => {
|
||
|
// Manipulate the data into the structure expected by the callback
|
||
|
var cbData = {};
|
||
|
for (var i = 0; i < loadData.length; i++) {
|
||
|
// Convert back from the string created when saving
|
||
|
cbData[loadData[i].identifier] = JSON.parse(
|
||
|
loadData[i].state
|
||
|
);
|
||
|
}
|
||
|
|
||
|
// Load states into StateRestore
|
||
|
callback(cbData);
|
||
|
};
|
||
|
|
||
|
states.getAll(reloadStates);
|
||
|
}
|
||
|
// Action to take if renaming states
|
||
|
else if (data.action === 'rename') {
|
||
|
// Get all of the state identifiers
|
||
|
var ids = Object.keys(data.stateRestore);
|
||
|
for (var i = 0; i < ids.length; i++) {
|
||
|
var savesuccess = (saveData) => {
|
||
|
// Remove the record with the current identifier
|
||
|
states.remove(saveData.identifier);
|
||
|
// Add a new record with the updated identifier that uses the old state
|
||
|
states.put({
|
||
|
identifier: data.stateRestore[saveData.identifier],
|
||
|
state: saveData.state
|
||
|
});
|
||
|
};
|
||
|
|
||
|
states.get(ids[i], savesuccess);
|
||
|
}
|
||
|
callback();
|
||
|
}
|
||
|
// Action to take if removing states
|
||
|
else if (data.action === 'remove') {
|
||
|
var ids = Object.keys(data.stateRestore);
|
||
|
for (var i = 0; i < ids.length; i++) {
|
||
|
// Remove all of the states listed in the object
|
||
|
states.remove(ids[i]);
|
||
|
}
|
||
|
callback();
|
||
|
}
|
||
|
// Action to take if saving states
|
||
|
else if (data.action === 'save') {
|
||
|
var ids = Object.keys(data.stateRestore);
|
||
|
for (var i = 0; i < ids.length; i++) {
|
||
|
// Add all of the states listed in the object
|
||
|
// Important to convert state to a string as it is too complex for IndexedDB to handle
|
||
|
states.put({
|
||
|
identifier: ids[i],
|
||
|
state: JSON.stringify(data.stateRestore[ids[i]])
|
||
|
});
|
||
|
}
|
||
|
callback();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
}
|
||
|
});
|
||
|
</script>
|
||
|
</head>
|
||
|
<body class="dt-example">
|
||
|
<div class="container">
|
||
|
<section>
|
||
|
<h1>StateRestore example <span>Ajax Function</span></h1>
|
||
|
<div class="info">
|
||
|
<p>This example shows how the StateRestore extension can be operated over ajax when setting the <code>ajax</code> option of the <a href=
|
||
|
"//datatables.net/reference/type/stateRestoreConfig"><code class="type" title="Javascript parameter type">stateRestoreConfig</code></a> configuration object to be
|
||
|
a function.</p>
|
||
|
<p>When <code>ajax</code> is a function, it will be called when the following actions are taken.</p>
|
||
|
<ul class="markdown">
|
||
|
<li>loading states into StateRestore</li>
|
||
|
<li>save</li>
|
||
|
<li>rename</li>
|
||
|
<li>remove</li>
|
||
|
</ul>
|
||
|
<p>The function takes two arguments, the first of which is an object. The first value on the object (<code>action</code>) is one of the above actions as a string.
|
||
|
This will allow your function to act accordingly.</p>
|
||
|
<p>The second value on the object, <code>stateRestore</code> is another object. The keys of this object indicate which state the action is taking place on, the
|
||
|
corresponding value is either the state to be saved, or in the case of <code>rename</code>, the new name for that state. There is no <code>stateRestore</code>
|
||
|
property when loading states.</p>
|
||
|
<p>The second argument taken by the function is a callback that should be called when loading in states to StateRestore. An object of the same structure as the
|
||
|
<code>preDefined</code> option of the <a href="//datatables.net/reference/type/stateRestoreConfig"><code class="type" title=
|
||
|
"Javascript parameter type">stateRestoreConfig</code></a> configuration object should be passed in to this function in order to load the states into
|
||
|
DataTables.</p>
|
||
|
<p>This example demonstrates how <a href="https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API">IndexedDB</a> could be used to store states, implemented
|
||
|
through <a href="https://www.npmjs.com/package/idb?ref=hackernoon.com">idb</a>.</p>
|
||
|
</div>
|
||
|
<div class="demo-html">
|
||
|
<table id="example" class="display nowrap" style="width:100%">
|
||
|
<thead>
|
||
|
<tr>
|
||
|
<th>Name</th>
|
||
|
<th>Position</th>
|
||
|
<th>Office</th>
|
||
|
<th>Age</th>
|
||
|
<th>Start date</th>
|
||
|
<th>Salary</th>
|
||
|
</tr>
|
||
|
</thead>
|
||
|
<tbody>
|
||
|
<tr>
|
||
|
<td>Tiger Nixon</td>
|
||
|
<td>System Architect</td>
|
||
|
<td>Edinburgh</td>
|
||
|
<td>61</td>
|
||
|
<td>2011-04-25</td>
|
||
|
<td>$320,800</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Garrett Winters</td>
|
||
|
<td>Accountant</td>
|
||
|
<td>Tokyo</td>
|
||
|
<td>63</td>
|
||
|
<td>2011-07-25</td>
|
||
|
<td>$170,750</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Ashton Cox</td>
|
||
|
<td>Junior Technical Author</td>
|
||
|
<td>San Francisco</td>
|
||
|
<td>66</td>
|
||
|
<td>2009-01-12</td>
|
||
|
<td>$86,000</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Cedric Kelly</td>
|
||
|
<td>Senior Javascript Developer</td>
|
||
|
<td>Edinburgh</td>
|
||
|
<td>22</td>
|
||
|
<td>2012-03-29</td>
|
||
|
<td>$433,060</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Airi Satou</td>
|
||
|
<td>Accountant</td>
|
||
|
<td>Tokyo</td>
|
||
|
<td>33</td>
|
||
|
<td>2008-11-28</td>
|
||
|
<td>$162,700</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Brielle Williamson</td>
|
||
|
<td>Integration Specialist</td>
|
||
|
<td>New York</td>
|
||
|
<td>61</td>
|
||
|
<td>2012-12-02</td>
|
||
|
<td>$372,000</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Herrod Chandler</td>
|
||
|
<td>Sales Assistant</td>
|
||
|
<td>San Francisco</td>
|
||
|
<td>59</td>
|
||
|
<td>2012-08-06</td>
|
||
|
<td>$137,500</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Rhona Davidson</td>
|
||
|
<td>Integration Specialist</td>
|
||
|
<td>Tokyo</td>
|
||
|
<td>55</td>
|
||
|
<td>2010-10-14</td>
|
||
|
<td>$327,900</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Colleen Hurst</td>
|
||
|
<td>Javascript Developer</td>
|
||
|
<td>San Francisco</td>
|
||
|
<td>39</td>
|
||
|
<td>2009-09-15</td>
|
||
|
<td>$205,500</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Sonya Frost</td>
|
||
|
<td>Software Engineer</td>
|
||
|
<td>Edinburgh</td>
|
||
|
<td>23</td>
|
||
|
<td>2008-12-13</td>
|
||
|
<td>$103,600</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Jena Gaines</td>
|
||
|
<td>Office Manager</td>
|
||
|
<td>London</td>
|
||
|
<td>30</td>
|
||
|
<td>2008-12-19</td>
|
||
|
<td>$90,560</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Quinn Flynn</td>
|
||
|
<td>Support Lead</td>
|
||
|
<td>Edinburgh</td>
|
||
|
<td>22</td>
|
||
|
<td>2013-03-03</td>
|
||
|
<td>$342,000</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Charde Marshall</td>
|
||
|
<td>Regional Director</td>
|
||
|
<td>San Francisco</td>
|
||
|
<td>36</td>
|
||
|
<td>2008-10-16</td>
|
||
|
<td>$470,600</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Haley Kennedy</td>
|
||
|
<td>Senior Marketing Designer</td>
|
||
|
<td>London</td>
|
||
|
<td>43</td>
|
||
|
<td>2012-12-18</td>
|
||
|
<td>$313,500</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Tatyana Fitzpatrick</td>
|
||
|
<td>Regional Director</td>
|
||
|
<td>London</td>
|
||
|
<td>19</td>
|
||
|
<td>2010-03-17</td>
|
||
|
<td>$385,750</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Michael Silva</td>
|
||
|
<td>Marketing Designer</td>
|
||
|
<td>London</td>
|
||
|
<td>66</td>
|
||
|
<td>2012-11-27</td>
|
||
|
<td>$198,500</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Paul Byrd</td>
|
||
|
<td>Chief Financial Officer (CFO)</td>
|
||
|
<td>New York</td>
|
||
|
<td>64</td>
|
||
|
<td>2010-06-09</td>
|
||
|
<td>$725,000</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Gloria Little</td>
|
||
|
<td>Systems Administrator</td>
|
||
|
<td>New York</td>
|
||
|
<td>59</td>
|
||
|
<td>2009-04-10</td>
|
||
|
<td>$237,500</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Bradley Greer</td>
|
||
|
<td>Software Engineer</td>
|
||
|
<td>London</td>
|
||
|
<td>41</td>
|
||
|
<td>2012-10-13</td>
|
||
|
<td>$132,000</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Dai Rios</td>
|
||
|
<td>Personnel Lead</td>
|
||
|
<td>Edinburgh</td>
|
||
|
<td>35</td>
|
||
|
<td>2012-09-26</td>
|
||
|
<td>$217,500</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Jenette Caldwell</td>
|
||
|
<td>Development Lead</td>
|
||
|
<td>New York</td>
|
||
|
<td>30</td>
|
||
|
<td>2011-09-03</td>
|
||
|
<td>$345,000</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Yuri Berry</td>
|
||
|
<td>Chief Marketing Officer (CMO)</td>
|
||
|
<td>New York</td>
|
||
|
<td>40</td>
|
||
|
<td>2009-06-25</td>
|
||
|
<td>$675,000</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Caesar Vance</td>
|
||
|
<td>Pre-Sales Support</td>
|
||
|
<td>New York</td>
|
||
|
<td>21</td>
|
||
|
<td>2011-12-12</td>
|
||
|
<td>$106,450</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Doris Wilder</td>
|
||
|
<td>Sales Assistant</td>
|
||
|
<td>Sydney</td>
|
||
|
<td>23</td>
|
||
|
<td>2010-09-20</td>
|
||
|
<td>$85,600</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Angelica Ramos</td>
|
||
|
<td>Chief Executive Officer (CEO)</td>
|
||
|
<td>London</td>
|
||
|
<td>47</td>
|
||
|
<td>2009-10-09</td>
|
||
|
<td>$1,200,000</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Gavin Joyce</td>
|
||
|
<td>Developer</td>
|
||
|
<td>Edinburgh</td>
|
||
|
<td>42</td>
|
||
|
<td>2010-12-22</td>
|
||
|
<td>$92,575</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Jennifer Chang</td>
|
||
|
<td>Regional Director</td>
|
||
|
<td>Singapore</td>
|
||
|
<td>28</td>
|
||
|
<td>2010-11-14</td>
|
||
|
<td>$357,650</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Brenden Wagner</td>
|
||
|
<td>Software Engineer</td>
|
||
|
<td>San Francisco</td>
|
||
|
<td>28</td>
|
||
|
<td>2011-06-07</td>
|
||
|
<td>$206,850</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Fiona Green</td>
|
||
|
<td>Chief Operating Officer (COO)</td>
|
||
|
<td>San Francisco</td>
|
||
|
<td>48</td>
|
||
|
<td>2010-03-11</td>
|
||
|
<td>$850,000</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Shou Itou</td>
|
||
|
<td>Regional Marketing</td>
|
||
|
<td>Tokyo</td>
|
||
|
<td>20</td>
|
||
|
<td>2011-08-14</td>
|
||
|
<td>$163,000</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Michelle House</td>
|
||
|
<td>Integration Specialist</td>
|
||
|
<td>Sydney</td>
|
||
|
<td>37</td>
|
||
|
<td>2011-06-02</td>
|
||
|
<td>$95,400</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Suki Burks</td>
|
||
|
<td>Developer</td>
|
||
|
<td>London</td>
|
||
|
<td>53</td>
|
||
|
<td>2009-10-22</td>
|
||
|
<td>$114,500</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Prescott Bartlett</td>
|
||
|
<td>Technical Author</td>
|
||
|
<td>London</td>
|
||
|
<td>27</td>
|
||
|
<td>2011-05-07</td>
|
||
|
<td>$145,000</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Gavin Cortez</td>
|
||
|
<td>Team Leader</td>
|
||
|
<td>San Francisco</td>
|
||
|
<td>22</td>
|
||
|
<td>2008-10-26</td>
|
||
|
<td>$235,500</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Martena Mccray</td>
|
||
|
<td>Post-Sales support</td>
|
||
|
<td>Edinburgh</td>
|
||
|
<td>46</td>
|
||
|
<td>2011-03-09</td>
|
||
|
<td>$324,050</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Unity Butler</td>
|
||
|
<td>Marketing Designer</td>
|
||
|
<td>San Francisco</td>
|
||
|
<td>47</td>
|
||
|
<td>2009-12-09</td>
|
||
|
<td>$85,675</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Howard Hatfield</td>
|
||
|
<td>Office Manager</td>
|
||
|
<td>San Francisco</td>
|
||
|
<td>51</td>
|
||
|
<td>2008-12-16</td>
|
||
|
<td>$164,500</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Hope Fuentes</td>
|
||
|
<td>Secretary</td>
|
||
|
<td>San Francisco</td>
|
||
|
<td>41</td>
|
||
|
<td>2010-02-12</td>
|
||
|
<td>$109,850</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Vivian Harrell</td>
|
||
|
<td>Financial Controller</td>
|
||
|
<td>San Francisco</td>
|
||
|
<td>62</td>
|
||
|
<td>2009-02-14</td>
|
||
|
<td>$452,500</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Timothy Mooney</td>
|
||
|
<td>Office Manager</td>
|
||
|
<td>London</td>
|
||
|
<td>37</td>
|
||
|
<td>2008-12-11</td>
|
||
|
<td>$136,200</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Jackson Bradshaw</td>
|
||
|
<td>Director</td>
|
||
|
<td>New York</td>
|
||
|
<td>65</td>
|
||
|
<td>2008-09-26</td>
|
||
|
<td>$645,750</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Olivia Liang</td>
|
||
|
<td>Support Engineer</td>
|
||
|
<td>Singapore</td>
|
||
|
<td>64</td>
|
||
|
<td>2011-02-03</td>
|
||
|
<td>$234,500</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Bruno Nash</td>
|
||
|
<td>Software Engineer</td>
|
||
|
<td>London</td>
|
||
|
<td>38</td>
|
||
|
<td>2011-05-03</td>
|
||
|
<td>$163,500</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Sakura Yamamoto</td>
|
||
|
<td>Support Engineer</td>
|
||
|
<td>Tokyo</td>
|
||
|
<td>37</td>
|
||
|
<td>2009-08-19</td>
|
||
|
<td>$139,575</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Thor Walton</td>
|
||
|
<td>Developer</td>
|
||
|
<td>New York</td>
|
||
|
<td>61</td>
|
||
|
<td>2013-08-11</td>
|
||
|
<td>$98,540</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Finn Camacho</td>
|
||
|
<td>Support Engineer</td>
|
||
|
<td>San Francisco</td>
|
||
|
<td>47</td>
|
||
|
<td>2009-07-07</td>
|
||
|
<td>$87,500</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Serge Baldwin</td>
|
||
|
<td>Data Coordinator</td>
|
||
|
<td>Singapore</td>
|
||
|
<td>64</td>
|
||
|
<td>2012-04-09</td>
|
||
|
<td>$138,575</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Zenaida Frank</td>
|
||
|
<td>Software Engineer</td>
|
||
|
<td>New York</td>
|
||
|
<td>63</td>
|
||
|
<td>2010-01-04</td>
|
||
|
<td>$125,250</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Zorita Serrano</td>
|
||
|
<td>Software Engineer</td>
|
||
|
<td>San Francisco</td>
|
||
|
<td>56</td>
|
||
|
<td>2012-06-01</td>
|
||
|
<td>$115,000</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Jennifer Acosta</td>
|
||
|
<td>Junior Javascript Developer</td>
|
||
|
<td>Edinburgh</td>
|
||
|
<td>43</td>
|
||
|
<td>2013-02-01</td>
|
||
|
<td>$75,650</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Cara Stevens</td>
|
||
|
<td>Sales Assistant</td>
|
||
|
<td>New York</td>
|
||
|
<td>46</td>
|
||
|
<td>2011-12-06</td>
|
||
|
<td>$145,600</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Hermione Butler</td>
|
||
|
<td>Regional Director</td>
|
||
|
<td>London</td>
|
||
|
<td>47</td>
|
||
|
<td>2011-03-21</td>
|
||
|
<td>$356,250</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Lael Greer</td>
|
||
|
<td>Systems Administrator</td>
|
||
|
<td>London</td>
|
||
|
<td>21</td>
|
||
|
<td>2009-02-27</td>
|
||
|
<td>$103,500</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Jonas Alexander</td>
|
||
|
<td>Developer</td>
|
||
|
<td>San Francisco</td>
|
||
|
<td>30</td>
|
||
|
<td>2010-07-14</td>
|
||
|
<td>$86,500</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Shad Decker</td>
|
||
|
<td>Regional Director</td>
|
||
|
<td>Edinburgh</td>
|
||
|
<td>51</td>
|
||
|
<td>2008-11-13</td>
|
||
|
<td>$183,000</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Michael Bruce</td>
|
||
|
<td>Javascript Developer</td>
|
||
|
<td>Singapore</td>
|
||
|
<td>29</td>
|
||
|
<td>2011-06-27</td>
|
||
|
<td>$183,000</td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Donna Snider</td>
|
||
|
<td>Customer Support</td>
|
||
|
<td>New York</td>
|
||
|
<td>27</td>
|
||
|
<td>2011-01-25</td>
|
||
|
<td>$112,000</td>
|
||
|
</tr>
|
||
|
</tbody>
|
||
|
<tfoot>
|
||
|
<tr>
|
||
|
<th>Name</th>
|
||
|
<th>Position</th>
|
||
|
<th>Office</th>
|
||
|
<th>Age</th>
|
||
|
<th>Start date</th>
|
||
|
<th>Salary</th>
|
||
|
</tr>
|
||
|
</tfoot>
|
||
|
</table>
|
||
|
</div>
|
||
|
<ul class="dt-tabs">
|
||
|
<li class="active">Javascript</li>
|
||
|
<li>HTML</li>
|
||
|
<li>CSS</li>
|
||
|
<li>Ajax</li>
|
||
|
<li>Server-side script</li>
|
||
|
</ul>
|
||
|
<div class="dt-tabs">
|
||
|
<div class="js">
|
||
|
<p>The Javascript shown below is used to initialise the table shown in this example:</p>
|
||
|
<div id="js-jquery">
|
||
|
<code class="multiline language-js">var states = new IDBStore({
|
||
|
dbVersion: 1,
|
||
|
storeName: 'states',
|
||
|
keyPath: 'identifier',
|
||
|
onStoreReady: function () {
|
||
|
initDataTable();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
function initDataTable() {
|
||
|
// We need to wait for the database to be ready as the load will run straight away
|
||
|
$('#example').DataTable({
|
||
|
layout: {
|
||
|
topStart: {
|
||
|
buttons: [
|
||
|
'createState',
|
||
|
{
|
||
|
extend: 'savedStates',
|
||
|
config: {
|
||
|
ajax: function (data, callback) {
|
||
|
// Action to take if loading states into staterestore
|
||
|
if (data.action === 'load') {
|
||
|
var reloadStates = (loadData) => {
|
||
|
// Manipulate the data into the structure expected by the callback
|
||
|
var cbData = {};
|
||
|
for (var i = 0; i < loadData.length; i++) {
|
||
|
// Convert back from the string created when saving
|
||
|
cbData[loadData[i].identifier] = JSON.parse(
|
||
|
loadData[i].state
|
||
|
);
|
||
|
}
|
||
|
|
||
|
// Load states into StateRestore
|
||
|
callback(cbData);
|
||
|
};
|
||
|
|
||
|
states.getAll(reloadStates);
|
||
|
}
|
||
|
// Action to take if renaming states
|
||
|
else if (data.action === 'rename') {
|
||
|
// Get all of the state identifiers
|
||
|
var ids = Object.keys(data.stateRestore);
|
||
|
for (var i = 0; i < ids.length; i++) {
|
||
|
var savesuccess = (saveData) => {
|
||
|
// Remove the record with the current identifier
|
||
|
states.remove(saveData.identifier);
|
||
|
// Add a new record with the updated identifier that uses the old state
|
||
|
states.put({
|
||
|
identifier: data.stateRestore[saveData.identifier],
|
||
|
state: saveData.state
|
||
|
});
|
||
|
};
|
||
|
|
||
|
states.get(ids[i], savesuccess);
|
||
|
}
|
||
|
callback();
|
||
|
}
|
||
|
// Action to take if removing states
|
||
|
else if (data.action === 'remove') {
|
||
|
var ids = Object.keys(data.stateRestore);
|
||
|
for (var i = 0; i < ids.length; i++) {
|
||
|
// Remove all of the states listed in the object
|
||
|
states.remove(ids[i]);
|
||
|
}
|
||
|
callback();
|
||
|
}
|
||
|
// Action to take if saving states
|
||
|
else if (data.action === 'save') {
|
||
|
var ids = Object.keys(data.stateRestore);
|
||
|
for (var i = 0; i < ids.length; i++) {
|
||
|
// Add all of the states listed in the object
|
||
|
// Important to convert state to a string as it is too complex for IndexedDB to handle
|
||
|
states.put({
|
||
|
identifier: ids[i],
|
||
|
state: JSON.stringify(data.stateRestore[ids[i]])
|
||
|
});
|
||
|
}
|
||
|
callback();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
}</code>
|
||
|
</div>
|
||
|
<div id="js-vanilla">
|
||
|
<code class="multiline language-js">var states = new IDBStore({
|
||
|
dbVersion: 1,
|
||
|
storeName: 'states',
|
||
|
keyPath: 'identifier',
|
||
|
onStoreReady: function () {
|
||
|
initDataTable();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
function initDataTable() {
|
||
|
// We need to wait for the database to be ready as the load will run straight away
|
||
|
new DataTable('#example', {
|
||
|
layout: {
|
||
|
topStart: {
|
||
|
buttons: [
|
||
|
'createState',
|
||
|
{
|
||
|
extend: 'savedStates',
|
||
|
config: {
|
||
|
ajax: function (data, callback) {
|
||
|
// Action to take if loading states into staterestore
|
||
|
if (data.action === 'load') {
|
||
|
var reloadStates = (loadData) => {
|
||
|
// Manipulate the data into the structure expected by the callback
|
||
|
var cbData = {};
|
||
|
for (var i = 0; i < loadData.length; i++) {
|
||
|
// Convert back from the string created when saving
|
||
|
cbData[loadData[i].identifier] = JSON.parse(
|
||
|
loadData[i].state
|
||
|
);
|
||
|
}
|
||
|
|
||
|
// Load states into StateRestore
|
||
|
callback(cbData);
|
||
|
};
|
||
|
|
||
|
states.getAll(reloadStates);
|
||
|
}
|
||
|
// Action to take if renaming states
|
||
|
else if (data.action === 'rename') {
|
||
|
// Get all of the state identifiers
|
||
|
var ids = Object.keys(data.stateRestore);
|
||
|
for (var i = 0; i < ids.length; i++) {
|
||
|
var savesuccess = (saveData) => {
|
||
|
// Remove the record with the current identifier
|
||
|
states.remove(saveData.identifier);
|
||
|
// Add a new record with the updated identifier that uses the old state
|
||
|
states.put({
|
||
|
identifier: data.stateRestore[saveData.identifier],
|
||
|
state: saveData.state
|
||
|
});
|
||
|
};
|
||
|
|
||
|
states.get(ids[i], savesuccess);
|
||
|
}
|
||
|
callback();
|
||
|
}
|
||
|
// Action to take if removing states
|
||
|
else if (data.action === 'remove') {
|
||
|
var ids = Object.keys(data.stateRestore);
|
||
|
for (var i = 0; i < ids.length; i++) {
|
||
|
// Remove all of the states listed in the object
|
||
|
states.remove(ids[i]);
|
||
|
}
|
||
|
callback();
|
||
|
}
|
||
|
// Action to take if saving states
|
||
|
else if (data.action === 'save') {
|
||
|
var ids = Object.keys(data.stateRestore);
|
||
|
for (var i = 0; i < ids.length; i++) {
|
||
|
// Add all of the states listed in the object
|
||
|
// Important to convert state to a string as it is too complex for IndexedDB to handle
|
||
|
states.put({
|
||
|
identifier: ids[i],
|
||
|
state: JSON.stringify(data.stateRestore[ids[i]])
|
||
|
});
|
||
|
}
|
||
|
callback();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
}</code>
|
||
|
</div>
|
||
|
<p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p>
|
||
|
<ul id="js-lib-files"></ul>
|
||
|
</div>
|
||
|
<div class="table">
|
||
|
<p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p>
|
||
|
</div>
|
||
|
<div class="css">
|
||
|
<div>
|
||
|
<p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The
|
||
|
additional CSS used is shown below:</p><code class="multiline language-css"></code>
|
||
|
</div>
|
||
|
<p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p>
|
||
|
<ul id="css-lib-files"></ul>
|
||
|
</div>
|
||
|
<div class="ajax">
|
||
|
<p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is
|
||
|
loaded.</p>
|
||
|
</div>
|
||
|
<div class="php">
|
||
|
<p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side
|
||
|
processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables
|
||
|
documentation</a>.</p>
|
||
|
</div>
|
||
|
</div>
|
||
|
</section>
|
||
|
</div>
|
||
|
<section>
|
||
|
<div class="footer">
|
||
|
<div class="gradient"></div>
|
||
|
<div class="liner">
|
||
|
<h2>Other examples</h2>
|
||
|
<div class="toc">
|
||
|
<div class="toc-group">
|
||
|
<h3><a href="./index.html">Initialisation and options</a></h3>
|
||
|
<ul class="toc active">
|
||
|
<li>
|
||
|
<a href="./simple.html">Basic StateRestore Example</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="./alternative.html">Alternative UI</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="./api.html">Basic StateRestore Example - API</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="./customSplit.html">Custom Split Buttons</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="./removeAll.html">Remove All Button</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="./ajax.html">Ajax Loading and Saving</a>
|
||
|
</li>
|
||
|
<li class="active">
|
||
|
<a href="./ajaxFunction.html">Ajax Function</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="./predefined.html">Predefined States</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="./predefinedAjax.html">Predefined States from Ajax</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="./predefinedAjaxNoSave.html">Predefined States - No Save, Remove, Rename or Create</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="./noCreation.html">No state creation</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="./noRemoval.html">No state remove</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="./noRenaming.html">No state renaming</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="./noSaving.html">No state saving</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="./noButtons.html">No Buttons</a>
|
||
|
</li>
|
||
|
</ul>
|
||
|
</div>
|
||
|
<div class="toc-group">
|
||
|
<h3><a href="../customisation/index.html">Customisation</a></h3>
|
||
|
<ul class="toc">
|
||
|
<li>
|
||
|
<a href="../customisation/activeLabel.html">Label to Display Active States</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="../customisation/creationModal.html">Creation Modal</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="../customisation/customStateData.html">Custom State Data</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="../customisation/columns.html">Creation Modal with Toggle for Columns</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="../customisation/creationModalToggle.html">Creation Modal with Toggle</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="../customisation/i18n.html">StateRestore Language Options</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="../customisation/stateCount.html">Custom Button Text</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="../customisation/noColumnSearch.html">Don't save column searches</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="../customisation/childRows.html">Child Rows</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="../customisation/noColumnVisibility.html">Don't save column visibility</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="../customisation/noOrder.html">Don't save ordering</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="../customisation/noLength.html">Don't save page length</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="../customisation/noPaging.html">Don't save paging</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="../customisation/noScroller.html">Don't save scroller</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="../customisation/noSearch.html">Don't save search</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="../customisation/noSearchBuilder.html">Don't save SearchBuilder</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="../customisation/noSearchPanes.html">Don't save SearchPanes</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="../customisation/noSelect.html">Don't save Selections</a>
|
||
|
</li>
|
||
|
</ul>
|
||
|
</div>
|
||
|
<div class="toc-group">
|
||
|
<h3><a href="../integration/index.html">Integration with other DataTables extensions</a></h3>
|
||
|
<ul class="toc">
|
||
|
<li>
|
||
|
<a href="../integration/preDefinedSearchPanes.html">Predefined SearchPanes State</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="../integration/scroller.html">Scroller Integration</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="../integration/searchBuilder.html">SearchBuilder Integration</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="../integration/searchPanes.html">SearchPanes Integration</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="../integration/select.html">Select Integration</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="../integration/colReorder.html">ColReorder Integration</a>
|
||
|
</li>
|
||
|
</ul>
|
||
|
</div>
|
||
|
<div class="toc-group">
|
||
|
<h3><a href="../styling/index.html">Styling</a></h3>
|
||
|
<ul class="toc">
|
||
|
<li>
|
||
|
<a href="../styling/bootstrap3.html">Bootstrap 3</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="../styling/bootstrap4.html">Bootstrap 4</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="../styling/bootstrap5.html">Bootstrap 5</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="../styling/bulma.html">Bulma</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="../styling/foundation.html">Foundation</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="../styling/jqueryui.html">JQuery UI</a>
|
||
|
</li>
|
||
|
<li>
|
||
|
<a href="../styling/semanticui.html">Fomantic-UI (formally Semantic-UI) styling</a>
|
||
|
</li>
|
||
|
</ul>
|
||
|
</div>
|
||
|
</div>
|
||
|
<div class="epilogue">
|
||
|
<p>Please refer to the <a href="https://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br>
|
||
|
Additionally, there are a wide range of <a href="https://www.datatables.net/extensions">extensions</a> and <a href=
|
||
|
"https://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of DataTables.</p>
|
||
|
<p class="copyright">DataTables designed and created by <a href="https://www.sprymedia.co.uk">SpryMedia Ltd</a> © 2007-2024<br>
|
||
|
DataTables is licensed under the <a href="https://www.datatables.net/mit">MIT license</a>.</p>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
</section>
|
||
|
</body>
|
||
|
</html>
|