* [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.
[Code Cleanup] Refactored the MySQL Fulltext engine to use the internal Devblocks database class rather than using the MySQLi API directly.
* [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.
[Platform/Plugins] Fixed a bug in DevblocksSearchCriteria when using GROUP_OR or GROUP_AND with a combination of single and multiple parameters (e.g. GROUP_OR, [param1, [GROUP_AND, [param2,param3]], param4]).
 * [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.
Merge branch '6.7.8' into 6.8
Merged branch '6.7.8' into 6.8
Merge branch '6.7.8' into 6.8
Merge branch '6.7.8' into 6.8
Merge branch '6.7.8' into 6.8
Merge branch '6.7.8' into 6.8
[Code Cleanup]
* [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.
Merge branch '6.7.9' into 6.8