Mercurial > hg > rc1
diff plugins/thunderbird_labels/thunderbird_labels.php @ 0:1e000243b222
vanilla 1.3.3 distro, I hope
author | Charlie Root |
---|---|
date | Thu, 04 Jan 2018 15:50:29 -0500 |
parents | |
children | 5821049f1791 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/thunderbird_labels/thunderbird_labels.php Thu Jan 04 15:50:29 2018 -0500 @@ -0,0 +1,381 @@ +<?php +/** + * Thunderbird Labels Plugin for Roundcube Webmail + * + * Plugin to show the 5 Message Labels Thunderbird Email-Client provides for IMAP + * + * @version $Revision$ + * @author Michael Kefeder + * @url http://code.google.com/p/rcmail-thunderbird-labels/ + */ +class thunderbird_labels extends rcube_plugin +{ + public $task = 'mail|settings'; + private $rc; + private $map; + + function init() + { + $this->rc = rcmail::get_instance(); + $this->load_config(); + $this->add_texts('localization/', false); + + $this->setCustomLabels(); + + if ($this->rc->task == 'mail') + { + # -- disable plugin when printing message + if ($this->rc->action == 'print') + return; + + if (!$this->rc->config->get('tb_label_enable')) + // disable plugin according to prefs + return; + + // pass 'tb_label_enable_shortcuts' and 'tb_label_style' prefs to JS + $this->rc->output->set_env('tb_label_enable_shortcuts', $this->rc->config->get('tb_label_enable_shortcuts')); + $this->rc->output->set_env('tb_label_style', $this->rc->config->get('tb_label_style')); + + $this->include_script('tb_label.js'); + $this->add_hook('messages_list', array($this, 'read_flags')); + $this->add_hook('message_load', array($this, 'read_single_flags')); + $this->add_hook('template_object_messageheaders', array($this, 'color_headers')); + $this->add_hook('render_page', array($this, 'tb_label_popup')); + $this->include_stylesheet($this->local_skin_path() . '/tb_label.css'); + + $this->name = get_class($this); + # -- additional TB flags + $this->add_tb_flags = array( + 'LABEL1' => '$Label1', + 'LABEL2' => '$Label2', + 'LABEL3' => '$Label3', + 'LABEL4' => '$Label4', + 'LABEL5' => '$Label5', + ); + $this->message_tb_labels = array(); + + $this->add_button( + array( + 'command' => 'plugin.thunderbird_labels.rcm_tb_label_submenu', + 'id' => 'tb_label_popuplink', + 'title' => 'tb_label_button_title', + 'domain' => $this->ID, + 'type' => 'link', + 'content' => $this->gettext('tb_label_button_label'), + 'class' => 'button buttonPas disabled', + 'classact' => 'button', + ), + 'toolbar' + ); + + // JS function "set_flags" => PHP function "set_flags" + $this->register_action('plugin.thunderbird_labels.set_flags', array($this, 'set_flags')); + + + if (method_exists($this, 'require_plugin') + && in_array('contextmenu', $this->rc->config->get('plugins')) + && $this->require_plugin('contextmenu') + && $this->rc->config->get('tb_label_enable_contextmenu')) + { + if ($this->rc->action == '') + $this->add_hook('render_mailboxlist', array($this, 'show_tb_label_contextmenu')); + } + } + elseif ($this->rc->task == 'settings') + { + $this->include_stylesheet($this->local_skin_path() . '/tb_label.css'); + $this->add_hook('preferences_list', array($this, 'prefs_list')); + $this->add_hook('preferences_sections_list', array($this, 'prefs_section')); + $this->add_hook('preferences_save', array($this, 'prefs_save')); + } + } + + private function setCustomLabels() + { + $c = $this->rc->config->get('tb_label_custom_labels'); + if (empty($c)) + { + // if no user specific labels, use localized strings by default + $this->rc->config->set('tb_label_custom_labels', array( + 0 => $this->getText('label0'), + 1 => $this->getText('label1'), + 2 => $this->getText('label2'), + 3 => $this->getText('label3'), + 4 => $this->getText('label4'), + 5 => $this->getText('label5') + )); + } + // pass label strings to JS + $this->rc->output->set_env('tb_label_custom_labels', $this->rc->config->get('tb_label_custom_labels')); + } + + // create a section for the tb-labels Settings + public function prefs_section($args) + { + $args['list']['thunderbird_labels'] = array( + 'id' => 'thunderbird_labels', + 'section' => rcube::Q($this->gettext('tb_label_options')) + ); + + return $args; + } + + // display thunderbird-labels prefs in Roundcube Settings + public function prefs_list($args) + { + if ($args['section'] != 'thunderbird_labels') + return $args; + + $this->load_config(); + $dont_override = (array) $this->rc->config->get('dont_override', array()); + + $args['blocks']['tb_label'] = array(); + $args['blocks']['tb_label']['name'] = $this->gettext('tb_label_options'); + + $key = 'tb_label_enable'; + if (!in_array($key, $dont_override)) + { + $input = new html_checkbox(array( + 'name' => $key, + 'id' => $key, + 'value' => 1 + )); + $content = $input->show($this->rc->config->get($key)); + $args['blocks']['tb_label']['options'][$key] = array( + 'title' => $this->gettext('tb_label_enable_option'), + 'content' => $content + ); + } + + $key = 'tb_label_enable_shortcuts'; + if (!in_array($key, $dont_override)) + { + $input = new html_checkbox(array( + 'name' => $key, + 'id' => $key, + 'value' => 1 + )); + $content = $input->show($this->rc->config->get($key)); + $args['blocks']['tb_label']['options'][$key] = array( + 'title' => $this->gettext('tb_label_enable_shortcuts_option'), + 'content' => $content + ); + } + + $key = 'tb_label_style'; + if (!in_array($key, $dont_override)) + { + $select = new html_select(array( + 'name' => $key, + 'id' => $key + )); + $select->add(array($this->gettext('thunderbird'), $this->gettext('bullets')), array('thunderbird', 'bullets')); + $content = $select->show($this->rc->config->get($key)); + + $args['blocks']['tb_label']['options'][$key] = array( + 'title' => $this->gettext('tb_label_style_option'), + 'content' => $content + ); + } + + $key = 'tb_label_custom_labels'; + if (!in_array($key, $dont_override) + && $this->rc->config->get('tb_label_modify_labels')) + { + $old = $this->rc->config->get($key); + for($i=1; $i<=5; $i++) + { + $input = new html_inputfield(array( + 'name' => $key.$i, + 'id' => $key.$i, + 'type' => 'text', + 'autocomplete' => 'off', + 'value' => $old[$i])); + + $args['blocks']['tb_label']['options'][$key.$i] = array( + 'title' => $this->gettext('tb_label_label')." ".$i, + 'content' => $input->show() + ); + } + } + + return $args; + } + + // save prefs after modified in UI + public function prefs_save($args) + { + if ($args['section'] != 'thunderbird_labels') + return $args; + + + $this->load_config(); + $dont_override = (array) $this->rc->config->get('dont_override', array()); + + if (!in_array('tb_label_enable', $dont_override)) + $args['prefs']['tb_label_enable'] = rcube_utils::get_input_value('tb_label_enable', rcube_utils::INPUT_POST) ? true : false; + + if (!in_array('tb_label_enable_shortcuts', $dont_override)) + $args['prefs']['tb_label_enable_shortcuts'] = rcube_utils::get_input_value('tb_label_enable_shortcuts', rcube_utils::INPUT_POST) ? true : false; + + if (!in_array('tb_label_style', $dont_override)) + $args['prefs']['tb_label_style'] = rcube_utils::get_input_value('tb_label_style', rcube_utils::INPUT_POST); + + if (!in_array('tb_label_custom_labels', $dont_override) + && $this->rc->config->get('tb_label_modify_labels')) + { + $args['prefs']['tb_label_custom_labels'] = array( + 0 => $this->gettext('label0'), + 1 => rcube_utils::get_input_value('tb_label_custom_labels1', rcube_utils::INPUT_POST), + 2 => rcube_utils::get_input_value('tb_label_custom_labels2', rcube_utils::INPUT_POST), + 3 => rcube_utils::get_input_value('tb_label_custom_labels3', rcube_utils::INPUT_POST), + 4 => rcube_utils::get_input_value('tb_label_custom_labels4', rcube_utils::INPUT_POST), + 5 => rcube_utils::get_input_value('tb_label_custom_labels5', rcube_utils::INPUT_POST) + ); + } + + return $args; + } + + public function show_tb_label_contextmenu($args) + { + #$this->api->output->add_label('copymessage.copyingmessage'); + + $li = html::tag('li', + array('class' => 'submenu'), + '<span>'.rcube::Q($this->gettext('tb_label_contextmenu_title')).'</span>' . $this->_gen_label_submenu($args, 'tb_label_ctxm_submenu')); + $out .= html::tag('ul', array('id' => 'tb_label_ctxm_mainmenu'), $li); + $this->api->output->add_footer(html::div(array('style' => 'display: none;'), $out)); + } + + private function _gen_label_submenu($args, $id) + { + $out = ''; + $custom_labels = $this->rc->config->get('tb_label_custom_labels'); + for ($i = 0; $i < 6; $i++) + { + $separator = ($i == 0)? ' separator_below' :''; + $out .= '<li class="label'.$i.$separator. + ' ctxm_tb_label"><a href="#ctxm_tb_label" class="active" onclick="rcmail_ctxm_label_set('.$i.')"><span>'. + $i.' '.$custom_labels[$i]. + '</span></a></li>'; + } + $out = html::tag('ul', array('class' => 'popupmenu toolbarmenu folders', 'id' => $id), $out); + return $out; + } + + public function read_single_flags($args) + { + #rcube::write_log($this->name, print_r(($args['object']), true)); + if (!isset($args['object'])) { + return; + } + + if (is_array($args['object']->headers->flags)) + { + $this->message_tb_labels = array(); + foreach ($args['object']->headers->flags as $flagname => $flagvalue) + { + $flag = is_numeric("$flagvalue")? $flagname:$flagvalue;// for compatibility with < 0.5.4 + $flag = strtolower($flag); + if (preg_match('/^\$?label/', $flag)) + { + $flag_no = preg_replace('/^\$?label/', '', $flag); + #rcube::write_log($this->name, "Single message Flag: ".$flag." Flag_no:".$flag_no); + $this->message_tb_labels[] = (int)$flag_no; + } + } + } + # -- no return value for this hook + } + + /** + * Writes labelnumbers for single message display + * Coloring of Message header table happens via Javascript + */ + public function color_headers($p) + { + #rcube::write_log($this->name, print_r($p, true)); + # -- always write array, even when empty + $p['content'] .= '<script type="text/javascript"> + var tb_labels_for_message = ['.join(',', $this->message_tb_labels).']; + </script>'; + return $p; + } + + public function read_flags($args) + { + #rcube::write_log($this->name, print_r($args, true)); + // add color information for all messages + // dont loop over all messages if we dont have any highlights or no msgs + if (!isset($args['messages']) or !is_array($args['messages'])) { + return $args; + } + + // loop over all messages and add $LabelX info to the extra_flags + foreach($args['messages'] as $message) + { + #rcube::write_log($this->name, print_r($message->flags, true)); + $message->list_flags['extra_flags']['tb_labels'] = array(); # always set extra_flags, needed for javascript later! + if (is_array($message->flags)) + foreach ($message->flags as $flagname => $flagvalue) + { + $flag = is_numeric("$flagvalue")? $flagname:$flagvalue;// for compatibility with < 0.5.4 + $flag = strtolower($flag); + if (preg_match('/^\$?label/', $flag)) + { + $flag_no = preg_replace('/^\$?label/', '', $flag); + #rcube::write_log($this->name, "Flag:".$flag." Flag_no:".$flag_no); + $message->list_flags['extra_flags']['tb_labels'][] = (int)$flag_no; + } + } + } + return($args); + } + + // set flags in IMAP server + function set_flags() + { + #rcube::write_log($this->name, print_r($_GET, true)); + + $imap = $this->rc->imap; + $cbox = rcube_utils::get_input_value('_cur', rcube_utils::INPUT_GET); + $mbox = rcube_utils::get_input_value('_mbox', rcube_utils::INPUT_GET); + $toggle_label = rcube_utils::get_input_value('_toggle_label', rcube_utils::INPUT_GET); + $flag_uids = rcube_utils::get_input_value('_flag_uids', rcube_utils::INPUT_GET); + $flag_uids = explode(',', $flag_uids); + $unflag_uids = rcube_utils::get_input_value('_unflag_uids', rcube_utils::INPUT_GET); + $unflag_uids = explode(',', $unflag_uids); + + $imap->conn->flags = array_merge($imap->conn->flags, $this->add_tb_flags); + + #rcube::write_log($this->name, print_r($flag_uids, true)); + #rcube::write_log($this->name, print_r($unflag_uids, true)); + + if (!is_array($unflag_uids) + || !is_array($flag_uids)) + return false; + + $imap->set_flag($flag_uids, $toggle_label, $mbox); + $imap->set_flag($unflag_uids, "UN$toggle_label", $mbox); + + $this->api->output->send(); + } + + function tb_label_popup() + { + $custom_labels = $this->rc->config->get('tb_label_custom_labels'); + $out = '<div id="tb_label_popup" class="popupmenu"> + <ul class="toolbarmenu">'; + for ($i = 0; $i < 6; $i++) + { + $separator = ($i == 0)? ' separator_below' :''; + $out .= '<li class="label'.$i.$separator.'"><a href="#" class="active">'.$i.' '.$custom_labels[$i].'</a></li>'; + } + $out .= '</ul> + </div>'; + $this->rc->output->add_gui_object('tb_label_popup_obj', 'tb_label_popup'); + $this->rc->output->add_footer($out); + } +} +