I recently joined other Salesforce influencers in contributing to Mason Frank’s ‘Ask The Experts’ series, where I wrote about my ten best tips to become an amazing Salesforce Developer. Here’s a quick summary below and link to the full article, I hope you enjoy!
10 signs you’re an amazing Salesforce Developer
“Am I the best Salesforce Developer I can be?”
This is a question all Salesforce Developers should be asking themselves. If you said “Yes”, well… you don’t need to read this post as you may be in the “Olympus” of coders.
If your answer is “No”, welcome my friend, keep reading this post. I have some tips for you, based on my experiences, that may lead you to the right trail.
I’ve always felt like I’ve never achieved anything to the top level, and I guess this drove me to overcome my limits and achieve a lot in my personal and professional life.
If you are in the circle of developers that believe they can empower their skills day after day, you are using a mental process that I call “Continuous Self-Improvement” (CSI, isn’t it cool? I guess I’ve not invented anything, but I love giving names to stuff). I even call it the “John Snow syndrome”, because your student mentality means you’re a coder who feels like they “know nothing”.
Our week’s trailblazer is Claudio Marzorati, who will be listing some of his favorite Summer’19 Salesforce platform release.
Claudio is a Senior Salesforce Developer @ Sintegra s.r.l. (Milan). He worked with different retails that allowed him to increase his technical background on several aspects. From analysis, to development, to the direct relationship with the customer, nothing is left to chance. Other passions are running and travels!
Summer 19′ hass finally arrived and in our org all changes are going to be applied.
Here I summarize some of the most important features that can impact your org.
Lightning URL parameters have been namespaced
Finally they have been release the funtiality that forces URL parameters to be namespaced. So if you add ?foo=bar to the URL, it will get auto-stripped. But if you add ?c__foo=bar to the URL, it will persist.
Keep Record Context When Switching from Salesforce Classic to Lightning Experience
When you switch from Salesforce Classic to Lightning Experience, you land on the same page in Lightning Experience, if it exists. If the same page doesn’t exist in Lightning Experience, you are redirected to your default landing page, which is determined by the org default or your customizations.
Choose from Two Record View Options
Now you have two record page view default options. Choose between the current view—now called Grouped view—and the new Full view. In Setup, enter Record Page Settings in the Quick Find box, and select Record Page Settings.
Search Picklist Fields in List Views
You don’t have to manually pick through your list views to find the picklist values you’re looking for. List view search now includes picklists in your query results. Dependent picklists and picklists with translated values aren’t searchable.
Continuation
Finally we can use the Continuation pattern from an Aura component or a Lightning web component. Continuation class in Apex are used to make a long-running request to an external web service Process the response in a callback method. An asynchronous callout made with a continuation doesn’t count toward the Apex limit of 10 synchronous requests that last longer than five seconds. Therefore, you can make more long-running callouts and integrate your component with a complex back-end API. In Lightning-Web-Component now we can use @salesforce/apexContinuation in order to provides access to an Apex method that use the Continuation.
Aura Components
There a lot of improvements expecially in LWC and below I report the most used in my develop.
lightning:recordEditForm
– density option
Sets the arrangement style of fields and labels in the form. Accepted values are compact, comfy, and auto. The default is auto, which lets the component dynamically set the density according to the user’s Display Density setting and the width of the form.
– onerror handler event changed
You can now return the error details when a required field is missing using event.getParam("output").fieldErrors. To display the error message automatically on the form, include lightning:messages immediately before or after the lightning:inputField components.
lightning:inputField
– reset function added
Resets the form fields to their initial values.
There are few deprecated component in force and ui: force:recordEdit, force:recordView, ui:input (all types), ui:button, ui:menu (all types), ui:output (all types), ui:spinner.
Web Component
Salesforce is spending a lot of time and resources in improving this new components. There are a lot of new functionalities added and below I report the most significant.
lightning-input
– autocomplete function added
Controls autofilling of the field. This attribute is supported for email, search, tel, text, and url input types.
– date-style (or time-style) function added
The display style of the date when type='date/time' or type='datetime'. Valid values are short, medium, and long. The default value is medium. The format of each style is specific to the locale. This attribute has no effect on mobile devices.
lightning-input-field
– reset function added
Resets the form fields to their initial values.
lightning-record-edit-form
– density option
Sets the arrangement style of fields and labels in the form. Accepted values are compact, comfy, and auto. The default is auto, which lets the component dynamically set the density according to the user’s Display Density setting and the width of the form.
– onerror handler event changed
You can now return the error details when a required field is missing using event.getParam("output").fieldErrors. To display the error message automatically on the form, include lightning:messages immediately before or after the lightning:inputField components.
Minor UX Improvement
They have changed the UX provided. Some example for recent records and for the related list are below reported.
One of the easiest Javascript libraries for encryption I usually adopt is CryptoJS, quick setup and good support for most algorithms.
But I got an headache trying to make it talk with Salesforce, this was due to my relatively low encryption-topics training but also to a specific way Salesforce handles encryption.
I was surprised that none has ever had the same need before.
I’m not going to explain how I came up to this solution (one of the reasons is that I already forgot it…as I always say, my brain is a cool CPU but with a low amount of storage), but I’ll just give you the way I solved encrypted data exchange between a Javascript script (whether it is client or server side) and Salesforce.
In Apex encrypting and decrypting a string is quite easy:
These are all industry standard Advanced Encryption Standard (AES) algorithms with different size keys. They use cipher block chaining (CBC) and PKCS5 padding.
Salesforce HELP
PKCS5 padding is a subset of the more general PKCS7, that is supported by CryptJS, so it still works.
The only thing that is not clearly stated here (at least for my low storage brain) is that this method uses an Initialization Vector (IV, that is used together with the private key to generate the proper encryption iterations) which has a fixed 16 Bytes length.
Also, the IV is included within the encrypted string: this is the key point.
To encrypt and decrypt using the following method the CryptoJS must be aware of the first 16 Bytes of the IV and append it to (if we are encrypting from JS to Salesforce) or extract it from (if we are decrypting in JS from a Salesforce encrypted string) the encrypted string.
This is what I came up with after a bit of research (you have to deal with binary data when encrypting, that’s why we use Base64 to exchange keys and encrypted strings).
//from https://gist.github.com/darmie/e39373ee0a0f62715f3d2381bc1f0974
var base64ToArrayBuffer = function(base64) {
var binary_string = atob(base64);
var len = binary_string.length;
var bytes = new Uint8Array( len );
for (var i = 0; i < len; i++) {
bytes[i] = binary_string.charCodeAt(i);
}
return bytes.buffer;
};
//from //https://gist.github.com/72lions/4528834
var appendBuffer: function(buffer1, buffer2) {
var tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength);
tmp.set(new Uint8Array(buffer1), 0);
tmp.set(new Uint8Array(buffer2), buffer1.byteLength);
return tmp.buffer;
};
//from //https://stackoverflow.com/questions/9267899/arraybuffer-to-base64-encoded-string
var arrayBufferToBase64 = function( arrayBuffer ) {
return btoa(
new Uint8Array(arrayBuffer)
.reduce(function(data, byte){
return data + String.fromCharCode(byte)
},
'')
);
},
//Encrypts the message with the given secret (Base64 encoded)
var encryptForSalesforce = function(msg, base64Secret){
var iv = CryptoJS.lib.WordArray.random(16);
var aes_options = {
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
iv: iv
};
var encryptionObj = CryptoJS.AES.encrypt(
msg,
CryptoJS.enc.Base64.parse(base64Secret),
aes_options);
//created a unique base64 string with "IV+EncryptedString"
var encryptedBuffer = base64ToArrayBuffer(encryptionObj.toString());
var ivBuffer = base64ToArrayBuffer((encryptionObj.iv.toString(CryptoJS.enc.Base64)));
var finalBuffer = appendBuffer(ivBuffer, encryptedBuffer);
return arrayBufferToBase64(finalBuffer);
};
//Decrypts the string with the given secret (both params are Base64 encoded)
var decryptFromSalesforce = function(encryptedBase64, base64Secret){
//gets the IV from the encrypted string
var arrayBuffer = base64ToArrayBuffer(encryptedBase64);
var iv = CryptoJS.enc.Base64.parse(arrayBufferToBase64(arrayBuffer.slice(0,16)));
var encryptedStr = arrayBufferToBase64(arrayBuffer.slice(16, arrayBuffer.byteLength));
var aes_options = {
iv: iv,
mode: CryptoJS.mode.CBC
};
var decryptObj = CryptoJS.AES.decrypt(
encryptedStr,
CryptoJS.enc.Base64.parse(base64Secret),
aes_options
);
return decryptObj.toString(CryptoJS.enc.Utf8);
};
By sharing the Base64 of the Salesforce generated secret (using the method Crypto.generateAesKey(256) ) between your JS client and Salesforce, you can store and exchange encrypted data with a blink of an eye.
Let’s talk about a great new addition of the Spring’19 platform release to the Salesforce Dev world, the Lightning Web Components framework, with our guest blogger Priscilla Sharon, Salesforce Business Solution Executive for DemandBlue.
DemandBlue is in the business of helping its customers maximize their Salesforce investment through predictable outcomes. As we thrive in an era of cloud-based Infrastructure, Platform and Software services, DemandBlue has pioneered “Service-as-a-Service” through a value-based On Demand Service model that drives bottom-line results. They foster innovation through “Continuous Engagement and On Demand Execution” that offers their customers Speed, Value and Success to achieve their current and future business objectives.
Salesforce DX Setup – Since inception, one of Salesforce’s core philosophies and the Big Idea has been to make building easy. Software should not be complex to install, set up, or customize. In fact, you shouldn’t have to even install software – it should be available to you at the click of a button – This declarative approach of Salesforce brought an end to complex and traditional methods of software development that even non-tech executives including business analysts and managers could slickly build line-of-business applications in a few clicks. However, while Salesforce was democratizing application development through clicks-not-code approach and ushering in the era of citizen programmer, there were other players who were strengthening their appeal to the traditional developer. With nuanced business requirements, modeling complex domains require more flexibility than clicks-not-code affords. Traditional methods of development weren’t dead after all.
As a result, Salesforce’s marketing and development efforts wanted to cater to the traditional developer with the introduction of Salesforce DX, a revolutionary product in the Salesforce App Cloud that allows users to develop and manage Salesforce apps throughout the entire platform in a more direct and efficient way. Used primarily by developers, Salesforce DX setup enables users to have true version control that allows them to have a better control over collaboration, auditing, disaster control and more.
Take a
deeper dive into the comprehensive blog that gives you in-depth insights on how
you can enable Salesforce DX environment and truly maximize its unique
benefits.
Your 12 Step Salesforce DX Setup Guide
1. Set up your project
Salesforce DX introduces a new project structure for your org’s metadata (code and configuration), your org templates, your sample data, and all your team’s tests. Store these items in a version control system (VCS) to bring consistency to your team’s development processes. Retrieve the contents of your team’s repository when you’re ready to develop a new feature.
2. Salesforce DX Setup – Authorize the Developer Hub org for the project
During Salesforce DX setup, the Dev Hub org
enables you to create, delete, and manage your Salesforce scratch orgs. After
you set up your project on your local machine, you authorize with the Dev Hub
org before you create a scratch org.
For this, you need to login to Dev/Sandbox Org from CLI
Run the force:auth:web:login CLI command on a directory where code for deploy to sfdx will be available.
NOTE: Login must be a valid login to your Dev/Sandbox Org and with Admin permissions.
3. Configure your local project
The project configuration file sfdx-project.json indicates that the directory is a Salesforce DX setup project. The configuration file contains project information and facilitates the authentication of scratch orgs and the creation of second-generation packages. It also tells the Salesforce CLI where to put files when syncing between the project and scratch org.
4. Configure your local project
After
you create the scratch org definition
file, you can easily spin up a scratch org and open it directly from the
command line.
a) Create the scratch org
Create a scratch org for development using a scratch org definition file. The scratch org definition defines the org edition, features, org preferences, and some other options.
Specify scratch org definition values on the command line using key=value pairs
Create a scratch org with an alias
Create a scratch org for user acceptance testing or to test installations of packages
Indicate that this scratch org is the default
Specify the scratch org’s duration, which indicates when the scratch org expires (in days)
b) Open the org
To open the scratch org: sfdx force:org:open -u <username/alias>
To open the scratch org in Lightning Experience or open a Visualforce page, use the –path parameter: sfdx force:org:open –path lightning
c) Set default user
Copy the username and enter the
following command to set the defaultusername:
sfdx force:config:set defaultusername={SET THIS TO NEW SCRATCH ORG’S USERNAME FROM THE ABOVE COMMAND}
d) Display All Orgs
Run the following command to confirm the
default Dev Hub [marked with (D)] and Active Scratch Org [marked with (U)]:
sfdx force:org:list --all
5. Push the source from your project to the scratch org
To push changed source to your default scratch org:
sfdx force:source:push
To push changed source to a scratch org that’s not the default, you can indicate it by its username or alias:
Selecting Files to Ignore During Push. It’s likely that you have some files that you don’t want to sync between the project and scratch org. You can have the push command ignore the files you indicate in .forceignore.
If Push Detects Warnings. If conflicts have been detected and you want to override them, here’s how you use the power of the force (overwrite) to push the source to a scratch org.
sfdx force:source:push –forceoverwrite
6. Salesforce DX Setup – Develop the app
a. Create Source Files from the CLI
To add source files from the Salesforce CLI, make sure that you are working in an appropriate directory.
7. Pull the source to keep your project and scratch org in sync
After
you do an initial push, Salesforce DX tracks the changes between your local
file system and your scratch org. If you change your scratch org, you usually
want to pull those changes to your local project to keep both in sync.
During
development, you change files locally in your file system and change the
scratch org using the builders and editors that Salesforce supplies. Usually,
these changes don’t cause a conflict and involve unique files.
By
default, only changed source is synced back to your project.
To pull changed source from the scratch org to the project:
sfdx force:source:pull
To pull source to the project if a conflict has been detected (read more):
sfdx force:source:pull –forceoverwrite
8. Salesforce DX Setup – Run tests
When
you’re ready to test changes to your Salesforce app source code, you can run
Apex tests from the Salesforce DX CLI. Apex tests are run in your scratch org.
You can also execute the CLI command for running Apex tests (force:apex:test:run) from within third-party continuous integration tools, such as Jenkins.
9. Export The Package.xml
Export package.xml file into the temporary directory. Type the commands below in the root folder of your Salesforce DX project:
11. Track Changes Between the Project and Scratch Org
To view the status of local or remote files:
sfdx force:source:status
12. Salesforce DX Setup – Sync up
Sync the local version with the version deployed to Scratch Org for every change and test the changes on the Scratch Org by repeating the above steps. Once the testing is completed, we need to convert the source from Salesforce DX format to the Metadata API format. This is done by running the following command:
Copy the modified metadata files from this output location
to the actual source location where the metadata files are downloaded from
Dev/Sandbox Org to deploy the files to the server.
For this new Back To Basics post, welcome Akashdeep Arora, Salesforce Evangelist/Consultant at HyTechPro. He started Salesforce journey in 2015. 3X Salesforce Certified Professional, 4X Trailhead Ranger, 5X Trailhead Academy Certified.Founder of #BeASalesforceChamp campaign.
Well, Astro turned 5 recently. So, what’s better than writing something related to Astro. As we all know, when you need a guide, Astro’s there for you.
#Astroturns5 #AppyBirthday #BeASalesforceChamp
Albeit, it sounds easy but still many Developers/Admins gets stuck when they want to make a field required based on one value selected from picklist field. Now, you must be thinking the way to achieve it.
We have different ways to make a field required:
Required Checkbox while field creation
Page Layout
Validation Rule
Using custom code (Visualforce Page, Lightning component, Apex Trigger to say a few)
But our scenario is little bit different as we want to make it required based on criteria, i.e. selected picklist value must be Astro.
Yay, let’s begin the fun without any delay.
The easiest way to achieve it is to use a validation rule. We have two fields:
Salesforce Character (a picklist field with values Appy, Astro, Codey, Cloudy and Einstein)
Astro Mom (a text field).
Here, we go.
After saving the rule, it will look like below:
Well, it’s time for testing. Testing is very necessary for anything. (Wink)
Let’s create a record without giving value in the Astro Mom text field and Select “Astro” from Salesforce Character picklist field like below:
As soon as you click on the Save button, it will give you an error “Please enter Astro Mom“.
Wohoooo, our validation rule is perfect it seems. Now, let’s provide the name of Astro Mom in the text field and click on Save button.
Hurrayyy, the record is saved this time. This is how you can make any field required based on selection of a picklist field value.
Ivano Guerini is a Salesforce Senior Developer at Webresults (Engineering Group) since 2015. He started my career on Salesforce during his university studies and based his final thesis on it. He’s passionate about technology and development, in his spare time he enjoys developing applications mainly on Node.js.
The <datalist> element is a new tag available in the HTML5. This element can be used to create native autocomplete dropdowns without using complex JS and DOM manipulation for data filtering.
As you may have experienced, autocomplete picklist is a usefull component commonly used in forms to facilitate users in finding the correct value in case of very large lists of values.
In this article post, you’re going to learn how to use the datalist element to create a autocomplete dropdowns as Lightning Web Component.
If we try to execute this component, we will see that it does not work as we would expect. This is because the link between the input and the datalit is managed through the Id attribute. But as Salesforce reminds us:
The IDs that you define in HTML templates may be transformed into globally unique values when the template is rendered. If you use an ID selector in JavaScript, it won’t match the transformed ID.
To overcome this problem we can take advantage of a few lines of JS code, hooking up to the rerenderCallback. Then in the Javascript controller we write the following function:
renderedCallback() {
let listId = this.template.querySelector('datalist').id;
this.template.querySelector("input").setAttribute("list", listId);
}
This code simply searches for our Datalist element and retrieves the ID generated by Salesforce, and consequently updates the input list attribute with the new Value.
Again the rendered callback can run a lot of times, but our code must be executed only once. To do it we can use a private attribute to know if the renderedCallback has been already executed:
initialized = false;
renderedCallback() {
if (this.initialized) {
return;
}
this.initialized = true;
let listId = this.template.querySelector('datalist').id;
this.template.querySelector("input").setAttribute("list", listId);
}
Now our LWC component will work as autocomplete dropdown.
Let’s evolve it a bit, using dinamic options and decorating it with a label ad other attributes.
The Environment is the system (programming language or application) that hosts Dadela’s components and capabilities, sets the execution limitations and defines the integration details for sources and destinations
A component is a language element. There are various components: attributes, variables, lists, entity definitions, templates and operations
A repository is a physical (e.g. a file) or a virtual (e.g. a database record) storage for the components
A library is a special repository, containing templates and lists
A template is a blueprint for creating records of an entity
An entity is a database table or a matrix. It can be a Salesforce SObject, an Oracle table, an Excel worksheet, etc
An operation is a process that creates/inserts records or exports records in text format (JSON) or CSV)
A source is a one-way integration between an external database and the Environment for retrieving records
A destination has the opposite direction (from the Environment to an external entity for inserting/exporting records
Lists play a key role in Dadela. A list is something like (item1, item2, item3), using a comma to separate the list items. In fact, all repository components can be considered as list items. Some examples:
number x: 100, # a numerical variable list myList: (100, 200, 300), # a list template BigAccounts: ( ... ), # a template entity Account: ( ... ), # an entity definition
Lists may contain other lists or variables. Variables are referenced using @ and lists with !
number myVar1: 100, number myVar2: 1 + myVar1, # myVar2 = 101 list myList1: (one, two, three), string five: five, # @five = "five" list myList2: (!myList1, four, @five), # myList2 = {one, two, three, four, five}
Of course, comments are inserted with #.
We don’t have the space to go deeper, but you’ve got the idea: the main usage of variables is to assign the same value to different components, facilitating the construction of entity definitions.
Create a template
The best way to understand a new language is “by example”. So, let’s suppose I am a business user trying to create and insert records for Opportunities, in order to prepare data for User Acceptance Testing (UAT). In my Environment I’ll create a new repository (a library), with the name “SalesTemplates” and a template in the library for the “Opportunity” entity.
start the definition of a template called “BigOpportunities” and execute the following steps for each generated record
Name: copy field(AccountId) from(Name),
for the values of the Opportunity field “Name” find the Account record which is related to the lookup Opportunity field “AccountId” (the AccountId field stores the ID of a related Account record)get the value of the (Account) field “Description” from this record
Name: static value(" - "),
for the values of the Opportunity field “Name”add the string ” – ” after the previous value
Name: serial type(number) from(1) step(1) scale(0) format(000),
for the values of the Opportunity field “Name”get serial numbers starting from 1, adding 1, with rounding to 0 decimal pointsformat the result like 001, 002, 003, …add the result after the previous value
Amount: random type(number) from(1M) to(10M) scale(-3),
for the values of the Opportunity field “Amount” get random numbers, with minimum number 1,000,000, with maximum number 10,000,000, with rounding to 1,000
StageName: random type(picklist) except(Closed Won, losed Lost),
for the values of the Opportunity field “StageName” get any value from the picklist values of this field, except from “Closed Won” and “Closed Lost”
)
ends the field definitions of this template
Field definitions
Dadela has many field definitions, in 4 types (commands):
copy
These definitions copy the value of another field or the value of a field from a related (lookup) record
static
Static definitions just display a string, number, date/datetime or boolean value
serial
The serial definitions create serial values for
numbers, dates, datetimes and lists
random
The random definitions create random values for
numbers, booleans and strings, dates and datetimes, lists and picklists, lookup fields, emails, phone numbers, URLs, addresses (street, postal code, city, province, country), first and last names, and text sentences
Create the entity definition
Now, let’s continue our example. In our Environment, we create a new repository, with the name “MyEntities”.
Repository: MyEntities
language: French, locality: France (North Europe, Europe, EU),
Rating: random type(picklist) except(Hot), Phone: random type(phone) format("(30) 210 dD-00-DD"), Industry: random type(picklist), Type: random type(list) value(Prospect, Customer - Direct, Customer - Channel),
# addresses ShippingStreet: random type(street) group(shipping), ShippingPostalCode: random type(postalcode) group(shipping), ShippingCity: random type(city) group(shipping), ShippingState: random type(state) group(shipping), ShippingCountry: random type(country) group(shipping) ),
the default language of names (first/last) and addresses in this repository will be “French”
locality: France (North Europe, Europe, EU),
the default geographic area (locality) in this repository will be “France”, which will be a member of other localities (“North Europe”, “Europe” and “EU”)
entity Account: ( ... ),
set the field definitions for accounts with the default number of records to be 100 with random values for the fields Rating, Phone, Industry and Type with random “real” addresses from France, in French
use the field definitions from template “BigOpportunities” in repository “SalesTemplates”
virtual MyField: random type(list) value(Closed Won, Closed Lost),
define a “virtual” field: a virtual field is like a variable
StageName: copy from(MyField)
get the value of the virtual field (we used this for demonstration purposes – in a real situation, we use more than one virtual fields to construct a field definition)
Note that the definition for the field “Amount” will be the same as the definition in the template (this is the purpose of a template, after all).Of course, we could have defined a list for the stages inside the entity definition, or it could be a list in the repository or in a library, e.g.
entity Opportunity: ( list stages: (Closed Won, Closed Lost), ... StageName: random type(list) value(!stages) )
Operations
The next step is to generate and store our data.
insert
If we want to insert the records into a “database”:
We configure a destination on our Environment. This destination could be a Salesforce org, or a SQL Server database.We use an insert operation:
The (optional) group parameter assigns a “tag” to the inserted records. This grouping is very helpful when we use the inserted records for further processing.
create
Another solution could be the create operation:
create MyBigOpportunities: (group(MyGroupA)),
Now we just generate the opportunity records and we can insert or export them later.
No magic here! The Environment will export our opportunities in JSON format.
Conclusion
We had a very short introduction to the syntax and capabilities of Dadela. If you are interested to learn more, you can find all the details on the GitHub project.
Closing this article, I’d like to remind that the language specifications are open for discussion and contribution to the further development and application of the language.
More then 3 months from the last Reindeer Release say hello to the ORGanizer for Salesforce Giraffe Release (0.6.8.4).
Why a Giraffe, you ask?
Like a Giraffe points its head up to the sky, the Giraffe Release points toward release 1.0, when we’ll finally go out of beta, closing an almost 3 years old path since its first release 0.1 in September 2016.
I’ve worked a lot on stability and bug fixing in these months, reviewing tens of issues and suggestions, provided by my beloved ORGanusers who support my day by day work.
A brand new sponsor
It’s also a pleasure to introduce you to our next sponsor NativeVideo for the next months, starting from the current release!
Founded in London in 2018, NativeVideo is on a mission to bring businesses and people closer together with the power of Video.
NativeVideo is the platform that, once installed from the AppExchange, enables video recording and browsing as a native functionality inside Salesforce.
The company has already released two “extension packages” that customise the solution to 2 specific use cases:
LeadGenVideo demand generation / deal nurturing thanks to video messages that include both classic webcam video recording and screen recording
TalentVideo designed for those companies that use Salesforce for their recruitment and adds video interviews to the process, with a very well designed workflow and collaboration features.
NativeVideo customers have customised the NativeVideo platform and the use of Video to their needs on other use cases, like Service – screen recording sent by the service representative to answer questions and solve bugs, CPQ – a walkthrough screen recording video where the offer is explained when it is sent to the customer, Customer feedback / testimonial – inviting customers to answer a few questions on video to provide feedback on the service and results they are receiving, and many more.
Jump to NativeVideo landing page to say hello and thank them for helping the ORGanizer to keep the hard work going!
What’s new with the Giraffe?
First we have new consolidated limits for logins storage:
Approaching to release 1.0 the number of logins that can be stored with the free edition of the ORGanizer will gradually decrease. The number of logins will be limited in the free edition but all the other features will always be kept free.
Pro version can be purchased from the Chrome Web Store and now using Promo Codes (only available on Chrome version as of now):
A promo code is strictly related to the user email address and has an expiration date, and conveys the same enhanced limits of the Pro version in-app purchase.
Why a promo code?
To allow companies to mass purchase ORGanizer licenses or for promotions or free trials.
Know your email address: needed to get your email address for Promo Code verification (your email address is never sent to anyone but only used to validate your codes, if any)
Read and change data on a number of websites:
force.com, salesforce.com, visualforce.com, documentforce.com, salesforce-communities.com: main Salesforce domains
organizer-api.enree.co: Promo Code verification endpoint. This endpoint is called only after Promo code validation (if any)
And more and more enhancements and bug fixes
Read the change log for the whole list of what’s inside this new release, and see you in the next release!
This blog has been verified by Rise: Rb4a7093bc3979124c781aae186805e25
Let’s talk about a great new addition of the Spring’19 platform release to the Salesforce Dev world, the Lightning Web Components framework, with our guest blogger Priscilla Sharon, Salesforce Business Solution Executive for DemandBlue.
DemandBlue is in the business of helping its customers maximize their Salesforce investment through predictable outcomes. As we thrive in an era of cloud-based Infrastructure, Platform and Software services, DemandBlue has pioneered “Service-as-a-Service” through a value-based On Demand Service model that drives bottom-line results. They foster innovation through “Continuous Engagement and On Demand Execution” that offers their customers Speed, Value and Success to achieve their current and future business objectives.
Salesforce launched Lightning Web Components as part of Spring ’19 pre-release to enable a
quicker and easier way to program applications on the Salesforce Lightning
platform. It engages modern Javascript innovations such as web components,
custom elements, shadow DOM and more. Lightning Web
Components is the Salesforce implementation of Lightweight frameworks built as
per the web standards. It provides specialized salesforce services in addition to the
core stack, such as Base Lightning Components, Lightning Data Service, User
Interface API, etc.
Read on to discover how the Lightning Web Components fuses Web components programming model with Salesforce metadata and services to deliver unparalleled performance and productivity.
With Lightning Web Components, we are giving developers a standards-driven JavaScript model for building enterprise apps on Lightning. Every time we release a new platform capability we see an acceleration of innovation in our 150,000 customer base, and we are excited to see what our community of developers will do with Lightning Web Components.
Mike Rosenbaum, EVP of Product, Salesforce
Why Lightning Web Components
Lightning Web Components is like a newer version of Lightning Components with additional features.
Knowledge Domain – Developers who know Web Components are familiar with Salesforce Lightning Web Components out-of-the-box. Aura is proprietary, so the better you know the web standards, the better you’ll have of skills that can be used outside Salesforce.
Better Execution – Lightning Web Components leverages built-in browser security features from Web Components standards, which reduces the level of custom coding, which means they run faster and are more consistent in how they ensure security. Moreover, events have a limited scope, so there is lesser processing required handling events.
New Security Features – It gives better CSS isolation, DOM isolation, script isolation and limited event scope that facilitate a more consistent component design.
ES6+ – We have a better support for ES6 and ES7 that is not available in Aura. This enables you to do more with less coding. This also transpires code to work in IE 11 and other browsers which were not supported earlier.
More Consistent Data Binding – The not so user-friendly two-way data binding has been eliminated. This pushes developers to coordinate the way in which data moves between components. It also means that data binding will work as expected, without any unforeseen problems from Aura.
Mixins – You can even import accessible methods from other components and import specific Apex methods from multiple classes. Moreover, the Apex methods can be cached for improved performance.
What Lightning Web Components means for Developers and Customers
Cutting-Edge Advantages of Lightning Web Components
Boosted Performance –
Developing Lightning Web Components does not involve complex abstractions to
run on the browser, providing better performance to end users.
Ease of Use – Post
development, the admins can deploy Lightning Web components with just clicks,
not code to the applications.
Standardized – Salesforce Lightning Web Components is built on ES6+ that provides developers with modern and advanced JavaScript features.
How to create a Lightning Web Components framework?
LWC (Lightning Web Components) cannot be created directly from the developer console. You need to set up Salesforce DX to create a Lightning component. After the SFDX setup, you need to do a few more things:
Get your Salesforce DX plugin updated with the latest release (Spring’19). Run the command below in your terminal or command prompt.
Command:
sfdx update
Once you finish this process, follow the trailhead link to set up the basic project and create a basic Lightning Web Component
Transition from Aura Components to Lightning Web Components
Developers using Aura framework to build lightning components can continue to work on it as the Aura components will continue to function like before. However, the new components can be created using Aura or the Lightning Web Component framework. For future developments, it is best if you use the Lightning Web Components.
Lightning Web Components Availability
Lightning Web Components are available for users since February 2019 in Enterprise, Unlimited, Performance and Developer editions.
Few days ago I was thinking about optimizing the use of constants (usually of String type) inside projects to avoid proliferation of public static final String declarations on various classes (with a limited control over duplicates) but giving at the same time developers a way to increase readability of constants in their code.
The reason for this post is that I want to know your opinion on this strategy, that on my eyes appear elegant and clear but may bring some drawbacks.
public class Constants{
private static ObjectName_Constants objectNameConstants;
public static ObjectName_Constants ObjectName{
get {
if(objectNameConstants == null){
objectNameConstants = new ObjectName_Constants();
}
return objectNameConstants;
}
}
public class ObjectName_Constants{
public String CustomField_AValue { get { return 'aValue'; } }
public String RecordType_ADevName { get { return 'aDevName'; } }
}
}