More config options for list views; some code cleanup: save frequently used jquery objects in local vars

This commit is contained in:
Thomas Bruederli 2011-06-16 16:21:14 -06:00
parent a9462f5d0c
commit 9e93cd9613
4 changed files with 72 additions and 74 deletions

View file

@ -40,7 +40,6 @@ function rcube_calendar(settings)
/*** private vars ***/
var me = this;
var fcselector = '#calendar';
var day_clicked = day_clicked_ts = 0;
var ignore_click = false;
@ -468,7 +467,7 @@ function rcube_calendar(settings)
],
close: function(){
$dialog.dialog("destroy").hide();
$(fcselector).fullCalendar('refetchEvents');
fc.fullCalendar('refetchEvents');
}
}).show();
@ -482,7 +481,7 @@ function rcube_calendar(settings)
this.add_event = function() {
if (this.selected_calendar) {
var now = new Date();
var date = $(fcselector).fullCalendar('getDate') || now;
var date = fc.fullCalendar('getDate') || now;
date.setHours(now.getHours()+1);
date.setMinutes(0);
var end = new Date(date.getTime());
@ -679,7 +678,7 @@ function rcube_calendar(settings)
this.calendar_destroy_source = function(id)
{
if (this.calendars[id]) {
$(fcselector).fullCalendar('removeEventSource', this.calendars[id]);
fc.fullCalendar('removeEventSource', this.calendars[id]);
$(rcmail.get_folder_li(id, 'rcmlical')).remove();
$('#edit-calendar option[value="'+id+'"]').remove();
delete this.calendars[id];
@ -696,7 +695,6 @@ function rcube_calendar(settings)
var q = rcmail.gui_objects.qsearchbox.value;
if (q != '') {
var id = 'search-'+q;
var fc = $(fcselector);
var sources = [];
if (this._search_message)
@ -730,7 +728,7 @@ function rcube_calendar(settings)
editable: false
};
fc.fullCalendar('option', 'listSections', 'day');
fc.fullCalendar('option', 'listSections', 'month');
fc.fullCalendar('addEventSource', this.search_source);
fc.fullCalendar('changeView', 'table');
}
@ -749,7 +747,6 @@ function rcube_calendar(settings)
if (this.search_request) {
// restore original event sources and view mode from fullcalendar
var fc = $(fcselector);
fc.fullCalendar('option', 'listSections', 'smart');
fc.fullCalendar('removeEventSource', this.search_source);
for (var sid in this.calendars) {
@ -811,7 +808,7 @@ function rcube_calendar(settings)
me.quicksearch();
}
else { // add/remove event source
$(fcselector).fullCalendar(action, me.calendars[id]);
fc.fullCalendar(action, me.calendars[id]);
rcmail.save_pref({ name:'hidden_calendars', value:settings.hidden_calendars.join(',') });
}
}
@ -832,7 +829,7 @@ function rcube_calendar(settings)
}
// initalize the fullCalendar plugin
$(fcselector).fullCalendar({
var fc = $('#calendar').fullCalendar({
header: {
left: 'prev,next today',
center: 'title',
@ -871,6 +868,8 @@ function rcube_calendar(settings)
table: settings['date_long']
},
listSections: 'smart',
listRange: 60, // show 60 days in list view
tableCols: ['handle', 'date', 'time', 'title', 'location'],
defaultView: settings['default_view'],
allDayText: rcmail.gettext('all-day', 'calendar'),
buttonText: {
@ -989,7 +988,7 @@ function rcube_calendar(settings)
// event handler for clicks on calendar week cell of the datepicker widget
var init_week_events = function(){
$('#datepicker table.ui-datepicker-calendar td.ui-datepicker-week-col').click(function(e){
var base_date = $("#datepicker").datepicker('getDate');
var base_date = minical.datepicker('getDate');
var day_off = base_date.getDay() - 1;
if (day_off < 0) day_off = 6;
var base_kw = $.datepicker.iso8601Week(base_date);
@ -997,39 +996,39 @@ function rcube_calendar(settings)
var diff = (kw - base_kw) * 7 * 86400000;
// select monday of the chosen calendar week
var date = new Date(base_date.getTime() - day_off * 86400000 + diff);
$(fcselector).fullCalendar('gotoDate', date).fullCalendar('setDate', date).fullCalendar('changeView', 'agendaWeek');
$("#datepicker").datepicker('setDate', date);
fc.fullCalendar('gotoDate', date).fullCalendar('setDate', date).fullCalendar('changeView', 'agendaWeek');
minical.datepicker('setDate', date);
window.setTimeout(init_week_events, 10);
}).css('cursor', 'pointer');
};
// initialize small calendar widget using jQuery UI datepicker
$('#datepicker').datepicker($.extend(datepicker_settings, {
var minical = $('#datepicker').datepicker($.extend(datepicker_settings, {
inline: true,
showWeek: true,
changeMonth: false, // maybe enable?
changeYear: false, // maybe enable?
onSelect: function(dateText, inst) {
ignore_click = true;
var d = $("#datepicker").datepicker('getDate'); //parse_datetime('0:0', dateText);
$(fcselector).fullCalendar('gotoDate', d).fullCalendar('select', d, d, true);
var d = minical.datepicker('getDate'); //parse_datetime('0:0', dateText);
fc.fullCalendar('gotoDate', d).fullCalendar('select', d, d, true);
window.setTimeout(init_week_events, 10);
},
onChangeMonthYear: function(year, month, inst) {
window.setTimeout(init_week_events, 10);
var d = $("#datepicker").datepicker('getDate');
var d = minical.datepicker('getDate');
d.setYear(year);
d.setMonth(month - 1);
$("#datepicker").data('year', year).data('month', month);
//$(fcselector).fullCalendar('gotoDate', d).fullCalendar('setDate', d);
minical.data('year', year).data('month', month);
//fc.fullCalendar('gotoDate', d).fullCalendar('setDate', d);
},
}));
window.setTimeout(init_week_events, 10);
// react on fullcalendar buttons
var fullcalendar_update = function() {
var d = $(fcselector).fullCalendar('getDate');
$("#datepicker").datepicker('setDate', d);
var d = fc.fullCalendar('getDate');
minical.datepicker('setDate', d);
window.setTimeout(init_week_events, 10);
};
$("#calendar .fc-button-prev").click(fullcalendar_update);

View file

@ -95,8 +95,11 @@ var defaults = {
week: 'W'
},
// list options
// list/table options
listSections: 'month', // false|'day'|'week'|'month'|'smart'
listRange: 30, // number of days to be displayed
listPage: 7, // number of days to jump when paging
tableCols: ['handle', 'date', 'time', 'title'],
// jquery-ui theming
theme: false,
@ -651,9 +654,11 @@ function Calendar(element, options, eventSources) {
if (value === undefined) {
return options[name];
}
options[name] = value;
if (name == 'height' || name == 'contentHeight' || name == 'aspectRatio') {
options[name] = value;
updateSize();
} else if (name.indexOf('list') == 0 || name == 'tableCols') {
options[name] = value;
}
}
@ -4296,7 +4301,7 @@ function View(element, calendar, viewName) {
function opt(name, viewNameOverride) {
var v = options[name];
if (typeof v == 'object') {
if (typeof v == 'object' && !v.length) {
return smartProperty(v, viewNameOverride || viewName);
}
return v;
@ -5356,13 +5361,14 @@ function ListEventRenderer() {
var tm = opt('theme') ? 'ui' : 'fc';
var headerClass = tm + "-widget-header";
var contentClass = tm + "-widget-content";
var i, j, seg, event, times, s, skinCss, skinCssAttr, classes, segHeader, segContainer, eventElements;
var i, j, seg, event, times, s, skinCss, skinCssAttr, classes, segContainer, eventElements;
for (j=0; j < segs.length; j++) {
seg = segs[j];
if (seg.title)
segHeader = $('<div class="fc-list-header ' + headerClass + '">' + htmlEscape(seg.title) + '</div>').appendTo(getListContainer());
if (seg.title) {
$('<div class="fc-list-header ' + headerClass + '">' + htmlEscape(seg.title) + '</div>').appendTo(getListContainer());
}
segContainer = $('<div>').addClass('fc-list-section ' + contentClass).appendTo(getListContainer());
s = '';
@ -5516,15 +5522,12 @@ function ListView(element, calendar) {
function render(date, delta) {
if (delta) {
addDays(date, delta);
if (!opt('weekends')) {
skipWeekend(date, delta < 0 ? -1 : 1);
}
addDays(date, opt('listPage') * delta);
}
t.title = opt('listTexts', 'from') + ' ' + formatDate(date, opt('titleFormat'));
t.start = t.visStart = cloneDate(date, true);
t.end = addDays(cloneDate(t.start), 1);
t.visEnd = addMonths(cloneDate(t.start), 1); // show events one month ahead. Enough?
t.end = addDays(cloneDate(t.start), opt('listPage'));
t.visEnd = addDays(cloneDate(t.start), opt('listRange'));
updateOptions();
@ -5613,13 +5616,16 @@ function TableEventRenderer() {
var table = getListContainer();
var headerClass = tm + "-widget-header";
var contentClass = tm + "-widget-content";
var i, j, seg, event, times, s, skinCss, skinCssAttr, skinClasses, rowClasses, segHeader, segContainer, eventElements;
var tableCols = opt('tableCols');
var timecol = $.inArray('time', tableCols) >= 0;
var i, j, seg, event, times, s, skinCss, skinCssAttr, skinClasses, rowClasses, segContainer, eventElements;
for (j=0; j < segs.length; j++) {
seg = segs[j];
if (seg.title)
segHeader = $('<tbody class="fc-list-header"><tr><td class="fc-list-header ' + headerClass + '" colspan="5">' + htmlEscape(seg.title) + '</td></tr></tbody>').appendTo(table);
if (seg.title) {
$('<tbody class="fc-list-header"><tr><td class="fc-list-header ' + headerClass + '" colspan="' + tableCols.length + '">' + htmlEscape(seg.title) + '</td></tr></tbody>').appendTo(table);
}
segContainer = $('<tbody>').addClass('fc-list-section ' + contentClass).appendTo(table);
s = '';
@ -5637,27 +5643,25 @@ function TableEventRenderer() {
rowClasses.push('fc-today');
}
s +=
"<tr class='" + rowClasses.join(' ') + "'>" +
"<td class='fc-event-handle'>" +
"<div class='" + skinClasses.join(' ') + "'" + skinCssAttr + ">" +
"<span class='fc-event-inner'></span>" +
"</div></td>" +
"<td class='fc-event-date' colspan='" + (times[1] ? 1 : 2) + "'>" +
htmlEscape(times[0]) +
"</td>" +
(times[1] ?
"<td class='fc-event-time'>" +
htmlEscape(times[1]) +
"</td>"
: "") +
"<td class='fc-event-title'>" +
htmlEscape(event.title) +
"</td>" +
"<td class='fc-event-location'>" +
htmlEscape(event.location) +
"</td>" +
"</tr>";
s += "<tr class='" + rowClasses.join(' ') + "'>";
for (var col, c=0; c < tableCols.length; c++) {
col = tableCols[c];
if (col == 'handle') {
s += "<td class='fc-event-handle'>" +
"<div class='" + skinClasses.join(' ') + "'" + skinCssAttr + ">" +
"<span class='fc-event-inner'></span>" +
"</div></td>";
} else if (col == 'date') {
s += "<td class='fc-event-date' colspan='" + (times[1] || !timecol ? 1 : 2) + "'>" + htmlEscape(times[0]) + "</td>";
} else if (col == 'time') {
if (times[1]) {
s += "<td class='fc-event-time'>" + htmlEscape(times[1]) + "</td>";
}
} else {
s += "<td class='fc-event-" + col + "'>" + htmlEscape(event[col] || '') + "</td>";
}
}
s += "</tr>";
}
segContainer[0].innerHTML = s;
@ -5731,15 +5735,12 @@ function TableView(element, calendar) {
function render(date, delta) {
if (delta) {
addDays(date, delta);
if (!opt('weekends')) {
skipWeekend(date, delta < 0 ? -1 : 1);
}
addDays(date, opt('listPage') * delta);
}
t.title = opt('listTexts', 'from') + ' ' + formatDate(date, opt('titleFormat'));
t.start = t.visStart = cloneDate(date, true);
t.end = addDays(cloneDate(t.start), 1);
t.visEnd = addMonths(cloneDate(t.start), 1); // show events one month ahead. Enough?
t.end = addDays(cloneDate(t.start), opt('listPage'));
t.visEnd = addDays(cloneDate(t.start), opt('listRange'));
updateOptions();
@ -5760,15 +5761,14 @@ function TableView(element, calendar) {
function buildSkeleton() {
var tableCols = opt('tableCols');
var s =
"<table class='fc-border-separate' style='width:100%' cellspacing='0'>" +
"<colgroup>" +
"<col class='fc-event-handle' />" +
"<col class='fc-event-date' />" +
"<col class='fc-event-time' />" +
"<col class='fc-event-title' />" +
"<col class='fc-event-location' />" +
"</colgroup>" +
"<colgroup>";
for (var c=0; c < tableCols.length; c++) {
s += "<col class='fc-event-" + tableCols[c] + "' />";
}
s += "</colgroup>" +
"</table>";
div = $('<div>').addClass('fc-list-content').appendTo(element);
table = $(s).appendTo(div);

View file

@ -530,6 +530,10 @@ div.fc-event-location {
color: #333;
}
.fc-view-table col.fc-event-location {
width: 20%;
}
/* Settings section */
fieldset #calendarcategories div {

View file

@ -690,15 +690,10 @@ table.fc-border-separate {
width: 1px;
}
.fc-view-table col.fc-event-time {
width: 8em;
}
.fc-view-table col.fc-event-location {
width: 20%;
}
.fc-view-table td.fc-event-date,
.fc-view-table td.fc-event-time {
white-space: nowrap;