diff --git a/NEWS b/NEWS index 4b233c364..a4309710d 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,12 @@ +2.x.y (YYYY-MM-DD) +------------------ + +Enhancements + - improved badges of active tasks count + +Bug fixes + - fixed rename of calendars + 2.2.6 (2014-07-02) ------------------ @@ -9,7 +18,7 @@ Enhancements - implemented the GetAttachment ActiveSync command (#2808) - implemented the Ping ActiveSync command - added "soft deletes" support for ActiveSync (#2734) - - now display the active tasks next to calendar names (#2760) + - now display the active tasks count next to calendar names (#2760) Bug fixes - better handling of empty "Flag" messages over ActiveSync (#2806) diff --git a/UI/Scheduler/UIxCalendarSelector.m b/UI/Scheduler/UIxCalendarSelector.m index 2c8a6910d..c81587116 100644 --- a/UI/Scheduler/UIxCalendarSelector.m +++ b/UI/Scheduler/UIxCalendarSelector.m @@ -121,7 +121,8 @@ _intValueFromHex (NSString *hexString) [calendar setObject: [folder ownerInContext: context] forKey: @"owner"]; fActiveTasks = [folder activeTasks]; - [calendar setObject:fActiveTasks forKey:@"activeTasks" ]; + if (fActiveTasks > 0) + [calendar setObject: fActiveTasks forKey:@"activeTasks" ]; [calendars addObject: calendar]; } } diff --git a/UI/Templates/ContactsUI/UIxContactFoldersView.wox b/UI/Templates/ContactsUI/UIxContactFoldersView.wox index 9ee97a9ee..2f8a4c415 100644 --- a/UI/Templates/ContactsUI/UIxContactFoldersView.wox +++ b/UI/Templates/ContactsUI/UIxContactFoldersView.wox @@ -110,7 +110,7 @@ var:class="currentContactFolderClass" var:acl-editing="currentContactFolderAclEditing" var:list-editing="currentContactFolderListEditing" - > diff --git a/UI/Templates/SchedulerUI/UIxCalendarSelector.wox b/UI/Templates/SchedulerUI/UIxCalendarSelector.wox index 5b3bd488e..cc4359127 100644 --- a/UI/Templates/SchedulerUI/UIxCalendarSelector.wox +++ b/UI/Templates/SchedulerUI/UIxCalendarSelector.wox @@ -39,8 +39,9 @@ div.colorBox.calendarFolder >
  • - - +
  • diff --git a/UI/WebServerResources/ContactsUI.js b/UI/WebServerResources/ContactsUI.js index 02fa1ece7..061090ba6 100644 --- a/UI/WebServerResources/ContactsUI.js +++ b/UI/WebServerResources/ContactsUI.js @@ -630,6 +630,9 @@ function onFolderSelectionChange(event) { var node = getTarget(event); if (node.tagName == 'UL') return; + if (node.tagName == "SPAN") + node = node.parentNode; + // Update rows selection onRowClick(event, node); } @@ -754,9 +757,13 @@ function appendAddressBook(name, folder) { li.setAttribute("list-editing", "available"); li.setAttribute("acl-editing", "available"); li.addClassName("local"); - li.appendChild(document.createTextNode(name - .replace("<", "<", "g") - .replace(">", ">", "g"))); + + var displayName = document.createElement("span"); + displayName.appendChild(document.createTextNode(name + .replace("<", "<", "g") + .replace(">", ">", "g"))); + li.appendChild(displayName); + updateAddressBooksMenus(); configureDroppables(); } diff --git a/UI/WebServerResources/SchedulerUI.css b/UI/WebServerResources/SchedulerUI.css index 5079bd7ad..57d9bf9f5 100644 --- a/UI/WebServerResources/SchedulerUI.css +++ b/UI/WebServerResources/SchedulerUI.css @@ -48,6 +48,9 @@ UL#calendarList LI line-height: 2em; padding-left: 10px; } +#calendarList .badge +{ margin-left: 4px; } + #tasksList .duelater, #tasksList .duetoday, #tasksList .overdue diff --git a/UI/WebServerResources/SchedulerUI.js b/UI/WebServerResources/SchedulerUI.js index b124cb982..df9c19c4e 100644 --- a/UI/WebServerResources/SchedulerUI.js +++ b/UI/WebServerResources/SchedulerUI.js @@ -1104,27 +1104,33 @@ function eventsListCallback(http) { } function activeTasksCallback(http) { - if (http.readyState == 4 && http.status == 200) { - if (http.responseText.length > 0) { - document.activeTasksAjaxRequest = null; - var data = http.responseText.evalJSON(true); - var list = $("calendarList"); - - var items = list.childNodesWithTag("li"); - for (var i = 0; i < items.length; i++) { - var id = items[i].getAttribute("id").substr(1); - var number = data[id]; - var input = items[i].childNodesWithTag("input")[0]; - var activeTasks = items[i].childNodesWithTag("span")[0]; - if (number == "0") { - activeTasks.innerHTML = ""; + if (http.readyState == 4 && http.status == 200) { + if (http.responseText.length > 0) { + document.activeTasksAjaxRequest = null; + var data = http.responseText.evalJSON(true); + var list = $("calendarList"); + + var items = list.childNodesWithTag("li"); + for (var i = 0; i < items.length; i++) { + var id = items[i].getAttribute("id").substr(1); + var number = parseInt(data[id]); + var input = items[i].childNodesWithTag("input")[0]; + var activeTasks = items[i].childNodesWithTag("span")[1]; + if (typeof activeTasks == "undefined") { + if (number > 0) { + activeTasks = createElement("span", null, "badge"); + items[i].appendChild(activeTasks); + } + } + else if (number == 0) { + items[i].removeChild(activeTasks); + } + if (number > 0) { + activeTasks.innerHTML = number; + } + } } - else { - activeTasks.innerHTML = "(" + number + ")"; - } - } } - } } function tasksListCallback(http) { @@ -3088,15 +3094,8 @@ function initCalendarSelector() { var items = list.childNodesWithTag("li"); for (var i = 0; i < items.length; i++) { var input = items[i].childNodesWithTag("input")[0]; - var activeTasks = items[i].childNodesWithTag("span")[0]; + var activeTasks = items[i].childNodesWithTag("span")[1]; $(input).observe("click", clickEventWrapper(updateCalendarStatus)); - if (activeTasks.textContent == "0") { - activeTasks.innerHTML = ""; - } - else { - activeTasks.innerHTML = "(" + activeTasks.innerText + ")"; - } - } var links = $("calendarSelectorButtons").childNodesWithTag("a"); @@ -3108,7 +3107,7 @@ function initCalendarSelector() { function onCalendarSelectionChange(event) { var target = Event.element(event); - if (target.tagName == 'DIV') { + if (target.tagName == 'DIV' || target.tagName == 'SPAN') { target = target.parentNode; } @@ -3163,12 +3162,8 @@ function updateCalendarProperties(calendarID, calendarName, calendarColor) { nodeID = "/" + folderName; // log("nodeID: " + nodeID); var calendarNode = $(nodeID); - var childNodes = calendarNode.childNodes; - var textNode = childNodes[childNodes.length-1]; - if (textNode.tagName == 'DIV') - calendarNode.appendChild(document.createTextNode(calendarName)); - else - childNodes[childNodes.length-1].nodeValue = calendarName; + var displayNameNode = calendarNode.childNodesWithTag("span")[0]; + displayNameNode.innerHTML = calendarName; appendStyleElement(nodeID, calendarColor); } @@ -3348,9 +3343,12 @@ function appendCalendar(folderName, folderPath) { li.appendChild(document.createTextNode(" ")); var colorBox = document.createElement("div"); - li.appendChild(colorBox); - li.appendChild(document.createTextNode(folderName)); colorBox.appendChild(document.createTextNode("\u00a0")); + li.appendChild(colorBox); + + var displayName = document.createElement("span"); + displayName.appendChild(document.createTextNode(folderName)); + li.appendChild(displayName); $(colorBox).addClassName("colorBox"); $(colorBox).addClassName('calendarFolder' + folderPath.substr(1)); @@ -3439,8 +3437,9 @@ function onCalendarRemove(event) { } function deletePersonalCalendar(folderElement) { + var displayName = folderElement.childNodesWithTag("span")[0].innerHTML.strip(); showConfirmDialog(_("Confirmation"), - _("Are you sure you want to delete the calendar \"%{0}\"?").formatted(folderElement.lastChild.nodeValue.strip()), + _("Are you sure you want to delete the calendar \"%{0}\"?").formatted(displayName), deletePersonalCalendarConfirm.bind(folderElement)); } diff --git a/UI/WebServerResources/UIxContactFolderProperties.js b/UI/WebServerResources/UIxContactFolderProperties.js index 7d998a186..b8c364366 100644 --- a/UI/WebServerResources/UIxContactFolderProperties.js +++ b/UI/WebServerResources/UIxContactFolderProperties.js @@ -44,7 +44,7 @@ function folderRenameCallback(http) { if (http.readyState == 4) { if (isHttpStatus204(http.status)) { var dict = http.callbackData; - dict["node"].innerHTML = dict["name"]; + dict["node"].childNodesWithTag("span")[0].innerHTML = dict["name"]; window.close(); } } diff --git a/UI/WebServerResources/generic.css b/UI/WebServerResources/generic.css index bd2e7b43a..b5f26ab6b 100644 --- a/UI/WebServerResources/generic.css +++ b/UI/WebServerResources/generic.css @@ -29,7 +29,7 @@ TABLE, DIV, IMG border: 0px; margin: 0px; padding: 0px; - word-break:break-all; } + word-break: break-all; } FIELDSET { border: 1px solid #aaa; @@ -686,7 +686,8 @@ DIV.dialog H3 DIV.dialog.none P { margin: 0px; - padding: 5px 0px; } + padding: 5px 0px; + word-break: normal; } DIV.dialog P.prompt { text-align: right; } @@ -849,6 +850,23 @@ INPUT[name="search"] { background-position: top left; padding: 5px 2px 5px 5px; } +.badge +{ display: inline-block; + min-width: 10px; + padding: 2px 3px; + font-size: 9px; + font-weight: 700; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + background-color: #777; + border-radius: 10px; } + +.badge:empty +{ display: none; } + dt, dd { line-height: 20px; } diff --git a/UI/WebServerResources/generic.js b/UI/WebServerResources/generic.js index d4fcc8fe2..1c45ddd15 100644 --- a/UI/WebServerResources/generic.js +++ b/UI/WebServerResources/generic.js @@ -1356,7 +1356,7 @@ function getListIndexForFolder(items, owner, folderName) { for (i = 0; i < items.length; i++) { if (items[i].id == '/personal') continue; - var currentFolderName = items[i].lastChild.nodeValue.strip(); + var currentFolderName = items[i].childNodesWithTag("span")[0].innerHTML.strip(); var currentOwner = items[i].readAttribute('owner'); if (currentOwner == owner) { previousOwner = currentOwner;