Release Notes 2025-08-08

Release Notes 2025-08-08

Version Information

OpenEdge Release

Version Information

OpenEdge Release

Version Information

11.7.21, 12.2.17, 12.8.6, 12.8.7, 12.8.8

Release 11.7 #87133@2025-08-08

Retirement of OpenEdge 11.7

OpenEdge 11.7 has been retired by Progress Software on April 1st 2025. In consequence we urge all customers still using OpenEdge 11 to upgrade to OpenEdge 12.2 or 12.8 as soon as possible.

We are intending to drop the official support of the SmartComponent Library for OpenEdge 11.7 during the second half of the year 2025. We will then no longer ensure that new features of the framework will be usable with OpenEdge 11.7

Customers that are concerned by this intention, should reach out to us as soon as possible, so that we can discuss about a solution.

OpenEdge 12.8 support!

We are pleased to announce that we are not aware of any issues using the SmartComponent Library on OpenEdge 12.8. We hereby declare OpenEdge 12.8 fully supported for the SmartComponent Library as of the release of  January 15th 2024.

OpenEdge 12.2 support!

We are pleased to announce that we are not aware of any issues using the SmartComponent Library on OpenEdge 12.2. We hereby declare OpenEdge 12.2 fully supported for the SmartComponent Library as of the release of April 09th 2020.

PASOE / OEMANAGER VS Code Extension

Our first VS Code extension is available in the VS Code marketplace: https://marketplace.visualstudio.com/items?itemName=ConsultingwerkApplicationModernizationSolutionsLtd.oemanager

The extension supports developers with PASOE related routine tasks during development:

  • checking agent or session status

  • trimming the PASOE agents

  • restarting a new agent vai the ping request

Introducing the SmartComponent Library developer forum

Got questions about using the SmartComponent Library? Wish to discuss feature requests with other users of the SmartComponent Library? To facilitate networking in the growing number of SmartComponent Library users and developers, we've added a developer forum on our new home-page. The developer forum can be found at: https://www.consultingwerk.com/support/forum 

A login is required to participate in the forum. Don't be shy - create your account today!

Release Notes

Following the release of the OpenEdge 11.7 Release we have completed our testing of the SmartComponent Library on this release of Progress and are proud to announce formal support for the SmartComponent Library on OpenEdge 11.7 with the 2017-04-24 release of the SmartComponent Library. Generally we recommend customers on OpenEdge 11 to upgrade to OpenEdge 11.7 quickly. Starting the 2017-07-14 release we are supporting OpenEdge 11.7 Service Pack 1 (11.7.1).

Starting the 2015-10-09 release the Business Entity Designer will feature a start page with links to most recent release note articles on this site.

With SCL-751 we have adopted native Enums for OpenEdge 11.6. To activate this feature customers must add a definition to products.i. SCL-751 provides details for this.

With SCL-1113 we have modified the templates for SmartWindowForms and SmartTabFolderPages generated from the Business Entity Designer. We have removed the initialization of the viewer controls SmartTableIOState property (value was set to "NoDataSource" within the InitializeComponent method). Customers using their own set of templates should adopt the same fix to their templates.

New Versions of Proparse .NET Assemblies (30 December 2018)

We have updated proparse with further enhancements in this release (see https://github.com/consultingwerk/proparse/releases/tag/4.0.1.1177). Please download the .NET Assemblies ZIP file from our ESD and replace the proparse.net.dll in your environment with the latest one. The new assembly reference is:

<assembly name="proparse.net, Version=4.0.1.1177, Culture=neutral, PublicKeyToken=cda1b098b1034b24"/>

As proparse is used by our Business Entity Generator, this new version of the proparse.net Assembly is also relevant for customers not doing GUI for .NET development and require support for parsing new ABL language constructs.

This version of proparse provides additional debug information when errors are thrown from proparse.net.dll.

New Version of the Consultingwerk.SmartComponents Assemly (09 January 2019)

To support the new SmartFilterControl and the "Filter" link between the SmartFilterControl/SmartDynamciFilterControl and a SmartBusinessEntityAdapter or SmartDatasetChildAdapter we have updated the Consultingwerk.SmartComponents.dll. The new Assembly reference is:

<assembly name="Consultingwerk.SmartComponents, Version=2.2.0.49856, Culture=neutral, PublicKeyToken=10603cb31df311b3"/>

Customers need to update this Assembly in order to compile the latest releases of the SmartComponent Library.

Hybrid Realm now using IAuthenticationService

We've updated the SmartHybridRealm class used for http authentication to leverage the IAuthenticationService. It is therefor required that for AppServers requiring http Authentication (e.g. REST or Web) the correct IAuthenticationService implementation is registered (using service.xml files).

Customers relying on the previous behavior should ensure that the Consultingwerk.SmartFramework.Authentication.AuthenticationService is regsitered as the IAuthenticationService. This implementation will auhtenticate users against the password stored in the SmartUser database table. 

When users with no Login Company set should be able to login using the SmartHybridRealm, it's required to set the Login Company Tennant Domain (similar to the field in the Login Company Maintenance) in the .restapplicationsettings / .applicationsettings, e.g.:

 

"DefaultAuthenticationDomain": "consultingwerk"

This is required as the Hydrid Realm Interface from Progress does not provide the domain name to the authentication method. 

Web Handler overview

This is an overview of the web handlers supported by this release

defaultHandler=OpenEdge.Web.CompatibilityHandler handler1=Consultingwerk.OERA.JsdoGenericService.WebHandler.CatalogWebHandler: /Catalog/{EntityName} handler2=Consultingwerk.OERA.JsdoGenericService.WebHandler.CatalogsWebHandler: /Catalogs/{PackageName} handler3=Consultingwerk.OERA.JsdoGenericService.WebHandler.CountWebHandler: /Resource/{EntityName}/count handler4=Consultingwerk.OERA.JsdoGenericService.WebHandler.ResourceSubmitWebHandler: /Resource/{EntityName}/SubmitData handler5=Consultingwerk.OERA.JsdoGenericService.WebHandler.InvokeMethodWebHandler: /Resource/{EntityName}/{MethodName} handler6=Consultingwerk.OERA.JsdoGenericService.WebHandler.ResourceWebHandler: /Resource/{EntityName} handler7=Consultingwerk.OERA.JsdoGenericService.WebHandler.BusinessServicesWebHandler: /BusinessServices/{OutputFormat}/{PackageName} handler8=Consultingwerk.Web2.WebHandler.SmartMenuWebHandler: /SmartMenu/{MenuStructureId} handler9=Consultingwerk.Web2.WebHandler.SmartMenuStructureWebHandler: /SmartMenuStructure handler10=Consultingwerk.Web2.WebHandler.SmartRoutesWebHandler: /SmartRoutes handler11=Consultingwerk.Web2.Services.SmartViewsHandler.SmartGridWebHandler: /SmartViews/Grid/{EntityName}/{ViewName}/{DetailTemplate} handler12=Consultingwerk.Web2.Services.SmartViewsHandler.SmartGridWebHandler: /SmartViews/Grid/{EntityName}/{ViewName} handler13=Consultingwerk.Web2.Services.SmartViewsHandler.SmartGridWebHandler: /SmartViews/Grid/{CustomViewName} handler14=Consultingwerk.Web2.Services.SmartViewsHandler.SmartViewerWebHandler: /SmartViewer/Viewer/{EntityName}/{ViewName} handler15=Consultingwerk.Web2.Services.SmartViewsHandler.SmartViewerWebHandler: /SmartViewer/Viewer/{ObjectName} handler16=Consultingwerk.Web2.Services.SmartViewsHandler.SmartFormWebHandler: /SmartForm/{FormTemplate}/{EntityName}/{ViewName} handler17=Consultingwerk.Web2.Services.SmartViewsHandler.SmartFormWebHandler: /SmartForm/{FormTemplate}/{ObjectName} handler18=Consultingwerk.Web2.WebHandler.SmartMessageWebHandler: /SmartMessage/{MessageGroup}/{MessageNumber} handler19=Consultingwerk.Web2.WebHandler.GetImageWebHandler: /Image/{FileName} handler20=Consultingwerk.Web2.WebHandler.SmartValueListWebHandler: /ValueList/{ValueList} handler21=Consultingwerk.Web2.WebHandler.SmartAttachmentsWebHandler: /Attachments/{Table}/{KeyValues} handler22=Consultingwerk.Web2.WebHandler.SmartAttachmentWebHandler: /Attachment/{Guid} handler23=Consultingwerk.Web2.WebHandler.SessionContextWebHandler: /SessionContext handler24=Consultingwerk.Web2.WebHandler.ContextPropertiesWebHandler: /ContextProperties/{PropertyName} handler25=Consultingwerk.Web2.WebHandler.ContextPropertiesWebHandler: /ContextProperties handler26=Consultingwerk.Web2.WebHandler.SessionInfoWebHandler: /SessionInfo handler27=Consultingwerk.Web2.WebHandler.FileSearchWebHandler: /FileSearch/{FileName} handler28=Consultingwerk.Web2.WebHandler.ExecuteAblWebHandler: /ExecuteAbl handler29=Consultingwerk.Web2.WebHandler.SmartLanguagesWebHandler: /Languages handler30=Consultingwerk.OERA.RestResource.RestEntitiesWebHandler: /Entities handler31=Consultingwerk.OERA.Swagger.SwaggerWebHandler: /Swagger/{EntityName} handler32=Consultingwerk.OERA.Swagger.SwaggerRestEntitiesWebHandler: /SwaggerEntities/{OutputType} handler33=Consultingwerk.Web2.WebHandler.SmartTokenSecurityCheckWebHandler: /TokenSecurityCheck/{ObjectName} handler34=Consultingwerk.Web2.WebHandler.SmartTokenSecurityCheckWebHandler: /TokenSecurityCheck handler35=Consultingwerk.Web2.WebHandler.SmartEntityTableMappingHandler: /EntityTableMapping/{EntityName}/{TableName}/{UiTypeCodes} handler36=Consultingwerk.Web2.WebHandler.SmartTreeRootNodeWebHandler: /SmartViews/TreeRootNode/{rootnodeid} handler37=Consultingwerk.Web2.WebHandler.SmartTreeChildNodesWebHandler: /SmartViews/TreeChildNodes/{parentnodeid} handler38=Consultingwerk.Web2.WebHandler.SmartSecurityCheckWebHandler: /IsRestricted/{SecurityRealmCode}/{SecurityItemGuid} handler39=Consultingwerk.Web2.WebHandler.SmartFieldSecurityCheckWebHandler: /RestrictedFields/{TableName} handler40=Consultingwerk.Web2.WebHandler.GetImageNamesHandler: /ImageNames
handler41=Consultingwerk.Web2.WebHandler.ExecuteQueryWebHandler: /ExecuteQuery
handler42=Consultingwerk.Web2.WebHandler.TranslationProviderWebHandler: /GetTranslation

UTF-8 based deployments available

Starting August 14th 2016 we ship our source code also as UTF-8 encoded. The ZIP files ending with _utf8.zip contain the source code encoded with that code page. The source code in the remaining archives is still encoded in ISO8859-1. Also on Github there is a new branch containing the OpenEdge 11 based source code in UTF-8.

Related article (Progress K-Base): How to get Progress Developer Studio to save in UTF-8 encoding

New Feature Documentation

Download Link

http://esd.consultingwerkcloud.com/

https://github.com/consultingwerk/SmartComponentLibrary

Overview of included tickets

 

Bug

SCL-4867 Changed order of "of" and "no-lock" keywords in static generated DataAccess queries

Description:

We have modified the REeplaceLockMode method of the QueryHelper to insert the lock mode (NO-LOCK, SHARE-LOCK or EXCLUSIVE-LOCK) after the selection criteria of a buffer. This is more consistent with the other query generation routines in the framework.

SCL-4892 Fixed updating of the product module in the Object Master Change Utility

Description:

We have fixed an issue that was preventing the update of a Object Master’s product module in the Object Master Change Utility.

SCL-4909 Deleting a user in the Angular Web UI (SFRBO) raised "Current row has been changed by another user" error

Description:

We have fixed this issue. The Angular frontend (SFRBO) now supports deleting of users.

SCL-4911 Fixed Typo in Exception class NotImplementedException

Description:

We have fixed a typo in the error message raised by the NotImplementedException.

SCL-4918 Fixed static query generation for the MessageBusinessEntity

Description:

The Data Access Static Query Generator generated an invalid query string for MessageDataAccess class. This was a general issue that might have occurred in certain cases.

SCL-4929 Fixed issue with hanging DatatypeHelper:LongcharToCharacter when converting a 72K LONGCHAR with UTF-8

Description:

We have resolved an issue in the LongcharToCharacter method that might have caused an infinitive loop in some cases.

Improvement

SCL-4878 Added support for filtering Integer Fields that are mapped to Enum's in TalbeModelFilters

Description:

When a Business Entities INTEGER or INT64 field is mapped to an Enum value in the Dataset/TableModel we no support filtering for that field based on Enum members in the same way as this is possible with CHARACTER fields mapped to Enum values.

To utilize this new feature the DatasetModels need to be regenerated.

SCL-4888 Support rendering logical columns as text in Angular and GUI for .NET

Description:

When the grid columns “ViewAs” attribute is set to Text, we’re rendering the column as a text label instead of a check box. The values are determined either from the WebFormat (when set, Angular only) or Format attributes in the repository.

SCL-4893 Enabled Static Names Generator as an Ant Target Runner Task in VS Code/Windsurf

Description:

We’re now invoking the Static Names Generator through an Ant target runner task in VS Code or Windsurf whenever Business Entities or Business Tasks are built. This ensures that the static names referenced by the Consultingwerk.SmartFramework.SmartFrameworkServices static class are always in line with the source code.

Static names generation is invoked through the following snippet in the annotations.xml ANT script:


<target name="generate-smartframework"> <echo>Generating static names for SmartFramework</echo> <PCTRun procedure="Consultingwerk/Studio/StaticNamesGenerator/scl-sng.p" graphicalMode="false" dlcHome="${progress.DLC}"> <parameter name="currentFolder" value="${user.dir}\Consultingwerk\SmartFramework" /> <parameter name="scriptpath" value="${user.dir}\Consultingwerk\Studio\StaticNamesGenerator\" /> <parameter name="classname" value="Consultingwerk.OERA.IBusinessService" /> <parameter name="suffix" value="Services" /> </PCTRun> </target>


SCL-4897 Optional standard implementation of GetInitialValues in the BusinessEntityBusinessTask

Description:

Based on the new products.i switch GetInitialValuesInBusinessEntityBusinessTask the BusinessEntityBusinessTask now provides a default implementation of the GetInitialValues() method.

This behavior is optional and customers need to turn on this behavior as it might impact existing BusinessEntityBusinessTask implementations that have implemented a custom variant of the GetInitialValues method. This method needs to be marked as an override at least and/or incorporate a call to the SUPER:GetInitialValues() method.

SCL-4928 The EventHandlerParameter passed when invoking a server-side event handler (SSEH) now includes the client-type

Description:

We have added a new property ClientType to the EventHandlerParameter of a server-side event handler. This value will return ABL or SCLNG based on the client application raising the SSEH.

SCL-4930 Implemented a new primitive list class for decimal values

Description:

We have implemented a new DecimalList class that supports to maintain a list of DECIMAL values similar to the CharacterList class etc..

SCL-4932 Added support for "spacer" toolbar tool (Angular)

Description:

To support rendering Angular toolbars with KendoUI’s spacer toolbar tool we have added this capability to the SmartFramework repository. The default-button.json now includes a definition for such a toolbar tool.

SCL-4934 Business Entity Designer -> Compile Tool now gives more status messages

Description:

When Business Entities are compiled from the Business Entity Designer, we're now writing a log message per file that is being compiled.

SCL-4937 Added option to dump repository files by module without time-stamp details

Description:

When using the ANT scripts for dumping repository object masters (.smartrepo files) by product module, we now provide an option to skip the output of the time-stamp details from the SmartModifiedStatus record. This ensures that smartrepo files that are identical by their content are not tracked as modifed by SCM tools such a Git and do not cause merge conflicts.


<macrodef name="ExportRepositoryModule"> <attribute name="ModuleName" /> <attribute name="ResetModifiedStatus" default="${Repository.Export.ResetModifiedStatus}"/> <attribute name="ExportModifiedState" default="false" /> <sequential> <local name="Modules"/> <local name="ModuleSubDirectory"/> <local name="ModuleDirectory"/> <ExecuteFrameworkTool procedure="Consultingwerk/SmartFramework/Repository/Tools/export-repository-module.p" label="ExportRepositoryModule"> <options> <Parameter name="BaseFolder" value="${Repository.Export.Location}" /> <Parameter name="ModuleName" value="@{ModuleName}" /> <Parameter name="ResetModifiedStatus" value="@{ResetModifiedStatus}" /> <Parameter name="ExportModifiedState" value="@{ExportModifiedState}" /> </options> </ExecuteFrameworkTool> </sequential> </macrodef>


New Feature

SCL-4881 Implemented support for Extent fields in the SmartFramework Repository

Description:

We now have implemented support for EXTENT fields in the GUI for .NET and Angular rendering engines of the SmartFramework repository.

When a Business Entity has EXTENT fields (e.g. the Salesrep’s MonthQuata field) the generation of the entity fields will create individual MetaDataField masters per element, e.g. “eSalesrep.MonthQuota[1]” or “eSalesrep.MonthQuota[12]”.

The repository tooling and rendering has been adjusted to support handling those fields/elements correctly.

SCL-4886 Implemented support for rendering Smart Grid column of type "badge"

Description:

The Angular rendering of MetaGrid objects has been extended to handle fields that should be displayed as badges. Badges are supported on CHARACTER fields for single values or comma delimited lists of values.

Grid colums are rendered as badges when the columns ViewAs attribute is set to “badge”.

Rendering of badges relies on a SmartValue list for the entries which is registered via the Columns ValueListKey attribute.


SCL-4887 Implemented support for rendering Smart Viewer fields of type "badge"

Description:

The Angular and GUI for .NET rendering of MetaViewer/MetaFrame objects has been extended to handle fields that should be displayed as badges. Badges are supported on CHARACTER fields for single values or comma delimited lists of values.

VIewer fields are rendered as badges when the fields ViewAs attribute is set to “badge”.

Rendering of badges relies on a SmartValue list for the entries which is registered via the Columns ValueListKey attribute.


Story

SCL-4906 When a repository toolbar launches a Form, it is now possible to provide a parameter value to the constructor at runtime

Description:

A toolbar button defined in a JSON file for GUI for .NET rendering with the launchMenuFunction option now supports the parameterCallback option. This option specifies a method returning a CHARACTER value in the forms logic class.

SCL-4912 Attribute Maintenance now filterable by Attribute Group

Description:

The AttributeBusinessEntity is now filterable by the Attribute Group field.

SCL-4913 Added support for EventCustomContext in EventHandlerParameter (server-side event handler)

Description:

A new property “EventCustomContext” has been added to the EventHandlerParameter class.

Both Angular and GUI for .NET Clients can use this property to send application/context specific data to the server-side event handler method.

In GUI for .NET a method GetEventContext can be added to a form/viewer/grid’s logic class. This method is called by the server-side event handler framework to obtain the value for the custom context.


    method public CharacterHolder GetEventContext (pcEventName as character,                                                   sender as Progress.Lang.Object):


SCL-4914 SSEH : Implemented UI action to set File Uploads "context" property

Description:

We have implemented a general purpose SetCharacterPropertyUiAction that supports setting a value such a the context attribute or the class-list of a component on the frontend.

SCL-4917 Prototype MCP Server for SmartFramework Development

Description:

We have implemented a first prototype of a MCP server supporting AI based code generation with the SmartComponent Library framework. The MCP server is a layer on top of a development enabled PASOE appserver instance.

We do consider this feature to be still in an experimental stage. But customers that have interest in using this service may contact us, so that we can make this available.

SCL-4921 Added a new ServerSideEventHandler attribute to the SmartFramework repository

Description:

We have added this new property to the MetaForm, MetaViewer, MetaGrid and MetaToolbar object type. There is no direct behavior associated with this attribute. But this will allow us to idententify the default class that should contain server-side event handlers for a repository master in our tooling.

SCL-4923 Added FormActionTarget property to Angular form rendering

Description:

We’re now supporting a new link from a MetaForm object master (Container) to a viewer or grid instance in the form. The FormActionTarget link identifies the TableIO target instance which is supposed to execute the FormAction (e.g. Add, Update) when a form is launched.

SCL-4924 GUI for .NET Rendering: Improved error message when form contains inaccessible custom component

Description:

We’re now providing more details to the error message when rendering GUI for .NET forms that are referencing a custom component that is not implemented (e.g. an Angular only user-control).

Task

SCL-4910 Implemented JSON rendering support for Smart File Upload component

Description:

We have implemented JSON rendering support for the new File Upload component in our Angular frontend.

The File Upload component supports rich configuration options and event handling.

* uploadUrl (/web/UploadFiles), the endpoint URL for file uploads. If provided, it will be appended to the base service URI.
* autoUpload (false), whether files should be uploaded automatically when selected. If false, users must manually trigger uploads.
* allowMultiple (false), whether users can select multiple files at once.
* batch (true), whether multiple files should be uploaded in a single request (batch mode) or separate requests.
* actionButtonsLayout (end), layout of action buttons. Possible values: "start", "center", "end", "stretched". See Angular Uploads Upload Action Buttons - Kendo UI for Angular to see how they affect the layout.

Event Handlers (all optional)

* beforeUpload, name of the form or form logic method to call before upload starts. Can be used to cancel the upload, set context data or validate files.
* onError, name of the form or form logic method to call when an upload error occurs.
* onSuccess, name of the form or form logic method to call when upload completes successfully.
* onSelect, name of the form or form logic method to call when files are selected.

File Restrictions (all optional)

* maxFileSize, maximum file size in bytes. Files larger than this will be rejected.
* minFileSize, minimum file size in bytes. Files smaller than this will be rejected.
* allowedExtensions, list of allowed file extensions (e.g., [".pdf", ".doc", ".docx"]). Files with other extensions will be rejected.

SCL-4916 JSDO General service: JFP's top=0 was not applied

Description:

We have resolved an issue in the implementation of the JSDO General service interface that was causing the JFP’s (JSON filter patterns) top value to be ignored when the value was 0. This issue is resolved now.