plugins/kolab_addressbook
Aleksander Machniak
machniak at kolabsys.com
Tue May 28 15:53:39 CEST 2013
plugins/kolab_addressbook/kolab_addressbook.js | 175 ++++++++++---------------
1 file changed, 76 insertions(+), 99 deletions(-)
New commits:
commit b1e5827e48909c99b7969dc79e3ace7003dd9b8f
Author: Aleksander Machniak <machniak at kolabsys.com>
Date: Tue May 28 15:52:24 2013 +0200
Fixed operations on addressbooks using new (in Roundcube 1.0) treelist widget (Bug #1766)
diff --git a/plugins/kolab_addressbook/kolab_addressbook.js b/plugins/kolab_addressbook/kolab_addressbook.js
index 56090dc..11965d5 100644
--- a/plugins/kolab_addressbook/kolab_addressbook.js
+++ b/plugins/kolab_addressbook/kolab_addressbook.js
@@ -84,125 +84,137 @@ rcube_webmail.prototype.book_save = function()
};
// action executed after book delete
-rcube_webmail.prototype.book_delete_done = function(id)
+rcube_webmail.prototype.book_delete_done = function(id, recur)
{
- var n, g, li = this.get_folder_li(id), groups = this.env.contactgroups;
+ var n, groups = this.env.contactgroups,
+ sources = this.env.address_sources,
+ olddata = sources[id];
+
+ this.treelist.remove(id);
- // remove folder and its groups rows
for (n in groups)
- if (groups[n].source == id && (g = this.get_folder_li(n))) {
- $(g).remove();
+ if (groups[n].source == id) {
delete this.env.contactgroups[n];
+ delete this.env.contactfolders[n];
}
- $(li).remove();
delete this.env.address_sources[id];
delete this.env.contactfolders[id];
+
+ if (recur)
+ return;
+
+ // remove subfolders
+ olddata.realname += this.env.delimiter;
+ for (n in sources)
+ if (sources[n].realname && sources[n].realname.indexOf(olddata.realname) == 0)
+ this.book_delete_done(n, true);
};
// action executed after book create/update
-rcube_webmail.prototype.book_update = function(data, old)
+rcube_webmail.prototype.book_update = function(data, old, recur)
{
- var n, i, id, len, link, row, refrow, olddata, name = '', realname = '', sources, level,
- folders = [], class_name = 'addressbook',
- list = this.gui_objects.folderlist,
+ var n, i, id, len, link, row, prop, olddata, oldid, name, sources, level,
+ folders = [], classes = ['addressbook'],
groups = this.env.contactgroups;
this.env.contactfolders[data.id] = this.env.address_sources[data.id] = data;
this.show_contentframe(false);
- // update
+ // update (remove old row)
if (old && old != data.id) {
olddata = this.env.address_sources[old];
delete this.env.address_sources[old];
delete this.env.contactfolders[old];
- refrow = $('#rcmli'+old);
+ this.treelist.remove(old);
}
sources = this.env.address_sources;
// set row attributes
if (data.readonly)
- class_name += ' readonly';
+ classes.push('readonly');
if (data.class_name)
- class_name += ' '+data.class_name;
+ classes.push(data.class_name);
// updated currently selected book
if (this.env.source != '' && this.env.source == old) {
- class_name += ' selected';
+ classes.push('selected');
this.env.source = data.id;
}
- link = $('<a>').attr({'href': '#', 'rel': data.id}).html(data.name)
- .click(function() { return rcmail.command('list', data.id, this); });
- row = $('<li>').attr({id: 'rcmli'+data.id, 'class': class_name})
- .append(link);
-
- // sort kolab folders, to put the new one in order
- for (n in sources)
- if (sources[n].kolab && (name = sources[n].realname))
- folders.push(name);
+ link = $('<a>').html(data.name)
+ .attr({
+ href: '#', rel: data.id,
+ onclick: "return rcmail.command('list', '" + data.id + "', this)"
+ });
+
+ // add row at the end of the list
+ // treelist widget is not very smart, we need
+ // to do sorting and add groups list by ourselves
+ this.treelist.insert({id: data.id, html:link, classes: classes, childlistclass: 'groups'}, '', false);
+ row = $(this.treelist.get_item(data.id));
+ row.append($('<ul class="groups">').hide());
+
+ // we need to sort rows because treelist can't sort by property
+ $.each(sources, function(i, v) {
+ if (v.kolab && v.realname)
+ folders.push(v.realname);
+ });
folders.sort();
- // find current id
for (n=0, len=folders.length; n<len; n++)
if (folders[n] == data.realname)
break;
- // add row
- if (n && n < len) {
- // find the row before
+ // find the row before and re-insert after it
+ if (n && n < len - 1) {
name = folders[n-1];
for (n in sources)
if (sources[n].realname && sources[n].realname == name) {
- // folder row found
- n = $('#rcmli'+n);
- // skip groups
- while (n.next().hasClass('contactgroup'))
- n = n.next();
- row.insertAfter(n);
+ row.detach().insertAfter(this.treelist.get_item(n));
break;
}
}
- else if (olddata) {
- row.insertBefore(refrow);
- }
- else {
- row.appendTo(list);
- }
if (olddata) {
- // remove old row (just after the new row has been inserted)
- refrow.remove();
-
// update groups
for (n in groups) {
if (groups[n].source == old) {
- // update existing row
- refrow = $('#rcmli'+n);
- refrow.remove().attr({id: 'rcmliG'+data.id+groups[n].id});
- $('a', refrow).removeAttr('onclick').unbind()
- .click({source: data.id, id: groups[n].id}, function(e) {
- return rcmail.command('listgroup', {'source': e.data.source, 'id': e.data.id}, this);
- });
- refrow.insertAfter(row);
- row = refrow;
-
- // update group data
- groups[n].source = data.id;
- this.env.contactgroups['G'+data.id+groups[n].id] = groups[n];
+ prop = groups[n];
+ prop.type = 'group';
+ prop.source = data.id;
+ id = 'G' + prop.source + prop.id;
+
+ link = $('<a>').text(prop.name)
+ .attr({
+ href: '#', rel: prop.source + ':' + prop.id,
+ onclick: "return rcmail.command('listgroup', {source: '"+prop.source+"', id: '"+prop.id+"'}, this)"
+ });
+
+ this.treelist.insert({id:id, html:link, classes:['contactgroup']}, prop.source, true);
+
+ this.env.contactfolders[id] = this.env.contactgroups[id] = prop;
delete this.env.contactgroups[n];
+ delete this.env.contactfolders[n];
}
}
- old += '-';
+ if (recur)
+ return;
+
+ // update subfolders
+ old += '_';
level = olddata.realname.split(this.env.delimiter).length - data.realname.split(this.env.delimiter).length;
- // update (realname and ID of) subfolders
+ olddata.realname += this.env.delimiter;
+
for (n in sources) {
- if (n != data.id && n.indexOf(old) == 0) {
+ if (sources[n].realname && sources[n].realname.indexOf(olddata.realname) == 0) {
+ prop = sources[n];
+ oldid = sources[n].id;
// new ID
- id = data.id + '-' + n.substr(old.length);
- name = sources[n].name;
- realname = data.realname + sources[n].realname.substr(olddata.realname.length);
+ prop.id = data.id + '_' + n.substr(old.length);
+ prop.realname = data.realname + prop.realname.substr(olddata.realname.length - 1);
+ name = prop.name;
// update display name
if (level > 0) {
@@ -214,43 +226,8 @@ rcube_webmail.prototype.book_update = function(data, old)
name = ' ' + name;
}
- // update existing row
- refrow = $('#rcmli'+n);
- refrow.remove().attr({id: 'rcmli'+id});
- $('a', refrow).html(name).removeAttr('onclick').unbind().attr({rel: id, href: '#'})
- .click({id: id}, function(e) { return rcmail.command('list', e.data.id, this); });
-
- // move the row to the new place
- refrow.insertAfter(row);
- row = refrow;
-
- // update list data
- sources[n].id = id;
- sources[n].name = name;
- sources[n].realname = realname;
- this.env.address_sources[id] = this.env.contactfolders[id] = sources[n];
- delete this.env.address_sources[n];
- delete this.env.contactfolders[n];
-
- // update groups
- for (i in groups) {
- if (groups[i].source == n) {
- // update existing row
- refrow = $('#rcmli'+i);
- refrow.remove().attr({id: 'rcmliG'+id+groups[i].id});
- $('a', refrow).removeAttr('onclick').unbind()
- .click({source: id, id: groups[i].id}, function(e) {
- return rcmail.command('listgroup', {'source': e.data.source, 'id': e.data.id}, this);
- });
- refrow.insertAfter(row);
- row = refrow;
-
- // update group data
- groups[i].source = id;
- this.env.contactgroups['G'+id+groups[i].id] = groups[i];
- delete this.env.contactgroups[i];
- }
- }
+ prop.name = name;
+ this.book_update(prop, oldid, true)
}
}
}
More information about the commits
mailing list