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;