Placement | Width x Length (px) | Max File Size (kB) |
---|---|---|
custom app logo | 300 x 55 | 20 |
My Domain login page header | 250 x 125 | 100 |
community login page header | 250 x 125 | 100 |
Salesforce1 app branding | 150 x 50 | none |
community Chatter email logo | 460 x 560 | none |
Insights and lessons learned from designing and implementing cloud solutions on the Salesforce1 Platform. Side adventures into Heroku with Ruby on Rails apps also included.
Tuesday, December 30, 2014
Salesforce logo sizes
Here's an aggregation of standard logo sizes to consider for use with various Salesforce components.
Sunday, December 21, 2014
Where's the Visualforce viewstate coming from?
I felt inspired by a Q&A on Salesforce Stack Exchange to explore the growth of viewstates in Visualforce under different conditions. Without even reaching all of the test cases I originally set out to investigate, I was extremely surprised by my initial findings:
So while I wait for a response from the case that I'm going to log with Salesforce Support, I welcome anyone else's explanation for this phenomenon. Below are the Visualforce pages that support my findings above.
I've posted the source code for the Visualforce pages to GitHub as a gist.
- A viewstate only gets created once an apex:form is added to the page, regardless of what controller, if any, is used; but more curiously...
- A viewstate grows when non-form elements outside the apex:form are added to the page! How? And why?
So while I wait for a response from the case that I'm going to log with Salesforce Support, I welcome anyone else's explanation for this phenomenon. Below are the Visualforce pages that support my findings above.
Number | Title | Observations |
---|---|---|
Exhibit 1 | No controller, no form | No viewstate |
Exhibit 2 | Standard Lead controller, no form | No viewstate |
Exhibit 3 | Custom controller with persistent property, no form | No viewstate |
Exhibit 4 | No controller, one form | There's a viewstate! Which seems odd, since there's no controller to process the viewstate. |
Exhibit 5 | No controller, two forms | There's a single viewstate that's slightly larger than what's in Exhibit 4. |
Exhibit 6 | No controller, two forms | There's a single viewstate that's slightly larger than what's in Exhibit 5, even though literally nothing has changed except for the addition of a new p element outside of the apex:form! |
I've posted the source code for the Visualforce pages to GitHub as a gist.
Labels:
performance,
Visualforce
Friday, December 12, 2014
Workflow rule to record prior Owner Name
Sometimes you want to record a prior (a.k.a. "old") value for a particular field when it changes. If you need this simply for auditing purposes, tracking field history or implementing feed tracking should be all you need. But an alternative is needed if you want to do something else with that prior value, such as presenting it on a report or using it in a formula field.
The easiest way to record the prior value for something like Owner ID (could be Lead, Account, etc.) is to create a workflow rule and field update that uses the PRIORVALUE() function.
To see this in action, try the following to store the prior Lead Owner ID:
The easiest way to record the prior value for something like Owner ID (could be Lead, Account, etc.) is to create a workflow rule and field update that uses the PRIORVALUE() function.
To see this in action, try the following to store the prior Lead Owner ID:
- Create a Text(80) field on the Lead object named PriorLeadOwnerId
- Create a workflow rule named, "Set Prior Lead Owner ID". For evaluation criteria, select "Evaluate the rule when a record is created, and every time it’s edited". For rule criteria, enter this simple formula: ISCHANGED( OwnerId )
- Add a new field update action to the workflow rule named PriorLeadOwnerName, which updates the Prior Lead Owner Field by setting it to the formula: PRIORVALUE( OwnerId )
- Activate the workflow rule
Tip: If you want store prior related values, such as Owner Name instead of Owner ID, you can actually use a formula field to work around a PRIORVALUE() limitation.
For example, you can create a formula field labeled Lead Owner Name with formula, BLANKVALUE( Owner:Queue.Name , Owner:User.FirstName + ' ' + Owner:User.LastName ), and then use this formula field in the above workflow rule instead of OwnerId.
At this time, workflow rules still cannot set a Lookup field to a dynamic or formulaic value. So while a workflow rule certainly is convenient, it's important to remember that in Winter '15 there are a couple of other more powerful alternatives.
- Lightning Process Builder: Beta feature that seems poised to replace workflow rules once it becomes GA.
- Apex triggers: Nothing quite beats the power and precision of an Apex trigger, But you will need to learn some new syntax and guidelines.
Labels:
Salesforce,
workflow
Tuesday, December 9, 2014
Checkbox field for Live Agent pre-chat form
A [simple question](http://salesforce.stackexchange.com/questions/58529/live-agent-pre-chat-api-custom-checkbox-field/58533#58533) on Salesforce Stack Exchange exposed some unexpected behavior with the Pre-Chat API: Checkbox fields cannot be included as part of the pre-chat form.
The behavior appears to be that if a checkbox field is added to the specification for liveagent.prechat.findorcreate.map and liveagent.prechat.findorcreate.map.doCreate, the creation process fails and the desired record is not created. As soon as the checkbox field is removed from the form definition, the record creation process executes as expected.
While the reason for this behavior is unclear, at least there are two possible workarounds. The key to both workarounds is knowing that the String value of a marked checkbox is "on", and the String value of an unmarked checkbox is blank or null.
Assuming you've already created your Checkbox field, you can create a complementary Text field to hold the checkbox value submitted through the pre-chat form. For example, let's say your Checkbox field is named IsEmployed__c. You can create a Text field named IsEmployedText__c, and bind the pre-chat form field to IsEmployedText__c.
To close the loop, you'll create a workflow rule that basically sets IsEmployed__c to true when IsEmployedText__c equals "on", and another workflow rule to set IsEmployed__c to false otherwise.
Start with a Text field, and then simply create a Formula (Checkbox) field that uses NOT( ISBLANK( __ ) ) to produce the equivalent Boolean value.
For example, create a Text field named IsEmployedText__c, and bind the pre-chat form to this field. Within Salesforce, create a Formula (Checkbox) field named IsEmployed__c, and put int he formula NOT( ISBLANK( IsEmployedText__c ) ).
The behavior appears to be that if a checkbox field is added to the specification for liveagent.prechat.findorcreate.map and liveagent.prechat.findorcreate.map.doCreate, the creation process fails and the desired record is not created. As soon as the checkbox field is removed from the form definition, the record creation process executes as expected.
While the reason for this behavior is unclear, at least there are two possible workarounds. The key to both workarounds is knowing that the String value of a marked checkbox is "on", and the String value of an unmarked checkbox is blank or null.
Workaround 1: Workflow rule
Assuming you've already created your Checkbox field, you can create a complementary Text field to hold the checkbox value submitted through the pre-chat form. For example, let's say your Checkbox field is named IsEmployed__c. You can create a Text field named IsEmployedText__c, and bind the pre-chat form field to IsEmployedText__c.
To close the loop, you'll create a workflow rule that basically sets IsEmployed__c to true when IsEmployedText__c equals "on", and another workflow rule to set IsEmployed__c to false otherwise.
Workaround 2: Formula field
Start with a Text field, and then simply create a Formula (Checkbox) field that uses NOT( ISBLANK( __ ) ) to produce the equivalent Boolean value.
For example, create a Text field named IsEmployedText__c, and bind the pre-chat form to this field. Within Salesforce, create a Formula (Checkbox) field named IsEmployed__c, and put int he formula NOT( ISBLANK( IsEmployedText__c ) ).
Labels:
formula,
hack,
Salesforce
Wednesday, December 3, 2014
Where are my Featured Search images in Kokua?
If you're trying out the new Community Designer feature (in beta still, as of Winter '15), you may run into a bit of trouble getting the images to appear correctly for Featured Search on Kokua's homepage. At a high level, there are the three key requirements to getting an images to appear on the homepage, explained in more detail below.
This part is relatively simple. All you need to do is open Site.com Studio for the community's site, and then upload the image as an asset.
Note: If you upload a .zip file where the images are stored in folders, you will need to tweak your Category Image URL in the last step.
- Name the image as DataCategoryUniqueName-s.jpg
- Upload the image as an asset using Site.com Studio
- Enter a value using merge fields into the Category Image URL: {!Global.PathPrefix}/{!DataCategory.Name}.jpg
Note: The ".jpg" extension is not required, but it must match what you entered for the Category Image URL.
Name the image
To figure out what to name an image for a data category, you need to know the data category's Category Unique Name is. To figure this out, first go to Setup > Customize > Data Categories > Data Category Setup. Next, click the Actions button next to an existing data category, then click Edit Category. Now the Category Unique Name field and value will be exposed.
For the Featured Search box on the homepage, you need to specify 's' (stands for "square") for the <size> portion of the filename. Here are some examples.
Data Category Unique Name | Image Type | Image Filename |
---|---|---|
Technology_Enablement | JPEG | Technology_Enablement-s.jpg |
Customer_Engagement | JPEG | Customer_Engagement-s.jpg |
Strategy | PNG | Strategy.png |
Note: The Winter '15 documentation for Featured Search says that you should use the convention <datacategoryname>-<size>.<filetype>. However, a more accurate convention is <datacategoryuniquename>-<size>.<filetype>.
Upload the image
This part is relatively simple. All you need to do is open Site.com Studio for the community's site, and then upload the image as an asset.
- Go to Setup > Customize > Communities > All Communities
- Click Community Designer next to your community
- Click the top header's picklist next the the word "Communities", and click Go to Site.com Studio
- In the left-hand navigation tree, click Assets under All Site Content
- Click the Import... button, and upload your image
Note: If you upload a .zip file where the images are stored in folders, you will need to tweak your Category Image URL in the last step.
Enter a value for Category Image URL
Finally, while you're in Site.com Studio, you need to edit the main page and enter a value for the Category Image URL property in Featured Search.
- On the Overview tab, click Site Pages under All Site Content
- Double-click main under Site Map to open the page
- In the Views section, double-click Kokua Home to edit the view
- Under Page Structure, click Featured Data Categories
- In the Property Editor in the right sidebar, enter this exact value for Category Image URL: {!Global.PathPrefix}/{!DataCategory.Name}.jpg
Note: In the previous step if you uploaded a .zip file where the images are stored in folders, you need to include the folder names in the Category Image URL value, such as: {!Global.PathPrefix}/folder/subfolder/{!DataCategory.Name}.jpg
Labels:
Communities,
Salesforce,
Site.com
Subscribe to:
Posts (Atom)