[Dashboards] Fixed a recently introduced issue with the query planner on chart widgets with 'all results' on one of the axes.
[Workspaces/Worklists/Code Cleanup] Fixed a rendering issue on worklist widgets.
[Code Cleanup] Fixed a PHP notice when using the configurable import for widgets or VA behaviors with a JSON 'path' that doesn't exist.
- [Calendars/Code Cleanup] Moved calendar event templates.  They were in a 'calendar' directory, rather than 'calendar_event', which was in the way once we introduced calendar records.
* [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 other 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] Deleting a calendar will delete any associated events or recurring event profiles.
- [Calendars/Code Cleanup] Moved shared calendars code from internal.php into an PageSection.
[Calendars] Converted calendar_event.owner_* and calendar_recurring_profile.owner_* to use a 'calendar_id' foreign key to link to a parent calendar.  Previously, calendar_event records were autonomous and owned directly.  The database migration script will convert these records and link them to a new calendar record for each worker.
* [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/Code Cleanup] Converted calendar profile and workspace tabs to use the new DevblocksCalendarHelper for their common calendar generation code.
* [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.
[Code Cleanup]
[Calendars] Creating or modifying a calendar from the peek popup will now display datasource parameters as the type is changed.
* [Devblocks/Platform/Code Cleanup] The timezone list returned by DevblocksPlatform::getDateService() is now provided by PHP's built-in timezone_identifiers_list() 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.