Developing and customizing forms in D365 are limited by predefined patterns and styles.
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.