Monotone-Parent: 3d8ebb80a2f9e64a537f7a46aaadd8fcc1d801e8

Monotone-Revision: 4bc7d1bcd8cf57366a454fb7814accb19d6121c8

Monotone-Author: wsourdeau@inverse.ca
Monotone-Date: 2007-06-28T20:37:27
Monotone-Branch: ca.inverse.sogo
This commit is contained in:
Wolfgang Sourdeau 2007-06-28 20:37:27 +00:00
parent d083b67952
commit f1fdc98f0a
5 changed files with 149 additions and 133 deletions

View file

@ -31,7 +31,6 @@
@interface UIxContactsListView : UIxComponent @interface UIxContactsListView : UIxComponent
{ {
NSString *searchText;
NSDictionary *currentContact; NSDictionary *currentContact;
NSString *selectorComponentClass; NSString *selectorComponentClass;
} }

View file

@ -42,13 +42,6 @@
return self; return self;
} }
- (void) dealloc
{
if (searchText)
[searchText release];
[super dealloc];
}
/* accessors */ /* accessors */
- (void) setCurrentContact: (NSDictionary *) _contact - (void) setCurrentContact: (NSDictionary *) _contact
@ -61,19 +54,6 @@
return currentContact; return currentContact;
} }
- (void) setSearchText: (NSString *) _txt
{
ASSIGNCOPY (searchText, _txt);
}
- (id) searchText
{
if (!searchText)
[self setSearchText: [self queryParameterForKey:@"search"]];
return searchText;
}
- (id <WOActionResults>) mailerContactsAction - (id <WOActionResults>) mailerContactsAction
{ {
selectorComponentClass = @"UIxContactsMailerSelection"; selectorComponentClass = @"UIxContactsMailerSelection";
@ -126,45 +106,33 @@
NSString *s; NSString *s;
s = [self queryParameterForKey: @"sort"]; s = [self queryParameterForKey: @"sort"];
if ([s length] == 0) if (![s length])
s = [self defaultSortKey]; s = [self defaultSortKey];
return s; return s;
} }
- (NSComparisonResult) sortOrdering
{
return ([[self queryParameterForKey:@"desc"] boolValue]
? NSOrderedDescending
: NSOrderedAscending);
}
- (NSArray *) contactInfos - (NSArray *) contactInfos
{ {
id <SOGoContactFolder> folder; id <SOGoContactFolder> folder;
NSString *ascending, *searchText, *valueText;
NSComparisonResult ordering;
folder = [self clientObject]; folder = [self clientObject];
return [folder lookupContactsWithFilter: [self searchText] ascending = [self queryParameterForKey: @"asc"];
ordering = ((![ascending length] || [ascending boolValue])
? NSOrderedAscending : NSOrderedDescending);
searchText = [self queryParameterForKey: @"search"];
if ([searchText length] > 0)
valueText = [self queryParameterForKey: @"value"];
else
valueText = nil;
return [folder lookupContactsWithFilter: valueText
sortBy: [self sortKey] sortBy: [self sortKey]
ordering: [self sortOrdering]]; ordering: ordering];
}
/* notifications */
- (void) sleep
{
if (searchText)
{
[searchText release];
searchText = nil;
}
currentContact = nil;
// [allRecords release];
// allRecords = nil;
// [filteredRecords release];
// filteredRecords = nil;
[super sleep];
} }
/* actions */ /* actions */

View file

@ -13,32 +13,18 @@
<tbody> <tbody>
<tr class="tableview"> <tr class="tableview">
<!-- localize --> <!-- localize -->
<td class="tbtv_headercell headerName"> <td class="tbtv_headercell" id="nameHeader"
<var:component className="UIxSortableTableHeader" ><var:string label:value="Name"
label:label="Name" /></td
const:sortKey="cn" ><td class="tbtv_headercell" id="mailHeader"
const:href="view" ><var:string label:value="Email"/></td
var:queryDictionary="context.request.formValues" ><td class="tbtv_headercell" id="screenNameHeader"
/> ><var:string label:value="Screen Name" /></td
</td> ><td class="tbtv_headercell" id="orgHeader"
<td class="tbtv_headercell headerEmail"> ><var:string label:value="Organization" /></td
<var:component className="UIxSortableTableHeader" ><td class="tbtv_headercell" id="phoneHeader"
label:label="Email" ><var:string label:value="Work Phone" /></td
const:sortKey="mail" ></tr>
const:href="view"
var:queryDictionary="context.request.formValues"
/>
</td>
<td class="tbtv_headercell">
<var:string label:value="Screen Name" />
</td>
<td class="tbtv_headercell">
<var:string label:value="Organization" />
</td>
<td class="tbtv_headercell">
<var:string label:value="Work Phone" />
</td>
</tr>
<var:foreach list="contactInfos" item="currentContact"> <var:foreach list="contactInfos" item="currentContact">
<tr class="tableview" <tr class="tableview"
@ -48,12 +34,12 @@
onclick="return onContactRowClick(event, this);" onclick="return onContactRowClick(event, this);"
ondblclick="return onContactRowDblClick(event, this);" ondblclick="return onContactRowDblClick(event, this);"
oncontextmenu="return onContactContextMenu(event, this);"> oncontextmenu="return onContactContextMenu(event, this);">
<td onmousedown="return false;"><img rsrc:src="abcard.gif" <td><img rsrc:src="abcard.gif"
/><var:string value="displayName" const:escapeHTML="YES" /></td> /><var:string value="displayName" const:escapeHTML="YES" /></td>
<td onmousedown="return false;"><var:string value="currentContact.mail"/></td> <td><var:string value="currentContact.mail"/></td>
<td onmousedown="return false;"><var:string value="currentContact.screenname"/></td> <td><var:string value="currentContact.screenname"/></td>
<td onmousedown="return false;"><var:string value="currentContact.o"/></td> <td><var:string value="currentContact.o"/></td>
<td onmousedown="return false;"><var:string value="currentContact.telephonenumber"/></td> <td><var:string value="currentContact.telephonenumber"/></td>
</tr> </tr>
</var:foreach> </var:foreach>
</tbody> </tbody>

View file

@ -179,8 +179,8 @@ TABLE#contactsList TD
{ white-space: nowrap; { white-space: nowrap;
width: 20%; } width: 20%; }
TABLE#contactsList TD.headerName, TD#nameHeader,
TABLE#contactsList TD.headerEmail TD#mailHeader
{ width: 30%; } { width: 30%; }
TABLE#contactsList TD IMG TABLE#contactsList TD IMG

View file

@ -1,7 +1,7 @@
/* JavaScript for SOGoContacts */ /* JavaScript for SOGoContacts */
var cachedContacts = new Array(); var cachedContacts = new Array();
var currentContactFolder = '/personal'; var currentContactFolder = null;
var usersRightsWindowHeight = 200; var usersRightsWindowHeight = 200;
var usersRightsWindowWidth = 450; var usersRightsWindowWidth = 450;
@ -30,8 +30,22 @@ function validateEditorInput(sender) {
return true; return true;
} }
function openContactsFolder(contactsFolder, params) { function openContactsFolder(contactsFolder, reload, idx) {
if (contactsFolder != currentContactFolder || params) { if (contactsFolder != currentContactFolder || reload) {
currentContactFolder = contactsFolder;
var url = URLForFolderID(currentContactFolder) +
"/view?noframe=1";
var searchValue = search["value"];
if (searchValue && searchValue.length > 0)
url += ("&search=" + search["criteria"]
+ "&value=" + searchValue);
var sortAttribute = sorting["attribute"];
if (sortAttribute && sortAttribute.length > 0)
url += ("&sort=" + sorting["attribute"]
+ "&asc=" + sorting["ascending"]);
var selection;
if (contactsFolder == currentContactFolder) { if (contactsFolder == currentContactFolder) {
var contactsList = $("contactsList"); var contactsList = $("contactsList");
if (contactsList) if (contactsList)
@ -42,13 +56,6 @@ function openContactsFolder(contactsFolder, params) {
else else
selection = null; selection = null;
currentContactFolder = contactsFolder;
var url = URLForFolderID(currentContactFolder) +
"/view?noframe=1&sort=cn&desc=0";
if (params)
url += '&' + params;
var selection;
if (document.contactsListAjaxRequest) { if (document.contactsListAjaxRequest) {
document.contactsListAjaxRequest.aborted = true; document.contactsListAjaxRequest.aborted = true;
document.contactsListAjaxRequest.abort(); document.contactsListAjaxRequest.abort();
@ -70,6 +77,15 @@ function openContactsFolderAtIndex(element) {
= triggerAjaxRequest(url, contactsListCallback); = triggerAjaxRequest(url, contactsListCallback);
} }
function configureContactsListHeaders(cells) {
for (var i = 0; i < cells.length; i++) {
var currentCell = $(cells[i]);
Event.observe(currentCell, "click",
onHeaderClick.bindAsEventListener(currentCell));
Event.observe(currentCell, "mousedown", listRowMouseDownHandler);
}
}
function contactsListCallback(http) { function contactsListCallback(http) {
var div = $("contactsListContent"); var div = $("contactsListContent");
@ -77,12 +93,44 @@ function contactsListCallback(http) {
&& http.status == 200) { && http.status == 200) {
document.contactsListAjaxRequest = null; document.contactsListAjaxRequest = null;
div.innerHTML = http.responseText; div.innerHTML = http.responseText;
var table = $("contactsList");
if (table)
configureContactsListHeaders(table.tBodies[0].rows[0].cells);
if (sorting["attribute"] && sorting["attribute"].length > 0) {
var sortHeader;
if (sorting["attribute"] == "cn")
sortHeader = $("nameHeader");
else if (sorting["attribute"] == "mail")
sortHeader = $("mailHeader");
else if (sorting["attribute"] == "screenname")
sortHeader = $("screenNameHeader");
else if (sorting["attribute"] == "o")
sortHeader = $("orgHeader");
else if (sorting["attribute"] == "telephonenumber")
sortHeader = $("phoneHeader");
else
sortHeader = null;
if (sortHeader) {
var sortImage = createElement("img", "messageSortImage", "sortImage");
sortHeader.insertBefore(sortImage, sortHeader.firstChild);
if (sorting["ascending"])
sortImage.src = ResourcesURL + "/title_sortdown_12x12.png";
else
sortImage.src = ResourcesURL + "/title_sortup_12x12.png";
}
}
var selected = http.callbackData; var selected = http.callbackData;
if (selected) { if (selected) {
for (var i = 0; i < selected.length; i++) for (var i = 0; i < selected.length; i++) {
$(selected[i]).select(); var row = $(selected[i]);
if (row)
row.select();
}
} }
configureSortableTableHeaders();
} }
else else
log ("ajax problem 1"); log ("ajax problem 1");
@ -332,19 +380,31 @@ function newEmailTo(sender) {
} }
function onHeaderClick(event) { function onHeaderClick(event) {
if (document.contactsListAjaxRequest) { var headerId = this.getAttribute("id");
document.contactsListAjaxRequest.aborted = true; var newSortAttribute;
document.contactsListAjaxRequest.abort(); if (headerId == "nameHeader")
} newSortAttribute = "cn";
url = URLForFolderID(currentContactFolder); else if (headerId == "mailHeader")
// // log("url: " + url); newSortAttribute = "mail";
// var url = "" + this.href; else if (headerId == "screenNameHeader")
if (url.indexOf("noframe=", 0) == -1) newSortAttribute = "screenname";
url += "&noframe=1"; else if (headerId == "orgHeader")
document.contactsListAjaxRequest newSortAttribute = "o";
= triggerAjaxRequest(url, contactsListCallback); else if (headerId == "phoneHeader")
newSortAttribute = "telephonenumber";
event.preventDefault(); log("header: " + headerId);
if (sorting["attribute"] == newSortAttribute)
sorting["ascending"] = !sorting["ascending"];
else {
sorting["attribute"] = newSortAttribute;
sorting["ascending"] = true;
}
refreshCurrentFolder();
preventDefault(event);
} }
function registerDraggableMessageNodes() { function registerDraggableMessageNodes() {
@ -367,17 +427,17 @@ function onFolderSelectionChange() {
var div = $("contactsListContent"); var div = $("contactsListContent");
div.innerHTML = ""; div.innerHTML = "";
} }
else else {
openContactsFolder(nodes[0].getAttribute("id"), null); search = {};
sorting = {};
$("searchValue").value = "";
initCriteria();
openContactsFolder(nodes[0].getAttribute("id"));
}
} }
function onSearchFormSubmit() { function refreshCurrentFolder() {
var searchValue = $("searchValue"); openContactsFolder(currentContactFolder, true);
openContactsFolder(currentContactFolder,
"search=" + searchValue.value);
return false;
} }
function onConfirmContactSelection(event) { function onConfirmContactSelection(event) {
@ -409,7 +469,7 @@ function onConfirmContactSelection(event) {
&& selectorList.value != initialValues) && selectorList.value != initialValues)
selector.changeNotification("addition"); selector.changeNotification("addition");
event.preventDefault(); preventDefault(event);
} }
function onContactMailTo(node) { function onContactMailTo(node) {
@ -417,7 +477,7 @@ function onContactMailTo(node) {
} }
function refreshContacts(contactId) { function refreshContacts(contactId) {
openContactsFolder(currentContactFolder, "reload=true"); refreshCurrentFolder();
cachedContacts[currentContactFolder + "/" + contactId] = null; cachedContacts[currentContactFolder + "/" + contactId] = null;
loadContact(contactId); loadContact(contactId);
@ -465,7 +525,7 @@ function newUserFolderCallback(folderData) {
function onAddressBookAdd(event) { function onAddressBookAdd(event) {
openUserFolderSelector(newUserFolderCallback, "contact"); openUserFolderSelector(newUserFolderCallback, "contact");
event.preventDefault(); preventDefault(event);
} }
function onFolderUnsubscribeCB(folderId) { function onFolderUnsubscribeCB(folderId) {
@ -494,7 +554,7 @@ function onAddressBookRemove(event) {
} }
} }
event.preventDefault(); preventDefault(event);
} }
function deletePersonalAddressBook(folderId) { function deletePersonalAddressBook(folderId) {
@ -594,13 +654,15 @@ function configureContactFolders() {
var personalFolder = $("/personal"); var personalFolder = $("/personal");
personalFolder.select(); personalFolder.select();
openContactsFolder("/personal");
} }
} }
function setEventsOnContactFolder(node) { function setEventsOnContactFolder(node) {
Event.observe(node, "mousedown", listRowMouseDownHandler, false); Event.observe(node, "mousedown", listRowMouseDownHandler, false);
Event.observe(node, "click", onRowClick, false); Event.observe(node, "click", onRowClick, false);
Event.observe(node, "contextmenu", onContactFoldersContextMenu.bindAsEventListener(node), false); Event.observe(node, "contextmenu",
onContactFoldersContextMenu.bindAsEventListener(node), false);
} }
function onMenuSharing(event) { function onMenuSharing(event) {
@ -630,7 +692,8 @@ function configureSelectionButtons() {
if (container) { if (container) {
var buttons = container.childNodesWithTag("input"); var buttons = container.childNodesWithTag("input");
for (var i = 0; i < buttons.length; i++) for (var i = 0; i < buttons.length; i++)
Event.observe(buttons[i], "click", onConfirmContactSelection.bindAsEventListener(buttons[i]), false); Event.observe(buttons[i], "click",
onConfirmContactSelection.bindAsEventListener(buttons[i]));
} }
} }