Cerb Changelog

What's new in Cerb 7.3.7

Apr 1, 2017
  • [Worklists/Explore] Fixed an issue on ticket and message worklists. Using ‘Explore Mode’ on a very large worklist could cause a denial-of-service in MySQL.
  • [Maint/Tasks] Fixed an issue where the maintenance job was removing attachments if they were only linked to records and not attached to a message or comment.
  • [Mail/Parser] Fixed an issue where inline image attachments weren’t displaying on some HTML messages.
  • [Profiles/Links] Fixed an issue in the Links section at the top of ticket profiles. If the ticket wasn’t associated with an organization, links could still be set on the empty organization.
  • [Support Center] Fixed an issue in the Support Center portal on the ‘my account’ page. There were occasionally browser Javascript errors regarding $(img) (the profile picture) when blank.
  • [Nav/Notifications] Fixed an issue with the notifications worklist opened from the worker menu. The worker:me quick search filter didn’t work with the new deep search functionality. worker.id: is added instead.
  • [Bots] Fixed an issue with bots in the ‘Before new mail is accepted’ event. The attachment name, size, and mime type conditions weren’t matching properly.
  • [Support Center/CAPTCHA] In the Support Center portal, on the Contact Us page, the CAPTCHA can now be configured to display for: Everyone, Anonymous visitors, or Nobody.
  • [Mail/Parser] Fixed an out-of-memory error in the email parser with some large HTML messages (>1MB) when a plaintext part need to be generated.
  • [Mail/Parser] Fixed an issue in the email parser when converting an HTML message into plaintext. In some cases the resulting content could be double-spaced.
  • [Bots/Calendars] Fixed an issue with the ‘Create calendar event’ action on bot behaviors. The list of calendars wasn’t loading properly.
  • [Bots/Connected Accounts] Fixed an issue in bots with the ‘Execute HTTP Request’ action using authorization from connected accounts. If the connected account changed the URL (e.g. to add an auth token query string param) this wasn’t reflected in the final request.
  • [Platform/Developers/Cards] When using the .cerbPeekTrigger() jQuery method to add card functionality to a UI element, the cerb-peek-opened event now includes a reference to the popup as well as context/id values. This makes it much easier to procedurally control the opened popup. For instance, a conversational bot can open the calendar event editor and pre-fill form fields based on its interaction with a worker.

New in Cerb 7.3.6 (Mar 27, 2017)

  • [Choosers/Usability] When a new record is added from a chooser, it is now automatically selected. Previously, a worker had to create the record and then find it in the worklist to select it. If the chooser is in ‘single selection’ mode it will close with the selection after creating the record.
  • [Choosers/Usability] Fixed an issue on choosers where the worklist toolbar icons were being resized too small.
  • [Links/Search/Usability] When opening a worklist from a search button in the ‘Links:’ section of a card or profile, quick search is now available above the list. Previously this had to be opened manually from the search icon above the worklist.
  • [Profiles/Tasks] Added the ‘Owner’ field to the properties at the top of task profiles.
  • [Profiles/Tasks] Added the ‘Importance’ field to the properties at the top of task profiles.
  • [Bots/Actions/Tasks] On task-related bot behaviors, the ‘Importance’ field can now be set.
  • [Bots/Actions/Tasks] On task-related bot behaviors, the ‘Owner’ field can now be set using values or variables.
  • [Bots/Actions/Tasks] On task-related bot behaviors, the ‘Set status’ action now properly shows simulator output.
  • [Bots/Actions/Tasks] On task-related bot behaviors, fixed a defect where the ‘Set due date’ action could also affect the importance field.
  • [Bots/Actions/Tasks] In bots, when using the ‘Create task’ action, the ‘Owner’ field can now be set using placeholders, variables, or workers.
  • [Bots/Actions] In bots, when using a ‘Set’ action on an owner field or worker custom field, variables and placeholders can now be used.
  • [Bots/Actions/Tickets] In bots, when using the ‘Create ticket’ action, the ‘Owner’ field can now be set using placeholders, variables, or workers.
  • [Bots/Scripts/Snippets] Fixed an issue in bot scripts and snippets where the |bytes_pretty and |date_pretty filters only worked with text input. It’s now possible to use numbers again as well.
  • [Bots/Actions/Tickets] In bots, fixed an issue with the ‘Create ticket’ action. Setting the ‘Status:’ field to ‘closed’ didn’t work as expected.
  • [Preferences] Fixed an issue that prevented some workers from saving their preference settings.
  • [Installer] Fixed an issue in the installer. If PHP’s opcache was enabled and the installer changed the framework.config.php file, the next step could receive a stale version of the config file even after the previous step validated the database connection settings. This is due to the opcache.revalidate_freq setting, which by default checks a file every 2 seconds for changes. This caused a blank while screen in the installer, and a page refresh after 2 seconds would resume the installer properly. Now the installer will pause for 2.5 seconds after writing the config file, and it will show a proper error screen (with a retry button) if the database still doesn’t connect properly.
  • [Installer] The installer now checks for the ‘mbstring’ extension before running. The template service requires this, so a pretty error in the requirements can’t be displayed without it. When mbstring was missing the installer was just displaying a blank white page.
  • [Bots/Notifications] Fixed an issue with the ‘Create notification’ action in bots. Placeholders weren’t being evaluated in the notification URL.
  • [Notifications] Fixed an issue with notification worklists where custom notification URLs weren’t being displayed properly.

New in Cerb 7.3.2 (Mar 5, 2017)

  • [Tickets/Sticky Notes/Usability] Fixed an issue with sticky notes on ticket profiles. When replying to a ticket, adding a sticky note or comment to a ticket refreshed the message and closed the reply form. New comments and messages are now inserted into the timeline dynamically so they don’t interfere with other functionality.
  • [Profiles/Bots/Scheduled Behavior] Fixed an issue that prevented scheduled behaviors from being deleted on profiles.
  • [Bots/Email] In bots, the ‘Send email’ action now supports the ‘Cc:’ and ‘Bcc:’ headers.
  • [Mail/Attachments/Usability] When viewing a ticket profile, each expanded message with attachments now has a new button in its top right toolbar as a visual indication of this. Clicking on this button displays all the attachments linked to the message in a search popup. This addresses feedback where workers could miss attachments on messages with long blocks of quoted text (that pushed the attachments below the fold) when using the R shortcut to reply.
  • [Installer/Platform] Fixed an issue with the requirements checker when PHP’s memory_limit is -1 (disabled) in the php.ini file.
  • [Installer/MariaDB] Fixed an issue in the installer requirements checker when using MariaDB. Previously, the MySQL version test returned inconsistent results between MySQL, MariaDB, and Aurora. Now the installer just attempts to create a table with a fulltext index using the selected engine and reports if the test fails.
  • [Debug/Status] Updated the /debug/status report to track activity counts using the activity log rather than sessions. Old sessions can be cleaned up, which misreports activity.
  • [Debug/Status] On the /debug/status report, the enabled plugin count is now accurate. Previously this included any installed plugins that may have been disabled.
  • [Debug/Status] Added new counts to the /debug/status report: workers_active_12h, workspace_pages, workspace_tabs, workspace_widgets.
  • [Platform/Localization] Replaced all instances of strtolower() and strtoupper() with multibyte-safe equivalents.
  • [Mail/Drafts] Improved error reporting when mail fails to send and is saved as a draft. In some situations, mail fails to send due to “RFC compliance exceptions”. These error messages are now added as sticky notes on the draft. Errors from mail transports were already being reported like this.
  • [Worklists/Tickets/Subtotals] Fixed an issue on ticket worklists. Clicking on organization subtotals wasn’t adding a new filter.
  • [Bots/Cards] Fixed an issue when adding or editing bots. The ‘Mention:’ field was being auto-focused instead of ‘Name:’.
  • [Worklists/Comments/Usability] On comment worklists, added the Shift/Cmd+Click shortcut for opening profile links in new browser tabs/windows rather than cards.
  • [Setup/Mail/Transports] When deleting a mail transport from Setup, the transport is no longer tested first. Some users were trying to delete invalid mail transports and were being improperly blocked by the validity test.
  • [Worklists/Tickets] On ticket worklists, fixed an issue where the ‘spam’ and ‘not spam’ buttons had no effect if the ticket was already trained.
  • [Bots/Cards/Usability] Added a ‘Simulator’ button to the top of behavior cards. Previously, this option was in the decision tree menu, which wasn’t very obvious.
  • [Bots/Cards/Usability] When viewing a bot behavior card with an empty decision tree, helper text is now displayed that explains what to do next.
  • [Workers/Impersonation] Fixed an issue in Chrome (and possibly other non-Webkit browsers). When un-impersonating a worker as an admin, if the last thing you did was change the worker’s settings, then the same settings would be saved to your own account as well. This happened because the window.location.reload() function resubmitted the form in both sessions.

New in Cerb 7.2.5 (Jan 25, 2017)

  • [Worklists/Search] Fixed an issue with searching message content from ticket worklists. A ticket could be duplicated in the search results for as many of its messages matched the search term. Due to paging in the worklist, this could lead to far fewer matches being displayed than were actually returned.
  • [Worklists/Search] Fixed an issue that prevented the 'msgs.notes:' quick search filter from returning results on ticket worklists.
  • [Worklists/Search/Elasticsearch] Fixed an issue with Elasticsearch integration where cached results were always treated as a large collection (using a less efficient "JOIN") even if they contained a small number of IDs that could be handled more efficiently with a "WHERE id IN(...)".
  • [Worklists/Search] Added an 'id:' quick search filter to bucket worklists.
  • [Worklists/Search] Added an 'id:' quick search filter to calendar event worklists.
  • [Worklists/Search] Added an 'id:' quick search filter to task worklists.
  • [Setup/Bots] Fixed an issue in Setup where Bots->Search wouldn't be remembered as the last viewed page when clicking the 'Setup' link again.
  • [Worklists/Search] Added an 'id:' quick search filter to activity log worklists.
  • [Worklists/Search] Added an 'id:' quick search filter to worker worklists.
  • [Worklists/Search] Added an 'id:' quick search filter to contact worklists.
  • [Worklists/Search] Added an 'id:' quick search filter to organization worklists.
  • [Worklists/Search] Added an 'id:' quick search filter to custom fieldset worklists.
  • [Worklists/Search] Added an 'id:' quick search filter to file bundle worklists.
  • [Worklists/Search] Added an 'id:' quick search filter to message worklists.
  • [Worklists/Search] Added a 'worker.id:' quick search filter to message worklists.
  • [Worklists/Search] Added a 'group.id:' quick search filter to message worklists.
  • [Worklists/Search] Added an 'id:' quick search filter to snippet worklists.
  • [Worklists/Search] Added an 'id:' quick search filter to opportunity worklists.
  • [Worklists/Search] Added an 'id:' quick search filter to feedback worklists.
  • [Worklists/Search] Added an 'id:' quick search filter to knowledgebase article worklists.
  • [Worklists/Search/Workers] Fixed an issue that prevented worker full names from search indexing properly.
  • [CHD-4513] [Mail/Usability] When writing email in Markdown mode, clicking the 'Link' button now prompts for a URL rather than inserting "example.com" placeholder text.
  • [Bots/Simulator] Fixed an issue in the bot behavior simulator where the decision tree wasn't rendered properly after backporting a fix to 7.2.x from 7.3.
  • [Cards/Groups] Fixed an issue on group cards where the counts were displayed incorrectly on the search buttons for open, waiting, and closed tickets.
  • [Worklists/Quick Search] Fixed an issue with quick search on worklists where a fulltext filter didn't always work if it was the last term following at least one field.
  • [Search/Messages] Fixed an issue with permissions on message worklists.

New in Cerb 7.2.2 (Sep 8, 2016)

  • [CHD-4434] [Setup/Portals] Fixed an issue where the community portal cache wasn't refreshing after a new portal was created.
  • [CHD-4433] [Mail/Attachments] Fixed an issue where non-members couldn't view the attachments of a public group.
  • [CHD-4435] [Profiles/Links/Buckets] Fixed an issue on the 'Links' tab of a profile. If specific buckets were linked to a record, the worklist didn't filter to only those linked buckets.
  • [Platform] Fixed some compatibility issues with the latest versions of PHP7.
  • [Bots/Variables] Fixed an issue in Virtual Attendants with the 'Set variable' action when using the quick search option. Editing the action wasn't showing the current value.
  • [Worklists/Tickets/Bulk] Fixed an issue with bulk update on ticket worklists where the 'Move' option was being ignored.
  • [CHD-4440] [Placeholders/Menus] Fixed an issue with placeholder chooser menus where some custom field placeholders weren't listed. This occurred when a shorter placeholder wholly existed in the path of a longer placeholder. For instance: "IT -> Department" and "IT -> Department -> Priority". In this situation, the shorter placeholder was treated as only an expansion submenu for the longer placeholder. Now the shorter placeholder is both clickable and a submenu. The fact it is clickable is denoted by a bold label.
  • [CHD-4437] [Worklists/Ticket] Added a 'worker.replied:' quick search filter to ticket worklists. This returns tickets where any of the given workers wrote at least one outgoing message on the conversation.
  • [Worklists/Ticket] Added a 'worker.commented:' quick search filter to ticket worklists. This returns tickets where any of the given workers wrote at least one comment on the conversation.
  • [Worklists/Messages] Implemented the 'Ticket ID' filter on message worklists. This previously showed up in the filter list but didn't provide any options.
  • [CHD-4436] [Worklists/Messages] Message worklists can now be subtotaled by ticket ID or mask.
  • [CHD-4442] [API/Comments] Fixed a bug that prevented comments from being created properly through the REST API.
  • [CHD-4432] [Worklists/Export] When exporting a worklist, the configured fields on that record's card will be automatically selected as the defaults.
  • [CHD-4377] [Web-API/Comments/Attachments] In the REST API, 'expand=attachments' will return an array of attachments for comment objects.
  • [CHD-4377] [Web-API/Messages/Attachments] In the REST API, 'expand=attachments' will return an array of attachments for message objects.
  • [CHD-4428] [Bots/Outcomes/Usability] When editing a Virtual Attendant behavior outcome, the available conditions are now displayed in nested menus rather than a huge list. This makes it much faster and simpler to work with.
  • [CHD-4428] [Bots/Actions/Usability] When editing a Virtual Attendant behavior action, the available actions are now displayed in nested menus rather than a huge list. This makes it much faster and simpler to work with.
  • [Bots] Fixed an issue where some custom field based outcomes weren't being tested properly if they were deeply nested.

New in Cerb 7.0 (Jun 12, 2015)

  • [Platform/Storage/Plugins] Virtualized the way filesystem paths work for storage and plugins. In most cases the previous way worked fine (where cerb/storage/ was the assumed path), but this change makes it possible to host multiple instances of Cerb in cloud environments where the individual storage paths aren't located at cerb/storage/. With a single site, that path could be symlinked to anywhere else, but when multiple sites share the same Cerb files the solution needs to be at the application-level rather than in the underlying filesystem. This change makes it much easier to run and scale cloud deployments of Cerb using distributed filesystems, etc. The storage location can even change while Cerb is running and installed plugins won't be affected (where, previously, their full paths including storage/ were stored in the database; now we just use 'plugins/plugin.id').
  • [CHD-1870] [Platform/Performance/Scaling/Database] Cerb now fully supports master/slave database replication setups, where writes are sent to the master(s) and reads can be distributed among many slaves. Master/slave replication has always been possible for high-availability and failover, but Cerb never took advantage of the idle slave databases for improving read performance. Previously, master/slave query splitting was only naively possible by using database proxies like MySQLproxy or MaxScale as an intermediary. Those tools simply sat between Cerb and the database and routed SELECT queries to the slaves and everything else to the master. That process couldn't handle some important types of queries that depend on deeper application knowledge (temporary tables, character encoding, etc). By handling the routing to master or slave connections directly in Cerb, we can make those decisions very intelligently while also optimizing performance.
  • Meta information about the database (e.g. table list, table schemas) is always read from the master to ensure that the most recent information is used. Similarly, all database queries executed by the installer and update process are sent to the master because "eventual consistency" (updates in slaves slightly lagging behind updates in the master) could cause inconsistencies. These processes run infrequently and don't have a major impact on performance or scaling. Temporary tables are created on the same connection where they're used (e.g. master for maintenance queries that modify the database, slaves for searches that join temporary tables created from external search services). All the rest of the read-intensive content -- like workspaces, worklists, dashboards, reports, and profile pages -- are almost exclusively sent to slaves. Utilizing database slaves to serve most of the content is where the major performance improvements and scalability come from.
  • The use of database slaves for improving read performance can be enabled by setting the APP_DBSLAVE* values in the framework.config.php file (host, user, password). While a single slave host can be defined in Cerb, you can put a proxy or load balancer in front of multiple slaves to scale. This could rotate between the slaves for each new connection (e.g. round-robin, least loaded, most current). Similarly, master-master replication can be utilized by specifying a proxy or load balancer for the master host. Since Cerb often generates multiple parallel HTTP requests for a single page (the outer page, a tab's content, and several worklists or widgets), multiple database slaves can be utilized to render this output more quickly.
  • Cerb will always route queries to either a master or slave, but when slaves aren't configured then the master serves as both roles. In this case, a single connection will be used (instead of two) to minimize wasted resources on the database server.
  • [Platform/Database/Plugins/Developers] To use the new read/write splitting to master/slave databases, developers should update their plugins to use the new database functions. For instance, $db->Execute() has been deprecated in favor of ->ExecuteMaster() and ->ExecuteSlave(). Existing calls to ->Execute() will always be sent to the master. Likewise, new master/slave methods exist for ->GetOne(), ->GetRow(), and ->GetArray(). Existing calls to the generic, deprecated method will always be sent to read slaves. To optimize performance, these queries should be made explicitly as reads or writes so they can be routed accordingly.
  • [Platform/Localization] The language encoding in the framework.config.php now defaults to UTF-8. Previously, this defaulted to ISO-8859-1 (Western Latin) if the database wasn't originally created with UTF-8 default encoding (as MySQL's default was latin1). Using UTF-8 has been our recommendation for many years. UTF-8 can be used to display the web pages even if the database continues to use latin1.
  • [Platform] Removed the deprecated cache settings in the framework.config.php file since caching is now configured from Setup->Configure->Cache in the UI.
  • [Platform] Removed the deprecated APP_DB_DRIVER setting in the framework.config.php file since 'mysqli' is now required.[Code Cleanup] Added APP_DBSLAVE* settings to the framework.config.php file.
  • [Platform] Defaulted DB_CHARSET_CODE to 'utf8' in the framework.config.php file. If you're still using legacy 'latin1' encoding, now is a good time to convert your database to UTF-8 to properly handle multibyte languages. You can also just fix the inevitable conflicted line in this file after upgrading if you want to continue using your original settings. This new default was selected because it will match how most people are configured and cause a conflict for the least amount of people (i.e. not changing superior 'utf8' back to inferior 'latin1' on existing installs during the upgrade).
  • [Performance/Workspaces] If the schema of a worklist is unchanged during a request (page, sort by, columns, filters, etc), then it will no longer be redundantly persisted to the database. Previously, most worklists were always saved after being accessed regardless of whether or not they had changed during the request. This created some extraneous write traffic on the database (and any subsequent replication, binlog backups, etc). This is now handled more efficiently for all worklists, including those provided by plugins.
  • [Performance/Sessions] The worker activity information in "Who's Online" now only updates once per request. Previously, it was possible for multiple activities to be sequentially written to the database even though the last one would replace all the earlier ones. This created some extraneous write traffic on the database.
  • [Performance/Sessions/Profiles] Previously, all worker activity for "Who's Online" was updated once per 30 seconds. This waiting period has now been extended to once per 60 seconds. When this interval was first established, there wasn't a way for some activities (e.g. viewing a ticket profile) to ignore the waiting period and always update a worker's activity. Now that this is possible, the default activity can wait longer to update in order to reduce database write traffic.
  • [Performance/Database] Improved the performance of several operations involving temporary tables (e.g. searching) by ensuring that primary keys were added to the temporary tables.
  • [Performance/Database] Removed extraneous checks for the database connection status during a single request. Database connections no longer open until they're first used, and this connection checking is now handled in a simpler way.
  • [Performance/Database] Prevented extraneous database query lookups when the ID of a record is zero (non-existent). These extra lookups were happening in places like ticket profiles, where organizations are looked up for senders, and the orgs may be blank.
  • [Performance/Worklists/Database/Developers] Worklists now automatically persist worker changes (page, sort, columns, filters) and only update the database when necessary, once at the very end of the request. Previously, developers had to explicitly write a ::setView() call to persist changes. Persistence was also forced in some places in the API as well. This led to a situation where changes to a worklist could be persisted multiple times per request, even when there weren't any changes. This created extraneous write queries to the database server.
  • [Performance/Database/Cache] When Cerb caches all records for small sets (workers, roles, groups, buckets, custom fields) it will always use the master database. These caches are usually invalidated based on changes taking place in the database, and retrieving the latest record from the master ensures the most recent copy. Reading immediately from a slave could cache records prior to the change taking place if replication was slightly delayed.
  • [Storage/Performance/Database] The database storage engine will now use the default master/slave connections when no external host is specified. The connections are also established lazily, so a slave read doesn't require that the master be contacted at all.
  • [Platform/Tests] Added a unit testing framework and many new tests to the 'tests/' directory of the project. This can be used for automatically testing builds during clones, commits, pull requests, etc. Unit tests help to ensure that developers and contributors don't break existing code while implementing new features or fixing bugs. We have many testing scripts that will be consolidated here so they're accessible by the entire community. The tests are run from the command line and access to the directory should be blocked for all web traffic.
  • [CHD-374] [CHD-4003] [Mail/Transports] Multiple outgoing mail transports may now be configured from Setup->Mail->Transports (e.g. SMTP, Mailgun). Previously, it was only possible to have a single outgoing mail server configured for the entire Cerb installation. This change makes it easier to manage multiple brands in a single Cerb instance, where various sending domains need to use different SMTP servers or authentication methods. It's also possible to implement new transports through the plugin system to take advantage of special features like the Mailgun API (open/click tracking, campaigns, auto-unsubscribe links, etc). Each reply-to address (the addresses Cerb sends mail as) can now specify a particular mail transport to use. A default mail transport can be configured. The previously configured SMTP server will be automatically created as the new default during the upgrade process.
  • [Mail/Transports] Added a new 'Null' mail transport. This discards outgoing mail without delivering it, which is useful for development, testing, and evaluation environments where live mail should not be delivered. Previously, the same functionality was possible by configuring a null transport in a mail server like Postfix -- or using a dummy mail server like the one provided by Python -- but those options require several extra steps. Now Cerb can simply be configured to not deliver mail, and it can be installed on test machines without needing access to a live mail server during installation.
  • [Installer] Updated the aesthetics of the installer to reflect the newest Cerb style.
  • [Installer/Mail] The installer can now configure outgoing mail using the SMTP or Null transports. The latter makes it easier to set up development, testing, or evaluation environments.
  • [Installer/Workers] When the installer creates the initial administrator account, the worker's first and last name can be provided so they don't need to change that after logging in.
  • [Installer/Workers] When the installer creates the initial administrator account, the worker's timezone can be set. The initial value is automatically detected.
  • [Installer/Workers] When the installer creates the initial administrator account, the worker's default calendar is now automatically created. Previously, this had to be created manually after logging in, while adding subsequent new worker accounts would automatically create those calendars.
  • [UI/Performance] When remembering the previously selected tab on a page, Cerb now efficiently stores this information in HTML5 localStorage in the worker's browser (client-side), rather than persisting it to the session (server-side). To the worker this behaves identically; but from a performance standpoint, this optimizes away a lot of needless session updates that wrote to the database (and possibly needed to replicate, and/or be backed up in the binary logs, etc).
  • [Setup/Mail/Usability] In Setup, changed the 'Mail->POP3 Accounts' menu option to 'Mail->Mailbox Accounts'. There can be multiple types of mailboxes (POP3, IMAP, and possibly even API-driven accounts), so naming the menu option as only one of these was a source of confusion.
  • [UI/Aesthetics/Gravatar] When the Gravatar plugin is enabled, profile pictures for workers and contacts are now rendered as circles rather than squares. This provides a more modern aesthetic.
  • [Mail/Reply/Usability] Changed the default behavior of the mail reply textarea to not auto-grow as the user types new lines. This can be re-enabled from worker settings. There were numerous reports of it causing lag in some browsers, as well as causing some weirdness with scrollbar positions.
  • [Platform/Dependencies] Updated the jquery.atwho and jquery.caret plugins to their latest versions.
  • [Snippets/Usability] Fixed some usability issues with the snippets popup when composing and replying to mail. In some browsers (especially Internet Explorer) the focus of the reply textarea could be lost when inserting snippets. Additionally, when closing the snippets popup the reply textarea scrollbars could skip around and require manual repositioning.
  • [Mail/HTML] When reading mail, HTML messages are now displayed inline without having to click the original_message.html attachment to view them.
  • [Platform/CSS/Developers] The cerb.css stylesheet is now built using the Sass CSS preprocessor. The source files are in the /install/extras/developers/css/cerb.css/ directory. This makes it much easier to manage the styles consistent for a large and complex application like Cerb.
  • [Platform/Performance] Email address and organization records are now retrieved more efficiently with a local memory cache for the duration of the request.
  • [CHD-3656] [Plugins/Gravatar] The Gravatar default icon is now served directly from Cerb. Previously, this was served from a static URL, which was triggering browser warnings for SSL connections. When the Cerb install is behind a firewall or on an intranet, the Gravatar plugin can now be configured to use any URL for the default icon.
  • [Platform/Dependencies] Updated the jQuery hoverIntent plugin from version r7 (2013-03-11) to 1.8.1 (2014-08-11).
  • [Mail] On the ticket conversation history, the 'Date:' for a message was only being displayed if the raw message source contained that header. However, Cerb uses its own timestamps, which contain a default if a date wasn't provided. Consequently, this field is now always shown for every message.
  • [Platform/Search] Fixed an issue when attempting to run cron.maint to purge deleted records before the full-text search indexes have been built.
  • [CHD-3995] [Comments/@Mentions] When using @mentions to notify workers, the auto-suggestions now display each workers nickname, and filtering by that nickname (in addition to the full name) is now supported.
  • [CHD-4040] [Mail/HTML] When sending an HTML message using ordered lists, the generated plaintext part will now use numbered bullet points rather than unordered points.
  • [Platform/Tests] Added automated tests that create a new database, run all the patches, and add a default admin worker. This is used as the baseline for fully automated browser testing with Selenium.
  • [Platform/Tests/Selenium] Added automated browser tests using Selenium to log in to a fresh installation, close the tour, add the default mail page, configure mail transports, reply-to, add a default role, add a group, create co-workers, import orgs and contacts with a CSV file, add an owner custom field to tasks, enable plugins, configure calendars, etc.
  • [Skills] Implemented skills for matching workers with the most appropriate tickets, tasks, calls, opportunities, etc. Skills on a worker are considered to be competencies, and skills on other records are considered to be requirements. This informs the 'qualification' metric in the new recommender service. Skills have the following levels: none, basic, intermediate, advanced, and expert. A worker with a higher level of skill than the requirement is considered to be 'overqualified', while a worker with a lower level of skill than the requirement is 'underqualified'. A worker with the exact same skill level as a requirement is the best fit. This also provides a much more sophisticated way to automatically assign records to workers.
  • [Skills/Skillsets] Added skillsets as a way to group related skills. For instance, a Development skillset may contain skills like 'PHP', 'jQuery', and 'MySQL', while a 'Sales' skillset would contain 'Prospecting', 'Qualification', and 'Negotiation'. It's much quicker to add a single skillset to a record than trying to find and add all the individual skills. Skills in a skillset are ranked by dragging a slider to the desired level of proficiency.
  • [Mail/Importance] Added an 'Importance' property to ticket records as a scale between 0 and 100. Importance is set by dragging a slider when editing tickets, rather than dealing with arbitrary labels like 'low', 'normal', and 'critical'. The importance property is used as a metric in the new recommender system. Previously, prioritization was handled using custom fields, but that approach was inconsistent between Cerb environments. Additionally, using discrete priority categories made it more complicated to create escalation workflows; where the importance field can simply be incremented or decremented by some amount in the range of 0 to 100. This means that Virtual Attendants can simply add a fixed value to the importance of new tickets for organizations with a service-level agreement (SLA).
  • [Mail/Buckets] Removed the 'is assignable' property from bucket records. This feature is now handled more robustly by group responsibilities. Previously, the entire bucket was marked as containing assignable work or not. Now, each group member can be explicitly assigned responsibilities for the various buckets. Buckets with no assignees are assumed to contain non-assignable work (for the purposes of the assignment recommender, etc).
  • [CHD-4077] [Virtual Attendants/Mail/Relays] Fixed an issue where the 'Relay email' action didn't list all available workers when used in an app-owned behavior.
  • [Workspaces/Worklists] Fixed an issue with required filters on worklists that use placeholders (like 'current_worker_id'). In some situations, these were being converted to the actual current worker, which prevented them from displaying properly for other workers.
  • [Mail/Groups/Buckets] Group inbox buckets are now actual records in the database. Previously, inboxes were virtual records with id=0. This simplified some early workflows since 4.0, but it also made several queries less efficient because the group had to be compared every time as well. For instance, filtering by a 'Sales' inbox would require filters like (group_id=3 and bucket_id=0) rather than just (bucket_id=5). The 7.0 update automatically creates an inbox bucket for each group and moves the appropriate tickets into it, and the configuration of Virtual Attendant behaviors, mail routing rules, and worklists will be automatically updated.
  • [CHD-2839] [Mail/Worklists/Search] The group and bucket filters on ticket worklists are now independent. Previously, the group filter managed both of them. When clicking group and bucket subtotals from a worklist sidebar, only a single filter is added now. The bucket filter prefixes group names, like 'Sales: Inbox'. Filtering by inboxes now works as expected; where previously, adding a "not in" filter based on group inboxes excluded every group's inbox.
  • [CHD-3580] [Mail/Worklists/Usability] The 'move' action on ticket worklists is now more efficient. Previously, this displayed a searchable menu with a long list of every group and bucket. Now it simply displays two linked dropdowns, with the first selecting a group, and the second selecting one of its buckets. This is more consistent with how groups and buckets are set in the rest of the app.
  • [Machine Learning/Platform/Devblocks] Added a neural network service to Devblocks to support trainable, real-time machine learning in various features and for third-party plugins.
  • [Worklists/Groups/Explore] Implemented 'explore' mode for group worklists.
  • [Worklists/Workers/Explore] Implemented 'explore' mode for worker worklists.
  • [Mail/Buckets/Usability] Group buckets are now always listed in alphabetical order. Previously, buckets were manually ordered. This made it less intuitive to find a specific bucket in a list. Ticket worklist subtotals by bucket now sort properly by count.
  • [Worklists/Ticket/Usability] The 'Group' column on ticket worklists now provides links to each group's profile.
  • [Worklists/Ticket/Usability] The 'Bucket' column on ticket worklists now provides links to each bucket's profile.
  • [Worklists/Ticket/Usability] The 'Owner' column on ticket worklists now provides links to each worker's profile.
  • [Groups/Peek/Usability] Added a 'view full record' permalink to group peek popups.
  • [Mail/Buckets/Usability] Added worklists and profile pages for bucket records.
  • [Groups/Usability] Groups can now be marked as 'public' or 'private'. The content (e.g. tickets/tasks) in a public group are visible to non-members. This is very useful if you want only a few workers to be responsible for a group like Support, Billing, or Development, but you want all workers to have access to them. Private groups hide their content from non-members. Previously, all groups were treated as if they were private; which confused member responsibilities.
  • [Groups/Setup/Usability] Previously, the management of groups was handled in three different places (Setup->Groups, the groups page, and group profiles). These areas have been merged for simplicity. New groups can be added from Setup, but they are now configured directly from the profile page. The 'groups' page (in the top right of the navigation menu) has been removed.
  • [Mail/Importance/Usability] The new 'importance' field on ticket records now defaults to 50/100 rather than 0/100. This allows importance to be adjusted up or down upon initial record review. When sorting by importance, this also allows new tickets to be reviewed before anything that has been set to a lower priority (where, previously, everything on the low priority end was mixed together with new tickets).
  • [Notifications] Notifications are now more closely related to Activity Log entries. A notification message can link to multiple records (e.g. actor and target). This is also more readable since the entire notification isn't an underlined link. Previously, notifications were just a message and an arbitrary link, where the link could become stale if the record moved (e.g. Cerb install changed URLs/paths). Notifications are now based on the same events as the Activity Log. The upgrade process will automatically convert any existing notifications to the new format.
  • [Notifications/Subtotals] Notification worklists can now be subtotaled by activity type. This makes it much easier to clear out many notifications of the same type (e.g. "Worker followed a record").
  • [UI/Aesthetics/Icons] The icon style of the user interface (UI) has been modernized. Previously, we used two different sets of sprite icons. These images had conflicting styles and distracting colors which led many people to comment that the UI looked "dated". The new icons are font-based (via Glyphicons), which allows them to display cleanly at any size, and to be colorized consistently using standard CSS. They are monochromatic in color and "flat" in style.
  • [UI/Aesthetics/Buttons] The style of buttons throughout the UI has been improved. Button icons are now black on gray, and the labels are bold. This makes buttons more pronounced and recognizable compared to normal content.
  • [UI/Aesthetics/Worklists] The style of worklists has been improved. The list icons in the top right of the blue bar are now white (rather than multicolored). The action buttons below the list are black on gray. The peek button (shown when hovering over a row) now uses a standard "new window" icon.
  • [Groups/Responsibilities] Group managers can now configure per-bucket responsibilities for group members. Responsibilities are displayed as a "delta" slider. By default, members have average responsibility for every bucket (the midpoint of the slider). By increasing or decreasing these responsibilities, actionable records (e.g. tickets, tasks) can be assigned and escalated to the proper members much more easily. When a member has zero responsibility for a bucket, they are not shown that work when filtering by responsibility. This makes it simple to partition work within a group and hide records that are not relevant to particular workers. Previously, all group members were considered to be fully and equally responsible for every bucket within the group.
  • [Worklists/Watchers/Usability] The watcher buttons on worklists are now more condensed and subtle. Previously, these buttons were green by default and they displayed a (+) icon with a watcher count. Now, the only label on the button is the watcher count (which is 0 by default). The button is gray when the current worker isn't watching the given record, and green when they are.
  • [Worklists/Watchers] Workers can no longer add or remove each other as watchers from worklists or profiles. This concept is superseded by the new "recommendations" feature. Watching a record should only happen with a worker's permission.
  • [Mail/Messages/Custom Fields] Custom fields and fieldsets may now be set directly on message records. These fields are displayed at the bottom of each message in a ticket conversation (in the same format as other record properties). This is very useful for storing per-message data like customer satisfaction ratings, sentiment tracking (satisfied/unsatisfied), etc.
  • [Setup/Mailboxes] Mailbox accounts are now first-class records with worklists, profiles, peek, etc. Internally, all references to 'pop3 account' have been changed to 'mailbox'.
  • [Setup/Mailboxes/Log/Notifications] If a mailbox fails while downloading mail, a notification is sent to all admins with a direct link to the mailbox record. The event is also recorded in the record's Activity Log. Errors are recorded after 2, 5, 10, and 20 consecutive failures. Previously, notifications were sent to admins with a link to the setup page (rather than the individual account) and the event wasn't permanently logged.
  • [Plugins/Time Tracking] Fixed an issue that prevented the time tracking plugin from migrating directly from version

New in Cerb 6.9 (Jan 27, 2015)

  • 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 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.

New in Cerb 6.8 (Sep 17, 2014)

  • [Snippets] Improved the 'fill-in' placeholders on snippets. Previously these were defined by using arcanely formatted (___type here___) placeholders; now they are called 'prompted placeholders', and they're formally configured on snippet records. Previously, custom placeholders were limited to text fields; now they can use other data types like checkboxes. Prompted placeholders are used in a snippet in the same way as the other placeholders, and they can be given a type, a human-readable name, a label for prompting worker input, and a default value. The same placeholder can be used multiple times in the snippet, and its value now only needs to be set once. Prompted placeholders can now also be used conditionally to change the output of the snippet. For instance, a prompted checkbox placeholder could toggle a special paragraph on and off in the reply. Prompted placeholder values are now set in their own form, independent of the snippet, and a preview option is provided. Previously, custom placeholders were handled inline on the snippet preview, but this made them less flexible. As well, previously it wasn't possible for a blank custom placeholder to be omitted. The 6.8 migration script will automatically convert custom placeholders on all snippets to prompted placeholders.
  • [CHD-3758] [Snippets/Usability] Custom placeholders on snippets can be used multiple times after being set once.
  • [CHD-3747] [Virtual Attendants/Snippets] Virtual Attendants can use snippets with a new 'Set a custom placeholder using a snippet' action. This can use snippets for any record linked to the current target (e.g. a ticket sender's org), including prompted placeholders. Once the placeholder is set, it can be sent as an auto-response, used as a comment, etc. The most common use case for this feature is to allow snippets to be editable by workers who do not have permissions to modify Virtual Attendants directly. It also makes snippets reusable within and between Virtual Attendant behaviors.
  • [CHD-3790] [Search] Full-text searches using the 'MySQL Fulltext' engine can now consider every matching record when using additional filters. This is accomplished by reading data into a temporary database table while constructing the worklist, which provides a more balanced compromise between performance and relevancy. In 6.7, search performance was improved by checking full-text terms first and then applying the remaining worklist filters. The initial full-text results weren't affected at all by other filters like date ranges, status, or sender. This could lead to situations where very common search terms combined with very specific additional filters didn't return expected results. For instance, the full-text results for a worker's name could return 500 of 100,000 records (with no basis for determining relevance), and any additional filtering would only be working with a subset of the total results. An additional 'created date' filter only applied to those 500 results rather than the total set. This situation could be ameliorated by searching for more specific terms, but it wasn't obvious to a worker from the UI that extra results were being ignored based on their search term matching too many records.
  • [Setup/Search] The 'MySQL Fulltext' search engine can now be configured to return a specific maximum number of results. When this setting is blank there is no enforced limit. A higher maximum provides more results when common search terms are used, which increases the likelihood that additional filtering will produced the desired results. A lower maximum improves performance by considering the most relevant full-text matches, and preventing situations where 100,000+ results are retrieved and joined. The previous hardcoded limit was 500, which is now the editable default.
  • [CHD-3815] [Workspaces] Workspace pages may now be owned by the application. Previously, pages had to be owned by a role, group, or worker. This simplifies globally available pages compared to using an 'Everyone' role.
  • [Snippets] Snippets may now be owned by the application. Previously, snippets had to be owned by a role, group, or worker. This simplifies globally available snippets compared to using an 'Everyone' role as the owner.
  • [Pages/Usability] Added the 'peek' feature to workspace page worklists. The icon only shows up when the page is editable by the worker (e.g. group manager, admin, owner, etc). Previously, pages could only be edited from the 'Edit page' menu item when viewing them.
  • [CHD-3540] [Calendars/Usability] Calendars can now be configured to display start times for all displayed events in the grid. These times use the 12-hour or 24-hour clock from each worker's preferences.
  • [CHD-1238] [CHD-3831] [Calendars/Localization] Each calendar can now be configured to start the week on either Sunday or Monday. Availability calendars will use the setting from the calendar they are based on (e.g. a worker's schedule).
  • [Placeholders/Snippets/Virtual Attendants] Ticket records have a new requester_emails placeholder that contains a comma-separated list of recipients on the ticket. This can be used to simplify email-based actions on Virtual Attendants.
  • [Virtual Attendants/Action/Create Ticket] The 'Create Ticket' action in Virtual Attendant behaviors may now specify a status and reopen date.
  • [Virtual Attendants/Behaviors/Variables] Virtual Attendant 'Yes/No' behavior variables can now be configured to have a default state in the input form. Previously the form value always defaulted to 'No'.
  • [CHD-3878] [Virtual Attendants/Links/Variables] Virtual Attendants can now retrieve record links into behavior variables. Previously, links could only be saved into a placeholder. By using variables, additional behaviors can be run or scheduled on the results. For instance, from a ticket record, all of the linked time tracking entries can be saved into a variable so they can be added together and reported on.
  • [Web-API/Search] Fixed an issue with the 'sortBy' option in API searches not working properly. This was due to how Cerb prevents MySQL errors from sorting on a non-displayed column. When using the API, fields that are sorted by or filtered on will now automatically be added as columns in the underlying worklist that provides search results.
  • [CHD-3630] [Orgs/Mail/Profiles] The 'Mail History' tab on organization profiles now shows tickets assigned directly to an organization in addition to those with recipients who are its members.
  • [Virtual Attendants/Variables] Virtual Attendant behaviors may now create list variables for contact person records.
  • [Virtual Attendants/Variables/Mail] Virtual Attendant behaviors may now create list variables for message records.
  • [CHD-3886] [Virtual Attendants/Placeholders] Virtual Attendants can use a new 'is contact' placeholder on email address records to detect when an email address belongs to a known contact.
  • [CHD-3884] [Virtual Attendants/Mail] Added a new 'Message added to a conversation' event at the application-level. Previously it was only possible to do this at the group-level. This makes it possible to create behaviors like auto-responses and SLA handling in a single place.
  • [CHD-3882] [Support Center/Contact/Custom Fields] When adding contact situations to a Support Center contact form, fieldsets are now prefixed to custom field names.
  • [Support Center/Account] When configuring which custom fields are displayed on the My Account page in the Support Center, custom fieldsets are prefixed to custom field names.
  • [CHD-3883] [Support Center/Custom Fields/Files] File-based custom fields and fieldsets now work properly when included in Support Center contact forms.
  • [CHD-2135] [Address Book/Usability] Fixed an issue on email address peek popups where opening a linked organization popup would replace the original popup.
  • [CHD-3805] [Virtual Attendants/Custom Fields] If a date-based custom field contains a placeholder then it will no longer be automatically translated into an absolute timestamp. The previous behavior was causing problems with the 'Create ticket', 'Create task', and 'Create call' actions when relative dates like "+2 hours" were desired. Relative dates can still be used by formatting them like placeholders: {{"+2 hours"}}
  • [CHD-3715] [Mail/Activity Log/Split] The Activity Log now records message splits in both the source and the destination tickets.
  • [Mail/Merge] Fixed an issue where the merge helper could be improperly shown on deleted tickets that weren't merged.
  • [Mail/Support Center/Activity Log] Fixed an issue where activity log entries for ticket status changes from the Support Center could be improperly attributed to the wrong email address. These entries are retroactively corrected during the update.
  • [CHD-3871] [Scheduler/POP3] Timeouts can now be configured per mailbox in Setup. Previously these were hardcoded and had to be modified in the source code.
  • [CHD-3506] [Comments/Peek/Usability] All record peek popups that displayed comments are now capable of navigating through the comment history with next and previous links. Previously these popups only showed the latest comment.
  • [Addresses/Peek/Comments] Comments can now be viewed and created from address peek popups.
  • [CHD-334] [Mail/Profiles/Usability] When viewing a ticket profile, the title of the current browser tab will now include the ticket mask and subject. This helps differentiate multiple tabs without having to click into each of them.
  • [Workspaces/Usability] When displaying workspace pages, the browser title will now include the current page and tab information.
  • [Search/Usability] When using the search pages, the browser title will now display the current record type being searched to help differentiate tabs.
  • [Virtual Attendants/Calendars] Virtual Attendant behaviors can now add events to calendars using the 'Create calendar event' action.
  • [CHD-3869] [Virtual Attendants/Mail/Sticky Notes] Virtual Attendant behaviors can now add sticky notes to messages.
  • [CHD-2647] [Address Book/Orgs/Usability] When viewing the 'People' tab on an organization profile, a chooser is now displayed to find and select addresses. Previously, the only option was to create new address records (which is still possible from the chooser when needed).
  • [CHD-3697] [Virtual Attendants/Custom Fields] Virtual Attendant behaviors can set worker-based custom fields on 'Create task' actions using placeholders and variables.
  • [Virtual Attendants] Application-owned Virtual Attendant behaviors now have read and write permission on all records.
  • [Calendars] Fixed an issue on calendars where available events with no duration (i.e. same start and end time) weren't displayed properly.
  • [Virtual Attendants/Custom Fields/Mail] Virtual Attendant behaviors can set worker-based custom fields on 'Create ticket' actions using placeholders and variables.
  • [Virtual Attendants/Custom Fields/Calendars] Virtual Attendant behaviors can set worker-based custom fields on 'Create calendar event' actions using placeholders and variables.
  • [CHD-2598] [Mail/Merge/Usability] When opening the merge popup from a ticket profile, an autocomplete field is now provided to quickly look up records by partial mask or subject. Previously, the ticket chooser always had to be opened and searched.
  • [CHD-3618] [Debug] The debug report now shows the engine and record count for every database table. This is useful when sending debug reports to the development team for support.
  • [Debug] The debug report now displays usage information about the following PHP extensions: tidy, XCache, XDebug, memcache, memcached, and redis.
  • [Setup/Workers/Usability] Added an '@Mention Name' field to each worker. During the upgrade this will default to the worker's first and last name with no spaces. This will enable new functionality like quickly notifying workers from a comment.
  • [CHD-2630] [CHD-3183] [Comments/Notifications/Usability] When commenting on a record from a peek popup or its profile, workers can now be selected to receive notifications by using the '@mention' syntax in the text. This has the added benefit of also organically documenting which workers received notifications about the comment, and it also makes it easier for a notified worker to see which comments need their attention. The same feature is also supported on sticky notes. This replaces the "Also notify these workers" option, which required workers to be selected as an extra step.
  • [Contacts/Comments] When viewing a contact person record from a peek popup, a comment can now be added. Previously this required viewing the full profile page.
  • [Placeholders/Usability] When editing a text field that supports placeholder syntax, a help button is now displayed. When clicked, a help popup explains placeholders and scripting along with common examples. This is implemented when editing snippet records, editing group signatures, editing reply-to signatures, and editing Virtual Attendants outcomes and actions. Previously, workers had to separately open the documentation to research the available options.
  • [Placeholders/Usability] When writing in a text field that supports placeholder syntax, scripting commands ({%...%}) and filters (|) are now suggested and autocompleted. This is supported when editing group signatures, when editing reply-to signatures, when editing snippets, and when editing Virtual Attendant outcomes and actions.
  • [Snippets/Placeholders/Usability] The syntax tester on snippets will no longer complain about temporary variables being unknown placeholders.
  • [Knowledgebase/Usability] Fixed an issue where the knowledgebase profile page could become stuck always displaying a different tab than 'Article', with no way to reset it.
  • [Knowledgebase/Profile/Keyboard] The knowledgebase profile page now supports keyboard shortcuts for quickly changing the active tab.
  • [Knowledgebase/Usability] When writing knowledgebase articles, inline images may now be added more easily by clicking a new 'upload image' button in the editor toolbar. This presents a file chooser popup, which automatically links the new attachment to the article and inserts the appropriate markup to display the image (in Markdown or HTML). In the past, these images weren't easily handled by Cerb and writers usually resorted to storing images on external sites.
  • [Knowledgebase] When viewing a knowledgebase article, any attachments displayed as inline images are removed from the list of downloadable files. These images can still be saved by right-clicking on them.
  • [Support Center/Knowledgebase] In the Support Center, when a knowledgebase article contains attachments that are displayed as inline images, the image URLs will be automatically rewritten to use the portal's location. Normally such attachments would require logging in to Cerb to view. These images will also not be included in the list of downloadable files. This simplifies the display of inline images as attachments by making them viewable to both internal workers and external portal visitors without having to host images on a third-party site.
  • [Knowledgebase/Attachments] Fixed an issue where attachments that were removed from a knowledgebase article could remove links to that file from other records as well.
  • [File Bundles] Added a 'File Bundle' record type. A file bundle contains one or more pre-uploaded attachments that can be quickly added to a record. For instance, workers using the mobile interface could include common attachments from bundles without having to upload them every time. Additionally, file bundles will allow Virtual Attendants to include common attachments on outgoing messages.
  • [Tooltips/Usability] Peek popups now provide helpful tooltips when certain fields are focused or hovered over. This removes some instructional clutter in the interface and provides better guidance when a field's purpose isn't entirely clear from its name.
  • [Pages/Usability/Wizard] When using the "Help me create a page!" option on workspace pages, a "New page created:" link is now displayed above the worklist. Previously this just added another item to the list, which could go unnoticed if there were already several items.
  • [Pages/Usability/Wizard/Knowledgebase] The 'Help me create a page!' wizard can now create a new Knowledgebase browser page if that plugin is enabled.
  • [Pages/Usability/Wizard/Reports] The 'Help me create a page!' wizard can now create a new Reports page if that plugin is enabled.
  • [Knowledgebase/Workspaces] On workspaces, Knowledgebase tabs can now be configured to use a specific default category. Previously, the knowledgebase browser always started by showing every topic and requiring a worker to drill-down to a specific category. Now, several knowledgebase tabs could be added to the same workspace as shortcuts to specific topics or categories.
  • [Pages/Usability/Wizard] When a worker uses the 'Help me create a page' wizard, the newly created page will be automatically added to their menu.
  • [File Bundles/Storage] The file chooser popup now allows attachments to be added from pre-existing bundles, in addition to allowing the upload of new files. This is particularly useful on mobile devices that lack the ability or bandwidth to routinely upload files. Bundles can be quickly selected using an autocomplete field, or they can be searched and filtered using a chooser popup.
  • [Knowledgebase/Usability] When viewing a knowledgebase article profile, the title of the current browser tab will now display the article title.
  • [Mail/Reply/Commands/Mentions] When replying to a message, #commands and @mentions are now supported in the text editor. The effect of these commands on the message content is shown in the preview option, and a preview action has been added to plaintext mode. The worker's signature has been replaced with a '#signature' placeholder, which is offers more flexibility about how the signature is generated (e.g. in the near future, HTML templates could override the signature format).
  • [Mail/Compose/Commands/Mentions] When composing a message, #commands and @mentions are now supported in the text editor. The effect of these commands on the message content is shown in the preview option, and a preview action has been added to plaintext mode. The worker's signature has been replaced with a '#signature' placeholder, which wasn't auto-inserted previously because its contents could change depending on the selected group and bucket.
  • [Mail/HTML/Templates] Each HTML mail template can now override the group/worker signature format. This makes it much easier to have consistent branding. If the template's signature is blank, then the default signature will be used. Previously, mail templates could only add a signature at the bottom of the message body, which didn't work properly with top-posted replies, and which also required workers to explicitly disable their personal signatures (which was a disaster to coordinate). Worker signatures now use the '#signature' placeholder, which is replaced by the template in the appropriate location in the message.
  • [Mail/HTML/Images] HTML mail templates now support uploading inline images directly from the popup editor. These images are stored as attachments linked to the template. When an HTML template is sent, the attachments are automatically embedded without requiring external URL resources. To reduce clutter, embedded images are also not saved as attachments in the outgoing message record in Cerb (but they are sent to recipients as expected). This feature should make it much easier to work with images on HTML templates.
  • [Mail/HTML] Email signatures on HTML mail templates now support worker placeholders (e.g. full name, title, custom fields).
  • [Mail/Reply/Settings] Added a worker preference for controlling whether 'Insert signature above quoted message' includes a #cut command or not.
  • [Mobile] Updated jQuery Mobile library from 1.3.2 to 1.4.3. Removed the custom jQuery Flat theme and modified the default themes to look the same while being more future-proof.
  • [Mobile/Comments/Notifications] When writing a comment in the mobile UI, @mentions can now be used to notify individual workers. This replaces the more cumbersome "Also notify these workers:" option.
  • [Mobile/Settings] Added a 'Settings' page to the menu in the mobile interface. This provides a place for each worker to configure their mobile preferences.
  • [Mobile/Settings/Reply] In the mobile interface, a worker can now decide if their signature is automatically inserted above or below the quoted message, or not inserted at all. Previously, the signature was always inserted below the quoted text.
  • [Mobile/Reply] When sending a reply in the mobile interface, a series of #commands are now available while typing. #comment quickly adds an internal comment to the ticket being replied to (the recipients won't see it, and @mention autocompletes may be used to notify specific workers). #cut prevents the remainder of the message from being sent to the recipients (for instance, it's no longer necessary to tediously delete long quoted blocks with mobile device gestures). '#delete quote from here' removes quoted lines from the cursor's current position (useful for responding to fragments of quoted text). #signature inserts the worker's signature based on the current ticket's group/bucket. #watch adds the current ticket to the worker's watchlist. #unwatch removes the current ticket from the worker's watchlist.
  • [Mobile/Mail/Compose] When composing mail from the mobile interface, #commands and @mentions are now supported. The #attach command makes it possible to attach pre-uploaded files to outgoing messages. When @mentions are used in a #comment, the referenced workers are notified automatically.
  • [Mobile/Mail/Reply] When replying to mail from the mobile interface, #commands and @mentions are now supported. The #attach command makes it possible to attach pre-uploaded files to outgoing messages. When @mentions are used in a #comment, the referenced workers are notified automatically.

New in Cerb 6.7 (Apr 23, 2014)

  • [Broadcast] Fixed a bug that prevented the 'Test' button from working on Broadcast functionality.
  • [Mail/Compose] [CHD-2734] Fixed another issue with the Send Mail form where workers who used it for the first time (i.e. prior to having a default preference) were unable to send mail if by chance they did not need to change the value of the 'From:' drop-down. If the drop-down was changed then everything worked as expected.
  • [Workspaces/Dashboards] Dashboards can now be configured to display widgets in one, two, three, or four columns. Extra columns are added to the right without rearranging existing widgets. When removing columns from a dashboard, widgets are automatically and evenly redistributed, and can be dragged into a desired order from there. By using one or two columns, more space is available for detailed charts. Four column dashboards can display many compact widgets on a single page without scrolling, and make better use of larger displays.
  • [Workspaces/Dashboards/Performance] The content on dashboard widgets is now cached for 60 seconds, which can dramatically improve performance with many concurrent workers. Manually clicking the reload button on a widget will update it with the latest data. When a dashboard is first displayed, any cached content is displayed immediately when the tab first draws. Any widgets with an expired cache are then displayed with a "spinner" image and fetched in sequence through an Ajax pipeline. This process is much more responsive than the previous behavior of waiting until all the widgets have loaded before displaying anything (and leaving workers staring at a mostly blank screen wondering if something is broken). It's also more memory efficient.
  • [Workspaces/Dashboards/Usability] When a workspace dashboard tab is blank, a helper message is now displayed with instructions on how to modify the number of columns and add new widgets.
  • [Workspaces/Usability] When a new tab is added to a workspace it is now automatically selected. Previously the new tab was highlighted but it still had to be clicked, which was only helpful in a situation where a worker intended to add several tabs at once before modifying any of them. This made the most common use case slightly more difficult.
  • [CHD-3065] [Workspaces/Worklists/Usability] Worklists are now loaded in order on workspace tabs using an efficient Ajax queue. Previously this process attempted to only load worklists that were visible in the scrolled browser window, but this is no longer necessary with the workspace improvements in 6.x. The loading worklists have a more modern style and an animated "spinner" image.
  • [Workspaces/Dashboards/Widgets/Performance] The caching on dashboards can now be configured per-widget. By setting a higher cache TTL (time-to-live) on infrequently used or changed data, page generation performance is improved. The default cache lifetime is set to 60 seconds on every widget during the migration. Refreshing a widget manually automatically uses the latest data and updates the cache.
  • [CHD-3172] [Virtual Attendants/Mail] The 'initial message' and 'latest message' placeholders are now available in all message-based Virtual Attendant behaviors.
  • [Virtual Attendants/Simulator/Usability] The Virtual Attendant simulator now only makes conditions editable if they are used by the behavior being tested. For instance, an auto-reply behavior that uses the conditions 'message is new' and 'message is outgoing' will now only show those two values in the simulator, which drastically improves usability. Previously, the values of every possible condition were shown (potentially hundreds) even though most of them weren't useful for testing the current behavior.
  • [Platform/Dependencies/Twig] Updated the Twig template engine from 1.8.2 (2012-05-29) to 1.15.1 (2014-02-13).
  • [Search/Performance] Full-text search results will now be retrieved as matching IDs before any other filters are applied. In most cases, this is much faster and more efficient than trying to do everything at once. This improvement makes it possible to consistently cache the results of full-text searches, even when other filters on the same worklist change. Previously, each variation of filters would require a different cache, and this could quickly overwhelm the default query cache settings in MySQL. Additionally, full-text results are now sorted by relevancy (best fit for the given search terms) and the top 250 matches are returned. Previously, relevancy wasn't considered at all, and any number of results were returned (even hundreds of thousands), which was very inefficient. The scope can be narrowed by searching for more specific terms. This "pre-fetch" step for full-text searching also makes it very easy for Cerb to integrate with other search engines like Sphinx, Solr, Elasticsearch, etc.
  • [Search/Platform/Plugins] Cerb's built-in MySQL full-text search engine now supports attributes (textual or numeric). This makes it possible to segment the indexed content. For instance, the comment content index now has a 'context' attribute, which can restrict text matches to only comments of a specific type (ticket, task, opp, etc). This was a necessary change due to the other improvements in full-text searching, since it would have been possible for search text to match 250 comment records without any of them belonging to the appropriate type of record. Each search schema can define its own attributes, and these will be automatically added when a new fulltext_* table is created. Most specialized search engines (like Sphinx) already have the capability to track attributes, and this change will make it easier for Cerb to seamlessly integrate with them.
  • [Placeholders/Snippets/Virtual Attendants] Added a 'secs_pretty' filter to placeholders. This displays a number of elapsed seconds as a human readable label like '2 hours, 5 mins'.
  • [Search/Platform/Devblocks] New search engine platforms can be added to Devblocks as extensions. The default implementation remains MySQL Fulltext, but plugins can implement native support for Apache Solr, Sphinx, Elasticsearch, Cloudsearch, etc.
  • [Search/Quick/Usability] Search engines can now provide their own quick search examples on a per-field basis. These are shown when a worker selects a fulltext field from the quick search dropdown. For instance, MySQL Fulltext and Sphinx have different search syntaxes. If a search index is moved to Sphinx, workers will be given the appropriate search tips. The quick search examples can also include custom examples per-index, so any additional fields indexed in Sphinx can be provided as examples (e.g. "@subject search text"). Any kind of content can be indexed as a field like this in Sphinx, and Cerb doesn't need to know about it for the queries to work.
  • [Setup/Search] Search functionality can now be configured from Setup->Configure->Search. Indexes are shown for any records that have full-text searchable content, including those contributed by plugins (e.g. message content, kb articles, comment content). A search engine can be configured for each index individually. By default, all content is indexed in the built-in MySQL Fulltext search engine, and no special configurable is necessary. However, dedicated search engines like Sphinx offer more features and higher performance.
  • [Search/Sphinx] Implemented support for the Sphinx search engine, an open source search server built for speed, scalability, and simple integration. This option requires Sphinx to be installed and configured separately, but you can expect searches to perform several times faster than MySQL Fulltext. Additionally, after switching to Sphinx you can drop the related fulltext_* tables in Cerb's database to reduce memory and storage usage, and to speed up processes like backups. Arbitrary fields can also be indexed by Sphinx and exposed to search (@status @subject @mask @headers, etc). This engine can be selected per-record from Setup->Configure->Search. Refer to the docs for setup instructions.
  • [Platform] Cerb now requires the 'mysqli' PHP extension, since the 'mysql' extension is deprecated in PHP 5.5+ and will be removed shortly.
  • [CHD-2954] [CHD-2549] [Performance/Scheduler/Maint] Improved the performance of the nightly maintenance scheduler job. Previously, this was inefficiently looking for broken links between records by performing expensive table joins.
  • [Devblocks/Code Cleanup] Fixed an issue where negative byte values weren't formatted by DevblocksPlatform::strToPrettyBytes(). It's common to have a negative number of bytes when computing deltas between two numbers.
  • [VAs/Placeholders/XML] Fixed the 'xml_decode()' function in placeholder scripts so it doesn't attempt to convert an XML document to an array. It now remains a SimpleXMLElement instance from PHP, which can be iterated, queried with XPath, etc.
  • [VAs/Placeholders/XML] Fixed an issue with the 'xml_decode()' function in placeholder scripts where namespaced XML documents didn't always work with XPath queries.
  • [VAs/Placeholders/XML] Added an 'xml_xpath()' function to placeholder scripts for querying the XML object returned by 'xml_decode()'. This can also return attributes.
  • [CHD-2955] [Performance/Cache/Plugins] The full cache of extension properties was being cleared every time any property changed, which created some extra database traffic. This happened often during scheduler /cron jobs. Properties are now cached per-extension, so the invalidation of a cache has no impact on extensions that didn't change.
  • [Cache/Performance/Platform] New cache engines can now be added through plugins. Caches improve the performance of Cerb by avoiding expensive database queries for content that hasn't been modified. Previously, only caching in the filesystem and memcache were supported. As before, objects are cached to the local filesystem by default without requiring any special configuration. Unlike before, the minimal set of 'bootstrap' caches required by the Devblocks platform are now always cached in the filesystem even when other cachers are available (e.g. plugins, extensions, global settings, tables, and classloader). This makes it possible to gracefully fail to disk-based caching if a previously configured plugin is no longer available, without introducing continuity issues. This also makes it possible to configure caching in a much more usable way from the browser in Setup, and to store cache configuration information in the platform. The cache-related settings in the framework.config.php file are no longer used and may be safely removed. If you were using memcache, you'll need to enable it again.
  • [Performance/Cache/Platform] The platform-managed settings of each plugin are now cached individually. This allows a plugin to invalidate its cache without requiring the settings of all other plugins to be reloaded from the database. The settings for the 'devblocks.core' plugin are always cached in the local filesystem, so they're available as the platform is starting up. This is where settings are stored for cache engine extensions (which can't load their settings from themselves, before they are set up).
  • [Cache/Performance/Platform] Server-side caching is now configured in Setup->Configure->Cache. Previously this had to be configured from the framework.config.php file, and only the filesystem and Memcached was supported. The cache engines provided by plugins show up here. When configuring a cache engine, its settings are tested before they are saved, and any configuration errors will be reported in the UI.
  • [Cache/Platform] When content is cached by Cerb in the local filesystem in storage/tmp/, they are now named "cache--" rather than "devblocks_cache---". This is mainly aesthetic, but some cache engines do have a slightly higher memory cost for longer key names. Many filesystems have file name length limits around 255 characters. Additionally, the shorter prefix means that files can be distinguished from each other after fewer characters.
  • [Cache/Security] When objects are cached to the filesystem, permissions no longer include 'world-readable' (in Unix parlance, they are chmod 0640). This helps prevent other users on the server from reading their content (Cerb still really shouldn't be installed in a shared hosting environment).
  • [Platform/Plugins] It's very common for JSON objects to be saved as plugin settings. The 'DevblocksPlatform::setPluginSetting()' and 'DevblocksPlatform::getPluginSetting()' methods now support an additional argument for automatically encoding and decoding JSON-based settings. This saves some redundant code when those settings are loaded or used in multiple places.
  • [Cache/Performance/Memcached] Memcached-based caching has been implemented as a plugin. It is configurable from Settings->Configure->Cache. The host, port, and key prefix can be set. A key prefix provides a way to namespace keys so that multiple applications can use the same Memcached datastore. A single host:port pair should be set, and a distributed setup should have multiple services placed behind a consistent hashing proxy like Twemproxy. This is a way more reliable way to provide highly available services, as opposed to handling them in the client (i.e. Cerb).
  • [Cache/Performance/Redis] Redis-based caching has been implemented as a plugin. It is configurable from Settings->Configure->Cache. The host, port, auth, database number, and key prefix can be set. Auth is optional, and useful for publicly hosted Redis databases (like Redis-to-go); although ideally Redis should be configured on an internal IP and be placed behind a firewall. The database number should be left blank when using a proxy in front of Redis, as many don't support multiple databases (and always use number zero). A key prefix provides a way to namespace keys so that multiple applications can use the same Redis datastore. A single host:port pair should be set, and a distributed setup should have multiple services placed behind a consistent hashing proxy like Twemproxy. This is a way more reliable way to provide highly available services, as opposed to handling them in the client (i.e. Cerb).
  • [Performance/Worklists] When a worklist has only one page of results with fewer rows than the paging limit (e.g. 6 rows out of 10), then an extra database query will no longer be executed to compute the total rows. The total records is simply the number of results on the first page. The extra query generally wasn't expensive in most cases, but it could potentially have run thousands of times per day on a moderately busy system.
  • [Performance/Platform] Several of the original database tables (e.g. created in 4.x and early 5.x) had a redundant unique index for the 'id' column. This isn't necessary since those tables already have a unique primary key. This added a slight delay when modifying records, and it wasted a little disk space. These redundant indexes are cleaned up by the update.
  • [Performance/Activity Log] The insertion of activity log entries has been optimized. Previously each insertion ran two database queries: one to insert a blank row and retrieve the new ID, and the second to update it. The same insert/update pattern is used elsewhere, but it's not necessary here because activity log records are never modified. This process now happens in a single query.
  • [Performance/Watchers/VAs] The code that retrieves a list of watchers for a record has been optimized. Previously, this was inefficiently finding results with a JOIN between links and worker records, which always bypassed the worker cache. It could also run a second query to retrieve worker data in some situations. The links are now retrieved as IDs without a JOIN, and the worker cache is always used to return record data.
  • [Performance/Mail/Parser] Lookups are now cached when checking if an email address is owned by a worker. This functionality is used frequently in the email parser where every bit of extra performance helps.
  • [Performance/Mail/Parser] Mail routing rules are now cached when processing new email. This functionality is used frequently in the email parser where every bit of extra performance helps. The cache is automatically cleared every 20 minutes in order to rebalance the order that rules are checked in based on how often they match.
  • [Performance/Mail/Parser] Multiple message headers are now inserted into the database in a single query. Previously, headers were inserted individually. Early profiling shows a 33% reduction in total queries when inserting many tickets at once (which the scheduler does quite often when polling POP3 mailboxes).
  • [Performance/Mail/Anti-Spam] Optimized the method used to compute spam probabilities on incoming mail. Previously, ticket and message data was always retrieved from the database, and scores were always saved directly back to ticket records. Now arbitrary content can be analyzed and the spam score and interesting words are returned without extra database queries being performed. In the parser, the anti-spam fields can be set at the same time as everything else, which eliminates several redundant queries for every message being processed.
  • [Mail/Parser/Anti-Spam] Previously, the anti-spam algorithm split subjects like 'CamelCapsWordsWithoutSpaces' into multiple words before analyzing them. Our research shows that these spam subjects haven't been popular for many years, so this code has been removed. Additionally, this approach had the side-effect of not analyzing words at all when they alternated cases every letter 'LiKe tHiS'. This content is now converted to lower-case and compared like normal. The subject of an email message generally only represents a small portion of its overall content, and this change shouldn't have a negative impact on spam classification.
  • [Performance/Mail/Routing] The parser's mail routing behavior no longer directly modifies records in the database. Instead, changes are made to the in-memory 'model' that the parser manages before a ticket is created. Any custom field values that are set from routing are now handled by the same code that sets custom fields on mail filtering behaviors (combining both actions into a single operation).
  • [Performance/Mail/Parser] Previously, the mail parser created a ticket record in several steps (ID, meta, message links, spam score, group and bucket). For instance, this prevented Virtual Attendants from detecting ticket changes too early in the process before the associated records were also inserted (custom fields, messages, activity log, etc). While this worked, it had the downside of being quite inefficient, because event listeners and Virtual Attendants still reacted to every record change, but just ignored those events when the fields they cared about weren't present. After a few design changes in the parser, tickets are now created in a single step, after all their related records have been created. This is far more efficient, and early profiling shows a decent performance gain.
  • [Cache/Platform] The cache service can now be instructed to store certain keys in local memory for the duration of the current request. This is useful when the same underlying data is used over a short time period by multiple features without any communication between them (e.g. worklists, Virtual Attendant behaviors). This can also be used when the cached data changes to frequently to persist for a longer period of time, or when the active cache engine can't manage volatile objects.
  • [Cache/Filesystem/Platform] The filesystem cache engine now supports exclusive locking when writing to files. Previously, in busy environments it was possible (albeit rare) for two webserver processes to simultaneously write to the same cache file, which could lead to inconsistent file contents.
  • [Cache/Redis/Platform] The Redis cache engine now generates a unique key prefix every time the cache is globally cleared. This effectively namespaces keys so that old keys will become inactive and be automatically cleaned up (assuming Redis is running in 'maxmemory' mode). This is proxy- and multi-tenant friendly since the 'flush' commands are never used. Objects are now given a default time-to-live of 24 hours to help facilitate this. This approach enables a lot of dynamic content to be cached without concern over exhausting the available memory (e.g. searches, records, worklists). The unique prefix is stored in Redis, and the automatic namespacing is cluster friendly. If the prefix is lost for any reason (expired, or Redis restarts) then a new one will be generated automatically and content will be re-cached by Cerb as it is retrieved again.
  • [Cache/Platform] Cache engines now declare whether they support volatile content with an isVolatile() method. This allows Cerb to adapt to the type of caching being used. For instance, thousands of cache files won't be created in the local filesystem since this can create I/O bottlenecks (particularly when keys are frequently written, since reads are likely efficiently cached in memory by the OS already). However, hundreds of thousands of cache keys could be written to Redis, Memcached, APC, or XCache without an I/O bottleneck.
  • [Performance/Search/Cache] The results of full-text searches are now cached. With a volatile cache engine (Redis, Memcached) they are cached for 5 minutes, and otherwise they expire at the end of the current request. This solves the long-standing issue where full-text searches were being performed twice when subtotals were enabled. In 6.7+, full-text search filter run first, so their results can be cached consistently regardless of other factors. This means that if more than one worker searches for the same thing, the intermediate results are shared, even if the rest of their worklist filters differ. Additionally, when a worker changes pages, and adds or removes filters, the expensive search no longer needs to run again. This is a major performance improvement, since most logged 'slow queries' are the result of full-text searches being repeated (by subtotals, and by workers changing other filters). For the best performance, you should enable a memory-based cache engine from Setup->Configure->Cache.
  • [Cache/Memcached/Platform] The Memcached cache engine now generates a unique key prefix every time the cache is globally cleared. This effectively namespaces keys so that old keys will become inactive and be automatically cleaned up. This is proxy- and multi-tenant friendly since the 'flush' command is never used. Objects are now given a default time-to-live of 24 hours to help facilitate this. This approach enables a lot of dynamic content to be cached without concern over exhausting the available memory (e.g. searches, records, worklists). The unique prefix is stored in Memcached, and the automatic namespacing is cluster friendly. If the prefix is lost for any reason (expired, or Memcached restarts) then a new one will be generated automatically and content will be re-cached by Cerb as it is retrieved again.
  • [Performance/Virtual Attendants] Previously, the target record of a Virtual Attendant event (like "New mail received by group") was always pre-loaded before the behaviors ran. Even though the behaviors efficiently shared the same record while running, this was still inefficient when no behaviors existed on the event point, because the data was still loaded anyway. The target record is now only "lazy loaded" from the database when it is first requested (which means at least one active Virtual Attendant behavior is watching the event). This change sped up the email parser by 200-300% during development profiling, and it should improve the performance of everywhere VAs are used in Cerb.
  • [Performance/Virtual Attendants] Virtual Attendant 'contexts' (the available fields and labels of a related set of records) are now cached in-memory for the duration of a request. This is particularly efficient in the parser, where the same VA behaviors might run hundreds of times in one /cron request. These contexts generally don't take long to build, but there is no reason to repeat that process hundreds of times when the cost of temporarily storing them in memory is negligible. This mainly saves CPU cycles.
  • [CHD-3321] [UI/Usability] All tabs that load dynamic content from the server now show a loading "spinner" image while waiting for a response. This gives workers a visual cue that something is happening in the background. Previously, tabs that were loading were either blank or they showed their outdated content until the new content arrived. This improvement is especially helpful on high latency connections.
  • [CHD-3640] [UI/Search/Usability] When performing a quick search, clicking on one of the examples in the tooltip will now automatically place it into the text field. This time-saving shortcut is particularly useful for fields like 'status' where a small number of discrete options no longer need to be typed.
  • [CHD-2067] [Security/Logins] Added a unique "salt" to worker password hashes to make them much more difficult to crack if they are ever exposed.
  • [Security/Logins] Password hash information is no longer included in the worker table, model objects, or caches. There is no reason to reference a password hash outside of the login process; and that can involve the database directly, where the results can be discarded afterwards. The more places that password hashes are stored, the more vulnerable they are.
  • [Security/Logins] Fixed an issue where password hash comparisons were taking place in MySQL rather than in PHP. This could unnecessarily leave password traces in MySQL log files and the process list.
  • [Performance/Cache] Retrieving a worker record by email address now uses the existing worker cache. Previously this was needlessly querying the database.
  • [Security/Logins] All logins, successful or not, are now slightly delayed on purpose. This adds an artificial cost to brute force attacks. If successful logins weren't delayed, smart attackers could just abandon a login attempt if it was taking noticeably longer than a successful login would. In the near future, this delay should be increased systematically for each consecutive login failure.
  • [Security/Mail/Relay] Improved the way that incoming email relay messages are authorized. Previously, the 'Message-ID:' header included the internal ticket ID, and the security hash used the worker's password to sign it. This meant when a worker changed their password the could no longer reply to any pre-existing relay messages.
  • [Mail/Relay] Incoming email relay replies are now associated with the message they were based on. This allows features like response times to be calculated properly. Previously, a relay reply was always associated with the latest message on a ticket.
  • [Mail/HTML/Inline] Fixed an issue where attachments weren't included when sending multiple inline images on the same line (like emoticons in a sentence), or on consecutive lines without blanks between them. (Technical note: the regular expression was too 'greedy' and combined all the inline image tags into a single result with unusable content.)
  • [CHD-2426] [CHD-1993] [Worklists/Export] The export feature on worklists now provides the ability to include all fields and linked records. Previously, only a small subset of the fields were available. For instance, exports can now include custom fields from the ticket's sender's organization. Additionally, large text fields like 'message content' are now available as well. This uses the same underlying functionality as the Web-API, but with the usability of the API. This also fixes the issue where only IDs were available for some fields, which weren't human-readable. A worker may now choose to export IDs, labels, or both.
  • [CHD-2426] [Worklists/Export] When exporting data from a worklist, human-readable labels are now provided for the fields. In CSV format, these are the headings in the first row. For XML and JSON, the labels are provided as a separate object next to the results. Previously, only arcane property names were returned, like 'cf_123'.
  • [CHD-2426] [Worklists/Export] When exporting data from a worklist, any number of fields can be selected now as a simple checklist. Previously the limit was 15. These fields can also be reordered by dragging them into place.
  • [CHD-3337] [Snippets/Worklist/Export] Snippet records and their content are now exportable from worklists in CSV, XML, or JSON formats.
  • [Worklists/Export] When exporting worklist results in JSON or XML format, field types are included along with the labels. These are useful for interpreting the data; for instance, discerning between a timestamp, checkbox, or number.
  • [Performance/VAs/Contexts] The message '_label' placeholder is now lazy loaded when first used. This requires an extra lookup to use the ticket mask in the output, which is inefficient if the placeholder isn't used. This was particularly inefficient in areas like the mobile plugin, API, and Virtual Attendants where there could be a hundred placeholder dictionaries open at the same time.
  • [Performance/VAs/Snippets] Optimized the way placeholder dictionaries lazy-load content. Previously, cycles were being wasted crawling through linked contexts in the dictionary every time a placeholder was loaded. For instance, if requesting 'ticket_latest_message_sender_full_name' and 'ticket_latest_message_sender_address', data was being recomputed that could have been cached when the dictionary was created. This only cost a few milliseconds, but in some areas that code can run many times (worklist export, API, VA, mobile).
  • [Performance/Platform/Contexts] Optimized the way multiple placeholder dictionaries retrieve their values. The feature was originally designed to be used by Virtual Attendants for a single target, but it now powers the mobile UI, web API, Virtual Attendant list variables, and worklist exports. Previously, each dictionary loaded its values independently, which created a lot of redundant database queries (e.g. multiple tickets loading the same organization or sender information). Now the dictionaries are first analyzed to see what linked records they have in common, and only distinct records are loaded. Duplicates records are served from a high-speed temporary cache.
  • [Worklist/Export/JSON/Performance] Worklist exports in JSON format are now streamed so that peak memory usage remains low. Previously, all the records loaded into memory before they were displayed.
  • [Worklist/Export/XML/Performance] Worklist exports in XML format are now streamed so that peak memory usage remains low. Previously, all the records loaded into memory before they were displayed.
  • [Worklists/Export/Usability] When exporting a worklist to CSV, JSON, or XML, a picker menu is now displayed to quickly search for and select any number of desired fields. Previously, fields had to be selected from a fixed list of 15 dropdowns. The order of the exported fields can be rearranged by dragging them into place.
  • [Worklists/Export/Usability] When exporting a worklist, an option is now provided to automatically convert timestamps into a human readable format (e.g. "Sun, 06 Apr 2014 02:58:03 -0700"). Previously, timestamps were always in Unix epoch format (e.g. 1396778283), which complicated working with the exported data in programs like Excel.
  • [Worklist/Export] Worklist exports now generate output incrementally while displaying the current progress in the browser. This helps to avoid the time and memory constraints inherent in long-running processes. When an export is complete, a download link is shown. Previously, exports attempted to run in a single request, which would become unsuccessful after a list reached a certain size.
  • [Worklists/Export/Messages] Added 'export' functionality to message-based worklists.
  • [Worklists/Export/Notifications] Added 'export' functionality to notification-based worklists.
  • [Security/Cache/Filesystem] The filesystem cache now appends a unique suffix to the generated file names in the storage/tmp/ directory. This helps protect cache file contents in misconfigured environments where the storage/ directory contents are readable by web browsers, since the files no longer have predictable names like 'cache--ch_workers_all'. This is simply a last line of defense against an attacker scanning for sensitive info in the cache, and it doesn't provide any protection if the web server is very misconfigured to provide a directory index of all the cache files. Make sure you web server is blocking access to all these directories (api/, features/, libs/, storage/).
  • [API/Worklist/Export/Placeholders] Record IDs are now available as placeholders through the API and when exporting worklists.
  • [CHD-3421] [Sessions/Usability] The expiration on worker sessions is now automatically extended during activity. Previously, a cookie was set when the worker logged in, and if sessions had an expiration of '1 week', then the cookie would obnoxiously expire at that future time even if the worker happened to be logged in and actively using Cerb. Now the session expiration options are all based on the time elapsed since the last worker activity. If sessions are set to expire after a week of inactivity, then any activity by that worker will extend the expiration by another week.
  • [Security/Sessions/Setup] Added two new shorter duration session expiration options to Setup->Configure->Security: "after 6 hours of inactivity", and "after 12 hours of inactivity". These are useful now that session expirations only count a continuous period of inactivity.
  • [CHD-3324] [Setup/Workers/Usability] Administrators can now change worker passwords from Setup->Workers. In some situations, worker email addresses are also managed by Cerb, so having account recovery information sent there doesn't work. If the password field is left blank on a new worker, then a temporary password will be generated and emailed to them. Some login authenticators (e.g. OpenID, LDAP) will ignore the local password during the login process.
  • [Setup/Workers] When a worker account is deleted, their sessions will now be properly deleted as well.
  • [CHD-3386] [Calendars/Search/Usability] Quick search can be used to filter by calendar on calendar event and recurring event worklists.
  • [Calendars] Fixed an issue on calendars where a long-running event wouldn't display properly on multiple days if it started and ended in a different daylight savings time mode. For instance, an event that started the day before DST and ran for two weeks would only display on a single day in the calendar. This affected both manual events and events synced from worklists (e.g. tickets).
  • [Performance/Virtual Attendants/Mail] Optimized the way changes are detected on ticket records. Previously, every time a record was updated it was first retrieved from the database, and then its original and new values were computed for each field. This was inefficient because there are only a few important fields that trigger functionality (move, assign, change status). Internal fields used by Cerb also no longer trigger the expensive 'changed field' checks (e.g. elapsed time, merging, splits). When important field changes do happen, existing objects are efficiently reused rather than performing redundant lookups.
  • [Security/Platform/Plugins] The DevblocksPlatform::importGPC() and ::importVar() helpers can now specify types like array:integer, array:bit, and array:boolean. This will enforce arrays and typecast their contents. This is particularly useful to prevent SQL injection vectors when accepting IDs from an HTML form and sending them to the database. Previously, these variables needed to be sanitized in a second step.
  • [Virtual Attendants] Events can now display and store customizable parameters per Virtual Attendant behavior. This allows for powerful abstraction. For instance, a single abstract event like 'Record changed' can have a 'Record type' parameter, which allows each behavior to adapt to the conditions and actions of a specific record type. Previously, abstract events could only work with the fields and actions that every type of record had in common (i.e. not very much), and otherwise would require dozens of redundant events like 'Ticket changed', 'Task changed', etc.
  • [Virtual Attendants] Events can be configured to only trigger when specific parameters match on the listening behaviors. This is useful for new abstract behaviors like 'Record changed' where they may be 30 listeners (one for each type of record), but only one record type is implicated in the current event. Sending the event to only that listener is far more efficient. Previously, an event could restrict itself to one particular behavior (in the case of custom behavior macros), but there was no way to target a collection of behaviors as a related group.
  • [CHD-3679] [Virtual Attendants/Record Changed] Added a new 'Record changed' event for Virtual Attendant behaviors. This is the first of a series of new abstract events. Instead of having 30+ distinct events for each type of record that can change, all behaviors are created on this single event. The event triggers whenever any record is changed, and each listening behavior specifies which record type it wants to be notified about. When the 'Record changed' behavior specifies its type, all of the conditions and actions from a 'custom behavior' of that type then become available as well. The placeholders of the event provide '(New)' and '(Old)' values for every field, so a behavior can react not just to the fact that a field changed, but also to the fact it changed from a specific earlier value. For instance, a Virtual Attendant behavior could trigger only when tickets move from one specific bucket to another within the same group, or when a 'Priority' custom field changes from 'High' to 'Low'. The possibilities are endless. It's recommended to use the 'Custom script' condition when comparing old and new values.
  • [Mail/HTML/Inline] Fixed an issue where attachments weren't included when sending multiple inline images on the same line (like emoticons in a sentence), or on consecutive lines without blanks between them. (Technical note: the regular expression was too 'greedy' and combined all the inline image tags into a single result with unusable content.)
  • [Calendars] Fixed an issue on calendars where a long-running event wouldn't display properly on multiple days if it started and ended in a different daylight savings time mode. For instance, an event that started the day before DST and ran for two weeks would only display on a single day in the calendar. This affected both manual events and events synced from worklists (e.g. tickets).
  • [Mail/Compose/Usability] When composing mail, the text on the submit button now reads "Send message" instead of "Save changes". The latter confused some workers into believing a draft would be saved rather than sending the message.
  • [CHD-3723] [Virtual Attendants/Mail/Headers] Fixed an issue where 'message headers' conditions weren't configurable on "New mail on a watched conversation" behaviors.
  • [Virtual Attendants] Fixed an issue on custom Virtual Attendant behaviors where the target VA was always the one running, even if another target was given. For instance, if one VA was monitoring another on a 'Record changed' event, and commenting on the target when it was disabled, the comment was always on the observer and not the target.
  • [Virtual Attendants/Performance] Improved the performance of Virtual Attendants by not generating their internal data twice. The existing event wasn't being passed to the running behavior when responding to an event, or in the simulator. This meant that every behavior was generating their own copy of the event. In the simulator, this caused placeholder data to load twice.
  • [Support Center/Aesthetics] Made minor cosmetic improvements to the default Support Center stylesheet: removed unnecessary borders and lines; improved button styles; added more padding to content, lists, and sidebars; added more padding to headings; removed underlines from navigation tabs; added more hover effects; stylized worklists.
  • [Support Center/Knowledgebase/Search] Simplified the knowledgebase search options in the Support Center. Previously this displayed "all words", "any words", and "phrase". Cerb will now attempt to determine this automatically like it does on the worker side.
  • [CHD-3687] [Support Center/History] The Support Center can now be configured to display any combination of fields and custom fields as columns on the Ticket History worklist. For example, this makes it possible to share the value of fields (e.g. owner, priority, first response time) with clients. Previously, the columns on this worklist were limited to the bare minimum (subject, last wrote, updated).
  • [Support Center/History] In the Support Center, when the 'Subject' field is explicitly configured as a column then the worklist will display with records on a single row. Otherwise, the subject is displayed on its own line to make more room available for other columns.
  • [Support Center/Knowledgebase] The Support Center can now be configured to display any combination of fields and custom fields as columns on Knowledgebase worklists.
  • [Support Center/Knowledgebaae] In the Support Center, when the 'Title' field is explicitly configured as a knowledgebase column then the worklist will display with records on a single row. Otherwise, the title is displayed on its own line to make more room available for other columns.
  • [Support Center/Branding/Usability] A simple 'Logo URL' setting can now be configured for Support Center portals. Previously, logos could be changed by editing the header.tpl custom template, which was more flexible but also more complicated. That template may still be modified for more complex customizations like mimicking the look and feel of an existing site.
  • [Support Center/Branding/Performance] A 'Favicon URL' setting can now be configured for Support Center profiles to display an icon next to the URL (and in bookmarks). Previously, this had to be configured by modifying the index.tpl custom template, which could cause unnecessary conflicts during an upgrade. This also improves performance because browsers perform an extra HTTP request looking for a favicon when one isn't specified, and the Support Center was going through the work of rendering the home page again in response to these requests.
  • [Support Center/Performance] The Support Center now caches visitor session lookups globally for the duration of the request. Previously, features could load the session from the database multiple times.
  • [Virtual Attendants/Actions/HTTP Request] When using the 'Execute an HTTP request' action in Virtual Attendants, custom headers can now be provided (including placeholders). This makes it possible to integrate with many more web services.

New in Cerb 6.6 (Feb 1, 2014)

  • Core:
  • [Platform/Custom Fields] Implemented configurable parameters for custom fields. The various custom fields types can now provide additional options to modify how they work. Picklist and multi-checkbox fields had a hardcoded parameter for their option list which has been converted to the new format.
  • [CHD-3582] [Custom Fields/Owners] Added a 'Send worker notifications' option to worker-based custom fields. This makes it easy to add an 'owner' field to any kind of record. More advanced workflows are also possible; for example, having two owner fields for a 'salesperson' and 'sales support'. Owners receive watcher notifications about record activity for the duration of their assignment. They don't need to explicitly watch or unwatch records.
  • [Custom Fields/Links] Implemented a new 'Record Link' custom field type. This is similar to how the Links tab works, except the custom field is formalized and the fields of the linked record will be shown in Virtual Attendant behaviors, snippets, etc. For instance, a time tracking entry could have a custom fieldset with fields for an organization and a domain. Time tracking records could then be filtered based on those links, and the related record information could be used in Virtual Attendants, worklists, and the API.
  • [Setup/Storage/Attachments] Fixed an issue where an attachment worklist with multiple links pointing to the same file resulted in missing rows.
  • [Setup/Attachments/Worklists] Attachment worklists now display the storage profile column as a name rather than an ID.
  • [CHD-3377] [Setup/Attachments/Worklists] Attachment worklists once again provide links to the records containing the files (i.e. the 'Context' column). Previously, a link was provided to the ticket but workers had to dig for the message containing the file. Now, when clicking on the permalink for an email message attachment that specific message will be expanded and focused.
  • [CHD-2971] [Mail/Reply/Usability/Keyboard] When using the keyboard to navigate the ticket reply form, using the attachments upload popup previously broke the TAB flow through the form. Now the focus is returned to the attachments (+) button after files have been uploaded.
  • [Storage/Platform/Optimization/Performance] Cerb now automatically detects when a new storage object duplicates an existing one, and an additional link will be created to the same underlying file. A file is only removed when there are zero links pointing at it (e.g. message or comment attachments). Duplicate attachment detection is implemented for incoming mail, worker replies through the UI, the worker proxy, messages imported from an ImpEx export, and files uploaded through the API. This should save a considerable amount of storage space in environments where the same attachments (e.g. PDFs, forms, ebooks) are sent by workers on a regular basis. Similarly, when the same senders include logos and other content in their signature these can be condensed into a single storage object. Currently, existing storage objects are not hashed since would be very intensive on busy systems. New duplicates will be prevented from version 6.6 onward. However, we'll be providing instructions on how to retroactively hash existing storage objects and remove redundancy (technical note: this involves providing SHA1 hashes in the attachment.storage_sha1hash database column, and redirecting attachment_link records based on that).
  • [Mail/Parser/Performance] The original_message.html attachment is now created more efficiently for new incoming messages. Previously its contents were written to a temporary file that was then read into long-term storage. Now it is saved directly from memory into storage. This improvement also made it easier to modify the contents of the HTML message to improve usability (e.g. rewriting links for inline attachments to Cerb URLs).
  • [Mail/Parser/Usability] When viewing an original_message.html attachment in the browser, inline images will now be properly displayed in the content. For instance, this is useful when customers send screenshots by embedding them in the middle of their reply. Previously, such images were included as attachments on the ticket but they weren't displayed in the HTML contents (technical note: The IMG tags still referenced the MIME content-id header). These IMG links are now rewritten to use Cerb file paths. This process works for all new messages that are received in version 6.6 or later, but it will not fix existing original_message.html attachments.
  • [Devblocks/Platform/Markdown] Added the Parsedown library http://parsedown.org/ to Devblocks. This is a faster, leaner, and more modern replacement for the existing PHP Markdown Extra library we've been using up to this point.
  • [Setup/Storage/S3/Usability] When testing a new S3 storage engine profile, a temporary object will be saved, read, and deleted to verify that the credentials work for all actions. Previously the contents of the bucket were listed, but this didn't verify that content could actually be stored and retrieved.
  • [Setup/Storage/S3/Usability] The S3 storage engine now supports a 'Path prefix' configuration option. Previously all content was saved starting at the top-level of a bucket. Now a single bucket can be shared between multiple instances of Cerb.
  • [Setup/Storage/S3/Security] When configuring the S3 storage engine, the secret key parameter is no longer displayed in the profile popup form. If left blank it will remain unchanged. This is far more secure than transmitting it.
  • [Storage/Performance] The storage service now has the ability to queue multiple delete operations to perform them in a single transaction. This is useful for storage engines where incremental deletes would be very expensive. For instance, S3 would generate an HTTP request per file being deleted, which could potentially be hundreds or thousands. Waiting for that many HTTP requests during cron.maint is undesirable. It is now possible for hundreds of objects to be deleted in a single request.
  • [Setup/Storage/S3/Usability] Implemented batch delete functionality in the S3 storage engine. Up to 500 objects can be deleted from S3 in a single HTTP request.
  • [CHD-2711] [Mail/Relay/Comments] When a worker is replying to a relayed message from an external email account, the #comment tag will now allow comments to span multiple lines. The comment will be terminated when it encounters a blank line or a line starting with another #tag. This was necessary because some email applications, like Gmail, force text/plain content to hard wrap on spaces before 76 characters, and quoted-printable encoding isn't used to preserve the original wrapping. The comment will still appear as a single paragraph in Cerb.
  • [CHD-2711] [Mail/Relay/Comments] A new #start comment tag is available to workers that respond to relayed messages through an external email account. This allows multiple line comments where linefeeds will be preserved. This is especially useful for chunks of formatted text like code fragments and patches. A multiple line comment is terminated with an #end tag on its own line. If a worker's mail application adds hard linefeeds to their comment content, those will be preserved in the comment created by Cerb.
  • [Mail/Parser/Localization] Cerb will now use the iconv PHP extension if it is loaded. This is capable of converting a wider range of encodings than mbstring. For instance, TIS-620 (Thai) and WIN-1258 (Vietnamese) were not properly converted to Unicode by Cerb when only using mbstring.
  • [Mail/Relay] Workers can now manually relay specific messages to external email accounts without having to set up a Virtual Attendant behavior first. The reply menu on each message contains a new 'Relay to worker email' option. Selecting the relay option displays a popup where worker email accounts can be filtered and selected. This feature is particularly useful for situations where workers may need to reply while offline, such as during transoceanic flights or cruises. A worker can relay messages from Cerb to their mobile email application, reply at their leisure, and their messages will be delivered when network access is restored. The feature is also useful when certain workers handle requests through email without logging into the Cerb interface (e.g. temps, interns, consultants). A human dispatcher can route messages to these workers on an as-needed basis.
  • [Mail/Relay/Activity Log] An Activity Log entry is now created when messages are relayed to an email account by a worker or Virtual Attendant. This notifies other workers that work may be taking place on the ticket from outside of Cerb, and it also serves to keep a better history of the actions of Virtual Attendants. Previously, there was no record on a ticket that it had been relayed unless a comment was explicitly created to say so.
  • [Mail/Activity Log/Preferences] Workers can now enable the display of Activity Log entries on the ticket timeline. This displays a mix of messages, comments, and activity log data in a single place without having to click into the 'Activity Log' tab. The option is located on the Settings page that is accessed from the menu displayed when a worker clicks on their name in the top right of the UI. Consecutive log entries will be combined in a single block, and those that take place with a similar timestamp are grouped together for readability. This option is also compatible with the 'Read all' option where the timeline is displayed expanded in 'oldest first' order rather than 'newest first'.
  • [Devblocks/Platform/jQuery] Updated jQuery dependency from 1.7.2 to 1.10.2
  • [Devblocks/Platform/jQuery] Updated jQuery UI dependency from 1.9.1 to 1.10.3
  • [Devblocks/Platform/Dependencies] Added the jQuery Caret plugin for getting and setting the cursor position in textareas.
  • [Devblocks/Platform/jqPlot] Updated jqplot dependency from 1.0.0b2 to 1.0.8
  • [Devblocks/Platform/qTip] Updated qTip dependency from 1.0.0rc3 to 2.2.0
  • [Tour/Usability] Updated and expanded the tour so it provides tips and callouts about the main functionality within Cerb. This should help onboard new workers faster.
  • [Tour/Usability] When clicking on a new 'Point of Interest' callout in tour mode, the previously viewed callout will now be closed automatically.
  • [CHD-786] [Mail/HTML] Workers can now send HTML formatted email replies from Cerb. This feature was a long time coming, as we wanted to implement it in a way that was consistent with Cerb's spirit of productivity and automation, which are heavily based on the efficient processing of large amounts of text. To facilitate this, the feature is divided into two parts: HTML templates and Markdown syntax. Multiple HTML templates (e.g. letterhead and stylesheets) can be created from the Setup->Mail->HTML page. Each group and bucket can be configured to use a specific template by default, which determines the style of their HTML replies. Templates can contain any valid HTML, although most mail apps will sanitize the messages (e.g. removing Javascript). Rather than introducing a visual HTML editor which obscures the underlying text, workers can reply with Markdown syntax to bold, italicize, link, embed images, quote, and to add headings, code blocks, and lists. Markdown is a markup language that was designed for use in email to preserve human readability. This "progressive enhancement" approach provides workers with greater flexibility in their replies without compromising efficiency. Outgoing messages in the Cerb history are still displayed as plaintext. Additionally, Virtual Attendant behaviors are capable of working with Markdown syntax much easier than with HTML directly.
  • [CHD-786] [Mail/Reply/HTML] When workers are replying to mail, an editor is now provided to assist with using Markdown formatting. By default the editor starts in plaintext mode, which behaves the same as Cerb always has (i.e. only sending text responses). In this case the toolbar only displays a single button that toggles rich text functionality. Once that button is clicked, the toolbar expands to provide: bold, italics, unordered and ordered lists, embedded images, external images, links, quotes, code blocks, and a preview option. The preview option displays the HTML version of the current reply in a popup window. It will also use the HTML template of the current group and bucket, if available. The preview window can be left open while responding, and it will update its contents every time the RETURN key is pressed.
  • [Storage/Files] Attachments can now be requested by their SHA-1 hash in a URL, in addition to the globally unique ID of any of their links. This makes it possible to refer to attachments that have been uploaded but not linked to anything yet. For instance, this is useful for implementing embedded images in mail and knowledgebase articles; those images would need to be previewed before the record (and link) is created.
  • [Platform/Usability] Popups will now open in the middle of the browser window by default. They previously opened in the top center, which made smaller popups less noticeable.
  • [Plugins/Platform] When a file is uploaded using the file chooser popup, it now provides the caller with a SHA-1 hash and internal URL, as well as the entire response object (name, size, mime type, etc). This should make the file chooser reusable in more situations; for instance, in providing embedded image functionality.
  • [Mail/Reply/HTML] Workers can now send inline images in their replies. A new 'Upload an Image' button is available in the toolbar when replying to mail with HTML formatting. This button displays the file chooser popup, which automatically generates the syntax for an embedded image once saved. The image is visible in the preview popup, and once the message is sent Cerb will automatically convert it to an embedded image for the recipient (i.e. replacing the link to Cerb with a self-contained MIME part).
  • [Mail/Search/Usability] When using Search->Ticket, the results will no longer be restricted to only a worker's own groups. The group filter is now added by default but it can be removed from the editable filters. Previously it was a required filter that couldn't be removed. This has been requested several times by organizations that want workers to see the "Access denied" listing for a ticket when searching by mask or participant, instead of having zero results shown (which leads people to believe they're doing the search wrong).
  • [Platform/Popups/Usability] Popups will now float over the same position in the browser even when the rest of the page scrolls. Previously, popups could be scrolled off the page and become lost.
  • [Mail/Peek/Usability] When viewing the peek popup for a ticket, its group and bucket are now shown as two linked dropdowns. Changing the group in the first dropdown will change the list of available buckets in the second one. Previously, the group and bucket were only visible by clicking the dropdown and looking for the (*) marker, which was cumbersome. Additionally, the previous dropdown also combined groups and buckets into a single long list which was difficult to use.
  • [Mail/Compose/Usability] When composing mail, the 'From:' option now displays the group and bucket in two linked dropdowns instead of one big list.
  • [Mail/Compose/HTML] Added HTML message support to the compose popup. The preview feature will display the template for the currently selected group and bucket.
  • [Storage/Files] The '/files' page now provides cache control headers for the content it serves. This allows a worker's browser to cache certain resources (like images) after their first retrieval so they aren't requested from the server again. This is useful now that content like embedded images in HTML messages are displayed through this page.
  • [Platform/Dependencies] Updated HTMLPurifier library from 4.5 to 4.6.
  • [Platform/Devblocks/Dependencies] Added the 'CSS to Inline Styles' library by Tijs Verkoyen. This provides an easy to way to convert CSS STYLE blocks to inline styles when sending HTML email, as many email readers filter out HEAD, BODY, and STYLE.
  • [Mail/Reply/HTML/Preferences] Added a worker preference for "Always switch to HTML mode" while replying to mail.
  • [Platform/Plugins/Popups] Plugins that use genericAjaxPopup() can now specify the 'target' option using a jQuery Position object; e.g. { my: 'top left', at: 'bottom right', of: 'selector' }.
  • [CHD-3622] [Explore/Usability] Improved the way the last accessed time is recorded for explorer sets. Previously the access timestamp only updated 20% of the time in order to reduce extraneous UPDATE database queries when someone quickly paged through the list. Now, instead, the access time is updated any time at least 30 seconds has elapsed since the last recorded access time. Additionally, the access time is now always recorded when the set is created. The prior inefficiency rarely caused problems, but it would manifest if an explorer set was created shortly before the maintenance scheduled job ran, or if the maintenance job was set to run very often instead of nightly. This could result in explorer sets being purged while they were still in use.
  • [Mail/HTML/Broadcast] Implemented HTML message support in ticket worklist broadcasts from bulk update.
  • [Mail/HTML/Broadcast] Implemented HTML message support in address worklist broadcasts from bulk update.
  • [Mail/HTML/Broadcast] Implemented HTML message support in opportunity worklist broadcasts from bulk update.
  • [Mail/Usability/HTML] When generating a plaintext part from an HTML-only message, Cerb now attempts to preserve whitespace in pre-formatted (PRE) and CODE blocks.
  • [Mail/Usability/HTML] When generating a plaintext part from an HTML-only message, Cerb now attempts to prefix nested BLOCKQUOTE content with '>'.
  • [Mail/HTML/Usability] When sending HTML mail, Cerb will generate a new plaintext part that cleans up Markdown formatting. This plaintext part is sent along with the HTML message (e.g. for mobile and automated mail readers), and it's also what's stored in the conversation history.
  • [REVERT] [Platform/Popups/Usability] Popups no longer open up in the center of the browser window by default. This was causing problems on popups that grow, since they could expand beyond the bottom of the window and constantly require being dragged into place. Popups now display at the top so they have the full browser height to grow before they show a scrollbar. When a popup is opened a position can be defined now, so popups that don't grow (like the file chooser) may still elect to show up in the center of the page.
  • [Setup/Mail/Reply-To/HTML] Reply-to addresses can now specify a default HTML template for outgoing mail. The template set on the default reply-to address is the global default. When a group doesn't have its own HTML template it will default to the one on its reply-to address.
  • [Mail/HTML/Usability] The upgrade script for 6.6 now automatically creates a default HTML template and associates it with the default reply-to address. This allows HTML replies to "just work" without any manual configuration.
  • [Virtual Attendants/Mail/HTML] The 'Send mail' action in Virtual Attendant behaviors now supports sending messages using Markdown and HTML templates.
  • [Virtual Attendants/Mail/HTML] The 'Send mail to recipients' action in Virtual Attendant behaviors now supports sending messages using Markdown and HTML templates.
  • [Mail/HTML/Reply] Workers can now optionally choose a specific HTML template when replying. If nothing is selected, the current group/bucket's default is used.
  • [Mail/HTML/Compose] Workers can now optionally choose a specific HTML template when composing a new message. If nothing is selected, the given group/bucket's default is used.
  • [Mail/HTML/Broadcast/Tickets] Workers can now optionally choose a specific HTML template when broadcasting from ticket worklists. If nothing is selected, the default for the group/bucket is used instead.
  • [Mail/HTML/Broadcast/Addresses] Workers can now optionally choose a specific HTML template when broadcasting from email address worklists. If nothing is selected, the default for the given group/bucket is used instead.
  • [Mail/HTML/Broadcast/CRM/Opps] Workers can now optionally choose a specific HTML template when broadcasting from opportunity worklists. If nothing is selected, the default for the group/bucket is used instead.
  • [Mail/Reply/Usability] When replying to a message, the "Would you like to move this conversation?" option now shows the groups and buckets in two linked dropdowns. Changing the group in the first list automatically displays the available buckets in the second list. Previously, the current group and bucket was displayed as a default "No, leave it in the [name] bucket of [group]" option, and moving the conversation required using a long combined list of all the buckets which was difficult to navigate. The new way is also more efficient when using keyboard shortcuts.
  • [Performance/Worklists/Tickets] When using the "Is in groups of [worker]" filter on ticket worklists, the database query is now optimized if the worker is a member of every group. Previously, this inefficiently checked the group_id on every result anyway.
  • [Support Center/Contact/Usability] The ability to upload multiple files in the Support Center now uses a browser's HTML5 support.
  • [Support Center/Contact/Usability] The file type is now set properly on attachments uploaded through the Support Center. Previously, all uploaded files were being saved as 'application/octet-stream', which forced attachments to download even if they could be displayed in the browser (e.g. images, text files).
  • [Web-API/Contexts] Implemented 'GET /rest/contexts/list.json' in the Web-API for retrieving a list of context IDs and names. The context IDs are used for making various kinds of requests (e.g. attachment links, comments, record links) and there wasn't a comprehensive list available anywhere. This API request will also include any contexts that were added through plugins, which the standard documentation wouldn't include.
  • [CHD-3562] [Web-API/Contexts/Links] Implemented 'POST /rest/contexts/link.json' in the Web-API for adding any number of links to a record. See: http://cerbweb.com/book/latest/developerguide/restapi/contexts.html
  • [CHD-3562] [Web-API/Contexts/Links] Implemented 'POST /rest/contexts/unlink.json' in the Web-API for removing any number of links from a record. See: http://cerbweb.com/book/latest/developerguide/restapi/contexts.html
  • [Setup/Groups] Fixed an issue when deleting a group where group-owned Virtual Attendants and custom fieldsets may not be cleaned up properly.

New in Cerb 6.5 (Sep 24, 2013)

  • Core:
  • [CHD-3425] [Virtual Attendants/Code Cleanup] Fixed a PHP error regarding "Undefined variable: func in abstract_view.php" when Virtual Attendant behaviors contained list variables with a specific combination of parameters.
  • [Contacts/Snippets] Fixed an issue where the names of Contact Person records always displayed '(contact person)' in snippets and Virtual Attendant placeholders.
  • [Virtual Attendants/Variables] Virtual Attendant behavior variables now support parameters based on each type of variable. This provides more control over how they operate, and it also makes new variable types possible (like a picklist of pre-defined options).
  • [Virtual Attendants/Variables] Text-based Virtual Attendant behavior variables can be configured for single-line or multiple-line input. Previously, all text variables were single-line input, which made it difficult to enter certain kinds of data (e.g. long comments).
  • [Virtual Attendants/Variables] Virtual Attendant behavior variables can be reordered by dragging them in the UI
  • [Virtual Attendants/Variables] Virtual Attendant behaviors may specify picklist (drop down) variables. Picklists require a worker to pick an option from a list of predefined options. Previously, only freeform text entry was available. This is particularly useful for macro behaviors.
  • [Snippets/Tester/Usability] The snippet tester now displays output with a fixed width font that preserves whitespace. Previously, tester output stripped whitespace. This made it impossible to check the style of indentation (e.g. at the beginning of paragraphs, or in fragments of code).
  • [Virtual Attendant/Usability] The Virtual Attendant action for entering custom scripts no longer auto wraps the contents of the text box. This makes it easier to read source code.
  • [Virtual Attendant/Simulator/Usability] Added an indent to the form elements in the Virtual Attendant Simulator to improve readability.
  • [Virtual Attendants/Simulator/Variables] The public variables of Virtual Attendant behaviors may now be changed from within the simulator. This makes it much easier to test macros.
  • [Comments/Snippets] Implemented two new placeholders for comment records. The record_watchers placeholder is a list of watchers on the record containing the comment. The record_watchers_emails placeholders contains a comma-delimited list of watcher email addresses. This was requested by several people who wanted a way to relay an email to all watchers about comments on records of any type using Virtual Attendants; however, it can also be used to display a list of watchers anywhere the comment is referenced.
  • [Plugins/Choosers] Choosers can be opened in 'single selection' mode, where the first selection closes the chooser and returns control to the caller. This provides all the benefits of choosers for situations where a single record must be selected.
  • [Virtual Attendants/Simulator/Usability] The output of the Virtual Attendant simulator no longer has a maximum height before introducing scrollbars. Having multiple scrollable sections made it more difficult to read the output or to scroll down the page.
  • [Virtual Attendants/Simulator] When using the Virtual Attendant simulator, it is now possible to choose the exact record that the current behavior is being tested against. Previously, the simulator would choose random records to help test behaviors, but this often required opening up the simulator many times in order to find a suitable record. For macros, it was possible to run the simulator from a record profile in order to test using that record, but this option wasn't available to events like 'New message on a group conversation'.
  • [Virtual Attendants/Simulator/Usability] In the Virtual Attendant simulator, data entry for parameters and values have been moved to tabs. When a behavior provides parameters (public variables for entry by a worker), the parameters section is shown by default and the long list of values is hidden on a second tab, which improves usability by reducing clutter.
  • [Virtual Attendants/Snippets] Implemented a new json_decode() function for snippets and placeholders to convert a JSON string to an associative array. This can be used to easily reference JSON results from API calls within Virtual Attendant behaviors (or snippets in special situations).
  • [Virtual Attendants/Snippets] Implemented a new json_pretty filter for snippets and placeholders to optimize the human readability of a JSON string. This is mainly useful for advanced Virtual Attendant actions that exchange JSON with remote apps and services.
  • [Virtual Attendants] Virtual Attendants are now first-class records (like groups and workers), with worklists, profiles, peek, ownership rights, etc. Previously, Virtual Attendant behaviors were owned directly by roles, groups, and workers; but this was creating clutter and confusion because some behaviors are related but there was no indication of this in the UI. Now, multiple Virtual Attendants can be created to contain any number of behaviors, and each VA can be owned by a worker, group, or role. All existing behaviors have been migrated to a new default Virtual Attendant record for each distinct owner. Virtual Attendants now show up in the global 'Search' menu, and clicking into a VA profile is where you will find the behavior trees and scheduled behavior. This also provides many new possibilities for future expansion; for example, Virtual Attendants can log errors to their profile in an easy-to-find tab. You can export and import behaviors between Virtual Attendants to place related behaviors together.
  • [Messages/Performance/Snippets] The placeholder for message content is now lazy-loaded only when it is needed. This reduces extraneous queries from hitting the database when Virtual Attendants or snippets use message fields but ignore content.
  • [Virtual Attendants/Macros/Profiles] The 'Virtual Attendants' button on profiles now organizes behaviors by Virtual Attendant. This makes it much easier to find the behavior you're looking for. Additionally, the macro menu no longer displays two lines for each entry; instead, behaviors are indented below their Virtual Attendant. This allows more options to be displayed in a smaller space, and it's less visually confusing.
  • [Virtual Attendants/Activity Log] Activity Log entries that are created in response to Virtual Attendant actions will now log each Virtual Attendant as the actor. Previously, these entries were created as if the behavior's owner (e.g. worker, group) had performed them, which could lead to some confusion of accountability. Since Virtual Attendants are now first-class objects, they can be held accountable individually for actions they take. The Activity Log will also specify the name of the responsible behavior next to the Virtual Attendant.
  • [Debug/Virtual Attendants] The /debug/export_attendants page will now export all behaviors grouped by Virtual Attendant.
  • [Virtual Attendants/Scheduled Behavior] The 'Scheduled Behavior' tabs have moved to Virtual Attendant profiles. Previously, scheduled behavior was shown on worker and group profiles, since those records directly owned behaviors. The records targeted by scheduled behavior still show a summary at the top of their profile.
  • [Mail/Reply/Virtual Attendants/Macros] The 'Virtual Attendants' button that is displayed when replying to a message will now display macros grouped by Virtual Attendant.
  • [Setup/Virtual Attendants] The 'Setup->Configure->Virtual Attendants' page now displays a worklist of Virtual Attendants with links to profiles. Previously, a funky interface was used that required an admin to pick an owner from a list to view their owned behaviors in a tab. The new process is consistent with the way the rest of Cerb works.
  • [Virtual Attendants/Snippets] Implemented a new jsonpath_set() function for snippets and placeholders to dynamically create deeply nested JSON objects from inside scripts. This is mainly useful for advanced Virtual Attendant actions that exchange JSON with remote apps and services.
  • [Setup/Mail/Filtering/VAs] The Setup->Mail->Filtering page now shows the mail filtering behavior from all global Virtual Attendants on a single page. Previously, it was only possible to have a single global Virtual Attendant and its use was implied on this page.
  • [Setup/Mail/Filtering/VAs] When an admin views the Setup->Mail->Filtering page for the first time, Cerb will offer to create the first global Virtual Attendant if one doesn't exist already. This improves the onboarding experience.
  • [Virtual Attendants] Virtual Attendants may now be disabled, which treats all of their behaviors as being disabled. These behaviors will not trigger during events, and will now show up as macros on profiles. This makes it very simple to simultaneously deactivate related behaviors, which was tedious in earlier versions. Additionally, a worker can disable a Virtual Attendant while building and testing its behaviors.
  • [Activity Log] Activity Logs for actor profiles (address, worker, group, virtual attendant) now display entries where the record was either an actor or a target of the activity. Previously, the log only showed actor activity for those records, and target activity for everything else. This meant that when viewing an address's activity from its profile, you wouldn't see log entries for when that address replied to conversations (as an actor), only when workers performed actions on that address (as a target). This change provides a more comprehensive view of the activities a record was involved with.
  • [Activity Log/Groups] Group profiles now display an Activity Log tab.
  • [Virtual Attendants/Custom Fieldsets] Virtual Attendants can own custom fieldsets, providing them with long-term storage for arbitrary data on any record. This enables some very interesting new automation workflows. For instance, a monitoring Virtual Attendant can remember the last time it notified each worker about something by using a custom fieldset with a date on worker records. Similarly, a sales Virtual Attendant can keep track of its progress through an automated sales process with a custom fieldset that it saves on opportunities.
  • [Virtual Attendants/Macros] Application-owned Virtual Attendants can now create custom behaviors for any record type. This allows global macros that are accessible by all workers, which greatly simplifies many workflows. Previously, these macros could only be created by VAs owned by groups, roles, or workers.
  • [Virtual Attendants/Macros] Implemented a 'Custom virtual attendant behavior' event. This is the ideal place to implement generic behaviors that don't rely on a specific record type. For example, a Twitter Bot could schedule a recurring behavior to look for new @mentions, and it wouldn't make sense to target this behavior to any particular record. Previously, we had recommended to bind these generic behaviors on worker records just because it made them easy to manage from a profile. Now we recommend that these behaviors be migrated to Virtual Attendant profiles.
  • [CHD-3113] [Support Center/Logins/Usability] When a Support Center page requires a login, a visitor will be redirected to their original destination after successfully logging in. Previously, the Support Center didn't even provide a login form to anonymous visitors if they requested a protected resource, it just displayed the default page. The new process should make it much easier to send contacts direct links to a specific ticket history, or protected knowledgebase articles.
  • [Support Center/Usability] By default, the logo image on the Support Center is now a shortcut link back to the default page.
  • [CHD-3441] [Support Center] When a customer views a ticket in the Support Center, there is now a reply button per message and no reply from is shown by default. Previously, a single reply form was always displayed at the top of the ticket which led to much confusion.
  • [CHD-3148] [Support Center] When a customer replies to a ticket in the Support Center, the original message will now be automatically quoted in the response.
  • [Platform/Popups/Usability] Popups are now limited to a height no more than 85% of the current browser height. Previously, popups could be so tall that they scrolled off the page. This made them difficult to work with; particularly when dragging them around.
  • [Virtual Attendants/Macros/Plugins/Platform] Any Virtual Attendant behaviors that respond an event trigger will now be returned along with a snapshot of their data at their conclusion. This allows the caller to retrieve detailed information from those responders, and in an arbitrary way.
  • [Virtual Attendants/Actions/Run Behavior] Virtual Attendant behaviors may now use a global '(Run behavior)' action. This is similar to 'Schedule behavior', except it runs the behavior immediately and allows the caller to retrieve values from the delegate behavior. For example, if one Virtual Attendant delegates another VA's behavior in order to create a task, then the caller can afterwards retrieve information about the created task from the delegate. This greatly improves the reusability of Virtual Attendants, as specialized VAs can handle routine actions, and helper VAs can delegate requests to them. This also makes it possible to build mediator VAs that listen on channels like SMS, IM, and Campfire; with requests being delegated to VAs that can do almost anything possible in Cerb: send reminders; create and complete tasks; check and change calendars; interact with Twitter, Facebook, JIRA; etc.
  • [Virtual Attendants/Scheduled Behavior] Fixed an issue with the 'Schedule behavior' and 'Unschedule behavior' actions in Virtual Attendants. Disabled behaviors were not included in the list of available options, so if the actions referred to a behavior while it was disabled, and that action was edited and saved, then it would no longer refer to the behavior afterwards. Disabled behaviors are now displayed in the action, but they're marked as being disabled in case this is unintentional.
  • [Virtual Attendants/Actions] When a Virtual Attendant action is missing, the behavior editor will now provide more helpful information, including an indication of what it was supposed to be. Previously, a blank action box was shown without providing any clue about what was missing.
  • [Support Center/History/Reply] Fixed warnings created by the Support Center when a customer replies to a ticket without any attachments.
  • [Virtual Attendants/Actions/Variables/Usability] In Virtual Attendants, the actions for setting variables are now displayed at the top of the available actions. As with other global actions, they are surrounded by parentheses. Previously these were sorted alphabetically with other 'Set' options, which made them more difficult to find.
  • [CHD-1050] [Worklists/Custom Fields] When displaying a multiple value custom field as a worklist column, all of the selected values will now be displayed. Previously, only a single value per custom field was displayed based on what matched the search filters.
  • [CHD-1086] [Custom Fields/Attachments] Implemented two new custom field types: file and multiple files. These types allow arbitrary attachments to be attached to records through custom fields. Internally, these fields use the attachments system and they store file IDs.
  • [Virtual Attendants/Scheduled Behavior] The 'Schedule behavior' and 'Unschedule behavior' actions in Virtual Attendants are now global. They are available in all events and plugin-provided events do not need to implement them. Additionally, the action names are wrapped in parentheses so they appear at the top of the list of available actions.
  • [Custom Fieldsets] Custom fieldsets may now be owned by the application. These fieldsets are readable by all workers but only configurable by admins.
  • [Virtual Attendants/Custom Script] The 'custom script' condition in Virtual Attendant outcomes now a placeholders menu and script tester.
  • [Calendars/Virtual Attendants] Calendar records can now also be owned by Virtual Attendants or the Application.
  • [CHD-3460] [Virtual Attendants/Calendars] All Virtual Attendant behaviors may now use 'calendar availability' as a condition in outcomes. For example, this can be used to send different auto-replies based on availability.
  • [CHD-2866] [Virtual Attendants] The 'new message on a watched conversation' event will now always include a ticket's owner even if they aren't a watcher.
  • [Setup/Localization] A Setup->Configure->Localization page has been added for selecting the default date/time format for everywhere dates are displayed. Admins can choose between 12hr or 24hr formats, and this selection will cover all workers that don't have an established preference.
  • [CHD-3064] [CHD-2973] [Preferences/Localization] Each worker can choose their desired time format (12-hour or 24-hour) from the 'Settings' page in their worker menu.
  • [Virtual Attendant/Events] Added a new application-level 'Before sending worker message' event. Previously this was only possible at the group level.
  • [Virtual Attendant/Events] Added a new application-level 'After sending worker message' event. Previously this was only possible at the group level.
  • [CHD-3340] [Virtual Attendants/Mail] Virtual Attendant behaviors on the 'Before sending worker message' event may now add custom mail headers to the outgoing message. This was requested as a way to force read receipts, among other workflows.
  • [Virtual Attendants/Behaviors] Virtual Attendant macro behavior may now be marked as public or private. A public behavior is visible to everyone with access to the VA (on profiles, etc). A private behavior is only visible to the VA itself. Private behaviors are useful for implementing helper macros within a VA that shouldn't be exposed to the outside world. These are generally used from 'Run behavior' or 'Schedule behavior' actions.
  • [Virtual Attendants/Permissions/Events] Admins can choose which events each Virtual Attendant is capable of creating behaviors for. The options are 'allow all', 'allow these:', and 'deny these:'. This provides a way to offer limited Virtual Attendant functionality to workers with all use cases requiring prior approval. After the upgrade, all existing Virtual Attendants will default to 'allow all' events.
  • [Virtual Attendants/Permissions/Actions] Admins can choose which plugin-provided actions a Virtual Attendant is capable of using in behaviors. The options are 'allow all', 'allow these:', and 'deny these:'. For example, the actions for JIRA and Twilio may be restricted to admin-controlled global VAs that worker VAs can delegate to. Actions that directly communicate with external apps and services can be restricted from use by most workers. After the upgrade, all existing Virtual Attendants will default to 'allow all' actions.
  • [Virtual Attendants/Simulator/Actions] The Virtual Attendant 'Set custom placeholder' action can specify a format for its output of either 'text' or 'JSON'. JSON output will be automatically be converted to an object when it is saved to a placeholder. This is particularly useful to simulate JSON responses from actions that perform API calls.
  • [Virtual Attendants/Simulator/Actions] The Virtual Attendant 'Set custom placeholder' action can be configured to only set the placeholder when in simulator mode. This assists with providing test data in the simulator without affecting the outcome of a behavior when it runs normally.
  • [Virtual Attendant/Simulator] Public worklist variables in Virtual Attendant behaviors can now be tested properly in the simulator.
  • [Virtual Attendants/Actions] The 'Schedule behavior' and 'Run behavior' actions in Virtual Attendants can now include placeholders in the parameters being passed to the other behavior.
  • [Virtual Attendants/API] Implemented '/rest/va/list.json' in the Web API for retrieving the list of Virtual Attendants that are visible to the current worker. This can include an 'expand' parameter with the option 'behaviors' to list all of the defined behaviors.
  • [Virtual Attendants/API] Implemented '/rest/va/123.json' in the Web API for retrieving the a particular Virtual Attendant. This can include an 'expand' parameter with the option 'behaviors' to list all of its defined behaviors.
  • [Virtual Attendants/API] Implemented '/rest/va/behavior/123/run.json' in the Web API for running a 'Custom API request' Virtual Attendant behavior. This provides a standardized way for external applications and services to communicate with Virtual Attendants in Cerb. For example, a Campfire Bot can listen for messages in a chat room and relay a specific pattern (e.g. "@Cerb do something") to a specific VA behavior through the Cerb API. The response is a dictionary of all the behavior's values after running, including public and private variables. If a behavior retrieves a list of tickets, then their details will be available in the response for use outside of Cerb.
  • [Virtual Attendants/API] Added a new 'Custom API request' event to Virtual Attendants. This can be utilized by app-owned and worker-owned VAs. These behaviors work similarly to macros, except they are only triggered through the API from external apps and services. This allows for interaction with Virtual Attendants through mobile text messages, email, instant messages, Campfire/Hipchat, mobile applications, browser plugins, etc. Custom API request behaviors always target the owning Virtual Attendant, and they provide an 'Add to API response message' action that appends text to the _response value of the API response. Using the _response value is optional, but it provides for generalized interaction with Virtual Attendants through the API. For example, an iOS app could display a list of all Virtual Attendants and their API-enabled behaviors. Running any behavior could prompt for its public parameters, and the response message could be displayed. It's also possible to use the 'custom placeholder' action for additional outputs.
  • [Virtual Attendants/API] When a Virtual Attendants dictionary is converted to an array (e.g. for use by the Web API), any nested dictionaries will also be converted to arrays. Previously, if a behavior contained extra dictionaries (e.g. a list of records from a worklist search), it would return the IDs of those records but not their values.
  • [Virtual Attendants/Simulator] When simulating the Virtual Attendant 'Run behavior' and 'Schedule behavior' actions, the simulator output will now show behavior variables being set.
  • [Virtual Attendants/Simulator] Implemented Virtual Attendant simulator output for the 'Send email to notified worker' action in 'New notification for me' behaviors.
  • [Setup/Mail/Parser] Raw email messages can be imported from Setup->Mail by pasting them into a textbox. This simplifies development, training, and evaluations. Previously, these messages had to be saved in the /storage/mail/new/ directory and then the parser scheduler job had to be manually run.
  • [CHD-957] [CHD-3037] [CHD-3173] [Setup/Mail/Parser] Incoming mail messages that failed to parse can now be viewed, retried, or deleted from the Setup->Mail->Failed Messages page. Previously, administrators had to proactively monitor these files on the disk in the /storage/mail/fail/ directory, occasionally move them to /storage/mail/new/, and run the parser scheduled job manually in order to inspect the output. Failed mail is now displayed in a familiar worklist format with a peek popup to view each message source.
  • [Web-API/Usability] Added a QR code image to the Web API Credentials peek popup. This allows mobile apps to quickly scan the QR code to copy the access and secret keys rather than requiring a user to laboriously type them.
  • [Contexts/Messages] The generic label for Message records now shows the sender email, ticket mask, and ticket subject. Previously this just showed an unhelpful '(message)' placeholder. The label is used in Virtual Attendants, the Web-API, and the mobile app.
  • [Contexts/Activity Log] Activity Log contexts now provide actor_* and target_* placeholders. These can be used in Virtual Attendant behaviors, snippets, and the Web-API.
  • [Contexts/Activity Log] Activity Log contexts now provide a human-readable 'event' placeholder to describe the activity being logged. This can be used in Virtual Attendant behaviors, snippets, and the Web-API.
  • [Contexts/Workers] Worker contexts now provide is_disabled and is_superuser placeholders. These can be used in Virtual Attendant behaviors, snippets, and the Web-API.
  • [Snippets/VAs/Workers] Added 'last activity date' to worker placeholders.
  • [Devblocks/Workspaces/Charts/Plugin Development] The Devblocks HTML5 charting library now mediates all mouse interaction with the charts. Listeners can bind to 'devblocks-chart-click' or 'devblocks-chart-mouseover' to receive updates about user input. The returned event includes information about the closest data point to the mouse cursor, including chart coordinates. This saves the caller a lot of work when designing interactive charting elements.
  • [Workspaces/Dashboards/Line Charts] Line chart dashboard widgets now display a horizontal line through the selected data point to make lateral comparisons easier.
  • [Workspaces/Dashboards/Scatterplots] Scatterplot dashboard widgets now display crosshairs that intersect at the selected data point. This makes comparisons easier in both dimensions by creating quadrants.
  • [Workspaces/Dashboards/Gauges] Gauge dashboard widgets now display their labels below the widget for uniformity.
  • [Virtual Attendants/Variables/Lists] When a Virtual Attendant behavior has a list variable, the resulting worklist view_id will now be saved in the dictionary in the format var_name_view_id. This allows reuse of the underlying worklist for all kinds of functionality. Notably, it's currently used to send worklists to the mobile app. It could also overcome the 100 object limit of list variables now.
  • [Calendars] Fixed an issue where long-running calendar events that started before and ended after the current month wouldn't be displayed as spanning the entire month.
  • [Platform/Contexts/Plugins] Added a getPropertyLabels($dictionary) method to Extension_DevblocksContext extensions. This provides more terse human-readable text for labels when dictionaries are used on worklists and profiles (particularly in the mobile interface where spaces is limited). For example, "Ticket initial message sender address" can be abbreviated to "First wrote".
  • [Mail/Display] Fixed an issue when displaying tickets where very long messages (i.e. over 1MB) could cause a PHP timeout before the page was displayed. This was caused by attempting to auto-hyperlink URLs found within the email message, and it was exacerbated if 'read all' mode was always enabled when reading tickets. Cerb will no longer attempt to auto-hyperlink URLs within messages that are greater than 512KB in length.
  • [Platform/Plugins/Search] Devblocks now provides an OPER_CUSTOM operator for DevblocksSearchCriteria objects. This allows the caller to provide their own WHERE clause. For example, in some situations a query needs to modify a value before doing a comparison on it (e.g. fieldvalue+5 > otherfield_value).
  • [Devblocks/Placeholders/Usability] The 'devblocks_prettytime' modifier in placeholders now outputs 'just now' instead of '0 secs'.
  • [Calendars/Datasources/Performance] On calendars, worklist datasources were previously inconsistent in that the 'end date' could use placeholders while the 'start date' required a specific date field. This option was provided so that events could be arbitrary lengths; however, it wasn't possible to efficiently determine the events that needed to be displayed for a given month because the placeholders would have to be evaluated for every record in the database. In order to fix this issue, the 'end date' for worklist datasources on calendars now requires an explicit date field. Event durations can be set by using the new 'offset' fields for the start and end dates. For example, an event can end using the same field as the start date, but with a "+2 hours" offset. These offsets are much more efficient to process algorithmically in the database than open-ended placeholders.
  • [CHD-3515] [Calendars/Datasources] Fixed an issue with displaying worklist records on calendars when the events didn't start and end within the same calendar month. For example, if an event started on August 31 2013 and ran for 3 days, it wasn't being displayed on the September calendar.
  • [Virtual Attendants/Actions/HTTP Requests] A new 'Execute an HTTP request' action in Virtual Attendants allows them to send and receive data with other apps and services. The results of an HTTP request are stored in a custom placeholder that can be used by subsequent outcomes and actions. JSON responses are automatically converted to an object. Image resources as a response (e.g. PNG, GIF, JPEG) are converted to base64 text. For example, when new mail is received a Virtual Attendant could send relevant details to an external URL (like a webhook). A behavior could also request information from any source as a URL; e.g. datacenter temperature, website traffic, monitoring metrics, etc.
  • Mobile plugin:
  • [CHD-1056] [CHD-1108] [CHD-2378] [Mobile/Plugins] A 'Mobile Interface' plugin has been added to the Plugin Library. We had originally held off on creating a mobile interface because most workers use desktop computers and Cerb's UI workflow design is heavily dependent on multiple layers of popups to enable multiple actions from the same page. With the introduction of custom workspace pages in 6.0 and distinct Virtual Attendants in 6.5, the components of a mobile interface clicked into place. Rather than seeking to replace all the functionality in Cerb's normal UI, the mobile UI provides a access to previously curated content. The primary focus is on providing access to notifications, workspaces, and special Virtual Attendant mobile behaviors. The mobile plugin is built using jQuery Mobile, so there is a large list of supported devices: iPhone, iPad, Android, Windows Phone, Blackberry, WebOS, etc. We feel that a slim web interface is an ideal mobile strategy for Cerb because the functionality is contained within a plugin that is always in sync with the version of the main project. With mobile apps in various app stores using Cerb's API, users would constantly run into issues with version incompatibilities. Once logged in, the mobile interface can be accessed from any mobile browser by visiting the '/w' page at your normal Cerb URL. This can be bookmarked or saved to your device's home screen.
  • [Mobile] Notifications can be viewed in the mobile interface. At the moment they open up a new browser tab to the full Cerb UI. In the near future we plan to implement mobile-friendly profiles for all record types. A count of unread notifications is displayed on a badge at the bottom of the app.
  • [CHD-891] [Mobile/Workspaces] Workspaces can be viewed in the mobile interface. All workspaces that the current worker has access to will be displayed. The worker is prompted in several steps to select a workspace, a tab, and finally a worklist or a widget. The pages for tabs, worklists, and widgets provide shortcuts to jump back to the previous selections (for instance, from a widget to a page or tab). A filter box above the list narrows down the choices (for example, only showing pages with a specific owner). At the moment, clicking on a worklist row opens up the record in the full Cerb UI in the default browser.
  • [Mobile/Virtual Attendants] Added a new 'Mobile behavior' event to Virtual Attendants. These behaviors can be run from mobile devices for any kind of workflow. For instance, mobile behaviors can create or search tickets, create tasks or notifications, search external systems for information, etc. Any public behavior variables will prompt the current worker for additional information. These behaviors can also be implemented on app-owned VAs so they are available to all workers by default. Mobile behaviors can respond with various types of messages that are displayed in a mobile device (e.g. text, html, maps, etc).
  • [Mobile/Virtual Attendants] Virtual Attendants with mobile behaviors can be viewed in the mobile interface. All VAs that the current worker has access to will be displayed. When a Virtual Attendant is selected, a list of its available mobile behaviors is displayed. Selecting a behavior will prompt for the input of any public behavior variables (for instance, a mobile behavior to create a task would prompt for the task's name and due date). The response from the Virtual Attendant is displayed in a message reminiscent of a chat bubble. This functionality is incredibly powerful; Virtual Attendant powered mobile behaviors can provide workers with shortcuts to accomplish almost any workflow. Those behaviors are built inside Cerb's normal web interface.
  • [Mobile/Plugin/iOS] The Cerb mobile interface now supports being added to the iOS home screen as a web app. This removes the location bar and footer from Mobile Safari so the experience feels more like a native app. Device-specific icons and start screens are provided (e.g. iPhone, iPad, retina).
  • [Mobile] Implemented a sidebar panel in the mobile interface. This provides access to more functionality than can fit in the footer shortcuts: favorites, compose, pages, search, etc.
  • [Mobile/Workspaces/Pages] The mobile interface now provides access to both workspaces and pages. The distinction is that a workspace is a page added by a worker to their navigation menu. Pages represent everything that a worker could choose to add to their menu as a workspace.
  • [Mobile/Workspaces] The Workspaces shortcut in the mobile footer now displays a worker's workspaces in the same order that they appear in the full site. Previously this was displaying a list of all pages in alphabetical order.
  • [Mobile/Profiles] The mobile interface now provides a profile page for every record type in Cerb. This makes it possible to gather more information without leaving the mobile site. Profiles also provide automatic links between related records. For example, from a ticket profile you can quickly view the sender's profile, their org's profile, the assigned group's profile, the ticket owner's profile, etc.
  • [Mobile/Search] The mobile interface now provides a 'Search' page in the menu panel. This displays a list of every record type in Cerb. When a record type is selected then a mobile worklist is displayed with the matching records. Clicking on a record displays its mobile profile. The profile also contains a link to open the record in the full site. This improvement makes the mobile interface very useful for workers who need to perform quick record lookups while away from their desk.
  • [Mobile/Workspaces] Mobile worklists now display their current filters above the list. Clicking a filter removes it.
  • [Mobile/Workspaces] New filters can be added to mobile worklists using quick search functionality. Clicking the filters button above the list opens a popup that displays all searchable fields.
  • [Mobile/Workspaces] Mobile worklists can use existing filter presets. After clicking on the filters button, all presets are displayed as buttons in a popup. Clicking one of these buttons will instantly replace the filters. This is particularly useful in a mobile environment, especially when performing ad-hoc searches rather than using prebuilt workspaces.
  • [Mobile/Workspaces] Mobile worklists can be sorted in ascending or descending order on any available column. The field currently being sorted by is displayed above the list, and the arrow next to the label indicates the sort direction (i.e. asc, desc).
  • [Mobile/Workspaces] Mobile worklists can be paged forward and backward. On subsequent pages, an option is provided to instantly jump back to the first page. In a slight deviation from the full UI, paging displays the current and total pages along with the total number of results. In the full UI, paging displays the current position in the results and the total number of results (i.e. no indication is given for the total number of pages).
  • [Mobile/Workspaces] Mobile worklists can now display any number of fields for each row. Since screen space is generally limited on mobile devices, these fields are not displayed as horizontal columns like in the full UI, but as smaller vertical rows beneath each result's heading. At the moment, the displayed fields are based on useful defaults for each record type. In the near future this feature will support the ability to decide which fields should be displayed per worklist or worklist type. This functionality is actually more advanced than the main UI, since it uses the placeholders from Virtual Attendants and snippets instead of being confined by the results from the database. In the main UI, only a limited amount of information from related records is available as columns (e.g. ticket -> organization). With the placeholder approach, even content at the end of a long chain of related records can be displayed (e.g. ticket -> first message -> sender -> org -> custom field).
  • [Mobile/Virtual Attendants] Mobile Virtual Attendant behaviors now return their response on a new page. Previously the response was displayed below the submit button. The state of the response page is now cached so that the back button works properly. This allows responses to include links to new records, with the back button returning to the response without re-running the behavior. By not caching the behavior page, the mobile app can now instantly see any changes made to the behavior in Cerb.
  • [Mobile/Workspaces] Mobile worklists can now be paged, sorted, filtered, and searched in place using Ajax. Previously, these actions were initiating a full page reload due to the way that popups work in jQuery Mobile. The reload was displaying a 'flash of unstyled content' on mobile devices.
  • [Mobile/Virtual Attendants] Mobile Virtual Attendants can now return different types of responses. Previously, all messages had to be text-based.
  • [Mobile/Virtual Attendants] Mobile Virtual Attendants can return HTML responses. Any provided Javascript is evaluated, which makes interactive responses possible. For example, a Virtual Attendant can return a real-time chart using an HTML5 canvas.
  • [Mobile/Virtual Attendants] Mobile Virtual Attendants can return interactive worklists as responses. Previously, behavior variables that contained a list of records had to be displayed as text with links back to each record. Now any list variable on the behavior can be sent to a worker's mobile device. This displays a mobile worklist that's sortable, pageable, and filterable. The results also display properties about each record, and clicking on a record will display its mobile profile. The back button can be used to return to the worklist. For example, a mobile VA can send a list of tasks or tickets to a worker, and the worker can use that worklist in place as if they had searched for those results themselves.
  • [Mobile/Virtual Attendants] Mobile Virtual Attendants can return multiple responses to a single request. For example, a text response can state "Here are the results I found for you" and a second response can display the results as an interactive worklist.
  • [Mobile/Performance] Implemented caching for the common navigation pages in the mobile interface: search, workspaces, workspace tabs, pages, and Virtual Attendants. The content in these pages rarely changes; they'll now be pulled from the server once per session. Closing and reopening the app, or switching to the app from another app, will clear the cache. This significantly reduces mobile bandwidth usage and improves perceived performance.
  • [Mobile/Profiles/Plugins] Implemented a 'mobile.profile.block' extension point for plugins to provide custom content on profiles in the mobile interface.
  • [Mobile/Profiles/Ticket] Ticket profiles in the mobile interface now display the most recent message on the ticket, and the conversation history can be paged forward and backward.
  • [Mobile/Profiles/Ticket] Tickets can be replied to from the mobile interface. The reply button will automatically quote the currently displayed message, and the status and reopen date can be set. In order to reduce extra work from a mobile device when pruning quotes, only the most recent message worth of comments is displayed. In other words, quotes like ">>> Something said three messages ago" are automatically removed. When possible, signatures in quoted text are also automatically removed.
  • [Mobile/Profiles/Ticket] Basic ticket properties can be edited from mobile profiles: status, reopen date, owner, and spam training.
  • [Mobile/Profiles/Task] Basic task properties can be edited from mobile profiles: title, status, and due date.
  • [Mobile/Profiles/Message] Message profiles in the mobile interface show the full email content.
  • [Mobile/Calendars] Calendars are now displayed in a compact format in the mobile interface. These mobile calendars are displayed on workspace tabs, in workspace widgets, and on calendar profiles. Days that have events are indicated with a white circle. Clicking a day will select it, denoted by a pale blue circle, and its events will be listed below the calendar. Clicking an event from the list will display its profile, and the back button will return to the list with the previously selected date still highlighted.
  • [Mobile/Calendars] In mobile calendars, the current day is now highlighted as a filled in circle compared to the outlined circles denoting days with events.
  • [Mobile/Calendars] Mobile calendars can be paged forward and backward to adjacent months. A 'today' button is also provided to quickly reset the calendar on the current month with the current day selected. The selected month and year will be remembered per calendar for the duration of the session.
  • [Mobile/Calendars] Mobile calendars now tag daily events as a block of 'available' or 'busy' time.
  • [Mobile/Profiles/Virtual Attendants] Virtual Attendant custom behaviors are now available on mobile profiles. These are the same behaviors that show up in the desktop interface, enabling powerful automation from mobile devices.
  • [Mobile/Bookmarks/Usability] The mobile interface now allows any page to be added to the menu as a bookmark. This provides one-click access to frequently used widgets, profiles, Virtual Attendant behaviors, etc. To add a bookmark, navigate to a page and then click the 'menu' button in the top right. In the bookmarks section there will be an 'add' button if the page isn't a bookmark yet, and a 'remove' button if it is. Bookmarks are stored locally on each device, so different devices can have different mobile bookmarks even when the same user is logged in. Bookmarks are currently organized alphabetically.
  • [Mobile/Mail/Compose] Added a 'Compose' page to the mobile interface. This can send mail from any group the current worker is a member of. The 'To' field offers autocompletion for multiple email address recipients. An 'Insert signature' button will use the proper signature for the selected group and bucket. After sending the message, the worker will be redirected to the new ticket's profile.
  • [Mobile/Profiles/Addresses] Basic email address properties can be edited from mobile profiles: first name, last name, is banned, is defunct, and organization.
  • [Mobile/Profiles/Addresses] Mobile email address profiles provide a 'Search ticket history' button that lists all tickets where the address is a requester.
  • [Mobile/Profiles/Addresses] Mobile email address profiles provide a 'Compose' button that switches to the compose page with the email address pre-filled. This provides a similar workflow to the full interface where an organization is selected in order to determine the appropriate contacts.
  • [Mobile/Profiles/Orgs] Basic organization properties can be edited from mobile profiles: name, street, city, province, postal, country, phone, and website.
  • [Mobile/Profiles/Orgs] Organization mobile profiles provide a 'Search contacts' button which lists all associated email addresses in a worklist.
  • [Mobile/Profiles/Orgs] Organization mobile profiles provide a 'Search ticket history' button which lists all associated tickets in a worklist.
  • [Mobile/Notifications] Clicking on a mobile notification will now display its profile instead of opening up a browser to the full site. This allows a notification to be researched without leaving the mobile interface.
  • [Mobile/Notifications] Mobile notification profiles provide a 'Mark as read' button that clears the notification and returns to the previous page. This allows notifications to be saved for later if they're not currently actionable.
  • [Mobile/Notifications] The unread notification count in the mobile interface now updates every time a new page is displayed. The count is still efficiently cached on the server.
  • [Mobile/Profiles/Comments] Mobile profiles now display all the comments on a record. The most recent comment is displayed first, and buttons allow navigation forward and backward.
  • [Mobile/Profiles/Comments] New comments can be created from mobile profiles, with the ability to notify specific workers.
  • JIRA plugin:
  • [JIRA/Plugins] Added a 'JIRA Integration' plugin to the Plugin Library. This automatically synchronizes JIRA project and issue information. It also extends Virtual Attendants with the ability to remote control JIRA data. JIRA Projects and Issues can be accessed from Cerb's global Search menu. JIRA data can also be linked to other records (e.g. addresses, orgs) to track customer interest in issues and provide Virtual Attendants with data for following up on that interest.
  • [JIRA/Virtual Attendants] Implemented an 'Execute an API request to JIRA' action in Virtual Attendants. Rather than being restricted to a few options, this can make any API calls to JIRA that the given credentials are authorized to do. For this reason, it is important to restrict this action to only trusted Virtual Attendants. Other VAs can still delegate actions to the behaviors on trusted VAs with access to JIRA. Check the online documentation for examples.
  • [JIRA/Issues/VAs] Implemented Virtual Attendant custom behaviors for JIRA Issue records. For example, a 'Resolve' behavior could close a JIRA issue from Cerb.

New in Cerb 6.4 (Jun 11, 2013)

  • [Dashboards/Widgets/Usability] Dashboard widgets now display a single icon in the top right with a dropdown menu. This provides a place to add more options. Previously, every option was an icon, which limited the amount of space available to display the widget title. The new menu will be used to provide options like duplicating widgets or exporting their data.
  • [Dashboards/Widgets/Gauges] Gauge widgets can now 'Export Data' to JSON or CSV.
  • [Dashboards/Widgets/Counters] Counter widgets can now 'Export Data' to JSON or CSV.
  • [Dashboards/Widgets/Charts] Chart widgets can now 'Export Data' to JSON or CSV.
  • [Dashboards/Widgets/Subtotals] Subtotal widgets can now 'Export Data' to JSON or CSV.
  • [Dashboards/Widgets/Scatterplots] Scatterplot widgets can now 'Export Data' to JSON or CSV.
  • [Dashboards/Widgets/Pie Chart] Pie chart widgets can now 'Export Data' to JSON or CSV.
  • [Web-API/Usability] When using the 'expand' option in the Web-API, the extra records no longer contain extraneous fields like 'global timestamp' and the currently active worker.
  • [Web-API/Authentication] Refactored the Web-API so that any code that checks for the 'active worker' may be used in API calls. The Web-API doesn't require sessions or cookies. Previously, the API implemented its own authentication, and the use of code that checked for a worker session would fail.
  • [Workspaces/Plugins/Contexts] Implemented a context for Workspace Pages.
  • [Workspaces/Plugins/Contexts] Implemented a context for Workspace Tabs.
  • [Workspaces/Plugins/Contexts] Implemented a context for Workspace Widgets.
  • [Platform/Devblocks/Plugins] Implemented DevblocksPlatform::intClamp($n, $min, $max) for conveniently constraining a numeric value within a given range.
  • [Platform/Devblocks/Plugins] Implemented DevblocksPlatform::strFormatJson($json) to format JSON in a human-friendly output. Nested properties are indented, and one key/value pair or array element is displayed per line.
  • [Workspaces/Code Cleanup] Fixed an issue where worklist and subtotal widgets created an extra workerviewmodel record in the database during rendering. There should be one entry per worklist-based series.
  • [Workspaces/Widgets/Code Cleanup] Improved the way that widgets store worklist datasource information. Previously, Cerb stored a C4_AbstractViewModel object for each worklist datasource, serialized in PHP format, and base64 encoded in the widget properties. This was bloated and not very human friendly. It included a lot of information that could be reconstructed from worklist contexts. Worklist information is now stored by widgets in an easily readable JSON format, without any extraneous data, encoding, or serialization. At the same time, uniquely identifying information (like worklist IDs) are no longer used in widget properties, which paves the way for many new and highly anticipated features, like the ability to copy or share any widget. The format of existing widgets will be automatically converted during the upgrade process.
  • [Workspaces/Widgets/Code Cleanup/Performance] Removed some unnecessary code that ran when configuring several workspace widgets: counters, gauges, subtotals, worklists. Several of these were derived from the original charting widget, and they emulated pulling a list of fields through Ajax every time the context (record type) of the worklist was changed in config. That information isn't used by any of these widgets, and its retrieval created a few needless calls to Cerb and the database.
  • [Workspaces/Widget/Export] All workspace widgets now support the ability to export their configuration to a plaintext format (JSON). This option may be accessed by clicking the configuration menu in the top right of the widget, and selecting 'Export Widget'. Using this feature, widgets may be saved and transferred electronically; providing the beginnings of a community exchange for useful widgets.
  • [Workspaces/Calendars] Migrated calendar workspace tabs to the new worklist datasource format.
  • [Virtual Attendants/Worklists] Migrated Virtual Attendant 'Set List Variable' actions to the new worklist datasource format. This is a prerequisite for creating VA import/export functionality.
  • [Workspaces/Dashboard/Widgets/Import] Dashboard widgets may now be imported from the 'Add Widget' popup (using the same JSON format that they export to). The popup now has tabs for 'Build' and 'Import'. This addresses several requests, including the ability to move and clone widgets, and to share widgets between workers or Cerb installations. This was the last missing piece blocking an official repository of widgets from being created.
  • [Workspaces/Dashboards/Widgets/Import] When importing dashboard widgets, the import file may now specify any number of fields that should prompt the current worker for additional information. The answers to these prompts can customize the widget before it is imported, rather than needing to instruct workers to make edits later. This also handles the situation where data like workers or groups are different between Cerb installs. For example, a counter widget that reports on the number of overdue tasks owned by a specific worker can now prompt for which worker to use when being imported.
  • [Platform/Devblocks/Plugins] Implemented DevblocksPlatform::jsonGetPointerFromPath() for making arbitrary changes at any depth to a JSON object by using an XPath-like path. This is used by the Virtual Attendant and Dashboard Widget import functionality to allow guided customizations prior to import. This helper method can be reused anywhere that similar functionality is required.
  • [CHD-2530] [CHD-2688] [Virtual Attendants/Export] All Virtual Attendant behaviors now support the ability to export their decision trees to a plaintext format (JSON). This option may be accessed by clicking on the behavior and selecting 'Export Behavior' from the menu. Using this functionality, VA behaviors can now be duplicated, shared, or saved. The project can also maintain an official repository of useful VA behaviors that can be easily installed.
  • [Virtual Attendants/Import] Virtual Attendant behaviors may now be imported from the 'Create Behavior' popup (using the same JSON format that they export to). The popup now has tabs for 'Build' and 'Import'. This addresses several requests, including the ability to move and copy behaviors, and to share behaviors between groups, workers, or Cerb installations. For example, once setting up a complex auto-responder behavior for a group, it can be quickly copied to several other groups without having to tediously repeat the whole process of adding decisions, outcomes, and actions. This also makes it possible for the project to maintain an official repository of useful behaviors that can be easily imported into any Cerb instance.
  • [Virtual Attendants/Import] When importing Virtual Attendant behavior, the import file may now specify any number of fields that should prompt the current worker for additional information. The answers to these prompts can customize the behavior before it is imported, rather than needing to instruct workers to make edits later. This also handles the situation where data like workers or groups are different between Cerb installs. For example, a custom behavior that assigns tickets to a particular worker can now prompt for which worker to use when the behavior is imported in a new environment.
  • [Debug/Virtual Attendants] The Virtual Attendant 'Export Behavior' option on the /debug page now uses the same JSON format as 'Export Behavior' does in the app. Previously, this used a special XML format which was only intended for human review but not importing. The new format allows imports by developers and QA to assist customers with troubleshooting. The advantage of using this option is that it exports all behaviors at once. It may also be used by administrators to review or make backups of all VA behaviors.
  • [Web-API/Workspaces] Implemented a 'GET /workspaces/pages/list.json' method to the RESTful Web-API. This retrieves a list of all workspace pages accessible by the current worker; owned by them, their groups, or roles. The 'expand' parameter includes additional information about each page's owner, tabs, widgets, or worklists. This is very useful for bringing workspace data into external interfaces (such as mobile apps).
  • [Web-API/Workspaces] Implemented a 'GET /workspaces/pages/123.json' method to the RESTful Web-API. This retrieves a specific page. The 'expand' parameter includes additional information about the page's owner, tabs, widgets, or worklists.
  • [Web-API/Workspaces] Implemented a 'GET /workspaces/tabs/123.json' method to the RESTful Web-API. This retrieves a specific worklist tab. The 'expand' parameter includes additional information about widgets, widget data, or worklists. The data for all widgets on the tab may be retrieved in a single request, which makes it very easy to empower remote scripts and apps with the ability to monitor and report on Cerb dashboards. For example, a dashboard tab could summarize information about a series of servers in a datacenter, and a remote script could check those metrics against thresholds, whether they're counters, gauges, charts, etc. This is useful, since Cerb dashboards are very informative but they don't get a worker's attention if they aren't proactively monitored.
  • [Web-API/Workspaces] Implemented a 'GET /workspaces/widgets/123.json' method to the RESTful Web-API. This retrieves information about a specific workspace widget, and always includes the widgets raw data. This has all the same advantages for remote monitoring and reporting as pulling a workspace tab.
  • [Web-API/Workspaces] Implemented a 'GET /workspaces/worklists/123.json' method to the RESTful Web-API. This retrieves information about a specific workspace worklist. The response provides search results with support for sorting and paging. By setting up the desired filters on the Cerb dashboard, a remote API consumer doesn't have to concern itself with filtering results. For example, a remote app could display the 'Available tickets' worklist from an existing workspace, which may use a dozen filters to highlight the appropriate tickets. This not only saves the API consumer a lot of work in listing that information, but it also means that remote apps don't need to update every time the filters on the underlying worklist change.
  • [CHD-2930] [CHD-3082] [Mail/POP3/Scheduler] A failing POP3/IMAP mailbox will no longer be auto-disabled after 5 consecutive failures. Instead, a delay of two minutes will be incurred for each consecutive failure up to a maximum delay of 30 minutes. This ensures that the mailbox will be retried within a reasonable amount of time. Previously, mailboxes could remain disabled over a weekend if no admins were available. Saving a mailbox in setup will reset the failure and delay counters.
  • [Setup/Mail/POP3/Usability] Failing POP3 mailboxes are now marked with an icon in "Setup->Mail->POP3 Accounts". A message is also displayed when editing a failing mailbox that reads "Error! This mailbox has failed to check mail for (n) consecutive attempts". This should help admins spot potential issues more easily.
  • [Setup/Mail/POP3/Aesthetics] Improved the process of deleting a mailbox from "Setup->Mail->POP3 Accounts". This is now more consistent with the rest of the app. Previously, you had to check a box at the bottom of the form to delete the mailbox. Nothing else in Cerb works like that.
  • [Plugin Library/Setup] The 'Download updates' button in the Plugin Library will now automatically download any updates for all installed plugins. Previously, it just updated the version information but an admin had to update each plugin by clicking a button in the list. If a '.git' development directory exists in a plugin then it won't be automatically updated (as this would interfere with development).
  • [Plugin Library/Upgrade/Platform] When upgrading from the /update page, Cerb will now attempt to download the latest version of all installed plugins from the Plugin Library. This should spare admins from having to manually update and re-enable all third-party plugins after an upgrade.
  • [Custom Fieldsets] Custom fieldsets allow groups of related custom fields to be added to records in order to classify them. Previously, adding a new custom field to a type of record (e.g. tasks, tickets) would always display that field on every record. This led to a lot of clutter when custom fields were only used by a single group, worker, or Virtual Attendant behavior; and when a custom field was only related to a subset of records of the same type. With fieldsets, you can optionally add multiple sets of custom fields to a specific record. For example, an asset record could have a 'Car' fieldset added to it, with fields that describe mileage, color, make, model, VIN, etc. Another asset record could have a 'Computer' fieldset, with fields for CPU speed, RAM, serial #, etc. Both of these records would be assets, but they would be classified separately. These fields would not be mixed between the two records. It is still possible to have global custom fields for all records of the same type, as before; it's just no longer the only option. Fieldsets can be owned by roles, groups, or workers. Existing group-based custom fields will be converted to group-owned fieldsets during the migration. Fieldsets are managed in the peek popup and can be added using the 'Add Fieldset' button which displays a menu of available fieldsets. A fieldset can also be deleted by clicking the red X button that is displayed when hovering over any of its fields.
  • [Groups/Custom Fields] The 'Custom Fields' tab on Group Setup now manages the custom fieldsets owned by the group, rather than individual global fields.
  • [Custom Fields/Usability/Contexts] Contexts (record types) can now provide a hint that they implement custom fields for their records. This allows Cerb to only show custom field options for records that support them. Previously, the 'Custom Fields' page in Setup displayed many record types that had no way to display or edit such fields.
  • [Profiles/Usability/Aesthetics] On the profile for every record type, the toolbar has been moved to the very top of the page. Since custom fieldsets are now displayed at the top of profiles, this helps the page flow better.
  • [Custom Fieldsets/Subtotals] Since custom fieldsets have increased the length of many custom field names, the title of the subtotals sidebar on worklists will now be wrapped when necessary.
  • [Custom Fieldsets/Bulk Update] Custom fieldsets and their fields may be set from the Bulk Update popup for any records that support them.
  • [Knowledgebase/Bulk Update/Custom Fields] Custom fields may now be set on knowledgebase articles using Bulk Update.
  • [Mail/Compose/Custom Fieldsets] Custom fieldsets may be set when composing mail. This solves a long-standing issue where desired custom fields couldn't easily be set when creating a ticket, and instead had to be set by subsequently editing the newly created record. Additionally, custom fields could only be set based on the group associated with the ticket. Now, all custom fieldsets are available when creating a ticket, irrespective of factors like the group. This also simplifies the compose popup by not displaying custom fields that aren't needed.
  • [Virtual Attendants/Custom Fieldsets] Virtual Attendants can now utilize custom fieldsets on conditions and actions.
  • [Mail/Reply/Custom Fields] When replying to a ticket, custom fields will no longer be displayed at the bottom of the form. The main problem with the previous approach is that it led to overwriting any custom field changes that took place on the same record while a long reply was being drafted. This is because the form set the value of all fields, rather than only setting a few specific fields. This functionality can be reintroduced later in a better way. For now, custom fields may be set from the peek popup using the edit button after replying to a ticket.
  • [Custom Fieldsets/Worklists/Subtotals] Subtotals and filters on worklists will now automatically adapt the available custom fields based on any active fieldset filters. For example, if there are 10 possible fieldsets for tickets, then you'll see a lot of custom fields for filtering or subtotaling a worklist. If the same worklist is filtered to a specific kind of fieldset, then only custom fields from that fieldset will be displayed when configuring the worklist. This helps progressively reduce clutter once the intentions of the worker are known to Cerb.
  • [Platform/Update] When using the /update page to update Cerb, the lockfile being written to the temp directory was prefixed with 'c4' (from Cerb4). This has been changed to 'cerb' instead.
  • [Choosers] The chooser popup is now given information about the record being displayed when it was opened, which allows it to customize itself appropriately. For example, a custom fieldset chooser should only show fieldsets for the given context (e.g. task, ticket). Other choosers can use this information to predict a worker's intentions and save them time.
  • [Workspaces/Dashboards] Fixed an issue on dashboards where worklist-based counters and gauges didn't load values from custom fields that weren't in the filters. For example, a counter intended to SUM the value of a custom field may have displayed '0' even though several values existed. The reason for this is very technical, but has to do with how worklists intelligently use the most efficient way to load values based on how they are needed. When filtering, a slower LEFT JOIN is needed. For just displaying a value, a quick subquery is used without any joins. Counters and gauges always need to join values for aggregate functions.
  • [Workspaces/Dashboards] Fixed an issue on worklist-based chart widgets where custom fields as axes may not display the proper values when they aren't used as filters on the underlying worklist. This had to do with how worklists interact with the database. The process is now more intuitive and custom fields can be selected without any other considerations.
  • [Workspaces/Dashboards] Fixed an issue where scatterplots didn't display any plots if the dataset only had a single sample.
  • [Platform] Removed the concept of ONDEMAND_MODE from the code, since this is handled better through a forked version of the project now.
  • [Workspaces/Dashboards/Worklists/Usability] Worklists that are used as widgets on dashboards now label each field they display. Previously, a worker had to constantly refer to the horizontal order of the headings to figure out the vertical values being displayed for each row. The new approach uses a little more space but improves usability dramatically.
  • [Platform/Plugin Development] The devblocks-dao.php script in /install/extras/sdk will now assist with creating the initial code and templates for contexts, profiles, and peeks. It also adds several useful virtual fields to the generated worklist: context links, watchers, and 'has fieldset'. Custom fields are enabled by default. The 'delete' option on peeks uses the two-step verification rather than the gaudy browser confirmation popup.
  • [Calendars] Calendars are now distinct records that may be owned by workers, groups, or roles. Previously, events were directly owned by a worker and were collectively referred to as a calendar, although no record existed, and each worker could only have a single calendar. Any number of calendars may now be created, and owners may be responsible for several. For example, a group can define its collective working hours (e.g. for SLAs) as a group-owned calendar. The upgrade will create a calendar for each worker and assign their existing events to it.
  • [Calendars/Events/Profiles] Fixed an issue where a calendar event profile page didn't refresh after the record was updated from the 'Edit' button.
  • [Calendars] Calendars now have datasource extensions which are responsible for retrieving events for a given date range. Previously, events always had to be manually created. Now they can come from worklists, or synchronize from other apps and services.
  • [Calendars/Platform/Plugins] Implemented DevblocksCalendarHelper::getCalendar($month, $year) which generates a calendar grid for use by multiple areas of functionality.
  • [Calendars/Worklists] Calendars that display worklist-based events now provide the ability to create and edit records of that type. For example, a calendar that displays tasks by due date can be used to schedule new tasks or reschedule existing ones. This time sequence workflow is much easier to accomplish visually rather than with a worklist.
  • [Devblocks/Platform/Code Cleanup] The timezone list returned by DevblocksPlatform::getDateService() is now provided by PHP's built-in timezoneidentifierslist() rather than from a hardcoded list.
  • [Calendars] A calendar may now have multiple datasources. For example, a task calendar can display open tasks as one datasource in green, and completed tasks as a second datasource in gray. These colored events would be displayed on the same calendar in order to communicate more information at the same time.
  • [Calendars] Calendars can toggle the ability of workers to create manual events in addition to those provided automatically by datasources. For example, on a calendar that displays task or invoice information, it is likely undesirable to allow manual events to be added to the calendar since all of the data is coming from worklists.
  • [Calendars] Calendars can toggle the ability to allow automated synchronization from other datasources. On a calendar of manual events, synchronization may be disabled to simplify the calendar's configuration. This will hide the external datasource options.
  • [Workspaces/Dashboards/Plugins] Dashboards now send a 'dashboard_heartbeat' event to all widgets every second. This can be used for timed behavior (clocks, etc) without having to implement timers for every widget. With timers for each widget, it is possible for two clocks on the same page to update at different intervals, which is visually distasteful and distracting.
  • [Dashboards/Countdown] A new countdown widget is available on dashboards. You can use these widgets as gentle reminders of upcoming events. For example, on a development dashboard you can display a countdown to the next milestone (an iteration or release). On a sales dashboard, you can display the time left in the current period (quarter, year).
  • [Dashboards/Clock] A new world clock widget is available on dashboards. The clocks support 12-hour or 24-hour display, and the closest timezone can be quickly selected from the list of major cities organized by continent and country. These widgets are particularly useful for coordinating with international team members or sales prospects.
  • [Calendars/Events] Calendar event worklists can display their parent calendar as a column, and filter or subtotal by calendar. This is particularly useful in calendar event choosers.
  • [Calendars/Workspaces] Existing calendar-based workspace tabs have been automatically converted to calendar records. These tabs now have access to all the functionality improvements related to calendars. An existing calendar may now be displayed on a workspace in a few clicks, and the same calendar may be displayed in multiple places and by multiple workers.
  • [Calendars/Workspaces] The events from calendars on workspace tabs are now clickable. Previously, clicking on one of these events did nothing, which made it difficult to do anything useful with the calendar other than looking at it. Each event will open its peek popup depending on its type (e.g. tasks, tickets, events).
  • [Calendars/Workspaces] Calendars displayed as workspace tabs may be edited directly from from the workspace by clicking on the gear icon. This removes the need to leave the workspace to modify the underlying calendar.
  • [Calendars/Worklists] Calendars that use worklist-based datasources can now set availability (free/busy) and end dates for the events they generate. This means that in some situations, a datasource (like assigned tasks) may increase or reduce availability.
  • [Calendars/Dashboards] Calendar widgets are now available on dashboards. These widgets offer a quick summary of a calendar without taking up much screen space. There’s a count of events occurring for each day, and the full list is displayed when hovering. You can also click each event to open its peek popup and modify it; and those changes will be immediately reflected on the calendar. This allows you to get more work done from your dashboard — rescheduling tasks, chasing overdue invoices, etc. You’ll also notice a small gear button at the top of the widget. If you have edit permission on the calendar, you can modify it directly from your dashboard as well.
  • [Calendars/Availability] Rather than displaying a fixed calendar as before, worker profiles now display an Availability Calendar which takes the events from an existing calendar and converts them into availability windows. This is what a Virtual Attendant sees when it’s scheduling a task or looking for an available worker. Each worker can elect one of their calendars to determine their availability, which then becomes visible on their profile. This approach is particularly helpful in situations where a worker’s schedule may change frequently between various shifts. A calendar for each shift can be created, and when the schedule changes it’s a single click to activate a new calendar. To temporarily remove their availability entirely (e.g. vacation, leave of absence, paternity, sabbatical, code marathon), a worker can simply break the link between their availability and an existing calendar. They don’t need to modify or delete any of the existing events, which makes it much easier to resume working later on.
  • [Calendars/Virtual Attendants] Virtual Attendants can set date-based behavior variables using calendars. This allows scheduling based on "work hours" to automatically skip nights, weekends, and holidays.
  • [Calendars/Custom Fields] Added custom fields to calendar event records.
  • [Calendars/Virtual Attendants] Virtual Attendants behaviors that use the 'Worker calendar' condition have been migrated to the new 'Worker availability' condition instead. This compares against each workers' preferred availability calendar.
  • [Calendars/Workers/Worklist] Converted the use of the 'worker calendar' worklist filter to the new 'worker availability' filter. Rather than checking a single calendar, this now checks workers' preferred availability calendar.
  • [Calendars/Events] When adding new records from a calendar event worklist, the current worker may choose to add the event to any of their writeable calendars.
  • [Calendars/Events] In a calendar event worklist, the calendar field now links directly to its profile.
  • [Calendars/Usability] Calendars that display worklist-based content now provide a way to create new records of those types. For example, a task-based calendar can be used to schedule new tasks, in addition to rearrange existing ones. This functionality is available in all the places where calendars are shown: calendar profiles, availability calendars, workspace tabs, and ashboard widgets.
  • [Virtual Attendants/Calendars] Virtual Attendants can now set any date-based fields, custom fields, or behavior variables using calendars.
  • [CHD-3356] [Virtual Attendants/Tasks] Fixed an issue where a date-based behavior variable couldn't be used to set the due date of the 'Create Task' action in Virtual Attendants. Text-based variables worked fine.
  • [Virtual Attendants/Simulator] The Virtual Attendant simulator will now properly set custom fields using placeholders on the 'Create Task' and 'Create Ticket' actions. These values were actually set properly in behaviors, they just didn't translate in the simulator.
  • [Calendars/Web-API] Implemented '/rest/calendars/123.json' in the Web API for retrieving calendar details. This can include a query parameter named 'expand' with the options 'weeks' (week and day data for drawing a calendar), 'events' (flat list of events during the calendar month), and 'weeks_events' (events grouped into days). Additionally, the arguments 'month' and 'year' may be provided to change the time period.
  • [Calendars/Web-API] Implemented '/rest/calendars/list.json' in the Web API for retrieving a list of all accessible calendars for the current worker.
  • [Calendars/Web-API] Implemented '/rest/calendars/search.json' in the Web API for searching calendars.
  • [Calendars/Events/Recurring] Recurring calendar events are now virtualized. Rather than generating thousands of event records, recurring events are generated on-the-fly for any given date range. This cleans up a lot of redundant clutter in the database, and it also means that you can advance a calendar 10 years ahead and still see your recurring events, where previously such events were limited to displaying through the end of the current year (plus one month). The scheduler job for calendar scheduling is no longer needed and has been removed. Existing recurring events have been converted to the new format.
  • [Calendars/Events/Recurring] The process of creating recurring events no longer relies on a rigid UI that forces a choice between daily, weekly, monthly, or yearly repetition. Recurring events may now be easily and quickly created using natural language, like "Weekdays", "Monday", "December 25", "15th", etc. Previously, it was not possible to set up recurring events like the US Holidays of Labor Day and Thanksgiving where they change every year. Now, recurring events can be created with patterns like "fourth Thursday in November" and "first Monday of every month".
  • [Calendars/Events/Recurring] Recurring calendar events may now specify a timezone to be used when scheduling by relative times (e.g. 02:00 to 20:00). Previously, the timezone of the current worker was always assumed, but this made it difficult to deal with times that were intentionally in another timezone. Now a recurring event can be scheduled in London time while working in Los Angeles time.
  • [Snippets/Worklists/Usability] Snippet worklists will no longer display the snippet preview for each row (no other record type did this, and it's available from peek). However, it will still be displayed on the snippet chooser where it remains useful.
  • [Workspaces/Worklists/Usability] Worklists now determine the width of their columns without regard for the length of column headers. This was becoming a problem when long field names (particularly from custom fieldsets) were forcing columns to be much wider than their contents, which stole width from other columns that needed it more. For example, a column heading of "Organization SLA Is Expired" likely only needs to display values that are Yes/No. Under the new behavior, this column would now be narrower than its heading, and the extra space would be given to other columns. This functionality is also useful if you want to display many columns, because columns without any values in them won't waste screen space by displaying their full heading.
  • [Virtual Attendants/UI/Worklists] Implemented a new Virtual Attendant event for '[UI] While displaying a worklist'. This allows behaviors that automate modifications to worklists in the browser using jQuery actions. These behaviors can target worklists by type (e.g. ticket, task) as well as unique identifier. This means modifications can be made to all worklists of a certain type anywhere in Cerb (widgets, workspaces, search, choosers), or such changes can be targeted to a specific instance of a worklist (e.g. just ticket choosers, or a single task worklist widget). These VA behaviors can be owned by Cerb, roles, or workers. A global behavior (e.g. role-owned) would be applied to displayed worklists for all workers. There are many use cases for this event: a date-based custom field can be colored red when overdue; a priority custom field can display colors for each level; relative dates (e.g. 2 hours) can be converted to absolute dates (e.g. June 3 2013 2pm); column headers can be relabeled; etc.
  • [Worklists/Virtual Attendants] When a Virtual Attendant modifies a worklist, a robot icon is now displayed next to the worklist's title. Clicking this icon will display a list of the behaviors that were executed against the list (e.g. color rows by priority; color overdue due dates red; display dates as date+time).
  • [Dates/Calendars/Usability] Implemented smart date input fields. Previously, you could only enter relative ("+2 hours") or absolute ("Jan 9 2020") dates into these fields. Now it's possible to schedule a relative date in 'working hours' using any calendar (for example, following an SLA schedule). This works whether you're scheduling a task due date, a ticket reopen, any custom field, or anything else. You can press ENTER in a date field to have any date text automatically converted into your current timezone. This allows workers to verify the final date before saving the record (where before, the relative date text was sent blindly to the server).
  • [Dates/Calendars/Usability] As an additional convenience on smart date input fields, you can also convert dates and times from other timezones into your current timezone. For example, if you're in Los Angeles and you need to schedule a due date for 2pm tomorrow in London time, you can type "tomorrow 2pm Europe/London" into the date field and press ENTER. As a shortcut, you can also type "tomorrow 2pm Lon" and autocomplete the rest.
  • [Tasks/Profile/Usability] The task profile page now makes it more obvious at a glance that a task is completed. In the properties, the status field will be colored green with a checkmark icon.
  • [Orgs/Worklist] Fixed an issue where deleting an organization could result in a blank worklist.
  • [CHD-3344] [Mail/Setup/Reply-To] When adding a new 'Reply-To' address, a 'delete' button will no longer be displayed. The option to delete should only be available when editing.
  • [CHD-3311] [Virtual Attendants/Schedule Behavior] Virtual Attendants may now schedule the date for another behavior based on placeholders.
  • [CHD-3353] [Virtual Attendants/Mail] Fixed the 'sender is worker' condition on 'New message on a group conversation' Virtual Attendant events when the ticket is created by a sender that is also a worker.
  • [CHD-3338] [Virtual Attendants/Mail] Fixed an issue in Virtual Attendants where the setting of the 'Set Organization' action on the 'New message on a group conversation' was blank after re-editing.
  • [CHD-3336] [Mail/Subtotals] Ticket worklists may now be subtotaled by the 'Last Action' field. The possible actions are New Ticket, Worker Replied, or Recipient Replied.
  • [CHD-3335] [Tickets/Bulk/Usability] Using 'Bulk Update' on a ticket worklist will set the value of the 'Updated' field to the current time. This was requested as a way to identify tickets after the fact that were changed in the same batch.
  • [CHD-3332] [Mail/Pile Sorter/Merge] When pile sorting a ticket worklist, the 'merge' action is now available for sub-piles. Previously if you pile sorted by sender, you could merge by domain but not by individual senders.
  • [Calendars/Watchers] When a worker adds a new event or recurring event to a calendar, a notification will be sent to any watchers of that calendar. This makes it really easy for a worker to notice when someone adds an event to their calendar for them.
  • [Mail/Reply/Keyboard] When replying to a ticket, the Ctrl+Shift+Enter keyboard shortcut will instantly send the message.
  • [Mail/Reply/Keyboard] When replying to a ticket, three new shortcuts will automatically set the status of the ticket. Ctrl+Shift+O (open), Ctrl+Shift+W (waiting), Ctrl+Shift+C (closed). This saves extra mouse clicks, or the use of TAB to navigate down the page.
  • [Mail/Reply/Dates/Keyboard] When replying to a message and entering a 'wait until' date, the Ctrl+Shift+Enter shortcut will convert the date and then send the message in a single keystroke.
  • [Workspaces/Export] Workspace pages and tabs support the ability to export their configuration to a plaintext format (JSON). This option may be accessed from the page menu (gear icon) in the top right.
  • [Workspaces/Import] Workspace pages and tabs may be imported (in the same JSON format they export to). This provides a simple way to clone or share useful workspace configurations, either within a Cerb environment or externally. Pages can be imported from the create page popup; tabs can be imported on a specific workspace page from its '+' tab.
  • [Workspaces/Usability] Workspace pages now display a configuration menu in the top right instead of a toolbar. This provides space for more options without adding visual clutter. The tab-related options (e.g. Edit Tab) are now hidden when the currently selected tab doesn't support those options (e.g. the built-in '+' tab).

New in Cerb 6.3 (Jun 11, 2013)

  • [CHD-3136] [Watchers/Worklists] Fixed an issue when the 'watcher' filter was added to both the required and user-editable filter sections of a worklist.
  • [Workspaces/Plugins] Workspace Tab extensions may now provide a configuration section that is displayed in the Edit Tab popup. This provides a consistent experience, opposed to each tab having its own method of being configured.
  • [Workspaces/Calendars] Any number of calendars can now be added to workspaces as tabs. These calendars are capable of displaying any worklist data that contains dates: tasks due, invoices billed, tickets created, worker replies, time tracking, worker logins, Twitter @mentions, etc. A calendar is configured using a worklist, and the results will be displayed in the appropriate day's cell. A label format using placeholders may be provided to customize the output; for example, an invoice calendar may show the amount due and the client, a task calendar may show the title and time, and a login calendar may show each worker's name. A color may be configured for each set of labels.
  • [CHD-2903] [Broadcast/Attachments] Broadcast messages may now include attachments.
  • [CHD-3274] [Workspaces/Worklists] Workspace Widget worklists may now use the 'export' feature.
  • [CHD-3268] [Activity Log/Tasks] The Activity Log will now record which worker or Virtual Attendant behavior created a new task.
  • [CHD-3267] [Tasks] Added a 'created' field to task records. This can be used for reporting on task creation over time.
  • [CHD-3266] [Contacts/Bulk Update] Contact Person worklists now have a Bulk Update option to set or unset watchers and custom fields.
  • [CHD-3263] [Worklists/Dates] Worklists with date fields can now be filtered by that field being blank. Previously, it was only possible to find unset custom date fields with a search like 'BETWEEN 0 AND 1' or 'BETWEEN big bang AND -10 years'. This was unintuitive compared to a simple 'is blank' operator.
  • [Worklists/Dates] Worklists with date fields can now be filtered using a 'NOT BETWEEN' operator. This allows a date range to be exclusive rather than inclusive.
  • [Quick Search/Dates] When using Quick Search on a date-based field, the options 'empty', 'blank', or 'null' will automatically filter for blank date fields.
  • [CHD-3260] [Virtual Attendants/Defunct] Virtual Attendant behaviors that involve email addresses (e.g. new message in a group conversation) may now create conditions that check the 'is defunct' status of those addresses.
  • [Snippets] Added a 'total uses' column to snippet records. This makes it much easier to report on the total number of uses for each snippet. For instance, on a dashboard with a worklist widget. Previously, snippet worklists only showed the hits per worker.
  • [CHD-1987] [Snippets/Reports] Snippet usage statistics are now recorded with timestamps. Previously, it was only possible to report how many times each worker used a particular snippet (i.e. all-time). Now it is possible to report on how often a snippet was used over a given date range. This uncovers trends where a snippet may become more or less popular over time; which is useful when performing maintenance on those records. The original cumulative stats are imported at the beginning of the time range so they are included in the grand totals, but not on any reports with a range like "Past 30 days". New stats will have to be collected for these reports and dashboard widgets to display useful information.
  • [CHD-1987] [CHD-3117] [Snippets/Reports] Added a 'Most/Least Popular Snippets over Date Range' report. This allows reporting on snippet usage, with filters by date or by any number of workers.
  • [Virtual Attendants/Comments] A new global event point for 'New comment on a record' is available for Virtual Attendant behaviors. This triggers every time a new comment is added to any record. Abstract placeholders are available for the record type (e.g. task), record label (e.g. task title, ticket subject), and record permalink URL. This makes it very easy to send comment notifications to any channel -- email, SMS, Campfire, HipChat, etc. Comment behaviors can be filtered by type, author, content, etc.
  • [Virtual Attendants/Comments] Added a new group-level event point for 'New comment on a conversation in group'. This triggers when a new comment is added to one of the group's tickets, which allows Virtual Attendant behavior to perform custom business logic. For instance, managers may elect to receive an email copy of all group comments without having to explicitly watch every conversation. Comments may also be posted to other channels like SMS, Campfire, or HipChat.
  • [CHD-3272] [Virtual Attendants/Performance/Reports] Virtual Attendant usage statistics are now recorded when behaviors run. Entries are sorted by a per-day timestamp, each with the number of uses and the cumulative runtime for that time period (which can be used to compute average runtimes). Previously, usage stats for Virtual Attendant behaviors were not collected at all. These stats provide much more insight into how Virtual Attendants are behaving.
  • [Reports/Virtual Attendants] Added a 'Virtual Attendant Usage over Date Range' report. This allows reporting on Virtual Attendant behavior filtered to a specific time period. Data is displayed for the number of uses for each behavior, along with its total runtime, average runtime, owner, and event. The report may also be sorted by any of those fields.
  • [CHD-3276] [Tasks/Usability] On the profile page of a task, the Comments tab is now the default. It is also shown before the Activity Log tab.
  • [CHD-3275] [Mail/Attachments/Usability] Workers may now upload multiple files at once when using an HTML5-compatible browser (e.g. Chrome). Previously, each file had to be attached individually using the file dialog. Multiple files may be selected by using CTRL/CMD, or SHIFT, when left-clicking.
  • [Attachments/Performance] Performed some optimizations on the way attachment link UUIDs (universally unique IDs) are stored and indexed in the database.
  • [Attachments/Scalability/Replication] Modified the way attachment links are inserted into the database so they are compatible with binary logging. Previously, these queries used MySQL's UUID() function in INSERT statements. This is technically fine, since the UUID value isn't used in any other tables; however, MySQL may still record error_log entries about using dynamic functions in inserts when binary logging is enabled. These inserts are now done in two steps, with a SELECT UUID() and then an explicit INSERT value for the 'guid' column.
  • [CHD-3280] [Virtual Attendant/Custom Fields] Virtual Attendant behaviors may now set cross-record custom fields. For example, a ticket behavior can also set custom fields on the sender and their organization. This enables many new VA workflows. You could now have a 'new message' behavior set a date custom field on the sender's record to keep track of their latest incoming message. This could be used for sales, marketing, or even to throttle auto-replies. For another example, VAs could automatically manage 'unsubscribe' functionality by setting a 'do not contact' custom field on sender addresses when they reply with 'remove me'. Previously, all this advanced behavior required scheduling macros on other records, which didn't run immediately, and also left a lot of one-use macro clutter in Virtual Attendants. This new solution is much simpler and more powerful.
  • [CHD-2570] [Security/Who's Online] Fixed an issue where the "Who's Online" list doesn't display if the Suhosin extension is installed and session data is being encrypted. Cerb no longer needs to decrypt sessions to list active workers.
  • [CHD-2835] [Security] Disabling a worker's account now immediately ends all of their active sessions.
  • [CHD-3289] [Security/Sessions/Setup] Admins may now view a list of all active worker sessions from Setup->Sessions. This includes IP addresses and user agents (e.g. browser, OS, version). Sessions may be force expired from the Bulk Update popup.
  • [CHD-3288] [Security/Sessions/Preferences] Workers may now view their own list of active sessions from Settings->Sessions. This displays IP addresses, browser, and operating system. Sessions can be force logged out by using the Bulk Update button.
  • [Web-API/Attachments] Files may now be uploaded through the Web-API and saved as attachments. These may then be linked to various records. Refer to the documentation for the '/attachments/upload' action.
  • [CHD-3066] [Web-API/Mail/Compose] New mail may now be composed by using the Web-API. This sends an email message to the recipients and creates a new ticket in Cerb. File attachments, status, and custom fields may also be included. Refer to the documentation for the '/tickets/compose' action.
  • [Virtual Attendants/Macros] Application-owned Virtual Attendant behaviors will now show up in macro menus.
  • [CHD-882] [CHD-3244] [Virtual Attendants/Mail/Reply] Implemented a new Virtual Attendant event point for '[UI] Before replying to a message'. This allows behaviors that automate modifications to the reply form in the browser using jQuery actions. For example, a group-owned behavior can set the default 'status' (e.g. open, waiting, closed) per group. If the default status is 'waiting' the reopen date can be automatically set with intelligence, such as "+4 business hours", which accounts for evenings and weekends. As another example, the 'custom fields' section can be hidden by default using a worker-level reply behavior, and made visible using another 'Show custom fields' behavior from the reply form in only the situations where it's needed. Behaviors for this event may be owned by the app (global), roles, groups, or workers.
  • [Mail/Reply/Usability] When replying to mail, the text box is no longer forced as the focused element. This allows VA automation to move the cursor somewhere else (e.g. to the first blank line).
  • [Virtual Attendants/Mail/Reply] Added a '[UI] While replying to a message' event point for Virtual Attendant behavior. This makes user interface automation possible with macros that a worker can activate as-needed. These actions can run custom jQuery code. For example, during a reply a worker may want to automatically insert a summarized history of the current recipient's support history (e.g. reference number, subject, date, status). This wouldn't be possible using snippets, but a VA behavior can build a worklist in a private behavior variable and then use the results as placeholders that output some text in the reply box. A single macro can also: watch the conversation, add attachments, change the status, move the convo, assign it, and click the 'send' button. 'While replying' macros may be owned by the app (global), roles, groups, or workers.
  • [Worklists/Export] The field names are now properly capitalized in the 'Export' action of worklists.
  • [CHD-3290] [Security/Logins] When logging out, a worker may now choose 'Sign off (all my sessions)' to expire all their active sessions at the same time.
  • [CHD-3284] [Mail/Worklists/Piles/Merge] The pile sorter on ticket worklists now allows 'merge' as an action.
  • [CHD-3265] [Contacts/People/Import] Contact Person records may now be imported in worklists using .CSV (comma-separated value) files. The supported fields are: email address, password, created date, first name, and last name.
  • [Platform/Comments] Comments may now be authored by any kind of record (e.g. app, role, group, worker, email address). Previously, comments had to be authored by an email address, which didn't make a distinction between workers, customers, or Virtual Attendants. It would now be possible for the same functionality to mix comments from different sources (e.g. internal and public interfaces). For example, a knowledgebase article could have customer comments that are shown publicly, with worker comments that are highlighted as authoritative.
  • [Virtual Attendant/Simulator] The Virtual Attendant behavior simulator will now show more property values in the popup. Previously, the simulator was only showing properties that had values, and it wasn't using the lazy loader to look up values on linked records.
  • [CHD-3258] [Virtual Attendants/Comments] When Virtual Attendants post a new comment, the author of that comment will now be set to the owner of the VA behavior. Previously, comments created through Virtual Attendants always showed the author as '(system)', which wasn't very helpful. Now the app, or any role, group, or worker will be shown instead.
  • [Web-API/Comments] Comments on any record may now be searched through the Web-API. Results may be filtered by target record or author details.
  • [CHD-3201] [Virtual Attendants/Mail] Virtual Attendants may now set custom mail headers when using the 'Send Email' or 'Send Email to Recipients' actions. This is useful if you want to provide a header like 'X-Precedence: bulk' to combat auto-responder loops, or if you want to send structured information in email to an automated script.
  • [CHD-2895] [Virtual Attendants/Mail/Recipients] Virtual Attendants may now add new recipients to conversations from ticket and message-based behaviors.
  • [CHD-2789] [Virtual Attendants/Mail/Orgs] Virtual Attendants may now set organizations as an action on ticket and message-based behaviors. The organization may be set for the ticket or any associated addresses (e.g. sender). For example, a VA can automatically set an organization for new senders based on their domain name.
  • [Virtual Attendant/Mail/Simulator] Implemented Virtual Attendant simulator output for the 'Set owner' action on ticket and message-based behaviors.
  • [CHD-3305] [Virtual Attendants/Setup] Fixed an issue with 'Setup->Virtual Attendants' where adding a new behavior on an owner tab (e.g. app, role, group, worker) didn't always refresh the affected part of the page. This had to do with page elements not having unique IDs, and multiple owner tabs having the same event point in use. In this case, the first tab showing the event point was improperly being reloaded, rather than the focused tab.
  • [Virtual Attendants/Usability] When adding actions to a Virtual Attendant behavior, the 'Add Action' button is now a filterable menu (like when adding outcomes) rather than dropdown. This makes it much more efficient to filter a long list of actions because the filtering text doesn't have to match the beginning of the option, like with a dropdown. For instance, filtering for 'Face' will quickly limit the actions to a list including 'Post to Facebook'.
  • [Mail/Security] The ticket 'peek' popup now verifies that the current worker has access to the ticket's group.
  • [CHD-3306] [Workspaces/Mail/Security] The Search->Messages worklist now enforces group memberships as a filter.
  • [Virtual Attendants/Mail/Filtering] The 'is defunct' field of the sender may now be used as a condition in VA-driven mail filtering behaviors.
  • [Virtual Attendants/Mail Filtering] Virtual Attendant Mail Filtering behaviors may now set the sender 'is defunct' and 'is banned' fields as actions. This makes it possible to ban/unban a sender during mail filtering, and to remove the defunct flag when a previously defunct sender writes a new incoming message.
  • [Virtual Attendants/Mail Filtering/Simulator] Fixed an issue with using the Virtual Attendant Simulator on Mail Filtering behaviors. Due to the way that the event works in conjunction with the parser, the underlying fields (i.e. those not set by the simulator's form) didn't have any values set. This made it difficult to simulate behaviors that looked at related records; for example, getting or setting values for the sender as an action during mail filtering. The issue was solely with the simulator; the actual events always worked properly.
  • [CHD-3307] [Mail/Parser/Defunct] The 'defunct' flag will now be automatically removed from a sender's record if they send a new incoming message.
  • [CHD-3304] [Mail/Profiles/Permalink] When displaying a mail conversation, each expanded message now contains a 'permalink' link below the headers. This makes it easy to send a link to another worker regarding a specific message. In addition to scrolling the browser down to the appropriate message, the message will also be briefly highlighted for a visual cue.
  • [Mail/Profiles/Comments] When displaying a mail conversation, each comment now contains a 'permalink' link in the top right. This allows workers to exchange URLs that will focus a specific comment in the timeline. Just like the permalinks for messages, the focused comment will show a highlight effect as a visual cue. The focused message will also be maximized automatically.
  • [Mail/Profiles/Usability] When viewing a mail conversation timeline, the 'minimize' and 'maximize' links will now only be shown for the message under the mouse cursor. This improves usability by reducing the number of links on the page at a given time.
  • [Mail/Usability] When clicking into a ticket from a message worklist, the conversation will now automatically focus and expand that message.
  • [CHD-3302] [Mail/Sticky Notes/Watchers] Creating a sticky note on a ticket message will now automatically notify any watchers on that ticket.
  • [Mail/Sticky Notes/Usability] When displaying a sticky note, a 'permalink' link is now available in the top right. This allows workers to share a URL that automatically focuses a particular note.
  • [CHD-3300] [Support Center/Knowledgebase/Usability] In the Support Center, the number of knowledgebase articles displayed per page in worklists is now a configurable option.
  • [CHD-3297] [Mail/Sticky Notes] Fixed a bug in ticket conversations where sticky notes were no longer displayed for a particular message after minimizing and maximizing it.
  • [CHD-3296] [Groups/Setup/Buckets] Bucket names may now be up to 64 characters in length. When editing a bucket, the form will now enforce this maximum length.
  • [CHD-3295] [UI/Worklists/Usability] The '(dismiss)' option for worklist helpers is now consistently located in their top right corner. Previously, an 'undo' helper showed dismiss on the left.

New in Cerb 6.2 (Jun 11, 2013)

  • [Dashboards/Pie Charts/Subtotals] Subtotal widgets on dashboards can now be configured to display their values as a pie chart instead of a frequency table. There are default wedge colors for up to 20 values, and they've been selected for clean visual separation as well as aesthetics. While following a rainbow pattern, the colors begin at green rather than red, ensuring the largest wedges are one of the green-blue-violet spectrum subdued colors instead of an alarming large red block on a dashboard. A list of subtotal values is displayed below the chart. The pie charts also have mouse interaction. Hovering over a wedge will render a slightly transparent bumper at the edge, and it will display a highlighter style on the appropriate subtotal; making it very easy to identify which value is associated with the selected pie wedge.
  • [Dashboards/Subtotals] Subtotal widgets can now limit their results to the top 3-20 subtotal categories. This is useful when you want to build a 'Top 10' list, even though there may be extra results.
  • [Community Portals/Proxy] Moved the visitor cookie handling into the Community Portals functionality. It was originally in the deployed index.php per portal, but this made it difficult to replace the PHP reverse proxy with other proxy software. It's now trivial to forego the index.php file and deploy Community Portals with more capable proxies like Apache mod_proxy or Nginx instead. The index.php deployment is no longer recommended, but it will remain available because it's the easiest option that is supported in nearly all environments (including shared hosting).
  • [Dashboards/Plugins] Plugins can contribute new datasources for dashboard widgets.
  • [Dashboards/Charts] Each series on a dashboard chart widget may now specify its own datasource. This makes it possible to plot data from multiple sources on a single chart. Previously charts were limited to just worklist data, but additional sources may be now implemented through plugins. Existing charts will be migrated automatically to the new format.
  • [Dashboards/Plugins] Implemented dashboard widget datasource extensions for worklist, url, and manual entry. These behave comparably to the earlier built-in options; however, they can now be reused in new types of widgets (even in third-party plugins). A datasource extension can specify in its manifest which widgets it knows how to provide data for.
  • [Dashboards/Counters] Counter widgets on dashboards can now pull in data using datasource plugins.
  • [Dashboards/Gauges] Gauge widgets on dashboards can now pull in data using datasource plugins.
  • [Dashboards/Usability] Some friendly instructions are now provided on gauge and counter widgets when they have no data source configured. This helps disambiguate true values of zero in those widgets from a non-configured widget.
  • [Dashboards/Counters/Usability] Improved the usability when setting up a new counter on a dashboards. You no longer have to click into multiple tabs to configure its style and data source.
  • [Dashboards/Counters/Usability] When setting up a counter, the data format for 'seconds' has been renamed to 'time elapsed' to make its purpose more intuitive.
  • [Dashboard/Gauges/Usability] When setting up a gauge on a dashboard you can now always override the data format (e.g. number, decimal, percentage, time elapsed), or prepend and append text to the label. Previously these options were only available when using the 'manual' data source. This improves the flexibility of other data sources (especially arbitrary ones like 'URL').
  • [Dashboards/Charts/Usability] Improved the usability of configuring charts on dashboards. You now no longer have to click into multiple tabs to set the type of chart and pick a data source.
  • [Dashboards/Bar Charts] Bar charts on dashboards are now capable of displaying a mix of positive and negative values. This is especially useful when plotting changes (i.e. deltas) in some metric over time.
  • [Dashboards/Bar Charts/Usability] Bar charts on dashboards now display a line through zero on the y-axis. For regular bar charts with all positive values this improves readability when some bars may represent a zero values (and appear to have gaps). For charts with positive and negative values the origin line draws a clear distinction between them.
  • [Dashboards/Charts] Line charts on dashboards can now be used to plot negative values. This is especially useful on time series charts where the y-axis value may be a positive or negative change (i.e. delta) in value.
  • [Dashboards/Platform/Usability] Improved the mouseover tooltips for dashboard charts. They used to be printed directly on the chart, which meant they didn't handle long values well, and they also partially obscured the upper bounds of the data. Now the tooltips are handled by jQuery and CSS, so they could float or be stylized however we want. Eventually these will be exposed as custom events in the charting library, but the new defaults are more useful than the previous behavior.
  • [Dashboards/Scatterplots/Usability] Scatterplots on dashboards are now their own widget. Previously they were a rendering option on charts, but their usage is different and it was confusing to many people that some line or bar charts couldn't display as a scatterplot without modification. It's now possible for datasource extensions to treat scatterplots specially; they're designed to visualize non-linear clusters of data. Existing scatterplots will be automatically migrated to the new format and shouldn't require any modification.
  • [Dashboards/Scatterplots] Scatterplots will now scale their axes based on the given data. Previously, all scatterplots had (0,0) in the bottom left and if data was significantly larger (or negative) then most of the chart was wasted whitespace. Now you can use dates and timestamps on an axis and the chart will be scaled to the time between the min/max date, rather than showing 'all time'.
  • [Dashboards/Scatterplots] Scatterplots can now display negative values. This is useful when plotting deltas where a trend may be decreasing.
  • [Dashboards/Pie Charts] A new pie chart widget has been added to dashboards. This can be used to visualize distributions for external datasources. The subtotals widget is still the easiest way to render a pie chart from a worklist.
  • [Dashboards/Pie Charts] The legend on pie charts can be set visible or hidden. When hidden, only the label and value of the currently focused wedge will be displayed. This is useful when there are many wedges and displaying the values all the time would clutter the dashboard.
  • [Dashboard/Pie Charts] The value for pie chart wedges can be given a specific type (e.g. seconds elapsed, bytes, number, percentage, decimal) as well as a prefix and/or suffix. This makes it easier to discern units and whether you're looking at frequencies, averages, or sums.
  • [Dashboards/Charts] Added a slight margin to the top and bottom of line charts so their min/max plots aren't cut in half. The y-zero line is also adjusted by -0.5 if it was on an odd numbered pixel, since this gives sharper straight lines w/o anti-aliasing.
  • [Dashboards/Counters/Gauges/Usability] Dashboard counters and gauges may now display their values in 'bytes', which will display human readable units of storage space (e.g. 50KB, 270MB, 4.7GB).
  • [Performance/Platform/Plugins] Prior to version 6.2, viewing the Plugins page in Setup would automatically scan the filesystem for new plugins or updates. This had a considerable performance impact because it reloaded every feature and plugin, including some expensive database operations (ACL, translations, etc). The process because generally unnecessary due to the introduction of the Plugin Library in version 5.7. Given those factors, this functionality has now been optimized in two ways: (1) Cerb will only scan for new plugins and changes in the storage/plugins/ directory when visiting the plugin page; (2) only plugins with a new version number in their plugin.xml will be re-synchronized. For most visits to the plugins page there should be a dramatic reduction in the amount of REPLACE queries run against the database. During development, the DEVELOPMENT_MODE flag circumvents this behavior to make it more convenient to edit code and view the results without constantly running the /update page.
  • [Platform/Plugins] Fixed a bug in the DevblocksPlatform::sortObjects() method that forced all numbers to be compared as integers, thus rendering it incapable of properly sorting decimals (e.g. 0.5 and 0.3 were both rounded to zero). Numbers are now properly compared as floating point values.
  • [Platform/Usability/Plugins] Added a 'TB' (terabytes) grouping to the 'bytes' format options and DevblocksPlatform::strPrettyBytes().
  • [Dashboards/Scatterplots] Multiple series on a dashboard scatterplot widget can now be plotted on independent or shared axes. Independent axes are useful when you want to look for relative trends between series on different scales. Shared axes compares each series on the same scale.
  • [Dashboards/Scatterplots/Usability] Scatterplots now make a clearer distinction between plots from different series by using as a different symbol (e.g. o, +, x, *) as well as color.
  • [Platform/Dependencies] Upgraded to jQuery UI 1.9 from 1.8.18
  • [CHD-3144] [Autocomplete/Usability] FIXED: Autocompletes overwrite input.
  • [Devblocks/Platform] Added DevblocksPlatform::strBase32Encode() and ::strBase32Decode() helper functions. This is an uncommon encoding, but it's used for integration with Google Authenticator and there aren't built-in functions to base32 encode/decode (RFC-4648) in PHP5.
  • [Login/Security/Usability] The login system has been renovated to support different authentication methods per worker. Previously, a worker had to know to switch between password, LDAP, OpenID, etc. Now, admins assign a specific method to a worker. The login form has two steps: in the first the worker provides their email address, and then they are routed to the appropriate login method for their account. This makes it much easier to standardize authentication on something like LDAP and hide normal Cerb password logins entirely.
  • [Login/Security/Usability] When a new worker is invited to Cerb, or a worker's authentication method changes, they will be given the opportunity to set up their account's credentials on the next login. Previously an admin had to establish the initial password for new workers, and it was sent in plaintext through email -- and was possibly communicated in other ways between the admin and worker (SMS, email, chat room, etc). This process was a weak link in security. Now the worker can verify their identity through a one-time code, and they can set up a secure password right from their browser. This process also works for the advanced authentication methods like OpenID or Password+GoogleAuth.
  • [Login/Security/Usability] When a login authentication method other than 'password' is in use, workers will not be shown the 'change password' option. Additionally, if the OpenID plugin is installed but not activated for a given worker, they will not be shown the OpenID options in their preferences. This should reduce confusion.
  • [Login/Security/Recover] Each worker may now configure up to three 'secret questions' that are used to verify their identity when recovering their account's login information. In the past, all a worker needed to do to reset their login information was receive a code to their email address. The secret questions add an extra layer of security, because even if the code is intercepted (e.g. man-in-the-middle attack, packet sniffer, key logger) the attacker would need to know secret information about the worker to assume their identity. The page for setting up these questions makes recommendations about secure questions, but they should be open-ended non-quantitative questions like "What is your favorite sentence in your favorite book?". Answers to such questions are incredibly difficult to research or guess compared to "How old were you when…" or "What is your father's middle name?". Secret questions shouldn't have answers that can be found with a Google search or through social media. The wording of the answer must be exact, with all punctuation; although answers are case insensitive. An optional hint may be provided for each question and answer pair.
  • [Login/Security/Recover/Plugins] A new centralized system for recovering an a worker account has been implemented. This saves plugin developers from having to implement redundant or inconsistent recovery methods. When a worker starts the account recovery process they are sent a one-time code through email and they are asked their secret questions (if configured). Once identified, their login method is instructed to reset their credentials and their next login will run through the set up process again.
  • [Login/Security] When an invalid worker email address is typed into the login form, the password form will always be shown to make it more difficult for an attacker to discover valid logins. If the login form specified "Invalid worker" then an attacker could guess valid email addresses by using known worker names. They may still be able to guess worker email addresses, but the system will not confirm if they are valid or not.
  • [Login/Security] Invalid email addresses or failed authentication (i.e. bad password) will now cause Cerb to pause for two seconds before reporting an error. This slows down brute force attempts (at least on a single connection). In a near future update this delay could become longer with each successive failure, and lock the account.
  • [Login/Plugins] The login process may now be asynchronous. For example, with the OpenID plugin there are multiple URL redirects before authentication is successful or fails. Previously, Cerb expected an immediate answer from $extension->authenticate(). Plugins that need to redirect the browser before proceeding may redirect to the new /login/authenticated endpoint to finalize the new session.
  • [Devblocks/Platform/QR] The jquery.qrcode plugin by Jerome Etienne is now available in the global jQuery environment. This is useful to quickly send information to mobile phones from the screen. See: http://jeromeetienne.github.com/jquery-qrcode/
  • [CHD-3099] [Login/Security/Google Authenticator] Implemented a new worker login plugin for two-factor authentication using 'Password + Google Authenticator'. This plugin requires workers to provide both their password and a time-based one-time password from the Google Auth mobile app (available for iOS, Android, and Blackberry). Cerb supports configuring Google Authenticator with a QR code that is displayed on the screen during a worker's first login. This significantly improves security by requiring both "something you know" (the password) and "something you have" (the physical mobile phone) in order to log in; and it's unlikely an attacker will have both. Each worker's mobile device is configured (via QR code) with a different random 16-character secret.
  • [Mail/Peek/Usability] The peek popup for tickets now displays the Messages and Properties content on the same screen. Previously you had to switch between tabs to either preview the conversation or make changes to its properties. This removes extra clicks from one of the most frequently used interface elements.
  • [Dashboards/Widgets/Custom HTML] Added a new 'Custom HTML' widget to dashboards. This provides a block of user-defined HTML/CSS/Javascript. There are countless uses for this: displaying external images, rendering charts from the Google Charts API, sharing announcements, posting todo lists, displaying widgets from Twitter/GitHub/Facebook, etc. Previously these things would need to be implemented as widget plugins.
  • [Login/Usability] The login form now provides a "remember me" option which saves the current worker's email address in a cookie for two weeks. When enabled, subsequent requests to /login will automatically be redirected to the appropriate login form for the worker with the email address pre-filled. This streamlines the two-step login process on trusted computers.
  • [Security/Sessions/Usability/Mobile] In Setup->Security admins may now determine when session cookies should expire in worker browsers. Previously these cookies were always removed when the browser was closed, but on mobile devices this distinction isn't always dependable. This resulted in session cookies that could expire many times per day on a mobile device despite never logging out or closing the mobile browser tab. Session cookies may now also be set to expire after 1 day, 1 week, 2 weeks, or 1 month.
  • [Security/Session] Signing out will now destroy the current session's cookie.
  • [CHD-3194] [Mail/History/Usability] The 'Recipient History' tab on ticket profiles now shows a count of the total number of rows in the worklist. The count reflects the scope (recipients, org, domain) and any active worklist filters. For example, to see the open ticket count on the history tab when viewing tickets you just need to filter the history worklist to status=open. The count will then automatically reflect open tickets on all subsequent pages. This should speed up workflows where multiple open tickets from the same sender are reviewed and potentially merged. Previously, workers always had to click into the history tab to see if anything needed their attention.
  • [CHD-2783] [Mail/Merge/Usability] When merging tickets from a worklist, a confirmation popup is now displayed to verify the action. Previously, the merge action took place immediately. This should help prevent accidental merges from workers clicking on the wrong button.
  • [CHD-3081] [Dashboards/Worklists/Usability] The 'add record' popup is now available from worklist widgets on dashboards. When you hover over a worklist the (+) icon will appear. This allows new records of any type to be created from dashboards without having to navigate to the search page.
  • [Dashboards/Worklists/Usability] The 'peek' button will no longer wrap to the next line and leave gaps in worklist widget rows on dashboards.
  • [Dashboards/Worklists/Usability] Worklist widgets on dashboards will no longer underline record links unless they're hovered over. This reduces visual clutter, as too many links on the screen can be overwhelming.
  • [Mail/Reply/Usability] The snippet search box on the mail reply screen now shows a hint of "(Ctrl+Shift+I)" as the placeholder. This lets workers know that a keyboard shortcut is available.
  • [Dashboards/Workspaces/Activity Log] Activity Log worklists may now be added to dashboards and workspaces.
  • [Activity Log/Worklists] Activity Log worklists may now be filtered to specific actors or targets. For example, this can create a list of all the activity performed by a specific worker. Alternatively, you may create a list of all the activities that happened to a worker (e.g. assignments). This is especially useful when activity log worklists are added to dashboards.
  • [Activity Log/Worklists] Activity Log worklists may be filtered by actor or target contexts. The available options are now displayed in a multiple selection list. For example, a worklist may be created that displays all the activity that happened to task records, or activities that were performed by workers (rather than groups or the system). This is especially useful when activity log worklists are added to dashboards.
  • [Activity Log/Worklists] Activity Log worklists may be filtered by activity. The available options are now displayed in a multiple selection list. Previously, the person setting up the worklist had to know the internal IDs for the various events (which is unlikely). This change makes it easy to create a worklist of a specific kind of activity; for example, a list of comments posted on any record over the past week.
  • [CHD-2464] [Activity Log/Security/Logins] The Activity Log will now record worker login and logout activity. Both logins and logouts record the IP address in use at the time. The login event also records the user-agent (platform, browser, version). This is especially useful when combined with workspace dashboards to perform security oversight.
  • [Activity Log/Impersonation/Security] The Activity Log now records worker impersonation by administrators. The entry links to the administrator as the 'actor' with the worker they're impersonating as the 'target'. This provides accountability for impersonation events.
  • [CHD-3182] [CHD-3057] [Snippets/Worklists/Usability] The green (+) add button is now available at the top of all snippet worklists. This consistency improvement enables the quick creation of snippets from arbitrary workspaces.
  • [CHD-2756] [CHD-2915] [Activity Log/Mail] The Activity Log now records when a ticket is moved between groups or buckets. This is useful for SLAs and accountability.
  • [Subtotals/Platform/Plugins] Implemented an abstract getSubtotalDataForContextAndIdColumns() method on C4AbstractView for subtotaling a combination of context/context_id fields for any table. This makes it easy to implement a two-step subtotal process (e.g. first pick 'Worker', then pick a specific worker) for any record type. This was first implemented for use by snippets (owners) and the Activity Log (actors, targets).
  • [Activity Log/Subtotals] Activity Log worklists can now be subtotaled by 'Actor' or 'Target' using the two-step filtering process from context links. First a record type is selected (e.g. worker, task, ticket), then a specific record of that type may be selected. This replaces the 'Actor Context' and 'Target Context' subtotal fields because they're redundant with the first part of this new process.
  • [Snippets/Subtotals] Snippet worklists can now be quickly filtered using owner subtotals. This uses a two-step subtotal process where the first step selects the owner type (e.g. worker, group, role) and the second step can optionally pick a specific owner of that type. This is more flexible than the 'owner' filter, which doesn't currently provide the option to find any worker-owned snippets.
  • [Workspaces/Subtotals/Code Cleanup] Broken context links (e.g. links to records that have been deleted) will no longer be included in subtotal counts.
  • [CHD-2822] [Choosers/Usability] Chooser popups opened from other choosers will now behave properly. For example, you can filter tickets by watchers using a chooser, and from there you can filter the worker list by a group chooser. Previously, the nested choosers would replace the first popup, making it impossible to complete the desired action.
  • [Activity Log/Virtual Attendants/Worklists] Virtual Attendants can now manage worklists and behavior variables using Activity Log data. For example, a VA can send a daily report about worker login activity to a manager's email address. This could also be used to build a list of comments (e.g. comments by a particular worker, any comments about tickets, etc).
  • [Virtual Attendants/Links] Virtual Attendants can now set dynamic links on any related records, custom fields, or behavior variables. Previously, each event only had a few actions like 'set ticket links', and the records to link had to be selected ahead of time with a chooser. Now, there is an 'On:' option for selecting the target record (which could be a ticket's sender's organization), and links can be set using placeholders and behavior variables, as well as choosers. For example, a VA behavior can read new ticket subjects looking for a domain to be mentioned, and it can automatically link that domain to the ticket. There could be thousands of possible domains and they don't have to be specified in the VA behavior ahead of time. This enables much more sophisticated workflow automation. Existing 'set links' actions will be automatically converted to the new format.
  • [Virtual Attendants/Links/Simulator] The Virtual Attendant simulator will now display output for all 'Set links' actions.
  • [CHD-3206] [Subtotals/Workspaces/Usability] Fixed an issue where clicking '(none)' hid the other totals when subtotaling KB articles by 'Topic' or messages by 'Worker'.
  • [CHD-3205] [Drafts/Worklists] FIXED: Filtering on 'Message Type' via subtotals in a Draft worklist displays untranslated text in the filter bubbles.
  • [Knowledgebase] Fixed an issue with Markdown-formatted Knowledgebase articles breaking in older versions of PHP 5.x when an article was tens of thousands of characters long.
  • [CHD-2819] [Support Center/Registered Contacts] Registered Contacts can now be added from worklists. These records control who can log in to the Support Center.
  • [Support Center/Registered Contacts] Registered Contacts can now be deleted from their peek popup.
  • [CHD-2699] [Virtual Attendants/Links/Watchers] Virtual Attendants can now remove links and watchers from any record. The links to be removed can be placeholders (e.g. fields, watchers, custom fields), selected from choosers, or behavior variables (e.g. dynamic worklists). The 'Set Links' action has a new mode toggle for choosing between adding or removing.
  • [CHD-3187] [Virtual Attendants/Mail Filtering] Virtual Attendants can now remove attachments on incoming messages from Mail Filtering behavior. Attachments can be matched with exact filenames, wildcard patterns, or regular expressions.
  • [CHD-3200] [Security/Parser/Relay] Fixed an issue where the relay auth header could be spoofed in order to have arbitrary messages appended to existing tickets. This is a low severity issue since it's no different than someone spoofing an email address with a known ticket mask from someone else. Cerb won't automatically add these new senders to the conversation, and the risk for social engineering is low. However, because the relay auth header uses internal IDs instead of masks, it makes it easier for someone with malicious intent to hit a large range of IDs. It would be more tedious to clean up these junk messages than if they created new tickets.
  • [Dashboards/Counters/Gauges] The 'manual' datasource on dashboard counters and gauges will now properly format numbers when they contain commas as thousands separators.
  • [Profiles/Calendar/Usability] Added keyboard shortcuts to calendar event profiles pages. The edit popup can be opened with 'e', the 'm' key opens the VA macros popup, and the 1-9 keys change the selected tab.
  • [Search/Worklists/Usability] Fixed an issue on /search worklists where the shortcut for 'select all (a)' wasn't toggling the row selection properly.
  • [CHD-3210] [Mail/Peek/Usability] Removed the hidden feature where a worker can double click on the email text in the peek popup to close it. This constantly interferes with the ability to highlight text for copy/paste. The shortcut is a remnant from before the ESC key closed the popup window.
  • [CHD-3197] [Quick Search/Choosers/Usability] Fixed an issue in choosers where the last-used quick search filter wasn't automatically selected the next time the form displayed.
  • [CHD-2780] [Roles/Mail/Drafts] Added a new permission that allows workers to delete each other's mail drafts.
  • [CHD-3192] [Time Tracking] FIXED: Some time Tracking activity log entries have a redundant 'mins' unit appended to the end of the description (e.g. "5 mins mins").
  • [CHD-3097] [Time Tracking/Activity Log] The Activity Log now records status changes on Time Tracking entries (e.g open/closed). This is useful for change management.
  • [Plugin Dev/Events] Added a new 'dao.address.update' event for plugin listeners to react to Address record changes.
  • [Plugin Dev/Events] Added a new 'dao.calendar_event.update' event for plugin listeners to react to Calendar Event record changes.
  • [Plugin Dev/Events] Added a new 'dao.contact_org.update' event for plugin listeners to react to Organization record changes.
  • [Plugin Dev/Events] Added a new 'dao.contact_person.update' event for plugin listeners to react to Contact Person record changes.
  • [Plugin Dev/Events] Added a new 'dao.group.update' event for plugin listeners to react to Group record changes.
  • [Plugin Dev/Events] Added a new 'dao.notification.update' event for plugin listeners to react to Notification record changes.
  • [Plugin Dev/Events] Added a new 'dao.snippet.update' event for plugin listeners to react to Snippet record changes.
  • [Plugin Dev/Events] Added a new 'dao.worker.update' event for plugin listeners to react to Worker record changes.
  • [Plugin Dev/Events] Added a new 'dao.role.update' event for plugin listeners to react to Worker Role record changes.
  • [Plugin Dev/Events] Added a new 'dao.workspace_widget.update' event for plugin listeners to react to Workspace Widget record changes.
  • [Plugin Dev/Events] Added a new 'dao.feedback_entry.update' event for plugin listeners to react to Feedback record changes.
  • [Plugin Dev/Events] Added a new 'dao.kb_article.update' event for plugin listeners to react to Knowledgebase Article record changes.
  • [Code Cleanup/Platform/Resources] Removed the unnecessary semi-colon from the 'Content-Type:' header in the resource proxy. Certain webservers (e.g. Nginx) have trouble compressing this content when using a terminator with no additional parameters (e.g. encoding).
  • [Plugin Dev/Broadcast/Links] Broadcast functionality can now automatically link the newly created tickets with the involved records. To do so, include the 'context_links' parameter in the draft with an array of context+id pairs.
  • [CHD-2821] [CRM/Opportunities/Broadcast/Links] When broadcasting to an opportunity worklist, each opportunity will be automatically linked to the new ticket that it opens.
  • [Virtual Attendants/Notifications] Virtual Attendants may now create notifications without a linked object or URL. Clicking one of these will link back to the worker's notifications list.
  • [CHD-3100] [Mail/Filters/Notifications] Mail filtering behavior can now use the 'Create notification' action. For example, you can send a notification to admins when bouncing or rejecting an inbound message.
  • [CHD-3153] [Web-API/Search/Knowledgebase] Knowledgebase articles can now be filtered by 'topic_id' through the Web-API search feature. This returns articles that share the same top-level category. Each matched article is returned only once, even if it appears in multiple subcategories on the topic.
  • [CHD-3170] [Address Book/Web-API] Added an 'updated' field to address records to make it easier to synchronize the data with other systems. This timestamp is automatically updated when an address record changes through the GUI or API.
  • [Web-API/Search] The Web-API now supports the 'between' operator for filtering date fields by range. The 'value[]' parameter should be a JSON-encoded array with two elements for 'from' and 'to' as Unix timestamps.
  • [CHD-3143] [Mail/Search/Notes] Ticket worklists can now be search filtered by sticky note content.
  • [CHD-3058] [Virtual Attendants/Tasks/Custom Fields] Virtual Attendants can now set custom fields on the 'Create task' action. The custom field values can use any of the placeholders from the current event.
  • [Virtual Attendants/Mail/Custom Fields] Virtual Attendants can now set custom fields on the 'Create ticket' action. The custom field values can use any of the placeholders from the current event.
  • [Setup/Virtual Attendants/Usability] In Setup->Configure->Virtual Attendants, the menu will no longer open multiple instances of the same tab.
  • [CHD-3070] [Snippets] Fixed an issue in snippets where placeholders using the '|default' filter would always return default values instead of field values. For example, the snippet "Hi {{senderfirstname|default('there')!" always returned "Hi there!" instead of "Hi Bob!". This is because the underlying template engine (Twig) wasn't designed with Cerb's dynamic placeholders in mind and their "placeholder exists" checks are too simplistic.
  • [CHD-2772] [Snippets/Usability] Snippet worklists and choosers now show a preview of each snippet's content. This makes it easier for workers to find the right template compared to just being able to see titles. When using a chooser, the previews will execute the snippet logic and automatically replace placeholders with the appropriate values from the target record. This lets workers see the exact text that will be inserted if that snippet is selected. In the preview, placeholders that have been replaced with their corresponding values have a special style to provide a visual distinction between normal and dynamic text. Placeholders are also highlighted in the snippet previews on worklists.
  • [CHD-1117] CHD-2775] [Snippets/Placeholders/Usability] You can now add 'fill-in' placeholders to snippets which will prompt the current worker for more information before the text is inserted. These are values that aren't derived from records or custom fields; for example: order numbers, tracking numbers, product names, ETAs, etc. There are three types of fill-in placeholders: a single line of text with a descriptive label (e.g. "paste tracking number here"), a single line of text with a default value (that can be modified by the worker if needed), and multiple lines of text (e.g. "paste receipt here"). These can be inserted from the menu when editing snippets. Fill-in placeholders are required, so a snippet can't be accidentally sent with markers like "(paste order number here)" left in place. If there are placeholders that haven't been filled in, clicking the 'insert' button will automatically focus the first incomplete field. The form elements for fill-in placeholders will automatically resize as text is added or removed.
  • [Mail/Usability/Compose] When composing or replying to mail, the textbox will now automatically grow to accommodate the full height of the message. Previously the textbox was a fixed height and workers had to constantly scroll around in a smaller reply window.
  • [Mail/Compose/Usability] The snippet autocomplete box is now available on the compose popup. This allows workers to efficiently find and insert a snippet without the extra steps required to use the chooser.
  • [Mail/Compose/Usability/Keyboard] Added the Ctrl+Shift+I shortcut to the compose popup for focusing the snippet options.
  • [Mail/Compose/Usability/Keyboard] Added the Ctrl+Shift+G shortcut to the compose popup for inserting the current worker's signature at the cursor.
  • [CHD-3039] [Mail/Compose/Usability] The compose popup will now automatically save the current draft every 30 seconds.
  • [CHD-2700] [Mail/Reply/Drafts] When replying to mail, the current draft will be saved a final time before attempting to send the message. If the mail server has problems then the draft will be the latest version of the message for later resumption. Previously, the failure to send a message would only save a draft if none existed already, and drafts are only deleted after a successful send. This meant that changes to the message since the last save (i.e. within up to 30 seconds) could be lost.
  • [Mail/Compose/Drafts] Fixed a bug on the compose popup where resuming a draft wouldn't properly restore the status (e.g. open, waiting, closed).
  • [Mail/Reply/Usability] When replying to messages, the quoted content will now automatically wrap at 76 characters. Previously, a right angle bracket (>) was prepended to the beginning of each line from the original message. Quotes with long lines were difficult to read because they wrapped without the quote character in front of them. The new functionality rewrites the quoted message to improve readability.
  • [Mail/Reply/Keyboard] Added two new shortcuts to the Mail Reply text box. Ctrl+Shift+J jumps to the first blank line in a quoted message. Ctrl+Shift+Q wraps quotes to 76 characters. The wrapping happens automatically for the first quoted message, but the keyboard shortcut is useful when copying and pasting quoted content from elsewhere.
  • [Dashboards/Subtotals/Usability] Improved the usability of the subtotals widget on dashboards by combining multiple tabs of options into a single config popup.

New in Cerb 5.7.2 (Mar 14, 2012)

  • [Mail/Parser] The email parser will now check incoming attachments for a 'content-name' or 'disposition-filename'. Previously only the former was checked, and when an attachment only had the latter, and was text/plain, its contents were incorrectly appended to the message body.
  • [Search/Performance] Optimized the fulltext search indexing for messages and comments. Only the first 10KB bytes of message content will be indexed, and messages will ignore quoted content since this should be contained in the original message. This should make indexing long conversations much more efficient, and it should remedy the situation where workers or recipients quote the entire conversation every message and end up polluting the search index.
  • [Welcome] Added a link to the manual on the /welcome page.
  • [Virtual Attendants/Parameters] Fixed a warning with worker variables on Virtual Attendants when no workers are selected.
  • [CHD-2816] [Mail/Compose] Banned addresses will no longer be suggested as recipients when opening a ticket by organization.
  • [CHD-2788] [Mail/Tickets/Bulk Update] Workers can now bulk update the organization on ticket worklists.
  • [CHD-2779] [Mail/Worklists/Usability] In ticket worklists, the ticket move dropdown was changed to a chooser menu with a quick search box. This should make it much easier to select a specific bucket from a long list.
  • [Mail/Worklists/Usability] On ticket worklists, the 'm' keyboard shortcut will now open the move menu and focus the quick search box.
  • [CHD-2784] [Snippets/Usability] Added the two-step delete confirmation to the snippets popup.
  • [CHD-2792] [Mail/RSS/Security] Fixed an issue where RSS feeds for worklists were viewable for disabled workers.
  • [CHD-2754] [Plugins] Updated the built-in plugin manifests to version 5.7.2 from 5.6.x
  • [CHD-2764] [Reports] Date-based reports can now group charts by hour.
  • [CHD-2741] [Setup/Plugins] You can now search by name on the 'Installed Plugins' and 'Plugin Library' tabs in Setup.
  • [CHD-2766] [Reports] When hovering over a report chart, the value of a data point is now displayed in addition to the date and the label for the 'Group Replies over Date Range', 'Created Tickets by Group over Date Range', 'Closed Tickets by Group over Date Range', and 'Worker History over Date Range' reports.
  • [CHD-2627] [Mail/Parser] The parser will now treat 'message/rfc822' mime parts as attachments. These messages are sent as abuse reports, bounces, and forwarded messages. Their content will no longer be appended to the message body.
  • [Mail/Print] Fixed the broken default logos when printing tickets or messages.
  • [CHD-2807] [Snippets/Roles] Implemented role-owned snippets. This allows you to easily share snippets with multiple groups, arbitrary lists of workers, or everyone. Currently, only administrators can create or modify role-owned snippets, but any worker associated with the role can use them.
  • [CHD-2680] [Snippets/Worklists] Added a virtual column on snippet worklists for displaying the owner (worker, group, or role). This is also displayed on the snippet chooser.
  • [CHD-2680] [Snippets/Worklists/Search] Snippet worklists can now be filtered by owner. This also introduces a new multi-context autocomplete widget (selecting workers, groups, or roles).
  • [CHD-2808] [Snippets/Setup] Added a new Snippets management area to Setup. This allows administrators to create, view, and modify all snippets (regardless of owner) in a centralized place.
  • [CHD-2809] [Snippets/Worklists] Administrators can now bulk update owners and custom fields on snippet worklists.
  • [CHD-2827] [Snippets/Subtotals] Fixed a bug that prevented filtering snippet worklists by the 'plaintext' type from the subtotals sidebar.
  • [CHD-2826] [Mail/Filters] FIXED: Adding a wildcard (*) filter value on a header will match all messages, even those that don't contain the header.

New in Cerb 5.7.1 (Feb 6, 2012)

  • [Virtual Attendants/Variables] [CHD-2743] Fixed a warning log entry that occurs when editing certain behaviors that have no variables defined.
  • [Mail/Compose] [CHD-2744] Fixed a bug that prevented the 'From:' field on the Send Mail page from listing groups that had only an inbox and no other buckets.
  • [Mail/Compose] The custom fields for the Send Mail form will now be rendered properly for the default group/bucket.
  • [Mail/Virtual Attendants/Custom Fields] [CHD-2746] Custom fields on the compose and reply forms will now be applied first so that they are available to Virtual Attendant behavior. This allows VAs to make decisions based on selected custom fields, and it fixes the issue where changes that VAs made to custom fields were overwritten by any blank custom fields in the form provided by the worker.
  • [Setup/Groups] Fixed a minor glitch where the last group in the Manage Groups list was presented as the default group. The default should be 'Add Group'.
  • [Broadcast] Fixed a bug that prevented the 'Test' button from working on Broadcast functionality.
  • [Mail/Compose] [CHD-2734] Fixed another issue with the Send Mail form where workers who used it for the first time (i.e. prior to having a default preference) were unable to send mail if by chance they did not need to change the value of the 'From:' drop-down. If the drop-down was changed then everything worked as expected.
  • [Platform/Update] [CHD-2750] Fixed an issue during upgrades where the platform attempted to read plugin manifests before updating itself. This caused problems if the plugin schema in the platform changed (e.g. Cerb 5.7) and administrators attempted to upgrade from the /index.php page instead of the /update service. For now, any time the platform detects that the version has changed it will redirect to /update without reading plugin manifests first. As a consequence, every upgrade will log out sessions, but this shouldn't be a major problem since upgrades are infrequent in production.

New in Cerb 5.7.0 (Jan 10, 2012)

  • [Plugins] Plugins will now be disabled during an upgrade if their requirements aren't met. Third-party plugins that haven't been tested with the new application version will also be disabled. To compensate for this, we'll be introducing a system that automatically updates plugins after an upgrade.
  • [Plugins] Plugin requirements can now be specified in their manifest. These include PHP extensions, plugin dependencies, a required minimum version of Cerb5, and a 'tested up to' version.
  • [Plugins] Plugin requirements are now clearly displayed in the Plugins tab in Setup.
  • [Plugins] Plugins manifests now should specify a version in the same XX.YY.ZZ format as Cerb5. The incremental revision count has been removed since it complicates maintaining branches of development for different major versions.
  • [Plugins/SDK] Updated the SDK examples to reflect the new plugin manifest changes.
  • [Devblocks/Platform] Implemented strVersionToInt() and intVersionToStr() utility methods. These convert versions between the formats '5.7.1' and '050701'. The latter integer version makes comparisons quicker and more efficient.
  • [Devblocks/Platform] Added the PclZip library by Vincent Blavet to Devblocks (LGPL licensed). This can be used to manage ZIP archives when the PHP 'zip' extension isn't installed. This will initially be used by the new browser-based plugin installer.
  • [Devblocks/Platform] Devblocks will now track plugin version numbers instead of revision numbers. This allows simple version comparisons when looking for updated plugins.
  • [Plugin Library] Implemented the Plugin Library which allows completely browser-based plugin installs. In addition, it makes it much easier to find new plugins that are guaranteed to be compatible with your current version. After a Cerb5 upgrade, the plugin library will help you automatically update all your plugins (previously you had to track down new plugin versions from various places on your own). This first library will focus on plugins that we've reviewed to ensure they're safe; however, we're building the system with the ability to add arbitrary repositories for easier management of your own custom plugins.
  • [Plugins/Setup] The setup pages for installed plugins and the plugin library have been combined into a single 'Manage Plugins' section. Each list is presented as a tab, which makes them easier to notice.
  • [Plugins/Setup] The list of installed plugins is now displayed in a worklist. This allows the familiar paging, sorting, and searching functionality. Plugins can now be enabled or disabled per-row, which makes it easier to enable dependencies.
  • [Plugins/Setup] Installed third-party plugins can now be completely uninstalled through the browser.
  • [Plugins/Usability/Setup] Plugins that are disabled will now display a banner on top of their plugin icon. This visual cue improves the usability of the worklist by making it easier to spot plugins that are inactive.
  • [Plugins/Setup] Plugins that are installed through the browser will no longer default to enabled. Instead, a popup will be shown which allows the plugin to be configured at the same time as it is enabled.
  • [Plugins/Setup] When managing plugins in setup, a configuration popup is now provided for each plugin. This saves plugin authors the requirement to create a new configuration section, and it makes it easier for end-users because they don't have to hunt down inconsistent configuration settings after installing a plugin.
  • [Plugins] Moved the Gravatar plugin out of the core project and into the plugin library.
  • [Plugins] Moved the Feed Reader plugin out of the core project and into the plugin library.
  • [Plugins] Moved the Call Logging plugin out of the core project and into the plugin library.
  • [Plugins] Moved the Datacenter plugin out of the core project and into the plugin library.
  • [Plugins] Moved the Datacenter domains plugin out of the core project and into the plugin library.
  • [Plugins] Moved the OpenID plugin out of the core project and into the plugin library.
  • [Plugins] Moved the Spam Analysis plugin out of the core project and into the plugin library.
  • [Plugins/Setup/Search] Implemented quick search for the Installed Plugins and Plugin Library worklists.
  • [Plugins/Setup/Subtotals] Implemented subtotals for the Installed Plugins and Plugin Library worklists.
  • [Plugins/Setup/SDK] Implemented a new extension point (cerberusweb.plugin.setup) that displays tabs on the 'Configure' area for a plugin in Setup. This makes it easy to provide options that need to be verified before a plugin can be enabled (e.g. for integration). Multiple instances of this extension per plugin will be rendered as tabs in the popup. Developers no longer need to implement custom page sections for configuration, and users no longer have to dig for the setup page for each plugin -- they can simply configure them at the same time they enable them.
  • [Plugins/Setup] Plugin requirements now must be satisfied before a plugin can be enabled in Setup.
  • [Virtual Attendants/Variables] Virtual Attendant behaviors can now define, set, and check custom variables. Variables can be used in conditions and actions. They are also available as placeholders in snippets. The value of a variable can be static (a constant value), synthesized (generated based on other values), or composited (combining multiple values). For a simple example usage, a variable can be set to a different value depending on the various outcomes of a condition. Additionally, a true/false variable can be set based on a complex set of conditions and then reused throughout the decision tree as a single condition with a more intuitive name (e.g. "has SLA"). This also handles workflows where a piece of information (e.g. an organization or server name) needs to be extracted from another field (e.g. a ticket subject) and act as both a condition and a value in actions. A variable's value can be set using snippets, and if the same template needs to be sent in multiple actions (e.g. auto-replies) then it can be set as a variable and reused with a single placeholder. This improves reusability and allows template modifications in a single place.
  • [Snippets] Implemented a 'regexp' modifier for snippet placeholders. For example, {{ticket_subject|regexp('/New Order: (.*?)/', 1}} returns the first match of the given regular expression. The optional second argument specifies the match to be returned as determined by parenthesis. For example, in the regular expression "/((\d)(\w))/" on the text "4J" there are three matches: the first match is both \d and \w ('4J'), the second is exclusively \d (a digit; '4') and the third is exclusively \w (a word character, 'J'). This modifier supports the same options as PHP's preg_match() function. This modifier is especially useful when paired with the new Virtual Attendant custom variables feature in order to extract information from one field and save it as a new one.
  • [Virtual Attendants/Mail] Virtual Attendant behavior can now rewrite ticket subjects using placeholders. For example, under certain conditions the phrase "URGENT:" could be prepended to incoming ticket subjects.
  • [Virtual Attendants/Custom Fields/Snippets] Virtual Attendant behavior can now set text-based custom fields using placeholder values.
  • [Virtual Attendants/Variables] Virtual Attendant behavior can now define custom variables that refer to workers. This is useful for configuring assignment workflow, where the variable can be used to set an owner rather than a hard-coded worker.
  • [Virtual Attendants/Mail] Ticket owners can now be set using worker variables in Virtual Attendant behavior. This makes automated assignment workflow possible. At the moment, the selection of a value for the worker variable is limited to a random selection from a predefined list of workers. In the near future this will be expanded with more sophisticated options, such as "worker is online", "least loaded", and "round-robin".
  • [Devblocks/Platform/Plugins] Implemented a registry service in Devblocks to provide persistence for arbitrary variables. It can be accessed using the DevblocksPlatform::getRegistryService() singleton. This service is designed to be efficient in high usage environments like Virtual Attendants. It will only read and write variables once per request. Delta updates are also supported using increment/decrement operations for variables like counters. Write-before-read is also supported, in situations where a value may be set or updated without a concern for its initial value; and when a delta value is read after being written it will automatically adjust to the initial+current value. This service is preferred for persistence if the data you're writing is arbitrary and write-intensive.
  • [Virtual Attendants/Platform/Plugins] Virtual Attendant behaviors now automatically increment the key 'trigger..counter' in the Devblocks registry service. This counter can be read by custom criteria and actions to provide arbitrary sequence-based functionality. For example, to round-robin a sequence of 5 objects, the modulus of the counter's value by 5 will return a repeating range of 0-4, which can be used as index values for the sequence array. It is recommended to use this pattern for performance because it will not add any additional reads/writes to the registry in order to implement new counter-driven behavior.
  • [Virtual Attendants/Platform/Plugins] Added the ability to use group choosers in custom Virtual Attendant conditions and actions.
  • [Virtual Attendants/Variables/Worker] Expanded the options for setting a worker variable in Virtual Attendant behavior. Workers can now be chosen at random, in round-robin sequence, or by load balancing the number of open assignments. Workers can be defined explicitly or by including entire groups. The final list of available workers can be filtered to only those who are currently logged in. This should allow for far more sophisticated auto-assignment workflow in Virtual Attendants.
  • [Virtual Attendants/Debug] The /debug feature for exporting Virtual Attendant behavior now supports behavior variables.
  • [Virtual Attendants/Debug] The /debug feature for exporting Virtual Attendant behavior now displays human-readable labels for all conditions and actions. Comments are also added to the XML for worker_id with the full worker name.
  • [Virtual Attendants/Macros/Variables] Virtual Attendant macros now accept parameters. This allows you to create macros with greater reusability. For example, a macro that creates a task on a ticket could take parameters to specify the title and the due date which allows it to be used in more situations than a macro with hard-coded options.
  • [Virtual Attendants/Actions/Snippets/Plugins] Any Virtual Attendant action can now access the snippet placeholder toolbar by using the CSS class "placeholders" on any input:text or textarea form elements. With this single tag, the searchable token insertion menu and snippet tester button will be available when the field receives focus.
  • [Virtual Attendants/Scheduled Behavior/Variables] When scheduling behavior from a Virtual Attendant action you can now pass arbitrary values as parameters for any defined variables. This works exactly like it does on macros, improving reuse and enabling messages to be passed between behaviors in order to have a persistent state.
  • [Virtual Attendants/Action/Comment] Workers can now be notified when a Virtual Attendant behavior creates a comment.
  • [Mail] [CHD-2364] The 'From:' field on the 'Send Mail' page will now default to whatever group was previously used. This saves the tedium of constantly selecting a group from further down the list.
  • [Mail/Compose] [CHD-2710] When using the Send Mail form, you can now compose a new ticket from individual group buckets. This allows you to use per-bucket reply-to addresses, and it saves the extra step for 'move to' at the bottom of the page. Using the 'Insert Signature' button will now load the bucket's signature if one is defined. This is also implemented for the compose popup.
  • [Virtual Attendants/Mail/Watchers] [CHD-2514] Virtual Attendant behavior on the 'New message on a watched conversation' event can now access fields about the ticket owner.
  • [Tasks/Quick Search] [CHD-2649] Implemented quick search for the tasks worklist on the Activity page. This is incremental, so it won't overwrite any non-title filters that are in effect.
  • [Support Center/Ticket History] [CHD-2714] Fixed a bug that prevented sorting from working on the Ticket History list in the Support Center.
  • [Reports] [CHD-2706] Fixed a bug on the 'Created Tickets by Group' report that prevented the group names from showing up on the tabular subtotals.
  • [Mail/Display/Keyboard] [CHD-2707] Added a (w) keyboard shortcut on the Display Ticket page for toggling watcher status on and off.
  • [Mail/Display/Keyboard] [CHD-2640] The (r) shortcut on Display Ticket will now automatically click the 'Reply' button based on a worker's preferences (replying with or without quoting the original message). Previously this displayed a menu that allowed the selection of how to reply for each message. Using Shift+R as the keyboard shortcut will now show that menu.
  • [Snippets/Usability] [CHD-2694] The snippet property 'context' has been renamed to 'type' for consistency. These terms were used interchangeably between editing snippets and filtering them in a worklist.
  • [Virtual Attendants/Notifications] [CHD-2653] Virtual Attendants can now send a notification to the dynamic 'owner' of a ticket-based or message-based record. Previously, notifications from behavior could only be sent to a predefined list of workers, which limited their flexibility.
  • [Virtual Attendants/Usability] [CHD-2715] In Virtual Attendants, the ability to drag around conditions or actions had a few usability issues. Previously you could drag conditions and actions by clicking and holding anywhere on their form, but this led to a lot of unintentional dragging. Now you can explicitly drag conditions from their bold heading, and the cursor will change to the 'move' icon when you hover over it. You can do the same with actions from the legend above their fieldset.
  • [Configuration/Scheduler] Fixed a bug when saving a scheduler job that caused all the jobs to be run when clicking 'run now' (instead of just the specific job). This wasn't an issue when first loading the page, only after editing a job and then clicking the link.
  • [Virtual Attendants] [CHD-2720] The reusable placeholders toolbar can be deleted along with an action. It should be moved out of the action before deletion
  • [Virtual Attendants/Mail Filters] [CHD-2517] Responding to a message from mail filters will now use the first matching destination address as the 'From:' address. In the past, this functionality always used the default sender address, which could be confusing in multiple brand environments.
  • [Mail Filters] Fixed an issue that prevented testing snippet placeholders on Virtual Attendant mail filter behavior.
  • [Virtual Attendants/Mail Filtering/Snippets] Snippet placeholders can now be used for 'To' and 'Subject' when sending or redirecting mail from Virtual Attendant filtering.
  • [Virtual Attendants/Relay] [CHD-2697] Fixed a bug in the Virtual Attendant 'relay to worker email' action that could result in a bucket's reply-to address being ignored.
  • [Time Tracking/Comments] [CHD-2719] Fixed a bug that prevented the notes of a time tracking entry from showing up in the automatic comment left on the linked record. (Thanks to Robert Middleswarth for reporting the issue and providing a patch)
  • [Support Center] [CHD-2721] Fixed a bug on the Support Center where the 'Send Message' button could vanish permanently if a form was submitted without all the required fields.
  • [Mail/Display/Usability] [CHD-2718] Added two new keyboard shortcuts to the Display Ticket page: (T) take/assign, and (U) unassign. The 'take' shortcut is only available if the ticket is unassigned, and the 'unassign' shortcut is only available if the ticket is assigned to the current worker.
  • [Mail/Display/Usability] The ticket owner property is now always shown at the top of the Display Ticket page. If no owner is set it will display 'nobody'. Previously, the property was only displayed if an owner was assigned, and this meant to determine it was unassigned you had to look through every property and notice that 'owner' was missing. This is much less intuitive than always displaying the field in the same place and definitively stating that no owner is set.
  • [Time Tracking/Links] [CHD-2690] When adding a time tracking entry to a ticket, the entry will also be linked to the ticket's organization. In the event the ticket has no organization assigned then it will defer to the initial sender's organization. Prior to this change the initial sender's organization was always used the the ticket's organization was ignored.
  • [Virtual Attendants/Mail/Orgs] Virtual Attendant behavior can now use conditions and actions based on the organization associated with a ticket. Previously, behavior had to rely on the organization associated with the initial or latest sender.
  • [Virtual Attendants/Scheduled Behavior] Fixed a bug with scheduling behavior from a behavior of the same type. If the scheduler was told to schedule only the 'earliest' behavior, it would usually be the behavior currently running instead of the one being added. The current behavior is now excluded from these comparisons.
  • [Virtual Attendants/Macros] [CHD-2682] Workers can now run group macros through the Virtual Attendant menu on Display Ticket. This removes a lot of redundancy since all group members can now share a single set of macros that are set up by the group manager. Each worker can still create their own macros in addition to the shared ones.
  • [Virtual Attendants/Variables] Virtual Attendant behavior variables can now be defined as public or private. When used as a macro, a public variable is exposed to workers as a parameter where they can choose the value. A private variable is never displayed and is to be considered for internal use only. For example, a macro to create a task could expose two public variables for the task name and due date; while a behavior to automatically assign workers would have a private variable for the assignee (since this is not something a worker would choose when using the behavior).
  • [Virtual Attendants/Scheduled Behavior/Bulk] Virtual Attendant macros can now be invoked from bulk update with custom parameters.
  • [Mail/Compose/Suggested Recipients] [CHD-2724] Fixed an encoding problem on the full names of suggested recipients. These will now follow the encoding of the browser/database (e.g. UTF-8).

New in Cerb 5.6.3 (Nov 18, 2011)

  • [CHD-2686] [Attachments/Storage] Deleting attachments from bulk update with random selection gives an error.
  • [CHD-2687] [Storage/Attachments/Maint] FIXED: The storage engines are not removing physical files during maintenance.
  • [CHD-2374] [Debug/Virtual Attendants] The /debug helper can now export an XML file that describes the Virtual Attendant behavior for all events. This format will probably allow import/export functionality in the future, but it's currently useful for technical support and training.
  • [CHD-1218] [Mail/Scheduler] Added a X-Header to incoming messages to record the mailbox it was downloaded from. This can be used for mail filtering. (Thanks to Robert Middleswarth and Mike Queisser for submitting the patch!)
  • [Install/Automation] Added three SQL scripts to /install/extras/automation/ to assist with non-interactive automated setups (e.g. On-Demand, Linode Stackscripts, Parallels Cloud). These scripts allow service providers to bypass the guided installer for automation.
  • [CHD-2692] [Windows/Localization] It's possible for the mbstring extension to be compiled without regexp support on Windows.
  • [CHD-2691] [Mail/Drafts] Sorting the Drafts tab on the Updated column doesn't actually sort the list.
  • [CHD-2681] [Snippets/Subtotals] Implemented subtotals for the context field on snippets.
  • [CHD-2689] [Mail/Split] FIXED: Splitting a ticket will remove a requester from the original conversation if it was their only message. This is not always desirable because requesters are chosen explicitly.
  • [Mail/Split] A split message will now link the same organization from the original ticket to the newly created one.
  • [CHD-2685] [Virtual Attendants/Relay/Localization] The default relay message can now be translated.
  • [CHD-2638] [Workspaces/Add] When adding a new workspace, a worker's own workspaces are now shown by default since the full list can be overwhelming when it's unintentional.

New in Cerb 5.6.2 (Nov 9, 2011)

  • [CHD-2656] [CRM/Address Book/Peek] There's no title on addy peek popups from Opp display.
  • [Custom Fields/Import] Importing date-based custom fields to the address book or opportunity lists will now permit Unix epoch timestamps in addition to any sensible date format (e.g. June 30 2012, 2012-Jun-30, Jun-30-12, +30 days)
  • [Snippets/Permissions] Fixed an issue where workers could create snippets for any group even if they weren't a manager.
  • [CHD-2659] [Snippets] Fixed an issue where workers couldn't delete snippets that they had write access to.
  • [Virtual Attendants/Usability] Improved the drag/drop rearranging of nodes in decisions trees by making the bubble the drag handle. Previously you could accidentally start dragging nodes by clicking anywhere outside the tree at the same level as a particular node.
  • [Virtual Attendants/Events/Usability] Virtual Attendant behaviors are now grouped by event.
  • [CHD-2658] [Virtual Attendants/Events/Usability] Virtual Attendant behaviors can now be reordered by dragging on their title and moving it within their event group.
  • [Virtual Attendants/Events/Usability] When adding a new Virtual Attendant behavior, it will be focused by the browser without hiding the rest of the decision trees.
  • [CHD-2667] [Maintenance] Fixed SQL errors reported during maintenance when cleaning up workspaces.
  • [CHD-2662] [Support Center/Announcements] FIXED: Can't add knowledgebase feeds as an announcement source. This was caused by a missing 'User-Agent' header.
  • [CHD-2540] [ImpEx/Address Book] FIXED: The importer will now add Registered Contacts and set the Organization even if an address already exists.
  • [CHD-2672] [Mail/Bulk Update] Fixed an issue where bulk updating tickets submitted all the changes to the database in one pass instead of batching them as designed.
  • [CHD-2650] [Web-API/Mail] Fixed an issue that prevented ticket searched by group through the Web-API.
  • [CHD-2615] [Mail/Subtotals] Clicking on '(none)' in the list of subtotals on a worker-based field will now apply the proper filter for 'nobody' instead of 'blank'.

New in Cerb 5.6.1 (Oct 26, 2011)

  • [Org/Merge] Modified the organization merge popup so it can be reused by plugins.
  • [Address Book/Plugins] Implemented the 'handleTabAction' controller action for address book tabs. This allows Ajax-driven functionality to be implemented in plugins that contribute new tabs without requiring an explicit controller for each plugin.
  • [Address Book/Merge] [CHD-2620] Merging organizations will now also reassign the org associated with tickets.
  • [Address Book/Merge] Merging organizations will now combine scheduled behavior on org records.
  • [Mail/Scheduler/POP3] [CHD-1769] If a POP3 mailbox fails more than 5 times it will automatically be disabled. A notification with the most recent error message will be sent to all administrators.
  • [CHD-2610] [Virtual Attendants/Mail] FIXED: The new 'group and bucket' and 'group' conditions aren't available on 'new message on watched convo' events for workers.
  • [CHD-2612] [Snippets/Tester] FIXED: The snippet tester mistakingly reports that most date-based placeholders are unknown.
  • [CHD-2568] [Profiles/Activity Log/Subtotals] FIXED: The 'target context' subtotal option on Activity Log worklists disappeared after the subtotals were changed or the list was refreshed.
  • [CHD-2544] [Datacenter/Domains] Added the ability to delete domains from datacenter.
  • [CHD-2223] [Storage/S3] You can now specify an optional custom host for S3 storage profiles. The host defaults to s3.amazonaws.com to prevent previous configurations from becoming broken.
  • [CHD-2626] [Mail/Conversations/Usability] Mail conversations now show the relative date next to the 'Date:' header. Hovering over the relative date will also show the absolute date in the current worker's timezone. This makes it easier to get a sense for how much time has elapsed.
  • [CHD-2618] [Mail/Broadcast] Broadcast compose will now use the organization from the first recipient when creating the ticket. Previously this was using the organization of the sender (like inbound mail), which doesn't make sense in this context.
  • [CHD-2636] [Mail/Piles] FIXED: The pile sorter on mail worklists provides an 'assign' option which actually adds watchers. It now sets owners.
  • [Mail/Piles] Owners or watchers can now be assigned to mail from worklists using the pile sorter.
  • [CHD-2639] [Code Cleanup] Cleaned up lingering references to 'auto-refresh' in translations and permissions.
  • [CHD-2643] [Roles/Permissions] FIXED: When saving a role the itemized permissions become unchecked unless you re-select the role.
  • [CHD-2611] [Mail/Peek/Custom Fields] FIXED: The custom fields entry on ticket peeks no longer shows the custom fields table when there are no fields available to the group the ticket is currently in.
  • [CHD-2632] [Tasks] Tasks can now be bulk deleted.
  • [CHD-2634] [Snippets/Virtual Attendants] FIXED: The group_name and group_url placeholders now work properly in ticket-based Virtual Attendant actions.
  • [CHD-2646] [CRM/Opportunities] Opportunity records now show a linked organization at the top of the display page. This saves the extra step of having to open the contact popup and clicking on the org.
  • [CRM/Opportunities/Usability] Added an 'o' shortcut to opportunity display pages to quickly open the organization popup.
  • [CHD-2622] [Address Book/Orgs/Peek] The organization peek popup now shows the tabs for 'People' and 'Comments'. This saves the extra clicks required to go to the full organization record to find this information.

New in Cerb 5.6.0 (Oct 6, 2011)

  • [Contexts/Snippets] Added the ability for any context to abstractly provide a random record. This is useful for underlying functionality like snippet testers.
  • [Snippets] Snippets can now be created for any record type (e.g. tasks, opportunities, servers, knowledgebase articles). The upgrade process will automatically migrate ownership of snippets to the workers who created them. Ownership can then be transferred to the appropriate group.
  • [Snippets] Snippets can now be owned by workers or groups. This provides a way to partition snippets among workers for distinct brands. The 'Snippets' tab has moved to worker profiles for worker-owned snippets, and to group profiles for group-owned snippets. Managers can add/edit group snippets and any group member can see them when selecting snippets. A shortcut to the current worker's snippets is provided from the top-right menu.
  • [Snippets/Context] You can now change the context of a snippet when editing it. For example, you can change a 'worker' snippet to a 'ticket' one and the new placeholder options will appear. You can also change any snippet to 'plaintext' so it can be used on any record.
  • [Snippets/Tester] The snippet tester will now check that the provided placeholders are valid. In the past a nonsensical placeholder like {{dummy}} would simply be blank when output. Now, a warning will be given that the placeholder is unknown. This is especially useful when converting a snippet between contexts (e.g. from worker to ticket).
  • [Snippets/Usability] [CHD-2212] The snippets chooser now remains open after insertion and can be used to insert multiple templates with a single-click each.
  • [Snippets/Chooser/Usability] Added a quick search box to the snippets chooser. This saves workers from the hassle of opening up the filters to add a title criteria.
  • [Snippets/Broadcast/Usability] [CHD-1985] You can now add snippet templates to a broadcast from bulk update. This should save a lot of work from copying and pasting broadcast templates from elsewhere.
  • [Comments/Snippets] You can now use snippets when adding comments to any record type.
  • [Knowledgebase/Snippets] You can now use snippets to add content when editing knowledgebase articles. For example, you can have a template that provides consistent headings for new articles (e.g. Introduction, Instructions, References).
  • [Mail/Snippets/Sticky Notes] [CHD-1504] You can now use snippets when adding sticky notes to messages in a ticket conversation.
  • [Snippets/Mail/Compose] [CHD-880] You can now use snippets from the quick compose popup.
  • [Translations] A Spanish translation is now provided in /install/extras/translations
  • [Support Center/Knowledgebase] Knowledgebase articles will now be displayed on the Support Center by 'updated' date rather than most viewed as a default. This prevents the same couple articles from dominating the list. This will likely become a setting in the near future.
  • [Impostor/Impersonate] Implemented the ability for an administrator to impersonate any other worker from their profile. This is very useful for setting up a work environment for a new team member, or for troubleshooting reported issues, without a worker having to expose their password. The administrator can quickly change back to themselves by clicking their own name in the top right.
  • [ACL/Permissions/Roles] Worker permissions are now always active. If you're upgrading an environment that had permissions disabled then a default role will be created that grants all permissions to your workers.
  • [ACL/Permissions/Roles] Worker roles can now be applied to: everyone, specific groups, or specific workers. In previous versions you could only assign workers to roles and you had to do it for each new worker. The new 'everyone' and 'groups' options will automatically apply permissions to new workers, and permissions will be adjusted as workers join/leave groups. A role applied to 'everyone' can be used to create a permissions baseline; for example, enabling a common set of plugins or granting a common set of permissions. You can also use an 'everyone' role to grant all privileges if you don't wish to use itemized permissions.
  • [ACL/Permissions/Roles] When adding worker permissions from a role you can now grant: all, none, or itemized. In previous versions only the itemized option was available. If you use 'all' it will automatically include any new permissions that are added.
  • [ACL/Permissions/Performance] Worker permissions are now stored in a cache per worker, which reduces the overhead of invalidation when data changes.
  • [ACL/Permissions/Performance] Optimized the way plugins and extensions are authorized to remove redundant privilege checks within a single plugin (regardless of the number of extensions).
  • [Devblocks/Platform] Added a new helper method DevblocksPlatform::sanitizeArray($array, $type) to sanitize array user inputs and force them to specific types (e.g. integer, boolean).
  • [Translations/Russian] Added a Russian translation to /install/extras/translations (Thanks to barzog on the Cerb5 forums)
  • [ACL/Permissions/Roles] [CHD-2308] When saving a worker role the page will no longer reset to adding a new role.
  • [Workspaces] [CHD-308] Shared workspaces have been implemented. This allows multiple workers to see the exact same worklists in a workspace. Workspaces can be owned by workers, groups (managers), or roles (admins). Editors can change the worklist (name/required filters/columns), and readers can have their own subtotals/paging/sorting. This ensures multiple workers have the same perspective. The owner of a workspace is displayed at the top of the tab (if not owned by the current worker). Changes to shared worklists will automatically syndicate to any workers using them.
  • [Workspaces/Usability] Creating a workspace requires fewer steps now. Previously you had to create the workspace by name, then add it, click to its tab, and hit the Edit button. Now the 'Create Workspace' button will provided a popup for editing the workspace immediately.
  • [Mail/Reply] [CHD-1761] When replying to a message, the system will automatically provide suggestions of recipients to include based on the headers of the original message (e.g. From/To/Cc). This functions like a 'Reply to All' feature, but with more flexibility. The suggestion box will follow you when you focus To/Cc/Bcc, and clicking on a suggested address will add a new recipient to that category. You can dismiss this suggestion box, or it will dismiss itself once empty.
  • [Mail/Reply] The 'To:' field on the Reply screen will now automatically add any listed recipients to the conversation. This ensures they will receive copies of future correspondence.
  • [Mail/Reply] The 'To:/Cc:/Bcc:' inputs now provide a tooltip for each field while focused.
  • [Worklists/Usability] Improved the usability of row-selection on worklists by instructing the browser to not attempt to select/focus text in cells when clicked.
  • [Platform/Refactor/Plugins/Cleanup] Improved consistency of the schema/API by renaming any lingering instances of: agent->worker, team->group, category->bucket.
  • [Mail/Open Ticket] Combined the functionality of Open Ticket with Send Mail to remove redundancy. Open Ticket was implemented originally because the organization associated with a ticket was based on the first sender. This is no longer necessary in 5.6+ since you can assign the organization to each ticket.
  • [Mail/Auto Refresh] Moved the auto refresh functionality out of the core project. See: http://www.cerberusweb.com/support/k...rowser_plugins[Mail/Orgs] Organizations can now be assigned per ticket. Previously an organization was automatically associated with a ticket based on the first sender, but this caused problems when the first sender was a worker (compose vs. open ticket), or when the organization needed to change later on. When tickets are created, an organization will still be automatically assigned, but you now have the ability to change or override it.
  • [Mail/Compose/Usability] When assigning an organization to a new ticket from Send Mail, a suggestion box will pop up with recommended recipients based on the top contacts associated with that organization. As with the new reply functionality, the suggestion box will follow you between To/Cc/Bcc fields. This makes it much easier to send mail when you know the name of the organization but not the appropriate contact. If you leave the new organization field blank, the ticket will be automatically associated with the organization of the first recipient.
  • [Mail/Orgs/Usability] The organization of a ticket is now displayed in the properties at the top of the page.
  • [Mail/Worklists/Orgs] You can now open the peek popup for an organization by clicking in that column on ticket worklists.
  • [Mail/Usability] [CHD-1714] You can now input email addresses in full RFC-2822 format (e.g. Personal ). Semicolons or commas can be used to separate multiple addresses. This works on compose, reply, adding requesters, etc.
  • [Mail/Reply/Usability] Recipients and suggested addresses on replies will now include full names (either from the headers or the address book).
  • [Mail/Compose] Fixed a bug that would allow a blank personal name in the From header for new outgoing mail (not replies).
  • [Mail/Compose/Custom Fields/Usability] [CHD-725] Custom fields can now be set from the compose mail screen. This saves the tedious extra steps of having to view each new ticket, edit, and set them from the peek popup.
  • [Mail/Reply/Custom Fields/Usability] [CHD-2362] Custom fields can now be set when writing a reply.
  • [Mail/Compose] Added an option on Send Mail for not sending a copy of the new message to the recipients. This was another distinction between Send Mail and Open Ticket in the past, where the former always sent a copy and the latter never did. Since these use cases have been combined, this option allows either choice from the same place.
  • [Virtual Attendants/Context Links] [CHD-2578] Virtual Attendant (VA) behavior can now make decisions using record links as conditions. For example, this was requested by users who wanted to be able to define service levels based on the server record that a sender's organization was linked to. Links as VA conditions are implemented for the following event types: address, call, domain, feed item, knowledgebase article, message, opportunity, org, server, task, ticket, time tracking entry
  • [Virtual Attendants/Context Links] [CHD-2109] Links can now be created between records using actions in Virtual Attendant behavior. This is implemented for the following event types: address, call, domain, feed item, knowledgebase article, message, opportunity, organization, server, task, ticket, time tracking entry
  • [Datacenter/Servers/Usability] The server peek popup will now provides a link to the full record.
  • [Datacenter/Domains/Display] Fixed a bug on the domain display page that prevented the associated server peek from opening properly.
  • [Mail/Reply] [CHD-2593] The Reply/Forward options no longer disappear if a ticket has no recipients since they are now suggested on the reply page.
  • [Mail/Display] [CHD-1920] If there are no recipients on a ticket, the warning is now shown in the 'Recipients' property at the top of the page, and it will disappear automatically once recipients are added. Previous this required a page refresh.
  • [Mail/Compose] [CHD-2591] If no organization is provided on the Send Mail page, the system will attempt to lookup the organization of the first recipient. This is preferable compared to using the sender/worker's organization.
  • [Virtual Attendants/Macros] [CHD-2585] FIXED: A behavior with a blank name doesn't show up in the Virtual Attendant menu or popup from record pages.
  • [Virtual Attendants] [CHD-2574] FIXED: Error on 'Relay to Worker Email' action when Virtual Attendant behavior is owned by a worker instead of a group.
  • [Virtual Attendants/Mail] Combined the 'Move to Group' and 'Move to Bucket' actions into a single action on mail-based Virtual Attendant behavior.
  • [Virtual Attendants/Conditions] [CHD-2542] Added a new 'Group' condition to ticket-based events for Virtual Attendant behavior. This provides a list of groups with checkboxes and 'any of these' or 'not any of these' matching. This is an alternative to the 'Group name' condition that does text-based matching.
  • [Virtual Attendants/Conditions] [CHD-2542] Added a new 'Group and Bucket' condition to ticket-based events for Virtual Attendant behavior. This allows the primary selection of a group and the secondary selection of multiple buckets within that group. 'Any of these' and 'not any of these' matching is provided. This is an efficient alternative to cumbersome combinations of 'Group name' and 'Bucket name' conditions.
  • [Support Center/Contact] [CHD-2572] FIXED: The default email address for 'Deliver to:' is always blank when configuring contact situations in the Support Center.
  • [Support Center] [CHD-2571] When visitors send a message from the Support Center, the 'Send' button will hide after it's clicked to prevent multiple submissions during latency.
  • [Roles] [CHD-2573] The 'mail' and 'activity' privileges should be enabled by default on upgrades from 5.x
  • [Virtual Attendants/Compose] [CHD-2508] The 'Before sending' and 'After sending' Virtual Attendant behaviors now work when composing mail in addition to replying.
  • [Call Logging/Links] [CHD-2471] You can now 'Create and Link' call logs from the Links tab on any record.
  • [Support Center/Knowledgebase] [CHD-2567] FIXED: The Support Center knowledgebase RSS feeds aren't sorting articles in the proper order.
  • [Mail] [CHD-2564] Fixed an issue where forwarded messages and some replies saved a different 'Message-Id' header than was sent to a contact (due to behavior in the SwiftMailer library). This could result in replies not threading to existing conversations.
  • [Workspaces/Usability] Improved the '+' add workspace tab. You can now filter workspaces by all, mine only, selected only, or text match. This is especially helpful for administrators who can now see all workspaces. Improved the look and feel. Added 'handles' for drag reordering.
  • [Workspaces] [CHD-2580] Workspaces can now have their ownership transferred.
  • [Workspaces/Shared] Administrators can now access all workspaces, whether they are owned by groups, roles, or other workers.
  • [Workspaces/Shared] Administrators can create workspaces for other workers.
  • [Support Center] [CHD-2595] The 'X-Cerberus-Portal' email header that is included in all Support Center originated messages will now include the name of the portal as its value. This can be used for mail filtering and Virtual Attendant behavior.
  • [Workspaces] [CHD-2576] FIXED: Deleting a worklist on a workspace doesn't delete worker preferences for it in the database.
  • [Profiles] Administrators can now edit workers or enter impersonation mode from the profile list without having to click into each profile.
  • [Snippets] Snippet ownership can now be modified from the edit popup.
  • [Virtual Attendants] [CHD-2603] The 'Replace text in message content' Virtual Attendant actions can now use regular expressions. This can be used to filter incoming messages and strip content like long blocks of quoted lines or signatures. Regular expression substitutions are also supported with the "\1…\9" syntax. Sponsored by XILO Communications - http://www.xilo.net

New in Cerb 5.5.2 (Sep 1, 2011)

  • [Support Center/Knowledgebase/RSS] Implemented a 'Recently Added' RSS feed for knowledgebase articles in the Support Center. This syndicates each article once and it won't move an article to the top when updated like 'Recently Updated' does.
  • [Support Center/Knowledgebase/RSS] [CHD-2557] Fixed an issue where the knowledgebase articles in Support Center RSS feeds didn't always sort properly by Most Popular or Recent Changes.
  • [Explorer] [CHD-2553] FIXED: The small Cerb5 logo is missing from the top left of the explorer frame.
  • [Virtual Attendants/New Group Message] [CHD-2559] Fixed an issue on the "New Message on a Group Conversation" event where a 'sender worker email address' value was mislabeled as 'message sender email address' and giving unexpected results.
  • [Mail/Reply] [CHD-2555] The 'Reply' button is now hidden after it is clicked to mitigate multiple messages being sent if there is latency.
  • [Mail/Reply/Usability/Shortcuts] The 'r' keyboard shortcut on the mail conversation page will now expand and focus the reply menu to provide the option of quoting, not quoting, or forwarding.
  • [Mail/Display/Shortcuts] Added an 'i' shortcut for opening the recipients popup when displaying a ticket.
  • [Virtual Attendants/Custom Fields] [CHD-2554] Fixed an issue where picklist custom field conditions always passed as the first outcome.
  • [Scheduler/Waiting/Notifications] [CHD-2501] Activity log entries and notifications will now be generated for tickets when they reopen from a 'waiting until' date.
  • [Support Center/Knowledgebase] Knowledgebase articles will now be displayed on the Support Center by 'updated' date rather than most viewed as a default. This prevents the same couple articles from dominating the list. This will likely become a setting in the near future.

New in Cerb 5.5.1 (Aug 25, 2011)

  • [Choosers/Address Book] [CHD-2533] FIXED: The organization chooser is no longer alphabetized by name by default.
  • [Support Center/Localization] [CHD-2528] FIXED: The Support Center login form text is not in the translation system.
  • [Mail] [CHD-2547] FIXED: The checkbox for 'Notify me about new activity' now works properly.
  • [Virtual Attendants] [CHD-2541] FIXED: An error is displayed when using prepend/append/replace conditions on the "Before sending worker message" group event.
  • [Support Center] [CHD-2548] FIXED: The Support Center default templates use the old Cerb5 logo.
  • [Address Book/Contacts] [CHD-2531] Custom fields can be set on registered contacts.
  • [Address Book/Contacts/Support Center] [CHD-2159] The passwords of registered contacts can be changed by workers.
  • [Permissions] [CHD-2538] The 'mail' and 'activity' pages can now be disabled through worker permissions.

New in Cerb 5.5.0 (Aug 9, 2011)

  • * [Mail/Search/Comments] [CHD-544] Implemented the ability to search comments in combination with the other ticket filters.
  • [Comments/Search] Created a fulltext index for comments to support fast text searching, phrases, and expert mode (booleans, boosting, etc).
  • [Mail/Setup/Masks] [CHD-622] The ticket mask pattern can now be changed in Setup->Mail->Incoming. In addition to random letters (L) and numbers (N), you can now also use year/month/day tokens (Y/M/D), letter/number (C), or literal text. A tester will verify that there are more than 10 million combinations for the given pattern before accepting it. The number of possible combinations will be displayed when testing any masks, and a sample generated mask will also be provided. Sponsored by XILO Communications - http://www.xilo.net/
  • [Virtual Attendants/Reply/Email Relay] [CHD-2345] Group Virtual Attendants can now create behavior on a "Worker message is ready to send to a group conversation" event. This provides a way to modify worker messages before they are sent to recipients. The default actions are: prepend/append text to message content, and find/replace text in message content. Conditions can be based on anything in the original ticket or the worker's reply. For example, an advertising tagline can be appended to the bottom of all outgoing email; if a keyword is detected (such as 'Facebook') a link could be provided at the bottom of the message; and custom tokens can be replaced with full content -- like using snippets through the email relay. This feature was sponsored by XILO Communications - http://www.xilo.net/
  • [Mail/Reply] [CHD-2387] Added a split submit button to the mail reply form to present more options for delivering a message. Implemented a 'Save without sending' option that saves a reply in the history but doesn't send it to the recipients. This is useful when recording sensitive information (e.g. passwords) where you don't want to transmit it over email but you want to make it available through the Support Center web interface using SSL. Sponsored by XILO Communications - http://www.xilo.net
  • [Virtual Attendants/Sent by Group] Added a '{{group_sig}}' token to the "Worker message is ready to send to a group conversation" event. This will always insert the appropriate signature for the sending worker based on group setup.
  • [Virtual Attendants/Mail Filtering] Migrated the pre-parser mail filtering functionality to Virtual Attendants with a new event for "New mail received [by application]". Earlier mail filtering functionality was limited to a single matching rule and a single action (blackhole, bounce, redirect); now decision trees can be used to nest conditions, stack behavior, and add multiple actions. Existing filters will be converted to Virtual Attendant behavior automatically by the update process. The results of this behavior modify the income message before it is accepted by the system, and can be used to optimize/examine/compress attachments, rewrite headers, modify message content, and countless other applications.
  • [Virtual Attendants/Mail Filtering/Conditions] Mail filtering can now make decisions based on an incoming message's number of attachments, attachment name, size, or mime type.
  • [Virtual Attendants/Mail Filtering/Actions] When 'bouncing' mail from a mail filter, a custom subject can be provided that has access to all the snippet placeholders for the inbound message.
  • [Virtual Attendants/Mail Filtering/Actions] Inbound message headers can now be added, changed, or removed, as an action on mail filtering behavior.
  • [Mail Filtering/Redirect] FIXED: The redirect action fails when the 'From:' header contains a personal name.
  • [Virtual Attendants/Notifications] [CHD-2444] Virtual Attendants can now selectively mark notifications as 'read' with a new behavior action.
  • [Mail/Queue] Workers can now delete queued messages from ticket conversations without having to go into Setup->Mail->Queue. Administrators can delete messages queued by anybody.
  • [Mail/Queue] Mail can now be scheduled for future delivery in the queue. By default mail will be delivered immediately, but a message could now be scheduled for the beginning of a recipients work day, etc.
  • [Virtual Attendants/Mail/Queue] [CHD-2396] Virtual Attendants can now schedule replies on tickets to happen at a future date. This can be used to create an assembly line workflow: "welcome letter, day 2 followup, day 30 followup".
  • [Virtual Attendants/Plugins] A Virtual Attendant event can now be triggered procedurally for a single behavior only (rather than all behaviors watching the event).
  • [Macros/Virtual Attendants] [CHD-1977] Added macro functionality to Virtual Attendants. Macros are built on the full power of Virtual Attendants, meaning your macros can have their own decision trees to decide the appropriate actions to take based on any conditions. For example, a macro can schedule several followup emails in advance to a sales lead, or add several tasks like a checklist to a new order. A macro could also have different outcomes based on the value of a record's custom fields, or the owner, watchers, etc. The possibilities are limitless.
  • [Macros/Tickets] [CHD-1487] Implemented macros for tickets.
  • [Macros/CRM/Opportunities] [CHD-1357] Implemented opportunity macros.
  • [Virtual Attendants/Custom Fields] Enhanced Virtual Attendants (VA) so they are capable of setting custom fields on more than one record type from the same behavior. For example, when setting ticket custom fields a VA could also set fields on the sender and the sender's organization. This change also allows VA behavior to override how custom fields are set, which is useful for events that don't deal with existing records (e.g. pre-parser mail filters).
  • [Macros/Tasks] Implemented macros for tasks.
  • [Mail Filters/Custom Fields] [CHD-1359] Mail filtering behavior can now set custom fields on inbound mail prior to the creation of a ticket.
  • [Devblocks/Platform/Plugins] Page and controller URIs can now use underscore in addition to alphanumerics (e.g. '?c=controller_name' and /cerb5/controller_name/).
  • [Custom Fields/Platform/Plugins] [CHD-2362] Implemented a new UI pattern for displaying arbitrary properties and custom fields for any record in a readable and space-efficient way. Fields can be defined in a preferred order to control how they are rendered. The renderer knows how to display all custom field types, and built-in fields can provide a type for emulation (e.g. drop-down). Overrides also give full control of how fields are rendered on records. The major improvement here is that custom fields are visible at the top of every record rather than hidden in the 'edit' popup.
  • [Mail/Display/Custom Fields] Ticket records with custom fields set now show those values at the top of each record.
  • [Tasks/Display/Custom Fields] Task records with custom fields set now show those values at the top of each record.
  • [Tasks/Display] The 'due date' is now shown at the top of each task record.
  • [Tasks/Worklist/Display] The permalink for task records will now show the friendly name of the task in the URL (e.g. /tasks/display/1-Upgrade_the_database_server).
  • [Tasks/Display] Editing a task from the display screen will now properly reload the page.
  • [Devblocks/Markdown] Updated the Markdown library to a slightly more efficient, pared-down version.
  • [Devblocks/Performance/Plugins] Refactored Devblocks to bootstrap using the minimum number of required services to start the platform (cache + database + classloader). Moved service implementations into their own files. This makes it easier to work on the platform, and it should also speed up PHP compile times on sites that don't use opcode caches like XCache.
  • [Call Logging/Custom Fields] Call records with custom fields set now show those values at the top of each record.
  • [Call Logging/Display] Editing a call from the full record screen will now properly refresh the page.
  • [Address Book/Display/Custom Fields] Address records with custom fields set now show those values at the top of each record.
  • [Address Book/Display] The address full record will now display an organization link at the top of the page if assigned to one. Previously you had to click 'edit' to find this information.
  • [Address Book/Orgs/Custom Fields] Organization records with custom fields set now show those values at the top of each record.
  • [CRM/Opportunity/Custom Fields] Opportunity records with custom fields set now show those values at the top of each record.
  • [Knowledgebase/Display/Custom Fields] Knowledgebase articles with custom fields set now show those values at the top of each record.
  • [Time Tracking/Custom Fields] Time tracking entries with custom fields set now show those values at the top of each record.
  • [Datacenter/Server/Custom Fields] Server records with custom fields set now show those values at the top of each record.
  • [Datacenter/Server] When editing a server record it will now automatically refresh the page.
  • [Datacenter/Domain/Custom Fields] Datacenter domain records with custom fields set now show those values at the top of each record.
  • [Datacenter/Domain] When editing a domain record it will now automatically refresh the page.
  • [Feed Reader/Custom Fields] Feed reader items with custom fields set now show those values at the top of each record.
  • [Address Book/Registered Contacts/Custom Fields] Contact records with custom fields set now show those values at the top of each record.
  • [Keyboard/Usability] Added keyboard shortcuts to all record display pages: (e) edit, (m) macros
  • [Devblocks/Popups/Keyboard/Usability] When closing a popup with the ESC key, focus will be returned to the page so it doesn't interfere with keyboard shortcuts or TAB navigation. Previously, a user had to click on the background to be able to use keyboard shortcuts again.
  • [Keyboard/Usability] Added keyboard shortcuts to all record display pages: (1-9) change tab
  • [Platform/Plugins] Implemented a reusable 'mail history' tab that accepts an organization or a list of individual addresses. This cleans up the redundancy between addresses, contacts, orgs, and opps in providing the exact same functionality. Plugins can implement a mail history tab for their records in a line single of template code.
  • [Address Book/Profile/Usability] [CHD-2371] Address records now provide a mail history tab.
  • [Virtual Attendants/Platform/Plugins] Refactored Virtual Attendants and events to make it easier for third-party plugin developers to create new events without having to reproduce a large amount of functionality. Abstract event parents provide the underlying functionality for a particular perspective: ticket, task, message, etc.
  • [Virtual Attendants/Mail/Assignment] [CHD-2347] Added a new event to group-based Virtual Attendants for "Conversation assigned in group". This can be used to create behavior when mail is assigned to a worker; including relaying a full copy of the latest message to their mobile email address instead of just sending a notification.
  • [Virtual Attendants/Mail/Relay] Virtual Attendants can now relay mail to dynamic targets like 'owner' and 'watchers' instead of having to use an explicit list of workers.
  • [Virtual Attendants/Scheduled Behavior] [CHD-846] [CHD-1123] Virtual Attendants can now schedule behavior to happen at a future date. This provides an incredibly flexible way to build reminders and automated followups. For example, if an incoming message is from an organization with a service level agreement (SLA), your Virtual Attendant could schedule behavior in 2 hours to check the status of the ticket and react appropriately (e.g. escalate). Scheduled behavior can also reschedule itself, providing the ability to create loops of behavior that repeat until certain conditions are met. For example, if the duration since the last worker reply is too long according to the SLA, a reminder could be sent to the record's watchers every hour until rectified. Each new reply from a customer could initiate the behavior loop over again. Scheduled behavior is managed by a queue that runs as part of a scheduled job from /cron, which is more efficient than holding up the email parser or worker UI during long-running tasks.
  • [Notifications/Usability] [CHD-2449] Notifications about activity log events will now be context-linked to those records instead of using URLs. This allows notification "folding", which means that multiple notifications that link to the same record can be automatically marked as read at the same time without you having to read and dispatch each one individually. This also means that if you move your helpdesk to a different URL or path, or mix access from http/https or intranet/extranet, the URL given for a notification will always be valid.
  • [Notifications/Contexts] When viewing a record that has unread notifications (whether or not a notification is clicked on first) a worker will now be shown those messages on the display page. This makes it very easy to see what has changed on a watched record since you last viewed it.
  • [Notifications/Plugins/Platform] The 'cerberusweb.core::internal/notifications/context_profile.tpl' template can be used by third-party plugins to show a list of unread notifications on a profile/record page in a single line of template code.
  • [Notifications/Explore] When navigating notifications using explore mode they will automatically be 'folded' so you will only visit distinct records regardless of how many individual notifications exist for each one. All these notifications will be marked as read automatically. For example, if you have 40 notifications for 5 events on each of 8 records, you will only be shown 8 records from explore mode. At the end of viewing these records you will have no unread notifications. Prior to 5.5 you had to mark all these duplicates as read individually.
  • [Notifications/Usability] The unread notifications count is now updated at the end of the request instead of at the beginning. This makes sure that if your current page marks multiple notifications as read (for the same record) that you will have an accurate count of unread notifications while displaying the current page.
  • [Notifications/Migration] Existing ticket and task notifications will be automatically converted from URL notifications to context notifications by the upgrade script. This retroactively provides the new improvements to existing notifications.
  • [Notifications/Merge] [CHD-1815] Notifications are now merged when tickets or organizations are.
  • [Events/Plugins/Code Cleanup] Made sure all the record types purge context-related data when they are deleted (e.g. attachments, comments, activity log, links, custom fields, notifications, attendants). Implemented a 'context.delete' event that can be monitored by third-party plugins to give them an opportunity to clean up their data too.
  • [Maintenance/Code Cleanup/Contexts] The maintenance scheduled task will now make sure context artifacts are cleaned up if the record they are linked to has been deleted (e.g. attachments, custom fields, comments, activity log, notifications, virtual attendant behavior). This will even cover situations where records are deleted while a plugin is disabled; the plugin can clean up its records during maintenance the next time it is updated.
  • [Macros/Calls] Implemented macros for calls.
  • [Macros/Knowledgebase] Implemented macros for knowledgebase articles.
  • [Virtual Attendants/Decision Trees/Usability] Previously you had to manually recreate nodes if you wanted to rearrange a decision tree. You can now drag/drop nodes within a Virtual Attendant's decision tree (e.g. decisions, outcomes, and actions). A visual cue is given to show valid drop locations; for example, an outcome can only be added to a decision, while an action can be added to outcomes or the top-level event.
  • [Virtual Attendants/Usability] The automatic colorization of decision tree outcomes for 'yes' (green) or 'no' (red) has been extended to phrases where yes/no is followed by a space or comma; for example "Yes, it's overdue" or "No it is not". This allows more flexibility in creating decision tree labels while retaining the visual color cue.
  • [Macros/Address Book] Implemented macros on address records.
  • [Macros/Address Book/Orgs] Implement macros for organization records.
  • [Macros/Datacenter/Server] Implemented macros for server records.
  • [Macros/Datacenter/Domains] Implemented macros on domain records.
  • [Macros/Feed Reader] Implemented macros for feed item records.
  • [Macros/Time Tracking] Implemented macros on time tracking records.
  • [Virtual Attendants/Usability] Adding new Virtual Attendant behavior will now take you straight to the popup where you can name it. Previously the 'add' button would create a new decision tree and you had to click it to open the menu and select 'edit'.
  • [Virtual Attendants/Usability] When you add new behavior to a Virtual Attendant the new decision tree will now be focused instead of leaving you to hunt for it in the full list of existing behaviors.
  • [Virtual Attendants/Usability] When configuring a Virtual Attendant you can now filter the list of behaviors to specific events.
  • [Platform/Usability/Dates] The shorthand relative dates (e.g. 2 hrs ago, 25 days) are now rounded up or down. Previously they were always rounded down. This improves the accuracy of the estimate. For example, something '1 hour and 45 minutes' old is closer to '2 hours old' than 1 hour.
  • [Virtual Attendants/Macros/Scheduled Behavior] When selecting custom behavior from a display page using the Virtual Attendant button, you can now decide when you would like it to run. A time of 'now' (the default) will run the custom behavior immediately. This scheduling makes a lot of interesting things possible: schedule reminders for later; SLA escalation; auto-close behavior for waiting tickets; etc.
  • [Virtual Attendants/Scheduled Behavior] The scheduled behavior on a record is now displayed when viewing its page. You can reschedule behavior or delete it.
  • [Virtual Attendants] [CHD-2336] Administrators can now create or modify Virtual Attendant behavior for any worker through their profile.
  • [Virtual Attendant/Tasks] Added a 'set due date' action to task-related Attendant behavior.
  • [Virtual Attendants/Bulk Update] Virtual Attendant behaviors can be scheduled from bulk update. This allows for the automation of some very complex workflows; unlike a traditional bulk update that applies the same action to all rows, an Attendant can analyze each row in a long list and come up with the most appropriate action for each one.
  • [Virtual Attendants/Notifications] Creating a notification from Virtual Attendant behavior can now be set to notify 'watchers' rather than having to give an explicit list of workers.
  • [Address Book/Explore] [CHD-2522] Implemented explore mode for address worklists.
  • [Tasks/Usability] [CHD-2440] Added a 'completed' button to task worklists.
  • [Notifications/Usability] [CHD-2440] Implemented a 'mark read' button for notification worklists.
  • [Address Book/Orgs/Search] [CHD-1141] You can now search comments in combination with other organization fields.
  • [Tasks/Search/Comments] You can now search comments in combination with other task fields.
  • [Call Logging/Search/Comments] You can now search comments in combination with other call fields.
  • [Feed Reader/Search/Comments] You can now search comments in combination with other feed item fields.
  • [CRM/Opportunities/Search/Comments] You can now search comments in combination with other opportunity fields.
  • [Time Tracking/Search/Comments] You can now search comments in combination with other time tracking fields.
  • [Address Book/Search/Comments] You can now search comments in combination with other address fields.
  • [Datacenter/Servers/Search/Comments] You can now search comments in combination with other server fields.
  • [Datacenter/Domains/Search/Comments] You can now search comments in combination with other domain fields.
  • [Workspaces/Copy] [CHD-2506] Copying a worklist will now include the required filters set from 'customize'.
  • [Setup/Attachments] [CHD-2518] FIXED: Subtotals on attachment worklists don't update after deleting rows. This was because multiple records can link to the same attachment, and the files aren't removed until there are no links. Changed subtotals to count links instead.
  • [Snippets/Mail] [CHD-2521] FIXED: When inserting snippets for tickets, two blank lines are added.
  • [Search/Custom Fields] [CHD-2515] Custom field picklists can now be searched using 'blank or in list' and 'blank or not in list' operators.
  • [Search/Mail] [CHD-2496] Clicking on the '(none)' category in a subtotal breakdown will now properly run an 'is blank' search.
  • [Virtual Attendants] Adding a comment on the 'create task' action will now properly notify the selected workers.
  • [Virtual Attendants/Notifications] [CHD-2497] You will now receive notifications about things your Virtual Attendant does for you if you're a record watcher. For example, you will now receive notifications about automated comments or assignments.
  • [Notifications/Comments] [CHD-2373] If you add yourself explicitly to the list of "Also notify these workers" for a comment then you'll receive a notification. By default you don't receive notifications for your own actions.
  • [Virtual Attendants/Events/Mail] [CHD-2519] Implemented two new conditions for mail behavior: "last incoming activity" and "last outgoing activity". These can be used to implement SLA escalation functionality (e.g. no outgoing worker reply for the past 2 hours) and auto-close functionality (e.g. no incoming customer reply for the past 3 days).
  • [Virtual Attendants/Groups/Events] [CHD-2413] Added a new "After sending worker message" event to groups. This allows Virtual Attendant custom behavior after an outgoing message to complement the "Before sending worker message" event that was added earlier.
  • [Virtual Attendants/Scheduled Behavior] [CHD-2524] Added a new 'unschedule behavior' action to Virtual Attendants. This is useful if you want to switch behavior entirely; for example, if escalating SLA handling. It will clear all scheduled behavior of a certain type.
  • [Virtual Attendants/Scheduled Behavior] When scheduling behavior you can now select how duplicate behavior is handled: allow multiple occurrences, only keep first occurrence, or only keep latest occurrence. For example, when scheduling a reminder you may want to have multiple reminders; when scheduling an SLA escalation you probably want to favor an existing schedule before adding a new one; and when creating a timer that resets with each contact you would want to keep the latest behavior and remove everything before it.
  • [Virtual Attendants/Snippets] [CHD-2523] Every record now has a 'record_url' snippet token that provides a direct URL to the record in the web interface. This is useful for custom notification functionality.
  • [Web-API/Attachments] [CHD-2512] It is now possible to search for attachments by context and context_id. This allows you to grab all attachments linked to a specific record (ticket, comment, task, etc).

New in Cerb 5.4.6 (Jul 7, 2011)

  • [Mail/Relay] CHD-2399] FIXED: Email replies to a ticket from a worker are reformatted using double line-spacing.
  • [Mail/Reply] [CHD-2400] FIXED: Replies to a ticket from the web interface have extra line-spacing inserted into them.
  • [Web-API/Attachments] [CHD-2490] FIXED: Attachments can not be retrieved or downloaded.
  • [Views] [CHD-2491] FIXED: If MySQL strict mode is enabled then views output a SQL error when attempting to persist them.
  • [Attachments/Internet Explorer] [CHD-2410] FIXED: Certain types of attachments (e.g. Excel, PDFs) won't download when using SSL in Internet Explorer.
  • [Mail/Reply/Usability] [CHD-2441] Removed the "You are navigating away from this page" warning since the behavior isn't consistent between browsers.

New in Cerb 5.4.5 (Jun 29, 2011)

  • [Support Center/Knowledgebase/RSS] [CHD-2468] The RSS feeds in the Support Center KB don't translate Markdown to HTML when syndicating articles.
  • [Web-API/Custom Fields] [CHD-2455] The Web-API now has named keys for custom field records. 'id' and 'context' are now provided. 'group_id' is visible for ticket custom fields. Sponsored by XILO Communications - http://www.xilo.net
  • [Mail/Broadcast/Queue] [CHD-2484] If you broadcast reply to a ticket with no requesters the mail_queue entry is undeliverable and never cleans up.
  • [Mail/Queue] [CHD-2483] If an autoreply fails to send and is queued for redelivery, it will remain flagged as an autoreply so no worker sender is required.
  • [Workspaces/Custom Fields] [CHD-2460] FIXED: An 'unknown column' error when adding a required custom field filter to a workspace worklist if the custom field is also not an editable filter.
  • [Mail/Relay] [CHD-2480] FIXED: The email relay uses a custom 'Message-Id' header that is invalid in some MTA/MUAs.
  • [Support Center/Templates] [CHD-2485] The Support Center 'customfields_readonly.tpl' and 'customfields_writeable.tpl' templates can now be modified when configuring Community Portals.
  • [Web-API/Groups] [CHD-2477] Implemented the ability to get/search groups through the Web-API.
  • [Who's Online/Display] [CHD-2462] When a worker displays a ticket it will now always update their last activity with a link to the ticket. By default, worker activity only updates once per 30 seconds. This makes it easy for workers to look at the same ticket as someone else without having to copy/paste URLs.
  • [Mail/Compose/Keyboard/Firefox] [CHD-2470] FIXED: Keyboard shortcuts don't work on mail compose or log ticket when using Firefox. The control key also don't work for copy/paste or selecting text via keyboard.
  • [Web-API/Custom Fields] [CHD-2474] Fixed an issue with the sortBy parameter not working in the Web-API for records with custom fields.
  • [Web-API/Tickets] When you retrieve a ticket record from the Web-API it will now include information about each requester.
  • [Web-API/Tickets/Requesters] [CHD-2481] Ability to add and remove requesters on tickets from the Web-API. Sponsored by XILO Communications - http://www.xilo.net/ ; See: http://wiki.cerb5.com/wiki/Web-API:Tickets#Requesters

New in Cerb 5.4.1 (May 16, 2011)

  • [Mail/Search] [CHD-2295] You can't search for a blank 'owner' (worker-based) custom field.
  • [Setup/Storage/On-Demand] [CHD-2298] The Storage/Attachments setup page can now be used while in ONDEMAND_MODE.
  • [Setup/License/On-Demand] [CHD-2296] The License setup page can now be viewed while in ONDEMAND_MODE.
  • [Worklists/Attachments] [CHD-2299] Add subtotals functionality to attachment worklists.
  • [Worklists/Messages] Fixed a display issue on message worklists.
  • [Watchers] Made it far more convenient for workers to assign each other as watchers when given the proper permissions. The watcher buttons are now 'split' buttons. The left side will add/remove yourself as a watcher, and the right side will allow you to view all watchers, and add/remove if you have permission. Assignment and unassignment are tracked by the Activity Log. This functionality is available on Peek and Profile for all objects that support it, as well as the Ticket Reply feature.
  • [Plugins/Aesthetics/UI] Added two new styles for building "split" buttons.
  • [Mail/Drafts/Merge] [CHD-2304] Merging tickets does not merge drafts.
  • [Notifications] [CHD-2306] Clicking the red notifications alert for explore mode can be confounded by filters on the Profile->Notifications worklist.
  • [Support Center/Setup] [CHD-2305] Made it more obvious how to delete contact situations when setting up a Support Center profile. Previously you had to clear out the "reason" text. Now there's a simple status dropdown including "deleted".
  • [Support Center/Setup] [CHD-2301] Added the ability to toggle Support Center profile "contact situations" between visible and hidden.
  • [Keyboard Shortcuts/Usability] [CHD-2300] Fixed an issue with using PGDN/PGUP/HOME/END browser keys on some pages (like Display Ticket) with Firefox and Opera.
  • [Permissions/Watchers/Bulk Update] [CHD-2307] Use the new 'assign/unassign other watchers' permissions to lock down Bulk Update everywhere.
  • [Tasks/Permissions/Delete] [CHD-2213] Added a worker permission for deleting tasks (separate from editing tasks).
  • [CRM/Opps/Permissions/Delete] [CHD-2198] Added a worker permission for deleting opportunities (separate from editing them).
  • [Mail/Sticky Notes/Notifications] [CHD-2309] Sticky note notifications create an invalid URL.
  • [Aesthetics] Fixed the 'split button' arrow style on all Windows browsers by adding an actual sprite for the icon rather than relying on Unicode rendering.
  • [Migration/Views/Worklists] [CHD-2316] If 'mail_workflow' in 'worker_view_model' is corrupt then it blocks the Workflow view from working. This is primarily an issue for people upgrading straight from Cerb4 to 5.4 (a nice problem to have).
  • [Support Center] [CHD-2318] Fixed a bug where the Support Center wouldn't save follow-up questions (or even stripped them) when 'magic_quotes_gpc=On' in php.ini.

New in Cerb 5.3.3 (Mar 8, 2011)

  • [Snippets] [CHD-2210] Searching snippet titles should automatically use leading/trailing wildcards.
  • [Snippets] Fixed the search filters for last_updated (date), created_by/last_updated_by (worker chooser).
  • [Mail/Display/Reply] [CHD-2204] Fixed the escaped HTML on the "You are replying to a ticket owned by someone else" warning message.
  • [Parser] [CHD-2205] Fixed a bug in the email parser that checks if the incoming email message's "Precedence" header is "bulk". When working properly this avoids sending auto-replies back to mailing lists. With the bug, this could also avoid sending auto-replies in certain unintended situations.
  • [Setup/Plugins] Added a 'Find more plugins' link to the 'Setup -> Features & Plugins' tab. This directs people to the https://github.com/cerb5-plugins repositories.
  • [Support Center] [CHD-2203] Unable to add secondary email address to SC account if it's not in the address book already.
  • [Knowledgebase/Mail/Reply] [CHD-2194] Searching the knowledgebase when replying to a ticket ignores subcategories.
  • [Knowledgebase/Mail/Reply/Usability] Improved the usability of the knowledgebase search on Ticket Reply. After searching, the term text will be focused and selected so you can type another term immediately if you aren't satisfied with the results. You can press ENTER inside the search text box to run the search. The explicit search button has been removed. Fixed a big that cleared the results list on subsequent searches without providing new results.
  • [Mail/Display] [CHD-2218] Fixed a bug that responded with a blank page (after successful form submit) when pressing ENTER in the 'edit recipients' popup on Display Ticket.
  • [Mail/Display/Usability] [CHD-2200] The ticket mask will no longer be stripped from the /display/ URL when using the toolbar at the top of the Display Ticket page.
  • [Contexts/Feedback/Plugins] Added a context for Feedback entries.
  • [Feedback/Custom Fields] [CHD-2196] Feedback entries aren't showing custom fields (e.g. setup/read/write).
  • [Login/Usability] [CHD-2197] Multiple login failures will now preserve the destination URL throughout the entire process. Previously if you clicked on a helpdesk URL, were asked to log in, and mistyped your login then you wouldn't be redirected to the page of the original URL when you did subsequently log in successfully.
  • [Mail/Bulk Update] [CHD-2214] Bulk update on tickets should be able to set a 'reopen on' date when setting 'waiting for reply' or 'closed'.

New in Cerb 5.3.1 (Jan 24, 2011)

  • [Mail] [CHD-219] Fixed the 'auto hide quoted text' feature when displaying mail. This had to do with the new auto-escaping functionality in templates.
  • [Support Center] [CHD-2165] Submitting a ticket give the ticket number with instead of the HTML.
  • [Preferences] [CHD-2164] The 'My Account' page doesn't remember 'OpenID' as a selected tab.
  • [Mail/Snippets/Usability] [CHD-2166] The snippet worklist shows extension ids for the 'context' column rather than friendly labels like 'Ticket' or 'Worker'.
  • [Mail/Snippets] Fixed an issue with the 'message' tokens not displaying on ticket snippets.
  • [Mail/Peek] [CHD-2174] Warnings output if you attempt to 'peek' a ticket that has no messages (such as one where the only message was deleted, or any ticket with its content merged into another).
  • [Datacenter] [CHD-2172] Add/notify comments from server and domain peek popups.
  • [Mail/Display] [CHD-2177] The Display Ticket page will now show the reopen date next to the status when 'Waiting for Reply'.
  • [Mail/Peek] Fixed a bug where blank 'reopen' times on 'Waiting for Reply' tickets would not be saved.
  • [Platform] Fixed a bug in template modifier '|devblocks_prettytime' that displayed future timestamps in seconds as a negative number.
  • [Feed Reader] [CHD-2161] Feed List doesn't grab RSS feed if allow_url_fopen isn't enabled. Need a check to make sure it is enabled.
  • [Platform/RSS] Converted DevblocksPlatform::parseRss() to CURL from file_get_contents() so 'allow_url_fopen' is not required in the php.ini file.
  • [Platform/Plugins] Changed C4_AbstractView addColumnsHidden(), addParamsDefault(), addParamsRequired(), addParamsHidden() to support a second $replace parameter (which defaults to false). When true this will replace the params with the passed arguments, like addParams(). When this is false, it will add new params to the existing list -- although this can lead to strange behavior because parameters will accumulate through persistence and affect the list output.
  • [Snippets] [CHD-2171] You can now filter snippets by the 'plaintext' type.

New in Cerb 5.3.0 (Jan 18, 2011)

  • [Time Tracking/Web-API] [CHD-2089] The Web-API time tracking interface currently doesn't return the activity_id.
  • [Mail/Messages/Search] [CHD-2110] Ability to search content from Messages tab.
  • [Mail] [CHD-2003] The "When would you like to resume this conversation?" option is missing from the peek popup of tickets.
  • [Platform/Devblocks] Upgraded the Smarty template engine dependency from 3.0rc1 to 3.0rc4
  • [Platform/Devblocks] Upgraded jQuery dependency from 1.4.2 to 1.4.4
  • [Platform/Devblocks] Upgraded jQuery UI dependency from 1.8.2 to 1.8.7 (this should fix IE9 issues when not running in compatibility mode).
  • [Autocomplete/Contexts/UI] Added a context-aware 'autocomplete' service that can be used by any UI functionality.
  • [Choosers/Contexts] [CHD-2002] [CHD-2092] The 'chooser' widget now has the option to provide an autocomplete box before the button. You can enter a couple characters from your desired record (e.g. worker, address, org) to add it to the list, which saves a lot of needless clicks compared to opening the chooser search popup (especially when you already know what you're looking for).
  • [Choosers/Workers] All 'worker' choosers now provide an autocomplete box in addition to the search popup (e.g. owners).
  • [Choosers] All address, organization, and group choosers now provide an autocomplete box in addition to the search popup.
  • [Call Logging/Plugins] [CHD-806] Added a new 'Call Logging' plugin. This can be used to track incoming phone calls, associate them to registered contacts or organizations, and assign them to the appropriate worker for a return call. This plugin can also be used to capture outgoing calls for recording contact with opportunities across multiple channels (improving the efficiency and accountability of sales processes). Call records have all the functionality you've come to expect from Cerb: views, worklists, custom fields, peek, context links, comments, etc.
  • [Security] Implemented auto-escaping for all template variables. This ensures that any user-provided content will always be displayed as markup text instead of being rendered as HTML. This is superior to the previous solution of expecting official and third-party developers to explicitly use the 'escape' modifier in Smarty for every variable; e.g. {$var|escape}. If there are situations where your plugin functionality depends on rendering HTML from template variables, use the 'nofilter' flag; e.g. {$var nofilter}.
  • [Attachments/Contexts/Plugins/Platform] Refactored existing attachments functionality. Attachments can now be added to any context (e.g. messages, comments). Any plugin-provided objects can provide attachment functionality with very little implementation work. The same attachment can be linked to multiple records, which is more efficient in terms of storage. Browsing attachments from Setup will display links (filecontext). When an attachment has no links pointing to it, and its older than 24 hours, it will be removed by the maintenance scheduled task.
  • [Contexts/ACL] Contexts now have a formal way to specify access control for viewing particular objects. For example, the 'ticket' or 'opportunity' contexts can decide if a worker is allowed to view a particular record based on group memberships, etc.
  • [Choosers/Attachments] Added a new 'file' chooser which can be used to upload files through Ajax (without leaving the current page) even when displaying 'peek' popups.
  • [Comments/Attachments] Added attachment functionality to comments since they are already ubiquitous, which allows files to be attached to orgs/opps/etc.
  • [Attachments/Comments] [CHD-464] Allow attachments on comments
  • [Attachments/Address Book] [CHD-594] Allow attachments on organizations
  • [Bulk Update/Autocomplete] Added autocomplete choosers for the 'Owner' add/remove field on the appropriate bulk update popups.
  • [Address Book/Orgs/Owners] Owners can be assigned to Organization records.
  • [Mail/Display] [CHD-2108] When there are pending drafts on a ticket, a nasty error will be displayed (if display_errors is on)
  • [Address Book] [CHD-1767] Working with Contacts/Companies: Add notes to contacts and attachments to organizations.
  • [Worklists/Customize] [CHD-1267] When customizing a worklist you can now drag/drop columns to reorder them rather than having to clear and re-enter everything.
  • [Mail] [CHD-287] The ability to delete individual messages on a ticket.
  • [Time Tracking] [CHD-2078] Add 'status' to the bulk update popup for Time Tracking entries.
  • [Worklists/UI/Usability] [CHD-1048] Dates in worklist columns will now be displayed in full format (e.g. "5 months"), and dates in the past will be prefixed with a minus sign ("-") rather than the trailing word "ago" (e.g. "-90 days"). This consistency demonstrates how relative dates should be entered into date text boxes (i.e. "-5mo" doesn't work when entered as a relative date).
  • [Mail/Display] [CHD-1472] Show the 'From:' header in the reply box for spot checking.
  • [Tasks] [CHD-2042] Add a quick 'Completed' button to the task display page.
  • [Mail/Localization] The text in the ticket peek popup is now translated.
  • [Mail/Peek] [CHD-948] Add next/prev links to peek to navigate other messages within a previewed ticket.
  • [Search/Presets] [CHD-2056] Search presets should remember sort column and order (ascending/descending).
  • [Snippets/Custom Fields] [CHD-2046] Added custom fields to snippets for easier categorization.
  • [Reports] Updated jqPlot dependency to 0.9.7r635
  • [Platform/Snippets] Updated Twig dependency from 0.9.6 to 1.0-beta1
  • [Platform] Updated Smarty Template Engine dependency from 3.0-rc4 to 3.0.6-release.
  • [Platform/Maint] [CHD-2114] Orphaned extension properties are not being cleaned up from the database when deleting a plugin.
  • [Platform/Plugins] DevblocksPlatform::parseRss() will now properly use the 'updated' field as the pubDate when dealing with Atom feeds.
  • [Extras/Translations/i18n] The available language packs have been added to the /install/extras/translations/ directory (previously they were hidden in another GitHub repository).
  • [Feed Reader/Plugins] [CHD-805] Added a Feed Reader plugin capable of subscribing to RSS/Atom feeds and importing items. Items can be managed with all the familiar Cerb5 tools: custom fields, owners, worklists, presets, bulk update, peek, context links, comments, etc. This plugin can be used for various processes through RSS: vendor announcements, moderating corporate blog comments, scanning Twitter for keyword mentions, auditing wiki changes, reviewing new bug reports, reading new forum posts, scanning Google Blog search for keyword mentions, etc.
  • [Knowledgebase] [CHD-450] Allow attachments in knowledgebase articles.
  • [Workspaces] Workspaces are now a formal database object. Previously they were just unique 'tags' on worklists.
  • [Workspaces] You can now drag worklists around to reorder them when editing a workspace.
  • [Workspaces/Contexts/Plugins] Contexts are now used to add worklists to workspaces. You no longer need to create a workspace 'source' plugin.
  • [Workspaces] Workspaces are no longer confined to 'Home' -- they can now be added to the tab lists on any page: home, mail, activity, address book, datacenter, kb, preferences, setup, etc. This allows you to move your workspaces closer to the appropriate data. A single workspace can be displayed in multiple locations. To add a new workspace to your current page, click the '+' tab.
  • [Workspaces/Usability] You can now add multiple new worklists directly from an active workspace.
  • [Workspaces] [CHD-1866] You can now customize the order of workspace tabs.
  • [Mail/Messages/Workspaces] [CHD-2128] Add 'copy' to message worklists (e.g. for the ability to create a 'Sent' tab).
  • [Address Book/Workspaces] Added 'copy' to contact person worklists.
  • [Mail/Snippets/Workspaces] Added 'copy' to snippet worklists.
  • [Datacenter/Workspaces] Added 'copy' to domain worklists.
  • [Datacenter/Workspaces] Added 'copy' to server worklists.
  • [Knowledgebase/Workspaces] Added 'copy' to knowledgebase article worklists.
  • [Activity] [CHD-2118] Activity will now properly remember the previously selected tab when returning to the page, including plugin-provided tabs and workspaces.
  • [Home] Home will now properly remember the previously selected tab when returning to the page, including plugin-provided tabs and workspaces.
  • [Mail] Mail will now properly remember the previously selected tab when returning to the page, including plugin-provided tabs and workspaces.
  • [Address Book] Address Book will now properly remember the previously selected tab when returning to the page, including plugin-provided tabs and workspaces.
  • [Plugins/Address Book] Added the 'cerberusweb.contacts.tab' extension point for adding new tabs to the Address Book through plugins.
  • [Datacenter] Datacenter will now properly remember the previously selected tab when returning to the page, including plugin-provided tabs and workspaces.
  • [Knowledgebase] Knowledgebase will now properly remember the previously selected tab when returning to the page, including plugin-provided tabs and workspaces.
  • [My Account] My Account will now properly remember the previously selected tab when returning to the page, including plugin-provided tabs and workspaces.
  • [Setup] Setup will now properly remember the previously selected tab when returning to the page, including plugin-provided tabs and workspaces.
  • [Autocomplete/Usability] [CHD-2092] The autocomplete input boxes should automatically highlight the first option in the dropdown menu as you type so you can hit ENTER to quickly continue typing. This also makes it more clear that you can use the arrow keys for navigation (compared to hitting the down arrow key to start things off).
  • [Translations/Dutch] Updated the Dutch translation (Much thanks to Niek @ Oxilion.nl!)
  • [Explorer] Explore URLs now require the recipient to be logged in instead of giving vague errors. If not logged in, the worker will be forwarded to the URL after completing the login process.
  • [Feed Reader/Explorer] The peek popup for feed items can now be displayed while in 'explore' mode. This allows you to comment, change properties, and add owners while viewing external URLs (e.g. wiki, forums, issue tracking).
  • [Feed Reader/Explorer] Added a quick Close/Reopen button to the feed reader 'explore' toolbar.
  • [Worklists/Explore] Moved the 'Explore' button to a more obvious location, from the top-right of the blue bar to the view toolbar below the results. Added a 'play' icon which gives a better sense of the slideshow nature of Explore mode.
  • [Performance/Explore] Made improvements to the performance of Explore mode.
  • [Plugins/Contexts] Implemented Extension_DevblocksContext::getAll($as_instances=f alse) to make it easier to pull a list of possible contexts for various functionality. The method accepts one argument: whether or not to return the results as extension instances (true) or manifests (default/false).
  • [Setup/Settings] [CHD-1777] [CHD-2136] [CHD-2137] Fixed an issue where the default settings for 'Authorized IPs', 'Allow Attachments', and 'Max Attachment Size' were not being displayed when editing settings in Setup for the first time.
  • [CHD-2113] [Mail/Group] An auto-close response is always being sent if there is content even when the option is disabled for a Group.
  • [Setup/Support Center] [CHD-2140] All the new templates are now available for editing with the Custom Templates feature of the Support Center.
  • [Feed Reader] [CHD-1106] Managed feed URLs can now use the 'feed://' scheme.
  • [Choosers/Search/Usability] The worker and group choosers will now display an autocomplete box when used inside search filters (and worklist customize).
  • [Security/Custom Fields] [CHD-687] Ticket worklist 'customize' can display custom field values from non-authorized groups.
  • [Platform/Smarty/URLs] [CHD-2111] Improved the 'devblocks_hyperlinks' Smarty template modifier so that it doesn't include common trailing punctuation in the hyperlink (e.g. http://example.com/.). The new pattern matching should be less strict, as long as an http/https scheme prefixes the URL in plaintext.
  • [Mail/Messages/Search] [CHD-2139] An error is displayed if you search message content before you've indexed it with /cron/cron.search
  • [Plugins/Contexts/Notifications] [CHD-2145] Added Context_Notification
  • [Worklists/Usability] When using 'copy' on a worklist the page will no longer be redirected to a different location. This allows you to copy multiple worklists from the same page with less back-and-forth hassle.
  • [Plugins/Audit Log] [CHD-1419] Allow plugins to provide translation strings for audit log events.
  • [Address Book/Worklists/Explore] Implemented 'explore' mode for registered contact worklists.
  • [Datacenter/Worklists/Explore] Implemented 'explore' mode for server and domain worklists.
  • [Mail/Worklists/Explore] Implemented 'explore' mode for message worklists.
  • [Plugins/CRM/Opps] Added an extension point for creating new tabs on opportunity records.
  • [Drafts] [CHD-1865] Resuming a draft doesn't restore the 'To:' line if it was never edited from defaults.
  • [Mail/Usability] Added a keyboard shortcut (e) for 'explore' to Mail:Workflow and Mail:Search.
  • [Plugins/Events/Comments] [CHD-1999] Added a new event point for 'comment.create', to process events when new comments are created on any record.
  • [RSS Reader/Explore] [CHD-942] Allow tasks to be added while viewing feed items in explore mode.
  • [Feedback/Autocomplete] Added autocomplete 'address' entry to the feedback popup.
  • [RSS Reader/Feedback/Explore] [CHD-943] Allow feedback to be captured while viewing items in the RSS Reader plugin using explore mode.
  • [Mail/Workflow/Usability] [CHD-2065] "worker" and "status" should not be options in the Workflow subtotals sidebar.
  • [Mail/Workflow/Usability] When focused inside a group in Workflow, an "all groups" link will now appear to reset the filter in the sidebar without having to manually change the filters.
  • [Mail/Workflow/Usability] When clicking on a bucket in Workflow the subtotals sidebar will now focus on that group and all its buckets, rather than displaying just a single bucket. This will save a lot of extraneous clicks.
  • [Plugins/Comments] Added DAO_Comment::triggerCommentNotifications() to make it easier to fire context-driven notifications about new comments using the 'notify workers' pattern.
  • [Call Logging/Comments] Workers can now be notified when leaving new comments from call logging popups.
  • [Feed Reader/Comments] Workers can now be notified when leaving new comments from feed reader popups.
  • [CRM/Opportunities/Comments] Comments can now be added to existing opportunities from peek. Workers can now be notified when leaving new comments from peek popups.
  • [Tasks/Comments] Comments can now be added to existing tasks from peek. Workers can now be notified when leaving new comments from task popups.
  • [Time Tracking/Comments] Comments can be added to existing time slips from peek. Workers can be notified when leaving new comments from time tracking popups.
  • [Tickets/Comments] Comments can now be viewed and added to tickets from peek. Workers can now be notified when leaving new comments from ticket popups.
  • [Address Book/Organizations/Comments] Comments can now be viewed and added on organizations from peek. Workers can now be notified when leaving new comments from org popups.
  • [Home/Notifications/My Work] The 'home' page has been disbanded, as the recent improvements have made it unnecessary. 'Notifications' and 'My Work' have moved to the 'Preferences' page as a temporary placeholder until the addition of worker profiles in a future update. The workspaces previously shown on 'Home' can be moved to any other page -- any of which would likely be more appropriate.
  • [Comments/Notifications] [CHD-2103] The comment popup will no longer list the current worker as one of the defaults on the 'notify these workers' list. This saves the extra click of removing yourself each time you comment.

New in Cerb 5.2.1 (Dec 8, 2010)

  • [Gravatar] [CHD-2079] Warnings in SSL mode about unsecure images.
  • [Devblocks/Smarty] [CHD-2081] Smarty in IIS attempts to write cache filenames with the ':' template delimeter. We'll submit our patch to the Smarty team.
  • [OpenID] [CHD-2080] CURLOPT_FOLLOWLOCATION error when PHP is in safe_mode or using open_basedir
  • [Installer] [CHD-2086] Add autocomplete=off to Installer password form, too
  • [Address Book] [CHD-2084] Hid the 'Add' button on the Registered Contacts tab in the Address Book. Contacts can be added through the Support Center.
  • [Address Book] [CHD-2077] Hid the 'bulk update' button on Registered Contact worklists. This will be displayed against when it's fully implemented.
  • [Choosers] [CHD-2087] Clicking directly on the text in a chooser row will now properly mark/unmark the checkbox.
  • [Mail/Display] [CHD-2090] Using the 'o' shortcut to create comments from Display Ticket should no longer inject an 'o' into the comment textbox in browsers where this behavior was happening.
  • [Ticket/Audit Log] [CHD-2095] Added translatable text to the Audit Log for the O/R/W 'last action' values. These are 'Ticket opened', 'Recipient replied', and 'Worker replied' respectively.
  • [Platform] [CHD-2044] Converting HTML messages into plaintext will now properly handle and syntax from XHTML.
  • [UI/UX/Internet Explorer] Interface fixes for Internet Explorer 7/8/9. Added an IE-specific stylesheet for overrides.
  • [Datacenter] [CHD-2053] Adding a comment notification on servers or domains leads to a blank notification.

New in Cerb 5.2.0 (Nov 11, 2010)

  • [Datacenter] Added an optional 'Datacenter' plugin which provides the ability to manage 'server' objects as a special form of asset tracking. You can add custom fields to track business-specific information per server (datacenter, monthly cost, OS, hostname, etc). While this has some value alone, the real benefit comes from the plugins that can extend the server concept: service monitoring, website management, SaaS management, etc. This plugin adds a 'datacenter' option to the global navigation menu.
  • [Datacenter/Domains] Added an optional 'Datacenter: Domains' plugin which adds the ability to create website records and relate them to server objects. This plugin can be used to manage corporate sites and properties, or it can provide an easy way for webhosts and SaaS providers to manage deployed sites. Custom fields can be used to track any kind of information on these records. Multiple customer contacts can be associated with a single site. Broadcast can be used on any list of sites; for example: you can easily let a list of affected customers know about maintenance, or you can pitch upsell services to the right segments of your customer base. Broadcast has access to all the fields set on customers, sites, servers, etc. This plugin adds a 'Sites' tab to the Datacenter page, and it also provides a 'Sites' tab on each server display page. It also adds a display page for each site where you can associate links and add comments. This provides a good extension point for automation, and it also brings more information in that you may want to expose to the Support Center portal.
  • [SDK] Added an SDK to /install/extras/sdk. This includes full examples of most extension points in Cerb5 (e.g. tabs, pages, scheduled tasks, custom fields, etc) that you can copy into your new plugins as needed. There's also a template for plugin.xml and strings.xml which should make creating new plugins easier. You'll also find devblocks-dao.php, which automatically generates the DAO_*/Model_*/SearchFields_*/View_* classes for your plugins -- significantly reducing the development time for new ideas.
  • [Devblocks/Platform/OpenID] Added the LightOpenID library to Devblocks to simplify future OpenID integration.
  • [Datacenter/Sites/Domains] Renamed the Sites plugin and context to Domains to remove confusion with 'sites' also meaning 'locations'.
  • [Devblocks/Platform/OpenID] Removed LightOpenID and implemented DevblocksPlatform::getOpenIDService(), our own implementation.
  • [Support Center] Spun the Support Center off into its own plugin (cerberusweb.support_center) to make room for alternative community portals.
  • [Style/UI/UX] Added CSS styles for FIELDSET/LEGEND tags, which organize form content in a more aesthetically pleasing manner.
  • [Platform] Improved the OpenID consumer implementation in Devblocks: max redirects; detection of XRDS redirect to itself; multiple HTTP header blocks; provider delegation from custom domains; normalized URLs; AX/SREG attribute extension support.
  • [OpenID/Plugins] Added a new OpenID plugin that allows workers to associate OpenID identities with their account and then log in using them. OpenID is very interesting because it provides a viable challenge to the tired username/password authentication scheme for web applications; and instead you're able to choose from decentralized providers to maintain a single identity (and credentials) across multiple applications. OpenID Providers (OP) can use multiple factor authentication (infocards, biometrics, client certificates, phone-to-verify, one-time-password (OTP) devices, etc). As a bonus, if you have an account at several large companies (e.g. Google, Yahoo, AOL) then you already have an OpenID; however, more specialized providers offer more options -- (e.g. Verisign PIP, MyOpenID, etc).
  • [Update] Fixed a potential bug in the /update process where a patch can clear the flag that marks that the patcher is current.
  • [Preferences/UI/UX] Improved the look & feel of the My Account pages.
  • [UI/UX] Improved the look & feel throughout the interface.
  • [Login/Platform] Added a 'switcher' feature to the login form which allows each login extension to render a link (OpenID, LDAP, password, etc). The preference is saved in a long-term cookie.
  • [Style/UI/UX] Added 'input icons' to the Cerb5 stylesheet. These render a friendly icon inside text input boxes to give users a hint of the expected data. These can simply be added as classes: input_color, input_date, input_location, input_email, input_money, input_number, input_openid, input_password, input_percent, input_phone, input_search, input_tags, input_url.
  • [UI/UX/Bulk Update] Improved usability on all the bulk update popups.
  • [Platform/Views/Plugins] Views are now capable of providing a random sample of worklist rows to any functionality that requests it. This will allow for a lot of interesting functionality: A/B testing with Broadcast, distributed assignment of work, etc.
  • [Platform/SDK] Updated extras/sdk/devblocks-dao.php to generate View::getDataSample() and DAO::getSearchQueryComponents().
  • [Platform/Plugins] Converted all the 'file:' template paths to 'devblocks:example.plugin::' paths. This makes plugins templates a lot more flexible, and allows plugins to safely share templates when renderering each others content (especially from cerberusweb.core) without being concerned about the filesystem paths changing.
  • [UI/UX/Style] Improved the style for page submenus. Improved the knowledgebase article display page (no more IFRAME scrollbars when displaying articles), and the organization display page.
  • [Portals/Support Center] Improved the Community Portal 'index.php' proxy to parse headers before displaying content, and redirect properly in the event of a 'Location:' header. This allows various functionality for community portals -- like the OpenID authentication handshake.
  • [Support Center/Address Book] Added a Contact/Person context to the address book. A contact is an individual with a list of verified email addresses (and each address may be associated with a different organization). Contacts are now also the accounts linked to the Support Center, meaning that a single public login can now be associated with multiple email addresses; this removes the annoying requirement of a new account per email address. Addresses that have previously registered with the Support Center will be automatically migrated to a contact record with their existing password.
  • [Support Center/Security] Support Center account passwords are now properly 'salted' in the database.
  • [UI/UX/CSS] Improved the look and feel of the global navigation menu.
  • [Platform/Plugins/Custom Fields/Contexts] Refactored the custom fields functionality to use 'contexts' rather than 'custom field source' extensions. This makes it easier for any plugin-contributed objects to automatically benefit from custom field functionality. An update patch will migrate any existing custom fields + values to the new format.
  • [Address Book/Orgs] Removed the redundant 'Properties' tab from Org->Display since all the same fields can be modified through the 'edit' peek popup.
  • [Support Center] Improved the look & feel aesthetics of the Support Center. Modules navigation is now presented as tabs across the top of the page, rather than forcing use of the left sidebar 'main menu'. This removes the need for each module to provide an icon, and it allows the full width to be used by each extension. There is a new login page (also moved out of the sidebar) that can accommodate more interesting authentication processes like OpenID. The Ticket History search feature has moved into its sidebar so it's accessible from related functionality (e.g. display ticket, search results). Added a 'user_styles.css.tpl' template which allows easier CSS overrides without modifying a theme's stylesheet directly. Changed the 'Open Ticket' label to 'Contact us'.
  • [Support Center] Contacts may have multiple email addresses associated. The fields and custom fields of each address/org can now be modified from My Account.
  • [Support Center/Account] Added a sidebar to the 'My Account' module which partitions the various settings for better usability and extensibility.
  • [Support Center/OpenID] OpenID is now an available login extension for Support Center portals.
  • [Support Center] Account registration and recovery is now handled by the enabled login extension per portal. This provides much more flexibility when integrating Support Centers with user account data from another datastore -- such as billing, forums, LDAP, single signon, etc. Previously, registration was handled by its own module, which forced the email/password paradigm. Now a custom login extension could automatically create an SC account using external data, without end-user intervention. Account recovery (i.e. "forgot password") can now be handled appropriately depending on the authorization credentials; for example, the OpenID login extension doesn't involve account passwords at all, so account recovery involves changing the OpenID associated with the account. When user data is being pulled from a source like forums/wiki/billing, account recovery link can simply involve redirecting the user to the appropriate 'forgot password' URL for an external app.
  • [Platform/Confirmation] Added a reusable confirmation service that allows various functionality to generate a confirmation code that is later redeemed (such as verifying an email address during account registration or recovery). Arbitrary data can be stored along with the pending confirmation to be restored on redemption; for example, in the Support Center, confirmations include the contact's email address so it can be compared along with the code before continuing.
  • [OpenID/Contacts] Multiple OpenIDs can be associated to Contact Persons.
  • [Support Center/Account] Added the ability for contacts to delete their own Support Center account. This releases assigned email addresses and OpenIDs, making it easier to combine multiple fragmented accounts that were previously created for individual email addresses.
  • [Support Center/History] The open/closed ticket history in the Support Center has been combined into a single list. The last sender is now displayed as a column, and icons have been added to clarify 'waiting for reply', 'needs reply', and 'closed'.
  • [Support Center/History] The ticket history now displays conversations based on requesters rather than the initial sender -- so the same ticket may show up in the portal for each requester.
  • [Support Center] Implemented advanced view functionality: editable, required, default, and hidden filters. This makes it possible to expose user-level filters in the UI without security concerns. Using required filters you can sandbox a particular view; such as restricting a list of tickets to only rows where the logged in contact is a requester.
  • [Support Center] Added a reusable filters template for Support Center views. This functions the same as worklist filters in the worker GUI, allowing user-driven and comprehensive search functionality to be added to any list with minimal effort.
  • [Support Center/My Account] You can now use multiple advanced fiters to search ticket history, including: recipient, status, created, updated, mask, subject, and message content.
  • [Address Book/Contacts] Registered contacts can now be browsed from the address book. These are community members that have registered with one of your Community Portals like the Support Center. Displaying a registered contacts shows their verified addresses and entire ticket history. For each record you can leave comments or establish context links to other content.
  • [Platform] The 'pretty timestamps' provided by Devblocks will now show in months (3mo) or years (5yr) when the number of days gets high enough. Both measurements are approximate, but likely far more user-friendly than '500d' or '3857d' labels.
  • [Support Center] Each Support Center portal can now have multiple login extensions (e.g. password, OpenID, LDAP) enabled simultaneously. This allows savvy community members to use OpenID without replacing the email+password default option entirely. This also allows admins to disable logins, or force a particular login method (such as a private SSO provider).
  • [Support Center/History] Contacts can now choose from their list of verified email addresses when replying to tickets through the Support Center.
  • [Support Center/Contact] The 'contact us' form in the Support Center will now provide a dropdown of verified email addresses to use for 'From' when the visitor is logged in.
  • [Support Center/Sharing] [CHD-614] Support Center (SC) contacts can now share the email history for any of their verified addresses with other registered accounts. This allows companies to create a manager account in a vendor/provider's Support Center that can view the history for all linked addresses from individual team members. From 'My Account' in the SC you can show/hide addresses that are shared with you, and control you can see the history for each of your addresses. Hiding shared addresses will remove them from your history, but it won't remove the sharing link (i.e. you can always re-enable it). This has been a long-time requested feature in Cerb, but it was delayed while we thought about a solution that didn't require helpdesk workers to be responsible for verifying who should have manager access to customer data. The control of access to a contact's private data is best done by each contact themselves -- as this is much less susceptible to social engineering.

New in Cerb 5.1.2 (Oct 28, 2010)

  • [Update] Fixed a potential bug in the /update process where a patch can clear the flag that marks that the patcher is current.
  • [Comments] Fixed an issue where the auto_increment property wasn't properly added to (or was removed from) the 'comment' table, potentially resulting in comments that overwrote past comments.
  • [CHD-2063] [Workers/Chooser] Filtering by group does not work.
  • [CHD-2048] [Sessions/Licensing] The login process will now free the single most idle seat when trying to make room for a new login, rather than freeing all idle seats. This allows the remaining idle workers to continue their sessions without having to log in again, while always making just enough room for new workers to log in when there are idle seats.
  • [CHD-2069] [Security] Fixed a SQL error when /display/updateProperties was requested directly.
  • [Security] [CHD-2047] Views not properly sanitizing HTML input.
  • [CHD-2066] [Mail/Merge] Comments being discarded during ticket merge.
  • [CHD-2070] [Security] The /display/updateProperties action could be used for an escalation attack, giving non-privileged (non-group) members the ability to change ticket properties. Thanks to Oleg Gawriloff for reporting this.
  • [CHD-1982] [Setup/Plugins] The 'more info' links in 'Plugins & Features' pointed to the Cerb4 wiki. Each plugin now has a page on the Cerb5 wiki.

New in Cerb 5.1.1 (Sep 21, 2010)

  • [CHD-1978] [Presets] Add the ability to save over an existing preset
  • [CHD-2039] [Knowlegebase] Article content IFRAME too short. (Jeff@WGM: The IFRAME will now be the height of the current browser window, and it can be resized manually from the lower right corner)
  • [CHD-2022] During a fresh install, it prompts the user to perform an upgrade at the end.
  • [Application] Strings that displayed '5.x' (e.g. installer, patcher) will now show the current version.
  • [CHD-2040] [Time Tracking] When clicking the 'Track Time' button on an opportunity or ticket the organization of the requester will now be linked automatically. This helps better keep track of the time spent per org for reporting purposes, even when the actual time tracking entries are linked to particular content (and would otherwise have to be attributed retroactively to orgs prior to invoicing).
  • [Tasks/Owners] You can now add/remove owners using bulk update on task worklists.
  • [CRM/Opportunities/Owners] You can now add/remove owners using bulk update on opportunity worklists.
  • [Time Tracking/Owners] You can now add/remove owners using bulk update on time tracking worklists.
  • [Address Book/Broadcast] Fixed a bug where successfully sending a broadcast from the address book was dependent on permissions for broadcasting in CRM/Opportunities.
  • [Home/Notifications] Added 'bulk update' functionality to the 'Notifications' tab on Home. This allows a worker to quickly mark events as read across multiple pages; previously this required clicking through each page and hitting 'mark read'.
  • [Address Book/Owners] You can now add/remove owners using bulk update on organization worklists.

New in Cerb 5.1.0 (Aug 24, 2010)

  • [Context Links/Platform/Plugins] Devblocks now provides a Context Link service. This allows arbitrary links between any number of records (including plugin-provided). This is a convergence of related functionality and requests. Context Links are like static workspaces where you manually choose the relationships, opposed to dynamic workspaces that display ever-changing records that match specific filters. This is very useful on opportunities or tasks where you want to collect a list of references (tickets, orgs, addresses) by hand to refer back to through the course of your work. In the past tasks were limited to a single source (like a ticket) but they can now link to all the necessary information for completion. This is also useful for functionality like time tracking where a source isn't necessary at the beginning of tracking time, but an organization or individual could be added later for billing purposes. In the past it wasn't possible to edit the source on a time tracking entry once it started. In the future, context links may also replace the assignment of workers on content, since they inherently allow for multiple assignment and listing assigned work is as simple as looking at content linking to a specific worker. You wouldn't need to build a worklist for each type of content.
  • [Tasks] Refactored tasks to use Context Links rather than 'sources'. This means you can link any kind of record (including plugin-provided) to tasks (tickets, opportunities, addresses, workers, ...) like a private workspace per task. This also removes the limit of a single relationship per task.
  • [Platform/Plugins] Added a 'devblocks.refresh' jQuery event trigger to genericAjaxGet() and genericAjaxPost() containers. This observer pattern can be used by other interface elements to monitor when the contents of a DOM container change so another action may be taken (such as refreshing peripheral elements).
  • [Context Links/Plugins] Added a reusable Context Links tab to the internal controller. This allows any object to present and manage context links in a single line of code.
  • [UI/UX] Look & Feel improvements. The main page headings are now green to break up some of the blue 'monochromatism'. The table headings of worklists no longer have cell borders, excess padding, and the gray is a lighter shade. The gray of worklist lists are now consistent with the links in sidebars.
  • [Search/Presets/Plugins] Workers can now create their own search filter 'presets' per record type (e.g. tickets, tasks, addresses, etc) for reuse anywhere search functionality is provided. Presets can be saved or loaded from worklists, search tabs, choosers, etc. This should help with the inconvenience of complex search filters being overwritten by different browser tabs in the same session, or by various bits of functionality (e.g. quick search). While workspaces behave like saved searches, presets can be reused everywhere. For example, you may define a multi-checkbox custom field on workers for 'Schedule' with the days of the week, and create a worker preset for 'Weekend Shift' so you can narrow down your options when sending a notification or making an assignment. This functionality is also available to all custom record types provided by plugins.
  • [Platform/Plugins/Views] Removed View::getColumns() and View::getSearchFields(). These are being moved to the instance scope rather than the class scope, so individual views can control fields for their particular needs.
  • [Platform/Plugins/Views] A new 'columnsHidden' property has been added to views. This allows a view instance to hide particular fields from becoming columns in a worklist. This is generally helpful for hiding internal fields that would otherwise confuse users (such as foreign keys, hashes, etc).
  • [Platform/Plugins/Views] Added several new properties to views for per-instance control of parameters/filters. 'paramsDefault' provides a list of parameters that will be used any time a view is reset (e.g., only showing open tickets). 'paramsRequired' provides an immutable list of filters that won't be displayed in the GUI's filter editor (e.g., forcing a list to always display *onlya worker's own objects without giving them the option to remove the filter). 'paramsHidden' provides a list of fields that may not be used in the GUI's filter editor, but this does not affect parameters that may be used procedurally (e.g., hiding an 'assigned worker' property when display a list of 'my work').
  • [Views/Worklists/Platform] Search functionality has moved above worklists rather than being located in the sidebar; which allows views to span the entire width of the screen and making room for additional columns. All the search filter widgets for all views are now controlled by the same code. Adding or removing search filters on 'Search' tabs no longer requires a page reload; the same dynamic functionality from workspaces is now used.
  • [Mail/Snippets] Added search+presets functionality to the Snippets tab.
  • [Mail/Drafts/Queue] Added search+presets functionality to Mail->Drafts and 'Setup->Mail Queue'.
  • [Worker Notifications] Added search+presets functionality to 'Home->Notifications'.
  • [Platform/Plugins] Removed public access to $view->params and replaced it with OOP interfaces: $view->getParams(), $view->getEditableParams(), $view->addParam(), $view->addParams(), $view->removeParam(), $view->removeAllParams()
  • [Address Book] When clicking on the open/closed links from an address peek, the page is now redirected to a reusable URL, e.g.: "/cerb5/contacts/findTickets?email=jeff@localhost&closed=0". This also allows you to open those links into new browser tabs, or integrate with third-party apps and scripts that want to search for open tickets from address book contacts by opening a Cerb5 shortcut link (pulling that info *intoanother app is better done with the Web-API).
  • [Address Book/Autocomplete] [CHD-1941] Improved the performance and relevance of e-mail address autocompletion. Added prefix indexes to first + last names to speed up partial lookups. If an autocomplete query contains an '@' then names will be ignored and only the e-mail address will be checked. If the query contains a space, then the first and last names will be concatenated and compared (but not email). If neither case is true (no @ or space) then the query will be compared against email address, first name, or last name; but without first+last concatenation. This conditional logic should give better contextual results, as well as finding results quicker.
  • [Watchers] Removed the ticket 'assigned' and 'comment' events from Watchers so they can be better handled by the improved Notification functionality. This simplifies Watcher functionality by exclusively 'watching' incoming/outgoing email, rather than adding confusion by merging watchers with other arbitrary events.
  • [Platform/Plugins/Events] Changed the event for 'ticket.merge' to 'ticket.action.merge'. This namespace grouping will be useful when listeners can use wildcards (e.g. 'ticket.action.*').
  • [Platform/Plugins/Events] Removed the inefficient 'ticket.property.pre_change' and 'ticket.property.post_change' events in DAO_Ticket::update(). The new event is 'dao.ticket.update', which sends the post-change ticket model to listeners along with a list of changed in from/to format (allowing a listener to see the previous value for a property, simplifying events, and eliminating redundancy). DAO_Ticket::update() will now also ensure that a field being updated changes the current value, or the field will be ignored (and no change event will be triggered). This removes the need for redundant pre/post checking in listeners: assignments, moves, etc. DAO_Ticket::update() will also run updates+events in batches (currently of 25) if a larger number of IDs are passed to it.
  • [Platform/Plugins/Events] Added new higher-level events for 'ticket.action.assigned', 'ticket.action.closed' and 'ticket.action.moved'. These events are guaranteed to only be triggered when the result is different than the current state of a ticket (i.e. when a ticket is assigned to anybody *butits current owner, or a ticket is moved anywhere *butits current location; even if you attempt to repeat the same actions consecutively).
  • [Mail/Performance] The functionality related to 'auto-close replies', 'ticket assignment notifications', and 'inbox filters' have been made much more efficient by improving the event system in the platform. Additionally, fewer redundant database lookups are used in nested events, which is especially beneficial when applying actions to a large worklist.
  • [Platform/Performance] The 'global' event listener for built-in Cerb5 workflow (e.g. assignment notifications, inbox filters) now specifies the exact events it's observing, which means it is invoked far less often (i.e. it doesn't bother to run when plugins trigger events it couldn't possibly be aware of).
  • [Platform] Updated jQueryUI from 1.8rc3 to 1.8.2
  • [CHD-1943] [Platform] Fix CSS to allow the autocomplete menu in peeks to be taller than the floating window.
  • [CHD-1327] [Platform] Add Ajax loading indicators (aka "spinners")

New in Cerb 5.0.1 (Jul 5, 2010)

  • [CHD-1890] [Translations] Smarty 'capitalize' modifier considers umlauts to be word breaks.
  • [CHD-1900] [Parser] Disallow CR/LF in subject lines
  • [CHD-1905] [My Account] Always use 'read all' mode not working.
  • [CHD-1909] [Mail/Reply] When replying to a ticket, wait for confirmation about the final save of the draft before submitting the FORM.
  • [Mail/Reply] [CHD-1899] After replying to a ticket, the browser URL will now re-display the full path to the ticket (/cerb5/display/ABC-12345-678). This is slightly less efficient but far more convenient.
  • [Reports] [CHD-1908] The report graphs do not render in Internet Explorer.
  • [Reports] The Worker Average Response Time report will now filter out data from deactivated workers.
  • [Notes] Fixed the lack of a margin at the top of Opp/Org/Task notes.
  • [Windows/Platform/Support Center] [CHD-1912] A colon (:) is not valid in Windows filenames, but it's being used in the SC templates with "devblocks:" resources defining a ":portal_xxxxxx". This has been fixed by changing the template syntax to "devblocks:plugin_id:portal_xxxxxx:/path/to/plugin/template". You *MUST* update any custom templates to use this format if defined in Setup->Community Portals.
  • [Worklist] [CHD-1913] Columns, rows per page, and "sort by" preferences not saved between sessions.
  • [CRM/Opportunities] [CHD-1915] When doing a Bulk Update on an Opps list with pre-selected items, selecting 'Whole List' still only affects only the checked items.
  • [Knowledgebase] [CHD-1914] Editing changes from the regular interface (not peek) sends you to a non-index.php URL.
  • [Mail/Parser] [CHD-1918] The parser is not pulling filenames from the 'content-disposition' header when attachments don't provide a 'content-name' or 'content-filename'.
  • [CHD-1924] [Scheduler/Maintenance] Call to a member function delete() on a non-object in message.php on line 515.
  • [CHD-1923] [Mail/Merge] Merging tickets by masks from Display Ticket works, but using an 'ID' does not.
  • [CHD-1931] [Mail/Compose] Auto-response is being queued without requesters or a subject when closed immediately.
  • [CHD-1930] [Address Book] Editing an address via peek throws error in Internet Explorer.
  • [CHD-1932] [Mail/Drafts] [Chrome/Firefox] jquery.combined.min.js goes unresponsive after a few seconds.
  • [CHD-1940] [Mail/Display] Fixed a potential bug where a worker would be taken to an invalid '/display' URL after replying to a ticket. This appears to happen if there's no mask available for a ticket. In these situations the ticket's internal ID will be used instead.
  • [CHD-1891] [CRM/Opps] Link '# nonspam' and '# spam' address fields to the opportunity worklists
  • [CHD-1895] [CRM/Opps] Link the 'First Name' and 'Last Name' address fields to opportunities for worklists
  • [CHD-1893] [CRM/Opps] Remember the selected tab for next/prev navigation through opportunities
  • [Broadcast] [CHD-1907] When sending a broadcast from Address or Opportunity worklists you can now choose to mark the created tickets as Open, Waiting for Reply, or Closed. This saves a lot of busy work from 5.0.0 when a large broadcast would open tickets that required you to sort them.
  • [CRM/Opportunities/Mail] The 'Opportunities' tab on Display Ticket will now show the opportunities for all the requesters on the ticket, rather than being locked to only the initial sender. For mail originating to people from the helpdesk, the initial sender was the helpdesk itself -- rendering the Opportunities tab quite useless.
  • [Mail/Display] Made it more obvious that the 'Recipient History' tab shows the mail from all recipients by default, rather than just the initial sender.
  • [Address Book] Added the ability to create parentchild relationships between organizations in the address book. (Sponsored by Chris Haslage of Abacast, Inc.; Implemented by Jeff Standen and Scott Luther of WebGroup Media, LLC.)
  • [CHD-1926] [Mail/Parser/Privacy] Third-parties who reply to a ticket using the mask should not be automatically added as requesters.
  • [Mail/Display/Privacy] If a customer reply on a ticket is not from a recipient, an 'Add to Recipients' button will appear before the normal 'Reply' button for that message. This provides better privacy control if a ticket mask has been posted publicly and a third-party sends in a reply with the mask on the subject line.
  • [CHD-1944] [Mail/Reply] Changing the subject line during a reply doesn't always update the ticket's subject automatically.
  • [CHD-1945] Mail Routing fails criteria check when multiple To/Cc addresses match for an incoming message.
  • [Mail/Merge] Fixed a bug that didn't unassign requesters from tickets that were merged into another ticket.
  • [Setup/Attachments] Fixed a bug in 'Setup->Attachments' bulk update that would always treat the deleted action as true.
  • [CHD-1915] When doing a bulk update on various worklists, selecting the 'Whole List' option still only affects only the checked rows if there are any selected.
  • [Addy Book/Orgs] Removed 'parent' organizations due to duplication of future functionality ('Context Links' in 5.1).
  • [CHD-1949] [Support Center/Localization] Translation strings "Additional Information" and "Message" missing for community portal.
  • [CHD-1952] [Web-API] PHP error when parsing a mimepart message that includes attachments.
  • [Web-API/Knowledgebase] Implemented Knowledgebase POST/create.xml and PUT/id.xml in the Web-API. You can also delta set categories with the 'category_id[]' property and an ID prefix of '+' for add or '-' for delete. The default is add if no prefix is provided with the ID.
  • [CHD-1764] [Addresses/Chrome] Hitting the ENTER key from a 'peek' will throw you to a white page in Chrome.
  • [Address Book] The address 'peek' dialog will now properly validate the form details (the e-mail address is required and must be valid).
  • [CHD-1953] [Web-API] Added '__version' and '__build' meta properties to all API responses so external applications can identify the version they're talking to.

New in Cerb 5.0.0 (May 20, 2010)

  • [Platform] Fixed an issue with login redirection to '/welcome' when the tour is enabled and a specific page wasn't bookmarked.
  • [Platform] Relocated the '/styles' root directory into the 'cerberusweb.core' plugin.
  • [Platform] Relocated the 'tour' code into the 'internal' controller and removed the root-level '/templates' folder.
  • [Platform/Web-API] Fixed some 'assign by reference' warnings due to use of deprecated '=&' operator.
  • [Platform] Devblocks2/Smarty3 refactor
  • [Support Center] Each portal can now have its own custom version of all the templates used to display the Support Center. The biggest limitation of the Support Center before Cerb5 was that the templates were shared between all instances, and tweaking HTML fragments for header/footer/CSS didn't provide enough flexibility. In Cerb5, each portal can overload the templates and change them entirely. Anything not overloaded is shared from the disk as usual. Templates are grouped into 'sets' (such as 'Support Center' or 'System E-mail Templates'). Templates have browser-editing enabled through their plugin.xml manifest.
  • [Community Portals] Community Portals are now managed using a worklist view, and configured using a display page with tabs. This makes it much easier to manage portals.
  • [Community Portals] You can now add custom fields to community portals. Combined with the new portal worklist this allows you infinite flexibility on how you manage your portals. For example, you can add a custom field for 'region' (Americas/Europe/Asia/etc) to group your portals based on their intended market.
  • [Support Center] Any previous configuration information for header, footer, style, and 'home' content will be migrated into custom templates per portal automatically.
  • [Community Portals] The concept of 'Communities' has been removed from portals. Any communities you had defined will be automatically migrated to a portal custom field. If you no longer find the community grouping useful you can simply delete the custom field and choose other grouping characteristics.
  • [Support Center] When defining custom templates for the Support Center portals, you can now customize the colors of the CAPTCHA image by adding 'color' and 'bgcolor' query arguments to the '/captcha' URL. The format of the values is 8-bit RGB where each color is provided as a number between 0 (0%) and 255 (100%); for example: /captcha?color=250,50,50&bgcolor=10,10,100
  • [Support Center] The default templates for the Support Center now provide alternating row colors in lists, and a style for the highlighted row that the mouse is currently over.
  • [Community Portal] You can now import and export arbitrary sets of custom templates for community portals. This enables the community to design and share countless Support Center remixes. It also opens up a new market for community-sourced customization services.
  • YUI->jQuery Tabs
  • YUI Panel->jQuery Dialog
  • YUI Connect->jQuery Ajax
  • YUI Autocomplete->jQuery+Autocomplete
  • YUI.Chart->jQuery+Flot
  • YUI.Calendar->jQuery DatePicker
  • LiveValidation->jQuery+Validation
  • Removed YUI dependency
  • Refactored most genericAjaxPanel calls since jQuery now parses blocks in Ajax content. We no longer have to handle this on the client in every link.
  • [Platform] Switched from Devblocks implementation of 'toggleClass' to jQuery.
  • [Platform] Switched from Devblocks implementation of 'clearDiv' to jQuery.
  • [Platform] Switched from Devblocks implementation of 'radioValue' to jQuery.
  • [Platform/Performance] Combined the jQuery scripts into a single minified include. Also combined cerberus.js and display.js to reduce the number of HTTP requests required with an empty cache.
  • [Platform] Removed image resources that were no longer referenced anywhere in the project.
  • [Platform] Condensed several infrequently used icons to use the same artwork. This saves HTTP requests, but it also provides a more consistent interface.
  • [Platform] Converted the most popular icons to CSS sprites to remove many needless concurrent HTTP requests. This should help the most w/ empty cache page views and in high traffic environments (including On-Demand).
  • [Platform] Refactored out the archaic use of 'spacer.gif'
  • [Platform] Removed unused resources and styles from the CSS
  • [Platform] Simplified the worklist CSS so much less markup is needed to make consistent looking lists.
  • [Platform] Refactored out 'DEMO_MODE' since it wasn't being used and was implemented inconsistently.
  • [Platform] Implemented 'DEVELOPMENT_MODE' to assist with development vs production use (compile_check Smarty3 templates, debug output, logger, non-combined + non-minified styles + scripts, etc).
  • [Platform] Phased out Zend Framework as a Devblocks dependency. Devblocks now provides its own efficient implementation of caching, logging, and RSS/Atom/RDF feed parsing (DevblocksPlatform::parseRss). The ~2MB of files associated with Zend Framework has been deleted (which helps reduce download size, compile times, memory use, and wasted caches in APC+XCache).
  • [Platform/Performance] Removed the dependency on ADODB and migrated all database interaction to Devblocks2. This reduces the number of open files, reduces memory, and improves compile times. We didn't need a multi-platofrm abstraction layer since our MySQL support is exclusive, and the wrappers around the native MySQL drivers had a performance hit.
  • [Platform] All database scripts have been migrated to MySQL-compatible SQL and all references to ADODB's DataDict have been phased out.
  • [Platform/Performance] Peak memory usage has been reduced by proper usage of mysql_free_result().
  • [Platform] Refactored out the deprecated 'db_type' param of DevblocksSearchCriteria() since it was only used in 2 out of a thousand use cases. Blobs no longer need special handling with ADODB removed.
  • [API] Consistency: Model_*, View_*
  • [Database] Converted all BLOB-based fields to TEXT-based fields (character encoding)
  • [Platform] Split the major DAO/Model objects into their own files to reduce file size and memory usage (which is especially helpful in production environments that don't utilize opcachers like APC/XCache/etc).
  • [Scheduler/Maint] Fixed a bug in the 'watcher_mail_filter' maintenance task; it was using an older table name when clearing orphaned data for previously deleted workers.
  • [Platform] Moved the 'Fetch & Retrieve' plugin out of the core project and into the external plugins repository. This functionality was deprecated by the 'Google Custom Search Engine' approach.
  • [Support Center] Added a 'renderSidebar' method to Support Center page extensions. This provides a context-sensitive hook for rendering sidebar context appropriate for the current request. For example, when browsing the public knowledgebase the sidebar could show a 'search' box on every page. When displaying a knowledebase article, the sidebar could additionally display a list of related articles. This reduces the redundancy of needing to certain content (like a search box) on every page of content, which allows for a cleaner UI/UX.
  • [Support Center/Knowledgebase] When displaying Knowledebase pages in the Support Center, the sidebar will now always provide a 'search' box. This allows your users to search from every KB page, when previously certain pages (such as displaying an article) required navigating back before searching again.
  • [Support Center/Knowledgebase] Improved the display of the 'breadcrumb' categories on articles. Only entirely unique categories are displayed now. For example, if an article is filed under: Cerb5, Cerb5->FAQ, and Cerb5->FAQ->Customization, then only Cerb5-FAQ->Customization will be listed as a breadcrumb trail because all three categories can be accessed from that path's links.
  • [Support Center] The ability to customize the colors of the CAPTCHA is now made more obvious by the default templates using the "?color=r,g,b&bgcolor=r,g,b" arguments in the captcha URL. This should help template creators create a consistent style for the entire Support Center UI.
  • [Platform] Implemented 'DevblocksPlatform::getStorageService()', which provides an abstract platform service for managing long-term data storage. Initally, 'disk' and 'database' options are available, providing more flexibility (some like to store heavy content on the disk since incremental backups are easier with rsync; while others like to store heavy content in the database to simplify running a cluster setup). In the near future we'll be providing additional options, such as FTP and S3. This approach provides a way to keep the local database thinner, which minimizes table locks on backups and snapshots. There is little reason to keep large immutable objects in the database.
  • [Storage] Migrated Cerb5 'attachments' to the new Devblocks storage engine, using 'disk' as a backwards-compatible default. The ability now exists to move attachments to the database in environments where this makes sense. In a near-future commit, we're planning to provide the ability to configure storage rules; for example, the ability to archive attachments for closed tickets in S3 while keeping content for open tickets in the local database.
  • [Storage] Message bodies (DAO_MessageContent) are now stored inside the Devblocks storage service. By default, the service continues to use 'database' as the storage mechanism since the existing Cerb4 content is already there (but the schema has changed and will be migrated by a database patch). The ability now exists to store message bodies in the local filesystem, since they're large blocks of immutable content. Having them as files makes incremental backups much easier (and reduces database bloat).
  • [API] DAO_Ticket::getMessage() -> DAO_Message::get()
  • [API] DAO_Ticket::getMessagesByTicket() -> DAO_Message::getMessagesByTicket()
  • [Platform] Removed the 'FULLTEXT' index from DAO_MessageContent (message_content.content). Since message content now uses the Devblocks storage service (and content can be distributed across multiple storage engines) it no longer made sense to use the fulltext indexes on the database table. We'll be implementing more advanced search solutions for Cerb5+Devblocks2.
  • [Knowledgebase] Removed the 'FULLTEXT' index from DAO_KbArticle (kb_article.title + kb_article.content). It will currently fall back to SQL 'LIKE' searches. We'll be implementing more advanced search solutions for Cerb5+Devblocks2.
  • [Scheduler] Implemented a 'Storage Manager' scheduled task. It is responsible for moving content between storage engines depending on your preferences. If you have all attachments stored in the database and decide to migrate them elsewhere (disk, S3, etc) then the storage manager will break the work up between crons and handle it for you over time (without bogging the system down). If you want content to move faster you can explicitly run the storage task from 'Setup->Scheduler' and add '&reload=1' to the URL.
  • [Platform] Refactored the way that Devblocks handles extension parameters. A DAO_DevblocksExtensionPropertyStore class has been added to manage the loading and setting extension properties. It also provides an extension registry-wide cache for performance. As a consequence, it's now possible to statically save and load properties for an extension (i.e. without needing to instance it first).
  • [Platform] Implemented storage engines (for the storage service) as extensions. Devblocks provides three storage engine extensions by default: filesystem, database, and Amazon S3. Plugins can contribute additional storage engines (e.g. SFTP, other cloud storage services, MogileFS, etc).
  • [Platform] Implemented 'storage profiles', which allow user-defined instances of storage engines combined with their configuration parameters (for example, authentication details for Amazon S3). This is all managed by Devblocks, including a simple way to prompt for, and save, profile configuration information.
  • [Platform] Implemented 'storage schema' extensions to inform the storage service how to handle specific types of content. Schemas take care of updating storage manifest information (extension, profile, size, key) using the appropriate DAO class; which simplifies storing and retrieving content from various locations in the code base. Storage schemas should implement a class in the Storage_* namespace, using the appropriate abstract extension class, to provide static ::get(), ::put(), and ::delete() methods. This allows single-line, abstract management of content (such as saving or loading attachments or message bodies).
  • [Platform] DevblocksPlatform::getStorageService() has been refactored to take advantage of polymorphism; you can pass an extension_id, profile_id, or Model_DevblocksStorageProfile as the first argument depending on the context you're working with. This also means that a storage engine, such as disk or database, can still be requested by extension_id to sidestep storage profiles (which is useful for failsafes).
  • [Platform] A _DevblocksDatabaseManager::getConnection() method has been added to return the existing MySQL connection resource pointer for reuse. This allows arbitrary mysql_* PHP commands to be used when necessary.
  • [Platform] Devblocks itself is now a Devblocks plugin, which is able to provide extensions, events, and other manifest information in the libs/devblocks/plugin.xml file. This plugin is always enabled, but should be hidden from plugin configuration by the application layer.
  • [Platform] Added a lightweight Amazon S3 library.
  • [Platform] Added a '|devblocks_prettybytes' modifier to templates that will format a number of bytes as bytes, KB, MB, GB; to a specified number of decimal places.
  • [Storage] Added a 'Storage' tab to 'Helpdesk Setup' as a place to manage Storage Profiles and Storage Schemas.
  • [Storage] cron.storage now manages archiving + unarchiving content based on 'Helpdesk Setup->Storage' preferences.
  • [Platform] Implemented a connection cache for the storage service. If you request a storage engine with the same extension_id and parameters, then you'll receive the pre-existing instance. This is obviously a very good thing if you need to hold open a connection to a storage resource (like a database), but it's also handy to not do a lot of repetitive setup/teardown in a non-persistent storage engine (like S3) that needs to verify permissions and paths.
  • [Performance] Fixed an inefficiency where content was requested twice (once in the controller and once in the template) per message on the /display page.
  • [Platform] Added DevblocksPlatform::getTempFile() to create temporary files and automatically clean them up after the request runs.
  • [Platform] Added DevblocksPlatform::getTempFileInfo() to give information about a previously created temporary file (when it matters).
  • [Platform] Registered a PHP 'shutdown' function for Devblocks so the platform has a chance to take action when the script has finished (including after 'exit' and 'die').
  • [Platform] Storage engines now accept an optional file handle ($fp) parameter for ::get() calls. This allows you to efficiently stream content into a file rather than loading it all into a string, which uses far less memory.
  • [Platform] Storage engines now allow a polymorphic $data parameter for ::put() calls. This allows you to efficiently stream content from a file rather than passing it as a string, which uses far less memory. This is especially useful for handling files provided by HTML forms, since you'll always have the content in a temporary file on the disk already, and you can simply stream that in small chunks to the proper storage engine.
  • [Platform] Implemented the new Devblocks storage engine streaming functionality in the disk, database, and S3 drivers.
  • [Storage] The archive/unarchive process will now use file pointer streams when content is larger than 1MB and in-memory strings when smaller. This should allow for a far greater balance between performance and memory efficiency.
  • [Platform] Upgraded jQuery to 1.4.2
  • [Platform] Upgraded jQuery UI to 1.8rc3
  • [Platform] Upgraded jQuery Validation plugin to 1.7
  • [Platform] Migrated from jQuery Autocomplete plugin to jQuery UI Autocomplete.
  • [Platform] Improved look & feel on tabs. The selected tab is now white and the inactive tabs are now light blue. The selected tab also has an open border on the bottom which makes it much more obvious when selected.
  • [Knowledgebase] Removed the jQuery 'Rich Text Editor' (RTE) plugin from the knowledgebase since it had problems with jQuery 1.4.2; and the last release is 2 years old. We'll find a more actively supported solution (or build one).
  • [Autocomplete] The e-mail autocomplete functionality will now ignore 'banned' senders, and it will sort matches in 'num_nonspam' order; meaning the contacts you talk to the most will be returned as the most likely matches.
  • [Platform] Moved the JS+CSS sources for jQuery+UI into Devblocks. Apps can request them through the resource proxy from 'devblocks.core'.
  • [Platform] Implemented DevblocksPlatform::getSearchService() to provide full text indexing for any data source or plugin. The implementation will create 'fulltext_*' tables in the local database for content which may be otherwise distributed. The content is preprocessed before indexing by stripping punctuation and removing common (uninteresting) words. Queries run against the index are also preprocessed by the same rules. This provides far more reliable searching when looking for information like phone numbers that may be entered in multiple formats.
  • [Platform] Added a 'scope' parameter to OPER_FULLTEXT search criteria. You can now require 'all' words, 'any' words, provide a 'phrase', or 'expert' mode. These modes will automatically rewrite a query to use the appropriate MySQL FULLTEXT query syntax, instead of assuming all users will learn or understand the intricacies of search syntax.
  • [Platform] Added DevblocksORMHelper::_getWhereSQL() as a utility for generating where, sort, and limit clauses to DAO_*::getWhere(). Previously this functionality didn't provide sorting or limiting.
  • [Platform] Added the ability to clear a single cache using DevblocksPlatform::clearCache($cache_id).
  • [DAO] DAO_Message::getWhere() now has parameters for sorting and limiting results, as well as providing arbitrary 'where' clauses.
  • [DAO] DAO_KbArticle::getWhere() now has parameters for sorting and limiting results, as well as providing arbitrary 'where' clauses.
  • [Search/DAO/Mail] Added improved support for fulltext searching 'message content' back to DAO_Ticket::search() and the 'Mail->Search' tab. This should be much more efficient than the Cerb4 implementation, but will require a complete reindex of searchable content (automatically handled by the scheduler).
  • [Platform] DevblocksORMHelper::_getWhere() (and subsequently, most DAO_*::getWhere() calls) can now accept arrays for the sortBy and sortAsc parameters. This allows sorting results by more than one column without writing direct SQL statements.
  • [Platform] Minor performance improvements (cached the ACL-filtered extension list of a worker for the duration of the request, which makes 90% fewer calls to DevblocksExtensionDelegate; removed strcasecmp() calls in the Extension Registry since extension points are case-sensitive).
  • [Scheduler/Search] Added a new 'Search Indexer' scheduled task to 'Setup->Scheduler'. This manages asynchronous search indexing of arbitrary content. Plugins can register with the search indexer to have their content crawled.
  • [Search/Platform] Added 'Search Schemas', which are implemented by plugins to inform the Search Indexer how to batch index their arbitrary content. Currently used by 'message content' and 'kb articles'.
  • [Performance] Minor performance improvement to C4_DevblocksExtensionDelegate to cache the active worker reduce needless calls to getSessionService/getActiveWorker when comparing ACL privileges.
  • [Anti-Spam] Updated the 'stop words' list used by our Bayes anti-spam algorithm.
  • [Mail/Search] Added two new options to Quick Search: 'Messages (all words)' and 'Messages (phrase)'. These use the new full text search system for much better relevancy than in Cerb4.
  • [Knowledgebase/Search] Added two new options to the KB quick search: 'Articles (all words)' and 'Articles (phrase)'. These should both provide far more relevant results than the Cerb4 implementation.
  • [Knowledgebase/Search] Knowledgebase articles are now fulltext searchable by both title and content.
  • [Knowledgebase/Search] You can now fulltext search knowledgebase articles from 'Research->Knowledgebase->Search'. This provides the new fulltext flexibility for matching: all words, any words, phrase, expert.
  • [Knowledgebase/Display Ticket] Added the ability to search knowledgebase articles during a ticket reply using the new fulltext flexibility: all words, any words, phrase, expert.
  • [Support Center/Knowledgebase] Added the ability to search the Knowledgebase from the Support Center using 'all words', 'any words', or 'phrase'.
  • [CHD-1776] Subject as shown at top of display page needs input sanitized (Reported by Quintin Russ; Patch by Scott@WGM)
  • [CHD-1764] [Addresses] Hitting the 'enter' key when a field is focused will throw you to a white page (Patch by Scott@WGM)
  • [Display Ticket] [CHD-1343] Change "Full Headers" label when appropriate (original patch by Robert Middleswarth; adapted by Jeff@WGM)
  • [Performance] CerberusVisit will now return the current worker using the cache rather than storing the entire worker in the session. Storing the worker in the session prevented us from comparing fields like 'last_activity_date', because they were frozen at the login time.
  • [Performance] DAO_Worker::logActivity() will only write once per 30 seconds per worker. This should reduce noisy and unnecessary SQL traffic.
  • [Sessions/Performance] The session system will only write session data to the DB if it changed (by comparing to the session read on open).
  • [Sessions/Performance] Session writes will always try to UPDATE and then INSERT on fail, rather than SELECT and making a decision. One fewer query per request.
  • [CHD-1154] [Who's Online] For better tracking of worker status, show the IP address and time of last activity.
  • [Platform] Refactored DevblocksPlatform::getTemplateBuilder() to use Twig rather than Smarty since it's much more secure when allowing end-users to create their own templates.
  • [Signatures/Templates] New template syntax allows conditional logic (if/else) and loops (for) using the Twig template language (http://www.twig-project.org/). We went with Twig over Smarty for this functionality because it has an emphasis on being secure and providing sandboxes for templates; which means we can safely allow worker-provided and user-provided templates. With Smarty, too much information was available to the template scope.
  • [Signatures/Templates] You can now use all worker custom fields as tokens in signatures.
  • [Signatures/Templates] Signature templates can also access the literal value of custom fields with the 'worker_custom.*' variable namespace. For example {{worker_custom.10}} would return the variable of worker custom field #10 rather than a string. If this was a multiple-selection field, you could use template logic on the array like "{% if 'value' in worker_custom.10 %}".
  • [Templates/Signatures] Implemented 'cerberusweb.snippet.token' extensions for providing custom tokens on any template. A single token can bind itself to multiple template types (signatures, email, autoreply, etc); and the proper interface will be invoked to generate a token value based on the context + scope. For example, you may create a new template token called {{ad_rotator}} that will rotate between special offers to display in the signatures of your outgoing mail. You could also create a token to display an estimated wait time in autoreplies based on the Group workload of the incoming message (and/or the number of active workers, etc).
  • [Platform] Devblocks will now give precedence to 'c' (controller) and 'a' (action) parameters in the $_GET scope over the $_POST scope, but both will be checked. This is to allow genericAjaxPost() on HTML forms to override the destination in an Ajax post, even though the form contains a controller+action in hidden fields.
  • [Platform] CerberusMail::sendTicketMessage() will now return a boolean result. This allows richer functionality to handle failed messages (SMTP server down, etc).
  • [Mail/Display] Comments in the ticket conversation are now deleted with an Ajax request, and no longer force a page reload or the selection of the 'Comments' tab.
  • [Drafts] [CHD-329] Implemented e-mail 'drafts' functionality. You can now save compose or reply messages as drafts instead of sending them, and resume them later. Drafts auto-save every 30 seconds on compose or while replying to a ticket. There is a new tab in 'Mail->Drafts' to show workers their pending drafts. On the reply form there is now a 'Continue Later' button that will save the message as a draft and return to the ticket conversation. Reply drafts are shown in the ticket conversation (along with replies, comments, and notes); and they can be resumed or discarded by their owners from the conversation. This means workers can see a reply-in-progress while it's being saved and before it's being sent (which is incredibly helpful for having someone else proofread or sign off on outgoing messages before you hit the 'send' button). Drafts dispose of themselves when they are successfully sent. The Display Ticket screen will show you an alert about the number of pending drafts on the current ticket, along with their ages (which helps determine if someone else is already responding to the current ticket).
  • [Mail] Due to the recent introduction of drafts functionality, replying to an unassigned ticket will no longer auto-assign it to you. The original intent of this functionality was to prevent workers from replying to the same ticket, but it only worked for unassigned tickets and it complicated behavior which watched assignments (like the assignment notification). The confusing 'Discard & Surrender' button has been removed from the reply form as well.
  • [Mail] [CHD-896] The 'cc' and 'bcc' fields will now autocomplete e-mail addresses on the compose and reply forms. Previously only the 'to' field would autocomplete.
  • [Mail] For aesthetic reasons, the brackets around the tags in the ticket conversation (e.g. inbound/outbound/comment/draft/sticky note) have been removed.
  • [Mail] Outgoing replies in the ticket conversation will now show the name of the worker that sent them opposed to the helpdesk e-mail address (which is still shown as 'From:' in the message headers). This makes it much easier to read the conversation history without needing to scroll down to the signature of every message to see who sent it.
  • [Platform/Performance] Added a $view->renderTotal property to abstract views. This tells View::getData() and DAO::search() whether or not to compute the number of total rows in the result set when paging through a view. This is particularly efficient for procedurally paging through views (e.g. bulk update) because it won't run a second COUNT() query for each page.
  • [Mail/Usability] Terminology change: outbound->sent, inbound->received.
  • [Mail/Queue] Implemented a mail queue service that can be used by all functionality to send large amounts of mail in an efficient manner. A 'mail queue' scheduled task has been added for this purpose. Queued mail can be given a priority (e.g. replies to customers will be moved to the top of the queue, rather than waiting for all 1,000 bulk messages to be sent). This enables a lot of new functionality to be developed that would have created inefficient server loads in the past. For example, 'bulk update' could now have a 'mass reply' feature that would send replies to any number of tickets from a worklist; and these replies could be queued for delivery rather than being sent in real-time (which returns control of the browser back to the worker almost immediately).
  • [Mail] The conversation history on tickets now shows queued messages along with drafts.
  • [Mail/Drafts] You can now 'bulk update' drafts to queue or discard them from a worklist.
  • [Mail/Broadcast] [CHD-224] Workers with the proper permissions can now 'Broadcast Reply' to a worklist of tickets from 'bulk update'. These replies can be created as drafts or queued for immediate delivery. This can be used for so many things: replying to a list of tickets about the same service outage, replying to a list of leads about the same promotion, etc. In the very near future this feature will also support e-mail templates to personalize each message to its recipient. By combining this functionality with 'bulk update', you can also set any associated custom fields or properties (such as closing the tickets, or marking them 'waiting for reply').
  • [Explorer] Implemented an 'Explorer' service in the platform, which provides a thin global navigation bar over an arbitrary set of URLs, with next/prev and toolbar functionality. Previously, different pages managed their own 'series' functionality (e.g. tickets, tasks, opps, orgs). This worked fine for a while, but we'd started to notice limitations with the previous approach. Previously, you couldn't have two series open in different browser windows to page through different search results; and the paging was often limited to only 100 or so results. The new explorer functionality no longer has these limitations, and it's better performing. There's no forced limit to the number of results you can page through. As well, any plugin can take advantage of the new explorer functionality. Explorer items are stored with JSON (so any kind of data can be stored along with records). There is a new 'cerberusweb.explorer.toolbar' extension point that will let you render your own toolbar at the top of the explorer page. A default maintenance task has been provided to clear explorer data sets that haven't been used in the past 24 hours.
  • [Worker Notifications] Implemented 'explore' for worker event worklists on Home->Notifications. You can find the option in the blue bar at the top of the list. A custom explorer toolbar is also provided for marking events as read (or you can just navigate next/prev without changing the 'is read' status).
  • [Mail] Converting paging on tickets over to the new 'Explore' functionality. The limit on the number of results you can cycle through has been removed. The extraneous redirect on /display/browse/ is no longer needed. The '[' and ']' keyboard shortcuts are now managed by 'Explore' and have been removed from the /display page.
  • [Mail Drafts/Queue] Implemented the new 'Explore' functionality for mail queue and drafts worklists.
  • [Address Book/Orgs] Implemented the new 'explore' functionality for organization worklists.
  • [Tasks] Implemented the new 'explore' functionality for task worklists.
  • [CRM/Opportunities] Implemented the new 'explore' functionality for opportunity worklists.
  • [Platform] Implemented a 'devblocks_hyperlinks' Smarty modifier to create hyperlinks from URLs found in plaintext.
  • [Mail/Preview] The ticket 'peek' dialog will now automatically hyperlink URLs from the displayed e-mail message.
  • [Licensing] The CRM and Time Tracking plugins are now available for unrestricted use in free mode.
  • [Platform] Converted DevblocksPlatform::getDateService() to PHP 5.2's DateTime/DateTimeZone classes. This also added a new optional 'is_gmt' argument to the '|devblocks_date' template modifier (which ignores the timezone conversion when printing dates).
  • [Broadcast/Mass Reply] Sending a broadcast reply from 'bulk update' on ticket worklists can now use email templates to personalize the generated responses for each ticket in the list. You can also use conditional logic (e.g. if/elseif/else) and loops. For syntax, see: http://www.twig-project.org/book/02-...late-Designers
  • [Broadcast/Mass Reply] Added a template tester to the 'broadcast' action on ticket worklist 'bulk update'. Not only will the tester report any syntax errors in your template, but it will also pull a random sample from the current worklist every time you test to show you rendered output for various situations. Simply click the 'test' button until you're satisfied things are working as you expect and then send it.
  • [Licenses] Groups are no longer limited in free mode.
  • [Explorer] Added the ability for 'Explorer' toolbars to update their associated cached item. This means your changes to the current item will be visible if you navigate away and back without having to reload your worklist.
  • [Forums Explorer] Updated the 'Forums Explorer' plugin to work with Cerb5/Devblocks2 and the new 'Explorer' functionality. This plugin allows you to watch external forums (vBulletin/phpBB2/etc) and handle threads/posts like tickets/email. Workers can assign threads to each other, or close threads when they're resolved (which is much easier than monitoring forums through their interface).
  • [Explorer] Added the ability to 'explore' starting at any row in a worklist. Simply select (checkbox) a row and then click 'explore'. You'll still have access to all the rows around it with next/prev. Without selecting a row, explore will now use the first row of the current worklist page (instead of the very first result).
  • [Platform] It's now possible for plugins to change paths on the disk (/features -> /storage/plugins) without their manifests being deleted and recreated within Devblocks. This prevents issues with upgrades where active plugins may become disabled because they were relocated within the directory structure. All that must match for a plugin manifest is the ID -- any other updated details will be refreshed on the same record.
  • [Mail] [CHD-219] Hide long blocks of quoted text with DHTML (similar to Gmail). (Jeff@WGM: This works for Display Ticket and 'peek').
  • [Platform] Added a 'devblocks_hideemailquotes' Smarty modifier which inserts DHTML into an email message body to hide long quoted blocks until the user asks to see them.
  • [Platform] C4_AbstractViewModel will now persist two additional properties: renderTotal and renderTemplate. renderTotal is a performance optimization that tells a view to not calculate the total number of results in a second getData() query. renderTemplate allows $view>render() to display different templates for different situations (e.g. a slimmed down mobile template, a peek version of a worklist, etc). The $view->render() template file itself doesn't necessarily need to change, but the template parameter can be used to set additional data in the template scope and adapt.
  • [Snippets] Implemented a new 'snippets' service which replaces e-mail templates. Unlike e-mail templates, snippets are not limited to a single piece of functionality (like replies vs. compose mail). Snippets are context-aware, meaning they can be used for more than just tickets (e.g. tasks, workers, opportunities, etc). Contexts can be joined together, so a ticket with a first+last sender links to an 'address' context for each of them. A 'task' context links to a 'worker' context for the assignee. This means that all your custom fields and properties are available as replacement tokens: ticket->sender->org->customfield; allowing for very flexible and informed snippets. A 'plaintext' context is also provided for snippets that may be used in any context (such as your business address). Snippets also support 'Twig' syntax, so you can do modifiers (e.g. date formatting) and conditional logic (e.g. if/then) or loops. You can check if you know the first name of an e-mail address and address them by name -or- use a generic greeting. The more information you store about people and organizations (CRM), the more personalized your interaction will be courtesy of snippets. Because of conditional logic, you also don't need to 'babysit' snippets, because they'll adapt to information you do or don't have; they are automation-friendly. Snippets also come with an Ajax-driven tester to make sure they're formatted properly and adapt in different situations. You can edit your mail-related snippets in the Mail->Snippets tab. Your existing mail templates will be automatically converted to snippets by the Cerb5 update.
  • [Snippets] Added a snippet tester to the Setup->Mail global signature.
  • [Snippets] Added a snippet tester to the Groups->Mail signatures.
  • [Snippets] Added 'group' and 'bucket' contexts.
  • [Platform] You no longer need to define a 'devblocks.i18n.strings' extension for your plugin to provide translations. Just place a strings.xml file in the root of your plugin directory.
  • [Platform] Revamped the /update system. Patches are now run in dependency order per release; so an original Cerb 4.0RC1 install will patch core to 4.1 and update all plugins to 4.1, then patch to 4.1.1 and update all plugins, until current. Plugins can assume their dependencies have been loaded and updated to the same version before them. Failing patches on plugins will cause that plugin to be disabled but won't prevent an update from happening (since it can be assumed some plugins won't be current with new releases on release day).
  • [Platform] Devblocks PatchContainers have been removed. Patch information is now stored in the plugin.xml manifest. Patches are now linked to a specific application release (e.g. 5.0.0-beta).
  • [CHD-1818] [Drafts] Add a "Continue Later" button to 'Mail->Send Mail'.
  • [Setup/Plugins] Added convenience links for 'select all' and 'select none' to the Setup->Plugins tab.
  • [Drafts] [CHD-1817] Added drafts functionality to 'Mail->Open Ticket'.
  • [CRM/Opps] The 'Opportunity Tracking' plugin has graduated from experimental to stable.
  • [Mail/Drafts] Messages are no longer added to the ticket conversation history if they weren't sent via SMTP successfully; instead, a draft is generated (or preserved) and shown in the discussion. This prevents the issue where multiple unsuccessful attempts would each add a failed message (with an attached sticky note). This works for worker-initiated mail like compose/create/reply, as well as for automated mail like autoreplies and watcher emails; although worker-less mail is saved directly to the mail queue rather than as drafts.
  • [Application] Added ticket.last_message_id to complement ticket.first_message_id
  • [Snippets] Added a 'message' context to snippets, which includes tokens for the sender information and message content. This is also used in the 'ticket' context for the first/last messages.
  • [Mail] Group auto-replies can now use all the snippet tokens from the 'ticket' context. A snippet tester has been provided for open and close auto-reply events. Existing auto-reply templates will be automatically migrated by the upgrade to Cerb5.
  • [Snippets] Added an 'opportunity' context to snippets. This also links the lead to the 'e-mail address' context, and links the current worker and assignee to the 'worker' context.
  • [CRM/Broadcast/Snippets] Workers with the proper privileges can now broadcast compose using snippets from opportunity lists. Snippets can be used to send personalized messages to every lead (including the subject and body). The opportunity snippet context also provides links to the assigned worker and lead e-mail contexts (including custom fields on all objects). To broadcast, click 'bulk update' from any opportunity list. You can choose to create drafts or queue generated e-mail for delivery.
  • [Snippets] The 'current worker' context is now available in all snippet contexts.
  • [Address Book/Broadcast] Added 'broadcast' compose functionality to the address book. This is available to all workers with the appropriate privileges. You can use all the snippet tokens related to the 'address' context, including custom fields for e-mail addresses and organizations. To send a broadcast from any list of e-mail addresses (e.g. the address book, worklists, search results). Broadcast can generate drafts or directly add email to the outgoing mail queue.
  • [Platform] Added 'delta' support as the first argument to the '|devblocks_prettytime' Smarty modifier. This takes a number of seconds and formats it as "+3d" or "-3m".
  • [CHD-1804] [Tasks] Cannot delete from the (peek) window with Firefox and IE
  • [CRM/Opps] The 'delete' button will no longer show up on the peek when creating a new opportunity.
  • [CHD-1425] [Usability] Removed the forced ini_set('memory_limit') calls within the code and added a simple override to the framework.config.php for people who choose to use it. It's commented out by default.
  • [CHD-1774] Workspace names should not allow HTML tags.
  • [CHD-1601] [Mail Filtering] "Message headers" checkbox doesn't stick.
  • [CHD-1469] [Keyboard shortcuts] Reply (r) command does not work after setting an organization
  • [CHD-1482] [Search] "Quick Search" does not save sort by preferences
  • [CHD-1497] [Watchers] Selecting an address under 'forward to' will now automatically select the 'forward to' action itself.
  • [CHD-1458] [Opportunities] Not entering an e-mail address makes worklist drop out of view
  • [CHD-101] No error checking for non-matching passwords when adding a new worker
  • [CHD-731] Parser crashes when parsing Worker replies and Mail Server is invalid
  • [CHD-1807] Replying to mail created from 'Send Mail' doesn't thread back to the original conversation (Jeff@WGM: SwiftMailer was generating a new message-id header inside $mail->send(); so we now save the headers before sending.)
  • [CHD-1481] [Tasks] Added a new event point ('task.create') for observing task creation.
  • [CHD-1479] [CRM/Opps] Implemented a new event listener ('opportunity.create') for observing the creation of new opportunities.
  • [Parser] [CHD-1000] Fixed a parser issue where the content-type wasn't being checked properly in the envelope headers, but only for mimeparts. Mailparse populates a 'charset' global info property in all cases, and the previous 'content-charset' was only available if a mimepart *and* if explicitly defined. This fix should allow the parser to properly sanitize invalid UTF-8 in all cases.
  • [Mail/Parser] The parser will now use the current time as the 'updated' property for all new tickets, while still retaining the 'created' date based on the headers.
  • [Plugins] The 'cerberusweb.mobile' plugin has moved into the optional plugins repository and is no longer a part of the Cerb5 core.
  • [Plugins] The 'wgm.google_cse' (Google Custom Search Engines) plugin has moved into the optional plugins repository and is no longer a part of the Cerb5 core.
  • [Plugins] The 'cerberusweb.webapi' plugin has moved into the optional plugins repository and is no longer a part of the Cerb5 core. It is being replaced by the 'cerberusweb.restapi' plugin.
  • [Mail] [CHD-1844] The 'drafts' and 'snippets' tabs will now save their focus if you navigate away and come back.
  • [Activity] The previously selected activity tab will now retain focus if you navigate away and return.
  • [Contexts/Snippets] Added a 'notification' context.
  • [Contexts/Snippets] Added a 'task' context.
  • [Project] The Community Edition and the Free Version have merged into a simpler free version. There is no more tagline or limitation on the number of groups you can have without a license. You no longer need to complete the /install survey to receive a Community license (it's the default for all new installations). Instead, the /install survey will grant you a special one-time discount coupon for a future purchase.
  • [UI/UX/Setup] Prettied up the 'Plugins & Features' tab in Setup. Plugin manifests can now provide an image/screenshot to be displayed next to the plugin description.
  • [Web-API] Implemented a much improved new Web-API plugin for Cerb5, providing a RESTful JSON/XML gateway to helpdesk data using GET/PUT/POST/DELETE over standard HTTP connections. Extensions can provide new REST controllers to expose plugin-provided information to the gateway as well. The platform will automatically handle the serialization of array data and primitives into JSON or XML (simply by appending .json or .xml to a request). An error handling framework is also provided. Authentication has been simplified compared to Cerb4's Web-API, and has been tested in Java/PHP/Objective-C (and anything else should work too). Authentication is based on worker logins, making it much easier to build tools on mobile phones and desktops. Security is handled by the same ACL/Permissions as the main helpdesk (i.e. if a worker can't delete tickets in the GUI then they can't through the API). The current implementations use CerberusContext to provide detailed, linked objects in a flat format (e.g. ticket->worker->org->customfield); making parsing results in many environments easier w/o a deep hierarchy.
  • [Plugins] Moved 'Forum Explorer' to the optional plugin repository.
  • [Contexts] Added a 'feedback' context.
  • [Contexts] Added an 'attachment' context.
  • [Contexts] Added a 'time tracking' context.
  • [KB/Performance] Added a DAO_KbCategory::getAll() cache.
  • [Contexts] Added a 'kb article' context.
  • [Workspaces] [CHD-1765] Workspace delete removes wrong workspace
  • [Mail/Drafts] If the subject and body are empty on an auto-save from /compose or /create, then the draft won't be saved. This prevents having to deal with empty drafts from simply opening the compose screens.
  • [Mail/Compose] Better form validation (to/subject/body).
  • [Mail/Log Ticket] Better form validation (from/requesters/body).
  • [Mail/Usability] [CHD-1554] The quote line ("on date, so-and-so wrote:") is now more brief on replies. Either the sender's personal name or their e-mail address is shown, rather than both. The date shows the day/month/year, but not the hours/mins/secs or GMT offset. (Suggested by Brett Garrett)
  • [CHD-1510] [CHD-1511] [Mail/Scheduler] The 'cron.pop3', 'cron.parser', and 'cron.mail_queue' scheduled jobs will refuse to run if the 'imap' or 'mailparse' extensions are missing. These extensions tend to disappear when hosts upgrade PHP and don't include all the previous configuration (from installation requirements).
  • [CHD-1506] [Quick Search] Does not add group filters automatically like traditional search
  • [Mail] [CHD-1450] Fixed an issue where worker 'assignment' notifications could be sent to workers that were already assigned to a ticket when another worker replied to it.
  • [CHD-1496] [Notifications] Notifications don't seem to be getting purged out of the database.
  • [Platform] [CHD-1851] Fixed an issue where plugins that no longer exist on disk wouldn't clean up their records in the database. The 'cleanupPluginTables' code was using 'getPluginRegistry' -- but the registry automatically filters out any plugin that's not on the disk. Now the clean-up code accesses the database directly.
  • [CHD-1473] [Mail] "Reply to all" exclude list does not block requesters from merged tickets.
  • [CHD-829] [Requesters] Include a checklist of e-mail addresses used in the ticket, so you could easily add/drop requesters. (Jeff@WGM: You can now modify the requester list in a textbox during replies).
  • [Mail] Improved the 'Auto-requester To/Cc' setting in 'Setup->Mail' into a global 'Always exclude these addresses as recipients' list. This prevents specific addresses from becoming requesters from anywhere. It's especially useful in situations where you receive an automated receipt from a payment processor that you merge into an order ticket. By preventing the receipt address from becoming a requester, you won't have to constantly modify the requester list after merging.
  • [Mail] The current recipients list is now shown at the top of Display Ticket. Clicking on a recipient will pull up the address peek dialog. You can add or remove recipients by clicking on the "..." ellipses.
  • [Mail] A warning has been added to the top of Display Ticket when there are no recipients.
  • [Mail/Drafts] Implemented drafts functionality when forwarding messages on tickets.
  • [Parser] Autoreplies will not be sent to initial requester addresses that aren't recipients; i.e. if those recipients were 'excluded' from being added to the ticket when the ticket was received (e.g. automated receipts from a payment gateway).
  • [Plugins/Platform/Sessions] Added several new methods to the Session service: getAll() to retrieve all active sessions; decodeSession($data) to decode the PHP session variables without restoring to the current $_SESSION scope; clear($key) to expire a specific session. These changes allow session management functionality (e.g. kicking specific logins).
  • [Login] The login form will now display a clear error when authentication fails.
  • [Licensing] Licenses are now based on seats rather than worker accounts. This means that as of 5.0rc2 all Cerb5 installations can create unlimited worker accounts. Your license determines the number of simulatneous workers that may be logged in. For example, if you have 5 seats and 50 workers then your remaining workers may find themselves waiting for a seat to be available ("musical chairs"). Idle sessions will be "kicked" if another worker is trying to log in. We feel this is a far more fair way to license the software, and it resolves many outstanding issues from Cerb4 worker-based licensing: unfriendly license terms for helpdesks with interns/temps/volunteers, penalty to preserving the history of archived workers, single-account evaluations, etc. The benefits of Cerb5 are more related to teamwork rather than having many infrequently-used worker accounts. The 'Evaluation Edition' (no license) now restricts Cerb5 to a single worker logged in at a time, but you may create unlimited worker accounts. The 'Community Edition' (granted after the installation survey) permits 3 simultaneous workers and no longer restricts the total number of workers. Purchased licenses increase the seat capacity beyond that point, and provide ongoing software updates.
  • [Updater] When running /update with an expired license, you're now given the options to renew, remove your expired license and enter Evaluation Mode, or downgrade.
  • [Who's Online] The signed on worker list now uses actual session data rather than "last activity" information. This is far more accurate.
  • [Sessions] Tweaked seat management and authentication so idle sessions aren't logged off unless at capacity.
  • [Mail Queue/Setup] [CHD-1852] Added a 'Mail Queue' tab in Setup that allows administrators to monitor queued messages.
  • [Mail Queue] Implemented a 'queue_fails' property on queued messages to keep track of the number of consecutive fails for a particular message. The queue will attempt to redeliver messages until they fail 10 times; which prevents a backlog of failing messages from blocking the entire queue. Re-queuing a message will reset the fail counter.
  • [Drafts/Mail Queue] The drafts/queue view now displays rows on two lines. This gives more room to the subject and long 'To:' lists.
  • [Drafts/Mail Queue] Implemented peek functionality. This displays for superusers and the owners of drafts/messages.
  • [Drafts] You no longer need to be a superuser to batch update your drafts.
  • [Mail/Setup] [CHD-849] When you delete the default group, the destination group will become the new default.
  • [Mail/Display Ticket] [CHD-720] Added the ability arbitrary tickets from Display; without needing to have tickets next to each other in a worklist. To merge any two tickets, click into one of the tickets, click the 'more>>' button in the top toolbar, click the 'merge' button, and enter the ID of the other ticket.
  • [Explorer] [CHD-1813] Brackets don't navigate the explorer when focus is in the upper pane.
  • [Mail] [CHD-1551] Moving, or setting custom fields on, a previously closed ticket will resend the "close ticket" auto-reply. (Jeff@WGM: The /display page is now more careful when setting the 'is_closed' property and it will try to avoid setting it to the same value. I considered moving the autoreply to the 'pre-change' event, but the snippets in the template should be aware of its post state).
  • [Storage/Plugins] Implemented 'Model_DevblocksStorageProfile->getUsageStats()', which provides a list of storage schemas using a particular storage profile.
  • [Storage/Setup] Storage schemas will now display their content breakdown by storage profile rather than just storage engine.
  • [Storage/Setup] The storage profile peek panel will now display the schemas using the current profile. Improved the warning displayed when editing the configuration of an active profile, and added a note about not being able to delete a profile until it has no content.
  • [Storage/Setup] [CHD-1861] Implemented the ability to delete storage profiles when they have no associated content.
  • [Research/Plugins] Removed the 'research' page. Any 'cerberusweb.research.tab' plugins should change their extension point to 'cerberusweb.knowledgebase.tab'.
  • [Knowledgebase] Added back the 'knowledgebase' menu + page, and moved the KB out of the deprecated 'research' menu. 'Browse' and 'Search' are now tabs inside the KB, rather than the confusing button toggle from Cerb4.
  • [Research/Knowledgebase] [CHD-1862] Research tab is still visible after disabling the knowledgebase plugin.
  • [Platform/Plugins] Added Markdown parsing support to Devblocks using the BSD-licensed PHP Markdown library from Michel Fortin (based on Markdown by John Gruber). Simply use DevblocksPlatform::parseMarkdown($text).
  • [UI/UX] Made the ticket 'peek' popup a little wider by default to accommodate the automatic wrapping of most email clients at ~78 characters.
  • [Knowledgebase] Added 'Markdown' support to the knowledgebase as the new preferred article format. HTML is still supported as an alternate format, and plaintext articles will be automatically convered to Markdown by the upgrade. Markdown is a good fit for Cerb5 because the markup is easily readable by humans and matches the way people naturally punctuate plain text. It's easier to read, edit, paste into email, or search index.
  • [Knowledgebase] Implemented a markup/visual editor (MarkItUp; by Jay Salvat) in the Knowledgebase and added support for Markdown and HTML syntax. You can use the toolbar to add familiar word processing options (e.g. bold, italics, lists, images, links). There's a live preview button that will render your output as you type. This completely eliminates the tedious process in Cerb4 of tweaking a KB article, clicking it to view, then clicking edit again to make another change. We've avoided adding visual editors to the KB for so long because most of them are bloated. MarkItUp is a good compromise: it's a jQuery plugin, it's 8KB packed, and its other CSS/JS resources can be rolled into the files we already cache. It also doesn't try to be a full WYSIWYG editor -- if you want to visually design complex tables and other markup, use something like Dreamweaver and paste the generated HTML into the textbox.
  • [Knowledgebase] Implemented a 'display' page for individual knowledgebase articles. This provides a future home for tabs, toolbars, attachments, comments, explore, snippets, and other advanced functionality (that is difficult to provide from only a 'peek').
  • [Knowledgebase/UI/UX] Knowledgebase articles are now displayed in an IFRAME to prevent the global stylesheet from wrecking article contents. It's possible we'll add a customizable KB specific stylesheet in the future -- but at least for the time-being articles can provide their own STYLE blocks.
  • [Knowledgebase] [CHD-1643] Permalink ID functionality for KB articles
  • [Knowledgebase] [CHD-1349] Preview or display knowledgebase article after edit
  • [Knowledgebase] [CHD-1345] Resize knowledgebase article
  • [Snippets] [CHD-1868] Admins should be able to delete any snippet.
  • [Mail/Drafts] Drafts in the conversation history will now show their Cc/Bcc headers, if they have them.
  • [Knowledgebase/Mail/UX] Improved the L&F of the knowledgebase search from the Reply screen. Added a minimalistic article worklist that allows paging + sorting. You can now hit [RETURN/ENTER] inside the search box. The search box is automatically focused.
  • [Knowledgebase] Added Explorer functionality to knowledgebase article worklists.
  • [Platform/Plugins/Worklists] Used jQuery to improve worklists: row highlighting, row selection, and Explorer bookmarks.
  • [CHD-1848] [Browsers] Checkbox and selections are slow to respond in Chrome and IE7
  • [Platform/Explorer/Performance] Worklists will no longer calculate the Explorer bookmark every time a row is selected. The Explorer functionality will use the first selected row as the starting point, and will find it only when the 'explore' link is clicked.
  • [Explorer] Clicking on the logo during 'Explorer' mode will return you to the exact page you started from.
  • [Platform] The /update process will now properly flush the Smarty3 cache and all compiled templates.
  • [Support Center] [CHD-1864] Announcements feeds do not use chosen feed title.
  • [Knowledgebase] [CHD-1190] Added custom fields to knowledgebase articles. This provides much more flexibility when organizing worklists: region, language, product, assignee, etc.
  • [Contexts/Web-API] Returned custom fields with knowledgebase articles.
  • [Licensing] If you're licensed for a major software update (e.g. 5.0, 5.1, 5.2, ...) then you'll receive all minor updates in that branch (e.g. 5.1.x) regardless of when your updates coverage expires.
  • [Platform] Implemented 'ONDEMAND_MODE' (toggled from framework.config.php) that disables several Setup options that don't need to be exposed in a software-as-a-service environment: the Storage tab, the Scheduler tab, Licensing, and Authorized IPs.
  • [Support Center] [CHD-1782] You can now choose which fields (including custom fields) to expose to customers in the 'My Account' area of Support Center community portals. Address and Organization fields are available. Each field can be designated as: Hidden (not shown), Read Only (visible but not editable), or Editable (the visitor can manipulate and save the field value). This allows customers to maintain their own contact information, as well as perform some data entry for you (e.g. "Industry", "# Employees", etc).
  • [Support Center] [CHD-1549] Fixed a bug that prevented customers from changing their passwords from 'My Account' in the Support Center.
  • [Watchers] [CHD-1874] Duplicate message ID in header when watcher for incoming mail is triggered to forward mail to external address.
  • [Setup/Storage] [CHD-1876] Storage profiles have checkboxes that serve no purpose
  • [Setup/Storage] [CHD-1878] Make the storage schema configuration more obvious. The fact the H3 titles are links can be easily missed. (Requested by Niek Beernink @ Oxilion; Fixed by Jeff@WGM: Moved the link to an "(edit)" label.)
  • [CHD-1880] [Drafts] Forwarded messages do not show ticket subject in the 'Drafts' tab
  • [CHD-1858] memcached::set expects at most 3 parameters, but 4 are given in devblocks.class.php line 2207 (Jeff@WGM: Abstracted the difference between PECL/Memcache and PECL/Memcached).
  • [Mail/ACL] [CHD-1847] Fixed a bug in the pile sorter that allowed tickets to be moved from groups that the active worker isn't a member of.
  • [Mail/Open Ticket] [CHD-1474] 'Insert Signature' button not working.
  • [Installer] [CHD-1808] Fixed the issue with redirecting to /install when installing Cerb5 in the root path of a domain/subdomain.
  • [Mail/Merge] [CHD-1849] The destination ticket in merges will now have the status (open, waiting, closed, deleted) of the latest updated message.
  • [Reports] [CHD-1658] The 'Custom Field Usage' report will now show human-readable values for checkbox, date, and worker custom fields.
  • [Snippets] Added a filter box to the Snippets chooser which automatically filters the worklist to matching snippets as you type substrings (i.e. 'price' matches 'cerb5 price sheet'). If you want to really categorize your snippets, consider prefixing tags to their titles (e.g. '[Policy]'). This will allow for quick filtering.
  • [Mail/Snippets] Added a 'hits' column to the Snippets chooser. This tracks the uses per snippet per worker, so each user has their own 'most frequently used' list for quickly selecting their most used snippets.
  • [Who's Online] [CHD-1882] ip2long() returns an error on 32-bit systems for some IP addresses.
  • [Setup/Custom Fields] The 'ID' is now displayed next to each custom field in Setup, since it's used by functionality like the REST-based Web-API.
  • [Platform/Plugins] DAO_CustomFieldValue::formatAndSetValues() can now accept values for multi-value fields with '+' or '-' prefixes to designate delta operations. You can set and unset multiple fields in a single operation.
  • [REST/Web-API] Implemented several helper methods for Extension_RestController. _handleSanitizeValue($value,$type) will enforce a data types for provided values; _handleRequiredFields($required,$fields) will enforce required fields for a REST operation (e.g. POST /create.xml); _handleCustomFields($scope_array) will parse custom fields from the $_POST/$_REQUEST scope and return an assoc array ($id=>$vals).
  • [REST/Web-API] Implemented (POST /create.xml) and (PUT /id.xml) for Address records.
  • [REST/Web-API] Implemented (POST /create.xml) and (PUT /id.xml) for Org records.
  • [REST/Web-API] Implemented (POST /create.xml) and (PUT /id.xml) for Worker records.
  • [REST/Web-API] Implemented (POST /create.xml) and (PUT /id.xml) for Task records.
  • [REST/Web-API] Implemented (POST /create.xml) and (PUT /id.xml) for Worker Event (Notification) records.
  • [Platform/Plugins] Added a new 'DevblocksPlatform::importVar()' utility method to sanitize user-provided data. It currently supports: 'array', 'float' (123.45), 'string', 'integer', 'bit' (0/1), 'boolean' (true/false), 'timestamp' (string or unix timestamp). These types are now also available when using 'DevblocksPlatform::importGPC()'.
  • [REST/Web-API] Implemented (POST /create.xml) and (PUT /id.xml) for Opportunity records.
  • [REST/Web-API] Implemented (POST /parser/parse.xml) which accepts MIME message content in a POST variable called 'content' and returns a ticket_id on success.
  • [REST/Web-API] Implemented (POST /create.xml) and (PUT /id.xml) for Feedback records.
  • [REST/Web-API] Implemented (PUT /tickets/id.xml) for Ticket records w/ custom field support. Also enforced group memberships on DELETE and GET actions.
  • [REST/Web-API] [CHD-1883] Creating workers through the Web-API will now properly register their e-mail addresses as worker addresses.
  • [REST/Web-API] Implemented 'POST /tickets/123/comment.xml'
  • [REST/Web-API] Implemented 'POST /tasks/123/note.xml'
  • [REST/Web-API] Implemented 'POST /orgs/123/note.xml'
  • [REST/Web-API] Implemented 'POST /opps/1

New in Cerb 4.3.1 Build 951 (Dec 9, 2009)

  • [Address Book] [CHD-1432] Increase the size of the 'Notes' text field for Organizations.
  • [Opportunities] [CHD-1431] 'Notes' don't format output with newlines.
  • [Mail] [CHD-1427] Add 'me' and 'nobody' shortcut buttons to ticket 'peek' for assigning the Next Worker.
  • [Mail] [CHD-1434] Fixed an issue with auto-replies not sending; which was introduced during the upgrade from SwiftMailer 3.x to 4.x.
  • [Platform] Renamed 'CerberusLoginPageExtension' to 'Extension_LoginAuthenticator', refactored, and removed the hardcoded LDAP example. We'll document a proper LDAP plugin example on the wiki.
  • [Support Center] You can now authorize customer logins to the Support Center against anything you want: LDAP, forum logins, CRM, billing, etc. You're not tied to the login/password format, you can any combination of fields (e.g. customer ID, account number).
  • [Configuration] Workers are now managed using a worklist; with paging, sorting, filtering, peek, and customizable columns. This is helpful if you have lots of workers or if you'd prefer to always display them by first name, last name, or any other property.
  • [Custom Fields] You can now add custom fields to Worker records. This should help solve many feature requests where organizations would like to display information like direct phone extensions in signatures. You can also use this to track any information you want (e.g. worker ages or weekday schedules) and use the data in business logic (filters, signatures, templates).
  • [Workspaces] You can now manage worklists of workers on your workspaces. This is most helpful when combined with custom fields, as a manager could display a list of workers who are flagged as needing help (e.g. additional training) -- the list would automatically add or remove workers based on the status of the custom fields.
  • [Translations] [CHD-1446] 'My Account', resend confirmation, string is not translatable.
  • [Address Book] [CHD-1441] The 'Password' column in the 'Addresses' worklist shows the encrypted value.
  • [CRM/Opportunities] [CHD-1442] The ability to change the e-mail addresses on opportunities.
  • [Mail] [CHD-1439] Adding a Sticky Note used to auto-focus the textbox immediately.
  • [Mail] [CHD-1438] Open Ticket trailing comma AND space (", ") in the requesters list throws an error. Appending a comma is the default behavior of the multi-autocomplete functionality, so Cerb4 should be prepared to ignore it.
  • [Mail] [CHD-1448] Open Ticket 'Insert Signature' button not working since the form changed.
  • [Configuration] You can now bulk update Workers from Configuration, including setting worker-level custom fields.
  • [Tasks] [CHD-1152] You can now add multiple notes to tasks to keep track of progress. The content from existing tasks has been moved into an anonymous note.
  • [Tasks] Tasks now have a 'display' page with tabs.
  • [Tasks] The task 'peek' panel now displays all notes on the popup.
  • [Tasks] Tasks now have an 'updated date' field that is automatically updated when any properties change. This is now used as the date for task RSS feeds (rather than due date).
  • [Tasks] Added series support to tasks. When you click any task in a list you'll be given the previous/next options to navigate the list from the details page without having to return to the list.
  • [Tasks] Added the keyboard shortcuts for '[' (previous) and ']' (next) while displaying tasks in a series.
  • [Address Book/CRM/Tasks] [CHD-1471] Using 'Notify Workers' when leaving a note doesn't work properly if you select multiple workers.
  • [Platform] [CHD-1457] split() deprecated in PHP 5.3, should be replaced with preg_split() or explode(). (JAS: Fixed in Cerb4-level code, but some of our library dependencies still use it)
  • [Mail] [CHD-1452] cerberus(at)localhost is being added to the list of requesters when using 'Open Ticket' with 'reply to all' enabled.
  • [Mail] [CHD-1453] Group reply addresses not being used in reply-to header on tickets created from 'Open Ticket'.
  • [Workers] [CHD-1460] Prevent workers from disabling their own account.
  • [Platform] Fixed a bug where some transitions from split() to explode() on multiple delimiters (e.g. or
  • ) didn't work properly. Those have been converted to preg_split().
  • [Watchers] [CHD-1494] Editing an E-mail Notification as non-admin unassigns it from the worker.
  • [Notifications] [CHD-1495] Entries cannot be marked read after customizing the view and logging out.
  • [Notifications] Fixed a bug with the 'is read' column on Worker Event worklists where the checkmark was flipped and displayed for unread messages.
  • [Support Center] Added a '#header' CSS selector for custom header content.
  • [Configuration] [CHD-1454] New dialog box for worker edit is too cramped.
  • [Support Center] [Translations] [Knowledgebase] [CHD-1491] "portal.kb.public.top" appears in the public knowledgebase on fresh installs.
  • [Translations] [CHD-1499] "errors.core.no_acl.edit" appears in the Organization's (peek) window
  • [Platform] [CHD-1440] Errors while forwarding or creating messages with attachments (JAS: SwiftMailer uses OS temporary path, which can cause permissions problems on Windows machines. We now properly use the cerb4/storage/tmp directory.)

New in Cerb 4.3 Build 942 (Sep 29, 2009)

  • [Anti-Spam] Added a fallback to 'preg_replace' for environments where 'mb_ereg_replace' is unavailable. For whatever reason, some installs lately have regexp disabled in the mbstring extension.
  • [Knowledgebase] [CHD-705] You can now delta add/remove categories from knowledgebase article lists using bulk update.
  • [Custom Fields] [CHD-1325] Filtering for a "chooser" value with a single quote will throw an SQL error.
  • [Platform] Phased out the 'DevblocksPlugin' superclass.
  • [Platform] Cleaned up the plugin manifests so the plugins group better in Helpdesk Setup->Features/Plugins.
  • [Notifications] [CHD-1365] Allow 'copy' on a worker's notification list so they can keep track of it on a workspace.
  • [Platform] [CHD-1129] All views/lists will now remember their worker-level customizations (columns, sorting, length) between logins. This works everywhere: for the major lists like Overview and Workflow, as well as utility lists like 'Requester History' and 'Audit Log'. This was likely the top usability complaint prior to 4.3, since custom fields being added as list columns is helpful, but tedious if you have to set them each day.
  • [Mail Setup] [CHD-1273] Add an option to disable a mail server on the add screen.
  • [Support Center] [CHD-1337] Each Support Center profile can now choose to allow attachments from: anybody, logged in visitors, or nobody.
  • [Support Center] [CHD-1368] When editing Contact Situations they lose their order (always moves to bottom)
  • [Support Center] [CHD-1329] If a customer opens a new ticket and enters zero for a 'number' custom field, then it will not be "saved" in the ticket
  • [Mail Filters] [CHD-1362] The auto-checkbox behavior between Criteria and Actions isn't consistent
  • [Time Tracking] The Time Tracking timer has been made thinner so it no longer blocks any menu options. It now also plays nice with the Auto-Refresh timer.
  • [Auto-Refresh] [CHD-1321] The Auto-Refresh timer has been made thinner so it no longer blocks any menu options. It also plays nice with the Time Tracking timer.
  • [Mail Filtering] [CHD-1386] Creating a pre-parser filter without a name makes it impossible to edit later
  • [Mail] [CHD-1372] Properties and Reply have similar text but they don't share translation strings.
  • [CRM/Opportunities] [CHD-1298] Importing with a blank 'title' field should use a default.
  • [Parser] [CHD-1376] Two literal 'Subject' lines in the header produces a ticket with the title 'Array'.
  • [Platform] [CHD-1375] The 'session' and 'json' PHP extensions are required and have been added to the installation checker.
  • [Tickets] [CHD-979] Any replies made to a split ticket are threaded to the original ticket.
  • [Platform] Removed the superfluous 'ticket_id' foreign key from the 'message_header' table. This can be found by joining message_headermessageticket. There can be 20+ headers per ticket and the index just duplicated a lot of data on headers that would have never needed to join directly to a ticket; it was only used by the parser for matching 'in-reply-to' and 'references'.
  • [Address Book] [CHD-1360] Quick search from Display Organization
  • [Time Tracking] [CHD-1361] Billable options display occupies more vertical space than given
  • [Group Setup] [CHD-1378] When adding a list of buckets to your workflow, they are not filed in the order you typed them.
  • [Mail] Open Ticket will now generate a placeholder message from the first requester, so the 'first wrote' and organization links properly point back to a client. The body of the message will say "opened by worker on behalf of requesters". The message entered by the worker when opening the ticket will be treated as a follow-up reply, and you can now check a box to optionally send a copy of that message to the requesters list when the ticket is created. The "To:" field is now an e-mail address rather than a dropdown of Groups, and the new ticket will now have filters and routing applied as expected.
  • [Mail] [CHD-618] Open Ticket does not associate an Organization with the ticket (for Ticket Views display purposes).
  • [Mail] [CHD-621] Open Ticket should differ with the display message than Send Mail.
  • [Support Center] [CHD-796] You can now manage Support Center registration from the Address Book. There's a new 'is registered' field on contact records to easily locate registered contacts. Registered contacts are now the default list in the address book (opposed to num_spam > 0). You can register contacts using 'peek' from the Address Book; and there is also a new option to 'clear' an existing login if you'd like to revoke access. This can be combined with the option to disable registration on the Support Center for environments that want to manually whitelist contacts.
  • [Address Book] When importing passwords for contacts, the CSV importer is now capable of auto-detecting MD5 hashes or generating them from plaintext passwords. In the past many people were confused about what format was expected; now you can use what's convenient.
  • [Platform] The 'address_auth' table has been merged in to the 'address' table to simplify many things (e.g. Web-API, DAO).
  • [Search] The 'reset' option is now properly available from any list even when all the criteria have been removed. Previously the 'reset' option for search functionality was only available when adding your own criteria; but it makes sense to always be able to restore the list to the default criteria.
  • [Platform] Upgraded and migrated SwiftMailer (our core SMTP mail library) from version 3.x to 4.0.4. This includes many API and functionality changes that will make it easier to implement future feature requests, as well as clean up some lingering issues with international character sets.
  • [Mail] [CHD-1057] Mail is now sent in quoted-printable format with UTF-8 encoding. Previously everything was sent base64-encoded, but some e-mail clients had trouble displaying the mail (namely mobile e-mail readers... mostly *cough* from Microsoft).
  • [Support Center] [CHD-1382] Tweaked profiles so every module can have its visibility restricted to: anybody, logged in, nobody. This also works for Support Center plugins. A migration script will convert the deprecated options for 'require login' to the new format.
  • [Knowledgebase] [CHD-1391] Sorting by the 'Topic' column throws an error.
  • [Knowledgebase] The 'Format' column will now display 'Plaintext' or 'HTML' rather than a 0/1 bit field.
  • [Platform] [CHD-1389] System requirement for Swift Mailer 4.04 is 5.2 need to update system requirements inside Cerb4.
  • [Mail] [CHD-1276] Using international characters in subjects corrupts in Cerb4 and receiving email client.
  • [Watchers] Fixed a PHP notice when a forwarded watcher file attachment didn't have a proper filename.
  • [Scheduler] The /cron output is now forced to UTF-8. This will still work for the latin1/iso-8859-1 default, but it will prevent browsers from corrupting the debug info.
  • [Audit Log] Tweaked the Audit Log slightly so it's capable of logging repeated headers (e.g. dual 'Subject:'). In the past it was just saying 'Array' as the value.
  • [Platform] All DAO::delete() calls will now properly bailout if the ID list they're given is empty. Normally this is not necessary, but there have been a few situations where users have cached URLs in their local browser that attempt to repeat actions (like deleting worklists or tasks).
  • [Knowledgebase] [CHD-1394] KB searches in tickets do not handle umlauts properly
  • [Open Ticket] [CHD-1398] Requesters are being dropped during transmission
  • [Parser] [CHD-1334] Encoded 'From:' addresses are not being properly translated into requester addresses.
  • [Parser] [CHD-518] The parser doesn't handle multiple 'Reply-To:' addresses.
  • [Group Inbox Filters] [CHD-1396] Criteria where number field equals zero evaluates to true with blank or non values.
  • [Mail] Fixed an issue where 'peek' editing of tickets would always set number custom fields to 0 if they were blank.
  • [Custom Fields] [CHD-1317] Inbox routing on multi-line custom fields does not match text on ONE line once line breaks are involved.
  • [Platform] [CHD-1411] Pressing 'F5' to reload Display Ticket on an unassigned ticket will mysteriously 'take' it for the active worker.
  • [Ticket] [CHD-1416] Error thrown when trying to sort by 'Interesting Words' column
  • [Mail Routing] [CHD-1418] Subject: and From: criteria do not appear in the summary
  • [Workspaces] [CHD-1129] Worklists will now properly remember their column sorting when you save in 'customize'. The sort order is also inherited when using the 'copy' functionality to build workspaces.
  • [Web-API] [CHD-1120] Ampersands in the "From:" field cause a warning message.
  • [Web-API] [CHD-1156] WebApi doesn't work properly with UTF-8 responses.
  • [Forum Explorer] [CHD-1369] Automatically synchronize forums by adding a new cron to the Scheduler in Configuration.
  • [Mail Routing] [CHD-1420] Body Content 'regular expression' help link is broken.
  • [Preferences] [CHD-728] Allow keyboard shortcuts to be disabled.
  • [Translation] [CHD-1421] Add translation support to My Account / General Preferences. (contributed by Robert Middleswarth)
  • [Web-API] [CHD-1422] /comments/create.xml needs to allow a 'created' timestamp.
  • [Web-API] Fixed an issue with 'POST /parser/parse.xml' and 'POST /parser/queue.xml' where CDATA blocks weren't being properly handled.
  • [Opportunities] [CHD-1429] Opp->Tasks tab shows all tasks rather than tasks linked to the displayed opportunity.
  • [Mail] [CHD-1428] Workflow list includes tickets from the inboxes of groups that have no assignable buckets.
  • [Mail] [CHD-1434] Fixed an issue with auto-replies not sending; which was introduced during the upgrade from SwiftMailer 3.x to 4.x.
  • [Mail] [CHD-1427] Add 'me' and 'nobody' shortcut buttons to ticket 'peek' for assigning the Next Worker.
  • [Opportunities] [CHD-1431] 'Notes' don't format output with newlines.
  • [Address Book] [CHD-1432] Increase the size of the 'Notes' text field for Organizations.
  • [Tasks] [CHD-1433] When clicking an Organization-based task, the link does not take you directly to that org.

New in Cerb 4.2.3 Build 925 (Aug 4, 2009)

  • [Usability] [CHD-1069] Workers are now sorted in alphabetical order based on first name (given name) rather than last name (surname).
  • [Watchers] [CHD-365] Superusers can now globally display and edit other workers' Watcher filters from Configuration->Watchers.
  • [Watchers] Watcher filters can now be set to disabled to preserve their setup while ignoring them. Previously, filters had to be either deleted or their actions had to be removed for them to not trigger.
  • [Watchers] [CHD-1249] Disabling a worker now properly disables their existing Watcher filters. The upgrade script will retroactively disable any filters with disabled owners.
  • [Watchers] Renamed "E-mail Notifications" to "Watchers" to remove ambiguity between Watchers (copies of mail) and Worker Notifications (ticket/task assignments).
  • [Watchers] Added the ability to bulk update Watcher filters from both Preferences and Configuration.
  • [Watchers] Watcher filters are now displayed in a sortable/searchable/pageable/customizable worklist. You can 'peek' to display their detailed configuration.
  • [Support Center] [CHD-1329] If a customer opens a new ticket and enters zero for a 'number' custom field then it will not be "saved" in the ticket.
  • [Mail Filters] [CHD-1333] Plugins can now contribute action extensions on Mail Filters to implement any kind of business logic. As mentioned before, the impetus came from Geoff on the Cerb4 forums asking for a way to look up the phone number from voicemail messages sent to the helpdesk by email and rewrite the 'From:' to the proper Address Book contact. You could also do a million other things, which we'll begin to share. For example: you could provide another level of spam filtering before any mail is accepted (e.g. SpamAssassin); you could verify a sender had an SLA; you could strip specific attachments; you could write the message body to strip excessive quoted content; and so on. (See: http://vimeo.com/channels/cerb4#5810661)
  • [Mail Filters] Pre-parser filters can now read and modify anything about incoming messages: attachments, headers, body. Previously all filters had to reject mail.
  • [Mail Filters] Pre-parser filters have a new "Stop, and Continue delivery" action that will stop processing filters without rejecting a message.
  • [Mail Filters] Pre-parser filters can now stack. This means you can have several filters with actions that each modify part of a message.
  • [Support Center] It's possible that Pre-parser Mail Filters may intentionally reject mail sent by 'Open Ticket' from the Support Center. A bug has been fixed in these situations so an error isn't displayed when attempting to display the newly created ticket ID.
  • [Mail Filters] Plugins can now contribute filter criteria extensions. This compliments the action extensions, as criteria can use any combination of characteristics from a message (body, headers, attachments) to determine if something matches, before handing it to actions to actually do it. A menu-driven interface will always be severely limited compared to what you can accomplish using a scripting language. Now you can create filters to match: combinations of SpamAssassin mail headers with specific values; messages containing 'magic phrases'; messages with specific attachments (that themselves contain specific content); messages that routed along a specific path; messages in specific languages that are detected heuristically; messages that correlate information from a 3rd party system (e.g. billing balance, LDAP); and countless other things. (See: http://vimeo.com/channels/cerb4#5810661)
  • [Watchers/Notifications] You can now have a Watcher Filter trigger a Worker Notification in addition to (or instead of) forwarding a copy of the matching email to the worker's private email address. This is especially useful when combined with the Fluid.app+Growl plugin, as you can set up desktop notifications based on any filterable criteria. For example: You could receive desktop alerts for replies to tickets assigned to you; or alerts for tickets opened by customers with an SLA; or alerts for tickets opened during certain days and hours (when you're on shift). The possibilities are endless. The ability to create Worker Notifications will also be handy when we push notifications through the Web-API and read it with various devices, like the iPhone.
  • [Mail Filters] You can now get/set any number of custom properties for Mail Filter criteria and action extensions coming from plugins. These properties will let you *reuse* criteria + actions across multiple filters, with the ability to configure them for each situation. It also means that developers can create and share plugins that non-developers can download and configure without needing to touch any source code. For example: If you want to make a custom action that sets a message header on matching mail, you can create two properties on *one* action that define the header name and the value to set. Without properties you'd have to profligately create an action per desired combination. (See: http://vimeo.com/channels/cerb4#5810661)
  • [Knowledgebase] [CHD-1324] Current KB page numbers are reused when going from topic to topic.
  • [Mail] [CHD-1322] Clicking '(peek)' on the source tickets from a merge throws an error.
  • [Support Center] [CHD-333] Allow manual sorting of Contact Situations display order.
  • [Support Center] [CHD-460] You can now require answers to certain follow-up questions from contact situations on Open Ticket by prefixing them with an asterisk (*). For example: "*Which product are you having trouble with?"
  • [Anti-spam/Bayes] Fixed several little issues with the anti-spam system. Forcing words to lowercase with various encodings could corrupt the text (only for spam analysis). The string functions for spam analysis have been converted to their mb_* (mbstring) equivalents. Words weren't always restricted to being composed of alphanumeric characters, which made it easier for some spam to look more unique than it should be (e.g. assorted Cyrillic characters were making it into words). It was possible for some words to be counted twice if their encoding had problems being converted to lowercase; now the word results will be forced lowercase even if they snuck into the database with mixed case. A database patch cleans up the 'bayes_words' table: unused words are purged; nonalpha words are purged; duped words are merged.
  • [Parser] Mail Routing now properly makes sure groups are valid. There were some cases where groups set as destinations could be deleted and mail would still try to deliver to them. A database patch resurrects these tickets.
  • [Mail Filters] Fixed an issue where Mail Filters wouldn't save if you removed all the actions.

New in Cerb 4.2.2 Build 921 (Jul 22, 2009)

  • [Worker Notifications] Added a per-worker cache for the number of unread notifications. This allows the GUI, API and various plugins to be more efficient.
  • [Worker Notifications] The number of unread notifications for the current worker will now be displayed as an alert in the top right on every page. This should really help with situations where worker notifications go unnoticed by workers who never return to the 'Home' page.
  • [Compose] The latest values for From/Subject/Closed/Worker will be carried forward between instances of the Compose "peek". This allows a much more efficient workflow when going through things like CRM opportunities.
  • [CRM/Opportunities] The selected tab will now be reused when paging through CRM opportunities. This makes it much easier to quickly cycle through opportunities, as you can now use '[' and ']' to navigate through the list without having to use the mouse to constantly select the proper tab.
  • [CRM/Opportunities] Added keyboard shortcuts to Opportunity->Display: (a) Address Peek, (q) Quick Compose. This helps make opportunity review and mailing much more efficient (less switching between keyboard and mouse).
  • [Translations] Most of the Address Book text is now properly translatable.
  • [Auto-Response] [CHD-1270] The #mask# token is not working with New Ticket
  • [Ticket Display] [CHD-1257] Clicking reply used to auto-focus the message body
  • [Mail] [CHD-1284] Search results on the same 'message_content' can return dupe hits
  • [Mail/Knowledgebase] [CHD-873] Add Knowledgebase lookup to 'log message' and send mail'
  • [Inbox Filtering] [CHD-1066] Prevent blank criteria inbox filtering rules
  • [Forums Explorer] [CHD-941] Add worker notification event for being assigned posts from the Forums Explorer
  • [Importer/ImpEx] [CHD-1261] Importer should support stripping tags from HTML messages
  • [Mail] [CHD-1264] Outgoing mail from the helpdesk (Send Mail) should always be marked Not-Spam
  • [CRM/Opportunities/Address Book] [CHD-1293] Address peek and "Quick Compose" dialogs do not display if the opportunity's email address contains a single quote character
  • [CRM/Opportunities/Address Book] [CHD-1292] plus (+) symbols in email address causes problems in contact peek and Quick Compose 'To:' line.
  • [IE7] [CHD-1295] Support Center "open ticket" form appears to run offscreen
  • [Chrome] [CHD-1296] Support Center CAPTCHA does not recognize matching text
  • [Platform] [CHD-1265] Always returned sorted lists of columns in the SearchFields_* classes (search, customize, filters)
  • [CRM/Opportunity] Added 'Quick Search' functionality to Opportunities in the Activity tab. It currently works for titles, e-mail addresses, and organization names.
  • [CRM/Opportunity] You can now change the scope on 'Opportunity->Mail History' to sender e-mail, organization, or sender domain. Your choice will become your new default when viewing new opportunity records. This makes it much easier to find out what you know about a lead even if they use variations on an e-mail address, or they're a second contact at the same company (using the same domain).
  • [Mail] Added the ability to set the scope of 'Display Ticket->Requester History' to sender e-mail, sender domain, and organization. Previously this was locked as the history of the sender e-mail address, which required people to run tedious searches if looking for a wider history scope.
  • [Translations] Most of the Home/Workspaces text is now properly translatable.
  • [Translations] The 'Feedback' plugin should now be fully translatable.
  • [Translations] The 'Forum Explorer' plugin should now be fully translatable.
  • [Translations] Most of the text from the CRM 'Opportunity Tracking' plugin should now be properly translatable.
  • [Web-API] [CHD-1301] team_id and team_name have changed on 'ticket' actions. (You can now access the properties as 'group_id' and 'bucket_id' when listing or searching)
  • [Translations] Most of the text related to 'Tasks' functionality should now be properly translatable.
  • [Translations] Most of the text for 'Time Tracking' functionality should now be properly translatable.
  • [Translations] Most text from the 'Fetch & Retrieve' plugin should now be properly translatable.
  • [Translations] Most of the text from the 'Google Custom Search Engine' plugin should now be properly translatable.
  • [Support Center] Form validation on Open Ticket by jQuery (required fields; valid email check).
  • [Support Center] Pre-submit CAPTCHA check. Text entered for the CAPTCHA will now be checked before the form is submitted to save the hassle of a full page cycle (and losing file attachments).
  • [Support Center] [CHD-1304] Multiple attachment support on Open Ticket. For this to work properly you *must* update your index.php file for any deployed Support Centers.
  • [Support Center] Authenticated visitors can now download attachments from their Ticket History. Security is in place to make sure the requested attachments belong to conversations the current visitor is a requester on (among other things).
  • [Support Center] [CHD-265] No password checking when registering a new account for the Support Center.
  • [Support Center] Client-side validation to verify the new password when updating from 'My Account'.
  • [Support Center] [CHD-620] Added the ability to create a block of header HTML for each Support Center, as a complement to the footer HTML option that already existed. The 'Logo URL' option per Support Center has been removed and any defined logo URLs will be automatically migrated to a block of header HTML when the upgrade runs. This allows much more layout flexibility. A blank block of header HTML will still show the Cerb4 logo by default.
  • [Support Center] [CHD-290] All the custom field types should be behaving in the Support Center now. Prior to 4.2.2, Worker/URL/Multi-Picklist/Multi-Checkbox weren't fully implemented. They now draw the right UI elements for customer data-entry when opening tickets, append their values to the email body, and automatically set the proper ticket-level custom field values. The URL/Date/Number custom fields will also have contextual validation enforced on the client-side (pre-submit).
  • [Tasks/Notifications] A notification will no longer be triggered for tasks that a worker creates for themselves. This had the tendency to get rather annoying.
  • [Support Center] You can now set the language to be used for each Support Center portal. This will localize the text on the public interface. It's up to you to make sure you localize the portal-specific properties like situations, header, footer, and page title. If a language isn't set, or the locale is invalid, then English will be used by default. Some English text may still appear if your language pack hasn't translated the Support Center yet; you can update the translation from 'Helpdesk Setup->Translations'.
  • [Support Center] The sidebar menu in the portal, built from the enabled Support Center plugins, is now properly translatable. Several other text fragments were also cleaned up (e.g. 'search' buttons).
  • [Support Center] [CHD-1303] When opening a new ticket, the custom field choices do not match inbox routing criteria.
  • [Custom Fields] [CHD-1315] Greater/Less than operators on 'Number' custom fields may behave strangely due. (Misplaced '$' on $intval() check)
  • [Group Inbox Filters/Custom Fields] [CHD-1314] Changed the 'operator' dropdown for text-based custom field criteria to read as "equals/doesn't equal" opposed to "matches/doesn't match". This should make it more clear that text-based criteria aren't doing substring matches by default. You need to add leading and trailing wildcards (*) if that's behavior you want.
  • [Browser] [CHD-1236] When editing filters (routing/inboxes/preparser/watchers) in IE6/IE7 the 'Message Headers' criteria has squished 'value' fields which are too small to type in.
  • [Support Center] [CHD-1283] Timezone difference on message when replying from transcript history

New in Cerb 4.2.1 Build 914 (Jun 10, 2009)

  • [Fetch & Retrieve] Added back Fetch & Retrieve (F&R) as an optional plugin. It adds a Configuration tab for creating topics and resources. It adds a Research tab for searching resources. It adds a Support Center module for allowing website visitors to search topics you specify in your Support Center profile. When enabled in the SC, you can also send customers to URLs like /support/resources/search?q=search+terms. If you had F&R enabled previously then your existing settings will be used.
  • [Support Center] Fixed a bug that prevented plugins from providing their own custom icons for the Support Center menu items.
  • [Notifications] Added DAO_WorkerEvent::getUnreadCountByWorker() to make it easier for plugins to display the number of unread notifications (assigned tickets/tasks, flagged comments/notes) for any worker.
  • [Translations] [CHD-1232] Recent builds will not change language
  • [Workspaces] [CHD-1243] Upgrade to 4.2 breaks existing group filter
  • [Mail] [CHD-947] Increase the custom ticket mask max length from 16 to 32+ characters
  • [Keyboard Shortcuts] [CHD-1240] Add shortcut support for the Mail->Search tab
  • [E-mail Notifications] [CHD-1253] Spam tickets are being forwarded
  • [Research] [CHD-1197] A default tab is not selected upon clicking the 'research' menu
  • [Support Center] Fixed an issue where it's possible to get an error message on the Support Center by enabling a module from a plugin and disabling the plugin without disabling the module.

New in Cerb 4.2 Build 910 (Jun 3, 2009)

  • [Platform] Did a major restructuring of the core files to reduce memory and increase performance. Devblocks should be lazy-loading (only processing as needed) on more of the uncommon functionality, which speeds up Ajax calls and the most common functionality.
  • [Platform] The '/update' controller is no longer part of the core plugin and is now part of the application. This change was long overdue, since the Update process is a bootloader that primes plugins and the database; it has to be able to run before they're in place, or when plugin changes make it impossible to run the app w/o processing the plugins first.
  • [Platform] Plugin manifests can now contribute to classloading and URI routing, which improves performance by allowing more lazy-loading. Requests that touch few objects (e.g. Ajax refreshing/pading a view) should be even faster now.
  • [Platform] Phased out the use of Zend Framework's Locale/Date/Translation classes. They were too heavy for the little bit we used, and as dependencies they created too many new issues to track down on updates.
  • [Config] Attachment names are now properly escaped when downloaded from the 'Attachments' tab in Config (if they include special characters like '&').
  • [Support Center] Some visual improvements to logo/footer/styles of the bundled themes.
  • [Address Book] Moved the address book pages (Orgs, Addresses, Import) into tabs and made the address book tabs an extension point. This will be used by things like Community Tools which will be able to add a view of Support Center registered users.
  • [Address Book] Added the ability to import values from CSV files directly into custom fields for Organizations and Addresses. There is an option to treat blank fields as 'unset' or 'skip'. This functionality is also conscious of the multi checkbox/picklist fields and will delta-set (add new values without changing existing values). New options provided for picklist style fields will automatically modify the custom field to add the new options.
  • [Research] Added a new 'Research' top-level page to group together knowledge resources like: Links, Knowledgebase, Fetch & Retrieve. This removes the emphasis from being entirely on the Knowledgebase, which is usually redundant to begin with (copied from blogs/wikis/forums/FAQs). Plugins can add new functionality to the research page.
  • [Platform] Moved the Knowledgebase and Fetch & Retrieve functionality into plugins. Installations that didn't make use of this functionality (based on having other processes in place) can now disable them.
  • [Research] Removed the 'Links' tab in 'Research' since we're likely not going to duplicate del.icio.us in Cerb when we can just write a plugin to use the dozens of social bookmarking sites out there.
  • [F&R] Deprecated and removed the 'Fetch & Retrieve' plugin for the time-being. There are much better ways to pull together the public search resources these days.
  • [KB] Combined the 'Browse KB' and 'Search KB' tabs into a single 'Research' tab for 'Knowledgebase'.
  • [KB] Added Topic Add/Edit/Delete from the Knowledebase tab in Research. The ACL priv for adding topics (separate from sub-categories) will allow privileged users to maintain the KB now without needing superuser access.
  • [Community Tools] Changed the terminology from 'Community Tools' to 'Community Portals'.
  • [Research] Added a new research plugin for 'Google Custom Search Engines'. This currently adds a new 'Google Custom Search' tab to Research and a button to the Ticket Reply toolbar for searching when doing support. In the near future this will also include a Support Center plugin to help customers find community content with a single search (broken down by source: forums, blog, docs, roadmap, etc).
  • [Google Custom Search] A tab was added to Config for 'Google Custom Search' where you can define your custom search engines to use during support.
  • [Localization] Configuration tabs from plugins are now properly translatable.
  • [Platform] Added Date/Time criteria in filters. This allows functionality dependent on the day of week (Sat+Sun) or time of day (8AM-5PM). This allows mail routing to be conscious of office hours and SLA schedules. This criteria works great as a sticky+stackable filter that can set ticket-level custom fields (Due+Priority) on all mail in Mail Routing (based on sender) and then defer to subsequent filters to actually move mail to the right group.
  • [Platform] Added message content criteria to filters w/ regular expression support. This scans a message line by line looking for matches on keywords or syntax. This was highly requested by people with example use cases like Paypal receipts for various products, where only the message body gives context about what the payment was for (same subject and 'To:'), and each product has a different group.
  • [Mail Routing] Revamped the Mail Routing area in Configuration. Now rather than being restricted to routing incoming mail only by To/Cc to group inboxes you can use the full range of filter functionality available to Inbox Filters: sticky, stackable, message headers, date/time, message body content, read/set custom fields. Existing rules will be converted to the new format by the update script.
  • [Mail Filtering] Added more filter functionality to pre-parser filters: sticky, date/time criteria, multiple 'To/Cc:' patterns, message body scanning. Since it's not possible to translate from the deprecated 'Group' criteria on Pre-Parser filters to proper e-mail addresses, you should update your filters in Configuration->Mail Filters if the destination group was an important criteria.
  • [Pre-Parser Filters] You can now use sender address and organization custom fields as criteria on Pre-Parser filters. This allows functionality like bouncing mail sent to a mailbox (911@*) w/o an SLA.
  • [Group Inbox Filters] Inbox Filters can now use the current Date/Time as a criteria.
  • [Group Inbox Filters] Inbox Filters can now scan the message content using regular expressions as a criteria.
  • [Mail] [CHD-1114] Ticket links clicked on from lists sorted by the value of a Custom Field return an "Unknown column: cf_X" error
  • [Mail Templates] [CHD-1121] #timestamp# not working in 'Open Ticket'
  • [Mail] [CHD-1138] One set of requesters dropped when merged tickets have a common requester.
  • [Mail Filters] Mail Filters/Routing/Inbox Filters stop counting after 32767 new messages. (JAS: Bumped to signed 3byte for 8.3M counter cap)
  • [Address Book] [CHD-1142] Organization 'notes' don't format output with newlines
  • [Custom Fields] [CHD-1157] Unable to use 0 (zero) as an option
  • [CHD-1094] Added cancel buttons to peek style popup windows:
  • Address Book -> Bulk Update
  • Mail -> Send Mail -> E-Mail Templates
  • Mail -> Open Ticket -> E-Mail Templates * -> Create Template
  • Home -> Add Worklist
  • Workspaces (tab) - > edit workspace
  • Address book -> Organizations -> bulk update
  • Address book -> Addresses -> bulk update
  • [CHD-185] Fixed bullet indenting issue in the installer license step in IE7.
  • [CRM/Opportunities] Added a .csv file importer to the Opportunities tab under Activity. It has full custom field support. You can identify duplicate records from the import using any combination of provided fields (e.g. email address PLUS campaign name custom field) which allows you to duplicate information (like email addys) in particular situations. There is also an option to mass assign all imported records to a particular worker (including hits on dupes). This should drastically improve the workflow of working with Opportunities that you import from external sources (mailing list signups, trials, etc.)
  • [ACL/Opportunities] Added a permission for importing CRM opportunities.
  • [ACL/KB] Added KB permissions for managing topics, categories, and articles.
  • [Performance] Major performance optimizations for lists of all types, but especially for ticket lists with thousands (or more) rows. Tested against 100,000s of rows. Custom fields used as displayed columns in all lists are also now far more efficient to retrieve.
  • [Performance] When we introduced multi-value custom fields (multi-picklist/multi-checkbox) we had added "LEFT JOIN" and "GROUP BY" statements to most DAO::search() calls (responsible for drawing all lists) to flatten the potential multiple values into a single row per ID, as you only want to see a single row per ticket/task/etc. On long lists (especially tickets) this was highly inefficient -- the LEFT JOIN had to scan every row for hits, and the GROUP BY had to flatten every row regardless of the number of results shown per page. Now all custom fields are joined to their parent object using more efficient subqueries (which the MySQL optimizer runs like an INNER JOIN at the end). Custom fields will still be LEFT JOIN'd (and a slow GROUP BY added) when a custom field is used as a criteria for a list. In such situations it's a very good idea to make your list as specific as possible (open tickets vs. every single ticket, applicable groups, etc).
  • [Performance] Removed the ticketgroup JOIN on tickets searches. The group name can be displayed at render-time using the cache (the same way buckets+workers are). This saves a bit of pointless redundancy on returning ticket lists.
  • [Performance] Removed 'interesting words' as a default column on ticket search results. This was only displayed as a tooltip on the spam button, and if this functionality is still desired it can be moved to an Ajax request. It was wasting ~255 bytes of memory per row which could be the difference between MySQL sorting on-disk or in-memory.
  • [Watchers] E-mail notifications are now handled like mail filters for super flexible workflow. The new notifications can use far more filtering criteria than just a group+bucket: date/time, incoming/outgoing, custom fields, ticket masks, etc. You can now have a single notification rule span any number of groups and buckets. You can also now exclude the 'groups' criteria to receive notifications about any group you're a member of (and you can filter those results by any other criteria). Notifications are now inherently stackable, meaning all matching notifications will send out e-mail; but only one notification will be sent to each unique e-mail address per event. At the moment that means you don't have to be too careful that rules don't overlap, but in the near future we may introduce explicit sticky/stackable options on notification filters when there are more actions than simply forwarding e-mail (e.g. stripping attachments, using a notification template for SMS, etc). This allows all kinds of new notification workflow: receiving 911@* notifications to SMS during the night shift; receiving notifications on a per-ticket/per-sender/per-org basis (especially useful for SLAs or watching an important issue).
  • [Platform] Added a new event point (ticket.comment.create) on the creation of new ticket comments. Initially it was needed by the Watchers plugin for notifications, but can now be used by any plugins for whatever purpose (audit log, etc).
  • [Watchers] You can now receive watcher e-mail notifications when new comments are added to tickets. You can filter with all the standard ticket-based criteria (e.g. new comments to tickets I own; new comments in Sales on Wednesday).
  • [Watchers] Improved the watcher e-mail notifications for new ticket assignments. You can now use all the ticket-based criteria to decide which assignments you want to know about, and what e-mail addresses to notify on a match. This allows new workflow like receiving ticket assignments by SMS when you're out of the office.
  • [Watchers] Added a new 'Assigned To' criteria to watcher e-mail notifications. This is especially helpful for situations where you're training, monitoring, or being mentored by a specific team member.
  • [CHD-1162] [Print] Bucket is not being included in print out on Display Ticket.
  • [Knowledgebase] [CHD-1163] Saving the KB article peek popup (create/edit/delete) now properly refreshes the underlying list of articles from browse or search.
  • [Tasks] [CHD-1164] Adding a new task with no title makes it impossible to edit. (Jeff@WGM: Saving will now enforce a default title if blank. For existing tasks the list will now dynamically provide a default title.)
  • [Custom Fields] [CHD-1157] Unable to set '0' (zero) as an option on multi-value custom field types (multi-checkbox, multi-picklist)
  • [Custom Fields] Added a new 'Worker' custom field type. This can be used for workflow like 'Account Manager' on Organizations and 'Approved by' on Time Tracking entries.
  • [Custom Fields] Added a new 'URL' custom field type. This can be used to add links to any supported object that will show up as hyperlinks in lists/peek/etc.
  • [Platform] Cleaned up a lot of redundancy in custom field and filter functionality. A lot more code is properly shared now, which will means we'll spend less time the next time we're adding new custom fields or filtering functionality.
  • [Support Center] [CHD-473] Support Center - Open ticket - auto fill the reply address, and make the subject field mandatory
  • [Support Center] Removed the concept of 'themes' from the Support Center (SC) since it was forcing disparity and redundancy that made it harder to introduce new functionality. In its place there's now the ability to override CSS styles from configuration per SC. We plan to have a bunch of example color schemes on the wiki. Our current focus is on allowing people to match the SC style to their company colors; but we're not focusing on enabling dynamic layout changes to the SC since it introduces unnecessary complexity in front of the upcoming SC plugins. The REST-based Web-API is still the best way to have 100% control over the implementation of your customer-facing interface. The SC is intentionally a cookie-cutter implementation good enough for most people's needs.
  • [Support Center] [CHD-454] [CHD-522] Major Support Center (SC) refactor. Modules now work like plugins, where each SC instance can choose what functionality to enable (Open Ticket + History; KB + Announcements). Consequently, the 'Public Knowledgebase' and 'Contact Form Builder' Community Tools have been deprecated and removed, since you can now create an SC that only provides that particular functionality. This removed a lot of redundancy and will help keep development speedy; and it also has the nice bonus of bringing all SC perks to the those portals (CSS, footer, custom fields, etc.) Existing Knowledgebase and Contact Form Builder community portals will be automatically converted by the update.
  • [Support Center] Plug-in modules are now entirely in control of rendering and saving their own configuration. The aggregated configuration of all modules is still shown seamlessly on the 'Helpdesk Setup->Community Portals' tab.
  • [Support Center] The Knowledebase functionality of the Support Center has been moved into a module controlled by the Knowledgebase plugin. Now if you disable the KB plugin the references to the KB in the SC will automatically disappear from all instances.
  • [Support Center] You can now give a nickname to Community Portal instances. Previously all the instances displayed as the name of the portal, such as "Support Center". This led to situations where you could have a list of ambiguous portals requiring several clicks to find the one you were looking for.
  • [Support Center] Modules can now control their own visibility, rather than requiring the messy hack of editing the plugin.xml manifest. This means that plugins can disappear not only by configuration toggles, but also in situations where they would have no content to display. For example, the KB module will hide itself from the module if no categories were set in config. Similarly, the 'Announcements' module will hide itself if no RSS feeds are set. This also allowed several other feature requests, like "Require registration/login to ____".
  • [Support Center] You can now reorder the modules in the menu per Support Center instance. This is especially useful with custom modules.
  • [Support Center] When visiting a Support Center without providing a module in the path, the default module will now be the first menu item. This is helpful for single module SC's, such as a portal that only shows the knowledgebase. The KB will now be the first thing you see.
  • [Support Center] [CHD-421] You can now require registration and login before permitting visitors to open new tickets.
  • [Support Center] [CHD-830] You can now require registration and login before permitting visitors to browse the knowledgebase.
  • [Support Center] [CHD-858] The 'Home' module now allows you to enter custom HTML content independent of the RSS feeds. This module is also optional, so you don't need to provide a welcome page unless you want to display additional content on your portals.
  • [Support Center] The RSS feeds from 'Home' have been moved into a new optional module called 'Announcements'.
  • [Support Center/F&R] At the moment, Fetch & Retrieve functionality has been removed from the Support Center. We're currently looking at better ways to accomplish the original global search goal of F&R (such as the 'Google Custom Search' plugin).
  • [Support Center] Brought the AbstractView functionality into the Support Center. This means any arbitrary list from any plugin can automatically inherit Ajax-driven paging and sorting functionality; saving a lot of tedious work on creating and delivering new content.
  • [Support Center] Implemented search functionality for the Knowledgebase module. Previously this functionality existed in the standalone 'Public KB' but the SC relied on Fetch & Retrieve. The results are shown in the new Ajax-driven views so they're easily paged and sorted.
  • [Support Center] The jQuery Javascript DOM/Ajax library is now in the SC scope and available to be shared by all modules and plugins.
  • [Support Center] More Look&Feel improvements to the Support Center. More styles have been moved into the global stylesheet and can be overridden from each portal's configuration. The menu will now highlight the active module to give some visual feedback on navigation.
  • [Community Portals] Refactored how the Community Portals handle sessions. The new 'UmPortalHelper' static class is now available to all portals and Support Center modules; it provides access to session, fingerprint, and the currently active portal ID. This simplifies a lot of functionality, including Ajax, and removes a lot of redundancy in various objects that each used to read/write the session directly.
  • [Support Center] Rather than providing rigid lists for 'Most Popular' or 'Recently Changed', all articles for the portal's selected topics are now displayed on the main page of the Knowledgebase module. They're sortable by most views or updated date. We'll still provide the ability to share RSS feeds with specific sorting from the KB.
  • [Community Portals] Community portals can now property pass query string arguments (?param=value) through the proxy. This is required for the new SC ajax functionality and you should update your deployed index.php files for any live portals.
  • [Knowledgebase] Fixed a bug in KB's DAO that allowed duplicate rows in results for some articles in multiple categories. This messed up totals in lists.
  • [Notifications/Filters/Mail] Any time mail is moved to a new group+bucket it will now behave like it was just delivered to the helpdesk (and notifications will be sent to the proper people). This may create a bit of extra SMTP traffic, but it was a very popular feature request; and it makes sense that 'new mail' notifications should be triggered when messages are manually moved to new groups+buckets. Based on the fact that mail moving into one group can trigger rules that move it elsewhere, this is a pretty complex piece of functionality to get right. We've attempted to only send the single notification at the end of a chain of auto-moves that may be prompted by various filters, but keep an eye out for odd behavior like superfluous notifications (e.g. "middleman" getting a notification in the workflow: Dispatch->Middleman->Support).
  • [Platform] Added a new extension point 'cerberusweb.renderer.postbody' to compliment the existing 'cerberusweb.renderer.prebody' point. These extension points allow plugins to respectively render content below or above the normal helpdesk output. For example, the Time Tracking plugin uses the 'prebody' point to render the floating for the stopwatch. This was a feature request from 'landre3567' on GitHub.
  • [Support Center] The new view functionality has been added to Ticket History Open/Closed lists as well. They're now pageable and sortable.
  • [Support Center] Added the ability for logged in customers to search their ticket history. The query will match message content or the left-hand side of ticket masks ("ab" or "abc" will match "ABC-12345-678").
  • [Support Center] Added more CSS styles for Ticket History elements, including differentiating between incoming and outgoing messages when displaying a specific ticket. We've had a lot of conflicting requests for adding visualizations to these messages, so now anything should be possible.
  • [Support Center] Added a global CSS style for elements in the Support Center. Browsers tend to draw buttons differently and it can make things look pretty horrible if the visitors' desktop styles dictate odd colors for buttons. The default will make buttons that look like the main Cerb4 GUI, but you can override the stylesheet per portal if you have something else in mind.
  • [Community Portals] The community portals will now pull their properties from the cache system when possible rather than querying the database constantly. There's a cache per portal so invalidation is efficient.
  • [Migration] The 4.2 patch will now enable the new KB plugin (which was always enabled in

New in Cerb 4.1 Build 877 (Feb 23, 2009)

  • [CHD-983] Apostrophes in translated strings can cause problems when not escaped ([JAS]: such as causing Javascript errors on tabs on Display Ticket).
  • [Platform] Updated YUI dependency to version 2.6.0
  • [CHD-979] [Tickets] Any replies made to a split ticket are threaded to the original ticket
  • [CHD-989] [Log Message] "Move this conversation" does not allow you to choose a bucket
  • [CHD-982] [DEMO MODE] Fixed more configuration tabs that could be changed in demo mode.
  • [CHD-988] [Mail] Encoded headers displaying in GUI on outgoing replies
  • [CHD-958] [Log Message] Using semicolons to separate requesters causes encoded string to appear in the to: header
  • [CHD-956] [Interface] Make the Helpdesk logo in the bottom right open a new window instead
  • CHD-1005: [Address Book] Fixed a bug with bulk update where selected "Only checked" with nothing checked would perform the selected actions for "Whole List"
  • CHD-573: [Address Book] Bulk update capability in Address book for 'set organization'
  • CHD-693: [Workers] Added the ability to disable workers without deleting them. You can list and search the history of a disabled worker, but you can't assign them any work, and they can't log in.
  • Updated Cerb4 branding
  • [Custom Fields] The platform has been expanded to support custom fields on any object type (tickets, orgs, addys, etc). Plugin-contributed objects can also take advantage of this functionality. Custom fields integrate with lists (filters/columns) and searches.
  • [Custom Fields] Custom fields now display on Address/Organization peek. They can be edited and saved all from the popup.
  • [Notes] A new Notes service has been added to the platform, allowing notes to be added to any object type (orgs, addresses, etc). Notes can also be added to plugin-contributed objects. This allows for a very social workflow where workers can log what they're doing (like tickets work) when an object otherwise has no dialogue going on (like organization records or leads worked in the past -- they were dead records; now they're not). This will be especially powerful with a couple more address book tweaks to allow quick next/prev navigation, along with the new org/addy custom fields which let you segment your huge address book easier.
  • [Address Book] Moved "Organization:Account #" field into a custom field rather than a Cerb4 hardcoded field. Any existing values will be migrated to the custom field. If the field wasn't being used by your helpdesk it will just be deleted and no custom field will be created. This process makes less assumptions in the app by default, which will be happening more often.
  • [Mail] Combined 'Display Ticket' Properties + Custom Fields tabs (less data entry clicking).
  • [Address Book] You can now send notifications to any workers when leaving a note on an organization record.
  • [Address Book] Bulk update is now available from the organization list in the address book. In addition to the common organization fields you can also mass set/unset custom fields on the entire list. This should make a lot of new workflows possible.
  • [Address Book] Next/Prev navigation has been added to organization records. This works just like tickets, where you can click into any row on a list and then next/prev around the set. Hotkeys of '[' and ']' are also supported.
  • [Address Book] When viewing Organization records in the address book, the basic contact details for the org are now shown at the top of the page without you needing to click into 'edit' or Properties. This should reduce needless clicks when looking for a street address, phone number, or website URL. This also makes it much easier to see when you need to flesh out the address book entry while navigating around.
  • [Address Book] When using 'peek' to look at an Organization record the 'Website:' field is now a hyperlink if a website is set for the record. This allows you to quickly open an org's website in a new browser tab/window, making it much more efficient when browsing your address book and updating records.
  • [Views] Filters using GROUP_OR or GROUP_AND will now display properly in the filter list.
  • [Views] Added an 'export' feature to the views system that allows any list to export its contents (across all pages) to XML or CSV files. The columns will default to the current view's configuration but can be changed at run-time for the export. Currently data is exported in the format it exists in the database, opposed to to the graphical version that appears in the GUI's rows.
  • [Search] All date range searches will now also include NULL if starting from 0/blank. This allows dates from custom fields and optional columns to show up in the results even when they aren't set yet (treating NULL like epoch).
  • [Usability] Added a quick 'clear' link to reset the column dropdowns on view customize/export.
  • [Parser] Added a new 'Body Charset' filter to the pre-parser mail rules. This will contain the value of the message body part (rather than the envelope found in the headers). Values will look like: iso-8859-1, utf-8, koi8-r, etc. Values are case-insensitive. This should make it much easier to set up mail rules to filter out spammy charsets that would never be readable anyway (such as Ukrainian spam in an English-only helpdesk).
  • [Feedback] Added the list export (XML/CSV) functionality to Activity->Feedback.
  • [Feedback] Added custom field support to feedback entries.
  • [Time Tracking] Added the list export (XML/CSV) functionality to Activity->Time Tracking.
  • [Time Tracking] Added custom field support to time tracking entries.
  • [Tasks] Added the list export (XML/CSV) functionality to Activity->Time Tracking.
  • [Tasks] Added custom field support to time tracking entries.
  • Moved the Address.Phone property into a custom field. This field isn't critical to the core app and should be optional. You can now remove it if you don't use it, or extend it if you do (fax/mobile/extension).
  • Phased out the 'Service Levels' functionality in favor of custom fields and the upcoming flexible SLA workflow. Organization records with the SLA field set now have a custom field for 'Service Level' with the values copied over. Service Level fields were dropped from Addresses and Tickets since the future SLA functionality will likely read from Organization and modify Ticket properties (including new custom fields). The Service Level idea was a step in the right direction but it was too limited.
  • [CRM] Brought the CRM plugin up to speed with the latest platform improvements (custom fields, notes, worker notifications, etc). Trimmed down 'opportunity' records to make data entry easier. Moved the main list of Opportunities into the 'activity' menu. Phased out Campaigns and Buckets in favor of custom field alternatives (since lead workflow is very subjective). Opportunities are basically tasks with a financial reward tied to them, and there's still quite a bit more we can do here to help people track this stuff.
  • [CRM] Opportunities: Display 'properties' tab now merges standard and custom fields. Custom fields are shown/editable on the 'peek' pop-up. Custom fields are fully integrated into Opportunity search/view. You can now bulk update Opportunity records from Activity->Opportunities (including custom fields).
  • [Custom Fields] All custom fields will now display as a "pretty time" in list cells (e.g. "2d ago") to save space. Hovering over the field will give a tooltip with the full date+timestamp.
  • [Address Book] Added Bulk Update to e-mail address lists. This includes the ability to mass set/unset custom fields.
  • [CRM] Added export functionality to the Opportunities lists.
  • [Custom Fields] Split the custom field storage tables into data types: number, string, CLOB. Previously they were all strings which was unnecessarily limiting (e.g. as strings, '9' is greater than '100', since ordering is lexicographical, and the length of the value doesn't factor in unless the left-most characters are identical. As true numbers this is fixed.)
  • [Custom Fields] Added a 'Number' type to custom fields. This can be used for things like 'Price($)' on opportunities, '# Employees' on organizations, etc.
  • [Platform] Moved a lot of redundant Custom Field functionality into Cerb+Devblocks. This makes it even easier for official and third-party plugins to take advantage of the custom fields service with minimal work. Docs to follow.
  • [Installer] Fixed an issue where the "mysqli" (InnoDB) driver would pass the server checker but then fail on trying to create the database. The "mysql" (MyISAM) driver is required.
  • [Mail] Added the ability to bulk set/unset custom fields on ticket lists.
  • [Tasks] Added 'Bulk Update' to tasks lists. You can also mass set/unset custom fields.
  • [Mail] CHD-174: When merging tickets the original masks should still forward to the new ticket.
  • [Mail] Merge tickets now properly merges ticket comments.
  • [Platform] Added a 'ticket.merge' event that plugins can use to update their data if tickets they link to are merged into a new ID/mask.
  • [Audit Log] Audit log entries will now properly merge when tickets are merged.
  • [Mail] Added tabs to the ticket "peek" popup to split 'message' and 'properties'. On the properties tab you can now edit more ticket properties including all custom fields.
  • [Feedback Capture] Added bulk update (with custom field set/unset) to feedback entry lists.
  • [Time Tracking] Added bulk update (with custom field set/unset) to time tracking entry lists.
  • [Address Book] Clicking an organization name from an e-mail address list will now show the 'peek' dialog rather than redirecting you to the address book page.
  • [Attachments Cleanup] Added bulk update to Config:Attachments. This should save the hassle of having to delete thousands of attachments in a huge list page by page (especially original_message.html, etc.)
  • [Platform] Fixed an issue in 'export' functionality on lists where the values contained XML entities (&, >, Community Tools.
  • [Community Tools] Fixed a bug in the SC/KB community tools where plaintext KB articles weren't properly handling linefeeds when displaying articles.

New in Cerb 4.0 Build 809 (Nov 26, 2008)

  • [Platform] Fixed an issue with clearing locale/translation caches when using memcached (opposed to the default of disk-based caching).
  • [Platform] Added better error checking to all DAO classes to deal with database schema issues.
  • [Time Tracking] The time tracking view will now show notes inline, rather than as a column. Org replaces the notes column to allow default sorting, peeking and setting of orgs from the list.
  • [Localization] Completed string externalization for translations for time tracking
  • Removed extra text on save button of the time tracking entry panel
  • [Config] Fixed a bug where new workers (from the Installer or Config) weren't having their e-mail address added to the database until they used it (e.g. in a comment). This led to some strange issues in functionality that depended on the address row existing -- such as automatic comments in time tracking or feedback tracking.
  • [Mail] Fixed a bug from the new translations work where the "---- forwarded message ----" banner on forwarded mail wasn't being translated and instead displayed as a string ID.
  • [Display Ticket] The 'Subject' header will now show up in the minimized short list of headers in the conversation history. Previously this required 'full headers'. Apparently some people actually reply to each other using only the subject line and no body.
  • [Anti-Spam] Fixed an issue finding interesting words in a message body that had no spaces. Now an e-mail containing just a URL should be digested properly.
  • [Translations] Externalized all community tools strings
  • [Feedback] Fixed bug in feedback module where attempting to add a feedback item over the limit resulted in a php warning being displayed
  • [Translations] Externalized the timetracking strings that were left in App.php
  • [CHD-831] [Search] Ignore surrounding white space from pasting Ticket ID's into text box
  • [CHD-832] [Auto-Response] Include #orig_body# token in close notification too
  • [CHD-914] [Auto-Response] Insert the New+Close Auto-Response tokens at the cursor opposed to appending
  • [CHD-865] [Config] 'Test Mailbox' fails if port is not specified instead of defaulting to 110
  • [CHD-514] [Auto-Response] Support more of the earlier-version e-mail tokens in templates
  • [CHD-827] [E-mail Templates] Can't insert Template from a specific folder (clicking the link does nothing)
  • [CHD-801] [Mail] Planned to eventually implement sending mail to multiple recipients with semi-colon separators
  • [CHD-863] Replace all instances of rand() with mt_rand() (better randomness, especially w/ Windows)
  • [CHD-889] [KB] There is a deprecated 'Import Articles' button left in the 'helpdesk setup' / 'Knowledgebase' tab
  • [CHD-906] [Worker] Forgetting to fill in the name fields when creating a new worker makes it impossible to edit later
  • [CHD-908] [KB] When creating a new article forgetting to add a title throws a PHP error
  • [CHD-910] [Feedback] Creating a blank "feedback list" in the setup section will create a blank entry that cannot be modified
  • [CHD-913] [Tickets] Surrendering a ticket does not clear the "assign until" date
  • [CHD-857] Option to set personal "from" as the responding worker (on a per group basis)
  • [CHD-886] Enclosing a URL in parenthesis within reply adds the closing ) to the link
  • [CHD-817] [Forums] No clear indicator that the checkbox next to a forum is used to delete it
  • [CHD-888] [Licenses] The 'buy license' links are not pointing to the actual buy page on the website
  • [CHD-776] [DEMO MODE] Certain 'helpdesk setup' tabs can still be modified
  • [Config] Removed the 'Storage' tab in Helpdesk Setup and moved that information to a new block in the 'System' tab.
  • [Attachments Cleanup Tool] Added a new 'Attachments' tab to Helpdesk Setup which will allow you to filter and browse all the attachments in the system. If you're a superuser you can delete any attachments in the list. This makes it much easier for admins to maintain their database size by purging large, outgoing, old, or specific types of attachments. For example, if you routinely send large redundant PDF files to your customers you can use this tool to find outgoing PDF attachments and remove them from the database and filesystem.
  • [CHD-822] Knowledgebase snippet missing in community searches
  • [CHD-813] Display CC and BCC (if present in full headers) on abbreviated view
  • [CHD-799] [Print] Add option to include comments and sticky notes in printout
  • [CHD-785] [Interface] Cron URL text displayed in Helpdesk scheduler links to a a URL appended with ?loglevel=3
  • [Worker Notifications] Added a new worker notification service that can be reused by the platform and plugins. On the 'home' page there is a new primary tab called 'Notifications' which provides a history of: ticket assignments, task assignments, new comments, new notes. Clicking these notifications will take the worker to the specific content that originated the note (e.g. a ticket's display page). Anything that's clicked is automatically marked as 'read' to reduce busy work (and eventually the read items will be auto-purged during maintenance). On the way: A single RSS feed for all notifications; e-mail from any notification (not just tickets); task reminder/overdue notifications; ticket overdue notifications; ticket customer reply notifications; SLA notifications.
  • [Tickets] You can now choose to notify specific workers when leaving a comment or sticky note on a ticket.
  • [L&F] Testing a stylistic change in lists by making links a darker gray to reducing some of the blue monochromatic overload. The color does get distracting, especially on Mail->Overview. A darker gray is more subdued but still makes it easy to quickly differentiate rows in a list.
  • [CHD-777] When replying to a watcher/notification e-mail, allow attachments to be sent/added to the ticket.
  • [CHD-737] [Parsing] Escaping the plus symbol behaves differently with Mail Parser vs Inbox Filtering
  • [CHD-744] Last action incorrect after merge
  • [CHD-915] [Parser] E-mail headers with QP/UTF-8 content aren't decoding properly. The subject line is handled separately and does.
  • [Parser] Fixed an issue in UTF-8 mode where converting an HTML-only e-mail to plaintext would die on 8th bit ASCII entity characters ( , etc; not &).
  • [Parser] Fixed a bug where blank subjects were possible again because of whitespace from removing invalid characters.
  • [CHD-744] Last action incorrect after merge.
  • Fixed the merge problems that still existed after being fixed earlier this week. The merge was using the updated date, last worker id, last wrote id, and last action code from the newest ticket (by created date). The problem was that it's completely possible that the oldest ticket (by created date) could have the last action/updated date etc.
  • [CHD-899] The installer/requirements can't complain properly about missing paths since Cerb4 tries to report them with realpath()
  • [CHD-836] Passwords with some special characters break mail account tester
  • [CHD-823] WordPress Atom feed not working right in F&R
  • Externalized the "more from" link for fetch and retrieve resources
  • [RSS] Added the ability for all lists to export RSS feeds. Currently tickets, tasks, and worker notifications implement the ability. It's trivial to add it to anything else that's suggested in the future (including anything provided by plugins).
  • [CHD-926] PHP Notice in api/app/Parser.php
  • [CHD-928] [Attachments] A couple of the search filters do not load properly
  • [CHD-875] [Mail] Ability to "close until" without reply
  • [Mail] You're now able to choose a "close until" date for both "waiting" or "closed" tickets. Previously this option was only available for closed.
  • [Mail] You can now choose from all the status options (open/waiting/closed/deleted) when changing ticket properties. This now works like the "Next" option when replying to mail.
  • [CHD-938] [Mail] Make the L&F of Log Message and Send Mail consistent with Ticket Reply.
  • [Platform] Added extension points for Send Mail and Log Message toolbar items.
  • [Mail] Fixed a bug that prevented the 'Move Bucket' next action from happening on Send Mail or Log Ticket. This wasn't very noticeable on both since they choose the bucket in the TO/FROM headers already.
  • [CHD-939] [Log Message] Timestamp does not use the correct timezone
  • [CHD-932] [Audit Log] "Assign Until" data is not formalized
  • [CHD-933] [Signatures] Tokens are not being inserted at the cursor
  • Reply With Quote

New in Cerb 4.0 Build 781 (Oct 31, 2008)

  • [Reports] Fixed bug where Top Created Tickets by Contact report was not always displaying the data table in the correct order.
  • [Forum Explorer] Added a button that copies the original URL for a forum post to the clipboard.
  • [Reports] Fixed bug in group replies report where all replies were showing up as being in the inbox category of their respective team instead of the correct category
  • [CHD-820] Fixed bug in the modify POP3 account config form where the checkbox for "enabled" submitted the ID of the record instead of 1 when it was checked. (JAS: The consequence of this was the ID could overflow the tinyint storing 'enabled')
  • [Importer] Added support for importing knowledgebase articles. Articles can define multiple categories to be placed in, and these categories (to any nested depth) will be created if they don't already exist. If any categories overlap they'll be reused, and only create new category branches where necessary.
  • [Importer] Added support for importing organization records.
  • [Importer] Added support for importing contact records. Contacts that provide an Organization will be automatically linked to that record if it exists. The org record will be created if it doesn't exist. Support is also provided for importing contacts with existing Support Center passwords.
  • [Importer] The importer will make inbound ticket masks unique if they conflict with an existing ticket. It will add a suffix (e.g. -1, -2, ...) which allows the original ticket mask to still show up in searches.
  • [Importer] Fixed problem where importer was not parsing the from address on the first and last message correctly.
  • [Importer] Fixed bug on Kb importing where Category ids were not set correctly for articles created in a category that already existed.
  • [Importer] Fixed bug on Kb importing when checking to see if a category is new or an existing category, if a category didn't have a subcategory and was at the root level, that category's name was not checked (so it would keep re-creating the same category name in that circumstance)
  • [Platform] Added an extension point for Ticket Reply toolbar items.
  • [Workflow] The Display Ticket screen will now show the associated organization next to each sender. This makes it much easier to spot at a glance which senders need to be assigned to an organization. Senders will also display as the name on file; so if nothing is known beyond an e-mail address it will now only display the e-mail address (and not the contents of the "From" header). This is another efficiency-related tweak, since the previous way of displaying this information didn't make it clear what information was already known. After editing organization or sender information from the popup the headers of the displayed message will now also refresh immediately.
  • [Platform] genericAjaxPost calls can now add arbitrary listener events to be run after the POST returns successfully. This is especially useful for reusable plugin popup panels that need to trigger different behavior in the underlying interface based on where they were invoked.
  • [Time Tracking] Most of the time tracking plugin has now been implemented. This is still experimental. Activities have been added to categorize time (e.g. "Installations", "Troubleshooting", "Q&A") and they can be billable or non-billable and track an hourly rate for reporting. Time tracking entries can be linked to any object in the helpdesk (e.g. tickets, orgs, opps, calls). Currently the time tracking floating stopwatch can be started from Display Ticket (for general purpose ticket activities) and from Ticket Reply (for tracking time spent specifically on replies). A LOT of time has been spent on refinement of the time tracking process based on real world usage scenarios (and those things may continue to change for the better as more people experiment with it). A new tab is added to Configuration when this plugin is enabled.
  • [Time Tracking] In earlier pre-releases of the Time Tracking plugin, there was no way to resume the timer once stopped. Now when the timer is stopped, it remains visible and paused until a time entry is successfully created, and it can be easily resumed.
  • [Time Tracking] We're experimenting with pre/post events on time tracking entries. One of these experiments includes the automatic create of a ticket comment whenever a time tracking entry is logged from a ticket. This adds a note into the timeline without requiring more clutter in the 'Conversation' (and it will respect comment preferences about threading into the conversation or remaining on the 'Comment' tab).
  • [Reports] Added a time tracking by worker report
  • [Reports] Added a time tracking report for time spent per organization.
  • [Reports] Added a time tracking report for time spent per activity
  • [Time Tracking] Implementation of time tracking: page, search/criteria, view, peek panel, patch, translation strings, edit/delete
  • [Reports] The workers report now allows you to select which worker to show time tracking entries for. The default shows all workers.
  • [Reports] All time tracking reports now order the time entries by date
  • [Reports] Each time tracking report type now displays the worker, activity, and org for each time tracking entry
  • [Reports] Removed sub groupings in the worker group
  • [Reports] Cleaned up the look of the tables for the time tracking reports, added a background color to headers
  • [Reports] Added a report to export senders from a group or category (or all)
  • [Time Tracking] Added the 'timetracking.source' extension point so any plugin can contribute objects which time tracking entries can originate from (tickets, phone calls, tasks, opportunities/leads, things we haven't thought of yet). This makes Time Tracking into a platform service opposed to simply a feature for tickets.
  • [Time Tracking] Aesthetically improved the 'Time Spent by Activity' report as a working example for the other time tracking reports. Added a reference link to the source of the time entry (e.g. ticket #).
  • [Time Tracking] Changed the format of the worker and org time tracking reports to the more polished look of the activity time tracking report.
  • [Usability] Added 'Take' and 'Surrender' as contextual toolbar items and keyboard shortcuts on Display Ticket. When maintaining a list of tickets with Next/Prev, this saves a lot of time compared to having to click into the 'Properties' tab.
  • [Feedback Tracking] Added the 'Feedback Tracking (Experimental)' plugin. This plugin allows you to extract feedback from various channels and track it in the helpdesk. The rationale for this is that there are often decision makers who would benefit from seeing customer quote excerpts (e.g. praise/criticism/testimonials) without having to view entire tickets. Those decision makers may not be on the front-lines responding to e-mail; and that valuable feedback would be wasted when it's just archived with the ticket after only one worker reads it. When you enable the feedback plugin from Configuration, a new 'feedback' page will appear in the top menu, and a 'Capture Feedback' button will appear in ticket conversations (inside the 'more' menu for each message, by 'Reply'). There's also a nice usability trick: if you highlight some text from the e-mail before clicking the 'Capture Feedback' button then that text will be automatically inserted into the feedback capture form for you.
  • [L&F] Shrunk the 'Refresh' and 'Print' button labels on Display Ticket to reduce clutter. They're the most obvious buttons by icon.
  • [L&F] Added a more instructive icon for ascending/descending column sorting in views.
  • [L&F] Improved the style on ticket comments and sticky notes. They're now consistent with the rest of the layout of the conversation.
  • [Platform] Added a 'message toolbar' extension point. This allows plugins to create new buttons and controls in the "more" menu for each e-mail message in a conversation when displaying a ticket.
  • [Time Tracking] Modifying or deleting an entry from a Time Tracking list will now properly redraw the view.
  • [Feedback Tracking] Added the ability to associate a 'source url' with feedback entries. This is especially useful when feedback is coming from outside of the helpdesk (e.g. forums, blogs)
  • [Config] Added the ability to remove the active license.
  • [Platform] UTF-8 Support, finally! We now properly support UTF-8 encoding for foreign character sets. You need to convert your MySQL database to 'utf8' encoding and then set LANG_CHARSET_CODE ("utf-8") and DB_CHARSET_CODE ("utf8") in the framework.config.php file. By default the encoding will remain ISO-8859-1/latin1 (Western Latin) for existing helpdesks since that's the MySQL default. Check the wiki for more information. Special thanks goes to community forum members LudovicLange and rogerger for their work on exploring UTF-8 (among others!).
  • [Parser] Removed the code to the support the old import process (from dumping mail back to RFC-2822 with custom headers). Please use the new XML-based ImpEx tools going forward.
  • [Configuration] Fixed a bug with Helpdesk Setup->Groups->Add Group where the form controls would become unnecessarily disabled.
  • [Localization] Fixed encoding for helpdesk-generated tickets ("log message").
  • [Mail] CHD-869: Fixed an issue with inbox filters when more than one instance of a header existed (received, e.g. content-type). Now only one of them needs to match for the criteria to pass.
  • [Localization] The Cerb4 installer is now UTF8-aware. If you "CREATE DATABASE" with the 'utf8' charset in MySQL, Cerb4 will now automatically adapt the framework.config.php during installation. By default it will use latin1 (which can be converted later, though more tediously than using utf8 from the beginning).
  • [Mail] Fixed a bug where helpdesk-composed mail was including the group's prefix and mask in the official ticket subject. It's now properly only prepended to outgoing e-mail subjects.
  • [Localization] A new 'Translations Editor' plugin has been added. When enabled from 'Helpdesk Setup->Plugins' it provides a suite of tools for translating the helpdesk interface in new languages. This process is much more friendly to text that may have been contributed from 15 different plugin manifests. Plugin authors now just need to provide their strings.xml in 'en_US' (U.S. English) and anyone doing translation work can quickly find new text to translate with the 'Synchronize' button in 'Helpdesk Setup->Translations'. The ability is also provided to export any combination of languages or subsets of text, as well as import language packs created by other users or endorsed by the official project. Both Import and Export use industry standard "TMX" XML, which means they're compatible with many other third party translation tools you may wish to use; however, a lot of work went into making the Translation Editor completely self-contained. We still need to move a lot of literal text out of the templates and into the translation system, but all the difficult work is now done (along with the earlier UTF-8 improvements).
  • [Platform] Major overhaul for GUI translations. We're now using the new Devblocks translations layer, which is much more efficient about managing our plugin-contributed translation text. We've switched over to using official locales, so 'en_US' (U.S. English) is used as the default opposed to 'en' (English). This allows for region variations like "British English" or "Swiss German". Language strings are now cached per locale, which is much more memory-efficient when workers aren't utilizing all the possible languages. We also fixed some nagging translations issues in the template service. The template modifier {"string.id"|devblocks_translate} is now available, and it accepts variable arguments like vsprintf() using %s/%d tokens in strings. For example: {"activity.browsing"|devblocks_translate:$worker_n ame:$group_name} where "activity.browsing" is something like "%s is browsing %s tickets".
  • [Localization] Each worker can now choose a language preference from 'My Account'.
  • [CHD-513] Remove "Custom Fields" dropdown header where unnecessary.
  • [Usability] Fixed the "Tour" introduction so it shows up again on new installations and for new worker accounts.
  • [Usability] Improved the 'Welcome' page and removed some noise.
  • [Localization] The Display/Reply sections should be mostly translatable now.
  • [Localization] Completed string externalization for translations for the Forum Explorer plugin
  • [Localization] The ForumExplorer plugin is now translatable.
  • [Spam Analysis] Added a new 'Spam Analysis' plugin which will give more insight into how the anti-spam system is making spam/Bayesian probability judgements. It adds a new tab to the Display Ticket page that shows the original 'interesting words' as well as what the anti-spam system finds interesting about the message with its most current training (which is useful for looking at a newer pattern of spam that you hope to start catching).
  • [Reports] The e-mail addresses on the 'Spam by Sender' report are now clickable and provide the 'peek' panel. This gives quick access to banning top spammers.
  • [Anti-Spam] Added a few more common words (e.g. has, their, them) to the ignore list for anti-spam functionality. This helps the engine find more interesting words to base decisions on.
  • Added a new 'home' page dashboard to the top-level menu which shows the currently logged in worker's tickets, tasks, or forum posts. This should help with the situation where workers aren't being reminded of their tasks. The page has an extension point (cerberusweb.home.tab) so plugins can contribute new tabs to worker dashboards.
  • Added a new 'activity' page to the top-level menu which groups together task-related objects: time tracking entries, forum threads, tasks, and feedback entries. This objects didn't need to be at the top level, and this frees up room (and reduces clutter/discontinuity) in the global menu. The page has an extension point (cerberusweb.activity.tab) so plugins can contribute new tabs to the 'activity' area.
  • [Parser] Incoming mail with a future timestamp will now be replaced with the current date. This helps with issues where misconfigured mail servers contribute messages out of order in a ticket conversation.
  • [Parser] Fixed an issue where some quote-printable encoded subjects could still end up blank without a ticket subject to click on in lists. The '(no subject)' replacement will now be checked after header decoding.
  • [Tasks] The task list will now show task comments without you having to 'peek' into each row.
  • [Localization] Completed string externalization for translations for the simulator, watchers, and webapi plugins
  • [Parser] Added the mb_decode_header() function to the parser to deal with multibyte headers. It will gracefully degrade to the standard imap_* classes. The parser will now also scrub any invalid characters from header fields based on the current encoding (usually provided by spam to cause trouble).
  • [Workflow] The 'mail' menu is now visible from Display Ticket. This provides one-click shortcuts back to overview, workspaces, search, log ticket, and send mail.
  • [Anti-Spam] When running in UTF-8 mode, Cerb4 anti-spam will now downgrade accented characters to their 7-bit equivalents. This combats tricks that spammers use to make words more unique by adding random accents/umlauts/etc. This doesn't affect how e-mail is displayed or stored, simply how it's processed for a spam decision.
  • [Anti-Spam] Fixed a bug in the anti-spam engine that wasn't adding a delimiter between subject line content and message content. This means the last word of the subject and the first word of the email were being combined in a new word (and either word was ignored independently). This probably wasn't doing much harm, but it was depriving the anti-spam engine of more useful information.
  • [Audit Log] The dates in the Audit Log list are now displayed as human-readable text instead of epochal Unix timestamps.
  • [Config] Fixed a small issue where a logged in user editing themselves didn't update their name and titled cached in the session. This manifested most commonly in e-mail signatures and lasted until a logout/login.
  • [Reports] Externalized strings throughout the reports plugin for translations
  • [Reports] Externalized strings for Time Tracking reports
  • [Reports] Fixed error that was displayed in ticket assignment report

New in Cerb 4.0 Build 726 (Aug 20, 2008)

  • [Pile Sorter] CHD-780: Nuked the 'always' option on pile sorting. The quick inbox fitlering '-add filter-' from an inbox view is the new best practice.
  • [Platform] The utility functions for quickly resolving e-mail addresses and ticket masks to internal IDs had a bug that would occasionally garbage collect a matching hit in the hash before returning the result. This should have been pretty rare, but it manifested more often during large imports or parser workloads.
  • [Scheduler] Added the ability to add the '&reload=n' argument to the URL on single scheduled tasks (e.g. /cron/cron.import?reload=5). Previously this was only allowed when running the main '/cron' controller.
  • [Reports] Changed the worker reply report chart to a horizontal bar chart that automatically expands its height based on the number of records it needs to display
  • [Reports] Ticket created report now displays a bar chart showing the total tickets for each group over the time period specified. It also now automatically expands/contracts its height based on the number of records it needs to display.
  • [Reports] The default start and end dates are now visible in the textboxes when the page loads for the ticket created, and worker reply reports.
  • [Reports] Added shortcuts for past year ranges for the Created Ticket and Worker Replies reports. Also added a 'today' shortcut.
  • [Reports] Added a 'Top 100 Spam/Nonspam Words' report.
  • [Reports] Added Top 100 Spam/Nonspam Senders report
  • [Reports] Added Top 100 Spam/Nonspam Domains report
  • [Reports] The 'Created Tickets' report will no longer count probably spam in the totals.
  • [Reports] Added Reports: Group Replies By Date, Open Tickets By Group, and Closed Tickets By Group
  • [Importer] Added better error checking and validation for the data provided in imports. Especially e-mail addresses.
  • [Scheduler] Added more thorough trace output to the Maintenance scheduled task logging.
  • [Reports] Added a new report that shows the most tickets created by organization or address
  • [Reports] Added Worker History Report which displays and links to every ticket an agent replied to for each day
  • [Reports] Created a report to display the oldest open tickets for each group
  • [Reports] Created a report to display tickets waiting counts by group
  • [Reports] Changed the open tickets report to filter out waiting tickets, and to allow searching by a date range.
  • [Reports] Added the category breakdown and cleaner formatting for the group replies report
  • [Reports] Added a new Report 'Ticket Assignment'
  • [Reports] Fixed bug where closed tickets report and top contacts tickets popup calendars were not showing up
  • [Reports] Added address/organization level totals to the top contacts report. Also fixed problem where totals could be inconsistent between the chart and report if the helpdesk had tickets not associated with any group.
  • [Reports] Added a 'Shared E-mail Domains' report to show which domains are used by e-mail senders across the most organizations.
  • [Importer] The importer will now add all superusers to the newly created group per import.
  • [Importer] Fixed a bug where the importer would combine duplicate bucket names from different groups.
  • [Platform] When the build number changes on update, the plugins will be re-read from disk at the same time the caches are flushed. This will solve issues where people had to navigate to the 'Plugins' tab in Configuration to see some plugin.xml changes.

New in Cerb 4.0 Build 687 (Aug 6, 2008)

  • [Mail] CHD-740 Deleting ticket sends closed autoresponse
  • [Mail] Closed ticket auto-responses always sending now (instead of honoring the 600-second wait period for other auto responses)
  • [Importer] Progress on ticket imports in the Cerb4 universal importer
  • [Reports] Refactored the reports page. Plugins like Time Tracking or CRM can now contribute their own Report Group and Report extensions to the main reporting page. This makes the reporting area much more reusable, and opens up the ability to create detailed reports for specific needs without cluttering the app.
  • [Reports] Added a Group Rosters report.
  • [Platform] Added a logging service to DevblocksPlatform.
  • [Scheduler] The /cron controller can now accept '&reload=' and '&loglevel=' query parameters. By default, /cron will no longer auto-refresh or show output. This will allow people to use the crontab error reporting properly instead of sending all output to /dev/null and never knowing about trouble. With &reload you can specify the number of seconds to auto-refresh the page when running scheduled tasks in the browser -- which is especially helpful for attended imports. With &loglevel you can specify the minimum priority of logging events to display. Typical levels would be 3 (errors and worse), 5 (warnings and worse), 6 (info and worse) or 7 (full debug and everything).
  • [Scheduler] In line with the /cron and logging changes, the Config->Scheduler area will automatically provide /cron URLs with the &loglevel and &reload set to contextually-useful values.
  • [Pre-Parser Rules] CHD-722: Auto-check header rule checkbox upon typing in the field
  • [Usability] CHD-742: "Close" button in pop-up windows may lead to confusion with actually closing tickets (Jeff@WGM: Changed the buttons to "Cancel")
  • [Usability] CHD-757: 'Updated' column is only being refreshed with current timestamp after moving ticket from display page. (Jeff@WGM: Fixed the inconsistency. On inbound/outbound messages will change the "Updated" column. Moving the ticket from Display Ticket will no longer reorder lists sorted on the Updated column.)
  • [Ticket Field] CHD-743: Creating long field names will result in "blank" entries in the database (Jeff@WGM: Updated the max length to 128 characters. Added a MAXLENGTH attribute to text input fields.)
  • [Group Config] CHD-746: Enforce email validation on Group Email Preferences e-mail address. (Jeff@WGM: The sender address in Group Config is now validated on form submit. Invalid values are discarded so the valid helpdesk defaults will take over.)
  • [Overview] CHD-744: Last action incorrect after merge (Jeff@WGM: The most recent action and sender of the merges will now be used on the destination ticket.)
  • [Parser] CHD-673: Autoreply marks tickets as non-spam (Jeff@WGM: Autoreplies will no longer be automatically marked as notspam when outgoing mail is sent. Tickets will still be trained as notspam when workers normally reply.)
  • [Search] CHD-478: Using a decimal in a date search param breaks the view (Jeff@WGM: The ticket search will now translate periods into dashes for date entry. Completely invalid input, such as random words, will be converted to a 'from' of the earliest possible date and a 'to' of the current time.)
  • [Mail] CHD-683: Preserve whitespace formatting in comments
  • [Mail] Message content, sticky notes and ticket comments now all use a fixed-width font to preserve whitespace formatting. Source code fragments, HTML snippets and structured data like XML should now display with much more readability.
  • [Notifications] CHD-291: Watcher e-mail attachments (Jeff@WGM: Attachments on incoming mail will now be proxied out to the watchers. The auto-generated original_message.html part is currently ignored.)
  • [Notifications] Watcher e-mail bounces will now route back to the helpdesk via the ReturnPath header, rather than sending to the original requester list.
  • [Notifications] You can now use watcher commands like [take] or [close] by replacing the entire subject line in your watcher response -OR- by appended the [command] to the end of the subject line.
  • [Notifications] CHD-578: Emailing Comments -- allow comment submission by email (Watcher Subject Command: [comment]) (Jeff@WGM: You can now instruct Cerb4 to treat your watcher reply as a comment by appending [comment] at the end of the subject line in your response, or by making "[comment]" alone the entire subject.)
  • [Tasks] CHD-613: Allow deletion of tasks (Jeff@WGM: You can now delete a task from the popup if you're the owner or a superuser.)
  • [Platform] CHD-593: If you invalidate the database login/pass and clear cache the installer will try to run instead of an error.
  • [Platform] Added better error reporting in the Devblocks Database Service if the database login details have changed externally.
  • [Parser] Improved the HTML to Text conversion for incoming e-mail that doesn't provide a plaintext part.
  • [Demo Mode] CHD-771: You can still manipulate POP3 mailboxes in demo mode. (Jeff@WGM: Fixed. I also made sure the POP3 password isn't displayed in the HTML form.)
  • [Usability] CHD-304 textarea tags causing issues in part of the helpdesk
  • [Usability] Typo in um.core/templates/portal/sc/internal/contact/step2.tpl.php
  • [Support Center] CHD-733: Handle reply address on a single contact situation
  • [Importer] Implemented full ticket importing (tickets with meta, messages, content, comments, attachments).
  • [Importer] Implemented worker importing
  • [Reports] Added the 'Average Response Time' report
  • [Reports] Added custom date range choosers to applicable reports, date validation
  • [Importer] Improved error handling and logging when parsing import XML files. Imported tickets will now be filed in their requested Group and Bucket. Currently, the recommended process is having the exporter create a new temporary Group in Cerb4 for each source (e.g. Gmail, Cerb3, Cerb2). The original folders/queues/buckets in the source are treated as buckets under the tentative group in Cerb4. We'll be providing functionality to quickly move these imported tickets into the local helpdesk structure without triggering mail rules or events (which will be much faster, and won't generate a bunch of needless mail). We also now base64 encode the content blocks on imported tickets to work around issues with nested XML in message bodies, or non-UTF8 characters like MS Word's apostrophes.

New in Cerb 4.0 Build 662 (Jul 17, 2008)

  • [Web API] CHD-462: Clarifying delete of REST keys (Hildy@WGM: copied style from contact situations as it worked well)
  • [Web API] Comments update from Worker ID to Address ID change
  • [Mail Overview] New messages for the current worker will now show up highlighted in red in the 'Assigned' block of the sidebar.
  • [Platform] Typo in Model.class.php in CerberusWorker::isTeamMember
  • [Web API] Finished implementing worker-level access to tasks and tickets in REST API. Usage is exactly the same from the client side as the normal API, login is just the worker email address and md5 hashed password.
  • [Mail Overview] CHD-420: Add additional headers to the Inbox Mail Rules (Jeff@WGM: Inbox filters can now use all message headers as criteria. Various other helpful criteria have been added as well, like a To/Cc address checker. When clicking '-filter-' in an inbox ticket list, the popup will now pre-fill the standard criteria using the selected ticket as an example. The headers from the selected ticket are displayed to assist with advanced filter creation.)
  • [Notifications] CHD-559: Notification Reply-To address does not match group email address (Jeff@WGM: Watcher e-mails and notifications should now send from the proper group reply-to address.)
  • [Performance] Added DAO_GroupSettings to the cache manager.
  • [Platform] Fixed a bug where Devblocks was running older patches unnecessarily.
  • [Config] CHD-718: Allow SMTP timeout to be set in Outgoing Settings of Mail Server in Config (Jeff@WGM: added to config)
  • [Custom Fields] Added date picker to custom field date searches.
  • [Custom Fields] CHD-576: Search: Allow isnull checks (i.e. Custom Field X is empty)

New in Cerb 4.0 Build 642 (Jun 26, 2008)

  • [Performance] Fixed a major design inefficiency in our SMTP mail service. The SwiftMailer library allows for persistent SMTP connections during a request cycle, but our getMailer() service was creating a new connection every call. This meant places that are very e-mail send heavy, like watcher notifications and e-mail parsing, were creating and closing (n) SMTP connections during those processes. Originally this was because our getMailer() service allows run-time changing of SMTP servers, for either testing or to let each 'Group' use different SMTPs when necessary. Now, internally, our getMailer() service will hash the server parameters and maintain persistent connections to various servers for each page cycle where SMTP functionality is required. This should also help address the "Too many messages in one go?" SMTP error popping up occasionally.
  • [Performance] Added a new option to the 'Outgoing Mail' section of Helpdesk Setup->Mail Servers for setting the maximum deliveries to attempt per open SMTP connection. After this number, a new SMTP connection will be created in the background. The default is 20. Fine-tuning this option will depend on your MTA (Postfix appears to have no limit, but other MTAs will limit the number of messages sent per connection). If you have trouble with this, set it to 1.
  • [Platform] Updated several dependencies to their latest stable versions: YUI, SwiftMailer, ADODB.
  • [Platform] Removed many YUI packages that we weren't using. This should chop off another 10MB or so from the download and installation footprint.
  • [Cron/Scheduler] You can now overload several /cron parameters at run-time. This is especially helpful if you're a host who is running multiple instances of Cerb4 for clients and you also manage their crons. On our machines at WGM, we have hundreds of hosted helpdesks firing up their maintenance job at the same time (midnight, the default). We also have some clients who "helpfully" set their max parses or POP3 downloads to '999' while having a very slow POP3 server they're pulling mail from. These new overloads are added to the URL you're pinging with something like 'wget'. An 'ignore_wait' flag has also been added to force a scheduled job to run if it's unlocked and enabled, regardless of when it's scheduled to run. The new parameters are: &ignore_wait=0/1; &pop3_max=n; &parse_max=n; &maint_max_deletes=n;
  • Added fulltext searching to the message content field: booleans, boosting, wildcards, phrases.
  • Fixed wiki links in the app from wiki.cerberusdemo.com to wiki.cerb4.com
  • [Localization] Added per-worker timezone support. Workers can set their timezone from the 'My Account' link at the top right. Timezones will continue to default to the server time if not set. This should cover all date/time entry and displaying, such as entering "5pm" on a "Next worker until" date entry box.
  • [Scheduler] When you click 'Run Now' on a scheduled task (from 'Helpdesk Setup' on the 'Scheduler' tab), it will now run without regard for the current waiting time (but not if locked or disabled). This is the expected behavior.
  • [Platform] Updated the 'Smarty' dependency to the latest stable version.
  • [Performance] Fixed another minor issue in the cache manager that was expiring file system caches (the default) too early. This should boost page load times all around.
  • [Performance] Added worker preferences to the cache manager.
  • [Performance] Added ticket fields to the cache manager.
  • [Performance] Added group memberships to the cache manager.
  • [Performance] Added support for persistent MySQL connections in framework.config.php -- by default persistent connections are disabled.
  • [Performance] Added more database indexes where they were needed.
  • [Performance/Platform]: Optimized how Devblocks loads plugin-based controllers. This should give another small performance boost to everything.
  • [Platform] Fixed a tight coupling between DevblocksPlatform::getMailer() and CerberusSettings. The platform is now properly abstract and 'share nothing' again. As a consequence, a new method for loading the default mailer settings has been added to CerberusMail::getMailerDefaults(). This should be passed to getMailer() when the SMTP defaults are preferred.
  • [Performance] More optimizations on the nightly maintenance job.
  • CHD-716: Empty Date-type custom fields are prefilled with current datetime on display (fixed)
  • CHD-714: Deleted worker does not update Inbox rules (fixed when deleting workers, and added to nightly maintenance to fix any broken record relationships)
  • CHD-717: Headers that are duplicated cause problems when adding requesters (fixed, applied Hildy@WGM's patch)
  • CHD-719: Support Center - Checkbox custom fields submitted unchecked result in values being saved for the wrong fields (fixed)
  • CHD-721: [Send Mail] Template tokens are not replaced (fixed, the token dropdown options in compose templates were flipped with reply tokens)
  • CHD-631: POP3 Mail Checker scheduler job name can be misleading if helpdesk only checks IMAP mailboxes (renamed the scheduled jobs so they're more descriptive)
  • CHD-580: [Custom Fields] One more tiny place they are still referred to as Ticket Fields (renamed)
  • CHD-596: [inbox mail rules] 'No training data available' has an outdated reference to Super Sort (renamed)

New in Cerb 4.0 Build 623 (Jun 12, 2008)

  • Added address and address_auth entity support to the WEB-API.
  • [Pre-Parse Rules] Added the ability to match NULL/blank headers. For example, if "Header from=" and "Header subject=" then blackhole.
  • [Pile Sort] Reporting spam from the pile sorter will now also delete the messages after training.
  • [Parser] Fixed a bug where HTML-only replies (primarily from mobile devices like the Blackberry) to inbound/outbound notifications were being received by the helpdesk and proxied to customers with blank message bodies. The functionality for generating a plaintext part from an HTML-only message has been moved into an earlier stage of parsing.
  • CHD-605: mime-encoded filenames were resulting in attachments that couldn't be retrieved.
  • Added task entity support to WEB-API
  • CHD-496 Close Ticket Auto-response
  • Minor L&F tweaks (logos, global menu)
  • Improved usability on the 'Available' sidebar on Mail Overview to allow quicker access to the '-All-' list for any group. Also added an 'expand all' link to show the buckets for every group in a single click.
  • More caching performance tweaks (DAO_Worker::update() premature cache invalidation) -- optimized DAO_Worker::logActivity() to not flush cache since it's used every page load.
  • Update dependencies to ZendFramework 1.5 (better memcached support, glob() fixes, REST/JSON). Moved ZendFramework into the local repository to help with the occasional problems people have when Zend's SVN is unavailable.
  • Tidied up dependencies (ADODB/ZendFramework) and removed a lot of the components we weren't using. This should help shrink the ZIP download, and speed up SVN updates.
  • Added support for distributed memcached caching. You can add multiple memcached 'host:port' entries in framework.config.php now. Also added cache prefix support to the caching service in Devblocks so multiple instances of an app can share memcached hosts.
  • Added ignore_user_abort() in framework.defaults.php to help prevent partially written records when the web client aborts the loading of a long running piece of code.
  • Added the beginnings of a universal import system (/storage/import). It's partitioned into /import/new and /import/fail, and works much like the /storage/mail system. A scheduled task can run to constantly sync imports in the background. Import records are XML, which will allow us to do things like combining an entire ticket (all messages, meta-data, etc) as a single object; which will clean up the hacky parser imports now. Eventually the global importer will offer an extension point so any plugin can allow its own objects (leads, invoices, etc) to be imported with practically no work. This seems like an ideal way to automatically sync content from outside the helpdesk (again, like invoices). Any process could dump import objects in the appropriate directory, which could be continuously imported in the background.
  • Added support for importing ticket comments as the first module for the new universal import system. A script to export Cerb3 comments to the appropriate XML is done and will be provided on the website and wiki.
  • Refactored the authors of ticket comments to be e-mail addresses rather than workers (though it's still the e-mail address *of* workers). This gets things ready for allowing helpdesks to show ticket comments in the conversation tab between e-mail based messages. The tweak also makes importing comments easier since we can't count on comments from external sources having another referable identifier for authors.
  • Comment authors from worker_id to address_id (for threading importing)
  • Added two new keyboard shortcuts to Mail->Overview: (a) all groups, (e) expand list. Since much of Overview involves those actions this tweak should help cut down on the tedious demand for mouse pointer finesse.
  • Improved the ticket comment system. Comments can now be displayed inline with messages in the ticket conversation as a worker preference (in 'My Account'). Comments will now auto-hyperlink URLs in their text.
  • Improved the layout and design of the Display Ticket area. Conversations now clearly show which messages are incoming or outgoing with an icon and a label. Message notes are less annoying looking. The message action reply/forward/note icons are more subtle. Renamed notes to 'sticky notes' to give a more clear idea of how they stick to a particular message and hold it open.
  • Fixed a minor bug with the code that turns URLs into hyperlinks when in message/note/comment content, where hyperlinks weren't being made if the URL was the last text in the block.
  • Streamlined the guided installer. The inbound mail, workflow and catchall steps have been removed since they're easier to set up from Configuration once the user knows their way around a little better. The installer will now prompt for the users own e-mail address and password when creating the initial login (which should help with a lot of support we get where people are mixed up about creating groups and workers up front). The installer will also set up a default Dispatch, Support and Sales group, each with their own 'Spam' bucket that's configured to quarantine at 85%. A welcome ticket will be generated so the helpdesk doesn't start completely empty. Replying to this welcome ticket allows a new user to get official support and learn how to use their helpdesk at the same time. The 'watchers' (e-mail notifications) plugin is now enabled by default. At the end of the installer the 'About Me' registration page is seamlessly integrated to allow users to register for a free license and direct support.
  • The 'Welcome' page (when the tour is enabled) is now much more helpful. It includes the same terms and definitions from the project website.
  • Updated the assist mode tour to match the current functionality.
  • Reply With Quote