Code refactoring

a lot of small fixes (Closes #173)
Added login field (ownCloud package)
This commit is contained in:
RainLoop Team 2014-05-24 02:14:16 +04:00
parent a059b3d063
commit fed896776f
129 changed files with 1016 additions and 804 deletions

View file

@ -273,6 +273,8 @@ module.exports = function (grunt) {
"dev/Models/FolderModel.js",
"dev/Models/AccountModel.js",
"dev/Models/IdentityModel.js",
"dev/Models/FilterConditionModel.js",
"dev/Models/FilterModel.js",
"dev/Models/OpenPgpKeyModel.js",
"dev/ViewModels/PopupsFolderClearViewModel.js",
@ -310,6 +312,7 @@ module.exports = function (grunt) {
"dev/Settings/Accounts.js",
"dev/Settings/Identity.js",
"dev/Settings/Identities.js",
"dev/Settings/Filters.js",
"dev/Settings/Security.js",
"dev/Settings/Social.js",
"dev/Settings/ChangePassword.js",
@ -475,7 +478,7 @@ module.exports = function (grunt) {
releasesPath = grunt.config('cfg.releasesPath'),
devVersion = grunt.config('cfg.devVersion'),
versionFull = version + '.' + release,
versionOwn = '1.1',
versionOwn = grunt.config('pkg.ownCloudPackageVersion'),
dist = releasesPath + '/' + versionFull + '/owncloud/'
;
@ -489,12 +492,14 @@ module.exports = function (grunt) {
grunt.file.write(dist + 'appinfo/info.xml',
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.releaseSrcPath', dist);
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');
if ('' !== releaseSrcPath)
{
@ -517,9 +522,9 @@ module.exports = function (grunt) {
// ---
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('owncloud', ['rainloop-owncloud', 'compress:own', 'md5:build', 'rainloop-clear']);
grunt.registerTask('owncloud', ['rainloop-owncloud', 'compress:own', 'md5:build', 'rainloop-clean']);
// aliases
grunt.registerTask('u', ['uglify']);

View file

@ -1,5 +0,0 @@
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule /.well-known/carddav /index.php/dav [R,L]
</IfModule>

View file

@ -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>

View file

@ -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>

View file

@ -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;
}
}

View file

@ -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;
}
}

View file

@ -25,5 +25,5 @@ external_sso_key = "super-secret-key"
ownCloud:
1) In the Apps > Enable 'RainLoop' plugin
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

View file

@ -1 +1 @@
1.1
0.0

View file

@ -23,6 +23,7 @@ if (isset($_POST['appname'], $_POST['rainloop-password'], $_POST['rainloop-email
$sPostLogin = isset($_POST['rainloop-login']) ? $_POST['rainloop-login'] : '';
OCP\Config::setUserValue($sUser, 'rainloop', 'rainloop-email', $sPostEmail);
OCP\Config::setUserValue($sUser, 'rainloop', 'rainloop-login', $sPostLogin);
$sPass = $_POST['rainloop-password'];
if ('******' !== $sPass && '' !== $sPass)

View file

@ -8,6 +8,9 @@
<input type="text" id="rainloop-email" name="rainloop-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"
value="<?php echo $_['rainloop-password']; ?>" placeholder="<?php p($l->t('Password')); ?>" />

View file

@ -58,9 +58,9 @@
<param name="plugin-name" value="directadmin-change-password"/>
</antcall>
</target>
<target name="ispmanager-change-password">
<target name="ispconfig-change-password">
<antcall target="_build_plugin_">
<param name="plugin-name" value="ispmanager-change-password"/>
<param name="plugin-name" value="ispconfig-change-password"/>
</antcall>
</target>
<target name="poppassd-change-password">

View file

@ -5,7 +5,6 @@
*/
function AdminSecurity()
{
this.csrfProtection = ko.observable(!!RL.settingsGet('UseTokenProtection'));
this.capaOpenPGP = ko.observable(RL.capa(Enums.Capa.OpenPGP));
this.capaTwoFactorAuth = ko.observable(RL.capa(Enums.Capa.TwoFactor));
@ -78,12 +77,6 @@ AdminSecurity.prototype.onNewAdminPasswordResponse = function (sResult, oData)
AdminSecurity.prototype.onBuild = function ()
{
this.csrfProtection.subscribe(function (bValue) {
RL.remote().saveAdminConfig(Utils.emptyFunction, {
'TokenProtection': bValue ? '1' : '0'
});
});
this.capaOpenPGP.subscribe(function (bValue) {
RL.remote().saveAdminConfig(Utils.emptyFunction, {
'CapaOpenPGP': bValue ? '1' : '0'

View file

@ -1072,6 +1072,11 @@ RainLoopApp.prototype.bootstart = function ()
Utils.removeSettingsViewModel(SettingsThemes);
}
if (!RL.capa(Enums.Capa.Filters))
{
Utils.removeSettingsViewModel(SettingsFilters);
}
if (!bGoogle && !bFacebook && !bTwitter)
{
Utils.removeSettingsViewModel(SettingsSocialScreen);

View file

@ -37,6 +37,7 @@ Enums.Capa = {
'Prefetch': 'PREFETCH',
'Gravatar': 'GRAVATAR',
'Themes': 'THEMES',
'Filters': 'FILTERS',
'AdditionalAccounts': 'ADDITIONAL_ACCOUNTS',
'AdditionalIdentities': 'ADDITIONAL_IDENTITIES'
};
@ -278,6 +279,34 @@ Enums.Layout = {
'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}
*/

View 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
View 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
View 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);
};

View file

@ -37,6 +37,7 @@
right: 0;
overflow: hidden;
overflow-y: auto;
min-width: 100px;
// padding: 5px;
.content {

View file

@ -4,19 +4,19 @@
position: absolute;
left: 0;
width: 100%;
height: 2px;
height: 10px;
z-index: 102;
-webkit-box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.5);
-moz-box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.5);
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 20px rgba(0, 0, 0, 0.3);
box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.3);
}
.nano:before {
top: -2px;
top: -10px;
}
.nano:after {
bottom: -2px;
bottom: -10px;
}
.nano.nano-scrolllimit-top:before, .nano.nano-scrolllimit-bottom:after {

View file

@ -190,6 +190,7 @@ html.cssanimations {
height: 15px;
background-color: #ddd;
margin: 0 5px;
.box-shadow(0px 0px 3px rgba(0, 0, 0, 0.3));
border-radius: 100%;
display: inline-block;

View file

@ -122,6 +122,8 @@ html.rgba.textshadow {
.tooltip {
font-size: 14px;
z-index: 2000 !important;
overflow: hidden;
text-overflow: ellipsis;
&.in {
.opacity(100);
@ -130,17 +132,20 @@ html.rgba.textshadow {
.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 {
font-size: 18px;
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
.btn-group > .btn:first-child {
-webkit-border-top-left-radius: @btnBorderRadius;

View file

@ -2,7 +2,7 @@
"name": "RainLoop",
"title": "RainLoop Webmail",
"version": "1.6.7",
"release": "102",
"release": "106",
"description": "Simple, modern & fast web-based email client",
"homepage": "http://rainloop.net",
"main": "Gruntfile.js",
@ -36,6 +36,7 @@
"plugins"
],
"readmeFilename": "README.md",
"ownCloudPackageVersion": "1.2",
"engines": {
"node": ">= 0.8.0"
},

View file

@ -1,6 +1,6 @@
<?php
class IspManagerChangePasswordDriver implements \RainLoop\Providers\ChangePassword\ChangePasswordInterface
class IspConfigChangePasswordDriver implements \RainLoop\Providers\ChangePassword\ChangePasswordInterface
{
/**
* @var string
@ -32,7 +32,7 @@ class IspManagerChangePasswordDriver implements \RainLoop\Providers\ChangePasswo
* @param string $sUser
* @param string $sPassword
*
* @return \IspManagerChangePasswordDriver
* @return \IspConfigChangePasswordDriver
*/
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)
{
@ -57,7 +57,7 @@ class IspManagerChangePasswordDriver implements \RainLoop\Providers\ChangePasswo
/**
* @param \MailSo\Log\Logger $oLogger
*
* @return \IspManagerChangePasswordDriver
* @return \IspConfigChangePasswordDriver
*/
public function SetLogger($oLogger)
{

View file

@ -1 +1 @@
Plugin that adds functionality to change the email account password (ISPmanager).
Plugin that adds functionality to change the email account password (ISPConfig).

View file

@ -0,0 +1 @@
1.1

View file

@ -1,6 +1,6 @@
<?php
class IspmanagerChangePasswordPlugin extends \RainLoop\Plugins\AbstractPlugin
class IspconfigChangePasswordPlugin extends \RainLoop\Plugins\AbstractPlugin
{
public function Init()
{
@ -42,9 +42,9 @@ class IspmanagerChangePasswordPlugin extends \RainLoop\Plugins\AbstractPlugin
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->SetConfig($sDsn, $sUser, $sPassword);
$oProvider->SetAllowedEmails(\strtolower(\trim($this->Config()->Get('plugin', 'allowed_emails', ''))));
@ -60,7 +60,7 @@ class IspmanagerChangePasswordPlugin extends \RainLoop\Plugins\AbstractPlugin
public function configMapping()
{
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'),
\RainLoop\Plugins\Property::NewInstance('user')->SetLabel('DB User')
->SetDefaultValue('root'),

View file

@ -1 +0,0 @@
1.0

View file

@ -83,8 +83,8 @@ class HtmlUtils
public static function ClearTags($sHtml)
{
$aRemoveTags = array(
'head', 'link', 'base', 'meta', 'title', 'style', 'script', 'bgsound',
'object', 'embed', 'applet', 'mocha', 'iframe', 'frame', 'frameset'
'head', 'link', 'base', 'meta', 'title', 'style', 'script', 'bgsound', 'keygen', 'source',
'object', 'embed', 'applet', 'mocha', 'iframe', 'frame', 'frameset', 'video', 'audio'
);
$aToRemove = array(
@ -116,6 +116,7 @@ class HtmlUtils
'/on(DblClick)/si',
'/on(Error)/si',
'/on(Focus)/si',
'/on(FormChange)/si',
'/on(KeyDown)/si',
'/on(KeyPress)/si',
'/on(KeyUp)/si',
@ -500,12 +501,22 @@ class HtmlUtils
// $oElement->removeAttribute('style');
// }
@$oElement->removeAttribute('id');
@$oElement->removeAttribute('class');
@$oElement->removeAttribute('contenteditable');
@$oElement->removeAttribute('designmode');
@$oElement->removeAttribute('data-bind');
@$oElement->removeAttribute('xmlns');
foreach (array(
'id', 'class', 'contenteditable', 'designmode', 'formaction', 'data-bind', 'xmlns'
) as $sAttr)
{
@$oElement->removeAttribute($sAttr);
}
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'))
{

View file

@ -1295,7 +1295,7 @@ class Actions
$aResult['Language'] = $this->ValidateLanguage($sLanguage);
$aResult['UserLanguage'] = $bUserLanguage;
$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['EditorDefaultType'] = 'Html' === $aResult['EditorDefaultType'] ? 'Html' : 'Plain';
@ -6079,7 +6079,10 @@ class Actions
{
$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))
{

View file

@ -10,6 +10,7 @@ class Capa
const PREFETCH = 'PREFETCH';
const GRAVATAR = 'GRAVATAR';
const THEMES = 'THEMES';
const FILTERS = 'FILTERS';
const ADDITIONAL_ACCOUNTS = 'ADDITIONAL_ACCOUNTS';
const ADDITIONAL_IDENTITIES = 'ADDITIONAL_IDENTITIES';
}

View file

@ -19,6 +19,11 @@ class ServiceActions
*/
protected $aPaths;
/**
* @var string
*/
protected $sQuery;
/**
* @param \MailSo\Base\Http $oHttp
* @param \RainLoop\Actions $oActions
@ -30,6 +35,7 @@ class ServiceActions
$this->oHttp = $oHttp;
$this->oActions = $oActions;
$this->aPaths = array();
$this->sQuery = '';
}
/**
@ -449,16 +455,18 @@ class ServiceActions
$this->oActions->verifyCacheByKey($this->sQuery);
}
$bAdmin = false !== \strpos($this->sQuery, 'Admin');
$sCacheFileName = '';
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);
}
if (0 === \strlen($sResult))
{
$sResult = $this->compileTemplates(false);
$sResult = $this->compileTemplates($bAdmin);
if ($bCacheEnabled && 0 < \strlen($sCacheFileName))
{
$this->Cacher()->Set($sCacheFileName, $sResult);
@ -1021,20 +1029,16 @@ class ServiceActions
/**
* @param bool $bAdmin = false
* @param bool $bWrapByScriptTag = true
*
* @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);
return
($bWrapByScriptTag ? '<script type="text/javascript" data-cfasync="false">' : '').
'window.rainloopTEMPLATES='.\MailSo\Base\Utils::Php2js(array($sHtml)).';'.
($bWrapByScriptTag ? '</script>' : '')
;
return 'window.rainloopTEMPLATES='.\MailSo\Base\Utils::Php2js(array($sHtml)).';';
}
/**

View file

@ -11,7 +11,7 @@
<!--[if lte IE 7]>
<meta http-equiv="refresh" content="0; URL={{BaseAppIndexFile}}?/BadBrowser" />
<![endif]-->
<script type="text/javascript">
<script type="text/javascript" data-cfasync="false">
function __fIncludeScr(sSrc) {
document.write(unescape('%3Csc' + 'ript data-cfasync="false" type="text/jav' + 'ascr' + 'ipt" sr' + 'c="' + sSrc + '"%3E%3C/' + 'scr' + 'ipt%3E'));
}

View file

@ -16,28 +16,41 @@
<h1 style="margin-bottom: 0;">RainLoop</h1>
<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>
<h5 style="color: #aaa; font-weight: normal; margin-top: 40px;">
<h5 style="font-weight: normal; margin-top: 40px;">
<div data-bind="visible: 'error' === statusType()">
<i class="icon-warning" style="color: red"></i>
&nbsp;&nbsp;
<span data-bind="text: errorDesc">Error</span>
<span data-bind="text: errorDesc"></span>
</div>
<div data-bind="visible: 'available' === statusType()">
<i class="icon-warning" style="color: blue"></i>
<i class="icon-bolt" style="color: red"></i>
&nbsp;&nbsp;
New <b data-bind="text: coreRemoteVersion"></b> version is available.
<span data-bind="visible: '' !== coreRemoteRelease()">
(<span data-bind="text: coreRemoteRelease"></span>)
</span>
<br />
<br />
<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>
&nbsp;&nbsp;
Update
</a>
&nbsp;&nbsp;&nbsp;
</span>
<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>
&nbsp;&nbsp;
Download
</a>
&nbsp;&nbsp;&nbsp;
<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>
&nbsp;&nbsp;
Changelog
</a>
</span>
</div>
<div data-bind="visible: 'up-to-date' === statusType()">

View file

@ -36,7 +36,7 @@
<div data-bind="visible: licensingProcess()">
<i class="icon-spinner animated"></i>
&nbsp;&nbsp;
checking...
Checking&hellip;
</div>
<div data-bind="visible: !licensingProcess()">
<div class="alert alert-block span8" style="margin-left: 0" data-bind="visible: !licensing()">

View file

@ -3,15 +3,6 @@
<div class="legend">
Security
</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>
&nbsp;&nbsp;
<abbr title="Cross-site request forgery" class="initialism">CSRF</abbr> protection
</label>
</div>
</div>
<div class="control-group">
<div class="controls">
<label data-bind="click: function () { capaOpenPGP(!capaOpenPGP()); }">
@ -36,6 +27,7 @@
</div>
</div>
</div>
<br />
<div class="form-horizontal">
<div class="legend">
Changer Admin Password

View file

@ -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>
&nbsp;&nbsp;
<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>
&nbsp;&nbsp;
<span class="i18n" data-i18n-text="SETTINGS_FILTERS/BUTTON_ADD_FILTER"></span>
</a>
</div>

View file

@ -1,14 +1,6 @@
<div class="b-system-drop-down g-ui-user-select-none">
<div class="b-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">
&nbsp;&nbsp;&nbsp;
</div>-->
<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"
data-toggle="dropdown" data-tooltip-placement="left"

Some files were not shown because too many files have changed in this diff Show more