Re: Updated: Date Picker Widget

Hopefully this is close to the final revision. We'll give it a once over 
next week.

CB

Date Picker Widget

Purpose:
Choose a date as input in an easy to navigate manner. This widget does 
not address selection of time ranges within a date, which, in the web 
world, is often performed via a separate UI process.

Behavior:
Like other widgets the calendar widget receives focus to become active 
by tabbing into it. Once focus is received it is placed on today's date 
in a grid of days and weeks or the closest previously selected date. A 
grid embodies the same representational metaphors for both visual and 
aural navigation. This gives extra lift to the solution by aligning it 
with mainstream objects.

There are two modalities for selection:
Singleton - boolean
When true the calendar will only allow one date to be picked at a time.
When false the user can pick one or more ranges of date or multiple 
dates which are not contiguous.
Contiguous - boolean - only available if Singleton true
Expands Singleton case to allow selection of one range of dates

Navigation:

Arrowing up and down goes to the same day of the week in the previous or 
next week respectively. If the user advances past the end of the month 
they continue into the next or previous month as appropriate. Visually 
the grid might flip from month to month but feedback presents a 
continuum of dates. When passing the epoch of one month to another, the 
month entered should give feedback:

<Monthname>[<"NO"|XX> days selected.]

The days selected would only be provided in feedback if we are not in 
singleton mode.

Going left and right advances one day to the next, also in a continuum.  
Visually focus is moved from day to day and wraps from row to row in a 
grid of days and weeks.

Home takes you to the first day in a month while End takes you to the 
last day in a month.

PageUp advances a month and PageDown retreats a month. As mentioned 
before, advancing or retreating a month should give user feedback of the 
month along with selected days if not in singleton mode. When changing 
months focus should stick to the same date as the user cycles through. 
For example, if they are currently focused on 23 Wednesday April 2008 
and advance a month, they should sill be on the 23rd but in May, which 
is Friday. If the next or previous month have fewer days than the 
currently focused date, focus is moved to the last date in the month. 
For example, if focus is on May 31st and the user retreats one month, 
there is no April 31st so focus would be moved to April 30 instead. In 
any case the new date focused should be be provided in feedback to the user.

Control+PageUp advances a year while Control+PageDown retreats a year. 
The new year should be provided in feedback:

<Year>[<"NO"|XX> days selected.]

The days selected would only be given in feedback if we are not in 
singleton mode. The user focus should stick to the same month and date 
in the next year.

We do not need another shortcut for changing weeks because it is already 
available by pressing the up and down arrow.

We do not need another shortcut for going to the beginning or end of the 
week because requires extra cognitive load, implementation cost and 
provides low utility. On average the user only needs to arrow three 
times to reach the same destination.

Unavailability:

The widget should also recognize some dates as not being available such 
as weekends or holidays. The API is not defined here but should include 
exclusion of certain days of the week, dates in the past, ranges of 
dates and discontinuous sets of dates. These dates are provided in 
feedback as Not Available or Available as appropriate. We assume the 
user most often will be hunting for an open available date so we suggest 
providing feedback of Not Available early on so the user knows to just 
skip forward or back to another date. If the widget is instructed to 
make all dates in the past unavailable, if the user attempts a 
navigation method that would take them into the past, the widget should 
have an optional configuration to take the user to Today's date which is 
logically the earliest available date. This new date would be provided 
in feedback

"Dates in the past are not selectable"

in addition to the regular information about that date.

Feedback:

While navigating the user will need appropriate feedback in their 
localized language for the following attributes:

selected state
available state
set membership
position within a set
year
month
day
date

Guidance for what feedback is provided when has been integrated 
throughout this document. Generally feedback should be from 
specific/interesting to general/ordinary. Different ATs may want to 
expose preferences to reorder the elements or taper the verbosity.

Selection:

Pressing the space key selects a date.

In singleton mode this deselects a previous choice, if any. We assume 
the user knows what they are doing and deselection of the previous date 
is easily reversed so we do not provide feedback about this implicit change.

In non-singleton mode the space acts as a toggle so we could be either 
selecting or deselecting. For range selection the space nails down the 
tail of the snake and then shift+arrows moves the head to select a set 
of dates. This is similar to the keyboard behavior in selecting a range 
of text in a word processor. Pressing space on another date starts a new 
snake. As each date is navigated for the head we announce the date and 
the number of members in the set. If Unavailable dates are included in 
the range, they are not included in the count of selected days. When a 
change is selection is made the user should be given feedback:

Selected NumericDate DayofWeek Month NumericYear [X days selected]

In singleton mode, selecting a date may submit the widget as completed. 
When not in singleton mode enter is used to signal that work in the 
widget is complete.

Other items:

There are numerous other UI elements an author could implement such as 
small advance/retreat month/year links, pull-down menus to pick 
month/day/year and month/day/year entry fields. These atomic UI elements 
are below the threshold of the date picker widget definition.

No key for jumping to "today" is defined. The use case was considered 
too weak to define another key.

{Tree View}
Al suggested consideration of a tree view which I'm assuming would need 
an alternate keyboard navigation. Should we pursue this branch?

Update 4/23
- Noted that initial focus is dropped on today's date OR the nearest 
previously selected date
- Removed requirement that contiguous be only available in the 
non-singleton state. An author may want the user to pick only one 
contiguous range of dates.
- Restructured to Singleton and an optional Contiguous allowed flag on 
Singleton true case.
- Moved comments about localization to feedback section
- Dropped more of the prose in the feedback section as previously agreed
- Added selection of date in singleton mode can optionally submit the widget
- Added selection of date(s) in non-singleton mode can signal completion 
via enter key
- Added commentary that text entry fields, pull-down menus and other 
navigation in the widget is not covered here.
- Noted the decision to not set up a "jump to today" key.
- Removed all "other" items as they have been addressed except for Al's 
tree view.

Update 4/22
- Removed references to "announce" generalizing as "feedback" or "AT 
representation"
- Clarified what to do when advance/retreat a month and the new month 
has fewer days than the current month and the user is focused on the 
last date.
- Noted why we don't recommend a jump to beginning and end of week key 
combination.
- Clarified that navigation into the past can be optionally prevented
- Changed section on announcing to be feedback and reduced level of detail
- Removed feedback for unselection of previous date in singleton mode

Update 4/15
- Changed advance/retreat month to stick to same date rather than the 
same day
- Changed control+alt+home and end to be just control+home

Update 4/8
- Tried to generalize AT behavior description for order of content 
revelation
- Added section about singleton and contiguous modes
- Added unavailability section
- Changed selection from enter to space
- added contiguous and discontiguous selection methods
- Reorganized into major sections
- Removed all modal dialogs and other tweaks that try to capture Al's 
comments
- Changed keys to ones not needing localization

Update 3/25
- added announcing number of days selected when switching from Month to 
Month or Year to Year
- added announcing availability of the selected date to the spoken 
description
- added announcing the month and its attributes when the user crosses a 
month boundary
- clarified combinations allowed for availability and selected
- added implementation detail about supporting a passed in list of 
unavailable dates
- added section about navigation into the past

Update 3/4
- added commentary about alignment with mainstream objects
- added section of additional keys we might want to consider
- added continuity of grid focus when changing months and years

Received on Wednesday, 23 April 2008 18:04:52 UTC