Is there a way to sort a detail by a specific field in Freedom Mobile? I'm using this approach that works in Classic, but it does not seem to work when I switch to the Freedom version:
added to the MobileCaseRecordPageSettings (edit page of the case section in mobile). The code for your detail should be found in the same schema and modified.
Here is a handler that will trigger calling the model load with the sorting using the "Name" column from the "Account" entity in the ascending order with row offset 15 and 1 record fetch:
Here is a handler that will trigger calling the model load with the sorting using the "Name" column from the "Account" entity in the ascending order with row offset 15 and 1 record fetch:
Can I add tags (prefixed with a #) to mark certain feeds? Say, for example, as #important or #CertainEvent to find relevant feeds? This is different from using @mentions to tag certain contacts.
Unfortunately, we do not yet have this functionality available. However, we have registered this request to the responsible R&D team for consideration and implementation in future application releases.
Hi, When the "AcceptApprovalWithoutComment" system setting is set to false, a popup for confirmation appears when clicking on the approval element's decision.
Is it possible to override this popup to make it a lookup field instead of a text field(approval comment)? If so, what is the schema name for that?
We are planning to move from Classic UI to Freedom UI and would love your input. Apart from edit data directly in list what are the major best features of Freedom UI? What should we be aware of during the transition? Have you encountered any significant issues when switching to Freedom UI for all users? Any issue with message templates or Excel reports? Any sources or documentation would be greatly appreciated.
- check that all business rules that you use are usable in Freedom UI (eg: you cannot use business rules based on roles in freedom UI)
- Plan for editing both minipages and normal pages
- some functionalities still do not work in Freedom UI (eg: activities not automatically linking to your opp and account, will be there in 8.1.4, but could be a blocker) or if deduplication is important, make sure you set it up: https://marketplace.creatio.com/app/deduplication-freedom-ui-enhancements
- Do not understimate the time to make the UX look good, the advantage of being a better page editor means you need to be careful in giving a UX direction 😉
- User training is important
- before pushing to prod: test, test,test because there are sometimes somes unexpected bugs which the teams are working actively on fixing
- carefull on the package management with autopackage generation in the latest version of Creatio
Advantages:
1- you can answer to more of your client's requests in depth without needing custom code (doesn't mean at some point you might not need some, but later in more complex scenarios)
2 - all new functionalities are provided for Freedom UI only (including future AI Copilot)
3- UX makes reading data clearer if you use the right colors
4- no more limit in functionalities depending on page type
5- object level business rules (rather than just page business rules), very useful
Disadvantage:
Performance is not yet on par of what classic UI and classic shell were able to provide, so you'll quickly have your users complaining that it's a bit slower. But it's getting there, version 8.1.3 shows a good bump in performance improvement.
One of the best approaches to converting a classic system to Freedom is to make use of the "Object-specific form page interface in the Freedom and Classic UI shell" lookup. This allows you to develop the Freedom UI equivalent while still allowing users to remain on the classic versions of the screens. Once the Freedom UI equivalent of the screens are complete and ready, you just need to switch the default for that entity in the lookup and users will begin seeing the Freedom UI version (along with swapping out the exposed section in the workplace to switch from the classic section to the Freedom section)
I've typically taken this approach:
Switch users to Freedom UI shell, but remain on classic screens
Convert a section to Freedom UI, once complete switch in lookup and workplace
Once users are using the new section work on switching any related detail edit pages to Freedom screens if applicable
Repeat for next section(s)
A few random thoughts to add:
As Damien mentioned, it's a bit slower, but has been getting faster with each version.
There's a few things you might run into that isn't yet possible with Freedom UI. However, the ease at creating complex UIs is a nice trade off. You'll spend far less time doing tedious things for the UI such as adding buttons, labels, custom filters, etc and just focus on the actual business requirements. It really does make a lot of things "no code" that used to require code to accomplish.
The auto-refresh of records that have been modified on the back end or in processes is one of the best things in Freedom UI. Make sure you enable this - then you can rethink how data gets modified and do more via no code in processes rather than in the page code.
Definitely get rid of the classic UI thinking. You can do so much more with screens, adding metrics/charts and other elements to lists and screens to make them far more visual & useful for users
To get the UI how you'd like don't forget you can put containers inside of containers. A layout element can have nested layout elements to split up cells/controls.
For the most part, I'm always disabling editable lists so they aren't editable. You lose too much control over things in an editable list for now. Hopefully soon we'll be able to have events, rules, validation, etc for editable lists, but that isn't there now.
The lack of Freedom UI specific documentation is frustrating. Going beyond "no code" seems to be pushed to the side and it's not uncommon that code will break between versions. It's completely aggravating. Luckily, there's a huge amount of things that used to require code that now can be done with a no code approach, however, it doesn't cover everything and once you need to go beyond no code it can get frustrating at times - especially with such little documentation (or none) on the topics. I do have a lot of articles on things I've discovered with coding for Freedom UI screens here.
Is it possible to intercept using some request handler the event when a user clicks on the green "Complete" button on a Next Steps tile? This is the button in the "next-step-tile-actions" div on the page which only appears when you hover over the next step tile:
It would be vey helpful to be able to run some custom code when this button is clicked - in our case, we need it to save the main page record before actioning this next step, as completing the next step might automatically transition the Lead to the next stage, losing any data entered by the user.
Also tried "brute forcing" it by overriding every handler I could find in the Creatio code, but literally nothing fires when clicking that button! Not even something like the page's crt.HandleViewModelPauseRequest (since it's a modal popup, I guess the full page doesn't actually pause like it would when navigating to a another page through clicking a lookup for example). Hopefully I've missed something, triggering some action on clicking that button would be useful.
Unfortunately, at the moment, there is no way to intercept the event of clicking on the Next-steps tile buttons. This button can call different requests depending on the type of tile, and these requests are called without the view model context, which will not allow us to intercept them from the card and use them to save card data.
We have registered your idea, and the R&D team has already planned the task for this improvement - they will create a special output event for the Next-steps component. This functionality will be available in future releases.
Just a quick PSA - either 8.1.2 or 8.1.3 breaks the ability we had before of being able to set Page Parameter values in the crt.HandleViewModelInitRequest request handler, since in the newer versions it appears the value is reset back to the default (similar to how fields based over table columns are) at some time after the init handler runs. This is quite frustrating, as it's reducing the number of options we have for setting values in the code where required (which it still often is with the current options for no code development).
A workaround that Ryan Farley has previous mentioned using for setting field values by using a javascript timeout can be used for this too, e.g.
I also had such an isuue but I resolved it by calling parameter initialization after let result = await next?.handle(request); And then in the end return result;
Mine was already being initialised after awaiting the result of handling the request, so it might be that sometimes this takes long enough to be ok but not always (so would introduce a race condition).
Just an FYI, I've been reporting this since 8.0.10 (see #SR-01234445). I was told this would be resolved in "the nearest releases (8.1.1-8.1.2)", however, it's still an issue in 8.1.3 without a commitment from Creatio on a specific timeframe for a resolution. This is a pretty huge pain point so it's disappointing that it's still a problem. I do love Freedom UI (and I'll take it any day over classic!) but there's been many instances of my code breaking along the way with new versions and it sometimes seems less urgent for fixes for issues that go beyond the "no code" customizations.
I checked that case before replying to Harvey and asked the responsible team to raise the priority for this task. I apologize for the delay and hope to see the fix soon. Meanwhile, they shared one more workaround, which is better to use with parameters:
add the handler on parameter changing and rewrite it when the default value has appeared:
Yes, this approach does work if all you need when the form is initialized is to work with a single value on the page. However, that is often not the case and each property initialization can happen at slightly different times, so referencing other attributes in this same handler might not work, depending on the timing of the various attributes being loaded/initialized. Adding a separate handler for each attribute you need to work with can get messy quick.
What I think would be nice/match the existing patterns would be to have some new request handler that does the setting of default values on the page, something like "crt.HandleAttributeInitRequest", which would perform the OOTB platform's setting of these values in the next?.handle(request) and then after awaiting the result of that a developer could set their own defaults for fields they need to, which wouldn't be overwritten (since the defaults had already been set).
It would also be nice to be able to "silently" set these default values (like you could in Classic UI) so that setting values in that request handler wouldn't cause the "are you sure" dialog to appear if a user closes the page without actually modifying the data themselves. Actually it would be nice to be able to do that generally from within request handler code.
Hi, is there any update on the matter? Still when you're trying to read the attributes on crt.HandleViewModelInitRequest the attributes aren't initialized and are all undefined
It looks like in 8.1.3, when clicking the magnifying glass on a lookup field which is configured to show the lookup page modal popup, the handler crt.OpenSelectionWindowRequest is now called instead of crt.OpenLookupPageRequest. Is is the case that the old handler has been swapped for the new one? Why has this been done? And are there any important differences to be noted? It's broken some of our client's custom code in the upgrade, and from a surface view it looks like it works in much the same way as the old handler and that simply swapping the code to use the new handler instead of the old works, but don't want to make any assumptions on that. Anybody have any insight on this?
Hmm. Good find. I’ll have some broken customizations as well. Hopefully we’ll get an official word about the change. This isn’t the first time I’ve had things break from changes to core Freedom UI things. I like using Freedom UI but at times it feels like a moving target. We need some commitment from Creatio about avoiding breaking changes. Ryan
I just tested this in an 8.1.3.6734 system and both "crt.OpenSelectionWindowRequest" and "crt.OpenLookupPageRequest" did open the selection/lookup window for me. However, using the results seemed to work differently depending on which request I used, it didn't work to just change the request name and leave the rest of the code as-is. So they do appear to possibly be slightly different requests, at least from my very limited tests so far 🤷🏼♂️
Interesting, thanks for the additional info Ryan! For triggering the lookup page from code I think we'll stick with the original method for now then.
But a little PSA for anyone wondering why their code overriding the crt.OpenLookupPageRequest handler to intercept and add filters/perform other logic when a user triggers a lookup page on a lookup field configured to view as "Selection window" rather than dropdown list, they should now be overriding crt.OpenSelectionWindowRequest instead. Hopefully we'll get some clarification on why this has changed and any implications.
8.1.3 is the first release with this API published, and Creatio mentioned the API for Freedom UI selection window in the 8.1.3 release notes. At the same time, we left it without changes so as not to break possible customizations with the old unpublished API. However, the old API is effectively deprecated, and the new API should be used from now on.
The full article for the Academy is almost ready and will be officially published soon. Here is part of main information (maybe some parts will be changed, that's why please follow the updates): In order to open the lookup window, you have to use crt.OpenSelectionWindowRequest:
entitySchemaName - the name of the entity schema whose data is displayed in the lookup window. Optional parameter. If not specified, the data source is taken from the attribute specified in itemAttributeName
caption - optional parameter, displayed in the window title. If caption is not specified, the caption is taken from the attribute specified in the itemAttributeName parameter. If itemAttributeName is not specified, then from the entity schema.
schemaName - the name of the schema that is displayed in the lookup window. Optional parameter. Default is BaseLookupPageTemplate
itemAttributeName - the name of the attribute from which the title is taken, the name of the entity schema and in which the result of the selection in the window will be written. Optional parameter. As a rule, this is the attribute with which the Combobox control is associated.
itemsAttributeName - the name of the attribute from which the data source name is taken. Optional parameter.
afterClosed - callback function returning the result of the selection in the window. Optional parameter.
filtersConfig- describes the filter to be applied to the data. Optional parameter
P.S. Additionally, users can enable features and much more, which you're able to read from the article on the Academy in the near future.
I have a Freedom UI list where I can take a few actions after the user has selected one or more rows. The actions run as expected, but the records are kept selected after the actions run and the user has to manually clear the selection. What do I need to add to the custom code to clear the selection?
It depends on the action. The Unlock one just clears the locked by field for the selected cases. The print generates letters and sends them to our print vendor for each case selected. Finally, the Assign one opens a window where the user can select the person to assign the cases to. Each one is calling the code below with the proper parameters.
I just need to know what I need to add to that code to clear the selection after the code that runs the business process.
Thanks,
Jose
processSelectedRows: async function(request, processName, message, next) { var selectedRecords = await this.getSelectedRows(request.$context); var count = selectedRecords.count; var date = new Date(); var hours = date.getHours(); var minutes = date.getMinutes(); var ampm = hours >= 12 ? 'PM' : 'AM'; hours = hours > 12 ? hours - 12 : hours; var timeString = hours.toString().padStart(2, '0') + ':' + minutes.toString().padStart(2, '0') + " " + ampm; message = message + " on " + timeString + " for " + count + " selected records."; request.$context.executeRequest({ type: "crt.NotificationRequest", message:message }); const handlerChain = sdk.HandlerChainService.instance; result = await handlerChain.process({ type: 'crt.RunBusinessProcessRequest', processName: processName, processRunType: "RegardlessOfThePage", processParameters: { "SelectedRecords": selectedRecords.selected }, $context: request.$context }); if (!result.success) { var errorMsg = Ext.String.format(resources.localizableStrings.UnableToProcessSelectedRows, processName, result.errorInfo?.message); request.$context.executeRequest({ type: "crt.NotificationRequest", message: errorMsg }); } /* Call the next handler if it exists and return its result. */ return next?.handle(request); }
Thanks Ryan. I tried that (and other variations like setting the type to 'clear') and the model gets cleared, but the GUI is not refreshed. In other worlds on the page the records are still showing as selected even though the model now has cleared the selection.
No that's not what I'l looking for. What I want to do is what history.replaceState(state, unused, url) does in JS. change the shown url and the browser history, but not navigate.
Ah I see now. I've not noticed any equivalent of that in the devkit. I've seen a navigationservice and router classes as possibilities in the internal code, but they aren't exposed in devkit.
Might take a little playing with to figure out how to get the other params passed for stateObj, pageTitle, etc. Searching the source for "crt.7XRequest" would likely find some examples of similar requests.