diff --git a/dev/Common/Audio.js b/dev/Common/Audio.js index 1db610e77..fd3b324a1 100644 --- a/dev/Common/Audio.js +++ b/dev/Common/Audio.js @@ -40,7 +40,7 @@ this.objForNotification.muted = false; this.objForNotification.src = Links.sound('new-mail.mp3'); - $(this.obj).on('ended', function () { + $(this.obj).on('ended error', function () { self.stop(); }); diff --git a/dev/Model/Attachment.js b/dev/Model/Attachment.js index a8c4ccce9..3b126565d 100644 --- a/dev/Model/Attachment.js +++ b/dev/Model/Attachment.js @@ -6,6 +6,7 @@ var window = require('window'), _ = require('_'), + ko = require('ko'), Globals = require('Common/Globals'), Utils = require('Common/Utils'), @@ -22,6 +23,8 @@ { AbstractModel.call(this, 'AttachmentModel'); + this.checked = ko.observable(false); + this.mimeType = ''; this.fileName = ''; this.estimatedSize = 0; diff --git a/dev/Styles/Attachmnets.less b/dev/Styles/Attachmnets.less index ab907046b..9c9bf6d49 100644 --- a/dev/Styles/Attachmnets.less +++ b/dev/Styles/Attachmnets.less @@ -1,5 +1,7 @@ .attachmentItem { + position: relative; + display: inline-block; margin: 5px; max-width: 200px; @@ -9,7 +11,8 @@ line-height: 24px; border: 0; background-color: #fff; - box-shadow: 0 1px 5px #ccc; + + box-shadow: 0 1px 4px #ccc; box-shadow: 0 1px 5px rgba(0, 0, 0, 0.2); box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.04), 0 1px 5px rgba(0, 0, 0, 0.1); @@ -19,6 +22,21 @@ opacity: 0.6; } + &.checked { + box-shadow: 0 1px 4px #00a; + box-shadow: 0 1px 5px rgba(0, 0, 255, 0.3); + box-shadow: 0 0 0 1px rgba(0, 0, 255, 0.1), 0 1px 5px rgba(0, 0, 255, 0.2); + } + + .checkedParent { + position: absolute; + top: 0; + right: 0; + padding: 1px 4px 0px 5px; + background: #FAFAFA; + border: 0px solid #CCC; + } + .attachmentSize { font-size: 12px; color: #999; @@ -117,6 +135,12 @@ display: none; } + .attachmentIconParent.hasPreview.isImage { + .iconMain { + display: none; + } + } + .attachmentIconParent.hasPreview:hover { .iconPreview { display: inline-block; diff --git a/dev/Styles/MessageView.less b/dev/Styles/MessageView.less index ecbcc203b..82b7ec020 100644 --- a/dev/Styles/MessageView.less +++ b/dev/Styles/MessageView.less @@ -247,10 +247,35 @@ html.rl-no-preview-pane { padding: 10px 10px 6px 10px; background: #eee; border-bottom: 1px solid #ddd; + position: relative; .attachmentList { margin: 0; } + + .checkedParent { + display: none; + } + + &.selection-mode { + .checkedParent { + display: inline-block; + } + } + + .controls-handle { + position: absolute; + bottom: 5px; + right: 8px; + color: #999; + cursor: pointer; + } + } + + .attachmentsControls { + padding: 7px 5px 7px 14px; + background: #e8e8e8; + border-bottom: 1px solid #ddd; } .rlBlockquoteSwitcher { @@ -339,6 +364,12 @@ html.rl-no-preview-pane { font-family: Monaco, Menlo, Consolas, 'Courier New', monospace; } + pre.b-plain-openpgp { + display: inline-block; + padding: 6px 10px; + border: 1px dashed #666; + } + blockquote { border-left: 2px solid blue; color: blue; diff --git a/dev/Styles/SystemDropDown.less b/dev/Styles/SystemDropDown.less index 8bd018651..32422839f 100644 --- a/dev/Styles/SystemDropDown.less +++ b/dev/Styles/SystemDropDown.less @@ -40,15 +40,35 @@ line-height: 30px; margin-right: 15px; - .playIcon { + .playIcon, .stopIcon { + cursor: pointer; + color: orange; + text-shadow: 0 1px 0 #555; + } + .playIcon { + margin-top: 5px; + } + + .stopIcon { font-size: 30px; line-height: 30px; + margin-right: 10px; + } - cursor: pointer; + .stopIcon { + display: none; + } - color: orange; - text-shadow: 0 1px 0 #fff; + &:hover { + + .playIcon { + display: none; + } + + .stopIcon { + display: inline-block; + } } } @@ -102,4 +122,67 @@ html.ssm-state-mobile .accountPlace { max-width: 150px !important; +} + +@keyframes firstBar { + 0% { height: 30%; } + 50% { height: 100%; } + 100% { height: 30%; } +} + +@keyframes secondBar { + 0% { height: 90%; } + 50% { height: 30%; } + 100% { height: 100%; } +} + +@keyframes thirdBar { + 0% { height: 20%; } + 40% { height: 40%; } + 60% { height: 80%; } + 100% { height: 40%; } +} + +.equaliser { + + width: 20px; + height: 20px; + position: relative; + + .bar { + float:left; + width: 5px; + height: 5px; + background: orange; + position: absolute; + bottom:0; + } + + + .first { + left: 0px; + animation: none; + } + .second { + left: 7px; + animation: none; + } + .third { + left: 14px; + animation: none; + } + + &.animated { + .first { + animation: firstBar 1s infinite; + } + .second { + animation: secondBar 1s infinite; + } + .third { + animation: thirdBar 1s infinite; + } + } + + } \ No newline at end of file diff --git a/dev/View/User/MailBox/MessageView.js b/dev/View/User/MailBox/MessageView.js index 99ab43c27..ce4b99dc7 100644 --- a/dev/View/User/MailBox/MessageView.js +++ b/dev/View/User/MailBox/MessageView.js @@ -79,6 +79,21 @@ this.messageListOfThreadsLoading = ko.observable(false).extend({'rateLimit': 1}); + this.allowAttachmnetControls = ko.observable(false); + this.showAttachmnetControls = ko.observable(false); + + this.showAttachmnetControls.subscribe(function (bV) { + if (this.message()) + { + _.each(this.message().attachments(), function (oItem) { + if (oItem) + { + oItem.checked(!!bV); + } + }); + } + }, this); + this.lastReplyAction_ = ko.observable(''); this.lastReplyAction = ko.computed({ read: this.lastReplyAction_, @@ -407,6 +422,8 @@ if (oMessage) { + this.showAttachmnetControls(false); + if (this.viewHash !== oMessage.hash) { this.scrollMessageToTop(); diff --git a/package.json b/package.json index 26a11b6fc..405ddf101 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "RainLoop", "title": "RainLoop Webmail", "version": "1.8.3", - "release": "297", + "release": "298", "description": "Simple, modern & fast web-based email client", "homepage": "http://rainloop.net", "main": "gulpfile.js", diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Base/HtmlUtils.php b/rainloop/v/0.0.0/app/libraries/MailSo/Base/HtmlUtils.php index 24c91605c..243019693 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Base/HtmlUtils.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Base/HtmlUtils.php @@ -566,15 +566,15 @@ class HtmlUtils if ($oElement->hasAttribute('href')) { $sHref = \trim($oElement->getAttribute('href')); - if (!\preg_match('/^(http[s]?|ftp|skype|mailto):/i', $sHref) || - '//' !== \substr($sHref, 0, 2)) + if (!\preg_match('/^(http[s]?|ftp|skype|mailto):/i', $sHref) && '//' !== \substr($sHref, 0, 2)) { $oElement->setAttribute('data-x-broken-href', $sHref); $oElement->setAttribute('href', 'javascript:false'); } - else if ('a' === $sTagNameLower) + + if ('a' === $sTagNameLower) { - $oElement->setAttribute('rel', 'external'); + $oElement->setAttribute('rel', 'external nofollow'); } } @@ -595,8 +595,7 @@ class HtmlUtils } else { - if (\preg_match('/^http[s]?:\/\//i', $sSrc) || - '//' === \substr($sSrc, 0, 2)) + if (\preg_match('/^http[s]?:\/\//i', $sSrc) || '//' === \substr($sSrc, 0, 2)) { if ($bDoNotReplaceExternalUrl) { diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php index db71ce86b..9e5b785db 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php @@ -1315,6 +1315,7 @@ class Actions 'AllowAppendMessage' => (bool) $oConfig->Get('labs', 'allow_message_append', false), 'MaterialDesign' => (bool) $oConfig->Get('labs', 'use_material_design', true), 'PremType' => $this->PremType(), + 'ZipSupported' => !!\class_exists('ZipArchive'), 'Admin' => array(), 'Capa' => array(), 'Plugins' => array() diff --git a/rainloop/v/0.0.0/app/templates/Views/User/MailMessageView.html b/rainloop/v/0.0.0/app/templates/Views/User/MailMessageView.html index 280bc1ef6..e6d84221d 100644 --- a/rainloop/v/0.0.0/app/templates/Views/User/MailMessageView.html +++ b/rainloop/v/0.0.0/app/templates/Views/User/MailMessageView.html @@ -380,11 +380,11 @@ autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" style="margin-bottom: 0" data-i18n="[placeholder]MESSAGE/PGP_PASSWORD_INPUT_PLACEHOLDER" data-bind="value: viewPgpPassword, onEnter: function() { decryptPgpEncryptedMessage(message()); }" /> -
+
+
+ +
+ +
+
+ +    + Download as zip +      + +    + Save to ownCloud +
diff --git a/rainloop/v/0.0.0/app/templates/Views/User/SystemDropDown.html b/rainloop/v/0.0.0/app/templates/Views/User/SystemDropDown.html index 4ff0d3a50..eaa27def4 100644 --- a/rainloop/v/0.0.0/app/templates/Views/User/SystemDropDown.html +++ b/rainloop/v/0.0.0/app/templates/Views/User/SystemDropDown.html @@ -70,8 +70,14 @@
- +
+
+
+
+
+
+ \ No newline at end of file diff --git a/rainloop/v/0.0.0/static/css/fonts/rainloop.eot b/rainloop/v/0.0.0/static/css/fonts/rainloop.eot index cd7306ceb..cb64d4537 100644 Binary files a/rainloop/v/0.0.0/static/css/fonts/rainloop.eot and b/rainloop/v/0.0.0/static/css/fonts/rainloop.eot differ diff --git a/rainloop/v/0.0.0/static/css/fonts/rainloop.svg b/rainloop/v/0.0.0/static/css/fonts/rainloop.svg index b6bcd088d..3357f3364 100644 --- a/rainloop/v/0.0.0/static/css/fonts/rainloop.svg +++ b/rainloop/v/0.0.0/static/css/fonts/rainloop.svg @@ -119,4 +119,7 @@ + + + diff --git a/rainloop/v/0.0.0/static/css/fonts/rainloop.ttf b/rainloop/v/0.0.0/static/css/fonts/rainloop.ttf index 9caed5066..3cc1d79cc 100644 Binary files a/rainloop/v/0.0.0/static/css/fonts/rainloop.ttf and b/rainloop/v/0.0.0/static/css/fonts/rainloop.ttf differ diff --git a/rainloop/v/0.0.0/static/css/fonts/rainloop.woff b/rainloop/v/0.0.0/static/css/fonts/rainloop.woff index 6a8e134c2..3ff6793d9 100644 Binary files a/rainloop/v/0.0.0/static/css/fonts/rainloop.woff and b/rainloop/v/0.0.0/static/css/fonts/rainloop.woff differ diff --git a/vendors/fontastic/fonts/rainloop.eot b/vendors/fontastic/fonts/rainloop.eot index cd7306ceb..cb64d4537 100644 Binary files a/vendors/fontastic/fonts/rainloop.eot and b/vendors/fontastic/fonts/rainloop.eot differ diff --git a/vendors/fontastic/fonts/rainloop.svg b/vendors/fontastic/fonts/rainloop.svg index b6bcd088d..3357f3364 100644 --- a/vendors/fontastic/fonts/rainloop.svg +++ b/vendors/fontastic/fonts/rainloop.svg @@ -119,4 +119,7 @@ + + + diff --git a/vendors/fontastic/fonts/rainloop.ttf b/vendors/fontastic/fonts/rainloop.ttf index 9caed5066..3cc1d79cc 100644 Binary files a/vendors/fontastic/fonts/rainloop.ttf and b/vendors/fontastic/fonts/rainloop.ttf differ diff --git a/vendors/fontastic/fonts/rainloop.woff b/vendors/fontastic/fonts/rainloop.woff index 6a8e134c2..3ff6793d9 100644 Binary files a/vendors/fontastic/fonts/rainloop.woff and b/vendors/fontastic/fonts/rainloop.woff differ diff --git a/vendors/fontastic/icons-reference.html b/vendors/fontastic/icons-reference.html index efde40ec8..7132f5af8 100644 --- a/vendors/fontastic/icons-reference.html +++ b/vendors/fontastic/icons-reference.html @@ -493,6 +493,18 @@ h2{font-size:18px;padding:0 0 21px 5px;margin:45px 0 0 0;text-transform:uppercas
+
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • Character mapping

      @@ -944,6 +956,18 @@ h2{font-size:18px;padding:0 0 21px 5px;margin:45px 0 0 0;text-transform:uppercas
      +
    • +
      + +
    • +
    • +
      + +
    • +
    • +
      + +