X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=UI%2FWebServerResources%2FContactsUI.js;h=42ced264f9b9188f3bcd351c78069391f5591a4d;hb=c6c01229291a89caf24a6a11b25bcdefee5f6246;hp=0bfa6a7dcd3dd5f5ea2cd3c627bd13f6b460ee8e;hpb=9a3339124557ebbf43f8ca97b4a0282340330b87;p=scalable-opengroupware.org diff --git a/UI/WebServerResources/ContactsUI.js b/UI/WebServerResources/ContactsUI.js index 0bfa6a7d..42ced264 100644 --- a/UI/WebServerResources/ContactsUI.js +++ b/UI/WebServerResources/ContactsUI.js @@ -1,16 +1,11 @@ /* JavaScript for SOGoContacts */ var cachedContacts = new Array(); -var currentContactFolder = '/personal'; +var currentContactFolder = null; var usersRightsWindowHeight = 200; var usersRightsWindowWidth = 450; -function openContactWindow(sender, url) { - var msgWin = window.open(url, null, "width=450,height=600,resizable=0"); - msgWin.focus(); -} - function validateEditorInput(sender) { var errortext = ""; var field; @@ -19,42 +14,50 @@ function validateEditorInput(sender) { if (field.value == "") errortext = errortext + labels.error_missingsubject + "\n"; - if (!UIxRecipientSelectorHasRecipients()) + if (!hasRecipients()) errortext = errortext + labels.error_missingrecipients + "\n"; if (errortext.length > 0) { - alert(labels.error_validationfailed.decodeEntities() + ":\n" - + errortext.decodeEntities()); + alert(labels.error_validationfailed + ":\n" + + errortext); return false; } return true; } -function openContactsFolder(contactsFolder, params) { - if (contactsFolder != currentContactFolder || params) { +function openContactsFolder(contactsFolder, reload, idx) { + if ((contactsFolder && contactsFolder != currentContactFolder) + || reload) { + currentContactFolder = contactsFolder; + var url = URLForFolderID(currentContactFolder) + + "/view?noframe=1"; + + var searchValue = search["value"]; + if (searchValue && searchValue.length > 0) + url += ("&search=" + search["criteria"] + + "&value=" + escape(searchValue.utf8encode())); + var sortAttribute = sorting["attribute"]; + if (sortAttribute && sortAttribute.length > 0) + url += ("&sort=" + sorting["attribute"] + + "&asc=" + sorting["ascending"]); + + var selection; if (contactsFolder == currentContactFolder) { var contactsList = $("contactsList"); if (contactsList) selection = contactsList.getSelectedRowsId(); - else - window.alert("no contactsList"); +// else +// window.alert("no contactsList"); } else - selection = null; - - currentContactFolder = contactsFolder; - var url = URLForFolderID(currentContactFolder) + - "/view?noframe=1&sort=cn&desc=0"; - if (params) - url += '&' + params; - - var selection; - if (document.contactsListAjaxRequest) { - document.contactsListAjaxRequest.aborted = true; - document.contactsListAjaxRequest.abort(); - } - document.contactsListAjaxRequest - = triggerAjaxRequest(url, contactsListCallback, selection); + selection = null; + + if (document.contactsListAjaxRequest) { + document.contactsListAjaxRequest.aborted = true; + document.contactsListAjaxRequest.abort(); + } + document.contactsListAjaxRequest + = triggerAjaxRequest(url, contactsListCallback, selection); } } @@ -71,62 +74,113 @@ function openContactsFolderAtIndex(element) { } function contactsListCallback(http) { - var div = $("contactsListContent"); - if (http.readyState == 4 && http.status == 200) { document.contactsListAjaxRequest = null; - div.innerHTML = http.responseText; + + var table = $("contactsList"); + if (table) { + // Update table + var data = http.responseText; + var html = data.replace(/^(.*\n)*.*( 0) { + var sortHeader; + if (sorting["attribute"] == "displayName") + sortHeader = $("nameHeader"); + else if (sorting["attribute"] == "mail") + sortHeader = $("mailHeader"); + else if (sorting["attribute"] == "screenName") + sortHeader = $("screenNameHeader"); + else if (sorting["attribute"] == "org") + sortHeader = $("orgHeader"); + else if (sorting["attribute"] == "phone") + sortHeader = $("phoneHeader"); + else + sortHeader = null; + + if (sortHeader) { + var sortImages = $(table.tHead).getElementsByClassName("sortImage"); + $(sortImages).each(function(item) { + item.remove(); + }); + + var sortImage = createElement("img", "messageSortImage", "sortImage"); + sortHeader.insertBefore(sortImage, sortHeader.firstChild); + if (sorting["ascending"]) + sortImage.src = ResourcesURL + "/title_sortdown_12x12.png"; + else + sortImage.src = ResourcesURL + "/title_sortup_12x12.png"; + } + } + var selected = http.callbackData; if (selected) { - for (var i = 0; i < selected.length; i++) - $(selected[i]).select(); + for (var i = 0; i < selected.length; i++) { + var row = $(selected[i]); + if (row) + row.select(); + } } - configureSortableTableHeaders(); } else - log ("ajax fuckage 1"); + log ("ajax problem 1: status = " + http.status); } function onContactFoldersContextMenu(event) { var menu = $("contactFoldersMenu"); - Event.observe(menu, "hideMenu", onContactFoldersContextMenuHide, false); + //Event.observe(menu, "hideMenu", onContactFoldersContextMenuHide, false); + Event.observe(menu, "mousedown", onContactFoldersContextMenuHide, false); popupMenu(event, "contactFoldersMenu", this); var topNode = $("contactFolders"); var selectedNodes = topNode.getSelectedRows(); topNode.menuSelectedRows = selectedNodes; for (var i = 0; i < selectedNodes.length; i++) - selectedNodes[i].deselect(); + $(selectedNodes[i]).deselect(); topNode.menuSelectedEntry = this; - this.select(); + $(this).select(); } -function onContactContextMenu(event, element) { +function onContactContextMenu(event, element) { log ("onContactContextMenu"); var menu = $("contactMenu"); - Event.observe(menu, "hideMenu", onContactContextMenuHide, false); + + Event.observe(menu, "mousedown", onContactContextMenuHide, false); popupMenu(event, "contactMenu", element); var topNode = $("contactsList"); var selectedNodes = topNode.getSelectedRows(); topNode.menuSelectedRows = selectedNodes; for (var i = 0; i < selectedNodes.length; i++) - selectedNodes[i].deselect(); + $(selectedNodes[i]).deselect(); topNode.menuSelectedEntry = element; - element.select(); + $(element).select(); } function onContactContextMenuHide(event) { var topNode = $("contactsList"); if (topNode.menuSelectedEntry) { - topNode.menuSelectedEntry.deselect(); + $(topNode.menuSelectedEntry).deselect(); topNode.menuSelectedEntry = null; } if (topNode.menuSelectedRows) { var nodes = topNode.menuSelectedRows; for (var i = 0; i < nodes.length; i++) - nodes[i].select(); + $(nodes[i]).select(); topNode.menuSelectedRows = null; } } @@ -186,7 +240,7 @@ function contactLoadCallback(http) { div.innerHTML = content; } else - log ("ajax fuckage 2: " + http.status); + log ("ajax problem 2: " + http.status); } var rowSelectionCount = 0; @@ -228,9 +282,8 @@ function onContactRowClick(event, node) { function onContactRowDblClick(event, node) { var contactId = node.getAttribute('id'); - openContactWindow(null, - URLForFolderID(currentContactFolder) - + "/" + contactId + "/edit"); + openContactWindow(URLForFolderID(currentContactFolder) + + "/" + contactId + "/edit", contactId); return false; } @@ -238,16 +291,25 @@ function onContactRowDblClick(event, node) { function onMenuEditContact(event) { var contactId = document.menuTarget.getAttribute('id'); - openContactWindow(null, - URLForFolderID(currentContactFolder) - + "/" + contactId + "/edit"); + openContactWindow(URLForFolderID(currentContactFolder) + + "/" + contactId + "/edit", contactId); } function onMenuWriteToContact(event) { var contactId = document.menuTarget.getAttribute('id'); + var contactRow = $(contactId); + var emailCell = contactRow.down('td', 1); + + if (!emailCell.firstChild) { // .nodeValue is the contact email address + window.alert(labels["The selected contact has no email address."]); + return false; + } openMailComposeWindow(ApplicationBaseURL + currentContactFolder + "/" + contactId + "/write"); + + if (document.body.hasClassName("popup")) + window.close(); } function onMenuDeleteContact(event) { @@ -259,9 +321,8 @@ function onToolbarEditSelectedContacts(event) { var rows = contactsList.getSelectedRowsId(); for (var i = 0; i < rows.length; i++) { - openContactWindow(null, - URLForFolderID(currentContactFolder) - + "/" + rows[i] + "/edit"); + openContactWindow(URLForFolderID(currentContactFolder) + + "/" + rows[i] + "/edit", rows[i]); } return false; @@ -270,10 +331,25 @@ function onToolbarEditSelectedContacts(event) { function onToolbarWriteToSelectedContacts(event) { var contactsList = $('contactsList'); var rows = contactsList.getSelectedRowsId(); + var rowsWithEmail = 0; - for (var i = 0; i < rows.length; i++) - openMailComposeWindow(ApplicationBaseURL + currentContactFolder - + "/" + rows[i] + "/write"); + if (rows.length == 0) + return false; + + for (var i = 0; i < rows.length; i++) { + var emailCell = $(rows[i]).down('td', 1); + if (emailCell.firstChild) { // .nodeValue is the contact email address + rowsWithEmail++; + openMailComposeWindow(ApplicationBaseURL + currentContactFolder + + "/" + rows[i] + "/write"); + } + } + + if (rowsWithEmail == 0) { + window.alert(labels["The selected contact has no email address."]); + } + else if (document.body.hasClassName("popup")) + window.close(); return false; } @@ -320,38 +396,39 @@ function newEmailTo(sender) { var mailto = sanitizeMailTo(sender.parentNode.parentNode.menuTarget.innerHTML); if (mailto.length > 0) - { - w = window.open("compose?mailto=" + mailto, - "SOGo_compose", - "width=680,height=520,resizable=1,scrollbars=1,toolbar=0," + - "location=0,directories=0,status=0,menubar=0,copyhistory=0"); - w.focus(); - } + openMailComposeWindow("compose?mailto=" + mailto); return false; /* stop following the link */ } function onHeaderClick(event) { - if (document.contactsListAjaxRequest) { - document.contactsListAjaxRequest.aborted = true; - document.contactsListAjaxRequest.abort(); - } - url = URLForFolderID(currentContactFolder) + "/" + this.link; - if (!this.link.match(/noframe=/)) - url += "&noframe=1"; - document.contactsListAjaxRequest - = triggerAjaxRequest(url, contactsListCallback); + var headerId = this.getAttribute("id"); + var newSortAttribute; + if (headerId == "nameHeader") + newSortAttribute = "displayName"; + else if (headerId == "mailHeader") + newSortAttribute = "mail"; + else if (headerId == "screenNameHeader") + newSortAttribute = "screenName"; + else if (headerId == "orgHeader") + newSortAttribute = "org"; + else if (headerId == "phoneHeader") + newSortAttribute = "phone"; + + if (sorting["attribute"] == newSortAttribute) + sorting["ascending"] = !sorting["ascending"]; + else { + sorting["attribute"] = newSortAttribute; + sorting["ascending"] = true; + } - event.preventDefault(); -} + refreshCurrentFolder(); -function registerDraggableMessageNodes() { - log ("can we drag..."); + Event.stop(event); } function newContact(sender) { - openContactWindow(sender, - URLForFolderID(currentContactFolder) + "/new"); + openContactWindow(URLForFolderID(currentContactFolder) + "/new"); return false; /* stop following the link */ } @@ -363,19 +440,19 @@ function onFolderSelectionChange() { if (nodes[0].hasClassName("denied")) { var div = $("contactsListContent"); - div.innerHTML = ""; + div.update(); + } + else { + search = {}; + sorting = {}; + $("searchValue").value = ""; + initCriteria(); + openContactsFolder(nodes[0].getAttribute("id")); } - else - openContactsFolder(nodes[0].getAttribute("id"), null); } -function onSearchFormSubmit() { - var searchValue = $("searchValue"); - - openContactsFolder(currentContactFolder, - "search=" + searchValue.value); - - return false; +function refreshCurrentFolder() { + openContactsFolder(currentContactFolder, true); } function onConfirmContactSelection(event) { @@ -407,7 +484,7 @@ function onConfirmContactSelection(event) { && selectorList.value != initialValues) selector.changeNotification("addition"); - event.preventDefault(); + preventDefault(event); } function onContactMailTo(node) { @@ -415,43 +492,43 @@ function onContactMailTo(node) { } function refreshContacts(contactId) { - openContactsFolder(currentContactFolder, "reload=true"); - cachedContacts[currentContactFolder + "/" + contactId] = null; - loadContact(contactId); + refreshCurrentFolder(); + cachedContacts[currentContactFolder + "/" + contactId] = null; + loadContact(contactId); - return false; + return false; } function onAddressBookNew(event) { - var name = window.prompt(labels["Name of the Address Book"].decodeEntities()); - if (name) { - if (document.newAbAjaxRequest) { - document.newAbAjaxRequest.aborted = true; - document.newAbAjaxRequest.abort(); - } - var url = ApplicationBaseURL + "/newAb?name=" + name; - document.newAbAjaxRequest - = triggerAjaxRequest(url, newAbCallback, name); - } - event.preventDefault(); + createFolder(window.prompt(labels["Name of the Address Book"]), + appendAddressBook); + preventDefault(event); } function appendAddressBook(name, folder) { - var li = document.createElement("li"); - li.setAttribute("id", folder); - li.appendChild(document.createTextNode(name)); - setEventsOnContactFolder(li); - $("contactFolders").appendChild(li); + if (folder) + folder = accessToSubscribedFolder(folder); + else + folder = "/" + name; + if ($(folder)) + window.alert(clabels["You have already subscribed to that folder!"]); + else { + var li = document.createElement("li"); + $("contactFolders").appendChild(li); + li.setAttribute("id", folder); + li.appendChild(document.createTextNode(name)); + setEventsOnContactFolder(li); + } } -function newAbCallback(http) { +function newFolderCallback(http) { if (http.readyState == 4 && http.status == 201) { var name = http.callbackData; appendAddressBook(name, "/" + name); } else - log ("ajax fuckage 4:" + http.status); + log ("ajax problem 4:" + http.status); } function newUserFolderCallback(folderData) { @@ -463,7 +540,7 @@ function newUserFolderCallback(folderData) { function onAddressBookAdd(event) { openUserFolderSelector(newUserFolderCallback, "contact"); - event.preventDefault(); + preventDefault(event); } function onFolderUnsubscribeCB(folderId) { @@ -478,60 +555,60 @@ function onAddressBookRemove(event) { var selector = $("contactFolders"); var nodes = selector.getSelectedNodes(); if (nodes.length > 0) { - nodes[0].deselect(); - var folderId = nodes[0].getAttribute("id"); - var folderIdElements = folderId.split(":"); - if (folderIdElements.length > 1) - unsubscribeFromFolder(folderId, onFolderUnsubscribeCB, folderId); - else { - var abId = folderIdElements[0].substr(1); - deletePersonalAddressBook(abId); - var personal = $("/personal"); - personal.select(); - onFolderSelectionChange(); - } + nodes[0].deselect(); + var folderId = nodes[0].getAttribute("id"); + var folderIdElements = folderId.split("_"); + if (folderIdElements.length > 1) + unsubscribeFromFolder(folderId, onFolderUnsubscribeCB, folderId); + else { + var abId = folderIdElements[0].substr(1); + deletePersonalAddressBook(abId); + var personal = $("/personal"); + personal.select(); + onFolderSelectionChange(); + } } - event.preventDefault(); + preventDefault(event); } function deletePersonalAddressBook(folderId) { - var label - = labels["Are you sure you want to delete the selected address book?"]; - if (window.confirm(label.decodeEntities())) { - if (document.deletePersonalABAjaxRequest) { - document.deletePersonalABAjaxRequest.aborted = true; - document.deletePersonalABAjaxRequest.abort(); - } - var url = ApplicationBaseURL + "/" + folderId + "/delete"; - document.deletePersonalABAjaxRequest - = triggerAjaxRequest(url, deletePersonalAddressBookCallback, - folderId); - } + var label + = labels["Are you sure you want to delete the selected address book?"]; + if (window.confirm(label)) { + if (document.deletePersonalABAjaxRequest) { + document.deletePersonalABAjaxRequest.aborted = true; + document.deletePersonalABAjaxRequest.abort(); + } + var url = ApplicationBaseURL + "/" + folderId + "/deleteFolder"; + document.deletePersonalABAjaxRequest + = triggerAjaxRequest(url, deletePersonalAddressBookCallback, + folderId); + } } function deletePersonalAddressBookCallback(http) { if (http.readyState == 4) { - if (http.status == 200) { - var ul = $("contactFolders"); + if (isHttpStatus204(http.status)) { + var ul = $("contactFolders"); - var children = ul.childNodesWithTag("li"); - var i = 0; - var done = false; - while (!done && i < children.length) { - var currentFolderId = children[i].getAttribute("id").substr(1); - if (currentFolderId == http.callbackData) { - ul.removeChild(children[i]); - done = true; - } - else - i++; + var children = ul.childNodesWithTag("li"); + var i = 0; + var done = false; + while (!done && i < children.length) { + var currentFolderId = children[i].getAttribute("id").substr(1); + if (currentFolderId == http.callbackData) { + ul.removeChild(children[i]); + done = true; } - } - document.deletePersonalABAjaxRequest = null; + else + i++; + } + } + document.deletePersonalABAjaxRequest = null; } else - log ("ajax fuckage"); + log ("ajax problem 5: " + http.status); } function configureDragHandles() { @@ -540,6 +617,7 @@ function configureDragHandles() { handle.addInterface(SOGoDragHandlesInterface); handle.leftBlock=$("contactFoldersList"); handle.rightBlock=$("rightPanel"); + handle.leftMargin = 100; } handle = $("rightDragHandle"); @@ -560,8 +638,8 @@ function lookupDeniedFolders() { } function deniedFoldersLookupCallback(http) { - if (http.readyState == 4) { - var denied = (http.status != 204) + if (http.readyState == 4) { + var denied = ! isHttpStatus204(http.status); var entry = $(http.callbackData); if (denied) entry.addClassName("denied"); @@ -581,78 +659,131 @@ function configureAbToolbar() { function configureContactFolders() { var contactFolders = $("contactFolders"); if (contactFolders) { - Event.observe(contactFolders, "selectionchange", onFolderSelectionChange, false); + Event.observe(contactFolders, "mousedown", listRowMouseDownHandler); + Event.observe(contactFolders, "click", onFolderSelectionChange); var lis = contactFolders.childNodesWithTag("li"); for (var i = 0; i < lis.length; i++) setEventsOnContactFolder(lis[i]); lookupDeniedFolders(); - contactFolders.setStyle({ visibility: 'visible' }); - + var personalFolder = $("/personal"); personalFolder.select(); + openContactsFolder("/personal"); } } function setEventsOnContactFolder(node) { - Event.observe(node, "mousedown", listRowMouseDownHandler, false); - Event.observe(node, "click", onRowClick, false); - Event.observe(node, "contextmenu", onContactFoldersContextMenu, false); + Event.observe(node, "mousedown", listRowMouseDownHandler, false); + Event.observe(node, "click", onRowClick, false); + Event.observe(node, "contextmenu", + onContactFoldersContextMenu.bindAsEventListener(node), false); +} + +function onMenuModify(event) { + var folders = $("contactFolders"); + var selected = folders.getSelectedNodes()[0]; + + if (UserLogin == selected.getAttribute("owner")) { + var currentName = selected.innerHTML; + var newName = window.prompt(labels["Address Book Name"], + currentName); + if (newName && newName.length > 0 + && newName != currentName) { + var url = (URLForFolderID(selected.getAttribute("id")) + + "/renameFolder?name=" + escape(newName.utf8encode())); + triggerAjaxRequest(url, folderRenameCallback, + {node: selected, name: newName}); + } + } else + window.alert(clabels["Unable to rename that folder!"]); +} + +function folderRenameCallback(http) { + if (http.readyState == 4) { + if (isHttpStatus204(http.status)) { + var dict = http.callbackData; + dict["node"].innerHTML = dict["name"]; + } + } } function onMenuSharing(event) { + if ($(this).hasClassName("disabled")) + return; + var folders = $("contactFolders"); var selected = folders.getSelectedNodes()[0]; - var title = this.innerHTML; - var url = URLForFolderID(selected.getAttribute("id")); + var owner = selected.getAttribute("owner"); + if (owner == "nobody") + window.alert(clabels["The user rights cannot be" + + " edited for this object!"]); + else { + var title = this.innerHTML; + var url = URLForFolderID(selected.getAttribute("id")); + + openAclWindow(url + "/acls", title); + } +} + +function onContactFoldersMenuPrepareVisibility() { + var folders = $("contactFolders"); + var selected = folders.getSelectedNodes(); - openAclWindow(url + "/acls", title); + if (selected.length > 0) { + var folderOwner = selected[0].getAttribute("owner"); + var sharingOption = $(this).down("ul").childElements().last(); + // Disable the "Sharing" option when address book is not owned by user + if (folderOwner == UserLogin || IsSuperUser) + sharingOption.removeClassName("disabled"); + else + sharingOption.addClassName("disabled"); + } } function getMenus() { var menus = {}; - menus["contactFoldersMenu"] = new Array(null, "-", null, + menus["contactFoldersMenu"] = new Array(onMenuModify, "-", null, null, "-", null, "-", onMenuSharing); menus["contactMenu"] = new Array(onMenuEditContact, "-", onMenuWriteToContact, null, "-", onMenuDeleteContact); menus["searchMenu"] = new Array(setSearchCriteria); - + + var contactFoldersMenu = $("contactFoldersMenu"); + if (contactFoldersMenu) + contactFoldersMenu.prepareVisibility = onContactFoldersMenuPrepareVisibility; + return menus; } -function configureSearchField() { - var searchValue = $("searchValue"); - - Event.observe(searchValue, "mousedown", onSearchMouseDown.bindAsEventListener(searchValue), false); - Event.observe(searchValue, "click", popupSearchMenu.bindAsEventListener(searchValue), false); - Event.observe(searchValue, "blur", onSearchBlur.bindAsEventListener(searchValue), false); - Event.observe(searchValue, "focus", onSearchFocus.bindAsEventListener(searchValue), false); - Event.observe(searchValue, "keydown", onSearchKeyDown.bindAsEventListener(searchValue), false); -} - function configureSelectionButtons() { var container = $("contactSelectionButtons"); if (container) { var buttons = container.childNodesWithTag("input"); for (var i = 0; i < buttons.length; i++) - Event.observe(buttons[i], "click", onConfirmContactSelection.bindAsEventListener(buttons[i]), false); + Event.observe(buttons[i], "click", + onConfirmContactSelection.bindAsEventListener(buttons[i])); } } -var initContacts = { - handleEvent: function (event) { - if (!document.body.hasClassName("popup")) { - configureAbToolbar(); - configureSearchField(); - } - else - configureSelectionButtons(); - configureContactFolders(); +function initContacts(event) { + if (!document.body.hasClassName("popup")) { + configureAbToolbar(); + } + else + configureSelectionButtons(); + configureContactFolders(); // initDnd(); - } + + var table = $("contactsList"); + if (table) { + // Initialize contacts table + table.multiselect = true; + configureSortableTableHeaders(table); + TableKit.Resizable.init(table, {'trueResize' : true, 'keepWidth' : true}); + } } -//window.addEventListener("load", initContacts, false); -Event.observe(window, "load", initContacts, false); +FastInit.addOnLoad(initContacts);