Salesforce Spring’18 Release – co nowego znajdzie developer Salesforce?

Wiosenna edycja Salesforce Spring’ 18 Release wnosi wiele istotnych zmian dla developerów, na których czeka tej wiosny sporo praktycznych udogodnień, takich jak umożliwienie wykonania niektórych akcji programowo za pomocą Apex czy nowe podkomponenty Framework Lightning. Pisaliśmy już o innowacjach w aplikacji mobilnej Salesforce oraz udogodnieniach dla Lightning Experience i wielu innych zmianach. Jakie nowości znajdzie tym razem developer Salesforce? Postaramy się przybliżyć najważniejsze z nich w poniższym materiale.

 

Framework Lightning Components – co każdy developer Salesforce powinien o tym wiedzieć?

 

Components

W edycji Spring’ 18 wprowadzonych zostało mnóstwo nowych elementów lightning możliwych do wykorzystania we frameworku lightning, jak również usprawniono już istniejące. Wśród najciekawszych dodanych komponentów znajdują się między innymi:

  • lightning:carousel (Beta)
    Wyświetlający ruchome karty:

 

developer Salesforce

 

  • lightning:treeGrid
    Wyświetlający dane w hierarchicznym drzewie:

 

developer Salesforce

 

  • lightning:listView
    Wyświetlający standardową listę rekordów, do których dostęp ma użytkownik:

 

developer Salesforce

 

Inne wprowadzone komponenty to między innymi: lightning:formattedAddress — wyświetlający adres wraz z linkiem do Google Maps; lightning:formattedName; lightning:formattedTime; lightning:inputAddress; a także lightning:inputField — wyświetlający odpowiednie pole do edycji odpowiadające polu na danym obiekcie.

 

Wiele obecnych wcześniej elementów otrzymało małe usprawnienia. Dodano możliwość zdefiniowania stylu dla lightning:buttonIcon w postaci atrybutu brand. Elementy lightning:dualListbox, fileUpload, combobox, radioGroup, select i textarea nie muszą już obowiązkowo mieć wypełnionego pola “Name”. Komponenty lightning:outputFIeld, recordViewForm otrzymały atrybut class, pozwalający dodać wyrenderowanym elementom klasę CSS. Największe zmiany dotyczą elementu lightning:datatable, gdzie dodano do wyboru tryb formatowania tekstu: “Wrap text” oraz “Clip text”. Od teraz możliwe jest też wyświetlanie ikony kolumny (iconName), ciągłe ładowanie rekordów (enableInfiniteLoading), rozwijane menu akcji dla poszczególnych kolumn (actions), programowe zaznaczanie rekordów w wierszach oraz wyświetlanie w liście przycisków i akcji jako datatype.

 

Restrykcja tagu <style>

Zwiększono również enkapsulację komponentów lightning poprzez uniemożliwienie dodania tagu <style> wewnątrz ciała komponentu, nawet dynamicznie za pomocą JavaScript. Zmiana dotyczy komponentów używających API od wersji 42.0 wzwyż. Ma to ujednolicić tworzenie komponentów lightning zgodnie z koncepcją, w której stylowanie sterowane jest osobnym, preprocesowanym plikiem CSS zawartym w komponencie.

 

Visualforce

 

Aktywacja Console UI Theme

Udostępniony zostaje motyw konsoli lightning — Theme4u. Od 5 października 2018 roku polecenie $User.UITheme oraz $User.UIThemeDisplayed zwracać będą Theme4u dla aplikacji Lightning Console oraz Theme4d dla stron w standardowym Lightning Experience. Ma to duże znaczenie w sytuacji, gdzie komend tych używano do rozpoznania kontekstu strony oraz tego, czy została otwarta w stylu klasycznym czy Lightning Experience. Przykładowe, aktualne rozwiązanie:

 

function inLightningExperience () {
    return ['Theme4d', 'Theme4u'].indexOf('{!$User.UIThemeDisplayed}') > -1;
}

 

Apex

 

System.List

Od edycji Spring 18’ klasa List zawierać ma metodę contains(listElement) analogiczną do metody klasy Set oraz metodę indexOf(listElement), które odpowiednio: sprawdzają czy lista zawiera dany element oraz indeks pierwszego znalezionego elementu w liście. Nie ma już potrzeby używania obiektu Set zamiast listy w celu sprawdzenia czy lista zawiera element.

 

Programowe, dynamiczne uruchamianie flow

Przed wprowadzeniem edycji Spring 18’ również możliwe było programowe uruchamianie flow, jednak nazwa każdego flow musiała zostać zahardkodowana (czyli wpisana na stałe). Dzięki nowej funkcji createInterview() możliwe jest dynamiczne uruchomienie flow, jako argument, podając nazwę flow oraz mapę argumentów. Przykładowy kod używający tej metody:

 

public void callFlow(String flowName, Map <String, Object> inputs) {
    Flow.Interview myFlow = Flow.Interview.createInterview(flowName, inputs);
    myFlow.start();
}

 

Programowe usuwanie rekordów historii obiektów

Dodano także nowe uprawnienia dla użytkowników dotyczące możliwości usuwania rekordów historii obiektów. Dzięki temu możliwe jest teraz usuwanie rekordów historii tak samo jak obiektów standardowych. Przykładowy kod wykorzystujący tę funkcjonalność:

 

List fha = new List();
fha.addAll([SELECT FieldHistoryType,
                   ParentId,
                   CreatedDate,
                   HistoryId
            FROM FieldHistoryArchive
            WHERE FieldHistoryType = 'Account'
            AND ParentId = '001d000000Ky3xIAB'
            AND CreatedDate = '2017-11-28T19:13:36.000z'
            AND HistoryId = '017D000000ESURXIA5']);
Database.delete(fha);


Debugowanie

 

Debug-logi gościnnych użytkowników bez ustawiania ciasteczek (cookies)

 

W edycji Winter 17’ został wprowadzony wymóg wprowadzenia dodatkowych ciasteczek (cookies) dla gościnnego użytkownika, aby widoczne były jego logi aktywności. Miało to znaczenie przy użytkownikach odwiedzających publiczne strony, udostępnione w Salesforce, mających tę samą licencję gościnną, kiedy to lista logów mogła zostać szybko wypełniona. Okazało się to jednak uciążliwe i od edycji Winter 18’ wymóg ten zostaje usunięty.

 

Developerzy niewątpliwie przywitają nowe zmiany z zadowoleniem. Duży nacisk położono na framework komponentów lightning, dzięki czemu dodano całkowicie nowe podkomponenty i usprawniono te istniejące, takie jak lightning:datatable. Salesforce zawsze otwarty jest na sugestie developerów, dlatego poza nowo wprowadzonymi elementami powrócono w niektórych aspektach do poprzednich rozwiązań. Doczekano się m.in. usprawnień samego procesu pisania kodu, takich jak powrót do wcześniejszego rozwiązania przy logach użytkowników-gości, albo funkcji contains dla klasy List. Każdy developer Salesforce powinien znaleźć więc coś dla siebie 🙂