Smart UI v27.0.0
Smart UI v27.0.0 Release, Aug-13-2026
Overview
This release centres on a native Pivot view for the Data Grid, backed by a new DOM-free aggregation engine. Pivot is rendered by the Grid's own pipeline rather than by a hosted component, so frozen columns, cell-range selection, clipboard, conditional formatting and .xlsx export continue to work on the pivoted result. The release also completes long-unimplemented PDF export surface, adds manual scroll control to the Gantt chart, introduces asynchronous and server-side validation, and fixes a set of pre-existing Grid defects surfaced by the new view.
What's New
-
Angular 22 support
The smart-webcomponents-angular package now supports Angular 22.
-
Data Grid Pivot View
Setting view: 'pivot' aggregates the data source into a cross-tab. Pivot is a native view, like 'card', so existing Grid features keep working on the pivoted result. Row groups are ordinary tree rows, which means expanders, expandRow, collapseAllRows and indentation apply unchanged, while the column axis becomes collapsible banded headers.
-
Pivot Engine
Smart.Utilities.PivotEngine is a DOM-free aggregation engine that is unit-testable without a browser. It uses single-pass bucketing rather than a filter per cell, and provides 14 aggregators mirroring Smart.DataAdapter.summarize by name and semantics. Custom aggregators receive a (values, records, value) signature, so calculations such as a weighted average have access to the underlying records.
-
Pivot Configuration API
A pivot property bag on the Grid exposes rows, columns, values, grandTotalRow, grandTotalColumn, rowSubtotals, columnSubtotals, designer, fields, freezeGrandTotalRow, rowSort and columnSort.
-
Value Display Calculations
A per-measure showValuesAs option supports percentOfRow, percentOfColumn, percentOfTotal, percentOfParent, runningTotal, differenceFrom and rank.
-
Hierarchy-Aware Sorting and Top-N Filtering
sortPivotBy(columnId, order) and pivotTopN(columnId, count, order) sort or filter leaves within their parent, keep group rows anchored and pin the grand total last, preserving the hierarchy that a generic sort would flatten.
-
Pivot Filtering
getPivotFilters(), setPivotFilters() and clearPivotFilters(), together with a pivotFilter event. Filters run before aggregation, so totals are recomputed from the surviving records rather than masked. Evaluation uses Smart.Utilities.FilterGroup, so filter semantics match the rest of the library.
-
Pivot Designer
createPivotDesigner(container), getPivotDesigner(), refreshPivotDesigner(), destroyPivotDesigner() and pivotDesignerFields(), plus a pivotDesignerChange event. The designer hosts the existing smart-pivot-panel element. A right-click context menu adds and removes fields, changes the summary function and showValuesAs, and reorders an axis without dragging.
-
Pivot Layout Persistence
getPivotLayout() and setPivotLayout() express the arrangement as plain JSON and round-trip through stateSettings.storage. They are kept separate from the pivot bag because that may hold functions, which JSON.stringify drops silently. getState and loadState carry the layout automatically.
-
Programmatic Column Group Collapse
collapseColumnGroup(name) and expandColumnGroup(name), with a columnGroupCollapse event. The Grid could previously collapse a group only through its header button. A collapseTo: 'first' | 'last' option supports a total column that sits on the far side of its band.
-
Direct Pivot Model Access
setPivotModel(model), getPivotModel() and setPivotSource(records) drive the engine directly, for example against server-computed aggregates.
-
PivotTable Frozen Row Headers
freezeRowHeaders pins the row-label columns to the left edge, the horizontal counterpart of the inherited freezeHeader. It is disabled by default. Previously, scrolling a wide pivot horizontally left a grid of numbers with no visible row labels.
-
Expanded PDF Export Options
pageSize, pageMargins, documentInfo, fonts, userPassword, ownerPassword and permissions are now supported, along with a real page footer via pageNumbers, pageNumberFormat and pageNumberAlignment. pageNumbers defaults to false, so existing exports are unchanged.
-
Gantt Manual Scroll Position
getVerticalScrollValue(), setVerticalScrollValue() and getVerticalScrollMax(), with the equivalent horizontal methods. A pending value is applied once the scrollbars report a usable maximum, so setting a position before render works. The scroll event is intentionally non-bubbling.
-
Asynchronous and Server-Side Validation
Validator.validate() returns a Promise when any rule is asynchronous. Adds Form.validateAsync(), a remote rule type, and a pending status with matching styling while a request is in flight.
-
Grid API Audit Tooling
scripts/grid-api-audit.js diffs Grid.prototype against documentation/json/jqxgrid.json, the definition that generates the TypeScript typings, all four framework wrappers and every API documentation page. Its --check mode fails CI on newly undocumented API, on documented API that no longer exists, and on a Grid module missing from source/modules/jqxgrid.js.
-
New Demos
demos/grid/pivot demonstrates a pivot with a docked designer, a colour scale over the value cells and a filter-aware summary strip. Also added: demos/gantt/scroll-position and demos/form/server-side-validation.
What's Improved
-
Nested Column Group Collapse
Collapsing a nested column group now hides the whole subtree. The rule that keeps one member visible previously ran at every level of the recursion, leaving one column behind per child band so that collapsing a parent appeared to do nothing. It now runs once over the collapsed subtree. Flat groups, groups holding an allowCollapse: false column, and inline groups are unchanged.
-
Styled Grid PDF Exports
PDF exports now carry cell styling. getUniqueStylePDF reads the style.rows[row][dataField] shape the Grid actually writes, in addition to the legacy style.columns[dataField][row]. Exports using exportStyles, formatFunction or cellsClassName previously came out unstyled.
-
Export of Underscore-Prefixed Columns
getDatafields skipped every _-prefixed property. It now exempts those the host declared as export columns, so exports of a grid with an underscore-prefixed dataField include that column.
-
PDF Export Style Mapping
fontFamily and border are now mapped from the export style. fontFamily is emitted only when it resolves to a registered font, since an unregistered font causes a render-time failure. A warning is logged when an xlsx-only dataExport setting is used with a PDF export; nine such settings were previously ignored without notice.
What's Fixed
- Fixed
setGroupState throwing on a column group tree that mixes collapsible and non-collapsible groups, where the recursion assumed every sub-group has a collapse button.
- Fixed a recycled cell element rendering a permanently blank label when handed to a column that had become the tree column at runtime. The element determined whether it was a tree cell only once, and the structure could be removed but never restored.
- Fixed
__renderConditionalFormatting crashing when a rule supplied a colour the formatter could not use. Such columns are now skipped, matching the existing warning behaviour. Note that highlight requires a six-digit hex colour.
- Fixed the xlsx exporter throwing on a column group spanning columns outside the exported range, and duplicating a header label by filling a hole in the header matrix from the row below.
- Fixed
expandAllRows in jqx-pivot-table running the expand twice for every non-leaf row, firing a duplicate expand event, and running on leaf rows that expandRow returns early for.
- Fixed
jqx-pivot-table drill-down truncating group labels. An unanchored pattern meant a label such as "Widget (500) Pro" lost its middle, and any label ending in a bracketed number was truncated.
- Fixed sticky column headers in
jqx-pivot-table breaking past nine header levels; offsets are now generated to 24.
- Fixed
pivot.columnSubtotals being documented and honoured by the engine but never declared or forwarded by the Grid, so disabling it had no effect.
- Fixed
docs-overview.js emitting a non-existent smart-webcomponents-vue package in its JSON-LD install step across 68 pages, contradicting the visible install command on the same page.
This entry was posted in Uncategorized. Bookmark the permalink.
|
|