mirror of
https://github.com/the-djmaze/snappymail.git
synced 2026-07-10 06:58:27 +03:00
Improved the (User|Admin) Settings screens
This commit is contained in:
parent
6170de5aee
commit
5b0dd471bc
37 changed files with 948 additions and 1009 deletions
|
|
@ -2,7 +2,7 @@ import ko from 'ko';
|
|||
|
||||
import { inFocus, addObservablesTo, addComputablesTo, addSubscribablesTo } from 'Common/Utils';
|
||||
import { Scope } from 'Common/Enums';
|
||||
import { keyScope, Settings } from 'Common/Globals';
|
||||
import { keyScope, Settings, leftPanelDisabled } from 'Common/Globals';
|
||||
import { ViewType } from 'Knoin/Knoin';
|
||||
|
||||
class AbstractView {
|
||||
|
|
@ -102,6 +102,7 @@ export class AbstractViewLeft extends AbstractView
|
|||
constructor(templateID)
|
||||
{
|
||||
super(templateID, ViewType.Left);
|
||||
this.leftPanelDisabled = leftPanelDisabled;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ import ko from 'ko';
|
|||
|
||||
import { pString } from 'Common/Utils';
|
||||
import { settings } from 'Common/Links';
|
||||
import { doc, elementById } from 'Common/Globals';
|
||||
import { elementById } from 'Common/Globals';
|
||||
|
||||
import { AbstractScreen } from 'Knoin/AbstractScreen';
|
||||
|
||||
|
|
@ -33,11 +33,12 @@ export class AbstractSettingsScreen extends AbstractScreen {
|
|||
} else {
|
||||
const vmPlace = elementById('rl-settings-subscreen');
|
||||
if (vmPlace) {
|
||||
settingsScreen = new RoutedSettingsViewModel();
|
||||
|
||||
viewModelDom = Element.fromHTML('<div hidden=""></div>');
|
||||
viewModelDom = Element.fromHTML('<div id="V-Settings-'
|
||||
+ (RoutedSettingsViewModel.name.replace(/(User|Admin)Settings/,''))
|
||||
+ '" class="g-ui-user-select-none" hidden=""></div>');
|
||||
vmPlace.append(viewModelDom);
|
||||
|
||||
settingsScreen = new RoutedSettingsViewModel();
|
||||
settingsScreen.viewModelDom = viewModelDom;
|
||||
|
||||
RoutedSettingsViewModel.__dom = viewModelDom;
|
||||
|
|
@ -78,7 +79,7 @@ export class AbstractSettingsScreen extends AbstractScreen {
|
|||
);
|
||||
});
|
||||
|
||||
doc.querySelector('#rl-content .b-settings .b-content').scrollTop = 0;
|
||||
elementById('rl-settings-subscreen').scrollTop = 0;
|
||||
// --
|
||||
}, 1);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
|
||||
.b-admin-about {
|
||||
#V-Settings-About {
|
||||
.rl-logo {
|
||||
display: inline-block;
|
||||
width: 250px;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
|
||||
.b-admin-branding {
|
||||
#V-Settings-Branding {
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
|
||||
.b-admin-general {
|
||||
#V-Settings-General {
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -49,7 +49,8 @@
|
|||
left: @rlLeftWidth;
|
||||
}
|
||||
|
||||
.b-admin-right {
|
||||
#V-AdminPane {
|
||||
height: 100%;
|
||||
|
||||
.b-toolbar {
|
||||
position: absolute;
|
||||
|
|
@ -67,23 +68,6 @@
|
|||
flex-grow: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.b-content {
|
||||
position: absolute;
|
||||
top: 50px + @rlLowMargin;
|
||||
bottom: @rlLowMargin;
|
||||
left: 0;
|
||||
right: @rlLowMargin;
|
||||
overflow-y: auto;
|
||||
z-index: 2;
|
||||
|
||||
background-color: #fff;
|
||||
border: 1px solid @rlMainDarkColor;
|
||||
|
||||
box-shadow: @rlMainShadow;
|
||||
border-radius: @rlMainBorderRadius;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.btn.btn-logout {
|
||||
|
|
@ -92,7 +76,18 @@
|
|||
}
|
||||
|
||||
#rl-settings-subscreen {
|
||||
margin: (50px + @rlLowMargin) @rlLowMargin @rlLowMargin 0;
|
||||
overflow-y: auto;
|
||||
padding: 20px;
|
||||
|
||||
box-sizing: border-box;
|
||||
height: calc(100% - 50px - @rlLowMargin - @rlLowMargin);
|
||||
|
||||
background-color: #fff;
|
||||
border: 1px solid @rlMainDarkColor;
|
||||
|
||||
box-shadow: @rlMainShadow;
|
||||
border-radius: @rlMainBorderRadius;
|
||||
}
|
||||
|
||||
/* desktop */
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
|
||||
.b-admin-packages {
|
||||
#V-Settings-Packages {
|
||||
|
||||
.alert {
|
||||
width: 650px;
|
||||
|
|
|
|||
|
|
@ -153,10 +153,6 @@ html.rl-side-preview-pane {
|
|||
}
|
||||
}
|
||||
|
||||
#rl-settings-subscreen {
|
||||
padding:20px;
|
||||
}
|
||||
|
||||
.dropdown-menu {
|
||||
max-height: 60vh;
|
||||
max-width: 90vw;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
|
||||
.b-settins-left {
|
||||
#V-SettingsMenu {
|
||||
|
||||
.b-footer {
|
||||
position: absolute;
|
||||
|
|
@ -46,9 +46,10 @@
|
|||
}
|
||||
}
|
||||
|
||||
.b-settins-right {
|
||||
#V-SettingsPane {
|
||||
height: 100%;
|
||||
|
||||
.b-toolbar {
|
||||
.btn-toolbar {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
|
|
@ -58,33 +59,32 @@
|
|||
color: #fff;
|
||||
}
|
||||
|
||||
.b-content {
|
||||
position: absolute;
|
||||
top: 50px;
|
||||
bottom: @rlLowMargin;
|
||||
left: 0;
|
||||
right: @rlLowMargin;
|
||||
overflow-y: auto;
|
||||
z-index: 2;
|
||||
scroll-behavior: smooth;
|
||||
|
||||
background-color: #fff;
|
||||
border: 1px solid @rlMainDarkColor;
|
||||
box-shadow: @rlMainShadow;
|
||||
border-radius: @rlMainBorderRadius;
|
||||
}
|
||||
|
||||
td {
|
||||
padding: 4px 8px;
|
||||
line-height: 30px;
|
||||
}
|
||||
}
|
||||
|
||||
#rl-settings-subscreen {
|
||||
margin: 50px @rlLowMargin @rlLowMargin 0;
|
||||
overflow-y: auto;
|
||||
scroll-behavior: smooth;
|
||||
padding:20px;
|
||||
|
||||
box-sizing: border-box;
|
||||
height: calc(100% - 50px - @rlLowMargin - @rlLowMargin);
|
||||
|
||||
background-color: #fff;
|
||||
border: 1px solid @rlMainDarkColor;
|
||||
box-shadow: @rlMainShadow;
|
||||
border-radius: @rlMainBorderRadius;
|
||||
}
|
||||
|
||||
html.rl-mobile #rl-settings-subscreen > * {
|
||||
margin-right: 15px;
|
||||
}
|
||||
|
||||
.firefox-drag .b-settins-right .b-content,
|
||||
.firefox-drag #rl-settings-subscreen,
|
||||
.firefox-drag .modal-body {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
|
||||
.b-settings-accounts {
|
||||
#V-Settings-Accounts {
|
||||
|
||||
.account-name {
|
||||
display: inline-block;
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
}
|
||||
|
||||
#V-PopupsSieveScript .filter-item,
|
||||
.b-settings-filters .script-item {
|
||||
#V-Settings-Filters .script-item {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
|
||||
.b-settings-folders {
|
||||
#V-Settings-Folders {
|
||||
|
||||
.folders-list-error {
|
||||
margin: 10px 0;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
|
||||
.b-settings-general {
|
||||
#V-Settings-General {
|
||||
.editMainIdentity {
|
||||
border-bottom: 1px dashed #555;
|
||||
cursor: pointer;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
|
||||
.b-settings-open-pgp {
|
||||
V-Settings-OpenPgp {
|
||||
|
||||
td + td {
|
||||
width: 1%;
|
||||
|
|
|
|||
|
|
@ -113,7 +113,7 @@ class MessageOpenPgpPopupView extends AbstractViewPopup {
|
|||
this.privateKeys(privateKeys);
|
||||
|
||||
if (this.viewModelDom) {
|
||||
const el = this.viewModelDom.querySelector('.key-list__item');
|
||||
const el = this.querySelector('.key-list__item');
|
||||
el && el.click();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import ko from 'ko';
|
||||
|
||||
import { Scope } from 'Common/Enums';
|
||||
import { leftPanelDisabled, moveAction } from 'Common/Globals';
|
||||
import { moveAction } from 'Common/Globals';
|
||||
import { mailBox, settings } from 'Common/Links';
|
||||
import { setFolderHash } from 'Common/Cache';
|
||||
import { addComputablesTo } from 'Common/Utils';
|
||||
|
|
@ -34,8 +34,6 @@ export class MailFolderList extends AbstractViewLeft {
|
|||
|
||||
this.foldersListWithSingleInboxRootFolder = ko.observable(false);
|
||||
|
||||
this.leftPanelDisabled = leftPanelDisabled;
|
||||
|
||||
this.allowContacts = AppUserStore.allowContacts();
|
||||
|
||||
addComputablesTo(this, {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
import { leftPanelDisabled } from 'Common/Globals';
|
||||
import { settings, mailbox } from 'Common/Links';
|
||||
import { getFolderInboxName } from 'Common/Cache';
|
||||
|
||||
|
|
@ -11,8 +10,6 @@ export class MenuSettingsUserView extends AbstractViewLeft {
|
|||
constructor(screen) {
|
||||
super('SettingsMenu');
|
||||
|
||||
this.leftPanelDisabled = leftPanelDisabled;
|
||||
|
||||
this.menu = screen.menu;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,11 +1,7 @@
|
|||
<div class="b-settings b-admin-right">
|
||||
<div class="b-toolbar g-ui-user-select-none">
|
||||
<a class="btn btn-thin-2 fontastic toggleLeft" data-bind="click: leftPanelDisabled.toggle, text: leftPanelDisabled() ? '❯' : '❮'">❮</a>
|
||||
<i class="icon-spinner" style="margin: 10px" data-bind="style: {'visibility': adminManLoadingVisibility }"></i>
|
||||
<h4>SnappyMail - <span data-i18n="TOP_PANEL/LABEL_ADMIN_PANEL"></span></h4>
|
||||
<a class="btn btn-logout fontastic" data-bind="click: logoutClick">⏻</a>
|
||||
</div>
|
||||
<div class="b-content">
|
||||
<div id="rl-settings-subscreen"></div>
|
||||
</div>
|
||||
<div class="b-toolbar g-ui-user-select-none">
|
||||
<a class="btn btn-thin-2 fontastic toggleLeft" data-bind="click: leftPanelDisabled.toggle, text: leftPanelDisabled() ? '❯' : '❮'">❮</a>
|
||||
<i class="icon-spinner" style="margin: 10px" data-bind="style: {'visibility': adminManLoadingVisibility }"></i>
|
||||
<h4>SnappyMail - <span data-i18n="TOP_PANEL/LABEL_ADMIN_PANEL"></span></h4>
|
||||
<a class="btn btn-logout fontastic" data-bind="click: logoutClick">⏻</a>
|
||||
</div>
|
||||
<div id="rl-settings-subscreen"></div>
|
||||
|
|
|
|||
|
|
@ -1,33 +1,31 @@
|
|||
<div class="b-admin-about">
|
||||
<div class="form-horizontal">
|
||||
<div class="legend" data-i18n="TAB_ABOUT/LEGEND_ABOUT"></div>
|
||||
<div class="row" style="min-width: 800px;">
|
||||
<div class="span4">
|
||||
<div class="rl-logo"></div>
|
||||
<div>
|
||||
2021 © <span data-i18n="TAB_ABOUT/LABEL_ALL_RIGHTS_RESERVED"></span>
|
||||
<br />
|
||||
<a class="g-ui-link" href="https://snappymail.eu/" target="_blank" style="padding-left: 0">https://snappymail.eu/</a>
|
||||
</div>
|
||||
<div class="form-horizontal">
|
||||
<div class="legend" data-i18n="TAB_ABOUT/LEGEND_ABOUT"></div>
|
||||
<div class="row" style="min-width: 800px;">
|
||||
<div class="span4">
|
||||
<div class="rl-logo"></div>
|
||||
<div>
|
||||
2021 © <span data-i18n="TAB_ABOUT/LABEL_ALL_RIGHTS_RESERVED"></span>
|
||||
<br />
|
||||
<a class="g-ui-link" href="https://snappymail.eu/" target="_blank" style="padding-left: 0">https://snappymail.eu/</a>
|
||||
</div>
|
||||
<div class="span6">
|
||||
<h1 style="margin-bottom: 0;">SnappyMail</h1>
|
||||
<h4 style="margin-top: 0;" data-bind="text: version"></h4>
|
||||
<h4 style="color: #aaa; font-weight: normal;">An advanced fork of <a href="https://www.rainloop.net/" target="_blank">RainLoop</a></h4>
|
||||
<h4 style="color: #aaa; font-weight: normal;" data-i18n="TAB_ABOUT/LABEL_TAG_HINT"></h4>
|
||||
</div>
|
||||
<div class="span6">
|
||||
<h1 style="margin-bottom: 0;">SnappyMail</h1>
|
||||
<h4 style="margin-top: 0;" data-bind="text: version"></h4>
|
||||
<h4 style="color: #aaa; font-weight: normal;">An advanced fork of <a href="https://www.rainloop.net/" target="_blank">RainLoop</a></h4>
|
||||
<h4 style="color: #aaa; font-weight: normal;" data-i18n="TAB_ABOUT/LABEL_TAG_HINT"></h4>
|
||||
|
||||
<h3>PHP optional extensions</h3>
|
||||
<table class="table table-hover table-bordered"><thead><tr>
|
||||
<th>Extension</th>
|
||||
<th>Loaded</th>
|
||||
</tr></thead><tbody data-bind="foreach: phpextensions">
|
||||
<tr>
|
||||
<td data-bind="text: name"></td>
|
||||
<td data-bind="text: loaded ? '✔' : '❌'"></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<h3>PHP optional extensions</h3>
|
||||
<table class="table table-hover table-bordered"><thead><tr>
|
||||
<th>Extension</th>
|
||||
<th>Loaded</th>
|
||||
</tr></thead><tbody data-bind="foreach: phpextensions">
|
||||
<tr>
|
||||
<td data-bind="text: name"></td>
|
||||
<td data-bind="text: loaded ? '✔' : '❌'"></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,39 +1,37 @@
|
|||
<div class="b-admin-branding">
|
||||
<div class="form-horizontal">
|
||||
<div class="legend" data-i18n="TAB_BRANDING/LEGEND_BRANDING"></div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="TAB_BRANDING/LABEL_PAGE_TITLE"></label>
|
||||
<div class="controls" data-bind="component: {
|
||||
name: 'Input',
|
||||
params: {
|
||||
value: title,
|
||||
trigger: title.trigger,
|
||||
size: 5
|
||||
}
|
||||
}"></div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="TAB_BRANDING/LABEL_LOADING_DESCRIPTION"></label>
|
||||
<div class="controls" data-bind="component: {
|
||||
name: 'Input',
|
||||
params: {
|
||||
value: loadingDesc,
|
||||
trigger: loadingDesc.trigger,
|
||||
size: 5
|
||||
}
|
||||
}"></div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="TAB_BRANDING/LABEL_FAVICON_URL"></label>
|
||||
<div class="controls" data-bind="component: {
|
||||
name: 'Input',
|
||||
params: {
|
||||
value: faviconUrl,
|
||||
trigger: faviconUrl.trigger,
|
||||
placeholder: 'https://',
|
||||
size: 5
|
||||
}
|
||||
}"></div>
|
||||
</div>
|
||||
<div class="form-horizontal">
|
||||
<div class="legend" data-i18n="TAB_BRANDING/LEGEND_BRANDING"></div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="TAB_BRANDING/LABEL_PAGE_TITLE"></label>
|
||||
<div class="controls" data-bind="component: {
|
||||
name: 'Input',
|
||||
params: {
|
||||
value: title,
|
||||
trigger: title.trigger,
|
||||
size: 5
|
||||
}
|
||||
}"></div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="TAB_BRANDING/LABEL_LOADING_DESCRIPTION"></label>
|
||||
<div class="controls" data-bind="component: {
|
||||
name: 'Input',
|
||||
params: {
|
||||
value: loadingDesc,
|
||||
trigger: loadingDesc.trigger,
|
||||
size: 5
|
||||
}
|
||||
}"></div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="TAB_BRANDING/LABEL_FAVICON_URL"></label>
|
||||
<div class="controls" data-bind="component: {
|
||||
name: 'Input',
|
||||
params: {
|
||||
value: faviconUrl,
|
||||
trigger: faviconUrl.trigger,
|
||||
placeholder: 'https://',
|
||||
size: 5
|
||||
}
|
||||
}"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,100 +1,96 @@
|
|||
<div class="b-admin-general">
|
||||
<div class="row" data-bind="visible: !contactsSupported">
|
||||
<div class="alert span8" style="margin-top: 10px;">
|
||||
<h4 data-i18n="TAB_CONTACTS/ALERT_NOTICE"></h4>
|
||||
<br />
|
||||
<div data-i18n="[html]TAB_CONTACTS/HTML_ALERT_DOES_NOT_SUPPORTED"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-horizontal" data-bind="visible: contactsSupported">
|
||||
<div class="legend" data-i18n="TAB_CONTACTS/LEGEND_CONTACTS"></div>
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: { value: enableContacts, label: 'TAB_CONTACTS/LABEL_ENABLE_CONTACTS' }
|
||||
}"></div>
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: { value: contactsSync, label: 'TAB_CONTACTS/LABEL_ALLOW_SYNC' }
|
||||
}"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-horizontal" data-bind="visible: contactsSupported">
|
||||
<div class="legend" data-i18n="TAB_CONTACTS/LEGEND_STORAGE"></div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="TAB_CONTACTS/LABEL_STORAGE_TYPE"></label>
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Select',
|
||||
params: {
|
||||
options: contactsTypesOptions,
|
||||
value: mainContactsType,
|
||||
trigger: contactsTypeTrigger,
|
||||
optionsText: 'name',
|
||||
optionsValue: 'id'
|
||||
}
|
||||
}"></div>
|
||||
</div>
|
||||
</div>
|
||||
<br />
|
||||
<div data-bind="visible: 'sqlite' !== contactsType()">
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="TAB_CONTACTS/LABEL_STORAGE_DSN"></label>
|
||||
<div class="controls">
|
||||
<input type="text" class="span6" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
data-bind="value: pdoDsn, saveTrigger: pdoDsnTrigger" />
|
||||
<blockquote style="margin: 0">
|
||||
<p class="muted">
|
||||
host=127.0.0.1;port=3306;dbname=snappymail<br />
|
||||
host=127.0.0.1;port=5432;dbname=snappymail
|
||||
</p>
|
||||
</blockquote>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="TAB_CONTACTS/LABEL_STORAGE_USER"></label>
|
||||
<div class="controls">
|
||||
<input type="text" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
data-bind="value: pdoUser, saveTrigger: pdoUserTrigger" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="TAB_CONTACTS/LABEL_STORAGE_PASSWORD"></label>
|
||||
<div class="controls">
|
||||
<input type="password" autocomplete="current-password" autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
data-bind="value: pdoPassword, saveTrigger: pdoPasswordTrigger" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<a class="btn" data-bind="command: testContactsCommand, css: { 'btn-success': testContactsSuccess, 'btn-danger': testContactsError }">
|
||||
<i class="fontastic" data-bind="css: {'icon-spinner': testing()}">ℹ</i>
|
||||
<span data-i18n="TAB_CONTACTS/BUTTON_TEST"></span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div data-bind="visible: 'sqlite' === contactsType()">
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<div class="alert">
|
||||
<h4 data-i18n="TAB_CONTACTS/ALERT_NOTICE"></h4>
|
||||
<br />
|
||||
<div data-i18n="[html]TAB_CONTACTS/HTML_ALERT_DO_NOT_USE_THIS_DATABASE"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<a class="btn" data-bind="command: testContactsCommand, css: { 'btn-success': testContactsSuccess, 'btn-danger': testContactsError }">
|
||||
<i class="fontastic" data-bind="css: {'icon-spinner': testing()}">ℹ</i>
|
||||
<span data-i18n="TAB_CONTACTS/BUTTON_TEST"></span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="alert span8" data-bind="text: testContactsErrorMessage, visible: '' !== testContactsErrorMessage()"></div>
|
||||
<div class="row" data-bind="visible: !contactsSupported">
|
||||
<div class="alert span8" style="margin-top: 10px;">
|
||||
<h4 data-i18n="TAB_CONTACTS/ALERT_NOTICE"></h4>
|
||||
<div data-i18n="[html]TAB_CONTACTS/HTML_ALERT_DOES_NOT_SUPPORTED"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-horizontal" data-bind="visible: contactsSupported">
|
||||
<div class="legend" data-i18n="TAB_CONTACTS/LEGEND_CONTACTS"></div>
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: { value: enableContacts, label: 'TAB_CONTACTS/LABEL_ENABLE_CONTACTS' }
|
||||
}"></div>
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: { value: contactsSync, label: 'TAB_CONTACTS/LABEL_ALLOW_SYNC' }
|
||||
}"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-horizontal" data-bind="visible: contactsSupported">
|
||||
<div class="legend" data-i18n="TAB_CONTACTS/LEGEND_STORAGE"></div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="TAB_CONTACTS/LABEL_STORAGE_TYPE"></label>
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Select',
|
||||
params: {
|
||||
options: contactsTypesOptions,
|
||||
value: mainContactsType,
|
||||
trigger: contactsTypeTrigger,
|
||||
optionsText: 'name',
|
||||
optionsValue: 'id'
|
||||
}
|
||||
}"></div>
|
||||
</div>
|
||||
</div>
|
||||
<br />
|
||||
<div data-bind="visible: 'sqlite' !== contactsType()">
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="TAB_CONTACTS/LABEL_STORAGE_DSN"></label>
|
||||
<div class="controls">
|
||||
<input type="text" class="span6" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
data-bind="value: pdoDsn, saveTrigger: pdoDsnTrigger" />
|
||||
<blockquote style="margin: 0">
|
||||
<p class="muted">
|
||||
host=127.0.0.1;port=3306;dbname=snappymail<br />
|
||||
host=127.0.0.1;port=5432;dbname=snappymail
|
||||
</p>
|
||||
</blockquote>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="TAB_CONTACTS/LABEL_STORAGE_USER"></label>
|
||||
<div class="controls">
|
||||
<input type="text" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
data-bind="value: pdoUser, saveTrigger: pdoUserTrigger" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="TAB_CONTACTS/LABEL_STORAGE_PASSWORD"></label>
|
||||
<div class="controls">
|
||||
<input type="password" autocomplete="current-password" autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
data-bind="value: pdoPassword, saveTrigger: pdoPasswordTrigger" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<a class="btn" data-bind="command: testContactsCommand, css: { 'btn-success': testContactsSuccess, 'btn-danger': testContactsError }">
|
||||
<i class="fontastic" data-bind="css: {'icon-spinner': testing()}">ℹ</i>
|
||||
<span data-i18n="TAB_CONTACTS/BUTTON_TEST"></span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div data-bind="visible: 'sqlite' === contactsType()">
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<div class="alert">
|
||||
<h4 data-i18n="TAB_CONTACTS/ALERT_NOTICE"></h4>
|
||||
<div data-i18n="[html]TAB_CONTACTS/HTML_ALERT_DO_NOT_USE_THIS_DATABASE"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<a class="btn" data-bind="command: testContactsCommand, css: { 'btn-success': testContactsSuccess, 'btn-danger': testContactsError }">
|
||||
<i class="fontastic" data-bind="css: {'icon-spinner': testing()}">ℹ</i>
|
||||
<span data-i18n="TAB_CONTACTS/BUTTON_TEST"></span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="alert span8" data-bind="text: testContactsErrorMessage, visible: '' !== testContactsErrorMessage()"></div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,46 +1,42 @@
|
|||
<div class="b-admin-domains g-ui-user-select-none">
|
||||
<div class="legend">
|
||||
<span data-i18n="TAB_DOMAINS/LEGEND_DOMAINS"></span>
|
||||
<i class="icon-spinner" style="margin: 5px" data-bind="visible: domains.loading"></i>
|
||||
</div>
|
||||
<div>
|
||||
<a class="btn" data-bind="click: createDomain">
|
||||
<i class="fontastic">✚</i>
|
||||
<span data-i18n="TAB_DOMAINS/BUTTON_ADD_DOMAIN"></span>
|
||||
</a>
|
||||
|
||||
<a class="btn" data-bind="click: createDomainAlias">
|
||||
<i class="fontastic">✚</i>
|
||||
<span data-i18n="TAB_DOMAINS/BUTTON_ADD_ALIAS"></span>
|
||||
</a>
|
||||
<br />
|
||||
<br />
|
||||
<blockquote>
|
||||
<p class="muted" data-i18n="[html]TAB_DOMAINS/HTML_DOMAINS_HELPER"></p>
|
||||
</blockquote>
|
||||
<table class="table table-hover b-admin-domains-list-table" data-bind="i18nUpdate: domains">
|
||||
<colgroup>
|
||||
<col />
|
||||
<col style="width: 140px" />
|
||||
<col style="width: 1%" />
|
||||
<col style="width: 1%" />
|
||||
</colgroup>
|
||||
<tbody data-bind="foreach: domains">
|
||||
<tr data-bind="css: {'disabled': disabled }">
|
||||
<td class="e-action">
|
||||
<span class="domain-name" data-bind="text: name"></span>
|
||||
<span class="domain-alias" data-bind="if: alias">(alias)</span>
|
||||
</td>
|
||||
<td>
|
||||
<a class="btn btn-small btn-small-small btn-danger button-delete button-delete-transitions" data-bind="css: {'delete-access': deleteAccess()}, click: function(oDomain) { $root.deleteDomain(oDomain); }"
|
||||
data-i18n="TAB_DOMAINS/DELETE_ARE_YOU_SURE"></a>
|
||||
</td>
|
||||
<td>
|
||||
<span class="delete-domain fontastic" data-bind="visible: !deleteAccess(), click: function (oDomain) { $root.domainForDeletion(oDomain); }">🗑</span>
|
||||
</td>
|
||||
<td class="disabled-domain fontastic" data-bind="click: function (oDomain) { $root.disableDomain(oDomain); }, text: disabled() ? '☐' : '☑'"></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="legend">
|
||||
<span data-i18n="TAB_DOMAINS/LEGEND_DOMAINS"></span>
|
||||
<i class="icon-spinner" style="margin: 5px" data-bind="visible: domains.loading"></i>
|
||||
</div>
|
||||
<a class="btn" data-bind="click: createDomain">
|
||||
<i class="fontastic">✚</i>
|
||||
<span data-i18n="TAB_DOMAINS/BUTTON_ADD_DOMAIN"></span>
|
||||
</a>
|
||||
|
||||
<a class="btn" data-bind="click: createDomainAlias">
|
||||
<i class="fontastic">✚</i>
|
||||
<span data-i18n="TAB_DOMAINS/BUTTON_ADD_ALIAS"></span>
|
||||
</a>
|
||||
<br />
|
||||
<br />
|
||||
<blockquote>
|
||||
<p class="muted" data-i18n="[html]TAB_DOMAINS/HTML_DOMAINS_HELPER"></p>
|
||||
</blockquote>
|
||||
<table class="table table-hover b-admin-domains-list-table" data-bind="i18nUpdate: domains">
|
||||
<colgroup>
|
||||
<col />
|
||||
<col style="width: 140px" />
|
||||
<col style="width: 1%" />
|
||||
<col style="width: 1%" />
|
||||
</colgroup>
|
||||
<tbody data-bind="foreach: domains">
|
||||
<tr data-bind="css: {'disabled': disabled }">
|
||||
<td class="e-action">
|
||||
<span class="domain-name" data-bind="text: name"></span>
|
||||
<span class="domain-alias" data-bind="if: alias">(alias)</span>
|
||||
</td>
|
||||
<td>
|
||||
<a class="btn btn-small btn-small-small btn-danger button-delete button-delete-transitions" data-bind="css: {'delete-access': deleteAccess()}, click: function(oDomain) { $root.deleteDomain(oDomain); }"
|
||||
data-i18n="TAB_DOMAINS/DELETE_ARE_YOU_SURE"></a>
|
||||
</td>
|
||||
<td>
|
||||
<span class="delete-domain fontastic" data-bind="visible: !deleteAccess(), click: function (oDomain) { $root.domainForDeletion(oDomain); }">🗑</span>
|
||||
</td>
|
||||
<td class="disabled-domain fontastic" data-bind="click: function (oDomain) { $root.disableDomain(oDomain); }, text: disabled() ? '☐' : '☑'"></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
|
|
|||
|
|
@ -1,132 +1,130 @@
|
|||
<div class="b-admin-general">
|
||||
<div class="row" data-bind="visible: weakPassword">
|
||||
<div class="alert alert-warning span8" style="margin-top: 10px;">
|
||||
<h4 data-i18n="TAB_GENERAL/ALERT_WARNING"></h4>
|
||||
<br />
|
||||
<div data-i18n="[html]TAB_GENERAL/HTML_ALERT_WEAK_PASSWORD"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row" data-bind="visible: dataFolderAccess">
|
||||
<div class="alert alert-error span8" style="margin-top: 10px;">
|
||||
<h4 data-i18n="TAB_GENERAL/ALERT_WARNING"></h4>
|
||||
<br />
|
||||
<span data-i18n="TAB_GENERAL/ALERT_DATA_ACCESS"></span>
|
||||
|
||||
<a href="https://www.rainloop.net/docs/installation/#notice"
|
||||
target="_blank"><strong>https://www.rainloop.net/docs/installation</strong></a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-horizontal">
|
||||
<div class="legend" data-i18n="TAB_GENERAL/LEGEND_INTERFACE"></div>
|
||||
<div class="control-group" style="margin-bottom: 10px;">
|
||||
<label class="control-label" data-i18n="TAB_GENERAL/LABEL_LANGUAGE"></label>
|
||||
<div class="controls">
|
||||
<span class="select" tabindex="0" data-bind="text: languageFullName, click: selectLanguage, onSpace: selectLanguage, onEnter: selectLanguage"></span>
|
||||
<span data-bind="saveTrigger: languageTrigger"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="TAB_GENERAL/LABEL_LANGUAGE_ADMIN"></label>
|
||||
<div class="controls">
|
||||
<span class="select" tabindex="0" data-bind="text: languageAdminFullName, click: selectLanguageAdmin, onSpace: selectLanguageAdmin, onEnter: selectLanguageAdmin"></span>
|
||||
<span data-bind="saveTrigger: languageAdminTrigger"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="TAB_GENERAL/LABEL_THEME"></label>
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Select',
|
||||
params: {
|
||||
options: themesOptions,
|
||||
value: theme,
|
||||
trigger: themeTrigger,
|
||||
optionsText: 'optText',
|
||||
optionsValue: 'optValue',
|
||||
size: 2
|
||||
}
|
||||
}"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'TAB_GENERAL/LABEL_ALLOW_LANGUAGES_ON_SETTINGS',
|
||||
value: allowLanguagesOnSettings
|
||||
}
|
||||
}"></div>
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'TAB_GENERAL/LABEL_ALLOW_THEMES_ON_SETTINGS',
|
||||
value: capaThemes
|
||||
}
|
||||
}"></div>
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'TAB_GENERAL/LABEL_ALLOW_BACKGROUND_ON_SETTINGS',
|
||||
value: capaUserBackground
|
||||
}
|
||||
}"></div>
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'TAB_GENERAL/LABEL_NEW_FOLDER_MOVE',
|
||||
value: newMoveToFolder
|
||||
}
|
||||
}"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'TAB_GENERAL/LABEL_SHOW_THUMBNAILS',
|
||||
value: capaAttachmentThumbnails,
|
||||
inline: false
|
||||
}
|
||||
}"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="legend" data-i18n="TAB_GENERAL/LEGEND_MAIN"></div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="TAB_GENERAL/LABEL_ATTACHMENT_SIZE_LIMIT"></label>
|
||||
<div class="controls">
|
||||
<input type="number" min="1" step="1" class="span1" data-bind="textInput: mainAttachmentLimit"/>
|
||||
|
||||
<span data-i18n="MB"></span>
|
||||
<span data-bind="saveTrigger: attachmentLimitTrigger"></span>
|
||||
<br />
|
||||
<br />
|
||||
<span class="well" data-bind="visible: '' !== uploadDataDesc">
|
||||
<b>PHP:</b>
|
||||
|
||||
<span data-bind="text: uploadDataDesc"></span>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row" data-bind="visible: weakPassword">
|
||||
<div class="alert alert-warning span8" style="margin-top: 10px;">
|
||||
<h4 data-i18n="TAB_GENERAL/ALERT_WARNING"></h4>
|
||||
<br />
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'TAB_GENERAL/LABEL_ALLOW_ADDITIONAL_ACCOUNTS',
|
||||
value: capaAdditionalAccounts
|
||||
}
|
||||
}"></div>
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'TAB_GENERAL/LABEL_ALLOW_IDENTITIES',
|
||||
value: capaIdentities
|
||||
}
|
||||
}"></div>
|
||||
</div>
|
||||
<div data-i18n="[html]TAB_GENERAL/HTML_ALERT_WEAK_PASSWORD"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row" data-bind="visible: dataFolderAccess">
|
||||
<div class="alert alert-error span8" style="margin-top: 10px;">
|
||||
<h4 data-i18n="TAB_GENERAL/ALERT_WARNING"></h4>
|
||||
<br />
|
||||
<span data-i18n="TAB_GENERAL/ALERT_DATA_ACCESS"></span>
|
||||
|
||||
<a href="https://www.rainloop.net/docs/installation/#notice"
|
||||
target="_blank"><strong>https://www.rainloop.net/docs/installation</strong></a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-horizontal">
|
||||
<div class="legend" data-i18n="TAB_GENERAL/LEGEND_INTERFACE"></div>
|
||||
<div class="control-group" style="margin-bottom: 10px;">
|
||||
<label class="control-label" data-i18n="TAB_GENERAL/LABEL_LANGUAGE"></label>
|
||||
<div class="controls">
|
||||
<span class="select" tabindex="0" data-bind="text: languageFullName, click: selectLanguage, onSpace: selectLanguage, onEnter: selectLanguage"></span>
|
||||
<span data-bind="saveTrigger: languageTrigger"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="TAB_GENERAL/LABEL_LANGUAGE_ADMIN"></label>
|
||||
<div class="controls">
|
||||
<span class="select" tabindex="0" data-bind="text: languageAdminFullName, click: selectLanguageAdmin, onSpace: selectLanguageAdmin, onEnter: selectLanguageAdmin"></span>
|
||||
<span data-bind="saveTrigger: languageAdminTrigger"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="TAB_GENERAL/LABEL_THEME"></label>
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Select',
|
||||
params: {
|
||||
options: themesOptions,
|
||||
value: theme,
|
||||
trigger: themeTrigger,
|
||||
optionsText: 'optText',
|
||||
optionsValue: 'optValue',
|
||||
size: 2
|
||||
}
|
||||
}"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'TAB_GENERAL/LABEL_ALLOW_LANGUAGES_ON_SETTINGS',
|
||||
value: allowLanguagesOnSettings
|
||||
}
|
||||
}"></div>
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'TAB_GENERAL/LABEL_ALLOW_THEMES_ON_SETTINGS',
|
||||
value: capaThemes
|
||||
}
|
||||
}"></div>
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'TAB_GENERAL/LABEL_ALLOW_BACKGROUND_ON_SETTINGS',
|
||||
value: capaUserBackground
|
||||
}
|
||||
}"></div>
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'TAB_GENERAL/LABEL_NEW_FOLDER_MOVE',
|
||||
value: newMoveToFolder
|
||||
}
|
||||
}"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'TAB_GENERAL/LABEL_SHOW_THUMBNAILS',
|
||||
value: capaAttachmentThumbnails,
|
||||
inline: false
|
||||
}
|
||||
}"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="legend" data-i18n="TAB_GENERAL/LEGEND_MAIN"></div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="TAB_GENERAL/LABEL_ATTACHMENT_SIZE_LIMIT"></label>
|
||||
<div class="controls">
|
||||
<input type="number" min="1" step="1" class="span1" data-bind="textInput: mainAttachmentLimit"/>
|
||||
|
||||
<span data-i18n="MB"></span>
|
||||
<span data-bind="saveTrigger: attachmentLimitTrigger"></span>
|
||||
<br />
|
||||
<br />
|
||||
<span class="well" data-bind="visible: '' !== uploadDataDesc">
|
||||
<b>PHP:</b>
|
||||
|
||||
<span data-bind="text: uploadDataDesc"></span>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<br />
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'TAB_GENERAL/LABEL_ALLOW_ADDITIONAL_ACCOUNTS',
|
||||
value: capaAdditionalAccounts
|
||||
}
|
||||
}"></div>
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'TAB_GENERAL/LABEL_ALLOW_IDENTITIES',
|
||||
value: capaIdentities
|
||||
}
|
||||
}"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,38 +1,36 @@
|
|||
<div class="b-admin-general">
|
||||
<div class="form-horizontal">
|
||||
<div class="legend" data-i18n="TAB_LOGIN/LEGEND_LOGIN_SCREEN"></div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="TAB_LOGIN/LABEL_DEFAULT_DOMAIN"></label>
|
||||
<div class="controls" data-bind="component: {
|
||||
name: 'Input',
|
||||
params: {
|
||||
value: defaultDomain,
|
||||
trigger: defaultDomain.trigger,
|
||||
size: 3
|
||||
}
|
||||
<div class="form-horizontal">
|
||||
<div class="legend" data-i18n="TAB_LOGIN/LEGEND_LOGIN_SCREEN"></div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="TAB_LOGIN/LABEL_DEFAULT_DOMAIN"></label>
|
||||
<div class="controls" data-bind="component: {
|
||||
name: 'Input',
|
||||
params: {
|
||||
value: defaultDomain,
|
||||
trigger: defaultDomain.trigger,
|
||||
size: 3
|
||||
}
|
||||
}"></div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: { value: determineUserDomain, label: 'TAB_LOGIN/LABEL_DETERMINE_USER_DOMAIN' }
|
||||
}"></div>
|
||||
<br />
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: { value: allowLanguagesOnLogin, label: 'TAB_LOGIN/LABEL_ALLOW_LANGUAGES_ON_LOGIN' }
|
||||
}"></div>
|
||||
<div data-bind="visible: allowLanguagesOnLogin, component: {
|
||||
name: 'Checkbox',
|
||||
params: { enable: allowLanguagesOnLogin, value: determineUserLanguage, label: 'TAB_LOGIN/LABEL_DETERMINE_USER_LANGUAGE' }
|
||||
}"></div>
|
||||
<br />
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: { value: hideSubmitButton, label: 'TAB_LOGIN/LABEL_HIDE_SUBMIT_BUTTON' }
|
||||
}"></div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: { value: determineUserDomain, label: 'TAB_LOGIN/LABEL_DETERMINE_USER_DOMAIN' }
|
||||
}"></div>
|
||||
<br />
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: { value: allowLanguagesOnLogin, label: 'TAB_LOGIN/LABEL_ALLOW_LANGUAGES_ON_LOGIN' }
|
||||
}"></div>
|
||||
<div data-bind="visible: allowLanguagesOnLogin, component: {
|
||||
name: 'Checkbox',
|
||||
params: { enable: allowLanguagesOnLogin, value: determineUserLanguage, label: 'TAB_LOGIN/LABEL_DETERMINE_USER_LANGUAGE' }
|
||||
}"></div>
|
||||
<br />
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: { value: hideSubmitButton, label: 'TAB_LOGIN/LABEL_HIDE_SUBMIT_BUTTON' }
|
||||
}"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,46 +1,42 @@
|
|||
<div class="b-admin-packages">
|
||||
|
||||
<div class="legend">
|
||||
<span data-i18n="TABS_LABELS/LABEL_PACKAGES_NAME"></span>
|
||||
<i class="icon-spinner" style="margin: 5px" data-bind="visible: packages.loading"></i>
|
||||
</div>
|
||||
|
||||
<div class="alert" style="margin-top: 10px;" data-bind="visible: !packages.real() && !packages.loading()">
|
||||
<div data-i18n="TAB_PACKAGES/ALERT_CANNOT_ACCESS_REPOSITORY"></div>
|
||||
<!-- ko text: packages.error() --><!-- /ko -->
|
||||
</div>
|
||||
|
||||
<div class="alert" style="margin-top: 10px;" data-bind="visible: '' !== packagesError()">
|
||||
<button type="button" class="close" data-bind="click: function () { packagesError('') }">×</button>
|
||||
<span data-bind="text: packagesError"></span>
|
||||
</div>
|
||||
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: { value: enabledPlugins, label: 'TAB_PACKAGES/LABEL_ENABLE_PLUGINS' }
|
||||
}"></div>
|
||||
|
||||
<br />
|
||||
|
||||
<div data-bind="visible: 0 < packagesAvailableForUpdate().length">
|
||||
<div class="legend">
|
||||
<span data-i18n="TAB_PACKAGES/LEGEND_AVAILABLE_FOR_UPDATE"></span>
|
||||
(<span data-bind="text: packagesAvailableForUpdate().length"></span>)
|
||||
</div>
|
||||
<div data-bind="template: { name: 'AdminSettingsPackagesTable', data: {f: packagesAvailableForUpdate} }"></div>
|
||||
<br />
|
||||
</div>
|
||||
|
||||
<div id="packages-installed" data-bind="visible: 0 < packagesCurrent().length, css: {'disabled': !enabledPlugins()}">
|
||||
<div class="legend" data-i18n="TAB_PACKAGES/LEGEND_INSTALLED_PACKAGES"></div>
|
||||
<div data-bind="template: { name: 'AdminSettingsPackagesTable', data: {f: packagesCurrent} }"></div>
|
||||
<br />
|
||||
</div>
|
||||
|
||||
<div data-bind="visible: 0 < packagesAvailableForInstallation().length">
|
||||
<div class="legend" data-i18n="TAB_PACKAGES/LEGEND_AVAILABLE_FOR_INSTALLATION"></div>
|
||||
<div data-bind="template: { name: 'AdminSettingsPackagesTable', data: {f: packagesAvailableForInstallation} }"></div>
|
||||
<br />
|
||||
</div>
|
||||
|
||||
<div class="legend">
|
||||
<span data-i18n="TABS_LABELS/LABEL_PACKAGES_NAME"></span>
|
||||
<i class="icon-spinner" style="margin: 5px" data-bind="visible: packages.loading"></i>
|
||||
</div>
|
||||
|
||||
<div class="alert" style="margin-top: 10px;" data-bind="visible: !packages.real() && !packages.loading()">
|
||||
<div data-i18n="TAB_PACKAGES/ALERT_CANNOT_ACCESS_REPOSITORY"></div>
|
||||
<!-- ko text: packages.error() --><!-- /ko -->
|
||||
</div>
|
||||
|
||||
<div class="alert" style="margin-top: 10px;" data-bind="visible: '' !== packagesError()">
|
||||
<button type="button" class="close" data-bind="click: function () { packagesError('') }">×</button>
|
||||
<span data-bind="text: packagesError"></span>
|
||||
</div>
|
||||
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: { value: enabledPlugins, label: 'TAB_PACKAGES/LABEL_ENABLE_PLUGINS' }
|
||||
}"></div>
|
||||
|
||||
<br />
|
||||
|
||||
<div data-bind="visible: 0 < packagesAvailableForUpdate().length">
|
||||
<div class="legend">
|
||||
<span data-i18n="TAB_PACKAGES/LEGEND_AVAILABLE_FOR_UPDATE"></span>
|
||||
(<span data-bind="text: packagesAvailableForUpdate().length"></span>)
|
||||
</div>
|
||||
<div data-bind="template: { name: 'AdminSettingsPackagesTable', data: {f: packagesAvailableForUpdate} }"></div>
|
||||
<br />
|
||||
</div>
|
||||
|
||||
<div id="packages-installed" data-bind="visible: 0 < packagesCurrent().length, css: {'disabled': !enabledPlugins()}">
|
||||
<div class="legend" data-i18n="TAB_PACKAGES/LEGEND_INSTALLED_PACKAGES"></div>
|
||||
<div data-bind="template: { name: 'AdminSettingsPackagesTable', data: {f: packagesCurrent} }"></div>
|
||||
<br />
|
||||
</div>
|
||||
|
||||
<div data-bind="visible: 0 < packagesAvailableForInstallation().length">
|
||||
<div class="legend" data-i18n="TAB_PACKAGES/LEGEND_AVAILABLE_FOR_INSTALLATION"></div>
|
||||
<div data-bind="template: { name: 'AdminSettingsPackagesTable', data: {f: packagesAvailableForInstallation} }"></div>
|
||||
<br />
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,91 +1,89 @@
|
|||
<div class="g-ui-user-select-none">
|
||||
<div class="legend" data-i18n="TAB_SECURITY/LEGEND_SECURITY"></div>
|
||||
<div class="form-horizontal">
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
value: useLocalProxyForExternalImages,
|
||||
label: 'TAB_SECURITY/LABEL_USE_IMAGE_PROXY'
|
||||
}
|
||||
}"></div>
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
value: capaOpenPGP,
|
||||
label: 'TAB_SECURITY/LABEL_ALLOW_OPEN_PGP',
|
||||
inline: true
|
||||
}
|
||||
}"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<br />
|
||||
<div class="form-horizontal">
|
||||
<div class="legend" data-i18n="TAB_SECURITY/LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS"></div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="TAB_SECURITY/LABEL_CURRENT_PASSWORD"></label>
|
||||
<div class="controls">
|
||||
<input type="password" autocomplete="current-password" autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
data-bind="textInput: adminPassword" />
|
||||
</div>
|
||||
</div>
|
||||
<br />
|
||||
<div class="control-group" data-bind="css: {'error': adminLoginError}">
|
||||
<label class="control-label" data-i18n="TAB_SECURITY/LABEL_NEW_LOGIN"></label>
|
||||
<div class="controls">
|
||||
<input type="text" autocomplete="username" autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
data-bind="textInput: adminLogin" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group" data-bind="css: {'error': adminPasswordNewError}">
|
||||
<label class="control-label" data-i18n="TAB_SECURITY/LABEL_NEW_PASSWORD"></label>
|
||||
<div class="controls">
|
||||
<input type="password" autocomplete="new-password" autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
data-bind="textInput: adminPasswordNew" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group" data-bind="css: {'error': adminPasswordNewError}">
|
||||
<label class="control-label" data-i18n="TAB_SECURITY/LABEL_REPEAT_PASSWORD"></label>
|
||||
<div class="controls">
|
||||
<input type="password" autocomplete="new-password" autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
data-bind="textInput: adminPasswordNew2" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<a class="btn" data-bind="command: saveNewAdminPasswordCommand, css: { 'btn-success': adminPasswordUpdateSuccess, 'btn-danger': adminPasswordUpdateError }">
|
||||
<i class="fontastic">🔑</i>
|
||||
<span data-i18n="TAB_SECURITY/BUTTON_UPDATE_PASSWORD"></span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-horizontal">
|
||||
<div class="legend" data-i18n="TAB_SECURITY/LEGEND_SSL"></div>
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
value: verifySslCertificate,
|
||||
label: 'TAB_SECURITY/LABEL_REQUIRE_VERIFICATION',
|
||||
inline: true
|
||||
}
|
||||
}"></div>
|
||||
|
||||
<span style="color:red">(<span data-i18n="HINTS/UNSTABLE"></span>)</span>
|
||||
<br />
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
enable: verifySslCertificate,
|
||||
value: allowSelfSigned,
|
||||
label: 'TAB_SECURITY/LABEL_ALLOW_SELF_SIGNED'
|
||||
}
|
||||
}"></div>
|
||||
</div>
|
||||
<div class="legend" data-i18n="TAB_SECURITY/LEGEND_SECURITY"></div>
|
||||
<div class="form-horizontal">
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
value: useLocalProxyForExternalImages,
|
||||
label: 'TAB_SECURITY/LABEL_USE_IMAGE_PROXY'
|
||||
}
|
||||
}"></div>
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
value: capaOpenPGP,
|
||||
label: 'TAB_SECURITY/LABEL_ALLOW_OPEN_PGP',
|
||||
inline: true
|
||||
}
|
||||
}"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<br />
|
||||
<div class="form-horizontal">
|
||||
<div class="legend" data-i18n="TAB_SECURITY/LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS"></div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="TAB_SECURITY/LABEL_CURRENT_PASSWORD"></label>
|
||||
<div class="controls">
|
||||
<input type="password" autocomplete="current-password" autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
data-bind="textInput: adminPassword" />
|
||||
</div>
|
||||
</div>
|
||||
<br />
|
||||
<div class="control-group" data-bind="css: {'error': adminLoginError}">
|
||||
<label class="control-label" data-i18n="TAB_SECURITY/LABEL_NEW_LOGIN"></label>
|
||||
<div class="controls">
|
||||
<input type="text" autocomplete="username" autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
data-bind="textInput: adminLogin" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group" data-bind="css: {'error': adminPasswordNewError}">
|
||||
<label class="control-label" data-i18n="TAB_SECURITY/LABEL_NEW_PASSWORD"></label>
|
||||
<div class="controls">
|
||||
<input type="password" autocomplete="new-password" autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
data-bind="textInput: adminPasswordNew" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group" data-bind="css: {'error': adminPasswordNewError}">
|
||||
<label class="control-label" data-i18n="TAB_SECURITY/LABEL_REPEAT_PASSWORD"></label>
|
||||
<div class="controls">
|
||||
<input type="password" autocomplete="new-password" autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
data-bind="textInput: adminPasswordNew2" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<a class="btn" data-bind="command: saveNewAdminPasswordCommand, css: { 'btn-success': adminPasswordUpdateSuccess, 'btn-danger': adminPasswordUpdateError }">
|
||||
<i class="fontastic">🔑</i>
|
||||
<span data-i18n="TAB_SECURITY/BUTTON_UPDATE_PASSWORD"></span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-horizontal">
|
||||
<div class="legend" data-i18n="TAB_SECURITY/LEGEND_SSL"></div>
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
value: verifySslCertificate,
|
||||
label: 'TAB_SECURITY/LABEL_REQUIRE_VERIFICATION',
|
||||
inline: true
|
||||
}
|
||||
}"></div>
|
||||
|
||||
<span style="color:red">(<span data-i18n="HINTS/UNSTABLE"></span>)</span>
|
||||
<br />
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
enable: verifySslCertificate,
|
||||
value: allowSelfSigned,
|
||||
label: 'TAB_SECURITY/LABEL_ALLOW_SELF_SIGNED'
|
||||
}
|
||||
}"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,56 +1,54 @@
|
|||
<div class="b-settings-accounts g-ui-user-select-none">
|
||||
<div data-bind="visible: allowAdditionalAccount">
|
||||
<div class="legend">
|
||||
<span data-i18n="SETTINGS_ACCOUNTS/LEGEND_ACCOUNTS"></span>
|
||||
|
||||
<i class="icon-spinner" style="margin-top: 5px" data-bind="visible: loading"></i>
|
||||
</div>
|
||||
<a class="btn" data-bind="click: addNewAccount">
|
||||
<i class="icon-user-add"></i>
|
||||
<span data-i18n="SETTINGS_ACCOUNTS/BUTTON_ADD_ACCOUNT"></span>
|
||||
</a>
|
||||
<table class="table table-hover list-table accounts-list" data-bind="i18nUpdate: accounts">
|
||||
<tbody data-bind="foreach: accounts">
|
||||
<tr draggable="true" data-bind="sortableItem: { list: $root.accounts, afterMove: $root.accountsAndIdentitiesAfterMove }">
|
||||
<td class="e-action" data-bind="css: {'e-action': canBeEdit}">
|
||||
<i class="fontastic drag-handle">⬍</i>
|
||||
<span class="account-name" data-bind="text: email"></span>
|
||||
</td>
|
||||
<td>
|
||||
<a class="btn btn-small btn-small-small btn-danger pull-right button-confirm-delete button-delete-transitions" data-bind="visible: canBeDeleted, css: {'delete-access': deleteAccess}, click: function(oAccount) { $root.deleteAccount(oAccount); }"
|
||||
data-i18n="GLOBAL/ARE_YOU_SURE"></a>
|
||||
</td>
|
||||
<td>
|
||||
<span class="delete fontastic" data-bind="visible: !deleteAccess() && canBeDeleted(), click: function (oAccount) { $root.accountForDeletion(oAccount); }">🗑</span>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div data-bind="visible: allowIdentities">
|
||||
<div class="legend" data-i18n="SETTINGS_ACCOUNTS/LEGEND_IDENTITIES"></div>
|
||||
<a class="btn" data-bind="click: addNewIdentity">
|
||||
<i class="icon-user-add"></i>
|
||||
<span data-i18n="SETTINGS_ACCOUNTS/BUTTON_ADD_IDENTITY"></span>
|
||||
</a>
|
||||
<table class="table table-hover list-table identities-list" data-bind="i18nUpdate: identities">
|
||||
<tbody data-bind="foreach: identities">
|
||||
<tr draggable="true" data-bind="sortableItem: { list: $root.identities, afterMove: $root.accountsAndIdentitiesAfterMove }">
|
||||
<td class="e-action">
|
||||
<i class="fontastic drag-handle">⬍</i>
|
||||
<span class="identity-name" data-bind="text: formattedName()"></span>
|
||||
|
||||
<span class="identity-default" data-bind="visible: 0 === $index()" data-i18n="SETTINGS_ACCOUNTS/DEFAULT_IDENTITY_LABEL"></span>
|
||||
</td>
|
||||
<td>
|
||||
<a class="btn btn-small btn-small-small btn-danger pull-right button-confirm-delete button-delete-transitions" data-bind="visible: canBeDeleted, css: {'delete-access': deleteAccess}, click: function(oIdentity) { $root.deleteIdentity(oIdentity); }"
|
||||
data-i18n="GLOBAL/ARE_YOU_SURE"></a>
|
||||
</td>
|
||||
<td>
|
||||
<span class="delete fontastic" data-bind="visible: !deleteAccess() && canBeDeleted(), click: function (oIdentity) { $root.identityForDeletion(oIdentity); }">🗑</span>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div data-bind="visible: allowAdditionalAccount">
|
||||
<div class="legend">
|
||||
<span data-i18n="SETTINGS_ACCOUNTS/LEGEND_ACCOUNTS"></span>
|
||||
|
||||
<i class="icon-spinner" style="margin-top: 5px" data-bind="visible: loading"></i>
|
||||
</div>
|
||||
<a class="btn" data-bind="click: addNewAccount">
|
||||
<i class="icon-user-add"></i>
|
||||
<span data-i18n="SETTINGS_ACCOUNTS/BUTTON_ADD_ACCOUNT"></span>
|
||||
</a>
|
||||
<table class="table table-hover list-table accounts-list" data-bind="i18nUpdate: accounts">
|
||||
<tbody data-bind="foreach: accounts">
|
||||
<tr draggable="true" data-bind="sortableItem: { list: $root.accounts, afterMove: $root.accountsAndIdentitiesAfterMove }">
|
||||
<td class="e-action" data-bind="css: {'e-action': canBeEdit}">
|
||||
<i class="fontastic drag-handle">⬍</i>
|
||||
<span class="account-name" data-bind="text: email"></span>
|
||||
</td>
|
||||
<td>
|
||||
<a class="btn btn-small btn-small-small btn-danger pull-right button-confirm-delete button-delete-transitions" data-bind="visible: canBeDeleted, css: {'delete-access': deleteAccess}, click: function(oAccount) { $root.deleteAccount(oAccount); }"
|
||||
data-i18n="GLOBAL/ARE_YOU_SURE"></a>
|
||||
</td>
|
||||
<td>
|
||||
<span class="delete fontastic" data-bind="visible: !deleteAccess() && canBeDeleted(), click: function (oAccount) { $root.accountForDeletion(oAccount); }">🗑</span>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div data-bind="visible: allowIdentities">
|
||||
<div class="legend" data-i18n="SETTINGS_ACCOUNTS/LEGEND_IDENTITIES"></div>
|
||||
<a class="btn" data-bind="click: addNewIdentity">
|
||||
<i class="icon-user-add"></i>
|
||||
<span data-i18n="SETTINGS_ACCOUNTS/BUTTON_ADD_IDENTITY"></span>
|
||||
</a>
|
||||
<table class="table table-hover list-table identities-list" data-bind="i18nUpdate: identities">
|
||||
<tbody data-bind="foreach: identities">
|
||||
<tr draggable="true" data-bind="sortableItem: { list: $root.identities, afterMove: $root.accountsAndIdentitiesAfterMove }">
|
||||
<td class="e-action">
|
||||
<i class="fontastic drag-handle">⬍</i>
|
||||
<span class="identity-name" data-bind="text: formattedName()"></span>
|
||||
|
||||
<span class="identity-default" data-bind="visible: 0 === $index()" data-i18n="SETTINGS_ACCOUNTS/DEFAULT_IDENTITY_LABEL"></span>
|
||||
</td>
|
||||
<td>
|
||||
<a class="btn btn-small btn-small-small btn-danger pull-right button-confirm-delete button-delete-transitions" data-bind="visible: canBeDeleted, css: {'delete-access': deleteAccess}, click: function(oIdentity) { $root.deleteIdentity(oIdentity); }"
|
||||
data-i18n="GLOBAL/ARE_YOU_SURE"></a>
|
||||
</td>
|
||||
<td>
|
||||
<span class="delete fontastic" data-bind="visible: !deleteAccess() && canBeDeleted(), click: function (oIdentity) { $root.identityForDeletion(oIdentity); }">🗑</span>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,49 +1,47 @@
|
|||
<div class="b-settings-contacts">
|
||||
<div class="form-horizontal g-ui-user-select-none">
|
||||
<div class="legend" data-i18n="GLOBAL/CONTACTS"></div>
|
||||
<div class="control-group">
|
||||
<div class="controls" data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'SETTINGS_CONTACTS/LABEL_CONTACTS_AUTOSAVE',
|
||||
value: contactsAutosave
|
||||
}
|
||||
}"></div>
|
||||
</div>
|
||||
</div>
|
||||
<br />
|
||||
<div class="form-horizontal" data-bind="visible: allowContactsSync">
|
||||
<div class="legend" data-i18n="SETTINGS_CONTACTS/LEGEND_CONTACTS_SYNC"></div>
|
||||
<div class="control-group">
|
||||
<div class="controls" data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'SETTINGS_CONTACTS/LABEL_CONTACTS_SYNC_ENABLE',
|
||||
value: enableContactsSync
|
||||
}
|
||||
}"></div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="SETTINGS_CONTACTS/LABEL_CONTACTS_SYNC_AB_URL"></label>
|
||||
<div class="controls">
|
||||
<input type="text" class="input-xxlarge" autocomplete="off" autocorrect="off" autocapitalize="off"
|
||||
spellcheck="false" data-bind="value: contactsSyncUrl" placeholder="https://" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="SETTINGS_CONTACTS/LABEL_CONTACTS_SYNC_USER"></label>
|
||||
<div class="controls">
|
||||
<input type="text" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
data-bind="value: contactsSyncUser" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="GLOBAL/PASSWORD"></label>
|
||||
<div class="controls">
|
||||
<input type="password" autocomplete="current-password" autocorrect="off" autocapitalize="off"
|
||||
spellcheck="false" data-bind="value: contactsSyncPass" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-horizontal">
|
||||
<div class="legend" data-i18n="GLOBAL/CONTACTS"></div>
|
||||
<div class="control-group">
|
||||
<div class="controls" data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'SETTINGS_CONTACTS/LABEL_CONTACTS_AUTOSAVE',
|
||||
value: contactsAutosave
|
||||
}
|
||||
}"></div>
|
||||
</div>
|
||||
</div>
|
||||
<br />
|
||||
<div class="form-horizontal" data-bind="visible: allowContactsSync">
|
||||
<div class="legend" data-i18n="SETTINGS_CONTACTS/LEGEND_CONTACTS_SYNC"></div>
|
||||
<div class="control-group">
|
||||
<div class="controls" data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'SETTINGS_CONTACTS/LABEL_CONTACTS_SYNC_ENABLE',
|
||||
value: enableContactsSync
|
||||
}
|
||||
}"></div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="SETTINGS_CONTACTS/LABEL_CONTACTS_SYNC_AB_URL"></label>
|
||||
<div class="controls">
|
||||
<input type="text" class="input-xxlarge" autocomplete="off" autocorrect="off" autocapitalize="off"
|
||||
spellcheck="false" data-bind="value: contactsSyncUrl" placeholder="https://" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="SETTINGS_CONTACTS/LABEL_CONTACTS_SYNC_USER"></label>
|
||||
<div class="controls">
|
||||
<input type="text" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
data-bind="value: contactsSyncUser" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="GLOBAL/PASSWORD"></label>
|
||||
<div class="controls">
|
||||
<input type="password" autocomplete="current-password" autocorrect="off" autocapitalize="off"
|
||||
spellcheck="false" data-bind="value: contactsSyncPass" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,41 +1,39 @@
|
|||
<div class="b-settings-filters g-ui-user-select-none">
|
||||
<div class="form-horizontal">
|
||||
<div class="legend">
|
||||
<span data-i18n="SETTINGS_FILTERS/LEGEND_FILTERS"></span>
|
||||
|
||||
<i class="icon-spinner" style="margin-top: 5px" data-bind="visible: loading"></i>
|
||||
</div>
|
||||
<div class="form-horizontal">
|
||||
<div class="legend">
|
||||
<span data-i18n="SETTINGS_FILTERS/LEGEND_FILTERS"></span>
|
||||
|
||||
<i class="icon-spinner" style="margin-top: 5px" data-bind="visible: loading"></i>
|
||||
</div>
|
||||
<div class="alert alert-error g-ui-user-select-none" data-bind="visible: serverError">
|
||||
<i class="fontastic">⚠</i>
|
||||
<span data-bind="text: serverErrorDesc"></span>
|
||||
</div>
|
||||
<table class="table table-hover list-table g-ui-user-select-none"
|
||||
data-bind="i18nUpdate: scripts">
|
||||
<colgroup>
|
||||
<col style="width: 30px" />
|
||||
<col />
|
||||
<col style="width: 140px" />
|
||||
<col style="width: 1%" />
|
||||
</colgroup>
|
||||
<tbody data-bind="foreach: scripts">
|
||||
<tr class="script-item">
|
||||
<td>
|
||||
<span class="disabled-script fontastic" data-bind="click: function (oScript) { $root.toggleScript(oScript); }, text: active() ? '☑' : '☐'"></span>
|
||||
</td>
|
||||
<td class="e-action" class="script-name" data-bind="text: name()"></td>
|
||||
<td>
|
||||
<a class="btn btn-small btn-small-small btn-danger pull-right button-confirm-delete button-delete-transitions" data-bind="css: {'delete-access': deleteAccess()}, click: function(oScript) { $root.deleteScript(oScript); }"
|
||||
data-i18n="GLOBAL/ARE_YOU_SURE"></a>
|
||||
</td>
|
||||
<td>
|
||||
<span class="delete-script fontastic" data-bind="visible: !deleteAccess() && canBeDeleted(), click: function (oScript) { $root.scriptForDeletion(oScript); }">🗑</span>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<a class="btn" data-bind="click: $root.addScript">
|
||||
<i class="fontastic">✚</i>
|
||||
<span data-i18n="SETTINGS_FILTERS/BUTTON_ADD_SCRIPT"></span>
|
||||
</a>
|
||||
</div>
|
||||
<div class="alert alert-error g-ui-user-select-none" data-bind="visible: serverError">
|
||||
<i class="fontastic">⚠</i>
|
||||
<span data-bind="text: serverErrorDesc"></span>
|
||||
</div>
|
||||
<table class="table table-hover list-table g-ui-user-select-none"
|
||||
data-bind="i18nUpdate: scripts">
|
||||
<colgroup>
|
||||
<col style="width: 30px" />
|
||||
<col />
|
||||
<col style="width: 140px" />
|
||||
<col style="width: 1%" />
|
||||
</colgroup>
|
||||
<tbody data-bind="foreach: scripts">
|
||||
<tr class="script-item">
|
||||
<td>
|
||||
<span class="disabled-script fontastic" data-bind="click: function (oScript) { $root.toggleScript(oScript); }, text: active() ? '☑' : '☐'"></span>
|
||||
</td>
|
||||
<td class="e-action" class="script-name" data-bind="text: name()"></td>
|
||||
<td>
|
||||
<a class="btn btn-small btn-small-small btn-danger pull-right button-confirm-delete button-delete-transitions" data-bind="css: {'delete-access': deleteAccess()}, click: function(oScript) { $root.deleteScript(oScript); }"
|
||||
data-i18n="GLOBAL/ARE_YOU_SURE"></a>
|
||||
</td>
|
||||
<td>
|
||||
<span class="delete-script fontastic" data-bind="visible: !deleteAccess() && canBeDeleted(), click: function (oScript) { $root.scriptForDeletion(oScript); }">🗑</span>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<a class="btn" data-bind="click: $root.addScript">
|
||||
<i class="fontastic">✚</i>
|
||||
<span data-i18n="SETTINGS_FILTERS/BUTTON_ADD_SCRIPT"></span>
|
||||
</a>
|
||||
|
|
|
|||
|
|
@ -1,35 +1,33 @@
|
|||
<div class="b-settings-folders">
|
||||
<div class="legend">
|
||||
<span data-i18n="SETTINGS_FOLDERS/LEGEND_FOLDERS"></span>
|
||||
|
||||
<i class="icon-spinner" style="margin-top: 5px" data-bind="visible: loading"></i>
|
||||
</div>
|
||||
<div style="border-bottom: 1px solid rgba(128,128,128,0.5);margin-bottom:20px;" data-bind="visible: useImapSubscribe, component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'SETTINGS_FOLDERS/HIDE_UNSUBSCRIBED',
|
||||
value: hideUnsubscribed
|
||||
}
|
||||
}"></div>
|
||||
<a class="btn" data-bind="click: createFolder">
|
||||
<i class="icon-folder-add"></i>
|
||||
<span data-i18n="SETTINGS_FOLDERS/BUTTON_CREATE"></span>
|
||||
</a>
|
||||
|
||||
<a class="btn" data-bind="click: systemFolder">
|
||||
<i class="fontastic">🔧</i>
|
||||
<span data-i18n="SETTINGS_FOLDERS/BUTTON_SYSTEM"></span>
|
||||
</a>
|
||||
<div class="alert folders-list-error" data-bind="visible: folderListOptimized">
|
||||
<b data-i18n="SETTINGS_FOLDERS/TO_MANY_FOLDERS_DESC_1"></b>
|
||||
<br />
|
||||
<span data-i18n="SETTINGS_FOLDERS/TO_MANY_FOLDERS_DESC_2"></span>
|
||||
</div>
|
||||
<div class="alert folders-list-error" data-bind="visible: '' !== folderListError()">
|
||||
<button type="button" class="close" data-bind="click: function () { folderListError(''); }">×</button>
|
||||
<span data-bind="text: folderListError"></span>
|
||||
</div>
|
||||
<table class="table table-hover list-table" data-bind="i18nUpdate: folderList">
|
||||
<tbody data-bind="template: { name: 'SettingsFolderItem', foreach: folderList }"></tbody>
|
||||
</table>
|
||||
<div class="legend">
|
||||
<span data-i18n="SETTINGS_FOLDERS/LEGEND_FOLDERS"></span>
|
||||
|
||||
<i class="icon-spinner" style="margin-top: 5px" data-bind="visible: loading"></i>
|
||||
</div>
|
||||
<div style="border-bottom: 1px solid rgba(128,128,128,0.5);margin-bottom:20px;" data-bind="visible: useImapSubscribe, component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'SETTINGS_FOLDERS/HIDE_UNSUBSCRIBED',
|
||||
value: hideUnsubscribed
|
||||
}
|
||||
}"></div>
|
||||
<a class="btn" data-bind="click: createFolder">
|
||||
<i class="icon-folder-add"></i>
|
||||
<span data-i18n="SETTINGS_FOLDERS/BUTTON_CREATE"></span>
|
||||
</a>
|
||||
|
||||
<a class="btn" data-bind="click: systemFolder">
|
||||
<i class="fontastic">🔧</i>
|
||||
<span data-i18n="SETTINGS_FOLDERS/BUTTON_SYSTEM"></span>
|
||||
</a>
|
||||
<div class="alert folders-list-error" data-bind="visible: folderListOptimized">
|
||||
<b data-i18n="SETTINGS_FOLDERS/TO_MANY_FOLDERS_DESC_1"></b>
|
||||
<br />
|
||||
<span data-i18n="SETTINGS_FOLDERS/TO_MANY_FOLDERS_DESC_2"></span>
|
||||
</div>
|
||||
<div class="alert folders-list-error" data-bind="visible: '' !== folderListError()">
|
||||
<button type="button" class="close" data-bind="click: function () { folderListError(''); }">×</button>
|
||||
<span data-bind="text: folderListError"></span>
|
||||
</div>
|
||||
<table class="table table-hover list-table" data-bind="i18nUpdate: folderList">
|
||||
<tbody data-bind="template: { name: 'SettingsFolderItem', foreach: folderList }"></tbody>
|
||||
</table>
|
||||
|
|
|
|||
|
|
@ -1,134 +1,132 @@
|
|||
<div class="b-settings-general g-ui-user-select-none">
|
||||
<div class="form-horizontal">
|
||||
<div class="legend" data-i18n="SETTINGS_GENERAL/LEGEND_GENERAL"></div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="SETTINGS_GENERAL/LABEL_IDENTITY"></label>
|
||||
<div class="controls">
|
||||
<b class="editMainIdentity" data-bind="click: editMainIdentity, text: identityMainDesc"></b>
|
||||
</div>
|
||||
<div class="form-horizontal">
|
||||
<div class="legend" data-i18n="SETTINGS_GENERAL/LEGEND_GENERAL"></div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="SETTINGS_GENERAL/LABEL_IDENTITY"></label>
|
||||
<div class="controls">
|
||||
<b class="editMainIdentity" data-bind="click: editMainIdentity, text: identityMainDesc"></b>
|
||||
</div>
|
||||
<div class="control-group" data-bind="visible: allowLanguagesOnSettings">
|
||||
<label class="control-label" data-i18n="SETTINGS_GENERAL/LABEL_LANGUAGE"></label>
|
||||
<div class="controls">
|
||||
<span class="select" tabindex="0" data-bind="text: languageFullName, click: selectLanguage, onSpace: selectLanguage, onEnter: selectLanguage"></span>
|
||||
<span data-bind="saveTrigger: languageTrigger"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group" data-bind="visible: allowLanguagesOnSettings">
|
||||
<label class="control-label" data-i18n="SETTINGS_GENERAL/LABEL_LANGUAGE"></label>
|
||||
<div class="controls">
|
||||
<span class="select" tabindex="0" data-bind="text: languageFullName, click: selectLanguage, onSpace: selectLanguage, onEnter: selectLanguage"></span>
|
||||
<span data-bind="saveTrigger: languageTrigger"></span>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="SETTINGS_GENERAL/LABEL_LAYOUT"></label>
|
||||
<div class="controls" data-bind="component: {
|
||||
name: 'Select',
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="SETTINGS_GENERAL/LABEL_LAYOUT"></label>
|
||||
<div class="controls" data-bind="component: {
|
||||
name: 'Select',
|
||||
params: {
|
||||
options: layoutTypes,
|
||||
value: layout,
|
||||
trigger: layoutTrigger,
|
||||
optionsText: 'name',
|
||||
optionsValue: 'id'
|
||||
}
|
||||
}"></div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="SETTINGS_GENERAL/LABEL_EDITOR"></label>
|
||||
<div class="controls" data-bind="component: {
|
||||
name: 'Select',
|
||||
params: {
|
||||
options: editorDefaultTypes,
|
||||
value: editorDefaultType,
|
||||
trigger: editorDefaultTypeTrigger,
|
||||
optionsText: 'name',
|
||||
optionsValue: 'id'
|
||||
}
|
||||
}"></div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="SETTINGS_GENERAL/LABEL_MESSAGE_PER_PAGE"></label>
|
||||
<div class="controls">
|
||||
<input type="number" min="10" max="50" step="1" class="span1" data-bind="textInput: messagesPerPage"/>
|
||||
|
||||
<span data-bind="saveTrigger: mppTrigger"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="SETTINGS_GENERAL/LABEL_MARK_MESSAGE_READ_AFTER"></label>
|
||||
<div class="controls">
|
||||
<input type="number" min="0" step="1" class="span1" data-bind="textInput: messageReadDelay"/>
|
||||
|
||||
<span data-i18n="SETTINGS_GENERAL/SECONDS"></label>
|
||||
<span data-bind="saveTrigger: messageReadDelayTrigger"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
options: layoutTypes,
|
||||
value: layout,
|
||||
trigger: layoutTrigger,
|
||||
optionsText: 'name',
|
||||
optionsValue: 'id'
|
||||
label: 'SETTINGS_GENERAL/LABEL_SHOW_IMAGES',
|
||||
value: showImages
|
||||
}
|
||||
}"></div>
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'SETTINGS_GENERAL/LABEL_REMOVE_COLORS',
|
||||
value: removeColors
|
||||
}
|
||||
}"></div>
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'SETTINGS_GENERAL/LABEL_USE_CHECKBOXES_IN_LIST',
|
||||
value: useCheckboxesInList
|
||||
}
|
||||
}"></div>
|
||||
<br />
|
||||
<div data-bind="visible: threadsAllowed, component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'SETTINGS_GENERAL/LABEL_USE_THREADS',
|
||||
value: useThreads
|
||||
}
|
||||
}"></div>
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'SETTINGS_GENERAL/LABEL_REPLY_SAME_FOLDER',
|
||||
value: replySameFolder
|
||||
}
|
||||
}"></div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="SETTINGS_GENERAL/LABEL_EDITOR"></label>
|
||||
<div class="controls" data-bind="component: {
|
||||
name: 'Select',
|
||||
params: {
|
||||
options: editorDefaultTypes,
|
||||
value: editorDefaultType,
|
||||
trigger: editorDefaultTypeTrigger,
|
||||
optionsText: 'name',
|
||||
optionsValue: 'id'
|
||||
}
|
||||
}"></div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="SETTINGS_GENERAL/LABEL_MESSAGE_PER_PAGE"></label>
|
||||
<div class="controls">
|
||||
<input type="number" min="10" max="50" step="1" class="span1" data-bind="textInput: messagesPerPage"/>
|
||||
|
||||
<span data-bind="saveTrigger: mppTrigger"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="SETTINGS_GENERAL/LABEL_MARK_MESSAGE_READ_AFTER"></label>
|
||||
<div class="controls">
|
||||
<input type="number" min="0" step="1" class="span1" data-bind="textInput: messageReadDelay"/>
|
||||
|
||||
<span data-i18n="SETTINGS_GENERAL/SECONDS"></label>
|
||||
<span data-bind="saveTrigger: messageReadDelayTrigger"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'SETTINGS_GENERAL/LABEL_SHOW_IMAGES',
|
||||
value: showImages
|
||||
}
|
||||
}"></div>
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'SETTINGS_GENERAL/LABEL_REMOVE_COLORS',
|
||||
value: removeColors
|
||||
}
|
||||
}"></div>
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'SETTINGS_GENERAL/LABEL_USE_CHECKBOXES_IN_LIST',
|
||||
value: useCheckboxesInList
|
||||
}
|
||||
}"></div>
|
||||
<br />
|
||||
<div data-bind="visible: threadsAllowed, component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'SETTINGS_GENERAL/LABEL_USE_THREADS',
|
||||
value: useThreads
|
||||
}
|
||||
}"></div>
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'SETTINGS_GENERAL/LABEL_REPLY_SAME_FOLDER',
|
||||
value: replySameFolder
|
||||
}
|
||||
}"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="legend" data-i18n="SETTINGS_GENERAL/LABEL_NOTIFICATIONS"></div>
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<div>
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'SETTINGS_GENERAL/LABEL_CHROME_NOTIFICATION_DESC',
|
||||
value: enableDesktopNotification,
|
||||
enable: isDesktopNotificationAllowed,
|
||||
inline: true
|
||||
}
|
||||
}"></div>
|
||||
|
||||
<span data-bind="visible: !isDesktopNotificationAllowed()" style="color: #999" data-i18n="SETTINGS_GENERAL/LABEL_CHROME_NOTIFICATION_DESC_DENIED"></span>
|
||||
<span class="fontastic" data-bind="click: testSystemNotification" style="color:green;cursor:pointer">▶️</span>
|
||||
</div>
|
||||
<div>
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'SETTINGS_GENERAL/LABEL_SOUND_NOTIFICATION',
|
||||
value: enableSoundNotification,
|
||||
inline: true
|
||||
}
|
||||
}"></div>
|
||||
|
||||
<select data-bind="options: notificationSounds, value: notificationSound"></select>
|
||||
|
||||
<span class="fontastic" data-bind="click: testSoundNotification" style="color:green;cursor:pointer">▶️</span>
|
||||
</div>
|
||||
<div class="legend" data-i18n="SETTINGS_GENERAL/LABEL_NOTIFICATIONS"></div>
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<div>
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'SETTINGS_GENERAL/LABEL_CHROME_NOTIFICATION_DESC',
|
||||
value: enableDesktopNotification,
|
||||
enable: isDesktopNotificationAllowed,
|
||||
inline: true
|
||||
}
|
||||
}"></div>
|
||||
|
||||
<span data-bind="visible: !isDesktopNotificationAllowed()" style="color: #999" data-i18n="SETTINGS_GENERAL/LABEL_CHROME_NOTIFICATION_DESC_DENIED"></span>
|
||||
<span class="fontastic" data-bind="click: testSystemNotification" style="color:green;cursor:pointer">▶️</span>
|
||||
</div>
|
||||
<div>
|
||||
<div data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'SETTINGS_GENERAL/LABEL_SOUND_NOTIFICATION',
|
||||
value: enableSoundNotification,
|
||||
inline: true
|
||||
}
|
||||
}"></div>
|
||||
|
||||
<select data-bind="options: notificationSounds, value: notificationSound"></select>
|
||||
|
||||
<span class="fontastic" data-bind="click: testSoundNotification" style="color:green;cursor:pointer">▶️</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,13 +1,9 @@
|
|||
<div class="b-settins-left">
|
||||
<div class="b-content">
|
||||
<nav data-bind="foreach: menu">
|
||||
<a data-bind="css: {'selected': selected }, attr: { 'href': $root.link(route), 'data-i18n': label }"></a>
|
||||
</nav>
|
||||
</div>
|
||||
<div class="b-content show-on-panel-disabled" data-bind="click: leftPanelDisabled.toggle()"></div>
|
||||
<div class="b-footer">
|
||||
<a class="btn buttonResize" data-bind="click: leftPanelDisabled.toggle()">
|
||||
<i data-bind="css: {'icon-resize-out': leftPanelDisabled(), 'icon-resize-in': !leftPanelDisabled()}"></i>
|
||||
</a>
|
||||
</div>
|
||||
<nav class="b-content" data-bind="foreach: menu">
|
||||
<a data-bind="css: {'selected': selected }, attr: { 'href': $root.link(route), 'data-i18n': label }"></a>
|
||||
</nav>
|
||||
<div class="b-content show-on-panel-disabled" data-bind="click: leftPanelDisabled.toggle()"></div>
|
||||
<div class="b-footer">
|
||||
<a class="btn buttonResize" data-bind="click: leftPanelDisabled.toggle()">
|
||||
<i data-bind="css: {'icon-resize-out': leftPanelDisabled(), 'icon-resize-in': !leftPanelDisabled()}"></i>
|
||||
</a>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,61 +1,59 @@
|
|||
<div class="b-settings-open-pgp g-ui-user-select-none">
|
||||
<div class="legend">OpenPGP</div>
|
||||
<button class="btn" data-bind="click: addOpenPgpKey">
|
||||
<i class="icon-list-add"></i>
|
||||
<span data-i18n="SETTINGS_OPEN_PGP/BUTTON_ADD_OPEN_PGP_KEY"></span>
|
||||
<div class="legend">OpenPGP</div>
|
||||
<button class="btn" data-bind="click: addOpenPgpKey">
|
||||
<i class="icon-list-add"></i>
|
||||
<span data-i18n="SETTINGS_OPEN_PGP/BUTTON_ADD_OPEN_PGP_KEY"></span>
|
||||
</button>
|
||||
|
||||
<div style="display: inline-block" data-i18n="[title]SETTINGS_OPEN_PGP/GENERATE_ONLY_HTTPS">
|
||||
<button class="btn" data-bind="click: generateOpenPgpKey">
|
||||
<i class="fontastic">🔑</i>
|
||||
<span data-i18n="SETTINGS_OPEN_PGP/BUTTON_GENERATE_OPEN_PGP_KEYS"></span>
|
||||
</button>
|
||||
|
||||
<div style="display: inline-block" data-i18n="[title]SETTINGS_OPEN_PGP/GENERATE_ONLY_HTTPS">
|
||||
<button class="btn" data-bind="click: generateOpenPgpKey">
|
||||
<i class="fontastic">🔑</i>
|
||||
<span data-i18n="SETTINGS_OPEN_PGP/BUTTON_GENERATE_OPEN_PGP_KEYS"></span>
|
||||
</button>
|
||||
</div>
|
||||
<br />
|
||||
<br />
|
||||
<div class="control-group">
|
||||
<div class="controls" data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'SETTINGS_OPEN_PGP/LABEL_ALLOW_DRAFT_AUTOSAVE',
|
||||
value: allowDraftAutosave
|
||||
}
|
||||
}"></div>
|
||||
</div>
|
||||
<br />
|
||||
<table class="table table-hover list-table" data-bind="i18nUpdate: openpgpkeys">
|
||||
<tbody data-bind="foreach: openpgpkeysPrivate">
|
||||
<tr class="open-pgp-key-item">
|
||||
<td>
|
||||
<span class="open-pgp-key-img fontastic" data-i18n="[title]SETTINGS_OPEN_PGP/TITLE_PRIVATE">🔒</span>
|
||||
<span class="open-pgp-key-user" data-bind="foreach: users">
|
||||
<div class="open-pgp-key-user-address" data-bind="text: $data"></div>
|
||||
</span>
|
||||
<a class="btn btn-small btn-small-small btn-danger pull-right button-confirm-delete button-delete-transitions" data-bind="css: {'delete-access': deleteAccess()}, click: function(openPgpKey) { $root.deleteOpenPgpKey(openPgpKey); }"
|
||||
data-i18n="GLOBAL/ARE_YOU_SURE"></a>
|
||||
</td>
|
||||
<td>
|
||||
<span class="delete-open-pgp-key fontastic" data-bind="visible: !deleteAccess(), click: function (openPgpKey) { $root.openPgpKeyForDeletion(openPgpKey); }">🗑</span>
|
||||
</td>
|
||||
<td class="view-open-pgp-key fontastic" data-bind="click: function (openPgpKey) { $root.viewOpenPgpKey(openPgpKey); }">👁</td>
|
||||
</tr>
|
||||
</tbody><tbody data-bind="foreach: openpgpkeysPublic">
|
||||
<tr class="open-pgp-key-item">
|
||||
<td>
|
||||
<span class="open-pgp-key-img fontastic" data-i18n="[title]SETTINGS_OPEN_PGP/TITLE_PUBLIC">🔑</span>
|
||||
<span class="open-pgp-key-user" data-bind="foreach: users">
|
||||
<div class="open-pgp-key-user-address">
|
||||
<span data-bind="text: $data"></span> (<span class="open-pgp-key-id" data-bind="text: $parent.id"></span>)
|
||||
</div>
|
||||
</span>
|
||||
<a class="btn btn-small btn-small-small btn-danger pull-right button-confirm-delete button-delete-transitions" data-bind="css: {'delete-access': deleteAccess()}, click: function(oOpenPGP) { $root.deleteOpenPgpKey(oOpenPGP); }"
|
||||
data-i18n="GLOBAL/ARE_YOU_SURE"></a>
|
||||
</td>
|
||||
<td>
|
||||
<span class="delete-open-pgp-key fontastic" data-bind="visible: !deleteAccess(), click: function (openPgpKey) { $root.openPgpKeyForDeletion(openPgpKey); }">🗑</span>
|
||||
</td>
|
||||
<td class="view-open-pgp-key fontastic" data-bind="click: function (openPgpKey) { $root.viewOpenPgpKey(openPgpKey); }">👁</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<br />
|
||||
<br />
|
||||
<div class="control-group">
|
||||
<div class="controls" data-bind="component: {
|
||||
name: 'Checkbox',
|
||||
params: {
|
||||
label: 'SETTINGS_OPEN_PGP/LABEL_ALLOW_DRAFT_AUTOSAVE',
|
||||
value: allowDraftAutosave
|
||||
}
|
||||
}"></div>
|
||||
</div>
|
||||
<br />
|
||||
<table class="table table-hover list-table" data-bind="i18nUpdate: openpgpkeys">
|
||||
<tbody data-bind="foreach: openpgpkeysPrivate">
|
||||
<tr class="open-pgp-key-item">
|
||||
<td>
|
||||
<span class="open-pgp-key-img fontastic" data-i18n="[title]SETTINGS_OPEN_PGP/TITLE_PRIVATE">🔒</span>
|
||||
<span class="open-pgp-key-user" data-bind="foreach: users">
|
||||
<div class="open-pgp-key-user-address" data-bind="text: $data"></div>
|
||||
</span>
|
||||
<a class="btn btn-small btn-small-small btn-danger pull-right button-confirm-delete button-delete-transitions" data-bind="css: {'delete-access': deleteAccess()}, click: function(openPgpKey) { $root.deleteOpenPgpKey(openPgpKey); }"
|
||||
data-i18n="GLOBAL/ARE_YOU_SURE"></a>
|
||||
</td>
|
||||
<td>
|
||||
<span class="delete-open-pgp-key fontastic" data-bind="visible: !deleteAccess(), click: function (openPgpKey) { $root.openPgpKeyForDeletion(openPgpKey); }">🗑</span>
|
||||
</td>
|
||||
<td class="view-open-pgp-key fontastic" data-bind="click: function (openPgpKey) { $root.viewOpenPgpKey(openPgpKey); }">👁</td>
|
||||
</tr>
|
||||
</tbody><tbody data-bind="foreach: openpgpkeysPublic">
|
||||
<tr class="open-pgp-key-item">
|
||||
<td>
|
||||
<span class="open-pgp-key-img fontastic" data-i18n="[title]SETTINGS_OPEN_PGP/TITLE_PUBLIC">🔑</span>
|
||||
<span class="open-pgp-key-user" data-bind="foreach: users">
|
||||
<div class="open-pgp-key-user-address">
|
||||
<span data-bind="text: $data"></span> (<span class="open-pgp-key-id" data-bind="text: $parent.id"></span>)
|
||||
</div>
|
||||
</span>
|
||||
<a class="btn btn-small btn-small-small btn-danger pull-right button-confirm-delete button-delete-transitions" data-bind="css: {'delete-access': deleteAccess()}, click: function(oOpenPGP) { $root.deleteOpenPgpKey(oOpenPGP); }"
|
||||
data-i18n="GLOBAL/ARE_YOU_SURE"></a>
|
||||
</td>
|
||||
<td>
|
||||
<span class="delete-open-pgp-key fontastic" data-bind="visible: !deleteAccess(), click: function (openPgpKey) { $root.openPgpKeyForDeletion(openPgpKey); }">🗑</span>
|
||||
</td>
|
||||
<td class="view-open-pgp-key fontastic" data-bind="click: function (openPgpKey) { $root.viewOpenPgpKey(openPgpKey); }">👁</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
|
|
|||
|
|
@ -1,14 +1,12 @@
|
|||
<div class="b-settings b-settins-right">
|
||||
<div class="b-toolbar btn-toolbar" style="margin-top: 2px;">
|
||||
<!-- ko if: isMobile() -->
|
||||
<div class="btn-group" style="margin-left: -1px">
|
||||
<a class="btn btn-thin-2 fontastic toggleLeft" data-bind="click: leftPanelDisabled.toggle, text: leftPanelDisabled() ? '❯' : '❮'">❮</a>
|
||||
</div>
|
||||
<!-- /ko -->
|
||||
<a class="btn button-back" data-bind="click: backToMailBoxClick">
|
||||
<i class="fontastic">⬅</i>
|
||||
<span data-i18n="GLOBAL/BACK"></span>
|
||||
</a>
|
||||
<div class="btn-toolbar">
|
||||
<!-- ko if: isMobile() -->
|
||||
<div class="btn-group" style="margin-left: -1px">
|
||||
<a class="btn btn-thin-2 fontastic toggleLeft" data-bind="click: leftPanelDisabled.toggle, text: leftPanelDisabled() ? '❯' : '❮'">❮</a>
|
||||
</div>
|
||||
<div class="b-content" id="rl-settings-subscreen"></div>
|
||||
<!-- /ko -->
|
||||
<a class="btn button-back" data-bind="click: backToMailBoxClick">
|
||||
<i class="fontastic">⬅</i>
|
||||
<span data-i18n="GLOBAL/BACK"></span>
|
||||
</a>
|
||||
</div>
|
||||
<div id="rl-settings-subscreen"></div>
|
||||
|
|
|
|||
|
|
@ -1,19 +1,17 @@
|
|||
<div class="b-settings-security">
|
||||
<div class="form-horizontal" data-bind="visible: capaAutoLogout">
|
||||
<div class="legend" data-i18n="SETTINGS_SECURITY/LEGEND_SECURITY"></div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="SETTINGS_SECURITY/LABEL_AUTOLOGOUT"></label>
|
||||
<div class="controls" data-bind="component: {
|
||||
name: 'Select',
|
||||
params: {
|
||||
inline: true,
|
||||
options: autoLogoutOptions,
|
||||
value: autoLogout,
|
||||
trigger: autoLogoutTrigger,
|
||||
optionsText: 'name',
|
||||
optionsValue: 'id'
|
||||
}
|
||||
}"></div>
|
||||
</div>
|
||||
<div class="form-horizontal" data-bind="visible: capaAutoLogout">
|
||||
<div class="legend" data-i18n="SETTINGS_SECURITY/LEGEND_SECURITY"></div>
|
||||
<div class="control-group">
|
||||
<label class="control-label" data-i18n="SETTINGS_SECURITY/LABEL_AUTOLOGOUT"></label>
|
||||
<div class="controls" data-bind="component: {
|
||||
name: 'Select',
|
||||
params: {
|
||||
inline: true,
|
||||
options: autoLogoutOptions,
|
||||
value: autoLogout,
|
||||
trigger: autoLogoutTrigger,
|
||||
optionsText: 'name',
|
||||
optionsValue: 'id'
|
||||
}
|
||||
}"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,35 +1,33 @@
|
|||
<div class="b-settings-themes g-ui-user-select-none">
|
||||
<div class="legend">
|
||||
<span data-i18n="SETTINGS_THEMES/LEGEND_THEMES"></span>
|
||||
<span data-bind="saveTrigger: themeTrigger"></span>
|
||||
<div class="legend">
|
||||
<span data-i18n="SETTINGS_THEMES/LEGEND_THEMES"></span>
|
||||
<span data-bind="saveTrigger: themeTrigger"></span>
|
||||
</div>
|
||||
<div class="b-themes-list" data-bind="foreach: themesObjects">
|
||||
<div class="e-item" data-bind="click: function () { $root.theme(name); }, css: { 'selected': selected }">
|
||||
<div class="e-name" data-bind="text: nameDisplay"></div>
|
||||
<img class="e-image" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-bind="attr: { 'src': themePreviewSrc }" />
|
||||
</div>
|
||||
<div class="b-themes-list" data-bind="foreach: themesObjects">
|
||||
<div class="e-item" data-bind="click: function () { $root.theme(name); }, css: { 'selected': selected }">
|
||||
<div class="e-name" data-bind="text: nameDisplay"></div>
|
||||
<img class="e-image" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-bind="attr: { 'src': themePreviewSrc }" />
|
||||
</div>
|
||||
<br />
|
||||
<br />
|
||||
<div class="form-horizontal" data-bind="visible: capaUserBackground">
|
||||
<div class="legend" data-i18n="SETTINGS_THEMES/LEGEND_THEMES_CUSTOM"></div>
|
||||
<div class="control-group g-ui-user-select-none">
|
||||
<div class="row" data-bind="visible: '' !== background.error()" style="margin-left: 0; margin-bottom: 10px;">
|
||||
<div class="alert alert-error span6" data-bind="text: background.error" style="margin-left: 0"></div>
|
||||
</div>
|
||||
</div>
|
||||
<br />
|
||||
<br />
|
||||
<div class="form-horizontal" data-bind="visible: capaUserBackground">
|
||||
<div class="legend" data-i18n="SETTINGS_THEMES/LEGEND_THEMES_CUSTOM"></div>
|
||||
<div class="control-group g-ui-user-select-none">
|
||||
<div class="row" data-bind="visible: '' !== background.error()" style="margin-left: 0; margin-bottom: 10px;">
|
||||
<div class="alert alert-error span6" data-bind="text: background.error" style="margin-left: 0"></div>
|
||||
</div>
|
||||
<div class="row" data-bind="visible: '' !== background.name()" style="margin-left: 0">
|
||||
<a class="btn" data-bind="visible: '' !== background.name(), click: clearBackground">
|
||||
<i class="fontastic">✖</i>
|
||||
</a>
|
||||
|
||||
<b data-bind="text: background.name"></b>
|
||||
</div>
|
||||
<div class="row" data-bind="visible: '' === background.name()" style="margin-left: 0">
|
||||
<a class="btn" data-bind="initDom: background.uploaderButton">
|
||||
<i class="fontastic" data-bind="css: {'icon-spinner': background.loading()}">🖼</i>
|
||||
<span data-i18n="SETTINGS_THEMES/BUTTON_UPLOAD_BACKGROUND_IMAGE"></span>
|
||||
</a>
|
||||
</div>
|
||||
<div class="row" data-bind="visible: '' !== background.name()" style="margin-left: 0">
|
||||
<a class="btn" data-bind="visible: '' !== background.name(), click: clearBackground">
|
||||
<i class="fontastic">✖</i>
|
||||
</a>
|
||||
|
||||
<b data-bind="text: background.name"></b>
|
||||
</div>
|
||||
<div class="row" data-bind="visible: '' === background.name()" style="margin-left: 0">
|
||||
<a class="btn" data-bind="initDom: background.uploaderButton">
|
||||
<i class="fontastic" data-bind="css: {'icon-spinner': background.loading()}">🖼</i>
|
||||
<span data-i18n="SETTINGS_THEMES/BUTTON_UPLOAD_BACKGROUND_IMAGE"></span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -73,10 +73,9 @@
|
|||
|
||||
.well,
|
||||
#rl-popups > dialog,
|
||||
.b-settins-right .b-content,
|
||||
#rl-settings-subscreen,
|
||||
.messageList,
|
||||
.messageView,
|
||||
.b-admin-right .b-content,
|
||||
#V-PopupsCompose .b-attachment-place {
|
||||
background-color: #000;
|
||||
border-color: #555;
|
||||
|
|
@ -132,7 +131,7 @@ dialog header, dialog footer,
|
|||
background-color: #111;
|
||||
}
|
||||
|
||||
.b-admin-about .rl-logo {
|
||||
#V-Settings-About .rl-logo {
|
||||
filter: drop-shadow(0 0 1px #FFF);
|
||||
}
|
||||
|
||||
|
|
@ -141,6 +140,7 @@ dialog header, dialog footer,
|
|||
}
|
||||
|
||||
.tabs [id^="tab"]:checked + label {
|
||||
background: linear-gradient(#555 0%, #000 100%);
|
||||
color: #000;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue