Blog

Release announcements, helpful tips, and community discussion

In Development: 9.0

Cerb (9.0) is a generational major feature update in development as of June 12, 2018. It includes more than 65 new features and improvements from community feedback.

To check if you qualify for this release as a free update, view Setup » Configure » License. If your software updates expire on or after June 30, 2018 then you can upgrade without renewing your license. Cerb Cloud subscribers will be upgraded automatically.

Important Release Notes

Customizable Record Profiles

Admins can now customize the tabs that appear on the profile page of any record type – entirely from the web browser. Previously, adding a new tab to a profile required the use of plugins.

All of the previously built-in tabs on profiles have been converted to ‘Profile Tab’ records and are now editable.

When you add a new tab to a profile, it will be visible on all other records of the same type. For instance, you can add an ‘Orders’ tab to all ticket profiles, and its contents can display the order history of the participants for each ticket you view.

This is especially useful for custom records, which barely made use of profiles before.

Profile tabs can be dragged into any order. The first tab is the default.

New types of profile tabs can be added with plugins. We’ve included several to help you get started.

You can configure a profile’s tabs from the gear icon at the end of the tab set:

Build dashboards on profiles

Dashboards are our first new profile tab type. They are a collection of visualization “widgets”. [#655]

Profile dashboards are similar to workspace dashboards; but the dashboard on a profile has access to all of the current record’s placeholders. You can design a dashboard once for a specific record type and it will automatically adapt every time you view a different record.

Each dashboard has a layout for positioning the widgets. Layouts are a series of “zones”.

For instance, a “sidebar” and “main content” area are two zones. Zones are named, so that switching between compatible zones (e.g. left-sidebar, right-sidebar) keeps the widgets in their proper place as the entire zone moves. When widgets aren’t assigned to an existing zone after the layout changes, they are added to the first zone.

When dragging widgets, the zones are highlighted. This is particularly useful when you want to have one large widget (like a ticket conversation) with a sidebar containing several summary widgets. This wasn’t possible with the previous grid-based design where the columns were always the same width.

Here’s what ticket profiles look like now using the default “right-sidebar” layout:

In past versions, when many custom fieldsets were used, it often required a lot of scrolling to see the start of each conversation. Now, conversations are displayed right away in the large content area on the left. The conversation history is also a widget now, so it can include configuration options, and you can move it around or resize it as desired.

In the smaller sidebar area on the right, we provide full record summaries of the current ticket, its organization, and owner. This reduces the need to open cards when reviewing a record from its profile. You can also easily move the sidebar to the left by editing the dashboard and switching layouts.

We’ll talk more about the record fields widgets below.

At the top of the sidebar, we’ve included a widget to make the status of the ticket much more obvious at a glance. If there’s a re-open date set, you’ll see it there as well.

We do the same thing with task and opportunity records by default. Previously, the current status of each record was buried in the properties list. These widgets are completely editable, so you can copy or modify them to meet your specific needs (or even just delete them and add the status field back to the ticket properties).

Below the new status widget, you’ll find the record-specific actions.

These used to appear at the top of the profile, but they weren’t configurable, and were inconsistent for different record types.

Admins can now edit the actions widget to add new shortcuts (including keyboard shortcuts). The “Read all” action is also more efficient – it quickly refreshes the “Conversation” widget with every message expanded in chronological order, without requiring a full page reload.

Flexible widget widths

Widgets on profile dashboards can be configured to span multiple column widths (e.g. 25%, 50%, 75%, 100%).

For instance, a large chart or worklist can be 2-4X wider than the widgets around it.

Previously, workspace dashboards required that all widgets and columns were the same width.

Responsive dashboards

Profile dashboards follow responsive design principles. A narrow display width will result in a single column, while a wide dedicated screen could display many more. Widgets grow and shrink according to the space available.

Widgets can be dragged into a preferred order. Widgets are wrapped horizontally (rather than vertically) so the most frequently viewed widgets always occur near the top of the page regardless of the number of columns.

Here we have a ticket profile on a screen that’s slightly narrower than the above example (perhaps an iPad in landscape mode):

You’ll see that the widgets in the sidebar now display their fields in a single column, where above there were two columns of fields.

Here’s the same profile on a much narrower screen (like an iPhone in portrait):

The widgets now display in a single column, and the right sidebar has moved to the top.

Scrolling down displays the conversation in a mobile friendly format:

For most users this should entirely remove the need for the mobile plugin.

Dashboard widgets

We’ve included many new widget types to help you get started building dashboards.

Record Fields

The ‘Record Fields’ widget displays built-in fields, custom fields, and search buttons for any record. This is like embedding a card summary on your dashboard.

The displayed record can be specified using placeholders. For instance, on a ticket profile, the fields of the ticket and its organization can be displayed at the same time.

The fields and fieldsets to display are configurable. Fields can be dragged into a desired order. This drastically cleans up profiles by only displaying fields that are important and hiding everything else.

A ‘Show record links’ option determines whether or not to show the ‘Links’ section for adding links and showing a search button for each type of linked record.

A ‘Show empty fields’ option determines whether blank fields will be included in the output. This is disabled by default (i.e. fields with no value are hidden).

Custom search counter buttons can now be configured for each instance of the widget. These buttons run a search query using placeholders from the target record and return the number of results. For instance, a different set of search counters could be displayed on an organization fields widget on tickets and on contacts. For tickets, counts of the organization’s ticket history and contacts could be shown.

This widget replaces the properties area at the top of profiles, moving the tabs right to the top without requiring scrolling.

Worklists

Unlike worklists on workspace dashboards, worklist widgets on profiles offer full functionality. This allows worklists and other visualizations to be mixed on the same dashboard.

Worklist widgets have a simplified configuration: record type, required query, default query, records per page, color, and columns.

Worker-level changes (filtering, sorting, paging) are persisted per-record for the duration of the session.

Project Boards

Added a ‘Project Board’ widget to profile dashboards. This displays any project board and is configurable with placeholders.

Behavior Tree

Added a ‘Behavior Tree’ widget to project dashboards. This can display the editable decision tree for any bot behavior. It’s configurable using placeholders.

Calendar

Added a ‘Calendar’ widget to profile dashboards.

Calendar Availability

Added a ‘Calendar Availability’ widget to profile dashboards.

Knowledgebase Article

Added a ‘Knowledgebase Article’ widget to profile dashboards. This displays any article and is configurable using placeholders.

Comments

Added a ‘Comments’ widget to profile dashboards. This displays the comment discussion thread for a given record. This replaces the previous built-in ‘Comments’ tab from profiles.

HTML/Javascript

Added an ‘HTML/Javascript’ widget to profile dashboards. This allows admins to render arbitrary content to the screen using bot scripting and the placeholders of the current record. For instance, data from a (hidden) fieldset can be displayed as a visualization.

Responsibilities

Added a ‘Responsibilities’ widget to profile dashboards on worker and group records. This replaces the built-in tab.

Ticket Conversation

Added a ‘Ticket Conversation’ widget to profile dashboards. This displays the the ticket timeline with messages and comments, allows replying, etc. As a widget, this can be moved around to a desired location on the ticket profile page.

Spam Analysis

Added a ‘Ticket Spam Analysis’ widget to profile dashboards on ticket records. This replaces the ‘Spam Analysis’ plugin.

Custom (Bot-powered)

You can implement your own widget functionality using ‘Custom’ widgets and bots. [#87]

The content of a custom widget is generated using a ‘Dashboard render widget’ bot behavior. This allows data to be imported from anywhere, in nearly any format, and visualized however you want.

We have many reference examples using D3.js (e.g. line/bar/area charts, pie/donut charts, network graphs, word clouds, maps) that can be quickly adapted to your needs. This gives you full control over every aspect of the visualization: colors, axes, labels, etc.

When viewing a profile, appending a tab name to the URL (in permalink format) will automatically select that tab. This gives custom tabs the same functionality as the previously built-in tabs. For instance /log for ‘Log’ or /my_new_mail for ‘My New Mail’.

Keyboard shortcuts

On profile dashboards, unhandled keyboard shortcuts are sent to widgets in order to give them an opportunity to respond. For instance, this allows an ‘Actions’ widget on ticket profiles to handle the close/spam/delete shortcuts, while also making them configurable and extensible.

Comments

On profiles, every record type that supports comments now has a ‘Comment’ button at the top of the page. When a comment is created, an event is sent to all profile widgets so they can refresh their content.

Cards

Customizable search buttons

On cards for every record type, custom search buttons can now be configured by administrators. These will be displayed on cards for every worker.

To build a custom search button, all you need to provide is a record type, singular label, plural label, and search query for the count.

Placeholders for the current record in the card can be used to construct the query; and the count can be based on any field on any linked record.

This is particularly useful to relate custom records to each other (e.g. Instructor->Courses).

Search buttons can be dragged into the desired order.

All of the built-in buttons (like Ticket->Participants, and Group->Members) have been moved to the editable search buttons, so they can be copied, changed, or removed.

File Uploads

Implemented a new file uploader using HTML5 and removed the legacy IFRAME approach. When uploading files, progress bars now display the current progress for each transfer.

When uploading multiple files at once, each file can now use the maximum file size configured on the server. Previously, the upload limit was shared between all files being uploaded.

Bots

User experience

Added a loading animation to the floating bot interactions menu in the bottom right.

Scripting

  • Added a |cerb_translate filter to bot scripting. This converts string IDs (like status.open) into text in the current worker’s language.

  • Added a cerb_has_priv(priv, actor_context, actor_id) function to bot scripting. This returns a boolean depending on whether the given actor has the given privilege among their roles. If no actor is given, the current worker is assumed. This allows bot functionality, snippets, and widgets, to adapt based on worker permissions. This is particularly useful in HTML-based profile widgets.

  • Added cerb_record_readable(record_context, record_id, actor_context, actor_id) and cerb_record_writeable(record_context, record_id, actor_context, actor_id) functions to bot scripting. These return a boolean if the given actor has read or write access to the given record. If no actor is provided then the current worker is assumed. This allows bots and widgets to adapt based on record permissions. For instance, an HTML widget on a profile dashboard could only show a button to workers who can modify the record.

Responsive design for mobile devices

Improved user interface responsiveness on small screens (e.g. mobile). This reduces/removes the need for the separate mobile interface.

  • The global search menu now properly adapts the number of columns based on the width of the browser.

  • When using Cerb with a mobile device, the logo and ‘signed in’ menu are now responsive. The ‘signed in’ menu will move to its own line if there isn’t enough room.

  • When viewing Cerb with a mobile device, all popups now adapt properly to the width of the browser. Previously, most popups required scrolling – if they were usable at all.

  • When viewing worklists on small screens, subtotals now expand above the worklist rather than to the left.

  • On worklists, quick search is now easier to use on mobile devices. The query textbox spans the width of the browser, and the quick search menu adapts its width properly.

  • On mobile devices, it’s now easier to reply to messages when viewing a ticket. The reply window adapts to the screen width, as do the properties below it (reopen at, etc).

  • On profiles dashboards with a sidebar, the sidebar will now always move to the top in single-column responsive mode. Previously, right-aligned sidebars were displayed at the bottom, which made it difficult to see the properties of a record (especially on tickets.

Quick search

Remember the last query on worklists

On all worklists, the previously used search query is now remembered even when the list is closed and returned to later. This makes it much easier to modify the existing filters. Previously, the search query field was blank upon return and the query had to be tediously reconstructed.

Placeholders for quick search queries

Improved placeholders in worklist quick search queries. Previously these were inconsistent between the UI, API, and bots. [#64] [#65]

Subtotal from quick search queries

When searching worklists with queries, a subtotal: filter can be provided to also return subtotals on the given field. This is particularly helpful when configuring worklist widgets.

Sort hints in the quick search menu

In the search menu for all worklists, added a sort: submenu to display the available sort fields. This also allows adding sorts in ascending or descending order.

Subtotal hints in the quick search menu

In the search menu for all worklists, added a subtotal: submenu to display which fields the records can be subtotaled on from a query.

Filter by custom fieldset on records

Added a fieldset: filter to search queries on all records. This allows deep searching against any linked custom fieldsets.

Records

Records configuration

In Setup, there’s a new ‘Records’ menu for record-related configuration (cards, custom fields, avatars, etc). These options used to be buried in the ‘Configure’ menu.

On ticket profiles, drafts now have a ‘Permalink’ button for generating a sharing link back to the draft. This works like the links for messages and comments, where the draft is scrolled into view and highlighted with a brief animation.

Custom fieldset improvements

  • The custom fieldsets feature no longer uses record links to associate fieldsets to records. This is now handled with a dedicated table which improves performance and simplifies maintenance.

  • Fixed an issue where moving a custom field between fieldsets didn’t link existing records with that field with the new fieldset.

Removed legacy features

  • On worklists, removed the ‘Filter:’ menu along with the old style of adding individual filters. Quick search queries handle everything now in a far more flexible and expressive way (booleans, groups, deep search, sets, negation, etc).

  • Removed the built-in ‘Mail History’ tabs on profiles since they can be reimplemented using profile custom tabs using worklist widgets.

  • Removed the built-in ‘Calendar’ and ‘Availability’ tabs on worker profiles since they can be reimplemented using profile custom tabs and calendar widgets.

  • Removed the built-in ‘Responsibilities’ tabs on group and worker profiles since they can be reimplemented using profile custom tabs and responsibility widgets.

  • Removed the legacy ‘filter presets’ feature. This had been deprecated by ‘saved searches’ in 8.x, which use queries rather than legacy filters.

  • Removed the legacy ‘Print’ feature from tickets and messages. This is well-handled by browsers and CSS now.

  • Removed the legacy ‘Include activity log entries in the timeline’ worker preference. This can now be done more cleanly using profile dashboards by adding an activity log worklist.

  • Removed profile tab extensions from plugins (Extension_ContextProfileTab) in favor of the new profile tab records (built through the UI).

Cards, profile pages, and worklists for scheduled behaviors

Scheduled behavior records now have cards, profile pages, and worklists. They are accessible from the global search menu. Scheduled behaviors can be created and modified from the records API via REST and bots. [#634]

Miscellaneous improvements

  • Behavior worklists now default to sorting by the most recently updated records.

  • Worker custom fields on worklists now open a card popup rather than redirecting to the profile page.

Platform

Developers

  • Added Devblocks.loadScript(url,callback) and Devblocks.loadScripts(urls,callback) helpers to the Javascript library. This allows plugins and widgets to lazy load third-party scripts. Scripts are loaded in parallel, browser cache is utilized, and multiple requests for the same script will only fetch it once.

Performance

Optimized HTML sanitization performance

Optimized HTML sanitization when used in a loop (e.g. project boards).

Dependencies

  • Added the D3.js Javascript library for client-side visualizations on dashboards.

  • Added the TopoJSON Javascript library for efficient map-based visualizations on dashboards.