mirror of
https://github.com/the-djmaze/snappymail.git
synced 2026-07-13 03:27:39 +03:00
Code refactoring
a lot of small fixes (Closes #173) Added login field (ownCloud package)
This commit is contained in:
parent
a059b3d063
commit
fed896776f
129 changed files with 1016 additions and 804 deletions
13
Gruntfile.js
13
Gruntfile.js
|
|
@ -273,6 +273,8 @@ module.exports = function (grunt) {
|
||||||
"dev/Models/FolderModel.js",
|
"dev/Models/FolderModel.js",
|
||||||
"dev/Models/AccountModel.js",
|
"dev/Models/AccountModel.js",
|
||||||
"dev/Models/IdentityModel.js",
|
"dev/Models/IdentityModel.js",
|
||||||
|
"dev/Models/FilterConditionModel.js",
|
||||||
|
"dev/Models/FilterModel.js",
|
||||||
"dev/Models/OpenPgpKeyModel.js",
|
"dev/Models/OpenPgpKeyModel.js",
|
||||||
|
|
||||||
"dev/ViewModels/PopupsFolderClearViewModel.js",
|
"dev/ViewModels/PopupsFolderClearViewModel.js",
|
||||||
|
|
@ -310,6 +312,7 @@ module.exports = function (grunt) {
|
||||||
"dev/Settings/Accounts.js",
|
"dev/Settings/Accounts.js",
|
||||||
"dev/Settings/Identity.js",
|
"dev/Settings/Identity.js",
|
||||||
"dev/Settings/Identities.js",
|
"dev/Settings/Identities.js",
|
||||||
|
"dev/Settings/Filters.js",
|
||||||
"dev/Settings/Security.js",
|
"dev/Settings/Security.js",
|
||||||
"dev/Settings/Social.js",
|
"dev/Settings/Social.js",
|
||||||
"dev/Settings/ChangePassword.js",
|
"dev/Settings/ChangePassword.js",
|
||||||
|
|
@ -475,7 +478,7 @@ module.exports = function (grunt) {
|
||||||
releasesPath = grunt.config('cfg.releasesPath'),
|
releasesPath = grunt.config('cfg.releasesPath'),
|
||||||
devVersion = grunt.config('cfg.devVersion'),
|
devVersion = grunt.config('cfg.devVersion'),
|
||||||
versionFull = version + '.' + release,
|
versionFull = version + '.' + release,
|
||||||
versionOwn = '1.1',
|
versionOwn = grunt.config('pkg.ownCloudPackageVersion'),
|
||||||
dist = releasesPath + '/' + versionFull + '/owncloud/'
|
dist = releasesPath + '/' + versionFull + '/owncloud/'
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
@ -489,12 +492,14 @@ module.exports = function (grunt) {
|
||||||
grunt.file.write(dist + 'appinfo/info.xml',
|
grunt.file.write(dist + 'appinfo/info.xml',
|
||||||
content.replace('<version>0.0.0</version>', '<version>' + versionOwn + '</version>'));
|
content.replace('<version>0.0.0</version>', '<version>' + versionOwn + '</version>'));
|
||||||
|
|
||||||
|
grunt.file.write(dist + 'VERSION', versionOwn);
|
||||||
|
|
||||||
grunt.config.set('cfg.releaseFolder', versionFull);
|
grunt.config.set('cfg.releaseFolder', versionFull);
|
||||||
grunt.config.set('cfg.releaseSrcPath', dist);
|
grunt.config.set('cfg.releaseSrcPath', dist);
|
||||||
grunt.config.set('cfg.releaseZipFile', 'rainloop-owncloud-app-' + versionOwn + '.zip');
|
grunt.config.set('cfg.releaseZipFile', 'rainloop-owncloud-app-' + versionOwn + '.zip');
|
||||||
});
|
});
|
||||||
|
|
||||||
grunt.registerTask('rainloop-clear', 'RainLoop Webmail clear task', function () {
|
grunt.registerTask('rainloop-clean', 'RainLoop Webmail clean task', function () {
|
||||||
var releaseSrcPath = grunt.config('cfg.releaseSrcPath');
|
var releaseSrcPath = grunt.config('cfg.releaseSrcPath');
|
||||||
if ('' !== releaseSrcPath)
|
if ('' !== releaseSrcPath)
|
||||||
{
|
{
|
||||||
|
|
@ -517,9 +522,9 @@ module.exports = function (grunt) {
|
||||||
// ---
|
// ---
|
||||||
|
|
||||||
grunt.registerTask('default', ['less', 'concat', 'cssmin', 'jshint', 'rlmin']);
|
grunt.registerTask('default', ['less', 'concat', 'cssmin', 'jshint', 'rlmin']);
|
||||||
grunt.registerTask('build', ['default', 'rainloop', 'compress:build', 'md5:build', 'rainloop-clear']);
|
grunt.registerTask('build', ['default', 'rainloop', 'compress:build', 'md5:build', 'rainloop-clean']);
|
||||||
grunt.registerTask('fast', ['less', 'concat']);
|
grunt.registerTask('fast', ['less', 'concat']);
|
||||||
grunt.registerTask('owncloud', ['rainloop-owncloud', 'compress:own', 'md5:build', 'rainloop-clear']);
|
grunt.registerTask('owncloud', ['rainloop-owncloud', 'compress:own', 'md5:build', 'rainloop-clean']);
|
||||||
|
|
||||||
// aliases
|
// aliases
|
||||||
grunt.registerTask('u', ['uglify']);
|
grunt.registerTask('u', ['uglify']);
|
||||||
|
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
||||||
<IfModule mod_rewrite.c>
|
|
||||||
RewriteEngine On
|
|
||||||
RewriteRule /.well-known/carddav /index.php/dav [R,L]
|
|
||||||
</IfModule>
|
|
||||||
|
|
||||||
|
|
@ -1,14 +0,0 @@
|
||||||
<VirtualHost *:80>
|
|
||||||
AcceptPathInfo On
|
|
||||||
ServerName dav.mydomain.com
|
|
||||||
DocumentRoot /var/www/mydomain.com
|
|
||||||
|
|
||||||
RewriteEngine On
|
|
||||||
RewriteRule /.well-known/carddav /index.php/dav [R,L]
|
|
||||||
|
|
||||||
<Directory "/var/www/mydomain.com">
|
|
||||||
Options None
|
|
||||||
Options +FollowSymlinks
|
|
||||||
AllowOverride All
|
|
||||||
</Directory>
|
|
||||||
</VirtualHost>
|
|
||||||
|
|
@ -1,14 +0,0 @@
|
||||||
<VirtualHost *:80>
|
|
||||||
AcceptPathInfo On
|
|
||||||
ServerName mydomain.com
|
|
||||||
DocumentRoot /var/www/mydomain.com
|
|
||||||
|
|
||||||
RewriteEngine On
|
|
||||||
RewriteRule /.well-known/carddav /index.php/dav [R,L]
|
|
||||||
|
|
||||||
<Directory "/var/www/mydomain.com">
|
|
||||||
Options None
|
|
||||||
Options +FollowSymlinks
|
|
||||||
AllowOverride All
|
|
||||||
</Directory>
|
|
||||||
</VirtualHost>
|
|
||||||
|
|
@ -1,43 +0,0 @@
|
||||||
server {
|
|
||||||
listen 80;
|
|
||||||
server_name dav.mydomain.com;
|
|
||||||
|
|
||||||
root /var/www/mydomain.com;
|
|
||||||
access_log /var/log/nginx/dav.mydomain.com.access.log;
|
|
||||||
error_log /var/log/nginx/dav.mydomain.com.error.log;
|
|
||||||
|
|
||||||
index index.php;
|
|
||||||
charset utf-8;
|
|
||||||
log_not_found off;
|
|
||||||
|
|
||||||
location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
|
|
||||||
expires max;
|
|
||||||
add_header Pragma public;
|
|
||||||
add_header Cache-Control "public, must-revalidate, proxy-revalidate";
|
|
||||||
}
|
|
||||||
|
|
||||||
location = /favicon.ico { access_log off; log_not_found off; }
|
|
||||||
location = /robots.txt { access_log off; log_not_found off; }
|
|
||||||
location = /humans.txt { access_log off; log_not_found off; }
|
|
||||||
location ~ /\.ht { access_log off; log_not_found off; deny all; return 404; }
|
|
||||||
location ^~ /data { access_log off; log_not_found off; deny all; return 404; }
|
|
||||||
|
|
||||||
# rewrite for carddav autoprovision
|
|
||||||
rewrite ^/.well-known/carddav / redirect;
|
|
||||||
|
|
||||||
rewrite ^(.*)$ /index.php/dav$1 last;
|
|
||||||
|
|
||||||
# php for carddav only
|
|
||||||
location ~ /index\.php/dav/.*$ {
|
|
||||||
include fastcgi_params;
|
|
||||||
|
|
||||||
fastcgi_pass 127.0.0.1:9000; # unix:/var/run/php5-fpm.sock;
|
|
||||||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
|
||||||
|
|
||||||
fastcgi_split_path_info ^(.+\.php)(/[^?]*).*$;
|
|
||||||
fastcgi_index index.php;
|
|
||||||
fastcgi_param SCRIPT_NAME index.php;
|
|
||||||
fastcgi_param PATH_INFO $fastcgi_path_info;
|
|
||||||
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,48 +0,0 @@
|
||||||
server {
|
|
||||||
listen 80;
|
|
||||||
server_name mydomain.com;
|
|
||||||
|
|
||||||
root /var/www/mydomain.com;
|
|
||||||
access_log /var/log/nginx/mydomain.com.access.log;
|
|
||||||
error_log /var/log/nginx/mydomain.com.error.log;
|
|
||||||
|
|
||||||
index index.php index.html;
|
|
||||||
charset utf-8;
|
|
||||||
log_not_found off;
|
|
||||||
|
|
||||||
location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
|
|
||||||
expires max;
|
|
||||||
add_header Pragma public;
|
|
||||||
add_header Cache-Control "public, must-revalidate, proxy-revalidate";
|
|
||||||
}
|
|
||||||
|
|
||||||
location = /favicon.ico { access_log off; log_not_found off; }
|
|
||||||
location = /robots.txt { access_log off; log_not_found off; }
|
|
||||||
location = /humans.txt { access_log off; log_not_found off; }
|
|
||||||
location ~ /\.ht { access_log off; log_not_found off; deny all; return 404; }
|
|
||||||
location ^~ /data { access_log off; log_not_found off; deny all; return 404; }
|
|
||||||
|
|
||||||
# rewrite for carddav autoprovision
|
|
||||||
rewrite ^/.well-known/carddav /index.php/dav/ redirect;
|
|
||||||
|
|
||||||
# php for carddav
|
|
||||||
location ~ /index\.php/dav/.*$ {
|
|
||||||
include fastcgi_params;
|
|
||||||
|
|
||||||
fastcgi_pass 127.0.0.1:9000; # unix:/var/run/php5-fpm.sock;
|
|
||||||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
|
||||||
|
|
||||||
fastcgi_split_path_info ^(.+\.php)(/[^?]*).*$;
|
|
||||||
fastcgi_index index.php;
|
|
||||||
fastcgi_param SCRIPT_NAME index.php;
|
|
||||||
fastcgi_param PATH_INFO $fastcgi_path_info;
|
|
||||||
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
|
|
||||||
}
|
|
||||||
|
|
||||||
# php (other)
|
|
||||||
location ~ \.php {
|
|
||||||
include fastcgi_params;
|
|
||||||
fastcgi_pass 127.0.0.1:9000; # unix:/var/run/php5-fpm.sock;
|
|
||||||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -25,5 +25,5 @@ external_sso_key = "super-secret-key"
|
||||||
ownCloud:
|
ownCloud:
|
||||||
1) In the Apps > Enable 'RainLoop' plugin
|
1) In the Apps > Enable 'RainLoop' plugin
|
||||||
2) In the Settings > Admin > Enter "RainLoop Webmail URL" and "SSO key"
|
2) In the Settings > Admin > Enter "RainLoop Webmail URL" and "SSO key"
|
||||||
3) In the Settings > Personal > Type your mail server email and password
|
3) In the Settings > Personal > Type your mail server email (login) and password
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
1.1
|
0.0
|
||||||
|
|
@ -23,6 +23,7 @@ if (isset($_POST['appname'], $_POST['rainloop-password'], $_POST['rainloop-email
|
||||||
$sPostLogin = isset($_POST['rainloop-login']) ? $_POST['rainloop-login'] : '';
|
$sPostLogin = isset($_POST['rainloop-login']) ? $_POST['rainloop-login'] : '';
|
||||||
|
|
||||||
OCP\Config::setUserValue($sUser, 'rainloop', 'rainloop-email', $sPostEmail);
|
OCP\Config::setUserValue($sUser, 'rainloop', 'rainloop-email', $sPostEmail);
|
||||||
|
OCP\Config::setUserValue($sUser, 'rainloop', 'rainloop-login', $sPostLogin);
|
||||||
|
|
||||||
$sPass = $_POST['rainloop-password'];
|
$sPass = $_POST['rainloop-password'];
|
||||||
if ('******' !== $sPass && '' !== $sPass)
|
if ('******' !== $sPass && '' !== $sPass)
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,9 @@
|
||||||
<input type="text" id="rainloop-email" name="rainloop-email"
|
<input type="text" id="rainloop-email" name="rainloop-email"
|
||||||
value="<?php echo $_['rainloop-email']; ?>" placeholder="<?php p($l->t('Email')); ?>" />
|
value="<?php echo $_['rainloop-email']; ?>" placeholder="<?php p($l->t('Email')); ?>" />
|
||||||
|
|
||||||
|
<input type="text" id="rainloop-email" name="rainloop-login"
|
||||||
|
value="<?php echo $_['rainloop-login']; ?>" placeholder="<?php p($l->t('Login (optional)')); ?>" />
|
||||||
|
|
||||||
<input type="password" id="rainloop-password" name="rainloop-password"
|
<input type="password" id="rainloop-password" name="rainloop-password"
|
||||||
value="<?php echo $_['rainloop-password']; ?>" placeholder="<?php p($l->t('Password')); ?>" />
|
value="<?php echo $_['rainloop-password']; ?>" placeholder="<?php p($l->t('Password')); ?>" />
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -58,9 +58,9 @@
|
||||||
<param name="plugin-name" value="directadmin-change-password"/>
|
<param name="plugin-name" value="directadmin-change-password"/>
|
||||||
</antcall>
|
</antcall>
|
||||||
</target>
|
</target>
|
||||||
<target name="ispmanager-change-password">
|
<target name="ispconfig-change-password">
|
||||||
<antcall target="_build_plugin_">
|
<antcall target="_build_plugin_">
|
||||||
<param name="plugin-name" value="ispmanager-change-password"/>
|
<param name="plugin-name" value="ispconfig-change-password"/>
|
||||||
</antcall>
|
</antcall>
|
||||||
</target>
|
</target>
|
||||||
<target name="poppassd-change-password">
|
<target name="poppassd-change-password">
|
||||||
|
|
@ -94,5 +94,5 @@
|
||||||
</antcall>
|
</antcall>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@
|
||||||
*/
|
*/
|
||||||
function AdminSecurity()
|
function AdminSecurity()
|
||||||
{
|
{
|
||||||
this.csrfProtection = ko.observable(!!RL.settingsGet('UseTokenProtection'));
|
|
||||||
this.capaOpenPGP = ko.observable(RL.capa(Enums.Capa.OpenPGP));
|
this.capaOpenPGP = ko.observable(RL.capa(Enums.Capa.OpenPGP));
|
||||||
this.capaTwoFactorAuth = ko.observable(RL.capa(Enums.Capa.TwoFactor));
|
this.capaTwoFactorAuth = ko.observable(RL.capa(Enums.Capa.TwoFactor));
|
||||||
|
|
||||||
|
|
@ -28,13 +27,13 @@ function AdminSecurity()
|
||||||
this.adminPasswordUpdateSuccess(false);
|
this.adminPasswordUpdateSuccess(false);
|
||||||
this.adminPasswordNewError(false);
|
this.adminPasswordNewError(false);
|
||||||
}, this);
|
}, this);
|
||||||
|
|
||||||
this.adminPasswordNew2.subscribe(function () {
|
this.adminPasswordNew2.subscribe(function () {
|
||||||
this.adminPasswordUpdateError(false);
|
this.adminPasswordUpdateError(false);
|
||||||
this.adminPasswordUpdateSuccess(false);
|
this.adminPasswordUpdateSuccess(false);
|
||||||
this.adminPasswordNewError(false);
|
this.adminPasswordNewError(false);
|
||||||
}, this);
|
}, this);
|
||||||
|
|
||||||
this.saveNewAdminPasswordCommand = Utils.createCommand(this, function () {
|
this.saveNewAdminPasswordCommand = Utils.createCommand(this, function () {
|
||||||
|
|
||||||
if (this.adminPasswordNew() !== this.adminPasswordNew2())
|
if (this.adminPasswordNew() !== this.adminPasswordNew2())
|
||||||
|
|
@ -78,12 +77,6 @@ AdminSecurity.prototype.onNewAdminPasswordResponse = function (sResult, oData)
|
||||||
|
|
||||||
AdminSecurity.prototype.onBuild = function ()
|
AdminSecurity.prototype.onBuild = function ()
|
||||||
{
|
{
|
||||||
this.csrfProtection.subscribe(function (bValue) {
|
|
||||||
RL.remote().saveAdminConfig(Utils.emptyFunction, {
|
|
||||||
'TokenProtection': bValue ? '1' : '0'
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
this.capaOpenPGP.subscribe(function (bValue) {
|
this.capaOpenPGP.subscribe(function (bValue) {
|
||||||
RL.remote().saveAdminConfig(Utils.emptyFunction, {
|
RL.remote().saveAdminConfig(Utils.emptyFunction, {
|
||||||
'CapaOpenPGP': bValue ? '1' : '0'
|
'CapaOpenPGP': bValue ? '1' : '0'
|
||||||
|
|
|
||||||
|
|
@ -1072,6 +1072,11 @@ RainLoopApp.prototype.bootstart = function ()
|
||||||
Utils.removeSettingsViewModel(SettingsThemes);
|
Utils.removeSettingsViewModel(SettingsThemes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!RL.capa(Enums.Capa.Filters))
|
||||||
|
{
|
||||||
|
Utils.removeSettingsViewModel(SettingsFilters);
|
||||||
|
}
|
||||||
|
|
||||||
if (!bGoogle && !bFacebook && !bTwitter)
|
if (!bGoogle && !bFacebook && !bTwitter)
|
||||||
{
|
{
|
||||||
Utils.removeSettingsViewModel(SettingsSocialScreen);
|
Utils.removeSettingsViewModel(SettingsSocialScreen);
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,7 @@ Enums.Capa = {
|
||||||
'Prefetch': 'PREFETCH',
|
'Prefetch': 'PREFETCH',
|
||||||
'Gravatar': 'GRAVATAR',
|
'Gravatar': 'GRAVATAR',
|
||||||
'Themes': 'THEMES',
|
'Themes': 'THEMES',
|
||||||
|
'Filters': 'FILTERS',
|
||||||
'AdditionalAccounts': 'ADDITIONAL_ACCOUNTS',
|
'AdditionalAccounts': 'ADDITIONAL_ACCOUNTS',
|
||||||
'AdditionalIdentities': 'ADDITIONAL_IDENTITIES'
|
'AdditionalIdentities': 'ADDITIONAL_IDENTITIES'
|
||||||
};
|
};
|
||||||
|
|
@ -278,6 +279,34 @@ Enums.Layout = {
|
||||||
'BottomPreview': 2
|
'BottomPreview': 2
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @enum {number}
|
||||||
|
*/
|
||||||
|
Enums.FilterConditionField = {
|
||||||
|
'From': 0,
|
||||||
|
'To': 1,
|
||||||
|
'Subject': 2
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @enum {number}
|
||||||
|
*/
|
||||||
|
Enums.FilterConditionType = {
|
||||||
|
'contains': 0,
|
||||||
|
'NotContains': 1,
|
||||||
|
'EqualTo': 2,
|
||||||
|
'NotEqualTo': 3
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @enum {number}
|
||||||
|
*/
|
||||||
|
Enums.FiltersAction = {
|
||||||
|
'None': 0,
|
||||||
|
'Move': 1,
|
||||||
|
'Delete': 2
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @enum {number}
|
* @enum {number}
|
||||||
*/
|
*/
|
||||||
|
|
@ -345,7 +374,7 @@ Enums.Notification = {
|
||||||
'NewPasswordShort': 132,
|
'NewPasswordShort': 132,
|
||||||
'NewPasswordWeak': 133,
|
'NewPasswordWeak': 133,
|
||||||
'NewPasswordForbidden': 134,
|
'NewPasswordForbidden': 134,
|
||||||
|
|
||||||
'ContactsSyncError': 140,
|
'ContactsSyncError': 140,
|
||||||
|
|
||||||
'CantGetMessageList': 201,
|
'CantGetMessageList': 201,
|
||||||
|
|
@ -374,13 +403,13 @@ Enums.Notification = {
|
||||||
'CantDeletePackage': 702,
|
'CantDeletePackage': 702,
|
||||||
'InvalidPluginPackage': 703,
|
'InvalidPluginPackage': 703,
|
||||||
'UnsupportedPluginPackage': 704,
|
'UnsupportedPluginPackage': 704,
|
||||||
|
|
||||||
'LicensingServerIsUnavailable': 710,
|
'LicensingServerIsUnavailable': 710,
|
||||||
'LicensingExpired': 711,
|
'LicensingExpired': 711,
|
||||||
'LicensingBanned': 712,
|
'LicensingBanned': 712,
|
||||||
|
|
||||||
'DemoSendMessageError': 750,
|
'DemoSendMessageError': 750,
|
||||||
|
|
||||||
'AccountAlreadyExists': 801,
|
'AccountAlreadyExists': 801,
|
||||||
|
|
||||||
'MailServerError': 901,
|
'MailServerError': 901,
|
||||||
|
|
|
||||||
|
|
@ -80,7 +80,7 @@ ko.bindingHandlers.tooltip3 = {
|
||||||
$document.click(function () {
|
$document.click(function () {
|
||||||
$oEl.tooltip('hide');
|
$oEl.tooltip('hide');
|
||||||
});
|
});
|
||||||
|
|
||||||
Globals.tooltipTrigger.subscribe(function () {
|
Globals.tooltipTrigger.subscribe(function () {
|
||||||
$oEl.tooltip('hide');
|
$oEl.tooltip('hide');
|
||||||
});
|
});
|
||||||
|
|
|
||||||
8
dev/Models/FilterConditionModel.js
Normal file
8
dev/Models/FilterConditionModel.js
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @constructor
|
||||||
|
*/
|
||||||
|
function FilterConditionModel()
|
||||||
|
{
|
||||||
|
}
|
||||||
36
dev/Models/FilterModel.js
Normal file
36
dev/Models/FilterModel.js
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @constructor
|
||||||
|
*/
|
||||||
|
function FilterModel()
|
||||||
|
{
|
||||||
|
this.enabled = ko.observable(true);
|
||||||
|
|
||||||
|
this.conditions = ko.observableArray([]);
|
||||||
|
|
||||||
|
this.action = ko.observable(Enums.FiltersAction.None);
|
||||||
|
}
|
||||||
|
|
||||||
|
FilterModel.prototype.deleteCondition = function (oCondition)
|
||||||
|
{
|
||||||
|
this.conditions.remove(oCondition);
|
||||||
|
};
|
||||||
|
|
||||||
|
FilterModel.prototype.addCondition = function ()
|
||||||
|
{
|
||||||
|
this.conditions.push(new FilterConditionModel());
|
||||||
|
};
|
||||||
|
|
||||||
|
FilterModel.prototype.parse = function (oItem)
|
||||||
|
{
|
||||||
|
var bResult = false;
|
||||||
|
if (oItem && 'Object/Filter' === oItem['@Object'])
|
||||||
|
{
|
||||||
|
this.name(Utils.pString(oItem['Name']));
|
||||||
|
|
||||||
|
bResult = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return bResult;
|
||||||
|
};
|
||||||
31
dev/Settings/Filters.js
Normal file
31
dev/Settings/Filters.js
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @constructor
|
||||||
|
*/
|
||||||
|
function SettingsFilters()
|
||||||
|
{
|
||||||
|
// var oData = RL.data();
|
||||||
|
|
||||||
|
this.filters = ko.observableArray([]);
|
||||||
|
this.filters.loading = ko.observable(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
Utils.addSettingsViewModel(SettingsFilters, 'SettingsFilters', 'SETTINGS_LABELS/LABEL_FILTERS_NAME', 'filters');
|
||||||
|
|
||||||
|
//SettingsFilters.prototype.onBuild = function ()
|
||||||
|
//{
|
||||||
|
//};
|
||||||
|
|
||||||
|
SettingsFilters.prototype.deleteFilter = function (oFilter)
|
||||||
|
{
|
||||||
|
this.filters.remove(oFilter);
|
||||||
|
};
|
||||||
|
|
||||||
|
SettingsFilters.prototype.addFilter = function ()
|
||||||
|
{
|
||||||
|
var oFilter = new FilterModel();
|
||||||
|
oFilter.addCondition();
|
||||||
|
|
||||||
|
this.filters.push(oFilter);
|
||||||
|
};
|
||||||
|
|
@ -37,6 +37,7 @@
|
||||||
right: 0;
|
right: 0;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
|
min-width: 100px;
|
||||||
// padding: 5px;
|
// padding: 5px;
|
||||||
|
|
||||||
.content {
|
.content {
|
||||||
|
|
|
||||||
|
|
@ -1,24 +1,24 @@
|
||||||
.nano:before, .nano:after {
|
.nano:before, .nano:after {
|
||||||
display: none;
|
display: none;
|
||||||
content: "";
|
content: "";
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: 0;
|
left: 0;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 2px;
|
height: 10px;
|
||||||
z-index: 102;
|
z-index: 102;
|
||||||
-webkit-box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.5);
|
-webkit-box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.3);
|
||||||
-moz-box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.5);
|
-moz-box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.3);
|
||||||
box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.5);
|
box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.3);
|
||||||
}
|
}
|
||||||
|
|
||||||
.nano:before {
|
.nano:before {
|
||||||
top: -2px;
|
top: -10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nano:after {
|
.nano:after {
|
||||||
bottom: -2px;
|
bottom: -10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nano.nano-scrolllimit-top:before, .nano.nano-scrolllimit-bottom:after {
|
.nano.nano-scrolllimit-top:before, .nano.nano-scrolllimit-bottom:after {
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
|
|
@ -190,6 +190,7 @@ html.cssanimations {
|
||||||
height: 15px;
|
height: 15px;
|
||||||
background-color: #ddd;
|
background-color: #ddd;
|
||||||
margin: 0 5px;
|
margin: 0 5px;
|
||||||
|
.box-shadow(0px 0px 3px rgba(0, 0, 0, 0.3));
|
||||||
|
|
||||||
border-radius: 100%;
|
border-radius: 100%;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
|
|
@ -209,7 +210,7 @@ html.cssanimations {
|
||||||
-webkit-animation-delay: -0.16s;
|
-webkit-animation-delay: -0.16s;
|
||||||
animation-delay: -0.16s;
|
animation-delay: -0.16s;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@-webkit-keyframes bouncedelay {
|
@-webkit-keyframes bouncedelay {
|
||||||
|
|
|
||||||
|
|
@ -122,6 +122,8 @@ html.rgba.textshadow {
|
||||||
.tooltip {
|
.tooltip {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
z-index: 2000 !important;
|
z-index: 2000 !important;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
|
||||||
&.in {
|
&.in {
|
||||||
.opacity(100);
|
.opacity(100);
|
||||||
|
|
@ -130,17 +132,20 @@ html.rgba.textshadow {
|
||||||
.tooltip-class {
|
.tooltip-class {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tooltip-inner {
|
||||||
|
max-width: 400px;
|
||||||
|
text-shadow: 0px 0px 5px rgba(0, 0, 0, 0.2);
|
||||||
|
padding: 5px 10px;
|
||||||
|
.border-radius(2px);
|
||||||
|
}
|
||||||
|
|
||||||
.tooltip-big {
|
.tooltip-big {
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
padding: 0 10px;
|
padding: 0 10px;
|
||||||
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.tooltip-inner {
|
|
||||||
padding: 5px 10px;
|
|
||||||
.border-radius(2px);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match
|
// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match
|
||||||
.btn-group > .btn:first-child {
|
.btn-group > .btn:first-child {
|
||||||
-webkit-border-top-left-radius: @btnBorderRadius;
|
-webkit-border-top-left-radius: @btnBorderRadius;
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ function AbstractSystemDropDownViewModel()
|
||||||
KnoinAbstractViewModel.call(this, 'Right', 'SystemDropDown');
|
KnoinAbstractViewModel.call(this, 'Right', 'SystemDropDown');
|
||||||
|
|
||||||
var oData = RL.data();
|
var oData = RL.data();
|
||||||
|
|
||||||
this.accounts = oData.accounts;
|
this.accounts = oData.accounts;
|
||||||
this.accountEmail = oData.accountEmail;
|
this.accountEmail = oData.accountEmail;
|
||||||
this.accountsLoading = oData.accountsLoading;
|
this.accountsLoading = oData.accountsLoading;
|
||||||
|
|
@ -37,7 +37,7 @@ AbstractSystemDropDownViewModel.prototype.accountClick = function (oAccount, oEv
|
||||||
self.accountsLoading(false);
|
self.accountsLoading(false);
|
||||||
}, 1000);
|
}, 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
"name": "RainLoop",
|
"name": "RainLoop",
|
||||||
"title": "RainLoop Webmail",
|
"title": "RainLoop Webmail",
|
||||||
"version": "1.6.7",
|
"version": "1.6.7",
|
||||||
"release": "102",
|
"release": "106",
|
||||||
"description": "Simple, modern & fast web-based email client",
|
"description": "Simple, modern & fast web-based email client",
|
||||||
"homepage": "http://rainloop.net",
|
"homepage": "http://rainloop.net",
|
||||||
"main": "Gruntfile.js",
|
"main": "Gruntfile.js",
|
||||||
|
|
@ -36,6 +36,7 @@
|
||||||
"plugins"
|
"plugins"
|
||||||
],
|
],
|
||||||
"readmeFilename": "README.md",
|
"readmeFilename": "README.md",
|
||||||
|
"ownCloudPackageVersion": "1.2",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 0.8.0"
|
"node": ">= 0.8.0"
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
class IspManagerChangePasswordDriver implements \RainLoop\Providers\ChangePassword\ChangePasswordInterface
|
class IspConfigChangePasswordDriver implements \RainLoop\Providers\ChangePassword\ChangePasswordInterface
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @var string
|
* @var string
|
||||||
|
|
@ -16,7 +16,7 @@ class IspManagerChangePasswordDriver implements \RainLoop\Providers\ChangePasswo
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
private $sPassword = '';
|
private $sPassword = '';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
|
|
@ -26,13 +26,13 @@ class IspManagerChangePasswordDriver implements \RainLoop\Providers\ChangePasswo
|
||||||
* @var \MailSo\Log\Logger
|
* @var \MailSo\Log\Logger
|
||||||
*/
|
*/
|
||||||
private $oLogger = null;
|
private $oLogger = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string $sDsn
|
* @param string $sDsn
|
||||||
* @param string $sUser
|
* @param string $sUser
|
||||||
* @param string $sPassword
|
* @param string $sPassword
|
||||||
*
|
*
|
||||||
* @return \IspManagerChangePasswordDriver
|
* @return \IspConfigChangePasswordDriver
|
||||||
*/
|
*/
|
||||||
public function SetConfig($sDsn, $sUser, $sPassword)
|
public function SetConfig($sDsn, $sUser, $sPassword)
|
||||||
{
|
{
|
||||||
|
|
@ -44,9 +44,9 @@ class IspManagerChangePasswordDriver implements \RainLoop\Providers\ChangePasswo
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string $aDomains
|
* @param string $sAllowedEmails
|
||||||
*
|
*
|
||||||
* @return \IspManagerChangePasswordDriver
|
* @return \IspConfigChangePasswordDriver
|
||||||
*/
|
*/
|
||||||
public function SetAllowedEmails($sAllowedEmails)
|
public function SetAllowedEmails($sAllowedEmails)
|
||||||
{
|
{
|
||||||
|
|
@ -57,7 +57,7 @@ class IspManagerChangePasswordDriver implements \RainLoop\Providers\ChangePasswo
|
||||||
/**
|
/**
|
||||||
* @param \MailSo\Log\Logger $oLogger
|
* @param \MailSo\Log\Logger $oLogger
|
||||||
*
|
*
|
||||||
* @return \IspManagerChangePasswordDriver
|
* @return \IspConfigChangePasswordDriver
|
||||||
*/
|
*/
|
||||||
public function SetLogger($oLogger)
|
public function SetLogger($oLogger)
|
||||||
{
|
{
|
||||||
|
|
@ -140,12 +140,12 @@ class IspManagerChangePasswordDriver implements \RainLoop\Providers\ChangePasswo
|
||||||
{
|
{
|
||||||
$sSalt = '';
|
$sSalt = '';
|
||||||
$sBase64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|
$sBase64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|
||||||
|
|
||||||
for ($iIndex = 0; $iIndex < 8; $iIndex++)
|
for ($iIndex = 0; $iIndex < 8; $iIndex++)
|
||||||
{
|
{
|
||||||
$sSalt .= $sBase64[\rand(0, 63)];
|
$sSalt .= $sBase64[\rand(0, 63)];
|
||||||
}
|
}
|
||||||
|
|
||||||
return \crypt($sPassword, '$1$'.$sSalt.'$');
|
return \crypt($sPassword, '$1$'.$sSalt.'$');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1 +1 @@
|
||||||
Plugin that adds functionality to change the email account password (ISPmanager).
|
Plugin that adds functionality to change the email account password (ISPConfig).
|
||||||
1
plugins/ispconfig-change-password/VERSION
Normal file
1
plugins/ispconfig-change-password/VERSION
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
1.1
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
class IspmanagerChangePasswordPlugin extends \RainLoop\Plugins\AbstractPlugin
|
class IspconfigChangePasswordPlugin extends \RainLoop\Plugins\AbstractPlugin
|
||||||
{
|
{
|
||||||
public function Init()
|
public function Init()
|
||||||
{
|
{
|
||||||
|
|
@ -22,7 +22,7 @@ class IspmanagerChangePasswordPlugin extends \RainLoop\Plugins\AbstractPlugin
|
||||||
{
|
{
|
||||||
return 'The PHP exention PDO (mysql) must be installed to use this plugin';
|
return 'The PHP exention PDO (mysql) must be installed to use this plugin';
|
||||||
}
|
}
|
||||||
|
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -42,9 +42,9 @@ class IspmanagerChangePasswordPlugin extends \RainLoop\Plugins\AbstractPlugin
|
||||||
|
|
||||||
if (!empty($sDsn) && 0 < \strlen($sUser) && 0 < \strlen($sPassword))
|
if (!empty($sDsn) && 0 < \strlen($sUser) && 0 < \strlen($sPassword))
|
||||||
{
|
{
|
||||||
include_once __DIR__.'/IspManagerChangePasswordDriver.php';
|
include_once __DIR__.'/IspConfigChangePasswordDriver.php';
|
||||||
|
|
||||||
$oProvider = new IspManagerChangePasswordDriver();
|
$oProvider = new IspConfigChangePasswordDriver();
|
||||||
$oProvider->SetLogger($this->Manager()->Actions()->Logger());
|
$oProvider->SetLogger($this->Manager()->Actions()->Logger());
|
||||||
$oProvider->SetConfig($sDsn, $sUser, $sPassword);
|
$oProvider->SetConfig($sDsn, $sUser, $sPassword);
|
||||||
$oProvider->SetAllowedEmails(\strtolower(\trim($this->Config()->Get('plugin', 'allowed_emails', ''))));
|
$oProvider->SetAllowedEmails(\strtolower(\trim($this->Config()->Get('plugin', 'allowed_emails', ''))));
|
||||||
|
|
@ -60,7 +60,7 @@ class IspmanagerChangePasswordPlugin extends \RainLoop\Plugins\AbstractPlugin
|
||||||
public function configMapping()
|
public function configMapping()
|
||||||
{
|
{
|
||||||
return array(
|
return array(
|
||||||
\RainLoop\Plugins\Property::NewInstance('pdo_dsn')->SetLabel('ISPmanager PDO dsn')
|
\RainLoop\Plugins\Property::NewInstance('pdo_dsn')->SetLabel('ISPConfig PDO dsn')
|
||||||
->SetDefaultValue('mysql:host=127.0.0.1;dbname=dbispconfig'),
|
->SetDefaultValue('mysql:host=127.0.0.1;dbname=dbispconfig'),
|
||||||
\RainLoop\Plugins\Property::NewInstance('user')->SetLabel('DB User')
|
\RainLoop\Plugins\Property::NewInstance('user')->SetLabel('DB User')
|
||||||
->SetDefaultValue('root'),
|
->SetDefaultValue('root'),
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
1.0
|
|
||||||
|
|
@ -60,7 +60,7 @@ class HtmlUtils
|
||||||
{
|
{
|
||||||
$sHtmlAttrs = $aMatch[1];
|
$sHtmlAttrs = $aMatch[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
$aMatch = array();
|
$aMatch = array();
|
||||||
if (preg_match('/<body([^>]+)>/im', $sHtml, $aMatch) && !empty($aMatch[1]))
|
if (preg_match('/<body([^>]+)>/im', $sHtml, $aMatch) && !empty($aMatch[1]))
|
||||||
{
|
{
|
||||||
|
|
@ -71,7 +71,7 @@ class HtmlUtils
|
||||||
$sHtml = \preg_replace('/<\/body>/im', '', $sHtml);
|
$sHtml = \preg_replace('/<\/body>/im', '', $sHtml);
|
||||||
$sHtml = \preg_replace('/<html([^>]*)>/im', '', $sHtml);
|
$sHtml = \preg_replace('/<html([^>]*)>/im', '', $sHtml);
|
||||||
$sHtml = \preg_replace('/<\/html>/im', '', $sHtml);
|
$sHtml = \preg_replace('/<\/html>/im', '', $sHtml);
|
||||||
|
|
||||||
return $sHtml;
|
return $sHtml;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -83,8 +83,8 @@ class HtmlUtils
|
||||||
public static function ClearTags($sHtml)
|
public static function ClearTags($sHtml)
|
||||||
{
|
{
|
||||||
$aRemoveTags = array(
|
$aRemoveTags = array(
|
||||||
'head', 'link', 'base', 'meta', 'title', 'style', 'script', 'bgsound',
|
'head', 'link', 'base', 'meta', 'title', 'style', 'script', 'bgsound', 'keygen', 'source',
|
||||||
'object', 'embed', 'applet', 'mocha', 'iframe', 'frame', 'frameset'
|
'object', 'embed', 'applet', 'mocha', 'iframe', 'frame', 'frameset', 'video', 'audio'
|
||||||
);
|
);
|
||||||
|
|
||||||
$aToRemove = array(
|
$aToRemove = array(
|
||||||
|
|
@ -116,6 +116,7 @@ class HtmlUtils
|
||||||
'/on(DblClick)/si',
|
'/on(DblClick)/si',
|
||||||
'/on(Error)/si',
|
'/on(Error)/si',
|
||||||
'/on(Focus)/si',
|
'/on(Focus)/si',
|
||||||
|
'/on(FormChange)/si',
|
||||||
'/on(KeyDown)/si',
|
'/on(KeyDown)/si',
|
||||||
'/on(KeyPress)/si',
|
'/on(KeyPress)/si',
|
||||||
'/on(KeyUp)/si',
|
'/on(KeyUp)/si',
|
||||||
|
|
@ -418,7 +419,7 @@ class HtmlUtils
|
||||||
foreach ($aNodes as /* @var $oElement \DOMElement */ $oElement)
|
foreach ($aNodes as /* @var $oElement \DOMElement */ $oElement)
|
||||||
{
|
{
|
||||||
$sTagNameLower = \strtolower($oElement->tagName);
|
$sTagNameLower = \strtolower($oElement->tagName);
|
||||||
|
|
||||||
// convert body attributes to styles
|
// convert body attributes to styles
|
||||||
if ('body' === $sTagNameLower)
|
if ('body' === $sTagNameLower)
|
||||||
{
|
{
|
||||||
|
|
@ -429,7 +430,7 @@ class HtmlUtils
|
||||||
'bottommargin' => '',
|
'bottommargin' => '',
|
||||||
'rightmargin' => ''
|
'rightmargin' => ''
|
||||||
);
|
);
|
||||||
|
|
||||||
if (isset($oElement->attributes))
|
if (isset($oElement->attributes))
|
||||||
{
|
{
|
||||||
foreach ($oElement->attributes as $sAttributeName => /* @var $oAttributeNode \DOMNode */ $oAttributeNode)
|
foreach ($oElement->attributes as $sAttributeName => /* @var $oAttributeNode \DOMNode */ $oAttributeNode)
|
||||||
|
|
@ -451,7 +452,7 @@ class HtmlUtils
|
||||||
if (\is_array($aItem))
|
if (\is_array($aItem))
|
||||||
{
|
{
|
||||||
$oElement->removeAttribute($aItem[0]);
|
$oElement->removeAttribute($aItem[0]);
|
||||||
|
|
||||||
switch ($sIndex)
|
switch ($sIndex)
|
||||||
{
|
{
|
||||||
case 'text':
|
case 'text':
|
||||||
|
|
@ -484,7 +485,7 @@ class HtmlUtils
|
||||||
{
|
{
|
||||||
$oElement->setAttribute('src', 'javascript:false');
|
$oElement->setAttribute('src', 'javascript:false');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (\in_array($sTagNameLower, array('a', 'form', 'area')))
|
if (\in_array($sTagNameLower, array('a', 'form', 'area')))
|
||||||
{
|
{
|
||||||
$oElement->setAttribute('target', '_blank');
|
$oElement->setAttribute('target', '_blank');
|
||||||
|
|
@ -500,12 +501,22 @@ class HtmlUtils
|
||||||
// $oElement->removeAttribute('style');
|
// $oElement->removeAttribute('style');
|
||||||
// }
|
// }
|
||||||
|
|
||||||
@$oElement->removeAttribute('id');
|
foreach (array(
|
||||||
@$oElement->removeAttribute('class');
|
'id', 'class', 'contenteditable', 'designmode', 'formaction', 'data-bind', 'xmlns'
|
||||||
@$oElement->removeAttribute('contenteditable');
|
) as $sAttr)
|
||||||
@$oElement->removeAttribute('designmode');
|
{
|
||||||
@$oElement->removeAttribute('data-bind');
|
@$oElement->removeAttribute($sAttr);
|
||||||
@$oElement->removeAttribute('xmlns');
|
}
|
||||||
|
|
||||||
|
foreach (array(
|
||||||
|
'load', 'blur', 'error', 'focus', 'formchange', 'change',
|
||||||
|
'click', 'dblclick', 'keydown', 'keypress', 'keyup',
|
||||||
|
'mousedown', 'mouseenter', 'mouseleave', 'mousemove', 'mouseout', 'mouseover', 'mouseup',
|
||||||
|
'move', 'resize', 'resizeend', 'resizestart', 'scroll', 'select', 'submit', 'upload'
|
||||||
|
) as $sAttr)
|
||||||
|
{
|
||||||
|
@$oElement->removeAttribute('on'.$sAttr);
|
||||||
|
}
|
||||||
|
|
||||||
if ($oElement->hasAttribute('href'))
|
if ($oElement->hasAttribute('href'))
|
||||||
{
|
{
|
||||||
|
|
@ -544,7 +555,7 @@ class HtmlUtils
|
||||||
{
|
{
|
||||||
$oElement->setAttribute('data-x-src', $sSrc);
|
$oElement->setAttribute('data-x-src', $sSrc);
|
||||||
}
|
}
|
||||||
|
|
||||||
$bHasExternals = true;
|
$bHasExternals = true;
|
||||||
}
|
}
|
||||||
else if ('data:image/' === \strtolower(\substr(\trim($sSrc), 0, 11)))
|
else if ('data:image/' === \strtolower(\substr(\trim($sSrc), 0, 11)))
|
||||||
|
|
@ -626,7 +637,7 @@ class HtmlUtils
|
||||||
foreach ($aNodes as /* @var $oElement \DOMElement */ $oElement)
|
foreach ($aNodes as /* @var $oElement \DOMElement */ $oElement)
|
||||||
{
|
{
|
||||||
$sTagNameLower = \strtolower($oElement->tagName);
|
$sTagNameLower = \strtolower($oElement->tagName);
|
||||||
|
|
||||||
if ($oElement->hasAttribute('data-x-src-cid'))
|
if ($oElement->hasAttribute('data-x-src-cid'))
|
||||||
{
|
{
|
||||||
$sCid = $oElement->getAttribute('data-x-src-cid');
|
$sCid = $oElement->getAttribute('data-x-src-cid');
|
||||||
|
|
@ -640,7 +651,7 @@ class HtmlUtils
|
||||||
$oElement->setAttribute('src', 'cid:'.$sCid);
|
$oElement->setAttribute('src', 'cid:'.$sCid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($oElement->hasAttribute('data-x-src-location'))
|
if ($oElement->hasAttribute('data-x-src-location'))
|
||||||
{
|
{
|
||||||
$sSrc = $oElement->getAttribute('data-x-src-location');
|
$sSrc = $oElement->getAttribute('data-x-src-location');
|
||||||
|
|
@ -838,10 +849,10 @@ class HtmlUtils
|
||||||
|
|
||||||
return $sText;
|
return $sText;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string $sText
|
* @param string $sText
|
||||||
*
|
*
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public static function ConvertHtmlToPlain($sText)
|
public static function ConvertHtmlToPlain($sText)
|
||||||
|
|
@ -937,7 +948,7 @@ class HtmlUtils
|
||||||
'\'',
|
'\'',
|
||||||
''
|
''
|
||||||
), $sText);
|
), $sText);
|
||||||
|
|
||||||
$sText = str_ireplace('<div>',"\n<div>", $sText);
|
$sText = str_ireplace('<div>',"\n<div>", $sText);
|
||||||
$sText = strip_tags($sText, '');
|
$sText = strip_tags($sText, '');
|
||||||
$sText = preg_replace("/\n\\s+\n/", "\n", $sText);
|
$sText = preg_replace("/\n\\s+\n/", "\n", $sText);
|
||||||
|
|
|
||||||
|
|
@ -1295,7 +1295,7 @@ class Actions
|
||||||
$aResult['Language'] = $this->ValidateLanguage($sLanguage);
|
$aResult['Language'] = $this->ValidateLanguage($sLanguage);
|
||||||
$aResult['UserLanguage'] = $bUserLanguage;
|
$aResult['UserLanguage'] = $bUserLanguage;
|
||||||
$aResult['LangLink'] = APP_INDEX_FILE.'?/Lang/0/'.($bAdmin ? 'en' : $aResult['Language']).'/'.$sStaticCache.'/';
|
$aResult['LangLink'] = APP_INDEX_FILE.'?/Lang/0/'.($bAdmin ? 'en' : $aResult['Language']).'/'.$sStaticCache.'/';
|
||||||
$aResult['TemplatesLink'] = APP_INDEX_FILE.'?/Templates/0/'.$sStaticCache.'/';
|
$aResult['TemplatesLink'] = APP_INDEX_FILE.'?/Templates/0/'.($bAdmin ? 'Admin' : 'App').'/'.$sStaticCache.'/';
|
||||||
$aResult['PluginsLink'] = $sPluginsLink;
|
$aResult['PluginsLink'] = $sPluginsLink;
|
||||||
$aResult['EditorDefaultType'] = 'Html' === $aResult['EditorDefaultType'] ? 'Html' : 'Plain';
|
$aResult['EditorDefaultType'] = 'Html' === $aResult['EditorDefaultType'] ? 'Html' : 'Plain';
|
||||||
|
|
||||||
|
|
@ -6079,7 +6079,10 @@ class Actions
|
||||||
{
|
{
|
||||||
$oConfig = $this->Config();
|
$oConfig = $this->Config();
|
||||||
|
|
||||||
$aResult = array(\RainLoop\Enumerations\Capa::PREM);
|
$aResult = array(
|
||||||
|
\RainLoop\Enumerations\Capa::PREM,
|
||||||
|
\RainLoop\Enumerations\Capa::FILTERS
|
||||||
|
);
|
||||||
|
|
||||||
if ($oConfig->Get('webmail', 'allow_additional_accounts', false))
|
if ($oConfig->Get('webmail', 'allow_additional_accounts', false))
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,16 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace RainLoop\Enumerations;
|
namespace RainLoop\Enumerations;
|
||||||
|
|
||||||
class Capa
|
class Capa
|
||||||
{
|
{
|
||||||
const PREM = 'PREM';
|
const PREM = 'PREM';
|
||||||
const TWO_FACTOR = 'TWO_FACTOR';
|
const TWO_FACTOR = 'TWO_FACTOR';
|
||||||
const OPEN_PGP = 'OPEN_PGP';
|
const OPEN_PGP = 'OPEN_PGP';
|
||||||
const PREFETCH = 'PREFETCH';
|
const PREFETCH = 'PREFETCH';
|
||||||
const GRAVATAR = 'GRAVATAR';
|
const GRAVATAR = 'GRAVATAR';
|
||||||
const THEMES = 'THEMES';
|
const THEMES = 'THEMES';
|
||||||
const ADDITIONAL_ACCOUNTS = 'ADDITIONAL_ACCOUNTS';
|
const FILTERS = 'FILTERS';
|
||||||
const ADDITIONAL_IDENTITIES = 'ADDITIONAL_IDENTITIES';
|
const ADDITIONAL_ACCOUNTS = 'ADDITIONAL_ACCOUNTS';
|
||||||
}
|
const ADDITIONAL_IDENTITIES = 'ADDITIONAL_IDENTITIES';
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,11 @@ class ServiceActions
|
||||||
*/
|
*/
|
||||||
protected $aPaths;
|
protected $aPaths;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $sQuery;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param \MailSo\Base\Http $oHttp
|
* @param \MailSo\Base\Http $oHttp
|
||||||
* @param \RainLoop\Actions $oActions
|
* @param \RainLoop\Actions $oActions
|
||||||
|
|
@ -30,6 +35,7 @@ class ServiceActions
|
||||||
$this->oHttp = $oHttp;
|
$this->oHttp = $oHttp;
|
||||||
$this->oActions = $oActions;
|
$this->oActions = $oActions;
|
||||||
$this->aPaths = array();
|
$this->aPaths = array();
|
||||||
|
$this->sQuery = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -449,16 +455,18 @@ class ServiceActions
|
||||||
$this->oActions->verifyCacheByKey($this->sQuery);
|
$this->oActions->verifyCacheByKey($this->sQuery);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$bAdmin = false !== \strpos($this->sQuery, 'Admin');
|
||||||
|
|
||||||
$sCacheFileName = '';
|
$sCacheFileName = '';
|
||||||
if ($bCacheEnabled)
|
if ($bCacheEnabled)
|
||||||
{
|
{
|
||||||
$sCacheFileName = 'TEMPLATES:'.$this->oActions->Plugins()->Hash().APP_VERSION;
|
$sCacheFileName = 'TEMPLATES:'.($bAdmin ? 'Admin/' : 'App/').$this->oActions->Plugins()->Hash().APP_VERSION;
|
||||||
$sResult = $this->Cacher()->Get($sCacheFileName);
|
$sResult = $this->Cacher()->Get($sCacheFileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (0 === \strlen($sResult))
|
if (0 === \strlen($sResult))
|
||||||
{
|
{
|
||||||
$sResult = $this->compileTemplates(false);
|
$sResult = $this->compileTemplates($bAdmin);
|
||||||
if ($bCacheEnabled && 0 < \strlen($sCacheFileName))
|
if ($bCacheEnabled && 0 < \strlen($sCacheFileName))
|
||||||
{
|
{
|
||||||
$this->Cacher()->Set($sCacheFileName, $sResult);
|
$this->Cacher()->Set($sCacheFileName, $sResult);
|
||||||
|
|
@ -1021,20 +1029,16 @@ class ServiceActions
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param bool $bAdmin = false
|
* @param bool $bAdmin = false
|
||||||
* @param bool $bWrapByScriptTag = true
|
|
||||||
*
|
*
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
private function compileTemplates($bAdmin = false, $bWrapByScriptTag = false)
|
private function compileTemplates($bAdmin = false)
|
||||||
{
|
{
|
||||||
$sHtml = \RainLoop\Utils::CompileTemplates(APP_VERSION_ROOT_PATH.'app/templates/Views', $this->oActions).
|
$sHtml = \RainLoop\Utils::CompileTemplates(APP_VERSION_ROOT_PATH.'app/templates/Views/'.($bAdmin ? 'Admin' : 'App'), $this->oActions).
|
||||||
|
\RainLoop\Utils::CompileTemplates(APP_VERSION_ROOT_PATH.'app/templates/Views/Common', $this->oActions).
|
||||||
$this->oActions->Plugins()->CompileTemplate($bAdmin);
|
$this->oActions->Plugins()->CompileTemplate($bAdmin);
|
||||||
|
|
||||||
return
|
return 'window.rainloopTEMPLATES='.\MailSo\Base\Utils::Php2js(array($sHtml)).';';
|
||||||
($bWrapByScriptTag ? '<script type="text/javascript" data-cfasync="false">' : '').
|
|
||||||
'window.rainloopTEMPLATES='.\MailSo\Base\Utils::Php2js(array($sHtml)).';'.
|
|
||||||
($bWrapByScriptTag ? '</script>' : '')
|
|
||||||
;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@
|
||||||
<!--[if lte IE 7]>
|
<!--[if lte IE 7]>
|
||||||
<meta http-equiv="refresh" content="0; URL={{BaseAppIndexFile}}?/BadBrowser" />
|
<meta http-equiv="refresh" content="0; URL={{BaseAppIndexFile}}?/BadBrowser" />
|
||||||
<![endif]-->
|
<![endif]-->
|
||||||
<script type="text/javascript">
|
<script type="text/javascript" data-cfasync="false">
|
||||||
function __fIncludeScr(sSrc) {
|
function __fIncludeScr(sSrc) {
|
||||||
document.write(unescape('%3Csc' + 'ript data-cfasync="false" type="text/jav' + 'ascr' + 'ipt" sr' + 'c="' + sSrc + '"%3E%3C/' + 'scr' + 'ipt%3E'));
|
document.write(unescape('%3Csc' + 'ript data-cfasync="false" type="text/jav' + 'ascr' + 'ipt" sr' + 'c="' + sSrc + '"%3E%3C/' + 'scr' + 'ipt%3E'));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,24 +1,24 @@
|
||||||
<div class="b-admin-left g-ui-user-select-none">
|
<div class="b-admin-left g-ui-user-select-none">
|
||||||
<div class="b-toolbar">
|
<div class="b-toolbar">
|
||||||
<div class="btn-group show-on-panel-disabled">
|
<div class="btn-group show-on-panel-disabled">
|
||||||
<a class="btn buttonResize" data-bind="click: function () { leftPanelDisabled(!leftPanelDisabled()); }">
|
<a class="btn buttonResize" data-bind="click: function () { leftPanelDisabled(!leftPanelDisabled()); }">
|
||||||
<i data-bind="css: {'icon-resize-out': leftPanelDisabled(), 'icon-resize-in': !leftPanelDisabled()}"></i>
|
<i data-bind="css: {'icon-resize-out': leftPanelDisabled(), 'icon-resize-in': !leftPanelDisabled()}"></i>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="b-content thm-settings-menu opacity-on-panel-disabled">
|
<div class="b-content thm-settings-menu opacity-on-panel-disabled">
|
||||||
<div class="b-admin-menu" data-bind="foreach: menu">
|
<div class="b-admin-menu" data-bind="foreach: menu">
|
||||||
<!-- ko if: disabled -->
|
<!-- ko if: disabled -->
|
||||||
<span class="e-item disabled">
|
<span class="e-item disabled">
|
||||||
<span class="i18n e-link" data-bind="attr: { 'data-i18n-text': label }"></span>
|
<span class="i18n e-link" data-bind="attr: { 'data-i18n-text': label }"></span>
|
||||||
</span>
|
</span>
|
||||||
<!-- /ko -->
|
<!-- /ko -->
|
||||||
<!-- ko ifnot: disabled -->
|
<!-- ko ifnot: disabled -->
|
||||||
<a class="e-item selectable" href="#" data-bind="css: {'selected': selected }, attr: { 'href': $root.link(route) }">
|
<a class="e-item selectable" href="#" data-bind="css: {'selected': selected }, attr: { 'href': $root.link(route) }">
|
||||||
<span class="i18n e-link" data-bind="attr: { 'data-i18n-text': label }"></span>
|
<span class="i18n e-link" data-bind="attr: { 'data-i18n-text': label }"></span>
|
||||||
</a>
|
</a>
|
||||||
<!-- /ko -->
|
<!-- /ko -->
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="b-content show-on-panel-disabled" data-bind="click: function () { leftPanelDisabled(false); }"></div>
|
<div class="b-content show-on-panel-disabled" data-bind="click: function () { leftPanelDisabled(false); }"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -16,28 +16,41 @@
|
||||||
<h1 style="margin-bottom: 0;">RainLoop</h1>
|
<h1 style="margin-bottom: 0;">RainLoop</h1>
|
||||||
<h4 style="margin-top: 0;"><span data-bind="text: version"></span></h4>
|
<h4 style="margin-top: 0;"><span data-bind="text: version"></span></h4>
|
||||||
<h4 style="color: #aaa; font-weight: normal;">Simple, modern & fast web-based email client</h4>
|
<h4 style="color: #aaa; font-weight: normal;">Simple, modern & fast web-based email client</h4>
|
||||||
<h5 style="color: #aaa; font-weight: normal; margin-top: 40px;">
|
<h5 style="font-weight: normal; margin-top: 40px;">
|
||||||
<div data-bind="visible: 'error' === statusType()">
|
<div data-bind="visible: 'error' === statusType()">
|
||||||
<i class="icon-warning" style="color: red"></i>
|
<i class="icon-warning" style="color: red"></i>
|
||||||
|
|
||||||
<span data-bind="text: errorDesc">Error</span>
|
<span data-bind="text: errorDesc"></span>
|
||||||
</div>
|
</div>
|
||||||
<div data-bind="visible: 'available' === statusType()">
|
<div data-bind="visible: 'available' === statusType()">
|
||||||
<i class="icon-warning" style="color: blue"></i>
|
<i class="icon-bolt" style="color: red"></i>
|
||||||
|
|
||||||
New <b data-bind="text: coreRemoteVersion"></b> version is available.
|
New <b data-bind="text: coreRemoteVersion"></b> version is available.
|
||||||
<span data-bind="visible: '' !== coreRemoteRelease()">
|
<span data-bind="visible: '' !== coreRemoteRelease()">
|
||||||
(<span data-bind="text: coreRemoteRelease"></span>)
|
(<span data-bind="text: coreRemoteRelease"></span>)
|
||||||
</span>
|
</span>
|
||||||
<br />
|
<br />
|
||||||
|
<br />
|
||||||
<span data-bind="visible: coreUpdatable() && coreAccess()">
|
<span data-bind="visible: coreUpdatable() && coreAccess()">
|
||||||
<span class="g-ui-link" data-bind="click: updateCoreData">Update</span>
|
<a class="btn" data-bind="click: updateCoreData">
|
||||||
|
<i class="icon-sync"></i>
|
||||||
|
|
||||||
|
Update
|
||||||
|
</a>
|
||||||
|
|
||||||
</span>
|
</span>
|
||||||
<span data-bind="visible: coreAccess()">
|
<span data-bind="visible: coreAccess()">
|
||||||
<a class="g-ui-link" href="http://rainloop.net/downloads/" target="_blank">Download</a>
|
<a class="btn" href="http://rainloop.net/downloads/" target="_blank">
|
||||||
|
<i class="icon-download"></i>
|
||||||
|
|
||||||
|
Download
|
||||||
|
</a>
|
||||||
|
|
||||||
<a class="g-ui-link" href="http://rainloop.net/changelog/" target="_blank">Changelog</a>
|
<a class="btn" href="http://rainloop.net/changelog/" target="_blank">
|
||||||
|
<i class="icon-file-text"></i>
|
||||||
|
|
||||||
|
Changelog
|
||||||
|
</a>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div data-bind="visible: 'up-to-date' === statusType()">
|
<div data-bind="visible: 'up-to-date' === statusType()">
|
||||||
|
|
@ -36,7 +36,7 @@
|
||||||
<div data-bind="visible: licensingProcess()">
|
<div data-bind="visible: licensingProcess()">
|
||||||
<i class="icon-spinner animated"></i>
|
<i class="icon-spinner animated"></i>
|
||||||
|
|
||||||
checking...
|
Checking…
|
||||||
</div>
|
</div>
|
||||||
<div data-bind="visible: !licensingProcess()">
|
<div data-bind="visible: !licensingProcess()">
|
||||||
<div class="alert alert-block span8" style="margin-left: 0" data-bind="visible: !licensing()">
|
<div class="alert alert-block span8" style="margin-left: 0" data-bind="visible: !licensing()">
|
||||||
|
|
@ -1,28 +1,28 @@
|
||||||
<div class="b-admin-plugin-property">
|
<div class="b-admin-plugin-property">
|
||||||
<label class="control-label">
|
<label class="control-label">
|
||||||
<span data-bind="text: Label, visible: 5 !== Type"></span>
|
<span data-bind="text: Label, visible: 5 !== Type"></span>
|
||||||
</label>
|
</label>
|
||||||
<div class="controls">
|
<div class="controls">
|
||||||
<!-- ko if: 0 === Type || 1 === Type -->
|
<!-- ko if: 0 === Type || 1 === Type -->
|
||||||
<input type="text" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" data-bind="value: value" />
|
<input type="text" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" data-bind="value: value" />
|
||||||
<!-- /ko -->
|
<!-- /ko -->
|
||||||
<!-- ko if: 3 === Type -->
|
<!-- ko if: 3 === Type -->
|
||||||
<input type="password" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" data-bind="value: value" />
|
<input type="password" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" data-bind="value: value" />
|
||||||
<!-- /ko -->
|
<!-- /ko -->
|
||||||
<!-- ko if: 2 === Type -->
|
<!-- ko if: 2 === Type -->
|
||||||
<textarea autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" data-bind="value: value"></textarea>
|
<textarea autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" data-bind="value: value"></textarea>
|
||||||
<!-- /ko -->
|
<!-- /ko -->
|
||||||
<!-- ko if: 4 === Type -->
|
<!-- ko if: 4 === Type -->
|
||||||
<select data-bind="options: Default, value: value"></select>
|
<select data-bind="options: Default, value: value"></select>
|
||||||
<!-- /ko -->
|
<!-- /ko -->
|
||||||
<!-- ko if: 5 === Type -->
|
<!-- ko if: 5 === Type -->
|
||||||
<label data-bind="click: function () { value(!value()); }">
|
<label data-bind="click: function () { value(!value()); }">
|
||||||
<i data-bind="css: value() ? 'icon-checkbox-checked' : 'icon-checkbox-unchecked'"></i>
|
<i data-bind="css: value() ? 'icon-checkbox-checked' : 'icon-checkbox-unchecked'"></i>
|
||||||
|
|
||||||
<span data-bind="text: Label"></span>
|
<span data-bind="text: Label"></span>
|
||||||
</label>
|
</label>
|
||||||
<!-- /ko -->
|
<!-- /ko -->
|
||||||
<span class="help-block" style="color: #ccc" data-bind="text: Desc, visible: '' !== Desc"></span>
|
<span class="help-block" style="color: #ccc" data-bind="text: Desc, visible: '' !== Desc"></span>
|
||||||
</div>
|
</div>
|
||||||
<br />
|
<br />
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -3,15 +3,6 @@
|
||||||
<div class="legend">
|
<div class="legend">
|
||||||
Security
|
Security
|
||||||
</div>
|
</div>
|
||||||
<div class="control-group">
|
|
||||||
<div class="controls">
|
|
||||||
<label data-bind="click: function () { csrfProtection(!csrfProtection()); }">
|
|
||||||
<i data-bind="css: csrfProtection() ? 'icon-checkbox-checked' : 'icon-checkbox-unchecked'"></i>
|
|
||||||
|
|
||||||
<abbr title="Cross-site request forgery" class="initialism">CSRF</abbr> protection
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="control-group">
|
<div class="control-group">
|
||||||
<div class="controls">
|
<div class="controls">
|
||||||
<label data-bind="click: function () { capaOpenPGP(!capaOpenPGP()); }">
|
<label data-bind="click: function () { capaOpenPGP(!capaOpenPGP()); }">
|
||||||
|
|
@ -36,6 +27,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<br />
|
||||||
<div class="form-horizontal">
|
<div class="form-horizontal">
|
||||||
<div class="legend">
|
<div class="legend">
|
||||||
Changer Admin Password
|
Changer Admin Password
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
<div class="e-item b-folder-system-item">
|
<div class="e-item b-folder-system-item">
|
||||||
<a class="e-link" data-bind="droppable: function (oEvent, oUi) { $root.messagesDrop($data, oUi); }, css: { 'selected': selected, 'selectable': selectable, 'print-count': 0 < printableUnreadCount().length, 'anim-action-class': actionBlink }">
|
<a class="e-link" data-bind="droppable: function (oEvent, oUi) { $root.messagesDrop($data, oUi); }, css: { 'selected': selected, 'selectable': selectable, 'print-count': 0 < printableUnreadCount().length, 'anim-action-class': actionBlink }">
|
||||||
<span class="badge pull-right count" data-bind="text: printableUnreadCount"></span>
|
<span class="badge pull-right count" data-bind="text: printableUnreadCount"></span>
|
||||||
|
|
||||||
<span class="name" data-bind="text: localName()"></span>
|
<span class="name" data-bind="text: localName()"></span>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -1,56 +1,56 @@
|
||||||
<style>
|
<style>
|
||||||
html, body {
|
html, body {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
font-family: arial, sans-serif;
|
font-family: arial, sans-serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tbl {width:100%;font-family:normal 11px Tahoma, Arial, Helvetica, "sans-serif"}
|
.tbl {width:100%;font-family:normal 11px Tahoma, Arial, Helvetica, "sans-serif"}
|
||||||
.tt {padding:5px;border:solid #ddd;border-width:0px 0px 1px 0px}
|
.tt {padding:5px;border:solid #ddd;border-width:0px 0px 1px 0px}
|
||||||
.tv {padding:5px;border:solid #ddd;border-width:0px 0px 1px 1px}
|
.tv {padding:5px;border:solid #ddd;border-width:0px 0px 1px 1px}
|
||||||
.tb {padding:15px}
|
.tb {padding:15px}
|
||||||
a {color: blue; text-decoration: underline}
|
a {color: blue; text-decoration: underline}
|
||||||
a:visited {color: #609}
|
a:visited {color: #609}
|
||||||
a:active {color: red}
|
a:active {color: red}
|
||||||
blockquote {border-left: 2px solid black; margin: 0; padding: 0px 10px}
|
blockquote {border-left: 2px solid black; margin: 0; padding: 0px 10px}
|
||||||
pre {margin: 0px; padding: 0px; font-family: arial, sans-serif; background: #fff; border: none; white-space: normal}
|
pre {margin: 0px; padding: 0px; font-family: arial, sans-serif; background: #fff; border: none; white-space: normal}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<table cellpadding="0" cellspacing="0" class="tbl">
|
<table cellpadding="0" cellspacing="0" class="tbl">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="tt i18n" data-i18n-text="MESSAGE/PRINT_LABEL_FROM"></td>
|
<td class="tt i18n" data-i18n-text="MESSAGE/PRINT_LABEL_FROM"></td>
|
||||||
<td class="tv" data-bind="text: popupFrom"></td>
|
<td class="tv" data-bind="text: popupFrom"></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="tt i18n" data-i18n-text="MESSAGE/PRINT_LABEL_TO"></td>
|
<td class="tt i18n" data-i18n-text="MESSAGE/PRINT_LABEL_TO"></td>
|
||||||
<td class="tv" data-bind="text: popupTo"></td>
|
<td class="tv" data-bind="text: popupTo"></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr data-bind="visible: '' !== popupCc">
|
<tr data-bind="visible: '' !== popupCc">
|
||||||
<td class="tt i18n" data-i18n-text="MESSAGE/PRINT_LABEL_CC"></td>
|
<td class="tt i18n" data-i18n-text="MESSAGE/PRINT_LABEL_CC"></td>
|
||||||
<td class="tv" data-bind="text: popupCc"></td>
|
<td class="tv" data-bind="text: popupCc"></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr data-bind="visible: '' !== popupBcc">
|
<tr data-bind="visible: '' !== popupBcc">
|
||||||
<td class="tt i18n" data-i18n-text="MESSAGE/PRINT_LABEL_BCC"></td>
|
<td class="tt i18n" data-i18n-text="MESSAGE/PRINT_LABEL_BCC"></td>
|
||||||
<td class="tv" data-bind="text: popupBcc"></td>
|
<td class="tv" data-bind="text: popupBcc"></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr data-bind="visible: '' !== popupDate">
|
<tr data-bind="visible: '' !== popupDate">
|
||||||
<td class="tt i18n" data-i18n-text="MESSAGE/PRINT_LABEL_DATE"></td>
|
<td class="tt i18n" data-i18n-text="MESSAGE/PRINT_LABEL_DATE"></td>
|
||||||
<td class="tv" data-bind="text: popupDate"></td>
|
<td class="tv" data-bind="text: popupDate"></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="tt i18n" data-i18n-text="MESSAGE/PRINT_LABEL_SUBJECT"></td>
|
<td class="tt i18n" data-i18n-text="MESSAGE/PRINT_LABEL_SUBJECT"></td>
|
||||||
<td class="tv" data-bind="text: popupSubject"></td>
|
<td class="tv" data-bind="text: popupSubject"></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr data-bind="visible: '' !== popupAttachments">
|
<tr data-bind="visible: '' !== popupAttachments">
|
||||||
<td class="tt i18n" data-i18n-text="MESSAGE/PRINT_LABEL_ATTACHMENTS"></td>
|
<td class="tt i18n" data-i18n-text="MESSAGE/PRINT_LABEL_ATTACHMENTS"></td>
|
||||||
<td class="tv" data-bind="text: popupAttachments"></td>
|
<td class="tv" data-bind="text: popupAttachments"></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td colspan="2" class="tb">
|
<td colspan="2" class="tb">
|
||||||
<div data-bind="html: popupBody"></div>
|
<div data-bind="html: popupBody"></div>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
<div class="settingsCustom">
|
<div class="settingsCustom">
|
||||||
CUSTOM
|
CUSTOM
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -0,0 +1,38 @@
|
||||||
|
<div class="b-settings-filters g-ui-user-select-none">
|
||||||
|
<div class="form-horizontal">
|
||||||
|
<div class="legend">
|
||||||
|
<span class="i18n" data-i18n-text="SETTINGS_FILTERS/LEGEND_FILTERS"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div data-bind="foreach: filters">
|
||||||
|
<div class="filter" style="background-color: #ddd">
|
||||||
|
FILTER
|
||||||
|
<div data-bind="foreach: conditions">
|
||||||
|
COND
|
||||||
|
<br />
|
||||||
|
<span class="delete-condition" data-bind="click: function (oCondition) { $parent.deleteCondition(oCondition); }">
|
||||||
|
<i class="icon-trash"></i>
|
||||||
|
</span>
|
||||||
|
<br />
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
<a class="btn" data-bind="click: addCondition">
|
||||||
|
<i class="icon-plus"></i>
|
||||||
|
|
||||||
|
<span class="i18n" data-i18n-text="SETTINGS_FILTERS/BUTTON_ADD_CONDITION"></span>
|
||||||
|
</a>
|
||||||
|
<br />
|
||||||
|
<span class="delete-filter" data-bind="click: function (oFilter) { $parent.deleteFilter(oFilter); }">
|
||||||
|
<i class="icon-trash"></i>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a class="btn" data-bind="click: addFilter">
|
||||||
|
<i class="icon-filter"></i>
|
||||||
|
|
||||||
|
<span class="i18n" data-i18n-text="SETTINGS_FILTERS/BUTTON_ADD_FILTER"></span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
@ -1,24 +1,24 @@
|
||||||
<div class="b-settins-left g-ui-user-select-none">
|
<div class="b-settins-left g-ui-user-select-none">
|
||||||
<div class="b-toolbar">
|
<div class="b-toolbar">
|
||||||
<div class="btn-group">
|
<div class="btn-group">
|
||||||
<a class="btn buttonResize" data-bind="click: function () { leftPanelDisabled(!leftPanelDisabled()); }">
|
<a class="btn buttonResize" data-bind="click: function () { leftPanelDisabled(!leftPanelDisabled()); }">
|
||||||
<i data-bind="css: {'icon-resize-out': leftPanelDisabled(), 'icon-resize-in': !leftPanelDisabled()}"></i>
|
<i data-bind="css: {'icon-resize-out': leftPanelDisabled(), 'icon-resize-in': !leftPanelDisabled()}"></i>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="b-content thm-settings-menu opacity-on-panel-disabled">
|
<div class="b-content thm-settings-menu opacity-on-panel-disabled">
|
||||||
<div class="b-settings-menu" data-bind="foreach: menu">
|
<div class="b-settings-menu" data-bind="foreach: menu">
|
||||||
<!-- ko if: disabled -->
|
<!-- ko if: disabled -->
|
||||||
<span class="e-item disabled">
|
<span class="e-item disabled">
|
||||||
<span class="i18n e-link" data-bind="attr: { 'data-i18n-text': label }"></span>
|
<span class="i18n e-link" data-bind="attr: { 'data-i18n-text': label }"></span>
|
||||||
</span>
|
</span>
|
||||||
<!-- /ko -->
|
<!-- /ko -->
|
||||||
<!-- ko ifnot: disabled -->
|
<!-- ko ifnot: disabled -->
|
||||||
<a class="e-item selectable" href="#" data-bind="css: {'selected': selected }, attr: { 'href': $root.link(route) }">
|
<a class="e-item selectable" href="#" data-bind="css: {'selected': selected }, attr: { 'href': $root.link(route) }">
|
||||||
<span class="i18n e-link" data-bind="attr: { 'data-i18n-text': label }"></span>
|
<span class="i18n e-link" data-bind="attr: { 'data-i18n-text': label }"></span>
|
||||||
</a>
|
</a>
|
||||||
<!-- /ko -->
|
<!-- /ko -->
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="b-content show-on-panel-disabled" data-bind="click: function () { leftPanelDisabled(false); }"></div>
|
<div class="b-content show-on-panel-disabled" data-bind="click: function () { leftPanelDisabled(false); }"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -1,14 +1,6 @@
|
||||||
<div class="b-system-drop-down g-ui-user-select-none">
|
<div class="b-system-drop-down g-ui-user-select-none">
|
||||||
<div class="b-toolbar">
|
<div class="b-toolbar">
|
||||||
<div class="btn-toolbar">
|
<div class="btn-toolbar">
|
||||||
<!-- <div class="btn-group pull-right">
|
|
||||||
<a class="btn btn-narrow" data-bind="click: logoutClick">
|
|
||||||
<i class="icon-power"></i>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="btn-group pull-right">
|
|
||||||
|
|
||||||
</div>-->
|
|
||||||
<div class="btn-group pull-right dropdown colored-toggle" data-bind="registrateBootstrapDropdown: true, openDropdownTrigger: accountMenuDropdownTrigger">
|
<div class="btn-group pull-right dropdown colored-toggle" data-bind="registrateBootstrapDropdown: true, openDropdownTrigger: accountMenuDropdownTrigger">
|
||||||
<a id="top-system-dropdown-id" href="#" tabindex="-1" class="btn btn-ellipsis btn-block dropdown-toggle system-dropdown"
|
<a id="top-system-dropdown-id" href="#" tabindex="-1" class="btn btn-ellipsis btn-block dropdown-toggle system-dropdown"
|
||||||
data-toggle="dropdown" data-tooltip-placement="left"
|
data-toggle="dropdown" data-tooltip-placement="left"
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue