- Tollium applications may not have multiple feedback/work objects open.
- If a Tollium Submit() handler leaves a work object open, that work object has failed, and it returns a default value, Finish()
is invoked on it anyway to make sure the errors are displayed to the user, and to allow Submit() to just return a default
value upon error instead of tempting a
RETURN work->Finish(), DEFAULT RECORD;construct
- WRD can no longer directly import WRD schemas created in versions before WebHare 4.03. Use that version to import and reexport such schemas, or you may have issues properly importing WRD_TITLEs
- CGI and script interpreter (eg. php files) support has been dropped. If you need this, contact us for workarounds, almost all situations can still be supported using access rules now (most of CGI support was already driven by HareScript anyway)
- Return statements in asynchronous functions now must return a value ('return;' is disallowed).
- wrd/website/sessions.whlib and wrd/website/login.whlib are no longer supported
inline-base64::namespaces which allow you to declare small resources inline. This is mostly useful when writing tests.
The google and socialite modules are now part of the WebHare core.
- The socalite module will be permanently integrated. The upgrade will delete your current socialite module
- The google module will be a 'substitute' module. It will only be available if it was already installed on the server, and deleting the google module will disable the 'built-in' version. Future versions of WebHare will merge all google module functionality back into the socialite module, after which the google module will be removed.
<eventlistener>s now never coalesce events generated by the same VM to ensure eg. lists always update right away
- Submit() functions in screens may no longer be a MACRO
- Submit() functions in screens can now return any type, not just BOOLEAN. If submit returns a default value (FALSE, an empty string, DEFAULT RECORD, etc) it will be considered to have failed and the dialog will not close.
- Screens can now be invoked through RunScreen, which wraps LoadScreen and RunModal. RunScreen will return Submit's value, or a default value of Submit's returntype if the dialog was cancelled.
- Add 'eventmasks' to
<list>allowing you to directly setup the invalidation for a list
- Add 'ongetrows' to
<list>which is allowed to return a complete set of rows, including children.
- Start some much needed low-level tests for the list component
- Screens can define a
NEW(RECORD data)constructor which will receive the screen's parameters (which are also passed to
- List/Arrayedit add support for custom buttons/actions
- Arrayedit adds RunAddRow allowing you to run the add-row process with prefilled data
- CompositionBase (eg record) now accepts incomplete records and will leave unspecified cells alone
Website and module development
mod::namespace has been introduced, with
mod::<modulename>/pointing to the root of that module. moduledata::, modulescript:: and module:: are now just aliases
- For consistency with how most webdesigns are set up, the root
includefolder for a module can now be renamed to
@webhare-<mod>/...is still supported for existing modules, but you should switch to simply
- The emailcomposer can now receive from,to,cc etc settings through
<meta>tags in the email HTML files
MatchLanguageto webdesign for easier languagecode matching
- A new, cleaned up WRD api has been introduced in
- Asynchronous functions can now be declared with 'ASYNC FUNCTION()', so the type specifier OBJECT is no longer needed. Also, 'ASYNC MACRO' can also be used.
- Added spread syntax support in arrays and record constants (eg. a := [ 1, 2, ...list ])
- Added new syntax to declare arrays: INTEGER[ a, b, ...c ] to declare an integer array (also, VARIANT ARRAYS can now be specified using VARIANT[ "a", 1 ] syntax).
- Added new syntax to declare records: CELL[ a := a, b, "c" ]. As shorthands, a single variable will be included with its name as key, and a string will be included with its value as key. CELL[ ... ] will always return an existing record, so CELL can be used as MakeExistingRecord().