Publish Vulpes Preview 15 sources for desktop, Android and Tundra
Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
This commit is contained in:
parent
93e3a48004
commit
b38dea0597
25901 changed files with 9982925 additions and 369 deletions
159
gaia/apps/calendar/js/views/single_month.js
Executable file
159
gaia/apps/calendar/js/views/single_month.js
Executable file
|
|
@ -0,0 +1,159 @@
|
|||
define(function(require, exports, module) {
|
||||
'use strict';
|
||||
|
||||
var Calc = require('common/calc');
|
||||
var MonthDay = require('./month_day');
|
||||
var View = require('view');
|
||||
var core = require('core');
|
||||
var daysBetween = Calc.daysBetween;
|
||||
var daysInWeek = Calc.daysInWeek;
|
||||
var getDayId = Calc.getDayId;
|
||||
var spanOfMonth = Calc.spanOfMonth;
|
||||
|
||||
var SELECTED = 'selected';
|
||||
|
||||
// SingleMonth contains all the logic required to build the Month view grid and
|
||||
// groups all the MonthDay instances for that given month.
|
||||
function SingleMonth() {
|
||||
View.apply(this, arguments);
|
||||
this.days = [];
|
||||
this.timespan = spanOfMonth(this.date);
|
||||
}
|
||||
module.exports = SingleMonth;
|
||||
|
||||
SingleMonth.prototype = {
|
||||
__proto__: View.prototype,
|
||||
|
||||
active: false,
|
||||
container: null,
|
||||
date: null,
|
||||
days: null,
|
||||
element: null,
|
||||
|
||||
create: function() {
|
||||
var element = document.createElement('section');
|
||||
element.className = 'month';
|
||||
element.setAttribute('role', 'grid');
|
||||
element.setAttribute('aria-labelledby', 'current-month-year');
|
||||
element.setAttribute('aria-readonly', true);
|
||||
element.innerHTML = this._renderDayHeaders();
|
||||
element.dataset.date = getDayId(this.date);
|
||||
this.element = element;
|
||||
this._buildWeeks();
|
||||
},
|
||||
|
||||
_renderDayHeaders: function() {
|
||||
// startDay might change during the 'localized' event
|
||||
var startDay = Calc.startDay;
|
||||
var days = [];
|
||||
var i;
|
||||
for (i = startDay; i < 7; i++) {
|
||||
days.push(this._dayHeader(i));
|
||||
}
|
||||
|
||||
if (startDay > 0) {
|
||||
for (i = 0; i < startDay; i++) {
|
||||
days.push(this._dayHeader(i));
|
||||
}
|
||||
}
|
||||
|
||||
var html = `<header id="month-days" role="presentation">
|
||||
<ol role="row">${days.join('')}</ol>
|
||||
</header>`;
|
||||
return html;
|
||||
},
|
||||
|
||||
_dayHeader: function(dayIndex) {
|
||||
return `<li data-l10n-id="weekday-${dayIndex}-single-char"
|
||||
role="columnheader"></li>`;
|
||||
},
|
||||
|
||||
_buildWeeks: function() {
|
||||
var weekLength = daysInWeek();
|
||||
var week;
|
||||
daysBetween(this.timespan).forEach((date, i) => {
|
||||
if (i % weekLength === 0) {
|
||||
week = document.createElement('ol');
|
||||
week.setAttribute('role', 'row');
|
||||
this.element.appendChild(week);
|
||||
}
|
||||
var day = new MonthDay({
|
||||
date: date,
|
||||
month: this.date,
|
||||
container: week
|
||||
});
|
||||
day.create();
|
||||
this.days.push(day);
|
||||
});
|
||||
},
|
||||
|
||||
activate: function() {
|
||||
if (this.active) {
|
||||
return;
|
||||
}
|
||||
this.active = true;
|
||||
|
||||
this.onactive();
|
||||
this.days.forEach(day => day.activate());
|
||||
this._onSelectedDayChange(core.timeController.selectedDay);
|
||||
core.timeController.on('selectedDayChange', this);
|
||||
},
|
||||
|
||||
deactivate: function() {
|
||||
if (!this.active) {
|
||||
return;
|
||||
}
|
||||
this.active = false;
|
||||
|
||||
this.oninactive();
|
||||
this.days.forEach(day => day.deactivate());
|
||||
core.timeController.off('selectedDayChange', this);
|
||||
},
|
||||
|
||||
destroy: function() {
|
||||
this.deactivate();
|
||||
this._detach();
|
||||
this.days.forEach(day => day.destroy());
|
||||
this.days = [];
|
||||
},
|
||||
|
||||
append: function() {
|
||||
this.container.appendChild(this.element);
|
||||
},
|
||||
|
||||
_detach: function() {
|
||||
if (this.element && this.element.parentNode) {
|
||||
this.element.parentNode.removeChild(this.element);
|
||||
}
|
||||
},
|
||||
|
||||
handleEvent: function(e) {
|
||||
if (e.type === 'selectedDayChange') {
|
||||
this._onSelectedDayChange(e.data[0]);
|
||||
}
|
||||
},
|
||||
|
||||
_clearSelectedDay: function() {
|
||||
var day = this.element.querySelector(`li.${SELECTED}`);
|
||||
if (day) {
|
||||
day.classList.remove(SELECTED);
|
||||
day.removeAttribute('aria-selected');
|
||||
}
|
||||
},
|
||||
|
||||
_onSelectedDayChange: function(date) {
|
||||
this._clearSelectedDay();
|
||||
|
||||
if (!date || !this.timespan.contains(date)) {
|
||||
return;
|
||||
}
|
||||
|
||||
var el = this.element.querySelector(`li[data-date="${getDayId(date)}"]`);
|
||||
el.classList.add(SELECTED);
|
||||
el.setAttribute('aria-selected', true);
|
||||
// Put the screen reader cursor onto the selected day.
|
||||
el.focus();
|
||||
}
|
||||
};
|
||||
|
||||
});
|
||||
Loading…
Reference in a new issue