diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index c2cda24724..b712239f10 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -10,7 +10,7 @@
1. Install node.js - `https://nodejs.org/download/`
2. Install yarn - `https://yarnpkg.com/en/docs/install`
3. Install gulp - `npm install gulp -g`
-4. Fork snappymail - `https://github.com/the-djmaze/snappymail/issues/new#fork-destination-box`
+4. Fork snappymail from https://github.com/the-djmaze/snappymail
5. Clone snappymail - `git clone git@github.com:USERNAME/snappymail.git snappymail`
6. `cd snappymail`
7. Install install all dependencies - `yarn install`
diff --git a/dev/App/User.js b/dev/App/User.js
index 82f319fa22..2d0802b088 100644
--- a/dev/App/User.js
+++ b/dev/App/User.js
@@ -38,7 +38,6 @@ import {
} from 'Common/Cache';
import {
- userBackground,
mailBox,
root,
openPgpWorkerJs,
@@ -81,6 +80,8 @@ import { ComposePopupView } from 'View/Popup/Compose';
import { FolderSystemPopupView } from 'View/Popup/FolderSystem';
import { AskPopupView } from 'View/Popup/Ask';
+import { timeToNode } from 'Common/Momentor';
+
// Every 5 minutes
const refreshFolders = 300000;
@@ -110,16 +111,6 @@ class AppUser extends AbstractApp {
lastTime = currentTime;
}, interval);
- if (SettingsGet('UserBackgroundHash')) {
- setTimeout(() => {
- const img = userBackground(SettingsGet('UserBackgroundHash'));
- if (img) {
- $htmlCL.add('UserBackground');
- doc.body.style.backgroundImage = "url("+img+")";
- }
- }, 1000);
- }
-
const fn = (ev=>$htmlCL.toggle('rl-ctrl-key-pressed', ev.ctrlKey)).debounce(500);
['keydown','keyup'].forEach(t => doc.addEventListener(t, fn));
@@ -1020,7 +1011,14 @@ class AppUser extends AbstractApp {
this.hideLoading();
}
- setInterval(() => dispatchEvent(new CustomEvent('reload-time')), 60000);
+ setInterval(this.reloadTime(), 60000);
+ }
+
+ reloadTime()
+ {
+ setTimeout(() =>
+ doc.querySelectorAll('[data-bind*="moment:"]').forEach(element => timeToNode(element))
+ , 1)
}
showMessageComposer(params = [])
diff --git a/dev/Common/Links.js b/dev/Common/Links.js
index dc726351f4..b5edfa99f9 100644
--- a/dev/Common/Links.js
+++ b/dev/Common/Links.js
@@ -70,14 +70,6 @@ export function change(email) {
return serverRequest('Change') + encodeURIComponent(email) + '/';
}
-/**
- * @param {string} hash
- * @returns {string}
- */
-export function userBackground(hash) {
- return serverRequestRaw('UserBackground', hash);
-}
-
/**
* @param {string} lang
* @param {boolean} isAdmin
diff --git a/dev/Common/Momentor.js b/dev/Common/Momentor.js
index 6da0a88cea..aa6efed35a 100644
--- a/dev/Common/Momentor.js
+++ b/dev/Common/Momentor.js
@@ -1,4 +1,3 @@
-import { doc } from 'Common/Globals';
import { i18n } from 'Common/Translator';
export function timestampToString(timeStampInUTC, formatStr) {
@@ -53,8 +52,3 @@ export function timeToNode(element, time) {
console.error(e);
}
}
-
-addEventListener('reload-time', () => setTimeout(() =>
- doc.querySelectorAll('[data-bind*="moment:"]').forEach(element => timeToNode(element))
- , 1)
-);
diff --git a/dev/Common/Selector.js b/dev/Common/Selector.js
index 109b301359..bd01d203ad 100644
--- a/dev/Common/Selector.js
+++ b/dev/Common/Selector.js
@@ -1,6 +1,15 @@
import ko from 'ko';
import { isArray } from 'Common/Utils';
+/*
+ oCallbacks:
+ ItemSelect
+ MiddleClick
+ AutoSelect
+ ItemGetUid
+ UpOrDown
+*/
+
export class Selector {
/**
* @param {koProperty} koList
@@ -209,11 +218,9 @@ export class Selector {
itemSelected(item) {
if (this.isListChecked()) {
- if (!item) {
- (this.oCallbacks.onItemSelect || (()=>{}))(item || null);
- }
+ item || (this.oCallbacks.ItemSelect || (()=>{}))(null);
} else if (item) {
- (this.oCallbacks.onItemSelect || (()=>{}))(item);
+ (this.oCallbacks.ItemSelect || (()=>{}))(item);
}
}
@@ -226,20 +233,32 @@ export class Selector {
this.oContentScrollable = contentScrollable;
if (contentScrollable) {
+ let getItem = selector => {
+ let el = event.target.closestWithin(selector, contentScrollable);
+ return el ? ko.dataFor(el) : null;
+ };
+
contentScrollable.addEventListener('click', event => {
let el = event.target.closestWithin(this.sItemSelector, contentScrollable);
el && this.actionClick(ko.dataFor(el), event);
- el = event.target.closestWithin(this.sItemCheckedSelector, contentScrollable);
- if (el) {
- const item = ko.dataFor(el);
+ const item = getItem(this.sItemCheckedSelector);
+ if (item) {
+ if (event.shiftKey) {
+ this.actionClick(item, event);
+ } else {
+ this.focusedItem(item);
+ item.checked(!item.checked());
+ }
+ }
+ });
+
+ contentScrollable.addEventListener('auxclick', event => {
+ if (1 == event.button) {
+ const item = getItem(this.sItemSelector);
if (item) {
- if (event.shiftKey) {
- this.actionClick(item, event);
- } else {
- this.focusedItem(item);
- item.checked(!item.checked());
- }
+ this.focusedItem(item);
+ (this.oCallbacks.MiddleClick || (()=>{}))(item);
}
}
});
@@ -271,7 +290,7 @@ export class Selector {
* @returns {boolean}
*/
autoSelect() {
- return !!(this.oCallbacks.onAutoSelect || (()=>true))();
+ return !!(this.oCallbacks.AutoSelect || (()=>true))();
}
/**
@@ -281,7 +300,7 @@ export class Selector {
getItemUid(item) {
let uid = '';
- const getItemUidCallback = this.oCallbacks.onItemGetUid || null;
+ const getItemUidCallback = this.oCallbacks.ItemGetUid || null;
if (getItemUidCallback && item) {
uid = getItemUidCallback(item);
}
@@ -312,7 +331,7 @@ export class Selector {
} else if (++i < listLen) {
result = list[i];
}
- result || (this.oCallbacks.onUpUpOrDownDown || (()=>true))('ArrowUp' === sEventKey);
+ result || (this.oCallbacks.UpOrDown || (()=>true))('ArrowUp' === sEventKey);
} else if ('Home' === sEventKey) {
result = list[0];
} else if ('End' === sEventKey) {
diff --git a/dev/Common/Translator.js b/dev/Common/Translator.js
index ba97282760..dd2d81bb6f 100644
--- a/dev/Common/Translator.js
+++ b/dev/Common/Translator.js
@@ -140,7 +140,7 @@ export function reload(admin, language) {
// reload the data
if (init()) {
i18nToNodes(doc);
- dispatchEvent(new CustomEvent('reload-time'));
+ admin || rl.app.reloadTime();
trigger(!trigger());
}
script.remove();
diff --git a/dev/Model/Message.js b/dev/Model/Message.js
index a5b4b0dd13..9e31a25157 100644
--- a/dev/Model/Message.js
+++ b/dev/Model/Message.js
@@ -524,13 +524,6 @@ export class MessageModel extends AbstractModel {
}
}
- storeDataInDom() {
- if (this.body) {
- this.body.rlIsHtml = !!this.isHtml();
- this.body.rlHasImages = !!this.hasImages();
- }
- }
-
fetchDataFromDom() {
if (this.body) {
this.isHtml(!!this.body.rlIsHtml);
diff --git a/dev/Settings/User/Themes.js b/dev/Settings/User/Themes.js
index bc5d9ee69c..2a0b825311 100644
--- a/dev/Settings/User/Themes.js
+++ b/dev/Settings/User/Themes.js
@@ -2,9 +2,9 @@ import ko from 'ko';
import { SaveSettingsStep, UploadErrorCode, Capa } from 'Common/Enums';
import { changeTheme, convertThemeName } from 'Common/Utils';
-import { userBackground, themePreviewLink, serverRequest } from 'Common/Links';
+import { themePreviewLink, serverRequest } from 'Common/Links';
import { i18n } from 'Common/Translator';
-import { doc, $htmlCL, Settings } from 'Common/Globals';
+import { Settings } from 'Common/Globals';
import { ThemeStore } from 'Stores/Theme';
@@ -38,16 +38,6 @@ export class ThemesUserSettings {
Theme: value
});
});
-
- this.background.hash.subscribe((value) => {
- if (!value) {
- $htmlCL.remove('UserBackground');
- doc.body.removeAttribute('style');
- } else {
- $htmlCL.add('UserBackground');
- doc.body.style.backgroundImage = "url("+userBackground(value)+")";
- }
- });
}
onBuild() {
diff --git a/dev/Stores/Theme.js b/dev/Stores/Theme.js
index 3a11d63c9a..95f17f13a5 100644
--- a/dev/Stores/Theme.js
+++ b/dev/Stores/Theme.js
@@ -1,6 +1,7 @@
import ko from 'ko';
-import { $htmlCL, leftPanelDisabled, Settings, SettingsGet } from 'Common/Globals';
+import { doc, $htmlCL, leftPanelDisabled, Settings, SettingsGet } from 'Common/Globals';
import { isArray } from 'Common/Utils';
+import { serverRequestRaw } from 'Common/Links';
export const ThemeStore = {
themes: ko.observableArray(),
@@ -25,3 +26,13 @@ export const ThemeStore = {
ThemeStore.theme = ko.observable('').extend({ limitedList: ThemeStore.themes });
ThemeStore.isMobile.subscribe(value => $htmlCL.toggle('rl-mobile', value));
+
+ThemeStore.userBackgroundHash.subscribe(value => {
+ if (value) {
+ $htmlCL.add('UserBackground');
+ doc.body.style.backgroundImage = "url("+serverRequestRaw('UserBackground', value)+")";
+ } else {
+ $htmlCL.remove('UserBackground');
+ doc.body.removeAttribute('style');
+ }
+});
diff --git a/dev/Stores/User/Message.js b/dev/Stores/User/Message.js
index 1a570831e7..f36fe51d61 100644
--- a/dev/Stores/User/Message.js
+++ b/dev/Stores/User/Message.js
@@ -2,7 +2,7 @@ import ko from 'ko';
import { Scope, Notification } from 'Common/Enums';
import { MessageSetAction } from 'Common/EnumsUser';
-import { doc, createElement, elementById } from 'Common/Globals';
+import { doc, $htmlCL, createElement, elementById } from 'Common/Globals';
import { isNonEmptyArray, pInt, pString, addObservablesTo, addSubscribablesTo } from 'Common/Utils';
import { plainToHtml } from 'Common/UtilsUser';
@@ -186,6 +186,8 @@ export const MessageUserStore = new class {
}
},
+ listLoadingAnimation: value => $htmlCL.toggle('list-loading', value),
+
listLoading: value =>
this.listCompleteLoading(value || this.listIsNotCompleted()),
@@ -220,7 +222,7 @@ export const MessageUserStore = new class {
}
});
- this.purgeMessageBodyCacheThrottle = this.purgeMessageBodyCache.throttle(30000);
+ this.purgeMessageBodyCache = this.purgeMessageBodyCache.throttle(30000);
}
purgeMessageBodyCache() {
@@ -428,16 +430,12 @@ export const MessageUserStore = new class {
);
}
- setMessage(data, cached) {
+ setMessage(data, cached, oMessage) {
let isNew = false,
- body = null,
json = data && data.Result,
- id = '',
- plain = '',
- resultHtml = '',
messagesDom = this.messagesBodiesDom(),
selectedMessage = this.selectorMessageSelected(),
- message = this.message();
+ message = oMessage || this.message();
if (
json &&
@@ -447,7 +445,7 @@ export const MessageUserStore = new class {
) {
const threads = message.threads();
if (message.uid !== json.Uid && 1 < threads.length && threads.includes(json.Uid)) {
- message = MessageModel.reviveFromJson(json);
+ message = oMessage ? null : MessageModel.reviveFromJson(json);
if (message) {
message.threads(threads);
MessageFlagsCache.initMessage(message);
@@ -460,7 +458,7 @@ export const MessageUserStore = new class {
}
if (message && message.uid === json.Uid) {
- this.messageError('');
+ oMessage || this.messageError('');
if (cached) {
delete json.IsSeen;
@@ -475,7 +473,8 @@ export const MessageUserStore = new class {
addRequestedMessage(message.folder, message.uid);
if (messagesDom) {
- id = 'rl-mgs-' + message.hash.replace(/[^a-zA-Z0-9]/g, '');
+ let body = null,
+ id = 'rl-mgs-' + message.hash.replace(/[^a-zA-Z0-9]/g, '');
const textBody = elementById(id);
if (textBody) {
@@ -483,7 +482,9 @@ export const MessageUserStore = new class {
message.fetchDataFromDom();
messagesDom.append(textBody);
} else {
- let isHtml = !!json.Html;
+ let isHtml = !!json.Html,
+ plain = '',
+ resultHtml = '
';
if (isHtml) {
resultHtml = json.Html.toString();
if (SettingsUserStore.removeColors()) {
@@ -508,8 +509,6 @@ export const MessageUserStore = new class {
} else {
resultHtml = '' + resultHtml + '
';
}
- } else {
- resultHtml = '' + resultHtml + '
';
}
body = Element.fromHTML(' .rl-view-model {
+ position: fixed;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ z-index: 1100;
+ overflow: auto;
+ background-color: rgba(0,0,0,0.3);
+}
+
+#rl-settings-subscreen {
+ padding: 20px;
+}
+
+/* desktop */
+@media screen and (min-width: 1000px) {
+ .toggleLeft {
+ display: none;
+ }
+}
+
+/* desktop-large */
+@media screen and (min-width: 1401px) {
+ #rl-left {
+ width: @rlLeftWidth + 20;
+ }
+
+ #rl-right {
+ left: @rlLeftWidth + 20;
+ }
+}
+
+/* mobile and tablet */
+@media screen and (max-width: 999px) {
+ #rl-settings-subscreen {
+ padding: 10px;
+ }
+
+ html:not(.rl-left-panel-disabled) #rl-right {
+ right: 5-@rlLeftWidth;
+ }
+
+ html.rl-left-panel-disabled {
+ #rl-left {
+ width: 0 !important;
+ }
+ #rl-right {
+ left: 5px !important;
+ }
+ }
+}
diff --git a/dev/Styles/AdminPackages.less b/dev/Styles/Admin/Packages.less
similarity index 100%
rename from dev/Styles/AdminPackages.less
rename to dev/Styles/Admin/Packages.less
diff --git a/dev/Styles/AdminPlugin.less b/dev/Styles/Admin/Plugin.less
similarity index 93%
rename from dev/Styles/AdminPlugin.less
rename to dev/Styles/Admin/Plugin.less
index 94b45b005e..9cda5bf218 100644
--- a/dev/Styles/AdminPlugin.less
+++ b/dev/Styles/Admin/Plugin.less
@@ -1,7 +1,7 @@
.b-plugin-content {
&.modal {
- width: 660px;
+ max-width: 660px;
}
.modal-body {
diff --git a/dev/Styles/AdminPlugins.less b/dev/Styles/AdminPlugins.less
deleted file mode 100644
index 35e2f916ba..0000000000
--- a/dev/Styles/AdminPlugins.less
+++ /dev/null
@@ -1,24 +0,0 @@
-
-.b-admin-plugins-list-table {
- max-width: 620px; /* span8 */
-
- &.disabled {
- opacity: 0.5;
- }
-
- .disabled {
- opacity: 0.5;
- }
-}
-
-.b-admin-plugin-property {
- .help-block {
- display: block; // account for any element using help-block
- font-style: italic;
- opacity: 0.5;
- margin-bottom: 5px;
- }
- .controls {
- width: 470px;
- }
-}
diff --git a/dev/Styles/FolderClear.less b/dev/Styles/FolderClear.less
deleted file mode 100644
index 8089f0de6c..0000000000
--- a/dev/Styles/FolderClear.less
+++ /dev/null
@@ -1,4 +0,0 @@
-.b-folder-clear-content {
- .modal-header {
- }
-}
diff --git a/dev/Styles/FolderCreate.less b/dev/Styles/FolderCreate.less
deleted file mode 100644
index 2b2be8b489..0000000000
--- a/dev/Styles/FolderCreate.less
+++ /dev/null
@@ -1,4 +0,0 @@
-.b-folder-create-content {
- .modal-header {
- }
-}
diff --git a/dev/Styles/FolderSystem.less b/dev/Styles/FolderSystem.less
deleted file mode 100644
index 4a5f64d25f..0000000000
--- a/dev/Styles/FolderSystem.less
+++ /dev/null
@@ -1,4 +0,0 @@
-.b-folder-system-content {
- .modal-header {
- }
-}
diff --git a/dev/Styles/Languages.less b/dev/Styles/Languages.less
index e84676baf9..25dd109c95 100644
--- a/dev/Styles/Languages.less
+++ b/dev/Styles/Languages.less
@@ -1,16 +1,15 @@
.b-languages-content {
&.modal {
- width: 700px;
+ max-width: 700px;
}
- .lang-item {
+ label {
display: inline-block;
padding: 5px 15px;
margin: 2px 5px;
width: 180px;
background-color: rgba(128, 128, 128, 0.1);
- text-align: left;
border: 1px solid transparent;
border-radius: 3px;
position: relative;
@@ -26,7 +25,6 @@
}
&.selected::after {
content: "✔";
- color: #080;
position: absolute;
right: 4px;
font-family: snappymail;
@@ -39,7 +37,7 @@
}
@media screen and (max-width: 999px) {
- .b-languages-content .lang-item {
+ .b-languages-content label {
width: calc(100% - 40px);
}
}
diff --git a/dev/Styles/LayoutAdmin.less b/dev/Styles/LayoutAdmin.less
deleted file mode 100644
index dafda8c503..0000000000
--- a/dev/Styles/LayoutAdmin.less
+++ /dev/null
@@ -1,80 +0,0 @@
-
-.UserBackground body {
- background-size: contain;
- background-repeat: no-repeat;
- background-position: center;
-}
-
-#rl-left, #rl-right {
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- padding: 0;
- margin: 0;
- border: 0;
- z-index: 0;
-}
-
-#rl-left {
- width: @rlLeftWidth;
-}
-
-#rl-right {
- z-index: 1;
- left: @rlLeftWidth;
-}
-
-#rl-popups > .rl-view-model {
- position: fixed;
- top: 0;
- bottom: 0;
- left: 0;
- right: 0;
- z-index: 1100;
- overflow: auto;
- background-color: rgba(0,0,0,0.3);
-}
-
-#rl-settings-subscreen {
- padding: 20px;
-}
-
-/* desktop */
-@media screen and (min-width: 1000px) {
- .toggleLeft {
- display: none;
- }
-}
-
-/* desktop-large */
-@media screen and (min-width: 1401px) {
- #rl-left {
- width: @rlLeftWidth + 20;
- }
-
- #rl-right {
- left: @rlLeftWidth + 20;
- }
-}
-
-/* mobile and tablet */
-@media screen and (max-width: 999px) {
- #rl-settings-subscreen {
- padding: 10px;
- }
-
- html:not(.rl-left-panel-disabled) #rl-right {
- right: 5-@rlLeftWidth;
- }
-
- html.rl-left-panel-disabled {
- #rl-left {
- width: 0 !important;
- }
- #rl-right {
- left: 5px !important;
- }
- }
-}
diff --git a/dev/Styles/Main.less b/dev/Styles/Main.less
index 62ba752497..8600d1fd0b 100644
--- a/dev/Styles/Main.less
+++ b/dev/Styles/Main.less
@@ -20,6 +20,11 @@ body {
right: 0;
}
+html.list-loading body {
+/* cursor: wait;*/
+ cursor: progress;
+}
+
html:not(.rl-mobile) {
min-width: 700px;
}
@@ -32,10 +37,6 @@ html:not(.rl-mobile) {
}
}
-textarea {
- resize: none;
-}
-
option:disabled {
color: #aaa;
cursor: not-allowed;
diff --git a/dev/Styles/Ui.less b/dev/Styles/Ui.less
index 86e39f5ca6..8387e010f0 100644
--- a/dev/Styles/Ui.less
+++ b/dev/Styles/Ui.less
@@ -16,32 +16,6 @@
}
}
-.e-paginator {
-
- .e-page {
-
- display: inline-block;
- opacity: 0.5;
- text-decoration: none;
- font-size: 22px;
- padding: 3px;
- cursor: pointer;
-
- &:hover {
- opacity: 0.8;
- }
-
- &.current {
- opacity: 1;
- }
-
- &.current .e-page-number {
- font-size: 115%;
- text-decoration: underline;
- }
- }
-}
-
.settings-save-trigger {
display: inline-block;
@@ -93,25 +67,6 @@ textarea + .settings-save-trigger {
}
}
-.e-languages {
-
- margin-top: 8px;
- color: #333;
-
- .flag-name {
-
- color: #333;
- border-bottom: 1px dashed #333;
- cursor: pointer;
- padding: 2px 0;
-
- &:focus {
- outline: 1px;
- outline-style: dotted;
- }
- }
-}
-
.e-action {
cursor: pointer;
}
diff --git a/dev/Styles/AdvancedSearch.less b/dev/Styles/User/AdvancedSearch.less
similarity index 84%
rename from dev/Styles/AdvancedSearch.less
rename to dev/Styles/User/AdvancedSearch.less
index 5ffb112415..b32ac75d06 100644
--- a/dev/Styles/AdvancedSearch.less
+++ b/dev/Styles/User/AdvancedSearch.less
@@ -1,6 +1,6 @@
.b-advanced-search-content {
&.modal {
- width: 780px;
+ max-width: 780px;
}
.control-label {
width: 110px;
diff --git a/dev/Styles/AnimationsUser.less b/dev/Styles/User/Animations.less
similarity index 92%
rename from dev/Styles/AnimationsUser.less
rename to dev/Styles/User/Animations.less
index c465208b1e..4f1a410f36 100644
--- a/dev/Styles/AnimationsUser.less
+++ b/dev/Styles/User/Animations.less
@@ -43,15 +43,6 @@
transition: opacity 0.3s linear;
}
- .messageList {
- .messageListItem {
- transition: max-height 400ms ease;
- }
- .listDragOver {
- transition: all 400ms ease;
- }
- }
-
.b-list-content {
.e-contact-item {
transition: max-height 400ms ease;
diff --git a/dev/Styles/Attachmnets.less b/dev/Styles/User/Attachmnets.less
similarity index 100%
rename from dev/Styles/Attachmnets.less
rename to dev/Styles/User/Attachmnets.less
diff --git a/dev/Styles/Compose.less b/dev/Styles/User/Compose.less
similarity index 100%
rename from dev/Styles/Compose.less
rename to dev/Styles/User/Compose.less
diff --git a/dev/Styles/Contacts.less b/dev/Styles/User/Contacts.less
similarity index 90%
rename from dev/Styles/Contacts.less
rename to dev/Styles/User/Contacts.less
index 605d0354eb..7c8f1c4c13 100644
--- a/dev/Styles/Contacts.less
+++ b/dev/Styles/User/Contacts.less
@@ -1,7 +1,7 @@
-@contacts-popup-left-width: 220px;
+@contacts-popup-left-width: 25%;
-.b-contacts-content {
+.RL-PopupsContacts {
.control-group {
.control-label {
@@ -10,11 +10,8 @@
}
}
- &.modal {
- position: absolute;
- right: 0;
+ .modal {
bottom: 0;
- left: 0;
width: auto;
min-width: 550px;
max-width: 900px;
@@ -36,8 +33,8 @@
border-bottom: 1px solid rgba(128,128,128,0.4);
.e-search {
- margin-top: 7px;
- width: @contacts-popup-left-width - 20;
+ margin: 7px 0 0;
+ width: calc(100% - 20px);
}
}
@@ -268,18 +265,3 @@
}
}
}
-
-
-@media screen and (max-width: 700px) {
- .b-contacts-content {
- .b-list-content, .b-list-toolbar, .b-list-footer-toolbar {
- width: 170px;
- }
- .b-list-toolbar .e-search {
- width: 150px;
- }
- .b-view-content-toolbar, .b-view-content {
- left: 170px;
- }
- }
-}
diff --git a/dev/Styles/EmailAddresses.less b/dev/Styles/User/EmailAddresses.less
similarity index 100%
rename from dev/Styles/EmailAddresses.less
rename to dev/Styles/User/EmailAddresses.less
diff --git a/dev/Styles/Filter.less b/dev/Styles/User/Filter.less
similarity index 100%
rename from dev/Styles/Filter.less
rename to dev/Styles/User/Filter.less
diff --git a/dev/Styles/FolderList.less b/dev/Styles/User/FolderList.less
similarity index 100%
rename from dev/Styles/FolderList.less
rename to dev/Styles/User/FolderList.less
diff --git a/dev/Styles/Identity.less b/dev/Styles/User/Identity.less
similarity index 91%
rename from dev/Styles/Identity.less
rename to dev/Styles/User/Identity.less
index 2d1b252095..416f324df7 100644
--- a/dev/Styles/Identity.less
+++ b/dev/Styles/User/Identity.less
@@ -1,7 +1,7 @@
.b-identity-content {
&.modal {
- width: 770px;
+ max-width: 770px;
}
.modal-body {
diff --git a/dev/Styles/Layout.less b/dev/Styles/User/Layout.less
similarity index 95%
rename from dev/Styles/Layout.less
rename to dev/Styles/User/Layout.less
index 75d81edd87..0a2f88f134 100644
--- a/dev/Styles/Layout.less
+++ b/dev/Styles/User/Layout.less
@@ -371,3 +371,24 @@ html:not(.rl-mobile) .show-mobile {
html.rl-mobile .width100-on-mobile {
width: 100% !important;
}
+
+.e-paginator {
+
+ .e-page {
+ opacity: 0.5;
+ text-decoration: none;
+ font-size: 22px;
+ padding: 3px;
+ cursor: pointer;
+
+ &:hover {
+ opacity: 0.8;
+ }
+
+ &.current {
+ opacity: 1;
+ font-size: 25px;
+ cursor: default;
+ }
+ }
+}
diff --git a/dev/Styles/MessageList.less b/dev/Styles/User/MessageList.less
similarity index 58%
rename from dev/Styles/MessageList.less
rename to dev/Styles/User/MessageList.less
index 10bda6872c..af2c0c5475 100644
--- a/dev/Styles/MessageList.less
+++ b/dev/Styles/User/MessageList.less
@@ -198,234 +198,258 @@ html.rl-no-preview-pane {
}
}
- .messageListItem {
+ &.message-focused {
+ .b-message-list-wrapper {
+ background-color: #000;
+ }
+ .b-content {
+ opacity: 0.97;
+ }
+ }
+}
- position: relative;
- font-size: 12px;
- overflow: hidden;
- cursor: pointer;
+.hideMessageListCheckbox {
+ .checkboxCheckAll {
+ visibility: hidden;
+ }
- margin: 0;
- padding: 5px 0;
- border: 0;
- border-bottom: 1px solid rgba(153, 153, 153, 0.2);
- border-left: 6px solid #eee;
+ .checkboxMessage {
+ display: none;
+ }
+}
- z-index: 100;
+.messageListItem {
+ display: flex;
+ flex-wrap: wrap;
- &.focused {
- background-color: rgba(128, 128, 128, 0.1);
- border-left-color: #ccc;
- }
+ position: relative;
+ font-size: 12px;
+ overflow: hidden;
+ cursor: pointer;
- .importantMark {
- display: none;
+ margin: 0;
+ padding: 5px 0;
+ border: 0;
+ border-bottom: 1px solid rgba(153, 153, 153, 0.2);
+ border-left: 6px solid #eee;
- color:red;
- margin-right:5px
- }
+ z-index: 100;
- &.deleted-mark {
- opacity: .7;
- .subjectParent {
- text-decoration: line-through;
- }
- }
+ > * {
+ display: flex;
+ flex: 0 0 auto;
+ order: 0;
+ }
- &.important .importantMark {
- display: inline;
- }
+ &.focused {
+ background-color: rgba(128, 128, 128, 0.1);
+ border-left-color: #ccc;
+ }
- &.new {
- max-height: 0;
- }
+ .importantMark {
+ display: none;
- &.deleted {
- max-height: 0;
- border-color: transparent !important;
- }
+ color:red;
+ margin-right:5px
+ }
- .checkboxMessage {
- line-height: 12px;
- padding: 0 8px 0 6px;
- font-size: 16px;
+ &.deleted-mark {
+ opacity: .7;
+ .subjectParent {
+ text-decoration: line-through;
}
+ }
- .flagParent {
- padding: 0 10px 0 5px;
- }
+ &.important .importantMark {
+ display: inline;
+ }
- time, .sizeParent {
- margin: 0 5px;
- opacity: 0.6;
- font-size: 11px;
- white-space: nowrap;
- }
+ &.new {
+ max-height: 0;
+ }
- .threadsParent {
- position: relative;
- }
+ &.deleted {
+ max-height: 0;
+ border-color: transparent !important;
+ }
- .attachmentParent {
- position: relative;
- margin: 2px 10px 0 5px;
- color: #666;
- text-shadow: 0 1px 0 #eee;
- }
+ .checkboxMessage {
+ line-height: 12px;
+ padding: 0 8px 0 6px;
+ font-size: 16px;
+ }
- .senderParent, .subjectParent {
- overflow: hidden;
- white-space: nowrap;
- }
+ .flagParent {
+ padding: 0 10px 0 5px;
+ }
- .threadsCountParent {
- display: inline;
- overflow: hidden;
- background-color: #eee;
- padding: 1px 5px;
- margin-right: 5px;
- border: 1px solid #ccc;
- border-radius: 5px;
- }
+ time, .sizeParent {
+ margin: 0 5px;
+ opacity: 0.6;
+ font-size: 11px;
+ white-space: nowrap;
+ }
- .threadsCountParent.lastSelected {
- background-color: #999;
- border-color: #999;
- color: #fff;
- }
+ .threadsParent {
+ position: relative;
+ }
- .threadsCountParent:hover {
- border-color: #666;
- }
+ .attachmentParent {
+ position: relative;
+ margin: 2px 10px 0 5px;
+ color: #666;
+ text-shadow: 0 1px 0 #eee;
+ }
- .subjectParent .emptySubjectText {
- display: none;
- font-style: italic;
- opacity: 0.5;
- }
+ .senderParent, .subjectParent {
+ overflow: hidden;
+ white-space: nowrap;
+ }
- &.emptySubject .subjectParent {
- .subject {
- display: none;
- }
- .emptySubjectText {
- display: inline;
- }
- }
+ .threadsCountParent {
+ display: inline;
+ overflow: hidden;
+ background-color: #eee;
+ padding: 1px 5px;
+ margin-right: 5px;
+ border: 1px solid #ccc;
+ border-radius: 5px;
+ }
- .sender, .subject {
- margin: 0;
- overflow: hidden;
- text-overflow: ellipsis;
- }
+ .threadsCountParent.lastSelected {
+ background-color: #999;
+ border-color: #999;
+ color: #fff;
+ }
- .threads-len {
- .threads-len-data {
+ .threadsCountParent:hover {
+ border-color: #666;
+ }
- border-radius: 6px;
- padding: 2px 0 1px 4px;
- border: 1px solid #ccc;
+ .subjectParent .emptySubjectText {
+ display: none;
+ font-style: italic;
+ opacity: 0.5;
+ }
- &:hover {
- background-color: rgba(127,127,127,0.3);
- border-color: #666;
- }
- }
+ &.emptySubject .subjectParent {
+ .subject {
+ display: none;
+ }
+ .emptySubjectText {
+ display: inline;
}
+ }
+
+ .sender, .subject {
+ margin: 0;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ .threads-len {
+ .threads-len-data {
+
+ border-radius: 6px;
+ padding: 2px 0 1px 4px;
+ border: 1px solid #ccc;
- .flagOff {
- opacity: 0.5;
&:hover {
- opacity: 1;
+ background-color: rgba(127,127,127,0.3);
+ border-color: #666;
}
}
+ }
- .flagOn, .flagOnHalf {
- color: orange;
- }
-
- .replyFlag, .forwardFlag {
- display: none;
- margin-right: 0.25em;
+ .flagOff {
+ opacity: 0.5;
+ &:hover {
+ opacity: 1;
}
+ }
- &.answered .replyFlag {
- display: inline-block;
- }
+ .flagOn, .flagOnHalf {
+ color: orange;
+ }
- &.forwarded .forwardFlag {
- display: inline-block;
- }
+ .replyFlag, .forwardFlag {
+ display: none;
+ margin-right: 0.25em;
+ }
- &:not(.withAttachments) .attachmentParent {
- display: none;
- }
+ &.answered .replyFlag {
+ display: inline-block;
+ }
- &.hasUnseenSubMessage {
- background-color: rgba(255, 255, 64, 0.15);
- border-left-color: lighten(orange, 30%);
- &.focused {
- border-left-color: darken(orange, 10%);
- }
- }
+ &.forwarded .forwardFlag {
+ display: inline-block;
+ }
- &.unseen {
- background-color: rgba(255, 255, 64, 0.15);
- border-left-color: orange;
- .sender, .subjectParent {
- font-weight: bold;
- }
+ &:not(.withAttachments) .attachmentParent {
+ display: none;
+ }
- &.focused {
- border-left-color: darken(orange, 10%);
- }
+ &.hasUnseenSubMessage {
+ background-color: rgba(255, 255, 64, 0.15);
+ border-left-color: lighten(orange, 30%);
+ &.focused {
+ border-left-color: darken(orange, 10%);
}
+ }
- &.checked {
- border-left-color: lighten(#398CF2, 10%);
+ &.unseen {
+ background-color: rgba(255, 255, 64, 0.15);
+ border-left-color: orange;
+ .sender, .subjectParent {
+ font-weight: bold;
+ }
- &.focused {
- border-left-color: darken(#398CF2, 5%);
- }
+ &.focused {
+ border-left-color: darken(orange, 10%);
}
+ }
- &.selected {
- background-color: rgba(140, 200, 255, 0.3);
- border-bottom-color: rgba(57, 140, 242, 0.2);
- border-left-color: #398CF2;
- z-index: 101;
+ &.checked {
+ border-left-color: lighten(#398CF2, 10%);
- + .messageListItem {
- border-bottom-color: rgba(57, 140, 242, 0.3);
- }
+ &.focused {
+ border-left-color: darken(#398CF2, 5%);
}
+ }
- &:not(.flagged) .flagOn,
- &:not(.hasFlaggedSubMessage) .flagOnHalf,
- &.flagged .flagOff, &.hasFlaggedSubMessage .flagOff {
- display: none;
+ &.selected {
+ background-color: rgba(140, 200, 255, 0.3);
+ border-bottom-color: rgba(57, 140, 242, 0.2);
+ border-left-color: #398CF2;
+ z-index: 101;
+
+ + .messageListItem {
+ border-bottom-color: rgba(57, 140, 242, 0.3);
}
}
- &.message-focused {
- .b-message-list-wrapper {
- background-color: #000;
- }
- .b-content {
- opacity: 0.97;
- }
+ &:not(.flagged) .flagOn,
+ &:not(.hasFlaggedSubMessage) .flagOnHalf,
+ &.flagged .flagOff, &.hasFlaggedSubMessage .flagOff {
+ display: none;
}
+}
+
+html.rl-ctrl-key-pressed .messageListItem {
+ cursor: copy;
+}
- &.hideMessageListCheckbox {
- .checkboxMessage, .checkboxCheckAll {
- visibility: hidden;
+@media screen and (min-width: 1000px) {
+ .messageList {
+ .listDragOver {
+ transition: all 400ms ease;
}
}
}
/* desktop-large */
@media screen and (min-width: 1401px) {
- .messageList .messageListItem {
+ .messageListItem {
font-size: 13px;
time {
font-size: 13px;
@@ -448,18 +472,6 @@ html .messageList .line-loading {
top: 0;
}
-.messageListItem {
-
- display: flex;
- flex-wrap: wrap;
-
- > * {
- display: flex;
- flex: 0 0 auto;
- order: 0;
- }
-}
-
.rl-side-preview-pane, .rl-mobile {
.messageListItem {
@@ -471,7 +483,6 @@ html .messageList .line-loading {
.subjectParent {
flex: 1 0 auto;
line-height: 16px;
- margin-left: 30px;
order: 1;
width: calc(100% - 120px);
}
@@ -492,9 +503,13 @@ html .messageList .line-loading {
order: 3;
}
}
+
+ .b-message-list-wrapper:not(.hideMessageListCheckbox) .subjectParent {
+ margin-left: 30px;
+ }
}
-html:not(.rl-mobile):not(.rl-side-preview-pane) .messageList {
+html:not(.rl-mobile):not(.rl-side-preview-pane) {
.messageListItem {
diff --git a/dev/Styles/MessageView.less b/dev/Styles/User/MessageView.less
similarity index 100%
rename from dev/Styles/MessageView.less
rename to dev/Styles/User/MessageView.less
diff --git a/dev/Styles/OpenPgpKey.less b/dev/Styles/User/OpenPgpKey.less
similarity index 95%
rename from dev/Styles/OpenPgpKey.less
rename to dev/Styles/User/OpenPgpKey.less
index 0769472c4e..3145dff6ef 100644
--- a/dev/Styles/OpenPgpKey.less
+++ b/dev/Styles/User/OpenPgpKey.less
@@ -1,6 +1,6 @@
.b-open-pgp-key-view-content, .b-open-pgp-key-generate-content {
&.modal {
- width: 570px;
+ max-width: 570px;
}
}
@@ -13,7 +13,7 @@
.b-compose-open-pgp-content {
&.modal {
- width: 800px;
+ max-width: 800px;
}
.key-list {
@@ -97,7 +97,7 @@
.b-message-open-pgp-content {
&.modal {
- width: 700px;
+ max-width: 700px;
}
.key-list {
@@ -134,7 +134,7 @@
.b-open-pgp-key-add-content {
&.modal {
- width: 645px;
+ max-width: 645px;
}
.inputKey {
font-family: var(--fontMono);
diff --git a/dev/Styles/Settings.less b/dev/Styles/User/Settings.less
similarity index 100%
rename from dev/Styles/Settings.less
rename to dev/Styles/User/Settings.less
diff --git a/dev/Styles/SettingsAccounts.less b/dev/Styles/User/SettingsAccounts.less
similarity index 100%
rename from dev/Styles/SettingsAccounts.less
rename to dev/Styles/User/SettingsAccounts.less
diff --git a/dev/Styles/SettingsFilters.less b/dev/Styles/User/SettingsFilters.less
similarity index 100%
rename from dev/Styles/SettingsFilters.less
rename to dev/Styles/User/SettingsFilters.less
diff --git a/dev/Styles/SettingsFolders.less b/dev/Styles/User/SettingsFolders.less
similarity index 100%
rename from dev/Styles/SettingsFolders.less
rename to dev/Styles/User/SettingsFolders.less
diff --git a/dev/Styles/SettingsGeneral.less b/dev/Styles/User/SettingsGeneral.less
similarity index 100%
rename from dev/Styles/SettingsGeneral.less
rename to dev/Styles/User/SettingsGeneral.less
diff --git a/dev/Styles/SettingsOpenPGP.less b/dev/Styles/User/SettingsOpenPGP.less
similarity index 100%
rename from dev/Styles/SettingsOpenPGP.less
rename to dev/Styles/User/SettingsOpenPGP.less
diff --git a/dev/Styles/SettingsTemplates.less b/dev/Styles/User/SettingsTemplates.less
similarity index 100%
rename from dev/Styles/SettingsTemplates.less
rename to dev/Styles/User/SettingsTemplates.less
diff --git a/dev/Styles/SettingsThemes.less b/dev/Styles/User/SettingsThemes.less
similarity index 100%
rename from dev/Styles/SettingsThemes.less
rename to dev/Styles/User/SettingsThemes.less
diff --git a/dev/Styles/Shortcuts.less b/dev/Styles/User/Shortcuts.less
similarity index 74%
rename from dev/Styles/Shortcuts.less
rename to dev/Styles/User/Shortcuts.less
index ce6fca195b..dcf948638e 100644
--- a/dev/Styles/Shortcuts.less
+++ b/dev/Styles/User/Shortcuts.less
@@ -1,7 +1,7 @@
.rl-view-model {
.b-shortcuts-content {
&.modal {
- width: 700px;
+ max-width: 700px;
}
}
}
diff --git a/dev/Styles/SquireUI.less b/dev/Styles/User/SquireUI.less
similarity index 100%
rename from dev/Styles/SquireUI.less
rename to dev/Styles/User/SquireUI.less
diff --git a/dev/Styles/SystemDropDown.less b/dev/Styles/User/SystemDropDown.less
similarity index 100%
rename from dev/Styles/SystemDropDown.less
rename to dev/Styles/User/SystemDropDown.less
diff --git a/dev/Styles/Template.less b/dev/Styles/User/Template.less
similarity index 80%
rename from dev/Styles/Template.less
rename to dev/Styles/User/Template.less
index 331dae1cf4..47dc0e3f7d 100644
--- a/dev/Styles/Template.less
+++ b/dev/Styles/User/Template.less
@@ -1,7 +1,7 @@
.b-template-add-content {
&.modal {
- width: 750px;
+ max-width: 750px;
}
.e-template-place {
diff --git a/dev/Styles/_BootstrapFix.less b/dev/Styles/_BootstrapFix.less
index dad250ce57..5baec6bc68 100644
--- a/dev/Styles/_BootstrapFix.less
+++ b/dev/Styles/_BootstrapFix.less
@@ -12,12 +12,7 @@ label.inline, span.inline {
line-height: @baseLineHeight * 2;
color: @grayDark;
border: 0;
- border-bottom: 1px solid #e5e5e5;
-
- small {
- font-size: @baseLineHeight * .75;
- color: @grayLight;
- }
+ border-bottom: 1px solid @dropdownDividerTop;
}
.legend + .control-group {
@@ -40,30 +35,19 @@ label.inline, span.inline {
.alert a {
text-decoration: underline;
- color: #c09853;
+ color: @warningText;
}
.alert.alert-info a {
- color: #3a87ad;
+ color: @infoText;
}
.alert.alert-error a {
- color: #b94a48;
-}
-
-.form-horizontal.long-label .control-group {
- .control-label {
- width: 160px;
- }
+ color: @errorText;
}
/* mobile and tablet */
@media screen and (max-width: 999px) {
-
- .modal {
- width: calc(100% - 20px);
- }
-
.form-horizontal {
.control-group {
.control-label {
diff --git a/dev/Styles/_FontasticToBoot.less b/dev/Styles/_FontasticToBoot.less
index 1692a00e5e..4eafc03a00 100644
--- a/dev/Styles/_FontasticToBoot.less
+++ b/dev/Styles/_FontasticToBoot.less
@@ -63,7 +63,8 @@
margin: -1px -2px;
}
-.icon-spinner:not(.not-animated) {
+.icon-spinner:not(.not-animated),
+.list-loading .icon-spinner.not-animated {
border-color: transparent;
border-top-color: #999;
animation: rotation .8s infinite ease-in-out;
diff --git a/dev/View/Popup/Contacts.js b/dev/View/Popup/Contacts.js
index 36187c3566..e52d6cb8f9 100644
--- a/dev/View/Popup/Contacts.js
+++ b/dev/View/Popup/Contacts.js
@@ -79,14 +79,14 @@ class ContactsPopupView extends AbstractViewPopup {
'.e-contact-item.focused'
);
- this.selector.on('onItemSelect', contact => {
- this.populateViewContact(contact || null);
+ this.selector.on('ItemSelect', contact => {
+ this.populateViewContact(contact);
if (!contact) {
this.emptySelection(true);
}
});
- this.selector.on('onItemGetUid', contact => contact ? contact.generateUid() : '');
+ this.selector.on('ItemGetUid', contact => contact ? contact.generateUid() : '');
this.bDropPageAfterDelete = false;
diff --git a/dev/View/User/MailBox/MessageList.js b/dev/View/User/MailBox/MessageList.js
index 27459d8bbf..df76e305ec 100644
--- a/dev/View/User/MailBox/MessageList.js
+++ b/dev/View/User/MailBox/MessageList.js
@@ -55,7 +55,7 @@ export class MessageListMailBoxUserView extends AbstractViewRight {
this.bPrefetch = false;
this.emptySubjectValue = '';
- this.iGoToUpUpOrDownDownTimeout = 0;
+ this.iGoToUpOrDownTimeout = 0;
this.newMoveToFolder = !!SettingsGet('NewMoveToFolder');
@@ -86,7 +86,6 @@ export class MessageListMailBoxUserView extends AbstractViewRight {
this.messageListCheckedOrSelected = MessageUserStore.listCheckedOrSelected;
this.messageListCompleteLoadingThrottle = MessageUserStore.listCompleteLoading;
- this.messageListCompleteLoadingThrottleForAnimation = MessageUserStore.listLoadingAnimation;
initOnStartOrLangChange(() => this.emptySubjectValue = i18n('MESSAGE_LIST/EMPTY_SUBJECT_TEXT'));
@@ -191,13 +190,15 @@ export class MessageListMailBoxUserView extends AbstractViewRight {
'.messageListItem.focused'
);
- this.selector.on('onItemSelect', message => MessageUserStore.selectMessage(message));
+ this.selector.on('ItemSelect', message => MessageUserStore.selectMessage(message));
- this.selector.on('onItemGetUid', message => (message ? message.generateUid() : ''));
+ this.selector.on('MiddleClick', message => MessageUserStore.populateMessageBody(message, true));
- this.selector.on('onAutoSelect', () => this.useAutoSelect());
+ this.selector.on('ItemGetUid', message => (message ? message.generateUid() : ''));
- this.selector.on('onUpUpOrDownDown', v => this.goToUpUpOrDownDown(v));
+ this.selector.on('AutoSelect', () => this.useAutoSelect());
+
+ this.selector.on('UpOrDown', v => this.goToUpOrDown(v));
addEventListener('mailbox.message-list.selector.go-down',
e => this.selector.newSelectPosition('ArrowDown', false, e.detail)
@@ -351,13 +352,13 @@ export class MessageListMailBoxUserView extends AbstractViewRight {
showMessageComposer();
}
- goToUpUpOrDownDown(up) {
+ goToUpOrDown(up) {
if (MessageUserStore.listChecked().length) {
return false;
}
- clearTimeout(this.iGoToUpUpOrDownDownTimeout);
- this.iGoToUpUpOrDownDownTimeout = setTimeout(() => {
+ clearTimeout(this.iGoToUpOrDownTimeout);
+ this.iGoToUpOrDownTimeout = setTimeout(() => {
let prev, next, temp, current;
this.messageListPaginator().find(item => {
@@ -668,31 +669,31 @@ export class MessageListMailBoxUserView extends AbstractViewRight {
}
onBuild(dom) {
- const eqs = (ev, s) => ev.target.closestWithin(s, dom);
+ const eqs = (ev, s) => ev.target.closestWithin('.messageList '+s, dom);
this.selector.init(dom.querySelector('.b-content'), Scope.MessageList);
dom.addEventListener('click', event => {
ThemeStore.isMobile() && leftPanelDisabled(true);
- if (eqs(event, '.messageList .b-message-list-wrapper') && Scope.MessageView === AppUserStore.focusedState()) {
+ if (eqs(event, '.b-message-list-wrapper') && Scope.MessageView === AppUserStore.focusedState()) {
AppUserStore.focusedState(Scope.MessageList);
}
let el = eqs(event, '.e-paginator .e-page');
el && this.gotoPage(ko.dataFor(el));
- eqs(event, '.messageList .checkboxCheckAll') && this.checkAll(!this.checkAll());
+ eqs(event, '.checkboxCheckAll') && this.checkAll(!this.checkAll());
- el = eqs(event, '.messageList .messageListItem .flagParent');
+ el = eqs(event, '.messageListItem .flagParent');
el && this.flagMessages(ko.dataFor(el));
- el = eqs(event, '.messageList .messageListItem .threads-len');
+ el = eqs(event, '.messageListItem .threads-len');
el && this.gotoThread(ko.dataFor(el));
});
dom.addEventListener('dblclick', event => {
- let el = eqs(event, '.messageList .messageListItem .actionHandle');
+ let el = eqs(event, '.messageListItem .actionHandle');
el && this.gotoThread(ko.dataFor(el));
});
diff --git a/package.json b/package.json
index 2718780d4a..cff731062c 100644
--- a/package.json
+++ b/package.json
@@ -67,6 +67,7 @@
"rimraf": "3.0.2"
},
"dependencies": {
+ "gulp-group-css-media-queries": "^1.2.2",
"gulp-rollup-2": "^1.2.1",
"rollup": "^2.38.0",
"rollup-plugin-external-globals": "^0.6.1",
diff --git a/plugins/change-password/index.php b/plugins/change-password/index.php
index eebd684a16..9c354c80be 100644
--- a/plugins/change-password/index.php
+++ b/plugins/change-password/index.php
@@ -6,9 +6,9 @@ class ChangePasswordPlugin extends \RainLoop\Plugins\AbstractPlugin
{
const
NAME = 'Change Password',
- VERSION = '2.1',
- RELEASE = '2021-03-18',
- REQUIRED = '2.4.0',
+ VERSION = '2.2',
+ RELEASE = '2021-07-20',
+ REQUIRED = '2.5.0',
CATEGORY = 'Security',
DESCRIPTION = 'This plugin allows you to change passwords of email accounts';
@@ -23,6 +23,7 @@ public function Init() : void
{
$this->UseLangs(true); // start use langs folder
+ $this->addCss('style.less');
$this->addJs('js/ChangePasswordUserSettings.js'); // add js file
$this->addJsonHook('ChangePassword', 'ChangePassword');
$this->addTemplate('templates/SettingsChangePassword.html');
diff --git a/plugins/change-password/style.less b/plugins/change-password/style.less
new file mode 100644
index 0000000000..09788f9812
--- /dev/null
+++ b/plugins/change-password/style.less
@@ -0,0 +1,5 @@
+.form-horizontal.change-password .control-group {
+ .control-label {
+ width: 160px;
+ }
+}
diff --git a/plugins/change-password/templates/SettingsChangePassword.html b/plugins/change-password/templates/SettingsChangePassword.html
index f16b1b7fe5..ac0e62d200 100644
--- a/plugins/change-password/templates/SettingsChangePassword.html
+++ b/plugins/change-password/templates/SettingsChangePassword.html
@@ -1,5 +1,5 @@