Booker25 multi dimension calendars have a context menu when the user clicks on a dimension record.
This menu can be customized by following these steps:
Create an Apex class that implements the System.Callable interface. For an example, see the code below.
Click on Setup and search for Custom Settings
Click on Manage next to System_Settings
Click New
For the name specify Calendar Context Menu Class
Enter the name of the Apex class from step 1 into the String value field
Click Save
Troubleshooting
While configuring your custom context menu, an error that you might run into would be 'class could not be instantiated:' (followed by the class name you entered in step 6 of the previous section). There are two common reasons for this:
You did not enter the correct class name into the custom setting. See step 6 of the previous section. Make sure to copy paste the class name to eliminate any spelling errors. Make sure there are no starting or trailing spaces.
The callable class has two parameters: a String specifying the action, and a Map<String, Object> with parameters. For the custom context menu the action will be contextMenu. The parameter map will contain one entry defaultContextMenu. This entry is a List of context menu items.
A single context menu item is a Map<String, Object> with the following keys
Key name
Type
Description
uniqueId
String
Unique id. Not required but provided for the default items so they can be identified.
label
String
The label shown in the context menu.
urlTemplate
String
The url that should be opened if the user clicks this item. This template can include a merge field {dimensionRecordId}. This will be replaced with the id of the dimension record the user selected.
hideIfNotReservable
Boolean
If true the entry will not be shown on non reservable dimension objects.
booker25AdminsOnly
Boolean
If true the entry will only be visible if the user has the B25_Admin permission set.
availableForDimensions
List<String>
The names of the dimensions where this entry should be show. If left empty it will be shown on all dimensions.
isBooker25CustomAction
Boolean
Some Booker25 actions are not just opening urls for these this property will be set to true and booker25CustomAction will be set to specify the custom action.
You can not add additional custom actions but any context entries with this property set to true and an existing custom action selected will work.
booker25CustomAction
String
The custom action this button should run. Currently two different actions are available:
expandReservationGroups will expand any groups of reservations that are collapsed and will only be visible if there are any collapsed groups.
collapseReservationGroups will collapse any expanded reservation groups and will only be visible if there are any expanded groups.
Default context menu
The default context menu consists of the following items
unique id
Type
Additional conditions
Description
SingleCalendarLink
Url
hideIfNotReservable
Opens the single calendar for the selected dimension record.
ViewInSalesforce
Url
None
Opens the dimension record in Salesforce
ViewInBooker25
Url
Dimension B25__Resource__c and booker25AdminsOnly
Opens the dimension record in the Booker25 UI
ExpandReservationGroups
Action
Only visible if there are collapsed groups in the dimension record row
Expands any reservation groups in the selected dimension record.
CollapseReservationGroups
Action
Only visible if there are expanded groups in the dimension record row
Collapses any reservation groups in the selected dimension record.
Example
This example updates the ‘View Calendar’ link to go to a specific calendar implementation with uniqueName customSingleCalendar.
It also removes the ‘View in Salesforce’ and ‘View in Booker25’ links.
global with sharing class CustomContextMenu implements System.Callable {
global Object call(String action, Map<String, Object> parameters) {
if (action != 'contextMenu') {
return null;
}
List<Map<String, Object>> defaultMenu = (List<Map<String, Object>>) parameters.get('defaultContextMenu');
// Update the single resource calendar link
for (Map<String, Object> menuItem : defaultMenu) {
if (menuItem.get('uniqueId') == 'SingleCalendarLink') {
String calendarName = 'customSingleCalendar'; // this must be the uniqueName of an existing calendar record
String urlTemplate = Page.B25__SingleResourceCalendarWrapper.getUrl() + '?recordId={dimensionRecordId}&calendar=' + calendarName;
menuItem.put('urlTemplate', urlTemplate);
}
}
// remove the 'View in Salesforce' and 'View in Booker25' links
Integer i = 0;
while (i < defaultMenu.size()) {
String uniqueId = (String) defaultMenu[i].get('uniqueId');
if (uniqueId == 'ViewInSalesforce' || uniqueId == 'ViewInBooker25') {
defaultMenu.remove(i);
} else {
i += 1;
}
}
return defaultMenu;
}
}