Fix rename of calendars, improve tasks count badge
parent
1cf4841477
commit
45553be122
11
NEWS
11
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)
|
||||
|
|
|
@ -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];
|
||||
}
|
||||
}
|
||||
|
|
|
@ -110,7 +110,7 @@
|
|||
var:class="currentContactFolderClass"
|
||||
var:acl-editing="currentContactFolderAclEditing"
|
||||
var:list-editing="currentContactFolderListEditing"
|
||||
><var:string value="currentContactFolderName"/></li
|
||||
><span><var:string value="currentContactFolderName"/></span></li
|
||||
></var:foreach
|
||||
>
|
||||
</ul>
|
||||
|
|
|
@ -39,8 +39,9 @@ div.colorBox.calendarFolder<var:string value="currentCalendar.folder" />
|
|||
><li class="denied" var:id="currentCalendar.id" var:owner="currentCalendar.owner" >
|
||||
<input type="checkbox" class="checkBox" const:disabled="disabled" var:checked="currentCalendar.active" />
|
||||
<div var:class="currentCalendarClass"><entity name="nbsp"/></div>
|
||||
<var:string value="currentCalendar.displayName" />
|
||||
<span id="activeTasks"><var:string value="currentCalendar.activeTasks"/></span>
|
||||
<span><var:string value="currentCalendar.displayName"/></span><var:if
|
||||
condition="currentCalendar.activeTasks"><span class="badge"><var:string value="currentCalendar.activeTasks"/></span
|
||||
></var:if>
|
||||
</li>
|
||||
</var:foreach>
|
||||
</ul>
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -48,6 +48,9 @@ UL#calendarList LI
|
|||
line-height: 2em;
|
||||
padding-left: 10px; }
|
||||
|
||||
#calendarList .badge
|
||||
{ margin-left: 4px; }
|
||||
|
||||
#tasksList .duelater,
|
||||
#tasksList .duetoday,
|
||||
#tasksList .overdue
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue