The Calendar View extension allows developers to present date/time based preside object data in calendar view. The extension builds upon both Full Calendar and Bootstrap year Calendar, both open source JavaScript calendar tools, and provides Preside hooks to make it super convenient.
Requires Preside 10.9.0 or higher. Install with:
box install preside-ext-calendar-view
The extension provides a helper method for your handlers and views, objectCalendarView()
:
#objectCalendarView( objectName="my_object", args=options )#
Current arguments are:
eventAspectRatio
: controls the width to height ratio of a day block in the calendar. The default is 2.allowFilter
: whether or not to show the favourite filters bar above the calendar (rules engine filter favourites)calendarView
: which js calendar to show. Use calendarView=year
to show the Bootstrap year Calendar, or ommit/leave blank to use Full Calendar (default)publicView
: to render events for public audience, i.e. non-Admin users. This will hide admin favourite filter from being rendered, hence allowFilter
is not needed (and will be ignored) when this is setpublicFormFilter
: path to public form filter. This will render form filter above the calendarIn order for the calendar view to know how to render your object data, you must decorate your object with some special attributes:
/**
* @calendarStartDateField start_date
* @calendarEndDateField end_date
* @calendarAdditionalSortOrder label
* @calendarSelectFields label,type,status
*/
component {
// ...
}
calendarStartDateField
: (required) tells the extension what field to use for thecalendarEndDateField
: (required) tells the extension what field to use for the end date (can be the same as the start date)calendarAdditionalSortOrder
: (optional) events are sorted by start_date. Provide a further sort order string to define the sort order for events with the same starting date/timecalendarSelectFields
(optional, default is just the label field) tells the extension what fields to select when fetching data. These fields can then be used in custom renders for a calendar event (see below)./**
* @calendarStartDateField start_date
* @calendarEndDateField end_date
* @calendarAdditionalSortOrder label
* @calendarPublicSelectFields id,name,event_type.label as event_type,slug,group_concat( distinct region.id ) as region_ids
* @calendarPublicHandler admin.appEventViewer
* @calendarLinkKey appEventSlug:slug
*/
component {
// ...
}
calendarStartDateField
& calendarEndDateField
: (required) same usage as per Admin endpointcalendarAdditionalSortOrder
: (optional) same usage as per Admin endpointcalendarPublicSelectFields
: (required) fields to select when fetching data. Define as how you would for selectFields. These fields can then be used in custom renders for a calendar eventcalendarPublicHandler
: (required) path to custom handler endpoint which contains rendering functions for public view.calendarLinkKey
(optional, needed to render public event link) this builds custom URL. The notion in the example will be used in event.buildAdminLink( appEventSlug={recordid} )
with additional {recordid} replacement with record slug
field in processRecordsForCalendar()
The Calendar View extension uses the Data Manager customization system to allow you to make per-object and global customisations of calendar views. Customizations are focused on how to fetch and what data is fetched from the system to populate the calendar. Customizations are:
buildAjaxCalendarViewLink
Allows you to take over the logic for building the ajax link that will fetch recordsgetAdditionalQueryStringForBuildAjaxCalendarViewLink
Similar to buildAjaxCalendarViewLink
, but allows you to just add query string params to the URL. Often used in conjunction with preFetchRecordsForCalendarViewListing
or preFetchRecordsForGridListing
.preFetchRecordsForCalendarViewListing
Run before calling selectData
. The args
struct can be added to/ modified to change selectData()
arguments, i.e. add additional filters, etc.processRecordsForCalendar
This customization is given args.records
result from selectData
and should return an array of structs that will be passed back to the calendaraddCalendarEventFields
This customization is run per record and allows you to modify / add fields to a single record that will be returned to the calendar. This will not be used if you implement processRecordsForCalendar
.In addition, the extension also attempts to hook into core grid listing customizations so that you can use the same filter logic, etc. in your calendar as you do with your grid:
Customisation of the following functions has to be in the handler as defined in the object's @calendarPublicHandler
:
getAdditionalFiltersForAjaxCalendarPublicView
: required function for filtering records, if custom form filter is defined for publicFormFilter
processRecordsForCalendar
: same usage as admin viewaddCalendarEventFields
: same usage as admin viewAll Full Calendar configuration options can be passed in as dynamic values to the calendar initialisation. e.g. adding the month, agendaWeek and agendaDay views on the left side.
objectCalendarView(
objectName = "myPresideObject"
, args = {
config = {
header = {
left = "month,agendaWeek,agendaDay"
, center = "title"
, right = "today prev,next"
}
}
}
)
Can be setup via interceptor with the function preRenderCalendarViewlet( ... )
to define additional sources endpoint, and pass it via includeData
, i.e.
event.includeData( { additionalUrls = interceptData.additionalUrls } );
Configuration for Bootstrap year Calendar can be passed using yearConfig
.
Currently only monthCalendarUrl
is supported which can be used to provide a base url to link to Full Calendar. For example, to link to a particular day you could use:
objectCalendarView(
objectName = "myPresideObject"
, args = {
calendarView = "year"
, yearConfig = {
monthCalendarUrl = "www.yoursite.com/page-with-full-calendar/?defaultView=basicDay&defaultDate="
}
}
)
The selected day will be appended to the url.
When returning an array of structs for the calendar, all the fields that are implemented by FullCalendar are supported. See docs for full details: https://fullcalendar.io/docs/event-object.
In addition, the extension also allows you to set a htmlTitle
field that allows you more flexibility for rendering the title of a calendar item (the default implementation of title
escapes any html).
You can setup colour codes for different event types using this component. To use this, enable feature calendarManageColour
This comes with a helper function getCalendarItemColoursByLabel()
which can be called in processRecordsForCalendar()
Contribution in all forms is very welcome. Use Github to create pull requests for tests, logic, features and documentation. Or, get in touch over at Preside's slack team and we'll be happy to help and chat: https://presidecms-slack.herokuapp.com/.