You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
304 lines
9.4 KiB
304 lines
9.4 KiB
/*
|
|
YUI 3.17.2 (build 9c3c78e)
|
|
Copyright 2014 Yahoo! Inc. All rights reserved.
|
|
Licensed under the BSD License.
|
|
http://yuilibrary.com/license/
|
|
*/
|
|
|
|
YUI.add('calendarnavigator', function (Y, NAME) {
|
|
|
|
/**
|
|
* Provides a plugin which adds navigation controls to Calendar.
|
|
*
|
|
* @module calendarnavigator
|
|
*/
|
|
var CONTENT_BOX = "contentBox",
|
|
HOST = "host",
|
|
getCN = Y.ClassNameManager.getClassName,
|
|
substitute = Y.Lang.sub,
|
|
node = Y.Node,
|
|
create = node.create,
|
|
CALENDAR = 'calendar',
|
|
CALENDARNAV = 'calendarnav',
|
|
CAL_HD = getCN(CALENDAR, 'header'),
|
|
CAL_PREV_M = getCN(CALENDARNAV, 'prevmonth'),
|
|
CAL_NEXT_M = getCN(CALENDARNAV, 'nextmonth'),
|
|
CAL_DIS_M = getCN(CALENDARNAV, 'month-disabled'),
|
|
ydate = Y.DataType.Date;
|
|
/**
|
|
* A plugin class which adds navigation controls to Calendar.
|
|
*
|
|
* @class CalendarNavigator
|
|
* @extends Plugin.Base
|
|
* @namespace Plugin
|
|
*/
|
|
function CalendarNavigator() {
|
|
CalendarNavigator.superclass.constructor.apply(this, arguments);
|
|
}
|
|
|
|
/**
|
|
* The namespace for the plugin. This will be the property on the widget, which will
|
|
* reference the plugin instance, when it's plugged in.
|
|
*
|
|
* @property NS
|
|
* @static
|
|
* @type String
|
|
* @default "navigator"
|
|
*/
|
|
CalendarNavigator.NS = "navigator";
|
|
|
|
/**
|
|
* The NAME of the CalendarNavigator class. Used to prefix events generated
|
|
* by the plugin class.
|
|
*
|
|
* @property NAME
|
|
* @static
|
|
* @type String
|
|
* @default "pluginCalendarNavigator"
|
|
*/
|
|
CalendarNavigator.NAME = "pluginCalendarNavigator";
|
|
|
|
|
|
/**
|
|
* Static property used to define the default attribute
|
|
* configuration for the plugin.
|
|
*
|
|
* @property ATTRS
|
|
* @type Object
|
|
* @static
|
|
*/
|
|
CalendarNavigator.ATTRS = {
|
|
|
|
/**
|
|
* The number of months to shift by when the control arrows are clicked.
|
|
*
|
|
* @attribute shiftByMonths
|
|
* @type Number
|
|
* @default 1 (months)
|
|
*/
|
|
shiftByMonths : {
|
|
value: 1
|
|
}
|
|
};
|
|
|
|
/**
|
|
* The CSS classnames for the calendar navigator controls.
|
|
* @property CALENDARNAV_STRINGS
|
|
* @type Object
|
|
* @readOnly
|
|
* @protected
|
|
* @static
|
|
*/
|
|
CalendarNavigator.CALENDARNAV_STRINGS = {
|
|
prev_month_class: CAL_PREV_M,
|
|
next_month_class: CAL_NEXT_M
|
|
};
|
|
|
|
/**
|
|
* The template for the calendar navigator previous month control.
|
|
* @property PREV_MONTH_CONTROL_TEMPLATE
|
|
* @type String
|
|
* @protected
|
|
* @static
|
|
*/
|
|
CalendarNavigator.PREV_MONTH_CONTROL_TEMPLATE = '<a class="yui3-u {prev_month_class}" role="button" aria-label="{prev_month_arialabel}" ' +
|
|
'tabindex="{control_tabindex}" />';
|
|
/**
|
|
* The template for the calendar navigator next month control.
|
|
* @property NEXT_MONTH_CONTROL_TEMPLATE
|
|
* @type String
|
|
* @readOnly
|
|
* @protected
|
|
* @static
|
|
*/
|
|
CalendarNavigator.NEXT_MONTH_CONTROL_TEMPLATE = '<a class="yui3-u {next_month_class}" role="button" aria-label="{next_month_arialabel}" ' +
|
|
'tabindex="{control_tabindex}" />';
|
|
|
|
|
|
Y.extend(CalendarNavigator, Y.Plugin.Base, {
|
|
|
|
_eventAttachments : {},
|
|
_controls: {},
|
|
|
|
/**
|
|
* The initializer lifecycle implementation. Modifies the host widget's
|
|
* render to add navigation controls.
|
|
*
|
|
* @method initializer
|
|
*/
|
|
initializer : function() {
|
|
|
|
// After the host has rendered its UI, place the navigation cotnrols
|
|
this._controls = {};
|
|
this._eventAttachments = {};
|
|
|
|
this.afterHostMethod("renderUI", this._initNavigationControls);
|
|
},
|
|
|
|
/**
|
|
* The initializer destructor implementation. Responsible for destroying the initialized
|
|
* control mechanisms.
|
|
*
|
|
* @method destructor
|
|
*/
|
|
destructor : function() {
|
|
|
|
},
|
|
|
|
/**
|
|
* Private utility method that focuses on a navigation button when it is clicked
|
|
* or pressed with a keyboard.
|
|
*
|
|
* @method _focusNavigation
|
|
* @param {Event} ev Click or keydown event from the controls
|
|
* @protected
|
|
*/
|
|
_focusNavigation : function (ev) {
|
|
ev.currentTarget.focus();
|
|
},
|
|
|
|
/**
|
|
* Private utility method that subtracts months from the host calendar date
|
|
* based on the control click and the shiftByMonths property.
|
|
*
|
|
* @method _subtractMonths
|
|
* @param {Event} ev Click event from the controls
|
|
* @protected
|
|
*/
|
|
_subtractMonths : function (ev) {
|
|
if ( (ev.type === "click") || (ev.type === "keydown" && (ev.keyCode === 13 || ev.keyCode === 32)) ) {
|
|
var host = this.get(HOST),
|
|
oldDate = host.get("date");
|
|
host.set("date", ydate.addMonths(oldDate, -1*this.get("shiftByMonths")));
|
|
ev.preventDefault();
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Private utility method that adds months to the host calendar date
|
|
* based on the control click and the shiftByMonths property.
|
|
*
|
|
* @method _addMonths
|
|
* @param {Event} ev Click event from the controls
|
|
* @protected
|
|
*/
|
|
_addMonths : function (ev) {
|
|
if ( (ev.type === "click") || (ev.type === "keydown" && (ev.keyCode === 13 || ev.keyCode === 32)) ) {
|
|
var host = this.get(HOST),
|
|
oldDate = host.get("date");
|
|
host.set("date", ydate.addMonths(oldDate, this.get("shiftByMonths")));
|
|
ev.preventDefault();
|
|
}
|
|
},
|
|
|
|
|
|
_updateControlState : function () {
|
|
|
|
var host = this.get(HOST),
|
|
startDate = host.get('date'),
|
|
endDate = ydate.addMonths(startDate, host._paneNumber - 1),
|
|
minDate = host._normalizeDate(host.get("minimumDate")),
|
|
maxDate = host._normalizeDate(host.get("maximumDate"));
|
|
|
|
if (ydate.areEqual(minDate, startDate)) {
|
|
if (this._eventAttachments.prevMonth) {
|
|
this._eventAttachments.prevMonth.detach();
|
|
this._eventAttachments.prevMonth = false;
|
|
}
|
|
|
|
if (!this._controls.prevMonth.hasClass(CAL_DIS_M)) {
|
|
this._controls.prevMonth.addClass(CAL_DIS_M).setAttribute("aria-disabled", "true");
|
|
}
|
|
}
|
|
else {
|
|
if (!this._eventAttachments.prevMonth) {
|
|
this._eventAttachments.prevMonth = this._controls.prevMonth.on(["click", "keydown"], this._subtractMonths, this);
|
|
}
|
|
if (this._controls.prevMonth.hasClass(CAL_DIS_M)) {
|
|
this._controls.prevMonth.removeClass(CAL_DIS_M).setAttribute("aria-disabled", "false");
|
|
}
|
|
}
|
|
|
|
if (ydate.areEqual(maxDate, endDate)) {
|
|
if (this._eventAttachments.nextMonth) {
|
|
this._eventAttachments.nextMonth.detach();
|
|
this._eventAttachments.nextMonth = false;
|
|
}
|
|
|
|
if (!this._controls.nextMonth.hasClass(CAL_DIS_M)) {
|
|
this._controls.nextMonth.addClass(CAL_DIS_M).setAttribute("aria-disabled", "true");
|
|
}
|
|
}
|
|
else {
|
|
if (!this._eventAttachments.nextMonth) {
|
|
this._eventAttachments.nextMonth = this._controls.nextMonth.on(["click", "keydown"], this._addMonths, this);
|
|
}
|
|
if (this._controls.nextMonth.hasClass(CAL_DIS_M)) {
|
|
this._controls.nextMonth.removeClass(CAL_DIS_M).setAttribute("aria-disabled", "false");
|
|
}
|
|
}
|
|
|
|
this._controls.prevMonth.on(["click", "keydown"], this._focusNavigation, this);
|
|
this._controls.nextMonth.on(["click", "keydown"], this._focusNavigation, this);
|
|
},
|
|
|
|
|
|
|
|
|
|
/**
|
|
* Private render assist method that renders the previous month control
|
|
*
|
|
* @method _renderPrevControls
|
|
* @private
|
|
*/
|
|
_renderPrevControls : function () {
|
|
var prevControlNode = create(substitute (CalendarNavigator.PREV_MONTH_CONTROL_TEMPLATE,
|
|
CalendarNavigator.CALENDARNAV_STRINGS));
|
|
prevControlNode.on("selectstart", this.get(HOST)._preventSelectionStart);
|
|
|
|
return prevControlNode;
|
|
},
|
|
|
|
/**
|
|
* Private render assist method that renders the next month control
|
|
*
|
|
* @method _renderNextControls
|
|
* @private
|
|
*/
|
|
_renderNextControls : function () {
|
|
var nextControlNode = create(substitute (CalendarNavigator.NEXT_MONTH_CONTROL_TEMPLATE,
|
|
CalendarNavigator.CALENDARNAV_STRINGS));
|
|
nextControlNode.on("selectstart", this.get(HOST)._preventSelectionStart);
|
|
|
|
return nextControlNode;
|
|
},
|
|
|
|
/**
|
|
* Protected render assist method that initialized and renders the navigation controls.
|
|
* @method _initNavigationControls
|
|
* @protected
|
|
*/
|
|
_initNavigationControls : function() {
|
|
var host = this.get(HOST),
|
|
headerCell = host.get(CONTENT_BOX).one("." + CAL_HD);
|
|
|
|
CalendarNavigator.CALENDARNAV_STRINGS.control_tabindex = host.get("tabIndex");
|
|
CalendarNavigator.CALENDARNAV_STRINGS.prev_month_arialabel = "Go to previous month";
|
|
CalendarNavigator.CALENDARNAV_STRINGS.next_month_arialabel = "Go to next month";
|
|
|
|
this._controls.prevMonth = this._renderPrevControls();
|
|
this._controls.nextMonth = this._renderNextControls();
|
|
|
|
this._updateControlState();
|
|
|
|
host.after(["dateChange", "minimumDateChange", "maximumDateChange"], this._updateControlState, this);
|
|
|
|
headerCell.prepend(this._controls.prevMonth);
|
|
headerCell.append(this._controls.nextMonth);
|
|
}
|
|
});
|
|
|
|
Y.namespace("Plugin").CalendarNavigator = CalendarNavigator;
|
|
|
|
|
|
}, '3.17.2', {"requires": ["plugin", "classnamemanager", "datatype-date", "node"], "skinnable": true});
|
|
|