Namespacing Bootstrap from square one


I recently helped a fellow irc'er figure out how to namespace Bootstrap. At first I linked him to this video: . But then I realized a video may not be the best way to present this information, especially if you do not have much of a modern dev/build environment setup on your machine. We'll walk through everything you need to install in order to successfully build a namespaced version of Bootstrap, an OS X device.

First, let's install HomeBrew. Simply use the one liner you can find here: .

Second, we need to install Node using HomeBrew. Type 

brew install node

Third, we need to install Grunt by typing:

npm install -g grunt-cli

Now we should have all the tools we need in order to build a namespaced version of Bootstrap.

In order to build, navigate to a folder where you'd like to clone the Bootstrap git repo and type:

git clone

Now, navigate to ./bootstrap/less/bootstrap.less and add a new line as the first line of the file: 

.myBootstrapNamespace {

then add a new line at the very end of the file:


You have now just wrapped all of the less in a class named myBootstrapNamespace.

Now we need to build Bootstrap.

Navigate to ./bootstrap and type

npm install

Once that finishes, type


After a bunch of text scrolls by with the status of various build steps, you should now have your namespaced version of Bootstrap in the ./bootstrap/dist directory. Simply put this version into your static resource in Salesforce, and you can now style your Visualforce page contents using Bootstrap by making a container div within your page like:

<apex:page ........>
  <!-- Include the namespaced css from your static resource -->
  <div class="my-bootstrap-namespace">
    <!-- My HTML Here -->

Caveats: Salesforce styles which come down with a VF page with the header on can be very broad, some will override the Bootstrap CSS. Also, keep in mind you are essentially developing your entire page within a <td> element, this can result in some funkyness with inherited properties on your divs, specifically you may need to fiddle with display props to get parents to actually fully contain their children. 

Strengthening Our Community: One Meal At A Time

“No one is useless in this world who lightens the burdens of another.” ―Charles Dickens

As a company, we follow Foundation’s integrated philanthropic 1-1-1 model

Yesterday, we had the privilege of volunteering our company’s time at Community Food Share in Louisville, Colorado (where Bracket Labs is headquartered)a non-profit with a mission to be a leader in the community’s efforts to end hunger in Boulder and Broomfield Counties. 

While we live in a place with many natural resources, Colorado’s population like other states around the country faces serious struggles with hunger and food security. Some sobering statistics*:

  • More than 1 in 5 Colorado kids don’t know when or where they will get their next meal.
  • More than 1 in 4 working families in Colorado do not have enough food to meet their basic needs.
  • About 23,500 veterans in Colorado live in households that participated in food stamps at some point during the past 12 months.

Community Food Share is a Feeding America Food Bank that procures, processes, and distributes 8 million pounds of food a year to some of the most at-risk people in Boulder and Broomfield counties.  The Food Share is open to qualifying families and individuals. Additionally, local agencies that serve the community partner with the food bank to secure food products for their organizations to distribute more broadly when and where it is needed most.

The Bracket Labs team processed 2200 lbs of food—frozen turkeys, pork, and chicken, as well as hundreds of cans of soup, nut butters, vegetables, fruits, pasta, and more.  The food will be in the hands of people who need it within a few weeks. We’ll be headed back every few months to help Community Food Share achieve its mission. 

Blakely, Erin, and Mike sorting through donations from a recent food drive.

Blakely, Erin, and Mike sorting through donations from a recent food drive.

If you want to learn more about how you can get involved with a food bank near you, here is some information about the parent organization—Feeding America

*Courtesy Hunger Free Colorado

Quick Tip: Efficiently Drag and Drop files into Salesforce and TaskRay

As you may know, it is possible to quickly drag and drop a file into Salesforce via Chatter.

Simply drag your file onto the Chatter section of any object, including TaskRay, click Share and you file will be saved within the Chatter feed of that object.

Here's a quick video within TaskRay:

This is great functionality, but what if I want to upload multiple files at once or need to add files to the Notes and Attachments section of a Salesforce object instead of Chatter? 

One cool app that makes this easy is Dragger

Dragger is a five star rated app that allows users to upload multiple files to Chatter simultaneously without needing to click the Share button. You can also upload files to the Notes & Attachment sections within Salesforce as well as drag and drop files to the attachment section of an email you may be sending directly from Salesforce. 

It also works within the Chatter tab of TaskRay. Here's a quick video of me uploading 3 files at once with a simple drag and drop action: 

Certainly much quicker than having to do that one file at a time and with fewer clicks!

Further info on Dragger can be found on their AppExchange listing here. What's your favorite app to use with TaskRay?

Sharing TaskRay Data with Key Stakeholders

An important aspect of project management is the ability to track and report its data - and of course different stakeholders will want different metrics. 

For example:

  • Executives may want a high level overview across projects
  • Project managers may want overdue tasks within a project
  • Team members may want a list of their tasks and their deadlines
  • Customers may want status reports

To help organize this data, we have pre-packaged a folder of 12 sample TaskRay reports located in the Reports Tab within Salesforce.

Additionally, we also offer a free Dashboard Pack for TaskRay which can be installed from the AppExchangeEach of these reports and dashboards can be easily customized to meet the unique needs of your stakeholders.

There are also several hidden gems of the Salesforce platform that can help ensure your data gets to your stakeholders, whether they live inside or outside of Salesforce. Here's more information on those gems: 

Scheduled Reports

Did you know it is possible to schedule reports to be automatically emailed to any user? To do that just click on the Reports tab in Salesforce, select a report and click the dropdown next to Run Report where you can select the Schedule Future Runs option.  

Next we will have the option of selecting which users will receive this report and by what frequency.

This is great functionality and allows us to automatically share reports to any other Salesforce user (including non-TaskRay users)!

However, it does not allow us to share reports externally with vendors or clients. There is a Salesforce idea to add this functionality. Be sure to vote and comment here.

In the meantime, there are some viable workarounds. One option is to schedule a report to send to an internal Salesforce user and then have their email configured to automatically forward that report to someone outside of Salesforce (e.g. a customer or vendor). 

Or you could take advantage of another app such as Conga Composer or Report Scheduler which will allow you to automatically create and send reports and documents from Salesforce to anyone internal or external.

Salesforce/TaskRay Permissions and Licensing

In general, Salesforce only allows users who have a license to an app such as TaskRay to view and access its data. This means users who do not have a license to TaskRay will not be able to see the project and task objects or any related data or reports.

But what if we have a number of internal users (e.g. Executive team or Sales Managers) who do not have a license to TaskRay but just need to see a Report or Dashboard showing the project?

Here are a couple of ways we can achieve this:

1. Public Folder and Scheduled Reports:

Reports in the TaskRay folder can only be scheduled to be sent to users who have a license to TaskRay. So, if you copy and move a few key reports to another "Public" folder you can then schedule those reports to be sent to non TaskRay license holders. 

The report recipient will be able to see the data of that report in the body of their email. They will not however, be able to click through to view the report in Salesforce.

2. View Dashboard as Running User:

Once you've customized your TaskRay Dashboards it is possible to allow non-TaskRay users to view them. To do that first place the Dashboard in a Public Folder. Next go into your Dashboard report and click Edit. 

In the top right corner you'll see a dropdown next to "View Dashboard as:" that looks like this:


Click on the drop down and make sure that "Run as specified user" is selected and click OK.

If that specified user is a TaskRay license holder then anyone who does not have a license can select and view that Dashboard as that person at anytime. They will not be able to click into any of the Dashboard components to view its underlying report. Nevertheless being able to view TaskRay project management data can be extremely valuable:

Dashboard Example

If you have a number of internal users who do not have a TaskRay license and are not creating, editing and managing tasks but do want to check-in and view the status, this is a fantastic option.

Visibility into project management data is highly valuable. Sharing this data allows for better and more informed business decisions. In the words of the wise Mr. Spock (& fondly remembered Leonard Nimoy), "...the more we share, the more we have." Amen!

Capture the Flag with Lightning Process Builder

Capture the Flag

Last week, we announced a new TaskRay Flows unmanaged package available in the AppExchange. This package is meant to be combined with an existing installation of our TaskRay app to provide robust project management in Salesforce. In that blog post announcement we teased the power of our "Capture The Flag" flows. 

For those of you who didn't attend Camp Conowingo each summer as I did you may need a refresher on the popular game, Capture the Flag. Capture the Flag is a game where a team "sets" up a flag, while the opposing team works to "capture" their flag, and ultimately "removes" the flag.

In our flows we are essentially performing the same three actions. We "set" a flag, we "capture" the flag, and then "remove" the flag - but without the mosquitoes of Camp Conowingo. In our recent post on TaskRay dependencies we use the capture the flag flow in this way:

  1. A deadline changes on a predecessor task.
  2. A process detects the change and starts a flow that "sets" a flag named Dependent Update Pending for any dependent tasks.
  3. The process then "captures" any flagged tasks and performs a cascading deadline update.
  4. The process then "removes" the flag after the update for that task is completed.

This process continues until all records in the chain have had a flag set, captured, and removed.

The cool thing about the capture the flag technique is it can be used in an endless amount of scenarios where you would want to trickle updates through a project, its sub-projects, and their tasks.

But there is a catch. The fine print. If you missed it from our previous blog, I feel compelled to repeat it here today, as it is a real limitation to consider.

The Fine Print

Turning on this type of automation can have a negative impact to your TaskRay performance. Please test in your sandbox with a volume of tasks that approximate your real business flow. In our preliminary testing we have found that you can quickly hit Salesforce limits with only 10 - 12 connected tasks. Here are some other ways to minimize the impact to performance:

  • Turn off polling notifications. (Polling are those pop-up notifications you see when another user in your org makes a change while you are viewing the same tasks.) Turning off notifications could have a noticeable impact on dependency performance. Step 4 of our Notification Settings guide will help you turn them off.
  • Vote on this Salesforce idea which we believe will have a positive impact on performance: Bulkify Process Builder!

Sample use case: Cascade Lookups to tasks

With the fine print understood, let's carry on with an example capture the flag business process. Today I am going to show you how to set-up one of the most commonly requested use cases: connecting an account (or really any other record in Salesforce) to a project and having it automatically trickle down to its tasks. The biggest reason for this request is that connecting the Account to both a project and its tasks results in related lists for both projects and tasks on the Account record! Here's how to set it up:


Packaged flows are required to be installed in the active state. While the flows and workflow rules come in active, be assured that you won't be kicking off any workflow automation until you add dependencies to your tasks or until you finish the rest of the steps in this blog.

If you do not need the dependent task process we described in the previous blog post, I would advise you to deactivate it. If you want to use capture the flag for multiple processes (e.g. Dependent Tasks + Cascade Lookups to Tasks), you will need to get more creative on criteria for resetting the flag or possibly combine flows so you do not cause a conflict in setting or removing flags.

Remember, it is always best practice to install and test in a sandbox environment first. Note: This extension pack is only available for Enterprise Edition.

  1. Download and install the unmanaged package from the AppExchange: TaskRay Flows.
  2. In Process Builder, deactivate the Dependent Tasks with Predecessor process.

Step 2. Add Account Lookup to Project and Task

  1. Add an Account lookup relationship field on the TaskRay Project object and add to the TaskRay Project page layout and field set.
  2. Repeat process to add an Account lookup relationship field on the TaskRay Task object, page layout, and field set.
  3. If you need any help with these steps we have a detailed blog post on lookups to help.

STEP 3. Create Process "Populate Account on Task"

The first process we will build will grab the Account field stored on the project and populate it on the Account field stored on the task whenever a new task is created.  This process doesn't use the capture the flag flow and its related processes, so it's unlikely that you'll run into the performance issues mentioned in the fine print above.

  1. From Setup, navigate to Create | Workflows & Approvals | Process Builder.

  2. Click New.

  3. Enter the name On Create - Populate Account on Task with the description 'Use the Account field on Project to populate the Account field on Task upon task create'.

  4. Click Save.

  5. For the Object select TaskRay Task.

  6. Choose to start the process 'only when a record is created'.

  7. Click Save.

  8. Click on Add Criteria.

  9. Name the Criteria Account on Project Exists.

  10. Select Filter conditions are met.

  11. In Select a Field choose TASKRAY__Project_Task__c > TASKRAY__Project__c for Field, Is Null for Operator, and False for Value.

  12. Click Add Row.

  13. In Select a Field choose TASKRAY__Project_Task__c > Project > Account__c so that your for Field, Is Null for Operator, and False for Value.

  14. Select 'All of the conditions are met (AND)'.

  15. Click Save.

  16. Click Add Action in Immediate Actions box.

  17. Select Update Records.

  18. Name the Action Add Account to Task.

  19. Select TASKRAY__Project_Task__c for Object.

  20. Click Save.

  21. For Field in Set Object Variables select Account.

  22. For Value change pencil icon to finder and select TASKRAY__Project_Task__c > Project > Acount__c so that your final value is [TASKRAY__Project_Task__c].TASKRAY__Project__c.Account__c.

  23. Click Save.

  24. Click Activate.

  25. Click Ok.

I recommend testing this first process you have created before moving onto the next process. To test, create a new Project and associate it with an Account. Now add a Task on that Project, did Account automatically populate? If yes, you are ready to move on.

STEP 4. CREATE PROCESS "Flag Task for Update"

If you were to update the Account field on a Project, you would want to trickle down that update to its tasks. However, before we can perform that update we need to know which tasks to apply it to, so first let's set the flag! This process will potentially run into the performance considerations mentioned above in "the fine print" so you'll want to test with a large enough volume of tasks in a project to get a sense where the limits are.

  1. From Setup, navigate to Create | Workflows & Approvals | Process Builder.
  2. Click New.

  3. Enter the name Flag Task for Update with the description 'Set a flag on Task when the Account field has been updated on a Project'.

  4. Click Save.

  5. For the Object select TaskRay Project.

  6. Choose to start the process 'when a record is created or edited'.

  7. Click Save.

  8. Click on Add Criteria.

  9. Name the Criteria Account on Project Updated.

  10. Select Filter conditions are met.

  11. In Select a Field choose TASKRAY__Project__c > Account__c for Field, Is Changed for Operator, and True for Value.

  12. Select 'All of the conditions are met (AND)'.

  13. Click Save.

  14. Click Add Action in Immediate Actions box.

  15. Select Flows.

  16. Name the Action Set Task update flag.

  17. Select AutoSetTaskFlagFromProjectId for Flow.

  18. Click Add Row.

  19. Choose ProjectId for Flow Variable and [TASKRAY__Project__c].Id for Value.

  20. Click Save.

  21. Click Activate.

  22. Click Ok.

STEP 5. CREATE PROCESS "Update Account & Reset Flag"

Ok, you have successfully set the flag and now know which tasks need to be updated. Let's capture the flag, update the Account field on the Task, and then remove the flag.

  1. From Setup, navigate to Create | Workflows & Approvals | Process Builder.

  2. Click New.

  3. Enter the name On Update - Change Account on Task with the description 'If Account field on Project is modified, update the Account field on Task'.

  4. Click Save.

  5. For the Object select TaskRay Task.

  6. Choose to start the process 'when a record is created or edited'.

  7. Click Save.

  8. Click on Add Criteria.

  9. Name the Criteria Update Pending.

  10. Select Filter conditions are met.

  11. In Select a Field choose TASKRAY__Project_Task__c > Depending Update Pending for Field, Equals for Operator, and True for Value.

  12. Select 'All of the conditions are met (AND)'.

  13. Click Save.

  14. Click Add Action in Immediate Actions box.

  15. Select Update Records.

  16. Name the Action Update Account & Reset Flag.

  17. Select TASKRAY__Project_Task__c for Object.

  18. Click Save.

  19. For Field in Set Object Variables select Account.

  20. For Value change pencil icon to finder and select TASKRAY__Project_Task__c > Project > Acount__c.

  21. Click Add Row.

  22. For Field in Set Object Variables select Dependent Update Pending.

  23. For Value select False.

  24. Click Save.

  25. Click Activate.

  26. Click Ok.

You're finished! You should now have a set of Capture the Flag processes that will automatically add Account to your task on create, and then also automatically update the Account if it should change on the Project. No more editing tasks one by one! What lookup relationship field will you be adding the Capture the Flag process to?