PATH:
home
/
thebhoeo
/
.trash
/
backwpup
/
assets
/
js
let requestWPApi, loadBackupsListingAndPagination, getUrlParameter, backwpupDisplaySettingsToast; async function postToWP(data) { return await fetch(ajaxurl, { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded", "Cache-Control": "no-cache", }, keepalive: true, body: new URLSearchParams(data), }).then((response) => response.json()); } jQuery(document).ready(function ($) { const $document = $(document); // Cache document lookup /** * Request the WP Rest API. * @param string route * @param array data * @param function callback * @param string method (default: 'GET') */ requestWPApi = function requestWPApi(route, data, callback, method = 'GET', error_callback = null) { const $trigger = $(document.activeElement); const $overlayTemplate = $('#backwpup-loading-overlay-template').children().first(); const $jobCard = $trigger.closest('.backwpup-job-card'); let $overlay; if ($jobCard.length) { // Add overlay to the job card $overlay = $overlayTemplate.clone(); $overlay.find('svg').addClass('animate-spin'); $jobCard.find('.backwpup-loading-overlay').remove(); $jobCard.append($overlay); } $.ajax({ url: route, beforeSend: function(xhr) { xhr.setRequestHeader('X-WP-Nonce', backwpupApi.nonce); xhr.setRequestHeader('Cache-Control', 'no-cache'); }, method: method, data: data, success: function(response) { $overlay?.remove(); $trigger.prop('disabled', false); $trigger.siblings('.backwpup-loading-overlay').remove(); callback(response, data); }, error: function(request, error) { console.error("API Request Failed:", route, method, data, request.status, request.statusText); console.trace("Error triggered in requestWPApi"); $overlay?.remove(); $trigger.prop('disabled', false); $trigger.siblings('.backwpup-active-spinner').remove(); if (error_callback) { error_callback(request, error); } } }); } // Function to enable or disable all the backup button. function enableBackupButton(enable = true) { $(".backwpup-button-backup").prop("disabled", !enable); $('.backwpup-btn-backup-job').prop('disabled', !enable); let toolTipVisibility = enable ? 'visible' : 'hidden'; jQuery(".backwpup-btn-backup-job span span.tooltip").css("visibility", toolTipVisibility); } function enableDeleteJob(enable = true) { console.log("enableDeleteJob", enable); if ( enable ) { $(".js-backwpup-delete-job").removeClass("disabled"); } else { $(".js-backwpup-delete-job").addClass("disabled"); } } // Function to get URL parameter. getUrlParameter = function getUrlParameter(name, defaultValue="") { let searchParams = new URLSearchParams(window.location.search) if (searchParams.has(name)) { return searchParams.get(name); } else { return defaultValue; } } /** * Display a toast notification in the settings page. * @param type disable auto-remove if type is not 'success'. * @param message * @param duration - The duration in milliseconds to display the toast. Default is 5000ms. Set to -1 to disable auto-remove. */ backwpupDisplaySettingsToast = function backwpupDisplaySettingsToast(type = 'info', message = '', duration = 5000) { if(!message) { return; } requestWPApi( backwpupApi.getblock, { 'block_name': 'alerts/info', 'block_type': 'component', 'block_data': { 'type': type, 'font': 'small', 'dismiss_icon': true, 'content': message }, }, function(response) { const toast = jQuery('<div class="transform translate-y-2 transition-all mb-2"></div>').html(response); $('#bwp-settings-toast').append(toast); // Animate in setTimeout(() => { toast.addClass('opacity-100 translate-y-0'); }, 10); // Auto-remove after duration if (duration !== -1) { setTimeout(() => { toast.removeClass('opacity-100 translate-y-0').addClass('opacity-0 translate-y-2'); setTimeout(() => { toast.remove(); }, 300); }, duration); } }, 'POST', function(request, error) { console.log(error,request); } ); } function getBackWPupMessages() { requestWPApi(backwpupApi.messages, null, function(response) { if (response['error'] && response['error'].length) { response['error'].forEach(function(error) { backwpupDisplaySettingsToast('danger', error, -1 ); }); } if (response['updated'] && response['updated'].length) { response['updated'].forEach(function(updated) { backwpupDisplaySettingsToast('success', updated ); }); } }); } getBackWPupMessages(); // Function to be sure the value on this class is an integer. $(".js-backwpup-intonly").on('keydown', function(event) { return ['Backspace','Delete','ArrowLeft','ArrowRight'].includes(event.code) ? true : !isNaN(Number(event.key)) && event.code!=='Space'; }); // Function to refresh the storage destinations. window.refresh_storage_destinations= function (job_id, destinationName, authenticated) { let checkBox = $('#destination-'+destinationName); checkBox.prop('checked', authenticated); const storage_destinations = [""]; $('input[name="storage_destinations[]"]').each(function () { if ($(this).is(':checked')) { storage_destinations.push($(this).val()); } }); requestWPApi( backwpupApi.updatejob, { 'job_id': job_id, 'storage_destinations': storage_destinations, }, function (response) { requestWPApi( backwpupApi.storagelistcompact, {}, function (response) { $("#backwpup-storage-list-compact-container").html(response); }, "GET", function (request, error) { $("#backwpup-storage-list-compact-container").html(request.responseText); } ) }, "POST", function (request, error) { $("#backwpup-storage-list-compact-container").html(request.responseJSON.error); } ); // Check if there is a storage selected to enable the submit button. const checkedStorageCheckboxes = $('input[type="checkbox"][name^="onboarding_storage"]:checked'); if (0 !== checkedStorageCheckboxes.length) { $(".js-backwpup-onboarding-submit-form").prop("disabled", false); } else { $(".js-backwpup-onboarding-submit-form").prop("disabled", true); } } // Refresh the gdrive authentification block. window.gdrive_refresh_authentification = function() { requestWPApi( backwpupApi.cloud_is_authenticated, { 'cloud_name': 'gdrive', }, function(response) { $('#gdrive_authenticate_label').html(response); }, "GET" ) } //Refresh the onedrive authentification block. window.onedrive_refresh_authentification = function() { requestWPApi( backwpupApi.cloud_is_authenticated, { 'cloud_name': 'onedrive', }, function(response) { $('#onedrive_authenticate_label').html(response); }, "GET" ) } //Refresh the dropbox authentification block. window.dropbox_refresh_authentification = function(job_id) { requestWPApi( backwpupApi.cloud_is_authenticated, { 'job_id' : job_id, 'cloud_name': 'dropbox', }, function(response) { $('#drobox_authenticate_infos').html(response); }, "GET" ) } //Refresh the HiDrive authentification block. window.hidrive_refresh_authentification = function(job_id) { requestWPApi( backwpupApi.cloud_is_authenticated, { 'job_id' : job_id, 'cloud_name': 'hidrive', }, function(response) { $('#hidrive_authenticate_infos').html(response); initHidriveEvents(); }, "GET" ) } /** * Updates the license by sending a request to the WordPress API. * * This function collects the license action and instance key from the DOM, * constructs a data object, and sends it to the WordPress API endpoint for * license updates. Depending on the action (activate or deactivate), it may * also include the license API key and product ID. After the request is sent, * it handles the response by displaying a message and refreshing the license * block. * * @function */ window.update_license = function() { const license_action = $('#license_action').val(); const license_instance_key = $('#license_instance_key').val(); const data = { 'license_action': license_action, 'license_instance_key': license_instance_key, 'license_submit': true, } let next_block = 'activate'; if ('activate' === license_action) { next_block = 'deactivate'; data['license_api_key'] = $('#license_api_key').val(); data['license_product_id'] = $('#license_product_id').val(); } requestWPApi( backwpupApi.license_update, data, function(response) { requestWPApi( backwpupApi.getblock, { 'block_name': 'alerts/info', 'block_type': 'component', 'block_data': { 'type': 'info', 'font': 'medium', 'content': response.message }, }, function(messageHtml) { $('#backwpup_message').html(messageHtml); backwpup_license_refresh(next_block, messageHtml); }, 'POST', function(request, error) { console.log(request.responseJSON.error); } ); }, 'POST', function(request, error) { requestWPApi( backwpupApi.getblock, { 'block_name': 'alerts/info', 'block_type': 'component', 'block_data': { 'type': 'alert', 'font': 'medium', 'content': request.responseJSON.error }, }, function(response) { $('#backwpup_message').html(response); }, 'POST', function(request, error) { console.log(request.responseJSON.error); } ); } ); } /** * Refreshes the license block in the sidebar. * * This function constructs the block name based on the activation status * and sends a request to the WordPress API to retrieve the updated license * block. The response is then used to update the DOM with the new license * block content. * * @function * @param {string} activated - The activation status, either 'activate' or 'deactivate'. */ window.backwpup_license_refresh = function(activated, messageHtml) { let block_name = 'sidebar/license-parts/'+activated; requestWPApi( backwpupApi.getblock, { 'block_name': block_name, 'block_type': 'children', }, function(response) { $('#backwpup_license').html(response); if (messageHtml) { $('#backwpup_message').html(messageHtml); } $('.js-backwpup-license_update').on('click', update_license); }, 'POST' ); } /** * Load and open the storage sidebar using the WordPress API. * * @param {*} event */ window.load_and_open_storage = function(event) { let that = $(event.currentTarget); let panel = that.data("content"); let job_id = that.data("job-id"); let storage = that.data("storage"); let target = $sidebar.find("#sidebar-" + panel); requestWPApi( backwpupApi.getblock, { 'block_name': 'sidebar/' + panel, 'block_type': 'children', 'block_data': { 'job_id': job_id, 'is_in_form': false, }, }, function(response) { target.html(response); $(".js-backwpup-close-sidebar").on('click', closeSidebar); $(".js-backwpup-load-and-open-sidebar").on('click', load_and_open_sidebar); switch (storage) { case 'DROPBOX': initDropboxEvents(); break; case 'SUGARSYNC': initSugarSyncEvents(); refreshSugarSyncRootFolders(job_id); $('.js-backwpup-test-SUGARSYNC-storage').on('click', window['test_SUGARSYNC_storage']); break; case 'GDRIVE': initGdriveEvents(); $('.js-backwpup-test-GDRIVE-storage').on('click', window['test_GDRIVE_storage']); break; case 'HIDRIVE': initHidriveEvents(); $('.js-backwpup-test-HIDRIVE-storage').on('click', window['test_HIDRIVE_storage']); break; case 'FTP': initFTPEvents(); $('.js-backwpup-test-FTP-storage').on('click', window['test_FTP_storage']); break; case 'ONEDRIVE': initOnedriveEvents(); $('.js-backwpup-test-ONEDRIVE-storage').on('click', window['test_ONEDRIVE_storage']); break; default: $('.js-backwpup-test-' + storage + '-storage').on('click', window['test_' + storage + '_storage']); break; } openSidebar(panel); }, 'POST', function(request, error) { console.log(error); console.log(request); } ); } // Sidebar & Modal const $modal = $("#backwpup-modal"); const $sidebar = $("#backwpup-sidebar"); const $modalContainer = $modal.find("> div").first(); const defaultModalClass = $modalContainer.attr("class") || ""; const defaultModalStyle = $modalContainer.attr("style") || ""; function resetModalContainer() { $modalContainer.attr("class", defaultModalClass); if (defaultModalStyle) { $modalContainer.attr("style", defaultModalStyle); } else { $modalContainer.removeAttr("style"); } } function openSidebar(panel) { // Fill infos $sidebar.find("article").hide(); $sidebar.find("#sidebar-" + panel).show(); // Animate $("body").addClass("overflow-hidden"); $sidebar.removeClass("translate-x-[450px]"); } function closeSidebar() { $("body").removeClass("overflow-hidden"); $sidebar.addClass("translate-x-[450px]"); } /** * Load and open the sidebar using the WordPress API. * * @param {*} event */ window.load_and_open_sidebar = function(event) { let that = $(event.currentTarget); let panel = that.data("content"); // Get the panel to open let job_id = that.data("job-id"); $sidebar.find("article").hide(); let target = $sidebar.find("#sidebar-" + panel); // Set default block data payload. let block_data = { 'job_id': job_id, 'job_type': that.data("job-type") }; // Define basic frequency settings selectors on the onboarding screen. let basic_frequency_selectors = { files: $('.js-backwpup-onboarding-files-frequency'), database: $('.js-backwpup-onboarding-database-frequency') } // Check that we are requesting frequency settings and basic frequency settings are present. if ('frequency' === panel && basic_frequency_selectors.files.is(':visible') && basic_frequency_selectors.database.is(':visible')) { let basic_frequency_data = { job_2: basic_frequency_selectors.files.val(), job_3: basic_frequency_selectors.database.val() } // Update block data payload with basic frequency data. block_data['basic_frequency'] = basic_frequency_data[`job_${job_id}`]; } requestWPApi( backwpupApi.getblock, { 'block_name': that.data("block-name"), 'block_type': that.data("block-type"), 'block_data': block_data, }, function(response) { // Fill infos target.html(response); openSidebar(panel); // Trigger custom event for disabling elements with legacy frequency start days set. $document.trigger('disableLegacyFrequency', { panel: panel }); $(".js-backwpup-close-sidebar").on('click', closeSidebar); $(".js-backwpup-toggle-storage").on('click', load_and_open_storage); }, 'POST', function(request, error) { console.log(error); console.log(request); } ); } $document.on('click', '.js-backwpup-load-and-open-sidebar', load_and_open_sidebar); // Array of legacy frequency start days. const legacy_start_days = [ 'first-monday', 'first-sunday', ]; let save_settings_button, start_time, day_of_month; $document.on('disableLegacyFrequency', function (_, data) { save_settings_button = $('#save-job-settings'); start_time = save_settings_button.closest("article").find("input[name='start_time']"); day_of_month = $('#backwpup_day_of_month'); // Bail out if panel is not frequency. if ('frequency' !== data.panel) { return; } // Disable start time and save button when start day is legacy. if (legacy_start_days.includes(day_of_month.val())) { start_time.prop('disabled', true); save_settings_button.prop('disabled', true); } }); // Array of target select elements to watch on change. const frequency_field_targets = [ '#backwpup_day_of_month', '#backwpup_frequency', ]; frequency_field_targets.forEach(selector => { $('#backwpup-sidebar').on('change', selector, function() { if (legacy_start_days.includes(day_of_month.val()) && 'monthly' === $('#backwpup_frequency').val()) { start_time.prop('disabled', true); save_settings_button.prop('disabled', true); return; } start_time.prop('disabled', false); save_settings_button.prop('disabled', false); }); }); /** * Load and open modals using the WordPress API. * * @param {*} event */ window.load_and_open_modal = function(event) { let that = $(event.currentTarget); let panel = that.data("content"); // Get the panel to open let job_id = that.data("job-id"); let backup_id = that.data("backup-id"); let modal_style = that.data("modal-style"); let modal_class = that.data("modal-class"); let target = $modal.find("#sidebar-" + panel); let block_data = { 'job_id': job_id, }; if (backup_id) { block_data.backup_id = backup_id; } const $spinnerSvg = $('#backwpup-loading-overlay-template').find('svg').clone().addClass('animate-spin'); if ($spinnerSvg.length) { target.html($('<div class="flex justify-center items-center py-12"></div>').append($spinnerSvg)); } openModal(panel, { modalStyle: modal_style, modalClass: modal_class }); requestWPApi( backwpupApi.getblock, { 'block_name': that.data("block-name"), 'block_type': that.data("block-type"), 'block_data': block_data, }, function(response) { // Fill infos target.html(response); $(".js-backwpup-close-modal").on('click', closeModal); }, 'POST', function(request, error) { console.log(error); console.log(request); } ); } $document.on('click', '.js-backwpup-load-and-open-modal', load_and_open_modal); window.load_exclusions_modal = function(job_id, panel) { let target = $modal.find("#sidebar-" + panel); let block_name = 'modal/'+ panel; let block_type = 'children'; const $spinnerSvg = $('#backwpup-loading-overlay-template').find('svg').clone().addClass('animate-spin'); if ($spinnerSvg.length) { target.html($('<div class="flex justify-center items-center py-12"></div>').append($spinnerSvg)); } requestWPApi( backwpupApi.getblock, { 'block_name': block_name, 'block_type': block_type, 'block_data': { 'job_id': job_id, }, }, function(response) { // Fill infos target.html(response); $(".js-backwpup-close-modal").on('click', closeModal); }, 'POST', function(request, error) { console.log(error); console.log(request); } ); } $document.on('click', '.js-data-settings-files, .onboarding-advanced-files-settings ', function () { let that = $(this); let job_id = that.data("job-id"); let panels = ['exclude-files-core', 'exclude-files-plugins', 'exclude-files-root', 'exclude-files-themes', 'exclude-files-uploads', 'exclude-files-wp-content']; panels.forEach(function (panel) { load_exclusions_modal(job_id, panel) }); }); $document.on('click', '.js-backwpup-open-sidebar', function () { const panel = $(this).data("content"); openSidebar(panel); }); $(".js-backwpup-close-sidebar").on('click', closeSidebar); $(".js-backwpup-open-url").on('click', function() { if ($(this).data("href")) { window.location= $(this).data("href"); } }); function openModal(panel, dataset={}) { resetModalContainer(); if (dataset.modalClass) { $modalContainer.addClass(dataset.modalClass); } if (dataset.modalStyle) { const mergedStyle = defaultModalStyle ? defaultModalStyle + ";" + dataset.modalStyle : dataset.modalStyle; $modalContainer.attr("style", mergedStyle); } // Fill informations $modal.find("article").hide(); let thePanel = $modal.find("#sidebar-" + panel); thePanel.show(); thePanel.find(".js-backwpup-bulk-delete-backups").prop("disabled", false); if (dataset.url) { thePanel.find(".js-backwpup-open-url").attr("data-href", dataset.url); } // Animate $("body").addClass("overflow-hidden"); $modal.removeClass("hidden").addClass("flex"); } function closeModal() { resetModalContainer(); $("body").removeClass("overflow-hidden"); $modal.addClass("hidden").removeClass("flex"); } //Refresh the SugarSync root folders. window.refreshSugarSyncRootFolders = function(job_id) { const $overlayTemplate = $('#backwpup-loading-overlay-template').children().first(); const $sugarsyncSidebar = $('#sidebar-storage-SUGARSYNC'); let $overlay; if ($sugarsyncSidebar.length) { // Add overlay to the sidebar. $overlay = $overlayTemplate.clone(); $overlay.find('svg').addClass('animate-spin'); $sugarsyncSidebar.find('.backwpup-loading-overlay').remove(); $sugarsyncSidebar.append($overlay); } // Reload the root folder list. requestWPApi( backwpupApi.getblock, { 'block_name': 'sidebar/sugar-sync-parts/root-folder', 'block_type': 'children', 'block_data': { 'job_id': job_id, }, }, function(response) { $('#sugarsyncroot').html(response); $overlay?.remove(); }, 'POST', function (request, error) { $('#sugarsyncroot').html(request.responseText); $overlay?.remove(); } ); } function initSugarSyncEvents() { // Toggle SugarSync authenticate action. $('.js-backwpup-authenticate-sugar-sync').on('click', function() { const urlParams = new URLSearchParams(window.location.search); const page = urlParams.get('page'); let job_id = $(this).data("job-id"); if (page === 'backwpuponboarding') { job_id = null; } let data = { 'job_id': job_id, 'cloud_name' : 'sugarsync', 'sugaremail' : $('#sugaremail').val(), 'sugarpass' : $('#sugarpass').val(), }; requestWPApi( backwpupApi.authenticate_cloud, data, function(response) { $('#sugarsynclogin').html(response); $('#sugarsync_authenticate_infos').html(""); refreshSugarSyncRootFolders(job_id); initSugarSyncEvents(); }, "POST", function(request, error) { $('#sugarsync_authenticate_infos').html(request.responseText); refreshSugarSyncRootFolders(job_id); } ); }); // Delete Sugar Sync authentication. $('.js-backwpup-delete-sugar-sync-auth').on('click', function() { const urlParams = new URLSearchParams(window.location.search); const page = urlParams.get('page'); let job_id = $(this).data("job-id"); if (page === 'backwpuponboarding') { job_id = null; } const data = { 'job_id': job_id, 'cloud_name' : 'sugarsync', } requestWPApi( backwpupApi.delete_auth_cloud, data, function (response) { $('#sugarsynclogin').html(response); refreshSugarSyncRootFolders(job_id); initSugarSyncEvents(); }, "POST", function (request, error) { alert("Error in cloud configuration"); } ); }); } // Toggle Google Drive authenticate action. function initGdriveEvents() { // Toggle Gdrive Api connection first step. $('.js-backwpup-gdrive-connect-api').on('click', function() { const details = $(this).closest('details'); let data = { 'backwpup_cfg_googleclientsecret' : { 'value': $('#backwpup_cfg_googleclientsecret').val(), 'secure': true, }, 'backwpup_cfg_googleclientid' : { 'value': $('#backwpup_cfg_googleclientid').val(), 'secure': false, }, } requestWPApi( backwpupApi.save_site_option, data, function (response) { $('#gdrive_authenticate_infos').removeClass('text-danger').addClass('text-secondary-base').html(response.message); // Remove the 'open' attribute details.removeAttr('open'); }, "POST", function (request, error) { $('#gdrive_authenticate_infos').removeClass('text-secondary-base').addClass('text-danger').html(request.responseJSON?.error ?? "Error"); } ) }); // Toggle Gdrive reauthenticate action. $('.js-backwpup-gdrive-reauthenticate').on('click', function() { openModal('dialog'); $('.js-backwpup-refresh-authentification').data('trigger', 'gdrive_refresh_authentification'); window.open($(this).data('url'), '_blank'); }); } // Initialize Dropbox cloud events. function initDropboxEvents() { $('.js-backwpup-modal-and-focus').on('click', modal_and_focus); // Test and save Dropbox storage. $('.js-backwpup-test-DROPBOX-storage').on('click', function () { let job_id = $(this).data("job-id"); const urlParams = new URLSearchParams(window.location.search); const page = urlParams.get('page'); if (page === 'backwpuponboarding') { job_id = null; } const data = { 'job_id': job_id, 'cloud_name' : 'dropbox', 'dropboxmaxbackups' : $("#dropboxmaxbackups").val(), 'dropboxdir' : $("#dropboxdir").val(), }; let dropbbox_code = $("#dropbbox_code").val(); if (dropbbox_code) { data['dropbbox_code'] = dropbbox_code; } let sandbox_code = $("#sandbox_code").val(); if (sandbox_code && !dropbbox_code) { data['sandbox_code'] = sandbox_code; } requestWPApi( backwpupApi.cloudsaveandtest, data, function (response) { refresh_storage_destinations(job_id, 'DROPBOX', response.connected); dropbox_refresh_authentification(job_id); closeSidebar(); }, "POST", function (request, error) { refresh_storage_destinations(job_id, 'DROPBOX', false); alert(request.responseJSON.error); } ); }); // Delete Dropbox authentication. $('.js-backwpup-delete-dropbox-auth').on('click', function() { let job_id = $(this).data("job-id"); const urlParams = new URLSearchParams(window.location.search); const page = urlParams.get('page'); if (page === 'backwpuponboarding') { job_id = null; } const data = { 'job_id': job_id, 'cloud_name' : 'dropbox', 'delete_auth' : true, 'dropboxmaxbackups' : $("#dropboxmaxbackups").val(), 'dropboxdir' : $("#dropboxdir").val(), } requestWPApi( backwpupApi.cloudsaveandtest, data, function (response) { refresh_storage_destinations(job_id, 'DROPBOX', response.connected); dropbox_refresh_authentification(job_id); closeSidebar(); }, "POST", function (request, error) { alert(request.responseJSON.error); } ); }); } /** * Initialize the modal event */ function initModalEvent() { // Delegated (for future elements) $(document).on('click', '.js-backwpup-open-modal', handler); // Direct (for current elements) $('.js-backwpup-open-modal').on('click', handler); function handler() { const panel = $(this).data("content"); let dataset = {}; if ($(this).data("url")) { dataset.url = $(this).data("url"); } openModal(panel, dataset); } } $document.on('click', '.js-backwpup-close-modal', closeModal); $document.on('click', '.js-backwpup-delete-failed-backup', function() { const backupId = $(this).data("backup-id"); if (!backupId) { return; } requestWPApi( backwpupApi.backups_bulk_actions, { action: 'delete', backups: [ { dataset: { backup_id: backupId } } ] }, function() { closeModal(); const currentPage = parseInt(getUrlParameter('page_num', 1), 10) || 1; const $backupsTable = $("#backwpup-backup-history"); const remainingRows = $backupsTable.find("tbody tr").length; const nextPage = (remainingRows <= 1 && currentPage > 1) ? currentPage - 1 : currentPage; loadBackupsListingAndPagination(nextPage); }, 'POST' ); }); // Filter table list $document.on('keyup', '.js-backwpup-filter-tables', function () { const filter = $(this).val().toLowerCase(); $(".js-backwpup-tables-list label").each(function () { if ( filter === "" || $(this).find("input").attr("value").toLowerCase().includes(filter) ) { $(this).show(); } else { $(this).hide(); } }); }); $(".js-backwpup-filter-tables") .next(".js-backwpup-clear-search") .on('click', function () { $(".js-backwpup-tables-list label").show(); }); function updateSelectAllTablesState($scope) { const $tablesList = $scope.find(".js-backwpup-tables-list input[type='checkbox']"); const $selectAll = $scope.find(".js-backwpup-select-all-tables"); if ($selectAll.length === 0) { return; } if ($tablesList.length === 0) { $selectAll.prop("checked", false); return; } const allChecked = $tablesList.length === $tablesList.filter(":checked").length; $selectAll.prop("checked", allChecked); } // Select all tables in DB job sidebar (toggle) $document.on('change', '.js-backwpup-select-all-tables', function () { const $article = $(this).closest("article"); const $tablesList = $article.length ? $article.find(".js-backwpup-tables-list input[type='checkbox']") : $(".js-backwpup-tables-list input[type='checkbox']"); if ($tablesList.length === 0) { return; } const checked = $(this).is(":checked"); $tablesList.prop("checked", checked).change(); }); $document.on('change', '.js-backwpup-tables-list input[type="checkbox"]', function () { const $article = $(this).closest("article"); updateSelectAllTablesState($article.length ? $article : $(document)); }); $(".js-backwpup-select-all-tables").each(function () { const $article = $(this).closest("article"); updateSelectAllTablesState($article.length ? $article : $(document)); }); // Select all lines in backup table const $backupsTable = $("#backwpup-backup-history"); let isCheckboxListenerInitialized = false; let pendingBulkDelete = null; $(".js-backwpup-select-all").on('change', function () { const checked = $(this).prop("checked"); const isDeleteAction = $('#bulk-actions-select').val() === 'delete'; $("#bulk-actions-apply").prop("disabled", !checked || !isDeleteAction); $backupsTable.find("input[type=checkbox]").prop("checked", checked); // Initialize the event listener for individual checkboxes only once if (!isCheckboxListenerInitialized) { $backupsTable.on("change", "input[type=checkbox]", function () { const allChecked = $backupsTable.find("input[type=checkbox]").length === $backupsTable.find("input[type=checkbox]:checked").length; $(".js-backwpup-select-all").prop("checked", allChecked); }); isCheckboxListenerInitialized = true; } }); /** * Initialize the menu event. */ function initMenuEvent() { // Menu $(".js-backwpup-menu").on('click', function (event) { event.stopPropagation(); const $menu = $(this).find(".js-backwpup-menu-content"); $(".js-backwpup-menu-content").not($menu).addClass("hidden"); if ($menu.hasClass("hidden")) { $menu.removeClass("hidden"); } else { $menu.addClass("hidden"); } }); $(".js-backwpup-menu-content") .off("click.backwpupLoadAndOpenModal") .on("click.backwpupLoadAndOpenModal", ".js-backwpup-load-and-open-modal", function(event) { event.preventDefault(); event.stopPropagation(); load_and_open_modal(event); $(this).closest(".js-backwpup-menu-content").addClass("hidden"); }); // Backup select // This button is disabled by default. $("#bulk-actions-apply").prop("disabled", true); $(".js-backwpup-select-backup").on('click', function () { // Vérifier si au moins un élément est coché const isChecked = $(".js-backwpup-select-backup:checked").length > 0; const isDeleteAction = $('#bulk-actions-select').val() === 'delete'; // Activer ou désactiver le bouton en fonction de la vérification $("#bulk-actions-apply").prop("disabled", !isChecked || !isDeleteAction); }); } $(document).on('click', function () { $(".js-backwpup-menu-content").addClass("hidden"); }); /** * Initialize the pagination event. */ function initPaginationEvent() { $(".js-backwpup-table-pagination button").on('click', function () { let page = $(this).data("page"); loadBackupsListingAndPagination(page); // Update URL let url = new URL(window.location.href); url.searchParams.set("page_num", page); history.pushState({}, "", url); }); } /** * Load the backups listing and the pagination from the api * @param page */ loadBackupsListingAndPagination = function loadBackupsListingAndPagination(page) { requestWPApi(backwpupApi.backupslistings, {page: page, length: backwpupApi.backupslistingslength}, refreshBackupTable, 'POST'); } // Next Scheduled Action Tables $(".js-backwpup-toggle-tables").on('click', function () { const value = $(this).is(":checked"); const data = { action: "backwpup_toggle_database", tables: value, }; postToWP(data).then((body) => {}); }); // Clear search field $(".js-backwpup-clear-search").on('click', function () { $(this).prev().val(""); }); // Add tag field $document.on('click', '.js-backwpup-add-input-button', function () { // Get value and clear field const tag = $(this).prev().val().trim(); // Trim whitespace if ( tag === "" ) return; $( this ).prev().val( "" ); // Update hidden input let values = $(this).siblings( ".js-backwpup-add-input-values" ).val().split( "," ).filter(v => v.trim() !== ""); if (!values.includes( tag )) { values.push( tag ); values = [...new Set( values )]; // Ensure unique values $(this).siblings( ".js-backwpup-add-input-values" ).val( values.join( "," ) ); // Prevent duplicates on the frontend const existingTags = $(this).parent().siblings( ".js-backwpup-add-input-tags button span" ) .map( function () { return $( this ).text(); }) .get(); if ( ! existingTags.includes( tag ) ) { // Add tag to the list const $newTag = $( this ) .parents( ".js-backwpup-add-input" ) .find( ".js-backwpup-add-input-tag-template button" ) .clone(); $newTag.find( "span" ).text( tag ); $newTag.appendTo( $(this).parent().siblings(".js-backwpup-add-input-tags") ); } } }); $document.on( "click", ".js-backwpup-remove-tag", function () { // Update hidden input let values = $(this).parent().siblings("label").children(".js-backwpup-add-input-values").val().split(",").filter(v => v.trim() !== ""); values = values.filter((value) => value !== $(this).data("tag")); $(this).parent().siblings("label").children(".js-backwpup-add-input-values").val(values.join(",")); // Remove tag from list $(this).remove(); }, ); // Toggle include / exclude files $document.on('click', ".js-backwpup-toggle-include button" , function () { const $element = $(this).parents(".js-backwpup-toggle-include"); const $checkbox = $element.find("input[type=checkbox]"); $checkbox.prop("checked", !$checkbox.prop("checked")); if ($checkbox.prop("checked")) { $element.find(".js-backwpup-toggle-include-add").addClass("hidden"); $element.find(".js-backwpup-toggle-include-remove").removeClass("hidden"); } else { $element.find(".js-backwpup-toggle-include-add").removeClass("hidden"); $element.find(".js-backwpup-toggle-include-remove").addClass("hidden"); } }); // Start Backup Now $(".js-backwpup-start-backup-now").on('click', function () { enableBackupButton(false); requestWPApi(backwpupApi.startbackup, {}, function(response) { if ( response.status === 200 ) { window.location.reload(); } }, 'POST', function (request, error) { console.log(request); console.log(error); enableBackupButton(true); }); }); // Exclude files in sidebar $document.on('change', '.js-backwpup-toggle-exclude', function () { const checked = $(this).prop("checked"); $(this).closest("div").find("button").prop("disabled", !checked); }); // Toggle Files. $("#backwup-next-scheduled-backups").on('change', '.js-backwpup-toggle-job', function () { const checked = $(this).prop("checked"); let job_id = $(this).data("job-id"); let tooltip_text = 'Disable'; if(!checked) { tooltip_text = 'Enable' } const $tooltip = $(`#backwpup-${job_id}-options div`).find('[data-tooltip-position]:eq(2)'); const spanHTML = $tooltip.find('span').prop('outerHTML'); $(`#backwpup-${job_id}-options`).find("button:not(.always-enabled)").prop("disabled", !checked); requestWPApi( backwpupApi.updatejob, { 'job_id': job_id, 'activ': checked }, function (response) { $(`#backwpup-${job_id}-options div span.label-scheduled`).html(response.message); $tooltip.html(tooltip_text + ' ' + spanHTML); }, "POST" ); }); // Toggle Delete Job. $("#backwup-next-scheduled-backups").on('click', ".js-backwpup-delete-job", function () { let job_id = $(this).data("job-id"); requestWPApi( backwpupApi.delete_job, { 'job_id': job_id, }, function (response) { if (response.success) { $(`#backwpup-${job_id}-options`).remove(); loadBackupsListingAndPagination(getUrlParameter('page_num', 1)); } }, "DELETE", function(request) { backwpupDisplaySettingsToast( 'danger', request.responseJSON.message ); } ); }); $("#backwup-next-scheduled-backups").on('change', '.backwpup-dynamic-backup-type', function() { if (0 === $('#js-backwpup-add-new-backup-form').find('input[name="type"]:checked').length) { $( this ).prop( "checked", true ); return; // Do not allow empty selection. } if (!$(this).is(':checked')) { // Remove classes from the selected label and its child divs $(this).closest('label').removeClass('bg-secondary-lighter border-secondary-base'); $(this).closest('label').find('div').removeClass('border-secondary-base'); } else { // Add classes to the selected label and its child div $(this).closest('label').addClass('bg-secondary-lighter border-secondary-base'); $(this).closest('label').find('div').addClass('border-secondary-base'); } }); const $target_dynamic_card = '.backwpup-dynamic-backup-card'; const toggleDynamicCardDisplay = (target, state = 'hidden') => { const new_backup_card = '.backwpup-add-new-backup-card'; switch (state) { case 'visible': // Check for target visibility. if (!$(target).is(':visible')) { $(target).addClass('flex').removeClass('hidden'); $(new_backup_card).addClass('hidden').removeClass('flex'); } break; default: // Check for target visibility. if ($(target).is(':visible')) { $(target).addClass('hidden').removeClass('flex'); $(new_backup_card).addClass('flex').removeClass('hidden'); $('.backwpup-dynamic-input label') .removeClass('bg-secondary-lighter border-secondary-base') .find('> div').removeClass('border-secondary-base') .end().first() .addClass('bg-secondary-lighter border-secondary-base') .find('input').prop('checked', true) .end().find('> div').addClass('border-secondary-base'); } break; } } $("#backwup-next-scheduled-backups").on('click', '#js_backwpup_close_dynamic_backup_card', function () { toggleDynamicCardDisplay($target_dynamic_card); }); //Deprecated since 5.3 $("#backwup-next-scheduled-backups").on('click', "#js-backwpup-add-new-backup", function (e) { e.preventDefault(); $(this).prop('disabled', true); let that = $(this); let type = $('#js-backwpup-add-new-backup-form').find('input[name="type"]:checked').val(); if (2 === $('#js-backwpup-add-new-backup-form').find('input[name="type"]:checked').length) { type = 'mixed'; } requestWPApi( backwpupApi.addjob, { type: type, }, function (response) { if ( response.success == true ) { $("#backwpup-backup-now").prop("disabled", false); loadBackupsListingAndPagination(getUrlParameter('page_num', 1)); // Display floating success notice. backwpupDisplaySettingsToast('success', response.message); requestWPApi( backwpupApi.getjobslist, {}, function (response) { $('#backwup-next-scheduled-backups').html(response); // get the html from backwpup_dynamic_response_content and append back to the html container. const $dynamic_content = $('#backwpup_dynamic_response_content').html(); $('#backwup-next-scheduled-backups').append($dynamic_content); // Revert state of the dynamic backup addition card. toggleDynamicCardDisplay($target_dynamic_card); }, "GET", ); } }, "POST", function (request, error) { // Display floating error notice. backwpupDisplaySettingsToast('error', request.responseText); that.prop('disabled', false); } ); }); // Test and save S3 storage. window.test_S3_storage = function (event) { let job_id = $(event.currentTarget).data("job-id"); const urlParams = new URLSearchParams(window.location.search); const page = urlParams.get('page'); if (page === 'backwpuponboarding') { job_id = null; } if ($("#s3bucketerror").html()!="") { refresh_storage_destinations(job_id, 'S3', false); alert('Error in Bucket Configurations'); return; } const data = { 'job_id': job_id, 'cloud_name' : 's3', 's3region' : $("#s3region").val(), 's3base_url' : $("#s3base_url").val(), 's3base_region' : $("#s3base_region").val(), 's3base_version' : $("#s3base_version").val(), 's3base_signature' : $("#s3base_signature").val(), 's3accesskey' : $("#s3accesskey").val(), 's3secretkey' : $("#s3secretkey").val(), 's3bucket' : $("#s3bucket").val(), 's3newbucket' : $("#s3newbucket").val(), 's3dir' : $("#s3dir").val(), 's3maxbackups' : $("#s3maxbackups").val(), 's3storageclass' : $("#s3storageclass").val() === "STANDARD" ? "" : $("#s3storageclass").val(), } if ($("#s3base_multipart").prop("checked")) { data['s3base_multipart'] = $("#s3base_multipart").val(); } if ($("#s3base_pathstylebucket").prop("checked")) { data['s3base_pathstylebucket'] = $("#s3base_pathstylebucket").val(); } if ($("#s3ssencrypt").prop("checked")) { data['s3ssencrypt'] = $("#s3ssencrypt").val(); } requestWPApi( backwpupApi.cloudsaveandtest, data, function (response) { refresh_storage_destinations(job_id, 'S3', response.connected); closeSidebar(); }, "POST", function (request, error) { refresh_storage_destinations(job_id, 'S3', false); alert("Error in cloud configuration"); } ); }; $('.js-backwpup-test-S3-storage').on('click', window['test_S3_storage']); // Test and save Glacier storage. window.test_GLACIER_storage = function (event) { let job_id = $(event.currentTarget).data("job-id"); const urlParams = new URLSearchParams(window.location.search); const page = urlParams.get('page'); if (page === 'backwpuponboarding') { job_id = null; } if ($("#glacierbucketerror").html()!="") { refresh_storage_destinations(job_id, 'GLACIER', false); alert('Error in Bucket Configurations'); return; } const data = { 'job_id': job_id, 'cloud_name' : 'glacier', 'glacieraccesskey' : $("#glacieraccesskey").val(), 'glaciersecretkey' : $("#glaciersecretkey").val(), 'glacierregion' : $("#glacierregion").val(), 'glaciervault' : $("#glaciervault").val(), 'glaciermaxbackups' : $("#glaciermaxbackups").val(), 'newvault' : $("#newvault").val() } requestWPApi( backwpupApi.cloudsaveandtest, data, function (response) { refresh_storage_destinations(job_id, 'GLACIER', response.connected); closeSidebar(); }, "POST", function (request, error) { refresh_storage_destinations(job_id, 'GLACIER', false); alert("Error in cloud configuration"); } ); }; $('.js-backwpup-test-GLACIER-storage').on('click', window['test_GLACIER_storage']); // Test and save local folder storage. window.test_FOLDER_storage = function (event) { let job_id = $(event.currentTarget).data("job-id"); const urlParams = new URLSearchParams(window.location.search); const page = urlParams.get('page'); if (page === 'backwpuponboarding') { job_id = null; } const data = { 'job_id': job_id, 'cloud_name' : 'folder', 'backupdir' : $("#backupdir").val(), 'maxbackups' : $("#maxbackups").val(), }; requestWPApi( backwpupApi.cloudsaveandtest, data, function (response) { refresh_storage_destinations(job_id, 'FOLDER', response.connected); closeSidebar(); }, "POST", function (request, error) { refresh_storage_destinations(job_id, 'FOLDER', false); alert("Error in cloud configuration"); } ); }; $('.js-backwpup-test-FOLDER-storage').on('click', window['test_FOLDER_storage']); // Test and save ftp storage. window.test_FTP_storage = function (event) { let job_id = $(event.currentTarget).data("job-id"); const urlParams = new URLSearchParams(window.location.search); const page = urlParams.get('page'); if (page === 'backwpuponboarding') { job_id = null; } const data = { 'job_id': job_id, 'cloud_name' : 'ftp', 'ftphost' : $("#ftphost").val(), 'ftphostport' : $("#ftphostport").val(), 'ftpuser' : $("#ftpuser").val(), 'ftppass' : $("#ftppass").val(), 'ftptimeout' : $("#ftptimeout").val(), 'ftpdir' : $("#ftpdir").val(), 'ftpmaxbackups' : $("#ftpmaxbackups").val(), 'ftpssl' : $("#ftpcontype").val() === 'ftps' ? 1 : 0, 'ftpssh' : $("#ftpcontype").val() === 'sftp' || $("#ftpcontype").val() === 'sftppk' ? 1 : 0, 'ftppasv' : $("#ftppasv").prop("checked") ? 1 : 0, 'ftpsshprivkey' : $("#ftpcontype").val() === 'sftppk' ? $("#ftpsshprivkey").val() : '', }; requestWPApi( backwpupApi.cloudsaveandtest, data, function (response) { refresh_storage_destinations(job_id, 'FTP', response.connected); closeSidebar(); }, "POST", function (request, error) { refresh_storage_destinations(job_id, 'FTP', false); alert("Error in cloud configuration"); } ); }; $('.js-backwpup-test-FTP-storage').on('click', window['test_FTP_storage']); function initFTPEvents() { const $passLabel = $("#ftppass").next(); if (!$passLabel.data('original-label')) { $passLabel.data('original-label', $passLabel.text()); } if (!$("#ftpsshprivkey").parent().hasClass('hidden')) { $passLabel.text('Password for ssh key'); } $("#ftpcontype").on('change', function(e) { let contype = $(e.currentTarget).val(); let ftpport = $("#ftphostport").val(); if (contype === 'sftppk') { $("#ftpsshprivkey").parent().removeClass('hidden'); $passLabel.text('Password for ssh key'); } else { $("#ftpsshprivkey").parent().addClass('hidden'); $passLabel.text($passLabel.data('original-label')); } if (contype === 'ftps' || contype === 'ftp') { $("#ftppasv").parent().removeClass('hidden'); } else { $("#ftppasv").parent().addClass('hidden'); } if ((contype === 'sftp' || contype === 'sftppk') && ftpport === '21') { $("#ftphostport").val(22); } if ((contype === 'ftp' || contype === 'ftps') && ftpport === '22') { $("#ftphostport").val(21); } }); } // Test and save Gdrive storage. window.test_GDRIVE_storage = function (event) { let job_id = $(event.currentTarget).data("job-id"); const urlParams = new URLSearchParams(window.location.search); const page = urlParams.get('page'); if (page === 'backwpuponboarding') { job_id = null; } const data = { 'job_id': job_id, 'cloud_name' : 'gdrive', 'gdriveusetrash' : $("#gdriveusetrash").prop("checked"), 'gdrivemaxbackups' : $("#gdrivemaxbackups").val(), 'gdrivedir' : $("#gdrivedir").val(), }; requestWPApi( backwpupApi.cloudsaveandtest, data, function (response) { refresh_storage_destinations(job_id, 'GDRIVE', response.connected); backwpupDisplaySettingsToast('success', response.message); closeSidebar(); getBackWPupMessages(); }, "POST", function (request, error) { refresh_storage_destinations(job_id, 'GDRIVE', false); const errorMessage = request.responseJSON && request.responseJSON.error ? request.responseJSON.error : (request.responseText || 'Unknown error occurred'); backwpupDisplaySettingsToast('danger', errorMessage , -1); } ); }; $('.js-backwpup-test-GDRIVE-storage').on('click', window['test_GDRIVE_storage']); function initHidriveEvents() { $('.js-backwpup-modal-and-focus').on('click', modal_and_focus); // Delete Hidrive authentication. $('.js-backwpup-delete-hidrive-auth').on('click', function() { let job_id = $(this).data("job-id"); const urlParams = new URLSearchParams(window.location.search); const page = urlParams.get('page'); if (page === 'backwpuponboarding') { job_id = null; } const data = { 'job_id': job_id, 'cloud_name' : 'hidrive', 'delete_auth' : true, 'hidrive_max_backups' : $('input[name="hidrive_max_backups"]').val(), 'hidrive_destination_folder' : $('input[name="hidrive_destination_folder"]').val(), } requestWPApi( backwpupApi.cloudsaveandtest, data, function (response) { refresh_storage_destinations(job_id, 'HIDRIVE', response.connected); hidrive_refresh_authentification(job_id); closeSidebar(); }, "POST", function (request, error) { refresh_storage_destinations(job_id, 'HIDRIVE', false); alert("Error in cloud configuration"); } ); }); } // Test and save HiDrive storage. window.test_HIDRIVE_storage = function (event) { let job_id = $(event.currentTarget).data("job-id"); let hidrive_authorization_code = $('input[name="hidrive_authorization_code"]').val(); const urlParams = new URLSearchParams(window.location.search); const page = urlParams.get('page'); if (page === 'backwpuponboarding') { job_id = null; } const data = { 'job_id': job_id, 'cloud_name': 'hidrive', 'hidrive_max_backups': $('input[name="hidrive_max_backups"]').val(), 'hidrive_destination_folder': $('input[name="hidrive_destination_folder"]').val(), } if (hidrive_authorization_code) { data['hidrive_authorization_code'] = hidrive_authorization_code; } requestWPApi( backwpupApi.cloudsaveandtest, data, function (response) { refresh_storage_destinations(job_id, 'HIDRIVE', response.connected); hidrive_refresh_authentification(job_id); closeSidebar(); }, "POST", function (request, error) { refresh_storage_destinations(job_id, 'HIDRIVE', false); alert("Error in cloud configuration"); } ); }; $('.js-backwpup-test-HIDRIVE-storage').on('click', window['test_HIDRIVE_storage']); // Test and save ONEDRIVE storage. window.test_ONEDRIVE_storage = function (event) { let job_id = $(event.currentTarget).data("job-id"); const urlParams = new URLSearchParams(window.location.search); const page = urlParams.get('page'); if (page === 'backwpuponboarding') { job_id = null; } const data = { 'job_id': job_id, 'cloud_name': 'onedrive', 'onedrivedir': $("#onedrivedir").val(), 'onedrivemaxbackups': $("#onedrivemaxbackups").val(), } requestWPApi( backwpupApi.cloudsaveandtest, data, function (response) { refresh_storage_destinations(job_id, 'ONEDRIVE', response.connected); closeSidebar(); }, "POST", function (request, error) { refresh_storage_destinations(job_id, 'ONEDRIVE', false); alert("Error in cloud configuration"); } ); }; $('.js-backwpup-test-ONEDRIVE-storage').on('click', window['test_ONEDRIVE_storage']); // Test and save SugarSync storage. window.test_SUGARSYNC_storage = function (event) { let job_id = $(event.currentTarget).data("job-id"); const urlParams = new URLSearchParams(window.location.search); const page = urlParams.get('page'); if (page === 'backwpuponboarding') { job_id = null; } const data = { 'job_id': job_id, 'cloud_name' : 'sugarsync', 'sugardir' : $("#sugardir").val(), 'sugarmaxbackups' : $("#sugarmaxbackups").val(), 'sugarroot' : $("#sugarroot").val(), }; requestWPApi( backwpupApi.cloudsaveandtest, data, function (response) { refresh_storage_destinations(job_id, 'SUGARSYNC', response.connected); closeSidebar(); }, "POST", function (request, error) { refresh_storage_destinations(job_id, 'SUGARSYNC', false); alert("Error in cloud configuration"); } ); }; $('.js-backwpup-test-SUGARSYNC-storage').on('click', window['test_SUGARSYNC_storage']); // Test and save RackSpace storage. window.test_RSC_storage = function (event) { let job_id = $(event.currentTarget).data("job-id"); const urlParams = new URLSearchParams(window.location.search); const page = urlParams.get('page'); if (page === 'backwpuponboarding') { job_id = null; } const data = { 'job_id': job_id, 'cloud_name' : 'rsc', 'newrsccontainer' : $("#newrsccontainer").val(), 'rscdir' : $("#rscdir").val(), 'rscmaxbackups' : $("#rscmaxbackups").val(), 'rsccontainer' : $("#rsccontainer").val(), 'rscusername' : $("#rscusername").val(), 'rscapikey' : $("#rscapikey").val(), 'rscregion' : $("#rscregion").val(), }; requestWPApi( backwpupApi.cloudsaveandtest, data, function (response) { refresh_storage_destinations(job_id, 'RSC', response.connected); closeSidebar(); }, "POST", function (request, error) { refresh_storage_destinations(job_id, 'RSC', false); alert("Error in cloud configuration"); } ); }; $('.js-backwpup-test-RSC-storage').on('click', window['test_RSC_storage']); // Test and save MSAZURE storage. window.test_MSAZURE_storage = function (event) { let job_id = $(event.currentTarget).data("job-id"); const urlParams = new URLSearchParams(window.location.search); const page = urlParams.get('page'); if (page === 'backwpuponboarding') { job_id = null; } const data = { 'job_id': job_id, 'cloud_name' : 'msazure', 'msazureaccname' : $("#msazureaccname").val(), 'msazurekey' : $("#msazurekey").val(), 'msazurecontainer' : $("#msazurecontainer").val(), 'newmsazurecontainer' : $("#newmsazurecontainer").val(), 'msazuredir' : $("#msazuredir").val(), 'msazuremaxbackups' : $("#msazuremaxbackups").val(), }; // return; requestWPApi( backwpupApi.cloudsaveandtest, data, function (response) { refresh_storage_destinations(job_id, 'MSAZURE', response.connected); closeSidebar(); }, "POST", function (request, error) { refresh_storage_destinations(job_id, 'MSAZURE', false); alert("Error in cloud configuration"); } ); }; $('.js-backwpup-test-MSAZURE-storage').on('click', window['test_MSAZURE_storage']); // Onboarding steps const $onboardingSteps = $("#backwpup-onboarding-steps"); const $onboardingPanes = $("#backwpup-onboarding-panes"); const lineStyles = "before:bg-secondary-base"; const circleActiveStyles = "bg-secondary-base after:absolute after:z-10 after:inset after:w-12 after:h-12 after:border-secondary-base after:border after:rounded-full after:animate-pulse"; const circleReachedStyles = "bg-secondary-base"; $(".js-backwpup-onboarding-step-1").on('click', function () { $onboardingPanes.find("article").removeClass("flex").addClass("hidden"); $onboardingPanes .find("article[data-step=1]") .removeClass("hidden") .addClass("flex"); $onboardingSteps .find("article[data-step=2]") .removeClass(lineStyles) .find("div:first-child") .removeClass(circleActiveStyles); closeSidebar(); }); $(".js-backwpup-onboarding-step-2").on('click', function () { $onboardingPanes.find("article").removeClass("flex").addClass("hidden"); $onboardingPanes .find("article[data-step=2]") .removeClass("hidden") .addClass("flex"); $onboardingSteps .find("article[data-step=2]") .addClass(lineStyles) .find("div:first-child") .addClass(circleActiveStyles); $onboardingSteps .find("article[data-step=1] div:first-child") .removeClass(circleActiveStyles) .addClass(circleReachedStyles); $onboardingSteps .find("article[data-step=3]") .removeClass(lineStyles) .find("div:first-child") .removeClass(circleActiveStyles); closeSidebar(); }); $(".js-backwpup-onboarding-step-3").on('click', function () { $onboardingPanes.find("article").removeClass("flex").addClass("hidden"); $onboardingPanes .find("article[data-step=3]") .removeClass("hidden") .addClass("flex"); $onboardingSteps .find("article[data-step=3]") .addClass(lineStyles) .find("div:first-child") .addClass(circleActiveStyles); $onboardingSteps .find("article[data-step=2] div:first-child") .removeClass(circleActiveStyles) .addClass(circleReachedStyles); closeSidebar(); }); // Verifies onboarding form and submit it. $(".js-backwpup-onboarding-submit-form").on('click', function() { const checkedStorageCheckboxes = $('input[type="checkbox"][name^="onboarding_storage"]:checked'); if (0 !== checkedStorageCheckboxes.length) { $("#backwpup-onboarding-form").submit(); } else { // TODO Show ERROR } }); // Toggle storages $document.on('click', ".js-backwpup-toggle-storage", function() { const content = $(this).data("content"); openSidebar(content); }); $('.js-backwpup-refresh-authentification').on('click', function() { let trigger = $(this).data('trigger'); if (typeof window[trigger] === 'function') { window[trigger](); } else { eval(trigger); } closeModal(); }); // Open a modal to wait for authentication and focus on an input on after window.modal_and_focus = function (event) { let that = $(event.currentTarget); openModal('dialog'); const focus = that.data('id-focus-after'); $('.js-backwpup-refresh-authentification').data('trigger', '$("#'+focus+'").focus()'); window.open(that.data('url'), '_blank'); } $('.js-backwpup-modal-and-focus').on('click', modal_and_focus); function initOnedriveEvents() { // Toggle OneDrive reauthenticate action. $('.js-backwpup-onedrive-reauthenticate').on('click', function() { openModal('dialog'); $('.js-backwpup-refresh-authentification').data('trigger', 'onedrive_refresh_authentification'); window.open($(this).data('url'), '_blank'); }); // Toggle OneDrive Api connection first step $('.js-backwpup-one-drive-connect-api').on('click', function() { const details = $(this).closest('details'); let data = { 'backwpup_cfg_onedriveclientsecret' : { 'value': $('#backwpup_cfg_onedriveclientsecret').val(), 'secure': true, }, 'backwpup_cfg_onedriveclientid' : { 'value': $('#backwpup_cfg_onedriveclientid').val(), 'secure': false, }, } requestWPApi( backwpupApi.save_site_option, data, function (response) { $('#onedrive_authenticate_infos').removeClass('text-danger').addClass('text-secondary-base').html(response.message); // Remove the 'open' attribute details.removeAttr('open'); }, "POST", function (request, error) { $('#onedrive_authenticate_infos').removeClass('text-secondary-base').addClass('text-danger').html(request.responseJSON?.error ?? "Error"); } ) }); } // Validate storage. $(".js-backwpup-test-storage").on('click', function() { const data = { action: "backwpup_test_storage", storage: $(this).data("storage"), }; postToWP(data).then((body) => { $(`input[name=storage_${data.storage}]`).prop("checked", true); const inSidebar = $(this).closest("#backwpup-sidebar").length > 0; if (!inSidebar) { closeSidebar(); } }); // TODO : remove (test purpose only while ajax request is not working) $(`input[name=storage_${data.storage}]`).prop("checked", true); const inSidebar = $(this).closest("#backwpup-sidebar").length > 0; const urlParams = new URLSearchParams(window.location.search); const page = urlParams.get('page'); // teste si on est dans le onboarding if (page === 'backwpuponboarding') { closeSidebar(); } else if (!inSidebar) { closeSidebar(); } else { openSidebar("storages"); } }); // Network settings function init_network_authentication() { const value = $(".js-backwpup-network-authentication-method").val(); let selector = "#network-"+value+"-authentication"; $(selector).show(); } init_network_authentication(); $(".js-backwpup-network-authentication-method").on('change', function() { $('#network-authentications').children('div').hide(); init_network_authentication(); }); // Submit action for sidebar forms $(".js-backwpup-sidebar-submit-form").on('click', function() { $(this).siblings("div").children().submit(); }); // OnBoarding toggle files. $(".js-backwpup-onboarding-toggle-files").on('change', function() { const checked = $(this).prop("checked"); $(".onboarding-advanced-files-settings").prop("disabled", !checked); $(".onboarding-files-frequency").prop("disabled", !checked); $(".onboarding-files-frequency-settings").prop("disabled", !checked); verifyOnboardingStep1(); }); // OnBoarding toggle database. $(".js-backwpup-onboarding-toggle-database").on('change', function() { const checked = $(this).prop("checked"); $(".onboarding-advanced-database-setings").prop("disabled", !checked); $(".onboarding-database-frequency").prop("disabled", !checked); $(".onboarding-database-frequency-settings").prop("disabled", !checked); verifyOnboardingStep1(); }); $(".js-backwpup-onboarding-files-frequency").on('change', function() { if ($("#sidebar-frequency-files")) { let select = $("#sidebar-frequency-files").find("select[name='frequency']"); select.val(this.value); select.trigger('change'); } }); $(".js-backwpup-onboarding-database-frequency").on('change', function() { if ($("#sidebar-frequency-tables")) { let select = $("#sidebar-frequency-tables").find("select[name='frequency']"); select.val(this.value); select.trigger('change'); } }); // OnBoarding verify step 1 function verifyOnboardingStep1() { const toggle_files_not_checked = !$(".js-backwpup-onboarding-toggle-files").prop("checked"); const toggle_database_not_checked = !$(".js-backwpup-onboarding-toggle-database").prop("checked"); if (toggle_files_not_checked && toggle_database_not_checked) { $('.js-backwpup-onboarding-step-2').prop("disabled", true); } else { $('.js-backwpup-onboarding-step-2').prop("disabled", false); } } /** * Refreshes the backup table with the provided response data. * * This function updates the backup history table with new HTML content from the response, * reinitializes necessary components, and refreshes the pagination. * * @param {Object} response - The response object containing the success status and data. * @param {boolean} response.success - Indicates if the response was successful. * @param {string} response.data - The HTML content to be inserted into the table. * @param {Object} data - Additional data required for pagination. * @param {number} data.page - The current page number. * @param {number} data.length - The number of items per page. */ function refreshBackupTable(response, data) { if (response.success && response.data) { // Extract the HTML content from the response var htmlContent = response.data; // Use jQuery.parseHTML to decode and safely insert the response into the DOM var parsedHTML = jQuery.parseHTML(htmlContent); var tableBody = jQuery('#backwpup-backup-history tbody'); tableBody.html(parsedHTML); // Reinitialize downloader, menu, and modal actions window.BWU.downloader.init(); initMenuEvent(); initModalEvent(); // Calculate max pages and refresh the pagination let max_pages = Math.ceil(jQuery('input[name="nb_backups"]').val() / data.length); requestWPApi(backwpupApi.backupspagination, { page: response.page, max_pages: max_pages }, refreshPagination, 'POST'); const searchParams = new URLSearchParams(window.location.search); if (searchParams.has('page_num')) { let page_num = searchParams.get('page_num'); if (parseInt(page_num) !== parseInt(response.page) && parseInt(response.page) > 0) { searchParams.set('page_num', response.page); window.location.search = searchParams; } } } } /** * Refreshes the pagination section with new HTML content from the server response. * * @param {Object} response - The response object from the server. * @param {boolean} response.success - Indicates if the request was successful. * @param {string} response.data - The HTML content to update the pagination section. */ function refreshPagination(response) { if (response.success && response.data) { // Get the HTML content from the response var htmlContent = response.data; // Parse HTML and append the response var parsedHTML = jQuery.parseHTML(htmlContent); var pagination = jQuery('#backwpup-pagination'); pagination.html(parsedHTML); // Safely add the parsed HTML // Reinitialize pagination events initPaginationEvent(); } } // Initialize the backup table and the pagination only if there is a backup table if (jQuery('#backwpup-backup-history tbody').length>0) { loadBackupsListingAndPagination(getUrlParameter('page_num', 1)); } // Init the modals events initModalEvent(); initSugarSyncEvents(); initDropboxEvents(); initOnedriveEvents(); initGdriveEvents(); initHidriveEvents(); initFTPEvents(); $(document).on( 'change', '#backwpup-job-title', function() { if ( ! $(this).val().trim() ) { $('#js-backwpup-edit-title-warning').removeClass('hidden'); $('#js-backwpup-save-title').prop('disabled', true); return; } if ( $('#js-backwpup-edit-title-warning').hasClass('hidden') ) { return; } $('#js-backwpup-edit-title-warning').addClass('hidden'); $('#js-backwpup-save-title').prop('disabled', false); } ); $(document).on('click', '#js-backwpup-save-title', function(event) { event.preventDefault(); const job_id = $('#backwpup-job-id').val(); const data = { title: $('#backwpup-job-title').val(), job_id: job_id, }; requestWPApi( backwpupApi.updatejobtitle, data, function(response) { if (response.code === 'success') { $('#backwpup-'+job_id+'-options').find('.backwpup-job-title').html(response.data.title); backwpupDisplaySettingsToast( 'success', response.message ); closeSidebar(); getBackWPupMessages(); } }, "POST", function(request) { backwpupDisplaySettingsToast( 'danger', request.responseJSON.message ); } ); }); // Add event listener for the 'Apply' button to trigger the bulk delete action $("#bulk-actions-apply").on('click', function () { const action = $('#bulk-actions-select').val() || $(this).data("action"); if (!action) { return; } const selectedBackups = $backupsTable.find("input[type=checkbox]:checked").map(function () { return { dataset: $(this).data("delete"), }; }).get(); if (action === 'delete') { if (!selectedBackups.length) { return; } pendingBulkDelete = selectedBackups; $modal.find("#sidebar-bulk-delete-backups .js-backwpup-bulk-delete-backups").prop('disabled', false); openModal('bulk-delete-backups'); return; } requestWPApi(backwpupApi.backups_bulk_actions, { action: action, backups: selectedBackups }, function (response) { // Refresh the backup table after deletion loadBackupsListingAndPagination(getUrlParameter('page_num', 1)); }, "POST"); $(".js-backwpup-select-all").prop("checked", false); }); $(document).on('click', '.js-backwpup-bulk-delete-backups', function () { if (!pendingBulkDelete || pendingBulkDelete.length === 0) { closeModal(); return; } $(this).prop('disabled', true); requestWPApi(backwpupApi.backups_bulk_actions, { action: 'delete', backups: pendingBulkDelete }, function (response) { // Refresh the backup table after deletion loadBackupsListingAndPagination(getUrlParameter('page_num', 1)); closeModal(); }, "POST"); pendingBulkDelete = null; $(".js-backwpup-select-all").prop("checked", false); $('#bulk-actions-select').val(''); $("#bulk-actions-apply").prop("disabled", true); }); $('#bulk-actions-select').on('change', function() { const selectedAction = $(this).val(); $('#bulk-actions-apply').data('action', selectedAction); const hasSelection = $(".js-backwpup-select-backup:checked").length > 0; $("#bulk-actions-apply").prop("disabled", selectedAction !== 'delete' || !hasSelection); }); // Handle Save Settings - excluded tables button click for table selection $document.on('click', "#save-excluded-tables", function () { // Collect all checkbox elements in the container const allCheckboxes = $(".js-backwpup-tables-list input[type='checkbox']"); const closestArticle = $(this).closest("article"); const checkedTables = []; // Loop through all checkboxes and collect the checked ones allCheckboxes.each(function () { if ($(this).is(":checked")) { checkedTables.push($(this).val()); } }); // Collect hidden fields dynamically const hiddenFields = closestArticle.find("input[type='hidden']"); const adjustedFormData = []; hiddenFields.each(function () { adjustedFormData.push({ name: $(this).attr("name"), value: $(this).val() }); }); // Add the checked tables as tabledb[] values checkedTables.forEach(function (table) { adjustedFormData.push({ name: "tabledb[]", value: table }); }); // Convert adjusted form data to a query string const serializedData = $.param(adjustedFormData); // Send the adjusted data to the API requestWPApi( backwpupApi.save_excluded_tables, serializedData, function (response) { if (response.status === 200) { if ( ! $("#backwpup-onboarding-panes").length ) { backwpupDisplaySettingsToast('success', response.message); getBackWPupMessages(); } closeSidebar(); } }, "POST" ); }); $('.js-backwpup-license_update').on('click', update_license); $document.on('click', '.file-exclusions-submit', function (e) { const $article = $(this).closest('article'); const $inputs = $article.find('input'); const formData = {}; // Helper function to add values to formData function addToFormData(name, value) { if (name.endsWith('[]')) { if (!formData[name]) { formData[name] = []; } if (value) { formData[name].push(value); } } else { formData[name] = value; } } // Collect input data from the closest article $inputs.each(function () { if ($(this).is(':checkbox')) { if ($(this).is(':checked')) { addToFormData($(this).attr('name'), $(this).val()); } } else { addToFormData($(this).attr('name'), $(this).val()); } }); // Collect input data from all relevant modals $('[id^="sidebar-exclude-files-"]').each(function () { const $modalInputs = $(this).find('input'); $modalInputs.each(function () { if ($(this).is(':checkbox')) { if ($(this).is(':checked')) { addToFormData($(this).attr('name'), $(this).val()); } } else { addToFormData($(this).attr('name'), $(this).val()); } }); }); // Convert formData to a query string const serializedData = $.param(formData); requestWPApi(backwpupApi.save_file_exclusions, serializedData, function (response) { if (response.status === 200) { closeSidebar(); if ( ! $("#backwpup-onboarding-panes").length ) { backwpupDisplaySettingsToast('success', response.message); getBackWPupMessages(); } } }, 'POST'); }); function isGenerateJsIncluded() { const scripts = document.querySelectorAll('script'); let scriptName = 'backwpup-generate.js'; let scriptNameMin = 'backwpup-generate.min.js'; for ( let script of scripts ) { if ( script.src.includes( scriptName ) || script.src.includes( scriptNameMin ) ) { return true; } } return false; } // Function to start the backup process using requestWPApi function startBackupProcess( data = {} ) { $document.trigger('start-backupjob'); requestWPApi( backwpupApi.startbackup, data, function(response) { if (response.status === 200) { window.location.reload(); } else if (response.status === 201) { backwpupDisplaySettingsToast('success', response.message); setTimeout(function() { window.location.reload(); }, 750); }else if ( 301 === response.status ) { window.location = response.url; } else if ( 500 === response.status ) { backwpupDisplaySettingsToast('danger', response.message, -1); $document.trigger('backup-complete'); } }, 'POST', function(request, error) { backwpupDisplaySettingsToast('danger', 'Get an undefined error on trying to start backup! You can find more information in the browser console.', -1); $document.trigger('backup-complete'); } ); } $(document).on('start-backupjob', function () { enableBackupButton(false); enableDeleteJob(false); }); // Re-enable buttons when a backup completes $(document).on('backup-complete', function () { enableBackupButton(true); enableDeleteJob(true); loadBackupsListingAndPagination(getUrlParameter('page_num', 1)); }); // Call the functions when the "First Backup" page is loaded if (window.location.search.includes('backwpupfirstbackup')) { if ( ! isGenerateJsIncluded() ) { let first_job_id = $('#backwpup_first_backup_job_id').val(); requestWPApi(backwpupApi.startbackup, {first_backup: 1, job_id : first_job_id}, function(response) { if (201 === response.status || 200 === response.status) { setTimeout(function() { window.location.reload(); }, 500); } else if ( 301 === response.status ) { window.location = response.url; } }, 'POST'); } } var buyProMenuItem = $('#toplevel_page_backwpup ul li a[href="admin.php?page=buypro"]'); if (buyProMenuItem.length) { buyProMenuItem.attr('target', '_blank'); } var DocsMenuItem = $('#toplevel_page_backwpup ul li a[href="admin.php?page=docs"]'); if (DocsMenuItem.length) { DocsMenuItem.attr('target', '_blank'); } // Handle bwpup-ajax-close $('.bwpup-ajax-close').click( function(e) { e.preventDefault(); let current_close = $(this); let url = current_close.attr( 'href' ); if ( ! url ) { return; } let hide_id = current_close.data('bwpu-hide'); $('#'+hide_id).fadeTo('slow', '0.2'); $.ajax({ url, success: function(response) { $('#'+hide_id).hide(); }, }); } ); // hide toast on click. $(document).on('click', '#bwp-settings-toast .dismiss-icon', function(event) { const toast = event.target.closest(".flex.items-center.gap-2.p-4.rounded"); toast.classList.remove("oopacity-100"); toast.classList.remove("translate-y-0"); toast.classList.add("opacity-0"); toast.classList.add("translate-y-2"); setTimeout(() => { toast.parentElement.remove(); }, 300); }); /** * Function to initialize the frequency job settings * Runs when the element `.js-backwpup-frequency-job` is found in the DOM. */ function runWhenJobFrequencySettingsLoaded() { const $element = $(".js-backwpup-frequency-job"); if ($element.length) { showFrequencyJobFields($element.val()); // Update UI based on the selected frequency } } /** * Function to initialize the frequency job settings * Runs when the element `.js-backwpup-frequency-job` is found in the DOM. */ function runWhenJobFormatSettingsLoaded() { const $element = $(".js-backwpup-format-job"); if ($element.length) { showArchiveFormatJobFields($element); } } /** * MutationObserver: Watches for new elements being added to the DOM * When a `.js-backwpup-frequency-job` field appears, it triggers `runWhenJobFrequencySettingsLoaded()` */ const observer = new MutationObserver(function (mutations) { mutations.forEach(function (mutation) { mutation.addedNodes.forEach(function (node) { // Check if the added node or any of its children contains `.js-backwpup-frequency-job` if ($(node).is(".js-backwpup-frequency-job") || $(node).find(".js-backwpup-frequency-job").length) { runWhenJobFrequencySettingsLoaded(); } const format_job_element = $(node).find(".js-backwpup-format-job"); if ($(node).is(".js-backwpup-format-job") || format_job_element.length) { showArchiveFormatJobFields(format_job_element); } }); }); }); // Start observing DOM changes on the entire document observer.observe(document.body, { childList: true, subtree: true }); /** * Event Listener: Detect changes in format dropdown * Calls `showArchiveFormatJobFields()` whenever the user selects a new frequency. */ $document.on("change", ".js-backwpup-format-job", function () { showArchiveFormatJobFields($(this)); }); /** * Event Listener: Detect changes in archive name input * Calls `showArchiveFormatJobFields()` whenever the user selects a new frequency. */ $document.on("input", ".js-backwpup-format-job-name", function () { let name = $(this).val(); let error_box = $(this).closest(`div`).find(`.js-backwpup-format-job-name-no-hash`); if ( ! name ) { return; } if ( name.includes('%hash%') ) { error_box.hide(); } else { error_box.show(); } //replace plaseholder let name_preview_span = error_box.parent().find(`.js-backwpup-format-archive-name`); let name_previev = name.trim().replace('%hash%', name_preview_span.data('hash')); const date = new Date(); let hourIn12Format = date.getHours(); let dayPart = 'am' if (hourIn12Format > 12) { hourIn12Format = hourIn12Format - 12; dayPart = 'pm' } name_previev = name_previev.replace('%d', String(date.getDate()).padStart(2, '0')); name_previev = name_previev.replace('%m', String(date.getMonth() + 1).padStart(2, '0')); name_previev = name_previev.replace('%n', String(date.getMonth() + 1)); name_previev = name_previev.replace('%j', date.getDate()); name_previev = name_previev.replace('%Y', date.getFullYear()); name_previev = name_previev.replace('%y', String(date.getFullYear()).slice(-2)); name_previev = name_previev.replace('%a', dayPart); name_previev = name_previev.replace('%A', dayPart.toUpperCase()); let btm = ( ( date.getHours() * 60 + date.getMinutes() ) * 86.4 / 100 ).toFixed(0); name_previev = name_previev.replace('%B', btm); name_previev = name_previev.replace('%g', hourIn12Format); name_previev = name_previev.replace('%G', date.getHours()); name_previev = name_previev.replace('%h', String(hourIn12Format).padStart(2, '0')); name_previev = name_previev.replace('%H', String(date.getHours()).padStart(2, '0')); name_previev = name_previev.replace('%i', date.getMinutes()); name_previev = name_previev.replace('%s', date.getSeconds()); //replace special chars let specialChars = [ '?', '[', ']', '/', '\\', '=', '<', '>', ':', ';', ',', "'", '"', '&', '$', '#', '*', '(', ')', '|', '~', '`', '!', '{', '}' ]; specialChars.forEach(function (char) { name_previev = name_previev.replace(char, ''); }); let spaces = [ ' ', '%20', '+' ]; spaces.forEach(function (space) { name_previev = name_previev.replace(space, '_'); }); let divider = [ '\t', '\r', '\n' ]; divider.forEach(function (divider) { name_previev = name_previev.replace(divider, '-'); }); name_preview_span.text(name_previev); }); /** * Function to show/hide elements based on selected job archive format * @param {string} element - the element to check. */ function showArchiveFormatJobFields(element) { let format = element.val(); let alert_box = element.closest(`div`).next(`.js-backwpup-format-job-show-if-zip`); if (format === ".zip") { alert_box.show(); } else { alert_box.hide(); } let name_preview = alert_box.parent().find(`.js-backwpup-format-archive-name-format`); if ( name_preview ) { name_preview.text(format); } } /** * Event Listener: Detect changes in frequency dropdown * Calls `showFrequencyJobFields()` whenever the user selects a new frequency. */ $document.on("change", ".js-backwpup-frequency-job", function () { showFrequencyJobFields($(this).val()); }); /** * Function to show/hide elements based on selected job frequency * @param {string} frequency - The selected frequency value (e.g., "hourly", "weekly", "monthly"). */ function showFrequencyJobFields(frequency) { const frequencies = ["daily", "weekly", "monthly"]; const hideClasses = [ ".js-backwpup-frequency-job-show-if-hourly", ".js-backwpup-frequency-job-show-if-weekly", ".js-backwpup-frequency-job-show-if-monthly", ".js-backwpup-frequency-job-hide-if-hourly", ".js-backwpup-frequency-job-show-if-link", ]; // Hide all elements initially $(hideClasses.join(", ")).hide(); // Show the elements that should be visible for the selected frequency if (frequencies.includes(frequency)) { $(".js-backwpup-frequency-job-hide-if-hourly").show(); } $(`.js-backwpup-frequency-job-show-if-${frequency}`).show(); } /** * Event Listener: Handles the "Save Job Settings" button click * Extracts form data and sends an AJAX request to save the job settings. */ $document.on("click", "#save-job-settings", function () { const container = $(this).closest("article"); // Collect input values from the form const data = { frequency: container.find("select[name='frequency']").val(), start_time: container.find("input[name='start_time']").val(), hourly_start_time: container.find("select[name='hourly_start_time']").val(), day_of_week: container.find("select[name='day_of_week']").val(), day_of_month: container.find("select[name='day_of_month']").val(), job_id: container.find("input[name='job_id']").val(), }; // Send AJAX request to save job settings requestWPApi( backwpupApi.save_job_settings, data, function (response) { if (response.status === 200) { // Update the next scheduled backup time in the UI $(`#backwpup-${data.job_id}-options div span.label-scheduled`).html(response.next_backup); // Sync onboarding frequency dropdown (if present) const onboardingPane = $("#backwpup-onboarding-panes"); const sidebarFrequency = $("#sidebar-frequency").find("select[name='frequency']"); if (onboardingPane.length) { console.log("select[name='job_"+data.job_id+"_frequency']"); onboardingPane.find("select[name='job_"+data.job_id+"_frequency']").val(sidebarFrequency.val()); } else { backwpupDisplaySettingsToast('success', response.message); getBackWPupMessages(); } // Close the settings sidebar closeSidebar(); } }, "POST" ); }); /** * Event Listener: Handles the "Save Job Format Settings" button click * Extracts form data and sends an AJAX request to save the job format settings. */ $document.on("click", "#save-job-format", function () { const container = $(this).closest("article"); // Collect input values from the form const data = { archiveformat: container.find("select[name='archiveformat']").val(), archivename: container.find("input[name='archivename']").val(), job_id: container.find("input[name='job_id']").val(), }; // Send AJAX request to save job settings requestWPApi( backwpupApi.save_job_format, data, function (response) { if (response.status === 200) { backwpupDisplaySettingsToast('success', response.message); getBackWPupMessages(); // Close the settings sidebar closeSidebar(); } if (response.status === 500) { backwpupDisplaySettingsToast('danger', response.error); } }, "POST" ); }); // Run the job settings function on initial page load runWhenJobFrequencySettingsLoaded(); runWhenJobFormatSettingsLoaded(); $document.on('click', '.backwpup-start-backup-job', function () { startBackupProcess({ 'job_id': $(this).data('job_id') }); closeModal(); }); }); // Add a custom 'hide' event when the .hide() function is called (function ($) { var originalHide = $.fn.hide; $.fn.hide = function () { this.trigger('hide'); // Trigger 'hide' event return originalHide.apply(this, arguments); }; })(jQuery); /** * Unselects a storage option by sending a request to the WordPress API. * */ document.addEventListener("DOMContentLoaded", function() { document.addEventListener("click", function (event) { const copy_button = event.target.closest('.js-backwpup-copy-clipboard '); if( copy_button ) { const parentDiv = copy_button.closest('.js-frequency-link-url'); const textSpan = parentDiv.querySelector('.backwpup-backup-link'); const textToCopy = textSpan.textContent.trim(); navigator.clipboard.writeText(textToCopy).then(function() { const originalText = copy_button.textContent; copy_button.textContent = 'Copied!'; copy_button.style.backgroundColor = '#10b981'; copy_button.setAttribute('aria-label', 'Backup link copied to clipboard'); const liveRegion = parentDiv.querySelector('[role="status"]'); if(liveRegion) { liveRegion.textContent = 'Backup link copied to clipboard'; } setTimeout(() => { copy_button.textContent = originalText; copy_button.style.backgroundColor = ''; copy_button.setAttribute('aria-label', 'Copy backup link to clipboard'); if(liveRegion) { liveRegion.textContent = ''; } }, 2000); }).catch(function(err) { console.error('Failed to copy:', err); // Fallback for older browsers fallbackCopy(textToCopy); }); } // Handle locked (PRO-only) storage option click — track attempt, do not navigate. const locked_storage = event.target.closest('.js-backwpup-locked-storage'); if (locked_storage) { event.preventDefault(); postToWP({ action: 'backwpup_track_nudge', event: 'locked_option_click', storage: locked_storage.dataset.storage || '', nonce: backwpupApi.nudge_nonce, }); return; } // Handle nudge CTA click — track before navigating to the upgrade page. const nudge_cta = event.target.closest('.js-backwpup-nudge-cta'); if (nudge_cta) { postToWP({ action: 'backwpup_track_nudge', event: 'nudge_click', storage: nudge_cta.dataset.storage || 'storage_selection', nonce: backwpupApi.nudge_nonce, }); // Do not return — let the anchor navigate to the upgrade page. } const uri_span = event.target.closest('.js-copy-uri'); if (uri_span) { var textToCopyUri = uri_span.dataset.uri; navigator.clipboard.writeText(textToCopyUri).then(function () { var originalText = uri_span.textContent; uri_span.textContent = 'Copied!'; setTimeout(function () { uri_span.textContent = originalText; }, 1500); }).catch(function (err) { console.error('Failed to copy URI:', err); fallbackCopy(textToCopyUri); }); } const storage_button = event.target.closest('.js-backwpup-select-storage'); if (!storage_button) { return; } const storage_checkbox = storage_button.querySelector('input[type="checkbox"]'); if (!storage_checkbox) { return; } const data = { 'job_id': storage_button.dataset.jobId, 'name': storage_button.dataset.storage, 'checked': storage_checkbox.checked ? 1 : 0, }; if (typeof requestWPApi === 'function') { requestWPApi(backwpupApi.storages, data, function(response) { if ( response.status === 200 ) { storage_checkbox.checked = data.checked !== 1; } }, 'POST', function (request, error) { console.log(request); console.log(error); alert(request.responseJSON.error); }); } }) }); //show notice if debug log level is active document.addEventListener("DOMContentLoaded", function() { document.addEventListener('change', function (event) { const log_level_setting = event.target.closest('select[name="loglevel"]'); if (log_level_setting) { const debug_log_level = log_level_setting.value.includes('debug'); const debug_log_notice = document.querySelector('.js-backwpup-show-if-debug-log-active'); if (!debug_log_notice) { return; } if (debug_log_level) { debug_log_notice.classList.remove('hidden'); } else { debug_log_notice.classList.add('hidden'); } } }) })
[-] backup-downloader.min.js
[edit]
[-] page_edit_jobtype_dbdump.js
[edit]
[-] sidebar.js
[edit]
[-] admin-chatbot.min.js
[edit]
[-] settings-encryption.js
[edit]
[-] backup-downloader.js
[edit]
[-] restore.min.js
[edit]
[-] page_edit_jobtype_dbdump.min.js
[edit]
[-] admin-rating.js
[edit]
[-] settings-encryption.min.js
[edit]
[-] page_edit_tab_cron.min.js
[edit]
[-] backwpup-job.min.js
[edit]
[-] notice.min.js
[edit]
[-] backwpup-admin.min.js
[edit]
[-] backwpup-generate.min.js
[edit]
[-] general.js
[edit]
[-] page_edit_jobtype_file.js
[edit]
[-] backwpup-admin.js
[edit]
[+]
..
[-] page_edit_tab_job.js
[edit]
[-] page_settings.js
[edit]
[-] page_edit_jobtype_file.min.js
[edit]
[-] admin-rating.min.js
[edit]
[-] admin-chatbot.js
[edit]
[-] sidebar.min.js
[edit]
[-] page_settings.min.js
[edit]
[-] backwpup-generate.js
[edit]
[-] page_edit_tab_cron.js
[edit]
[-] restore.js
[edit]
[-] page_edit_tab_job.min.js
[edit]
[-] backwpup-onboarding.js
[edit]
[-] general.min.js
[edit]
[+]
vendor
[-] backwpup-job.js
[edit]
[-] notice.js
[edit]
[-] backwpup-onboarding.min.js
[edit]