I need a UI Action with a progress bar to delete multiple records

Jerome MAISETTI
Mega Guru

Hello 

I need an UI Action at core_company level that once clicked, will delete all records associated to the current company on the task, cmdb_ci, ast_service & sys_user tables. 

I've created the following UI Action 

 

function DeleteCustomerData() {
    var answer = confirm("Are you sure you want to delete ALL DATA for this customer ?");
    if (answer == true) {
        // Show progress bar
        showProgressBar();

        // Call the server-side script
        var ga = new GlideAjax('DeleteCustomerDataScript');
        ga.addParam('sys_id', g_form.getUniqueValue());
        ga.getXMLAnswer(function(response) {
            var progressID = response.responseXML.documentElement.getAttribute('answer');
            monitorProgress(progressID);
        });
    } else {
        return false;
    }
}

function monitorProgress(progressID) {
    var intervalID = setInterval(function() {
        var gr = new GlideRecord('sys_execution_tracker');
        gr.get(progressID);

        var percentage = gr.getValue('progress');

        updateProgressBar(percentage);

        if (percentage >= 100) {
            clearInterval(intervalID);
            document.getElementById("progressModal").style.display = "none";
            gs.addInfoMessage("Data deletion complete.");
        }
    }, 1000);
}

 


Then, I've created two script includes : 

 

var DeleteCustomerDataScriptScript = Class.create();
DeleteCustomerDataScriptScript.prototype = Object.extendsObject(AbstractAjaxProcessor, {
    DeleteCustomerDataScript: function() {
        var customerSysId = this.getParameter('sys_id');
        var progressID = gs.generateGUID();
        var worker = new GlideScriptedProgressWorker();

        worker.setProgressName("Deleting Customer Data");
        worker.setScriptIncludeName("DeleteCustomerDataScriptWorker");
        worker.setScriptIncludeMethod("execute");
        worker.putMethodArg("sys_id", customerSysId);
        worker.setProgressID(progressID);
        worker.start();

        return progressID;
    }
});
var DeleteCustomerDataWorker = Class.create();
DeleteCustomerDataWorker.prototype = {
    initialize: function() {},

    execute: function(progress, customerSysId) {
        var customer = customerSysId;
        var tables = ['sys_user', 'cmdb_ci', 'alm_asset', 'task', 'ast_service', 'core_company'];
        var encodedQueries = ['company=' + customer, 'company=' + customer, 'company=' + customer, 'company=' + customer, 'u_company=' + customer, 'sys_id=' + customer];
        var totalCount = 0;

        for (var i = 0; i < tables.length; i++) {
            var gr = new GlideRecord(tables[i]);
            gr.addEncodedQuery(encodedQueries[i]);
            gr.query();
            totalCount += gr.getRowCount();
        }

        var deletedCount = 0;

        for (var i = 0; i < tables.length; i++) {
            var gr = new GlideRecord(tables[i]);
            gr.addEncodedQuery(encodedQueries[i]);
            gr.query();
            while (gr.next()) {
                gr.deleteRecord();
                deletedCount++;
                progress.setProgress((deletedCount / totalCount) * 100);
            }
        }

        gs.addInfoMessage("All tickets for the current customer that are assigned to Test Queue are now closed");
    },

    type: 'DeleteCustomerDataWorker'
};

 

When I click , I get the popup that asks if I'm sure I want to delete everything, but nothing else happens. 

Does someone got an idea on how I can make it work ? 
Would be nice for my administrators to have that progress bar so they ensure it's indeed deleting.. 

Thanks
Jérôme

1 REPLY 1

Jerome MAISETTI
Mega Guru

Does someone has any idea ? 😞