Monotone-Parent: caf1d2f37537ebf54064ae629c40a78656a15b5b

Monotone-Revision: 01621f78171d7d62c9f2ae9d1fdfb5891f9447d7

Monotone-Author: wsourdeau@inverse.ca
Monotone-Date: 2007-06-07T23:23:07
Monotone-Branch: ca.inverse.sogo
This commit is contained in:
Wolfgang Sourdeau 2007-06-07 23:23:07 +00:00
parent 82f85c1ab9
commit 26b3dfa6b0
2 changed files with 162 additions and 86 deletions

View file

@ -28,7 +28,7 @@
></ul>
</div>
<div class="menu" id="appointmentsListMenu">
<div class="menu" id="eventsListMenu">
<ul>
<li><var:string label:value="New Event..."/></li>
<li><!-- separator --></li>
@ -74,19 +74,28 @@
var:calendarFolders="calendarFolders" /></div>
</div>
<div id="tasksListView"
><var:component className="UIxCalTasksListView"
/></div>
<div id="tasksListView">
<label><input id="showHideCompletedTasks"
type="checkbox" class="checkBox"
/><var:string label:value="Show completed tasks"/></label>
<ul id="tasksList"><!-- space --></ul>
</div>
</div>
<div id="verticalDragHandle" class="dragHandle"><!-- space --></div>
<div id="rightPanel">
<var:component className="UIxCalFilterPanel" />
<div id="appointmentsListView"
oncontextmenu="return onAppointmentContextMenu(event, this);"
><var:component className="UIxCalAptListView"
/></div>
<div id="eventsListView">
<table id="eventsList">
<tr>
<td class="headerCell"><span class="sortableTableHeader"><var:string label:value="Title"/></span></td>
<td class="headerCell headerDateTime"><span class="sortableTableHeader"><var:string label:value="Start"/></span></td>
<td class="headerCell headerDateTime"><span class="sortableTableHeader"><var:string label:value="End"/></span></td>
<td class="headerCell"><span class="sortableTableHeader"><var:string label:value="Location"/></span></td>
</tr>
</table>
</div>
<div id="rightDragHandle" class="dragHandle"><!-- space --></div>
<div id="calendarView"><!-- space --></div>
</div>

View file

@ -74,10 +74,10 @@ function editEvent() {
for (var i = 0; i < nodes.length; i++)
_editEventId(nodes[i].getAttribute("id"),
nodes[i].getAttribute("owner"));
nodes[i].owner);
} else if (selectedCalendarCell) {
_editEventId(selectedCalendarCell.getAttribute("aptCName"),
selectedCalendarCell.getAttribute("owner"));
selectedCalendarCell.owner);
}
return false; /* stop following the link */
@ -102,7 +102,7 @@ function deleteEvent() {
if (listOfSelection == $("tasksList"))
label = labels["taskDeleteConfirmation"].decodeEntities();
else
label = labels["appointmentDeleteConfirmation"].decodeEntities();
label = labels["eventDeleteConfirmation"].decodeEntities();
if (confirm(label)) {
if (document.deleteEventAjaxRequest) {
@ -113,7 +113,7 @@ function deleteEvent() {
var owners = new Array();
for (var i = 0; i < nodes.length; i++) {
var owner = nodes[i].getAttribute("owner");
var owner = nodes[i].owner;
if (!sortedNodes[owner]) {
sortedNodes[owner] = new Array();
owners.push(owner);
@ -129,14 +129,14 @@ function deleteEvent() {
}
}
else if (selectedCalendarCell) {
var label = labels["appointmentDeleteConfirmation"].decodeEntities();
var label = labels["eventDeleteConfirmation"].decodeEntities();
if (confirm(label)) {
if (document.deleteEventAjaxRequest) {
document.deleteEventAjaxRequest.aborted = true;
document.deleteEventAjaxRequest.abort();
}
eventsToDelete.push([selectedCalendarCell.getAttribute("aptCName")]);
ownersOfEventsToDelete.push(selectedCalendarCell.getAttribute("owner"));
ownersOfEventsToDelete.push(selectedCalendarCell.owner);
_batchDeleteEvents();
}
}
@ -177,7 +177,7 @@ function modifyEventCallback(http) {
if (queryParameters["mail-invitation"].toLowerCase() == "yes")
closeInvitationWindow();
else {
window.opener.setTimeout("refreshAppointmentsAndDisplay();", 100);
window.opener.setTimeout("refreshEventsAndDisplay();", 100);
window.setTimeout("window.close();", 100);
}
}
@ -202,7 +202,7 @@ function deleteEventCallback(http) {
_batchDeleteEvents();
else {
document.deleteEventAjaxRequest = null;
refreshAppointments();
refreshEvents();
refreshTasks();
changeCalendarDisplay();
}
@ -213,21 +213,21 @@ function deleteEventCallback(http) {
function editDoubleClickedEvent() {
_editEventId(this.getAttribute("id"),
this.getAttribute("owner"));
this.owner);
return false;
}
function onSelectAll() {
var list = $("appointmentsList");
list.selectRowsMatchingClass("appointmentRow");
var list = $("eventsList");
list.selectRowsMatchingClass("eventRow");
return false;
}
function displayAppointment(event) {
function displayEvent(event) {
_editEventId(this.getAttribute("aptCName"),
this.getAttribute("owner"));
this.owner);
preventDefault(event);
event.stopPropagation();
@ -253,7 +253,7 @@ function onDaySelect(node) {
changeCalendarDisplay( { "day": day } );
if (needRefresh)
refreshAppointments();
refreshEvents();
return false;
}
@ -302,22 +302,62 @@ function dateSelectorCallback(http) {
log ("dateSelectorCallback Ajax error");
}
function appointmentsListCallback(http) {
var div = $("appointmentsListView");
function eventsListCallback(http) {
var div = $("eventsListView");
if (http.readyState == 4
&& http.status == 200) {
document.appointmentsListAjaxRequest = null;
div.innerHTML = http.responseText;
document.eventsListAjaxRequest = null;
var table = $("eventsList").tBodies[0];
var params = parseQueryParameters(http.callbackData);
sortKey = params["sort"];
sortOrder = params["desc"];
var list = $("appointmentsList");
Event.observe(list, "mousedown", onAppointmentsSelectionChange.bindAsEventListener(list), true);
configureSortableTableHeaders();
var data = http.responseText.evalJSON(true);
for (var i = 0; i < data.length; i++) {
var row = document.createElement("tr");
table.appendChild(row);
$(row).addClassName("eventRow");
row.setAttribute("id", data[i][0]);
row.owner = data[i][1];
var startDate = new Date();
startDate.setTime(data[i][4] * 1000);
row.day = startDate.getDayString();
row.hour = startDate.getHourString();
Event.observe(row, "click", onEventClick.bindAsEventListener(row));
Event.observe(row, "dblclick", editDoubleClickedEvent.bindAsEventListener(row));
Event.observe(row, "contextmenu",
onEventContextMenu.bindAsEventListener(row));
var td = document.createElement("td");
row.appendChild(td);
Event.observe(td, "mousedown",
listRowMouseDownHandler.bindAsEventListener(td), true);
td.appendChild(document.createTextNode(data[i][3]));
td = document.createElement("td");
row.appendChild(td);
Event.observe(td, "mousedown",
listRowMouseDownHandler.bindAsEventListener(td), true);
td.appendChild(document.createTextNode(data[i][4]));
td = document.createElement("td");
row.appendChild(td);
Event.observe(td, "mousedown",
listRowMouseDownHandler.bindAsEventListener(td), true);
td.appendChild(document.createTextNode(data[i][5]));
td = document.createElement("td");
row.appendChild(td);
Event.observe(td, "mousedown",
listRowMouseDownHandler.bindAsEventListener(td), true);
td.appendChild(document.createTextNode(data[i][6]));
}
}
else
log ("appointmentsListCallback Ajax error");
log ("eventsListCallback Ajax error");
}
function tasksListCallback(http) {
@ -327,23 +367,20 @@ function tasksListCallback(http) {
&& http.status == 200) {
document.tasksListAjaxRequest = null;
var list = $("tasksList");
var newList = document.createElement("ul");
newList.setAttribute("multiselect", "yes");
newList.setAttribute("id", "tasksList");
var scroll = list.scrollTop;
var data = http.responseText.evalJSON(true);
for (var i = 0; i < data.length; i++) {
//log(i + " = " + data[i][3]);
var listItem = document.createElement("li");
newList.appendChild(listItem);
list.appendChild(listItem);
Event.observe(listItem, "mousedown", listRowMouseDownHandler);
Event.observe(listItem, "click", onRowClick);
Event.observe(listItem, "dblclick", editDoubleClickedEvent.bindAsEventListener(listItem));
listItem.setAttribute("id", data[i][0]);
listItem.setAttribute("owner", data[i][1]);
$(listItem).addClassName(data[i][4]);
$(listItem).addClassName(data[i][5]);
var owner = data[i][1];
listItem.owner = owner;
$(listItem).addClassName("ownerIs" + owner);
var input = document.createElement("input");
input.setAttribute("type", "checkbox");
listItem.appendChild(input);
@ -355,10 +392,7 @@ function tasksListCallback(http) {
listItem.appendChild(document.createTextNode(data[i][3]));
}
Event.observe(newList, "mousedown", onTasksSelectionChange.bindAsEventListener(newList), true);
newList.scrollTop = scroll;
list.parentNode.replaceChild(newList, list);
list.scrollTop = list.previousScroll;
if (http.callbackData) {
var selectedNodesId = http.callbackData;
@ -533,11 +567,11 @@ function calendarDisplayCallback(http) {
scrollDayView(hour);
contentView = $("daysView");
}
var appointments = document.getElementsByClassName("appointment", contentView);
for (var i = 0; i < appointments.length; i++) {
Event.observe(appointments[i], "mousedown", listRowMouseDownHandler);
Event.observe(appointments[i], "click", onCalendarSelectAppointment.bindAsEventListener(appointments[i]));
Event.observe(appointments[i], "dblclick", displayAppointment.bindAsEventListener(appointments[i]));
var events = document.getElementsByClassName("event", contentView);
for (var i = 0; i < events.length; i++) {
Event.observe(events[i], "mousedown", listRowMouseDownHandler);
Event.observe(events[i], "click", onCalendarSelectEvent.bindAsEventListener(events[i]));
Event.observe(events[i], "dblclick", displayEvent.bindAsEventListener(events[i]));
}
var days = document.getElementsByClassName("day", contentView);
if (currentView == "monthview")
@ -578,27 +612,27 @@ function popupCalendar(node) {
return false;
}
function onAppointmentContextMenu(event, element) {
var topNode = $("appointmentsList");
function onEventContextMenu(event) {
var topNode = $("eventsList");
// log(topNode);
var menu = $("appointmentsListMenu");
var menu = $("eventsListMenu");
Event.observe(menu, "hideMenu", onAppointmentContextMenuHide);
popupMenu(event, "appointmentsListMenu", element);
Event.observe(menu, "hideMenu", onEventContextMenuHide);
popupMenu(event, "eventsListMenu", this);
var topNode = $("appointmentsList");
var topNode = $("eventsList");
var selectedNodes = topNode.getSelectedRows();
topNode.menuSelectedRows = selectedNodes;
for (var i = 0; i < selectedNodes.length; i++)
selectedNodes[i].deselect();
topNode.menuSelectedEntry = element;
element.select();
topNode.menuSelectedEntry = this;
this.select();
}
function onAppointmentContextMenuHide(event) {
var topNode = $("appointmentsList");
function onEventContextMenuHide(event) {
var topNode = $("eventsList");
if (topNode.menuSelectedEntry) {
topNode.menuSelectedEntry.deselect();
@ -614,7 +648,7 @@ function onAppointmentContextMenuHide(event) {
}
}
function onAppointmentsSelectionChange() {
function onEventsSelectionChange() {
listOfSelection = this;
this.removeClassName("_unfocused");
$("tasksList").addClassName("_unfocused");
@ -623,17 +657,21 @@ function onAppointmentsSelectionChange() {
function onTasksSelectionChange() {
listOfSelection = this;
this.removeClassName("_unfocused");
$("appointmentsList").addClassName("_unfocused");
$("eventsList").addClassName("_unfocused");
}
function _loadAppointmentHref(href) {
if (document.appointmentsListAjaxRequest) {
document.appointmentsListAjaxRequest.aborted = true;
document.appointmentsListAjaxRequest.abort();
function _loadEventHref(href) {
if (document.eventsListAjaxRequest) {
document.eventsListAjaxRequest.aborted = true;
document.eventsListAjaxRequest.abort();
}
var url = ApplicationBaseURL + href;
document.appointmentsListAjaxRequest
= triggerAjaxRequest(url, appointmentsListCallback, href);
document.eventsListAjaxRequest
= triggerAjaxRequest(url, eventsListCallback, href);
var table = $("eventsList").tBodies[0];
while (table.rows.length > 1)
table.removeChild(table.rows[1]);
return false;
}
@ -645,33 +683,42 @@ function _loadTasksHref(href) {
}
url = ApplicationBaseURL + href;
var selectedIds = $("tasksList").getSelectedNodesId();
var tasksList = $("tasksList");
var selectedIds;
if (tasksList)
selectedIds = tasksList.getSelectedNodesId();
else
selectedIds = null;
document.tasksListAjaxRequest
= triggerAjaxRequest(url, tasksListCallback, selectedIds);
tasksList.previousScroll = tasksList.scrollTop;
while (tasksList.childNodes.length)
tasksList.removeChild(tasksList.childNodes[0]);
return true;
}
function onHeaderClick(event) {
// log("onHeaderClick: " + this.link);
_loadAppointmentHref(this.link);
_loadEventHref(this.link);
preventDefault(event);
}
function refreshAppointments() {
return _loadAppointmentHref("aptlist?desc=" + sortOrder
+ "&sort=" + sortKey
+ "&day=" + currentDay
+ "&filterpopup=" + listFilter);
function refreshEvents() {
return _loadEventHref("eventslist?desc=" + sortOrder
+ "&sort=" + sortKey
+ "&day=" + currentDay
+ "&filterpopup=" + listFilter);
}
function refreshTasks() {
return _loadTasksHref("taskslist?show-completed=" + showCompletedTasks);
}
function refreshAppointmentsAndDisplay() {
refreshAppointments();
function refreshEventsAndDisplay() {
refreshEvents();
changeCalendarDisplay();
}
@ -681,10 +728,10 @@ function onListFilterChange() {
listFilter = node.value;
// log ("listFilter = " + listFilter);
return refreshAppointments();
return refreshEvents();
}
function onAppointmentClick(event) {
function onEventClick(event) {
var target = getTarget(event);
var node = target.getParentWithTagName("tr");
var day = node.getAttribute("day");
@ -771,8 +818,8 @@ function onSearchFormSubmit() {
return false;
}
function onCalendarSelectAppointment() {
var list = $("appointmentsList");
function onCalendarSelectEvent() {
var list = $("eventsList");
list.deselectAll();
var aptCName = this.getAttribute("aptCName");
@ -809,7 +856,7 @@ function onCalendarSelectDay(event) {
}
if (needRefresh)
refreshAppointments();
refreshEvents();
}
function changeWeekCalendarDisplayOfSelectedDay(node) {
@ -849,15 +896,15 @@ function changeMonthCalendarDisplayOfSelectedDay(node) {
node.addClassName("selectedDay");
}
function onShowCompletedTasks(node) {
showCompletedTasks = (node.checked ? 1 : 0);
function onShowCompletedTasks(event) {
showCompletedTasks = (this.checked ? 1 : 0);
return refreshTasks();
return refreshTasks();
}
function updateTaskStatus(event) {
var taskId = this.parentNode.getAttribute("id");
var taskOwner = this.parentNode.getAttribute("owner");
var taskOwner = this.parentNode.owner;
var newStatus = (this.checked ? 1 : 0);
var http = createHTTPClient();
@ -917,7 +964,7 @@ function updateCalendarStatus(event) {
}
else {
updateCalendarsList();
refreshAppointments();
refreshEvents();
refreshTasks();
changeCalendarDisplay();
}
@ -928,7 +975,7 @@ function updateCalendarStatus(event) {
function calendarStatusCallback(http) {
if (http.readyState == 4) {
if (http.status == 204) { // No content
refreshAppointments();
refreshEvents();
refreshTasks();
changeCalendarDisplay();
}
@ -1018,7 +1065,7 @@ function getMenus() {
dateMenu.push(onYearMenuItemClick);
menus["yearListMenu"] = dateMenu;
menus["appointmentsListMenu"] = new Array(onMenuNewEventClick, "-",
menus["eventsListMenu"] = new Array(onMenuNewEventClick, "-",
onMenuNewTaskClick,
editEvent, deleteEvent, "-",
onSelectAll, "-",
@ -1054,7 +1101,7 @@ function configureDragHandles() {
handle = $("rightDragHandle");
if (handle) {
handle.addInterface(SOGoDragHandlesInterface);
handle.upperBlock=$("appointmentsListView");
handle.upperBlock=$("eventsListView");
handle.lowerBlock=$("calendarView");
}
}
@ -1161,10 +1208,30 @@ function configureSearchField() {
Event.observe(searchValue, "keydown", onSearchKeyDown.bindAsEventListener(searchValue));
}
function configureLists() {
var list = $("tasksList");
list.multiselect = true;
Event.observe(list, "mousedown",
onTasksSelectionChange.bindAsEventListener(list));
var input = $("showHideCompletedTasks");
Event.observe(input, "change",
onShowCompletedTasks.bindAsEventListener(input));
list = $("eventsList");
list.multiselect = true;
Event.observe(list, "mousedown",
onEventsSelectionChange.bindAsEventListener(list));
var div = list.parentNode;
Event.observe(div, "contextmenu",
onEventContextMenu.bindAsEventListener(div));
}
function initCalendars() {
if (!document.body.hasClassName("popup")) {
initCalendarSelector();
configureSearchField();
configureLists();
var selector = $("calendarSelector");
if (selector)
selector.attachMenu("calendarsMenu");