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

View file

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