23
10/7/2013 #bbcon 1 PRESENTED BY: JUNIOR ACHIEVEMENT OF CANADA Maurice Kowanetz , BMath (Computer Science) - National Director, Information Technology Chris Weber - National Manager, Sponsorships and Fund Development Systems Think Outside of The Box Think “No Customization” with The Raiser's Edge and Blackbaud NetCommunity @JA_CANADA @MRCHRISWEBER #THINKOUTSIDEOFTHEBOX @BBCON Tweet about this session!

Think Out of the Box: Think No Customization with The Raiser's Edge and Blackbaud NetCommunity

Embed Size (px)

DESCRIPTION

bbcon 2013

Citation preview

Page 1: Think Out of the Box: Think No Customization with The Raiser's Edge and Blackbaud NetCommunity

10/7/2013 #bbcon 1

PRESENTED BY:

JUNIOR ACHIEVEMENT OF CANADA

Maurice Kowanetz, BMath (Computer Science)

- National Director, Information Technology

Chris Weber

- National Manager, Sponsorships and Fund Development Systems

Think Outside of The Box

Think “No Customization” with

The Raiser's Edge and Blackbaud NetCommunity

@JA_CANADA

@MRCHRISWEBER

#THINKOUTSIDEOFTHEBOX

@BBCON

Tweet about

this session!

Page 2: Think Out of the Box: Think No Customization with The Raiser's Edge and Blackbaud NetCommunity

10/7/2013 #bbcon 2

• Customizing software usually involves engaging a third party to

change the software itself

- Costly (both up front and in the future as the base software changes)

- Time consuming

- Never get exactly what you’re looking for

• Configuring software usually involves an expert user who is extremely

familiar with advanced features, and/or a motivated volunteer who is

an expert in their field

- Inexpensive

- Quick

- Will meet 80% to 90% of what you’re looking for

• Why pay thousands or tens of thousands of dollars to get 10% more of

what you’re looking for?

- Find the right people to get involved with your organization (or train your

staff!) to achieve what you need with little to no additional investment

CUSTOMIZE VS CONFIGURE, WHO CARES?

Page 3: Think Out of the Box: Think No Customization with The Raiser's Edge and Blackbaud NetCommunity

10/7/2013 #bbcon 3

• Social Media Login

• Use JavaScript to "tweak" the way Blackbaud NetCommunity works

- Introductory step-by-step guide that you can use yourself or pass along to

others

• Custom Templates

• Queries/Plug-ins for Auditing & Clean-up

• Crystal Reports

• To Host or Not To Host with Blackbaud

AGENDA

Page 4: Think Out of the Box: Think No Customization with The Raiser's Edge and Blackbaud NetCommunity

10/7/2013 #bbcon 4

SOCIAL MEDIA LOGIN

Page 5: Think Out of the Box: Think No Customization with The Raiser's Edge and Blackbaud NetCommunity

10/7/2013 #bbcon 5

• Why force your users to create yet another username/password to

register with your site? Enable social media login so that your users

can login to NetCommunity using a username/password they already

know

- When a user registers using social media, NetCommunity creates a “behind

the scenes” user called SocialWebXXXX, where XXXX is a unique number

- Setup Social Media for the first time in NetCommunity to integrate with the

social media login provider Janrain, then setup an application within each

social media site

• Search for “configure social media” in Blackbaud’s on-line knowledgebase

and click on “Create social media application and configure Janrain

settings” for full instructions

- Note there are some idiosyncrasies when it comes to password resets, since

social media accounts don’t need it, but NetCommunity’s password reset

routine still allows the user to reset the password for their SocialWebXXXX

username

SOCIAL MEDIA LOGIN

Page 6: Think Out of the Box: Think No Customization with The Raiser's Edge and Blackbaud NetCommunity

10/7/2013 #bbcon 6

• To setup NetCommunity to use your Javascript code:

- Login to NetCommunity as an Administrator

- Edit your site’s main Template (that all of your Pages are based on)

- Click on lowest Empty Content Pane on the Template, then click New Part

- Choose the Part type as “Unformatted Text”, give a name, then click next

- In the text area of the Part, copy/paste the following Javascript base code <script type="text/javascript" language="javascript">

function fncAfterAsyncPostBack() {

fncProcessJavascript();

}

function fncApplicationInitHandler() {

var objPageRequestManager = Sys.WebForms.PageRequestManager.getInstance();

objPageRequestManager.add_endRequest(fncEndHandler);

}

function fncEndHandler() {

fncAfterAsyncPostBack();

}

Sys.Application.add_init(fncApplicationInitHandler);

window.onload = fncProcessJavascript();

</script>

- On the following slides, you’ll copy/paste the Javascript code shown on the

slide right after the first line above that starts with <script…>

- Test, test, test…

• Internet Explorer 8, Internet Explorer 9, Internet Explorer 10,

Chrome, Firefox, Safari, etc

JAVASCRIPT FOR NETCOMMUNITY

Page 7: Think Out of the Box: Think No Customization with The Raiser's Edge and Blackbaud NetCommunity

10/7/2013 #bbcon 7

• Here is your first Javascript program to display a NetCommunity Page’s

browser title field & unique PC #, to test that everything works

- Add code below to base code on slide 4, below first line starting with <script…> function fncProcessJavascript() {

var objTitle, strTitle, strPCNumber;

if (document.getElementsByTagName("title")) {

objTitle = document.getElementsByTagName("title");

strTitle = objTitle[0].innerHTML;

strPCNumber = fncGetPCNumber();

if (strPCNumber != "") {

alert("You’re on the " + strTitle + " page, which has a unique PC number of " + strPCNumber);

}

}

}

function fncGetPCNumber() {

var strPCNumber, objSpan, i;

strPCNumber = "";

objSpan = document.getElementsByTagName("span");

for (i=0; i<objSpan.length; i++) {

if (objSpan[i].id.substring(0,2) == "PC") {

strPCNumber = objSpan[i].id.substring(0,objSpan[i].id.search("_"));

break;

}

}

return(strPCNumber);

}

JAVASCRIPT FOR NETCOMMUNITY

Page 8: Think Out of the Box: Think No Customization with The Raiser's Edge and Blackbaud NetCommunity

10/7/2013 #bbcon 8

• On any Page, limit Title picklist (if found) to only show top “x” items

JAVASCRIPT FOR NETCOMMUNITY

Page 9: Think Out of the Box: Think No Customization with The Raiser's Edge and Blackbaud NetCommunity

10/7/2013 #bbcon 9

• On any Page, limit Title picklist (if found) to only show top “x” items

- Add code below to base code on slide 4, below first line starting with <script…> function fncProcessJavascript() {

var strPCNumber;

strPCNumber = fncGetPCNumber();

if (strPCNumber != "") {

fncLimitTitle(strPCNumber);

}

}

function fncLimitTitle(strPCNumber) {

var objSelect, strElement = "";

if (document.getElementById(strPCNumber + "_ddTitle")) {

strElement = "_ddTitle";

} else if (document.getElementById(strPCNumber + "_BBControl5_0_0")) {

strElement = "_BBControl5_0_0";

} else if (document.getElementById(strPCNumber + "_Wizard1_DonationCapture1_cboTitle")) {

strElement = "_Wizard1_DonationCapture1_cboTitle";

} else if (document.getElementById(strPCNumber + "_DonationCapture1_cboTitle")) {

strElement = "_DonationCapture1_cboTitle";

}

if (strElement != "") {

objSelect = document.getElementById(strPCNumber + strElement);

objSelect.options.length = 9; // Show top 8 items in Title picklist (change 9 as required)

}

}

JAVASCRIPT FOR NETCOMMUNITY

Page 10: Think Out of the Box: Think No Customization with The Raiser's Edge and Blackbaud NetCommunity

10/7/2013 #bbcon 10

• On donation pages, reformat and align text (change “$1,000.00” to “$1,000”)

JAVASCRIPT FOR NETCOMMUNITY

Page 11: Think Out of the Box: Think No Customization with The Raiser's Edge and Blackbaud NetCommunity

10/7/2013 #bbcon 11

• On donation pages, reformat and align text (change “$1,000.00” to “$1,000”)

- Add code below to base code on slide 4, below first line starting with <script…> function fncProcessJavascript() {

var strPCNumber;

strPCNumber = fncGetPCNumber();

if (strPCNumber != "") {

fncReformatDollarColumn(strPCNumber);

}

}

function fncReformatDollarColumn(strPCNumber) {

var objTable, i;

if (document.getElementById(strPCNumber + "_tblAmount")) {

objTable = document.getElementById(strPCNumber + "_tblAmount");

for (i=0; i<objTable.rows.length - 1; i++) {

if (objTable.rows[i].cells[1].textContent) {

if (objTable.rows[i].cells[1].textContent.indexOf(".00") != -1) {

objTable.rows[i].cells[1].textContent = objTable.rows[i].cells[1].textContent.substring(0, objTable.rows[i].cells[1].textContent.indexOf(".00"));

}

} else {

if (objTable.rows[i].cells[1].innerText.indexOf(".00") != -1) {

objTable.rows[i].cells[1].innerText = objTable.rows[i].cells[1].innerText.substring(0, objTable.rows[i].cells[1].innerText.indexOf(".00"));

}

}

objTable.rows[i].cells[1].style.textAlign = "right";

}

}

if (document.getElementById(strPCNumber + "_chkAcknowledge")) {

document.getElementById(strPCNumber + "_chkAcknowledge").parentNode.parentNode.style.display = "none";

}

}

JAVASCRIPT FOR NETCOMMUNITY

Page 12: Think Out of the Box: Think No Customization with The Raiser's Edge and Blackbaud NetCommunity

10/7/2013 #bbcon 12

• On event registration classic pages, change text justification in a row

JAVASCRIPT FOR NETCOMMUNITY

Page 13: Think Out of the Box: Think No Customization with The Raiser's Edge and Blackbaud NetCommunity

10/7/2013 #bbcon 13

• On event registration classic pages, change text justification in a row

- Add code below to base code on slide 4, below first line starting with <script…> function fncProcessJavascript() {

var strPCNumber;

strPCNumber = fncGetPCNumber();

if (strPCNumber != "") {

fncEventSectionUnitAlignUnitTableRowsToTop(strPCNumber);

}

}

function fncEventSectionUnitAlignUnitTableRowsToTop(strPCNumber) {

var i, j;

i = 0;

while (document.getElementById(strPCNumber + "_Wizard1_dgEventItems2_dgPriceList_" + i)) {

j = 0;

while (document.getElementById(strPCNumber + "_Wizard1_dgEventItems2_dgPriceList_" + i + "_ddlQuantity_" + j)) {

document.getElementById(strPCNumber + "_Wizard1_dgEventItems2_dgPriceList_" + i + "_ddlQuantity_" + j).parentNode.style.verticalAlign = "top"; // replace with bottom if needed

document.getElementById(strPCNumber + "_Wizard1_dgEventItems2_dgPriceList_" + i + "_lblPrice_" + j).parentNode.style.verticalAlign = "top"; // replace with bottom if needed

j++;

}

i++

}

}

JAVASCRIPT FOR NETCOMMUNITY

Page 14: Think Out of the Box: Think No Customization with The Raiser's Edge and Blackbaud NetCommunity

10/7/2013 #bbcon 14

• On event registration classic pages, hide columns

JAVASCRIPT FOR NETCOMMUNITY

Page 15: Think Out of the Box: Think No Customization with The Raiser's Edge and Blackbaud NetCommunity

10/7/2013 #bbcon 15

• On event registration classic pages, hide columns

- Add code below to base code on slide 4, below first line starting with <script…> function fncProcessJavascript() {

var strPCNumber;

strPCNumber = fncGetPCNumber();

if (strPCNumber != "") {

fncEventSectionUnitHideUnitColumn(strPCNumber);

}

}

function fncEventSectionUnitHideUnitColumn(strPCNumber) {

var i, j;

i = 0;

while (document.getElementById(strPCNumber + "_Wizard1_dgEventItems2_dgPriceList_" + i)) {

j = 0;

while (document.getElementById(strPCNumber + "_Wizard1_dgEventItems2_dgPriceList_" + i + "_lblNumParticipants_" + j)) {

document.getElementById(strPCNumber + "_Wizard1_dgEventItems2_dgPriceList_" + i + "_lblNumParticipants_" + j).innerHTML = "";

j++;

}

i++;

}

}

JAVASCRIPT FOR NETCOMMUNITY

Page 16: Think Out of the Box: Think No Customization with The Raiser's Edge and Blackbaud NetCommunity

10/7/2013 #bbcon 16

• Sort constituent attributes on a registration page

- Add code below to base code on slide 4, below first line starting with <script…> function fncProcessJavascript() {

fncSortConstituentAttributes();

}

function fncSortConstituentAttributes() {

var arrSort = [

"Attribute name 1", // Replace Attribute name 1 with your first attribute you want at the top

"Attribute name 2", // Replace Attribute name 2 with your second attribute you want shown next

"etc"

];

var arrTemp = new Array(); //array to hold the <tr>'s that we'll be sorting

var intAttributeCounter = 0; // counter to count up as we find <tr>'s with attributes

var intAttributeStarting = 0; //we'll set this to the index of the first <tr> that contains an attribute

var objTRCollection = $('table.LoginFormTable > tbody').eq(2).children(); //collection of <tr>'s where the attributes

var intTRCounter = objTRCollection.length - 1; // counter for all of the <tr>'s in our collection

//loop over collection of <tr>'s, looking for those with constituent attributes

for (var i=0; i<intTRCounter; i++) {

var objTRWithAttributeClass = objTRCollection.eq(i).children().eq(1); //get the 2nd child <td>

if ((objTRWithAttributeClass.length > 0)&&(objTRWithAttributeClass.attr('id'))) { //check to see if there are at least 2 children

if (objTRWithAttributeClass.attr('id').indexOf('ParentControl') != -1) { //is the current <td> one with an attribute?

if (intAttributeStarting == 0) {

intAttributeStarting = i;

} //marking where in the collection the attributes start

arrTemp[intAttributeCounter] = new Array(2); //sub-array to hold the <tr>'s and their correct sort position

//find correct sort position for current attribute

var strAttributeName = objTRCollection.eq(i).children().eq(0).children().eq(0).html(); //get the attribute name

strAttributeName = strAttributeName.substring(0, strAttributeName.length-1); //lop off the dangling colon

//loop over sort array to see if we find a match

var intSortBasisCounter = 0;

var intFound = 0; //if match found, will set = 1

while (intSortBasisCounter < arrSort.length) {

if (strAttributeName == arrSort[intSortBasisCounter]) { //if found a match in the sort array...

arrTemp[intAttributeCounter][0] = intSortBasisCounter; //sort position

intFound = 1;

break; //stop checking...we found our match

} //end if (checking for match in sort array)

intSortBasisCounter += 1;

} //end while to loop over the sort array

arrTemp[intAttributeCounter][1] = objTRCollection.eq(i).html(); //HTML inside the <tr>

if (intFound == 0) { //if we have an attribute but didn't find a match in the master sort array...

arrTemp[intAttributeCounter][0] = 99999; //we'll push non-found attributes to the bottom to identify them easily

} //

intAttributeCounter += 1; //increment to keep count of how many <tr>'s with attributes we've found

} // end if (where we check to see if the current <td> contains an attribute

} // end if (where we check to see if the <tr> has at least 2 children

} //end for loop (looping as long as we're still finding <tr>'s with attributes

if (arrTemp.length > 0) { //if not > 0 then no attributes to rearrange

//sort the array on the attribute ID

arrTemp.sort(function(a, b) {

var intX = parseInt(a[0], 10);

var intY = parseInt(b[0], 10);

if (intX > intY)

return(1)

else if (intX < intY)

return(-1);

return(0);

});

intTRCounter = objTRCollection.length - 2; //reset this counter to loop backwards again

//loop again over the same collection to update the attribute order

for (var i = intAttributeStarting; i < intAttributeStarting + intAttributeCounter; i++) {

objTRCollection.eq(i).html(arrTemp[i - intAttributeStarting][1]); //get the 2nd child <td>

} //end while (looping as long as we still have <tr>'s to replace

}

}

JAVASCRIPT FOR NETCOMMUNITY

Page 17: Think Out of the Box: Think No Customization with The Raiser's Edge and Blackbaud NetCommunity

10/7/2013 #bbcon 17

• Once you or your team is comfortable with making the changes shown

earlier, there are more advanced Javascript techniques:

- Dynamically show/hide fields based on other fields (i.e. picklists,

checkboxes, radio buttons, etc), including setting default values for

mandatory fields that remain hidden

- On the guest selection page for an event registration, hide fields to make the

screen less cluttered

• Example: If a table of 10 is purchased and you want all 10 guest names

as placeholders in Raiser’s Edge, but don’t want to ask the purchaser for

all guest names, you can hide the fields and insert default guest names

such as “Guest 1”, “Guest 2”, etc

- On registration forms, change single line input boxes into multi-line text

areas (for comment fields and other “long question” fields), including a

counter to tell the user how many characters they have left until the limit

- On registration forms, show/hide various country specific address fields,

such as hiding province/state fields for those countries that don’t have

provinces/states

- And more!

JAVASCRIPT FOR NETCOMMUNITY

Page 18: Think Out of the Box: Think No Customization with The Raiser's Edge and Blackbaud NetCommunity

10/7/2013 #bbcon 18

CUSTOM TEMPLATES

Page 19: Think Out of the Box: Think No Customization with The Raiser's Edge and Blackbaud NetCommunity

10/7/2013 #bbcon 19

• Create your own templates for a completely different look & feel for

various events

- Click on “New template” under Pages & Templates, then create/use different

parts for images/text/links for your new template to give your users a unique

look & feel for specific events that you want to look different than your

current setup

CUSTOM TEMPLATES

Page 20: Think Out of the Box: Think No Customization with The Raiser's Edge and Blackbaud NetCommunity

10/7/2013 #bbcon 20

• Run daily/weekly/monthly/yearly

queries / plug-ins as appropriate for

your organization

- Check for blank/missing cities,

provinces/states, postal/zip codes,

phones, titles, etc

- Check for improper format of

postal/zip codes (see query to right for

postal code example) and other fields

- Run Plug-Ins such as Apply Phone

Formats and the various

Duplicate/Delete plug-ins

- Run the Duplicate Constituents report

under Admin

- Review the excellent multi-part series

called “Raiser’s Edge Data Cleanup”

which you can search for “cleanup

series” on blackbaudknowhow.com

QUERIES / PLUG-INS

FOR AUDITING &

CLEAN-UP

Page 21: Think Out of the Box: Think No Customization with The Raiser's Edge and Blackbaud NetCommunity

10/7/2013 #bbcon 21

• DO NOT OVERUSE; you can usually find output of what a user

requires via queries, exports, built-in Raiser’s Edge Reports, etc

• Use for complicated totaling/sorting or very specific formatting

• Use parameters to make it easier for users to filter results

CRYSTAL REPORTS

Page 22: Think Out of the Box: Think No Customization with The Raiser's Edge and Blackbaud NetCommunity

10/7/2013 #bbcon 22

• If you host with Blackbaud

- Easy to manage requiring only “one finger to point” if something goes wrong

• Full regular backups

• Full disaster recovery plan

• Automatic upgrades as new versions are released

• Accessible from anywhere

- Limitations

• No integration directly to your user’s email programs

– Users must use Blackbaud’s Outlook 2007 after logging into Raiser’s Edge

to see alerts/actions and synchronize contacts

• No automated / scheduled emailing of Reports via Queues

– Each report must be manually run to be refreshed

• Inability to print to any local printer that requires a billing code for each print

– Example: Shared printer for multiple companies located in one office

which requires each user to enter a code for billing before printing

• Requires a minimum 1Mbps upload connection to the internet

TO HOST OR NOT TO HOST WITH

BLACKBAUD

Page 23: Think Out of the Box: Think No Customization with The Raiser's Edge and Blackbaud NetCommunity

10/7/2013 #bbcon 23

CONTACT INFO:

Maurice Kowanetz - National Director, Information Technology

Email: [email protected]

Phone: 416-622-4602 ext 240

Chris Weber - National Manager, Sponsorships and Fund Development Systems

Email: [email protected]

Phone: 416-622-4602 ext 239

THANK YOU!