Thursday, February 26, 2015

[Salesforce / RemoteAction] Using Date fields on a RemoteAction (PITA ALERT!)

I've just come through a bug on the Date field handling for Visual Force @RemoteAction.

We want to pass to a remote action a list of SObjects to be handled correctly.

This is the controller that hosts the @RemoteAction method:

public class MyController(){
   @RemoteAction
   public String doAction(List<contact> contacts){
      return 'All is ok!';
   }
}

This is the JS on the VF page:

function action(){
   var contact1 = {"LastName":"Smith",
                   "FirstName":"John",
                   "Phone" : "999-999-999"};
   var contact2 = {"LastName":"Brown",
                   "FirstName":"Mike",
                   "Phone" : "123-456-789"};
   var contactList= [contact1, contact2];
   Visualforce.remoting.Manager.invokeAction(
              '{!$RemoteAction.MyController.doAction}', 
              accList || [],
                function(result, event){
                    if(event.status){
                        alert(result);
                    }else{
                        //generic event error
                        alert(event.message);
                    }
                },{escape: false, timeout: 120000});
}

This runs perfectly.

But let's add a Date field on the JS part:
function action(){
   var contact1 = {"LastName":"Smith",
                   "FirstName":"John",
                   "BirthDate":"1980-01-01",
                   "Phone" : "999-999-999"};
   var contact2 = {"LastName":"Brown",
                   "FirstName":"Mike",
                   "BirthDate":"1982-11-21",
                   "Phone" : "123-456-789"};
   var contactList= [contact1, contact2];
   Visualforce.remoting.Manager.invokeAction(
              '{!$RemoteAction.MyController.doAction}', 
              contactList || [],
                function(result, event){
                    if(event.status){
                        alert(result);
                    }else{
                        //generic event error
                        alert(event.message);
                    }
                },{escape: false, timeout: 120000});
}

And all messes up, stating that you are passing an incorrect type to MyController.doAction(List).

The problem is related to how the Date type serialization is done when invoking the Remote Action (it is apparently a bug not fixed yet).

The solution is to pass a serialized version of the JS array and deserialize it with Apex:

public class MyController(){
   @RemoteAction
   public String doAction(String serializedContacts){
      List<contact> contacts = (List<contact>)JSON.deserialize(objList,List<contact>.class);
      return 'All is ok!';
   }
}


function action(){
   var contact1 = {"LastName":"Smith",
                   "FirstName":"John",
                   "BirthDate":"1980-01-01",
                   "Phone" : "999-999-999"};
   var contact2 = {"LastName":"Brown",
                   "FirstName":"Mike",
                   "BirthDate":"1982-11-21",
                   "Phone" : "123-456-789"};
   var contactList= [contact1, contact2];
   Visualforce.remoting.Manager.invokeAction(
              '{!$RemoteAction.MyController.doAction}', 
              JSON.stringify(contactList || []),
                function(result, event){
                    if(event.status){
                        alert(result);
                    }else{
                        //generic event error
                        alert(event.message);
                    }
                },{escape: false, timeout: 120000});
}

Remember: don't mess with JSON serialization!

Tuesday, February 24, 2015

[NodeJS] My Simple Static Webserver


When developing pure HTML5 mockups I usually don't want to install a webserver or host my static pages on a remote webserver...
More over I sometimes like to create my own tools even if they are already on the net or they are super duper simple.

That's why I created a simple NodeJS static webserver.

You can find that simple app in this Github repo.

To use it just type:

$ git clone https://github.com/enreeco/simple-static-web-server

$ node server

This will create a local webserver @ http://localhost:3000/index.html: all the files must be kept on the root folder.

If you want to specify another port simply type:

$ node server 1234

And the magic will be @ http://localhost:1234/index.html.

Before leaving remember my motto:

Friday, February 13, 2015

[Salesforce / Mobile SDK] Salesforce Mobile SDK 3.1 brings unified app architecture

I left mobile development in the far 2010, when Salesforce development became my actual job.
In the past 6 years I've gradually switched to web dev techs over native development, and this a kind of hurted my feelings, but it was a necessary path (I merged the passion for discovering new techs with learning something usefull for my "giving-money" job).

Few months ago I made up with my team a quick demo for a client using PhoneGap and the Salesforce Mobile SDK: it was really amazing, we created a fully working app (I'm not the wizard of UIs, but it was pretty amazing) in a couple of weeks.

With the new release of the Mobile SDK we have a unique set of interfaces shared between all platforms to link your app, so you don't have to think to which feature you can use and which not, and dedicate your time to develop your awesome app in your preferred platform.


Here it is a link to the Mobile SDK Release Notes.

SmartSync for native and hybrid development is (in my opinion) the coolest utility feature in this release: this grants a common set of complete API to talk to the SmartSync layer, to ptimize data access when storing objects or doing cached queries.

This allow you to develop responsive and high qualities apps that work perfectly is an offline mode as well as online mode, creating a caching layer and a conflict resolution control.

The following is a cool mini-tutorial on how to detect conflicts when managing offline data while the details of the SmartSync usage.

For a complete example jump on this tutorial.

Other important features includes:
  • CocoaPods for iOS: iOS devs can now use CocoaPods to handle the Salesforce Mobile SDK
  • Gradle for Native Android Apps: Gradle is now supported for Android development, and will be available for Cordova Hybrid Dev in the next Cordova release
  • Certificate Based Authentication Pilot: no need for username/password request for your users to log in

This framework is getting new features release after release, and if you haven't join our developer community and start build awesome apps!


Thursday, January 22, 2015

[Salesforce] My favorite Spring '15 features



This is my top 10 list of the Spring '15 Force.com platform update's features.


Make Long-Running Callouts from a Visualforce Page


This is a really important feature. Imagine you have big VisualForce pages in which Apex methods, triggered by buttons / links / rerenders, do one or more callouts to external services.

Imagine hundreds of users use that page and the external services go down, thus causing timeouts on the callouts.

This could lead to heavy problems, because there can be no more than 10 long running Apex processes at the same time: this leads to unexpected and horrible output errors.

Using this new feature we can now "asynchronize" synchronous Apex callouts, using the new Connection Apex class, that is used like a callback when the callout has ended.
Basically you create a method split in 2 parts: the first (invoked by a button / link) has the starting callout code and the last receives the results from the callout.
Even if the callout/callouts (you can trigger up to 3 callout a time) fails / go timed out this call won't count towards the logn running processes.

I'm gonna write down a post to show how this works using HttpRequests and also SOAP requests.


Set Up Test Data for an Entire Test Class


This is an extremely useful feature for large ORGs with hundreds of test classes.

This allow us to write "test setup" methods (new annotation @testSetup) that are called once per test class: when a test method is executed the context has all the objects created in those setup methods (you can have more than one method of this kind, but the execution order is not guaranteed). Each test method execution rollbacks its data at the end, so that the following class's test method will see the values as if they were just been created.


Deploy Your Components in Less Time


Imagine you have the GO for a deploy in your production ORG but you have to do it at saturday midnight (and test methods requires more than an hour to run!!!!)...this is absolutely not cool!

This feature allow you to send a deploy to production before your deadline, test classes are run during this "freezed" deploy and it stays freezed for 4 days: when you are ready you simply click the "Quick Deploy" button and the components are deployed instantly! Whoooaa this is magic!



Create Named Credentials to Define Callout Endpoints and Their Authentication Settings


You can finally leave all the authentication mess to the Force.com platform and just sit on your screen and simply code you business requirement, magically storing sessions, tokens and whatever it is needed on Salesforce.

You can also use a named credential in a simplyfied way to store callout endpoints.


Business Continuity - Promote Business Continuity with Organization Sync


With Organization Sync you can setup a secondary ORG that you can use when your primary ORG needs some maintenance (e.g. a big release of your developments), giving a 24/7 service availability.

Orgs are synched automatically through a data replication mapping.

I haven't already tested this feature, but being available on developer Orgs I'll certainly try it soon.


Visually Automate Your Business Processes


This is the Lightning Process Builder, a cool visual tool that help you automates your business processes, from simple actions to complex combinations.

It seems really awesome but unfortunately it is not available on the pre-release program.
You better see in the next days tens of posts about this new feature!


Lightning Components (BETA)


Lightning components are still in beta and the builder in pilot.
But we have new additions:

  • New Components: brand new base components (such as select input, textarea, ...)
  • Namespace Requirement Removed: finally no need to setup a namespace, easing the creation of packages and the deploy across orgs
  • Support Added for Default Namespace: follows the previous point
  • Extend Lightning Components and Apps: like classes, you can extend components and apps
  • Referential Integrity Validation Added: integrity validation has been boosted


New increased limits


There are some new increased limits:

  • Deploy and Retrieve More Components: limit increased from 5000 to 10000 components
  • Chain More Jobs with Queueable Apex: from 2 chained jobs to infinity (except for Developer and Trial orgs where the limit is 5)
  • Make Apex Callouts with More Data: size per callout (HTTP or SOAP) increased from 3 MB to 6 MB for synchronous APEX and 12 MB for asynchronous


Create or Edit Records Owned by Inactive Users


All users can now edit objects owned by inactive Users, before Spring '15 only administrator could do it!
Believe me, this is really usefull.


Legitimize User Activity using Login Forensics (PILOT)


These are forensics metrics to identify suspicious behavior of users (such as logins from unusual IPs or excessive number of login among the average number).
This is a PILOT program, so you have to explicitly ask Salesforce to be enabled.


As usual, may the FOrce.com be with you guys!

Tuesday, December 9, 2014

[Salesforce / JS] Download automatically files from apex (using href link and base64)

This post is a recap of this Salesforce Developer Forum thread.

We want to trigger a download from an attachment but the running user don't have access to the object (think of Community User for instance).

In the controller read the Attachment's body in a String getter coded in Base64:

public String base64Value{get;set;}
public String contentType{get;set;}
public void loadAttachment(){
   Attachment att = [Select Id, Body, ContentType From Attachment limit 1];
   base64Value = EncodingUtil.base64Encode(att.Body);
   contentType = att.ContentType;
}

In the page:
<a href="data:{!contentType};content-disposition:attachment;base64,{!base64Value}">Download file</a>

Saturday, December 6, 2014

[Chrome Extension] "Pack your link" extension on the store by enree.co (yes, thet's me...)



I'm not a marketing guy, I neither have requested advices from my marketing guys friends...I did it all my way and that's why my brand new Chrome Extension will be forgotten in days!

Let's start from the beginning...

Once upon a time there was a simple Chrome Extension I made at work for WebResults, my Company: you will hear about it in weeks, but not now.

After weeks of testing we decided to put it in the market but I didn't now how to do it (I know, there si plenty of stuff online, but I don't trust myself till I see things done!...that's why because sometimes I behave like Goofy when dealing with simple tasks!!).

So I thought, "How can I do a clean job for my company without making foolish mistakes"?

The answer was "Create your own extension".

That's why I created url.enree.co (I love this domain name), a simple Url packing utility hosted on Heroku, written in NodeJS.


Why not creating a simple chrome extension to use this service?

Here you are Pack your link by url.enree.co.


Publishing a Chrome Extension on the store is really easy.
  1. Create your extension (start here if you don't know what to do, it's easy and fun)
  2. Go to the Chrome Store Developer dashboard: you have to pay 5$ to be able to publish your creations on the store, once in a lifetime! In few minutes you'll be allowed to publish extensions and apps.
  3. ZIP your local extension's folder and upload it: it seems that you cannot remove a product once uploaded (read more details here, but I'm not quite sure about it), but you can still unpublish to hide it.

See ya!

Tuesday, November 25, 2014

[Salesforce / Lightning] Loading scripts with RequireJS



UPDATE

Due to the introduction of the ltng:require, this post is no more a valid solution. Refer to the official Lightning documentation.

The following is a post that summarizes this blog post's solution (if you are not a TLDR; reader you will find there all my trials and errors).

Dreamforce 2014 came out with new awesome features on the Salesfoce platform: one of the most interesting has been the introduction of the new Lightning framework for fast development of reusable components.
In addition to the (still in pilot) Lightning App Builder (an amazing drag & drop tool for easy creation of apps), it's not hard to figure out how far this new technology will lead the Force.com platform.

The main reason you want to develop a new Lightning component is the fact that you can compose components like a puzzle making them communicating using events: read the official development guide for more details on how to build your first lightning component.

One of the things you'll be doing while developing new components, is using external libraries to give more and more features to your applications.
You'll face the following constraints:
  • You can only get external libraries loaded from a static resource
  • You cannot use the {!$Resource.resourceName} expression because we are not inside a VisualForce page, so you have to simply refer to "/resource/[resourceName]" in your <script> tags

When loading more than one external scripts, sometimes happens that the order of loading is not the expected one (even if you have inserted the script tags in the right order).

You could use RequireJS library to overcome this problem (being sure that he'll be responsible for loading libraries in the correct order).

But the question is: who is responsible to load RequireJS script?

Who will be executing the RequireJS loading code ONLY AFTER the library has been loaded?

Trying to get the right answer (see more details on the "fail" steps here and the community thread that brought me to the solution), I came to the following solution.

The solution is simple (to ease its understanding): you can improve it to add more features (e.g. style sheets loading) and to make a component out of it.

This is the main code (all the code has been packaged into this GitHub repository):

BlogRequireJSDinamic.app

<aura:application>
        <aura:handler event="forcelogic2:BlogRequireJSEvent" action="{!c.initJS}"/>
        <aura:registerEvent type="forcelogic2:BlogRequireJSEvent" name="requireJSEvent"/>
        <aura:handler name="init" value="{!this}" action="{!c.doInit}" />
        <div id="afterLoad">Old value</div>
    </aura:application>

BlogRequireJSDinamicController.app

({
    /*
        Sets up the RequireJS library (async load)
    */
    doInit : function(component, event, helper){
        
        if (typeof require !== "undefined") {
            var evt = $A.get("e.forcelogic2:BlogRequireJSEvent");
            evt.fire();
        } else {
            var head = document.getElementsByTagName('head')[0];
            var script = document.createElement('script');
            
            script.src = "/resource/RequireJS"; 
            script.type = 'text/javascript';
            script.key = "/resource/RequireJS"; 
            script.helper = this;
            script.id = "script_" + component.getGlobalId();
            var hlp = helper;
            script.onload = function scriptLoaded(){
                var evt = $A.get("e.forcelogic2:BlogRequireJSEvent");
                evt.fire();
            };
            head.appendChild(script);
        }
    },
    
    initJS : function(component, event, helper){
        require.config({
            paths: {
                "jquery": "/resource/BlogScripts/jquery.min.js?",
                "bootstrap": "/resource/BlogScripts/boostrap.min.js?"
            }
        });
        console.log("RequiresJS has been loaded? "+(require !== "undefined"));
        //loading libraries sequentially
        require(["jquery"], function($) {
            console.log("jQuery has been loaded? "+($ !== "undefined"));
            require(["bootstrap"], function(bootstrap) {
                console.log("bootstrap has been loaded? "+(bootstrap !== "undefined"));

                $A.run(function(){
                    //do whatever GUI initialization you want
                    //in the aura context
                    $("#afterLoad").html("VALUE CHANGED!!!");
                });
                
            });//require end
        });//require end
    }
})

This is what you'll get in the developer console of your browser:
RequiresJS has been loaded? true
    jQuery has been loaded? true
    bootstrap has been loaded? true 

And you will see "Old value" string replace with "VALUE CHANGED!!!" in the page body.

What has happened?

When the app loads (init event) the doInit function tries to understand if the RequireJS library has been loaded.
If so fires a BlogRequireJSEvent event.
If not yet loaded, dynamically creates a <script> tag with the path to RequireJS, binding an onload handler, which in fact will inform that the library has been loaded, using the same event.

The same app is also an handler for the BlogRequireJSEvent event trhough the initJS function: it will load sequentially jQuery and Bootstrap libraries: this way you are pretty sure libraries will be loaded in the correct order.

The next step is to make a component out of this app so you can use a RequireJS loader component in all your apps and make all your components handling the BlogRequireJSEvent event.