2.0.12
Key updates February, March 2025
CXBOX (Demo)
Added: Push Notifications - new display modes
We have introduced three display modes for WebSocket Push Notifications: single, stack, and column.
Each new notification replaces the previous one in a single area.

Notifications appear separately, aligned vertically in a column.
Notifications appear separately, stacking on top of each other.
You can configure timeout for all three modes. For stack and column, you can also set the maximum number of visible notifications and the display direction (upward/downward).
Added: Line2D widget - New widget type!
We have introduced a new widget type Line2D to display data using X and Y axes in a linear format.

Key features include:
- Axis scale/ step control
- Grouped display
- Tooltip display
Functionality includes:
- Drilldown - click on xAxis values to drilldown to the filtered data displayed in a table.
- Switch mode - switch from column mode to table mode to view data in a tabular format.
- Segment interaction - click on legend values to add or remove lines from the plot.
Added: DualAxes2D widget - New widget type!
We have introduced a new widget type DualAxes2D to display data from different types of charts in a single area. The charts share the same X axis, but can have separate Y axes.
Note! DualAxes2D can only display 2D types of widgets (e.g. Line2D, Column2D). The features (tooltip and axis scale/step) for 2D widgets will apply to DualAxes2D automatically.
Functionality includes:
- Drilldown - click on yAxis values to drilldown to the filtered data displayed in a table.
- Switch mode - switch from column mode to table mode to view data in a tabular format.
- Segment interaction - click on legend values to add or remove lines/bars from the plot.
Added: UI panel - display of application version and environment type
We have added the ability to display the environment type and current application version in the UI panel for convenience. The text adapts depending on the menu state (collapsed/expanded) and shows a tooltip with more details. Background color customization for this section is also supported.


Added: Push Notifications - long links support
We have enhanced the display of long link labels for Push Notifications. Now, if the link label exceeds the width of the notification, the text automatically wraps to the next line, ensuring the full label is displayed correctly without being truncated. In addition, the "and (N) more..." text (in case there are several links) is also displayed correctly within the notification area.

Added: suggestionPickList field - scrollbar and empty value support
We have improved the suggestionPickList field by adding scrollbar support - you can now navigate long lists more easily using the scrollbar.

In addition, we have improved empty value display logic. If backend returns null, frontend will display an empty value instead of showing null.
Added: suggestionPickList field - changes in filtering method
We have refined the filtering method for the suggestionPickList field. Previously, it required an exact match with the typed characters (equals). Now, the filtering logic is less strict, and displays all the results that contain the entered text (contains).
Added: dictionary field - improved layout for mode:icon
We have removed the minimum width restriction for Dictionary field with mode: icon. This allows the field to shrink dynamically while keeping the icon and value closer together, resulting in a more compact layout.
Added: GroupingHierarchy widget - validation for aggregate fields
We have introduced a validation rule for aggregate fields in the GroupingHierarchy widget. Now, a field cannot be used both as a grouping field and as an aggregate field at the same time. If the same field is used both for grouping and aggregation, the widget will prioritize grouping, and the aggregation function will be ignored.
Fixed: FormPopup widget - forceActive update
We have enhanced the forceActive feature for FormPopup widget to ensure that only a POST row-meta request is executed. This guarantees the most up-to-date information even when the entity is being edited, preventing data loss.
Fixed: AssocListPopup - ignored scope for action buttons
We have updated AssocListPopup to ignore scope for action buttons, which prevents unnecessary duplication. Previously, actions from the three-dot menu were duplicated as separate buttons at the top.
Added: Draft Builder for Drilldowns with field filtration
A new Java Builder for generating drillDowns with filter by fields has been introduced:
drillDownExt.filterBcByFields(
CxboxRestController.sale, SaleDTO.class, fb -> fb
.input(SaleDTO_.clientName, fields.getCurrentValue(DashboardSalesProductDTO_.clientName).orElse(null))
.dictionary(SaleDTO_.product, fields.getCurrentValue(DashboardSalesProductDTO_.productName).orElse(null))
.multiValue(SaleDTO_.fieldOfActivity, activity)
);
"?filters={\""
+ CxboxRestController.sale + "\":\""
+ URLEncoder.encode(SaleDTO_.clientName + "." + SearchOperation.CONTAINS.getOperationName()
+ "=" + fields.getCurrentValue(DashboardSalesProductDTO_.clientName).orElse(null), StandardCharsets.UTF_8)
+ "&"
+ URLEncoder.encode(SaleDTO_.product + "." + SearchOperation.EQUALS_ONE_OF.getOperationName()
+ "=[\\\"" + fields.getCurrentValue(DashboardSalesProductDTO_.productName).orElse(null) + "\\\"]", StandardCharsets.UTF_8)
+ "&"
+ URLEncoder.encode(SaleDTO_.fieldOfActivity + "." + SearchOperation.EQUALS_ONE_OF.getOperationName()
+ "=[\\\"" + FieldOfActivity.IT.getValue() + "\\\",\\\"" + FieldOfActivity.MEDIA.getValue() + "\\\"]", StandardCharsets.UTF_8)
+ "\"}";
//And lots of logic to skip field filter if its value is null...
Info
This is a draft Java API — we will improve it but also make breaking changes in it very likely in next releases. So, please, do not use it in you production code for now, but your feedback is essential!
Other Changes
CXBOX (Core Ui)
We have released a new 2.5.2 CORE UI version.
Other Changes
CXBOX 4.0.0-M16 (Core)
We have released a new 4.0.0-M16 CORE version.
Added: NEW! Java API for confirm preActions
New Java API for confirm preActions in the CORE now provides with a standardized and unified behavior for both confirm and confirmWithWidget preActions.
1)confirm preAction
title or text set explicitly
PreAction.confirm(cf -> cf
.title("Approve?")
.text("Changes will be saved")
.yesText("Approve and Save")
.noText("Cancel"))
If you call .title(null) or don't call title(..) at all, the default title is displayed (actually its translation).
PreAction.confirm(cf -> cf
.text("Changes will be saved")
.yesText("Approve and Save")
.noText("Cancel"))
If you call .text(null) or don't call text(..) at all, the auto-generated text is displayed.
2)confirmWithWidget preAction (replacement for old confirmWithCustomWidget in demo)
If title contains a value, it is displayed.
PreAction.confirmWithWidget("meetingResultFormPopup", cf -> cf
.title("Approve?")
.yesText("Approve and Save")
.noText("Cancel")
)
Added: MultivalueField & MultivalueFieldSingleValue - Implemented Serializable
We have implemented Serializable for MultivalueField and MultivalueFieldSingleValue to ensure compatibility with springSessionJDBC. This change allows the backend to serialize bcState using the JDK serializer (instead of Jackson) by default, resolving issues with inconsistent behavior when attempting to serialize these objects.
Added: Spring Boot upgraded up to 3.3.8
In response to security requirements, we have upgraded Spring Boot from 3.3.4 to 3.3.8. This update also automatically upgraded transitive dependencies, resolving most security-related issues.