/**
* Javascript code needed to build tables in WordPress with jQuery DataTables.
*
* @author Peter Schulz
* @since 1.0.0
*/
if (typeof Object.assign != 'function') {
// IE
Object.assign = function(target, varArgs) { // .length of function is 2
'use strict';
var to = Object(target);
for (var index = 1; index < arguments.length; index++) {
var nextSource = arguments[index];
if (nextSource != null) { // Skip over if undefined or null
for (var nextKey in nextSource) {
// Avoid bugs when hasOwnProperty is shadowed
if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
to[nextKey] = nextSource[nextKey];
}
}
}
}
return to;
};
}
function wpda_datatables_ajax_call(
columnsvar, database, table_name, columns,
responsive, responsive_popup_title, responsive_type, responsive_icon,
language, sql_orderby,
table_options_searching, table_options_ordering, table_options_paging, table_options_advanced,
pub_id, pub_show_advanced_settings, modal_hyperlinks,
filter_field_name, filter_field_value,
nl2br, buttons, read_more, calc_estimate, geo_search, geo_search_options,
wpnonce, pub_id_seq
) {
/*
* display possible values:
* childrow = user toggled
* childrowimmediate = show
* modal = show details in modal window
*/
/*
* type possible values:
* column = no control element
* inline = show control element
*/
var show_more_text = 'SHOW MORE';
var end_of_list_text = 'END OF LIST';
if (
table_options_advanced !== null &&
table_options_advanced.show_more_text !== undefined
) {
show_more_text = table_options_advanced.show_more_text
}
if (
table_options_advanced !== null &&
table_options_advanced.end_of_list_text !== undefined
) {
end_of_list_text = table_options_advanced.end_of_list_text
}
var responsive_control_type = "inline";
if (responsive_icon !== "yes") {
responsive_control_type = "column";
}
var childrow = {
details: {
display: jQuery.fn.dataTable.Responsive.display.childRow,
renderer: function (api, rowIdx, columns) {
var data = jQuery.map(
columns, function (col, i) {
if (!col.hidden ) {
return '';
}
if (columnsvar[i].className==='wpda_select') {
return '';
}
if (pub_show_advanced_settings==='Never' && modal_hyperlinks.includes(i)) {
return '';
}
if (pub_show_advanced_settings==='If not listed' && modal_hyperlinks.includes(i) && !col.hidden) {
return '';
}
return '
' +
'| ' + columnsvar[i].label + ' | ' +
'' + col.data + ' | ' +
'
';
}
).join( '' );
var datatable = '';
var table = '| ' + datatable + ' |
';
return jQuery( '' ).append( table );
},
type: responsive_control_type
}
};
var childrowimmediate = {
details: {
display: jQuery.fn.dataTable.Responsive.display.childRowImmediate,
renderer: function (api, rowIdx, columns) {
var data = jQuery.map(
columns, function (col, i) {
if (!col.hidden ) {
return '';
}
if (columnsvar[i].className==='wpda_select') {
return '';
}
if (pub_show_advanced_settings==='Never' && modal_hyperlinks.includes(i)) {
return '';
}
if (pub_show_advanced_settings==='If not listed' && modal_hyperlinks.includes(i) && !col.hidden) {
return '';
}
return '' +
'| ' + columnsvar[i].label + ' | ' +
'' + col.data + ' | ' +
'
';
}
).join( '' );
var datatable = '';
var table = '| ' + datatable + ' |
';
return jQuery( '' ).append( table );
},
type: responsive_control_type
}
};
var modal = {
details: {
display: jQuery.fn.dataTable.Responsive.display.modal(
{
header: function (row) {
if (table_options_advanced.css_classes) {
return "" + responsive_popup_title + "";
} else {
return responsive_popup_title;
}
},
modal: {
modal: true,
draggable: false,
resizable: false,
width: "fit-content",
position: {
my: "left top",
at: "left bottom"
}
}
}
),
renderer: function (api, rowIdx, columns) {
let data = jQuery.map(
columns, function (col, i) {
if (columnsvar[i].className==='wpda_select') {
return '';
}
if (pub_show_advanced_settings==='Never' && modal_hyperlinks.includes(i)) {
return '';
}
if (pub_show_advanced_settings==='If not listed' && modal_hyperlinks.includes(i) && !col.hidden) {
return '';
}
let html =
`
| ${columnsvar[i].label} |
${col.data} |
`;
return html;
}
).join( '' );
if (table_options_advanced.primary_css_classes!==undefined) {
cssClasses = table_options_advanced.primary_css_classes;
} else {
cssClasses = "";
if (window.top['wpda_publication_primary_css_classes']!==undefined) {
// CSS added from style manager.
cssClasses = window.top['wpda_publication_primary_css_classes'];
}
}
let modalClasses = `wpda-child-table display dataTable ${cssClasses}`;
let modalButtonClasses = "button dtr-modal-close";
if (jQueryDataTablesDefaultOptions.wpda_styling==="jqueryui") {
modalClasses = "ui-widget-content";
modalButtonClasses = "ui-button fg-button uit-state-default wpda-close-button";
}
if (
table_options_advanced.primary_add_modal_header===true ||
window.top['wpda_publication_primary_css_classes']!==undefined
) {
data =
`| | |
${data}
| | |
`;
}
let datatable = ``;
let label = "Close";
if (api.settings()[0]?.oLanguage?.editor?.close!==undefined) {
label = api.settings()[0]?.oLanguage.editor.close;
}
var footer =
` |
`;
var table =
`| ${datatable} |
${footer}`;
return jQuery( '' ).append( table );
},
type: responsive_control_type
}
};
var responsive_value = false;
if (responsive === 'yes') {
switch (responsive_type) {
case "modal":
responsive_value = modal;
break;
case "expanded":
responsive_value = childrowimmediate;
break;
default:
/* collapsed */
responsive_value = childrow;
}
}
orderby = [];
if ( sql_orderby != '') {
sql_orderby.split("|").forEach(function (item) {
orderby_array = item.split(",");
orderby.push(orderby_array);
});
}
var jQueryDataTablesUserOptions = {
searching: table_options_searching,
ordering: table_options_ordering,
paging: table_options_paging
};
if (!table_options_paging) {
jQueryDataTablesUserOptions.serverSide = false;
}
// Allow user to use more button to load additional rows
var more_rows = [];
var more_start = 0;
var more_limit = 10;
var more_new = true;
// Prevent counting on each request to improve performance
var wpda_paginationButtonPressed = false;
if (table_options_advanced!==null && table_options_advanced.pageLength!==undefined && !isNaN(table_options_advanced.pageLength)) {
more_limit = table_options_advanced.pageLength;
}
if (
table_options_advanced!==null &&
(
table_options_advanced.wpda_use_estimates_only===true ||
table_options_advanced.wpda_use_estimates_only==="true"
)
) {
table_options_advanced.pagingType = "simple_numbers";
jQuery.fn.DataTable.ext.pager.numbers_length = 7;
}
var jQueryDataTablesDefaultOptions = {
responsive: responsive_value,
processing: true,
serverSide: true,
stateSave: false,
bAutoWidth: false,
columnDefs: columnsvar,
order: orderby,
buttons: buttons,
searchBuilder: {
enterSearch: true,
depthLimit: 2
},
ajax: {
method: "POST",
url: wpda_publication_vars.wpda_ajaxurl,
data: function(data, event) {
data.action ="wpda_datatables";
data.wpnonce = wpnonce;
data.pubid = pub_id;
if (pub_id=='0') {
// For backward compatibility
data.wpdasrc = database;
data.wpdatabs = table_name;
data.wpdacols = columns;
}
data.filter_field_name = filter_field_name;
data.filter_field_value = filter_field_value;
data.nl2br = nl2br;
if (table_options_advanced!==null && table_options_advanced.wpda_use_estimates_only!==undefined) {
data.wpda_use_estimates_only = table_options_advanced.wpda_use_estimates_only;
}
if (read_more==="true") {
if (more_new) {
more_start = 0;
} else {
more_start += more_limit;
}
data.more_start = more_start;
data.more_limit = more_limit;
}
jQuery.each(window.location.search.replace('?','').split('&'), function(index, val) {
var urlparam = val.split('=');
if (urlparam.length===2) {
if (urlparam[0].substring(0, 19) === 'wpda_search_column_') {
urlParameterValue = urlparam[1].toString().replace(/%/g, "%25")
urlParameterValue = urlParameterValue.replace(/%2525/g, "%25")
data[urlparam[0]] = decodeURIComponent(urlParameterValue);
}
}
});
var wpda_post_vars_name = table_name + "_" + pub_id + "_args";
if (window[wpda_post_vars_name] && Array.isArray(window[wpda_post_vars_name])) {
for (let i=0; i0) {
let sb = table.searchBuilder.getDetails();
function updateColumnNames(obj) {
for (const property in obj) {
if (obj.criteria!==undefined && Array.isArray(obj.criteria)) {
for (let i = 0; i < obj.criteria.length; i++) {
let columnName = jQuery("div.dtsb-searchBuilder select.dtsb-data option:selected:contains(" + obj.criteria[i].data + ")").val();
if (columnName!==undefined) {
columnName = jQueryDataTablesDefaultOptions.columnDefs[columnName].name;
if (columnName!==undefined) {
obj.criteria[i].origData = columnName;
}
}
}
}
}
return obj;
}
searchBuilder = updateColumnNames(sb);
}
args.msg = {
filter_args: filter_args,
searchPanes: searchPanes,
searchBuilder: searchBuilder
};
// console.log(args);
if (typeof wpdaproGetGeoData==="function") {
wpdaproGetGeoData(args);
}
if (unit==='mile') {
jQuery(".wpda_geo_unit").html(" (mi)");
} else {
jQuery(".wpda_geo_unit").html(" (km)");
}
if (
jQueryDataTablesDefaultOptions.wpda_geo.geo_marker_column === 0 ||
(
jQueryDataTablesDefaultOptions.wpda_geo.geo_marker_column &&
!isNaN(jQueryDataTablesDefaultOptions.wpda_geo.geo_marker_column)
)
) {
var labelIndex = 0;
for (var i=0; i' + String.fromCharCode(65+labelIndex) + '';
node.append(marker);
labelIndex++;
}
}
}
}
}
if (buttons.length > 0) {
jQuery("#" + table_name + pub_id + pub_id_seq).find("td").on("click", function(e) {
if (jQuery(this).hasClass("dtr-control")) {
table = jQuery("#" + table_name + pub_id + pub_id_seq).DataTable();
if (!table.responsive.hasHidden()) {
// Overwrite default icon behaviour
selectedRows = table.row({selected : true});
if (selectedRows[0].includes(this._DT_CellIndex.row)) {
table.row(':eq(' + this._DT_CellIndex.row + ')', { page: 'current' }).deselect();
} else {
table.row(':eq(' + this._DT_CellIndex.row + ')', { page: 'current' }).select();
}
}
}
});
}
if (
jQueryDataTablesDefaultOptions.wpda_use_estimates_only===true ||
jQueryDataTablesDefaultOptions.wpda_use_estimates_only==="true"
) {
if (jQuery("#" + table_name + pub_id + pub_id_seq + "_paginate span a").length>0) {
// default, compact, jQueryUI
jQuery("#" + table_name + pub_id + pub_id_seq + "_paginate span a:last-child").hide();
} else if (jQuery("#" + table_name + pub_id + pub_id_seq + "_paginate ul").length>0) {
// foundation, bootstrap3, bootstrap4
jQuery("#" + table_name + pub_id + pub_id_seq + "_paginate ul li:nth-last-child(2)").hide();
} else {
// semantic
jQuery("#" + table_name + pub_id + pub_id_seq + "_paginate a:nth-last-child(2)").hide();
}
}
if (jQueryDataTablesDefaultOptions.userDrawCallback) {
jQueryDataTablesDefaultOptions.userDrawCallback(settings);
}
var fncSetModalWidth = table_name + pub_id + pub_id_seq + "SetModalWidth";
if (typeof window[fncSetModalWidth] === "function") {
window[fncSetModalWidth]();
}
}
};
if ( typeof Object.assign != 'function' ) {
var jQueryDataTablesOptions = jQueryDataTablesDefaultOptions;
} else {
var jQueryDataTablesOptions = Object.assign(jQueryDataTablesDefaultOptions, jQueryDataTablesUserOptions);
}
convert_string_to_function(table_options_advanced);
jQueryDataTablesOptions = Object.assign(jQueryDataTablesOptions, table_options_advanced);
if (jQueryDataTablesOptions.language==undefined) {
jQueryDataTablesOptions.language = {};
}
jQueryDataTablesOptions.language.url = "https://cdn.datatables.net/plug-ins/1.13.1/i18n/" + language + ".json";
// console.log(jQueryDataTablesOptions);
jQuery("#" + table_name + pub_id + pub_id_seq).addClass('wpda-datatable');
jQuery("#" + table_name + pub_id + pub_id_seq).DataTable(jQueryDataTablesOptions);
jQuery("#" + table_name + pub_id + pub_id_seq).on("click", "tr", function () {
// Add actions to open modal
jQuery(".dtr-modal-display").draggable();
jQuery(".dtr-modal-display").resizable();
jQuery("body div.dtr-modal div.dtr-modal-display").css("top", function() {
var displayHeight = ( jQuery(window).height() - jQuery("body div.dtr-modal div.dtr-modal-display").height() ) / 2;
if (displayHeight<0) {
displayHeight = 0; // Just to be sure
}
return displayHeight + "px";
});
});
if (jQuery("#" + table_name + pub_id + "_more_button").length>0) {
// Add load more rows action
jQuery("#" + table_name + pub_id + "_more_button").on("click", function() {
more_new = false;
jQuery("#" + table_name + pub_id + pub_id_seq).DataTable().draw("page");
let scrolledHeight = jQuery("#" + table_name + pub_id + " tr").height() * 10;
window.scrollBy(0,scrolledHeight);
});
}
if (window.top['wpda_publication_status']!==undefined) {
window.top['wpda_publication_status']['completed'] = true;
}
}
function convert_string_to_function(obj) {
for (var prop in obj) {
if (typeof obj[prop]=='string') {
if (obj[prop].substr(0,8)=='function') {
fnc = obj[prop];
delete obj[prop];
var f = new Function("return " + fnc);
if (prop==="initComplete") {
// Plugin users cannot overwrite initComplete
prop = "userInitComplete";
}
if (prop==="drawCallback") {
// Plugin users cannot overwrite initComplete
prop = "userDrawCallback";
}
obj[prop] = f();
}
} else {
convert_string_to_function(obj[prop]);
}
}
}
function hide_header_and_footer_of_hidden_column(table_name, pub_id, pub_id_seq, i) {
// Hide labels of dynamic hyperlinks and double header rows
var tr_head0 = jQuery("#" + table_name + pub_id + pub_id_seq).find('thead tr').eq(0);
tr_head0.find('th').eq(i).hide();
tr_head0.find('td').eq(i).hide();
var tr_head1 = jQuery("#" + table_name + pub_id + pub_id_seq).find('thead tr').eq(1);
tr_head1.find('th').eq(i).hide();
tr_head1.find('td').eq(i).hide();
var tr_foot = jQuery("#" + table_name + pub_id + pub_id_seq).find('tfoot tr').eq(0);
tr_foot.find('th').eq(i).hide().find('td').eq(i).hide();
}
function post_publication_widget(table_name, pub_id) {
// responsive data table widgets do not rerender correctly with search box in header
jQuery("#" + table_name + pub_id + ' thead tr:last-child th').each(function(i) {
if (jQuery(this).is(":visible")) {
jQuery("#" + table_name + pub_id + ' thead tr:first-child td:nth-child(' + i + ')').show();
} else {
jQuery("#" + table_name + pub_id + ' thead tr:first-child td:nth-child(' + i + ')').hide();
}
});
}
function update_table(table_name, pub_id) {
jQuery("#" + table_name + pub_id).DataTable().draw();
}
var wpda_user_coords = null;
function wpda_get_user_location(table_name, pub_id) {
if (!navigator.geolocation) {
alert("Geolocation is not supported by your browser");
} else {
navigator.geolocation.getCurrentPosition(
function(pos) {
if (pos.coords===undefined) {
wpda_user_coords = null;
alert("ERROR - Could not determine user location");
} else {
wpda_user_coords = pos.coords;
update_table(table_name, pub_id);
}
},
function(err) {
wpda_user_coords = null;
alert("ERROR - " + err);
},
{
enableHighAccuracy: true,
timeout: 5000,
maximumAge: 0
}
);
}
}
/**
* Author: Charles Godwin
* @since 4.2.6
*/
function enterKeySearch(oSettings, options) {
sTableID = "#" + oSettings.sTableId;
jQuery(sTableID + "_filter input").off();
jQuery(sTableID + "_filter input").on("keyup", { sTableID: sTableID }, function (e) {
if (e.keyCode == 13) { /* Enter key */
jQuery(e.data.sTableID).DataTable().search(this.value).draw();
}
});
jQuery(sTableID + "_wrapper .wpda_search_textbox").off();
jQuery(sTableID + "_wrapper .wpda_search_textbox").on("keyup", { sTableID: sTableID }, function (e) {
if (e.keyCode == 13) { /* Enter key */
if (options.serverSide) {
jQuery(e.data.sTableID).DataTable().draw();
} else {
let idx = jQuery(e.data.sTableID).DataTable().column(jQuery(this).data("id")+":name").index();
jQuery(e.data.sTableID).DataTable().column(idx).search(this.value).draw();
}
}
});
searchListbox(sTableID, options);
}
function noEnterKeySearch(oSettings, options) {
sTableID = "#" + oSettings.sTableId;
jQuery(sTableID + "_wrapper .wpda_search_textbox").off();
jQuery(sTableID + "_wrapper .wpda_search_textbox").on("keyup", {sTableID: sTableID}, function (e) {
if (options.serverSide) {
jQuery(e.data.sTableID).DataTable().draw();
} else {
let idx = jQuery(e.data.sTableID).DataTable().column(jQuery(this).data("id") + ":name").index();
jQuery(e.data.sTableID).DataTable().column(idx).search(this.value).draw();
}
});
searchListbox(sTableID, options);
}
function searchListbox(sTableID, options) {
jQuery(sTableID + "_wrapper .wpda_search_listbox").off();
jQuery(sTableID + "_wrapper .wpda_search_listbox").on("change", { sTableID: sTableID }, function (e) {
if (options.serverSide) {
jQuery(e.data.sTableID).DataTable().draw();
} else {
let idx = jQuery(e.data.sTableID).DataTable().column(jQuery(this).data("id")+":name").index();
jQuery(e.data.sTableID).DataTable().column(idx).search('\\b' + this.value + '\\b', true, false).draw();
}
});
}