motiko / Shortcuts

// ==UserScript==
// @name         Shortcuts
// @namespace    SFDC
// @version      0.3.0
// @description  Salesforce keyboard shortcuts
// @author       motiko
// @match        https://*.force.com/*
// @match        https://*.salesforce.com/*
// @require      mousetrap.min.js
// @grant        GM_openInTab
// ==/UserScript==


(function(){
var sidCookie = document.cookie.match(/(^|;\s*)sid=(.+?);/);
var sid = sidCookie ? sidCookie[2] : false;


function inject(fn) {
    var script = document.createElement('script');
    script.setAttribute("type", "application/javascript");
    script.textContent = '(' + fn + ')();';
    document.body.appendChild(script); // run the script
    document.body.removeChild(script); // clean up
}

function sendBackUserId(){
    if(window.UserContext){
        window.postMessage({type: "userId", content: UserContext.userId}, "*");
    }
}

function sendBackOrgId(){
    if(document.cookie.indexOf('oid=') > -1){
        window.postMessage({type: "orgId", content: document.cookie.substr(document.cookie.indexOf('oid=') + 4, 15)}, "*");
    }
}

window.addEventListener("message", function(event) {
    var userId, orgId;
    if(event.data.type === "userId"){
        userId = event.data.content;
        shortcutUrl('d', "/setup/ui/listApexTraces.apexp?user_id=" + userId + "&user_logging=true");
    }
    if(event.data.type === "orgId"){
        orgId = event.data.content;
        shortcutUrl('i', '/' + orgId);
    }
});

inject(sendBackUserId);
inject(sendBackOrgId);

shortcutUrl('s', "/_ui/platform/schema/ui/schemabuilder/SchemaBuilderUi?setupid=SchemaBuilder");
shortcutUrl('o', "/p/setup/custent/CustomObjectsPage");
shortcutUrl('u', "/005?setupid=ManageUsers");
shortcutUrl('p', "/setup/ui/profilelist.jsp?setupid=Profiles");
shortcutUrl('c', "/01p?all_classes_page%3AtheTemplate%3AclassList%3Arowsperpage=3500");
shortcutUrl('a', "/05G");
shortcutUrl('t', "/setup/build/allTriggers.apexp?all_triggers_page%3AtheTemplate%3Aj_id41%3Arowsperpage=3000");
shortcutUrl('q', "/changemgmt/listOutboundChangeSet.apexp?retURL=%2Fui%2Fsetup%2FSetup%3Fsetupid%3DDeploy&setupid=OutboundChangeSet");
shortcutUrl('z', "/changemgmt/listInboundChangeSet.apexp?retURL=%2Fui%2Fsetup%2FSetup%3Fsetupid%3DDeploy&setupid=InboundChangeSet");
shortcutMethod('l', openLastLog);
Mousetrap.bind('e', editObject);
Mousetrap.bind('s', saveObject);

function shortcutMethod(char, method){
    Mousetrap.bind(['alt+shift+' + char], function(){
        method();
    });
    Mousetrap.bind(['shift+' + char], function(){
        method(true);
    });
}


function shortcutUrl(char, url){
    Mousetrap.bind(['alt+shift+' + char], function(){
        document.location.assign(url);
     });
    Mousetrap.bind(['shift+' + char], function(){
        openInNewTab(url);
    });
}

function openInNewTab(url){
    if(typeof GM_openInTab === 'function'){
        GM_openInTab(location.origin + url);
    }else if(typeof chrome !== "undefined"){
        chrome.runtime.sendMessage({url: `${location.protocol}//${location.host}${url}`, command: "openTab"});
    }else{
        window.open(url, '_blank');
    }
}

function editObject(){
    var editBtn = document.querySelector("input[name='edit']");
    if(editBtn){
        editBtn.click();
    }
}

function saveObject(){
    var saveBtn = document.querySelector("input[name='save']");
    if(saveBtn){
        saveBtn.click();
    }
}


function openLastLog(inNewTab){
    if(!sid){
        return;
    }
    request('/services/data/v32.0/tooling/query/?q=' + encodeURIComponent('SELECT Id,LastModifiedDate,StartTime,Status,SystemModstamp FROM ApexLog ORDER BY LastModifiedDate DESC Limit 1')).then(function(result){
        var reponseObj = JSON.parse(result);
        if(reponseObj.records && reponseObj.records.length > 0){
            var url = '/p/setup/layout/ApexDebugLogDetailEdit/d?apex_log_id=' + reponseObj.records[0].Id;
            if(inNewTab){
                openInNewTab(url);
            }else{
                document.location.assign(url);
            }
        }
    });
}

function request(url, method){
    method = method || 'GET';
    if(typeof GM_xmlhttpRequest === "function"){
        return new Promise(function(fulfill, reject){
            GM_xmlhttpRequest({
                method: method,
                url: url,
                headers: {
                    Authorization: 'Bearer ' + sid,
                    Accept: '*/*'
                },
                onload: function(response){
                    if( response.status.toString().indexOf('2') === 0){
                        fulfill(response.response);
                    }else{
                        reject(Error(response.statusText));
                    }
                },
                onerror: function(){
                    reject(Error("Network Error"));
                }
            });
        });
    }
    return new Promise(function(fulfill, reject){
        var xhr = new XMLHttpRequest();
        xhr.open(method, url);
        xhr.onload = function(){
            if( xhr.status.toString().indexOf('2') === 0){
                fulfill(xhr.response);
            }else{
                reject(Error(xhr.statusText));
            }
        };
        xhr.onerror = function(){
            reject(Error("Network Error"));
        };
        xhr.setRequestHeader('Authorization', 'Bearer ' + sid);
        xhr.send();
    });
}

})();