HEX
Server: Apache/2.4.65 (Debian)
System: Linux 88f31f35b0b8 6.1.0-38-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.147-1 (2025-08-02) x86_64
User: www-data (33)
PHP: 8.2.29
Disabled: NONE
Upload Files
File: /var/www/html/wp-content/plugins/delete-duplicate-posts/js/delete-duplicate-posts.js
/* globals jQuery:true, ajaxurl:true, cp_ddp:true  */
jQuery(document).ready(function ($) {

	var startTime;
	var interval;

	ddp_refresh_log();

	var redirTable = jQuery('#ddp_redirtable').DataTable({
		"processing": true,
		"serverSide": true,
		"autoWidth": true,
		"ordering": true,
		"ajax": {
			"url": ajaxurl,
			"type": "POST",
			"data": function(d) {
				return jQuery.extend({}, d, {
					"action": "ddp_get_redirects",
					"_ajax_nonce": cp_ddp.nonce
				});
			},
			"dataSrc": function (json) {
				return json.data;
			}
		},
		"columns": [
			{ "data": "ID", "visible": false},
{ "data": "from_url", "title": cp_ddp.fromUrlTitle },
{ "data": "target_url", "title": cp_ddp.targetUrlTitle }
		],
		"select": {
			style: 'multi'
		},
		"dom": '<"top"Blfip>rt<"bottom"Blfip>',
		"buttons": [
			{
				text: 'Refresh',
				action: function ( e, dt, node, config ) {
					var $button = $(node);
					$button.prop('disabled', true).text(cp_ddp.refreshingText);
					dt.ajax.reload(function() {
						$button.prop('disabled', false).text(cp_ddp.refreshText);					});
				},
				className: 'button button-secondary button-small'
			}
			// ... other existing buttons ...
		],
		"pageLength": 10,
		"rowCallback": function (row, data) {
			jQuery(row).addClass('wp-list-table widefat fixed striped table-view-list');
		},
		"lengthMenu": [[10, 25, 50, 100, 250, 500], [10, 25, 50, 100, 250, 500]] 
	});

	// Custom error handling for redirTable
	redirTable.on('error.dt', function (e, settings, techNote, message) {
		e.preventDefault(); // Prevent default alert
		console.error('RedirectsDataTables error:', message, 'TechNote:', techNote);

// Use the variables in your code
var errorDetails = cp_ddp.errorDetailsText + message + (techNote ? ' (Tech note: ' + techNote + ')' : '');
jQuery("#ddp-dashboard .errormessage").html(cp_ddp.redirectsErrorText + errorDetails).show();

	});

	redirTable.buttons().container().appendTo('#ddp_redirtable_wrapper .top');

	var table = jQuery('#ddp_dupetable').DataTable({
		"select": {
			style: 'multi'
		},
		"autoWidth": true,
		"processing": true,
		language: {
processing: '<div id="processingMessage">' + cp_ddp.processingMessage + '</div>'		
},
		"serverSide": true,
		"searching": false,
		"ordering": false,
		"dom": '<"top"lip>rt<"bottom"ip><"clear">',
		"ajax": {
			"url": ajaxurl,
			"type": "POST",
			"data": function (d) {
				return jQuery.extend({}, d, {
					"action": "ddp_get_duplicates",
					"_ajax_nonce": cp_ddp.nonce
				});
			},
			"dataSrc": function (json) {
				if (json.error) {
					jQuery("#ddp-dashboard .errormessage").html(json.error).show();
					return [];
				}
				return json.data;
			},
			"beforeSend": function () {
				startTime = new Date().getTime();
				jQuery('#requestTime').html(cp_ddp.requestTimeText);
				interval = setInterval(updateTime, 1000);
				jQuery("#ddp_dupetable .dt-button").prop('disabled', true);
				jQuery('#ddp_dupetable tbody').css('opacity', '0.5');
			},
			"complete": function () {
				clearInterval(interval);
				jQuery('#ddp_dupetable tbody').css('opacity', '1');
				jQuery("#ddp_dupetable .dt-button").prop('disabled', false);
				ddp_refresh_log();
			},
			"error": function (jqXHR, textStatus, errorThrown) {
				console.error('AJAX error:', textStatus, errorThrown);
				var errorDetails = 'Status: ' + textStatus + ', Error: ' + errorThrown + ', Response: ' + jqXHR.responseText;

// Use the variables in your code
jQuery("#ddp-dashboard .errormessage").html(cp_ddp.failedToLoadDataText + errorDetails).show();
				return []; // Return empty data to prevent further errors
			}
		},
		"columns": [
			{ "data": "ID", "visible": false },
			{ "data": "orgID", "visible": false },
{ "data": "duplicate", "title": cp_ddp.duplicateTitle, "orderable": false },
{ "data": "original", "title": cp_ddp.originalTitle, "orderable": false }
		],
		"rowCallback": function (row) {
			jQuery(row).addClass('wp-list-table widefat fixed striped table-view-list');
		},
		"lengthMenu": [[10, 25, 50, 100, 250, 500], [10, 25, 50, 100, 250, 500]] 
	});

	// Custom error handling for table
	table.on('error.dt', function (e, settings, techNote, message) {
		e.preventDefault(); // Prevent default alert
		// console.error('DataTables error:', message, 'TechNote:', techNote);
		var errorDetails = 'Error details: ' + message + (techNote ? ' (Tech note: ' + techNote + ')' : '');
		jQuery("#ddp-dashboard .errormessage").html("DataTables error occurred. " + errorDetails).show();
	});

	// Suppress all DataTables alert dialogs globally
	$.fn.dataTable.ext.errMode = 'none';

	// Create and insert buttons
	var buttonsDiv = createButtons();
	buttonsDiv.insertBefore('#ddp_dupetable_paginate');

	/**
	 * refreshTable.
	 *
	 * @author	Lars Koudal
	 * @since	v0.0.1
	 * @version	v1.0.0	Friday, January 5th, 2024.
	 * @return	void
	 */
	function refreshTable() {
		table.ajax.reload();
	}

	/**
	 * deleteSelected.
	 *
	 * @author	Lars Koudal
	 * @since	v0.0.1
	 * @version	v1.0.0	Friday, January 5th, 2024.
	 * @global
	 * @return	void
	 */
	function deleteSelected() {
		var selectedRows = table.rows({ selected: true }).data();

		// Check if there are any selected rows
		if (selectedRows.length === 0) {
			alert(cp_ddp.selectRowAlert);
				return;
		}

		// Existing confirmation and deletion code
		if (!confirm(cp_ddp.text_areyousure)) {
				return;
		}
		
		var checked_posts = [];
		jQuery.each(selectedRows, function(index, value) {
				checked_posts.push({
						'ID': value.ID,
						'orgID': value.orgID
				});
		});

		jQuery.ajax({
			type: 'POST',
			url: ajaxurl,
			data: {
					'_ajax_nonce': cp_ddp.deletedupes_nonce,
					'action': 'ddp_delete_duplicates',
					'checked_posts': checked_posts
			},
			success: function (response) {
				if (response.success) {
					table.ajax.reload(null, false);
					ddp_refresh_log();
				} else {
					var errorMessage = response.data && response.data.message ? response.data.message : "Unknown error occurred";
					alert(cp_ddp.serverResponseText + errorMessage);
				}
			},
			error: function (jqXHR, textStatus, errorThrown) {
				// Handle other types of errors (e.g., network errors, server errors)
				alert(cp_ddp.errorOccurredText + ' ' + textStatus);
			}
		});
	}

	/**
	 * selectVisible.
	 *
	 * @author	Lars Koudal
	 * @since	v0.0.1
	 * @version	v1.0.0	Friday, January 5th, 2024.
	 * @global
	 * @return	void
	 */
	function selectVisible() {
		table.rows({ page: 'current' }).select();
	}

	/**
	 * selectNone.
	 *
	 * @author	Lars Koudal
	 * @since	v0.0.1
	 * @version	v1.0.0	Friday, January 5th, 2024.
	 * @global
	 * @return	void
	 */
	function selectNone() {
		table.rows().deselect();
	}

	/**
	 * createButtons.
	 *
	 * @author	Lars Koudal
	 * @since	v0.0.1
	 * @version	v1.0.0	Friday, January 5th, 2024.
	 * @global
	 * @return	mixed
	 */
	function createButtons() {
		var buttonsDiv = jQuery('<div/>', { class: 'dt-buttons' });

		buttonsDiv.append(jQuery('<button/>', {
			text: cp_ddp.refreshText,
			click: refreshTable,
			class: 'dt-button button button-secondary button-small'
		}));

		buttonsDiv.append(jQuery('<button/>', {
			text: cp_ddp.deleteSelectedText,
			click: deleteSelected,
			class: 'dt-button button button-secondary button-small ddp-delete-selected'
		}));

		buttonsDiv.append(jQuery('<button/>', {
			text: cp_ddp.selectVisibleText,
			click: selectVisible,
			class: 'dt-button button button-secondary button-small'
		}));

		buttonsDiv.append(jQuery('<button/>', {
			text: cp_ddp.selectNoneText,
			click: selectNone,
			class: 'dt-button button button-secondary button-small'
		}));

		return buttonsDiv;
	}

	/**
	 * updateTime.
	 *
	 * @author	Unknown
	 * @since	v0.0.1
	 * @version	v1.0.0	Tuesday, October 31st, 2023.
	 * @global
	 * @return	void
	 */
	function updateTime() {
		var currentTime = new Date().getTime();
		var elapsedTime = (currentTime - startTime) / 1000;
		jQuery('#requestTime').html(cp_ddp.requestTimeText + elapsedTime + " sec.");
		jQuery('#processingMessage').html(cp_ddp.processingMessage + elapsedTime + " sec.");
		
	}

	/**
	 * Add event listener for row selection
	 *
	 * @var		mixed	#ddp_dupetabl
	 * @global
	 */
	jQuery('#ddp_dupetable tbody').on('click', 'tr', function () {
		jQuery(this).toggleClass('selected');
	});

	// REFRESH LIST
	jQuery(document).on('click', '#deleteduplicateposts_resetview', function (e) {
		e.preventDefault();
		jQuery('#ddp_container .dupelist .duplicatetable tbody').empty();
		ddp_get_duplicates(1, senddata);
		ddp_refresh_log();
	});

	/**
	 * ddp_refresh_log.
	 *
	 * @author	Lars Koudal
	 * @since	v0.0.1
	 * @version	v1.0.0	Sunday, January 10th, 2021.
	 * @return	void
	 */
	function ddp_refresh_log() {
		jQuery('#ddp_log').empty();
		jQuery.ajax({
			type: 'POST',
			url: ajaxurl,
			data: {
				'_ajax_nonce': cp_ddp.loglines_nonce,
				'action': 'ddp_get_loglines'
			},
			dataType: "json",
			success: function (response) {
				let loglines = response.data.results;
				if (loglines) {
					jQuery.each(loglines, function (key, value) {
						jQuery('#ddp_log').append('<li><code>' + value.datime + '</code> ' + value.note + '</li>');
					});
				}
				jQuery('#log .spinner').removeClass('is-active');
			}
		}).fail(function (response) {
			jQuery('#log .spinner').removeClass('is-active');
			if (window.console && window.console.log) {
				window.console.log(response.statusCode + ' ' + response.statusText);
			}
		});
	}

	/**
	 * ddp_get_duplicates.
	 *
	 * @author	Lars Koudal
	 * @since	v0.0.1
	 * @version	v1.0.0	Sunday, January 10th, 2021.	
	 * @version	v1.0.1	Thursday, June 9th, 2022.
	 * @param	mixed	stepid	- integer, starts at 1
	 * @param	mixed	data  	
	 * @param	mixed	self  	
	 * @return	void
	 */
	function ddp_get_duplicates(stepid, data, self) {
		jQuery.ajax({ 
			type: 'POST',
			url: ajaxurl,
			data: {
				'_ajax_nonce': cp_ddp.nonce,
				'action': 'ddp_get_duplicates',
				'stepid': stepid
			},
			dataType: "json",
			success: function (response) {
				let dupes = response.data.dupes;

				if (dupes) {
					jQuery('#ddp_container #dashboard .statusdiv .statusmessage').html(response.data.msg).show();
					jQuery('#ddp_container #dashboard .statusdiv .dupelist .duplicatetable').show();

					jQuery.each(dupes, function (key, value) {
						jQuery('#ddp_container #dashboard .statusdiv .dupelist .duplicatetable tbody').append('<tr><th scope="row" class="check-column"><label class="screen-reader-text" for="cb-select-' + value.ID + '">Select Post</label><input id="cb-select-' + value.ID + '" type="checkbox" name="delpost[]" value="' + value.ID + '" data-orgid="' + value.orgID + '"><div class="locked-indicator"></div></th><td><a href="' + value.permalink + '" target="_blank">' + value.title + '</a> (ID #' + value.ID + ' type:' + value.type + ' status:' + value.status + ')</td><td><a href="' + value.orgpermalink + '" target="_blank">' + value.orgtitle + '</a> (ID #' + value.orgID + ') ' + value.why + '</td></tr>');
					});

					jQuery('#ddp_container #dashboard .statusdiv .dupelist .duplicatetable tbody').slideDown();
				}
				else {
					jQuery('#ddp_container #dashboard .statusdiv .statusmessage').html(response.data.msg).show();
				}
				if ('-1' == response.data.nextstep) {
					// Something went wrong.
					jQuery('#ddp_container #dashboard .statusdiv .errormessage').text(cp_ddp.somethingWentWrongText).show();
								}
				else {
					if (parseInt(response.data.nextstep) > 0) {
						ddp_get_duplicates(parseInt(response.data.nextstep), data, self);
					}
				}
				//ddp_refresh_log();
			}
		}).fail(function (response) {
			if (window.console && window.console.log) {
				window.console.log(response.statusCode + ' ' + response.statusText);
			}
		});
	}

	// Show / hide input fields in admin based on selected compare method.
	jQuery(document).on('click', '.ddpcomparemethod li', function () {
		jQuery(".ddpcomparemethod input:radio").each(function () {
			if (this.checked) {
				jQuery(this).closest('li').find('.ddp-compare-details').show();
			}
			else {
				jQuery(this).closest('li').find('.ddp-compare-details').hide();
			}
		});
	});

	// Pretend click
	jQuery('.ddpcomparemethod li').trigger('click');


});