Developing and customizing forms in D365 are limited by predefined patterns and styles.
The final view.
We can however overcome these limitations to some extent by placing new form controls and changing properties of existing ones and, of course, a bit of coding.
As an example, let's add a new Workflow image similar to Expense category to be shown in BusinessCard form group control, once an expense is assigned to the current user.
There are multiple ways to achieve the required change. To mention a few, playing with Style and ExtendedStyle properies in design, changing form controls placement with Top, Bottom, Left, Right properties, playing with DisplayOptions at run time, combining both images into one, replacing the standard images to customized ones: one for Assigned-to-me Category and standard Category, and so one.
Here we consider adding a new image of Workflow icon next to the standard Category one.We have a display method returning the required image. The key point here is to set its ExtendedStyle property to card_imageSquare, so that it would be shown properly.
Now it looks almost perfect, but the new form control pushed a bit the currency amount out of the card frame.
Let's fix it by hiding the standard form control and placing its duplicate with ExtendedStyle = None.
The last thing is to make the text bold in order to emphasize it.
[ExtensionOf(tableStr(TrvExpTrans))] final class TrvExpTrans_Extension { boolean isCurrentUserWorkflow() { ... } display container currentUserWorkflowIndicator() { ImageReference imgRef; if (this.ApprovalStatus == TrvAppStatus::Pending && this.isCurrentUserWorkflow()) { imgRef = ImageReference::constructForSymbol(ImageReferenceSymbol::Workflow); return imgRef.pack(); } return conNull(); } [FormDataSourceEventHandler(formDataSourceStr(TrvExpenses, TrvExpTrans), FormDataSourceEventType::DisplayOptionInitialize)] public static void ds_OnDisplayOptionInitialize(FormDataSource sender, FormDataSourceEventArgs e) { FormDataSourceDisplayOptionInitializeEventArgs eventArgs = e as FormDataSourceDisplayOptionInitializeEventArgs; FormDesign fd = sender.formRun().design(0); FormRowDisplayOption fo = eventArgs.displayOption(); FormControl fc = fd.controlName("newAmountCurrWithCurrencyCode"); // if we can find our new form control for the expense amount if(fo && fc) { // let's make it bold to emphasize fo.affectedElementsByControl(fc.id()); fo.fontBold(true); } } }
The final view.