diff options
Diffstat (limited to 'skins/larry')
-rw-r--r-- | skins/larry/addressbook.css | 31 | ||||
-rw-r--r-- | skins/larry/iehacks.css | 7 | ||||
-rw-r--r-- | skins/larry/images/buttons.gif | bin | 13054 -> 14997 bytes | |||
-rw-r--r-- | skins/larry/images/buttons.png | bin | 36693 -> 37956 bytes | |||
-rw-r--r-- | skins/larry/includes/footer.html | 12 | ||||
-rw-r--r-- | skins/larry/includes/header.html | 6 | ||||
-rw-r--r-- | skins/larry/mail.css | 126 | ||||
-rw-r--r-- | skins/larry/print.css | 25 | ||||
-rw-r--r-- | skins/larry/styles.css | 113 | ||||
-rw-r--r-- | skins/larry/svggradients.css | 7 | ||||
-rw-r--r-- | skins/larry/templates/addressbook.html | 2 | ||||
-rw-r--r-- | skins/larry/templates/error.html | 7 | ||||
-rw-r--r-- | skins/larry/templates/importcontacts.html | 9 | ||||
-rw-r--r-- | skins/larry/templates/mail.html | 13 | ||||
-rw-r--r-- | skins/larry/templates/message.html | 27 | ||||
-rw-r--r-- | skins/larry/templates/messageerror.html | 2 | ||||
-rw-r--r-- | skins/larry/templates/messagepreview.html | 19 | ||||
-rw-r--r-- | skins/larry/ui.js | 164 |
18 files changed, 461 insertions, 109 deletions
diff --git a/skins/larry/addressbook.css b/skins/larry/addressbook.css index 54fabfa8b..ff3951497 100644 --- a/skins/larry/addressbook.css +++ b/skins/larry/addressbook.css @@ -83,10 +83,23 @@ background-position: 6px -766px; } -#directorylist li.addressbook.selected a { +#directorylist li.addressbook.selected > a { background-position: 6px -791px; } +#directorylist li.addressbook ul li:last-child { + border-bottom: 0; +} + +#directorylist li.addressbook ul.groups { + margin: 0; + padding: 0; +} + +#directorylist li.addressbook ul.groups li { + width: 100%; +} + #directorylist li.contactgroup a { padding-left: 62px; background-position: 32px -1555px; @@ -112,6 +125,12 @@ margin-left: 8px; } +#directorylist li.addressbook div.collapsed, +#directorylist li.addressbook div.expanded { + top: 15px; + left: 20px; +} + #contacts-table .contact td.name { background-position: 6px -1603px; } @@ -317,3 +336,13 @@ a.deletebutton { text-indent: -5000px; background: url(images/buttons.png) -7px -377px no-repeat; } + +#import-box { + position: absolute; + bottom: 28px; + top: 34px; + left: 0; + right: 0; + overflow: auto; + padding: 10px; +} diff --git a/skins/larry/iehacks.css b/skins/larry/iehacks.css index 871cce4fd..960ce7648 100644 --- a/skins/larry/iehacks.css +++ b/skins/larry/iehacks.css @@ -29,7 +29,8 @@ input.button.mainaction:active { filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#2a2e31', endColorstr='#505050', GradientType=0); } -a.button { +a.button, +.buttongroup { filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f9f9f9', endColorstr='#e6e6e6', GradientType=0); } @@ -47,6 +48,10 @@ input.button:active { filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#bababa', endColorstr='#d8d8d8', GradientType=0); } +.buttongroup a.button.selected { + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#909090', endColorstr='#858585', GradientType=0); +} + #message.statusbar { filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eaeaea', endColorstr='#c8c8c8', GradientType=0); } diff --git a/skins/larry/images/buttons.gif b/skins/larry/images/buttons.gif Binary files differindex d8a33d6b2..8a4a78ee4 100644 --- a/skins/larry/images/buttons.gif +++ b/skins/larry/images/buttons.gif diff --git a/skins/larry/images/buttons.png b/skins/larry/images/buttons.png Binary files differindex 4438d9cbc..54bee0156 100644 --- a/skins/larry/images/buttons.png +++ b/skins/larry/images/buttons.png diff --git a/skins/larry/includes/footer.html b/skins/larry/includes/footer.html index ee93fcf57..a4fa69296 100644 --- a/skins/larry/includes/footer.html +++ b/skins/larry/includes/footer.html @@ -8,4 +8,16 @@ $(document).ready(function(){ }); </script> +<!--[if lte IE 8]> +<script type="text/javascript"> + +// fix missing :last-child selectors +$(document).ready(function(){ + $('ul.treelist ul').each(function(i,ul){ + $('li:last-child', ul).css('border-bottom', 0); + }); +}); + +</script> +<![endif]--> diff --git a/skins/larry/includes/header.html b/skins/larry/includes/header.html index 5a30020f3..f2efb8e06 100644 --- a/skins/larry/includes/header.html +++ b/skins/larry/includes/header.html @@ -10,16 +10,16 @@ <roundcube:container name="topline-center" id="topline-center" /> <div class="topright"> <roundcube:container name="topline-right" id="topline-right" /> - <roundcube:if condition="!env:extwin" /> + <roundcube:if condition="!env:extwin && !env:framed" /> <span class="username"><roundcube:object name="username" /></span> <roundcube:button command="logout" label="logout" class="button-logout" /> - <roundcube:else /> + <roundcube:elseif condition="env:extwin" /> <roundcube:button command="close" label="close" class="closelink" /> <roundcube:endif /> </div> </div> -<roundcube:if condition="!env:extwin" /> +<roundcube:if condition="!env:extwin && !env:framed" /> <div id="topnav"> <div id="taskbar" class="topright"> <roundcube:button command="mail" label="mail" class="button-mail" classSel="button-mail button-selected" innerClass="button-inner" /> diff --git a/skins/larry/mail.css b/skins/larry/mail.css index b98a89c8b..fe9e56ea3 100644 --- a/skins/larry/mail.css +++ b/skins/larry/mail.css @@ -2,7 +2,7 @@ * Roundcube webmail styles for the Email section * * Copyright (c) 2012, The Roundcube Dev Team - * Screendesign by FLINT / Büro für Gestaltung, bueroflint.com + * Screendesign by FLINT / Büro für Gestaltung, bueroflint.com * * The contents are subject to the Creative Commons Attribution-ShareAlike * License. It is allowed to copy, distribute, transmit and to adapt the work @@ -54,6 +54,10 @@ border-top: none; } +#composeview-right #mailview-bottom { + border-radius: 0 0 4px 4px; +} + #folderlist-header { width: 100%; height: 12px; @@ -141,7 +145,7 @@ a.iconbutton.threadmode.selected { background-position: 6px 2px; } -#mailboxlist li:first-child { +#mailboxlist > li:first-child { border-radius: 4px 4px 0 0; border-top: 0; } @@ -156,7 +160,7 @@ a.iconbutton.threadmode.selected { background-position: 6px 3px; } -#mailboxlist li.mailbox.unread a { +#mailboxlist li.mailbox.unread > a { padding-right: 36px; } @@ -224,6 +228,17 @@ a.iconbutton.threadmode.selected { color: #017cb4; } +#mailboxlist li.mailbox div.treetoggle { + top: 13px; + left: 19px; +} + +#mailboxlist li.mailbox ul li:last-child { + border-bottom: 0; +} + +/* nested mailboxes */ + #mailboxlist li.mailbox ul { list-style: none; margin: 0; @@ -231,50 +246,57 @@ a.iconbutton.threadmode.selected { border-top: 1px solid #bbd3da; } -#mailboxlist li.mailbox ul li { - padding-left: 26px; -} - #mailboxlist li.mailbox ul li a { - background-position: 6px -93px; + padding-left: 52px; /* 36 + 1 x 16 */ + background-position: 22px -93px; /* 6 + 1 x 16 */ } - #mailboxlist li.mailbox ul li.selected > a { - background-position: 6px -117px; + background-position: 22px -117px; } - -#mailboxlist li.mailbox ul li:last-child { - border-bottom: 0; +#mailboxlist li.mailbox ul li div.treetoggle { + left: 33px; + top: 14px; } -#mailboxlist li.mailbox div.collapsed, -#mailboxlist li.mailbox div.expanded { - position: absolute; - top: 13px; - left: 19px; - width: 13px; - height: 13px; - background: url(images/listicons.png) -3px -144px no-repeat; - cursor: pointer; +#mailboxlist li.mailbox ul ul li.mailbox a { + padding-left: 68px; /* 2x */ + background-position: 38px -93px; } - -#mailboxlist li.mailbox div.expanded { - background-position: -3px -168px; +#mailboxlist li.mailbox ul ul li.selected > a { + background-position: 38px -117px; } - -#mailboxlist li.mailbox.selected > div.collapsed { - background-position: -23px -144px; +#mailboxlist li.mailbox ul ul li div.treetoggle { + left: 48px; } -#mailboxlist li.mailbox.selected > div.expanded { - background-position: -23px -168px; +#mailboxlist li.mailbox ul ul ul li.mailbox a { + padding-left: 84px; /* 3x */ + background-position: 54px -93px; +} +#mailboxlist li.mailbox ul ul ul li.selected > a { + background-position: 54px -117px; +} +#mailboxlist li.mailbox ul ul ul li div.treetoggle { + left: 64px; } +#mailboxlist li.mailbox ul ul ul ul li.mailbox a { + padding-left: 100px; /* 4x */ + background-position: 70px -93px; +} +#mailboxlist li.mailbox ul ul ul ul li.selected > a { + background-position: 70px -117px; +} +#mailboxlist li.mailbox ul ul ul ul li div.treetoggle { + left: 80px; +} -#mailboxlist li.mailbox ul li div.collapsed, -#mailboxlist li.mailbox ul li div.expanded { - left: 43px; - top: 14px; +/* indent folders on levels > 4 */ +#mailboxlist li.mailbox ul ul ul ul ul li { + padding-left: 16px; +} +#mailboxlist li.mailbox ul ul ul ul ul li div.treetoggle { + left: 96px; } #mailboxlist li.mailbox .unreadcount { @@ -438,7 +460,7 @@ a.iconbutton.threadmode.selected { } #messagelist tr td.date { - width: 125px; + width: 135px; } #messagelist tr.message { @@ -850,7 +872,7 @@ div.more-headers { } div.hide-headers { - background-position: center -1589px; + background-position: center -1590px; } #all-headers { @@ -913,6 +935,10 @@ div.hide-headers { border-radius: 3px; } +#messageheader .message-headers { + min-height: 60px; +} + #messageheader #contactphoto { display: block; position: absolute; @@ -932,7 +958,8 @@ div.hide-headers { border-radius: 4px; } -#messageheader #countcontrols { +#messageheader #countcontrols, +#messageheader #formatcontrols { position: absolute; top: 8px; right: 8px; @@ -940,6 +967,11 @@ div.hide-headers { white-space: nowrap; } +#messageheader #formatcontrols { + top: 38px; + right: 8px; +} + #messageheader .pagenav .countdisplay { min-width: 0; padding-right: 0.5em; @@ -1010,8 +1042,8 @@ div.message-partheaders { div.message-part pre, div.message-htmlpart pre, div.message-part div.pre { - margin: 0px; - padding: 0px; + margin: 0; + padding: 0; font-family: monospace; font-size: 12px; white-space: -moz-pre-wrap !important; @@ -1020,7 +1052,7 @@ div.message-part div.pre { } div.message-part span.sig { - color: #666666; + color: #666; } div.message-part blockquote { @@ -1028,7 +1060,7 @@ div.message-part blockquote { border-left: 2px solid blue; border-right: 2px solid blue; background-color: #F6F6F6; - margin: 2px 0px 2px 0px; + margin: 2px 0 2px 0; padding: 1px 8px 1px 10px; } @@ -1039,9 +1071,9 @@ div.message-part blockquote blockquote { } div.message-part blockquote blockquote blockquote { - color: #990000; - border-left: 2px solid #bb0000; - border-right: 2px solid #bb0000; + color: #900; + border-left: 2px solid #b00; + border-right: 2px solid #b00; } div.message-partheaders { @@ -1117,9 +1149,9 @@ div.message-partheaders .headers-table td.header { #messagepartcontainer { position: absolute; top: 60px; - left: 0px; - right: 0px; - bottom: 0px; + left: 0; + right: 0; + bottom: 0; } #messagepartframe { diff --git a/skins/larry/print.css b/skins/larry/print.css index 6481ea9e6..a56c9b938 100644 --- a/skins/larry/print.css +++ b/skins/larry/print.css @@ -123,3 +123,28 @@ div.message-part blockquote blockquote blockquote { border-left: 2px solid #b00; border-right: 2px solid #b00; } + +p.image-attachment { + position: relative; + padding: 1em; + border-top: 1px solid #ccc; +} + +p.image-attachment a.image-link { + float: left; + display: block; + margin-right: 2em; + min-width: 160px; + min-height: 60px; + text-align: center; +} + +p.image-attachment .image-filename { + display: block; + line-height: 1.6em; +} + +p.image-attachment .attachment-links { + display: none; +} + diff --git a/skins/larry/styles.css b/skins/larry/styles.css index f7adeba38..cfbf9ac5f 100644 --- a/skins/larry/styles.css +++ b/skins/larry/styles.css @@ -177,7 +177,8 @@ input.mainaction { /** link buttons **/ -a.button { +a.button, +.buttongroup { display: inline-block; margin: 0 2px; padding: 2px 5px; @@ -198,6 +199,11 @@ a.button { text-decoration: none; } +.buttongroup { + padding: 0; + white-space: nowrap; +} + a.button:focus, input.button:focus { border-color: #4fadd5; @@ -231,6 +237,29 @@ a.button.disabled span.inner { filter: alpha(opacity=40); } +.buttongroup a.button { + margin: 0; + border-width: 0 1px 0 0; + border-radius: 0; + background: none; + box-shadow: none; + -o-box-shadow: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; +} + +.buttongroup a.button.first, +.buttongroup a.button:first-child { + border-radius: 4px 0 0 4px; + border-left: 0; +} + +.buttongroup a.button.last, +.buttongroup a.button:last-child { + border-radius: 0 4px 4px 0; + border-right: 0; +} + a.button.pressed, a.button:active, input.button:active { @@ -266,6 +295,21 @@ input.button:active { background: linear-gradient(top, #bababa 0%, #d8d8d8 100%); } +.buttongroup a.button.selected, +.buttongroup a.button.selected:hover { + background: #8a8a8a; + background: -moz-linear-gradient(top, #909090 0%, #858585 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#909090), color-stop(100%,#858585)); + background: -o-linear-gradient(top, #909090 0%, #858585 100%); + background: -ms-linear-gradient(top, #909090 0%, #858585 100%); + background: linear-gradient(top, #909090 0%, #858585 100%); + -webkit-box-shadow: inset 0 1px 2px 0 #555; + -moz-box-shadow: inset 0 1px 2px 0 #555; + box-shadow: inset 0 1px 2px 0 #555; + border-right-color: #555; + border-left-color: #555; +} + .pagenav a.button { padding: 1px 3px; height: 16px; @@ -273,6 +317,12 @@ input.button:active { margin-bottom: 1px; } +.pagenav .buttongroup a.button, +.pagenav .buttongroup a.button:hover { + padding: 1px 5px; + margin-bottom: 0; +} + .pagenav a.button span.inner { display: inline-block; width: 16px; @@ -318,6 +368,20 @@ input.button:active { background-position: -29px -271px; } +.pagenav a.changeformat.html span.inner { + background-position: -7px -1859px; +} +.pagenav a.changeformat.html.selected span.inner { + background-position: -29px -1859px; +} + +.pagenav a.changeformat.text span.inner { + background-position: -7px -1874px; +} +.pagenav a.changeformat.text.selected span.inner { + background-position: -29px -1874px; +} + .pagenav .countdisplay { display: inline-block; padding: 3px 1em 0 1em; @@ -986,6 +1050,10 @@ ul.listing li { background-color: #d9ecf4; } +ul.listing li ul { + border-top: 1px solid #bbd3da; +} + ul.listing li.droptarget, table.listing tr.droptarget td { background-color: #e8e798; @@ -1002,6 +1070,32 @@ table.layout td { vertical-align: top; } +ul.treelist li { + position: relative; +} + +ul.treelist li div.treetoggle { + position: absolute; + top: 13px; + left: 19px; + width: 13px; + height: 13px; + background: url(images/listicons.png) -3px -144px no-repeat; + cursor: pointer; +} + +ul.treelist li div.treetoggle.expanded { + background-position: -3px -168px; +} + +ul.treelist li.selected > div.collapsed { + background-position: -23px -144px; +} + +ul.treelist li.selected > div.expanded { + background-position: -23px -168px; +} + .listbox .boxfooter { position: absolute; bottom: 0; @@ -1246,6 +1340,10 @@ body.iframe { margin: 38px 0 10px 0; } +body.iframe.error { + background: #ededed; +} + body.iframe.floatingbuttons { margin-bottom: 40px; } @@ -2185,7 +2283,7 @@ ul.toolbarmenu li span.conversation { display: block; color: #333; font-weight: bold; - padding: 8px 4px 3px 30px; + padding: 8px 15px 3px 30px; text-shadow: 0px 1px 1px #fff; text-decoration: none; white-space: nowrap; @@ -2193,6 +2291,17 @@ ul.toolbarmenu li span.conversation { text-overflow: ellipsis; } +.attachmentslist li a.drop { + background: url(images/buttons.png) no-repeat scroll center -1570px; + width: 14px; + height: 20px; + cursor: pointer; + position: absolute; + right: 0; + top: 0; + padding: 0; +} + #compose-attachments ul li { padding-right: 28px; } diff --git a/skins/larry/svggradients.css b/skins/larry/svggradients.css index 2172ac31a..c40d44f4b 100644 --- a/skins/larry/svggradients.css +++ b/skins/larry/svggradients.css @@ -29,7 +29,8 @@ input.button.mainaction:active { background-image: url(svggradient.php?c=2a2e31;505050); } -a.button { +a.button, +.buttongroup { background-image: url(svggradient.php?c=f9f9f9;e6e6e6); } @@ -47,6 +48,10 @@ input.button:active { background-image: url(svggradient.php?c=bababa;d8d8d8); } +.buttongroup a.button.selected { + background-image: url(svggradient.php?c=909090;858585); +} + #message.statusbar { background-image: url(svggradient.php?c=eaeaea;c8c8c8); } diff --git a/skins/larry/templates/addressbook.html b/skins/larry/templates/addressbook.html index 390f8d83b..401640f1f 100644 --- a/skins/larry/templates/addressbook.html +++ b/skins/larry/templates/addressbook.html @@ -30,7 +30,7 @@ <div id="directorylistbox" class="uibox listbox"> <h2 id="directorylist-header" class="boxtitle"><roundcube:label name="groups" /></h2> <div id="directorylist-content" class="scroller withfooter"> - <roundcube:object name="directorylist" id="directorylist" class="listing" /> + <roundcube:object name="directorylist" id="directorylist" class="treelist listing" /> </div> <div id="directorylist-footer" class="boxfooter"> <roundcube:button command="group-create" type="link" title="newcontactgroup" class="listbutton add disabled" classAct="listbutton add" innerClass="inner" content="+" /><roundcube:button name="groupoptions" id="groupoptionslink" type="link" title="moreactions" class="listbutton groupactions" onclick="UI.show_popup('groupoptions');return false" innerClass="inner" content="⚙" /> diff --git a/skins/larry/templates/error.html b/skins/larry/templates/error.html index cd0fc9656..a65733eb0 100644 --- a/skins/larry/templates/error.html +++ b/skins/larry/templates/error.html @@ -4,9 +4,12 @@ <title><roundcube:object name="pagetitle" /></title> <roundcube:include file="/includes/links.html" /> </head> -<body> - +<roundcube:if condition="!env:framed" /> +<body class="error"> <roundcube:include file="/includes/header.html" /> +<roundcube:else /> +<body class="error iframe"> +<roundcube:endif /> <div class="uibox centerbox errorbox"> $__page_content diff --git a/skins/larry/templates/importcontacts.html b/skins/larry/templates/importcontacts.html index 89aea0a2e..d3d0f2b93 100644 --- a/skins/larry/templates/importcontacts.html +++ b/skins/larry/templates/importcontacts.html @@ -14,20 +14,19 @@ <roundcube:button command="list" type="link" class="button back disabled" classAct="button back" classSel="button back pressed" label="back" /> </div> -<div class="offset uibox contentbox"> +<div id="pluginbody" class="offset uibox contentbox"> <h2 class="boxtitle"><roundcube:label name="importcontacts" /></h2> -<div class="boxcontent readtext"> +<div id="import-box" class="boxcontent"> <roundcube:object name="importstep" /> - <br/> - <p class="formbuttons"> <roundcube:object name="importnav" class="button" /> </p> - </div> +<roundcube:object name="message" id="message" class="statusbar" /> + </div> <roundcube:include file="/includes/footer.html" /> diff --git a/skins/larry/templates/mail.html b/skins/larry/templates/mail.html index e145ddff8..575cb792a 100644 --- a/skins/larry/templates/mail.html +++ b/skins/larry/templates/mail.html @@ -30,7 +30,7 @@ <div id="folderlist-header"></div> <div id="mailboxcontainer" class="uibox listbox"> <div id="folderlist-content" class="scroller withfooter"> -<roundcube:object name="mailboxlist" id="mailboxlist" class="listing" folder_filter="mail" unreadwrap="%s" /> +<roundcube:object name="mailboxlist" id="mailboxlist" class="treelist listing" folder_filter="mail" unreadwrap="%s" /> </div> <div id="folderlist-footer" class="boxfooter"> <roundcube:button name="mailboxmenulink" id="mailboxmenulink" type="link" title="folderactions" class="listbutton groupactions" onclick="UI.show_popup('mailboxmenu');return false" innerClass="inner" content="⚙" /> @@ -148,7 +148,8 @@ <div id="mailboxmenu" class="popupmenu"> <ul class="toolbarmenu" id="mailboxoptionsmenu"> <li><roundcube:button command="expunge" type="link" label="compact" classAct="active" /></li> - <li class="separator_below"><roundcube:button command="purge" type="link" label="empty" classAct="active" /></li> + <li><roundcube:button command="purge" type="link" label="empty" classAct="active" /></li> + <li><roundcube:button name="messageimport" type="link" class="active" label="importmessages" onclick="UI.show_uploadform()" /></li> <li><roundcube:button command="folders" task="settings" type="link" label="managefolders" classAct="active" /></li> <roundcube:container name="mailboxoptions" id="mailboxoptionsmenu" /> </ul> @@ -226,6 +227,14 @@ </div> </div> +<div id="upload-dialog" class="propform popupdialog" title="<roundcube:label name='importmessages' />"> + <roundcube:object name="messageimportform" id="uploadform" attachmentFieldSize="40" buttons="no" /> + <div class="formbuttons"> + <roundcube:button command="import-messages" type="input" class="button mainaction" label="upload" /> + <roundcube:button name="close" type="input" class="button" label="cancel" onclick="UI.show_uploadform()" /> + </div> +</div> + <roundcube:include file="/includes/footer.html" /> </body> diff --git a/skins/larry/templates/message.html b/skins/larry/templates/message.html index ae77c0dc0..7ac7e5b55 100644 --- a/skins/larry/templates/message.html +++ b/skins/larry/templates/message.html @@ -28,7 +28,7 @@ <!-- folders list --> <div id="mailboxcontainer" class="uibox listbox"> <div class="scroller"> -<roundcube:object name="mailboxlist" id="mailboxlist" class="listing" folder_filter="mail" unreadwrap="%s" /> +<roundcube:object name="mailboxlist" id="mailboxlist" class="treelist listing" folder_filter="mail" unreadwrap="%s" /> </div> </div> @@ -44,7 +44,9 @@ <span class="moreheaderstoggle"></span> <h2 class="subject"><roundcube:object name="messageHeaders" valueOf="subject" /></h2> +<div class="message-headers"> <roundcube:object name="messageHeaders" class="headers-table" addicon="/images/addcontact.png" exclude="subject" max="20" /> +</div> <roundcube:object name="messageFullHeaders" id="full-headers" /> <!-- record navigation --> @@ -54,6 +56,21 @@ <roundcube:button command="nextmessage" type="link" class="button nextpage disabled" classAct="button nextpage" classSel="button nextpage pressed" innerClass="inner" title="nextmessage" content="&gt;" /> </div> +<roundcube:if condition="env:optional_format=='text'" /> +<div class="pagenav" id="formatcontrols"> + <span class="buttongroup"> + <roundcube:button command="change-format" prop="html" type="link" class="button first changeformat html selected" innerClass="inner" title="changeformathtml" /><roundcube:button command="change-format" prop="text" type="link" class="button last changeformat text" classSel="button last changeformat text pressed" innerClass="inner" title="changeformattext" /> + </span> +</div> +<roundcube:elseif condition="env:optional_format=='html'" /> +<div class="pagenav" id="formatcontrols"> + <span class="buttongroup"> + <roundcube:button command="change-format" prop="html" type="link" class="button first changeformat html" classSel="button first changeformat html pressed" innerClass="inner" title="changeformathtml" /><roundcube:button command="change-format" prop="text" type="link" class="button last changeformat text selected" innerClass="inner" title="changeformattext" /> + </span> +</div> +<roundcube:endif /> + + <div id="contactphoto"><roundcube:object name="contactphoto" /></div> </div> @@ -73,6 +90,14 @@ </div><!-- end mainscreen --> +<div id="attachmentmenu" class="popupmenu"> + <ul class="toolbarmenu"> + <li><roundcube:button command="open-attachment" id="attachmenuopen" type="link" label="open" class="icon" classAct="icon active" innerclass="icon extwin" /></li> + <li><roundcube:button command="download-attachment" id="attachmenudownload" type="link" label="download" class="icon" classAct="icon active" innerclass="icon download" /></li> + <roundcube:container name="attachmentmenu" id="attachmentmenu" /> + </ul> +</div> + <roundcube:include file="/includes/footer.html" /> </body> diff --git a/skins/larry/templates/messageerror.html b/skins/larry/templates/messageerror.html index 3c3c9acdb..a735d47f2 100644 --- a/skins/larry/templates/messageerror.html +++ b/skins/larry/templates/messageerror.html @@ -28,7 +28,7 @@ <!-- folders list --> <div id="mailboxcontainer" class="uibox listbox"> <div class="scroller"> - <roundcube:object name="mailboxlist" id="mailboxlist" class="listing" folder_filter="mail" unreadwrap="%s" /> + <roundcube:object name="mailboxlist" id="mailboxlist" class="treelist listing" folder_filter="mail" unreadwrap="%s" /> </div> </div> diff --git a/skins/larry/templates/messagepreview.html b/skins/larry/templates/messagepreview.html index aef282ac9..f69f65125 100644 --- a/skins/larry/templates/messagepreview.html +++ b/skins/larry/templates/messagepreview.html @@ -30,6 +30,17 @@ <!-- record navigation --> <div id="countcontrols" class="pagenav"> +<roundcube:if condition="env:optional_format=='text'" /> + <span class="buttongroup"> + <roundcube:button command="change-format" prop="html" type="link" class="button first changeformat html selected" innerClass="inner" title="changeformathtml" content="HTML" /><roundcube:button command="change-format" prop="text" type="link" class="button last changeformat text" classSel="button changeformat text pressed" innerClass="inner" title="changeformattext" content="Text" /> + </span> + +<roundcube:elseif condition="env:optional_format=='html'" /> + <span class="buttongroup"> + <roundcube:button command="change-format" prop="html" type="link" class="button first changeformat html" classSel="button changeformat html pressed" innerClass="inner" title="changeformathtml" content="HTML" /><roundcube:button command="change-format" prop="text" type="link" class="button last changeformat text selected" innerClass="inner" title="changeformattext" content="Text" /> + </span> + +<roundcube:endif /> <roundcube:if condition="env:mailbox != config:drafts_mbox"> <roundcube:button command="reply" type="link" class="button reply" classSel="button reply pressed" innerClass="inner" title="replytomessage" content="<-" /> <roundcube:button command="reply-all" type="link" class="button replyall" classSel="button replyall pressed" innerClass="inner" title="replytoallmessage" content="<<-" /> @@ -51,6 +62,14 @@ </div> </div> +<div id="attachmentmenu" class="popupmenu"> + <ul class="toolbarmenu"> + <li><roundcube:button command="open-attachment" id="attachmenuopen" type="link" label="open" class="icon" classAct="icon active" innerclass="icon extwin" /></li> + <li><roundcube:button command="download-attachment" id="attachmenudownload" type="link" label="download" class="icon" classAct="icon active" innerclass="icon download" /></li> + <roundcube:container name="attachmentmenu" id="attachmentmenu" /> + </ul> +</div> + <roundcube:include file="/includes/footer.html" /> </body> diff --git a/skins/larry/ui.js b/skins/larry/ui.js index d2faa3611..ec4d03d00 100644 --- a/skins/larry/ui.js +++ b/skins/larry/ui.js @@ -1,7 +1,7 @@ /** * Roundcube functions for default skin interface * - * Copyright (c) 2011, The Roundcube Dev Team + * Copyright (c) 2013, The Roundcube Dev Team * * The contents are subject to the Creative Commons Attribution-ShareAlike * License. It is allowed to copy, distribute, transmit and to adapt the work @@ -17,6 +17,7 @@ function rcube_mail_ui() var popupconfig = { forwardmenu: { editable:1 }, searchmenu: { editable:1, callback:searchmenu }, + attachmentmenu: { }, listoptions: { editable:1 }, dragmessagemenu: { sticky:1 }, groupmenu: { above:1 }, @@ -37,10 +38,12 @@ function rcube_mail_ui() this.init_tabs = init_tabs; this.show_about = show_about; this.show_popup = show_popup; + this.add_popup = add_popup; this.set_searchmod = set_searchmod; this.show_uploadform = show_uploadform; this.show_header_row = show_header_row; this.hide_header_row = hide_header_row; + this.update_quota = update_quota; // set minimal mode on small screens (don't wait for document.ready) @@ -81,8 +84,8 @@ function rcube_mail_ui() /*** mail task ***/ if (rcmail.env.task == 'mail') { - rcmail.addEventListener('menu-open', show_listoptions); - rcmail.addEventListener('menu-save', save_listoptions); + rcmail.addEventListener('menu-open', menu_open); + rcmail.addEventListener('menu-save', menu_save); rcmail.addEventListener('responseafterlist', function(e){ switch_view_mode(rcmail.env.threading ? 'thread' : 'list') }); var dragmenu = $('#dragmessagemenu'); @@ -92,9 +95,15 @@ function rcube_mail_ui() } if (rcmail.env.action == 'show' || rcmail.env.action == 'preview') { + rcmail.addEventListener('enable-command', enable_command); rcmail.addEventListener('aftershow-headers', function() { layout_messageview(); }); rcmail.addEventListener('afterhide-headers', function() { layout_messageview(); }); - $('#previewheaderstoggle').click(function(e){ toggle_preview_headers(this); return false }); + $('#previewheaderstoggle').click(function(e){ toggle_preview_headers(); return false }); + + // add menu link for each attachment + $('#attachment-list > li').each(function() { + $(this).append($('<a class="drop">').click(function() { attachmentmenu(this); })); + }); } else if (rcmail.env.action == 'compose') { rcmail.addEventListener('aftertoggle-editor', function(){ window.setTimeout(function(){ layout_composeview() }, 200); }); @@ -103,10 +112,14 @@ function rcube_mail_ui() layout_composeview(); // Show input elements with non-empty value - var field, fields = ['cc', 'bcc', 'replyto', 'followupto']; - for (var f=0; f < fields.length; f++) { - if ((field = $('#_'+fields[f])) && field.length && field.val() != '') - show_header_row(fields[f], true); + var f, v, field, fields = ['cc', 'bcc', 'replyto', 'followupto']; + for (f=0; f < fields.length; f++) { + v = fields[f]; field = $('#_'+v); + if (field.length) { + field.on('change', {v: v}, function(e) { if (this.value) show_header_row(e.data.v, true); }); + if (field.val() != '') + show_header_row(v, true); + } } $('#composeoptionstoggle').click(function(){ @@ -117,7 +130,8 @@ function rcube_mail_ui() }).css('cursor', 'pointer'); // toggle compose options if opened in new window and they were visible before - if (window.opener && opener.rcmail && opener.rcmail.env.action == 'compose' && $('#composeoptionstoggle', opener.document).hasClass('remove')) + var opener_rc = rcmail.opener(); + if (opener_rc && opener_rc.env.action == 'compose' && $('#composeoptionstoggle', opener.document).hasClass('remove')) $('#composeoptionstoggle').click(); new rcube_splitter({ id:'composesplitterv', p1:'#composeview-left', p2:'#composeview-right', @@ -137,6 +151,8 @@ function rcube_mail_ui() new rcube_scroller('#folderlist-content', '#folderlist-header', '#folderlist-footer'); rcmail.addEventListener('setquota', update_quota); + rcmail.addEventListener('enable-command', enable_command); + rcmail.addEventListener('afterimport-messages', show_uploadform); } if ($('#mailview-left').length) { @@ -227,7 +243,8 @@ function rcube_mail_ui() parent.css('position', 'relative'); // re-set original select width to fix click action and options width in some browsers - select.width(overlay.width()); + if (!bw.mz) + select.width(overlay.width()); }); $(document.body) @@ -243,8 +260,13 @@ function rcube_mail_ui() $('iframe').load(function(e){ // this = iframe - var doc = this.contentDocument ? this.contentDocument : this.contentWindow ? this.contentWindow.document : null; - $(doc).mouseup(body_mouseup); + try { + var doc = this.contentDocument ? this.contentDocument : this.contentWindow ? this.contentWindow.document : null; + $(doc).mouseup(body_mouseup); + } + catch (e) { + // catch possible "Permission denied" error in IE + }; }) .contents().mouseup(body_mouseup); @@ -280,28 +302,36 @@ function rcube_mail_ui() /** * Update UI on window resize */ - function resize() + function resize(e) { - if (rcmail.env.task == 'mail') { - if (rcmail.env.action == 'show' || rcmail.env.action == 'preview') - layout_messageview(); - else if (rcmail.env.action == 'compose') - layout_composeview(); - } + // resize in intervals to prevent lags and double onresize calls in Chrome (#1489005) + var interval = e ? 10 : 0; + + if (rcmail.resize_timeout) + window.clearTimeout(rcmail.resize_timeout); - // make iframe footer buttons float if scrolling is active - $('body.iframe .footerleft').each(function(){ - var footer = $(this), - body = $(document.body), - floating = footer.hasClass('floating'), - overflow = body.outerHeight(true) > $(window).height(); - - if (overflow != floating) { - var action = overflow ? 'addClass' : 'removeClass'; - footer[action]('floating'); - body[action]('floatingbuttons'); + rcmail.resize_timeout = window.setTimeout(function() { + if (rcmail.env.task == 'mail') { + if (rcmail.env.action == 'show' || rcmail.env.action == 'preview') + layout_messageview(); + else if (rcmail.env.action == 'compose') + layout_composeview(); } - }); + + // make iframe footer buttons float if scrolling is active + $('body.iframe .footerleft').each(function(){ + var footer = $(this), + body = $(document.body), + floating = footer.hasClass('floating'), + overflow = body.outerHeight(true) > $(window).height(); + + if (overflow != floating) { + var action = overflow ? 'addClass' : 'removeClass'; + footer[action]('floating'); + body[action]('floatingbuttons'); + } + }); + }, interval); } /** @@ -414,6 +444,30 @@ function rcube_mail_ui() } + function enable_command(p) + { + if (p.command == 'reply-list') { + var label = rcmail.gettext(p.status ? 'replylist' : 'replyall'); + if (rcmail.env.action == 'preview') + $('a.button.replyall').attr('title', label); + else + $('a.button.reply-all').text(label).attr('title', label); + } + } + + + /** + * Register a popup menu + */ + function add_popup(popup, config) + { + var obj = popups[popup] = $('#'+popup); + obj.appendTo(document.body); // move it to top for proper absolute positioning + + if (obj.length) + popupconfig[popup] = $.extend(popupconfig[popup] || {}, config || {}); + } + /** * Trigger for popup menus */ @@ -421,7 +475,7 @@ function rcube_mail_ui() { // auto-register menu object if (config || !popupconfig[popup]) - popupconfig[popup] = $.extend(popupconfig[popup] || {}, config); + add_popup(popup, config); var visible = show_popupmenu(popup, show), config = popupconfig[popup]; @@ -436,7 +490,7 @@ function rcube_mail_ui() { var obj = popups[popup], config = popupconfig[popup], - ref = $('#'+popup+'link'), + ref = $(config.link ? config.link : '#'+popup+'link'), above = config.above; if (!obj) { @@ -452,7 +506,7 @@ function rcube_mail_ui() else if (config.toggle && show && obj.is(':visible')) show = false; - if (show && ref) { + if (show && ref.length) { var parent = ref.parent(), win = $(window), pos; @@ -546,7 +600,7 @@ function rcube_mail_ui() /** * Switch between short and full headers display in message preview */ - function toggle_preview_headers(button) + function toggle_preview_headers() { $('#preview-shortheaders').toggle(); var full = $('#preview-allheaders').toggle(), @@ -575,6 +629,19 @@ function rcube_mail_ui() /**** popup callbacks ****/ + function menu_open(p) + { + if (p && p.props && p.props.menu == 'attachmentmenu') + show_popupmenu('attachmentmenu'); + else + show_listoptions(); + } + + function menu_save(prop) + { + save_listoptions(); + } + function searchmenu(show) { if (show && rcmail.env.search_mods) { @@ -605,6 +672,21 @@ function rcube_mail_ui() } } + function attachmentmenu(elem) + { + var id = elem.parentNode.id.replace(/^attach/, ''); + + $('#attachmenuopen').unbind('click').attr('onclick', '').click(function(e) { + return rcmail.command('open-attachment', id, this); + }); + + $('#attachmenudownload').unbind('click').attr('onclick', '').click(function() { + rcmail.command('download-attachment', id, this); + }); + + popupconfig.attachmentmenu.link = elem; + rcmail.command('menu-open', {menu: 'attachmentmenu', id: id}); + } function spellmenu(show) { @@ -659,8 +741,6 @@ function rcube_mail_ui() $('input[name="sort_col"][value="'+rcmail.env.sort_col+'"]').prop('checked', true); $('input[name="sort_ord"][value="DESC"]').prop('checked', rcmail.env.sort_order == 'DESC'); $('input[name="sort_ord"][value="ASC"]').prop('checked', rcmail.env.sort_order != 'DESC'); - $('input[name="view"][value="thread"]').prop('checked', rcmail.env.threading ? true : false); - $('input[name="view"][value="list"]').prop('checked', rcmail.env.threading ? false : true); // set checkboxes $('input[name="list_col[]"]').each(function() { @@ -675,7 +755,8 @@ function rcube_mail_ui() close: function() { $dialog.dialog('destroy').hide(); }, - width: 650 + minWidth: 500, + width: $dialog.width()+25 }).show(); } @@ -689,11 +770,10 @@ function rcube_mail_ui() var sort = $('input[name="sort_col"]:checked').val(), ord = $('input[name="sort_ord"]:checked').val(), - thread = $('input[name="view"]: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, rcmail.env.threading); } @@ -940,11 +1020,11 @@ function rcube_scroller(list, top, bottom) this.delay = 500; this.top - .mouseenter(function() { ref.ts = window.setTimeout(function() { ref.scroll('down'); }, ref.delay); }) + .mouseenter(function() { if (rcmail.drag_active) ref.ts = window.setTimeout(function() { ref.scroll('down'); }, ref.delay); }) .mouseout(function() { if (ref.ts) window.clearTimeout(ref.ts); }); this.bottom - .mouseenter(function() { ref.ts = window.setTimeout(function() { ref.scroll('up'); }, ref.delay); }) + .mouseenter(function() { if (rcmail.drag_active) ref.ts = window.setTimeout(function() { ref.scroll('up'); }, ref.delay); }) .mouseout(function() { if (ref.ts) window.clearTimeout(ref.ts); }); this.scroll = function(dir) |