thomascube
2011-02-15 360bd3ea740073b83817183581893681e13a8570
Allow group identifiers to be changed upon renaming (used in LDAP)

4 files modified
38 ■■■■ changed files
program/include/rcube_addressbook.php 3 ●●●● patch | view | raw | blame | history
program/include/rcube_ldap.php 4 ●●● patch | view | raw | blame | history
program/js/app.js 27 ●●●● patch | view | raw | blame | history
program/steps/addressbook/groups.inc 4 ●●●● patch | view | raw | blame | history
program/include/rcube_addressbook.php
@@ -310,9 +310,10 @@
     *
     * @param string Group identifier
     * @param string New name to set for this group
     * @param string New group identifier (if changed, otherwise don't set)
     * @return boolean New name on success, false if no data was changed
     */
    function rename_group($gid, $newname)
    function rename_group($gid, $newname, &$newid)
    {
        /* empty for address books don't supporting groups */
        return false;
program/include/rcube_ldap.php
@@ -995,9 +995,10 @@
     *
     * @param string Group identifier
     * @param string New name to set for this group
     * @param string New group identifier (if changed, otherwise don't set)
     * @return boolean New name on success, false if no data was changed
     */
    function rename_group($group_id, $new_name)
    function rename_group($group_id, $new_name, &$new_id)
    {
        if (!$this->group_cache)
            $this->list_groups();
@@ -1006,6 +1007,7 @@
        $group_name = $this->group_cache[$group_id]['name'];
        $old_dn = "cn=$group_name,$base_dn";
        $new_rdn = "cn=$new_name";
        $new_id = base64_encode($new_rdn . ",$base_dn");
        $res = ldap_rename($this->conn, $old_dn, $new_rdn, NULL, TRUE);
        if ($res === false)
program/js/app.js
@@ -3948,6 +3948,7 @@
    this.env.contactfolders[key] = this.env.contactgroups[key] = prop;
    var link = $('<a>').attr('href', '#')
      .attr('rel', prop.source+':'+prop.id)
      .bind('click', function() { return rcmail.command('listgroup', prop, this);})
      .html(prop.name);
    var li = $('<li>').attr('id', 'rcmli'+key.replace(this.identifier_expr, '_'))
@@ -3963,13 +3964,33 @@
  {
    this.reset_add_input();
    var key = 'G'+prop.source+prop.id, link, li = this.get_folder_li(key);
    var key = 'G'+prop.source+prop.id,
      li = this.get_folder_li(key),
      link;
    if (li && (link = li.firstChild) && link.tagName.toLowerCase() == 'a')
    // group ID has changed, replace link node and identifiers
    if (li && prop.newid) {
      var newkey = 'G'+prop.source+prop.newid;
      li.id = String('rcmli'+newkey).replace(this.identifier_expr, '_');
      this.env.contactfolders[newkey] = this.env.contactfolders[key];
      this.env.group = prop.newid;
      var newprop = $.extend({}, prop);
      newprop.id = prop.newid;
      newprop.type = 'group';
      link = $('<a>').attr('href', '#')
        .attr('rel', prop.source+':'+prop.newid)
        .bind('click', function() { return rcmail.command('listgroup', newprop, this);})
        .html(prop.name);
      $(li).children().replaceWith(link);
    }
    // update displayed group name
    else if (li && (link = li.firstChild) && link.tagName.toLowerCase() == 'a')
      link.innerHTML = prop.name;
    this.env.contactfolders[key].name = this.env.contactgroups[key].name = prop.name;
    this.triggerEvent('group_update', { id:prop.id, source:prop.source, name:prop.name, li:li[0] });
    this.triggerEvent('group_update', { id:prop.id, source:prop.source, name:prop.name, li:li[0], newid:prop.newid });
  };
program/steps/addressbook/groups.inc
@@ -91,7 +91,7 @@
    $plugin = $RCMAIL->plugins->exec_hook('group_rename', array('group_id' => $gid, 'name' => $name, 'source' => $source));
    if (!$plugin['abort'])
      $newname = $CONTACTS->rename_group($gid, $plugin['name']);
      $newname = $CONTACTS->rename_group($gid, $plugin['name'], $newgid);
    else
      $newname = $plugin['result'];
  }
@@ -99,7 +99,7 @@
  if ($newname && $OUTPUT->ajax_call) {
    $OUTPUT->show_message('grouprenamed', 'confirmation');
    $OUTPUT->command('update_contact_group', array(
      'source' => $source, 'id' => $gid, 'name' => $newname));
      'source' => $source, 'id' => $gid, 'name' => $newname, 'newid' => $newgid));
  }
  else if (!$newname)
    $OUTPUT->show_message($plugin['message'] ? $plugin['message'] : 'errorsaving', 'error');