comparison plugins/thunderbird_labels/thunderbird_labels.php @ 24:4869fae20b88

do better at flag deletion, unthreaded dates sort working, preparing for threaded
author Charlie Root
date Wed, 17 Jan 2018 17:40:51 -0500
parents 5a851d965bc1
children 4b2bc456ce42
comparison
equal deleted inserted replaced
23:5a851d965bc1 24:4869fae20b88
330 return $p; 330 return $p;
331 } 331 }
332 332
333 public function read_flags($args) 333 public function read_flags($args)
334 { 334 {
335 rcube::write_log($this->name, "read: ".$_SESSION['sort_col']);
336 // add color information for all messages 335 // add color information for all messages
337 // dont loop over all messages if we dont have any highlights or no msgs 336 // dont loop over all messages if we dont have any highlights or no msgs
338 if (!isset($args['messages']) or !is_array($args['messages'])) { 337 if (!isset($args['messages']) or !is_array($args['messages'])) {
339 return $args; 338 return $args;
340 } 339 }
341 // loop over all messages and add $LabelX info to the extra_flags 340 // loop over all messages and add $LabelX info to the extra_flags
341 $mbox = $this->rc->output->get_env('mailbox') ?: $this->rc->storage->get_folder();
342 rcube::write_log($this->name, "mbox: $mbox");
342 foreach($args['messages'] as $message) 343 foreach($args['messages'] as $message)
343 { 344 {
344 #rcube::write_log($this->name, print_r($message->flags, true));
345 $message->list_flags['extra_flags']['tb_labels'] = array(); # always set extra_flags, needed for javascript later! 345 $message->list_flags['extra_flags']['tb_labels'] = array(); # always set extra_flags, needed for javascript later!
346 $message->list_flags['extra_flags']['tb_parms'] = array(); 346 $message->list_flags['extra_flags']['tb_lparms'] = array();
347 $keyPos = array_search($_SESSION['sort_col'],$this->rc->config->get('tb_label_parm_labels')); 347 $keyPos = array_search($_SESSION['sort_col'],$this->rc->config->get('tb_label_parm_labels'));
348 rcube::write_log($this->name,"sort? $keyPos ".$_SESSION['sort_order']." ".print_r($this->rc->config->get('tb_label_parm_labels'),true)); 348 rcube::write_log($this->name,"sort? $keyPos ".$_SESSION['sort_order']." ".print_r($this->rc->config->get('tb_label_parm_labels'),true));
349 if (is_array($message->flags)) 349 if (is_array($message->flags))
350 foreach ($message->flags as $flagname => $flagvalue) 350 foreach ($message->flags as $flagname => $flagvalue)
351 { 351 {
360 $pn=(int)substr($flag_no,0,$ppos); 360 $pn=(int)substr($flag_no,0,$ppos);
361 $pv=substr($flag_no,$ppos+1); 361 $pv=substr($flag_no,$ppos+1);
362 $message->list_flags['extra_flags']['tb_lparms'][]=array( 362 $message->list_flags['extra_flags']['tb_lparms'][]=array(
363 'number' => $pn, 363 'number' => $pn,
364 'parm' => $pv); 364 'parm' => $pv);
365 if ($keyPos) { 365 if ($keyPos && $message->depth==0) {
366 $message->sortKey=array_map('intval',preg_split('/[/-]/',$pv)); 366 $message->sortKey=array_map('intval',preg_split('#[/-]#',$pv));
367 } 367 }
368 } 368 }
369 else { 369 else {
370 $message->list_flags['extra_flags']['tb_labels'][] = (int)$flag_no; 370 $message->list_flags['extra_flags']['tb_labels'][] = (int)$flag_no;
371 } 371 }
372 } 372 }
373 } 373 }
374 } 374 }
375 if ($keyPos) { 375 if ($keyPos) {
376 $rev = $_SESSION['sort_order']=='DESC'; 376 $rev = $_SESSION['sort_order']=='DESC';
377 usort($args['messages'], 377 $datesSort =
378 function($a, $b) use ($rev) { 378 function($a, $b) use ($rev) {
379 if ($ak=$a->sortKey) { 379 if ($ak=$a->sortKey) {
380 if ($bk=$b->sortKey) { 380 if ($bk=$b->sortKey) {
381 // each key is sd sm ed em 381 // each key is sd sm ed em
382 if ($ak[1]<$bk[1]) return $rev?1:-1; 382 if ($ak[1]<$bk[1]) return $rev?1:-1;
383 if ($ak[1]>$bk[1]) return $rev?-1:1; 383 if ($ak[1]>$bk[1]) return $rev?-1:1;
384 // start month is the same 384 // start month is the same
385 if ($ak[0]<$bk[0]) return $rev?1:-1; 385 if ($ak[0]<$bk[0]) return $rev?1:-1;
386 if ($ak[0]>$bk[0]) return $rev?-1:1; 386 if ($ak[0]>$bk[0]) return $rev?-1:1;
387 // start date is the same 387 // start date is the same
388 if ($ak[3]<$bk[3]) return $rev?1:-1; 388 if ($ak[3]<$bk[3]) return $rev?1:-1;
389 if ($ak[3]>$bk[3]) return $rev?-1:1; 389 if ($ak[3]>$bk[3]) return $rev?-1:1;
390 // end month is the same 390 // end month is the same
391 if ($ak[2]<$bk[2]) return $rev?1:-1; 391 if ($ak[2]<$bk[2]) return $rev?1:-1;
392 if ($ak[2]>$bk[2]) return $rev?-1:1; 392 if ($ak[2]>$bk[2]) return $rev?-1:1;
393 // both dates are the same 393 // both dates are the same
394 return 0;
395 }
396 else {
397 return $rev?1:-1;
398 }
399 }
400 else if ($b->sortKey) {
401 return $rev?-1:1;
402 }
403 else {
394 return 0; 404 return 0;
395 } 405 }
396 else { 406 };
397 return $rev?1:-1; 407 if ($this->rc->config->get('message_threading')[$mbox]) {
398 } 408 // The threading information is contained in three fields:
399 } 409 // depth, parent_uid and uid
400 else if ($b->sortKey) { 410 // I _think_ if you gave every depth0 message its dates as key
401 return $rev?-1:1; 411 // every depth>0 its date as key
402 } 412 // Then first sort all the depth0 messages into a new array
403 else { 413 // then iterate over them, pull all depth1 with shared parent and sort _them,
404 return 0; 414 // insert after parent
405 } 415 // repeat at depth 1, etc.
406 }); 416 }
417 else {
418 usort($args['messages'],$datesSort);
419 }
407 } 420 }
408 return($args); 421 return($args);
409 } 422 }
410 423
411 // set flags in IMAP server 424 // set flags in IMAP server
430 if (!is_array($unflag_uids) 443 if (!is_array($unflag_uids)
431 || !is_array($flag_uids)) 444 || !is_array($flag_uids))
432 return false; 445 return false;
433 446
434 $imap->set_flag($flag_uids, $toggle_label, $mbox); 447 $imap->set_flag($flag_uids, $toggle_label, $mbox);
435 $imap->set_flag($unflag_uids, "UN$toggle_label", $mbox); 448 // belt and braces
436 449 if (count($unflag_uids)>0) {
450 $flaggedMsgs = $imap->list_flags($mbox,$unflag_uids);
451 rcube::write_log($this->name,'oldFlags: '.print_r($flaggedMsgs,true));
452 $fullFlags=array();
453 foreach ($flaggedMsgs as $uid => $flags) {
454 foreach ($flags as $flag => $x) {
455 $pos=strpos(strtolower($flag),$toggle_label);
456 rcube::write_log($this->name,"flag?: $flag $toggle_label $pos");
457 if ($pos>-1 && $pos<2 && !in_array($flag,$fullFlags)) {
458 $fullFlags[]=$flag;
459 }
460 }
461 }
462 if (count($fullFlags)==0) {
463 rcube::write_log('errors',"no full flags for $toggle_label in ".print_r($flaggedMsgs,true));
464 $imap->set_flag($unflag_uids, "UN$toggle_label", $mbox);
465 }
466 else {
467 foreach ($fullFlags as $flag) {
468 rcube::write_log($this->name,"UNsetting $flag in $mbox for ".join(',',$unflag_uids));
469 $imap->set_flag($unflag_uids, "UN$flag", $mbox);
470 }
471 }
472 }
437 $this->api->output->send(); 473 $this->api->output->send();
438 } 474 }
439 475
440 function tb_label_popup() 476 function tb_label_popup()
441 { 477 {