SlideShare uma empresa Scribd logo
1 de 23
Baixar para ler offline
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!
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?
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
10/7/2013 #bbcon 4
SOCIAL MEDIA LOGIN
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
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
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
10/7/2013 #bbcon 8
• On any Page, limit Title picklist (if found) to only show top “x” items
JAVASCRIPT FOR 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
10/7/2013 #bbcon 10
• On donation pages, reformat and align text (change “$1,000.00” to “$1,000”)
JAVASCRIPT FOR 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
10/7/2013 #bbcon 12
• On event registration classic pages, change text justification in a row
JAVASCRIPT FOR 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
10/7/2013 #bbcon 14
• On event registration classic pages, hide columns
JAVASCRIPT FOR 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
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
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
10/7/2013 #bbcon 18
CUSTOM TEMPLATES
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
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
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
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
10/7/2013 #bbcon 23
CONTACT INFO:
Maurice Kowanetz - National Director, Information Technology
Email: mkowanetz@jacan.org
Phone: 416-622-4602 ext 240
Chris Weber - National Manager, Sponsorships and Fund Development Systems
Email: cweber@jacan.org
Phone: 416-622-4602 ext 239
THANK YOU!

Mais conteúdo relacionado

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

Ebooktiketkapal
EbooktiketkapalEbooktiketkapal
Ebooktiketkapal
dhi her
 
Taking Web Apps Offline
Taking Web Apps OfflineTaking Web Apps Offline
Taking Web Apps Offline
Pedro Morais
 

Semelhante a Think Out of the Box: Think No Customization with The Raiser's Edge and Blackbaud NetCommunity (20)

Java script
Java scriptJava script
Java script
 
Ebooktiketkapal
EbooktiketkapalEbooktiketkapal
Ebooktiketkapal
 
A miało być tak... bez wycieków
A miało być tak... bez wyciekówA miało być tak... bez wycieków
A miało być tak... bez wycieków
 
Taking Web Apps Offline
Taking Web Apps OfflineTaking Web Apps Offline
Taking Web Apps Offline
 
Micro services from scratch - Part 1
Micro services from scratch - Part 1Micro services from scratch - Part 1
Micro services from scratch - Part 1
 
Building a Single Page Application using Ember.js ... for fun and profit
Building a Single Page Application using Ember.js ... for fun and profitBuilding a Single Page Application using Ember.js ... for fun and profit
Building a Single Page Application using Ember.js ... for fun and profit
 
Emerging threats jonkman_sans_cti_summit_2015
Emerging threats jonkman_sans_cti_summit_2015Emerging threats jonkman_sans_cti_summit_2015
Emerging threats jonkman_sans_cti_summit_2015
 
ASP DOT NET
ASP DOT NETASP DOT NET
ASP DOT NET
 
AI: Mobile Apps That Understands Your Intention When You Typed
AI: Mobile Apps That Understands Your Intention When You TypedAI: Mobile Apps That Understands Your Intention When You Typed
AI: Mobile Apps That Understands Your Intention When You Typed
 
What Web Developers Need to Know to Develop Windows 8 Apps
What Web Developers Need to Know to Develop Windows 8 AppsWhat Web Developers Need to Know to Develop Windows 8 Apps
What Web Developers Need to Know to Develop Windows 8 Apps
 
Back to Basics, webinar 2: La tua prima applicazione MongoDB
Back to Basics, webinar 2: La tua prima applicazione MongoDBBack to Basics, webinar 2: La tua prima applicazione MongoDB
Back to Basics, webinar 2: La tua prima applicazione MongoDB
 
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
 
Desenvolvendo uma aplicação híbrida para Android e IOs utilizando Ionic, aces...
Desenvolvendo uma aplicação híbrida para Android e IOs utilizando Ionic, aces...Desenvolvendo uma aplicação híbrida para Android e IOs utilizando Ionic, aces...
Desenvolvendo uma aplicação híbrida para Android e IOs utilizando Ionic, aces...
 
DEVICE CHANNELS
DEVICE CHANNELSDEVICE CHANNELS
DEVICE CHANNELS
 
Necto 16 training 20 component mode &amp; java script
Necto 16 training 20   component mode &amp; java scriptNecto 16 training 20   component mode &amp; java script
Necto 16 training 20 component mode &amp; java script
 
Ddpz2613 topic9 java
Ddpz2613 topic9 javaDdpz2613 topic9 java
Ddpz2613 topic9 java
 
The Ring programming language version 1.7 book - Part 47 of 196
The Ring programming language version 1.7 book - Part 47 of 196The Ring programming language version 1.7 book - Part 47 of 196
The Ring programming language version 1.7 book - Part 47 of 196
 
Leture5 exercise onactivities
Leture5 exercise onactivitiesLeture5 exercise onactivities
Leture5 exercise onactivities
 
Lecture exercise on activities
Lecture exercise on activitiesLecture exercise on activities
Lecture exercise on activities
 
Final report mobile shop
Final report   mobile shopFinal report   mobile shop
Final report mobile shop
 

Mais de Blackbaud

Using Hacks to Create Consistent and Awesome Video Content for Your Admission...
Using Hacks to Create Consistent and Awesome Video Content for Your Admission...Using Hacks to Create Consistent and Awesome Video Content for Your Admission...
Using Hacks to Create Consistent and Awesome Video Content for Your Admission...
Blackbaud
 
Turning your newly enrolled families into annual fund donors
Turning your newly enrolled families into annual fund donors   Turning your newly enrolled families into annual fund donors
Turning your newly enrolled families into annual fund donors
Blackbaud
 
The school’s guide to modern design trends corwin bermudez
The school’s guide to modern design trends   corwin bermudezThe school’s guide to modern design trends   corwin bermudez
The school’s guide to modern design trends corwin bermudez
Blackbaud
 

Mais de Blackbaud (20)

50 Fascinating Nonprofit Stats
50 Fascinating Nonprofit Stats50 Fascinating Nonprofit Stats
50 Fascinating Nonprofit Stats
 
Philanthropy by the Numbers: The story behind the stats
Philanthropy by the Numbers: The story behind the statsPhilanthropy by the Numbers: The story behind the stats
Philanthropy by the Numbers: The story behind the stats
 
npEXPERTS 2016: Philanthropy by the Numbers
npEXPERTS 2016: Philanthropy by the NumbersnpEXPERTS 2016: Philanthropy by the Numbers
npEXPERTS 2016: Philanthropy by the Numbers
 
5 Tips for Fundraising in an Election Year
5 Tips for Fundraising in an Election Year5 Tips for Fundraising in an Election Year
5 Tips for Fundraising in an Election Year
 
Anatomy of the Perfect Private School Landing Page
Anatomy of the Perfect Private School Landing PageAnatomy of the Perfect Private School Landing Page
Anatomy of the Perfect Private School Landing Page
 
New York NXT Roadshow
New York NXT Roadshow New York NXT Roadshow
New York NXT Roadshow
 
New York NXT Roadshow
New York NXT Roadshow New York NXT Roadshow
New York NXT Roadshow
 
The Cold Never Bothered You Anyway
The Cold Never Bothered You Anyway   The Cold Never Bothered You Anyway
The Cold Never Bothered You Anyway
 
What You Should be Doing with Master Schedule but May Not Know
What You Should be Doing with Master Schedule but May Not Know What You Should be Doing with Master Schedule but May Not Know
What You Should be Doing with Master Schedule but May Not Know
 
Trends in Affordability and Demand
Trends in Affordability and Demand   Trends in Affordability and Demand
Trends in Affordability and Demand
 
The Ripple Effect of Successful Implementation
The Ripple Effect of Successful ImplementationThe Ripple Effect of Successful Implementation
The Ripple Effect of Successful Implementation
 
Using Hacks to Create Consistent and Awesome Video Content for Your Admission...
Using Hacks to Create Consistent and Awesome Video Content for Your Admission...Using Hacks to Create Consistent and Awesome Video Content for Your Admission...
Using Hacks to Create Consistent and Awesome Video Content for Your Admission...
 
The New Financial Aid Family
The New Financial Aid FamilyThe New Financial Aid Family
The New Financial Aid Family
 
The entrepreneurs a true babson story
The entrepreneurs a true babson story   The entrepreneurs a true babson story
The entrepreneurs a true babson story
 
Introduction to Inbound Marketing for Independent Schools
Introduction to Inbound Marketing for Independent SchoolsIntroduction to Inbound Marketing for Independent Schools
Introduction to Inbound Marketing for Independent Schools
 
Turning your newly enrolled families into annual fund donors
Turning your newly enrolled families into annual fund donors   Turning your newly enrolled families into annual fund donors
Turning your newly enrolled families into annual fund donors
 
The school’s guide to modern design trends corwin bermudez
The school’s guide to modern design trends   corwin bermudezThe school’s guide to modern design trends   corwin bermudez
The school’s guide to modern design trends corwin bermudez
 
Raiser's Edge Database Cleanup Tips
Raiser's Edge Database Cleanup TipsRaiser's Edge Database Cleanup Tips
Raiser's Edge Database Cleanup Tips
 
Maintaining a Healthy Database in The Education Edge
Maintaining a Healthy Database in The Education EdgeMaintaining a Healthy Database in The Education Edge
Maintaining a Healthy Database in The Education Edge
 
Building Report Cards and Transcripts in The Education Edge
Building Report Cards and Transcripts in The Education EdgeBuilding Report Cards and Transcripts in The Education Edge
Building Report Cards and Transcripts in The Education Edge
 

Último

Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 

Último (20)

CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 

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

  • 1. 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!
  • 2. 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?
  • 3. 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
  • 5. 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
  • 6. 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
  • 7. 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
  • 8. 10/7/2013 #bbcon 8 • On any Page, limit Title picklist (if found) to only show top “x” items JAVASCRIPT FOR NETCOMMUNITY
  • 9. 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
  • 10. 10/7/2013 #bbcon 10 • On donation pages, reformat and align text (change “$1,000.00” to “$1,000”) JAVASCRIPT FOR NETCOMMUNITY
  • 11. 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
  • 12. 10/7/2013 #bbcon 12 • On event registration classic pages, change text justification in a row JAVASCRIPT FOR NETCOMMUNITY
  • 13. 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
  • 14. 10/7/2013 #bbcon 14 • On event registration classic pages, hide columns JAVASCRIPT FOR NETCOMMUNITY
  • 15. 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
  • 16. 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
  • 17. 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
  • 19. 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
  • 20. 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
  • 21. 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
  • 22. 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
  • 23. 10/7/2013 #bbcon 23 CONTACT INFO: Maurice Kowanetz - National Director, Information Technology Email: mkowanetz@jacan.org Phone: 416-622-4602 ext 240 Chris Weber - National Manager, Sponsorships and Fund Development Systems Email: cweber@jacan.org Phone: 416-622-4602 ext 239 THANK YOU!