Added
5.24.12 2024-04-23
- new icons:
u-icon-code
u-icon-deploy
u-icon-curly-braces
5.24.11 2024-04-16
- added check that pasted text contains only printable characters. For <textarea>
\n is also allowed. For CodeMirror - \n and \t.
Attempt to paste non-printable characters throws ERR_UNPRINTABLE_CHARS exception
5.24.10 2024-04-10
5.24.9 2024-04-05
- new icons:
u-icon-stamp
u-icon-file-import
u-icon-barcode
u-icon-qrcode
u-icon-compress
u-icon-file-zip
u-icon-file-zip2
u-icon-email
u-icon-email-profile
u-icon-email-settings
Fixed
5.24.12 2024-04-23
- allow paste text what contains
\r (in addition to \n) for <textarea>
5.24.8 2024-04-01
UTableEntity fixed webDav.getURI method call - added await
Changed
5.24.80 2024-04-10
PDFComponent: added fallback to @unitybase/pdf-viewer on Ext.form
Added
5.24.5 2024-04-23
- added an example of using the call
App.dbConnections.execParsed method to execute a stored procedure with
output parameters (ODBC driver, UB 5.24.11)
Fixed
5.24.3 2024-04-16
- LocalDataStore doFiltration method instantly returns empty array, when input is an empty array
5.24.2 2024-04-05
LocalDataStore.whereListToFunctions: do not fail for 1=1 and 0=1 custom conditions for cached entities
They likely were assigned as always negative or always positive ones inside the CustomRepository.where()
Added
5.24.9 2024-04-23
- Localization for server error
ERR_SET_REFERENCE_ERROR, which means insert / update a record, which
contains reference to a non-existing entity
5.24.7 2024-04-10
- added
502 Bad gateway server-side error response handling - now instead of unhandled exception client throws
ERR_WAITING_SERVER_TO_START message and global error handler translate it as
The server is undergoing short routine maintenance. After 1-2 minutes, you will be able to continue working without losing data and reloading the page. If the error occurs again, reload the page
- for
index page and in case nginx is used as a reverse proxy - HTTP 502 error will be redirected to /models/cust/502.html or /models/ub-pub/502.html page (if 502.html not found in cust model)
- added i18n for
requireDigitalSignature (used in pki interface for Ukrainian cryptography)
UbPkiInterface: added setAllowPrivateKeyCache method, added parameter clearCache for closePrivateKey method
For a while, implemented in @ub-d/iit-web-crypto only
Changed
5.24.8 2024-04-16
- Improvements in
LocalRepository class:
- Now it is not required to pass
rowCount, which may be implied from the data array length
- Added support of the
#maxdate macro in LocalRepository class for mi_deleteDate attributes, for example:return UB.LocalRepository(
{
data: attributes.map(({value, label}) => [value, label, '#maxdate']),
fields: ['code', 'name', 'mi_deleteDate']
},
'frm_Attribute'
)
.attrs('code', 'name', 'mi_deleteDate')
.orderBy('name')
This will return the value mi_deleteDate, which corresponds to the not deleted rows.
- Added support for initializing from array of objects, for example:
const data = [
{code: '1', name: 'One'},
{code: '2', name: 'Two'}
]
return UB.LocalRepository(data, 'frm_Attribute')
.attrs('code', 'name')
.orderBy('name')
If entity contains mi_deleteDate and data objects do not contain this attribute,
the data store will be extended with the mi_deleteDate attribute with the value #maxdate.
Added
5.25.22 2024-04-05
- metadata loader will throw on server startup in case metafile with localization contains mapping for either an entity or any attribute
Changed
5.25.24 2024-04-23
App.*Cache* functions family signature changed - last parameter ignoreTenants of type boolean replaced by options Object.
This should not break an existed applications, since ignoreTenants is used only by ubq model af far as we know.
The new options object allows us to be more flexible in the future. For a while a most important additions are:
options.nx - if true only set the key if it does not already exist. Can be used to atomically set value
options.px - REDIS backend only. Set the specified expire time, in milliseconds (a positive integer); 0 - not expired
Example:
// old code
if (App.globalCacheGet(GLOBAL_CACHE_KEY) === '1') {
console.warn('SCHEDULER: task %s is already running', taskName)
return false
App.globalCachePut(GLOBAL_CACHE_KEY, '1')
try {
// run a sceduler
} finally {
App.globalCachePut(GLOBAL_CACHE_KEY, '0')
// new code
// use nx option (Put if Not Exists) instead of get + put to atomically validate what task is not running
// in case of Redis backend px option prevent key to be stored forever if server crashes
if (!App.globalCachePut(GLOBAL_CACHE_KEY, '1', { nx: true, px: ONE_HOUR_MS })) {
console.warn('SCHEDULER: task %s is already running', taskName)
return false
try {
// run a scheduler
} finally {
App.globalCachePut(GLOBAL_CACHE_KEY, null) // remove key
5.25.21 2024-04-01
- multi-tenancy: new parameter
ignoreTenants added to App.globalCacheGet, App.globalCachePut, App.memCachePut
and App.memCacheGet. By default, it's false, so in case of multi-tenancy environment both global and in-mem cache
will be separated by tenantID (keys will be appended by ':tid'+tenantID).
In case ignoreTenants=true keys are global (:tid not added). Require UB@5.24.9
Added
5.24.6 2024-04-16
- new system role
ServiceAccount. For a while user with ServiceAccount role will ignore 2FA and not allowed to use UI.
In future some other rules can be applied to ServiceAccount role
Added
5.25.27 2024-04-16
DDL generator: for Oracle database VARCHAR2(4000) column will not be altered to NVARCHAR2(2000) - first one is
used to store Document attributes in some old projects
5.25.26 2024-04-10
ubcli generateNginxCfg will add redirection to custom "Maintenance" page in case server is down (502 Bad Gateway).
Default page can be replaced by 502.html in cust model.
5.25.25 2024-04-05
- new command
ubcli crypt certParse path/to/file.cer - parse binary certificate and output it content as JSON into stdout.
Can accept folder ubcli crypt certParse path/to/folder/ - in this case will parse all files on folder
5.25.24 2024-04-01
ubcli generateNginxCfg now can accept -r, -l, -sslkey, -sslcert and -maxDocBody command line parameters
as environment variables UB_SSLREDIRECT, UB_LB, UB_SSLKEY,UB_SSLCERT and UB_MAXDOCBODY.
This allows to avoid writing custom lifecycle/ub-app-upgrade.sh script. Example:
UB_SSLREDIRECT=true \
UB_LB=true \
UB_SSLKEY="/etc/letsencrypt/live/myapp.mydomain.com/privkey.pem" \
UB_SSLCERT="/etc/letsencrypt/live/myapp.mydomain.com/fullchain.pem" \
UB_MAXDOCBODY=70m
ubcli generateNginxCfg
ubcli generateNginxCfg -r -l -optimistic \
-sslkey /etc/letsencrypt/live/myapp.mydomain.com/privkey.pem \
-sslcert /etc/letsencrypt/live/myapp.mydomain.com/fullchain.pem \
-maxDocBody 70m
ubcli migrate now can accept -optimistic command line parameter as environment variable UB_OPTIMISTIC.
This allows to avoid writing custom lifecycle/ub-app-upgrade.sh script. Example:
UB_OPTIMISTIC=true ubcli migrate -u root
ubcli migrate -u root -optimistic
Changed
5.24.5 2024-04-01
- adopt scheduler to changes in
memCacheGet|Put for multi-tenancy environment
Fixed
5.24.8 2024-04-23
- fixed possible suspension of execution of a schedulers task what marked as
singleton in case redis is used as a globalCache
backend and server crashed during task execution.
Now model sets a globalCache mark that indicates the task is being performed with a one hour TTL, so even server cash,
the mark will disappear instead of staying in redis forever
5.24.5 2024-04-01
ubs_numcounter.getRegnumLoosely: fix possible range intersection for loosely counter in case of several
server instance (either load balancing or separate scheduler)
Added
5.24.7 2024-04-05
ubs_settings.loadKey now internally uses globalCache (cache is flushed after value is edited, so restart do not required).
This can dramatically reduce DB queries count in some existed scenarios (we saw 25 DB query per second into ubs_settings).
For a multi-instance deployment what require edition of ubs_settings in runtime redis must be configured as a globalCache storage
Fixed
5.24.8 2024-04-10
ubs_setting cache flush happens now even if fieldList on insert/update does not contain "settingKey"
5.24.7 2024-04-05
- softLock mixin: on before update - renew lock if it is not exists instead of throwing an error, because in long transaction lock can expire
- fixed
ubs_numcounter.getRegnumLoosely if called without startNum parameter and key not exists (added default startNum=0)