What’s New in Skuid?

(Acknowledging the cable-stayed bridge that spans the River Tan in southern France, Millau is pronounced ME-yew.)

Millau Q4 Release

Introducing Skuid Millau, the bridge to made-to-order business app solutions. This release puts the tools in your hands to design, create, and deploy exceptional user experiences with greater speed. Millau offers sample pages to jumpstart the creation of new apps, an in-app feedback form for your users to send valuable information about their experiences to app designers, offline mode for those times when your network may have stopped but your work has not, exciting new data sources for you to connect to your apps, and more.

Updates as of v11.0.2

undefined vs null: More friendly for old code!

In the Brooklyn Q2 update, Skuid changed a low-level, internal API used by several public APIs to return more specific results when used—returning undefined versus null when appropriate.

This can have pretty wide-ranging effects, so as of v11.0.2, we’re updating the most notable of the effected APIs to better accommodate existing code.

skuid.model.Model.getFieldValue() will now return null if the value of the field is one of the following:

  • undefined
  • null
  • An empty string

Note

If you have updated your code based on the advice listed in the Skuid v10 release notes, no worries! Your code will still work.

New Product Features—Skuid

  • Get started faster than ever with Skuid’s new startup experience. Open Skuid and click the logo to access the new Skuid Central, where you can create new pages, explore several sample pages with their own sample data source, and see the guides and tutorials that will get you off on the right foot.

  • A dodgy network connection won’t stop you from working with your Skuid built apps when you activate Offline Mode. When users are in offline mode, changes to records queue in the cache. Once the internet connection is restored, the cached changes sync with their data source. If Skuid detects a conflict while syncing between an online user’s changes and an offline user’s changes, Skuid provides conflict resolution options to the user.

  • Open up a feedback channel between app builders and users with Skuid’s new Feedback feature. Activate feedback to get input from end users about pages issues, required changes, and other concerns. Users access a Feedback popup to send text and images, while app administrators manage it all from the Feedback Manager.

  • Millau introduces the Action Sequences tab, which allows you to save—and name—sets of actions that can be reused throughout a Skuid page or automatically triggered by events. Use inputs to create flexible, reusable action scripts or to create a page that listens to other Skuid pages or components in your Salesforce Lightning app.

    Note

    The Labels tab has been moved to Page Properties to accommodate Action Sequences.

  • More data, more ways: We’ve added two new pre-configured data source types—Marketo and DocuSign—to make it easy to use these data sources with Skuid

  • You can now clone, copy, cut, and paste components in the App Composer! Copy your fully-configured tables into pop ups, or clone a series of Field Editors for use with different models.

  • The Action Framework has two new action types to help manage content in models:

    • Search Model let’s you search for a string without creating, setting, or activating a condition.
    • Instead of using Skuid’s traditional in-table sort feature, use the new Sort Model action type to create more flexible sort features for models wherever they are used.
  • Introducing Skuid component templates! These templates provide your “container” components with sets of components designed for specific configurations. Millau includes new pre-configured, selectable templates for the Deck component. We plan to enhance other components with this functionality in future releases.

Want more technical details about this release and other updates? See the Skuid Releases page.

Skuid with Lightning

Skuid Millau brings further improvements to Skuid’s power to extend Salesforce Lightning. Skuid already works like a “supercomponent” in Lightning Experience, replacing the need to write code for a custom Lightning component with a declaratively-built Skuid page. Millau expands Skuid’s presence within Salesforce Lightning by fixing bugs, streamlining performance, and bolstering Skuid’s feature set.

Skuid lets you ride the Salesforce cloud, like the Greek god Zeus, and hurl lightning bolts with perfect accuracy at your target metrics.

Skuid on Salesforce: This Is API v40

Moving forward, Skuid on Salesforce will be at or above the API v40 threshold, which means that LockerService is now enforced when using Skuid in Lightning Experience. No worries: we’ve been prepared since the Brooklyn Q2 Point Release.

If you are seeing issues within your Skuid deployment in Lightning Experience, ensure that your custom code meets LockerService guidelines.

Minor Updates

  • Need to speed up the user’s filtering or sorting experience? It’s now possible to set both filtering methods on filters and column sorting on Tables to be performed client-side instead of server side, which can be a time-saver for users who only need to filter (or sort) just the data they have loaded in the Skuid page.
  • New fields in the Google Calendar data source type let you indicate the location of the event, add an event status picklist, and allow users to invite others.
    • Bug fix: In Google Calendar data source type, the “all day” events field now works as expected.
  • Running pages on both Skuid Platform and Skuid on Salesforce? Our new $Platform merge variable can be used to provide information about which platform a Skuid page is running on.
  • Updates to the Navigation component allow you to add a custom label for a collapsed drop down navigation item that pulls in Salesforce apps, and include the current app as a selectable item in the drop down.
  • New formula functions allow for more precise text analysis:
    • CONTAINS_ANY determines if a string contains any of a list of provided parameters.
    • CONTAINS_ALL determines if a string contains all of the provided parameters.
    • CASE returns different results based on whether the parameter meets the specified criteria, meaning no more complicated chains of IF functions. This function also allows for optional default values to use if none of the provided values match.
  • We’ve made the following API updates:
  • Feel a little more at home with your Microsoft Dynamics data by setting your pages to use the Dynamics theme.

New Product Features—Skuid Platform

Want more technical details about this release and other updates? See the Skuid Releases page.

Heads Up!

Here are some changes that could affect the way your pages work when you update.

Skuid on Salesforce: CSS and Page Support Files

Previously CSS was not included within page support files—meaning styles included directly within Skuid pages may not work as intended within Lightning Experience. But as of Millau, any CSS styles included inline within Skuid pages will also be packaged in each page’s support file.

Image styles are now applied to the img element directly

In previous Skuid releases, any styles applied on the Image component were actually applied to the div element that surrounded the image as opposed to the img element itself. As of Millau all Image component styles are applied directly to the img HTML element. If your images no longer display as expected, check the styling of your Image components.

If you’re not familiar with HTML this may not sound like much. But the same Image components on existing pages may look different. For example, this the following component is configured exactly the same—with a width and height of 150px—but displays differently because of the way the styles are applied:

Pre-Millau

q42017RN-0

HTML behind the scenes [[]]

<div id="sk-1Pzyqj-165" data-rendered="true" class="sk-image-wrapper" style="width: 150px; height: 150px;">
  <img class="sm-image" alt="" src="<Skuid Logo URL>">
</div>

Millau

q42017RN-1

HTML behind the scenes [[]]

<div id="sk-1Pzyqj-165" data-rendered="true" class="sk-image-wrapper">
  <img class="sm-image" alt="" src="<Skuid Logo URL>" style="width: 150px; height: 150px;">
</div>

Skuid Chatter component and the skuid:page

We’ve updated Skuid’s Chatter to support client-side processed Salesforce models! This is especially helpful if you end up using offline mode, where all models are processed client-side.

However, if you deploy Skuid pages containing the Skuid Chatter component using the skuid:page Visualforce component, you’ll need to recreate Skuid’s Social Visualforce page.

Note

You must only do these steps once to ensure your pages work as expected.

  1. Navigate to Build > Develop > Visualforce Pages.
  2. Click into the Social Visualforce page in the skuid namespace.
  3. Copy the markup.
  4. Return to Build > Develop > Visualforce Pages.
  5. Click New.
  6. Label and name the new Visualforce page Social.
  7. Paste the copied markup.
  8. Click Save.

Server-side Models Cannot Depend on Client-Side Models for Conditions

While previous versions of Skuid allowed admins to set server-side model conditions to depend on UI-only models and other client-side processed models, this behavior was not supported and could have resulted in unexpected behaviors. As of the Millau release, doing this will now result in an error message.

To solve this issue, ensure that any models with conditions depending on a client-side model have the Process Model client-side property marked.

Salesforce Notes & Attachments versus Files

Per Salesforce Spring 17 release notes, in the near future, you’ll no longer be able to use the Notes and Attachments related list to attach files to records in Lightning Experience. Because of this, we recommend using the File Upload component’s new Content Document upload option for maximum compatibility.

When using the File Upload component with Lightning Experience, do not set the storage location to Attachment to Record, but instead use In Content Document (with Record Context), a new field that allows files to be uploaded and stored in the Content Document object, with a link to the Id of the record in context.

Note

While this shift is in Salesforce’s future, it’s smart to make this change now, so you (and your users) don’t get caught off-guard later.

Salesforce Record Types, Picklists, and JavaScript

Do …

  • you use JavaScript to dynamically create models?
  • you have record types in your Salesforce org?
  • you include picklist fields (in those models that you dynamically create)
  • your models create default rows?
  • you need to access those default rows?

Then heads up!

The creation of default rows in models with record type picklists is now asynchronous. That means if you need to access that default row within your snippets, you’ll need to use an asynchronous function call.

Note

The examples below assume the model being created has a record type picklist field.

Previously you could create the model and access its first row using:

1
2
var model = skuid.model.createModel('<all-of-your-model-xml>');
var row = model.getFirstRow();

But, now that the row is created asynchronously, you’ll need to update the code:

1
2
3
4
var model = new skuid.model.Model('<all-of-your-model-xml>');
model.once('initialized').then(function(){
  var row = model.getFirstRow();
})

If the model’s default row also contains default values based on the record type, you’ll need to use another asynchronous function call:

1
2
3
model.createRowAsync().then(function(row){
  // Any updates you'll be making to the row
});

undefined Resolves to null in UI-Only Formulas

Most UI-only formula users just need to know if a result exists or does not exist. But if you’re a JavaScript developer—or a philosopher—you know there are different types of non-existence when it comes to values/variables: undefined and null. And previously you would need to anticipate each one of these results in your UI-only formulas. No longer!

To make life simpler, Skuid UI-only formulas now always resolve undefined to null.

This means formulas can simply check for null instead of having to check for both. The undefined keyword will continue to function for backwards compatibility, but if you encounter any issues in especially complex formulas, change them to look for null instead.

Merge APIs Work More Consistently

If you’re a developer utilizing the utils.mergeAsTextInContext API, we’ve streamlined how this API handles both merges within its parameters and HTML alongside text.

Pre-Millau

Inconsistencies in the result based on whether or not there’s a merge variable:

Without a merge variable [[]]

1
2
3
utils.mergeAsTextInContext('<h1>Hello Bob!</h1>', { Name: 'Bob' })

> "<h1>Hello Bob!</h1>"

With a merge variable [[]]

1
2
3
utils.mergeAsTextInContext('<h1>Hello {{Name}}!</h1>', { Name: 'Bob' })

> "Hello Bob!"

If asText is true, then allowHTML was ignored regardless. HTML tags were stripped out and HTML characters were not escaped:

allowHTML is true [[]]

1
2
3
utils.mergeAsTextInContext('<h1>Hello > {{Name}} < </h1>', { Name: 'Bob' }, { allowHTML: true })

> "Hello > Bob < "

allowHTML is false [[]]

1
2
3
utils.mergeAsTextInContext('<h1>Hello > {{Name}} < </h1>', { Name: 'Bob' }, { allowHTML: false })

> "Hello > Bob < "

Millau

The result should now be consistent whether or not there is a merge variable:

Without a merge variable [[]]

1
2
3
utils.mergeAsTextInContext('<h1>Hello Bob!</h1>', { Name: 'Bob' })

> "<h1>Hello Bob!</h1>"

With a merge variable [[]]

1
2
3
utils.mergeAsTextInContext('<h1>Hello {{Name}}!</h1>', { Name: 'Bob' })

> "<h1>Hello Bob!</h1>"

HTML tags are no longer stripped out when asText is true and setting allowHTML to false will escape all HTML characters.

allowHTML is true [[]]

1
2
3
utils.mergeAsTextInContext('<h1>Hello > {{Name}} < </h1>', { Name: 'Bob' }, { allowHTML: true }) // allowHTML is true by default

> "<h1>Hello > Bob < </h1>"

allowHTML is false [[]]

1
2
3
utils.mergeAsTextInContext('<h1>Hello > {{Name}} < </h1>', { Name: 'Bob' }, { allowHTML: false })

> "&lt;h1&gt;Hello &gt; Bob &lt; &lt;/h1&gt;"

Mobile Builder Deprecation Status

As of the Millau release, the deprecated Mobile Builder is no longer accessible except under the following special circumstances:

  • App builders who have currently existing Mobile Builder pages will continue to have access to the Mobile Builder as long as those pages exist.
  • Unpacking a page pack that includes Mobile Builder pages will re-enable Mobile Builder access until those mobile pages are deleted.

Again, as the Mobile Builder is deprecated, use of Skuid’s App Composer is encouraged for all mobile design moving forward.

Copying and Pasting Between Pages Is Not Supported

With Skuid’s new copy and paste features, it can be tempting to copy and paste components from one Skuid page into another. This behavior is not supported. Doing so may cause unexpected behaviors, and results may vary.