/** * 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 = '' + data + '
'; 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 '' + '' + '' + ''; } ).join( '' ); var datatable = '
' + columnsvar[i].label + '' + col.data + '
' + data + '
'; 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 = ``; 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 = `
${columnsvar[i].label} ${col.data}
  
  
${data}
`; 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(); } }); }