Blog

Release announcements, helpful tips, and community discussion

In Development: 10.1

Cerb (10.1) is a feature upgrade in development as of June 23, 2021. It includes more than 43 new features and improvements from community feedback.

Current changelog

  • [Mail/Parser] Cerb now properly handles FormMail-style email headers, like From: customer@example.com (Customer Name).

  • [Toolbars] Added a draft.read toolbar for adding interactions to draft previews on ticket profiles.

  • [Mail/Compose] Compose drafts now properly save custom fields and fieldsets. [#1083]

  • [Mail/Drafts] Reply drafts properly save and reload custom fieldset values.

  • [Time Tracking] Time tracking records are now created when the timer starts. Pausing a time tracking timer saves its progress to the server.

  • [Time Tracking] Time tracking timers can be resumed on previously saved records.

  • [Time Tracking] When resuming a time tracking timer from the editor, changes to fields and comments are now saved first. Previously these changes were lost when the timer was resumed.

  • [Time Tracking] Time tracking time entry in human-readable units (e.g. “1 hour, 15 mins, 5 seconds”). Previously time entries only tracked in minutes.

  • [Time Tracking] Time tracking timers are now measured in seconds rather than minutes. This allows a previously saved timer to be resumed without rounding to the nearest minute.

  • [Records/Search/Fulltext] In record search queries, fulltext filters can now use parentheses to specify a mix of phrases and terms. For instance, text:("an exact phrase" other terms).

  • [Sheets/Security] Sheets now automatically HTML escape all placeholders in templates by default. This can be overridden in certain situations with the |raw filter.

  • [Records/Search] There is no longer a results limit when fulltext searching using a MySQL index (rather than Elasticsearch). Instead, inefficient searches are now automatically aborted by the existing query time limits. Every filter is now involved in queries that mix fulltext and field filters. [#1445]

  • [Records/Search] All fulltext search filters (on MySQL indexes) now support negation. For instance, text:!(not these words)

  • [Search/Messages] Added a new fulltext search index for common message headers: from, to, cc, delivered-to, x-forwarded-to, and x-mailer.

  • [Records/Search/Messages] On message records, added a header.deliveredTo: search filter.

  • [Records/Search/Messages] On message records, added a header.from: search filter.

  • [Records/Search/Messages] On message records, added a header.cc: search filter.

  • [Records/Search/Messages] On message records, added a header.to: search filter.

  • [Storage/MySQL] Improved MySQL 8.x support by combining the id and chunk indices on the storage_ tables.

  • [Records/Profiles] Added profile pages for message records. This makes it possible to isolate a single message, which simplifies workflows like printing.

  • [Records/Profiles/Messages] On message profile pages, the ‘Ticket Conversation’ widget can now display a single message with full functionality (e.g. toolbars, reply, comment, attachments).

  • [Records/Profiles/Drafts] On draft profile pages, the ‘Ticket Conversation’ widget can now display a single draft with full functionality (e.g. resume, comment). [#1360]

  • [Platform/Sessions] Increased the possible length of IPs in sessions. The limit was previously 40 characters, but some IPv6 (e.g. IPv4 mapping) can be slightly longer. [#1460]

  • [Automations/Mail] Implemented the mail.draft automation event. Automations can modify any property on a new or resumed draft after a worker clicks on a ‘Compose’ or ‘Reply’ button, but before the editor popup opens. Automations on this event are cumulative – multiple automations can modify the draft, with subsequent changes on the same fields overwriting earlier ones. When setting custom_fields:, their uri field can be used as the key instead of IDs. New custom field changes are merged with existing fields. This event drastically simplifies workflows that modify drafts (e.g. always adding a Bcc: field). Previously, these workflows used ‘Before composing/replying’ behaviors, which required fragile Javascript.

  • [Automations/Mail] Implemented the mail.sent automation event. Automations can perform actions after an outgoing message is sent by a worker.

  • [Mail] Refactored mail sending functionality to generate content separately for every combination of saved/sent and html/text. For instance, a content modification can be targeted at only the ‘sent html’ part. Previously this was limited to saved/sent, but it couldn’t target html/text.

  • [Mail/Markdown/UX] When generating a plaintext body from a Markdown-formatted outgoing message, image tags with alt text are now properly matched and converted.

  • [Mail/Relays] Inbound messages from workers through the email relay now generate a draft before being parsed. If the message fails to send (e.g. SMTP issues), it will remain a draft and retry rather than disappearing.

  • [Automations/Mail] Implemented the mail.send automation event. Automations can modify sent message drafts before they are delivered. For instance, appending a unique survey link to only the sent+html message (not text, nor the copy Cerb saves), setting custom fields, or adding custom mail headers to prevent Sendgrid from rewriting the Message-Id: header. Content modifications can target any combination of text/html on the sent/saved message.

  • [Search/UX] Search queries with unknown filters now return an error and no results. Previously, unknown filters were ignored, which could have unintentional effects.

  • [Custom Records/Performance] On custom records, added an index to improve performance on filtering by the name: field. Some people use the name as a lookup field which could have >100K records. [#1466]

  • [Records/Tickets/UX] On ticket profiles, messages in the conversation now have a button to open their card rather than directly opening the editor. This makes it easier to see message links, view the full profile, etc.

  • [Records/Tickets/UX] On ticket profiles, comments in the conversation now have a button to open their card rather than directly opening the editor. This makes it easier to see comment links, view the full profile, etc.

  • [Records/Tickets/UX] On ticket profiles, drafts in the conversation now have a button to open their card rather than directly opening the editor. This makes it easier to see draft links, view the full profile, etc.

  • [Worklists/Subtotals] In worklist subtotals, changed the default ‘none’ category to ‘(none)’ to differentiate it from a literal value of ‘none’.

  • [Worklists/Subtotals/Performance] The subtotals sidebar on worklists now simultaneously (asynchronously). Previously, the worklist results and subtotals sidebar were calculated before any output was shown, which combined their max timeouts and could result in no output if the webserver hung up first (usually after 30 seconds). This also helps avoid the issue where a complex query prevents a worklist from finishing loading after closing and reopening.

  • [Worklists/Subtotals/Performance] Fixed an issue where the worklist subtotals sidebar wasn’t constrained by a query timeout. On a complex query, this could result in a backlog of database queries and a worklist that doesn’t finish loading.

  • [Interactions/Await] On interaction.worker automations, added an await:duration: continuation. This displays a message: and waits until: a given date/time or interval (e.g. 5 seconds). This can be used to display a status update while waiting for a long-running asynchronous task to finish. For instance, an AWS Step Function for new account provisioning. [#1455]

  • [Automations] In automations, the set: command now substitutes placeholders sequentially rather than all at once. This means you can set a value in the first key and refer to that value in the second key. Previously this required two separate set: commands.

  • [Automations] In automations, using the http.request: command, the headers: input now accepts either a string of newline-delimited header name/value pairs, or an array with header names as keys.

  • [Automations] In automations, using the http.request: command, the body: now accepts either a string or an array. Arrays are automatically encoded to JSON (application/json) or YAML (application/x-yaml/text/yaml) with the appropriate content; and are otherwise URL-encoded (application/x-www-form-urlencoded). This removes the need for extraneous set: commands to prepare the HTTP request.

  • [Interactions] On interaction.worker automations, when using an await:form: continuation, form elements may now include a custom validation@raw: option. Automation scripting can run logic and any output is considered to be an error message. The current element’s value can be compared by using its placeholder name (e.g. prompt_name). Multiple conditions can be checked by using if...elseif logic.

  • [Interactions] On interaction.website automations, when using an await:form: continuation, form elements may now include a custom validation@raw: option. Automation scripting can run logic and any output is considered to be an error message. The current element’s value can be compared by using its placeholder name (e.g. prompt_name). Multiple conditions can be checked by using if...elseif logic.