FellowshipOne Profile Page - Add Custom Actions

Add custom links and macros to the profile page

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         FellowshipOne Profile Page - Add Custom Actions
// @namespace    [email protected]
// @version      0.4
// @description  Add custom links and macros to the profile page
// Including 1) Macro: Add Need Parent Info Tag Comment
//           2) Open reference sitt to check gender of first name
//           3) Open reference site reverse address searcj Whitepages
//           4) View basic giving details
//           5) Macro: Set status and substatus for All Head/Spouse/Children
// @author       Tony Visconti
// @match        https://portal.fellowshipone.com/people/Individual/Index.aspx?id=*
// @match        https://portal.staging.fellowshipone.com/people/Individual/Index.aspx?id=*
// @grant        none
// @homepage         https://greasyfork.org/en/scripts/39004-fellowshipone-profile-page-add-custom-actions
// This script ties to FellowshipOne Edit Person Page: Run Macro and FellowshipOne Household Edit Page: Run Macro
// ==/UserScript==

//---------- Functions ----------
//function is compliments of http://www.jquerybyexample.net/2012/06/get-url-parameters-using-jquery.html
function getUrlParameter(sParam) {
  var searchParams = new URLSearchParams(document.location.search.substring(1));
  return searchParams.get(sParam); 
}

//basic javascript ajax was used here instead of jquery because I couldn't get it to work with F1's version of jquery. When I loaded my own I also ran into issues.
function CheckForGiving(url, searchText,func,element)
{
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function()
    {
        if (this.readyState == 4 && this.status == 200)
        {
            var regExp = new RegExp(searchText, "i");
            console.log("Checking for giving records");
            var textFound = this.responseText.search(regExp);
            //console.log(this.responseText);

            parser = new DOMParser();
            xmlDoc = parser.parseFromString(this.responseText,"text/html");
            var numGifts = "";
            var lastFundGivenTo = "";
            var lastGiftDate = "";
            if(xmlDoc.querySelector('#repTable > tbody > tr:nth-child(2) > td:nth-child(4) > div')!= null)
            {
                lastFundGivenTo = xmlDoc.querySelector('#repTable > tbody > tr:nth-child(2) > td:nth-child(4) > div').innerText;
                lastGiftDate = xmlDoc.querySelector('#repTable > tbody > tr:nth-child(2) > td:nth-child(1)').innerText;
                //console.log('Last fund given to: '+lastFundGivenTo.trim().toUpperCase());
                numGifts = xmlDoc.querySelectorAll('#repTable > tbody > tr').length-1;

                var dateString = NOW.getMonth()+1+'/'+NOW.getDate()+'/'+NOW.getFullYear();
                console.log('Total gifts since ' +dateString+': ' + numGifts);
            }

            if(textFound <=0)
            {
                //console.log("Search Text: \"" +searchText + "\" not found");
                func(element,true,lastFundGivenTo,numGifts,lastGiftDate);
            }
            else
            {
                //console.log("Search Text: \"" +searchText + "\" found");
                func(element,false,"","");
            }
        }
    };

    //setup form data
    var formData = new FormData();
    formData = '__EVENTTARGET=ctl00$ctl00$MainContent$content$dteStartDate';
    var dateString = NOW.getMonth()+1+'/'+NOW.getDate()+'/'+NOW.getFullYear();
    console.log('Current Date: ' + dateString);
    formData += '&ctl00$ctl00$MainContent$content$dteStartDate=1/1/2017';
    formData += '&ctl00$ctl00$MainContent$content$dteEndDate='+ dateString;
    formData += '&ctl00$ctl00$MainContent$content$ddlFilter=All';

    //open and send request
    xhttp.open("POST", url , true);
    xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xhttp.send(formData);
}


function AddContributionLink(element, contributionsFound,lastFundGivenTo, numGifts,lastGiftDate)
{
    var text = "View Contribution Details";
    var lastYear = NOW.getFullYear()-1;
    var givingDetails = "";
    if(contributionsFound)
    {
        givingDetails += ""+ numGifts + ' gifts exist since ' + lastYear;
        givingDetails += "<br>" + 'Last gift (' + lastGiftDate.trim() + '): '+ lastFundGivenTo;

    }
    else
    {
        givingDetails += ""+ "No Giving Exists Since " + lastYear;
    }
    var contributionsLink = '<li><a target="_blank" href="https://portal.fellowshipone.com/giving/householdcontribution2.aspx">'+text+'</a><br>'+givingDetails+'</li>';
    element.innerHTML += contributionsLink;


}

function returnOptions(myArray)
{
    var str ="";
    for (let i = 0; i < myArray.length; i++)
    {
        str += "\n" + (i+1) + " : " + myArray[i];
    }
    return str;
}


function selectMacro(id,hsd)
{
    var promptValue = prompt("Please select macro:\n 1: Add tag comment\n 2: Set status for household\n 3: Reverse Address Search on Whitepages", "");
    var navigateTo = "";
    var statuses = ['New','Nominally Involved','Significantly Involved','Core','Not Recently Involved','Gone'];
    var subStatuses = ['Barrington','Grayslake','Hinsdale','Lake Zurich','Libertyville','McHenry','Mundelein','Palatine'];
    if (promptValue == "1")
    {
        navigateTo = '/People/Individual/Edit.aspx?IndID=' + id + '&HsdID=' + hsd + '&source=INDIVIDUALINDEXPROXY&customAction=TagCommentNeedParentInfo';
        //console.log('https://'+ window.location.hostname + navigateTo);
        window.location.href = 'https://'+ window.location.hostname + navigateTo;
    }

    if (promptValue == "2")
    {
        var statusSelection = parseInt(prompt("Enter Status:\n" + returnOptions(statuses)))-1;
        var subStatusSelection = parseInt(prompt("Enter Sub-Status:\n" + returnOptions(subStatuses)))-1;
        navigateTo = '/bridge/household/' + hsd + '/members/edit?customAction=SetStatus&Status=' + statuses[statusSelection] + '&SubStatus=' + subStatuses[subStatusSelection];
        //console.log('https://'+ window.location.hostname + navigateTo);
        window.location.href = 'https://'+ window.location.hostname + navigateTo;
    }
    if (promptValue == "3")
    {
        var street = document.querySelector("div.street-address").innerHTML;
        var city = document.querySelector("span.locality").innerHTML;
        var state = document.querySelector("abbr.region").innerHTML;
        var zip = document.querySelector("span.postal-code").innerHTML;
        var reverseAddressURL = "https://www.whitepages.com/search/FindNearby?street="+street.replace(' ','+')+'&where='+city+'+'+state+'+'+zip;
        window.open(reverseAddressURL);

    }
}
//---------- Inject Javascript Functions to foreground ----------
function injectFunction(functionStr)
{
    var script = document.createElement("script");
    script.type="text/javascript";
    script.innerHTML=functionStr;
    document.head.appendChild(script);
}

injectFunction(selectMacro.toString());
injectFunction(returnOptions.toString());

//---------- Main ----------
var NOW = new Date();
var id = getUrlParameter('id');
//Grab household Id
//tab_back link looks like this https://portal.fellowshipone.com/People/Family/Index.aspx?id=########
var hsd = document.getElementById("tab_back").href.match(/=[0-9]*/)[0].split('=')[1];

//Add Run Macro Button
var asideFirstSection = document.getElementsByClassName("aside")[0].children[1];
var runMacroElem = '<li><button onclick=selectMacro(' + id + ',' + hsd + ')>View Macros</button></li>';
asideFirstSection.innerHTML += runMacroElem;

// Add reverse address search link


// Add Check Gender Link
var firstName = document.getElementById("household_individual_name").innerHTML.split(" ")[0].trim();
var checkGenderLink = '<li><a target="_blank" href="https://api.genderize.io/?name=' + firstName + '">Check Gender Of First Name</a>';
asideFirstSection.innerHTML += checkGenderLink;


//Add Giving Preview Info
CheckForGiving('/giving/householdcontribution2.aspx?ind='+id+'&r=Contributions','no records found',AddContributionLink,asideFirstSection);