From 6886a4de3f32f4bbbba0b195618f034af0d1dcaf Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Sat, 17 Sep 2016 19:04:33 +0200 Subject: [PATCH 1/7] Widescreen layout aka three column view (#5093) --- config/defaults.inc.php | 9 +- installer/config.php | 12 -- program/include/rcmail_install.php | 2 +- program/js/app.js | 67 +++++++- program/js/list.js | 18 +- program/localization/en_US/labels.inc | 4 + program/steps/mail/func.inc | 66 ++++++-- program/steps/mail/list.inc | 9 +- program/steps/mail/show.inc | 5 - program/steps/settings/func.inc | 18 +- program/steps/settings/save_prefs.inc | 1 - program/steps/utils/save_pref.inc | 1 - skins/classic/common.css | 5 - skins/classic/functions.js | 85 +++++++--- skins/classic/mail.css | 183 +++++++++++++++++--- skins/classic/templates/mail.html | 54 +++--- skins/classic/watermark.html | 16 +- skins/larry/images/listicons.png | Bin 12535 -> 12614 bytes skins/larry/mail.css | 235 +++++++++++++++++++++++--- skins/larry/styles.css | 2 - skins/larry/templates/mail.html | 29 ++-- skins/larry/ui.js | 118 +++++++------ 22 files changed, 673 insertions(+), 266 deletions(-) diff --git a/config/defaults.inc.php b/config/defaults.inc.php index e7d3aa282..52cec4d88 100644 --- a/config/defaults.inc.php +++ b/config/defaults.inc.php @@ -643,7 +643,7 @@ $config['message_sort_col'] = ''; $config['message_sort_order'] = 'DESC'; // These cols are shown in the message list. Available cols are: -// subject, from, to, fromto, cc, replyto, date, size, status, flag, attachment, 'priority' +// subject, from, to, fromto, cc, replyto, date, size, status, flag, attachment, priority $config['list_cols'] = array('subject', 'status', 'fromto', 'date', 'size', 'flag', 'attachment'); // the default locale setting (leave empty for auto-detection) @@ -1067,8 +1067,11 @@ $config['prettydate'] = true; // save compose message every 300 seconds (5min) $config['draft_autosave'] = 300; -// default setting if preview pane is enabled -$config['preview_pane'] = false; +// Interface layout. Default: 'widescreen'. +// 'widescreen' - three columns +// 'desktop' - two columns, preview on bottom +// 'list' - two columns, no preview +$config['layout'] = 'widescreen'; // Mark as read when viewed in preview pane (delay in seconds) // Set to -1 if messages in preview pane should not be marked as read diff --git a/installer/config.php b/installer/config.php index e8ca64751..012d233d7 100644 --- a/installer/config.php +++ b/installer/config.php @@ -11,7 +11,6 @@ $RCI->bool_config_props = array( 'auto_create_user' => 1, 'smtp_log' => 1, 'prefer_html' => 1, - 'preview_pane' => 1, 'debug_level' => 1, ); @@ -598,17 +597,6 @@ echo $check_htmlview->show(intval($RCI->getprop('prefer_html')));
-
preview_pane *
-
- '_preview_pane', 'id' => "cfgprevpane", 'value' => 1)); -echo $check_prevpane->show(intval($RCI->getprop('preview_pane'))); - -?> -
-
-
htmleditor *
diff --git a/program/include/rcmail_install.php b/program/include/rcmail_install.php index 91c550daf..d4a537dee 100644 --- a/program/include/rcmail_install.php +++ b/program/include/rcmail_install.php @@ -33,7 +33,7 @@ class rcmail_install public $bool_config_props = array(); public $local_config = array('db_dsnw', 'default_host', 'support_url', 'des_key', 'plugins'); - public $obsolete_config = array('db_backend', 'db_max_length', 'double_auth'); + public $obsolete_config = array('db_backend', 'db_max_length', 'double_auth', 'preview_pane'); public $replaced_config = array( 'skin_path' => 'skin', 'locale_string' => 'language', diff --git a/program/js/app.js b/program/js/app.js index 238ac279a..2f7a82a0c 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -215,6 +215,12 @@ function rcube_webmail() this.enable_command('list', 'checkmail', 'add-contact', 'search', 'reset-search', 'collapse-folder', 'import-messages', true); if (this.gui_objects.messagelist) { + this.env.widescreen_list_template = [ + {className: 'threads', cells: ['threads']}, + {className: 'subject', cells: ['fromto', 'date', 'status', 'subject']}, + {className: 'flags', cells: ['flag', 'attachment']} + ]; + this.message_list = new rcube_list_widget(this.gui_objects.messagelist, { multiselect:true, multiexpand:true, draggable:true, keyboard:true, column_movable:this.env.col_movable, dblclick_time:this.dblclick_time @@ -2141,7 +2147,7 @@ function rcube_webmail() } expando = '
  
'; - row_class += ' thread' + (message.expanded? ' expanded' : ''); + row_class += ' thread' + (message.expanded ? ' expanded' : ''); } if (flags.unread_children && flags.seen && !message.expanded) @@ -2211,8 +2217,6 @@ function rcube_webmail() else if (c == 'threads') html = expando; else if (c == 'subject') { - if (bw.ie) - col.events.mouseover = function() { rcube_webmail.long_subject_title_ex(this); }; html = tree + cols[c]; } else if (c == 'priority') { @@ -2233,6 +2237,9 @@ function rcube_webmail() row.cols.push(col); } + if (this.env.layout == 'widescreen') + row = this.widescreen_message_row(row, uid, message); + list.insert_row(row, attop); // remove 'old' row @@ -2243,6 +2250,52 @@ function rcube_webmail() } }; + // Converts standard message list record into "widescreen" (3-column) layout + this.widescreen_message_row = function(row, uid, message) + { + var domrow = document.createElement('tr'); + + domrow.id = row.id; + domrow.uid = row.uid; + domrow.className = row.className; + if (row.style) $.extend(domrow.style, row.style); + + $.each(this.env.widescreen_list_template, function() { + if (!ref.env.threading && this.className == 'threads') + return; + + var i, n, e, col, domcol, + domcell = document.createElement('td'); + + if (this.className) domcell.className = this.className; + + for (i=0; this.cells && i < this.cells.length; i++) { + for (n=0; row.cols && n < row.cols.length; n++) { + if (this.cells[i] == row.cols[n].className) { + col = row.cols[n]; + domcol = document.createElement('span'); + domcol.className = this.cells[i]; + if (this.className == 'subject' && domcol.className != 'subject') + domcol.className += ' skip-on-drag'; + if (col.innerHTML) + domcol.innerHTML = col.innerHTML; + domcell.appendChild(domcol); + break; + } + } + } + + domrow.appendChild(domcell); + }); + + if (this.env.threading && message.depth) { + $('td.subject', domrow).attr('style', 'padding-left:' + Math.min(90, message.depth * 15) + 'px !important'); + $('span.branch', domrow).remove(); + } + + return domrow; + }; + this.set_list_sorting = function(sort_col, sort_order) { var sort_old = this.env.sort_col == 'arrival' ? 'date' : this.env.sort_col, @@ -2260,7 +2313,7 @@ function rcube_webmail() this.env.sort_order = sort_order; }; - this.set_list_options = function(cols, sort_col, sort_order, threads) + this.set_list_options = function(cols, sort_col, sort_order, threads, layout) { var update, post_data = {}; @@ -2279,6 +2332,12 @@ function rcube_webmail() post_data._threads = threads; } + if (layout && this.env.layout != layout) { + this.triggerEvent('layout-change', {old_layout: this.env.layout, new_layout: layout}); + update = 1; + this.env.layout = post_data._layout = layout; + } + if (cols && cols.length) { // make sure new columns are added at the end of the list var i, idx, name, newcols = [], oldcols = this.env.listcols; diff --git a/program/js/list.js b/program/js/list.js index ad0ae3dc9..20e85d413 100644 --- a/program/js/list.js +++ b/program/js/list.js @@ -356,20 +356,24 @@ insert_row: function(row, before) // create a real dom node first if (row.nodeName === undefined) { // for performance reasons use DOM instead of jQuery here - var domrow = document.createElement(this.row_tagname()); + var i, e, domcell, col, + domrow = document.createElement(this.row_tagname()); if (row.id) domrow.id = row.id; if (row.uid) domrow.uid = row.uid; if (row.className) domrow.className = row.className; if (row.style) $.extend(domrow.style, row.style); - for (var e, domcell, col, i=0; row.cols && i < row.cols.length; i++) { + for (i=0; row.cols && i < row.cols.length; i++) { col = row.cols[i]; - domcell = document.createElement(this.col_tagname()); - if (col.className) domcell.className = col.className; - if (col.innerHTML) domcell.innerHTML = col.innerHTML; - for (e in col.events) - domcell['on' + e] = col.events[e]; + domcell = col.dom; + if (!domcell) { + domcell = document.createElement(this.col_tagname()); + if (col.className) domcell.className = col.className; + if (col.innerHTML) domcell.innerHTML = col.innerHTML; + for (e in col.events) + domcell['on' + e] = col.events[e]; + } domrow.appendChild(domcell); } diff --git a/program/localization/en_US/labels.inc b/program/localization/en_US/labels.inc index 4309e3736..23933901e 100644 --- a/program/localization/en_US/labels.inc +++ b/program/localization/en_US/labels.inc @@ -199,6 +199,10 @@ $labels['listcolumns'] = 'List columns'; $labels['listsorting'] = 'Sorting column'; $labels['listorder'] = 'Sorting order'; $labels['listmode'] = 'List view mode'; +$labels['layout'] = 'Layout'; +$labels['layoutwidescreen'] = 'Widescreen'; +$labels['layoutdesktop'] = 'Desktop'; +$labels['layoutlist'] = 'List'; $labels['folderactions'] = 'Folder actions...'; $labels['compact'] = 'Compact'; diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc index 7f9fc8317..872c7b7a5 100644 --- a/program/steps/mail/func.inc +++ b/program/steps/mail/func.inc @@ -84,6 +84,7 @@ if (empty($RCMAIL->action) || $RCMAIL->action == 'list') { $OUTPUT->set_env('threads', $threading || $RCMAIL->storage->get_capability('THREAD')); $OUTPUT->set_env('reply_all_mode', (int) $RCMAIL->config->get('reply_all_mode')); $OUTPUT->set_env('preview_pane_mark_read', (int) $RCMAIL->config->get('preview_pane_mark_read')); + $OUTPUT->set_env('layout', $RCMAIL->config->get('layout') ?: 'widescreen'); if ($RCMAIL->storage->get_capability('QUOTA')) { $OUTPUT->set_env('quota', true); @@ -119,6 +120,7 @@ $OUTPUT->add_handlers(array( 'quotadisplay' => array($RCMAIL, 'quota_display'), 'messages' => 'rcmail_message_list', 'messagecountdisplay' => 'rcmail_messagecount_display', + 'listmenulink' => 'rcmail_options_menu_link', 'mailboxname' => 'rcmail_mailbox_name_display', 'messageheaders' => 'rcmail_message_headers', 'messagefullheaders' => 'rcmail_message_full_headers', @@ -357,13 +359,22 @@ function rcmail_message_list($attrib) if (!in_array('threads', $a_show_cols)) array_unshift($a_show_cols, 'threads'); + $listcols = $a_show_cols; + + // Widescreen layout uses hardcoded list of columns + if ($RCMAIL->config->get('layout', 'widescreen') == 'widescreen') { + $a_show_cols = array('threads', 'subject', 'fromto', 'date', 'flag', 'attachment'); + $listcols = $a_show_cols; + array_shift($listcols); + } + // set client env $OUTPUT->add_gui_object('messagelist', $attrib['id']); $OUTPUT->set_env('autoexpand_threads', intval($RCMAIL->config->get('autoexpand_threads'))); $OUTPUT->set_env('sort_col', $_SESSION['sort_col']); $OUTPUT->set_env('sort_order', $_SESSION['sort_order']); $OUTPUT->set_env('messages', array()); - $OUTPUT->set_env('listcols', $a_show_cols); + $OUTPUT->set_env('listcols', $listcols); $OUTPUT->include_script('list.js'); @@ -425,6 +436,11 @@ function rcmail_js_message_list($a_headers, $insert_top=false, $a_show_cols=null $a_show_cols = array_unique($a_show_cols); $_SESSION['list_attrib']['columns'] = $a_show_cols; + // Widescreen layout uses hardcoded list of columns + if ($RCMAIL->config->get('layout', 'widescreen') == 'widescreen') { + $a_show_cols = array('threads', 'subject', 'fromto', 'date', 'flag', 'attachment'); + } + // Plugins may set header's list_cols/list_flags and other rcube_message_header variables // and list columns $plugin = $RCMAIL->plugins->exec_hook('messages_list', @@ -433,6 +449,14 @@ function rcmail_js_message_list($a_headers, $insert_top=false, $a_show_cols=null $a_show_cols = $plugin['cols']; $a_headers = $plugin['messages']; + if ($RCMAIL->config->get('layout', 'widescreen') == 'widescreen') { + if (!$OUTPUT->get_env('threading')) { + if (($idx = array_search('threads', $a_show_cols)) !== false) { + unset($a_show_cols[$idx]); + } + } + } + $thead = $head_replace ? rcmail_message_list_head($_SESSION['list_attrib'], $a_show_cols) : NULL; // get name of smart From/To column in folder context @@ -568,22 +592,7 @@ function rcmail_message_list_head($attrib, $a_show_cols) $a_sort_cols = array('subject', 'date', 'from', 'to', 'fromto', 'size', 'cc'); if (!empty($attrib['optionsmenuicon'])) { - $onclick = 'return ' . rcmail_output::JS_OBJECT_NAME . ".command('menu-open', 'messagelistmenu', this, event)"; - $inner = $RCMAIL->gettext('listoptions'); - if (is_string($attrib['optionsmenuicon']) && $attrib['optionsmenuicon'] != 'true') { - $inner = html::img(array('src' => $RCMAIL->output->abs_url($attrib['optionsmenuicon'], true), 'alt' => $RCMAIL->gettext('listoptions'))); - } - $list_menu = html::a(array( - 'href' => '#list-options', - 'onclick' => $onclick, - 'class' => 'listmenu', - 'id' => 'listmenulink', - 'title' => $RCMAIL->gettext('listoptions'), - 'tabindex' => '0', - ), $inner); - } - else { - $list_menu = ''; + $list_menu = rcmail_options_menu_link($attrib); } $cells = $coltypes = array(); @@ -611,7 +620,7 @@ function rcmail_message_list_head($attrib, $a_show_cols) $col_name = html::span($col, $RCMAIL->gettext('readstatus')); break; case 'threads': - $col_name = $list_menu; + $col_name = (string) $list_menu; break; case 'fromto': $label = $RCMAIL->gettext($smart_col); @@ -648,6 +657,27 @@ function rcmail_message_list_head($attrib, $a_show_cols) return $cells; } +function rcmail_options_menu_link($attrib) +{ + global $RCMAIL; + + $onclick = 'return ' . rcmail_output::JS_OBJECT_NAME . ".command('menu-open', 'messagelistmenu', this, event)"; + $inner = $title = $RCMAIL->gettext('listoptions'); + + if (is_string($attrib['optionsmenuicon']) && $attrib['optionsmenuicon'] != 'true') { + $inner = html::img(array('src' => $RCMAIL->output->abs_url($attrib['optionsmenuicon'], true), 'alt' => $title)); + } + + return html::a(array( + 'href' => '#list-options', + 'onclick' => $onclick, + 'class' => 'listmenu', + 'id' => 'listmenulink', + 'title' => $title, + 'tabindex' => '0', + ), $inner); +} + /** * return an HTML iframe for loading mail content */ diff --git a/program/steps/mail/list.inc b/program/steps/mail/list.inc index a317a83b6..215d09e73 100644 --- a/program/steps/mail/list.inc +++ b/program/steps/mail/list.inc @@ -40,8 +40,15 @@ if ($sort = rcube_utils::get_input_value('_sort', rcube_utils::INPUT_GET)) { } } +// register layout change +if ($layout = rcube_utils::get_input_value('_layout', rcube_utils::INPUT_GET)) { + $OUTPUT->set_env('layout', $layout); + $save_arr['layout'] = $layout; + // force header replace on layout change + $cols = $_SESSION['list_attrib']['columns']; +} // is there a set of columns for this request? -if ($cols = rcube_utils::get_input_value('_cols', rcube_utils::INPUT_GET)) { +else if ($cols = rcube_utils::get_input_value('_cols', rcube_utils::INPUT_GET)) { $_SESSION['list_attrib']['columns'] = explode(',', $cols); if (!in_array('list_cols', $dont_override)) { $save_arr['list_cols'] = explode(',', $cols); diff --git a/program/steps/mail/show.inc b/program/steps/mail/show.inc index e1909a4d9..d6361fdee 100644 --- a/program/steps/mail/show.inc +++ b/program/steps/mail/show.inc @@ -170,11 +170,6 @@ if (!empty($set_seen_flag)) { } } -// Save preview_pane preference, if not set yet (#1490362) -if ($RCMAIL->action == 'preview' && !$RCMAIL->config->get('preview_pane')) { - $RCMAIL->user->save_prefs(array('preview_pane' => true)); -} - exit; diff --git a/program/steps/settings/func.inc b/program/steps/settings/func.inc index f610d2dc6..cd3499772 100644 --- a/program/steps/settings/func.inc +++ b/program/steps/settings/func.inc @@ -408,22 +408,6 @@ function rcmail_user_prefs($current = null) 'advanced' => array('name' => rcube::Q($RCMAIL->gettext('advancedoptions'))), ); - // show config parameter for preview pane - if (!isset($no_override['preview_pane'])) { - if (!$current) { - continue 2; - } - - $field_id = 'rcmfd_preview'; - $input = new html_checkbox(array('name' => '_preview_pane', 'id' => $field_id, 'value' => 1, - 'onchange' => "$('#rcmfd_preview_pane_mark_read').prop('disabled', !this.checked)")); - - $blocks['main']['options']['preview_pane'] = array( - 'title' => html::label($field_id, rcube::Q($RCMAIL->gettext('previewpane'))), - 'content' => $input->show($config['preview_pane']?1:0), - ); - } - // show config parameter for preview pane auto mark as read delay if (!isset($no_override['preview_pane_mark_read'])) { if (!$current) { @@ -435,7 +419,7 @@ function rcmail_user_prefs($current = null) $field_id = 'rcmfd_preview_pane_mark_read'; $select = new html_select(array('name' => '_preview_pane_mark_read', 'id' => $field_id, - 'disabled' => $config['preview_pane']?0:1)); + 'disabled' => $config['layout'] == 'list' ? 1 : 0)); $select->add($RCMAIL->gettext('never'), '-1'); $select->add($RCMAIL->gettext('immediately'), 0); diff --git a/program/steps/settings/save_prefs.inc b/program/steps/settings/save_prefs.inc index a314aaf2b..479fb72ba 100644 --- a/program/steps/settings/save_prefs.inc +++ b/program/steps/settings/save_prefs.inc @@ -47,7 +47,6 @@ case 'general': case 'mailbox': $a_user_prefs = array( - 'preview_pane' => isset($_POST['_preview_pane']), 'preview_pane_mark_read' => isset($_POST['_preview_pane_mark_read']) ? intval($_POST['_preview_pane_mark_read']) : $CONFIG['preview_pane_mark_read'], 'autoexpand_threads' => isset($_POST['_autoexpand_threads']) ? intval($_POST['_autoexpand_threads']) : 0, 'mdn_requests' => isset($_POST['_mdn_requests']) ? intval($_POST['_mdn_requests']) : 0, diff --git a/program/steps/utils/save_pref.inc b/program/steps/utils/save_pref.inc index 35ece103c..165d86c58 100644 --- a/program/steps/utils/save_pref.inc +++ b/program/steps/utils/save_pref.inc @@ -26,7 +26,6 @@ $sessname = rcube_utils::get_input_value('_session', rcube_utils::INPUT_POST); // Whitelisted preferences and session variables, others // can be added by plugins $whitelist = array( - 'preview_pane', 'list_cols', 'collapsed_folders', 'collapsed_abooks', diff --git a/skins/classic/common.css b/skins/classic/common.css index 2773cb100..f96543007 100644 --- a/skins/classic/common.css +++ b/skins/classic/common.css @@ -26,10 +26,6 @@ select, input, textarea, button font-family: inherit; } -html.mozilla select { - padding: 2px 1px; -} - th { font-weight: normal; @@ -453,7 +449,6 @@ body.iframe .boxtitle height: 11px; padding: 0; margin: 1px; - margin-top: 2px; overflow: hidden; background: url(images/pagenav.gif) 0 0 no-repeat transparent; opacity: 0.99; /* this is needed to make buttons appear correctly in Chrome */ diff --git a/skins/classic/functions.js b/skins/classic/functions.js index 2e793394e..df181c730 100644 --- a/skins/classic/functions.js +++ b/skins/classic/functions.js @@ -317,6 +317,11 @@ show_listmenu: function(p) $(this).prop('checked', $.inArray(this.value, rcmail.env.listcols) != -1); }); + $.each(['widescreen', 'desktop', 'list'], function() { + $('input[name="layout"][value="' + this + '"]').prop('checked', rcmail.env.layout == this); + }); + $('#listoptions-columns', $dialog)[rcmail.env.layout == 'widescreen' ? 'hide' : 'show'](); + buttons[rcmail.gettext('save')] = function(e) { $dialog.dialog('close', e); self.save_listmenu(); @@ -354,10 +359,11 @@ save_listmenu: function() var sort = $('input[name="sort_col"]:checked').val(), ord = $('input[name="sort_ord"]:checked').val(), thread = $('input[name="view"]:checked').val(), + layout = $('input[name="layout"]:checked').val(), cols = $('input[name="list_col[]"]:checked') .map(function(){ return this.value; }).get(); - rcmail.set_list_options(cols, sort, ord, thread == 'thread' ? 1 : 0); + rcmail.set_list_options(cols, sort, ord, thread == 'thread' ? 1 : 0, layout); }, spellmenu: function(show) @@ -456,42 +462,61 @@ body_keydown: function(e) } }, -switch_preview_pane: function(elem) +// Mail view layout initialization and change handler +set_layout: function(p) { - var uid, prev_frm = $('#mailpreviewframe'); + var layout = p ? p.new_layout : rcmail.env.layout, + top = $('#mailcontframe'), + bottom = $('#mailpreviewframe'); - if (elem.checked) { - rcmail.env.contentframe = 'messagecontframe'; - if (mailviewsplit.layer) { - mailviewsplit.resize(); - mailviewsplit.layer.elm.style.display = ''; + if (p) + $('#mailrightcontainer').removeClass().addClass(layout); + + if (!this.mailviewsplitv) { + this.mailviewsplitv = new rcube_splitter({id:'mailviewsplitterv', p1: 'mailleftcontainer', p2: 'mailrightcontainer', + orientation: 'v', relative: true, start: 165, callback: rcube_render_mailboxlist }); + this.mailviewsplitv.init(); + } + + $('#mailviewsplitter')[layout == 'desktop' ? 'show' : 'hide'](); + $('#mailviewsplitter2')[layout == 'widescreen' ? 'show' : 'hide'](); + $('#mailpreviewframe')[layout != 'list' ? 'show' : 'hide'](); + rcmail.env.contentframe = layout == 'list' ? null : 'messagecontframe'; + + if (layout == 'widescreen') { + $('#countcontrols').detach().appendTo($('#messagelistheader')); + top.css({height: 'auto', width: 400}); + bottom.css({top: 0, left: 410, height: 'auto'}).show(); + if (!this.mailviewsplit2) { + this.mailviewsplit2 = new rcube_splitter({id:'mailviewsplitter2', p1: 'mailcontframe', p2: 'mailpreviewframe', + orientation: 'v', relative: true, start: 405}); + this.mailviewsplit2.init(); } else - mailviewsplit.init(); - - if (bw.opera) { - $('#messagelistcontainer').css({height: ''}); + this.mailviewsplit2.resize(); + } + else if (layout == 'desktop') { + top.css({height: 200, width: '100%'}); + bottom.css({left: 0, top: 210, height: 'auto'}).show(); + if (!this.mailviewsplit) { + this.mailviewsplit = new rcube_splitter({id:'mailviewsplitter', p1: 'mailcontframe', p2: 'mailpreviewframe', + orientation: 'h', relative: true, start: 205}); + this.mailviewsplit.init(); } - prev_frm.show(); - - if (uid = rcmail.message_list.get_single_selection()) - rcmail.show_message(uid, false, true); + else + this.mailviewsplit.resize(); } - else { - prev_frm.hide(); - $('#mailcontframe').css({height: 'auto', bottom: 0}); - if (bw.opera) - $('#messagelistcontainer').css({height: 'auto'}); - if (mailviewsplit.layer) - mailviewsplit.layer.elm.style.display = 'none'; - - rcmail.env.contentframe = null; - rcmail.show_contentframe(false); + else { // layout == 'list' + top.css({height: 'auto', width: '100%'}); + bottom.hide(); } - rcmail.command('save-pref', {name: 'preview_pane', value: (elem.checked?1:0)}); + if (p && p.old_layout == 'widescreen') { + $('#countcontrols').detach().appendTo($('#messagelistfooter')); + } }, + /* Message composing */ init_compose_form: function() { @@ -1031,7 +1056,11 @@ function rcube_init_mail_ui() setTimeout(function() { rcmail.message_list.resize(); }, 10); }); - if (rcmail.env.action == 'compose') { + if (rcmail.env.action == 'list' || !rcmail.env.action) { + rcmail.addEventListener('layout-change', 'set_layout', rcmail_ui); + rcmail_ui.set_layout(); + } + else if (rcmail.env.action == 'compose') { rcmail_ui.init_compose_form(); rcmail.addEventListener('compose-encrypted', function(e) { $("a.button.encrypt")[(e.active ? 'addClass' : 'removeClass')]('selected'); diff --git a/skins/classic/mail.css b/skins/classic/mail.css index f22623c95..d275c054a 100644 --- a/skins/classic/mail.css +++ b/skins/classic/mail.css @@ -368,11 +368,12 @@ #mailpreviewframe { position: absolute; - width: 100%; + right: 0; top: 205px; bottom: 0px; border: 1px solid #999999; background-color: #F9F9F9; + display: none; } #messagecontframe @@ -570,7 +571,6 @@ table.messagelist width: 100%; display: table; table-layout: fixed; - border-collapse: collapse; border-spacing: 0; z-index: 1; } @@ -668,10 +668,10 @@ table.messagelist.fixedcopy cursor: pointer; } -.messagelist tr > .flag span, -.messagelist tr > .status span, -.messagelist tr > .attachment span, -.messagelist tr > .priority span +.messagelist tr .flag span, +.messagelist tr .status span, +.messagelist tr .attachment span, +.messagelist tr .priority span { display: block; width: 15px; @@ -682,18 +682,18 @@ table.messagelist.fixedcopy .messagelist tr td div.collapsed, .messagelist tr td div.expanded, .messagelist tr > .threads .listmenu, -.messagelist tr > .attachment span.attachment, -.messagelist tr > .attachment span.report, -.messagelist tr > .attachment span.encrypted, +.messagelist tr .attachment span.attachment, +.messagelist tr .attachment span.report, +.messagelist tr .attachment span.encrypted, .messagelist tr > .priority span.priority, .messagelist tr > .priority span.prio1, .messagelist tr > .priority span.prio2, .messagelist tr > .priority span.prio3, .messagelist tr > .priority span.prio4, .messagelist tr > .priority span.prio5, -.messagelist tr > .flag span.flagged, -.messagelist tr > .flag span.unflagged, -.messagelist tr > .flag span.unflagged:hover, +.messagelist tr .flag span.flagged, +.messagelist tr .flag span.unflagged, +.messagelist tr:hover .flag span.unflagged, .messagelist tr > .status span.status, .messagelist tr > .status span.msgicon, .messagelist tr > .status span.deleted, @@ -713,17 +713,17 @@ table.messagelist.fixedcopy background: url(images/messageicons.png) center no-repeat; } -.messagelist tr > .attachment span.attachment +.messagelist tr .attachment span.attachment { background-position: 0 -170px; } -.messagelist tr > .attachment span.report +.messagelist tr .attachment span.report { background-position: 0 -255px; } -.messagelist tr > .attachment span.encrypted +.messagelist tr .attachment span.encrypted { background-position: 0 -418px; } @@ -758,17 +758,18 @@ table.messagelist.fixedcopy background-position: 0 -290px; } -.messagelist tr.flaggedroot td.flag span +.messagelist tr .flag span.flagged { - background-position: 0 -136px; + background-position: 0 -153px; } -.messagelist tr > .flag span.flagged +.messagelist tr:hover .flag span.unflagged { - background-position: 0 -153px; + background-position: 0 -136px; } -.messagelist tr > .flag span.unflagged:hover +.messagelist tr.flaggedroot .flag span, +.messagelist tr.flaggedroot .flag span.unflagged { background-position: 0 -136px; } @@ -796,10 +797,10 @@ table.messagelist.fixedcopy } .messagelist tr > .status span.msgicon, -.messagelist tr > .flag span.unflagged, +.messagelist tr .flag span.unflagged, .messagelist tr > .status span.unreadchildren { - background-position: 0 17px; /* no icon */ + background-position: 0 18px; /* no icon */ } .messagelist tr > .status span.msgicon:hover @@ -928,7 +929,7 @@ table.messagelist.fixedcopy /* because of border-collapse, we make the left border twice what we want it to be - half will be hidden to the left */ .messagelist tbody tr.focused > td:first-child { - border-left: 4px solid #d4d4d4; + border-left: 2px solid #d4d4d4; padding-left: 4px; } @@ -1751,3 +1752,139 @@ input.from_address top: 45px; position: absolute; } + +/**** Styles for widescreen (3-column) view ****/ + +.widescreen #mailview-top { + bottom: 0; + width: 400px; + height: auto; +} + +.widescreen #mailview-bottom { + left: 412px; + top:0; + border: 1px solid #a3a3a3; +} + +#messagelistheader, +.widescreen #messagelistfooter #countcontrols, +.widescreen .messagelist > thead, +.widescreen .messagelist .branch, +.widescreen table.fixedcopy { + display: none; +} + +#messagelistcontainer { + top: 0; +} + +.widescreen #messagelistcontainer { + top: 21px; + overflow-x: hidden; +} + +.widescreen #mailpreviewframe { + top: 0; +} + +.widescreen #messagelistheader { + display: block; + top: 0; + white-space: nowrap; + border-top: 0; + border-bottom: 1px solid #999; + height: 20px; +} + +.widescreen #messagelistheader .listmenu { + display: inline-block; + vertical-align: middle; + line-height: 16px; + width: 15px; + background: url(images/messageicons.png) 4px -236px no-repeat; + cursor: pointer; + overflow: hidden; + text-indent: -5000px; + padding: 2px 4px; +} + +.widescreen .messagelist td { + border-left: 0; + vertical-align: top; + padding: 3px 1px 1px !important; +} + +.widescreen .messagelist td.subject { + width: 99%; + white-space: wrap; + position: relative; /* for span.date positioning in Firefox */ +} + +.widescreen .messagelist td.threads { + width: 14px; + vertical-align: middle; +} + +.widescreen .messagelist td.flags { + width: 20px; +} + +.widescreen .messagelist td.subject span { + line-height: 16px; +} + +.widescreen .messagelist td.subject span.date { + right: 2px; + top: 3px; + position: absolute; + color: #666; +} + +.widescreen .messagelist td.subject span.fromto { + padding-left: 18px; + display: block; + margin-right: 90px; + overflow: hidden; + text-overflow: ellipsis; + color: #666; +} + +.widescreen .messagelist tr.flagged td.subject span.date, +.widescreen .messagelist tr.flagged td.subject span.fromto { + color: #ff0000; +} + +.widescreen .messagelist tr.selected td.subject span.date, +.widescreen .messagelist tr.selected td.subject span.fromto { + color: #fff; +} + +.widescreen .messagelist tr.deleted td.subject span.date, +.widescreen .messagelist tr.deleted td.subject span.fromto { + color: #ccc; +} + +.widescreen .messagelist td.subject span.subject { + clear: both; + display: block; + font-size: 13px; + overflow: hidden; + text-overflow: ellipsis; +} + +.widescreen .messagelist td.flags span { + width: 20px; + height: 18px; + display: block; +} + +.widescreen .messagelist td.flags span.flag { + cursor: pointer; +} + +.widescreen .messagelist tr td.subject span.msgicon, +.widescreen .messagelist tr td.subject span.unreadchildren { + width: 18px; + margin: 0; +} diff --git a/skins/classic/templates/mail.html b/skins/classic/templates/mail.html index c0bb469d9..581519d64 100644 --- a/skins/classic/templates/mail.html +++ b/skins/classic/templates/mail.html @@ -6,9 +6,12 @@ - - - - -
- -
- + +
+ +
\ No newline at end of file diff --git a/skins/larry/images/listicons.png b/skins/larry/images/listicons.png index 0132765d47032314179996568e8559a2b9f067b3..f877ae27b375f920ab58b503b7948e1063c9aa3d 100644 GIT binary patch delta 12484 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 O00009!kg~e}|Nnoev;Y79US3|X#mls~xxmcN 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 A0RR91 diff --git a/skins/larry/mail.css b/skins/larry/mail.css index 23c852a7a..c1f4c8349 100644 --- a/skins/larry/mail.css +++ b/skins/larry/mail.css @@ -66,6 +66,7 @@ html.ie #mailview-top { left: 0; width: 100%; bottom: 0; + outline: none; } #messagelistcontainer { @@ -86,7 +87,7 @@ html>/**/body #messagelist { left: 0; right: 0; height: 22px; - padding: 4px 6px; + padding: 5px 6px 3px; border-top: 1px solid #ddd; background: #ebebeb; background: -moz-linear-gradient(top, #ebebeb 0%, #c6c6c6 100%); @@ -230,20 +231,6 @@ html.mozilla #mailboxlist > li:first-child { top: 0; } -#mailpreviewtoggle { - display: block; - position: absolute; - top: 7px; - right: 4px; - width: 20px; - height: 18px; - background: url(images/buttons.png) -3px -458px no-repeat; -} - -#mailpreviewtoggle.enabled { - background-position: -28px -458px; -} - #s_interval { margin: 3px 8px; } @@ -372,18 +359,18 @@ table.messagelist.fixedcopy { .messagelist tr td div.collapsed, .messagelist tr td div.expanded, .messagelist tr > .threads .listmenu, -.messagelist tr > .attachment span.attachment, -.messagelist tr > .attachment span.report, -.messagelist tr > .attachment span.encrypted, +.messagelist tr .attachment span.attachment, +.messagelist tr .attachment span.report, +.messagelist tr .attachment span.encrypted, .messagelist tr > .priority span.priority, .messagelist tr > .priority span.prio1, .messagelist tr > .priority span.prio2, .messagelist tr > .priority span.prio3, .messagelist tr > .priority span.prio4, .messagelist tr > .priority span.prio5, -.messagelist tr > .flag span.flagged, -.messagelist tr > .flag span.unflagged, -.messagelist tr > .flag span.unflagged:hover, +.messagelist tr .flag span.flagged, +.messagelist tr .flag span.unflagged, +.messagelist tr .flag span.unflagged:hover, .messagelist tr > .status span.status, .messagelist tr > .status span.msgicon, .messagelist tr > .status span.deleted, @@ -403,19 +390,19 @@ table.messagelist.fixedcopy { background: url(images/listicons.png) -100px 0 no-repeat; } -.messagelist tbody tr td.attachment span.attachment { +.messagelist tbody tr .attachment span.attachment { background-position: 0 -996px; } -.messagelist thead tr th.attachment span.attachment { +.messagelist thead tr .attachment span.attachment { background-position: -24px -996px; } -.messagelist tbody tr td.attachment span.report { +.messagelist tbody tr .attachment span.report { background-position: -24px -1116px; } -.messagelist tbody tr td.attachment span.encrypted { +.messagelist tbody tr .attachment span.encrypted { background-position: 0 -2272px; } @@ -440,11 +427,11 @@ table.messagelist.fixedcopy { } /* thread parent message with flagged children */ -.messagelist tbody tr.flaggedroot td.flag span { +.messagelist tbody tr.flaggedroot .flag span { background-position: -23px -1076px; } -.messagelist tbody tr td.flag span.flagged { +.messagelist tbody tr .flag span.flagged { background-position: 0 -1036px; } @@ -456,7 +443,7 @@ table.messagelist.fixedcopy { background-position: -23px -1057px; } -.messagelist tr:hover td.flag span.unflagged { +.messagelist tr:hover .flag span.unflagged { background-position: -23px -1076px; } @@ -1399,3 +1386,195 @@ div.message-partheaders .headers-table td.header { #uploadform form div { margin: 4px 0; } + + +/**** Styles for widescreen (3-column) view ****/ + +.widescreen #mailview-top { + bottom: 0; + width: 400px; + height: auto; +} + +.widescreen #mailview-bottom { + left: 412px; + top:0; + border: 1px solid #a3a3a3; +} + +#messagelistheader, +.widescreen #messagelistfooter #countcontrols, +.widescreen .messagelist > thead, +.widescreen .messagelist .branch, +.widescreen table.fixedcopy { + display: none; +} + +.widescreen #messagelistcontainer { + top: 31px; + overflow-x: hidden; +} + +.widescreen #messagelistheader { + display: block; + position: absolute; + top: 0; + left: 0; + right: 0; + height: 22px; + padding: 4px 6px; + background: #f0f0f0; + background: -moz-linear-gradient(top, #fff 0%, #f0f0f0 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#fff), color-stop(100%,#f0f0f0)); + background: -ms-linear-gradient(top, #fff 0%, #f0f0f0 100%); + background: linear-gradient(to bottom, #fff 0%, #f0f0f0 100%); + border-radius: 4px 4px 0 0; + white-space: nowrap; + border-bottom: 1px solid #dfdfdf; +} + +.widescreen #messagelistheader .listmenu { + margin-right: 10px; + vertical-align: middle; + line-height: 20px; + width: 26px; + padding: 0; + text-indent: -5000px; + overflow: hidden; + display: inline-block; + background: url(images/listicons.png) 0 -2330px no-repeat; +} + +.widescreen #countcontrols { + line-height: 24px; + display: inline; + min-width: 0; +} + +.widescreen #countcontrols span { + padding: 0; +} + +.widescreen .pagenavbuttons { + position: absolute; + top: 3px; + right: 10px; +} + +.widescreen .pagenavbuttons a.button { + background: none; + border: 0; + box-shadow: none; + padding: 2px; + margin: 0; + height: 20px; +} + +.widescreen .pagenavbuttons a.button.pressed { + background: inherit; +} + +.widescreen a.listmenu:focus, +.widescreen .pagenav a.button:focus { + border-color: #4fadd5; + box-shadow: 0 0 4px 2px rgba(71,135,177, 0.8); + outline: none; +} + +.widescreen .messagelist td { + border-left: 0; + vertical-align: top; + padding: 3px 1px !important; +} + +.widescreen .messagelist td.subject { + width: 99%; + white-space: wrap; + position: relative; /* for span.date positioning in Firefox */ +} + +.widescreen .messagelist td.threads { + width: 18px; + vertical-align: middle; +} + +.widescreen .messagelist td.flags { + width: 20px; +} + +.widescreen .messagelist td.subject span { + line-height: 18px; +} + +.widescreen .messagelist td.subject span.date { + right: 2px; + top: 3px; + position: absolute; + color: #666; +} + +.widescreen .messagelist td.subject span.fromto { + padding-left: 22px; + display: block; + margin-right: 90px; + overflow: hidden; + text-overflow: ellipsis; + color: #666; +} + +.widescreen .messagelist tr.flagged td.subject span.date, +.widescreen .messagelist tr.flagged td.subject span.fromto { + color: #ff5c33; +} + +.widescreen .messagelist tr.deleted td.subject span.date, +.widescreen .messagelist tr.deleted td.subject span.fromto { + color: #ccc; +} + +.widescreen .messagelist td.subject span.subject { + clear: both; + display: block; + font-size: 14px; + overflow: hidden; + text-overflow: ellipsis; +} + +.widescreen .messagelist td.flags span { + width: 20px; + height: 18px; + display: block; +} + +.widescreen .messagelist td.flags span.flag { + cursor: pointer; +} + +.widescreen .messagelist tr td.subject span.msgicon, +.widescreen .messagelist tr td.subject span.unreadchildren { + width: 20px; +} + +/* move attachments list to the bottom on narrow mail preview page */ +@media screen and (max-width: 800px) { + #messagepreview .leftcol { + margin-right: 0; + } + #messagepreview .rightcol { + min-height: 0; + width: auto; + right: 0; + position: relative; + border-radius: 0; + border-bottom: 1px solid #dfdfdf; + background-color: #f9f9f9; + padding: 5px; + } + ul.attachmentslist, + ul.attachmentslist > li, + div.rightcol > div > a.button { + vertical-align: middle; + display: inline-block; + margin-top: 0; + } +} diff --git a/skins/larry/styles.css b/skins/larry/styles.css index 4080f3c92..2949066a3 100644 --- a/skins/larry/styles.css +++ b/skins/larry/styles.css @@ -418,9 +418,7 @@ a.button.delete span.icon { .pagenav .pagejumper { text-align: center; - background: #f8f8f8; padding: 3px 0; - background: linear-gradient(to bottom, #dddddd 0%, #f8f8f8 100%); cursor: default; } diff --git a/skins/larry/templates/mail.html b/skins/larry/templates/mail.html index c2e3997fd..9bd0c320b 100644 --- a/skins/larry/templates/mail.html +++ b/skins/larry/templates/mail.html @@ -4,7 +4,7 @@ <roundcube:object name="pagetitle" />