<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Perspectives on Salesforce.com</title>
	<atom:link href="http://sfdc.arrowpointe.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://sfdc.arrowpointe.com</link>
	<description>Authored by Scott Hemmeter of Arrowpointe Corp, this blog is written from the perspective of a Salesforce.com solution provider and contains information on Arrowpointe&#039;s AppExchange products as well as tips, findings, sample code, functionality wishes, etc.</description>
	<lastBuildDate>Tue, 06 Nov 2012 17:39:48 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.5.18</generator>
	<item>
		<title>Link Chatter Files to Related Objects</title>
		<link>http://sfdc.arrowpointe.com/2012/11/06/link-chatter-files-to-related-objects/</link>
					<comments>http://sfdc.arrowpointe.com/2012/11/06/link-chatter-files-to-related-objects/#comments</comments>
		
		<dc:creator><![CDATA[Scott Hemmeter]]></dc:creator>
		<pubDate>Tue, 06 Nov 2012 17:39:48 +0000</pubDate>
				<category><![CDATA[APEX Code]]></category>
		<category><![CDATA[Tips]]></category>
		<guid isPermaLink="false">http://sfdc.arrowpointe.com/?p=963</guid>

					<description><![CDATA[<p>I prefer to upload &#8220;attachments&#8221; to records using Chatter Files vs. the old skool Attachments because&#8230; Chatter Files are searchable They still get listed under the Notes &#38; Attachments list for a record I get the nice file previewer (most of my files are PDFs) I can store them once and link them to anything [&#8230;]</p>
<p>The post <a href="http://sfdc.arrowpointe.com/2012/11/06/link-chatter-files-to-related-objects/" target="_blank">Link Chatter Files to Related Objects</a> first appeared on <a href="http://sfdc.arrowpointe.com/" target="_blank">Perspectives on Salesforce.com</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>I prefer to upload &#8220;attachments&#8221; to records using Chatter Files vs. the old skool Attachments because&#8230;</p>
<ul>
<li>Chatter Files are searchable</li>
<li>They still get listed under the Notes &amp; Attachments list for a record</li>
<li>I get the nice file previewer (most of my files are PDFs)</li>
<li>I can store them once and link them to anything else</li>
</ul>
<p>It&#8217;s that last point that is especially cool and cannot be done with regular Attachments. &#8220;<strong>Store Once, Link Anywhere</strong>&#8221;</p>
<p>One major difference, though, between old skool Attachments and Chatter Files is that Attachments would get linked up to the Parent Records too, at least for Standard Objects. This was nice. I could add an Attachment to an Opportunity and see it listed under the Account without needing to do anything special. Chatter Files do not do this. You can manually make it do this, but it&#8217;s not automated.</p>
<p>Let&#8217;s automate this missing feature!</p>
<p><strong>Trigger</strong><br />
Simple little trigger to gather IDs and call an @future event in a class. Note that the call is wrapped in the IF statment checking to see if we are already in an @future or batch context. <strong>For any trigger that calls an @future event, please always wrap the call like this.</strong></p>
<pre class="brush: java; title: ; notranslate">
trigger FeedItems on FeedItem (after insert) {

	// AFTER INSERT
	if(Trigger.isAfter &amp;&amp; Trigger.isInsert){
		
		List&lt;ID&gt; IDs = new List&lt;ID&gt;();
		for (FeedItem fi : trigger.new){
			IDs.add(fi.id);
		}
		
		if(!system.isFuture() &amp;&amp; !system.isBatch()){
			FeedItems.linkChatterFiles(IDs);
		}
		
    }
	
}
</pre>
<p><strong>Apex Class</strong><br />
I have the method written to only process a single ContentPost (assuming the UI is being used), but if you want to bulkify, be my guest.</p>
<p>What we are doing in the class is gathering the IDs of records we also want to link the file to. For me, I want to link files I post to Opportunities to the parent Account and files I post to Cases to the related Contact and Account. It&#8217;s up to you what to link.</p>
<p>One important step in there is to gather a list of records the file is already linked to. Towards the end of the code, we remove those IDs from the master list so we do not link them all over again with a new Chatter Post.</p>
<p>Take note of the InProcess boolean. This is a technique to prevent recursion. Since our trigger is on FeedItem and our method creates more FeedItems, we don&#8217;t want the trigger to keep firing. </p>
<pre class="brush: java; title: ; notranslate">
public class FeedItems {

    public static Boolean inProcess = false;
	
    // Links Chatter Files on certain objects to related objects
    @future 
    public static void linkChatterFiles(List&lt;Id&gt; IDs) {
    	
    	// Only run for individual posts of files
    	if(IDs.size() == 1 &amp;&amp; inProcess == false){
    		
    		inProcess = true; // turn on so we don't do recursive loops
    		List&lt;FeedItem&gt; FIsToInsert = new List&lt;FeedItem&gt;(); // list we will be inserting
    		
	    	for (FeedItem f: [select id, type, RelatedRecordId, parentId, title, body from FeedItem where id in:IDs and type = 'ContentPost']){
				
				// Verify fields that we cannot use to filter SOQL
				if (f.RelatedRecordId == null) { continue; }
				
				// Get ContentVerion record
				ContentVersion cv = [select id, ContentDocumentId from ContentVersion where id = :f.RelatedRecordId][0];
				
				// Get list of IDs this Content is already linked to so we don't do duplicate posts
				Set&lt;Id&gt; IDsAlreadyLinked = new Set&lt;Id&gt;();
				for (ContentDocumentLink cdl : [SELECT ContentDocumentId, LinkedEntityId FROM ContentDocumentLink where ContentDocumentId = :cv.ContentDocumentId]){
					
					IDsAlreadyLinked.add(cdl.LinkedEntityId);
					
				}
				
				// Depending on the object, link the content to different other objects
				Set&lt;Id&gt; IDsToLink = new Set&lt;Id&gt;();
				if (String.valueOf(f.parentId).startsWith( Opportunity.sObjectType.getDescribe().getKeyPrefix() )){
					
					Opportunity o = [select id, accountId from Opportunity where id = :f.ParentId limit 1][0];
					if(o.AccountId != null){ 
						IDsToLink.add(o.AccountId);
					}
					
					
				} else if (String.valueOf(f.parentId).startsWith( Case.sObjectType.getDescribe().getKeyPrefix() )){
					
					Case c = [select id, accountId, contactId from Case where id = :f.ParentId limit 1][0];
					if(c.AccountId != null){ 
						IDsToLink.add(c.AccountId);
					}
					if(c.contactId != null){ 
						IDsToLink.add(c.contactId);
					}
					
				}
				
				// Remove the IDs that are already linked so we don't create duplicate posts 
				IDsToLink.removeAll(IDsAlreadyLinked);
				
				// Create a new FeedItem for each of the records we want to link to
				for (ID theId : IDsToLink){
					FeedItem newFI = new FeedItem();
						newFI.Type = 'ContentPost';
						newFI.RelatedRecordId = f.RelatedRecordId;
						newFI.ParentId = theId;
						newFI.title = f.title;
						newFI.Body = f.body;
					FIsToInsert.add(newFI);
					
				}
				
			} // end main loop
		
			// INSERT
			if (!FIsToInsert.isEmpty()){ database.insert(FIsToInsert, false); }
				
    	} // end check for 1 record in trigger
    	
    } // end of linkChatterFiles method
    
}
</pre>
<p><strong>Test</strong><br />
And the Test code. We have a separate method for each object we want to test posting a file to. I should have some asserts in there to test it actually works, but I don&#8217;t have those yet. That&#8217;s your homework. </p>
<pre class="brush: java; title: ; notranslate">
@isTest 
private class FeedItems_Test {

    static testMethod void linkChatterFiles_Oppty() {
    	
    	Account a = new Account(name='test');
    	insert a;
    	
    	Contact c = new Contact (FirstName = 'Joe', LastName = 'Shmo', AccountId = a.id);
    	insert c;
    	
    	OpportunityStage stage = [select MasterLabel from OpportunityStage where IsClosed = false limit 1];
    	
    	Opportunity o  = new Opportunity();
        o.Name         = 'TEST'; 
        o.AccountId    = a.id;
        o.CloseDate    = Date.today(); 
        o.StageName    = stage.masterlabel;
        insert o;
        
        ContentVersion cv = new ContentVersion(); 
		cv.Origin = 'H';
		cv.PathOnClient='myFile.txt';
		cv.Title ='myFile'; 
		cv.VersionData = Blob.valueOf('I am a file posting to Chatter');
		insert cv;
		
		FeedItem contentFI = new FeedItem();
		contentFI.Type = 'ContentPost';
		contentFI.ParentId = o.id; // Opportunity
		contentFI.RelatedRecordId = cv.id;
		contentFI.title = 'Content Post';
		contentFI.Body = 'Body of content post';
		insert contentFI;
		
    }
    
    static testMethod void linkChatterFiles_Case() {
    	
    	Account a = new Account(name='test');
    	insert a;
    	
    	Contact c = new Contact (FirstName = 'Joe', LastName = 'Shmo', AccountId = a.id);
    	insert c;
    	
    	Case cs = new Case();
        cs.subject = 'Test';
        cs.ContactId = c.id;
        cs.AccountId = a.id;
        insert cs;
        
        ContentVersion cv = new ContentVersion(); 
		cv.Origin = 'H';
		cv.PathOnClient='myFile.txt';
		cv.Title ='myFile'; 
		cv.VersionData = Blob.valueOf('I am a file posting to Chatter');
		insert cv;
		
		FeedItem contentFI = new FeedItem();
		contentFI.Type = 'ContentPost';
		contentFI.ParentId = cs.id; // Case
		contentFI.RelatedRecordId = cv.id;
		contentFI.title = 'Content Post';
		contentFI.Body = 'Body of content post';
		insert contentFI;
		
    }
        
}
</pre>
<p>Enjoy!</p><p>The post <a href="http://sfdc.arrowpointe.com/2012/11/06/link-chatter-files-to-related-objects/" target="_blank">Link Chatter Files to Related Objects</a> first appeared on <a href="http://sfdc.arrowpointe.com/" target="_blank">Perspectives on Salesforce.com</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>http://sfdc.arrowpointe.com/2012/11/06/link-chatter-files-to-related-objects/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>UPDATE: Set Defaults for Opportunity Contact Roles (when converting)</title>
		<link>http://sfdc.arrowpointe.com/2012/06/04/update-set-defaults-for-opportunity-contact-roles-when-converting/</link>
					<comments>http://sfdc.arrowpointe.com/2012/06/04/update-set-defaults-for-opportunity-contact-roles-when-converting/#comments</comments>
		
		<dc:creator><![CDATA[Scott Hemmeter]]></dc:creator>
		<pubDate>Mon, 04 Jun 2012 16:34:13 +0000</pubDate>
				<category><![CDATA[APEX Code]]></category>
		<category><![CDATA[Tips]]></category>
		<guid isPermaLink="false">http://sfdc.arrowpointe.com/?p=954</guid>

					<description><![CDATA[<p>I&#8217;ve had a few people reach out regarding an old post about defaulting Opportunity Contact Roles on a Lead convert. Turns out the trigger on Opportunities is not the best option. This was resolved in the comments by having a trigger on Leads instead, but wanted to give the full update in it&#8217;s own blog [&#8230;]</p>
<p>The post <a href="http://sfdc.arrowpointe.com/2012/06/04/update-set-defaults-for-opportunity-contact-roles-when-converting/" target="_blank">UPDATE: Set Defaults for Opportunity Contact Roles (when converting)</a> first appeared on <a href="http://sfdc.arrowpointe.com/" target="_blank">Perspectives on Salesforce.com</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>I&#8217;ve had a few people reach out regarding an old post about <a href="http://sfdc.arrowpointe.com/2009/02/06/set-defaults-for-opportunity-contact-roles-when-converting/">defaulting Opportunity Contact Roles</a> on a Lead convert. Turns out the trigger on Opportunities is not the best option. This was resolved in the comments by having a trigger on Leads instead, but wanted to give the full update in it&#8217;s own blog post with updated code. The code below should work and now includes a Test Class too.</p>
<p>Having an AFTER UPDATE trigger on Leads like this is a good way to handle many post-convert needs.</p>
<p><strong>Trigger</strong></p>
<pre class="brush: java; title: ; notranslate">
trigger Leads on Lead (after update) {
	
    if(Trigger.isAfter &amp;&amp; Trigger.isUpdate){
        Leads l = new Leads();
        l.SetContactRoleDefaults(Trigger.new, Trigger.oldMap);
    }

}
</pre>
<p><strong>Class</strong></p>
<pre class="brush: java; title: ; notranslate">
public class Leads {
    
// Sets default values on the Opportunity and Opportunity Contact Role record created during Conversion. Called on AFTER UPDATE
public void SetContactRoleDefaults(Lead[] leads, map&lt;ID,Lead&gt; old_leads) 
{
	
	set&lt;ID&gt; set_opptyIDs = new set&lt;ID&gt;();
	    		
	// Get Opportunity IDs into a Set if the lead was just converted and an Opportunity was created
	for (Lead l:leads){
		if (l.IsConverted &amp;&amp; !old_leads.get(l.id).IsConverted){
			if (l.ConvertedOpportunityId != null){
				set_opptyIDs.add(l.ConvertedOpportunityId);
			}
		}
	}
	
	// Update Opportunity Contact Roles
	list&lt;OpportunityContactRole&gt; list_opptyContactRolesToUpdate = new list&lt;OpportunityContactRole&gt;();
	for(OpportunityContactRole ocr:[select Id,IsPrimary,Role from OpportunityContactRole where OpportunityId in :set_opptyIDs]) { 
		ocr.IsPrimary = true;
		ocr.Role = 'Decision Maker'; // set to what you want defaulted
		list_opptyContactRolesToUpdate.add(ocr);
	}
	
	if (list_opptyContactRolesToUpdate.size() &gt; 0) {
		update list_opptyContactRolesToUpdate;
	}
	
}

}
</pre>
<p><strong>Test Class</strong></p>
<pre class="brush: java; title: ; notranslate">
@IsTest 
private class Leads_Test {

static testMethod void SetContactRoleDefaults_Test() {
    
    // Create a Lead
    Lead l = new Lead();
    l.lastname = 'Lastname';
    l.firstname = 'FirstName';
    l.company = 'Company';
    insert l;
    
    // Convert the Lead
    Database.LeadConvert lc = new database.LeadConvert();
    lc.setLeadId(l.id);
	
    LeadStatus convertStatus = [Select Id, MasterLabel from LeadStatus where IsConverted=true limit 1];
    lc.setConvertedStatus(convertStatus.MasterLabel);
	
    Database.LeadConvertResult lcr = Database.convertLead(lc);
    System.assert(lcr.isSuccess());
	
    // Query Contact Role Records and Asserts all was set correctly.
    for (OpportunityContactRole ocr:[select Id,IsPrimary,Role from OpportunityContactRole where OpportunityId = :lcr.getOpportunityId()]){
        system.AssertEquals('Decision Maker', ocr.Role);
        system.AssertEquals(true, ocr.IsPrimary);
    }
    
}

}
</pre><p>The post <a href="http://sfdc.arrowpointe.com/2012/06/04/update-set-defaults-for-opportunity-contact-roles-when-converting/" target="_blank">UPDATE: Set Defaults for Opportunity Contact Roles (when converting)</a> first appeared on <a href="http://sfdc.arrowpointe.com/" target="_blank">Perspectives on Salesforce.com</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>http://sfdc.arrowpointe.com/2012/06/04/update-set-defaults-for-opportunity-contact-roles-when-converting/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title>Email AutoComplete (using jQuery)</title>
		<link>http://sfdc.arrowpointe.com/2011/11/18/email-autocomplete-using-jquery/</link>
					<comments>http://sfdc.arrowpointe.com/2011/11/18/email-autocomplete-using-jquery/#comments</comments>
		
		<dc:creator><![CDATA[Scott Hemmeter]]></dc:creator>
		<pubDate>Fri, 18 Nov 2011 18:17:49 +0000</pubDate>
				<category><![CDATA[APEX Code]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Tips]]></category>
		<guid isPermaLink="false">http://sfdc.arrowpointe.com/?p=930</guid>

					<description><![CDATA[<p>For several years, I&#8217;ve been using an app called Email AutoComplete (it&#8217;s now a private listing) to add auto complete capabilities onto my email address text boxes in the Salesforce email editor.  It&#8217;s a nice little app.  However, Arrowpointe started using Email to Case Premium (an app I highly recommend) and I wanted to have [&#8230;]</p>
<p>The post <a href="http://sfdc.arrowpointe.com/2011/11/18/email-autocomplete-using-jquery/" target="_blank">Email AutoComplete (using jQuery)</a> first appeared on <a href="http://sfdc.arrowpointe.com/" target="_blank">Perspectives on Salesforce.com</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>For several years, I&#8217;ve been using an app called <a title="Email AutoComplete" href="http://appexchange.salesforce.com/listingDetail?listingId=a0N300000016cP9EAI" target="_blank">Email AutoComplete</a> (it&#8217;s now a private listing) to add auto complete capabilities onto my email address text boxes in the Salesforce email editor.  It&#8217;s a nice little app.  However, Arrowpointe started using <a title="Email to Case Premium" href="http://appexchange.salesforce.com/listingDetail?listingId=a0N30000001R5cyEAC" target="_blank">Email to Case Premium</a> (an app I highly recommend) and I wanted to have similar capabilities on their forms.</p>
<p>The Email AutoComplete app works well, but it written using s-Controls and Yahoo User Interface Library v2, which adds a lot of confusing code into it. It was too hard for me to change and apply to the Email to Case Premium pages.  I looked for a jQuery approach and leveraged ideas from a <a href="http://verticalcode.wordpress.com/2011/02/19/salesforce-javascript-remoting-jquery-and-autocomplete/" target="_blank">great blog post</a> on the <a title="Vertical Code Blog" href="http://verticalcode.wordpress.com/" target="_blank">Vertical Code blog</a>. In my case, however, I was trying to add this capability onto an AppExchange &#8220;managed&#8221; (i.e. locked down) page and onto the standard email forms from Salesforce. I didn&#8217;t have the luxury of an Apex Controller and Visualforce.</p>
<p>Enter the AJAX API and jQuery!</p>
<p><img loading="lazy" src="http://sfdc.arrowpointe.com/wp-content/images/autoComplete_newComment.png" alt="" title="autoComplete_newComment" width="800" height="201" class="alignnone size-full wp-image-940" srcset="http://sfdc.arrowpointe.com/wp-content/images/autoComplete_newComment.png 800w, http://sfdc.arrowpointe.com/wp-content/images/autoComplete_newComment-500x125.png 500w" sizes="(max-width: 800px) 100vw, 800px" /></p>
<p><strong>Question</strong>: How do I obtain the Session Id?</p>
<p><strong>Answer</strong>: Create a Visualforce page to act as a JavaScript file. In this case, I am creating a global JavaScript variable called <strong>_my_sfdcSession</strong>.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;apex:page sidebar=&quot;false&quot; showHeader=&quot;false&quot; contentType=&quot;application/javascript&quot; cache=&quot;false&quot;&gt;
  var _my_sfdcSession = &quot;{!$Api.Session_Id}&quot;;
&lt;/apex:page&gt;
</pre>
<hr/>
<p><strong>Question</strong>: How do I enable API access in Salesforce and turn on jQuery so its usable whereever I am (almost) in Salesforce?</p>
<p><strong>Answer</strong>: Use the sidebar to inject the code. I use the Messages &amp; Alerts sidebar item, but the same could also be done using a custom sidebar component. The key is that the component always be in the sidebar.</p>
<p>The code below loads the Visualforce page above to get the Session Id. Then it loads the AJAX toolkit (from Salesforce), jQuery (from Google CDN) and jQueryUI (from Google CSN).  Note that the jQuery instance is put into a new variable called $_org using the jQuery.noConflict() method. I chose that variable name because I am assuming it won&#8217;t conflict with other solutions that rename jQuery.</p>
<pre class="brush: jscript; title: ; notranslate">
&lt;!-- Load Session Id --&gt;
&lt;script src=&quot;https://na1.salesforce.com/apex/loadSessionId?core.apexpages.devmode.url=1&quot;&gt;&lt;/script&gt;
&lt;!-- Load AJAX Toolkit --&gt;
&lt;script src=&quot;https://na1.salesforce.com/soap/ajax/23.0/connection.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;!-- Load jQuery --&gt;
&lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
var $_org = jQuery.noConflict();
&lt;/script&gt;
&lt;!-- Load jQuery UI --&gt;
&lt;link rel=&quot;stylesheet&quot; href=&quot;https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/themes/base/jquery-ui.css&quot; id=&quot;theme&quot; /&gt;
&lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js&quot;&gt;&lt;/script&gt;
</pre>
<p><strong>NOTES</strong>:</p>
<ul>
<li>If you use the Messages and Alerts sidebar component, do not put empty lines in your code because the system will add a p html tag in it</li>
<li>Use absolute references to your Salesforce pages because managed packages have a different url structure</li>
</ul>
<hr/>
<p><strong>Question</strong>: How do I implement the AutoComplete part?</p>
<p><strong>Answer</strong>: Now that jQuery is loaded and we have access to the Salesforce API, we can get down to actual business. The code I am personally using is below.  Not being super confident with jQuery selectors, I am hardcoding the element names to add auto complete to into my code. The downside of this is if those element names change, it will stop working, but it&#8217;s an easy fix.</p>
<p>This code gets a list of element Ids and then loops through them, adding autoComplete (from jQuery UI) to each one. The &#8220;source&#8221; property of autoComplete uses the Salesforce API to look for Contacts with a name or email address LIKE what is being typed in.  In this case, it is handling the situation where you already have multiple names separated by ; in the email field.  You will also notice the line saying <code>sforce.connection.sessionId = _my_sfdcSession;</code>. This line associates the Session Id from that initial page we created to the AJAX API.</p>
<p>I have this code stored as a Static Resource called &#8220;AutoComplete_Email&#8221;.</p>
<pre class="brush: jscript; title: ; notranslate">
$_org(document).ready(function() {
	
	// The elements to bind email autocomplete to
	var elems = [];
	
	// Add Email to Case Premium elements
	elems.push('pg:addCommentF:addCommentPB:emailCustomerPBS:additionalEmailsPBSI:additionalEmails_TextBox');
	elems.push('pg:addCommentF:addCommentPB:emailCustomerPBS:additionalCCsPBSI:additionalCCs_TextBox');
	elems.push('pg:addCommentF:addCommentPB:emailCustomerPBS:additionalBCCsPBSI:additionalBCCs_TextBox');
	
	// Add default Salesforce email fields
	elems.push('p24'); // Additional To
	elems.push('p4'); // CC
	elems.push('p5'); // Bcc
	
	$_org(elems).each(function(index) {
		var thisElem = document.getElementById(elems[index]);
		$_org(thisElem).autocomplete({
			minLength: 1,
			delay: 250,
			
			source: function(request, response) {
						
						var retVal = []; // array to return
						
						var queryTerm = $_org.trim(request.term); // term to search for
						if (queryTerm.lastIndexOf(';') != -1){
							queryTerm = queryTerm.substring(queryTerm.lastIndexOf(';') + 1);
							queryTerm = $_org.trim(queryTerm);
						}
						
						if (queryTerm.length &lt;= 1){ 
							$_org(thisElem).autocomplete(&quot;close&quot;);
						} else {
							sforce.connection.sessionId = _my_sfdcSession;
							var result = sforce.connection.query(&quot;SELECT Id, Name, Email FROM Contact WHERE (Name LIKE '%&quot; + queryTerm + &quot;%' OR Email LIKE '%&quot; + queryTerm + &quot;%') AND Email != NULL ORDER BY Name LIMIT 20&quot;);
							it = new sforce.QueryResultIterator(result);
							while (it.hasNext()) {
								var rec = it.next();
								var retValItem = new Object();
								retValItem.label = rec.Name + ' (' + rec.Email + ')';
								retValItem.value = rec.Email;
								retVal.push(retValItem);
							}
						}
						response(retVal);
					},
				   
			select: function( event, ui ) {
						var tmp = $_org(thisElem).val();
						if (tmp.lastIndexOf(';') == -1){
							$_org(thisElem).val( ui.item.value + '; ' );
						} else {
							$_org(thisElem).val( tmp.substring(0, tmp.lastIndexOf(';') + 1) + ' ' + ui.item.value + '; ');
						}
						$_org(thisElem).autocomplete(&quot;close&quot;);
						return false;
					},
					
			focus: function(event, ui) {
				return false; // added so keyboard navigation does not overwrite the value
			}

		 });
		 
	 });
	 
}); // end of $_org(document).ready()
</pre>
<hr/>
<p><strong>Question</strong>: Now how do I get this autoComplete code injected into the page?</p>
<p><strong>Answer</strong>: Add some more code to the sidebar. The key parts are lines 6-9 below. This injects the script into the page. I personally make sure its only injected into the pages I want it to, which are the standard email pages in Salesforce and the Email to Case Premium &#8220;New Comment&#8221; page. </p>
<pre class="brush: jscript; title: ; notranslate">
&lt;script type=&quot;text/javascript&quot;&gt;
if (
document.URL.toLowerCase().indexOf(&quot;emailauthor&quot;)!=-1 || 
document.URL.toLowerCase().indexOf(&quot;/apex/new_comment&quot;)!=-1
){
	var elem = document.createElement('script');
	elem.type='text/javascript';
	elem.src="http://sfdc.arrowpointe.com/resource/AutoComplete_Email";
	document.body.appendChild(elem);
}
&lt;/script&gt;
</pre>
<hr/>
<p><strong>Question</strong>: What does this look like in the end?</p>
<p><strong>Answer</strong>: Below are 2 examples.  There&#8217;s obviously more you can do with CSS. These are using the basic CSS from jQuery UI.</p>
<p><u>Salesforce Email Page</u><br />
<img loading="lazy" src="http://sfdc.arrowpointe.com/wp-content/images/autoComplete_email.png" alt="" title="autoComplete_email" width="579" height="210" class="alignnone size-full wp-image-939" srcset="http://sfdc.arrowpointe.com/wp-content/images/autoComplete_email.png 579w, http://sfdc.arrowpointe.com/wp-content/images/autoComplete_email-500x181.png 500w" sizes="(max-width: 579px) 100vw, 579px" /></p>
<p><u>Email to Case Premium&#8217;s New Comment</u><br />
<img loading="lazy" src="http://sfdc.arrowpointe.com/wp-content/images/autoComplete_newComment.png" alt="" title="autoComplete_newComment" width="800" height="201" class="alignnone size-full wp-image-940" srcset="http://sfdc.arrowpointe.com/wp-content/images/autoComplete_newComment.png 800w, http://sfdc.arrowpointe.com/wp-content/images/autoComplete_newComment-500x125.png 500w" sizes="(max-width: 800px) 100vw, 800px" /></p><p>The post <a href="http://sfdc.arrowpointe.com/2011/11/18/email-autocomplete-using-jquery/" target="_blank">Email AutoComplete (using jQuery)</a> first appeared on <a href="http://sfdc.arrowpointe.com/" target="_blank">Perspectives on Salesforce.com</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>http://sfdc.arrowpointe.com/2011/11/18/email-autocomplete-using-jquery/feed/</wfw:commentRss>
			<slash:comments>21</slash:comments>
		
		
			</item>
		<item>
		<title>Geo-Analytics in Salesforce</title>
		<link>http://sfdc.arrowpointe.com/2011/06/17/geo-analytics-in-salesforce/</link>
		
		<dc:creator><![CDATA[Scott Hemmeter]]></dc:creator>
		<pubDate>Fri, 17 Jun 2011 20:23:56 +0000</pubDate>
				<category><![CDATA[Geopointe]]></category>
		<guid isPermaLink="false">http://sfdc.arrowpointe.com/?p=925</guid>

					<description><![CDATA[<p>A new version of Geopointe was just released and in it is the ability to perform Geo-Analytics on LOTS of data.  And it&#8217;s fully integrated with Salesforce and the current Geopointe app. We have partnered with SpatialKey to bring you the Geopointe Analytics solution.  The SpatialKey platform allows you to perform deep geo-analysis against massive [&#8230;]</p>
<p>The post <a href="http://sfdc.arrowpointe.com/2011/06/17/geo-analytics-in-salesforce/" target="_blank">Geo-Analytics in Salesforce</a> first appeared on <a href="http://sfdc.arrowpointe.com/" target="_blank">Perspectives on Salesforce.com</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>A new version of <a href="http://www.arrowpointe.com/getmaps" target="_blank">Geopointe</a> was just released and in it is the ability to perform Geo-Analytics on LOTS of data.  And it&#8217;s fully integrated with Salesforce and the current Geopointe app.</p>
<p>We have partnered with <a title="SpatialKey" href="http://www.spatialkey.com" target="_blank">SpatialKey</a> to bring you the Geopointe Analytics solution.  The SpatialKey platform allows you to perform deep geo-analysis against massive amounts of data in a very intuitive, enjoyable and beautiful user interface.</p>
<p style="text-align: center;"><img loading="lazy" class="size-full wp-image-1035 aligncenter" title="Samples of output from Geopointe Analytics" src="http://www.arrowpointe.com/wp-content/uploads/analytics_thumbs.png" alt="" width="798" height="160" /></p>
<p><strong>Geopointe Analytics is now available</strong> in all Geopointe trials.  Existing customers may request a trial of the Analytics solution in their current system (after upgrading to the latest Geopointe version).  If you are running an older version of Geopointe, you can learn about upgrading <a title="Upgrading Geopointe" href="http://www.arrowpointe.com/products/geopointe/help/upgrading-geopointe/" target="_blank">here</a>.</p>
<p>End-users can access the features via the Visualize tab.  There, they can sync their data sets to SpatialKey, use existing org-wide data sets provided by an admin or launch into the user interface using either a full map or &#8220;blank canvas&#8221; interface.</p>
<p><img loading="lazy" class="alignnone size-full wp-image-1230" title="Launch Analytics" src="http://www.arrowpointe.com/wp-content/uploads/Launch-Analytics.png" alt="" width="900" height="250" /></p>
<p>The Analytics users interface is very interactive and immersive.  The following video gives you a taste of what&#8217;s offered, but the best option is to try it out for yourself.</p>
<p><iframe width="640" height="390" src="http://www.youtube.com/embed/YLSnp79xQPU?rel=0&amp;hd=1" frameborder="0" allowfullscreen></iframe></p>
<p>If you have any questions about this solution, <a title="Contact" href="http://www.arrowpointe.com/contact/">contact us</a>.</p><p>The post <a href="http://sfdc.arrowpointe.com/2011/06/17/geo-analytics-in-salesforce/" target="_blank">Geo-Analytics in Salesforce</a> first appeared on <a href="http://sfdc.arrowpointe.com/" target="_blank">Perspectives on Salesforce.com</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Proximity Searching via Apex</title>
		<link>http://sfdc.arrowpointe.com/2011/06/06/proximity-searching-via-apex/</link>
		
		<dc:creator><![CDATA[Scott Hemmeter]]></dc:creator>
		<pubDate>Mon, 06 Jun 2011 15:23:05 +0000</pubDate>
				<category><![CDATA[APEX Code]]></category>
		<category><![CDATA[Arrowpointe Products]]></category>
		<category><![CDATA[Geopointe]]></category>
		<category><![CDATA[Tips]]></category>
		<guid isPermaLink="false">http://sfdc.arrowpointe.com/?p=919</guid>

					<description><![CDATA[<p>A new release of Geopointe will be out next week after all systems are on the Summer 11 release. With the update will come the ability to perform spatial/proximity/radial searches via Apex. Two new Apex methods are available for this: radialSearchMapObject radialSearchDataSet These Apex methods enable Geopointe customers to utilize the proximity searching of Geopointe [&#8230;]</p>
<p>The post <a href="http://sfdc.arrowpointe.com/2011/06/06/proximity-searching-via-apex/" target="_blank">Proximity Searching via Apex</a> first appeared on <a href="http://sfdc.arrowpointe.com/" target="_blank">Perspectives on Salesforce.com</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>A new release of Geopointe will be out next week after all systems are on the Summer 11 release.  With the update will come the ability to perform spatial/proximity/radial searches via Apex. Two new Apex methods are available for this:</p>
<ul>
<li>radialSearchMapObject</li>
<li>radialSearchDataSet</li>
</ul>
<p>These Apex methods enable Geopointe customers to utilize the proximity searching of Geopointe into advanced Apex logic.  For information on all methods available to you, visit the <a href="http://www.arrowpointe.com/products/geopointe/help/api/"><strong>Apex API page</strong></a> in the Help Center.</p>
<p>Let&#8217;s run an example.  The image below displays a query (via the Geopointe UI) of our Geopointe customers within 15 miles of Wrigley Field in Chicago.  We want to accomplish this same query in Apex without ever needing the UI.  Now we can and the <a href="http://www.arrowpointe.com/products/geopointe/help/api/">geopointe.API class</a> will help us with this.</p>
<p><img loading="lazy" class="alignnone size-full wp-image-1185" title="radialSearchUI" src="http://www.arrowpointe.com/wp-content/uploads/radialSearchUI.png" alt="" width="506" height="411" /></p>
<p><span style="text-decoration: underline;">Using <strong>radialSearchMapObject</strong></span><br />
This method allows you to perform a radial search against a Map Object (a Salesforce object enabled for mapping) and also allows the passing in of a custom filter. Here we are saying to search around the record with id a1430000001E32gAAC and to search the Account object with a filter of Type = &#8216;Customer&#8217; for records within 15 miles.</p>
<pre class="brush: java; title: ; notranslate">
geopointe.API.radialSearchResult result = geopointe.API.radialSearchMapObject(
     'a1430000001E32gAAC',
     'account',
     'type=\'Customer\'',
     15,
     geopointe.API.units.MILES);

system.debug(result);
</pre>
<p><span style="text-decoration: underline;">Using <strong>radialSearchDataSet</strong></span><br />
The method below is accomplishing the same thing, but is using a pre-defined dataset that already has the filter for Customers built into it.</p>
<pre class="brush: java; title: ; notranslate">
geopointe.API.radialSearchResult result = geopointe.API.radialSearchDataSet(
     'a1430000001E32gAAC',
     '12826856169860.9678661172894504',
     15,
     geopointe.API.units.MILES);

system.debug(result);
</pre>
<p><span style="text-decoration: underline;">The <strong>radialSearchResult</strong> Class</span><br />
Both methods result in a geopointe.API.radialSearchResult object, which is defined in the <a href="http://www.arrowpointe.com/products/geopointe/help/api/">Geopointe Help Center</a>.  This object will return the record Ids closest to the center as well as the distances to these locations.</p><p>The post <a href="http://sfdc.arrowpointe.com/2011/06/06/proximity-searching-via-apex/" target="_blank">Proximity Searching via Apex</a> first appeared on <a href="http://sfdc.arrowpointe.com/" target="_blank">Perspectives on Salesforce.com</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Cloning Records in Apex</title>
		<link>http://sfdc.arrowpointe.com/2011/03/28/cloning-records-in-apex/</link>
					<comments>http://sfdc.arrowpointe.com/2011/03/28/cloning-records-in-apex/#comments</comments>
		
		<dc:creator><![CDATA[Scott Hemmeter]]></dc:creator>
		<pubDate>Mon, 28 Mar 2011 21:36:40 +0000</pubDate>
				<category><![CDATA[APEX Code]]></category>
		<category><![CDATA[Tips]]></category>
		<guid isPermaLink="false">http://sfdc.arrowpointe.com/?p=903</guid>

					<description><![CDATA[<p>When you clone an sObject in Apex, it copies all the fields populated in that Apex object, not necessarily all fields on the record.  Let&#8217;s say you have a Lead with FirstName, LastName, Company,  LeadSource and Status populated.  If you do the following, the clone will not have LeadSource and Status cloned from the original [&#8230;]</p>
<p>The post <a href="http://sfdc.arrowpointe.com/2011/03/28/cloning-records-in-apex/" target="_blank">Cloning Records in Apex</a> first appeared on <a href="http://sfdc.arrowpointe.com/" target="_blank">Perspectives on Salesforce.com</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>When you clone an sObject in Apex, it copies all the fields populated in that Apex object, not necessarily all fields on the record.  Let&#8217;s say you have a Lead with FirstName, LastName, Company,  LeadSource and Status populated.  If you do the following, the clone will not have LeadSource and Status cloned from the original record.  It will use the default values for Leads.  That is because those fields were not queried into the object.</p>
<pre class="brush: java; title: ; notranslate">
/* query lead and then clone it */
lead l = [select id, firstname, lastname, company from lead where id = '00Q3000000aKwVN' limit 1][0];
lead l2 = l.clone(false, true);
insert l2;
</pre>
<p>If you are cloning records, it can be frustrating to keep it updated as you add new fields to Salesforce.  I generally want all new fields to be cloned too.  I&#8217;ll code to any exceptions if needed.  To help with this, I wrote myself a handy method to build me a SOQL statement and obtain all the writable fields.</p>
<pre class="brush: java; title: ; notranslate">
public with sharing class Utils{ 

    // Returns a dynamic SOQL statement for the whole object, includes only creatable fields since we will be inserting a cloned result of this query
    public static string getCreatableFieldsSOQL(String objectName, String whereClause){
        
        String selects = '';
        
        if (whereClause == null || whereClause == ''){ return null; }
        
        // Get a map of field name and field token
        Map&lt;String, Schema.SObjectField&gt; fMap = Schema.getGlobalDescribe().get(objectName.toLowerCase()).getDescribe().Fields.getMap();
        list&lt;string&gt; selectFields = new list&lt;string&gt;();
        
        if (fMap != null){
            for (Schema.SObjectField ft : fMap.values()){ // loop through all field tokens (ft)
                Schema.DescribeFieldResult fd = ft.getDescribe(); // describe each field (fd)
                if (fd.isCreateable()){ // field is creatable
                    selectFields.add(fd.getName());
                }
            }
        }
        
        if (!selectFields.isEmpty()){
            for (string s:selectFields){
                selects += s + ',';
            }
            if (selects.endsWith(',')){selects = selects.substring(0,selects.lastIndexOf(','));}
            
        }
        
        return 'SELECT ' + selects + ' FROM ' + objectName + ' WHERE ' + whereClause;
        
    }

}
</pre>
<p>So if I want to clone the Lead I describe above, I&#8217;d do the following and this will ensure that I will clone all the fields on the Lead.  Since the method only adds Creatable fields to the SOQL, I don&#8217;t have to worry about trying to set a formula field or system field and generating an error.</p>
<pre class="brush: java; title: ; notranslate">
/* query lead and then clone it */
String soql = Utils.getCreatableFieldsSOQL('lead','id=\'00Q3000000aKwVN\'');
lead l = (Lead)Database.query(soql);
lead l2 = l.clone(false, true);
insert l2;
</pre><p>The post <a href="http://sfdc.arrowpointe.com/2011/03/28/cloning-records-in-apex/" target="_blank">Cloning Records in Apex</a> first appeared on <a href="http://sfdc.arrowpointe.com/" target="_blank">Perspectives on Salesforce.com</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>http://sfdc.arrowpointe.com/2011/03/28/cloning-records-in-apex/feed/</wfw:commentRss>
			<slash:comments>11</slash:comments>
		
		
			</item>
		<item>
		<title>Auto Run Radial Searches</title>
		<link>http://sfdc.arrowpointe.com/2011/03/07/auto-run-radial-searches/</link>
		
		<dc:creator><![CDATA[Scott Hemmeter]]></dc:creator>
		<pubDate>Mon, 07 Mar 2011 19:01:39 +0000</pubDate>
				<category><![CDATA[Arrowpointe Products]]></category>
		<category><![CDATA[Geopointe]]></category>
		<guid isPermaLink="false">http://sfdc.arrowpointe.com/?p=899</guid>

					<description><![CDATA[<p>Oftentimes, you want to integrate a specific map search into your business processes. For example, suppose your Inside Sales team is reviewing Leads and needs to notify your closest partner of the lead information. Geopointe is the tool to help you know who your closest partner is and this entire process becomes even easier when [&#8230;]</p>
<p>The post <a href="http://sfdc.arrowpointe.com/2011/03/07/auto-run-radial-searches/" target="_blank">Auto Run Radial Searches</a> first appeared on <a href="http://sfdc.arrowpointe.com/" target="_blank">Perspectives on Salesforce.com</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Oftentimes, you want to integrate a specific map search into your business processes.  For example, suppose your Inside Sales team is reviewing Leads and needs to notify your closest partner of the lead information. Geopointe is the tool to help you know who your closest partner is and this entire process becomes even easier when being creative with the available <a title="URL Parameters" href="http://www.arrowpointe.com/products/geopointe/help/url-parameters/" target="_blank">URL Parameters</a> for the Map page.</p>
<p>See this example in action in the video below.</p>
<table style="margin:0 auto;">
<tr>
<td><iframe title="YouTube video player" width="640" height="510" src="http://www.youtube.com/embed/Mz5pAX6KcKY?rel=0&amp;hd=1" frameborder="0" allowfullscreen></iframe></td>
</tr>
</table>
<p>The image below is a copy of the button configuration.</p>
<p><img loading="lazy" class="alignnone size-full wp-image-913" title="autoRunRadialSearch" src="http://www.arrowpointe.com/wp-content/uploads/autoRunRadialSearch.png" alt="" width="727" height="578" /></p><p>The post <a href="http://sfdc.arrowpointe.com/2011/03/07/auto-run-radial-searches/" target="_blank">Auto Run Radial Searches</a> first appeared on <a href="http://sfdc.arrowpointe.com/" target="_blank">Perspectives on Salesforce.com</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Static Maps in Visualforce</title>
		<link>http://sfdc.arrowpointe.com/2011/03/02/static-maps-in-visualforce/</link>
		
		<dc:creator><![CDATA[Scott Hemmeter]]></dc:creator>
		<pubDate>Wed, 02 Mar 2011 22:29:28 +0000</pubDate>
				<category><![CDATA[Arrowpointe Products]]></category>
		<category><![CDATA[Geopointe]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Visualforce]]></category>
		<guid isPermaLink="false">http://sfdc.arrowpointe.com/?p=888</guid>

					<description><![CDATA[<p>Geopointe includes a Visualforce Component that allows you to create Static Maps on your Visualforce Pages.  A Static Map results in an image file (png, jpg or gif) that you can configure and place on your Visualforce Pages or embedded in Page Layouts.  The nice thing about Static Maps is that they do not slow [&#8230;]</p>
<p>The post <a href="http://sfdc.arrowpointe.com/2011/03/02/static-maps-in-visualforce/" target="_blank">Static Maps in Visualforce</a> first appeared on <a href="http://sfdc.arrowpointe.com/" target="_blank">Perspectives on Salesforce.com</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Geopointe includes a Visualforce Component that allows you to create <strong>Static Maps</strong> on your Visualforce Pages.  A Static Map results in an image file (png, jpg or gif) that you can configure and place on your Visualforce Pages or embedded in Page Layouts.  The nice thing about Static Maps is that they do not slow down your pages from loading.  Rather, you are using the component to intelligently build an image URL.</p>
<p>Geopointe comes with some examples with the &#8220;embeddedMap&#8230;&#8221; pages.  These are pre-configured Visualforce Pages using the static map component to show you the location of a record.</p>
<p>We added a <strong><a title="Static Map" href="http://www.arrowpointe.com/products/geopointe/help/static-map/">Static Map page</a> </strong>on the website to act as the official documentation home for this functionality.  With Geopointe installed, you also get a documentation in your Component Reference regarding the geopointe:staticMap component.</p>
<p>Below are some examples showing off the functionality.</p>
<p>&lt;<span style="color: #800000;">geopointe:StaticMap</span> <span style="color: #0000ff;">mapProvider</span>=”goog” <span style="color: #0000ff;">width</span>=”500&#8243; <span style="color: #0000ff;">height</span>=”300&#8243; <span style="color: #0000ff;">useIconLabels</span>=”true” <span style="color: #0000ff;">iconColor</span>=”green” <span style="color: #0000ff;">locationIDs</span>=”a07A000000ATQjhIAH,a07A0000006O0qc,a07A0000006NKq2,Evanston|IL,OakPark|IL”/&gt;</p>
<p><img loading="lazy" class="alignnone size-full wp-image-876" title="StaticMap - pin colors, custom addresses and numbered icons" src="http://www.arrowpointe.com/wp-content/uploads/StaticMap4.png" alt="" width="500" height="300" /></p>
<p>&lt;<span style="color: #800000;">geopointe:StaticMap</span> <span style="color: #0000ff;">mapProvider</span>=&#8221;mq&#8221; <span style="color: #0000ff;">width</span>=&#8221;800&#8243; <span style="color: #0000ff;">height</span>=&#8221;200&#8243; <span style="color: #0000ff;">useIconLabels</span>=&#8221;true&#8221; <span style="color: #0000ff;">iconColor</span>=&#8221;purple&#8221; <span style="color: #0000ff;">locationIDs</span>=&#8221;a07A000000ATQjhIAH,a07A0000006O0qc,a07A0000006NKq2,Evanston|IL,OakPark|IL&#8221; <span style="color: #0000ff;">mapType</span>=&#8221;hyb&#8221;/&gt;</p>
<p><img loading="lazy" class="alignnone size-full wp-image-890" title="StaticMap - mapquest 800x200 hybrid" src="http://www.arrowpointe.com/wp-content/uploads/StaticMap8.jpg" alt="" width="800" height="200" /></p><p>The post <a href="http://sfdc.arrowpointe.com/2011/03/02/static-maps-in-visualforce/" target="_blank">Static Maps in Visualforce</a> first appeared on <a href="http://sfdc.arrowpointe.com/" target="_blank">Perspectives on Salesforce.com</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Want to help with Info Center?</title>
		<link>http://sfdc.arrowpointe.com/2010/12/14/want-to-help-with-info-center/</link>
					<comments>http://sfdc.arrowpointe.com/2010/12/14/want-to-help-with-info-center/#comments</comments>
		
		<dc:creator><![CDATA[Scott Hemmeter]]></dc:creator>
		<pubDate>Tue, 14 Dec 2010 19:46:05 +0000</pubDate>
				<category><![CDATA[Arrowpointe Products]]></category>
		<category><![CDATA[Info Center]]></category>
		<guid isPermaLink="false">http://sfdc.arrowpointe.com/?p=881</guid>

					<description><![CDATA[<p>The short story&#8230; I&#8217;d like an independent developer to &#8220;co-own&#8221; the Info Center app with Arrowpointe.  This dev will help take it to the next level.  This dev will do this in the name of getting some exposure for themselves and also as a way to learn force.com technologies.  The result is a publicly facing [&#8230;]</p>
<p>The post <a href="http://sfdc.arrowpointe.com/2010/12/14/want-to-help-with-info-center/" target="_blank">Want to help with Info Center?</a> first appeared on <a href="http://sfdc.arrowpointe.com/" target="_blank">Perspectives on Salesforce.com</a>.</p>]]></description>
										<content:encoded><![CDATA[<p><strong><em>The short story&#8230;</em></strong></p>
<p>I&#8217;d like an independent developer to &#8220;co-own&#8221; the Info Center app with Arrowpointe.  This dev will help take it to the next level.  This dev will do this in the name of getting some exposure for themselves and also as a way to learn force.com technologies.  The result is a publicly facing deliverable.  Info Center will remain free.</p>
<p>The dev should consider this a side project (i.e. no pay) done in the interest of proving an app to the community and learning some things along the way.  If you are a developer and have wanted to get out there and do something on AppExchange, this is a good opportunity to get some experience for very little risk (you are only spending time).</p>
<p><strong><em>The longer story&#8230;</em></strong></p>
<p><a href="https://sites.secure.force.com/appexchange/listingDetail?listingId=a0N300000016b9XEAQ" target="_blank">Info Center</a> is an app I created back in 2006.  To use it, an admin works in objects called Messages, FAQs and Links adding data for the purpose of communicating it to end users.  It was originally created for consulting projects I worked on as a place where the admin could answer FAQs for users as the deployment took off.  End users are given the &#8220;Info Center&#8221; tab, which renders all this data for them in a nice, easy to read format.</p>
<p>It has not changed in function or technology since 2006 and it could use an update.  For example, the Info Center tab below currently uses a S-Control to render it.</p>
<p><a href="http://sfdc.arrowpointe.com/wp-content/images/Info-Center-tab.png"><img loading="lazy" class="alignnone size-full wp-image-882" title="Info Center tab" src="http://sfdc.arrowpointe.com/wp-content/images/Info-Center-tab.png" alt="" width="700" height="439" srcset="http://sfdc.arrowpointe.com/wp-content/images/Info-Center-tab.png 700w, http://sfdc.arrowpointe.com/wp-content/images/Info-Center-tab-500x313.png 500w" sizes="(max-width: 700px) 100vw, 700px" /></a></p>
<p>My focus is now on <a href="http://www.arrowpointe.com/getmaps">Geopointe</a> and I have no time to work on Info Center.  I&#8217;ve been meaning to update it for a while now, but never got around to it.  Therefore, <strong>I wanted to see if anyone in the community (ideally an independent developer) wants to take on Info Center 2.0 and we&#8217;ll see what comes of it</strong>.</p>
<p>It still gets 10-20 installs per month and will provide a good way for someone trying to &#8220;make it&#8221; in the force.com world to gain some credibility. May as well help with an app that has a bit of momentum already, right?</p>
<p>Info Center was a project I assigned myself in 2006 in order to learn s-Controls and the API.  Having my deliverable be public facing went a long way towards making it polished, teaching me about the AppExchange and the nuances of <em>delivering</em> a app for others to use. I&#8217;d like to pass that experience along to someone else.</p>
<p>There is no timeline for this.  I am first looking for the right person who&#8217;d like to take this on.  If it takes months to complete, that&#8217;s fine.  As long as the person is committed to the task at hand.</p>
<p>At its simplest, I&#8217;d at least like to have the Info Center tab render using Visualforce.  I could envision a mix of Visualforce, Apex and jQuery being the technologies used. If delivering these technologies in an AppExchange app appeals to you, consider taking this on.</p>
<p>If interested, comment on this post and we&#8217;ll take it from there.  Please only comment if you are genuinely interested and feel you&#8217;d be able to see it through to the finish.  If you want to contact me privately, you can do so <a href="http://sfdc.arrowpointe.com/contact-us/">here</a>.</p><p>The post <a href="http://sfdc.arrowpointe.com/2010/12/14/want-to-help-with-info-center/" target="_blank">Want to help with Info Center?</a> first appeared on <a href="http://sfdc.arrowpointe.com/" target="_blank">Perspectives on Salesforce.com</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>http://sfdc.arrowpointe.com/2010/12/14/want-to-help-with-info-center/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Using a colon in the Report Name</title>
		<link>http://sfdc.arrowpointe.com/2010/12/02/using-a-colon-in-the-report-name/</link>
					<comments>http://sfdc.arrowpointe.com/2010/12/02/using-a-colon-in-the-report-name/#comments</comments>
		
		<dc:creator><![CDATA[Scott Hemmeter]]></dc:creator>
		<pubDate>Fri, 03 Dec 2010 00:11:34 +0000</pubDate>
				<category><![CDATA[Configuration]]></category>
		<category><![CDATA[Tips]]></category>
		<guid isPermaLink="false">http://sfdc.arrowpointe.com/?p=878</guid>

					<description><![CDATA[<p>I posted this in the Dreamforce Chatter app and it got a nice response, so I thought I&#8217;d blog about it here too. It&#8217;s subtle tip for you perfectionists out there that makes reports look just a tad more professional. If you add a colon (e.g. Orders: Aging) to your report name, it will display [&#8230;]</p>
<p>The post <a href="http://sfdc.arrowpointe.com/2010/12/02/using-a-colon-in-the-report-name/" target="_blank">Using a colon in the Report Name</a> first appeared on <a href="http://sfdc.arrowpointe.com/" target="_blank">Perspectives on Salesforce.com</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>I posted this in the Dreamforce Chatter app and it got a nice response, so I thought I&#8217;d blog about it here too.</p>
<p>It&#8217;s subtle tip for you perfectionists out there that makes reports look just a tad more professional.  If you add a colon (e.g. Orders: Aging) to your report name, it will display the report name on 2 separate lines when viewing the report. Use this to create a naming convention for your reports like (category: detailed description) or for long report names so they display nicely.</p>
<p>I don&#8217;t think this is an actual, documented feature from Salesforce, but it&#8217;s been this way for years.</p>
<p>Look at the difference between naming a report &#8220;Orders &#8211; Aging&#8221; and &#8220;Orders: Aging&#8221;. It&#8217;s a subtle difference, but it&#8217;s something I use regularly and thought I&#8217;d pass along.</p>
<p style="padding-left: 30px;"><a href="http://sfdc.arrowpointe.com/wp-content/images/using-a-colon-in-report-names.png"><img loading="lazy" class="alignnone size-full wp-image-879" title="using a colon in report names" src="http://sfdc.arrowpointe.com/wp-content/images/using-a-colon-in-report-names.png" alt="" width="476" height="69" /></a></p><p>The post <a href="http://sfdc.arrowpointe.com/2010/12/02/using-a-colon-in-the-report-name/" target="_blank">Using a colon in the Report Name</a> first appeared on <a href="http://sfdc.arrowpointe.com/" target="_blank">Perspectives on Salesforce.com</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>http://sfdc.arrowpointe.com/2010/12/02/using-a-colon-in-the-report-name/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
		<item>
		<title>arrowpointe @ dreamforce</title>
		<link>http://sfdc.arrowpointe.com/2010/12/02/arrowpointe-dreamforce-2/</link>
					<comments>http://sfdc.arrowpointe.com/2010/12/02/arrowpointe-dreamforce-2/#comments</comments>
		
		<dc:creator><![CDATA[Scott Hemmeter]]></dc:creator>
		<pubDate>Thu, 02 Dec 2010 23:58:21 +0000</pubDate>
				<category><![CDATA[Dreamforce 2010]]></category>
		<category><![CDATA[Events]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[The Community]]></category>
		<guid isPermaLink="false">http://sfdc.arrowpointe.com/?p=875</guid>

					<description><![CDATA[<p>Dreamforce is just around the corner and Arrowpointe will be there.  There are a number of ways to learn about Arrowpointe&#8217;s apps and also to contact Scott Hemmeter. Arrowpointe has a Dreamforce booth in the Expo.  Find it at&#8230; Scott is presenting in the &#8220;Advanced Force.com Code (Apex) Development and Performance Considerations&#8221; session. Several opportunities [&#8230;]</p>
<p>The post <a href="http://sfdc.arrowpointe.com/2010/12/02/arrowpointe-dreamforce-2/" target="_blank">arrowpointe @ dreamforce</a> first appeared on <a href="http://sfdc.arrowpointe.com/" target="_blank">Perspectives on Salesforce.com</a>.</p>]]></description>
										<content:encoded><![CDATA[<p><a href="http://www.dreamforce.com" target="_blank">Dreamforce</a> is just around the corner and Arrowpointe will be there.  There are a number of ways to learn about <a href="http://www.arrowpointe.com/products/" target="_self">Arrowpointe&#8217;s apps</a> and also to contact Scott Hemmeter.</p>
<ul>
<li>Arrowpointe has a Dreamforce booth in the Expo.  Find it at&#8230;</li>
</ul>
<p style="padding-left: 60px;"><img loading="lazy" class="alignnone size-full wp-image-794" title="arrowpointe booth location" src="http://www.arrowpointe.com/wp-content/uploads/arrowpointe-booth-location.png" alt="" width="517" height="458" /></p>
<ul>
<li>Scott is presenting in the &#8220;<em>Advanced Force.com Code (Apex) Development and Performance Considerations</em>&#8221; session. Several opportunities to attend.
<ul>
<li>1:15pm on Monday, December 6 at Cloudstock (Moscone West)</li>
<li>3:45pm on Tuesday, December 7 at Dreamforce (Moscone West 2003) (<a href="https://dreamevent.my.salesforce.com/a0930000006JRVo" target="_blank">follow in DF Chatter App</a>)</li>
<li>11:00am on Thursday, December 9 at Dreamforce (Moscone West 2004) (<a href="https://dreamevent.my.salesforce.com/a0930000007VGpz" target="_blank">follow in DF Chatter App</a>)</li>
</ul>
</li>
<li><a href="https://dreamevent.my.salesforce.com/_ui/core/userprofile/UserProfilePage?u=00530000003z3UN" target="_blank">Follow Scott Hemmeter</a> in the Dreamforce Chatter App</li>
<li><a href="https://dreamevent.my.salesforce.com/a0E30000005CPgl" target="_blank">Follow Arrowpointe</a> in the Dreamforce Chatter App</li>
<li>Follow <a href="http://twitter.com/arrowpointe" target="_blank">@arrowpointe</a> on Twitter</li>
</ul>
<p>Dreamforce looks to be very exciting and full of good information.  Whether you are a customer, developer, partner, prospective customer, journalist or just a techie at heart, there is content for you at Dreamforce.</p>
<p>If you are attending the show and have not yet gotten involved in the Dreamforce Chatter app, be sure and participate in that.  It has already changed the pre-conference experience and added to the excitement significantly.</p>
<p>See you there!</p><p>The post <a href="http://sfdc.arrowpointe.com/2010/12/02/arrowpointe-dreamforce-2/" target="_blank">arrowpointe @ dreamforce</a> first appeared on <a href="http://sfdc.arrowpointe.com/" target="_blank">Perspectives on Salesforce.com</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>http://sfdc.arrowpointe.com/2010/12/02/arrowpointe-dreamforce-2/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
