summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG2
-rw-r--r--program/js/app.js62
-rw-r--r--program/js/list.js5
-rw-r--r--program/lib/Roundcube/rcube_utils.php3
-rw-r--r--skins/classic/common.css3
-rw-r--r--skins/larry/images/listicons.pngbin26242 -> 33661 bytes
-rw-r--r--skins/larry/mail.css5
-rw-r--r--skins/larry/styles.css4
-rw-r--r--tests/Framework/Utils.php6
-rw-r--r--tests/src/media.css22
10 files changed, 69 insertions, 43 deletions
diff --git a/CHANGELOG b/CHANGELOG
index db23a851c..fb7fd87da 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,8 @@
CHANGELOG Roundcube Webmail
===========================
+- Added icon for priority column in messages list header (#1489234)
+- New feature "Canned Responses" to save and recall boilerplate text snippets
- Fix HTML part detection when encapsulated inside multipart/signed (#1489372)
- Add spellchecker backend for the After the Deadline service
- Replace markdown-style [1] link indexes in plain text email bodies
diff --git a/program/js/app.js b/program/js/app.js
index ad0015452..bfae977b9 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -862,37 +862,24 @@ function rcube_webmail()
break;
case 'toggle_status':
- if (props && !props._row)
- break;
-
- flag = 'read';
-
- if (props._row.uid) {
- uid = props._row.uid;
+ case 'toggle_flag':
+ flag = command == 'toggle_flag' ? 'flagged' : 'read';
+ if (uid = props) {
+ // toggle flagged/unflagged
+ if (flag == 'flagged') {
+ if (this.message_list.rows[uid].flagged)
+ flag = 'unflagged';
+ }
// toggle read/unread
- if (this.message_list.rows[uid].deleted)
+ else if (this.message_list.rows[uid].deleted)
flag = 'undelete';
else if (!this.message_list.rows[uid].unread)
flag = 'unread';
- }
- this.mark_message(flag, uid);
- break;
-
- case 'toggle_flag':
- if (props && !props._row)
- break;
-
- flag = 'flagged';
-
- if (props._row.uid) {
- uid = props._row.uid;
- // toggle flagged/unflagged
- if (this.message_list.rows[uid].flagged)
- flag = 'unflagged';
+ this.mark_message(flag, uid);
}
- this.mark_message(flag, uid);
+
break;
case 'always-load':
@@ -1752,7 +1739,7 @@ function rcube_webmail()
this.init_message_row = function(row)
{
- var expando, self = this, uid = row.uid,
+ var i, fn = {}, self = this, uid = row.uid,
status_icon = (this.env.status_col != null ? 'status' : 'msg') + 'icn' + row.uid;
if (uid && this.env.messages[uid])
@@ -1760,8 +1747,7 @@ function rcube_webmail()
// set eventhandler to status icon
if (row.icon = document.getElementById(status_icon)) {
- row.icon._row = row.obj;
- row.icon.onclick = function(e) { self.command('toggle_status', this); return rcube_event.cancel(e); };
+ fn.icon = function(e) { self.command('toggle_status', uid); };
}
// save message icon position too
@@ -1770,24 +1756,28 @@ function rcube_webmail()
else
row.msgicon = row.icon;
- // set eventhandler to flag icon, if icon found
+ // set eventhandler to flag icon
if (this.env.flagged_col != null && (row.flagicon = document.getElementById('flagicn'+row.uid))) {
- row.flagicon._row = row.obj;
- row.flagicon.onclick = function(e) { self.command('toggle_flag', this); return rcube_event.cancel(e); };
+ fn.flagicon = function(e) { self.command('toggle_flag', uid); };
}
- if (!row.depth && row.has_children && (expando = document.getElementById('rcmexpando'+row.uid))) {
- row.expando = expando;
- expando.onclick = function(e) { return self.expand_message_row(e, uid); };
+ // set event handler to thread expand/collapse icon
+ if (!row.depth && row.has_children && (row.expando = document.getElementById('rcmexpando'+row.uid))) {
+ fn.expando = function(e) { self.expand_message_row(e, uid); };
+ }
+
+ // attach events
+ $.each(fn, function(i, f) {
+ row[i].onclick = function(e) { f(e); return rcube_event.cancel(e); };
if (bw.touch) {
- expando.addEventListener('touchend', function(e) {
+ row[i].addEventListener('touchend', function(e) {
if (e.changedTouches.length == 1) {
- self.expand_message_row(e, uid);
+ f(e);
return rcube_event.cancel(e);
}
}, false);
}
- }
+ });
this.triggerEvent('insertrow', { uid:uid, row:row });
};
diff --git a/program/js/list.js b/program/js/list.js
index 9f9e193e5..8843cd94a 100644
--- a/program/js/list.js
+++ b/program/js/list.js
@@ -457,10 +457,11 @@ click_row: function(e, id)
var dblclicked = now - this.rows[id].clicked < this.dblclick_time;
// selects/unselects currently selected row
- if (!this.drag_active && !dblclicked)
+ if (!this.drag_active && this.in_selection_before == id && !dblclicked)
this.select_row(id, mod_key, true);
-
+
this.drag_start = false;
+ this.in_selection_before = false;
// row was double clicked
if (this.rowcount && dblclicked && this.in_selection(id)) {
diff --git a/program/lib/Roundcube/rcube_utils.php b/program/lib/Roundcube/rcube_utils.php
index b73bc0812..174fe398c 100644
--- a/program/lib/Roundcube/rcube_utils.php
+++ b/program/lib/Roundcube/rcube_utils.php
@@ -454,6 +454,9 @@ class rcube_utils
// cut out all contents between { and }
while (($pos = strpos($source, '{', $last_pos)) && ($pos2 = strpos($source, '}', $pos))) {
+ $nested = strpos($source, '{', $pos+1);
+ if ($nested && $nested < $pos2) // when dealing with nested blocks (e.g. @media), take the inner one
+ $pos = $nested;
$length = $pos2 - $pos - 1;
$styles = substr($source, $pos+1, $length);
diff --git a/skins/classic/common.css b/skins/classic/common.css
index 7d7c83f39..186be2485 100644
--- a/skins/classic/common.css
+++ b/skins/classic/common.css
@@ -484,7 +484,8 @@ body.iframe .boxtitle
left: 90px;
width: auto;
max-height: 70%;
- overflow: auto;
+ overflow: -moz-scrollbars-vertical;
+ overflow-y: auto;
display: none;
background-color: #fff;
background-color: rgba(255, 255, 255, 0.95);
diff --git a/skins/larry/images/listicons.png b/skins/larry/images/listicons.png
index e2906d957..2527fe10d 100644
--- a/skins/larry/images/listicons.png
+++ b/skins/larry/images/listicons.png
Binary files differ
diff --git a/skins/larry/mail.css b/skins/larry/mail.css
index c5c00554c..0c6166485 100644
--- a/skins/larry/mail.css
+++ b/skins/larry/mail.css
@@ -646,7 +646,7 @@ table.messagelist.fixedcopy {
}
.messagelist thead tr td.flag span.flagged {
- background-position: -24px -1036px;
+ background-position: -22px -1036px;
}
.messagelist tr td.status span.msgicon:hover {
@@ -700,7 +700,7 @@ table.messagelist.fixedcopy {
}
.messagelist thead tr td.status span.status {
- background-position: -24px -1016px;
+ background-position: -23px -1017px;
}
.messagelist tr td div.collapsed {
@@ -772,6 +772,7 @@ table.messagelist.fixedcopy {
width: 100%;
bottom: 27px;
overflow: auto;
+ -webkit-overflow-scrolling: touch;
}
#messageheader,
diff --git a/skins/larry/styles.css b/skins/larry/styles.css
index 2929713e1..0d7a50069 100644
--- a/skins/larry/styles.css
+++ b/skins/larry/styles.css
@@ -1925,7 +1925,8 @@ select.decorated option {
left: 90px;
width: auto;
max-height: 70%;
- overflow: auto;
+ overflow: -moz-scrollbars-vertical;
+ overflow-y: auto;
background: #444;
border: 1px solid #999;
z-index: 240;
@@ -1958,7 +1959,6 @@ ul.toolbarmenu li,
margin: 0;
border-top: 1px solid #5a5a5a;
border-bottom: 1px solid #333;
- padding-right: 10px;
}
.googie_list tr:first-child td,
diff --git a/tests/Framework/Utils.php b/tests/Framework/Utils.php
index 3f7f48c3a..2f4aec32e 100644
--- a/tests/Framework/Utils.php
+++ b/tests/Framework/Utils.php
@@ -171,6 +171,12 @@ class Framework_Utils extends PHPUnit_Framework_TestCase
$this->assertRegExp('/#rcmbody h1\s\{/', $mod, "Prefix tag styles (single)");
$this->assertRegExp('/#rcmbody h1, #rcmbody h2, #rcmbody h3, #rcmbody textarea\s+\{/', $mod, "Prefix tag styles (multiple)");
$this->assertRegExp('/#rcmbody \.noscript\s+\{/', $mod, "Prefix class styles");
+
+ $css = file_get_contents(TESTS_DIR . 'src/media.css');
+ $mod = rcube_utils::mod_css_styles($css, 'rcmbody');
+
+ $this->assertContains('#rcmbody table[class=w600]', $mod, 'Replace styles nested in @media block');
+ $this->assertContains('#rcmbody {width:600px', $mod, 'Replace body selector nested in @media block');
}
/**
diff --git a/tests/src/media.css b/tests/src/media.css
new file mode 100644
index 000000000..24eacc8a1
--- /dev/null
+++ b/tests/src/media.css
@@ -0,0 +1,22 @@
+.ReadMsgBody{width: 100%;}
+.ExternalClass{width: 100%;}
+div, p, a, li, td { -webkit-text-size-adjust:none; }
+@media (max-width: 450px){
+ table[class=w600], td[class=w600], table[class=w540], td[class=w540], img[class=w600]{ width:100% !important; }
+ table[class=w30], td[class=w30]{ width:20px !important; }
+ .pict img {max-width:260px; height:auto !important;}
+}
+@media (min-width: 450px) and (max-width: 600px){
+ table[class=w600], td[class=w600], table[class=w540], td[class=w540], img[class=w600]{ width:100% !important; }
+ table[class=w30], td[class=w30]{ width:20px !important; }
+ .pict img {max-width:410px; height:auto !important;}
+}
+@media (min-width:600px){
+ body {width:600px !important; margin:auto !important;}
+ .pict img {max-width:540px !important; height:auto !important;}
+}
+h1{ font-weight:bold; font-size:14px;color:#3c3c3c ;margin:0px; }
+h2{ color:#8DB048 ; font-size:14px; font-weight:bold; margin-top:20px; border-bottom:1px solid #d6d6d6; padding-bottom:4px; }
+h3{ color:#7e7e7e ; font-size:14px; font-weight:bold; margin:20px 0px 0px 0px; border-bottom:1px solid #d6d6d6; padding-bottom:0px 0px 4px 0px; }
+h4{ color:#8DB048 ; font-size:12px; font-weight:bold; margin:0px; padding:0px; }
+a:visited{cursor:pointer; color:#8DB048; text-decoration:none; border:none;}