mirror of
https://github.com/inverse-inc/sogo.git
synced 2026-10-01 10:00:33 +00:00
Added invitation delegation support in Web interface. See ChangeLog.
Monotone-Parent: 4d711e074341810486c1842c6a345777cc3664bb Monotone-Revision: 2fc8598099b516f243935e73039200f1c004784e Monotone-Author: flachapelle@inverse.ca Monotone-Date: 2009-09-10T18:31:20 Monotone-Branch: ca.inverse.sogo
This commit is contained in:
@@ -310,44 +310,6 @@ tr.mailer_listcell_regular td a
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
IMG.mailerReadIcon
|
||||
{
|
||||
/* TODO
|
||||
*/
|
||||
}
|
||||
|
||||
DIV.mailer_readicon
|
||||
{
|
||||
/* TODO: use Thunderbird icon */
|
||||
background-image: url(icon_read.gif);
|
||||
background-repeat: no-repeat;
|
||||
background-position: 0px 4px;
|
||||
}
|
||||
|
||||
DIV.mailer_readicon a
|
||||
{
|
||||
width: 17px;
|
||||
height: 17px;
|
||||
margin: 0px auto;
|
||||
display: block;
|
||||
}
|
||||
|
||||
DIV.mailerUnreadIcon
|
||||
{
|
||||
/* TODO: use Thunderbird icon */
|
||||
background-image: url(icon_unread.gif);
|
||||
background-repeat: no-repeat;
|
||||
background-position: 0px 4px;
|
||||
}
|
||||
|
||||
DIV.mailer_unreadicon a
|
||||
{
|
||||
width: 17px;
|
||||
height: 17px;
|
||||
margin: 0px auto;
|
||||
display: block;
|
||||
}
|
||||
|
||||
/* fields (key/value UI), eg used in mail viewer */
|
||||
INPUT#editDraftButton
|
||||
{
|
||||
@@ -814,3 +776,40 @@ DIV.copy
|
||||
background-image: url(message-copy.gif) !important;
|
||||
background-position: 1px -2px !important;
|
||||
}
|
||||
|
||||
/* UIxMailPartICalViewer */
|
||||
|
||||
#iCalAttendees SPAN
|
||||
{ background-repeat: no-repeat;
|
||||
background-position: 5px center;
|
||||
padding-left: 22px;
|
||||
padding-right: 4px; }
|
||||
|
||||
#iCalAttendees .accepted
|
||||
{ background-image: url("accepted.png"); }
|
||||
|
||||
#iCalAttendees .needs-action
|
||||
{ background-image: url("needs-action.png"); }
|
||||
|
||||
#iCalAttendees .declined
|
||||
{ background-image: url("declined.png"); }
|
||||
|
||||
#iCalAttendees .delegated
|
||||
{ background-image: url("delegated.png"); }
|
||||
|
||||
#iCalAttendees .attendeeUser,
|
||||
#iCalAttendees .attendeeUser A
|
||||
{ font-weight: bold; }
|
||||
|
||||
#delegateEditor
|
||||
{ padding-left: 5px; }
|
||||
|
||||
#delegatedTo
|
||||
{ width: 220px; }
|
||||
|
||||
#delegatedTo
|
||||
{ background-image: url("abcard.gif");
|
||||
background-repeat: no-repeat;
|
||||
background-position: 4px center;
|
||||
padding: 2px 2px 2px 24px;
|
||||
width: 220px; }
|
||||
@@ -511,9 +511,15 @@ function onMailboxMenuMove(event) {
|
||||
rows[i].hide();
|
||||
uids.push(uid);
|
||||
paths.push(path);
|
||||
// Remove references to closed popups
|
||||
for (var j = Mailer.popups.length - 1; j > -1; j--)
|
||||
if (!Mailer.popups[j].open || Mailer.popups[j].closed)
|
||||
Mailer.popups.splice(j,1);
|
||||
// Close message popup if opened
|
||||
for (var j = 0; j < Mailer.popups.length; j++)
|
||||
if (Mailer.popups[j].messageUID == path) {
|
||||
Mailer.popups[j].close();
|
||||
Mailer.popups.splice(j,1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -670,7 +676,7 @@ function messageListCallback(http) {
|
||||
addressHeaderCell.setAttribute("id", newRows[0].cells[addrIndex].getAttribute("id"));
|
||||
table.replaceChild(tmp.firstChild.tBodies[0], tbody);
|
||||
configureMessageListEvents(table);
|
||||
}
|
||||
}
|
||||
else {
|
||||
// Add table
|
||||
div.update(http.responseText);
|
||||
@@ -1012,6 +1018,46 @@ function configureiCalLinksInMessage() {
|
||||
onICalendarButtonClick.bindAsEventListener(button));
|
||||
}
|
||||
}
|
||||
|
||||
var button = $("iCalendarDelegate");
|
||||
if (button) {
|
||||
button.observe("click", onICalendarDelegate);
|
||||
var delegatedTo = $("delegatedTo");
|
||||
delegatedTo.addInterface(SOGoAutoCompletionInterface);
|
||||
delegatedTo.uidField = "c_mail";
|
||||
delegatedTo.excludeGroups = true;
|
||||
|
||||
var editDelegate = $("editDelegate");
|
||||
if (editDelegate)
|
||||
// The user delegates the invitation
|
||||
editDelegate.observe("click", function(event) {
|
||||
$("delegateEditor").show();
|
||||
$("delegatedTo").focus();
|
||||
this.hide();
|
||||
});
|
||||
|
||||
var delegatedToLink = $("delegatedToLink");
|
||||
if (delegatedToLink) {
|
||||
// The user already delegated the invitation and wants
|
||||
// to change the delegated attendee
|
||||
delegatedToLink.stopObserving("click");
|
||||
delegatedToLink.observe("click", function(event) {
|
||||
$("delegatedTo").show();
|
||||
$("delegatedTo").focus();
|
||||
this.hide();
|
||||
Event.stop(event);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function onICalendarDelegate(event) {
|
||||
var link = $("iCalendarAttachment").value;
|
||||
if (link) {
|
||||
var currentMsg = Mailer.currentMailbox + "/"
|
||||
+ Mailer.currentMessages[Mailer.currentMailbox];
|
||||
delegateInvitation(link, ICalendarButtonCallback, currentMsg);
|
||||
}
|
||||
}
|
||||
|
||||
function onICalendarButtonClick(event) {
|
||||
@@ -1041,8 +1087,13 @@ function ICalendarButtonCallback(http) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (http.status == 403) {
|
||||
var data = http.responseText;
|
||||
var msg = data.replace(/^(.*\n)*.*<p>((.*\n)*.*)<\/p>(.*\n)*.*$/, "$2");
|
||||
window.alert(clabels[msg]?clabels[msg]:msg);
|
||||
}
|
||||
else
|
||||
window.alert("received code: " + http.status);
|
||||
window.alert("received code: " + http.status + "\nerror: " + http.responseText);
|
||||
}
|
||||
|
||||
function resizeMailContent() {
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
// using this interface.
|
||||
var SOGoAutoCompletionInterface = {
|
||||
uidField: "c_name",
|
||||
excludeGroups: false,
|
||||
animationParent: null,
|
||||
selectedIndex: -1,
|
||||
delay: 0.750,
|
||||
@@ -90,7 +91,9 @@ var SOGoAutoCompletionInterface = {
|
||||
if (input.value.trim().length > 2) {
|
||||
var urlstr = (UserFolderURL + "Contacts/allContactSearch?search="
|
||||
+ encodeURIComponent(input.value));
|
||||
if (input.animationParent)
|
||||
if (input.excludeGroups)
|
||||
urlstr += "&excludeGroups=1";
|
||||
if (input.animationParent)
|
||||
startAnimation(input.animationParent);
|
||||
document.contactLookupAjaxRequest =
|
||||
triggerAjaxRequest(urlstr, input.performSearchCallback.bind(input), input);
|
||||
|
||||
@@ -183,15 +183,17 @@ function deleteEvent() {
|
||||
return false;
|
||||
}
|
||||
|
||||
function modifyEvent(sender, modification) {
|
||||
function modifyEvent(sender, modification, parameters) {
|
||||
var currentLocation = '' + window.location;
|
||||
var arr = currentLocation.split("/");
|
||||
arr[arr.length-1] = modification;
|
||||
|
||||
document.modifyEventAjaxRequest = triggerAjaxRequest(arr.join("/"),
|
||||
modifyEventCallback,
|
||||
modification);
|
||||
|
||||
modification,
|
||||
parameters,
|
||||
{ "Content-type": "application/x-www-form-urlencoded" });
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -225,6 +227,11 @@ function modifyEventCallback(http) {
|
||||
window.setTimeout("window.close();", 100);
|
||||
}
|
||||
}
|
||||
else if (http.status == 403) {
|
||||
var data = http.responseText;
|
||||
var msg = data.replace(/^(.*\n)*.*<p>((.*\n)*.*)<\/p>(.*\n)*.*$/, "$2");
|
||||
window.alert(clabels[msg]?clabels[msg]:msg);
|
||||
}
|
||||
else {
|
||||
// log("showing alert...");
|
||||
window.alert(labels["eventPartStatModificationError"]);
|
||||
|
||||
@@ -124,7 +124,8 @@ A#attendeesHref
|
||||
DIV#attendeesMenu LI
|
||||
{ padding-left: 10px; }
|
||||
|
||||
DIV#attendeesMenu .attendee
|
||||
DIV#attendeesMenu .attendee,
|
||||
DIV#attendeesMenu DIV
|
||||
{ background-repeat: no-repeat;
|
||||
background-position: 5px center;
|
||||
padding-left: 22px; }
|
||||
@@ -138,10 +139,12 @@ DIV#attendeesMenu .needs-action
|
||||
DIV#attendeesMenu .declined
|
||||
{ background-image: url("declined.png"); }
|
||||
|
||||
DIV#attendeesMenu .delegated
|
||||
{ background-image: url("delegated.png"); }
|
||||
|
||||
DIV#attendeesMenu .delegate
|
||||
{ margin-left: 10px; }
|
||||
|
||||
/* read-only view */
|
||||
DIV#attendeesMenu DIV
|
||||
{ cursor: pointer;
|
||||
padding-left: 20px; }
|
||||
|
||||
DIV#attendeesMenu DIV:hover
|
||||
{ text-decoration: underline; }
|
||||
{ padding-left: 20px; }
|
||||
|
||||
@@ -99,44 +99,6 @@ function validateAptEditor() {
|
||||
return true;
|
||||
}
|
||||
|
||||
function toggleDetails() {
|
||||
var div = $("details");
|
||||
var buttons = $("buttons");
|
||||
var buttonsHeight = buttons.clientHeight * 3;
|
||||
|
||||
if (div.style.visibility) {
|
||||
div.style.visibility = null;
|
||||
window.resizeBy(0, -(div.clientHeight + buttonsHeight));
|
||||
$("detailsButton").innerHTML = labels["Show Details"];
|
||||
} else {
|
||||
div.style.visibility = 'visible;';
|
||||
window.resizeBy(0, (div.clientHeight + buttonsHeight));
|
||||
$("detailsButton").innerHTML = labels["Hide Details"];
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function toggleCycleVisibility(node, nodeName, hiddenValue) {
|
||||
var spanNode = $(nodeName);
|
||||
var newVisibility = ((node.value == hiddenValue) ? null : 'visible;');
|
||||
spanNode.style.visibility = newVisibility;
|
||||
|
||||
if (nodeName == 'cycleSelectionFirstLevel') {
|
||||
var otherSpanNode = $('cycleSelectionSecondLevel');
|
||||
if (!newVisibility)
|
||||
{
|
||||
otherSpanNode.superVisibility = otherSpanNode.style.visibility;
|
||||
otherSpanNode.style.visibility = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
otherSpanNode.style.visibility = otherSpanNode.superVisibility;
|
||||
otherSpanNode.superVisibility = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function onAttendeesMenuPrepareVisibility()
|
||||
{
|
||||
var composeToUndecidedAttendees = $('composeToUndecidedAttendees');
|
||||
@@ -201,8 +163,10 @@ function addContact(tag, fullContactName, contactId, contactName, contactEmail)
|
||||
}
|
||||
|
||||
function saveEvent(sender) {
|
||||
if (validateAptEditor())
|
||||
if (validateAptEditor()) {
|
||||
document.forms['editform'].attendees.value = attendees.toJSON();
|
||||
document.forms['editform'].submit();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
@@ -335,51 +299,22 @@ function initTimeWidgets(widgets) {
|
||||
}
|
||||
|
||||
function refreshAttendeesRO () {
|
||||
var attendeesNames = $("attendeesNames").value;
|
||||
var attendeesEmails = $("attendeesEmails").value.split(",");
|
||||
var attendeesStates = $("attendeesStates").value.split(",");
|
||||
var attendeesMenu = $("attendeesMenu");
|
||||
var attendeesLabel = $("attendeesLabel");
|
||||
|
||||
if (attendeesMenu) {
|
||||
for (var i = 0; i < attendeesMenu.childNodes.length; i++)
|
||||
attendeesMenu.removeChild (attendeesMenu.childNodes[i]);
|
||||
}
|
||||
|
||||
if (attendeesNames.length > 0) {
|
||||
// Update attendees link and show label
|
||||
if (attendeesLabel)
|
||||
attendeesLabel.setStyle({ display: "block" });
|
||||
if ($("attendeesDiv"))
|
||||
$("attendeesDiv").setStyle({display: "block"});
|
||||
|
||||
// Update attendees in menu
|
||||
attendeesNames = attendeesNames.split(",");
|
||||
for (var i = 0; i < attendeesEmails.length; i++) {
|
||||
var node = document.createElement("div");
|
||||
if (attendeesMenu)
|
||||
attendeesMenu.appendChild(node);
|
||||
$(node).writeAttribute("email", attendeesEmails[i]);
|
||||
$(node).addClassName("attendee");
|
||||
$(node).addClassName(attendeesStates[i]);
|
||||
node.appendChild(document.createTextNode(attendeesNames[i]));
|
||||
$(node).observe("click", onMailTo);
|
||||
}
|
||||
}
|
||||
else {
|
||||
// Hide link of attendees
|
||||
attendeesLabel.setStyle({ display: "none" });
|
||||
if ($("attendeesDiv"))
|
||||
$("attendeesDiv").setStyle({display: "none"});
|
||||
}
|
||||
|
||||
var attendeesDiv = $("attendeesDiv");
|
||||
|
||||
attendeesLabel.setStyle({ display: "block" });
|
||||
attendeesDiv.setStyle({display: "block"});
|
||||
|
||||
// Register "click" event on each attendee's email
|
||||
var attendees = attendeesMenu.getElementsByTagName('a');
|
||||
$A(attendees).each(function(attendee) {
|
||||
$(attendee).observe("click", onMailTo);
|
||||
});
|
||||
}
|
||||
|
||||
function refreshAttendees() {
|
||||
function refreshAttendees(newAttendees) {
|
||||
var attendeesLabel = $("attendeesLabel");
|
||||
var attendeesNames = $("attendeesNames").value;
|
||||
var attendeesEmails = $("attendeesEmails").value.split(",");
|
||||
var attendeesStates = $("attendeesStates").value.split(",");
|
||||
var attendeesHref = $("attendeesHref");
|
||||
var attendeesMenu = $("attendeesMenu");
|
||||
|
||||
@@ -398,24 +333,36 @@ function refreshAttendees() {
|
||||
if (menuItems && attendeesMenu)
|
||||
for (var i = 0; i < menuItems.length; i++)
|
||||
attendeesMenu.removeChild(menuItems[i]);
|
||||
|
||||
if (attendeesNames.length > 0) {
|
||||
// Update attendees link and show label
|
||||
attendeesHref.appendChild(document.createTextNode(attendeesNames));
|
||||
attendeesLabel.setStyle({ display: "block" });
|
||||
|
||||
if (newAttendees)
|
||||
attendees = $H(newAttendees.evalJSON(true));
|
||||
|
||||
// Update attendees in menu
|
||||
attendeesNames = attendeesNames.split(",");
|
||||
for (var i = 0; i < attendeesEmails.length; i++) {
|
||||
var node = document.createElement("li");
|
||||
if (attendeesMenu)
|
||||
attendeesMenu.appendChild(node);
|
||||
$(node).writeAttribute("email", attendeesEmails[i]);
|
||||
$(node).addClassName("attendee");
|
||||
$(node).addClassName(attendeesStates[i]);
|
||||
node.appendChild(document.createTextNode(attendeesNames[i]));
|
||||
$(node).observe("click", onMailTo);
|
||||
}
|
||||
if (attendees.keys().length > 0) {
|
||||
// Update attendees link and show label
|
||||
var names = new Array();
|
||||
attendees.values().each(function(attendee) {
|
||||
attendee = $H(attendee);
|
||||
var name = attendee.get('name') || attendee.get('email');
|
||||
if (!attendee.get('delegated-to'))
|
||||
names.push(name);
|
||||
|
||||
if (attendeesMenu) {
|
||||
var delegatedTo = attendee.get('delegated-to');
|
||||
if (!attendee.get('delegated-from') || delegatedTo) {
|
||||
var node = document.createElement("li");
|
||||
attendeesMenu.appendChild(node);
|
||||
setupAttendeeNode(node, attendee);
|
||||
}
|
||||
if (delegatedTo) {
|
||||
var delegate = attendees.get(delegatedTo);
|
||||
var node = document.createElement("li");
|
||||
attendeesMenu.appendChild(node);
|
||||
setupAttendeeNode(node, $H(delegate), true);
|
||||
}
|
||||
}
|
||||
});
|
||||
attendeesHref.appendChild(document.createTextNode(names.join(", ")));
|
||||
attendeesLabel.setStyle({ display: "block" });
|
||||
}
|
||||
else {
|
||||
// Hide link of attendees
|
||||
@@ -423,6 +370,25 @@ function refreshAttendees() {
|
||||
}
|
||||
}
|
||||
|
||||
function setupAttendeeNode(aNode, aAttendee, isDelegate) {
|
||||
// Construct the display string from common name and/or email address.
|
||||
var name = aAttendee.get('name');
|
||||
var email = aAttendee.get('email');
|
||||
// if (name)
|
||||
// name += ' <' + email + '>';
|
||||
// else
|
||||
// name = email;
|
||||
name = name || email;
|
||||
|
||||
$(aNode).writeAttribute("email", email);
|
||||
$(aNode).addClassName("attendee");
|
||||
$(aNode).addClassName(aAttendee.get('partstat'));
|
||||
if (isDelegate)
|
||||
$(aNode).addClassName("delegate");
|
||||
aNode.appendChild(document.createTextNode(name));
|
||||
$(aNode).observe("click", onMailTo);
|
||||
}
|
||||
|
||||
function initializeAttendeesHref() {
|
||||
var attendeesHref = $("attendeesHref");
|
||||
var attendeesLabel = $("attendeesLabel");
|
||||
@@ -443,6 +409,8 @@ function onMailTo(event) {
|
||||
var target = getTarget(event);
|
||||
var address = target.firstChild.nodeValue.trim() + " <" + target.readAttribute("email") + ">";
|
||||
openMailTo(address);
|
||||
Event.stop(event);
|
||||
return false;
|
||||
}
|
||||
|
||||
function getMenus() {
|
||||
@@ -473,6 +441,10 @@ function onAppointmentEditorLoad() {
|
||||
'minute': $("endTime_time_minute")}};
|
||||
initTimeWidgets(widgets);
|
||||
}
|
||||
|
||||
// Extend JSON representation of attendees
|
||||
attendees = $H(attendees);
|
||||
|
||||
initializeAttendeesHref();
|
||||
}
|
||||
|
||||
|
||||
@@ -121,6 +121,14 @@ TABLE#freeBusyAttendees TR.futureAttendee INPUT
|
||||
{ background-image: none;
|
||||
color: #aaa; }
|
||||
|
||||
TABLE#freeBusyAttendees TR.futureAttendee TD,
|
||||
TABLE#freeBusyData TR.futureData TD
|
||||
{ border: 0;
|
||||
line-height: 3em; }
|
||||
|
||||
TABLE#freeBusyAttendees TR.futureAttendee TD A
|
||||
{ margin-left: 24px; }
|
||||
|
||||
SPAN.freeBusyZoneElement
|
||||
{ display: block;
|
||||
float: left;
|
||||
|
||||
@@ -13,11 +13,7 @@ var attendeesEditor = {
|
||||
delay: 500,
|
||||
delayedSearch: false,
|
||||
currentField: null,
|
||||
selectedIndex: -1,
|
||||
names: null,
|
||||
UIDs: null,
|
||||
emails: null,
|
||||
states: null
|
||||
selectedIndex: -1
|
||||
};
|
||||
|
||||
|
||||
@@ -48,12 +44,12 @@ function onContactKeydown(event) {
|
||||
var row = $(this).up("tr").next();
|
||||
this.blur(); // triggers checkAttendee function call
|
||||
var input = row.down("input");
|
||||
if (input.readOnly)
|
||||
newAttendee(null);
|
||||
else {
|
||||
if (input) {
|
||||
input.focussed = true;
|
||||
input.activate();
|
||||
}
|
||||
else
|
||||
newAttendee(null);
|
||||
}
|
||||
else if (event.keyCode == 0
|
||||
|| event.keyCode == 8 // Backspace
|
||||
@@ -579,15 +575,12 @@ function onNextSlotClick (event) {
|
||||
|
||||
function onEditorOkClick(event) {
|
||||
preventDefault(event);
|
||||
|
||||
attendeesEditor.names = new Array();
|
||||
attendeesEditor.UIDs = new Array();
|
||||
attendeesEditor.emails = new Array();
|
||||
attendeesEditor.states = new Array();
|
||||
|
||||
|
||||
var attendees = window.opener.attendees;
|
||||
var newAttendees = new Hash();
|
||||
var table = $("freeBusy");
|
||||
var inputs = table.getElementsByTagName("input");
|
||||
for (var i = 0; i < inputs.length - 2; i++) {
|
||||
for (var i = 0; i < inputs.length - 1; i++) {
|
||||
var row = $(inputs[i]).up("tr");
|
||||
var name = extractEmailName(inputs[i].value);
|
||||
var email = extractEmailAddress(inputs[i].value);
|
||||
@@ -599,24 +592,15 @@ function onEditorOkClick(event) {
|
||||
name = inputs[i].uid;
|
||||
else
|
||||
name = email;
|
||||
var state = "needs-action";
|
||||
if (row.hasClassName("accepted"))
|
||||
state = "accepted";
|
||||
else if (row.hasClassName("declined"))
|
||||
state = "declined";
|
||||
var pos = attendeesEditor.emails.indexOf(email);
|
||||
if (pos == -1)
|
||||
pos = attendeesEditor.emails.length;
|
||||
attendeesEditor.names[pos] = name;
|
||||
attendeesEditor.UIDs[pos] = uid;
|
||||
attendeesEditor.emails[pos] = email;
|
||||
attendeesEditor.states[pos] = state;
|
||||
var attendee = attendees.get(email);
|
||||
if (!attendee)
|
||||
attendee = new Hash({'email': email,
|
||||
'name': name,
|
||||
'uid': uid,
|
||||
'partstat': 'needs-action'});
|
||||
newAttendees.set(email, attendee);
|
||||
}
|
||||
parent$("attendeesNames").value = attendeesEditor.names.join(",");
|
||||
parent$("attendeesUIDs").value = attendeesEditor.UIDs.join(",");
|
||||
parent$("attendeesEmails").value = attendeesEditor.emails.join(",");
|
||||
parent$("attendeesStates").value = attendeesEditor.states.join(",");
|
||||
window.opener.refreshAttendees();
|
||||
window.opener.refreshAttendees(newAttendees.toJSON());
|
||||
|
||||
updateParentDateFields("startTime", "startTime");
|
||||
updateParentDateFields("endTime", "endTime");
|
||||
@@ -746,15 +730,11 @@ function prepareTableRows() {
|
||||
}
|
||||
|
||||
function prepareAttendees() {
|
||||
var value = parent$("attendeesNames").value;
|
||||
var tableAttendees = $("freeBusyAttendees");
|
||||
var tableData = $("freeBusyData");
|
||||
if (value.length > 0) {
|
||||
attendeesEditor.names = parent$("attendeesNames").value.split(",");
|
||||
attendeesEditor.UIDs = parent$("attendeesUIDs").value.split(",");
|
||||
attendeesEditor.emails = parent$("attendeesEmails").value.split(",");
|
||||
attendeesEditor.states = parent$("attendeesStates").value.split(",");
|
||||
var attendees = window.opener.attendees;
|
||||
|
||||
if (attendees && attendees.keys()) {
|
||||
var tbodyAttendees = tableAttendees.tBodies[0];
|
||||
var modelAttendee = tbodyAttendees.rows[tbodyAttendees.rows.length - 1];
|
||||
var newAttendeeRow = tbodyAttendees.rows[tbodyAttendees.rows.length - 2];
|
||||
@@ -763,42 +743,38 @@ function prepareAttendees() {
|
||||
var modelData = tbodyData.rows[tbodyData.rows.length - 1];
|
||||
var newDataRow = tbodyData.rows[tbodyData.rows.length - 2];
|
||||
|
||||
for (var i = 0; i < attendeesEditor.names.length; i++) {
|
||||
var row = modelAttendee.cloneNode(true);
|
||||
tbodyAttendees.insertBefore(row, newAttendeeRow);
|
||||
$(row).removeClassName("attendeeModel");
|
||||
$(row).addClassName(attendeesEditor.states[i]);
|
||||
var input = $(row).down("input");
|
||||
var value = "";
|
||||
if (attendeesEditor.names[i].length > 0
|
||||
&& attendeesEditor.names[i] != attendeesEditor.emails[i])
|
||||
value += attendeesEditor.names[i] + " ";
|
||||
value += "<" + attendeesEditor.emails[i] + ">";
|
||||
input.value = value;
|
||||
if (attendeesEditor.UIDs[i].length > 0)
|
||||
input.uid = attendeesEditor.UIDs[i];
|
||||
input.setAttribute("name", "");
|
||||
input.setAttribute("modified", "0");
|
||||
input.observe("blur", checkAttendee);
|
||||
input.observe("keydown", onContactKeydown);
|
||||
attendees.values().each(function(attendee) {
|
||||
attendee = $H(attendee);
|
||||
var row = modelAttendee.cloneNode(true);
|
||||
tbodyAttendees.insertBefore(row, newAttendeeRow);
|
||||
$(row).removeClassName("attendeeModel");
|
||||
$(row).addClassName(attendee.get('partstat'));
|
||||
var input = $(row).down("input");
|
||||
var value = attendee.get('name');
|
||||
if (value)
|
||||
value += " ";
|
||||
else
|
||||
value = "";
|
||||
value += "<" + attendee.get('email') + ">";
|
||||
input.value = value;
|
||||
if (attendee.get('uid'))
|
||||
input.uid = attendee.get('uid');
|
||||
input.setAttribute("name", "");
|
||||
input.setAttribute("modified", "0");
|
||||
input.observe("blur", checkAttendee);
|
||||
input.observe("keydown", onContactKeydown);
|
||||
|
||||
row = modelData.cloneNode(true);
|
||||
tbodyData.insertBefore(row, newDataRow);
|
||||
$(row).removeClassName("dataModel");
|
||||
row = modelData.cloneNode(true);
|
||||
tbodyData.insertBefore(row, newDataRow);
|
||||
$(row).removeClassName("dataModel");
|
||||
|
||||
displayFreeBusyForNode(input);
|
||||
}
|
||||
}
|
||||
else {
|
||||
attendeesEditor.names = new Array();
|
||||
attendeesEditor.UIDs = new Array();
|
||||
attendeesEditor.emails = new Array();
|
||||
//newAttendee(null);
|
||||
displayFreeBusyForNode(input);
|
||||
});
|
||||
}
|
||||
|
||||
var inputs = tableAttendees.select("input");
|
||||
inputs[inputs.length - 2].setAttribute("autocomplete", "off");
|
||||
inputs[inputs.length - 2].observe("click", newAttendee);
|
||||
// Activate "Add attendee" button
|
||||
var links = tableAttendees.select("TR.futureAttendee TD A");
|
||||
links.first().observe("click", newAttendee);
|
||||
}
|
||||
|
||||
function onWindowResize(event) {
|
||||
|
||||
@@ -85,9 +85,29 @@ DIV.fakeTextArea
|
||||
border-width: 2px;
|
||||
border-style: inset;
|
||||
padding: 2px;
|
||||
height: 100px;
|
||||
white-space: pre-wrap; }
|
||||
height: 100px; }
|
||||
|
||||
DIV#descriptionDiv,
|
||||
DIV#attendeesDiv
|
||||
{ height: 120px; }
|
||||
|
||||
DIV#descriptionDiv DIV.fakeTextArea
|
||||
{ line-height: 1.5em;
|
||||
padding: 2px 4px;
|
||||
white-space: pre-wrap; }
|
||||
|
||||
#delegateEditor
|
||||
{ padding-bottom: 1em; }
|
||||
|
||||
#delegatedTo
|
||||
{ background-image: url("abcard.gif");
|
||||
background-repeat: no-repeat;
|
||||
background-position: 4px center;
|
||||
padding: 2px 2px 2px 24px;
|
||||
width: 260px; }
|
||||
|
||||
IMG#progressIndicator
|
||||
{ float: none;
|
||||
position: absolute;
|
||||
right: 1em;
|
||||
margin: 0 5px; }
|
||||
|
||||
@@ -130,15 +130,25 @@ function onComponentEditorLoad(event) {
|
||||
list.fire("mousedown");
|
||||
}
|
||||
|
||||
if ($("itemPrivacyList")) {
|
||||
var menuItems = $("itemPrivacyList").childNodesWithTag("li");
|
||||
var tmp = $("itemPrivacyList");
|
||||
if (tmp) {
|
||||
var menuItems = tmp.childNodesWithTag("li");
|
||||
for (var i = 0; i < menuItems.length; i++)
|
||||
menuItems[i].observe("mousedown",
|
||||
onMenuSetClassification.bindAsEventListener(menuItems[i]),
|
||||
false);
|
||||
}
|
||||
|
||||
var tmp = $("repeatHref");
|
||||
tmp = $("replyList");
|
||||
if (tmp) {
|
||||
tmp.observe("change", onReplyChange);
|
||||
tmp = $("delegatedTo");
|
||||
tmp.addInterface(SOGoAutoCompletionInterface);
|
||||
tmp.uidField = "c_mail";
|
||||
tmp.excludeGroups = true;
|
||||
tmp.animationParent=$("delegateEditor");
|
||||
}
|
||||
tmp = $("repeatHref");
|
||||
if (tmp)
|
||||
tmp.observe("click", onPopupRecurrenceWindow);
|
||||
tmp = $("repeatList");
|
||||
@@ -182,6 +192,21 @@ function onSummaryChange (e) {
|
||||
document.title = $("summary").value;
|
||||
}
|
||||
|
||||
function onReplyChange(event) {
|
||||
var delegateEditor = $("delegateEditor");
|
||||
if (this.value == 2) {
|
||||
// Delegated
|
||||
delegateEditor.show();
|
||||
$("delegatedTo").focus();
|
||||
}
|
||||
else {
|
||||
delegateEditor.hide();
|
||||
}
|
||||
onWindowResize(null);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function onWindowResize(event) {
|
||||
var comment = $("commentArea");
|
||||
if (comment) {
|
||||
@@ -269,14 +294,19 @@ function onOkButtonClick (e) {
|
||||
var item = $("replyList");
|
||||
var value = parseInt(item.options[item.selectedIndex].value);
|
||||
var action = "";
|
||||
var parameters = "";
|
||||
|
||||
if (value == 0)
|
||||
action = 'accept';
|
||||
else if (value == 1)
|
||||
action = 'decline';
|
||||
else if (value == 2) {
|
||||
var url = ApplicationBaseURL + activeCalendar + '/' + activeComponent;
|
||||
document.modifyEventAjaxRequest = delegateInvitation(url, modifyEventCallback);
|
||||
}
|
||||
|
||||
if (action != "")
|
||||
modifyEvent (item, action);
|
||||
modifyEvent (item, action, parameters);
|
||||
}
|
||||
|
||||
function onCancelButtonClick (e) {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
HTML, BODY
|
||||
{ background-color: #fff;
|
||||
font-size: normal;
|
||||
font-family: sans-serif; }
|
||||
font-family: sans-serif; }
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 540 B |
@@ -759,7 +759,7 @@ DIV.resize-handle
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
max-height: 2em; }
|
||||
max-height: 2em; } /* will be set in JavaScript when setting drag handles */
|
||||
|
||||
@media print
|
||||
{
|
||||
@@ -779,8 +779,8 @@ DIV.resize-handle
|
||||
|
||||
.genericHoverClass
|
||||
{
|
||||
background-color: #f0f0f0 !important;
|
||||
color: #000000 !important;
|
||||
background-color: #0033cc !important;
|
||||
color: #fff !important;
|
||||
}
|
||||
|
||||
DIV#uploadDialog,DIV#uploadResults
|
||||
|
||||
@@ -1602,6 +1602,26 @@ function createFolderCallback(http) {
|
||||
}
|
||||
}
|
||||
|
||||
/* invitation delegation */
|
||||
function delegateInvitation(componentUrl, callbackFunction, callbackData) {
|
||||
var input = $("delegatedTo");
|
||||
var delegatedTo = null;
|
||||
if (input.uid != null)
|
||||
delegatedTo = input.uid;
|
||||
else if (input.value.blank())
|
||||
alert(clabels["noEmailForDelegation"]);
|
||||
else
|
||||
delegatedTo = input.value;
|
||||
|
||||
if (delegatedTo) {
|
||||
var receiveUpdates = false; //confirm("Do you want to keep receiving updates on the event?");
|
||||
var urlstr = componentUrl + "/delegate";
|
||||
var parameters = "to=" + delegatedTo + "&receiveUpdates=" + (receiveUpdates?"YES":"NO");
|
||||
return triggerAjaxRequest(urlstr, callbackFunction, callbackData, parameters,
|
||||
{ "Content-type": "application/x-www-form-urlencoded" });
|
||||
}
|
||||
}
|
||||
|
||||
function onFinalLoadHandler(event) {
|
||||
var safetyNet = $("javascriptSafetyNet");
|
||||
if (safetyNet)
|
||||
@@ -1623,7 +1643,6 @@ function getMenus() {
|
||||
}
|
||||
|
||||
function onHeaderClick(event) {
|
||||
window.alert("generic headerClick");
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Vendored
+406
-247
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user