Oracle Fusion Middleware Tag Reference for Oracle ADF Faces
11g Release 2 (11.1.2.0.0)

E17491-02

<af:calendar>

af:calendar calendar calendar

UIComponent class: oracle.adf.view.rich.component.rich.data.RichCalendar
Component type: oracle.adf.RichCalendar

Naming container: Yes. When referring to children of this component ("partialTriggers", findComponent(), etc.), you must prefix the child's ID with this component's ID and a colon (':')

Unsupported agents: pda

The calendar component provides the user the ability to view a user's activities by day, week, month, or list. The 'view' attribute controls whether day, week, month, or list is shown.

The 'activeDay' attribute drives the display range shown. For example to display the month of June 2008 in 'month' view, the activeDay must be a day in June 2008. The activeDay is also the specific date that will be shown in 'day' view.

The value attribute of the calendar component binds to an oracle.adf.view.rich.model.CalendarModel which contains oracle.adf.view.rich.model.CalendarActivity model objects, and the calendar knows how to render a calendarActivity. The public static method CalendarModel.isActivityInRange is provided as a convenience. You should use it when you need to decide if a CalendarActivity is in a certain date range, e.g., from your implementation of CalendarModel's method getTimeActivities.

The calendar does not control how activities are created, edited, or deleted, but it does fire events to allow you to wire up creating, editing, and deleting activities. As a convenience the calendar supports several facets, all of which should contain popups. There is more specific documentation about the facets in the "Supported Facets" section.

In printable page mode the list view is shown regardless of the value of the view attribute.

Activity Style Customization

The activityStyles attribute can be used to customize the look of an acitivty instance. The activityStyles attribute type is Map<Set<String>, InstanceStyles>. The InstanceStyles object in the map can return per activity styles. Please see the javadoc on InstanceStyles and CalendarActivityRamp for information on those classes.

So how do we set up the activityStyles attribute so that it returns the appropriate InstanceStyles object for a given activity? Let's say we have 3 providers, "Me", "Larry", and "Ted", and we want to show the activities for these as red, orange, and blue respectively. You would create a map with the following key/value pairs and bind it to the activityStyles attribute:

Key(String Set) Value (InstanceStyles Object)
{"Me"} CalendarActivityRamp.getActivityRamp(CalendarActivityRamp.RampKey.RED)
{"Larry"} CalendarActivityRamp.getActivityRamp(CalendarActivityRamp.RampKey.ORANGE)
{"Ted"} CalendarActivityRamp.getActivityRamp(CalendarActivityRamp.RampKey.BLUE)

Additionally you would set up the activities such that the string set returned from the getTags method matches the string set keys in the activityStyles map, for example:

During calendar rendering for each activity the renderer calls CalendarActivity.getTags to get a string set. The string set is then passed to the activityStyles map and an InstanceStyles object is returned (keep in mind that CalendarActivityRamp is a subclass of InstanceStyles), so in our example:

Drag and Drop

The calendar supports 2 types of dragging.

  1. Moving a calendar activity - in this case the activity is moved to a new start date/time. This type of drag and drop requires that a calendarDropTarget is attached to the calendar. If there is no calendarDropTarget then this type of drag and drop is disabled. See the calendarDropTarget doc for more information.
  2. Duration drag - in this case the end time is dragged to resize the activity. The calendarActivityDurationChange event is delivered when the user resizes an activity on the client. The activity is immediately moved/resized on the client and an event is queued on the server. You are expected to update the activity based on new end Dates. If there is no listener for CalendarActivityDurationChangeEvents then this type of dragging is disabled.

Geometry Management

Low Level Events

The calendar does not fire "high level" events, for example it does not fire specific events for edit, delete, create, context menu, etc. Instead calendar fires the "low level" Calendar and CalendarActivity events.

Let's take a calendarActivity. A calendarActivityEvent will be queued if the user does any of the following on a calendarActivity

Even though a calendarActivityEvent is queued for all these, you can tell these apart because keyboard, mouse, and triggerType information will also be available in the event.

Although you are free to wire up your own ui response (for example showing a popup) to an event, for convenience the component has several facets that have been wired to show for common ui gestures. See the "Supported Facets" section for details.

Geometry Management

Screen Shot(s)


calendar month view screenshot
Month view of the calendar component.


calendar week view screenshot
Week view of the calendar component.


calendar day view screenshot
Day view of the calendar component.


calendar list view screenshot
List view of the calendar component.

Code Example(s)

<af:calendar id="calendar1"
             value="#{calBean.calendarModel}"
             timeZone="#{calBean.timeZone}"
             activityStyles="#{calBean.activityStyles}"
             calendarDisplayChangeListener="#{calBean.displayChangeListener}"
             calendarActivityListener="#{calBean.activityListener}"
             calendarActivityDurationChangeListener="#{calBean.activityDurationChangeListener}"
             calendarListener="#{calBean.calendarListener}">
   <af:calendarDropTarget actions="MOVE"
                          dropListener="#{calBean.handleDrop}"/>
   <f:facet name="activityContextMenu">
      <af:popup id="p1">
         <af:menu id="m1">
            ...   
         </af:menu>
      </af:popup>
   </f:facet>
   <f:facet name="contextMenu">
      <af:popup id="p2">
         <af:menu id="m2">
            ...   
         </af:menu>
      </af:popup>
   </f:facet>
   <f:facet name="activityDelete">
      <af:popup id="delete" contentDelivery="lazyUncached">
         <!-- don't render if the activity is null -->
         <af:dialog dialogListener="#{calBean.deleteListener}"
                    affirmativeTextAndAccessKey="Yes"
                    cancelTextAndAccessKey="No"
                    rendered="#{calBean.currActivity != null}"
                    id="d2">
            ...   
         </af:dialog>
      </af:popup>
   </f:facet>
   <f:facet name="activityHover">
      <af:popup contentDelivery="lazyUncached" id="p3">
         <!-- don't render if the activity is null -->
         <af:noteWindow inlineStyle="width:300px"
                        rendered="#{calBean.currActivity != null}"
                        id="nw1">
            ...   
         </af:noteWindow>
      </af:popup>
   </f:facet>
   <f:facet name="activityDetail">
      <af:popup id="edit" contentDelivery="lazyUncached">
         <af:dialog rendered="#{calBean.currActivity == null}"
                    id="d3">
            ...                            
         </af:dialog>
         <!-- don't render if the activity is null -->
         <af:dialog title="#{calBean.currActivity.title}"
                    type="okCancel"
                    dialogListener="#{calBean.editDialogListener}"
                    rendered="#{calBean.currActivity != null}"
                    id="d4">
            ...
         </af:dialog>
      </af:popup>
   </f:facet>
   <f:facet name="create">
      <af:popup id="create" 
                contentDelivery="lazyUncached"
                popupFetchListener="#{calBean.createPopupListener}">
         <af:dialog title="Create New Activity" 
                    type="okCancel"
                    dialogListener="#{calBean.createDialogListener}"
                    id="d5">
            ...
         </af:dialog>
      </af:popup>
   </f:facet>
</af:calendar>
   

Events

Type Phases Description
oracle.adf.view.rich.event.CalendarActivityEvent Invoke Application The calendarActivity event is delivered when the user acts on a calendar activity, for example clicks on an activity.

PPR behavior: In general the calendar doesn't know if anything visible will change when this event is handled, for example if the start time is changed then the calendar needs to be ppr'ed, but if the description changes, then it does not need to be ppr'ed. Therefore in general the calendar does not add itself as a ppr target, the app developer must therefore PPR the calendar if it is needed.

There is one exception when the calendar will add itself as a ppr target, which is if the CalendarActivity cannot be found in the model. For example let's say 2 users are looking at the same data. User A deletes activity 1, then User B clicks on activity 1, but the activity has been deleted, so CalendarModel.getActivity will return null. In this case the calendar will add itself as a ppr target since the end user is trying to interact with an activity that is no longer available.

oracle.adf.view.rich.event.CalendarDisplayChangeEvent Invoke Application The calendarDisplayChange event is delivered when the calendar component changes the value of an attribute on the calendar. For example the view attribute may be changed from month to day if the user hits the day button in the toolbar. Another example is the next button in the toolbar is pressed, which causes the calendar to update the activeDay.

Note that when these attributes are set by the calendar they are only set locally on the component, and the component no longer pulls the value from the EL expression. This is common practice, for example when you click on the +/- on a showDetail, disclosed is being set locally on the component to true/false by the framework. In order to save these local values you must use the change management framework.

PPR behavior: Generally, if a calendarDisplayChange event is fired then the calendar will add itself as a ppr target. This is because if the calendar changes the value of activeDate or view, there is no doubt that the calendar will need to be re-rendered.

oracle.adf.view.rich.event.CalendarEvent Invoke Application The Calendar event is delivered when the user acts on non-activity, non-toolbar space in the calendar.

PPR behavior: The calendar does not get PPR'd automatically when this event is fired since the calendar doesn't know if anything visible will change when this event is handled. You must PPR the calendar in the event listener if the calendar needs to be re-rendered to show any visible changes, like if a new activity was created.

oracle.adf.view.rich.event.CalendarActivityDurationChangeEvent Invoke Application The calendarActivityDurationChange event is delivered when the user changes the duration of a calendar activity by resizing it.
org.apache.myfaces.trinidad.event.AttributeChangeEvent Invoke Application,
Apply Request Values
Event delivered to describe an attribute change. Attribute change events are not delivered for any programmatic change to a property. They are only delivered when a renderer changes a property without the application's specific request. An example of an attribute change event might include the width of a column that supported client-side resizing.

Supported Facets

Name Description
activityContextMenu the activityContextMenu facet is opened when you right click on an activity.

This facet should contain a popup, and the child of the popup should be a menu. If the content of the menu depends on the activity in some way then the popup should have the 'contentDelivery' attribute set to 'lazyUncached' so that cached values are not shown.

If this facet is specified a calendarActivityEvent will be sent to the server for the right click. If this facet is not specified, no event will be sent to the server for the right click.

There is no built in context menu functionality provided, all menu items should be added by the developer.

activityDelete The activityDelete facet is opened if the activity has focus and delete is pressed.

This facet should contain a popup, and the child of the popup should be a dialog. If the content of the popup depends on the activity in some way then the popup should have the 'contentDelivery' attribute set to 'lazyUncached' so that cached values are not shown. If you don't want to launch a popup when the user hits delete, then don't use this facet. If no facet is present a calendarActivityEvent will still be sent to the server and you can listen for a it and respond appropriately.

activityDetail The activityDetail facet is opened when you click or double click on an activity. It is also opened if the activity has focus and enter is pressed.

This facet should contain a popup, and the child of the popup should be a dialog. The popup should have the 'contentDelivery' attribute set to 'lazyUncached' so that cached values are not shown. If you don't want to launch a popup for click/double click/enter, then don't use this facet. If no facet is present a calendarActivityEvent will still be sent to the server and you can listen for a it and respond appropriately.

activityHover the activityHover facet is opened when you hover over an activity. This facet should contain a popup, and the child of the popup should be a noteWindow. The popup should have the 'contentDelivery' attribute set to 'lazyUncached' so that cached values are not shown.

If this facet is not present, then no calendarActivityEvent will be sent when the user hovers over an activity.

There will be a delay before this popup is opened such that it doesn't show up when the user quickly mouses in and back out of the activity.

contextMenu The contextMenu facet is opened when you right click on the calendar, except if you are in the toolbar or on an activity.

This facet should contain a popup, and the child of the popup should be a menu. If this facet is specified a calendarEvent will be sent to the server for the right click. If this facet is not specified, no event will be sent to the server for the right click.

There is no built in context menu functionality provided, all menu items should be added by the developer.

This facet can only be triggered by mouse clicks, therefore you must add custom toolbar buttons that trigger the same functionality if the calendar needs to be keyboard accessible.

If this facet is not present, then no calendarEvent will be sent for a right click in a free space area.

create The create facet is brought up when you click or double click on free space (not on an activity) on the calendar.

This facet should contain a popup, and the child of the popup should be a dialog. The popup should have the 'contentDelivery' attribute set to 'lazyUncached' so that cached values are not shown. If you don't want to launch a popup when you click or double click free space, then don't use this facet. If no facet is present a calendarEvent will still be sent to the server and you can listen for a it and respond appropriately.

This facet can only be triggered by mouse clicks, therefore you must add custom toolbar buttons that trigger the same functionality if the calendar needs to be keyboard accessible.

Attributes

Name Type Supports EL? Description
activeDay java.util.Date Yes The activeDay drives the display range shown, and must be changed in order to show a new display range. For example to display the month of June 2008 in month view, the activeDay must be a day in June 2008. The activeDay is also the specific date that will be shown in day view.

When the arrows in the toolbar are used, the activeDay will be changed. For example if the arrow is pressed when the activeDay is June 8, 2009 and the view is 'month' then the activeDay will change to July 8, 2009.

activityStyles java.util.Map Yes Allows per activity instance style customization. The type is Map<Set<String>, InstanceStyles>. The Set<String> being used for the map key will come from getTags() on CalendarActivity. The value is an instanceStyles object. Calendar skinning keys will be passed to the instanceStyle object and per activity styles returned.

For built in color ramps see CalendarActivityRamp.getActivityRamp, which returns a CalendarActivityRamp object, a subclass of InstanceStyles

attributeChangeListener javax.el.MethodExpression Only EL a method reference to an attribute change listener. Attribute change events are not delivered for any programmatic change to a property. They are only delivered when a renderer changes a property without the application's specific request. An example of an attribute change events might include the width of a column that supported client-side resizing.
availableViews java.util.List Yes Available calendar views. The built-in strings recognized are a combination of:
  • "all" - all built-in views the calendar provides - if "all" is in the list, other strings are ignored
  • "day" - if present, Day view is available in the calendar
  • "week" - if present, Week view is available in the calendar
  • "month" - if present, Month view is available in the calendar. Day view must also be added to allow the user to view overflow (+n more) activities.
  • "list" - if present, List view is available in the calendar
The view specified by the 'view' attribute must correspond to one of the entries in availableViews. Otherwise, the calendar will default to the first built-in view type in availableViews. The toolbar buttons which toggle the Calendar view will appear in the order specified in 'availableViews'. If there is only one view specified in 'availableViews', the buttons will be hidden.
binding oracle.adf.view.rich.component.rich.data.RichCalendar Only EL an EL reference that will store the component instance on a bean. This can be used to give programmatic access to a component from a backing bean, or to move creation of the component to a backing bean.
calendarActivityDurationChangeListener javax.el.MethodExpression Only EL a method reference to a calendarActivityDurationChange listener.
calendarActivityListener javax.el.MethodExpression Only EL a method reference to a calendarActivity listener.
calendarDisplayChangeListener javax.el.MethodExpression Only EL a method reference to a calendarDisplayChange listener.
calendarListener javax.el.MethodExpression Only EL a method reference to a calendar event listener.
clientComponent boolean Yes Default Value: false

whether a client-side component will be generated. A component may be generated whether or not this flag is set, but if client Javascript requires the component object, this must be set to true to guarantee the component's presence. Client component objects that are generated today by default may not be present in the future; setting this flag is the only way to guarantee a component's presence, and clients cannot rely on implicit behavior. However, there is a performance cost to setting this flag, so clients should avoid turning on client components unless absolutely necessary.
customizationId String Yes This attribute is deprecated. The 'id' attribute should be used when applying persistent customizations. This attribute will be removed in the next release.
dateCustomizer oracle.adf.view.rich.util.DateCustomizer Yes DateCustomizer allows for per date customizations such as string formatting.

Keys passed to the DateCustomizer.format method are

  • "af|calendar::day-header-row" : in day view, customize the day of the week in the header. For example, replace "Thursday" with "Thu"
  • "af|calendar::list-day-of-month-link": in list view, customize the text for the day of the month link. For example, replace "Jan 1" with "New Year's Day".
  • "af|calendar::list-day-of-week-column" : in list view, customize the day of the week in the left list column. For example, replace "Thursday" with "Thu"
  • "af|calendar::month-grid-cell-header-day-link": in month view, customize the date link labels in the cell header. For example, replace "5" with "-34"
  • "af|calendar::month-grid-cell-header-misc": in month view, add miscellaneous text to the empty area of the cell header. For example, on Jan 1, add the text "New Year's Day".
  • "af|calendar::week-header-day-link": in week view, customize the date link for each date in the header. For example, replace "Sun 1/1" with "New Year's Day".
dontPersist String[] Yes a list of attributes whose changes are NOT to be persisted by FilteredPersistenceChangeManager via the "Persistent Change Manager" registered in adf-config.xml. The token 'ALL' can be used in the list here to indicate that all attribute changes that the component implicitly persists should be excluded. If there is a conflict of values, "dontPersist" always precedes "persist".
id String No the identifier for the component. The identifier must follow a subset of the syntax allowed in HTML:
  • Must not be a zero-length String.
  • First character must be an ASCII letter (A-Za-z) or an underscore ('_').
  • Subsequent characters must be an ASCII letter or digit (A-Za-z0-9), an underscore ('_'), or a dash ('-').
inlineStyle String Yes the CSS styles to use for this component. This is intended for basic style changes. The inlineStyle is a set of CSS styles that are applied to the root DOM element of the component. Be aware that because of browser CSS precedence rules, CSS rendered on a DOM element takes precedence over external stylesheets like the skin file. Therefore skins will not be able to override what you set on this attribute. If the inlineStyle's CSS properties do not affect the DOM element you want affected, then you will have to create a skin and use the skinning keys which are meant to target particular DOM elements, like ::label or ::icon-style.
listCount int Yes Default Value: 14

This is the number of days to show in list view when the listType is dayCount. The default is 14.
listType String Yes Valid Values: day, week, month, dayCount
Default Value: dayCount

Drives which activities are displayed in list view.
  • day - activities for the activeDay
  • week - activities for the week that includes the activeDay
  • month - activities for the month that includes the activeDay
  • dayCount - starting with the activeDay, show activities for a certain number of days. The actual number of days to show is set in the listCount attribute. dayCount is the default.
partialTriggers String[] Yes the IDs of the components that should trigger a partial update. This component will listen on the trigger components. If one of the trigger components receives an event that will cause it to update in some way, this component will request to be updated too. Identifiers are relative to the source component (this component), and must account for NamingContainers. If your component is already inside of a naming container, you can use a single colon to start the search from the root of the page, or multiple colons to move up through the NamingContainers - "::" will pop out of the component's naming container (or itself if the component is a naming container) and begin the search from there, ":::" will pop out of two naming containers (including itself if the component is a naming container) and begin the search from there, etc.
persist String[] Yes a list of attributes whose changes are to be persisted by FilteredPersistenceChangeManager via the "Persistent Change Manager" registered in adf-config.xml. The token 'ALL' can be used in the list here to indicate that all attribute changes that the component implicitly persists should be included.
rendered boolean Yes Default Value: true

whether the component is rendered. When set to false, no output will be delivered for this component (the component will not in any way be rendered, and cannot be made visible on the client). If you want to change a component's rendered attribute from false to true using PPR, set the partialTrigger attribute of its parent component so the parent refreshes and in turn will render this component.
shortDesc String Yes the short description of the component. This text is commonly used by user agents to display tooltip help text, in which case the behavior for the tooltip is controlled by the user agent, e.g. Firefox 2 truncates long tooltips. For form components, the shortDesc is displayed in a note window. For components that support the helpTopicId attribute it is recommended that helpTopicId is used as it is more flexible and is more accessibility-compliant.
startDayOfWeek String Yes Valid Values: sun, mon, tue, wed, thu, fri, sat

Returns the start day of the week in week or month view. When not set this will default based on the locale, for example it may be Sunday in the U.S., but Monday in France.
startHour int Yes Default Value: 8

The start hour that is scrolled into view. Valid values are 0-23. The default startHour is 8.
styleClass String Yes a CSS style class to use for this component. The style class can be defined in your jspx page or in a skinning CSS file, for example, or you can use one of our public style classes, like 'AFInstructionText'.
timeZone java.util.TimeZone Yes The timezone to use for this instance. If not set, the timezone is pulled from the AdfFacesContext.
toolboxLayout String[] Yes Allows control over the layout of the toolbar.

The built in strings the component recognizes are:

  • "all" - all the buttons calendar provides by default - if "all" is in the list, the built in strings 'range', 'dates', and 'views' are ignored
  • "range" - the string showing the date range displayed
  • "dates" - the buttons that change the date: today, previous, and next
  • "views" - the view buttons: day, week, month, list
  • "newline" - means put the next thing on a new line
  • "stretch" - adds a stretched component

Custom toolbox content: when the calendar encounters a string in toolboxLayout that it doesn't recognize, like 'customToolbarXyz', it looks for a facet of that name and renders the content if it finds it. In the future new facets may be added to calendar. In order to avoid future name clashes strings starting with the word 'custom' should be used for custom facets. We make no guarantees for other names.

The toolboxLayout attribute allows the user to
  • add as many custom toolbars as desired, for example
    • toolboxLayout="customToolbar1 all customToolbar2"
  • stack as many toolbars as desired, for example
    • toolboxLayout="all newline customToolbar newline customGroup"
  • show multiple rows of toolbars. for example
    • toolboxLayout="customToolbar1 newline all"
  • reorder the button groups, for example
    • toolboxLayout="views stretch range dates"
  • remove toolbar content that isn't desired, for example the date buttons won't show up with this:
    • toolboxLayout="views"
unsecure java.util.Set Yes A whitespace separated list of attributes whose values ordinarily can be set only on the server, but need to be settable on the client. Currently, this is supported only for the "disabled" attribute. Note that when you are able to set a property on the client, you will be allowed to by using the the .setProperty('attribute', newValue) method, but not the .setXXXAttribute(newValue) method. For example, if you have unsecure="disabled", then on the client you can use the method .setProperty('disabled', false), while the method .setDisabled(false) will not work and will provide a javascript error that setDisabled is not a function.
value oracle.adf.view.rich.model.CalendarModel Yes the model providing activity data - must be of type oracle.adf.view.rich.model.CalendarModel
view String Yes Valid Values: day, week, month, list
Default Value: month

calendar view: day, week, month, or list. The default is month.
visible boolean Yes Default Value: true

the visibility of the component. If it is "false", the component will be hidden on the client. Unlike "rendered", this does not affect the lifecycle on the server - the component may have its bindings executed, etc. - and the visibility of the component can be toggled on and off on the client, or toggled with PPR. When "rendered" is false, the component will not in any way be rendered, and cannot be made visible on the client. In most cases, use the "rendered" property instead of the "visible" property.
Not supported on the following renderkits: org.apache.myfaces.trinidad.core