Fix DataTables initialization error on pay page
Resolves "Cannot set properties of undefined (setting '_DT_CellIndex')" error by modernizing DataTables API usage and handling Turbolinks properly. Changes: - Update to modern DataTables API (capital D DataTable() vs lowercase) - Add check for existing DataTable before initialization - Properly destroy and recreate DataTable on Turbolinks page loads - Replace deprecated fnClearTable() with table.clear() - Replace deprecated fnAddData() with table.row.add() + table.draw() - Create unified initializePage() function for both ready and turbolinks:load - Add autoWidth, searching, and ordering options to DataTable config The DataTable now initializes cleanly without errors and handles Turbolinks navigation properly. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -264,14 +264,38 @@ function buildDeleteLink(dd_id){
|
|||||||
*/
|
*/
|
||||||
function parseDirectDepostInfo(response){
|
function parseDirectDepostInfo(response){
|
||||||
var msg = jQuery.parseJSON(JSON.stringify(response));
|
var msg = jQuery.parseJSON(JSON.stringify(response));
|
||||||
|
var table = $('#data_table').DataTable();
|
||||||
|
|
||||||
$.each(msg.user, function(index, val){
|
$.each(msg.user, function(index, val){
|
||||||
$('#data_table').dataTable().fnAddData( [
|
table.row.add( [
|
||||||
'<code class="text-monospace">' + val.bank_account_num + '</code>',
|
'<code class="text-monospace">' + val.bank_account_num + '</code>',
|
||||||
'<span class="badge bg-light text-dark">' + val.bank_routing_num + '</span>',
|
'<span class="badge bg-light text-dark">' + val.bank_routing_num + '</span>',
|
||||||
'<span class="badge bg-success">' + val.percent_of_deposit + '%</span>',
|
'<span class="badge bg-success">' + val.percent_of_deposit + '%</span>',
|
||||||
buildDeleteLink(val.id)
|
buildDeleteLink(val.id)
|
||||||
] );
|
] );
|
||||||
});
|
});
|
||||||
|
|
||||||
|
table.draw();
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
createDataTable initializes the dd table as a datatable
|
||||||
|
*/
|
||||||
|
function createDataTable(){
|
||||||
|
// Check if DataTable is already initialized
|
||||||
|
if ($.fn.DataTable.isDataTable('#data_table')) {
|
||||||
|
$('#data_table').DataTable().destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#data_table').DataTable({
|
||||||
|
"sPaginationType": "full_numbers",
|
||||||
|
"language": {
|
||||||
|
"emptyTable": "No direct deposit accounts configured yet"
|
||||||
|
},
|
||||||
|
"autoWidth": false,
|
||||||
|
"searching": true,
|
||||||
|
"ordering": true
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -280,7 +304,9 @@ function parseDirectDepostInfo(response){
|
|||||||
with the response from the endpoint in order to populate the data table.
|
with the response from the endpoint in order to populate the data table.
|
||||||
*/
|
*/
|
||||||
function populateTable() {
|
function populateTable() {
|
||||||
$('#data_table').dataTable().fnClearTable();
|
var table = $('#data_table').DataTable();
|
||||||
|
table.clear();
|
||||||
|
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: <%= sanitize(user_pay_path(:format => "json", user_id: current_user.id, id: current_user.id).inspect) %>,
|
url: <%= sanitize(user_pay_path(:format => "json", user_id: current_user.id, id: current_user.id).inspect) %>,
|
||||||
type: "GET",
|
type: "GET",
|
||||||
@@ -293,18 +319,6 @@ function populateTable() {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
createDataTable initializes the dd table as a datatable
|
|
||||||
*/
|
|
||||||
function createDataTable(){
|
|
||||||
$('#data_table').dataTable({
|
|
||||||
"sPaginationType": "full_numbers",
|
|
||||||
"language": {
|
|
||||||
"emptyTable": "No direct deposit accounts configured yet"
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
This function doesn't really work right now but is supposed to offer the user a
|
This function doesn't really work right now but is supposed to offer the user a
|
||||||
"delete confirmation" message
|
"delete confirmation" message
|
||||||
@@ -426,19 +440,22 @@ function makeActive(){
|
|||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
1) makeActive - Adds the active class to the sidebar element
|
Initialize page - called on both ready and turbolinks:load
|
||||||
2) createDataTable - Initializes the dataTable as such
|
|
||||||
3) populateTable - populates the newly initialized dataTable
|
|
||||||
*/
|
*/
|
||||||
$(document).ready(function() {
|
function initializePage() {
|
||||||
makeActive();
|
makeActive();
|
||||||
createDataTable();
|
createDataTable();
|
||||||
populateTable();
|
populateTable();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle normal page loads
|
||||||
|
$(document).ready(function() {
|
||||||
|
initializePage();
|
||||||
});
|
});
|
||||||
|
|
||||||
// Handle Turbolinks page loads
|
// Handle Turbolinks page loads
|
||||||
$(document).on('turbolinks:load', function() {
|
$(document).on('turbolinks:load', function() {
|
||||||
makeActive();
|
initializePage();
|
||||||
});
|
});
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
Reference in New Issue
Block a user