blob: d13e7757e84caba38bb67fb9343529410fd7a1dd [file] [log] [blame]
// Copyright 2013 The Closure Library Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/**
* @fileoverview The default renderer for {@link goog.ui.DatePicker}.
*
* @see ../demos/datepicker.html
*/
goog.provide('goog.ui.DefaultDatePickerRenderer');
goog.require('goog.dom');
goog.require('goog.dom.TagName');
/** @suppress {extraRequire} Interface. */
goog.require('goog.ui.DatePickerRenderer');
/**
* Default renderer for {@link goog.ui.DatePicker}. Renders the date picker's
* navigation header and footer.
*
* @param {string} baseCssClass Name of base CSS class of the date picker.
* @param {goog.dom.DomHelper=} opt_domHelper DOM helper.
* @constructor
* @implements {goog.ui.DatePickerRenderer}
*/
goog.ui.DefaultDatePickerRenderer = function(baseCssClass, opt_domHelper) {
/**
* Name of base CSS class of datepicker
* @type {string}
* @private
*/
this.baseCssClass_ = baseCssClass;
/**
* @type {!goog.dom.DomHelper}
* @private
*/
this.dom_ = opt_domHelper || goog.dom.getDomHelper();
};
/**
* Returns the dom helper that is being used on this component.
* @return {!goog.dom.DomHelper} The dom helper used on this component.
*/
goog.ui.DefaultDatePickerRenderer.prototype.getDomHelper = function() {
return this.dom_;
};
/**
* Returns base CSS class. This getter is used to get base CSS class part.
* All CSS class names in component are created as:
* goog.getCssName(this.getBaseCssClass(), 'CLASS_NAME')
* @return {string} Base CSS class.
*/
goog.ui.DefaultDatePickerRenderer.prototype.getBaseCssClass = function() {
return this.baseCssClass_;
};
/**
* Render the navigation row (navigating months and maybe years).
*
* @param {!Element} row The parent element to render the component into.
* @param {boolean} simpleNavigation Whether the picker should render a simple
* navigation menu that only contains controls for navigating to the next
* and previous month. The default navigation menu contains controls for
* navigating to the next/previous month, next/previous year, and menus for
* jumping to specific months and years.
* @param {boolean} showWeekNum Whether week numbers should be shown.
* @param {string} fullDateFormat The full date format.
* {@see goog.i18n.DateTimeSymbols}.
* @override
*/
goog.ui.DefaultDatePickerRenderer.prototype.renderNavigationRow =
function(row, simpleNavigation, showWeekNum, fullDateFormat) {
// Populate the navigation row according to the configured navigation mode.
var cell, monthCell, yearCell;
if (simpleNavigation) {
cell = this.getDomHelper().createElement(goog.dom.TagName.TD);
cell.colSpan = showWeekNum ? 1 : 2;
this.createButton_(cell, '\u00AB',
goog.getCssName(this.getBaseCssClass(), 'previousMonth')); // <<
row.appendChild(cell);
cell = this.getDomHelper().createElement(goog.dom.TagName.TD);
cell.colSpan = showWeekNum ? 6 : 5;
cell.className = goog.getCssName(this.getBaseCssClass(), 'monthyear');
row.appendChild(cell);
cell = this.getDomHelper().createElement(goog.dom.TagName.TD);
this.createButton_(cell, '\u00BB',
goog.getCssName(this.getBaseCssClass(), 'nextMonth')); // >>
row.appendChild(cell);
} else {
monthCell = this.getDomHelper().createElement(goog.dom.TagName.TD);
monthCell.colSpan = 5;
this.createButton_(monthCell, '\u00AB',
goog.getCssName(this.getBaseCssClass(), 'previousMonth')); // <<
this.createButton_(monthCell, '',
goog.getCssName(this.getBaseCssClass(), 'month'));
this.createButton_(monthCell, '\u00BB',
goog.getCssName(this.getBaseCssClass(), 'nextMonth')); // >>
yearCell = this.getDomHelper().createElement(goog.dom.TagName.TD);
yearCell.colSpan = 3;
this.createButton_(yearCell, '\u00AB',
goog.getCssName(this.getBaseCssClass(), 'previousYear')); // <<
this.createButton_(yearCell, '',
goog.getCssName(this.getBaseCssClass(), 'year'));
this.createButton_(yearCell, '\u00BB',
goog.getCssName(this.getBaseCssClass(), 'nextYear')); // <<
// If the date format has year ('y') appearing first before month ('m'),
// show the year on the left hand side of the datepicker popup. Otherwise,
// show the month on the left side. This check assumes the data to be
// valid, and that all date formats contain month and year.
if (fullDateFormat.indexOf('y') < fullDateFormat.indexOf('m')) {
row.appendChild(yearCell);
row.appendChild(monthCell);
} else {
row.appendChild(monthCell);
row.appendChild(yearCell);
}
}
};
/**
* Render the footer row (with select buttons).
*
* @param {!Element} row The parent element to render the component into.
* @param {boolean} showWeekNum Whether week numbers should be shown.
* @override
*/
goog.ui.DefaultDatePickerRenderer.prototype.renderFooterRow =
function(row, showWeekNum) {
// Populate the footer row with buttons for Today and None.
var cell = this.getDomHelper().createElement(goog.dom.TagName.TD);
cell.colSpan = showWeekNum ? 2 : 3;
cell.className = goog.getCssName(this.getBaseCssClass(), 'today-cont');
/** @desc Label for button that selects the current date. */
var MSG_DATEPICKER_TODAY_BUTTON_LABEL = goog.getMsg('Today');
this.createButton_(cell, MSG_DATEPICKER_TODAY_BUTTON_LABEL,
goog.getCssName(this.getBaseCssClass(), 'today-btn'));
row.appendChild(cell);
cell = this.getDomHelper().createElement(goog.dom.TagName.TD);
cell.colSpan = showWeekNum ? 4 : 3;
row.appendChild(cell);
cell = this.getDomHelper().createElement(goog.dom.TagName.TD);
cell.colSpan = 2;
cell.className = goog.getCssName(this.getBaseCssClass(), 'none-cont');
/** @desc Label for button that clears the selection. */
var MSG_DATEPICKER_NONE = goog.getMsg('None');
this.createButton_(cell, MSG_DATEPICKER_NONE,
goog.getCssName(this.getBaseCssClass(), 'none-btn'));
row.appendChild(cell);
};
/**
* Support function for button creation.
*
* @param {Element} parentNode Container the button should be added to.
* @param {string} label Button label.
* @param {string=} opt_className Class name for button, which will be used
* in addition to "goog-date-picker-btn".
* @private
* @return {!Element} The created button element.
*/
goog.ui.DefaultDatePickerRenderer.prototype.createButton_ =
function(parentNode, label, opt_className) {
var classes = [goog.getCssName(this.getBaseCssClass(), 'btn')];
if (opt_className) {
classes.push(opt_className);
}
var el = this.getDomHelper().createElement(goog.dom.TagName.BUTTON);
el.className = classes.join(' ');
el.appendChild(this.getDomHelper().createTextNode(label));
parentNode.appendChild(el);
return el;
};