Most Popular
Recently Added
Recently Updated

6.9 Changelog

Release notes for Cerb 6.9

Cerb (6.9) is a major functionality update released on January 26, 2015. It contains over 90 new features and usability tweaks from community feedback.

See: http://wiki.cerbweb.com/6.9

Core

  • [Virtual Attendants/Behaviors/Messages] Virtual Attendants can now create custom behaviors for message records. This is particularly useful when loading a list of messages into a behavior variable and then running a message-based behavior against each of them.

  • [Translations/Localization] Cleaned up the translation language packs in install/extras/translations/ (English, German, Spanish, Italian, Dutch, Portuguese, and Russian) to remove unused phrases. Proper TMX headers were also added to make these files easier to edit with external translation tools.

  • [Translations/Localization] Modified how the database stores translation text to prevent a distinction between 'NULL' and blank translation strings. This makes it possible to cleanly filter a translation worklist with "Default Translation is blank; My Translation is blank" in order to create 'to do' list for translation work. Previously, some text was considered blank, and others NULL, which resulted in inconsistrent filtering.

  • [Mail/Parser] In the email parser, when Cerb generates a plaintext part for an HTML-only incoming message, links are now converted in a more useful way. Previously, link tags were simply removed and the label of the link (like "click here") was kept; which stripped many clickable links from messages. Now, these HTML links are converted to Markdown style links: [click here]**(www.example.com/some/link). This preserves the link text as well as the clickable link (and they can be easily converted back to HTML links in outgoing messages). When the label and link are the same, only the link is shown.

  • [CHD-2678] [Worklists/Message/Search] Message worklists can now be filtered by message header name/value pairs with multiple operators (=, !=, like, !like, is null). This makes it possible to search for headers like 'X-Mailer' or 'X-Spam-Score'. Virtual Attendants can also match a particular 'Message-Id' for threading, etc.

  • [Worklists/Message/Search] The quick search feature on message worklists can now filter by mail headers. Multiple headers can be searched by using ' OR '; for example: (X-Mailer like Cerb OR Message-Id like <123). In Virtual Attendants, these quick search filters can also include placeholders.

  • [Platform/Plugins/Developers] Added a reusable DevblocksPlatform::compareStrings($str1, $str2, $oper) method for comparing arbitrary strings with operators (is, !is, like, !like, contains, !contains, regexp, !regexp). These comparisons take place a lot in functionality like worklist filtering and Virtual Attendants.

  • [CHD-3920] [Mail/Worklists/Drafts/Usability] When viewing a ticket worklist, records that have a worker currently writing a draft reply are indicated with a special icon. This will help workers save time when picking a new ticket to work on, since they can avoid tickets that someone else is already working on without having to click into each record to check for a draft.

  • [Platform/Dependencies] Updated jQuery UI from 1.10.4 to 1.11.2

  • [Platform/Dependencies] Updated jQuery from 1.10.2 to 1.11.2

  • [Virtual Attendants/Scripting] Added an xml_encode() function to Virtual Attendant scripts. This allows any node of an XML object to be displayed in text format.

  • [Virtual Attendants/Scripting/Help] In the Virtual Attendants scripting help popup, added a new example for how to use regular expressions to filter text.

  • [Virtual Attendants/Scripting/Help] In the Virtual Attendants scripting help popup, added examples for JSON decoding, modification, and encoding.

  • [Virtual Attendants/Scripting/Help] In the Virtual Attendants scripting help popup, added examples for XML decoding, encoding, xpath, and working with namespaces.

  • [Platform/Dependencies] Updated Twig template library from 1.15.1 to 1.16.2

  • [Platform/Dependencies] Updated Smarty template engine from 3.1.7 to 3.1.21

  • [Platform/Dependencies] Removed PHP Markdown library (we use Parsedown for everything now)

  • [Platform/Dependencies] Updated Parsedown text formatting library

  • [Platform/Dependencies] Updated SwiftMailer library from 4.1.5 to 5.3.1

  • [Profiles/Links/Usability] Profiles now summarize a record's links in a fieldset at the top of the page. This displays a count of the links for each type of record. Clicking on the record type displays all the links of that type in a worklist on a popup. Previously, workers had to click into the Links tab for each record to see this information. Now, workers can quickly see if there are links of a specific type on the current record, view them, and modify them, without leaving the current tab (which is especially helpful when replying to a ticket).

  • [Profiles/Links/Addresses] Address profiles now also display a link summary for their parent organization.

  • [Profiles/Links/Calendars] Calendar event and recurring event profiles now also display a link summary for their parent calendar.

  • [Profiles/Links/Contacts] Contact person profiles now also display a link summary for the primary email address.

  • [Profiles/Links/Opportunities] Opportunity profiles now also display a link summary for their primary email address.

  • [Profiles/Links/Tickets] Ticket profiles now also display a link summary for their parent organization. This simplifies many support workflows where workers check a sender's organization for a domain, license, SLA, etc.

  • [Profiles/Calendars] Calendar event profiles now display their parent calendar as a link in properties.

  • [Profiles/Groups] Group profiles now display a Links tab for managing record links.

  • [Links/Contacts] Contact person records can now be searched and linked from the Links tab on other record profiles.

  • [Mail/Worklists/Search] Added a 'Has Attachments' filter to ticket worklists. This matches attachments on any message in a ticket's conversation history.

  • [Mail/Worklists/Search] Added a 'Has Attachments' filter to message worklists. This can filter the worklist to only messages that either have or don't have attachments.

  • [Mail/Worklists/Search] Added an 'Attachment Name' filter to message worklists. This can match wildcards like (.zip), as well as multiple values like (.jpg OR *.png).

  • [Mail/Worklists/Search] Added an 'Attachment Name' filter to ticket worklists. This can match wildcards like (.zip), as well as multiple values like (.jpg OR *.png). The filter will match any message in the ticket conversation history.

  • [Virtual Attendants/Scripting] Added a 'nlp_parse()' filter to Virtual Attendant templates for natural language processing. This allows more flexibility in communicating with Virtual Attendants through casual written text. The filter acts on a single line of text and accepts an array of patterns to test. The first matching pattern is used. For instance, text like "Remind me to perform server maintenance tomorrow at 5pm" can be summarized with the pattern "remind me [what] [when]". The natural language processing filter will return a JSON object with 'what' and 'when' filled in. Previously, this workflow had to be designed using regular expressions, which were less flexible and far less readable or elegant. This feature is very well suited for communicating with VAs as bots in SMS, IM, HipChat, Campfire, IRC, etc. Those channels deal mainly with natural text input rather than structured forms.

  • [CHD-4010] [Virtual Attendants/Workers] Moved the settings for language, timezone, and time format to built-in fields on worker records. Previously, these were stored in worker settings in a way that made them difficult to use in other functionality. Now, worker-based worklists can display timezones and languages per person, and the list can be filtered and subtotaled by the fields as well. Admins can set the language, timezone, and time format when creating or editing workers. Additionally, snippets and Virtual Attendants behaviors can refer to the language or timezone of each worker to localize the results.

  • [Profiles/Worker] More properties are now displayed at the top of worker profiles: link to email address, active/disabled, language, timezone, @mention name, and authentication method.

  • [Virtual Attendants/Help/Usability] Expanded the Virtual Attendant help popup with examples for: date/time display, date manipulation, and timezone handling.

  • [CHD-4008] [Virtual Attendants/Workers] Moved the 'availability calendar' setting to worker records. Admins can set worker calendars from Setup. Snippets and Virtual Attendant behaviors can reference a worker's primary calendar when creating or displaying events, and when determining availability.

  • [Virtual Attendants/Workers] Virtual Attendant behaviors that reference workers now have new placeholders for each workers' primary calendar. This simplifies many schedule-based behaviors.

  • [Setup/Workers/Calendars] When creating or modifying worker accounts, admins can now create a new calendar at the same time. Previously, workers had to create their own calendar (or admins had to do so while impersonating them), which added unnecessary complexity to the on-boarding process.

  • [CHD-4009] [Virtual Attendants/Calendars] The Virtual Attendant 'Create calendar event' action can now create events on calendars based on a behavior list variable. Previously, only a single explicit calendar could be provided, which limited the reuse of a behavior between multiple workers. This change is especially useful for webhook-based VA behaviors (bots) that schedule events for arbitrary workers.

  • [Virtual Attendants/Calendars] Virtual Attendant behaviors can now change the date of a calendar object by setting the '__scope_month' and '__scope_year' keys in the dictionary at any depth. Previously, VAs could only display the events from a calendar at the current month and year, while the REST API could use the &month and &year parameters to set them.

  • [Worklists/Search/Usability] The quick search popup on worklists now shows the targeted list name in the title. Previously the popup's title was only "Search", which made it difficult to tell which worklist would be affected when there was more than one on the same page.

  • [Web-API/Localization] The REST-API will now use the authenticating worker's language, timezone, and time format settings for responses. Previously, responses were always returned in GMT/UTC. This wasn't a problem for most timestamps, where the caller could convert them, but it did affect other areas like the display of calendar events when using options like 'weeks_events'.

  • [Calendars/Virtual Attendants/Web-API] In Virtual Attendant behaviors and REST-API requests, calendar dictionaries now provide an 'events_occluded' key . Like the 'events' key, this returns a list of events for the selected month and year, but it will filter out any available events that are completely covered with busy events. This could be handled previously with caller code, but this new key saves the extra work.

  • [Calendars/Virtual Attendants/Web-API] In Virtual Attendant behaviors and REST-API requests, calendar dictionaries now provide a 'weeks_events_occluded' key . Like the 'weeks_events' key, this returns a list of events for the selected month and year organized as a grid of days and weeks, but it will filter out any available events that are completely covered with busy events. This could be handled previously with caller code, but this new key saves the extra work.

  • [Virtual Attendants/Scripting] Added the 'json_pretty' filter to the scripting auto-suggestions in Virtual Attendants.

  • [Virtual Attendants/Help/Scripting] Added sections to the Help popup for Virtual Attendant scripting for: Arrays and objects, Modifying objects and arrays, and JSON prettification.

  • [Virtual Attendants/Help/Scripting] In the Virtual Attendant scripting Help popup, the most relevant example code for each section is now highlighted in bold for readability.

  • [Virtual Attendants/Scripting] In Virtual Attendant scripting, added a 'dict_set(var, key_path, value)' function. This provides a simple way to set values for nested keys on arbitrary objects and arrays. The existing 'set' command doesn't support nested keys. The 'dict_set' command takes a key path in dot-delimited format, and it will auto-detect object properties or array keys along the way. A key of '[]' can be used to append the value to the end of an existing array. Sample key paths look like "name.first" and "group.members.[]". See the Help popup in VAs for a usage info.

  • [CHD-2466] [CHD-2962] [CHD-3120] [Workspaces/Search/Quick Search]

    • Previously, using quick search required selecting a specific field from a dropdown and then typing some text. This would add a single field and then refresh the targeted worklist. The process was inefficient in many ways; particularly when adding several different fields, as you had to constantly change the dropdown field and wait for the worklist to refresh each time. It also inefficiently caused extra work for the database server. Additionally, new workers found this process confusing because there was no default for the most commonly used search field. After searching with a field, it also became the new default, which required changing the field nearly every time you wanted to search. It was anything but "quick".

    • Now, quick search is truly "quick". It's a single textbox that targets the most commonly searched field for each record by default (e.g. subject and content for messages, names for workers and orgs, email address and names for contacts). Additional fields can be filtered at the same time by just appending them to the search terms (e.g. "receipt status:open created:(-1 week)"). Many operators are supported (e.g. equals, doesn't equal, partial/prefix match, in list, not in list, greater/less than, between, etc). All of the quick search filters will be applied at the same time when you press enter, and they will replace any existing filters on the worklist. Your search text stays in place so you can make modifications and submit it again to further filter your results as needed. If you submit a blank search, it will reset the filters on the worklist. Rather than sticking to a 1:1 mapping between search fields and database fields, new "virtual" can now be introduced to streamline common search operations (i.e. they can add multiple related filters at once). This also means that the search field names can be more concise and human-readable (e.g. "sender" rather than "ticket first sender email address").

    • This new approach also significantly improves integration with external search engines like Sphinx and Elasticsearch. The default for most records can be a fulltext index that combines content from several fields; for instance, the default search for a message could simultaneously search subject, headers, sender, sender name, organization, body. These search platforms usually search every field by default, and then provide a syntax for targeting specific fields when desirable. This is much more user friendly, as most people these days expect to just type a few keywords in a single textbox. We'll continue to add new fulltext indexes to records where they make sense.
  • [Workspaces/Search/Quick Search] The quick search textbox now has a down-arrow icon on the far right. Clicking the icon brings up a search help menu that lists all the available fields. Examples are provided for each field in a submenu, and clicking on an example will append both the field and the text to the search textbox. The examples aren't exhaustive, but they provide a great starting point to teach workers about using quick search. On the development side, each field can now provide its own examples, so something like 'ticket mask' can have sensible examples rather than overly generalized ones. Fields with a limited set of possible options, like checkboxes or picklists, can now provide shortcuts to all their possible options through this menu. The menu also remains open until it's explicitly closed, so multiple selections can be made at once, including in followup searches.

  • [Search/Quick Search/Usability] Quick search now uses a more intelligent default when searching various text-fields. For instance, when searching ticket masks, names, and email addresses, simple text is now assumed to be a prefix (i.e. the first few letters of the desired match). When searching longer content, like ticket subjects or task titles, simple text is assumed to be a partial match that may occur anywhere in the field. This default behavior can be overriden by providing one or more explicit wildcard asterisks to use instead (e.g. prefix, partial, suffix).

  • [Workspaces/Quick Search/Custom Fields] All searchable custom fields are now available through quick search with human-readable aliases. Previously, the quick search dropdown listed custom fields by name but didn't organize them. Now, custom fields are grouped together by their fieldset (with dot-notation) and their names are simplified (e.g. sla.plan, sla.expires, mobile.number).

  • [Workspaces/Search/Quick Search] All the recent improvements to quick search are now available through the search icon on any worklist. This is particularly useful on workspace pages with several lists, and other locations where a quick search textbox isn't displayed by default.

  • [Choosers/Quick Search/Usability] Chooser popups will no longer "jitter" based from resizing when focusing or unfocusing the quick search textbox. This issue was caused by the previous method of displaying quick search 'hints'. The new quick search uses a floating menu, and it doesn't resize the popup.

  • [Workers/Records] Added an 'updated' field to worker records to simplify synchronization with other apps and services. This can be used to filter to only records which have been updated since the last check.

  • [Orgs/Records] Added an 'updated' field to organization records to simplify synchronization with other apps and services. This can be used to filter to only records which have been updated since the last check.

  • [Contacts/Records] Added an 'updated' field to contact records to simplify synchronization with other apps and services. This can be used to filter to only records which have been updated since the last check.

  • [Groups/Records] Added 'created' and 'updated' fields to group records to simplify synchronization with other apps and services. This can be used to filter to only records which have been updated since the last check.

  • [Search/Workers] Added a full-text search index to worker records. This indexes first and last names, email addresses, titles, and @mention names. All of these fields are now searched by default from quick search on a worker worklist. Previously, each of these fields had to be searched independently.

  • [Quick Search/Usability] Quick search queries can now be shared in URLs as the 'q' parameter. For instance, /search/ticket?q=receipt

  • [Search/Addresses] Added a full-text search index to email address records. This indexes email addresses and first/last names. These fields are now searched by default from quick search on an address worklist. Previously, each of these fields had to be searched independently.

  • [Search/Orgs] Added a full-text search index to organization records. This indexes name, street, city, state/province, postal code, country, and website. All of these fields are now searched by default from quick search on an org worklist. Previously, each of these fields had to be searched independently.

  • [Search/Contacts] Added a full-text search index to contact person records. This indexes the mailbox and full contact name for all linked email addresses. All of these fields are now searched by default from quick search on a contact worklist. Previously, each of these fields had to be searched independently.

  • [Search/Snippets] Added a full-text search index to snippet records. This indexes the title and content. These fields are now searched by default from quick search on a snippet worklist. Previously, each of these fields had to be searched independently.

  • [Search/Plugin Library] Added a full-text search index to plugin library records. This indexes each plugin name, id, author, description, and link. All of these fields are now searched by default from quick search in Setup->Plugin Library. Previously, each of these fields had to be searched independently.

  • [Search/Contacts/Comments] Contact person records can now be filtered by comment text.

  • [Search/File Bundles/Comments] File bundle records can now be filtered by comment text.

  • [Search/HTML Templates/Comments] Mail HTML template records can now be filtered by comment text.

  • [Search/Messages/Notes] Message records can now be filtered by sticky note text.

  • [Search/Tickets] Ticket worklists can now be filtered by matching the headers of any associated mail messages. This was previously only possible from message worklists.

  • [Virtual Attendants/Calendars/Workers] The 'Worker availability' condition on Virtual Attendant worker custom behaviors now accepts placeholders for the 'from' and 'to' options.

  • [Quick Search/Usability] The quick search helper menu can now be closed with the escape key.

  • [Virtual Attendants/Usability] In Virtual Attendants, the 'run behavior' and 'schedule behavior' actions, as well as the simulator', will now automatically expand textbox heights as the worker types additional content.

  • [Search/Platform] MySQL Fulltext indexes no longer log a PHP error when creating the index table for for the first time.

  • [Quick Search/Usability] It's now possible for quick search for multiple workers plus nobody, like "owner:jeff,dan,nobody".

  • [Search/Engines/Schemas] Search schemas now provide a dictionary of key/values to be indexed. Previously, only a single block of text was provided (usually with multiple fields concatenated together). This change allows search engine extensions to index individual fields as well as the combined content. For instance, with the Elasticsearch extension, you could search (subject:these words) or (mask:ABC).

  • [Search/Engines/Elasticsearch] Implemented an Elasticsearch extension for full-text indexing Cerb records. This can be configured in Setup->Configure->Search. Elasticsearch is much faster than MySQL Fulltext, and it's very easy to get started with (especially compared to Sphinx), since very little configuration is required by default.

  • [Search/Usability] When viewing any /search page, the quick search textbox will be automatically focused.

  • [Search/Addresses] The default fulltext index for email address records now indexes the organization name as well.

  • [Quick Search/Usability] The quick search helper nows provide syntax examples based on the selected search engine (MySQL FT, Elasticsearch, Sphinx). These can be overridden per schema in Setup->Configure->Search.

  • [CHD-4028] [Virtual Attendants] Fixed an issue with the 'Ticket has owner' condition in Virtual Attendant behaviors. It was always evaluating to "false".

  • [Virtual Attendants/Scripting] Added an array_diff($array1, $array2) function to Virtual Attendant scripting. This makes it easier to detect changes between two arrays, which is useful for behaviors that compare multi-checkbox custom fields (e.g. Record changed), etc. See the in-app Help popup for an example.

  • [Virtual Attendants/Scripting] Added split_crlf($str) and split_csv($str) filters to Virtual Attendant scripting. These are used to split strings into arrays by linefeeds and commas, respectively. A split() filter already existed, but it was naive (it didn't automatically handle spaces after commas, remove blanks, etc).

  • [Web-API/Quick Search] Implemented quick search for all the record types in the REST API. You can now send a 'q' parameter with the quick search query in addition to, or instead of, the criteria/oper/value parameter triplets. Parameters can still be added to force additional constraints, such as limiting a client's full-text search to their own history.

Webhooks Plugin

  • [Webhooks/Plugin] Added a 'Webhook received' event for Virtual Attendant behaviors. The webhook plugin can route incoming HTTP requests to these behaviors for handling. For instance, every time an invoice is paid in Freshbooks, a webhook event can instantly be sent to Cerb, and a Virtual Attendant can load the relevant client/payment information and do anything with it (post to a HipChat room, etc).

  • [Webhooks/Plugin] Virtual Attendant behaviors on the 'Webhook received' event can now set the HTTP response headers and body as actions.

  • [Webhooks/Plugin/Developers] When defining webhooks, extension-based handlers are now available. By default, webhook requests can be sent to Virtual Attendant behaviors on the 'Webhook received' event. Plugins can contribute new webhook handlers.

  • [Webhooks/Plugin] Virtual Attendant behaviors on the 'Webhook received' event can now use the value of the HTTP body from the 'http_body' placeholder.

  • [Webhooks/Plugin] Added a 'Set timezone' action to Webhook Received events in Virtual Attendants. This affects all the date/time parsing and display for the duration of the request, which is useful for localizing interaction with a specific worker.

Properties ID: 000112   Views: 8897   Updated: 2 years ago
Filed under: