Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Registering a new MRU entity is done by following the steps below:


Specifying MRU Table Names

First, set the 'MruTableNames' application setting (comma-separated list) to include the table name(s) for which you want to register a new entity.
This can be done in SWAT either in the (config→ environment -> .restapplicationsettings file

...

)

Image Added


Or from the Application Settings Desktop (from UI, if available).

Image Added

Image Removed

  • Second, in the RecordHdlHelper class, the following method is used to determine the container opened on record double click in the data view: GetContainerOfHdl.
    The RecordHdlHelper class uses the IEntityMetadataService.

...


(in thie example below, profileW opens for table ZUser with id '012'; id is usually the first part of the selfHdl).

...

Service customization

The methods from RecordHdlHelper are used to specify the MRU item icon/description/key etc. Previously, those values were hardcoded in SWAT and were not customizable.

This was remedied by allowing the framework customers to customize this code through a new service: IEntityMetadataService. A default implementation is shipped with SWAT: LegacyEntityMetadataService.


Implementation

Customers would need to provide their own implementation of this service (either by implementing the service from scratch or overriding the default SWAT legacy implementation). Create a folder in src → backend which is called <Customer Name > create a folder <OERA> create folder <metadata> and file EntityMetadataService.cls and insert the following code and overwrite the table name. 

Image Added

Expand
titleCode snippet


Code Block
languagejs
USING Progress.Lang.*.
 
BLOCK-LEVEL ON ERROR UNDO, THROW.

CLASS <your class>.OERA.Metadata.EntityMetadataService
    INHERITS Akioma.Swat.OERA.Metadata.LegacyEntityMetadataService
    IMPLEMENTS Akioma.Swat.OERA.Metadata.IEntityMetadataService:

    CONSTRUCTOR EntityMetadataService():
        SUPER().
    END CONSTRUCTOR.

    METHOD OVERRIDE PUBLIC CHARACTER GetDetailsScreen(pcRecordHdl AS CHARACTER):
      DEFINE VARIABLE cTableName     AS CHARACTER NO-UNDO.
      DEFINE VARIABLE cContainerName AS CHARACTER NO-UNDO.

      cTableName = Akioma.Swat.RecordHdlHelper:GetTableNameFromHdl(pcRecordHdl).
      CASE cTableName:
        WHEN "Article" THEN
          RETURN "ArticleMaintenanceScreen".
      END CASE.

      cContainerName = SUPER:GetDetailsScreen(pcRecordHdl).
      IF cContainerName > "" THEN
        RETURN cContainerName.

      RETURN "".

    END METHOD.

    METHOD OVERRIDE PUBLIC CHARACTER GetLabel(pcRecordHdl AS CHARACTER):
      DEFINE VARIABLE cTableName  AS CHARACTER NO-UNDO.
      DEFINE VARIABLE cLabel      AS CHARACTER NO-UNDO.

      cTableName = Akioma.Swat.RecordHdlHelper:GetTableNameFromHdl(pcRecordHdl).
      CASE cTableName:
        WHEN "Article" THEN
          RETURN "Article".
      END CASE.

      cLabel = SUPER:GetLabel(pcRecordHdl).
      IF cLabel > "" THEN
        RETURN cLabel.

      RETURN "".
    END METHOD.

    METHOD OVERRIDE PUBLIC CHARACTER GetIcon(pcRecordHdl AS CHARACTER):
      DEFINE VARIABLE cTableName  AS CHARACTER NO-UNDO.
      DEFINE VARIABLE cIcon       AS CHARACTER NO-UNDO.

      cTableName = Akioma.Swat.RecordHdlHelper:GetTableNameFromHdl(pcRecordHdl).
      CASE cTableName:
        WHEN "Article" THEN
          RETURN "fad fa-shopping-cart".
      END CASE.

      cIcon = SUPER:GetIcon(pcRecordHdl).
      IF cIcon > "" THEN
        RETURN cIcon.

      RETURN "".
    END METHOD.

END CLASS.



Declaration

You also need to specify which implementation of the service will be used:

Image Added

Expand
titleCode snippet


Code Block
<?xml version="1.0"?>
<ttServiceLoader xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <ttServiceLoaderRow>
        <Order>0</Order>
        <ServiceTypeName>Akioma.Swat.OERA.Metadata.IEntityMetadataService</ServiceTypeName>
        <ServiceClassName>YOURCLASS.OERA.Metadata.EntityMetadataService</ServiceClassName>
    </ttServiceLoaderRow>
</ttServiceLoader>



IEntityMetadataService customization

The following methods can be customized from RecordHdlHelper through the service:

RecordHdlHelper MethodIEntityMetadataService MethodDescription
GetKeyFieldOfTableIdGetKeyFieldById
GetKeyFieldOfTableNameGetKeyFieldByName
GetTableNameFromIdGetNameById
GetInternalKeyOfTableGetInternalKeyFieldByName

GetTableIdFromName

GetIdByName


GetDescFieldsOfTable

GetDescriptionFieldsByName


GetOwnerOfTable

GetProductByName


IsTransField

IsTransField


GetForeignTablePropertiesOfField

GetLinkedEntityPropertiesOfField


GetForeignTableNameOfField

GetLinkedEntityOfField


GetContainerOfHdl

GetDetailsScreen

Used for MRU details container

GetLabelOfHdl

GetLabel

Used for MRU Label

GetIconOfHdl

GetIcon

Used for MRU Icon

Table Definition

Some fields used in the template get their value based on the table definition file 

(for ex. TargetKey is set based on the xml table KeyFields attribute; so at runtime, for our table, the value display for the MRU entry keycomes from the field specified in the  attribute).

This applies for the key (KeyFields attribute) and the MRU record description (descriptionFields attribute).

Image Added


For SWAT and for POCs, the table definition file needs to be included in pasoe-config.xml, under the tableDefinitionsDumpFile property:

Image Added


Repository Object Changes

Registering an MRU entity should be done when a details screen is opened.


In order to launch the screen (in our case, articlemaintenancescreen) by clicking on a grid column, you need to do the following steps:

  • In the source grid, on the column  you click on, set the following attributes:
    • SUBTYPE: LAUNCH
    • VisualizationType: LINK
    • KeyField: *key field of the table* (in our case, selfHdl)

  • On the grid itself, set the following attribute
    • FolderWindowToLaunch: *detail screen to open on click* (in our case, articlemaintenancescreen) - used to specify which screen opens on click; 


  • Finally, on the DSO used in the details screen, set the EventAfterFetch to the following: '$ akioma.registerMruEntryFromBE(self);'.
    This will call a function in the MruBT.cls which will do the registering in the MRU table.
    The data source needs its index to point to a valid record in order for the register to work.

...

Image Added


The details screen should have the same PrimarySDO as the DSO used in the grid (ArticleDSO).

Image Added



After those steps are followed, the new MRU entities will show up in the MRU Data View.

Image Removed

Once you double-click Image Added


IMPORTANT: Double-clicking on an item , it will open the screen specified abovefrom the MRU data View will only work if the data Source has one of the following fields: selfhdl, refhdl or childhdl.