/**
* The Scheduler Component
*
* @module aui-scheduler
* @submodule aui-scheduler-view-week
*/
var Lang = A.Lang,
isFunction = Lang.isFunction,
DateMath = A.DataType.DateMath,
WEEK_LENGTH = DateMath.WEEK_LENGTH;
/**
* A base class for `SchedulerWeekView`.
*
* @class A.SchedulerWeekView
* @extends A.SchedulerDayView
* @param {Object} config Object literal specifying widget configuration
* properties.
* @constructor
*/
var SchedulerWeekView = A.Component.create({
/**
* Static property provides a string to identify the class.
*
* @property NAME
* @type {String}
* @static
*/
NAME: 'scheduler-view-week',
/**
* Static property used to define the default attribute
* configuration for the `SchedulerWeekView`.
*
* @property ATTRS
* @type {Object}
* @static
*/
ATTRS: {
/**
* Determines the content of Scheduler week view's body section.
*
* @attribute bodyContent
* @default ''
* @type {String}
*/
bodyContent: {
value: ''
},
/**
* Contains the number of days in a week.
*
* @attribute days
* @default 7
* @type {Number}
*/
days: {
value: 7
},
/**
* Configures the header week view.
*
* @attribute headerViewConfig
*/
headerViewConfig: {
value: {
displayDaysInterval: WEEK_LENGTH
}
},
/**
* Determines the name for this week view.
*
* @attribute name
* @default 'week'
* @type {String}
*/
name: {
value: 'week'
},
/**
* Contains the formatted navigation date formatter for this week view.
*
* @attribute navigationDateFormatter
* @type {Function}
*/
navigationDateFormatter: {
valueFn: function() {
return this._valueNavigationDateFormatter;
},
validator: isFunction
}
},
/**
* Static property used to define which component it extends.
*
* @property EXTENDS
* @type {Object}
* @static
*/
EXTENDS: A.SchedulerDayView,
prototype: {
/**
* Returns a date value of the first day of the week with its time
* adjusted to midnight.
*
* @method getAdjustedViewDate
* @param {Date} date
* @return {Date}
*/
getAdjustedViewDate: function(date) {
var instance = this;
var scheduler = instance.get('scheduler');
var firstDayOfWeek = scheduler.get('firstDayOfWeek');
return DateMath.toMidnight(DateMath.getFirstDayOfWeek(date, firstDayOfWeek));
},
/**
* Returns the value of the date that follows the week view's current
* date.
*
* @method getNextDate
* @return {Date}
*/
getNextDate: function() {
var instance = this;
var scheduler = instance.get('scheduler');
var viewDate = DateMath.safeClearTime(scheduler.get('viewDate'));
return DateMath.toLastHour(DateMath.add(viewDate, DateMath.WEEK, 1));
},
/**
* Returns the value of the date that preceeds the week view's current
* date.
*
* @method getPrevDate
* @return {Date}
*/
getPrevDate: function() {
var instance = this;
var scheduler = instance.get('scheduler');
var viewDate = scheduler.get('viewDate');
return DateMath.toMidnight(DateMath.subtract(viewDate, DateMath.WEEK, 1));
},
/**
* Returns the value of the week view's current date.
*
* @method getToday
* @return {Date}
*/
getToday: function() {
var instance = this;
var todayDate = SchedulerWeekView.superclass.getToday.apply(this, arguments);
return instance._firstDayOfWeek(todayDate);
},
/**
* Returns the value of the first day of week in this view.
*
* @method _firstDayOfWeek
* @param {Date} date
* @return {Date}
* @protected
*/
_firstDayOfWeek: function(date) {
var instance = this;
var scheduler = instance.get('scheduler');
var firstDayOfWeek = scheduler.get('firstDayOfWeek');
return DateMath.getFirstDayOfWeek(date, firstDayOfWeek);
},
/**
* Returns a formatted navigation date formatter for this week view.
*
* @method _valueNavigationDateFormatter
* @param {Date} date
* @return {Date}
* @protected
*/
_valueNavigationDateFormatter: function(date) {
var instance = this;
var scheduler = instance.get('scheduler');
var locale = scheduler.get('locale');
var startDate = instance._firstDayOfWeek(date);
var startDateLabel = A.DataType.Date.format(
startDate, {
format: '%B %d',
locale: locale
}
);
var endDate = DateMath.add(startDate, DateMath.DAY, instance.get('days') - 1);
var endDateLabel = A.DataType.Date.format(
endDate, {
format: (DateMath.isMonthOverlapWeek(startDate) ? '%B %d' : '%d') + ', %Y',
locale: locale
}
);
return [startDateLabel, '—', endDateLabel].join(' ');
}
}
});
A.SchedulerWeekView = SchedulerWeekView;