From e7a16cba0d00a35a14de334385dfb7f174f5438a Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Wed, 5 Mar 2014 12:31:27 -0500 Subject: [PATCH 001/144] BugFix #0002622: The server Dovecot use by default an UTF-8 and by doing so it cause a wrong re-encoding in UTF-7 when reaching the sieve server (knowing that the foldername in sieve are encoded in UTF-7). Since it is not the case with a Cyrus server, I created a new variable available in the sogo.conf that let you specified the type of encoding you need. By default the encoding is set to UTF-7. ex : SOGoFolderEncoding = 'UTF-7' --- SoObjects/SOGo/SOGoDefaults.plist | 1 + SoObjects/SOGo/SOGoSystemDefaults.h | 1 + SoObjects/SOGo/SOGoSystemDefaults.m | 6 ++++++ UI/PreferencesUI/UIxFilterEditor.m | 7 +++++++ UI/Templates/PreferencesUI/UIxFilterEditor.wox | 1 + UI/WebServerResources/UIxFilterEditor.js | 6 +++++- 6 files changed, 21 insertions(+), 1 deletion(-) diff --git a/SoObjects/SOGo/SOGoDefaults.plist b/SoObjects/SOGo/SOGoDefaults.plist index f9bb2fef0..a3f09d602 100644 --- a/SoObjects/SOGo/SOGoDefaults.plist +++ b/SoObjects/SOGo/SOGoDefaults.plist @@ -13,6 +13,7 @@ SOGoZipPath = "/usr/bin/zip"; SOGoEncryptionKey = "MySOGoEncryptionKey"; + SOGoFolderEncoding = "UTF-7"; WOUseRelativeURLs = YES; WOMessageUseUTF8 = YES; diff --git a/SoObjects/SOGo/SOGoSystemDefaults.h b/SoObjects/SOGo/SOGoSystemDefaults.h index 3678516ff..24d7e4baf 100644 --- a/SoObjects/SOGo/SOGoSystemDefaults.h +++ b/SoObjects/SOGo/SOGoSystemDefaults.h @@ -42,6 +42,7 @@ - (BOOL) trustProxyAuthentication; - (NSString *) encryptionKey; - (BOOL) useRelativeURLs; +- (NSString *) folderEncoding; - (BOOL) isWebAccessEnabled; - (BOOL) isCalendarDAVAccessEnabled; diff --git a/SoObjects/SOGo/SOGoSystemDefaults.m b/SoObjects/SOGo/SOGoSystemDefaults.m index 52a35f868..53e67e108 100644 --- a/SoObjects/SOGo/SOGoSystemDefaults.m +++ b/SoObjects/SOGo/SOGoSystemDefaults.m @@ -356,6 +356,12 @@ _injectConfigurationFromFile (NSMutableDictionary *defaultsDict, return [self boolForKey: @"WOUseRelativeURLs"]; } +- (NSString *) folderEncoding +{ + return [self stringForKey: @"SOGoFolderEncoding"]; +} + + - (BOOL) isWebAccessEnabled { return [self boolForKey: @"SOGoWebAccessEnabled"]; diff --git a/UI/PreferencesUI/UIxFilterEditor.m b/UI/PreferencesUI/UIxFilterEditor.m index f6fe59d2b..964ff44b6 100644 --- a/UI/PreferencesUI/UIxFilterEditor.m +++ b/UI/PreferencesUI/UIxFilterEditor.m @@ -28,6 +28,7 @@ #import #import #import +#import #import @@ -35,6 +36,7 @@ { NSString *filterId; NSDictionary *labels; + NSString *folderEncoding; } @end @@ -112,4 +114,9 @@ return [labels jsonRepresentation]; } +- (NSString *) folderEncoding +{ + return [[SOGoSystemDefaults sharedSystemDefaults] folderEncoding]; +} + @end diff --git a/UI/Templates/PreferencesUI/UIxFilterEditor.wox b/UI/Templates/PreferencesUI/UIxFilterEditor.wox index f6f88ef06..952188e47 100644 --- a/UI/Templates/PreferencesUI/UIxFilterEditor.wox +++ b/UI/Templates/PreferencesUI/UIxFilterEditor.wox @@ -13,6 +13,7 @@ >
diff --git a/UI/WebServerResources/UIxFilterEditor.js b/UI/WebServerResources/UIxFilterEditor.js index 3d38c5da1..16d5960c0 100644 --- a/UI/WebServerResources/UIxFilterEditor.js +++ b/UI/WebServerResources/UIxFilterEditor.js @@ -635,8 +635,12 @@ function ensureMailboxArgRepresentation(container, argumentSpan) { : {'displayName': 'INBOX', 'path': 'INBOX' }); for (var i = 0; i < mailboxes.length; i++) { var mailbox = mailboxes[i]; + var folderValue; + ((folderEncoding == "UTF-8") ? folderValue = mailbox.displayName + : folderValue = mailbox.path); + var mboxOption = createElement("option", null, null, - { value: mailbox.path }, null, select); + { value: folderValue }, null, select); mboxOption.appendChild(document.createTextNode(mailbox.displayName)); } argumentSpan.appendChild(select); From 6ad87052baffea79fb80af09ed25540b8bd9cb53 Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Tue, 4 Mar 2014 13:23:55 -0500 Subject: [PATCH 002/144] bugFix #0002616 : change the behavior of ApplicationBaseURL. Now the object return a standard path(without a slash at the end of the path) That means every string added the URL ApplicationBaseURL must start with a Slash. --- .gitignore | 1 + UI/SOGoUI/UIxComponent.m | 5 ++- UI/WebServerResources/ContactsUI.js | 14 ++++---- UI/WebServerResources/MailerUI.js | 15 ++++---- UI/WebServerResources/SOGoDragHandles.js | 2 +- UI/WebServerResources/SOGoResizableTable.js | 2 +- UI/WebServerResources/SOGoRootPage.js | 2 +- UI/WebServerResources/SchedulerUI.js | 38 ++++++++++----------- UI/WebServerResources/UIxComponentEditor.js | 6 ++-- UI/WebServerResources/UIxFilterEditor.js | 2 +- UI/WebServerResources/UIxPreferences.js | 2 +- UI/WebServerResources/generic.js | 19 ++++------- 12 files changed, 53 insertions(+), 55 deletions(-) diff --git a/.gitignore b/.gitignore index 88becdaa6..8a8a0121d 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ SoObjects/SOGo/SOGo.framework/ SoObjects/SOGo/derived_src/ Tests/*/config.py *.pyc +._* diff --git a/UI/SOGoUI/UIxComponent.m b/UI/SOGoUI/UIxComponent.m index f80e9e9ec..336bd734d 100644 --- a/UI/SOGoUI/UIxComponent.m +++ b/UI/SOGoUI/UIxComponent.m @@ -359,6 +359,7 @@ static SoProduct *commonProduct = nil; { SOGoObject *currentClient, *parent; BOOL found; + NSString *hostLessURL; Class objectClass, userFolderClass; // , groupFolderClass @@ -386,8 +387,10 @@ static SoProduct *commonProduct = nil; } else currentClient = [WOApplication application]; + + hostLessURL = [[currentClient baseURLInContext: context] hostlessURL]; - return [[currentClient baseURLInContext: context] hostlessURL]; + return [hostLessURL substringToIndex: [hostLessURL length] - 1]; } - (NSString *) ownPath diff --git a/UI/WebServerResources/ContactsUI.js b/UI/WebServerResources/ContactsUI.js index 935daf3c9..fea8c4d85 100644 --- a/UI/WebServerResources/ContactsUI.js +++ b/UI/WebServerResources/ContactsUI.js @@ -258,7 +258,7 @@ function _onContactMenuAction(folderItem, action, refresh) { } } - var url = ApplicationBaseURL + selectedFolderId + "/" + action; + var url = ApplicationBaseURL + "/" + selectedFolderId + "/" + action; var uids = contactIds.collect(function (s) { return encodeURIComponent(s.unescapeHTML()); }).join('&uid='); @@ -290,7 +290,7 @@ function onMenuExportContact (event) { var contactIds = document.menuTarget.collect(function(row) { return row.readAttribute("id"); }); - var url = ApplicationBaseURL + selectedFolderId + "/export" + var url = ApplicationBaseURL + "/" + selectedFolderId + "/export" + "?uid=" + contactIds.join("&uid="); window.location.href = url; } @@ -469,7 +469,7 @@ function onToolbarWriteToSelectedContacts(event) { showAlertDialog(_("Please select a contact.")); } else { - openMailComposeWindow(ApplicationBaseURL + "../Mail/compose" + openMailComposeWindow(ApplicationBaseURL + "/../Mail/compose" + "?folder=" + Contact.currentAddressBook.substring(1) + "&uid=" + rows.join("&uid=")); if (document.body.hasClassName("popup")) @@ -777,7 +777,7 @@ function onAddressBookImport(event) { var node = $("contactFolders").getSelectedNodes().first(); var folderId = node.getAttribute("id"); - var url = ApplicationBaseURL + folderId + "/import"; + var url = ApplicationBaseURL + "/" + folderId + "/import"; $("uploadForm").action = url; $("contactsFile").value = ""; @@ -853,7 +853,7 @@ function onAddressBookRemove(event) { } else { var folderId = node.getAttribute("id"); - var folderUrl = ApplicationBaseURL + folderId; + var folderUrl = ApplicationBaseURL + "/" + folderId; unsubscribeFromFolder(folderUrl, owner, onFolderUnsubscribeCB, folderId); } } @@ -879,7 +879,7 @@ function deletePersonalAddressBookConfirm(folderId) { document.deletePersonalABAjaxRequest.aborted = true; document.deletePersonalABAjaxRequest.abort(); } - var url = ApplicationBaseURL + folderId + "/delete"; + var url = ApplicationBaseURL + "/" + folderId + "/delete"; document.deletePersonalABAjaxRequest = triggerAjaxRequest(url, deletePersonalAddressBookCallback, folderId); @@ -1596,7 +1596,7 @@ function dropSelectedContacts(action, toId) { if ((!currentFolderIsRemote() || action != "move") && fromId.substring(1) != toId) { - var url = ApplicationBaseURL + fromId + "/" + action; + var url = ApplicationBaseURL + "/" + fromId + "/" + action; var uids = contactIds.collect(function (s) { return encodeURIComponent(s.unescapeHTML()); }).join('&uid='); diff --git a/UI/WebServerResources/MailerUI.js b/UI/WebServerResources/MailerUI.js index 9b98b8d14..8e535f3b7 100644 --- a/UI/WebServerResources/MailerUI.js +++ b/UI/WebServerResources/MailerUI.js @@ -40,7 +40,8 @@ function URLForFolderID(folderID, application) { application = UserFolderURL + application + "/"; else application = ApplicationBaseURL; - var url = application + encodeURI(folderID.substr(1)); + + var url = application + encodeURI(folderID); if (url[url.length-1] == '/') url = url.substr(0, url.length-1); @@ -563,7 +564,7 @@ function deleteSelectedMessagesCallback(http) { } function deleteMessagesWithoutTrash(data) { - var url = ApplicationBaseURL + encodeURI(data["mailbox"]) + "/batchDelete"; + var url = ApplicationBaseURL + encodeURI(data["/mailbox"]) + "/batchDelete"; var parameters = "uid=" + data["id"].join(",") + '&withoutTrash=1'; data["withoutTrash"] = true; triggerAjaxRequest(url, deleteSelectedMessagesCallback, data, parameters, @@ -767,7 +768,7 @@ function composeNewMessage() { else account = null; if (account) { - var url = ApplicationBaseURL + encodeURI(account) + "/compose"; + var url = ApplicationBaseURL + encodeURI("/" + account) + "/compose"; openMailComposeWindow(url); } } @@ -1601,7 +1602,7 @@ function onReadMessageConfirmMDN(event) { var messageURL; if (window.opener && window.opener.Mailer) { /* from UIxMailPopupView */ - messageURL = (ApplicationBaseURL + encodeURI(mailboxName) + messageURL = (ApplicationBaseURL + encodeURI("/" + mailboxName) + "/" + messageName); } else { @@ -2020,7 +2021,7 @@ function initMailboxTree() { var chainRq = new AjaxRequestsChain(initMailboxTreeCB); for (var i = 0; i < mailAccounts.length; i++) { - var url = ApplicationBaseURL + i + "/mailboxes"; + var url = ApplicationBaseURL + "/" + i + "/mailboxes"; chainRq.requests.push([url, onLoadMailboxesCallback, i]); } chainRq.start(); @@ -2255,7 +2256,7 @@ function buildMailboxes(accountIdx, encoded) { function getFoldersState() { if (mailAccounts.length > 0) { - var urlstr = ApplicationBaseURL + "foldersState"; + var urlstr = ApplicationBaseURL + "/foldersState"; triggerAjaxRequest(urlstr, getFoldersStateCallback); } } @@ -2279,7 +2280,7 @@ function getFoldersStateCallback(http) { function saveFoldersState() { if (mailAccounts.length > 0) { var foldersState = mailboxTree.getFoldersState(); - var urlstr = ApplicationBaseURL + "saveFoldersState"; + var urlstr = ApplicationBaseURL + "/saveFoldersState"; var parameters = "expandedFolders=" + foldersState; triggerAjaxRequest(urlstr, saveFoldersStateCallback, null, parameters, { "Content-type": "application/x-www-form-urlencoded" }); diff --git a/UI/WebServerResources/SOGoDragHandles.js b/UI/WebServerResources/SOGoDragHandles.js index e6144ad73..882c38517 100644 --- a/UI/WebServerResources/SOGoDragHandles.js +++ b/UI/WebServerResources/SOGoDragHandles.js @@ -186,7 +186,7 @@ var SOGoDragHandlesInterface = { }, saveDragHandleState: function (type, position, fcn) { if (!$(document.body).hasClassName("popup")) { - var urlstr = ApplicationBaseURL + "saveDragHandleState" + var urlstr = ApplicationBaseURL + "/saveDragHandleState" + "?" + type + "=" + position; var callbackFunction = fcn || this.saveDragHandleStateCallback; triggerAjaxRequest(urlstr, callbackFunction); diff --git a/UI/WebServerResources/SOGoResizableTable.js b/UI/WebServerResources/SOGoResizableTable.js index ca5ff2803..10694296f 100644 --- a/UI/WebServerResources/SOGoResizableTable.js +++ b/UI/WebServerResources/SOGoResizableTable.js @@ -73,7 +73,7 @@ var SOGoResizableTableInterface = { saveColumnsState: function() { this.computeColumnsWidths(); if (!$(document.body).hasClassName("popup")) { - var url = ApplicationBaseURL + "saveColumnsState"; + var url = ApplicationBaseURL + "/saveColumnsState"; var data = this.ratios; var columns = data.keys(); var params = "columns=" + columns.join(",") diff --git a/UI/WebServerResources/SOGoRootPage.js b/UI/WebServerResources/SOGoRootPage.js index 09edd17b1..a2300ee62 100644 --- a/UI/WebServerResources/SOGoRootPage.js +++ b/UI/WebServerResources/SOGoRootPage.js @@ -158,7 +158,7 @@ function redirectToUserPage() { && !userName.endsWith(loginSuffix)) userName += loginSuffix; var address = "" + window.location.href; - var baseAddress = ApplicationBaseURL + encodeURIComponent(userName); + var baseAddress = ApplicationBaseURL + "/" + encodeURIComponent(userName); var altBaseAddress; if (baseAddress[0] == "/") { var parts = address.split("/"); diff --git a/UI/WebServerResources/SchedulerUI.js b/UI/WebServerResources/SchedulerUI.js index 5efecbd57..17d93d45a 100644 --- a/UI/WebServerResources/SchedulerUI.js +++ b/UI/WebServerResources/SchedulerUI.js @@ -112,7 +112,7 @@ function updateEventFromDragging(controller, eventCells, eventDelta) { _editRecurrenceDialog(eventCell, "confirmAdjustment", params); else { var urlstr = (ApplicationBaseURL - + eventCell.calendar + "/" + eventCell.cname); + + "/" + eventCell.calendar + "/" + eventCell.cname); if (eventCell.recurrenceTime) urlstr += "/occurence" + eventCell.recurrenceTime; urlstr += ("/adjust?" + params); @@ -123,7 +123,7 @@ function updateEventFromDragging(controller, eventCells, eventDelta) { } function performEventAdjustment(folder, event, recurrence, params) { - var urlstr = ApplicationBaseURL + folder + "/" + event; + var urlstr = ApplicationBaseURL + "/" + folder + "/" + event; if (recurrence) urlstr += "/" + recurrence; urlstr += "/adjust" + generateQueryString(params); @@ -170,7 +170,7 @@ function onMenuNewTaskClick(event) { function _editEventId(id, calendar, recurrence) { var targetname = "SOGo_edit_" + id; - var urlstr = ApplicationBaseURL + calendar + "/" + id; + var urlstr = ApplicationBaseURL + "/" + calendar + "/" + id; if (recurrence) { urlstr += "/" + recurrence; targetname += recurrence; @@ -211,7 +211,7 @@ function _batchDeleteEvents() { // Delete the events of the next calendar var calendar = calendarsOfEventsToDelete.shift(); var events = eventsToDelete.shift(); - var urlstr = (ApplicationBaseURL + calendar + var urlstr = (ApplicationBaseURL + "/" + calendar + "/batchDelete?ids=" + events.join(',')); document.deleteEventAjaxRequest = triggerAjaxRequest(urlstr, deleteEventCallback, @@ -439,7 +439,7 @@ function copyEventToPersonalCalendar(event) { function copyEvents() { var path = eventsToCopy.shift(); - var urlstr = ApplicationBaseURL + path; log (urlstr); + var urlstr = ApplicationBaseURL + "/" + path; log (urlstr); triggerAjaxRequest(urlstr, copyEventCallback); } @@ -469,7 +469,7 @@ function onMenuRawEvent(event) { var calendar = selectedCalendarCell[0].calendar; var cname = selectedCalendarCell[0].cname; - var url = ApplicationBaseURL + calendar + "/" + cname + "/raw"; + var url = ApplicationBaseURL + "/" + calendar + "/" + cname + "/raw"; openGenericWindow(url); } @@ -706,7 +706,7 @@ function getEventById(cname, owner) { function _editRecurrenceDialog(eventCell, method, params) { var targetname = "SOGo_edit_" + eventCell.cname + eventCell.recurrenceTime; - var urlstr = (ApplicationBaseURL + eventCell.calendar + "/" + eventCell.cname + var urlstr = (ApplicationBaseURL + "/" + eventCell.calendar + "/" + eventCell.cname + "/occurence" + eventCell.recurrenceTime + "/" + method); if (params && params.length) { urlstr += "?" + params; @@ -719,7 +719,7 @@ function _editRecurrenceDialog(eventCell, method, params) { function onViewEvent(event) { if (event.detail == 2) return; - var url = ApplicationBaseURL + this.calendar + "/" + this.cname; + var url = ApplicationBaseURL + "/" + this.calendar + "/" + this.cname; if (typeof this.recurrenceTime != "undefined") url += "/occurence" + this.recurrenceTime; @@ -846,7 +846,7 @@ function performEventDeletion(folder, event, recurrence) { // Only one recurrence var occurenceTime = recurrence.substring(9); var nodes = _eventBlocksMatching(folder, event, occurenceTime); - var urlstr = ApplicationBaseURL + folder + "/" + event + "/" + recurrence + "/delete"; + var urlstr = ApplicationBaseURL + "/" + folder + "/" + event + "/" + recurrence + "/delete"; if (nodes) document.deleteEventAjaxRequest = triggerAjaxRequest(urlstr, @@ -1224,7 +1224,7 @@ function loadNextView(event) { } function changeDateSelectorDisplay(day, keepCurrentDay) { - var url = ApplicationBaseURL + "dateselector"; + var url = ApplicationBaseURL + "/dateselector"; if (day) { if (day.length < 8) day += "01"; @@ -1254,7 +1254,7 @@ function changeDateSelectorDisplay(day, keepCurrentDay) { function changeCalendarDisplay(data, newView) { newView = ((newView) ? newView : currentView); - var url = ApplicationBaseURL + newView; + var url = ApplicationBaseURL + "/" + newView; var day = null; var scrollEvent = null; if (data) { @@ -1591,7 +1591,7 @@ function refreshCalendarEvents(scrollEvent) { document.refreshCalendarEventsAjaxRequest.aborted = true; document.refreshCalendarEventsAjaxRequest.abort(); } - var url = (ApplicationBaseURL + "eventsblocks?sd=" + sd + "&ed=" + ed + var url = (ApplicationBaseURL + "/eventsblocks?sd=" + sd + "&ed=" + ed + "&view=" + currentView); document.refreshCalendarEventsAjaxRequest = triggerAjaxRequest(url, refreshCalendarEventsCallback, @@ -2156,7 +2156,7 @@ function _loadEventHref(href) { document.eventsListAjaxRequest.aborted = true; document.eventsListAjaxRequest.abort(); } - var url = ApplicationBaseURL + href; + var url = ApplicationBaseURL + "/" + href; document.eventsListAjaxRequest = triggerAjaxRequest(url, eventsListCallback, href); @@ -2168,7 +2168,7 @@ function _loadTasksHref(href) { document.tasksListAjaxRequest.aborted = true; document.tasksListAjaxRequest.abort(); } - url = ApplicationBaseURL + href; + url = ApplicationBaseURL + "/" + href; var tasksList = $("tasksList"); var selectedIds; @@ -2788,7 +2788,7 @@ function marksTasksAsCompleted () { } function _updateTaskCompletion (task, value) { - url = (ApplicationBaseURL + task.calendar + url = (ApplicationBaseURL + "/" + task.calendar + "/" + task.cname + "/changeStatus?status=" + value); triggerAjaxRequest(url, refreshTasks, null); @@ -2802,7 +2802,7 @@ function onMenuRawTask(event) { return; } - var url = ApplicationBaseURL + selectedTasks[0].calendar + "/" + selectedTasks[0].cname + "/raw" + var url = ApplicationBaseURL + "/" + selectedTasks[0].calendar + "/" + selectedTasks[0].cname + "/raw" openGenericWindow(url); } @@ -3221,7 +3221,7 @@ function deletePersonalCalendarConfirm() { this.deselect(); this.hide(); removeFolderRequestCount++; - var url = ApplicationBaseURL + "/" + folderId + "/delete"; + var url = ApplicationBaseURL + folderId + "/delete"; triggerAjaxRequest(url, deletePersonalCalendarCallback, this); disposeDialog(); } @@ -3366,7 +3366,7 @@ function onListCollapse(event, element) { }); } - var url = ApplicationBaseURL + "saveListState"; + var url = ApplicationBaseURL + "/saveListState"; var params = "state=" + state; triggerAjaxRequest(url, null, null, params, { "Content-type": "application/x-www-form-urlencoded" }); @@ -3411,7 +3411,7 @@ function onDocumentKeydown(event) { function saveTabState(event) { var tab = $(event).memo; - var url = ApplicationBaseURL + "saveSelectedList"; + var url = ApplicationBaseURL + "/saveSelectedList"; var params = "list=" + tab; triggerAjaxRequest(url, null, null, params, { "Content-type": "application/x-www-form-urlencoded" }); diff --git a/UI/WebServerResources/UIxComponentEditor.js b/UI/WebServerResources/UIxComponentEditor.js index bee362407..87a20bd61 100644 --- a/UI/WebServerResources/UIxComponentEditor.js +++ b/UI/WebServerResources/UIxComponentEditor.js @@ -347,7 +347,7 @@ function onPopupRecurrenceWindow(event) { if (ComponentEditor.recurrenceWindow && ComponentEditor.recurrenceWindow.open && !ComponentEditor.recurrenceWindow.closed) ComponentEditor.recurrenceWindow.focus(); else - ComponentEditor.recurrenceWindow = window.open(ApplicationBaseURL + "editRecurrence", + ComponentEditor.recurrenceWindow = window.open(ApplicationBaseURL + "/editRecurrence", sanitizeWindowName(activeCalendar + activeComponent + "Recurrence"), "width=500,height=400"); } @@ -373,7 +373,7 @@ function onPopupReminderWindow(event) { else { var height = (emailAlarmsEnabled ? 235 : 150); ComponentEditor.reminderWindow - = window.open(ApplicationBaseURL + "editReminder", + = window.open(ApplicationBaseURL + "/editReminder", sanitizeWindowName(activeCalendar + activeComponent + "Reminder"), "width=255,height=" + height); } @@ -400,7 +400,7 @@ function onOkButtonClick (e) { else if (value == 3) action = 'tentative'; else if (value == 4) { - var url = ApplicationBaseURL + activeCalendar + '/' + activeComponent; + var url = ApplicationBaseURL + "/" + activeCalendar + "/" + activeComponent; delegateInvitation(url, modifyEventCallback); } diff --git a/UI/WebServerResources/UIxFilterEditor.js b/UI/WebServerResources/UIxFilterEditor.js index 3d38c5da1..52e1bdf3c 100644 --- a/UI/WebServerResources/UIxFilterEditor.js +++ b/UI/WebServerResources/UIxFilterEditor.js @@ -38,7 +38,7 @@ function onLoadHandler() { } function loadMailboxes() { - var url = ApplicationBaseURL + "Mail/0/mailboxes"; + var url = ApplicationBaseURL + "/Mail/0/mailboxes"; triggerAjaxRequest(url, onLoadMailboxesCallback); } diff --git a/UI/WebServerResources/UIxPreferences.js b/UI/WebServerResources/UIxPreferences.js index e1a8880ce..c342ffa1f 100644 --- a/UI/WebServerResources/UIxPreferences.js +++ b/UI/WebServerResources/UIxPreferences.js @@ -328,7 +328,7 @@ function updateSieveFilterRow(filterTable, number, filter) { } function _editFilter(filterId) { - var urlstr = ApplicationBaseURL + "editFilter?filter=" + filterId; + var urlstr = ApplicationBaseURL + "/editFilter?filter=" + filterId; var win = window.open(urlstr, "sieve_filter_" + filterId, "width=560,height=380,resizable=0"); if (win) diff --git a/UI/WebServerResources/generic.js b/UI/WebServerResources/generic.js index 89149d9a0..03aff58ae 100644 --- a/UI/WebServerResources/generic.js +++ b/UI/WebServerResources/generic.js @@ -91,6 +91,7 @@ function createElement(tagName, id, classes, attributes, htmlAttributes, parentN function URLForFolderID(folderID) { var folderInfos = folderID.split(":"); var url; + if (folderInfos.length > 1) { url = UserFolderURL + "../" + encodeURI(folderInfos[0]); if (!(folderInfos[0].endsWith('/') @@ -100,9 +101,8 @@ function URLForFolderID(folderID) { } else { var folderInfo = folderInfos[0]; - if (ApplicationBaseURL.endsWith('/') - && folderInfo.startsWith('/')) - folderInfo = folderInfo.substr(1); + if (!(folderInfo.startsWith('/'))) + folderInfo = "/" + folderInfo; url = ApplicationBaseURL + encodeURI(folderInfo); } @@ -173,9 +173,7 @@ function sanitizeWindowName(dirtyWindowName) { function openUserFolderSelector(callback, type) { var urlstr = ApplicationBaseURL; - if (! urlstr.endsWith('/')) - urlstr += '/'; - urlstr += ("../../" + UserLogin + "/Contacts/userFolders"); + urlstr += ("/../../" + UserLogin + "/Contacts/userFolders"); var div = $("popupFrame"); if (div) { @@ -328,7 +326,7 @@ function openMailTo(senderMailTo) { if (sanitizedAddresses.length > 0) openMailComposeWindow(ApplicationBaseURL - + "../Mail/compose?mailto=" + encodeURIComponent(Object.toJSON(sanitizedAddresses)) + + "/../Mail/compose?mailto=" + encodeURIComponent(Object.toJSON(sanitizedAddresses)) + ((subject.length > 0)?"?subject=" + encodeURIComponent(subject):"")); return false; /* stop following the link */ @@ -1803,12 +1801,7 @@ function CurrentModule() { if (ApplicationBaseURL) { var parts = ApplicationBaseURL.split("/"); var last = parts.length - 1; - while (last > -1 && parts[last] == "") { - last--; - } - if (last > -1) { - module = parts[last]; - } + module = parts[last]; } return module; From 1b9ac03e947e5c85cbcfdb1d252dffd43545f536 Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Fri, 28 Feb 2014 16:39:27 -0500 Subject: [PATCH 003/144] BugFix #1046; Whenever the sieve server is unavailable an error message will appear. --- .../English.lproj/Localizable.strings | 5 +++ UI/PreferencesUI/UIxPreferences.m | 36 +++++++++++++++++++ UI/WebServerResources/UIxPreferences.js | 28 +++++++++++++++ 3 files changed, 69 insertions(+) diff --git a/UI/PreferencesUI/English.lproj/Localizable.strings b/UI/PreferencesUI/English.lproj/Localizable.strings index afa832c3e..2698aa941 100644 --- a/UI/PreferencesUI/English.lproj/Localizable.strings +++ b/UI/PreferencesUI/English.lproj/Localizable.strings @@ -248,6 +248,11 @@ "Active" = "Active"; "Move Up" = "Move Up"; "Move Down" = "Move Down"; +<<<<<<< HEAD +======= +"ConnectionError" = "Connection error"; +"ServiceTemporarilyUnavailable" = "Service temporarily unavailable"; +>>>>>>> a005b93... bug 1046 finished, if sieve server is not responding an error message will appear /* Filters - UIxFilterEditor */ "Filter name:" = "Filter name:"; diff --git a/UI/PreferencesUI/UIxPreferences.m b/UI/PreferencesUI/UIxPreferences.m index 7ba612cac..6b1d96f84 100644 --- a/UI/PreferencesUI/UIxPreferences.m +++ b/UI/PreferencesUI/UIxPreferences.m @@ -1142,6 +1142,7 @@ static NSArray *reminderValues = nil; id results; WORequest *request; SOGoDomainDefaults *dd; +<<<<<<< HEAD NSString *method; request = [context request]; @@ -1158,6 +1159,23 @@ static NSArray *reminderValues = nil; if ([dd forwardEnabled]) [userDefaults setForwardOptions: forwardOptions]; +======= + SOGoMailAccount *account; + SOGoMailAccounts *folder; + WORequest *request; + + request = [context request]; + if ([[request method] isEqualToString: @"POST"]){ + dd = [[context activeUser] domainDefaults]; + if ([dd sieveScriptsEnabled]) + [userDefaults setSieveFilters: sieveFilters]; + if ([dd vacationEnabled]) + [userDefaults setVacationOptions: vacationOptions]; + if ([dd forwardEnabled]) + [userDefaults setForwardOptions: forwardOptions]; + + if([self isSieveServerAvailable]){ +>>>>>>> a005b93... bug 1046 finished, if sieve server is not responding an error message will appear [userDefaults synchronize]; folder = [[self clientObject] mailAccountsFolder: @"Mail" @@ -1165,6 +1183,7 @@ static NSArray *reminderValues = nil; account = [folder lookupName: @"0" inContext: context acquire: NO]; [account updateFilters]; +<<<<<<< HEAD if (hasChanged) method = @"window.location.reload()"; else @@ -1175,6 +1194,23 @@ static NSArray *reminderValues = nil; else results = self; +======= + if([account updateFilters]){ + results = [self responseWithStatus: 200 andJSONRepresentation: [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:hasChanged], @"hasChanged", nil]]; + } + else{ + results = [self responseWithStatus: 502 andJSONRepresentation:[NSDictionary dictionaryWithObjectsAndKeys: @"ConnectionError", @"textStatus", nil]]; + } + } + else{ + results = [self responseWithStatus: 503 andJSONRepresentation:[NSDictionary dictionaryWithObjectsAndKeys: @"ServiceTemporarilyUnavailable", @"textStatus", nil]]; + } + } + else{ + results = self; + } + +>>>>>>> a005b93... bug 1046 finished, if sieve server is not responding an error message will appear return results; } diff --git a/UI/WebServerResources/UIxPreferences.js b/UI/WebServerResources/UIxPreferences.js index e1a8880ce..2e6a9f282 100644 --- a/UI/WebServerResources/UIxPreferences.js +++ b/UI/WebServerResources/UIxPreferences.js @@ -80,11 +80,39 @@ function savePreferences(sender) { } if (sendForm) { +<<<<<<< HEAD saveMailAccounts(); $("mainForm").submit(); } return false; +======= + saveMailAccounts(); + + triggerAjaxRequest($("mainForm").readAttribute("action"), function (http) { + if (http.readyState == 4) { + var response = http.responseText.evalJSON(true); + if (http.status == 503) { + showAlertDialog(_(response.textStatus)); + } + else if (http.status == 200) { + if (response.hasChanged == 1) { + window.opener.location.reload(); + window.close();} + else { + window.close();}} + else { + showAlertDialog(_(response.textStatus)); + } + } + }, + null, + Form.serialize($("mainForm")), // excludes the file input + { "Content-type": "application/x-www-form-urlencoded" }); + } + return false; + +>>>>>>> a005b93... bug 1046 finished, if sieve server is not responding an error message will appear } function prototypeIfyFilters() { From f4d189ffc893de10d397249dd15427a1de961852 Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Thu, 6 Mar 2014 15:20:41 -0500 Subject: [PATCH 004/144] Erase the merging conflicts writings --- .../English.lproj/Localizable.strings | 3 -- UI/PreferencesUI/UIxPreferences.m | 47 +++---------------- UI/WebServerResources/UIxPreferences.js | 9 ---- 3 files changed, 6 insertions(+), 53 deletions(-) diff --git a/UI/PreferencesUI/English.lproj/Localizable.strings b/UI/PreferencesUI/English.lproj/Localizable.strings index 2698aa941..10fbf68a3 100644 --- a/UI/PreferencesUI/English.lproj/Localizable.strings +++ b/UI/PreferencesUI/English.lproj/Localizable.strings @@ -248,11 +248,8 @@ "Active" = "Active"; "Move Up" = "Move Up"; "Move Down" = "Move Down"; -<<<<<<< HEAD -======= "ConnectionError" = "Connection error"; "ServiceTemporarilyUnavailable" = "Service temporarily unavailable"; ->>>>>>> a005b93... bug 1046 finished, if sieve server is not responding an error message will appear /* Filters - UIxFilterEditor */ "Filter name:" = "Filter name:"; diff --git a/UI/PreferencesUI/UIxPreferences.m b/UI/PreferencesUI/UIxPreferences.m index 6b1d96f84..09afe22a3 100644 --- a/UI/PreferencesUI/UIxPreferences.m +++ b/UI/PreferencesUI/UIxPreferences.m @@ -1140,61 +1140,27 @@ static NSArray *reminderValues = nil; - (id ) defaultAction { id results; - WORequest *request; SOGoDomainDefaults *dd; -<<<<<<< HEAD - NSString *method; - - request = [context request]; - if ([[request method] isEqualToString: @"POST"]) - { - SOGoMailAccount *account; - SOGoMailAccounts *folder; - - dd = [[context activeUser] domainDefaults]; - if ([dd sieveScriptsEnabled]) - [userDefaults setSieveFilters: sieveFilters]; - if ([dd vacationEnabled]) - [userDefaults setVacationOptions: vacationOptions]; - if ([dd forwardEnabled]) - [userDefaults setForwardOptions: forwardOptions]; - -======= SOGoMailAccount *account; SOGoMailAccounts *folder; WORequest *request; - + request = [context request]; if ([[request method] isEqualToString: @"POST"]){ dd = [[context activeUser] domainDefaults]; if ([dd sieveScriptsEnabled]) - [userDefaults setSieveFilters: sieveFilters]; + [userDefaults setSieveFilters: sieveFilters]; if ([dd vacationEnabled]) - [userDefaults setVacationOptions: vacationOptions]; + [userDefaults setVacationOptions: vacationOptions]; if ([dd forwardEnabled]) - [userDefaults setForwardOptions: forwardOptions]; - + [userDefaults setForwardOptions: forwardOptions]; + if([self isSieveServerAvailable]){ ->>>>>>> a005b93... bug 1046 finished, if sieve server is not responding an error message will appear [userDefaults synchronize]; - folder = [[self clientObject] mailAccountsFolder: @"Mail" inContext: context]; account = [folder lookupName: @"0" inContext: context acquire: NO]; - [account updateFilters]; - -<<<<<<< HEAD - if (hasChanged) - method = @"window.location.reload()"; - else - method = nil; - - results = [self jsCloseWithRefreshMethod: method]; - } - else - results = self; - -======= + if([account updateFilters]){ results = [self responseWithStatus: 200 andJSONRepresentation: [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:hasChanged], @"hasChanged", nil]]; } @@ -1210,7 +1176,6 @@ static NSArray *reminderValues = nil; results = self; } ->>>>>>> a005b93... bug 1046 finished, if sieve server is not responding an error message will appear return results; } diff --git a/UI/WebServerResources/UIxPreferences.js b/UI/WebServerResources/UIxPreferences.js index 2e6a9f282..c8c6584c6 100644 --- a/UI/WebServerResources/UIxPreferences.js +++ b/UI/WebServerResources/UIxPreferences.js @@ -80,13 +80,6 @@ function savePreferences(sender) { } if (sendForm) { -<<<<<<< HEAD - saveMailAccounts(); - $("mainForm").submit(); - } - - return false; -======= saveMailAccounts(); triggerAjaxRequest($("mainForm").readAttribute("action"), function (http) { @@ -111,8 +104,6 @@ function savePreferences(sender) { { "Content-type": "application/x-www-form-urlencoded" }); } return false; - ->>>>>>> a005b93... bug 1046 finished, if sieve server is not responding an error message will appear } function prototypeIfyFilters() { From f8939bfb3efbb92957f237f998ff9f5fd5e72541 Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Mon, 10 Mar 2014 10:07:47 -0400 Subject: [PATCH 005/144] Change the variable name for sieveFolderEncoding instead of folderEncoding --- SoObjects/SOGo/SOGoDefaults.plist | 2 +- SoObjects/SOGo/SOGoSystemDefaults.h | 2 +- SoObjects/SOGo/SOGoSystemDefaults.m | 4 ++-- UI/Templates/PreferencesUI/UIxFilterEditor.wox | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/SoObjects/SOGo/SOGoDefaults.plist b/SoObjects/SOGo/SOGoDefaults.plist index a3f09d602..bdc5005f5 100644 --- a/SoObjects/SOGo/SOGoDefaults.plist +++ b/SoObjects/SOGo/SOGoDefaults.plist @@ -13,7 +13,7 @@ SOGoZipPath = "/usr/bin/zip"; SOGoEncryptionKey = "MySOGoEncryptionKey"; - SOGoFolderEncoding = "UTF-7"; + SOGoSieveFolderEncoding = "UTF-7"; WOUseRelativeURLs = YES; WOMessageUseUTF8 = YES; diff --git a/SoObjects/SOGo/SOGoSystemDefaults.h b/SoObjects/SOGo/SOGoSystemDefaults.h index 24d7e4baf..953e799db 100644 --- a/SoObjects/SOGo/SOGoSystemDefaults.h +++ b/SoObjects/SOGo/SOGoSystemDefaults.h @@ -42,7 +42,7 @@ - (BOOL) trustProxyAuthentication; - (NSString *) encryptionKey; - (BOOL) useRelativeURLs; -- (NSString *) folderEncoding; +- (NSString *) sieveFolderEncoding; - (BOOL) isWebAccessEnabled; - (BOOL) isCalendarDAVAccessEnabled; diff --git a/SoObjects/SOGo/SOGoSystemDefaults.m b/SoObjects/SOGo/SOGoSystemDefaults.m index 53e67e108..aa89c0c88 100644 --- a/SoObjects/SOGo/SOGoSystemDefaults.m +++ b/SoObjects/SOGo/SOGoSystemDefaults.m @@ -356,9 +356,9 @@ _injectConfigurationFromFile (NSMutableDictionary *defaultsDict, return [self boolForKey: @"WOUseRelativeURLs"]; } -- (NSString *) folderEncoding +- (NSString *) sieveFolderEncoding { - return [self stringForKey: @"SOGoFolderEncoding"]; + return [self stringForKey: @"SOGoSieveFolderEncoding"]; } diff --git a/UI/Templates/PreferencesUI/UIxFilterEditor.wox b/UI/Templates/PreferencesUI/UIxFilterEditor.wox index 952188e47..b62f77a84 100644 --- a/UI/Templates/PreferencesUI/UIxFilterEditor.wox +++ b/UI/Templates/PreferencesUI/UIxFilterEditor.wox @@ -13,7 +13,7 @@ > From f5faa608145ccb70ed89b0d29e9b8adad17d2f0b Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Mon, 10 Mar 2014 10:33:27 -0400 Subject: [PATCH 006/144] Added missing functions getClient and IsSieveServerConnected and the changes that comes with it --- UI/PreferencesUI/UIxPreferences.h | 4 ++++ UI/PreferencesUI/UIxPreferences.m | 37 +++++++++++++++++++++---------- 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/UI/PreferencesUI/UIxPreferences.h b/UI/PreferencesUI/UIxPreferences.h index 3040e67ae..69dd4c075 100644 --- a/UI/PreferencesUI/UIxPreferences.h +++ b/UI/PreferencesUI/UIxPreferences.h @@ -22,6 +22,7 @@ #define UIXPREFERENCES_H #import +#import @class NSString; @@ -32,6 +33,7 @@ { id item; SOGoUser *user; + NGSieveClient *client; // Calendar categories NSString *category; @@ -58,6 +60,8 @@ } - (NSString *) userLongDateFormat; +- (BOOL) isSieveServerAvailable; +- (id) getClient; @end diff --git a/UI/PreferencesUI/UIxPreferences.m b/UI/PreferencesUI/UIxPreferences.m index 09afe22a3..a383b9edc 100644 --- a/UI/PreferencesUI/UIxPreferences.m +++ b/UI/PreferencesUI/UIxPreferences.m @@ -114,6 +114,8 @@ static NSArray *reminderValues = nil; if ((self = [super init])) { item = nil; + client = [self getClient]; + #warning user should be the owner rather than the activeUser ASSIGN (user, [context activeUser]); ASSIGN (today, [NSCalendarDate date]); @@ -174,6 +176,7 @@ static NSArray *reminderValues = nil; [contactsCategories release]; [forwardOptions release]; [daysOfWeek release]; + [client release]; [super dealloc]; } @@ -840,26 +843,15 @@ static NSArray *reminderValues = nil; - (NSString *) sieveCapabilities { -#warning sieve caps should be deduced from the server static NSArray *capabilities = nil; - SOGoMailAccounts *folder; - SOGoMailAccount *account; - SOGoSieveManager *manager; - NGSieveClient *client; if (!capabilities) { - folder = [[self clientObject] mailAccountsFolder: @"Mail" - inContext: context]; - account = [folder lookupName: @"0" inContext: context acquire: NO]; - manager = [SOGoSieveManager sieveManagerForUser: [context activeUser]]; - client = [manager clientForAccount: account]; - if (client) capabilities = [client capabilities]; else capabilities = [NSArray array]; - [capabilities retain]; + [capabilities retain]; } return [capabilities jsonRepresentation]; @@ -1137,6 +1129,27 @@ static NSArray *reminderValues = nil; } } +- (id) getClient{ + SOGoMailAccount *account; + SOGoMailAccounts *folder; + SOGoSieveManager *manager; + NGSieveClient *realClient; + + folder = [[self clientObject] mailAccountsFolder: @"Mail" inContext: context]; + account = [folder lookupName: @"0" inContext: context acquire: NO]; + manager = [SOGoSieveManager sieveManagerForUser: [context activeUser]]; + realClient = [manager clientForAccount: account]; + + return realClient; +} + +- (BOOL) isSieveServerAvailable { + return (([client isConnected]) + ? true + : false); +} + + - (id ) defaultAction { id results; From 3a681bd5a5a856a2230e730945c3ed2df076ff0a Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Mon, 10 Mar 2014 10:53:44 -0400 Subject: [PATCH 007/144] Change the function name getClient to sieveClient --- UI/PreferencesUI/UIxPreferences.h | 2 +- UI/PreferencesUI/UIxPreferences.m | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/UI/PreferencesUI/UIxPreferences.h b/UI/PreferencesUI/UIxPreferences.h index 69dd4c075..4dcb1548b 100644 --- a/UI/PreferencesUI/UIxPreferences.h +++ b/UI/PreferencesUI/UIxPreferences.h @@ -61,7 +61,7 @@ - (NSString *) userLongDateFormat; - (BOOL) isSieveServerAvailable; -- (id) getClient; +- (id) sieveClient; @end diff --git a/UI/PreferencesUI/UIxPreferences.m b/UI/PreferencesUI/UIxPreferences.m index a383b9edc..b1a0e1a8c 100644 --- a/UI/PreferencesUI/UIxPreferences.m +++ b/UI/PreferencesUI/UIxPreferences.m @@ -1129,18 +1129,18 @@ static NSArray *reminderValues = nil; } } -- (id) getClient{ +- (id) sieveClient{ SOGoMailAccount *account; SOGoMailAccounts *folder; SOGoSieveManager *manager; - NGSieveClient *realClient; + NGSieveClient *sieveClient; folder = [[self clientObject] mailAccountsFolder: @"Mail" inContext: context]; account = [folder lookupName: @"0" inContext: context acquire: NO]; manager = [SOGoSieveManager sieveManagerForUser: [context activeUser]]; - realClient = [manager clientForAccount: account]; + sieveClient = [manager clientForAccount: account]; - return realClient; + return sieveClient; } - (BOOL) isSieveServerAvailable { From cee1e529f82e35c8f715657ccf6cf168294f8b72 Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Mon, 10 Mar 2014 12:05:01 -0400 Subject: [PATCH 008/144] BugFix#1636; fix the issue where the user could add anything for the birthday of his contacts --- UI/Contacts/English.lproj/Localizable.strings | 2 ++ UI/WebServerResources/UIxContactEditor.js | 27 ++++++++++++++++--- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/UI/Contacts/English.lproj/Localizable.strings b/UI/Contacts/English.lproj/Localizable.strings index 5c2239220..d52b2e31e 100644 --- a/UI/Contacts/English.lproj/Localizable.strings +++ b/UI/Contacts/English.lproj/Localizable.strings @@ -37,6 +37,8 @@ "edit" = "edit"; "invalidemailwarn" = "The specified email is invalid"; "invaliddatewarn" = "The specified date is invalid."; +"invalidmonthwarn" = "The specified month is invalid."; +"invalidyearwarn" = "The specified year is invalid."; "new" = "new"; "Preferred Phone" = "Preferred Phone"; diff --git a/UI/WebServerResources/UIxContactEditor.js b/UI/WebServerResources/UIxContactEditor.js index 1db214b58..4163a2828 100644 --- a/UI/WebServerResources/UIxContactEditor.js +++ b/UI/WebServerResources/UIxContactEditor.js @@ -94,15 +94,34 @@ function validateContactEditor() { alert(_("invalidemailwarn")); rc = false; } + + var today = new Date(); + var yyyy = today.getFullYear(); var byear = $('birthyear'); var bmonth = $('birthmonth'); var bday = $('birthday'); - var bdayValue = byear.value + "-" + bmonth.value + "-" + bday.value; - if (bdayValue != "--" && !dateRegex.test(bdayValue)) { - alert(_("invaliddatewarn")); - rc = false; + + if(byear.value <= yyyy && (byear.value.length == 4)){ + if(bmonth.value <= 12 && bmonth.value >=1){ + if(bday.value <= 31 && bday.value >=1){ + var bdayValue = byear.value + "-" + bmonth.value + "-" + bday.value; + if (bdayValue != "--" && !dateRegex.test(bdayValue)) { + alert(_("invaliddatewarn")); + rc = false; + } + } + else{ + alert(_("invaliddatewarn")); + rc = false;} + } + else{ + alert(_("invalidmonthwarn")); + rc = false;} } + else{ + alert(_("invalidyearwarn")); + rc = false;} return rc; } From 0d69a476bcf9b4f95d88a5ae0ecf30c8602c2a66 Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Mon, 10 Mar 2014 12:16:12 -0400 Subject: [PATCH 009/144] add specific date for limiting the user to today's for his contact birthday --- UI/WebServerResources/UIxContactEditor.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/UI/WebServerResources/UIxContactEditor.js b/UI/WebServerResources/UIxContactEditor.js index 4163a2828..47813a1b2 100644 --- a/UI/WebServerResources/UIxContactEditor.js +++ b/UI/WebServerResources/UIxContactEditor.js @@ -97,14 +97,16 @@ function validateContactEditor() { var today = new Date(); var yyyy = today.getFullYear(); + var mm = today.getMonth(); + var dd = today.getDay(); var byear = $('birthyear'); var bmonth = $('birthmonth'); var bday = $('birthday'); if(byear.value <= yyyy && (byear.value.length == 4)){ - if(bmonth.value <= 12 && bmonth.value >=1){ - if(bday.value <= 31 && bday.value >=1){ + if(bmonth.value <= mm && bmonth.value <= 12 && bmonth.value >=1){ + if(bday.value <= dd && bday.value <= 31 && bday.value >=1){ var bdayValue = byear.value + "-" + bmonth.value + "-" + bday.value; if (bdayValue != "--" && !dateRegex.test(bdayValue)) { alert(_("invaliddatewarn")); From 8cc352fb28013801c56cc5138dba97f12de0ff6c Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Mon, 10 Mar 2014 14:45:10 -0400 Subject: [PATCH 010/144] It is now possible to see the version on the general page of the preferences window --- UI/PreferencesUI/UIxPreferences.m | 9 +++++++++ UI/Templates/PreferencesUI/UIxPreferences.wox | 2 ++ 2 files changed, 11 insertions(+) diff --git a/UI/PreferencesUI/UIxPreferences.m b/UI/PreferencesUI/UIxPreferences.m index 7ba612cac..e2da3249d 100644 --- a/UI/PreferencesUI/UIxPreferences.m +++ b/UI/PreferencesUI/UIxPreferences.m @@ -46,6 +46,7 @@ #import #import #import +#import #import #import #import @@ -1137,6 +1138,14 @@ static NSArray *reminderValues = nil; } } +- (NSString *) sogoVersion +{ + NSString *sogoVersion = [NSString stringWithString: SOGoVersion]; + + return sogoVersion; +} + + - (id ) defaultAction { id results; diff --git a/UI/Templates/PreferencesUI/UIxPreferences.wox b/UI/Templates/PreferencesUI/UIxPreferences.wox index 66f69b6a9..7cc6cebdd 100644 --- a/UI/Templates/PreferencesUI/UIxPreferences.wox +++ b/UI/Templates/PreferencesUI/UIxPreferences.wox @@ -158,6 +158,8 @@ const:id="defaultModule" const:name="defaultModule" string="itemModuleText" selection="userDefaultModule"/> +
+
From d108777e89593ac4b6e62b12a78c6f6df92e18d7 Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Tue, 11 Mar 2014 10:25:01 -0400 Subject: [PATCH 011/144] Display the version at the top of the general tap --- UI/Templates/PreferencesUI/UIxPreferences.wox | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/UI/Templates/PreferencesUI/UIxPreferences.wox b/UI/Templates/PreferencesUI/UIxPreferences.wox index 7cc6cebdd..21ccf63ed 100644 --- a/UI/Templates/PreferencesUI/UIxPreferences.wox +++ b/UI/Templates/PreferencesUI/UIxPreferences.wox @@ -124,6 +124,8 @@
+
+
-
-
From 76307cfaafd886f053b4f5f6436f1412f7148c83 Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Mon, 24 Mar 2014 13:41:57 -0400 Subject: [PATCH 012/144] New feature : 1496; Unknown outgoing email addresses can now be automatically be added to your address books. --- .../English.lproj/Localizable.strings | 1 + SoObjects/Contacts/SOGoContactFolders.h | 8 + SoObjects/Contacts/SOGoContactFolders.m | 193 +++++++++++++++++- SoObjects/Mailer/SOGoDraftObject.h | 2 + SoObjects/Mailer/SOGoDraftObject.m | 73 ++++++- SoObjects/SOGo/SOGoDefaults.plist | 1 + SoObjects/SOGo/SOGoParentFolder.m | 31 +-- SoObjects/SOGo/SOGoUserDefaults.h | 6 + SoObjects/SOGo/SOGoUserDefaults.m | 25 ++- UI/Contacts/UIxContactFoldersView.m | 83 +------- .../English.lproj/Localizable.strings | 2 + UI/PreferencesUI/UIxPreferences.m | 64 ++++++ UI/Templates/PreferencesUI/UIxPreferences.wox | 10 + 13 files changed, 405 insertions(+), 94 deletions(-) diff --git a/SoObjects/Contacts/English.lproj/Localizable.strings b/SoObjects/Contacts/English.lproj/Localizable.strings index 56404b013..0d040749c 100644 --- a/SoObjects/Contacts/English.lproj/Localizable.strings +++ b/SoObjects/Contacts/English.lproj/Localizable.strings @@ -1 +1,2 @@ "Personal Address Book" = "Personal Address Book"; +"Collected Address Book" = "Collected Address Book"; diff --git a/SoObjects/Contacts/SOGoContactFolders.h b/SoObjects/Contacts/SOGoContactFolders.h index 1b685c85b..584fab024 100644 --- a/SoObjects/Contacts/SOGoContactFolders.h +++ b/SoObjects/Contacts/SOGoContactFolders.h @@ -25,12 +25,20 @@ @interface SOGoContactFolders : SOGoParentFolder +- (NSString *) defaultFolderName; +- (NSString *) collectedFolderName; + +- (NSException *) appendCollectedSources; - (NSException *) renameLDAPAddressBook: (NSString *) sourceID withDisplayName: (NSString *) newDisplayName; - (NSException *) removeLDAPAddressBook: (NSString *) sourceID; - (NSDictionary *) systemSources; +- (NSArray *) allContactsFromFilter: (NSString *) theFilter + excludeGroups: (BOOL) excludeGroups + excludeLists: (BOOL) excludeLists; + @end #endif /* SOGOCONTACTFOLDERS_H */ diff --git a/SoObjects/Contacts/SOGoContactFolders.m b/SoObjects/Contacts/SOGoContactFolders.m index 3c3e938f0..183d47e32 100644 --- a/SoObjects/Contacts/SOGoContactFolders.m +++ b/SoObjects/Contacts/SOGoContactFolders.m @@ -22,12 +22,18 @@ #import #import #import +#import #import #import #import #import +#import +#import +#import +#import + #import #import #import @@ -40,10 +46,17 @@ #import "SOGoContactFolders.h" +Class SOGoContactSourceFolderK; + #define XMLNS_INVERSEDAV @"urn:inverse:params:xml:ns:inverse-dav" @implementation SOGoContactFolders ++ (void) initialize +{ + SOGoContactSourceFolderK = [SOGoContactSourceFolder class]; +} + + (NSString *) gcsFolderType { return @"Contact"; @@ -110,6 +123,92 @@ return result; } +- (void) _createCollectedFolder +{ + NSArray *roles; + SOGoGCSFolder *folder; + SOGoUser *folderOwner; + + roles = [[context activeUser] rolesForObject: self inContext: context]; + folderOwner = [SOGoUser userWithLogin: [self ownerInContext: context]]; + + if (folderOwner && [folderOwner isResource]) + { + folder = [subFolderClass objectWithName: @"collected" inContainer: self]; + [folder setDisplayName: [self collectedFolderName]]; + [folder setOCSPath: [NSString stringWithFormat: @"%@/collected", OCSPath]]; + if ([folder create]) + [subFolders setObject: folder forKey: @"collected"]; + } +} + +- (NSException *) _fetchCollectedFolders: (NSString *) sql + withChannel: (EOAdaptorChannel *) fc +{ + NSArray *attrs; + NSDictionary *row; + SOGoGCSFolder *folder; + NSString *key; + NSException *error; + + if (!subFolderClass) + subFolderClass = [[self class] subFolderClass]; + + error = [fc evaluateExpressionX: sql]; + if (!error) + { + attrs = [fc describeResults: NO]; + while ((row = [fc fetchAttributes: attrs withZone: NULL])) + { + key = [row objectForKey: @"c_path4"]; + if ([key isKindOfClass: [NSString class]]) + { + folder = [subFolderClass objectWithName: key inContainer: self]; + [folder setOCSPath: [NSString stringWithFormat: @"%@/%@", + OCSPath, key]]; + [subFolders setObject: folder forKey: key]; + } + } + + if (![subFolders objectForKey: @"collected"]) + [self _createCollectedFolder]; + } + + return error; +} + +- (NSException *) appendCollectedSources +{ + GCSChannelManager *cm; + EOAdaptorChannel *fc; + NSURL *folderLocation; + NSString *sql, *gcsFolderType; + NSException *error; + + cm = [GCSChannelManager defaultChannelManager]; + folderLocation = [[GCSFolderManager defaultFolderManager] folderInfoLocation]; + fc = [cm acquireOpenChannelForURL: folderLocation]; + if ([fc isOpen]) + { + gcsFolderType = [[self class] gcsFolderType]; + + sql = [NSString stringWithFormat: (@"SELECT c_path4 FROM %@" + @" WHERE c_path2 = '%@'" + @" AND c_folder_type = '%@'"), + [folderLocation gcsTableName], + owner, + gcsFolderType]; + error = [self _fetchCollectedFolders: sql withChannel: fc]; + [cm releaseChannel: fc]; + } + else + error = [NSException exceptionWithName: @"SOGoDBException" + reason: @"database connection could not be open" + userInfo: nil]; + + return error; +} + - (NSDictionary *) systemSources { NSMutableDictionary *systemSources; @@ -223,9 +322,9 @@ SOGoUser *currentUser; id source; - if ([sourceID isEqualToString: @"personal"]) + if ([sourceID isEqualToString: @"personal"] || [sourceID isEqualToString: @"collected"]) result = [NSException exceptionWithHTTPStatus: 403 - reason: @"folder 'personal' cannot be deleted"]; + reason: (@"folder '%@' cannot be deleted", sourceID)]; else { result = nil; @@ -250,6 +349,11 @@ return [self labelForKey: @"Personal Address Book"]; } +- (NSString *) collectedFolderName +{ + return [self labelForKey: @"Collected Address Book"]; +} + - (NSArray *) toManyRelationshipKeys { NSMutableArray *keys; @@ -371,4 +475,89 @@ asWebDAVValue]; } +- (NSArray *) allContactsFromFilter: (NSString *) theFilter + excludeGroups: (BOOL) excludeGroups + excludeLists: (BOOL) excludeLists +{ + SOGoFolder *folder; + NSString *mail, *domain; + NSArray *folders, *contacts, *descriptors, *sortedContacts; + NSMutableArray *sortedFolders; + NSMutableDictionary *contact, *uniqueContacts; + unsigned int i, j, max; + NSSortDescriptor *commonNameDescriptor; + + // NSLog(@"Search all contacts: %@", searchText); + + domain = [[context activeUser] domain]; + folders = nil; + NS_DURING + folders = [self subFolders]; + NS_HANDLER + /* We need to specifically test for @"SOGoDBException", which is + raised explicitly in SOGoParentFolder. Any other exception should + be re-raised. */ + if ([[localException name] isEqualToString: @"SOGoDBException"]) + folders = nil; + else + [localException raise]; + NS_ENDHANDLER; + max = [folders count]; + sortedFolders = [NSMutableArray arrayWithCapacity: max]; + uniqueContacts = [NSMutableDictionary dictionary]; + for (i = 0; i < max; i++) + { + folder = [folders objectAtIndex: i]; + /* We first search in LDAP folders (in case of duplicated entries in GCS folders) */ + if ([folder isKindOfClass: SOGoContactSourceFolderK]) + [sortedFolders insertObject: folder atIndex: 0]; + else + [sortedFolders addObject: folder]; + } + for (i = 0; i < max; i++) + { + folder = [sortedFolders objectAtIndex: i]; + //NSLog(@" Address book: %@ (%@)", [folder displayName], [folder class]); + contacts = [folder lookupContactsWithFilter: theFilter + onCriteria: @"name_or_address" + sortBy: @"c_cn" + ordering: NSOrderedAscending + inDomain: domain]; + for (j = 0; j < [contacts count]; j++) + { + contact = [contacts objectAtIndex: j]; + mail = [contact objectForKey: @"c_mail"]; + //NSLog(@" found %@ (%@) ? %@", [contact objectForKey: @"c_name"], mail, + // [contact description]); + if (!excludeLists && [[contact objectForKey: @"c_component"] + isEqualToString: @"vlist"]) + { + [contact setObject: [folder nameInContainer] + forKey: @"container"]; + [uniqueContacts setObject: contact + forKey: [contact objectForKey: @"c_name"]]; + } + else if ([mail length] + && [uniqueContacts objectForKey: mail] == nil + && !(excludeGroups && [contact objectForKey: @"isGroup"])) + [uniqueContacts setObject: contact forKey: mail]; + } + } + if ([uniqueContacts count] > 0) + { + // Sort the contacts by display name + commonNameDescriptor = [[NSSortDescriptor alloc] initWithKey: @"c_cn" + ascending:YES]; + descriptors = [NSArray arrayWithObjects: commonNameDescriptor, nil]; + [commonNameDescriptor release]; + sortedContacts = [[uniqueContacts allValues] + sortedArrayUsingDescriptors: descriptors]; + } + else + sortedContacts = [NSArray array]; + + return sortedContacts; +} + + @end diff --git a/SoObjects/Mailer/SOGoDraftObject.h b/SoObjects/Mailer/SOGoDraftObject.h index 94c5d2888..4004d32a9 100644 --- a/SoObjects/Mailer/SOGoDraftObject.h +++ b/SoObjects/Mailer/SOGoDraftObject.h @@ -102,6 +102,8 @@ - (NSData *) mimeMessageAsData; /* operations */ +- (NSArray *) allRecipients; +- (NSArray *) allBareRecipients; - (NSException *) delete; - (NSException *) sendMail; diff --git a/SoObjects/Mailer/SOGoDraftObject.m b/SoObjects/Mailer/SOGoDraftObject.m index bd5a0d469..9c6b0a120 100644 --- a/SoObjects/Mailer/SOGoDraftObject.m +++ b/SoObjects/Mailer/SOGoDraftObject.m @@ -45,6 +45,7 @@ #import #import #import +#import #import #import #import @@ -63,6 +64,11 @@ #import #import +#import + +#import +#import + #import "NSData+Mail.h" #import "NSString+Mail.h" #import "SOGoMailAccount.h" @@ -1660,7 +1666,7 @@ static NSString *userAgent = nil; { recipients = [headers objectForKey: fieldNames[count]]; if ([recipients count] > 0) - [allRecipients addObjectsFromArray: recipients]; + [allRecipients addObjectsFromArray: recipients]; } return allRecipients; @@ -1689,6 +1695,71 @@ static NSString *userAgent = nil; // - (NSException *) sendMail { + SOGoUserDefaults *ud; + ud = [[context activeUser] userDefaults]; + + if ([ud mailAddOutgoingAddresses]) { + NSMutableArray *recipients; + SOGoMailAccounts *folder; + NGMailAddressParser *parser; + SOGoContactFolders *contactFolders; + NSArray *contacts; + NSString *address, *mail, *name; + int i; + id parsedAddress; + + contactFolders = [[[context activeUser] homeFolderInContext: context] + lookupName: @"Contacts" + inContext: context + acquire: NO]; + + recipients = [self allRecipients]; + + for (i = 0; i < [recipients count]; i++) + { + // The address contains a string. ex: "John Doe " + address = [recipients objectAtIndex: i]; + + parser = [NGMailAddressParser mailAddressParserWithString: address]; + parsedAddress = [parser parse]; + + mail = [parsedAddress address]; + name = [parsedAddress displayName]; + + contacts = [contactFolders allContactsFromFilter: mail + excludeGroups: YES + excludeLists: YES]; + + // If we don't get any results from the autocompletion code, we add it.. + if ([contacts count] == 0) + { + SOGoContactFolder *folder; + Class c; + SOGoContactGCSEntry *contact; + NSString *uid; + NGVCard *card; + + /* Here I want the selected address book on the preferences. */ + NSString *addressBook; + addressBook = [ud selectedAddressBook]; + + folder = [contactFolders lookupName: addressBook inContext: context acquire: NO]; + uid = [folder globallyUniqueObjectId]; + + card = [NGVCard cardWithUid: uid]; + [card addEmail: mail types: nil]; + + c = NSClassFromString(@"SOGoContactGCSEntry"); + contact = [c objectWithName: uid + inContainer: folder]; + [contact setIsNew: YES]; + + [contact saveContentString: [card versitString]]; + + } + } + } + return [self sendMailAndCopyToSent: YES]; } diff --git a/SoObjects/SOGo/SOGoDefaults.plist b/SoObjects/SOGo/SOGoDefaults.plist index f9bb2fef0..5f13a4a70 100644 --- a/SoObjects/SOGo/SOGoDefaults.plist +++ b/SoObjects/SOGo/SOGoDefaults.plist @@ -52,6 +52,7 @@ SOGoIMAPServer = "localhost"; SOGoMailDomain = "localhost"; + SOGoSelectedAddressBook = "collected"; SOGoMailMessageCheck = "manually"; SOGoMailMessageForwarding = "inline"; SOGoMailReplyPlacement = "below"; diff --git a/SoObjects/SOGo/SOGoParentFolder.m b/SoObjects/SOGo/SOGoParentFolder.m index da5a1c5b5..330a186eb 100644 --- a/SoObjects/SOGo/SOGoParentFolder.m +++ b/SoObjects/SOGo/SOGoParentFolder.m @@ -221,20 +221,17 @@ static SoSecurityManager *sm = nil; NSException *error; cm = [GCSChannelManager defaultChannelManager]; - folderLocation - = [[GCSFolderManager defaultFolderManager] folderInfoLocation]; + folderLocation = [[GCSFolderManager defaultFolderManager] folderInfoLocation]; fc = [cm acquireOpenChannelForURL: folderLocation]; if ([fc isOpen]) { gcsFolderType = [[self class] gcsFolderType]; - sql - = [NSString stringWithFormat: (@"SELECT c_path4 FROM %@" - @" WHERE c_path2 = '%@'" - @" AND c_folder_type = '%@'"), - [folderLocation gcsTableName], - owner, - gcsFolderType]; + sql = [NSString stringWithFormat: (@"SELECT c_path4 FROM %@" + @" WHERE c_path2 = '%@'" + @" AND c_folder_type = '%@'"), + [folderLocation gcsTableName], owner, gcsFolderType]; + error = [self _fetchPersonalFolders: sql withChannel: fc]; [cm releaseChannel: fc]; // sql = [sql stringByAppendingFormat:@" WHERE %@ = '%@'", @@ -248,6 +245,7 @@ static SoSecurityManager *sm = nil; return error; } + - (NSException *) appendSystemSources { return nil; @@ -386,14 +384,17 @@ static SoSecurityManager *sm = nil; if (!subFolders) { subFolders = [NSMutableDictionary new]; - error = [self appendPersonalSources]; + error = [self appendPersonalSources]; if (!error) - error = [self appendSystemSources]; + if ([self respondsToSelector:@selector(appendCollectedSources)]) + error = [self appendCollectedSources]; + if (!error) + error = [self appendSystemSources]; // TODO : Not really a testcase, see function if (error) - { - [subFolders release]; - subFolders = nil; - } + { + [subFolders release]; + subFolders = nil; + } } else error = nil; diff --git a/SoObjects/SOGo/SOGoUserDefaults.h b/SoObjects/SOGo/SOGoUserDefaults.h index 83d6c18bb..b8df5621b 100644 --- a/SoObjects/SOGo/SOGoUserDefaults.h +++ b/SoObjects/SOGo/SOGoUserDefaults.h @@ -87,6 +87,9 @@ extern NSString *SOGoWeekStartFirstFullWeek; - (NSString *) language; /* mail */ +- (void) setMailAddOutgoingAddresses: (BOOL) newValue; +- (BOOL) mailAddOutgoingAddresses; + - (void) setMailShowSubscribedFoldersOnly: (BOOL) newValue; - (BOOL) mailShowSubscribedFoldersOnly; @@ -111,6 +114,9 @@ extern NSString *SOGoWeekStartFirstFullWeek; - (void) setMailListViewColumnsOrder: (NSArray *) newValue; - (NSArray *) mailListViewColumnsOrder; +- (void) setSelectedAddressBook: (NSString *) newValue; +- (NSString *) selectedAddressBook; + - (void) setMailMessageCheck: (NSString *) newValue; - (NSString *) mailMessageCheck; diff --git a/SoObjects/SOGo/SOGoUserDefaults.m b/SoObjects/SOGo/SOGoUserDefaults.m index b862c5523..d6d1c3999 100644 --- a/SoObjects/SOGo/SOGoUserDefaults.m +++ b/SoObjects/SOGo/SOGoUserDefaults.m @@ -185,8 +185,8 @@ NSString *SOGoWeekStartFirstFullWeek = @"FirstFullWeek"; { migratedKeys = [NSDictionary dictionaryWithObjectsAndKeys: - @"SOGoLoginModule", @"SOGoUIxDefaultModule", - @"SOGoLoginModule", @"SOGoDefaultModule", + @"SOGoLoginModule", @"SOGoUIxDefaultModule", + @"SOGoLoginModule", @"SOGoDefaultModule", @"SOGoTimeFormat", @"TimeFormat", @"SOGoShortDateFormat", @"ShortDateFormat", @"SOGoLongDateFormat", @"LongDateFormat", @@ -197,6 +197,7 @@ NSString *SOGoWeekStartFirstFullWeek = @"FirstFullWeek"; @"SOGoLanguage", @"SOGoDefaultLanguage", @"SOGoLanguage", @"Language", @"SOGoMailComposeMessageType", @"ComposeMessagesType", + @"SOGoSelectedAddressBook", @"SelectedAddressBook", @"SOGoMailMessageCheck", @"MessageCheck", @"SOGoMailMessageForwarding", @"MessageForwarding", @"SOGoMailSignature", @"MailSignature", @@ -384,6 +385,16 @@ NSString *SOGoWeekStartFirstFullWeek = @"FirstFullWeek"; return userLanguage; } +- (void) setMailAddOutgoingAddresses: (BOOL) newValue +{ + [self setBool: newValue forKey: @"SOGoMailAddOutgoingAddresses"]; +} + +- (BOOL) mailAddOutgoingAddresses +{ + return [self boolForKey: @"SOGoMailAddOutgoingAddresses"]; +} + - (void) setMailShowSubscribedFoldersOnly: (BOOL) newValue { [self setBool: newValue forKey: @"SOGoMailShowSubscribedFoldersOnly"]; @@ -467,6 +478,16 @@ NSString *SOGoWeekStartFirstFullWeek = @"FirstFullWeek"; return [self stringArrayForKey: @"SOGoMailListViewColumnsOrder"]; } +- (void) setSelectedAddressBook:(NSString *) newValue +{ + [self setObject: newValue forKey: @"SOGoSelectedAddressBook"]; +} + +- (NSString *) selectedAddressBook +{ + return [self stringForKey: @"SOGoSelectedAddressBook"]; +} + - (void) setMailMessageCheck: (NSString *) newValue { [self setObject: newValue forKey: @"SOGoMailMessageCheck"]; diff --git a/UI/Contacts/UIxContactFoldersView.m b/UI/Contacts/UIxContactFoldersView.m index f38a3532f..aaf35d6c2 100644 --- a/UI/Contacts/UIxContactFoldersView.m +++ b/UI/Contacts/UIxContactFoldersView.m @@ -158,88 +158,23 @@ Class SOGoContactSourceFolderK, SOGoGCSFolderK; - (id ) allContactSearchAction { id result; - SOGoFolder *folder; - NSString *searchText, *mail, *domain; + NSString *searchText; NSDictionary *data; - NSArray *folders, *contacts, *descriptors, *sortedContacts; - NSMutableArray *sortedFolders; - NSMutableDictionary *contact, *uniqueContacts; - unsigned int i, j, max; - NSSortDescriptor *commonNameDescriptor; + NSArray *sortedContacts; + BOOL excludeGroups, excludeLists; searchText = [self queryParameterForKey: @"search"]; if ([searchText length] > 0) { - // NSLog(@"Search all contacts: %@", searchText); excludeGroups = [[self queryParameterForKey: @"excludeGroups"] boolValue]; excludeLists = [[self queryParameterForKey: @"excludeLists"] boolValue]; - domain = [[context activeUser] domain]; - folders = nil; - NS_DURING - folders = [[self clientObject] subFolders]; - NS_HANDLER - /* We need to specifically test for @"SOGoDBException", which is - raised explicitly in SOGoParentFolder. Any other exception should - be re-raised. */ - if ([[localException name] isEqualToString: @"SOGoDBException"]) - folders = nil; - else - [localException raise]; - NS_ENDHANDLER; - max = [folders count]; - sortedFolders = [NSMutableArray arrayWithCapacity: max]; - uniqueContacts = [NSMutableDictionary dictionary]; - for (i = 0; i < max; i++) - { - folder = [folders objectAtIndex: i]; - /* We first search in LDAP folders (in case of duplicated entries in GCS folders) */ - if ([folder isKindOfClass: SOGoContactSourceFolderK]) - [sortedFolders insertObject: folder atIndex: 0]; - else - [sortedFolders addObject: folder]; - } - for (i = 0; i < max; i++) - { - folder = [sortedFolders objectAtIndex: i]; - //NSLog(@" Address book: %@ (%@)", [folder displayName], [folder class]); - contacts = [folder lookupContactsWithFilter: searchText - onCriteria: @"name_or_address" - sortBy: @"c_cn" - ordering: NSOrderedAscending - inDomain: domain]; - for (j = 0; j < [contacts count]; j++) - { - contact = [contacts objectAtIndex: j]; - mail = [contact objectForKey: @"c_mail"]; - //NSLog(@" found %@ (%@) ? %@", [contact objectForKey: @"c_name"], mail, - // [contact description]); - if (!excludeLists && [[contact objectForKey: @"c_component"] - isEqualToString: @"vlist"]) - { - [contact setObject: [folder nameInContainer] - forKey: @"container"]; - [uniqueContacts setObject: contact - forKey: [contact objectForKey: @"c_name"]]; - } - else if ([mail length] - && [uniqueContacts objectForKey: mail] == nil - && !(excludeGroups && [contact objectForKey: @"isGroup"])) - [uniqueContacts setObject: contact forKey: mail]; - } - } - if ([uniqueContacts count] > 0) - { - // Sort the contacts by display name - commonNameDescriptor = [[NSSortDescriptor alloc] initWithKey: @"c_cn" - ascending:YES]; - descriptors = [NSArray arrayWithObjects: commonNameDescriptor, nil]; - [commonNameDescriptor release]; - sortedContacts = [[uniqueContacts allValues] - sortedArrayUsingDescriptors: descriptors]; - } - else - sortedContacts = [NSArray array]; + + sortedContacts = [[self clientObject] allContactsFromFilter: searchText + excludeGroups: excludeGroups + excludeLists: excludeLists]; + + data = [NSDictionary dictionaryWithObjectsAndKeys: searchText, @"searchText", sortedContacts, @"contacts", nil]; diff --git a/UI/PreferencesUI/English.lproj/Localizable.strings b/UI/PreferencesUI/English.lproj/Localizable.strings index afa832c3e..cc5afde74 100644 --- a/UI/PreferencesUI/English.lproj/Localizable.strings +++ b/UI/PreferencesUI/English.lproj/Localizable.strings @@ -139,6 +139,8 @@ "messagecheck_every_20_minutes" = "Every 20 minutes"; "messagecheck_every_30_minutes" = "Every 30 minutes"; "messagecheck_once_per_hour" = "Once per hour"; +"PersonalAddressBook" = "Personal address book"; +"CollectedAddressBook" = "Collected addresses"; "Forward messages:" = "Forward messages:"; "messageforward_inline" = "Inline"; diff --git a/UI/PreferencesUI/UIxPreferences.m b/UI/PreferencesUI/UIxPreferences.m index 7ba612cac..92a813061 100644 --- a/UI/PreferencesUI/UIxPreferences.m +++ b/UI/PreferencesUI/UIxPreferences.m @@ -50,6 +50,8 @@ #import #import +#import + #import "UIxPreferences.h" #warning this class is not finished @@ -656,6 +658,16 @@ static NSArray *reminderValues = nil; } /* Mailer */ +- (void) setAddOutgoingAddresses: (BOOL) addOutgoingAddresses +{ + [userDefaults setMailAddOutgoingAddresses: addOutgoingAddresses]; +} + +- (BOOL) addOutgoingAddresses +{ + return [userDefaults mailAddOutgoingAddresses]; +} + - (void) setShowSubscribedFoldersOnly: (BOOL) showSubscribedFoldersOnly { [userDefaults setMailShowSubscribedFoldersOnly: showSubscribedFoldersOnly]; @@ -676,6 +688,58 @@ static NSArray *reminderValues = nil; return [userDefaults mailSortByThreads]; } +- (NSArray *) addressBookList +{ + /* We want all the SourceIDS */ + NSMutableArray *folders; + NSMutableArray *contactFolders; + + contactFolders = [[[context activeUser] homeFolderInContext: context] + lookupName: @"Contacts" + inContext: context + acquire: NO]; + + folders = [NSMutableArray arrayWithArray: [contactFolders subFolders]]; + + int i, count; + + count = [folders count]-1; + + // Inside this loop we remove all the public or shared addressbooks + for (count; count >= 0; count--) + { + if (![[folders objectAtIndex: count] isKindOfClass: [SOGoContactGCSFolder class]]) + [folders removeObjectAtIndex: count]; + } + + // Parse the objects in order to have only the displayName of the addressbooks to be displayed on the preferences interface + NSMutableArray *availableAddressBooks = [NSMutableArray new]; + NSMutableArray *availableAddressBooksName = [NSMutableArray new]; + + count = [folders count]-1; + for (i=0; i <= count ; i++) { + [availableAddressBooks addObject:[[folders objectAtIndex:i] realNameInContainer]]; + [availableAddressBooksName addObject:[[folders objectAtIndex:i] displayName]]; + } + + return availableAddressBooks; + +} +- (NSString *) itemAddressBookText +{ + return [self labelForKey:[NSString stringWithFormat: item]]; +} + +- (NSString *) userAddressBook +{ + return [userDefaults selectedAddressBook]; +} + +- (void) setUserAddressBook: (NSString *) newSelectedAddressBook +{ + [userDefaults setSelectedAddressBook: newSelectedAddressBook]; +} + - (NSArray *) messageCheckList { NSArray *intervalsList; diff --git a/UI/Templates/PreferencesUI/UIxPreferences.wox b/UI/Templates/PreferencesUI/UIxPreferences.wox index 66f69b6a9..4c2a85f71 100644 --- a/UI/Templates/PreferencesUI/UIxPreferences.wox +++ b/UI/Templates/PreferencesUI/UIxPreferences.wox @@ -294,6 +294,16 @@ const:id="sortByThreads" var:checked="sortByThreads" /> +
+ +
+
Date: Mon, 24 Mar 2014 13:55:52 -0400 Subject: [PATCH 013/144] Modified the displayed name of SOGo version and added the label in the .lproj --- UI/PreferencesUI/English.lproj/Localizable.strings | 1 + UI/Templates/PreferencesUI/UIxPreferences.wox | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/UI/PreferencesUI/English.lproj/Localizable.strings b/UI/PreferencesUI/English.lproj/Localizable.strings index afa832c3e..c9156d9d6 100644 --- a/UI/PreferencesUI/English.lproj/Localizable.strings +++ b/UI/PreferencesUI/English.lproj/Localizable.strings @@ -204,6 +204,7 @@ "Mail" = "Mail"; "Last" = "Last used"; "Default module :" = "Default module:"; +"SOGo version:" ="SOGo version:"; "Language :" = "Language:"; "choose" = "Choose ..."; diff --git a/UI/Templates/PreferencesUI/UIxPreferences.wox b/UI/Templates/PreferencesUI/UIxPreferences.wox index 21ccf63ed..f626accb2 100644 --- a/UI/Templates/PreferencesUI/UIxPreferences.wox +++ b/UI/Templates/PreferencesUI/UIxPreferences.wox @@ -124,7 +124,7 @@
-
+
Date: Tue, 25 Mar 2014 14:53:42 -0400 Subject: [PATCH 014/144] Added the modifications specified by extrafu --- SoObjects/Contacts/SOGoContactFolders.h | 2 - SoObjects/Contacts/SOGoContactFolders.m | 73 ++------------ SoObjects/Mailer/SOGoDraftObject.m | 73 ++++++-------- SoObjects/SOGo/SOGoConstants.h | 6 ++ SoObjects/SOGo/SOGoParentFolder.h | 1 + SoObjects/SOGo/SOGoParentFolder.m | 98 ++++++++++++------- .../English.lproj/Localizable.strings | 4 +- UI/PreferencesUI/UIxPreferences.m | 41 +++++--- 8 files changed, 137 insertions(+), 161 deletions(-) diff --git a/SoObjects/Contacts/SOGoContactFolders.h b/SoObjects/Contacts/SOGoContactFolders.h index 584fab024..79f12e217 100644 --- a/SoObjects/Contacts/SOGoContactFolders.h +++ b/SoObjects/Contacts/SOGoContactFolders.h @@ -26,9 +26,7 @@ @interface SOGoContactFolders : SOGoParentFolder - (NSString *) defaultFolderName; -- (NSString *) collectedFolderName; -- (NSException *) appendCollectedSources; - (NSException *) renameLDAPAddressBook: (NSString *) sourceID withDisplayName: (NSString *) newDisplayName; - (NSException *) removeLDAPAddressBook: (NSString *) sourceID; diff --git a/SoObjects/Contacts/SOGoContactFolders.m b/SoObjects/Contacts/SOGoContactFolders.m index 183d47e32..dfb91f45c 100644 --- a/SoObjects/Contacts/SOGoContactFolders.m +++ b/SoObjects/Contacts/SOGoContactFolders.m @@ -123,60 +123,6 @@ Class SOGoContactSourceFolderK; return result; } -- (void) _createCollectedFolder -{ - NSArray *roles; - SOGoGCSFolder *folder; - SOGoUser *folderOwner; - - roles = [[context activeUser] rolesForObject: self inContext: context]; - folderOwner = [SOGoUser userWithLogin: [self ownerInContext: context]]; - - if (folderOwner && [folderOwner isResource]) - { - folder = [subFolderClass objectWithName: @"collected" inContainer: self]; - [folder setDisplayName: [self collectedFolderName]]; - [folder setOCSPath: [NSString stringWithFormat: @"%@/collected", OCSPath]]; - if ([folder create]) - [subFolders setObject: folder forKey: @"collected"]; - } -} - -- (NSException *) _fetchCollectedFolders: (NSString *) sql - withChannel: (EOAdaptorChannel *) fc -{ - NSArray *attrs; - NSDictionary *row; - SOGoGCSFolder *folder; - NSString *key; - NSException *error; - - if (!subFolderClass) - subFolderClass = [[self class] subFolderClass]; - - error = [fc evaluateExpressionX: sql]; - if (!error) - { - attrs = [fc describeResults: NO]; - while ((row = [fc fetchAttributes: attrs withZone: NULL])) - { - key = [row objectForKey: @"c_path4"]; - if ([key isKindOfClass: [NSString class]]) - { - folder = [subFolderClass objectWithName: key inContainer: self]; - [folder setOCSPath: [NSString stringWithFormat: @"%@/%@", - OCSPath, key]]; - [subFolders setObject: folder forKey: key]; - } - } - - if (![subFolders objectForKey: @"collected"]) - [self _createCollectedFolder]; - } - - return error; -} - - (NSException *) appendCollectedSources { GCSChannelManager *cm; @@ -195,16 +141,16 @@ Class SOGoContactSourceFolderK; sql = [NSString stringWithFormat: (@"SELECT c_path4 FROM %@" @" WHERE c_path2 = '%@'" @" AND c_folder_type = '%@'"), - [folderLocation gcsTableName], - owner, - gcsFolderType]; - error = [self _fetchCollectedFolders: sql withChannel: fc]; + [folderLocation gcsTableName], owner, gcsFolderType]; + + error = [super fetchSpecialFolders: sql withChannel: fc andFolderType: SOGoCollectedFolder]; + [cm releaseChannel: fc]; } else - error = [NSException exceptionWithName: @"SOGoDBException" - reason: @"database connection could not be open" - userInfo: nil]; + error = [NSException exceptionWithName: @"SOGoDBException" + reason: @"database connection could not be open" + userInfo: nil]; return error; } @@ -349,11 +295,6 @@ Class SOGoContactSourceFolderK; return [self labelForKey: @"Personal Address Book"]; } -- (NSString *) collectedFolderName -{ - return [self labelForKey: @"Collected Address Book"]; -} - - (NSArray *) toManyRelationshipKeys { NSMutableArray *keys; diff --git a/SoObjects/Mailer/SOGoDraftObject.m b/SoObjects/Mailer/SOGoDraftObject.m index 9c6b0a120..203d390c5 100644 --- a/SoObjects/Mailer/SOGoDraftObject.m +++ b/SoObjects/Mailer/SOGoDraftObject.m @@ -1698,68 +1698,59 @@ static NSString *userAgent = nil; SOGoUserDefaults *ud; ud = [[context activeUser] userDefaults]; - if ([ud mailAddOutgoingAddresses]) { - NSMutableArray *recipients; - SOGoMailAccounts *folder; - NGMailAddressParser *parser; + if ([ud mailAddOutgoingAddresses]) + { SOGoContactFolders *contactFolders; - NSArray *contacts; - NSString *address, *mail, *name; + NGMailAddressParser *parser; + id parsedRecipient; + SOGoContactFolder *folder; + SOGoContactGCSEntry *newContact; + NGVCard *card; + Class contactGCSEntry; + NSMutableArray *recipients; + NSString *recipient, *emailAddress, *displayName, *addressBook, *uid; + NSArray *matchingContacts; int i; - id parsedAddress; + // Get all the addressbooks contactFolders = [[[context activeUser] homeFolderInContext: context] - lookupName: @"Contacts" - inContext: context - acquire: NO]; - + lookupName: @"Contacts" + inContext: context + acquire: NO]; + // Get all the recipients from the current email recipients = [self allRecipients]; - for (i = 0; i < [recipients count]; i++) { // The address contains a string. ex: "John Doe " - address = [recipients objectAtIndex: i]; + recipient = [recipients objectAtIndex: i]; + parser = [NGMailAddressParser mailAddressParserWithString: recipient]; + parsedRecipient = [parser parse]; + emailAddress = [parsedRecipient address]; + displayName = [parsedRecipient displayName]; - parser = [NGMailAddressParser mailAddressParserWithString: address]; - parsedAddress = [parser parse]; - - mail = [parsedAddress address]; - name = [parsedAddress displayName]; - - contacts = [contactFolders allContactsFromFilter: mail - excludeGroups: YES - excludeLists: YES]; + matchingContacts = [contactFolders allContactsFromFilter: emailAddress + excludeGroups: YES + excludeLists: YES]; // If we don't get any results from the autocompletion code, we add it.. - if ([contacts count] == 0) + if ([matchingContacts count] == 0) { - SOGoContactFolder *folder; - Class c; - SOGoContactGCSEntry *contact; - NSString *uid; - NGVCard *card; - - /* Here I want the selected address book on the preferences. */ - NSString *addressBook; + /* Get the selected addressbook from the user preferences where the new address will be added */ addressBook = [ud selectedAddressBook]; - folder = [contactFolders lookupName: addressBook inContext: context acquire: NO]; uid = [folder globallyUniqueObjectId]; card = [NGVCard cardWithUid: uid]; - [card addEmail: mail types: nil]; + [card addEmail: emailAddress types: nil]; - c = NSClassFromString(@"SOGoContactGCSEntry"); - contact = [c objectWithName: uid - inContainer: folder]; - [contact setIsNew: YES]; - - [contact saveContentString: [card versitString]]; - + contactGCSEntry = NSClassFromString(@"SOGoContactGCSEntry"); + newContact = [contactGCSEntry objectWithName: uid + inContainer: folder]; + [newContact setIsNew: YES]; + [newContact saveContentString: [card versitString]]; } } } - return [self sendMailAndCopyToSent: YES]; } diff --git a/SoObjects/SOGo/SOGoConstants.h b/SoObjects/SOGo/SOGoConstants.h index 433760346..830d2bea4 100644 --- a/SoObjects/SOGo/SOGoConstants.h +++ b/SoObjects/SOGo/SOGoConstants.h @@ -51,4 +51,10 @@ typedef enum EventUpdated = 2, } SOGoEventOperation; +typedef enum +{ + SOGoPersonalFolder = 0, + SOGoCollectedFolder = 1, +} SOGoFolderType; + #endif /* _SOGOCONSTANTS_H_ */ diff --git a/SoObjects/SOGo/SOGoParentFolder.h b/SoObjects/SOGo/SOGoParentFolder.h index 0413faafd..ce7504428 100644 --- a/SoObjects/SOGo/SOGoParentFolder.h +++ b/SoObjects/SOGo/SOGoParentFolder.h @@ -22,6 +22,7 @@ #define SOGOPARENTFOLDERS_H #import "SOGoFolder.h" +#import "SOGoConstants.h" @class NSMutableDictionary; @class NSString; diff --git a/SoObjects/SOGo/SOGoParentFolder.m b/SoObjects/SOGo/SOGoParentFolder.m index 330a186eb..2d900396b 100644 --- a/SoObjects/SOGo/SOGoParentFolder.m +++ b/SoObjects/SOGo/SOGoParentFolder.m @@ -153,9 +153,15 @@ static SoSecurityManager *sm = nil; return @"Personal"; } -- (void) _createPersonalFolder +- (NSString *) collectedFolderName +{ + return @"Collected"; +} + +- (void) createSpecialFolder: (SOGoFolderType) folderType { NSArray *roles; + NSString *folderName; SOGoGCSFolder *folder; SOGoUser *folderOwner; @@ -165,20 +171,32 @@ static SoSecurityManager *sm = nil; // We autocreate the calendars if the user is the owner, a superuser or // if it's a resource as we won't necessarily want to login as a resource // in order to create its database tables. + // FolderType is an Enum where 0 = Personal and 1 = collected if ([roles containsObject: SoRole_Owner] || (folderOwner && [folderOwner isResource])) { - folder = [subFolderClass objectWithName: @"personal" inContainer: self]; - [folder setDisplayName: [self defaultFolderName]]; - [folder - setOCSPath: [NSString stringWithFormat: @"%@/personal", OCSPath]]; + folder = [subFolderClass objectWithName: folderName inContainer: self]; + if (folderType == 0) + { + folderName = @"personal"; + [folder setDisplayName: [self defaultFolderName]]; + } + else if (folderType == 1) + { + folderName = @"Collected Address Book"; + [folder setDisplayName: [self collectedFolderName]]; + } + + [folder setOCSPath: [NSString stringWithFormat: @"%@/%@", OCSPath, folderName]]; + if ([folder create]) - [subFolders setObject: folder forKey: @"personal"]; + [subFolders setObject: folder forKey: folderName]; } } -- (NSException *) _fetchPersonalFolders: (NSString *) sql - withChannel: (EOAdaptorChannel *) fc +- (NSException *) fetchSpecialFolders: (NSString *) sql + withChannel: (EOAdaptorChannel *) fc + andFolderType: (SOGoFolderType) folderType { NSArray *attrs; NSDictionary *row; @@ -191,24 +209,29 @@ static SoSecurityManager *sm = nil; error = [fc evaluateExpressionX: sql]; if (!error) + { + attrs = [fc describeResults: NO]; + while ((row = [fc fetchAttributes: attrs withZone: NULL])) { - attrs = [fc describeResults: NO]; - while ((row = [fc fetchAttributes: attrs withZone: NULL])) - { - key = [row objectForKey: @"c_path4"]; - if ([key isKindOfClass: [NSString class]]) - { - folder = [subFolderClass objectWithName: key inContainer: self]; - [folder setOCSPath: [NSString stringWithFormat: @"%@/%@", - OCSPath, key]]; - [subFolders setObject: folder forKey: key]; - } - } - - if (![subFolders objectForKey: @"personal"]) - [self _createPersonalFolder]; + key = [row objectForKey: @"c_path4"]; + if ([key isKindOfClass: [NSString class]]) + { + folder = [subFolderClass objectWithName: key inContainer: self]; + [folder setOCSPath: [NSString stringWithFormat: @"%@/%@", OCSPath, key]]; + [subFolders setObject: folder forKey: key]; + } } - + if (folderType == 0) + { + if (![subFolders objectForKey: @"personal"]) + [self createSpecialFolder: SOGoPersonalFolder]; + } + else if (folderType == 1) + { + if (![subFolders objectForKey: @"collected"]) + [self createSpecialFolder: SOGoCollectedFolder]; + } + } return error; } @@ -224,19 +247,18 @@ static SoSecurityManager *sm = nil; folderLocation = [[GCSFolderManager defaultFolderManager] folderInfoLocation]; fc = [cm acquireOpenChannelForURL: folderLocation]; if ([fc isOpen]) - { - gcsFolderType = [[self class] gcsFolderType]; - - sql = [NSString stringWithFormat: (@"SELECT c_path4 FROM %@" - @" WHERE c_path2 = '%@'" - @" AND c_folder_type = '%@'"), - [folderLocation gcsTableName], owner, gcsFolderType]; - - error = [self _fetchPersonalFolders: sql withChannel: fc]; - [cm releaseChannel: fc]; -// sql = [sql stringByAppendingFormat:@" WHERE %@ = '%@'", -// uidColumnName, [self uid]]; - } + { + gcsFolderType = [[self class] gcsFolderType]; + + sql = [NSString stringWithFormat: (@"SELECT c_path4 FROM %@" + @" WHERE c_path2 = '%@'" + @" AND c_folder_type = '%@'"), + [folderLocation gcsTableName], owner, gcsFolderType]; + + error = [self fetchSpecialFolders: sql withChannel: fc andFolderType: SOGoPersonalFolder]; + + [cm releaseChannel: fc]; + } else error = [NSException exceptionWithName: @"SOGoDBException" reason: @"database connection could not be open" @@ -384,7 +406,7 @@ static SoSecurityManager *sm = nil; if (!subFolders) { subFolders = [NSMutableDictionary new]; - error = [self appendPersonalSources]; + error = [self appendPersonalSources]; if (!error) if ([self respondsToSelector:@selector(appendCollectedSources)]) error = [self appendCollectedSources]; diff --git a/UI/PreferencesUI/English.lproj/Localizable.strings b/UI/PreferencesUI/English.lproj/Localizable.strings index cc5afde74..1bac4a169 100644 --- a/UI/PreferencesUI/English.lproj/Localizable.strings +++ b/UI/PreferencesUI/English.lproj/Localizable.strings @@ -139,8 +139,8 @@ "messagecheck_every_20_minutes" = "Every 20 minutes"; "messagecheck_every_30_minutes" = "Every 30 minutes"; "messagecheck_once_per_hour" = "Once per hour"; -"PersonalAddressBook" = "Personal address book"; -"CollectedAddressBook" = "Collected addresses"; +"personal" = "Personal addressbook"; +"collected" = "Collected addresses"; "Forward messages:" = "Forward messages:"; "messageforward_inline" = "Inline"; diff --git a/UI/PreferencesUI/UIxPreferences.m b/UI/PreferencesUI/UIxPreferences.m index 92a813061..a066fd1f5 100644 --- a/UI/PreferencesUI/UIxPreferences.m +++ b/UI/PreferencesUI/UIxPreferences.m @@ -691,18 +691,14 @@ static NSArray *reminderValues = nil; - (NSArray *) addressBookList { /* We want all the SourceIDS */ - NSMutableArray *folders; - NSMutableArray *contactFolders; + NSMutableArray *folders, *contactFolders, *availableAddressBooks; + int i, count; contactFolders = [[[context activeUser] homeFolderInContext: context] lookupName: @"Contacts" inContext: context acquire: NO]; - folders = [NSMutableArray arrayWithArray: [contactFolders subFolders]]; - - int i, count; - count = [folders count]-1; // Inside this loop we remove all the public or shared addressbooks @@ -713,21 +709,42 @@ static NSArray *reminderValues = nil; } // Parse the objects in order to have only the displayName of the addressbooks to be displayed on the preferences interface - NSMutableArray *availableAddressBooks = [NSMutableArray new]; - NSMutableArray *availableAddressBooksName = [NSMutableArray new]; - + availableAddressBooks = [[NSMutableArray alloc] initWithCapacity: [folders count]]; count = [folders count]-1; for (i=0; i <= count ; i++) { [availableAddressBooks addObject:[[folders objectAtIndex:i] realNameInContainer]]; - [availableAddressBooksName addObject:[[folders objectAtIndex:i] displayName]]; } return availableAddressBooks; - } - (NSString *) itemAddressBookText { - return [self labelForKey:[NSString stringWithFormat: item]]; + NSString *displayNameAddressBookItem, *test; + NSMutableArray *folders, *contactFolders; + int count, i; + + if ([item isEqualToString: @"personal"] || [item isEqualToString: @"collected"]) + displayNameAddressBookItem = [self labelForKey:[NSString stringWithFormat: item]]; + + else + { + contactFolders = [[[context activeUser] homeFolderInContext: context] + lookupName: @"Contacts" + inContext: context + acquire: NO]; + folders = [NSMutableArray arrayWithArray: [contactFolders subFolders]]; + count = [folders count]-1; + for (i=0; i <= count ; i++) + { + if ([item isEqualToString:[[folders objectAtIndex:i] realNameInContainer]]) + { + displayNameAddressBookItem = [[folders objectAtIndex:i] displayName]; + break; + }; + } + } + + return displayNameAddressBookItem; } - (NSString *) userAddressBook From 365e271a8458f26bf5101dddbfdfc3d28baf37fd Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Tue, 25 Mar 2014 15:44:28 -0400 Subject: [PATCH 015/144] Correct typo --- UI/PreferencesUI/English.lproj/Localizable.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UI/PreferencesUI/English.lproj/Localizable.strings b/UI/PreferencesUI/English.lproj/Localizable.strings index c9156d9d6..f53f19a21 100644 --- a/UI/PreferencesUI/English.lproj/Localizable.strings +++ b/UI/PreferencesUI/English.lproj/Localizable.strings @@ -204,7 +204,7 @@ "Mail" = "Mail"; "Last" = "Last used"; "Default module :" = "Default module:"; -"SOGo version:" ="SOGo version:"; +"SOGo version:" = "SOGo version:"; "Language :" = "Language:"; "choose" = "Choose ..."; From 1da1764aaec713a44a1e633db7e156cdb5ae5db1 Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Thu, 27 Mar 2014 15:27:48 -0400 Subject: [PATCH 016/144] The collected address book will be created only if the user select it in the preferences. Fix labels. --- .../Contacts/French.lproj/Localizable.strings | 1 + SoObjects/Contacts/SOGoContactFolders.h | 1 + SoObjects/Contacts/SOGoContactFolders.m | 7 ++- SoObjects/SOGo/SOGoParentFolder.h | 1 + SoObjects/SOGo/SOGoParentFolder.m | 21 ++++--- .../English.lproj/Localizable.strings | 9 +-- .../French.lproj/Localizable.strings | 4 ++ UI/PreferencesUI/UIxPreferences.h | 3 + UI/PreferencesUI/UIxPreferences.m | 59 ++++++++----------- 9 files changed, 59 insertions(+), 47 deletions(-) diff --git a/SoObjects/Contacts/French.lproj/Localizable.strings b/SoObjects/Contacts/French.lproj/Localizable.strings index af4d87c3a..8a5848a76 100644 --- a/SoObjects/Contacts/French.lproj/Localizable.strings +++ b/SoObjects/Contacts/French.lproj/Localizable.strings @@ -1 +1,2 @@ "Personal Address Book" = "Carnet d'adresses personnel"; +"Collected Address Book" = "Carnet d'adresses recueilli"; diff --git a/SoObjects/Contacts/SOGoContactFolders.h b/SoObjects/Contacts/SOGoContactFolders.h index 79f12e217..bb984f0b6 100644 --- a/SoObjects/Contacts/SOGoContactFolders.h +++ b/SoObjects/Contacts/SOGoContactFolders.h @@ -26,6 +26,7 @@ @interface SOGoContactFolders : SOGoParentFolder - (NSString *) defaultFolderName; +- (NSString *) collectedFolderName; - (NSException *) renameLDAPAddressBook: (NSString *) sourceID withDisplayName: (NSString *) newDisplayName; diff --git a/SoObjects/Contacts/SOGoContactFolders.m b/SoObjects/Contacts/SOGoContactFolders.m index dfb91f45c..b0428f7f4 100644 --- a/SoObjects/Contacts/SOGoContactFolders.m +++ b/SoObjects/Contacts/SOGoContactFolders.m @@ -268,7 +268,7 @@ Class SOGoContactSourceFolderK; SOGoUser *currentUser; id source; - if ([sourceID isEqualToString: @"personal"] || [sourceID isEqualToString: @"collected"]) + if ([sourceID isEqualToString: @"personal"]) result = [NSException exceptionWithHTTPStatus: 403 reason: (@"folder '%@' cannot be deleted", sourceID)]; else @@ -295,6 +295,11 @@ Class SOGoContactSourceFolderK; return [self labelForKey: @"Personal Address Book"]; } +- (NSString *) collectedFolderName +{ + return [self labelForKey: @"Collected Address Book"]; +} + - (NSArray *) toManyRelationshipKeys { NSMutableArray *keys; diff --git a/SoObjects/SOGo/SOGoParentFolder.h b/SoObjects/SOGo/SOGoParentFolder.h index ce7504428..323e71d61 100644 --- a/SoObjects/SOGo/SOGoParentFolder.h +++ b/SoObjects/SOGo/SOGoParentFolder.h @@ -40,6 +40,7 @@ + (Class) subFolderClass; - (NSString *) defaultFolderName; +- (NSString *) collectedFolderName; - (NSException *) appendPersonalSources; - (void) removeSubFolder: (NSString *) subfolderName; diff --git a/SoObjects/SOGo/SOGoParentFolder.m b/SoObjects/SOGo/SOGoParentFolder.m index 2d900396b..8d55adbb0 100644 --- a/SoObjects/SOGo/SOGoParentFolder.m +++ b/SoObjects/SOGo/SOGoParentFolder.m @@ -38,7 +38,7 @@ #import #import #import - +#import #import #import "NSObject+DAV.h" @@ -175,18 +175,18 @@ static SoSecurityManager *sm = nil; if ([roles containsObject: SoRole_Owner] || (folderOwner && [folderOwner isResource])) { - folder = [subFolderClass objectWithName: folderName inContainer: self]; - if (folderType == 0) + if (folderType == SOGoPersonalFolder) { folderName = @"personal"; + folder = [subFolderClass objectWithName: folderName inContainer: self]; [folder setDisplayName: [self defaultFolderName]]; } - else if (folderType == 1) + else if (folderType == SOGoCollectedFolder) { - folderName = @"Collected Address Book"; + folderName = @"collected"; + folder = [subFolderClass objectWithName: folderName inContainer: self]; [folder setDisplayName: [self collectedFolderName]]; } - [folder setOCSPath: [NSString stringWithFormat: @"%@/%@", OCSPath, folderName]]; if ([folder create]) @@ -203,6 +203,8 @@ static SoSecurityManager *sm = nil; SOGoGCSFolder *folder; NSString *key; NSException *error; + SOGoUserDefaults *ud; + ud = [[context activeUser] userDefaults]; if (!subFolderClass) subFolderClass = [[self class] subFolderClass]; @@ -221,15 +223,16 @@ static SoSecurityManager *sm = nil; [subFolders setObject: folder forKey: key]; } } - if (folderType == 0) + if (folderType == SOGoPersonalFolder) { if (![subFolders objectForKey: @"personal"]) [self createSpecialFolder: SOGoPersonalFolder]; } - else if (folderType == 1) + else if (folderType == SOGoCollectedFolder) { if (![subFolders objectForKey: @"collected"]) - [self createSpecialFolder: SOGoCollectedFolder]; + if ([[ud selectedAddressBook] isEqualToString:@"collected"]) + [self createSpecialFolder: SOGoCollectedFolder]; } } return error; diff --git a/UI/PreferencesUI/English.lproj/Localizable.strings b/UI/PreferencesUI/English.lproj/Localizable.strings index 1bac4a169..1f6649d26 100644 --- a/UI/PreferencesUI/English.lproj/Localizable.strings +++ b/UI/PreferencesUI/English.lproj/Localizable.strings @@ -97,8 +97,7 @@ "Show time as busy outside working hours" = "Show time as busy outside working hours"; "First week of year :" = "First week of year:"; "Enable reminders for Calendar items" = "Enable reminders for Calendar items"; -"Play a sound when a reminder comes due" -= "Play a sound when a reminder comes due"; +"Play a sound when a reminder comes due" = "Play a sound when a reminder comes due"; "Default reminder :" = "Default reminder:"; "firstWeekOfYear_January1" = "Starts on january 1"; @@ -139,8 +138,6 @@ "messagecheck_every_20_minutes" = "Every 20 minutes"; "messagecheck_every_30_minutes" = "Every 30 minutes"; "messagecheck_once_per_hour" = "Once per hour"; -"personal" = "Personal addressbook"; -"collected" = "Collected addresses"; "Forward messages:" = "Forward messages:"; "messageforward_inline" = "Inline"; @@ -159,6 +156,10 @@ "displayremoteinlineimages_never" = "Never"; "displayremoteinlineimages_always" = "Always"; +/* Contact */ +"Personal Address Book" = "Personal Address Book"; +"Collected Address Book" = "Collected Address Book"; + /* IMAP Accounts */ "New Mail Account" = "New Mail Account"; diff --git a/UI/PreferencesUI/French.lproj/Localizable.strings b/UI/PreferencesUI/French.lproj/Localizable.strings index b3d49aab2..b65a727f1 100644 --- a/UI/PreferencesUI/French.lproj/Localizable.strings +++ b/UI/PreferencesUI/French.lproj/Localizable.strings @@ -157,6 +157,10 @@ "displayremoteinlineimages_never" = "Jamais"; "displayremoteinlineimages_always" = "Toujours"; +/* Contact */ +"Personal Address Book" = "Carnet d'adresses personnel"; +"Collected Address Book" = "Carnet d'adresses recueilli"; + /* IMAP Accounts */ "New Mail Account" = "Nouveau compte"; diff --git a/UI/PreferencesUI/UIxPreferences.h b/UI/PreferencesUI/UIxPreferences.h index 3040e67ae..9c8a3483f 100644 --- a/UI/PreferencesUI/UIxPreferences.h +++ b/UI/PreferencesUI/UIxPreferences.h @@ -33,6 +33,9 @@ id item; SOGoUser *user; + // Addressbook + NSMutableDictionary *addressBooksIDWithDisplayName; + // Calendar categories NSString *category; NSArray *calendarCategories; diff --git a/UI/PreferencesUI/UIxPreferences.m b/UI/PreferencesUI/UIxPreferences.m index a066fd1f5..9e9adb1e2 100644 --- a/UI/PreferencesUI/UIxPreferences.m +++ b/UI/PreferencesUI/UIxPreferences.m @@ -116,6 +116,7 @@ static NSArray *reminderValues = nil; if ((self = [super init])) { item = nil; + addressBooksIDWithDisplayName = nil; #warning user should be the owner rather than the activeUser ASSIGN (user, [context activeUser]); ASSIGN (today, [NSCalendarDate date]); @@ -691,8 +692,9 @@ static NSArray *reminderValues = nil; - (NSArray *) addressBookList { /* We want all the SourceIDS */ - NSMutableArray *folders, *contactFolders, *availableAddressBooks; + NSMutableArray *folders, *contactFolders, *availableAddressBooksID, *availableAddressBooksName; int i, count; + BOOL collectedAlreadyExist; contactFolders = [[[context activeUser] homeFolderInContext: context] lookupName: @"Contacts" @@ -702,49 +704,40 @@ static NSArray *reminderValues = nil; count = [folders count]-1; // Inside this loop we remove all the public or shared addressbooks - for (count; count >= 0; count--) + for(count; count>=0; count--) { if (![[folders objectAtIndex: count] isKindOfClass: [SOGoContactGCSFolder class]]) [folders removeObjectAtIndex: count]; } // Parse the objects in order to have only the displayName of the addressbooks to be displayed on the preferences interface - availableAddressBooks = [[NSMutableArray alloc] initWithCapacity: [folders count]]; + availableAddressBooksID = [NSMutableArray arrayWithCapacity: [folders count]]; + availableAddressBooksName = [NSMutableArray arrayWithCapacity: [folders count]]; count = [folders count]-1; - for (i=0; i <= count ; i++) { - [availableAddressBooks addObject:[[folders objectAtIndex:i] realNameInContainer]]; - } + collectedAlreadyExist = false; - return availableAddressBooks; + for (i=0; i <= count ; i++) { + [availableAddressBooksID addObject:[[folders objectAtIndex:i] realNameInContainer]]; + [availableAddressBooksName addObject:[[folders objectAtIndex:i] displayName]]; + + if ([[availableAddressBooksID objectAtIndex:i] isEqualToString: @"collected"]) + collectedAlreadyExist = true; + } + // Create the dictionary for the next function : itemAddressBookText. + if (!addressBooksIDWithDisplayName) + addressBooksIDWithDisplayName = [NSMutableDictionary dictionaryWithObjects:availableAddressBooksName + forKeys:availableAddressBooksID]; + if (!collectedAlreadyExist) + { + [availableAddressBooksID addObject: @"collected"]; + [addressBooksIDWithDisplayName setObject: [self labelForKey: @"Collected Address Book"] forKey: @"collected"]; + } + + return availableAddressBooksID; } - (NSString *) itemAddressBookText { - NSString *displayNameAddressBookItem, *test; - NSMutableArray *folders, *contactFolders; - int count, i; - - if ([item isEqualToString: @"personal"] || [item isEqualToString: @"collected"]) - displayNameAddressBookItem = [self labelForKey:[NSString stringWithFormat: item]]; - - else - { - contactFolders = [[[context activeUser] homeFolderInContext: context] - lookupName: @"Contacts" - inContext: context - acquire: NO]; - folders = [NSMutableArray arrayWithArray: [contactFolders subFolders]]; - count = [folders count]-1; - for (i=0; i <= count ; i++) - { - if ([item isEqualToString:[[folders objectAtIndex:i] realNameInContainer]]) - { - displayNameAddressBookItem = [[folders objectAtIndex:i] displayName]; - break; - }; - } - } - - return displayNameAddressBookItem; + return [addressBooksIDWithDisplayName objectForKey: item]; } - (NSString *) userAddressBook From 03d5975be357b6cce4d74e90d4fb1069b9ff92ae Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Fri, 28 Mar 2014 10:28:33 -0400 Subject: [PATCH 017/144] Changed strings in french and change the instanciation of dictionary(addressBooksIDWithDisplayName) to release it manually --- .gitignore | 1 + SoObjects/Contacts/French.lproj/Localizable.strings | 2 +- UI/PreferencesUI/French.lproj/Localizable.strings | 2 +- UI/PreferencesUI/UIxPreferences.m | 7 ++++--- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 88becdaa6..16bc03de4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ config.make tags +*._* */obj/ */*/obj/ */*/*/obj/ diff --git a/SoObjects/Contacts/French.lproj/Localizable.strings b/SoObjects/Contacts/French.lproj/Localizable.strings index 8a5848a76..2b0358694 100644 --- a/SoObjects/Contacts/French.lproj/Localizable.strings +++ b/SoObjects/Contacts/French.lproj/Localizable.strings @@ -1,2 +1,2 @@ "Personal Address Book" = "Carnet d'adresses personnel"; -"Collected Address Book" = "Carnet d'adresses recueilli"; +"Collected Address Book" = "Carnet d'adresses collectés"; diff --git a/UI/PreferencesUI/French.lproj/Localizable.strings b/UI/PreferencesUI/French.lproj/Localizable.strings index b65a727f1..774199a7b 100644 --- a/UI/PreferencesUI/French.lproj/Localizable.strings +++ b/UI/PreferencesUI/French.lproj/Localizable.strings @@ -159,7 +159,7 @@ /* Contact */ "Personal Address Book" = "Carnet d'adresses personnel"; -"Collected Address Book" = "Carnet d'adresses recueilli"; +"Collected Address Book" = "Carnet d'adresses collectés"; /* IMAP Accounts */ "New Mail Account" = "Nouveau compte"; diff --git a/UI/PreferencesUI/UIxPreferences.m b/UI/PreferencesUI/UIxPreferences.m index 9e9adb1e2..02adf2ff6 100644 --- a/UI/PreferencesUI/UIxPreferences.m +++ b/UI/PreferencesUI/UIxPreferences.m @@ -177,6 +177,7 @@ static NSArray *reminderValues = nil; [contactsCategories release]; [forwardOptions release]; [daysOfWeek release]; + [addressBooksIDWithDisplayName release]; [super dealloc]; } @@ -704,7 +705,7 @@ static NSArray *reminderValues = nil; count = [folders count]-1; // Inside this loop we remove all the public or shared addressbooks - for(count; count>=0; count--) + for (count; count >= 0; count--) { if (![[folders objectAtIndex: count] isKindOfClass: [SOGoContactGCSFolder class]]) [folders removeObjectAtIndex: count]; @@ -725,8 +726,8 @@ static NSArray *reminderValues = nil; } // Create the dictionary for the next function : itemAddressBookText. if (!addressBooksIDWithDisplayName) - addressBooksIDWithDisplayName = [NSMutableDictionary dictionaryWithObjects:availableAddressBooksName - forKeys:availableAddressBooksID]; + addressBooksIDWithDisplayName = [[NSMutableDictionary alloc] initWithObjects:availableAddressBooksName + forKeys:availableAddressBooksID]; if (!collectedAlreadyExist) { [availableAddressBooksID addObject: @"collected"]; From f999c87d4d737ed69512bc4150daa85c361f3f47 Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Thu, 3 Apr 2014 17:09:00 -0400 Subject: [PATCH 018/144] added traduction in localstring french, added some specification in function sogoVersion --- .gitignore | 1 + UI/PreferencesUI/French.lproj/Localizable.strings | 1 + UI/PreferencesUI/UIxPreferences.m | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 88becdaa6..2b228461b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ config.make tags */obj/ +*._* */*/obj/ */*/*/obj/ */*/*.SOGo/ diff --git a/UI/PreferencesUI/French.lproj/Localizable.strings b/UI/PreferencesUI/French.lproj/Localizable.strings index b3d49aab2..0f0f55535 100644 --- a/UI/PreferencesUI/French.lproj/Localizable.strings +++ b/UI/PreferencesUI/French.lproj/Localizable.strings @@ -204,6 +204,7 @@ "Mail" = "Courrier"; "Last" = "Dernier utilisé"; "Default module :" = "Module par défaut :"; +"SOGo version:" = "SOGo version:"; "Language :" = "Langue :"; "choose" = "Choisir ..."; diff --git a/UI/PreferencesUI/UIxPreferences.m b/UI/PreferencesUI/UIxPreferences.m index e2da3249d..0320602d1 100644 --- a/UI/PreferencesUI/UIxPreferences.m +++ b/UI/PreferencesUI/UIxPreferences.m @@ -1140,12 +1140,12 @@ static NSArray *reminderValues = nil; - (NSString *) sogoVersion { + // The variable SOGoVersion comes from the import: SOGo/Build.h NSString *sogoVersion = [NSString stringWithString: SOGoVersion]; return sogoVersion; } - - (id ) defaultAction { id results; From 3eec753b7394d222ff0dcf782695ce10d354b978 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Fri, 4 Apr 2014 08:39:13 -0400 Subject: [PATCH 019/144] Slightly improved previous pull request merge. --- UI/PreferencesUI/English.lproj/Localizable.strings | 4 ++-- UI/PreferencesUI/French.lproj/Localizable.strings | 4 ++-- UI/PreferencesUI/UIxPreferences.m | 6 ++---- UI/Templates/PreferencesUI/UIxPreferences.wox | 2 +- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/UI/PreferencesUI/English.lproj/Localizable.strings b/UI/PreferencesUI/English.lproj/Localizable.strings index f53f19a21..834dc2554 100644 --- a/UI/PreferencesUI/English.lproj/Localizable.strings +++ b/UI/PreferencesUI/English.lproj/Localizable.strings @@ -204,7 +204,7 @@ "Mail" = "Mail"; "Last" = "Last used"; "Default module :" = "Default module:"; -"SOGo version:" = "SOGo version:"; +"SOGo version :" = "SOGo version :"; "Language :" = "Language:"; "choose" = "Choose ..."; @@ -307,4 +307,4 @@ "Unhandled policy error: %{0}" = "Unhandled policy error: %{0}"; "Unhandled error response" = "Unhandled error response"; "Password change is not supported." = "Password change is not supported."; -"Unhandled HTTP error code: %{0}" = "Unhandled HTTP error code: %{0}"; \ No newline at end of file +"Unhandled HTTP error code: %{0}" = "Unhandled HTTP error code: %{0}"; diff --git a/UI/PreferencesUI/French.lproj/Localizable.strings b/UI/PreferencesUI/French.lproj/Localizable.strings index 0f0f55535..ee6fa6bfc 100644 --- a/UI/PreferencesUI/French.lproj/Localizable.strings +++ b/UI/PreferencesUI/French.lproj/Localizable.strings @@ -204,7 +204,7 @@ "Mail" = "Courrier"; "Last" = "Dernier utilisé"; "Default module :" = "Module par défaut :"; -"SOGo version:" = "SOGo version:"; +"SOGo version :" = "SOGo version :"; "Language :" = "Langue :"; "choose" = "Choisir ..."; @@ -307,4 +307,4 @@ "Unhandled policy error: %{0}" = "Erreur inconnue pour le ppolicy: %{0}"; "Unhandled error response" = "Erreur inconnue"; "Password change is not supported." = "Changement de mot de passe non-supporté."; -"Unhandled HTTP error code: %{0}" = "Code HTTP non-géré: %{0}"; \ No newline at end of file +"Unhandled HTTP error code: %{0}" = "Code HTTP non-géré: %{0}"; diff --git a/UI/PreferencesUI/UIxPreferences.m b/UI/PreferencesUI/UIxPreferences.m index 70594b952..b888ab906 100644 --- a/UI/PreferencesUI/UIxPreferences.m +++ b/UI/PreferencesUI/UIxPreferences.m @@ -1,6 +1,6 @@ /* UIxPreferences.m - this file is part of SOGo * - * Copyright (C) 2007-2013 Inverse inc. + * Copyright (C) 2007-2014 Inverse inc. * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -1141,9 +1141,7 @@ static NSArray *reminderValues = nil; - (NSString *) sogoVersion { // The variable SOGoVersion comes from the import: SOGo/Build.h - NSString *sogoVersion = [NSString stringWithString: SOGoVersion]; - - return sogoVersion; + return [NSString stringWithString: SOGoVersion]; } - (id ) defaultAction diff --git a/UI/Templates/PreferencesUI/UIxPreferences.wox b/UI/Templates/PreferencesUI/UIxPreferences.wox index f626accb2..21ccf63ed 100644 --- a/UI/Templates/PreferencesUI/UIxPreferences.wox +++ b/UI/Templates/PreferencesUI/UIxPreferences.wox @@ -124,7 +124,7 @@
-
+
Date: Fri, 4 Apr 2014 08:44:50 -0400 Subject: [PATCH 020/144] Fixed previous commit --- UI/PreferencesUI/English.lproj/Localizable.strings | 2 +- UI/PreferencesUI/French.lproj/Localizable.strings | 2 +- UI/Templates/PreferencesUI/UIxPreferences.wox | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/UI/PreferencesUI/English.lproj/Localizable.strings b/UI/PreferencesUI/English.lproj/Localizable.strings index 834dc2554..8337f3e1e 100644 --- a/UI/PreferencesUI/English.lproj/Localizable.strings +++ b/UI/PreferencesUI/English.lproj/Localizable.strings @@ -204,7 +204,7 @@ "Mail" = "Mail"; "Last" = "Last used"; "Default module :" = "Default module:"; -"SOGo version :" = "SOGo version :"; +"SOGo version:" = "SOGo version:"; "Language :" = "Language:"; "choose" = "Choose ..."; diff --git a/UI/PreferencesUI/French.lproj/Localizable.strings b/UI/PreferencesUI/French.lproj/Localizable.strings index ee6fa6bfc..2470d9e10 100644 --- a/UI/PreferencesUI/French.lproj/Localizable.strings +++ b/UI/PreferencesUI/French.lproj/Localizable.strings @@ -204,7 +204,7 @@ "Mail" = "Courrier"; "Last" = "Dernier utilisé"; "Default module :" = "Module par défaut :"; -"SOGo version :" = "SOGo version :"; +"SOGo version:" = "SOGo version :"; "Language :" = "Langue :"; "choose" = "Choisir ..."; diff --git a/UI/Templates/PreferencesUI/UIxPreferences.wox b/UI/Templates/PreferencesUI/UIxPreferences.wox index 21ccf63ed..f626accb2 100644 --- a/UI/Templates/PreferencesUI/UIxPreferences.wox +++ b/UI/Templates/PreferencesUI/UIxPreferences.wox @@ -124,7 +124,7 @@
-
+
Date: Fri, 4 Apr 2014 14:56:14 -0400 Subject: [PATCH 021/144] fix variable name for UIxFilterEditor.js FolderEncoding to sieveFolderEncoding --- UI/WebServerResources/UIxFilterEditor.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/UI/WebServerResources/UIxFilterEditor.js b/UI/WebServerResources/UIxFilterEditor.js index 3a1b6b800..7783225d2 100644 --- a/UI/WebServerResources/UIxFilterEditor.js +++ b/UI/WebServerResources/UIxFilterEditor.js @@ -636,8 +636,8 @@ function ensureMailboxArgRepresentation(container, argumentSpan) { for (var i = 0; i < mailboxes.length; i++) { var mailbox = mailboxes[i]; var folderValue; - ((folderEncoding == "UTF-8") ? folderValue = mailbox.displayName - : folderValue = mailbox.path); + ((sieveFolderEncoding == "UTF-8") ? folderValue = mailbox.displayName + : folderValue = mailbox.path); var mboxOption = createElement("option", null, null, { value: folderValue }, null, select); From 349f4d824a297f41f2d04087bcff49b49f70cd60 Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Fri, 4 Apr 2014 15:04:37 -0400 Subject: [PATCH 022/144] Fix function sieveClient and the way the iVar Client is handled. Change behaviour of saveMailAccounts()so sogo wont crash if the user tries to resave his preferences after a connection error. --- .gitignore | 1 + .../English.lproj/Localizable.strings | 4 +- UI/PreferencesUI/UIxPreferences.m | 57 +++--- UI/WebServerResources/UIxPreferences.js | 165 +++++++++--------- 4 files changed, 118 insertions(+), 109 deletions(-) diff --git a/.gitignore b/.gitignore index 88becdaa6..2b228461b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ config.make tags */obj/ +*._* */*/obj/ */*/*/obj/ */*/*.SOGo/ diff --git a/UI/PreferencesUI/English.lproj/Localizable.strings b/UI/PreferencesUI/English.lproj/Localizable.strings index 10fbf68a3..75e7c4be7 100644 --- a/UI/PreferencesUI/English.lproj/Localizable.strings +++ b/UI/PreferencesUI/English.lproj/Localizable.strings @@ -248,8 +248,8 @@ "Active" = "Active"; "Move Up" = "Move Up"; "Move Down" = "Move Down"; -"ConnectionError" = "Connection error"; -"ServiceTemporarilyUnavailable" = "Service temporarily unavailable"; +"Connection error" = "Connection error"; +"Service temporarily unavailable" = "Service temporarily unavailable"; /* Filters - UIxFilterEditor */ "Filter name:" = "Filter name:"; diff --git a/UI/PreferencesUI/UIxPreferences.m b/UI/PreferencesUI/UIxPreferences.m index b1a0e1a8c..bd66f8761 100644 --- a/UI/PreferencesUI/UIxPreferences.m +++ b/UI/PreferencesUI/UIxPreferences.m @@ -114,7 +114,7 @@ static NSArray *reminderValues = nil; if ((self = [super init])) { item = nil; - client = [self getClient]; + client = nil; #warning user should be the owner rather than the activeUser ASSIGN (user, [context activeUser]); @@ -847,8 +847,8 @@ static NSArray *reminderValues = nil; if (!capabilities) { - if (client) - capabilities = [client capabilities]; + if ([self sieveClient]) + capabilities = [[self sieveClient] capabilities]; else capabilities = [NSArray array]; [capabilities retain]; @@ -1129,22 +1129,26 @@ static NSArray *reminderValues = nil; } } -- (id) sieveClient{ +- (id) sieveClient +{ SOGoMailAccount *account; SOGoMailAccounts *folder; SOGoSieveManager *manager; - NGSieveClient *sieveClient; - folder = [[self clientObject] mailAccountsFolder: @"Mail" inContext: context]; - account = [folder lookupName: @"0" inContext: context acquire: NO]; - manager = [SOGoSieveManager sieveManagerForUser: [context activeUser]]; - sieveClient = [manager clientForAccount: account]; + if (client == nil) + { + folder = [[self clientObject] mailAccountsFolder: @"Mail" inContext: context]; + account = [folder lookupName: @"0" inContext: context acquire: NO]; + manager = [SOGoSieveManager sieveManagerForUser: [context activeUser]]; + client = [manager clientForAccount: account]; + } - return sieveClient; + return client; } -- (BOOL) isSieveServerAvailable { - return (([client isConnected]) +- (BOOL) isSieveServerAvailable +{ + return (([[self sieveClient] isConnected]) ? true : false); } @@ -1159,35 +1163,34 @@ static NSArray *reminderValues = nil; WORequest *request; request = [context request]; - if ([[request method] isEqualToString: @"POST"]){ + if ([[request method] isEqualToString: @"POST"]) + { dd = [[context activeUser] domainDefaults]; if ([dd sieveScriptsEnabled]) - [userDefaults setSieveFilters: sieveFilters]; + [userDefaults setSieveFilters: sieveFilters]; if ([dd vacationEnabled]) - [userDefaults setVacationOptions: vacationOptions]; + [userDefaults setVacationOptions: vacationOptions]; if ([dd forwardEnabled]) - [userDefaults setForwardOptions: forwardOptions]; + [userDefaults setForwardOptions: forwardOptions]; - if([self isSieveServerAvailable]){ + if([self isSieveServerAvailable]) + { [userDefaults synchronize]; folder = [[self clientObject] mailAccountsFolder: @"Mail" inContext: context]; account = [folder lookupName: @"0" inContext: context acquire: NO]; - if([account updateFilters]){ + if([account updateFilters]) results = [self responseWithStatus: 200 andJSONRepresentation: [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:hasChanged], @"hasChanged", nil]]; - } - else{ - results = [self responseWithStatus: 502 andJSONRepresentation:[NSDictionary dictionaryWithObjectsAndKeys: @"ConnectionError", @"textStatus", nil]]; - } - } - else{ - results = [self responseWithStatus: 503 andJSONRepresentation:[NSDictionary dictionaryWithObjectsAndKeys: @"ServiceTemporarilyUnavailable", @"textStatus", nil]]; + + else + results = [self responseWithStatus: 502 andJSONRepresentation:[NSDictionary dictionaryWithObjectsAndKeys: @"Connection error", @"textStatus", nil]]; } + else + results = [self responseWithStatus: 503 andJSONRepresentation:[NSDictionary dictionaryWithObjectsAndKeys: @"Service temporarily unavailable", @"textStatus", nil]]; } - else{ + else results = self; - } return results; } diff --git a/UI/WebServerResources/UIxPreferences.js b/UI/WebServerResources/UIxPreferences.js index c8c6584c6..306873924 100644 --- a/UI/WebServerResources/UIxPreferences.js +++ b/UI/WebServerResources/UIxPreferences.js @@ -3,85 +3,85 @@ var mailAccounts = null; var dialogs = {}; function savePreferences(sender) { - var sendForm = true; - - var sigList = $("signaturePlacementList"); - if (sigList) - sigList.disabled = false; - - if ($("calendarCategoriesListWrapper")) { - serializeCalendarCategories(); + var sendForm = true; + + var sigList = $("signaturePlacementList"); + if (sigList) + sigList.disabled = false; + + if ($("calendarCategoriesListWrapper")) + serializeCalendarCategories(); + + if ($("contactsCategoriesListWrapper")) + serializeContactsCategories(); + + if ($("mailLabelsListWrapper")) + serializeMailLabels(); + + if (typeof mailCustomFromEnabled !== "undefined" && !emailRE.test($("email").value)) { + showAlertDialog(_("Please specify a valid sender address.")); + sendForm = false; + } + + if ($("replyTo")) { + var replyTo = $("replyTo").value; + if (!replyTo.blank() && !emailRE.test(replyTo)) { + showAlertDialog(_("Please specify a valid reply-to address.")); + sendForm = false; } - if ($("contactsCategoriesListWrapper")) { - serializeContactsCategories(); + } + + if ($("dayStartTime")) { + var start = $("dayStartTime"); + var selectedStart = parseInt(start.options[start.selectedIndex].value); + var end = $("dayEndTime"); + var selectedEnd = parseInt(end.options[end.selectedIndex].value); + + if (selectedStart >= selectedEnd) { + showAlertDialog (_("Day start time must be prior to day end time.")); + sendForm = false; } - - if ($("mailLabelsListWrapper")) { - serializeMailLabels(); + } + + if ($("enableVacation") && $("enableVacation").checked) { + if ($("autoReplyText").value.strip().length == 0 || $("autoReplyEmailAddresses").value.strip().length == 0) { + showAlertDialog(_("Please specify your message and your email addresses for which you want to enable auto reply.")); + sendForm = false; } - - if (typeof mailCustomFromEnabled !== "undefined" && !emailRE.test($("email").value)) { - showAlertDialog(_("Please specify a valid sender address.")); - sendForm = false; - } - - if ($("replyTo")) { - var replyTo = $("replyTo").value; - if (!replyTo.blank() && !emailRE.test(replyTo)) { - showAlertDialog(_("Please specify a valid reply-to address.")); - sendForm = false; - } - } - - if ($("dayStartTime")) { - var start = $("dayStartTime"); - var selectedStart = parseInt(start.options[start.selectedIndex].value); - var end = $("dayEndTime"); - var selectedEnd = parseInt(end.options[end.selectedIndex].value); - if (selectedStart >= selectedEnd) { - showAlertDialog (_("Day start time must be prior to day end time.")); - sendForm = false; - } - } - - if ($("enableVacation") && $("enableVacation").checked) { - if ($("autoReplyText").value.strip().length == 0 - || $("autoReplyEmailAddresses").value.strip().length == 0) { - showAlertDialog(_("Please specify your message and your email addresses for which you want to enable auto reply.")); - sendForm = false; - } - if ($("autoReplyText").value.strip().endsWith('\n.')) { - showAlertDialog(_("Your vacation message must not end with a single dot on a line.")); + + if ($("autoReplyText").value.strip().endsWith('\n.')) { + showAlertDialog(_("Your vacation message must not end with a single dot on a line.")); sendForm = false; - } - if ($("enableVacationEndDate") && $("enableVacationEndDate").checked) { - var e = $("vacationEndDate_date"); - var endDate = e.inputAsDate(); - var now = new Date(); - if (isNaN(endDate.getTime()) || endDate.getTime() < now.getTime()) { - showAlertDialog(_("End date of your auto reply must be in the future.")); - sendForm = false; - } - } } - - if ($("enableForward") && $("enableForward").checked) { - var addresses = $("forwardAddress").value.split(","); - for (var i = 0; i < addresses.length && sendForm; i++) - if (!emailRE.test(addresses[i].strip())) { - showAlertDialog(_("Please specify an address to which you want to forward your messages.")); - sendForm = false; - } + + if ($("enableVacationEndDate") && $("enableVacationEndDate").checked) { + var e = $("vacationEndDate_date"); + var endDate = e.inputAsDate(); + var now = new Date(); + if (isNaN(endDate.getTime()) || endDate.getTime() < now.getTime()) { + showAlertDialog(_("End date of your auto reply must be in the future.")); + sendForm = false; + } } - - if (typeof sieveCapabilities != "undefined") { - var jsonFilters = prototypeIfyFilters(); - $("sieveFilters").setValue(Object.toJSON(jsonFilters)); - } - - if (sendForm) { - saveMailAccounts(); - + } + + if ($("enableForward") && $("enableForward").checked) { + var addresses = $("forwardAddress").value.split(","); + for (var i = 0; i < addresses.length && sendForm; i++) + if (!emailRE.test(addresses[i].strip())) { + showAlertDialog(_("Please specify an address to which you want to forward your messages.")); + sendForm = false; + } + } + + if (typeof sieveCapabilities != "undefined") { + var jsonFilters = prototypeIfyFilters(); + $("sieveFilters").setValue(Object.toJSON(jsonFilters)); + } + + if (sendForm) { + saveMailAccounts(); + triggerAjaxRequest($("mainForm").readAttribute("action"), function (http) { if (http.readyState == 4) { var response = http.responseText.evalJSON(true); @@ -91,17 +91,21 @@ function savePreferences(sender) { else if (http.status == 200) { if (response.hasChanged == 1) { window.opener.location.reload(); - window.close();} + window.close(); + } else { - window.close();}} + window.close(); + } + } else { showAlertDialog(_(response.textStatus)); } } - }, - null, - Form.serialize($("mainForm")), // excludes the file input - { "Content-type": "application/x-www-form-urlencoded" }); + }, + null, + Form.serialize($("mainForm")), // excludes the file input + { "Content-type": "application/x-www-form-urlencoded"} + ); } return false; } @@ -879,7 +883,8 @@ function saveMailAccounts() { // Could be null if ModuleConstraints disables email access if (editor) - editor.parentNode.removeChild(editor); + //Instead of removing the modules, we disable it. This will prevent the window to crash if we have a connection error. + editor.select('input, select').each(function(i) { i.disable(); }) compactMailAccounts(); var mailAccountsJSON = $("mailAccountsJSON"); From 846212336aead0959d1e9b34d9b2f157f9e0ac94 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Fri, 4 Apr 2014 16:53:58 -0400 Subject: [PATCH 023/144] Make use of a local pool to avoid over-memory usage --- ActiveSync/SOGoMailObject+ActiveSync.m | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/ActiveSync/SOGoMailObject+ActiveSync.m b/ActiveSync/SOGoMailObject+ActiveSync.m index 05f448df3..eb4fcff3e 100644 --- a/ActiveSync/SOGoMailObject+ActiveSync.m +++ b/ActiveSync/SOGoMailObject+ActiveSync.m @@ -30,6 +30,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "SOGoMailObject+ActiveSync.h" #import +#import #import #import #import @@ -479,7 +480,9 @@ struct GlobalObjectId { // - (NSString *) activeSyncRepresentationInContext: (WOContext *) _context { + NSAutoreleasePool *pool; NSData *d, *globalObjId; + NSArray *attachmentKeys; NSMutableString *s; id value; @@ -670,6 +673,10 @@ struct GlobalObjectId { // Body - namespace 17 preferredBodyType = [[context objectForKey: @"BodyPreferenceType"] intValue]; + // Make use of a local pool here as _preferredBodyDataUsingType:nativeType: will consume + // a significant amout of RAM and file descriptors + pool = [[NSAutoreleasePool alloc] init]; + nativeBodyType = 1; d = [self _preferredBodyDataUsingType: preferredBodyType nativeType: &nativeBodyType]; @@ -710,8 +717,10 @@ struct GlobalObjectId { [s appendString: @""]; } + DESTROY(pool); + // Attachments -namespace 16 - NSArray *attachmentKeys = [self fetchFileAttachmentKeys]; + attachmentKeys = [self fetchFileAttachmentKeys]; if ([attachmentKeys count]) { int i; From 6e60bbb553ca0a109408d35a5bec760189f67a67 Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Fri, 4 Apr 2014 16:47:46 -0400 Subject: [PATCH 024/144] Fix saved HTML content of draft uploading a file --- NEWS | 6 ++++++ UI/WebServerResources/UIxMailEditor.js | 2 ++ 2 files changed, 8 insertions(+) diff --git a/NEWS b/NEWS index 2ff80d636..74184adbc 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,9 @@ +2.2.4 (2014-MM-DD) +------------------ + +Bug fixes + - fixed saved HTML content of draft when attaching a file + 2.2.3 (2014-04-03) ------------------ diff --git a/UI/WebServerResources/UIxMailEditor.js b/UI/WebServerResources/UIxMailEditor.js index b442b50e1..91afb075c 100644 --- a/UI/WebServerResources/UIxMailEditor.js +++ b/UI/WebServerResources/UIxMailEditor.js @@ -424,6 +424,8 @@ function configureAttachments() { var attachment = createAttachment(file); if (attachment) { file.attachment = attachment; + // Update the text field when using HTML mode + if (CKEDITOR.instances.text) CKEDITOR.instances.text.updateElement(); data.submit(); } if (dropzone.is(":visible")) From c80e2222100fa8859a898079fe8da248cca4016e Mon Sep 17 00:00:00 2001 From: Jeroen Dekkers Date: Sun, 6 Apr 2014 22:44:50 +0200 Subject: [PATCH 025/144] Delete generated source files when running "make clean". --- OpenChange/GNUmakefile.preamble | 3 +++ SoObjects/SOGo/GNUmakefile | 3 +++ 2 files changed, 6 insertions(+) diff --git a/OpenChange/GNUmakefile.preamble b/OpenChange/GNUmakefile.preamble index 27b4b5692..7dba896b6 100644 --- a/OpenChange/GNUmakefile.preamble +++ b/OpenChange/GNUmakefile.preamble @@ -3,3 +3,6 @@ all:: MAPIStorePropertySelectors.m MAPIStorePropertySelectors.h MAPIStorePropertySelectors.m MAPIStorePropertySelectors.h: gen-property-selectors.py code-MAPIStorePropertySelectors.m code-MAPIStorePropertySelectors.h @echo " Auto-generating MAPIStorePropertySelectors.[hm]..." @$(PYTHON) ./gen-property-selectors.py -o MAPIStorePropertySelectors $(LIBMAPISTORE_CFLAGS) + +distclean clean:: + -rm -f MAPIStorePropertySelectors.m MAPIStorePropertySelectors.h diff --git a/SoObjects/SOGo/GNUmakefile b/SoObjects/SOGo/GNUmakefile index f9010db09..bf2948377 100644 --- a/SoObjects/SOGo/GNUmakefile +++ b/SoObjects/SOGo/GNUmakefile @@ -158,6 +158,9 @@ ifeq ($(saml2_config), yes) SOGoSAML2Exceptions.h SOGoSAML2Exceptions.m: gen-saml2-exceptions.py $(ECHO_CREATING) ./gen-saml2-exceptions.py $(LASSO_CFLAGS) $(END_ECHO) +distclean clean:: + -rm -f SOGoSAML2Exceptions.h SOGoSAML2Exceptions.m + endif ifeq ($(ldap_config),yes) From 09bcd2aee27b3ab2fa80c5b21b50b2fa3c9b655e Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Mon, 7 Apr 2014 10:59:38 -0400 Subject: [PATCH 026/144] fix code --- SoObjects/Mailer/SOGoDraftObject.m | 18 ++++++++++-------- SoObjects/SOGo/SOGoParentFolder.m | 2 +- UI/PreferencesUI/UIxPreferences.m | 2 +- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/SoObjects/Mailer/SOGoDraftObject.m b/SoObjects/Mailer/SOGoDraftObject.m index 203d390c5..eb590adb6 100644 --- a/SoObjects/Mailer/SOGoDraftObject.m +++ b/SoObjects/Mailer/SOGoDraftObject.m @@ -1731,18 +1731,20 @@ static NSString *userAgent = nil; matchingContacts = [contactFolders allContactsFromFilter: emailAddress excludeGroups: YES excludeLists: YES]; + } + // If we don't get any results from the autocompletion code, we add it.. + if ([matchingContacts count] == 0) + { + /* Get the selected addressbook from the user preferences where the new address will be added */ + addressBook = [ud selectedAddressBook]; + folder = [contactFolders lookupName: addressBook inContext: context acquire: NO]; + uid = [folder globallyUniqueObjectId]; - // If we don't get any results from the autocompletion code, we add it.. - if ([matchingContacts count] == 0) + if (!(folder == nil || uid == nil)) { - /* Get the selected addressbook from the user preferences where the new address will be added */ - addressBook = [ud selectedAddressBook]; - folder = [contactFolders lookupName: addressBook inContext: context acquire: NO]; - uid = [folder globallyUniqueObjectId]; - card = [NGVCard cardWithUid: uid]; [card addEmail: emailAddress types: nil]; - + contactGCSEntry = NSClassFromString(@"SOGoContactGCSEntry"); newContact = [contactGCSEntry objectWithName: uid inContainer: folder]; diff --git a/SoObjects/SOGo/SOGoParentFolder.m b/SoObjects/SOGo/SOGoParentFolder.m index 8d55adbb0..4c7c7c31a 100644 --- a/SoObjects/SOGo/SOGoParentFolder.m +++ b/SoObjects/SOGo/SOGoParentFolder.m @@ -171,7 +171,7 @@ static SoSecurityManager *sm = nil; // We autocreate the calendars if the user is the owner, a superuser or // if it's a resource as we won't necessarily want to login as a resource // in order to create its database tables. - // FolderType is an Enum where 0 = Personal and 1 = collected + // FolderType is an enum where 0 = Personal and 1 = collected if ([roles containsObject: SoRole_Owner] || (folderOwner && [folderOwner isResource])) { diff --git a/UI/PreferencesUI/UIxPreferences.m b/UI/PreferencesUI/UIxPreferences.m index 02adf2ff6..9328084c3 100644 --- a/UI/PreferencesUI/UIxPreferences.m +++ b/UI/PreferencesUI/UIxPreferences.m @@ -717,7 +717,7 @@ static NSArray *reminderValues = nil; count = [folders count]-1; collectedAlreadyExist = false; - for (i=0; i <= count ; i++) { + for (i = 0; i <= count ; i++) { [availableAddressBooksID addObject:[[folders objectAtIndex:i] realNameInContainer]]; [availableAddressBooksName addObject:[[folders objectAtIndex:i] displayName]]; From 534e4e3d4dff7476598590a98ef2ca5e3e232385 Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Mon, 7 Apr 2014 11:20:19 -0400 Subject: [PATCH 027/144] Fix text nodes of message with HTML entitites --- NEWS | 1 + SoObjects/Mailer/NSString+Mail.m | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 74184adbc..0b12abc21 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,7 @@ Bug fixes - fixed saved HTML content of draft when attaching a file + - fixed text nodes of HTML content handler by encoding HTML entities 2.2.3 (2014-04-03) ------------------ diff --git a/SoObjects/Mailer/NSString+Mail.m b/SoObjects/Mailer/NSString+Mail.m index 7e7f1fbaf..91bca78fc 100644 --- a/SoObjects/Mailer/NSString+Mail.m +++ b/SoObjects/Mailer/NSString+Mail.m @@ -417,7 +417,7 @@ { if (!ignoreContent) { - [result appendString: [NSString stringWithCharacters: characters length: length]]; + [result appendString: [[NSString stringWithCharacters: characters length: length] stringByEscapingHTMLString]]; } } From c9cbcf256691491fd78dad77b9601df36a3ecb25 Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Mon, 7 Apr 2014 16:40:44 -0400 Subject: [PATCH 028/144] applied Morgan's law --- SoObjects/Mailer/SOGoDraftObject.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SoObjects/Mailer/SOGoDraftObject.m b/SoObjects/Mailer/SOGoDraftObject.m index eb590adb6..1f1391ef7 100644 --- a/SoObjects/Mailer/SOGoDraftObject.m +++ b/SoObjects/Mailer/SOGoDraftObject.m @@ -1740,7 +1740,7 @@ static NSString *userAgent = nil; folder = [contactFolders lookupName: addressBook inContext: context acquire: NO]; uid = [folder globallyUniqueObjectId]; - if (!(folder == nil || uid == nil)) + if (folder && uid) { card = [NGVCard cardWithUid: uid]; [card addEmail: emailAddress types: nil]; From 446ef3467a579b53f9b7469f9eb2c465293c00d7 Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Tue, 8 Apr 2014 09:14:00 -0400 Subject: [PATCH 029/144] Fix typo --- UI/PreferencesUI/French.lproj/Localizable.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UI/PreferencesUI/French.lproj/Localizable.strings b/UI/PreferencesUI/French.lproj/Localizable.strings index bddf46ede..3859de208 100644 --- a/UI/PreferencesUI/French.lproj/Localizable.strings +++ b/UI/PreferencesUI/French.lproj/Localizable.strings @@ -159,7 +159,7 @@ /* Contact */ "Personal Address Book" = "Carnet d'adresses personnel"; -"Collected Address Book" = "Carnet d'adresses collectés"; +"Collected Address Book" = "Carnet d'adresses collectées"; /* IMAP Accounts */ "New Mail Account" = "Nouveau compte"; From 3e221253adbd793447a12c23f04be33fe9d17315 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Tue, 8 Apr 2014 11:19:53 -0400 Subject: [PATCH 030/144] Fix for feature #1496 --- SoObjects/Appointments/SOGoAppointmentFolders.m | 16 +++++----------- SoObjects/SOGo/SOGoParentFolder.h | 7 ++++++- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/SoObjects/Appointments/SOGoAppointmentFolders.m b/SoObjects/Appointments/SOGoAppointmentFolders.m index 883564a7e..99b73a636 100644 --- a/SoObjects/Appointments/SOGoAppointmentFolders.m +++ b/SoObjects/Appointments/SOGoAppointmentFolders.m @@ -1,7 +1,7 @@ /* SOGoAppointmentFolders.m - this file is part of SOGo * - * Copyright (C) 2007-2013 Inverse inc. + * Copyright (C) 2007-2014 Inverse inc. * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -56,13 +56,6 @@ #import "SOGoAppointmentFolders.h" -@interface SOGoParentFolder (Private) - -- (NSException *) _fetchPersonalFolders: (NSString *) sql - withChannel: (EOAdaptorChannel *) fc; - -@end - static SoSecurityManager *sm = nil; @implementation SOGoAppointmentFolders @@ -596,8 +589,9 @@ static SoSecurityManager *sm = nil; } } -- (NSException *) _fetchPersonalFolders: (NSString *) sql - withChannel: (EOAdaptorChannel *) fc +- (NSException *) fetchSpecialFolders: (NSString *) sql + withChannel: (EOAdaptorChannel *) fc + andFolderType: (SOGoFolderType) folderType { BOOL isWebRequest; NSException *error; @@ -607,7 +601,7 @@ static SoSecurityManager *sm = nil; SOGoWebAppointmentFolder *webFolder; NSString *name; - error = [super _fetchPersonalFolders: sql withChannel: fc]; + error = [super fetchSpecialFolders: sql withChannel: fc andFolderType: folderType]; if (!error) { isWebRequest = [[context request] handledByDefaultHandler]; diff --git a/SoObjects/SOGo/SOGoParentFolder.h b/SoObjects/SOGo/SOGoParentFolder.h index 323e71d61..73ee5deeb 100644 --- a/SoObjects/SOGo/SOGoParentFolder.h +++ b/SoObjects/SOGo/SOGoParentFolder.h @@ -1,6 +1,6 @@ /* SOGoParentFolder.h - this file is part of SOGo * - * Copyright (C) 2006-2013 Inverse inc. + * Copyright (C) 2006-2014 Inverse inc. * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,6 +24,7 @@ #import "SOGoFolder.h" #import "SOGoConstants.h" +@class EOAdaptorChannel; @class NSMutableDictionary; @class NSString; @class WOResponse; @@ -60,6 +61,10 @@ - (id) lookupPersonalFolder: (NSString *) name ignoringRights: (BOOL) ignoreRights; +- (NSException *) fetchSpecialFolders: (NSString *) sql + withChannel: (EOAdaptorChannel *) fc + andFolderType: (SOGoFolderType) folderType; + @end #endif /* SOGOPARENTFOLDERS_H */ From e869406081da91336344f25e2f7beb6bf02e7d25 Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Tue, 8 Apr 2014 11:51:47 -0400 Subject: [PATCH 031/144] Minor CSS improvement in mail headers --- UI/WebServerResources/MailerUI.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/UI/WebServerResources/MailerUI.css b/UI/WebServerResources/MailerUI.css index bbb6127c7..abd14f5c8 100644 --- a/UI/WebServerResources/MailerUI.css +++ b/UI/WebServerResources/MailerUI.css @@ -633,8 +633,8 @@ DIV.bodyFields SPAN.fieldName } DIV.bodyAdditionalFields -{ - background: #d4d0c8; +{ + color: #777; } DIV.bodyMailContent From 5699e5e1b405fc6cfa8e8f9e580bdc80973dd8e7 Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Tue, 8 Apr 2014 12:12:30 -0400 Subject: [PATCH 032/144] Add datepicker for contact birthday --- .gitignore | 1 + UI/Templates/ContactsUI/UIxContactEditor.wox | 115 +++++++-------- UI/WebServerResources/UIxContactEditor.css | 74 +++++++--- UI/WebServerResources/UIxContactEditor.js | 141 +++++++++---------- UI/WebServerResources/datepicker.js | 55 ++++---- UI/WebServerResources/generic.js | 4 +- 6 files changed, 210 insertions(+), 180 deletions(-) diff --git a/.gitignore b/.gitignore index 88becdaa6..16bc03de4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ config.make tags +*._* */obj/ */*/obj/ */*/*/obj/ diff --git a/UI/Templates/ContactsUI/UIxContactEditor.wox b/UI/Templates/ContactsUI/UIxContactEditor.wox index 14f4206c3..6d3532887 100644 --- a/UI/Templates/ContactsUI/UIxContactEditor.wox +++ b/UI/Templates/ContactsUI/UIxContactEditor.wox @@ -10,39 +10,46 @@ title="name" const:userDefaultsKeys="SOGoContactsCategories" const:popup="YES" - > + const:cssFiles="datepicker.css" + const:jsFiles="datepicker.js"> + -
- - + +
+ -
+ var:selection="componentAddressBook"/> +
+
  • -
  • -
  • + +
  • + +
  • +
  • -
  • -
  • -
  • + + + +
  • + +
  • +
  • -
  • + +
+
@@ -171,18 +178,18 @@
- -
-
-
- + + +
+
+ + +
- +
@@ -339,42 +346,40 @@ + var:value="ldifRecord.mozillaworkurl"/> +
-
- -
- + +
+ + + +
+
+
- +
- - - - - - - +
+ + +
- + +
@@ -382,8 +387,8 @@
- + + diff --git a/UI/WebServerResources/UIxContactEditor.css b/UI/WebServerResources/UIxContactEditor.css index 26f3c8ba6..a4c80d3fb 100644 --- a/UI/WebServerResources/UIxContactEditor.css +++ b/UI/WebServerResources/UIxContactEditor.css @@ -7,45 +7,54 @@ DIV#addressBookSelector SELECT SELECT { width: 8em; } -DIV#buttons -{ color: #535D6D; - visibility: visible; - position: absolute; - right: 1em; - bottom: 1em; } - TR { width: 100% !important; border: 2px solid #0ff; } + +/********** Frame of the current tab **********/ DIV#editorTabs { position: absolute; - top: 5px; left: 5px; right: 5px; - bottom: 40px; } + top: 5px; + bottom: 5px; +} DIV#editorTabs DIV.tab TD.titleCell { text-align: left; font-weight: bold; } +DIV#buttons +{ color: #535D6D; + visibility: visible; + position: absolute; + bottom: 12px; + right: 10px; } + +#cancelButton:hover +{ + font-weight:bold; +} +#submitButton:hover +{ + font-weight:bold; +} + +/********** Contact **********/ + INPUT.textField { width: 60%; } TD#htmlMailFormat { text-align: left !important; } -TABLE#emailInfos TD -{ width: 90%; } - TABLE#emailInfos TD.preferred { width: 10% !important; overflow: visible; text-align: center; } -DIV.tab TD.firstColumn INPUT.textField, -DIV.tab TD.secondColumn INPUT.textField -{ width: 35%; } +/********** Categories **********/ #categoryContainer { max-height: 400px; @@ -67,11 +76,34 @@ INPUT.comboBoxField, #emptyCategory margin-bottom: 0px; margin-top: 0px; } -#otherInfos TEXTAREA -{ width: 70%; } +/********** Address **********/ -#birthday, #birthmonth -{ width: 18px; } +DIV.tab TD.firstColumn INPUT.textField, +DIV.tab TD.secondColumn INPUT.textField +{ width: 35%; } -#birthyear -{ width: 36px; } +/********** Photos **********/ + + + +/********** OTHER **********/ + +#birthdayDate +{ width: auto; + vertical-align: 8px; +} + +#birthdayLabel +{ + vertical-align: 8px; +} + +#otherInfos table td +{ text-align: left; + padding-bottom: 8px; +} + +#otherInfos textarea +{ width: 100%; + height: 100%; +} \ No newline at end of file diff --git a/UI/WebServerResources/UIxContactEditor.js b/UI/WebServerResources/UIxContactEditor.js index 47813a1b2..2ea317035 100644 --- a/UI/WebServerResources/UIxContactEditor.js +++ b/UI/WebServerResources/UIxContactEditor.js @@ -36,10 +36,9 @@ function unescapeCallbackParameter(s) { return s; } -function copyContact(type, email, uid, sn, - displayname, givenname, telephonenumber, facsimiletelephonenumber, - mobile, postalAddress, homePostalAddress, - departmentnumber, l) +function copyContact(type, email, uid, sn, displayname, + givenname, telephonenumber, facsimiletelephonenumber, + mobile, postalAddress, homePostalAddress, departmentnumber, l) { // var type = arguments[0]; // var email = arguments[1]; @@ -79,55 +78,39 @@ function copyContact(type, email, uid, sn, }; function validateContactEditor() { - var rc = true; + var rc = true; - var e = $('mail'); - if (e.value.length > 0 - && !emailRE.test(e.value)) { - alert(_("invalidemailwarn")); - rc = false; - } + var e = $('mail'); + if (e.value.length > 0 + && !emailRE.test(e.value)) { + alert(_("invalidemailwarn")); + rc = false; + } - e = $('mozillasecondemail'); - if (e.value.length > 0 - && !emailRE.test(e.value)) { - alert(_("invalidemailwarn")); - rc = false; - } - - var today = new Date(); - var yyyy = today.getFullYear(); - var mm = today.getMonth(); - var dd = today.getDay(); - - var byear = $('birthyear'); - var bmonth = $('birthmonth'); - var bday = $('birthday'); - - if(byear.value <= yyyy && (byear.value.length == 4)){ - if(bmonth.value <= mm && bmonth.value <= 12 && bmonth.value >=1){ - if(bday.value <= dd && bday.value <= 31 && bday.value >=1){ - var bdayValue = byear.value + "-" + bmonth.value + "-" + bday.value; - if (bdayValue != "--" && !dateRegex.test(bdayValue)) { - alert(_("invaliddatewarn")); - rc = false; - } - } - else{ - alert(_("invaliddatewarn")); - rc = false;} - } - else{ - alert(_("invalidmonthwarn")); - rc = false;} - } - else{ - alert(_("invalidyearwarn")); - rc = false;} - - return rc; + e = $('mozillasecondemail'); + if (e.value.length > 0 + && !emailRE.test(e.value)) { + alert(_("invalidemailwarn")); + rc = false; + } + return rc } +this.initTimeWidgets = function (widgets) { + this.timeWidgets = widgets; + var firstDay = new Date(); + firstDay.setFullYear(1900,0,1); + var lastDay = new Date(); + + jQuery(widgets['birthday']['date']).closest('.date').datepicker({autoclose: true, + weekStart: 0, + endDate: lastDay, + startDate: firstDay, + setStartDate: lastDay, + startView: 2, + position: "below-shifted-left"}); +}; + function onDisplaynameKeyDown() { var fn = $("displayname"); fn.onkeydown = null; @@ -286,39 +269,43 @@ function onEmptyCategoryClick(event) { } function initEditorForm() { - var tabsContainer = $("editorTabs"); - var controller = new SOGoTabsController(); - controller.attachToTabsContainer(tabsContainer); + var tabsContainer = $("editorTabs"); + var controller = new SOGoTabsController(); + controller.attachToTabsContainer(tabsContainer); - displaynameChanged = ($("displayname").value.length > 0); - $("displayname").onkeydown = onDisplaynameKeyDown; - $("sn").onkeyup = onDisplaynameNewValue; - $("givenname").onkeyup = onDisplaynameNewValue; + displaynameChanged = ($("displayname").value.length > 0); + $("displayname").onkeydown = onDisplaynameKeyDown; + $("sn").onkeyup = onDisplaynameNewValue; + $("givenname").onkeyup = onDisplaynameNewValue; - $("cancelButton").observe("click", onEditorCancelClick); - var submitButton = $("submitButton"); - if (submitButton) { - submitButton.observe("click", onEditorSubmitClick); + $("cancelButton").observe("click", onEditorCancelClick); + var submitButton = $("submitButton"); + if (submitButton) { + submitButton.observe("click", onEditorSubmitClick); + } + + Event.observe(document, "keydown", onDocumentKeydown); + + if (typeof(gCategories) != "undefined") { + regenerateCategoriesMenu(); + } + var catsInput = $("jsonContactCategories"); + if (catsInput && catsInput.value.length > 0) { + var contactCats = $(catsInput.value.evalJSON(false)); + for (var i = 0; i < contactCats.length; i++) { + appendCategoryInput(contactCats[i]); } + } - Event.observe(document, "keydown", onDocumentKeydown); + var emptyCategory = $("emptyCategory"); + if (emptyCategory) { + emptyCategory.tabIndex = 10000; + emptyCategory.observe("click", onEmptyCategoryClick); + } + + var widgets = {'birthday': {'date': $("birthdayDate")}}; + initTimeWidgets(widgets); - if (typeof(gCategories) != "undefined") { - regenerateCategoriesMenu(); - } - var catsInput = $("jsonContactCategories"); - if (catsInput && catsInput.value.length > 0) { - var contactCats = $(catsInput.value.evalJSON(false)); - for (var i = 0; i < contactCats.length; i++) { - appendCategoryInput(contactCats[i]); - } - } - - var emptyCategory = $("emptyCategory"); - if (emptyCategory) { - emptyCategory.tabIndex = 10000; - emptyCategory.observe("click", onEmptyCategoryClick); - } } document.observe("dom:loaded", initEditorForm); diff --git a/UI/WebServerResources/datepicker.js b/UI/WebServerResources/datepicker.js index 9c19590df..91aa6c029 100644 --- a/UI/WebServerResources/datepicker.js +++ b/UI/WebServerResources/datepicker.js @@ -31,14 +31,11 @@ var that = this; this.element = $(element); - this.position = options.position||this.element.data('position')||"bellow"; + this.position = options.position||this.element.data('position'); this.format = DPGlobal.parseFormat(options.format||this.element.data('date-format')||'mm/dd/yyyy'); - this.picker = $(DPGlobal.template) - .addClass(this.position) - .appendTo('body') - .on({ - click: $.proxy(this.click, this) - }); + this.picker = $(DPGlobal.template).addClass(this.position) + .appendTo('body') + .on({click: $.proxy(this.click, this)}); this.isInput = this.element.is('input'); this.component = this.element.is('.date') ? this.element.find('.add-on') : false; this.hasInput = this.component && this.element.find('input').length; @@ -51,7 +48,8 @@ keyup: $.proxy(this.update, this), keydown: $.proxy(this.keydown, this) }); - } else { + } + else { if (this.component && this.hasInput){ // For components that are not readonly, allow keyboard nav this.element.find('input').on({ @@ -59,9 +57,9 @@ keyup: $.proxy(this.update, this), keydown: $.proxy(this.keydown, this) }); - - this.component.on('click', $.proxy(this.show, this)); - } else { + this.component.on('click', $.proxy(this.show, this)); + } + else { this.element.on('click', $.proxy(this.show, this)); } } @@ -76,14 +74,16 @@ this.autoclose = false; if ('autoclose' in options) { this.autoclose = options.autoclose; - } else if ('dateAutoclose' in this.element.data()) { + } + else if ('dateAutoclose' in this.element.data()) { this.autoclose = this.element.data('date-autoclose'); } this.keyboardNavigation = true; if ('keyboardNavigation' in options) { this.keyboardNavigation = options.keyboardNavigation; - } else if ('dateKeyboardNavigation' in this.element.data()) { + } + else if ('dateKeyboardNavigation' in this.element.data()) { this.keyboardNavigation = this.element.data('date-keyboard-navigation'); } @@ -182,19 +182,24 @@ }).first().css('z-index'))+10; var offset = this.component ? this.component.offset() : this.element.offset(); var width = this.component ? this.component.width() : this.element.width(); - if (this.position == 'bellow') - this.picker.css({ - top: offset.top + this.height, - left: offset.left, - right: 'auto', - zIndex: zIndex + if (this.position == 'bellow') + this.picker.css({top: offset.top + this.height, + left: offset.left, + right: 'auto', + zIndex: zIndex }); - else // above - this.picker.css({ - top: offset.top - this.height - this.picker.outerHeight(), - right: window.width() - offset.left - width, - left: 'auto', - zIndex: zIndex + + if (this.position == 'below-shifted-left') + this.picker.css({top: offset.top + this.height, + left: offset.left - 83, + right: 'auto', + zIndex: zIndex + }); + else // above + this.picker.css({ top: offset.top - this.height - this.picker.outerHeight(), + right: window.width() - offset.left - width, + left: 'auto', + zIndex: zIndex }); }, diff --git a/UI/WebServerResources/generic.js b/UI/WebServerResources/generic.js index 89149d9a0..8aace44cb 100644 --- a/UI/WebServerResources/generic.js +++ b/UI/WebServerResources/generic.js @@ -267,7 +267,7 @@ function openContactWindow(url, wId) { wId = sanitizeWindowName(wId); var w = window.open(url, wId, - "width=450,height=530,resizable=0,location=0"); + "width=460,height=560,resizable=0,location=0"); w.focus(); return w; @@ -1743,7 +1743,7 @@ function onPreferencesClick(event) { } else { var w = window.open(urlstr, "SOGoPreferences", - "width=580,height=476,resizable=1,scrollbars=0,location=0"); + "width=615,height=520,resizable=1,scrollbars=0,location=0"); w.opener = window; w.focus(); } From d9b99f536c9d85807df1682463a9d03d7a0356a3 Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Tue, 8 Apr 2014 12:48:59 -0400 Subject: [PATCH 033/144] Erased strings no longer used --- UI/Contacts/English.lproj/Localizable.strings | 3 --- 1 file changed, 3 deletions(-) diff --git a/UI/Contacts/English.lproj/Localizable.strings b/UI/Contacts/English.lproj/Localizable.strings index d52b2e31e..745b31e2f 100644 --- a/UI/Contacts/English.lproj/Localizable.strings +++ b/UI/Contacts/English.lproj/Localizable.strings @@ -36,9 +36,6 @@ "delete" = "delete"; "edit" = "edit"; "invalidemailwarn" = "The specified email is invalid"; -"invaliddatewarn" = "The specified date is invalid."; -"invalidmonthwarn" = "The specified month is invalid."; -"invalidyearwarn" = "The specified year is invalid."; "new" = "new"; "Preferred Phone" = "Preferred Phone"; From c250b9a6d44112c2441b9b7573ea40b885caba64 Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Tue, 8 Apr 2014 15:32:13 -0400 Subject: [PATCH 034/144] Fix deleting calendar Added a "/" inside the function: deletePersonalCalendarConfirm(). --- UI/WebServerResources/SchedulerUI.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UI/WebServerResources/SchedulerUI.js b/UI/WebServerResources/SchedulerUI.js index f54b5b9bd..1b5e96a16 100644 --- a/UI/WebServerResources/SchedulerUI.js +++ b/UI/WebServerResources/SchedulerUI.js @@ -3221,7 +3221,7 @@ function deletePersonalCalendarConfirm() { this.deselect(); this.hide(); removeFolderRequestCount++; - var url = ApplicationBaseURL + folderId + "/delete"; + var url = ApplicationBaseURL + "/" + folderId + "/delete"; triggerAjaxRequest(url, deletePersonalCalendarCallback, this); disposeDialog(); } From 3629670fcaa53fa71203631214397008188301ba Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Tue, 8 Apr 2014 15:35:36 -0400 Subject: [PATCH 035/144] Fix for #2489 --- NEWS | 1 + SoObjects/Appointments/product.plist | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 0b12abc21..6c34a0c28 100644 --- a/NEWS +++ b/NEWS @@ -4,6 +4,7 @@ Bug fixes - fixed saved HTML content of draft when attaching a file - fixed text nodes of HTML content handler by encoding HTML entities + - fixed iCal7 delegation issue with the "inbox" folder (#2489) 2.2.3 (2014-04-03) ------------------ diff --git a/SoObjects/Appointments/product.plist b/SoObjects/Appointments/product.plist index ac04c7d41..62408d864 100644 --- a/SoObjects/Appointments/product.plist +++ b/SoObjects/Appointments/product.plist @@ -67,7 +67,7 @@ SOGoAppointmentInboxFolder = { superclass = "SOGoAppointmentFolder"; defaultRoles = { - "Access Contents Information" = ( "Owner" ); + "Access Contents Information" = ( "Owner", "AuthorizedSubscriber" ); }; }; SOGoCalendarComponent = { From 7997448d416c12284e11a0038ae1ceed00a7cea2 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 9 Apr 2014 06:33:02 -0400 Subject: [PATCH 036/144] Fixed issus in previous commits --- SoObjects/Mailer/SOGoMailLabel.h | 2 +- UI/PreferencesUI/UIxPreferences.m | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/SoObjects/Mailer/SOGoMailLabel.h b/SoObjects/Mailer/SOGoMailLabel.h index 54bd2496a..5a64f908d 100644 --- a/SoObjects/Mailer/SOGoMailLabel.h +++ b/SoObjects/Mailer/SOGoMailLabel.h @@ -25,7 +25,7 @@ #import #import -#import "../../UI/SOGoUI/UIxComponent.h"; +#import "../../UI/SOGoUI/UIxComponent.h" @interface SOGoMailLabel : NSObject { diff --git a/UI/PreferencesUI/UIxPreferences.m b/UI/PreferencesUI/UIxPreferences.m index 0c59ffa02..9d9a35a5a 100644 --- a/UI/PreferencesUI/UIxPreferences.m +++ b/UI/PreferencesUI/UIxPreferences.m @@ -45,6 +45,7 @@ #import #import #import +#import #import #import #import @@ -694,7 +695,9 @@ static NSArray *reminderValues = nil; - (NSArray *) addressBookList { /* We want all the SourceIDS */ - NSMutableArray *folders, *contactFolders, *availableAddressBooksID, *availableAddressBooksName; + NSMutableArray *folders, *availableAddressBooksID, *availableAddressBooksName; + SOGoParentFolder *contactFolders; + int i, count; BOOL collectedAlreadyExist; @@ -706,7 +709,7 @@ static NSArray *reminderValues = nil; count = [folders count]-1; // Inside this loop we remove all the public or shared addressbooks - for (count; count >= 0; count--) + for (; count >= 0; count--) { if (![[folders objectAtIndex: count] isKindOfClass: [SOGoContactGCSFolder class]]) [folders removeObjectAtIndex: count]; @@ -716,14 +719,14 @@ static NSArray *reminderValues = nil; availableAddressBooksID = [NSMutableArray arrayWithCapacity: [folders count]]; availableAddressBooksName = [NSMutableArray arrayWithCapacity: [folders count]]; count = [folders count]-1; - collectedAlreadyExist = false; + collectedAlreadyExist = NO; for (i = 0; i <= count ; i++) { [availableAddressBooksID addObject:[[folders objectAtIndex:i] realNameInContainer]]; [availableAddressBooksName addObject:[[folders objectAtIndex:i] displayName]]; if ([[availableAddressBooksID objectAtIndex:i] isEqualToString: @"collected"]) - collectedAlreadyExist = true; + collectedAlreadyExist = YES; } // Create the dictionary for the next function : itemAddressBookText. if (!addressBooksIDWithDisplayName) From e24c22e3dc61b7550343b5fb17657d39d7a7bc83 Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Fri, 28 Feb 2014 16:39:27 -0500 Subject: [PATCH 037/144] BugFix #1046; Whenever the sieve server is unavailable an error message will appear. --- .../English.lproj/Localizable.strings | 5 +++ UI/PreferencesUI/UIxPreferences.m | 36 +++++++++++++++++++ UI/WebServerResources/UIxPreferences.js | 28 +++++++++++++++ 3 files changed, 69 insertions(+) diff --git a/UI/PreferencesUI/English.lproj/Localizable.strings b/UI/PreferencesUI/English.lproj/Localizable.strings index ccd8890a4..771ce54da 100644 --- a/UI/PreferencesUI/English.lproj/Localizable.strings +++ b/UI/PreferencesUI/English.lproj/Localizable.strings @@ -252,6 +252,11 @@ "Active" = "Active"; "Move Up" = "Move Up"; "Move Down" = "Move Down"; +<<<<<<< HEAD +======= +"ConnectionError" = "Connection error"; +"ServiceTemporarilyUnavailable" = "Service temporarily unavailable"; +>>>>>>> a005b93... bug 1046 finished, if sieve server is not responding an error message will appear /* Filters - UIxFilterEditor */ "Filter name:" = "Filter name:"; diff --git a/UI/PreferencesUI/UIxPreferences.m b/UI/PreferencesUI/UIxPreferences.m index 9d9a35a5a..c192a0450 100644 --- a/UI/PreferencesUI/UIxPreferences.m +++ b/UI/PreferencesUI/UIxPreferences.m @@ -1227,6 +1227,7 @@ static NSArray *reminderValues = nil; id results; WORequest *request; SOGoDomainDefaults *dd; +<<<<<<< HEAD NSString *method; request = [context request]; @@ -1243,6 +1244,23 @@ static NSArray *reminderValues = nil; if ([dd forwardEnabled]) [userDefaults setForwardOptions: forwardOptions]; +======= + SOGoMailAccount *account; + SOGoMailAccounts *folder; + WORequest *request; + + request = [context request]; + if ([[request method] isEqualToString: @"POST"]){ + dd = [[context activeUser] domainDefaults]; + if ([dd sieveScriptsEnabled]) + [userDefaults setSieveFilters: sieveFilters]; + if ([dd vacationEnabled]) + [userDefaults setVacationOptions: vacationOptions]; + if ([dd forwardEnabled]) + [userDefaults setForwardOptions: forwardOptions]; + + if([self isSieveServerAvailable]){ +>>>>>>> a005b93... bug 1046 finished, if sieve server is not responding an error message will appear [userDefaults synchronize]; folder = [[self clientObject] mailAccountsFolder: @"Mail" @@ -1250,6 +1268,7 @@ static NSArray *reminderValues = nil; account = [folder lookupName: @"0" inContext: context acquire: NO]; [account updateFilters]; +<<<<<<< HEAD if (hasChanged) method = @"window.location.reload()"; else @@ -1260,6 +1279,23 @@ static NSArray *reminderValues = nil; else results = self; +======= + if([account updateFilters]){ + results = [self responseWithStatus: 200 andJSONRepresentation: [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:hasChanged], @"hasChanged", nil]]; + } + else{ + results = [self responseWithStatus: 502 andJSONRepresentation:[NSDictionary dictionaryWithObjectsAndKeys: @"ConnectionError", @"textStatus", nil]]; + } + } + else{ + results = [self responseWithStatus: 503 andJSONRepresentation:[NSDictionary dictionaryWithObjectsAndKeys: @"ServiceTemporarilyUnavailable", @"textStatus", nil]]; + } + } + else{ + results = self; + } + +>>>>>>> a005b93... bug 1046 finished, if sieve server is not responding an error message will appear return results; } diff --git a/UI/WebServerResources/UIxPreferences.js b/UI/WebServerResources/UIxPreferences.js index c342ffa1f..2c62ae041 100644 --- a/UI/WebServerResources/UIxPreferences.js +++ b/UI/WebServerResources/UIxPreferences.js @@ -80,11 +80,39 @@ function savePreferences(sender) { } if (sendForm) { +<<<<<<< HEAD saveMailAccounts(); $("mainForm").submit(); } return false; +======= + saveMailAccounts(); + + triggerAjaxRequest($("mainForm").readAttribute("action"), function (http) { + if (http.readyState == 4) { + var response = http.responseText.evalJSON(true); + if (http.status == 503) { + showAlertDialog(_(response.textStatus)); + } + else if (http.status == 200) { + if (response.hasChanged == 1) { + window.opener.location.reload(); + window.close();} + else { + window.close();}} + else { + showAlertDialog(_(response.textStatus)); + } + } + }, + null, + Form.serialize($("mainForm")), // excludes the file input + { "Content-type": "application/x-www-form-urlencoded" }); + } + return false; + +>>>>>>> a005b93... bug 1046 finished, if sieve server is not responding an error message will appear } function prototypeIfyFilters() { From 342b68fd4405be1894af594f5f0b4dd4d5b8ae48 Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Thu, 6 Mar 2014 15:20:41 -0500 Subject: [PATCH 038/144] Erase the merging conflicts writings --- .../English.lproj/Localizable.strings | 3 -- UI/PreferencesUI/UIxPreferences.m | 47 +++---------------- UI/WebServerResources/UIxPreferences.js | 9 ---- 3 files changed, 6 insertions(+), 53 deletions(-) diff --git a/UI/PreferencesUI/English.lproj/Localizable.strings b/UI/PreferencesUI/English.lproj/Localizable.strings index 771ce54da..b5439c3c6 100644 --- a/UI/PreferencesUI/English.lproj/Localizable.strings +++ b/UI/PreferencesUI/English.lproj/Localizable.strings @@ -252,11 +252,8 @@ "Active" = "Active"; "Move Up" = "Move Up"; "Move Down" = "Move Down"; -<<<<<<< HEAD -======= "ConnectionError" = "Connection error"; "ServiceTemporarilyUnavailable" = "Service temporarily unavailable"; ->>>>>>> a005b93... bug 1046 finished, if sieve server is not responding an error message will appear /* Filters - UIxFilterEditor */ "Filter name:" = "Filter name:"; diff --git a/UI/PreferencesUI/UIxPreferences.m b/UI/PreferencesUI/UIxPreferences.m index c192a0450..955e03260 100644 --- a/UI/PreferencesUI/UIxPreferences.m +++ b/UI/PreferencesUI/UIxPreferences.m @@ -1225,61 +1225,27 @@ static NSArray *reminderValues = nil; - (id ) defaultAction { id results; - WORequest *request; SOGoDomainDefaults *dd; -<<<<<<< HEAD - NSString *method; - - request = [context request]; - if ([[request method] isEqualToString: @"POST"]) - { - SOGoMailAccount *account; - SOGoMailAccounts *folder; - - dd = [[context activeUser] domainDefaults]; - if ([dd sieveScriptsEnabled]) - [userDefaults setSieveFilters: sieveFilters]; - if ([dd vacationEnabled]) - [userDefaults setVacationOptions: vacationOptions]; - if ([dd forwardEnabled]) - [userDefaults setForwardOptions: forwardOptions]; - -======= SOGoMailAccount *account; SOGoMailAccounts *folder; WORequest *request; - + request = [context request]; if ([[request method] isEqualToString: @"POST"]){ dd = [[context activeUser] domainDefaults]; if ([dd sieveScriptsEnabled]) - [userDefaults setSieveFilters: sieveFilters]; + [userDefaults setSieveFilters: sieveFilters]; if ([dd vacationEnabled]) - [userDefaults setVacationOptions: vacationOptions]; + [userDefaults setVacationOptions: vacationOptions]; if ([dd forwardEnabled]) - [userDefaults setForwardOptions: forwardOptions]; - + [userDefaults setForwardOptions: forwardOptions]; + if([self isSieveServerAvailable]){ ->>>>>>> a005b93... bug 1046 finished, if sieve server is not responding an error message will appear [userDefaults synchronize]; - folder = [[self clientObject] mailAccountsFolder: @"Mail" inContext: context]; account = [folder lookupName: @"0" inContext: context acquire: NO]; - [account updateFilters]; - -<<<<<<< HEAD - if (hasChanged) - method = @"window.location.reload()"; - else - method = nil; - - results = [self jsCloseWithRefreshMethod: method]; - } - else - results = self; - -======= + if([account updateFilters]){ results = [self responseWithStatus: 200 andJSONRepresentation: [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:hasChanged], @"hasChanged", nil]]; } @@ -1295,7 +1261,6 @@ static NSArray *reminderValues = nil; results = self; } ->>>>>>> a005b93... bug 1046 finished, if sieve server is not responding an error message will appear return results; } diff --git a/UI/WebServerResources/UIxPreferences.js b/UI/WebServerResources/UIxPreferences.js index 2c62ae041..021add6d6 100644 --- a/UI/WebServerResources/UIxPreferences.js +++ b/UI/WebServerResources/UIxPreferences.js @@ -80,13 +80,6 @@ function savePreferences(sender) { } if (sendForm) { -<<<<<<< HEAD - saveMailAccounts(); - $("mainForm").submit(); - } - - return false; -======= saveMailAccounts(); triggerAjaxRequest($("mainForm").readAttribute("action"), function (http) { @@ -111,8 +104,6 @@ function savePreferences(sender) { { "Content-type": "application/x-www-form-urlencoded" }); } return false; - ->>>>>>> a005b93... bug 1046 finished, if sieve server is not responding an error message will appear } function prototypeIfyFilters() { From 877082f0428eed910fd95637e97d273bbbc83d86 Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Mon, 10 Mar 2014 10:33:27 -0400 Subject: [PATCH 039/144] Added missing functions getClient and IsSieveServerConnected and the changes that comes with it --- UI/PreferencesUI/UIxPreferences.h | 4 +++ UI/PreferencesUI/UIxPreferences.m | 46 +++++++++++++++++++++++-------- 2 files changed, 38 insertions(+), 12 deletions(-) diff --git a/UI/PreferencesUI/UIxPreferences.h b/UI/PreferencesUI/UIxPreferences.h index 9c8a3483f..e936e67b3 100644 --- a/UI/PreferencesUI/UIxPreferences.h +++ b/UI/PreferencesUI/UIxPreferences.h @@ -22,6 +22,7 @@ #define UIXPREFERENCES_H #import +#import @class NSString; @@ -32,6 +33,7 @@ { id item; SOGoUser *user; + NGSieveClient *client; // Addressbook NSMutableDictionary *addressBooksIDWithDisplayName; @@ -61,6 +63,8 @@ } - (NSString *) userLongDateFormat; +- (BOOL) isSieveServerAvailable; +- (id) getClient; @end diff --git a/UI/PreferencesUI/UIxPreferences.m b/UI/PreferencesUI/UIxPreferences.m index 955e03260..474d7e888 100644 --- a/UI/PreferencesUI/UIxPreferences.m +++ b/UI/PreferencesUI/UIxPreferences.m @@ -118,7 +118,12 @@ static NSArray *reminderValues = nil; if ((self = [super init])) { item = nil; +<<<<<<< HEAD addressBooksIDWithDisplayName = nil; +======= + client = [self getClient]; + +>>>>>>> Added missing functions getClient and IsSieveServerConnected and the changes that comes with it #warning user should be the owner rather than the activeUser ASSIGN (user, [context activeUser]); ASSIGN (today, [NSCalendarDate date]); @@ -179,7 +184,11 @@ static NSArray *reminderValues = nil; [contactsCategories release]; [forwardOptions release]; [daysOfWeek release]; +<<<<<<< HEAD [addressBooksIDWithDisplayName release]; +======= + [client release]; +>>>>>>> Added missing functions getClient and IsSieveServerConnected and the changes that comes with it [super dealloc]; } @@ -919,26 +928,15 @@ static NSArray *reminderValues = nil; - (NSString *) sieveCapabilities { -#warning sieve caps should be deduced from the server static NSArray *capabilities = nil; - SOGoMailAccounts *folder; - SOGoMailAccount *account; - SOGoSieveManager *manager; - NGSieveClient *client; if (!capabilities) { - folder = [[self clientObject] mailAccountsFolder: @"Mail" - inContext: context]; - account = [folder lookupName: @"0" inContext: context acquire: NO]; - manager = [SOGoSieveManager sieveManagerForUser: [context activeUser]]; - client = [manager clientForAccount: account]; - if (client) capabilities = [client capabilities]; else capabilities = [NSArray array]; - [capabilities retain]; + [capabilities retain]; } return [capabilities jsonRepresentation]; @@ -1216,12 +1214,36 @@ static NSArray *reminderValues = nil; } } +<<<<<<< HEAD - (NSString *) sogoVersion { // The variable SOGoVersion comes from the import: SOGo/Build.h return [NSString stringWithString: SOGoVersion]; } +======= +- (id) getClient{ + SOGoMailAccount *account; + SOGoMailAccounts *folder; + SOGoSieveManager *manager; + NGSieveClient *realClient; + + folder = [[self clientObject] mailAccountsFolder: @"Mail" inContext: context]; + account = [folder lookupName: @"0" inContext: context acquire: NO]; + manager = [SOGoSieveManager sieveManagerForUser: [context activeUser]]; + realClient = [manager clientForAccount: account]; + + return realClient; +} + +- (BOOL) isSieveServerAvailable { + return (([client isConnected]) + ? true + : false); +} + + +>>>>>>> Added missing functions getClient and IsSieveServerConnected and the changes that comes with it - (id ) defaultAction { id results; From ec9d48c3a9160fbb4729c032d1f64fa83d5d0124 Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Mon, 10 Mar 2014 10:53:44 -0400 Subject: [PATCH 040/144] Change the function name getClient to sieveClient --- UI/PreferencesUI/UIxPreferences.h | 2 +- UI/PreferencesUI/UIxPreferences.m | 21 ++++----------------- 2 files changed, 5 insertions(+), 18 deletions(-) diff --git a/UI/PreferencesUI/UIxPreferences.h b/UI/PreferencesUI/UIxPreferences.h index e936e67b3..0dce259aa 100644 --- a/UI/PreferencesUI/UIxPreferences.h +++ b/UI/PreferencesUI/UIxPreferences.h @@ -64,7 +64,7 @@ - (NSString *) userLongDateFormat; - (BOOL) isSieveServerAvailable; -- (id) getClient; +- (id) sieveClient; @end diff --git a/UI/PreferencesUI/UIxPreferences.m b/UI/PreferencesUI/UIxPreferences.m index 474d7e888..eddd19f65 100644 --- a/UI/PreferencesUI/UIxPreferences.m +++ b/UI/PreferencesUI/UIxPreferences.m @@ -118,12 +118,7 @@ static NSArray *reminderValues = nil; if ((self = [super init])) { item = nil; -<<<<<<< HEAD addressBooksIDWithDisplayName = nil; -======= - client = [self getClient]; - ->>>>>>> Added missing functions getClient and IsSieveServerConnected and the changes that comes with it #warning user should be the owner rather than the activeUser ASSIGN (user, [context activeUser]); ASSIGN (today, [NSCalendarDate date]); @@ -184,11 +179,7 @@ static NSArray *reminderValues = nil; [contactsCategories release]; [forwardOptions release]; [daysOfWeek release]; -<<<<<<< HEAD [addressBooksIDWithDisplayName release]; -======= - [client release]; ->>>>>>> Added missing functions getClient and IsSieveServerConnected and the changes that comes with it [super dealloc]; } @@ -1214,26 +1205,24 @@ static NSArray *reminderValues = nil; } } -<<<<<<< HEAD - (NSString *) sogoVersion { // The variable SOGoVersion comes from the import: SOGo/Build.h return [NSString stringWithString: SOGoVersion]; } -======= -- (id) getClient{ +- (id) sieveClient{ SOGoMailAccount *account; SOGoMailAccounts *folder; SOGoSieveManager *manager; - NGSieveClient *realClient; + NGSieveClient *sieveClient; folder = [[self clientObject] mailAccountsFolder: @"Mail" inContext: context]; account = [folder lookupName: @"0" inContext: context acquire: NO]; manager = [SOGoSieveManager sieveManagerForUser: [context activeUser]]; - realClient = [manager clientForAccount: account]; + sieveClient = [manager clientForAccount: account]; - return realClient; + return sieveClient; } - (BOOL) isSieveServerAvailable { @@ -1242,8 +1231,6 @@ static NSArray *reminderValues = nil; : false); } - ->>>>>>> Added missing functions getClient and IsSieveServerConnected and the changes that comes with it - (id ) defaultAction { id results; From c5e6ccf3323cc6b3945e7f5da130f5bc35994065 Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Fri, 4 Apr 2014 15:04:37 -0400 Subject: [PATCH 041/144] Fix function sieveClient and the way the iVar Client is handled. Change behaviour of saveMailAccounts()so sogo wont crash if the user tries to resave his preferences after a connection error. --- .../English.lproj/Localizable.strings | 4 +- UI/PreferencesUI/UIxPreferences.m | 56 +++--- UI/WebServerResources/UIxPreferences.js | 165 +++++++++--------- 3 files changed, 117 insertions(+), 108 deletions(-) diff --git a/UI/PreferencesUI/English.lproj/Localizable.strings b/UI/PreferencesUI/English.lproj/Localizable.strings index b5439c3c6..99a3c2258 100644 --- a/UI/PreferencesUI/English.lproj/Localizable.strings +++ b/UI/PreferencesUI/English.lproj/Localizable.strings @@ -252,8 +252,8 @@ "Active" = "Active"; "Move Up" = "Move Up"; "Move Down" = "Move Down"; -"ConnectionError" = "Connection error"; -"ServiceTemporarilyUnavailable" = "Service temporarily unavailable"; +"Connection error" = "Connection error"; +"Service temporarily unavailable" = "Service temporarily unavailable"; /* Filters - UIxFilterEditor */ "Filter name:" = "Filter name:"; diff --git a/UI/PreferencesUI/UIxPreferences.m b/UI/PreferencesUI/UIxPreferences.m index eddd19f65..c801e16be 100644 --- a/UI/PreferencesUI/UIxPreferences.m +++ b/UI/PreferencesUI/UIxPreferences.m @@ -119,6 +119,7 @@ static NSArray *reminderValues = nil; { item = nil; addressBooksIDWithDisplayName = nil; + client = nil; #warning user should be the owner rather than the activeUser ASSIGN (user, [context activeUser]); ASSIGN (today, [NSCalendarDate date]); @@ -923,8 +924,8 @@ static NSArray *reminderValues = nil; if (!capabilities) { - if (client) - capabilities = [client capabilities]; + if ([self sieveClient]) + capabilities = [[self sieveClient] capabilities]; else capabilities = [NSArray array]; [capabilities retain]; @@ -1211,22 +1212,26 @@ static NSArray *reminderValues = nil; return [NSString stringWithString: SOGoVersion]; } -- (id) sieveClient{ +- (id) sieveClient +{ SOGoMailAccount *account; SOGoMailAccounts *folder; SOGoSieveManager *manager; - NGSieveClient *sieveClient; - folder = [[self clientObject] mailAccountsFolder: @"Mail" inContext: context]; - account = [folder lookupName: @"0" inContext: context acquire: NO]; - manager = [SOGoSieveManager sieveManagerForUser: [context activeUser]]; - sieveClient = [manager clientForAccount: account]; + if (client == nil) + { + folder = [[self clientObject] mailAccountsFolder: @"Mail" inContext: context]; + account = [folder lookupName: @"0" inContext: context acquire: NO]; + manager = [SOGoSieveManager sieveManagerForUser: [context activeUser]]; + client = [manager clientForAccount: account]; + } - return sieveClient; + return client; } -- (BOOL) isSieveServerAvailable { - return (([client isConnected]) +- (BOOL) isSieveServerAvailable +{ + return (([[self sieveClient] isConnected]) ? true : false); } @@ -1240,35 +1245,34 @@ static NSArray *reminderValues = nil; WORequest *request; request = [context request]; - if ([[request method] isEqualToString: @"POST"]){ + if ([[request method] isEqualToString: @"POST"]) + { dd = [[context activeUser] domainDefaults]; if ([dd sieveScriptsEnabled]) - [userDefaults setSieveFilters: sieveFilters]; + [userDefaults setSieveFilters: sieveFilters]; if ([dd vacationEnabled]) - [userDefaults setVacationOptions: vacationOptions]; + [userDefaults setVacationOptions: vacationOptions]; if ([dd forwardEnabled]) - [userDefaults setForwardOptions: forwardOptions]; + [userDefaults setForwardOptions: forwardOptions]; - if([self isSieveServerAvailable]){ + if([self isSieveServerAvailable]) + { [userDefaults synchronize]; folder = [[self clientObject] mailAccountsFolder: @"Mail" inContext: context]; account = [folder lookupName: @"0" inContext: context acquire: NO]; - if([account updateFilters]){ + if([account updateFilters]) results = [self responseWithStatus: 200 andJSONRepresentation: [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:hasChanged], @"hasChanged", nil]]; - } - else{ - results = [self responseWithStatus: 502 andJSONRepresentation:[NSDictionary dictionaryWithObjectsAndKeys: @"ConnectionError", @"textStatus", nil]]; - } - } - else{ - results = [self responseWithStatus: 503 andJSONRepresentation:[NSDictionary dictionaryWithObjectsAndKeys: @"ServiceTemporarilyUnavailable", @"textStatus", nil]]; + + else + results = [self responseWithStatus: 502 andJSONRepresentation:[NSDictionary dictionaryWithObjectsAndKeys: @"Connection error", @"textStatus", nil]]; } + else + results = [self responseWithStatus: 503 andJSONRepresentation:[NSDictionary dictionaryWithObjectsAndKeys: @"Service temporarily unavailable", @"textStatus", nil]]; } - else{ + else results = self; - } return results; } diff --git a/UI/WebServerResources/UIxPreferences.js b/UI/WebServerResources/UIxPreferences.js index 021add6d6..396fd2206 100644 --- a/UI/WebServerResources/UIxPreferences.js +++ b/UI/WebServerResources/UIxPreferences.js @@ -3,85 +3,85 @@ var mailAccounts = null; var dialogs = {}; function savePreferences(sender) { - var sendForm = true; - - var sigList = $("signaturePlacementList"); - if (sigList) - sigList.disabled = false; - - if ($("calendarCategoriesListWrapper")) { - serializeCalendarCategories(); + var sendForm = true; + + var sigList = $("signaturePlacementList"); + if (sigList) + sigList.disabled = false; + + if ($("calendarCategoriesListWrapper")) + serializeCalendarCategories(); + + if ($("contactsCategoriesListWrapper")) + serializeContactsCategories(); + + if ($("mailLabelsListWrapper")) + serializeMailLabels(); + + if (typeof mailCustomFromEnabled !== "undefined" && !emailRE.test($("email").value)) { + showAlertDialog(_("Please specify a valid sender address.")); + sendForm = false; + } + + if ($("replyTo")) { + var replyTo = $("replyTo").value; + if (!replyTo.blank() && !emailRE.test(replyTo)) { + showAlertDialog(_("Please specify a valid reply-to address.")); + sendForm = false; } - if ($("contactsCategoriesListWrapper")) { - serializeContactsCategories(); + } + + if ($("dayStartTime")) { + var start = $("dayStartTime"); + var selectedStart = parseInt(start.options[start.selectedIndex].value); + var end = $("dayEndTime"); + var selectedEnd = parseInt(end.options[end.selectedIndex].value); + + if (selectedStart >= selectedEnd) { + showAlertDialog (_("Day start time must be prior to day end time.")); + sendForm = false; } - - if ($("mailLabelsListWrapper")) { - serializeMailLabels(); + } + + if ($("enableVacation") && $("enableVacation").checked) { + if ($("autoReplyText").value.strip().length == 0 || $("autoReplyEmailAddresses").value.strip().length == 0) { + showAlertDialog(_("Please specify your message and your email addresses for which you want to enable auto reply.")); + sendForm = false; } - - if (typeof mailCustomFromEnabled !== "undefined" && !emailRE.test($("email").value)) { - showAlertDialog(_("Please specify a valid sender address.")); - sendForm = false; - } - - if ($("replyTo")) { - var replyTo = $("replyTo").value; - if (!replyTo.blank() && !emailRE.test(replyTo)) { - showAlertDialog(_("Please specify a valid reply-to address.")); - sendForm = false; - } - } - - if ($("dayStartTime")) { - var start = $("dayStartTime"); - var selectedStart = parseInt(start.options[start.selectedIndex].value); - var end = $("dayEndTime"); - var selectedEnd = parseInt(end.options[end.selectedIndex].value); - if (selectedStart >= selectedEnd) { - showAlertDialog (_("Day start time must be prior to day end time.")); - sendForm = false; - } - } - - if ($("enableVacation") && $("enableVacation").checked) { - if ($("autoReplyText").value.strip().length == 0 - || $("autoReplyEmailAddresses").value.strip().length == 0) { - showAlertDialog(_("Please specify your message and your email addresses for which you want to enable auto reply.")); - sendForm = false; - } - if ($("autoReplyText").value.strip().endsWith('\n.')) { - showAlertDialog(_("Your vacation message must not end with a single dot on a line.")); + + if ($("autoReplyText").value.strip().endsWith('\n.')) { + showAlertDialog(_("Your vacation message must not end with a single dot on a line.")); sendForm = false; - } - if ($("enableVacationEndDate") && $("enableVacationEndDate").checked) { - var e = $("vacationEndDate_date"); - var endDate = e.inputAsDate(); - var now = new Date(); - if (isNaN(endDate.getTime()) || endDate.getTime() < now.getTime()) { - showAlertDialog(_("End date of your auto reply must be in the future.")); - sendForm = false; - } - } } - - if ($("enableForward") && $("enableForward").checked) { - var addresses = $("forwardAddress").value.split(","); - for (var i = 0; i < addresses.length && sendForm; i++) - if (!emailRE.test(addresses[i].strip())) { - showAlertDialog(_("Please specify an address to which you want to forward your messages.")); - sendForm = false; - } + + if ($("enableVacationEndDate") && $("enableVacationEndDate").checked) { + var e = $("vacationEndDate_date"); + var endDate = e.inputAsDate(); + var now = new Date(); + if (isNaN(endDate.getTime()) || endDate.getTime() < now.getTime()) { + showAlertDialog(_("End date of your auto reply must be in the future.")); + sendForm = false; + } } - - if (typeof sieveCapabilities != "undefined") { - var jsonFilters = prototypeIfyFilters(); - $("sieveFilters").setValue(Object.toJSON(jsonFilters)); - } - - if (sendForm) { - saveMailAccounts(); - + } + + if ($("enableForward") && $("enableForward").checked) { + var addresses = $("forwardAddress").value.split(","); + for (var i = 0; i < addresses.length && sendForm; i++) + if (!emailRE.test(addresses[i].strip())) { + showAlertDialog(_("Please specify an address to which you want to forward your messages.")); + sendForm = false; + } + } + + if (typeof sieveCapabilities != "undefined") { + var jsonFilters = prototypeIfyFilters(); + $("sieveFilters").setValue(Object.toJSON(jsonFilters)); + } + + if (sendForm) { + saveMailAccounts(); + triggerAjaxRequest($("mainForm").readAttribute("action"), function (http) { if (http.readyState == 4) { var response = http.responseText.evalJSON(true); @@ -91,17 +91,21 @@ function savePreferences(sender) { else if (http.status == 200) { if (response.hasChanged == 1) { window.opener.location.reload(); - window.close();} + window.close(); + } else { - window.close();}} + window.close(); + } + } else { showAlertDialog(_(response.textStatus)); } } - }, - null, - Form.serialize($("mainForm")), // excludes the file input - { "Content-type": "application/x-www-form-urlencoded" }); + }, + null, + Form.serialize($("mainForm")), // excludes the file input + { "Content-type": "application/x-www-form-urlencoded"} + ); } return false; } @@ -879,7 +883,8 @@ function saveMailAccounts() { // Could be null if ModuleConstraints disables email access if (editor) - editor.parentNode.removeChild(editor); + //Instead of removing the modules, we disable it. This will prevent the window to crash if we have a connection error. + editor.select('input, select').each(function(i) { i.disable(); }) compactMailAccounts(); var mailAccountsJSON = $("mailAccountsJSON"); From 371e5ead0821d409dd65a3c47e15963568394dc6 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 9 Apr 2014 10:34:48 -0400 Subject: [PATCH 042/144] Updated the doc in prepration for the release --- Documentation/SOGo Installation Guide.odt | Bin 169139 -> 160737 bytes NEWS | 7 +++++++ 2 files changed, 7 insertions(+) diff --git a/Documentation/SOGo Installation Guide.odt b/Documentation/SOGo Installation Guide.odt index fff970faefb6da4a8db15fa79698336d2efb8dd5..87fef43a0897eb4b21be5cb8a3e92f6fe506b230 100644 GIT binary patch literal 160737 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�mcH8LhXnfHBXYE@7*67O1R#HQsHohvMCf+)sw)+o$A0Ewii>qd>>@QYk z6mOJUeQ(b}y;n0s<>wC|YF$#Kl_&hdCLtD0|ATMDrYY@GGC{LV+e7}is`|>ipC0sUwP@zOoR-t)lW2lyij(J6IMn_T?IRAFur|!67u%h0LjE^b9 z(k0w+!Y$w3(52Cxt$%thV%&BClrJ4n(1JH|7~viNL*0#T<*w(iC{{{PD9+y!^s@U(Eu2$o1A&ru%`n zWfpj83|#cQS_3*>Ds?*GBPn%BQL~BR3Wf|llIe6#q1v{3-^0g4Wljn1eC}n-ljdr- zs5;4mHml;kpf7b>H;<8e==}VvZp2q#gq-$UFFbNddCAUydA;4*Z?rH9Aq`(5T}-F* z0)0FfE;*1}%%978dOF(=^#({01U%xv9GRpqZ!o~%l^U_ zPAHOc^i=Kt_QiW+gcebv-+=8kv_1GuV_fshTa%My_}3xWCXFKA)Quayidbj8gmoA zf2#TUGK%RNQI0@0ATj$(?5C;|M^qeXP32mcYjy(9ln7l`*MPF%^ky(lkZ3otsVJ8F zq?fa?iN(C#utl6zv+3#4*sjd()}H?Q#k}UiamzzZLECIVRM07^|9Ze&M~r$&CoH*v z$<=xmCTk8y4y~!K>Ex(&Z#gwhMvgLzJf`xoT>WpIhNL7VwjaOopWGiP&X>LyQrQ)p?tAEC<$bkm7HG_@MI->w5q=^u2{JZ-hK(RUqO8F&3e{M`J+8h_!!1H`j0ng4PdmQa(?M_%f`gElNvOhDLa!rAX0pmiPGqvWD%K+QA-YP&=p&}n z%g>VZ*I`U@ni`9s!`4T|( z2g5MBu)}YchBY@c>vwK$?oi%`e1;s{JiDBCxyf0ta>U2YCY;B(*(})<*g`s6T(PRD zFVW=bi&+k7^xid-KcMv~W>eFqR3{I{|M>R6uS{x>X$03^8IVaP<)HNQP^QwM0?#ZDktzEM%T=#e(ML$0uCwtEBbapu&kMKgua1{xca0#qk6N! z?l+RWw%EXeb(|b>td_#E_X&6W@{YwH4?XpWoB0rTu<(d(Q(FyAnzEOf)~+pP2L~P^ zS<{SypPEG?GJB09qf6d?^lj6*>dd$#pG)jEBQucc;{^uO{ZFO=I!IV`}E%Yoke$ky?foD#Xk$Q zq=u(X$1(e6UM;Kb=N}*N_ur0w8K2w7d&R1~iljWyKADR4G{zBS=%VBI7-qqFGdSly zh0u-uI68jZk+yGeFF3T)3_5hkbbBNGyAvf||4%b1EU8KRWVcZZ-xiFd2(Jny2ZC)^ z6DG3+QZ~^!fo#~6cs@m_iVL0e6!R2~F0qyalkwKO`6SH}p*mP_-RNeWEI?Mv*r120 zkbR${Gr2+nS5`^MP~JqYQrh#!z~_`muV|XD2~lp}SrQC`{SvaijHk&)CdYe*ZPOIf z5(+P}dB2h-Q;ozLQZ zB%8RCh~ay3RY#rV1NU1zrLw+%f_oGVft13%$c#+arL-b5Vr9-wDb&5BU zw9%2sO8hLaw89PZ&B~r39?pN5{@mS!cCdsapI7QJK^ zu(5C-dwVNSvj9jHq&~DeF+Ee84k1%5J1%0ddAt8)uziY$aMjT7 zE*oXc%-)a}iq3qhVu0F^_Zb~A6AiHLL4%>Cj2Q^)lYd^Gf>c}t5Ph?>i#FT&WDa6q zd5H3RnGSDE2iuU~@x|-sZ}cDjj9Di!6?HFRt~)Y+8rv(Et7J2jR5;_&93V7&MZt>t z`fV`q36Puk3#()S?GXkB2H8R8y)z693nlag>yany1_MI|BP$`Q;Q@QJj2xil+WK@p zYGQ5-gRj*o0{;tMB9zcPN$*oaEVY&;jisY}#WrhZ{(9>NH9QKujsZsNbShE_twx&{+*n~Jr_Pg;v@J?ZwGwai}Xr;V4(2QSNe){)5mZXyO7%R$~! zsDb<(L?8m}u2exdiS^>c`%jtmf?kK6*TC*elDbh~OjoQuY&mD-0Tz$p z>w@*h#39Gp{?~j@8WE+<*JZUch5hax`sn|TbU`T+OCvm@5C8Y+C8#=p{MK5leIPtU z5yX$XeU@_$;@-JNkyeAK-?#I?<4SeZx2a^aiIG4f@Wv~cEoe$m;>jIWN3APNgw3fYJjm{&R??$ zX6K38iqowP>tAazc}_t`cyc7rhd;!2m(&&55Jz>pnQ41o}F%vF#D`i;0#wetqdnZydEHz2F+4Ha@dGlxJs%K~HW{WhMQX#uhI#G8hH-wc?$+Vu zxIfr8|2Sw1;ox}N(-g^bHO2(6_tRIpgwOKrNazWhG=qm{vg+78>?vu}DaNb=n?%2@ z7TMcg#=g>cwD8T1pE0o3E*{*H_zRI36$By)?zp1oN9VE{S2NUBzmIPb^-&HlEu%I& z(EaTq(~cb}0TalCG^HzF%UzP1XalMi^p}M^>8qn%m54m%Gfbk8lVR2HOSL?|D}C)? z=Y%jH(B_JaKcB;~6w8*Tr}+j_sUmjp`ahJ5>}-BCQ(cG}JJ2A0ZbN4ME zZ$CrQ14*E*dUE}tGx@)AB7>X`{kJ~gnW6Q7kzpl!AhmOq!8Z28nOhOHS&J6iv9q_P zoHR_}CzOT-i&=lpgo=3!Swg+#;-zc&h_G*z&ybHvK_It<+j4mh>Jf#fZqJ+;3rN06 z{gFt1NJe^_8>K7+2GEA>P&>ZiH8QhndWfnkiAQg=LjOq&dMX)cB(N`kJfHEAa&2jY zsF)(6=8M#OwVlbExk=%1Ok@DkADuNy;QL)_n}j(9HTlx&DY;lKp*FqX5NHf!u^cT( z&&Tqi#UR|O|LCvQD?dWC(M*Pn1Pk|xcFnpO9u!V(cM!|9I$2!C+*yo-`5b+)CWOB_ zr%cz-NB~r8kH2`Qq@t}X>DdRwgat&_u^0eIaGD*{-ZOmmg%K9jznWB7Txpx_;cFRw z{Vg3d$m!P`qNboYB7F~FU)(Qxon}V*RmhYyx+V9e=>XgT+G{327S7y9PQ4GZKMFK* zgd0|!S6|sG7QTU2O#myr%*3CIIt*;+<5&XcjN9w?R+-4z7iOGG+%l^AHXNp77a-O3 z8?MDprCewBr(~T_*1+8NRZj9^%IRmxKTC#@CCFID=z_lMqF5Vp@+#t(fnYF{YI}Wv zmC&S$4iUFpkvwW(dR2;WR;%uo;U<_p7Da>LIsF9?xpEqihbp;<3tTE;n%hA>*0J~y zZ{-YInUGb~aWS z63GwHB_!SD3i4s@WF9~l-vi24YF3kQ+`1@JvV|M#a{bw)DWIz*6d^pAI^ns7YS9FS z1B=U78*pBntwi#>Yi9FEg-s5$XP{+R&dNYazEcYe8hgadZuZW%RKlsP&k?9Xi@cU! z$rr-oKsW$bn?mJ4$%7idflfx!e*BsW*E8X24Av+aH<0y6CqliJ5J*<0Zz$+tpL4JW z$-yT-#4u9GJIf%ElAfV{0xQ{MRA$~wYR0dD{)=nMI#$IPpgVn}QOQWUt4VXs@_lpmnjO(X3n2X*!j?)0(Bx8w$wa-7 zw&b&-CR(}V`11*bASc+YCKTg=Zo>js!l=&wgW=~_(svXm4 z55Aygoi6h<+;<_0xVH2tP#P9OX}I#H3mVM=!`fW-57)2511>S3m?tyF)9AW{{=4U$ z;IV$zFbZ2QtDnxgfjV{Prm&e_vxGm>h#g9!oIGQwe7^;ZD2}Kyj8i8h;oD=rWKzJ^ z$9cvo6rfk?I{c)2*IsoF1gCZ%s&G7$BOOvoTllGiP}kFl;b6`yI6baAM3<0?AM*{U zLi4ZOW^}rCwCh%O4Y$i~&4S@RKkr)yfv%>I2LpPH!~o~dlcLglsJQX7*5);W34a*H zvY+$+J0}2WkdfWiW(yVjk*+uOXk%>qy=u zGWD16r<}3wRXsJH4cU8EWgoh;80x3f`rG8@<^B^C(q3s9=x!gOQQyp{J3=sv3t;ct zw>HUWbaor~O|NC9cJNaX>} z#g~rqBl_l?EpxH#2Hkq<*3YWG<{T(^BiU)s)Z5IdDQ}?XL&CZa&1@Dnq|yc!a{x*G@eSU1TauOGmlJG{jC?2 zY^qolEQ->)YCC#br~dWQ`6H1Fr~&s-f_Gw_oLIb>V~6UV-TruIJ)HZ>n$fHvUVT2naov z8q^^DL_)tqclfHpWvHDnXf|*E%NJ)A-{*yAko+cax&xz59Lim}g9~)0;Gk>_g%p+l z5@I&w6VXUK&cycN$)|Jon(`wqFJ)_gA^@H%Y8c*{`TZsT5Bvj*llYU39sWD~X9wg8 z$*%5h?|aCHI{aWQV%4)dxqRz#P8aSALHr({{yIqxxEYV4VwPI09Pvl<7S%0`&U5T$sUsT|4i~)fJiO1^+`Rcy=y^3Inmq@`!fm} zkcicgE1@#@6R)B(Ko}x|#WtWSTLu8aKl7@F!c-SL%$!mrS;kBswF3j)WdpK|0u0E! zhm@awrXR}j<%fR!{i!YKYP^4|UL&=bY|bndx$6GLUO^6?gX#^${Sz1>KrtYKg#fCS z+-BFGTv$hfzl*{3cXSF6$p@6x%{?59YUV6LoX;(rVA>{B;ww-g6n-Gi_k(N*@tK4B zR#+C^o5MbR;4eopat3+CK61l?E#ivlp|Z_Viu+N_b4_%>$xNKFL8DUWKzIR8 zqBbk5^1Do2G__FqhYlG!pscnq#;;U&xGI4Yc;O()5(s(XAKd_|h;n=MPKaGBgHQdD z7RWHp>6V6E=l1*hnvV3}Q8$npxIRSWtS%%{vzM9;5AaA=K!>s~!4MM4ESWQeK?zf` zJ%q8yH9S+kK>E37`1X?hZ@fs@G9A-cGgapKwI!ZqBA5>Ep*%8%z>6X^`WaIs69X{9 zJc7*SdE*LcuGt2w^b#-ivHoogX`R<4t?HvLw9Wo9o0iW_Q;ZzKBkcMZIS7^vuojWd zDGTqNr1)s3E03iAIe#PM7Mrvzu)OvG<}9v}q|{p|?g+jV5D?JMt)?; za`ji*PWkUI|1p6L+oL;{lUuiHhdh=Of54FkB4SdIR&H#E69|!28o*5Hz6PO{c}N;N zTihiN?!RR|ENcgvgvNgmbZ7oN3Sp8!`m!8kRq-4T1g1xZwIOGzIZ``z2tpPh0!qjK zn4kp*{_x_ZvU|A;>7bkyHne*Fh(PjzZU=x!vB)C4OgcI|-v!FyeJsqiG@!d<1z>;5X`?@?pXN_kh^2;(gmb5Fuf@sM z012u4HuTBGM?WfxOScsg1GGcWF#p|@U;xUjk50ev*Q&EG9WD)jMhXN%wRa!V8Dyoy zOd%C;3f1JMpP+s_1lZeU>5!v@dW4#9;yf zs65W8%6d-bb)}RjL@0^>C>ltI)Zn#9sIQ}aKt7v5r;*G@5fIQ0b?y&f3}QeGMunqA zWc7ZHKg1|GQ>vOkOYC_^KP->_SkBo7^`!z3?wfN6O==*uFLCInt_SBsy*A`>|FarA z2&PLhMkdIgyqR7mfAbew3c9re$A=$V4DMAAT5v$+cubKFMCi4G0~Qi&;7{ba%#LGQ zl{I>;)2ABY;G{}=YgU+pzgGj0z>1Dhb2Ie5aO)1Hpo54R#vyVs2iZ6HI8u!iLVx2R zK!$x-@(<=AQ6cpBv;Q<_0OF6U50qz7xf;%b>}ktzhNyps?0oHTU36nrUhLtw*=n!iRb%1Bd~fzs}`=%D)2*FEv5-lZCKS{S3Q7 z;Qy|-0IX})<6u8mI4ChNoS=QCmc!`Po8= z`S*rkOaVfG#S7AfG9%q8bEE3k$1hN>>q5(ap9d2bE(Mi`n>T36P`LVdmt(bW^xwJw zkv%y5(i+yhHd}SKawLQ0pBNA}L2qP4=Njn%>#r;5YvoJDCvT6VzMtw1^92{XP5q}* z7%~iN3mskVi>q5Vn(RHCSUOl3clKZ2h&)cLbkyS&3xPXc>MGKt|JG)xbrj#lMMPL4Hj+WScF_-2|Em??zvNd@LXr;>bgdSeLN7(t&~!t|!-fda4@j65 z%c=)KA_;J*da0cZRr^%LX|Z_}^#4nPNXN9%@oDkkQvXS{@n6>@Gr@tkZUINZft3Wc?m;;U@r_N8jAwhF7V-ifpuKy9VJ6C^8)xRR zZW&B0@IQ8A{0{99=lU>=b8@@ne(CtG4AS_)5MVY}y~RHwZAn5*daCWP?PFh1BKYbdh+fQ_~NA@+PD<=JqIY{hw9X za>kXlMadsat!Ho1#fJAwSOM(oUUMZia*S~J&wS!9vas5Is?xU7&pEIQ3;nV^W zI09R2;UYwwpx4_9%N(Kipe4F)8S6CY4p}S_Nt# z8OmHeqs9BB_L@oyG}I4|zrz2=mgtZGV9u0`ddb72pcTPAgs&Fz<8?1?-xvL~o9m^)pJLlIoeo42LM;pGSb)>B^bYUL&! zO0?7RljCobg-S60ASNt3Q!>*6lIMFpqwYI3$S4---r2&`7km+y*UQ(B50 z-Z_~;Db)u+z0RTr+Bq=#5>aMBc>fv#fvm&a=YR}Ip{0t>5N*#Uq~7JWZxH1?j5HhI zp&u>gS6I81O?L?!<{=+4E@+_9Qbq#<-*syp#;`|@UYHft+#J(hSLc~>aEtYS;UDpn zjzhRrHfa>UWulve6Y|S-_`nSr=5&nHd;_^hdW$^Ybs=aF2X>%9#)6|#$}>8sktl!P zoSc!|Dca^l_oKAF&mc$ixEgPI#ufdLG0HGAZ=R7YlR9E5Jj+P+G=v5|0;t*|4O~ej zDn!4GC^p*LH4SMikscvP&v|QIb8~I9C$DTka-YC?IkJ+?h(MYevWYfaPc^(vWi?T; zfdTRN6(Xh7)^<~cuGg5PbMU)sk5Fi4Z&ESa4V1G0g{+ND30}5W^tn#{~ltv^P z$f^|E%5xm7u;--xq}R(_#%e2@fRg~GH%o{c8YUUD{&1#`UZhg=-O?;SXfjFw zY7u&AY)@nko87i3H}@H(o?S23_{4H33jRTUZgpp=)*LI4+RnJ5bAy;9dpIA?kk9rS zkV+;+(K$?>Wa6zJNJJ)xnA#}cq7&U*{&tdc<-a>}xo*&JD#Phr!{5JMWcw2>0R#0r zNqO=n-eP-=0}HzlIGF>BW4%PUR_xgxI~0Ab830GN(1p%sT0$f<8+!fnK@A(wh;fF1 zScl8OUg8}$ySaO&ub)$D7D>vboHMYXD|d0(OnPUldBv#ghvAKhR4p=3x9r#T2V=$| zT!^18%}(i+CaY>_NP)m}J?G*&OihC$AB`ToFZ@$8cns7sIxvyQRAd4@atN{6NXjB$ z01Y@$EFsDb*oQ21ut)^buZT+7V?z%Y8H)O5jtcG zx&Cq>PIV&s@gdE9$0mN2pYO`l`OgsoR%8?$g8v0UM7^D@>fv0S=_MQJo|Ox{EgD)R zKdiev=)oc6rTH4=d88Q6OV}3bN!|^wE^N|l6`=Vz;4}zb`Ee%qRwHG56*fZ zP=s^_szy3RXO-KvZIjLZR)Xn(P2EDPrn@o?nn8)DMTFeScGd&^eO>LGNyiu;JD3nV zP%-7{Oi|ZpsnV>2b0)0RB~yv-qMCr$!{NaH=s0RN7`(09;O9D61!&2mdVj>PZ8-!g zsDA{-91-0-k4jXp-+X+5B5dJr0Tx;09LzshN!$~uqYMx+fpjD6-n3$hXqAq}`F$I8 zpm)#<#B8JP?>V9L^Q^Iob>nFa!SWdh}jpe6-3OF=rm_Q;Fst23+?m;yUXdkT*T@G1T z+!3#{muUg{EpatyM^TyBPIj~ADvfbqS9pOemz&JLmC3TbvTyHJUe3s+XC*9;<8!m- zY3fU~9!iH1$%_$Ovx7bhon@sQr-D-(L-NHL2{Yg84xu#p{sS>>VpRI{X|fX``RxK_NhuQK191h4G7^ z>%q3=h4XR5`-h$Oy<~1im*d{gue>L`h~9HaorlsFX-JyoAWt)gc#^j3Q%1eX7AII9 zJZL=y9*1n-4;LY){HOrRH|7(uYZ~!fz+IotsGA)hX0O&h_}b33s42HQ*5}*Xxs=vW zjCP71-xTN5wTR(8x_wGe_L897*k$~%>%KqJEXiwnKX+K)qh;T1zTDX8==D>dJp`n( zi+&f3CiwH)*KbGBQHB%Lw`s`&Vc)xFzaGUqS-#&uNyM&of=eOlCHi=Jp=8SOwv#o^ zH6ACzZ!{jbFb3o_|BXaEUK%QQT&rf<{`u>%`+Vf`kJ5(&cCWSgLD$`~2G*8vu7pIz zDQ<*}VoXrTL4}>!!5(Pjs%+c9**>1(n?GpxzrO`=Zz<;HZp{>Kac$md%UC(RYJlB3 zw0JFjv)1{h_lH;G>nEy1~(kvCBqKiGYi30>8zjD zu90)0X8k>AW4{T=3y+h=t@WIHyU%DX??5j4=({B-jjH< zh#C^UTSUI6-=g$`OGX_lrMh+2fo(w9`tPJMe9Kt_gEZ88P3mR|#KTqkmr^WKzb-c8 z+#Rc7xJtcsR{gF%(Z~kR)3%q`zalMTF^nbeSF5%CY%bsvYi_n4^f7xdH}#YEsa)FA zDlJEtu2IeDc0;p)Y9@~z!vWX6u=S)CK2=3d$O?*7`2IqoVo?rK+q z==MhK#8IumlZn8|HX)bphmMJ~IuFvN`h&V=FQ8MGcgnXULO^9-hbMQWZ@N&!5el_+ z@%6#vZn2N%XBsqbF=4*r)P(YQDM?O&<(hTXC8o^udKzMt7Ic+7KX8X4X z%c_l1?cOGly{)bm;z(8kJAXLGnLaJG&~h{*2~$KX!fG2P7U0i-_CsC#2WXhg$jA6# z&E2ij2rbB?Ibnaa7RJ3=yOEb4TQdEOz#zIw?sAOX-Wpu5EcwDk?y>yVw0RR`u`irH zRlHbdJ?VW|+cw`+=u`}@^8|q>(>*SSL8F^O^!%cm6IQ>*cG>yZ>|n16i?x7`OK=gh zf@a@H?jC#aX)IfuzD?hrsW$mNGPF9+wD4%Ns@F%Z^x2(?TOGhDmPnlP=$Vc#_SyTs zt$Gr_H@+z6;EIEb&^CSua$N|UwVdYG2I>;zyORDi&Ej|%wbMLdnf1jh9mBDrvTTWa zKqD%aX0c83^U5V@`l&XXn#3o%nWnek8*FY^CyDCiB@F+uQ1;xaKG*ph+}ug9X7LQk zBCq+JlXqIL?ATOBJ>|$@fiu8u|@8zX!trN-@b~ zCkZ%5M9Ji#H;%^M;#X3$8PRzZmxcVZ>^#?6?GFf+ zBGt94pH>+BO=iIAxNYZOxQ?IbSK@+PXT}SKc@%i>f8~oen zYGs56?$LGkZ;Ib_CV;d((Eut%Tnu_Z;0)57i0!6EuJB@GU+s=hdup}QWx`fg4QVcr zreVQp+=-dT{Hqj=Fkf}+^yKxG`NIKsztd6lW!%xVTm0csASjkdJ+I)2t+fYiHKVyp zboljqX`cU`i{Mm&fL>26oyFF>QS(R9R!Q<#gkKT%@5`CB53aPkkzYlv^mU)`t-RI? z6Q<)LTD)*PD|C*H)SkKs@723M_*#v}v9h+f8(*k9F~{$IZ^a<5;_GLF&?gV}DE;W> z{fOnP(%R}D)5F)Gz1nmVpL{+`x-7XV>~1u`eoCm9b;+hULBmwro^POI(%z%Ta_6TA zcPyBd_eKwTjdb-6s9ik=Rsx~-;p#&s$tQ?Yy09O?p=2>${vmfv_?5r({l1tUKVsVE zNUgu>1&6G`EA$g~F(YA%$OMJ5nFRUOnQBVXi6bx;XVoiawwBma@L*AHa9(I?ZdiXL z9ex2;EVZ6nTW<5Jy_U#4K#@`TRL|IcZ1C#!>zRYSBT}wLl>)BE5IerP1CC|a5i7+3 zyG!&m={@b;1H|-glMdSkJU5lD^G*kk%D|y(VBYNeOB{0r{7l{?QMRS`O40>>cM-BaJZc%m>3k|jlYn`6=A+m^{6 zTa$m@Yv0shbWh*w!eY2|D6q_1<2k@HTIT7cEYlZcit#&EBnA|5PdPk}HFMCcoiLF5 z2IAt?GhdOyPP70Z6JLiP>@LkN-H#K8MqhEqd2ocN|A%UlQaM`r>h|;-TiaVvzEYo( zGG70-1fNCC?cfNnyCalk$03f0ee6^IaS(02N7Yp+3h|q~{2n_(yj>aJN}~-nX_9j* z>cff}aOrAI64?EwU_^0&Ez5dQZrJ~0Y{;;)#>Fa^X{?~(#hjq-kAcDmS_01H@-eJ( z=E(t9#@dZz9NkJsVCn$zoJOs!;j5sp2?@9UVyiOm;N4wqTSkOlXNzMbgijx|E5GTCtxz+u;QU8?CQ~tE=%gJQ8rtA(`-NN-S2v_#tuybCdj}rJBHTS-m`9cJSESeb>DCnFuZ0}R= z%RYYQNv9`?*N}>$=xv>x;L~=^%-Qt)dit#DlEdfBGbJ~d~`o*r$d= z5@c>Q9%7Z^;z2RruuCKA=Fu= zv98+Nq7O@_u7>3jySFnHD+ww^QP&G*1>8jsHiT!lDZ!ilE$0{Yt`mpnCHZ@V;&Ju& zh4Xa^t9PrDKSoBX6jFFxD(!@T8nJjbl_QVAue?$na0{i@>phw@(S>g^nv9Rr9&W>r z+(U7F9Aobb-bLF?dk=CP*B1a!!1#UxoZegZE{dKPE>r8Rp|bWp&I_bcHyKC8Grbyl z3sW8LsrRP7IX(^(=P@lGR_4$2izWz;qn@~os@+4~G!}ygs0}o#F1zplT-@p=gA2y_ z#=M&R&)3i~4trv6xgKiK(9{~87Dr}3=(@h;+G9p923wRzWi6F#{z zb={5FCtT=vm<5uS^oP2Ls9wKXJ$%~fVIVQq z@L>(sg6a*bMT^q$tl)WL{OI8gZZ%(os^_T$GC8C5u2!kM&W4&nyTJRB9s)0!Pg=rh zO*Bl?i>hiw{`zS#;;a*yA7!J8;t9O%tKk$u@h3hYg|z$M*}2QLO{9KBihF7MYI&ij zr^{5LoADJco7)6uivTx3$iLEYhOBORt>xAiz7bd)D>KtgZu>D!7UCDPCK-nP!p6M= zqc{F?(tA(6t)=e0tyu2MJnJts{U0zDS^}C;r@QwdmFThI3NO_SVz)Yl@qlwU5L42RkCk>|IESVcUal(imOFLClbSSM~=( z_GSs=(De*b*Zh1hH)(0wD?ltM4yUq;kRRip8WodYmQOC^mTos4VujAu#tuFKvqesk z`#I;oiMYWNJ%BsLZGJ>tnH<*ntGJ;SaKK?$vS2(hX6#6xvqOJ_NH!C7i@j`5n=xMm z0JuzSN2O=6?9P`6zKC-r8E6qR@QN7Y#4DZ9o>|Jd1i$SR`dY8ARqihWyosDxyJ5cV zsdE8y8|a$L2J9dwrsufYWIG@I;w*pSI=PM=QBdcSQ;sqyX*Sf)1aj9szHRmD78A5F zx+Tfw@kRW4bCBo0G5uDwbz;s3ocWRYb1sguQE9@eCn=rB_5HY)!{y1Z>UXumauzq= zaohaYQZ+`cSG?8mY?K_PdW{aYi!NW+6`hUf-W^@@je+y6cyGb3X>IAb%_g_z-twFUcZWQsfVu;&AH=p!u@IW+%4%{x^%7~E5-{Iy{>p8~GJo2p zCe-fL9sF3MFiB63fNFR#H7(n#o04bL0yY>{;K9|YyuT5U({0xH?4d{nYTc;54Gy;> zM5G*3TN~tJ+{f6}+WmGCe`2I}VvY(iFya9T9P=u^?Dgvc6KkEWq(HldqZ` zf#2LX@tkw+{h#~TXy@6UZTTV1t5I7IE?Zq`rl%n=r2tr9l3SH@-M(48Xp1^~L>_Vv@Cbb*hK`yQTbz;~ z$qL)EfCDqdPJ(_2DO+7-CGxnjINAQ-JL#-baBi|QL>!yEn6=LI6?x)amy@|D()fA9Gu`rt^zM*^P3wzSX z+7n_oI23r=YyzvEEHh1V+O;>zR$Og`dAFD8x$_!iJi5~2mWmrR>gIyr@gc3^qOch6 z?)(z9E8AW=22s)xJNL00n49mR;aEm$O|O7|jpu9&wToMU8j0QvL0xHssxkiik~q*y zGWsnu&UV+a&v|7Z!9C;#2agY0le0Nwx)voDZi>H#tbZ`Zew=&)v+s>hh^bvV`l8+9 z@SbO~#aP#ZAwDi2&+wL=7k*wznpIAVG8%v=#v^d{oL(!WvG12Tl(HXAZNo zV81~|Tm_c zc9MNldD@~!e}Cd+eQ%&7Y0z?qF4o-O%QrpxUQ>Bq`z27y43h)7UF(@*C)vqDu$y)I zw^f3Dh3c$&AGg!J)so)%T{V)O%R)J=L%P`C;0v%2=t_LcFef+i9D9In%X_YlY4N?pG%@G1Z*{5j-i}oBFAMM4aYL98AFnk6OwrMy@vktsp-w9D{;VZ#|WyA4?W!KwsHG1>r z#vDPDx-{AV0 ztrG>hI+zlK=zeozDv+c?DfSvia~T_mPq(;vH4#({PAzMxcFf3a6A&^J&?`m4{Ia&- z+v-%>pJ71!|{EVOUkYH&upG0DLYXrW)&9NXxS}( zjc*3&E0bU=f0Ek}@NhbQA*_U=RK*p+#`X3>>&Rj-<5d1sSf!djSN(GJ+TgG? ztU1efJpps$(IgS{S7n{_>W6|6n~mfIXS(FE{odYOAKTHX?>9}SV?*ICS^*9kjVEN9 zeoGI1F3Y>C6iYl$J0^xEom|FRoH$HojC9@Ro;_YzcW?{i*iJ@iT&3W5_E@N}S9&+` z4bAFuISb}c^Q`7`@Y>@?TI5e!uxhM8r)DD6+1b8_n?OKO(R}=SDaGQcmLI~Iy7z1E zAJu#tPZZhlS(%JEswz$S@=_pAm7egJ126DAP%Xm|9}(%^5SYHQ_9Gb{bG^y)dfUXd z$IgR`1cahRWm|N1;Gku*t;jk`gG2>u)&{drhB0QNX~(Ot2Vy6fmK00GKF_rpw#sY7 z&$=^VE|X?OaD<<(ZAj3P12wJ+2?kfHRN6d@OXT?+6ur%pSUum%y{NQ*C)bif8BJZH z{&|N1Rntc0azWM1a=*|~j_gcCmvMFEGGaw z;B0BMO^LH!S-GI)n$ya};i9KNs~_zc_10>U$t~8QHB`#ToorzaDI-ejA=f%kVXNlc zEi3I;q8F!Vrt`i@9SQd8ESuuyY+)~)~L&Fys_TO2g^+M1n%k}+fV7?fslu@mB zjcDl5+bSR|Z(NWmP{MV$%=qd=VL`EF)jXn_1~&GfsMWbEtwtx%Gm(Yweq#$iQ&T5k0m)i%;uLQJJ^qasxUYE4d`ICTV?(h{|FXIb6Fza(YnB`M4tyfh1>H z(!GVmwGTfh8xKzFT!sqXt}>FGlji*RwqFs!>Dq^E6?^;m#lb?J%jf9OR=lO$`TgyT zez_Q>q8j_Gx~UqCM}nJFi)TM8q;?Wor0hv7VN*?@W_^om(u9IzexYiS*%X`h|+F@Q%k_}z(Qw!TrucKITgABcAJ zDp(7t@!Qm$1;vzYW}xUFLkGw?3=F=d)S9V(oHi+ZdeHVG;50QVE-D4>jedKDUFzJH z)XwF}MQllGa!0=aG{;nxpfRpLc@ALgg{ z3sn4soXykfOZAj2yA7u}zn64}rUqHDDV9xYgYsTEILqNv$%)8bC}+NSoH|?mn&ez& zVzVfmRlu%dU(en&W(u@gv(mZ4@k$CaU5G*;Gl(HZ8y(r~ogFaXLJQq!5R2L;k9q@6;~?Ls+opCRWIEh{)MF$9`h|9MZZ6)>XFZNhwC28+9kJ;a zuJ@VrysBp7;{~7ieUnv<)Gp;il^gAIS4Q$!tv^XCp&#;+kQowWJE|+G$SgWJA!EQ7 zn4I4J1p6faK{t!2>^jrr5LR34H*Cch=l;lH4p#BP1fPN`VmB$DHquQkqDH;nn`h0K zzMFq*Nd3ulZN1kvSA2xhXE6nHqvk6kCqw=hLt5Wxq(&r@PELZmr3&68n5MP;s|z>& zJ6+uL263S0`pP$|zaNS@q8TA!7x-or2WnCkCkb z;&-yU#I1JG^+yhYtKYjzTYl8sP;e@J9&`6w&KR$*m~YT(`I)Bl?(Ip3AhG#^Hf9M< z`y2jx+W15iq-e1x5t zecJusz|y0-3#pG@4QU=`4I#^Ytzf2JGyb2T2iOx-0V(U5jtMylai{GW!SHRaVXcyY;0<;yB{_r}GEc(|o zvcugMG9%=V?F8pZfy9=bnGRYmzj(07lmz1AUCR_4Y2?Yf+1?b{UioCMAIc5qyWbd= z)CtjDaV;hv=9Tz)>BNsowlw?I>E$xaSU>k1Uj!6z`5?LYRCL1 zy68Q-Q-X!yexnYKZM{Y;w!)EDTYeKN&MVjyNTyUL)531j#l@1Fx~#O-N5On#1rKQ% zo!knqq}&kLx+d?E@ROAnfN(5lx8n{uO5iQJMzCMpoD~W>^kg5leVXO6xP7|ycp*4T z?Ul=?Qk$30>?%90w-2zEz%g6Qs-EkUTU+Gjz08xJ6a*|&VjRnNeN@>KJi4BI)- z=$=hA7~h{0Ps!a)`p%T*#nBO6vfOMv>aI0fojROmhWcBI{ogSX^+SRn=QOXRsncxX z&s!2R*^=f);!S?4r1x<_;8qm!)5^Arv`SG}ptnABhYA;n6ax~fm+4MaM>0!g?`OTZ zuN_~$3BQ!cnPQl zicyA?eWdJJIP^qw+{JQ{yc$JKI&ix!vq@aGW>(cY=~H+12zZonysZ^=9%%hg2^D}s zXurEN;(D3m^TIPWLb=Oq46ua3x+jSAOX%Vt756m+NN)FO=X!?K@14o{7RF52)pMU& zT&yO))~Ve=J-%3Iik0(xCw@vR<7Bf83$kA08JAX44>=&|mzE(xooVf$u4{I#K;2V5 zsSk5TbcjC&cjH`7fyW3w2l~4!Omi3-8AJ^eUYT+{ zrVo~CUwSwI{jPrGy5|e{Hj7E=Mh;x+7B}-aR%3hoAXA&dxT)0a z{-SNd!mf zZkjQEdk#aTqq$h&ph;gG-KeKR2EhVl2k`@0rtn;>n)_e%fp2M5W(Dl9m?9 zEhGKkUI0c`%L{=zagNEe7mnxmJ+)QalE+qqt#i%(_8PbD?Fdnwx!;W%%9rdW>ob(Ddn{GmGPTBY<{B2SBEvt zGMy-pj%j8uz+-|*Jytsr&Ua( zrto|+-_k8-$;Yom&-aR9@hU#z$SM8htMEUCB+*?VIc2=-wh=_iZ(fgjx@%l@Jwc@${WfCq7678SlA}DXU^F_#;7Usy)VZ4V&C#G#kysVy+)W z4yb?n0e4V1wKLas&Kb|YPmy$dLiF74%XhT;i7ule$&5Tuj*f?y9mq!a+hmq8#t|1S2Hcg7 zD-`xg0}oydR~w#NxNn>(jSBG=PvfT8yWe&jkIv-i zdvBfXqJk~{^i|H{KC2YouWp;iam#C*Hp>Ek0aHE$yq6+~;}c8P#4CS)?WZLqI4EsM z_>CR%LhEKx!nyf8K6OZ`MtEabkYTl;Zkz#XjQd|3Y9-Cewq8qtUE_~MPVC32IquI; zA>^1NiwwQ(ga^~_g3TiH~? z8a>!M_*uyuFZ~+rLd~Bh!p;s0Vj|NHm2y>4=QlzI`mt-9D9N{@6cfSTs}doV0l!lJ zD;FM~y>t8x|822Ttdpdur7QlS>do)yoHrldqqym?zHd@NAfxrRxhn#RfVeUigp{#%*CDndOd4JU)4k;#9~6cp8$7 z8JB$>Q7a;odKoEhr<3wSqyF9><4vKU&KBbi!`-RAI6)SIb|LCNo8s+AjYi!B;QTds z&t;6F1O*m7%kpXLnn|&st*uG#owEh6h5G4|bW58}tlI4l5B}pzXRVQob5#6C|25KT zwU72%M^2fgXr~M}s5cHMBbxSrGVsX*T-ri7v5?5#nwl4f$4+oXbn*P@FaG^_#xhUG zr$2Yo_vPK|nSP*>E4HNT%PZW&B!9UI{!XpoS5^+u=|}T0swaO9tfXDZuew>h<-5AN z4X`GX;z7F*f?I`RAMoOhSbHOPiplKB=d*!E2{nvt+`q=*9+vqVi=a0(E(_e3J+X@t z4F;P6Xe?g-_-3Alp^-MhrfvQ~J0Q18L4=0+?_qtl{>I3UxuJFO3gdA9rV)D2s95C;Fz_&q=eu6ds3S;I=M0Z=9mjfU7@Wu=>Q7v10g z=4oqB40{zaE+f^SPG-1`_ECH@HaPlyMoM5eIrRX*ED1b#_$W&c!oh`qrtey?bL`B+ z`u6|VaF?_*Pv%=L!4|I<4Q)q)*C+Rx-H9n78p`4l>i3_$`SSn-(MRr$USBxks=K+g zvJac4ZNP>D&p;Mx{Y*(*55-!s++*rkzlR1yD(wxU7I~$O16m{3 zUP8!Uzx`PRjS?3G$tj#7Stwde5yDJ%&!PvrSZ2gKXQc!8Z8Af!Oz7j;r?iVzqQawwPN|v(k0&Ol0e z$=O3K#YtF+wh;37=6>P3%ki7Mdg2|2|N3saN- z?Ve}}?W8gj$wHZQI$Ru^HHNa#^yLoR&lEe~)@stJga|U5q*eb0K}oxTOXUkoTL;gd zoWg+cpR`OI?+ZqmZ1{GSav4VxP}iU}4|0z8(5 ziCk_#^GnR~`WUL8^B?@5e#KTy8aTyagy&u9K-uK4gm7hXA6OY!e%IL~oCVEeN{s;5 z;}LK3{u^UR$lbwM)AuuUoc8_4Ecp&R_z?Sj)y=0h#GpN9A*TH)3QQRVh#XSnQ`H!_9Rv3$j6mQ62sY@6%cwu%0;Z$#cX*geF5F?CDP%*9k5Tjl6v>l&*gd35oL0`T-Jci-bv& zWmqatcET57NcPDtwPrCdt-#PHDUepy{J%9?{j(}~HQjpY1krtM@*%^BX9d@&K~%5c z_!!q38N?RR%}4$}ITYJRr#U3JB+A!Sc!m)jJP)4K4Di(P>em8ck6#yYo&H}~i9+XY z9BcLe^&x69Z2LmC-9dNSj0#U)1Gq~vqp6nA%OcekvT4{*FoFEnpnS~T@w$ZqR((;4 z8<(i8%h>FGJnM<@8leD*zDXmQ5$DK8lv9bnm%&A^pEFBy>Cwzw|AjjlRtQgGG!Y86 zqKTdM>)awNJU@y{_&ZhDwgdhT?-Q6R+J)<{WG0w}fe>qqsOu;>Tg2-Fu z^`<1HICA6m#ouGGsHA;#d_7*+uo4ms<%6)(hUV4+V_6fH-;^8K( z`4dhId{Fa~{}ZJUfLx;95z8rVR+kS@JlI8p%N}X$EVEU3Tl>Y2wej8rInw_*7CO1v z?M;bK^x_j7pcWH2Cbz~hc>}iQ++q^mhK};L0F?gz=-j*_x-K7#F`uASBi;d9O>j$a zV#B6)Nk$$#`+Fbo|B<3|Uly)!_D0km5<;p`9&&TrFk)NZm7rNh{I-G#AnR4U|Jw^V zJ-S`Mr#EGLX~`T@0Z)^7V$w!!AtY{K{E%|2ii)xlB+v=L9_A?29$ zXY)go3CypR@y-gB+IHcP>Q6Pn89i_Dit)Z;OJr|T6FB(_gur8ADtYHOJ) zCG2dj7kq7JmJT2C5!R@v0K;eem20EEMGP5grY{bj*gYE{{E@Fl<6H<91AlmzI-Sotn}M=?2Og`v;={&L@sz5py%nDQkJ$>U${JY>S7~juUY(!KYBfyxyH06c5PiAB|r3pPnyy8*`_Gn#px36^rbf149O9{ zt0#XH>!^iqN;2Iub8Dk9?0R)H@tbJwCDv#3HigX5%576~SqTeVKdF(FHzav#tl97oSQ0Al$Mz8 zG|5-ag@Zm;tK7L<2lw#9DpzkGEqn z7uVce;s$w3JRI?ooVoK^bl|pj522S-qI~U?pr>(9Ic1a$(m~U)MrV)A!VEbZ$LWVb z*^f3BUqmPk09Pk0J7?V_-;kPYexfDN$O*(DyJ8`l1#9Yl#VDQo2g%p}h9(H_u#uWW zzPlU$<&;)%g%R}mkq8p7dH?k!44+HyV`ofAwX+sWW&Lkw?j&;V{ z;68EfWru

XRPzRJugrIelF+8q*<`P5 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

*!#O^`>aI8creg;^))@ANGt0foxn%2uTyeZ( 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 diff --git a/NEWS b/NEWS index 6c34a0c28..c4138d3d1 100644 --- a/NEWS +++ b/NEWS @@ -1,10 +1,17 @@ 2.2.4 (2014-MM-DD) ------------------ +Enhancements + - now able to emails to address book on send (#1496) + - Sieve folder encoding is now configurable (#2622) + - SOGo version is now displayed in preferences window (#2612) + Bug fixes - fixed saved HTML content of draft when attaching a file - fixed text nodes of HTML content handler by encoding HTML entities - fixed iCal7 delegation issue with the "inbox" folder (#2489) + - fixed birth date validity checks (#1636) + - fixed URL handling (#2616) 2.2.3 (2014-04-03) ------------------ From 068eb921aa473239b48115ef0abaac523ad28854 Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Wed, 9 Apr 2014 10:48:47 -0400 Subject: [PATCH 043/144] rebase and fix comments made by extrafu --- SoObjects/SOGo/SOGoSieveManager.m | 2 +- UI/PreferencesUI/UIxPreferences.m | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/SoObjects/SOGo/SOGoSieveManager.m b/SoObjects/SOGo/SOGoSieveManager.m index 765ad32d6..3254e70ce 100644 --- a/SoObjects/SOGo/SOGoSieveManager.m +++ b/SoObjects/SOGo/SOGoSieveManager.m @@ -755,7 +755,7 @@ static NSString *sieveScriptName = @"sogo"; return nil; } - return client; + return [client autorelease]; } diff --git a/UI/PreferencesUI/UIxPreferences.m b/UI/PreferencesUI/UIxPreferences.m index c5b86abb7..94723a047 100644 --- a/UI/PreferencesUI/UIxPreferences.m +++ b/UI/PreferencesUI/UIxPreferences.m @@ -1219,12 +1219,12 @@ static NSArray *reminderValues = nil; SOGoMailAccounts *folder; SOGoSieveManager *manager; - if (client == nil) + if (!client) { folder = [[self clientObject] mailAccountsFolder: @"Mail" inContext: context]; account = [folder lookupName: @"0" inContext: context acquire: NO]; manager = [SOGoSieveManager sieveManagerForUser: [context activeUser]]; - client = [manager clientForAccount: account]; + client = [[manager clientForAccount: account] retain]; } return client; From ab80e87a3fcd86a7b211bbae5e8033d5a6c39d4a Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 9 Apr 2014 10:57:56 -0400 Subject: [PATCH 044/144] Applied patches from #2700 --- ActiveSync/SOGoActiveSyncDispatcher.m | 29 +++++++++++++++++++++------ NEWS | 1 + SoObjects/Mailer/SOGoMailFolder.m | 16 +++++++++++---- 3 files changed, 36 insertions(+), 10 deletions(-) diff --git a/ActiveSync/SOGoActiveSyncDispatcher.m b/ActiveSync/SOGoActiveSyncDispatcher.m index 7d99cebc5..d2509bae2 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher.m +++ b/ActiveSync/SOGoActiveSyncDispatcher.m @@ -212,11 +212,18 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. accountsFolder = [userFolder lookupName: @"Mail" inContext: context acquire: NO]; currentFolder = [accountsFolder lookupName: @"0" inContext: context acquire: NO]; - - newFolder = [currentFolder lookupName: [NSString stringWithFormat: @"folder%@", [displayName stringByEncodingImap4FolderName]] - inContext: context - acquire: NO]; - + + // If the parrent is 0 -> ok ; otherwise need to build the foldername based on parentId + displayName + if ([parentId isEqualToString: @"0"]) + newFolder = [currentFolder lookupName: [NSString stringWithFormat: @"folder%@", [displayName stringByEncodingImap4FolderName]] + inContext: context + acquire: NO]; + else + newFolder = [currentFolder lookupName: [NSString stringWithFormat: @"folder%@/%@", [[parentId stringByUnescapingURL] substringFromIndex: 5], + [displayName stringByEncodingImap4FolderName]] + inContext: context + acquire: NO]; + // FIXME // handle exists (status == 2) // handle right synckey @@ -380,7 +387,17 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. inContext: context acquire: NO]; - error = [folderToUpdate renameTo: displayName]; + // If parent is 0 or displayname is not changed it is either a rename of a folder in 0 or a move to 0 + if ([parentId isEqualToString: @"0"] || + ([serverId hasSuffix: [NSString stringWithFormat: @"/%@", displayName]] && [parentId isEqualToString: @"0"])) + { + error = [folderToUpdate renameTo: [NSString stringWithFormat: @"/%@", [displayName stringByEncodingImap4FolderName]]]; + } + else + { + error = [folderToUpdate renameTo: [NSString stringWithFormat: @"%@/%@", [[parentId stringByUnescapingURL] substringFromIndex: 5], + [displayName stringByEncodingImap4FolderName]]]; + } // Handle new name exist if (!error) diff --git a/NEWS b/NEWS index c4138d3d1..962e44763 100644 --- a/NEWS +++ b/NEWS @@ -12,6 +12,7 @@ Bug fixes - fixed iCal7 delegation issue with the "inbox" folder (#2489) - fixed birth date validity checks (#1636) - fixed URL handling (#2616) + - improved folder rename operations using ActiveSync (#2700) 2.2.3 (2014-04-03) ------------------ diff --git a/SoObjects/Mailer/SOGoMailFolder.m b/SoObjects/Mailer/SOGoMailFolder.m index 7f45ec814..64088280c 100644 --- a/SoObjects/Mailer/SOGoMailFolder.m +++ b/SoObjects/Mailer/SOGoMailFolder.m @@ -291,10 +291,18 @@ static NSString *defaultUserID = @"anyone"; path = [[imap4URL path] stringByDeletingLastPathComponent]; if (![path hasSuffix: @"/"]) path = [path stringByAppendingString: @"/"]; - destURL = [[NSURL alloc] initWithScheme: [imap4URL scheme] - host: [imap4URL host] - path: [NSString stringWithFormat: @"%@%@", - path, [newName stringByEncodingImap4FolderName]]]; + + // If new name contains the path - dont't need to add + if ([newName rangeOfString: @"/"].location == NSNotFound) + destURL = [[NSURL alloc] initWithScheme: [imap4URL scheme] + host: [imap4URL host] + path: [NSString stringWithFormat: @"%@%@", + path, [newName stringByEncodingImap4FolderName]]]; + else + destURL = [[NSURL alloc] initWithScheme: [imap4URL scheme] + host: [imap4URL host] + path: [NSString stringWithFormat: @"%@", + [newName stringByEncodingImap4FolderName]]]; [destURL autorelease]; error = [imap4 moveMailboxAtURL: imap4URL toURL: destURL]; From 0ba59de88e48824f5ae8160e134429246d6a8049 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 9 Apr 2014 11:09:13 -0400 Subject: [PATCH 045/144] Fixed formatting/warnings in previous commit. --- UI/PreferencesUI/UIxPreferences.m | 51 ++++++++++++++++--------------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/UI/PreferencesUI/UIxPreferences.m b/UI/PreferencesUI/UIxPreferences.m index 94723a047..87059c608 100644 --- a/UI/PreferencesUI/UIxPreferences.m +++ b/UI/PreferencesUI/UIxPreferences.m @@ -1232,7 +1232,7 @@ static NSArray *reminderValues = nil; - (BOOL) isSieveServerAvailable { - return (([[self sieveClient] isConnected]) + return (([(NGSieveClient *)[self sieveClient] isConnected]) ? true : false); } @@ -1247,34 +1247,37 @@ static NSArray *reminderValues = nil; request = [context request]; if ([[request method] isEqualToString: @"POST"]) - { - dd = [[context activeUser] domainDefaults]; - if ([dd sieveScriptsEnabled]) - [userDefaults setSieveFilters: sieveFilters]; - if ([dd vacationEnabled]) - [userDefaults setVacationOptions: vacationOptions]; - if ([dd forwardEnabled]) - [userDefaults setForwardOptions: forwardOptions]; - - if([self isSieveServerAvailable]) { - [userDefaults synchronize]; - folder = [[self clientObject] mailAccountsFolder: @"Mail" - inContext: context]; - account = [folder lookupName: @"0" inContext: context acquire: NO]; + dd = [[context activeUser] domainDefaults]; + if ([dd sieveScriptsEnabled]) + [userDefaults setSieveFilters: sieveFilters]; + if ([dd vacationEnabled]) + [userDefaults setVacationOptions: vacationOptions]; + if ([dd forwardEnabled]) + [userDefaults setForwardOptions: forwardOptions]; - if([account updateFilters]) - results = [self responseWithStatus: 200 andJSONRepresentation: [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:hasChanged], @"hasChanged", nil]]; - - else - results = [self responseWithStatus: 502 andJSONRepresentation:[NSDictionary dictionaryWithObjectsAndKeys: @"Connection error", @"textStatus", nil]]; - } + if ([self isSieveServerAvailable]) + { + [userDefaults synchronize]; + folder = [[self clientObject] mailAccountsFolder: @"Mail" + inContext: context]; + account = [folder lookupName: @"0" inContext: context acquire: NO]; + + if ([account updateFilters]) + results = [self responseWithStatus: 200 + andJSONRepresentation: [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:hasChanged], @"hasChanged", nil]]; + + else + results = [self responseWithStatus: 502 + andJSONRepresentation: [NSDictionary dictionaryWithObjectsAndKeys: @"Connection error", @"textStatus", nil]]; + } else - results = [self responseWithStatus: 503 andJSONRepresentation:[NSDictionary dictionaryWithObjectsAndKeys: @"Service temporarily unavailable", @"textStatus", nil]]; - } + results = [self responseWithStatus: 503 + andJSONRepresentation: [NSDictionary dictionaryWithObjectsAndKeys: @"Service temporarily unavailable", @"textStatus", nil]]; + } else results = self; - + return results; } From 8909775cf653ec3edef69ff02102947acf866e30 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 9 Apr 2014 12:19:23 -0400 Subject: [PATCH 046/144] Fix for #2680 --- ActiveSync/SOGoActiveSyncDispatcher.m | 12 ++++++++++++ NEWS | 1 + 2 files changed, 13 insertions(+) diff --git a/ActiveSync/SOGoActiveSyncDispatcher.m b/ActiveSync/SOGoActiveSyncDispatcher.m index d2509bae2..b1b8e4eeb 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher.m +++ b/ActiveSync/SOGoActiveSyncDispatcher.m @@ -1437,11 +1437,23 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. { NSString *folderId, *itemId, *realCollectionId; SOGoMicrosoftActiveSyncFolderType folderType; + id value; folderId = [[(id)[theDocumentElement getElementsByTagName: @"FolderId"] lastObject] textValue]; itemId = [[(id)[theDocumentElement getElementsByTagName: @"ItemId"] lastObject] textValue]; realCollectionId = [folderId realCollectionIdWithFolderType: &folderType]; + value = [theDocumentElement getElementsByTagName: @"ReplaceMime"]; + + // ReplaceMime isn't specified so we must NOT use the server copy + // but rather take the data as-is from the client. + if (![value count]) + { + [self processSendMail: theDocumentElement + inResponse: theResponse]; + return; + } + if (folderType == ActiveSyncMailFolder) { SOGoMailAccounts *accountsFolder; diff --git a/NEWS b/NEWS index 962e44763..71b9e9217 100644 --- a/NEWS +++ b/NEWS @@ -13,6 +13,7 @@ Bug fixes - fixed birth date validity checks (#1636) - fixed URL handling (#2616) - improved folder rename operations using ActiveSync (#2700) + - fixed SmartReply/Forward when ReplaceMime was omitted (#2680) 2.2.3 (2014-04-03) ------------------ From 96ece873caad0b735147637435545d0721b06368 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 9 Apr 2014 14:49:31 -0400 Subject: [PATCH 047/144] Fix for bug #2654 --- ActiveSync/iCalRecurrenceRule+ActiveSync.m | 2 +- NEWS | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ActiveSync/iCalRecurrenceRule+ActiveSync.m b/ActiveSync/iCalRecurrenceRule+ActiveSync.m index 18bdf595c..8e7cf57cb 100644 --- a/ActiveSync/iCalRecurrenceRule+ActiveSync.m +++ b/ActiveSync/iCalRecurrenceRule+ActiveSync.m @@ -79,7 +79,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. for (i = 0; i < 7; i++) { - if (occurrences[i]) + if (occurrences[0][i]) v += (1 << i); } diff --git a/NEWS b/NEWS index 71b9e9217..cbb1ec68d 100644 --- a/NEWS +++ b/NEWS @@ -14,6 +14,7 @@ Bug fixes - fixed URL handling (#2616) - improved folder rename operations using ActiveSync (#2700) - fixed SmartReply/Forward when ReplaceMime was omitted (#2680) + - fixed wrong generation of weekly repetitive events with ActiveSync (#2654) 2.2.3 (2014-04-03) ------------------ From 33467093c14074d1399dd4af0d1c633a24cfd609 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 9 Apr 2014 18:03:33 -0400 Subject: [PATCH 048/144] Fix for #2695 --- ActiveSync/NGDOMElement+ActiveSync.m | 35 ++++++++++++++++++++++++---- NEWS | 1 + 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/ActiveSync/NGDOMElement+ActiveSync.m b/ActiveSync/NGDOMElement+ActiveSync.m index 527486605..421db0a3c 100644 --- a/ActiveSync/NGDOMElement+ActiveSync.m +++ b/ActiveSync/NGDOMElement+ActiveSync.m @@ -37,6 +37,28 @@ static NSArray *asElementArray = nil; @implementation NGDOMElement (ActiveSync) +- (BOOL) isTextNode +{ + id children; + id element; + int i; + + if ([self nodeType] == DOM_TEXT_NODE) + return YES; + + children = [self childNodes]; + + for (i = 0; i < [children length]; i++) + { + element = [children objectAtIndex: i]; + + if ([element nodeType] != DOM_TEXT_NODE) + return NO; + } + + return YES; +} + // // We must handle "inner data" like this: // @@ -96,9 +118,13 @@ static NSArray *asElementArray = nil; tag = [element tagName]; count = [(NSArray *)[element childNodes] count]; - + + if ([element isTextNode]) + { + value = [element textValue]; + } // Handle inner data - see above for samples - if (count > 2) + else { NSMutableArray *innerElements; id innerElement; @@ -144,12 +170,11 @@ static NSArray *asElementArray = nil; value = nil; } } - else - value = [[element firstChild] textValue]; if (value && tag) [data setObject: value forKey: tag]; - } + + } // if ([element nodeType] == DOM_ELEMENT_NODE) } return data; diff --git a/NEWS b/NEWS index cbb1ec68d..28a1d133a 100644 --- a/NEWS +++ b/NEWS @@ -15,6 +15,7 @@ Bug fixes - improved folder rename operations using ActiveSync (#2700) - fixed SmartReply/Forward when ReplaceMime was omitted (#2680) - fixed wrong generation of weekly repetitive events with ActiveSync (#2654) + - fixed incorrect XML data conversion with ActiveSync (#2695) 2.2.3 (2014-04-03) ------------------ From 5739356f8884c005c5152d730807ecd1275d2426 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 9 Apr 2014 19:27:38 -0400 Subject: [PATCH 049/144] Fix tests to handle list-component --- Tests/Unit/TestVersit.m | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Tests/Unit/TestVersit.m b/Tests/Unit/TestVersit.m index 41cb7e67a..0897c94e7 100644 --- a/Tests/Unit/TestVersit.m +++ b/Tests/Unit/TestVersit.m @@ -146,10 +146,10 @@ element = [group firstChildWithTag: @"element"]; testEquals([element flattenedValueAtIndex: 0 forKey: @""], @"value"); - versit = @"BEGIN:GROUP1\r\nELEMENT:value1;value2\r\nEND:GROUP1"; + versit = @"BEGIN:GROUP1\r\nN:value1;value2\r\nEND:GROUP1"; group = [CardGroup parseSingleFromSource: versit]; testEquals([group versitString], versit); - element = [group firstChildWithTag: @"element"]; + element = [group firstChildWithTag: @"n"]; testEquals([element flattenedValueAtIndex: 0 forKey: @""], @"value1"); testEquals([element flattenedValueAtIndex: 1 forKey: @""], @"value2"); @@ -165,12 +165,12 @@ element = [group firstChildWithTag: @"element"]; testEquals([element valuesAtIndex: 0 forKey: @""], ([NSArray arrayWithObjects: @"value", @"with comma", nil])); - versit = @"BEGIN:GROUP1\r\nELEMENT:NAMED1=subvalue;NAMED2=subvalue1,subvalue2\r\nEND:GROUP1"; + versit = @"BEGIN:GROUP1\r\nN:NAMED1=subvalue;NAMED2=subvalue1,subvalue2\r\nEND:GROUP1"; group = [CardGroup parseSingleFromSource: versit]; /* we avoid this test here as nothing guarantees that the order of named values will be preserved... */ // testEquals([group versitString], versit); - element = [group firstChildWithTag: @"element"]; + element = [group firstChildWithTag: @"n"]; testEquals([element flattenedValueAtIndex: 0 forKey: @"NAMED1"], @"subvalue"); testEquals([element valuesAtIndex: 0 forKey: @"named2"], ([NSArray arrayWithObjects: @"subvalue1", @"subvalue2", nil])); From 0d1c39ca71a237d0fe065ede471842b9ea5132e5 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 9 Apr 2014 20:12:19 -0400 Subject: [PATCH 050/144] Added new configuration parameter to limit the window size --- ActiveSync/SOGoActiveSyncDispatcher+Sync.m | 7 ++++++- Documentation/SOGo Installation Guide.odt | Bin 160737 -> 160856 bytes NEWS | 2 ++ SoObjects/SOGo/SOGoSystemDefaults.h | 1 + SoObjects/SOGo/SOGoSystemDefaults.m | 5 +++++ 5 files changed, 14 insertions(+), 1 deletion(-) diff --git a/ActiveSync/SOGoActiveSyncDispatcher+Sync.m b/ActiveSync/SOGoActiveSyncDispatcher+Sync.m index 2a2382ffa..396c2668a 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher+Sync.m +++ b/ActiveSync/SOGoActiveSyncDispatcher+Sync.m @@ -767,7 +767,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NSMutableString *changeBuffer, *commandsBuffer; BOOL getChanges, first_sync; - unsigned int windowSize; + unsigned int windowSize, v; changeBuffer = [NSMutableString string]; commandsBuffer = [NSMutableString string]; @@ -783,6 +783,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. if (windowSize == 0 || windowSize > 512) windowSize = 100; + + // We check if we must overwrite the windowSize with a system preference. This can be useful + // if the user population has large mailboxes and slow connectivity + if ((v = [[SOGoSystemDefaults sharedSystemDefaults] maximumSyncWindowSize])) + windowSize = v; lastServerKey = nil; diff --git a/Documentation/SOGo Installation Guide.odt b/Documentation/SOGo Installation Guide.odt index 87fef43a0897eb4b21be5cb8a3e92f6fe506b230..b6bb0afb8c5bc5c0912ba77fb0de037484aa8f58 100644 GIT binary patch delta 58214 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 delta 58101 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 b&r9<+6-D!Yt&AJY Date: Thu, 10 Apr 2014 06:59:18 -0400 Subject: [PATCH 051/144] Properly escape attendee names in case they contain HTML entities --- ActiveSync/iCalEvent+ActiveSync.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ActiveSync/iCalEvent+ActiveSync.m b/ActiveSync/iCalEvent+ActiveSync.m index 8b15a6d8d..0a8ea7a56 100644 --- a/ActiveSync/iCalEvent+ActiveSync.m +++ b/ActiveSync/iCalEvent+ActiveSync.m @@ -160,7 +160,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. attendee = [attendees objectAtIndex: i]; [s appendFormat: @"%@", [attendee rfc822Email]]; - [s appendFormat: @"%@", [attendee cn]]; + [s appendFormat: @"%@", [[attendee cn] activeSyncRepresentationInContext: context]]; attendee_status = [self _attendeeStatus: attendee]; From 75ee6b48062864c9d907bf41996a7b8be3668387 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 10 Apr 2014 08:44:44 -0400 Subject: [PATCH 052/144] Fixed once more true/false errors --- UI/PreferencesUI/UIxPreferences.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/UI/PreferencesUI/UIxPreferences.m b/UI/PreferencesUI/UIxPreferences.m index 87059c608..b5338e4a1 100644 --- a/UI/PreferencesUI/UIxPreferences.m +++ b/UI/PreferencesUI/UIxPreferences.m @@ -1063,7 +1063,7 @@ static NSArray *reminderValues = nil; obj = [vacationOptions objectForKey: @"ignoreLists"]; if (obj == nil) - ignore = YES; // defaults to true + ignore = YES; // defaults to YES else ignore = [obj boolValue]; @@ -1233,8 +1233,8 @@ static NSArray *reminderValues = nil; - (BOOL) isSieveServerAvailable { return (([(NGSieveClient *)[self sieveClient] isConnected]) - ? true - : false); + ? YES + : NO); } - (id ) defaultAction From f370ac114a69281ab4a61927fc2781122e22998e Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 10 Apr 2014 09:24:43 -0400 Subject: [PATCH 053/144] Now include message/rfc822 parts as attachments when forwarding mails --- SoObjects/Mailer/SOGoMailObject.m | 3 +++ 1 file changed, 3 insertions(+) diff --git a/SoObjects/Mailer/SOGoMailObject.m b/SoObjects/Mailer/SOGoMailObject.m index 4ec55af30..f2fa35eac 100644 --- a/SoObjects/Mailer/SOGoMailObject.m +++ b/SoObjects/Mailer/SOGoMailObject.m @@ -770,6 +770,9 @@ static BOOL debugSoParts = NO; [mimeType hasPrefix: @"image/"] || [mimeType hasPrefix: @"video/"]) filename = [NSString stringWithFormat: @"unknown_%@", path]; + else if ([mimeType isEqualToString: @"message/rfc822"]) + filename = [NSString stringWithFormat: @"email_%@.eml", path]; + if (filename) { From e66ceaad0770c8487fafef96566cb263df970f55 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 10 Apr 2014 09:40:25 -0400 Subject: [PATCH 054/144] Fixed gcc warnings and added some rationale around yesterday's fix --- ActiveSync/NGDOMElement+ActiveSync.m | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ActiveSync/NGDOMElement+ActiveSync.m b/ActiveSync/NGDOMElement+ActiveSync.m index 421db0a3c..1a44e8a95 100644 --- a/ActiveSync/NGDOMElement+ActiveSync.m +++ b/ActiveSync/NGDOMElement+ActiveSync.m @@ -119,9 +119,13 @@ static NSArray *asElementArray = nil; tag = [element tagName]; count = [(NSArray *)[element childNodes] count]; - if ([element isTextNode]) + // We check if the node is a text one or if all its + // children are text nodes. This is important to avoid side-effects + // in SOPE where "foo & bar" would result into 3 childnodes instead + // of just one. + if ([(id)element isTextNode]) { - value = [element textValue]; + value = [(id)element textValue]; } // Handle inner data - see above for samples else From cfc1ac6b3baa1d1c0753104ec7a05184209a65a6 Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Thu, 10 Apr 2014 10:01:58 -0400 Subject: [PATCH 055/144] Add missing localizable string --- UI/PreferencesUI/English.lproj/Localizable.strings | 1 + UI/Templates/PreferencesUI/UIxPreferences.wox | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/UI/PreferencesUI/English.lproj/Localizable.strings b/UI/PreferencesUI/English.lproj/Localizable.strings index 99a3c2258..66f8729e0 100644 --- a/UI/PreferencesUI/English.lproj/Localizable.strings +++ b/UI/PreferencesUI/English.lproj/Localizable.strings @@ -129,6 +129,7 @@ "Label" = "Label"; "Show subscribed mailboxes only" = "Show subscribed mailboxes only"; "Sort messages by threads" = "Sort messages by threads"; +"When sending mail, add unknown recipients to my" = "When sending mail, add unknown recipients to my"; "Check for new mail:" = "Check for new mail:"; "messagecheck_manually" = "Manually"; "messagecheck_every_minute" = "Every minute"; diff --git a/UI/Templates/PreferencesUI/UIxPreferences.wox b/UI/Templates/PreferencesUI/UIxPreferences.wox index ebed82bbd..fbfc0b30a 100644 --- a/UI/Templates/PreferencesUI/UIxPreferences.wox +++ b/UI/Templates/PreferencesUI/UIxPreferences.wox @@ -300,7 +300,7 @@ const:name="addOutgoingAddresses" const:id="addOutgoingAddresses" var:checked="addOutgoingAddresses" /> - +
Date: Thu, 10 Apr 2014 10:05:28 -0400 Subject: [PATCH 056/144] Fix CSS in contact editor and preferences module --- UI/Templates/ContactsUI/UIxContactEditor.wox | 1 + UI/WebServerResources/UIxContactEditor.css | 9 --------- UI/WebServerResources/UIxPreferences.css | 8 ++------ 3 files changed, 3 insertions(+), 15 deletions(-) diff --git a/UI/Templates/ContactsUI/UIxContactEditor.wox b/UI/Templates/ContactsUI/UIxContactEditor.wox index 6d3532887..75bbae736 100644 --- a/UI/Templates/ContactsUI/UIxContactEditor.wox +++ b/UI/Templates/ContactsUI/UIxContactEditor.wox @@ -19,6 +19,7 @@

+ Date: Thu, 10 Apr 2014 12:25:42 -0400 Subject: [PATCH 057/144] Fix display of category of events Fixes #2703 --- NEWS | 1 + UI/WebServerResources/SchedulerUI.js | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 82c7f5bfa..1e64cf736 100644 --- a/NEWS +++ b/NEWS @@ -18,6 +18,7 @@ Bug fixes - fixed SmartReply/Forward when ReplaceMime was omitted (#2680) - fixed wrong generation of weekly repetitive events with ActiveSync (#2654) - fixed incorrect XML data conversion with ActiveSync (#2695) + - fixed display of events having a category with HTML entities (#2703) 2.2.3 (2014-04-03) ------------------ diff --git a/UI/WebServerResources/SchedulerUI.js b/UI/WebServerResources/SchedulerUI.js index 1b5e96a16..897d21a06 100644 --- a/UI/WebServerResources/SchedulerUI.js +++ b/UI/WebServerResources/SchedulerUI.js @@ -1794,10 +1794,11 @@ function newBaseEventDIV(eventRep, event, eventText) { createElement("img", null, null, {src: ResourcesURL + "/alarm.png"}, null, iconSpan); if (event[10] != null) { - var categoryStyle = categoriesStyles.get(event[10]); + var category = event[10].decodeEntities(); + var categoryStyle = categoriesStyles.get(category); if (!categoryStyle) { categoryStyle = 'category_' + categoriesStyles.keys().length; - categoriesStyles.set([event[10]], categoryStyle); + categoriesStyles.set([category], categoryStyle); } innerDiv.addClassName(categoryStyle); } From 49363cfe364ccf5add432f6375895ee283149dab Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Fri, 11 Apr 2014 21:37:55 -0400 Subject: [PATCH 058/144] Update datepicker to latest version From https://github.com/eternicode/bootstrap-datepicker/ --- NEWS | 1 + UI/WebServerResources/UIxAppointmentEditor.js | 15 +- UI/WebServerResources/UIxContactEditor.js | 145 +- UI/WebServerResources/UIxTaskEditor.js | 367 ++-- UI/WebServerResources/datepicker.css | 455 +++-- UI/WebServerResources/datepicker.js | 1646 +++++++++++++---- 6 files changed, 1776 insertions(+), 853 deletions(-) diff --git a/NEWS b/NEWS index 1e64cf736..629313fcd 100644 --- a/NEWS +++ b/NEWS @@ -7,6 +7,7 @@ Enhancements - SOGo version is now displayed in preferences window (#2612) - added the SOGoMaximumSyncWindowSize system default to overwrite the maximum number of items returned during an ActiveSync sync operation +- updated datepicker Bug fixes - fixed saved HTML content of draft when attaching a file diff --git a/UI/WebServerResources/UIxAppointmentEditor.js b/UI/WebServerResources/UIxAppointmentEditor.js index 98af88261..24c2c92b1 100644 --- a/UI/WebServerResources/UIxAppointmentEditor.js +++ b/UI/WebServerResources/UIxAppointmentEditor.js @@ -293,8 +293,11 @@ function setEndDate(newEndDate) { function onAdjustTime(event) { var endDate = window.getEndDate(); var startDate = window.getStartDate(); - - if ($(this).readAttribute("id").startsWith("start")) { + var input = $(this); + if (input.tagName != 'INPUT') + input = input.down('input'); + + if (input.id.startsWith("start")) { // Start date was changed if (startDate == null) { var oldStartDate = window.getShadowStartDate(); @@ -350,15 +353,15 @@ function initTimeWidgets(widgets) { this.timeWidgets = widgets; if (widgets['start']['date']) { - jQuery(widgets['start']['date']).closest('.date').datepicker({autoclose: true, weekStart: firstDayOfWeek}); - jQuery(widgets['start']['date']).change(onAdjustTime); + jQuery(widgets['start']['date']).closest('.date').datepicker({autoclose: true, weekStart: firstDayOfWeek}) + .on('changeDate', onAdjustTime); widgets['start']['time'].on("time:change", onAdjustTime); widgets['start']['time'].addInterface(SOGoTimePickerInterface); } if (widgets['end']['date']) { - jQuery(widgets['end']['date']).closest('.date').datepicker({autoclose: true, weekStart: firstDayOfWeek}); - jQuery(widgets['end']['date']).change(onAdjustTime); + jQuery(widgets['end']['date']).closest('.date').datepicker({autoclose: true, weekStart: firstDayOfWeek}) + .on('changeDate', onAdjustTime); widgets['end']['time'].on("time:change", onAdjustTime); widgets['end']['time'].addInterface(SOGoTimePickerInterface); } diff --git a/UI/WebServerResources/UIxContactEditor.js b/UI/WebServerResources/UIxContactEditor.js index 2ea317035..0488cb154 100644 --- a/UI/WebServerResources/UIxContactEditor.js +++ b/UI/WebServerResources/UIxContactEditor.js @@ -1,25 +1,25 @@ /* -*- Mode: js2-mode; tab-width: 4; c-label-minimum-indentation: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* - Copyright (C) 2005 SKYRIX Software AG - Copyright (C) 2006-2011 Inverse + Copyright (C) 2005 SKYRIX Software AG + Copyright (C) 2006-2011 Inverse - This file is part of OpenGroupware.org. + 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 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. + 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. + 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. */ var dateRegex = /^(([0-9]{2})?[0-9])?[0-9]-[0-9]?[0-9]-[0-9]?[0-9]$/; @@ -78,38 +78,35 @@ function copyContact(type, email, uid, sn, displayname, }; function validateContactEditor() { - var rc = true; + var rc = true; - var e = $('mail'); - if (e.value.length > 0 - && !emailRE.test(e.value)) { - alert(_("invalidemailwarn")); - rc = false; - } + var e = $('mail'); + if (e.value.length > 0 + && !emailRE.test(e.value)) { + alert(_("invalidemailwarn")); + rc = false; + } - e = $('mozillasecondemail'); - if (e.value.length > 0 - && !emailRE.test(e.value)) { - alert(_("invalidemailwarn")); - rc = false; - } - return rc + e = $('mozillasecondemail'); + if (e.value.length > 0 + && !emailRE.test(e.value)) { + alert(_("invalidemailwarn")); + rc = false; + } + return rc } -this.initTimeWidgets = function (widgets) { - this.timeWidgets = widgets; - var firstDay = new Date(); - firstDay.setFullYear(1900,0,1); - var lastDay = new Date(); - - jQuery(widgets['birthday']['date']).closest('.date').datepicker({autoclose: true, - weekStart: 0, - endDate: lastDay, - startDate: firstDay, - setStartDate: lastDay, - startView: 2, - position: "below-shifted-left"}); -}; +function initTimeWidget(input) { + var firstDay = new Date(); + firstDay.setFullYear(1900,0,1); + var lastDay = new Date(); + + jQuery(input).closest('.date').datepicker({autoclose: true, + endDate: lastDay, + startDate: firstDay, + setStartDate: lastDay, + startView: 2}) +} function onDisplaynameKeyDown() { var fn = $("displayname"); @@ -269,43 +266,41 @@ function onEmptyCategoryClick(event) { } function initEditorForm() { - var tabsContainer = $("editorTabs"); - var controller = new SOGoTabsController(); - controller.attachToTabsContainer(tabsContainer); + var tabsContainer = $("editorTabs"); + var controller = new SOGoTabsController(); + controller.attachToTabsContainer(tabsContainer); - displaynameChanged = ($("displayname").value.length > 0); - $("displayname").onkeydown = onDisplaynameKeyDown; - $("sn").onkeyup = onDisplaynameNewValue; - $("givenname").onkeyup = onDisplaynameNewValue; + displaynameChanged = ($("displayname").value.length > 0); + $("displayname").onkeydown = onDisplaynameKeyDown; + $("sn").onkeyup = onDisplaynameNewValue; + $("givenname").onkeyup = onDisplaynameNewValue; - $("cancelButton").observe("click", onEditorCancelClick); - var submitButton = $("submitButton"); - if (submitButton) { - submitButton.observe("click", onEditorSubmitClick); - } - - Event.observe(document, "keydown", onDocumentKeydown); - - if (typeof(gCategories) != "undefined") { - regenerateCategoriesMenu(); - } - var catsInput = $("jsonContactCategories"); - if (catsInput && catsInput.value.length > 0) { - var contactCats = $(catsInput.value.evalJSON(false)); - for (var i = 0; i < contactCats.length; i++) { - appendCategoryInput(contactCats[i]); + $("cancelButton").observe("click", onEditorCancelClick); + var submitButton = $("submitButton"); + if (submitButton) { + submitButton.observe("click", onEditorSubmitClick); } - } - var emptyCategory = $("emptyCategory"); - if (emptyCategory) { - emptyCategory.tabIndex = 10000; - emptyCategory.observe("click", onEmptyCategoryClick); - } - - var widgets = {'birthday': {'date': $("birthdayDate")}}; - initTimeWidgets(widgets); + Event.observe(document, "keydown", onDocumentKeydown); + if (typeof(gCategories) != "undefined") { + regenerateCategoriesMenu(); + } + var catsInput = $("jsonContactCategories"); + if (catsInput && catsInput.value.length > 0) { + var contactCats = $(catsInput.value.evalJSON(false)); + for (var i = 0; i < contactCats.length; i++) { + appendCategoryInput(contactCats[i]); + } + } + + var emptyCategory = $("emptyCategory"); + if (emptyCategory) { + emptyCategory.tabIndex = 10000; + emptyCategory.observe("click", onEmptyCategoryClick); + } + + initTimeWidget($("birthdayDate")); } document.observe("dom:loaded", initEditorForm); diff --git a/UI/WebServerResources/UIxTaskEditor.js b/UI/WebServerResources/UIxTaskEditor.js index be1be3eb9..38e0d0d30 100644 --- a/UI/WebServerResources/UIxTaskEditor.js +++ b/UI/WebServerResources/UIxTaskEditor.js @@ -3,169 +3,101 @@ var contactSelectorAction = 'calendars-contacts'; function uixEarlierDate(date1, date2) { - // can this be done in a sane way? - if (date1 && date2) { - if (date1.getYear() < date2.getYear()) return date1; - if (date1.getYear() > date2.getYear()) return date2; - // same year - if (date1.getMonth() < date2.getMonth()) return date1; - if (date1.getMonth() > date2.getMonth()) return date2; - // same month - if (date1.getDate() < date2.getDate()) return date1; - if (date1.getDate() > date2.getDate()) return date2; - } - // same day - return null; + // can this be done in a sane way? + if (date1 && date2) { + if (date1.getYear() < date2.getYear()) return date1; + if (date1.getYear() > date2.getYear()) return date2; + // same year + if (date1.getMonth() < date2.getMonth()) return date1; + if (date1.getMonth() > date2.getMonth()) return date2; + // same month + if (date1.getDate() < date2.getDate()) return date1; + if (date1.getDate() > date2.getDate()) return date2; + } + // same day + return null; } function validateDate(which, label) { - var result, dateValue; + var result, dateValue; - dateValue = this._getDate(which); - if (dateValue == null) { - alert(label); - result = false; - } else - result = dateValue; + dateValue = this._getDate(which); + if (dateValue == null) { + alert(label); + result = false; + } else + result = dateValue; - return result; + return result; } function validateTaskEditor() { - var e, startdate, enddate, tmpdate; + var e, startdate, enddate, tmpdate; - e = document.getElementById('summary'); - if (e.value.length == 0 - && !confirm(labels.validate_notitle)) - return false; + e = document.getElementById('summary'); + if (e.value.length == 0 + && !confirm(labels.validate_notitle)) + return false; - e = document.getElementById('startTime_date'); - if (!e.disabled) { - startdate = validateDate('start', labels.validate_invalid_startdate); - if (!startdate) - return false; - } - - e = document.getElementById('dueTime_date'); - if (!e.disabled) { - enddate = validateDate('due', labels.validate_invalid_enddate); - if (!enddate) - return false; - } - - if (startdate && enddate) { - tmpdate = uixEarlierDate(startdate, enddate); - if (tmpdate == enddate) { - // window.alert(cuicui); - alert(labels.validate_endbeforestart); - return false; + e = document.getElementById('startTime_date'); + if (!e.disabled) { + startdate = validateDate('start', labels.validate_invalid_startdate); + if (!startdate) + return false; } - else if (tmpdate == null /* means: same date */) { - // TODO: check time - var startHour, startMinute, endHour, endMinute; - var matches; + e = document.getElementById('dueTime_date'); + if (!e.disabled) { + enddate = validateDate('due', labels.validate_invalid_enddate); + if (!enddate) + return false; + } + + if (startdate && enddate) { + tmpdate = uixEarlierDate(startdate, enddate); + if (tmpdate == enddate) { + alert(labels.validate_endbeforestart); + return false; + } + else if (tmpdate == null /* means: same date */) { + // TODO: check time + + var startHour, startMinute, endHour, endMinute; + var matches; - matches = document.forms[0]['startTime_time'].value.match(/([0-9]+):([0-9]+)/); - if (matches) { - startHour = parseInt(matches[1]); - startMinute = parseInt(matches[2]); - matches = document.forms[0]['dueTime_time'].value.match(/([0-9]+):([0-9]+)/); + matches = document.forms[0]['startTime_time'].value.match(/([0-9]+):([0-9]+)/); if (matches) { - endHour = parseInt(matches[1]); - endMinute = parseInt(matches[2]); + startHour = parseInt(matches[1]); + startMinute = parseInt(matches[2]); + matches = document.forms[0]['dueTime_time'].value.match(/([0-9]+):([0-9]+)/); + if (matches) { + endHour = parseInt(matches[1]); + endMinute = parseInt(matches[2]); - if (startHour > endHour) { - alert(labels.validate_endbeforestart); - return false; - } - else if (startHour == endHour) { - if (startMinute > endMinute) { + if (startHour > endHour) { alert(labels.validate_endbeforestart); return false; } + else if (startHour == endHour) { + if (startMinute > endMinute) { + alert(labels.validate_endbeforestart); + return false; + } + } + } + else { + alert(labels.validate_invalid_enddate); + return false; } } else { - alert(labels.validate_invalid_enddate); + alert(labels.validate_invalid_startdate); return false; } } - else { - alert(labels.validate_invalid_startdate); - return false; - } - } - } - - 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 = _("Show Details"); - } else { - div.style.visibility = 'visible;'; - window.resizeBy(0, (div.clientHeight + buttonsHeight)); - $("detailsButton").innerHTML = _("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 addContact(tag, fullContactName, contactId, contactName, contactEmail) { - var uids = $('uixselector-participants-uidList'); - log ("contactId: " + contactId); - if (contactId) - { - var re = new RegExp("(^|,)" + contactId + "($|,)"); - - log ("uids: " + uids); - if (!re.test(uids.value)) - { - log ("no match... realling adding"); - if (uids.value.length > 0) - uids.value += ',' + contactId; - else - uids.value = contactId; - - var names = $('uixselector-participants-display'); - names.innerHTML += ('
  • ' - + contactName + '
  • '); - } - else - log ("match... ignoring contact"); } - return false; + return true; } function onTimeControlCheck(checkBox) { @@ -184,140 +116,141 @@ function onTimeControlCheck(checkBox) { } function saveEvent(sender) { - if (validateTaskEditor()) - document.forms['editform'].submit(); + if (validateTaskEditor()) + document.forms['editform'].submit(); - return false; + return false; } function startDayAsShortString() { - return dayAsShortDateString($('startTime_date')); + return dayAsShortDateString($('startTime_date')); } function dueDayAsShortString() { - return dayAsShortDateString($('dueTime_date')); + return dayAsShortDateString($('dueTime_date')); } this._getDate = function(which) { - var date = window.timeWidgets[which]['date'].inputAsDate(); - var time = window.timeWidgets[which]['time'].value.split(":"); - date.setHours(time[0]); - date.setMinutes(time[1]); + var date = window.timeWidgets[which]['date'].inputAsDate(); + var time = window.timeWidgets[which]['time'].value.split(":"); + date.setHours(time[0]); + date.setMinutes(time[1]); - if (isNaN(date.getTime())) - return null; + if (isNaN(date.getTime())) + return null; - return date; + return date; }; this._getShadowDate = function(which) { - var date = window.timeWidgets[which]['date'].getAttribute("shadow-value").asDate(); - var time = window.timeWidgets[which]['time'].getAttribute("shadow-value").split(":"); - date.setHours(time[0]); - date.setMinutes(time[1]); + var date = window.timeWidgets[which]['date'].getAttribute("shadow-value").asDate(); + var time = window.timeWidgets[which]['time'].getAttribute("shadow-value").split(":"); + date.setHours(time[0]); + date.setMinutes(time[1]); - return date; + return date; }; this.getStartDate = function() { - return this._getDate('start'); + return this._getDate('start'); }; this.getDueDate = function() { - return this._getDate('due'); + return this._getDate('due'); }; this.getShadowStartDate = function() { - return this._getShadowDate('start'); + return this._getShadowDate('start'); }; this.getShadowDueDate = function() { - return this._getShadowDate('due'); + return this._getShadowDate('due'); }; this._setDate = function(which, newDate) { - window.timeWidgets[which]['date'].setInputAsDate(newDate); - window.timeWidgets[which]['time'].value = newDate.getDisplayHoursString(); + window.timeWidgets[which]['date'].setInputAsDate(newDate); + window.timeWidgets[which]['time'].value = newDate.getDisplayHoursString(); - // Update date picker - var dateComponent = jQuery(window.timeWidgets[which]['date']).closest('.date'); - dateComponent.data('date', window.timeWidgets[which]['date'].value); - dateComponent.datepicker('update'); + // Update date picker + var dateComponent = jQuery(window.timeWidgets[which]['date']).closest('.date'); + dateComponent.data('date', window.timeWidgets[which]['date'].value); + dateComponent.datepicker('update'); }; this.setStartDate = function(newStartDate) { - this._setDate('start', newStartDate); + this._setDate('start', newStartDate); }; this.setDueDate = function(newDueDate) { - this._setDate('due', newDueDate); + this._setDate('due', newDueDate); }; this.onAdjustTime = function(event) { - onAdjustDueTime(event); + onAdjustDueTime(event); }; this.onAdjustDueTime = function(event) { - if (!window.timeWidgets['due']['date'].disabled) { - var dateDelta = (window.getStartDate().valueOf() - - window.getShadowStartDate().valueOf()); - var newDueDate = new Date(window.getDueDate().valueOf() + dateDelta); - window.setDueDate(newDueDate); - } - window.timeWidgets['start']['date'].updateShadowValue(); - window.timeWidgets['start']['time'].updateShadowValue(); + if (!window.timeWidgets['due']['date'].disabled) { + var dateDelta = (window.getStartDate().valueOf() + - window.getShadowStartDate().valueOf()); + var newDueDate = new Date(window.getDueDate().valueOf() + dateDelta); + window.setDueDate(newDueDate); + } + window.timeWidgets['start']['date'].updateShadowValue(); + window.timeWidgets['start']['time'].updateShadowValue(); }; this.initTimeWidgets = function (widgets) { - this.timeWidgets = widgets; - - jQuery(widgets['start']['date']).closest('.date').datepicker({autoclose: true, weekStart: firstDayOfWeek}); - jQuery(widgets['due']['date']).closest('.date').datepicker({autoclose: true, weekStart: firstDayOfWeek}); - jQuery('#statusTime_date').closest('.date').datepicker({autoclose: true, weekStart: firstDayOfWeek}); + this.timeWidgets = widgets; - jQuery(widgets['start']['date']).change(onAdjustTime); - widgets['start']['time'].on("time:change", onAdjustDueTime); - widgets['start']['time'].addInterface(SOGoTimePickerInterface); - widgets['due']['time'].addInterface(SOGoTimePickerInterface); + jQuery(widgets['start']['date']).closest('.date').datepicker({autoclose: true, weekStart: firstDayOfWeek}) + .on('changeDate', onAdjustTime); + widgets['start']['time'].on("time:change", onAdjustDueTime); + widgets['start']['time'].addInterface(SOGoTimePickerInterface); + + jQuery(widgets['due']['date']).closest('.date').datepicker({autoclose: true, weekStart: firstDayOfWeek}); + widgets['due']['time'].addInterface(SOGoTimePickerInterface); + + jQuery('#statusTime_date').closest('.date').datepicker({autoclose: true, weekStart: firstDayOfWeek}); }; - + function onStatusListChange(event) { - var value = $("statusList").value; - var statusTimeDate = $("statusTime_date"); - var statusPercent = $("statusPercent"); + var value = $("statusList").value; + var statusTimeDate = $("statusTime_date"); + var statusPercent = $("statusPercent"); - if (value == "WONoSelectionString") { - statusTimeDate.disabled = true; - statusPercent.disabled = true; - statusPercent.value = ""; - } - else if (value == "0") { - statusTimeDate.disabled = true; - statusPercent.disabled = false; - } - else if (value == "1") { - statusTimeDate.disabled = true; - statusPercent.disabled = false; - } - else if (value == "2") { - statusTimeDate.disabled = false; - statusPercent.disabled = false; - statusPercent.value = "100"; - } - else if (value == "3") { - statusTimeDate.disabled = true; - statusPercent.disabled = true; - } - else { - statusTimeDate.disabled = true; - } + if (value == "WONoSelectionString") { + statusTimeDate.disabled = true; + statusPercent.disabled = true; + statusPercent.value = ""; + } + else if (value == "0") { + statusTimeDate.disabled = true; + statusPercent.disabled = false; + } + else if (value == "1") { + statusTimeDate.disabled = true; + statusPercent.disabled = false; + } + else if (value == "2") { + statusTimeDate.disabled = false; + statusPercent.disabled = false; + statusPercent.value = "100"; + } + else if (value == "3") { + statusTimeDate.disabled = true; + statusPercent.disabled = true; + } + else { + statusTimeDate.disabled = true; + } } function initializeStatusLine() { - var statusList = $("statusList"); - if (statusList) { - statusList.observe("change", onStatusListChange); - } + var statusList = $("statusList"); + if (statusList) { + statusList.observe("change", onStatusListChange); + } } function onTaskEditorLoad() { diff --git a/UI/WebServerResources/datepicker.css b/UI/WebServerResources/datepicker.css index 16d10d4be..6f061df8b 100644 --- a/UI/WebServerResources/datepicker.css +++ b/UI/WebServerResources/datepicker.css @@ -8,39 +8,75 @@ * */ .datepicker { - top: 0; - left: 0; padding: 4px; - margin-top: 1px; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; + direction: ltr; /*.dow { border-top: 1px solid #ddd !important; }*/ - } -.datepicker:before { +.datepicker-inline { + width: 220px; +} +.datepicker.datepicker-rtl { + direction: rtl; +} +.datepicker.datepicker-rtl table tr td span { + float: right; +} +.datepicker-dropdown { + top: 0; + left: 0; +} +.datepicker-dropdown:before { content: ''; display: inline-block; border-left: 7px solid transparent; border-right: 7px solid transparent; border-bottom: 7px solid #ccc; + border-top: 0; border-bottom-color: rgba(0, 0, 0, 0.2); position: absolute; - top: -7px; - left: 6px; } -.datepicker:after { +.datepicker-dropdown:after { content: ''; display: inline-block; border-left: 6px solid transparent; border-right: 6px solid transparent; border-bottom: 6px solid #ffffff; + border-top: 0; position: absolute; - top: -6px; +} +.datepicker-dropdown.datepicker-orient-left:before { + left: 6px; +} +.datepicker-dropdown.datepicker-orient-left:after { left: 7px; } +.datepicker-dropdown.datepicker-orient-right:before { + right: 6px; +} +.datepicker-dropdown.datepicker-orient-right:after { + right: 7px; +} +.datepicker-dropdown.datepicker-orient-top:before { + top: -7px; +} +.datepicker-dropdown.datepicker-orient-top:after { + top: -6px; +} +.datepicker-dropdown.datepicker-orient-bottom:before { + bottom: -7px; + border-bottom: 0; + border-top: 7px solid #999; +} +.datepicker-dropdown.datepicker-orient-bottom:after { + bottom: -6px; + border-bottom: 0; + border-top: 6px solid #ffffff; +} .datepicker > div { display: none; } @@ -55,6 +91,12 @@ } .datepicker table { margin: 0; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } .datepicker td, .datepicker th { @@ -64,25 +106,31 @@ -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; + border: none; } -.datepicker td.day:hover { +.table-striped .datepicker table tr td, +.table-striped .datepicker table tr th { + background-color: transparent; +} +.datepicker table tr td.day:hover, +.datepicker table tr td.day.focused { background: #eeeeee; cursor: pointer; } -.datepicker td.old, -.datepicker td.new { +.datepicker table tr td.old, +.datepicker table tr td.new { color: #999999; } -.datepicker td.disabled, -.datepicker td.disabled:hover { +.datepicker table tr td.disabled, +.datepicker table tr td.disabled:hover { background: none; color: #999999; cursor: default; } -.datepicker td.today, -.datepicker td.today:hover, -.datepicker td.today.disabled, -.datepicker td.today.disabled:hover { +.datepicker table tr td.today, +.datepicker table tr td.today:hover, +.datepicker table tr td.today.disabled, +.datepicker table tr td.today.disabled:hover { background-color: #fde19a; background-image: -moz-linear-gradient(top, #fdd49a, #fdf59a); background-image: -ms-linear-gradient(top, #fdd49a, #fdf59a); @@ -94,53 +142,112 @@ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0); border-color: #fdf59a #fdf59a #fbed50; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + color: #000; } -.datepicker td.today:hover, -.datepicker td.today:hover:hover, -.datepicker td.today.disabled:hover, -.datepicker td.today.disabled:hover:hover, -.datepicker td.today:active, -.datepicker td.today:hover:active, -.datepicker td.today.disabled:active, -.datepicker td.today.disabled:hover:active, -.datepicker td.today.active, -.datepicker td.today:hover.active, -.datepicker td.today.disabled.active, -.datepicker td.today.disabled:hover.active, -.datepicker td.today.disabled, -.datepicker td.today:hover.disabled, -.datepicker td.today.disabled.disabled, -.datepicker td.today.disabled:hover.disabled, -.datepicker td.today[disabled], -.datepicker td.today:hover[disabled], -.datepicker td.today.disabled[disabled], -.datepicker td.today.disabled:hover[disabled] { +.datepicker table tr td.today:hover, +.datepicker table tr td.today:hover:hover, +.datepicker table tr td.today.disabled:hover, +.datepicker table tr td.today.disabled:hover:hover, +.datepicker table tr td.today:active, +.datepicker table tr td.today:hover:active, +.datepicker table tr td.today.disabled:active, +.datepicker table tr td.today.disabled:hover:active, +.datepicker table tr td.today.active, +.datepicker table tr td.today:hover.active, +.datepicker table tr td.today.disabled.active, +.datepicker table tr td.today.disabled:hover.active, +.datepicker table tr td.today.disabled, +.datepicker table tr td.today:hover.disabled, +.datepicker table tr td.today.disabled.disabled, +.datepicker table tr td.today.disabled:hover.disabled, +.datepicker table tr td.today[disabled], +.datepicker table tr td.today:hover[disabled], +.datepicker table tr td.today.disabled[disabled], +.datepicker table tr td.today.disabled:hover[disabled] { background-color: #fdf59a; } -.datepicker td.today:active, -.datepicker td.today:hover:active, -.datepicker td.today.disabled:active, -.datepicker td.today.disabled:hover:active, -.datepicker td.today.active, -.datepicker td.today:hover.active, -.datepicker td.today.disabled.active, -.datepicker td.today.disabled:hover.active { +.datepicker table tr td.today:active, +.datepicker table tr td.today:hover:active, +.datepicker table tr td.today.disabled:active, +.datepicker table tr td.today.disabled:hover:active, +.datepicker table tr td.today.active, +.datepicker table tr td.today:hover.active, +.datepicker table tr td.today.disabled.active, +.datepicker table tr td.today.disabled:hover.active { background-color: #fbf069 \9; } -.datepicker td.range, -.datepicker td.range:hover, -.datepicker td.range.disabled, -.datepicker td.range.disabled:hover { +.datepicker table tr td.today:hover:hover { + color: #000; +} +.datepicker table tr td.today.active:hover { + color: #fff; +} +.datepicker table tr td.range, +.datepicker table tr td.range:hover, +.datepicker table tr td.range.disabled, +.datepicker table tr td.range.disabled:hover { background: #eeeeee; -webkit-border-radius: 0; -moz-border-radius: 0; border-radius: 0; } -.datepicker td.selected, -.datepicker td.selected:hover, -.datepicker td.selected.disabled, -.datepicker td.selected.disabled:hover { +.datepicker table tr td.range.today, +.datepicker table tr td.range.today:hover, +.datepicker table tr td.range.today.disabled, +.datepicker table tr td.range.today.disabled:hover { + background-color: #f3d17a; + background-image: -moz-linear-gradient(top, #f3c17a, #f3e97a); + background-image: -ms-linear-gradient(top, #f3c17a, #f3e97a); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f3c17a), to(#f3e97a)); + background-image: -webkit-linear-gradient(top, #f3c17a, #f3e97a); + background-image: -o-linear-gradient(top, #f3c17a, #f3e97a); + background-image: linear-gradient(top, #f3c17a, #f3e97a); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3c17a', endColorstr='#f3e97a', GradientType=0); + border-color: #f3e97a #f3e97a #edde34; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.datepicker table tr td.range.today:hover, +.datepicker table tr td.range.today:hover:hover, +.datepicker table tr td.range.today.disabled:hover, +.datepicker table tr td.range.today.disabled:hover:hover, +.datepicker table tr td.range.today:active, +.datepicker table tr td.range.today:hover:active, +.datepicker table tr td.range.today.disabled:active, +.datepicker table tr td.range.today.disabled:hover:active, +.datepicker table tr td.range.today.active, +.datepicker table tr td.range.today:hover.active, +.datepicker table tr td.range.today.disabled.active, +.datepicker table tr td.range.today.disabled:hover.active, +.datepicker table tr td.range.today.disabled, +.datepicker table tr td.range.today:hover.disabled, +.datepicker table tr td.range.today.disabled.disabled, +.datepicker table tr td.range.today.disabled:hover.disabled, +.datepicker table tr td.range.today[disabled], +.datepicker table tr td.range.today:hover[disabled], +.datepicker table tr td.range.today.disabled[disabled], +.datepicker table tr td.range.today.disabled:hover[disabled] { + background-color: #f3e97a; +} +.datepicker table tr td.range.today:active, +.datepicker table tr td.range.today:hover:active, +.datepicker table tr td.range.today.disabled:active, +.datepicker table tr td.range.today.disabled:hover:active, +.datepicker table tr td.range.today.active, +.datepicker table tr td.range.today:hover.active, +.datepicker table tr td.range.today.disabled.active, +.datepicker table tr td.range.today.disabled:hover.active { + background-color: #efe24b \9; +} +.datepicker table tr td.selected, +.datepicker table tr td.selected:hover, +.datepicker table tr td.selected.disabled, +.datepicker table tr td.selected.disabled:hover { background-color: #9e9e9e; background-image: -moz-linear-gradient(top, #b3b3b3, #808080); background-image: -ms-linear-gradient(top, #b3b3b3, #808080); @@ -152,46 +259,46 @@ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#b3b3b3', endColorstr='#808080', GradientType=0); border-color: #808080 #808080 #595959; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); color: #fff; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); } -.datepicker td.selected:hover, -.datepicker td.selected:hover:hover, -.datepicker td.selected.disabled:hover, -.datepicker td.selected.disabled:hover:hover, -.datepicker td.selected:active, -.datepicker td.selected:hover:active, -.datepicker td.selected.disabled:active, -.datepicker td.selected.disabled:hover:active, -.datepicker td.selected.active, -.datepicker td.selected:hover.active, -.datepicker td.selected.disabled.active, -.datepicker td.selected.disabled:hover.active, -.datepicker td.selected.disabled, -.datepicker td.selected:hover.disabled, -.datepicker td.selected.disabled.disabled, -.datepicker td.selected.disabled:hover.disabled, -.datepicker td.selected[disabled], -.datepicker td.selected:hover[disabled], -.datepicker td.selected.disabled[disabled], -.datepicker td.selected.disabled:hover[disabled] { +.datepicker table tr td.selected:hover, +.datepicker table tr td.selected:hover:hover, +.datepicker table tr td.selected.disabled:hover, +.datepicker table tr td.selected.disabled:hover:hover, +.datepicker table tr td.selected:active, +.datepicker table tr td.selected:hover:active, +.datepicker table tr td.selected.disabled:active, +.datepicker table tr td.selected.disabled:hover:active, +.datepicker table tr td.selected.active, +.datepicker table tr td.selected:hover.active, +.datepicker table tr td.selected.disabled.active, +.datepicker table tr td.selected.disabled:hover.active, +.datepicker table tr td.selected.disabled, +.datepicker table tr td.selected:hover.disabled, +.datepicker table tr td.selected.disabled.disabled, +.datepicker table tr td.selected.disabled:hover.disabled, +.datepicker table tr td.selected[disabled], +.datepicker table tr td.selected:hover[disabled], +.datepicker table tr td.selected.disabled[disabled], +.datepicker table tr td.selected.disabled:hover[disabled] { background-color: #808080; } -.datepicker td.selected:active, -.datepicker td.selected:hover:active, -.datepicker td.selected.disabled:active, -.datepicker td.selected.disabled:hover:active, -.datepicker td.selected.active, -.datepicker td.selected:hover.active, -.datepicker td.selected.disabled.active, -.datepicker td.selected.disabled:hover.active { +.datepicker table tr td.selected:active, +.datepicker table tr td.selected:hover:active, +.datepicker table tr td.selected.disabled:active, +.datepicker table tr td.selected.disabled:hover:active, +.datepicker table tr td.selected.active, +.datepicker table tr td.selected:hover.active, +.datepicker table tr td.selected.disabled.active, +.datepicker table tr td.selected.disabled:hover.active { background-color: #666666 \9; } -.datepicker td.active, -.datepicker td.active:hover, -.datepicker td.active.disabled, -.datepicker td.active.disabled:hover { +.datepicker table tr td.active, +.datepicker table tr td.active:hover, +.datepicker table tr td.active.disabled, +.datepicker table tr td.active.disabled:hover { background-color: #006dcc; background-image: -moz-linear-gradient(top, #0088cc, #0044cc); background-image: -ms-linear-gradient(top, #0088cc, #0044cc); @@ -203,43 +310,43 @@ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0); border-color: #0044cc #0044cc #002a80; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); color: #fff; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); } -.datepicker td.active:hover, -.datepicker td.active:hover:hover, -.datepicker td.active.disabled:hover, -.datepicker td.active.disabled:hover:hover, -.datepicker td.active:active, -.datepicker td.active:hover:active, -.datepicker td.active.disabled:active, -.datepicker td.active.disabled:hover:active, -.datepicker td.active.active, -.datepicker td.active:hover.active, -.datepicker td.active.disabled.active, -.datepicker td.active.disabled:hover.active, -.datepicker td.active.disabled, -.datepicker td.active:hover.disabled, -.datepicker td.active.disabled.disabled, -.datepicker td.active.disabled:hover.disabled, -.datepicker td.active[disabled], -.datepicker td.active:hover[disabled], -.datepicker td.active.disabled[disabled], -.datepicker td.active.disabled:hover[disabled] { +.datepicker table tr td.active:hover, +.datepicker table tr td.active:hover:hover, +.datepicker table tr td.active.disabled:hover, +.datepicker table tr td.active.disabled:hover:hover, +.datepicker table tr td.active:active, +.datepicker table tr td.active:hover:active, +.datepicker table tr td.active.disabled:active, +.datepicker table tr td.active.disabled:hover:active, +.datepicker table tr td.active.active, +.datepicker table tr td.active:hover.active, +.datepicker table tr td.active.disabled.active, +.datepicker table tr td.active.disabled:hover.active, +.datepicker table tr td.active.disabled, +.datepicker table tr td.active:hover.disabled, +.datepicker table tr td.active.disabled.disabled, +.datepicker table tr td.active.disabled:hover.disabled, +.datepicker table tr td.active[disabled], +.datepicker table tr td.active:hover[disabled], +.datepicker table tr td.active.disabled[disabled], +.datepicker table tr td.active.disabled:hover[disabled] { background-color: #0044cc; } -.datepicker td.active:active, -.datepicker td.active:hover:active, -.datepicker td.active.disabled:active, -.datepicker td.active.disabled:hover:active, -.datepicker td.active.active, -.datepicker td.active:hover.active, -.datepicker td.active.disabled.active, -.datepicker td.active.disabled:hover.active { +.datepicker table tr td.active:active, +.datepicker table tr td.active:hover:active, +.datepicker table tr td.active.disabled:active, +.datepicker table tr td.active.disabled:hover:active, +.datepicker table tr td.active.active, +.datepicker table tr td.active:hover.active, +.datepicker table tr td.active.disabled.active, +.datepicker table tr td.active.disabled:hover.active { background-color: #003399 \9; } -.datepicker td span { +.datepicker table tr td span { display: block; width: 23%; height: 54px; @@ -251,19 +358,19 @@ -moz-border-radius: 4px; border-radius: 4px; } -.datepicker td span:hover { +.datepicker table tr td span:hover { background: #eeeeee; } -.datepicker td span.disabled, -.datepicker td span.disabled:hover { +.datepicker table tr td span.disabled, +.datepicker table tr td span.disabled:hover { background: none; color: #999999; cursor: default; } -.datepicker td span.active, -.datepicker td span.active:hover, -.datepicker td span.active.disabled, -.datepicker td span.active.disabled:hover { +.datepicker table tr td span.active, +.datepicker table tr td span.active:hover, +.datepicker table tr td span.active.disabled, +.datepicker table tr td span.active.disabled:hover { background-color: #006dcc; background-image: -moz-linear-gradient(top, #0088cc, #0044cc); background-image: -ms-linear-gradient(top, #0088cc, #0044cc); @@ -275,59 +382,69 @@ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0); border-color: #0044cc #0044cc #002a80; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); color: #fff; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); } -.datepicker td span.active:hover, -.datepicker td span.active:hover:hover, -.datepicker td span.active.disabled:hover, -.datepicker td span.active.disabled:hover:hover, -.datepicker td span.active:active, -.datepicker td span.active:hover:active, -.datepicker td span.active.disabled:active, -.datepicker td span.active.disabled:hover:active, -.datepicker td span.active.active, -.datepicker td span.active:hover.active, -.datepicker td span.active.disabled.active, -.datepicker td span.active.disabled:hover.active, -.datepicker td span.active.disabled, -.datepicker td span.active:hover.disabled, -.datepicker td span.active.disabled.disabled, -.datepicker td span.active.disabled:hover.disabled, -.datepicker td span.active[disabled], -.datepicker td span.active:hover[disabled], -.datepicker td span.active.disabled[disabled], -.datepicker td span.active.disabled:hover[disabled] { +.datepicker table tr td span.active:hover, +.datepicker table tr td span.active:hover:hover, +.datepicker table tr td span.active.disabled:hover, +.datepicker table tr td span.active.disabled:hover:hover, +.datepicker table tr td span.active:active, +.datepicker table tr td span.active:hover:active, +.datepicker table tr td span.active.disabled:active, +.datepicker table tr td span.active.disabled:hover:active, +.datepicker table tr td span.active.active, +.datepicker table tr td span.active:hover.active, +.datepicker table tr td span.active.disabled.active, +.datepicker table tr td span.active.disabled:hover.active, +.datepicker table tr td span.active.disabled, +.datepicker table tr td span.active:hover.disabled, +.datepicker table tr td span.active.disabled.disabled, +.datepicker table tr td span.active.disabled:hover.disabled, +.datepicker table tr td span.active[disabled], +.datepicker table tr td span.active:hover[disabled], +.datepicker table tr td span.active.disabled[disabled], +.datepicker table tr td span.active.disabled:hover[disabled] { background-color: #0044cc; } -.datepicker td span.active:active, -.datepicker td span.active:hover:active, -.datepicker td span.active.disabled:active, -.datepicker td span.active.disabled:hover:active, -.datepicker td span.active.active, -.datepicker td span.active:hover.active, -.datepicker td span.active.disabled.active, -.datepicker td span.active.disabled:hover.active { +.datepicker table tr td span.active:active, +.datepicker table tr td span.active:hover:active, +.datepicker table tr td span.active.disabled:active, +.datepicker table tr td span.active.disabled:hover:active, +.datepicker table tr td span.active.active, +.datepicker table tr td span.active:hover.active, +.datepicker table tr td span.active.disabled.active, +.datepicker table tr td span.active.disabled:hover.active { background-color: #003399 \9; } -.datepicker td span.old { +.datepicker table tr td span.old, +.datepicker table tr td span.new { color: #999999; } -.datepicker th.switch { +.datepicker th.datepicker-switch { width: 145px; } .datepicker thead tr:first-child th, -.datepicker tfoot tr:first-child th { +.datepicker tfoot tr th { cursor: pointer; } .datepicker thead tr:first-child th:hover, -.datepicker tfoot tr:first-child th:hover { +.datepicker tfoot tr th:hover { background: #eeeeee; } +.datepicker .cw { + font-size: 10px; + width: 12px; + padding: 0 2px 0 5px; + vertical-align: middle; +} +.datepicker thead tr:first-child th.cw { + cursor: default; + background-color: transparent; +} .input-append.date .add-on i, .input-prepend.date .add-on i { - display: block; cursor: pointer; width: 16px; height: 16px; @@ -349,10 +466,10 @@ display: inline-block; width: auto; min-width: 16px; - height: 18px; + height: 20px; padding: 4px 5px; font-weight: normal; - line-height: 18px; + line-height: 20px; text-align: center; text-shadow: 0 1px 0 #ffffff; vertical-align: middle; @@ -387,19 +504,11 @@ color: #333333; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 13px; - line-height: 18px; + line-height: 20px; } .datepicker.dropdown-menu th, -.datepicker.dropdown-menu td { +.datepicker.datepicker-inline th, +.datepicker.dropdown-menu td, +.datepicker.datepicker-inline td { padding: 4px 5px; } -.datepicker .prev, -.datepicker .next { - font-style: normal; -} -.datepicker .prev:after { - content: "«"; -} -.datepicker .next:after { - content: "»"; -} diff --git a/UI/WebServerResources/datepicker.js b/UI/WebServerResources/datepicker.js index 91aa6c029..5d6277feb 100644 --- a/UI/WebServerResources/datepicker.js +++ b/UI/WebServerResources/datepicker.js @@ -1,10 +1,11 @@ /* ========================================================= * bootstrap-datepicker.js - * http://www.eyecon.ro/bootstrap-datepicker + * Repo: https://github.com/eternicode/bootstrap-datepicker/ + * Demo: http://eternicode.github.io/bootstrap-datepicker/ + * Docs: http://bootstrap-datepicker.readthedocs.org/ + * Forked from http://www.eyecon.ro/bootstrap-datepicker * ========================================================= - * Copyright 2012 Stefan Petre - * Improvements by Andrew Rowls - * Adapted for SOGo translation by Francis Lachapelle + * Started by Stefan Petre; improvements by Andrew Rowls + contributors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,286 +20,815 @@ * limitations under the License. * ========================================================= */ -!function( $ ) { +(function($, undefined){ + + var $window = $(window); function UTCDate(){ return new Date(Date.UTC.apply(Date, arguments)); } + function UTCToday(){ + var today = new Date(); + return UTCDate(today.getFullYear(), today.getMonth(), today.getDate()); + } + function alias(method){ + return function(){ + return this[method].apply(this, arguments); + }; + } + + var DateArray = (function(){ + var extras = { + get: function(i){ + return this.slice(i)[0]; + }, + contains: function(d){ + // Array.indexOf is not cross-browser; + // $.inArray doesn't work with Dates + var val = d && d.valueOf(); + for (var i=0, l=this.length; i < l; i++) + if (this[i].valueOf() === val) + return i; + return -1; + }, + remove: function(i){ + this.splice(i,1); + }, + replace: function(new_array){ + if (!new_array) + return; + if (!$.isArray(new_array)) + new_array = [new_array]; + this.clear(); + this.push.apply(this, new_array); + }, + clear: function(){ + this.length = 0; + }, + copy: function(){ + var a = new DateArray(); + a.replace(this); + return a; + } + }; + + return function(){ + var a = []; + a.push.apply(a, arguments); + $.extend(a, extras); + return a; + }; + })(); + // Picker object - var Datepicker = function(element, options) { - var that = this; + var Datepicker = function(element, options){ + this.dates = new DateArray(); + this.viewDate = UTCToday(); + this.focusDate = null; + + this._process_options(options); this.element = $(element); - this.position = options.position||this.element.data('position'); - this.format = DPGlobal.parseFormat(options.format||this.element.data('date-format')||'mm/dd/yyyy'); - this.picker = $(DPGlobal.template).addClass(this.position) - .appendTo('body') - .on({click: $.proxy(this.click, this)}); + this.isInline = false; this.isInput = this.element.is('input'); - this.component = this.element.is('.date') ? this.element.find('.add-on') : false; + this.component = this.element.is('.date') ? this.element.find('.add-on, .input-group-addon, .btn') : false; this.hasInput = this.component && this.element.find('input').length; - if(this.component && this.component.length === 0) + if (this.component && this.component.length === 0) this.component = false; - if (this.isInput) { - this.element.on({ - focus: $.proxy(this.show, this), - keyup: $.proxy(this.update, this), - keydown: $.proxy(this.keydown, this) - }); + this.picker = $(DPGlobal.template); + this._buildEvents(); + this._attachEvents(); + + if (this.isInline){ + this.picker.addClass('datepicker-inline').appendTo(this.element); } - else { - if (this.component && this.hasInput){ - // For components that are not readonly, allow keyboard nav - this.element.find('input').on({ - focus: $.proxy(this.show, this), - keyup: $.proxy(this.update, this), - keydown: $.proxy(this.keydown, this) - }); - this.component.on('click', $.proxy(this.show, this)); - } - else { - this.element.on('click', $.proxy(this.show, this)); - } + else { + this.picker.addClass('datepicker-dropdown dropdown-menu'); } - $(document).on('mousedown', function (e) { - // Clicked outside the datepicker, hide it - if ($(e.target).closest('.datepicker').length == 0) { - that.hide(); - } - }); - - this.autoclose = false; - if ('autoclose' in options) { - this.autoclose = options.autoclose; - } - else if ('dateAutoclose' in this.element.data()) { - this.autoclose = this.element.data('date-autoclose'); + if (this.o.rtl){ + this.picker.addClass('datepicker-rtl'); } - this.keyboardNavigation = true; - if ('keyboardNavigation' in options) { - this.keyboardNavigation = options.keyboardNavigation; - } - else if ('dateKeyboardNavigation' in this.element.data()) { - this.keyboardNavigation = this.element.data('date-keyboard-navigation'); - } + this.viewMode = this.o.startView; - switch(options.startView || this.element.data('date-start-view')){ - case 2: - case 'decade': - this.viewMode = this.startViewMode = 2; - break; - case 1: - case 'year': - this.viewMode = this.startViewMode = 1; - break; - case 0: - case 'month': - default: - this.viewMode = this.startViewMode = 0; - break; - } + if (this.o.calendarWeeks) + this.picker.find('tfoot th.today') + .attr('colspan', function(i, val){ + return parseInt(val) + 1; + }); + + this._allow_update = false; + + this.setStartDate(this._o.startDate); + this.setEndDate(this._o.endDate); + this.setDaysOfWeekDisabled(this.o.daysOfWeekDisabled); - this.weekStart = ((options.weekStart||this.element.data('date-weekstart')||0) % 7); - this.weekEnd = ((this.weekStart + 6) % 7); - this.startDate = -Infinity; - this.endDate = Infinity; - this.setStartDate(options.startDate||this.element.data('date-startdate')); - this.setEndDate(options.endDate||this.element.data('date-enddate')); this.fillDow(); this.fillMonths(); + + this._allow_update = true; + this.update(); this.showMode(); + + if (this.isInline){ + this.show(); + } }; Datepicker.prototype = { constructor: Datepicker, - show: function(e) { - this.picker.show(); - this.height = this.component ? this.component.outerHeight() : this.element.outerHeight(); - this.update(); - this.place(); - $(window).on('resize', $.proxy(this.place, this)); - if (e ) { - e.stopPropagation(); - e.preventDefault(); + _process_options: function(opts){ + // Store raw options for reference + this._o = $.extend({}, this._o, opts); + // Processed options + var o = this.o = $.extend({}, this._o); + + // Check if "de-DE" style date is available, if not language should + // fallback to 2 letter code eg "de" + var lang = o.language; + if (!dates[lang]){ + lang = lang.split('-')[0]; + if (!dates[lang]) + lang = defaults.language; } + o.language = lang; + + switch (o.startView){ + case 2: + case 'decade': + o.startView = 2; + break; + case 1: + case 'year': + o.startView = 1; + break; + default: + o.startView = 0; + } + + switch (o.minViewMode){ + case 1: + case 'months': + o.minViewMode = 1; + break; + case 2: + case 'years': + o.minViewMode = 2; + break; + default: + o.minViewMode = 0; + } + + o.startView = Math.max(o.startView, o.minViewMode); + + // true, false, or Number > 0 + if (o.multidate !== true){ + o.multidate = Number(o.multidate) || false; + if (o.multidate !== false) + o.multidate = Math.max(0, o.multidate); + else + o.multidate = 1; + } + o.multidateSeparator = String(o.multidateSeparator); + + o.weekStart %= 7; + o.weekEnd = ((o.weekStart + 6) % 7); + + var format = DPGlobal.parseFormat(o.format); + if (o.startDate !== -Infinity){ + if (!!o.startDate){ + if (o.startDate instanceof Date) + o.startDate = this._local_to_utc(this._zero_time(o.startDate)); + else + o.startDate = DPGlobal.parseDate(o.startDate, format, o.language); + } + else { + o.startDate = -Infinity; + } + } + if (o.endDate !== Infinity){ + if (!!o.endDate){ + if (o.endDate instanceof Date) + o.endDate = this._local_to_utc(this._zero_time(o.endDate)); + else + o.endDate = DPGlobal.parseDate(o.endDate, format, o.language); + } + else { + o.endDate = Infinity; + } + } + + o.daysOfWeekDisabled = o.daysOfWeekDisabled||[]; + if (!$.isArray(o.daysOfWeekDisabled)) + o.daysOfWeekDisabled = o.daysOfWeekDisabled.split(/[,\s]*/); + o.daysOfWeekDisabled = $.map(o.daysOfWeekDisabled, function(d){ + return parseInt(d, 10); + }); + + var plc = String(o.orientation).toLowerCase().split(/\s+/g), + _plc = o.orientation.toLowerCase(); + plc = $.grep(plc, function(word){ + return (/^auto|left|right|top|bottom$/).test(word); + }); + o.orientation = {x: 'auto', y: 'auto'}; + if (!_plc || _plc === 'auto') + ; // no action + else if (plc.length === 1){ + switch (plc[0]){ + case 'top': + case 'bottom': + o.orientation.y = plc[0]; + break; + case 'left': + case 'right': + o.orientation.x = plc[0]; + break; + } + } + else { + _plc = $.grep(plc, function(word){ + return (/^left|right$/).test(word); + }); + o.orientation.x = _plc[0] || 'auto'; + + _plc = $.grep(plc, function(word){ + return (/^top|bottom$/).test(word); + }); + o.orientation.y = _plc[0] || 'auto'; + } + }, + _events: [], + _secondaryEvents: [], + _applyEvents: function(evs){ + for (var i=0, el, ch, ev; i < evs.length; i++){ + el = evs[i][0]; + if (evs[i].length === 2){ + ch = undefined; + ev = evs[i][1]; + } + else if (evs[i].length === 3){ + ch = evs[i][1]; + ev = evs[i][2]; + } + el.on(ev, ch); + } + }, + _unapplyEvents: function(evs){ + for (var i=0, el, ev, ch; i < evs.length; i++){ + el = evs[i][0]; + if (evs[i].length === 2){ + ch = undefined; + ev = evs[i][1]; + } + else if (evs[i].length === 3){ + ch = evs[i][1]; + ev = evs[i][2]; + } + el.off(ev, ch); + } + }, + _buildEvents: function(){ + if (this.isInput){ // single input + this._events = [ + [this.element, { + focus: $.proxy(this.show, this), + keyup: $.proxy(function(e){ + if ($.inArray(e.keyCode, [27,37,39,38,40,32,13,9]) === -1) + this.update(); + }, this), + keydown: $.proxy(this.keydown, this) + }] + ]; + } + else if (this.component && this.hasInput){ // component: input + button + this._events = [ + // For components that are not readonly, allow keyboard nav + [this.element.find('input'), { + focus: $.proxy(this.show, this), + keyup: $.proxy(function(e){ + if ($.inArray(e.keyCode, [27,37,39,38,40,32,13,9]) === -1) + this.update(); + }, this), + keydown: $.proxy(this.keydown, this) + }], + [this.component, { + click: $.proxy(this.show, this) + }] + ]; + } + else if (this.element.is('div')){ // inline datepicker + this.isInline = true; + } + else { + this._events = [ + [this.element, { + click: $.proxy(this.show, this) + }] + ]; + } + this._events.push( + // Component: listen for blur on element descendants + [this.element, '*', { + blur: $.proxy(function(e){ + this._focused_from = e.target; + }, this) + }], + // Input: listen for blur on element + [this.element, { + blur: $.proxy(function(e){ + this._focused_from = e.target; + }, this) + }] + ); + + this._secondaryEvents = [ + [this.picker, { + click: $.proxy(this.click, this) + }], + [$(window), { + resize: $.proxy(this.place, this) + }], + [$(document), { + 'mousedown touchstart': $.proxy(function(e){ + // Clicked outside the datepicker, hide it + if (!( + this.element.is(e.target) || + this.element.find(e.target).length || + this.picker.is(e.target) || + this.picker.find(e.target).length + )){ + this.hide(); + } + }, this) + }] + ]; + }, + _attachEvents: function(){ + this._detachEvents(); + this._applyEvents(this._events); + }, + _detachEvents: function(){ + this._unapplyEvents(this._events); + }, + _attachSecondaryEvents: function(){ + this._detachSecondaryEvents(); + this._applyEvents(this._secondaryEvents); + }, + _detachSecondaryEvents: function(){ + this._unapplyEvents(this._secondaryEvents); + }, + _trigger: function(event, altdate){ + var date = altdate || this.dates.get(-1), + local_date = this._utc_to_local(date); + this.element.trigger({ - type: 'show', - date: this.date + type: event, + date: local_date, + dates: $.map(this.dates, this._utc_to_local), + format: $.proxy(function(ix, format){ + if (arguments.length === 0){ + ix = this.dates.length - 1; + format = this.o.format; + } + else if (typeof ix === 'string'){ + format = ix; + ix = this.dates.length - 1; + } + format = format || this.o.format; + var date = this.dates.get(ix); + return DPGlobal.formatDate(date, format, this.o.language); + }, this) }); }, - hide: function(e){ - this.picker.hide(); - $(window).off('resize', this.place); - this.viewMode = this.startViewMode; - this.showMode(); - if (!this.isInput) { - $(document).off('mousedown', this.hide); - } - if (e && e.currentTarget.value) - this.setValue(); + show: function(){ + if (!this.isInline) + this.picker.appendTo('body'); + this.picker.show(); + this.place(); + this._attachSecondaryEvents(); + this._trigger('show'); }, - setValue: function() { - var formatted = DPGlobal.formatDate(this.date, this.format); - if (!this.isInput) { - if (this.component){ - this.element.find('input').prop('value', formatted); - } - this.element.data('date', formatted); - } else { - this.element.prop('value', formatted); + hide: function(){ + if (this.isInline) + return; + if (!this.picker.is(':visible')) + return; + this.focusDate = null; + this.picker.hide().detach(); + this._detachSecondaryEvents(); + this.viewMode = this.o.startView; + this.showMode(); + + if ( + this.o.forceParse && + ( + this.isInput && this.element.val() || + this.hasInput && this.element.find('input').val() + ) + ) + this.setValue(); + //this._trigger('hide'); + }, + + remove: function(){ + this.hide(); + this._detachEvents(); + this._detachSecondaryEvents(); + this.picker.remove(); + delete this.element.data().datepicker; + if (!this.isInput){ + delete this.element.data().date; } }, + _utc_to_local: function(utc){ + return utc && new Date(utc.getTime() + (utc.getTimezoneOffset()*60000)); + }, + _local_to_utc: function(local){ + return local && new Date(local.getTime() - (local.getTimezoneOffset()*60000)); + }, + _zero_time: function(local){ + return local && new Date(local.getFullYear(), local.getMonth(), local.getDate()); + }, + _zero_utc_time: function(utc){ + return utc && new Date(Date.UTC(utc.getUTCFullYear(), utc.getUTCMonth(), utc.getUTCDate())); + }, + + getDates: function(){ + return $.map(this.dates, this._utc_to_local); + }, + + getUTCDates: function(){ + return $.map(this.dates, function(d){ + return new Date(d); + }); + }, + + getDate: function(){ + return this._utc_to_local(this.getUTCDate()); + }, + + getUTCDate: function(){ + return new Date(this.dates.get(-1)); + }, + + setDates: function(){ + var args = $.isArray(arguments[0]) ? arguments[0] : arguments; + this.update.apply(this, args); + this._trigger('changeDate'); + this.setValue(); + }, + + setUTCDates: function(){ + var args = $.isArray(arguments[0]) ? arguments[0] : arguments; + this.update.apply(this, $.map(args, this._utc_to_local)); + this._trigger('changeDate'); + this.setValue(); + }, + + setDate: alias('setDates'), + setUTCDate: alias('setUTCDates'), + + setValue: function(){ + var formatted = this.getFormattedDate(); + if (!this.isInput){ + if (this.component){ + this.element.find('input').val(formatted).change(); + } + } + else { + this.element.val(formatted).change(); + } + }, + + getFormattedDate: function(format){ + if (format === undefined) + format = this.o.format; + + var lang = this.o.language; + return $.map(this.dates, function(d){ + return DPGlobal.formatDate(d, format, lang); + }).join(this.o.multidateSeparator); + }, + setStartDate: function(startDate){ - this.startDate = startDate||-Infinity; - if (this.startDate !== -Infinity) { - this.startDate = DPGlobal.parseDate(this.startDate, this.format); - } + this._process_options({startDate: startDate}); this.update(); this.updateNavArrows(); }, setEndDate: function(endDate){ - this.endDate = endDate||Infinity; - if (this.endDate !== Infinity) { - this.endDate = DPGlobal.parseDate(this.endDate, this.format); - } + this._process_options({endDate: endDate}); + this.update(); + this.updateNavArrows(); + }, + + setDaysOfWeekDisabled: function(daysOfWeekDisabled){ + this._process_options({daysOfWeekDisabled: daysOfWeekDisabled}); this.update(); this.updateNavArrows(); }, place: function(){ - var zIndex = parseInt(this.element.parents().filter(function() { - return $(this).css('z-index') != 'auto'; - }).first().css('z-index'))+10; - var offset = this.component ? this.component.offset() : this.element.offset(); - var width = this.component ? this.component.width() : this.element.width(); - if (this.position == 'bellow') - this.picker.css({top: offset.top + this.height, - left: offset.left, - right: 'auto', - zIndex: zIndex - }); - - if (this.position == 'below-shifted-left') - this.picker.css({top: offset.top + this.height, - left: offset.left - 83, - right: 'auto', - zIndex: zIndex - }); - else // above - this.picker.css({ top: offset.top - this.height - this.picker.outerHeight(), - right: window.width() - offset.left - width, - left: 'auto', - zIndex: zIndex - }); + if (this.isInline) + return; + var calendarWidth = this.picker.outerWidth(), + calendarHeight = this.picker.outerHeight(), + visualPadding = 10, + windowWidth = $window.width(), + windowHeight = $window.height(), + scrollTop = $window.scrollTop(); + + var zIndex = parseInt(this.element.parents().filter(function(){ + return $(this).css('z-index') !== 'auto'; + }).first().css('z-index'))+10; + var offset = this.component ? this.component.parent().offset() : this.element.offset(); + var height = this.component ? this.component.outerHeight(true) : this.element.outerHeight(false); + var width = this.component ? this.component.outerWidth(true) : this.element.outerWidth(false); + var left = offset.left, + top = offset.top; + + this.picker.removeClass( + 'datepicker-orient-top datepicker-orient-bottom '+ + 'datepicker-orient-right datepicker-orient-left' + ); + + if (this.o.orientation.x !== 'auto'){ + this.picker.addClass('datepicker-orient-' + this.o.orientation.x); + if (this.o.orientation.x === 'right') + left -= calendarWidth - width; + } + // auto x orientation is best-placement: if it crosses a window + // edge, fudge it sideways + else { + // Default to left + this.picker.addClass('datepicker-orient-left'); + if (offset.left < 0) + left -= offset.left - visualPadding; + else if (offset.left + calendarWidth > windowWidth) + left = windowWidth - calendarWidth - visualPadding; + } + + // auto y orientation is best-situation: top or bottom, no fudging, + // decision based on which shows more of the calendar + var yorient = this.o.orientation.y, + top_overflow, bottom_overflow; + if (yorient === 'auto'){ + top_overflow = -scrollTop + offset.top - calendarHeight; + bottom_overflow = scrollTop + windowHeight - (offset.top + height + calendarHeight); + if (Math.max(top_overflow, bottom_overflow) === bottom_overflow) + yorient = 'top'; + else + yorient = 'bottom'; + } + this.picker.addClass('datepicker-orient-' + yorient); + if (yorient === 'top') + top += height; + else + top -= calendarHeight + parseInt(this.picker.css('padding-top')); + + this.picker.css({ + top: top, + left: left, + zIndex: zIndex + }); }, + _allow_update: true, update: function(){ - this.date = DPGlobal.parseDate( - this.isInput ? this.element.prop('value') : this.element.data('date') || this.element.find('input').prop('value'), - this.format - ); - if (this.date < this.startDate) { - this.viewDate = new Date(this.startDate); - } else if (this.date > this.endDate) { - this.viewDate = new Date(this.endDate); - } else { - this.viewDate = new Date(this.date); + if (!this._allow_update) + return; + + var oldDates = this.dates.copy(), + dates = [], + fromArgs = false; + if (arguments.length){ + $.each(arguments, $.proxy(function(i, date){ + if (date instanceof Date) + date = this._local_to_utc(date); + dates.push(date); + }, this)); + fromArgs = true; } + else { + dates = this.isInput + ? this.element.val() + : this.element.data('date') || this.element.find('input').val(); + if (dates && this.o.multidate) + dates = dates.split(this.o.multidateSeparator); + else + dates = [dates]; + delete this.element.data().date; + } + + dates = $.map(dates, $.proxy(function(date){ + return DPGlobal.parseDate(date, this.o.format, this.o.language); + }, this)); + dates = $.grep(dates, $.proxy(function(date){ + return ( + date < this.o.startDate || + date > this.o.endDate || + !date + ); + }, this), true); + this.dates.replace(dates); + + if (this.dates.length) + this.viewDate = new Date(this.dates.get(-1)); + else if (this.viewDate < this.o.startDate) + this.viewDate = new Date(this.o.startDate); + else if (this.viewDate > this.o.endDate) + this.viewDate = new Date(this.o.endDate); + + if (fromArgs){ + // setting date by clicking + this.setValue(); + } + else if (dates.length){ + // setting date by typing + if (String(oldDates) !== String(this.dates)) + this._trigger('changeDate'); + } + if (!this.dates.length && oldDates.length) + this._trigger('clearDate'); + this.fill(); }, fillDow: function(){ - var dowCnt = this.weekStart; - var html = ''; - while (dowCnt < this.weekStart + 7) { - html += ''+_('a2_'+dates.days[(dowCnt++)%7])+''; + var dowCnt = this.o.weekStart, + html = ''; + if (this.o.calendarWeeks){ + var cell = ' '; + html += cell; + this.picker.find('.datepicker-days thead tr:first-child').prepend(cell); + } + while (dowCnt < this.o.weekStart + 7){ + html += ''+_(dates[this.o.language].daysMin[(dowCnt++)%7])+''; } html += ''; this.picker.find('.datepicker-days thead').append(html); }, fillMonths: function(){ - var html = ''; - var i = 0 - while (i < 12) { - html += ''+_(dates.monthsShort[i++])+''; + var html = '', + i = 0; + while (i < 12){ + html += ''+_(dates[this.o.language].monthsShort[i++])+''; } this.picker.find('.datepicker-months td').html(html); }, - fill: function() { + setRange: function(range){ + if (!range || !range.length) + delete this.range; + else + this.range = $.map(range, function(d){ + return d.valueOf(); + }); + this.fill(); + }, + + getClassNames: function(date){ + var cls = [], + year = this.viewDate.getUTCFullYear(), + month = this.viewDate.getUTCMonth(), + today = new Date(); + if (date.getUTCFullYear() < year || (date.getUTCFullYear() === year && date.getUTCMonth() < month)){ + cls.push('old'); + } + else if (date.getUTCFullYear() > year || (date.getUTCFullYear() === year && date.getUTCMonth() > month)){ + cls.push('new'); + } + if (this.focusDate && date.valueOf() === this.focusDate.valueOf()) + cls.push('focused'); + // Compare internal UTC date with local today, not UTC today + if (this.o.todayHighlight && + date.getUTCFullYear() === today.getFullYear() && + date.getUTCMonth() === today.getMonth() && + date.getUTCDate() === today.getDate()){ + cls.push('today'); + } + if (this.dates.contains(date) !== -1) + cls.push('active'); + if (date.valueOf() < this.o.startDate || date.valueOf() > this.o.endDate || + $.inArray(date.getUTCDay(), this.o.daysOfWeekDisabled) !== -1){ + cls.push('disabled'); + } + if (this.range){ + if (date > this.range[0] && date < this.range[this.range.length-1]){ + cls.push('range'); + } + if ($.inArray(date.valueOf(), this.range) !== -1){ + cls.push('selected'); + } + } + return cls; + }, + + fill: function(){ var d = new Date(this.viewDate), year = d.getUTCFullYear(), month = d.getUTCMonth(), - startYear = this.startDate !== -Infinity ? this.startDate.getUTCFullYear() : -Infinity, - startMonth = this.startDate !== -Infinity ? this.startDate.getUTCMonth() : -Infinity, - endYear = this.endDate !== Infinity ? this.endDate.getUTCFullYear() : Infinity, - endMonth = this.endDate !== Infinity ? this.endDate.getUTCMonth() : Infinity, - currentDate = this.date.valueOf(); - this.picker.find('.datepicker-days th:eq(1)') - .text(_(dates.months[month])+' '+year); + startYear = this.o.startDate !== -Infinity ? this.o.startDate.getUTCFullYear() : -Infinity, + startMonth = this.o.startDate !== -Infinity ? this.o.startDate.getUTCMonth() : -Infinity, + endYear = this.o.endDate !== Infinity ? this.o.endDate.getUTCFullYear() : Infinity, + endMonth = this.o.endDate !== Infinity ? this.o.endDate.getUTCMonth() : Infinity, + todaytxt = _(dates[this.o.language].today) || dates['en'].today || '', + cleartxt = _(dates[this.o.language].clear) || dates['en'].clear || '', + tooltip; + this.picker.find('.datepicker-days thead th.datepicker-switch') + .text(_(dates[this.o.language].months[month])+' '+year); + this.picker.find('tfoot th.today') + .text(todaytxt) + .toggle(this.o.todayBtn !== false); + this.picker.find('tfoot th.clear') + .text(cleartxt) + .toggle(this.o.clearBtn !== false); this.updateNavArrows(); this.fillMonths(); - var prevMonth = UTCDate(year, month-1, 28,0,0,0,0), + var prevMonth = UTCDate(year, month-1, 28), day = DPGlobal.getDaysInMonth(prevMonth.getUTCFullYear(), prevMonth.getUTCMonth()); prevMonth.setUTCDate(day); - prevMonth.setUTCDate(day - (prevMonth.getUTCDay() - this.weekStart + 7)%7); + prevMonth.setUTCDate(day - (prevMonth.getUTCDay() - this.o.weekStart + 7)%7); var nextMonth = new Date(prevMonth); nextMonth.setUTCDate(nextMonth.getUTCDate() + 42); nextMonth = nextMonth.valueOf(); var html = []; var clsName; - while(prevMonth.valueOf() < nextMonth) { - if (prevMonth.getUTCDay() == this.weekStart) { + while (prevMonth.valueOf() < nextMonth){ + if (prevMonth.getUTCDay() === this.o.weekStart){ html.push(''); + if (this.o.calendarWeeks){ + // ISO 8601: First week contains first thursday. + // ISO also states week starts on Monday, but we can be more abstract here. + var + // Start of current week: based on weekstart/current date + ws = new Date(+prevMonth + (this.o.weekStart - prevMonth.getUTCDay() - 7) % 7 * 864e5), + // Thursday of this week + th = new Date(Number(ws) + (7 + 4 - ws.getUTCDay()) % 7 * 864e5), + // First Thursday of year, year from thursday + yth = new Date(Number(yth = UTCDate(th.getUTCFullYear(), 0, 1)) + (7 + 4 - yth.getUTCDay())%7*864e5), + // Calendar week: ms between thursdays, div ms per day, div 7 days + calWeek = (th - yth) / 864e5 / 7 + 1; + html.push(''+ calWeek +''); + + } } - clsName = ''; - if (prevMonth.getUTCFullYear() < year || (prevMonth.getUTCFullYear() == year && prevMonth.getUTCMonth() < month)) { - clsName += ' old'; - } else if (prevMonth.getUTCFullYear() > year || (prevMonth.getUTCFullYear() == year && prevMonth.getUTCMonth() > month)) { - clsName += ' new'; + clsName = this.getClassNames(prevMonth); + clsName.push('day'); + + if (this.o.beforeShowDay !== $.noop){ + var before = this.o.beforeShowDay(this._utc_to_local(prevMonth)); + if (before === undefined) + before = {}; + else if (typeof(before) === 'boolean') + before = {enabled: before}; + else if (typeof(before) === 'string') + before = {classes: before}; + if (before.enabled === false) + clsName.push('disabled'); + if (before.classes) + clsName = clsName.concat(before.classes.split(/\s+/)); + if (before.tooltip) + tooltip = before.tooltip; } - if (prevMonth.valueOf() == currentDate) { - clsName += ' active'; - } - if (prevMonth.valueOf() < this.startDate || prevMonth.valueOf() > this.endDate) { - clsName += ' disabled'; - } - html.push(''+prevMonth.getUTCDate() + ''); - if (prevMonth.getUTCDay() == this.weekEnd) { + + clsName = $.unique(clsName); + html.push(''+prevMonth.getUTCDate() + ''); + if (prevMonth.getUTCDay() === this.o.weekEnd){ html.push(''); } prevMonth.setUTCDate(prevMonth.getUTCDate()+1); } this.picker.find('.datepicker-days tbody').empty().append(html.join('')); - var currentYear = this.date.getUTCFullYear(); var months = this.picker.find('.datepicker-months') .find('th:eq(1)') .text(year) .end() .find('span').removeClass('active'); - if (currentYear == year) { - months.eq(this.date.getUTCMonth()).addClass('active'); - } - if (year < startYear || year > endYear) { + + $.each(this.dates, function(i, d){ + if (d.getUTCFullYear() === year) + months.eq(d.getUTCMonth()).addClass('active'); + }); + + if (year < startYear || year > endYear){ months.addClass('disabled'); } - if (year == startYear) { + if (year === startYear){ months.slice(0, startMonth).addClass('disabled'); } - if (year == endYear) { + if (year === endYear){ months.slice(endMonth+1).addClass('disabled'); } @@ -310,90 +840,139 @@ .end() .find('td'); year -= 1; - for (var i = -1; i < 11; i++) { - html += ''+year+''; + var years = $.map(this.dates, function(d){ + return d.getUTCFullYear(); + }), + classes; + for (var i = -1; i < 11; i++){ + classes = ['year']; + if (i === -1) + classes.push('old'); + else if (i === 10) + classes.push('new'); + if ($.inArray(year, years) !== -1) + classes.push('active'); + if (year < startYear || year > endYear) + classes.push('disabled'); + html += ''+year+''; year += 1; } yearCont.html(html); }, - updateNavArrows: function() { + updateNavArrows: function(){ + if (!this._allow_update) + return; + var d = new Date(this.viewDate), year = d.getUTCFullYear(), month = d.getUTCMonth(); - switch (this.viewMode) { + switch (this.viewMode){ case 0: - if (this.startDate !== -Infinity && year <= this.startDate.getUTCFullYear() && month <= this.startDate.getUTCMonth()) { + if (this.o.startDate !== -Infinity && year <= this.o.startDate.getUTCFullYear() && month <= this.o.startDate.getUTCMonth()){ this.picker.find('.prev').css({visibility: 'hidden'}); - } else { + } + else { this.picker.find('.prev').css({visibility: 'visible'}); } - if (this.endDate !== Infinity && year >= this.endDate.getUTCFullYear() && month >= this.endDate.getUTCMonth()) { + if (this.o.endDate !== Infinity && year >= this.o.endDate.getUTCFullYear() && month >= this.o.endDate.getUTCMonth()){ this.picker.find('.next').css({visibility: 'hidden'}); - } else { + } + else { this.picker.find('.next').css({visibility: 'visible'}); } break; case 1: case 2: - if (this.startDate !== -Infinity && year <= this.startDate.getUTCFullYear()) { + if (this.o.startDate !== -Infinity && year <= this.o.startDate.getUTCFullYear()){ this.picker.find('.prev').css({visibility: 'hidden'}); - } else { + } + else { this.picker.find('.prev').css({visibility: 'visible'}); } - if (this.endDate !== Infinity && year >= this.endDate.getUTCFullYear()) { + if (this.o.endDate !== Infinity && year >= this.o.endDate.getUTCFullYear()){ this.picker.find('.next').css({visibility: 'hidden'}); - } else { + } + else { this.picker.find('.next').css({visibility: 'visible'}); } break; } }, - click: function(e) { - e.stopPropagation(); + click: function(e){ e.preventDefault(); - var target = $(e.target).closest('span, td, th'); - if (target.length == 1) { - switch(target[0].nodeName.toLowerCase()) { + var target = $(e.target).closest('span, td, th'), + year, month, day; + if (target.length === 1){ + switch (target[0].nodeName.toLowerCase()){ case 'th': - switch(target[0].className) { - case 'switch': + switch (target[0].className){ + case 'datepicker-switch': this.showMode(1); break; case 'prev': case 'next': - var dir = DPGlobal.modes[this.viewMode].navStep * (target[0].className == 'prev' ? -1 : 1); - switch(this.viewMode){ + var dir = DPGlobal.modes[this.viewMode].navStep * (target[0].className === 'prev' ? -1 : 1); + switch (this.viewMode){ case 0: this.viewDate = this.moveMonth(this.viewDate, dir); + this._trigger('changeMonth', this.viewDate); break; case 1: case 2: this.viewDate = this.moveYear(this.viewDate, dir); + if (this.viewMode === 1) + this._trigger('changeYear', this.viewDate); break; } this.fill(); break; + case 'today': + var date = new Date(); + date = UTCDate(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0); + + this.showMode(-2); + var which = this.o.todayBtn === 'linked' ? null : 'view'; + this._setDate(date, which); + break; + case 'clear': + var element; + if (this.isInput) + element = this.element; + else if (this.component) + element = this.element.find('input'); + if (element) + element.val("").change(); + this.update(); + this._trigger('changeDate'); + if (this.o.autoclose) + this.hide(); + break; } break; case 'span': - if (!target.is('.disabled')) { + if (!target.is('.disabled')){ this.viewDate.setUTCDate(1); - if (target.is('.month')) { - var month = target.parent().find('span').index(target); + if (target.is('.month')){ + day = 1; + month = target.parent().find('span').index(target); + year = this.viewDate.getUTCFullYear(); this.viewDate.setUTCMonth(month); - this.element.trigger({ - type: 'changeMonth', - date: this.viewDate - }); - } else { - var year = parseInt(target.text(), 10)||0; + this._trigger('changeMonth', this.viewDate); + if (this.o.minViewMode === 1){ + this._setDate(UTCDate(year, month, day)); + } + } + else { + day = 1; + month = 0; + year = parseInt(target.text(), 10)||0; this.viewDate.setUTCFullYear(year); - this.element.trigger({ - type: 'changeYear', - date: this.viewDate - }); + this._trigger('changeYear', this.viewDate); + if (this.o.minViewMode === 2){ + this._setDate(UTCDate(year, month, day)); + } } this.showMode(-1); this.fill(); @@ -401,80 +980,118 @@ break; case 'td': if (target.is('.day') && !target.is('.disabled')){ - var day = parseInt(target.text(), 10)||1; - var year = this.viewDate.getUTCFullYear(), - month = this.viewDate.getUTCMonth(); - if (target.is('.old')) { - if (month == 0) { + day = parseInt(target.text(), 10)||1; + year = this.viewDate.getUTCFullYear(); + month = this.viewDate.getUTCMonth(); + if (target.is('.old')){ + if (month === 0){ month = 11; year -= 1; - } else { + } + else { month -= 1; } - } else if (target.is('.new')) { - if (month == 11) { + } + else if (target.is('.new')){ + if (month === 11){ month = 0; year += 1; - } else { + } + else { month += 1; } } - this.date = UTCDate(year, month, day,0,0,0,0); - this.viewDate = UTCDate(year, month, day,0,0,0,0); - this.fill(); - this.setValue(); - this.element.trigger({ - type: 'changeDate', - date: this.date - }); - var element; - if (this.isInput) { - element = this.element; - } else if (this.component){ - element = this.element.find('input'); - } - if (element) { - element.change(); - if (this.autoclose) { - this.hide(); - } - } + this._setDate(UTCDate(year, month, day)); } break; } } + if (this.picker.is(':visible') && this._focused_from){ + $(this._focused_from).focus(); + } + delete this._focused_from; + }, + + _toggle_multidate: function(date){ + var ix = this.dates.contains(date); + if (!date){ + this.dates.clear(); + } + else if (ix !== -1){ + this.dates.remove(ix); + } + else { + this.dates.push(date); + } + if (typeof this.o.multidate === 'number') + while (this.dates.length > this.o.multidate) + this.dates.remove(0); + }, + + _setDate: function(date, which){ + if (!which || which === 'date') + this._toggle_multidate(date && new Date(date)); + if (!which || which === 'view') + this.viewDate = date && new Date(date); + + this.fill(); + this.setValue(); + this._trigger('changeDate'); + var element; + if (this.isInput){ + element = this.element; + } + else if (this.component){ + element = this.element.find('input'); + } + if (element){ + element.change(); + } + if (this.o.autoclose && (!which || which === 'date')){ + this.hide(); + } }, moveMonth: function(date, dir){ - if (!dir) return date; + if (!date) + return undefined; + if (!dir) + return date; var new_date = new Date(date.valueOf()), day = new_date.getUTCDate(), month = new_date.getUTCMonth(), mag = Math.abs(dir), new_month, test; dir = dir > 0 ? 1 : -1; - if (mag == 1){ - test = dir == -1 + if (mag === 1){ + test = dir === -1 // If going back one month, make sure month is not current month // (eg, Mar 31 -> Feb 31 == Feb 28, not Mar 02) - ? function(){ return new_date.getUTCMonth() == month; } + ? function(){ + return new_date.getUTCMonth() === month; + } // If going forward one month, make sure month is as expected // (eg, Jan 31 -> Feb 31 == Feb 28, not Mar 02) - : function(){ return new_date.getUTCMonth() != new_month; }; + : function(){ + return new_date.getUTCMonth() !== new_month; + }; new_month = month + dir; new_date.setUTCMonth(new_month); // Dec -> Jan (12) or Jan -> Dec (-1) -- limit expected date to 0-11 if (new_month < 0 || new_month > 11) new_month = (new_month + 12) % 12; - } else { + } + else { // For magnitudes >1, move one month at a time... - for (var i=0; i= this.startDate && date <= this.endDate; + return date >= this.o.startDate && date <= this.o.endDate; }, keydown: function(e){ if (this.picker.is(':not(:visible)')){ - if (e.keyCode == 27) // allow escape to hide and re-show picker + if (e.keyCode === 27) // allow escape to hide and re-show picker this.show(); return; } var dateChanged = false, - dir, day, month, - newDate, newViewDate; - switch(e.keyCode){ + dir, newDate, newViewDate, + focusDate = this.focusDate || this.viewDate; + switch (e.keyCode){ case 27: // escape - this.hide(); + if (this.focusDate){ + this.focusDate = null; + this.viewDate = this.dates.get(-1) || this.viewDate; + this.fill(); + } + else + this.hide(); e.preventDefault(); break; case 37: // left case 39: // right - if (!this.keyboardNavigation) break; - dir = e.keyCode == 37 ? -1 : 1; + if (!this.o.keyboardNavigation) + break; + dir = e.keyCode === 37 ? -1 : 1; if (e.ctrlKey){ - newDate = this.moveYear(this.date, dir); - newViewDate = this.moveYear(this.viewDate, dir); - } else if (e.shiftKey){ - newDate = this.moveMonth(this.date, dir); - newViewDate = this.moveMonth(this.viewDate, dir); - } else { - newDate = new Date(this.date); - newDate.setUTCDate(this.date.getUTCDate() + dir); - newViewDate = new Date(this.viewDate); - newViewDate.setUTCDate(this.viewDate.getUTCDate() + dir); + newDate = this.moveYear(this.dates.get(-1) || UTCToday(), dir); + newViewDate = this.moveYear(focusDate, dir); + this._trigger('changeYear', this.viewDate); + } + else if (e.shiftKey){ + newDate = this.moveMonth(this.dates.get(-1) || UTCToday(), dir); + newViewDate = this.moveMonth(focusDate, dir); + this._trigger('changeMonth', this.viewDate); + } + else { + newDate = new Date(this.dates.get(-1) || UTCToday()); + newDate.setUTCDate(newDate.getUTCDate() + dir); + newViewDate = new Date(focusDate); + newViewDate.setUTCDate(focusDate.getUTCDate() + dir); } if (this.dateWithinRange(newDate)){ - this.date = newDate; - this.viewDate = newViewDate; + this.focusDate = this.viewDate = newViewDate; this.setValue(); - this.update(); + this.fill(); e.preventDefault(); - dateChanged = true; } break; case 38: // up case 40: // down - if (!this.keyboardNavigation) break; - dir = e.keyCode == 38 ? -1 : 1; + if (!this.o.keyboardNavigation) + break; + dir = e.keyCode === 38 ? -1 : 1; if (e.ctrlKey){ - newDate = this.moveYear(this.date, dir); - newViewDate = this.moveYear(this.viewDate, dir); - } else if (e.shiftKey){ - newDate = this.moveMonth(this.date, dir); - newViewDate = this.moveMonth(this.viewDate, dir); - } else { - newDate = new Date(this.date); - newDate.setUTCDate(this.date.getUTCDate() + dir * 7); - newViewDate = new Date(this.viewDate); - newViewDate.setUTCDate(this.viewDate.getUTCDate() + dir * 7); + newDate = this.moveYear(this.dates.get(-1) || UTCToday(), dir); + newViewDate = this.moveYear(focusDate, dir); + this._trigger('changeYear', this.viewDate); + } + else if (e.shiftKey){ + newDate = this.moveMonth(this.dates.get(-1) || UTCToday(), dir); + newViewDate = this.moveMonth(focusDate, dir); + this._trigger('changeMonth', this.viewDate); + } + else { + newDate = new Date(this.dates.get(-1) || UTCToday()); + newDate.setUTCDate(newDate.getUTCDate() + dir * 7); + newViewDate = new Date(focusDate); + newViewDate.setUTCDate(focusDate.getUTCDate() + dir * 7); } if (this.dateWithinRange(newDate)){ - this.date = newDate; - this.viewDate = newViewDate; + this.focusDate = this.viewDate = newViewDate; this.setValue(); - this.update(); + this.fill(); e.preventDefault(); - dateChanged = true; } break; + case 32: // spacebar + // Spacebar is used in manually typing dates in some formats. + // As such, its behavior should not be hijacked. + break; case 13: // enter - this.hide(); - e.preventDefault(); + focusDate = this.focusDate || this.dates.get(-1) || this.viewDate; + this._toggle_multidate(focusDate); + dateChanged = true; + this.focusDate = null; + this.viewDate = this.dates.get(-1) || this.viewDate; + this.setValue(); + this.fill(); + if (this.picker.is(':visible')){ + e.preventDefault(); + if (this.o.autoclose) + this.hide(); + } break; case 9: // tab + this.focusDate = null; + this.viewDate = this.dates.get(-1) || this.viewDate; + this.fill(); this.hide(); break; } if (dateChanged){ - this.element.trigger({ - type: 'changeDate', - date: this.date - }); + if (this.dates.length) + this._trigger('changeDate'); + else + this._trigger('clearDate'); var element; - if (this.isInput) { + if (this.isInput){ element = this.element; - } else if (this.component){ + } + else if (this.component){ element = this.element.find('input'); } - if (element) { + if (element){ element.change(); } } }, - showMode: function(dir) { - if (dir) { - this.viewMode = Math.max(0, Math.min(2, this.viewMode + dir)); + showMode: function(dir){ + if (dir){ + this.viewMode = Math.max(this.o.minViewMode, Math.min(2, this.viewMode + dir)); } - this.picker.find('>div').hide().filter('.datepicker-'+DPGlobal.modes[this.viewMode].clsName).show(); + this.picker + .find('>div') + .hide() + .filter('.datepicker-'+DPGlobal.modes[this.viewMode].clsName) + .css('display', 'block'); this.updateNavArrows(); } }; - $.fn.datepicker = function ( option ) { - var args = Array.apply(null, arguments); - args.shift(); - return this.each(function () { - var $this = $(this), - data = $this.data('datepicker'), - options = typeof option == 'object' && option; - if (!data) { - $this.data('datepicker', (data = new Datepicker(this, $.extend({}, $.fn.datepicker.defaults,options)))); - } - if (typeof option == 'string' && typeof data[option] == 'function') { - data[option].apply(data, args); - } + var DateRangePicker = function(element, options){ + this.element = $(element); + this.inputs = $.map(options.inputs, function(i){ + return i.jquery ? i[0] : i; }); + delete options.inputs; + + $(this.inputs) + .datepicker(options) + .bind('changeDate', $.proxy(this.dateUpdated, this)); + + this.pickers = $.map(this.inputs, function(i){ + return $(i).data('datepicker'); + }); + this.updateDates(); + }; + DateRangePicker.prototype = { + updateDates: function(){ + this.dates = $.map(this.pickers, function(i){ + return i.getUTCDate(); + }); + this.updateRanges(); + }, + updateRanges: function(){ + var range = $.map(this.dates, function(d){ + return d.valueOf(); + }); + $.each(this.pickers, function(i, p){ + p.setRange(range); + }); + }, + dateUpdated: function(e){ + // `this.updating` is a workaround for preventing infinite recursion + // between `changeDate` triggering and `setUTCDate` calling. Until + // there is a better mechanism. + if (this.updating) + return; + this.updating = true; + + var dp = $(e.target).data('datepicker'), + new_date = dp.getUTCDate(), + i = $.inArray(e.target, this.inputs), + l = this.inputs.length; + if (i === -1) + return; + + $.each(this.pickers, function(i, p){ + if (!p.getUTCDate()) + p.setUTCDate(new_date); + }); + + if (new_date < this.dates[i]){ + // Date being moved earlier/left + while (i >= 0 && new_date < this.dates[i]){ + this.pickers[i--].setUTCDate(new_date); + } + } + else if (new_date > this.dates[i]){ + // Date being moved later/right + while (i < l && new_date > this.dates[i]){ + this.pickers[i++].setUTCDate(new_date); + } + } + this.updateDates(); + + delete this.updating; + }, + remove: function(){ + $.map(this.pickers, function(p){ p.remove(); }); + delete this.element.data().datepicker; + } }; - $.fn.datepicker.defaults = { + function opts_from_el(el, prefix){ + // Derive options from element data-attrs + var data = $(el).data(), + out = {}, inkey, + replace = new RegExp('^' + prefix.toLowerCase() + '([A-Z])'); + prefix = new RegExp('^' + prefix.toLowerCase()); + function re_lower(_,a){ + return a.toLowerCase(); + } + for (var key in data) + if (prefix.test(key)){ + inkey = key.replace(replace, re_lower); + out[inkey] = data[key]; + } + return out; + } + + function opts_from_locale(lang){ + // Derive options from locale plugins + var out = {}; + // Check if "de-DE" style date is available, if not language should + // fallback to 2 letter code eg "de" + if (!dates[lang]){ + lang = lang.split('-')[0]; + if (!dates[lang]) + return; + } + var d = dates[lang]; + $.each(locale_opts, function(i,k){ + if (k in d) + out[k] = d[k]; + }); + return out; + } + + var old = $.fn.datepicker; + $.fn.datepicker = function(option){ + var args = Array.apply(null, arguments); + args.shift(); + var internal_return; + this.each(function(){ + var $this = $(this), + data = $this.data('datepicker'), + options = typeof option === 'object' && option; + if (!data){ + var elopts = opts_from_el(this, 'date'), + // Preliminary otions + xopts = $.extend({}, defaults, elopts, options), + locopts = opts_from_locale(xopts.language), + // Options priority: js args, data-attrs, locales, defaults + opts = $.extend({}, defaults, locopts, elopts, options); + if ($this.is('.input-daterange') || opts.inputs){ + var ropts = { + inputs: opts.inputs || $this.find('input').toArray() + }; + $this.data('datepicker', (data = new DateRangePicker(this, $.extend(opts, ropts)))); + } + else { + $this.data('datepicker', (data = new Datepicker(this, opts))); + } + } + if (typeof option === 'string' && typeof data[option] === 'function'){ + internal_return = data[option].apply(data, args); + if (internal_return !== undefined) + return false; + } + }); + if (internal_return !== undefined) + return internal_return; + else + return this; }; + + var defaults = $.fn.datepicker.defaults = { + autoclose: false, + beforeShowDay: $.noop, + calendarWeeks: false, + clearBtn: false, + daysOfWeekDisabled: [], + endDate: Infinity, + forceParse: true, + format: 'mm/dd/yyyy', + keyboardNavigation: true, + language: 'en', + minViewMode: 0, + multidate: false, + multidateSeparator: ',', + orientation: "auto", + rtl: false, + startDate: -Infinity, + startView: 0, + todayBtn: false, + todayHighlight: false, + weekStart: 0 + }; + var locale_opts = $.fn.datepicker.locale_opts = [ + 'format', + 'rtl', + 'weekStart' + ]; $.fn.datepicker.Constructor = Datepicker; var dates = $.fn.datepicker.dates = { + en: { days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"], months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], - monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] - } + monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], + today: "Today", + clear: "Clear" + } + }; var DPGlobal = { modes: [ @@ -635,35 +1445,40 @@ navFnc: 'FullYear', navStep: 10 }], - isLeapYear: function (year) { - return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0)) + isLeapYear: function(year){ + return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0)); }, - getDaysInMonth: function (year, month) { - return [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month] + getDaysInMonth: function(year, month){ + return [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month]; }, - validParts: /dd?|mm?|MM?|yy(?:yy)?/g, - nonpunctuation: /[^ -\/:-@\[-`{-~\t\n\r]+/g, + validParts: /dd?|DD?|mm?|MM?|yy(?:yy)?/g, + nonpunctuation: /[^ -\/:-@\[\u3400-\u9fff-`{-~\t\n\r]+/g, parseFormat: function(format){ // IE treats \0 as a string end in inputs (truncating the value), // so it's a bad format delimiter, anyway var separators = format.replace(this.validParts, '\0').split('\0'), parts = format.match(this.validParts); - if (!separators || !separators.length || !parts || parts.length == 0){ + if (!separators || !separators.length || !parts || parts.length === 0){ throw new Error("Invalid date format."); } return {separators: separators, parts: parts}; }, - parseDate: function(date, format) { - if (date instanceof Date) return date; - if (/^[-+]\d+[dmwy]([\s,]+[-+]\d+[dmwy])*$/.test(date)) { - var part_re = /([-+]\d+)([dmwy])/, - parts = date.match(/([-+]\d+)([dmwy])/g), - part, dir; + parseDate: function(date, format, language){ + if (!date) + return undefined; + if (date instanceof Date) + return date; + if (typeof format === 'string') + format = DPGlobal.parseFormat(format); + var part_re = /([\-+]\d+)([dmwy])/, + parts = date.match(/([\-+]\d+)([dmwy])/g), + part, dir, i; + if (/^[\-+]\d+[dmwy]([\s,]+[\-+]\d+[dmwy])*$/.test(date)){ date = new Date(); - for (var i=0; i'+ ''+ - ''+ - ''+ - ''+ + '«'+ + ''+ + '»'+ ''+ '', - contTemplate: '' + contTemplate: '', + footTemplate: ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + '' }; - DPGlobal.template = '
    - - -
    - -
    - - - - + +
    +
    + + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - + diff --git a/UI/Templates/UIxToolbar.wox b/UI/Templates/UIxToolbar.wox index 04efd3d0f..fa4144dd4 100644 --- a/UI/Templates/UIxToolbar.wox +++ b/UI/Templates/UIxToolbar.wox @@ -7,45 +7,36 @@ xmlns:label="OGo:label" xmlns:so="http://www.skyrix.com/od/so-lookup">
    - + + +
    -
    +
    - -
    - + var:alt="buttonTooltip"/> + +
    + + + + +
    + +
    + + + + + +
    From 8f6b0f80a794743d83c0cc129266dc6b2492528f Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Mon, 14 Apr 2014 10:29:23 -0400 Subject: [PATCH 060/144] Creation of the first version of the printing interface --- UI/Scheduler/GNUmakefile | 1 + .../Toolbars/SOGoAppointmentFolders.toolbar | 2 +- UI/Scheduler/UIxCalViewPrint.h | 31 +++ UI/Scheduler/UIxCalViewPrint.m | 31 +++ UI/Scheduler/product.plist | 5 + UI/Templates/SchedulerUI/UIxCalViewPrint.wox | 208 +++++++++--------- UI/WebServerResources/SchedulerUI.js | 7 + UI/WebServerResources/UIxCalViewPrint.css | 125 +++++++++++ UI/WebServerResources/UIxCalViewPrint.js | 81 +++++++ 9 files changed, 387 insertions(+), 104 deletions(-) create mode 100644 UI/Scheduler/UIxCalViewPrint.h create mode 100644 UI/Scheduler/UIxCalViewPrint.m create mode 100644 UI/WebServerResources/UIxCalViewPrint.css create mode 100644 UI/WebServerResources/UIxCalViewPrint.js diff --git a/UI/Scheduler/GNUmakefile b/UI/Scheduler/GNUmakefile index c3bc3b3d7..4f6db932c 100644 --- a/UI/Scheduler/GNUmakefile +++ b/UI/Scheduler/GNUmakefile @@ -23,6 +23,7 @@ SchedulerUI_OBJC_FILES = \ UIxCalFolderActions.m \ \ UIxCalView.m \ + UIxCalViewPrint.m \ UIxCalDayView.m \ UIxCalMulticolumnDayView.m \ UIxCalWeekView.m \ diff --git a/UI/Scheduler/Toolbars/SOGoAppointmentFolders.toolbar b/UI/Scheduler/Toolbars/SOGoAppointmentFolders.toolbar index 8801d1571..772bb4573 100644 --- a/UI/Scheduler/Toolbars/SOGoAppointmentFolders.toolbar +++ b/UI/Scheduler/Toolbars/SOGoAppointmentFolders.toolbar @@ -38,7 +38,7 @@ image = "month-view.png"; tooltip = "Switch to month view"; } ), ( { link = "#"; - onclick = ""; + onclick = "return printView();"; cssClass = "tbicon_print single-window-not-conditional"; image = "tb-mail-print-flat-24x24.png"; label = "Print View"; diff --git a/UI/Scheduler/UIxCalViewPrint.h b/UI/Scheduler/UIxCalViewPrint.h new file mode 100644 index 000000000..f6e87046b --- /dev/null +++ b/UI/Scheduler/UIxCalViewPrint.h @@ -0,0 +1,31 @@ +/* UIxCalView.h - this file is part of SOGo + * + * Copyright (C) 2006-2009 Inverse inc. + * + * Author: Wolfgang Sourdeau + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This file 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#import + +@interface UIxCalViewPrint : UIxComponent +{ + +} + +@end + diff --git a/UI/Scheduler/UIxCalViewPrint.m b/UI/Scheduler/UIxCalViewPrint.m new file mode 100644 index 000000000..afef85fb2 --- /dev/null +++ b/UI/Scheduler/UIxCalViewPrint.m @@ -0,0 +1,31 @@ +/* UIxCalView.m - this file is part of SOGo + * + * Copyright (C) 2006-2009 Inverse inc. + * + * Author: Wolfgang Sourdeau + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This file 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#import +#import "UIxCalViewPrint.h" + + +@implementation UIxCalViewPrint +{ + +} +@end diff --git a/UI/Scheduler/product.plist b/UI/Scheduler/product.plist index 3c3af6be9..417b9e2d6 100644 --- a/UI/Scheduler/product.plist +++ b/UI/Scheduler/product.plist @@ -40,6 +40,11 @@ protectedBy = "View"; pageName = "UIxCalMainView"; }; + printView = { + protectedBy = ""; + pageName = "UIxCalViewPrint"; + actionClass = "UIxCalViewPrint"; + }; addWebCalendar = { protectedBy = "View"; actionClass = "UIxCalMainActions"; diff --git a/UI/Templates/SchedulerUI/UIxCalViewPrint.wox b/UI/Templates/SchedulerUI/UIxCalViewPrint.wox index 5b0e8417a..2f006d311 100644 --- a/UI/Templates/SchedulerUI/UIxCalViewPrint.wox +++ b/UI/Templates/SchedulerUI/UIxCalViewPrint.wox @@ -1,109 +1,111 @@ - + - -
    + xmlns="http://www.w3.org/1999/xhtml" + xmlns:var="http://www.skyrix.com/od/binding" + xmlns:const="http://www.skyrix.com/od/constant" + xmlns:uix="OGo:uix" + xmlns:label="OGo:label" + className="UIxPageFrame" + const:popup="YES" + const:cssFiles="datepicker.css" + const:jsFiles="datepicker.js"> - - - - - - - -
    -
    -
    +
    + + + + + + + + + + + +
    + +
    + +
    - - - - - - - - - - - - - - - - -
    - -
    -
    -
    -
    -
    -
    + + + + + + + + + + + + + + + + +
    + +
    +
    +
    +
    + +
    + +
    - - - - - - - - -
    -
    -
    - - -
    - - - - - - - + + + + + + + +
    +
    +
    -
    - +
    +
    +

    Lorem ipsum dolor sit amet, facilisis eros non lacus interdum lectus, sed vel bibendum lorem sagittis velit enim, amet placerat, placerat lacus, feugiat non donec auctor. Metus non sollicitudin, et pulvinar, nam sit euismod, dolor arcu est neque, non velit maecenas cras vestibulum. Sit illum, libero imperdiet amet velit cursus rerum lorem, risus morbi orci commodo lectus quam phasellus. Wisi morbi, a ac, adipiscing integer sapien nec dignissim a, venenatis mi placerat id ut, vehicula cursus nam sit praesent pharetra curabitur. Id nonummy. Sollicitudin sit mattis. Nec nunc pede arcu nullam, sit in amet dui erat, aliquam in tortor semper nulla, non sem purus consectetuer aliquam. Sollicitudin sagittis nulla id placerat nunc, volutpat condimentum tempus viverra, mi molestie nulla, ac est egestas nunc lacus purus. Tincidunt libero nam montes felis volutpat, placerat leo nisl ligula urna lacinia, wisi phasellus velit suscipit. Sagittis amet quis tellus lorem, tortor arcu ac, sollicitudin varius dolor, pharetra sit, pellentesque nulla duis. Dolor scelerisque maecenas ultrices, aliquet adipiscing augue semper egestas nec vivamus, nunc amet ullamcorper id. + Dictum id quis nisl quidem, fugit sapien vehicula per. Ultricies sit adipiscing vel ullamcorper ut consequat, et arcu dictum tortor semper cursus. Vestibulum lorem vestibulum pretium quisque. Vel ac nisl duis enim, eu habitasse cras ipsum lectus, elit blandit vitae. Volutpat congue eget curabitur consequat sollicitudin sed, quis dictum consectetuer lectus integer felis. Eget nibh ac ipsum metus magna, ut velit sed ac, quam adipiscing, velit nunc mollis in accumsan ut vestibulum. Ac massa tempor diam metus scelerisque, senectus sem habitasse vel orci semper, vulputate leo. + Suspendisse erat dolor vestibulum, curabitur lacinia ac suspendisse fringilla vestibulum. Viverra nisl in convallis, ac class nibh dui tincidunt vestibulum fusce. Platea vitae non. Ipsum neque justo, urna lacus. Nostra adipiscing cras placerat vestibulum vestibulum ultrices, justo turpis ac urna et auctor. Integer aliquam enim, felis aliquam nostra sem, arcu tempus pede tortor ullamcorper enim, suspendisse luctus id enim leo tincidunt. Enim pede sed urna sed aenean aliquam. Sagittis laoreet mattis morbi incidunt, volutpat et gravida duis sed. Ornare sollicitudin in. + Tincidunt justo. Diam velit dolor, mauris volutpat nullam dolor, laoreet pede eget pellentesque gravida, sollicitudin diam nam ultrices eleifend integer, cras elementum libero pellentesque volutpat donec. Tincidunt mi in sem. Mauris elementum odio tortor. Suscipit lorem sapien enim viverra nam, sed ut nunc, turpis vitae nisl. Aliquam ullamcorper at suscipit, lacinia velit nec ut lorem sed. Faucibus ac leo neque fringilla erat felis. Venenatis mauris erat, justo laoreet amet sociis.

    +
    +
    + + + + +
    \ No newline at end of file diff --git a/UI/WebServerResources/SchedulerUI.js b/UI/WebServerResources/SchedulerUI.js index 897d21a06..c3b9a93a3 100644 --- a/UI/WebServerResources/SchedulerUI.js +++ b/UI/WebServerResources/SchedulerUI.js @@ -33,6 +33,13 @@ var categoriesStyleSheet = null; var clipboard = null; var eventsToCopy = []; +function printView() { + + window.open("printView","","width=660,height=470"); + + return false; /* stop following the link */ +} + function newEvent(type, day, hour, duration) { var folder = null; if (UserDefaults['SOGoDefaultCalendar'] == 'personal') diff --git a/UI/WebServerResources/UIxCalViewPrint.css b/UI/WebServerResources/UIxCalViewPrint.css new file mode 100644 index 000000000..683293a89 --- /dev/null +++ b/UI/WebServerResources/UIxCalViewPrint.css @@ -0,0 +1,125 @@ + +BODY +{ + top: 1em; + bottom: 1em; + right: 1em; + left: 1em; + overflow:scroll; +} + +.toolbar +{ + display:none; +} + + +#labelTitle +{ + width:100%; + text-align:left; +} + + +#printButton +{ + font-weight:bold; +} + +DIV#leftSide +{ + min-height:370px; + max-height:370px; + max-width:220px; + min-width:220px; + float:left; +} + +DIV#rightSide +{ + min-height:370px; + max-height:370px; + min-width:330px; + max-width:330px; + float:right; + +} + DIV#rightFrame + { + min-height:350px; + max-height:350px; + background-color:#FFFFFF; + border-radius:8px; + border-top: 1px solid #909090; + border-left: 1px solid #909090; + border-bottom: 1px solid #FFFFFF; + border-right: 1px solid #FFFFFF; + margin-top: 12px; + margin-left: auto; + margin-right: auto; + margin-bottom: 1em; + padding-left:10px; + padding-right:10px; + overflow:scroll; + } + +#dateRangeFrom, #dateRangeTo +{ + text-align: right; +} + +/* Overiding the general.css */ + +TABLE.frame{ + width:97%; + text-align: left; + background:#dddddd; + border-radius:8px; + display:table; +} + +#startingDate, #endingDate +{ + width:auto; + vertical-align:8px; +} +#labelFrom, #labelTo +{ + vertical-align:8px; +} + +SPAN.caption +{ + background: -webkit-linear-gradient(bottom, #E6E7E6, #dddddd); /* For Safari 5.1 to 6.0 */ + background: -o-linear-gradient(bottom, #E6E7E6, #dddddd); /* For Opera 11.1 to 12.0 */ + background: -moz-linear-gradient(bottom, #E6E7E6, #dddddd); /* For Firefox 3.6 to 15 */ + background: linear-gradient(to bottom, #E6E7E6, #dddddd); /* Standard syntax (must be last) */ +} + + +/******************************/ + +@media print +{ + .no-print, SPAN.caption + { + display:none; + } + DIV#rightSide + { + border:solid red 1px; + max-width:100%; + max-height:99%; + float:none; + } + DIV#rightFrame + { + border:solid green 1px; + width:100%; + height:99%; + marging: 0; + padding: 0; + //border:0; + overflow:visible; + } +} diff --git a/UI/WebServerResources/UIxCalViewPrint.js b/UI/WebServerResources/UIxCalViewPrint.js new file mode 100644 index 000000000..7feb866f2 --- /dev/null +++ b/UI/WebServerResources/UIxCalViewPrint.js @@ -0,0 +1,81 @@ +/* -*- Mode: js2-mode; tab-width: 4; c-label-minimum-indentation: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ + +/* + Copyright (C) 2005 SKYRIX Software AG + Copyright (C) 2006-2011 Inverse + + 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. +*/ + + +this.onAdjustTime = function(event) { + onAdjustDueTime(event); +}; + +this.onAdjustDueTime = function(event) { + /*var dateDelta = (window.getStartDate().valueOf() - window.getShadowStartDate().valueOf()); + var newDueDate = new Date(window.getDueDate().valueOf() + dateDelta); + window.setDueDate(newDueDate);*/ + + window.timeWidgets['start']['date'].updateShadowValue(); +}; + +this.initTimeWidgets = function (widgets) { + this.timeWidgets = widgets; + + jQuery(widgets['start']['date']).closest('.date').datepicker({autoclose: true, weekStart: 0, position: "bellow"}); + jQuery(widgets['end']['date']).closest('.date').datepicker({autoclose: true, weekStart: 0, position: "bellow"}); + + //jQuery(widgets['start']['date']).change(onAdjustTime); + + /*jQuery(widgets['startingDate']['date']).closest('.date').datepicker({autoclose: true, + weekStart: 0, + endDate: lastDay, + startDate: firstDay, + setStartDate: lastDay, + startView: 2, + position: "below-shifted-left"});*/ +}; + + + + +function onPrintCancelClick(event) { + this.blur(); + onCloseButtonClick(event); +} + +function onPrintClick(event) { + this.blur(); + window.print(); +} + + + +function init() { + + $("cancelButton").observe("click", onPrintCancelClick); + $("printButton").observe("click", onPrintClick); + + var widgets = {'start': {'date': $("startingDate")}, + 'end': {'date': $("endingDate")}}; + initTimeWidgets(widgets); + +} + +document.observe("dom:loaded", init); From 57b747c24ada3ceb1f2b4f1ac8ec551014f8ffc1 Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Thu, 17 Apr 2014 17:33:30 -0400 Subject: [PATCH 061/144] Events list is done. --- .../English.lproj/Localizable.strings | 23 ++ UI/Scheduler/UIxCalViewPrint.h | 8 +- UI/Scheduler/UIxCalViewPrint.m | 60 ++++- UI/Templates/SchedulerUI/UIxCalViewPrint.wox | 57 +++-- UI/WebServerResources/UIxCalViewPrint.css | 138 +++++++----- UI/WebServerResources/UIxCalViewPrint.js | 213 +++++++++++++++++- 6 files changed, 406 insertions(+), 93 deletions(-) diff --git a/UI/Scheduler/English.lproj/Localizable.strings b/UI/Scheduler/English.lproj/Localizable.strings index 900fa9614..11690e651 100644 --- a/UI/Scheduler/English.lproj/Localizable.strings +++ b/UI/Scheduler/English.lproj/Localizable.strings @@ -145,6 +145,29 @@ "Hide already accepted and rejected appointments" = "Hide already accepted and rejected appointments"; "Show already accepted and rejected appointments" = "Show already accepted and rejected appointments"; +/* Print view */ +"LIST" = "List"; +"WEEK" = "Weekly"; +"MONTH" = "Monthly"; +"Print Settings" = "Print Settings"; +"Title:" = "Title:"; +"Layout:" = "Layout:"; +"What to Print" = "What to Print"; +"Events" = "Events"; +"Tasks" = "Tasks"; +"Current view" = "Current view"; +"Selected events and tasks" = "Selected events and tasks"; +"Custom date range" = "Custom date range"; +"From:" = "From:"; +"To:" = "To:"; +"Options" = "Options"; +"Locale" = "Locale"; +"GMT" = "GMT"; +"Tasks with no due date" = "Tasks with no due date"; +"Completed tasks" = "Completed tasks"; +"Display time:" = "Display time:"; + + /* Appointments */ diff --git a/UI/Scheduler/UIxCalViewPrint.h b/UI/Scheduler/UIxCalViewPrint.h index f6e87046b..7e6ea1ba1 100644 --- a/UI/Scheduler/UIxCalViewPrint.h +++ b/UI/Scheduler/UIxCalViewPrint.h @@ -1,8 +1,8 @@ /* UIxCalView.h - this file is part of SOGo * - * Copyright (C) 2006-2009 Inverse inc. + * Copyright (C) 2006-2014 Inverse inc. * - * Author: Wolfgang Sourdeau + * Author: Alexandre Cloutier * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,11 +20,11 @@ * Boston, MA 02111-1307, USA. */ -#import +#include @interface UIxCalViewPrint : UIxComponent { - + id item; } @end diff --git a/UI/Scheduler/UIxCalViewPrint.m b/UI/Scheduler/UIxCalViewPrint.m index afef85fb2..8bd2d6da4 100644 --- a/UI/Scheduler/UIxCalViewPrint.m +++ b/UI/Scheduler/UIxCalViewPrint.m @@ -1,8 +1,8 @@ /* UIxCalView.m - this file is part of SOGo * - * Copyright (C) 2006-2009 Inverse inc. + * Copyright (C) 2006-2014 Inverse inc. * - * Author: Wolfgang Sourdeau + * Author: Alexandre Cloutier * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,11 +21,63 @@ */ #import -#import "UIxCalViewPrint.h" +#import +#import + +static NSArray *layoutItems = nil; @implementation UIxCalViewPrint + ++ (void) initialize { - + if (!layoutItems) + { + layoutItems = [NSArray arrayWithObjects: @"LIST", @"WEEK", @"MONTH", nil]; + [layoutItems retain]; + } + } +- (id) init +{ + item = nil; + return [super init]; +} + +- (void) dealloc +{ + [item release]; + [super dealloc]; +} + +/****************************************************************/ +/* Interfacing; populating the popup list for the print layouts */ + +- (void) setItem: (NSString *) newItem +{ + ASSIGN (item, newItem); +} + +- (NSString *) item +{ + return item; +} + +- (NSArray *) printLayoutList +{ + return layoutItems; +} + +- (NSString *) itemPrintLayoutText +{ + return [self labelForKey: [NSString stringWithFormat: item]]; +} + +- (NSString *) layoutSelectedByUser +{ + return nil; +} +/******************************************************************/ +/* */ + @end diff --git a/UI/Templates/SchedulerUI/UIxCalViewPrint.wox b/UI/Templates/SchedulerUI/UIxCalViewPrint.wox index 2f006d311..447f5856c 100644 --- a/UI/Templates/SchedulerUI/UIxCalViewPrint.wox +++ b/UI/Templates/SchedulerUI/UIxCalViewPrint.wox @@ -9,8 +9,8 @@ className="UIxPageFrame" const:popup="YES" const:cssFiles="datepicker.css" - const:jsFiles="datepicker.js"> - + const:jsFiles="datepicker.js" > +
    @@ -19,18 +19,15 @@ - + - + @@ -40,29 +37,29 @@ - + - + + + + + +
    + +
    +
    +
    -

    Lorem ipsum dolor sit amet, facilisis eros non lacus interdum lectus, sed vel bibendum lorem sagittis velit enim, amet placerat, placerat lacus, feugiat non donec auctor. Metus non sollicitudin, et pulvinar, nam sit euismod, dolor arcu est neque, non velit maecenas cras vestibulum. Sit illum, libero imperdiet amet velit cursus rerum lorem, risus morbi orci commodo lectus quam phasellus. Wisi morbi, a ac, adipiscing integer sapien nec dignissim a, venenatis mi placerat id ut, vehicula cursus nam sit praesent pharetra curabitur. Id nonummy. Sollicitudin sit mattis. Nec nunc pede arcu nullam, sit in amet dui erat, aliquam in tortor semper nulla, non sem purus consectetuer aliquam. Sollicitudin sagittis nulla id placerat nunc, volutpat condimentum tempus viverra, mi molestie nulla, ac est egestas nunc lacus purus. Tincidunt libero nam montes felis volutpat, placerat leo nisl ligula urna lacinia, wisi phasellus velit suscipit. Sagittis amet quis tellus lorem, tortor arcu ac, sollicitudin varius dolor, pharetra sit, pellentesque nulla duis. Dolor scelerisque maecenas ultrices, aliquet adipiscing augue semper egestas nec vivamus, nunc amet ullamcorper id. - Dictum id quis nisl quidem, fugit sapien vehicula per. Ultricies sit adipiscing vel ullamcorper ut consequat, et arcu dictum tortor semper cursus. Vestibulum lorem vestibulum pretium quisque. Vel ac nisl duis enim, eu habitasse cras ipsum lectus, elit blandit vitae. Volutpat congue eget curabitur consequat sollicitudin sed, quis dictum consectetuer lectus integer felis. Eget nibh ac ipsum metus magna, ut velit sed ac, quam adipiscing, velit nunc mollis in accumsan ut vestibulum. Ac massa tempor diam metus scelerisque, senectus sem habitasse vel orci semper, vulputate leo. - Suspendisse erat dolor vestibulum, curabitur lacinia ac suspendisse fringilla vestibulum. Viverra nisl in convallis, ac class nibh dui tincidunt vestibulum fusce. Platea vitae non. Ipsum neque justo, urna lacus. Nostra adipiscing cras placerat vestibulum vestibulum ultrices, justo turpis ac urna et auctor. Integer aliquam enim, felis aliquam nostra sem, arcu tempus pede tortor ullamcorper enim, suspendisse luctus id enim leo tincidunt. Enim pede sed urna sed aenean aliquam. Sagittis laoreet mattis morbi incidunt, volutpat et gravida duis sed. Ornare sollicitudin in. - Tincidunt justo. Diam velit dolor, mauris volutpat nullam dolor, laoreet pede eget pellentesque gravida, sollicitudin diam nam ultrices eleifend integer, cras elementum libero pellentesque volutpat donec. Tincidunt mi in sem. Mauris elementum odio tortor. Suscipit lorem sapien enim viverra nam, sed ut nunc, turpis vitae nisl. Aliquam ullamcorper at suscipit, lacinia velit nec ut lorem sed. Faucibus ac leo neque fringilla erat felis. Venenatis mauris erat, justo laoreet amet sociis.

    + + +
    \ No newline at end of file +
    +
    + \ No newline at end of file diff --git a/UI/WebServerResources/UIxCalViewPrint.css b/UI/WebServerResources/UIxCalViewPrint.css index 683293a89..bbc067030 100644 --- a/UI/WebServerResources/UIxCalViewPrint.css +++ b/UI/WebServerResources/UIxCalViewPrint.css @@ -1,4 +1,5 @@ +/****** Window & layouts ******/ BODY { top: 1em; @@ -9,40 +10,14 @@ BODY } .toolbar -{ - display:none; -} - - -#labelTitle -{ - width:100%; - text-align:left; -} - - -#printButton -{ - font-weight:bold; -} - -DIV#leftSide -{ - min-height:370px; - max-height:370px; - max-width:220px; - min-width:220px; - float:left; -} +{ display:none;} DIV#rightSide { - min-height:370px; - max-height:370px; - min-width:330px; - max-width:330px; - float:right; - + position: absolute; + left:230px; + height:370px; + width:330px; } DIV#rightFrame { @@ -60,34 +35,93 @@ DIV#rightSide margin-bottom: 1em; padding-left:10px; padding-right:10px; - overflow:scroll; + overflow-y:scroll; + overflow-x:hidden; } +DIV#leftSide +{ + position: absolute; + height:370px; + width:220px; +} + +DIV.colorBox +{ display: inline-block; } + +TD DIV.colorBox, TD DIV.colorBox:hover +{ border-color: #fff; } + +TABLE#eventsList .colorBox +{ margin-right: 4px; } + + +/******************************/ +/****** Print settings *******/ + +#title +{ + width:120px; +} + +/******************************/ +/****** What to print ********/ + #dateRangeFrom, #dateRangeTo { text-align: right; } -/* Overiding the general.css */ - -TABLE.frame{ - width:97%; - text-align: left; - background:#dddddd; - border-radius:8px; - display:table; -} - #startingDate, #endingDate { width:auto; vertical-align:8px; } + #labelFrom, #labelTo { vertical-align:8px; } +/************************/ +/****** Buttons ********/ + +#printButton +{ + font-weight:bold; +} + +/**************************/ +/****** RightSide ********/ + +.divEventsPreview +{ + border:solid black 2px; + border-radius:5px; + margin-top:4px; + margin-bottom:4px; +} +.eventsPreview +{ + +} + +#rightFrameEvents{ + +} + + +/*******************************************/ +/****** Overriding the general.css ********/ + +TABLE.frame{ + width:97%; + text-align: left; + background:#dddddd; + border-radius:8px; + display:table; +} + SPAN.caption { background: -webkit-linear-gradient(bottom, #E6E7E6, #dddddd); /* For Safari 5.1 to 6.0 */ @@ -96,8 +130,8 @@ SPAN.caption background: linear-gradient(to bottom, #E6E7E6, #dddddd); /* Standard syntax (must be last) */ } - -/******************************/ +/**************************************************/ +/****** Calling print(); from the browser ********/ @media print { @@ -107,19 +141,15 @@ SPAN.caption } DIV#rightSide { - border:solid red 1px; - max-width:100%; - max-height:99%; - float:none; + position:absolute; + top:5px; + left:5px; + width:100%; + height:100%; } DIV#rightFrame { - border:solid green 1px; - width:100%; - height:99%; - marging: 0; - padding: 0; - //border:0; + border: none; overflow:visible; } } diff --git a/UI/WebServerResources/UIxCalViewPrint.js b/UI/WebServerResources/UIxCalViewPrint.js index 7feb866f2..c631c01b6 100644 --- a/UI/WebServerResources/UIxCalViewPrint.js +++ b/UI/WebServerResources/UIxCalViewPrint.js @@ -22,10 +22,14 @@ 02111-1307, USA. */ +/******************************** Global variables *******************************************/ +var firstDayOfWeek = window.opener.firstDayOfWeek; +var displayTime; +/*********************************************************************************************/ this.onAdjustTime = function(event) { onAdjustDueTime(event); -}; +} this.onAdjustDueTime = function(event) { /*var dateDelta = (window.getStartDate().valueOf() - window.getShadowStartDate().valueOf()); @@ -33,13 +37,13 @@ this.onAdjustDueTime = function(event) { window.setDueDate(newDueDate);*/ window.timeWidgets['start']['date'].updateShadowValue(); -}; +} this.initTimeWidgets = function (widgets) { this.timeWidgets = widgets; - jQuery(widgets['start']['date']).closest('.date').datepicker({autoclose: true, weekStart: 0, position: "bellow"}); - jQuery(widgets['end']['date']).closest('.date').datepicker({autoclose: true, weekStart: 0, position: "bellow"}); + jQuery(widgets['start']['date']).closest('.date').datepicker({autoclose: true, weekStart: 0}); + jQuery(widgets['end']['date']).closest('.date').datepicker({autoclose: true, weekStart: 0}); //jQuery(widgets['start']['date']).change(onAdjustTime); @@ -50,10 +54,201 @@ this.initTimeWidgets = function (widgets) { setStartDate: lastDay, startView: 2, position: "below-shifted-left"});*/ -}; +} +function refreshCalendarDisplay(){ + refreshCalendarEvents(); + refreshCalendarTasks(); +} +function refreshCalendarTasks(){ + +} +function refreshCalendarEvents() { + var todayDate = new Date(); + var sd; + var ed; + var currentDay = window.parentvar("currentDay"); + var currentView = window.parentvar("currentView"); + + if (!currentDay) + currentDay = todayDate.getDayString(); + + if (currentView == "dayview") { + sd = currentDay; + ed = sd; + } + else if (currentView == "weekview") { + var startDate; + startDate = currentDay.asDate(); + startDate = startDate.beginOfWeek(); + sd = startDate.getDayString(); + var endDate = new Date(); + endDate.setTime(startDate.getTime()); + endDate.addDays(6); + ed = endDate.getDayString(); + } + else { + var monthDate; + monthDate = currentDay.asDate(); + monthDate.setDate(1); + sd = monthDate.beginOfWeek().getDayString(); + + var lastMonthDate = new Date(); + lastMonthDate.setTime(monthDate.getTime()); + lastMonthDate.setMonth(monthDate.getMonth() + 1); + lastMonthDate.addDays(-1); + ed = lastMonthDate.endOfWeek().getDayString(); + } + if (document.refreshCalendarEventsAjaxRequest) { + document.refreshCalendarEventsAjaxRequest.aborted = true; + document.refreshCalendarEventsAjaxRequest.abort(); + } + var url = (ApplicationBaseURL + "/eventsblocks?sd=" + sd + "&ed=" + ed + + "&view=" + currentView); + + document.refreshCalendarEventsAjaxRequest + = triggerAjaxRequest(url, refreshCalendarEventsCallback, + {"startDate": sd, "endDate": ed}); +} +function refreshCalendarEventsCallback(http) { + if (http.readyState == 4 + && http.status == 200) { + if (http.responseText.length > 0) { + var layout = $("printLayoutList").value; + var eventsBlocks = http.responseText.evalJSON(true); + $("rightFrameEvents").innerHTML = ""; + // 0 == listLayout + if (layout == "0"){ + _drawListEvents(eventsBlocks); + } + // 1 == weekLayout + if (layout == "1"){ + _drawWeekEvents(eventsBlocks); + } + // 2 == monthLayout + if (layout == "2"){ + _drawMonthEvents(eventsBlocks); + } + } + } + else + log("AJAX error when refreshing calendar events"); +} + +function _drawListEvents(eventsBlocks) { + for(var i=0; i"; + if (displayTime) + parsedEvent += ""+ startDate.toLocaleString() + " - " + endDate.toLocaleString() + ""; + else + parsedEvent += ""+ startDate.toGMTString() + "
    " + endDate.toGMTString() + ""; + parsedEvent += "Calendar : " + event[2] + ""; + parsedEvent += "
    "; + return parsedEvent; +} + +function _drawMonthCalendarEvents(events, eventsData) { + var daysView = $("monthDaysView"); + var days = daysView.childNodesWithTag("div"); + for (var i = 0; i < days.length; i++) { + var parentDiv = days[i]; + for (var j = 0; j < events[i].length; j++) { + var eventRep = events[i][j]; + var nbr = eventRep.nbr; + var eventCell = newMonthEventDIV(eventRep, eventsData[nbr]); + parentDiv.appendChild(eventCell); + } + } +} + +/*********************** Input Field, Checkboxes, Radio and listMenu *********************************/ + +function onInputTitle(event){ + var titleValue = $("title").value; + if (titleValue) + document.getElementById("rightFrameTitle").innerHTML = titleValue + "
    "; + else + document.getElementById("rightFrameTitle").innerHTML = titleValue; +} + +function onPrintLayoutListChange(event) { + // TODO : Common filtering; what to display on the view + + // legend for the events display; 0=list, 1=week, 2=month + + refreshCalendarDisplay(); +} + +function initializeLayoutList() { + var printLayoutList = $("printLayoutList"); + var title = $("title"); + if (printLayoutList) { + onPrintLayoutListChange(); + printLayoutList.observe("change", onPrintLayoutListChange); + + } + if (title){ + title.observe("change", onInputTitle); + } +} + +function onTasksCheck(checkBox) { + if (checkBox) { + var printOptions = document.getElementsByName("printOptions"); + for (var i = 0; i < printOptions.length; i++) + if (printOptions[i] != checkBox) + printOptions[i].disabled = !checkBox.checked; + + if(checkBox.checked) + document.getElementById("rightFrameTasks").style.display = 'block'; + else + document.getElementById("rightFrameTasks").style.display = 'none'; + } +} + +function onEventsCheck(checkBox) { + if (checkBox){ + if(checkBox.checked) + document.getElementById("rightFrameEvents").style.display = 'block'; + else + document.getElementById("rightFrameEvents").style.display = 'none'; + } + +} + +function printDateCheck() { + var dateRange = document.getElementsByName("dateRange"); + var customDate = document.getElementById("customDate"); + for (var i = 0; i < dateRange.length; i++) + if (dateRange[i].children[1].children[0].disabled == customDate.checked) + dateRange[i].children[1].children[0].disabled = !customDate.checked; +} + +function displayTimeCheck(){ + var radioButtons = document.getElementsByName("printTime"); + if (radioButtons[0].checked) + displayTime = true; + else + displayTime = false; + + refreshCalendarDisplay(); +} + +/******************************* Buttons ***********************************************/ function onPrintCancelClick(event) { this.blur(); @@ -64,8 +259,7 @@ function onPrintClick(event) { this.blur(); window.print(); } - - +/**************************** Initialization *******************************************/ function init() { @@ -75,7 +269,10 @@ function init() { var widgets = {'start': {'date': $("startingDate")}, 'end': {'date': $("endingDate")}}; initTimeWidgets(widgets); - + printDateCheck(); + displayTimeCheck(); + initializeLayoutList(); + refreshCalendarDisplay(); } document.observe("dom:loaded", init); From f9869d19b478c82d86a423dd3b3948adcdc19d5e Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Tue, 22 Apr 2014 17:47:29 -0400 Subject: [PATCH 062/144] Finished the view, need to display the eventsblock --- .../English.lproj/Localizable.strings | 3 +- UI/Scheduler/UIxCalViewPrint.m | 2 +- UI/Templates/SchedulerUI/UIxCalViewPrint.wox | 22 +- UI/WebServerResources/UIxCalViewPrint.css | 15 +- UI/WebServerResources/UIxCalViewPrint.js | 404 +++++++++++++----- 5 files changed, 315 insertions(+), 131 deletions(-) diff --git a/UI/Scheduler/English.lproj/Localizable.strings b/UI/Scheduler/English.lproj/Localizable.strings index 11690e651..68ad40111 100644 --- a/UI/Scheduler/English.lproj/Localizable.strings +++ b/UI/Scheduler/English.lproj/Localizable.strings @@ -147,6 +147,7 @@ /* Print view */ "LIST" = "List"; +"DAY" = "Daily"; "WEEK" = "Weekly"; "MONTH" = "Monthly"; "Print Settings" = "Print Settings"; @@ -166,7 +167,7 @@ "Tasks with no due date" = "Tasks with no due date"; "Completed tasks" = "Completed tasks"; "Display time:" = "Display time:"; - +"Calendar:" = "Calendar:"; /* Appointments */ diff --git a/UI/Scheduler/UIxCalViewPrint.m b/UI/Scheduler/UIxCalViewPrint.m index 8bd2d6da4..fcca440dd 100644 --- a/UI/Scheduler/UIxCalViewPrint.m +++ b/UI/Scheduler/UIxCalViewPrint.m @@ -33,7 +33,7 @@ static NSArray *layoutItems = nil; { if (!layoutItems) { - layoutItems = [NSArray arrayWithObjects: @"LIST", @"WEEK", @"MONTH", nil]; + layoutItems = [NSArray arrayWithObjects: @"LIST", @"DAY", @"WEEK", @"MONTH", nil]; [layoutItems retain]; } diff --git a/UI/Templates/SchedulerUI/UIxCalViewPrint.wox b/UI/Templates/SchedulerUI/UIxCalViewPrint.wox index 447f5856c..67b1629c0 100644 --- a/UI/Templates/SchedulerUI/UIxCalViewPrint.wox +++ b/UI/Templates/SchedulerUI/UIxCalViewPrint.wox @@ -19,7 +19,7 @@ - + @@ -45,18 +45,18 @@ @@ -86,10 +86,10 @@ @@ -97,20 +97,20 @@
    - - - +
    +
    +
    diff --git a/UI/WebServerResources/UIxCalViewPrint.css b/UI/WebServerResources/UIxCalViewPrint.css index bbc067030..8946fd4ac 100644 --- a/UI/WebServerResources/UIxCalViewPrint.css +++ b/UI/WebServerResources/UIxCalViewPrint.css @@ -17,7 +17,7 @@ DIV#rightSide position: absolute; left:230px; height:370px; - width:330px; + width:660px; } DIV#rightFrame { @@ -94,7 +94,7 @@ TABLE#eventsList .colorBox /**************************/ /****** RightSide ********/ -.divEventsPreview +.divEventsPreview, .divTasksPreview { border:solid black 2px; border-radius:5px; @@ -110,6 +110,17 @@ TABLE#eventsList .colorBox } +.overdueTasks { + color:red; +} +.completedTasks { + font-style:italic; +} + +.EventsTasksDate { + text-indent:20px; +} + /*******************************************/ /****** Overriding the general.css ********/ diff --git a/UI/WebServerResources/UIxCalViewPrint.js b/UI/WebServerResources/UIxCalViewPrint.js index c631c01b6..b740f8598 100644 --- a/UI/WebServerResources/UIxCalViewPrint.js +++ b/UI/WebServerResources/UIxCalViewPrint.js @@ -24,52 +24,60 @@ /******************************** Global variables *******************************************/ var firstDayOfWeek = window.opener.firstDayOfWeek; -var displayTime; -/*********************************************************************************************/ +var displayTime=true; +var printCompletedTasks=1; +var printNoDueDateTasks=1; +var eventsBlocks; +var currentView; +var sd, ed; -this.onAdjustTime = function(event) { - onAdjustDueTime(event); +/******************************************* Ajust Window position from his size ***********************************************************/ + +function ajustWindow(width, height) { + var left = (screen.width/2)-(width/2); + var top = (screen.height/2)-(height/2); + window.moveTo(left, top); } -this.onAdjustDueTime = function(event) { - /*var dateDelta = (window.getStartDate().valueOf() - window.getShadowStartDate().valueOf()); - var newDueDate = new Date(window.getDueDate().valueOf() + dateDelta); - window.setDueDate(newDueDate);*/ +/****************************************** Ajax Requests, callbacks & events/tasks drawings ***************************************************/ - window.timeWidgets['start']['date'].updateShadowValue(); -} - -this.initTimeWidgets = function (widgets) { - this.timeWidgets = widgets; - - jQuery(widgets['start']['date']).closest('.date').datepicker({autoclose: true, weekStart: 0}); - jQuery(widgets['end']['date']).closest('.date').datepicker({autoclose: true, weekStart: 0}); - - //jQuery(widgets['start']['date']).change(onAdjustTime); - - /*jQuery(widgets['startingDate']['date']).closest('.date').datepicker({autoclose: true, - weekStart: 0, - endDate: lastDay, - startDate: firstDay, - setStartDate: lastDay, - startView: 2, - position: "below-shifted-left"});*/ -} -function refreshCalendarDisplay(){ +function refreshCalendarDisplay() { refreshCalendarEvents(); refreshCalendarTasks(); } -function refreshCalendarTasks(){ +function updatePreviewDisplay() { + var url = ApplicationBaseURL + "/" + currentView; + + if (document.dayDisplayAjaxRequest) { + document.dayDisplayAjaxRequest.aborted = true; + document.dayDisplayAjaxRequest.abort(); + } + document.dayDisplayAjaxRequest + = triggerAjaxRequest(url, previewDisplayCallback, + {"startDate": sd, "endDate": ed }); + return false; +} + +function previewDisplayCallback(http) { + if (http.readyState == 4 + && http.status == 200) { + document.dayDisplayAjaxRequest = null; + $("rightFrameEvents").update(http.responseText); + + if ($("printLayoutList").value == "3") + _drawMonthEvents(eventsBlocks[2], eventsBlocks[0]); + else + _drawCalendarEvents(eventsBlocks[2], eventsBlocks[0]); + } + else + log ("calendarDisplayCallback Ajax error ("+ http.readyState + "/" + http.status + ")"); } function refreshCalendarEvents() { var todayDate = new Date(); - var sd; - var ed; var currentDay = window.parentvar("currentDay"); - var currentView = window.parentvar("currentView"); if (!currentDay) currentDay = todayDate.getDayString(); @@ -112,24 +120,35 @@ function refreshCalendarEvents() { {"startDate": sd, "endDate": ed}); } +function refreshCalendarTasks(){ + if (document.tasksListAjaxRequest) { + document.tasksListAjaxRequest.aborted = true; + document.tasksListAjaxRequest.abort(); + } + + url = window.parentvar("ApplicationBaseURL") + "/" + "taskslist?show-completed=" + printCompletedTasks + + "&asc=" + sorting["task-ascending"] + + "&sort=" + sorting["task-attribute"]; + var tasksList = window.parent$("tasksList"); + var selectedIds; + if (tasksList) + selectedIds = tasksList.getSelectedNodesId(); + else + selectedIds = null; + + document.tasksListAjaxRequest = triggerAjaxRequest(url, refreshCalendarTasksListCallback, selectedIds); +} + function refreshCalendarEventsCallback(http) { if (http.readyState == 4 && http.status == 200) { if (http.responseText.length > 0) { - var layout = $("printLayoutList").value; - var eventsBlocks = http.responseText.evalJSON(true); + eventsBlocks = http.responseText.evalJSON(true); $("rightFrameEvents").innerHTML = ""; - // 0 == listLayout - if (layout == "0"){ - _drawListEvents(eventsBlocks); - } - // 1 == weekLayout - if (layout == "1"){ - _drawWeekEvents(eventsBlocks); - } - // 2 == monthLayout - if (layout == "2"){ - _drawMonthEvents(eventsBlocks); + if ($("printLayoutList").value == "0") + _drawEventsCells(); + else { + updatePreviewDisplay(); } } } @@ -137,31 +156,75 @@ function refreshCalendarEventsCallback(http) { log("AJAX error when refreshing calendar events"); } -function _drawListEvents(eventsBlocks) { - for(var i=0; i 0) { + var tasksBlocks = http.responseText.evalJSON(true); + $("rightFrameTasks").innerHTML = ""; + var layout = $("printLayoutList").value; + if (layout == 0) + _drawTasksCells(tasksBlocks); + else + _drawTasksList(tasksBlocks); + } + } + else + log("AJAX error when refreshing calendar events"); +} + +function _drawEventsCells() { + for(var i=0; i < eventsBlocks[0].length; i++) { var event = _parseEvent(eventsBlocks[0][i]); $("rightFrameEvents").innerHTML += event; } } -function _parseEvent(event) -{ - var startDate = new Date(event[5] *1000); - var endDate = new Date(event[6] *1000); - var parsedEvent; - parsedEvent = "
    "; - parsedEvent += ""; - if (displayTime) - parsedEvent += ""; - else - parsedEvent += ""; - parsedEvent += ""; - parsedEvent += "
    "+ event[4] +"
    "+ startDate.toLocaleString() + " - " + endDate.toLocaleString() + "
    "+ startDate.toGMTString() + "
    " + endDate.toGMTString() + "
    Calendar : " + event[2] + "
    "; - return parsedEvent; +function _drawTasksCells(tasksBlocks) { + for(var i=0; i < tasksBlocks.length; i++) + { + if (!(printNoDueDateTasks == 0 && tasksBlocks[i][5] == null)) { + var task = _parseTask(tasksBlocks[i]); + $("rightFrameTasks").innerHTML += task; + } + } } -function _drawMonthCalendarEvents(events, eventsData) { +function _drawTasksList(tasksBlocks) { + var tasksList; + tasksList = "
      "; + for(var i=0; i < tasksBlocks.length; i++) + { + if (!(printNoDueDateTasks == 0 && tasksBlocks[i][5] == null)) { + tasksList += "
    • " + tasksBlocks[i][4] + "
    • "; + } + } + tasksList += "
    "; + $("rightFrameTasks").innerHTML = tasksList; +} + +function _drawCalendarEvents(events, eventsData) { + var daysView = $("daysView"); + var subdivs = daysView.childNodesWithTag("div"); + for (var i = 0; i < subdivs.length; i++) { + var subdiv = subdivs[i]; + if (subdiv.hasClassName("days")) { + var days = subdiv.childNodesWithTag("div"); + for (var j = 0; j < days.length; j++) { + var parentDiv = days[j].childNodesWithTag("div")[0]; + for (var k = 0; k < events[j].length; k++) { + var eventRep = events[j][k]; + var nbr = eventRep.nbr; + var eventCell = newEventDIV(eventRep, eventsData[nbr]); + parentDiv.appendChild(eventCell); + } + } + } + } +} + +function _drawMonthEvents(events, eventsData) { var daysView = $("monthDaysView"); var days = daysView.childNodesWithTag("div"); for (var i = 0; i < days.length; i++) { @@ -170,67 +233,127 @@ function _drawMonthCalendarEvents(events, eventsData) { var eventRep = events[i][j]; var nbr = eventRep.nbr; var eventCell = newMonthEventDIV(eventRep, eventsData[nbr]); - parentDiv.appendChild(eventCell); + parentDiv.innerHTML += eventCell; } } } -/*********************** Input Field, Checkboxes, Radio and listMenu *********************************/ - -function onInputTitle(event){ - var titleValue = $("title").value; - if (titleValue) - document.getElementById("rightFrameTitle").innerHTML = titleValue + "
    "; +function newMonthEventDIV(eventRep, event) { + var eventText; + if (event[8]) // all-day event + eventText = event[4]; else - document.getElementById("rightFrameTitle").innerHTML = titleValue; + eventText = "" + eventRep.starthour + " - " + event[4] + ""; + + return eventText; } -function onPrintLayoutListChange(event) { - // TODO : Common filtering; what to display on the view +function _parseEvent(event) { + var parsedEvent; + var startDate = new Date(event[5] *1000); + var endDate = new Date(event[6] *1000); + parsedEvent = "
    "; + parsedEvent += ""; + if (displayTime) + parsedEvent += ""; + else + parsedEvent += ""; + parsedEvent += ""; + parsedEvent += "
    "+ event[4] +"
    "+ startDate.toLocaleString() + " - " + endDate.toLocaleString() + "
    "+ startDate.toGMTString() + "
    " + endDate.toGMTString() + "
    " + event[2] + "
    "; + return parsedEvent; +} + +function _parseTask(task) { + var parsedTask; + var dueDate; - // legend for the events display; 0=list, 1=week, 2=month + parsedTask = "
    "; + if (task[12] == "overdue") + parsedTask += ""; + else if (task[12] == "completed") { + parsedTask += ""; + } + else + parsedTask += ""; + + if (task[5] != null) { + dueDate = new Date(task[5] *1000); + if (displayTime) + parsedTask += ""; + else + parsedTask += ""; + } + parsedTask += ""; + parsedTask += "
    "+ task[4] +"
    "+ task[4] +"
    "+ task[4] +"
    "+ dueDate.toLocaleString() + "
    "+ dueDate.toGMTString() + "
    " + task[2] + "
    "; + + return parsedTask; +} + +/*********************** Input Field, Checkboxes, Radio and listMenu *********************************/ + +function onInputTitleChange(event){ + var inputFieldTitle = $("inputFieldTitle").value; + if (inputFieldTitle) + document.getElementById("rightFrameTitle").innerHTML = inputFieldTitle + "
    "; + else + document.getElementById("rightFrameTitle").innerHTML = inputFieldTitle; +} + +function onPrintLayoutListChange() { + var selectedLayout = $("printLayoutList").value; + var parentView = window.parentvar("currentView"); + switch(selectedLayout) { + case "0": // List view + window.resizeTo(660,500); + ajustWindow(660,500); + $("rightSide").style.width = "390px"; + currentView = parentView; + break; + + case "1": // Day view + window.resizeTo(660,500); + ajustWindow(660,500); + $("rightSide").style.width = "390px"; + currentView = "dayview"; + break; + + case "2": // Week view + window.resizeTo(1010,500); + ajustWindow(1010,500); + $("rightSide").style.width = "740px"; + currentView = "weekview"; + break; + + case "3": // Month view + window.resizeTo(1010,500); + ajustWindow(1010,500); + $("rightSide").style.width = "740px"; + currentView = "monthview"; + break; + } refreshCalendarDisplay(); } -function initializeLayoutList() { - var printLayoutList = $("printLayoutList"); - var title = $("title"); - if (printLayoutList) { - onPrintLayoutListChange(); - printLayoutList.observe("change", onPrintLayoutListChange); - - } - if (title){ - title.observe("change", onInputTitle); - } +function onEventsCheck(checkBox) { + if(checkBox.checked) + document.getElementById("rightFrameEvents").style.display = 'block'; + else + document.getElementById("rightFrameEvents").style.display = 'none'; } function onTasksCheck(checkBox) { - if (checkBox) { - var printOptions = document.getElementsByName("printOptions"); - for (var i = 0; i < printOptions.length; i++) - if (printOptions[i] != checkBox) - printOptions[i].disabled = !checkBox.checked; + var printOptions = document.getElementsByName("printOptions"); + for (var i = 0; i < printOptions.length; i++) + printOptions[i].disabled = !checkBox.checked; - if(checkBox.checked) - document.getElementById("rightFrameTasks").style.display = 'block'; - else - document.getElementById("rightFrameTasks").style.display = 'none'; - } + if(checkBox.checked) + document.getElementById("rightFrameTasks").style.display = 'block'; + else + document.getElementById("rightFrameTasks").style.display = 'none'; } -function onEventsCheck(checkBox) { - if (checkBox){ - if(checkBox.checked) - document.getElementById("rightFrameEvents").style.display = 'block'; - else - document.getElementById("rightFrameEvents").style.display = 'none'; - } - -} - -function printDateCheck() { +function onPrintDateCheck() { var dateRange = document.getElementsByName("dateRange"); var customDate = document.getElementById("customDate"); for (var i = 0; i < dateRange.length; i++) @@ -238,16 +361,53 @@ function printDateCheck() { dateRange[i].children[1].children[0].disabled = !customDate.checked; } -function displayTimeCheck(){ - var radioButtons = document.getElementsByName("printTime"); - if (radioButtons[0].checked) - displayTime = true; - else - displayTime = false; - +function onDisplayTimeFormatCheck(){ + var radioTimeFormat = document.getElementsByName("printTimeFormat"); + displayTime = (radioTimeFormat[0].checked ? true : false); refreshCalendarDisplay(); } +function onPrintCompletedTasksCheck(checkBox) { + printCompletedTasks = (checkBox.checked ? 1 : 0); + refreshCalendarTasks(); +} + +function onPrintNoDueDateTasksCheck(checkBox) { + printNoDueDateTasks = (checkBox.checked ? 1 : 0); + refreshCalendarTasks(); +} + +/************** Date picker functions *************/ +this.initTimeWidgets = function (widgets) { + this.timeWidgets = widgets; + + jQuery(widgets['start']['date']).closest('.date').datepicker({autoclose: true, weekStart: 0}); + jQuery(widgets['end']['date']).closest('.date').datepicker({autoclose: true, weekStart: 0}); + + //jQuery(widgets['start']['date']).change(onAdjustTime); + + /*jQuery(widgets['startingDate']['date']).closest('.date').datepicker({autoclose: true, + weekStart: 0, + endDate: lastDay, + startDate: firstDay, + setStartDate: lastDay, + startView: 2, + position: "below-shifted-left"});*/ +} + +this.onAdjustTime = function(event) { + onAdjustDueTime(event); +} + +this.onAdjustDueTime = function(event) { + /*var dateDelta = (window.getStartDate().valueOf() - window.getShadowStartDate().valueOf()); + var newDueDate = new Date(window.getDueDate().valueOf() + dateDelta); + window.setDueDate(newDueDate);*/ + + window.timeWidgets['start']['date'].updateShadowValue(); +} +/****************************************************/ + /******************************* Buttons ***********************************************/ function onPrintCancelClick(event) { @@ -263,16 +423,28 @@ function onPrintClick(event) { function init() { + initializePrintSettings(); + initializeWhatToPrint(); + //initializeOptions(); $("cancelButton").observe("click", onPrintCancelClick); $("printButton").observe("click", onPrintClick); + onPrintLayoutListChange(); +} + +function initializePrintSettings() { + $("inputFieldTitle").observe("change", onInputTitleChange); + $("printLayoutList").observe("change", onPrintLayoutListChange); +} + +function initializeWhatToPrint() { var widgets = {'start': {'date': $("startingDate")}, 'end': {'date': $("endingDate")}}; initTimeWidgets(widgets); - printDateCheck(); - displayTimeCheck(); - initializeLayoutList(); - refreshCalendarDisplay(); + onPrintDateCheck(); } +/*function initializeOptions() { +}*/ + document.observe("dom:loaded", init); From 619cb2c0ec310514c80e976dcb2cf89c25822f46 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 23 Apr 2014 09:22:20 -0400 Subject: [PATCH 063/144] Fix for bug #2721 --- NEWS | 1 + UI/MailPartViewers/UIxMailPartHTMLViewer.m | 18 +++++++++++++----- UI/WebServerResources/MailerUI.js | 4 ++-- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/NEWS b/NEWS index 629313fcd..1157416cb 100644 --- a/NEWS +++ b/NEWS @@ -20,6 +20,7 @@ Bug fixes - fixed wrong generation of weekly repetitive events with ActiveSync (#2654) - fixed incorrect XML data conversion with ActiveSync (#2695) - fixed display of events having a category with HTML entities (#2703) + - fixed display of images in CSS background (#2437) 2.2.3 (2014-04-03) ------------------ diff --git a/UI/MailPartViewers/UIxMailPartHTMLViewer.m b/UI/MailPartViewers/UIxMailPartHTMLViewer.m index e9e45fbbc..df981a470 100644 --- a/UI/MailPartViewers/UIxMailPartHTMLViewer.m +++ b/UI/MailPartViewers/UIxMailPartHTMLViewer.m @@ -559,6 +559,13 @@ static NSData* _sanitizeContent(NSData *theData) && ![value hasPrefix: @"mailto:"] && ![value hasPrefix: @"#"]); } + // Avoid:
    + else if ([name isEqualToString: @"style"]) + { + value = [_attributes valueAtIndex: count]; + if ([value rangeOfString: @"url" options: NSCaseInsensitiveSearch].location != NSNotFound) + name = [NSString stringWithFormat: @"unsafe-%@", name]; + } else if ( // Mouse Events [name isEqualToString: @"onclick"] || @@ -594,12 +601,13 @@ static NSData* _sanitizeContent(NSData *theData) } else value = [_attributes valueAtIndex: count]; + if (!skipAttribute) [resultPart appendFormat: @" %@=\"%@\"", name, [value stringByReplacingString: @"\"" withString: @"\\\""]]; } - + if ([VoidTags containsObject: lowerName]) [resultPart appendString: @"/"]; [resultPart appendString: @">"]; @@ -686,16 +694,16 @@ static NSData* _sanitizeContent(NSData *theData) [self _appendStyle: _chars length: _len]; else if (inBody) { - NSString *tmpString; + NSString *s; - tmpString = [NSString stringWithCharacters: _chars length: _len]; + s = [NSString stringWithCharacters: _chars length: _len]; // HACK: This is to avoid appending the useless junk in the tag // that Outlook adds. It seems to confuse the XML parser for // forwarded messages as we get this in the _body_ of the email // while we really aren't in it! - if (![tmpString hasPrefix: @" xmlns:v=\"urn:schemas-microsoft-com:vml\""]) - [result appendString: [tmpString stringByEscapingHTMLString]]; + if (![s hasPrefix: @" xmlns:v=\"urn:schemas-microsoft-com:vml\""]) + [result appendString: [s stringByEscapingHTMLString]]; } } } diff --git a/UI/WebServerResources/MailerUI.js b/UI/WebServerResources/MailerUI.js index d418b2f99..a8519a1f5 100644 --- a/UI/WebServerResources/MailerUI.js +++ b/UI/WebServerResources/MailerUI.js @@ -1260,7 +1260,7 @@ function configureLoadImagesButton() { return; } var content = $("messageContent"); - var unsafeElements = content.select('[unsafe-src], [unsafe-data], [unsafe-classid], [unsafe-background]'); + var unsafeElements = content.select('[unsafe-src], [unsafe-data], [unsafe-classid], [unsafe-background], [unsafe-style]'); if (unsafeElements.length == 0) { loadImagesButton.setStyle({ display: 'none' }); } @@ -1560,7 +1560,7 @@ function loadRemoteImages() { var content = $("messageContent"); if (content.hiddenElements) { $(content.hiddenElements).each(function(element) { - ['src', 'data', 'classid', 'background'].each(function(attr) { + ['src', 'data', 'classid', 'background', 'style'].each(function(attr) { var unsafeAttr = element.readAttribute('unsafe-' + attr); if (unsafeAttr) { log ('unsafe ' + attr + ': ' + unsafeAttr); From 66bfbeaac1cbed4e1e06fa727273fcfd0d5c36d0 Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Wed, 23 Apr 2014 10:55:04 -0400 Subject: [PATCH 064/144] MailEditor: fix text conversion with HTML entities --- SoObjects/Mailer/NSString+Mail.m | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/SoObjects/Mailer/NSString+Mail.m b/SoObjects/Mailer/NSString+Mail.m index 91bca78fc..48c850b9e 100644 --- a/SoObjects/Mailer/NSString+Mail.m +++ b/SoObjects/Mailer/NSString+Mail.m @@ -417,7 +417,15 @@ { if (!ignoreContent) { - [result appendString: [[NSString stringWithCharacters: characters length: length] stringByEscapingHTMLString]]; + // Append a text node + if (ignoreContentTags) + // We are converting a HTML message to plain text (htmlToTextContentHandler): + // include the HTML tags in the text + [result appendString: [NSString stringWithCharacters: characters length: length]]; + else + // We are sanitizing an HTML message (sanitizerContentHandler): + // escape the HTML entitites so they are visible + [result appendString: [[NSString stringWithCharacters: characters length: length] stringByEscapingHTMLString]]; } } From ba7b65cf7bd15425ee9eab1e3e94e52ba54d4df9 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 24 Apr 2014 07:59:07 -0400 Subject: [PATCH 065/144] Fix for bug #2733 --- ActiveSync/NGVCard+ActiveSync.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ActiveSync/NGVCard+ActiveSync.m b/ActiveSync/NGVCard+ActiveSync.m index 8c9a421a0..d6f8fa199 100644 --- a/ActiveSync/NGVCard+ActiveSync.m +++ b/ActiveSync/NGVCard+ActiveSync.m @@ -154,7 +154,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // Other, less important fields if ((o = [self birthday])) - [s appendFormat: @"%@", [o activeSyncRepresentationWithoutSeparatorsInContext: context]]; + [s appendFormat: @"%@", [o activeSyncRepresentationInContext: context]]; if ((o = [self note])) { From 9dc07fccc0732107621297cec2eadb9d2673e049 Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Fri, 25 Apr 2014 18:04:24 -0400 Subject: [PATCH 066/144] It is now possible to print the calendar as a list, dayView or weekView --- .../English.lproj/Localizable.strings | 1 - UI/Scheduler/UIxCalViewPrint.m | 2 +- UI/WebServerResources/UIxCalViewPrint.css | 136 +++++--- UI/WebServerResources/UIxCalViewPrint.js | 303 ++++++++++++++---- 4 files changed, 337 insertions(+), 105 deletions(-) diff --git a/UI/Scheduler/English.lproj/Localizable.strings b/UI/Scheduler/English.lproj/Localizable.strings index 68ad40111..422a19a57 100644 --- a/UI/Scheduler/English.lproj/Localizable.strings +++ b/UI/Scheduler/English.lproj/Localizable.strings @@ -149,7 +149,6 @@ "LIST" = "List"; "DAY" = "Daily"; "WEEK" = "Weekly"; -"MONTH" = "Monthly"; "Print Settings" = "Print Settings"; "Title:" = "Title:"; "Layout:" = "Layout:"; diff --git a/UI/Scheduler/UIxCalViewPrint.m b/UI/Scheduler/UIxCalViewPrint.m index fcca440dd..d719d70bc 100644 --- a/UI/Scheduler/UIxCalViewPrint.m +++ b/UI/Scheduler/UIxCalViewPrint.m @@ -33,7 +33,7 @@ static NSArray *layoutItems = nil; { if (!layoutItems) { - layoutItems = [NSArray arrayWithObjects: @"LIST", @"DAY", @"WEEK", @"MONTH", nil]; + layoutItems = [NSArray arrayWithObjects: @"LIST", @"DAY", @"WEEK", nil]; [layoutItems retain]; } diff --git a/UI/WebServerResources/UIxCalViewPrint.css b/UI/WebServerResources/UIxCalViewPrint.css index 8946fd4ac..4b71d173c 100644 --- a/UI/WebServerResources/UIxCalViewPrint.css +++ b/UI/WebServerResources/UIxCalViewPrint.css @@ -6,44 +6,21 @@ BODY bottom: 1em; right: 1em; left: 1em; - overflow:scroll; + overflow:auto; } .toolbar { display:none;} -DIV#rightSide -{ - position: absolute; - left:230px; - height:370px; - width:660px; -} - DIV#rightFrame - { - min-height:350px; - max-height:350px; - background-color:#FFFFFF; - border-radius:8px; - border-top: 1px solid #909090; - border-left: 1px solid #909090; - border-bottom: 1px solid #FFFFFF; - border-right: 1px solid #FFFFFF; - margin-top: 12px; - margin-left: auto; - margin-right: auto; - margin-bottom: 1em; - padding-left:10px; - padding-right:10px; - overflow-y:scroll; - overflow-x:hidden; - } - DIV#leftSide { position: absolute; - height:370px; - width:220px; + top:0; + bottom:0; + left:0; + right:0; + max-width:220px; + overflow-y:auto; } DIV.colorBox @@ -86,6 +63,12 @@ TABLE#eventsList .colorBox /************************/ /****** Buttons ********/ +#printButtons { + position:absolute; + bottom:0; + right:0; +} + #printButton { font-weight:bold; @@ -101,14 +84,6 @@ TABLE#eventsList .colorBox margin-top:4px; margin-bottom:4px; } -.eventsPreview -{ - -} - -#rightFrameEvents{ - -} .overdueTasks { color:red; @@ -121,6 +96,80 @@ TABLE#eventsList .colorBox text-indent:20px; } +DIV#rightSide +{ + position: absolute; + left:230px; + top:0; + bottom:0; + right:0; +} + DIV#rightFrame + { + position:absolute; + right:0; + left:0; + top:12px; + bottom:30px; + background-color:#FFFFFF; + border-radius:5px; + border-top: 1px solid #909090; + border-left: 1px solid #909090; + border-bottom: 1px solid #FFFFFF; + border-right: 1px solid #FFFFFF; + padding-left:5px; + padding-right:5px; + overflow-y:auto; + } + #rightFrameEvents{ + } + + #rightFrameTasks{ + } + + +/***********************************************/ +/****** Overriding the SchedulerUI.css ********/ + +DIV#calendarHeader { + position:relative; + top:0; + height:70px; +} + +DIV#calendarHeader DIV.dayLabels { + position:relative; + width:93%; + display:flex; +} + +DIV#daysView { + position:relative; + top:0; +} + +DIV#daysView DIV.days { + display:flex; +} + +DIV#daysView DIV.day0, +DIV#daysView DIV.day1, +DIV#daysView DIV.day2, +DIV#daysView DIV.day3, +DIV#daysView DIV.day4, +DIV#daysView DIV.day5, +DIV#daysView DIV.day6 { + position:relative; + left:0; + display:inline-block; +} + +DIV.event{ + z-index:1; + border:solid black 2px; + background-color:white; + border-radius:5px; +} /*******************************************/ /****** Overriding the general.css ********/ @@ -152,15 +201,20 @@ SPAN.caption } DIV#rightSide { - position:absolute; + position:relative; top:5px; left:5px; width:100%; - height:100%; + height:auto; + } + DIV#rightFrame, DIV#rightFrameEvents, DIV#rightFrameTasks + { + width:100%; + height:auto; } DIV#rightFrame { - border: none; + border:none; overflow:visible; } } diff --git a/UI/WebServerResources/UIxCalViewPrint.js b/UI/WebServerResources/UIxCalViewPrint.js index b740f8598..ce6f6e404 100644 --- a/UI/WebServerResources/UIxCalViewPrint.js +++ b/UI/WebServerResources/UIxCalViewPrint.js @@ -29,6 +29,7 @@ var printCompletedTasks=1; var printNoDueDateTasks=1; var eventsBlocks; var currentView; +var currentDay = window.parentvar("currentDay"); var sd, ed; /******************************************* Ajust Window position from his size ***********************************************************/ @@ -41,13 +42,53 @@ function ajustWindow(width, height) { /****************************************** Ajax Requests, callbacks & events/tasks drawings ***************************************************/ -function refreshCalendarDisplay() { - refreshCalendarEvents(); - refreshCalendarTasks(); +function refreshContent() { + refreshEvents(); // Get the eventBlocks and draw them + refreshTasks(); // Get the taskLists and draw them } -function updatePreviewDisplay() { - var url = ApplicationBaseURL + "/" + currentView; +function updateDisplayView(data, newView) { + newView = ((newView) ? newView : currentView); + var url = ApplicationBaseURL + "/" + newView; + var day = null; + + if (data) { + day = data['day']; + } + if (!day) + day = currentDay; + + if (day) { + if (data) { + var dayDiv = $("day"+day); + if (dayDiv) { + // Don't reload the view if the event is present in current view + + // Deselect day in date selector + if (document.selectedDate) + document.selectedDate.deselect(); + + // Select day in date selector + var selectedLink = $$('table#dateSelectorTable span[day='+day+']'); + if (selectedLink.length > 0) { + selectedCell = selectedLink[0].getParentWithTagName("td"); + $(selectedCell).selectElement(); + document.selectedDate = selectedCell; + } else + document.selectedDate = null; + + setSelectedDayDate(day); + + return false; + } + else if (day.length == 6) { + day += "01"; + } + } + url += "?day=" + day; + } + + selectedCalendarCell = null; if (document.dayDisplayAjaxRequest) { document.dayDisplayAjaxRequest.aborted = true; @@ -55,29 +96,28 @@ function updatePreviewDisplay() { } document.dayDisplayAjaxRequest = triggerAjaxRequest(url, previewDisplayCallback, - {"startDate": sd, "endDate": ed }); - - return false; + { "view": newView, + "day": day}); } function previewDisplayCallback(http) { if (http.readyState == 4 && http.status == 200) { - document.dayDisplayAjaxRequest = null; - $("rightFrameEvents").update(http.responseText); - - if ($("printLayoutList").value == "3") - _drawMonthEvents(eventsBlocks[2], eventsBlocks[0]); - else - _drawCalendarEvents(eventsBlocks[2], eventsBlocks[0]); + $("rightFrameEvents").innerHTML = http.responseText; + $("currentViewMenu").remove(); + $("listCollapse").remove(); + + // TODO : Month + _drawEvents(eventsBlocks[2], eventsBlocks[0]); } else log ("calendarDisplayCallback Ajax error ("+ http.readyState + "/" + http.status + ")"); + + return false; } -function refreshCalendarEvents() { +function refreshEvents() { var todayDate = new Date(); - var currentDay = window.parentvar("currentDay"); if (!currentDay) currentDay = todayDate.getDayString(); @@ -108,19 +148,19 @@ function refreshCalendarEvents() { lastMonthDate.addDays(-1); ed = lastMonthDate.endOfWeek().getDayString(); } - if (document.refreshCalendarEventsAjaxRequest) { - document.refreshCalendarEventsAjaxRequest.aborted = true; - document.refreshCalendarEventsAjaxRequest.abort(); + if (document.refreshEventsAjaxRequest) { + document.refreshEventsAjaxRequest.aborted = true; + document.refreshEventsAjaxRequest.abort(); } var url = (ApplicationBaseURL + "/eventsblocks?sd=" + sd + "&ed=" + ed + "&view=" + currentView); - document.refreshCalendarEventsAjaxRequest - = triggerAjaxRequest(url, refreshCalendarEventsCallback, + document.refreshEventsAjaxRequest + = triggerAjaxRequest(url, refreshEventsCallback, {"startDate": sd, "endDate": ed}); } -function refreshCalendarTasks(){ +function refreshTasks(){ if (document.tasksListAjaxRequest) { document.tasksListAjaxRequest.aborted = true; document.tasksListAjaxRequest.abort(); @@ -136,19 +176,19 @@ function refreshCalendarTasks(){ else selectedIds = null; - document.tasksListAjaxRequest = triggerAjaxRequest(url, refreshCalendarTasksListCallback, selectedIds); + document.tasksListAjaxRequest = triggerAjaxRequest(url, refreshTasksListCallback, selectedIds); } -function refreshCalendarEventsCallback(http) { +function refreshEventsCallback(http) { if (http.readyState == 4 && http.status == 200) { if (http.responseText.length > 0) { eventsBlocks = http.responseText.evalJSON(true); $("rightFrameEvents").innerHTML = ""; if ($("printLayoutList").value == "0") - _drawEventsCells(); + _drawEventsCells(eventsBlocks); else { - updatePreviewDisplay(); + updateDisplayView(null, currentView); } } } @@ -156,7 +196,7 @@ function refreshCalendarEventsCallback(http) { log("AJAX error when refreshing calendar events"); } -function refreshCalendarTasksListCallback(http) { +function refreshTasksListCallback(http) { if (http.readyState == 4 && http.status == 200) { if (http.responseText.length > 0) { @@ -173,7 +213,7 @@ function refreshCalendarTasksListCallback(http) { log("AJAX error when refreshing calendar events"); } -function _drawEventsCells() { +function _drawEventsCells(eventsBlocks) { for(var i=0; i < eventsBlocks[0].length; i++) { var event = _parseEvent(eventsBlocks[0][i]); @@ -204,7 +244,7 @@ function _drawTasksList(tasksBlocks) { $("rightFrameTasks").innerHTML = tasksList; } -function _drawCalendarEvents(events, eventsData) { +function _drawEvents(events, eventsData) { var daysView = $("daysView"); var subdivs = daysView.childNodesWithTag("div"); for (var i = 0; i < subdivs.length; i++) { @@ -223,29 +263,120 @@ function _drawCalendarEvents(events, eventsData) { } } } +// todo : month -function _drawMonthEvents(events, eventsData) { - var daysView = $("monthDaysView"); - var days = daysView.childNodesWithTag("div"); - for (var i = 0; i < days.length; i++) { - var parentDiv = days[i]; - for (var j = 0; j < events[i].length; j++) { - var eventRep = events[i][j]; - var nbr = eventRep.nbr; - var eventCell = newMonthEventDIV(eventRep, eventsData[nbr]); - parentDiv.innerHTML += eventCell; - } +function newEventDIV(eventRep, event) { + var eventCell = newBaseEventDIV(eventRep, event, event[4]); + + var pc = 100 / eventRep.siblings; + var left = Math.floor(eventRep.position * pc); + eventCell.style.left = left + "%"; + var right = Math.floor(100 - (eventRep.position + 1) * pc); + eventCell.style.right = right + "%"; + eventCell.addClassName("starts" + eventRep.start); + eventCell.addClassName("lasts" + eventRep.length); + + if (event[7]) { + var inside = eventCell.childNodesWithTag("div")[0]; + var textDiv = inside.childNodesWithTag("div")[1]; + textDiv.appendChild(createElement("br")); + var span = createElement("span", null, "location"); + var text = _("Location:") + " " + event[7]; + span.update(text); + textDiv.appendChild(span); } + + return eventCell; } -function newMonthEventDIV(eventRep, event) { - var eventText; - if (event[8]) // all-day event - eventText = event[4]; - else - eventText = "" + eventRep.starthour + " - " + event[4] + ""; - - return eventText; +function newBaseEventDIV(eventRep, event, eventText) { + // log ("0 cname = " + event[0]); + // log ("1 calendar = " + event[1]); + // log ("2 calendar name = " + event[2]); + // log ("3 status = " + event[3]); + // log ("4 title = " + event[4]); + // log ("5 start = " + event[5]); + // log ("6 end = " + event[6]); + // log ("7 location = " + event[7]); + // log ("8 isallday = " + event[8]); + // log ("9 classification = " + event[9]); // 0 = public, 1 = private, 2 = confidential + // log ("10 category = " + event[10]); + // log ("11 participants emails = " + event[11]); + // log ("12 participants states = " + event[12]); + // log ("13 owner = " + event[13]); + // log ("14 iscycle = " + event[14]); + // log ("15 nextalarm = " + event[15]); + // log ("16 recurrenceid = " + event[16]); + // log ("17 isexception = " + event[17]); + // log ("18 editable = " + event[18]); + // log ("19 erasable = " + event[19]); + // log ("20 ownerisorganizer = " + event[20]); + + var eventCell = createElement("div"); + eventCell.cname = event[0]; + eventCell.calendar = event[1]; + var startDate = new Date(event[5]*1000); + if (startDate) { + eventCell.startDate = event[5]; + eventCell.writeAttribute('day', startDate.getDayString()); + eventCell.writeAttribute('hour', event[8]? 'allday' : startDate.getHourString()); + } + // if (event[8] == 1) + // eventCell.addClassName("private"); + // else if (event[8] == 2) + // eventCell.addClassName("confidential"); + if (eventRep.recurrenceTime) + eventCell.recurrenceTime = eventRep.recurrenceTime; + //eventCell.owner = event[12]; + eventCell.isException = event[17]; + eventCell.editable = event[18]; + eventCell.erasable = event[19] || IsSuperUser; + eventCell.ownerIsOrganizer = event[20]; + eventCell.addClassName("event"); + // if (event[14] > 0) + // eventCell.addClassName("alarm"); + + var innerDiv = createElement("div"); + eventCell.appendChild(innerDiv); + innerDiv.addClassName("eventInside"); + innerDiv.addClassName("calendarFolder" + event[1]); + if (eventRep.userState >= 0 && userStates[eventRep.userState]) + innerDiv.addClassName(userStates[eventRep.userState]); + + var gradientDiv = createElement("div"); + innerDiv.appendChild(gradientDiv); + gradientDiv.addClassName("gradient"); + + var gradientImg = createElement("img"); + gradientDiv.appendChild(gradientImg); + gradientImg.src = ResourcesURL + "/event-gradient.png"; + + var textDiv = createElement("div"); + innerDiv.appendChild(textDiv); + textDiv.addClassName("text"); + var iconSpan = createElement("span", null, "icons"); + textDiv.update(eventText.replace(/(\\r)?\\n/g, "
    ")); + textDiv.appendChild(iconSpan); + + // Add alarm and classification icons + if (event[9] == 1) + createElement("img", null, null, {src: ResourcesURL + "/private.png"}, null, iconSpan); + else if (event[9] == 2) + createElement("img", null, null, {src: ResourcesURL + "/confidential.png"}, null, iconSpan); + if (event[15] > 0) + createElement("img", null, null, {src: ResourcesURL + "/alarm.png"}, null, iconSpan); + + if (event[10] != null) { + var category = event[10].decodeEntities(); + var categoryStyle = categoriesStyles.get(category); + if (!categoryStyle) { + categoryStyle = 'category_' + categoriesStyles.keys().length; + categoriesStyles.set([category], categoryStyle); + } + innerDiv.addClassName(categoryStyle); + } + + return eventCell; } function _parseEvent(event) { @@ -289,6 +420,62 @@ function _parseTask(task) { return parsedTask; } +/************************************** Preview Navigation *****************************************/ + +function onCalendarGotoDay(node) { + var day = node.getAttribute("date"); + var needRefresh = (listFilter == 'view_selectedday' && day != currentDay); + + changeDateSelectorDisplay(day); + updateDisplayView({ "day": day }); + refreshEvents(); + + return false; +} + +function changeDateSelectorDisplay(day, keepCurrentDay) { + var url = ApplicationBaseURL + "/dateselector"; + if (day) { + if (day.length < 8) + day += "01"; + url += "?day=" + day; + } + + if (!keepCurrentDay) + currentDay = day; + + var month = day.substr(0, 6); + if (cachedDateSelectors[month]) { + // log ("restoring cached selector for month: " + month); + setDateSelectorContent(cachedDateSelectors[month]); + } + else { + // log ("loading selector for month: " + month); + if (document.dateSelectorAjaxRequest) { + document.dateSelectorAjaxRequest.aborted = true; + document.dateSelectorAjaxRequest.abort(); + } + document.dateSelectorAjaxRequest + = triggerAjaxRequest(url, + dateSelectorCallback, + month); + } +} + +function dateSelectorCallback(http) { + if (http.readyState == 4 + && http.status == 200) { + document.dateSelectorAjaxRequest = null; + var content = http.responseText; + setDateSelectorContent(content); + cachedDateSelectors[http.callbackData] = content; + } + else + log ("dateSelectorCallback Ajax error"); + + return false; +} + /*********************** Input Field, Checkboxes, Radio and listMenu *********************************/ function onInputTitleChange(event){ @@ -306,33 +493,25 @@ function onPrintLayoutListChange() { case "0": // List view window.resizeTo(660,500); ajustWindow(660,500); - $("rightSide").style.width = "390px"; currentView = parentView; break; case "1": // Day view window.resizeTo(660,500); ajustWindow(660,500); - $("rightSide").style.width = "390px"; currentView = "dayview"; break; case "2": // Week view window.resizeTo(1010,500); ajustWindow(1010,500); - $("rightSide").style.width = "740px"; currentView = "weekview"; break; - case "3": // Month view - window.resizeTo(1010,500); - ajustWindow(1010,500); - $("rightSide").style.width = "740px"; - currentView = "monthview"; - break; + //todo : month } - refreshCalendarDisplay(); + refreshContent(); } function onEventsCheck(checkBox) { @@ -364,17 +543,17 @@ function onPrintDateCheck() { function onDisplayTimeFormatCheck(){ var radioTimeFormat = document.getElementsByName("printTimeFormat"); displayTime = (radioTimeFormat[0].checked ? true : false); - refreshCalendarDisplay(); + refreshContent(); } function onPrintCompletedTasksCheck(checkBox) { printCompletedTasks = (checkBox.checked ? 1 : 0); - refreshCalendarTasks(); + refreshTasks(); } function onPrintNoDueDateTasksCheck(checkBox) { printNoDueDateTasks = (checkBox.checked ? 1 : 0); - refreshCalendarTasks(); + refreshTasks(); } /************** Date picker functions *************/ From 78447d81ae1cb0fb0b2c39245754a93805c37faa Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Mon, 28 Apr 2014 13:54:29 -0400 Subject: [PATCH 067/144] Code refactoring and retouch --- UI/Templates/SchedulerUI/UIxCalViewPrint.wox | 12 +++--- UI/WebServerResources/UIxCalViewPrint.css | 40 ++++++++++++++++---- UI/WebServerResources/UIxCalViewPrint.js | 28 +++++++++++++- 3 files changed, 65 insertions(+), 15 deletions(-) diff --git a/UI/Templates/SchedulerUI/UIxCalViewPrint.wox b/UI/Templates/SchedulerUI/UIxCalViewPrint.wox index 67b1629c0..1ca114ade 100644 --- a/UI/Templates/SchedulerUI/UIxCalViewPrint.wox +++ b/UI/Templates/SchedulerUI/UIxCalViewPrint.wox @@ -45,20 +45,20 @@ - + - + - + - + Date: Mon, 28 Apr 2014 15:30:32 -0400 Subject: [PATCH 068/144] fix the comments in the headers --- UI/Scheduler/UIxCalViewPrint.h | 3 +-- UI/Scheduler/UIxCalViewPrint.m | 3 +-- UI/WebServerResources/UIxCalViewPrint.js | 11 +++++------ 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/UI/Scheduler/UIxCalViewPrint.h b/UI/Scheduler/UIxCalViewPrint.h index 7e6ea1ba1..ac3de23a8 100644 --- a/UI/Scheduler/UIxCalViewPrint.h +++ b/UI/Scheduler/UIxCalViewPrint.h @@ -1,8 +1,7 @@ -/* UIxCalView.h - this file is part of SOGo +/* UIxCalViewPrint.h - this file is part of SOGo * * Copyright (C) 2006-2014 Inverse inc. * - * Author: Alexandre Cloutier * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/UI/Scheduler/UIxCalViewPrint.m b/UI/Scheduler/UIxCalViewPrint.m index d719d70bc..0acd3e3f9 100644 --- a/UI/Scheduler/UIxCalViewPrint.m +++ b/UI/Scheduler/UIxCalViewPrint.m @@ -1,8 +1,7 @@ -/* UIxCalView.m - this file is part of SOGo +/* UIxCalViewPrint.m - this file is part of SOGo * * Copyright (C) 2006-2014 Inverse inc. * - * Author: Alexandre Cloutier * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/UI/WebServerResources/UIxCalViewPrint.js b/UI/WebServerResources/UIxCalViewPrint.js index cb7e6f61b..baa45de55 100644 --- a/UI/WebServerResources/UIxCalViewPrint.js +++ b/UI/WebServerResources/UIxCalViewPrint.js @@ -1,17 +1,16 @@ /* -*- Mode: js2-mode; tab-width: 4; c-label-minimum-indentation: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* - Copyright (C) 2005 SKYRIX Software AG - Copyright (C) 2006-2011 Inverse + Copyright (C) 2006-2014 Inverse - This file is part of OpenGroupware.org. + This file is part of SOGo - OGo is free software; you can redistribute it and/or modify it under + SOGo 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 + SOGo 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. @@ -32,7 +31,7 @@ var currentView; var currentDay = window.parentvar("currentDay"); var sd, ed; -/******************************************* Ajust Window position from his size ***********************************************************/ +/******************************************* Ajust Window position from its size ***********************************************************/ function ajustWindow(width, height) { var left = (screen.width/2)-(width/2); From e43b704858484f03c4b82d7db6e1253e944d1bae Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Mon, 28 Apr 2014 15:32:47 -0400 Subject: [PATCH 069/144] Update UIxCalViewPrint.js --- UI/WebServerResources/UIxCalViewPrint.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UI/WebServerResources/UIxCalViewPrint.js b/UI/WebServerResources/UIxCalViewPrint.js index baa45de55..1f5605e3d 100644 --- a/UI/WebServerResources/UIxCalViewPrint.js +++ b/UI/WebServerResources/UIxCalViewPrint.js @@ -16,7 +16,7 @@ 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 + License along with SOGo; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ From fa5cf55367c8bdb83355625c7d579c3e846704bd Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Mon, 28 Apr 2014 15:42:17 -0400 Subject: [PATCH 070/144] Update GNUmakefile --- UI/Scheduler/GNUmakefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UI/Scheduler/GNUmakefile b/UI/Scheduler/GNUmakefile index 4f6db932c..9f96857a6 100644 --- a/UI/Scheduler/GNUmakefile +++ b/UI/Scheduler/GNUmakefile @@ -23,7 +23,7 @@ SchedulerUI_OBJC_FILES = \ UIxCalFolderActions.m \ \ UIxCalView.m \ - UIxCalViewPrint.m \ + UIxCalViewPrint.m \ UIxCalDayView.m \ UIxCalMulticolumnDayView.m \ UIxCalWeekView.m \ From 8c563c2922a1f6acc996c4260ba0509282c50a20 Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Tue, 29 Apr 2014 14:25:53 -0400 Subject: [PATCH 071/144] Fix possible exception when retrieving reminder Fixes #2744 --- UI/Scheduler/UIxComponentEditor.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UI/Scheduler/UIxComponentEditor.m b/UI/Scheduler/UIxComponentEditor.m index 86bd0cb0b..ce56a9644 100644 --- a/UI/Scheduler/UIxComponentEditor.m +++ b/UI/Scheduler/UIxComponentEditor.m @@ -1162,7 +1162,7 @@ iRANGE(2); if ([[self clientObject] isNew]) { NSString *value; - int index; + NSUInteger index; value = [userDefaults calendarDefaultReminder]; index = [reminderValues indexOfObject: value]; From da8febf138c20632285219cd615f153a33d7cb9e Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Tue, 29 Apr 2014 15:42:50 -0400 Subject: [PATCH 072/144] Printing display appear on one page only, fix issues with browsers --- UI/Templates/SchedulerUI/UIxCalViewPrint.wox | 2 +- UI/WebServerResources/UIxCalViewPrint.css | 428 ++++++++++++++++++- 2 files changed, 417 insertions(+), 13 deletions(-) diff --git a/UI/Templates/SchedulerUI/UIxCalViewPrint.wox b/UI/Templates/SchedulerUI/UIxCalViewPrint.wox index 1ca114ade..298076100 100644 --- a/UI/Templates/SchedulerUI/UIxCalViewPrint.wox +++ b/UI/Templates/SchedulerUI/UIxCalViewPrint.wox @@ -42,7 +42,7 @@ - +
    "; @@ -510,19 +495,16 @@ function onPrintLayoutListChange() { switch(selectedLayout) { case "0": // List view window.resizeTo(660,500); - ajustWindow(660,500); currentView = parentView; break; case "1": // Day view window.resizeTo(1010,500); - ajustWindow(1010,500); currentView = "dayview"; break; case "2": // Week view window.resizeTo(1010,500); - ajustWindow(1010,500); currentView = "weekview"; break; @@ -550,19 +532,13 @@ function onTasksCheck(checkBox) { document.getElementById("rightFrameTasks").style.display = 'none'; } -function onPrintDateCheck() { +/*function onPrintDateCheck() { var dateRange = document.getElementsByName("dateRange"); var customDate = document.getElementById("customDate"); for (var i = 0; i < dateRange.length; i++) if (dateRange[i].children[1].children[0].disabled == customDate.checked) dateRange[i].children[1].children[0].disabled = !customDate.checked; -} - -function onDisplayTimeFormatCheck(){ - var radioTimeFormat = document.getElementsByName("printTimeFormat"); - displayTime = (radioTimeFormat[0].checked ? true : false); - refreshContent(); -} +}*/ function onPrintCompletedTasksCheck(checkBox) { printCompletedTasks = (checkBox.checked ? 1 : 0); @@ -574,7 +550,7 @@ function onPrintNoDueDateTasksCheck(checkBox) { refreshTasks(); } -/************** Date picker functions *************/ +/************** Date picker functions ************* this.initTimeWidgets = function (widgets) { this.timeWidgets = widgets; @@ -583,13 +559,13 @@ this.initTimeWidgets = function (widgets) { //jQuery(widgets['start']['date']).change(onAdjustTime); - /*jQuery(widgets['startingDate']['date']).closest('.date').datepicker({autoclose: true, + jQuery(widgets['startingDate']['date']).closest('.date').datepicker({autoclose: true, weekStart: 0, endDate: lastDay, startDate: firstDay, setStartDate: lastDay, startView: 2, - position: "below-shifted-left"});*/ + position: "below-shifted-left"}); } this.onAdjustTime = function(event) { @@ -597,9 +573,9 @@ this.onAdjustTime = function(event) { } this.onAdjustDueTime = function(event) { - /*var dateDelta = (window.getStartDate().valueOf() - window.getShadowStartDate().valueOf()); + var dateDelta = (window.getStartDate().valueOf() - window.getShadowStartDate().valueOf()); var newDueDate = new Date(window.getDueDate().valueOf() + dateDelta); - window.setDueDate(newDueDate);*/ + window.setDueDate(newDueDate); window.timeWidgets['start']['date'].updateShadowValue(); } @@ -621,14 +597,14 @@ function onPrintClick(event) { function init() { initializePrintSettings(); - initializeWhatToPrint(); + //initializeWhatToPrint(); //initializeOptions(); $("cancelButton").observe("click", onPrintCancelClick); $("printButton").observe("click", onPrintClick); - // TODO : Selected and custom date must be implemented and finished. + /* TODO : Selected and custom date must be implemented and finished. document.getElementById("eventsTasks").disabled=true; - document.getElementById("customDate").disabled=true; + document.getElementById("customDate").disabled=true;*/ onPrintLayoutListChange(); } @@ -638,13 +614,13 @@ function initializePrintSettings() { $("printLayoutList").observe("change", onPrintLayoutListChange); } -function initializeWhatToPrint() { +/*function initializeWhatToPrint() { var widgets = {'start': {'date': $("startingDate")}, 'end': {'date': $("endingDate")}}; initTimeWidgets(widgets); onPrintDateCheck(); -} +}*/ /*function initializeOptions() { }*/ From 1f5a2a4c6221e0d06444eeed624a59373b627dba Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Fri, 9 May 2014 15:40:57 -0400 Subject: [PATCH 080/144] Fixed IMAP copy/move op between subfolder in different accounts --- NEWS | 1 + SoObjects/Mailer/SOGoMailFolder.m | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 2d1eda8aa..4d2454dcc 100644 --- a/NEWS +++ b/NEWS @@ -24,6 +24,7 @@ Bug fixes - fixed display of images in CSS background (#2437) - fixed limitation of Sieve script size (#2745) - fixed sync-token generation when no change was returned (#2492) + - fixed the IMAP copy/move operation between subfolders in different accounts 2.2.3 (2014-04-03) ------------------ diff --git a/SoObjects/Mailer/SOGoMailFolder.m b/SoObjects/Mailer/SOGoMailFolder.m index 64088280c..4281d56f5 100644 --- a/SoObjects/Mailer/SOGoMailFolder.m +++ b/SoObjects/Mailer/SOGoMailFolder.m @@ -660,8 +660,12 @@ static NSString *defaultUserID = @"anyone"; // Destination folder is in a different account SOGoMailAccounts *accounts; SOGoMailAccount *account; - accounts = [[self container] container]; + SOGoUserFolder *userFolder; + + userFolder = [[context activeUser] homeFolderInContext: context]; + accounts = [userFolder lookupName: @"Mail" inContext: context acquire: NO]; account = [accounts lookupName: [folders objectAtIndex: 1] inContext: localContext acquire: NO]; + if ([account isKindOfClass: [NSException class]]) { result = [NSException exceptionWithHTTPStatus: 500 From 698524b39f7893d4ac40af42a699cbfd885439c5 Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Fri, 9 May 2014 17:28:02 -0400 Subject: [PATCH 081/144] Fix synchronization of seen/unseen status of msgs Fixes #2715 --- UI/WebServerResources/MailerUI.js | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/UI/WebServerResources/MailerUI.js b/UI/WebServerResources/MailerUI.js index a8519a1f5..e2c1fe58a 100644 --- a/UI/WebServerResources/MailerUI.js +++ b/UI/WebServerResources/MailerUI.js @@ -276,11 +276,9 @@ function mailListToggleMessagesRead(row, force_mark_as_read) { for (var i = 0; i < selectedRowsId.length; i++) { var msguid = selectedRowsId[i].split('_')[1]; + // Assume ajax request will succeed and change message flag in table markMailInWindow(window, msguid, markread); - // Assume ajax request will succeed and invalidate data cache now. - Mailer.dataTable.invalidate(msguid, true); - var url = ApplicationBaseURL + encodeURI(Mailer.currentMailbox) + "/" + msguid + "/" + action; @@ -302,7 +300,10 @@ function mailListMarkMessage(event) { function mailListMarkMessageCallback(http) { var data = http.callbackData; - if (!isHttpStatus204(http.status)) { + if (isHttpStatus204(http.status)) { + Mailer.dataTable.invalidate(data["msguid"], true); + } + else { log("Message Mark Failed (" + http.status + "): " + http.statusText); Mailer.dataTable.invalidate(data["msguid"], false); } @@ -1634,10 +1635,6 @@ function loadMessageCallback(http) { loadRemoteImages(); configureSignatureFlagImage(); handleReturnReceipt(); - // Warning: If the user can't set the read/unread flag, it won't - // be reflected in the view unless we force the refresh. - if (http.callbackData.seenStateHasChanged) - Mailer.dataTable.dataSource.invalidate(msguid); } var cachedMessage = new Array(); cachedMessage['idx'] = Mailer.currentMailbox + '/' + msguid; @@ -1645,8 +1642,7 @@ function loadMessageCallback(http) { cachedMessage['text'] = http.responseText; if (cachedMessage['text'].length < 30000) storeCachedMessage(cachedMessage); - - // We mark the mail as read + // Mark the mail as read mailListToggleMessagesRead($("row_" + msguid), true); } } From 5c41915080eadc24ac524454b56480febcd5a907 Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Mon, 12 May 2014 15:25:50 -0400 Subject: [PATCH 082/144] Fix focus of popup windows with FF on Windows --- UI/WebServerResources/ContactsUI.js | 6 ++- UI/WebServerResources/MailerUI.js | 6 +-- UI/WebServerResources/SchedulerUI.js | 56 ++++++++++++++++++---------- UI/WebServerResources/generic.js | 48 ++++++++++++------------ 4 files changed, 68 insertions(+), 48 deletions(-) diff --git a/UI/WebServerResources/ContactsUI.js b/UI/WebServerResources/ContactsUI.js index c30be6661..ca699b44f 100644 --- a/UI/WebServerResources/ContactsUI.js +++ b/UI/WebServerResources/ContactsUI.js @@ -323,8 +323,10 @@ function onMenuRawContact (event) { return row.readAttribute("id"); }); - openGenericWindow(URLForFolderID(Contact.currentAddressBook) - + "/" + cname + "/raw"); + $(function() { + openGenericWindow(URLForFolderID(Contact.currentAddressBook) + + "/" + cname + "/raw"); + }).delay(0.1); } function actionContactCallback(http) { diff --git a/UI/WebServerResources/MailerUI.js b/UI/WebServerResources/MailerUI.js index e2c1fe58a..bfd84e673 100644 --- a/UI/WebServerResources/MailerUI.js +++ b/UI/WebServerResources/MailerUI.js @@ -1045,8 +1045,6 @@ function onMessageContextMenu(event) { popupMenu(event, "messagesListMenu", selectedNodes); else if (selectedNodes.length == 1) popupMenu(event, "messageListMenu", row); - - return false; } function onFolderMenuClick(event) { @@ -1726,7 +1724,9 @@ function onMenuViewMessageSource(event) { if (rows.length > 0) { var url = (ApplicationBaseURL + encodeURI(Mailer.currentMailbox) + "/" + rows[0].substr(4) + "/viewsource"); - openMailComposeWindow(url); + $(function() { + openMailComposeWindow(url); + }).delay(0.1); } preventDefault(event); diff --git a/UI/WebServerResources/SchedulerUI.js b/UI/WebServerResources/SchedulerUI.js index 897d21a06..b2e48f25c 100644 --- a/UI/WebServerResources/SchedulerUI.js +++ b/UI/WebServerResources/SchedulerUI.js @@ -74,7 +74,7 @@ function newEventFromWidget(sender, type) { var day = $(sender).readAttribute("day"); var hour = sender.readAttribute("hour"); - return newEvent(type, day, hour); + newEvent.delay(0.1, type, day, hour); } function minutesToHM(minutes) { @@ -156,16 +156,26 @@ function getSelectedFolder() { function onMenuNewEventClick(event) { var target = document.menuTarget; - if (/(minutes\d{2}|dayHeader)/.test(target.className)) - target = target.parentNode; - newEventFromWidget(target, "event"); + if (target) { + if (/(minutes\d{2}|dayHeader)/.test(target.className)) + target = target.parentNode; + newEventFromWidget(target, "event"); + } + else { + newEvent('event'); + } } function onMenuNewTaskClick(event) { var target = document.menuTarget; - if (/(minutes\d{2}|dayHeader)/.test(target.className)) - target = target.parentNode; - newEventFromWidget(target, "task"); + if (target) { + if (/(minutes\d{2}|dayHeader)/.test(target.className)) + target = target.parentNode; + newEventFromWidget(target, "task"); + } + else { + newEvent('task'); + } } function _editEventId(id, calendar, recurrence) { @@ -192,14 +202,18 @@ function editEvent() { } for (var i = 0; i < nodes.length; i++) - _editEventId(nodes[i].cname, - nodes[i].calendar); + _editEventId.delay(0.1, + nodes[i].cname, + nodes[i].calendar); } else if (selectedCalendarCell) { if (selectedCalendarCell[0].recurrenceTime && !selectedCalendarCell[0].isException) - _editRecurrenceDialog(selectedCalendarCell[0], "confirmEditing"); + _editRecurrenceDialog.delay(0.1, + selectedCalendarCell[0], + "confirmEditing"); else - _editEventId(selectedCalendarCell[0].cname, - selectedCalendarCell[0].calendar); + _editEventId.delay(0.1, + selectedCalendarCell[0].cname, + selectedCalendarCell[0].calendar); } else { showAlertDialog(_("Please select an event or a task.")); } @@ -470,7 +484,7 @@ function onMenuRawEvent(event) { var cname = selectedCalendarCell[0].cname; var url = ApplicationBaseURL + "/" + calendar + "/" + cname + "/raw"; - openGenericWindow(url); + openGenericWindow.delay(0.1, url); } function modifyEvent(sender, modification, parameters) { @@ -2747,8 +2761,8 @@ function getMenus() { dateMenu.push(onYearMenuItemClick); menus["yearListMenu"] = dateMenu; - menus["eventsListMenu"] = new Array(onMenuNewEventClick, "-", - onMenuNewTaskClick, + menus["eventsListMenu"] = new Array(onMenuNewEventClick, + onMenuNewTaskClick, "-", editEvent, deleteEvent, "-", onSelectAll, "-", null, null); @@ -2776,7 +2790,7 @@ function getMenus() { } function newTask () { - return newEventFromWidget(this, 'task'); + newEventFromWidget.delay(0.1, this, 'task'); } function marksTasksAsCompleted () { @@ -2804,7 +2818,7 @@ function onMenuRawTask(event) { } var url = ApplicationBaseURL + "/" + selectedTasks[0].calendar + "/" + selectedTasks[0].cname + "/raw" - openGenericWindow(url); + openGenericWindow.delay(0.1, url); } @@ -2920,9 +2934,11 @@ function onCalendarModify(event) { height -= 26; } - var properties = window.open(url, windowID, - "width="+width+",height="+height+",resizable=0"); - properties.focus(); + $(function() { + var properties = window.open(url, windowID, + "width="+width+",height="+height+",resizable=0"); + properties.focus(); + }).delay(0.1); } function updateCalendarProperties(calendarID, calendarName, calendarColor) { diff --git a/UI/WebServerResources/generic.js b/UI/WebServerResources/generic.js index a3138c936..d4fcc8fe2 100644 --- a/UI/WebServerResources/generic.js +++ b/UI/WebServerResources/generic.js @@ -264,11 +264,11 @@ function openContactWindow(url, wId) { else wId = sanitizeWindowName(wId); - var w = window.open(url, wId, - "width=460,height=560,resizable=0,location=0"); - w.focus(); - - return w; + $(function() { + var w = window.open(url, wId, + "width=460,height=560,resizable=0,location=0"); + w.focus(); + }).delay(0.1); } } @@ -325,9 +325,11 @@ function openMailTo(senderMailTo) { } if (sanitizedAddresses.length > 0) - openMailComposeWindow(ApplicationBaseURL - + "/../Mail/compose?mailto=" + encodeURIComponent(Object.toJSON(sanitizedAddresses)) - + ((subject.length > 0)?"?subject=" + encodeURIComponent(subject):"")); + $(function() { + openMailComposeWindow(ApplicationBaseURL + + "/../Mail/compose?mailto=" + encodeURIComponent(Object.toJSON(sanitizedAddresses)) + + ((subject.length > 0)?"?subject=" + encodeURIComponent(subject):"")); + }).delay(0.1); return false; /* stop following the link */ } @@ -848,13 +850,13 @@ function hideMenu(menuNode) { Event.fire(menuNode, "contextmenu:hide"); } -function onMenuEntryClick(event) { - var node = event.target; - - id = getParentMenu(node).menuTarget; - - return false; -} +//function onMenuEntryClick(event) { +// var node = event.target; +// +// id = getParentMenu(node).menuTarget; +// +// return false; +//} /* query string */ @@ -1543,14 +1545,14 @@ function openExternalLink(anchor) { } function openAclWindow(url) { - var w = window.open(url, "aclWindow", - "width=420,height=300,resizable=1,scrollbars=1,toolbar=0," - + "location=0,directories=0,status=0,menubar=0" - + ",copyhistory=0"); - w.opener = window; - w.focus(); - - return w; + $(function () { + var w = window.open(url, "aclWindow", + "width=420,height=300,resizable=1,scrollbars=1,toolbar=0," + + "location=0,directories=0,status=0,menubar=0" + + ",copyhistory=0"); + w.opener = window; + w.focus(); + }).delay(0.1); } function getUsersRightsWindowHeight() { From fbc6856fd57dca21f7dcdc748b452352875e064e Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Mon, 12 May 2014 16:06:49 -0400 Subject: [PATCH 083/144] Improve contextual menu in events list --- UI/Templates/SchedulerUI/UIxCalMainView.wox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UI/Templates/SchedulerUI/UIxCalMainView.wox b/UI/Templates/SchedulerUI/UIxCalMainView.wox index f59426452..bf4d22989 100644 --- a/UI/Templates/SchedulerUI/UIxCalMainView.wox +++ b/UI/Templates/SchedulerUI/UIxCalMainView.wox @@ -54,8 +54,8 @@

    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