Sommer '18 - viele kleine, gute Dinge und ein neuer Besen

Gaps und Besen

We got gaps“, war ein markanter Satz, der auf der TrailheadX Keynote zu hören war. Wade Wagner, Senior Vice President Product Management bei Salesforce, meinte vor allem die Dinge auf der Platform, die man nur im Browser durch Klicken einstellen aber sonst überhaupt nicht anfassen kann. Die Liste der neuen und veränderten Standard Objekte hat sich im Vergleich zu den letzten Releases etwas vergrößert, was auch für die Metadata API und Change Set Bestandteile gilt. Keine Überraschungen dabei, das große Aufräumen kommt wohl erst noch - und dabei können wir zuschauen:

Ein neuer Report unter yourOrgURL/mdcoverage/report.jsp verrät, was aktuell schon abgedeckt ist oder eben noch nicht. Bereits heute schon ist das Problem aus der Welt, daß Entwickler auch vollen Zugriff auf Daten brauchten bzw. System Administratoren sein mußten, um Metadatan wie Apex Klassen verändern zu dürfen. Das ist jetzt Geschichte. DX macht weiter Fortschritte in die richtige Richtung. An selektivem Push / Pull wird ebenfalls gearbeitet.

Daß ein neuer Besen gaps kehrt, merkt man an kleinteiligen Debug Log Updates, die sicher das Erhöhen der Limits 2 auf 5 MB Log Size erklären. Mit dabei sind auch wesentlich bessere Logs für Flows. Beispiel gefällig? Flow Interviews, die nicht bulkified laufen können, werden klar markiert. Das alles ist Grundlage für eigenen, neuen Debug Modus für Flows.

Auch fürs Debuggen in LEX gibt es gute Nachrichten: Egal ob Locker Service an oder aus, es werden wieder menschlich verständliche Ausgaben produziert.

Das Sahnehäubchen auf den neuen Features: Ein Replay Debugger für VS Code ist für den Sommer als Beta versprochen. Auch dieser wird von größeren Logs profitieren.

Als nächstes empfiehlt Einstein

Eine spannende Sache scheint der Einstein Next Best Action Pilot zu sein, der von allerhand konfigurierbaren Regeln und Daten-Kenntnis getrieben, dem Nutzer (auch vorstellbar als Endkunde in einer Community) einen oder mehrere plausible nächste Schritte anzeigt - je nachdem, wo er sich befindet. Jeder Vorschlag öffnet einen hinterlegten Flow.

Kontext-abhängige Record-Actions quasi.

Das habe ich mir und andere schon lange gewünscht und auch daran gebastelt. Schade, daß das nur mit Einstein geht. Denn weniger-smart gefilterte Actions, schnöde Picklist Filter beispielsweise, wären für viele Usecases völlig ausreichend und ohne kostenaufwendigem Data Science möglich. Aber vielleicht kommt das noch.

It's the little things

Wenn ich es benennen müßte, haben Flows neben und zusammen mit den Updates im Bereich Debugging die reifesten Updates erhalten - das ist das zweite Release in Folge. Letztes mal waren es Lightning Components und Flows, die mich begeistert haben. Diesmal geht es um den Bereich Bulikfication: Das sowohl im Sinne von mehreren Records als auch mehreren Flow Interviews, die nun klüger zu einzelnen Transaktionen gebündelt werden und damit wesentlich besser mit allen möglichen Limits umgehen können. Details weiter unten. Spätestens Spring 2019 soll der neue Flow Builder fertig sein, denn da verabschiedet sich Salesforce offiziell von der Flash Technologie.

Der kontinuierliche Kampf bekannte Features in LEX zu integrieren, ist weitergegangen. Product Schedules, Case Comments und Topics (yay!) sind in diesem Release in LEX zu finden. Außerdem war auch genug Platz für sinnvolle Usability Updates, die allen zu Gute kommen: ListViews, Emails, Events, Tasks und der Kalendar haben LEX eigene Verbesserungen erhalten, die Effizienz steigern.

Spannend fand ich auch Authentication and Identity, vieles davon im Sommer '18 erst in Beta. Darunter weitere Funktionen für das Mobile Device Management oder ApexTrigger bei User Logout und besseres Reporting über Identitätschecks. Bisher hatten es interne Nutzer/innen nicht so einfach wie externe beim Login in eine Community, das läßt sich nun voneinander trennen - gerade rechtzeitig für Passwordless Community Login.

Lieblingsfeatures

  • Packaging2 - alles ist besser als ChangeSets.
  • Custom Metdatatypes in Formeln für Validierungen (Formeln im nächsten Release) können über eine neue globale Variable abgefragt werden. Format: $CustomMetadata.type.record.field. Hier die Overview mit bedingt hilfreichem Animationsschnipsel.
  • Muß ich switch erwähnen?
    switch on sobject {
     when Account a {
         System.debug('account ' + a);
     }
     when Contact c {
         System.debug('contact ' + c);
     }
     when null {
         System.debug('null');
     }
     when else {
         System.debug('default');
     }
    }
    
  • Es wird ja langsam mit Berichten in Lightning Experience. Joined Reports Beta - Achtung, hat noch viele Einschränkungen - auch auf API Ebene. Vielleicht wird das verschmerzbar durch Ordner und Unterordner, in denen man nun in LEX Dashboards und Reports verstauen kann. Bitte Hinweise zum Löschen beachten
  • Freue mich über viele neue Dashboard und Report Einstellungen, die zum Teil weiter unten nochmal auftauchen werden
    Visualforce Templates in LEX einsetzbar. Lightning Templates bekommen Mergefields, die mit mehr als einem Objekt können. Zum Beispiel User/Contact/Lead.LastName und HTML wird ebenfalls unterstützt. Hinweise zum Konvertieren bestehender Templates hier.
  • Was Admins mit einen Klick auf Delete schon lange die Nerven raubt - this component is referenced somewhere else in Salesforce - können sie nun schon vorher mit der neuen MetaDataComponentDependency in einer SOQL Query erfragen. Zum Beispiel: Wo werden meine Apex Klassen benutzt?
    SELECT MetadataComponentId, MetadataComponentName, MetadataComponentType, 
    RefMetadataComponentId, RefMetadataComponentName, RefMetadataComponentType 
    FROM MetadataComponentDependency 
    WHERE RefMetadataComponentType = 'ApexClass'
    
    Weitere Beispiele im Repo von Andrew Fawcett: https://github.com/afawcett/dependencies-sample
  • Inline Editing von gefilterten List Views, sofern derselbe RecordType gefiltert wird. Find ich gut!
  • Kleines Ding, das mich besonders freut: Schema.DescribeSObjectResult.getRecordTypeInfosByDeveloperName(). Kein Ärger mehr mit geänderten RecordType Namen. Auch schön ist System.Test.clearApexPageMessages() und daß count() in SOQL (meistens, Ausnahme AggregateResult) nur noch als eine Row zählt.
  • Ich hoffe, das Interface QuickAction.QuickActionDefaultsHandler gibt's auch bald auch für mehr als nur Casefeeds. Damit kann man auch in Lightning den Email Publisher vorbefüllen mit Adressen, Attachments, etc.
  • A propos Quick Actions, dafür gibts endlich eine API in Form einer der lightning:quickActionAPI Component. Kann auch Visualforce oder Custom Component basierte QuickActions ansteuern

    To work with quick actions created with the Custom Visualforce or Lightning Component action type, use the getCustomAction method.

  • A propos Quick Actions II: Mass Quick Actions wünsche ich mir für die gesamte Platform und etwas programmatisch zugänglicher.
  • MyDomain wieder ändern
  • Trigger für External Objects (Beta)
  • Ein Lightning Component Override für neues Ereignis
  • Bei den Anpassungen für Platform Events wurden Tests besonders berücksichtigt. Test.getEventBus().deliver() feuert die Events, damit man das richtige Handeln testen kann. Außerdem neu: das Anstoßen von Flows und Processes
  • lightning:recordForm - das ist die Symbiose aus lightning:recordViewForm und lightning:recordEditForm

Für Entwickler

  • force:navigateToComponent wird abgelöst von einer durchdachten Navigation API mit eigenem Format von pageReference. Anleitung zur Migration inklusive.
  • Der Change Data Capture Pilot ist ein weiterer Schritt hin zu einfacherer Echtzeit-Integration und versteht nun ein paar Objekte mehr und hat weitere Updates erhalten.
  • CreatedDate und alle anderen DateTime Felder für Platform-Events erhalten Millisekunden im ISO 8601 Standard. Subscriber brauchen API 43.0, um die Information auslesen zu können.
  • Kennt ihr schon EventBus.TriggerContext.currentContext? Siehe auch hier.
  • Irgendwas stimmt noch nicht ganz, Auto-Aktivieren des Critical Updates für @AuraEnabled Sharing wird verschoben.
  • Achtung, im AuraLocalisationService werden verschiedene Methoden abgeschaltet, auch einige frühe aura Events im Zusammenhang mit Server Callbacks und Rendering.
  • Statt All or None können mit diesem Critical Update auch partielle Inserts-Updates bei etwaigem Schluckauf in einem Flow/Process in gewissem Rahmen ausgeführt werden. Im selben Atemzug werden Flows wesentlich klüger in Batches zusammengefaßt. Hier sei an das zugehörige Critical Update erinnert.
  • Neue Scratch Org Funktionen: "features": ["CascadeDelete", "ContactsToMultipleAccounts", "StateAndCountryPicklist"]
  • Die User Interface API ist nicht neu. Man muß mit ihr auch keine eigenen UIs bauen. Sie verrät verdammt viel über das, was ein User sieht und was es damit auf sich hat, auf einen Blick.
  • Chatter für Apex via ´ConnectApi.ChatterFeeeds´ - schönes Ding, wirklich. Damit ist Chatter in Apex angekommen. Dürfte Community Nutzer besonders freuen.
  • Allein mittels Javascript rausfinden, in welche UI der Nutzer unterwegs ist: UITheme.getUITheme()
  • Trigger Context Enum! Yay.
  • Für Javascript Zauberer: eval() wird im globalen Scope in Locker freigegeben
  • lightningStylesheets="true" in Visualforce Pages kann ab API 43 auch Custom Theme and Branding.
  • Einstein, genauer die ehemaligen Metamind APIs, handeln das Löschen von DataSets ohne das Model anzugreifen. Sowohl für Bild als auch Text. Die Einführung eines anderswo oft gebrauchten RefreshTokens halte ich für eine gute Idee genauso wie die verlockenden 2000 statt 1000 freien Vorhersagen pro Monat.
  • System.UserManagement ist eine neue Klasse und bringt unter anderem auch was für DSVGO Freunde mit: System.UserManagement.obfuscateUser(userId)
  • Der Type Blob schmeckt dem Aura Framework nicht ganz.
  • Ich wollte schon mal programmtisch Case Close Kommentare erstellen. Ging bisher nicht, nun schon über Case.Comments
  • Eher im Kleingedrucktem für Partner - und das hat mich überrascht - findet sich im Bereich der neuen Bolt Solutions die Verpflichtung, den Lightning Testing Service einzusetzen. Habe die PMs darauf angesprochen, das Bild unten könnte bald Vergangenheit sein. Für mich ein interessantes Detail.

Für Admins

  • Das neue URL Format ist live
  • Wußtet ihr, daß der Last Modified User derjenige ist, der Fehler von Flows als Email erhält? Das kann nun endlich besser konfiguriert werden, im Bereich, wo auch Apex Exception Mails eingestellt werden.
  • DateTime in Flow verfügbar.
  • Das Zeitfeld ist GA und auch in LEX verfügbar aber zum Beispiel nicht in Flow/Process Builder. Daher bitte das Kleingedruckte beachten.
  • Der Instance Name verschwindet wohl bald gänzlich aus allen URLs, mit dem Critical Update zumindest schon mal aus Sandboxen.
  • Systemweite Emailadressen auswählbar für Approval Mails. Leider nur ein Absender für alle Prozesse statt eine Email pro Prozeß.
  • Zumindest, wenn man alle Betas dazuzählt, wird Platform Encryption mittlerweile über - Case Feeds und Emails eingeschlossen -
    weite Teile der Platform unterstützt.
  • Keine ContactId mehr erforderlich für External User
  • Der Optimizer kann auf eine einzelne App losgelassen werden zur Analyse von Schwachstellen.
  • Nach dem Datenschutz Rumms vom letzten Release sind im neuen Individual sObjekt nur ein paar Kanten glattgezogen worden, darunter Merge-Optionen.
  • Kanban versteht Dependent Picklists, ditto für Path
  • Files werden im Weekly Data Export unterstützt
  • Noch in Beta: Sharing Sets für Communities, die knifflige Szenarien lösen können.
  • Mit einem Klick den ganzen Report oder dessen Chart in ein Dashboard übernehmen.
  • Statische Links von Dashboard Komponenten aus. Ja, leider nur statisch.
  • OmniChannel in LEX aufsetzen und auch Case Comments sind verfügbar in der neuen UI.
  • Neben Queue basiertem Routen von Cases nun auch Skill basiert - aber nicht beides gleichzeitig.
  • Duplicate Management mit Einschränkungen auch für Custom Objects

Für Nutzer

  • Wenn ein Admin oder Entwickler eine Lightning Component verhunzt hat, wird die Page trotzdem noch geladen. Kopfzerbrechen bereitet die Frage, wie ein Nutzer merken soll, daß etwas fehlt?
  • Endlich! Aus doof wird verständlich:
  • Von wegen keine neuen Features für Classic: Die File Preview wird der in LEX angepaßt.
  • Verlinken von Records in Chatter Posts. Am verlinkten Datensatz ist nicht zu sehen, ob oder in welchen Posts der Record erwähnt wurde.
  • Field History Reports gleichzeitig über oldValue und newValue filtern
  • Sauberes Gruppieren nach Datumskategorien in LEX Reports, heißt auch so viel wie der neue Report Builder ist GA
  • Exportieren von Reports in hübsch
  • Makros inserten Text am Cursor und in dem Zuge können QuickText mehr Nutzern via Queue zur Verfügung gestellt werden.
  • Schneller eine Email schreiben in der LEX Service Cloud. Email wird man wohl doch nicht los trotz aller Unkenrufe. Daher kann man sich jetzt noch mehr Case Updates in LEX emailen lassen.
  • Kopierte Links des eigenen Console Fensters (Service als auch Sales) funktionieren auch für Kollegen, die ihn erhalten.
  • List Email für Campaign Members
  • Filter für die Activity Timeline! und Splitview und Kanban für Aufgaben!
  • Mehr Customisation der eigenen Navigationsleiste. Und mehr Möglichkeiten für Admins, diese einzuschränken.
  • Comments und ListView Emails / Mass Mails werden über die Suche in LEX gefunden und die Suche schneller auf bestimmte Objekte einschränken klappt auch: