Changeset bb8012c in github


Ignore:
Timestamp:
May 13, 2010 5:13:25 AM (3 years ago)
Author:
alecpl <alec@…>
Branches:
master, HEAD, courier-fix, dev-browser-capabilities, pdo, release-0.6, release-0.7, release-0.8
Children:
d17a7fea
Parents:
af1cc9d
Message:
  • Extend contact groups support (#1486682)
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • CHANGELOG

    r4880749 rbb8012c  
    22=========================== 
    33 
     4- Extend contact groups support (#1486682) 
    45- Fix check-recent action issues and performance (#1486526) 
    56- Fix messages order after checking for recent (#1484664) 
  • program/include/rcube_contacts.php

    r25fdec5 rbb8012c  
    124124        if (!$this->groups) 
    125125            return $results; 
    126  
     126console('---------------'); 
    127127        $sql_filter = $search ? " AND " . $this->db->ilike('name', '%'.$search.'%') : ''; 
    128128 
  • program/include/rcube_imap.php

    r4880749 rbb8012c  
    27692769                    $this->clear_message_cache($mailbox.'.msg'); 
    27702770                    } 
    2771            
     2771 
    27722772                foreach ($sub_mboxes as $c_mbox) { 
    27732773                    if ($c_mbox != 'INBOX') { 
  • program/js/app.js

    r4880749 rbb8012c  
    509509 
    510510      case 'listgroup': 
    511         this.list_contacts(null, props); 
     511        this.list_contacts(props.source, props.id); 
    512512        break; 
    513513 
     
    12591259      for (var k in this.env.folder_coords) { 
    12601260        pos = this.env.folder_coords[k]; 
    1261         if (mouse.x >= pos.x1 && mouse.x < pos.x2 && mouse.y >= pos.y1 && mouse.y < pos.y2 
    1262             && this.check_droptarget(k)) { 
    1263  
    1264           li = this.get_folder_li(k); 
    1265           div = $(li.getElementsByTagName('div')[0]); 
    1266  
    1267           // if the folder is collapsed, expand it after 1sec and restart the drag & drop process. 
    1268           if (div.hasClass('collapsed')) { 
    1269             if (this.folder_auto_timer) 
     1261        if (mouse.x >= pos.x1 && mouse.x < pos.x2 && mouse.y >= pos.y1 && mouse.y < pos.y2){ 
     1262         if (this.check_droptarget(k)) { 
     1263            li = this.get_folder_li(k); 
     1264            div = $(li.getElementsByTagName('div')[0]); 
     1265 
     1266            // if the folder is collapsed, expand it after 1sec and restart the drag & drop process. 
     1267            if (div.hasClass('collapsed')) { 
     1268              if (this.folder_auto_timer) 
     1269                window.clearTimeout(this.folder_auto_timer); 
     1270 
     1271              this.folder_auto_expand = k; 
     1272              this.folder_auto_timer = window.setTimeout(function() { 
     1273                  rcmail.command('collapse-folder', rcmail.folder_auto_expand); 
     1274                  rcmail.drag_start(null); 
     1275                }, 1000); 
     1276            } else if (this.folder_auto_timer) { 
    12701277              window.clearTimeout(this.folder_auto_timer); 
    1271  
    1272             this.folder_auto_expand = k; 
    1273             this.folder_auto_timer = window.setTimeout(function() { 
    1274                 rcmail.command('collapse-folder', rcmail.folder_auto_expand); 
    1275                 rcmail.drag_start(null); 
    1276               }, 1000); 
    1277           } else if (this.folder_auto_timer) { 
    1278             window.clearTimeout(this.folder_auto_timer); 
    1279             this.folder_auto_timer = null; 
    1280             this.folder_auto_expand = null; 
     1278              this.folder_auto_timer = null; 
     1279              this.folder_auto_expand = null; 
     1280            } 
     1281 
     1282            $(li).addClass('droptarget'); 
     1283            this.env.folder_coords[k].on = 1; 
     1284            this.env.last_folder_target = k; 
     1285          } else { // Clear target, otherwise drag end will trigger move into last valid droptarget 
     1286            this.env.last_folder_target = null; 
    12811287          } 
    1282  
    1283           $(li).addClass('droptarget'); 
    1284           this.env.last_folder_target = k; 
    1285           this.env.folder_coords[k].on = 1; 
    12861288        } 
    12871289        else if (pos.on) { 
     
    15031505      return (id != this.env.source && this.env.contactfolders[id] && !this.env.contactfolders[id].readonly && 
    15041506        !(!this.env.source && this.env.contactfolders[id].group) && 
     1507        !(this.env.contactfolders[id].type == 'group' && this.env.contactfolders[this.env.source].readonly) && 
     1508        !(this.env.contactfolders[id].type == 'group' && this.env.contactfolders[id].source != this.env.source) && 
    15051509        !(this.env.contactfolders[id].type == 'group' && this.env.contactfolders[id].id == this.env.group)); 
    15061510    else if (this.task == 'settings') 
     
    34183422    var target = window; 
    34193423 
    3420     // currently all groups belong to the local address book 
    3421     if (group) 
    3422       src = 0; 
    3423     else if (!src) 
     3424    if (!src) 
    34243425      src = this.env.source; 
    34253426 
     
    34353436      page = this.env.current_page = 1; 
    34363437 
    3437     this.select_folder((group ? 'G'+group : src), (this.env.group ? 'G'+this.env.group : this.env.source)); 
     3438    this.select_folder((group ? 'G'+src+group : src), (this.env.group ? 'G'+this.env.source+this.env.group : this.env.source)); 
    34383439 
    34393440    this.env.source = src; 
     
    35203521      this.http_post('group-addmembers', '_cid='+urlencode(cid)+'&_source='+urlencode(this.env.source)+'&_gid='+urlencode(to.id)); 
    35213522    else if (to.id != this.env.source && cid && this.env.address_sources[to.id] && !this.env.address_sources[to.id].readonly) 
    3522       this.http_post('copy', '_cid='+urlencode(cid)+'&_source='+urlencode(this.env.source)+'&_to='+urlencode(to.id)); 
     3523      this.http_post('copy', '_cid='+urlencode(cid)+'&_source='+urlencode(this.env.source)+'&_to='+urlencode(to.id)+(this.env.group ? '&_gid='+urlencode(this.env.group) : '')); 
    35233524  }; 
    35243525 
     
    36263627      this.name_input.onkeypress = function(e){ return rcmail.add_input_keypress(e); }; 
    36273628 
    3628       this.gui_objects.folderlist.parentNode.appendChild(this.name_input); 
     3629      var li = this.get_folder_li(this.env.source) 
     3630      $(this.name_input).insertAfter(li); 
    36293631    } 
    36303632 
     
    36413643      this.name_input = document.createElement('input'); 
    36423644      this.name_input.type = 'text'; 
    3643       this.name_input.value = this.env.contactgroups['G'+this.env.group].name; 
     3645      this.name_input.value = this.env.contactgroups['G'+this.env.source+this.env.group].name; 
    36443646      this.name_input.onkeypress = function(e){ return rcmail.add_input_keypress(e); }; 
    36453647      this.env.group_renaming = true; 
    36463648 
    3647       var link, li = this.get_folder_li(this.env.group, 'rcmliG'); 
     3649      var li = this.get_folder_li(this.env.source+this.env.group, 'rcmliG'); 
    36483650      if (li && (link = li.firstChild)) { 
    36493651        $(link).hide(); 
     
    36623664 
    36633665  // callback from server upon group-delete command 
    3664   this.remove_group_item = function(id) 
    3665   { 
    3666     var li, key = 'G'+id; 
     3666  this.remove_group_item = function(prop) 
     3667  { 
     3668    var li, key = 'G'+prop.source+prop.id; 
    36673669    if ((li = this.get_folder_li(key))) { 
    3668       this.triggerEvent('removegroup', { id:id, li:li }); 
     3670      this.triggerEvent('removegroup', { source:prop.source, id:prop.id, li:li }); 
    36693671 
    36703672      li.parentNode.removeChild(li); 
     
    36733675    } 
    36743676 
    3675     this.list_contacts(null, 0); 
     3677    this.list_contacts(prop.source, 0); 
    36763678  }; 
    36773679 
     
    37233725 
    37243726    prop.type = 'group'; 
    3725     var key = 'G'+prop.id; 
     3727    var key = 'G'+prop.source+prop.id; 
    37263728    this.env.contactfolders[key] = this.env.contactgroups[key] = prop; 
    37273729 
    37283730    var link = $('<a>').attr('href', '#') 
    3729       .bind('click', function() { return rcmail.command('listgroup', prop.id, this);}) 
     3731      .bind('click', function() { return rcmail.command('listgroup', prop, this);}) 
    37303732      .html(prop.name); 
    37313733    var li = $('<li>').attr('id', 'rcmli'+key).addClass('contactgroup').append(link); 
    3732     $(this.gui_objects.folderlist).append(li); 
    3733  
    3734     this.triggerEvent('insertgroup', { id:prop.id, name:prop.name, li:li[0] }); 
     3734    var pli = this.get_folder_li(prop.source) 
     3735    $(li).insertAfter(pli); 
     3736 
     3737    this.triggerEvent('insertgroup', { id:prop.id, source:prop.source, name:prop.name, li:li[0] }); 
    37353738  }; 
    37363739 
    37373740  // callback for renaming a contact group 
    3738   this.update_contact_group = function(id, name) 
     3741  this.update_contact_group = function(prop) 
    37393742  { 
    37403743    this.reset_add_input(); 
    37413744 
    3742     var key = 'G'+id, link, li = this.get_folder_li(key); 
     3745    var key = 'G'+prop.source+prop.id, link, li = this.get_folder_li(key); 
    37433746 
    37443747    if (li && (link = li.firstChild) && link.tagName.toLowerCase() == 'a') 
    3745       link.innerHTML = name; 
     3748      link.innerHTML = prop.name; 
    37463749 
    37473750    this.env.contactfolders[key].name = this.env.contactgroups[key].name = name; 
    3748     this.triggerEvent('updategroup', { id:id, name:name, li:li[0] }); 
     3751    this.triggerEvent('updategroup', { id:prop.id, source:prop.source, name:prop.name, li:li[0] }); 
    37493752  }; 
    37503753 
     
    48744877 
    48754878          if (response.action == 'list' || response.action == 'search') { 
    4876             this.enable_command('group-create', this.env.address_sources[this.env.source].groups); 
    4877             this.enable_command('group-rename', 'group-delete', this.env.address_sources[this.env.source].groups && this.env.group); 
     4879            this.enable_command('group-create', 
     4880              (this.env.address_sources[this.env.source].groups && !this.env.address_sources[this.env.source].readonly)); 
     4881            this.enable_command('group-rename', 'group-delete', 
     4882              (this.env.address_sources[this.env.source].groups && this.env.group && !this.env.address_sources[this.env.source].readonly)); 
    48784883            this.triggerEvent('listupdate', { folder:this.env.source, rowcount:this.contact_list.rowcount }); 
    48794884          } 
  • program/steps/addressbook/func.inc

    ra61bbb2 rbb8012c  
    5151$OUTPUT->set_env('source', $source ? $source : '0'); 
    5252$OUTPUT->set_env('readonly', $CONTACTS->readonly, false); 
    53 $OUTPUT->set_env('address_sources', $js_list); 
     53if(! $OUTPUT->ajax_call) 
     54  $OUTPUT->set_env('address_sources', $js_list); 
    5455 
    5556 
     
    6364  $out = ''; 
    6465  $local_id = '0'; 
     66  $jsdata = array(); 
    6567  $current = get_input_value('_source', RCUBE_INPUT_GPC); 
    6668  $line_templ = html::tag('li', array('id' => 'rcmli%s', 'class' => 'addressbook %s'), 
     
    8284    $out .= sprintf($line_templ, $dom_id, ($current == $id ? 'selected' : ''), 
    8385      Q(rcmail_url(null, array('_source' => $id))), $js_id, (!empty($source['name']) ? Q($source['name']) : Q($id))); 
    84   } 
    85    
    86   $out .= rcmail_contact_groups(array('items' => true)); 
    87  
     86    $groupdata = rcmail_contact_groups(array('out' => $out, 'jsdata' => $jsdata, 'source' => $id)); 
     87    $jsdata = $groupdata['jsdata']; 
     88    $out = $groupdata['out']; 
     89  } 
     90 
     91  $OUTPUT->set_env('contactgroups', $jsdata);  
    8892  $OUTPUT->add_gui_object('folderlist', $attrib['id']); 
    8993   
     
    9296 
    9397 
    94 function rcmail_contact_groups($attrib) 
     98function rcmail_contact_groups($args) 
    9599{ 
    96   global $CONTACTS, $OUTPUT; 
    97    
    98   if (!$attrib['id']) 
    99     $attrib['id'] = 'rcmgroupslist'; 
    100    
    101   $groups = $CONTACTS->list_groups(); 
    102   $line_templ = html::tag('li', array('id' => 'rcmliG%s', 'class' => 'contactgroup'), 
    103     html::a(array('href' => '#', 'onclick' => "return ".JS_OBJECT_NAME.".command('listgroup','%s',this)"), '%s')); 
    104  
    105   $jsdata = array(); 
    106   foreach ($groups as $group) { 
    107     $out .= sprintf($line_templ, $group['ID'], $group['ID'], Q($group['name'])); 
    108     $jsdata['G'.$group['ID']] = array('id' => $group['ID'], 'name' => $group['name'], 'type' => 'group'); 
    109   } 
    110    
    111   $OUTPUT->set_env('contactgroups', $jsdata); 
    112   //$OUTPUT->add_gui_object('groupslist', $attrib['id']); 
    113    
    114   return $attrib['items'] ? $out : html::tag('ul', $attrib, $out, html::$common_attrib); 
     100  global $RCMAIL; 
     101 
     102  $groups = $RCMAIL->get_address_book($args['source'])->list_groups(); 
     103 
     104  if (!empty($groups)) { 
     105    $line_templ = html::tag('li', array('id' => 'rcmliG%s%s', 'class' => 'contactgroup'), 
     106      html::a(array('href' => '#', 'onclick' => "return ".JS_OBJECT_NAME.".command('listgroup',{'source':'%s','id':'%s'},this)"), '%s')); 
     107 
     108    $jsdata = array(); 
     109    foreach ($groups as $group) { 
     110      $args['out'] .= sprintf($line_templ, $args['source'], $group['ID'], $args['source'], $group['ID'], Q($group['name'])); 
     111      $args['jsdata']['G'.$args['source'].$group['ID']] = array( 
     112        'source' => $args['source'], 'id' => $group['ID'], 'name' => $group['name'], 'type' => 'group'); 
     113    } 
     114  } 
     115 
     116  return $args; 
    115117} 
    116118 
  • program/steps/addressbook/groups.inc

    rd1851ba rbb8012c  
    1919 
    2020*/ 
    21  
    2221 
    2322if ($CONTACTS->readonly || !$CONTACTS->groups) { 
     
    6362   
    6463  if ($created && $OUTPUT->ajax_call) { 
     64    $created['source'] = $source; 
    6565    $OUTPUT->command('insert_contact_group', $created); 
    6666  } 
     
    7878 
    7979  if ($newname && $OUTPUT->ajax_call) 
    80     $OUTPUT->command('update_contact_group', $gid, $newname); 
     80    $OUTPUT->command('update_contact_group', array('source' => $source, 'id' => $gid, 'name' => $newname)); 
    8181  else if (!$newname) 
    8282    $OUTPUT->show_message($plugin['message'] ? $plugin['message'] : 'errorsaving', 'error'); 
     
    9191 
    9292  if ($deleted) 
    93     $OUTPUT->command('remove_group_item', $gid); 
     93    $OUTPUT->command('remove_group_item', array('source' => $source, 'id' => $gid)); 
    9494  else 
    9595    $OUTPUT->show_message($plugin['message'] ? $plugin['message'] : 'errorsaving', 'error'); 
  • skins/default/addressbook.css

    ra61bbb2 rbb8012c  
    118118  left: 0; 
    119119  right: 0; 
    120   overflow: auto; 
     120  overflow-y: auto; 
     121  overflow-x: hidden; 
    121122} 
    122123 
     
    238239#directorylist li.contactgroup 
    239240{ 
    240   background-position: 5px -144px; 
     241  padding-left: 15px; 
     242  background-position: 20px -144px; 
    241243} 
    242244 
Note: See TracChangeset for help on using the changeset viewer.