Skip to content
PDF

Version 3.0.0 (Generoso) - Release notes

Release Date End of AMP(*) End of Life
2021-06-30 2024-06-30 2025-06-30

(*) Active Maintenance Period

The present document contains information regarding product enhancements, fixed issues and known issues related to AnswerModules Modules Suite version 3.0.0.

This guide

The information presented in the on-line guide are mostly non-version specific. AnswerModules team does its best to ensure that, where necessary, is made clear that the information presented is only applicable to specific versions, however if you are looking for this version-specific documentation, you can find it here

Script Console Installer

The Script Console installer has been temporarily removed from the Module Suite master installer. It will be reinstated in the next minor release.

No Warranties and Limitation of Liability

Every effort has been made to ensure the accuracy of the features and techniques presented in this publication. However, AnswerModules accepts no responsibility and offer no warranty whether expressed or implied, for the accuracy of this publication.

Module Suite Compatibility Matrix

OpenText Content Server MS 3.0.0
Content Suite 16.2 EP6 X
Content Suite 16.2 EP7 X
Content Suite 20.2 X
Content Suite 20.3 X
Content Suite 20.4 X
Content Suite 21.1 X
Content Suite 21.2 X
Content Suite 21.3 X
Content Suite 21.4 X

Major Changes in version 3.0.0

IDEs

All the Module Suite's IDEs have been deeply revised. Among the new functionalities introduced: filtering for snippets and widgets, editor theme selector, log level rapid switch for Content Script Editor, remote repositories for Content Script snippets, Content Script Co-edit (Beta)

Form Builder

Content Script Editor

Page Builder

Filtering

A new filtering feature has been added to all IDEs to make it easier to select the appropriate widget or snippet in large libraries.

Filtering

Remote snippets repositories

You can now retrieve Content Script snippets from remote repositories. This allows you to maintain an enterprise KB related to Content Script (in the form of a local Snippets repository or leverage Snippet repositories offered by third-party vendors. To register a new repository you need to add a custom option in Base Configuration having the form: amcs.msrepo[n].url =Label|repoUrl where n is a number between 0 and 10.

amcs.msrepo0.url=Sandbox|https://developer.answermodules.com/resources/repos/sandbox

Repote Repository

Concurrent Script Editing

Module Suite 3.0 features an experimental functionality that allows several developers to simultaneously collaborate on the editing of the same script. The functionality leverages WebRTC to establish a peer-to-peer direct connection among developers. The developer's browser will connect to the specified signaling server to find other peers. A password can be specified to encrypt all communication on the signaling server even if no sensitive information (WebRTC connection information, shared data) is shared over the signaling server.

Content Script

Updated of all major dependencies to their latest releases. New APIs for creating and manipulating OTEmail objects and OT Pulse comments. Improvements to performances related to the retrieval of information from the database.

Administration

New performances tuning options available in the Module Suite base configuration.

Beautiful WebForms

New V5 library

Module Suite 3.0 introduces a new widget libary based on reactive components (Vue.js). With this library, the already powerful engine, used to perform server-side rendering of forms' views is complemented by a reactive framework operating directly in the user's browser. When a form's view is composed using this library, the data model that is normally used in server-side rendering (form) is also serialized into a JSON object on the user's browser. This client side "model" feeds a reactive application developed with Vue.js. Thanks to this new approach we open up the possibility of performing numerous manipulations of the data model directly on the user's client.(i.e. it is no longer necessary to perform a client-server round-trip to manipulate the data-model), which do not longer require to update (totally or partially) the page containing the view. To support and facilitate the manipulation of the data model on the user's browser, the concept of action, already in use for server-side manipulation of the data model, has been extended and revised. When an action is now triggered the frameworks looks for its implementation first in a client-side registry, and only if it is not found proceeds invoking the server-side business logic (CLEH). The implementation of a client-side action is pretty simple and can leverage a dedicated javascript API, whose main methods are:

form //represents the form object (as in CLEH scripts)
form.validate() //Triggers form validation
form.getFieldReference(index, fieldName) //Access the input widget associate to a specific form's field.
                                         //fieldName is the field's path in the form (e.g. MySet:MyField)
                                         //index represent the set row
form.viewParams // The viewParams variable as in CLEH scripts
                // e.g. form.viewParam.vmVar
form.submitForm(withValidation) //Submits the form eventually triggering the form's validation first
form.getFieldValues(fieldName) //Retrives the list of values for the given form's field
form.getViewParamsValue(viewParamName) //Retrieves the value associated to the given viewParams's variable 
                                       //The main difference between form.viewParams.myVar and form.getViewParamsValue('myVar')
                                       //is that if myVar contains an object having the following structure:
                                       // {ajax:{url:"https://some.service.com/endpoint", data:[]}}
                                       //the API form.getViewParamsValue('myVar') automatically fetches the information from the
                                       //remote service and caches the result in the objects 'data' propoerty which is ultemitely returned
form.setViewParamsValue(variable, value) //Set the value of a viewParams variable
form.setFieldValues(fieldName, values) //Set the values for the given field
form.setFieldReadOnly(fieldName, values) //Set the field as read-only or editable 
form.addField(fieldName, index) //Adds an instance to the specified field
form.removeField(fieldName, index) //Remove an instance to the specified field
form.addConstraint(fieldName,contraint, configuration) //Adds the specified validation constraint to the given field
form.removeConstraint(fieldName, contraint) //Removes the specified validation constraint to the given field

CLEH scripts

If an action is triggered but it can not be found among the registered client side actions, we assume it is a server side action and the CLEH script is executed allowing server side manipulation of the data-model

New widgets for library V4

Added new widgets in library V4

Smart Pages

Commands definition cache

It is now possible to cache (using the distributed memcache) the result of the execution of the scripts stored under "CSSmartView:Commands" used to load the definitions of the additional commands you want to be available in Smart View pages. The scripts outcome is cached on a per-user basis. To enable the caching set to true the "amcs.amsui.volumeCache" parameter in Base Configuration. To programmatically clean the cache use the amsui.clearCache() API.

Actions definition cache

It is now possible to cache (using the distributed memcache) the list of scripts under "CSSmartView:Actions" used for lazy loading additional commands in the Smart View pages. The scripts list is cached on a per-user basis. To enable the caching set to true the "amcs.amsui.volumeCache" parameter in Base Configuration. To programmatically clean the cache use the amsui.clearCache() API.

Overrides optimization

The internal mechanisms related to how the customizations are applied to the menus and the columns of the browsing pages of the Smart View interface have been deeply revised. The content of the Overrides folder is now used to compute an Override Map (OM), specific to your repository, having the following structure:

OM = [
    "globals": [            (1)
        540588              
    ],
    "type": [               (2)
        "144": [            (3)
            548066
        ]
    ],
    "tenants": [            (4)
        "497147": [         (5)
            "globals": [    (6)
                548169
            ],
            "type": [       (7)
                "144": [    (8)
                    496932
                ]
            ],
            "ids": [        (9)
                "496931": [ (10)
                    545972
                ]
            ]
        ]
    ]
]

where:

  • (1) identifies a list of scripts to be always executed
  • (2) a list of scripts to be executed only if the current space has at least one node having of the identified type (3)
  • (4) scripts to be considered only if the current space is descendant of the specified tenant (5) (a space identified by its DataID)
  • (5) is a "tenant" configuration
  • (6) identifies a list of scripts that must always be executed if the current space is descendant of the specified tenant (5)
  • (7) a list of scripts to be executed only if the current space has at least one node having of the identified type (8) and is descendant of the specified tenant (5)
  • (9) a list of scripts to be executed only if the current space has at least one node having of the identified id (10) and is descendant of the specified tenant (5)
  • scripts in the OM are executed in the following order (1), (2), (6), (7), (10).

Given the above example and imagining that all the scripts in (3) (8) and (10) return the list ["comm_one","comm_two"], the resulting AOM will contain:

(3) AOM = [
                ...
                "S144":[commands:["comm_one","comm_two"]],
                ...
            ]
    (8) AOM = [
                ...
                "S144":[commands:["comm_one","comm_two"]],
                ...
            ]
    (10) AOM = [
                ...
                "D496931":[commands:["comm_one","comm_two"]],
                ...
            ]
- scripts in (1), (6), (10) MUST return a Map having entries of the form:
    "SXXXX":[                                                                      
        commands:["comm_one", "comm_two",...],
        columns: [ //Optional                                                       
                    col_name:"col value", //value can be HTML
                    ...
                    ]
    ]
    where XXXX is a valid SubType
    or
    "DYYYY":[                                                                      
        commands:["comm_one", "comm_two",...],
        columns: [  //Optional                                                    
                    col_name:"col value", //value can be HTML
                    ...
                    ]
    ]

where YYYY is a valid node's ID.

OM is to be considered a "static" information in productive environments and as such, to guarantee optimal performances, the framework should be allowed to cached it by setting to "true" the " amcs.amsui.volumeCache" parameter int the base configuration.

When a user changes the current space, the OM is evaluated by the framework against the users' permissions and the actual override map (AOM) associated to the space is determined. AOM is determined by executing the relevant scripts in OM in the order described above. The AOM has the following form:

AOM = [
    "S144":[                                                                       (1)
            commands:["comm_one", "comm_two",...], //list of commands' command_key  (2)
            columns: [                                                             (3)
                        col_name:"col value", //value can be HTML
                        ...
                     ]
           ],
    "D1234":[                                                                      (4)
            commands:["comm_one", "comm_two",...], //list of commands' command_key
            columns: [
                        col_name:"col value", //value can be HTML
                        ...
                     ]
           ]
    ...
]

where: (1) represents commands and columns to be associated to all the nodes having the identified subtype, (3) can be omitted, (4) represents commands and columns to be associated a specific node (identified by its id), (4) takes precedence over (1).

How OM is created ?

In order to determine the OM, the content of the "Overrides" folder is evaluated following the logic below:

[
    "globals":[             (1)     
        540588
    ],
    "type": [               (2)
        "144": [            (3)
            548066          
        ]
    ],
    "tenants": [            (4)
        "497147": [         (5)
            "globals": [    (6)
                548169
            ],
            "type": [       (7)
                "144": [    (8)
                    496932
                ]
            },
            "ids": [        (9)
                "496931": [ (10)
                    545972
                ]
            ]
        ]
    ]
]
  • (1) Contains the list of scripts objects stored directly under "Overrides"
  • (2) For each direct subfolder of "Overrides" that has a name starting by the letter "S" an entry is created in "type" map (2). The key of such entry is the target subtype (as specified in the subfolder's name) while the value is the list of scripts contained the aforementioned subfolder.
  • (4) For each direct subfolder of "Overrides" that has a name starting by the letter "D" an entry is created in "tenants" map (2). The key of such entry is the tenant's DataID (as specified in the subfolder's name) while the value is the tenant OM configuration.
  • (5) For each "tenant" subfolder a sub-Override Map is created (SOM). The structure of SOM is identical to the one of OM with the only difference that subfolders of a tenant subfolder having a name starting with the letter "D" are used in SOM for creating entries in the "ids" map.

Below an exemplar content of the Overrides folder

Name ID SubType
Overrides 00001 AnsTemplateFolder
- GlobaScript 00002 Content Script
- S144 00003 Content AnsTemplateFolder
- - Document Script 00004 Content Script
- D1234 00005 AnsTemplateFolder
- - S0 00006 AnsTemplateFolder
- - - Folder Script 00007 Content Script
- - D5678 00008 AnsTemplateFolder
- - - Node Script 00009 Content Script

and the resulting OM

[
    "globals":[                     
        00002
    ],
    "type": [               
        "144": [            
            00004          
        ]
    ],
    "tenants": [           
        "1234": [         
            "globals": [ ],
            "type": [       
                "0": [
                    00007
                ]
            },
            "ids": [
                "5678": [
                    00009
                ]
            ]
        ]
    }
]

All Enhancements in version 3.0.0

ID Scope Description
#001130 Smart Pages Add redirect and Smart View navigation capabilities to Smart Pages Controller script
#001119 Smart Pages Added Iterator widget to Smart Page
#001120 Smart Pages Added Include SmartPage widget to Smart Page
#001122 Beautiful Webforms Two new uses cases for ADN
#001015 Module Suite Content Script Performances improvements
#001097 Beautiful Webforms Graphical request: item reference popup style with Smart View template
#001052 Smart Pages Unable to access Content Script and some components with X-Content-Type-Options HTTP Header
#000990 Beautiful Webforms Add 'Advanced customizations' configuration tab to the 'Custom Action Button' widget
#000672 Content Script Getting nodes when a parent is a associated volume
#000993 Extension - Docx Improved support for OpenDope custom XML Parts
#000624 Content Script Being able of creating EMAIL object (subtype 733)
#000714 Content Script Content-Disposition handler in Content Script
#000700 Beautiful Webforms Retrieve Pulse comments

Issues Resolved in version 3.0.0

ID Scope Description
#001090 Online Documentation Review a little detail in Workflow routing page
#001060 Content Script Problem with AmWorkID and AMSubWorkID with form is status of a workflow
#001103 Smart Pages Issue on the buttons of the Buttons Group widget (Smart Page)
#001104 Beautiful Webforms Issue on the buttons of the Buttons Group widget
#001080 Online Documentation Rend page: missing property and problem with Linux instruction (or in the package)
#001037 Content Script Content Script: managecallbackso.cs is used and fails on an environment based on PostgreSQL DB
#001108 Online Documentation Docx issue with Office 365 document
#001053 Content Script managecallbacksm.cs script fail on a case sensive DB
#000891 Beautiful Webforms Inconsistent behavior for check-boxes when used with Widget Space Content
#001040 Beautiful Webforms Regression 029: form server side object is not correctly initialized if some field has default value
#000994 Beautiful Webforms ADN DropDown widget is not working
#001016 Beautiful Webforms No error message when validation is in OnLoad or on PreSubmit
#000642 Beautiful Webforms Unable to access API documentation for Remote WebForms feature form.amRemotePack
#001041 Content Script Regression 029: nodes loaded through getChildren(Fast) APIs are not properly initialized when versionables
#000944 Content Script Document generated with a merge is corrupted if there are comments in the documents
#001034 Smart Pages Form with Wysiwyg widget on Smartpages: dropdown menu and pop up for insert object are not showed properly
#001030 Smart Pages Two small anomalies with Content Scripts in Smart UI: error in move operation and no way to see permissions
#001025 Content Script Error checking attributes starting from a shortcut
#000985 Beautiful Webforms Space Content: the uploaded document has random string in name
#001065 Beautiful Webforms Radio selection reset after document upload
#001043 Content Script Regression on patch 029: JDBC API is not working
#001094 Beautiful Webforms Default in Modal Container
#001109 Smart Pages CSSmartUIService is unable to deserialize page model if model.data contains classes that have been defined within a Script
#001056 Content Script Regression on patch 029: timeout putting a value in cache
#000644 Beautiful Webforms It is not possible to save an empty content script
#001028 Extension - xECM Missing 'Inline Guide' for xecm extension
#001029 Extension - xECM Wrong parameters type of editor autocomplete of the 'AddRole' method of the 'xecm' extension
#000939 Smart Pages Erroneous behavior when selecting rows in Smart Pages Datatable widget
#000521 Beautiful Webforms Source Code editor within Form Builder is initialized with wrong code when a new empty BWF view is created
#000998 Beautiful Webforms Minor error in panel container
#001095 Beautiful Webforms Scroll relocator: if added to a page there is a JS error
#001121 Beautiful Webforms Error getting menu from a document
#000905 Beautiful Webforms Datatable widget doesn't support client side actions (like pagination, search and sorting)
#000983 Beautiful Webforms Multiple input field overlap date picket
#001038 Smart Pages Missing search on columns in Node Table Table Tile
#001019 Beautiful Webforms Existing Datatables widgets have data loading issues after applying hoftix_2.9.0_001
#000886 Smart Pages Toggle Preview not available on Smart Page
#001000 Beautiful Webforms Plus button not clickable on FireFox
#000957 Smart Pages Widget Nodes table - Error on selecting nodes
#000971 Beautiful Webforms Select from list widget ignore the selected value when it is in a tab
#000953 Beautiful Webforms Workflow comment added many times with SmartView Template when Tab Action Buttons widget is used
#0001051 Content Script Real fields in categories are assigned Float values if accessed through GCSPrimitiveAttribute
#000995 Beautiful Webforms Model properties are not updated for widgets in layout containers.
#000991 Beautiful Webforms Make library update more robust
#001013 Module Suite ScriptManager Initialization invalidates Session Cache
#000980 Smart Pages Custom columns created with new CSSmartView:Columns functionality not showing in Smart Views