Table Of Contents

Upgrading to 10.1

Software Requirements

To run Calpendo version 10.1, you should use:

It is also recommended that you do not run your database with the default value of innodb_buffer_pool_size, which is 128MB. This is because we can run out of database locks which causes issues. Increasing innodb_buffer_pool_size means this is less likely to be a problem.

You should have a setting like this:

innodb_buffer_pool_size = 2G

applied in your MySQL or MariaDB settings. The actual figure you use will need to depend on the amount of RAM you have, and so won't necessarily be the 2GB shown.

See the MySQL or MariaDB documentation.

Before Upgrading To Version 10.1

If you are upgrading from version 9.0.x or earlier, then:

If you are upgrading from version 10.0.x to 10.1, then:

How To Perform The Upgrade

Upgrading from any version to the latest (including applying bug fix updates) should be done with the following procedure:

Downgrading between major releases is not normally supported, and downgrading from 10.1 to 10.0 is not supported. The general procedure for downgrading is:

Do not merely load an old database on top of an upgraded or partially upgraded database and run an old Calpendo. It will break things, but possibly not until you come to do another upgrade, by which time it may be too late to fix things easily.

If Things Go Wrong

Locate The Log File

Upgrades from 10.0.x are unlikely to go wrong. If you're upgrading directly from 9.0.x, then there is a greater chance of an error during the upgrade as it performs many changes to the data.

The most useful thing to do is to be able to locate the log file generated during the upgrade. If you're using Linux, then it may be in one of these directories depending on your distribution:

The name of the file will depend upon the setting in your WEB-INF/classes/log4j.properties file that you might have customised when first installing Calpendo. The default name is "calpendo.log", which means the log file may be in /var/log/tomcat*/calpendo.log (with the exact name of the directory depending upon your distribution and the version of tomcat installed).

Please send a copy of the log file to support@exprodo.com so that we can help diagnose and fix the problem.

Database Restarts During Upgrade

If the database server stops and restarts during the upgrade, then it may be that MySQL/MariaDB require a large buffer pool size. This requires a similar to this:

innodb_buffer_pool_size = 4G

See the MySQL or MariaDB documentation.

New Features

Clinical Trials Management System (CTMS)

This is a new module that provides support for running clinical trials with Calpendo.

This means that all the behaviour that was present in Calpendo's sister application, Exprodo SDM (Study Data Management), has been incorporated into Calpendo as a module, but this goes further.

This means:

Formatting Numbers

You can now put a format specifier on any numeric property in a layout and also in the bakery.

This allows you to use a format like $#,###.00 to force a number to have a certain number of decimal places and a thousands separator.

If you don't specify a format in a layout, then the format (if any) in the bakery will be used.

When data is displayed on screen in a report, then the format in the bakery will be used.

The layout format is not used for reports.

Page History

There's now a page that will show the history of recent pages that you've visited. You can reach the page by selecting the new menu item Help->Page History or by clicking the link in the top-right corner of every page that shows the name of the current page.

Note that this history is not saved to the database, and it is not shared between browser tabs.

Database Analysis

When one logs in as a root user, you can now see an additional tab of the bakery's database analysis tool that provides foreign key constraint analysis.

All foreign key constraints are checked to see if they appear to be properly defined and required. Any that appear erroneous have a button that can be clicked to delete them.

After deleting foreign key constraints, one should click the "Update DB Schema" button so that new foreign key constraints can be generated, if they are required.

The part of the database analysis tool that shows the tables and columns has also has its accuracy improved. This includes separating the information on the property name associated with each database column into two columns. One for the name of the property, and one for a description. The description of a property is sometimes text generated by the tool to describe it, and sometimes the label for a user-defined property.

Layout Changes

The layout editor has a new option for how to display a tab of properties.

The old option "Simple table" has been relabelled "Standard table", but is otherwise unchanged.

There's a new option "Plain unstyled table" that behaves the same as "Standard Table", but does not show alternate rows with a different background colour, or change the row highlight as your mouse passes over it.

This means it is a simple table that you can style, or not, as you desire.

Custom Permissions Messages

Historically, we have always had a "permission denied" standard message when an action has been prevented due to permissions. There are some specific scenarios in which a custom message is provided, but there was no way to configure a permission to provide a particular message to users. We now allow such messages.

The messages can be used in two ways:

  1. When a button is greyed out because of a permission, then the button's tooltip may contain the message from the defining permission.
  2. When a "Permission denied" message is displayed, then the defining permission's message may be included in the message.

Note that this is not a perfect system for displaying messages that explain why you cannot do something. There are several reasons for this:

Another thing to notice is that if you wish to provide good messages to people, then it may be that you should create more permissions than you would otherwise require.

For example, if you want to prevent somebody from deleting any instance of a particular data type, then you might do so with a fallback permission that applies to many data types.

However, you might add extra permissions specifically targeted at that data type just so that you can provide a custom message for what somebody sees when trying to delete an instance.

If you have many permissions, and you want to avoid or delay setting a good message on all of them, then there is another option. You can now also arrange for the name of the permission to be displayed when a permission is seen to be the cause of a permission denied error, and there is no custom message specified on the permission itself.

This is not necessarily something you would also want turned on because permission names may not have been configured with this use in mind. As such, the language it uses is probably not the same as you would choose to use as an error message.

Nevertheless, it can be useful for short term debugging situations.

To enable this, follow these steps:

com.springsolutions.perms.core.PermissionCache$PermissionsResult

If you want this disabled again, then repeat the process, but now set the verbose property to false.

Database Supplied Values

For a very long time, you've been able to mark properties in the bakery as being automated. This means that a value will be set for it somehow, and the user will never be able to provide a value. Typically, you would do this when the value is going to be assigned by a workflow.

There's another class of property though, where no value is set by Exprodo at all, and the value is generated in the database somehow. This might be via a database column defined as an auto-increment, or by an external process that assigns a value through a script or something else.

In these cases, we'd like Exprodo to be told the value is externally provided so that it never allows a value to be written to the database, either by the user or by a workflow.

For this, there is now a new attribute you can set on a PropertyDef in the bakery called"Database Supplied".

If you set this to true, then the property will also be marked as automated. A user won't be able to specify a value for it. A workflow will be allowed to set a value on the property, but that value will not be written out to the database.

A typical scheme would be to set up a column that is an integer that automatically increments each time a new object is created. We used to use this for the id of every biskit. However, the upgrade to version 10 means those ids became 64 bit integers instead of 32 bit integers, and the ids now encode the data and time when the id was generated.

If you want a simple incrementing integer property on a biskit, then you would create an integer property and mark it as database supplied. You would then configure it in the database to be auto-incremented. For example:

alter table YOURTABLE add YOURCOLUMN int(11) not null auto increment unique;

Alternatively, if you have rows in the table that existed before the upgrade to version 10, and you want to make the new auto-increment column have the value of the original id where possible, then you can do so with this:

alter table YOURTABLE add YOURCOLUMN int(11) default null;
update YOURTABLE set YOURCOLUMN=YOURID>>10 where YOURID < 54000000000;
set @number=(select max(YOURCOLUMN) from YOURTABLE);
update YOURTABLE set YOURCOLUMN=(@number := @number + 1) where YOURCOLUMN is null;
alter table YOURTABLE add UNIQUE KEY `UK_YOURTABLE_YOURCOLUMN` (`YOURCOLUMN`);
alter table YOURTABLE change YOURCOLUMN YOURCOLUMN int(11) NOT NULL AUTO_INCREMENT;

In all of the above:

NOTE: If you mark a property as being database-supplied, then you must also mark it as being fully automated. If you do not, then you will be given a validation error on trying to save your changes.

String Column Type

A MySQL/MariaDB table row is limited to the size each row can consume, with different kinds of limits applying. Each column takes up some of this, depending on what type of column it is.

A StringEnum property is defined as a "varchar(255)" and takes 255 bytes, or more if it is defined as a utf8mb4 column.

A String property is defined as a "longtext", which can store more than the 255 characters of a varchar(255), but it only adds 9 to 12 bytes to the space taken in a row because the data is stored in a separate buffer.

This makes longtext properties slower, but the extra space is sometimes required.

We don't recommend using many StringEnum properties, because we prefer to use a MappedInt instead. But if you do, then you will quickly run out of space if you have many StringEnum properties on one biskit.

Also, you might sometimes want a string property that is more cpu efficient, and so defined as a varchar instead of a longtext.

For this, there's a new option in the bakery. For any StringEnum or String property, you can now specify the column type. The options provided are:

If you choose "Varchar", then you will get a "varchar(255)" column, unless you also specify a "Maximum Value", and then that will be the length of the varchar instead of 255 (as long as you choose a value more than zero and less than 10000).

If you choose "Text", then you will get a "longtext" column.

If you choose "Default", then you will get a "varchar(255)" on StringEnum properties and "longtext" on String properties.

Dark Theme

There is now a theme to provide a dark mode. You can make this the default for everybody in global preferences, and individuals can turn it on for themselves using the Settings option in the top-right corner of every page.

Go to the "Appearance" tab, and then select the skin called "Themes/Builtin/Dark" and save.

Note that the colours displayed in the background of the bookings calendar and for the bookings themselves are not defined by the theme. To control these, you can go to your personal settings and choose calendar background colours on the "Calendar View" tab. Global colours for this are set in the global preferences on the "Bookings" tab. Also, colours for the bookings themselves are controlled on the calendar.

Themes have been expanded to enable dark mode to work effectively, so that there are now more items that can be set. You will be able to see these in the theme manager. They are:

Workflow Changes

New Workflow Functions

The following new functions have been added that only exist when the CTMS module is loaded:

Workflow Debugger Changes

Triggers Tree Drop-Down Menu

In the workflow debugger, the tree showing all the workflows, events and actions involved in a recording appears in the bottom left corner.

When you click on an action or event in there, it gives a pop-up menu showing "Continue to here" and "Reverse to here".

These were a little confusing and have been renamed.

Also, there are now menu items to go to the first or last time the selected action was executed in the recording.

The options in the pop-up menu are labelled "Go to first call", "Go to last call", "Go to next call" and "Go to previous call"

Browser Refresh Remembers Search Options

When using the workflow debugger, there are times when it's useful to be able to refresh the browser and have it go back to the same search options it had before.

Whenever you now search for recorded workflow frames, the URL updates to reflect your search conditions so that refreshing the browser will rebuild the conditions.

Frames-by-Type Tab

When you have a recording of a workflow, it can be confusing to have an appreciation for the content of the recording and which frames are active for each action.

To help with this, there's now a tab that lets you see things like what biskit update actions are there, and which frames run a biskit update, and which frames run a particular biskit update.

This is a new tab that shows a tree with all the event/action types, then beneath that listing all the instances of that type, and then below that list all the frames for that event or action.

Frame Selection History Tab

When navigating around a recording of a workflow in the debugger, you can find yourself skipping around in different parts of the recording (that is, viewing different frames).

When you do this, it would be useful to be able to go back to a frame you've previously viewed.

To help with this, there's now a new tab that shows the history of all selected frames so you can easily see the history and select something from the history

Recording On/Off Time Limit

In version 10.0, recording was either on or off globally or for individual workflows. This has now been extended so that there is a time limit for how long recording will operate for. Also, you can now turn off recording for individual events and actions if you want to.

The global recording time limit and workflow-specific recording time limit are both set in the workflow debugger.

You can also see and change the workflow-specific recording time limit in the workflow manager by looking at the "Debug" tab for a workflow.

To see and change the settings for an individual event or action, click on it and then look at its "Debug" tab.

The selection of whether to record an event, action or workflow is not a property of the workflow, but is stored separately. This means a change in the recording settings does not result in a new audit log entry for the workflow itself. You will, however, see audit log entries for Workflow Debug Setting, and its three subtypes:

Calendar Changes

There have been a few changes to the calendar displays.

Date Navigation On The Calendar

The month navigator shown in the top-left corner of every calendar page has had a facelift. It now allows direct month and year selection for the displayed calendar month.

If you want to display bookings for a date that's not near to today, then you would previously have had to use a button to move a month at a time.

You can now move a month at a time, or a year at a time, and you have a drop-downs to go directly to the required month or year.

Booking Layout

The booking pop-up on the bookings calendar now displays using a customizable layout.

Use the layout editor to specify the layout to be used for each booking subtype.

There's a default layout for Booking that specifies that it should use a "Plain unstyled table" so that this looks almost identical to the old version of the booking pop-up.

Bookings seen in the search page now display the same as the bookings calendar pop-up.

In previous versions, we have discouraged editing bookings from a search page because it did not work very well, and wasn't the same editor as you saw in the bookings calendar. This is now changing so that you can edit from either place without a problem.

The rule validator currently still uses the old method of display because it is more liberal in the input it accepts.

Booking Colour On The Calendar

For a while now, there's been a property on projects that allows you to set a colour. This colour can now be used on the bookings calendar to display the title bar of bookings.

To enable this option, there's a global preferences option on the Bookings tab in the "Format for Bookings on the Calendar" section.

You can choose between the resource indicating the colour (which is the default and the way it always has been) and using the project's colour.

On resources that do not require a project, it will continue to be the resource colour that is used.

Booking Show On Calendar

Any property that references a booking now has an icon next to which, when clicked, will display that booking on the calendar. These are known as "show on calendar" icons.

If you are not already on the calendar page, then clicking on such an icon will take you to the calendar, display the required resource, and highlight the booking by making it bounce up and down for a few seconds.

Any secondary bookings referenced by that initial booking will also be highlighted. In this case, their border changes colour to show they are related to the bouncing booking. (The colour changes well below the maximum recommended rate to avoid triggering photosensitive epilepsy)

If you are already on the calendar, and click on a booking to show a pop-up with its details, then any bookings referenced from that first one will also display a show-on-calendar icon. In this case, clicking the icon may change the displayed date on the calendar before highlighting the booking.

Note that this now means you can find a booking via the search page, click on it to see the details in a pop-up, then click on the calendar icon to switch from the search page to the bookings calendar with the right date, time and resources selected to highlight the booking.

Resource Show On Calendar

When viewing the details of a single resource, you now have a button labelled "Show on Calendar" which will take you to the bookings calendar configured to show only that one resource.

When viewing a list of resources, you can check one or more resources, and then click the new "Show on Calendar" button that will take you to the bookings calendar configured to display bookings for the resources you had checked.

Booking Display Flags

Bookings on the calendar can now display small icons in the title bar of each booking.

Go to the resource editor, and you will find a new section labelled "Booking Display Flags". Create one or more entries in there. For each one, you choose the flag, the subtype of Booking to which it might apply, and the conditions the booking must pass in order for the flag to display.

You can also set a display order, which is a number used to sort the flags so that you can choose the order in which they appear on the calendar.

Booking Content On Calendar

Previously, there were global preferences options for control the text that is displayed on the calendar for a booking's title on the month view, and also for a booking's title and main body on all other views.

In addition to this, you can now control the displayed content of an all-day booking that displays at the top of the day or week view.

Also, instead of being limited to having all bookings display the same content, you can now make this be different for each resource. Go to the resource editor, and edit a resource and tick the option for custom booking content on the calendar. A new tab appears where you can customise the display of this resource's bookings on the calendar.

Choose Project for Templates on Bookings Calendar

On the bookings calendar, the "Templates" item on the left has changed.

It used to have a single toggle to hide or some templates in the background of the bookings calendar. It now has a three-way choice:

This last option is the new one that's available. If you select it, then the background of the bookings calendar will show a colour that indicates whether you will be allowed to make a booking for that project.

Your default project is the one that is used by default when you create a new booking, as long as that project is a viable one to choose for the resource in question.

If you select the option to show templates for your default project, then it also shows you a drop-down you can use to choose that project.

This means you can now change your default project in two places - on the "Settings" page, by clicking the link in the top-right corner, or by choosing this template option and using the drop-down.

Show Which Template Applies Now

A template can have a near term, medium term and far term which might apply at various times. It was not obvious which was in effect at the time you looked at the template. This has now been changed by making the body of the template displayed on the templates calendar give the name of the template group that applies.

The title of the calendar item also shows the name of the template group that applies rather than always being the name of the main template group (that is, the medium term template group), which is what it used to do.

Booking Confirmation

Version 10.0 added built-in support for linked bookings, so that one booking might spawn additional bookings for some other resources.

This leads to an issue around the process for confirming bookings.

That is, when there's a whole related set of bookings whose status is tentative or requested, and you want to move it on to the next level.

That is, convert requested bookings to approved, or convert tentative bookings to requested or (if possible) approved.

Since there can be a whole tree of these bookings, then this can be a time consuming thing to do manually. So there's now a button next to the status displayed in the booking pop-up.

The button will display whenever the booking's status is either tentative or requested, and its label will be "Confirm" if the booking is tentative, and "Approve" if the booking is requested.

Pressing it will attempt to convert the booking and any linked bookings to approved, if possible, or requested otherwise.

Security Compliance

There are a raft of changes included that help when your environment requires that you have secure records of all changes, and to be able to prove that the audit log is complete and hasn't been tampered with.

Secure Block Chain Audit Log

The AuditLog has been extended in order to make it harder to tamper with, and easier to detect when it has been tampered with.

Every AuditLog entry has a reference to the next and previous AuditLog entry. Database foreign-key constraints mean you can't delete any AuditLog (apart from the last one) without first modifying the following AuditLog.

Each AuditLog contains a hash checksum of all the data inside the AuditLog, and the calculation includes the hash from the previous AuditLog. This means that if you modify the data in any AuditLog, or remove an AuditLog, then the hash of the following AuditLog will be inconsistent with the remaining data.

This allows, in principle, for detection of AuditLog tampering because we can check that the data is consistent with the hashes, and we could create a backup of the hashes to allow verification that that don't all change.

Prevent Changing Audit Log and Attachments

Version 10.1 introduces a secure block chain to the audit log that makes it much harder to mess with the audit log without it being detectable.

However, it also goes further by including the option in the software's licence key to prevent any modifications at all to the audit log. When this is turned on, not even root can make any changes. The only changes to the audit log are those that are made in the course of recording what data elsewhere has been created, updated or deleted.

There's also a separate licence setting to prevent file attachments being deleted. If you want your audit log to be a faithful representation of everything historical, then attachments should never be deleted. That's because the audit log does not contain a copy of attachments, but only a pointer to them.

These settings might be approriate in two situations:

  1. For those that would like the audit log record of changes to include the data for attachments that used to be attached but have since been removed. (Normally, only the currently attached files are accessible via the audit log).
  2. For those that require all data to remain accessible for regulatory compliance reasons. For example, those doing clinical trials.

Require Reason For Deletion

There's now an option in the software licence to require that whenever anything is deleted, the user is asked for a reason why they are deleting it.

The reason is then recorded in the audit log.

AuditLog Human Readable Export

The distribution (for those that run on their own server) now includes scripts that can export audit log contents to a human readable form. These scripts appear in the INSTALL directory that is a part of the Calpendo distribution.

They serve to support demonstration of compliance with customers requirements for the audit log to be seen to not be tampered with, and be able to examine the details of audit log without having to use a complex system to do so.

The scripts are simple, and can easily be understood by any technically competent person with some understand of bash scripts and MySQL or MariaDB.

See INSTALL/export_audit_log/readme.txt in the distribution for technical details.

The history page now has an added option to allow you to search by the change type (create, update or delete).

This means you can look only for when things are deleted, or only when created, or only when updated if you want to.

Recording Emails

You can now record all outgoing emails if you want to. You can choose whether to turn recording off, or record everything, or record all details about outgoing emails apart from the body of the emails.

You also have separate control over the recording of emails that are generated automatically and those that are manually sent.

This is controlled from the Email tab of Global Preferences.

The old global preferences option for a debug mode for email that added a copy of the transaction log with the mail server has been removed. Its functionality is now superceded by this new facility.

The system events no longer record details about emails sent, and only records the fact that an email was sent, but none of its details. This is instead recorded by a new biskit type. Search for "Recorded Email" and you will find the relevant records.

Protection Against Clickjacking

Clickjacking is the name given to a security exploit that relies on running an application inside a frame, so that invisible elements can be laid over the top.

This means you could then click on invisible things and think that you were clicking on the app showing underneath.

This is described on the OWASP website.

Protection against clickjacking should be more than one thing. We now add some code to protect, as recommended by the above OWASP page. Web servers hosting this should also have other protection against it (the Exprodo production servers do have such protection).

Changes

Formatted ID Time Zone

Whenever a new object is created, it is allocated an ID number that embeds the date and time when it was created within it. The numbers themselves (as explained in the 10.0 release notes) are long, and so to make them more human readable, they are formatted into their various parts. This includes the date and time part.

From version 10.1.6, the date and time are calculated using the UTC time zone.

This avoids ambiguity over the conversion between the raw number value of an ID and its formatted representation.

Linked Bookings

To help with the new booking confirmation support, there are some changes to the way linked bookings work.

Cancellation Reasons

You've always been able to customise the list of reasons somebody can choose when a resource is configured to require a reason for a cancellation.

In addition to this, you can now choose different cancellation reasons for each resource.

Create all the cancellation reasons in the bakery as before (it's a Mapped Int). But then, on each resource, when you turn on the option for the resource to require a reason for cancelling one of its bookings, then a new tab will appear for a list of cancellation reasons.

If the list is empty, then all possible cancellation reasons will be offered. Otherwise, whatever is in the list are the reasons that will be selectable when somebody cancels a booking for the resource.

Date/Time and Date Range Properties With Seconds

We now support displaying date-time and date range properties with seconds accuracy. Previously, we assumed a date/time only required time to an accuracy of minutes.

In the bakery, each DateTime and DateRange property lets you specify the accuracy of the content (minutes or seconds).

In the layout editor, for any DateTime or DateRange property, you can specify the accuracy that should be used to display a property.

By default, a layout will show a property using the time accuracy specified in the bakery. However, you can override the accuracy in the layout editor. In other words, the accuracy specified in the layout does not have to agree with the bakery version.

When creating variables in a workflow, DateTime and DateRange properties now let you specify the accuracy.

Usage Recorder

The built-in usage recorder now allows you to manually override the start and finish time. Normally, you click a button to indicate when the session started, and again to say when it finished. The times when you clicked the buttons are used as the start and stop times for the resource usage.

You can now change those times. When you've started a session, the usage recorder shows a page with the start time, its current duration, and a button to let you stop the session. You can now click on the start time and modify it.

Also, when you stop the session, the pop-up that asks if everything went well now allows you to modify the finish time if you want to.

The recorder also supports collecting times to a resolution of seconds. If you want this, then change the Time Type of the dateRange property on Resource Usage in the bakery.

There's also now an "overview" panel that displays with the usage recorder when there are multiple resources on which you can record usage. This makes it much easier to see what the overall situation is across multiple resources and also makes it much easier to switch from recording information about one resource to another.

You can jump to the usage for any resource by clicking on it.

If any resource is configured so that the usage recorder can only be used from a particular IP address, then the overview panel will only show that resource if your IP address matches.

Further, if there are no resources or only one resource for which you can record actual usage, then the overview panel will not show.

Control Over Tag Creation

When you configure tags for a property, users were able to enter a value and then that would be automatically made available as a suggestion for use in future.

You now have control over whether tag suggestions will be created automatically, when a new value is used for the first time, or whether it will only happen manually.

This is determined in the bakery. Where you have a string or set of strings and set it to contain a tag, there's a drop-down to choose whether new tags are added automatically or manually.

If set to manual, a user can still modify a property that displays tags tags, and new values the user enters will be stored, but there will not be a suggestion added for future use.

To manually create a tag suggestion, search for the type "Tag", and create an entry for the relevant "Tag Definition".

Approximate Dates

There is a new BiskitDef called ApproximateDate. You can add custom properties of this type to your biskits. If you do so, then you must mark the property as being a component. You will receive an error if you forget to do this.

This will result in storing a new column of type integer which encodes a date.

For example, 3rd February 2021 would store the value 20210203.

This is an approximate date because the day of the month and month of the year can be unknown.

In those cases, the value of the day or month would be stored as zero, so an unknown day in February 2021 would be 20210200, while an unknown day in 2021 would be 20210000.

This number is available as a property called "pseudoDateNumber". There are also properties for day, month and year on an ApproximateDate.

The user interface will display unknown days and months as "Unknown".

If you use a workflow or permissions to access the "day", "month" properties of an ApproximateDate, and they are unknown, then their value will be zero.

Optimisations

There have been various speed improvements made throughout version 10.1.

This applies in particular to some operations with bookings, but also more generally to communication between the browser and server which is now significantly faster.

Any custom reports written using FreeMarker will be substantially faster.

Default Project Status

Version 10.0 introduced draft projects. "Draft" is a new status that can be used when a user wants to save a project, but is not yet ready to indicate it is ready to be approved by making its status "Requested".

However, this introduces a behaviour change for all existing users. So we've now added a new global preferences option to choose what the default project status is. This now defaults to "Requested" so that the 9.0 behaviour is what you get by default.

Anybody that wants users to create draft projects by default should change the global preferences option.

Per-User Default Initial Page

You can now choose a user's default initial page by adding a user login workflow event, and then setting the default initial page token in the response.

The token you must set is the part of the page URL after the # symbol.

If you don't set this, then the value selected in the global preferences will apply.

If you do set it, then it overrides the global preferences setting.

Examples of when this might be useful:

Workflow Dynamic Content Pop-ups

Workflows have been able to dynamically generate HTML content for display to the user for some time. This has now been extended so that the content can be displayed in a pop-up if you wish.

To do this, add a Biskit Update action that changes the event's response.popup and at least set the popup's enabled property to true. You can also choose to make the pop-up (nearly) full screen, or a fixed number of pixels wide and high.

If you don't choose a specific size, then it will be sized according to its content. There are some other settings you can choose:

Running User Workflow From Process Page

A process page (also known as a stepped-edit page) allows you to edit a biskit in a sequence of pages where you click next and previous buttons as you navigate between the various screens.

On each screen, you can configure buttons that appear, such as next and previous, each of which can initiate custom actions in the server by a workflow that is triggered on each button press.

The Process Event's output available in the workflow now includes a "response.userWorflowEvent" that you can set. If you do, then this chooses a User Workflow Event that will be triggered for you.

The user workflow event can display messages or dynamic content. The dynamic content can be in a pop-up, or not, as you prefer.

Now that a user workflow event can trigger a pop-up containing dynamically generated content, it means that you can configure a button on one of the process event pages to trigger a user workflow that shows dynamic content in a pop-up. From the user's perspective, this means they click a button and a pop-up appears with the relevant content.

To use this, from within the workflow triggered for the Process Workflow Event, add a Biskit Update that changes the event's response biskit, and set its userWorkflowEvent property to the user workflow event of your choice.

Stepped Editor New Custom Buttons

A process page is also known as a "stepped editor" because it involves a sequence of pages that (usually) edit a biskit with next & previous buttons.

These allow a set of buttons on each page. You can change the labels on them, and their meaning, but by default they are:

Of these,:

That often leaves "reset" as the only button that can be customised, and that isn't always enough.

So now there are buttons called "Extra 1", "Extra 2" and "Extra 3". Their meaning is entirely what you make of it, by changing the labels so that they have sensible meaning to the user and configuring a workflow to handle them as required.

The menu editor now lets you specify a CSS class that should be applied to the menu. This means you can change the way the menu bar looks, and this can be different for different users (since they can each have a different menu).

This also means that you can completely hide the menu bar if you want to.

Misc Changes

Back to Top

Updates

10.1.0 November 4, 2020

First released version.

10.1.1 June 18, 2021

10.1.2 June 28, 2021

This version includes everything in 10.0.38 and 9.0.86

Changes

Bug Fixes

Back to Top

10.1.3 July 9, 2021

This includes everything in versions 9.0.87 and 10.0.39

Changes

Bug Fixes

Back to Top

10.1.4 July 21, 2021

Changes

Bug Fixes

Back to Top

10.1.5 August 10, 2021

This includes everything in version 10.0.40

Changes

Bug Fixes

10.1.6 September 27, 2021

This includes everything in version 10.0.41, 10.0.42, 9.0.88, 9.0.89 and 9.0.90

Changes

Bug Fixes

Back to Top

10.1.7 September 29, 2021

Bug Fixes

Back to Top

10.1.8 September 29, 2021

Bug Fixes

Back to Top

10.1.9 November 8, 2021

Changes

Bug Fixes

10.1.10 November 26, 2021

Changes

Bug Fixes

10.1.11 December 7, 2021

Bug Fixes

Back to Top

10.1.12 December 9, 2021

Changes

Bug Fixes

10.1.13 December 10, 2021

Changes

Bug Fixes

Back to Top

10.1.14 December 11, 2021

Bug Fixes

Back to Top

10.1.15 December 13, 2021

Bug Fixes

Back to Top

10.1.16 December 16, 2021

Optimisations

Bug Fixes

Back to Top

10.1.17 December 17, 2021

Bug Fixes

Back to Top

10.1.18 December 21, 2021

Changes

Security Bug Fixes

Bug Fixes

Back to Top

10.1.19 January 12, 2022

Changes

Bug Fixes

Back to Top

10.1.20 January 20, 2022

Changes

Security Bug Fixes

Bug Fixes

Back to Top

10.1.21 April 1, 2022

Changes

Security Changes and Bug Fixes

Bug Fixes

Back to Top

10.1.22 April 25, 2022

Security Fix

Bug Fixes

Back to Top

10.1.23 May 20, 2022

Changes

Security Bug Fixes

Bug Fixes

Back to Top

10.1.24 May 23, 2022

Bug Fixes

Back to Top

10.1.25 June 23, 2022

Changes

Bug Fixes

10.1.26 June 24, 2022

Bug Fixes

Back to Top

10.1.27 July 6, 2022

Bug Fixes

Back to Top

10.1.28 July 23, 2022

Security Fixes

Bug Fixes

Back to Top

10.1.29 August 17, 2022

Changes

Optimisations

Bug Fixes

Back to Top

10.1.30 September 6, 2022

Bug Fixes

Back to Top

10.1.31 September 19, 2022

Bug Fixes

Back to Top

10.1.32 October 20, 2022

Changes

Security Bug Fixes

Bug Fixes

Back to Top

10.1.33 January 4, 2023

Bug Fixes

10.1.34 January 19, 2023

Changes

Bug Fixes

10.1.35 February 20, 2023

Bug Fixes

10.1.36 March 7, 2023

Bug Fixes

Optimisations

10.1.37 March 21, 2023

Bug Fixes

Back to Top

10.1.38 June 9, 2023

Changes

Bug Fixes

10.1.39 August 29, 2023

Changes

Bug Fixes

Back to Top

10.1.40 7th September, 2023

Changes

Bug Fixes

10.1.41 12th December, 2023

Bug Fixes

Back to Top