ZK 10.0.0 release notes

Released on Feb 27, 2024


ZK Team is proud to present ZK 10, a major milestone that brings a host of significant enhancements aimed at making your web application development faster, lighter, and more cloud-ready. With a strong focus on performance improvement, user experience enhancement, and cloud-native scalability optimization, ZK 10 introduces several groundbreaking features.

Our innovative stateless components bring in enhanced scalability, auto-provisioning, improved performance, and reduced memory consumption.

The introduction of client-side MVVM shifts the View and ViewModel binding to the client-side, thereby minimizing server-side memory usage and response times.

The transition from JavaScript to Typescript opens the door to smart IDE feedback, offering reliable auto-completion and a more Java-like programming experience for your front-end customization.

Last but not least, we incorporated an enhanced security framework into our CI/CD process, providing proactive protection against potential threats.



What's New

  • New Feature
    • ZK-3853 - Tree supports 3-states selection
    • ZK-4494 - Tree's DOM structure shall provide enough information to decorate lines with CSS
    • ZK-4711 - Upgrade integrated reset.less
    • ZK-4928 - expose widget private functions and variables as public ones
    • ZK-4969 - dropupload supports accept file type
    • ZK-4988 - zEmbedded support for websocket
    • ZK-5018 - Enhance simplified MVVM syntax
    • ZK-5024 - Add a library property to change the default apply composer for MVVM
    • ZK-5039 - remove deprecated classicblue theme in ZK 10
    • ZK-5048 - MVVM DebuggerFactory should log via SLF4J
    • ZK-5049 - Deprecate org.zkoss.zk.ui.uuidRecycle.disabled in ZK10
    • ZK-5075 - Provide override options for TS code
    • ZK-5091 - Move Layout.java to extend from XulElement
    • ZK-5096 - Consider deprecate Anchorlayout and Anchorchildren
    • ZK-5119 - Integrate Font Awesome 6 free icons
    • ZK-5135 - make a client error more helpful for debug
    • ZK-5142 - Handle GET and POST requests more strictly
    • ZK-5158 - Client MVVM restriction check mechanism
    • ZK-5182 - Prevent XSS issue in component attributes
    • ZK-5215 - Support load locale-dependent resources in a relative path
    • ZK-5221 - Show websocket close reason
    • ZK-5228 - Support a IdGenerator for Application-wise, not Desktop-wise for Stateless Component
    • ZK-5265 - Add a CSP provider class, which allows the users to define CSPs and provide a nonce used for strict-dynamic support
    • ZK-5270 - Adjust ID generation mechanism in ZHTML Component
    • ZK-5271 - Client MVVM: Enhance form validation
    • ZK-5354 - Replace animation implementation with CSS
    • ZK-5408 - Enable InaccessibleWidgetBlockService by default
    • ZK-5420 - provide error stack trace for an error happens in an action handler
    • ZK-5422 - Provide some utile APIs to update IComponent Tree
    • ZK-5437 - Upgrade WCAG with the lighthouse 10.x detection tools
    • ZK-5441 - Provide a better way to override za11y module
    • ZK-5459 - Allow Configuration.invokeWebAppInits() to throw a runtime Error
    • ZK-5466 - include Guava instead of closure-compiler
    • ZK-5469 - Make cloudMode true by default for ZK Stateless
    • ZK-5502 - Allow users to customize tooltip on the icon
    • ZK-5503 - Allow users to set multiple icons and tooltips on the same LabelImageElement
    • ZK-5512 - Support for Listening to Space Key Pressed
    • ZK-5516 - change the current month with a keyboard
    • ZK-5517 - change the current year with a keyboard
    • ZK-5527 - Upgrade WCAG with the lighthouse latest version
    • ZK-5531 - Remove Applet, Flash, and FusionChart components in ZK 10
    • ZK-5532 - Remove all unsupported HTML tags in ZK 10 ZHTML
    • ZK-5533 - Add all new HTML5 tags in ZK 10 ZHTML
    • ZK-5541 - Move widget restriction check to Client MVVM
    • ZK-5561 - ZK Websocket Quarkus compatibility
    • ZK-5574 - Review Snyk report
    • ZK-5590 - Reimplement sourcemap in ZK 10
    • ZK-5592 - Deprecate the ancient themes, Breeze, Sapphire, Silvertail, and Atlantic in ZK 10
    • ZK-5595 - Upgrade Servlet version from 2.4 to 3.1 aligned with Java EE 7
    • ZK-5596 - Simplify the JavaScript url when enable embedded mode

  • Bugs Fixed
    • ZK-3543 - Can't wire <apply> with its ID
    • ZK-4355 - timebox' default cols is too small
    • ZK-4973 - tabbox tab.invalidate() loses selected tab
    • ZK-4982 - Listbox (mold select with groups) fail when selecting from serverside
    • ZK-5000 - Inefficient DOM updates for link labels
    • ZK-5005 - pdfviewer some fonts are not rendering
    • ZK-5017 - Listbox head flickering caused by onClientInfo
    • ZK-5025 - redundant selection highlight on a menupopup
    • ZK-5029 - sporadic text wrapping in listbox/grid/tree cells since chrome 90
    • ZK-5035 - listbox renders duplicates checkmark after adding 1st listheader dynamically
    • ZK-5037 - invisible first column hides checkmarks in a listbox
    • ZK-5067 - update internal timezone file
    • ZK-5086 - Should ignore source map file request when the source map is disabled
    • ZK-5089 - AfterSizeEvent doesn't return a correct size of a Window component
    • ZK-5092 - Mac's chrome doesn't work with ctrlKeys feature (Windows works)
    • ZK-5115 - Websocket endpoint registers threadpool, doesn't close, prevents tomcat graceful stop, threads remain after stop
    • ZK-5116 - NullPointerException happened during evaluating an EL expression
    • ZK-5123 - Searchbox open attribute doesn't work while initializing
    • ZK-5138 - Grid row setAlign not work after rendered
    • ZK-5140 - ZK loads vulnerable commons-io transitively
    • ZK-5145 - Chosenbox smart update emptyMessage doesn't work
    • ZK-5151 - Client MVVM - SelectedItem should be sync in Cascader (getter/setter)
    • ZK-5152 - Client MVVM - Cascader should use TreeSelectableModel
    • ZK-5155 - bandbox closes its popup when switching active page
    • ZK-5156 - locale format doesn't keep the fractional part
    • ZK-5159 - Firefox Windows 11 scrollbar doesn't have height, cause missing scrollbar
    • ZK-5161 - page directive's attributes are not encoded before rendering into HTML
    • ZK-5162 - emptyMessage is not escaped with HTML characters
    • ZK-5170 - borderlayout title css rules are missing under sapphire theme
    • ZK-5176 - signature backgroundImage doesn't accept an absolute path
    • ZK-5179 - Custom attributes on template do not resolve after ZK-5002
    • ZK-5180 - Bandbox closes its popup when clicking on day of a datebox
    • ZK-5182 - Prevent XSS issue in component attributes
    • ZK-5217 - Timepicker error in Mobile touch
    • ZK-5218 - inconsistent top position among different window modes
    • ZK-5220 - a listbox without ROD causes a websocket connection to close
    • ZK-5223 - the if element doesn't keep the position of its child component
    • ZK-5235 - opening a menupopup moves a scrollbar of a long menu back to top
    • ZK-5238 - upgrade moment.js to eliminate the security vulnerabilities
    • ZK-5240 - calculation issue in tpad cause grid to render entire content at once
    • ZK-5252 - a modal window doesn't focus on its first focusable child
    • ZK-5253 - title of borderlayout north/south shouldn't rotate 90 degrees
    • ZK-5256 - classloading issues with multiple war files
    • ZK-5257 - Ignore unused component NoClassDefFoundError such as jasperreport component
    • ZK-5258 - setFocus() doesn't work on a textbox in a modal window
    • ZK-5260 - chosenbox options don't escape HTML characters
    • ZK-5261 - forEach always re-renders all items
    • ZK-5266 - Client MVVM: Using parameters in Getter
    • ZK-5267 - Client MVVM: ForEach support map iteration
    • ZK-5268 - Client MVVM: Force load binding to reload
    • ZK-5269 - Client MVVM: Processing Binding Order
    • ZK-5272 - Client MVVM: support el expression (${...})
    • ZK-5275 - Client MVVM: Support widget properties in command expression
    • ZK-5278 - Client MVVM: handling huge data
    • ZK-5280 - Client MVVM: Missing orientation when using Hbox in template
    • ZK-5281 - Client MVVM: JS error when using expression "each" in load binding with attribute "forEach"
    • ZK-5282 - Client MVVM: Selection missing in Listbox
    • ZK-5283 - Client MVVM: Listbox/Grid Rod
    • ZK-5284 - Client MVVM: converter in template
    • ZK-5287 - Client MVVM: Rerender template causing apparently flickering
    • ZK-5289 - Client MVVM: Layout/Dimension changed when Template rendering
    • ZK-5290 - Client MVVM: Multiple @init and @load
    • ZK-5292 - Client MVVM: @ScopeParam shall support custom attribute
    • ZK-5293 - Client MVVM: Remote EL should pass evaluated value
    • ZK-5294 - Client MVVM: Tree model rendering
    • ZK-5295 - Client MVVM: validation exception when validate empty string value as number
    • ZK-5297 - Client MVVM: Array/Collection/Map toString in Client side should be the same as Java
    • ZK-5298 - Client MVVM: Conditional Binding should work as original behavior
    • ZK-5299 - Client MVVM: Grid/Listbox collection model rendering
    • ZK-5300 - Client MVVM: wrapped object should display string value in label
    • ZK-5301 - Client MVVM: Form binding save and validation
    • ZK-5303 - Client MVVM: Form should call NotifyChange automatically
    • ZK-5304 - Client MVVM: Listbox/Grid model rendering by Map
    • ZK-5306 - Client MVVM: Unable to evaluate expression of validationMessages
    • ZK-5307 - Client MVVM: Wrong behavior when using SmartNotifyChange/NotifyChange on Setter
    • ZK-5309 - Client MVVM: exception when doing Jackson serialization
    • ZK-5310 - Client MVVM: Long operation with server push and Event queue does not work
    • ZK-5311 - Client MVVM: Paging does not work
    • ZK-5313 - Client MVVM: GroupsModel
    • ZK-5314 - Client MVVM: Support widget properties in property binding
    • ZK-5315 - Client MVVM: load property binding only works at the first time
    • ZK-5316 - Client MVVM: unable to evaluate nested List
    • ZK-5317 - Client MVVM: Rendering fail in shadow elements
    • ZK-5319 - Client MVVM: Displaying WrongValueException
    • ZK-5320 - Client MVVM: serialization and deserialization
    • ZK-5321 - Client MVVM: List Object with Jackson serialization
    • ZK-5323 - Client MVVM: converter and command param in Form binding
    • ZK-5328 - Client MVVM: If and Unless EL condition at client
    • ZK-5329 - Client MVVM: Event Conversion
    • ZK-5330 - Client MVVM: Processing bindings should follow widget tree
    • ZK-5334 - Client MVVM: custom attribute in template
    • ZK-5335 - Client MVVM: List data support basic API
    • ZK-5338 - Client MVVM: Missing widget string attribute information
    • ZK-5339 - Client MVVM: Bindings in zhtml
    • ZK-5344 - Client MVVM: miss client attribute w:onClick
    • ZK-5346 - Client MVVM: Linelayout
    • ZK-5356 - Client MVVM: NotifyChange in Collection
    • ZK-5359 - Client MVVM: non-existent map key should not throw exception
    • ZK-5361 - Client MVVM: zscript in included page
    • ZK-5362 - Client MVVM: Nested ViewModel
    • ZK-5363 - Client MVVM: Native content in template
    • ZK-5365 - Client MVVM: Widget Rendering in Include
    • ZK-5367 - Client MVVM: command param in global command
    • ZK-5368 - Tree with client-ROD fails to replace treerow if parent is currently not rendered
    • ZK-5370 - Client MVVM: invalidate components
    • ZK-5371 - Client MVVM: onCreate event
    • ZK-5376 - Client MVVM: Proxying ViewModel Annotations
    • ZK-5377 - Upgrade GA code
    • ZK-5379 - Floating scrollbar prevent anchornav from scrolling
    • ZK-5382 - Wrong shadow insertions after shadow tree merged
    • ZK-5383 - Client MVVM with Fulfill feature
    • ZK-5385 - Client MVVM: Tree selection status
    • ZK-5393 - Update ZK jars to jakarta-friendly uploads
    • ZK-5400 - Client MVVM: forward="onClick=another.onOK" doesn't work
    • ZK-5403 - Client MVVM: EL3 syntax
    • ZK-5411 - withAction() cannot accept anonymous class, please convert it to Lambda syntax
    • ZK-5412 - Desktop of stateless components is not cleared after reloading [CloudMode]
    • ZK-5414 - onTimer event causes a cascader to close its next level items
    • ZK-5424 - Client MVVM: Shadow Element should handle ListModel case
    • ZK-5426 - pdfviewer cannot display some texts
    • ZK-5434 - Datebox show different time when running with -Duser.timezone="America/Mexico_City"
    • ZK-5435 - desktop timeout config doesn't work as expected
    • ZK-5439 - Remove outdated GA info in Eval version
    • ZK-5450 - 2 NEXT_SIBLING for targetId don't pass the expected value
    • ZK-5453 - xss in chosenbox
    • ZK-5454 - nextSibling locator doesn't work in smartUpdate()
    • ZK-5462 - empty listbox fails to pass lighthouse accessibility check for missing required role
    • ZK-5463 - empty tree fails to pass lighthouse accessibility check for missing required role
    • ZK-5468 - Components with Model only renders one item with wrong result if the EL contains forEachStatus.index
    • ZK-5476 - client mvvm failed for a tree
    • ZK-5480 - Cascader doesn't display selected item if set before render after ZK-5414
    • ZK-5483 - select all throws an exception if the model is empty
    • ZK-5488 - Biglistbox's Elements with an ARIA [role] that require children to contain a specific [role] are missing some or all of those required children
    • ZK-5489 - Linelayout's Elements with an ARIA [role] that require children to contain a specific [role] are missing some or all of those required children
    • ZK-5490 - Grid's [aria-*] attributes do not match their roles
    • ZK-5491 - Multislider and Rangeslider's [aria-*] attributes do not match their roles
    • ZK-5492 - The elements with an id of 'tpad-tbl' and 'bpad-tbl' do not have the correct role
    • ZK-5493 - [user-scalable='no'] is used in the <meta name='viewport'> element or the [maximum-scale] attribute is less than 5
    • ZK-5494 - Background and foreground colors do not have a sufficient contrast ratio
    • ZK-5498 - Some checkboxes do not have [aria-checked] attribute, and they do not have accessible names
    • ZK-5522 - CommonFns.formatNumber() doesn't handle null as javadoc mentions
    • ZK-5525 - Checkbox tristate [aria-checked] attribute missing "mixed" state
    • ZK-5529 - Tree focus is lost after loading new rows
    • ZK-5530 - users cannot focus on the icons on the Calendar header
    • ZK-5535 - TrackerImplEx#removeAllReference accesses map value by iteration instead of key, lowers performance
    • ZK-5537 - Client MVVM: Open state in TreeModel
    • ZK-5539 - $init() will call twice on Keikai component
    • ZK-5540 - zk.wpd with browser condition won't work with ZK 10
    • ZK-5564 - listbox ROD doesn't work with client mvvm disabled
    • ZK-5565 - client mvvm fails to work with a listbox and ROD false
    • ZK-5566 - select an item in a searchbox produces a js error
    • ZK-5569 - Radiogroup onCheck event type mismatch
    • ZK-5573 - welcome-file might cause an infinite redirect
    • ZK-5575 - Using Client MVVM and Server MVVM in the same ZUL
    • ZK-5579 - Listbox always renders the same set of items under ROD enabled [Client MVVM]
    • ZK-5582 - Listbox only renders 50 items with client mvvm
    • ZK-5593 - inputWidget bind_ accesses input dom node, may not exist
    • ZK-5598 - CKEditor requests ExecutionImpl.encodeURL with null value, causes NPE in embedded mode
    • ZK-5601 - Client-bind causes page with charts to fail to load without mvvm bindings
    • ZK-5603 - Client-mvvm boolean false handling is different from server-side
    • ZK-5605 - client-bind fails for zk.$extends created widget classes, without ClientBindComposer declared
    • ZK-5622 - Disallow Doctype causes parsing error if xml config contains DOCTYPE
    • ZK-5630 - checkbox doesn't render a checkmark
    • ZK-5633 - client mvvm crashes a browser when model is large
    • ZK-5634 - Page will fail to load with a searchbox when source map is enabled
    • ZK-5635 - textbox cannot focus on iPad/iPhone
    • ZK-5636 - fail to toggle grid's detail on iPad/iPhone
    • ZK-5638 - Client MVVM listbox IndexOutOfBoundsException when first Model.addAll()
    • ZK-5639 - stepbox wrong color update
    • ZK-5644 - Cannot read properties of undefined error after adding stateless.jar
    • ZK-5647 - Wrong groupbox layout on touch screen
    • ZK-5649 - zk doesn't recreate a template when notifying a template's parameters
    • ZK-5650 - cannot upload an image under websocket

  • Upgrade Notes
    • The Java binary-compatible level is Java 11 since ZK 10. Please use Java 11 or a higher version.
    • ZK 10 is compatible with modern browsers; IE11 (and lower IE versions) are no longer supported
    • We cleaned up many deprecated APIs in ZK 10; You can use the Java compiler to help you locate removed APIs in your Java files and use ZK Linter to check the removed attributes in your zul files. See also Removed API.
    • Enable InaccessibleWidgetBlockService by default in EE version. Note that it will block Echo Event if the component is disabled or invisible. You can configure it using the library-property org.zkoss.zkmax.au.IWBS.disable.
    • Upgrade 3rd party optional dependencies: closure-compiler(v20230802), groovy(5.0.0-alpha-1), gson(2.10.1), jackson-databind(2.15.2), rhino(1.7.14), jasperreports(6.20.5). Drop the itext dependency.
    • Refine ZK-3277 to enable multipart file uploads into AUEngine and removed AuUploader.java and AuDropUploader.
    • Support ZK-3277 into CE version, and drop the support of IE9 browser for file upload feature, due to it cannot support HTML FormData.
    • Some z-class names are changed, z-combobox-emptySearchMessage becomes z-combobox-empty-search-message and z-combobox-emptySearchMessage-hidden becomes z-combobox-empty-search-message-hidden
    • Disable UUID recycle mechanism by default.
    • With the fixed of ZK-5435, the desktop timeout mechanism will clean all expired desktop instances by a timer per session if the setting is enabled. (By default, it's enabled with 1 hour).To disable the cleaner timer per session, you can specify -1 to the desktop timeout value to disable the mechanism.
    • Remove outdated Acronym, Big, Center, Dir, Font, isindex, Nobr, Param, Rtc, and Tt in ZHTML module
    • Remove Applet, Flash, and FusionChart components
    • Deprecated org.zkoss.zk.ui.uuidRecycle.disabled
    • Remove Acegi and Hibernate integration utiles in zkplus module
    • Upgrade Font Awesome version from 4.7.0 to 6.4.2, previous iconSclass syntax will continue to be supported
    • ZSciprt using python and the corresponding jython dependency are now optional.
    • upgrade commons-fileupload to commons-fileupload2-javax 2.0.0-M2 and commons-io to 2.13.0 to support jakarta-friendly uploads.
    • Now it is not allowed to use positional and non-positional parameters together in MVVM command binding.
    • ZK's corresponding features now require Java EE 7 API level, including: Servlet 3.1, Bean Validation 1.1, EL 3.0, and JSP 2.3.
    • Remove all deprecated Java APIs and the legacy module "zkplus-legacy".
    • org.zkoss.zk.ui.util.ForEachStatus#getEach is removed, use org.zkoss.zk.ui.util.ForEachStatus#getCurrent instead.
    • Use /zkEmbedded url (or specify yourself) to simply include embedded.js, instead of specify the real path to embedded.js, simplifying the source to enable embedded mode.
    • The setContent() method of Comboitem, Menu, and Navitem now only accepts a safe HTML content. i.e. The content will be sanitized before rendering, please don't use JavaScript content.
    • zEmbedded supports WebSocket under the condition that only one ZK page can be embedded into a non-ZK page when WebSocket is enabled.
    • Upgrade zkdiffer to 0.8.0.
    • Upgrade _reset.less to normalize.css v8.0.1
    • Security Enhancement in XML Parsing: To prevent XML External Entity (XXE) attacks, we've updated our XML parser to disallow Doctype Declarations, enhancing security without affecting normal XML processing.