From 38f3f08e4dbc8678ab3696204672c7146f3ec9c0 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Thu, 29 Mar 2007 18:05:23 +0000 Subject: [PATCH] Monotone-Parent: d7355e980d99c04e1e5eb5def96cba208b810cd2 Monotone-Revision: eea420a3a6baf8b6e4fd36b41c6108614dfca6db Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2007-03-29T18:05:23 Monotone-Branch: ca.inverse.sogo --- UI/WebServerResources/ContactsUI.js | 404 ++++++------------ UI/WebServerResources/MailerUI.js | 35 +- UI/WebServerResources/SchedulerUI.css | 30 +- UI/WebServerResources/SchedulerUI.js | 306 +++++++------ UI/WebServerResources/UIxAclEditor.css | 12 +- UI/WebServerResources/UIxAclEditor.js | 120 +++--- .../UIxContactsUserFolders.js | 138 ++++++ 7 files changed, 490 insertions(+), 555 deletions(-) create mode 100644 UI/WebServerResources/UIxContactsUserFolders.js diff --git a/UI/WebServerResources/ContactsUI.js b/UI/WebServerResources/ContactsUI.js index c889d4754..caee6cdb7 100644 --- a/UI/WebServerResources/ContactsUI.js +++ b/UI/WebServerResources/ContactsUI.js @@ -1,70 +1,13 @@ -/* - Copyright (C) 2005 SKYRIX Software AG - - This file is part of OpenGroupware.org. - - OGo is free software; you can redistribute it and/or modify it under - the terms of the GNU Lesser General Public License as published by the - Free Software Foundation; either version 2, or (at your option) any - later version. - - OGo is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with OGo; see the file COPYING. If not, write to the - Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. -*/ -/* JavaScript for SOGo Mailer */ - -/* - DOM ids available in mail list view: - row_$msgid - div_$msgid - readdiv_$msgid - unreaddiv_$msgid - - Window Properties: - width, height - bool: resizable, scrollbars, toolbar, location, directories, status, - menubar, copyhistory -*/ +/* JavaScript for SOGoContacts */ var cachedContacts = new Array(); -var currentContactFolder = ''; -var currentFolderIsExternal = false; -var contactSelectorAction = 'addressbooks-contacts'; +var currentContactFolder = '/personal'; function openContactWindow(sender, url) { var msgWin = window.open(url, null, "width=450,height=600,resizable=0"); msgWin.focus(); } -function clickedUid(sender, contactuid) { - resetSelection(window); - openContactWindow(sender, contactuid, - CurrentContactFolderURL() - + "/" + contactuid + "/edit"); - return true; -} - -function doubleClickedUid(sender, contactuid) { - alert("DOUBLE Clicked " + contactuid); - - return false; -} - -function toggleMailSelect(sender) { - var row; - row = $(sender.name); - row.className = sender.checked ? "tableview_selected" : "tableview"; -} - -/* mail editor */ - function validateEditorInput(sender) { var errortext = ""; var field; @@ -84,25 +27,7 @@ function validateEditorInput(sender) { return true; } -function onContactsFolderTreeItemClick(element) { - var topNode = $('d'); - var contactsFolder = element.parentNode.getAttribute("dataname"); - - if (topNode.selectedEntry) - topNode.selectedEntry.deselect(); - element.select(); - topNode.selectedEntry = element; - - openContactsFolder(contactsFolder); -} - -function CurrentContactFolderURL() { - return ((currentFolderIsExternal) - ? UserFolderURL + "../" + currentContactFolder + "/Contacts/personal" - : ApplicationBaseURL + currentContactFolder); -} - -function openContactsFolder(contactsFolder, params, external) { +function openContactsFolder(contactsFolder, params) { if (contactsFolder != currentContactFolder || params) { if (contactsFolder == currentContactFolder) { var contactsList = $("contactsList"); @@ -115,11 +40,8 @@ function openContactsFolder(contactsFolder, params, external) { selection = null; currentContactFolder = contactsFolder; - if (external) - currentFolderIsExternal = true; - else - currentFolderIsExternal = false; - var url = CurrentContactFolderURL() + "/view?noframe=1&sort=cn&desc=0"; + var url = URLForFolderID(currentContactFolder) + + "/view?noframe=1&sort=cn&desc=0"; if (params) url += '&' + params; @@ -135,7 +57,7 @@ function openContactsFolder(contactsFolder, params, external) { function openContactsFolderAtIndex(element) { var idx = element.getAttribute("idx"); - var url = CurrentContactFolderURL() + "/view?noframe=1&idx=" + idx; + var url = URLForFolderID(currentContactFolder) + "/view?noframe=1&idx=" + idx; if (document.contactsListAjaxRequest) { document.contactsListAjaxRequest.aborted = true; @@ -243,8 +165,8 @@ function loadContact(idx) { div.innerHTML = cachedContacts[currentContactFolder + "/" + idx]; } else { - var url = (CurrentContactFolderURL() + "/" - + idx + "/view?noframe=1"); + var url = (URLForFolderID(currentContactFolder) + + "/" + idx + "/view?noframe=1"); document.contactAjaxRequest = triggerAjaxRequest(url, contactLoadCallback, idx); } @@ -304,7 +226,7 @@ function onContactRowDblClick(event, node) { var contactId = node.getAttribute('id'); openContactWindow(null, - CurrentContactFolderURL() + URLForFolderID(currentContactFolder) + "/" + contactId + "/edit"); return false; @@ -315,7 +237,7 @@ function onMenuEditContact(event, node) { var contactId = node.getAttribute('id'); openContactWindow(null, - CurrentContactFolderURL() + URLForFolderID(currentContactFolder) + "/" + contactId + "/edit"); return false; @@ -325,7 +247,7 @@ function onMenuWriteToContact(event, node) { var node = getParentMenu(node).menuTarget.parentNode; var contactId = node.getAttribute('id'); - openMailComposeWindow(CurrentContactFolderURL() + openMailComposeWindow(ApplicationBaseURL + currentContactFolder + "/" + contactId + "/write"); return false; @@ -343,7 +265,7 @@ function onToolbarEditSelectedContacts(event) { for (var i = 0; i < rows.length; i++) { openContactWindow(null, - CurrentContactFolderURL() + URLForFolderID(currentContactFolder) + "/" + rows[i] + "/edit"); } @@ -355,7 +277,7 @@ function onToolbarWriteToSelectedContacts(event) { var rows = contactsList.getSelectedRowsId(); for (var i = 0; i < rows.length; i++) - openMailComposeWindow(CurrentContactFolderURL() + openMailComposeWindow(ApplicationBaseURL + currentContactFolder + "/" + rows[i] + "/write"); return false; @@ -374,7 +296,7 @@ function uixDeleteSelectedContacts(sender) { /* send AJAX request (synchronously) */ - url = (CurrentContactFolderURL() + "/" + url = (URLForFolderID(currentContactFolder) + "/" + rows[i] + "/delete"); http = createHTTPClient(); http.open("POST", url, false /* not async */); @@ -394,7 +316,7 @@ function uixDeleteSelectedContacts(sender) { } if (failCount > 0) - alert("Could not delete " + failCount + " messages!"); + alert("Could not delete the selected contacts!"); return false; } @@ -419,7 +341,7 @@ function onHeaderClick(event) { document.contactsListAjaxRequest.aborted = true; document.contactsListAjaxRequest.abort(); } - url = CurrentContactFolderURL() + "/" + this.link; + url = URLForFolderID(currentContactFolder) + "/" + this.link; if (!this.link.match(/noframe=/)) url += "&noframe=1"; document.contactsListAjaxRequest @@ -434,145 +356,63 @@ function registerDraggableMessageNodes() { function newContact(sender) { openContactWindow(sender, - CurrentContactFolderURL() + "/new"); + URLForFolderID(currentContactFolder) + "/new"); return false; /* stop following the link */ } function onFolderSelectionChange() { - var folderList = $("contactFolders"); - var nodes = folderList.getSelectedNodes(); - $("contactView").innerHTML = ''; - - if (nodes[0].hasClassName("denied")) { - var div = $("contactsListContent"); - div.innerHTML = ""; - } - else { - var newFolder; - var externalFolder = nodes[0].getAttribute("external-addressbook"); - if (externalFolder) - newFolder = externalFolder; - else - newFolder = nodes[0].getAttribute("id"); - - openContactsFolder(newFolder, null, externalFolder); - } + var folderList = $("contactFolders"); + var nodes = folderList.getSelectedNodes(); + $("contactView").innerHTML = ''; + + if (nodes[0].hasClassName("denied")) { + var div = $("contactsListContent"); + div.innerHTML = ""; + } + else + openContactsFolder(nodes[0].getAttribute("id"), null); } function onSearchFormSubmit() { var searchValue = $("searchValue"); - openContactsFolder(currentContactFolder, "search=" + searchValue.value); + openContactsFolder(URLForFolderID(currentContactFolder), + "search=" + searchValue.value); return false; } -function onConfirmContactSelection(tag) { - var folderLi = $(currentContactFolder); - var currentContactFolderName = folderLi.innerHTML; - var selectorList = null; - var initialValues = null; +function onConfirmContactSelection(event) { + var tag = this.getAttribute("name"); + var folderLi = $(currentContactFolder); + var currentContactFolderName = folderLi.innerHTML; + var selectorList = null; + var initialValues = null; - if (selector) - { + if (selector) { var selectorId = selector.getAttribute("id"); selectorList = opener.window.document.getElementById('uixselector-' + selectorId + '-uidList'); initialValues = selectorList.value; - } + } - var contactsList = $("contactsList"); - var rows = contactsList.getSelectedRows(); - for (i = 0; i < rows.length; i++) { - var cid = rows[i].getAttribute("contactid"); - var cname = '' + rows[i].getAttribute("contactname"); - var email = '' + rows[i].cells[1].innerHTML; - opener.window.addContact(tag, currentContactFolderName + '/' + cname, - cid, cname, email); - } + var contactsList = $("contactsList"); + var rows = contactsList.getSelectedRows(); + for (i = 0; i < rows.length; i++) { + var cid = rows[i].getAttribute("contactid"); + var cname = '' + rows[i].getAttribute("contactname"); + var email = '' + rows[i].cells[1].innerHTML; + opener.window.addContact(tag, currentContactFolderName + '/' + cname, + cid, cname, email); + } - if (selector && selector.changeNotification - && selectorList.value != initialValues) - selector.changeNotification("addition"); + if (selector && selector.changeNotification + && selectorList.value != initialValues) + selector.changeNotification("addition"); - return false; -} - -function onConfirmAddressBookSelection() { - var folderLi = $(currentContactFolder); - var currentContactFolderName = folderLi.innerHTML; - - var selector = window.opener.document.getElementById("contactFolders"); - var initialValues = selector.getAttribute("additional-addressbooks"); - if (!initialValues) - initialValues = ""; - var newValues = initialValues; - - var contactsList = $("contactsList"); - var rows = contactsList.getSelectedRows(); - for (i = 0; i < rows.length; i++) { - var cid = rows[i].getAttribute("contactid"); - var cname = '' + rows[i].getAttribute("contactname"); - var email = '' + rows[i].cells[1].innerHTML; - var re = new RegExp("(^|,)" + cid + "($|,)"); - if (!re.test(newValues)) { - if (newValues.length) - newValues += "," + cid; - else - newValues = cid; - } - } - - if (newValues != initialValues) - window.opener.setTimeout("setAdditionalAddressBooks(\"" - + newValues + "\");", 100); - - return false; -} - -function setAdditionalAddressBooks(additionalAddressBooks) { - var urlstr = (ApplicationBaseURL + "/updateAdditionalAddressBooks?ids=" - + additionalAddressBooks); - if (document.addressBooksAjaxRequest) { - document.addressBooksAjaxRequest.aborted = true; - document.addressBooksAjaxRequest.abort(); - } - document.addressBooksAjaxRequest - = triggerAjaxRequest(urlstr, - addressBooksCallback, additionalAddressBooks); -} - -function addressBooksCallback(http) { - if (http.readyState == 4) { - if (http.status == 200) { - var ul = $("contactFolders"); - - var children = ul.childNodesWithTag("li"); - for (var i = 0; i < children.length; i++) - if (children[i].getAttribute("external-addressbook")) - ul.removeChild(children[i]); - - ul.setAttribute("additional-addressbooks", http.callbackData); - if (http.callbackData.length > 0) { - var list = http.callbackData.split(","); - var newCode = ""; - for (var i = 0; i < list.length; i++) { - var username = list[i]; - newCode += ( "
  • " ); - newCode += ( username + "
  • " ); - } - ul.innerHTML += newCode; - } - } - document.addressBooksAjaxRequest = null; - } - else - log ("ajax fuckage 3"); + event.preventDefault(); } function onContactMailTo(node) { @@ -580,7 +420,7 @@ function onContactMailTo(node) { } function refreshContacts(contactId) { - openContactsFolder(currentContactFolder, "reload=true", currentFolderIsExternal); + openContactsFolder(currentContactFolder, "reload=true"); cachedContacts[currentContactFolder + "/" + contactId] = null; loadContact(contactId); @@ -601,63 +441,62 @@ function onAddressBookNew(event) { event.preventDefault(); } +function appendAddressBook(name, folder) { + var li = document.createElement("li"); + li.setAttribute("id", folder); + li.appendChild(document.createTextNode(name)); + li.addEventListener("mousedown", listRowMouseDownHandler, false); + li.addEventListener("click", onRowClick, false); + li.addEventListener("contextmenu", onContactFoldersContextMenu, false); + $("contactFolders").appendChild(li); +} + function newAbCallback(http) { if (http.readyState == 4 && http.status == 201) { - var ul = $("contactFolders"); var name = http.callbackData; - var li = document.createElement("li"); - li.setAttribute("id", "/" + name); - li.appendChild(document.createTextNode(name)); - li.addEventListener("mousedown", listRowMouseDownHandler, false); - li.addEventListener("click", onRowClick, false); - li.addEventListener("contextmenu", onContactFoldersContextMenu, false); - ul.appendChild(li); + appendAddressBook(name, "/" + name); } else log ("ajax fuckage 4:" + http.status); } +function newUserFolderCallback(folderData) { + var folder = $(folderData["folder"]); + if (!folder) + appendAddressBook(folderData["folderName"], folderData["folder"]); +} + function onAddressBookAdd(event) { - var selector = $("contactFolders"); - var selectorURL = '?popup=YES&selectorId=contactFolders'; + openUserFolderSelector(newUserFolderCallback, "contact"); - urlstr = ApplicationBaseURL; - if (urlstr[urlstr.length-1] != '/') - urlstr += '/'; - urlstr += ("../../" + UserLogin + "/Contacts/" - + contactSelectorAction + selectorURL); -// log (urlstr); - var w = window.open(urlstr, "Addressbook", - "width=640,height=400,resizable=1,scrollbars=0"); - w.selector = selector; - w.opener = window; - w.focus(); + event.preventDefault(); +} - event.preventDefault(); +function onFolderUnsubscribeCB(folderId) { + var node = $(folderId); + node.parentNode.removeChild(node); + var personal = $("/personal"); + personal.select(); + onFolderSelectionChange(); } function onAddressBookRemove(event) { var selector = $("contactFolders"); var nodes = selector.getSelectedNodes(); - if (nodes.length > 0) { - var cid = nodes[0].getAttribute("external-addressbook"); - if (cid) { - var initialValues = selector.getAttribute("additional-addressbooks"); - var re = new RegExp("(^|,)" + cid + "($|,)"); - var newValues = initialValues.replace(re, ""); - if (initialValues != newValues) - setAdditionalAddressBooks(newValues); - } - else { - nodes[0].deselect(); - var folderId = nodes[0].getAttribute("id").substr(1); - deletePersonalAddressBook(folderId); - } - - var personal = $("/personal"); - personal.select(); - onFolderSelectionChange(); + 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(); + } } event.preventDefault(); @@ -719,19 +558,26 @@ function configureDragHandles() { } function lookupDeniedFolders() { - var rights; - var http = createHTTPClient(); - if (http) { - http.url = ApplicationBaseURL + "/checkRights"; - http.open("GET", http.url, false /* not async */); - http.send(""); - if (http.status == 200 - && http.responseText.length > 0) { - rights = http.responseText.split(","); - } + var list = $("contactFolders").childNodesWithTag("li"); + for (var i = 0; i < list.length; i++) { + var folderID = list[i].getAttribute("id"); + var url = URLForFolderID(folderID) + "/canAccessContent"; + triggerAjaxRequest(url, deniedFoldersLookupCallback, folderID); } +} - return rights; +function deniedFoldersLookupCallback(http) { + if (http.readyState == 4) { + var denied = true; + + if (http.status == 200) + denied = (http.responseText == "0"); + var entry = $(http.callbackData); + if (denied) + entry.addClassName("denied"); + else + entry.removeClassName("denied"); + } } function configureAbToolbar() { @@ -754,31 +600,21 @@ function configureContactFolders() { lis[i].addEventListener("contextmenu", onContactFoldersContextMenu, false); } - var denieds = lookupDeniedFolders(); - if (denieds) { - var start = (lis.length - denieds.length); - for (var i = start; i < lis.length; i++) { - if (denieds[i-start] == "1") - lis[i].removeClassName("denied"); - else - lis[i].addClassName("denied"); - } - } + lookupDeniedFolders(); contactFolders.style.visibility = "visible;"; + + var personalFolder = $("/personal"); + personalFolder.select(); } } function onAccessRightsMenuEntryMouseUp(event) { var folders = $("contactFolders"); var selected = folders.getSelectedNodes()[0]; - var external = selected.getAttribute("external-addressbook"); var title = this.innerHTML; - if (external) - url = UserFolderURL + "../" + external + "/Contacts/personal/acls"; - else - url = ApplicationBaseURL + selected.getAttribute("id") + "/acls"; + var url = URLForFolderID(selected.getAttribute("id")) - openAclWindow(url, title); + openAclWindow(url + "/acls", title); } function initializeMenus() { @@ -799,12 +635,24 @@ function configureSearchField() { searchValue.addEventListener("keydown", onSearchKeyDown, false); } +function configureSelectionButtons() { + var container = $("contactSelectionButtons"); + if (container) { + var buttons = container.childNodesWithTag("input"); + for (var i = 0; i < buttons.length; i++) + buttons[i].addEventListener("click", onConfirmContactSelection, + false); + } +} + var initContacts = { handleEvent: function (event) { if (!document.body.hasClassName("popup")) { configureAbToolbar(); configureSearchField(); } + else + configureSelectionButtons(); configureContactFolders(); // initDnd(); } diff --git a/UI/WebServerResources/MailerUI.js b/UI/WebServerResources/MailerUI.js index 23279ad90..47d933dbc 100644 --- a/UI/WebServerResources/MailerUI.js +++ b/UI/WebServerResources/MailerUI.js @@ -1,37 +1,4 @@ -/* - Copyright (C) 2005 SKYRIX Software AG - - This file is part of OpenGroupware.org. - - OGo is free software; you can redistribute it and/or modify it under - the terms of the GNU Lesser General Public License as published by the - Free Software Foundation; either version 2, or (at your option) any - later version. - - OGo is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with OGo; see the file COPYING. If not, write to the - Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. -*/ -/* JavaScript for SOGo Mailer */ - -/* - DOM ids available in mail list view: - row_$msgid - div_$msgid - readdiv_$msgid - unreaddiv_$msgid - - Window Properties: - width, height - bool: resizable, scrollbars, toolbar, location, directories, status, - menubar, copyhistory -*/ +/* JavaScript for SOGoMail */ var currentMessages = new Array(); var maxCachedMessages = 20; diff --git a/UI/WebServerResources/SchedulerUI.css b/UI/WebServerResources/SchedulerUI.css index 1b51b6f58..adc757af6 100644 --- a/UI/WebServerResources/SchedulerUI.css +++ b/UI/WebServerResources/SchedulerUI.css @@ -1,3 +1,4 @@ + DIV#leftPanel { position: absolute; @@ -36,20 +37,24 @@ DIV#tasksListView H2 DIV#tasksListView LABEL { margin: .25em; } +DIV#calendarSelectorView +{ top: 0px; } + DIV#calendarsList { height: 100%; padding: 0px; margin: 0px; } -SPAN.colorBox -{ display: block; - float: right; +DIV.colorBox +{ display: inline; border: 1px solid #333; - margin: .12em; + font-weight: normal; + margin: 0px; + font-size: 80%; width: 1em; height: .75em; } -UL#tasksList, UL#uixselector-calendarsList-display +UL#tasksList, UL#calendarList { cursor: default; margin: .25px; padding: 0px; @@ -64,12 +69,16 @@ UL#tasksList, UL#uixselector-calendarsList-display list-style-type: none; list-style-image: none; } -UL#uixselector-calendarsList-display -{ height: 10.5em; +UL#calendarList +{ clear: both; + height: 10.5em; margin: 0px; } -UL#uixselector-calendarsList-display LI.denied -{ background: #fefefe; +UL#calendarList LI +{ white-space: nowrap; } + +UL#calendarList LI.denied +{ background-color: #fefefe; font-style: italic; color: #f33; } @@ -793,7 +802,7 @@ DIV.appointments > DIV.appointment { cursor: default; position: absolute; left: 0px; - right: 0px; + right: 1px; padding: 1px; } DIV[class~="appointment"]._selected > DIV.appointmentInside @@ -856,6 +865,7 @@ DIV.monthView DIV.appointment cursor: default; white-space: nowrap; margin: 2px; + margin-right: 3px; padding: 1px; height: 1.5em; } diff --git a/UI/WebServerResources/SchedulerUI.js b/UI/WebServerResources/SchedulerUI.js index 4c1c33c71..856077e52 100644 --- a/UI/WebServerResources/SchedulerUI.js +++ b/UI/WebServerResources/SchedulerUI.js @@ -1,3 +1,5 @@ +/* JavaScript for SOGoCalendar */ + var sortOrder = ''; var sortKey = ''; var listFilter = 'view_today'; @@ -846,158 +848,87 @@ function updateTaskStatus(node) { return false; } -function updateCalendarStatus() { +function updateCalendarStatus(event) { var list = new Array(); - var clist = $("calendarsList"); - var nodes = clist.childNodesWithTag("ul")[0].childNodesWithTag("li"); + var nodes = $("calendarList").childNodesWithTag("li"); for (var i = 0; i < nodes.length; i++) { var input = nodes[i].childNodesWithTag("input")[0]; - if (input.checked) - list.push(nodes[i].getAttribute("uid")); + if (input.checked) { + var folderId = nodes[i].getAttribute("id"); + var elems = folderId.split(":"); + if (elems.length > 1) + list.push(elems[0]); + else + list.push(UserLogin); + } } if (!list.length) { - list.push(nodes[0].getAttribute("uid")); - nodes[0].childNodesWithTag("input")[0].checked = true; + list.push(UserLogin); + nodes[0].childNodesWithTag("input")[0].checked = true; } // ApplicationBaseURL = (UserFolderURL + "Groups/_custom_" -// + list.join(",") + "/Calendar/"); +// + list.join(",") + "/Calendar/"); - updateCalendarsList(); - refreshAppointments(); - refreshTasks(); - changeCalendarDisplay(); + if (event) { + var folderID = this.parentNode.getAttribute("id"); + var urlstr = URLForFolderID(folderID); + if (this.checked) + urlstr += "/activateFolder"; + else + urlstr += "/deactivateFolder"; + triggerAjaxRequest(urlstr, calendarStatusCallback, folderID); + } + else { + updateCalendarsList(); + refreshAppointments(); + refreshTasks(); + changeCalendarDisplay(); + } return false; } -function calendarUidsList() { - var list = ""; - - var nodes = $("uixselector-calendarsList-display").childNodesWithTag("li"); - for (var i = 0; i < nodes.length; i++) { - var currentNode = nodes[i]; - var input = currentNode.childNodesWithTag("input")[0]; - if (!input.checked) - list += "-"; - list += currentNode.getAttribute("uid") + ","; - } - - return list.substr(0, list.length - 1); -} - -// function updateCalendarContacts(contacts) -// { -// var list = contacts.split(","); - -// var clist = $("calendarsList"); -// var nodes = clist.childNodes[5].childNodes; -// for (var i = 0; i < nodes.length; i++) { -// var currentNode = nodes[i]; -// if (currentNode instanceof HTMLLIElement) { -// var input = currentNode.childNodes[3]; -// if (!input.checked) -// list += "-"; -// list += currentNode.getAttribute("uid") + ","; -// } -// } -// } - -function inhibitMyCalendarEntry() { - var clist = $("calendarsList"); - var nodes = clist.childNodes[5].childNodes; - var done = false; - - var i = 0; - while (!done && i < nodes.length) { - var currentNode = nodes[i]; - if (currentNode instanceof HTMLLIElement) { - var input = currentNode.childNodes[3]; - if (currentNode.getAttribute("uid") == UserLogin) { - done = true; -// currentNode.style.color = "#999;"; - currentNode.style.fontWeight = "bold;"; -// currentNode.setAttribute("onclick", ""); +function calendarStatusCallback(http) { + if (http.readyState == 4) { + if (http.status == 204) { + refreshAppointments(); + refreshTasks(); + changeCalendarDisplay(); } - } - i++; - } + else { + var folder = $(http.callbackData); + var input = folder.childNodesWithTag("input")[0]; + input.checked = (!input.checked); + } + } } -function userCalendarEntry(user, color) { - var li = document.createElement("li"); - li.setAttribute("uid", user); - li.addEventListener("mousedown", listRowMouseDownHandler, false); - li.addEventListener("click", onRowClick, false); - var colorBox = document.createElement("span"); - colorBox.addClassName("colorBox"); - if (color) { - log("color: " + color); - colorBox.style.backgroundColor = color + ";"; - } - li.appendChild(colorBox); - var checkBox = document.createElement("input"); - checkBox.addClassName("checkBox"); - checkBox.type = "checkbox"; - checkBox.addEventListener("change", updateCalendarStatus, false); - li.appendChild(checkBox); - var text = document.createTextNode(" " + user); - li.appendChild(text); +function calendarEntryCallback(http) { + var disabled = true; - return li; -} - -function ensureSelfIfPresent() { - var ul = $("uixselector-calendarsList-display"); - var list = ul.childNodesWithTag("li"); - var selfEntry = userCalendarEntry(UserLogin, indexColor(0)); - selfEntry.style.fontWeight = "bold;"; - if (list.length < 1) { - ul.appendChild(selfEntry); - } else if (list[0].getAttribute("uid") != UserLogin) { - ul.insertBefore(selfEntry, list[0]); - } + if (http.readyState == 4) { + if (http.status == 200) + disabled = (http.responseText == "0"); + var entry = $(http.callbackData); + var input = entry.childNodesWithTag("input")[0]; + input.disabled = disabled; + if (disabled) { + input.checked = false; + entry.addClassName("denied"); + } + else + entry.removeClassName("denied"); + } } function updateCalendarsList(method) { - ensureSelfIfPresent(); - var url = (ApplicationBaseURL + "updateCalendars?ids=" - + calendarUidsList()); - if (document.calendarsListAjaxRequest) { - document.calendarsListAjaxRequest.aborted = true; - document.calendarsListAjaxRequest.abort(); - } - var http = createHTTPClient(); - if (http) { - http.url = url; - http.open("GET", url, false); - http.send(""); - - if (method == "removal") - updateCalendarStatus(); - - http = createHTTPClient(); - http.url = ApplicationBaseURL + "checkRights"; - http.open("GET", http.url, false /* not async */); - http.send(""); - if (http.status == 200 - && http.responseText.length > 0) { - rights = http.responseText.split(","); - var list = $("uixselector-calendarsList-display").childNodesWithTag("li"); - for (var i = 0; i < list.length; i++) { - var input = list[i].childNodesWithTag("input")[0]; - if (rights[i] == "1") { - list[i].removeClassName("denied"); - input.disabled = false; - } - else { - input.checked = false; - input.disabled = true; - list[i].addClassName("denied"); - } - } - } + var list = $("calendarList").childNodesWithTag("li"); + for (var i = 0; i < list.length; i++) { + var folderID = list[i].getAttribute("id"); + var url = URLForFolderID(folderID) + "/canAccessContent"; + triggerAjaxRequest(url, calendarEntryCallback, folderID); } } @@ -1014,16 +945,11 @@ function addContact(tag, fullContactName, contactId, contactName, contactEmail) uids.value += ',' + contactId; else uids.value = contactId; - var names = $("uixselector-calendarsList-display"); + var names = $("calendarList"); var listElems = names.childNodesWithTag("li"); var colorDef = indexColor(listElems.length); names.appendChild(userCalendarEntry(contactId, colorDef)); - var styles = document.getElementsByTagName("style"); - styles[0].innerHTML += ('.ownerIs' + contactId + ' {' - + ' background-color: ' - + colorDef - + ' !important; }'); } } @@ -1066,7 +992,7 @@ function initializeMenus() { "appointmentsListMenu", "calendarsMenu", "searchMenu"); initMenusNamed(menus); - $("calendarsList").attachMenu("calendarsMenu"); + $("calendarSelector").attachMenu("calendarsMenu"); var accessRightsMenuEntry = $("accessRightsMenuEntry"); accessRightsMenuEntry.addEventListener("mouseup", @@ -1075,16 +1001,12 @@ function initializeMenus() { } function onAccessRightsMenuEntryMouseUp(event) { - var folders = $("uixselector-calendarsList-display"); + var folders = $("calendarList"); var selected = folders.getSelectedNodes()[0]; - var uid = selected.getAttribute("uid"); - log("application base url: " + ApplicationBaseURL); - if (uid == UserLogin) - url = ApplicationBaseURL + "acls"; - else - url = UserFolderURL + "../" + uid + "/Calendar/acls"; + var folderID = selected.getAttribute("id"); + var urlstr = URLForFolderID(folderID) + "/acls"; - openAclWindow(url, uid); + openAclWindow(urlstr); } function configureDragHandles() { @@ -1103,17 +1025,90 @@ function configureDragHandles() { } } -function initCalendarContactsSelector() { - var selector = $("calendarsList"); - inhibitMyCalendarEntry(); +function initCalendarSelector() { + var selector = $("calendarSelector"); updateCalendarStatus(); selector.changeNotification = updateCalendarsList; - var list = $("uixselector-calendarsList-display").childNodesWithTag("li"); + var list = $("calendarList").childNodesWithTag("li"); for (var i = 0; i < list.length; i++) { var input = list[i].childNodesWithTag("input")[0]; input.addEventListener("change", updateCalendarStatus, false); + list[i].addEventListener("mousedown", listRowMouseDownHandler, false); + list[i].addEventListener("click", onRowClick, false); +// list[i].addEventListener("contextmenu", onContactFoldersContextMenu, false); } + + var links = $("calendarSelectorButtons").childNodesWithTag("a"); + links[0].addEventListener("click", onCalendarAdd, false); + links[1].addEventListener("click", onCalendarRemove, false); +} + +function onCalendarAdd(event) { + openUserFolderSelector(onFolderSubscribeCB, "calendar"); + + event.preventDefault(); +} + +function appendCalendar(folderName, folder) { + var calendarList = $("calendarList"); + var lis = calendarList.childNodesWithTag("li"); + var color = indexColor(lis.length); + log ("color: " + color); + var li = document.createElement("li"); + li.setAttribute("id", folder); + li.addEventListener("mousedown", listRowMouseDownHandler, false); + li.addEventListener("click", onRowClick, false); + var checkBox = document.createElement("input"); + checkBox.addClassName("checkBox"); + checkBox.type = "checkbox"; + checkBox.addEventListener("change", updateCalendarStatus, false); + li.appendChild(checkBox); + var colorBox = document.createElement("div"); + colorBox.appendChild(document.createTextNode("OO")); + colorBox.addClassName("colorBox"); + if (color) { + colorBox.style.color = color + ";"; + colorBox.style.backgroundColor = color + ";"; + } + li.appendChild(colorBox); + li.appendChild(document.createTextNode(folderName)); + + calendarList.appendChild(li); + + var contactId = folder.split(":")[0]; + var styles = document.getElementsByTagName("style"); + styles[0].innerHTML += ('.ownerIs' + contactId + ' {' + + ' color: ' + + color + ';' + + ' background-color: ' + + color + + ' !important; }'); +} + +function onFolderSubscribeCB(folderData) { + var folder = $(folderData["folder"]); + if (!folder) + appendCalendar(folderData["folderName"], folderData["folder"]); +} + +function onFolderUnsubscribeCB(folderId) { + var node = $(folderId); + node.parentNode.removeChild(node); +} + +function onCalendarRemove(event) { + var nodes = $("calendarList").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); + } + } + + event.preventDefault(); } function configureSearchField() { @@ -1128,18 +1123,9 @@ function configureSearchField() { function initCalendars() { if (!document.body.hasClassName("popup")) { - initCalendarContactsSelector(); + initCalendarSelector(); configureSearchField(); } } -function onSchedulerBodyKeyUp(event) { - if (event.which == 46) { - window.alert("coucou"); - deleteEvent(); - event.cancelBubble = true; - } -} - window.addEventListener("load", initCalendars, false); -// document.body.addEventListener("keyup", onSchedulerBodyKeyUp, false); diff --git a/UI/WebServerResources/UIxAclEditor.css b/UI/WebServerResources/UIxAclEditor.css index bca5e667f..3439d4afe 100644 --- a/UI/WebServerResources/UIxAclEditor.css +++ b/UI/WebServerResources/UIxAclEditor.css @@ -4,15 +4,9 @@ DIV.acls { padding: 1em; } DIV.acls LABEL -{ position: relative; - white-space: normal; +{ white-space: nowrap; width: 100%; } -DIV.acls LABEL > SPAN.value -{ position: absolute; - top: 0px; - left: 11em; } - DIV.acls UL { height: 100%; width: 100%; } @@ -21,7 +15,7 @@ DIV#userRoles { height: 7em; padding-bottom: 2em; } -UL#uixselector-userRoles-display +UL#userList { cursor: default; margin: .25px; padding: 0px; @@ -36,7 +30,7 @@ UL#uixselector-userRoles-display list-style-type: none; list-style-image: none; } -UL#uixselector-userRoles-display > LI._selected +UL#userList > LI._selected { background: #4b6983 !important; color: #fff !important; diff --git a/UI/WebServerResources/UIxAclEditor.js b/UI/WebServerResources/UIxAclEditor.js index b10635c64..f8cd0b950 100644 --- a/UI/WebServerResources/UIxAclEditor.js +++ b/UI/WebServerResources/UIxAclEditor.js @@ -2,47 +2,24 @@ var contactSelectorAction = 'acls-contacts'; -function addContact(tag, fullContactName, contactId, contactName, - contactEmail) { - if (tag == "assistant") - addUser(contactName, contactId, false); - else if (tag == "delegate") - addUser(contactName, contactId, true); -} - -function addUser(userName, userId, delegate) { - var uidList = $("uixselector-userRoles-uidList"); - var uids; - - if (uidList.value.length > 0) { - uids = uidList.value.split(","); - } else { - uids = new Array(); - } - - if (uids.indexOf(userId) < 0) { - uids.push(userId); - var ul = $("uixselector-userRoles-display"); - ul.appendChild(nodeForUser(userName, userId)); - uidList.value = uids.join(","); - var roleList; - if (delegate) - roleList = $("delegates"); - else - roleList = $("assistants"); +function addUser(userName, userID) { + if (!$(userID)) { + var ul = $("userList"); + ul.appendChild(nodeForUser(userName, userID)); + var roleList = $("assistants"); if (roleList.value.length > 0) { - uids = roleList.value.split(","); - uids.push(userId); - roleList.value = uids.join(","); + var uids = roleList.value.split(","); + uids.push(userID); + roleList.value = uids.join(","); } else - roleList.value = userId; + roleList.value = userID; } } function nodeForUser(userName, userId) { var node = document.createElement("li"); - node.setAttribute("uid", userId); + node.setAttribute("id", userId); node.setAttribute("class", ""); node.addEventListener("mousedown", listRowMouseDownHandler, true); node.addEventListener("click", onRowClick, true); @@ -69,7 +46,7 @@ function updateSelectedRole(list) { select.style.visibility = "visible;"; var selected = selection[0]; var assistantsValue = $("assistants"); - var uid = selected.getAttribute("uid"); + var uid = selected.getAttribute("id"); var regexp = new RegExp("(^|,)" + uid + "(,|$)","i"); if (regexp.test(assistantsValue.value)) select.selectedIndex = 0; @@ -85,32 +62,6 @@ function onAclSelectionChange() { updateSelectedRole(this); } -function onUsersChange(type) { - var select = $("userRoleDropDown"); - if (type == "removal") { - var list; - if (select.selectedIndex == 0) - list = $("assistants"); - else - list = $("delegates"); - - var uids = $("uixselector-userRoles-uidList"); - var listArray = list.value.split(","); - var newListArray = new Array(); - for (var i = 0; i < listArray.length; i++) { - var regexp = new RegExp("(^|,)" + listArray[i] + "($|,)"); - if (regexp.test(uids.value)) - newListArray.push(listArray[i]); - } - if (newListArray.length > 0) - list.value = newListArray.join(","); - else - list.value = ""; - } - - updateSelectedRole($("uixselector-userRoles-display")); -} - function onUserRoleDropDownChange() { var oldList; var newList; @@ -123,7 +74,7 @@ function onUserRoleDropDownChange() { newList = $("delegates"); } - var uid = $("uixselector-userRoles-display").getSelectedRows()[0].getAttribute("uid"); + var uid = $("userList").getSelectedRows()[0].getAttribute("id"); var newListArray; if (newList.value.length > 0) { newListArray = newList.value.split(","); @@ -143,14 +94,55 @@ function onUserRoleDropDownChange() { log("delegates: " + $("delegates").value); } -function onAclLoadHandler() { - $("userRoles").changeNotification = onUsersChange; +function onUserAdd(event) { + openUserFolderSelector(null, "user"); - var ul = $("uixselector-userRoles-display"); + event.preventDefault(); +} + +function onUserRemove(event) { + var userlist = $("userList"); + var node = userlist.getSelectedRows()[0]; + var uid = node.getAttribute("id"); + var regexp = new RegExp("(^|,)" + uid + "($|,)"); + var uids = $("assistants"); + if (!regexp.test(uids.value)) + uids = $("delegates"); + if (regexp.test(uids.value)) { + var list = uids.value.split(","); + var newList = new Array(); + for (var i = 0; i < list.length; i++) { + if (list[i] != uid) + newList.push(list[i]); + } + uids.value = newList.join(","); + node.parentNode.removeChild(node); + } + updateSelectedRole(userlist); + event.preventDefault(); +} + +function subscribeToFolder(refreshCallback, refreshCallbackData) { + addUser(refreshCallbackData["folderName"], + refreshCallbackData["folder"]); +} + +function onAclLoadHandler() { + var ul = $("userList"); ul.addEventListener("selectionchange", onAclSelectionChange, false); + var lis = ul.childNodesWithTag("li"); + for (var i = 0; i < lis.length; i++) { + lis[i].addEventListener("mousedown", listRowMouseDownHandler, false); + lis[i].addEventListener("click", onRowClick, false); + } + var select = $("userRoleDropDown"); select.addEventListener("change", onUserRoleDropDownChange, false); + + var buttons = $("userSelectorButtons").childNodesWithTag("a"); + buttons[0].addEventListener("click", onUserAdd, false); + buttons[1].addEventListener("click", onUserRemove, false); } window.addEventListener("load", onAclLoadHandler, false); diff --git a/UI/WebServerResources/UIxContactsUserFolders.js b/UI/WebServerResources/UIxContactsUserFolders.js new file mode 100644 index 000000000..06906f520 --- /dev/null +++ b/UI/WebServerResources/UIxContactsUserFolders.js @@ -0,0 +1,138 @@ +function onSearchFormSubmit() { + var searchValue = $("searchValue"); + + var url = (ApplicationBaseURL + + "/foldersSearch?ldap-only=YES&search=" + searchValue.value + + "&type=" + window.userFolderType); + if (document.userFoldersRequest) { + document.userFoldersRequest.aborted = true; + document.userFoldersRequest.abort(); + } + document.userFoldersRequest + = triggerAjaxRequest(url, userFoldersCallback); + + return false; +} + +function addLineToTree(tree, parent, line) { + var offset = 0; + + var nodes = line.split(";"); + if (window.userFolderType == "user" + || nodes.length > 1) { + var parentNode = nodes[0]; + var userInfos = parentNode.split(":"); + var email = userInfos[1].replace("<", "<"); + tree.add(parent, 0, email, 0, '#', userInfos[0], 'person', + '', '', + ResourcesURL + '/abcard.gif', + ResourcesURL + '/abcard.gif'); + for (var i = 1; i < nodes.length; i++) { + var folderInfos = nodes[i].split(":"); + var icon = ResourcesURL + '/'; + if (folderInfos[2] == 'contact') + icon += 'tb-mail-addressbook-flat-16x16.png'; + else + icon += 'calendar-folder-16x16.png'; + var folderId = userInfos[0] + ":" + folderInfos[1]; + tree.add(parent + i, parent, folderInfos[0], 0, '#', folderId, + folderInfos[2] + '-folder', '', '', icon, icon); + } + offset = nodes.length - 1; + } + else + window.alert("nope:" + window.userFolderType); + + return offset; +} + +function buildTree(response) { + d = new dTree("d"); + d.config.folderLlinks = true; + d.config.hideRoot = true; + d.icon.root = ResourcesURL + '/tbtv_account_17x17.gif'; + d.icon.folder = ResourcesURL + '/tbtv_leaf_corner_17x17.gif'; + d.icon.folderOpen = ResourcesURL + '/tbtv_leaf_corner_17x17.gif'; + d.icon.node = ResourcesURL + '/tbtv_leaf_corner_17x17.gif'; + d.icon.line = ResourcesURL + '/tbtv_line_17x17.gif'; + d.icon.join = ResourcesURL + '/tbtv_junction_17x17.gif'; + d.icon.joinBottom = ResourcesURL + '/tbtv_corner_17x17.gif'; + d.icon.plus = ResourcesURL + '/tbtv_plus_17x17.gif'; + d.icon.plusBottom = ResourcesURL + '/tbtv_corner_plus_17x17.gif'; + d.icon.minus = ResourcesURL + '/tbtv_minus_17x17.gif'; + d.icon.minusBottom = ResourcesURL + '/tbtv_corner_minus_17x17.gif'; + d.icon.nlPlus = ResourcesURL + '/tbtv_corner_plus_17x17.gif'; + d.icon.nlMinus = ResourcesURL + '/tbtv_corner_minus_17x17.gif'; + d.icon.empty = ResourcesURL + '/empty.gif'; + d.add(0, -1, ''); + + var lines = response.split("\n"); + var offset = 0; + for (var i = 0; i < lines.length; i++) { + if (lines[i].length > 0) + offset += addLineToTree(d, i + 1 + offset, lines[i]); + } + + return d; +} + +function onFolderTreeItemClick(event) { + event.preventDefault(); + + var topNode = $("d"); + if (topNode.selectedEntry) + topNode.selectedEntry.deselect(); + this.select(); + topNode.selectedEntry = this; +} + +function userFoldersCallback(http) { + if (http.readyState == 4) { + document.userFoldersRequest = null; + if (http.status == 200) { + var div = $("folders"); + var response = http.responseText; + div.innerHTML = buildTree(http.responseText); + var nodes = document.getElementsByClassName("node", $("d")); + for (i = 0; i < nodes.length; i++) + nodes[i].addEventListener("click", + onFolderTreeItemClick, false); + } + } +} + +function onConfirmFolderSelection(event) { + var topNode = $("d"); + if (topNode.selectedEntry) { + var node = topNode.selectedEntry.parentNode; + var folder = node.getAttribute("dataname"); + var folderName; + if (window.userFolderType == "user") { + var spans = document.getElementsByClassName("nodeName", + topNode.selectedEntry); + var email = spans[0].innerHTML; + email = email.replace("<", "<"); + email = email.replace(">", ">"); + folderName = email; + } + else { + var spans1 = document.getElementsByClassName("nodeName", + node); + var spans2 = document.getElementsByClassName("nodeName", + node.parentNode.previousSibling); + var email = spans2[0].innerHTML; + email = email.replace("<", "<"); + email = email.replace(">", ">"); + folderName = spans1[0].innerHTML + ' (' + email + ')'; + } + var data = { folderName: folderName, folder: folder }; + window.opener.subscribeToFolder(window.userFolderCallback, data); + } +} + +function initUserFoldersWindow() { + configureSearchField(); + $("addButton").addEventListener("click", onConfirmFolderSelection, false); +} + +window.addEventListener("load", initUserFoldersWindow, false);