We’re starting to move willing departments over to the Kinetic UI.
In Menu Maintenance, we can drive Kinetic by:
Changing the Program Type to ‘Kinetic’ or
Changing the Form To Use to ‘Kinetic’
As I’m going through the menus, which is better to use?
I’m doing this manually one menu at a time, so I can think about what customizations need to be uplifted to Kinetic as well (I do see there’s a Menu DMT available), or I could create an Updatable BAQ.
It’s not a database field. Not one anyway, and they’re not discrete. I can tell you how I audit what’s kinetic-enabled, though.
BAQ where Ice.Menu.Arguments like '%-KineticUI%' appears to represent that the ‘kinetic’ checkbox is checked. That’s not enough to enable kinetic. Launching items in kinetic requires a URL value.
URL does contain a few URL’s, but most are not URL’s. They’re delimited URL components that get split then partially assembled with your root URL and also some other values to produce an actual URL. URL also contains things which are not a URL at all, which usually means it’ll work okay in Kinetic.
Check URL values by browsing through Ice.Menu.URL with your eyeballs and considering the patterns stored in URL. Filter based on the results. Filter other fields to focus in on things that aren’t relevant like submenus or not-enabled menus or etc. That should get you close enough to brute force check the rest.
We don’t change the Program Type at all. Just leave as default.
Form to use will be one of the following:
Classic - We always want the menu item to open in Classic (BPM editor for example, we don’t want it to open in new UI ever)
Kinetic - We always want the menu item to open in the new UI (We do this once we are confident the app is usable)
User Choice - We allow classic and new UI (BAQ editor - we still do most BAQs in classic, but are using the new UI for it’s newer features such as SQL to BAQ).
If we want to open in classic, use the smart client, otherwise use the browser for the new UI. In order for this to work, each user must be set as Form to Use: Classic in the smart client preferences
I also have BPMs to force people to use the default browser for all kinetic only menu items. The smart client browser is just slower and not a great user experience. If interested, I can provide that.
@mbayley I’d love to see that BPM! Does it open the browser automatically, or just block the Kinetic version from opening in the client?
We’re not ready to deploy yet, but I’m working on it. AR > General Operations was moved over yesterday, and it’s been interesting seeing who uses it based on the questions I got this morning. Who moved my cheese!
I just learned that setting all children to Kinetic UI through the parent menu’s overflow → Kinetic Options checkbox (Enable New UI) will change the DefaultFormType in menu maintenance for all menu entries that have that parent menu ID.
It seems those checkboxes are more like running a process that changes the child menu entries than a setting (which explains why there is no field in the db!).
Enable New UI = DefaultFormType: URL
Enable User Override = DefaultFormType: Default
And if you run it again with nothing checked, it goes to:
DefaultFormType: Base
The first post-processing BPM RemoveKineticMenuOptionsFromSmartClient on Ice.BO.Menu.GetMenuForLicenseType removes all menu items from the smart client that are Kinetic only.
// Get user agent
var userAgent = Operation.Current.HttpHeaders["User-Agent"];
var match = Regex.Match(userAgent, @"Chrome\/(?<version>\d+)");
if (match.Success == false)
{
return;
}
var chromeVersion = Convert.ToInt32(match.Groups["version"].Value);
// If not the smart client, return
if (chromeVersion > 130)
{
return;
}
// Remove Kinetic only menus
result.Menu.RemoveAll(o => o.DefaultFormType == "Url" || o.OptionType == "K" || o.OptionType == "W");
// Remove each menu without children
IEnumerable<MenuRow> menusWithoutChildren;
do
{
menusWithoutChildren = result.Menu.Where(o => o.OptionType == "S" && result.Menu.ToList().Any(p => p.ParentMenuID == o.MenuID) == false).ToList();
// Remove each
foreach (var item in menusWithoutChildren)
{
result.Menu.Remove(item);
}
}
while (menusWithoutChildren.Any());
The only menu items left are Classic or User Choice only
The second BPM NoKineticInSmartClient on Ice.Lib.MetaFX.GetApp prevents someone from opening a Kinetic Only app from their smart client homepage if they happen to have it on there.
// Get user agent
var userAgent = Operation.Current.HttpHeaders["User-Agent"];
var match = Regex.Match(userAgent, @"Chrome\/(?<version>\d+)");
if (match.Success == false)
{
return;
}
var chromeVersion = Convert.ToInt32(match.Groups["version"].Value);
// If not the smart client, return
if (chromeVersion > 130)
{
return;
}
// No assembly name means running from the SmartClient
var menuId = (string)request.properties.additionalContext.GetValueOrDefault("menuId");
var menu = Db.Menu.FirstOrDefault(o => o.MenuID == menuId);
if (menu != null && (menu.DefaultFormType == "Url" || menu.OptionType == "K" || menu.OptionType == "W"))
{
throw new BLException("This app is not available in the desktop client. Please use your web browser to launch this app.");
}
Maybe instead of this message, you could put a link to your home page url
Hopefully some variation of these BPMs can achieve what you are looking for.